[
  {
    "path": ".fvmrc",
    "content": "{\n  \"flutter\": \"3.41.5\"\n}"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug-反馈.yml",
    "content": "name: Bug 反馈\ndescription: 描述你所遇到的bug\nlabels: [ \"bug\" ]\ntitle: \"[Bug] \"\nbody:\n\n  - type: checkboxes\n    id: checklist\n    attributes:\n      label: 检查清单\n      options:\n        - label: 搜索了 [历史 issue](https://github.com/bggRGjQaUbCoE/PiliPlus/issues?q=is%3Aissue) ，并未发现相同问题\n          required: true\n        - label: 正在使用最新版本。\n          required: true\n        - label: 已排除网络问题\n          required: true\n        - label: 已排除账号问题\n          required: true\n        - label: 已排除设置问题\n          required: true\n  \n  - type: checkboxes\n    id: assign\n    attributes:\n      label: Assign\n      options:\n        - label: self-assign\n          required: false\n\n  - type: textarea\n    id: version\n    attributes:\n      label: 版本号\n    validations:\n      required: true\n\n  - type: textarea\n    id: steps\n    attributes:\n      label: 复现步骤\n      description: 请提供复现该问题所需的具体步骤。\n    validations:\n      required: true\n\n  - type: textarea\n    id: expected\n    attributes:\n      label: 预期行为\n      description: 请描述你期望的正确行为或结果。\n    validations:\n      required: true\n\n  - type: textarea\n    id: actual\n    attributes:\n      label: 实际行为\n      description: 请描述实际的行为或结果。\n    validations:\n      required: true\n\n  - type: textarea\n    id: log\n    attributes:\n      label: 错误日志\n      description: 请提供设置->关于->错误日志中的内容，粘贴在下方代码框中。如果没有，请提供您的app版本号、系统版本、设备型号等相关信息。\n\n  - type: textarea\n    id: info\n    attributes:\n      label: 相关信息\n      description: 请补充截图、录屏、BV号等其他有助于解决问题的信息。\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/功能请求.yml",
    "content": "name: 功能请求\ndescription: 对于功能的一些建议\nlabels: [ \"enhancement\" ]\ntitle: \"[FR] \"\nbody:\n\n  - type: checkboxes\n    id: checklist\n    attributes:\n      label: 检查清单\n      options:\n        - label: 搜索了 [历史 issue](https://github.com/bggRGjQaUbCoE/PiliPlus/issues?q=is%3Aissue) ，并未发现相同功能请求\n          required: true\n        - label: 正在使用最新版本。\n          required: true\n        - label: 设置中未搜索到该功能\n          required: true\n\n  - type: checkboxes\n    id: assign\n    attributes:\n      label: Assign\n      options:\n        - label: self-assign\n          required: false\n\n  - type: textarea\n    id: desc\n    attributes:\n      label: 功能描述\n      description: 请提供对所请求功能的清晰描述。\n    validations:\n      required: true\n\n  - type: textarea\n    id: solution\n    attributes:\n      label: 解决方案\n      description: 如果你有任何关于如何实现这个功能的想法或建议，请在这里提供。\n\n  - type: textarea\n    id: addition\n    attributes:\n      label: 其他\n      description: 请提供已实现该功能或类似功能的应用\n"
  },
  {
    "path": ".github/workflows/build.yml",
    "content": "name: Build\n\non:\n    pull_request:\n        types:\n            - opened\n            - synchronize\n            - reopened\n            - ready_for_review\n        paths-ignore:\n            - \"**.md\"\n    workflow_dispatch:\n        inputs:\n            build_android:\n                description: \"Build Android\"\n                required: false\n                default: true\n                type: boolean\n\n            build_ios:\n                description: \"Build iOS\"\n                required: false\n                default: true\n                type: boolean\n\n            build_mac:\n                description: \"Build Mac\"\n                required: false\n                default: true\n                type: boolean\n\n            build_win_x64:\n                description: \"Build Win-x64\"\n                required: false\n                default: true\n                type: boolean\n\n            build_linux_x64:\n                description: \"Build Linux-x64\"\n                required: false\n                default: true\n                type: boolean\n\n            tag:\n                description: \"tag\"\n                required: false\n                default: \"\"\n                type: string\n\njobs:\n    android:\n        if: ${{ (github.event_name == 'pull_request' && github.repository == 'bggRGjQaUbCoE/PiliPlus') || github.event.inputs.build_android == 'true' }}\n        name: Release Android\n        runs-on: ubuntu-latest\n        permissions: write-all\n\n        steps:\n            - name: 代码迁出\n              uses: actions/checkout@v6\n              with:\n                  fetch-depth: 0\n\n            - name: 构建Java环境\n              uses: actions/setup-java@v5\n              with:\n                  distribution: \"zulu\"\n                  java-version: \"17\"\n                  cache: \"gradle\"\n                  cache-dependency-path: |\n                      android/*.gradle*\n                      android/**/gradle-wrapper.properties\n\n            - name: 安装Flutter\n              uses: subosito/flutter-action@v2\n              id: flutter-action\n              with:\n                  channel: stable\n                  flutter-version-file: pubspec.yaml\n                  cache: true\n\n            - name: Apply Patch\n              shell: pwsh\n              run: lib/scripts/patch.ps1 android\n              continue-on-error: true\n\n            - name: Write key\n              if: github.event_name == 'workflow_dispatch'\n              run: |\n                  if [ ! -z \"${{ secrets.SIGN_KEYSTORE_BASE64 }}\" ]; then\n                    echo \"${{ secrets.SIGN_KEYSTORE_BASE64 }}\" | base64 --decode > android/app/key.jks\n                    echo storeFile='key.jks' >> android/key.properties\n                    echo storePassword='${{ secrets.KEYSTORE_PASSWORD }}' >> android/key.properties\n                    echo keyAlias='${{ secrets.KEY_ALIAS }}' >> android/key.properties\n                    echo keyPassword='${{ secrets.KEY_PASSWORD }}' >> android/key.properties\n                  fi\n\n            - name: Set and Extract version\n              if: ${{ github.event_name == 'workflow_dispatch' }}\n              shell: pwsh\n              run: lib/scripts/build.ps1 android\n\n            - name: Flutter Build Release Apk\n              if: ${{ github.event_name == 'workflow_dispatch' }}\n              run: flutter build apk --release --split-per-abi --dart-define-from-file=pili_release.json --pub\n\n            - name: Flutter Build Dev Apk\n              if: ${{ github.event_name == 'pull_request' }}\n              run: |\n                flutter build apk --release --split-per-abi --android-project-arg dev=1 --pub\n\n            - name: Rename\n              run: |\n                  for file in build/app/outputs/flutter-apk/app-*-release.apk; do\n                    abi=$(echo \"$file\" | sed -E 's|.*app-(.*)-release\\.apk|\\1|')\n                    mv \"$file\" \"PiliPlus_android_${{ env.version }}_${abi}.apk\"\n                  done\n              shell: bash\n\n            - name: Release\n              if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.tag != '' }}\n              uses: softprops/action-gh-release@v2\n              with:\n                  tag_name: ${{ github.event.inputs.tag }}\n                  name: ${{ github.event.inputs.tag }}\n                  files: PiliPlus_android_*.apk\n\n            - name: 上传\n              uses: actions/upload-artifact@v7\n              with:\n                  archive: false\n                  name: Android_arm64-v8a\n                  path: PiliPlus_android_*_arm64-v8a.apk\n\n            - name: 上传\n              uses: actions/upload-artifact@v7\n              with:\n                  archive: false\n                  name: Android_armeabi-v7a\n                  path: PiliPlus_android_*_armeabi-v7a.apk\n\n            - name: 上传\n              uses: actions/upload-artifact@v7\n              with:\n                  archive: false\n                  name: Android_x86_64\n                  path: PiliPlus_android_*_x86_64.apk\n\n    ios:\n        if: ${{ (github.event_name == 'pull_request' && github.repository == 'bggRGjQaUbCoE/PiliPlus') || github.event.inputs.build_ios == 'true' }}\n        uses: ./.github/workflows/ios.yml\n        permissions: write-all\n        with:\n            tag: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.tag || '' }}\n\n    mac:\n        if: ${{ github.event.inputs.build_mac == 'true' }}\n        uses: ./.github/workflows/mac.yml\n        permissions: write-all\n        with:\n            tag: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.tag || '' }}\n\n    win_x64:\n        if: ${{ (github.event_name == 'pull_request' && github.repository == 'bggRGjQaUbCoE/PiliPlus') || github.event.inputs.build_win_x64 == 'true' }}\n        uses: ./.github/workflows/win_x64.yml\n        permissions: write-all\n        with:\n            tag: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.tag || '' }}\n\n    linux_x64:\n        if: ${{ github.event.inputs.build_linux_x64 == 'true' }}\n        uses: ./.github/workflows/linux_x64.yml\n        permissions: write-all\n        with:\n            tag: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.tag || '' }}\n"
  },
  {
    "path": ".github/workflows/ios.yml",
    "content": "name: Build for iOS\n\non:\n  workflow_call:\n    inputs:\n      tag:\n        description: \"tag\"\n        required: false\n        default: \"\"\n        type: string\n  workflow_dispatch:\n\njobs:\n  build-macos-app:\n    name: Release IOS\n    runs-on: macos-latest\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v6\n        with:\n          fetch-depth: 0\n\n      - name: Setup flutter\n        uses: subosito/flutter-action@v2\n        with:\n          channel: stable\n          flutter-version-file: pubspec.yaml\n\n      - name: Set and Extract version\n        shell: pwsh\n        run: lib/scripts/build.ps1\n\n      - name: Apply Patch\n        shell: pwsh\n        run: lib/scripts/patch.ps1 iOS\n        continue-on-error: true\n\n      - name: Build iOS\n        run: |\n          flutter build ios --release --no-codesign --dart-define-from-file=pili_release.json\n          ln -sf ./build/ios/iphoneos Payload\n          # make AltSign happy...\n          find Payload/Runner.app/Frameworks -type d -name \"*.framework\" -exec codesign --force --sign - --preserve-metadata=identifier,entitlements {} \\;\n          zip -r9 PiliPlus_ios_${{env.version}}.ipa Payload/Runner.app\n\n      - name: Release\n        if: ${{ github.event.inputs.tag != '' }}\n        uses: softprops/action-gh-release@v2\n        with:\n          tag_name: ${{ github.event.inputs.tag }}\n          name: ${{ github.event.inputs.tag }}\n          files: |\n            PiliPlus_ios_*.ipa\n\n      - name: Upload ios release\n        uses: actions/upload-artifact@v7\n        with:\n          archive: false\n          name: iOS-release\n          path: PiliPlus_ios_*.ipa\n"
  },
  {
    "path": ".github/workflows/linux_x64.yml",
    "content": "name: Build for Linux x64\n\non:\n  workflow_call:\n    inputs:\n      tag:\n        description: \"tag\"\n        required: false\n        default: \"\"\n        type: string\n  workflow_dispatch:\n\njobs:\n  build-linux-app:\n    name: Release Linux x64\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v6\n        with:\n          fetch-depth: 0\n\n      - name: Install dependencies\n        run: |\n          sudo apt-get update\n          sudo apt-get install -y clang cmake libgtk-3-dev ninja-build libayatana-appindicator3-dev unzip webkit2gtk-4.1 libasound2-dev rpm patchelf\n          sudo apt-get install -y gcc g++ autoconf automake debhelper glslang-dev ladspa-sdk xutils-dev libasound2-dev \\\n              libarchive-dev libbluray-dev libbs2b-dev libcaca-dev libcdio-paranoia-dev libdrm-dev \\\n              libdav1d-dev libdvdnav-dev libegl1-mesa-dev libepoxy-dev libfontconfig-dev libfreetype6-dev \\\n              libfribidi-dev libgl1-mesa-dev libgbm-dev libgme-dev libgsm1-dev libharfbuzz-dev libjpeg-dev \\\n              libbrotli-dev liblcms2-dev libmodplug-dev libmp3lame-dev libopenal-dev \\\n              libopus-dev libopencore-amrnb-dev libopencore-amrwb-dev libpulse-dev librtmp-dev \\\n              libsdl2-dev libsixel-dev libssh-dev libsoxr-dev libspeex-dev libtool \\\n              libv4l-dev libva-dev libvdpau-dev libvorbis-dev libvo-amrwbenc-dev \\\n              libunwind-dev libvpx-dev libwayland-dev libx11-dev libxext-dev \\\n              libxkbcommon-dev libxrandr-dev libxss-dev libxv-dev libxvidcore-dev \\\n              linux-libc-dev nasm ninja-build pkg-config python3 python3-docutils wayland-protocols \\\n              x11proto-core-dev zlib1g-dev libfdk-aac-dev libtheora-dev libwebp-dev \\\n              unixodbc-dev libpq-dev libxxhash-dev libaom-dev \\\n              libgtk-3-0 libblkid1 liblzma5 libmpv-dev\n        shell: bash\n\n      - name: Setup flutter\n        uses: subosito/flutter-action@v2\n        with:\n          channel: stable\n          flutter-version-file: pubspec.yaml\n          cache: true\n\n      - name: Set and Extract version\n        shell: pwsh\n        run: lib/scripts/build.ps1\n\n      - name: Apply Patch\n        shell: pwsh\n        run: lib/scripts/patch.ps1 Linux\n        continue-on-error: true\n\n        #TODO: deb and rpm packages need to be build\n      - name: Build Linux\n        run: flutter build linux --release -v --pub --dart-define-from-file=pili_release.json\n\n      - name: Package .tar.gz\n        run: tar -zcvf PiliPlus_linux_${{ env.version }}_amd64.tar.gz -C build/linux/x64/release/bundle .\n\n      - name: Packege deb\n        run: |\n          printf \"建立构建目录...\\n\"\n          mkdir \"PiliPlus_linux_${{ env.version }}_amd64\"\n          pushd \"PiliPlus_linux_${{ env.version }}_amd64\"\n          mkdir -p opt/PiliPlus\n          mkdir -p usr/share/applications\n          mkdir -p usr/share/icons/hicolor/512x512/apps\n\n          printf \"复制文件...\\n\"\n          cp -r ../build/linux/x64/release/bundle/* opt/PiliPlus\n          cp -r ../assets/linux/DEBIAN .\n          cp ../assets/linux/com.example.piliplus.desktop usr/share/applications\n          cp ../assets/images/logo/logo.png usr/share/icons/hicolor/512x512/apps/piliplus.png\n\n          printf \"修改控制文件...\\n\"\n          # 替换版本号\n          sed -i  \"2s/version_need_change/${{ env.version }}/g\" DEBIAN/control\n          # 计算安装大小并替换\n          SIZE_KB=$(du -s -b --apparent-size . | awk '{print int($1)}')\n          SIZE_KB=$(($SIZE_KB - $(du -s -b --apparent-size DEBIAN | awk '{print int($1)}')))\n          SIZE_KB=$(echo $SIZE_KB | awk '{print int($1/1024 + 0.999)}')\n          printf \"\\t安装大小: %s KB\\n\" \"$SIZE_KB\"\n          sed -i \"9s/size_need_change/${SIZE_KB}/g\" DEBIAN/control\n\n          printf \"生成并写入 md5sums ...\\n\"\n          md5sum opt/PiliPlus/piliplus >> DEBIAN/md5sums\n          md5sum opt/PiliPlus/lib/* >> DEBIAN/md5sums\n          md5sum opt/PiliPlus/data/icudtl.dat >> DEBIAN/md5sums\n\n          printf \"设置权限...\\n\"\n          chmod 0644 DEBIAN/control\n          chmod 0644 DEBIAN/md5sums\n          chmod 0755 DEBIAN/postinst\n          chmod 0755 DEBIAN/postrm\n          chmod 0755 DEBIAN/prerm\n\n          printf \"打包 deb 文件...\\n\"\n          popd\n          dpkg-deb --build --verbose --root-owner-group \"PiliPlus_linux_${{ env.version }}_amd64\"\n          printf \"完成: PiliPlus_linux_%s_amd64.deb\\n\" \"${{ env.version }}\"\n        shell: bash\n\n      - name: Packege rpm\n        run: |\n          printf \"建立 RPM 构建目录...\\n\"\n          RPM_BUILD_ROOT=\"$PWD/rpm_build\"\n          mkdir -p \"$RPM_BUILD_ROOT/BUILD\" \"$RPM_BUILD_ROOT/RPMS\" \"$RPM_BUILD_ROOT/SOURCES\" \"$RPM_BUILD_ROOT/SPECS\" \"$RPM_BUILD_ROOT/SRPMS\"\n\n          printf \"准备源码归档（仅包含运行时与元数据）...\\n\"\n          DATE=\"$(date '+%a %b %d %Y')\"\n          SRC_DIR=\"$PWD/piliplus-${{ env.version }}\"\n          mkdir -p \"$SRC_DIR/bundle\" \"$SRC_DIR/assets\"\n          cp -r build/linux/x64/release/bundle/* \"$SRC_DIR/bundle/\"\n          cp assets/linux/com.example.piliplus.desktop \"$SRC_DIR/assets/com.example.piliplus.desktop\"\n          cp assets/images/logo/logo.png \"$SRC_DIR/assets/piliplus.png\"\n          tar -zcvf \"$RPM_BUILD_ROOT/SOURCES/piliplus-${{ env.version }}.tar.gz\" -C \"$PWD\" \"piliplus-${{ env.version }}\"\n\n          printf \"生成 spec 文件...\\n\"\n          cat > \"$RPM_BUILD_ROOT/SPECS/piliplus.spec\" <<EOF\n          Name:           piliplus\n          Version:        ${{ env.version }}\n          Release:        1%{?dist}\n          Summary:        PiliPlus Linux Version\n          License:        GPL-3.0\n          Source0:        piliplus-${{ env.version }}.tar.gz\n          Requires:       desktop-file-utils, hicolor-icon-theme\n\n          %description\n          使用 Flutter 开发的 BiliBili 第三方客户端\n\n          %prep\n          %setup -q -n piliplus-${{ env.version }}\n\n          %build\n\n          %install\n          mkdir -p %{buildroot}/opt/PiliPlus\n          cp -r bundle/* %{buildroot}/opt/PiliPlus/\n\n          # 二进制权限与命令行入口\n          chmod 755 %{buildroot}/opt/PiliPlus/piliplus\n          mkdir -p %{buildroot}/usr/bin\n          ln -sf /opt/PiliPlus/piliplus %{buildroot}/usr/bin/piliplus\n\n          # 桌面集成\n          mkdir -p %{buildroot}/usr/share/applications\n          install -m 644 assets/com.example.piliplus.desktop %{buildroot}/usr/share/applications/com.example.piliplus.desktop\n\n          mkdir -p %{buildroot}/usr/share/icons/hicolor/512x512/apps\n          install -m 644 assets/piliplus.png %{buildroot}/usr/share/icons/hicolor/512x512/apps/piliplus.png\n\n          %post\n          update-desktop-database -q || true\n          gtk-update-icon-cache -q -t -f %{_datadir}/icons/hicolor || true\n\n          %postun\n          update-desktop-database -q || true\n          gtk-update-icon-cache -q -t -f %{_datadir}/icons/hicolor || true\n\n          %files\n          /opt/PiliPlus\n          /usr/bin/piliplus\n          /usr/share/applications/com.example.piliplus.desktop\n          /usr/share/icons/hicolor/512x512/apps/piliplus.png\n\n          %changelog\n          * DATE - ${{ env.version }}-1\n          - Initial RPM release\n          EOF\n\n          sed -i \"s/DATE/${DATE}/g\" \"$RPM_BUILD_ROOT/SPECS/piliplus.spec\"\n\n          printf \"构建 RPM 包...\\n\"\n          rpmbuild --define \"_topdir $RPM_BUILD_ROOT\" -bb \"$RPM_BUILD_ROOT/SPECS/piliplus.spec\"\n\n          printf \"移动生成的 RPM...\\n\"\n          find \"$RPM_BUILD_ROOT/RPMS\" -name \"*.rpm\" -exec mv {} \"PiliPlus_linux_${{ env.version }}_amd64.rpm\" \\;\n\n          printf \"完成: PiliPlus_linux_%s_amd64.rpm\\n\" \"${{ env.version }}\"\n        shell: bash\n\n      - name: Package AppImage\n        run: |\n          printf \"下载 appimagetool...\\n\"\n          wget -q https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage\n          chmod +x appimagetool-x86_64.AppImage\n\n          printf \"建立 AppDir 目录结构...\\n\"\n          APPDIR=\"PiliPlus.AppDir\"\n          mkdir -p \"$APPDIR/usr/bin\"\n          mkdir -p \"$APPDIR/usr/lib\"\n          mkdir -p \"$APPDIR/usr/share/applications\"\n          mkdir -p \"$APPDIR/usr/share/icons/hicolor/512x512/apps\"\n\n          printf \"复制应用文件...\\n\"\n          cp -r build/linux/x64/release/bundle/* \"$APPDIR/usr/bin/\"\n\n          printf \"复制桌面文件和图标...\\n\"\n          cp assets/linux/com.example.piliplus.desktop \"$APPDIR/com.example.piliplus.desktop\"\n          cp assets/linux/com.example.piliplus.desktop \"$APPDIR/usr/share/applications/com.example.piliplus.desktop\"\n          cp assets/images/logo/logo.png \"$APPDIR/piliplus.png\"\n          cp assets/images/logo/logo.png \"$APPDIR/usr/share/icons/hicolor/512x512/apps/piliplus.png\"\n\n          printf \"创建 AppRun 启动脚本...\\n\"\n          cat > \"$APPDIR/AppRun\" <<'APPRUN_EOF'\n          #!/bin/bash\n          SELF=$(readlink -f \"$0\")\n          HERE=${SELF%/*}\n          export PATH=\"${HERE}/usr/bin:${PATH}\"\n          export LD_LIBRARY_PATH=\"${HERE}/usr/lib:${LD_LIBRARY_PATH}\"\n          exec \"${HERE}/usr/bin/piliplus\" \"$@\"\n          APPRUN_EOF\n          chmod +x \"$APPDIR/AppRun\"\n\n          printf \"修改桌面文件中的 Exec 路径...\\n\"\n          sed -i 's|Exec=piliplus|Exec=piliplus|g' \"$APPDIR/com.example.piliplus.desktop\"\n          sed -i 's|Icon=piliplus|Icon=piliplus|g' \"$APPDIR/com.example.piliplus.desktop\"\n\n          printf \"打包 AppImage...\\n\"\n          ARCH=x86_64 ./appimagetool-x86_64.AppImage \"$APPDIR\" \"PiliPlus_linux_${{ env.version }}_amd64.AppImage\"\n\n          printf \"完成: PiliPlus_linux_%s_amd64.AppImage\\n\" \"${{ env.version }}\"\n        shell: bash\n\n      - name: Release\n        if: ${{ github.event.inputs.tag != '' }}\n        uses: softprops/action-gh-release@v2\n        with:\n          tag_name: ${{ github.event.inputs.tag }}\n          name: ${{ github.event.inputs.tag }}\n          files: |\n            PiliPlus_linux_*.tar.gz\n            PiliPlus_linux_*.deb\n            PiliPlus_linux_*.rpm\n            PiliPlus_linux_*.AppImage\n\n      - name: Upload linux targz package\n        uses: actions/upload-artifact@v7\n        with:\n          archive: false\n          name: Linux_targz_amd64_packege\n          path: PiliPlus_linux_*.tar.gz\n\n      - name: Upload linux deb package\n        uses: actions/upload-artifact@v7\n        with:\n          archive: false\n          name: Linux_deb_amd64_package\n          path: PiliPlus_linux_*.deb\n\n      - name: Upload linux rpm package\n        uses: actions/upload-artifact@v7\n        with:\n          archive: false\n          name: Linux_rpm_amd64_package\n          path: PiliPlus_linux_*.rpm\n\n      - name: Upload linux AppImage package\n        uses: actions/upload-artifact@v7\n        with:\n          archive: false\n          name: Linux_AppImage_amd64_package\n          path: PiliPlus_linux_*.AppImage\n"
  },
  {
    "path": ".github/workflows/mac.yml",
    "content": "name: Build for Mac\n\non:\n  workflow_call:\n    inputs:\n      tag:\n        description: \"tag\"\n        required: false\n        default: \"\"\n        type: string\n  workflow_dispatch:\n\njobs:\n  build-mac-app:\n    name: Release Mac\n    runs-on: macos-latest\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v6\n        with:\n          fetch-depth: 0\n\n      - name: Setup flutter\n        uses: subosito/flutter-action@v2\n        with:\n          channel: stable\n          flutter-version-file: pubspec.yaml\n\n      - name: Set and Extract version\n        shell: pwsh\n        run: lib/scripts/build.ps1\n\n      - name: Apply Patch\n        shell: pwsh\n        run: lib/scripts/patch.ps1 macOS\n        continue-on-error: true\n\n      - name: Build Mac\n        run: flutter build macos --release --dart-define-from-file=pili_release.json\n\n      - name: Prepare Upload\n        run: |\n          npm install --global create-dmg\n          create-dmg build/macos/Build/Products/Release/PiliPlus.app || true\n        continue-on-error: true\n\n      - name: Rename DMG\n        run: mv PiliPlus*.dmg PiliPlus_macos_${{ env.version }}.dmg\n\n      - name: Release\n        if: ${{ github.event.inputs.tag != '' }}\n        uses: softprops/action-gh-release@v2\n        with:\n          tag_name: ${{ github.event.inputs.tag }}\n          name: ${{ github.event.inputs.tag }}\n          files: |\n            PiliPlus_macos_*.dmg\n\n      - name: Upload macos release\n        uses: actions/upload-artifact@v7\n        with:\n          archive: false\n          name: macOS-release\n          path: PiliPlus_macos_*.dmg\n"
  },
  {
    "path": ".github/workflows/win_x64.yml",
    "content": "name: Build for Windows x64\n\non:\n  workflow_call:\n    inputs:\n      tag:\n        description: \"tag\"\n        required: false\n        default: \"\"\n        type: string\n  workflow_dispatch:\n\njobs:\n  build-windows-app:\n    name: Release Windows x64\n    runs-on: windows-latest\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v6\n        with:\n          fetch-depth: 0\n\n      - name: Setup flutter\n        uses: subosito/flutter-action@v2\n        with:\n          channel: stable\n          flutter-version-file: pubspec.yaml\n\n      - name: Apply Patch\n        shell: pwsh\n        run: lib/scripts/patch.ps1 windows\n        continue-on-error: true\n\n      - name: Add fastforge and Inno Setup\n        run: |\n          dart pub global activate fastforge\n          choco install innosetup\n\n      - name: Add Chinese language file for Inno Setup\n        run: |\n          Copy-Item \"windows/packaging/exe/ChineseSimplified.isl\" \"C:\\Program Files (x86)\\Inno Setup 6\\Languages\\ChineseSimplified.isl\"\n        shell: pwsh\n\n      - name: Set and Extract version\n        shell: pwsh\n        run: lib/scripts/build.ps1\n\n      - name: Build Windows\n        run: |\n          fastforge package --platform windows --targets exe --flutter-build-args=\"dart-define-from-file=pili_release.json\"\n\n      - name: Prepare Upload\n        run: |\n          mkdir -p Release/PiliPlus-Win\n          mkdir -p PiliPlus-Win-Setup\n          mv build/windows/x64/runner/Release/* Release/PiliPlus-Win/\n          mv dist/**/*.exe PiliPlus-Win-Setup/PiliPlus_windows_${{env.version}}_x64_setup.exe\n\n      - name: Compress\n        if: ${{ github.event.inputs.tag != '' }}\n        run: |\n          Compress-Archive -Path \"Release/PiliPlus-Win\" -DestinationPath \"PiliPlus_windows_${{env.version}}_x64_portable.zip\"\n        shell: pwsh\n\n      - name: Release\n        if: ${{ github.event.inputs.tag != '' }}\n        uses: softprops/action-gh-release@v2\n        with:\n          tag_name: ${{ github.event.inputs.tag }}\n          name: ${{ github.event.inputs.tag }}\n          files: |\n            PiliPlus_windows_*.zip\n            PiliPlus-Win-Setup/PiliPlus_windows_*.exe\n\n      - name: Upload windows file release\n        uses: actions/upload-artifact@v7\n        with:\n          archive: true\n          name: PiliPlus_windows_${{env.version}}_x64_portable\n          path: Release\n\n      - name: Upload windows setup release\n        uses: actions/upload-artifact@v7\n        with:\n          archive: false\n          name: Windows-setup-x64-release\n          path: PiliPlus-Win-Setup/PiliPlus_windows_*.exe\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\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 repo-specific\n/bin/cache/\n/bin/internal/bootstrap.bat\n/bin/internal/bootstrap.sh\n/bin/mingit/\n/dev/benchmarks/mega_gallery/\n/dev/bots/.recipe_deps\n/dev/bots/android_tools/\n/dev/devicelab/ABresults*.json\n/dev/docs/doc/\n/dev/docs/api_docs.zip\n/dev/docs/flutter.docs.zip\n/dev/docs/lib/\n/dev/docs/pubspec.yaml\n/dev/integration_tests/**/xcuserdata\n/dev/integration_tests/**/Pods\n/packages/flutter/coverage/\nversion\nanalysis_benchmark.json\n\n# packages file containing multi-root paths\n.packages.generated\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.packages\n.pub-cache/\n.pub/\n/build/\nflutter_*.png\nlinked_*.ds\nunlinked.ds\nunlinked_spec.ds\n\n# Obfuscation related\napp.*.map.json\n\n# Android related\n**/android/**/gradle-wrapper.jar\n.gradle/\n**/android/captures/\n**/android/gradlew\n**/android/gradlew.bat\n**/android/local.properties\n**/android/**/GeneratedPluginRegistrant.java\n**/android/key.properties\n*.jks\n\n# iOS/XCode related\n**/ios/**/*.mode1v3\n**/ios/**/*.mode2v3\n**/ios/**/*.moved-aside\n**/ios/**/*.pbxuser\n**/ios/**/*.perspectivev3\n**/ios/**/*sync/\n**/ios/**/.sconsign.dblite\n**/ios/**/.tags*\n**/ios/**/.vagrant/\n**/ios/**/DerivedData/\n**/ios/**/Icon?\n**/ios/**/Pods/\n**/ios/**/.symlinks/\n**/ios/**/profile\n**/ios/**/xcuserdata\n**/ios/.generated/\n**/ios/Flutter/.last_build_id\n**/ios/Flutter/App.framework\n**/ios/Flutter/Flutter.framework\n**/ios/Flutter/Flutter.podspec\n**/ios/Flutter/Generated.xcconfig\n**/ios/Flutter/ephemeral\n**/ios/Flutter/app.flx\n**/ios/Flutter/app.zip\n**/ios/Flutter/flutter_assets/\n**/ios/Flutter/flutter_export_environment.sh\n**/ios/ServiceDefinitions.json\n**/ios/Runner/GeneratedPluginRegistrant.*\n\n# macOS\n**/Flutter/ephemeral/\n**/Pods/\n**/macos/Flutter/GeneratedPluginRegistrant.swift\n**/macos/Flutter/ephemeral\n**/xcuserdata/\n\n# Windows\n**/windows/flutter/generated_plugin_registrant.cc\n**/windows/flutter/generated_plugin_registrant.h\n**/windows/flutter/generated_plugins.cmake\n\n# Linux\n**/linux/flutter/generated_plugin_registrant.cc\n**/linux/flutter/generated_plugin_registrant.h\n**/linux/flutter/generated_plugins.cmake\n\n# Coverage\ncoverage/\n\n# Symbols\napp.*.symbols\n\n# Exceptions to above rules.\n!**/ios/**/default.mode1v3\n!**/ios/**/default.mode2v3\n!**/ios/**/default.pbxuser\n!**/ios/**/default.perspectivev3\n!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages\n!/dev/ci/**/Gemfile.lock\n!.vscode/settings.json\n!.vscode/launch.json\n!.vscode/tasks.json\n\ndevtools_options.yaml\n\n# FVM Version Cache\n.fvm/\n\npili_release.json\n\ndist\n\ntest*.dart"
  },
  {
    "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.\n\nversion:\n  revision: 4b12645012342076800eb701bcdfe18f87da21cf\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: 4b12645012342076800eb701bcdfe18f87da21cf\n      base_revision: 4b12645012342076800eb701bcdfe18f87da21cf\n    - platform: android\n      create_revision: 4b12645012342076800eb701bcdfe18f87da21cf\n      base_revision: 4b12645012342076800eb701bcdfe18f87da21cf\n    - platform: ios\n      create_revision: 4b12645012342076800eb701bcdfe18f87da21cf\n      base_revision: 4b12645012342076800eb701bcdfe18f87da21cf\n    - platform: linux\n      create_revision: 4b12645012342076800eb701bcdfe18f87da21cf\n      base_revision: 4b12645012342076800eb701bcdfe18f87da21cf\n    - platform: macos\n      create_revision: 4b12645012342076800eb701bcdfe18f87da21cf\n      base_revision: 4b12645012342076800eb701bcdfe18f87da21cf\n    - platform: web\n      create_revision: 4b12645012342076800eb701bcdfe18f87da21cf\n      base_revision: 4b12645012342076800eb701bcdfe18f87da21cf\n    - platform: windows\n      create_revision: 4b12645012342076800eb701bcdfe18f87da21cf\n      base_revision: 4b12645012342076800eb701bcdfe18f87da21cf\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": ".vscode/launch.json",
    "content": "{\n    // 使用 IntelliSense 了解相关属性。\n    // 悬停以查看现有属性的描述。\n    // 欲了解更多信息，请访问: https://go.microsoft.com/fwlink/?linkid=830387\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            \"name\": \"PiliPlus\",\n            \"request\": \"launch\",\n            \"type\": \"dart\"\n        },\n        {\n            \"name\": \"PiliPlus (profile mode)\",\n            \"request\": \"launch\",\n            \"type\": \"dart\",\n            \"flutterMode\": \"profile\"\n        },\n        {\n            \"name\": \"PiliPlus (release mode)\",\n            \"request\": \"launch\",\n            \"type\": \"dart\",\n            \"flutterMode\": \"release\"\n        }\n    ]\n}"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n    \"editor.formatOnSave\": true,\n    \"[dart]\": {\n        \"editor.formatOnType\": true\n    },\n    \"editor.codeActionsOnSave\": {\n        \"source.organizeImports\": \"explicit\",\n        // \"source.fixAll\": \"explicit\",\n    }\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": "<div align=\"center\">\n    <img width=\"200\" height=\"200\" src=\"assets/images/logo/logo.png\">\n</div>\n\n\n\n<div align=\"center\">\n    <h1>PiliPlus</h1>\n<div align=\"center\">\n    \n![GitHub repo size](https://img.shields.io/github/repo-size/bggRGjQaUbCoE/PiliPlus) \n![GitHub Repo stars](https://img.shields.io/github/stars/bggRGjQaUbCoE/PiliPlus) \n![GitHub all releases](https://img.shields.io/github/downloads/bggRGjQaUbCoE/PiliPlus/total) \n</div>\n    <p>使用Flutter开发的BiliBili第三方客户端</p>\n    \n<img src=\"assets/screenshots/510shots_so.png\" width=\"32%\" alt=\"home\" />\n<img src=\"assets/screenshots/174shots_so.png\" width=\"32%\" alt=\"home\" />\n<img src=\"assets/screenshots/850shots_so.png\" width=\"32%\" alt=\"home\" />\n<br/>\n<img src=\"assets/screenshots/main_screen.png\" width=\"96%\" alt=\"home\" />\n<br/>\n</div>\n\n\n<br/>\n\n## 适配平台\n\n- [x] Android\n- [x] iOS\n- [x] Pad\n- [x] Windows\n- [x] Linux\n\n[![Packaging status](https://repology.org/badge/vertical-allrepos/piliplus.svg)](https://repology.org/project/piliplus/versions)\n\n## refactor\n\n- [ ] gRPC [wip]\n- [x] 用户界面\n- [x] 其他\n\n## feat\n\n- [x] 编辑动态\n- [x] DLNA 投屏\n- [x] 离线缓存/播放\n- [x] 移动端支持点击弹幕悬停，点赞、复制、举报 by [@My-Responsitories](https://github.com/My-Responsitories)\n- [x] 播放音频\n- [x] 跳过番剧片头/片尾\n- [x] 安卓端 `loudnorm` 适配 by [@My-Responsitories](https://github.com/My-Responsitories)\n- [x] Win/Mac 支持极验、短信登录 by [@My-Responsitories](https://github.com/My-Responsitories)\n- [x] 视频截取动图 by [@My-Responsitories](https://github.com/My-Responsitories)\n- [x] AI 原声翻译\n- [x] SuperChat\n- [x] 播放课堂视频\n- [x] 发起投票\n- [x] 发布动态/评论支持`富文本编辑`/`表情显示`/`@用户`\n- [x] 修改消息设置\n- [x] 修改聊天设置\n- [x] 展示折叠消息\n- [x] 查看用户图文\n- [x] 动态话题\n- [x] 直播分区\n- [x] 分享`视频`/`番剧`/`动态`/`专栏`/`直播`至消息\n- [x] 创建/修改/删除关注分组\n- [x] 移除粉丝\n- [x] 直播弹幕发送表情\n- [x] 收藏夹排序\n- [x] 稍后再看 ~~`未看`~~ / `未看完` / ~~`已看完`~~ 分类\n- [x] WebDAV 备份/恢复设置\n- [x] 保存评论/动态\n- [x] 高级弹幕 by [@My-Responsitories](https://github.com/My-Responsitories)\n- [x] 取消/置顶评论\n- [x] 记笔记\n- [x] 多账号支持 by [@My-Responsitories](https://github.com/My-Responsitories)\n- [x] 屏蔽带货动态/评论\n- [x] 互动视频\n- [x] 发评/动态反诈\n- [x] 高能进度条\n- [x] 滑动跳转预览视频缩略图\n- [x] Live Photo\n- [x] 复制/移动/排序收藏夹/稍后再看视频\n- [x] 超分辨率\n- [x] 合并弹幕\n- [x] 会员彩色弹幕\n- [x] 播放全部/继续播放/倒序播放\n- [x] Cookie登录\n- [x] 显示视频分段信息\n- [x] 调节字幕大小\n- [x] 调节全屏弹幕大小\n- [x] 收藏夹/稍后再看多选删除\n- [x] 搜索用户动态\n- [x] 直播弹幕\n- [x] 修改头像/用户名/签名/性别/生日\n- [x] 创建/编辑/删除收藏夹\n- [x] 评论楼中楼查看对话\n- [x] 评论楼中楼定位点击查看的评论\n- [x] 评论楼中楼按热度/时间排序\n- [x] 评论点踩\n- [x] 私信发图\n- [x] 投币动画\n- [x] 取消/追番，更新追番状态\n- [x] 取消/订阅合集\n- [x] SponsorBlock\n- [x] 显示视频完整合集\n- [x] 三连动画\n- [x] 番剧三连\n- [x] 带图评论\n- [x] 视频TAG\n- [x] 筛选搜索\n- [x] 转发动态\n- [x] 合集图片\n- [x] 删除/置顶/撤回私信\n- [x] 举报用户/评论/视频/动态\n- [x] 删除/发布/置顶文本/图片动态\n- [x] 其他\n\n## opt\n\n- [x] 专栏界面\n- [x] 私信界面\n- [x] 收藏面板\n- [x] PIP\n- [x] 视频封面\n- [x] 回复界面\n- [x] 系统通知\n- [x] 评论显示\n- [x] 亮度调节\n- [x] 视频播放\n- [x] 视频staff\n- [x] 防止bottomsheet遮挡全屏视频\n- [x] 其他\n\n## fix\n\n- [x] 番剧分集点赞/投币/收藏\n- [x] bugs\n\n<br/>\n\n## 功能\n\n- [x] 推荐视频列表(app端)\n- [x] 最热视频列表\n- [x] 热门直播\n- [x] 番剧列表\n- [x] 屏蔽黑名单内用户视频\n- [x] 无痕模式（播放视为未登录）\n- [x] 游客模式（推荐视为未登录）\n\n- [x] 用户相关\n  - [x] 粉丝、关注用户、拉黑用户查看\n  - [x] 用户主页查看\n  - [x] 关注/取关用户\n  - [x] 离线缓存\n  - [x] 稍后再看\n  - [x] 观看记录\n  - [x] 我的收藏\n  - [x] 站内私信\n  \n- [x] 动态相关\n  - [x] 全部、投稿、番剧分类查看\n  - [x] 动态评论查看\n  - [x] 动态评论回复功能\n\n- [x] 视频播放相关\n  - [x] 双击快进/快退\n  - [x] 双击播放/暂停\n  - [x] 垂直方向调节亮度/音量\n  - [x] 垂直方向上滑全屏、下滑退出全屏\n  - [x] 水平方向手势快进/快退\n  - [x] 全屏方向设置\n  - [x] 倍速选择/长按2倍速\n  - [x] 硬件加速（视机型而定）\n  - [x] 画质选择（高清画质未解锁）\n  - [x] 音质选择（视视频而定）\n  - [x] 解码格式选择（视视频而定）\n  - [x] 弹幕\n  - [x] 字幕\n  - [x] 记忆播放\n  - [x] 视频比例：高度/宽度适应、填充、包含等\n     \n- [x] 搜索相关\n  - [x] 热搜\n  - [x] 搜索历史\n  - [x] 默认搜索词\n  - [x] 投稿、番剧、直播间、用户搜索\n  - [x] 视频搜索排序、按时长筛选\n    \n- [x] 视频详情页相关\n  - [x] 视频选集(分p)切换\n  - [x] 点赞、投币、收藏/取消收藏\n  - [x] 相关视频查看\n  - [x] 评论用户身份标识\n  - [x] 评论(排序)查看、二楼评论查看\n  - [x] 主楼、二楼评论回复功能\n  - [x] 评论点赞\n  - [x] 评论笔记图片查看、保存\n\n- [x] 设置相关\n  - [x] 画质、音质、解码方式预设      \n  - [x] 图片质量设定\n  - [x] 主题模式：亮色/暗色/跟随系统\n  - [x] 震动反馈(可选)\n  - [x] 高帧率\n  - [x] 自动全屏\n  - [x] 横屏适配\n- [ ] 等等\n\n<br/>\n\n## 下载\n\n可以通过右侧release进行下载或拉取代码到本地进行编译\n\n<br/>\n\n## 声明\n\n此项目（PiliPlus）是个人为了兴趣而开发，仅用于学习和测试，请于下载后24小时内删除。\n所用API皆从官方网站收集，不提供任何破解内容。\n在此致敬原作者：[guozhigq/pilipala](https://github.com/guozhigq/pilipala)\n在此致敬上游作者：[orz12/PiliPalaX](https://github.com/orz12/PiliPalaX)\n本仓库做了更激进的修改，感谢原作者的开源精神。\n\n感谢使用\n\n\n<br/>\n\n## 致谢\n\n- [bilibili-API-collect](https://github.com/SocialSisterYi/bilibili-API-collect)\n- [flutter_meedu_videoplayer](https://github.com/zezo357/flutter_meedu_videoplayer)\n- [media-kit](https://github.com/media-kit/media-kit)\n- [dio](https://pub.dev/packages/dio)\n- 等等\n\n<br/>\n<br/>\n<br/>\n\n## Star History\n\n<a href=\"https://www.star-history.com/#bggRGjQaUbCoE/PiliPlus&Date\">\n <picture>\n   <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/svg?repos=bggRGjQaUbCoE/PiliPlus&type=Date&theme=dark\" />\n   <source media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/svg?repos=bggRGjQaUbCoE/PiliPlus&type=Date\" />\n   <img alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=bggRGjQaUbCoE/PiliPlus&type=Date\" />\n </picture>\n</a>\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\nanalyzer:\n  exclude:\n    - lib/grpc/bilibili/**\n    # - lib/grpc/google/**\n    # - lib/common/widgets/flutter/**\n\nformatter:\n  trailing_commas: preserve\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\n  # https://dart-lang.github.io/linter/lints/index.html.\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  # https://dart.dev/tools/linter-rules\n  rules:\n    # avoid_print: false  # Uncomment to disable the `avoid_print` rule\n    # prefer_single_quotes: true  # Uncomment to enable the `prefer_single_quotes` rule\n    # - always_specify_types\n    # - avoid_positional_boolean_parameters\n    - always_declare_return_types\n    - always_use_package_imports\n    - avoid_empty_else\n    - avoid_field_initializers_in_const_classes\n    - avoid_print\n    - avoid_relative_lib_imports\n    - avoid_shadowing_type_parameters\n    - avoid_single_cascade_in_expression_statements\n    - avoid_slow_async_io\n    - avoid_type_to_string\n    - avoid_types_as_parameter_names\n    - avoid_unnecessary_containers\n    - avoid_void_async\n    - await_only_futures\n    - camel_case_extensions\n    - camel_case_types\n    - cancel_subscriptions\n    - cascade_invocations\n    - prefer_const_constructors\n    - prefer_const_declarations\n    - sized_box_for_whitespace\n    - unnecessary_late\n    - use_colored_box\n    - use_decorated_box\n    - use_named_constants\n    - use_null_aware_elements\n    - unnecessary_lambdas\n    - use_is_even_rather_than_modulo\n    - unnecessary_async\n    - unnecessary_await_in_return\n    - unnecessary_getters_setters\n    - prefer_const_literals_to_create_immutables\n    - no_literal_bool_comparisons\n    - use_truncating_division\n    - use_string_buffers\n    - unnecessary_statements\n    - unnecessary_nullable_for_final_variable_declarations\n    - tighten_type_of_initializing_formals\n    - prefer_void_to_null\n    - prefer_spread_collections\n    - unnecessary_to_list_in_spreads\n    - prefer_for_elements_to_map_fromIterable\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\n/build\n/.kotlin\n"
  },
  {
    "path": "android/app/.gitignore",
    "content": "/.cxx\n/build\n"
  },
  {
    "path": "android/app/build.gradle.kts",
    "content": "import com.android.build.gradle.internal.api.ApkVariantOutputImpl\nimport org.jetbrains.kotlin.konan.properties.Properties\n\nplugins {\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\nandroid {\n    namespace = \"com.example.piliplus\"\n    compileSdk = flutter.compileSdkVersion\n    ndkVersion = flutter.ndkVersion\n\n    compileOptions {\n        sourceCompatibility = JavaVersion.VERSION_17\n        targetCompatibility = JavaVersion.VERSION_17\n    }\n\n    kotlinOptions {\n        jvmTarget = JavaVersion.VERSION_17.toString()\n    }\n\n    defaultConfig {\n        applicationId = \"com.example.piliplus\"\n        minSdk = flutter.minSdkVersion\n        targetSdk = flutter.targetSdkVersion\n        versionCode = flutter.versionCode\n        versionName = flutter.versionName\n    }\n\n    packagingOptions.jniLibs.useLegacyPackaging = true\n\n    val keyProperties = Properties().also {\n        val properties = rootProject.file(\"key.properties\")\n        if (properties.exists())\n            it.load(properties.inputStream())\n    }\n\n    val config = keyProperties.getProperty(\"storeFile\")?.let {\n        signingConfigs.create(\"release\") {\n            storeFile = file(it)\n            storePassword = keyProperties.getProperty(\"storePassword\")\n            keyAlias = keyProperties.getProperty(\"keyAlias\")\n            keyPassword = keyProperties.getProperty(\"keyPassword\")\n            enableV1Signing = true\n            enableV2Signing = true\n        }\n    }\n\n    buildTypes {\n        all {\n            signingConfig = config ?: signingConfigs[\"debug\"]\n        }\n        release {\n            if (project.hasProperty(\"dev\")) {\n                applicationIdSuffix = \".dev\"\n                resValue(\n                    type = \"string\",\n                    name = \"app_name\",\n                    value = \"PiliPlus dev\",\n                )\n            }\n            proguardFiles(\n                getDefaultProguardFile(\"proguard-android-optimize.txt\"),\n                \"proguard-rules.pro\"\n            )\n        }\n        debug {\n            applicationIdSuffix = \".debug\"\n        }\n    }\n\n    applicationVariants.all {\n        val variant = this\n        variant.outputs.forEach { output ->\n            (output as ApkVariantOutputImpl).versionCodeOverride = flutter.versionCode\n        }\n    }\n}\n\nflutter {\n    source = \"../..\"\n}\n"
  },
  {
    "path": "android/app/proguard-rules.pro",
    "content": "-dontwarn javax.annotation.Nullable\n-dontwarn org.conscrypt.Conscrypt\n-dontwarn org.conscrypt.OpenSSLProvider"
  },
  {
    "path": "android/app/src/debug/res/values/string.xml",
    "content": "<resources>\n    <string name=\"app_name\">PiliPlus debug</string>\n</resources>"
  },
  {
    "path": "android/app/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.example.piliplus\">\n    <queries>\n        <intent>\n            <action android:name=\"android.intent.action.VIEW\" />\n            <category android:name=\"android.intent.category.BROWSABLE\" />\n            <data android:scheme=\"http\" />\n        </intent>\n        <!-- If your app opens https URLs -->\n        <intent>\n            <action android:name=\"android.intent.action.VIEW\" />\n            <category android:name=\"android.intent.category.BROWSABLE\" />\n            <data android:scheme=\"https\" />\n        </intent>\n\n    </queries>\n    <queries>\n        <intent>\n            <action android:name=\n                \"android.support.customtabs.action.CustomTabsService\" />\n        </intent>\n    </queries>\n\n    <queries>\n        <!-- If your app checks for http support -->\n        <intent>\n            <action android:name=\"android.intent.action.VIEW\" />\n            <category android:name=\"android.intent.category.BROWSABLE\" />\n            <data android:scheme=\"http\" />\n        </intent>\n        <intent>\n            <action android:name=\"android.intent.action.VIEW\" />\n            <category android:name=\"android.intent.category.BROWSABLE\" />\n            <data android:scheme=\"https\" />\n        </intent>\n    </queries>\n\n    <application\n        android:label=\"@string/app_name\"\n        android:name=\"${applicationName}\"\n        android:icon=\"@mipmap/ic_launcher\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        android:enableOnBackInvokedCallback=\"false\"\n        android:allowBackup=\"false\"\n        android:fullBackupContent=\"false\"\n        tools:replace=\"android:allowBackup\">\n        <meta-data\n            android:name=\"io.flutter.embedding.android.EnableImpeller\"\n            android:value=\"false\" />\n        <activity\n            android:name=\".MainActivity\"\n            android:exported=\"true\"\n            android:launchMode=\"singleTask\"\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:windowSoftInputMode=\"adjustResize\"\n            android:supportsPictureInPicture=\"true\"\n            android:resizeableActivity=\"true\"\n            >\n\n            <meta-data android:name=\"flutter_deeplinking_enabled\" android:value=\"false\" />\n\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 android:label=\"PiliPlus\">\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=\"http\"/>\n                <data android:scheme=\"https\"/>\n                <data android:host=\"*.bilibili.com\"/>\n                <data android:host=\"*.bilibili.cn\"/>\n                <data android:host=\"*.bilibili.tv\"/>\n                <data android:host=\"bilibili.com\"/>\n                <data android:host=\"bilibili.cn\"/>\n                <data android:host=\"bilibili.tv\"/>\n                <data android:host=\"b23.tv\" />\n                <!--<data android:host=\"live.bilibili.com\"/>-->\n                <!--<data android:host=\"www.bilibili.com\"/>-->\n                <!--<data android:host=\"www.bilibili.tv\"/>-->\n                <!--<data android:host=\"www.bilibili.cn\"/>-->\n                <!--<data android:host=\"m.bilibili.cn\"/>-->\n                <!--<data android:host=\"m.bilibili.com\"/>-->\n                <!--<data android:host=\"bilibili.cn\"/>-->\n                <!--<data android:host=\"bilibili.com\"/>-->\n                <!--<data android:host=\"bangumi.bilibili.com\"/>-->\n                <!--<data android:host=\"space.bilibili.com\"/>-->\n            </intent-filter>\n            <intent-filter android:label=\"PiliPlus\">\n                <action android:name=\"android.intent.action.VIEW\" />\n                <action android:name=\"android.intent.action.SEARCH\" />\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n                <data android:scheme=\"bilibili\"/>\n                <data android:host=\"forward\" />\n                <data android:host=\"comment\"\n                    android:pathPattern=\"/detail/.*/.*/.*\" />\n                <data android:host=\"uper\" />\n                <data android:host=\"article\"\n                    android:pathPattern=\"/readlist\" />\n                <data android:host=\"opus\" />\n                <data android:host=\"advertise\" android:path=\"/home\" />\n                <data android:host=\"clip\" />\n                <data android:host=\"search\" android:pathPattern=\".*\" />\n                <data android:host=\"stardust-search\" />\n                <data android:host=\"music\" />\n                <data android:host=\"cheese\" />\n                <data android:host=\"bangumi\"\n                    android:pathPattern=\"/season.*\" />\n                <data android:host=\"bangumi\" android:pathPattern=\"/.*\" />\n                <data android:host=\"pictureshow\"\n                    android:pathPrefix=\"/creative_center\" />\n                <data android:host=\"cliparea\" />\n                <data android:host=\"im\" />\n                <data android:host=\"im\" android:path=\"/notifications\" />\n                <data android:host=\"following\" />\n                <data android:host=\"following\"\n                    android:pathPattern=\"/detail/.*\" />\n                <data android:host=\"following\"\n                    android:path=\"/publishInfo/\" />\n                <data android:host=\"laser\" android:pathPattern=\"/.*\" />\n                <data android:host=\"livearea\" />\n                <data android:host=\"live\" />\n                <data android:host=\"catalog\" />\n                <data android:host=\"browser\" />\n                <data android:host=\"user_center\" />\n                <data android:host=\"login\" />\n                <data android:host=\"space\" />\n                <data android:host=\"author\" />\n                <data android:host=\"tag\" />\n                <data android:host=\"rank\" />\n                <data android:host=\"external\" />\n                <data android:host=\"blank\" />\n                <data android:host=\"home\" />\n                <data android:host=\"root\" />\n                <data android:host=\"video\" />\n                <data android:host=\"story\" />\n                <data android:host=\"podcast\" />\n                <data android:host=\"main\" android:path=\"/favorite\" />\n                <data android:host=\"pgc\" android:path=\"/theater/match\" />\n                <data android:host=\"pgc\" android:path=\"/theater/square\" />\n                <data android:host=\"m.bilibili.com\"\n                    android:path=\"/topic-detail\" />\n                <data android:host=\"article\" />\n                <data android:host=\"pegasus\"\n                    android:pathPattern=\"/channel/v2/.*\" />\n                <data android:host=\"feed\" android:pathPattern=\"/channel\" />\n                <data android:host=\"vip\" />\n                <data android:host=\"user_center\" android:path=\"/vip\" />\n                <data android:host=\"history\" />\n                <data android:host=\"charge\" android:path=\"/rank\" />\n                <data android:host=\"assistant\" />\n                <data android:host=\"feedback\" />\n                <data android:host=\"auth\" android:path=\"/launch\" />\n            </intent-filter>\n        </activity>\n        <service \n            android:name=\"com.ryanheise.audioservice.AudioService\"\n            android:foregroundServiceType=\"mediaPlayback\"\n            android:exported=\"true\" \n            tools:ignore=\"Instantiatable\">\n            <intent-filter>\n                <action android:name=\"android.media.browse.MediaBrowserService\" />\n            </intent-filter>\n        </service>\n\n        <activity\n            android:name=\"com.yalantis.ucrop.UCropActivity\"\n            android:theme=\"@style/Ucrop.CropTheme\"/>\n\n        <receiver \n            android:name=\"com.ryanheise.audioservice.MediaButtonReceiver\"\n            android:exported=\"true\" \n            tools:ignore=\"Instantiatable\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MEDIA_BUTTON\" />\n            </intent-filter>\n        </receiver> \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    <uses-permission android:name=\"android.permission.INTERNET\" />\n    <uses-permission android:name=\"android.permission.READ_MEDIA_IMAGES\"/>\n    <uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" />\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n    <uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\" android:maxSdkVersion=\"32\"/>\n    <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" android:maxSdkVersion=\"28\"/>\n    <uses-permission android:name=\"android.permission.WAKE_LOCK\"/>\n    <uses-permission android:name=\"android.permission.FOREGROUND_SERVICE\"/>\n    <uses-permission android:name=\"android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK\"/>\n    <uses-permission android:name=\"android.permission.POST_NOTIFICATIONS\"/>\n    <!--\n      Media access permissions.\n      Android 13 or higher.\n      https://developer.android.com/about/versions/13/behavior-changes-13#granular-media-permissions\n      -->\n    <uses-permission android:name=\"android.permission.READ_MEDIA_AUDIO\" />\n    <uses-permission android:name=\"android.permission.READ_MEDIA_VIDEO\" />\n    <uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>\n</manifest>\n"
  },
  {
    "path": "android/app/src/main/kotlin/com/example/piliplus/MainActivity.kt",
    "content": "package com.example.piliplus\n\nimport android.app.PictureInPictureParams\nimport android.app.SearchManager\nimport android.content.ComponentName\nimport android.content.Intent\nimport android.content.pm.PackageManager\nimport android.content.res.Configuration\nimport android.os.Build\nimport android.os.Bundle\nimport android.provider.MediaStore\nimport android.provider.Settings\nimport android.view.WindowManager.LayoutParams\nimport androidx.core.net.toUri\nimport com.ryanheise.audioservice.AudioServiceActivity\nimport io.flutter.embedding.engine.FlutterEngine\nimport io.flutter.plugin.common.MethodChannel\nimport kotlin.system.exitProcess\n\nclass MainActivity : AudioServiceActivity() {\n    private lateinit var methodChannel: MethodChannel\n\n    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {\n        super.configureFlutterEngine(flutterEngine)\n\n        methodChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, \"PiliPlus\")\n        methodChannel.setMethodCallHandler { call, result ->\n            when (call.method) {\n                \"back\" -> back();\n                \"biliSendCommAntifraud\" -> {\n                    try {\n                        val action = call.argument<Int>(\"action\") ?: 0\n                        val oid = call.argument<Number>(\"oid\") ?: 0L\n                        val type = call.argument<Int>(\"type\") ?: 0\n                        val rpid = call.argument<Number>(\"rpid\") ?: 0L\n                        val root = call.argument<Number>(\"root\") ?: 0L\n                        val parent = call.argument<Number>(\"parent\") ?: 0L\n                        val ctime = call.argument<Number>(\"ctime\") ?: 0L\n                        val commentText = call.argument<String>(\"comment_text\") ?: \"\"\n                        val pictures = call.argument<String?>(\"pictures\")\n                        val sourceId = call.argument<String>(\"source_id\") ?: \"\"\n                        val uid = call.argument<Number>(\"uid\") ?: 0L\n                        val cookies = call.argument<List<String>>(\"cookies\") ?: emptyList<String>()\n\n                        val intent = Intent().apply {\n                            component = ComponentName(\n                                \"icu.freedomIntrovert.biliSendCommAntifraud\",\n                                \"icu.freedomIntrovert.biliSendCommAntifraud.ByXposedLaunchedActivity\"\n                            )\n                            putExtra(\"action\", action)\n                            putExtra(\"oid\", oid.toLong())\n                            putExtra(\"type\", type)\n                            putExtra(\"rpid\", rpid.toLong())\n                            putExtra(\"root\", root.toLong())\n                            putExtra(\"parent\", parent.toLong())\n                            putExtra(\"ctime\", ctime.toLong())\n                            putExtra(\"comment_text\", commentText)\n                            if (pictures != null)\n                                putExtra(\"pictures\", pictures)\n                            putExtra(\"source_id\", sourceId)\n                            putExtra(\"uid\", uid.toLong())\n                            putStringArrayListExtra(\"cookies\", ArrayList(cookies))\n                        }\n                        startActivity(intent)\n                    } catch (_: Exception) {\n                    }\n                }\n\n                \"linkVerifySettings\" -> {\n                    val uri = (\"package:\" + context.packageName).toUri()\n                    try {\n                        val intent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {\n                            Intent(Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS, uri)\n                        } else {\n                            Intent(\"android.intent.action.MAIN\", uri).setClassName(\n                                \"com.android.settings\",\n                                \"com.android.settings.applications.InstalledAppOpenByDefaultActivity\"\n                            )\n                        }\n                        context.startActivity(intent)\n                    } catch (_: Throwable) {\n                        val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, uri)\n                        context.startActivity(intent)\n                    }\n                }\n\n                \"music\" -> {\n                    val title = call.argument<String>(\"title\")\n                    val intent = Intent(MediaStore.INTENT_ACTION_MEDIA_SEARCH).apply {\n                        putExtra(SearchManager.QUERY, title)\n                        putExtra(MediaStore.EXTRA_MEDIA_TITLE, title)\n                        call.argument<String?>(\"artist\")\n                            ?.let { putExtra(MediaStore.EXTRA_MEDIA_ARTIST, it) }\n                        call.argument<String?>(\"album\")\n                            ?.let { putExtra(MediaStore.EXTRA_MEDIA_ALBUM, it) }\n\n                        addCategory(Intent.CATEGORY_DEFAULT)\n                    }\n                    try {\n                        if (packageManager.resolveActivity(\n                                intent,\n                                PackageManager.MATCH_DEFAULT_ONLY\n                            ) != null\n                        ) {\n                            startActivity(intent)\n                            result.success(true)\n                            return@setMethodCallHandler\n                        }\n                    } catch (_: Throwable) {\n                    }\n                    try {\n                        intent.action = MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH\n                        if (packageManager.resolveActivity(\n                                intent,\n                                PackageManager.MATCH_DEFAULT_ONLY\n                            ) != null\n                        ) {\n                            startActivity(intent)\n                            result.success(true)\n                            return@setMethodCallHandler\n                        }\n                    } catch (_: Throwable) {\n                    }\n                    result.success(false)\n                }\n\n                \"setPipAutoEnterEnabled\" -> {\n                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {\n                        val params = PictureInPictureParams.Builder()\n                            .setAutoEnterEnabled(call.argument<Boolean>(\"autoEnable\") ?: false)\n                            .build()\n                        setPictureInPictureParams(params)\n                    }\n                }\n\n                else -> result.notImplemented()\n            }\n        }\n    }\n\n    private fun back() {\n        val intent = Intent(Intent.ACTION_MAIN).apply {\n            addCategory(Intent.CATEGORY_HOME)\n            flags = Intent.FLAG_ACTIVITY_NEW_TASK\n        }\n        startActivity(intent)\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {\n            window.attributes.layoutInDisplayCutoutMode =\n                LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES\n        }\n    }\n\n    override fun onDestroy() {\n        stopService(Intent(this, com.ryanheise.audioservice.AudioService::class.java))\n        super.onDestroy()\n        android.os.Process.killProcess(android.os.Process.myPid())\n        exitProcess(0)\n    }\n\n    override fun onUserLeaveHint() {\n        super.onUserLeaveHint()\n        methodChannel.invokeMethod(\"onUserLeaveHint\", null)\n    }\n\n    override fun onPictureInPictureModeChanged(\n        isInPictureInPictureMode: Boolean,\n        newConfig: Configuration?\n    ) {\n        super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig)\n        MethodChannel(\n            flutterEngine!!.dartExecutor.binaryMessenger,\n            \"floating\"\n        ).invokeMethod(\"onPipChanged\", isInPictureInPictureMode)\n    }\n}\n"
  },
  {
    "path": "android/app/src/main/res/drawable/ic_baseline_forward_10_24.xml",
    "content": "<vector android:height=\"24dp\" android:tint=\"#FFFFFF\"\n    android:viewportHeight=\"24\" android:viewportWidth=\"24\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M18,13c0,3.31 -2.69,6 -6,6s-6,-2.69 -6,-6s2.69,-6 6,-6v4l5,-5l-5,-5v4c-4.42,0 -8,3.58 -8,8c0,4.42 3.58,8 8,8s8,-3.58 8,-8H18z\"/>\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M10.86,15.94l0,-4.27l-0.09,0l-1.77,0.63l0,0.69l1.01,-0.31l0,3.26z\"/>\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M12.25,13.44v0.74c0,1.9 1.31,1.82 1.44,1.82c0.14,0 1.44,0.09 1.44,-1.82v-0.74c0,-1.9 -1.31,-1.82 -1.44,-1.82C13.55,11.62 12.25,11.53 12.25,13.44zM14.29,13.32v0.97c0,0.77 -0.21,1.03 -0.59,1.03c-0.38,0 -0.6,-0.26 -0.6,-1.03v-0.97c0,-0.75 0.22,-1.01 0.59,-1.01C14.07,12.3 14.29,12.57 14.29,13.32z\"/>\n</vector>\n"
  },
  {
    "path": "android/app/src/main/res/drawable/ic_baseline_replay_10_24.xml",
    "content": "<vector android:height=\"24dp\" android:tint=\"#FFFFFF\"\n    android:viewportHeight=\"24\" android:viewportWidth=\"24\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M11.99,5V1l-5,5l5,5V7c3.31,0 6,2.69 6,6s-2.69,6 -6,6s-6,-2.69 -6,-6h-2c0,4.42 3.58,8 8,8s8,-3.58 8,-8S16.41,5 11.99,5z\"/>\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M10.89,16h-0.85v-3.26l-1.01,0.31v-0.69l1.77,-0.63h0.09V16z\"/>\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M15.17,14.24c0,0.32 -0.03,0.6 -0.1,0.82s-0.17,0.42 -0.29,0.57s-0.28,0.26 -0.45,0.33s-0.37,0.1 -0.59,0.1s-0.41,-0.03 -0.59,-0.1s-0.33,-0.18 -0.46,-0.33s-0.23,-0.34 -0.3,-0.57s-0.11,-0.5 -0.11,-0.82V13.5c0,-0.32 0.03,-0.6 0.1,-0.82s0.17,-0.42 0.29,-0.57s0.28,-0.26 0.45,-0.33s0.37,-0.1 0.59,-0.1s0.41,0.03 0.59,0.1c0.18,0.07 0.33,0.18 0.46,0.33s0.23,0.34 0.3,0.57s0.11,0.5 0.11,0.82V14.24zM14.32,13.38c0,-0.19 -0.01,-0.35 -0.04,-0.48s-0.07,-0.23 -0.12,-0.31s-0.11,-0.14 -0.19,-0.17s-0.16,-0.05 -0.25,-0.05s-0.18,0.02 -0.25,0.05s-0.14,0.09 -0.19,0.17s-0.09,0.18 -0.12,0.31s-0.04,0.29 -0.04,0.48v0.97c0,0.19 0.01,0.35 0.04,0.48s0.07,0.24 0.12,0.32s0.11,0.14 0.19,0.17s0.16,0.05 0.25,0.05s0.18,-0.02 0.25,-0.05s0.14,-0.09 0.19,-0.17s0.09,-0.19 0.11,-0.32s0.04,-0.29 0.04,-0.48V13.38z\"/>\n</vector>\n"
  },
  {
    "path": "android/app/src/main/res/drawable/ic_launcher_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/drawable/ic_launcher_foreground.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:height=\"108dp\"\n    android:width=\"108dp\"\n    android:viewportWidth=\"108.0\"\n    android:viewportHeight=\"108.0\">\n    <path\n        android:fillColor=\"@color/ic_launcher_foreground\"\n        android:pathData=\"M56,54L39.78,54l2.22,-10.94h14c3.02,0 5.47,2.45 5.47,5.47 0,3.02 -2.45,5.47 -5.47,5.47zM56,35.77h-9.62l-7.13,36.45h7.51L48.92,61.29h7.08c7.05,0 12.76,-5.71 12.76,-12.76 0,-7.05 -5.71,-12.76 -12.76,-12.76z\"\n        android:fillType=\"evenOdd\" />\n</vector>"
  },
  {
    "path": "android/app/src/main/res/drawable/ic_notification_icon.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:height=\"24dp\"\n    android:width=\"24dp\"\n    android:viewportWidth=\"108.0\"\n    android:viewportHeight=\"108.0\">\n    <path\n        android:fillColor=\"#FF5CB67B\"\n        android:pathData=\"M57.54,54L28.82,54l3.93,-19.36h24.78c5.35,0 9.68,4.33 9.68,9.68 0,5.35 -4.33,9.68 -9.68,9.68zM57.54,21.73L40.5,21.73L27.88,86.27h13.3l3.83,-19.36h12.54c12.48,0 22.59,-10.11 22.59,-22.59 0,-12.48 -10.11,-22.59 -22.59,-22.59z\"\n        android:strokeWidth=\"0.252073\"\n        android:fillType=\"evenOdd\" />\n</vector>\n"
  },
  {
    "path": "android/app/src/main/res/drawable/launch_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item>\n        <bitmap android:gravity=\"fill\" android:src=\"@drawable/background\"/>\n    </item>\n    <item>\n        <bitmap android:gravity=\"center\" android:src=\"@drawable/splash\"/>\n    </item>\n</layer-list>\n"
  },
  {
    "path": "android/app/src/main/res/drawable-night/launch_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item>\n        <bitmap android:gravity=\"fill\" android:src=\"@drawable/background\"/>\n    </item>\n    <item>\n        <bitmap android:gravity=\"center\" android:src=\"@drawable/splash\"/>\n    </item>\n</layer-list>\n"
  },
  {
    "path": "android/app/src/main/res/drawable-night-v21/launch_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item>\n        <bitmap android:gravity=\"fill\" android:src=\"@drawable/background\"/>\n    </item>\n    <item>\n        <bitmap android:gravity=\"center\" android:src=\"@drawable/splash\"/>\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<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item>\n        <bitmap android:gravity=\"fill\" android:src=\"@drawable/background\"/>\n    </item>\n    <item>\n        <bitmap android:gravity=\"center\" android:src=\"@drawable/splash\"/>\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=\"@color/ic_launcher_background\"/>\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\"/>\n    <monochrome android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "android/app/src/main/res/raw/keep.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\"\n  tools:keep=\"@drawable/*\" />"
  },
  {
    "path": "android/app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"ic_launcher_foreground\">#FF5CB67B</color>\n    <color name=\"ic_launcher_background\">#FFFFFFFF</color>\n</resources>"
  },
  {
    "path": "android/app/src/main/res/values/string.xml",
    "content": "<resources>\n    <string name=\"app_name\">PiliPlus</string>\n</resources>"
  },
  {
    "path": "android/app/src/main/res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\">\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:defaultFocusHighlightEnabled\">false</item>\n        <item name=\"android:forceDarkAllowed\">false</item>\n        <item name=\"android:windowFullscreen\">false</item>\n        <item name=\"android:windowDrawsSystemBarBackgrounds\">false</item>\n        <item name=\"android:windowLayoutInDisplayCutoutMode\">shortEdges</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\" tools:targetApi=\"o_mr1\">shortEdges</item>\n    </style>\n\n    <style name=\"Ucrop.CropTheme\" parent=\"Theme.AppCompat.Light.NoActionBar\"/>\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:defaultFocusHighlightEnabled\">false</item>\n        <item name=\"android:forceDarkAllowed\">false</item>\n        <item name=\"android:windowFullscreen\">false</item>\n        <item name=\"android:windowDrawsSystemBarBackgrounds\">false</item>\n        <item name=\"android:windowLayoutInDisplayCutoutMode\">shortEdges</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    </style>\n</resources>\n"
  },
  {
    "path": "android/app/src/main/res/values-night-v31/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"ic_launcher_foreground\">@android:color/system_accent1_100</color>\n    <color name=\"ic_launcher_background\">@android:color/system_neutral1_800</color>\n</resources>"
  },
  {
    "path": "android/app/src/main/res/values-night-v31/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        <item name=\"android:defaultFocusHighlightEnabled\">false</item>\n        <item name=\"android:forceDarkAllowed\">false</item>\n        <item name=\"android:windowFullscreen\">false</item>\n        <item name=\"android:windowDrawsSystemBarBackgrounds\">false</item>\n        <item name=\"android:windowLayoutInDisplayCutoutMode\">shortEdges</item>\n        <item name=\"android:windowSplashScreenBackground\">#212121</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    </style>\n</resources>\n"
  },
  {
    "path": "android/app/src/main/res/values-v31/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"ic_launcher_foreground\">@android:color/system_neutral2_700</color>\n    <color name=\"ic_launcher_background\">@android:color/system_accent1_100</color>\n</resources>"
  },
  {
    "path": "android/app/src/main/res/values-v31/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        <item name=\"android:defaultFocusHighlightEnabled\">false</item>\n        <item name=\"android:forceDarkAllowed\">false</item>\n        <item name=\"android:windowFullscreen\">false</item>\n        <item name=\"android:windowDrawsSystemBarBackgrounds\">false</item>\n        <item name=\"android:windowLayoutInDisplayCutoutMode\">shortEdges</item>\n        <item name=\"android:windowSplashScreenBackground\">#ffffff</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    </style>\n</resources>\n"
  },
  {
    "path": "android/app/src/profile/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.example.piliplus\">\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.kts",
    "content": "import org.jetbrains.kotlin.gradle.tasks.KotlinCompile\n\nallprojects {\n    repositories {\n        google()\n        mavenCentral()\n    }\n}\n\nval newBuildDir: Directory =\n    rootProject.layout.buildDirectory\n        .dir(\"../../build\")\n        .get()\nrootProject.layout.buildDirectory.value(newBuildDir)\n\nsubprojects {\n    val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name)\n    project.layout.buildDirectory.value(newSubprojectBuildDir)\n}\n\nsubprojects {\n    afterEvaluate {\n        if (project.extensions.findByName(\"android\") != null) {\n            val androidExtension =\n                project.extensions.getByName(\"android\") as com.android.build.gradle.BaseExtension\n\n            if (androidExtension.namespace == null) {\n                androidExtension.namespace = project.group.toString()\n            }\n\n            androidExtension.compileOptions {\n                sourceCompatibility = JavaVersion.VERSION_17\n                targetCompatibility = JavaVersion.VERSION_17\n            }\n\n            project.tasks.withType<KotlinCompile>().configureEach {\n                compilerOptions {\n                    jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17)\n                }\n            }\n\n            val pluginCompileSdkStr = androidExtension.compileSdkVersion\n            val pluginCompileSdk = pluginCompileSdkStr\n                ?.removePrefix(\"android-\")\n                ?.toIntOrNull()\n            if (pluginCompileSdk != null && pluginCompileSdk < 31) {\n                project.logger.error(\n                    \"Warning: Overriding compileSdk version in Flutter plugin: ${project.name} \" +\n                            \"from $pluginCompileSdk to 31 (to work around https://issuetracker.google.com/issues/199180389).\\n\" +\n                            \"If there is not a new version of ${project.name}, consider filing an issue against ${project.name} \" +\n                            \"to increase their compileSdk to the latest (otherwise try updating to the latest version).\"\n                )\n                androidExtension.setCompileSdkVersion(31)\n            }\n        }\n\n        project.buildDir = File(rootProject.buildDir, project.name)\n    }\n}\n\nsubprojects {\n    project.evaluationDependsOn(\":app\")\n}\n\ntasks.register<Delete>(\"clean\") {\n    delete(rootProject.layout.buildDirectory)\n}\n"
  },
  {
    "path": "android/gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.14-all.zip\nnetworkTimeout=10000\nvalidateDistributionUrl=true\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists"
  },
  {
    "path": "android/gradle.properties",
    "content": "org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError\nandroid.useAndroidX=true\nandroid.enableJetifier=true"
  },
  {
    "path": "android/settings.gradle.kts",
    "content": "pluginManagement {\n    val flutterSdkPath =\n        run {\n            val properties = java.util.Properties()\n            file(\"local.properties\").inputStream().use { properties.load(it) }\n            val flutterSdkPath = properties.getProperty(\"flutter.sdk\")\n            require(flutterSdkPath != null) { \"flutter.sdk not set in local.properties\" }\n            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.1\" apply false\n    id(\"org.jetbrains.kotlin.android\") version \"2.2.20\" apply false\n}\n\ninclude(\":app\")\n"
  },
  {
    "path": "assets/linux/DEBIAN/control",
    "content": "Package: PiliPlus\nVersion: version_need_change\nMaintainer: gh-MzA4Nzk <githubaccount2333@proton.me>\nOriginal-Maintainer: bggRGjQaUbCoE <githubaccount56556@proton.me>\nSection: x11\nPriority: optional\nArchitecture: amd64\nEssential: no\nInstalled-Size: size_need_change\nDescription: third-party Bilibili client developed in Flutter\nHomepage: https://github.com/bggRGjQaUbCoE/PiliPlus\nDepends: libgtk-3-0t64,\n         libmpv2,\n         gir1.2-ayatanaappindicator3-0.1,\n         libayatana-appindicator3-1\n\n"
  },
  {
    "path": "assets/linux/DEBIAN/postinst",
    "content": "#!/usr/bin/env bash\n\nln -sf /opt/PiliPlus/piliplus /usr/bin/piliplus\nchmod +x /usr/bin/piliplus\n\nif [ $1 == \"configure\" ] && [ -x /usr/bin/update-mime-database ]; then\n    echo \"updating mime database...\"\n    update-mime-database  /usr/share/mime || true\nfi\n\nif [ $1 == \"configure\" ] && [ -x /usr/bin/gtk-update-icon-cache ]; then\n    echo \"updating icon cache...\"\n    gtk-update-icon-cache -q -f -t /usr/share/icons/hicolor || true\nfi\n\nif [ $1 == \"configure\" ] && [ -x /usr/bin/update-desktop-database ]; then\n    echo \"configure desktop database...\"\n    update-desktop-database -q /usr/share/applications || true\nfi\n\nexit 0\n"
  },
  {
    "path": "assets/linux/DEBIAN/postrm",
    "content": "#!/usr/bin/env bash\nrm /usr/bin/piliplus\nif [ \"$1\" = \"remove\" ] || [ \"$1\" = \"purge\" ]; then\n    if [ -x /usr/bin/update-desktop-database ]; then\n        echo \"updating desktop database...\"\n        update-desktop-database -q /usr/share/applications || true\n    fi\n\n    if [ -x /usr/bin/gtk-update-icon-cache ]; then\n        echo \"updating icon cache...\"\n        gtk-update-icon-cache -q -t /usr/share/icons/hicolor || true\n    fi\n\n    if [ -x /usr/bin/update-mime-database ]; then\n        echo \"updating mime database...\"\n        update-mime-database /usr/share/mime || true\n    fi\nfi\n\nif [ $1 = \"purge\" ]; then\n    echo \"Removing user data...\"\n    rm -rf /home/*/.local/share/com.example.PiliPlus || true\n    rm -rf /root/.local/share/com.example.PiliPlus || true\nfi\n\nexit 0\n"
  },
  {
    "path": "assets/linux/DEBIAN/prerm",
    "content": "#!/usr/bin/env bash\n\nif [ \"$1\" = \"remove\" ] || [ \"$1\" = \"deconfigure\" ]; then\n    echo \"Stopping PiliPlus if running...\"\n    pkill -x piliplus || true\nfi\n\nexit 0\n"
  },
  {
    "path": "assets/linux/com.example.piliplus.desktop",
    "content": "[Desktop Entry]\nType=Application\nName=PiliPlus\nComment=A third-party Bilibili Client developed in Flutter\nComment[zh_CN]=使用 Flutter 开发的 BiliBili 第三方客户端\nExec=piliplus\nIcon=piliplus\nTerminal=false\nStartupWMClass=com.example.piliplus\nCategories=Video;AudioVideo;Player;\n"
  },
  {
    "path": "assets/shaders/Anime4K_AutoDownscalePre_x2.glsl",
    "content": "// This is free and unencumbered software released into the public domain.\n\n// Anyone is free to copy, modify, publish, use, compile, sell, or\n// distribute this software, either in source code form or as a compiled\n// binary, for any purpose, commercial or non-commercial, and by any\n// means.\n\n// In jurisdictions that recognize copyright laws, the author or authors\n// of this software dedicate any and all copyright interest in the\n// software to the public domain. We make this dedication for the benefit\n// of the public at large and to the detriment of our heirs and\n// successors. We intend this dedication to be an overt act of\n// relinquishment in perpetuity of all present and future rights to this\n// software under copyright law.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\n// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n// OTHER DEALINGS IN THE SOFTWARE.\n\n// For more information, please refer to <https://unlicense.org>\n\n//!DESC Anime4K-v4.0-AutoDownscalePre-x2\n//!HOOK MAIN\n//!BIND HOOKED\n//!BIND NATIVE\n//!WHEN OUTPUT.w NATIVE.w / 2.0 < OUTPUT.h NATIVE.h / 2.0 < * OUTPUT.w NATIVE.w / 1.2 > OUTPUT.h NATIVE.h / 1.2 > * *\n//!WIDTH OUTPUT.w\n//!HEIGHT OUTPUT.h\n\nvec4 hook() {\n\treturn HOOKED_tex(HOOKED_pos);\n}\n"
  },
  {
    "path": "assets/shaders/Anime4K_AutoDownscalePre_x4.glsl",
    "content": "// This is free and unencumbered software released into the public domain.\n\n// Anyone is free to copy, modify, publish, use, compile, sell, or\n// distribute this software, either in source code form or as a compiled\n// binary, for any purpose, commercial or non-commercial, and by any\n// means.\n\n// In jurisdictions that recognize copyright laws, the author or authors\n// of this software dedicate any and all copyright interest in the\n// software to the public domain. We make this dedication for the benefit\n// of the public at large and to the detriment of our heirs and\n// successors. We intend this dedication to be an overt act of\n// relinquishment in perpetuity of all present and future rights to this\n// software under copyright law.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\n// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n// OTHER DEALINGS IN THE SOFTWARE.\n\n// For more information, please refer to <https://unlicense.org>\n\n//!DESC Anime4K-v3.2-AutoDownscalePre-x4\n//!HOOK MAIN\n//!BIND HOOKED\n//!BIND NATIVE\n//!WHEN OUTPUT.w NATIVE.w / 4.0 < OUTPUT.h NATIVE.h / 4.0 < * OUTPUT.w NATIVE.w / 2.4 > OUTPUT.h NATIVE.h / 2.4 > * *\n//!WIDTH OUTPUT.w 2 /\n//!HEIGHT OUTPUT.h 2 /\n\nvec4 hook() {\n\treturn HOOKED_tex(HOOKED_pos);\n}\n"
  },
  {
    "path": "assets/shaders/Anime4K_Clamp_Highlights.glsl",
    "content": "// MIT License\n\n// Copyright (c) 2019-2021 bloc97\n// All rights reserved.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n//!DESC Anime4K-v4.0-De-Ring-Compute-Statistics\n//!HOOK MAIN\n//!BIND HOOKED\n//!SAVE STATSMAX\n//!COMPONENTS 1\n\n#define KERNELSIZE 5 //Kernel size, must be an positive odd integer.\n#define KERNELHALFSIZE 2 //Half of the kernel size without remainder. Must be equal to trunc(KERNELSIZE/2).\n\nfloat get_luma(vec4 rgba) {\n\treturn dot(vec4(0.299, 0.587, 0.114, 0.0), rgba);\n}\n\nvec4 hook() {\n\n\tfloat gmax = 0.0;\n\t\n\tfor (int i=0; i<KERNELSIZE; i++) {\n\t\tfloat g = get_luma(MAIN_texOff(vec2(i - KERNELHALFSIZE, 0)));\n\t\t\n\t\tgmax = max(g, gmax);\n\t}\n\t\n\treturn vec4(gmax, 0.0, 0.0, 0.0);\n}\n\n//!DESC Anime4K-v4.0-De-Ring-Compute-Statistics\n//!HOOK MAIN\n//!BIND HOOKED\n//!BIND STATSMAX\n//!SAVE STATSMAX\n//!COMPONENTS 1\n\n#define KERNELSIZE 5 //Kernel size, must be an positive odd integer.\n#define KERNELHALFSIZE 2 //Half of the kernel size without remainder. Must be equal to trunc(KERNELSIZE/2).\n\nvec4 hook() {\n\n\tfloat gmax = 0.0;\n\t\n\tfor (int i=0; i<KERNELSIZE; i++) {\n\t\tfloat g = STATSMAX_texOff(vec2(0, i - KERNELHALFSIZE)).x;\n\t\t\n\t\tgmax = max(g, gmax);\n\t}\n\t\n\treturn vec4(gmax, 0.0, 0.0, 0.0);\n}\n\n//!DESC Anime4K-v4.0-De-Ring-Clamp\n//!HOOK PREKERNEL\n//!BIND HOOKED\n//!BIND STATSMAX\n\nfloat get_luma(vec4 rgba) {\n\treturn dot(vec4(0.299, 0.587, 0.114, 0.0), rgba);\n}\n\nvec4 hook() {\n\n\tfloat current_luma = get_luma(HOOKED_tex(HOOKED_pos));\n\tfloat new_luma = min(current_luma, STATSMAX_tex(HOOKED_pos).x);\n\t\n\t//This trick is only possible if the inverse Y->RGB matrix has 1 for every row... (which is the case for BT.709)\n\t//Otherwise we would need to convert RGB to YUV, modify Y then convert back to RGB.\n    return HOOKED_tex(HOOKED_pos) - (current_luma - new_luma); \n}"
  },
  {
    "path": "assets/shaders/Anime4K_Restore_CNN_M.glsl",
    "content": "// MIT License\n\n// Copyright (c) 2019-2021 bloc97\n// All rights reserved.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n//!DESC Anime4K-v4.0-Restore-CNN-(M)-Conv-4x3x3x3\n//!HOOK MAIN\n//!BIND MAIN\n//!SAVE conv2d_tf\n//!WIDTH MAIN.w\n//!HEIGHT MAIN.h\n//!COMPONENTS 4\n#define go_0(x_off, y_off) (MAIN_texOff(vec2(x_off, y_off)))\nvec4 hook() {\n    vec4 result = mat4(-0.09991986, 0.13782342, -0.031251684, -0.06356843, -0.3437488, 0.05450952, 0.34347802, 0.46335372, 0.08607224, 0.044988394, 0.137179, 0.17976908, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, -1.0);\n    result += mat4(-0.024212424, -0.09278509, -0.00040907756, 0.34552294, -0.13254678, 0.113105185, 0.005667946, -0.00036919137, -0.06375679, 0.009184115, 0.115518734, -0.115506776, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, 0.0);\n    result += mat4(-0.14101827, 0.023523493, 0.044094566, -0.019271746, -0.44348842, -0.08818877, -0.4026149, -0.21995795, -0.15880394, -0.013732858, -0.020751135, 0.012719151, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, 1.0);\n    result += mat4(0.013001821, -0.34503505, 0.39219138, 0.18792126, 0.24760444, -0.016173402, 0.10154511, 0.15453082, -0.058132876, 0.016784398, -0.05808539, -0.11039915, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, -1.0);\n    result += mat4(0.37024534, 0.041440863, -0.3374568, -0.44994286, 0.19555596, 0.20855539, -0.27974075, -0.5372628, 0.21228147, -0.0295346, -0.56700057, 0.030042822, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, 0.0);\n    result += mat4(-0.12940632, 0.057526, 0.090682045, -0.06985033, -0.13704006, -0.047685407, 0.44615674, -0.48056605, -0.06166251, -0.01883519, 0.2032237, -0.113287605, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, 1.0);\n    result += mat4(0.010856669, -0.35820737, 0.16757219, 0.082619876, -0.03967303, 0.038705572, 0.32652855, -0.012030017, 0.015120559, -0.15314877, 0.23442009, 0.09767922, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, -1.0);\n    result += mat4(-0.046272673, -0.17752305, 0.082018286, -0.2512824, 0.58619463, -0.060903464, -0.022793597, 0.077803515, -0.17025311, 0.05136993, 0.029383298, -0.15475409, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, 0.0);\n    result += mat4(-0.11212024, 0.13378005, -0.2027488, 0.08056421, -0.11176219, -0.048429377, -0.08396386, 0.10507829, 0.13326839, 0.0430627, 0.051362377, 0.06482755, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, 1.0);\n    result += vec4(-0.061233472, 0.39222646, 0.029704979, 0.02586828);\n    return result;\n}\n//!DESC Anime4K-v4.0-Restore-CNN-(M)-Conv-4x3x3x8\n//!HOOK MAIN\n//!BIND conv2d_tf\n//!SAVE conv2d_1_tf\n//!WIDTH conv2d_tf.w\n//!HEIGHT conv2d_tf.h\n//!COMPONENTS 4\n#define go_0(x_off, y_off) (max((conv2d_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max(-(conv2d_tf_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(-0.16410656, -0.40521824, 0.13121907, -0.02314597, 0.105412476, -0.060401272, -0.043063477, -0.13933973, 0.12558138, -0.020861467, 0.030370515, 0.13178016, -0.14220351, 0.20736893, 0.003321564, -0.29241714) * go_0(-1.0, -1.0);\n    result += mat4(0.18517321, 0.29162985, -0.26783395, 0.039760686, 0.025527012, -0.067319244, 0.055004176, 0.048916563, 0.12750523, -0.091435954, 0.13818842, 0.36704224, 0.0839921, 0.10186618, -0.17237376, 0.13282418) * go_0(-1.0, 0.0);\n    result += mat4(-0.1657887, 0.0131325135, -0.17222486, 0.091398895, -0.12756164, -0.08437298, -0.29052997, 0.3269337, 0.15870757, -0.013529402, -0.0581753, 0.11802371, 0.07099966, -0.024063632, 0.31834844, -0.11183859) * go_0(-1.0, 1.0);\n    result += mat4(0.46036887, -0.07654623, 0.22923063, 0.17463821, 0.10555414, -0.117430426, 0.12406777, -0.011399492, 0.028316498, 0.13684341, 0.009664087, 0.2022659, 0.04953974, -0.31342217, -0.6103131, -0.13605757) * go_0(0.0, -1.0);\n    result += mat4(0.03406955, -0.39819366, 0.61176, -0.46809456, -0.029321073, 0.46619493, 0.36700186, 0.02288561, 0.11464085, -0.10931452, -0.09154022, 0.07334147, -0.5609916, 0.31826234, -0.011012659, -0.46719545) * go_0(0.0, 0.0);\n    result += mat4(-0.056855045, 0.27037027, -0.09269696, -0.563572, -0.06816116, -0.22986612, 0.08693167, -0.16246101, 0.09954046, -0.05374176, 0.0071916827, -0.1788692, 0.3825241, -0.1609887, 0.055204768, 0.10213068) * go_0(0.0, 1.0);\n    result += mat4(0.0646626, 0.102358796, -0.45055822, 0.20557903, -0.23337309, 0.12633002, -0.19299199, -0.15085731, -0.13473304, 0.053790465, -0.10061193, -0.13393497, -0.04264752, -0.029740738, -0.07865285, 0.20883279) * go_0(1.0, -1.0);\n    result += mat4(0.010471527, -0.033218473, -0.46157447, 0.004866583, 0.23226471, -0.059343327, -0.1439596, 0.13619648, 0.013839963, 0.15930325, 0.043742355, 0.17467323, 0.33772305, 0.40261495, -0.08351293, 0.18129359) * go_0(1.0, 0.0);\n    result += mat4(-0.12493434, -0.1875134, -0.074943796, -0.0031701606, -0.037142616, 0.1667002, 0.16665547, -0.011248127, 0.0071619414, 0.0034872112, 0.120318964, -0.09625579, 0.14917047, -0.16310586, 0.07231737, 0.30447328) * go_0(1.0, 1.0);\n    result += mat4(0.093798615, 0.17074613, -0.08780678, -0.012520207, 0.118534856, 0.027508778, -0.2778478, -0.19509242, -0.34137097, 0.32000312, -0.22027159, 0.337515, 0.16220862, 0.108993016, 0.14070526, 0.12784284) * go_1(-1.0, -1.0);\n    result += mat4(-0.14325632, -0.1467453, -0.27502358, 0.09370837, 0.11821083, -0.012266484, -0.2100548, 0.4707502, -0.06766648, 0.58165014, -0.2512279, -0.33783755, 0.1318925, -0.04346277, 0.15454485, 0.044500057) * go_1(-1.0, 0.0);\n    result += mat4(-0.05683207, 0.0051946463, -0.108000524, 0.10133204, -0.50763863, 0.007308442, 0.8542404, 0.28387356, 0.022709515, 0.294523, -0.3822472, 0.66166407, 0.01404485, 0.031282708, -0.26756814, -0.123147786) * go_1(-1.0, 1.0);\n    result += mat4(-0.36455178, 0.3470555, -0.045303088, -0.03170764, -0.15802494, -0.0019141496, -0.25939587, -0.23875342, 0.130428, 0.03954273, -0.17985536, 0.105145946, 0.15804817, 0.12551713, 0.28371975, -0.085748516) * go_1(0.0, -1.0);\n    result += mat4(0.0060625463, 0.2443924, -0.017692259, -0.20214005, -0.09584515, -0.012805372, -0.13942227, 0.16143198, 0.12942013, 0.41785547, 0.046071563, 0.7030026, 0.10499644, -0.20566013, -0.031321276, 0.27830327) * go_1(0.0, 0.0);\n    result += mat4(-0.081274964, -0.14562319, 0.27200526, -0.20491314, 0.012910989, 0.024201397, 0.04816258, 0.21297328, -0.22015952, -0.44160756, -0.056035373, 0.33824417, -0.31645304, 0.15469243, 0.053187452, -0.20989445) * go_1(0.0, 1.0);\n    result += mat4(-0.046550367, 0.033185404, 0.33337244, 0.12853645, 0.23520172, -0.05909214, 0.0861368, 0.10706329, -0.07058717, -0.11759937, -0.18594047, 0.080006264, -0.055425353, -0.12506317, 0.15729053, -0.0915004) * go_1(1.0, -1.0);\n    result += mat4(0.042516407, 0.14844789, 0.16533111, 0.13502933, -0.0655417, -0.057256397, 0.076713726, -0.23448966, 0.12855926, 0.014219275, 0.051761385, 0.053433083, -0.2446715, -0.4008074, 0.19603717, -0.1796951) * go_1(1.0, 0.0);\n    result += mat4(0.14777803, 0.15524907, 0.043158617, -0.06996876, 0.19210646, -0.2144364, -0.47020787, -0.4207906, -0.18074386, -0.2163903, 0.0030754965, 0.36799973, -0.3837698, -0.0022661497, -0.37276733, -0.28934997) * go_1(1.0, 1.0);\n    result += vec4(-0.018297346, -0.080951825, -0.062163066, -0.08050014);\n    return result;\n}\n//!DESC Anime4K-v4.0-Restore-CNN-(M)-Conv-4x3x3x8\n//!HOOK MAIN\n//!BIND conv2d_1_tf\n//!SAVE conv2d_2_tf\n//!WIDTH conv2d_1_tf.w\n//!HEIGHT conv2d_1_tf.h\n//!COMPONENTS 4\n#define go_0(x_off, y_off) (max((conv2d_1_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max(-(conv2d_1_tf_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(0.31543177, 0.23095237, -0.06692611, -0.5867763, 0.003622504, 0.17948842, -0.14627707, 0.1745016, -0.052964583, -0.15551159, 0.05644786, -0.012665164, 0.13107763, 0.11369179, -0.09452995, -0.11973403) * go_0(-1.0, -1.0);\n    result += mat4(-0.2694661, -0.115382135, 0.3073268, -0.067228466, -0.25511482, -0.13922207, 0.36758214, -0.18821828, -0.022617863, 0.20333402, -0.11125889, 0.3552245, -0.013346653, -0.099095374, -0.25100616, 0.35521755) * go_0(-1.0, 0.0);\n    result += mat4(0.011012409, -0.13675085, 0.25642, -0.34851208, -0.23184675, 0.18012202, 0.57654136, 0.103173524, -0.16461405, 0.038177088, 0.1234096, 0.013202029, -0.19033363, 0.07469178, -0.017948546, 0.15287702) * go_0(-1.0, 1.0);\n    result += mat4(-0.05340533, 0.23797482, 0.20351392, -0.05333351, -0.12181174, -0.23363493, -0.20696607, 0.109941036, -0.11519453, 0.13842066, -0.10687832, 0.29040006, 0.022218632, 0.031238724, 0.2685182, 0.15300068) * go_0(0.0, -1.0);\n    result += mat4(0.22985318, -0.3103802, -0.22916415, 0.25238806, -0.11690287, -0.1947488, 0.118020535, 0.07814263, -0.06335474, -0.007870727, 0.076106325, 0.094677486, -0.16776285, -0.006570437, -0.29589584, 0.41413507) * go_0(0.0, 0.0);\n    result += mat4(0.43607962, -0.36456433, -0.123776875, -0.16634953, -0.091190875, 0.13035081, 0.28627968, 0.27249968, 0.12356344, -0.008616177, 0.09599816, -0.006144557, -0.23490307, 0.3013123, 0.14153156, 0.21837278) * go_0(0.0, 1.0);\n    result += mat4(0.060364585, 0.37860224, 0.039182413, -0.22805426, -0.089910224, -0.06817697, -0.2684275, -0.12528503, 0.036934495, -0.07826616, 0.06559976, -0.08253646, 0.13489649, 0.06237663, 0.126376, 0.21194184) * go_0(1.0, -1.0);\n    result += mat4(-0.12534817, 0.21225189, -0.27818045, -0.3070443, -0.006957577, -0.025105853, 0.12100924, -0.06916452, 0.23081483, 0.1802756, -0.18995638, 0.16603014, -0.2904096, -0.25292823, -0.21834068, 0.13719653) * go_0(1.0, 0.0);\n    result += mat4(0.017209655, 0.10757137, 0.21414296, -0.30885983, 0.10467716, -0.2184891, 0.100061476, -0.1527528, 0.2100472, -0.25768545, -0.22329919, -0.29153427, -0.06983842, -0.103854865, -0.051384352, 0.14629121) * go_0(1.0, 1.0);\n    result += mat4(0.0059623295, -0.26060802, 0.32115817, 0.021025505, 0.09783085, -0.15865178, 0.1473021, -0.24977303, -0.033508282, 0.17480391, -0.091310136, 0.09870876, 0.10504043, -0.06105686, 0.013493489, -0.11278855) * go_1(-1.0, -1.0);\n    result += mat4(0.14875248, -0.14859414, 0.19377062, -0.17456068, 0.101288855, -0.1113682, -0.48944646, 0.1018565, -0.037392337, 0.08539691, 0.1751306, -0.15428723, -0.059375558, 0.027663672, 0.051804014, -0.049813222) * go_1(-1.0, 0.0);\n    result += mat4(0.118846565, -0.19869871, -0.037388258, 0.08456728, -0.11662527, -0.43818352, -0.093285345, 0.038507205, -0.051991668, 0.21008292, 0.10792365, 0.2020924, 0.057021596, 0.09460527, 0.0016551288, -0.0015957063) * go_1(-1.0, 1.0);\n    result += mat4(0.11062174, -0.2639232, -0.060295466, -0.3217331, -0.050545212, 0.30989558, 0.30906132, 0.030323273, 0.028986752, 0.037429404, 0.20855664, -0.19848943, 0.034687653, -0.09599135, -0.06250494, -0.13215867) * go_1(0.0, -1.0);\n    result += mat4(-0.010391146, 0.07657845, 0.44491258, 0.0435906, 0.0075931503, 0.42632654, 0.47022533, 0.34737435, -0.15452717, -0.14613411, -0.45231065, 0.12094409, 0.0067911847, 0.057501152, 0.09876979, 0.044946447) * go_1(0.0, 0.0);\n    result += mat4(-0.15607435, 0.2293058, -0.09520331, 0.012836732, -0.15282455, 0.26437718, -0.1685477, -0.13211122, -0.055801593, -0.016778728, -0.34478986, -0.23228309, 0.12300962, -0.13235827, -0.13987203, -0.16550972) * go_1(0.0, 1.0);\n    result += mat4(0.13161735, -0.09039346, -0.033475474, -0.23686698, 0.1514885, 0.20977421, 0.031431954, -0.0049226107, 0.090661936, 0.15288061, -0.03316583, 0.09646573, -0.32651708, 0.18825398, -0.15777239, 0.17572704) * go_1(1.0, -1.0);\n    result += mat4(0.112157226, -0.08712878, 0.23453182, 0.1043877, -0.14686783, 0.28682423, -0.086443506, 0.059457052, -0.31530112, -0.2700583, -0.06028952, -0.070416875, 0.18053482, 0.16653341, 0.25215197, 0.061915852) * go_1(1.0, 0.0);\n    result += mat4(-0.20122242, 0.076313145, -0.0988483, 0.094337784, -0.35436687, 0.3762327, -0.07809558, 0.3055848, 0.10425242, -0.17087407, 0.030301496, -0.13911743, 0.01630275, 0.24247427, -0.006474477, 0.03842641) * go_1(1.0, 1.0);\n    result += vec4(-0.008952847, -0.0058945753, -0.08097229, 0.020968592);\n    return result;\n}\n//!DESC Anime4K-v4.0-Restore-CNN-(M)-Conv-4x3x3x8\n//!HOOK MAIN\n//!BIND conv2d_2_tf\n//!SAVE conv2d_3_tf\n//!WIDTH conv2d_2_tf.w\n//!HEIGHT conv2d_2_tf.h\n//!COMPONENTS 4\n#define go_0(x_off, y_off) (max((conv2d_2_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max(-(conv2d_2_tf_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(-0.2237721, -0.0064096362, -0.31808427, 0.73477733, 0.015353088, 0.23983319, 0.14967978, -0.34920225, -0.07456269, 0.093151815, -0.14331086, -0.24586205, -0.14183366, 0.06401045, -0.22044073, 0.29932275) * go_0(-1.0, -1.0);\n    result += mat4(-0.07968509, -0.3349146, 0.16529128, 0.08443499, 0.4095855, -0.17120704, 0.17425705, 0.15298946, 0.2981273, 0.2212369, 0.10392389, -0.28775454, -0.065247655, -0.15255849, 0.13094437, 0.18685219) * go_0(-1.0, 0.0);\n    result += mat4(0.015706737, -0.17755036, 0.2622526, 0.112057306, -0.15876788, -0.38466996, -0.33700845, -0.031711742, -0.023320962, -0.3145249, -0.21223734, -0.1314596, -0.1888095, -0.046370104, 0.09000896, -0.0046378844) * go_0(-1.0, 1.0);\n    result += mat4(-0.31127506, 0.31304324, -0.03965752, 0.03649018, -0.029851055, 0.05801377, 0.00040150844, -0.04422069, 0.18019931, 0.14415511, -0.09845236, 0.21895434, -0.013932474, -0.046454947, -0.3403935, -0.006705289) * go_0(0.0, -1.0);\n    result += mat4(-0.34878647, -0.5129283, 0.060250953, -0.16354133, 0.20644619, 0.08732273, -0.24118888, 0.24455065, 0.24449423, 0.44103387, 0.22455928, 0.25738943, -0.26914698, -0.21309987, 0.08386486, 0.021484816) * go_0(0.0, 0.0);\n    result += mat4(-0.057454903, -0.4121922, 0.022661546, 0.37178272, 0.03331408, 0.05044008, 0.04324371, 0.20727943, 0.2432641, 0.076906696, -0.20858039, 0.012439015, -0.19335061, 0.09217451, 0.1968369, -0.19435833) * go_0(0.0, 1.0);\n    result += mat4(-0.16960496, 0.24616167, 0.37977478, 0.14324574, -0.011531225, -0.11312143, -0.18141079, -0.23843932, 0.0086012175, -0.3564491, -0.12639481, 0.009799298, -0.29120612, 0.23756824, 0.18035695, -0.087133996) * go_0(1.0, -1.0);\n    result += mat4(-0.10081239, 0.29191494, 0.10434693, 0.08970636, 0.008997759, 0.104756236, 0.039641086, 0.02323888, -0.11627765, 0.023693223, -0.30801758, -0.120208986, 0.05086147, 0.18498175, 0.15595439, -0.09877306) * go_0(1.0, 0.0);\n    result += mat4(0.101321675, -0.2929976, 0.38810417, 0.5605376, -0.04073937, 0.030110704, -0.18147062, -0.09833952, 0.01927733, 0.15335669, -0.15384074, -0.110595055, -0.054297395, -0.077522054, 0.07918369, -0.068480626) * go_0(1.0, 1.0);\n    result += mat4(0.23263514, -0.11719232, 0.2903209, -0.007503795, -0.020222448, -0.17790157, -0.15600762, -0.08741775, 0.12529704, 0.25548857, -0.04585447, -0.10255033, 0.18350503, -0.29593533, 0.0868933, 0.027004737) * go_1(-1.0, -1.0);\n    result += mat4(-0.14958654, -0.006238835, -0.2928948, 0.1988557, -0.17057803, 0.12524141, 0.13978264, -0.019280292, 0.05967142, -0.07790818, -0.5893818, -0.022845713, -0.08596779, 0.07875358, -0.03316667, -0.4369282) * go_1(-1.0, 0.0);\n    result += mat4(0.19195688, -0.060883682, -0.25897828, 0.07063324, 0.090833396, 0.003422883, 0.109534174, 0.031180874, -0.05017118, 0.022862168, -0.270113, -0.057831235, 0.53920543, -0.10252776, -0.091807485, 0.004294343) * go_1(-1.0, 1.0);\n    result += mat4(-0.18494242, -0.119284816, 0.3821897, 0.07777979, 0.15568028, -0.2854859, -0.22441281, -0.049155876, -0.15292497, 0.21895619, -0.095677756, 0.15210424, 0.001643022, -0.026176987, 0.048463076, -0.4824009) * go_1(0.0, -1.0);\n    result += mat4(0.007215129, 0.17074333, 0.053930074, -0.027014816, -0.17180431, -0.15163863, -0.0012122132, -0.18934256, -0.08294297, -0.24580221, -0.46552867, -0.27923223, 0.4092668, 0.06288688, -0.1602188, -0.0030876845) * go_1(0.0, 0.0);\n    result += mat4(0.111870885, 0.03317145, 0.14155298, 0.20328505, -0.05104131, 0.13979794, 0.018966835, -0.07238511, 0.05493792, -0.14975783, -0.10293237, -0.21985306, 0.49054706, 0.18288186, -0.26925826, 0.35845932) * go_1(0.0, 1.0);\n    result += mat4(0.3747799, -0.096748486, -0.17139742, 0.25289854, -0.17421168, -0.018461818, 0.09747162, 0.01660535, -0.20580359, 0.56189656, 0.17151354, -0.26347768, 0.28350568, -0.21486014, -0.44330928, -0.008981037) * go_1(1.0, -1.0);\n    result += mat4(0.10169985, -0.18244018, 0.04760736, 0.41017643, -0.09468786, -0.024218475, 0.103733875, -0.22540338, 0.10630112, 0.3677178, -0.104170956, 0.057317447, 0.21764882, 0.0789158, -0.22041337, 0.15065216) * go_1(1.0, 0.0);\n    result += mat4(0.11633995, -0.008195114, -0.14501533, 0.07168025, 0.058413275, 0.055995367, 0.09362145, -0.13827963, 0.13760869, 0.040319785, 0.038895044, 0.2675253, -0.087339684, 0.1412073, -0.17166458, -0.2312994) * go_1(1.0, 1.0);\n    result += vec4(-0.059377354, -0.02055341, 0.07234869, -0.015452986);\n    return result;\n}\n//!DESC Anime4K-v4.0-Restore-CNN-(M)-Conv-4x3x3x8\n//!HOOK MAIN\n//!BIND conv2d_3_tf\n//!SAVE conv2d_4_tf\n//!WIDTH conv2d_3_tf.w\n//!HEIGHT conv2d_3_tf.h\n//!COMPONENTS 4\n#define go_0(x_off, y_off) (max((conv2d_3_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max(-(conv2d_3_tf_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(-0.29012984, -0.13150147, 0.31015614, 0.05992291, -0.050289866, 0.14845313, -0.09608898, 0.27913308, 0.060307387, -0.04160452, 0.035932682, -0.08137563, -0.07999419, 0.11818284, -0.27512288, 0.21948813) * go_0(-1.0, -1.0);\n    result += mat4(0.12916058, -0.21759962, -0.33868533, 0.021636661, 0.053470243, 0.1412425, 0.043395396, -0.26751056, -0.01689101, -0.2623835, 0.010809152, 0.062962815, -0.20692012, -0.1677863, -0.23313859, -0.17402615) * go_0(-1.0, 0.0);\n    result += mat4(-0.08204112, -0.23672083, -0.0064437394, -0.13200696, -0.056692924, -0.02708657, 0.12536962, 0.004428919, 0.14137582, 0.15404348, -0.105753876, 0.047957454, 0.15734316, 0.16562423, -0.010160829, -0.06602983) * go_0(-1.0, 1.0);\n    result += mat4(0.025653997, -0.10877775, -0.31258908, 0.18841636, -0.36005193, 0.1816357, -0.34537643, -0.0741087, 0.4663994, 0.0065186517, 0.08109033, 0.2976773, -0.35774228, -0.041366056, -0.37852773, 0.050565656) * go_0(0.0, -1.0);\n    result += mat4(0.04392313, 0.11316681, -0.14421389, 0.17985669, -0.1651274, -0.5656209, -0.124100484, 0.42774054, -0.1153939, 0.16829851, 0.2025612, 0.054007456, -0.06868256, -0.56935954, -0.12227961, 0.17688861) * go_0(0.0, 0.0);\n    result += mat4(0.34041, 0.499, 0.15234196, 0.21353458, -0.2732667, -0.049950935, 0.03550811, -0.21051687, 0.2609023, 0.016438454, -0.29874632, 0.37994128, 0.049288407, -0.31126305, 0.029235512, -0.012256015) * go_0(0.0, 1.0);\n    result += mat4(-0.0046853204, 0.15391374, -0.040689662, 0.20186873, -0.08137621, 0.35905558, 0.23733845, 0.21794793, -0.066420384, 0.029600656, -0.31421044, -0.050773863, -0.06260773, 0.04634221, -0.10948491, -0.045498934) * go_0(1.0, -1.0);\n    result += mat4(-0.082953, -0.025837064, -0.09928303, -0.14300232, 0.275064, 0.07793617, 0.22240888, 0.06637834, -0.4382666, -0.2932182, -0.27243167, -0.14221182, 0.5695728, 0.20719238, 0.5575927, 0.40816882) * go_0(1.0, 0.0);\n    result += mat4(-0.18510929, -0.15052167, 0.25277212, 0.06804461, 0.016387, 0.20310035, 0.2903229, -0.0615877, -0.28987274, -0.11942605, 0.013498961, 0.3184152, 0.29543474, -0.042830903, -0.018111207, -0.13263674) * go_0(1.0, 1.0);\n    result += mat4(0.25749087, 0.0053866603, -0.09391162, -0.06129529, -0.094091184, -0.07419633, 0.0013858611, 0.012000353, -0.062903, -0.0204224, -0.12113313, 0.017942557, -0.073379934, 0.052201986, 0.35864577, 0.023564404) * go_1(-1.0, -1.0);\n    result += mat4(0.100115694, 0.19451359, 0.23252094, 0.19506809, -0.12470779, 0.0027281935, -0.17488572, -0.018721964, -0.15159339, 0.18457152, 0.057712987, -0.08191495, 0.19735703, 0.07326743, -0.28563106, 0.01642815) * go_1(-1.0, 0.0);\n    result += mat4(0.068062514, 0.28356665, 0.07377898, 0.42776972, 0.28725025, -0.13045293, -0.17525704, -0.05885591, -0.16676305, -0.2555945, -0.10078422, -0.053032875, 0.084470876, 0.06460686, 0.13824362, -0.05231353) * go_1(-1.0, 1.0);\n    result += mat4(0.22637829, -0.028969254, 0.1968254, -0.13331996, 0.038017053, -0.008854481, -0.2031639, 0.09237089, -0.3821112, 0.1108527, -0.11029933, -0.24542028, 0.22416145, -0.031492114, -0.19144306, -0.0996271) * go_1(0.0, -1.0);\n    result += mat4(0.10776744, 0.16363445, 0.14656505, -0.3737814, -0.06642015, 0.5616549, -0.008412252, -0.37266847, 0.12506576, -0.15329036, 0.037538245, -0.10810259, 0.01706349, 0.1813702, 0.035651788, -0.012786579) * go_1(0.0, 0.0);\n    result += mat4(-0.4023338, -0.2098614, -0.18285121, -0.02727653, 0.26107362, 0.041306913, -0.036515504, -0.045217298, -0.39958602, -0.21229339, -0.021053292, -0.13427502, 0.36178818, 0.20934913, 0.1500852, 0.2634554) * go_1(0.0, 1.0);\n    result += mat4(0.07794611, -0.25937587, -0.06822529, -0.056336135, 0.094220124, 0.21588847, -0.0455218, -0.10968329, -0.08068449, -0.31366697, 0.07799637, 0.24252681, 0.23963861, 0.13715535, 0.010329345, 0.09094301) * go_1(1.0, -1.0);\n    result += mat4(-0.20975718, -0.12550138, 0.14453574, -0.0020878632, -0.07153068, 0.3249998, -0.056577377, 0.18166828, 0.37204072, 0.17018336, 0.3752895, 0.32178587, 0.2571982, -0.27258632, -0.25971004, -0.40536007) * go_1(1.0, 0.0);\n    result += mat4(-0.3243907, -0.06300621, -0.09398436, -0.19549188, 0.14906861, 0.061537784, -0.055284478, 0.11281728, 0.12964857, 0.09979093, -0.1810159, -0.4104283, 0.05807971, -0.056371246, 0.08072554, 0.18479007) * go_1(1.0, 1.0);\n    result += vec4(-0.048888464, -0.0561434, 0.030690912, -0.030496685);\n    return result;\n}\n//!DESC Anime4K-v4.0-Restore-CNN-(M)-Conv-4x3x3x8\n//!HOOK MAIN\n//!BIND conv2d_4_tf\n//!SAVE conv2d_5_tf\n//!WIDTH conv2d_4_tf.w\n//!HEIGHT conv2d_4_tf.h\n//!COMPONENTS 4\n#define go_0(x_off, y_off) (max((conv2d_4_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max(-(conv2d_4_tf_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(0.15332128, 0.027258258, 0.14900503, -0.15982795, 0.17021236, -0.51046044, -0.15287271, -0.058167327, 0.51826185, -0.34817994, 0.004513167, 0.05395769, 0.1990321, -0.049979225, 0.11391989, -0.16062729) * go_0(-1.0, -1.0);\n    result += mat4(0.033682905, 0.019728886, 0.19931756, 0.17381927, 0.2585768, -0.2124572, -0.014632459, 0.39779893, -0.1146207, -0.2396625, 0.08960277, 0.38345298, 0.25497693, 0.11692859, -0.14207517, 0.12667973) * go_0(-1.0, 0.0);\n    result += mat4(-0.14911255, 0.08910706, 0.16136818, 0.03914566, 0.24204038, -0.03607149, -0.4571109, 0.10802461, -0.0021356856, 0.00885878, 0.22297303, 0.2367231, 0.045177583, 0.11120606, -0.009971904, -0.059262395) * go_0(-1.0, 1.0);\n    result += mat4(0.24565999, -0.2261384, 0.47373205, 0.024613412, -0.10923052, 0.039027315, -0.42707404, -0.3783373, 0.3544573, -0.5468578, -0.27599156, -0.09455918, 0.18760219, -0.19082001, 0.030565469, 0.20589156) * go_0(0.0, -1.0);\n    result += mat4(0.1973198, -0.03433863, 0.059960485, 0.045642868, 0.1819595, -0.14460869, 0.1286175, 0.2067575, -0.042632047, -0.11842967, -0.11224446, -0.18764776, -0.19563004, 0.027425969, 0.24056377, 0.5949649) * go_0(0.0, 0.0);\n    result += mat4(0.055027682, 0.16331595, -0.2608588, 0.12545955, 0.4588985, 0.03642909, 0.22187738, 0.45190734, -0.001210133, -0.057651415, -0.061199043, 0.11935476, -0.049561135, 0.27509886, 0.13778673, -0.124914035) * go_0(0.0, 1.0);\n    result += mat4(-0.02257459, 0.27705106, 0.044165276, -0.26521233, 0.05982374, -0.2824302, 0.3171142, 0.08430561, -0.10155528, 0.16182268, -0.09183147, -0.19447176, 0.3295707, -0.50616395, -0.036964044, 0.23166709) * go_0(1.0, -1.0);\n    result += mat4(-0.0232342, 0.07299799, -0.18038079, -0.13672702, -0.108305976, 0.15024792, -0.19531927, 0.0870979, -0.26488534, 0.19481428, 0.10737945, -0.14573483, -0.33094683, 0.24155116, -0.09850332, 0.2797003) * go_0(1.0, 0.0);\n    result += mat4(-0.24089853, 0.19506595, 0.4799156, -0.058313113, 0.36212957, -0.44844806, 0.23864488, 0.15477742, -0.07795971, -0.0033861927, -0.11216164, 0.033454563, -0.25893036, 0.23793478, -0.15769425, -0.00033481256) * go_0(1.0, 1.0);\n    result += mat4(0.05772507, -0.1640253, -0.13499664, -0.20460358, -0.024399966, 0.14966168, -0.090857334, -0.039677754, 0.00036956606, -0.24236615, -0.053542696, -0.0049544116, 0.026651502, 0.39019194, -0.2742246, -0.061242323) * go_1(-1.0, -1.0);\n    result += mat4(-0.016323274, -0.036179908, 0.029965919, 0.11151491, -0.00016685206, -0.29573023, 0.17996423, -0.20145437, 0.1324275, -0.18442132, -0.24618152, 0.061780427, -0.02770517, 0.28452995, 0.39804098, -0.1174389) * go_1(-1.0, 0.0);\n    result += mat4(-0.025068847, -0.053328387, -0.27053785, 0.26866457, -0.09866204, 0.057677213, 0.01850112, -0.18014707, -0.13319959, -0.14411181, -0.26355243, -0.022209354, -0.05062645, -0.036771543, 0.13294417, -0.18458557) * go_1(-1.0, 1.0);\n    result += mat4(-0.046194963, 0.038230438, -0.08993043, -0.07236354, 0.11031123, -0.16504908, -0.09517036, -0.16459833, -0.5279925, 0.12686682, -0.05726125, 0.055361677, 0.31593755, 0.027328093, 0.001839602, 0.30581662) * go_1(0.0, -1.0);\n    result += mat4(0.08608678, 0.03168437, 0.007713377, -0.26140293, -0.1268983, 0.13395861, -0.069848835, -0.24080403, 0.018839337, -0.049821075, -0.21461345, -0.14168301, -0.0872339, 0.47096667, 0.022512507, 0.14860632) * go_1(0.0, 0.0);\n    result += mat4(0.06293673, 0.22462969, 0.045494985, 0.021673543, 0.18227446, -0.2956555, 0.08010543, -0.01919729, -0.012190269, 0.241983, -0.046537094, -0.40094566, -0.3853647, 0.1081711, -0.16926058, 0.16138376) * go_1(0.0, 1.0);\n    result += mat4(-0.14854589, -0.17625804, -0.10849075, 0.221543, 0.099971965, 0.13901573, 0.29464146, 0.020068526, 0.054358527, -0.10351705, -0.0062914286, 0.24127026, -0.16914125, 0.12729423, -0.18377453, -0.6452375) * go_1(1.0, -1.0);\n    result += mat4(0.12603393, -0.10986093, 0.2314103, 0.16915044, -0.13619255, -0.09349073, 0.20594226, -0.34507084, 0.19077192, 0.052500796, 0.07185645, 0.029082738, -0.015576321, 0.08254907, -0.5501743, -0.38495848) * go_1(1.0, 0.0);\n    result += mat4(0.09300796, -0.079218306, 0.46825135, -0.08735625, 0.06321122, 0.16234867, 0.042932414, -0.013057422, 0.09697148, 0.23457524, 0.19417483, -0.16804664, 0.18379296, 0.17770062, -0.050235, -0.059676602) * go_1(1.0, 1.0);\n    result += vec4(0.011169491, 0.032399546, 0.138099, 0.023857072);\n    return result;\n}\n//!DESC Anime4K-v4.0-Restore-CNN-(M)-Conv-4x3x3x8\n//!HOOK MAIN\n//!BIND conv2d_5_tf\n//!SAVE conv2d_6_tf\n//!WIDTH conv2d_5_tf.w\n//!HEIGHT conv2d_5_tf.h\n//!COMPONENTS 4\n#define go_0(x_off, y_off) (max((conv2d_5_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max(-(conv2d_5_tf_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(-0.22753362, -0.08612073, 0.33140692, 0.08699529, -0.18788953, -0.056579117, -0.12905197, -0.06694621, 0.054559365, 0.15031597, -0.13430363, 0.021646025, 0.14884405, -0.0694291, 0.26149413, 0.11270503) * go_0(-1.0, -1.0);\n    result += mat4(0.17876762, -0.09637848, 0.11285323, 0.2004893, 0.1317187, -0.036162686, 0.17958368, -0.069625, 0.28760737, -0.12505141, 0.12760694, 0.047717955, -0.16811855, -0.16340709, 0.13278298, -0.08403954) * go_0(-1.0, 0.0);\n    result += mat4(-0.21917523, 0.079711854, -0.28642535, 0.2822416, 0.03001489, -0.014772918, -0.3487396, 0.10597145, -0.013841082, 0.17034237, 0.10810282, -0.08089695, -0.22184245, -0.59067357, 0.44113398, 0.13045649) * go_0(-1.0, 1.0);\n    result += mat4(-0.29906932, 0.013923749, 0.2031124, -0.11846688, -0.13953634, 0.08003455, -0.10164494, -0.21218559, 0.10563715, 0.31033117, -0.075903505, 0.047310907, -0.37824214, -0.14506383, 0.11866701, -0.21384487) * go_0(0.0, -1.0);\n    result += mat4(-0.1353849, 0.19258606, 0.063908584, -0.2043788, 0.27244982, 0.1665306, -0.29357895, -0.22441709, 0.18514316, -0.17840464, 0.20986097, 0.14351055, -0.057732623, 0.42166704, -0.23182064, -0.4957248) * go_0(0.0, 0.0);\n    result += mat4(-0.34830126, 0.109066755, -0.28285867, -0.048280068, -0.12290918, 0.04291651, -0.047484186, -0.03702595, 0.23047262, 0.09398974, 0.022467108, 0.08271034, 0.3066665, -0.54077, 0.057771873, 0.23194093) * go_0(0.0, 1.0);\n    result += mat4(-0.17731948, -0.3175927, 0.1452728, 0.09396786, -0.16433562, -0.01833653, -0.22345604, -0.04161193, -0.14827462, 0.18544114, -0.15544125, -0.06179007, 0.16989979, -0.20985202, 0.16391534, -0.09447268) * go_0(1.0, -1.0);\n    result += mat4(-0.053878862, -0.21034616, 0.023831524, 0.19772215, 0.31647214, 0.0126534775, -0.19130844, -0.049282108, -0.21446131, 0.067189045, 0.09117449, -0.25548774, 0.12109098, 0.22009392, -0.3924665, -0.13340388) * go_0(1.0, 0.0);\n    result += mat4(-0.16096684, -0.18495405, 0.10410178, 0.0015673033, -0.00183498, -0.044303037, -0.062745355, -0.090802394, 0.043269135, 0.06924481, -0.21367405, -0.14619029, 0.11555763, -0.20292862, 0.5799557, 0.14739846) * go_0(1.0, 1.0);\n    result += mat4(-0.21030277, -0.09578802, 0.013482288, -0.21484336, 0.12995781, 0.40431052, -0.3347856, -0.18183486, 0.15550353, -0.04402301, 0.4603779, 0.14874357, -0.07694621, -0.053523075, -0.19607326, -0.10850742) * go_1(-1.0, -1.0);\n    result += mat4(-0.2347211, 0.2697403, -0.0634794, -0.17925987, 0.17231455, 0.24999185, -0.5208536, -0.10491828, -0.233575, 0.52950364, 0.0038063182, -0.1380038, 0.022935199, 0.19369157, 0.14586553, 0.1938704) * go_1(-1.0, 0.0);\n    result += mat4(-0.10245223, 0.34150192, 0.25862157, -0.20165509, 0.5597771, 0.114510864, -0.122526556, -0.04010975, 0.1704679, -0.23335956, -0.16771887, -0.03783455, -0.056995615, 0.24153493, -0.08082429, -0.24210933) * go_1(-1.0, 1.0);\n    result += mat4(-0.103466526, 0.15278348, -0.30526164, -0.080755696, 0.103505425, 0.15862796, 0.14696524, -0.008358076, -0.09180311, -0.12505089, 0.28052542, -0.13551563, 0.07528779, -0.09636086, -0.10369617, 0.23656134) * go_1(0.0, -1.0);\n    result += mat4(-0.25752836, 0.099439755, -0.30716348, 0.035077725, 0.023509016, 0.23106368, 0.05277125, 0.34910464, 0.088015385, 0.26995596, 0.1390645, -0.40671825, 0.18096298, -0.100688554, 0.5492049, 0.2482101) * go_1(0.0, 0.0);\n    result += mat4(0.41411775, -0.107200556, -0.13813478, 0.13768874, 0.27137747, 0.06313619, -0.08522967, 0.03218302, -0.03166121, -0.3415683, -0.52242, -0.1741813, -0.36956537, 0.179129, -0.09742935, -0.11696616) * go_1(0.0, 1.0);\n    result += mat4(-0.07975504, 0.17964838, 0.37122533, 0.16064765, 0.14309953, 0.29473078, 0.0926391, -0.22333665, 0.34612748, -0.3387473, 0.0077308523, -0.07239449, 0.18522519, -0.21297298, 0.11493978, 0.16117814) * go_1(1.0, -1.0);\n    result += mat4(-0.17402779, 0.10023144, 0.11712206, 0.031971734, 0.18713303, 0.08736295, 0.013007052, -0.06943139, -0.20102951, -0.010721135, -0.2562522, 0.34877458, -0.13732676, -0.40258047, 0.25824392, 0.15720639) * go_1(1.0, 0.0);\n    result += mat4(0.044494305, 0.3296108, 0.0017603852, 0.09362289, 0.38839245, 0.40015858, -0.13395199, -0.044521853, -0.56266373, 0.251378, 0.5005789, -0.13106057, -0.18491416, -0.046887, 0.067797676, -0.14694957) * go_1(1.0, 1.0);\n    result += vec4(0.013687534, -0.08185164, -0.04755438, 0.290178);\n    return result;\n}\n//!DESC Anime4K-v4.0-Restore-CNN-(M)-Conv-3x1x1x56\n//!HOOK MAIN\n//!BIND MAIN\n//!BIND conv2d_tf\n//!BIND conv2d_1_tf\n//!BIND conv2d_2_tf\n//!BIND conv2d_3_tf\n//!BIND conv2d_4_tf\n//!BIND conv2d_5_tf\n//!BIND conv2d_6_tf\n//!SAVE MAIN\n//!WIDTH conv2d_tf.w\n//!HEIGHT conv2d_tf.h\n#define g_0 (max((conv2d_tf_tex(conv2d_tf_pos)), 0.0))\n#define g_1 (max(-(conv2d_tf_tex(conv2d_tf_pos)), 0.0))\n#define g_2 (max((conv2d_1_tf_tex(conv2d_1_tf_pos)), 0.0))\n#define g_3 (max(-(conv2d_1_tf_tex(conv2d_1_tf_pos)), 0.0))\n#define g_4 (max((conv2d_2_tf_tex(conv2d_2_tf_pos)), 0.0))\n#define g_5 (max(-(conv2d_2_tf_tex(conv2d_2_tf_pos)), 0.0))\n#define g_6 (max((conv2d_3_tf_tex(conv2d_3_tf_pos)), 0.0))\n#define g_7 (max(-(conv2d_3_tf_tex(conv2d_3_tf_pos)), 0.0))\n#define g_8 (max((conv2d_4_tf_tex(conv2d_4_tf_pos)), 0.0))\n#define g_9 (max(-(conv2d_4_tf_tex(conv2d_4_tf_pos)), 0.0))\n#define g_10 (max((conv2d_5_tf_tex(conv2d_5_tf_pos)), 0.0))\n#define g_11 (max(-(conv2d_5_tf_tex(conv2d_5_tf_pos)), 0.0))\n#define g_12 (max((conv2d_6_tf_tex(conv2d_6_tf_pos)), 0.0))\n#define g_13 (max(-(conv2d_6_tf_tex(conv2d_6_tf_pos)), 0.0))\nvec4 hook() {\n    vec4 result = mat4(-0.08837163, -0.065234736, -0.034704313, 0.0, 0.021405501, 0.013663729, 0.019249594, 0.0, 0.05328863, 0.03580334, 0.046457592, 0.0, -0.12216048, 0.022547891, 0.016400825, 0.0) * g_0;\n    result += mat4(0.061996464, 0.05631466, 0.06808407, 0.0, -0.005013109, -0.0044589997, -0.032367796, 0.0, 0.016481603, 0.13721058, 0.14924648, 0.0, 0.020035887, -0.07250003, -0.08034037, 0.0) * g_1;\n    result += mat4(0.24078514, 0.081361525, 0.053420708, 0.0, -0.009353794, -0.051077116, -0.058007747, 0.0, -0.14071098, 0.01035966, 0.005308949, 0.0, -0.1489842, -0.06711817, -0.05552926, 0.0) * g_2;\n    result += mat4(-0.13002375, 0.012733757, 0.017821986, 0.0, 0.17767483, 0.20204604, 0.1751779, 0.0, 0.12804912, 0.07381453, 0.05655911, 0.0, 0.17044514, 0.07301451, 0.06523978, 0.0) * g_3;\n    result += mat4(-0.1170986, -0.05130371, -0.027939914, 0.0, -0.16645707, -0.121526904, -0.09471366, 0.0, -0.04143118, 0.026693767, 0.034615446, 0.0, -0.084318705, -0.064990036, -0.054324172, 0.0) * g_4;\n    result += mat4(0.12094524, 0.09518409, 0.07387219, 0.0, 0.062216382, 0.053228356, 0.031372335, 0.0, 0.072797105, 0.026258165, 0.009804673, 0.0, 0.120719045, 0.073281154, 0.056623302, 0.0) * g_5;\n    result += mat4(-0.11141495, -0.11566289, -0.10398725, 0.0, -0.0651895, -0.06820691, -0.054204144, 0.0, -0.032746475, -0.008849683, -0.007610222, 0.0, -0.024655705, -0.048778858, -0.041144755, 0.0) * g_6;\n    result += mat4(0.058090195, 0.07538767, 0.059722915, 0.0, 0.044788487, 0.04212742, 0.027502589, 0.0, 0.04892866, 0.015416752, 0.008312418, 0.0, -0.011864114, -0.0074752793, -0.0060824654, 0.0) * g_7;\n    result += mat4(0.043446552, 0.061971307, 0.05758086, 0.0, -0.06379154, -0.053758245, -0.047204215, 0.0, 0.016307736, 0.03423424, 0.030179083, 0.0, 0.041445345, 0.03843772, 0.033059113, 0.0) * g_8;\n    result += mat4(-0.003803544, 0.0008906116, -0.00059585314, 0.0, 0.102071285, 0.11485224, 0.10007254, 0.0, -0.074306004, -0.08803551, -0.07972321, 0.0, -0.030704215, -0.021514274, -0.009049376, 0.0) * g_9;\n    result += mat4(0.0066058086, 0.0011408008, 0.0016199006, 0.0, -0.03916473, -0.042929266, -0.04018418, 0.0, -0.03153446, -0.039413508, -0.034767237, 0.0, 0.113516055, 0.12577052, 0.113335624, 0.0) * g_10;\n    result += mat4(0.02655948, 0.041905303, 0.03861737, 0.0, 0.048471425, 0.049788587, 0.050447535, 0.0, 0.12092813, 0.13564217, 0.12613249, 0.0, -0.0023508538, 0.0012828974, 0.0028730957, 0.0) * g_11;\n    result += mat4(0.0084758485, 0.008800083, 0.008206044, 0.0, -0.056123603, -0.06610845, -0.060320783, 0.0, -0.081793964, -0.101638645, -0.096699014, 0.0, -0.04402356, -0.04177539, -0.03829645, 0.0) * g_12;\n    result += mat4(0.10676299, 0.118409514, 0.10618478, 0.0, -0.05880252, -0.06488367, -0.06432695, 0.0, 0.019221924, 0.017602798, 0.017413978, 0.0, -0.07512528, -0.080483615, -0.066218294, 0.0) * g_13;\n    result += vec4(-0.010478934, -0.008364784, -0.010246552, 0.0);\n    return result + MAIN_tex(MAIN_pos);\n}\n"
  },
  {
    "path": "assets/shaders/Anime4K_Restore_CNN_S.glsl",
    "content": "// MIT License\n\n// Copyright (c) 2019-2021 bloc97\n// All rights reserved.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n//!DESC Anime4K-v4.0-Restore-CNN-(S)-Conv-4x3x3x3\n//!HOOK MAIN\n//!BIND MAIN\n//!SAVE conv2d_tf\n//!WIDTH MAIN.w\n//!HEIGHT MAIN.h\n//!COMPONENTS 4\n#define go_0(x_off, y_off) (MAIN_texOff(vec2(x_off, y_off)))\nvec4 hook() {\n    vec4 result = mat4(-0.19288683, -0.21397883, 0.111997396, -0.04791413, -0.26682988, -0.06144587, -0.03601853, -0.16693151, 0.038494494, -0.16651472, 0.147657, -0.083003886, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, -1.0);\n    result += mat4(-0.14286195, 0.08746566, -0.40107322, 0.12390977, -0.33392772, -0.18703035, -0.21326795, 0.04780781, -0.15155545, -0.0010025925, -0.1554875, -0.10676251, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, 0.0);\n    result += mat4(0.28095165, 0.022872915, -0.21342312, -0.29982176, 0.025937587, -0.055012174, -0.33779636, 0.0015666655, 0.076416336, 0.06656033, -0.1557806, 0.1078894, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, 1.0);\n    result += mat4(-0.31584853, 0.07527119, 0.30713862, -0.34014285, -0.50103146, -0.07217874, 0.512807, -0.09597398, -0.32097813, -0.051580857, -0.022466356, 0.01148551, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, -1.0);\n    result += mat4(-0.026032459, -0.04193211, 0.37703893, -0.031916667, -0.27421117, 1.0906446, -0.049654085, -0.19814016, 0.07819544, 0.06003738, 0.1405805, -0.0064135445, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, 0.0);\n    result += mat4(0.041450135, 0.11319654, -0.23237701, 0.08443178, 0.53344345, 0.30857387, -0.057264958, -0.1575803, 0.2325609, -0.027797326, -0.04544767, -0.18720597, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, 1.0);\n    result += mat4(0.2531829, -0.074966915, -0.27800754, -0.3146097, 0.20126024, -0.5380133, -0.15082566, -0.19021043, 0.29951036, 0.17123336, -0.01681872, -0.12574998, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, -1.0);\n    result += mat4(0.25203633, 0.19882993, 0.14906439, 0.13593598, 0.40712556, 0.084902965, 0.42969635, 0.2961132, -0.057267334, -0.030388135, 8.8084314e-05, 0.0210724, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, 0.0);\n    result += mat4(-0.13459359, -0.12199573, 0.12591946, 0.24736497, 0.2033463, -0.09388599, -0.094370656, 0.1071285, -0.18479438, -0.066625565, 0.08279283, 0.20130983, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, 1.0);\n    result += vec4(-0.011108127, -0.07481861, 0.07640154, 0.4964964);\n    return result;\n}\n//!DESC Anime4K-v4.0-Restore-CNN-(S)-Conv-4x3x3x8\n//!HOOK MAIN\n//!BIND conv2d_tf\n//!SAVE conv2d_1_tf\n//!WIDTH conv2d_tf.w\n//!HEIGHT conv2d_tf.h\n//!COMPONENTS 4\n#define go_0(x_off, y_off) (max((conv2d_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max(-(conv2d_tf_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(-0.056432575, 0.0028165397, -0.026325442, -0.14802271, 0.16885762, -0.062179096, -0.2332292, 0.17513658, -0.08011296, 0.02947316, 0.014771492, -0.17946689, 0.026012989, -0.09823925, 0.036625937, -0.06924322) * go_0(-1.0, -1.0);\n    result += mat4(-0.13571467, 0.09831142, 0.12911566, 0.06305893, -0.07188695, -0.20161287, 0.3858435, -0.21069056, -0.12294444, -0.1404628, -0.022659872, 0.23008968, 0.10969853, 0.17640765, 0.39796907, 0.20413099) * go_0(-1.0, 0.0);\n    result += mat4(-0.0061665224, 0.055102807, -0.0059629944, -0.021429887, 0.061626043, 0.16898955, -0.21215646, 0.16510476, 0.2238265, 0.19429931, 0.09874656, 0.06828208, -0.122404456, -0.00026717107, -0.28203064, -0.29979932) * go_0(-1.0, 1.0);\n    result += mat4(-0.22735378, 0.14538136, 0.11549746, 0.194148, -0.09841722, -0.0661309, 0.348576, -0.017375294, -0.044078812, 0.1298332, 0.04793373, -0.30687734, 0.08353025, 0.083519086, 0.10766399, 0.31796935) * go_0(0.0, -1.0);\n    result += mat4(0.048365135, -0.17566709, -0.33212858, -0.052667376, -0.26443407, -0.010216014, 0.1573303, 0.05725314, 0.08140953, -0.09664591, 0.076109104, -0.026773714, 0.07732627, 0.10188082, -0.28266954, -0.16230233) * go_0(0.0, 0.0);\n    result += mat4(0.29931107, 0.117944, -0.10414009, 0.12795551, 0.12576093, 0.17082554, -0.15803693, 0.13430743, -0.025801308, -0.10797019, 0.0721032, 0.2825884, -0.11025257, 0.12798019, 0.081827976, -0.050441865) * go_0(0.0, 1.0);\n    result += mat4(-0.11827391, 0.08306765, -0.3430314, 0.07898041, -0.023839617, -0.019507334, 0.23176382, -0.40992323, 0.09411734, 0.38415068, -0.25845516, -0.29984522, 0.1470966, -0.0684779, -0.07071314, -0.026773235) * go_0(1.0, -1.0);\n    result += mat4(0.19091596, 0.082110435, -0.5266589, -0.1744098, -0.015838385, -0.046316292, 0.023171103, -0.03731331, 0.2642396, 0.31824252, -0.041754793, -0.09525519, -0.14696182, 0.052168854, 0.039857205, -0.027555354) * go_0(1.0, 0.0);\n    result += mat4(0.15207373, 0.09845733, 0.0142631065, 0.096375965, 0.06089903, 0.17902578, -0.42391995, 0.22475442, 0.016356342, -0.06277531, -0.12173141, -0.18635495, -0.0013459618, 0.15725887, 0.019310836, 0.20293565) * go_0(1.0, 1.0);\n    result += mat4(-0.18395247, 0.30672902, 0.09034339, 0.1821889, -0.0419004, -0.2169228, -0.14052129, 0.11006559, 0.1709272, 0.51062274, 0.13758625, -0.2242552, -0.030382963, 0.3357568, -0.26491287, 0.02501938) * go_1(-1.0, -1.0);\n    result += mat4(0.040511727, 0.12523083, -0.27318433, 0.08388512, 0.25354835, 0.3404216, -0.2632471, -0.17784123, 0.2732347, 0.4468553, 0.084667034, -0.1856242, 0.034099877, -0.00954992, -0.32751867, -0.062207516) * go_1(-1.0, 0.0);\n    result += mat4(0.17564747, 0.11645554, -0.16362113, 0.105654195, -0.2762563, -0.1413764, 0.23264363, -0.14000498, 0.095402054, 0.0715738, -0.19346157, -0.028285999, 0.009799127, 0.04059529, 0.19688335, 0.1282381) * go_1(-1.0, 1.0);\n    result += mat4(0.23575781, -0.11446148, -0.20504695, 0.035568226, 0.36890212, -0.85968876, -0.18545328, 0.33796397, -0.30916876, -0.10445518, -0.3046253, 0.33271998, -0.06263589, -0.2160114, -0.16383372, -0.31173357) * go_1(0.0, -1.0);\n    result += mat4(0.20469664, 0.4039374, -0.070057206, 0.030353077, 0.39843914, -0.15490077, -0.24476516, 0.38238233, -0.21809858, 0.23496576, -0.051794037, 0.033664484, -0.14411364, -0.2515329, 0.124655396, -0.05818785) * go_1(0.0, 0.0);\n    result += mat4(-0.09065731, -0.16787091, 0.013269188, 0.23687351, -0.41504318, -0.048163068, 0.31760025, -0.33648986, 0.29752317, 0.2926866, 0.14408836, -0.33382463, -0.15873958, -0.121961035, 0.11797893, 0.09000567) * go_1(0.0, 1.0);\n    result += mat4(0.13356976, 0.013763947, 0.012169505, -0.109594524, 0.03417223, 0.7031121, 0.65146804, 0.5250268, -0.50132495, -0.419648, 0.2940041, 0.83051753, -0.17595838, 0.1633008, -0.018587278, 0.079596795) * go_1(1.0, -1.0);\n    result += mat4(0.07570128, -0.1581438, 0.03904949, 0.14890033, -0.054611947, 0.17469402, -0.44252598, 0.036181703, -0.4981031, -0.37507218, -0.18466389, 0.2645845, 0.25189674, -0.025896115, 0.034307647, -0.020462232) * go_1(1.0, 0.0);\n    result += mat4(-0.11645865, 0.02296537, 0.040909223, 0.015069485, 0.062284566, -0.22526766, 0.09241534, -0.32623053, 0.18208642, 0.3954284, 0.2884468, -0.25137675, -0.037232924, -0.10185309, -0.17956531, 0.018966453) * go_1(1.0, 1.0);\n    result += vec4(-0.16371979, -0.024620198, -0.035754893, 0.04176776);\n    return result;\n}\n//!DESC Anime4K-v4.0-Restore-CNN-(S)-Conv-4x3x3x8\n//!HOOK MAIN\n//!BIND conv2d_1_tf\n//!SAVE conv2d_2_tf\n//!WIDTH conv2d_1_tf.w\n//!HEIGHT conv2d_1_tf.h\n//!COMPONENTS 4\n#define go_0(x_off, y_off) (max((conv2d_1_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max(-(conv2d_1_tf_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(0.01921286, -0.26684764, -0.12663573, 0.31641877, -0.25313398, 0.12264074, 0.58750325, -0.14084283, 0.5837018, -0.042300556, -0.20435576, -0.009954825, 0.060783498, 0.05540401, 0.2205112, -0.06578902) * go_0(-1.0, -1.0);\n    result += mat4(-0.21930243, -0.03774968, 0.22615197, 0.18338196, 0.011201461, -0.271034, 0.00573116, -0.12248194, 0.47990513, 0.2982416, -0.1087603, -0.050099242, -0.07620939, -0.07148229, 0.03691984, -0.16796488) * go_0(-1.0, 0.0);\n    result += mat4(-0.14962853, -0.053769328, 0.02387081, 0.22002189, 0.052237745, -0.26160842, -0.08603077, 0.012542448, 0.08119985, 0.075785555, -0.33437458, -0.43373227, -0.13206963, -0.08759176, -0.03288923, -0.09799959) * go_0(-1.0, 1.0);\n    result += mat4(-0.1305593, -0.5974288, 0.06058367, 0.08406488, 0.013692483, 0.06646377, 0.16469325, 0.08990975, 0.42217395, -0.11289523, -0.06165009, 0.48556912, -0.15702641, -0.19922857, -0.0035429662, -0.0022089656) * go_0(0.0, -1.0);\n    result += mat4(-0.1964807, 0.038099788, 0.21587034, 0.039734077, -0.07063389, 0.11604167, -0.24558097, -0.08900199, -0.7684516, -0.1037487, -0.09380674, 0.33144563, -0.16653742, 0.0028585843, -0.33774406, -0.0528696) * go_0(0.0, 0.0);\n    result += mat4(-0.27298656, -0.05665099, 0.09661685, 0.19780266, 0.1025106, -0.22055034, -0.21218458, -0.040628925, 0.0095010325, 0.13118382, -0.42582452, -0.22197723, 0.21006055, -0.06189587, -0.15285942, -0.09526762) * go_0(0.0, 1.0);\n    result += mat4(-0.14494462, -0.046788953, 0.065877035, 0.09911713, 0.35096622, 0.16682479, 0.028363144, 0.36037162, 0.29413632, 0.28212717, -0.025364442, -0.3406269, 0.047262143, -0.11892685, -0.008032766, 0.29743317) * go_0(1.0, -1.0);\n    result += mat4(-0.15191558, -0.36980554, 0.14555687, 0.0043930537, -0.012661432, 0.15737776, -0.115250416, 0.10324491, 0.24491951, -0.15575431, -0.27802598, 0.21959937, 0.18063772, 0.4455559, -0.09693302, 0.33382267) * go_0(1.0, 0.0);\n    result += mat4(0.2717801, 0.13452889, 0.14105384, 0.16324317, -0.40111846, 0.1154301, -0.0076733204, -0.09697362, 0.44306824, -0.02831414, -0.2153124, -0.12075326, 0.060776163, 0.30347148, -0.0036976219, -0.12070682) * go_0(1.0, 1.0);\n    result += mat4(-0.39780128, -0.29875937, -0.12952097, 0.080333896, 0.07520163, 0.021689568, -0.23121156, -0.038140096, -0.1593877, 0.017156163, -0.06038025, 0.009244022, -0.13917233, 0.30957314, 0.243109, -0.104947075) * go_1(-1.0, -1.0);\n    result += mat4(-0.07965157, 0.06776501, -0.13288979, 0.005851189, -0.08768168, -0.03689969, 0.12034646, 0.22441491, 0.14453568, -0.17648841, -0.3378289, -0.018329712, 0.11722939, -0.34161824, 0.08424494, -0.01400687) * go_1(-1.0, 0.0);\n    result += mat4(0.08153887, 0.07222914, -0.14663404, -0.038526025, -0.07385973, 0.18440577, 0.35890242, 0.17084727, 0.26345527, 0.15280858, -0.007446105, -0.024403179, -0.30336383, -0.22978698, 0.11612946, -0.23614909) * go_1(-1.0, 1.0);\n    result += mat4(-0.07447396, 0.09023449, -0.13798, -0.086943336, -0.30787337, 0.15087669, 0.14418626, -0.03371195, 0.048989657, -0.13075387, -0.13458036, -0.059836224, 0.06495196, 0.269715, 0.3674355, 0.38956037) * go_1(0.0, -1.0);\n    result += mat4(0.34981915, -0.048779126, 0.31717536, 0.38080826, -0.20149232, -0.82969636, -0.10167862, 0.6382858, 0.25976858, 0.4370118, -0.04724865, -0.10014156, 0.19380626, -0.080370255, 0.09578106, -0.035166856) * go_1(0.0, 0.0);\n    result += mat4(-0.026443917, 0.4132611, 0.01822534, 0.12742202, -0.26652107, -0.2996705, 0.30905882, 0.07989903, 0.38249823, 0.21486135, 0.025314959, -0.14717339, -0.13344015, -0.32088286, -0.2833883, -0.30973712) * go_1(0.0, 1.0);\n    result += mat4(0.021517841, 0.006556378, 0.2025686, -0.12044382, -0.38583103, -0.0027515136, -0.06556736, -0.097090125, 0.04676486, -0.11954886, -0.051612873, 0.07831412, -0.18823163, -0.16542958, 0.04245155, 0.6437998) * go_1(1.0, -1.0);\n    result += mat4(-0.39475346, -0.2936861, 0.26768062, -0.28151843, 0.21935691, 0.2101108, -0.15455097, 0.19548604, 0.09188909, -0.020147726, 0.103328265, -0.12574542, -0.34167948, 0.07523185, -0.17669058, 0.62446547) * go_1(1.0, 0.0);\n    result += mat4(-0.37661025, -0.29630858, 0.05451026, 0.1611643, 0.14079669, -0.2170294, -0.038716137, 0.13514164, -0.21235192, -0.07860726, -0.005749412, 0.025625167, -0.13297133, 0.33012658, -0.27434957, -0.18416783) * go_1(1.0, 1.0);\n    result += vec4(-0.0036821906, -0.050239526, -0.01355402, 0.00048220603);\n    return result;\n}\n//!DESC Anime4K-v4.0-Restore-CNN-(S)-Conv-3x3x3x8\n//!HOOK MAIN\n//!BIND MAIN\n//!BIND conv2d_2_tf\n//!SAVE MAIN\n//!WIDTH conv2d_2_tf.w\n//!HEIGHT conv2d_2_tf.h\n#define go_0(x_off, y_off) (max((conv2d_2_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max(-(conv2d_2_tf_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(0.15873, 0.17989138, 0.14648493, 0.0, -0.017379675, -0.017363746, -0.019855022, 0.0, 0.009670625, 0.0070157526, 0.0075994316, 0.0, 0.025388412, 0.027231036, 0.024052646, 0.0) * go_0(-1.0, -1.0);\n    result += mat4(0.048195973, 0.041760173, 0.037366055, 0.0, -0.115950756, -0.12887983, -0.12535639, 0.0, 0.032125086, 0.03397254, 0.032950625, 0.0, 0.01223746, 0.020822672, 0.0161561, 0.0) * go_0(-1.0, 0.0);\n    result += mat4(0.0890567, 0.094453335, 0.09014035, 0.0, 0.016081346, 0.017434116, 0.020783134, 0.0, -0.011775135, -0.010094134, -0.018522855, 0.0, 0.072103254, 0.07940666, 0.065876864, 0.0) * go_0(-1.0, 1.0);\n    result += mat4(-0.04841196, -0.06963968, -0.056574684, 0.0, 0.10912542, 0.11813441, 0.10643838, 0.0, -0.013013885, -0.01562045, -0.013802797, 0.0, 0.037505716, 0.04352026, 0.04645123, 0.0) * go_0(0.0, -1.0);\n    result += mat4(-0.3472869, -0.36243078, -0.33530185, 0.0, 0.23654196, 0.2305048, 0.22150646, 0.0, -0.045226905, -0.041799217, -0.042511635, 0.0, -0.10267792, -0.1123385, -0.10845448, 0.0) * go_0(0.0, 0.0);\n    result += mat4(0.011987401, 0.012285043, 0.007813165, 0.0, -0.15911353, -0.17523928, -0.1535267, 0.0, 0.15675929, 0.16531634, 0.15948962, 0.0, -0.09240023, -0.09513292, -0.084187366, 0.0) * go_0(0.0, 1.0);\n    result += mat4(0.069052905, 0.07278333, 0.0756627, 0.0, -0.012180326, -0.018794727, -0.031050753, 0.0, -0.044663202, -0.04362803, -0.038904265, 0.0, -0.008540197, -0.011201734, -0.01556625, 0.0) * go_0(1.0, -1.0);\n    result += mat4(-0.08261173, -0.09042543, -0.07589266, 0.0, 0.043515377, 0.045066774, 0.04037769, 0.0, -0.06262993, -0.07469342, -0.058593787, 0.0, 0.026696987, 0.028740842, 0.037405368, 0.0) * go_0(1.0, 0.0);\n    result += mat4(0.07975598, 0.09597654, 0.08997132, 0.0, -0.07844719, -0.07880916, -0.06835411, 0.0, 0.05668995, 0.050163813, 0.053357534, 0.0, -0.020040333, -0.019867316, -0.01907621, 0.0) * go_0(1.0, 1.0);\n    result += mat4(-0.017078733, -0.017393313, -0.008266595, 0.0, -0.0033478448, -0.0027439648, -0.0042334674, 0.0, -0.06354017, -0.062058125, -0.04652064, 0.0, -0.010787706, -0.0062706997, -0.007573461, 0.0) * go_1(-1.0, -1.0);\n    result += mat4(-0.019895451, -0.016341688, -0.008712399, 0.0, 0.026231976, 0.023955572, 0.0216376, 0.0, -0.061950512, -0.05481285, -0.05261985, 0.0, -0.018804235, -0.016235247, -0.0131616965, 0.0) * go_1(-1.0, 0.0);\n    result += mat4(-0.055628926, -0.063315354, -0.057192408, 0.0, -0.0256364, -0.028660972, -0.02937357, 0.0, -0.017604912, -0.020851422, -0.016070362, 0.0, -0.0870202, -0.0832279, -0.07525406, 0.0) * go_1(-1.0, 1.0);\n    result += mat4(0.062738225, 0.07106593, 0.061644047, 0.0, -0.06068257, -0.06983662, -0.066070385, 0.0, 0.024919355, 0.03227179, 0.028569462, 0.0, -0.07866227, -0.098967604, -0.092128105, 0.0) * go_1(0.0, -1.0);\n    result += mat4(0.040397774, 0.047241107, 0.03962998, 0.0, -0.09112752, -0.10057507, -0.09301817, 0.0, 0.10833967, 0.101835825, 0.10027467, 0.0, 0.27189335, 0.27433604, 0.26781923, 0.0) * go_1(0.0, 0.0);\n    result += mat4(-0.044211388, -0.042373534, -0.03658007, 0.0, 0.113148406, 0.12423258, 0.107804194, 0.0, -0.17081551, -0.18562958, -0.17475435, 0.0, 0.09636739, 0.10763415, 0.093332425, 0.0) * go_1(0.0, 1.0);\n    result += mat4(-0.03798545, -0.047811143, -0.050768293, 0.0, 0.018775463, 0.026812987, 0.03452908, 0.0, 0.0055677597, 0.0039081173, -0.0017878668, 0.0, -0.10728597, -0.12618187, -0.109045394, 0.0) * go_1(1.0, -1.0);\n    result += mat4(0.06359783, 0.064184755, 0.04934199, 0.0, -0.009819327, -0.006616115, -0.007431496, 0.0, 0.025055679, 0.024787048, 0.017360551, 0.0, -0.047140837, -0.061695747, -0.06440822, 0.0) * go_1(1.0, 0.0);\n    result += mat4(0.060199022, 0.06482763, 0.059514645, 0.0, 0.026998974, 0.028776823, 0.024897143, 0.0, 0.17968474, 0.19337215, 0.16760105, 0.0, 0.0075838566, 0.010503482, 0.011993149, 0.0) * go_1(1.0, 1.0);\n    result += vec4(-0.0052927984, -0.0060193934, -0.0048643993, 0.0);\n    return result + MAIN_tex(MAIN_pos);\n}\n"
  },
  {
    "path": "assets/shaders/Anime4K_Restore_CNN_VL.glsl",
    "content": "// MIT License\n\n// Copyright (c) 2019-2021 bloc97\n// All rights reserved.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n//!DESC Anime4K-v4.0-Restore-CNN-(VL)-Conv-4x3x3x3\n//!HOOK MAIN\n//!BIND MAIN\n//!SAVE conv2d_tf\n//!WIDTH MAIN.w\n//!HEIGHT MAIN.h\n//!COMPONENTS 4\n#define go_0(x_off, y_off) (MAIN_texOff(vec2(x_off, y_off)))\nvec4 hook() {\n    vec4 result = mat4(0.1690102, -0.2560719, 0.39658326, -0.3679659, -0.27616683, -0.35619372, -0.3748396, 0.08430813, -0.29574734, -0.31511316, -0.09773105, 0.13616018, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, -1.0);\n    result += mat4(-0.1326393, -0.259433, 0.025070239, 0.58914864, -0.036478516, 0.30723435, 0.007458902, 0.012962684, 0.2493056, 0.13007334, -0.08448256, -0.38414413, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, 0.0);\n    result += mat4(-0.11539356, 0.35253766, 0.26143202, 0.2760807, -0.09371543, -0.028165473, -0.028452158, -0.27050856, 0.06718067, -0.0056619495, -0.17654495, 0.17288211, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, 1.0);\n    result += mat4(-0.16145481, -0.3204927, -0.54317135, 0.11830119, 0.49315026, 0.12008072, 0.50857407, -0.30382085, 0.25807253, 0.020755528, 0.29388228, 0.106109895, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, -1.0);\n    result += mat4(-0.22728722, 0.50484747, -0.07904469, 0.33114597, 0.50306976, -0.22760947, 0.14773269, 0.17628263, 0.14788547, -0.08223464, -0.10880935, -0.3151985, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, 0.0);\n    result += mat4(0.3414351, 0.057279214, -0.14419858, 0.09761111, -0.11794496, 0.021717256, -0.22750235, 0.13986664, -0.38932344, 0.28996095, 0.3773904, 0.13175532, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, 1.0);\n    result += mat4(0.1376552, -0.19587159, -0.35147396, -0.097646296, 0.1686707, -0.14385861, 0.031198, 0.12383533, -0.23089902, 0.08707301, 0.3362293, -0.100579016, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, -1.0);\n    result += mat4(-0.056774966, 0.047585852, -0.36395878, -0.20211312, 0.4077735, 0.12631284, 0.39813092, -0.033365678, 0.2307249, -0.09131807, 0.20823865, 0.31084216, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, 0.0);\n    result += mat4(-0.12456089, 0.09755632, 0.31490886, -0.06579996, -0.13386595, 0.07564795, -0.26605195, -0.075180635, -0.11182657, 0.06757017, -0.14351276, -0.16828312, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, 1.0);\n    result += vec4(-0.046043985, 0.055581126, -0.08791638, -0.13022089);\n    return result;\n}\n//!DESC Anime4K-v4.0-Restore-CNN-(VL)-Conv-4x3x3x3\n//!HOOK MAIN\n//!BIND MAIN\n//!SAVE conv2d_tf1\n//!WIDTH MAIN.w\n//!HEIGHT MAIN.h\n//!COMPONENTS 4\n#define go_0(x_off, y_off) (MAIN_texOff(vec2(x_off, y_off)))\nvec4 hook() {\n    vec4 result = mat4(-0.15485518, -0.29363206, -0.22610365, -0.14291525, -0.45240572, -0.18319772, -0.12209436, 0.15031648, 0.09878383, 0.06711082, 0.25763842, -0.084633484, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, -1.0);\n    result += mat4(-0.10204406, 0.16167697, 0.22371867, -0.37947702, -0.24476196, -0.038824454, 0.060157117, 0.15764871, -0.08072927, -0.2210841, -0.31835055, 0.009979876, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, 0.0);\n    result += mat4(0.20506924, 0.21132155, -0.0922578, -0.07430473, 0.14529926, 0.20549752, 0.0077948375, 0.13246094, -0.32353187, 0.21074104, 0.092629515, 0.17590871, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, 1.0);\n    result += mat4(0.04125819, -0.44050243, 0.23729716, 0.3218237, 0.12943116, -0.011674174, 0.10390632, 0.027775545, -0.20308031, -0.16904089, -0.2121676, -0.022515794, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, -1.0);\n    result += mat4(0.09664124, 0.20127031, 0.60345304, 0.16697013, 0.23093723, -0.38116834, 0.109695725, 0.0007595324, 0.4092646, 0.009624758, 0.11229678, 0.25326383, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, 0.0);\n    result += mat4(0.014879592, 0.19204311, 0.07102085, -0.7312604, 0.34860876, 0.3429918, -0.027331594, 0.27636307, 0.1342437, 0.107820466, -0.12645108, 0.21081445, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, 1.0);\n    result += mat4(-0.12687613, -0.09247973, -0.25973785, 0.4350873, -0.18987224, 0.028678741, -0.0903819, -0.63974863, 0.205591, 0.11308998, 0.18458389, -0.4149041, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, -1.0);\n    result += mat4(0.34691808, -0.025498383, 0.3428986, 0.21663484, 0.23404741, -0.1725327, -0.0036315925, -0.13299675, -0.1873967, 0.031331502, -0.08785591, -0.0013278709, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, 0.0);\n    result += mat4(-0.35846514, 0.048703704, -0.104165934, 0.16529736, -0.15378916, 0.26030356, -0.07134151, 0.03692383, -0.15807101, -0.18885155, 0.044707954, -0.11444462, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, 1.0);\n    result += vec4(-0.0022791293, -0.024132347, -0.57621074, 0.028573977);\n    return result;\n}\n//!DESC Anime4K-v4.0-Restore-CNN-(VL)-Conv-4x3x3x16\n//!HOOK MAIN\n//!BIND conv2d_tf\n//!BIND conv2d_tf1\n//!SAVE conv2d_1_tf\n//!WIDTH conv2d_tf.w\n//!HEIGHT conv2d_tf.h\n//!COMPONENTS 4\n#define go_0(x_off, y_off) (max((conv2d_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max((conv2d_tf1_texOff(vec2(x_off, y_off))), 0.0))\n#define go_2(x_off, y_off) (max(-(conv2d_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_3(x_off, y_off) (max(-(conv2d_tf1_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(0.010346764, 0.07230188, -0.24734616, -0.09937907, 0.02228549, -0.19550583, -0.019540425, -0.1037373, 0.033996485, -0.075554, -0.20228972, 0.07090153, -0.09194035, -0.058972966, 0.1768268, 0.27517542) * go_0(-1.0, -1.0);\n    result += mat4(0.020078976, 0.12433655, -0.1620775, 0.036401592, 0.079748705, 0.11660013, 0.17917652, -0.017513236, -0.18936846, 0.24478136, -0.45726213, -0.045004416, -0.08295188, 0.067733586, -0.080548316, 0.2744211) * go_0(-1.0, 0.0);\n    result += mat4(0.024916803, 0.27562472, 0.043771956, -0.012240604, 0.0786355, 0.042651594, 0.16049327, -0.14577515, -0.032735053, 0.17658092, 0.16382934, -0.02337374, 0.11551492, 0.056343183, -0.17930213, 0.14259394) * go_0(-1.0, 1.0);\n    result += mat4(0.20010485, 0.06747722, -0.19026905, 0.11013709, 0.13062745, -0.044626113, -0.0062261797, 0.2189639, 0.1403497, -0.022713251, -0.19452858, -0.010305412, -0.06407589, 0.09836748, 0.025805516, 0.23430973) * go_0(0.0, -1.0);\n    result += mat4(-0.14664203, 0.034910418, 0.024714258, -0.066872925, -0.15717538, -0.14179383, -0.14091893, 0.05859166, 0.18919097, -0.18544437, -0.09068573, -0.08615929, -0.051434122, 0.2170678, 0.18409058, -0.17461225) * go_0(0.0, 0.0);\n    result += mat4(-0.11354446, 0.10745854, 0.2682663, 0.05949201, -0.10695986, 0.1407851, -0.03551388, 0.10691649, -0.17148238, -0.38287184, 0.2074456, 0.11828914, 0.048535194, 0.1464864, -0.18169662, -0.14074169) * go_0(0.0, 1.0);\n    result += mat4(0.22160622, -0.1513045, -0.053284165, 0.033202525, 0.15574448, -0.043640967, -0.0093824165, -0.0019965349, -0.097964935, -0.08289824, 0.08239996, 0.07868361, 0.05731752, -0.20441617, -0.013016076, -0.253108) * go_0(1.0, -1.0);\n    result += mat4(-0.031249097, -0.2272863, 0.23573665, 0.03357689, 0.011395065, -0.10885564, -0.06287508, -0.031719524, 0.10331069, 0.17560169, 0.18303394, 0.022961004, -0.17011635, -0.24371737, 0.10678694, -0.3222825) * go_0(1.0, 0.0);\n    result += mat4(-0.1275465, -0.08844758, 0.10994917, -0.00910273, 0.09393154, 0.03894992, 0.14367905, -0.11811715, -0.09077633, -0.015776094, 0.27427456, -0.13283503, 0.18724327, -0.08139094, 0.04933602, -0.051852766) * go_0(1.0, 1.0);\n    result += mat4(-0.06764611, -0.27426586, 0.12045272, 0.09410856, -0.14258035, 0.11802992, -0.09093882, 0.0022018093, 0.4590643, 0.046258576, -0.07827223, 0.448011, -0.103631735, -0.016930219, -0.15421398, 0.11045997) * go_1(-1.0, -1.0);\n    result += mat4(-0.17295076, 0.00151352, 0.14938255, 0.08336512, -0.07496541, -0.07561223, -0.0846474, 0.14979269, -0.09142163, 0.23925088, -0.015199518, -0.37749895, -0.20636298, -0.022585187, -0.20371509, 0.0745308) * go_1(-1.0, 0.0);\n    result += mat4(0.06458832, -0.009722021, -0.123604394, 0.06548835, -0.3039139, -0.022024399, 0.05297587, -0.0626883, 0.23556642, 0.1516464, -0.07004877, -0.1845364, -0.05918428, 0.19158973, -0.14983447, 0.030489758) * go_1(-1.0, 1.0);\n    result += mat4(0.36604697, 0.17516142, -0.10853731, -0.22694224, -0.107650936, 0.23013335, 0.094055794, -0.17047717, -0.3006048, -0.08621717, -0.18815655, -0.03570218, 0.09676118, -0.017718751, 0.059138596, 0.073388465) * go_1(0.0, -1.0);\n    result += mat4(-0.12791575, 0.101956226, 0.13091874, -0.046373338, 0.04955811, -0.04030444, 0.13869923, -0.046699073, -0.42611042, -0.7173929, 0.052184317, 0.6178025, -0.02929954, -0.07638965, -0.15000828, 0.030710017) * go_1(0.0, 0.0);\n    result += mat4(0.057806686, 0.20842272, -0.20148766, 0.006666912, 0.13356528, -0.45265228, -0.07354092, 0.21447696, 0.019552143, -0.13645506, 0.14643854, -0.0071413796, -0.15487236, -0.002250615, 0.30622452, 0.0033902125) * go_1(0.0, 1.0);\n    result += mat4(0.06896002, 0.24397352, -0.06479052, 0.20676947, -0.24259068, 0.055320013, -0.09032122, -0.11222854, -0.08982342, -0.114818625, -0.06399291, -0.3024516, -0.06302166, -0.1925528, 0.03458982, 0.028828239) * go_1(1.0, -1.0);\n    result += mat4(0.09764086, 0.09599894, -0.0073313303, 0.14418933, -0.045712367, 0.12657364, 0.04620374, -0.069778584, 0.30047333, -0.012418192, 0.15516461, -0.18087754, 0.08178273, 0.14262857, -0.01741533, -0.12509112) * go_1(1.0, 0.0);\n    result += mat4(0.04697884, -0.1506804, 0.031823065, 0.13397239, -0.18396698, 0.10681781, -0.29586303, -0.0039136545, 0.17560847, -0.12486726, -0.018646788, -0.20688744, -0.030614454, -0.0527634, 0.23593572, -0.10542146) * go_1(1.0, 1.0);\n    result += mat4(-0.19182229, -0.32615846, 0.26283535, -0.1371942, -0.071202695, 0.12056063, -0.11450658, -0.27711076, -0.42096004, 0.0014352369, 0.1559669, -0.14464542, -0.17973948, 0.079166576, -0.12501791, -0.20623216) * go_2(-1.0, -1.0);\n    result += mat4(0.12469872, 0.32190827, -0.059510354, 0.1393449, -0.12845798, -0.019571869, -0.22630808, -0.14031963, 0.36072046, 0.05858427, 0.19278921, 0.121090546, -0.067538865, -0.018770566, 0.14318037, -0.15561756) * go_2(-1.0, 0.0);\n    result += mat4(0.024663208, 0.21110268, -0.016415706, 0.060093414, -0.03739678, -0.107412934, -0.077527136, 0.30331334, 0.17196326, -0.15512557, -0.09499732, -0.15748607, -0.16680105, -0.015185634, 0.16114107, -0.21288376) * go_2(-1.0, 1.0);\n    result += mat4(-0.17739037, -0.1190967, 0.13191372, -0.2527187, -0.14992718, -0.30511454, 0.19145966, 0.002194003, -0.12888977, 0.19152176, 0.27528167, 0.099714965, 0.12865707, -0.12051514, -0.055013947, 0.26231763) * go_2(0.0, -1.0);\n    result += mat4(0.46433613, -0.11708138, -0.20157282, 0.32022122, 0.079468675, 0.029407484, 0.2559102, -0.15651533, 0.08644574, -0.09747344, -0.07528584, 0.17354868, 0.19167562, -0.17698488, -0.09896657, 0.17093097) * go_2(0.0, 0.0);\n    result += mat4(0.20283653, -0.33680332, 0.2282385, 0.18832158, 0.20866042, 0.00076752366, 0.16471444, -0.21548858, 0.16193539, 0.17141372, 0.03140222, 0.03913644, -0.030161971, 0.00014570929, 0.08993654, -0.064823024) * go_2(0.0, 1.0);\n    result += mat4(-0.3075755, 0.19942546, 0.015526995, -0.120868504, -0.254515, -0.07791228, 0.03271691, 0.11794217, 0.11258601, 0.045204375, -0.061196107, -0.115958795, 0.3861869, 0.048215542, 0.07016682, -0.009975758) * go_2(1.0, -1.0);\n    result += mat4(-0.07623697, 0.16094944, -0.02283455, 0.14112763, -0.051149167, 0.20429814, 0.011314802, 0.18914083, -0.24240434, -0.08784008, -0.16763984, -0.08492233, 0.31062725, -0.11925119, -0.33195966, 0.2060798) * go_2(1.0, 0.0);\n    result += mat4(-0.016709225, -0.14472668, -0.3677625, -0.09832719, 0.030297454, -0.05775362, -0.1401375, 0.08119674, -0.01795042, 0.05183797, -0.24320887, 0.066842034, -0.22245285, -0.02740993, 0.06316751, 0.053399116) * go_2(1.0, 1.0);\n    result += mat4(-0.039214406, -0.08876633, 0.045552462, 0.19226661, 0.1355001, -0.13942362, 0.17398876, 0.2914014, -0.191809, 0.037143208, 0.013333581, -0.16632195, 0.113767646, -0.106692605, 0.1589787, 0.030107044) * go_3(-1.0, -1.0);\n    result += mat4(0.21997562, 0.13855208, -0.05783191, -0.033682413, -0.010961168, 0.10524961, 0.02177416, 0.18289444, 0.043692037, 0.07853899, -0.039936125, -0.1004449, 0.04494073, -0.020680292, 0.17578089, -0.106598996) * go_3(-1.0, 0.0);\n    result += mat4(0.026852835, -0.16037546, 0.11278316, 0.12656097, -0.006857894, -0.03400118, -0.051564034, 0.00085412664, -0.37556714, -0.05279987, 0.029383834, -0.14246808, -0.056380164, -0.002399925, 0.16025752, 0.036324855) * go_3(-1.0, 1.0);\n    result += mat4(0.022709966, 0.046350412, 0.03390721, 0.02810572, -0.14394265, 0.04215361, -0.3206118, 0.15034916, -0.0028448137, 0.1682989, -0.042686664, 0.020543462, -0.2786501, -0.007482015, -0.040313292, -0.20745736) * go_3(0.0, -1.0);\n    result += mat4(0.05417556, 0.18728684, -0.046121832, -0.27939513, 0.05907976, -0.09191223, -0.16625418, -0.26038164, 0.39956605, -0.052594025, -0.0596556, 0.29517552, -0.015181923, -0.0763375, 0.25131205, 0.13038464) * go_3(0.0, 0.0);\n    result += mat4(-0.036903054, -0.0066989153, -0.062650286, 0.05614359, -0.0064960583, 0.028512698, -0.10906273, -0.010047654, 0.23030473, 0.049983572, 0.10439064, 0.26643834, 0.05041243, 0.09185424, -0.32352915, 0.11295159) * go_3(0.0, 1.0);\n    result += mat4(0.09724027, -0.34962535, 0.06586686, 0.016635379, 0.13831381, 0.01707076, -0.04690347, 0.022350075, 0.018352794, 0.022000022, 0.070613205, 0.117735535, -0.025971051, 0.18832101, -0.09643588, -0.08512127) * go_3(1.0, -1.0);\n    result += mat4(-0.17324433, 0.06810613, -0.057295907, -0.05115964, -0.101570815, 0.12491774, 0.08762367, -0.005862404, -0.05342927, -0.031942457, -0.039624047, -0.04298937, -0.1303138, -0.11869282, -0.024832053, 0.070463404) * go_3(1.0, 0.0);\n    result += mat4(-0.010514842, 0.1376259, -0.11750346, -0.03786737, 0.03459249, 0.015408171, -0.031430878, -0.060825355, -0.072958425, -0.0037895301, 0.041686177, -0.12352204, -0.06261361, 0.054514423, -0.34072715, 0.13860728) * go_3(1.0, 1.0);\n    result += vec4(0.018166734, -0.11002478, -0.05554318, -0.0988193);\n    return result;\n}\n//!DESC Anime4K-v4.0-Restore-CNN-(VL)-Conv-4x3x3x16\n//!HOOK MAIN\n//!BIND conv2d_tf\n//!BIND conv2d_tf1\n//!SAVE conv2d_1_tf1\n//!WIDTH conv2d_tf.w\n//!HEIGHT conv2d_tf.h\n//!COMPONENTS 4\n#define go_0(x_off, y_off) (max((conv2d_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max((conv2d_tf1_texOff(vec2(x_off, y_off))), 0.0))\n#define go_2(x_off, y_off) (max(-(conv2d_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_3(x_off, y_off) (max(-(conv2d_tf1_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(-0.040142782, 0.0288423, 0.07569487, -0.01490842, 0.14402796, -0.13682005, 0.027765118, 0.03907358, 0.07117706, 0.058157545, -0.23862502, -0.057674367, -0.19220531, 0.0147159435, -0.18028538, 0.0963821) * go_0(-1.0, -1.0);\n    result += mat4(-0.1676744, -0.11937339, 0.12137117, 0.07119485, 0.14148116, -0.043578617, -0.029261118, -0.0016938087, -0.057269357, -0.080076694, 0.12193026, 0.07326153, -0.056278303, -0.01630716, -0.03792076, 0.1483611) * go_0(-1.0, 0.0);\n    result += mat4(-0.3021578, 0.011601693, 0.11266048, 0.19086999, -0.0122412145, 0.08431291, 0.11615175, -0.008039614, -0.39987534, 0.07820729, 0.03509667, 0.1963505, -0.08839513, -0.21571854, 0.059425723, -0.06830175) * go_0(-1.0, 1.0);\n    result += mat4(0.23135209, -0.12452708, 0.0943565, 0.0028859286, -0.09836373, 0.10681712, -0.3535964, 0.08457615, 0.045332734, 0.16579892, -0.03809797, -0.021596594, 0.2937497, -0.028294371, 0.046484597, -0.037604347) * go_0(0.0, -1.0);\n    result += mat4(0.072675414, -0.16431206, 0.28952035, 0.0076831076, -0.020242939, 0.029483542, -0.092415355, 0.08673106, 0.12109694, 0.14307201, 0.23134442, 0.11731775, 0.09981601, -0.16968462, 0.037470713, 0.14948717) * go_0(0.0, 0.0);\n    result += mat4(0.0029752052, 0.06526503, 0.1866458, 0.07451277, -0.31836876, 0.17115082, -0.13969697, 0.23844297, -0.03244903, -0.08832665, 0.023691226, -0.18230624, -0.074933805, -0.00044301842, 0.050572682, 0.081511915) * go_0(0.0, 1.0);\n    result += mat4(0.039502528, 0.051221415, -0.13968123, -0.091212444, -0.016925618, 0.15409444, -0.017455677, -0.11653652, 0.03539446, -0.00087720866, -0.12839639, 0.037198763, 0.03674469, -0.26444665, 0.019721227, -0.13013805) * go_0(1.0, -1.0);\n    result += mat4(0.039229527, 0.25667152, 0.0032586441, -0.00718359, 0.1617932, 0.10409968, 0.07182867, -0.09810605, 0.07789241, -0.02014911, 0.025767172, -0.14604759, 0.07175764, 0.32513744, -0.20473222, -0.16266066) * go_0(1.0, 0.0);\n    result += mat4(0.13418433, 0.061813723, -0.13927278, -0.2498272, 0.03468218, 0.29483125, 0.063289374, -0.04726235, 0.1898295, -0.33132064, 0.032045014, 0.02159535, -0.1148363, 0.31306976, 0.06456038, 0.048988886) * go_0(1.0, 1.0);\n    result += mat4(0.07151646, 0.2799246, -0.107190795, -0.16431166, -0.28007045, 0.07206954, 0.06775463, 0.009758042, 0.07032184, -0.20843789, 0.087045245, 0.1360676, -0.25718534, 0.028249472, -0.12614648, 0.009949602) * go_1(-1.0, -1.0);\n    result += mat4(0.020241471, -0.23390484, -0.0083223935, 0.08344701, 0.08222297, 0.12026539, -0.08652223, -0.08228822, -0.039576706, -0.24677879, -0.1157289, 0.2590508, -0.23809408, 0.19911982, -0.116798095, -0.035870325) * go_1(-1.0, 0.0);\n    result += mat4(0.024991842, 0.050509237, -0.024134455, -0.12659028, 0.24089767, 0.122712664, -0.10482493, -0.19403952, -0.19177693, -0.06538376, -0.041478425, 0.32176673, -0.1534002, -0.18680622, 0.06763643, 0.020806564) * go_1(-1.0, 1.0);\n    result += mat4(0.03437814, -0.28067374, 0.2830681, 0.038812317, -0.021698112, -0.120865285, 0.22695538, -0.045419116, -0.030475847, -0.01977341, -0.1265364, -0.3109814, 0.012255813, 0.053917278, -0.018620957, -0.14599285) * go_1(0.0, -1.0);\n    result += mat4(-0.016204128, -0.04093018, 0.054571863, 0.02679643, 0.01756274, -0.057685968, 0.16148666, 0.17370272, -0.11065411, 0.06378157, -0.09331551, 0.22985275, 0.057905316, 0.12323568, 0.07748665, 0.09878629) * go_1(0.0, 0.0);\n    result += mat4(-0.018112244, 0.063234635, -0.013184602, 0.16241394, 0.08877139, 0.02145378, -0.02490027, -0.038920373, 0.13127136, 0.14391647, 0.020553736, 0.14401346, 0.06685973, -0.25398204, 0.10369067, -0.055949755) * go_1(0.0, 1.0);\n    result += mat4(0.07710333, 0.047412727, 0.13813803, 0.18624061, 0.16907091, -0.039532468, 0.06234584, 0.06408178, -0.054543987, -0.045220226, -0.11093376, -0.37399602, 0.20372874, 0.004580967, -0.07742308, 0.017989937) * go_1(1.0, -1.0);\n    result += mat4(0.003485311, -0.08897399, -0.013108594, -0.19473282, -0.27081844, -0.16812073, 0.0052992934, -0.055331517, 0.09446357, 0.019280333, 0.16560757, -0.3230032, 0.043096773, 0.059222896, -0.064184934, -0.059852477) * go_1(1.0, 0.0);\n    result += mat4(0.06794279, -0.034135245, 0.083064295, 0.13506731, 0.13064219, -0.44978833, -0.03513717, 0.08999715, 0.1124541, 0.42208397, -0.0038724816, -0.014332087, -0.13751853, -0.04929869, 0.09134992, -0.17687531) * go_1(1.0, 1.0);\n    result += mat4(0.100909084, -0.0131197255, 0.082274795, -0.2138443, -0.08515947, -0.021058358, 0.10951775, -0.06349191, -0.29129833, -0.029262653, 0.25235432, -0.11748315, 0.121980384, 0.062347785, 0.10916932, -0.15993518) * go_2(-1.0, -1.0);\n    result += mat4(0.28893283, -0.05677308, -0.2641288, -0.058937225, -0.16187571, 0.006647366, -0.063294955, 0.04766719, 0.60601914, -0.07831864, -0.15710756, -0.011491797, 0.15587467, -0.08105375, 0.07847514, -0.2803333) * go_2(-1.0, 0.0);\n    result += mat4(-0.077989794, -0.09871811, -0.3516344, 0.15292728, 0.010889273, 0.0011189661, -0.16118282, -0.018821161, -0.039708678, -0.00060983415, -0.06367813, 0.009148068, 0.03919827, 0.18782744, 0.028040757, -0.10230145) * go_2(-1.0, 1.0);\n    result += mat4(-0.4079609, 0.18640275, -0.12475227, 0.13891742, 0.25121725, 0.16942379, 0.14409852, 0.087600805, 0.045335658, -0.12683709, -0.0077387216, 0.06563413, -0.19857128, 0.106910795, -0.048285246, 0.10768945) * go_2(0.0, -1.0);\n    result += mat4(0.5989075, 0.20941062, -0.20086494, 0.13344856, 0.073034994, 0.22358665, 0.101664364, -0.13463663, 0.18816395, -0.061176624, -0.14712185, 0.027320342, -0.09529667, 0.031148786, -0.28744993, 0.18698911) * go_2(0.0, 0.0);\n    result += mat4(0.14799193, 0.39471942, -0.23340325, -0.4031061, 0.18926248, -0.11091216, 0.118981816, -0.09155061, 0.17049436, 0.19803695, -0.1513267, 0.023817873, 0.0090933135, -0.04134864, 0.060486555, 0.03536634) * go_2(0.0, 1.0);\n    result += mat4(-0.39094314, 0.01779997, 0.12710269, 0.0067333193, -0.31255835, -0.08206612, -0.048528638, 0.369439, -0.19351655, -0.03420455, 0.15831526, -0.052294146, -0.08481741, 0.0787108, 0.1312136, -0.108919285) * go_2(1.0, -1.0);\n    result += mat4(-0.16068119, -0.42190582, 0.19383872, -0.018445708, 0.09803051, -0.020769652, -0.022599563, -0.052448895, -0.20645833, -0.031432863, 0.0025441595, 0.03410379, -0.20268854, 0.04481527, 0.05191063, 0.42317194) * go_2(1.0, 0.0);\n    result += mat4(-0.12786235, -0.23936178, 0.116561726, 0.30756372, -0.09420156, -0.044529166, -0.03585749, 0.1829332, -0.23939075, 0.24030831, 0.019878127, -0.015069802, 0.24300557, -0.22558568, -0.104956664, -0.09393648) * go_2(1.0, 1.0);\n    result += mat4(-0.04607054, 0.012677649, -0.027597688, 0.1618836, 0.29210827, 0.014221155, -0.13591036, -0.06895336, -0.09559534, 0.07956421, -0.11112994, -0.13325493, 0.24562472, 0.11046177, 0.057847694, 0.0016315983) * go_3(-1.0, -1.0);\n    result += mat4(-0.03365951, 0.027391057, 0.09653403, -0.14718771, -0.049631152, -0.06467214, -0.058545876, 0.1424002, -0.06320376, 0.181183, 0.10249362, -0.16052136, 0.3013475, -0.04156266, 0.08862033, 0.06888033) * go_3(-1.0, 0.0);\n    result += mat4(0.10045977, -0.004198456, -0.025856055, 0.05739418, -0.1328637, -0.025975171, 0.06553717, 0.11301186, 0.0704087, -0.083569765, 0.16066101, -0.24453588, 0.25370175, 0.037184533, 0.062386766, -0.20025635) * go_3(-1.0, 1.0);\n    result += mat4(-0.017958941, 0.06417776, -0.1525265, 0.12451173, 0.14567685, -0.0049682115, -0.23973411, -0.0783304, -0.010629432, 0.08055161, 0.2028341, 0.17640644, -0.20445108, -0.055524793, -0.019326134, 0.081288636) * go_3(0.0, -1.0);\n    result += mat4(0.007882519, -0.03722546, 0.053249408, 0.00071846246, -0.07053029, -0.21583866, 0.1415364, -0.19486657, 0.20685542, 0.17660026, -0.32156837, 0.1746825, -0.14957622, -0.09224378, -0.098153435, -0.13054638) * go_3(0.0, 0.0);\n    result += mat4(0.10051427, -0.17398237, 0.09842799, -0.14187703, 0.116901085, -0.1229543, -0.0007776771, -0.20410055, -0.11373484, -0.111150615, -0.1974002, -0.11641459, 0.024105398, 0.24985977, 0.015871854, -0.10724633) * go_3(0.0, 1.0);\n    result += mat4(-0.18081793, 0.1209351, -0.12867971, -0.019415248, 0.062617876, -0.037130393, -0.07803658, -0.22862352, 0.2586428, -0.030090366, -0.11894069, 0.18087515, -0.40921417, 0.070013195, 0.030540073, 0.035120826) * go_3(1.0, -1.0);\n    result += mat4(-0.13185939, 0.12992652, 0.08125049, 0.075331174, 0.064219765, 0.056629725, -0.020012032, -0.0855444, -0.044063166, -0.05396545, -0.028002812, 0.21837157, -0.15206428, -0.12681007, 0.14895032, 0.12339962) * go_3(1.0, 0.0);\n    result += mat4(0.08066341, -0.14773634, -0.0212227, -0.014011867, -0.048505764, 0.075407125, -0.020620076, 0.0003291325, -0.21815202, -0.23136546, 0.10853532, -0.036058456, 0.10952532, -0.052677035, -0.13005799, 0.18398996) * go_3(1.0, 1.0);\n    result += vec4(0.022609137, -0.028548084, 0.024431901, 0.010504478);\n    return result;\n}\n//!DESC Anime4K-v4.0-Restore-CNN-(VL)-Conv-4x3x3x16\n//!HOOK MAIN\n//!BIND conv2d_1_tf\n//!BIND conv2d_1_tf1\n//!SAVE conv2d_2_tf\n//!WIDTH conv2d_1_tf.w\n//!HEIGHT conv2d_1_tf.h\n//!COMPONENTS 4\n#define go_0(x_off, y_off) (max((conv2d_1_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max((conv2d_1_tf1_texOff(vec2(x_off, y_off))), 0.0))\n#define go_2(x_off, y_off) (max(-(conv2d_1_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_3(x_off, y_off) (max(-(conv2d_1_tf1_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(-0.069641694, 0.104958326, 0.14786446, 0.027633663, -0.004279524, -0.020451711, 0.0883571, -0.016224537, 0.13585235, 0.11078269, 0.20198658, -0.042161036, 0.020466218, 0.20994963, 0.20072585, -0.028024657) * go_0(-1.0, -1.0);\n    result += mat4(0.050872434, 0.12874635, 0.1298729, 0.115810685, 0.07087254, 0.09885682, 0.23018982, 0.19187538, 0.10953604, 0.0033836907, -0.13325337, 0.09830315, -0.06528767, 0.05096927, -0.016355392, -0.039334368) * go_0(-1.0, 0.0);\n    result += mat4(0.027010268, 0.018263958, 0.0360758, 0.016791478, 0.2815702, 0.15517488, 0.43415815, 0.044976447, -0.0070842914, -0.12546758, 0.16874593, 0.077622116, 0.02252915, 0.1769774, 0.07181055, -0.15128697) * go_0(-1.0, 1.0);\n    result += mat4(0.057129618, 0.118046716, 0.07237424, -0.07842637, -0.044214778, -0.12886304, 0.08603301, -0.10416606, -0.15852053, 0.3788151, 0.26181692, -0.09092249, 0.31635332, 0.064212754, 0.21923725, 0.07500004) * go_0(0.0, -1.0);\n    result += mat4(-0.16981383, 0.044409662, -0.3717617, -0.031610407, 0.03658662, -0.09459229, -0.09449437, -0.014000666, -0.19656453, 0.03934163, -0.16304104, -0.12761801, -0.06235523, 0.16438273, -0.036933117, -0.095564745) * go_0(0.0, 0.0);\n    result += mat4(0.09725091, 0.034022827, 0.17699842, 0.1079676, -0.13236652, 0.03718181, -0.06968635, -0.23288171, 0.10275666, 0.08464966, -0.37162134, -0.35782215, -0.11023659, 0.2519236, -0.035197742, -0.019324787) * go_0(0.0, 1.0);\n    result += mat4(-0.09968464, 0.01102193, 0.0073735216, 0.011999313, -0.004998707, 0.09518938, 0.045727003, -0.21544908, 0.006879454, -0.06398254, -0.12584935, -0.06759933, -0.0820037, -0.07775104, 0.021957919, -0.122708224) * go_0(1.0, -1.0);\n    result += mat4(-0.08869767, 0.031296413, -0.0034280645, 0.13778855, 0.10073061, -0.08393937, -0.032959275, -0.0500518, 0.010908757, -0.09189417, -0.057760105, 0.17652664, -0.08729078, -0.09639096, -0.25654703, 0.055152636) * go_0(1.0, 0.0);\n    result += mat4(0.0027847723, -0.12885433, 0.038065907, 0.17450769, 0.0864409, 0.04592345, -0.015443841, 0.077010944, 0.08967368, 0.06800111, -0.23636387, 0.35023567, 0.03165923, 0.03132063, 0.17964344, 0.035610788) * go_0(1.0, 1.0);\n    result += mat4(-0.032017227, -0.0022808525, -0.08470573, 0.05332408, -0.14674746, 0.025374275, -0.018281924, 0.041163016, 0.00096549373, 0.014724006, 0.004913065, 0.18494442, 0.034953076, -0.15731992, -0.13792977, 0.08041999) * go_1(-1.0, -1.0);\n    result += mat4(0.08305006, 8.6318905e-05, -0.007895379, 0.02731387, -0.061324496, 0.050034665, 0.22662131, -0.013876427, -0.074468784, -0.008136604, -0.23337875, -0.1742574, 0.011753501, -0.11666686, -0.22541048, -0.14549944) * go_1(-1.0, 0.0);\n    result += mat4(-0.028333234, 0.121047184, 0.06720256, -0.058930036, 0.030258363, 0.07292774, 0.06455556, 0.0019076486, 0.0073987027, 0.17144889, 0.06084024, -0.08762086, -0.114422195, -0.16595861, -0.08706028, -0.10736261) * go_1(-1.0, 1.0);\n    result += mat4(-0.02519315, -0.14611271, 0.0388848, 0.19481422, -0.05970354, -0.08391417, 0.18982239, -0.10447052, 0.15587378, -0.023997072, 0.0781739, 0.2182389, -0.023886079, -0.1422596, -0.13352804, 0.005008043) * go_1(0.0, -1.0);\n    result += mat4(0.08842712, -0.100292705, 0.18925671, 0.12198875, 0.061771665, -0.04473232, 0.025053164, 0.039047796, -0.1672479, -0.08934517, 0.33099812, -0.20269585, -0.21640155, -0.22029749, 0.16539703, -0.2442679) * go_1(0.0, 0.0);\n    result += mat4(-0.16332205, -0.101898365, 0.02919932, -0.11900455, 0.14442924, 0.0916815, 0.037550304, 0.024123482, 0.02042624, 0.033472955, -0.059437107, -0.18735693, -0.013749093, -0.06199881, -0.08685079, 0.04252364) * go_1(0.0, 1.0);\n    result += mat4(-0.09047013, -0.055188328, -0.09106191, -0.048969727, 0.05114009, -0.12753403, 0.07116141, 0.060749624, -0.074034564, -0.21952136, -0.09479503, 0.2753584, -0.014141759, -0.14883812, -0.0673838, -0.012279045) * go_1(1.0, -1.0);\n    result += mat4(0.013816464, -0.0747162, -0.19202435, -0.064403646, 0.34980014, 0.04375546, 0.20264609, 0.006684355, 0.11523799, 0.024674915, -0.08697566, -0.04662527, -0.12743855, -0.39463726, 0.0057380227, 0.01286557) * go_1(1.0, 0.0);\n    result += mat4(-0.08146522, 0.074080914, -0.16856177, -0.183158, 0.19228102, 0.12373886, 0.017574452, -0.01753772, 0.045071773, 0.07725093, 0.023422163, -0.011545186, 0.20751388, -0.10795588, 0.07606346, 0.10282933) * go_1(1.0, 1.0);\n    result += mat4(0.12512013, -0.102208994, -0.09125398, 0.12043188, -0.066011876, 0.08831903, -0.017038671, -0.005541508, -0.049607087, 0.08654939, -0.02037085, 0.26887566, 0.005012545, 0.01869507, -0.013064982, -0.010649147) * go_2(-1.0, -1.0);\n    result += mat4(0.006824864, -0.05071593, -0.20786697, -0.07327317, 0.011382597, 0.030494886, -0.04754353, -0.018284699, 0.01305972, -0.036589053, 0.26637617, 0.021887446, -0.026669119, -0.037982125, -0.063445956, -0.009104248) * go_2(-1.0, 0.0);\n    result += mat4(0.032602567, 0.07094331, 0.052653246, 0.08342047, -0.085082285, -0.14674088, -0.23073354, -0.07915851, 0.0017120204, 0.032407638, -0.039819505, 0.16942178, 0.023192152, -0.0353237, 0.10930186, 0.22939779) * go_2(-1.0, 1.0);\n    result += mat4(0.0010455973, -0.11821993, -0.12639599, 0.12250084, -0.12756817, 0.11478416, -0.1862587, 0.016819192, 0.02110181, -0.25492984, -0.1766048, 0.22188173, -0.21305011, 0.113442205, 0.04599144, -0.15840286) * go_2(0.0, -1.0);\n    result += mat4(-0.15086032, -0.17428935, 0.39080557, 0.07576757, 0.121703945, 0.17944208, -0.003140103, -0.11231332, 0.12102969, 0.15310267, 0.17578171, 0.40631834, -0.21299168, 0.024928993, 0.030104794, 0.020753227) * go_2(0.0, 0.0);\n    result += mat4(-0.098734386, -0.020072265, -0.14308836, -0.08490801, 0.017175158, 0.02250534, 0.04060829, 0.033022214, 0.0046218676, 0.17923212, 0.0112105915, 0.09574084, 0.14819936, -0.14692923, 0.12634254, 0.060762513) * go_2(0.0, 1.0);\n    result += mat4(0.030521613, -0.097913325, -0.016720278, 0.11273997, 0.013019863, -0.06557118, 0.0405774, 0.0915019, 0.022414956, -0.053254984, 0.18639986, 0.07820968, 0.06498986, 0.058922634, -0.02240318, -0.086019725) * go_2(1.0, -1.0);\n    result += mat4(0.2058775, 0.01502064, 0.05847032, 0.007249146, 0.086483665, 0.19420148, 0.03892261, -0.013546935, -0.07980237, 0.04347281, -0.10376214, -0.1366535, 0.05285337, 0.07213318, 0.3642818, -0.11331124) * go_2(1.0, 0.0);\n    result += mat4(-0.025740806, 0.14551482, -0.037410017, -0.17477523, -0.11853099, -0.060820814, -0.102599286, -0.13267937, -0.103053465, -0.014044828, -0.01888072, -0.06499249, 0.22311528, -0.051850274, -0.034120858, 0.044562567) * go_2(1.0, 1.0);\n    result += mat4(-0.21360217, 0.10093803, -0.0016407765, -0.1473997, 0.26524043, 0.02112132, 0.23173104, -0.013157391, 0.05945182, 0.044635538, 0.06031638, -0.21435826, -0.10147484, 0.069090195, 0.09641844, -0.09581093) * go_3(-1.0, -1.0);\n    result += mat4(-0.08576515, -0.122861005, 0.049567085, -0.085854456, 0.23809357, -0.024966082, -0.10294079, 0.046241313, 0.008621132, -0.08323767, 0.20277941, 0.163423, -0.07386535, -0.088738985, 0.05274358, -0.025479877) * go_3(-1.0, 0.0);\n    result += mat4(-0.041135542, -0.008365642, 0.17088248, 0.04025207, 0.13809255, -0.056895368, -0.01582834, 0.07361908, -0.00068995473, -0.09300962, 0.19117641, 0.24832036, -0.06572358, -0.026025, -0.019093119, -0.049720034) * go_3(-1.0, 1.0);\n    result += mat4(0.024900286, 0.11525501, 0.025882801, 0.037742402, 0.36976853, 0.052211333, -0.15143296, 0.1802276, -0.059080046, 0.017990451, 0.026395092, -0.12689115, -0.07705386, 0.1232379, 0.13273561, -0.12521964) * go_3(0.0, -1.0);\n    result += mat4(-0.19788785, 0.044887315, 0.07663442, 0.16688696, -0.2842248, -0.15684547, 0.028387763, 0.0063470444, -0.012245601, -0.038382255, -0.8187406, -0.25245667, 0.23014604, 0.22746666, 0.1594356, 0.16469443) * go_3(0.0, 0.0);\n    result += mat4(-0.12663333, 0.014730006, 0.03765697, 0.15704912, -0.106595434, -0.05317512, -0.081759915, -0.08797109, 0.064620756, -0.06341419, 0.16493447, 0.23102313, 0.068325415, -0.088058695, 0.16885915, 0.036382258) * go_3(0.0, 1.0);\n    result += mat4(0.035389822, -0.11811836, -0.035656307, -0.0680554, 0.1338908, 0.065852076, 0.023307983, 0.0675308, 0.09690683, 0.18170924, 0.09862692, -0.20964378, -0.08601271, -0.20016764, -0.01879598, -0.14629345) * go_3(1.0, -1.0);\n    result += mat4(-0.27183273, 0.013525998, -0.14995874, -0.23938845, -0.26218823, -0.0009874097, -0.13385512, -0.10664239, -0.048931994, 0.039898522, 0.047444753, 0.10934722, 0.10969629, 0.123539805, 0.11692802, 0.14172275) * go_3(1.0, 0.0);\n    result += mat4(-0.1656506, 0.019683002, 0.0221048, 0.12596753, 0.20420644, -0.07930122, 0.04653823, 0.11492255, -0.0050175437, -0.03271697, 0.013389486, 0.034583613, -0.2196601, -0.1615663, -0.013763388, -0.056037936) * go_3(1.0, 1.0);\n    result += vec4(-0.022956269, 0.029688787, -0.070148066, -0.07163476);\n    return result;\n}\n//!DESC Anime4K-v4.0-Restore-CNN-(VL)-Conv-4x3x3x16\n//!HOOK MAIN\n//!BIND conv2d_1_tf\n//!BIND conv2d_1_tf1\n//!SAVE conv2d_2_tf1\n//!WIDTH conv2d_1_tf.w\n//!HEIGHT conv2d_1_tf.h\n//!COMPONENTS 4\n#define go_0(x_off, y_off) (max((conv2d_1_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max((conv2d_1_tf1_texOff(vec2(x_off, y_off))), 0.0))\n#define go_2(x_off, y_off) (max(-(conv2d_1_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_3(x_off, y_off) (max(-(conv2d_1_tf1_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(-0.15104648, 0.05522861, -0.0654341, -0.053517453, -0.08264124, -0.0062249107, -0.20364265, -0.05015117, -0.18837251, 0.030655831, 0.046844713, -0.20673253, -0.14042036, -0.05655449, 0.13994302, 0.011745607) * go_0(-1.0, -1.0);\n    result += mat4(-0.16517559, 0.1489214, -0.09149559, 0.025003506, -0.124926426, 0.16974348, -0.020857265, 0.08017403, 0.21836148, 0.0025619378, 0.2331612, 0.085599184, -0.030934382, -0.055194855, 0.09527726, -0.10081552) * go_0(-1.0, 0.0);\n    result += mat4(0.041800212, 0.028859638, 0.09395546, 0.05211183, -0.038541477, 0.021495212, 0.04862346, -0.007864793, 0.038407274, -0.13841268, -0.14963801, 0.26470762, 0.16691841, -0.07262008, 0.034374326, -0.14709206) * go_0(-1.0, 1.0);\n    result += mat4(0.00094978884, -0.028974704, -0.0900548, -0.08401967, -0.08935931, -0.043606587, -0.14497143, -0.05226239, -0.21516493, 0.19410603, -0.089924194, -0.04335071, -0.012618276, -0.2671613, 0.020422975, -0.037739716) * go_0(0.0, -1.0);\n    result += mat4(-0.13403237, -0.02524383, -0.03474901, 0.054432765, 0.11946775, 0.107336655, -0.1431715, -0.13370377, 0.015087512, -0.1917613, 0.073493585, 0.2788855, -0.010510839, 0.06891479, -0.06741307, -0.05271205) * go_0(0.0, 0.0);\n    result += mat4(-0.15432046, 0.04021662, -0.16979513, 0.13660534, -0.10518303, -0.10095502, -0.13092068, 0.022805348, -0.16676381, -0.4273298, 0.020867536, 0.3506733, -0.29459694, -0.055828743, -0.069241956, 0.04106382) * go_0(0.0, 1.0);\n    result += mat4(-0.08890133, 0.07549666, -0.040735144, -0.1506932, -0.22227979, -0.0762723, -0.17766447, -0.05741318, -0.21885683, 0.2379157, -0.15525854, -0.07306285, 0.15580738, -0.04394069, -0.19175608, 0.018283797) * go_0(1.0, -1.0);\n    result += mat4(-0.08503275, -0.105500385, -0.114987396, -0.07166016, -0.2147138, 0.09378708, 0.24550334, -0.0834075, -0.033147786, -0.022304727, -0.31062204, 0.027651973, 0.109098755, 0.18889032, 0.1163026, 0.13863255) * go_0(1.0, 0.0);\n    result += mat4(0.15266588, -0.14901319, 0.033916786, 0.09381096, -0.08196443, -0.16194504, 0.035789456, 0.21234898, -0.48724765, 0.2619442, -0.11215393, 0.25061038, 0.022344576, 0.0116525125, 0.111661114, -0.15242295) * go_0(1.0, 1.0);\n    result += mat4(0.020475458, 0.0797404, -0.13576819, 0.009681671, 0.030504882, 0.049232908, 0.022025917, 0.16912088, -0.23914136, -0.084663324, 0.020925451, -0.1023938, 0.035916872, -0.07538111, -0.11470242, 0.15238516) * go_1(-1.0, -1.0);\n    result += mat4(-0.12941381, 0.08509899, -0.029489802, -0.09148447, -0.089406274, -0.116145454, -0.08979843, 0.11908148, 0.15473351, -0.21687616, 0.12607013, -0.08244334, -0.079580925, -0.16613089, -0.09287793, -0.03412643) * go_1(-1.0, 0.0);\n    result += mat4(-0.023578499, 0.07394217, -0.13069086, -0.1060499, -0.07559958, -0.21839201, 0.1090753, 0.0787872, 0.07677037, -0.25998843, 0.20039314, 0.046882212, 0.31871012, -0.3048051, 0.15118991, -0.00518087) * go_1(-1.0, 1.0);\n    result += mat4(-0.15338503, -0.11057532, 0.075839415, -0.18592294, -0.0155324, 0.038140323, -0.10498194, 0.09070477, 0.05108992, -0.047939524, -0.091004305, 0.09649005, -0.10967152, -0.051909525, -0.05314551, 0.09661584) * go_1(0.0, -1.0);\n    result += mat4(-0.14458802, -0.053263694, -0.0010885567, 0.23342133, 0.01918937, 0.12026143, -0.15691495, 0.30480555, -0.08725869, 0.19082253, 0.3594973, 0.016653897, 0.045152336, -0.088590585, 0.0069655925, 0.1392425) * go_1(0.0, 0.0);\n    result += mat4(0.17944881, -0.17950764, 0.13282645, 0.030974053, 0.32233685, 0.18067117, -0.11472813, 0.097301506, -0.047649745, -0.1053861, -0.081039384, 0.035132434, 0.10204545, 0.085582554, -0.13153993, -0.021741152) * go_1(0.0, 1.0);\n    result += mat4(-0.15573682, 0.16409989, -0.22574787, -0.03877603, -0.18285516, 0.11638645, 0.18321282, -0.017770218, 0.18230622, 0.16433364, -0.12795393, -0.03805153, 0.14386104, -0.0891527, -0.056928284, -0.10961495) * go_1(1.0, -1.0);\n    result += mat4(0.257622, 0.052519716, -0.25421762, -0.1887382, -0.083568096, -0.0064690276, -0.029110614, 0.103327505, -0.17006217, 0.2254096, -0.29366904, 0.04302887, -0.10198446, -0.24423616, 0.16781262, -0.005019004) * go_1(1.0, 0.0);\n    result += mat4(0.103393994, -0.059044626, -0.18192382, 0.0990813, -0.26143607, 0.11036474, 0.04788275, -0.096738026, 0.12825653, 0.13631694, -0.077904984, -0.020790676, -0.25118098, 0.122588515, -0.049440473, -0.10758222) * go_1(1.0, 1.0);\n    result += mat4(0.06693113, -0.13647175, 0.131139, 0.13143918, 0.081720434, 0.117537096, 0.15387627, -0.008771362, 0.08513583, 0.023794742, -0.0661625, 0.115793936, 0.0023350024, 0.02215075, -0.0494433, -0.013404977) * go_2(-1.0, -1.0);\n    result += mat4(0.041419264, -0.17622781, 0.028418267, 0.12114493, -0.23587078, 0.08457395, 0.014364018, -0.103271864, -0.051572207, -0.026424447, 0.16755055, -0.10763651, -0.033440586, 0.068594255, -0.050668504, 0.1941505) * go_2(-1.0, 0.0);\n    result += mat4(-0.2780181, 0.037816502, -0.11516711, -0.09822884, 0.13762361, -0.14317706, 0.14350282, 0.000623895, -0.08601606, 0.08118504, 0.15497385, -0.04721711, -0.008936935, -0.014223618, -0.09641698, -0.013884213) * go_2(-1.0, 1.0);\n    result += mat4(0.14349665, -0.03144472, -0.057813704, 0.0667044, 0.09026094, 0.051366236, 0.11139983, -0.015782114, -0.18314016, -0.18774192, 0.0014838242, 0.15759028, 0.062388215, 0.13626057, 0.02576217, -0.06317815) * go_2(0.0, -1.0);\n    result += mat4(0.07151769, 0.14508991, 0.1736844, -0.11487795, -0.07999805, -0.07797908, 0.037923355, -0.059138823, -0.23531209, -0.040207293, -0.068355694, -0.024296658, -0.114820175, 0.19726487, 0.21772414, 0.03659222) * go_2(0.0, 0.0);\n    result += mat4(0.16858695, -0.12135113, 0.009391182, -0.081519485, 0.13340487, 0.07007004, 0.094124354, 0.035519842, -0.3320139, -0.06624027, -0.14716229, -0.09205287, 0.12664132, -0.05655441, 0.0123263765, 0.04641279) * go_2(0.0, 1.0);\n    result += mat4(0.19018422, -0.15428329, -0.009354114, 0.04165953, 0.11024837, -0.107493006, -0.05807292, -0.048029456, 0.24319384, -0.10542357, -0.013699952, 0.06228662, -0.06808749, -0.023227982, 0.16528323, -0.05610251) * go_2(1.0, -1.0);\n    result += mat4(-0.008616222, 0.077674195, -0.08638503, 0.09293109, 0.072474636, 0.05004233, -0.20591061, -0.005301386, -0.15486047, 0.15038474, 0.1262478, 0.021724822, 0.02274613, -0.3088281, -0.08437887, -0.10684698) * go_2(1.0, 0.0);\n    result += mat4(-0.16960032, 0.09365251, -0.030414175, -0.010766254, 0.18181023, 0.12130318, 0.08913089, -0.06070321, 0.05200306, 0.092584535, 0.17694671, 0.033796314, -0.038107123, -0.04335955, -0.049443472, 0.30465958) * go_2(1.0, 1.0);\n    result += mat4(0.07661484, -0.009945252, 0.12866217, -0.07592757, -0.21030053, 0.014371748, -0.072458774, -0.04700072, 0.15534303, 0.2007125, -0.15699059, -0.032897495, 0.08110436, -0.11243608, 0.008632577, -0.10153441) * go_3(-1.0, -1.0);\n    result += mat4(-0.034697928, 0.06928288, -0.2796273, 0.14405379, 0.12248569, 0.036539096, 0.06607706, 0.077684596, -0.16473202, 0.1665916, -0.29977503, 0.21047153, 0.13114224, -0.091579035, -0.045458574, 0.03254245) * go_3(-1.0, 0.0);\n    result += mat4(0.053284872, 0.053366095, -0.26152626, -0.03123967, -0.031794485, 0.17670582, -0.07450994, 0.017521491, -0.040290453, 0.38342363, -0.25021288, -0.014660264, 0.1621895, 0.25041878, -0.12124821, 0.068036206) * go_3(-1.0, 1.0);\n    result += mat4(0.11366693, -0.030863572, -0.07411263, 0.12475283, -0.046070684, -0.09033321, 0.013222701, 0.06798592, -0.32814804, 0.057653826, -0.14082801, -0.00217398, -0.22856179, -0.19058353, -0.20992154, -0.03701372) * go_3(0.0, -1.0);\n    result += mat4(0.20345633, -0.1332355, 0.27152926, -0.13477845, -0.25242096, -0.28281286, 0.31289554, 0.14284514, 0.53362453, -0.46766588, 0.4518293, -0.39291728, -0.3573227, -0.014670052, 0.0051881406, 0.16552156) * go_3(0.0, 0.0);\n    result += mat4(-0.15017267, -0.07792945, -0.204405, 0.13964304, -0.13642666, -0.10228306, 0.03238279, -0.08689329, -0.072262034, -0.0258388, 0.05689183, 0.055701543, -0.19800112, 0.012217054, -0.033292748, -0.047611095) * go_3(0.0, 1.0);\n    result += mat4(-0.014704416, -0.12203891, 0.066083655, -0.1409769, 0.0041513643, -0.087383606, -0.17498164, 0.11327789, -0.25947225, -0.0016027623, 0.08202566, 0.042270098, 0.006429511, -0.26576808, -0.08461341, 0.049376782) * go_3(1.0, -1.0);\n    result += mat4(0.0695189, -0.14753938, 0.09578246, -0.16607563, -0.0105561055, 0.17166016, 0.027422488, -0.14175262, -0.009492696, -0.23449713, 0.018270867, 0.14635146, 0.33451268, 0.030959005, -0.46468422, 0.024256868) * go_3(1.0, 0.0);\n    result += mat4(-0.16865666, -0.00015881563, -0.054488145, -0.06222717, -0.032101758, 0.06485387, -0.0028512608, 0.046645947, 0.017593225, -0.19447896, -0.024742266, 0.03970127, 0.29845607, -0.16168733, 0.035172883, 0.07924657) * go_3(1.0, 1.0);\n    result += vec4(0.103826486, 0.045373913, 0.11565896, -0.06568643);\n    return result;\n}\n//!DESC Anime4K-v4.0-Restore-CNN-(VL)-Conv-4x3x3x16\n//!HOOK MAIN\n//!BIND conv2d_2_tf\n//!BIND conv2d_2_tf1\n//!SAVE conv2d_3_tf\n//!WIDTH conv2d_2_tf.w\n//!HEIGHT conv2d_2_tf.h\n//!COMPONENTS 4\n#define go_0(x_off, y_off) (max((conv2d_2_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max((conv2d_2_tf1_texOff(vec2(x_off, y_off))), 0.0))\n#define go_2(x_off, y_off) (max(-(conv2d_2_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_3(x_off, y_off) (max(-(conv2d_2_tf1_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(0.1851775, 0.053705044, 0.033816848, -0.018555025, -0.21204336, -0.01706974, 0.088259794, -0.13126148, 0.10729598, -0.043457437, 0.08634712, 0.09220895, 0.062131613, -0.01995871, 0.05181067, 0.18520063) * go_0(-1.0, -1.0);\n    result += mat4(0.1662002, -0.14197104, -0.052809287, 0.025287712, -0.08330898, -0.08998097, -0.15642618, -0.14941245, -0.03481203, 0.061857622, 0.26051775, -0.0005498248, 0.086427025, 0.024108192, -0.12418039, 0.022286376) * go_0(-1.0, 0.0);\n    result += mat4(0.058200672, -0.3073398, 0.17150162, -0.13394679, -0.075118184, -0.14607768, -0.006172172, 0.007731589, -0.21818224, -0.06449433, -0.038958784, 0.037722416, 0.28699976, -0.027563032, 0.23295315, 0.028444216) * go_0(-1.0, 1.0);\n    result += mat4(0.12871371, 0.0064904913, 0.14985761, -0.10923005, 0.17413563, 0.1599109, -0.08457703, 0.108153716, -0.08871187, -0.06661137, 0.2754416, -0.009667768, 0.39819396, 0.12392097, 0.14145902, 0.0019376524) * go_0(0.0, -1.0);\n    result += mat4(0.13893189, 0.12715353, 0.015191678, -0.21003054, -0.030412354, -0.01676613, -0.19799289, -0.006130075, 0.37676954, -0.14475077, -0.2065198, -0.30432892, -0.14944535, -0.09121536, -0.107600585, -0.24462196) * go_0(0.0, 0.0);\n    result += mat4(-0.11653076, -0.0068671284, -0.02249137, -0.17877012, -0.15063138, -0.13514869, 0.107643366, -0.03196477, -0.086422764, 0.3079287, 0.17584166, -0.032449376, -0.06917114, -0.2682637, -0.18978168, -0.037039287) * go_0(0.0, 1.0);\n    result += mat4(0.12014731, -0.030360512, -0.12954475, -0.110275604, -0.077214256, 0.019689744, 0.22149551, -0.002266716, 0.09697784, -0.124532826, -0.16776511, -0.034212478, -0.36935154, 0.016926935, 0.1363609, 0.20415346) * go_0(1.0, -1.0);\n    result += mat4(-0.11199535, -0.001692563, -0.09058429, -0.08437503, 0.092625685, 0.06046257, 0.25509837, -0.011657033, -0.17949764, -0.10718947, -0.1180669, -0.24681842, -0.1747311, 0.0014518246, -0.042863015, 0.06103357) * go_0(1.0, 0.0);\n    result += mat4(0.14979295, -0.037154514, 0.01957725, 0.012282435, 0.09168596, -0.05552286, 0.111671515, 0.0078630615, -0.10319766, -0.06416261, -0.23097566, -0.13931875, 0.2110811, 0.013095802, -0.2306504, -0.025639111) * go_0(1.0, 1.0);\n    result += mat4(-0.10091975, -0.10095426, -0.023449723, -0.022170888, 0.054953706, -0.13049407, 0.08289061, 0.023241632, 0.08735388, -0.0058387457, 0.17897247, 0.011434436, 0.008181139, -0.0034718404, -0.015372735, -0.07657766) * go_1(-1.0, -1.0);\n    result += mat4(-0.023442164, 0.07535702, 0.024391165, -0.050532013, 0.044168636, 0.0062343236, -0.019756999, -0.009695123, 0.10102337, 0.0052776975, -0.14944167, -0.060957722, 0.24367364, -0.08069369, 0.12170072, -0.047048368) * go_1(-1.0, 0.0);\n    result += mat4(-0.18376935, -0.08407229, -0.12943378, 0.0738419, -0.12404976, -0.13367929, 0.11265896, -0.021353, 0.003783386, 0.50088304, 0.14058582, 0.041053623, 0.038247623, -0.014179976, 0.007905778, -0.042492237) * go_1(-1.0, 1.0);\n    result += mat4(-0.046272535, 0.052449115, 0.17190954, -0.004745371, -0.045572635, -0.09292636, 0.36309823, 0.16673928, -0.099154025, -0.109614775, 0.17803112, 0.19907133, -0.14306267, 0.06898593, 0.11493454, 0.06795014) * go_1(0.0, -1.0);\n    result += mat4(0.26181114, -0.044014625, -0.21605036, -0.08646438, 0.21038742, -0.084986, 0.0504626, 0.17514943, -0.25218952, -0.18691514, 0.057650108, 0.08653614, -0.101205684, 0.03176334, 0.18569492, 0.17973189) * go_1(0.0, 0.0);\n    result += mat4(-0.0339215, 0.20112811, -0.12986277, 0.028961731, -0.056813832, 0.04451147, -0.07827432, -0.0860976, 0.096853435, 0.3483546, -0.35758162, -0.11749375, -0.035918653, 0.06140711, -0.08520154, 0.02418808) * go_1(0.0, 1.0);\n    result += mat4(-0.09643022, -0.10491069, 0.0068604187, 0.023679713, 0.096521445, -0.29323488, 0.33353668, 0.112864286, -0.1172182, -0.07233183, 0.06607239, 0.08589609, 0.055790007, 0.14396138, -0.14191268, 0.00034840964) * go_1(1.0, -1.0);\n    result += mat4(0.15357164, -0.038462736, 0.08143956, 0.1744909, 0.40503287, -0.114508316, 0.003937322, 0.2536635, -0.042445306, -0.15622465, 0.09155284, 0.010992155, -0.20646071, 0.022801135, 0.08894491, 0.069300614) * go_1(1.0, 0.0);\n    result += mat4(-0.12663515, 0.023849454, -0.053604446, 0.12082873, -0.247968, -0.020969635, -0.03831894, -0.014617553, 0.22630337, 0.037801865, 0.052950703, 0.04285706, -0.14487264, 0.20786528, -0.08719664, 0.1752347) * go_1(1.0, 1.0);\n    result += mat4(-0.073527604, -0.050752833, 0.051830504, 0.32868716, 0.17474994, 0.016937364, -0.08792601, -0.024481766, -0.022229593, 0.030706186, 0.09213566, -0.076506205, 0.073404044, 0.10368055, -0.175889, -0.08453031) * go_2(-1.0, -1.0);\n    result += mat4(-0.06838216, 0.007698341, 0.063972116, -0.015604406, 0.16135305, 0.18044342, 0.024137018, -0.23326185, 0.13235588, -0.009096587, -0.058368143, -0.077040404, 0.0011419816, -0.09246194, 0.061036937, 0.049564146) * go_2(-1.0, 0.0);\n    result += mat4(0.023225296, -0.00060856267, -0.07775185, 0.016958566, -0.2641349, -0.08263046, -0.15350416, -0.30203494, 0.113956556, -0.010813236, -0.017738314, -0.13689043, -0.10318342, 0.025793184, -0.010336172, 0.09733422) * go_2(-1.0, 1.0);\n    result += mat4(-0.04462596, 0.052866418, -0.34754288, 0.05540498, -0.24492586, -0.32016864, 0.18145293, 0.24873725, 0.32388234, -0.034801524, -0.1347588, -0.07565546, 0.015183539, 0.05059595, 0.08090056, 0.05930932) * go_2(0.0, -1.0);\n    result += mat4(0.045346696, -0.052527856, 0.052270077, 0.13417454, 0.05200045, 0.028119288, 0.005115497, 0.22952151, -0.2158375, 0.12241308, 0.3507457, 0.08616576, 0.07592416, 0.28470486, 0.3432788, 0.24857087) * go_2(0.0, 0.0);\n    result += mat4(0.21311626, 0.052607164, 0.1248861, 0.20193806, 0.045226507, 0.14512901, -0.15103437, -0.17926466, 0.11657411, -0.32711068, -0.16332194, -0.07793982, -0.21802668, 0.5183869, -0.13567342, 0.07823041) * go_2(0.0, 1.0);\n    result += mat4(0.00796368, 0.048073012, -0.14537893, -0.021708772, 0.036246423, 0.1062395, 0.12605369, 0.007073524, -0.1572743, 0.07439501, 0.089162275, -0.0039608316, 0.332032, -0.05461242, -0.17615359, -0.10240517) * go_2(1.0, -1.0);\n    result += mat4(0.20636982, -0.0024615112, -0.10625786, 0.024270926, 0.061810836, -0.13585201, -0.16581286, 0.23549418, 0.01928842, 0.07404979, -0.054449487, 0.04096373, 0.046939734, 0.003980803, 0.02111498, 0.064925276) * go_2(1.0, 0.0);\n    result += mat4(0.10485388, 0.06850885, -0.11292169, 0.16991565, -0.15282536, 0.124175504, -0.050431166, -0.06689582, -0.00059811946, 0.033696912, 0.11055047, 0.033060126, -0.17472714, 0.0048819613, -0.04478706, -0.1344572) * go_2(1.0, 1.0);\n    result += mat4(-0.20473132, 0.056477875, 0.059559986, 0.115130566, -0.058425788, -0.035971727, 0.08334707, -0.096510135, -0.23206294, 0.10635798, -0.21575621, -0.07063254, 0.03877511, -0.107549034, 0.22248401, 0.21702304) * go_3(-1.0, -1.0);\n    result += mat4(-0.02557767, 0.09886609, -0.100499466, 0.16687396, -0.084830604, 0.03150401, -0.049512494, 0.05595696, -0.13193256, -0.08585273, 0.14247662, 0.12290477, -0.07168309, 0.14531752, -0.048359327, 0.27716598) * go_3(-1.0, 0.0);\n    result += mat4(0.13297586, 0.20674329, 0.14469388, 0.08981846, -0.004231366, -0.02819193, 0.15470329, 0.17299837, 0.113062344, -0.22716297, -0.21754944, -0.00083956274, -0.14160508, 0.1808253, 0.11268379, 0.27335623) * go_3(-1.0, 1.0);\n    result += mat4(0.07497518, -0.06799594, -0.018158078, -0.00038999433, -0.15169668, -0.06928238, -0.33672288, -0.105485775, 0.33106267, 0.06698315, 0.019718744, -0.06810211, -0.35186404, -0.29145968, -0.056863394, 0.21498048) * go_3(0.0, -1.0);\n    result += mat4(-0.013215512, -0.24763754, 0.20965266, 0.1068435, -0.13234195, 0.053566497, 0.05061848, -0.28645232, 0.15518288, 0.23247199, 0.017553907, -0.25181335, -0.048030723, -0.06663929, -0.111026704, -0.12663394) * go_3(0.0, 0.0);\n    result += mat4(-0.010501938, -0.17995767, 0.06010859, 0.050185587, 0.108627126, -0.101203434, 0.07558728, 0.060466755, -0.106942676, -0.35854608, 0.16015992, 0.16823332, -0.06543775, -0.37310675, 0.014043972, -0.18328045) * go_3(0.0, 1.0);\n    result += mat4(0.09712849, 0.013983463, 0.07291423, 0.031715546, 0.030862397, 0.045510456, -0.22066842, 0.063464865, 0.11721659, -0.10596602, -0.20611264, 0.052158818, -0.3961766, -0.03781582, 0.17633812, 0.1316111) * go_3(1.0, -1.0);\n    result += mat4(-0.25029674, 0.07153423, -0.35125682, -0.18255402, -0.19569087, 0.00432772, -0.0969035, -0.24648514, -0.0040922165, 0.037500706, -0.038137026, 0.056214277, -0.048258524, 0.03567822, -0.05033007, -0.24696785) * go_3(1.0, 0.0);\n    result += mat4(-0.03465209, -0.012495964, 0.22782089, 0.012034795, 0.2916752, 0.08264436, 0.15387125, -0.1473455, -0.15614432, 0.05536727, -0.027079755, 0.010725311, -0.03325222, -0.089212805, -0.10559839, -0.19647683) * go_3(1.0, 1.0);\n    result += vec4(0.0001705175, -0.031081453, 0.010100773, -0.027214011);\n    return result;\n}\n//!DESC Anime4K-v4.0-Restore-CNN-(VL)-Conv-4x3x3x16\n//!HOOK MAIN\n//!BIND conv2d_2_tf\n//!BIND conv2d_2_tf1\n//!SAVE conv2d_3_tf1\n//!WIDTH conv2d_2_tf.w\n//!HEIGHT conv2d_2_tf.h\n//!COMPONENTS 4\n#define go_0(x_off, y_off) (max((conv2d_2_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max((conv2d_2_tf1_texOff(vec2(x_off, y_off))), 0.0))\n#define go_2(x_off, y_off) (max(-(conv2d_2_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_3(x_off, y_off) (max(-(conv2d_2_tf1_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(-0.026301445, -0.021575214, 0.22165509, 0.059994068, 0.03341161, 0.1831188, 0.20342293, 0.110160105, 0.03908121, 0.020673111, 0.07239561, 0.038754333, 0.15266368, 0.16526422, 0.062376205, -0.09759537) * go_0(-1.0, -1.0);\n    result += mat4(0.19817191, 0.10267733, 0.17744653, 0.23283184, 0.18810122, 0.2708428, -0.12651879, 0.020756349, 0.039632563, -0.22201295, 0.04873703, 0.09159713, 0.13838065, 0.21169297, 0.30816007, 0.044463675) * go_0(-1.0, 0.0);\n    result += mat4(-0.27859214, 0.07277634, 0.0021458792, 0.0089682285, -0.069680706, 0.090415835, -0.057762265, 0.18703683, -0.03514389, -0.102816254, -0.036509827, 0.038066104, -0.0168311, 0.094478935, 0.04079697, -0.049064912) * go_0(-1.0, 1.0);\n    result += mat4(-0.20913245, -0.110538535, -0.08584027, -0.1222067, 0.05414807, -0.045247085, 0.07351766, -0.002078549, -0.1270987, -0.10164512, -0.1857815, 0.08845066, -0.03743333, -0.098948084, 0.21244387, 0.10441866) * go_0(0.0, -1.0);\n    result += mat4(0.015990427, 0.36396438, -0.24094687, 0.30236533, -0.13271736, 0.06057376, -0.19678196, -0.28577125, -0.25427434, -0.08400598, 0.07284403, -0.18552442, -0.16425897, 0.097259276, -0.32386774, -0.2190484) * go_0(0.0, 0.0);\n    result += mat4(-0.004581924, -0.13954072, -0.122360416, 0.14132866, -0.08529257, -0.013296556, 0.0848472, 0.09336581, 0.10332182, -0.016313016, 0.07103558, 0.032564916, -0.13478759, -0.20207484, 0.12986964, 0.1219679) * go_0(0.0, 1.0);\n    result += mat4(0.09817874, -0.10573357, 0.100535244, 0.19608764, -0.13303067, 0.024192972, -0.030689823, 0.02574889, 0.051233094, 0.03489235, -0.18465245, -0.06943822, -0.031604882, 0.1519888, 0.09348508, 0.09187296) * go_0(1.0, -1.0);\n    result += mat4(-0.21365458, -0.23696984, 0.13097638, -0.09435498, 0.16467983, -0.066370346, 0.1269104, -0.095128186, 0.09954892, 0.12489504, -0.43418056, 0.106512725, -0.17860703, -0.07114084, -0.07630834, -0.26642478) * go_0(1.0, 0.0);\n    result += mat4(-0.009044342, 0.02711196, -0.14873673, 0.015405045, 0.0071443473, -0.025285944, 0.07409282, 0.06338527, 0.0149676185, 0.011741382, -0.2133069, -0.028912885, 0.19420496, 0.039629057, 0.057636812, 0.15214856) * go_0(1.0, 1.0);\n    result += mat4(0.07629928, 0.25540486, -0.050925937, -0.18136702, 0.02261603, 0.22343902, 0.003270321, 0.10735731, -0.12541203, -0.10208828, 0.012832783, 0.2591262, 0.08122926, -0.009837677, 0.10308358, 0.19236866) * go_1(-1.0, -1.0);\n    result += mat4(0.0896358, 0.27571487, 0.04406029, -0.047453407, -0.08587119, 0.16366854, 0.20622262, 0.08347545, -0.3501584, -0.28434548, -0.07592983, 0.09098784, 0.07605388, 0.09677056, 0.0015295541, 0.05102585) * go_1(-1.0, 0.0);\n    result += mat4(0.18255898, 0.18618028, 0.0017002645, -0.013004655, -0.06436534, 0.13967068, 0.063077755, -0.10632303, -0.20803222, -0.028537111, -0.03144366, -0.08555215, 0.05154303, 0.02431626, 0.15246728, -0.013708507) * go_1(-1.0, 1.0);\n    result += mat4(-0.020998938, -0.05026291, 0.03700117, 0.00830308, -0.1949294, 0.0026698054, -0.034649856, 0.19784226, -0.083901435, -0.069783084, -0.1504053, 0.16595264, -0.07480141, 0.16067508, 0.06010996, -0.021359695) * go_1(0.0, -1.0);\n    result += mat4(-0.040828142, -0.20158486, 0.034770954, -0.1894161, 0.11665004, 0.29729164, -0.10584386, 0.13165873, -0.18863006, -0.26719162, -0.047613148, -0.12728356, -0.2033613, 0.10550052, 0.20095508, -0.11275811) * go_1(0.0, 0.0);\n    result += mat4(-0.0785033, -0.1896073, -0.051492307, -0.1694358, 0.1368308, 0.049355216, -0.05707422, 0.079159185, 0.024578957, -0.0923136, 0.089215435, 0.28670043, 0.027932687, 0.06510816, 0.10810999, 0.05990052) * go_1(0.0, 1.0);\n    result += mat4(0.08135192, 0.0001326522, -0.16098668, -0.18663193, -0.10280192, 0.078255914, 0.047648013, 0.08326376, 0.055962667, 0.06302574, -0.080121025, -0.031820554, -0.019117938, 0.12515336, 0.09794088, -0.03276838) * go_1(1.0, -1.0);\n    result += mat4(0.280923, 0.24079335, 0.007883573, 0.06270414, 0.3055441, 0.19291803, -0.16041607, 0.14836526, 0.0013885222, 0.04538063, 0.10742898, -0.064491205, 0.048174977, 4.237692e-05, -0.15194727, 0.024381457) * go_1(1.0, 0.0);\n    result += mat4(-0.0009164131, -0.031949926, 0.0076425644, -0.036870714, -0.0031292974, 0.017726978, -0.20172147, -0.0770472, 0.26379177, 0.108997814, 0.08069395, 0.2126177, 0.012075376, -0.029457828, 0.062730506, -0.15754452) * go_1(1.0, 1.0);\n    result += mat4(0.09167904, -0.2657421, -0.03443356, 0.03315832, -0.015365421, -0.1029612, -0.108251, 0.04261033, -0.097120754, -0.05616668, -0.09275983, 0.024902184, 0.050058514, -0.013761632, 0.07555132, -0.0046676896) * go_2(-1.0, -1.0);\n    result += mat4(-0.10743835, -0.0007361781, -0.042085417, -0.08237517, -0.10094376, -0.24007876, 0.13924706, -0.07526801, 0.01158322, 0.15491122, 0.0069442675, -0.004242352, 0.11429785, 0.02994726, -0.11829945, -0.04108612) * go_2(-1.0, 0.0);\n    result += mat4(0.073622055, -0.064717196, -0.0025231615, 0.13256475, 0.20159899, 0.047977835, -0.10289233, -0.18419135, -0.00888952, 0.059428576, -0.053062655, -0.02730631, 0.14545685, -0.08686949, 0.17454128, 0.035443828) * go_2(-1.0, 1.0);\n    result += mat4(-0.010146019, 0.06712568, 0.12614638, 0.023590917, 0.025756737, 0.06603747, -0.17108095, -0.06179699, 0.027241204, -0.13196802, 0.043475866, -0.0397495, 0.05306092, 0.035672903, 0.047219284, -0.16680142) * go_2(0.0, -1.0);\n    result += mat4(0.079427816, -0.06716479, 0.19028603, -0.19694683, -0.061598092, -0.07471188, 0.21170339, 0.30140215, -0.0023369973, 0.04688297, -0.14154115, 0.19283508, 0.1339858, -0.09116279, 0.15305163, 0.029108394) * go_2(0.0, 0.0);\n    result += mat4(-0.14902157, -0.03339153, -0.08532003, -0.10736339, 0.08702709, 0.07607574, -0.09955836, -0.016585784, -0.030078214, -0.060374748, -0.2854279, 0.02441719, 0.034877967, 0.2099041, 0.11125731, -0.059071556) * go_2(0.0, 1.0);\n    result += mat4(-0.08436325, 0.06893047, -0.045362443, -0.02237741, -0.07583875, -0.034830183, -0.024008518, -0.2882329, -0.011109783, 0.101859994, 0.091137715, 0.0020565533, -0.044729806, -0.18168025, 0.069466636, 0.04994174) * go_2(1.0, -1.0);\n    result += mat4(0.11915174, 0.089596465, -0.18965814, 0.015218237, 0.13500094, 0.19921367, -0.008298205, 0.29650384, -0.049439427, -0.27590424, 0.36169067, -0.030582754, 0.02151196, 0.019915426, 0.04543398, 0.16126189) * go_2(1.0, 0.0);\n    result += mat4(0.1620274, -0.08264547, 0.082442135, -0.0034478644, 0.09888509, -0.0034957859, -0.107241705, -0.17729597, -0.05138647, 0.02052103, -0.019507123, 0.037574988, -0.1694345, 0.17871588, -0.22510391, 0.019049853) * go_2(1.0, 1.0);\n    result += mat4(-0.10962245, -0.1329873, -0.060855392, 0.025941676, -0.19536193, -0.120365486, -0.04313703, -0.052912965, 0.20854498, 0.08341353, 0.008687068, -0.20432276, 0.15677948, -0.19000018, 0.01821201, -0.041512605) * go_3(-1.0, -1.0);\n    result += mat4(0.012287526, -0.14180368, -0.098788455, 0.025949089, 0.09442778, 0.2247651, -0.12453263, 0.10435483, 0.274603, 0.06133054, 0.10506106, 0.14727746, -0.048299775, -0.082819685, 0.07319359, -0.047460355) * go_3(-1.0, 0.0);\n    result += mat4(-0.070726536, -0.034744017, 0.07521428, 0.070649154, -0.05958955, -0.100232825, -0.010651838, 0.045392875, 0.2930271, -0.04952355, 0.3112155, 0.117203265, 0.025166962, 0.11176862, 0.06716659, 0.07175864) * go_3(-1.0, 1.0);\n    result += mat4(-0.011560962, -0.14032063, -0.17424704, 0.07652749, -0.04220116, 0.052874275, -0.00225693, -0.031843517, -0.07520102, -0.13775803, 0.2449317, 0.069658786, 0.052280303, -0.105218224, 0.03574522, -0.020500354) * go_3(0.0, -1.0);\n    result += mat4(0.08793712, 0.26712346, 0.08315631, 0.23813692, -0.04439029, 0.031587064, 0.09561177, -0.13380238, -0.24982157, 0.31701845, -0.3875432, 0.10487225, 0.09201869, -0.037252493, -0.006935219, -0.14650282) * go_3(0.0, 0.0);\n    result += mat4(0.077635325, 0.13732299, -0.071563005, 0.096517466, -0.15051986, -0.111744404, 0.03996857, -0.052670125, -0.1819665, 0.054554947, -0.13774712, -0.20061246, -0.0023742192, 0.15647805, -0.024121126, 0.075497724) * go_3(0.0, 1.0);\n    result += mat4(0.0073632775, -0.06535298, 0.039895996, 0.20666869, 0.13625242, 0.04823007, -0.07135618, 0.04787906, 0.01383074, 0.15382123, -0.15519714, 0.056721795, 0.061946746, -0.0586851, 0.028934354, -0.02264129) * go_3(1.0, -1.0);\n    result += mat4(-0.19791882, -0.111910924, -0.010451344, -0.30566537, -0.1416239, -0.14523096, 0.116883226, -0.18241516, 0.2680614, -0.18487626, 0.17472346, 0.08346682, -0.14510359, -0.029229192, -0.005879142, 0.050247498) * go_3(1.0, 0.0);\n    result += mat4(0.030153519, -0.092469186, -0.022912916, 0.10200855, -0.04237032, -0.05917764, 0.10479645, -0.05619482, -0.18949397, -0.019547248, 0.013868889, -0.1524476, 0.14048979, -0.032521486, 0.1322921, 0.070972025) * go_3(1.0, 1.0);\n    result += vec4(0.012053958, -4.6962363e-05, 0.0020099226, -0.033494607);\n    return result;\n}\n//!DESC Anime4K-v4.0-Restore-CNN-(VL)-Conv-4x3x3x16\n//!HOOK MAIN\n//!BIND conv2d_3_tf\n//!BIND conv2d_3_tf1\n//!SAVE conv2d_4_tf\n//!WIDTH conv2d_3_tf.w\n//!HEIGHT conv2d_3_tf.h\n//!COMPONENTS 4\n#define go_0(x_off, y_off) (max((conv2d_3_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max((conv2d_3_tf1_texOff(vec2(x_off, y_off))), 0.0))\n#define go_2(x_off, y_off) (max(-(conv2d_3_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_3(x_off, y_off) (max(-(conv2d_3_tf1_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(-0.06738501, 0.034009207, -0.21538448, 0.14296548, 0.12896985, -0.23526315, -0.08848608, 0.019602662, 0.14937137, 0.11353096, 0.11884168, -0.016765572, 0.030985225, 0.046430565, 0.06614828, -0.19202724) * go_0(-1.0, -1.0);\n    result += mat4(-0.10326068, 0.11014975, 0.17069744, -0.21474148, 0.16761585, 0.13434832, -0.101021074, 0.006307025, 0.07478008, -0.1060066, 0.035315692, 0.033488914, -0.24906659, 0.06269967, 0.11120735, -0.040928528) * go_0(-1.0, 0.0);\n    result += mat4(0.09334615, 0.057705753, 0.12213245, -0.06402275, 0.30694544, 0.034585163, 0.20345578, 0.07489286, 0.07483618, -0.14240396, 0.034846418, -0.03811241, 0.010882573, 0.13204294, 0.017563924, -0.047203008) * go_0(-1.0, 1.0);\n    result += mat4(-0.21673942, -0.024010994, -0.10238504, -0.041160326, 0.06838163, -0.20950818, 0.06526309, -0.079094924, 0.02208821, -0.28130978, 0.086275116, -0.089067616, 0.12133826, -0.062600106, -0.020521903, -0.07654401) * go_0(0.0, -1.0);\n    result += mat4(-0.03055029, -0.15683146, -0.20331301, -0.06252028, 0.13350682, 0.20338707, 0.038425338, 0.1581342, -0.27322498, -0.14999662, -0.16681097, 0.0971585, -0.20014858, -0.081635274, -0.0781877, -0.20625232) * go_0(0.0, 0.0);\n    result += mat4(0.38375977, -0.019825654, 0.1886721, 0.22616312, 0.3402173, 0.1825304, -0.05531195, 0.30973226, -0.2676023, 0.14413352, 0.021706983, 0.01732799, 0.23466855, -0.13805965, 0.22570935, 0.018103868) * go_0(0.0, 1.0);\n    result += mat4(-0.15169825, 0.0270689, -0.2503316, 0.17289825, -0.16437647, 0.039233048, -0.35572487, -0.048393793, 0.19270042, 0.24260359, 0.12041881, -0.0009793913, 0.11656858, 0.11007414, -0.0757491, 0.047933612) * go_0(1.0, -1.0);\n    result += mat4(-0.18657999, -0.11252566, -0.05237504, -0.07368097, 0.13882741, -0.13710637, -0.006996468, -0.062354874, 0.23452504, 0.15333645, -0.0022776406, -0.17910439, 0.03629509, -0.16264829, -0.010011833, -0.15313338) * go_0(1.0, 0.0);\n    result += mat4(-0.060544558, -0.04913478, -0.061717357, 0.02323648, 0.28739056, -0.07434013, 0.19110644, 0.100050166, 0.0073363045, 0.08185653, -0.024797903, -0.14424153, -0.20838726, 0.16154376, -0.048517212, -0.025453888) * go_0(1.0, 1.0);\n    result += mat4(0.14975396, -0.13142908, 0.36210674, -0.054021083, -0.10632155, 0.045697935, -0.18946633, 0.02228141, -0.08919603, 0.09800842, -0.17634438, 0.09512711, -0.03425503, -0.12298555, -0.05354435, -0.17112055) * go_1(-1.0, -1.0);\n    result += mat4(0.09958265, -0.057276618, -0.16262266, -0.06415915, 0.14579074, -0.36784375, 0.08034197, -0.04537706, 0.005460582, 0.22313322, 0.07382161, 0.014990379, 0.044636846, -0.2811128, -0.22621547, -0.06044004) * go_1(-1.0, 0.0);\n    result += mat4(0.10569276, -0.03738662, 0.16100396, 0.058593616, -0.048862137, -0.08796426, 0.20101094, -0.11039573, 0.17196764, -0.04601554, 0.008571281, -0.073729075, 0.051433694, -0.051276565, 0.087334655, -0.0360379) * go_1(-1.0, 1.0);\n    result += mat4(0.011119538, -0.28781965, 0.28637868, -0.1742508, -0.07121849, 0.10379717, 0.012615981, -0.029563965, -0.18678424, 0.05291095, 0.039143506, -0.028248642, -0.014103922, 0.029155696, 0.10433492, 0.16305852) * go_1(0.0, -1.0);\n    result += mat4(-0.2231037, -0.13697462, -0.29124337, 0.08519773, 0.15893684, -0.17763218, 0.06950923, 0.34361118, -0.024844287, 0.044008408, -0.033844844, -0.086971916, -0.07884748, 0.2543499, 0.056884114, 0.10068364) * go_1(0.0, 0.0);\n    result += mat4(-0.07710048, -0.23218372, 0.04346047, 0.21769643, 0.06473219, -0.18066105, -0.2511205, 0.15309611, 0.04535977, 0.16450433, 0.10846344, 0.0016952346, -0.010874939, 0.28966382, -0.121990964, 0.12956186) * go_1(0.0, 1.0);\n    result += mat4(-0.007910202, 0.17766511, 0.14364475, 0.1016258, 0.0051045395, 0.18691733, 0.005813767, -0.0070582186, 0.019418601, -0.1604435, 0.016088275, -0.18265302, -0.15719391, -0.17369832, -0.036745597, -0.19647408) * go_1(1.0, -1.0);\n    result += mat4(0.08938396, -0.0073808245, 0.11225727, -0.012303106, 0.096785046, 0.030483445, 0.027719889, -0.052584838, -0.14887555, -0.03422243, 0.12646855, -0.1722482, 0.010239037, 0.06406088, -0.20053658, 0.01964698) * go_1(1.0, 0.0);\n    result += mat4(-0.120734036, -0.12450362, -0.06582111, 0.1639675, -0.19787048, -0.08049789, -0.014257596, 0.058436662, -0.0009387449, -0.08698089, -0.017400503, 0.06295286, 0.09890349, -0.057190523, -0.103520766, -0.04207548) * go_1(1.0, 1.0);\n    result += mat4(-0.0118413875, -0.031288836, 0.09749554, -0.012266401, -0.07998591, 0.22615653, -0.06207416, 0.03257896, -0.076378696, -0.079426095, -0.13968349, -0.15423697, -0.1091681, -0.02893125, -0.032659534, -0.063735925) * go_2(-1.0, -1.0);\n    result += mat4(0.119372696, 0.013176554, -0.029381052, 0.21919228, 0.045041792, 0.24844484, 0.26363325, 0.08480674, 0.087083444, 0.11984778, -0.088715754, 0.06421046, 0.05225977, -0.05140334, -0.055052705, -0.049854077) * go_2(-1.0, 0.0);\n    result += mat4(0.0035781674, 0.0861361, -0.07675145, -0.056479637, 0.16973391, -0.12113791, 0.10729832, -0.03773517, 0.058618728, 0.12148276, 0.17260705, -0.06968724, 0.076358154, -0.15307103, 0.17700425, -0.13467014) * go_2(-1.0, 1.0);\n    result += mat4(-0.02752418, -0.06366472, -0.025610954, 0.0013539721, -0.06465272, 0.0806373, -0.07336035, 0.10114861, 0.0041146413, 0.15878421, -0.044668555, -0.12150811, -0.1071482, -0.05086587, 0.18589285, 0.05065092) * go_2(0.0, -1.0);\n    result += mat4(0.07200056, 0.021739854, 0.29476613, -0.08475931, 0.15018553, -0.07886365, 0.36336347, -0.020576432, 0.25866082, -0.059272554, 0.054249667, -0.17822553, 0.1755872, 0.3244387, -0.39173844, 0.33894604) * go_2(0.0, 0.0);\n    result += mat4(-0.11570926, 0.1342677, -0.19511898, 0.0075454637, -0.01890476, -0.14239742, 0.18921931, 0.033990458, 0.31306365, -0.006998358, 0.029190077, -0.005679954, -0.15341778, 0.07766778, -0.25691047, -0.0964161) * go_2(0.0, 1.0);\n    result += mat4(0.019746238, 0.0021332854, -0.00879096, -0.1338671, -0.0001600663, -0.29465106, 0.0867611, -0.114963025, 0.07874301, -0.012734178, -0.11124061, -0.010926616, -0.04941506, -0.07516841, 0.116663, -0.29018974) * go_2(1.0, -1.0);\n    result += mat4(-0.01651721, 0.05955898, 0.023618208, 0.098695934, 0.018553663, -0.054378513, 0.1436929, 0.1693743, -0.27483663, 0.029127488, 0.09619316, -0.06109113, -0.08619361, 0.09315214, -0.02478657, 0.18544984) * go_2(1.0, 0.0);\n    result += mat4(0.09570196, -0.016528936, -0.1559397, 0.14312246, 0.04029428, 0.08773151, -0.043646842, 0.17894371, -0.082413055, 0.0027082344, -0.100171275, 0.01547501, 0.18122818, -0.11933676, 0.26404107, -0.3169703) * go_2(1.0, 1.0);\n    result += mat4(-0.12073344, 0.08683522, -0.09249099, 0.058786053, -0.14480567, -0.121013954, 0.033335857, 0.009353379, -0.055087596, -0.13002734, 0.08890566, 0.05508963, -0.0075715426, -0.15936922, -0.03968994, -0.1690259) * go_3(-1.0, -1.0);\n    result += mat4(0.2011206, 0.23898427, 0.23656492, 0.1287573, 0.14850396, 0.40532517, -0.107408255, 0.40119782, 0.099813245, -0.03830304, 0.101520434, -0.026478073, -0.048469637, 0.106440455, 0.056632314, -0.17825997) * go_3(-1.0, 0.0);\n    result += mat4(-0.076735444, 0.05965795, -0.0052469415, -0.21785147, 0.11887833, 0.067560315, 0.051149055, 0.23626682, -0.1297049, -0.035512198, 0.20352256, -0.025064934, 0.04958706, 0.0454198, 0.0113334535, 0.0417486) * go_3(-1.0, 1.0);\n    result += mat4(-0.09055751, 0.033915352, -0.21836667, 0.22006813, -0.099022895, 0.11720966, -0.15686816, -0.13586599, -0.094427735, -0.08831514, -0.06182928, 0.09213704, -0.03642064, 0.18129414, -0.012926811, 0.12179882) * go_3(0.0, -1.0);\n    result += mat4(0.19389409, 0.09512252, 0.14768016, -0.16623649, -0.031052284, -0.026814984, 0.106168024, -0.2026781, -0.04581419, -0.0016849053, -0.04101923, 0.038959503, -0.011938445, 0.20096186, -0.26666564, 0.4824324) * go_3(0.0, 0.0);\n    result += mat4(0.17727576, 0.07309147, 0.12131863, -0.163096, 0.17225246, 0.26256254, 0.27685758, 0.09094053, 0.029605515, -0.20217367, 0.047564875, 0.043115832, 0.15089568, -0.09670934, 0.24131384, 0.03337442) * go_3(0.0, 1.0);\n    result += mat4(-0.34192136, 0.12063195, -0.31159517, 0.04170889, -0.30147067, -0.21330686, -0.1514457, -0.121126845, 0.04409098, 9.2206596e-05, 0.027680017, 0.03230512, -0.27993527, -0.093485355, 0.07568645, -0.23585452) * go_3(1.0, -1.0);\n    result += mat4(0.0537712, -0.20847629, 0.1740093, -0.013894753, -0.32719997, -0.059484575, -0.006098233, -0.10336451, -0.14706188, -0.07424865, -0.07045905, 0.17093194, -0.22147557, 0.09086218, -0.11033544, -0.05306482) * go_3(1.0, 0.0);\n    result += mat4(0.00489003, -0.11509064, -0.021005848, 0.16637677, -0.089347586, 0.17545725, -0.17313693, 0.13742085, -0.14577347, 0.07951095, -0.092139855, 0.017118992, -0.053472433, 0.079414465, 0.0330263, -0.11189824) * go_3(1.0, 1.0);\n    result += vec4(-0.034743138, 0.012946433, -0.082333155, 0.07721756);\n    return result;\n}\n//!DESC Anime4K-v4.0-Restore-CNN-(VL)-Conv-4x3x3x16\n//!HOOK MAIN\n//!BIND conv2d_3_tf\n//!BIND conv2d_3_tf1\n//!SAVE conv2d_4_tf1\n//!WIDTH conv2d_3_tf.w\n//!HEIGHT conv2d_3_tf.h\n//!COMPONENTS 4\n#define go_0(x_off, y_off) (max((conv2d_3_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max((conv2d_3_tf1_texOff(vec2(x_off, y_off))), 0.0))\n#define go_2(x_off, y_off) (max(-(conv2d_3_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_3(x_off, y_off) (max(-(conv2d_3_tf1_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(-0.25835788, 0.050451655, -0.1845038, -0.07232528, 0.1323318, 0.26276684, 0.10842882, -0.083056524, 0.17426784, -0.3594826, 0.2728965, 0.08388844, -0.004007842, 0.020535901, -0.051425606, 0.07750436) * go_0(-1.0, -1.0);\n    result += mat4(-0.11410436, 0.014572361, -0.27057216, -0.023974562, 0.05234827, 0.15328228, -0.17502303, -0.3199359, 0.12188045, -0.095813684, 0.024145132, 0.0856916, -0.027453909, -0.043129764, 0.16971985, 0.021623038) * go_0(-1.0, 0.0);\n    result += mat4(0.06611095, 0.038625732, -0.13717118, -0.04497733, 0.15213469, 0.04770935, 0.0729271, -0.062052976, 0.004571303, 0.035141192, -0.059409596, 0.044652313, 0.17520894, 0.09665589, -0.1479193, 0.06528058) * go_0(-1.0, 1.0);\n    result += mat4(-0.1845968, 0.091479465, -0.09394898, -0.13545018, -0.029501775, -0.21426639, 0.09255898, 0.1257644, 0.20256902, 0.06267267, 0.10378081, 0.13494423, 0.058310498, 0.03642236, -0.16268995, -0.048100803) * go_0(0.0, -1.0);\n    result += mat4(0.2155119, -0.3683131, 0.049449228, -0.20559964, -0.11761922, -0.2518804, -0.020712897, 0.12895772, -0.07543782, 0.5805017, -0.11301444, -0.038493153, -0.06710986, -0.09321189, 0.108671665, -0.03259695) * go_0(0.0, 0.0);\n    result += mat4(0.035307787, 0.108389005, -0.27493554, 0.27029404, 0.25523573, -0.28636125, -0.20766719, -0.008661457, -0.004480811, -0.046390545, -0.16221444, 0.008979624, -0.061375532, 0.035076566, -0.018924266, 0.01380219) * go_0(0.0, 1.0);\n    result += mat4(-0.051922515, -0.12463486, -0.10383422, 0.02220095, -0.1573033, 0.13980615, 0.13248625, -0.16803266, -0.0692132, -0.21552645, 0.13744529, 0.23034313, 0.0052666534, 0.028977966, 0.07720251, -0.06477756) * go_0(1.0, -1.0);\n    result += mat4(-0.14097473, 0.2770271, -0.172289, -0.03000696, -0.028684044, 0.040578447, -0.2290285, 0.082329154, -0.042402364, -0.20926563, 0.08233207, 0.11862443, -0.07038536, -0.02273004, 0.091550544, -0.065856494) * go_0(1.0, 0.0);\n    result += mat4(0.14879914, -0.023923844, -0.23569296, 0.20306346, 0.17502785, 0.28776234, -0.2788995, 0.10012439, -0.05635638, -0.025840463, 0.09222198, 0.118032, 0.08057015, 0.1286071, 0.060189806, -0.052669708) * go_0(1.0, 1.0);\n    result += mat4(0.07076086, -0.15111323, -0.07427972, 0.008372168, -0.17791592, -0.16254742, 0.013961132, -0.0944912, -0.23380096, 0.17377278, -0.09683394, 0.019931393, -0.12042098, 0.0016406325, 0.09393333, -0.06882231) * go_1(-1.0, -1.0);\n    result += mat4(0.21465093, 0.04142968, 0.06840044, -0.37831602, -0.05549571, 0.044905066, -0.07873589, -0.026804, -0.34764197, 0.022487951, -0.077293746, 0.089457795, -0.110094436, 0.24233972, 0.06285107, -0.10851744) * go_1(-1.0, 0.0);\n    result += mat4(0.093270175, 0.084138945, 0.03938272, 0.063565865, -0.010733802, 0.13554469, -0.06650261, 0.033002816, 0.011187271, -0.12821455, 0.20785914, -0.030438649, -0.124710515, -0.022294303, 0.09732408, 0.057609864) * go_1(-1.0, 1.0);\n    result += mat4(-0.12833868, 0.021577539, -0.02700365, 0.11799592, -0.03655647, -0.04225167, 0.11049353, -0.16036157, 0.049277548, -0.033842396, 0.10020137, 0.095509745, 0.08060231, -0.09237418, -0.035598125, -0.035926737) * go_1(0.0, -1.0);\n    result += mat4(-0.32829186, 0.3492363, 0.030671779, -0.12606762, 0.010437313, 0.2757115, -0.21517593, -0.15800527, -0.12592544, -0.20578934, 0.10444053, 0.12993255, -0.046079267, 0.03834173, -0.19277227, -0.22124454) * go_1(0.0, 0.0);\n    result += mat4(-0.052546192, 0.026082167, 0.13831234, 0.10982424, 0.012946818, -0.12439852, 0.10134106, -0.10050398, -0.04472338, -0.14325236, -0.20579574, 0.0044005127, 0.22013672, -0.32955512, 0.12404084, -0.008160738) * go_1(0.0, 1.0);\n    result += mat4(-0.10774314, -0.31650826, -0.06601711, 0.19635755, -0.12622592, -0.06396423, 0.13856032, 0.16540553, 0.021387719, 0.23377723, -0.053738154, -0.1000186, -0.08338395, -0.052813534, 0.008122962, 0.13732094) * go_1(1.0, -1.0);\n    result += mat4(-0.18270823, 0.06966014, -0.17788303, -0.27303055, -0.077971615, 0.013978423, -0.02039098, 0.12715338, -0.11924171, 0.18900296, -0.085199654, 0.215198, 0.18587974, -0.009749325, 0.0173584, -0.12018259) * go_1(1.0, 0.0);\n    result += mat4(0.052129295, -0.107416354, 0.12711766, 0.03708665, -0.14369462, -0.055359814, -0.16639823, -0.045143317, -0.06925672, -0.040696755, 0.01999809, -0.016040625, -0.02484878, 0.07417094, 0.050875198, 0.2145528) * go_1(1.0, 1.0);\n    result += mat4(0.055696912, -0.16680926, -0.021987487, 0.024941636, -0.0927883, 0.022136632, 0.033782948, -0.10646058, -0.14944647, 0.25457275, 0.046682496, -0.022462368, -0.07886781, 0.08165927, 0.06848105, 0.0063734027) * go_2(-1.0, -1.0);\n    result += mat4(0.037053242, 0.033215813, 0.18291366, 0.12340375, 0.08491059, -0.28442004, -0.0127422465, -0.039834313, -0.23321372, 0.26676926, -0.05636355, -0.15672484, -0.12891728, -0.15486577, -0.032004442, -0.092745155) * go_2(-1.0, 0.0);\n    result += mat4(0.015779478, -0.18457565, 0.24996394, 0.036197674, 0.15694007, 0.15863103, -0.07332398, 0.0016235278, -0.15536517, -0.056062788, 0.14102836, 0.16915025, -0.08001087, 0.07073164, 0.13796777, 0.123867124) * go_2(-1.0, 1.0);\n    result += mat4(0.045792986, -0.15135059, -0.1354885, -0.043678258, -0.35655212, 0.51232076, -0.12816145, -0.046569496, -0.014127674, -0.06282611, -0.098873, -0.06359104, -0.0919222, 0.11822437, 0.079254694, 0.00579688) * go_2(0.0, -1.0);\n    result += mat4(-0.15683417, 0.61610246, -0.3024612, 0.12917964, -0.09303367, 0.23612969, -0.40842506, -0.12374661, -0.07572449, -0.2613284, -0.09970177, -0.015227848, 0.106239066, -0.21411185, 0.051998455, -0.1364518) * go_2(0.0, 0.0);\n    result += mat4(0.23850034, -0.14394449, -0.0031468747, -0.2380617, -0.027200876, -0.041352056, -0.01864445, 0.033848196, -0.12064239, -0.110480845, 0.08450956, -0.22328654, 0.17664163, 0.22268307, 0.050886698, -0.17475672) * go_2(0.0, 1.0);\n    result += mat4(-0.17808256, 0.010803805, 0.03315186, 0.033143792, -0.14205995, 0.25039625, -0.08784382, -0.13454252, 0.19576813, 0.10755282, 0.22821628, 0.019456752, -0.0422955, -0.016182603, -0.12066697, 0.0548465) * go_2(1.0, -1.0);\n    result += mat4(0.11563777, -0.257929, 0.0010403778, 0.080267854, -0.0025255163, 0.2855168, -0.060352214, -0.07816255, -0.00090574916, 0.049510725, 0.03720483, 0.059250016, -0.08674136, 0.20522198, -0.28694284, 0.1299507) * go_2(1.0, 0.0);\n    result += mat4(-0.14638457, 0.04063328, 0.03139636, -0.007934521, 0.07689684, -0.09467145, 0.10607347, 0.054510128, 0.003306194, 0.05347124, 0.062762424, -0.041480847, -0.07677865, -0.139573, 0.010972524, 0.21957156) * go_2(1.0, 1.0);\n    result += mat4(-0.026845628, -0.043439507, 0.034738723, 0.07281683, 0.14474197, 0.031586993, -0.22767854, -0.0707655, 0.105201736, -0.28805482, 0.008668302, -0.16329518, 0.06157049, 0.3803886, 0.26345953, -0.011096537) * go_3(-1.0, -1.0);\n    result += mat4(-0.23328833, 0.085731484, -0.07755016, 0.33559516, 0.07704345, 0.115106605, -0.24114038, -0.44630137, 0.2726737, -0.32170138, -0.009236524, -0.11666051, 0.0457048, 0.07876708, 0.13134004, -0.035318643) * go_3(-1.0, 0.0);\n    result += mat4(-0.05140272, 0.011605703, 0.13899171, -0.05071015, 0.18413687, -0.31413674, -0.13043414, -0.15118152, -0.15326938, -0.10720126, -0.23738635, 0.13481396, 0.25115076, -0.009316611, -0.2584441, -0.14389823) * go_3(-1.0, 1.0);\n    result += mat4(-0.039723795, -0.14869407, -0.1692942, 0.026501274, -0.10685166, -0.121267825, -0.08584318, -0.09580693, -0.10626739, -0.068417974, 0.11321909, -0.13664317, 0.061380867, -0.2587898, 0.14850819, 0.008178645) * go_3(0.0, -1.0);\n    result += mat4(0.06912782, 0.24230564, -0.048150286, 0.2203717, -0.17417085, 0.105546735, -0.16648416, -0.0045053074, 0.09764028, 0.37122592, -0.1939995, -0.27899942, -0.088152565, -0.53869057, 0.21676709, -0.08056594) * go_3(0.0, 0.0);\n    result += mat4(0.07651754, 0.03704878, -0.0197015, 0.1660726, 0.07002748, -0.11820414, -0.23360898, 0.1481592, 0.029847002, 0.054057185, 0.013176299, 0.06552942, -0.13865773, -0.20105527, -0.37550658, 0.005769631) * go_3(0.0, 1.0);\n    result += mat4(-0.22697811, -0.17426412, 0.10148018, 0.008134666, 0.10771455, 0.16943407, -0.016319012, -0.40176705, -0.06854668, -0.049045276, 0.20919096, 0.13240765, -0.050125647, 0.14902508, 0.052697595, -0.13817468) * go_3(1.0, -1.0);\n    result += mat4(0.04301619, 0.23184754, -0.023551717, 0.3768405, 0.028999053, 0.06709736, -0.05993663, -0.059861984, 0.15499207, -0.22217415, 0.111131504, -0.09082529, -0.19389243, 0.024621522, -0.15305442, 0.010799284) * go_3(1.0, 0.0);\n    result += mat4(-0.035496738, 0.010802548, -0.028718363, 0.19263634, 0.16900502, -0.16661702, -0.027631328, 0.18309957, -0.015860107, -0.03309961, -0.091390446, 0.14000848, -0.0036591904, 0.47659522, -0.09373507, -0.29020965) * go_3(1.0, 1.0);\n    result += vec4(0.08895955, -0.027667087, 0.20500831, 0.00037762933);\n    return result;\n}\n//!DESC Anime4K-v4.0-Restore-CNN-(VL)-Conv-4x3x3x16\n//!HOOK MAIN\n//!BIND conv2d_4_tf\n//!BIND conv2d_4_tf1\n//!SAVE conv2d_5_tf\n//!WIDTH conv2d_4_tf.w\n//!HEIGHT conv2d_4_tf.h\n//!COMPONENTS 4\n#define go_0(x_off, y_off) (max((conv2d_4_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max((conv2d_4_tf1_texOff(vec2(x_off, y_off))), 0.0))\n#define go_2(x_off, y_off) (max(-(conv2d_4_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_3(x_off, y_off) (max(-(conv2d_4_tf1_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(0.018134737, -0.2296755, -0.07276725, -0.029795367, 0.05382051, 0.092847414, -0.024469728, -0.1674685, 0.0017946451, 0.30074653, 0.0034195695, -0.04892261, 0.18229689, -0.20116119, -0.12702174, -0.08259108) * go_0(-1.0, -1.0);\n    result += mat4(-0.1357695, -0.08149211, 0.09314453, -0.21966846, 0.34740716, 0.043606415, 0.04225903, 0.034449834, 0.17248215, 0.39148283, -0.13868807, -0.010550686, 0.044238456, -0.09693464, -0.005044985, 0.24383289) * go_0(-1.0, 0.0);\n    result += mat4(0.19959371, 0.098685324, 0.058746945, 0.010580748, 0.08051514, 0.031898864, 0.017556064, 0.13004355, -0.01727653, 0.11044019, 0.040673427, -0.20064595, -0.23321067, 0.06398686, -0.19126236, -0.2430858) * go_0(-1.0, 1.0);\n    result += mat4(-0.12870286, -0.113455534, 0.23722827, 0.070718594, 0.19049989, -0.1927299, -0.06343845, 0.113127775, 0.082530305, -0.10972526, -0.090779535, 0.05731582, 0.11018802, -0.18049154, 0.09269507, -0.10304576) * go_0(0.0, -1.0);\n    result += mat4(0.15513484, 0.06659583, 0.08125296, -0.012350324, -0.09492788, 0.5048303, 0.13206847, 0.39554298, 0.28953737, -0.20913891, -0.26781562, -0.17539899, 0.023778774, 0.29716817, 0.15768486, 0.37702608) * go_0(0.0, 0.0);\n    result += mat4(0.0724462, 0.015571356, -0.032217246, 0.0050658924, -0.22708446, 0.03968809, 0.016753826, 0.0025668752, -0.055932112, 0.113931604, 0.19766758, -0.030027265, -0.17384295, 0.15013468, -0.0070017707, -0.09469028) * go_0(0.0, 1.0);\n    result += mat4(-0.078361556, -0.0954201, -0.006358101, 0.040500037, 0.4190454, -0.17622913, -0.07234791, 0.05462559, 0.18641087, 0.058313597, -0.0180785, 0.13818781, -0.14640772, 0.0699486, 0.0073663946, -0.076789856) * go_0(1.0, -1.0);\n    result += mat4(-0.21421191, 0.08736062, 0.09041226, 0.03608585, 0.02769972, 0.09641289, 0.11824623, 0.05653645, 0.16464607, 0.19839554, -0.13379547, 0.054417104, 0.067530684, 0.18971571, 0.13785432, -0.097639814) * go_0(1.0, 0.0);\n    result += mat4(-0.32658005, -0.14606023, -0.069448665, 0.032998275, -0.28331423, 0.0011900732, -0.020304207, -0.13535896, 0.08298347, 0.045509677, -0.030503955, -0.037504148, 0.049955815, 0.0925771, 0.00058534974, -0.12398032) * go_0(1.0, 1.0);\n    result += mat4(-0.2955836, 0.29059318, -0.018196672, -0.35866606, -0.01309431, 0.03540315, 0.010609202, 0.11956812, 0.10296229, 0.22536302, 0.015201129, -0.23797737, -0.16960852, -0.11414787, -0.034440614, 0.112644605) * go_1(-1.0, -1.0);\n    result += mat4(-0.14952518, 0.07024436, -0.083184876, -0.0814617, -0.13303639, 0.016159372, -0.13521518, 0.2221334, -0.056617837, 0.12958299, 0.064461656, -0.20146395, -0.16023181, 0.2640758, 0.27528805, -0.1426518) * go_1(-1.0, 0.0);\n    result += mat4(-0.04382363, 0.09856003, -0.08561442, -0.15699928, -0.121069774, 0.04685383, -0.009170197, -0.031489655, 0.18730178, 0.238442, 0.22497098, 0.032015145, -0.03709115, 0.1535079, 0.21674158, 0.10678019) * go_1(-1.0, 1.0);\n    result += mat4(-0.12200952, 0.24224263, 0.034097504, -0.028179523, -0.011962496, -0.04489487, -0.05198827, 0.22194928, -0.045400873, -0.049828544, 0.111477956, -0.098361604, 0.12788995, -0.016093334, -0.19886433, -0.011161484) * go_1(0.0, -1.0);\n    result += mat4(0.30563712, 0.013071727, -0.004799883, 0.12888052, -0.259498, -0.041566677, 0.07311124, 0.162324, 0.28371668, -0.004693743, -0.0019395344, 0.029358242, 0.08730285, 0.12184509, 0.05508437, 0.048439097) * go_1(0.0, 0.0);\n    result += mat4(0.12760857, 0.115813166, -0.217695, -0.10629871, -0.227366, 0.09030426, -0.15313712, 0.020528946, -0.20743734, 0.088583544, 0.04594053, -0.22891994, 0.18949282, -0.042186577, -0.17330512, -0.010711361) * go_1(0.0, 1.0);\n    result += mat4(0.029503195, 0.0063797613, -0.17004286, -0.096844055, 0.010218098, 0.04247233, 0.02362808, 0.14700809, -0.08082364, 0.11159672, -0.018505255, -0.15228583, 0.15693732, -0.025359154, 0.024829186, 0.1943192) * go_1(1.0, -1.0);\n    result += mat4(-0.03912932, -0.21989027, 0.12203028, 0.18702275, -0.118537985, 0.21039696, 0.09102061, 0.012288879, 0.031666897, 0.1318455, -0.04901404, -0.07516063, -0.44782668, 0.04884501, 0.047070876, 0.008728358) * go_1(1.0, 0.0);\n    result += mat4(-0.08669101, 0.3053463, -0.08963947, 0.0034188698, -0.070004664, 0.064788476, 0.093737036, 0.070050925, 0.12728429, -0.13179256, -0.014913502, 0.09308136, -0.027638942, 0.008638711, 0.08794172, -0.05531093) * go_1(1.0, 1.0);\n    result += mat4(0.0728421, 0.07872358, 0.11454748, 0.08497922, 0.071820416, -0.11789207, -0.08184197, 0.1359588, -0.2143346, -0.05876081, 0.023172129, -0.08430511, -0.19276723, 0.14283359, 0.15604696, -0.055187486) * go_2(-1.0, -1.0);\n    result += mat4(0.068641685, 0.2732106, -0.2809107, 0.12736696, -0.08642367, 0.023898933, -0.17859498, -0.18299665, -0.06684587, -0.12204666, 0.45898953, -0.24240111, 0.25182098, -0.04395751, 0.10637211, -0.22135144) * go_2(-1.0, 0.0);\n    result += mat4(0.0852072, 0.051133018, 0.03333165, -0.0008938216, 0.10251267, 0.0550774, 0.041769378, -0.21259712, 0.286912, 0.123342015, 0.282759, -0.0730124, 0.14275575, -0.15580742, -0.15224406, 0.045376908) * go_2(-1.0, 1.0);\n    result += mat4(0.03328225, 0.11563978, -0.07451964, 0.030546209, -0.04698351, -0.18544962, 0.037350416, 0.13969816, 0.0556746, -0.06359919, 0.06478219, -0.031694926, 0.13396506, 0.09443612, -0.01922686, -0.06290365) * go_2(0.0, -1.0);\n    result += mat4(0.07495407, 0.063429266, -0.106221214, -0.085107304, 0.2497817, -0.46598253, -0.18833177, -0.2731128, -0.13024822, 0.56053543, 0.055704467, -0.12331414, -0.031199086, 0.05061188, 0.22097112, -0.6611177) * go_2(0.0, 0.0);\n    result += mat4(0.08276988, -0.044184342, -0.03562185, -0.06159881, 0.27694225, -0.07192965, -0.08663714, 0.020221777, 0.14095962, -0.06229397, 0.051374253, -0.038158998, 0.10664802, -0.041305423, 0.051260717, -0.054698635) * go_2(0.0, 1.0);\n    result += mat4(0.12800686, 0.03485072, 0.039914366, 0.034041498, -0.08305794, -0.046292894, 0.22765331, 0.10904922, 0.0013937047, -0.08750301, 0.009126207, -0.065589435, 0.2837707, 0.08884436, -0.07234862, -0.093502745) * go_2(1.0, -1.0);\n    result += mat4(0.113439895, 0.06081726, 0.1122302, -0.022936966, 0.10329637, -0.31816107, -0.051597945, 0.23846027, -0.083913095, -0.29872265, -0.040147282, -0.08981918, -0.04329814, -0.12339693, -0.034489952, 0.013393211) * go_2(1.0, 0.0);\n    result += mat4(0.33091688, 0.1726297, 0.034332044, -0.091396205, 0.15434311, -0.0022870845, -0.15506189, 0.08710491, -0.16063525, 0.042252056, 0.017086457, 0.08134797, 0.08631321, 0.037843138, 0.088296555, 0.0064518084) * go_2(1.0, 1.0);\n    result += mat4(0.09161051, 0.114355795, -0.15304486, -0.030537153, 0.1835368, -0.3287635, 0.031197926, 0.09717476, 0.04276852, 0.113250345, 0.05949038, -0.10599563, 0.43574792, -0.060788117, 0.18409383, 0.12678055) * go_3(-1.0, -1.0);\n    result += mat4(-0.018356865, -0.0072578182, 0.12020777, -0.013127592, 0.20136636, -0.22984362, 0.06896224, 0.00044982752, 0.008428429, -0.123316936, -0.09989286, 0.078248784, -0.16313677, -0.003020313, -0.46285018, -0.08967125) * go_3(-1.0, 0.0);\n    result += mat4(-0.03451497, -0.10864502, 0.13207638, 0.17194521, 0.0037514758, -0.20222199, -0.12535086, 0.001511977, 0.056294486, -0.2112898, 0.078261316, 0.10118746, -0.044742294, 0.21793383, -0.19927903, -0.21338293) * go_3(-1.0, 1.0);\n    result += mat4(-0.034903776, -0.10167085, 0.031066334, 0.0379958, 0.20532596, -0.17457838, 0.16556816, -0.0021619152, 0.02682665, 0.03396325, -0.059273884, 0.1922813, -0.072151475, -0.010240544, 0.2302027, 0.12385962) * go_3(0.0, -1.0);\n    result += mat4(-0.20170145, -0.08203941, -0.028107846, -0.18003726, 0.44744352, -0.13190243, 0.13233365, 0.03626546, 0.085763134, -0.25613126, -0.11213388, 0.15529087, -0.271649, 0.050587676, -0.062583975, 0.057289865) * go_3(0.0, 0.0);\n    result += mat4(-0.040649455, -0.17949733, 0.35847965, -0.040587306, 0.24314344, -0.23811667, 0.13958354, 0.04961874, 0.09858903, -0.04202913, -0.21850993, 0.0700419, -0.09130745, -0.096835814, 0.0022782686, -0.25416258) * go_3(0.0, 1.0);\n    result += mat4(-0.08215545, -0.019647893, 0.055263475, 0.053733055, 0.098485716, -0.1041945, -0.06541415, -0.08868577, -0.07262986, 0.03513784, -0.110529095, -0.03369232, 0.056786604, 0.2569229, -0.05931065, -0.22081214) * go_3(1.0, -1.0);\n    result += mat4(0.066926084, 0.029664058, -0.10779271, 0.11026963, 0.23927264, -0.16914488, 0.022947345, 0.12303853, -0.07066212, -0.013205378, 0.15348643, 0.035568032, 0.20966691, 0.010149819, -0.08814468, -0.064854674) * go_3(1.0, 0.0);\n    result += mat4(0.11493852, -0.074924305, -0.14840698, -0.16956823, 0.056806292, -0.06387947, -0.06880271, -0.04637334, -0.1929893, 0.18226422, 0.064644486, -0.1594863, 0.027403917, 0.13951495, -0.06569123, -0.07700207) * go_3(1.0, 1.0);\n    result += vec4(-0.043347504, -0.20504741, -0.037821215, -0.014486937);\n    return result;\n}\n//!DESC Anime4K-v4.0-Restore-CNN-(VL)-Conv-4x3x3x16\n//!HOOK MAIN\n//!BIND conv2d_4_tf\n//!BIND conv2d_4_tf1\n//!SAVE conv2d_5_tf1\n//!WIDTH conv2d_4_tf.w\n//!HEIGHT conv2d_4_tf.h\n//!COMPONENTS 4\n#define go_0(x_off, y_off) (max((conv2d_4_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max((conv2d_4_tf1_texOff(vec2(x_off, y_off))), 0.0))\n#define go_2(x_off, y_off) (max(-(conv2d_4_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_3(x_off, y_off) (max(-(conv2d_4_tf1_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(0.047881734, -0.09396414, -0.2839081, 0.3140853, 0.052613556, 0.09940423, 0.23960467, -0.022228222, -0.12065009, 0.07898222, 0.08657881, 0.010852739, -0.050450284, 0.01683982, 0.031813968, 0.053060856) * go_0(-1.0, -1.0);\n    result += mat4(-0.10252411, -0.03116448, -0.30114275, -0.0316799, -0.017501019, -0.03006003, -0.2095696, 0.10134927, -0.3901916, -0.15335023, -0.11955071, 0.1337449, 0.101239376, -0.25044814, 0.2128469, 0.018979514) * go_0(-1.0, 0.0);\n    result += mat4(-0.13392173, 0.052036732, 0.1682114, -0.026263753, 0.027221246, -0.15121374, 0.13723798, 0.08950682, -0.1182108, -0.07294226, 0.023392374, 0.052329235, -0.05632852, -0.07036173, 0.06872573, 0.05238042) * go_0(-1.0, 1.0);\n    result += mat4(0.18112028, 0.18242362, -0.06812871, 0.032463413, 0.124638766, -0.26765212, -0.07678663, 0.33806562, 0.09674393, 0.15574542, 0.23634006, -0.02873782, -0.1626769, -0.14760062, -0.007274849, 0.09866139) * go_0(0.0, -1.0);\n    result += mat4(-0.10726673, -0.10925056, 0.19967109, -0.19936769, 0.15942842, -0.14870064, 0.15493345, -0.08489036, -0.49053356, -0.17321263, 0.28426084, 0.18721215, -0.09898434, -0.2751838, -0.11833524, 0.028445128) * go_0(0.0, 0.0);\n    result += mat4(-0.11788817, -0.23724948, -0.046072144, 0.035621114, 0.04527003, -0.0073492974, 0.11097195, 0.06806836, 0.04814677, -0.1408476, -0.1325629, 0.00929532, -0.16699041, -0.03034791, 0.08320368, -0.15429299) * go_0(0.0, 1.0);\n    result += mat4(0.2729515, 0.008244692, -0.17441982, -0.39026466, 0.17381759, 0.31194404, 0.055934936, 0.20744409, 0.20119062, 0.0734271, 0.0796807, 0.0031037466, -0.0016392237, 0.033733975, 0.07149338, 0.042083208) * go_0(1.0, -1.0);\n    result += mat4(0.07985744, 0.10945015, 0.018472541, 0.1397503, 0.2005682, 0.42641, 0.23022486, -0.2916921, 0.028285174, -0.31885162, -0.27070364, -0.10390779, 0.0751492, 0.12752363, -0.2279459, 0.08998453) * go_0(1.0, 0.0);\n    result += mat4(0.18450491, -0.140783, -0.008006845, 0.09029298, 0.12536179, 0.26949662, 0.09491545, 0.063907005, 0.11212244, 0.09778506, -0.1835966, -0.053119674, 0.0072294096, 0.25018227, 0.010868525, -0.22721334) * go_0(1.0, 1.0);\n    result += mat4(-0.028011927, -0.20073172, 0.5976166, -0.19494139, 0.17958745, -0.03838646, 0.058325976, -0.29409218, -0.12793432, 0.03245129, 0.35662368, -0.05048354, -0.13368197, -0.06151968, -0.012714591, -0.1763054) * go_1(-1.0, -1.0);\n    result += mat4(0.18468465, 0.31682113, 0.12818255, -0.117110476, 0.13709468, -0.10034022, -0.07994527, -0.1259309, 0.04067299, -0.1147398, 0.28361055, 0.27916273, 0.03696692, 0.16829546, 0.27819383, 0.08305029) * go_1(-1.0, 0.0);\n    result += mat4(-0.28920117, -0.033877946, 0.01586206, 0.04681198, 0.024248574, -0.045777842, -0.03342128, 0.07525412, -0.063377544, -0.016737273, 0.11235511, -0.04325238, -0.24170023, -0.09993599, -0.03205371, 0.14339828) * go_1(-1.0, 1.0);\n    result += mat4(-0.008357902, -0.11038377, 0.03709221, 0.26775306, 0.07963845, -0.25377446, -0.17630441, -0.10966474, 0.057311732, -0.083327, 0.044497233, 0.06903858, -0.26531395, -0.103399664, -0.14806591, 0.269314) * go_1(0.0, -1.0);\n    result += mat4(0.05450808, -0.041993964, -0.07217651, 0.034468375, 0.2117634, 0.0075620585, 0.05825411, -0.2252478, -0.0527787, 0.049732126, -0.032040413, -0.09361454, 0.29585132, 0.018413153, 0.18384546, -0.024226356) * go_1(0.0, 0.0);\n    result += mat4(-0.031109914, 0.19351351, 0.07405522, -0.06313074, -0.09983541, -0.011495182, 0.11749038, -0.16775608, 0.2790974, -0.09338754, 0.07913264, 0.103792936, -0.18679164, -0.15639925, 0.112943865, 0.07930375) * go_1(0.0, 1.0);\n    result += mat4(0.004106195, -0.036833283, 0.12908752, 0.12869535, -0.02472107, 0.17561707, -0.025890926, -0.18789047, 0.096218705, -0.16306408, -0.02198454, -0.010134957, -0.09710009, 0.002062143, -0.046785697, 0.0029441968) * go_1(1.0, -1.0);\n    result += mat4(0.19648251, -0.015663045, -0.0730215, 0.028611008, 0.13529862, -0.015256192, -0.04119306, -0.24628192, 0.02601027, -0.21184283, -0.1962902, 0.09109358, -0.06792383, 0.092336476, 0.12215351, -0.08596062) * go_1(1.0, 0.0);\n    result += mat4(-0.17530201, -0.0351919, -0.31872514, -0.13933206, -0.07000922, -0.049807087, 0.0010997375, -0.033573963, 0.07442056, -0.33290103, -0.40381998, 0.09435, -0.3280128, -0.09953127, -0.11283648, 0.20685865) * go_1(1.0, 1.0);\n    result += mat4(-0.052573867, -0.035328753, -0.11132943, -0.17515652, 0.05021051, 0.058642425, -0.046640664, 0.0799107, -0.027398815, -0.33619994, -0.22135767, 0.07894002, -0.14941697, -0.0940996, -0.11655085, 0.049795926) * go_2(-1.0, -1.0);\n    result += mat4(-0.039301276, 0.041062318, 0.20312686, -0.009338705, 0.013706282, -0.0245852, 0.03458311, 0.09601228, -0.18203016, -0.012260314, 0.17984508, -0.056576703, -0.102844186, 0.24047872, 0.05307189, 0.16066082) * go_2(-1.0, 0.0);\n    result += mat4(0.1478775, 0.0046362123, 0.05459521, 0.07162838, -0.01896149, 0.23700175, -0.14174299, 0.06988599, -0.32545477, -0.08065096, -0.061227743, -0.0010796773, 0.094327345, -0.20760082, -0.19523263, 0.19859222) * go_2(-1.0, 1.0);\n    result += mat4(-0.049676366, -0.10381536, 0.02546116, -0.13127093, 0.10954914, 0.0048147943, 0.06962328, -0.30456528, -0.11956627, 0.0150488885, -0.10711722, 0.1684613, -0.1939089, -0.10577047, -0.11980919, -0.036988296) * go_2(0.0, -1.0);\n    result += mat4(-0.054795764, 0.09491116, -0.08494948, 0.059765853, 0.0131597435, 0.20786162, 0.11999637, 0.024381055, 0.22830428, 0.027053319, -0.011646274, -0.12145409, -0.07899559, -0.012688263, 0.10684157, 0.3824219) * go_2(0.0, 0.0);\n    result += mat4(-0.23994572, -0.0031532666, -0.0050638164, 0.14236279, 0.05690383, -0.06259682, 0.052624144, 0.20461404, -0.19230312, -0.11072268, 0.013023965, 0.08931543, -0.21997221, 0.11760443, -0.40943825, 0.28656834) * go_2(0.0, 1.0);\n    result += mat4(-0.06606179, 0.26007771, 0.033754125, 0.119690455, 0.024669139, -0.06752839, 0.12688096, -0.0063201943, -0.17123021, 0.07548857, -0.14213699, 0.034093797, -0.15632647, -0.123243414, -0.42634043, 0.1715022) * go_2(1.0, -1.0);\n    result += mat4(-0.046503466, 0.13876389, 0.17973013, -0.25938338, -0.18824704, -0.11876702, 0.31065792, -0.041042212, -0.061369427, 0.2057992, 0.17295738, 0.3836555, -0.21109799, -0.10167118, 0.16577047, 0.113483034) * go_2(1.0, 0.0);\n    result += mat4(-0.24534856, -0.014482421, 0.22515748, -0.12773542, 0.12794174, -0.02528619, 0.41710484, 0.09154934, -0.17805946, -0.25428918, 0.07294183, 0.047079418, -0.30949152, -0.08919157, 0.17888431, 0.17706038) * go_2(1.0, 1.0);\n    result += mat4(-0.1741826, 0.046225294, -0.10761791, 0.2619953, 0.007373745, 0.05104337, -0.22309966, 0.34529984, -0.034363825, -0.022187237, -0.08609555, 0.16842419, 0.28136057, 0.17843607, -0.11307746, -0.05668021) * go_3(-1.0, -1.0);\n    result += mat4(-0.12310616, -0.29661375, -0.10581025, -0.049584012, 0.19651765, 0.08436489, -0.14533581, -0.029874112, -0.15422897, -0.062741704, -0.22694711, -0.15547274, -0.15181333, 0.0286061, 0.022438493, -0.062447168) * go_3(-1.0, 0.0);\n    result += mat4(0.3497046, -0.09455009, 0.060618952, -0.2134236, 0.054515295, 0.07451165, -0.09267233, -0.010513333, 0.13842636, 0.11563433, -0.054750167, 0.050432, 0.1514256, 0.04284002, -0.2095581, 0.07907657) * go_3(-1.0, 1.0);\n    result += mat4(-0.11745651, -0.04717057, 0.085377194, -0.065956995, 0.07280491, 0.2730059, 0.11088276, 0.2437957, 0.14018989, 0.1164107, -0.09516929, 0.0022427947, 0.111544006, -0.0680495, 0.09324579, -0.12482022) * go_3(0.0, -1.0);\n    result += mat4(-0.07995795, -0.03387884, 0.019846136, 0.10231208, -0.07017192, 0.18659039, 0.035161644, 0.101182766, -0.14901665, 0.21307294, 0.063894205, -0.27546507, -0.24792959, -0.067731075, 0.13146006, -0.19333683) * go_3(0.0, 0.0);\n    result += mat4(0.034206454, 0.1472648, -0.07406727, 0.014654025, 0.18703444, 0.1319857, -0.10610886, 0.08427947, -0.017536618, -0.06487879, -0.12095286, -0.050414838, 0.03260879, 0.1558894, -0.031887084, 0.11840288) * go_3(0.0, 1.0);\n    result += mat4(0.114811294, -0.14574333, -0.09392587, 0.042283528, 0.08919092, 0.18259068, 0.0980717, 0.21024778, -0.1280008, -0.027260462, -0.1129027, 0.18722472, 0.13733985, 0.047153983, 0.030871978, 0.1998385) * go_3(1.0, -1.0);\n    result += mat4(-0.06783575, 0.004612595, 0.1153467, -0.11531557, -0.048889533, 0.07673577, -0.02041786, 0.22744459, -0.13092506, 0.13484807, 0.40003043, -0.053706612, -0.16985156, -0.04791236, -0.052443005, -0.08363625) * go_3(1.0, 0.0);\n    result += mat4(0.18187882, 0.017893985, 0.17856054, 0.005413129, 0.014147176, 0.15102178, 0.12436294, -0.02176765, -0.16727823, -0.0364111, 0.17074408, 0.12899421, 0.31984514, -0.0072070034, 0.031895883, -0.1991405) * go_3(1.0, 1.0);\n    result += vec4(-0.011865144, 0.11717201, -0.13823777, -0.059450272);\n    return result;\n}\n//!DESC Anime4K-v4.0-Restore-CNN-(VL)-Conv-4x3x3x16\n//!HOOK MAIN\n//!BIND conv2d_5_tf\n//!BIND conv2d_5_tf1\n//!SAVE conv2d_6_tf\n//!WIDTH conv2d_5_tf.w\n//!HEIGHT conv2d_5_tf.h\n//!COMPONENTS 4\n#define go_0(x_off, y_off) (max((conv2d_5_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max((conv2d_5_tf1_texOff(vec2(x_off, y_off))), 0.0))\n#define go_2(x_off, y_off) (max(-(conv2d_5_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_3(x_off, y_off) (max(-(conv2d_5_tf1_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(-0.082203194, 0.021720003, 0.03725474, -0.08048348, 0.2063248, -0.033020593, -0.17585336, 0.06476272, 0.012244563, 0.026554609, 0.014708393, 0.26606125, 0.14248778, 0.12817341, -0.039826933, -0.12751861) * go_0(-1.0, -1.0);\n    result += mat4(0.24573852, 0.19695967, -0.06257417, -0.04782871, 0.3511875, -0.018083302, -0.077342674, 0.15247667, 0.20321761, -0.07479984, -0.09548503, 0.08109568, -0.23808748, 0.07246303, -0.004242619, 0.16162953) * go_0(-1.0, 0.0);\n    result += mat4(0.13296306, 0.19495387, 0.009222276, 0.033592198, 0.20443891, 0.16063854, -0.2581601, -0.016132578, -0.2296461, -0.23647323, -0.15407176, -0.18265317, 0.2343241, -0.049697313, -0.09398783, 0.41931856) * go_0(-1.0, 1.0);\n    result += mat4(-0.10866088, -0.40605694, -0.0042648134, 0.07943803, 0.26914695, 0.14816476, 0.037706107, -0.123223364, -0.19962949, -0.053534556, -0.08397409, -0.04244924, -0.075791344, 0.29629225, 0.2311928, 0.099177904) * go_0(0.0, -1.0);\n    result += mat4(-0.1748319, -0.2003186, -0.32659066, -0.21007413, 0.20122464, 0.032196607, -0.026299698, 0.33395135, 0.11411664, 0.05971959, 0.09001304, -0.15936212, 0.012322024, 0.19936106, -0.411186, -0.08319479) * go_0(0.0, 0.0);\n    result += mat4(-0.07349218, 0.006184436, 0.096199185, -0.050186496, 0.064047046, -0.03813128, -0.057007037, -0.025550695, -0.2863145, -0.008512981, -0.20615962, 0.18009211, 0.008298396, 0.22452813, 0.010843521, 0.20169461) * go_0(0.0, 1.0);\n    result += mat4(0.2691149, 0.059546687, 0.08922005, 0.2252196, 0.30341956, -0.024489028, 0.087045394, -0.03856442, -0.14083561, -0.17683443, 0.14137806, 0.15520614, 0.2073925, -0.19525874, 0.23661858, 0.3098405) * go_0(1.0, -1.0);\n    result += mat4(0.006530723, 0.04180736, -0.04762067, -0.064395495, 0.02396811, -0.13332283, 0.0037775645, 0.026309434, 0.0033065109, -0.08315753, 0.02917419, 0.12330464, 0.22819455, -0.07489677, 0.12829056, -0.097994626) * go_0(1.0, 0.0);\n    result += mat4(-0.09983759, 0.032783493, 0.11085758, 0.08993078, -0.057110567, -0.018973934, -0.14946178, -0.03921629, 0.039757587, 0.015860094, 0.04989561, -0.19634786, 0.04351146, 0.019315343, 0.25972188, 0.17989321) * go_0(1.0, 1.0);\n    result += mat4(-0.04111906, -0.165601, 0.0003682197, -0.056232415, -0.32716644, -0.24015541, -0.057547837, 0.05966729, 0.06854747, 0.03599213, -0.18798864, 0.1183447, 0.014268468, -0.1310834, 0.06415977, -0.19414157) * go_1(-1.0, -1.0);\n    result += mat4(-0.00070661673, 0.17671427, 0.10584568, -0.060910843, -0.104282066, -0.22676118, -0.01907062, 0.24882245, -0.043454725, 0.07691623, -0.48371696, 0.013537671, -0.025488405, 0.061228953, 0.18548754, 0.028671112) * go_1(-1.0, 0.0);\n    result += mat4(-0.0121596735, 0.09595702, -0.08244918, -0.1176173, 0.26773354, -0.021729136, 0.075465776, -0.0928876, 0.12461298, 0.16830076, -0.15302569, 0.113850676, 0.09811088, 0.13006307, 0.24999009, 0.10261325) * go_1(-1.0, 1.0);\n    result += mat4(-0.032246377, 0.038265374, -0.26476422, -0.1442876, -0.19866082, 0.08649541, 0.041478764, 0.11155026, 0.21576422, -0.09572912, -0.11174068, -0.19722937, -0.15801935, 0.29604745, -0.08606268, -0.15532136) * go_1(0.0, -1.0);\n    result += mat4(-0.06315591, 0.16151646, -0.009230362, -0.04341246, 0.09085519, 0.21924476, 0.38044852, 0.193819, 0.16622902, 0.0025134624, -0.22688466, -0.025276015, 0.07714917, 0.16302192, -0.11767101, -0.11086476) * go_1(0.0, 0.0);\n    result += mat4(-0.04170153, 0.001859292, -0.26352355, 0.10982333, -0.031867817, 0.15773517, -0.060263418, 0.11117763, -0.017359972, 0.0127261225, 0.0782802, -0.16908924, 0.080516845, -0.05691526, -0.07530135, -0.14553802) * go_1(0.0, 1.0);\n    result += mat4(0.06112685, -0.032287434, 0.17445667, -0.044935808, -0.11449107, -0.051394563, -0.029589338, -0.14555557, 0.03440661, 0.11035615, -0.17175, -0.14851089, 0.037362, -0.18740481, 0.17278154, 0.18073405) * go_1(1.0, -1.0);\n    result += mat4(-0.27670652, 0.19484822, 0.2609349, 0.1455016, 0.04438468, 0.1449185, 0.11185832, -0.18598269, -0.019846648, 0.11886126, -0.098498635, 0.15737785, 0.011406795, -0.18860829, -0.13705735, 0.17535745) * go_1(1.0, 0.0);\n    result += mat4(-0.30244905, -0.28695273, 0.1146976, 0.21144345, -0.037980128, -0.027679864, -0.13992494, -0.04884521, -0.032023884, -0.07921183, -0.16042095, -0.06935386, -0.06570237, -0.1107404, -0.018163798, 0.22625941) * go_1(1.0, 1.0);\n    result += mat4(-0.07292955, -0.07321777, -0.045146503, -0.33291966, -0.096732594, -0.07203495, 0.33692798, 0.2870733, 0.122160144, -0.076574564, 0.042844944, 0.26448342, 0.07672146, -0.028775277, -0.12088313, 0.15583947) * go_2(-1.0, -1.0);\n    result += mat4(0.21589327, 0.05258274, 0.09705794, -0.024653846, -0.039402515, 0.28485695, 0.14711736, -0.10556087, -0.15140481, 0.09039498, 0.017308712, 0.11862922, 0.08230978, 0.21678248, -0.043815188, -0.226433) * go_2(-1.0, 0.0);\n    result += mat4(-0.029258793, 0.26618922, 0.02564014, -0.23189862, -0.24074338, -0.18556763, 0.25973624, 0.04746873, 0.0137007125, -0.22239363, -0.12414957, 0.048228756, -0.22406264, 0.282667, -0.021001073, -0.17465611) * go_2(-1.0, 1.0);\n    result += mat4(0.32401654, -0.1495363, -0.20869227, 0.04271639, -0.0087802755, 0.031325378, 0.23834595, 0.039336167, 0.17265107, 0.20947595, 0.28737286, 0.0028783784, -0.057340365, -0.050347418, -0.11915604, -0.1831807) * go_2(0.0, -1.0);\n    result += mat4(0.1811338, 0.07732653, 0.20975596, -0.47129005, 0.07121942, 0.08410583, 0.44170937, -0.19524159, -0.17807977, 0.12837476, 0.20816846, -0.1741958, -0.04411918, 0.06024972, 0.18159702, -0.052485272) * go_2(0.0, 0.0);\n    result += mat4(-0.15229738, 0.27513, 0.28150418, -0.19543962, -0.02045864, -0.07207227, 0.09589587, 0.09110817, 0.061413247, 0.0046052113, 0.11619411, -0.2988938, 0.065739445, 0.10205611, 0.12847126, -0.028355654) * go_2(0.0, 1.0);\n    result += mat4(0.0657154, -0.047568597, -0.16148911, 0.16392621, -0.25281775, -0.061153214, 0.017480455, -0.026288848, 0.20319715, 0.04763355, 0.010444491, -0.26671803, -0.25821987, 0.32863674, -0.30734694, -0.18190521) * go_2(1.0, -1.0);\n    result += mat4(-0.042703815, 0.06633036, -0.048434302, -0.17176376, -0.12699759, -0.1124558, 0.083266065, 0.03354623, -0.13468939, 0.12706263, 0.053659134, -0.06930602, 0.008196115, 0.2034998, -0.06351442, -0.039730288) * go_2(1.0, 0.0);\n    result += mat4(0.09614661, 0.22500272, 0.088511504, -0.16960482, 0.15364788, -0.18854137, -0.13163191, -0.07503735, -0.23177068, -0.0053305267, -0.041978605, 0.0971947, -0.049034655, 0.04486706, 0.09076307, -0.02310868) * go_2(1.0, 1.0);\n    result += mat4(-0.1304683, 0.17743458, -0.09817326, -0.0646786, 0.07886976, 0.20109388, -0.034114968, -0.2029261, -0.03348398, 0.029337432, -0.07302782, -0.02240758, 0.030242773, -0.30032325, 0.02085572, -0.027314361) * go_3(-1.0, -1.0);\n    result += mat4(-0.037377544, 0.026350772, -0.07430488, -0.114671774, -0.126935, -0.046512567, -0.033628833, -0.19018382, -0.041053895, -0.031206857, 0.08562848, -0.01875709, 0.21099389, -0.092511, 0.0073047103, -0.009811013) * go_3(-1.0, 0.0);\n    result += mat4(0.11358029, 0.17468451, -0.12739041, -0.14332245, -0.22230148, 0.16862972, -0.04462456, 0.2469604, -0.008622369, 0.0081848325, -0.17032363, -0.16024362, 0.21178265, 0.037127133, 0.08559072, 0.11584694) * go_3(-1.0, 1.0);\n    result += mat4(0.008993893, -0.08037705, 0.4426555, 0.15593371, 0.15273719, -0.03249998, 0.055109, -0.1512612, -0.037183985, 0.20825677, -0.08516227, -0.06664223, -0.10011001, -0.3505215, -0.17941694, 0.052089088) * go_3(0.0, -1.0);\n    result += mat4(-0.109703645, -0.13505603, 0.1336451, 0.13118869, 0.010915504, 0.12748592, 0.21201555, -0.40841985, -0.11059143, 0.033772044, -0.039282143, 0.03095394, 0.10394723, -0.21343367, -0.10699851, -0.028351074) * go_3(0.0, 0.0);\n    result += mat4(0.019704714, 0.06243651, 0.09896519, -0.17492259, 0.012675787, -0.004239029, 0.21319824, 0.069183126, -0.0071114586, 0.123431124, -0.24479835, 0.00723795, -0.045293927, 0.014101029, 0.15746681, 0.042405806) * go_3(0.0, 1.0);\n    result += mat4(0.023828225, -0.0015190929, 0.1194638, 0.082163885, 0.10532113, 0.042044062, 0.02528007, 0.015175004, 0.026613194, 0.33525538, -0.1627064, -0.29887968, -0.197707, 0.038967777, -0.15811683, -0.106895216) * go_3(1.0, -1.0);\n    result += mat4(0.044362027, -0.04946742, -0.14815849, -0.17660522, -0.034201477, -0.012243106, -0.050183997, 0.06407372, 0.039822515, 0.15880872, -0.0672721, -0.4081093, 0.019489579, -0.060278706, -0.015096743, -0.07799167) * go_3(1.0, 0.0);\n    result += mat4(0.11861756, 0.27113584, -0.14107186, -0.10246008, -0.124051, -0.1627854, 0.10698585, 0.2846401, -0.061731786, 0.1724438, -0.12428688, -0.09986041, -0.034171514, -0.07100923, 0.041739646, -0.11308375) * go_3(1.0, 1.0);\n    result += vec4(-0.02981662, -0.26338395, -0.011632586, 0.15063232);\n    return result;\n}\n//!DESC Anime4K-v4.0-Restore-CNN-(VL)-Conv-4x3x3x16\n//!HOOK MAIN\n//!BIND conv2d_5_tf\n//!BIND conv2d_5_tf1\n//!SAVE conv2d_6_tf1\n//!WIDTH conv2d_5_tf.w\n//!HEIGHT conv2d_5_tf.h\n//!COMPONENTS 4\n#define go_0(x_off, y_off) (max((conv2d_5_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max((conv2d_5_tf1_texOff(vec2(x_off, y_off))), 0.0))\n#define go_2(x_off, y_off) (max(-(conv2d_5_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_3(x_off, y_off) (max(-(conv2d_5_tf1_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(0.17082009, 0.031344634, -0.06131912, 0.00887183, -0.01528174, 0.12943709, 0.24537678, 0.008178781, -0.312396, -0.023583878, 0.07827866, -0.1231261, 0.15081584, -0.18161978, -0.25179705, -0.036934935) * go_0(-1.0, -1.0);\n    result += mat4(-0.05768411, 0.16785417, -0.1788644, -0.0067257965, 0.021445744, 0.10066516, -0.23864186, 0.1450302, 0.12892793, 0.19856106, -0.24444748, 0.16531628, -0.044425935, -0.02775357, 0.009059946, -0.12958384) * go_0(-1.0, 0.0);\n    result += mat4(-0.025798557, -0.17238182, -0.34056288, -0.20921059, -0.03576266, 0.1476854, -0.06264234, 0.14452787, -0.04130045, -0.07275762, 0.034578666, 0.2914669, 0.20879944, 0.21359251, -0.048695553, 0.2638088) * go_0(-1.0, 1.0);\n    result += mat4(-0.022791177, 0.4204545, 0.116855636, 0.20241925, -0.010444933, -0.14462502, 0.022550104, -0.24423064, -0.09417524, 0.045358784, -0.11405829, 0.035979558, -0.2283092, -0.06670842, -0.23852053, -0.22417003) * go_0(0.0, -1.0);\n    result += mat4(-0.14526704, 0.040880535, 0.14076385, 0.07795045, -0.059177604, -0.13056375, -0.3373641, -0.19344307, -0.29891858, -0.32578763, -0.29061425, 0.1562214, -0.13578376, 0.36586633, 0.24936736, 0.054629393) * go_0(0.0, 0.0);\n    result += mat4(-0.025790233, -0.13020341, -0.10084969, 0.15767297, -0.09738769, 0.04034404, 0.0038675873, 0.043515608, 0.16899958, -0.29117966, 0.03420067, 0.14432564, -0.10473084, 0.21014084, 0.07775908, -0.09303797) * go_0(0.0, 1.0);\n    result += mat4(-0.07443987, -0.16225167, 0.036251917, 0.028432872, 0.03759333, 0.004027401, -0.033941846, 0.0019474924, 0.02357054, 0.30748722, 0.1652115, -0.17361522, 0.16905582, 0.08048018, -0.23639561, -0.029408466) * go_0(1.0, -1.0);\n    result += mat4(0.0461233, -0.09346199, -0.07063276, -0.19447634, -0.049339604, -0.0032855074, -0.22661209, -0.0543389, 0.11924857, -0.21691081, -0.1645725, -0.0075736847, 0.018572787, -0.06552861, -0.01777661, -0.11651732) * go_0(1.0, 0.0);\n    result += mat4(-0.06425901, 0.123392984, -0.16395192, -0.093448035, -0.029316641, 0.0986573, -0.23135012, 0.011170849, 0.00023920486, 0.15296175, 0.35453254, -0.05189021, 0.20708887, -0.103900835, 0.081992395, -0.21829562) * go_0(1.0, 1.0);\n    result += mat4(-0.019074136, -0.1572586, 0.27919227, 0.09119617, 0.035954695, 0.2941489, 0.18262725, -0.055522963, -0.21364328, -0.1573611, 0.104966134, 0.08228523, 0.19945285, -0.0039229114, -0.1565048, 0.028975379) * go_1(-1.0, -1.0);\n    result += mat4(-0.18501253, 0.006473006, 0.06637501, 0.04295065, 0.06411007, 0.1166344, -0.10060226, 0.46296063, -0.08600344, -0.03560105, 0.012215349, 0.017885283, 0.061346993, 0.17336361, 0.01935021, 0.20198092) * go_1(-1.0, 0.0);\n    result += mat4(-0.04451627, -0.10372061, -0.13968691, 0.14479733, 0.1660607, 0.19334625, 0.0085214665, 0.28863636, -0.07600901, -0.014777084, 0.13209191, -0.09045013, 0.104893915, -0.04776884, -0.007936376, 0.104568765) * go_1(-1.0, 1.0);\n    result += mat4(0.023751335, -0.108048, -0.050531313, 0.15916029, 0.13246661, 0.04644228, -0.09586482, -0.17222965, -0.22898191, -0.033484615, 0.078883134, -0.052609313, -0.2721741, 0.045986425, 0.13972299, -0.28923607) * go_1(0.0, -1.0);\n    result += mat4(-0.23364568, -0.008875902, -0.40894926, 0.060443908, -0.2839635, -0.5270991, -0.2500865, 0.002020195, -0.24488612, -0.04982319, -0.009110353, -0.018023955, 0.06647274, -0.25225738, 0.26154432, -0.033934146) * go_1(0.0, 0.0);\n    result += mat4(-0.1535129, -0.21257545, -0.16553773, 0.17471452, -0.06203719, 0.15238857, 0.18702018, 0.18572305, 0.07740396, -0.074217625, -0.072156586, -0.2183728, 0.00403749, 0.13750519, 0.30362993, 0.06550286) * go_1(0.0, 1.0);\n    result += mat4(0.37164542, -0.1980723, -0.15659203, 0.19498909, 0.01748114, 0.011807152, -0.05424202, 0.11926474, 0.050406165, -0.12925303, -0.020280985, 0.08429331, 0.14769496, -0.077555746, -0.15216178, -0.27070466) * go_1(1.0, -1.0);\n    result += mat4(0.35804263, 0.08539285, -0.14785156, -0.13532467, 0.058254432, 0.20448379, -0.006173341, 0.058168225, -0.21714899, -0.13472849, -0.09392532, -0.12753737, -0.097461835, -0.11419082, 0.09384189, 0.06414768) * go_1(1.0, 0.0);\n    result += mat4(0.023494452, -0.22187226, -0.16694295, 0.0204334, -0.26720086, 0.15916729, 0.3098874, -0.10292057, 0.008854983, 0.13375004, -0.04409455, 0.09286524, 0.095829524, 0.12427317, -0.048659876, 0.18300754) * go_1(1.0, 1.0);\n    result += mat4(-0.119153984, 0.10163183, 0.025017537, -0.40096784, 0.026778705, 0.15821172, -0.19947284, -0.33337715, 0.2952563, 0.16820388, -0.057061996, -0.029319009, -0.12184868, 0.09031512, 0.12028806, 0.021044692) * go_2(-1.0, -1.0);\n    result += mat4(0.086744264, -0.046958666, 0.2130253, -0.46672252, 0.07135636, 0.0100029735, -0.13828261, -0.012365689, -0.11374441, 0.21084632, -0.059631422, -0.013799735, -0.037889663, -0.10701892, -0.09493782, 0.15516634) * go_2(-1.0, 0.0);\n    result += mat4(0.031181194, -0.01535001, 0.029270316, 0.13128386, 0.11838377, -0.17051528, 0.12228499, -0.04841128, 0.33350074, -0.006144013, -0.09055018, 0.27470216, -0.26665646, -0.08703671, -0.01719071, -0.23449609) * go_2(-1.0, 1.0);\n    result += mat4(-0.12856458, 0.005562174, -0.19517267, 0.13270985, 0.2776414, 0.032003902, -0.15778573, 0.15344355, 0.26930434, -0.13459459, 0.035019353, 0.08896612, 0.12847935, -0.122637205, 0.001815178, 0.08290523) * go_2(0.0, -1.0);\n    result += mat4(0.33805037, -0.15318587, -0.20955376, -0.26121393, -0.026022578, -0.1617741, 0.1336867, 0.026223289, 0.012059392, -0.17295446, -0.060811974, 0.14027825, -0.21134059, -0.08408573, -0.23773228, 0.110836074) * go_2(0.0, 0.0);\n    result += mat4(0.16176093, 0.15307428, -0.07711325, -0.3458805, 0.061291527, 0.023916256, 0.21370678, 0.0015756418, 0.10642374, 0.24807373, 0.11164451, 0.10780487, 0.087194376, -0.2718231, -0.008457387, 0.054078236) * go_2(0.0, 1.0);\n    result += mat4(-0.03259038, -0.20923306, 0.165477, 0.098864526, -0.02734457, 0.08871225, -0.01552188, 0.047712058, 0.055032052, -0.13044262, -0.2899521, 0.22230095, -0.029343741, -0.16427459, -0.005436118, -0.05111821) * go_2(1.0, -1.0);\n    result += mat4(0.20065974, -0.1556366, -0.12620135, 0.44572976, -0.020925352, 0.12025185, 0.20588058, 0.06391864, 0.046870507, 0.16942503, -0.049370963, 0.008779016, 0.04954915, 0.090298936, -0.16466027, 0.011152038) * go_2(1.0, 0.0);\n    result += mat4(0.13587528, 0.047841422, 0.19804007, -0.1672396, -0.072491, 0.04543739, 0.25287256, 0.015226213, 0.02007356, -0.049578942, -0.08796175, 0.1714897, -0.07819061, 0.1509537, 0.093094915, 0.031139288) * go_2(1.0, 1.0);\n    result += mat4(-0.013774682, 0.118201815, -0.009592314, -0.10837201, -0.0686881, -0.083380274, 0.107689425, 0.046642892, 0.119898744, -0.05502989, -0.19719897, 0.0005697584, -0.0921928, 0.032281205, 0.2568853, 0.2325449) * go_3(-1.0, -1.0);\n    result += mat4(0.02991112, -0.09898633, 0.06076172, -0.20906185, 0.0026118348, 0.06130956, 0.06760944, -0.16662054, 0.065741204, -0.13144116, 0.011419801, 0.22552124, 0.1465757, -0.07417319, -0.10788749, -0.24952699) * go_3(-1.0, 0.0);\n    result += mat4(-0.19238451, -0.024058497, 0.19580396, -0.067399554, -0.18832864, -0.11752747, -0.078949094, -0.23762032, -0.04141864, 0.022530237, -0.02222157, 0.0054874527, 0.057746816, -0.34854797, 0.028730657, -0.08976777) * go_3(-1.0, 1.0);\n    result += mat4(0.16888975, 0.19949849, -0.08456147, -0.03619044, -0.019596824, 0.11214634, 0.13971676, 0.22926724, 0.03219445, -0.04566354, -0.14948955, -0.22817011, -0.08714846, -0.19684613, 0.15479128, 0.2433362) * go_3(0.0, -1.0);\n    result += mat4(0.16050309, -0.102841675, 0.20855242, -0.011171905, -0.10309409, 0.22455123, 0.15892951, -0.06582373, 0.010079549, -0.2055006, -0.09385158, 0.006519388, 0.11838815, 0.37134558, -0.165772, 0.12704434) * go_3(0.0, 0.0);\n    result += mat4(0.11643292, 0.03294274, -0.09800525, -0.13601723, -0.081318736, -0.059975546, -0.039105035, -0.2893635, -0.13024913, -0.058016162, -0.09961072, 0.10532414, 0.24250132, -0.35546342, -0.092634924, 0.093994915) * go_3(0.0, 1.0);\n    result += mat4(-0.18799333, 0.25611782, 0.014645917, -0.063751906, 0.06498416, 0.16619027, -0.14411639, 0.3914421, -0.07343631, -0.116468735, -0.10941946, -0.2553544, -0.37774643, -0.0018441634, 0.06827239, -0.0122299045) * go_3(1.0, -1.0);\n    result += mat4(-0.11884597, -0.2477297, 0.048488285, -0.06438257, -0.124703035, 0.25932777, 0.0650111, -0.0930877, 0.06463341, -0.000544085, 0.0147504965, -0.170097, -0.13241997, 0.20983136, -0.15956205, 0.03424298) * go_3(1.0, 0.0);\n    result += mat4(-0.034574904, 0.06755256, 0.09508443, -0.17162292, 0.046379335, 0.2178781, 0.08699012, -0.055380464, -0.2237568, -0.07427848, -0.028395249, -0.3225617, -0.084454566, -0.24776657, 0.254169, 0.13229847) * go_3(1.0, 1.0);\n    result += vec4(0.18765923, -0.07697714, 0.028134674, -0.060966115);\n    return result;\n}\n//!DESC Anime4K-v4.0-Restore-CNN-(VL)-Conv-4x3x3x16\n//!HOOK MAIN\n//!BIND conv2d_6_tf\n//!BIND conv2d_6_tf1\n//!SAVE conv2d_7_tf\n//!WIDTH conv2d_6_tf.w\n//!HEIGHT conv2d_6_tf.h\n//!COMPONENTS 4\n#define go_0(x_off, y_off) (max((conv2d_6_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max((conv2d_6_tf1_texOff(vec2(x_off, y_off))), 0.0))\n#define go_2(x_off, y_off) (max(-(conv2d_6_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_3(x_off, y_off) (max(-(conv2d_6_tf1_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(0.21919365, 0.36627784, 0.12603314, 0.24306288, 0.06447028, 0.06472204, -0.05997039, -0.15651788, 0.017059859, -0.006497198, -0.4189735, 0.021636713, -0.23887977, -0.014220949, 0.031113686, -0.17342716) * go_0(-1.0, -1.0);\n    result += mat4(-0.10818789, -0.03273837, 0.33918005, -0.19290088, 0.0955361, -0.34107623, -0.054906327, -0.18083344, -0.060723677, 0.24395694, 0.112975016, -0.07254578, -0.14389384, 0.13235968, -0.15054801, -0.26216486) * go_0(-1.0, 0.0);\n    result += mat4(-0.23442148, -0.07857079, 0.022283873, -0.2656417, 0.037092753, -0.037313666, -0.5057047, 0.042533103, -0.120424, 0.00021930189, -0.0044566668, -0.45536995, 0.00040759926, 0.14597592, -0.094990164, -0.036161344) * go_0(-1.0, 1.0);\n    result += mat4(0.15024352, 0.19903262, -0.0734784, 0.092836305, -0.025753846, 0.024750374, -0.07550193, 0.035420835, 0.11084378, 0.26119822, -0.08443512, -0.0047807065, -0.042685136, 0.24889739, 0.098650105, 0.2088369) * go_0(0.0, -1.0);\n    result += mat4(-0.25551823, 0.14455976, 0.19886157, -0.23465924, 0.20711218, -0.20875362, -0.11320392, -0.30852005, -0.06795657, 0.008670962, 0.30601278, 0.6929064, 0.17079145, 0.15744895, 0.06441601, 0.06514001) * go_0(0.0, 0.0);\n    result += mat4(0.03142604, -0.006410137, -0.023654792, -0.05708553, 0.062985405, -0.077010594, 0.078804865, 0.050882503, 0.010274228, -0.15558401, 0.09490256, 0.14964707, -0.11966925, -0.36176664, 0.27809814, -0.18862294) * go_0(0.0, 1.0);\n    result += mat4(0.05609992, 0.0041612233, -0.08498908, 0.04479823, -0.080117956, -0.17423204, -0.22858045, 0.054569032, -0.050866384, -0.020000307, 0.027000953, -0.67724514, 0.16240878, -0.04641204, 0.0648367, -0.20613132) * go_0(1.0, -1.0);\n    result += mat4(0.08542306, -0.08254248, -0.11090553, -0.14140448, -0.10788511, -0.13011602, -0.29319742, -0.26007155, 0.11033401, -0.31966573, 0.32668245, 0.19542319, 0.06329418, 0.20904626, 0.2724067, -0.009155685) * go_0(1.0, 0.0);\n    result += mat4(-0.007403411, 0.0012836396, -0.23446666, -0.03017208, 0.062420018, -0.13611084, -0.2975928, 0.13173148, -0.03679939, 0.13743873, -0.10121899, 0.074514665, 0.1497629, -0.09523838, 0.39018926, 0.37807035) * go_0(1.0, 1.0);\n    result += mat4(0.11441487, -0.19565523, -0.25757137, -0.16148767, 0.15575317, -0.12657928, 0.10479676, 0.062919036, 0.010544159, 0.22931573, 0.20360178, 0.4637635, -0.3395036, -0.52467215, 0.08759308, 0.028030418) * go_1(-1.0, -1.0);\n    result += mat4(0.2699195, -0.34218305, 0.15259695, 0.03139074, -0.024053533, -0.029567484, 0.28480124, 0.20525953, 0.15452823, -0.217713, 0.15861876, -0.012275699, 0.21408023, 0.097508304, -0.57126766, -0.14679857) * go_1(-1.0, 0.0);\n    result += mat4(-0.0755847, -0.09751562, -0.29480466, -0.22285318, 0.14196442, 0.114573136, -0.22294767, 0.12463806, 0.3322209, -0.04631724, -0.11097061, -0.27986854, -0.16099304, -0.060079545, 0.00299308, 0.120776065) * go_1(-1.0, 1.0);\n    result += mat4(0.050933484, -0.13776319, -0.18809728, 0.24035202, -0.32528606, -0.41684148, -0.029342847, 0.28642926, -0.07963454, -0.12905268, 0.07606093, 0.24670005, -0.08815598, -0.23320907, -0.008099349, 0.21512873) * go_1(0.0, -1.0);\n    result += mat4(0.19247563, 0.18083979, -0.09719762, 0.15314941, -0.22350982, 0.46515045, -0.3571128, 0.35953265, 0.06921985, -0.4482386, -0.18732521, -0.5043983, 0.35159567, -0.33315298, -0.21884166, -0.16283798) * go_1(0.0, 0.0);\n    result += mat4(-0.021124054, -0.007966742, 0.0052493825, 0.022550896, 0.030403977, 0.3377868, -0.47602004, -0.077664234, -0.07222509, -0.07486097, -0.37971064, -0.5107857, -0.06299477, 0.04930232, -0.3330487, 0.29845512) * go_1(0.0, 1.0);\n    result += mat4(-0.063705474, -0.07917637, -0.02026607, -0.05142568, 0.021577014, -0.07379867, 0.033937998, 0.08148773, -0.02717838, -0.03233838, 0.098000035, 0.036476444, -0.13366953, 0.014477577, 0.24064232, 0.39313284) * go_1(1.0, -1.0);\n    result += mat4(-0.16046515, -0.094624564, 0.35435164, 0.09942324, -0.07137174, -0.27999225, 0.124644354, -0.0062176553, 0.015016751, -0.05500243, -0.23249559, -0.4508382, 0.1860433, 0.10671491, -0.033345353, -0.06611453) * go_1(1.0, 0.0);\n    result += mat4(0.21614046, -0.01307525, -0.18941112, -0.20533535, -0.14481686, -0.47801897, 0.22605121, -0.20298961, -0.06744227, -0.20377496, -0.11926173, 0.15645133, -0.31570885, -0.3495616, -0.024666889, 0.040965475) * go_1(1.0, 1.0);\n    result += mat4(-0.11748018, -0.039976366, -0.00084064255, -0.028653437, -0.16216733, -0.036768105, 0.018064514, -0.0928936, 0.14008482, -0.064511225, 0.24329947, -0.0268608, 0.050330248, 0.08540601, -0.07272679, -0.01187671) * go_2(-1.0, -1.0);\n    result += mat4(-0.09459936, -0.011723822, -0.06952858, -0.07808506, -0.065588176, 0.332501, -0.0120042395, 0.07668016, 0.14735217, -0.14856043, -0.06702449, -0.020953184, -0.023006834, 0.06135422, 0.1491448, -0.028061569) * go_2(-1.0, 0.0);\n    result += mat4(0.25136968, 0.25146323, -0.108277924, -0.20407207, -0.0013780294, 0.16108194, 0.25143847, 0.06672421, -0.033905584, -0.021144686, -0.019152718, 0.34619498, 0.14560962, 0.034437314, 0.024790365, -0.049976267) * go_2(-1.0, 1.0);\n    result += mat4(-0.24928351, 0.12637813, 0.23609994, 0.12722939, -0.036997862, -0.16554876, 0.11144095, -0.10040036, -0.020359103, -0.080701865, -0.3142192, 0.27257237, 0.13546956, -0.14416885, 0.028196262, -0.2886465) * go_2(0.0, -1.0);\n    result += mat4(0.28524777, -0.4236231, 0.27420738, -0.21095508, 0.23475651, 0.115876295, -0.18837357, -0.0260708, 0.030670704, -0.11516913, -0.11365572, -0.2203149, -0.018612983, -0.10719593, -0.031727783, 0.1403327) * go_2(0.0, 0.0);\n    result += mat4(0.07240512, 0.03139215, 0.12328737, -0.021201206, -0.13971715, 0.072742075, -0.0011289873, 0.0053133667, 0.035639685, -0.04322272, -0.19288473, -0.15812221, -0.19126481, 0.0698514, 0.17619178, -0.035605464) * go_2(0.0, 1.0);\n    result += mat4(-0.18552057, 0.07259671, 0.011667668, -0.15630563, 0.11414356, 0.14482655, -0.04021029, 0.18495587, -0.11386139, -0.09058561, -0.011265998, 0.23358451, 0.0521358, 0.12495261, 0.021644838, -0.048094347) * go_2(1.0, -1.0);\n    result += mat4(-0.09222373, 0.0533347, 0.055820454, 0.22382596, 0.18713981, 0.2668916, -0.019384036, 0.012698582, 0.13325234, 0.20361474, -0.33106443, -0.08571572, -0.21243028, -0.10996386, 0.123459645, 0.1534967) * go_2(1.0, 0.0);\n    result += mat4(0.18133277, 0.18108074, -0.05638664, 0.29533157, -0.2108019, -0.033636626, 0.5015888, -0.15116066, -0.041320793, -0.14764231, 0.07314567, -0.18865979, 0.10276937, 0.094240844, -0.1364283, 0.27812913) * go_2(1.0, 1.0);\n    result += mat4(0.06040915, 0.23753685, 0.19019844, 0.23948252, -0.07535012, 0.11848904, 0.14389765, 0.050067905, 0.16150077, -0.030053454, 0.12478255, 0.26020208, 0.111198805, 0.06787492, -0.12771018, 0.006687384) * go_3(-1.0, -1.0);\n    result += mat4(-0.5421617, 0.10414128, -0.21526064, -0.08883624, 0.13145073, -0.29695904, 0.57386386, 0.073361695, -0.09538372, 0.27593842, 0.070922814, 0.21769938, 0.06214975, 0.11847816, 0.10033405, 0.29360098) * go_3(-1.0, 0.0);\n    result += mat4(-0.16294672, -0.014815565, 0.22046989, 0.16858687, 0.058917344, 0.21384977, 0.18803519, 0.105688855, 0.0355118, 0.20571202, -0.07341922, 0.26624045, -0.0415102, 0.050942056, 0.19727907, 0.20122413) * go_3(-1.0, 1.0);\n    result += mat4(-0.020470422, 0.15815964, -0.13437317, -0.1967045, 0.074902646, 0.08356444, 0.055913117, -0.12837863, -0.18647918, 0.07002247, 0.038864706, -0.07288784, 0.04135125, -0.016055549, -0.1340297, -0.15578008) * go_3(0.0, -1.0);\n    result += mat4(-0.07685624, 0.00079105416, -0.068755336, 0.110282525, -0.014170752, 0.041282844, -0.17035173, 0.19439398, -0.3036256, 0.024148455, -0.19566648, -0.06736254, 0.14203559, -0.13016985, -0.32845357, -0.14266774) * go_3(0.0, 0.0);\n    result += mat4(0.0087252045, 0.098839566, -0.08770506, -0.08499465, 0.015245115, -0.110854514, 0.054458305, -0.018121868, -0.09666134, -0.08316006, 0.24617113, -0.17195955, 0.2574254, 0.06734342, -0.13792352, -0.07306126) * go_3(0.0, 1.0);\n    result += mat4(-0.0073954533, -0.20126835, -0.22545357, -0.29462856, 0.057408337, 0.11939119, -0.01846476, 0.12534486, 0.15751605, -0.14282645, -0.14219986, 0.14283386, 0.14090413, 0.10500912, 0.03039335, 0.17448832) * go_3(1.0, -1.0);\n    result += mat4(0.043910783, -0.09140025, -0.21666165, 0.07616939, 0.104454786, 0.309926, -0.12906921, 0.1140117, 0.09372434, 0.049547072, -0.086615674, -0.034449168, 0.096705064, 0.26001686, 0.027063297, 0.12422948) * go_3(1.0, 0.0);\n    result += mat4(0.1365422, 0.2679611, 0.12037257, 0.43346113, 0.08223084, -0.016788265, 0.13570398, -0.017974345, -0.17922844, -0.09475725, 0.073539585, -0.106947675, 0.08998511, 0.04133868, 0.16586913, -0.26291734) * go_3(1.0, 1.0);\n    result += vec4(-0.19233678, 0.016725872, -0.008011114, -0.1977463);\n    return result;\n}\n//!DESC Anime4K-v4.0-Restore-CNN-(VL)-Conv-4x3x3x16\n//!HOOK MAIN\n//!BIND conv2d_6_tf\n//!BIND conv2d_6_tf1\n//!SAVE conv2d_7_tf1\n//!WIDTH conv2d_6_tf.w\n//!HEIGHT conv2d_6_tf.h\n//!COMPONENTS 4\n#define go_0(x_off, y_off) (max((conv2d_6_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max((conv2d_6_tf1_texOff(vec2(x_off, y_off))), 0.0))\n#define go_2(x_off, y_off) (max(-(conv2d_6_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_3(x_off, y_off) (max(-(conv2d_6_tf1_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(-0.36016628, 0.019064043, 0.3073228, 0.16891135, 0.026739368, 0.31136194, 0.11260383, -0.26918694, 0.0419928, -0.3365078, 0.20189743, -0.04136312, 0.039564647, 0.033199426, 0.18768296, -0.017119858) * go_0(-1.0, -1.0);\n    result += mat4(0.28663483, -0.41716507, 0.059281543, 0.043736435, 0.0028875466, 0.13817391, -0.12543318, -0.2794053, -0.023528943, 0.10610115, 0.09100278, 0.040132936, -0.21949205, -0.027810011, -0.0301218, 0.084047124) * go_0(-1.0, 0.0);\n    result += mat4(0.39674807, -0.0040878756, -0.038235947, 0.11880838, 0.009898328, 0.19107847, -0.009313831, -0.1554276, -0.047341663, 0.18049581, -0.029317195, 0.0708909, 0.0708316, -0.110617444, 0.14584038, -0.022261223) * go_0(-1.0, 1.0);\n    result += mat4(-0.20400241, 0.0896492, -0.010386381, -0.052133385, 0.005023956, -0.06628705, -0.16436209, -0.25345984, -0.05285192, 0.09706557, -0.03778914, -0.152546, 0.17023252, 0.063713826, 0.00743037, 0.056634087) * go_0(0.0, -1.0);\n    result += mat4(-0.080793336, 0.4204207, 0.19098237, 0.20028038, -0.054076545, 0.22064368, -0.25853387, -0.3643562, 0.2085573, -0.023731, -0.06727709, -0.18683033, -0.18032159, -0.06388348, 0.304463, -0.2517781) * go_0(0.0, 0.0);\n    result += mat4(0.11940941, 0.10624008, 0.16120581, 0.2369602, 0.3321827, 0.4272075, -0.10403669, -0.31388018, -0.006372124, -0.00653671, 0.109810196, 0.2277172, 0.005771998, 0.086026914, -0.08934813, -0.094941735) * go_0(0.0, 1.0);\n    result += mat4(-0.13233568, 0.24112508, -0.0068006413, 0.12466225, 0.11396591, -0.07249253, -0.29090378, -0.12828146, -0.22001141, -0.08532405, -0.11932601, 0.29452974, 0.09572195, 0.017603843, 0.12454017, 0.16321751) * go_0(1.0, -1.0);\n    result += mat4(0.042107448, -0.00807216, 0.06580674, -0.1289527, 0.13977426, -0.037159685, -0.21001346, -0.08698161, 0.22370502, -0.29170328, 0.2179206, 0.36621302, 0.0825477, -0.016513655, -0.11157249, 0.12861598) * go_0(1.0, 0.0);\n    result += mat4(0.2246826, -0.13262233, 0.12131653, -0.15522355, 0.38104856, 0.030237729, 0.1286289, -0.19770473, -0.16175011, -0.13688888, 0.23505463, 0.21333031, 0.76352316, -0.17949077, -0.13124311, 0.1613879) * go_0(1.0, 1.0);\n    result += mat4(-0.050607495, 0.0846705, -0.06136092, -0.033436477, 0.41138348, 0.037043408, -0.02676336, -0.37771952, 0.22147503, 0.06490757, -0.04266158, -0.22606373, 0.045775007, -0.054498192, -0.21495876, -0.036050417) * go_1(-1.0, -1.0);\n    result += mat4(-0.06242522, 0.2700824, -0.05602621, -0.12361551, 0.14477442, 0.19403581, 0.23505251, -0.072234035, -0.15831544, 0.4640447, -0.104754634, -0.004539681, -0.20246096, 0.23216484, -0.35886365, 0.11360777) * go_1(-1.0, 0.0);\n    result += mat4(0.14777757, 0.18951412, 0.027219458, 0.11216015, 0.02997997, -0.13466355, -0.0010830094, 0.021302953, 0.23441231, -0.14529245, 0.08068729, 0.10044398, 0.3972878, 0.26570204, 0.0046810666, -0.2863261) * go_1(-1.0, 1.0);\n    result += mat4(-0.10385485, 0.1053724, 0.16961229, 0.20727012, -0.025148917, -0.011365095, 0.03899919, -0.030950211, 0.079080455, -0.32767853, 0.064670205, -0.035771385, 0.16833797, -0.21567492, 0.30871257, -0.19965471) * go_1(0.0, -1.0);\n    result += mat4(-0.23420888, -0.004894698, -0.18162623, -0.31107524, 0.11976508, 0.14924951, -0.08723316, 0.21401922, -0.58200324, -0.01177345, -0.049033508, 0.19593577, -0.21139073, 0.13016601, 0.08734843, 0.4158892) * go_1(0.0, 0.0);\n    result += mat4(0.0009789813, 0.33274913, 0.017405733, -0.042906318, -0.26410276, -0.09291333, 0.019387102, 0.105381854, -0.009176527, 0.09483514, -0.28462934, -0.03644404, 0.285194, -0.4260311, 0.14902237, -0.115670316) * go_1(0.0, 1.0);\n    result += mat4(-0.09344311, 0.4463103, 0.19984834, -0.09733857, -0.118717775, -0.0708026, 0.24919955, -0.11234634, 0.1246395, -0.052909933, 0.1525815, 0.07724016, 0.0070534665, -0.06404165, -0.18149726, -0.014058336) * go_1(1.0, -1.0);\n    result += mat4(-0.17353044, 0.15376104, 0.004588994, -0.13554202, -0.19920237, -0.18918681, 0.11327512, -0.117296435, -0.0785251, 0.013677155, -0.2103214, 0.06843426, -0.27790928, 0.09837545, -0.00019213746, 0.09132539) * go_1(1.0, 0.0);\n    result += mat4(-0.01586651, 0.014929441, 0.2426186, -0.1889374, -0.0865462, -0.07454513, -0.20797268, -0.22366855, 0.19704159, 0.0048206006, -0.16707218, -0.14162683, 0.036798395, -0.1663155, -0.12009389, 0.09603803) * go_1(1.0, 1.0);\n    result += mat4(-0.041532192, 0.05753804, 0.17927068, -0.042112097, 0.12080969, -0.15052572, -0.34855765, -0.07356988, -0.28199884, -0.18958664, 0.15879883, 0.08511588, 0.0034213227, -0.05338495, -0.37285298, 0.06626709) * go_2(-1.0, -1.0);\n    result += mat4(-0.20219134, 0.22150375, -0.29405454, 0.06597703, -0.018885285, -0.010551704, -0.010774283, 0.08758955, -0.2015349, -0.17006227, -0.24321876, -0.06864207, -0.118437864, -0.043977212, -0.029736811, 0.14040919) * go_2(-1.0, 0.0);\n    result += mat4(-0.18709077, -0.09723938, 0.12783436, -0.15167634, 0.29039705, -0.11009911, 0.018371418, -0.060096707, -0.07256923, -0.25799567, -0.06276934, -0.035992302, -0.06729111, -0.059956793, -0.024079734, 0.011838878) * go_2(-1.0, 1.0);\n    result += mat4(0.010449175, -0.08212451, 0.1409803, 0.11861122, -0.18035835, 0.051930565, 0.01049551, -0.09447962, 0.12029649, 0.040604513, -0.059971705, -0.0044667358, -0.22080486, -0.11187681, 0.124374695, -0.004155485) * go_2(0.0, -1.0);\n    result += mat4(-0.28584236, -0.38480133, -0.13987814, -0.4463469, -0.3890419, -0.022498172, 0.17334452, 0.21895568, -0.15450422, -0.10905497, 0.15111905, -0.22554915, 0.106121585, -0.029144369, 0.36059046, 0.22140682) * go_2(0.0, 0.0);\n    result += mat4(-0.23780307, -0.023033705, 0.068205886, -0.110635854, -0.26720005, -0.1608183, 0.19523881, 0.07972837, -0.018495852, -0.2793956, 0.17668398, -0.12020479, -0.079556085, -0.02284952, 0.031480275, 0.31818348) * go_2(0.0, 1.0);\n    result += mat4(0.22501226, -0.00829407, 0.059581667, 0.16512989, 0.18711442, 0.1200968, 0.11812652, -0.16091056, 0.15733972, 0.045156084, 0.20640492, -0.16852027, -0.11217177, 0.06746273, -0.050218176, 0.08643783) * go_2(1.0, -1.0);\n    result += mat4(0.20715691, -0.1082907, 0.027892975, 0.19515261, -0.17838904, 0.1532257, -0.108409844, -0.06632365, -0.13805026, 0.23020233, 0.12416581, -0.14861803, 0.16650471, 0.08158386, -0.09051303, -0.06981649) * go_2(1.0, 0.0);\n    result += mat4(-0.04617126, 0.06579221, 0.25964734, 0.28500968, 0.07641255, -0.090885855, -0.0972522, 0.18298368, -0.06393334, 0.103463, -0.23062052, -0.15270731, 0.13633437, 0.074707486, 0.15065335, -0.024602572) * go_2(1.0, 1.0);\n    result += mat4(0.118319295, 0.010410938, 0.044655934, -0.104725905, 0.030477569, 0.12867387, 0.039075315, 0.18922117, 0.13301082, -0.1601557, 0.038168408, -0.07372259, -0.09522213, -0.095107146, -0.16679631, 0.044673234) * go_3(-1.0, -1.0);\n    result += mat4(0.46229, -0.30780822, -0.09081465, 0.1433387, -0.0315039, 0.059409115, -0.24948491, -0.17146957, 0.060843736, -0.041989822, 0.054005735, 0.22835566, 0.12036598, -0.0070898845, 0.17276852, -0.17754094) * go_3(-1.0, 0.0);\n    result += mat4(-0.35119572, 0.020034311, 0.08751943, 0.08193488, 0.041884877, 0.22649358, -0.07447533, 0.20845473, -0.04859846, -0.16206735, 0.06819576, -0.053000778, 0.18146423, 0.04694148, 0.045293212, 0.06783575) * go_3(-1.0, 1.0);\n    result += mat4(0.280914, -0.14998704, -0.23485807, -0.015608296, 0.1549556, -0.11992663, -0.094974115, 0.05887284, 0.053392075, 0.10322464, -0.075066686, 0.068358354, -0.18663338, 0.009901499, -0.123370335, -0.12502703) * go_3(0.0, -1.0);\n    result += mat4(0.7748568, -0.17870626, -0.20770052, 0.024692526, -0.056430295, -0.06324113, -0.03660047, 0.29629672, -0.51896983, -0.027231261, 0.05903762, 0.077677645, -0.061675485, -0.20277846, 0.10352223, -0.08198446) * go_3(0.0, 0.0);\n    result += mat4(-0.06347568, 0.21643166, -0.09718546, 0.0372257, -0.029537952, -0.0357135, -0.09548363, 0.18225233, -0.29609334, -0.3496132, 0.18245913, -0.10162589, -0.18189451, -0.09077887, 0.117313184, -0.06863874) * go_3(0.0, 1.0);\n    result += mat4(-0.047373574, -0.020289376, -0.25748715, -0.13568166, 0.15656634, -0.06841899, 0.012100781, -0.13611819, 0.0016357322, -0.23870537, 0.14035743, -0.14700134, 0.2535575, -0.13697346, -0.13693139, -0.10365287) * go_3(1.0, -1.0);\n    result += mat4(0.4283934, -0.316192, -0.012617617, 0.018468965, 0.21436644, 0.18408814, -0.42651537, 0.12504087, -0.13894933, 0.091662176, -0.20096369, -0.080727175, -0.005487846, 0.17046383, 0.1383948, -0.0054956395) * go_3(1.0, 0.0);\n    result += mat4(0.20014295, -0.027282396, -0.06317007, 0.04452042, 0.064600386, 0.072222926, -0.33409226, 0.08063831, -0.022607977, 0.1308856, -0.39691743, -0.094889864, -0.1810531, 0.011367248, -0.2531222, -0.22468317) * go_3(1.0, 1.0);\n    result += vec4(0.26886886, 0.05874665, 0.10268232, 0.05833081);\n    return result;\n}\n//!DESC Anime4K-v4.0-Restore-CNN-(VL)-Conv-3x1x1x112\n//!HOOK MAIN\n//!BIND MAIN\n//!BIND conv2d_1_tf\n//!BIND conv2d_1_tf1\n//!BIND conv2d_2_tf\n//!BIND conv2d_2_tf1\n//!BIND conv2d_3_tf\n//!BIND conv2d_3_tf1\n//!BIND conv2d_4_tf\n//!BIND conv2d_4_tf1\n//!BIND conv2d_5_tf\n//!BIND conv2d_5_tf1\n//!BIND conv2d_6_tf\n//!BIND conv2d_6_tf1\n//!BIND conv2d_7_tf\n//!BIND conv2d_7_tf1\n//!SAVE MAIN\n//!WIDTH conv2d_1_tf.w\n//!HEIGHT conv2d_1_tf.h\n#define g_0 (max((conv2d_1_tf_tex(conv2d_1_tf_pos)), 0.0))\n#define g_1 (max((conv2d_1_tf1_tex(conv2d_1_tf1_pos)), 0.0))\n#define g_2 (max(-(conv2d_1_tf_tex(conv2d_1_tf_pos)), 0.0))\n#define g_3 (max(-(conv2d_1_tf1_tex(conv2d_1_tf1_pos)), 0.0))\n#define g_4 (max((conv2d_2_tf_tex(conv2d_2_tf_pos)), 0.0))\n#define g_5 (max((conv2d_2_tf1_tex(conv2d_2_tf1_pos)), 0.0))\n#define g_6 (max(-(conv2d_2_tf_tex(conv2d_2_tf_pos)), 0.0))\n#define g_7 (max(-(conv2d_2_tf1_tex(conv2d_2_tf1_pos)), 0.0))\n#define g_8 (max((conv2d_3_tf_tex(conv2d_3_tf_pos)), 0.0))\n#define g_9 (max((conv2d_3_tf1_tex(conv2d_3_tf1_pos)), 0.0))\n#define g_10 (max(-(conv2d_3_tf_tex(conv2d_3_tf_pos)), 0.0))\n#define g_11 (max(-(conv2d_3_tf1_tex(conv2d_3_tf1_pos)), 0.0))\n#define g_12 (max((conv2d_4_tf_tex(conv2d_4_tf_pos)), 0.0))\n#define g_13 (max((conv2d_4_tf1_tex(conv2d_4_tf1_pos)), 0.0))\n#define g_14 (max(-(conv2d_4_tf_tex(conv2d_4_tf_pos)), 0.0))\n#define g_15 (max(-(conv2d_4_tf1_tex(conv2d_4_tf1_pos)), 0.0))\n#define g_16 (max((conv2d_5_tf_tex(conv2d_5_tf_pos)), 0.0))\n#define g_17 (max((conv2d_5_tf1_tex(conv2d_5_tf1_pos)), 0.0))\n#define g_18 (max(-(conv2d_5_tf_tex(conv2d_5_tf_pos)), 0.0))\n#define g_19 (max(-(conv2d_5_tf1_tex(conv2d_5_tf1_pos)), 0.0))\n#define g_20 (max((conv2d_6_tf_tex(conv2d_6_tf_pos)), 0.0))\n#define g_21 (max((conv2d_6_tf1_tex(conv2d_6_tf1_pos)), 0.0))\n#define g_22 (max(-(conv2d_6_tf_tex(conv2d_6_tf_pos)), 0.0))\n#define g_23 (max(-(conv2d_6_tf1_tex(conv2d_6_tf1_pos)), 0.0))\n#define g_24 (max((conv2d_7_tf_tex(conv2d_7_tf_pos)), 0.0))\n#define g_25 (max((conv2d_7_tf1_tex(conv2d_7_tf1_pos)), 0.0))\n#define g_26 (max(-(conv2d_7_tf_tex(conv2d_7_tf_pos)), 0.0))\n#define g_27 (max(-(conv2d_7_tf1_tex(conv2d_7_tf1_pos)), 0.0))\nvec4 hook() {\n    vec4 result = mat4(0.09689336, 0.06046458, 0.072598994, 0.0, 0.11994565, 0.104477674, 0.09302802, 0.0, -0.05718302, 0.050438102, 0.08814741, 0.0, 0.0308889, 0.0033925986, -0.01715605, 0.0) * g_0;\n    result += mat4(-0.028314235, 0.06597744, 0.0966897, 0.0, 0.035656154, 0.07770106, 0.075551905, 0.0, 0.0001793458, -0.000479495, -0.00297406, 0.0, -0.053916585, -0.016807461, -0.0057141334, 0.0) * g_1;\n    result += mat4(-0.047189303, -0.0207, -0.020910334, 0.0, -0.07933196, -0.06961211, -0.086069845, 0.0, 0.0943727, 0.008463375, 0.010755166, 0.0, 0.062410597, 0.022625161, 0.04068433, 0.0) * g_2;\n    result += mat4(0.10270994, -0.019080428, 0.0050091282, 0.0, -0.004672948, -0.013966742, -0.0063746064, 0.0, -2.5856789e-05, 0.03151499, -0.0023983798, 0.0, 0.113539025, 0.12381699, 0.100360274, 0.0) * g_3;\n    result += mat4(0.07868885, -0.030913834, -0.009213676, 0.0, 0.04870991, 0.021467991, 0.038739506, 0.0, -0.042969644, -0.07122453, -0.08798675, 0.0, -0.09784122, 0.021434791, 0.02510374, 0.0) * g_4;\n    result += mat4(0.050420716, 0.0729716, 0.076532185, 0.0, -0.019112485, -0.01037939, -0.026948035, 0.0, -0.02591423, 0.008927897, -0.00042541025, 0.0, 0.1043701, -0.0071186824, -0.041817162, 0.0) * g_5;\n    result += mat4(-0.16143242, -0.0009298223, -0.01228508, 0.0, 0.07744052, -0.018313263, -0.0488145, 0.0, 0.09241393, 0.07128674, 0.055164956, 0.0, 0.054884013, -0.04834418, -0.06281626, 0.0) * g_6;\n    result += mat4(-0.049036566, -0.05979936, -0.05594288, 0.0, -0.014564307, 0.031926468, 0.037857566, 0.0, 0.015474487, -0.11385003, -0.11527764, 0.0, -0.07076006, 0.057038613, 0.095983796, 0.0) * g_7;\n    result += mat4(0.03094887, -0.008734403, 0.00042712069, 0.0, 0.053891554, 0.05837673, 0.06200635, 0.0, 0.09071558, -0.04202184, -0.046172567, 0.0, -0.0425916, 0.04905093, 0.020835675, 0.0) * g_8;\n    result += mat4(0.096628904, -0.037792254, -0.043241944, 0.0, -0.011923947, -0.025950424, -0.031381752, 0.0, -0.060941868, -0.07859433, -0.07535451, 0.0, -0.026777223, 0.08604982, 0.07829908, 0.0) * g_9;\n    result += mat4(-0.06435972, 0.0036599538, 0.00786578, 0.0, -0.061972067, -0.05681472, -0.06667608, 0.0, -0.106890626, 0.007406496, 0.029977169, 0.0, -0.20519382, -0.044860814, 0.0021225857, 0.0) * g_10;\n    result += mat4(-0.16876474, 0.012789643, 0.026692612, 0.0, 0.017817136, 0.026935097, 0.02227043, 0.0, 0.01690181, 0.07716103, 0.086527, 0.0, 0.07923805, -0.10443151, -0.10859543, 0.0) * g_11;\n    result += mat4(0.003730466, -0.024648283, -0.022169832, 0.0, -0.0062762927, 0.022062732, 0.032966793, 0.0, 0.016349113, 0.017197203, 0.020952817, 0.0, -0.1763789, 0.035497356, 0.053835396, 0.0) * g_12;\n    result += mat4(0.020886675, -0.07054202, -0.079142675, 0.0, 0.06664387, 0.044960167, 0.042230908, 0.0, -0.095019594, 0.012421141, 0.0142890485, 0.0, 0.056814816, -0.012751135, -0.014684506, 0.0) * g_13;\n    result += mat4(0.011765893, 0.0008920681, -0.0018258415, 0.0, -0.010473814, -0.023085753, -0.028783914, 0.0, -0.023034256, -0.0024786016, -0.0052162083, 0.0, 0.1643386, -0.06132718, -0.09289065, 0.0) * g_14;\n    result += mat4(0.016597198, 0.09389637, 0.10833379, 0.0, -0.043163072, -0.04714812, -0.035274632, 0.0, 0.09634976, -0.009292612, -0.022424143, 0.0, -0.08765172, 0.0051558353, 0.010900356, 0.0) * g_15;\n    result += mat4(0.030815786, 0.021069322, 0.01812191, 0.0, 0.084839165, -0.0080813095, -0.029270556, 0.0, -0.10456346, 0.062386703, 0.0665605, 0.0, 0.11926609, -0.1104228, -0.13291118, 0.0) * g_16;\n    result += mat4(-0.07159541, -0.007267032, -0.010134558, 0.0, 0.008234213, 0.045609634, 0.040295456, 0.0, 0.018416971, 0.01308482, 0.014649557, 0.0, 0.035107512, -0.02140815, -0.030279048, 0.0) * g_17;\n    result += mat4(0.01918586, 0.03875863, 0.03229402, 0.0, -0.07917104, 0.041135103, 0.057182517, 0.0, 0.08609541, 0.0079662455, 0.004327576, 0.0, -0.14332893, 0.03120354, 0.056732506, 0.0) * g_18;\n    result += mat4(0.03200192, -0.0035752193, -0.0031064528, 0.0, -0.010902813, 0.014607456, 0.019431474, 0.0, -0.016461229, -0.004938204, -0.004655488, 0.0, -0.033470232, 0.0026075812, 0.005896968, 0.0) * g_19;\n    result += mat4(0.037410006, 0.048742272, 0.04348088, 0.0, 0.037719514, 0.030768529, 0.03127472, 0.0, 0.056426726, 0.03066893, 0.016440205, 0.0, -0.010599352, 0.022832409, 0.023211194, 0.0) * g_20;\n    result += mat4(-0.005733291, 0.06365659, 0.06663611, 0.0, -0.041917093, -0.016493445, -0.020438088, 0.0, -0.0014357592, -0.0022506563, -0.0045095007, 0.0, 0.029893145, -0.009129354, -0.015173116, 0.0) * g_21;\n    result += mat4(0.013052085, 0.005108175, 0.0025906067, 0.0, -0.021950055, -0.036447693, -0.036141638, 0.0, -0.036296472, 0.0068928464, 0.013102313, 0.0, 0.0060471976, -0.024798103, -0.023548538, 0.0) * g_22;\n    result += mat4(0.0067743887, -0.06191211, -0.062355213, 0.0, 0.0016080744, -0.020445071, -0.016840393, 0.0, 0.028264903, 0.01852915, 0.015891539, 0.0, -0.023877412, -0.013271666, -0.008158679, 0.0) * g_23;\n    result += mat4(-0.04317466, -0.018953001, -0.020452993, 0.0, -0.009322576, -0.03022352, -0.030970376, 0.0, 0.05653658, 0.05430553, 0.046692245, 0.0, 0.05615359, 0.059338935, 0.056018773, 0.0) * g_24;\n    result += mat4(0.022878079, 0.03392234, 0.033057988, 0.0, -0.017554542, -0.0141542535, -0.014122613, 0.0, -0.048634093, -0.05316463, -0.047988772, 0.0, -0.058002178, -0.040221967, -0.034025013, 0.0) * g_25;\n    result += mat4(-0.018253656, -0.04197674, -0.040467236, 0.0, -0.04358929, -0.028309818, -0.025425073, 0.0, -0.008488672, -0.001727991, 0.00035808363, 0.0, -0.0011709273, 0.0052514165, 0.0059479307, 0.0) * g_26;\n    result += mat4(-0.08333935, -0.09818201, -0.09476284, 0.0, -0.033692095, -0.046259012, -0.045797516, 0.0, -0.007577072, 0.0022402718, 0.0016200038, 0.0, 0.0029786075, -0.020728534, -0.018938033, 0.0) * g_27;\n    result += vec4(0.047567394, -0.02504617, -0.028163986, 0.0);\n    return result + MAIN_tex(MAIN_pos);\n}\n"
  },
  {
    "path": "assets/shaders/Anime4K_Upscale_CNN_x2_M.glsl",
    "content": "// MIT License\n\n// Copyright (c) 2019-2021 bloc97\n// All rights reserved.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(M)-Conv-4x3x3x3\n//!HOOK MAIN\n//!BIND MAIN\n//!SAVE conv2d_tf\n//!WIDTH MAIN.w\n//!HEIGHT MAIN.h\n//!COMPONENTS 4\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\n#define go_0(x_off, y_off) (MAIN_texOff(vec2(x_off, y_off)))\nvec4 hook() {\n    vec4 result = mat4(-0.010995803, 0.077095956, -0.043992598, 0.06048717, 0.1164834, -0.11689607, 0.072985925, -0.078805886, 0.01182932, 0.054985743, -0.09018186, 0.044907484, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, -1.0);\n    result += mat4(0.1813623, -0.14752422, 0.025720436, -0.17639883, 0.15697388, 0.10445984, -0.1843076, 0.5264643, 0.047516696, -0.097305484, 0.09740847, -0.29619336, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, 0.0);\n    result += mat4(-0.014534763, 0.09486465, 0.046173926, 0.039391946, 0.09609376, -0.060574662, 0.042200956, -0.3269777, 0.051006425, 0.059818447, 0.04366627, 0.17699827, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, 1.0);\n    result += mat4(0.04268535, -0.08152529, 0.10577459, -0.036936995, -0.051562306, 0.054872766, 0.09194519, 0.0025066638, -0.01073954, 0.00064474024, 0.10038221, 0.02131141, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, -1.0);\n    result += mat4(-0.51751363, -0.40028602, 0.3469574, 0.5933738, -0.91357684, -0.67692596, 0.57815677, 0.39809322, -0.16341521, -0.27169713, 0.12232366, 0.4318641, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, 0.0);\n    result += mat4(0.12601124, -0.06263236, -0.45907676, -0.41514075, 0.3330334, -0.1929565, -0.6333532, -0.6552794, -0.045809917, 0.046351526, -0.26173338, -0.30252662, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, 1.0);\n    result += mat4(0.0030332592, 0.012103107, 0.010537323, -0.02038607, 0.095558085, 0.097704545, 0.083433494, 0.026790185, 0.01943357, -0.061712462, -0.00015703632, -0.032268334, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, -1.0);\n    result += mat4(0.016870102, 0.5215812, -0.11525501, 0.027527615, -0.09045733, 0.61310345, -0.1575268, 0.1905386, 0.020172214, 0.3503187, -0.08209157, -0.051328037, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, 0.0);\n    result += mat4(0.005494087, -0.010656317, 0.07682753, -0.08116042, -0.03934524, 0.16589017, 0.101483546, -0.066603065, 0.03494657, -0.07885597, 0.074227594, 0.0016264897, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, 1.0);\n    result += vec4(0.014463938, -0.0031906287, 0.007015422, -0.003888468);\n    return result;\n}\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(M)-Conv-4x3x3x8\n//!HOOK MAIN\n//!BIND conv2d_tf\n//!SAVE conv2d_1_tf\n//!WIDTH conv2d_tf.w\n//!HEIGHT conv2d_tf.h\n//!COMPONENTS 4\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\n#define go_0(x_off, y_off) (max((conv2d_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max(-(conv2d_tf_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(-0.08532478, -0.14302494, -0.017921071, -0.0032664281, -0.09841952, 0.024187077, 0.10701477, 0.14110753, -0.05714981, -0.10897174, 0.073803626, 0.103992954, 0.07914382, 0.032193683, -0.18346278, -0.09723936) * go_0(-1.0, -1.0);\n    result += mat4(-0.034482613, -0.10742312, -0.047286414, -0.08641124, -0.33896688, -0.036533825, -0.48337597, 0.034040943, -0.13598205, -0.080917805, 0.08540263, -0.012667689, -0.009171425, -0.120026454, -0.20536867, -0.032149274) * go_0(-1.0, 0.0);\n    result += mat4(0.18687321, 0.066278316, 0.024327392, 0.08816582, -0.08017908, 0.09488853, 0.26018232, -0.101504356, 0.17487666, 0.31057635, 0.14785016, -0.09622089, -0.07537452, -0.13844088, -0.05810814, 0.09907489) * go_0(-1.0, 1.0);\n    result += mat4(-0.04183032, 0.15207712, 0.005002397, 0.32277516, -0.16169126, -0.119836345, -0.04068436, -0.096728764, 0.11943901, 0.1789597, -0.20412198, 0.19009817, 0.36630696, 0.06946421, -0.5254373, -0.11896399) * go_0(0.0, -1.0);\n    result += mat4(-0.31916487, -0.98911583, 1.0728644, -0.39280394, 0.33458877, -0.17325239, -0.645045, -0.28524077, -0.14512783, 0.24996442, -0.09837877, 0.05468934, 0.31559715, -0.020504637, -0.026724018, 0.24507573) * go_0(0.0, 0.0);\n    result += mat4(-0.23759829, -0.08530173, -0.16665787, -0.22463752, 0.109896734, 0.13446991, -0.049552456, -0.02385489, -0.01245375, 0.3833208, 0.05758832, 0.1528937, 0.0501858, -0.19651426, 0.0076587177, -0.03297025) * go_0(0.0, 1.0);\n    result += mat4(0.14554465, -0.01826686, 0.10284085, -0.19152659, -0.017585073, -0.05511482, 0.06362406, 0.023924058, -0.0018977845, -0.103172876, 0.03287086, -0.20085956, 0.36062446, 0.10749464, -0.20984372, 0.018256644) * go_0(1.0, -1.0);\n    result += mat4(-0.005534592, 0.3709197, -0.18287498, 0.1720451, 0.030155553, -0.023265475, 0.0058617783, -0.031765483, 0.037328955, -0.2730994, 0.35090837, -0.3269043, -0.028477207, 0.32756507, -0.15989502, 0.12158258) * go_0(1.0, 0.0);\n    result += mat4(0.10873739, 0.19583772, 0.060394943, 0.09410379, -0.04739245, 0.026561242, 0.022990001, 0.1093272, -0.01071349, -0.022938967, -0.046423864, 0.2385325, -0.0319821, 0.046962265, 0.09081178, -0.11001857) * go_0(1.0, 1.0);\n    result += mat4(0.13012704, 0.112289295, 0.030790284, -0.050499484, 0.11784853, 0.08107028, -0.07556717, -0.15643, 0.015249331, 0.015299608, 0.07748125, 0.054485757, 0.044857923, 0.12161275, -0.048292994, -0.033995003) * go_1(-1.0, -1.0);\n    result += mat4(0.12931514, 0.15114146, 0.070513315, 0.11246343, 0.4142387, 0.213479, -0.5439916, 0.07776645, 0.13109331, 0.2021147, 0.25932786, -0.22157331, 0.02377734, -0.014970623, -0.1943276, 0.18440372) * go_1(-1.0, 0.0);\n    result += mat4(-0.22365458, -0.19829084, -0.06881161, -0.06468993, 0.17202774, 0.0048758537, -0.09235021, 0.18941896, 0.064125344, -0.09067088, 0.09748182, 0.13561936, -0.05876288, -0.0122420965, -0.054380875, -0.17743628) * go_1(-1.0, 1.0);\n    result += mat4(0.18582906, -0.09263032, -0.08210888, -0.20515606, 0.11484005, 0.08557595, 0.0009253741, -0.051202174, -0.18535301, -0.1529345, -0.13092944, 0.03770747, -0.020947013, 0.19187425, -0.15494856, -0.048979875) * go_1(0.0, -1.0);\n    result += mat4(-0.38131633, 0.4278787, 0.19763695, 0.27655518, -0.08711912, 0.07374453, -0.064803004, 0.5983854, 0.2361923, -0.057221692, -0.37138999, -0.24259573, 0.13890724, 0.25706333, -0.54021406, 0.08095518) * go_1(0.0, 0.0);\n    result += mat4(0.0991328, -0.022651536, -0.029148921, -0.009812537, -0.09523686, -0.15704902, 0.052389514, 0.21561539, 0.1950314, -0.08572602, 0.0016523858, 0.14125621, -0.030999828, 0.12009709, 0.0373512, -0.105043754) * go_1(0.0, 1.0);\n    result += mat4(-0.11251988, 0.12106985, 0.011923068, 0.3662747, 0.004800994, 0.017972551, 0.004761366, -0.07934206, -0.13755941, -0.022852683, 0.1502225, 0.009758547, -0.16964264, 0.00984782, 0.07855833, 0.035730787) * go_1(1.0, -1.0);\n    result += mat4(0.01964957, -0.27226487, 0.033933397, -0.117632054, -0.009058229, 0.047830686, -0.01125145, 0.136628, 0.0056388285, 0.3028781, -0.12286517, 0.23498532, -0.009319075, -0.444048, 0.16174883, -0.06367683) * go_1(1.0, 0.0);\n    result += mat4(0.02343933, -0.010915871, -0.058680378, -0.21886891, -0.010750894, -0.06671997, 0.0602906, -0.07903071, 0.066891186, 0.06650588, 0.14362891, -0.101870626, 0.02264628, -0.06940821, -0.077616625, 0.110911585) * go_1(1.0, 1.0);\n    result += vec4(0.032014452, -0.020821465, 0.0826416, -0.002838458);\n    return result;\n}\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(M)-Conv-4x3x3x8\n//!HOOK MAIN\n//!BIND conv2d_1_tf\n//!SAVE conv2d_2_tf\n//!WIDTH conv2d_1_tf.w\n//!HEIGHT conv2d_1_tf.h\n//!COMPONENTS 4\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\n#define go_0(x_off, y_off) (max((conv2d_1_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max(-(conv2d_1_tf_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(-0.06963679, -0.07560548, -0.069522075, 0.0038078027, -0.08002613, 0.13671301, 0.084461786, -0.039376218, 0.19136548, -0.123174496, 0.26566333, -0.16583005, -0.18664864, -0.023539122, -0.21928434, -0.026818147) * go_0(-1.0, -1.0);\n    result += mat4(0.16660932, -0.18558703, 0.37230486, 0.118128106, -0.14098641, 0.14659132, -0.22217897, 0.12952235, -0.4139033, -0.04308319, 0.12885277, -0.17986743, -0.23556231, -0.08351981, -0.43240538, 0.019033253) * go_0(-1.0, 0.0);\n    result += mat4(-0.18008037, -0.04448665, 0.011906908, -0.023056917, 0.18136618, -0.04723555, -0.0050158803, -0.14823224, -0.2105281, 0.023047728, -0.14040631, -0.03178526, -0.13477588, -0.01820428, 0.058358394, 0.23792502) * go_0(-1.0, 1.0);\n    result += mat4(0.07363309, -0.061728477, 0.03573137, -0.0050971056, -0.012813505, -0.17236637, 0.1697835, 0.055788577, -0.22263195, 0.10324512, 0.58971673, -0.4872246, -0.1555681, 0.032747746, -0.096495196, 0.070196226) * go_0(0.0, -1.0);\n    result += mat4(0.14174286, 0.099460006, -0.088765986, 0.58350676, -0.025177564, -0.46004987, 0.37007022, -0.11437029, -0.5164534, -0.60465246, 0.38859612, -0.32846406, 0.050266482, -0.20334712, 0.18316261, -0.19327633) * go_0(0.0, 0.0);\n    result += mat4(-0.09377763, -0.0012762006, -0.028991895, -0.26523829, 0.20173682, 0.037923716, -0.03174243, 0.07103378, -0.10764164, -0.30752546, 0.20556998, -0.1892279, 0.08115748, -0.023550175, -0.07627362, 0.11746628) * go_0(0.0, 1.0);\n    result += mat4(-0.06998859, -0.017997518, 0.069938794, -0.14943017, -0.14179112, 0.16643842, -0.110231474, 0.08895815, -0.24074875, 0.3277253, -0.07435203, -0.23452802, 0.039962552, -0.07145652, -0.022511544, -0.04571222) * go_0(1.0, -1.0);\n    result += mat4(-0.059785757, -0.23771374, -0.030571314, 0.25222278, 0.106601834, 0.34398326, 0.14511436, -0.03867526, -0.38982397, -0.11944689, 0.12997924, -0.13079585, 0.005729482, 0.012653905, -0.063693404, 0.09632285) * go_0(1.0, 0.0);\n    result += mat4(-0.04933823, 0.0547175, 0.050636575, -0.10060694, 0.1344485, 0.19752938, -0.100068115, -0.028829506, -0.14096203, -0.079092234, 0.092109434, 0.011606209, -0.04052607, -0.008347507, 0.06956573, -0.028109524) * go_0(1.0, 1.0);\n    result += mat4(0.21918017, -0.11115073, 0.2262453, -0.06889667, -0.11256312, -0.07438075, -0.088454485, 0.13672407, -0.06905764, 0.08128395, 0.016103368, 0.050190717, 0.09691516, 0.05845721, 0.4886816, 0.041121427) * go_1(-1.0, -1.0);\n    result += mat4(-0.3449472, 0.09711974, -0.13881907, -0.018265123, 0.27855873, -0.07030004, 0.29545054, 0.37216932, 0.08657718, 0.099066615, -0.10574013, -0.17667885, -0.14855732, -0.11351448, 0.66945946, 0.11312157) * go_1(-1.0, 0.0);\n    result += mat4(0.2526151, -0.04594331, -0.06606611, 0.09104881, 0.06857995, -0.075284235, -0.17664689, 0.21578754, 0.0696524, 0.09142951, 0.080997564, -0.0682772, -0.0011445724, -0.11736295, 0.2519232, -0.101926275) * go_1(-1.0, 1.0);\n    result += mat4(-0.12913518, 0.058357026, 0.195421, -0.15651494, 0.2877076, 0.0033844314, -0.07831594, 0.052855384, -0.031295884, 0.03301088, -0.18408822, 0.06732994, 0.23742151, -0.12568143, 0.22810535, -0.11545694) * go_1(0.0, -1.0);\n    result += mat4(-0.49203303, -0.22656603, 0.1723193, -0.51250046, -0.09742038, 0.758559, -0.3387505, -0.6193586, 0.14136684, 0.27679884, -0.050113205, 0.31041816, -0.36475047, -0.48746544, 0.3233227, 0.4579754) * go_1(0.0, 0.0);\n    result += mat4(0.46636763, 0.1507748, -0.2581362, 0.15413165, -0.17160143, 0.14256273, -0.074575804, -0.099299066, -0.0017214464, 0.13778336, -0.07378213, -0.15489665, -0.10533715, -0.0011083825, 0.39584312, 0.0023906573) * go_1(0.0, 1.0);\n    result += mat4(0.026959421, -0.06391859, 0.0034752619, 0.14521928, -0.0010877338, -0.032619733, 0.005375293, -0.018952755, 0.03381545, -0.007652831, 0.034141563, 0.046016496, 0.11219674, 0.030913852, 0.077403754, 0.17192438) * go_1(1.0, -1.0);\n    result += mat4(0.040326044, 0.17290725, -0.1220239, -0.09594783, -0.025229257, 0.17913155, -0.26623353, -0.033396784, -0.03075146, 0.009143897, -0.0136083895, -0.13886899, 0.075683735, -0.11584183, 0.22182357, 0.19350322) * go_1(1.0, 0.0);\n    result += mat4(0.15726025, -0.10215694, -0.060057458, 0.26487043, -0.04075552, -0.016496127, 0.0015382086, 0.108562306, 0.026795091, 0.0441233, -0.08754318, -0.0460157, 0.048422016, 0.14107347, 0.07986661, 0.1047697) * go_1(1.0, 1.0);\n    result += vec4(0.0766796, 0.08115133, -0.05703058, 0.14025708);\n    return result;\n}\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(M)-Conv-4x3x3x8\n//!HOOK MAIN\n//!BIND conv2d_2_tf\n//!SAVE conv2d_3_tf\n//!WIDTH conv2d_2_tf.w\n//!HEIGHT conv2d_2_tf.h\n//!COMPONENTS 4\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\n#define go_0(x_off, y_off) (max((conv2d_2_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max(-(conv2d_2_tf_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(-0.18038331, 0.21830973, -0.10019419, -0.022745568, -0.14944611, -0.15669158, 0.46361133, -0.07289843, 0.02976627, -0.09000817, 0.113060996, 0.05635241, 0.012762965, -0.022688959, 0.01629751, 0.061114635) * go_0(-1.0, -1.0);\n    result += mat4(0.024338024, -0.10004009, -0.13709056, -0.0851965, 0.23927099, -0.024349794, -0.16574804, 0.084686354, -0.047885604, 0.09688507, -0.12733915, 0.06980246, 0.11480734, 0.014669346, -0.07505829, 0.04676309) * go_0(-1.0, 0.0);\n    result += mat4(0.054203495, 0.011881634, -0.036115017, -0.0686298, -0.13682245, -0.15678032, 0.057050128, -0.03368558, 0.13011025, 0.033391044, -0.09841339, -0.027057761, -0.18701133, 0.20852546, -0.13660902, 0.0005817616) * go_0(-1.0, 1.0);\n    result += mat4(-0.08077834, 0.35952288, -0.07647382, -0.0033230998, 0.13929126, -0.09155619, 0.14128102, 0.16005981, 0.18161216, -0.09485738, 0.0029118075, 0.052682754, 0.03242074, 0.08299826, 0.073796146, -0.06446532) * go_0(0.0, -1.0);\n    result += mat4(-0.36655015, 0.4606936, 0.19073649, 0.31655258, -0.006838053, -0.579939, 0.089126326, -0.14021218, -0.3437716, 0.16714323, 0.17705944, -0.22418492, -0.3883696, -0.2302651, 0.2581861, 0.21983066) * go_0(0.0, 0.0);\n    result += mat4(0.0992383, -0.014257871, -0.023896435, 0.19868234, 0.0408007, 0.07995299, 0.16102871, -0.11668251, 0.22458278, -0.05587917, 0.19373615, -0.016202094, -0.25106144, 0.15634494, 0.11624891, -0.2930768) * go_0(0.0, 1.0);\n    result += mat4(0.024616942, 0.36248252, -0.14779098, -0.019894283, -0.007111256, 0.010641561, -0.09541178, 0.21236233, 0.009501827, 0.08132797, -0.13983901, 0.027207611, 0.038444366, -0.013995817, -0.16242191, 0.03294123) * go_0(1.0, -1.0);\n    result += mat4(0.0131698875, -0.18124102, -0.13503514, -0.06099072, 0.07422735, -0.20906176, -0.049005672, 0.08739405, -0.031758767, -0.1978915, 0.23094437, 0.54512614, 0.21338555, -0.011205669, -0.23727885, -0.29533875) * go_0(1.0, 0.0);\n    result += mat4(-0.0010255767, -0.07168225, -0.033568826, 0.22161655, -0.087293416, 0.11350447, 0.13653576, 0.061226424, -0.13074352, 0.058425818, 0.038460605, 0.2749964, -0.012814839, 0.085885845, -0.038151987, -0.17960808) * go_0(1.0, 1.0);\n    result += mat4(0.19728905, -0.040724937, -0.18270236, 0.046735186, 0.03507326, 0.119867206, -0.12691991, 0.18119748, -0.052895024, 0.11348764, -0.043787055, 0.004703516, 0.006752757, -0.06939761, -0.009801806, -0.075640485) * go_1(-1.0, -1.0);\n    result += mat4(0.051735226, 0.1732299, -0.10672899, 0.0320877, -0.4913656, 0.2102274, 0.43920282, 0.059108034, 0.08349019, -0.16517872, 0.15436842, -0.1075667, 0.022741623, -0.26693836, 0.3645307, 0.017874828) * go_1(-1.0, 0.0);\n    result += mat4(0.034464058, 0.014929155, 0.054227423, 0.14167373, -0.0023630706, -0.08904212, 0.11918041, -0.034539603, 0.06048089, -0.06807333, 0.14447778, 0.035260547, 0.09979546, -0.1924939, 0.14596114, -0.12069667) * go_1(-1.0, 1.0);\n    result += mat4(-0.04427228, -0.23673469, 0.010357103, -0.2907043, -0.06845721, -0.078984015, 0.06867713, -0.058163825, -0.12154615, 0.08430951, 0.1922373, 0.030108064, -0.43081748, -0.38715646, -0.022240646, -0.15403675) * go_1(0.0, -1.0);\n    result += mat4(0.46885306, -0.33421394, -0.6695223, -0.41841158, 0.30317923, 0.24244753, -0.1047785, -0.18656285, 0.06261881, -0.4405616, 0.24233986, 0.40070608, 0.81440526, 0.11305212, -0.8826317, -0.023478031) * go_1(0.0, 0.0);\n    result += mat4(-0.07879348, -0.024378026, -0.041883785, -0.17030984, 0.23229122, -0.011237109, 0.12058088, 0.20766267, -0.36519575, 0.09599417, -0.1271098, 0.06990154, 0.21161246, 0.041002538, -0.36046275, 0.007304667) * go_1(0.0, 1.0);\n    result += mat4(0.10873893, 0.003872542, -0.13476561, -0.036068805, -0.054637462, 0.02304618, 0.04707738, -0.2856381, 0.07124422, 0.010866545, 0.20484549, -0.008342406, -0.43660247, -0.041055538, 0.33536008, -0.060022205) * go_1(1.0, -1.0);\n    result += mat4(0.1966458, 0.0016302796, -0.25712642, -0.09639119, -0.006955351, 0.10882133, 0.1107341, 0.062697805, -0.1074494, 0.17361663, 0.6429869, -0.39846307, -0.26302996, 0.048710946, 0.40387508, 0.4299715) * go_1(1.0, 0.0);\n    result += mat4(0.18948616, 0.24086732, -0.064474985, -0.11069709, 0.1279659, -0.13438123, -0.028438117, 0.125883, 0.018153818, -0.21942288, 0.020390838, -0.22797634, -0.10821287, -0.17175092, 0.122016855, 0.20699544) * go_1(1.0, 1.0);\n    result += vec4(-0.05101961, -0.060740646, -0.024465766, 0.058471628);\n    return result;\n}\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(M)-Conv-4x3x3x8\n//!HOOK MAIN\n//!BIND conv2d_3_tf\n//!SAVE conv2d_4_tf\n//!WIDTH conv2d_3_tf.w\n//!HEIGHT conv2d_3_tf.h\n//!COMPONENTS 4\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\n#define go_0(x_off, y_off) (max((conv2d_3_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max(-(conv2d_3_tf_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(-0.14533128, 0.07266841, 0.13238011, -0.23328504, 0.031516243, 0.058471266, -0.06394412, 0.090752736, -0.0042359144, 0.12357294, -0.04377495, 0.0011743477, 0.05412243, -0.08146249, 0.04002749, -0.032876283) * go_0(-1.0, -1.0);\n    result += mat4(-0.036972385, -0.15238069, -0.3453321, -0.36025128, 0.07597202, -0.02368151, -0.3889606, 0.34607083, 0.3133179, -0.21712309, -0.4210954, 0.21450534, 0.15226828, 0.25326282, 0.45327064, -0.3350824) * go_0(-1.0, 0.0);\n    result += mat4(0.019018406, -0.33060563, -0.092601225, 0.14970545, 0.1441509, -0.19228427, -0.032771986, 0.26331595, 0.052981265, -0.06627376, -0.08634131, 0.038706224, 0.13403937, -4.4842476e-05, 0.049002815, -0.12719193) * go_0(-1.0, 1.0);\n    result += mat4(0.17527401, -0.0035254909, -0.047959115, -0.4526988, -0.07510284, 0.0013256798, -0.07539148, 0.24220634, -0.08708839, -0.14494033, -0.17085724, -0.099797316, 0.0068515535, -0.08918779, 0.27164719, -0.1702649) * go_0(0.0, -1.0);\n    result += mat4(0.31848368, 0.48983255, -0.44140294, -0.65174145, -0.004199057, 0.19494705, 0.5196497, -0.027118586, 0.032509074, -0.23900363, -0.14489244, 0.36314297, -0.23168536, -0.20960593, 0.61471456, 0.12401275) * go_0(0.0, 0.0);\n    result += mat4(-0.24317405, 0.21560913, 0.15564032, 0.11606844, -0.15039803, -0.59578896, 0.14100945, -0.026194477, 0.37237462, -0.49472088, -0.15215331, -0.38820064, -0.25089455, -0.29643852, -0.09513793, 0.019779462) * go_0(0.0, 1.0);\n    result += mat4(0.12498539, 0.0710632, -0.25012368, -0.2272255, -0.08647026, 0.12277892, 0.011025097, -0.12168395, -0.13489573, 0.016708186, -0.15583871, -0.057124946, 0.1216943, 0.019803725, 0.06952334, -0.032985855) * go_0(1.0, -1.0);\n    result += mat4(0.28794885, 0.33783793, -0.14469545, -0.081780486, -0.50320613, -0.067601606, -0.06847453, -0.021648854, -0.34295765, 0.15071863, -0.06619896, -0.084465064, 0.31909832, 0.015414661, 0.14930317, -0.11295768) * go_0(1.0, 0.0);\n    result += mat4(0.24530606, 0.25526014, 0.09971985, -0.07749641, -0.2361951, -0.07997673, 0.03617294, 0.02959561, -0.4498983, -0.014073485, -0.20587012, 0.06396779, 0.1262825, 0.027433183, 0.14469334, 0.011538011) * go_0(1.0, 1.0);\n    result += mat4(-0.038572453, -0.023108613, -0.039481267, -0.012160024, -0.004521989, -0.028665857, 0.04295255, 0.10580258, 0.05439479, -0.072261885, 0.11030243, 0.08934696, 0.09133867, 0.017547369, 0.097613186, 0.05491059) * go_1(-1.0, -1.0);\n    result += mat4(-0.09972817, 0.057730395, 0.12665828, 0.32861367, -0.16186063, 0.0745509, 0.2394045, -0.08687853, -0.034404907, -0.05843572, 0.0684561, -0.1355754, 0.19248672, -0.60372186, 0.12583947, 0.4388962) * go_1(-1.0, 0.0);\n    result += mat4(0.10341107, 0.061113223, 0.08773817, -0.082504354, -0.16612078, 0.2681751, 0.019737698, -0.17122322, -0.135949, 0.3048101, 0.087803006, 0.11373851, 0.013192192, -0.27022064, 0.35529897, -0.15321451) * go_1(-1.0, 1.0);\n    result += mat4(-0.032835662, 0.11123062, -0.11322452, -0.17300649, 0.04680824, 0.12849288, 0.17269878, -0.048671383, 0.05189037, -0.009078046, 0.22105052, 0.013008137, -0.009738674, 0.15391739, 0.20969556, 0.14189166) * go_1(0.0, -1.0);\n    result += mat4(-0.47377753, 0.3038031, 0.18604809, 0.1931698, -0.2964668, -0.12287907, -0.7107761, 0.26619422, -0.33923018, 0.19200724, 0.013786281, -0.17496964, 0.079325035, -0.3694445, 0.0054486147, -0.33018264) * go_1(0.0, 0.0);\n    result += mat4(0.14903802, -0.028043179, 1.5238678e-05, 0.021232028, 0.16025065, 0.14746875, -0.22831628, -0.12177345, 0.038778774, 0.32188168, -0.042017702, 0.27155936, 0.17920609, 0.04099755, 0.28527525, 0.074623376) * go_1(0.0, 1.0);\n    result += mat4(0.057019282, -0.112741895, 0.030361209, 0.14567861, 0.056265317, -0.01573537, -0.06707608, 0.016657263, 0.09829025, -0.026795063, 0.023042196, 0.09438241, -0.025483066, -0.052787006, 0.19730279, 0.021218104) * go_1(1.0, -1.0);\n    result += mat4(0.19868211, -0.01531125, 0.108596824, -0.035456363, 0.0033609823, 0.057961613, -0.013726211, 0.101742364, 0.33357215, 0.14468077, 0.29711527, -0.24662566, -0.119014986, -0.1899639, 0.11246697, -0.0035374009) * go_1(1.0, 0.0);\n    result += mat4(-0.05602109, -0.15539522, 0.010730943, 0.057116497, -0.02037749, 0.084210664, -0.028235348, 0.10574697, 0.056925274, 0.07922333, -0.090088, 0.1615985, -0.0044301567, -0.089945644, 0.024176618, -0.041844133) * go_1(1.0, 1.0);\n    result += vec4(0.0015292584, -0.043625206, -0.09429898, -0.06280405);\n    return result;\n}\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(M)-Conv-4x3x3x8\n//!HOOK MAIN\n//!BIND conv2d_4_tf\n//!SAVE conv2d_5_tf\n//!WIDTH conv2d_4_tf.w\n//!HEIGHT conv2d_4_tf.h\n//!COMPONENTS 4\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\n#define go_0(x_off, y_off) (max((conv2d_4_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max(-(conv2d_4_tf_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(0.06051604, -0.028152643, -0.21418124, 0.13032125, 0.42565975, -0.09571944, -0.34494513, 0.30004, -0.073245734, -0.028659137, 0.0032105136, -0.05009555, -0.048971225, 0.04814533, 0.002843805, -0.046224426) * go_0(-1.0, -1.0);\n    result += mat4(-0.07495975, 0.018714864, 0.21229684, -0.13614887, 0.79988647, -0.0697328, 0.38232988, 0.24165109, 0.25947478, -0.0009418982, -0.17369923, 0.10007766, 0.024117598, 0.028611807, 0.15090801, -0.06344829) * go_0(-1.0, 0.0);\n    result += mat4(-0.07982219, 0.0900347, 0.007609254, -0.0034791247, 0.013611781, -0.13560618, 0.09685799, 0.06276075, 0.134693, -0.14370437, -0.25175703, -0.0016138123, -0.0075672898, -0.13325731, -0.061100446, 0.0059743375) * go_0(-1.0, 1.0);\n    result += mat4(-0.039018434, -0.19668463, -0.43018532, 0.31886247, 0.4965479, 0.114569925, 0.19110382, 0.27343535, 0.0707728, -0.11877004, -0.25827697, 0.37012872, 0.1474777, 0.07056952, -0.14965728, 0.061595406) * go_0(0.0, -1.0);\n    result += mat4(0.506543, -0.16268773, 0.455319, -0.0702646, 0.70102173, -0.14041683, 0.70184857, 0.4817842, -0.3389246, -0.14463086, 0.13763213, -1.1259074, 0.47722015, 0.38352612, -0.04293366, -0.5604627) * go_0(0.0, 0.0);\n    result += mat4(0.17606944, 0.15897374, 0.13499324, 0.29241478, -0.032824475, 0.11128662, -0.22204424, -0.051803727, 0.013195331, -0.42040786, -0.3950585, 0.70745844, 0.38646924, -0.19080774, -0.15171832, -0.10742828) * go_0(0.0, 1.0);\n    result += mat4(-0.039278325, 0.18421806, -0.044948544, 0.07902063, -0.2149251, 0.09913459, -0.09743655, -0.26899317, -0.002695496, -0.07554527, -0.22373366, 0.17830558, -0.047994815, -0.06789183, -0.06755918, -0.104452066) * go_0(1.0, -1.0);\n    result += mat4(-0.0493473, -0.30411786, -0.056439694, -0.06582185, -0.21309847, 0.100670904, -0.22966193, -0.045954112, 0.12728062, -0.25081897, -0.094699375, -0.4036555, 0.060854495, -0.64373237, -0.21522263, -0.6683476) * go_0(1.0, 0.0);\n    result += mat4(0.063481025, 0.11744312, -0.043330096, 0.33817932, -0.06679828, -0.23207302, -0.10188898, -0.10590511, 0.058780864, 0.047292337, -0.11834696, 0.10076128, -0.036641665, 0.30200714, -0.0002892557, -0.10303763) * go_0(1.0, 1.0);\n    result += mat4(-0.10842604, 0.042055763, 0.29702973, -0.07409644, -0.030164458, -0.012098744, -0.06396587, -0.08787527, 0.051854923, 0.12997511, 0.11468497, 0.15022379, 0.007814715, 0.014517445, 0.025484756, 0.01078619) * go_1(-1.0, -1.0);\n    result += mat4(-0.29229385, 0.040265664, -0.15376821, 0.075579196, -0.05593569, -0.045405343, 0.12099204, 0.1571252, 0.17841713, 0.04673325, 0.14550509, 0.08603346, -0.049786013, 0.06121843, -0.16273825, -0.13857752) * go_1(-1.0, 0.0);\n    result += mat4(0.06903744, 0.2628764, -0.13582836, -0.35678583, -0.13821034, -0.019381443, -0.19570538, -0.09298511, 0.08965436, 0.09745909, 0.20055099, 0.024967568, 0.08144204, 0.004633625, 0.12809834, -0.009431525) * go_1(-1.0, 1.0);\n    result += mat4(0.09784006, 0.010729353, 0.046643205, -0.110926524, -0.21556224, 0.00016300633, 0.122175336, 0.15004392, 0.013864355, 0.24767809, 0.13865592, 0.0155424485, -0.1450483, -0.15688781, -0.06195043, -0.13745981) * go_1(0.0, -1.0);\n    result += mat4(0.018991318, 0.55401963, 0.11709872, -0.028442185, -0.46035343, -0.10215539, -0.60193926, 0.47882316, -0.23346989, 0.037200127, 0.22814943, -0.08231696, -0.36430013, -0.011152757, 0.48752213, 0.29796222) * go_1(0.0, 0.0);\n    result += mat4(-0.07258066, -0.023222538, 0.23230423, -0.30317304, 0.03942911, -0.06899803, 0.23778579, 0.07418621, -0.17443737, 0.33387753, 0.007354842, -0.123447575, -0.1745315, 0.11071779, -0.11949625, -0.22832453) * go_1(0.0, 1.0);\n    result += mat4(-0.024909232, -0.0308135, 0.12170621, -0.13298757, 0.045828197, -0.1532345, -0.06633672, 0.23591088, 0.04964077, 0.14091493, 0.038343724, -0.029780807, 0.05762822, -0.048930667, -0.02434709, 0.07109019) * go_1(1.0, -1.0);\n    result += mat4(-0.16039175, 0.3004474, -0.17278233, 0.13677922, 0.18838613, 0.15054552, 0.32901475, -0.1288333, 0.26378244, -0.05119892, 0.34533516, 0.25180495, 0.19452183, 0.0843233, -0.08029368, 0.39877903) * go_1(1.0, 0.0);\n    result += mat4(-0.07097129, -0.26492423, -0.055032317, -0.093516104, -0.11795062, 0.04086253, -0.07989471, 0.059686553, 0.09378249, 0.45851848, 0.2510942, 0.19599153, 0.019765077, -0.02920918, -0.04125142, -0.13859107) * go_1(1.0, 1.0);\n    result += vec4(0.04400571, -0.04015565, 0.0140529545, 0.05474095);\n    return result;\n}\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(M)-Conv-4x3x3x8\n//!HOOK MAIN\n//!BIND conv2d_5_tf\n//!SAVE conv2d_6_tf\n//!WIDTH conv2d_5_tf.w\n//!HEIGHT conv2d_5_tf.h\n//!COMPONENTS 4\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\n#define go_0(x_off, y_off) (max((conv2d_5_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max(-(conv2d_5_tf_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(-0.014236042, -0.0031431736, -0.1551387, 0.12515116, -0.28528872, 0.36161992, 0.15750743, -0.17111474, 0.13792591, -0.0657419, -0.17471549, 0.14650472, 0.034169197, -0.019157575, 0.23520657, -0.20358163) * go_0(-1.0, -1.0);\n    result += mat4(0.02015035, 0.12993371, 0.11199667, -0.09854378, 0.5001741, 0.03462961, 0.24919736, 0.08505297, -0.20902094, -0.24141377, -0.15360375, 0.049974803, -0.037157424, -0.048510186, 0.20106035, -0.118480384) * go_0(-1.0, 0.0);\n    result += mat4(0.086798504, -0.009607818, 0.034812123, -0.005187592, 0.0351509, 0.021755, -0.04996161, -0.041231696, 0.0020545553, 0.015730752, -0.07507172, 0.018597523, -0.02393343, 0.07624775, 0.03892451, -0.0025574185) * go_0(-1.0, 1.0);\n    result += mat4(0.035725456, 0.06809103, 0.51926994, -0.39983147, -0.16402833, -0.1243394, -0.25922915, 0.28285915, 0.15959994, -0.2351732, 0.2650535, -0.30193794, -0.11468332, 0.050777763, -0.51894253, 0.4408367) * go_0(0.0, -1.0);\n    result += mat4(-0.27042082, 0.22243942, 0.14902467, 0.38428563, 0.46612173, 0.5169912, -0.22330502, -0.11300288, -0.36141354, 0.0668681, 0.2984152, 0.1275798, -0.24121419, 0.2952039, -0.45109174, -0.3822957) * go_0(0.0, 0.0);\n    result += mat4(0.26543504, -0.05742226, -0.052103903, -0.013124308, -0.14358385, -0.04024543, 0.07665455, -0.012301872, -0.18752757, -0.03913891, 0.038205814, -0.006583095, -0.25550908, -0.25725332, -0.12454206, -0.0058936924) * go_0(0.0, 1.0);\n    result += mat4(-0.0018946569, 0.019746022, -0.13080788, 0.11450627, -0.013743845, -0.027179785, -0.14425103, 0.07109661, 0.023703793, 0.086905524, 0.03151253, 0.0132474145, 0.041018624, 0.04548913, 0.2718715, -0.20008296) * go_0(1.0, -1.0);\n    result += mat4(-0.076830454, 0.11652955, 0.5068201, -0.3082819, 0.058615055, -0.006765798, -0.057522714, 0.049981344, -0.006897243, -0.21763432, 0.16896053, -0.21176189, -0.061227098, 0.03566485, 0.08901554, -0.050980624) * go_0(1.0, 0.0);\n    result += mat4(0.02327798, 0.07662976, 0.034811985, -0.03238033, -0.0021881019, -0.030997375, -0.069672935, 0.04040273, -0.1217442, 0.104173124, 0.09862539, 0.020557549, -0.022286594, 0.10287763, -0.021694934, 0.07542515) * go_0(1.0, 1.0);\n    result += mat4(0.124069154, -0.08579466, -0.07816314, 0.11332851, -0.034682628, -0.11038275, 0.04750615, -0.096100725, 0.039588403, -0.15149672, -0.05529172, 0.034304325, -0.022520235, -0.05023852, -0.2674731, 0.21886522) * go_1(-1.0, -1.0);\n    result += mat4(-0.1948599, -0.14946899, -0.39548838, 0.18042913, -0.007919619, 0.19826505, 0.23789087, 0.009140256, 0.11857748, 0.18215668, 0.13606293, -0.09209675, -0.080678545, -0.020431137, -0.07728839, -0.051353537) * go_1(-1.0, 0.0);\n    result += mat4(-0.07616472, -0.0032800382, -0.045657665, -0.039144326, -0.37786487, -0.08877774, 0.053579114, -0.070886396, 0.011311804, 0.107276045, 0.013236154, 0.009832061, 0.08292063, 0.12258811, 0.0005569043, -0.009806432) * go_1(-1.0, 1.0);\n    result += mat4(-0.28062925, 0.15946878, -0.1021801, -0.06471589, -0.26999477, 0.21230288, -0.14243907, 0.2555922, -0.09608517, 0.26339412, 0.20891234, -0.23538485, 0.33958244, -0.12569186, 0.43289876, -0.33462036) * go_1(0.0, -1.0);\n    result += mat4(0.16265294, 0.2625464, -0.34452894, 0.2233622, 0.13850005, -0.42999864, -0.5385177, -0.11035979, 0.51662, -0.78238726, -0.09422375, 0.83759475, 0.44468537, 0.14301361, 0.108906105, 1.1596143) * go_1(0.0, 0.0);\n    result += mat4(-0.73757625, -0.12369605, 0.23523071, 0.006587637, -0.15445381, 0.22757277, 0.052819528, 0.10183905, -0.07912228, -0.16998893, -0.13360223, 0.014348178, -0.17778571, -0.41047302, 0.10241381, -0.08526306) * go_1(0.0, 1.0);\n    result += mat4(0.14712952, 0.048995696, 0.05299946, -0.06817572, 0.1498064, -0.079825334, 0.40354064, -0.31789717, -0.1998377, 0.00955295, -0.32318407, 0.30898204, -0.039571725, -0.026203401, -0.16292085, 0.08574385) * go_1(1.0, -1.0);\n    result += mat4(-0.6353329, -0.56000775, -0.17279743, 0.18198174, -0.19555812, 0.056538377, 0.34365895, -0.07799055, 0.19011354, -0.13952748, 0.029196098, -0.19596763, -0.069196045, -0.17402656, 0.07948411, -0.016226962) * go_1(1.0, 0.0);\n    result += mat4(0.25592864, 0.083498634, -0.28515807, 0.10789751, 0.0043962947, 0.07085363, 0.048724182, -0.025131436, -0.0049440865, -0.033094388, -0.032935806, 0.04266025, 0.20026933, 0.0927841, -0.006839351, -0.013012285) * go_1(1.0, 1.0);\n    result += vec4(0.02021373, 0.0014037411, 0.0012718709, 0.017278494);\n    return result;\n}\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(M)-Conv-4x1x1x56\n//!HOOK MAIN\n//!BIND conv2d_tf\n//!BIND conv2d_1_tf\n//!BIND conv2d_2_tf\n//!BIND conv2d_3_tf\n//!BIND conv2d_4_tf\n//!BIND conv2d_5_tf\n//!BIND conv2d_6_tf\n//!SAVE conv2d_last_tf\n//!WIDTH conv2d_tf.w\n//!HEIGHT conv2d_tf.h\n//!COMPONENTS 4\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\n#define g_0 (max((conv2d_tf_tex(conv2d_tf_pos)), 0.0))\n#define g_1 (max(-(conv2d_tf_tex(conv2d_tf_pos)), 0.0))\n#define g_2 (max((conv2d_1_tf_tex(conv2d_1_tf_pos)), 0.0))\n#define g_3 (max(-(conv2d_1_tf_tex(conv2d_1_tf_pos)), 0.0))\n#define g_4 (max((conv2d_2_tf_tex(conv2d_2_tf_pos)), 0.0))\n#define g_5 (max(-(conv2d_2_tf_tex(conv2d_2_tf_pos)), 0.0))\n#define g_6 (max((conv2d_3_tf_tex(conv2d_3_tf_pos)), 0.0))\n#define g_7 (max(-(conv2d_3_tf_tex(conv2d_3_tf_pos)), 0.0))\n#define g_8 (max((conv2d_4_tf_tex(conv2d_4_tf_pos)), 0.0))\n#define g_9 (max(-(conv2d_4_tf_tex(conv2d_4_tf_pos)), 0.0))\n#define g_10 (max((conv2d_5_tf_tex(conv2d_5_tf_pos)), 0.0))\n#define g_11 (max(-(conv2d_5_tf_tex(conv2d_5_tf_pos)), 0.0))\n#define g_12 (max((conv2d_6_tf_tex(conv2d_6_tf_pos)), 0.0))\n#define g_13 (max(-(conv2d_6_tf_tex(conv2d_6_tf_pos)), 0.0))\nvec4 hook() {\n    vec4 result = mat4(-0.0067711817, 0.08160003, 0.0247279, 0.03084815, -0.026977416, -0.02120602, -0.025078611, -0.029852165, -0.011627478, -0.012742972, 0.022736797, -0.0028815821, -0.007515677, 0.0172887, -0.023259213, 0.009608947) * g_0;\n    result += mat4(-0.028660107, -0.014015208, -0.027838672, -0.013171922, 0.0029435428, 0.027047642, -0.017478354, 0.022834882, -0.037572853, -0.0034044068, -0.0149029335, -0.013362301, 0.009827443, -0.015742151, -0.0074795415, -0.0022266617) * g_1;\n    result += mat4(-0.07579662, -0.039754186, -0.066026606, -0.046816852, 0.1099032, 0.043956704, 0.073109835, 0.04680284, -0.06896613, -0.008838632, -0.044584926, -0.01319039, -0.0021152915, -0.04503326, 0.027061926, -0.028334105) * g_2;\n    result += mat4(0.15458213, 0.059769996, 0.09327123, -0.028782733, 0.023459995, -0.15390377, -0.13432898, -0.1127775, 0.072764635, -0.0020463336, 0.034736466, -0.0012086042, -0.05847183, -0.029952323, 0.052969377, 0.09590908) * g_3;\n    result += mat4(-0.07476772, -0.016574614, 0.04131183, 0.017335678, 0.009654406, 0.072183535, -0.002266456, 0.086873695, 9.310129e-05, 0.0056416965, -0.004188391, 0.023132093, -0.05183336, -0.025825873, -0.03684392, -0.0075729224) * g_4;\n    result += mat4(0.00878842, 0.03869637, -0.035759524, 0.003345386, -0.064184256, -0.034568302, -0.06672922, -0.0686381, -0.06794392, -0.10685906, 0.04679947, -0.012535639, 0.006932529, -0.007783515, 0.109123886, 0.13804391) * g_5;\n    result += mat4(-0.03160699, 0.050473, -0.09030729, 0.0649397, 0.11466501, 0.17912874, -0.0081851315, 0.052244574, 0.051632743, 0.061941486, 0.06546816, 0.12174249, -0.05104755, -0.018193979, -0.032196652, -0.035292786) * g_6;\n    result += mat4(0.013612735, -0.0024100312, -0.068611205, -0.07369285, -0.019647537, -0.066944756, -0.010012875, -0.06785739, -0.062246565, -0.087313406, -0.044278186, -0.09368995, 0.052555013, 0.13604961, 0.05645059, 0.08763303) * g_7;\n    result += mat4(0.04218486, -0.05028401, 0.059086576, -0.03545452, 0.027737848, 0.0043074046, 0.0011001764, -0.073026665, -0.04094988, 0.044061556, -0.009812515, 0.06841999, -0.06612581, 0.037223976, -0.07759491, -0.04356598) * g_8;\n    result += mat4(-0.027558247, 0.014248466, -0.019813016, -0.058107473, -0.016717663, -0.020424338, 0.0053625097, -0.009917319, 0.013678771, 0.0113340765, 0.0061787106, -0.036083996, -0.020179711, -0.011310535, 0.054827053, -0.0008278952) * g_9;\n    result += mat4(0.028690035, -0.012079616, 0.11931408, -0.048533775, 0.069336995, 0.0049852817, 0.013774468, 0.035233382, -0.07384821, 0.0003354423, -0.0059171803, -0.04503906, 0.08727279, 0.005138857, -0.17724465, 0.055782065) * g_10;\n    result += mat4(-0.20744391, 0.24348328, -0.3145766, 0.17026486, -0.022870807, -0.01648648, -0.05912279, -0.012555373, -0.066004686, 0.03182394, 0.16285324, -0.1221846, -0.31816196, 0.007928748, 0.43180224, -0.015949022) * g_11;\n    result += mat4(0.16363169, 0.14781676, -0.2377973, -0.1571377, -0.09038187, 0.0046504294, 0.033955004, -0.051421452, 0.046735536, 0.006827522, -0.121338, 0.12671822, 0.15833299, -0.1858712, -0.1942371, 0.17336044) * g_12;\n    result += mat4(-0.018145572, -0.015550516, 0.044410378, 0.046016492, 0.084021375, 0.05327457, -0.008270992, -0.045435544, 0.07185879, -0.131923, 0.26721445, -0.26745328, -0.07093472, 0.042701527, 0.13793674, -0.095621444) * g_13;\n    result += vec4(0.016836504, 0.010161949, 0.021351453, 0.01278978);\n    return result;\n}\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(M)-Depth-to-Space\n//!HOOK MAIN\n//!BIND MAIN\n//!BIND conv2d_last_tf\n//!SAVE MAIN\n//!WIDTH conv2d_last_tf.w 2 *\n//!HEIGHT conv2d_last_tf.h 2 *\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\nvec4 hook() {\n    vec2 f0 = fract(conv2d_last_tf_pos * conv2d_last_tf_size);\n    ivec2 i0 = ivec2(f0 * vec2(2.0));\n    float c0 = conv2d_last_tf_tex((vec2(0.5) - f0) * conv2d_last_tf_pt + conv2d_last_tf_pos)[i0.y * 2 + i0.x];\n    float c1 = c0;\n    float c2 = c1;\n    float c3 = c2;\n    return vec4(c0, c1, c2, c3) + MAIN_tex(MAIN_pos);\n}\n"
  },
  {
    "path": "assets/shaders/Anime4K_Upscale_CNN_x2_S.glsl",
    "content": "// MIT License\n\n// Copyright (c) 2019-2021 bloc97\n// All rights reserved.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(S)-Conv-4x3x3x3\n//!HOOK MAIN\n//!BIND MAIN\n//!SAVE conv2d_tf\n//!WIDTH MAIN.w\n//!HEIGHT MAIN.h\n//!COMPONENTS 4\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\n#define go_0(x_off, y_off) (MAIN_texOff(vec2(x_off, y_off)))\nvec4 hook() {\n    vec4 result = mat4(-0.0057322932, 0.12928207, -0.056848746, 0.18680117, -0.0306273, 0.25602463, 0.053723164, 0.20419341, 0.0018709862, 0.022848232, -0.04105527, 0.10169034, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, -1.0);\n    result += mat4(0.009471417, -0.12957802, 0.096014425, 0.21836184, 0.00021601951, -0.22997683, 0.23666254, 0.41192335, 0.021762101, 0.0047863554, 0.008233427, 0.108514786, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, 0.0);\n    result += mat4(-0.01156376, -0.18988979, 0.04614705, -0.044767227, 0.01050636, -0.26426336, 0.23741047, 0.0027636609, -0.027718676, -0.14202335, -0.016650287, -0.06637125, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, 1.0);\n    result += mat4(0.057809234, -0.11033858, 0.056533534, -0.06292466, 0.13880666, -0.18710336, 0.2441031, -0.25326246, 0.0032683122, -0.026437074, 0.0023248852, 7.640766e-05, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, -1.0);\n    result += mat4(-0.49110603, 0.4429004, -0.44015464, -0.41174838, -0.87738293, 0.7808468, -1.0929365, -0.59699076, -0.18409836, 0.185138, -0.11773224, -0.17097276, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, 0.0);\n    result += mat4(0.10580959, -0.055947904, -0.03431237, -0.080236495, 0.14862584, -0.15393938, -0.18872876, -0.3170681, 0.03559387, -0.003990826, 0.021298569, 0.012844483, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, 1.0);\n    result += mat4(-0.040715586, -0.25781113, 0.08896714, -0.1225879, -0.15790503, -0.54010904, 0.29588607, 0.10401059, 0.003413123, -0.108357325, 0.0112870345, -0.11888622, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, -1.0);\n    result += mat4(0.0049315444, 0.02376202, -0.08224771, 0.121118225, -0.041512914, -0.027994309, -0.585988, -0.069672115, -0.017247835, 0.0056576864, 0.04319012, 0.055003505, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, 0.0);\n    result += mat4(0.37521392, 0.15916082, 0.059708964, 0.19046007, 0.8120325, 0.38343868, 0.3436578, 0.5287958, 0.16570656, 0.06957687, 0.014022592, 0.074799836, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, 1.0);\n    result += vec4(-0.01050964, -0.00939481, 0.17684458, 0.027366742);\n    return result;\n}\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(S)-Conv-4x3x3x8\n//!HOOK MAIN\n//!BIND conv2d_tf\n//!SAVE conv2d_1_tf\n//!WIDTH conv2d_tf.w\n//!HEIGHT conv2d_tf.h\n//!COMPONENTS 4\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\n#define go_0(x_off, y_off) (max((conv2d_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max(-(conv2d_tf_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(-0.011029496, 0.05866063, -0.09460646, -0.017664742, -0.022488879, 0.18384217, -0.00397663, -0.064733066, 0.08466802, 0.10667488, 8.0212536e-05, 0.0908869, 0.13580276, 0.00097438256, 0.12176522, -0.08218466) * go_0(-1.0, -1.0);\n    result += mat4(0.16062798, -0.10190268, 0.03280682, 0.05621916, -0.009684231, -0.08464307, 0.17058301, -0.096469186, 0.1967505, -0.1450099, 0.093607284, -0.28240147, -0.21377413, 0.10079291, -0.1741522, 0.17330575) * go_0(-1.0, 0.0);\n    result += mat4(-0.060160473, 0.06316997, 0.0046929033, -0.049405966, 0.13851729, 0.06830702, -0.0586872, -0.040827133, 0.007052838, -0.03576886, -0.111261636, 0.039155316, -0.07380389, -0.09369825, 0.04471156, 0.09678487) * go_0(-1.0, 1.0);\n    result += mat4(-0.36683616, -0.035950605, -0.24414362, -0.009159744, 0.19335322, -0.099253505, 0.075083904, -0.00076695543, 0.65291303, -0.25599423, 0.19827642, 0.065899536, -0.07423247, -0.068967685, 0.0050554527, -0.060272824) * go_0(0.0, -1.0);\n    result += mat4(-0.020688485, -0.83178276, 0.11104878, 0.26454413, 0.13655476, 0.37675047, -0.22219229, -0.01751935, 0.44552696, 0.92510307, 0.16063261, -0.62011045, 0.19366647, -0.06996067, -0.2504841, 0.00803723) * go_0(0.0, 0.0);\n    result += mat4(0.0051537007, -0.057168536, -0.16110587, 0.25232598, -0.04447099, 0.11997351, 0.14808103, -0.34443566, -0.26212573, -0.21970181, 0.2724405, 0.21050811, -0.07949061, -0.064808235, -0.21208277, -0.0042361654) * go_0(0.0, 1.0);\n    result += mat4(-0.0888952, -0.20169449, 0.19144905, -0.016882861, -0.013283103, 0.07552998, -0.24686803, 0.012453213, -0.065454446, -0.016123284, -0.47316182, 0.070926026, 0.09219782, 0.13118166, 0.074736096, 0.0077910526) * go_0(1.0, -1.0);\n    result += mat4(0.5832154, 0.1138069, -0.039765622, 0.3182784, -0.25497997, 0.0013993139, 0.39285088, -0.48511526, -0.39891505, -0.19094779, -0.082146175, -0.20826934, 0.020590555, -0.0012490178, -0.4398621, 0.14377014) * go_0(1.0, 0.0);\n    result += mat4(0.21917395, 3.4314657e-05, 0.25734863, -0.3433305, 0.015720673, 0.2676127, -0.06807297, 0.15040149, -0.23638041, -0.0050233034, -0.13666134, 0.4542111, -0.033572577, -0.08450588, -0.23341487, 0.053490847) * go_0(1.0, 1.0);\n    result += mat4(-0.17482175, 0.057647135, 0.33135444, 0.0850751, -0.1718849, -0.0854123, 0.036795795, -0.13874969, -0.10903869, -0.19007301, -0.06064334, -0.03786032, -0.036696054, 0.07844446, 0.012523185, -0.01562906) * go_1(-1.0, -1.0);\n    result += mat4(-0.04411997, -0.10331819, 0.10050193, 0.12406485, 0.07431592, 0.30109692, -0.17511666, -0.13263564, -0.10192587, 0.07821255, -0.22415096, 0.25552443, 0.17881326, -0.13914281, 0.109979235, -0.0016463579) * go_1(-1.0, 0.0);\n    result += mat4(-0.01911644, -0.15412527, 0.028903123, 0.20831817, 0.00375175, 0.08110953, 0.074919395, -0.17581624, -0.015677985, 0.06504228, 0.08817818, -0.12518327, -0.09537373, 0.028905088, -0.051288474, 0.054334078) * go_1(-1.0, 1.0);\n    result += mat4(0.2852779, -0.28924024, 0.36805123, 0.21079305, -0.28336474, 0.1679663, -0.08641141, -0.10699407, -0.16090055, 0.1287612, -0.15910125, 0.05734755, 0.15883245, 0.0053026294, 0.080674745, 0.0505137) * go_1(0.0, -1.0);\n    result += mat4(0.17639062, 0.3790122, -0.19588692, -0.020314282, 0.26197383, 0.09014768, 0.19696823, -0.41025418, -0.08308115, -0.33279485, -0.22528782, 0.06172439, -0.1365661, -0.13094363, -0.005086559, 0.089024484) * go_1(0.0, 0.0);\n    result += mat4(0.05262993, 0.0006296959, 0.1657725, -0.32591924, 0.12126701, 0.061543245, -0.10526848, 0.041583937, 0.094976954, 0.09416157, -0.22019257, -0.058390073, -0.2073888, 0.057273377, 0.19558284, 0.004208022) * go_1(0.0, 1.0);\n    result += mat4(0.30005738, 0.18478931, -0.23342943, 0.22455733, -0.016488122, 0.099634305, 0.31620836, -0.15731157, 0.09595808, 0.0013774688, 0.48273298, -0.07027936, -0.18764344, -0.26194447, -0.11794225, -0.012173601) * go_1(1.0, -1.0);\n    result += mat4(0.117986746, -0.13846518, -0.019614812, -0.3011192, 0.5501164, 0.3408611, -0.40090847, 0.15706886, 0.13050972, 0.051776595, 0.20792943, 0.23389706, -0.22965533, -0.053367328, 0.3911586, -0.032988597) * go_1(1.0, 0.0);\n    result += mat4(0.054753624, -0.008485731, -0.2451672, 0.17528129, 0.13657846, 0.010480436, 0.07651423, -0.43316832, 0.12736236, 0.13804524, 0.12529011, -0.30946237, -0.14423579, 0.08403089, 0.24335162, 0.057288036) * go_1(1.0, 1.0);\n    result += vec4(0.012077211, 0.013045883, 0.0380778, -0.02908858);\n    return result;\n}\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(S)-Conv-4x3x3x8\n//!HOOK MAIN\n//!BIND conv2d_1_tf\n//!SAVE conv2d_2_tf\n//!WIDTH conv2d_1_tf.w\n//!HEIGHT conv2d_1_tf.h\n//!COMPONENTS 4\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\n#define go_0(x_off, y_off) (max((conv2d_1_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max(-(conv2d_1_tf_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(-0.036115196, -0.06971895, -0.07508942, 0.016036168, 0.12120111, 0.24536026, 0.044755507, -0.20663576, 0.029635755, -0.15427187, 0.027148994, -0.20795093, 0.10170582, 0.077919215, 0.66063017, -0.4632968) * go_0(-1.0, -1.0);\n    result += mat4(-0.0052889925, -0.019060908, -0.08660142, -0.022095207, -0.08097976, -0.015142803, -0.18552722, -0.078493506, -0.16293915, -0.20099808, -0.08370822, 0.3701389, 0.09094984, 0.2487225, 0.24338846, 0.044003833) * go_0(-1.0, 0.0);\n    result += mat4(-0.061406493, -0.017232792, -0.10917424, 0.11203319, 0.040699825, -0.019294346, 0.084953666, -0.018133596, 0.07209552, 0.016069936, 0.17805555, -0.089537814, 0.15809004, 0.1027023, 0.15044671, -0.15530108) * go_0(-1.0, 1.0);\n    result += mat4(0.0948676, -0.040305693, -0.005591629, -0.048048403, -0.07547777, 0.056606572, 0.021390207, 0.32600567, -0.20805131, -0.099587254, 0.029613169, 0.0092129605, -0.29429698, -0.09898621, 0.44470885, -0.89487344) * go_0(0.0, -1.0);\n    result += mat4(-0.122259885, 0.11445877, 0.06666907, 0.1869428, -0.1553992, -0.1658741, 0.2988138, -0.57746625, -0.34609964, 0.11169158, -0.41877756, 0.38075635, 0.21293911, 0.09640372, -0.12754214, -0.08026104) * go_0(0.0, 0.0);\n    result += mat4(0.15128808, 0.050087795, 0.09219755, -0.18080945, 0.0044571217, -0.046019405, -0.1289922, 0.20305426, 0.19601224, 0.04667917, 0.17465587, 0.027672665, 0.18441725, 0.06845396, 0.11288585, -0.23283863) * go_0(0.0, 1.0);\n    result += mat4(-0.072962, -0.06639447, 0.049347494, -0.1386401, 0.10396071, 0.08187777, -0.04280746, 0.07390891, 0.06628344, 0.037797406, 0.021885803, -0.013147403, 0.22376558, 0.36243078, 0.12874891, -0.0023783944) * go_0(1.0, -1.0);\n    result += mat4(0.074945286, 0.16045591, -0.11798349, 0.12910712, 0.054760084, -0.095626175, -0.047832094, 0.03493912, 0.11817307, 0.037452437, -0.14301221, -0.027356789, -0.052390423, 0.11373512, 0.07686775, 0.010008694) * go_0(1.0, 0.0);\n    result += mat4(-0.023999173, -0.091900624, 0.02388157, 0.03173873, 0.0065633506, -0.033716757, -0.1198324, 0.12057766, 0.026465805, -0.07517131, -0.07760598, 0.060463097, 0.07345541, 0.046037503, 0.21101558, -0.26785463) * go_0(1.0, 1.0);\n    result += mat4(0.15544604, -0.03902825, 0.04630384, -0.25173616, -0.0691359, 0.07476507, 0.009071253, 0.089964196, -0.26539803, -0.3958477, -0.22155671, 0.20735882, -0.105860494, -0.003996804, -0.044815883, 0.39544627) * go_1(-1.0, -1.0);\n    result += mat4(0.6169709, 0.23717614, -0.37884676, -0.7484867, 0.020169826, -0.30718836, 1.0965588, -0.20711036, -0.39149985, -0.06843563, -0.06522909, 0.103805855, 0.03265825, -0.15137726, 0.12837899, -0.01294922) * go_1(-1.0, 0.0);\n    result += mat4(-0.23638196, -0.4560866, -0.11948684, -0.1464144, 0.10690008, 0.007835961, 0.11864342, -0.13101323, -0.16509797, 0.075027354, 0.08122998, 0.13451207, 0.0011890623, 0.052157886, 0.08372405, -0.07085038) * go_1(-1.0, 1.0);\n    result += mat4(-0.21997726, -0.16488647, -0.0291317, 0.17997476, 0.1493211, 0.027494298, 0.0034613227, -0.3207727, 0.18699001, 0.14728633, -0.042895135, -0.07612043, 0.125076, -0.14714554, -0.03480009, -0.22753975) * go_1(0.0, -1.0);\n    result += mat4(-0.5342686, -0.7426105, -0.38294584, 0.42549992, 0.46053204, 0.7867879, 0.106234804, -0.041163098, 0.5198579, -0.5219404, 0.14809476, -0.41802374, 0.06810794, -0.15122683, -0.047409, 0.13178343) * go_1(0.0, 0.0);\n    result += mat4(-0.50428164, 0.18220626, 0.35510704, -0.081787474, 0.03155813, 0.019284263, 0.0032388573, -0.20513348, -0.05385551, 0.17803182, -0.26206362, 0.2870375, 0.008557827, 0.08401449, -0.027598893, -0.010791235) * go_1(0.0, 1.0);\n    result += mat4(0.16657415, 0.067647465, 0.093076974, -0.14438486, -0.10017002, 0.0022367141, 0.03250936, -0.052794546, -0.009178676, -0.019673595, -0.0016697067, -0.15424626, -0.112123474, -0.11079971, 0.011987111, -0.11747758) * go_1(1.0, -1.0);\n    result += mat4(-0.023021797, -0.058703423, -0.037978355, -0.062433913, -0.13130441, 0.048656322, 0.056839373, 0.109036915, -0.07823158, 0.14785293, 0.058555078, -0.11679035, -0.14002073, 0.07395252, 0.098268874, -0.06710464) * go_1(1.0, 0.0);\n    result += mat4(0.14906375, 0.030001195, -0.10338215, 0.0662968, -0.161953, -0.13682815, 0.09563142, 0.009514228, -0.009491218, 0.06737101, -0.1393389, 0.15231515, -0.073147796, 0.00767062, 0.028675212, 0.014213088) * go_1(1.0, 1.0);\n    result += vec4(0.018736731, -0.0026039074, 0.050130025, -0.055364225);\n    return result;\n}\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(S)-Conv-4x3x3x8\n//!HOOK MAIN\n//!BIND conv2d_2_tf\n//!SAVE conv2d_last_tf\n//!WIDTH conv2d_2_tf.w\n//!HEIGHT conv2d_2_tf.h\n//!COMPONENTS 4\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\n#define go_0(x_off, y_off) (max((conv2d_2_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max(-(conv2d_2_tf_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(0.019100675, -0.014241565, 0.004667036, -0.03865062, 0.106731094, 0.026099661, 0.014594411, -0.011881356, 0.0040967264, -0.004626336, 0.006469508, 0.010875305, -0.033909045, -0.085905954, 0.07861378, 0.019452631) * go_0(-1.0, -1.0);\n    result += mat4(0.20777655, -0.060354974, 0.0023840065, -0.064121604, -0.17397617, 0.019293457, -0.09707183, 0.080641985, 0.01025124, -0.017382381, 0.008661793, -0.010995665, 0.21943407, -0.115574986, 0.14471593, -0.068836235) * go_0(-1.0, 0.0);\n    result += mat4(0.057942886, -0.06311754, 0.2253396, -0.04159292, -0.020731755, 0.007877151, 0.041525815, 0.025278691, 0.03041967, -0.025137542, 0.024364179, -0.024543528, 0.029438615, -0.015506873, 0.081686, -0.07812221) * go_0(-1.0, 1.0);\n    result += mat4(0.054237515, 0.0676094, -0.0047708177, 0.0043467237, -0.10032304, -0.020498628, 0.04240586, 0.07272254, 0.0784221, 0.017945962, -0.022310399, -0.013134622, 0.015638694, -0.10001543, 0.1043031, 0.05898838) * go_0(0.0, -1.0);\n    result += mat4(-0.021652509, 0.35796642, 0.059497777, 0.23948468, 0.15454951, -0.10017235, -0.19072174, -0.44812536, -0.03974552, 0.04529369, 0.22207436, 0.026222564, -0.09705454, 0.5623026, -0.3354105, -0.017278556) * go_0(0.0, 0.0);\n    result += mat4(-0.053682446, -0.03411237, -0.09399936, 0.15128824, -0.07463, -0.042020727, 0.0031783928, 0.13481957, -0.07731454, 0.044114403, -0.23085599, 0.060444202, -0.15015422, 0.0018040676, -0.18684982, 0.2812511) * go_0(0.0, 1.0);\n    result += mat4(0.0029329916, 0.001596018, 0.0007512241, 0.016544111, -0.04876942, -0.05272409, 0.037884697, 0.049948208, 0.015518177, 0.11368592, -0.03815777, -0.013149978, -0.027638039, 0.107719295, -0.04115787, 0.02745414) * go_0(1.0, -1.0);\n    result += mat4(0.016691081, 0.010204119, 0.04078854, 0.01613337, 0.03325829, 0.0114824055, -0.017286912, -0.07284126, -0.110984206, -0.21041764, 0.0089543555, 0.18986733, 0.01537506, -0.2059135, 0.029074017, 0.013117443) * go_0(1.0, 0.0);\n    result += mat4(0.013965926, 0.029871881, 0.0034499036, -0.011343668, 0.022120327, -0.0068748263, 0.009324342, -0.039081004, 0.08032371, 0.050809264, 0.035050742, -0.2032847, 0.06305391, -0.021958945, 0.038569167, -0.22465245) * go_0(1.0, 1.0);\n    result += mat4(0.046307724, -0.012419472, 0.007673863, -0.042344846, 0.011042414, 0.016994251, -0.018166406, -0.016955731, -0.13240299, 0.01768431, -0.027607648, 0.0699927, -0.02840628, 0.004414203, 0.0049618417, 0.011084679) * go_1(-1.0, -1.0);\n    result += mat4(-0.119954154, -0.007455482, -0.031108133, -0.009946449, 0.0077065965, 0.01660345, 0.032943666, 0.016376585, 0.10273124, 0.1556573, -0.24643841, 0.107307844, -0.068235755, 0.0561896, -0.0104672015, 0.042693343) * go_1(-1.0, 0.0);\n    result += mat4(-0.01634601, 0.04195375, -0.10401894, 0.047641944, -0.034602515, -0.0034419263, -0.010457858, 0.015194475, -0.03962551, -0.030031368, 0.16036317, 0.019283568, -0.05877721, 0.016504882, -0.15523468, 0.018161612) * go_1(-1.0, 1.0);\n    result += mat4(-0.08083991, 0.0024665035, -0.049373373, 0.030371357, 0.0113322195, -0.014676956, 0.011646689, -0.01142667, 0.124930486, 0.06625774, -0.045840867, -0.009693036, -0.012649251, -0.07388084, 0.008790075, 0.0013844534) * go_1(0.0, -1.0);\n    result += mat4(-0.33941835, -0.2763476, -0.118311435, -0.063535266, 0.20936015, 0.13731301, 0.13443594, 0.07464433, 0.059650812, -0.36973104, 0.16444235, -0.37082872, 0.06432777, -0.18283032, -0.044489607, -0.13895285) * go_1(0.0, 0.0);\n    result += mat4(0.13533665, 0.08268915, -0.03675727, -0.14348659, 0.0186255, -0.05051692, 0.056702953, 0.0061717895, 0.047663026, -0.088188455, 0.23254345, -0.014015464, 0.08400204, -0.0073777726, 0.2202068, -0.12366078) * go_1(0.0, 1.0);\n    result += mat4(0.04361004, 0.046543695, 0.0064863074, -0.03358146, -0.022602187, 0.018138997, -0.011071864, 0.010244091, -0.019814799, -0.17250171, 0.040823266, -0.040131986, 0.010125854, 0.020660749, 0.0020435036, -0.010819304) * go_1(1.0, -1.0);\n    result += mat4(-0.004810193, -0.11286074, 0.051985834, 0.04788631, -0.023950428, 0.036145125, -0.038203828, 0.052401308, 0.022986965, 0.26420745, -0.06076917, -0.09252999, 0.03164547, 0.15652153, -0.037934, -0.0035418556) * go_1(1.0, 0.0);\n    result += mat4(0.03358366, -0.005219482, 0.007060882, -0.06569114, -0.02941682, 0.00966056, -0.0153679885, 0.019905418, -0.107232265, -0.03405676, -0.044340115, 0.26892832, -0.04723829, -0.02589829, 0.004563232, 0.19318114) * go_1(1.0, 1.0);\n    result += vec4(-0.00346731, -0.0046263863, -0.004627155, -0.0057769152);\n    return result;\n}\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(S)-Depth-to-Space\n//!HOOK MAIN\n//!BIND MAIN\n//!BIND conv2d_last_tf\n//!SAVE MAIN\n//!WIDTH conv2d_last_tf.w 2 *\n//!HEIGHT conv2d_last_tf.h 2 *\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\nvec4 hook() {\n    vec2 f0 = fract(conv2d_last_tf_pos * conv2d_last_tf_size);\n    ivec2 i0 = ivec2(f0 * vec2(2.0));\n    float c0 = conv2d_last_tf_tex((vec2(0.5) - f0) * conv2d_last_tf_pt + conv2d_last_tf_pos)[i0.y * 2 + i0.x];\n    float c1 = c0;\n    float c2 = c1;\n    float c3 = c2;\n    return vec4(c0, c1, c2, c3) + MAIN_tex(MAIN_pos);\n}\n"
  },
  {
    "path": "assets/shaders/Anime4K_Upscale_CNN_x2_VL.glsl",
    "content": "// MIT License\n\n// Copyright (c) 2019-2021 bloc97\n// All rights reserved.\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(VL)-Conv-4x3x3x3\n//!HOOK MAIN\n//!BIND MAIN\n//!SAVE conv2d_tf\n//!WIDTH MAIN.w\n//!HEIGHT MAIN.h\n//!COMPONENTS 4\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\n#define go_0(x_off, y_off) (MAIN_texOff(vec2(x_off, y_off)))\nvec4 hook() {\n    vec4 result = mat4(0.3053028, -0.037464816, 0.113983095, 0.12537485, -0.18630321, 0.084269725, -0.01351514, -0.20190673, -0.12298384, -0.037622184, -0.070214555, -0.19367279, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, -1.0);\n    result += mat4(-0.41849324, 0.099702746, -0.04276645, -0.047299717, 0.20074473, 0.14217933, 0.15571699, 0.19553481, 0.21868695, -0.053848714, 0.016413521, 0.14117444, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, 0.0);\n    result += mat4(0.030540446, -0.052293833, 0.0715466, -0.31160545, 0.07808315, -0.16860045, 0.032828577, -0.2955024, -0.110374965, 0.04043687, -0.014024628, 0.058699366, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, 1.0);\n    result += mat4(-0.10727635, 0.054200135, 0.20853694, 0.21086875, 0.122690216, -0.091823794, 0.310609, -0.01738923, -0.0013488946, 0.10835534, -0.077265196, 0.086751856, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, -1.0);\n    result += mat4(-0.77150255, 0.40530515, -0.41257596, -0.14367618, 0.46888494, 0.2650122, -0.934199, 0.40476102, 0.32293493, 0.20251967, 0.19891106, -0.29698747, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, 0.0);\n    result += mat4(-0.12505147, -0.41904053, -0.065798186, 0.34075752, 0.026240354, -0.2977496, 0.032647505, -0.003566783, 0.10290523, -0.23417123, -0.06014203, 0.094735645, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, 1.0);\n    result += mat4(0.11207838, -0.04062474, 0.023897955, 0.08605987, -0.020888371, 0.045541205, -0.07231824, -0.25884083, -0.11796847, -0.002691391, 0.0050435597, 0.02756291, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, -1.0);\n    result += mat4(0.4615728, 0.041790638, 0.08971143, 0.20213957, -0.38537467, 0.19938901, 0.08594364, -0.08621994, -0.08163473, -0.133266, -0.09561729, -0.014209637, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, 0.0);\n    result += mat4(0.0787417, -0.0483673, 0.07621572, -0.060169693, -0.013465177, -0.17152289, 0.02515561, 0.17675288, -0.05173998, 0.10768042, -0.029858522, -0.013957215, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, 1.0);\n    result += vec4(0.0072128535, -0.05658625, 0.052939568, -0.1760861);\n    return result;\n}\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(VL)-Conv-4x3x3x3\n//!HOOK MAIN\n//!BIND MAIN\n//!SAVE conv2d_tf1\n//!WIDTH MAIN.w\n//!HEIGHT MAIN.h\n//!COMPONENTS 4\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\n#define go_0(x_off, y_off) (MAIN_texOff(vec2(x_off, y_off)))\nvec4 hook() {\n    vec4 result = mat4(-0.112743355, 0.0422517, 0.21350034, -0.0967133, 0.16265953, 0.0022497, 0.015078242, 0.08204187, 0.035236806, -0.0468228, -0.09464228, -0.001864949, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, -1.0);\n    result += mat4(0.25631642, -0.41485596, -0.16662048, 0.13201024, 0.057921384, 0.2240005, -0.30038536, -0.08305622, 0.2228756, 0.32263795, 0.10608189, -0.18616734, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, 0.0);\n    result += mat4(0.08997524, 0.11516871, 0.19212262, -0.035154644, 0.11612274, -0.04056247, 0.14974374, 0.029173585, -0.07629641, -0.14353512, 0.041081246, 0.20230265, 0.0, 0.0, 0.0, 0.0) * go_0(-1.0, 1.0);\n    result += mat4(0.2262286, 0.055954933, -0.14499907, 0.17314723, 0.16590612, -0.06688698, -0.11118816, -0.012938116, -0.043101817, 0.026133137, 0.2958395, 0.06543993, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, -1.0);\n    result += mat4(-0.07311521, -0.3041244, -0.47978505, -0.6350967, -0.17432262, 0.34965977, 0.25399777, -0.16590433, -0.49957857, 0.0549526, -0.40869385, -0.08780993, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, 0.0);\n    result += mat4(-0.3014447, -0.00021343959, -0.14953177, 0.028001398, -0.14931908, -0.14910097, -0.13287953, -0.45026535, 0.17378895, 0.024704922, -0.027308129, -0.10292025, 0.0, 0.0, 0.0, 0.0) * go_0(0.0, 1.0);\n    result += mat4(-0.06732655, -0.13119644, 0.066014715, 0.081011154, -0.15154321, 0.2407805, 0.07733481, 0.12312706, 0.1741804, 0.008495716, -0.14125362, -0.043644864, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, -1.0);\n    result += mat4(0.11465958, 0.42001364, 0.011069392, 0.3203028, -0.058801666, -0.37830314, -0.030540617, 0.2245139, -0.11310525, -0.14845212, 0.19957744, 0.25789997, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, 0.0);\n    result += mat4(-0.16037206, 0.21326372, 0.020099448, 0.018666709, 0.122083254, -0.16033986, -0.10725163, 0.2556128, 0.1650688, -0.10475823, 0.048623525, -0.103755645, 0.0, 0.0, 0.0, 0.0) * go_0(1.0, 1.0);\n    result += vec4(0.007717166, -0.027800834, 0.0795002, 0.0053199283);\n    return result;\n}\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(VL)-Conv-4x3x3x16\n//!HOOK MAIN\n//!BIND conv2d_tf\n//!BIND conv2d_tf1\n//!SAVE conv2d_1_tf\n//!WIDTH conv2d_tf.w\n//!HEIGHT conv2d_tf.h\n//!COMPONENTS 4\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\n#define go_0(x_off, y_off) (max((conv2d_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max((conv2d_tf1_texOff(vec2(x_off, y_off))), 0.0))\n#define go_2(x_off, y_off) (max(-(conv2d_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_3(x_off, y_off) (max(-(conv2d_tf1_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(-0.0056740534, -0.21186607, -0.18014967, 0.118979976, -0.0015611284, -0.07708486, 0.060131397, 0.11653345, 0.027150517, 0.10837246, 0.08583816, -0.14032431, 0.017552888, 0.0035846964, 0.03980114, 0.064649396) * go_0(-1.0, -1.0);\n    result += mat4(-0.03289318, -0.12004539, 0.26514888, -0.15079662, 0.04214227, -0.027273783, -0.027950313, 0.19614808, 0.18510003, -0.10346252, -0.029836183, 0.09174428, -0.0088710375, -0.18273513, 0.06601674, 0.009983851) * go_0(-1.0, 0.0);\n    result += mat4(0.08476211, 0.043996535, 0.056711517, 0.009976895, 0.07039107, -0.024862664, -0.059921104, 0.046850603, 0.04983447, 0.04863198, 0.21777405, -0.0576961, 0.045321796, -0.0060038245, 0.096396215, -0.10842004) * go_0(-1.0, 1.0);\n    result += mat4(-0.15746164, 0.041757874, 0.035169285, -0.1734288, -0.24219254, -0.13318908, 0.2272079, -0.02902605, 0.07750601, -0.1467191, -0.12296749, -0.07533314, -0.07073083, 0.17909113, 0.04789308, 0.17245363) * go_0(0.0, -1.0);\n    result += mat4(0.057547905, 0.1464685, -0.33115456, -0.26956198, -0.26298407, -0.059824817, 0.022509675, -0.09251868, 0.36277944, -0.2072429, 0.21095088, -0.45492023, 0.07428653, 0.1593302, -0.2945834, 0.12825087) * go_0(0.0, 0.0);\n    result += mat4(-0.1318458, 0.27804148, 0.037600737, 0.12047866, 0.0065036337, 0.0017241207, 0.060497303, -0.14786585, -0.15149063, 0.02731698, 0.048886403, -0.0025970868, -0.026979815, 0.07348884, 0.015636757, -0.107966796) * go_0(0.0, 1.0);\n    result += mat4(-0.079988025, -0.01626299, 0.06517438, 0.086406484, -0.1484504, 0.070595, 0.20620634, 0.09713373, -0.13620836, 0.012067949, -0.00068703433, -0.038030174, 0.22300471, -0.0012400965, -0.014827909, -0.08927486) * go_0(1.0, -1.0);\n    result += mat4(0.15634936, 0.052028038, 0.038081627, 0.12720168, 0.07342066, -0.04318368, -0.0065998454, 0.12109317, -0.45398173, 0.03666754, -0.17773737, 0.038516667, -0.13009632, -0.007457001, -0.013938809, 0.09776142) * go_0(1.0, 0.0);\n    result += mat4(0.029636936, 0.12864171, 0.11347291, -0.11812842, -0.0870342, 0.035678383, 0.050338242, 0.045754932, -0.07072752, 0.010447726, 0.039642975, -0.08795004, -0.1191525, 0.00967509, 0.13485421, -0.053204738) * go_0(1.0, 1.0);\n    result += mat4(-0.011072695, -0.09613245, -0.09094804, 0.028029291, -0.04031162, 0.15690295, 0.25094184, -0.21776834, 0.06524669, 0.06412185, -0.052852992, -0.08097702, -0.039127756, 0.036357917, 0.104585476, 0.25095442) * go_1(-1.0, -1.0);\n    result += mat4(-0.08328618, -0.006246033, 0.099708706, -0.014916097, 0.17727195, 0.4369228, 0.14760216, 0.06707674, 0.025167737, -0.022487842, -0.038962565, 0.15380669, 0.08125089, 0.09844594, 0.33538374, -0.003161368) * go_1(-1.0, 0.0);\n    result += mat4(-0.0128195705, -0.05475118, -0.037705053, -0.0012077648, -0.17425515, 0.091487505, -0.12909423, 0.0074876705, 0.13438368, 5.778033e-05, 0.04563314, -0.12185897, -0.053612474, -0.049824294, -0.12851205, 0.12856449) * go_1(-1.0, 1.0);\n    result += mat4(-0.025741795, 0.01867236, -0.00027440622, 0.10502768, 0.27042285, -0.14947751, 0.11143123, 0.2575913, -0.07414089, -0.33919522, -0.13194235, -0.20088726, 0.23121537, -0.08197353, 0.06693911, 0.015411386) * go_1(0.0, -1.0);\n    result += mat4(0.09143717, 0.22842278, 0.06501074, -0.20009698, -0.042117566, -0.23452093, -0.074082755, -0.10612558, 0.077631965, 0.08343657, -0.07657599, -0.43297377, 0.7092466, -0.16272525, 0.17222248, -0.056038965) * go_1(0.0, 0.0);\n    result += mat4(0.081200436, 0.046752565, 0.028254949, 0.18820632, 0.096592255, 0.05896745, 0.14845169, 0.034777895, 0.07195204, -0.1908046, -0.015341971, 0.02606145, -0.010377239, 0.0755547, -0.15285216, 0.047916733) * go_1(0.0, 1.0);\n    result += mat4(-0.06825636, -0.049540907, -0.024328846, 0.03506251, 0.2060094, 0.054119263, -0.06671269, 0.052428722, 0.055792283, -0.14336903, -0.03180757, 0.013760968, -0.037398104, -0.06880077, -0.023608573, 0.0360965) * go_1(1.0, -1.0);\n    result += mat4(-0.16937497, -0.30156836, 0.0021435453, 0.025772978, -0.17990975, 0.046133514, -0.32447076, -0.083382785, -0.081322014, -0.022132374, -0.05319431, 0.11794733, 0.08943906, 0.12927428, 0.105764806, -0.051034793) * go_1(1.0, 0.0);\n    result += mat4(-0.011012306, 0.047636557, 0.050260928, 0.051847618, 0.010985655, -0.13752967, 0.023869954, 0.07011459, -0.18244945, 0.07239806, -0.013638856, -0.026982805, 0.11395993, -0.031304818, -0.08714153, 0.077115685) * go_1(1.0, 1.0);\n    result += mat4(0.08707592, 0.2265186, 0.13363098, -0.039588258, -0.029561255, 0.019238092, 0.024606103, -0.0019022018, -0.062285982, -0.0629511, -0.03753033, 0.109805316, 0.016018672, -0.08284564, -0.04092752, -0.030386891) * go_2(-1.0, -1.0);\n    result += mat4(0.0016500859, 0.01616536, -0.099148355, 0.24161765, 0.028064307, -0.028680569, 0.054400917, -0.1978921, -0.08584302, -0.096797146, -0.06546965, -0.09342837, 0.030265866, 0.07057579, -0.02080932, 0.053178705) * go_2(-1.0, 0.0);\n    result += mat4(-0.030304352, 0.047440585, -0.04248429, 0.08568772, -0.051317703, 0.036739342, 0.00865767, -0.018183297, -0.07335176, 0.025001721, -0.068509035, 0.1814819, -0.09756565, -0.024179723, -0.05959287, 0.0352454) * go_2(-1.0, 1.0);\n    result += mat4(0.023015196, -0.022870664, -0.12028372, -0.111095205, 0.11065281, -0.19900022, -0.24012049, -0.017028643, -0.13484617, 0.050107025, 0.10741765, 0.037951697, 0.013090438, -0.0010045726, -0.029447839, -0.1859787) * go_2(0.0, -1.0);\n    result += mat4(0.17922719, -0.24138594, -0.44595388, -0.032014426, 0.06897096, 0.07125395, 0.1944457, -0.035794795, -0.24022278, -0.13230884, -0.1277025, 0.21229011, -0.12249393, 0.06141907, 0.2687936, -0.26896995) * go_2(0.0, 0.0);\n    result += mat4(0.0397242, -0.30710965, 0.28815824, -0.06642567, -0.07588877, -0.019552408, 0.0057806037, 0.11465521, 0.03560534, -0.10640553, 0.023589289, -0.16667193, 0.02066607, -0.01026633, -0.02655378, 0.082493655) * go_2(0.0, 1.0);\n    result += mat4(-0.007902949, -0.08501038, -0.029395591, -0.07072227, -0.01800967, -0.14564751, -0.08372804, -0.049974415, 0.1756957, -0.02042449, -0.04413007, -0.016873527, -0.2385717, -0.001741017, 0.08298281, -0.019873247) * go_2(1.0, -1.0);\n    result += mat4(-0.01803727, 0.0642893, 0.21513617, 0.066888265, -0.042107955, -0.123470366, 0.045296013, -0.11958806, 0.48208967, -0.027188249, 0.12136116, 0.05246265, 0.13522038, -0.016297493, 0.028486907, -0.059840377) * go_2(1.0, 0.0);\n    result += mat4(-0.1373251, -0.11281026, -0.06418318, 0.08444032, 0.062874556, -0.009133875, -0.049571835, -0.042995855, 0.12483249, -0.025967957, -0.11202483, 0.09862257, 0.099986054, 0.009230306, -0.09042664, 0.046612263) * go_2(1.0, 1.0);\n    result += mat4(0.03203309, 0.106030256, 0.045741174, -0.020529225, -0.028610658, -0.055219248, -0.21404657, 0.07746393, -0.059359375, 0.0033258004, -0.0054513607, 0.06856653, 0.18043655, -0.119936846, -0.05639265, -0.10240379) * go_3(-1.0, -1.0);\n    result += mat4(-0.0004331875, 0.10426754, -0.008130048, 0.012795991, -0.14372933, -0.40797862, 0.105197415, -0.0041354536, -0.079792455, 0.0914027, 0.012418237, -0.11449173, 0.020261409, -0.14681602, -0.13355242, 0.18290488) * go_3(-1.0, 0.0);\n    result += mat4(0.052306626, 0.010864275, -0.072627716, -0.009773121, 0.09484167, -0.09631301, 0.14896165, -0.21220942, -0.11994051, -0.002957136, -0.118194886, 0.08661347, 0.10005298, -0.029620873, 0.101668894, 0.0242806) * go_3(-1.0, 1.0);\n    result += mat4(-0.055188183, -0.06322889, 0.12994595, 0.03140751, -0.092755616, 0.04239107, 0.18460171, 0.08471877, 0.014203371, 0.13608724, 0.035351243, -0.07883493, -0.10067456, 0.14417742, 0.0054235114, 0.100745104) * go_3(0.0, -1.0);\n    result += mat4(-0.043811034, -0.16055201, -0.11927185, 0.20517266, 0.16734722, 0.27720267, 0.1205665, 0.045803893, -0.07874647, 0.06764307, -0.11157022, 0.080770165, -0.044105835, -0.03276538, -0.10945451, 0.100562036) * go_3(0.0, 0.0);\n    result += mat4(-0.044731796, -0.12854387, -0.061937924, -0.21604767, -0.036132332, -0.024353411, -0.16718283, 0.14903957, -0.11620588, 0.14563644, 0.23363836, 0.08400659, 0.15248756, -0.1424437, 0.112882614, -0.04096889) * go_3(0.0, 1.0);\n    result += mat4(-0.0486021, -0.05714939, 0.042517707, -0.06106919, -0.12970918, -0.071898215, -0.044727243, -0.026308542, 0.05687118, -0.0394057, -0.109454155, -0.0021216893, 0.018588595, 0.08061093, 0.0500373, -0.0034918839) * go_3(1.0, -1.0);\n    result += mat4(0.11269324, -0.17924047, -0.12965205, -0.07287767, -0.015830642, -0.044497102, 0.20014328, -0.14054494, 0.1232692, 0.2395109, 0.14093149, 0.03518561, -0.14088139, -0.09045081, -0.07283352, 0.053434785) * go_3(1.0, 0.0);\n    result += mat4(0.020512339, 0.026349569, -0.06666101, 0.05554806, -0.03044066, 0.26656216, 0.019155584, -0.12118906, 0.087923005, -0.1716557, 0.050843164, 0.037432503, -0.030232614, 0.030457936, 0.04232163, -0.066400655) * go_3(1.0, 1.0);\n    result += vec4(-0.0216415, 0.09015036, -0.030761974, -0.26541537);\n    return result;\n}\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(VL)-Conv-4x3x3x16\n//!HOOK MAIN\n//!BIND conv2d_tf\n//!BIND conv2d_tf1\n//!SAVE conv2d_1_tf1\n//!WIDTH conv2d_tf.w\n//!HEIGHT conv2d_tf.h\n//!COMPONENTS 4\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\n#define go_0(x_off, y_off) (max((conv2d_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max((conv2d_tf1_texOff(vec2(x_off, y_off))), 0.0))\n#define go_2(x_off, y_off) (max(-(conv2d_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_3(x_off, y_off) (max(-(conv2d_tf1_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(0.04688368, 0.13853125, 0.1714716, -0.03034447, -0.08090605, 0.1225867, 0.17535992, 0.012508419, -0.0010665918, -0.07481546, -0.15541986, 0.0671128, -0.029307734, -0.076674186, 0.03925896, -0.07140553) * go_0(-1.0, -1.0);\n    result += mat4(-0.13273083, 0.062933214, 0.04200143, -0.0080243945, -0.120439716, -0.090192355, -0.022639645, 0.00020024918, -0.11211478, -0.12949537, 0.025783822, 0.009155746, 0.01004339, -0.0661901, 0.10630156, 0.053137038) * go_0(-1.0, 0.0);\n    result += mat4(0.07113487, -0.16011865, -0.10838903, -0.0034704183, 0.110606894, -0.14915739, 0.036511585, -0.003103608, -0.0551775, -0.13140677, 0.05270299, 0.12139221, 0.02226174, 0.008415268, -0.06647426, 0.118130066) * go_0(-1.0, 1.0);\n    result += mat4(-0.045172617, -0.0020388453, -0.27287582, 0.002428232, -0.2833772, 0.13788106, 0.073339015, 0.10666715, 0.08455194, 0.16499293, 0.089058325, 0.008815447, 0.034657538, -0.109856166, -0.11499077, -0.02918854) * go_0(0.0, -1.0);\n    result += mat4(0.07910854, -0.26334837, -0.3246593, -0.08246522, 0.09211476, 0.40793833, -0.09658794, -0.14430091, -0.50632644, 0.087234974, 0.26298127, 0.3687086, 0.06492316, 0.23082961, 0.18233871, -0.09283792) * go_0(0.0, 0.0);\n    result += mat4(-0.022744032, 0.21690565, 0.2694824, -0.12230013, -0.07969618, 0.21595429, -0.034979805, 0.008938489, 0.21289209, -0.446482, -0.042927746, -0.13587558, -0.032581557, -0.07182814, -0.054092336, -0.009542036) * go_0(0.0, 1.0);\n    result += mat4(-0.0034912943, -0.080354184, -0.08577375, -0.1521193, 0.09809233, 0.034529503, -0.100664355, 0.008191219, -0.014303411, -0.02862216, -0.18669915, -0.12384598, 0.046499267, 0.093707144, 0.10661308, 0.15079576) * go_0(1.0, -1.0);\n    result += mat4(-0.031025652, -0.0384342, 0.14258307, 0.25531343, 0.0075049917, -0.03966595, 0.062381975, 0.19593526, -0.2868182, 0.03162008, -0.4391041, -0.524017, -0.034463473, -0.0066741486, -0.24586639, 0.10521736) * go_0(1.0, 0.0);\n    result += mat4(-0.07452321, -0.0227877, -0.025402244, 0.115727395, -0.039511252, -0.07785703, -0.013689458, 0.0066024344, -0.052957747, 0.011206241, -0.0021671024, 0.077190824, -0.11709912, 0.046635598, 0.123751156, -0.03712064) * go_0(1.0, 1.0);\n    result += mat4(0.055411004, -0.0020031065, 0.06685547, -0.018829947, -0.06378933, -0.18389674, -0.0023551763, 0.0670314, 0.13038594, 0.0601923, -0.03035789, -0.019537423, -0.014483204, -0.056800704, 0.08663347, -0.106859975) * go_1(-1.0, -1.0);\n    result += mat4(-0.06603686, 0.07360526, -0.0072026253, -0.06778907, -0.039178446, 0.012397263, -0.13482279, 0.05745685, -0.055182382, -0.10545766, 0.003857615, 0.041947857, -0.15239377, 0.041826613, 0.058879383, -0.0042669442) * go_1(-1.0, 0.0);\n    result += mat4(-0.0697229, -0.010702144, -0.032265816, 0.013317131, 0.105028264, 0.21032134, 0.06845646, -0.018358687, 0.064568676, 0.08437135, -0.000723181, 0.1324007, 0.05527932, -0.049871888, -0.10125047, -0.005040889) * go_1(-1.0, 1.0);\n    result += mat4(-0.006467578, -0.05120533, -0.011780779, -0.011742203, -0.34242442, -0.020819988, 0.17381702, -0.059836414, -0.028882682, 0.23210457, 0.16579404, -0.03708216, -0.23541835, -0.03290251, 0.029319672, 0.26189178) * go_1(0.0, -1.0);\n    result += mat4(-0.30955994, -0.06408282, -0.16872866, 0.10767772, -0.041430887, 0.051697977, 0.12523535, -0.060389146, 0.026289431, 0.06359533, 0.13526368, 0.2479901, -0.3263977, 0.10216362, -0.0030894123, 0.046437826) * go_1(0.0, 0.0);\n    result += mat4(0.10061438, -0.17047118, -0.21593021, -0.023389054, -0.17507865, -0.30822313, -0.22044766, 0.16078933, 0.07099252, -0.11573018, 0.24712858, -0.0659458, -0.037504572, -0.12297423, 0.03342632, -0.058119852) * go_1(0.0, 1.0);\n    result += mat4(-0.020957774, -0.0224927, 0.04069268, -0.07911167, 0.074009344, 0.065916434, 0.008222278, 0.11625076, -0.25299504, 0.03357169, -0.021988, 0.015821831, -0.0021187372, -0.030700417, -0.004374924, 0.027358979) * go_1(1.0, -1.0);\n    result += mat4(0.06549052, -0.048067164, 0.05489091, -0.28851983, 0.13378961, 0.026875904, -0.09877994, -0.19947459, -0.1274035, -0.022928834, -0.26344195, -0.025870804, 0.022505255, 0.0070861108, 0.121051334, -0.025964163) * go_1(1.0, 0.0);\n    result += mat4(0.059426542, -0.0327433, 0.2313695, -0.07046268, 0.20479666, 0.027021704, 0.2564928, -0.11689885, -0.07407976, -0.019611249, 0.093463086, -0.121553615, 0.035009407, -0.008135333, -0.075931996, 0.047803063) * go_1(1.0, 1.0);\n    result += mat4(-0.059434246, -0.1652242, -0.124611154, 0.04743711, 0.10530296, -0.13869187, -0.036534663, -0.035206333, 0.06067593, 0.06126907, 0.120151915, -0.06722673, 0.008103894, 0.037225723, -0.007520425, 0.065720856) * go_2(-1.0, -1.0);\n    result += mat4(-3.6759695e-05, -0.036789574, 0.013370567, -0.037871476, -0.013454664, 0.15086569, 0.10164699, 0.057703357, -0.12871023, 0.12827681, -0.055057358, -0.040753044, -0.0142621, 0.08563361, -0.04615499, -0.03130452) * go_2(-1.0, 0.0);\n    result += mat4(-0.117965914, 0.09056485, 0.07272314, 0.009695964, -0.11331058, 0.07467256, -0.08291521, 0.00937355, -0.04097737, 0.07752905, -0.017335521, -0.12539999, 0.039462104, -0.0007037007, 0.06034812, -0.09497377) * go_2(-1.0, 1.0);\n    result += mat4(0.20828065, 0.0400099, 0.047638226, -0.046423353, -0.026133502, 0.098207295, 0.056742374, 0.017029466, -0.058164768, -0.046973787, -0.17328712, -0.0012984811, 0.050085854, 0.11296557, 0.12639083, 0.058543045) * go_2(0.0, -1.0);\n    result += mat4(-0.098907426, 0.22031747, 0.101559944, 0.06616554, 0.026110496, 0.56487054, 0.23754556, -0.07540935, 0.31768414, -0.47653618, 0.015073956, -0.33731326, 0.087285936, -0.24593173, -0.26141426, 0.15003823) * go_2(0.0, 0.0);\n    result += mat4(0.046026446, -0.13767281, 0.064847544, 0.07717139, 0.08544123, -0.11092969, 0.072325274, 0.010849038, -0.3055905, 0.66436774, 0.1434729, 0.0494463, 0.07115603, 0.083811216, 0.020431712, 0.06537088) * go_2(0.0, 1.0);\n    result += mat4(-0.15532711, 0.030139687, 0.040853374, 0.11089222, -0.08150315, -0.015851755, -0.06787692, 0.096075505, -0.011956207, -0.0017758606, 0.1277494, 0.16156575, -0.038588695, -0.0626418, -0.041797023, -0.19467135) * go_2(1.0, -1.0);\n    result += mat4(0.12917455, 0.017410474, -0.20125067, -0.08040003, -0.13494664, 0.17789102, -0.19909395, 0.08441434, 0.078570575, -0.06330619, 0.23767303, 0.5442659, -0.009227878, -0.021818208, 0.14318731, -0.09042824) * go_2(1.0, 0.0);\n    result += mat4(0.097801, 0.09345441, 0.17846581, -0.14773296, 0.06536365, 0.07642184, -0.011880635, 0.02086135, 0.013336972, -0.053295113, -0.13410404, 0.027241753, 0.087728985, -0.044033397, -0.13098569, 0.009423933) * go_2(1.0, 1.0);\n    result += mat4(-0.02488427, 0.0134966355, -0.0075000813, 0.07272353, 0.015842725, 0.13765687, 0.028079558, -0.08384948, -0.06666623, -0.023220664, 0.025091043, -0.055167805, -0.18826278, 0.04423603, 0.13499942, 0.059128854) * go_3(-1.0, -1.0);\n    result += mat4(0.01935146, -0.030980906, -0.031569187, -0.0036869382, 0.036753897, 0.118464164, 0.15871695, -0.09842428, 0.023324292, 0.071796335, -0.07869346, -0.10751301, -0.2588698, 0.064011686, 0.17386378, -0.039197855) * go_3(-1.0, 0.0);\n    result += mat4(0.08590827, 0.005497696, -0.026512025, 0.015661815, 0.1102415, -0.08268483, -0.0032903247, 0.10049029, -0.008157236, -0.035823178, -0.017570151, -0.081716835, -0.3531045, 0.010005245, 0.017141227, -0.016376914) * go_3(-1.0, 1.0);\n    result += mat4(-0.16617337, -0.007689783, 0.00954665, 0.07117733, -0.001669262, -0.012331606, 0.051613946, 0.062780835, 0.06123557, -0.20243123, -0.19181818, 0.032895602, 0.19760677, 0.004464939, 0.12754539, -0.27360034) * go_3(0.0, -1.0);\n    result += mat4(0.15006685, -0.083587274, -0.03215495, -0.16992462, -0.011944293, 0.058361508, -0.088097006, 0.023880545, -0.04168166, -0.06960282, -0.092672385, -0.057278465, 0.23540072, -0.1721208, -0.018213503, -0.23494521) * go_3(0.0, 0.0);\n    result += mat4(-0.124885194, 0.1905868, 0.11108704, 0.03163991, 0.11383064, 0.101223364, 0.069428995, -0.14298953, -0.07609092, 0.13704266, -0.07749446, -0.0005389336, -0.04617235, 0.18011934, 0.08350316, 0.09416366) * go_3(0.0, 1.0);\n    result += mat4(0.073356606, 0.067966126, -0.21285574, 0.0782625, -0.0034364646, -0.032581426, -0.05538558, -0.1317288, 0.14552782, -0.1132393, 0.13063973, -0.00833602, 0.0026844777, 0.028135289, -0.02536825, -0.028372496) * go_3(1.0, -1.0);\n    result += mat4(-0.318728, 0.07862527, -0.12176221, 0.35010242, -0.029198067, 0.016302662, 0.17667587, 0.12605923, 0.1556697, -0.06061443, 0.05843511, 0.10891248, 0.01267106, -0.018492714, -0.15945031, -0.050723754) * go_3(1.0, 0.0);\n    result += mat4(-0.21555941, -0.016813517, -0.084676236, -0.07545412, -0.14518794, -0.014592766, -0.2446481, 0.0530632, 0.0847341, 0.12342537, -0.028644923, 0.083479315, -0.04179012, 0.0025225023, 0.16006976, -0.026940256) * go_3(1.0, 1.0);\n    result += vec4(-0.060742114, -0.037577342, 0.055704296, 0.03134311);\n    return result;\n}\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(VL)-Conv-4x3x3x16\n//!HOOK MAIN\n//!BIND conv2d_1_tf\n//!BIND conv2d_1_tf1\n//!SAVE conv2d_2_tf\n//!WIDTH conv2d_1_tf.w\n//!HEIGHT conv2d_1_tf.h\n//!COMPONENTS 4\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\n#define go_0(x_off, y_off) (max((conv2d_1_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max((conv2d_1_tf1_texOff(vec2(x_off, y_off))), 0.0))\n#define go_2(x_off, y_off) (max(-(conv2d_1_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_3(x_off, y_off) (max(-(conv2d_1_tf1_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(0.13129333, -0.022117995, -0.009753253, 0.020439912, 0.044090994, -0.0916335, 0.0036765633, -0.11719207, -0.06413809, 0.04079378, -0.00085516454, -0.06306388, -0.12660664, -0.054126263, -0.005513979, 0.06364538) * go_0(-1.0, -1.0);\n    result += mat4(-0.028422508, 0.23270117, -0.28674677, -0.10820166, 0.024321957, -0.0811145, -0.07290707, -0.02125165, -0.064260505, 0.052076746, -0.009654081, 0.08363882, -0.02037171, 0.15006389, 0.121593125, -0.011237004) * go_0(-1.0, 0.0);\n    result += mat4(-0.14672333, 0.015381624, 0.1028172, -0.041823238, 0.0072677187, -0.042953942, 0.06426537, -0.0938381, -0.05990813, -0.04599802, -0.11264726, -0.027826328, -0.058160868, 0.10747306, -0.07327458, 0.07998872) * go_0(-1.0, 1.0);\n    result += mat4(-0.08702181, -0.03750975, -0.045659006, 0.04488332, 0.09102003, 0.066556975, -0.04353586, 0.08994567, -0.13561495, -0.10653702, 0.006989605, 0.028230097, 0.07177144, 0.2938447, -0.00943923, 0.022120917) * go_0(0.0, -1.0);\n    result += mat4(-0.1801194, -0.11119162, 0.1977298, -0.247902, -0.16654298, -0.07423158, 0.114130594, 0.0014401592, 0.006954727, -0.09810646, -0.051310766, 0.19487657, 0.2545855, -0.06328558, -0.04617056, 0.09444692) * go_0(0.0, 0.0);\n    result += mat4(0.011378825, 0.16044368, 0.017211074, 0.14472178, 0.032992378, -0.008925819, 0.035120245, -0.012409223, 0.074333005, 0.1178002, -0.128956, -0.13624239, -0.2791275, 0.21457297, -0.1476131, 0.04874687) * go_0(0.0, 1.0);\n    result += mat4(-0.03491764, -0.061763793, 0.05779039, 0.0054837577, -0.023937583, 0.08281698, 0.032306053, -0.014566218, 0.12738499, -0.0132100545, -0.051833414, 0.0057818824, 0.012158851, -0.20231532, -0.0043795826, 0.10285843) * go_0(1.0, -1.0);\n    result += mat4(-0.22269921, -0.15135509, -0.039143335, 0.033390045, 0.06770212, -0.14538582, -0.08011057, 0.03796648, -0.025913516, 0.13925864, 0.18309896, 0.012709204, -0.24912506, 0.3217706, 0.0394195, 0.017977878) * go_0(1.0, 0.0);\n    result += mat4(0.00080196525, 0.059145816, 0.05720508, 0.0056548906, 0.005168018, 0.09938438, 0.0200503, -0.05516137, 0.061309986, -0.019621318, -0.1541441, 0.019540716, 0.030571707, -0.09054893, 0.032851614, -0.27210873) * go_0(1.0, 1.0);\n    result += mat4(0.27061436, -0.114008114, -0.0020118617, -0.1656827, 0.09770587, 0.029897455, -0.03307522, -0.04661818, 0.033011347, 0.18498488, -0.05162084, 0.087471776, -0.24665618, -0.12538423, -0.08123797, -0.010210389) * go_1(-1.0, -1.0);\n    result += mat4(0.075188264, 0.0020608555, 0.18558815, 0.041179713, 0.11232638, 0.05507779, -0.19599183, 0.027942855, 0.06199144, 0.22141005, -0.06121163, 0.014993597, 0.24105869, -0.019737717, -0.112485714, 0.0157406) * go_1(-1.0, 0.0);\n    result += mat4(0.09425698, 0.0207658, 0.12074599, 0.009430481, 0.11889248, -0.025782838, 0.0034711843, 0.05113582, 0.012531833, -0.0018606635, -0.09137569, 0.018120576, 0.4051155, 0.02222076, -0.16001017, 0.10981527) * go_1(-1.0, 1.0);\n    result += mat4(-0.03582557, 0.014994796, -6.4688604e-05, 0.24618183, -0.11697727, 0.24388117, 0.038502026, -0.3511993, 0.101741396, -0.10748137, 0.035059888, -0.017535849, 0.09450039, 0.06541661, 0.12149035, 0.28798738) * go_1(0.0, -1.0);\n    result += mat4(-0.27143848, 0.017990451, -0.69144464, 0.037944376, -0.04551905, 0.09263134, 0.4259611, -0.14107811, -0.10641847, 0.23065196, 0.040813655, -0.07789163, 0.3087666, 0.08190437, 0.16409059, -0.06455426) * go_1(0.0, 0.0);\n    result += mat4(-0.08290655, -0.35286915, -0.18082355, -0.32229406, 0.1608227, 0.030915622, 0.09207708, 0.02655054, 0.039464593, 0.026095424, 0.052584656, 0.033881903, -0.01751319, -0.0011676399, 0.04002607, 0.1630013) * go_1(0.0, 1.0);\n    result += mat4(-0.012021132, 0.12163766, -0.07410629, -0.06879096, 0.017859738, -0.039261997, -0.028677614, -0.23610398, -0.15963873, -0.0006119958, 0.11275506, 0.0082659265, 0.05677582, 0.08676638, -0.08669759, -0.10475464) * go_1(1.0, -1.0);\n    result += mat4(0.12792721, 0.06888765, 0.31803077, 0.26002547, -0.067599155, -0.011822328, -0.2589909, -0.30024147, 0.11076704, 0.15200609, -0.018180368, -0.19146141, 0.22298847, 0.059484895, 0.034478076, 0.15610938) * go_1(1.0, 0.0);\n    result += mat4(0.0870121, -0.016420847, -0.011579898, 0.097182855, -0.120095566, -0.06843338, -0.043460473, -0.060684606, -0.027540063, -0.008499213, 0.033570655, -0.06866259, 0.01429712, -0.07424434, 0.0009466247, 0.09142678) * go_1(1.0, 1.0);\n    result += mat4(-0.03781424, 0.04587032, 0.03744051, 0.02712279, -0.051038064, 0.0669144, -0.02640278, 0.12384894, -0.0022533627, -0.010022036, 0.07536463, -0.030489929, 0.09418577, 0.155089, -0.011290433, -0.02102941) * go_2(-1.0, -1.0);\n    result += mat4(-0.0053278613, -0.07160643, 0.039028414, 0.04123311, -0.10693177, -0.1170874, 0.07230816, -0.033255517, -0.119176835, 0.0786526, -0.11880206, -0.11354601, -0.037539184, 0.14404313, 0.069760695, 0.024738638) * go_2(-1.0, 0.0);\n    result += mat4(0.03413808, -0.006487654, 0.10006853, 0.22228058, -0.13796462, -0.14042488, 0.04017443, -0.031790894, -0.06673143, 0.009888688, 0.08831443, -0.0045771743, -0.028375361, -0.04704813, 0.07128581, -0.07012518) * go_2(-1.0, 1.0);\n    result += mat4(-0.06954315, -0.23728988, -0.14192343, -0.08236467, -0.2552115, 0.04102959, -0.06355397, -0.08340241, 0.17617856, 0.20281969, -0.16249381, 0.10843737, -0.04392261, -0.08587206, 0.053069845, -0.15482199) * go_2(0.0, -1.0);\n    result += mat4(0.124981806, 0.12828638, -0.061472785, -0.20108232, -0.14905351, -0.40766275, -0.35427195, -0.13183996, 0.09307428, -0.07697028, 0.06702549, -0.22656697, 0.019868268, -0.19361132, 0.08784669, 0.20249842) * go_2(0.0, 0.0);\n    result += mat4(-0.004661343, -0.09333453, -0.24876262, -0.07906779, 0.110697776, -0.37069768, -0.042212646, -0.0046135853, -0.2254257, -0.023392014, 0.031476703, -0.045574382, -0.12675518, -0.076056994, -0.08228006, -0.040303517) * go_2(0.0, 1.0);\n    result += mat4(0.16182694, 0.0512523, 0.051189836, 0.048962783, -0.05156489, -0.17987493, -0.012037288, 0.06953726, -0.09458492, 0.1610021, -0.004063283, -0.032922342, 0.08995396, 0.1939926, -0.018710036, -0.08153231) * go_2(1.0, -1.0);\n    result += mat4(-0.064830944, 0.06121252, -0.18886387, -0.12976822, -0.031117212, 0.12219633, 0.19070715, 0.12495262, -0.11994464, -0.24687837, -0.08425294, -0.016920334, -0.13286817, -0.3260188, -0.11776061, 0.1651019) * go_2(1.0, 0.0);\n    result += mat4(-0.17652592, 0.002499805, -0.030541016, -0.01393431, 0.031418208, 0.08209422, 0.12430871, 0.4387016, -0.108871914, -0.09041422, 0.031226631, -0.1638517, 0.20756467, 0.014476537, -0.012701195, -0.03440563) * go_2(1.0, 1.0);\n    result += mat4(0.005320072, -0.0032291536, -0.017209187, 0.031944863, -0.2479921, -0.24433962, -0.13832912, 0.07835928, -0.17707248, 0.028202811, -0.19121435, 0.164587, 0.123152815, 0.0050288937, 0.084104605, -0.0380019) * go_3(-1.0, -1.0);\n    result += mat4(0.16008669, -0.018608516, -0.013778938, 0.033447385, -0.01242472, -0.070916265, 0.026909694, -0.07318777, 0.15158044, 0.12047607, -0.1709358, 0.2031767, 0.0025611701, -0.21457459, 0.2791286, 0.10159932) * go_3(-1.0, 0.0);\n    result += mat4(0.14320926, 0.020023825, -0.0484187, 0.011563084, -0.2640472, -0.013056275, 0.004234292, -0.095376395, 0.28363484, -0.0058227647, -0.0777649, 0.05238444, 0.41757923, -0.07081097, 0.012567031, -0.13029522) * go_3(-1.0, 1.0);\n    result += mat4(0.07266207, 0.042793367, -0.08212271, -0.23401663, -0.19457819, 0.4191269, -0.03095442, 0.15339781, -0.28451788, 0.09316364, 0.10231693, -0.22844811, 0.111623526, 0.120017685, 0.18777381, 0.014420896) * go_3(0.0, -1.0);\n    result += mat4(0.15037206, -0.29763284, 0.2601235, 0.0193363, 0.13686465, 0.009907918, -0.37781665, 0.04916627, 0.14114739, 0.5043813, 0.0447959, -0.029427614, 0.041768756, 0.27211213, 0.14163221, 0.086162075) * go_3(0.0, 0.0);\n    result += mat4(0.19159287, 0.21363218, 0.15053211, 0.08992885, 0.100828275, 0.09379921, 0.030783929, 0.11664482, -0.059145752, -0.19400764, -0.09351283, -0.016430443, -0.12910964, -0.067078374, 0.11760082, 0.121194765) * go_3(0.0, 1.0);\n    result += mat4(-0.055059325, 0.09299572, 0.06848913, 0.06334532, -0.1476285, 0.111801244, -0.033960916, 0.06474366, -0.04952303, 0.27885208, -0.052447475, 0.09226763, -0.15024844, -0.0033919013, 0.013498364, 0.09135676) * go_3(1.0, -1.0);\n    result += mat4(-0.017010042, -0.122343406, -0.19097193, -0.27957183, -0.18206005, 0.102321096, 0.22794476, 0.0439245, -0.23710132, -0.08070259, 0.17377135, 0.23811814, 0.17799385, 0.049567625, 0.1470908, 0.07329385) * go_3(1.0, 0.0);\n    result += mat4(0.0038071256, 0.19454515, -0.01222965, -0.07390379, -0.0532754, 0.03942833, 0.123840906, 0.023459576, -0.0658742, -0.023957543, -0.14682837, 0.1221027, -0.010986398, -0.066184506, 0.03026491, -0.0638446) * go_3(1.0, 1.0);\n    result += vec4(-0.06427697, -0.00039365015, 0.011889719, 0.060232002);\n    return result;\n}\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(VL)-Conv-4x3x3x16\n//!HOOK MAIN\n//!BIND conv2d_1_tf\n//!BIND conv2d_1_tf1\n//!SAVE conv2d_2_tf1\n//!WIDTH conv2d_1_tf.w\n//!HEIGHT conv2d_1_tf.h\n//!COMPONENTS 4\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\n#define go_0(x_off, y_off) (max((conv2d_1_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max((conv2d_1_tf1_texOff(vec2(x_off, y_off))), 0.0))\n#define go_2(x_off, y_off) (max(-(conv2d_1_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_3(x_off, y_off) (max(-(conv2d_1_tf1_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(-0.012110923, 0.07818654, 0.07964548, 0.11885079, -0.07694473, -0.01378252, 0.006632789, -0.12876098, 0.0069211307, 0.022278586, 0.069553085, 0.16569804, -0.11123615, 0.06125189, -0.11232848, 0.1559266) * go_0(-1.0, -1.0);\n    result += mat4(-0.3261174, -0.25586754, 0.21129315, 0.3135101, 0.1509055, 0.0044283345, 0.024674175, -0.08000473, 0.01213029, 0.09093019, 0.04942677, 0.09806723, -0.16454464, -0.14433062, -0.058094524, -0.060819894) * go_0(-1.0, 0.0);\n    result += mat4(0.023174008, 0.02858724, 0.07685972, 0.036857616, -0.10415571, 0.10241035, -0.01893166, 0.02065923, 0.058356714, 0.096426114, -0.03772327, -0.1529002, 0.13740575, -0.048291504, -0.06152548, -0.15199897) * go_0(-1.0, 1.0);\n    result += mat4(0.029300174, -0.13222043, 0.0139825605, -0.02274408, 0.062944874, 0.028447356, 0.05960515, 0.034447193, 0.03133432, -0.019283533, -0.024591971, -0.0043914663, 0.15245225, 0.006851478, -0.051783554, 0.17453748) * go_0(0.0, -1.0);\n    result += mat4(-0.09125915, 0.081739366, 0.01196335, 0.23130219, -0.22557035, -0.13537665, 0.0022028848, -0.043430023, 0.22759882, 0.07920754, -0.027986467, -0.14051494, -0.19557038, -0.03585936, -0.4258294, -0.03856216) * go_0(0.0, 0.0);\n    result += mat4(0.18511422, -0.09368415, 0.1551229, 0.04322566, -0.023400841, -0.02261204, 0.15129441, -0.007954805, -0.10739125, 0.019459398, 0.013128325, 0.018073296, 0.20886365, -0.20662378, -0.03814699, -0.09272838) * go_0(0.0, 1.0);\n    result += mat4(-0.027352437, -0.039882626, 0.12598103, -0.093930446, 0.030846786, -0.09325075, -0.009084744, -0.024584265, 0.07159868, 0.14162529, 0.19019091, 0.058855128, -0.09880401, -0.01843218, 0.14753596, -0.2449532) * go_0(1.0, -1.0);\n    result += mat4(0.06565521, 0.09150168, -0.08654865, 0.0829788, -0.07596146, -0.01815166, -0.08786775, -0.03477514, 0.20538878, -0.012766377, 0.020719538, 0.088188395, -0.034300096, 0.29972988, -0.20005241, 0.018425167) * go_0(1.0, 0.0);\n    result += mat4(0.11713916, 0.024167519, 0.05167596, -0.0027117804, -0.016994188, 0.048177514, -0.012556207, 0.010979094, 0.09098878, 0.028514355, 0.06063336, -0.06624107, 0.012754856, 0.013208708, -0.061374772, -0.0025992664) * go_0(1.0, 1.0);\n    result += mat4(-0.09053513, 0.03183455, 0.017340872, 0.12934409, -0.022161964, -0.0015361432, -0.049972344, -0.12763855, 0.12779881, -0.04697911, 0.018968226, -0.119873665, 0.05462772, -0.13919477, -0.10226718, -0.2540179) * go_1(-1.0, -1.0);\n    result += mat4(-0.29912186, -0.09291771, 0.050926663, 0.49361777, 0.21372582, 0.076717265, -0.058968987, -0.1572678, 0.3194591, -0.120582424, 0.03942037, 0.023128232, 0.24321598, 0.07046334, -0.21204855, -0.648296) * go_1(-1.0, 0.0);\n    result += mat4(0.05366883, -0.020366706, 0.020979457, -0.06893884, 0.04837168, 0.017253762, 0.008874203, -0.020785445, -0.20425391, 0.060179923, 0.046167206, 0.09863377, -0.14381303, 0.038928367, -0.06590863, -0.18408588) * go_1(-1.0, 1.0);\n    result += mat4(0.07099762, 0.2029403, -0.033945918, 0.15202214, 0.0901113, -0.27336198, -0.17693861, -0.16206753, -0.17642029, 0.09400492, -0.11165698, -0.07863893, -0.16306102, -0.056210615, 0.22173557, 0.013508989) * go_1(0.0, -1.0);\n    result += mat4(0.08541511, -0.27093616, -0.35273993, -0.48919773, 0.038383547, -0.16013749, 0.012996215, -0.03434873, 0.07024113, -0.28971404, 0.10623425, -0.0019642068, -0.062374946, 0.3291145, 0.22468035, -0.42971882) * go_1(0.0, 0.0);\n    result += mat4(0.020427933, 0.15062793, 0.08308975, -0.025095072, 0.030093266, -0.09649862, -0.03382388, -0.0016017791, 0.105402954, 0.020693144, -0.051065, 0.07704679, 0.02864139, -0.00135146, 0.03762216, 0.029277142) * go_1(0.0, 1.0);\n    result += mat4(0.01700994, 0.12214317, 0.06749582, 0.07354159, -0.093085855, -0.065021954, 0.010773045, -0.00095128635, -0.045384295, -0.072611265, -0.043900184, 0.049471326, 0.029131187, 0.03180158, -0.13313527, 0.05280797) * go_1(1.0, -1.0);\n    result += mat4(0.14751251, -0.15087761, 0.09932281, -0.099232934, -0.062390897, 0.112391844, -0.09159478, 0.15856399, 0.034708973, 0.01819943, -0.02730164, -0.13562973, -0.05687333, -0.0114601655, 0.07025971, 0.02496533) * go_1(1.0, 0.0);\n    result += mat4(-0.0117268525, -0.026162883, 0.07481553, 0.13420302, 0.029870516, 0.07405776, -0.06379041, 0.09631234, -0.07754842, 0.035888605, 0.0034764851, -0.040771756, -0.092022054, -0.034230903, -0.02281844, -0.0028173258) * go_1(1.0, 1.0);\n    result += mat4(-0.059846643, 0.016772347, -0.02287152, 0.07036337, -0.024946844, 0.09826078, -0.068491876, 0.20852126, 0.073890835, -0.058288682, 0.013093785, -0.05776076, 0.0516503, 0.052794468, 0.10837015, 0.038539834) * go_2(-1.0, -1.0);\n    result += mat4(-0.16391893, -0.008062687, -0.35022175, 0.2510062, -0.15820411, 0.048403125, 0.024878092, 0.037888516, -0.035924178, -0.068953894, -0.025386479, 0.24405715, -0.018495679, -0.051277515, 0.14754932, -0.031538483) * go_2(-1.0, 0.0);\n    result += mat4(-0.038429607, -0.047140498, -0.018157095, -0.029318782, -0.04094171, -0.11870087, 0.11214255, 0.07142628, 0.021007229, -0.005681072, 0.1662777, 0.10829575, 0.112268396, 0.03567479, -0.06738845, 0.0032037434) * go_2(-1.0, 1.0);\n    result += mat4(-0.032217573, 0.2102397, -0.20617546, -0.07920811, 0.12918773, 0.054486286, -0.13656865, 0.05806265, 0.01963165, 0.049910642, 0.15538268, 0.10724465, -0.09697837, -0.03070673, -0.0071386313, -0.11899626) * go_2(0.0, -1.0);\n    result += mat4(0.130827, 0.0051715383, -0.07212691, 0.45726067, 0.2773031, 0.2973666, 0.3951691, 0.01333662, -0.14561643, 0.04508669, 0.121690124, 0.13326228, -0.22579186, 0.058161184, 0.09281702, -0.00079749606) * go_2(0.0, 0.0);\n    result += mat4(-0.00771113, 0.09912341, -0.41895548, -0.06705759, 0.029148718, 0.052991726, 0.18665347, -0.031787418, 0.23053595, 0.09444956, 0.10691037, -0.06325714, -0.05335701, 0.1917427, -0.0065284846, 0.032622546) * go_2(0.0, 1.0);\n    result += mat4(-0.056801565, -0.019131258, -0.0939022, -0.08130343, -0.11051993, 0.0035269214, -0.047361933, -0.0543875, 0.10854369, 0.06445185, 0.016828364, -0.022595318, 0.1450623, 0.033027507, -0.020425137, 0.16169788) * go_2(1.0, -1.0);\n    result += mat4(-0.08747717, 0.07770065, 0.018155783, 0.07160794, 0.09860347, -0.04329888, -0.0043579484, -0.2014418, -0.060260013, 0.0036374568, -0.17566042, -0.2268221, 0.001273691, -0.2609373, -0.19417606, -0.04102927) * go_2(1.0, 0.0);\n    result += mat4(-0.086845055, -0.114253804, -0.13433142, -0.025941795, -0.0155711295, -0.13578776, 0.12059696, -0.08760523, -0.0057348222, 0.12164273, 0.07270617, -0.06352636, 0.08894258, 0.04140841, 0.1230304, -0.030357126) * go_2(1.0, 1.0);\n    result += mat4(0.03320213, 0.015911903, -0.06288296, -0.121976145, 0.2713457, 0.13913193, -0.092420585, 0.105714336, 0.10294281, -0.04591945, -0.11767934, 0.032249406, -0.06506192, -0.04639334, 0.08137017, -0.031746846) * go_3(-1.0, -1.0);\n    result += mat4(0.13717805, 0.0071242675, -0.077256985, -0.14974317, -0.08467893, -0.20126395, -0.06240603, 0.09554399, -0.075844854, 0.28380412, 0.046030026, 0.053188596, 0.50943077, 0.1179795, 0.32203588, -0.06712207) * go_3(-1.0, 0.0);\n    result += mat4(-0.18528835, 0.0016975187, -0.0041140947, 0.11234392, -0.34049067, -0.056880493, -0.04325441, 0.09905571, 0.10978758, 0.009608353, -0.10801905, -0.04071131, -0.09096832, -0.12350487, 0.011801418, 0.22521795) * go_3(-1.0, 1.0);\n    result += mat4(0.040283076, -0.034117915, -0.026142653, -0.06058959, 0.12511659, 0.4131219, 0.59190845, 0.39758852, 0.16032091, -0.5975032, -0.14516282, 0.115154505, 0.03874097, 0.18462797, 0.22934213, 0.05285643) * go_3(0.0, -1.0);\n    result += mat4(-0.17804009, 0.33769128, -0.14572927, -0.029545018, 0.3897, -0.055615567, 0.15232995, 0.48788264, -0.21422523, 0.03397293, 0.0337794, -0.19830915, -0.022457365, -0.35096076, 0.42616987, -0.19268763) * go_3(0.0, 0.0);\n    result += mat4(-0.13191561, -0.18337126, 0.017879983, -0.070472844, -0.09409196, -0.025770849, -0.060219247, 0.10869267, -0.17341033, -0.09199785, -0.0667796, -0.093538545, -0.21300837, 0.030474098, -0.04540468, 0.041321553) * go_3(0.0, 1.0);\n    result += mat4(-0.0998177, -0.08669185, -0.0090886615, 0.0021083376, 0.08900095, 0.5062186, 0.45537788, 0.029077586, -0.1001008, -0.0077697043, -0.0096318, 0.11706454, 0.07401959, -0.00650215, 0.06092762, 0.037442297) * go_3(1.0, -1.0);\n    result += mat4(-0.18500404, 0.0024998419, -0.11761331, -0.026825588, 0.27255726, 0.093010515, 0.3281413, -0.051473666, -0.050259475, -0.17258662, -0.23394547, 0.104795866, 0.035074063, -0.061560635, 0.05975411, -0.094255395) * go_3(1.0, 0.0);\n    result += mat4(-0.023440497, -0.021479638, 0.0036277648, 0.004972212, 0.02416659, -0.09856867, -0.03971455, -0.27094853, 0.026615402, -0.0047890246, -0.13755885, 0.16591635, -0.0016293586, 0.133207, 0.047790572, 0.029041538) * go_3(1.0, 1.0);\n    result += vec4(-0.0063728676, -0.029053684, -0.052831043, 0.006475641);\n    return result;\n}\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(VL)-Conv-4x3x3x16\n//!HOOK MAIN\n//!BIND conv2d_2_tf\n//!BIND conv2d_2_tf1\n//!SAVE conv2d_3_tf\n//!WIDTH conv2d_2_tf.w\n//!HEIGHT conv2d_2_tf.h\n//!COMPONENTS 4\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\n#define go_0(x_off, y_off) (max((conv2d_2_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max((conv2d_2_tf1_texOff(vec2(x_off, y_off))), 0.0))\n#define go_2(x_off, y_off) (max(-(conv2d_2_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_3(x_off, y_off) (max(-(conv2d_2_tf1_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(-0.0431447, 0.047972627, 0.09522898, 0.19048582, 0.0015511789, 0.1182684, -0.065335006, 0.061233886, -0.02451869, 0.065670215, -0.015341636, 0.06836347, 0.10215459, 0.17516296, 0.0857072, 0.072732896) * go_0(-1.0, -1.0);\n    result += mat4(0.10117189, 0.049022958, -0.016017418, -0.12119866, 0.089112304, 0.016286526, -0.025251161, 0.03239003, -0.0783818, -0.086096615, -0.13673106, -0.15934734, -0.51308054, -0.061430074, -0.16208844, 0.2227776) * go_0(-1.0, 0.0);\n    result += mat4(-0.011567444, 0.025550444, -0.018439503, -0.015003767, 0.11606929, -0.11613111, -0.040906087, -0.015202219, 0.03932618, -0.1106059, 0.03703376, 0.018548314, -0.12761284, -0.038109995, -0.23577367, 0.20272344) * go_0(-1.0, 1.0);\n    result += mat4(0.025444161, -0.075270735, 0.10999789, 0.16305386, 0.016178958, -0.074034974, 0.1177035, -0.077481024, -0.047774278, -0.029782977, 0.23137823, -0.2389453, 0.033015423, -0.10381626, -0.16437943, 0.20906886) * go_0(0.0, -1.0);\n    result += mat4(-0.098473966, 0.11013442, -0.18486807, 0.1907086, -0.17564997, -0.08509439, -0.42472756, -0.17446618, 0.3440862, 0.12719585, -0.12213955, -0.02246555, 0.18982963, 0.20809166, -0.36067408, 0.51116616) * go_0(0.0, 0.0);\n    result += mat4(-0.019805575, 0.07812505, 0.061653323, -0.08379226, 0.026396899, 0.009063019, -0.10845824, 0.0827647, 0.045301896, -0.07748021, -0.07435832, 0.14860612, -0.077515624, 0.010588131, -0.22704287, 0.26849246) * go_0(0.0, 1.0);\n    result += mat4(-0.02884339, -0.09512523, -0.038564682, 0.08862835, 0.041666254, -0.10532901, 0.040582962, -0.10063983, -0.15736029, -0.03644334, -0.005061672, 0.04302295, -0.046482194, -0.05262547, 0.05110866, 0.03204655) * go_0(1.0, -1.0);\n    result += mat4(-0.005932702, 0.033263832, 0.0044865874, -0.02328917, 0.056534443, -0.14084046, 0.022353357, 0.015087431, -0.2734596, -0.026544483, 0.06297078, 0.11277746, 0.06127936, 0.02466357, -0.04970561, 0.02098484) * go_0(1.0, 0.0);\n    result += mat4(0.013603583, 0.036264602, 0.10985147, 0.01532773, -0.09012781, 0.1132652, -0.17016481, 0.025332611, -0.077462606, 0.02990799, -0.10627784, -0.006231141, -0.089164406, -0.051507175, -0.043900985, 0.09049239) * go_0(1.0, 1.0);\n    result += mat4(-0.15391691, 0.1915742, 0.014101639, -0.022153432, 0.06291936, -0.017871676, -0.016763045, -0.14741553, -0.011252563, -0.20720159, -0.030648025, -0.0142307645, 0.010291614, -0.09243969, -0.052940153, 0.0061574522) * go_1(-1.0, -1.0);\n    result += mat4(0.032283742, 0.030768922, 0.1070225, -0.027818602, 0.10032608, 0.0061178426, -0.03561339, -0.26687133, 0.14369439, -0.11362691, -0.08980895, 0.066520914, 0.33414948, 0.006998835, 0.09193012, -0.2857383) * go_1(-1.0, 0.0);\n    result += mat4(-0.059588976, -0.02046844, -0.042585023, 0.031939838, 0.12796514, -0.06155685, 0.03540324, 0.009929082, -0.0039611827, 0.10790477, 0.049435645, -0.083034374, 0.23874004, -0.07460337, -0.020173345, -0.2006587) * go_1(-1.0, 1.0);\n    result += mat4(-0.13217632, 0.052319963, -0.026713084, -0.0051368694, -0.10380872, -0.28659084, 0.0044393227, 0.005174543, -0.05092618, -0.07092548, -0.027397033, -0.01609789, 0.13699281, -0.14706929, 0.17737861, -0.23746766) * go_1(0.0, -1.0);\n    result += mat4(0.19268502, 0.14133929, -0.1305119, -0.4034132, 0.057504695, -0.24550998, -0.081932545, 0.45489246, -0.29331785, 0.19625074, 0.063166246, 0.15158689, 0.6715147, -0.4610189, 0.08921431, 0.17761138) * go_1(0.0, 0.0);\n    result += mat4(0.044718128, -0.011809122, 0.024131307, -0.30093196, -0.05607289, 0.047759805, 0.004210022, 0.098192796, 0.030430846, 0.008207501, 0.12266905, -0.10549182, 0.11584339, -0.091016166, -0.08635591, -0.13889709) * go_1(0.0, 1.0);\n    result += mat4(-0.19226642, 0.07147627, -0.14759602, 0.4041079, 0.0744628, -0.19612685, 0.1498252, -0.06273549, 0.017959936, 0.10858338, -0.14985329, 0.062042814, -0.13240446, -0.24362786, 0.113626175, -0.15332204) * go_1(1.0, -1.0);\n    result += mat4(0.08383099, -0.13935047, -0.25981048, 0.16491203, 0.07513876, -0.28346774, 0.19722275, -0.044425573, 0.020889329, -0.22140723, 0.025403097, -0.09183192, 0.014202567, -0.18666178, 0.062913105, -0.047674105) * go_1(1.0, 0.0);\n    result += mat4(-0.1862771, 0.25878942, -0.043018065, 0.22144824, 0.016088247, 0.12113542, -0.11965952, -0.01587184, 0.07830932, -0.16069177, 0.13421321, 0.018718706, 0.09548377, 0.018543294, 0.013614677, -0.1054485) * go_1(1.0, 1.0);\n    result += mat4(-0.2121733, -0.015635416, 0.027564054, -0.085904464, 0.064805664, -0.070543915, 0.08966146, -0.06359783, 0.01131311, 0.046913184, -0.09809833, -0.092063695, -0.087217696, 0.012411829, 0.0045399712, 0.027389864) * go_2(-1.0, -1.0);\n    result += mat4(-0.19307798, 0.09449126, 0.084036835, 0.30262446, 0.011706106, 0.029800637, 0.04612629, 0.006186647, 0.11228541, 0.055147965, 0.17659879, -0.023410015, 0.19965266, -0.06684007, -0.081968054, -0.052410994) * go_2(-1.0, 0.0);\n    result += mat4(-0.058564443, 0.08252549, 0.058217794, 0.0864448, -0.25663558, 0.080260284, -0.0010294432, 0.05830051, -0.07684524, 0.1820709, 0.04438993, 0.019178499, -0.12425012, -0.04596089, -0.010032888, -0.0012803525) * go_2(-1.0, 1.0);\n    result += mat4(-0.43352658, 0.15262963, 0.25620222, 0.22428556, 0.09667152, 0.0037820593, -0.07951691, -0.11553085, 0.12982155, 0.17988266, -0.14283511, 0.074744284, 0.03604327, 0.00452661, -0.12865154, -0.020020623) * go_2(0.0, -1.0);\n    result += mat4(0.06850602, -0.18057181, 0.2093389, -0.07333886, 0.28406742, -0.048766967, 0.18114483, 0.47292945, -0.2340266, -0.06862712, 0.28263155, 0.3150323, -0.054724697, -0.16958356, 0.27928987, -0.19666018) * go_2(0.0, 0.0);\n    result += mat4(0.03281329, 0.0038649621, -0.07108877, 0.10791149, 0.15235375, -0.3083721, 0.168294, 0.10379698, 0.029038485, 0.16282903, 0.04483725, -0.018684763, 0.108186625, 0.027885616, -0.019351846, 0.1623065) * go_2(0.0, 1.0);\n    result += mat4(-0.110499054, 0.31347123, 0.030852, 0.01631416, -0.1466389, 0.080429435, -0.18689284, 0.10667815, 0.20645237, -0.18004708, -0.10570413, -0.15435064, -0.019000605, -3.126077e-06, 0.037761535, -0.015040956) * go_2(1.0, -1.0);\n    result += mat4(-0.023364332, -0.023399066, 0.2712722, 0.049637552, -0.10222765, -0.2698945, 0.20991959, 0.04921932, 0.21510898, -0.0751939, -0.19781734, -0.28162366, -0.041881047, 0.0065111094, -0.04102195, 0.0982682) * go_2(1.0, 0.0);\n    result += mat4(-0.032176614, 0.019144032, -0.08985387, 0.091637276, 0.1012352, 0.0003583357, 0.07897295, -0.09531175, -0.001155058, 0.074372366, -0.026186578, 0.07283374, 0.06052053, 0.009307753, -0.03874333, -0.06228009) * go_2(1.0, 1.0);\n    result += mat4(-0.022224072, -0.15717922, -0.1406057, -0.05941157, -0.028769474, -0.21226564, -0.036570027, 0.22266355, 0.14120889, 0.014577123, 0.10216447, 0.018429281, 0.056729726, -0.055834044, 0.058146577, -0.11999068) * go_3(-1.0, -1.0);\n    result += mat4(0.009995364, -0.020045493, -0.0057422677, 0.0643022, 0.016475432, -0.030856136, 0.042140726, 0.15077904, -0.32955253, 0.0694449, 0.17931722, 0.3439302, -0.12484157, -0.10958869, -0.15755124, -0.09755644) * go_3(-1.0, 0.0);\n    result += mat4(-0.008314924, 0.07704758, 0.043228816, -0.08110893, 0.099286236, -0.053224478, 0.22877018, -0.189486, -0.00798416, 0.018341504, 0.10734141, 0.0752633, -0.042524844, -0.086395286, 0.14299925, 0.026488977) * go_3(-1.0, 1.0);\n    result += mat4(-0.052531082, 0.19139186, 0.12205995, -0.2573172, 0.15157184, 0.0073150825, 0.089774385, 0.06604469, -0.16528498, -0.002511137, 0.14287429, -0.07819732, 0.025014274, 0.15338829, 0.0761692, -0.02803716) * go_3(0.0, -1.0);\n    result += mat4(-0.21000335, 0.15277153, 0.08546171, 0.2816124, -0.16559112, -0.11068559, 0.47053605, -0.009787771, -0.0013089112, -0.06985127, 0.44743782, 0.25142467, -0.32670796, 0.044035822, -0.12545367, -0.2996084) * go_3(0.0, 0.0);\n    result += mat4(-0.11526387, 0.15654811, 0.099616654, 0.15473685, 0.21278231, 0.046207245, 0.117993094, -0.26825273, -0.12539764, 0.14013724, 0.17357737, -0.05387817, 0.076738276, -0.13339446, 0.15005626, -0.2108176) * go_3(0.0, 1.0);\n    result += mat4(-0.0008846504, -0.05998622, -0.028892396, 0.04784136, 0.0104263965, 0.10899508, -0.073364735, 0.077516064, -0.074248806, -0.21749993, -0.26203, 0.041161157, 0.09366407, -0.026498007, 0.0122177545, 0.03892727) * go_3(1.0, -1.0);\n    result += mat4(0.04349908, 0.13671173, 0.2242545, -0.028021423, -0.03802222, 0.0052366396, -0.010709643, 0.031290106, 0.06291333, -0.024909683, -0.15439379, -0.04502091, 0.2062182, -0.5983536, -0.09670497, -0.38446042) * go_3(1.0, 0.0);\n    result += mat4(-0.008962513, 0.13044207, 0.04964221, 0.012250417, 0.012129821, 0.019985713, -0.06421885, 0.009168735, -0.044516414, 0.071368866, -0.006634213, 0.06497366, 0.08578495, -0.10586125, 0.06628038, -0.14006054) * go_3(1.0, 1.0);\n    result += vec4(0.056541316, 0.041788545, -0.036094554, -0.021763096);\n    return result;\n}\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(VL)-Conv-4x3x3x16\n//!HOOK MAIN\n//!BIND conv2d_2_tf\n//!BIND conv2d_2_tf1\n//!SAVE conv2d_3_tf1\n//!WIDTH conv2d_2_tf.w\n//!HEIGHT conv2d_2_tf.h\n//!COMPONENTS 4\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\n#define go_0(x_off, y_off) (max((conv2d_2_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max((conv2d_2_tf1_texOff(vec2(x_off, y_off))), 0.0))\n#define go_2(x_off, y_off) (max(-(conv2d_2_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_3(x_off, y_off) (max(-(conv2d_2_tf1_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(0.0647927, 0.053666476, -0.14723225, 0.027874574, -0.0003166473, 0.07337155, -0.061972085, -0.012667777, -0.17071614, 0.091927536, -0.051160213, 0.21336353, 0.13854574, 0.09582817, 0.032316446, 0.13838023) * go_0(-1.0, -1.0);\n    result += mat4(-0.0398984, 0.108049214, 0.093780346, -0.022015186, -0.15188989, -0.1381083, 0.2998843, 0.21623154, -0.08862326, 0.025862623, 0.06895634, 0.13529755, 0.06957801, -0.0011681129, 0.105972745, -0.04722446) * go_0(-1.0, 0.0);\n    result += mat4(-0.026321493, -0.04828038, -0.012545767, -0.005490858, -0.054038163, 0.075943105, -0.11526662, 0.022242405, -0.03543104, -0.12451852, -0.14911178, 0.013503498, 0.08773292, 0.09695139, -0.013498657, -0.27424073) * go_0(-1.0, 1.0);\n    result += mat4(0.018575635, -0.11321618, -0.07853153, 0.04104883, 0.0018416744, 0.11579002, 0.03685964, -0.031546146, -0.1755398, 0.23517849, -0.08095411, 0.031999595, -0.18542038, -0.26171613, -0.20567231, -0.05683613) * go_0(0.0, -1.0);\n    result += mat4(0.1538556, 0.21723682, 0.12131733, -0.15308167, 0.103326, -0.006956118, 0.043583486, -0.23811384, -0.103285454, 0.05543916, -0.37894246, 0.32072112, 0.22651967, 0.03516268, 0.34612176, 0.23688535) * go_0(0.0, 0.0);\n    result += mat4(0.040021293, 0.0029912095, 0.04885362, 0.061496444, 0.016926387, -0.118446946, 0.038948335, -0.0934512, -0.25194243, -0.054018084, -0.07149527, 0.017903058, 0.0845516, 0.33802906, 0.11953944, -0.081294954) * go_0(0.0, 1.0);\n    result += mat4(-0.09558082, -0.36974236, -0.07524102, 0.11131445, 0.047626104, 0.12854609, -0.10264962, -0.044669047, -0.05572307, 0.34475142, -0.16806377, -0.0037204176, 0.03400533, -0.04047774, 0.024379745, 0.09056291) * go_0(1.0, -1.0);\n    result += mat4(-0.039392482, 0.2553437, 0.11705501, 0.03219211, 0.073977776, -0.16610906, -0.032796364, -0.054669864, -0.07123178, 0.00079619256, -0.36920992, -0.029054813, 0.12830003, 0.004987549, 0.08724278, -0.029499404) * go_0(1.0, 0.0);\n    result += mat4(0.021272454, -0.063295126, 0.011779576, 0.103093, -0.011095461, 0.027948728, -0.014605259, -0.04723974, -0.05334346, -0.044831257, -0.07296399, -0.03314197, -0.01687865, -0.09261895, -0.06128567, 0.092708185) * go_0(1.0, 1.0);\n    result += mat4(0.0077418387, 0.00871427, 0.060824487, 0.1093608, -0.021077013, -0.057341542, -0.04769576, -0.08144089, 0.0212823, -0.06731425, -0.04134463, -0.0016761447, -0.03402026, 0.036424547, 0.11689576, -0.14946719) * go_1(-1.0, -1.0);\n    result += mat4(0.18536687, 0.020073935, 0.17041959, 0.024790209, 0.08397728, -0.13884324, 0.013950321, -0.055075396, -0.09317963, -0.05723721, -0.060491834, 0.0017911601, -0.109154835, 0.010338362, -0.1982491, -0.21752335) * go_1(-1.0, 0.0);\n    result += mat4(0.031852514, 0.031424347, 0.07817056, 0.07770759, 0.019805199, -0.091223724, 0.11914662, 0.1673029, -0.018734453, 0.16275099, 0.23245652, 0.36139074, -0.1396047, -0.14774057, 0.13756078, -0.123794965) * go_1(-1.0, 1.0);\n    result += mat4(-0.034937833, 0.20777488, 0.10104809, -0.035140667, 0.2536575, 0.010970045, 0.16896339, -0.081219964, -0.062478427, -0.0010431948, -0.027980985, 0.11446318, -0.127309, 0.21002083, 0.044436257, -0.16986957) * go_1(0.0, -1.0);\n    result += mat4(0.06309646, -0.042341243, 0.36642808, 0.18653205, 0.06973023, 0.06315932, -0.323688, 0.25672218, 0.042820994, 0.13792914, -0.12892757, -0.09220378, -0.18939693, 0.03862022, -0.17376114, -0.24673308) * go_1(0.0, 0.0);\n    result += mat4(-0.02130602, -0.35428852, -0.011634983, -3.9823462e-05, 0.110818714, -0.2981158, 0.060209107, 0.012538829, -0.0744833, -0.050204318, -0.12676497, -0.031484153, -0.28799182, 0.22338839, -0.070876874, -0.02102363) * go_1(0.0, 1.0);\n    result += mat4(-0.07929991, 0.014598492, 0.23034762, 0.024872296, 0.07480494, -0.17139243, -0.014421178, 0.056448363, -0.028626937, -0.022152562, 0.044871796, -0.048653606, 0.009350802, 0.019022083, -0.08554845, -0.0922645) * go_1(1.0, -1.0);\n    result += mat4(-0.027405115, 0.1831188, 0.28516722, 0.19882526, 0.27299204, -0.06910511, 0.03244419, -0.0031333128, 0.061055277, -0.114398144, 0.03729459, -0.07840815, -0.37776002, -0.24129418, -0.54815483, -0.2702045) * go_1(1.0, 0.0);\n    result += mat4(0.053723935, 0.13472083, 0.09563273, 0.19009806, -0.18722993, -0.25939655, -0.016197463, -0.067061596, 0.1647598, 0.061905228, 0.06191816, -0.018582113, -0.07218153, 0.11278394, 0.05478068, -0.104871586) * go_1(1.0, 1.0);\n    result += mat4(0.0036616288, -0.045782693, -0.226954, -0.05043515, -0.078096785, -0.036197383, 0.09269631, 0.016823346, -0.0060579977, -0.041455746, 0.09032774, -0.09217121, 0.058089796, 0.060311552, 0.033079024, 0.022586476) * go_2(-1.0, -1.0);\n    result += mat4(0.0436363, -0.079482526, 0.0027447809, 0.039558932, 0.13275702, 6.898711e-05, -0.21961488, -0.11315821, 0.0076181027, -0.025279062, -0.15829584, -0.063141204, 0.062049046, 0.13117202, -0.02435016, 0.109555416) * go_2(-1.0, 0.0);\n    result += mat4(-0.010148116, 0.056620967, -0.015910713, -0.07370375, 0.1529919, 0.005792597, 0.02771225, -0.17027487, 0.096740395, 0.063347995, 0.17823112, 0.054105148, 0.04995114, -0.28613812, 0.06369567, 0.15978208) * go_2(-1.0, 1.0);\n    result += mat4(-0.13688345, 0.16967694, -0.061759472, 0.013682004, -0.1290496, 0.07167547, -0.065592445, -0.17897636, 0.057080988, 0.035630587, 0.09140394, -0.08695068, 0.16807681, 0.014749346, 0.07875138, 0.034913708) * go_2(0.0, -1.0);\n    result += mat4(-0.098915346, -0.31459075, -0.10892429, 0.1557498, -0.19764107, -0.26881596, -0.03589311, 0.45288458, -0.34171388, 0.12675741, 0.18415868, -0.19770056, 0.29025507, -0.15812592, 0.09685835, 0.0027761247) * go_2(0.0, 0.0);\n    result += mat4(0.06425249, -0.01169722, 0.06379363, 0.053835012, -0.07356561, -0.06367294, 0.108630784, -0.14137438, 0.08536725, -0.03209748, 0.07250959, -0.014214082, 0.07170588, -0.25647813, 0.1092683, 0.18791042) * go_2(0.0, 1.0);\n    result += mat4(-0.023783233, 0.14261739, 0.102011986, -0.03633555, -0.05032627, 0.09378387, 0.11764051, 0.1353335, 0.032817088, -0.1352964, -0.00667997, -0.13388929, 0.022861317, 0.0037358075, 0.018605746, -0.0009892831) * go_2(1.0, -1.0);\n    result += mat4(0.22419162, -0.23105696, -0.09900454, -0.15831396, 0.12398773, 0.097933106, -0.13189293, 0.1330756, -0.19673057, -0.037342317, -0.13462654, -0.08974021, 0.030326528, -0.0815862, -0.118352115, 0.009187904) * go_2(1.0, 0.0);\n    result += mat4(-0.012130391, -0.06408448, 0.13710785, -0.06678414, -0.09970725, -0.14895032, -0.02366641, 0.029581001, -0.07101809, 0.09414698, 0.018300869, 0.009139046, -0.0027311493, -0.2359952, -0.011602826, -0.007582444) * go_2(1.0, 1.0);\n    result += mat4(-0.15473361, -0.06868751, -0.030721204, -0.08650113, 0.071349874, -0.08177769, 0.1611948, 0.18305337, -0.0144878505, 0.10975452, -0.026968453, -0.04909913, -0.059665974, 0.056036238, -0.11623168, -0.10584912) * go_3(-1.0, -1.0);\n    result += mat4(-0.096973225, 0.054132458, -0.010600018, 0.089397885, -0.0031138035, 0.037452973, 0.041115325, 0.1924831, 0.14759748, 0.032560788, -0.082884625, 0.0324635, -0.083511285, -0.050381303, 0.025589975, -0.0981257) * go_3(-1.0, 0.0);\n    result += mat4(-0.09183111, 0.034952193, -0.048511654, 0.020719057, 0.1863456, 0.01902738, 0.14455654, -0.008500172, 0.16385981, -0.07806569, -0.031216217, -0.17002788, -0.08882952, 0.07335293, -0.2223089, 0.01706056) * go_3(-1.0, 1.0);\n    result += mat4(-0.08361569, 0.046698716, -0.016646344, 0.09351987, 0.0054158634, -0.13641126, -0.12396605, 0.011380122, 0.040951792, -0.11222528, -0.0031548145, -0.0022303525, 0.0350846, -0.03280425, -0.09972476, -0.113325305) * go_3(0.0, -1.0);\n    result += mat4(-0.19961461, -0.27561286, -0.12783135, -0.062596925, 0.005870981, -0.24796526, 0.18717633, -0.16945636, -0.076396205, -0.08411448, 0.13751988, 0.21014418, -0.008655945, -0.09848541, -0.14536901, -0.2132181) * go_3(0.0, 0.0);\n    result += mat4(0.14118621, 0.20831147, -0.020545695, 0.008340737, 0.016840864, -0.16912372, -0.121718146, 0.15108089, -0.19803092, -0.07827729, -0.047639225, -0.12277847, 0.04974115, -0.09349339, -0.2756667, -0.19581003) * go_3(0.0, 1.0);\n    result += mat4(-0.0036992705, 0.16539848, 0.022026122, 0.07740234, -0.035687633, -0.004568715, 0.017408118, -0.09757294, -0.094941914, -0.3381112, -0.12724453, 0.025583982, -0.18571027, 0.047607586, -0.0704089, -0.055323426) * go_3(1.0, -1.0);\n    result += mat4(0.13821335, 0.028168043, 0.09990671, -0.032266147, -0.067236245, 0.11512147, -0.112986445, -0.10818019, -0.10062181, 0.21276556, 0.01681818, 0.069806606, 0.09628121, 0.06456379, 0.10394843, -0.02343886) * go_3(1.0, 0.0);\n    result += mat4(0.041937463, 0.072631165, 0.045366894, -0.0046993676, 0.03946691, 0.121010706, -0.030089365, -0.007266469, 0.0092267515, 0.14853416, -0.033248078, -0.027284347, -0.10031526, 0.15864117, -0.16782752, -0.18466589) * go_3(1.0, 1.0);\n    result += vec4(0.07722432, -0.025165567, 0.034291282, -0.09902708);\n    return result;\n}\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(VL)-Conv-4x3x3x16\n//!HOOK MAIN\n//!BIND conv2d_3_tf\n//!BIND conv2d_3_tf1\n//!SAVE conv2d_4_tf\n//!WIDTH conv2d_3_tf.w\n//!HEIGHT conv2d_3_tf.h\n//!COMPONENTS 4\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\n#define go_0(x_off, y_off) (max((conv2d_3_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max((conv2d_3_tf1_texOff(vec2(x_off, y_off))), 0.0))\n#define go_2(x_off, y_off) (max(-(conv2d_3_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_3(x_off, y_off) (max(-(conv2d_3_tf1_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(-0.004729794, -0.0124398535, -0.08538641, -0.058604605, 0.008671952, 0.25604513, 0.020800482, 0.24144122, -0.028920606, -0.04705229, 0.030192787, 0.0010597534, 0.017666103, 0.0041322373, 0.20027764, 0.08919112) * go_0(-1.0, -1.0);\n    result += mat4(0.0001626656, 0.05816014, -0.0060765734, 0.08811165, 0.35835367, -0.016291425, -0.56892496, 0.083845764, 0.15026698, -0.15916558, 0.08069463, -0.3931291, -0.0123534845, -0.111639686, -0.14637001, -0.08171439) * go_0(-1.0, 0.0);\n    result += mat4(-0.114976816, 0.023376396, 0.13855027, 0.07438716, -0.069991484, 0.20377779, 0.23929878, -0.040769435, 0.018832395, 0.005638609, -0.091848075, 0.027843866, 0.023744943, -0.06620523, -0.11678267, 0.0844119) * go_0(-1.0, 1.0);\n    result += mat4(0.0035854098, -0.08432094, -0.17799544, -0.10041983, 0.25605857, 0.021009786, 0.030499447, -0.09928291, 0.052178737, -0.08286175, -0.057888374, 0.024606042, 0.046342995, 0.13875343, 0.11279266, 0.19826262) * go_0(0.0, -1.0);\n    result += mat4(-0.016232021, -0.21539623, 0.0936961, 0.021143785, 0.094262615, 0.049040064, 0.40978724, 0.15347758, 0.08884813, -0.24887115, -0.14756748, -0.5020875, 0.112477, 0.1466549, -0.33418837, 0.5769466) * go_0(0.0, 0.0);\n    result += mat4(-0.16832942, -0.07354198, -0.12081261, -0.055348314, 0.39716053, 0.25583258, 0.09870877, 0.2151021, -0.025700683, -0.1801462, -0.04616654, -0.02782245, -0.054461803, -0.00042802413, -0.00163228, -0.004240747) * go_0(0.0, 1.0);\n    result += mat4(-0.05193433, -0.0018198475, -0.17647028, -0.19462106, 0.1538165, 0.054894235, 0.12183955, 0.07340974, -0.0019901982, 0.0357373, -0.07597063, -0.06681543, -0.00090057997, -0.053894397, -0.010301875, -0.16553953) * go_0(1.0, -1.0);\n    result += mat4(-0.30873474, -0.2836045, 0.057037193, -0.5016378, 0.11952749, 0.102353275, 0.2351629, -0.14635189, -0.019398788, -0.08776502, 0.021669978, -0.089918956, -0.2187901, -0.1180891, -0.049789533, -0.16109149) * go_0(1.0, 0.0);\n    result += mat4(-0.078335494, -0.08867304, 0.03349591, -0.1000293, -0.20235832, 0.22917585, -0.09905303, 0.08381748, 0.014350217, -0.14478815, -0.027479894, -0.026432173, -0.10309177, -0.09860884, -0.019177807, -0.06963025) * go_0(1.0, 1.0);\n    result += mat4(0.008169383, 0.12532842, -0.23369955, 0.077973194, 0.09076616, -0.021277165, 0.1721421, -0.26914293, -0.014729218, -0.023279984, -0.057670787, 0.003598546, -0.015225789, -0.0115396585, -0.26196182, -0.10724508) * go_1(-1.0, -1.0);\n    result += mat4(0.16542235, 0.06589374, 0.07410237, 0.26753154, -0.3356288, 0.3096256, 0.07112498, -0.0992165, 0.15020338, -0.11021673, 0.18803611, 0.12918204, 0.109007336, -0.031968266, 0.057093572, 0.035949256) * go_1(-1.0, 0.0);\n    result += mat4(0.065006174, 0.031055925, 0.0390232, -0.01678507, -0.21553491, 0.14171642, -0.19541772, -0.033691674, -0.06241631, 0.07497651, 0.024557155, 0.056778047, -0.060191352, -0.0261998, 0.07493729, -0.0699132) * go_1(-1.0, 1.0);\n    result += mat4(-0.008541382, 0.020270415, -0.027760057, -0.040962905, -0.26732433, 0.34379438, -0.23012447, 0.0051356517, -0.04059567, 0.0972959, 0.039965224, -0.14796777, -0.0016924662, -0.116963714, -0.026353523, -0.29799464) * go_1(0.0, -1.0);\n    result += mat4(0.03329303, -0.12663862, -0.0004959157, -0.11162377, 0.26238343, 0.43260252, -0.16504994, 0.10727678, -0.22505566, 0.43474057, 0.43304008, 0.05143919, 0.40494493, 0.08689636, -0.035733614, 0.25727916) * go_1(0.0, 0.0);\n    result += mat4(0.12175736, -0.014467151, -0.17461288, -0.18480565, -0.26439998, 0.307935, -0.058916792, -0.014292711, -0.0569471, 0.10751278, -0.04134206, 0.1847734, -0.07519831, -0.033909313, -0.05001451, -0.136606) * go_1(0.0, 1.0);\n    result += mat4(0.1424893, -0.026820501, 0.19645774, -0.0011315406, -0.14680974, 0.07662838, 0.21108222, 0.13260938, 0.17923595, -0.085527614, 0.08217639, 0.06579479, 0.05985784, -0.09016323, 0.11172888, 0.111903176) * go_1(1.0, -1.0);\n    result += mat4(0.19842595, 0.0093640275, 0.10433465, 0.13341904, -0.082806975, 0.22555825, -0.1315717, 0.11907785, 0.24012424, 0.47776055, 0.1835734, 0.17483878, 0.079803735, 0.01155073, -0.21146573, -0.16484722) * go_1(1.0, 0.0);\n    result += mat4(0.15064004, 0.021381427, 0.18301587, 0.21225913, 0.054995645, 0.03212186, 0.052798916, -0.048424408, 0.03609021, 0.0964704, -0.059469886, -0.05133066, -0.08157349, 0.051145166, -0.09107608, -0.1362262) * go_1(1.0, 1.0);\n    result += mat4(0.090521574, -0.014747857, -0.081675015, -0.118686825, 0.04848682, -0.033071827, 0.008534588, 0.023765508, 0.16849907, -0.21797262, -0.17049783, -0.07824179, -0.033794608, 0.052612655, 0.095820345, -0.07262317) * go_2(-1.0, -1.0);\n    result += mat4(0.22816367, -0.13772108, -0.036353834, -0.47638395, -0.0530902, 0.14089061, 0.076203234, 0.18006112, 0.121814854, -0.20750527, 0.08266107, -0.28634354, 0.14301859, -0.13458411, 0.00501663, -0.039783802) * go_2(-1.0, 0.0);\n    result += mat4(-0.103384845, -0.14389835, 0.08275834, -0.068423435, 0.22643796, -0.02966374, -0.2847584, 0.037081387, 0.02349005, -0.19353923, -0.00095957273, -0.13623689, -0.073120415, 0.03941467, 0.21864155, -0.014019576) * go_2(-1.0, 1.0);\n    result += mat4(-0.082576886, 0.17085212, 0.08971252, -0.04213377, -0.032548156, 0.022137715, 0.08399252, -0.0011743539, -0.09410863, -0.41728264, -0.20709297, -0.18933547, 0.027059928, 0.09743364, 0.2504647, -0.041173562) * go_2(0.0, -1.0);\n    result += mat4(-0.20924084, 0.291118, 0.029851688, 0.16953468, 0.02936709, 0.12213576, 0.22944322, 0.108747594, 0.0001881129, -0.27398208, -0.009702691, 0.15449248, -0.9472944, -0.26114875, -0.28161275, -0.3495961) * go_2(0.0, 0.0);\n    result += mat4(-0.12994622, -0.2758638, -0.1091727, -0.0968308, -0.14323105, 0.035175014, -0.08023811, 0.006023802, -0.031529594, -0.1486306, -0.3398172, -0.23240276, -0.29163983, 0.173475, 0.18809283, 0.22197202) * go_2(0.0, 1.0);\n    result += mat4(0.048254848, -0.083444916, -0.014334202, 0.060992356, -0.023099286, -0.09492961, 0.05592045, 0.0026059286, 0.08998117, -0.108810075, -0.053304546, 0.045926623, 0.068255246, 0.099023566, 0.01595483, 0.1336309) * go_2(1.0, -1.0);\n    result += mat4(0.21916585, 0.2837387, 0.14624594, 0.18843961, -0.06747584, 0.054924384, -0.082568415, 0.05011459, 0.014297759, -0.3884833, -0.054417178, -0.18970548, 0.088336475, -0.030646667, -0.2980552, -0.030035203) * go_2(1.0, 0.0);\n    result += mat4(-0.02748568, -0.011897529, -0.2370837, -0.016740574, -0.0282112, 0.050353892, -0.10761107, -0.00036999505, 0.037646662, -0.17742962, 0.06489219, -0.158852, -0.08016933, 0.07808515, -0.105895035, 0.079869986) * go_2(1.0, 1.0);\n    result += mat4(-0.0058994526, -0.037170693, 0.2574696, 0.06199102, -0.04497728, -0.10667442, -0.15183865, 0.0212881, -0.030842574, 0.073473394, 0.010764398, -0.00084518327, -0.03893014, -0.009649613, 0.07443129, 0.15108284) * go_3(-1.0, -1.0);\n    result += mat4(0.11325495, -0.096435815, -0.097331434, -0.049700152, -0.17231967, 0.047090057, -0.019111065, 0.104790315, -0.15004838, 0.13950798, 0.055996202, -0.070548095, 0.047154237, -0.007650949, -0.053611025, -0.012242293) * go_3(-1.0, 0.0);\n    result += mat4(0.12787002, -0.04958212, 0.053988468, 0.0017896162, 0.049493514, -0.009475431, -0.0022641935, 0.03933694, -0.005174597, 0.043754533, -0.1432976, 0.037084177, -0.04601288, -0.032077815, -0.059897035, 0.12584484) * go_3(-1.0, 1.0);\n    result += mat4(0.019409029, 0.10492923, 0.268368, 0.12597778, -0.17733063, -0.0085961, -0.27136415, -0.049664587, 0.012515404, -0.21444482, -0.39275557, -0.12297177, 0.06800057, 0.19228315, 0.06245887, 0.35772634) * go_3(0.0, -1.0);\n    result += mat4(-0.16317715, 0.2288402, -0.23235172, 0.22230752, -0.1646375, 0.13366091, 0.16681044, -0.17399235, 0.33997267, -0.3179832, -0.34756508, 0.39843196, -0.10748536, 0.322923, 0.23339489, 0.08684083) * go_3(0.0, 0.0);\n    result += mat4(0.02835275, 0.12314228, 0.24030593, 0.30856124, 0.055735108, -0.044914473, 0.0031432225, 0.07469899, 0.1778018, 0.107083894, -0.023706734, -0.15501897, 0.0943098, -0.034707237, -0.18622099, 0.05257965) * go_3(0.0, 1.0);\n    result += mat4(0.042839274, 0.12597966, 0.08979042, -0.0647561, -0.050434645, 0.049438696, -0.20008127, -0.05572608, 0.046238814, 0.12622325, -0.019017145, -0.13960391, -0.040050175, 0.14298008, -0.20270552, 0.13391526) * go_3(1.0, -1.0);\n    result += mat4(-0.0073277587, 0.10606624, -0.08940439, -0.09656414, 0.12387374, -0.0013147948, 0.23607181, -0.00037969893, 0.050353236, -0.17266603, 0.27796733, -0.09877832, 0.02711225, 0.096394345, 0.07457944, 0.21541388) * go_3(1.0, 0.0);\n    result += mat4(-0.18612787, -0.00027517386, -0.17136407, -0.06413671, 0.025629476, -0.04570916, 0.0008431566, -0.03419168, 0.08123608, 0.09465922, 0.11975521, 0.1269741, 0.08413221, 0.12125001, 0.04727287, 0.072378494) * go_3(1.0, 1.0);\n    result += vec4(0.04244928, -0.014280219, 0.017129054, -0.08807801);\n    return result;\n}\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(VL)-Conv-4x3x3x16\n//!HOOK MAIN\n//!BIND conv2d_3_tf\n//!BIND conv2d_3_tf1\n//!SAVE conv2d_4_tf1\n//!WIDTH conv2d_3_tf.w\n//!HEIGHT conv2d_3_tf.h\n//!COMPONENTS 4\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\n#define go_0(x_off, y_off) (max((conv2d_3_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max((conv2d_3_tf1_texOff(vec2(x_off, y_off))), 0.0))\n#define go_2(x_off, y_off) (max(-(conv2d_3_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_3(x_off, y_off) (max(-(conv2d_3_tf1_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(0.01973856, -0.05053795, 0.015545361, 0.10867395, 0.33441806, 0.14731607, 0.6793983, -0.21394718, -0.00846322, 0.09146322, -0.07427475, -0.078477465, -0.090998545, 0.133366, 0.105515696, -0.13784988) * go_0(-1.0, -1.0);\n    result += mat4(-0.05404873, 0.09784018, -0.1337389, -0.18082313, 0.13461179, -0.3816801, 0.12209786, 0.08176651, 0.10461896, -0.43315184, 0.017470734, 0.20423968, -0.03941875, -0.101959296, -0.09440259, 0.09154717) * go_0(-1.0, 0.0);\n    result += mat4(0.17229515, -0.06907825, -0.008382803, -0.16671611, -0.01576541, 0.03985307, 0.08209482, -0.11707446, -0.11793074, 0.13702396, -0.02013158, 0.07302033, -0.022301994, -0.11464677, 0.036753565, -0.093276784) * go_0(-1.0, 1.0);\n    result += mat4(-0.017650167, 0.009475923, -0.17856382, 0.15925962, 0.06434641, -0.15568036, 0.038135886, 0.18855911, -0.04427734, 0.1878215, 0.10856261, 0.0041275816, -0.12046199, 0.13610138, 0.3741596, -0.12934728) * go_0(0.0, -1.0);\n    result += mat4(-0.24631616, 0.0169485, -0.035534818, 0.37795424, -0.08546174, 0.07817259, 0.42897213, -0.47965595, -0.0146556785, -0.20510523, -0.18889453, 0.06476019, 0.1021008, -0.35398817, -0.031071864, -0.21416448) * go_0(0.0, 0.0);\n    result += mat4(0.32810766, 0.050585747, -0.17658374, -0.13881154, 0.16417882, -0.21286008, -0.106835455, -0.1722344, -0.14151084, 0.08962986, 0.057395387, -0.01623662, 0.02570415, 0.15626897, -0.12687978, 0.080729105) * go_0(0.0, 1.0);\n    result += mat4(-0.050597478, -0.018753758, -0.036346875, -0.017908493, 0.058593344, 0.008303028, 0.05254987, -0.06635018, -0.022532012, 0.029511122, 0.026682215, -0.054647952, 0.069466785, -0.08892492, 0.025351115, -0.023130694) * go_0(1.0, -1.0);\n    result += mat4(0.2412473, -0.16138165, -0.15117447, 0.11851003, -0.096868426, 0.082690425, 0.27923304, 0.11590443, 0.19363573, -0.15770023, -0.066793665, 0.011681678, 0.14037277, -0.112065665, -0.048159517, 0.009453693) * go_0(1.0, 0.0);\n    result += mat4(0.1580054, -0.0060506654, 0.05267837, -0.09178131, -0.09107123, 0.23191126, 0.21108283, -0.070422985, 0.024321035, 0.06131459, 0.066626504, 0.032481454, 0.044402298, 0.1390604, -0.14432502, 0.040869843) * go_0(1.0, 1.0);\n    result += mat4(0.10264861, 0.013504324, 0.012482852, -0.1781206, -0.12799414, -0.27026084, -0.123830505, 0.098105, -0.039127555, 0.09367889, 0.122323096, 0.1416734, 0.044763107, -0.21801683, -0.14018978, 0.17646866) * go_1(-1.0, -1.0);\n    result += mat4(0.017453065, 0.11498537, -0.10998983, -0.3116098, -0.3099762, 0.5024706, 0.051817298, 0.03170681, -0.18937826, 0.07946567, -0.11978771, -0.09523745, -0.0033551592, -0.11768945, 0.08932359, -0.06689581) * go_1(-1.0, 0.0);\n    result += mat4(0.1507582, -0.013266159, -0.073085934, -0.07252967, -0.06301927, -0.13218755, 0.12984878, -0.13678701, 0.023422396, 0.082123175, 0.006906731, -0.004018426, -0.15813835, 0.13711788, 0.016018609, 0.13443229) * go_1(-1.0, 1.0);\n    result += mat4(-0.06960673, 0.16156524, -0.1374069, -0.05803206, -0.077960715, -0.10676749, 0.26282015, 0.03521529, 0.058099385, -0.014738148, 0.0011174522, 0.24279532, -0.023991548, -0.108812414, -0.08886019, 0.20584475) * go_1(0.0, -1.0);\n    result += mat4(-0.08043308, 0.063343, 0.055290066, -0.15991378, -0.08096304, -0.23888679, 0.019161629, 0.38381267, 0.3672934, -0.119608454, -0.43623593, -0.46014485, -0.5323366, 0.1318621, 0.087373205, -0.05535459) * go_1(0.0, 0.0);\n    result += mat4(0.20640239, -0.1369444, -0.21677823, 0.08202178, 0.10515278, 0.06810837, 0.073207974, 0.23623931, 0.102422275, -0.05016664, -0.0039228587, -0.1810343, -0.2235563, -0.1246854, 0.1428113, -0.10609135) * go_1(0.0, 1.0);\n    result += mat4(-0.031941894, -0.08905056, 0.21501167, 0.11244667, -0.011811734, 0.21630247, 0.07589472, -0.040489636, -0.11824066, -0.11520391, -0.10075633, -0.035642453, 0.062144946, 0.0073282206, 0.14119269, -0.060479023) * go_1(1.0, -1.0);\n    result += mat4(-0.29382935, -0.056808118, 0.051812876, -0.061358813, -0.08344258, 0.124203674, 0.037964176, -0.01961274, -0.000951725, 0.50005037, -0.24176972, 0.06487161, -0.15469861, 0.04336187, 0.17826353, 0.040010225) * go_1(1.0, 0.0);\n    result += mat4(0.02044482, -0.0879271, -0.01053958, -0.31148303, 0.07497373, -0.11548258, -0.1666126, 0.02369657, -0.058044076, 0.010801491, -0.005933901, -0.08910467, 0.007953008, 0.03761974, -0.029501524, 0.16816042) * go_1(1.0, 1.0);\n    result += mat4(0.1779597, -0.10213089, 0.29942423, -0.016642543, -0.015537001, -0.04676146, 0.09585872, -0.0055750017, -0.014361908, -0.20667697, -0.11348746, 0.13081487, -0.10437329, 0.14328459, 0.11648822, -0.09163837) * go_2(-1.0, -1.0);\n    result += mat4(0.019033967, -0.12420627, -0.07748253, 0.43203858, -0.109799065, 0.07605535, 0.060791396, -0.24517195, -0.15674245, 0.21267459, 0.10665515, -0.073150024, -0.1358355, 0.0054066703, -0.16434059, -0.06031853) * go_2(-1.0, 0.0);\n    result += mat4(-0.18834068, 0.26840356, -0.12937617, 0.16103932, -0.0062331813, -0.13630053, -0.013911821, 0.022389365, -0.044232946, -0.056454606, 0.022426741, 0.18010215, 0.041900013, 0.03375041, -0.11376866, -0.010313381) * go_2(-1.0, 1.0);\n    result += mat4(0.12497669, -0.31161824, 0.097568035, 0.19443443, -0.05056519, -0.0031457904, 0.1055554, -0.083650924, 0.07630523, -0.34177595, -0.093093194, 0.20701368, -0.030962149, -0.054470222, -0.23853977, 0.004326528) * go_2(0.0, -1.0);\n    result += mat4(0.34370202, 0.085750066, -0.16071722, -0.54335934, -0.35595295, -0.050744478, -0.17405547, 0.008628697, -0.007086256, 0.23164117, 0.340156, 0.5475976, -0.15292351, 0.28019544, 0.038059216, 0.0044727) * go_2(0.0, 0.0);\n    result += mat4(-0.08231968, -0.0052294536, 0.07451547, 0.22278999, -0.3305531, 0.0017458396, 0.10818422, -0.21325395, -0.08807993, -0.110342845, 0.10082142, -0.051594347, 0.24192205, -0.18042035, -0.0095462985, -0.08757798) * go_2(0.0, 1.0);\n    result += mat4(0.096379586, 0.021887815, -0.05097233, -0.06797989, -0.026171045, 0.022944937, -0.015915364, 0.037667938, 0.17216732, -0.014889412, 0.07343887, 0.028236505, 0.0015047621, 0.1355103, -0.09918284, -0.07673695) * go_2(1.0, -1.0);\n    result += mat4(-0.25385055, 0.15163356, 0.0030003798, 0.18464413, 0.05611221, 0.099498056, -0.07128191, 0.042955168, 0.027493173, 0.07440157, 0.07814497, 0.096160784, 0.13571084, 0.056412842, -0.031997006, -0.16073681) * go_2(1.0, 0.0);\n    result += mat4(-0.21634746, 0.025153082, -0.064477116, 0.0005679147, -0.0029436245, 0.12794618, 0.024849026, 0.03018052, 0.11723976, 0.059955597, -0.013594654, 0.09091745, 0.04775348, 0.21260159, -0.07463213, -0.06727042) * go_2(1.0, 1.0);\n    result += mat4(-0.12166018, 0.024545137, 0.08611618, -0.17627168, 0.09042604, -0.14157623, -0.22147785, 0.09100581, 0.11078359, 0.031410985, -0.17170976, 0.09532806, -0.059569277, 0.09392676, 0.11784347, -0.21471368) * go_3(-1.0, -1.0);\n    result += mat4(0.1483187, -0.2217563, 0.12032977, 0.14932398, 0.27428308, -0.04568031, 0.12670338, 0.09586169, 0.06700745, 0.005126449, 0.0027694793, -0.033667028, 0.06447861, -0.08585174, -0.05509812, -0.11358761) * go_3(-1.0, 0.0);\n    result += mat4(-0.22750492, 0.032906335, -0.029479047, 0.11580199, -0.05812372, -0.032269973, 0.05219915, 0.041658226, 0.010897959, 0.065550454, 0.0076911976, -0.045743827, 0.11614996, -0.10393113, -0.0012606392, -0.034367524) * go_3(-1.0, 1.0);\n    result += mat4(0.09350742, 0.09561609, 0.3735968, 0.031685118, -0.042026598, 0.17006761, -0.3910107, 0.16984761, 0.25679177, 0.036610503, -0.13772772, 0.11101589, -0.1137049, 0.07211461, 0.18065079, -0.12324793) * go_3(0.0, -1.0);\n    result += mat4(-0.020749722, 0.14413361, -0.061903823, -0.21550268, 0.31306142, -0.11532895, 0.029482557, 0.03282164, -0.09800627, -0.20765196, 0.33030233, 0.075725295, 0.49252015, 0.042455837, -0.07264194, -0.10401895) * go_3(0.0, 0.0);\n    result += mat4(-0.22697076, -0.15738785, 0.09740376, -0.072098814, -0.06638972, 0.12336611, 0.0073687397, 0.048267826, 0.06717852, -0.027047804, -0.123397194, 0.17829034, 0.04215185, 0.066311836, -0.061742183, -0.046373066) * go_3(0.0, 1.0);\n    result += mat4(0.041311592, 0.2813485, 0.055084586, -0.01823069, 0.08105147, -0.087944716, -0.10135052, -0.02653456, 0.063169874, -0.1351186, 0.06722432, -0.016406318, 0.08666922, 0.0555909, 0.12086502, -0.17224412) * go_3(1.0, -1.0);\n    result += mat4(0.26026788, -0.18303715, 0.029279215, -0.12858874, 0.027197823, 0.0919464, 0.00849638, 0.10547888, -0.12952055, -0.14414985, 0.1903315, 0.05004528, -0.12657289, 0.038008716, -0.036606666, -0.054025438) * go_3(1.0, 0.0);\n    result += mat4(0.069167465, 0.2699947, -0.11137602, -0.05888806, -0.107324794, -0.07598601, 0.06042177, 0.0064530694, -0.039780665, -0.076666445, -0.00846108, -0.06165907, -0.06978219, -0.19108103, -0.040026028, -0.120319635) * go_3(1.0, 1.0);\n    result += vec4(-0.14375664, -0.0056876075, 0.052177623, 0.07152566);\n    return result;\n}\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(VL)-Conv-4x3x3x16\n//!HOOK MAIN\n//!BIND conv2d_4_tf\n//!BIND conv2d_4_tf1\n//!SAVE conv2d_5_tf\n//!WIDTH conv2d_4_tf.w\n//!HEIGHT conv2d_4_tf.h\n//!COMPONENTS 4\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\n#define go_0(x_off, y_off) (max((conv2d_4_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max((conv2d_4_tf1_texOff(vec2(x_off, y_off))), 0.0))\n#define go_2(x_off, y_off) (max(-(conv2d_4_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_3(x_off, y_off) (max(-(conv2d_4_tf1_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(-0.15667982, -0.31441393, 0.29112124, -0.15737213, 0.022372838, 0.10690639, -0.12019085, -0.051941186, -0.30367845, 0.02612279, 0.2372532, 0.2021648, -0.20481086, -0.003770439, 0.14981231, 0.066780254) * go_0(-1.0, -1.0);\n    result += mat4(0.03270688, -0.42270073, 0.044317324, 0.15907793, 0.14681059, -0.2934784, 0.24933252, -0.067273855, 0.07752533, -0.23194817, 0.0686707, 0.08999225, 0.121678345, -0.12916678, 0.012397381, 0.012315053) * go_0(-1.0, 0.0);\n    result += mat4(-0.10090412, -0.20792678, 0.11076032, -0.02938975, -0.1944187, -0.2003259, 0.04438032, 0.36946484, -0.019868722, -0.15830222, 0.042811528, 0.015641417, 0.113098525, 0.080257006, 0.011135628, -0.2877629) * go_0(-1.0, 1.0);\n    result += mat4(0.15482685, 0.06579119, 0.28301102, 0.23729764, 0.15990537, 0.4529694, 0.107880585, 0.10668121, -0.42430598, -0.2631025, 0.10513542, -0.036242936, -0.09827965, -0.0069260495, -0.11689201, -0.041436482) * go_0(0.0, -1.0);\n    result += mat4(0.08472191, -0.13051608, 0.047930017, 0.36831668, 0.1164478, 0.21384816, 0.22062506, 0.2094167, 0.48668453, 0.32302913, 0.36268055, -0.091801375, -0.079141125, -0.26613805, -0.16608004, 0.03810683) * go_0(0.0, 0.0);\n    result += mat4(-0.13474251, -0.04824603, 0.23303726, -0.116136365, 0.0056330245, 0.15829784, 0.0012259148, 0.12648389, 0.038680512, 0.05131116, 0.024099711, 0.4555406, 0.0035716395, 0.11633299, 0.094744846, -0.2457627) * go_0(0.0, 1.0);\n    result += mat4(-0.0576871, -0.04037522, 0.16857862, 0.0031084458, -0.027274646, -0.18154246, 0.13337846, 0.035422433, -0.0030749738, -0.17288287, 0.019983152, -0.31871706, -0.03280405, 0.06825421, -0.1563798, 0.05031885) * go_0(1.0, -1.0);\n    result += mat4(-0.066631876, 0.012560506, 0.1690693, -0.018248236, 0.0450104, 0.016296914, -0.14910112, -0.16191053, 0.5078224, -0.017615631, 0.15226597, -0.13373777, 0.20148668, 0.060258996, 0.13215344, 0.18430072) * go_0(1.0, 0.0);\n    result += mat4(0.12976126, -0.072738245, 0.053067926, 0.09752956, -0.04716214, 0.04136464, 0.014162617, -0.06621296, -0.09617736, 0.057469178, 0.01280261, -0.042976785, -0.12570308, 0.006027807, 0.031038594, 0.06569918) * go_0(1.0, 1.0);\n    result += mat4(-0.12655424, -0.41563693, -0.030971345, -0.06357555, -0.14121394, -0.15667427, 0.14398985, 0.05995984, 0.0821605, 0.12462943, 0.007492498, -0.0030187522, -0.22804567, -0.10487421, 0.13180672, -0.13978589) * go_1(-1.0, -1.0);\n    result += mat4(-0.075991526, 0.12352044, -0.17844258, 0.010614991, -0.18293494, 0.25009897, -0.080779895, 0.21548378, 0.22215544, 0.048670914, -0.057372037, 0.078176, 0.17490411, 0.004919551, 0.059619516, 0.12660357) * go_1(-1.0, 0.0);\n    result += mat4(-0.06282951, 0.10929357, 0.026720649, -0.15939257, 0.17107709, -0.04334904, -0.03047162, -0.101681694, 0.03118431, 0.19994627, 0.025729552, 0.035035726, -0.0012207883, -0.08618888, 0.061205562, 0.009940555) * go_1(-1.0, 1.0);\n    result += mat4(-0.23581573, 0.08002133, -0.15170844, 0.08872338, -0.25767094, -0.09273545, 0.18153891, 0.2544269, -0.084598936, -0.089766875, -0.14610913, 0.002247754, 0.1802837, -0.019625561, 0.30239686, -0.032793984) * go_1(0.0, -1.0);\n    result += mat4(0.5223286, 0.10347663, 0.4000593, 0.25440502, -0.07646958, -0.31940606, 0.053407036, -0.09356492, 0.2738851, 0.23945184, -0.2907089, -0.45822915, 0.13415676, 0.17187089, 0.08731114, -0.27670014) * go_1(0.0, 0.0);\n    result += mat4(0.059273496, -0.107137166, 0.12087539, 0.179237, -0.021209063, -0.02548005, 0.061256204, 0.033822674, 0.54491127, -0.2475085, 0.08055858, -0.4071213, -0.045093834, 0.07161349, 0.08219979, -0.31735933) * go_1(0.0, 1.0);\n    result += mat4(-0.29527053, 0.021469543, 0.07202354, -0.07103959, 0.03990857, 0.2490762, -0.19419849, -0.13916986, -0.05325315, 0.12922864, -0.041463424, -0.031249814, 0.073991664, -0.09723187, 0.35132217, 0.024760868) * go_1(1.0, -1.0);\n    result += mat4(0.09606787, -0.0951808, -0.0059865676, -0.052033573, -0.3118038, 0.4432636, -0.12943317, 0.09484738, 0.10621756, -0.10550469, 0.11264014, 0.1402276, -0.012679125, -0.08809835, 0.029994955, -0.15121669) * go_1(1.0, 0.0);\n    result += mat4(0.123397775, 0.048338536, -0.00975707, -0.103767075, -0.041053303, -0.07228534, 0.046792876, 0.0668788, 0.29554394, 0.012451002, 0.19568972, 0.112091154, 0.10882395, -0.0995439, 0.051324263, 0.24967718) * go_1(1.0, 1.0);\n    result += mat4(0.2699648, 0.17300771, -0.16056584, 0.1099392, 0.11674778, -0.19811755, 0.111880325, -0.06075038, -0.095849104, -0.04510651, -0.04180761, -0.0052786698, 0.11037549, -0.24115366, 0.018509468, -0.07819484) * go_2(-1.0, -1.0);\n    result += mat4(0.10981622, 0.044488225, 0.050722387, -0.3146652, -0.0013019707, -0.24084032, -0.10475088, 0.026944289, 0.1592903, 0.33087498, 0.061839584, -0.043863457, -0.06904603, -0.08635262, 0.088630445, -0.15485142) * go_2(-1.0, 0.0);\n    result += mat4(-0.06810522, 0.19927117, -0.08130387, 0.11612667, -0.015104349, -7.738651e-05, -0.06419643, -0.14813533, 0.026650215, 0.015038833, 0.08161237, 0.058321163, 0.015005185, -0.16189656, 0.024501886, 0.1927279) * go_2(-1.0, 1.0);\n    result += mat4(0.31858218, 0.11962043, -0.20560326, -0.13190113, 0.02138715, -0.057066392, -0.085771754, -0.124566585, 0.044749223, 0.13687828, 0.1195792, 0.14021616, 0.26204133, 0.05119197, -0.13980037, 0.050747477) * go_2(0.0, -1.0);\n    result += mat4(-0.21238558, -0.0734057, -0.2036023, -0.34308743, -0.29370925, 0.2393742, -0.37877437, 0.036869828, -0.17053255, -0.26900926, -0.23330869, 0.32902205, -0.4882585, 0.27430108, -0.033711653, 0.15501487) * go_2(0.0, 0.0);\n    result += mat4(0.23487025, 0.085289046, -0.14281847, 0.12543266, 0.15871634, -0.13858907, 0.14810285, -0.0239261, 0.1286852, 0.07754033, 0.01072327, -0.14313328, 0.05480442, -0.12195059, 0.11341822, 0.08224607) * go_2(0.0, 1.0);\n    result += mat4(0.19490337, 0.023521842, -0.24548791, 0.0035114093, -0.07937166, -0.07674376, 0.08365873, -0.003286068, 0.023862893, 0.009626835, 0.032829892, 0.0078141205, 0.053484406, -0.08297165, 0.09303188, 0.004273738) * go_2(1.0, -1.0);\n    result += mat4(-0.0032906602, 0.13636959, 0.027821168, 0.06270053, 0.024775786, -0.077529594, 0.03799126, 0.030000908, 0.031749167, 0.04360487, 0.004448846, -0.17835903, -0.30834544, 0.013150946, -0.13758293, -0.03296242) * go_2(1.0, 0.0);\n    result += mat4(-0.14166978, 0.034131095, 0.049779188, 0.09453289, -0.011406557, -0.07020709, -0.0031981543, -0.03443845, -0.00010218944, 0.0855161, -0.10951453, 0.042758763, 0.1718446, -0.1577923, 0.0410027, -0.04992991) * go_2(1.0, 1.0);\n    result += mat4(0.1219178, 0.105126485, -0.041097324, -0.08110963, -0.04857337, -0.11544925, -0.14572923, 0.092435546, 0.091857366, 0.15425235, -0.020324683, -0.05764375, -0.020458939, -0.10527823, -0.085554086, 0.16358297) * go_3(-1.0, -1.0);\n    result += mat4(-0.12372687, -0.009976829, 0.14252265, -0.1321053, -0.05965866, -0.1393898, -0.017603246, -0.02714342, -0.16824952, -0.23083204, -0.012299022, -0.06689838, -0.015830487, 0.21299921, -0.11637202, 0.0074968333) * go_3(-1.0, 0.0);\n    result += mat4(-0.01979935, -0.182785, -0.015397454, 0.14175794, -0.011465284, 0.11285164, -0.036115747, 0.07150463, -0.083641894, -0.10221778, -0.13871445, 0.099696055, 0.04603662, -0.06463785, -0.007984529, -0.0032940735) * go_3(-1.0, 1.0);\n    result += mat4(0.072830334, -0.057334073, 0.09086239, 0.13039105, 0.06350303, 0.17130788, -0.2181585, -0.09137403, -0.31397742, -0.019071499, -0.017274613, 0.13762084, 0.10195637, -0.021455176, 0.04011394, -0.08029658) * go_3(0.0, -1.0);\n    result += mat4(-0.26982597, -0.40265098, -0.4151411, 0.038557775, -0.095602125, 0.3503172, -0.029988842, -0.03484708, 0.095536314, -0.0030311556, 0.31589827, 0.52763534, -0.12629713, -0.24356791, 0.0059487303, 0.42298427) * go_3(0.0, 0.0);\n    result += mat4(0.054166105, 0.18827972, -0.081673265, -0.06720384, 0.09375001, 0.22173035, -0.14050071, 0.108400136, -0.15553835, -0.08716729, -0.037366748, 0.10971073, -0.02560103, -0.26702073, -0.05201882, 0.2432563) * go_3(0.0, 1.0);\n    result += mat4(0.16196893, 0.0889265, -0.09887943, -0.042956755, -0.054403376, -0.123823255, 0.045847844, 0.017027669, 0.00539936, -0.112265736, 0.050549984, -0.104931094, -0.06883012, -0.25745714, 0.11155538, -0.15363649) * go_3(1.0, -1.0);\n    result += mat4(-0.22157209, 0.18200903, -0.13290548, 0.026721261, -0.06066069, -0.18150693, 0.08768983, 0.037362453, -0.1073367, -0.070236765, -0.41223463, -0.168915, -0.15517351, -0.13949952, -0.13307643, -0.15935421) * go_3(1.0, 0.0);\n    result += mat4(-0.026589906, 0.0930502, 0.05195435, 0.06301585, -0.01107014, -0.019382332, 0.027223695, -0.004045145, -0.15238355, -0.0345132, 0.06355168, 0.0011230056, 0.16690113, 0.0017829507, -0.0023939044, -0.09471834) * go_3(1.0, 1.0);\n    result += vec4(0.024455175, 0.01669877, -0.066231176, 0.036848705);\n    return result;\n}\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(VL)-Conv-4x3x3x16\n//!HOOK MAIN\n//!BIND conv2d_4_tf\n//!BIND conv2d_4_tf1\n//!SAVE conv2d_5_tf1\n//!WIDTH conv2d_4_tf.w\n//!HEIGHT conv2d_4_tf.h\n//!COMPONENTS 4\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\n#define go_0(x_off, y_off) (max((conv2d_4_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max((conv2d_4_tf1_texOff(vec2(x_off, y_off))), 0.0))\n#define go_2(x_off, y_off) (max(-(conv2d_4_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_3(x_off, y_off) (max(-(conv2d_4_tf1_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(0.01763509, -0.17156707, -0.06841296, -0.026132878, -0.10600523, 0.11245994, 0.121395074, -0.09331501, 0.12764473, 0.0428028, -0.11837395, 0.2092563, -0.04357652, -0.0490096, 0.024701532, 0.10518723) * go_0(-1.0, -1.0);\n    result += mat4(-0.17130826, -0.31987694, -0.07639005, 0.21362033, 0.058639023, 0.066175915, -0.25344703, -0.07923442, -0.14766373, 0.040518284, -0.031103026, -0.040075514, -0.051108997, -0.28214613, -0.18504949, 0.27544948) * go_0(-1.0, 0.0);\n    result += mat4(0.030991005, -0.011353306, 0.15237464, 0.15458584, 0.1250524, 0.19959912, 0.14049476, 0.38410887, 0.07378578, -0.017728366, 0.0963528, -0.043756213, -0.039577194, -0.11800575, -0.08392266, -0.07599512) * go_0(-1.0, 1.0);\n    result += mat4(0.022089608, -0.027317125, 0.051330008, -0.0075439885, 0.021650828, -0.0009390209, -0.12043464, 0.049332134, -0.055557396, -0.053297505, -0.0918705, -0.13089466, -0.10994107, 0.072746456, 0.11496739, -0.05225977) * go_0(0.0, -1.0);\n    result += mat4(0.29730305, 0.26317745, 0.052159555, -0.32006654, 0.48288685, -0.049926184, -0.08091092, -0.13825637, -0.1485706, -0.288657, -0.41443697, 0.06856032, -0.23809211, -0.12953928, 0.4783034, -0.47557938) * go_0(0.0, 0.0);\n    result += mat4(0.026139118, -0.23031352, 0.04861487, 0.033556074, 0.2702056, 0.22802536, -0.15385233, 0.1664119, 0.18749923, 0.36927548, -0.011473684, -0.11771165, -0.16859052, -0.4513202, 0.12863952, 0.02482837) * go_0(0.0, 1.0);\n    result += mat4(0.0073229345, -0.061915245, 0.06710329, 0.0062416573, -0.00555983, 0.14592186, 0.11201052, -0.123630054, 0.32611257, -0.11279885, -0.059449438, 0.2891043, -0.10519016, 0.040108994, -0.012468261, 0.02083298) * go_0(1.0, -1.0);\n    result += mat4(-0.057483062, 0.08454755, -0.15529329, -0.12572923, 0.2600099, -0.02319978, -0.04037675, 0.11496361, 0.07728194, -0.12908956, -0.025529336, 0.112581626, 0.02971823, 0.11659056, -0.01298622, 0.017061908) * go_0(1.0, 0.0);\n    result += mat4(0.22417091, -0.00222947, 0.04980858, 0.12260437, -0.025507605, 0.042577885, 0.120813504, -0.048522256, -0.038494784, -0.0072195013, -0.23012944, -0.020850847, -0.078296244, -0.014830018, 0.19759563, -0.10000253) * go_0(1.0, 1.0);\n    result += mat4(-0.032090195, 0.023757193, -0.08989734, 0.14419042, 0.0112194475, -0.093776144, -0.020197887, 0.29295877, 0.06872183, 0.09511462, -0.03245769, -0.06504889, 0.05132126, 0.00399527, 0.075911656, 0.250893) * go_1(-1.0, -1.0);\n    result += mat4(-0.3418496, 0.25525784, 0.0018161442, 0.028484365, -0.17573346, -0.12457501, 0.18466166, 0.20209278, 0.10282706, 0.16353399, 0.025052028, -0.059714165, -0.055806916, -0.28651386, 0.112798095, 0.11624314) * go_1(-1.0, 0.0);\n    result += mat4(-0.018793896, 0.07500149, -0.01728254, -0.1726998, -0.13333, 0.09590344, -0.036537904, -0.11522523, 0.19445558, 0.22680458, 0.12061006, -0.06225618, 0.1127748, 0.28380096, -0.07099846, -0.007440302) * go_1(-1.0, 1.0);\n    result += mat4(-0.43887648, -0.10018577, -0.29267642, 0.12149727, -0.14333835, 0.04161915, 0.19442867, 0.16506511, 0.09655387, -0.0014398015, 0.13189743, -0.14068556, 0.049408, 0.0829072, 0.2950336, 0.36965907) * go_1(0.0, -1.0);\n    result += mat4(0.41486958, -0.023498302, -0.37900022, -0.31752598, 0.13758768, -0.18782206, -0.31358528, 0.3330786, -0.4039293, -0.06539036, 0.032599606, 0.10663507, -0.26369813, -0.17365438, 0.20723309, 0.1801556) * go_1(0.0, 0.0);\n    result += mat4(0.004117444, -0.14894462, 0.14915143, -0.047375835, -0.2609916, -0.10172324, -0.14925237, -0.33830285, 0.12131607, -0.18156646, -0.42382464, -0.052582145, 0.2329045, -0.4576963, 0.13756892, 0.055571318) * go_1(0.0, 1.0);\n    result += mat4(-0.31689477, 0.017058033, -0.01904924, -0.016893756, -0.011479519, 0.07316262, -0.07086077, 0.08923511, -0.08190091, -0.025866933, -0.06909204, -0.028601022, 0.023224542, 0.03082087, 0.2230426, -0.16713654) * go_1(1.0, -1.0);\n    result += mat4(0.13457374, 0.110913865, -0.1130815, -0.031438913, -0.55201167, 0.04831016, 0.25107765, -0.014003224, 0.19532952, 0.02062346, 0.04839241, 0.088673405, 0.30325848, -0.20222804, -0.085780576, 0.22512968) * go_1(1.0, 0.0);\n    result += mat4(0.076354, 0.021940092, -0.16170324, 0.0025543426, -0.0032400405, -0.0046705627, 0.06241069, -0.031247333, 0.098353796, 0.03723474, 0.22971998, -0.017877292, 0.119858086, 0.008041448, 0.2140585, 0.10343376) * go_1(1.0, 1.0);\n    result += mat4(0.08627595, 0.04532834, 0.027579082, -0.16222088, 0.15583228, -0.14371829, -0.07243855, -0.111895435, -0.14438897, -0.10250594, 0.0034202964, -0.066547595, -0.034390844, -0.021545287, 0.014540157, -0.10215731) * go_2(-1.0, -1.0);\n    result += mat4(0.19720152, 0.21534947, 0.1130938, -0.011730973, 0.013247983, -0.10344174, -0.1906514, -0.015767017, -0.020093633, -0.26487067, -0.005960781, -0.057149183, 0.030110173, 0.047692046, -0.19308545, -0.25292158) * go_2(-1.0, 0.0);\n    result += mat4(0.039498243, 0.053682897, -0.01844695, -0.017540915, 0.039454967, -0.27696076, 0.09503274, -0.038958035, 0.17321438, -0.036311295, 0.03123055, 0.02310311, 0.040591653, 0.0054627894, -0.03520426, -0.026101988) * go_2(-1.0, 1.0);\n    result += mat4(0.055991564, 0.06512919, -0.12532505, 0.024075158, -0.04926237, -0.11701171, 0.026792146, 0.013033238, -0.052847516, -0.01550091, -0.008442071, -0.077945165, -0.033220004, -0.13678443, -0.07040586, 0.121846326) * go_2(0.0, -1.0);\n    result += mat4(-0.19537796, -0.016634773, 0.10707109, -0.024361614, -0.16002733, -0.44066608, 0.16488662, 0.013152995, 0.22407806, 0.12854017, 0.19028598, -0.08379244, -0.05594235, -0.15909895, 0.511962, 0.39027596) * go_2(0.0, 0.0);\n    result += mat4(-0.032652248, 0.06004893, 0.011166194, 0.102761306, -0.035113614, -0.29961765, -0.013817978, 0.20938557, 0.08488225, -0.1118558, -0.0375328, -0.035511103, 0.0046933405, 0.20203683, -0.13552529, -0.12685429) * go_2(0.0, 1.0);\n    result += mat4(0.03054923, 0.08224908, -0.059128158, -0.02583655, -0.02133876, 0.0048713544, 0.10848829, 0.06324404, 0.028332822, -0.011002306, -0.027557913, -0.06072362, 0.1019048, -0.02587316, 0.08563405, -0.08119947) * go_2(1.0, -1.0);\n    result += mat4(-0.10568117, 0.1075248, 0.19379964, -0.14337265, 0.019374132, -0.0907804, -0.13827625, -0.03628561, 0.014735499, -0.026882607, -0.25948793, 0.034926686, -0.05988073, -0.22735636, 0.053511668, 0.04765336) * go_2(1.0, 0.0);\n    result += mat4(-0.029848114, 0.09183966, 0.084713496, 0.09422864, 0.069713995, -0.10584984, -0.020899031, 0.059645247, -0.075805016, -0.01828552, 0.06689195, -0.13804196, -0.023465823, -0.034038994, -0.12946706, 0.058709413) * go_2(1.0, 1.0);\n    result += mat4(0.061918218, 0.038984764, 0.013660938, -0.19340219, -0.014949839, 0.12946278, 0.12725051, 0.13429146, 0.05993008, -0.015394284, 0.011232483, 0.0344157, 0.022161875, -0.023923954, 0.061736204, 0.025963215) * go_3(-1.0, -1.0);\n    result += mat4(0.048136763, 0.03162042, -0.01967249, 0.06374493, 0.034645267, 0.22403605, 0.036197048, -0.06903216, -0.1024706, -0.0005459356, 0.049185563, 0.16309108, 0.07394778, 0.10351343, 0.28430694, -0.13531347) * go_3(-1.0, 0.0);\n    result += mat4(-0.14705071, -0.09458433, 0.03063114, 0.07901115, -0.11911086, -0.06428132, -0.013549552, -0.041342866, -0.20770676, -0.15104479, 0.054365363, -0.11652907, 0.05639815, 0.070518605, 0.0017846811, -0.00056205114) * go_3(-1.0, 1.0);\n    result += mat4(0.27148908, 0.07358356, 0.13644488, -0.13824654, 0.0112991175, -0.021521023, -0.10197379, 0.007816017, -0.13314332, 0.12318473, -0.043214846, -0.15759036, -0.19744353, -0.10267182, -0.28249928, 0.11233295) * go_3(0.0, -1.0);\n    result += mat4(-0.096474804, 0.17893109, 0.014679829, -0.21218887, -0.24170275, 0.10603527, 0.05375366, -0.059315052, 0.17087384, 0.13633691, -0.37958893, 0.43264794, 0.17829923, 0.06485103, -0.37551817, -0.22082718) * go_3(0.0, 0.0);\n    result += mat4(-0.30536333, -0.033212308, -0.25232, 0.11730442, -0.11176368, 0.26223183, -0.049025323, -0.01375941, -0.29028055, 0.16842811, -0.035684332, -0.4180911, -0.1611732, 0.07683385, -0.14263596, 0.17508087) * go_3(0.0, 1.0);\n    result += mat4(0.23580009, 0.025621435, -0.15757325, 0.008123166, -0.021905439, -0.02162503, -0.059497356, -0.01636353, 0.047654126, -0.084423855, -0.033733923, 0.0127116265, -0.059593942, -0.053935718, -0.050729543, 0.013887048) * go_3(1.0, -1.0);\n    result += mat4(-0.19232626, 0.07915767, -0.05909752, 0.007695347, 0.058876406, 0.057521783, -0.080253534, 0.2011056, -0.27965516, -0.08033169, -0.13025513, 0.12854645, 0.053400308, -0.18445957, -0.18463044, 0.27920377) * go_3(1.0, 0.0);\n    result += mat4(-0.061806213, -0.020037206, 0.003183183, -0.029844081, -0.039553937, 0.028905323, -0.11367984, -0.097321615, -0.10112643, 0.0039709485, -0.06020118, -0.23871279, -0.077974856, 0.05806996, -0.21440302, 0.11898043) * go_3(1.0, 1.0);\n    result += vec4(-0.023832673, 0.03702965, -0.04749135, -0.10982549);\n    return result;\n}\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(VL)-Conv-4x3x3x16\n//!HOOK MAIN\n//!BIND conv2d_5_tf\n//!BIND conv2d_5_tf1\n//!SAVE conv2d_6_tf\n//!WIDTH conv2d_5_tf.w\n//!HEIGHT conv2d_5_tf.h\n//!COMPONENTS 4\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\n#define go_0(x_off, y_off) (max((conv2d_5_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max((conv2d_5_tf1_texOff(vec2(x_off, y_off))), 0.0))\n#define go_2(x_off, y_off) (max(-(conv2d_5_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_3(x_off, y_off) (max(-(conv2d_5_tf1_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(0.030931145, 0.013683292, -0.0650242, -0.028732346, 0.120067924, -0.029404473, 0.0038229884, -0.14631765, 0.041900825, -0.076596744, -0.11096378, -0.27100095, 0.0052598766, -0.05929686, -0.06816563, -0.086864315) * go_0(-1.0, -1.0);\n    result += mat4(-0.043620087, -0.16360405, 0.006527374, 0.15706524, 0.08338088, -0.19027525, 0.22595987, -0.054963548, 0.01825031, -0.03149212, 0.025471251, 0.06429379, -0.011633275, -0.079389006, -0.0030728737, 0.17345747) * go_0(-1.0, 0.0);\n    result += mat4(-0.011275288, -0.10668036, 0.05718997, 0.010336089, 0.33393976, -0.2029354, 0.075444475, -0.092244044, 0.07605498, 0.20125951, 0.10493973, -0.12306946, 0.03658231, 0.08233366, -0.12205888, -0.116969004) * go_0(-1.0, 1.0);\n    result += mat4(-0.0070305974, 0.105127215, 0.006041873, 0.26743913, 0.028119443, 0.14823505, -0.28344348, 0.12362866, -0.1215781, 0.08104382, 0.102011785, 0.085380934, 0.061244503, -0.06230063, -0.05353345, 0.1166729) * go_0(0.0, -1.0);\n    result += mat4(0.08945733, 0.4101902, -0.06404005, 0.040728435, 0.13076581, -0.20805469, -0.10897316, -0.14924604, 0.10090762, 0.015475414, 0.26346552, 0.12096677, -0.20199244, 0.2780031, 0.18515368, 0.35105625) * go_0(0.0, 0.0);\n    result += mat4(0.07463155, 0.26932517, -0.06768551, 0.10470878, -0.1423996, 0.013550665, -0.06167201, -0.1022994, -0.3107166, -0.15609552, 0.1695213, -0.1277181, 0.12582655, -0.1596128, 0.015612055, -0.19826376) * go_0(0.0, 1.0);\n    result += mat4(0.011745468, 0.006471601, 0.008110513, 0.025831396, 0.1272883, -0.221959, 0.11993834, -0.007903633, 0.009993582, -0.10170755, 0.026594637, -0.027883623, 0.030666083, -0.036415886, 0.007469573, 0.0674783) * go_0(1.0, -1.0);\n    result += mat4(-0.022760388, -0.10911659, -0.012589904, -0.046462692, 0.36987287, 0.71668935, -0.04466556, 0.12082762, 0.0026539841, 0.07070946, -0.00020439121, -0.13925348, 0.08672072, 0.20075354, -0.066352285, 0.14655356) * go_0(1.0, 0.0);\n    result += mat4(-0.081081845, -0.21956222, 0.06781787, -0.106362104, -0.03016425, -0.010460211, -0.009725996, -0.009805538, 0.07037355, 0.19254607, 0.038890257, 0.29580075, -0.10355764, 0.12613009, 0.02485986, -0.031927988) * go_0(1.0, 1.0);\n    result += mat4(-0.13882205, 0.21770848, 0.015392157, 0.010310204, 0.008225721, 0.07457836, 0.09984027, -0.25452816, 0.2193511, -0.22262146, -0.12950355, 0.026151875, 0.022114651, -0.030566849, 0.034688126, 0.03047327) * go_1(-1.0, -1.0);\n    result += mat4(0.0363441, 0.19290726, -0.1143055, 0.30871987, -0.05780708, 0.082128406, -0.115280904, 0.07636388, 0.48947453, -0.29715258, 0.146737, -0.3275992, -0.055972476, -0.09991753, 0.17435446, 0.10917291) * go_1(-1.0, 0.0);\n    result += mat4(0.026389305, 0.054523308, -0.028950177, 0.06913328, -0.18626037, 0.08829993, 0.10407121, 0.001246911, 0.103938825, -0.3117343, -0.045564886, 0.07316613, 0.0027089121, 0.099437356, -0.046500806, -0.0927284) * go_1(-1.0, 1.0);\n    result += mat4(0.051037624, -0.2068234, 0.061572235, -0.3345198, 0.16960172, -0.30289862, -0.002583443, 0.39312238, 0.08246557, 0.16374862, -0.31902805, -0.13205275, -0.032050006, 0.01670186, 0.13852347, 0.120012194) * go_1(0.0, -1.0);\n    result += mat4(-0.67096996, -0.06274476, 0.18575665, 0.80282855, 0.23201196, -0.0054729837, 0.050396994, -0.42014772, 0.34904522, 0.26281372, 0.24697208, 0.55475426, 0.49850988, -0.06581312, -0.0068906257, -0.15741143) * go_1(0.0, 0.0);\n    result += mat4(-0.04252036, -0.28224963, 0.009723064, 0.116357096, 0.2992567, -0.26702902, -0.05648925, 0.12729199, -0.37574205, 0.54211813, -0.25248805, -0.13023548, 0.18903324, -0.5182459, 0.0141203115, -0.19444294) * go_1(0.0, 1.0);\n    result += mat4(-0.0017735233, -0.010132458, -0.040924776, -0.13767008, 0.20757031, -0.06509882, -0.09756446, 0.018974079, 0.090851985, -0.010158765, -0.03999607, -0.12055641, 0.03629025, -0.018645551, -0.05506811, -0.014202848) * go_1(1.0, -1.0);\n    result += mat4(0.16203491, 0.011118734, -0.18486023, -0.024290733, -0.3673846, -0.20295864, 0.23055002, -0.1555852, -0.02706522, 0.03262891, 0.008724611, -0.03760652, -0.20946771, -0.01951837, 0.16955496, 0.11690098) * go_1(1.0, 0.0);\n    result += mat4(0.0783421, 0.22656651, -0.15715368, -0.024174158, 0.020260733, 0.032390315, -0.029133298, 0.086601086, 0.13871798, -0.12525433, 0.16097449, 0.058946393, 0.029865682, 0.08508385, 0.040569812, -0.09402932) * go_1(1.0, 1.0);\n    result += mat4(-0.05063873, 0.11269313, -0.057484943, -0.13579641, 0.047973365, -0.07103839, -0.07838756, -0.0028928046, -0.019466015, 0.018428024, 0.010016324, -0.057396665, -0.19495595, 0.034307264, -0.022888038, 0.08112259) * go_2(-1.0, -1.0);\n    result += mat4(-0.09790086, 0.10613111, 0.06611674, 0.19356097, -0.00073371036, -0.019078335, 0.076719105, -0.016212497, -0.3283475, -0.07547389, -0.08140701, 0.3185625, -0.25060275, 0.16820994, -0.123497784, 0.43272668) * go_2(-1.0, 0.0);\n    result += mat4(-0.06365342, 0.11186735, -0.17493224, -0.04207358, 0.0003117533, 0.034089327, -3.067692e-05, -0.03422754, 0.16267666, 0.054771993, 0.048384454, -0.041866794, 0.0036008756, 0.0021496525, 0.20258942, -0.06297619) * go_2(-1.0, 1.0);\n    result += mat4(0.03578836, 0.08763908, -0.22370125, -0.32465744, 0.019142643, 0.011316954, 0.17920344, 0.031633645, 0.03766343, -0.116487674, -0.05281752, -0.018965483, 0.049297336, -0.34511214, 0.42598158, 0.051361635) * go_2(0.0, -1.0);\n    result += mat4(0.26638633, -0.33628765, 0.04437907, 0.09616201, -0.020049393, 0.2560829, -0.027108455, 0.255752, 0.3666511, 0.052277412, -0.46667686, 0.48482272, 0.51302284, -0.06941614, -0.17967525, -0.07889891) * go_2(0.0, 0.0);\n    result += mat4(0.18503937, 0.088710256, 0.2083147, -0.20758459, -0.036416974, 0.018303726, 0.03729963, -0.035969947, -0.2685231, -0.42169708, -0.039593916, -0.02642618, 0.29050872, -0.25723743, -0.111259766, 0.15001127) * go_2(0.0, 1.0);\n    result += mat4(-0.026473878, -0.07241443, 0.022400148, -0.03214132, 0.0859297, -0.0036677981, -0.07039137, 0.03703108, 0.042322673, -0.01222808, -0.08151938, 0.033109214, -0.048737407, 0.25929528, -0.40535828, -0.123594694) * go_2(1.0, -1.0);\n    result += mat4(0.10233285, 0.22455986, -0.13368733, 0.033236265, -0.052114893, -0.11709317, 0.009709581, 0.19201641, -0.02973698, 0.032114245, -0.09771862, 0.085680574, 0.15827927, -0.15042172, 0.21833214, -0.13262676) * go_2(1.0, 0.0);\n    result += mat4(-0.08460587, -0.09473209, 0.019323658, -0.057233352, 0.0019434267, -0.14437936, 0.034232683, 0.0030602294, -0.023598112, 0.10692026, -0.09960999, 0.005887181, 0.014738836, -0.32473162, -0.10886747, -0.08365826) * go_2(1.0, 1.0);\n    result += mat4(0.10900178, 0.00080280803, -0.14009437, -0.053074867, -0.07811151, -0.03456029, -0.104943685, 0.016918905, -0.11335709, 0.079421654, 0.13481963, 0.037818357, -0.027339859, 0.05856774, -0.044562265, 0.03908084) * go_3(-1.0, -1.0);\n    result += mat4(0.07628258, -0.23815769, 0.2840278, -0.3541637, -0.044292126, -0.09310441, -0.1335055, -0.031899665, -0.11981227, 0.24012394, -0.041896038, -0.10168982, 0.20248915, -0.10036763, -0.044115108, 0.08520525) * go_3(-1.0, 0.0);\n    result += mat4(0.07234102, -0.119480744, -0.01401321, -0.025182616, -0.031284854, -0.050089385, 0.014808948, 0.038662236, -0.18539418, 0.017342187, 0.023812262, 0.13428104, 0.020824855, -0.07433546, 0.054307282, 0.08511016) * go_3(-1.0, 1.0);\n    result += mat4(-0.11046813, -0.04663274, 0.33497185, 0.023273284, -0.24681108, 0.116665915, 0.12045893, 0.13306482, -0.039098527, 0.04747061, 0.042796664, 0.053514794, 0.011861975, -0.048702, 0.008408589, -0.09497112) * go_3(0.0, -1.0);\n    result += mat4(0.34634927, 0.37973458, -0.79267627, -0.7362719, 0.35489878, -0.07635863, 0.24082923, -0.27480397, -0.3236968, -0.25523046, 0.05118527, -0.040529836, -0.6000509, 0.39020586, 0.27632973, 0.5141453) * go_3(0.0, 0.0);\n    result += mat4(0.16761221, -0.033125393, 0.00561569, 0.083019435, -0.101278506, 0.07810264, 0.12060661, 0.16048536, 0.14257826, -0.15996903, 0.018831912, -0.094429865, -0.22227801, 0.426937, -0.054677445, 0.05067348) * go_3(0.0, 1.0);\n    result += mat4(0.02233958, 0.02608942, -0.045318656, 0.06509929, 0.035911568, 0.025316885, 0.0840986, 0.08326237, 0.048455603, -0.13630742, 0.07230253, -0.047261715, -0.092630014, 0.04786565, 0.10354939, -0.07094341) * go_3(1.0, -1.0);\n    result += mat4(-0.1463382, -0.14900577, 0.2835977, -0.106733374, -0.11554754, -0.168429, -0.1411373, -0.20654152, -0.06388508, 0.039648015, 0.08543832, -0.13253337, 0.017264463, -0.06346233, -0.10823598, 0.067361064) * go_3(1.0, 0.0);\n    result += mat4(0.04419582, 0.039152585, 0.06222691, 0.05757103, 0.012084537, 0.051425997, -0.061130576, 0.16752882, 0.07497411, 0.13495837, -0.15585983, -0.02050144, -0.08555421, -0.09147339, 0.025115604, 0.05948922) * go_3(1.0, 1.0);\n    result += vec4(0.00590038, 0.03082865, 0.002111702, -0.03330112);\n    return result;\n}\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(VL)-Conv-4x3x3x16\n//!HOOK MAIN\n//!BIND conv2d_5_tf\n//!BIND conv2d_5_tf1\n//!SAVE conv2d_6_tf1\n//!WIDTH conv2d_5_tf.w\n//!HEIGHT conv2d_5_tf.h\n//!COMPONENTS 4\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\n#define go_0(x_off, y_off) (max((conv2d_5_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_1(x_off, y_off) (max((conv2d_5_tf1_texOff(vec2(x_off, y_off))), 0.0))\n#define go_2(x_off, y_off) (max(-(conv2d_5_tf_texOff(vec2(x_off, y_off))), 0.0))\n#define go_3(x_off, y_off) (max(-(conv2d_5_tf1_texOff(vec2(x_off, y_off))), 0.0))\nvec4 hook() {\n    vec4 result = mat4(0.009029573, 0.029218858, 0.029705316, -0.019268971, -0.0023235187, -0.072589695, 0.1424836, 0.09049359, 0.04342995, 0.18134294, 0.018145641, 0.14789368, 0.050923645, 0.06524081, 0.036812488, 0.11108108) * go_0(-1.0, -1.0);\n    result += mat4(-0.026506428, 0.016968496, 0.015961196, 0.010030791, -0.3141888, -0.06769598, -0.23920257, -0.031002127, -0.07351358, -0.19290134, -0.24282931, -0.18831016, -0.0928966, 0.075177215, -0.19699521, -0.05810917) * go_0(-1.0, 0.0);\n    result += mat4(-0.017991852, -0.079427645, 0.035970494, -0.017095685, -0.27197137, -0.20046075, 0.2616644, 0.021876303, -0.077394076, -0.04978692, 0.20363241, -0.013741705, -0.032103598, 0.14403099, 0.01442474, 0.048115995) * go_0(-1.0, 1.0);\n    result += mat4(-0.16939245, -0.001777, 0.026244136, -0.14122388, -0.056853324, 0.54357284, -0.19769607, -0.03187079, 0.04559263, -0.16048127, 0.12830622, 0.1442168, 0.006611398, -0.01618195, 0.012860053, -0.16539487) * go_0(0.0, -1.0);\n    result += mat4(0.13116026, -0.006161343, 0.7209969, 0.18338475, 0.3099777, 0.6500026, 0.3883795, -0.021434233, 0.31667513, 0.008917659, 0.14124091, -0.22335114, 0.12198921, -0.16449445, 0.08773425, 0.30054978) * go_0(0.0, 0.0);\n    result += mat4(-0.10413989, -0.10316161, 0.04342709, -0.021252686, 0.120892406, 0.37798002, -0.35963747, 0.021069285, 0.37587845, -0.08159587, 0.011139747, 0.2501104, -0.094568014, 0.037900843, -0.025109999, -0.030106556) * go_0(0.0, 1.0);\n    result += mat4(0.09680291, -0.040868275, 0.051731605, 0.089064725, -0.56098557, -0.38148618, -0.017037416, 0.08508287, -0.019247344, 0.019857002, -0.03512887, 0.031057188, -0.09648583, -0.04474188, 0.028748507, -0.11880965) * go_0(1.0, -1.0);\n    result += mat4(-0.010236943, 0.04257042, -0.08202597, -0.004203426, -0.26801527, -0.11716526, -0.017402772, -0.05819106, -0.13394608, 0.0234606, -0.15404865, -0.06801164, -0.0047627664, -0.1975249, 0.09420144, 0.23249897) * go_0(1.0, 0.0);\n    result += mat4(0.107361935, 0.07373787, 0.06242962, 0.05236332, -0.028867323, 0.025924044, -0.042526353, -0.0015729597, -0.1323144, -0.4040712, 0.023919407, -0.09535502, 0.049100045, 0.081110805, 0.08946112, 0.058505684) * go_0(1.0, 1.0);\n    result += mat4(0.13236825, -0.04468476, -0.04426802, 0.031087106, -0.09093992, -0.07470971, -0.01591504, 0.05924266, -0.21910913, 0.065537, -0.18358919, -0.02533145, -0.1512009, -0.04953928, 0.015540006, -0.0043442883) * go_1(-1.0, -1.0);\n    result += mat4(-0.14016777, -0.1086958, 0.16316028, 0.050777458, 0.23148167, 0.04944809, -0.10599886, -0.10447021, -0.40729257, -0.10926556, 0.069055155, 0.110635415, 0.108922414, -0.1716362, 0.10743909, -0.102534756) * go_1(-1.0, 0.0);\n    result += mat4(0.017795928, -0.066930935, 0.09396082, 0.092585504, 0.14223933, 0.059458215, 0.072033696, -0.04507726, -0.19956456, 0.1251282, -0.31733638, -0.10465904, 0.08546377, 0.048638333, 0.031372465, -0.08720661) * go_1(-1.0, 1.0);\n    result += mat4(0.108719654, -0.092161916, -0.014724377, 0.20068261, -0.24350016, 0.2113636, -0.07483714, -0.45665312, -0.25134233, 0.2753893, -0.11324696, -0.04472, 0.1576102, -0.045395147, 0.06013951, -0.12507361) * go_1(0.0, -1.0);\n    result += mat4(0.546225, -0.281897, 0.19477816, -0.116612464, -0.3145171, -0.41660902, 0.333625, 0.35902345, 0.48333502, 0.4662005, 0.10222491, -0.15314859, -0.3036888, 0.22849742, 0.20740797, 0.41399437) * go_1(0.0, 0.0);\n    result += mat4(0.007284074, 0.0393942, -0.31192186, -0.15687793, -0.289214, -0.015956698, -0.24718472, -0.1637855, -0.00765037, 0.26677555, 0.20215511, 0.37790874, -0.22096673, 0.25287116, -0.2446764, -0.13610223) * go_1(0.0, 1.0);\n    result += mat4(-0.16734968, 0.16721225, -0.053508647, -0.041097626, 0.062356673, 0.07812319, -0.263546, -0.39739034, 0.003389846, 0.12676363, -0.13175991, -0.19019242, -0.011847587, -0.007580052, -0.023946386, 0.046034034) * go_1(1.0, -1.0);\n    result += mat4(-0.17047611, 0.13298693, -0.07506747, -0.045542978, 0.33571973, 0.20192616, 0.30674616, 0.25668672, -0.24134545, 0.031693842, -0.009647641, 0.040534843, 0.03159419, -0.1100516, 0.11371316, 0.06098735) * go_1(1.0, 0.0);\n    result += mat4(-0.05518961, 0.19402988, -0.09646874, -0.059196774, -0.0073436056, -0.1381309, 0.06868669, 0.061328378, -0.1480867, -0.15774113, -0.022572191, 0.122521356, -0.04067007, -0.10145177, 0.13006335, -0.099452734) * go_1(1.0, 1.0);\n    result += mat4(0.06962972, 0.07768411, 0.021085173, 0.108355984, -0.03132525, 0.10220273, -0.11626593, -0.14104277, 0.018778645, -0.024237925, 0.048783034, 0.09074447, 0.4120426, -0.01948466, 0.073218934, 0.055681944) * go_2(-1.0, -1.0);\n    result += mat4(-0.22553118, -0.12923603, -0.22068842, -0.35037905, 0.005709937, -0.09528472, 0.08718399, 0.13200706, 0.17220478, 0.096844435, -0.30439013, -0.14122063, 0.15733318, -0.1014675, 0.33836862, 0.042193163) * go_2(-1.0, 0.0);\n    result += mat4(0.15826897, -0.034870047, 0.09295099, -0.17674965, -0.042326324, 0.06680338, -0.074267656, -0.0631393, -0.11267909, -0.19795708, 0.22005288, 0.35703793, 0.033995766, -0.12663686, -0.02449896, -0.123250045) * go_2(-1.0, 1.0);\n    result += mat4(0.021434195, 0.058398597, 0.04828315, -0.0016824572, -0.04291545, -0.0744907, -0.07698706, -0.15937585, -0.18852457, -0.17966963, 0.023800725, 0.025979731, -0.51412296, -0.018316887, -0.23076254, -0.12298674) * go_2(0.0, -1.0);\n    result += mat4(0.16054317, -0.0002730893, -0.54173076, -0.62443435, 0.04300197, -0.08529622, 0.15392275, 0.15742144, 0.025834514, -0.2800517, -0.17600477, 0.0020806703, -0.3010582, 0.45233512, 0.25595665, 0.103661336) * go_2(0.0, 0.0);\n    result += mat4(-0.024034392, -0.43800178, 0.28606912, -0.20908915, 0.078471914, -0.030501373, -0.059055753, 0.050494444, 0.063274644, -0.025071034, 0.17561312, -0.100698635, -0.25631955, 0.039981876, -0.18506624, 0.08366402) * go_2(0.0, 1.0);\n    result += mat4(-0.1413656, 0.03589635, -0.020917566, 0.017598262, 0.020156413, -0.018854238, 0.027228508, -0.03806087, -0.021715842, 0.071974196, -0.040065665, 0.08459291, -0.23530225, 0.16599682, -0.2772327, 0.10041177) * go_2(1.0, -1.0);\n    result += mat4(-0.055056706, 0.1286236, -0.11890451, -0.1790546, 0.16517544, -0.040448934, 0.12548013, 0.017075695, 0.07185459, -0.13236302, 0.19354409, 0.12767012, 0.31120765, 0.16378082, -0.036915366, -0.19724306) * go_2(1.0, 0.0);\n    result += mat4(-0.02225051, 0.033263147, 0.003279449, 0.08826271, -0.047833472, 6.574577e-05, 0.13721916, 0.04801998, -0.014958419, 0.08791209, -0.08076282, 0.024002168, -0.18028922, 0.23835851, -0.23309888, -0.119310364) * go_2(1.0, 1.0);\n    result += mat4(0.044960875, 0.18821983, 0.027640678, 0.013462449, 0.19011214, 0.21559924, -0.03329638, 0.07234414, 0.030880248, -0.11273214, 0.102028474, 0.12203351, 0.035855662, 0.008828778, 0.007218363, -0.012421797) * go_3(-1.0, -1.0);\n    result += mat4(-0.09450626, 0.025191775, -0.10738468, 0.16237053, 0.073676676, 0.12488881, -0.048748355, 0.007877263, 0.3572506, -0.07911043, 0.14684045, 0.0015310893, -0.33411503, -0.1151223, 0.004201752, 0.017775744) * go_3(-1.0, 0.0);\n    result += mat4(-0.10607509, -0.008143826, -0.08448629, -0.27557802, 0.0046665915, 0.008158659, 0.030826218, 0.020516023, 0.2333065, -0.017463414, -0.041772116, -0.03027809, -0.028166672, -0.080471426, 0.048199337, 0.08341059) * go_3(-1.0, 1.0);\n    result += mat4(-0.14640257, -0.18334304, -0.061674733, 0.0008892598, -0.2374775, -0.2721524, -0.040371176, 0.26362613, 0.19872928, -0.11246391, 0.0842288, 0.11188515, 0.0045209546, -0.04250933, -0.0738212, -0.069005966) * go_3(0.0, -1.0);\n    result += mat4(-0.08760266, 0.4816288, -0.21241407, 0.22734411, -0.1783721, -0.26842996, 0.099888, -0.2867675, 0.085521065, -0.3780281, -0.018543908, -0.039699722, 0.75688565, -0.5333645, 0.47567275, 0.09518891) * go_3(0.0, 0.0);\n    result += mat4(-0.04072665, 0.05998423, -0.48314768, -0.29495844, 0.10358383, -0.09816629, 0.028586809, -0.047708735, 0.008320228, 0.04089551, -0.18359782, -0.27615002, 0.12414414, -0.072417594, 0.25932562, 0.30268723) * go_3(0.0, 1.0);\n    result += mat4(0.14481631, 0.06484443, -0.09898657, -0.06553556, 0.25750044, -0.07265585, 0.12903488, -0.022347894, -0.04693863, -0.000107379274, 0.030295763, -0.0325354, 0.086214684, -0.021326948, 0.039682828, -0.034843277) * go_3(1.0, -1.0);\n    result += mat4(-0.031971477, -0.25145087, 0.03931631, 0.14262606, -0.06044626, 0.22820354, -0.10506207, 0.18064679, 0.0069641788, 0.01477993, -0.003626875, 0.118767865, 0.109416224, -0.002998205, 0.035680585, 0.07843882) * go_3(1.0, 0.0);\n    result += mat4(0.03375426, -0.059815384, 0.11632834, -0.12411481, 0.022583738, 0.02544465, -0.054889992, -0.07031964, -0.10140042, 0.16750422, -0.1448294, -0.09316004, 0.035582513, -0.026138382, -0.031955894, 0.040148776) * go_3(1.0, 1.0);\n    result += vec4(-0.03573331, 0.032919675, 0.011109369, 0.008329268);\n    return result;\n}\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(VL)-Conv-4x1x1x112\n//!HOOK MAIN\n//!BIND conv2d_tf\n//!BIND conv2d_tf1\n//!BIND conv2d_1_tf\n//!BIND conv2d_1_tf1\n//!BIND conv2d_2_tf\n//!BIND conv2d_2_tf1\n//!BIND conv2d_3_tf\n//!BIND conv2d_3_tf1\n//!BIND conv2d_4_tf\n//!BIND conv2d_4_tf1\n//!BIND conv2d_5_tf\n//!BIND conv2d_5_tf1\n//!BIND conv2d_6_tf\n//!BIND conv2d_6_tf1\n//!SAVE conv2d_last_tf\n//!WIDTH conv2d_tf.w\n//!HEIGHT conv2d_tf.h\n//!COMPONENTS 4\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\n#define g_0 (max((conv2d_tf_tex(conv2d_tf_pos)), 0.0))\n#define g_1 (max((conv2d_tf1_tex(conv2d_tf1_pos)), 0.0))\n#define g_2 (max(-(conv2d_tf_tex(conv2d_tf_pos)), 0.0))\n#define g_3 (max(-(conv2d_tf1_tex(conv2d_tf1_pos)), 0.0))\n#define g_4 (max((conv2d_1_tf_tex(conv2d_1_tf_pos)), 0.0))\n#define g_5 (max((conv2d_1_tf1_tex(conv2d_1_tf1_pos)), 0.0))\n#define g_6 (max(-(conv2d_1_tf_tex(conv2d_1_tf_pos)), 0.0))\n#define g_7 (max(-(conv2d_1_tf1_tex(conv2d_1_tf1_pos)), 0.0))\n#define g_8 (max((conv2d_2_tf_tex(conv2d_2_tf_pos)), 0.0))\n#define g_9 (max((conv2d_2_tf1_tex(conv2d_2_tf1_pos)), 0.0))\n#define g_10 (max(-(conv2d_2_tf_tex(conv2d_2_tf_pos)), 0.0))\n#define g_11 (max(-(conv2d_2_tf1_tex(conv2d_2_tf1_pos)), 0.0))\n#define g_12 (max((conv2d_3_tf_tex(conv2d_3_tf_pos)), 0.0))\n#define g_13 (max((conv2d_3_tf1_tex(conv2d_3_tf1_pos)), 0.0))\n#define g_14 (max(-(conv2d_3_tf_tex(conv2d_3_tf_pos)), 0.0))\n#define g_15 (max(-(conv2d_3_tf1_tex(conv2d_3_tf1_pos)), 0.0))\n#define g_16 (max((conv2d_4_tf_tex(conv2d_4_tf_pos)), 0.0))\n#define g_17 (max((conv2d_4_tf1_tex(conv2d_4_tf1_pos)), 0.0))\n#define g_18 (max(-(conv2d_4_tf_tex(conv2d_4_tf_pos)), 0.0))\n#define g_19 (max(-(conv2d_4_tf1_tex(conv2d_4_tf1_pos)), 0.0))\n#define g_20 (max((conv2d_5_tf_tex(conv2d_5_tf_pos)), 0.0))\n#define g_21 (max((conv2d_5_tf1_tex(conv2d_5_tf1_pos)), 0.0))\n#define g_22 (max(-(conv2d_5_tf_tex(conv2d_5_tf_pos)), 0.0))\n#define g_23 (max(-(conv2d_5_tf1_tex(conv2d_5_tf1_pos)), 0.0))\n#define g_24 (max((conv2d_6_tf_tex(conv2d_6_tf_pos)), 0.0))\n#define g_25 (max((conv2d_6_tf1_tex(conv2d_6_tf1_pos)), 0.0))\n#define g_26 (max(-(conv2d_6_tf_tex(conv2d_6_tf_pos)), 0.0))\n#define g_27 (max(-(conv2d_6_tf1_tex(conv2d_6_tf1_pos)), 0.0))\nvec4 hook() {\n    vec4 result = mat4(-0.11498094, -0.053904895, -0.11520678, -0.05479549, 0.028396055, 0.032767884, 0.052479446, 0.05257866, -0.25706592, -0.3454966, -0.24713765, -0.2854201, -0.10287636, 0.0023146886, -0.09190338, -0.011193905) * g_0;\n    result += mat4(-0.05461422, 0.008780496, -0.07738697, -0.032230727, -0.047554165, -0.025061952, -0.051897213, -0.009545297, -0.14548294, -0.15184018, -0.01313442, -0.015299784, -0.0007883845, -0.12866738, -0.15260352, -0.27081275) * g_1;\n    result += mat4(0.11007706, 0.035344437, 0.11020841, 0.0425353, 0.1613199, 0.18417408, 0.09274313, 0.11943135, 0.106862, 0.079875536, 0.0937752, 0.068030775, 0.029093558, -0.06441164, 0.06467169, -0.021989612) * g_2;\n    result += mat4(0.049548414, -0.012455486, 0.07185561, 0.021865537, 0.020969186, -0.03374196, -0.024260623, -0.07739141, 0.07164591, 0.12741035, 0.0379913, 0.076403245, 0.07049977, 0.0744538, 0.0062989634, 0.01818882) * g_3;\n    result += mat4(-0.12511204, -0.010836819, 0.13709816, 0.22472954, 0.21280868, -0.006484726, 0.17554289, -0.009977173, 0.078398876, 0.20698707, 0.13432744, 0.29740283, -0.24750128, -0.32757792, -0.19807857, -0.2537023) * g_4;\n    result += mat4(-0.27207088, -0.1385644, -0.2166476, -0.07687419, -0.20300622, -0.29678395, -0.13135734, -0.20851587, 0.0361364, 0.011243289, -0.06845459, -0.11796941, 0.11575868, 0.070215136, -0.10295678, -0.12281369) * g_5;\n    result += mat4(0.13619795, -0.0019436983, -0.12701888, -0.25933513, -0.20134166, 0.00062823144, -0.076756015, 0.11002947, 0.0059049693, -0.18756741, -0.0718802, -0.2589954, 0.23413423, 0.30107784, 0.14445266, 0.18920745) * g_6;\n    result += mat4(0.1494216, 0.0587532, 0.05478662, -0.039123338, 0.23322394, 0.29950607, 0.24384268, 0.27843767, -0.16094431, -0.04705998, -0.016345032, 0.028868208, -0.102872886, -0.04659664, 0.104105346, 0.14305067) * g_7;\n    result += mat4(-0.001037014, 0.010001526, -0.0052278573, 0.024779709, 0.06857274, 0.067640975, 0.085439384, 0.09242789, -0.066597246, -0.055928994, 0.0015658981, 0.016131008, -0.03524695, -0.018364554, -0.047754433, -0.014295886) * g_8;\n    result += mat4(-0.042207, 0.02835915, -0.1404656, -0.08563323, -0.030979915, -0.0673764, 0.10733943, 0.057902794, 0.00022424995, -0.0023634837, -0.10778953, -0.10202357, -0.020368295, -0.019088887, -0.06875738, -0.08504131) * g_9;\n    result += mat4(-0.00043458896, 0.00045652856, -0.02016843, -0.020062413, -0.08740103, -0.042085808, -0.10644177, -0.09226477, 0.11212161, -0.00048174805, 0.021872435, -0.05868698, 0.0333954, 0.058184672, 0.05532576, 0.07621587) * g_10;\n    result += mat4(0.054245148, 0.001020329, 0.09106849, 0.05303779, 0.009889632, 0.01309413, -0.09187347, -0.08618193, -0.011621187, 0.016222361, 0.061095525, 0.060885344, 0.078050986, 0.0111776795, 0.08829944, 0.032022282) * g_11;\n    result += mat4(0.01643529, 0.02285545, -0.03498564, 0.00769657, -0.0042474116, 0.015836312, -0.025771018, -0.0016368, -0.008897948, -0.012588166, -0.01416411, -0.003578984, 0.025991246, 0.021237152, 0.017450012, 0.025172485) * g_12;\n    result += mat4(0.014568868, 0.017796224, -0.036679734, -0.03138748, 0.019457601, -0.027607411, -0.004529679, -0.038048342, -0.054055385, -0.03876025, 0.041948095, 0.005869784, 0.02439633, 0.05177997, 0.016000897, 0.0057169925) * g_13;\n    result += mat4(-0.03021866, 0.017678728, -0.01371109, 0.013548159, -0.0038099394, -0.014066414, 0.028093752, 0.0027308422, -0.010615999, 0.012673458, -0.03028171, -0.016818244, -0.06530097, -0.018845048, -0.0072947564, -0.0038243714) * g_14;\n    result += mat4(-0.019006258, -0.007847591, 0.03690709, 0.06714211, 0.0073993434, -0.009766907, -0.0021441753, -0.01308625, 0.06658726, 0.06701995, -0.027305668, -0.016032105, -0.028976806, -0.0036668575, -0.0027825525, 0.0105632655) * g_15;\n    result += mat4(0.028945107, -0.0014701135, 0.048950657, -0.01923516, -0.0014054152, 0.002650635, -0.005300331, 0.004860559, 0.011158468, 0.005940625, -0.012095051, 0.0041518128, -0.020433836, -0.025870577, -0.0007547932, -0.026509356) * g_16;\n    result += mat4(-0.004545374, 0.04264545, 0.021741537, 0.029115127, 0.04225599, -0.0055392785, 0.026570829, -0.031795148, -0.008307126, 0.020176455, 0.010904648, 0.017765503, -0.10806103, -0.01776947, 0.00070428237, -0.06356262) * g_17;\n    result += mat4(-0.05663172, 0.05908046, -0.03837452, 0.06636983, -0.007960516, -0.06384041, 0.023125881, -0.030108837, 0.0038054318, -0.023263922, 0.020264054, -0.0062937695, 0.031630237, 0.020909082, 0.03594235, 0.035879835) * g_18;\n    result += mat4(-0.0050448794, 0.033650696, -0.002830413, 0.035174295, -0.024521282, 0.013054315, -0.020833842, 0.037953895, 0.08249671, 0.024239466, -0.012758333, -0.027316988, 0.051040914, 0.0005025873, 0.039778862, 0.0024668393) * g_19;\n    result += mat4(0.017232442, 0.022482058, 0.020233413, 0.024337437, 0.07986929, 0.06234036, 0.12662584, -0.05271183, -0.009718745, -0.0046989853, -0.0030333172, -0.04034237, -0.0113442, 0.022746231, -0.035293855, -0.009433693) * g_20;\n    result += mat4(0.015766997, 0.013647276, -0.029327558, 0.039106004, -0.010398323, -0.032851525, 0.02908329, -0.003789618, 0.12963496, 0.010851003, 0.1126276, -0.049255487, 0.06867432, 0.07970792, 0.017840397, -0.026481882) * g_21;\n    result += mat4(-0.058729574, -0.07886952, 0.033267397, 0.02755372, -0.0172006, 0.012404398, -0.0230168, -0.015059758, -0.09239916, -0.029533267, -0.043251917, 0.0035152994, 0.022931995, 0.101714484, -0.044946067, 0.094993) * g_22;\n    result += mat4(-0.04708704, -0.032475296, -0.03228093, -0.08810475, 0.013745045, 0.027828002, -0.031922746, 0.022986397, -0.061620213, -0.03694645, -0.055026993, 0.0031291894, -0.028799903, -0.0025357977, -0.03441407, 0.0028600092) * g_23;\n    result += mat4(0.058981724, -0.10447273, -0.088705614, 0.16546178, -0.023549391, -0.008831522, -0.018411588, 0.029640056, -0.068086684, -0.05414636, -0.029401174, 0.036180343, -0.031988926, -0.047249753, 0.008162177, 0.00548062) * g_24;\n    result += mat4(0.05287462, -0.030657746, 0.02821435, 0.037005343, 0.03534311, -0.15614955, 0.07085459, -0.11997641, -0.009156166, -0.021968868, -0.054147746, -0.07307657, -0.006428544, -0.017528288, 0.012614676, 0.037840024) * g_25;\n    result += mat4(-0.021977803, 0.047799855, 0.02660416, -0.07292106, 0.045195807, -0.0056674764, 0.10824326, -0.112114795, 0.1447127, -0.0119616175, 0.0011661504, -0.04553905, 0.13048342, 0.14574122, -0.105522245, -0.102792375) * g_26;\n    result += mat4(-0.16397473, 0.15785863, -0.06666504, -0.01682913, 0.06070918, 0.070222184, 0.037701584, 0.026657054, -0.0835267, -0.009457008, 0.13232987, 0.13508691, -0.056414206, -0.06818828, 0.079076104, 0.032249212) * g_27;\n    result += vec4(-0.10795144, -0.09953324, -0.055413827, -0.03875493);\n    return result;\n}\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(VL)-Conv-4x1x1x112\n//!HOOK MAIN\n//!BIND conv2d_tf\n//!BIND conv2d_tf1\n//!BIND conv2d_1_tf\n//!BIND conv2d_1_tf1\n//!BIND conv2d_2_tf\n//!BIND conv2d_2_tf1\n//!BIND conv2d_3_tf\n//!BIND conv2d_3_tf1\n//!BIND conv2d_4_tf\n//!BIND conv2d_4_tf1\n//!BIND conv2d_5_tf\n//!BIND conv2d_5_tf1\n//!BIND conv2d_6_tf\n//!BIND conv2d_6_tf1\n//!SAVE conv2d_last_tf1\n//!WIDTH conv2d_tf.w\n//!HEIGHT conv2d_tf.h\n//!COMPONENTS 4\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\n#define g_0 (max((conv2d_tf_tex(conv2d_tf_pos)), 0.0))\n#define g_1 (max((conv2d_tf1_tex(conv2d_tf1_pos)), 0.0))\n#define g_2 (max(-(conv2d_tf_tex(conv2d_tf_pos)), 0.0))\n#define g_3 (max(-(conv2d_tf1_tex(conv2d_tf1_pos)), 0.0))\n#define g_4 (max((conv2d_1_tf_tex(conv2d_1_tf_pos)), 0.0))\n#define g_5 (max((conv2d_1_tf1_tex(conv2d_1_tf1_pos)), 0.0))\n#define g_6 (max(-(conv2d_1_tf_tex(conv2d_1_tf_pos)), 0.0))\n#define g_7 (max(-(conv2d_1_tf1_tex(conv2d_1_tf1_pos)), 0.0))\n#define g_8 (max((conv2d_2_tf_tex(conv2d_2_tf_pos)), 0.0))\n#define g_9 (max((conv2d_2_tf1_tex(conv2d_2_tf1_pos)), 0.0))\n#define g_10 (max(-(conv2d_2_tf_tex(conv2d_2_tf_pos)), 0.0))\n#define g_11 (max(-(conv2d_2_tf1_tex(conv2d_2_tf1_pos)), 0.0))\n#define g_12 (max((conv2d_3_tf_tex(conv2d_3_tf_pos)), 0.0))\n#define g_13 (max((conv2d_3_tf1_tex(conv2d_3_tf1_pos)), 0.0))\n#define g_14 (max(-(conv2d_3_tf_tex(conv2d_3_tf_pos)), 0.0))\n#define g_15 (max(-(conv2d_3_tf1_tex(conv2d_3_tf1_pos)), 0.0))\n#define g_16 (max((conv2d_4_tf_tex(conv2d_4_tf_pos)), 0.0))\n#define g_17 (max((conv2d_4_tf1_tex(conv2d_4_tf1_pos)), 0.0))\n#define g_18 (max(-(conv2d_4_tf_tex(conv2d_4_tf_pos)), 0.0))\n#define g_19 (max(-(conv2d_4_tf1_tex(conv2d_4_tf1_pos)), 0.0))\n#define g_20 (max((conv2d_5_tf_tex(conv2d_5_tf_pos)), 0.0))\n#define g_21 (max((conv2d_5_tf1_tex(conv2d_5_tf1_pos)), 0.0))\n#define g_22 (max(-(conv2d_5_tf_tex(conv2d_5_tf_pos)), 0.0))\n#define g_23 (max(-(conv2d_5_tf1_tex(conv2d_5_tf1_pos)), 0.0))\n#define g_24 (max((conv2d_6_tf_tex(conv2d_6_tf_pos)), 0.0))\n#define g_25 (max((conv2d_6_tf1_tex(conv2d_6_tf1_pos)), 0.0))\n#define g_26 (max(-(conv2d_6_tf_tex(conv2d_6_tf_pos)), 0.0))\n#define g_27 (max(-(conv2d_6_tf1_tex(conv2d_6_tf1_pos)), 0.0))\nvec4 hook() {\n    vec4 result = mat4(0.024905335, -0.0020974763, 0.02695263, 0.00016802056, -0.024053082, -0.02133723, -0.031614035, -0.031826317, 0.120421864, 0.10555479, 0.08609448, 0.116875134, 0.046175968, 0.04224941, 0.059216674, 0.035143953) * g_0;\n    result += mat4(0.059397914, 0.016519934, 0.07189327, 0.047407165, 0.04808963, 0.02792908, 0.057017103, 0.034324065, 0.14228246, 0.11275426, 0.088058695, 0.059600517, 0.02063494, 0.052596953, 0.047207687, 0.08789091) * g_1;\n    result += mat4(-0.013453174, 0.008474715, -0.017593835, 0.009218917, 0.070580654, 0.040542338, 0.08812338, 0.074653216, -0.016356857, 0.015809007, -0.008739107, 0.0097674895, -0.018381525, -0.007775341, -0.040571664, -0.011188163) * g_2;\n    result += mat4(-0.026196122, -0.034825727, -0.042998232, -0.033436514, -0.01678153, -0.004592797, -0.010311677, 0.0008815291, -0.08899181, -0.10274026, -0.066960976, -0.082430154, -0.057137426, -0.07554528, -0.030993424, -0.050372377) * g_3;\n    result += mat4(0.022921838, -0.010479244, -0.050794605, -0.073633075, -0.053708922, 0.009594084, -0.071259, -0.01054356, 0.005165821, -0.08024963, -0.049251772, -0.09581235, 0.17995799, 0.09743011, 0.13533138, 0.11643848) * g_4;\n    result += mat4(0.09727046, 0.07292666, 0.06820908, 0.041535784, -0.0049705, 0.0048759184, -0.035702795, -0.015944308, -0.010730028, 0.018847652, 0.06466244, 0.086318985, -0.05661574, -0.040698618, 0.010839972, 0.0027009705) * g_5;\n    result += mat4(-0.04628466, 0.010060396, 0.02609333, 0.08664702, 0.057045907, 0.033591177, 0.02186063, -0.024303377, 0.006569828, 0.08025825, 0.016128821, 0.10180713, -0.12228169, -0.112990454, -0.078443415, -0.09126021) * g_6;\n    result += mat4(-0.12733299, -0.087755, -0.07374111, -0.044979006, -0.025347412, -0.004083168, 0.023782173, 0.02900392, -0.017815407, -0.041119996, -0.057978686, -0.13521095, 0.08364004, 0.06950181, 0.023554614, 0.008043734) * g_7;\n    result += mat4(0.009062775, -0.003570175, -0.007378757, -0.0018487388, 0.01145638, 0.05217187, -0.008250244, 0.008433307, -0.056756936, -0.044681005, -0.08096105, -0.08033185, -0.023784965, -0.01859799, 0.013042476, 0.021188647) * g_8;\n    result += mat4(-0.0071619656, -0.012498299, -0.05144986, -0.078112476, -0.034992415, -0.017038302, -0.04464615, -0.044504963, 0.024249, -0.004297534, 0.03674578, 0.03090718, 0.04698553, 0.008344952, 0.057619847, -0.0338724) * g_9;\n    result += mat4(-0.011845145, -0.0045043705, -1.6646482e-06, -0.0038495932, -0.01992515, 0.004827126, 0.019493148, 0.00862289, 0.10151322, 0.0021909082, 0.09940764, 0.03728846, 0.027824005, 0.04358071, 0.014909185, 0.036326095) * g_10;\n    result += mat4(0.022513246, 0.028257169, 0.0102195935, 0.03301329, 0.052253865, -0.0021944977, 0.08247392, 0.03256867, -0.040685873, -0.0052207555, -0.0451257, -0.054165114, 0.01647699, 0.0028809097, -0.015233776, -0.0008741886) * g_11;\n    result += mat4(0.017371105, 0.01597189, -0.052552313, -0.008554715, -0.0023150423, 0.006076517, -0.012868931, 0.0039361073, -0.007524978, -0.004284313, -0.021520883, -0.010327569, 0.02543678, 0.008725823, -0.0073885336, 0.005528395) * g_12;\n    result += mat4(0.019192757, 0.016561812, 0.0027538154, 0.0013078215, 0.007916496, -0.042525183, -0.013173432, -0.05265476, -0.062195376, -0.011255499, 0.020898128, 0.021532273, -0.001524097, 0.034835674, -0.004051403, -0.0292426) * g_13;\n    result += mat4(-0.049191684, -9.43322e-06, -0.009106849, 0.012845289, -0.019482708, -0.011163468, 0.0034011535, -0.007062845, -0.006469714, 0.03177786, -0.033006195, -0.0006813464, -0.053963087, 0.00085209147, 0.02734121, 0.034086403) * g_14;\n    result += mat4(-0.03232248, -0.004037002, -0.010319106, 0.030889064, 0.019604538, 0.0020888883, 0.010277864, 0.000661223, 0.057915937, 0.030683514, 0.00042533095, -0.013019287, -0.015896408, 0.0038484468, -0.0042103594, 0.02174542) * g_15;\n    result += mat4(0.032975145, 0.0011456647, 0.04913679, -0.017063798, 0.0117176045, 0.007440557, 0.0020480808, 0.009415731, 0.027573857, 0.015140836, -0.01679426, -0.006124731, -0.03206279, -0.029842237, -0.010428016, -0.028513178) * g_16;\n    result += mat4(-0.00506859, 0.055869613, 0.010164368, 0.027031485, 0.042289548, -0.0054258504, 0.032214936, -0.029970925, -0.0058315448, 0.022889478, 0.01681123, 0.02985076, -0.111186065, -0.02202099, 0.0030994313, -0.062343158) * g_17;\n    result += mat4(-0.060951103, 0.06079555, -0.0396464, 0.070911355, -0.011480358, -0.06803282, 0.01637355, -0.043100975, -0.00423709, -0.028337711, 0.021635853, 0.0014857082, 0.030084312, 0.018155476, 0.043694943, 0.038795974) * g_18;\n    result += mat4(-0.0060662925, 0.029721662, -0.008117774, 0.034551267, -0.024477571, 0.018841071, -0.027095588, 0.034495078, 0.082398005, 0.008998768, -0.016399248, -0.043801688, 0.05936684, 0.006066549, 0.045399766, 3.5319943e-05) * g_19;\n    result += mat4(0.019259382, 0.02494012, 0.029301709, 0.028329274, 0.09122267, 0.06900443, 0.1412115, -0.043169618, -0.01627418, -0.004989528, -0.0042651827, -0.04556752, -0.023623291, 0.013007996, -0.04483056, -0.015727345) * g_20;\n    result += mat4(0.016332543, 0.016384754, -0.030676385, 0.045312885, -0.0100853555, -0.032632045, 0.031514473, -0.0070776115, 0.13642761, 0.0023589598, 0.12214136, -0.062155515, 0.08240989, 0.08894205, 0.03325406, -0.016589595) * g_21;\n    result += mat4(-0.06494277, -0.08158925, 0.030425413, 0.019835634, -0.012624623, 0.013942616, -0.030527417, -0.021668324, -0.09444672, -0.033064254, -0.044167448, 0.0011024752, 0.03210801, 0.12662941, -0.03912534, 0.1112649) * g_22;\n    result += mat4(-0.04716062, -0.03751481, -0.031030515, -0.09067383, 0.0077815712, 0.02169541, -0.035285182, 0.02290573, -0.0704085, -0.03916127, -0.058103334, 0.004915147, -0.0333844, -0.011548617, -0.031151932, -0.00043817286) * g_23;\n    result += mat4(0.05976319, -0.107285, -0.097245865, 0.17706421, -0.021453341, -0.0047738464, -0.017621001, 0.033400454, -0.07225561, -0.05599672, -0.027600193, 0.038664024, -0.03762786, -0.052429967, 0.0104017975, 0.007116869) * g_24;\n    result += mat4(0.06014114, -0.029824806, 0.03209269, 0.04392036, 0.031300627, -0.16249833, 0.06878509, -0.12658615, -0.012383169, -0.025043553, -0.06527381, -0.08149099, -0.014006842, -0.018669648, 0.014510818, 0.042045828) * g_25;\n    result += mat4(-0.023342922, 0.047104675, 0.029629575, -0.082307704, 0.04035797, -0.0013049254, 0.11085582, -0.11031226, 0.14778149, -0.016699014, -0.00634342, -0.055320874, 0.14306462, 0.15896587, -0.110229075, -0.1069649) * g_26;\n    result += mat4(-0.17449625, 0.15787153, -0.06711028, -0.023110518, 0.06862914, 0.074063435, 0.042682912, 0.029800726, -0.08768606, -0.009814701, 0.14180017, 0.14780663, -0.05672417, -0.074305914, 0.07873489, 0.028458012) * g_27;\n    result += vec4(0.06026231, 0.040204916, 0.037672628, 0.023496555);\n    return result;\n}\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(VL)-Conv-4x1x1x112\n//!HOOK MAIN\n//!BIND conv2d_tf\n//!BIND conv2d_tf1\n//!BIND conv2d_1_tf\n//!BIND conv2d_1_tf1\n//!BIND conv2d_2_tf\n//!BIND conv2d_2_tf1\n//!BIND conv2d_3_tf\n//!BIND conv2d_3_tf1\n//!BIND conv2d_4_tf\n//!BIND conv2d_4_tf1\n//!BIND conv2d_5_tf\n//!BIND conv2d_5_tf1\n//!BIND conv2d_6_tf\n//!BIND conv2d_6_tf1\n//!SAVE conv2d_last_tf2\n//!WIDTH conv2d_tf.w\n//!HEIGHT conv2d_tf.h\n//!COMPONENTS 4\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\n#define g_0 (max((conv2d_tf_tex(conv2d_tf_pos)), 0.0))\n#define g_1 (max((conv2d_tf1_tex(conv2d_tf1_pos)), 0.0))\n#define g_2 (max(-(conv2d_tf_tex(conv2d_tf_pos)), 0.0))\n#define g_3 (max(-(conv2d_tf1_tex(conv2d_tf1_pos)), 0.0))\n#define g_4 (max((conv2d_1_tf_tex(conv2d_1_tf_pos)), 0.0))\n#define g_5 (max((conv2d_1_tf1_tex(conv2d_1_tf1_pos)), 0.0))\n#define g_6 (max(-(conv2d_1_tf_tex(conv2d_1_tf_pos)), 0.0))\n#define g_7 (max(-(conv2d_1_tf1_tex(conv2d_1_tf1_pos)), 0.0))\n#define g_8 (max((conv2d_2_tf_tex(conv2d_2_tf_pos)), 0.0))\n#define g_9 (max((conv2d_2_tf1_tex(conv2d_2_tf1_pos)), 0.0))\n#define g_10 (max(-(conv2d_2_tf_tex(conv2d_2_tf_pos)), 0.0))\n#define g_11 (max(-(conv2d_2_tf1_tex(conv2d_2_tf1_pos)), 0.0))\n#define g_12 (max((conv2d_3_tf_tex(conv2d_3_tf_pos)), 0.0))\n#define g_13 (max((conv2d_3_tf1_tex(conv2d_3_tf1_pos)), 0.0))\n#define g_14 (max(-(conv2d_3_tf_tex(conv2d_3_tf_pos)), 0.0))\n#define g_15 (max(-(conv2d_3_tf1_tex(conv2d_3_tf1_pos)), 0.0))\n#define g_16 (max((conv2d_4_tf_tex(conv2d_4_tf_pos)), 0.0))\n#define g_17 (max((conv2d_4_tf1_tex(conv2d_4_tf1_pos)), 0.0))\n#define g_18 (max(-(conv2d_4_tf_tex(conv2d_4_tf_pos)), 0.0))\n#define g_19 (max(-(conv2d_4_tf1_tex(conv2d_4_tf1_pos)), 0.0))\n#define g_20 (max((conv2d_5_tf_tex(conv2d_5_tf_pos)), 0.0))\n#define g_21 (max((conv2d_5_tf1_tex(conv2d_5_tf1_pos)), 0.0))\n#define g_22 (max(-(conv2d_5_tf_tex(conv2d_5_tf_pos)), 0.0))\n#define g_23 (max(-(conv2d_5_tf1_tex(conv2d_5_tf1_pos)), 0.0))\n#define g_24 (max((conv2d_6_tf_tex(conv2d_6_tf_pos)), 0.0))\n#define g_25 (max((conv2d_6_tf1_tex(conv2d_6_tf1_pos)), 0.0))\n#define g_26 (max(-(conv2d_6_tf_tex(conv2d_6_tf_pos)), 0.0))\n#define g_27 (max(-(conv2d_6_tf1_tex(conv2d_6_tf1_pos)), 0.0))\nvec4 hook() {\n    vec4 result = mat4(0.1765669, 0.14268716, 0.19186598, 0.15799578, 0.016374417, 0.018578433, 0.0039475, 0.0046772263, 0.39840183, 0.36909792, 0.35409746, 0.37422222, -0.108508386, -0.1331279, -0.10336035, -0.14776541) * g_0;\n    result += mat4(-0.057757027, -0.14071062, -0.025283009, -0.09397916, -0.09031894, -0.14219165, -0.08299535, -0.13970287, -0.12259208, -0.14382727, -0.22002274, -0.25016093, -0.048906635, 0.06620249, 0.016965045, 0.1295978) * g_1;\n    result += mat4(-0.16748372, -0.13718611, -0.18565705, -0.15029612, -0.080749065, -0.09955825, 0.032431383, 0.023855643, -0.2748885, -0.23232168, -0.29121292, -0.26405892, 0.16556135, 0.18657646, 0.1424068, 0.18855052) * g_2;\n    result += mat4(0.10960496, 0.10851629, 0.095003806, 0.11053746, 0.09885307, 0.14437789, 0.13191165, 0.17365928, 0.16558935, 0.15473324, 0.21136154, 0.19976667, -0.07267957, -0.11469687, -0.029134216, -0.06817615) * g_3;\n    result += mat4(0.10202856, 0.04216857, -0.03959349, -0.09849683, -0.1576996, -0.049997438, -0.1579918, -0.058789205, 0.029792828, -0.07311781, -0.045432188, -0.11312683, 0.24257647, 0.16204113, 0.17869382, 0.16024388) * g_4;\n    result += mat4(0.17193612, 0.12692013, 0.13177487, 0.0796725, 0.0797928, 0.08952722, -0.012468046, 0.011071511, -0.068559825, -0.024852324, 0.0526428, 0.07917346, -0.085534215, -0.09591339, 0.04615827, 0.024577664) * g_5;\n    result += mat4(-0.14653449, -0.067267366, -0.002524394, 0.086243175, 0.13660401, 0.08039592, 0.09179008, 0.022573143, -0.024744196, 0.09120211, 0.017654825, 0.14114714, -0.16093308, -0.14538004, -0.09950235, -0.111152865) * g_6;\n    result += mat4(-0.188637, -0.12968326, -0.1200479, -0.06537649, -0.12589337, -0.106242515, -0.02788782, -0.025949068, 0.04948153, 0.02222735, -0.025291357, -0.12379292, 0.11074645, 0.11902375, -0.00056989543, -0.0024386419) * g_7;\n    result += mat4(0.018286629, 0.0072215167, 0.00037828335, 0.0047001047, 0.011478272, 0.041745186, -0.015742473, -0.002282524, -0.03440817, -0.02196847, -0.07838253, -0.07993771, -0.010155526, -0.017590692, 0.027141469, 0.029741213) * g_8;\n    result += mat4(0.016512005, 0.004950637, -0.0238836, -0.05587327, -0.03164328, -0.009499985, -0.059880238, -0.061794154, 0.023154303, -0.013266373, 0.04701534, 0.0415862, 0.06357814, 0.033057794, 0.08389772, 0.00035060212) * g_9;\n    result += mat4(-0.016403968, -0.012538788, -0.0015746636, -0.004771009, -0.021361275, -0.009695242, 0.020548422, -0.0024130535, 0.07796766, -0.01516671, 0.09961382, 0.042754963, 0.017363647, 0.03729065, -0.004795824, 0.01550197) * g_10;\n    result += mat4(-0.0028093113, 0.011869523, -0.02216933, 0.011177349, 0.033342455, -0.021146454, 0.07830085, 0.032490104, -0.03281833, 0.0060484232, -0.04081057, -0.04945058, -0.0056189033, -0.010636801, -0.041949317, -0.025739705) * g_11;\n    result += mat4(0.012979897, 0.016758928, -0.049062215, -0.0035748442, 0.0085972, 0.0036381132, -0.0055621094, 0.0041307937, -0.0008907763, -0.0034079372, -0.025680453, -0.015531803, 0.012816766, 0.009977763, -0.016416566, 0.0034859509) * g_12;\n    result += mat4(0.021753248, 0.016452711, 0.009833835, 0.0065052663, 0.0014061348, -0.046160888, -0.0132271005, -0.05051269, -0.05746351, -0.0012690664, 0.017191738, 0.018192926, -0.008879476, 0.026354216, -0.012801991, -0.029587373) * g_13;\n    result += mat4(-0.04220692, -0.0015560482, -0.0019648245, 0.013402305, -0.018259782, -0.0036008905, 0.0035650074, -0.0019178417, 0.00051580026, 0.027355857, -0.017914988, 0.004937948, -0.046335887, 0.00013612259, 0.030293299, 0.030688645) * g_14;\n    result += mat4(-0.036683388, -0.0031274238, -0.026074665, 0.021684237, 0.022639066, 0.0022493738, 0.011508554, -0.0006385944, 0.04890418, 0.020119468, 0.004167364, -0.008356099, -0.008598796, 0.0089028, -0.0029575853, 0.016687104) * g_15;\n    result += mat4(0.027207986, 0.0011099194, 0.042383645, -0.015179333, 0.014744431, 0.006148344, 0.005165422, 0.0070196544, 0.030286826, 0.016620956, -0.01611366, -0.00667594, -0.029524863, -0.024751091, -0.013321004, -0.025199674) * g_16;\n    result += mat4(0.0027477827, 0.054622147, 0.010154094, 0.025437292, 0.031773083, -0.01055473, 0.022864206, -0.029010754, -0.0029999653, 0.025018329, 0.015316208, 0.027188798, -0.10096525, -0.017268656, 0.0012529213, -0.062078856) * g_17;\n    result += mat4(-0.053670805, 0.057336535, -0.037418038, 0.06443577, -0.016027879, -0.058168363, 0.007034215, -0.03390141, -0.0019346164, -0.027947908, 0.021723913, -0.0018286633, 0.030507812, 0.018293543, 0.042917266, 0.033528328) * g_18;\n    result += mat4(-0.004559579, 0.029667616, -0.001870353, 0.0378995, -0.017147437, 0.020192018, -0.021574946, 0.031568103, 0.07487145, 0.0032376775, -0.018893708, -0.041981626, 0.054478757, 0.0061423797, 0.041280247, 0.000878061) * g_19;\n    result += mat4(0.017076394, 0.023647636, 0.029403262, 0.029923365, 0.08866472, 0.060613394, 0.1314274, -0.04490231, -0.016304834, -0.0062647443, -0.0031828512, -0.03989252, -0.024330825, 0.00741213, -0.04075287, -0.01615817) * g_20;\n    result += mat4(0.017866978, 0.017720113, -0.02846163, 0.040761847, -0.0063438355, -0.02347501, 0.029564403, -0.0029562064, 0.12505588, -0.0073986333, 0.11250363, -0.06179967, 0.07854423, 0.08546533, 0.034743227, -0.010757377) * g_21;\n    result += mat4(-0.06416677, -0.08344284, 0.030138884, 0.017635904, -0.012087523, 0.014205202, -0.03221233, -0.023834767, -0.091186255, -0.028958676, -0.04724334, 0.00013161585, 0.027391518, 0.1249978, -0.045047652, 0.10737729) * g_22;\n    result += mat4(-0.04326348, -0.03543181, -0.029558217, -0.08582413, 0.007812453, 0.014296562, -0.028779754, 0.018517692, -0.063755795, -0.036619596, -0.050809663, 0.005431336, -0.029205568, -0.011827915, -0.031110523, -0.005648626) * g_23;\n    result += mat4(0.05499293, -0.10000709, -0.0943537, 0.16143042, -0.019952895, -0.0039807972, -0.014841254, 0.0320363, -0.065173544, -0.049425576, -0.023904482, 0.03759679, -0.03207411, -0.047782745, 0.01352581, 0.008140566) * g_24;\n    result += mat4(0.055923894, -0.025134467, 0.029583648, 0.04096879, 0.027551858, -0.14995384, 0.06467113, -0.11633077, -0.01563784, -0.026909819, -0.06292879, -0.078409635, -0.009081105, -0.015533088, 0.019585673, 0.04334208) * g_25;\n    result += mat4(-0.021717606, 0.042464726, 0.02743202, -0.07388838, 0.03460472, 0.0038285658, 0.099842004, -0.098247, 0.13276267, -0.020793032, -0.008603039, -0.051913783, 0.12959045, 0.14735717, -0.10888226, -0.10263746) * g_26;\n    result += mat4(-0.16819532, 0.141579, -0.062480718, -0.021918943, 0.06348125, 0.06849444, 0.03888676, 0.027375204, -0.08194279, -0.012574497, 0.13523251, 0.13739482, -0.047547445, -0.058767617, 0.07009549, 0.028136581) * g_27;\n    result += vec4(0.069033325, 0.040207114, 0.027286075, 0.0065334598);\n    return result;\n}\n//!DESC Anime4K-v3.2-Upscale-CNN-x2-(VL)-Depth-to-Space\n//!HOOK MAIN\n//!BIND MAIN\n//!BIND conv2d_last_tf\n//!BIND conv2d_last_tf1\n//!BIND conv2d_last_tf2\n//!SAVE MAIN\n//!WIDTH conv2d_last_tf.w 2 *\n//!HEIGHT conv2d_last_tf.h 2 *\n//!WHEN OUTPUT.w MAIN.w / 1.200 > OUTPUT.h MAIN.h / 1.200 > *\nvec4 hook() {\n    vec2 f0 = fract(conv2d_last_tf_pos * conv2d_last_tf_size);\n    ivec2 i0 = ivec2(f0 * vec2(2.0));\n    float c0 = conv2d_last_tf_tex((vec2(0.5) - f0) * conv2d_last_tf_pt + conv2d_last_tf_pos)[i0.y * 2 + i0.x];\n    vec2 f1 = fract(conv2d_last_tf1_pos * conv2d_last_tf1_size);\n    ivec2 i1 = ivec2(f1 * vec2(2.0));\n    float c1 = conv2d_last_tf1_tex((vec2(0.5) - f1) * conv2d_last_tf1_pt + conv2d_last_tf1_pos)[i1.y * 2 + i1.x];\n    vec2 f2 = fract(conv2d_last_tf2_pos * conv2d_last_tf2_size);\n    ivec2 i2 = ivec2(f2 * vec2(2.0));\n    float c2 = conv2d_last_tf2_tex((vec2(0.5) - f2) * conv2d_last_tf2_pt + conv2d_last_tf2_pos)[i2.y * 2 + i2.x];\n    float c3 = c2;\n    return vec4(c0, c1, c2, c3) + MAIN_tex(MAIN_pos);\n}\n"
  },
  {
    "path": "assets/shaders/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2019 bloc97\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "distribute_options.yaml",
    "content": "output: dist/"
  },
  {
    "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>13.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__))\nend\n\npost_install do |installer|\n  installer.pods_project.targets.each do |target|\n    flutter_additional_ios_build_settings(target)\n    # Start of the permission_handler configuration\n        target.build_configurations.each do |config|\n\n          # You can enable the permissions needed here. For example to enable camera\n          # permission, just remove the `#` character in front so it looks like this:\n          #\n          # ## dart: PermissionGroup.camera\n          # 'PERMISSION_CAMERA=1'\n          #\n          #  Preprocessor definitions can be found in: https://github.com/Baseflow/flutter-permission-handler/blob/master/permission_handler_apple/ios/Classes/PermissionHandlerEnums.h\n          config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [\n            '$(inherited)',\n\n            ## dart: PermissionGroup.calendar\n            # 'PERMISSION_EVENTS=1',\n\n            ## dart: PermissionGroup.reminders\n            # 'PERMISSION_REMINDERS=1',\n\n            ## dart: PermissionGroup.contacts\n            # 'PERMISSION_CONTACTS=1',\n\n            ## dart: PermissionGroup.camera\n            # 'PERMISSION_CAMERA=1',\n\n            ## dart: PermissionGroup.microphone\n            # 'PERMISSION_MICROPHONE=1',\n\n            ## dart: PermissionGroup.speech\n            # 'PERMISSION_SPEECH_RECOGNIZER=1',\n\n            ## dart: PermissionGroup.photos\n            'PERMISSION_PHOTOS=1',\n\n            ## dart: PermissionGroup.photosAddOnly\n            # 'PERMISSION_PHOTOS_ADD_ONLY =1',\n\n            ## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]\n            # 'PERMISSION_LOCATION=1',\n\n            ## dart: PermissionGroup.notification\n            # 'PERMISSION_NOTIFICATIONS=1',\n\n            ## dart: PermissionGroup.mediaLibrary\n            # 'PERMISSION_MEDIA_LIBRARY=1',\n\n            ## dart: PermissionGroup.sensors\n            # 'PERMISSION_SENSORS=1',\n\n            ## dart: PermissionGroup.bluetooth\n            # 'PERMISSION_BLUETOOTH=1',\n\n            ## dart: PermissionGroup.appTrackingTransparency\n            # 'PERMISSION_APP_TRACKING_TRANSPARENCY=1',\n\n            ## dart: PermissionGroup.criticalAlerts\n            # 'PERMISSION_CRITICAL_ALERTS=1'\n          ]\n\n        end\n        # End of the permission_handler configuration\n  end\nend\n"
  },
  {
    "path": "ios/Runner/AppDelegate.swift",
    "content": "import Flutter\nimport UIKit\n\n@main\n@objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelegate {\n  override func application(\n    _ application: UIApplication,\n    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?\n  ) -> Bool {\n    application.applicationSupportsShakeToEdit = false // Disable shake to undo\n    return super.application(application, didFinishLaunchingWithOptions: launchOptions)\n  }\n\n  func didInitializeImplicitFlutterEngine(_ engineBridge: FlutterImplicitEngineBridge) {\n    GeneratedPluginRegistrant.register(with: engineBridge.pluginRegistry)\n  }\n}\n"
  },
  {
    "path": "ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\"images\":[{\"size\":\"20x20\",\"idiom\":\"iphone\",\"filename\":\"Icon-App-20x20@2x.png\",\"scale\":\"2x\"},{\"size\":\"20x20\",\"idiom\":\"iphone\",\"filename\":\"Icon-App-20x20@3x.png\",\"scale\":\"3x\"},{\"size\":\"29x29\",\"idiom\":\"iphone\",\"filename\":\"Icon-App-29x29@1x.png\",\"scale\":\"1x\"},{\"size\":\"29x29\",\"idiom\":\"iphone\",\"filename\":\"Icon-App-29x29@2x.png\",\"scale\":\"2x\"},{\"size\":\"29x29\",\"idiom\":\"iphone\",\"filename\":\"Icon-App-29x29@3x.png\",\"scale\":\"3x\"},{\"size\":\"40x40\",\"idiom\":\"iphone\",\"filename\":\"Icon-App-40x40@2x.png\",\"scale\":\"2x\"},{\"size\":\"40x40\",\"idiom\":\"iphone\",\"filename\":\"Icon-App-40x40@3x.png\",\"scale\":\"3x\"},{\"size\":\"57x57\",\"idiom\":\"iphone\",\"filename\":\"Icon-App-57x57@1x.png\",\"scale\":\"1x\"},{\"size\":\"57x57\",\"idiom\":\"iphone\",\"filename\":\"Icon-App-57x57@2x.png\",\"scale\":\"2x\"},{\"size\":\"60x60\",\"idiom\":\"iphone\",\"filename\":\"Icon-App-60x60@2x.png\",\"scale\":\"2x\"},{\"size\":\"60x60\",\"idiom\":\"iphone\",\"filename\":\"Icon-App-60x60@3x.png\",\"scale\":\"3x\"},{\"size\":\"20x20\",\"idiom\":\"ipad\",\"filename\":\"Icon-App-20x20@1x.png\",\"scale\":\"1x\"},{\"size\":\"20x20\",\"idiom\":\"ipad\",\"filename\":\"Icon-App-20x20@2x.png\",\"scale\":\"2x\"},{\"size\":\"29x29\",\"idiom\":\"ipad\",\"filename\":\"Icon-App-29x29@1x.png\",\"scale\":\"1x\"},{\"size\":\"29x29\",\"idiom\":\"ipad\",\"filename\":\"Icon-App-29x29@2x.png\",\"scale\":\"2x\"},{\"size\":\"40x40\",\"idiom\":\"ipad\",\"filename\":\"Icon-App-40x40@1x.png\",\"scale\":\"1x\"},{\"size\":\"40x40\",\"idiom\":\"ipad\",\"filename\":\"Icon-App-40x40@2x.png\",\"scale\":\"2x\"},{\"size\":\"50x50\",\"idiom\":\"ipad\",\"filename\":\"Icon-App-50x50@1x.png\",\"scale\":\"1x\"},{\"size\":\"50x50\",\"idiom\":\"ipad\",\"filename\":\"Icon-App-50x50@2x.png\",\"scale\":\"2x\"},{\"size\":\"72x72\",\"idiom\":\"ipad\",\"filename\":\"Icon-App-72x72@1x.png\",\"scale\":\"1x\"},{\"size\":\"72x72\",\"idiom\":\"ipad\",\"filename\":\"Icon-App-72x72@2x.png\",\"scale\":\"2x\"},{\"size\":\"76x76\",\"idiom\":\"ipad\",\"filename\":\"Icon-App-76x76@1x.png\",\"scale\":\"1x\"},{\"size\":\"76x76\",\"idiom\":\"ipad\",\"filename\":\"Icon-App-76x76@2x.png\",\"scale\":\"2x\"},{\"size\":\"83.5x83.5\",\"idiom\":\"ipad\",\"filename\":\"Icon-App-83.5x83.5@2x.png\",\"scale\":\"2x\"},{\"size\":\"1024x1024\",\"idiom\":\"ios-marketing\",\"filename\":\"Icon-App-1024x1024@1x.png\",\"scale\":\"1x\"}],\"info\":{\"version\":1,\"author\":\"xcode\"}}"
  },
  {
    "path": "ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"background.png\",\n      \"idiom\" : \"universal\"\n    },\n    {\n      \"appearances\" : [\n        {\n          \"appearance\" : \"luminosity\",\n          \"value\" : \"dark\"\n        }\n      ],\n      \"filename\" : \"darkbackground.png\",\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"LaunchImage.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"appearances\" : [\n        {\n          \"appearance\" : \"luminosity\",\n          \"value\" : \"dark\"\n        }\n      ],\n      \"filename\" : \"LaunchImageDark.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"filename\" : \"LaunchImage@2x.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"appearances\" : [\n        {\n          \"appearance\" : \"luminosity\",\n          \"value\" : \"dark\"\n        }\n      ],\n      \"filename\" : \"LaunchImageDark@2x.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"filename\" : \"LaunchImage@3x.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"appearances\" : [\n        {\n          \"appearance\" : \"luminosity\",\n          \"value\" : \"dark\"\n        }\n      ],\n      \"filename\" : \"LaunchImageDark@3x.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\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 clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" image=\"LaunchBackground\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"tWc-Dq-wcI\"/>\n                            <imageView opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" image=\"LaunchImage\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"YRO-k0-Ey4\"></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=\"leading\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"leading\" id=\"3T2-ad-Qdv\"/>\n                            <constraint firstItem=\"tWc-Dq-wcI\" firstAttribute=\"bottom\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"bottom\" id=\"RPx-PI-7Xg\"/>\n                            <constraint firstItem=\"tWc-Dq-wcI\" firstAttribute=\"top\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"top\" id=\"SdS-ul-q2q\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"tWc-Dq-wcI\" secondAttribute=\"trailing\" id=\"Swv-Gf-Rwn\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"YRO-k0-Ey4\" secondAttribute=\"trailing\" id=\"TQA-XW-tRk\"/>\n                            <constraint firstItem=\"YRO-k0-Ey4\" firstAttribute=\"bottom\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"bottom\" id=\"duK-uY-Gun\"/>\n                            <constraint firstItem=\"tWc-Dq-wcI\" firstAttribute=\"leading\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"leading\" id=\"kV7-tw-vXt\"/>\n                            <constraint firstItem=\"YRO-k0-Ey4\" firstAttribute=\"top\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"top\" id=\"xPn-NY-SIU\"/>\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=\"512\" height=\"512\"/>\n        <image name=\"LaunchBackground\" width=\"1\" height=\"1\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "ios/Runner/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"22505\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\" initialViewController=\"BYZ-38-t0r\">\n    <device id=\"retina6_12\" orientation=\"portrait\" appearance=\"light\"/>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"22504\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\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=\"393\" height=\"852\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dkx-z0-nzr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-11\" y=\"-41\"/>\n        </scene>\n    </scenes>\n</document>\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\t<dict>\n\t\t<key>UIApplicationSceneManifest</key>\n\t\t<dict>\n\t\t\t<key>UIApplicationSupportsMultipleScenes</key>\n\t\t\t<false/>\n\t\t\t<key>UISceneConfigurations</key>\n\t\t\t<dict>\n\t\t\t\t<key>UIWindowSceneSessionRoleApplication</key>\n\t\t\t\t<array>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>UISceneClassName</key>\n\t\t\t\t\t\t<string>UIWindowScene</string>\n\t\t\t\t\t\t<key>UISceneDelegateClassName</key>\n\t\t\t\t\t\t<string>FlutterSceneDelegate</string>\n\t\t\t\t\t\t<key>UISceneConfigurationName</key>\n\t\t\t\t\t\t<string>flutter</string>\n\t\t\t\t\t\t<key>UISceneStoryboardFile</key>\n\t\t\t\t\t\t<string>Main</string>\n\t\t\t\t\t</dict>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>FlutterDeepLinkingEnabled</key>\n\t\t<false/>\n\t\t<key>CFBundleDevelopmentRegion</key>\n\t\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t\t<key>CFBundleDisplayName</key>\n\t\t<string>PiliPlus</string>\n\t\t<key>CFBundleExecutable</key>\n\t\t<string>$(EXECUTABLE_NAME)</string>\n\t\t<key>CFBundleIdentifier</key>\n\t\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t\t<key>CFBundleInfoDictionaryVersion</key>\n\t\t<string>6.0</string>\n\t\t<key>CFBundleName</key>\n\t\t<string>PiliPlus</string>\n\t\t<key>CFBundlePackageType</key>\n\t\t<string>APPL</string>\n\t\t<key>CFBundleShortVersionString</key>\n\t\t<string>$(FLUTTER_BUILD_NAME)</string>\n\t\t<key>CFBundleSignature</key>\n\t\t<string>????</string>\n\t\t<key>CFBundleVersion</key>\n\t\t<string>$(FLUTTER_BUILD_NUMBER)</string>\n\t\t<key>LSRequiresIPhoneOS</key>\n\t\t<true/>\n\t\t<key>UILaunchStoryboardName</key>\n\t\t<string>LaunchScreen</string>\n\t\t<key>UIMainStoryboardFile</key>\n\t\t<string>Main</string>\n\t\t<key>UISupportedInterfaceOrientations</key>\n\t\t<array>\n\t\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t\t</array>\n\t\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t\t<array>\n\t\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t\t</array>\n\t\t<key>UIViewControllerBasedStatusBarAppearance</key>\n\t\t<true/>\n\t\t<key>CADisableMinimumFrameDurationOnPhone</key>\n\t\t<true/>\n\t\t<key>UIApplicationSupportsIndirectInputEvents</key>\n\t\t<true/>\n\t\t<key>NSPhotoLibraryUsageDescription</key>\n\t\t<string>请允许APP保存图片到相册</string>\n\t\t<key>NSCameraUsageDescription</key>\n\t\t<string>App需要您的同意,才能访问相册</string>\n\t\t<key>NSAppleMusicUsageDescription</key>\n\t\t<string>App需要您的同意,才能访问媒体资料库</string>\n\t\t<key>LSApplicationQueriesSchemes</key>\n\t\t<array>\n\t\t\t<string>https</string>\n\t\t\t<string>http</string>\n\t\t</array>\n\t\t<!-- Add Scheme related information -->\n\t\t<key>CFBundleURLTypes</key>\n\t\t<array>\n\t\t\t<dict>\n\t\t\t\t<key>CFBundleURLName</key>\n\t\t\t\t<string></string>\n\t\t\t\t<key>CFBundleURLSchemes</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>http</string>\n\t\t\t\t\t<string>https</string>\n\t\t\t\t</array>\n\t\t\t\t<key>CFBundleURLTypes</key>\n\t\t\t\t<array>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>CFBundleURLName</key>\n\t\t\t\t\t\t<string></string>\n\t\t\t\t\t\t<key>CFBundleURLSchemes</key>\n\t\t\t\t\t\t<array>\n\t\t\t\t\t\t\t<string>m.bilibili.com</string>\n\t\t\t\t\t\t\t<string>bilibili.com</string>\n\t\t\t\t\t\t\t<string>www.bilibili.com</string>\n\t\t\t\t\t\t\t<string>bangumi.bilibili.com</string>\n\t\t\t\t\t\t\t<string>bilibili.cn</string>\n\t\t\t\t\t\t\t<string>www.bilibili.cn</string>\n\t\t\t\t\t\t\t<string>bangumi.bilibili.cn</string>\n\t\t\t\t\t\t\t<string>bilibili.tv</string>\n\t\t\t\t\t\t\t<string>www.bilibili.tv</string>\n\t\t\t\t\t\t\t<string>bangumi.bilibili.tv</string>\n\t\t\t\t\t\t\t<string>miniapp.bilibili.com</string>\n\t\t\t\t\t\t\t<string>live.bilibili.com</string>\n\t\t\t\t\t\t</array>\n\t\t\t\t\t</dict>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t\t<!-- 当其他应用程序或系统通过 bilibili -->\n\t\t\t<dict>\n\t\t\t\t<key>CFBundleURLName</key>\n\t\t\t\t<string>bilibili</string>\n\t\t\t\t<key>CFBundleURLSchemes</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>bilibili</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</array>\n\t\t<key>UIBackgroundModes</key>\n\t\t<array>\n\t\t\t<string>audio</string>\n\t\t</array>\n\t\t<key>UIStatusBarHidden</key>\n\t\t<false/>\n\t</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\t2431C9E3151C7449D0D1C0F4 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63F2789C7C1DF3CD2B80A936 /* Pods_Runner.framework */; };\n\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };\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/* End PBXBuildFile 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\t32E2926120A1A8DC0E629BC6 /* 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\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = \"<group>\"; };\n\t\t3DA6FBBC55FDD1E3261D6D67 /* 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\t51DB54E5BB66F8608325A082 /* 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\t63F2789C7C1DF3CD2B80A936 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };\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/* 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\t2431C9E3151C7449D0D1C0F4 /* 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\t31399C6148E878051E614578 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t63F2789C7C1DF3CD2B80A936 /* 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\tEFBDDDF3F822865E6D1BB6D7 /* Pods */,\n\t\t\t\t31399C6148E878051E614578 /* 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);\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);\n\t\t\tpath = Runner;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tEFBDDDF3F822865E6D1BB6D7 /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t51DB54E5BB66F8608325A082 /* Pods-Runner.debug.xcconfig */,\n\t\t\t\t3DA6FBBC55FDD1E3261D6D67 /* Pods-Runner.release.xcconfig */,\n\t\t\t\t32E2926120A1A8DC0E629BC6 /* 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\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\t67CCBB29D5A20A144E2BDF7D /* [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\t5A372F23F3CF0118D6526BAC /* [CP] Embed Pods Frameworks */,\n\t\t\t\tB78851E7B29A4C3961AC483C /* [CP] Copy Pods Resources */,\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\tLastUpgradeCheck = 1510;\n\t\t\t\tORGANIZATIONNAME = \"\";\n\t\t\t\tTargetAttributes = {\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);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\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\t5A372F23F3CF0118D6526BAC /* [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\t67CCBB29D5A20A144E2BDF7D /* [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\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\tB78851E7B29A4C3961AC483C /* [CP] Copy Pods Resources */ = {\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-resources-${CONFIGURATION}-input-files.xcfilelist\",\n\t\t\t);\n\t\t\tname = \"[CP] Copy Pods Resources\";\n\t\t\toutputFileListPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${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-resources.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t97C146EA1CF9000F007C117D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\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 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\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\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 = 13.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\tDEVELOPMENT_TEAM = \"\";\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.example.piliplus;\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\t97C147031CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\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\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 = 13.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\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\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 = 13.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\tDEVELOPMENT_TEAM = \"\";\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.example.piliplus;\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\tDEVELOPMENT_TEAM = \"\";\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.example.piliplus;\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\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      </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      enableGPUValidationMode = \"1\"\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": "lib/build_config.dart",
    "content": "abstract final class BuildConfig {\n  static const int versionCode = int.fromEnvironment(\n    'pili.code',\n    defaultValue: 1,\n  );\n  static const String versionName = String.fromEnvironment(\n    'pili.name',\n    defaultValue: 'SNAPSHOT',\n  );\n\n  static const int buildTime = int.fromEnvironment('pili.time');\n  static const String commitHash = String.fromEnvironment(\n    'pili.hash',\n    defaultValue: 'N/A',\n  );\n}\n"
  },
  {
    "path": "lib/common/constants.dart",
    "content": "import 'package:flutter/material.dart';\n\nabstract final class StyleString {\n  static const double cardSpace = 8;\n  static const double safeSpace = 12;\n  static const BorderRadius mdRadius = BorderRadius.all(imgRadius);\n  static const Radius imgRadius = Radius.circular(10);\n  static const double aspectRatio = 16 / 10;\n  static const double aspectRatio16x9 = 16 / 9;\n  static const double imgMaxRatio = 2.6;\n  static const bottomSheetRadius = BorderRadius.vertical(\n    top: Radius.circular(18),\n  );\n  static const dialogFixedConstraints = BoxConstraints(\n    minWidth: 420,\n    maxWidth: 420,\n  );\n  static const topBarHeight = 52.0;\n  static const buttonStyle = ButtonStyle(\n    visualDensity: VisualDensity(\n      horizontal: -2,\n      vertical: -1.25,\n    ),\n    tapTargetSize: .shrinkWrap,\n  );\n}\n\nabstract final class Constants {\n  static const appName = 'PiliPlus';\n  static const sourceCodeUrl = 'https://github.com/bggRGjQaUbCoE/PiliPlus';\n\n  // 27eb53fc9058f8c3  移动端 Android\n  // 4409e2ce8ffd12b8  HD版\n  static const String appKey = 'dfca71928277209b';\n  // 59b43e04ad6965f34319062b478f83dd TV端\n  static const String appSec = 'b5475a8825547a4fc26c7d518eaaa02e';\n  // static const String thirdSign = '04224646d1fea004e79606d3b038c84a';\n  // static const String thirdApi =\n  //     'https://www.mcbbs.net/template/mcbbs/image/special_photo_bg.png';\n\n  static const String traceId =\n      '11111111111111111111111111111111:1111111111111111:0:0';\n  static const String userAgent =\n      'Mozilla/5.0 BiliDroid/2.0.1 (bbcallen@gmail.com) os/android model/android_hd mobi_app/android_hd build/2001100 channel/master innerVer/2001100 osVer/15 network/2';\n  static const String statistics =\n      '{\"appId\":5,\"platform\":3,\"version\":\"2.0.1\",\"abtest\":\"\"}';\n  // 请求时会自动encodeComponent\n\n  // app\n  static const String userAgentApp =\n      'Mozilla/5.0 BiliDroid/8.43.0 (bbcallen@gmail.com) os/android model/android mobi_app/android build/8430300 channel/master innerVer/8430300 osVer/15 network/2';\n\n  static const String statisticsApp =\n      '{\"appId\":1,\"platform\":3,\"version\":\"8.43.0\",\"abtest\":\"\"}';\n\n  static const baseHeaders = {\n    // 'referer': HttpString.baseUrl,\n    'env': 'prod',\n    'app-key': 'android64',\n    'x-bili-aurora-zone': 'sh001',\n  };\n\n  static final urlRegex = RegExp(\n    r'https?://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]',\n  );\n\n  static const goodsUrlPrefix = \"https://gaoneng.bilibili.com/tetris\";\n\n  // 'itemOpusStyle,opusBigCover,onlyfansVote,endFooterHidden,decorationCard,onlyfansAssetsV2,ugcDelete,onlyfansQaCard,editable,opusPrivateVisible,avatarAutoTheme,sunflowerStyle,cardsEnhance,eva3CardOpus,eva3CardVideo,eva3CardComment,eva3CardVote,eva3CardUser'\n  static const dynFeatures = 'itemOpusStyle,listOnlyfans,onlyfansQaCard';\n\n  // 超分辨率滤镜\n  static const List<String> mpvAnime4KShaders = [\n    'Anime4K_Clamp_Highlights.glsl',\n    'Anime4K_Restore_CNN_VL.glsl',\n    'Anime4K_Upscale_CNN_x2_VL.glsl',\n    'Anime4K_AutoDownscalePre_x2.glsl',\n    'Anime4K_AutoDownscalePre_x4.glsl',\n    'Anime4K_Upscale_CNN_x2_M.glsl',\n  ];\n\n  // 超分辨率滤镜 (轻量)\n  static const mpvAnime4KShadersLite = [\n    'Anime4K_Clamp_Highlights.glsl',\n    'Anime4K_Restore_CNN_M.glsl',\n    'Anime4K_Restore_CNN_S.glsl',\n    'Anime4K_Upscale_CNN_x2_M.glsl',\n    'Anime4K_AutoDownscalePre_x2.glsl',\n    'Anime4K_AutoDownscalePre_x4.glsl',\n    'Anime4K_Upscale_CNN_x2_S.glsl',\n  ];\n\n  //内容来自 https://passport.bilibili.com/web/generic/country/list\n  static const internationalDialingPrefix = [\n    (id: 1, cname: \"中国大陆\", countryId: 86),\n    (id: 5, cname: \"中国香港特别行政区\", countryId: 852),\n    (id: 2, cname: \"中国澳门特别行政区\", countryId: 853),\n    (id: 3, cname: \"中国台湾\", countryId: 886),\n    (id: 4, cname: \"美国\", countryId: 1),\n    (id: 6, cname: \"比利时\", countryId: 32),\n    (id: 7, cname: \"澳大利亚\", countryId: 61),\n    (id: 8, cname: \"法国\", countryId: 33),\n    (id: 9, cname: \"加拿大\", countryId: 1),\n    (id: 10, cname: \"日本\", countryId: 81),\n    (id: 11, cname: \"新加坡\", countryId: 65),\n    (id: 12, cname: \"韩国\", countryId: 82),\n    (id: 13, cname: \"马来西亚\", countryId: 60),\n    (id: 14, cname: \"英国\", countryId: 44),\n    (id: 15, cname: \"意大利\", countryId: 39),\n    (id: 16, cname: \"德国\", countryId: 49),\n    (id: 18, cname: \"俄罗斯\", countryId: 7),\n    (id: 19, cname: \"新西兰\", countryId: 64),\n    (id: 153, cname: \"瓦利斯群岛和富图纳群岛\", countryId: 1681),\n    (id: 152, cname: \"葡萄牙\", countryId: 351),\n    (id: 151, cname: \"帕劳\", countryId: 680),\n    (id: 150, cname: \"诺福克岛\", countryId: 672),\n    (id: 149, cname: \"挪威\", countryId: 47),\n    (id: 148, cname: \"纽埃岛\", countryId: 683),\n    (id: 147, cname: \"尼日利亚\", countryId: 234),\n    (id: 146, cname: \"尼日尔\", countryId: 227),\n    (id: 145, cname: \"尼加拉瓜\", countryId: 505),\n    (id: 144, cname: \"尼泊尔\", countryId: 977),\n    (id: 143, cname: \"瑙鲁\", countryId: 674),\n    (id: 154, cname: \"格鲁吉亚\", countryId: 995),\n    (id: 155, cname: \"瑞典\", countryId: 46),\n    (id: 165, cname: \"沙特阿拉伯\", countryId: 966),\n    (id: 164, cname: \"桑给巴尔岛\", countryId: 259),\n    (id: 163, cname: \"塞舌尔共和国\", countryId: 248),\n    (id: 162, cname: \"塞浦路斯\", countryId: 357),\n    (id: 161, cname: \"塞内加尔\", countryId: 221),\n    (id: 160, cname: \"塞拉利昂\", countryId: 232),\n    (id: 159, cname: \"萨摩亚，东部\", countryId: 684),\n    (id: 158, cname: \"萨摩亚，西部\", countryId: 685),\n    (id: 157, cname: \"萨尔瓦多\", countryId: 503),\n    (id: 156, cname: \"瑞士\", countryId: 41),\n    (id: 166, cname: \"圣多美和普林西比\", countryId: 239),\n    (id: 142, cname: \"塞尔维亚\", countryId: 381),\n    (id: 141, cname: \"南非\", countryId: 27),\n    (id: 128, cname: \"毛里塔尼亚\", countryId: 222),\n    (id: 127, cname: \"毛里求斯\", countryId: 230),\n    (id: 126, cname: \"马歇尔岛\", countryId: 692),\n    (id: 125, cname: \"马提尼克岛\", countryId: 596),\n    (id: 124, cname: \"马其顿\", countryId: 389),\n    (id: 123, cname: \"马里亚纳岛\", countryId: 1670),\n    (id: 122, cname: \"马里\", countryId: 223),\n    (id: 121, cname: \"马拉维\", countryId: 265),\n    (id: 120, cname: \"马耳他\", countryId: 356),\n    (id: 119, cname: \"马尔代夫\", countryId: 960),\n    (id: 129, cname: \"蒙古\", countryId: 976),\n    (id: 130, cname: \"蒙特塞拉特岛\", countryId: 1664),\n    (id: 140, cname: \"纳米比亚\", countryId: 264),\n    (id: 139, cname: \"墨西哥\", countryId: 52),\n    (id: 138, cname: \"莫桑比克\", countryId: 258),\n    (id: 137, cname: \"摩纳哥\", countryId: 377),\n    (id: 136, cname: \"摩洛哥\", countryId: 212),\n    (id: 135, cname: \"摩尔多瓦\", countryId: 373),\n    (id: 134, cname: \"缅甸\", countryId: 95),\n    (id: 133, cname: \"密克罗尼西亚\", countryId: 691),\n    (id: 132, cname: \"秘鲁\", countryId: 51),\n    (id: 131, cname: \"孟加拉国\", countryId: 880),\n    (id: 118, cname: \"马达加斯加\", countryId: 261),\n    (id: 167, cname: \"圣卢西亚\", countryId: 1784),\n    (id: 216, cname: \"智利\", countryId: 56),\n    (id: 203, cname: \"牙买加\", countryId: 1876),\n    (id: 202, cname: \"叙利亚\", countryId: 963),\n    (id: 201, cname: \"匈牙利\", countryId: 36),\n    (id: 200, cname: \"科特迪瓦\", countryId: 225),\n    (id: 199, cname: \"希腊\", countryId: 30),\n    (id: 198, cname: \"西班牙\", countryId: 34),\n    (id: 197, cname: \"乌兹别克斯坦\", countryId: 998),\n    (id: 196, cname: \"乌拉圭\", countryId: 598),\n    (id: 195, cname: \"乌克兰\", countryId: 380),\n    (id: 194, cname: \"乌干达\", countryId: 256),\n    (id: 204, cname: \"亚美尼亚\", countryId: 374),\n    (id: 205, cname: \"也门\", countryId: 967),\n    (id: 215, cname: \"直布罗陀\", countryId: 350),\n    (id: 214, cname: \"乍得\", countryId: 235),\n    (id: 213, cname: \"赞比亚\", countryId: 260),\n    (id: 212, cname: \"越南\", countryId: 84),\n    (id: 211, cname: \"约旦\", countryId: 962),\n    (id: 210, cname: \"印尼\", countryId: 62),\n    (id: 209, cname: \"印度\", countryId: 91),\n    (id: 208, cname: \"以色列\", countryId: 972),\n    (id: 207, cname: \"伊朗\", countryId: 98),\n    (id: 206, cname: \"伊拉克\", countryId: 964),\n    (id: 193, cname: \"文莱\", countryId: 673),\n    (id: 192, cname: \"委内瑞拉\", countryId: 58),\n    (id: 191, cname: \"维珍群岛(英属)\", countryId: 1284),\n    (id: 178, cname: \"泰国\", countryId: 66),\n    (id: 177, cname: \"索马里\", countryId: 252),\n    (id: 176, cname: \"所罗门群岛\", countryId: 677),\n    (id: 175, cname: \"苏里南\", countryId: 597),\n    (id: 174, cname: \"苏丹\", countryId: 249),\n    (id: 173, cname: \"斯威士兰\", countryId: 268),\n    (id: 172, cname: \"斯洛文尼亚\", countryId: 386),\n    (id: 171, cname: \"斯洛伐克\", countryId: 421),\n    (id: 170, cname: \"斯里兰卡\", countryId: 94),\n    (id: 169, cname: \"圣皮埃尔和密克隆群岛\", countryId: 508),\n    (id: 179, cname: \"坦桑尼亚\", countryId: 255),\n    (id: 180, cname: \"汤加\", countryId: 676),\n    (id: 190, cname: \"维珍群岛(美属)\", countryId: 1340),\n    (id: 189, cname: \"瓦努阿图\", countryId: 678),\n    (id: 188, cname: \"托克劳岛\", countryId: 690),\n    (id: 187, cname: \"土库曼斯坦\", countryId: 993),\n    (id: 186, cname: \"土耳其\", countryId: 90),\n    (id: 185, cname: \"图瓦卢\", countryId: 688),\n    (id: 184, cname: \"突尼斯\", countryId: 216),\n    (id: 183, cname: \"阿森松岛\", countryId: 247),\n    (id: 182, cname: \"特立尼达和多巴哥\", countryId: 1868),\n    (id: 181, cname: \"特克斯和凯科斯\", countryId: 1649),\n    (id: 168, cname: \"圣马力诺\", countryId: 378),\n    (id: 67, cname: \"法属圭亚那\", countryId: 594),\n    (id: 54, cname: \"不丹\", countryId: 975),\n    (id: 53, cname: \"博茨瓦纳\", countryId: 267),\n    (id: 52, cname: \"伯利兹\", countryId: 501),\n    (id: 51, cname: \"玻利维亚\", countryId: 591),\n    (id: 50, cname: \"波兰\", countryId: 48),\n    (id: 49, cname: \"波黑\", countryId: 387),\n    (id: 48, cname: \"波多黎各\", countryId: 1787),\n    (id: 47, cname: \"冰岛\", countryId: 354),\n    (id: 46, cname: \"贝宁\", countryId: 229),\n    (id: 45, cname: \"保加利亚\", countryId: 359),\n    (id: 55, cname: \"布基纳法索\", countryId: 226),\n    (id: 56, cname: \"布隆迪\", countryId: 257),\n    (id: 66, cname: \"法属波利尼西亚\", countryId: 689),\n    (id: 65, cname: \"法罗岛\", countryId: 298),\n    (id: 64, cname: \"厄立特里亚\", countryId: 291),\n    (id: 63, cname: \"厄瓜多尔\", countryId: 593),\n    (id: 62, cname: \"多米尼加代表\", countryId: 1809),\n    (id: 61, cname: \"多米尼加\", countryId: 1767),\n    (id: 60, cname: \"多哥\", countryId: 228),\n    (id: 59, cname: \"迪戈加西亚岛\", countryId: 246),\n    (id: 58, cname: \"丹麦\", countryId: 45),\n    (id: 57, cname: \"赤道几内亚\", countryId: 240),\n    (id: 44, cname: \"百慕大群岛\", countryId: 1441),\n    (id: 43, cname: \"白俄罗斯\", countryId: 375),\n    (id: 42, cname: \"巴西\", countryId: 55),\n    (id: 29, cname: \"爱尔兰\", countryId: 353),\n    (id: 28, cname: \"埃塞俄比亚\", countryId: 251),\n    (id: 27, cname: \"埃及\", countryId: 20),\n    (id: 26, cname: \"阿塞拜疆\", countryId: 994),\n    (id: 25, cname: \"阿曼\", countryId: 968),\n    (id: 24, cname: \"阿联酋\", countryId: 971),\n    (id: 23, cname: \"阿根廷\", countryId: 54),\n    (id: 22, cname: \"阿富汗\", countryId: 93),\n    (id: 21, cname: \"阿尔及利亚\", countryId: 213),\n    (id: 20, cname: \"阿尔巴尼亚\", countryId: 355),\n    (id: 30, cname: \"爱沙尼亚\", countryId: 372),\n    (id: 31, cname: \"安道尔\", countryId: 376),\n    (id: 41, cname: \"巴拿马\", countryId: 507),\n    (id: 40, cname: \"巴林\", countryId: 973),\n    (id: 39, cname: \"巴拉圭\", countryId: 595),\n    (id: 38, cname: \"巴基斯坦\", countryId: 92),\n    (id: 37, cname: \"巴哈马群岛\", countryId: 1242),\n    (id: 36, cname: \"巴布亚新几内亚\", countryId: 675),\n    (id: 35, cname: \"巴巴多斯\", countryId: 1246),\n    (id: 34, cname: \"奥地利\", countryId: 43),\n    (id: 33, cname: \"安提瓜岛和巴布达\", countryId: 1268),\n    (id: 32, cname: \"安哥拉\", countryId: 244),\n    (id: 68, cname: \"非洲中部\", countryId: 236),\n    (id: 117, cname: \"罗马尼亚\", countryId: 40),\n    (id: 104, cname: \"科威特\", countryId: 965),\n    (id: 103, cname: \"科摩罗\", countryId: 269),\n    (id: 102, cname: \"开曼群岛\", countryId: 1345),\n    (id: 101, cname: \"卡塔尔\", countryId: 974),\n    (id: 100, cname: \"喀麦隆\", countryId: 237),\n    (id: 99, cname: \"聚会岛\", countryId: 262),\n    (id: 98, cname: \"津巴布韦\", countryId: 263),\n    (id: 97, cname: \"捷克\", countryId: 420),\n    (id: 96, cname: \"柬埔寨\", countryId: 855),\n    (id: 95, cname: \"加蓬\", countryId: 241),\n    (id: 105, cname: \"克罗地亚\", countryId: 385),\n    (id: 106, cname: \"肯尼亚\", countryId: 254),\n    (id: 116, cname: \"卢旺达\", countryId: 250),\n    (id: 115, cname: \"卢森堡\", countryId: 352),\n    (id: 114, cname: \"利比亚\", countryId: 218),\n    (id: 113, cname: \"利比里亚\", countryId: 231),\n    (id: 112, cname: \"立陶宛\", countryId: 370),\n    (id: 111, cname: \"黎巴嫩\", countryId: 961),\n    (id: 110, cname: \"老挝\", countryId: 856),\n    (id: 109, cname: \"莱索托\", countryId: 266),\n    (id: 108, cname: \"拉脱维亚\", countryId: 371),\n    (id: 107, cname: \"库克岛\", countryId: 682),\n    (id: 94, cname: \"加纳\", countryId: 233),\n    (id: 93, cname: \"几内亚比绍\", countryId: 245),\n    (id: 92, cname: \"几内亚\", countryId: 224),\n    (id: 79, cname: \"格林纳达\", countryId: 1473),\n    (id: 78, cname: \"哥斯达黎加\", countryId: 506),\n    (id: 77, cname: \"哥伦比亚\", countryId: 57),\n    (id: 76, cname: \"刚果(金)\", countryId: 243),\n    (id: 75, cname: \"刚果\", countryId: 242),\n    (id: 74, cname: \"冈比亚\", countryId: 220),\n    (id: 73, cname: \"福克兰岛\", countryId: 500),\n    (id: 72, cname: \"佛得角\", countryId: 238),\n    (id: 71, cname: \"芬兰\", countryId: 358),\n    (id: 70, cname: \"斐济\", countryId: 679),\n    (id: 80, cname: \"格陵兰岛\", countryId: 299),\n    (id: 81, cname: \"古巴\", countryId: 53),\n    (id: 91, cname: \"吉尔吉斯斯坦\", countryId: 996),\n    (id: 90, cname: \"吉布提\", countryId: 253),\n    (id: 89, cname: \"基里巴斯\", countryId: 686),\n    (id: 88, cname: \"维克岛\", countryId: 1808),\n    (id: 87, cname: \"洪都拉斯\", countryId: 504),\n    (id: 86, cname: \"荷兰\", countryId: 31),\n    (id: 85, cname: \"朝鲜\", countryId: 850),\n    (id: 84, cname: \"海地\", countryId: 509),\n    (id: 83, cname: \"关岛\", countryId: 1671),\n    (id: 82, cname: \"瓜德罗普岛\", countryId: 590),\n    (id: 69, cname: \"菲律宾\", countryId: 63),\n  ];\n}\n"
  },
  {
    "path": "lib/common/skeleton/dynamic_card.dart",
    "content": "import 'package:PiliPlus/common/skeleton/skeleton.dart';\nimport 'package:PiliPlus/utils/global_data.dart';\nimport 'package:flutter/material.dart';\n\nclass DynamicCardSkeleton extends StatelessWidget {\n  const DynamicCardSkeleton({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    final ThemeData theme = Theme.of(context);\n    final color = theme.colorScheme.onInverseSurface;\n    final buttonStyle = TextButton.styleFrom(\n      tapTargetSize: .padded,\n      padding: const .symmetric(horizontal: 15),\n      foregroundColor: theme.colorScheme.outline.withValues(\n        alpha: 0.2,\n      ),\n    );\n    return Skeleton(\n      child: Container(\n        padding: const EdgeInsets.only(left: 12, right: 12, top: 12),\n        decoration: BoxDecoration(\n          border: Border(\n            bottom: BorderSide(\n              width: 8,\n              color: theme.dividerColor.withValues(alpha: 0.05),\n            ),\n          ),\n        ),\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            Row(\n              children: [\n                Container(\n                  width: 40,\n                  height: 40,\n                  decoration: BoxDecoration(\n                    color: color,\n                    borderRadius: const BorderRadius.all(Radius.circular(20)),\n                  ),\n                ),\n                const SizedBox(width: 10),\n                Column(\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    Container(\n                      color: color,\n                      width: 100,\n                      height: 13,\n                      margin: const EdgeInsets.only(bottom: 5),\n                    ),\n                    Container(\n                      color: color,\n                      width: 50,\n                      height: 11,\n                    ),\n                  ],\n                ),\n              ],\n            ),\n            const SizedBox(height: 10),\n            Container(\n              color: color,\n              width: double.infinity,\n              height: 13,\n              margin: const EdgeInsets.only(bottom: 7),\n            ),\n            Container(\n              color: color,\n              width: double.infinity,\n              height: 13,\n              margin: const EdgeInsets.only(bottom: 7),\n            ),\n            Container(\n              color: color,\n              width: 300,\n              height: 13,\n              margin: const EdgeInsets.only(bottom: 7),\n            ),\n            Container(\n              color: color,\n              width: 250,\n              height: 13,\n              margin: const EdgeInsets.only(bottom: 7),\n            ),\n            Container(\n              color: color,\n              width: 100,\n              height: 13,\n              margin: const EdgeInsets.only(bottom: 7),\n            ),\n            if (GlobalData().dynamicsWaterfallFlow) const Spacer(),\n            Row(\n              mainAxisAlignment: MainAxisAlignment.spaceAround,\n              children: const ['转发', '评论', '点赞']\n                  .map(\n                    (e) => TextButton.icon(\n                      onPressed: () {},\n                      icon: const Icon(\n                        Icons.radio_button_unchecked_outlined,\n                        size: 20,\n                      ),\n                      style: buttonStyle,\n                      label: Text(e),\n                    ),\n                  )\n                  .toList(),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/skeleton/fav_pgc_item.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/skeleton/skeleton.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\n\nclass FavPgcItemSkeleton extends StatelessWidget {\n  const FavPgcItemSkeleton({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    final color = Theme.of(context).colorScheme.onInverseSurface;\n    return Skeleton(\n      child: Padding(\n        padding: const EdgeInsets.symmetric(\n          horizontal: StyleString.safeSpace,\n          vertical: 5,\n        ),\n        child: Row(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            AspectRatio(\n              aspectRatio: 3 / 4,\n              child: LayoutBuilder(\n                builder: (context, boxConstraints) {\n                  return Container(\n                    decoration: BoxDecoration(\n                      color: color,\n                      borderRadius: const BorderRadius.all(Radius.circular(4)),\n                    ),\n                    width: boxConstraints.maxWidth,\n                    height: boxConstraints.maxHeight,\n                  );\n                },\n              ),\n            ),\n            const SizedBox(width: 10),\n            Expanded(\n              child: Column(\n                mainAxisSize: MainAxisSize.min,\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  Container(\n                    width: 175,\n                    height: 12,\n                    color: color,\n                  ),\n                  const SizedBox(height: 10),\n                  Container(\n                    width: 55,\n                    height: 11,\n                    color: color,\n                  ),\n                  const SizedBox(height: 5),\n                  Container(\n                    width: 35,\n                    height: 11,\n                    color: color,\n                  ),\n                ],\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/skeleton/media_bangumi.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/skeleton/skeleton.dart';\nimport 'package:flutter/material.dart';\n\nclass MediaPgcSkeleton extends StatefulWidget {\n  const MediaPgcSkeleton({super.key});\n\n  @override\n  State<MediaPgcSkeleton> createState() => _MediaPgcSkeletonState();\n}\n\nclass _MediaPgcSkeletonState extends State<MediaPgcSkeleton> {\n  @override\n  Widget build(BuildContext context) {\n    Color bgColor = Theme.of(context).colorScheme.onInverseSurface;\n    return Skeleton(\n      child: Padding(\n        padding: const EdgeInsets.fromLTRB(\n          StyleString.safeSpace,\n          7,\n          StyleString.safeSpace,\n          7,\n        ),\n        child: Row(\n          children: [\n            Container(\n              width: 111,\n              height: 148,\n              decoration: BoxDecoration(\n                borderRadius: const BorderRadius.all(Radius.circular(6)),\n                color: bgColor,\n              ),\n            ),\n            const SizedBox(width: 10),\n            Expanded(\n              child: SizedBox(\n                height: 148,\n                child: Column(\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    Container(\n                      color: bgColor,\n                      width: 200,\n                      height: 20,\n                      margin: const EdgeInsets.only(bottom: 15),\n                    ),\n                    Container(\n                      color: bgColor,\n                      width: 150,\n                      height: 13,\n                      margin: const EdgeInsets.only(bottom: 5),\n                    ),\n                    Container(\n                      color: bgColor,\n                      width: 150,\n                      height: 13,\n                      margin: const EdgeInsets.only(bottom: 5),\n                    ),\n                    Container(\n                      color: bgColor,\n                      width: 150,\n                      height: 13,\n                    ),\n                    const Spacer(),\n                    Container(\n                      width: 90,\n                      height: 35,\n                      decoration: BoxDecoration(\n                        borderRadius: const BorderRadius.all(\n                          Radius.circular(20),\n                        ),\n                        color: bgColor,\n                      ),\n                    ),\n                  ],\n                ),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/skeleton/msg_feed_sys_msg_.dart",
    "content": "import 'package:PiliPlus/common/skeleton/skeleton.dart';\nimport 'package:flutter/material.dart';\n\nclass MsgFeedSysMsgSkeleton extends StatelessWidget {\n  const MsgFeedSysMsgSkeleton({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    final color = Theme.of(context).colorScheme.onInverseSurface;\n    return Skeleton(\n      child: Padding(\n        padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            Container(\n              width: 125,\n              height: 16,\n              color: color,\n            ),\n            const SizedBox(height: 6),\n            Container(\n              width: double.infinity,\n              height: 12,\n              color: color,\n            ),\n            const SizedBox(height: 4),\n            Container(\n              width: double.infinity,\n              height: 12,\n              color: color,\n            ),\n            const SizedBox(height: 4),\n            Container(\n              width: 100,\n              height: 12,\n              color: color,\n            ),\n            const SizedBox(height: 4),\n            Align(\n              alignment: Alignment.centerRight,\n              child: Container(\n                width: 100,\n                height: 10,\n                color: color,\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/skeleton/msg_feed_top.dart",
    "content": "import 'package:PiliPlus/common/skeleton/skeleton.dart';\nimport 'package:flutter/material.dart';\n\nclass MsgFeedTopSkeleton extends StatelessWidget {\n  const MsgFeedTopSkeleton({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    final color = Theme.of(context).colorScheme.onInverseSurface;\n    return Skeleton(\n      child: ListTile(\n        leading: Container(\n          width: 45,\n          height: 45,\n          decoration: BoxDecoration(\n            shape: BoxShape.circle,\n            color: color,\n          ),\n        ),\n        title: UnconstrainedBox(\n          alignment: Alignment.centerLeft,\n          child: Container(\n            width: 100,\n            height: 11,\n            color: color,\n          ),\n        ),\n        subtitle: Container(\n          color: color,\n          width: 125,\n          height: 11,\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/skeleton/skeleton.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass Skeleton extends StatelessWidget {\n  final Widget child;\n\n  const Skeleton({\n    required this.child,\n    super.key,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    final color = Theme.of(context).colorScheme.surface.withAlpha(10);\n    final shimmerGradient = LinearGradient(\n      colors: [\n        Colors.transparent,\n        color,\n        color,\n        Colors.transparent,\n      ],\n      stops: const [\n        0.1,\n        0.3,\n        0.5,\n        0.7,\n      ],\n      begin: const Alignment(-1.0, -0.3),\n      end: const Alignment(1.0, 0.9),\n      tileMode: TileMode.clamp,\n    );\n    return Shimmer(\n      linearGradient: shimmerGradient,\n      child: ShimmerLoading(\n        isLoading: true,\n        child: child,\n      ),\n    );\n  }\n}\n\nclass Shimmer extends StatefulWidget {\n  static ShimmerState? of(BuildContext context) {\n    return context.findAncestorStateOfType<ShimmerState>();\n  }\n\n  const Shimmer({\n    super.key,\n    required this.linearGradient,\n    this.child,\n  });\n\n  final LinearGradient linearGradient;\n  final Widget? child;\n\n  @override\n  ShimmerState createState() => ShimmerState();\n}\n\nclass ShimmerState extends State<Shimmer> with SingleTickerProviderStateMixin {\n  late AnimationController _shimmerController;\n\n  @override\n  void initState() {\n    super.initState();\n    _shimmerController = AnimationController.unbounded(vsync: this)\n      ..repeat(min: -0.5, max: 1.5, period: const Duration(milliseconds: 1000));\n  }\n\n  @override\n  void dispose() {\n    _shimmerController.dispose();\n    super.dispose();\n  }\n\n  LinearGradient get gradient => LinearGradient(\n    colors: widget.linearGradient.colors,\n    stops: widget.linearGradient.stops,\n    begin: widget.linearGradient.begin,\n    end: widget.linearGradient.end,\n    transform: _SlidingGradientTransform(\n      slidePercent: _shimmerController.value,\n    ),\n  );\n\n  bool get isSized =>\n      (context.findRenderObject() as RenderBox?)?.hasSize ?? false;\n\n  Size get size => (context.findRenderObject() as RenderBox).size;\n\n  Offset getDescendantOffset({\n    required RenderBox descendant,\n    Offset offset = Offset.zero,\n  }) {\n    final shimmerBox = context.findRenderObject() as RenderBox;\n    return descendant.localToGlobal(offset, ancestor: shimmerBox);\n  }\n\n  Listenable get shimmerChanges => _shimmerController;\n\n  @override\n  Widget build(BuildContext context) {\n    return widget.child ?? const SizedBox.shrink();\n  }\n}\n\nclass _SlidingGradientTransform extends GradientTransform {\n  const _SlidingGradientTransform({\n    required this.slidePercent,\n  });\n\n  final double slidePercent;\n\n  @override\n  Matrix4? transform(Rect bounds, {TextDirection? textDirection}) {\n    return Matrix4.translationValues(bounds.width * slidePercent, 0.0, 0.0);\n  }\n}\n\nclass ShimmerLoading extends StatefulWidget {\n  const ShimmerLoading({\n    super.key,\n    required this.isLoading,\n    required this.child,\n  });\n\n  final bool isLoading;\n  final Widget child;\n\n  @override\n  State<ShimmerLoading> createState() => _ShimmerLoadingState();\n}\n\nclass _ShimmerLoadingState extends State<ShimmerLoading> {\n  Listenable? _shimmerChanges;\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    if (_shimmerChanges != null) {\n      _shimmerChanges!.removeListener(_onShimmerChange);\n    }\n    _shimmerChanges = Shimmer.of(context)?.shimmerChanges;\n    if (_shimmerChanges != null) {\n      _shimmerChanges!.addListener(_onShimmerChange);\n    }\n  }\n\n  @override\n  void dispose() {\n    _shimmerChanges?.removeListener(_onShimmerChange);\n    super.dispose();\n  }\n\n  void _onShimmerChange() {\n    if (widget.isLoading) {\n      setState(() {});\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    if (!widget.isLoading) {\n      return widget.child;\n    }\n\n    final shimmer = Shimmer.of(context)!;\n    if (!shimmer.isSized) {\n      return const SizedBox.shrink();\n    }\n    final shimmerSize = shimmer.size;\n    final gradient = shimmer.gradient;\n    final offsetWithinShimmer = shimmer.getDescendantOffset(\n      descendant: context.findRenderObject() as RenderBox,\n    );\n\n    return ShaderMask(\n      blendMode: BlendMode.srcATop,\n      shaderCallback: (bounds) {\n        return gradient.createShader(\n          Rect.fromLTWH(\n            -offsetWithinShimmer.dx,\n            -offsetWithinShimmer.dy,\n            shimmerSize.width,\n            shimmerSize.height,\n          ),\n        );\n      },\n      child: widget.child,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/skeleton/space_opus.dart",
    "content": "import 'package:PiliPlus/common/skeleton/skeleton.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\n\nclass SpaceOpusSkeleton extends StatelessWidget {\n  const SpaceOpusSkeleton({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    final surface = Theme.of(context).colorScheme.onInverseSurface;\n    return Skeleton(\n      child: Card(\n        clipBehavior: Clip.hardEdge,\n        shape: const RoundedRectangleBorder(\n          borderRadius: BorderRadius.all(Radius.circular(6)),\n        ),\n        child: LayoutBuilder(\n          builder: (context, constraints) {\n            return Column(\n              crossAxisAlignment: CrossAxisAlignment.start,\n              children: [\n                Container(\n                  height:\n                      (0.68 + 0.82 * Utils.random.nextDouble()) *\n                      constraints.maxWidth,\n                  color: surface,\n                ),\n                Container(\n                  height: 10,\n                  color: surface,\n                  margin: const EdgeInsets.all(10),\n                  width: constraints.maxWidth * 0.7,\n                ),\n                Container(\n                  height: 10,\n                  color: surface,\n                  margin: const EdgeInsets.only(\n                    left: 10,\n                    right: 10,\n                    bottom: 10,\n                  ),\n                  width: constraints.maxWidth,\n                ),\n              ],\n            );\n          },\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/skeleton/video_card_h.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/skeleton/skeleton.dart';\nimport 'package:flutter/material.dart';\n\nclass VideoCardHSkeleton extends StatelessWidget {\n  const VideoCardHSkeleton({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    final color = Theme.of(context).colorScheme.onInverseSurface;\n    return Skeleton(\n      child: Padding(\n        padding: const EdgeInsets.symmetric(\n          horizontal: StyleString.safeSpace,\n          vertical: 5,\n        ),\n        child: Row(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            AspectRatio(\n              aspectRatio: StyleString.aspectRatio,\n              child: DecoratedBox(\n                decoration: BoxDecoration(\n                  color: color,\n                  borderRadius: StyleString.mdRadius,\n                ),\n              ),\n            ),\n            Expanded(\n              child: Padding(\n                padding: const EdgeInsets.fromLTRB(10, 4, 6, 4),\n                child: Column(\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    Container(\n                      color: color,\n                      width: 200,\n                      height: 11,\n                      margin: const EdgeInsets.only(bottom: 5),\n                    ),\n                    Container(\n                      color: color,\n                      width: 150,\n                      height: 13,\n                    ),\n                    const Spacer(),\n                    Container(\n                      color: color,\n                      width: 100,\n                      height: 13,\n                      margin: const EdgeInsets.only(bottom: 5),\n                    ),\n                    Row(\n                      children: [\n                        Container(\n                          color: color,\n                          width: 40,\n                          height: 13,\n                          margin: const EdgeInsets.only(right: 8),\n                        ),\n                        Container(\n                          color: color,\n                          width: 40,\n                          height: 13,\n                        ),\n                      ],\n                    ),\n                  ],\n                ),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/skeleton/video_card_v.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/skeleton/skeleton.dart';\nimport 'package:flutter/material.dart';\n\nclass VideoCardVSkeleton extends StatelessWidget {\n  const VideoCardVSkeleton({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    final color = Theme.of(context).colorScheme.onInverseSurface;\n    return Skeleton(\n      child: Column(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          AspectRatio(\n            aspectRatio: StyleString.aspectRatio,\n            child: DecoratedBox(\n              decoration: BoxDecoration(\n                color: color,\n                borderRadius: StyleString.mdRadius,\n              ),\n            ),\n          ),\n          Padding(\n            // 多列\n            padding: const EdgeInsets.fromLTRB(4, 5, 6, 6),\n            // 单列\n            // padding: const EdgeInsets.fromLTRB(14, 10, 4, 8),\n            child: Column(\n              crossAxisAlignment: CrossAxisAlignment.start,\n              mainAxisAlignment: MainAxisAlignment.spaceBetween,\n              children: [\n                // const SizedBox(height: 6),\n                Container(\n                  width: 200,\n                  height: 13,\n                  margin: const EdgeInsets.only(bottom: 5),\n                  color: color,\n                ),\n                Container(\n                  width: 150,\n                  height: 13,\n                  margin: const EdgeInsets.only(bottom: 12),\n                  color: color,\n                ),\n                Container(\n                  width: 110,\n                  height: 13,\n                  margin: const EdgeInsets.only(bottom: 5),\n                  color: color,\n                ),\n                Container(\n                  width: 75,\n                  height: 13,\n                  color: color,\n                ),\n              ],\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/skeleton/video_reply.dart",
    "content": "import 'package:PiliPlus/common/skeleton/skeleton.dart';\nimport 'package:flutter/material.dart';\n\nclass VideoReplySkeleton extends StatelessWidget {\n  const VideoReplySkeleton({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    Color bgColor = Theme.of(context).colorScheme.onInverseSurface;\n    return Skeleton(\n      child: Column(\n        children: [\n          Padding(\n            padding: const EdgeInsets.fromLTRB(12, 8, 8, 2),\n            child: Row(\n              children: [\n                ClipOval(\n                  child: Container(\n                    width: 34,\n                    height: 34,\n                    color: bgColor,\n                  ),\n                ),\n                const SizedBox(width: 12),\n                Container(\n                  width: 80,\n                  height: 13,\n                  color: bgColor,\n                ),\n              ],\n            ),\n          ),\n          Padding(\n            padding: const EdgeInsets.only(\n              top: 4,\n              left: 57,\n              right: 6,\n              bottom: 6,\n            ),\n            child: Column(\n              crossAxisAlignment: CrossAxisAlignment.start,\n              children: [\n                Container(\n                  width: 300,\n                  height: 14,\n                  margin: const EdgeInsets.only(bottom: 4),\n                  color: bgColor,\n                ),\n                Container(\n                  width: 180,\n                  height: 14,\n                  margin: const EdgeInsets.only(bottom: 10),\n                  color: bgColor,\n                ),\n                Row(\n                  children: [\n                    Container(\n                      width: 40,\n                      height: 14,\n                      margin: const EdgeInsets.only(bottom: 4),\n                      color: bgColor,\n                    ),\n                    const Spacer(),\n                    Container(\n                      width: 30,\n                      height: 14,\n                      margin: const EdgeInsets.only(bottom: 4),\n                      color: bgColor,\n                    ),\n                    const SizedBox(width: 8),\n                    Container(\n                      width: 30,\n                      height: 14,\n                      margin: const EdgeInsets.only(bottom: 4),\n                      color: bgColor,\n                    ),\n                    const SizedBox(width: 8),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/skeleton/whisper_item.dart",
    "content": "import 'package:PiliPlus/common/skeleton/skeleton.dart';\nimport 'package:flutter/material.dart';\n\nclass WhisperItemSkeleton extends StatelessWidget {\n  const WhisperItemSkeleton({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    final color = Theme.of(context).colorScheme.onInverseSurface;\n    return Skeleton(\n      child: ListTile(\n        leading: Container(\n          width: 45,\n          height: 45,\n          decoration: BoxDecoration(\n            shape: BoxShape.circle,\n            color: color,\n          ),\n        ),\n        title: UnconstrainedBox(\n          alignment: Alignment.centerLeft,\n          child: Container(\n            width: 100,\n            height: 11,\n            color: color,\n          ),\n        ),\n        subtitle: Container(\n          color: color,\n          width: 125,\n          height: 11,\n        ),\n        trailing: Container(\n          color: color,\n          width: 50,\n          height: 11,\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/appbar/appbar.dart",
    "content": "import 'package:PiliPlus/pages/common/multi_select/base.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass MultiSelectAppBarWidget extends StatelessWidget\n    implements PreferredSizeWidget {\n  final MultiSelectBase ctr;\n  final bool? visible;\n  final AppBar child;\n  final List<Widget>? actions;\n\n  const MultiSelectAppBarWidget({\n    super.key,\n    required this.ctr,\n    this.visible,\n    this.actions,\n    required this.child,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    if (visible ?? ctr.enableMultiSelect.value) {\n      final style = TextButton.styleFrom(visualDensity: VisualDensity.compact);\n      final colorScheme = ColorScheme.of(context);\n      return AppBar(\n        bottom: child.bottom,\n        leading: IconButton(\n          tooltip: '取消',\n          onPressed: ctr.handleSelect,\n          icon: const Icon(Icons.close_outlined),\n        ),\n        title: Obx(() => Text('已选: ${ctr.checkedCount}')),\n        actions: [\n          TextButton(\n            style: style,\n            onPressed: () => ctr.handleSelect(checked: true),\n            child: const Text('全选'),\n          ),\n          ...?actions,\n          TextButton(\n            style: style,\n            onPressed: () {\n              if (ctr.checkedCount == 0) {\n                return;\n              }\n              ctr.onRemove();\n            },\n            child: Text(\n              '移除',\n              style: TextStyle(color: colorScheme.error),\n            ),\n          ),\n          const SizedBox(width: 6),\n        ],\n      );\n    }\n    return child;\n  }\n\n  @override\n  Size get preferredSize => child.preferredSize;\n}\n"
  },
  {
    "path": "lib/common/widgets/avatars.dart",
    "content": "import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models/model_owner.dart';\nimport 'package:flutter/material.dart';\n\nWidget avatars({\n  required ColorScheme colorScheme,\n  required Iterable<Owner> users,\n}) {\n  const gap = 6.0;\n  const size = 22.0;\n  const padding = 0.8;\n  const offset = size - gap;\n  const imgSize = size - 2 * padding;\n  if (users.length == 1) {\n    return NetworkImgLayer(\n      src: users.first.face,\n      width: imgSize,\n      height: imgSize,\n      type: .avatar,\n    );\n  } else {\n    final decoration = BoxDecoration(\n      shape: .circle,\n      border: Border.all(color: colorScheme.surface),\n    );\n    return SizedBox(\n      height: size,\n      width: offset * users.length + gap,\n      child: Stack(\n        clipBehavior: .none,\n        children: users.indexed\n            .map(\n              (e) => Positioned(\n                top: 0,\n                bottom: 0,\n                width: size,\n                left: e.$1 * offset,\n                child: DecoratedBox(\n                  decoration: decoration,\n                  child: Padding(\n                    padding: const .all(padding),\n                    child: NetworkImgLayer(\n                      src: e.$2.face,\n                      width: imgSize,\n                      height: imgSize,\n                      type: .avatar,\n                    ),\n                  ),\n                ),\n              ),\n            )\n            .toList(),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/back_detector.dart",
    "content": "import 'package:flutter/gestures.dart' show kBackMouseButton;\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart' show KeyDownEvent;\n\nclass BackDetector extends StatelessWidget {\n  const BackDetector({\n    super.key,\n    required this.onBack,\n    required this.child,\n  });\n\n  final Widget child;\n\n  final VoidCallback onBack;\n\n  @override\n  Widget build(BuildContext context) {\n    return Focus(\n      canRequestFocus: false,\n      onKeyEvent: _onKeyEvent,\n      child: Listener(\n        behavior: .translucent,\n        onPointerDown: _onPointerDown,\n        child: child,\n      ),\n    );\n  }\n\n  KeyEventResult _onKeyEvent(FocusNode node, KeyEvent event) {\n    if (event.logicalKey == .escape && event is KeyDownEvent) {\n      onBack();\n      return .handled;\n    }\n    return .ignored;\n  }\n\n  void _onPointerDown(PointerDownEvent event) {\n    if (event.buttons == kBackMouseButton) {\n      onBack();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/badge.dart",
    "content": "import 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/utils/extension/string_ext.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:flutter/material.dart';\n\nclass PBadge extends StatelessWidget {\n  final String? text;\n\n  final bool isStack;\n  final double? top;\n  final double? right;\n  final double? bottom;\n  final double? left;\n  final EdgeInsets? padding;\n\n  final PBadgeType type;\n  final PBadgeSize size;\n\n  final double fontSize;\n  final bool isBold;\n  final double? textScaleFactor;\n\n  const PBadge({\n    super.key,\n    required this.text,\n    this.top,\n    this.right,\n    this.bottom,\n    this.left,\n    this.type = PBadgeType.primary,\n    this.size = PBadgeSize.medium,\n    this.isStack = true,\n    this.fontSize = 11,\n    this.isBold = true,\n    this.textScaleFactor,\n    this.padding,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    if (text.isNullOrEmpty) {\n      return const SizedBox.shrink();\n    }\n\n    ColorScheme theme = Theme.of(context).colorScheme;\n\n    Color bgColor;\n    Color color;\n    Color borderColor = Colors.transparent;\n\n    switch (type) {\n      case PBadgeType.primary:\n        bgColor = theme.primary;\n        color = theme.onPrimary;\n      case PBadgeType.secondary:\n        bgColor = theme.secondaryContainer.withValues(alpha: 0.5);\n        color = theme.onSecondaryContainer;\n      case PBadgeType.gray:\n        bgColor = Colors.black45;\n        color = Colors.white;\n      case PBadgeType.error:\n        if (theme.isDark) {\n          bgColor = theme.errorContainer;\n          color = theme.onErrorContainer;\n        } else {\n          bgColor = theme.error;\n          color = theme.onError;\n        }\n      case PBadgeType.line_primary:\n        color = theme.primary;\n        bgColor = Colors.transparent;\n        borderColor = theme.primary;\n      case PBadgeType.line_secondary:\n        color = theme.secondary;\n        bgColor = Colors.transparent;\n        borderColor = theme.secondary;\n      case PBadgeType.free:\n        bgColor = theme.freeColor;\n        color = Colors.white;\n      case PBadgeType.shop:\n        bgColor = theme.secondaryContainer.withValues(alpha: 0.5);\n        color = theme.onSurfaceVariant;\n    }\n\n    late EdgeInsets paddingStyle = const EdgeInsets.symmetric(\n      vertical: 2,\n      horizontal: 3,\n    );\n    BorderRadius br = size == PBadgeSize.small\n        ? const BorderRadius.all(Radius.circular(3))\n        : const BorderRadius.all(Radius.circular(4));\n\n    Widget content = Container(\n      padding: padding ?? paddingStyle,\n      decoration: BoxDecoration(\n        borderRadius: br,\n        color: bgColor,\n        border: Border.all(color: borderColor),\n      ),\n      child: Text(\n        text!,\n        textScaler: textScaleFactor != null\n            ? TextScaler.linear(textScaleFactor!)\n            : null,\n        style: TextStyle(\n          height: 1,\n          fontSize: fontSize,\n          color: color,\n          fontWeight: isBold ? FontWeight.bold : null,\n        ),\n        strutStyle: StrutStyle(\n          leading: 0,\n          height: 1,\n          fontSize: fontSize,\n          fontWeight: isBold ? FontWeight.bold : null,\n        ),\n      ),\n    );\n    if (isStack) {\n      return Positioned(\n        top: top,\n        left: left,\n        right: right,\n        bottom: bottom,\n        child: content,\n      );\n    } else {\n      return content;\n    }\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/button/icon_button.dart",
    "content": "import 'package:flutter/material.dart';\n\nWidget iconButton({\n  BuildContext? context,\n  String? tooltip,\n  required Widget icon,\n  required VoidCallback? onPressed,\n  double size = 36,\n  double? iconSize,\n  Color? bgColor,\n  Color? iconColor,\n}) {\n  Color? backgroundColor = bgColor;\n  Color? foregroundColor = iconColor;\n  if (context != null) {\n    final colorScheme = ColorScheme.of(context);\n    backgroundColor = colorScheme.secondaryContainer;\n    foregroundColor = colorScheme.onSecondaryContainer;\n  }\n  return SizedBox(\n    width: size,\n    height: size,\n    child: IconButton(\n      icon: icon,\n      tooltip: tooltip,\n      onPressed: onPressed,\n      style: IconButton.styleFrom(\n        padding: EdgeInsets.zero,\n        iconSize: iconSize ?? size / 2,\n        backgroundColor: backgroundColor,\n        foregroundColor: foregroundColor,\n      ),\n    ),\n  );\n}\n"
  },
  {
    "path": "lib/common/widgets/button/more_btn.dart",
    "content": "import 'package:flutter/material.dart';\n\nWidget moreTextButton({\n  String text = '查看更多',\n  required VoidCallback onTap,\n  EdgeInsets? padding,\n  Color? color,\n}) {\n  Widget child = Text.rich(\n    style: TextStyle(color: color, height: 1),\n    strutStyle: const StrutStyle(leading: 0, height: 1),\n    TextSpan(\n      children: [\n        TextSpan(text: text),\n        WidgetSpan(\n          alignment: PlaceholderAlignment.middle,\n          child: Icon(\n            size: 22,\n            color: color,\n            Icons.keyboard_arrow_right,\n          ),\n        ),\n      ],\n    ),\n  );\n  if (padding != null) {\n    child = Padding(padding: padding, child: child);\n  }\n  return GestureDetector(\n    behavior: HitTestBehavior.opaque,\n    onTap: onTap,\n    child: child,\n  );\n}\n"
  },
  {
    "path": "lib/common/widgets/button/toolbar_icon_button.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass ToolbarIconButton extends StatelessWidget {\n  final VoidCallback? onPressed;\n  final Icon icon;\n  final bool selected;\n  final String? tooltip;\n\n  const ToolbarIconButton({\n    super.key,\n    this.onPressed,\n    required this.icon,\n    required this.selected,\n    this.tooltip,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    final ThemeData theme = Theme.of(context);\n    return SizedBox(\n      width: 36,\n      height: 36,\n      child: IconButton(\n        tooltip: tooltip,\n        onPressed: onPressed,\n        icon: icon,\n        highlightColor: theme.colorScheme.secondaryContainer,\n        color: selected\n            ? theme.colorScheme.onSecondaryContainer\n            : theme.colorScheme.outline,\n        style: ButtonStyle(\n          padding: const WidgetStatePropertyAll(EdgeInsets.zero),\n          backgroundColor: WidgetStatePropertyAll(\n            selected ? theme.colorScheme.secondaryContainer : null,\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/color_palette.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:flutter/material.dart';\n\nclass ColorPalette extends StatelessWidget {\n  final ColorScheme colorScheme;\n  final bool selected;\n  final bool showBgColor;\n\n  const ColorPalette({\n    super.key,\n    required this.colorScheme,\n    required this.selected,\n    this.showBgColor = true,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    final primary = colorScheme.primary;\n    final tertiary = colorScheme.tertiary;\n    final primaryContainer = colorScheme.primaryContainer;\n    Widget child = ClipOval(\n      child: Column(\n        children: [\n          _coloredBox(primary),\n          Expanded(\n            child: Row(\n              children: [\n                _coloredBox(tertiary),\n                _coloredBox(primaryContainer),\n              ],\n            ),\n          ),\n        ],\n      ),\n    );\n    if (selected) {\n      child = Stack(\n        clipBehavior: Clip.none,\n        alignment: Alignment.center,\n        children: [\n          child,\n          Container(\n            width: 23,\n            height: 23,\n            decoration: BoxDecoration(\n              color: colorScheme.surfaceContainer,\n              shape: BoxShape.circle,\n            ),\n            child: Icon(\n              Icons.check_rounded,\n              color: primary,\n              size: 12,\n            ),\n          ),\n        ],\n      );\n    }\n    if (showBgColor) {\n      return Container(\n        width: 50,\n        height: 50,\n        padding: const EdgeInsets.all(6),\n        decoration: BoxDecoration(\n          color: colorScheme.onInverseSurface,\n          borderRadius: StyleString.mdRadius,\n        ),\n        child: child,\n      );\n    }\n    return child;\n  }\n\n  static Widget _coloredBox(Color color) => Expanded(\n    child: ColoredBox(\n      color: color,\n      child: const SizedBox.expand(),\n    ),\n  );\n}\n"
  },
  {
    "path": "lib/common/widgets/colored_box_transition.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass ColoredBoxTransition extends AnimatedWidget {\n  const ColoredBoxTransition({\n    super.key,\n    required this.color,\n    this.child,\n  }) : super(listenable: color);\n\n  final Animation<Color?> color;\n\n  final Widget? child;\n\n  @override\n  Widget build(BuildContext context) {\n    return ColoredBox(\n      color: color.value!,\n      child: child,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/cropped_image.dart",
    "content": "/*\n * This file is part of PiliPlus\n *\n * PiliPlus 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 * PiliPlus 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 PiliPlus.  If not, see <https://www.gnu.org/licenses/>.\n */\n\nimport 'dart:ui' as ui;\n\nimport 'package:flutter/widgets.dart';\n\nclass CroppedImage extends LeafRenderObjectWidget {\n  const CroppedImage({\n    super.key,\n    required this.size,\n    required this.image,\n    required this.srcRect,\n    required this.dstRect,\n    required this.rrect,\n    required this.imgPaint,\n    required this.borderPaint,\n  });\n\n  final Size size;\n  final ui.Image image;\n  final Rect srcRect;\n  final Rect dstRect;\n  final RRect rrect;\n  final Paint imgPaint;\n  final Paint borderPaint;\n\n  @override\n  RenderObject createRenderObject(BuildContext context) {\n    return RenderCroppedImage(\n      preferredSize: size,\n      image: image,\n      srcRect: srcRect,\n      dstRect: dstRect,\n      rrect: rrect,\n      imgPaint: imgPaint,\n      borderPaint: borderPaint,\n    );\n  }\n\n  @override\n  void updateRenderObject(\n    BuildContext context,\n    RenderCroppedImage renderObject,\n  ) {\n    renderObject\n      ..preferredSize = size\n      ..image = image\n      ..srcRect = srcRect\n      ..dstRect = dstRect\n      ..rrect = rrect\n      ..imgPaint = imgPaint\n      ..borderPaint = borderPaint;\n  }\n}\n\nclass RenderCroppedImage extends RenderBox {\n  RenderCroppedImage({\n    required Size preferredSize,\n    required ui.Image image,\n    required Rect srcRect,\n    required Rect dstRect,\n    required RRect rrect,\n    required Paint imgPaint,\n    required Paint borderPaint,\n  }) : _preferredSize = preferredSize,\n       _image = image,\n       _srcRect = srcRect,\n       _dstRect = dstRect,\n       _rrect = rrect,\n       _imgPaint = imgPaint,\n       _borderPaint = borderPaint;\n\n  Size _preferredSize;\n  Size get preferredSize => _preferredSize;\n  set preferredSize(Size value) {\n    if (_preferredSize == value) return;\n    _preferredSize = value;\n    markNeedsLayout();\n  }\n\n  ui.Image _image;\n  ui.Image get image => _image;\n  set image(ui.Image value) {\n    if (_image == value) return;\n    _image = value;\n    markNeedsPaint();\n  }\n\n  Rect _srcRect;\n  Rect get srcRect => _srcRect;\n  set srcRect(Rect value) {\n    if (_srcRect == value) return;\n    _srcRect = value;\n    markNeedsPaint();\n  }\n\n  Rect _dstRect;\n  Rect get dstRect => _dstRect;\n  set dstRect(Rect value) {\n    if (_dstRect == value) return;\n    _dstRect = value;\n    markNeedsPaint();\n  }\n\n  RRect _rrect;\n  RRect get rrect => _rrect;\n  set rrect(RRect value) {\n    if (_rrect == value) return;\n    _rrect = value;\n    markNeedsPaint();\n  }\n\n  Paint _imgPaint;\n  Paint get imgPaint => _imgPaint;\n  set imgPaint(Paint value) {\n    if (_imgPaint == value) return;\n    _imgPaint = value;\n    markNeedsPaint();\n  }\n\n  Paint _borderPaint;\n  Paint get borderPaint => _borderPaint;\n  set borderPaint(Paint value) {\n    if (_borderPaint == value) return;\n    _borderPaint = value;\n    markNeedsPaint();\n  }\n\n  @override\n  void performLayout() {\n    size = constraints.constrain(_preferredSize);\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    context.canvas\n      ..drawImageRect(image, srcRect, dstRect, _imgPaint)\n      ..drawRRect(rrect, _borderPaint);\n  }\n\n  @override\n  bool get isRepaintBoundary => true;\n}\n"
  },
  {
    "path": "lib/common/widgets/custom_arc.dart",
    "content": "import 'dart:math' show pi;\n\nimport 'package:flutter/widgets.dart';\n\nclass Arc extends LeafRenderObjectWidget {\n  const Arc({\n    super.key,\n    required this.size,\n    required this.color,\n    required this.progress,\n    this.strokeWidth = 2,\n  });\n\n  final double size;\n  final Color color;\n  final double progress;\n  final double strokeWidth;\n\n  @override\n  RenderObject createRenderObject(BuildContext context) {\n    return RenderArc(\n      preferredSize: size,\n      color: color,\n      progress: progress,\n      strokeWidth: strokeWidth,\n    );\n  }\n\n  @override\n  void updateRenderObject(\n    BuildContext context,\n    RenderArc renderObject,\n  ) {\n    renderObject\n      ..preferredSize = size\n      ..color = color\n      ..progress = progress\n      ..strokeWidth = strokeWidth;\n  }\n}\n\nclass RenderArc extends RenderBox {\n  RenderArc({\n    required double preferredSize,\n    required Color color,\n    required double progress,\n    required double strokeWidth,\n  }) : _preferredSize = preferredSize,\n       _color = color,\n       _progress = progress,\n       _strokeWidth = strokeWidth;\n\n  Color _color;\n  Color get color => _color;\n  set color(Color value) {\n    if (_color == value) return;\n    _color = value;\n    markNeedsPaint();\n  }\n\n  double _progress;\n  double get progress => _progress;\n  set progress(double value) {\n    if (_progress == value) return;\n    _progress = value;\n    markNeedsPaint();\n  }\n\n  double _strokeWidth;\n  double get strokeWidth => _strokeWidth;\n  set strokeWidth(double value) {\n    if (_strokeWidth == value) return;\n    _strokeWidth = value;\n    markNeedsPaint();\n  }\n\n  double _preferredSize;\n  double get preferredSize => _preferredSize;\n  set preferredSize(double value) {\n    if (_preferredSize == value) return;\n    _preferredSize = value;\n    markNeedsLayout();\n  }\n\n  @override\n  void performLayout() {\n    size = constraints.constrainDimensions(_preferredSize, _preferredSize);\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    if (progress == 0) {\n      return;\n    }\n\n    final paint = Paint()\n      ..color = color\n      ..strokeWidth = strokeWidth\n      ..style = PaintingStyle.stroke;\n\n    final radius = size.width / 2;\n    final rect = Rect.fromCircle(\n      center: Offset(radius, radius),\n      radius: radius,\n    );\n\n    const startAngle = -pi / 2;\n    context.canvas.drawArc(rect, startAngle, progress * 2 * pi, false, paint);\n  }\n\n  @override\n  bool get isRepaintBoundary => true;\n}\n"
  },
  {
    "path": "lib/common/widgets/custom_height_widget.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart' show RenderProxyBox, BoxHitTestResult;\n\nclass CustomHeightWidget extends SingleChildRenderObjectWidget {\n  const CustomHeightWidget({\n    super.key,\n    this.height,\n    this.offset = .zero,\n    required Widget super.child,\n  });\n\n  final double? height;\n\n  final Offset offset;\n\n  @override\n  RenderObject createRenderObject(BuildContext context) {\n    return RenderCustomHeightWidget(\n      height: height,\n      offset: offset,\n    );\n  }\n\n  @override\n  void updateRenderObject(\n    BuildContext context,\n    RenderCustomHeightWidget renderObject,\n  ) {\n    renderObject\n      ..height = height\n      ..offset = offset;\n  }\n}\n\nclass RenderCustomHeightWidget extends RenderProxyBox {\n  RenderCustomHeightWidget({\n    double? height,\n    required Offset offset,\n  }) : _height = height,\n       _offset = offset;\n\n  double? _height;\n  double? get height => _height;\n  set height(double? value) {\n    if (_height == value) return;\n    _height = value;\n    markNeedsLayout();\n  }\n\n  Offset _offset;\n  Offset get offset => _offset;\n  set offset(Offset value) {\n    if (_offset == value) return;\n    _offset = value;\n    markNeedsPaint();\n  }\n\n  @override\n  void performLayout() {\n    if (height != null) {\n      child!.layout(constraints.copyWith(maxHeight: .infinity));\n      size = constraints.constrainDimensions(constraints.maxWidth, height!);\n    } else {\n      child!.layout(\n        constraints.copyWith(maxHeight: .infinity),\n        parentUsesSize: true,\n      );\n      size = constraints.constrainDimensions(\n        constraints.maxWidth,\n        child!.size.height,\n      );\n    }\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    context.paintChild(child!, offset + _offset);\n  }\n\n  @override\n  bool hitTest(BoxHitTestResult result, {required Offset position}) {\n    return result.addWithPaintOffset(\n      offset: _offset,\n      position: position,\n      hitTest: (BoxHitTestResult result, Offset transformed) {\n        assert(transformed == position - _offset);\n        return child!.hitTest(result, position: transformed);\n      },\n    );\n  }\n\n  @override\n  void applyPaintTransform(covariant RenderObject child, Matrix4 transform) {\n    transform.translateByDouble(_offset.dx, _offset.dy, 0.0, 1.0);\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/custom_icon.dart",
    "content": "// ignore_for_file: constant_identifier_names\n\nimport 'package:flutter/widgets.dart';\n\nclass CustomIcons {\n  static const IconData coin = _CustomIconData(0xe800);\n  static const IconData dm_off = _CustomIconData(0xe801);\n  static const IconData dm_on = _CustomIconData(0xe802);\n  static const IconData dm_settings = _CustomIconData(0xe803);\n  static const IconData dyn = _CustomIconData(0xe804);\n  static const IconData fav = _CustomIconData(0xe805);\n  static const IconData live_reserve = _CustomIconData(0xe806);\n  static const IconData player_dm_tip_back = _CustomIconData(0xe807);\n  static const IconData player_dm_tip_copy = _CustomIconData(0xe808);\n  static const IconData player_dm_tip_like = _CustomIconData(0xe809);\n  static const IconData player_dm_tip_like_solid = _CustomIconData(0xe80a);\n  static const IconData player_dm_tip_recall = _CustomIconData(0xe80b);\n  static const IconData share = _CustomIconData(0xe80c);\n  static const IconData share_line = _CustomIconData(0xe80d);\n  static const IconData share_node = _CustomIconData(0xe80e);\n  static const IconData star_favorite_line = _CustomIconData(0xe80f);\n  static const IconData star_favorite_solid = _CustomIconData(0xe810);\n  static const IconData thumbs_down = _CustomIconData(0xe811);\n  static const IconData thumbs_down_outline = _CustomIconData(0xe812);\n  static const IconData thumbs_up = _CustomIconData(0xe813);\n  static const IconData thumbs_up_fill = _CustomIconData(0xe814);\n  static const IconData thumbs_up_line = _CustomIconData(0xe815);\n  static const IconData thumbs_up_outline = _CustomIconData(0xe816);\n  static const IconData topic_tag = _CustomIconData(0xe817);\n  static const IconData watch_later = _CustomIconData(0xe818);\n}\n\nclass _CustomIconData extends IconData {\n  const _CustomIconData(super.codePoint) : super(fontFamily: 'custom_icon');\n}\n"
  },
  {
    "path": "lib/common/widgets/custom_toast.dart",
    "content": "import 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:flutter/material.dart';\n\nclass CustomToast extends StatelessWidget {\n  const CustomToast({super.key, required this.msg});\n\n  final String msg;\n\n  static double toastOpacity = Pref.defaultToastOp;\n\n  @override\n  Widget build(BuildContext context) {\n    final ThemeData theme = Theme.of(context);\n    return Container(\n      margin: EdgeInsets.only(\n        bottom: MediaQuery.viewPaddingOf(context).bottom + 30,\n      ),\n      padding: const EdgeInsets.symmetric(horizontal: 17, vertical: 10),\n      decoration: BoxDecoration(\n        color: theme.colorScheme.primaryContainer.withValues(\n          alpha: toastOpacity,\n        ),\n        borderRadius: const BorderRadius.all(Radius.circular(20)),\n      ),\n      child: Text(\n        msg,\n        style: TextStyle(\n          fontSize: 13,\n          color: theme.colorScheme.onPrimaryContainer,\n        ),\n      ),\n    );\n  }\n}\n\nclass LoadingWidget extends StatelessWidget {\n  const LoadingWidget({super.key, required this.msg});\n\n  ///loading msg\n  final String msg;\n\n  @override\n  Widget build(BuildContext context) {\n    final ThemeData theme = Theme.of(context);\n    final onSurfaceVariant = theme.colorScheme.onSurfaceVariant;\n    return Container(\n      padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 20),\n      decoration: BoxDecoration(\n        color: theme.dialogTheme.backgroundColor,\n        borderRadius: const BorderRadius.all(Radius.circular(15)),\n      ),\n      child: Column(\n        spacing: 20,\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          //loading animation\n          CircularProgressIndicator(\n            strokeWidth: 3,\n            valueColor: AlwaysStoppedAnimation(onSurfaceVariant),\n          ),\n\n          //msg\n          Text(msg, style: TextStyle(color: onSurfaceVariant)),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/custom_tooltip.dart",
    "content": "import 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/rendering.dart'\n    show\n        ContainerRenderObjectMixin,\n        RenderBoxContainerDefaultsMixin,\n        MultiChildLayoutParentData;\nimport 'package:flutter/widgets.dart';\n\nclass CustomTooltip extends StatefulWidget {\n  const CustomTooltip({\n    super.key,\n    required this.overlayWidget,\n    required this.child,\n    required this.indicator,\n  });\n\n  final Widget child;\n  final ValueGetter<Widget> overlayWidget;\n  final ValueGetter<Widget> indicator;\n\n  @override\n  State<CustomTooltip> createState() => _CustomTooltipState();\n}\n\nclass _CustomTooltipState extends State<CustomTooltip> {\n  final OverlayPortalController _overlayController = OverlayPortalController();\n\n  LongPressGestureRecognizer? _longPressRecognizer;\n  LongPressGestureRecognizer get longPressRecognizer =>\n      _longPressRecognizer ??= LongPressGestureRecognizer()\n        ..onLongPress = _scheduleShowTooltip;\n\n  void _scheduleShowTooltip() {\n    _overlayController.show();\n  }\n\n  void _scheduleDismissTooltip() {\n    _overlayController.hide();\n  }\n\n  void _handlePointerDown(PointerDownEvent event) {\n    assert(mounted);\n    longPressRecognizer.addPointer(event);\n  }\n\n  Widget _buildCustomTooltipOverlay(\n    BuildContext context,\n    OverlayChildLayoutInfo layoutInfo,\n  ) {\n    final target = MatrixUtils.transformPoint(\n      layoutInfo.childPaintTransform,\n      layoutInfo.childSize.topCenter(Offset.zero),\n    );\n    final _CustomTooltipOverlay overlayChild = _CustomTooltipOverlay(\n      target: target,\n      onDismiss: _scheduleDismissTooltip,\n      overlayWidget: widget.overlayWidget,\n      indicator: widget.indicator,\n    );\n    return SelectionContainer.maybeOf(context) == null\n        ? overlayChild\n        : SelectionContainer.disabled(child: overlayChild);\n  }\n\n  @protected\n  @override\n  void dispose() {\n    _longPressRecognizer\n      ?..onLongPress = null\n      ..dispose();\n    _longPressRecognizer = null;\n    super.dispose();\n  }\n\n  @protected\n  @override\n  Widget build(BuildContext context) {\n    Widget result;\n    if (PlatformUtils.isMobile) {\n      result = Listener(\n        onPointerDown: _handlePointerDown,\n        behavior: HitTestBehavior.opaque,\n        child: widget.child,\n      );\n    } else {\n      result = MouseRegion(\n        cursor: MouseCursor.defer,\n        onEnter: (_) => _scheduleShowTooltip(),\n        onExit: (_) => _scheduleDismissTooltip(),\n        child: widget.child,\n      );\n    }\n    return OverlayPortal.overlayChildLayoutBuilder(\n      controller: _overlayController,\n      overlayChildBuilder: _buildCustomTooltipOverlay,\n      child: result,\n    );\n  }\n}\n\nclass _CustomTooltipOverlay extends StatelessWidget {\n  const _CustomTooltipOverlay({\n    required this.target,\n    required this.onDismiss,\n    required this.overlayWidget,\n    required this.indicator,\n  });\n\n  final Offset target;\n  final VoidCallback onDismiss;\n  final ValueGetter<Widget> overlayWidget;\n  final ValueGetter<Widget> indicator;\n\n  @override\n  Widget build(BuildContext context) {\n    return _ToolTip(\n      target: target,\n      preferBelow: false,\n      onTap: PlatformUtils.isMobile ? onDismiss : null,\n      children: [\n        indicator(),\n        overlayWidget(),\n      ],\n    );\n  }\n}\n\nclass _ToolTip extends MultiChildRenderObjectWidget {\n  const _ToolTip({\n    super.children,\n    this.onTap,\n    required this.target,\n    required this.preferBelow,\n  });\n\n  final VoidCallback? onTap;\n  final Offset target;\n  final bool preferBelow;\n\n  @override\n  RenderObject createRenderObject(BuildContext context) {\n    return _RenderToolTip(\n      onTap: onTap,\n      target: target,\n      preferBelow: preferBelow,\n    );\n  }\n\n  @override\n  void updateRenderObject(BuildContext context, _RenderToolTip renderObject) {\n    renderObject\n      ..onTap = onTap\n      ..target = target\n      ..preferBelow = preferBelow;\n  }\n}\n\nclass _RenderToolTip extends RenderBox\n    with\n        ContainerRenderObjectMixin<RenderBox, MultiChildLayoutParentData>,\n        RenderBoxContainerDefaultsMixin<RenderBox, MultiChildLayoutParentData> {\n  _RenderToolTip({\n    VoidCallback? onTap,\n    required Offset target,\n    required bool preferBelow,\n  }) : _target = target,\n       _preferBelow = preferBelow,\n       _hitTestSelf = onTap != null {\n    if (onTap != null) {\n      _tapGestureRecognizer = TapGestureRecognizer()..onTap = onTap;\n    }\n  }\n\n  TapGestureRecognizer? _tapGestureRecognizer;\n\n  set onTap(VoidCallback? value) {\n    _tapGestureRecognizer?.onTap = value;\n  }\n\n  @override\n  void dispose() {\n    _tapGestureRecognizer\n      ?..onTap = null\n      ..dispose();\n    _tapGestureRecognizer = null;\n    super.dispose();\n  }\n\n  final bool _hitTestSelf;\n  @override\n  bool hitTestSelf(Offset position) => _hitTestSelf;\n\n  @override\n  void handleEvent(PointerEvent event, HitTestEntry<HitTestTarget> entry) {\n    if (event is PointerDownEvent) {\n      _tapGestureRecognizer?.addPointer(event);\n    }\n  }\n\n  Offset _target;\n  Offset get target => _target;\n  set target(Offset value) {\n    if (_target == value) return;\n    _target = value;\n    markNeedsPaint();\n  }\n\n  bool _preferBelow;\n  bool get preferBelow => _preferBelow;\n  set preferBelow(bool value) {\n    if (_preferBelow == value) return;\n    _preferBelow = value;\n    markNeedsPaint();\n  }\n\n  @override\n  void setupParentData(RenderBox child) {\n    if (child.parentData is! MultiChildLayoutParentData) {\n      child.parentData = MultiChildLayoutParentData();\n    }\n  }\n\n  @override\n  void performLayout() {\n    size = constraints.constrain(constraints.biggest);\n\n    final c = BoxConstraints.loose(size);\n    RenderBox indicator = firstChild!..layout(c, parentUsesSize: true);\n    RenderBox overlay = lastChild!..layout(c, parentUsesSize: true);\n\n    final indicatorSize = indicator.size;\n    final overlaySize = overlay.size;\n\n    final indicatorParentData =\n        indicator.parentData as MultiChildLayoutParentData;\n    final overlayParentData = overlay.parentData as MultiChildLayoutParentData;\n\n    Offset offset = positionDependentBox(\n      size: size,\n      childSize: overlaySize,\n      target: target,\n      preferBelow: preferBelow,\n    );\n    offset = Offset(offset.dx, offset.dy - indicatorSize.height + 1);\n    overlayParentData.offset = offset;\n    indicatorParentData.offset = Offset(\n      target.dx - indicatorSize.width / 2,\n      offset.dy + overlaySize.height - 1,\n    );\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    defaultPaint(context, offset);\n  }\n}\n\nclass Triangle extends LeafRenderObjectWidget {\n  const Triangle({\n    super.key,\n    required this.color,\n    required this.size,\n  });\n\n  final Color color;\n  final Size size;\n\n  @override\n  RenderObject createRenderObject(BuildContext context) {\n    return RenderTriangle(\n      color: color,\n      preferredSize: size,\n    );\n  }\n\n  @override\n  void updateRenderObject(\n    BuildContext context,\n    RenderTriangle renderObject,\n  ) {\n    renderObject\n      ..color = color\n      ..preferredSize = size;\n  }\n}\n\nclass RenderTriangle extends RenderBox {\n  RenderTriangle({\n    required Color color,\n    required Size preferredSize,\n  }) : _color = color,\n       _preferredSize = preferredSize;\n\n  Color _color;\n  Color get color => _color;\n  set color(Color value) {\n    if (_color == value) return;\n    _color = value;\n    markNeedsPaint();\n  }\n\n  Size _preferredSize;\n  set preferredSize(Size value) {\n    if (_preferredSize == value) return;\n    _preferredSize = value;\n    markNeedsLayout();\n  }\n\n  @override\n  void performLayout() {\n    size = constraints.constrain(_preferredSize);\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    final size = this.size;\n    final paint = Paint()\n      ..color = color\n      ..style = PaintingStyle.fill;\n\n    final path = Path()\n      ..moveTo(offset.dx, offset.dy)\n      ..lineTo(offset.dx + size.width, offset.dy)\n      ..lineTo(offset.dx + size.width / 2, size.height + offset.dy)\n      ..close();\n\n    context.canvas.drawPath(path, paint);\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/dialog/dialog.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nFuture<bool> showConfirmDialog({\n  required BuildContext context,\n  required String title,\n  Object? content,\n  // @Deprecated('use `bool result = await showConfirmDialog()` instead')\n  VoidCallback? onConfirm,\n}) async {\n  assert(content is String? || content is Widget);\n  return await showDialog<bool>(\n        context: context,\n        builder: (context) => AlertDialog(\n          title: Text(title),\n          content: content is String\n              ? Text(content)\n              : content is Widget\n              ? content\n              : null,\n          actions: [\n            TextButton(\n              onPressed: Get.back,\n              child: Text(\n                '取消',\n                style: TextStyle(\n                  color: Theme.of(context).colorScheme.outline,\n                ),\n              ),\n            ),\n            TextButton(\n              onPressed: () {\n                Get.back(result: true);\n                onConfirm?.call();\n              },\n              child: const Text('确认'),\n            ),\n          ],\n        ),\n      ) ??\n      false;\n}\n\nvoid showPgcFollowDialog({\n  required BuildContext context,\n  required String type,\n  required int followStatus,\n  required ValueChanged<int> onUpdateStatus,\n}) {\n  Widget statusItem({\n    required bool enabled,\n    required String text,\n    required VoidCallback onTap,\n  }) {\n    return ListTile(\n      dense: true,\n      enabled: enabled,\n      title: Padding(\n        padding: const EdgeInsets.only(left: 10),\n        child: Text(\n          '标记为 $text',\n          style: const TextStyle(fontSize: 14),\n        ),\n      ),\n      trailing: !enabled ? const Icon(size: 22, Icons.check) : null,\n      onTap: onTap,\n    );\n  }\n\n  showDialog(\n    context: context,\n    builder: (context) => AlertDialog(\n      clipBehavior: Clip.hardEdge,\n      contentPadding: const EdgeInsets.symmetric(vertical: 12),\n      content: Column(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          ...const [\n            (followStatus: 3, title: '看过'),\n            (followStatus: 2, title: '在看'),\n            (followStatus: 1, title: '想看'),\n          ].map(\n            (item) => statusItem(\n              enabled: followStatus != item.followStatus,\n              text: item.title,\n              onTap: () {\n                Get.back();\n                onUpdateStatus(item.followStatus);\n              },\n            ),\n          ),\n          ListTile(\n            dense: true,\n            title: Padding(\n              padding: const EdgeInsets.only(left: 10),\n              child: Text(\n                '取消$type',\n                style: const TextStyle(fontSize: 14),\n              ),\n            ),\n            onTap: () {\n              Get.back();\n              onUpdateStatus(-1);\n            },\n          ),\n        ],\n      ),\n    ),\n  );\n}\n"
  },
  {
    "path": "lib/common/widgets/dialog/export_import.dart",
    "content": "import 'dart:async' show FutureOr;\nimport 'dart:convert' show utf8, jsonDecode;\nimport 'dart:io' show File;\n\nimport 'package:PiliPlus/common/constants.dart' show StyleString;\nimport 'package:PiliPlus/utils/extension/context_ext.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:file_picker/file_picker.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart' show Clipboard;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get_core/src/get_main.dart';\nimport 'package:get/get_navigation/src/extension_navigation.dart';\nimport 'package:intl/intl.dart' show DateFormat;\nimport 'package:re_highlight/languages/json.dart';\nimport 'package:re_highlight/re_highlight.dart';\nimport 'package:re_highlight/styles/base16/github.dart';\nimport 'package:re_highlight/styles/github-dark.dart';\n\nvoid exportToClipBoard({\n  required ValueGetter<String> onExport,\n}) {\n  Utils.copyText(onExport());\n}\n\nvoid exportToLocalFile({\n  required ValueGetter<String> onExport,\n  required ValueGetter<String> localFileName,\n}) {\n  final res = utf8.encode(onExport());\n  Utils.saveBytes2File(\n    name:\n        'piliplus_${localFileName()}_'\n        '${DateFormat('yyyyMMddHHmmss').format(DateTime.now())}.json',\n    bytes: res,\n    allowedExtensions: const ['json'],\n  );\n}\n\nFuture<void> importFromClipBoard<T>(\n  BuildContext context, {\n  required String title,\n  required ValueGetter<String> onExport,\n  required FutureOr<void> Function(T json) onImport,\n  bool showConfirmDialog = true,\n}) async {\n  final data = await Clipboard.getData('text/plain');\n  if (data?.text?.isNotEmpty != true) {\n    SmartDialog.showToast('剪贴板无数据');\n    return;\n  }\n  if (!context.mounted) return;\n  final text = data!.text!;\n  late final T json;\n  late final String formatText;\n  try {\n    json = jsonDecode(text);\n    formatText = Utils.jsonEncoder.convert(json);\n  } catch (e) {\n    SmartDialog.showToast('解析json失败：$e');\n    return;\n  }\n  bool? executeImport;\n  if (showConfirmDialog) {\n    final highlight = Highlight()..registerLanguage('json', langJson);\n    final result = highlight.highlight(\n      code: formatText,\n      language: 'json',\n    );\n    late TextSpanRenderer renderer;\n    bool? isDarkMode;\n    executeImport = await showDialog(\n      context: context,\n      builder: (context) {\n        final isDark = context.isDarkMode;\n        if (isDark != isDarkMode) {\n          isDarkMode = isDark;\n          renderer = TextSpanRenderer(\n            const TextStyle(),\n            isDark ? githubDarkTheme : githubTheme,\n          );\n          result.render(renderer);\n        }\n        return AlertDialog(\n          title: Text('是否导入如下$title？'),\n          content: SingleChildScrollView(\n            child: Text.rich(renderer.span!),\n          ),\n          actions: [\n            TextButton(\n              onPressed: Get.back,\n              child: Text(\n                '取消',\n                style: TextStyle(\n                  color: Theme.of(context).colorScheme.outline,\n                ),\n              ),\n            ),\n            TextButton(\n              onPressed: () => Get.back(result: true),\n              child: const Text('确定'),\n            ),\n          ],\n        );\n      },\n    );\n  } else {\n    executeImport = true;\n  }\n  if (executeImport ?? false) {\n    try {\n      await onImport(json);\n      SmartDialog.showToast('导入成功');\n    } catch (e) {\n      SmartDialog.showToast('导入失败：$e');\n    }\n  }\n}\n\nFuture<void> importFromLocalFile<T>({\n  required FutureOr<void> Function(T json) onImport,\n}) async {\n  final result = await FilePicker.pickFiles();\n  if (result != null) {\n    final path = result.files.first.path;\n    if (path != null) {\n      final data = await File(path).readAsString();\n      late final T json;\n      try {\n        json = jsonDecode(data);\n      } catch (e) {\n        SmartDialog.showToast('解析json失败：$e');\n        return;\n      }\n      try {\n        await onImport(json);\n        SmartDialog.showToast('导入成功');\n      } catch (e) {\n        SmartDialog.showToast('导入失败：$e');\n      }\n    }\n  }\n}\n\nvoid importFromInput<T>(\n  BuildContext context, {\n  required String title,\n  required FutureOr<void> Function(T json) onImport,\n}) {\n  final key = GlobalKey<FormFieldState<String>>();\n  late T json;\n  String? forceErrorText;\n\n  showDialog(\n    context: context,\n    builder: (context) => AlertDialog(\n      title: Text('输入$title'),\n      constraints: StyleString.dialogFixedConstraints,\n      content: TextFormField(\n        key: key,\n        minLines: 4,\n        maxLines: 12,\n        autofocus: true,\n        decoration: const InputDecoration(\n          border: OutlineInputBorder(),\n          errorMaxLines: 3,\n        ),\n        validator: (value) {\n          if (forceErrorText != null) return forceErrorText;\n          try {\n            json = jsonDecode(value!) as T;\n            return null;\n          } catch (e) {\n            if (e is FormatException) {}\n            return '解析json失败：$e';\n          }\n        },\n      ),\n      actions: [\n        TextButton(\n          onPressed: Get.back,\n          child: Text(\n            '取消',\n            style: TextStyle(\n              color: Theme.of(context).colorScheme.outline,\n            ),\n          ),\n        ),\n        TextButton(\n          onPressed: () async {\n            if (key.currentState?.validate() == true) {\n              try {\n                await onImport(json);\n                Get.back();\n                SmartDialog.showToast('导入成功');\n                return;\n              } catch (e) {\n                forceErrorText = '导入失败：$e';\n              }\n              key.currentState?.validate();\n              forceErrorText = null;\n            }\n          },\n          child: const Text('确定'),\n        ),\n      ],\n    ),\n  );\n}\n\nFuture<void> showImportExportDialog<T>(\n  BuildContext context, {\n  required String title,\n  required ValueGetter<String> onExport,\n  required FutureOr<void> Function(T json) onImport,\n  required ValueGetter<String> localFileName,\n}) => showDialog(\n  context: context,\n  builder: (context) {\n    const style = TextStyle(fontSize: 15);\n    return SimpleDialog(\n      clipBehavior: Clip.hardEdge,\n      title: Text('导入/导出$title'),\n      children: [\n        ListTile(\n          dense: true,\n          title: const Text('导出至剪贴板', style: style),\n          onTap: () {\n            Get.back();\n            exportToClipBoard(onExport: onExport);\n          },\n        ),\n        ListTile(\n          dense: true,\n          title: const Text('导出文件至本地', style: style),\n          onTap: () {\n            Get.back();\n            exportToLocalFile(onExport: onExport, localFileName: localFileName);\n          },\n        ),\n        Divider(\n          height: 1,\n          color: ColorScheme.of(context).outline.withValues(alpha: 0.1),\n        ),\n        ListTile(\n          dense: true,\n          title: const Text('输入', style: style),\n          onTap: () {\n            Get.back();\n            importFromInput<T>(context, title: title, onImport: onImport);\n          },\n        ),\n        ListTile(\n          dense: true,\n          title: const Text('从剪贴板导入', style: style),\n          onTap: () {\n            Get.back();\n            importFromClipBoard<T>(\n              context,\n              title: title,\n              onExport: onExport,\n              onImport: onImport,\n            );\n          },\n        ),\n        ListTile(\n          dense: true,\n          title: const Text('从本地文件导入', style: style),\n          onTap: () {\n            Get.back();\n            importFromLocalFile<T>(onImport: onImport);\n          },\n        ),\n      ],\n    );\n  },\n);\n"
  },
  {
    "path": "lib/common/widgets/dialog/report.dart",
    "content": "import 'package:PiliPlus/common/widgets/radio_widget.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/utils/extension/string_ext.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nFuture<void> autoWrapReportDialog(\n  BuildContext context,\n  Map<String, Map<int, String>> options,\n  Future<LoadingState> Function(int reasonType, String? reasonDesc, bool banUid)\n  onSuccess, {\n  bool ban = true,\n}) {\n  int? reasonType;\n  String? reasonDesc;\n  bool banUid = false;\n  late final key = GlobalKey<FormFieldState<String>>();\n  return showDialog(\n    context: context,\n    builder: (context) => AlertDialog(\n      title: const Text('举报'),\n      titlePadding: const .only(left: 22, top: 16, right: 22),\n      contentPadding: const .symmetric(vertical: 5),\n      actionsPadding: const .only(left: 16, right: 16, bottom: 10),\n      content: Column(\n        mainAxisSize: MainAxisSize.min,\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          Flexible(\n            child: SingleChildScrollView(\n              child: AnimatedSize(\n                duration: const Duration(milliseconds: 200),\n                child: Builder(\n                  builder: (context) => Column(\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: [\n                      const Padding(\n                        padding: .only(left: 22, right: 22, bottom: 5),\n                        child: Text('请选择举报的理由：'),\n                      ),\n                      RadioGroup(\n                        onChanged: (value) {\n                          reasonType = value;\n                          (context as Element).markNeedsBuild();\n                        },\n                        groupValue: reasonType,\n                        child: Column(\n                          crossAxisAlignment: CrossAxisAlignment.start,\n                          children: options.entries.map((entry) {\n                            return WrapRadioOptionsGroup<int>(\n                              groupTitle: entry.key,\n                              options: entry.value,\n                            );\n                          }).toList(),\n                        ),\n                      ),\n                      if (reasonType == 0)\n                        Padding(\n                          padding: const .only(left: 22, top: 5, right: 22),\n                          child: TextFormField(\n                            key: key,\n                            autofocus: true,\n                            minLines: 2,\n                            maxLines: 4,\n                            initialValue: reasonDesc,\n                            decoration: const InputDecoration(\n                              labelText: '为帮助审核人员更快处理，请补充问题类型和出现位置等详细信息',\n                              border: OutlineInputBorder(),\n                              contentPadding: .all(10),\n                              labelStyle: TextStyle(fontSize: 14),\n                              floatingLabelStyle: TextStyle(fontSize: 14),\n                            ),\n                            onChanged: (value) => reasonDesc = value,\n                            validator: (value) =>\n                                value.isNullOrEmpty ? '理由不能为空' : null,\n                          ),\n                        ),\n                    ],\n                  ),\n                ),\n              ),\n            ),\n          ),\n          if (ban)\n            Padding(\n              padding: const EdgeInsets.only(left: 14, top: 6),\n              child: CheckBoxText(\n                text: '拉黑该用户',\n                onChanged: (value) => banUid = value,\n              ),\n            ),\n        ],\n      ),\n      actions: [\n        TextButton(\n          onPressed: Get.back,\n          child: Text(\n            '取消',\n            style: TextStyle(color: ColorScheme.of(context).outline),\n          ),\n        ),\n        TextButton(\n          onPressed: () async {\n            if (reasonType == null ||\n                (reasonType == 0 && key.currentState?.validate() != true)) {\n              return;\n            }\n            SmartDialog.showLoading();\n            try {\n              final res = await onSuccess(reasonType!, reasonDesc, banUid);\n              SmartDialog.dismiss();\n              if (res.isSuccess) {\n                Get.back();\n                SmartDialog.showToast('举报成功');\n              } else {\n                res.toast();\n              }\n            } catch (e, s) {\n              SmartDialog.dismiss();\n              SmartDialog.showToast('提交失败：$e');\n              Utils.reportError(e, s);\n            }\n          },\n          child: const Text('确定'),\n        ),\n      ],\n    ),\n  );\n}\n\nclass CheckBoxText extends StatefulWidget {\n  final String text;\n  final ValueChanged<bool> onChanged;\n  final bool selected;\n\n  const CheckBoxText({\n    super.key,\n    required this.text,\n    required this.onChanged,\n    this.selected = false,\n  });\n\n  @override\n  State<CheckBoxText> createState() => _CheckBoxTextState();\n}\n\nclass _CheckBoxTextState extends State<CheckBoxText> {\n  late bool _selected;\n\n  @override\n  void initState() {\n    super.initState();\n    _selected = widget.selected;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final colorScheme = ColorScheme.of(context);\n    return InkWell(\n      onTap: () {\n        setState(() {\n          _selected = !_selected;\n          widget.onChanged(_selected);\n        });\n      },\n      child: Padding(\n        padding: const EdgeInsets.all(4),\n        child: Row(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            Icon(\n              size: 22,\n              _selected\n                  ? Icons.check_box_outlined\n                  : Icons.check_box_outline_blank,\n              color: _selected\n                  ? colorScheme.primary\n                  : colorScheme.onSurfaceVariant,\n            ),\n            Text(\n              ' ${widget.text}',\n              style: TextStyle(color: _selected ? colorScheme.primary : null),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n\nabstract final class ReportOptions {\n  // from https://s1.hdslb.com/bfs/seed/jinkela/comment-h5/static/js/605.chunks.js\n  static Map<String, Map<int, String>> get commentReport => const {\n    '违反法律法规': {9: '违法违规', 2: '色情', 10: '低俗', 12: '赌博诈骗', 23: '违法信息外链'},\n    '谣言类不实信息': {19: '涉政谣言', 22: '虚假不实信息', 20: '涉社会事件谣言'},\n    '侵犯个人权益': {7: '人身攻击', 15: '侵犯隐私'},\n    '有害社区环境': {\n      1: '垃圾广告',\n      4: '引战',\n      5: '剧透',\n      3: '刷屏',\n      8: '视频不相关',\n      18: '违规抽奖',\n      17: '青少年不良信息',\n    },\n    '其他': {0: '其他'},\n  };\n\n  static Map<String, Map<int, String>> get dynamicReport => const {\n    '': {\n      4: '垃圾广告',\n      8: '引战',\n      1: '色情',\n      5: '人身攻击',\n      3: '违法信息',\n      9: '涉政谣言',\n      10: '涉社会事件谣言',\n      12: '虚假不实信息',\n      13: '违法信息外链',\n      0: '其他',\n    },\n  };\n\n  static Map<String, Map<int, String>> get danmakuReport => const {\n    '': {\n      1: '违法违禁',\n      2: '色情低俗',\n      3: '赌博诈骗',\n      4: '人身攻击',\n      5: '侵犯隐私',\n      6: '垃圾广告',\n      7: '引战',\n      8: '剧透',\n      9: '恶意刷屏',\n      10: '视频无关',\n      12: '青少年不良信息',\n      13: '违法信息外链',\n      0: '其它', // 11\n    },\n  };\n\n  static Map<String, Map<int, String>> get liveDanmakuReport => const {\n    '': {\n      1: '违法违规',\n      2: '低俗色情',\n      3: '垃圾广告',\n      4: '辱骂引战',\n      5: '政治敏感',\n      6: '青少年不良信息',\n      7: '其他', // avoid show form\n    },\n  };\n\n  static Map<String, Map<int, String>> get imMsgReport => const {\n    '': {\n      1: '色情低俗',\n      2: '政治敏感',\n      3: '违法有害',\n      4: '广告骚扰',\n      5: '人身攻击',\n      6: '诈骗',\n      0: '其他问题',\n    },\n  };\n}\n"
  },
  {
    "path": "lib/common/widgets/dialog/report_member.dart",
    "content": "import 'package:PiliPlus/http/member.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nconst _reason = ['头像违规', '昵称违规', '签名违规'];\n\nconst _reasonV2 = ['色情低俗', '不实信息', '违禁', '人身攻击', '赌博诈骗', '违规引流外链'];\n\nFuture<void> showMemberReportDialog(\n  BuildContext context, {\n  required Object? name,\n  required Object mid,\n}) {\n  final Set<int> reason = {};\n  int? reasonV2;\n\n  return showDialog(\n    context: context,\n    builder: (context) {\n      final theme = Theme.of(context);\n      return AlertDialog(\n        clipBehavior: Clip.hardEdge,\n        contentPadding: const EdgeInsets.symmetric(vertical: 16),\n        titleTextStyle: theme.textTheme.bodyMedium,\n        title: Column(\n          spacing: 4,\n          crossAxisAlignment: .start,\n          children: [\n            Text(\n              '举报: $name',\n              style: const TextStyle(fontSize: 18),\n            ),\n            Text('uid: $mid'),\n          ],\n        ),\n        content: SingleChildScrollView(\n          child: Column(\n            mainAxisSize: .min,\n            crossAxisAlignment: .start,\n            children: [\n              const Padding(\n                padding: .only(left: 18),\n                child: Text('举报内容（必选，可多选）'),\n              ),\n              ...List.generate(\n                3,\n                (index) => Builder(\n                  builder: (context) {\n                    final checked = reason.contains(index + 1);\n                    return ListTile(\n                      dense: true,\n                      minTileHeight: 40,\n                      onTap: () {\n                        if (!checked) {\n                          reason.add(index + 1);\n                        } else {\n                          reason.remove(index + 1);\n                        }\n                        (context as Element).markNeedsBuild();\n                      },\n                      title: Row(\n                        spacing: 8,\n                        children: [\n                          checked\n                              ? Icon(\n                                  size: 22,\n                                  Icons.check_box,\n                                  color: theme.colorScheme.primary,\n                                )\n                              : Icon(\n                                  size: 22,\n                                  Icons.check_box_outline_blank,\n                                  color: theme.colorScheme.onSurfaceVariant,\n                                ),\n                          Expanded(\n                            child: Text(\n                              _reason[index],\n                              style: const TextStyle(fontSize: 14),\n                            ),\n                          ),\n                        ],\n                      ),\n                    );\n                  },\n                ),\n              ),\n              const Padding(\n                padding: .only(left: 18),\n                child: Text('举报理由（单选，非必选）'),\n              ),\n              Builder(\n                builder: (context) => Column(\n                  crossAxisAlignment: .start,\n                  children: List.generate(\n                    _reasonV2.length,\n                    (index) {\n                      final checked = index == reasonV2;\n                      return ListTile(\n                        dense: true,\n                        minTileHeight: 40,\n                        onTap: () {\n                          if (checked) {\n                            reasonV2 = null;\n                          } else {\n                            reasonV2 = index;\n                          }\n                          (context as Element).markNeedsBuild();\n                        },\n                        title: Row(\n                          spacing: 8,\n                          children: [\n                            checked\n                                ? Icon(\n                                    size: 22,\n                                    Icons.radio_button_checked,\n                                    color: theme.colorScheme.primary,\n                                  )\n                                : Icon(\n                                    size: 22,\n                                    Icons.radio_button_off,\n                                    color: theme.colorScheme.onSurfaceVariant,\n                                  ),\n                            Expanded(\n                              child: Text(\n                                _reasonV2[index],\n                                style: const TextStyle(fontSize: 14),\n                              ),\n                            ),\n                          ],\n                        ),\n                      );\n                    },\n                  ),\n                ),\n              ),\n            ],\n          ),\n        ),\n        actions: [\n          TextButton(\n            onPressed: Get.back,\n            child: Text(\n              '取消',\n              style: TextStyle(color: theme.colorScheme.outline),\n            ),\n          ),\n          TextButton(\n            onPressed: () {\n              if (reason.isEmpty) {\n                SmartDialog.showToast('至少选择一项作为举报内容');\n              } else {\n                Get.back();\n                MemberHttp.reportMember(\n                  mid,\n                  reason: reason.join(','),\n                  reasonV2: reasonV2 != null ? reasonV2! + 1 : null,\n                );\n              }\n            },\n            child: const Text('确定'),\n          ),\n        ],\n      );\n    },\n  );\n}\n"
  },
  {
    "path": "lib/common/widgets/disabled_icon.dart",
    "content": "import 'dart:math';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart';\n\nclass DisabledIcon extends SingleChildRenderObjectWidget {\n  const DisabledIcon({\n    super.key,\n    required Widget super.child,\n    this.disable = false,\n    this.color,\n    this.iconSize,\n    this.lineLengthScale = 0.9,\n    this.strokeCap = .butt,\n  });\n\n  final bool disable;\n  final Color? color;\n  final double? iconSize;\n  final StrokeCap strokeCap;\n  final double lineLengthScale;\n\n  Icon? get _icon => child is Icon ? child as Icon : null;\n\n  @override\n  RenderObject createRenderObject(BuildContext context) {\n    late final iconTheme = IconTheme.of(context);\n    final icon = _icon;\n    return RenderMaskedIcon(\n      disable: disable,\n      iconSize: iconSize ?? icon?.size ?? iconTheme.size ?? 24.0,\n      color: color ?? icon?.color ?? iconTheme.color!,\n      strokeCap: strokeCap,\n      lineLengthScale: lineLengthScale,\n    );\n  }\n\n  @override\n  void updateRenderObject(BuildContext context, RenderMaskedIcon renderObject) {\n    late final iconTheme = IconTheme.of(context);\n    final icon = _icon;\n    renderObject\n      ..disable = disable\n      ..iconSize = iconSize ?? icon?.size ?? iconTheme.size ?? 24.0\n      ..color = color ?? icon?.color ?? iconTheme.color!\n      ..strokeCap = strokeCap\n      ..lineLengthScale = lineLengthScale;\n  }\n}\n\nclass RenderMaskedIcon extends RenderProxyBox {\n  RenderMaskedIcon({\n    required bool disable,\n    required double iconSize,\n    required Color color,\n    required StrokeCap strokeCap,\n    required double lineLengthScale,\n  }) : _disable = disable,\n       _iconSize = iconSize,\n       _color = color,\n       _strokeCap = strokeCap,\n       _lineLengthScale = lineLengthScale;\n\n  bool _disable;\n  bool get disable => _disable;\n  set disable(bool value) {\n    if (_disable == value) return;\n    _disable = value;\n    markNeedsPaint();\n  }\n\n  double _iconSize;\n  double get iconSize => _iconSize;\n  set iconSize(double value) {\n    if (_iconSize == value) return;\n    _iconSize = value;\n    markNeedsPaint();\n  }\n\n  Color _color;\n  Color get color => _color;\n  set color(Color value) {\n    if (_color == value) return;\n    _color = value;\n    markNeedsPaint();\n  }\n\n  StrokeCap _strokeCap;\n  StrokeCap get strokeCap => _strokeCap;\n  set strokeCap(StrokeCap value) {\n    if (_strokeCap == value) return;\n    _strokeCap = value;\n    markNeedsPaint();\n  }\n\n  double _lineLengthScale;\n  double get lineLengthScale => _lineLengthScale;\n  set lineLengthScale(double value) {\n    if (_lineLengthScale == value) return;\n    _lineLengthScale = value;\n    markNeedsPaint();\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    if (!disable) {\n      return super.paint(context, offset);\n    }\n\n    final canvas = context.canvas;\n\n    var rectOffset = offset;\n    Size size = this.size;\n    final exceedWidth = size.width > _iconSize;\n    final exceedHeight = size.height > _iconSize;\n    if (exceedWidth || exceedHeight) {\n      final dx = exceedWidth ? (size.width - _iconSize) / 2.0 : 0.0;\n      final dy = exceedHeight ? (size.height - _iconSize) / 2.0 : 0.0;\n      size = Size.square(_iconSize);\n      rectOffset += Offset(dx, dy);\n    } else if (size.width < _iconSize && size.height < _iconSize) {\n      size = Size.square(_iconSize);\n    }\n\n    final strokeWidth = size.width / 12;\n\n    var rect = rectOffset & size;\n\n    final sqrt2Width = strokeWidth * sqrt2; // rotate pi / 4\n\n    final path = Path.combine(\n      PathOperation.union,\n      Path() // bottom\n        ..moveTo(rect.left, rect.bottom)\n        ..lineTo(rect.left, rect.top + sqrt2Width)\n        ..lineTo(rect.right - sqrt2Width, rect.bottom)\n        ..close(),\n      Path() // top\n        ..moveTo(rect.right, rect.top)\n        ..lineTo(rect.right, rect.bottom - sqrt2Width)\n        ..lineTo(rect.left + sqrt2Width, rect.top),\n    );\n\n    canvas\n      ..save()\n      ..clipPath(path, doAntiAlias: false);\n    super.paint(context, offset);\n\n    canvas.restore();\n\n    final linePaint = Paint()\n      ..color = color\n      ..strokeWidth = strokeWidth\n      ..strokeCap = strokeCap;\n\n    final strokeOffset = strokeWidth * sqrt1_2 / 2;\n    rect = rect\n        .translate(-strokeOffset, strokeOffset)\n        .deflate(size.width * lineLengthScale);\n    canvas.drawLine(\n      rect.topLeft,\n      rect.bottomRight,\n      linePaint,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/dynamic_sliver_app_bar/dynamic_sliver_app_bar.dart",
    "content": "/*\n * This file is part of PiliPlus\n *\n * PiliPlus 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 * PiliPlus 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 PiliPlus.  If not, see <https://www.gnu.org/licenses/>.\n */\n\nimport 'dart:math' as math;\n\nimport 'package:PiliPlus/common/widgets/custom_height_widget.dart';\nimport 'package:PiliPlus/common/widgets/dynamic_sliver_app_bar/rendering/sliver_persistent_header.dart';\nimport 'package:PiliPlus/common/widgets/dynamic_sliver_app_bar/sliver_persistent_header.dart';\nimport 'package:PiliPlus/common/widgets/only_layout_widget.dart'\n    show LayoutCallback;\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart'\n    hide SliverPersistentHeader, SliverPersistentHeaderDelegate;\nimport 'package:flutter/rendering.dart' show RenderOpacity, OpacityLayer;\nimport 'package:flutter/services.dart';\n\n/// ref [SliverAppBar]\nclass _SliverAppBarDelegate extends SliverPersistentHeaderDelegate {\n  _SliverAppBarDelegate({\n    required this.leading,\n    required this.automaticallyImplyLeading,\n    required this.title,\n    required this.actions,\n    required this.automaticallyImplyActions,\n    required this.flexibleSpace,\n    required this.bottom,\n    required this.elevation,\n    required this.scrolledUnderElevation,\n    required this.shadowColor,\n    required this.surfaceTintColor,\n    required this.forceElevated,\n    required this.backgroundColor,\n    required this.foregroundColor,\n    required this.iconTheme,\n    required this.actionsIconTheme,\n    required this.primary,\n    required this.centerTitle,\n    required this.excludeHeaderSemantics,\n    required this.titleSpacing,\n    required this.collapsedHeight,\n    required this.topPadding,\n    required this.shape,\n    required this.toolbarHeight,\n    required this.leadingWidth,\n    required this.toolbarTextStyle,\n    required this.titleTextStyle,\n    required this.systemOverlayStyle,\n    required this.forceMaterialTransparency,\n    required this.useDefaultSemanticsOrder,\n    required this.clipBehavior,\n    required this.actionsPadding,\n  }) : assert(primary || topPadding == 0.0),\n       _bottomHeight = bottom?.preferredSize.height ?? 0.0;\n\n  final Widget? leading;\n  final bool automaticallyImplyLeading;\n  final Widget title;\n  final List<Widget>? actions;\n  final bool automaticallyImplyActions;\n  final Widget flexibleSpace;\n  final PreferredSizeWidget? bottom;\n  final double? elevation;\n  final double? scrolledUnderElevation;\n  final Color? shadowColor;\n  final Color? surfaceTintColor;\n  final bool forceElevated;\n  final Color? backgroundColor;\n  final Color? foregroundColor;\n  final IconThemeData? iconTheme;\n  final IconThemeData? actionsIconTheme;\n  final bool primary;\n  final bool? centerTitle;\n  final bool excludeHeaderSemantics;\n  final double? titleSpacing;\n  final double collapsedHeight;\n  final double topPadding;\n  final ShapeBorder? shape;\n  final double? toolbarHeight;\n  final double? leadingWidth;\n  final TextStyle? toolbarTextStyle;\n  final TextStyle? titleTextStyle;\n  final SystemUiOverlayStyle? systemOverlayStyle;\n  final double _bottomHeight;\n  final bool forceMaterialTransparency;\n  final bool useDefaultSemanticsOrder;\n  final Clip? clipBehavior;\n  final EdgeInsetsGeometry? actionsPadding;\n\n  @override\n  double get minExtent => collapsedHeight;\n\n  @override\n  Widget build(\n    BuildContext context,\n    double shrinkOffset,\n    bool overlapsContent,\n    double? maxExtent,\n  ) {\n    maxExtent ??= double.infinity;\n    final bool isScrolledUnder =\n        overlapsContent ||\n        forceElevated ||\n        (shrinkOffset > maxExtent - minExtent);\n    final effectiveTitle = AnimatedOpacity(\n      opacity: isScrolledUnder ? 1 : 0,\n      duration: const Duration(milliseconds: 500),\n      curve: const Cubic(0.2, 0.0, 0.0, 1.0),\n      child: title,\n    );\n\n    return FlexibleSpaceBar.createSettings(\n      minExtent: minExtent,\n      maxExtent: maxExtent,\n      currentExtent: math.max(minExtent, maxExtent - shrinkOffset),\n      isScrolledUnder: isScrolledUnder,\n      hasLeading: leading != null || automaticallyImplyLeading,\n      child: AppBar(\n        clipBehavior: clipBehavior,\n        leading: leading,\n        automaticallyImplyLeading: automaticallyImplyLeading,\n        title: effectiveTitle,\n        actions: actions,\n        automaticallyImplyActions: automaticallyImplyActions,\n        flexibleSpace: IgnorePointer(\n          ignoring: isScrolledUnder,\n          child: DynamicFlexibleSpaceBar(background: flexibleSpace),\n        ),\n        bottom: bottom,\n        elevation: isScrolledUnder ? elevation : 0.0,\n        scrolledUnderElevation: scrolledUnderElevation,\n        shadowColor: shadowColor,\n        surfaceTintColor: surfaceTintColor,\n        backgroundColor: backgroundColor,\n        foregroundColor: foregroundColor,\n        iconTheme: iconTheme,\n        actionsIconTheme: actionsIconTheme,\n        primary: primary,\n        centerTitle: centerTitle,\n        excludeHeaderSemantics: excludeHeaderSemantics,\n        titleSpacing: titleSpacing,\n        shape: shape,\n        toolbarHeight: toolbarHeight,\n        leadingWidth: leadingWidth,\n        toolbarTextStyle: toolbarTextStyle,\n        titleTextStyle: titleTextStyle,\n        systemOverlayStyle: systemOverlayStyle,\n        forceMaterialTransparency: forceMaterialTransparency,\n        useDefaultSemanticsOrder: useDefaultSemanticsOrder,\n        actionsPadding: actionsPadding,\n      ),\n    );\n  }\n\n  @override\n  bool shouldRebuild(covariant _SliverAppBarDelegate oldDelegate) {\n    return leading != oldDelegate.leading ||\n        automaticallyImplyLeading != oldDelegate.automaticallyImplyLeading ||\n        title != oldDelegate.title ||\n        actions != oldDelegate.actions ||\n        automaticallyImplyActions != oldDelegate.automaticallyImplyActions ||\n        flexibleSpace != oldDelegate.flexibleSpace ||\n        bottom != oldDelegate.bottom ||\n        _bottomHeight != oldDelegate._bottomHeight ||\n        elevation != oldDelegate.elevation ||\n        shadowColor != oldDelegate.shadowColor ||\n        backgroundColor != oldDelegate.backgroundColor ||\n        foregroundColor != oldDelegate.foregroundColor ||\n        iconTheme != oldDelegate.iconTheme ||\n        actionsIconTheme != oldDelegate.actionsIconTheme ||\n        primary != oldDelegate.primary ||\n        centerTitle != oldDelegate.centerTitle ||\n        titleSpacing != oldDelegate.titleSpacing ||\n        topPadding != oldDelegate.topPadding ||\n        forceElevated != oldDelegate.forceElevated ||\n        toolbarHeight != oldDelegate.toolbarHeight ||\n        leadingWidth != oldDelegate.leadingWidth ||\n        toolbarTextStyle != oldDelegate.toolbarTextStyle ||\n        titleTextStyle != oldDelegate.titleTextStyle ||\n        systemOverlayStyle != oldDelegate.systemOverlayStyle ||\n        forceMaterialTransparency != oldDelegate.forceMaterialTransparency ||\n        useDefaultSemanticsOrder != oldDelegate.useDefaultSemanticsOrder ||\n        actionsPadding != oldDelegate.actionsPadding;\n  }\n\n  @override\n  String toString() {\n    return '${describeIdentity(this)}(topPadding: ${topPadding.toStringAsFixed(1)}, bottomHeight: ${_bottomHeight.toStringAsFixed(1)}, ...)';\n  }\n}\n\nclass DynamicSliverAppBar extends StatelessWidget {\n  const DynamicSliverAppBar.medium({\n    super.key,\n    this.leading,\n    this.automaticallyImplyLeading = true,\n    required this.title,\n    this.actions,\n    this.automaticallyImplyActions = true,\n    required this.flexibleSpace,\n    this.bottom,\n    this.elevation,\n    this.scrolledUnderElevation,\n    this.shadowColor,\n    this.surfaceTintColor,\n    this.forceElevated = false,\n    this.backgroundColor,\n    this.foregroundColor,\n    this.iconTheme,\n    this.actionsIconTheme,\n    this.primary = true,\n    this.centerTitle,\n    this.excludeHeaderSemantics = false,\n    this.titleSpacing,\n    this.shape,\n    this.leadingWidth,\n    this.toolbarTextStyle,\n    this.titleTextStyle,\n    this.systemOverlayStyle,\n    this.forceMaterialTransparency = false,\n    this.useDefaultSemanticsOrder = true,\n    this.clipBehavior,\n    this.actionsPadding,\n    this.onPerformLayout,\n  });\n\n  final LayoutCallback? onPerformLayout;\n\n  final Widget? leading;\n\n  final bool automaticallyImplyLeading;\n\n  final Widget title;\n\n  final List<Widget>? actions;\n\n  final bool automaticallyImplyActions;\n\n  final Widget flexibleSpace;\n\n  final PreferredSizeWidget? bottom;\n\n  final double? elevation;\n\n  final double? scrolledUnderElevation;\n\n  final Color? shadowColor;\n\n  final Color? surfaceTintColor;\n\n  final bool forceElevated;\n\n  final Color? backgroundColor;\n\n  final Color? foregroundColor;\n\n  final IconThemeData? iconTheme;\n\n  final IconThemeData? actionsIconTheme;\n\n  final bool primary;\n\n  final bool? centerTitle;\n\n  final bool excludeHeaderSemantics;\n\n  final double? titleSpacing;\n\n  final ShapeBorder? shape;\n\n  final double? leadingWidth;\n\n  final TextStyle? toolbarTextStyle;\n\n  final TextStyle? titleTextStyle;\n\n  final SystemUiOverlayStyle? systemOverlayStyle;\n\n  final bool forceMaterialTransparency;\n\n  final bool useDefaultSemanticsOrder;\n\n  final Clip? clipBehavior;\n\n  final EdgeInsetsGeometry? actionsPadding;\n\n  @override\n  Widget build(BuildContext context) {\n    final double bottomHeight = bottom?.preferredSize.height ?? 0.0;\n    final double topPadding = primary\n        ? MediaQuery.viewPaddingOf(context).top\n        : 0.0;\n    final double effectiveCollapsedHeight =\n        topPadding + kToolbarHeight + bottomHeight + 1;\n\n    return SliverPinnedHeader(\n      onPerformLayout: onPerformLayout,\n      delegate: _SliverAppBarDelegate(\n        leading: leading,\n        automaticallyImplyLeading: automaticallyImplyLeading,\n        title: title,\n        actions: actions,\n        automaticallyImplyActions: automaticallyImplyActions,\n        flexibleSpace: flexibleSpace,\n        bottom: bottom,\n        elevation: elevation,\n        scrolledUnderElevation: scrolledUnderElevation,\n        shadowColor: shadowColor,\n        surfaceTintColor: surfaceTintColor,\n        forceElevated: forceElevated,\n        backgroundColor: backgroundColor,\n        foregroundColor: foregroundColor,\n        iconTheme: iconTheme,\n        actionsIconTheme: actionsIconTheme,\n        primary: primary,\n        centerTitle: centerTitle,\n        excludeHeaderSemantics: excludeHeaderSemantics,\n        titleSpacing: titleSpacing,\n        collapsedHeight: effectiveCollapsedHeight,\n        topPadding: topPadding,\n        shape: shape,\n        toolbarHeight: kToolbarHeight,\n        leadingWidth: leadingWidth,\n        toolbarTextStyle: toolbarTextStyle,\n        titleTextStyle: titleTextStyle,\n        systemOverlayStyle: systemOverlayStyle,\n        forceMaterialTransparency: forceMaterialTransparency,\n        useDefaultSemanticsOrder: useDefaultSemanticsOrder,\n        clipBehavior: clipBehavior,\n        actionsPadding: actionsPadding,\n      ),\n    );\n  }\n}\n\n/// ref [FlexibleSpaceBar]\nclass DynamicFlexibleSpaceBar extends StatelessWidget {\n  const DynamicFlexibleSpaceBar({\n    super.key,\n    required this.background,\n    this.collapseMode = CollapseMode.parallax,\n  });\n\n  final Widget background;\n\n  final CollapseMode collapseMode;\n\n  static double _getCollapsePadding(\n    CollapseMode collapseMode,\n    double t,\n    FlexibleSpaceBarSettings settings,\n  ) {\n    switch (collapseMode) {\n      case CollapseMode.pin:\n        return -(settings.maxExtent - settings.currentExtent);\n      case CollapseMode.none:\n        return 0.0;\n      case CollapseMode.parallax:\n        final double deltaExtent = settings.maxExtent - settings.minExtent;\n        return -Tween<double>(begin: 0.0, end: deltaExtent / 4.0).transform(t);\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final FlexibleSpaceBarSettings settings = context\n        .dependOnInheritedWidgetOfExactType<FlexibleSpaceBarSettings>()!;\n\n    double? height;\n    final double opacity;\n    final double topPadding;\n    if (settings.maxExtent == .infinity) {\n      opacity = 1.0;\n      topPadding = 0.0;\n    } else {\n      height = settings.maxExtent;\n\n      final double deltaExtent = settings.maxExtent - settings.minExtent;\n\n      // 0.0 -> Expanded\n      // 1.0 -> Collapsed to toolbar\n      final double t = clampDouble(\n        1.0 - (settings.currentExtent - settings.minExtent) / deltaExtent,\n        0.0,\n        1.0,\n      );\n\n      final double fadeStart = math.max(\n        0.0,\n        1.0 - kToolbarHeight / deltaExtent,\n      );\n      const fadeEnd = 1.0;\n      assert(fadeStart <= fadeEnd);\n      // If the min and max extent are the same, the app bar cannot collapse\n      // and the content should be visible, so opacity = 1.\n      opacity = settings.maxExtent == settings.minExtent\n          ? 1.0\n          : 1.0 - Interval(fadeStart, fadeEnd).transform(t);\n\n      topPadding = _getCollapsePadding(collapseMode, t, settings);\n    }\n\n    return ClipRect(\n      child: CustomHeightWidget(\n        height: height,\n        offset: Offset(0.0, topPadding),\n        child: _FlexibleSpaceHeaderOpacity(\n          // IOS is relying on this semantics node to correctly traverse\n          // through the app bar when it is collapsed.\n          alwaysIncludeSemantics: true,\n          opacity: opacity,\n          child: background,\n        ),\n      ),\n    );\n  }\n}\n\n/// [_FlexibleSpaceHeaderOpacity]\nclass _FlexibleSpaceHeaderOpacity extends SingleChildRenderObjectWidget {\n  const _FlexibleSpaceHeaderOpacity({\n    required this.opacity,\n    required super.child,\n    required this.alwaysIncludeSemantics,\n  });\n\n  final double opacity;\n  final bool alwaysIncludeSemantics;\n\n  @override\n  RenderObject createRenderObject(BuildContext context) {\n    return _RenderFlexibleSpaceHeaderOpacity(\n      opacity: opacity,\n      alwaysIncludeSemantics: alwaysIncludeSemantics,\n    );\n  }\n\n  @override\n  void updateRenderObject(\n    BuildContext context,\n    covariant _RenderFlexibleSpaceHeaderOpacity renderObject,\n  ) {\n    renderObject\n      ..alwaysIncludeSemantics = alwaysIncludeSemantics\n      ..opacity = opacity;\n  }\n}\n\nclass _RenderFlexibleSpaceHeaderOpacity extends RenderOpacity {\n  _RenderFlexibleSpaceHeaderOpacity({\n    super.opacity,\n    super.alwaysIncludeSemantics,\n  });\n\n  @override\n  bool get isRepaintBoundary => false;\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    if (child == null) {\n      return;\n    }\n    if ((opacity * 255).roundToDouble() <= 0) {\n      layer = null;\n      return;\n    }\n    assert(needsCompositing);\n    layer = context.pushOpacity(\n      offset,\n      (opacity * 255).round(),\n      super.paint,\n      oldLayer: layer as OpacityLayer?,\n    );\n    assert(() {\n      layer!.debugCreator = debugCreator;\n      return true;\n    }());\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/dynamic_sliver_app_bar/rendering/sliver_persistent_header.dart",
    "content": "/*\n * This file is part of PiliPlus\n *\n * PiliPlus 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 * PiliPlus 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 PiliPlus.  If not, see <https://www.gnu.org/licenses/>.\n */\n\nimport 'dart:math' as math;\n\nimport 'package:PiliPlus/common/widgets/dynamic_sliver_app_bar/sliver_persistent_header.dart';\nimport 'package:PiliPlus/common/widgets/only_layout_widget.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/rendering.dart' hide LayoutCallback;\nimport 'package:flutter/widgets.dart'\n    hide SliverPersistentHeader, SliverPersistentHeaderDelegate;\n\n/// ref [SliverPersistentHeader]\n\nRect? _trim(\n  Rect? original, {\n  double top = -double.infinity,\n  double right = double.infinity,\n  double bottom = double.infinity,\n  double left = -double.infinity,\n}) => original?.intersect(Rect.fromLTRB(left, top, right, bottom));\n\nabstract class RenderSliverPersistentHeader extends RenderSliver\n    with RenderObjectWithChildMixin<RenderBox>, RenderSliverHelpers {\n  RenderSliverPersistentHeader({RenderBox? child}) {\n    this.child = child;\n  }\n\n  SliverPersistentHeaderElement? element;\n\n  double get minExtent =>\n      (element!.widget as SliverPinnedHeader).delegate.minExtent;\n\n  bool _needsUpdateChild = true;\n\n  double get lastShrinkOffset => _lastShrinkOffset;\n  double _lastShrinkOffset = 0.0;\n\n  bool get lastOverlapsContent => _lastOverlapsContent;\n  bool _lastOverlapsContent = false;\n\n  @protected\n  void updateChild(\n    double shrinkOffset,\n    bool overlapsContent,\n    double? maxExtent,\n  ) {\n    assert(element != null);\n    element!.build(shrinkOffset, overlapsContent, maxExtent);\n  }\n\n  @override\n  void markNeedsLayout() {\n    _needsUpdateChild = true;\n    super.markNeedsLayout();\n  }\n\n  @protected\n  void updateChildIfNeeded(\n    double scrollOffset,\n    double? maxExtent, {\n    bool overlapsContent = false,\n  }) {\n    final double shrinkOffset = maxExtent == null\n        ? scrollOffset\n        : math.min(scrollOffset, maxExtent);\n    if (_needsUpdateChild ||\n        _lastShrinkOffset != shrinkOffset ||\n        _lastOverlapsContent != overlapsContent) {\n      invokeLayoutCallback<SliverConstraints>((SliverConstraints constraints) {\n        assert(constraints == this.constraints);\n        updateChild(shrinkOffset, overlapsContent, maxExtent);\n      });\n      _lastShrinkOffset = shrinkOffset;\n      _lastOverlapsContent = overlapsContent;\n      _needsUpdateChild = false;\n    }\n  }\n\n  @override\n  double childMainAxisPosition(covariant RenderObject child) =>\n      super.childMainAxisPosition(child);\n\n  @override\n  bool hitTestChildren(\n    SliverHitTestResult result, {\n    required double mainAxisPosition,\n    required double crossAxisPosition,\n  }) {\n    assert(geometry!.hitTestExtent > 0.0);\n    if (child != null) {\n      return hitTestBoxChild(\n        BoxHitTestResult.wrap(result),\n        child!,\n        mainAxisPosition: mainAxisPosition,\n        crossAxisPosition: crossAxisPosition,\n      );\n    }\n    return false;\n  }\n\n  @override\n  void applyPaintTransform(RenderObject child, Matrix4 transform) {\n    assert(child == this.child);\n    applyPaintTransformForBoxChild(child as RenderBox, transform);\n  }\n\n  void triggerRebuild() {\n    markNeedsLayout();\n  }\n}\n\nclass SliverPinnedHeader extends RenderObjectWidget {\n  const SliverPinnedHeader({\n    super.key,\n    required this.delegate,\n    this.onPerformLayout,\n  });\n\n  final SliverPersistentHeaderDelegate delegate;\n  final LayoutCallback? onPerformLayout;\n\n  @override\n  SliverPersistentHeaderElement createElement() =>\n      SliverPersistentHeaderElement(this);\n\n  @override\n  RenderSliverPinnedHeader createRenderObject(BuildContext context) {\n    return RenderSliverPinnedHeader(onPerformLayout: onPerformLayout);\n  }\n\n  @override\n  void updateRenderObject(\n    BuildContext context,\n    RenderSliverPinnedHeader renderObject,\n  ) {\n    renderObject.onPerformLayout = onPerformLayout;\n  }\n}\n\nclass RenderSliverPinnedHeader extends RenderSliverPersistentHeader {\n  RenderSliverPinnedHeader({\n    super.child,\n    this.onPerformLayout,\n  });\n\n  LayoutCallback? onPerformLayout;\n\n  ({double crossAxisExtent, double maxExtent})? _maxExtent;\n  double? get maxExtent => _maxExtent?.maxExtent;\n\n  void _rawLayout() {\n    child!.layout(constraints.asBoxConstraints(), parentUsesSize: true);\n    _maxExtent = (\n      crossAxisExtent: constraints.crossAxisExtent,\n      maxExtent: child!.size.height,\n    );\n    onPerformLayout?.call(child!.size);\n  }\n\n  void _layout() {\n    final double shrinkOffset = math.min(\n      constraints.scrollOffset,\n      _maxExtent!.maxExtent,\n    );\n    child!.layout(\n      constraints.asBoxConstraints(\n        maxExtent: math.max(minExtent, _maxExtent!.maxExtent - shrinkOffset),\n      ),\n      parentUsesSize: true,\n    );\n  }\n\n  @override\n  void performLayout() {\n    final constraints = this.constraints;\n    final bool overlapsContent = constraints.overlap > 0.0;\n\n    if (_maxExtent == null) {\n      updateChildIfNeeded(\n        constraints.scrollOffset,\n        _maxExtent?.maxExtent,\n        overlapsContent: overlapsContent,\n      );\n      _rawLayout();\n    } else {\n      if (_maxExtent!.crossAxisExtent == constraints.crossAxisExtent) {\n        updateChildIfNeeded(\n          constraints.scrollOffset,\n          _maxExtent?.maxExtent,\n          overlapsContent: overlapsContent,\n        );\n        _layout();\n      } else {\n        _needsUpdateChild = true;\n        updateChildIfNeeded(\n          constraints.scrollOffset,\n          null,\n          overlapsContent: overlapsContent,\n        );\n        _rawLayout();\n        if (constraints.scrollOffset > 0.0) {\n          _needsUpdateChild = true;\n          updateChildIfNeeded(\n            constraints.scrollOffset,\n            _maxExtent?.maxExtent,\n            overlapsContent: overlapsContent,\n          );\n          _layout();\n        }\n      }\n    }\n    final childExtent = child!.size.height;\n    final maxExtent = _maxExtent!.maxExtent;\n    final double effectiveRemainingPaintExtent = math.max(\n      0,\n      constraints.remainingPaintExtent - constraints.overlap,\n    );\n    final double layoutExtent = clampDouble(\n      maxExtent - constraints.scrollOffset,\n      0.0,\n      effectiveRemainingPaintExtent,\n    );\n    geometry = SliverGeometry(\n      scrollExtent: maxExtent,\n      paintOrigin: constraints.overlap,\n      paintExtent: math.min(childExtent, effectiveRemainingPaintExtent),\n      layoutExtent: layoutExtent,\n      maxPaintExtent: maxExtent,\n      maxScrollObstructionExtent: minExtent,\n      cacheExtent: layoutExtent > 0.0\n          ? -constraints.cacheOrigin + layoutExtent\n          : layoutExtent,\n      hasVisualOverflow: false,\n    );\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    if (child != null && geometry!.visible) {\n      context.paintChild(child!, offset);\n    }\n  }\n\n  @override\n  double childMainAxisPosition(RenderBox child) => 0.0;\n\n  @override\n  void showOnScreen({\n    RenderObject? descendant,\n    Rect? rect,\n    Duration duration = Duration.zero,\n    Curve curve = Curves.ease,\n  }) {\n    final Rect? localBounds = descendant != null\n        ? MatrixUtils.transformRect(\n            descendant.getTransformTo(this),\n            rect ?? descendant.paintBounds,\n          )\n        : rect;\n\n    final Rect? newRect = _trim(localBounds, top: 0);\n\n    super.showOnScreen(\n      descendant: this,\n      rect: newRect,\n      duration: duration,\n      curve: curve,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/dynamic_sliver_app_bar/sliver_persistent_header.dart",
    "content": "/*\n * This file is part of PiliPlus\n *\n * PiliPlus 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 * PiliPlus 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 PiliPlus.  If not, see <https://www.gnu.org/licenses/>.\n */\n\nimport 'package:PiliPlus/common/widgets/dynamic_sliver_app_bar/rendering/sliver_persistent_header.dart';\nimport 'package:flutter/widgets.dart';\n\n/// ref [SliverPersistentHeader]\n\nabstract class SliverPersistentHeaderDelegate {\n  const SliverPersistentHeaderDelegate();\n\n  Widget build(\n    BuildContext context,\n    double shrinkOffset,\n    bool overlapsContent,\n    double? maxExtent,\n  );\n\n  double get minExtent;\n\n  bool shouldRebuild(covariant SliverPersistentHeaderDelegate oldDelegate);\n}\n\nclass SliverPersistentHeaderElement extends RenderObjectElement {\n  SliverPersistentHeaderElement(\n    SliverPinnedHeader super.widget,\n  );\n\n  @override\n  RenderSliverPinnedHeader get renderObject =>\n      super.renderObject as RenderSliverPinnedHeader;\n\n  @override\n  void mount(Element? parent, Object? newSlot) {\n    super.mount(parent, newSlot);\n    renderObject.element = this;\n  }\n\n  @override\n  void unmount() {\n    renderObject.element = null;\n    super.unmount();\n  }\n\n  @override\n  void update(SliverPinnedHeader newWidget) {\n    final oldWidget = widget as SliverPinnedHeader;\n    super.update(newWidget);\n    final SliverPersistentHeaderDelegate newDelegate = newWidget.delegate;\n    final SliverPersistentHeaderDelegate oldDelegate = oldWidget.delegate;\n    if (newDelegate != oldDelegate &&\n        (newDelegate.runtimeType != oldDelegate.runtimeType ||\n            newDelegate.shouldRebuild(oldDelegate))) {\n      final RenderSliverPinnedHeader renderObject = this.renderObject;\n      _updateChild(\n        newDelegate,\n        renderObject.lastShrinkOffset,\n        renderObject.lastOverlapsContent,\n        renderObject.maxExtent,\n      );\n      renderObject.triggerRebuild();\n    }\n  }\n\n  @override\n  void performRebuild() {\n    super.performRebuild();\n    renderObject.triggerRebuild();\n  }\n\n  Element? child;\n\n  void _updateChild(\n    SliverPersistentHeaderDelegate delegate,\n    double shrinkOffset,\n    bool overlapsContent,\n    double? maxExtent,\n  ) {\n    final Widget newWidget = delegate.build(\n      this,\n      shrinkOffset,\n      overlapsContent,\n      maxExtent,\n    );\n    child = updateChild(child, newWidget, null);\n  }\n\n  void build(double shrinkOffset, bool overlapsContent, double? maxExtent) {\n    owner!.buildScope(this, () {\n      final sliverPersistentHeaderRenderObjectWidget =\n          widget as SliverPinnedHeader;\n      _updateChild(\n        sliverPersistentHeaderRenderObjectWidget.delegate,\n        shrinkOffset,\n        overlapsContent,\n        maxExtent,\n      );\n    });\n  }\n\n  @override\n  void forgetChild(Element child) {\n    assert(child == this.child);\n    this.child = null;\n    super.forgetChild(child);\n  }\n\n  @override\n  void insertRenderObjectChild(covariant RenderBox child, Object? slot) {\n    assert(renderObject.debugValidateChild(child));\n    renderObject.child = child;\n  }\n\n  @override\n  void moveRenderObjectChild(\n    covariant RenderObject child,\n    Object? oldSlot,\n    Object? newSlot,\n  ) {\n    assert(false);\n  }\n\n  @override\n  void removeRenderObjectChild(covariant RenderObject child, Object? slot) {\n    renderObject.child = null;\n  }\n\n  @override\n  void visitChildren(ElementVisitor visitor) {\n    if (child != null) {\n      visitor(child!);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/chat_list_view.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'dart:math' as math;\n\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart';\n\nclass ChatListView extends BoxScrollView {\n  ChatListView.separated({\n    super.key,\n    super.scrollDirection,\n    super.controller,\n    super.primary,\n    super.physics,\n    super.padding,\n    required NullableIndexedWidgetBuilder itemBuilder,\n    @Deprecated(\n      'Use findItemIndexCallback instead. '\n      'findChildIndexCallback returns child indices (which include separators), '\n      'while findItemIndexCallback returns item indices (which do not). '\n      'If you were multiplying results by 2 to account for separators, '\n      'you can remove that workaround when migrating to findItemIndexCallback. '\n      'This feature was deprecated after v3.37.0-1.0.pre.',\n    )\n    ChildIndexGetter? findChildIndexCallback,\n    ChildIndexGetter? findItemIndexCallback,\n    required IndexedWidgetBuilder separatorBuilder,\n    required int itemCount,\n    bool addAutomaticKeepAlives = true,\n    bool addRepaintBoundaries = true,\n    bool addSemanticIndexes = true,\n    super.cacheExtent,\n    super.dragStartBehavior,\n    super.keyboardDismissBehavior,\n    super.restorationId,\n    super.clipBehavior,\n    super.hitTestBehavior,\n  }) : assert(itemCount >= 0),\n       assert(\n         findItemIndexCallback == null || findChildIndexCallback == null,\n         'Cannot provide both findItemIndexCallback and findChildIndexCallback. '\n         'Use findItemIndexCallback as findChildIndexCallback is deprecated.',\n       ),\n       childrenDelegate = SliverChildBuilderDelegate(\n         (BuildContext context, int index) {\n           final int itemIndex = index ~/ 2;\n           if (index.isEven) {\n             return itemBuilder(context, itemIndex);\n           }\n           return separatorBuilder(context, itemIndex);\n         },\n         findChildIndexCallback: findItemIndexCallback != null\n             ? (Key key) {\n                 final int? itemIndex = findItemIndexCallback(key);\n                 return itemIndex == null ? null : itemIndex * 2;\n               }\n             : findChildIndexCallback,\n         childCount: _computeActualChildCount(itemCount),\n         addAutomaticKeepAlives: addAutomaticKeepAlives,\n         addRepaintBoundaries: addRepaintBoundaries,\n         addSemanticIndexes: addSemanticIndexes,\n         semanticIndexCallback: (Widget widget, int index) {\n           return index.isEven ? index ~/ 2 : null;\n         },\n       ),\n       super(semanticChildCount: itemCount, reverse: true);\n\n  final SliverChildDelegate childrenDelegate;\n\n  @override\n  Widget buildChildLayout(BuildContext context) {\n    return SliverChatList(delegate: childrenDelegate);\n  }\n\n  static int _computeActualChildCount(int itemCount) {\n    return math.max(0, itemCount * 2 - 1);\n  }\n}\n\nclass SliverChatList extends SliverMultiBoxAdaptorWidget {\n  const SliverChatList({super.key, required super.delegate});\n\n  @override\n  SliverMultiBoxAdaptorElement createElement() =>\n      SliverMultiBoxAdaptorElement(this, replaceMovedChildren: true);\n\n  @override\n  RenderSliverChatList createRenderObject(BuildContext context) {\n    final element = context as SliverMultiBoxAdaptorElement;\n    return RenderSliverChatList(childManager: element);\n  }\n}\n\nclass RenderSliverChatList extends RenderSliverMultiBoxAdaptor\n    with ExtendedRenderObjectMixin {\n  RenderSliverChatList({required super.childManager});\n\n  @override\n  void performLayout() {\n    final SliverConstraints constraints = this.constraints;\n    childManager\n      ..didStartLayout()\n      ..setDidUnderflow(false);\n\n    final double scrollOffset =\n        constraints.scrollOffset + constraints.cacheOrigin;\n    assert(scrollOffset >= 0.0);\n    final double remainingExtent = constraints.remainingCacheExtent;\n    assert(remainingExtent >= 0.0);\n    final double targetEndScrollOffset = scrollOffset + remainingExtent;\n    final BoxConstraints childConstraints = constraints.asBoxConstraints();\n    var leadingGarbage = 0;\n    var trailingGarbage = 0;\n    var reachedEnd = false;\n\n    if (firstChild == null) {\n      if (!addInitialChild()) {\n        geometry = SliverGeometry.zero;\n        childManager.didFinishLayout();\n        return;\n      }\n    }\n\n    ///\n    handleCloseToTrailingBegin();\n\n    RenderBox? leadingChildWithLayout, trailingChildWithLayout;\n\n    RenderBox? earliestUsefulChild = firstChild;\n\n    if (childScrollOffset(firstChild!) == null) {\n      var leadingChildrenWithoutLayoutOffset = 0;\n      while (earliestUsefulChild != null &&\n          childScrollOffset(earliestUsefulChild) == null) {\n        earliestUsefulChild = childAfter(earliestUsefulChild);\n        leadingChildrenWithoutLayoutOffset += 1;\n      }\n\n      collectGarbage(leadingChildrenWithoutLayoutOffset, 0);\n\n      if (firstChild == null) {\n        if (!addInitialChild()) {\n          geometry = SliverGeometry.zero;\n          childManager.didFinishLayout();\n          return;\n        }\n      }\n    }\n\n    earliestUsefulChild = firstChild;\n    for (\n      double earliestScrollOffset = childScrollOffset(earliestUsefulChild!)!;\n      earliestScrollOffset > scrollOffset;\n      earliestScrollOffset = childScrollOffset(earliestUsefulChild)!\n    ) {\n      earliestUsefulChild = insertAndLayoutLeadingChild(\n        childConstraints,\n        parentUsesSize: true,\n      );\n      if (earliestUsefulChild == null) {\n        final childParentData =\n            firstChild!.parentData! as SliverMultiBoxAdaptorParentData;\n        childParentData.layoutOffset = 0.0;\n\n        if (scrollOffset == 0.0) {\n          firstChild!.layout(childConstraints, parentUsesSize: true);\n          earliestUsefulChild = firstChild;\n          leadingChildWithLayout = earliestUsefulChild;\n          trailingChildWithLayout ??= earliestUsefulChild;\n          break;\n        } else {\n          geometry = SliverGeometry(scrollOffsetCorrection: -scrollOffset);\n          return;\n        }\n      }\n\n      final double firstChildScrollOffset =\n          earliestScrollOffset - paintExtentOf(firstChild!);\n\n      if (firstChildScrollOffset < -precisionErrorTolerance) {\n        geometry = SliverGeometry(\n          scrollOffsetCorrection: -firstChildScrollOffset,\n        );\n        final childParentData =\n            firstChild!.parentData! as SliverMultiBoxAdaptorParentData;\n        childParentData.layoutOffset = 0.0;\n        return;\n      }\n\n      final childParentData =\n          earliestUsefulChild.parentData! as SliverMultiBoxAdaptorParentData;\n      childParentData.layoutOffset = firstChildScrollOffset;\n      assert(earliestUsefulChild == firstChild);\n      leadingChildWithLayout = earliestUsefulChild;\n      trailingChildWithLayout ??= earliestUsefulChild;\n    }\n\n    assert(childScrollOffset(firstChild!)! > -precisionErrorTolerance);\n\n    if (scrollOffset < precisionErrorTolerance) {\n      while (indexOf(firstChild!) > 0) {\n        final double earliestScrollOffset = childScrollOffset(firstChild!)!;\n\n        earliestUsefulChild = insertAndLayoutLeadingChild(\n          childConstraints,\n          parentUsesSize: true,\n        );\n        assert(earliestUsefulChild != null);\n        final double firstChildScrollOffset =\n            earliestScrollOffset - paintExtentOf(firstChild!);\n        final childParentData =\n            firstChild!.parentData! as SliverMultiBoxAdaptorParentData;\n        childParentData.layoutOffset = 0.0;\n\n        if (firstChildScrollOffset < -precisionErrorTolerance) {\n          geometry = SliverGeometry(\n            scrollOffsetCorrection: -firstChildScrollOffset,\n          );\n          return;\n        }\n      }\n    }\n\n    assert(earliestUsefulChild == firstChild);\n    assert(childScrollOffset(earliestUsefulChild!)! <= scrollOffset);\n\n    if (leadingChildWithLayout == null) {\n      earliestUsefulChild!.layout(childConstraints, parentUsesSize: true);\n      leadingChildWithLayout = earliestUsefulChild;\n      trailingChildWithLayout = earliestUsefulChild;\n    }\n\n    var inLayoutRange = true;\n    var child = earliestUsefulChild;\n    int index = indexOf(child!);\n    double endScrollOffset = childScrollOffset(child)! + paintExtentOf(child);\n    bool advance() {\n      assert(child != null);\n      if (child == trailingChildWithLayout) {\n        inLayoutRange = false;\n      }\n      child = childAfter(child!);\n      if (child == null) {\n        inLayoutRange = false;\n      }\n      index += 1;\n      if (!inLayoutRange) {\n        if (child == null || indexOf(child!) != index) {\n          child = insertAndLayoutChild(\n            childConstraints,\n            after: trailingChildWithLayout,\n            parentUsesSize: true,\n          );\n          if (child == null) {\n            return false;\n          }\n        } else {\n          child!.layout(childConstraints, parentUsesSize: true);\n        }\n        trailingChildWithLayout = child;\n      }\n      assert(child != null);\n      final childParentData =\n          child!.parentData! as SliverMultiBoxAdaptorParentData;\n      childParentData.layoutOffset = endScrollOffset;\n      assert(childParentData.index == index);\n      endScrollOffset = childScrollOffset(child!)! + paintExtentOf(child!);\n      return true;\n    }\n\n    while (endScrollOffset < scrollOffset) {\n      leadingGarbage += 1;\n      if (!advance()) {\n        assert(leadingGarbage == childCount);\n        assert(child == null);\n\n        collectGarbage(leadingGarbage - 1, 0);\n        assert(firstChild == lastChild);\n        final double extent =\n            childScrollOffset(lastChild!)! + paintExtentOf(lastChild!);\n        geometry = SliverGeometry(scrollExtent: extent, maxPaintExtent: extent);\n        return;\n      }\n    }\n\n    while (endScrollOffset < targetEndScrollOffset) {\n      if (!advance()) {\n        reachedEnd = true;\n        break;\n      }\n    }\n\n    if (child != null) {\n      child = childAfter(child!);\n      while (child != null) {\n        trailingGarbage += 1;\n        child = childAfter(child!);\n      }\n    }\n\n    collectGarbage(leadingGarbage, trailingGarbage);\n\n    assert(debugAssertChildListIsNonEmptyAndContiguous());\n    final double estimatedMaxScrollOffset;\n\n    ///\n    endScrollOffset = handleCloseToTrailingEnd(endScrollOffset);\n\n    if (reachedEnd) {\n      estimatedMaxScrollOffset = endScrollOffset;\n    } else {\n      estimatedMaxScrollOffset = childManager.estimateMaxScrollOffset(\n        constraints,\n        firstIndex: indexOf(firstChild!),\n        lastIndex: indexOf(lastChild!),\n        leadingScrollOffset: childScrollOffset(firstChild!),\n        trailingScrollOffset: endScrollOffset,\n      );\n      assert(\n        estimatedMaxScrollOffset >=\n            endScrollOffset - childScrollOffset(firstChild!)!,\n      );\n    }\n    final double firstChildScrollOffset = childScrollOffset(firstChild!)!;\n    double paintExtent = calculatePaintOffset(\n      constraints,\n      from: firstChildScrollOffset,\n      to: endScrollOffset,\n    );\n    final double cacheExtent = calculateCacheOffset(\n      constraints,\n      from: firstChildScrollOffset,\n      to: endScrollOffset,\n    );\n    final double targetEndScrollOffsetForPaint =\n        constraints.scrollOffset + constraints.remainingPaintExtent;\n\n    ///\n    paintExtent += _closeToTrailingDistance;\n\n    geometry = SliverGeometry(\n      scrollExtent: estimatedMaxScrollOffset,\n      paintExtent: paintExtent,\n      cacheExtent: cacheExtent,\n      maxPaintExtent: estimatedMaxScrollOffset,\n\n      hasVisualOverflow:\n          endScrollOffset > targetEndScrollOffsetForPaint ||\n          constraints.scrollOffset > 0.0,\n    );\n\n    if (estimatedMaxScrollOffset == endScrollOffset) {\n      childManager.setDidUnderflow(true);\n    }\n    childManager.didFinishLayout();\n  }\n}\n\nconst double kChatListPadding = 14.0;\n\n/// from https://github.com/fluttercandies/extended_list\nmixin ExtendedRenderObjectMixin on RenderSliverMultiBoxAdaptor {\n  void handleCloseToTrailingBegin() {\n    _closeToTrailingDistance = 0.0;\n  }\n\n  double handleCloseToTrailingEnd(double endScrollOffset) {\n    final extent = constraints.remainingPaintExtent - kChatListPadding;\n    if (endScrollOffset < extent) {\n      _closeToTrailingDistance = extent - endScrollOffset;\n      return extent;\n    }\n    return endScrollOffset;\n  }\n\n  double _closeToTrailingDistance = 0.0;\n\n  @override\n  double? childScrollOffset(RenderObject child) {\n    return (super.childScrollOffset(child) ?? 0.0) + _closeToTrailingDistance;\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/draggable_sheet/draggable_scrollable_sheet_dyn.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// ignore_for_file: uri_does_not_exist_in_doc_import, depend_on_referenced_packages\n\n/// @docImport 'package:flutter/material.dart';\n/// @docImport 'package:flutter_test/flutter_test.dart';\n///\n/// @docImport 'primary_scroll_controller.dart';\n/// @docImport 'scroll_configuration.dart';\n/// @docImport 'scroll_view.dart';\n/// @docImport 'scrollable.dart';\n/// @docImport 'single_child_scroll_view.dart';\n/// @docImport 'viewport.dart';\nlibrary;\n\nimport 'dart:math' as math;\n\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:collection/collection.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart'\n    hide DraggableScrollableSheet, LayoutBuilder;\n\n/// Controls a [DraggableScrollableSheet].\n///\n/// Draggable scrollable controllers are typically stored as member variables in\n/// [State] objects and are reused in each [State.build]. Controllers can only\n/// be used to control one sheet at a time. A controller can be reused with a\n/// new sheet if the previous sheet has been disposed.\n///\n/// The controller's methods cannot be used until after the controller has been\n/// passed into a [DraggableScrollableSheet] and the sheet has run initState.\n///\n/// A [DraggableScrollableController] is a [Listenable]. It notifies its\n/// listeners whenever an attached sheet changes sizes. It does not notify its\n/// listeners when a sheet is first attached or when an attached sheet's\n/// parameters change without affecting the sheet's current size. It does not\n/// fire when [pixels] changes without [size] changing. For example, if the\n/// constraints provided to an attached sheet change.\nclass DraggableScrollableController extends ChangeNotifier {\n  /// Creates a controller for [DraggableScrollableSheet].\n  DraggableScrollableController() {\n    if (kFlutterMemoryAllocationsEnabled) {\n      ChangeNotifier.maybeDispatchObjectCreation(this);\n    }\n  }\n\n  _DraggableScrollableSheetScrollController? _attachedController;\n  final Set<AnimationController> _animationControllers =\n      <AnimationController>{};\n\n  /// Get the current size (as a fraction of the parent height) of the attached sheet.\n  double get size {\n    _assertAttached();\n    return _attachedController!.extent.currentSize;\n  }\n\n  /// Get the current pixel height of the attached sheet.\n  double get pixels {\n    _assertAttached();\n    return _attachedController!.extent.currentPixels;\n  }\n\n  /// Convert a sheet's size (fractional value of parent container height) to pixels.\n  double sizeToPixels(double size) {\n    _assertAttached();\n    return _attachedController!.extent.sizeToPixels(size);\n  }\n\n  /// Returns Whether any [DraggableScrollableController] objects have attached themselves to the\n  /// [DraggableScrollableSheet].\n  ///\n  /// If this is false, then members that interact with the [ScrollPosition],\n  /// such as [sizeToPixels], [size], [animateTo], and [jumpTo], must not be\n  /// called.\n  bool get isAttached =>\n      _attachedController != null && _attachedController!.hasClients;\n\n  /// Convert a sheet's pixel height to size (fractional value of parent container height).\n  double pixelsToSize(double pixels) {\n    _assertAttached();\n    return _attachedController!.extent.pixelsToSize(pixels);\n  }\n\n  /// Animates the attached sheet from its current size to the given [size], a\n  /// fractional value of the parent container's height.\n  ///\n  /// Any active sheet animation is canceled. If the sheet's internal scrollable\n  /// is currently animating (e.g. responding to a user fling), that animation is\n  /// canceled as well.\n  ///\n  /// An animation will be interrupted whenever the user attempts to scroll\n  /// manually, whenever another activity is started, or when the sheet hits its\n  /// max or min size (e.g. if you animate to 1 but the max size is .8, the\n  /// animation will stop playing when it reaches .8).\n  ///\n  /// The duration must not be zero. To jump to a particular value without an\n  /// animation, use [jumpTo].\n  ///\n  /// The sheet will not snap after calling [animateTo] even if [DraggableScrollableSheet.snap]\n  /// is true. Snapping only occurs after user drags.\n  ///\n  /// When calling [animateTo] in widget tests, `await`ing the returned\n  /// [Future] may cause the test to hang and timeout. Instead, use\n  /// [WidgetTester.pumpAndSettle].\n  Future<void> animateTo(\n    double size, {\n    required Duration duration,\n    required Curve curve,\n  }) async {\n    _assertAttached();\n    assert(size >= 0 && size <= 1);\n    assert(duration != Duration.zero);\n    final animationController = AnimationController.unbounded(\n      vsync: _attachedController!.position.context.vsync,\n      value: _attachedController!.extent.currentSize,\n    );\n    _animationControllers.add(animationController);\n    _attachedController!.position.goIdle();\n    // This disables any snapping until the next user interaction with the sheet.\n    _attachedController!.extent.hasDragged = false;\n    _attachedController!.extent.hasChanged = true;\n    _attachedController!.extent.startActivity(\n      onCanceled: () {\n        // Don't stop the controller if it's already finished and may have been disposed.\n        if (animationController.isAnimating) {\n          animationController.stop();\n        }\n      },\n    );\n    animationController.addListener(() {\n      _attachedController!.extent.updateSize(\n        animationController.value,\n        _attachedController!.position.context.notificationContext!,\n      );\n    });\n    await animationController.animateTo(\n      clampDouble(\n        size,\n        _attachedController!.extent.minSize,\n        _attachedController!.extent.maxSize,\n      ),\n      duration: duration,\n      curve: curve,\n    );\n  }\n\n  /// Jumps the attached sheet from its current size to the given [size], a\n  /// fractional value of the parent container's height.\n  ///\n  /// If [size] is outside of a the attached sheet's min or max child size,\n  /// [jumpTo] will jump the sheet to the nearest valid size instead.\n  ///\n  /// Any active sheet animation is canceled. If the sheet's inner scrollable\n  /// is currently animating (e.g. responding to a user fling), that animation is\n  /// canceled as well.\n  ///\n  /// The sheet will not snap after calling [jumpTo] even if [DraggableScrollableSheet.snap]\n  /// is true. Snapping only occurs after user drags.\n  void jumpTo(double size) {\n    _assertAttached();\n    assert(size >= 0 && size <= 1);\n    // Call start activity to interrupt any other playing activities.\n    _attachedController!.extent.startActivity(onCanceled: () {});\n    _attachedController!.position.goIdle();\n    _attachedController!.extent.hasDragged = false;\n    _attachedController!.extent.hasChanged = true;\n    _attachedController!.extent.updateSize(\n      size,\n      _attachedController!.position.context.notificationContext!,\n    );\n  }\n\n  /// Reset the attached sheet to its initial size (see: [DraggableScrollableSheet.initialChildSize]).\n  void reset() {\n    _assertAttached();\n    _attachedController!.reset();\n  }\n\n  void _assertAttached() {\n    assert(\n      isAttached,\n      'DraggableScrollableController is not attached to a sheet. A DraggableScrollableController '\n      'must be used in a DraggableScrollableSheet before any of its methods are called.',\n    );\n  }\n\n  void _attach(_DraggableScrollableSheetScrollController scrollController) {\n    assert(\n      _attachedController == null,\n      'Draggable scrollable controller is already attached to a sheet.',\n    );\n    _attachedController = scrollController;\n    _attachedController!.extent._currentSize.addListener(notifyListeners);\n    _attachedController!.onPositionDetached = _disposeAnimationControllers;\n  }\n\n  void _onExtentReplaced(_DraggableSheetExtent previousExtent) {\n    // When the extent has been replaced, the old extent is already disposed and\n    // the controller will point to a new extent. We have to add our listener to\n    // the new extent.\n    _attachedController!.extent._currentSize.addListener(notifyListeners);\n    if (previousExtent.currentSize != _attachedController!.extent.currentSize) {\n      // The listener won't fire for a change in size between two extent\n      // objects so we have to fire it manually here.\n      notifyListeners();\n    }\n  }\n\n  void _detach({bool disposeExtent = false}) {\n    if (disposeExtent) {\n      _attachedController?.extent.dispose();\n    } else {\n      _attachedController?.extent._currentSize.removeListener(notifyListeners);\n    }\n    _disposeAnimationControllers();\n    _attachedController = null;\n  }\n\n  void _disposeAnimationControllers() {\n    for (final AnimationController animationController\n        in _animationControllers) {\n      animationController.dispose();\n    }\n    _animationControllers.clear();\n  }\n}\n\n/// A container for a [Scrollable] that responds to drag gestures by resizing\n/// the scrollable until a limit is reached, and then scrolling.\n///\n/// {@youtube 560 315 https://www.youtube.com/watch?v=Hgw819mL_78}\n///\n/// This widget can be dragged along the vertical axis between its\n/// [minChildSize], which defaults to `0.25` and [maxChildSize], which defaults\n/// to `1.0`. These sizes are percentages of the height of the parent container.\n///\n/// The widget coordinates resizing and scrolling of the widget returned by\n/// builder as the user drags along the horizontal axis.\n///\n/// The widget will initially be displayed at its initialChildSize which\n/// defaults to `0.5`, meaning half the height of its parent. Dragging will work\n/// between the range of minChildSize and maxChildSize (as percentages of the\n/// parent container's height) as long as the builder creates a widget which\n/// uses the provided [ScrollController]. If the widget created by the\n/// [ScrollableWidgetBuilder] does not use the provided [ScrollController], the\n/// sheet will remain at the initialChildSize.\n///\n/// By default, the widget will stay at whatever size the user drags it to. To\n/// make the widget snap to specific sizes whenever they lift their finger\n/// during a drag, set [snap] to `true`. The sheet will snap between\n/// [minChildSize] and [maxChildSize]. Use [snapSizes] to add more sizes for\n/// the sheet to snap between.\n///\n/// The snapping effect is only applied on user drags. Programmatically\n/// manipulating the sheet size via [DraggableScrollableController.animateTo] or\n/// [DraggableScrollableController.jumpTo] will ignore [snap] and [snapSizes].\n///\n/// By default, the widget will expand its non-occupied area to fill available\n/// space in the parent. If this is not desired, e.g. because the parent wants\n/// to position sheet based on the space it is taking, the [expand] property\n/// may be set to false.\n///\n/// {@tool dartpad}\n///\n/// This is a sample widget which shows a [ListView] that has 25 [ListTile]s.\n/// It starts out as taking up half the body of the [Scaffold], and can be\n/// dragged up to the full height of the scaffold or down to 25% of the height\n/// of the scaffold. Upon reaching full height, the list contents will be\n/// scrolled up or down, until they reach the top of the list again and the user\n/// drags the sheet back down.\n///\n/// On desktop and web running on desktop platforms, dragging to scroll with a mouse is disabled by default\n/// to align with the natural behavior found in other desktop applications.\n///\n/// This behavior is dictated by the [ScrollBehavior], and can be changed by adding\n/// [PointerDeviceKind.mouse] to [ScrollBehavior.dragDevices].\n/// For more info on this, please refer to https://docs.flutter.dev/release/breaking-changes/default-scroll-behavior-drag\n///\n/// Alternatively, this example illustrates how to add a drag handle for desktop applications.\n///\n/// ** See code in examples/api/lib/widgets/draggable_scrollable_sheet/draggable_scrollable_sheet.0.dart **\n/// {@end-tool}\nclass DraggableScrollableSheet extends StatefulWidget {\n  /// Creates a widget that can be dragged and scrolled in a single gesture.\n  const DraggableScrollableSheet({\n    super.key,\n    this.initialChildSize = 0.5,\n    this.minChildSize = 0.25,\n    this.maxChildSize = 1.0,\n    this.expand = true,\n    this.snap = false,\n    this.snapSizes,\n    this.snapAnimationDuration,\n    this.controller,\n    this.shouldCloseOnMinExtent = true,\n    required this.builder,\n  }) : assert(minChildSize >= 0.0),\n       assert(maxChildSize <= 1.0),\n       assert(minChildSize <= initialChildSize),\n       assert(initialChildSize <= maxChildSize),\n       assert(\n         snapAnimationDuration == null || snapAnimationDuration > Duration.zero,\n       );\n\n  /// The initial fractional value of the parent container's height to use when\n  /// displaying the widget.\n  ///\n  /// Rebuilding the sheet with a new [initialChildSize] will only move\n  /// the sheet to the new value if the sheet has not yet been dragged since it\n  /// was first built or since the last call to [DraggableScrollableActuator.reset].\n  ///\n  /// The default value is `0.5`.\n  final double initialChildSize;\n\n  /// The minimum fractional value of the parent container's height to use when\n  /// displaying the widget.\n  ///\n  /// The default value is `0.25`.\n  final double minChildSize;\n\n  /// The maximum fractional value of the parent container's height to use when\n  /// displaying the widget.\n  ///\n  /// The default value is `1.0`.\n  final double maxChildSize;\n\n  /// Whether the widget should expand to fill the available space in its parent\n  /// or not.\n  ///\n  /// In most cases, this should be true. However, in the case of a parent\n  /// widget that will position this one based on its desired size (such as a\n  /// [Center]), this should be set to false.\n  ///\n  /// The default value is true.\n  final bool expand;\n\n  /// Whether the widget should snap between [snapSizes] when the user lifts\n  /// their finger during a drag.\n  ///\n  /// If the user's finger was still moving when they lifted it, the widget will\n  /// snap to the next snap size (see [snapSizes]) in the direction of the drag.\n  /// If their finger was still, the widget will snap to the nearest snap size.\n  ///\n  /// Snapping is not applied when the sheet is programmatically moved by\n  /// calling [DraggableScrollableController.animateTo] or [DraggableScrollableController.jumpTo].\n  ///\n  /// Rebuilding the sheet with snap newly enabled will immediately trigger a\n  /// snap unless the sheet has not yet been dragged away from\n  /// [initialChildSize] since first being built or since the last call to\n  /// [DraggableScrollableActuator.reset].\n  final bool snap;\n\n  /// A list of target sizes that the widget should snap to.\n  ///\n  /// Snap sizes are fractional values of the parent container's height. They\n  /// must be listed in increasing order and be between [minChildSize] and\n  /// [maxChildSize].\n  ///\n  /// The [minChildSize] and [maxChildSize] are implicitly included in snap\n  /// sizes and do not need to be specified here. For example, `snapSizes = [.5]`\n  /// will result in a sheet that snaps between [minChildSize], `.5`, and\n  /// [maxChildSize].\n  ///\n  /// Any modifications to the [snapSizes] list will not take effect until the\n  /// `build` function containing this widget is run again.\n  ///\n  /// Rebuilding with a modified or new list will trigger a snap unless the\n  /// sheet has not yet been dragged away from [initialChildSize] since first\n  /// being built or since the last call to [DraggableScrollableActuator.reset].\n  final List<double>? snapSizes;\n\n  /// Defines a duration for the snap animations.\n  ///\n  /// If it's not set, then the animation duration is the distance to the snap\n  /// target divided by the velocity of the widget.\n  final Duration? snapAnimationDuration;\n\n  /// A controller that can be used to programmatically control this sheet.\n  final DraggableScrollableController? controller;\n\n  /// Whether the sheet, when dragged (or flung) to its minimum size, should\n  /// cause its parent sheet to close.\n  ///\n  /// Set on emitted [DraggableScrollableNotification]s. It is up to parent\n  /// classes to properly read and handle this value.\n  final bool shouldCloseOnMinExtent;\n\n  /// The builder that creates a child to display in this widget, which will\n  /// use the provided [ScrollController] to enable dragging and scrolling\n  /// of the contents.\n  final ScrollableWidgetBuilder builder;\n\n  @override\n  State<DraggableScrollableSheet> createState() =>\n      _DraggableScrollableSheetState();\n}\n\n/// Manages state between [_DraggableScrollableSheetState],\n/// [_DraggableScrollableSheetScrollController], and\n/// [_DraggableScrollableSheetScrollPosition].\n///\n/// The State knows the pixels available along the axis the widget wants to\n/// scroll, but expects to get a fraction of those pixels to render the sheet.\n///\n/// The ScrollPosition knows the number of pixels a user wants to move the sheet.\n///\n/// The [currentSize] will never be null.\n/// The [availablePixels] will never be null, but may be `double.infinity`.\nclass _DraggableSheetExtent {\n  _DraggableSheetExtent({\n    required this.minSize,\n    required this.maxSize,\n    required this.snap,\n    required this.snapSizes,\n    required this.initialSize,\n    this.snapAnimationDuration,\n    ValueNotifier<double>? currentSize,\n    bool? hasDragged,\n    bool? hasChanged,\n    this.shouldCloseOnMinExtent = true,\n  }) : assert(minSize >= 0),\n       assert(maxSize <= 1),\n       assert(minSize <= initialSize),\n       assert(initialSize <= maxSize),\n       _currentSize = currentSize ?? ValueNotifier<double>(initialSize),\n       availablePixels = double.infinity,\n       hasDragged = hasDragged ?? false,\n       hasChanged = hasChanged ?? false {\n    assert(debugMaybeDispatchCreated('widgets', '_DraggableSheetExtent', this));\n  }\n\n  VoidCallback? _cancelActivity;\n\n  final double minSize;\n  final double maxSize;\n  final bool snap;\n  final List<double> snapSizes;\n  final Duration? snapAnimationDuration;\n  final double initialSize;\n  final bool shouldCloseOnMinExtent;\n  final ValueNotifier<double> _currentSize;\n  double availablePixels;\n\n  // Used to disable snapping until the user has dragged on the sheet.\n  bool hasDragged;\n\n  // Used to determine if the sheet should move to a new initial size when it\n  // changes.\n  // We need both `hasChanged` and `hasDragged` to achieve the following\n  // behavior:\n  //   1. The sheet should only snap following user drags (as opposed to\n  //      programmatic sheet changes). See docs for `animateTo` and `jumpTo`.\n  //   2. The sheet should move to a new initial child size on rebuild iff the\n  //      sheet has not changed, either by drag or programmatic control. See\n  //      docs for `initialChildSize`.\n  bool hasChanged;\n\n  bool get isAtMin => minSize >= _currentSize.value;\n  bool get isAtMax => maxSize <= _currentSize.value;\n\n  double get currentSize => _currentSize.value;\n  double get currentPixels => sizeToPixels(_currentSize.value);\n\n  List<double> get pixelSnapSizes => snapSizes.map(sizeToPixels).toList();\n\n  /// Start an activity that affects the sheet and register a cancel call back\n  /// that will be called if another activity starts.\n  ///\n  /// The `onCanceled` callback will get called even if the subsequent activity\n  /// started after this one finished, so `onCanceled` must be safe to call at\n  /// any time.\n  void startActivity({required VoidCallback onCanceled}) {\n    _cancelActivity?.call();\n    _cancelActivity = onCanceled;\n  }\n\n  /// The scroll position gets inputs in terms of pixels, but the size is\n  /// expected to be expressed as a number between 0..1.\n  ///\n  /// This should only be called to respond to a user drag. To update the\n  /// size in response to a programmatic call, use [updateSize] directly.\n  void addPixelDelta(double delta, BuildContext context) {\n    // Stop any playing sheet animations.\n    _cancelActivity?.call();\n    _cancelActivity = null;\n    // The user has interacted with the sheet, set `hasDragged` to true so that\n    // we'll snap if applicable.\n    hasDragged = true;\n    hasChanged = true;\n    if (availablePixels == 0) {\n      return;\n    }\n    updateSize(currentSize + pixelsToSize(delta), context);\n  }\n\n  /// Set the size to the new value. [newSize] should be a number between\n  /// [minSize] and [maxSize].\n  ///\n  /// This can be triggered by a programmatic (e.g. controller triggered) change\n  /// or a user drag.\n  void updateSize(double newSize, BuildContext context) {\n    final double clampedSize = clampDouble(newSize, minSize, maxSize);\n    if (_currentSize.value == clampedSize) {\n      return;\n    }\n    _currentSize.value = clampedSize;\n    DraggableScrollableNotification(\n      minExtent: minSize,\n      maxExtent: maxSize,\n      extent: currentSize,\n      initialExtent: initialSize,\n      context: context,\n      shouldCloseOnMinExtent: shouldCloseOnMinExtent,\n    ).dispatch(context);\n  }\n\n  double pixelsToSize(double pixels) {\n    return pixels / availablePixels * maxSize;\n  }\n\n  double sizeToPixels(double size) {\n    return size / maxSize * availablePixels;\n  }\n\n  void dispose() {\n    assert(debugMaybeDispatchDisposed(this));\n    _currentSize.dispose();\n  }\n\n  _DraggableSheetExtent copyWith({\n    required double minSize,\n    required double maxSize,\n    required bool snap,\n    required List<double> snapSizes,\n    required double initialSize,\n    required Duration? snapAnimationDuration,\n    required bool shouldCloseOnMinExtent,\n  }) {\n    return _DraggableSheetExtent(\n      minSize: minSize,\n      maxSize: maxSize,\n      snap: snap,\n      snapSizes: snapSizes,\n      snapAnimationDuration: snapAnimationDuration,\n      initialSize: initialSize,\n      // Set the current size to the possibly updated initial size if the sheet\n      // hasn't changed yet.\n      currentSize: ValueNotifier<double>(\n        hasChanged\n            ? clampDouble(_currentSize.value, minSize, maxSize)\n            : initialSize,\n      ),\n      hasDragged: hasDragged,\n      hasChanged: hasChanged,\n      shouldCloseOnMinExtent: shouldCloseOnMinExtent,\n    );\n  }\n}\n\nclass _DraggableScrollableSheetState extends State<DraggableScrollableSheet> {\n  late _DraggableScrollableSheetScrollController _scrollController;\n  late _DraggableSheetExtent _extent;\n\n  @override\n  void initState() {\n    super.initState();\n    _extent = _DraggableSheetExtent(\n      minSize: widget.minChildSize,\n      maxSize: widget.maxChildSize,\n      snap: widget.snap,\n      snapSizes: _impliedSnapSizes(),\n      snapAnimationDuration: widget.snapAnimationDuration,\n      initialSize: widget.initialChildSize,\n      shouldCloseOnMinExtent: widget.shouldCloseOnMinExtent,\n    );\n    _scrollController = _DraggableScrollableSheetScrollController(\n      extent: _extent,\n    );\n    widget.controller?._attach(_scrollController);\n  }\n\n  List<double> _impliedSnapSizes() {\n    for (var index = 0; index < (widget.snapSizes?.length ?? 0); index += 1) {\n      final double snapSize = widget.snapSizes![index];\n      assert(\n        snapSize >= widget.minChildSize && snapSize <= widget.maxChildSize,\n        '${_snapSizeErrorMessage(index)}\\nSnap sizes must be between `minChildSize` and `maxChildSize`. ',\n      );\n      assert(\n        index == 0 || snapSize > widget.snapSizes![index - 1],\n        '${_snapSizeErrorMessage(index)}\\nSnap sizes must be in ascending order. ',\n      );\n    }\n    // Ensure the snap sizes start and end with the min and max child sizes.\n    if (widget.snapSizes == null || widget.snapSizes!.isEmpty) {\n      return <double>[widget.minChildSize, widget.maxChildSize];\n    }\n    return <double>[\n      if (widget.snapSizes!.first != widget.minChildSize) widget.minChildSize,\n      ...widget.snapSizes!,\n      if (widget.snapSizes!.last != widget.maxChildSize) widget.maxChildSize,\n    ];\n  }\n\n  @override\n  void didUpdateWidget(covariant DraggableScrollableSheet oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (widget.controller != oldWidget.controller) {\n      oldWidget.controller?._detach();\n      widget.controller?._attach(_scrollController);\n    }\n    _replaceExtent(oldWidget);\n  }\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    if (_InheritedResetNotifier.shouldReset(context)) {\n      _scrollController.reset();\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return ValueListenableBuilder<double>(\n      valueListenable: _extent._currentSize,\n      builder: (BuildContext context, double currentSize, Widget? child) =>\n          LayoutBuilder(\n            builder: (BuildContext context, BoxConstraints constraints) {\n              _extent.availablePixels =\n                  widget.maxChildSize * constraints.biggest.height;\n              final Widget sheet = FractionallySizedBox(\n                heightFactor: currentSize,\n                alignment: Alignment.bottomCenter,\n                child: child,\n              );\n              return widget.expand ? SizedBox.expand(child: sheet) : sheet;\n            },\n          ),\n      child: widget.builder(context, _scrollController),\n    );\n  }\n\n  @override\n  void dispose() {\n    if (widget.controller == null) {\n      _extent.dispose();\n    } else {\n      widget.controller!._detach(disposeExtent: true);\n    }\n    _scrollController.dispose();\n    super.dispose();\n  }\n\n  void _replaceExtent(covariant DraggableScrollableSheet oldWidget) {\n    final _DraggableSheetExtent previousExtent = _extent;\n    _extent = previousExtent.copyWith(\n      minSize: widget.minChildSize,\n      maxSize: widget.maxChildSize,\n      snap: widget.snap,\n      snapSizes: _impliedSnapSizes(),\n      snapAnimationDuration: widget.snapAnimationDuration,\n      initialSize: widget.initialChildSize,\n      shouldCloseOnMinExtent: widget.shouldCloseOnMinExtent,\n    );\n    // Modify the existing scroll controller instead of replacing it so that\n    // developers listening to the controller do not have to rebuild their listeners.\n    _scrollController.extent = _extent;\n    // If an external facing controller was provided, let it know that the\n    // extent has been replaced.\n    widget.controller?._onExtentReplaced(previousExtent);\n    previousExtent.dispose();\n    if (widget.snap &&\n        (widget.snap != oldWidget.snap ||\n            widget.snapSizes != oldWidget.snapSizes) &&\n        _scrollController.hasClients) {\n      // Trigger a snap in case snap or snapSizes has changed and there is a\n      // scroll position currently attached. We put this in a post frame\n      // callback so that `build` can update `_extent.availablePixels` before\n      // this runs-we can't use the previous extent's available pixels as it may\n      // have changed when the widget was updated.\n      WidgetsBinding.instance.addPostFrameCallback((Duration timeStamp) {\n        for (\n          var index = 0;\n          index < _scrollController.positions.length;\n          index++\n        ) {\n          final position =\n              _scrollController.positions.elementAt(index)\n                  as _DraggableScrollableSheetScrollPosition;\n          position.goBallistic(0);\n        }\n      }, debugLabel: 'DraggableScrollableSheet.snap');\n    }\n  }\n\n  String _snapSizeErrorMessage(int invalidIndex) {\n    final List<String> snapSizesWithIndicator = widget.snapSizes!\n        .asMap()\n        .keys\n        .map((int index) {\n          final snapSizeString = widget.snapSizes![index].toString();\n          if (index == invalidIndex) {\n            return '>>> $snapSizeString <<<';\n          }\n          return snapSizeString;\n        })\n        .toList();\n    return \"Invalid snapSize '${widget.snapSizes![invalidIndex]}' at index $invalidIndex of:\\n\"\n        '  $snapSizesWithIndicator';\n  }\n}\n\n/// A [ScrollController] suitable for use in a [ScrollableWidgetBuilder] created\n/// by a [DraggableScrollableSheet].\n///\n/// If a [DraggableScrollableSheet] contains content that is exceeds the height\n/// of its container, this controller will allow the sheet to both be dragged to\n/// fill the container and then scroll the child content.\n///\n/// See also:\n///\n///  * [_DraggableScrollableSheetScrollPosition], which manages the positioning logic for\n///    this controller.\n///  * [PrimaryScrollController], which can be used to establish a\n///    [_DraggableScrollableSheetScrollController] as the primary controller for\n///    descendants.\nclass _DraggableScrollableSheetScrollController extends ScrollController {\n  _DraggableScrollableSheetScrollController({\n    required this.extent,\n  });\n\n  _DraggableSheetExtent extent;\n  VoidCallback? onPositionDetached;\n\n  @override\n  _DraggableScrollableSheetScrollPosition createScrollPosition(\n    ScrollPhysics physics,\n    ScrollContext context,\n    ScrollPosition? oldPosition,\n  ) {\n    return _DraggableScrollableSheetScrollPosition(\n      physics: physics.applyTo(const AlwaysScrollableScrollPhysics()),\n      context: context,\n      oldPosition: oldPosition,\n      getExtent: () => extent,\n    );\n  }\n\n  @override\n  void debugFillDescription(List<String> description) {\n    super.debugFillDescription(description);\n    description.add('extent: $extent');\n  }\n\n  @override\n  _DraggableScrollableSheetScrollPosition get position =>\n      super.position as _DraggableScrollableSheetScrollPosition;\n\n  void reset() {\n    extent._cancelActivity?.call();\n    extent.hasDragged = false;\n    extent.hasChanged = false;\n    // jumpTo can result in trying to replace semantics during build.\n    // Just animate really fast.\n    // Avoid doing it at all if the offset is already 0.0.\n    if (offset != 0.0) {\n      animateTo(\n        0.0,\n        duration: const Duration(milliseconds: 1),\n        curve: Curves.linear,\n      );\n    }\n    extent.updateSize(\n      extent.initialSize,\n      position.context.notificationContext!,\n    );\n  }\n\n  @override\n  void detach(ScrollPosition position) {\n    onPositionDetached?.call();\n    super.detach(position);\n  }\n}\n\n/// A scroll position that manages scroll activities for\n/// [_DraggableScrollableSheetScrollController].\n///\n/// This class is a concrete subclass of [ScrollPosition] logic that handles a\n/// single [ScrollContext], such as a [Scrollable]. An instance of this class\n/// manages [ScrollActivity] instances, which changes the\n/// [_DraggableSheetExtent.currentSize] or visible content offset in the\n/// [Scrollable]'s [Viewport]\n///\n/// See also:\n///\n///  * [_DraggableScrollableSheetScrollController], which uses this as its [ScrollPosition].\nclass _DraggableScrollableSheetScrollPosition\n    extends ScrollPositionWithSingleContext {\n  _DraggableScrollableSheetScrollPosition({\n    required super.physics,\n    required super.context,\n    super.oldPosition,\n    required this.getExtent,\n  });\n\n  VoidCallback? _dragCancelCallback;\n  final _DraggableSheetExtent Function() getExtent;\n  final Set<AnimationController> _ballisticControllers =\n      <AnimationController>{};\n  bool get listShouldScroll => pixels > 0.0;\n\n  _DraggableSheetExtent get extent => getExtent();\n\n  bool _isAtTop = true;\n\n  @override\n  void absorb(ScrollPosition other) {\n    super.absorb(other);\n    assert(_dragCancelCallback == null);\n\n    if (other is! _DraggableScrollableSheetScrollPosition) {\n      return;\n    }\n\n    if (other._dragCancelCallback != null) {\n      _dragCancelCallback = other._dragCancelCallback;\n      other._dragCancelCallback = null;\n    }\n  }\n\n  @override\n  void beginActivity(ScrollActivity? newActivity) {\n    // Cancel the running ballistic simulations\n    for (final AnimationController ballisticController\n        in _ballisticControllers) {\n      ballisticController.stop();\n    }\n    super.beginActivity(newActivity);\n  }\n\n  @override\n  void applyUserOffset(double delta) {\n    if (!_isAtTop) {\n      super.applyUserOffset(delta);\n    } else if (!listShouldScroll &&\n        (!(extent.isAtMin || extent.isAtMax) ||\n            (extent.isAtMin && delta < 0) ||\n            (extent.isAtMax && delta > 0))) {\n      extent.addPixelDelta(-delta, context.notificationContext!);\n    } else {\n      super.applyUserOffset(delta);\n    }\n  }\n\n  // Checks if the sheet's current size is close to a snap size, returning the\n  // snap size if so; returns null otherwise.\n  double? _getCurrentSnapSize() {\n    return extent.snapSizes.firstWhereOrNull((double snapSize) {\n      return (extent.currentSize - snapSize).abs() <=\n          extent.pixelsToSize(physics.toleranceFor(this).distance);\n    });\n  }\n\n  bool _isAtSnapSize() => _getCurrentSnapSize() != null;\n\n  bool _shouldSnap() => extent.snap && extent.hasDragged && !_isAtSnapSize();\n\n  @override\n  void dispose() {\n    for (final AnimationController ballisticController\n        in _ballisticControllers) {\n      ballisticController.dispose();\n    }\n    _ballisticControllers.clear();\n    super.dispose();\n  }\n\n  @override\n  void goBallistic(double velocity) {\n    if (!_isAtTop) {\n      super.goBallistic(velocity);\n      return;\n    }\n    if ((velocity == 0.0 && !_shouldSnap()) ||\n        (velocity < 0.0 && listShouldScroll) ||\n        (velocity > 0.0 && extent.isAtMax)) {\n      super.goBallistic(velocity);\n      return;\n    }\n    // Scrollable expects that we will dispose of its current _dragCancelCallback\n    _dragCancelCallback?.call();\n    _dragCancelCallback = null;\n\n    late final Simulation simulation;\n    if (extent.snap) {\n      // Snap is enabled, simulate snapping instead of clamping scroll.\n      simulation = _SnappingSimulation(\n        position: extent.currentPixels,\n        initialVelocity: velocity,\n        pixelSnapSize: extent.pixelSnapSizes,\n        snapAnimationDuration: extent.snapAnimationDuration,\n        tolerance: physics.toleranceFor(this),\n      );\n    } else {\n      // The iOS bouncing simulation just isn't right here - once we delegate\n      // the ballistic back to the ScrollView, it will use the right simulation.\n      simulation = ClampingScrollSimulation(\n        // Run the simulation in terms of pixels, not extent.\n        position: extent.currentPixels,\n        velocity: velocity,\n        tolerance: physics.toleranceFor(this),\n      );\n    }\n\n    final ballisticController = AnimationController.unbounded(\n      debugLabel: objectRuntimeType(this, '_DraggableScrollableSheetPosition'),\n      vsync: context.vsync,\n    );\n    _ballisticControllers.add(ballisticController);\n\n    double lastPosition = extent.currentPixels;\n    void tick() {\n      final double delta = ballisticController.value - lastPosition;\n      lastPosition = ballisticController.value;\n      extent.addPixelDelta(delta, context.notificationContext!);\n      if ((velocity > 0 && extent.isAtMax) ||\n          (velocity < 0 && extent.isAtMin)) {\n        // Make sure we pass along enough velocity to keep scrolling - otherwise\n        // we just \"bounce\" off the top making it look like the list doesn't\n        // have more to scroll.\n        velocity =\n            ballisticController.velocity +\n            (physics.toleranceFor(this).velocity *\n                ballisticController.velocity.sign);\n        super.goBallistic(velocity);\n        ballisticController.stop();\n      } else if (ballisticController.isCompleted) {\n        // Update the extent value after the snap animation completes to\n        // avoid rounding errors that could prevent the sheet from closing when\n        // it reaches minSize.\n        final double? snapSize = _getCurrentSnapSize();\n        if (snapSize != null) {\n          extent.updateSize(snapSize, context.notificationContext!);\n        }\n        super.goBallistic(0);\n      }\n    }\n\n    ballisticController\n      ..addListener(tick)\n      ..animateWith(simulation).whenCompleteOrCancel(() {\n        if (_ballisticControllers.contains(ballisticController)) {\n          _ballisticControllers.remove(ballisticController);\n          ballisticController.dispose();\n        }\n      });\n  }\n\n  @override\n  Drag drag(DragStartDetails details, VoidCallback dragCancelCallback) {\n    _isAtTop = pixels == 0;\n    // Save this so we can call it later if we have to [goBallistic] on our own.\n    _dragCancelCallback = dragCancelCallback;\n    return super.drag(details, dragCancelCallback);\n  }\n}\n\n/// A widget that can notify a descendent [DraggableScrollableSheet] that it\n/// should reset its position to the initial state.\n///\n/// The [Scaffold] uses this widget to notify a persistent bottom sheet that\n/// the user has tapped back if the sheet has started to cover more of the body\n/// than when at its initial position. This is important for users of assistive\n/// technology, where dragging may be difficult to communicate.\n///\n/// This is just a wrapper on top of [DraggableScrollableController]. It is\n/// primarily useful for controlling a sheet in a part of the widget tree that\n/// the current code does not control (e.g. library code trying to affect a sheet\n/// in library users' code). Generally, it's easier to control the sheet\n/// directly by creating a controller and passing the controller to the sheet in\n/// its constructor (see [DraggableScrollableSheet.controller]).\nclass DraggableScrollableActuator extends StatefulWidget {\n  /// Creates a widget that can notify descendent [DraggableScrollableSheet]s\n  /// to reset to their initial position.\n  ///\n  /// The [child] parameter is required.\n  const DraggableScrollableActuator({super.key, required this.child});\n\n  /// This child's [DraggableScrollableSheet] descendant will be reset when the\n  /// [reset] method is applied to a context that includes it.\n  final Widget child;\n\n  /// Notifies any descendant [DraggableScrollableSheet] that it should reset\n  /// to its initial position.\n  ///\n  /// Returns `true` if a [DraggableScrollableActuator] is available and\n  /// some [DraggableScrollableSheet] is listening for updates, `false`\n  /// otherwise.\n  static bool reset(BuildContext context) {\n    final _InheritedResetNotifier? notifier = context\n        .dependOnInheritedWidgetOfExactType<_InheritedResetNotifier>();\n    return notifier?._sendReset() ?? false;\n  }\n\n  @override\n  State<DraggableScrollableActuator> createState() =>\n      _DraggableScrollableActuatorState();\n}\n\nclass _DraggableScrollableActuatorState\n    extends State<DraggableScrollableActuator> {\n  final _ResetNotifier _notifier = _ResetNotifier();\n\n  @override\n  Widget build(BuildContext context) {\n    return _InheritedResetNotifier(notifier: _notifier, child: widget.child);\n  }\n\n  @override\n  void dispose() {\n    _notifier.dispose();\n    super.dispose();\n  }\n}\n\n/// A [ChangeNotifier] to use with [_InheritedResetNotifier] to notify\n/// descendants that they should reset to initial state.\nclass _ResetNotifier extends ChangeNotifier {\n  _ResetNotifier() {\n    if (kFlutterMemoryAllocationsEnabled) {\n      ChangeNotifier.maybeDispatchObjectCreation(this);\n    }\n  }\n\n  /// Whether someone called [sendReset] or not.\n  ///\n  /// This flag should be reset after checking it.\n  bool _wasCalled = false;\n\n  /// Fires a reset notification to descendants.\n  ///\n  /// Returns false if there are no listeners.\n  bool sendReset() {\n    if (!hasListeners) {\n      return false;\n    }\n    _wasCalled = true;\n    notifyListeners();\n    return true;\n  }\n}\n\nclass _InheritedResetNotifier extends InheritedNotifier<_ResetNotifier> {\n  /// Creates an [InheritedNotifier] that the [DraggableScrollableSheet] will\n  /// listen to for an indication that it should reset itself back to [DraggableScrollableSheet.initialChildSize].\n  const _InheritedResetNotifier({\n    required super.child,\n    required _ResetNotifier super.notifier,\n  });\n\n  bool _sendReset() => notifier!.sendReset();\n\n  /// Specifies whether the [DraggableScrollableSheet] should reset to its\n  /// initial position.\n  ///\n  /// Returns true if the notifier requested a reset, false otherwise.\n  static bool shouldReset(BuildContext context) {\n    final InheritedWidget? widget = context\n        .dependOnInheritedWidgetOfExactType<_InheritedResetNotifier>();\n    if (widget == null) {\n      return false;\n    }\n    assert(widget is _InheritedResetNotifier);\n    final inheritedNotifier = widget as _InheritedResetNotifier;\n    final bool wasCalled = inheritedNotifier.notifier!._wasCalled;\n    inheritedNotifier.notifier!._wasCalled = false;\n    return wasCalled;\n  }\n}\n\nclass _SnappingSimulation extends Simulation {\n  _SnappingSimulation({\n    required this.position,\n    required double initialVelocity,\n    required List<double> pixelSnapSize,\n    Duration? snapAnimationDuration,\n    super.tolerance,\n  }) {\n    _pixelSnapSize = _getSnapSize(initialVelocity, pixelSnapSize);\n\n    if (snapAnimationDuration != null &&\n        snapAnimationDuration.inMilliseconds > 0) {\n      velocity =\n          (_pixelSnapSize - position) *\n          1000 /\n          snapAnimationDuration.inMilliseconds;\n    }\n    // Check the direction of the target instead of the sign of the velocity because\n    // we may snap in the opposite direction of velocity if velocity is very low.\n    else if (_pixelSnapSize < position) {\n      velocity = math.min(-minimumSpeed, initialVelocity);\n    } else {\n      velocity = math.max(minimumSpeed, initialVelocity);\n    }\n  }\n\n  final double position;\n  late final double velocity;\n\n  // A minimum speed to snap at. Used to ensure that the snapping animation\n  // does not play too slowly.\n  static const double minimumSpeed = 1600.0;\n\n  late final double _pixelSnapSize;\n\n  @override\n  double dx(double time) {\n    if (isDone(time)) {\n      return 0;\n    }\n    return velocity;\n  }\n\n  @override\n  bool isDone(double time) {\n    return x(time) == _pixelSnapSize;\n  }\n\n  @override\n  double x(double time) {\n    final double newPosition = position + velocity * time;\n    if ((velocity >= 0 && newPosition > _pixelSnapSize) ||\n        (velocity < 0 && newPosition < _pixelSnapSize)) {\n      // We're passed the snap size, return it instead.\n      return _pixelSnapSize;\n    }\n    return newPosition;\n  }\n\n  // Find the two closest snap sizes to the position. If the velocity is\n  // non-zero, select the size in the velocity's direction. Otherwise,\n  // the nearest snap size.\n  double _getSnapSize(double initialVelocity, List<double> pixelSnapSizes) {\n    final int indexOfNextSize = pixelSnapSizes.indexWhere(\n      (double size) => size >= position,\n    );\n    if (indexOfNextSize == 0) {\n      return pixelSnapSizes.first;\n    }\n    final double nextSize = pixelSnapSizes[indexOfNextSize];\n    // If already snapped - keep this as target size\n    if (nextSize == position) {\n      return nextSize;\n    }\n    final double previousSize = pixelSnapSizes[indexOfNextSize - 1];\n    if (initialVelocity.abs() <= tolerance.velocity) {\n      // If velocity is zero, snap to the nearest snap size with the minimum velocity.\n      if (position - previousSize < nextSize - position) {\n        return previousSize;\n      } else {\n        return nextSize;\n      }\n    }\n    // Snap forward or backward depending on current velocity.\n    if (initialVelocity < 0.0) {\n      return pixelSnapSizes[indexOfNextSize - 1];\n    }\n    return pixelSnapSizes[indexOfNextSize];\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/draggable_sheet/draggable_scrollable_sheet_topic.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// ignore_for_file: uri_does_not_exist_in_doc_import, depend_on_referenced_packages\n\n/// @docImport 'package:flutter/material.dart';\n/// @docImport 'package:flutter_test/flutter_test.dart';\n///\n/// @docImport 'primary_scroll_controller.dart';\n/// @docImport 'scroll_configuration.dart';\n/// @docImport 'scroll_view.dart';\n/// @docImport 'scrollable.dart';\n/// @docImport 'single_child_scroll_view.dart';\n/// @docImport 'viewport.dart';\nlibrary;\n\nimport 'dart:math' as math;\n\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:collection/collection.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart'\n    hide DraggableScrollableSheet, LayoutBuilder;\n\n/// Controls a [DraggableScrollableSheet].\n///\n/// Draggable scrollable controllers are typically stored as member variables in\n/// [State] objects and are reused in each [State.build]. Controllers can only\n/// be used to control one sheet at a time. A controller can be reused with a\n/// new sheet if the previous sheet has been disposed.\n///\n/// The controller's methods cannot be used until after the controller has been\n/// passed into a [DraggableScrollableSheet] and the sheet has run initState.\n///\n/// A [DraggableScrollableController] is a [Listenable]. It notifies its\n/// listeners whenever an attached sheet changes sizes. It does not notify its\n/// listeners when a sheet is first attached or when an attached sheet's\n/// parameters change without affecting the sheet's current size. It does not\n/// fire when [pixels] changes without [size] changing. For example, if the\n/// constraints provided to an attached sheet change.\nclass DraggableScrollableController extends ChangeNotifier {\n  /// Creates a controller for [DraggableScrollableSheet].\n  DraggableScrollableController() {\n    if (kFlutterMemoryAllocationsEnabled) {\n      ChangeNotifier.maybeDispatchObjectCreation(this);\n    }\n  }\n\n  _DraggableScrollableSheetScrollController? _attachedController;\n  final Set<AnimationController> _animationControllers =\n      <AnimationController>{};\n\n  /// Get the current size (as a fraction of the parent height) of the attached sheet.\n  double get size {\n    _assertAttached();\n    return _attachedController!.extent.currentSize;\n  }\n\n  /// Get the current pixel height of the attached sheet.\n  double get pixels {\n    _assertAttached();\n    return _attachedController!.extent.currentPixels;\n  }\n\n  /// Convert a sheet's size (fractional value of parent container height) to pixels.\n  double sizeToPixels(double size) {\n    _assertAttached();\n    return _attachedController!.extent.sizeToPixels(size);\n  }\n\n  /// Returns Whether any [DraggableScrollableController] objects have attached themselves to the\n  /// [DraggableScrollableSheet].\n  ///\n  /// If this is false, then members that interact with the [ScrollPosition],\n  /// such as [sizeToPixels], [size], [animateTo], and [jumpTo], must not be\n  /// called.\n  bool get isAttached =>\n      _attachedController != null && _attachedController!.hasClients;\n\n  /// Convert a sheet's pixel height to size (fractional value of parent container height).\n  double pixelsToSize(double pixels) {\n    _assertAttached();\n    return _attachedController!.extent.pixelsToSize(pixels);\n  }\n\n  /// Animates the attached sheet from its current size to the given [size], a\n  /// fractional value of the parent container's height.\n  ///\n  /// Any active sheet animation is canceled. If the sheet's internal scrollable\n  /// is currently animating (e.g. responding to a user fling), that animation is\n  /// canceled as well.\n  ///\n  /// An animation will be interrupted whenever the user attempts to scroll\n  /// manually, whenever another activity is started, or when the sheet hits its\n  /// max or min size (e.g. if you animate to 1 but the max size is .8, the\n  /// animation will stop playing when it reaches .8).\n  ///\n  /// The duration must not be zero. To jump to a particular value without an\n  /// animation, use [jumpTo].\n  ///\n  /// The sheet will not snap after calling [animateTo] even if [DraggableScrollableSheet.snap]\n  /// is true. Snapping only occurs after user drags.\n  ///\n  /// When calling [animateTo] in widget tests, `await`ing the returned\n  /// [Future] may cause the test to hang and timeout. Instead, use\n  /// [WidgetTester.pumpAndSettle].\n  Future<void> animateTo(\n    double size, {\n    required Duration duration,\n    required Curve curve,\n  }) async {\n    _assertAttached();\n    assert(size >= 0 && size <= 1);\n    assert(duration != Duration.zero);\n    final animationController = AnimationController.unbounded(\n      vsync: _attachedController!.position.context.vsync,\n      value: _attachedController!.extent.currentSize,\n    );\n    _animationControllers.add(animationController);\n    _attachedController!.position.goIdle();\n    // This disables any snapping until the next user interaction with the sheet.\n    _attachedController!.extent.hasDragged = false;\n    _attachedController!.extent.hasChanged = true;\n    _attachedController!.extent.startActivity(\n      onCanceled: () {\n        // Don't stop the controller if it's already finished and may have been disposed.\n        if (animationController.isAnimating) {\n          animationController.stop();\n        }\n      },\n    );\n    animationController.addListener(() {\n      _attachedController!.extent.updateSize(\n        animationController.value,\n        _attachedController!.position.context.notificationContext!,\n      );\n    });\n    await animationController.animateTo(\n      clampDouble(\n        size,\n        _attachedController!.extent.minSize,\n        _attachedController!.extent.maxSize,\n      ),\n      duration: duration,\n      curve: curve,\n    );\n  }\n\n  /// Jumps the attached sheet from its current size to the given [size], a\n  /// fractional value of the parent container's height.\n  ///\n  /// If [size] is outside of a the attached sheet's min or max child size,\n  /// [jumpTo] will jump the sheet to the nearest valid size instead.\n  ///\n  /// Any active sheet animation is canceled. If the sheet's inner scrollable\n  /// is currently animating (e.g. responding to a user fling), that animation is\n  /// canceled as well.\n  ///\n  /// The sheet will not snap after calling [jumpTo] even if [DraggableScrollableSheet.snap]\n  /// is true. Snapping only occurs after user drags.\n  void jumpTo(double size) {\n    _assertAttached();\n    assert(size >= 0 && size <= 1);\n    // Call start activity to interrupt any other playing activities.\n    _attachedController!.extent.startActivity(onCanceled: () {});\n    _attachedController!.position.goIdle();\n    _attachedController!.extent.hasDragged = false;\n    _attachedController!.extent.hasChanged = true;\n    _attachedController!.extent.updateSize(\n      size,\n      _attachedController!.position.context.notificationContext!,\n    );\n  }\n\n  /// Reset the attached sheet to its initial size (see: [DraggableScrollableSheet.initialChildSize]).\n  void reset() {\n    _assertAttached();\n    _attachedController!.reset();\n  }\n\n  void _assertAttached() {\n    assert(\n      isAttached,\n      'DraggableScrollableController is not attached to a sheet. A DraggableScrollableController '\n      'must be used in a DraggableScrollableSheet before any of its methods are called.',\n    );\n  }\n\n  void _attach(_DraggableScrollableSheetScrollController scrollController) {\n    assert(\n      _attachedController == null,\n      'Draggable scrollable controller is already attached to a sheet.',\n    );\n    _attachedController = scrollController;\n    _attachedController!.extent._currentSize.addListener(notifyListeners);\n    _attachedController!.onPositionDetached = _disposeAnimationControllers;\n  }\n\n  void _onExtentReplaced(_DraggableSheetExtent previousExtent) {\n    // When the extent has been replaced, the old extent is already disposed and\n    // the controller will point to a new extent. We have to add our listener to\n    // the new extent.\n    _attachedController!.extent._currentSize.addListener(notifyListeners);\n    if (previousExtent.currentSize != _attachedController!.extent.currentSize) {\n      // The listener won't fire for a change in size between two extent\n      // objects so we have to fire it manually here.\n      notifyListeners();\n    }\n  }\n\n  void _detach({bool disposeExtent = false}) {\n    if (disposeExtent) {\n      _attachedController?.extent.dispose();\n    } else {\n      _attachedController?.extent._currentSize.removeListener(notifyListeners);\n    }\n    _disposeAnimationControllers();\n    _attachedController = null;\n  }\n\n  void _disposeAnimationControllers() {\n    for (final AnimationController animationController\n        in _animationControllers) {\n      animationController.dispose();\n    }\n    _animationControllers.clear();\n  }\n}\n\n/// A container for a [Scrollable] that responds to drag gestures by resizing\n/// the scrollable until a limit is reached, and then scrolling.\n///\n/// {@youtube 560 315 https://www.youtube.com/watch?v=Hgw819mL_78}\n///\n/// This widget can be dragged along the vertical axis between its\n/// [minChildSize], which defaults to `0.25` and [maxChildSize], which defaults\n/// to `1.0`. These sizes are percentages of the height of the parent container.\n///\n/// The widget coordinates resizing and scrolling of the widget returned by\n/// builder as the user drags along the horizontal axis.\n///\n/// The widget will initially be displayed at its initialChildSize which\n/// defaults to `0.5`, meaning half the height of its parent. Dragging will work\n/// between the range of minChildSize and maxChildSize (as percentages of the\n/// parent container's height) as long as the builder creates a widget which\n/// uses the provided [ScrollController]. If the widget created by the\n/// [ScrollableWidgetBuilder] does not use the provided [ScrollController], the\n/// sheet will remain at the initialChildSize.\n///\n/// By default, the widget will stay at whatever size the user drags it to. To\n/// make the widget snap to specific sizes whenever they lift their finger\n/// during a drag, set [snap] to `true`. The sheet will snap between\n/// [minChildSize] and [maxChildSize]. Use [snapSizes] to add more sizes for\n/// the sheet to snap between.\n///\n/// The snapping effect is only applied on user drags. Programmatically\n/// manipulating the sheet size via [DraggableScrollableController.animateTo] or\n/// [DraggableScrollableController.jumpTo] will ignore [snap] and [snapSizes].\n///\n/// By default, the widget will expand its non-occupied area to fill available\n/// space in the parent. If this is not desired, e.g. because the parent wants\n/// to position sheet based on the space it is taking, the [expand] property\n/// may be set to false.\n///\n/// {@tool dartpad}\n///\n/// This is a sample widget which shows a [ListView] that has 25 [ListTile]s.\n/// It starts out as taking up half the body of the [Scaffold], and can be\n/// dragged up to the full height of the scaffold or down to 25% of the height\n/// of the scaffold. Upon reaching full height, the list contents will be\n/// scrolled up or down, until they reach the top of the list again and the user\n/// drags the sheet back down.\n///\n/// On desktop and web running on desktop platforms, dragging to scroll with a mouse is disabled by default\n/// to align with the natural behavior found in other desktop applications.\n///\n/// This behavior is dictated by the [ScrollBehavior], and can be changed by adding\n/// [PointerDeviceKind.mouse] to [ScrollBehavior.dragDevices].\n/// For more info on this, please refer to https://docs.flutter.dev/release/breaking-changes/default-scroll-behavior-drag\n///\n/// Alternatively, this example illustrates how to add a drag handle for desktop applications.\n///\n/// ** See code in examples/api/lib/widgets/draggable_scrollable_sheet/draggable_scrollable_sheet.0.dart **\n/// {@end-tool}\nclass DraggableScrollableSheet extends StatefulWidget {\n  /// Creates a widget that can be dragged and scrolled in a single gesture.\n  const DraggableScrollableSheet({\n    super.key,\n    this.initialChildSize = 0.5,\n    this.minChildSize = 0.25,\n    this.maxChildSize = 1.0,\n    this.expand = true,\n    this.snap = false,\n    this.snapSizes,\n    this.snapAnimationDuration,\n    this.controller,\n    this.shouldCloseOnMinExtent = true,\n    this.initialScrollOffset = 0,\n    required this.builder,\n  }) : assert(minChildSize >= 0.0),\n       assert(maxChildSize <= 1.0),\n       assert(minChildSize <= initialChildSize),\n       assert(initialChildSize <= maxChildSize),\n       assert(\n         snapAnimationDuration == null || snapAnimationDuration > Duration.zero,\n       );\n\n  final double initialScrollOffset;\n\n  /// The initial fractional value of the parent container's height to use when\n  /// displaying the widget.\n  ///\n  /// Rebuilding the sheet with a new [initialChildSize] will only move\n  /// the sheet to the new value if the sheet has not yet been dragged since it\n  /// was first built or since the last call to [DraggableScrollableActuator.reset].\n  ///\n  /// The default value is `0.5`.\n  final double initialChildSize;\n\n  /// The minimum fractional value of the parent container's height to use when\n  /// displaying the widget.\n  ///\n  /// The default value is `0.25`.\n  final double minChildSize;\n\n  /// The maximum fractional value of the parent container's height to use when\n  /// displaying the widget.\n  ///\n  /// The default value is `1.0`.\n  final double maxChildSize;\n\n  /// Whether the widget should expand to fill the available space in its parent\n  /// or not.\n  ///\n  /// In most cases, this should be true. However, in the case of a parent\n  /// widget that will position this one based on its desired size (such as a\n  /// [Center]), this should be set to false.\n  ///\n  /// The default value is true.\n  final bool expand;\n\n  /// Whether the widget should snap between [snapSizes] when the user lifts\n  /// their finger during a drag.\n  ///\n  /// If the user's finger was still moving when they lifted it, the widget will\n  /// snap to the next snap size (see [snapSizes]) in the direction of the drag.\n  /// If their finger was still, the widget will snap to the nearest snap size.\n  ///\n  /// Snapping is not applied when the sheet is programmatically moved by\n  /// calling [DraggableScrollableController.animateTo] or [DraggableScrollableController.jumpTo].\n  ///\n  /// Rebuilding the sheet with snap newly enabled will immediately trigger a\n  /// snap unless the sheet has not yet been dragged away from\n  /// [initialChildSize] since first being built or since the last call to\n  /// [DraggableScrollableActuator.reset].\n  final bool snap;\n\n  /// A list of target sizes that the widget should snap to.\n  ///\n  /// Snap sizes are fractional values of the parent container's height. They\n  /// must be listed in increasing order and be between [minChildSize] and\n  /// [maxChildSize].\n  ///\n  /// The [minChildSize] and [maxChildSize] are implicitly included in snap\n  /// sizes and do not need to be specified here. For example, `snapSizes = [.5]`\n  /// will result in a sheet that snaps between [minChildSize], `.5`, and\n  /// [maxChildSize].\n  ///\n  /// Any modifications to the [snapSizes] list will not take effect until the\n  /// `build` function containing this widget is run again.\n  ///\n  /// Rebuilding with a modified or new list will trigger a snap unless the\n  /// sheet has not yet been dragged away from [initialChildSize] since first\n  /// being built or since the last call to [DraggableScrollableActuator.reset].\n  final List<double>? snapSizes;\n\n  /// Defines a duration for the snap animations.\n  ///\n  /// If it's not set, then the animation duration is the distance to the snap\n  /// target divided by the velocity of the widget.\n  final Duration? snapAnimationDuration;\n\n  /// A controller that can be used to programmatically control this sheet.\n  final DraggableScrollableController? controller;\n\n  /// Whether the sheet, when dragged (or flung) to its minimum size, should\n  /// cause its parent sheet to close.\n  ///\n  /// Set on emitted [DraggableScrollableNotification]s. It is up to parent\n  /// classes to properly read and handle this value.\n  final bool shouldCloseOnMinExtent;\n\n  /// The builder that creates a child to display in this widget, which will\n  /// use the provided [ScrollController] to enable dragging and scrolling\n  /// of the contents.\n  final ScrollableWidgetBuilder builder;\n\n  @override\n  State<DraggableScrollableSheet> createState() =>\n      _DraggableScrollableSheetState();\n}\n\n/// Manages state between [_DraggableScrollableSheetState],\n/// [_DraggableScrollableSheetScrollController], and\n/// [_DraggableScrollableSheetScrollPosition].\n///\n/// The State knows the pixels available along the axis the widget wants to\n/// scroll, but expects to get a fraction of those pixels to render the sheet.\n///\n/// The ScrollPosition knows the number of pixels a user wants to move the sheet.\n///\n/// The [currentSize] will never be null.\n/// The [availablePixels] will never be null, but may be `double.infinity`.\nclass _DraggableSheetExtent {\n  _DraggableSheetExtent({\n    required this.minSize,\n    required this.maxSize,\n    required this.snap,\n    required this.snapSizes,\n    required this.initialSize,\n    this.snapAnimationDuration,\n    ValueNotifier<double>? currentSize,\n    bool? hasDragged,\n    bool? hasChanged,\n    this.shouldCloseOnMinExtent = true,\n  }) : assert(minSize >= 0),\n       assert(maxSize <= 1),\n       assert(minSize <= initialSize),\n       assert(initialSize <= maxSize),\n       _currentSize = currentSize ?? ValueNotifier<double>(initialSize),\n       availablePixels = double.infinity,\n       hasDragged = hasDragged ?? false,\n       hasChanged = hasChanged ?? false {\n    assert(debugMaybeDispatchCreated('widgets', '_DraggableSheetExtent', this));\n  }\n\n  VoidCallback? _cancelActivity;\n\n  final double minSize;\n  final double maxSize;\n  final bool snap;\n  final List<double> snapSizes;\n  final Duration? snapAnimationDuration;\n  final double initialSize;\n  final bool shouldCloseOnMinExtent;\n  final ValueNotifier<double> _currentSize;\n  double availablePixels;\n\n  // Used to disable snapping until the user has dragged on the sheet.\n  bool hasDragged;\n\n  // Used to determine if the sheet should move to a new initial size when it\n  // changes.\n  // We need both `hasChanged` and `hasDragged` to achieve the following\n  // behavior:\n  //   1. The sheet should only snap following user drags (as opposed to\n  //      programmatic sheet changes). See docs for `animateTo` and `jumpTo`.\n  //   2. The sheet should move to a new initial child size on rebuild iff the\n  //      sheet has not changed, either by drag or programmatic control. See\n  //      docs for `initialChildSize`.\n  bool hasChanged;\n\n  bool get isAtMin => minSize >= _currentSize.value;\n  bool get isAtMax => maxSize <= _currentSize.value;\n\n  double get currentSize => _currentSize.value;\n  double get currentPixels => sizeToPixels(_currentSize.value);\n\n  List<double> get pixelSnapSizes => snapSizes.map(sizeToPixels).toList();\n\n  /// Start an activity that affects the sheet and register a cancel call back\n  /// that will be called if another activity starts.\n  ///\n  /// The `onCanceled` callback will get called even if the subsequent activity\n  /// started after this one finished, so `onCanceled` must be safe to call at\n  /// any time.\n  void startActivity({required VoidCallback onCanceled}) {\n    _cancelActivity?.call();\n    _cancelActivity = onCanceled;\n  }\n\n  /// The scroll position gets inputs in terms of pixels, but the size is\n  /// expected to be expressed as a number between 0..1.\n  ///\n  /// This should only be called to respond to a user drag. To update the\n  /// size in response to a programmatic call, use [updateSize] directly.\n  void addPixelDelta(double delta, BuildContext context) {\n    // Stop any playing sheet animations.\n    _cancelActivity?.call();\n    _cancelActivity = null;\n    // The user has interacted with the sheet, set `hasDragged` to true so that\n    // we'll snap if applicable.\n    hasDragged = true;\n    hasChanged = true;\n    if (availablePixels == 0) {\n      return;\n    }\n    updateSize(currentSize + pixelsToSize(delta), context);\n  }\n\n  /// Set the size to the new value. [newSize] should be a number between\n  /// [minSize] and [maxSize].\n  ///\n  /// This can be triggered by a programmatic (e.g. controller triggered) change\n  /// or a user drag.\n  void updateSize(double newSize, BuildContext context) {\n    final double clampedSize = clampDouble(newSize, minSize, maxSize);\n    if (_currentSize.value == clampedSize) {\n      return;\n    }\n    _currentSize.value = clampedSize;\n    DraggableScrollableNotification(\n      minExtent: minSize,\n      maxExtent: maxSize,\n      extent: currentSize,\n      initialExtent: initialSize,\n      context: context,\n      shouldCloseOnMinExtent: shouldCloseOnMinExtent,\n    ).dispatch(context);\n  }\n\n  double pixelsToSize(double pixels) {\n    return pixels / availablePixels * maxSize;\n  }\n\n  double sizeToPixels(double size) {\n    return size / maxSize * availablePixels;\n  }\n\n  void dispose() {\n    assert(debugMaybeDispatchDisposed(this));\n    _currentSize.dispose();\n  }\n\n  _DraggableSheetExtent copyWith({\n    required double minSize,\n    required double maxSize,\n    required bool snap,\n    required List<double> snapSizes,\n    required double initialSize,\n    required Duration? snapAnimationDuration,\n    required bool shouldCloseOnMinExtent,\n  }) {\n    return _DraggableSheetExtent(\n      minSize: minSize,\n      maxSize: maxSize,\n      snap: snap,\n      snapSizes: snapSizes,\n      snapAnimationDuration: snapAnimationDuration,\n      initialSize: initialSize,\n      // Set the current size to the possibly updated initial size if the sheet\n      // hasn't changed yet.\n      currentSize: ValueNotifier<double>(\n        hasChanged\n            ? clampDouble(_currentSize.value, minSize, maxSize)\n            : initialSize,\n      ),\n      hasDragged: hasDragged,\n      hasChanged: hasChanged,\n      shouldCloseOnMinExtent: shouldCloseOnMinExtent,\n    );\n  }\n}\n\nclass _DraggableScrollableSheetState extends State<DraggableScrollableSheet> {\n  late _DraggableScrollableSheetScrollController _scrollController;\n  late _DraggableSheetExtent _extent;\n\n  @override\n  void initState() {\n    super.initState();\n    _extent = _DraggableSheetExtent(\n      minSize: widget.minChildSize,\n      maxSize: widget.maxChildSize,\n      snap: widget.snap,\n      snapSizes: _impliedSnapSizes(),\n      snapAnimationDuration: widget.snapAnimationDuration,\n      initialSize: widget.initialChildSize,\n      shouldCloseOnMinExtent: widget.shouldCloseOnMinExtent,\n    );\n    _scrollController = _DraggableScrollableSheetScrollController(\n      extent: _extent,\n      initialScrollOffset: widget.initialScrollOffset,\n    );\n    widget.controller?._attach(_scrollController);\n  }\n\n  List<double> _impliedSnapSizes() {\n    for (var index = 0; index < (widget.snapSizes?.length ?? 0); index += 1) {\n      final double snapSize = widget.snapSizes![index];\n      assert(\n        snapSize >= widget.minChildSize && snapSize <= widget.maxChildSize,\n        '${_snapSizeErrorMessage(index)}\\nSnap sizes must be between `minChildSize` and `maxChildSize`. ',\n      );\n      assert(\n        index == 0 || snapSize > widget.snapSizes![index - 1],\n        '${_snapSizeErrorMessage(index)}\\nSnap sizes must be in ascending order. ',\n      );\n    }\n    // Ensure the snap sizes start and end with the min and max child sizes.\n    if (widget.snapSizes == null || widget.snapSizes!.isEmpty) {\n      return <double>[widget.minChildSize, widget.maxChildSize];\n    }\n    return <double>[\n      if (widget.snapSizes!.first != widget.minChildSize) widget.minChildSize,\n      ...widget.snapSizes!,\n      if (widget.snapSizes!.last != widget.maxChildSize) widget.maxChildSize,\n    ];\n  }\n\n  @override\n  void didUpdateWidget(covariant DraggableScrollableSheet oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (widget.controller != oldWidget.controller) {\n      oldWidget.controller?._detach();\n      widget.controller?._attach(_scrollController);\n    }\n    _replaceExtent(oldWidget);\n  }\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    if (_InheritedResetNotifier.shouldReset(context)) {\n      _scrollController.reset();\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return ValueListenableBuilder<double>(\n      valueListenable: _extent._currentSize,\n      builder: (BuildContext context, double currentSize, Widget? child) =>\n          LayoutBuilder(\n            builder: (BuildContext context, BoxConstraints constraints) {\n              _extent.availablePixels =\n                  widget.maxChildSize * constraints.biggest.height;\n              final Widget sheet = FractionallySizedBox(\n                heightFactor: currentSize,\n                alignment: Alignment.bottomCenter,\n                child: child,\n              );\n              return widget.expand ? SizedBox.expand(child: sheet) : sheet;\n            },\n          ),\n      child: widget.builder(context, _scrollController),\n    );\n  }\n\n  @override\n  void dispose() {\n    if (widget.controller == null) {\n      _extent.dispose();\n    } else {\n      widget.controller!._detach(disposeExtent: true);\n    }\n    _scrollController.dispose();\n    super.dispose();\n  }\n\n  void _replaceExtent(covariant DraggableScrollableSheet oldWidget) {\n    final _DraggableSheetExtent previousExtent = _extent;\n    _extent = previousExtent.copyWith(\n      minSize: widget.minChildSize,\n      maxSize: widget.maxChildSize,\n      snap: widget.snap,\n      snapSizes: _impliedSnapSizes(),\n      snapAnimationDuration: widget.snapAnimationDuration,\n      initialSize: widget.initialChildSize,\n      shouldCloseOnMinExtent: widget.shouldCloseOnMinExtent,\n    );\n    // Modify the existing scroll controller instead of replacing it so that\n    // developers listening to the controller do not have to rebuild their listeners.\n    _scrollController.extent = _extent;\n    // If an external facing controller was provided, let it know that the\n    // extent has been replaced.\n    widget.controller?._onExtentReplaced(previousExtent);\n    previousExtent.dispose();\n    if (widget.snap &&\n        (widget.snap != oldWidget.snap ||\n            widget.snapSizes != oldWidget.snapSizes) &&\n        _scrollController.hasClients) {\n      // Trigger a snap in case snap or snapSizes has changed and there is a\n      // scroll position currently attached. We put this in a post frame\n      // callback so that `build` can update `_extent.availablePixels` before\n      // this runs-we can't use the previous extent's available pixels as it may\n      // have changed when the widget was updated.\n      WidgetsBinding.instance.addPostFrameCallback((Duration timeStamp) {\n        for (\n          var index = 0;\n          index < _scrollController.positions.length;\n          index++\n        ) {\n          final position =\n              _scrollController.positions.elementAt(index)\n                  as _DraggableScrollableSheetScrollPosition;\n          position.goBallistic(0);\n        }\n      }, debugLabel: 'DraggableScrollableSheet.snap');\n    }\n  }\n\n  String _snapSizeErrorMessage(int invalidIndex) {\n    final List<String> snapSizesWithIndicator = widget.snapSizes!\n        .asMap()\n        .keys\n        .map((int index) {\n          final snapSizeString = widget.snapSizes![index].toString();\n          if (index == invalidIndex) {\n            return '>>> $snapSizeString <<<';\n          }\n          return snapSizeString;\n        })\n        .toList();\n    return \"Invalid snapSize '${widget.snapSizes![invalidIndex]}' at index $invalidIndex of:\\n\"\n        '  $snapSizesWithIndicator';\n  }\n}\n\n/// A [ScrollController] suitable for use in a [ScrollableWidgetBuilder] created\n/// by a [DraggableScrollableSheet].\n///\n/// If a [DraggableScrollableSheet] contains content that is exceeds the height\n/// of its container, this controller will allow the sheet to both be dragged to\n/// fill the container and then scroll the child content.\n///\n/// See also:\n///\n///  * [_DraggableScrollableSheetScrollPosition], which manages the positioning logic for\n///    this controller.\n///  * [PrimaryScrollController], which can be used to establish a\n///    [_DraggableScrollableSheetScrollController] as the primary controller for\n///    descendants.\nclass _DraggableScrollableSheetScrollController extends ScrollController {\n  _DraggableScrollableSheetScrollController({\n    required this.extent,\n    double initialScrollOffset = 0.0,\n  }) : _initialScrollOffset = initialScrollOffset;\n\n  _DraggableSheetExtent extent;\n  VoidCallback? onPositionDetached;\n\n  @override\n  double get initialScrollOffset => _initialScrollOffset;\n  final double _initialScrollOffset;\n\n  @override\n  _DraggableScrollableSheetScrollPosition createScrollPosition(\n    ScrollPhysics physics,\n    ScrollContext context,\n    ScrollPosition? oldPosition,\n  ) {\n    return _DraggableScrollableSheetScrollPosition(\n      physics: physics.applyTo(const AlwaysScrollableScrollPhysics()),\n      context: context,\n      oldPosition: oldPosition,\n      getExtent: () => extent,\n      initialPixels: _initialScrollOffset,\n    );\n  }\n\n  @override\n  void debugFillDescription(List<String> description) {\n    super.debugFillDescription(description);\n    description.add('extent: $extent');\n  }\n\n  @override\n  _DraggableScrollableSheetScrollPosition get position =>\n      super.position as _DraggableScrollableSheetScrollPosition;\n\n  void reset() {\n    extent._cancelActivity?.call();\n    extent.hasDragged = false;\n    extent.hasChanged = false;\n    // jumpTo can result in trying to replace semantics during build.\n    // Just animate really fast.\n    // Avoid doing it at all if the offset is already 0.0.\n    if (offset != 0.0) {\n      animateTo(\n        0.0,\n        duration: const Duration(milliseconds: 1),\n        curve: Curves.linear,\n      );\n    }\n    extent.updateSize(\n      extent.initialSize,\n      position.context.notificationContext!,\n    );\n  }\n\n  @override\n  void detach(ScrollPosition position) {\n    onPositionDetached?.call();\n    super.detach(position);\n  }\n}\n\n/// A scroll position that manages scroll activities for\n/// [_DraggableScrollableSheetScrollController].\n///\n/// This class is a concrete subclass of [ScrollPosition] logic that handles a\n/// single [ScrollContext], such as a [Scrollable]. An instance of this class\n/// manages [ScrollActivity] instances, which changes the\n/// [_DraggableSheetExtent.currentSize] or visible content offset in the\n/// [Scrollable]'s [Viewport]\n///\n/// See also:\n///\n///  * [_DraggableScrollableSheetScrollController], which uses this as its [ScrollPosition].\nclass _DraggableScrollableSheetScrollPosition\n    extends ScrollPositionWithSingleContext {\n  _DraggableScrollableSheetScrollPosition({\n    required super.physics,\n    required super.context,\n    super.oldPosition,\n    required this.getExtent,\n    super.initialPixels,\n  });\n\n  VoidCallback? _dragCancelCallback;\n  final _DraggableSheetExtent Function() getExtent;\n  final Set<AnimationController> _ballisticControllers =\n      <AnimationController>{};\n  bool get listShouldScroll => pixels > 0.0 && extent.isAtMax;\n\n  _DraggableSheetExtent get extent => getExtent();\n\n  @override\n  void absorb(ScrollPosition other) {\n    super.absorb(other);\n    assert(_dragCancelCallback == null);\n\n    if (other is! _DraggableScrollableSheetScrollPosition) {\n      return;\n    }\n\n    if (other._dragCancelCallback != null) {\n      _dragCancelCallback = other._dragCancelCallback;\n      other._dragCancelCallback = null;\n    }\n  }\n\n  @override\n  void beginActivity(ScrollActivity? newActivity) {\n    // Cancel the running ballistic simulations\n    for (final AnimationController ballisticController\n        in _ballisticControllers) {\n      ballisticController.stop();\n    }\n    super.beginActivity(newActivity);\n  }\n\n  @override\n  void applyUserOffset(double delta) {\n    if (!listShouldScroll &&\n        (!(extent.isAtMin || extent.isAtMax) ||\n            (extent.isAtMin && delta < 0) ||\n            (extent.isAtMax && delta > 0))) {\n      extent.addPixelDelta(-delta, context.notificationContext!);\n    } else {\n      super.applyUserOffset(delta);\n    }\n  }\n\n  // Checks if the sheet's current size is close to a snap size, returning the\n  // snap size if so; returns null otherwise.\n  double? _getCurrentSnapSize() {\n    return extent.snapSizes.firstWhereOrNull((double snapSize) {\n      return (extent.currentSize - snapSize).abs() <=\n          extent.pixelsToSize(physics.toleranceFor(this).distance);\n    });\n  }\n\n  bool _isAtSnapSize() => _getCurrentSnapSize() != null;\n\n  bool _shouldSnap() => extent.snap && extent.hasDragged && !_isAtSnapSize();\n\n  @override\n  void dispose() {\n    for (final AnimationController ballisticController\n        in _ballisticControllers) {\n      ballisticController.dispose();\n    }\n    _ballisticControllers.clear();\n    super.dispose();\n  }\n\n  @override\n  void goBallistic(double velocity) {\n    if ((velocity == 0.0 && !_shouldSnap()) ||\n        (velocity < 0.0 && listShouldScroll) ||\n        (velocity > 0.0 && extent.isAtMax)) {\n      super.goBallistic(velocity);\n      return;\n    }\n    // Scrollable expects that we will dispose of its current _dragCancelCallback\n    _dragCancelCallback?.call();\n    _dragCancelCallback = null;\n\n    late final Simulation simulation;\n    if (extent.snap) {\n      // Snap is enabled, simulate snapping instead of clamping scroll.\n      simulation = _SnappingSimulation(\n        position: extent.currentPixels,\n        initialVelocity: velocity,\n        pixelSnapSize: extent.pixelSnapSizes,\n        snapAnimationDuration: extent.snapAnimationDuration,\n        tolerance: physics.toleranceFor(this),\n      );\n    } else {\n      // The iOS bouncing simulation just isn't right here - once we delegate\n      // the ballistic back to the ScrollView, it will use the right simulation.\n      simulation = ClampingScrollSimulation(\n        // Run the simulation in terms of pixels, not extent.\n        position: extent.currentPixels,\n        velocity: velocity,\n        tolerance: physics.toleranceFor(this),\n      );\n    }\n\n    final ballisticController = AnimationController.unbounded(\n      debugLabel: objectRuntimeType(this, '_DraggableScrollableSheetPosition'),\n      vsync: context.vsync,\n    );\n    _ballisticControllers.add(ballisticController);\n\n    double lastPosition = extent.currentPixels;\n    void tick() {\n      final double delta = ballisticController.value - lastPosition;\n      lastPosition = ballisticController.value;\n      extent.addPixelDelta(delta, context.notificationContext!);\n      if ((velocity > 0 && extent.isAtMax) ||\n          (velocity < 0 && extent.isAtMin)) {\n        // Make sure we pass along enough velocity to keep scrolling - otherwise\n        // we just \"bounce\" off the top making it look like the list doesn't\n        // have more to scroll.\n        velocity =\n            ballisticController.velocity +\n            (physics.toleranceFor(this).velocity *\n                ballisticController.velocity.sign);\n        super.goBallistic(velocity);\n        ballisticController.stop();\n      } else if (ballisticController.isCompleted) {\n        // Update the extent value after the snap animation completes to\n        // avoid rounding errors that could prevent the sheet from closing when\n        // it reaches minSize.\n        final double? snapSize = _getCurrentSnapSize();\n        if (snapSize != null) {\n          extent.updateSize(snapSize, context.notificationContext!);\n        }\n        super.goBallistic(0);\n      }\n    }\n\n    ballisticController\n      ..addListener(tick)\n      ..animateWith(simulation).whenCompleteOrCancel(() {\n        if (_ballisticControllers.contains(ballisticController)) {\n          _ballisticControllers.remove(ballisticController);\n          ballisticController.dispose();\n        }\n      });\n  }\n\n  @override\n  Drag drag(DragStartDetails details, VoidCallback dragCancelCallback) {\n    // Save this so we can call it later if we have to [goBallistic] on our own.\n    _dragCancelCallback = dragCancelCallback;\n    return super.drag(details, dragCancelCallback);\n  }\n}\n\n/// A widget that can notify a descendent [DraggableScrollableSheet] that it\n/// should reset its position to the initial state.\n///\n/// The [Scaffold] uses this widget to notify a persistent bottom sheet that\n/// the user has tapped back if the sheet has started to cover more of the body\n/// than when at its initial position. This is important for users of assistive\n/// technology, where dragging may be difficult to communicate.\n///\n/// This is just a wrapper on top of [DraggableScrollableController]. It is\n/// primarily useful for controlling a sheet in a part of the widget tree that\n/// the current code does not control (e.g. library code trying to affect a sheet\n/// in library users' code). Generally, it's easier to control the sheet\n/// directly by creating a controller and passing the controller to the sheet in\n/// its constructor (see [DraggableScrollableSheet.controller]).\nclass DraggableScrollableActuator extends StatefulWidget {\n  /// Creates a widget that can notify descendent [DraggableScrollableSheet]s\n  /// to reset to their initial position.\n  ///\n  /// The [child] parameter is required.\n  const DraggableScrollableActuator({super.key, required this.child});\n\n  /// This child's [DraggableScrollableSheet] descendant will be reset when the\n  /// [reset] method is applied to a context that includes it.\n  final Widget child;\n\n  /// Notifies any descendant [DraggableScrollableSheet] that it should reset\n  /// to its initial position.\n  ///\n  /// Returns `true` if a [DraggableScrollableActuator] is available and\n  /// some [DraggableScrollableSheet] is listening for updates, `false`\n  /// otherwise.\n  static bool reset(BuildContext context) {\n    final _InheritedResetNotifier? notifier = context\n        .dependOnInheritedWidgetOfExactType<_InheritedResetNotifier>();\n    return notifier?._sendReset() ?? false;\n  }\n\n  @override\n  State<DraggableScrollableActuator> createState() =>\n      _DraggableScrollableActuatorState();\n}\n\nclass _DraggableScrollableActuatorState\n    extends State<DraggableScrollableActuator> {\n  final _ResetNotifier _notifier = _ResetNotifier();\n\n  @override\n  Widget build(BuildContext context) {\n    return _InheritedResetNotifier(notifier: _notifier, child: widget.child);\n  }\n\n  @override\n  void dispose() {\n    _notifier.dispose();\n    super.dispose();\n  }\n}\n\n/// A [ChangeNotifier] to use with [_InheritedResetNotifier] to notify\n/// descendants that they should reset to initial state.\nclass _ResetNotifier extends ChangeNotifier {\n  _ResetNotifier() {\n    if (kFlutterMemoryAllocationsEnabled) {\n      ChangeNotifier.maybeDispatchObjectCreation(this);\n    }\n  }\n\n  /// Whether someone called [sendReset] or not.\n  ///\n  /// This flag should be reset after checking it.\n  bool _wasCalled = false;\n\n  /// Fires a reset notification to descendants.\n  ///\n  /// Returns false if there are no listeners.\n  bool sendReset() {\n    if (!hasListeners) {\n      return false;\n    }\n    _wasCalled = true;\n    notifyListeners();\n    return true;\n  }\n}\n\nclass _InheritedResetNotifier extends InheritedNotifier<_ResetNotifier> {\n  /// Creates an [InheritedNotifier] that the [DraggableScrollableSheet] will\n  /// listen to for an indication that it should reset itself back to [DraggableScrollableSheet.initialChildSize].\n  const _InheritedResetNotifier({\n    required super.child,\n    required _ResetNotifier super.notifier,\n  });\n\n  bool _sendReset() => notifier!.sendReset();\n\n  /// Specifies whether the [DraggableScrollableSheet] should reset to its\n  /// initial position.\n  ///\n  /// Returns true if the notifier requested a reset, false otherwise.\n  static bool shouldReset(BuildContext context) {\n    final InheritedWidget? widget = context\n        .dependOnInheritedWidgetOfExactType<_InheritedResetNotifier>();\n    if (widget == null) {\n      return false;\n    }\n    assert(widget is _InheritedResetNotifier);\n    final inheritedNotifier = widget as _InheritedResetNotifier;\n    final bool wasCalled = inheritedNotifier.notifier!._wasCalled;\n    inheritedNotifier.notifier!._wasCalled = false;\n    return wasCalled;\n  }\n}\n\nclass _SnappingSimulation extends Simulation {\n  _SnappingSimulation({\n    required this.position,\n    required double initialVelocity,\n    required List<double> pixelSnapSize,\n    Duration? snapAnimationDuration,\n    super.tolerance,\n  }) {\n    _pixelSnapSize = _getSnapSize(initialVelocity, pixelSnapSize);\n\n    if (snapAnimationDuration != null &&\n        snapAnimationDuration.inMilliseconds > 0) {\n      velocity =\n          (_pixelSnapSize - position) *\n          1000 /\n          snapAnimationDuration.inMilliseconds;\n    }\n    // Check the direction of the target instead of the sign of the velocity because\n    // we may snap in the opposite direction of velocity if velocity is very low.\n    else if (_pixelSnapSize < position) {\n      velocity = math.min(-minimumSpeed, initialVelocity);\n    } else {\n      velocity = math.max(minimumSpeed, initialVelocity);\n    }\n  }\n\n  final double position;\n  late final double velocity;\n\n  // A minimum speed to snap at. Used to ensure that the snapping animation\n  // does not play too slowly.\n  static const double minimumSpeed = 1600.0;\n\n  late final double _pixelSnapSize;\n\n  @override\n  double dx(double time) {\n    if (isDone(time)) {\n      return 0;\n    }\n    return velocity;\n  }\n\n  @override\n  bool isDone(double time) {\n    return x(time) == _pixelSnapSize;\n  }\n\n  @override\n  double x(double time) {\n    final double newPosition = position + velocity * time;\n    if ((velocity >= 0 && newPosition > _pixelSnapSize) ||\n        (velocity < 0 && newPosition < _pixelSnapSize)) {\n      // We're passed the snap size, return it instead.\n      return _pixelSnapSize;\n    }\n    return newPosition;\n  }\n\n  // Find the two closest snap sizes to the position. If the velocity is\n  // non-zero, select the size in the velocity's direction. Otherwise,\n  // the nearest snap size.\n  double _getSnapSize(double initialVelocity, List<double> pixelSnapSizes) {\n    final int indexOfNextSize = pixelSnapSizes.indexWhere(\n      (double size) => size >= position,\n    );\n    if (indexOfNextSize == 0) {\n      return pixelSnapSizes.first;\n    }\n    final double nextSize = pixelSnapSizes[indexOfNextSize];\n    // If already snapped - keep this as target size\n    if (nextSize == position) {\n      return nextSize;\n    }\n    final double previousSize = pixelSnapSizes[indexOfNextSize - 1];\n    if (initialVelocity.abs() <= tolerance.velocity) {\n      // If velocity is zero, snap to the nearest snap size with the minimum velocity.\n      if (position - previousSize < nextSize - position) {\n        return previousSize;\n      } else {\n        return nextSize;\n      }\n    }\n    // Snap forward or backward depending on current velocity.\n    if (initialVelocity < 0.0) {\n      return pixelSnapSizes[indexOfNextSize - 1];\n    }\n    return pixelSnapSizes[indexOfNextSize];\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/layout_builder.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/rendering.dart';\nimport 'package:flutter/widgets.dart';\n\n/// An abstract superclass for widgets that defer their building until layout.\n///\n/// Similar to the [Builder] widget except that the implementation calls the [builder]\n/// function at layout time and provides the [LayoutInfoType] that is required to\n/// configure the child widget subtree.\n///\n/// This is useful when the child widget tree relies on information that are only\n/// available during layout, and doesn't depend on the child's intrinsic size.\n///\n/// The [LayoutInfoType] should typically be immutable. The equality of the\n/// [LayoutInfoType] type is used by the implementation to avoid unnecessary\n/// rebuilds: if the new [LayoutInfoType] computed during layout is the same as\n/// (defined by `LayoutInfoType.==`) the previous [LayoutInfoType], the\n/// implementation will try to avoid calling the [builder] again unless\n/// [updateShouldRebuild] returns true. The corresponding [RenderObject] produced\n/// by this widget retains the most up-to-date [LayoutInfoType] for this purpose,\n/// which may keep a [LayoutInfoType] object in memory until the widget is removed\n/// from the tree.\n///\n/// Subclasses must return a [RenderObject] that mixes in [RenderAbstractLayoutBuilderMixin].\nabstract class AbstractLayoutBuilder<LayoutInfoType>\n    extends RenderObjectWidget {\n  /// Creates a widget that defers its building until layout.\n  const AbstractLayoutBuilder({super.key});\n\n  /// Called at layout time to construct the widget tree.\n  ///\n  /// The builder must not return null.\n  Widget Function(BuildContext context, LayoutInfoType layoutInfo) get builder;\n\n  @override\n  RenderObjectElement createElement() =>\n      _LayoutBuilderElement<LayoutInfoType>(this);\n\n  /// Whether [builder] needs to be called again even if the layout constraints\n  /// are the same.\n  ///\n  /// When this widget's configuration is updated, the [builder] callback most\n  /// likely needs to be called to build this widget's child. However,\n  /// subclasses may provide ways in which the widget can be updated without\n  /// needing to rebuild the child. Such subclasses can use this method to tell\n  /// the framework when the child widget should be rebuilt.\n  ///\n  /// When this method is called by the framework, the newly configured widget\n  /// is asked if it requires a rebuild, and it is passed the old widget as a\n  /// parameter.\n  ///\n  /// See also:\n  ///\n  ///  * [State.setState] and [State.didUpdateWidget], which talk about widget\n  ///    configuration changes and how they're triggered.\n  ///  * [Element.update], the method that actually updates the widget's\n  ///    configuration.\n  @protected\n  bool updateShouldRebuild(\n    covariant AbstractLayoutBuilder<LayoutInfoType> oldWidget,\n  ) => true;\n\n  @override\n  RenderAbstractLayoutBuilderMixin<LayoutInfoType, RenderObject>\n  createRenderObject(\n    BuildContext context,\n  );\n\n  // updateRenderObject is redundant with the logic in the LayoutBuilderElement below.\n}\n\n/// A specialized [AbstractLayoutBuilder] whose widget subtree depends on the\n/// incoming [ConstraintType] that will be imposed on the widget.\n///\n/// {@template flutter.widgets.ConstrainedLayoutBuilder}\n/// The [builder] function is called in the following situations:\n///\n/// * The first time the widget is laid out.\n/// * When the parent widget passes different layout constraints.\n/// * When the parent widget updates this widget and [updateShouldRebuild] returns `true`.\n/// * When the dependencies that the [builder] function subscribes to change.\n///\n/// The [builder] function is _not_ called during layout if the parent passes\n/// the same constraints repeatedly.\n///\n/// In the event that an ancestor skips the layout of this subtree so the\n/// constraints become outdated, the `builder` rebuilds with the last known\n/// constraints.\n/// {@endtemplate}\nabstract class ConstrainedLayoutBuilder<ConstraintType extends Constraints>\n    extends AbstractLayoutBuilder<ConstraintType> {\n  /// Creates a widget that defers its building until layout.\n  const ConstrainedLayoutBuilder({super.key, required this.builder});\n\n  @override\n  final Widget Function(BuildContext context, ConstraintType constraints)\n  builder;\n}\n\nclass _LayoutBuilderElement<LayoutInfoType> extends RenderObjectElement {\n  _LayoutBuilderElement(AbstractLayoutBuilder<LayoutInfoType> super.widget);\n\n  @override\n  RenderAbstractLayoutBuilderMixin<LayoutInfoType, RenderObject>\n  get renderObject =>\n      super.renderObject\n          as RenderAbstractLayoutBuilderMixin<LayoutInfoType, RenderObject>;\n\n  Element? _child;\n\n  // @override\n  // BuildScope get buildScope => _buildScope;\n\n  // late final BuildScope _buildScope = BuildScope(\n  //   scheduleRebuild: _scheduleRebuild,\n  // );\n\n  // To schedule a rebuild, markNeedsLayout needs to be called on this Element's\n  // render object (as the rebuilding is done in its performLayout call). However,\n  // the render tree should typically be kept clean during the postFrameCallbacks\n  // and the idle phase, so the layout data can be safely read.\n  // bool _deferredCallbackScheduled = false;\n  // void _scheduleRebuild() {\n  //   if (_deferredCallbackScheduled) {\n  //     return;\n  //   }\n\n  //   final bool deferMarkNeedsLayout =\n  //       switch (SchedulerBinding.instance.schedulerPhase) {\n  //         SchedulerPhase.idle || SchedulerPhase.postFrameCallbacks => true,\n  //         SchedulerPhase.transientCallbacks ||\n  //         SchedulerPhase.midFrameMicrotasks ||\n  //         SchedulerPhase.persistentCallbacks => false,\n  //       };\n  //   if (!deferMarkNeedsLayout) {\n  //     renderObject.scheduleLayoutCallback();\n  //     return;\n  //   }\n  //   _deferredCallbackScheduled = true;\n  //   SchedulerBinding.instance.scheduleFrameCallback(_frameCallback);\n  // }\n\n  // void _frameCallback(Duration timestamp) {\n  //   _deferredCallbackScheduled = false;\n  //   // This method is only called when the render tree is stable, if the Element\n  //   // is deactivated it will never be reincorporated back to the tree.\n  //   if (mounted) {\n  //     renderObject.scheduleLayoutCallback();\n  //   }\n  // }\n\n  @override\n  void visitChildren(ElementVisitor visitor) {\n    if (_child != null) {\n      visitor(_child!);\n    }\n  }\n\n  @override\n  void forgetChild(Element child) {\n    assert(child == _child);\n    _child = null;\n    super.forgetChild(child);\n  }\n\n  @override\n  void mount(Element? parent, Object? newSlot) {\n    super.mount(parent, newSlot); // Creates the renderObject.\n    renderObject._updateCallback(_rebuildWithConstraints);\n  }\n\n  @override\n  void update(AbstractLayoutBuilder<LayoutInfoType> newWidget) {\n    assert(widget != newWidget);\n    final oldWidget = widget as AbstractLayoutBuilder<LayoutInfoType>;\n    super.update(newWidget);\n    assert(widget == newWidget);\n\n    renderObject._updateCallback(_rebuildWithConstraints);\n    if (newWidget.updateShouldRebuild(oldWidget)) {\n      _needsBuild = true;\n      renderObject.scheduleLayoutCallback();\n    }\n  }\n\n  @override\n  void markNeedsBuild() {\n    // Calling super.markNeedsBuild is not needed. This Element does not need\n    // to performRebuild since this call already does what performRebuild does,\n    // So the element is clean as soon as this method returns and does not have\n    // to be added to the dirty list or marked as dirty.\n    renderObject.scheduleLayoutCallback();\n    _needsBuild = true;\n  }\n\n  @override\n  void performRebuild() {\n    // This gets called if markNeedsBuild() is called on us.\n    // That might happen if, e.g., our builder uses Inherited widgets.\n\n    // Force the callback to be called, even if the layout constraints are the\n    // same. This is because that callback may depend on the updated widget\n    // configuration, or an inherited widget.\n    renderObject.scheduleLayoutCallback();\n    _needsBuild = true;\n    super\n        .performRebuild(); // Calls widget.updateRenderObject (a no-op in this case).\n  }\n\n  @override\n  void unmount() {\n    renderObject._callback = null;\n    super.unmount();\n  }\n\n  // The LayoutInfoType that was used to invoke the layout callback with last time,\n  // during layout. The `_previousLayoutInfo` value is compared to the new one\n  // to determine whether [LayoutBuilderBase.builder] needs to be called.\n  LayoutInfoType? _previousLayoutInfo;\n  bool _needsBuild = true;\n\n  void _rebuildWithConstraints(Constraints _) {\n    final LayoutInfoType layoutInfo = renderObject.layoutInfo;\n    @pragma('vm:notify-debugger-on-exception')\n    void updateChildCallback() {\n      Widget built;\n      try {\n        assert(layoutInfo == renderObject.layoutInfo);\n        built = (widget as AbstractLayoutBuilder<LayoutInfoType>).builder(\n          this,\n          layoutInfo,\n        );\n        debugWidgetBuilderValue(widget, built);\n      } catch (e, stack) {\n        built = ErrorWidget.builder(\n          _reportException(\n            ErrorDescription('building $widget'),\n            e,\n            stack,\n            informationCollector: () => <DiagnosticsNode>[\n              if (kDebugMode) DiagnosticsDebugCreator(DebugCreator(this)),\n            ],\n          ),\n        );\n      }\n      try {\n        _child = updateChild(_child, built, null);\n        assert(_child != null);\n      } catch (e, stack) {\n        built = ErrorWidget.builder(\n          _reportException(\n            ErrorDescription('building $widget'),\n            e,\n            stack,\n            informationCollector: () => <DiagnosticsNode>[\n              if (kDebugMode) DiagnosticsDebugCreator(DebugCreator(this)),\n            ],\n          ),\n        );\n        _child = updateChild(null, built, slot);\n      } finally {\n        _needsBuild = false;\n        _previousLayoutInfo = layoutInfo;\n      }\n    }\n\n    final VoidCallback? callback =\n        _needsBuild || (layoutInfo != _previousLayoutInfo)\n        ? updateChildCallback\n        : null;\n    owner!.buildScope(this, callback);\n  }\n\n  @override\n  void insertRenderObjectChild(RenderObject child, Object? slot) {\n    final RenderObjectWithChildMixin<RenderObject> renderObject =\n        this.renderObject;\n    assert(slot == null);\n    assert(renderObject.debugValidateChild(child));\n    renderObject.child = child;\n    assert(renderObject == this.renderObject);\n  }\n\n  @override\n  void moveRenderObjectChild(\n    RenderObject child,\n    Object? oldSlot,\n    Object? newSlot,\n  ) {\n    assert(false);\n  }\n\n  @override\n  void removeRenderObjectChild(RenderObject child, Object? slot) {\n    final RenderAbstractLayoutBuilderMixin<LayoutInfoType, RenderObject>\n    renderObject = this.renderObject;\n    assert(renderObject.child == child);\n    renderObject.child = null;\n    assert(renderObject == this.renderObject);\n  }\n}\n\n/// Generic mixin for [RenderObject]s created by an [AbstractLayoutBuilder] with\n/// the the same `LayoutInfoType`.\n///\n/// Provides a [layoutCallback] implementation which, if needed, invokes\n/// [AbstractLayoutBuilder]'s builder callback.\n///\n/// Implementers can override the [layoutInfo] implementation with a value\n/// that is safe to access in [layoutCallback], which is called in\n/// [performLayout]. The default [layoutInfo] returns the incoming\n/// [Constraints].\n///\n/// This mixin replaces [RenderConstrainedLayoutBuilder].\nmixin RenderAbstractLayoutBuilderMixin<\n  LayoutInfoType,\n  ChildType extends RenderObject\n>\n    on\n        RenderObjectWithChildMixin<ChildType>,\n        RenderObjectWithLayoutCallbackMixin {\n  LayoutCallback<Constraints>? _callback;\n\n  /// Change the layout callback.\n  void _updateCallback(LayoutCallback<Constraints> value) {\n    if (value == _callback) {\n      return;\n    }\n    _callback = value;\n    scheduleLayoutCallback();\n  }\n\n  /// Invokes the builder callback supplied via [AbstractLayoutBuilder] and\n  /// rebuilds the [AbstractLayoutBuilder]'s widget tree, if needed.\n  ///\n  /// No further work will be done if [layoutInfo] has not changed since the last\n  /// time this method was called, and [AbstractLayoutBuilder.updateShouldRebuild]\n  /// returned `false` when the widget was rebuilt.\n  ///\n  /// This method should typically be called as soon as possible in the class's\n  /// [performLayout] implementation, before any layout work is done.\n  @visibleForOverriding\n  @override\n  void layoutCallback() => _callback!(constraints);\n\n  /// The information to invoke the [AbstractLayoutBuilder.builder] callback with.\n  ///\n  /// This is typically the information that are only made available in\n  /// [performLayout], which is inaccessible for regular [Builder] widget,\n  /// such as the incoming [Constraints], which are the default value.\n  @protected\n  LayoutInfoType get layoutInfo => constraints as LayoutInfoType;\n}\n\n/// Generic mixin for [RenderObject]s created by an [AbstractLayoutBuilder] with\n/// the the same `LayoutInfoType`.\n///\n/// Use [RenderAbstractLayoutBuilderMixin] instead, which replaces this mixin.\ntypedef RenderConstrainedLayoutBuilder<\n  LayoutInfoType,\n  ChildType extends RenderObject\n> = RenderAbstractLayoutBuilderMixin<LayoutInfoType, ChildType>;\n\n/// Builds a widget tree that can depend on the parent widget's size.\n///\n/// Similar to the [Builder] widget except that the framework calls the [builder]\n/// function at layout time and provides the parent widget's constraints. This\n/// is useful when the parent constrains the child's size and doesn't depend on\n/// the child's intrinsic size. The [LayoutBuilder]'s final size will match its\n/// child's size.\n///\n/// {@macro flutter.widgets.ConstrainedLayoutBuilder}\n///\n/// {@youtube 560 315 https://www.youtube.com/watch?v=IYDVcriKjsw}\n///\n/// If the child should be smaller than the parent, consider wrapping the child\n/// in an [Align] widget. If the child might want to be bigger, consider\n/// wrapping it in a [SingleChildScrollView] or [OverflowBox].\n///\n/// {@tool dartpad}\n/// This example uses a [LayoutBuilder] to build a different widget depending on the available width. Resize the\n/// DartPad window to see [LayoutBuilder] in action!\n///\n/// ** See code in examples/api/lib/widgets/layout_builder/layout_builder.0.dart **\n/// {@end-tool}\n///\n/// See also:\n///\n///  * [SliverLayoutBuilder], the sliver counterpart of this widget.\n///  * [Builder], which calls a `builder` function at build time.\n///  * [StatefulBuilder], which passes its `builder` function a `setState` callback.\n///  * [CustomSingleChildLayout], which positions its child during layout.\n///  * The [catalog of layout widgets](https://flutter.dev/widgets/layout/).\nclass LayoutBuilder extends ConstrainedLayoutBuilder<BoxConstraints> {\n  /// Creates a widget that defers its building until layout.\n  const LayoutBuilder({super.key, required super.builder});\n\n  @override\n  RenderAbstractLayoutBuilderMixin<BoxConstraints, RenderBox>\n  createRenderObject(\n    BuildContext context,\n  ) => _RenderLayoutBuilder();\n}\n\nclass _RenderLayoutBuilder extends RenderBox\n    with\n        RenderObjectWithChildMixin<RenderBox>,\n        RenderObjectWithLayoutCallbackMixin,\n        RenderAbstractLayoutBuilderMixin<BoxConstraints, RenderBox> {\n  @override\n  double computeMinIntrinsicWidth(double height) {\n    assert(_debugThrowIfNotCheckingIntrinsics());\n    return 0.0;\n  }\n\n  @override\n  double computeMaxIntrinsicWidth(double height) {\n    assert(_debugThrowIfNotCheckingIntrinsics());\n    return 0.0;\n  }\n\n  @override\n  double computeMinIntrinsicHeight(double width) {\n    assert(_debugThrowIfNotCheckingIntrinsics());\n    return 0.0;\n  }\n\n  @override\n  double computeMaxIntrinsicHeight(double width) {\n    assert(_debugThrowIfNotCheckingIntrinsics());\n    return 0.0;\n  }\n\n  @override\n  Size computeDryLayout(BoxConstraints constraints) {\n    assert(\n      debugCannotComputeDryLayout(\n        reason:\n            'Calculating the dry layout would require running the layout callback '\n            'speculatively, which might mutate the live render object tree.',\n      ),\n    );\n    return Size.zero;\n  }\n\n  @override\n  double? computeDryBaseline(\n    BoxConstraints constraints,\n    TextBaseline baseline,\n  ) {\n    assert(\n      debugCannotComputeDryLayout(\n        reason:\n            'Calculating the dry baseline would require running the layout callback '\n            'speculatively, which might mutate the live render object tree.',\n      ),\n    );\n    return null;\n  }\n\n  @override\n  void performLayout() {\n    final BoxConstraints constraints = this.constraints;\n    runLayoutCallback();\n    if (child != null) {\n      child!.layout(constraints, parentUsesSize: true);\n      size = constraints.constrain(child!.size);\n    } else {\n      size = constraints.biggest;\n    }\n  }\n\n  @override\n  double? computeDistanceToActualBaseline(TextBaseline baseline) {\n    return child?.getDistanceToActualBaseline(baseline) ??\n        super.computeDistanceToActualBaseline(baseline);\n  }\n\n  @override\n  bool hitTestChildren(BoxHitTestResult result, {required Offset position}) {\n    return child?.hitTest(result, position: position) ?? false;\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    if (child != null) {\n      context.paintChild(child!, offset);\n    }\n  }\n\n  bool _debugThrowIfNotCheckingIntrinsics() {\n    assert(() {\n      if (!RenderObject.debugCheckingIntrinsics) {\n        throw FlutterError(\n          'LayoutBuilder does not support returning intrinsic dimensions.\\n'\n          'Calculating the intrinsic dimensions would require running the layout '\n          'callback speculatively, which might mutate the live render object tree.',\n        );\n      }\n      return true;\n    }());\n\n    return true;\n  }\n}\n\nFlutterErrorDetails _reportException(\n  DiagnosticsNode context,\n  Object exception,\n  StackTrace stack, {\n  InformationCollector? informationCollector,\n}) {\n  final details = FlutterErrorDetails(\n    exception: exception,\n    stack: stack,\n    library: 'widgets library',\n    context: context,\n    informationCollector: informationCollector,\n  );\n  FlutterError.reportError(details);\n  return details;\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/list_tile.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// ignore_for_file: uri_does_not_exist_in_doc_import\n\n/// @docImport 'card.dart';\n/// @docImport 'checkbox.dart';\n/// @docImport 'checkbox_list_tile.dart';\n/// @docImport 'circle_avatar.dart';\n/// @docImport 'drawer.dart';\n/// @docImport 'expansion_tile.dart';\n/// @docImport 'material.dart';\n/// @docImport 'radio.dart';\n/// @docImport 'radio_list_tile.dart';\n/// @docImport 'scaffold.dart';\n/// @docImport 'switch.dart';\n/// @docImport 'switch_list_tile.dart';\nlibrary;\n\nimport 'dart:math' as math;\n\nimport 'package:flutter/material.dart' hide ListTile;\nimport 'package:flutter/rendering.dart';\n\n// Examples can assume:\n// int _act = 1;\n\ntypedef _Sizes = ({\n  double titleY,\n  BoxConstraints textConstraints,\n  Size tileSize,\n});\ntypedef _PositionChild = void Function(RenderBox child, Offset offset);\n\n/// Defines how [ListTile.leading] and [ListTile.trailing] are\n/// vertically aligned relative to the [ListTile]'s titles\n/// ([ListTile.title] and [ListTile.subtitle]).\n///\n/// See also:\n///\n///  * [ListTile.titleAlignment], to configure the title alignment for an\n///    individual [ListTile].\n///  * [ListTileThemeData.titleAlignment], to configure the title alignment\n///    for all of the [ListTile]s under a [ListTileTheme].\n///  * [ThemeData.listTileTheme], to configure the [ListTileTheme]\n///    for an entire app.\nextension on ListTileTitleAlignment {\n  // If isLeading is true the y offset is for the leading widget, otherwise it's\n  // for the trailing child.\n  double _yOffsetFor(\n    double childHeight,\n    double tileHeight,\n    _RenderListTile listTile,\n    bool isLeading,\n  ) {\n    return switch (this) {\n      ListTileTitleAlignment.threeLine =>\n        listTile.isThreeLine\n            ? ListTileTitleAlignment.top._yOffsetFor(\n                childHeight,\n                tileHeight,\n                listTile,\n                isLeading,\n              )\n            : ListTileTitleAlignment.center._yOffsetFor(\n                childHeight,\n                tileHeight,\n                listTile,\n                isLeading,\n              ),\n      // This attempts to implement the redlines for the vertical position of the\n      // leading and trailing icons on the spec page:\n      //   https://m2.material.io/components/lists#specs\n      //\n      // For large tiles (> 72dp), both leading and trailing controls should be\n      // a fixed distance from top. As per guidelines this is set to 16dp.\n      ListTileTitleAlignment.titleHeight when tileHeight > 72.0 => 16.0,\n      // For smaller tiles, trailing should always be centered. Leading can be\n      // centered or closer to the top. It should never be further than 16dp\n      // to the top.\n      ListTileTitleAlignment.titleHeight =>\n        isLeading\n            ? math.min((tileHeight - childHeight) / 2.0, 16.0)\n            : (tileHeight - childHeight) / 2.0,\n      ListTileTitleAlignment.top => listTile.minVerticalPadding,\n      ListTileTitleAlignment.center => (tileHeight - childHeight) / 2.0,\n      ListTileTitleAlignment.bottom =>\n        tileHeight - childHeight - listTile.minVerticalPadding,\n    };\n  }\n}\n\n/// A single fixed-height row that typically contains some text as well as\n/// a leading or trailing icon.\n///\n/// {@youtube 560 315 https://www.youtube.com/watch?v=l8dj0yPBvgQ}\n///\n/// A list tile contains one to three lines of text optionally flanked by icons or\n/// other widgets, such as check boxes. The icons (or other widgets) for the\n/// tile are defined with the [leading] and [trailing] parameters. The first\n/// line of text is not optional and is specified with [title]. The value of\n/// [subtitle], which _is_ optional, will occupy the space allocated for an\n/// additional line of text, or two lines if [isThreeLine] is true. If [dense]\n/// is true then the overall height of this tile and the size of the\n/// [DefaultTextStyle]s that wrap the [title] and [subtitle] widget are reduced.\n///\n/// It is the responsibility of the caller to ensure that [title] does not wrap,\n/// and to ensure that [subtitle] doesn't wrap (if [isThreeLine] is false) or\n/// wraps to two lines (if it is true).\n///\n/// The heights of the [leading] and [trailing] widgets are constrained\n/// according to the\n/// [Material spec](https://material.io/design/components/lists.html).\n/// An exception is made for one-line ListTiles for accessibility. Please\n/// see the example below to see how to adhere to both Material spec and\n/// accessibility requirements.\n///\n/// The [leading] and [trailing] widgets can expand as far as they wish\n/// horizontally, so ensure that they are properly constrained.\n///\n/// List tiles are typically used in [ListView]s, or arranged in [Column]s in\n/// [Drawer]s and [Card]s.\n///\n/// This widget requires a [Material] widget ancestor in the tree to paint\n/// itself on, which is typically provided by the app's [Scaffold].\n/// The [tileColor], [selectedTileColor], [focusColor], and [hoverColor]\n/// are not painted by the [ListTile] itself but by the [Material] widget\n/// ancestor. In this case, one can wrap a [Material] widget around the\n/// [ListTile], e.g.:\n///\n/// {@tool snippet}\n/// ```dart\n/// const ColoredBox(\n///   color: Colors.green,\n///   child: Material(\n///     child: ListTile(\n///       title: Text('ListTile with red background'),\n///       tileColor: Colors.red,\n///     ),\n///   ),\n/// )\n/// ```\n/// {@end-tool}\n///\n/// ## Performance considerations when wrapping [ListTile] with [Material]\n///\n/// Wrapping a large number of [ListTile]s individually with [Material]s\n/// is expensive. Consider only wrapping the [ListTile]s that require it\n/// or include a common [Material] ancestor where possible.\n///\n/// [ListTile] must be wrapped in a [Material] widget to animate [tileColor],\n/// [selectedTileColor], [focusColor], and [hoverColor] as these colors\n/// are not drawn by the list tile itself but by the material widget ancestor.\n///\n/// {@tool dartpad}\n/// This example showcases how [ListTile] needs to be wrapped in a [Material]\n/// widget to animate colors.\n///\n/// ** See code in examples/api/lib/material/list_tile/list_tile.0.dart **\n/// {@end-tool}\n///\n/// {@tool dartpad}\n/// This example uses a [ListView] to demonstrate different configurations of\n/// [ListTile]s in [Card]s.\n///\n/// ![Different variations of ListTile](https://flutter.github.io/assets-for-api-docs/assets/material/list_tile.png)\n///\n/// ** See code in examples/api/lib/material/list_tile/list_tile.1.dart **\n/// {@end-tool}\n///\n/// {@tool dartpad}\n/// This sample shows the creation of a [ListTile] using [ThemeData.useMaterial3] flag,\n/// as described in: https://m3.material.io/components/lists/overview.\n///\n/// ** See code in examples/api/lib/material/list_tile/list_tile.2.dart **\n/// {@end-tool}\n///\n/// {@tool dartpad}\n/// This sample shows [ListTile]'s [textColor] and [iconColor] can use\n/// [WidgetStateColor] color to change the color of the text and icon\n/// when the [ListTile] is enabled, selected, or disabled.\n///\n/// ** See code in examples/api/lib/material/list_tile/list_tile.3.dart **\n/// {@end-tool}\n///\n/// {@tool dartpad}\n/// This sample shows [ListTile.titleAlignment] can be used to configure the\n/// [leading] and [trailing] widgets alignment relative to the [title] and\n/// [subtitle] widgets.\n///\n/// ** See code in examples/api/lib/material/list_tile/list_tile.4.dart **\n/// {@end-tool}\n///\n/// {@tool snippet}\n/// To use a [ListTile] within a [Row], it needs to be wrapped in an\n/// [Expanded] widget. [ListTile] requires fixed width constraints,\n/// whereas a [Row] does not constrain its children.\n///\n/// ```dart\n/// const Row(\n///   children: <Widget>[\n///     Expanded(\n///       child: ListTile(\n///         leading: FlutterLogo(),\n///         title: Text('These ListTiles are expanded '),\n///       ),\n///     ),\n///     Expanded(\n///       child: ListTile(\n///         trailing: FlutterLogo(),\n///         title: Text('to fill the available space.'),\n///       ),\n///     ),\n///   ],\n/// )\n/// ```\n/// {@end-tool}\n/// {@tool snippet}\n///\n/// Tiles can be much more elaborate. Here is a tile which can be tapped, but\n/// which is disabled when the `_act` variable is not 2. When the tile is\n/// tapped, the whole row has an ink splash effect (see [InkWell]).\n///\n/// ```dart\n/// ListTile(\n///   leading: const Icon(Icons.flight_land),\n///   title: const Text(\"Trix's airplane\"),\n///   subtitle: _act != 2 ? const Text('The airplane is only in Act II.') : null,\n///   enabled: _act == 2,\n///   onTap: () { /* react to the tile being tapped */ }\n/// )\n/// ```\n/// {@end-tool}\n///\n/// To be accessible, tappable [leading] and [trailing] widgets have to\n/// be at least 48x48 in size. However, to adhere to the Material spec,\n/// [trailing] and [leading] widgets in one-line ListTiles should visually be\n/// at most 32 ([dense]: true) or 40 ([dense]: false) in height, which may\n/// conflict with the accessibility requirement.\n///\n/// For this reason, a one-line ListTile allows the height of [leading]\n/// and [trailing] widgets to be constrained by the height of the ListTile.\n/// This allows for the creation of tappable [leading] and [trailing] widgets\n/// that are large enough, but it is up to the developer to ensure that\n/// their widgets follow the Material spec.\n///\n/// {@tool snippet}\n///\n/// Here is an example of a one-line, non-[dense] ListTile with a\n/// tappable leading widget that adheres to accessibility requirements and\n/// the Material spec. To adjust the use case below for a one-line, [dense]\n/// ListTile, adjust the vertical padding to 8.0.\n///\n/// ```dart\n/// ListTile(\n///   leading: GestureDetector(\n///     behavior: HitTestBehavior.translucent,\n///     onTap: () {},\n///     child: Container(\n///       width: 48,\n///       height: 48,\n///       padding: const EdgeInsets.symmetric(vertical: 4.0),\n///       alignment: Alignment.center,\n///       child: const CircleAvatar(),\n///     ),\n///   ),\n///   title: const Text('title'),\n///   dense: false,\n/// )\n/// ```\n/// {@end-tool}\n///\n/// ## The ListTile layout isn't exactly what I want\n///\n/// If the way ListTile pads and positions its elements isn't quite what\n/// you're looking for, it's easy to create custom list items with a\n/// combination of other widgets, such as [Row]s and [Column]s.\n///\n/// {@tool dartpad}\n/// Here is an example of a custom list item that resembles a YouTube-related\n/// video list item created with [Expanded] and [Container] widgets.\n///\n/// ** See code in examples/api/lib/material/list_tile/custom_list_item.0.dart **\n/// {@end-tool}\n///\n/// {@tool dartpad}\n/// Here is an example of an article list item with multiline titles and\n/// subtitles. It utilizes [Row]s and [Column]s, as well as [Expanded] and\n/// [AspectRatio] widgets to organize its layout.\n///\n/// ** See code in examples/api/lib/material/list_tile/custom_list_item.1.dart **\n/// {@end-tool}\n///\n/// See also:\n///\n///  * [ListTileTheme], which defines visual properties for [ListTile]s.\n///  * [ListView], which can display an arbitrary number of [ListTile]s\n///    in a scrolling list.\n///  * [CircleAvatar], which shows an icon representing a person and is often\n///    used as the [leading] element of a ListTile.\n///  * [Card], which can be used with [Column] to show a few [ListTile]s.\n///  * [Divider], which can be used to separate [ListTile]s.\n///  * [ListTile.divideTiles], a utility for inserting [Divider]s in between [ListTile]s.\n///  * [CheckboxListTile], [RadioListTile], and [SwitchListTile], widgets\n///    that combine [ListTile] with other controls.\n///  * Material 3 [ListTile] specifications are referenced from <https://m3.material.io/components/lists/specs>\n///    and Material 2 [ListTile] specifications are referenced from <https://material.io/design/components/lists.html>\n///  * Cookbook: [Use lists](https://docs.flutter.dev/cookbook/lists/basic-list)\n///  * Cookbook: [Implement swipe to dismiss](https://docs.flutter.dev/cookbook/gestures/dismissible)\nclass ListTile extends StatelessWidget {\n  /// Creates a list tile.\n  ///\n  /// If [isThreeLine] is true, then [subtitle] must not be null.\n  ///\n  /// Requires one of its ancestors to be a [Material] widget.\n  const ListTile({\n    super.key,\n    this.safeArea = false,\n    this.leading,\n    this.title,\n    this.subtitle,\n    this.trailing,\n    this.isThreeLine,\n    this.dense,\n    this.visualDensity,\n    this.shape,\n    this.style,\n    this.selectedColor,\n    this.iconColor,\n    this.textColor,\n    this.titleTextStyle,\n    this.subtitleTextStyle,\n    this.leadingAndTrailingTextStyle,\n    this.contentPadding,\n    this.enabled = true,\n    this.onTap,\n    this.onTapUp,\n    this.onLongPress,\n    this.onSecondaryTap,\n    this.onSecondaryTapUp,\n    this.onFocusChange,\n    this.mouseCursor,\n    this.selected = false,\n    this.focusColor,\n    this.hoverColor,\n    this.splashColor,\n    this.focusNode,\n    this.autofocus = false,\n    this.tileColor,\n    this.selectedTileColor,\n    this.enableFeedback,\n    this.horizontalTitleGap,\n    this.minVerticalPadding,\n    this.minLeadingWidth,\n    this.minTileHeight,\n    this.titleAlignment,\n    this.internalAddSemanticForOnTap = true,\n    this.statesController,\n  }) : assert(isThreeLine != true || subtitle != null);\n\n  final bool safeArea;\n\n  /// A widget to display before the title.\n  ///\n  /// Typically an [Icon] or a [CircleAvatar] widget.\n  final Widget? leading;\n\n  /// The primary content of the list tile.\n  ///\n  /// Typically a [Text] widget.\n  ///\n  /// This should not wrap. To enforce the single line limit, use\n  /// [Text.maxLines].\n  final Widget? title;\n\n  /// Additional content displayed below the title.\n  ///\n  /// Typically a [Text] widget.\n  ///\n  /// If [isThreeLine] is false, this should not wrap.\n  ///\n  /// If [isThreeLine] is true, this should be configured to take a maximum of\n  /// two lines. For example, you can use [Text.maxLines] to enforce the number\n  /// of lines.\n  ///\n  /// The subtitle's default [TextStyle] depends on [TextTheme.bodyMedium] except\n  /// [TextStyle.color]. The [TextStyle.color] depends on the value of [enabled]\n  /// and [selected].\n  ///\n  /// When [enabled] is false, the text color is set to [ThemeData.disabledColor].\n  ///\n  /// When [selected] is false, the text color is set to [ListTileTheme.textColor]\n  /// if it's not null and to [TextTheme.bodySmall]'s color if [ListTileTheme.textColor]\n  /// is null.\n  final Widget? subtitle;\n\n  /// A widget to display after the title.\n  ///\n  /// Typically an [Icon] widget.\n  ///\n  /// To show right-aligned metadata (assuming left-to-right reading order;\n  /// left-aligned for right-to-left reading order), consider using a [Row] with\n  /// [CrossAxisAlignment.baseline] alignment whose first item is [Expanded] and\n  /// whose second child is the metadata text, instead of using the [trailing]\n  /// property.\n  final Widget? trailing;\n\n  /// Whether this list tile is intended to display three lines of text.\n  ///\n  /// If true, then [subtitle] must be non-null (since it is expected to give\n  /// the second and third lines of text).\n  ///\n  /// If false, the list tile is treated as having one line if the subtitle is\n  /// null and treated as having two lines if the subtitle is non-null.\n  ///\n  /// When using a [Text] widget for [title] and [subtitle], you can enforce\n  /// line limits using [Text.maxLines].\n  ///\n  /// See also:\n  ///\n  /// * [ListTileTheme.of], which returns the nearest [ListTileTheme]'s\n  ///   [ListTileThemeData].\n  final bool? isThreeLine;\n\n  /// {@template flutter.material.ListTile.dense}\n  /// Whether this list tile is part of a vertically dense list.\n  ///\n  /// If this property is null then its value is based on [ListTileTheme.dense].\n  ///\n  /// Dense list tiles default to a smaller height.\n  ///\n  /// It is not recommended to set [dense] to true when [ThemeData.useMaterial3] is true.\n  /// {@endtemplate}\n  final bool? dense;\n\n  /// Defines how compact the list tile's layout will be.\n  ///\n  /// {@macro flutter.material.themedata.visualDensity}\n  ///\n  /// See also:\n  ///\n  ///  * [ThemeData.visualDensity], which specifies the [visualDensity] for all\n  ///    widgets within a [Theme].\n  final VisualDensity? visualDensity;\n\n  /// {@template flutter.material.ListTile.shape}\n  /// Defines the tile's [InkWell.customBorder] and [Ink.decoration] shape.\n  /// {@endtemplate}\n  ///\n  /// If this property is null then [ListTileThemeData.shape] is used. If that\n  /// is also null then a rectangular [Border] will be used.\n  ///\n  /// See also:\n  ///\n  /// * [ListTileTheme.of], which returns the nearest [ListTileTheme]'s\n  ///   [ListTileThemeData].\n  final ShapeBorder? shape;\n\n  /// Defines the color used for icons and text when the list tile is selected.\n  ///\n  /// If this property is null then [ListTileThemeData.selectedColor]\n  /// is used. If that is also null then [ColorScheme.primary] is used.\n  ///\n  /// See also:\n  ///\n  /// * [ListTileTheme.of], which returns the nearest [ListTileTheme]'s\n  ///   [ListTileThemeData].\n  final Color? selectedColor;\n\n  /// Defines the default color for [leading] and [trailing] icons.\n  ///\n  /// If this property is null and [selected] is false then [ListTileThemeData.iconColor]\n  /// is used. If that is also null and [ThemeData.useMaterial3] is true, [ColorScheme.onSurfaceVariant]\n  /// is used, otherwise if [ThemeData.brightness] is [Brightness.light], [Colors.black54] is used,\n  /// and if [ThemeData.brightness] is [Brightness.dark], the value is null.\n  ///\n  /// If this property is null and [selected] is true then [ListTileThemeData.selectedColor]\n  /// is used. If that is also null then [ColorScheme.primary] is used.\n  ///\n  /// If this color is a [WidgetStateColor] it will be resolved against\n  /// [WidgetState.selected] and [WidgetState.disabled] states.\n  ///\n  /// See also:\n  ///\n  /// * [ListTileTheme.of], which returns the nearest [ListTileTheme]'s\n  ///   [ListTileThemeData].\n  final Color? iconColor;\n\n  /// Defines the text color for the [title], [subtitle], [leading], and [trailing].\n  ///\n  /// If this property is null and [selected] is false then [ListTileThemeData.textColor]\n  /// is used. If that is also null then default text color is used for the [title], [subtitle]\n  /// [leading], and [trailing]. Except for [subtitle], if [ThemeData.useMaterial3] is false,\n  /// [TextTheme.bodySmall] is used.\n  ///\n  /// If this property is null and [selected] is true then [ListTileThemeData.selectedColor]\n  /// is used. If that is also null then [ColorScheme.primary] is used.\n  ///\n  /// If this color is a [WidgetStateColor] it will be resolved against\n  /// [WidgetState.selected] and [WidgetState.disabled] states.\n  ///\n  /// See also:\n  ///\n  /// * [ListTileTheme.of], which returns the nearest [ListTileTheme]'s\n  ///   [ListTileThemeData].\n  final Color? textColor;\n\n  /// The text style for ListTile's [title].\n  ///\n  /// If this property is null, then [ListTileThemeData.titleTextStyle] is used.\n  /// If that is also null and [ThemeData.useMaterial3] is true, [TextTheme.bodyLarge]\n  /// with [ColorScheme.onSurface] will be used. Otherwise, If ListTile style is\n  /// [ListTileStyle.list], [TextTheme.titleMedium] will be used and if ListTile style\n  /// is [ListTileStyle.drawer], [TextTheme.bodyLarge] will be used.\n  final TextStyle? titleTextStyle;\n\n  /// The text style for ListTile's [subtitle].\n  ///\n  /// If this property is null, then [ListTileThemeData.subtitleTextStyle] is used.\n  /// If that is also null and [ThemeData.useMaterial3] is true, [TextTheme.bodyMedium]\n  /// with [ColorScheme.onSurfaceVariant] will be used, otherwise [TextTheme.bodyMedium]\n  /// with [TextTheme.bodySmall] color will be used.\n  final TextStyle? subtitleTextStyle;\n\n  /// The text style for ListTile's [leading] and [trailing].\n  ///\n  /// If this property is null, then [ListTileThemeData.leadingAndTrailingTextStyle] is used.\n  /// If that is also null and [ThemeData.useMaterial3] is true, [TextTheme.labelSmall]\n  /// with [ColorScheme.onSurfaceVariant] will be used, otherwise [TextTheme.bodyMedium]\n  /// will be used.\n  final TextStyle? leadingAndTrailingTextStyle;\n\n  /// Defines the font used for the [title].\n  ///\n  /// If this property is null then [ListTileThemeData.style] is used. If that\n  /// is also null then [ListTileStyle.list] is used.\n  ///\n  /// See also:\n  ///\n  /// * [ListTileTheme.of], which returns the nearest [ListTileTheme]'s\n  ///   [ListTileThemeData].\n  final ListTileStyle? style;\n\n  /// The tile's internal padding.\n  ///\n  /// Insets a [ListTile]'s contents: its [leading], [title], [subtitle], and [trailing] widgets.\n  ///\n  /// If this property is null, then [ListTileThemeData.contentPadding] is used. If that is also\n  /// null and [ThemeData.useMaterial3] is true, then a default value of\n  /// `EdgeInsetsDirectional.only(start: 16.0, end: 24.0)` will be used. Otherwise, a default value\n  /// of `EdgeInsets.symmetric(horizontal: 16.0)` will be used.\n  final EdgeInsetsGeometry? contentPadding;\n\n  /// Whether this list tile is interactive.\n  ///\n  /// If false, this list tile is styled with the disabled color from the\n  /// current [Theme] and the [onTap] and [onLongPress] callbacks are\n  /// inoperative.\n  final bool enabled;\n\n  /// Called when the user taps this list tile.\n  ///\n  /// Inoperative if [enabled] is false.\n  final GestureTapCallback? onTap;\n\n  final GestureTapUpCallback? onTapUp;\n\n  /// Called when the user long-presses on this list tile.\n  ///\n  /// Inoperative if [enabled] is false.\n  final GestureLongPressCallback? onLongPress;\n\n  final GestureTapCallback? onSecondaryTap;\n\n  final GestureTapUpCallback? onSecondaryTapUp;\n\n  /// {@macro flutter.material.inkwell.onFocusChange}\n  final ValueChanged<bool>? onFocusChange;\n\n  /// {@template flutter.material.ListTile.mouseCursor}\n  /// The cursor for a mouse pointer when it enters or is hovering over the\n  /// widget.\n  ///\n  /// If [mouseCursor] is a [WidgetStateMouseCursor],\n  /// [WidgetStateProperty.resolve] is used for the following [WidgetState]s:\n  ///\n  ///  * [WidgetState.selected].\n  ///  * [WidgetState.disabled].\n  /// {@endtemplate}\n  ///\n  /// If null, then the value of [ListTileThemeData.mouseCursor] is used. If\n  /// that is also null, then [WidgetStateMouseCursor.clickable] is used.\n  final MouseCursor? mouseCursor;\n\n  /// If this tile is also [enabled] then icons and text are rendered with the same color.\n  ///\n  /// By default the selected color is the theme's primary color. The selected color\n  /// can be overridden with a [ListTileTheme].\n  ///\n  /// {@tool dartpad}\n  /// Here is an example of using a [StatefulWidget] to keep track of the\n  /// selected index, and using that to set the [selected] property on the\n  /// corresponding [ListTile].\n  ///\n  /// ** See code in examples/api/lib/material/list_tile/list_tile.selected.0.dart **\n  /// {@end-tool}\n  final bool selected;\n\n  /// The color for the tile's [Material] when it has the input focus.\n  final Color? focusColor;\n\n  /// The color for the tile's [Material] when a pointer is hovering over it.\n  final Color? hoverColor;\n\n  /// The color of splash for the tile's [Material].\n  final Color? splashColor;\n\n  /// {@macro flutter.widgets.Focus.focusNode}\n  final FocusNode? focusNode;\n\n  /// {@macro flutter.widgets.Focus.autofocus}\n  final bool autofocus;\n\n  /// {@template flutter.material.ListTile.tileColor}\n  /// Defines the background color of `ListTile` when [selected] is false.\n  ///\n  /// If this property is null and [selected] is false then [ListTileThemeData.tileColor]\n  /// is used. If that is also null and [selected] is true, [selectedTileColor] is used.\n  /// When that is also null, the [ListTileTheme.selectedTileColor] is used, otherwise\n  /// [Colors.transparent] is used.\n  ///\n  /// {@endtemplate}\n  final Color? tileColor;\n\n  /// Defines the background color of `ListTile` when [selected] is true.\n  ///\n  /// When the value if null, the [selectedTileColor] is set to [ListTileTheme.selectedTileColor]\n  /// if it's not null and to [Colors.transparent] if it's null.\n  final Color? selectedTileColor;\n\n  /// {@template flutter.material.ListTile.enableFeedback}\n  /// Whether detected gestures should provide acoustic and/or haptic feedback.\n  ///\n  /// For example, on Android a tap will produce a clicking sound and a\n  /// long-press will produce a short vibration, when feedback is enabled.\n  ///\n  /// When null, the default value is true.\n  /// {@endtemplate}\n  ///\n  /// See also:\n  ///\n  ///  * [Feedback] for providing platform-specific feedback to certain actions.\n  final bool? enableFeedback;\n\n  /// The horizontal gap between the titles and the leading/trailing widgets.\n  ///\n  /// If null, then the value of [ListTileTheme.horizontalTitleGap] is used. If\n  /// that is also null, then a default value of 16 is used.\n  final double? horizontalTitleGap;\n\n  /// The minimum padding on the top and bottom of the title and subtitle widgets.\n  ///\n  /// If null, then the value of [ListTileTheme.minVerticalPadding] is used. If\n  /// that is also null, then a default value of 4 is used.\n  final double? minVerticalPadding;\n\n  /// The minimum width allocated for the [ListTile.leading] widget.\n  ///\n  /// If null, then the value of [ListTileTheme.minLeadingWidth] is used. If\n  /// that is also null, then a default value of 40 is used.\n  final double? minLeadingWidth;\n\n  /// {@template flutter.material.ListTile.minTileHeight}\n  /// The minimum height allocated for the [ListTile] widget.\n  ///\n  /// If this is null, default tile heights are 56.0, 72.0, and 88.0 for one,\n  /// two, and three lines of text respectively. If `isDense` is true, these\n  /// defaults are changed to 48.0, 64.0, and 76.0. A visual density value or\n  /// a large title will also adjust the default tile heights.\n  /// {@endtemplate}\n  final double? minTileHeight;\n\n  /// Defines how [ListTile.leading] and [ListTile.trailing] are\n  /// vertically aligned relative to the [ListTile]'s titles\n  /// ([ListTile.title] and [ListTile.subtitle]).\n  ///\n  /// If this property is null then [ListTileThemeData.titleAlignment]\n  /// is used. If that is also null then [ListTileTitleAlignment.threeLine]\n  /// is used.\n  ///\n  /// See also:\n  ///\n  /// * [ListTileTheme.of], which returns the nearest [ListTileTheme]'s\n  ///   [ListTileThemeData].\n  final ListTileTitleAlignment? titleAlignment;\n\n  /// Whether to add button:true to the semantics if onTap is provided.\n  /// This is a temporary flag to help changing the behavior of ListTile onTap semantics.\n  ///\n  // TODO(hangyujin): Remove this flag after fixing related g3 tests and flipping\n  // the default value to true.\n  final bool internalAddSemanticForOnTap;\n\n  /// {@macro flutter.material.inkwell.statesController}\n  final WidgetStatesController? statesController;\n\n  /// Add a one pixel border in between each tile. If color isn't specified the\n  /// [ThemeData.dividerColor] of the context's [Theme] is used.\n  ///\n  /// See also:\n  ///\n  ///  * [Divider], which you can use to obtain this effect manually.\n  static Iterable<Widget> divideTiles({\n    BuildContext? context,\n    required Iterable<Widget> tiles,\n    Color? color,\n  }) {\n    assert(color != null || context != null);\n    tiles = tiles.toList();\n\n    if (tiles.isEmpty || tiles.length == 1) {\n      return tiles;\n    }\n\n    Widget wrapTile(Widget tile) {\n      return DecoratedBox(\n        position: DecorationPosition.foreground,\n        decoration: BoxDecoration(\n          border: Border(\n            bottom: Divider.createBorderSide(context, color: color),\n          ),\n        ),\n        child: tile,\n      );\n    }\n\n    return <Widget>[...tiles.take(tiles.length - 1).map(wrapTile), tiles.last];\n  }\n\n  bool _isDenseLayout(ThemeData theme, ListTileThemeData tileTheme) {\n    return dense ?? tileTheme.dense ?? theme.listTileTheme.dense ?? false;\n  }\n\n  Color _tileBackgroundColor(\n    ThemeData theme,\n    ListTileThemeData tileTheme,\n    ListTileThemeData defaults,\n  ) {\n    final Color? color = selected\n        ? selectedTileColor ??\n              tileTheme.selectedTileColor ??\n              theme.listTileTheme.selectedTileColor\n        : tileColor ?? tileTheme.tileColor ?? theme.listTileTheme.tileColor;\n    return color ?? defaults.tileColor!;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    assert(debugCheckHasMaterial(context));\n    final ThemeData theme = Theme.of(context);\n    final IconButtonThemeData iconButtonTheme = IconButtonTheme.of(context);\n    final ListTileThemeData tileTheme = ListTileTheme.of(context);\n    final ListTileStyle listTileStyle =\n        style ??\n        tileTheme.style ??\n        theme.listTileTheme.style ??\n        ListTileStyle.list;\n    final ListTileThemeData defaults = theme.useMaterial3\n        ? _LisTileDefaultsM3(context)\n        : _LisTileDefaultsM2(context, listTileStyle);\n    final Set<WidgetState> states = <WidgetState>{\n      if (!enabled) WidgetState.disabled,\n      if (selected) WidgetState.selected,\n    };\n\n    Color? resolveColor(\n      Color? explicitColor,\n      Color? selectedColor,\n      Color? enabledColor, [\n      Color? disabledColor,\n    ]) {\n      return _IndividualOverrides(\n        explicitColor: explicitColor,\n        selectedColor: selectedColor,\n        enabledColor: enabledColor,\n        disabledColor: disabledColor,\n      ).resolve(states);\n    }\n\n    Color? effectiveIconColor =\n        resolveColor(iconColor, selectedColor, iconColor) ??\n        resolveColor(\n          tileTheme.iconColor,\n          tileTheme.selectedColor,\n          tileTheme.iconColor,\n        ) ??\n        resolveColor(\n          theme.listTileTheme.iconColor,\n          theme.listTileTheme.selectedColor,\n          theme.listTileTheme.iconColor,\n        );\n\n    final Color? defaultEffectiveIconColor = resolveColor(\n      defaults.iconColor,\n      defaults.selectedColor,\n      defaults.iconColor,\n      theme.disabledColor,\n    );\n\n    final Color? effectiveIconButtonColor =\n        effectiveIconColor ??\n        iconButtonTheme.style?.foregroundColor?.resolve(states) ??\n        defaultEffectiveIconColor;\n\n    effectiveIconColor ??= defaultEffectiveIconColor;\n\n    final Color? effectiveColor =\n        resolveColor(textColor, selectedColor, textColor) ??\n        resolveColor(\n          tileTheme.textColor,\n          tileTheme.selectedColor,\n          tileTheme.textColor,\n        ) ??\n        resolveColor(\n          theme.listTileTheme.textColor,\n          theme.listTileTheme.selectedColor,\n          theme.listTileTheme.textColor,\n        ) ??\n        resolveColor(\n          defaults.textColor,\n          defaults.selectedColor,\n          defaults.textColor,\n          theme.disabledColor,\n        );\n    final IconThemeData iconThemeData = IconThemeData(\n      color: effectiveIconColor,\n    );\n    final IconButtonThemeData iconButtonThemeData = IconButtonThemeData(\n      style:\n          IconButtonTheme.of(context).style?.copyWith(\n            foregroundColor: WidgetStatePropertyAll<Color?>(\n              effectiveIconButtonColor,\n            ),\n          ) ??\n          IconButton.styleFrom(foregroundColor: effectiveIconButtonColor),\n    );\n\n    TextStyle? leadingAndTrailingStyle;\n    if (leading != null || trailing != null) {\n      leadingAndTrailingStyle =\n          leadingAndTrailingTextStyle ??\n          tileTheme.leadingAndTrailingTextStyle ??\n          defaults.leadingAndTrailingTextStyle!;\n      final Color? leadingAndTrailingTextColor = effectiveColor;\n      leadingAndTrailingStyle = leadingAndTrailingStyle.copyWith(\n        color: leadingAndTrailingTextColor,\n      );\n    }\n\n    Widget? leadingIcon;\n    if (leading != null) {\n      leadingIcon = AnimatedDefaultTextStyle(\n        style: leadingAndTrailingStyle!,\n        duration: kThemeChangeDuration,\n        child: leading!,\n      );\n    }\n\n    TextStyle titleStyle =\n        titleTextStyle ?? tileTheme.titleTextStyle ?? defaults.titleTextStyle!;\n    final Color? titleColor = effectiveColor;\n    titleStyle = titleStyle.copyWith(\n      color: titleColor,\n      fontSize: _isDenseLayout(theme, tileTheme) ? 13.0 : null,\n    );\n    final Widget titleText = AnimatedDefaultTextStyle(\n      style: titleStyle,\n      duration: kThemeChangeDuration,\n      child: title ?? const SizedBox(),\n    );\n\n    Widget? subtitleText;\n    TextStyle? subtitleStyle;\n    if (subtitle != null) {\n      subtitleStyle =\n          subtitleTextStyle ??\n          tileTheme.subtitleTextStyle ??\n          defaults.subtitleTextStyle!;\n      final Color? subtitleColor = effectiveColor;\n      subtitleStyle = subtitleStyle.copyWith(\n        color: subtitleColor,\n        fontSize: _isDenseLayout(theme, tileTheme) ? 12.0 : null,\n      );\n      subtitleText = AnimatedDefaultTextStyle(\n        style: subtitleStyle,\n        duration: kThemeChangeDuration,\n        child: subtitle!,\n      );\n    }\n\n    Widget? trailingIcon;\n    if (trailing != null) {\n      trailingIcon = AnimatedDefaultTextStyle(\n        style: leadingAndTrailingStyle!,\n        duration: kThemeChangeDuration,\n        child: trailing!,\n      );\n    }\n\n    final TextDirection textDirection = Directionality.of(context);\n    final EdgeInsets resolvedContentPadding =\n        contentPadding?.resolve(textDirection) ??\n        tileTheme.contentPadding?.resolve(textDirection) ??\n        defaults.contentPadding!.resolve(textDirection);\n\n    // Show basic cursor when ListTile isn't enabled or gesture callbacks are null.\n    final Set<WidgetState> mouseStates = <WidgetState>{\n      if (!enabled ||\n          (onTap == null &&\n              onTapUp == null &&\n              onLongPress == null &&\n              onSecondaryTap == null &&\n              onSecondaryTapUp == null))\n        WidgetState.disabled,\n    };\n    final MouseCursor effectiveMouseCursor =\n        WidgetStateProperty.resolveAs<MouseCursor?>(mouseCursor, mouseStates) ??\n        tileTheme.mouseCursor?.resolve(mouseStates) ??\n        WidgetStateMouseCursor.clickable.resolve(mouseStates);\n\n    final ListTileTitleAlignment effectiveTitleAlignment =\n        titleAlignment ??\n        tileTheme.titleAlignment ??\n        (theme.useMaterial3\n            ? ListTileTitleAlignment.threeLine\n            : ListTileTitleAlignment.titleHeight);\n\n    Widget child = IconTheme.merge(\n      data: iconThemeData,\n      child: IconButtonTheme(\n        data: iconButtonThemeData,\n        child: _ListTile(\n          leading: leadingIcon,\n          title: titleText,\n          subtitle: subtitleText,\n          trailing: trailingIcon,\n          isDense: _isDenseLayout(theme, tileTheme),\n          visualDensity:\n              visualDensity ?? tileTheme.visualDensity ?? theme.visualDensity,\n          isThreeLine:\n              isThreeLine ??\n              tileTheme.isThreeLine ??\n              theme.listTileTheme.isThreeLine ??\n              false,\n          textDirection: textDirection,\n          titleBaselineType:\n              titleStyle.textBaseline ?? defaults.titleTextStyle!.textBaseline!,\n          subtitleBaselineType:\n              subtitleStyle?.textBaseline ??\n              defaults.subtitleTextStyle!.textBaseline!,\n          horizontalTitleGap:\n              horizontalTitleGap ?? tileTheme.horizontalTitleGap ?? 16,\n          minVerticalPadding:\n              minVerticalPadding ??\n              tileTheme.minVerticalPadding ??\n              defaults.minVerticalPadding!,\n          minLeadingWidth:\n              minLeadingWidth ??\n              tileTheme.minLeadingWidth ??\n              defaults.minLeadingWidth!,\n          minTileHeight: minTileHeight ?? tileTheme.minTileHeight,\n          titleAlignment: effectiveTitleAlignment,\n        ),\n      ),\n    );\n\n    if (safeArea) {\n      child = SafeArea(\n        top: false,\n        bottom: false,\n        minimum: resolvedContentPadding,\n        child: child,\n      );\n    } else {\n      child = Padding(\n        padding: resolvedContentPadding,\n        child: child,\n      );\n    }\n\n    return InkWell(\n      customBorder: shape ?? tileTheme.shape,\n      onTap: enabled ? onTap : null,\n      onTapUp: enabled ? onTapUp : null,\n      onLongPress: enabled ? onLongPress : null,\n      onSecondaryTap: enabled ? onSecondaryTap : null,\n      onSecondaryTapUp: enabled ? onSecondaryTapUp : null,\n      onFocusChange: onFocusChange,\n      mouseCursor: effectiveMouseCursor,\n      canRequestFocus: enabled,\n      focusNode: focusNode,\n      focusColor: focusColor,\n      hoverColor: hoverColor,\n      splashColor: splashColor,\n      autofocus: autofocus,\n      enableFeedback: enableFeedback ?? tileTheme.enableFeedback ?? true,\n      statesController: statesController,\n      child: Semantics(\n        button:\n            internalAddSemanticForOnTap &&\n            (onTap != null || onLongPress != null),\n        selected: selected,\n        enabled: enabled,\n        child: Ink(\n          decoration: ShapeDecoration(\n            shape: shape ?? tileTheme.shape ?? const Border(),\n            color: _tileBackgroundColor(theme, tileTheme, defaults),\n          ),\n          child: child,\n        ),\n      ),\n    );\n  }\n\n  @override\n  void debugFillProperties(DiagnosticPropertiesBuilder properties) {\n    super.debugFillProperties(properties);\n    properties\n      ..add(\n        FlagProperty(\n          'isThreeLine',\n          value: isThreeLine,\n          ifTrue: 'THREE_LINE',\n          ifFalse: 'TWO_LINE',\n          showName: true,\n        ),\n      )\n      ..add(\n        FlagProperty(\n          'dense',\n          value: dense,\n          ifTrue: 'true',\n          ifFalse: 'false',\n          showName: true,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<VisualDensity>(\n          'visualDensity',\n          visualDensity,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<ShapeBorder>('shape', shape, defaultValue: null),\n      )\n      ..add(\n        DiagnosticsProperty<ListTileStyle>('style', style, defaultValue: null),\n      )\n      ..add(\n        ColorProperty('selectedColor', selectedColor, defaultValue: null),\n      )\n      ..add(ColorProperty('iconColor', iconColor, defaultValue: null))\n      ..add(ColorProperty('textColor', textColor, defaultValue: null))\n      ..add(\n        DiagnosticsProperty<TextStyle>(\n          'titleTextStyle',\n          titleTextStyle,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<TextStyle>(\n          'subtitleTextStyle',\n          subtitleTextStyle,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<TextStyle>(\n          'leadingAndTrailingTextStyle',\n          leadingAndTrailingTextStyle,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<EdgeInsetsGeometry>(\n          'contentPadding',\n          contentPadding,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        FlagProperty(\n          'enabled',\n          value: enabled,\n          ifTrue: 'true',\n          ifFalse: 'false',\n          showName: true,\n          defaultValue: true,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<Function>('onTap', onTap, defaultValue: null),\n      )\n      ..add(\n        DiagnosticsProperty<Function>(\n          'onLongPress',\n          onLongPress,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<MouseCursor>(\n          'mouseCursor',\n          mouseCursor,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        FlagProperty(\n          'selected',\n          value: selected,\n          ifTrue: 'true',\n          ifFalse: 'false',\n          showName: true,\n          defaultValue: false,\n        ),\n      )\n      ..add(ColorProperty('focusColor', focusColor, defaultValue: null))\n      ..add(ColorProperty('hoverColor', hoverColor, defaultValue: null))\n      ..add(\n        DiagnosticsProperty<FocusNode>(\n          'focusNode',\n          focusNode,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        FlagProperty(\n          'autofocus',\n          value: autofocus,\n          ifTrue: 'true',\n          ifFalse: 'false',\n          showName: true,\n          defaultValue: false,\n        ),\n      )\n      ..add(ColorProperty('tileColor', tileColor, defaultValue: null))\n      ..add(\n        ColorProperty(\n          'selectedTileColor',\n          selectedTileColor,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        FlagProperty(\n          'enableFeedback',\n          value: enableFeedback,\n          ifTrue: 'true',\n          ifFalse: 'false',\n          showName: true,\n        ),\n      )\n      ..add(\n        DoubleProperty(\n          'horizontalTitleGap',\n          horizontalTitleGap,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DoubleProperty(\n          'minVerticalPadding',\n          minVerticalPadding,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DoubleProperty('minLeadingWidth', minLeadingWidth, defaultValue: null),\n      )\n      ..add(\n        DiagnosticsProperty<ListTileTitleAlignment>(\n          'titleAlignment',\n          titleAlignment,\n          defaultValue: null,\n        ),\n      );\n  }\n}\n\nclass _IndividualOverrides extends WidgetStateProperty<Color?> {\n  _IndividualOverrides({\n    this.explicitColor,\n    this.enabledColor,\n    this.selectedColor,\n    this.disabledColor,\n  });\n\n  final Color? explicitColor;\n  final Color? enabledColor;\n  final Color? selectedColor;\n  final Color? disabledColor;\n\n  @override\n  Color? resolve(Set<WidgetState> states) {\n    if (explicitColor is WidgetStateColor) {\n      return WidgetStateProperty.resolveAs<Color?>(explicitColor, states);\n    }\n    if (states.contains(WidgetState.disabled)) {\n      return disabledColor;\n    }\n    if (states.contains(WidgetState.selected)) {\n      return selectedColor;\n    }\n    return enabledColor;\n  }\n}\n\n// Identifies the children of a _ListTileElement.\nenum _ListTileSlot { leading, title, subtitle, trailing }\n\nclass _ListTile\n    extends SlottedMultiChildRenderObjectWidget<_ListTileSlot, RenderBox> {\n  const _ListTile({\n    this.leading,\n    required this.title,\n    this.subtitle,\n    this.trailing,\n    required this.isThreeLine,\n    required this.isDense,\n    required this.visualDensity,\n    required this.textDirection,\n    required this.titleBaselineType,\n    required this.horizontalTitleGap,\n    required this.minVerticalPadding,\n    required this.minLeadingWidth,\n    this.minTileHeight,\n    this.subtitleBaselineType,\n    required this.titleAlignment,\n  });\n\n  final Widget? leading;\n  final Widget title;\n  final Widget? subtitle;\n  final Widget? trailing;\n  final bool isThreeLine;\n  final bool isDense;\n  final VisualDensity visualDensity;\n  final TextDirection textDirection;\n  final TextBaseline titleBaselineType;\n  final TextBaseline? subtitleBaselineType;\n  final double horizontalTitleGap;\n  final double minVerticalPadding;\n  final double minLeadingWidth;\n  final double? minTileHeight;\n  final ListTileTitleAlignment titleAlignment;\n\n  @override\n  Iterable<_ListTileSlot> get slots => _ListTileSlot.values;\n\n  @override\n  Widget? childForSlot(_ListTileSlot slot) {\n    return switch (slot) {\n      _ListTileSlot.leading => leading,\n      _ListTileSlot.title => title,\n      _ListTileSlot.subtitle => subtitle,\n      _ListTileSlot.trailing => trailing,\n    };\n  }\n\n  @override\n  _RenderListTile createRenderObject(BuildContext context) {\n    return _RenderListTile(\n      isThreeLine: isThreeLine,\n      isDense: isDense,\n      visualDensity: visualDensity,\n      textDirection: textDirection,\n      titleBaselineType: titleBaselineType,\n      subtitleBaselineType: subtitleBaselineType,\n      horizontalTitleGap: horizontalTitleGap,\n      minVerticalPadding: minVerticalPadding,\n      minLeadingWidth: minLeadingWidth,\n      minTileHeight: minTileHeight,\n      titleAlignment: titleAlignment,\n    );\n  }\n\n  @override\n  void updateRenderObject(BuildContext context, _RenderListTile renderObject) {\n    renderObject\n      ..isThreeLine = isThreeLine\n      ..isDense = isDense\n      ..visualDensity = visualDensity\n      ..textDirection = textDirection\n      ..titleBaselineType = titleBaselineType\n      ..subtitleBaselineType = subtitleBaselineType\n      ..horizontalTitleGap = horizontalTitleGap\n      ..minLeadingWidth = minLeadingWidth\n      ..minTileHeight = minTileHeight\n      ..minVerticalPadding = minVerticalPadding\n      ..titleAlignment = titleAlignment;\n  }\n}\n\nclass _RenderListTile extends RenderBox\n    with SlottedContainerRenderObjectMixin<_ListTileSlot, RenderBox> {\n  _RenderListTile({\n    required bool isDense,\n    required VisualDensity visualDensity,\n    required bool isThreeLine,\n    required TextDirection textDirection,\n    required TextBaseline titleBaselineType,\n    TextBaseline? subtitleBaselineType,\n    required double horizontalTitleGap,\n    required double minVerticalPadding,\n    required double minLeadingWidth,\n    double? minTileHeight,\n    required ListTileTitleAlignment titleAlignment,\n  }) : _isDense = isDense,\n       _visualDensity = visualDensity,\n       _isThreeLine = isThreeLine,\n       _textDirection = textDirection,\n       _titleBaselineType = titleBaselineType,\n       _subtitleBaselineType = subtitleBaselineType,\n       _horizontalTitleGap = horizontalTitleGap,\n       _minVerticalPadding = minVerticalPadding,\n       _minLeadingWidth = minLeadingWidth,\n       _minTileHeight = minTileHeight,\n       _titleAlignment = titleAlignment;\n\n  RenderBox? get leading => childForSlot(_ListTileSlot.leading);\n  RenderBox get title => childForSlot(_ListTileSlot.title)!;\n  RenderBox? get subtitle => childForSlot(_ListTileSlot.subtitle);\n  RenderBox? get trailing => childForSlot(_ListTileSlot.trailing);\n\n  // The returned list is ordered for hit testing.\n  @override\n  Iterable<RenderBox> get children {\n    final RenderBox? title = childForSlot(_ListTileSlot.title);\n    return <RenderBox>[?leading, ?title, ?subtitle, ?trailing];\n  }\n\n  bool get isDense => _isDense;\n  bool _isDense;\n  set isDense(bool value) {\n    if (_isDense == value) {\n      return;\n    }\n    _isDense = value;\n    markNeedsLayout();\n  }\n\n  VisualDensity get visualDensity => _visualDensity;\n  VisualDensity _visualDensity;\n  set visualDensity(VisualDensity value) {\n    if (_visualDensity == value) {\n      return;\n    }\n    _visualDensity = value;\n    markNeedsLayout();\n  }\n\n  bool get isThreeLine => _isThreeLine;\n  bool _isThreeLine;\n  set isThreeLine(bool value) {\n    if (_isThreeLine == value) {\n      return;\n    }\n    _isThreeLine = value;\n    markNeedsLayout();\n  }\n\n  TextDirection get textDirection => _textDirection;\n  TextDirection _textDirection;\n  set textDirection(TextDirection value) {\n    if (_textDirection == value) {\n      return;\n    }\n    _textDirection = value;\n    markNeedsLayout();\n  }\n\n  TextBaseline get titleBaselineType => _titleBaselineType;\n  TextBaseline _titleBaselineType;\n  set titleBaselineType(TextBaseline value) {\n    if (_titleBaselineType == value) {\n      return;\n    }\n    _titleBaselineType = value;\n    markNeedsLayout();\n  }\n\n  TextBaseline? get subtitleBaselineType => _subtitleBaselineType;\n  TextBaseline? _subtitleBaselineType;\n  set subtitleBaselineType(TextBaseline? value) {\n    if (_subtitleBaselineType == value) {\n      return;\n    }\n    _subtitleBaselineType = value;\n    markNeedsLayout();\n  }\n\n  double get horizontalTitleGap => _horizontalTitleGap;\n  double _horizontalTitleGap;\n  double get _effectiveHorizontalTitleGap =>\n      _horizontalTitleGap + visualDensity.horizontal * 2.0;\n\n  set horizontalTitleGap(double value) {\n    if (_horizontalTitleGap == value) {\n      return;\n    }\n    _horizontalTitleGap = value;\n    markNeedsLayout();\n  }\n\n  double get minVerticalPadding => _minVerticalPadding;\n  double _minVerticalPadding;\n\n  set minVerticalPadding(double value) {\n    if (_minVerticalPadding == value) {\n      return;\n    }\n    _minVerticalPadding = value;\n    markNeedsLayout();\n  }\n\n  double get minLeadingWidth => _minLeadingWidth;\n  double _minLeadingWidth;\n\n  set minLeadingWidth(double value) {\n    if (_minLeadingWidth == value) {\n      return;\n    }\n    _minLeadingWidth = value;\n    markNeedsLayout();\n  }\n\n  double? _minTileHeight;\n  double? get minTileHeight => _minTileHeight;\n  set minTileHeight(double? value) {\n    if (_minTileHeight == value) {\n      return;\n    }\n    _minTileHeight = value;\n    markNeedsLayout();\n  }\n\n  ListTileTitleAlignment get titleAlignment => _titleAlignment;\n  ListTileTitleAlignment _titleAlignment;\n  set titleAlignment(ListTileTitleAlignment value) {\n    if (_titleAlignment == value) {\n      return;\n    }\n    _titleAlignment = value;\n    markNeedsLayout();\n  }\n\n  @override\n  bool get sizedByParent => false;\n\n  static double _minWidth(RenderBox? box, double height) {\n    return box == null ? 0.0 : box.getMinIntrinsicWidth(height);\n  }\n\n  static double _maxWidth(RenderBox? box, double height) {\n    return box == null ? 0.0 : box.getMaxIntrinsicWidth(height);\n  }\n\n  @override\n  double computeMinIntrinsicWidth(double height) {\n    final double leadingWidth = leading != null\n        ? math.max(leading!.getMinIntrinsicWidth(height), _minLeadingWidth) +\n              _effectiveHorizontalTitleGap\n        : 0.0;\n    return leadingWidth +\n        math.max(_minWidth(title, height), _minWidth(subtitle, height)) +\n        _maxWidth(trailing, height);\n  }\n\n  @override\n  double computeMaxIntrinsicWidth(double height) {\n    final double leadingWidth = leading != null\n        ? math.max(leading!.getMaxIntrinsicWidth(height), _minLeadingWidth) +\n              _effectiveHorizontalTitleGap\n        : 0.0;\n    return leadingWidth +\n        math.max(_maxWidth(title, height), _maxWidth(subtitle, height)) +\n        _maxWidth(trailing, height);\n  }\n\n  // The target tile height to use if _minTileHeight is not specified.\n  double get _defaultTileHeight {\n    final Offset baseDensity = visualDensity.baseSizeAdjustment;\n    return baseDensity.dy +\n        switch ((isThreeLine, subtitle != null)) {\n          (true, _) => isDense ? 76.0 : 88.0, // 3 lines,\n          (false, true) => isDense ? 64.0 : 72.0, // 2 lines\n          (false, false) => isDense ? 48.0 : 56.0, // 1 line,\n        };\n  }\n\n  double get _targetTileHeight => _minTileHeight ?? _defaultTileHeight;\n\n  @override\n  double computeMinIntrinsicHeight(double width) {\n    final double titleMinHeight = title.getMinIntrinsicHeight(width);\n    final double? subtitleMinHeight = subtitle?.getMinIntrinsicHeight(width);\n\n    const topAndBottomPaddingMultiplier = 2;\n    final double contentHeight =\n        titleMinHeight +\n        (subtitleMinHeight ?? 0.0) +\n        topAndBottomPaddingMultiplier * _minVerticalPadding;\n\n    return math.max(_targetTileHeight, contentHeight);\n  }\n\n  @override\n  double computeMaxIntrinsicHeight(double width) {\n    return getMinIntrinsicHeight(width);\n  }\n\n  @override\n  double? computeDistanceToActualBaseline(TextBaseline baseline) {\n    final BoxParentData parentData = title.parentData! as BoxParentData;\n    final BaselineOffset offset =\n        BaselineOffset(title.getDistanceToActualBaseline(baseline)) +\n        parentData.offset.dy;\n    return offset.offset;\n  }\n\n  BoxConstraints get maxIconHeightConstraint => BoxConstraints(\n    // One-line trailing and leading widget heights do not follow\n    // Material specifications, but this sizing is required to adhere\n    // to accessibility requirements for smallest tappable widget.\n    // Two- and three-line trailing widget heights are constrained\n    // properly according to the Material spec.\n    maxHeight: (isDense ? 48.0 : 56.0) + visualDensity.baseSizeAdjustment.dy,\n  );\n\n  static void _positionBox(RenderBox box, Offset offset) {\n    final BoxParentData parentData = box.parentData! as BoxParentData;\n    parentData.offset = offset;\n  }\n\n  // Implements _RenderListTile's layout algorithm. If `positionChild` is not null,\n  // it will be called on each child with that child's layout offset.\n  //\n  // All of the dimensions below were taken from the Material Design spec:\n  // https://material.io/design/components/lists.html#specs\n  _Sizes _computeSizes(\n    ChildBaselineGetter getBaseline,\n    ChildLayouter getSize,\n    BoxConstraints constraints, {\n    _PositionChild? positionChild,\n  }) {\n    final BoxConstraints looseConstraints = constraints.loosen();\n    final double tileWidth = looseConstraints.maxWidth;\n    final BoxConstraints iconConstraints = looseConstraints.enforce(\n      maxIconHeightConstraint,\n    );\n    final RenderBox? leading = this.leading;\n    final RenderBox? trailing = this.trailing;\n\n    final Size? leadingSize = leading == null\n        ? null\n        : getSize(leading, iconConstraints);\n    final Size? trailingSize = trailing == null\n        ? null\n        : getSize(trailing, iconConstraints);\n\n    assert(() {\n      if (tileWidth == 0.0) {\n        return true;\n      }\n\n      String? overflowedWidget;\n      if (tileWidth == leadingSize?.width) {\n        overflowedWidget = 'Leading';\n      } else if (tileWidth == trailingSize?.width) {\n        overflowedWidget = 'Trailing';\n      }\n\n      if (overflowedWidget == null) {\n        return true;\n      }\n\n      throw FlutterError.fromParts(<DiagnosticsNode>[\n        ErrorSummary(\n          '$overflowedWidget widget consumes the entire tile width (including ListTile.contentPadding).',\n        ),\n        ErrorDescription(\n          'Either resize the tile width so that the ${overflowedWidget.toLowerCase()} widget plus any content padding '\n          'do not exceed the tile width, or use a sized widget, or consider replacing '\n          'ListTile with a custom widget.',\n        ),\n        ErrorHint(\n          'See also: https://api.flutter.dev/flutter/material/ListTile-class.html#material.ListTile.4',\n        ),\n      ]);\n    }());\n\n    final double titleStart = leadingSize == null\n        ? 0.0\n        : math.max(_minLeadingWidth, leadingSize.width) +\n              _effectiveHorizontalTitleGap;\n\n    final double adjustedTrailingWidth = trailingSize == null\n        ? 0.0\n        : math.max(trailingSize.width + _effectiveHorizontalTitleGap, 32.0);\n\n    final BoxConstraints textConstraints = looseConstraints.tighten(\n      width: tileWidth - titleStart - adjustedTrailingWidth,\n    );\n\n    final RenderBox? subtitle = this.subtitle;\n    final double titleHeight = getSize(title, textConstraints).height;\n\n    final bool isLTR = switch (textDirection) {\n      TextDirection.ltr => true,\n      TextDirection.rtl => false,\n    };\n\n    final double titleY;\n    final double tileHeight;\n    if (subtitle == null) {\n      tileHeight = math.max(\n        _targetTileHeight,\n        titleHeight + 2.0 * _minVerticalPadding,\n      );\n      titleY = (tileHeight - titleHeight) / 2.0;\n    } else {\n      final double subtitleHeight = getSize(subtitle, textConstraints).height;\n      final double titleBaseline =\n          getBaseline(title, textConstraints, titleBaselineType) ?? titleHeight;\n      final double subtitleBaseline =\n          getBaseline(subtitle, textConstraints, subtitleBaselineType!) ??\n          subtitleHeight;\n\n      final double targetTitleY =\n          (isThreeLine ? (isDense ? 22.0 : 28.0) : (isDense ? 28.0 : 32.0)) -\n          titleBaseline;\n      final double targetSubtitleY =\n          (isThreeLine ? (isDense ? 42.0 : 48.0) : (isDense ? 48.0 : 52.0)) +\n          visualDensity.vertical * 2.0 -\n          subtitleBaseline;\n      // Prevent the title and the subtitle from overlapping by moving them away from\n      // each other by the same distance.\n      final double halfOverlap =\n          math.max(targetTitleY + titleHeight - targetSubtitleY, 0) / 2;\n      final double idealTitleY = targetTitleY - halfOverlap;\n      final double idealSubtitleY = targetSubtitleY + halfOverlap;\n      // However if either component can't maintain the minimal padding from the top/bottom edges, the ListTile enters \"compat mode\".\n      final bool compact =\n          idealTitleY < minVerticalPadding ||\n          idealSubtitleY + subtitleHeight + minVerticalPadding >\n              _targetTileHeight;\n\n      // Position subtitle.\n      positionChild?.call(\n        subtitle,\n        Offset(\n          isLTR ? titleStart : adjustedTrailingWidth,\n          compact ? minVerticalPadding + titleHeight : idealSubtitleY,\n        ),\n      );\n      tileHeight = compact\n          ? 2 * _minVerticalPadding + titleHeight + subtitleHeight\n          : _targetTileHeight;\n      titleY = compact ? minVerticalPadding : idealTitleY;\n    }\n\n    if (positionChild != null) {\n      positionChild(\n        title,\n        Offset(isLTR ? titleStart : adjustedTrailingWidth, titleY),\n      );\n\n      if (leading != null && leadingSize != null) {\n        positionChild(\n          leading,\n          Offset(\n            isLTR ? 0.0 : tileWidth - leadingSize.width,\n            titleAlignment._yOffsetFor(\n              leadingSize.height,\n              tileHeight,\n              this,\n              true,\n            ),\n          ),\n        );\n      }\n\n      if (trailing != null && trailingSize != null) {\n        positionChild(\n          trailing,\n          Offset(\n            isLTR ? tileWidth - trailingSize.width : 0.0,\n            titleAlignment._yOffsetFor(\n              trailingSize.height,\n              tileHeight,\n              this,\n              false,\n            ),\n          ),\n        );\n      }\n    }\n\n    return (\n      titleY: titleY,\n      textConstraints: textConstraints,\n      tileSize: Size(tileWidth, tileHeight),\n    );\n  }\n\n  @override\n  double? computeDryBaseline(\n    covariant BoxConstraints constraints,\n    TextBaseline baseline,\n  ) {\n    final _Sizes sizes = _computeSizes(\n      ChildLayoutHelper.getDryBaseline,\n      ChildLayoutHelper.dryLayoutChild,\n      constraints,\n    );\n    final BaselineOffset titleBaseline =\n        BaselineOffset(title.getDryBaseline(sizes.textConstraints, baseline)) +\n        sizes.titleY;\n    return titleBaseline.offset;\n  }\n\n  @override\n  Size computeDryLayout(BoxConstraints constraints) {\n    return constraints.constrain(\n      _computeSizes(\n        ChildLayoutHelper.getDryBaseline,\n        ChildLayoutHelper.dryLayoutChild,\n        constraints,\n      ).tileSize,\n    );\n  }\n\n  @override\n  void performLayout() {\n    final Size tileSize = _computeSizes(\n      ChildLayoutHelper.getBaseline,\n      ChildLayoutHelper.layoutChild,\n      constraints,\n      positionChild: _positionBox,\n    ).tileSize;\n\n    size = constraints.constrain(tileSize);\n    assert(size.width == constraints.constrainWidth(tileSize.width));\n    assert(size.height == constraints.constrainHeight(tileSize.height));\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    void doPaint(RenderBox? child) {\n      if (child != null) {\n        final BoxParentData parentData = child.parentData! as BoxParentData;\n        context.paintChild(child, parentData.offset + offset);\n      }\n    }\n\n    doPaint(leading);\n    doPaint(title);\n    doPaint(subtitle);\n    doPaint(trailing);\n  }\n\n  @override\n  bool hitTestSelf(Offset position) => true;\n\n  @override\n  bool hitTestChildren(BoxHitTestResult result, {required Offset position}) {\n    for (final RenderBox child in children) {\n      final BoxParentData parentData = child.parentData! as BoxParentData;\n      final bool isHit = result.addWithPaintOffset(\n        offset: parentData.offset,\n        position: position,\n        hitTest: (BoxHitTestResult result, Offset transformed) {\n          assert(transformed == position - parentData.offset);\n          return child.hitTest(result, position: transformed);\n        },\n      );\n      if (isHit) {\n        return true;\n      }\n    }\n    return false;\n  }\n}\n\nclass _LisTileDefaultsM2 extends ListTileThemeData {\n  _LisTileDefaultsM2(this.context, ListTileStyle style)\n    : super(\n        contentPadding: const EdgeInsets.symmetric(horizontal: 16.0),\n        minLeadingWidth: 40,\n        minVerticalPadding: 4,\n        shape: const Border(),\n        style: style,\n      );\n\n  final BuildContext context;\n  late final ThemeData _theme = Theme.of(context);\n  late final TextTheme _textTheme = _theme.textTheme;\n\n  @override\n  Color? get tileColor => Colors.transparent;\n\n  @override\n  TextStyle? get titleTextStyle => switch (style!) {\n    ListTileStyle.drawer => _textTheme.bodyLarge,\n    ListTileStyle.list => _textTheme.titleMedium,\n  };\n\n  @override\n  TextStyle? get subtitleTextStyle =>\n      _textTheme.bodyMedium!.copyWith(color: _textTheme.bodySmall!.color);\n\n  @override\n  TextStyle? get leadingAndTrailingTextStyle => _textTheme.bodyMedium;\n\n  @override\n  Color? get selectedColor => _theme.colorScheme.primary;\n\n  @override\n  Color? get iconColor => switch (_theme.brightness) {\n    // For the sake of backwards compatibility, the default for unselected\n    // tiles is Colors.black45 rather than colorScheme.onSurface.withAlpha(0x73).\n    Brightness.light => Colors.black45,\n    // null -> use current icon theme color\n    Brightness.dark => null,\n  };\n}\n\n// BEGIN GENERATED TOKEN PROPERTIES - LisTile\n\n// Do not edit by hand. The code between the \"BEGIN GENERATED\" and\n// \"END GENERATED\" comments are generated from data in the Material\n// Design token database by the script:\n//   dev/tools/gen_defaults/bin/gen_defaults.dart.\n\n// dart format off\nclass _LisTileDefaultsM3 extends ListTileThemeData {\n  _LisTileDefaultsM3(this.context)\n    : super(\n        contentPadding: const EdgeInsetsDirectional.only(start: 16.0, end: 24.0),\n        minLeadingWidth: 24,\n        minVerticalPadding: 8,\n        shape: const RoundedRectangleBorder(),\n      );\n\n  final BuildContext context;\n  late final ThemeData _theme = Theme.of(context);\n  late final ColorScheme _colors = _theme.colorScheme;\n  late final TextTheme _textTheme = _theme.textTheme;\n\n  @override\n  Color? get tileColor =>  Colors.transparent;\n\n  @override\n  TextStyle? get titleTextStyle => _textTheme.bodyLarge!.copyWith(color: _colors.onSurface);\n\n  @override\n  TextStyle? get subtitleTextStyle => _textTheme.bodyMedium!.copyWith(color: _colors.onSurfaceVariant);\n\n  @override\n  TextStyle? get leadingAndTrailingTextStyle => _textTheme.labelSmall!.copyWith(color: _colors.onSurfaceVariant);\n\n  @override\n  Color? get selectedColor => _colors.primary;\n\n  @override\n  Color? get iconColor => _colors.onSurfaceVariant;\n}\n// dart format on\n\n// END GENERATED TOKEN PROPERTIES - LisTile\n"
  },
  {
    "path": "lib/common/widgets/flutter/page/page_view.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'package:PiliPlus/common/widgets/flutter/page/scrollable.dart';\nimport 'package:flutter/gestures.dart'\n    show DragStartBehavior, HorizontalDragGestureRecognizer;\nimport 'package:flutter/material.dart'\n    hide PageView, Scrollable, ScrollableState;\nimport 'package:flutter/rendering.dart';\n\nclass _ForceImplicitScrollPhysics extends ScrollPhysics {\n  const _ForceImplicitScrollPhysics({\n    required this.allowImplicitScrolling,\n    super.parent,\n  });\n\n  @override\n  _ForceImplicitScrollPhysics applyTo(ScrollPhysics? ancestor) {\n    return _ForceImplicitScrollPhysics(\n      allowImplicitScrolling: allowImplicitScrolling,\n      parent: buildParent(ancestor),\n    );\n  }\n\n  @override\n  final bool allowImplicitScrolling;\n}\n\nconst PageScrollPhysics _kPagePhysics = PageScrollPhysics();\n\n/// A scrollable list that works page by page.\n///\n/// Each child of a page view is forced to be the same size as the viewport.\n///\n/// You can use a [PageController] to control which page is visible in the view.\n/// In addition to being able to control the pixel offset of the content inside\n/// the [PageView], a [PageController] also lets you control the offset in terms\n/// of pages, which are increments of the viewport size.\n///\n/// The [PageController] can also be used to control the\n/// [PageController.initialPage], which determines which page is shown when the\n/// [PageView] is first constructed, and the [PageController.viewportFraction],\n/// which determines the size of the pages as a fraction of the viewport size.\n///\n/// {@youtube 560 315 https://www.youtube.com/watch?v=J1gE9xvph-A}\n///\n/// {@tool dartpad}\n/// Here is an example of [PageView]. It creates a centered [Text] in each of the three pages\n/// which scroll horizontally.\n///\n/// ** See code in examples/api/lib/widgets/page_view/page_view.0.dart **\n/// {@end-tool}\n///\n/// ## Persisting the scroll position during a session\n///\n/// Scroll views attempt to persist their scroll position using [PageStorage].\n/// For a [PageView], this can be disabled by setting [PageController.keepPage]\n/// to false on the [controller]. If it is enabled, using a [PageStorageKey] for\n/// the [key] of this widget is recommended to help disambiguate different\n/// scroll views from each other.\n///\n/// See also:\n///\n///  * [PageController], which controls which page is visible in the view.\n///  * [SingleChildScrollView], when you need to make a single child scrollable.\n///  * [ListView], for a scrollable list of boxes.\n///  * [GridView], for a scrollable grid of boxes.\n///  * [ScrollNotification] and [NotificationListener], which can be used to watch\n///    the scroll position without using a [ScrollController].\nclass PageView<T extends HorizontalDragGestureRecognizer>\n    extends StatefulWidget {\n  /// Creates a scrollable list that works page by page from an explicit [List]\n  /// of widgets.\n  ///\n  /// This constructor is appropriate for page views with a small number of\n  /// children because constructing the [List] requires doing work for every\n  /// child that could possibly be displayed in the page view, instead of just\n  /// those children that are actually visible.\n  ///\n  /// Like other widgets in the framework, this widget expects that\n  /// the [children] list will not be mutated after it has been passed in here.\n  /// See the documentation at [SliverChildListDelegate.children] for more details.\n  ///\n  /// {@template flutter.widgets.PageView.allowImplicitScrolling}\n  /// If [allowImplicitScrolling] is true, the [PageView] will participate in\n  /// accessibility scrolling more like a [ListView], where implicit scroll\n  /// actions will move to the next page rather than into the contents of the\n  /// [PageView].\n  /// {@endtemplate}\n  PageView({\n    super.key,\n    this.scrollDirection = Axis.horizontal,\n    this.reverse = false,\n    this.controller,\n    this.physics,\n    this.pageSnapping = true,\n    this.onPageChanged,\n    List<Widget> children = const <Widget>[],\n    this.dragStartBehavior = DragStartBehavior.start,\n    this.allowImplicitScrolling = false,\n    this.restorationId,\n    this.clipBehavior = Clip.hardEdge,\n    this.hitTestBehavior = HitTestBehavior.opaque,\n    this.scrollBehavior,\n    this.padEnds = true,\n    required this.horizontalDragGestureRecognizer,\n  }) : childrenDelegate = SliverChildListDelegate(children);\n\n  final GestureRecognizerFactoryConstructor<T> horizontalDragGestureRecognizer;\n\n  /// Creates a scrollable list that works page by page using widgets that are\n  /// created on demand.\n  ///\n  /// This constructor is appropriate for page views with a large (or infinite)\n  /// number of children because the builder is called only for those children\n  /// that are actually visible.\n  ///\n  /// Providing a non-null [itemCount] lets the [PageView] compute the maximum\n  /// scroll extent.\n  ///\n  /// [itemBuilder] will be called only with indices greater than or equal to\n  /// zero and less than [itemCount].\n  ///\n  /// {@macro flutter.widgets.ListView.builder.itemBuilder}\n  ///\n  /// {@template flutter.widgets.PageView.findChildIndexCallback}\n  /// The [findChildIndexCallback] corresponds to the\n  /// [SliverChildBuilderDelegate.findChildIndexCallback] property. If null,\n  /// a child widget may not map to its existing [RenderObject] when the order\n  /// of children returned from the children builder changes.\n  /// This may result in state-loss. This callback needs to be implemented if\n  /// the order of the children may change at a later time.\n  /// {@endtemplate}\n  ///\n  /// {@macro flutter.widgets.PageView.allowImplicitScrolling}\n  PageView.builder({\n    super.key,\n    this.scrollDirection = Axis.horizontal,\n    this.reverse = false,\n    this.controller,\n    this.physics,\n    this.pageSnapping = true,\n    this.onPageChanged,\n    required NullableIndexedWidgetBuilder itemBuilder,\n    ChildIndexGetter? findChildIndexCallback,\n    int? itemCount,\n    this.dragStartBehavior = DragStartBehavior.start,\n    this.allowImplicitScrolling = false,\n    this.restorationId,\n    this.clipBehavior = Clip.hardEdge,\n    this.hitTestBehavior = HitTestBehavior.opaque,\n    this.scrollBehavior,\n    this.padEnds = true,\n    required this.horizontalDragGestureRecognizer,\n  }) : childrenDelegate = SliverChildBuilderDelegate(\n         itemBuilder,\n         findChildIndexCallback: findChildIndexCallback,\n         childCount: itemCount,\n       );\n\n  /// Creates a scrollable list that works page by page with a custom child\n  /// model.\n  ///\n  /// {@tool dartpad}\n  /// This example shows a [PageView] that uses a custom [SliverChildBuilderDelegate] to support child\n  /// reordering.\n  ///\n  /// ** See code in examples/api/lib/widgets/page_view/page_view.1.dart **\n  /// {@end-tool}\n  ///\n  /// {@macro flutter.widgets.PageView.allowImplicitScrolling}\n  const PageView.custom({\n    super.key,\n    this.scrollDirection = Axis.horizontal,\n    this.reverse = false,\n    this.controller,\n    this.physics,\n    this.pageSnapping = true,\n    this.onPageChanged,\n    required this.childrenDelegate,\n    this.dragStartBehavior = DragStartBehavior.start,\n    this.allowImplicitScrolling = false,\n    this.restorationId,\n    this.clipBehavior = Clip.hardEdge,\n    this.hitTestBehavior = HitTestBehavior.opaque,\n    this.scrollBehavior,\n    this.padEnds = true,\n    required this.horizontalDragGestureRecognizer,\n  });\n\n  /// Controls whether the widget's pages will respond to\n  /// [RenderObject.showOnScreen], which will allow for implicit accessibility\n  /// scrolling.\n  ///\n  /// With this flag set to false, when accessibility focus reaches the end of\n  /// the current page and the user attempts to move it to the next element, the\n  /// focus will traverse to the next widget outside of the page view.\n  ///\n  /// With this flag set to true, when accessibility focus reaches the end of\n  /// the current page and user attempts to move it to the next element, focus\n  /// will traverse to the next page in the page view.\n  final bool allowImplicitScrolling;\n\n  /// {@macro flutter.widgets.scrollable.restorationId}\n  final String? restorationId;\n\n  /// The [Axis] along which the scroll view's offset increases with each page.\n  ///\n  /// For the direction in which active scrolling may be occurring, see\n  /// [ScrollDirection].\n  ///\n  /// Defaults to [Axis.horizontal].\n  final Axis scrollDirection;\n\n  /// Whether the page view scrolls in the reading direction.\n  ///\n  /// For example, if the reading direction is left-to-right and\n  /// [scrollDirection] is [Axis.horizontal], then the page view scrolls from\n  /// left to right when [reverse] is false and from right to left when\n  /// [reverse] is true.\n  ///\n  /// Similarly, if [scrollDirection] is [Axis.vertical], then the page view\n  /// scrolls from top to bottom when [reverse] is false and from bottom to top\n  /// when [reverse] is true.\n  ///\n  /// Defaults to false.\n  final bool reverse;\n\n  /// An object that can be used to control the position to which this page\n  /// view is scrolled.\n  final PageController? controller;\n\n  /// How the page view should respond to user input.\n  ///\n  /// For example, determines how the page view continues to animate after the\n  /// user stops dragging the page view.\n  ///\n  /// The physics are modified to snap to page boundaries using\n  /// [PageScrollPhysics] prior to being used.\n  ///\n  /// If an explicit [ScrollBehavior] is provided to [scrollBehavior], the\n  /// [ScrollPhysics] provided by that behavior will take precedence after\n  /// [physics].\n  ///\n  /// Defaults to matching platform conventions.\n  final ScrollPhysics? physics;\n\n  /// Set to false to disable page snapping, useful for custom scroll behavior.\n  ///\n  /// If the [padEnds] is false and [PageController.viewportFraction] < 1.0,\n  /// the page will snap to the beginning of the viewport; otherwise, the page\n  /// will snap to the center of the viewport.\n  final bool pageSnapping;\n\n  /// Called whenever the page in the center of the viewport changes.\n  final ValueChanged<int>? onPageChanged;\n\n  /// A delegate that provides the children for the [PageView].\n  ///\n  /// The [PageView.custom] constructor lets you specify this delegate\n  /// explicitly. The [PageView] and [PageView.builder] constructors create a\n  /// [childrenDelegate] that wraps the given [List] and [IndexedWidgetBuilder],\n  /// respectively.\n  final SliverChildDelegate childrenDelegate;\n\n  /// {@macro flutter.widgets.scrollable.dragStartBehavior}\n  final DragStartBehavior dragStartBehavior;\n\n  /// {@macro flutter.material.Material.clipBehavior}\n  ///\n  /// Defaults to [Clip.hardEdge].\n  final Clip clipBehavior;\n\n  /// {@macro flutter.widgets.scrollable.hitTestBehavior}\n  ///\n  /// Defaults to [HitTestBehavior.opaque].\n  final HitTestBehavior hitTestBehavior;\n\n  /// {@macro flutter.widgets.scrollable.scrollBehavior}\n  ///\n  /// The [ScrollBehavior] of the inherited [ScrollConfiguration] will be\n  /// modified by default to not apply a [Scrollbar].\n  final ScrollBehavior? scrollBehavior;\n\n  /// Whether to add padding to both ends of the list.\n  ///\n  /// If this is set to true and [PageController.viewportFraction] < 1.0, padding will be added\n  /// such that the first and last child slivers will be in the center of\n  /// the viewport when scrolled all the way to the start or end, respectively.\n  ///\n  /// If [PageController.viewportFraction] >= 1.0, this property has no effect.\n  ///\n  /// This property defaults to true.\n  final bool padEnds;\n\n  @override\n  State<PageView<T>> createState() => _PageViewState<T>();\n}\n\nclass _PageViewState<T extends HorizontalDragGestureRecognizer>\n    extends State<PageView<T>> {\n  int _lastReportedPage = 0;\n\n  late PageController _controller;\n\n  @override\n  void initState() {\n    super.initState();\n    _initController();\n    _lastReportedPage = _controller.initialPage;\n  }\n\n  @override\n  void dispose() {\n    if (widget.controller == null) {\n      _controller.dispose();\n    }\n    super.dispose();\n  }\n\n  void _initController() {\n    _controller = widget.controller ?? PageController();\n  }\n\n  @override\n  void didUpdateWidget(PageView<T> oldWidget) {\n    if (oldWidget.controller != widget.controller) {\n      if (oldWidget.controller == null) {\n        _controller.dispose();\n      }\n      _initController();\n    }\n    super.didUpdateWidget(oldWidget);\n  }\n\n  AxisDirection _getDirection(BuildContext context) {\n    switch (widget.scrollDirection) {\n      case Axis.horizontal:\n        assert(debugCheckHasDirectionality(context));\n        final TextDirection textDirection = Directionality.of(context);\n        final AxisDirection axisDirection = textDirectionToAxisDirection(\n          textDirection,\n        );\n        return widget.reverse\n            ? flipAxisDirection(axisDirection)\n            : axisDirection;\n      case Axis.vertical:\n        return widget.reverse ? AxisDirection.up : AxisDirection.down;\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final AxisDirection axisDirection = _getDirection(context);\n    final ScrollPhysics physics =\n        _ForceImplicitScrollPhysics(\n          allowImplicitScrolling: widget.allowImplicitScrolling,\n        ).applyTo(\n          widget.pageSnapping\n              ? _kPagePhysics.applyTo(\n                  widget.physics ??\n                      widget.scrollBehavior?.getScrollPhysics(context),\n                )\n              : widget.physics ??\n                    widget.scrollBehavior?.getScrollPhysics(context),\n        );\n\n    return NotificationListener<ScrollNotification>(\n      onNotification: (ScrollNotification notification) {\n        if (notification.depth == 0 &&\n            widget.onPageChanged != null &&\n            notification is ScrollUpdateNotification) {\n          final metrics = notification.metrics as PageMetrics;\n          final int currentPage = metrics.page!.round();\n          if (currentPage != _lastReportedPage) {\n            _lastReportedPage = currentPage;\n            widget.onPageChanged!(currentPage);\n          }\n        }\n        return false;\n      },\n      child: Scrollable<T>(\n        dragStartBehavior: widget.dragStartBehavior,\n        axisDirection: axisDirection,\n        controller: _controller,\n        physics: physics,\n        restorationId: widget.restorationId,\n        hitTestBehavior: widget.hitTestBehavior,\n        scrollBehavior:\n            widget.scrollBehavior ??\n            ScrollConfiguration.of(context).copyWith(scrollbars: false),\n        viewportBuilder: (BuildContext context, ViewportOffset position) {\n          return Viewport(\n            // TODO(dnfield): we should provide a way to set cacheExtent\n            // independent of implicit scrolling:\n            // https://github.com/flutter/flutter/issues/45632\n            cacheExtent: widget.allowImplicitScrolling ? 1.0 : 0.0,\n            cacheExtentStyle: CacheExtentStyle.viewport,\n            axisDirection: axisDirection,\n            offset: position,\n            clipBehavior: widget.clipBehavior,\n            slivers: <Widget>[\n              SliverFillViewport(\n                viewportFraction: _controller.viewportFraction,\n                delegate: widget.childrenDelegate,\n                padEnds: widget.padEnds,\n              ),\n            ],\n          );\n        },\n        horizontalDragGestureRecognizer: widget.horizontalDragGestureRecognizer,\n      ),\n    );\n  }\n\n  @override\n  void debugFillProperties(DiagnosticPropertiesBuilder description) {\n    super.debugFillProperties(description);\n    description\n      ..add(EnumProperty<Axis>('scrollDirection', widget.scrollDirection))\n      ..add(FlagProperty('reverse', value: widget.reverse, ifTrue: 'reversed'))\n      ..add(\n        DiagnosticsProperty<PageController>(\n          'controller',\n          _controller,\n          showName: false,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<ScrollPhysics>(\n          'physics',\n          widget.physics,\n          showName: false,\n        ),\n      )\n      ..add(\n        FlagProperty(\n          'pageSnapping',\n          value: widget.pageSnapping,\n          ifFalse: 'snapping disabled',\n        ),\n      )\n      ..add(\n        FlagProperty(\n          'allowImplicitScrolling',\n          value: widget.allowImplicitScrolling,\n          ifTrue: 'allow implicit scrolling',\n        ),\n      );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/page/scrollable.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'dart:async';\nimport 'dart:math' as math;\n\nimport 'package:PiliPlus/common/widgets/flutter/page/scrollable_helpers.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart'\n    hide Scrollable, ScrollableState, EdgeDraggingAutoScroller;\nimport 'package:flutter/rendering.dart';\nimport 'package:flutter/scheduler.dart';\nimport 'package:flutter/services.dart';\n\n// The return type of _performEnsureVisible.\n//\n// The list of futures represents each pending ScrollPosition call to\n// ensureVisible. The returned ScrollableState's context is used to find the\n// next potential ancestor Scrollable.\ntypedef _EnsureVisibleResults = (List<Future<void>>, ScrollableState);\n\n/// A widget that manages scrolling in one dimension and informs the [Viewport]\n/// through which the content is viewed.\n///\n/// [Scrollable] implements the interaction model for a scrollable widget,\n/// including gesture recognition, but does not have an opinion about how the\n/// viewport, which actually displays the children, is constructed.\n///\n/// It's rare to construct a [Scrollable] directly. Instead, consider [ListView]\n/// or [GridView], which combine scrolling, viewporting, and a layout model. To\n/// combine layout models (or to use a custom layout mode), consider using\n/// [CustomScrollView].\n///\n/// The static [Scrollable.of] and [Scrollable.ensureVisible] functions are\n/// often used to interact with the [Scrollable] widget inside a [ListView] or\n/// a [GridView].\n///\n/// To further customize scrolling behavior with a [Scrollable]:\n///\n/// 1. You can provide a [viewportBuilder] to customize the child model. For\n///    example, [SingleChildScrollView] uses a viewport that displays a single\n///    box child whereas [CustomScrollView] uses a [Viewport] or a\n///    [ShrinkWrappingViewport], both of which display a list of slivers.\n///\n/// 2. You can provide a custom [ScrollController] that creates a custom\n///    [ScrollPosition] subclass. For example, [PageView] uses a\n///    [PageController], which creates a page-oriented scroll position subclass\n///    that keeps the same page visible when the [Scrollable] resizes.\n///\n/// ## Persisting the scroll position during a session\n///\n/// Scrollables attempt to persist their scroll position using [PageStorage].\n/// This can be disabled by setting [ScrollController.keepScrollOffset] to false\n/// on the [controller]. If it is enabled, using a [PageStorageKey] for the\n/// [key] of this widget (or one of its ancestors, e.g. a [ScrollView]) is\n/// recommended to help disambiguate different [Scrollable]s from each other.\n///\n/// See also:\n///\n///  * [ListView], which is a commonly used [ScrollView] that displays a\n///    scrolling, linear list of child widgets.\n///  * [PageView], which is a scrolling list of child widgets that are each the\n///    size of the viewport.\n///  * [GridView], which is a [ScrollView] that displays a scrolling, 2D array\n///    of child widgets.\n///  * [CustomScrollView], which is a [ScrollView] that creates custom scroll\n///    effects using slivers.\n///  * [SingleChildScrollView], which is a scrollable widget that has a single\n///    child.\n///  * [ScrollNotification] and [NotificationListener], which can be used to watch\n///    the scroll position without using a [ScrollController].\nclass Scrollable<T extends HorizontalDragGestureRecognizer>\n    extends StatefulWidget {\n  /// Creates a widget that scrolls.\n  const Scrollable({\n    super.key,\n    this.axisDirection = AxisDirection.down,\n    this.controller,\n    this.physics,\n    required this.viewportBuilder,\n    this.incrementCalculator,\n    this.excludeFromSemantics = false,\n    this.semanticChildCount,\n    this.dragStartBehavior = DragStartBehavior.start,\n    this.restorationId,\n    this.scrollBehavior,\n    this.clipBehavior = Clip.hardEdge,\n    this.hitTestBehavior = HitTestBehavior.opaque,\n    required this.horizontalDragGestureRecognizer,\n  }) : assert(semanticChildCount == null || semanticChildCount >= 0);\n\n  final GestureRecognizerFactoryConstructor<T> horizontalDragGestureRecognizer;\n\n  /// {@template flutter.widgets.Scrollable.axisDirection}\n  /// The direction in which this widget scrolls.\n  ///\n  /// For example, if the [Scrollable.axisDirection] is [AxisDirection.down],\n  /// increasing the scroll position will cause content below the bottom of the\n  /// viewport to become visible through the viewport. Similarly, if the\n  /// axisDirection is [AxisDirection.right], increasing the scroll position\n  /// will cause content beyond the right edge of the viewport to become visible\n  /// through the viewport.\n  ///\n  /// Defaults to [AxisDirection.down].\n  /// {@endtemplate}\n  final AxisDirection axisDirection;\n\n  /// {@template flutter.widgets.Scrollable.controller}\n  /// An object that can be used to control the position to which this widget is\n  /// scrolled.\n  ///\n  /// A [ScrollController] serves several purposes. It can be used to control\n  /// the initial scroll position (see [ScrollController.initialScrollOffset]).\n  /// It can be used to control whether the scroll view should automatically\n  /// save and restore its scroll position in the [PageStorage] (see\n  /// [ScrollController.keepScrollOffset]). It can be used to read the current\n  /// scroll position (see [ScrollController.offset]), or change it (see\n  /// [ScrollController.animateTo]).\n  ///\n  /// If null, a [ScrollController] will be created internally by [Scrollable]\n  /// in order to create and manage the [ScrollPosition].\n  ///\n  /// See also:\n  ///\n  ///  * [Scrollable.ensureVisible], which animates the scroll position to\n  ///    reveal a given [BuildContext].\n  /// {@endtemplate}\n  final ScrollController? controller;\n\n  /// {@template flutter.widgets.Scrollable.physics}\n  /// How the widgets should respond to user input.\n  ///\n  /// For example, determines how the widget continues to animate after the\n  /// user stops dragging the scroll view.\n  ///\n  /// Defaults to matching platform conventions via the physics provided from\n  /// the ambient [ScrollConfiguration].\n  ///\n  /// If an explicit [ScrollBehavior] is provided to\n  /// [Scrollable.scrollBehavior], the [ScrollPhysics] provided by that behavior\n  /// will take precedence after [Scrollable.physics].\n  ///\n  /// The physics can be changed dynamically, but new physics will only take\n  /// effect if the _class_ of the provided object changes. Merely constructing\n  /// a new instance with a different configuration is insufficient to cause the\n  /// physics to be reapplied. (This is because the final object used is\n  /// generated dynamically, which can be relatively expensive, and it would be\n  /// inefficient to speculatively create this object each frame to see if the\n  /// physics should be updated.)\n  ///\n  /// See also:\n  ///\n  ///  * [AlwaysScrollableScrollPhysics], which can be used to indicate that the\n  ///    scrollable should react to scroll requests (and possible overscroll)\n  ///    even if the scrollable's contents fit without scrolling being necessary.\n  /// {@endtemplate}\n  final ScrollPhysics? physics;\n\n  /// Builds the viewport through which the scrollable content is displayed.\n  ///\n  /// A typical viewport uses the given [ViewportOffset] to determine which part\n  /// of its content is actually visible through the viewport.\n  ///\n  /// See also:\n  ///\n  ///  * [Viewport], which is a viewport that displays a list of slivers.\n  ///  * [ShrinkWrappingViewport], which is a viewport that displays a list of\n  ///    slivers and sizes itself based on the size of the slivers.\n  final ViewportBuilder viewportBuilder;\n\n  /// {@template flutter.widgets.Scrollable.incrementCalculator}\n  /// An optional function that will be called to calculate the distance to\n  /// scroll when the scrollable is asked to scroll via the keyboard using a\n  /// [ScrollAction].\n  ///\n  /// If not supplied, the [Scrollable] will scroll a default amount when a\n  /// keyboard navigation key is pressed (e.g. pageUp/pageDown, control-upArrow,\n  /// etc.), or otherwise invoked by a [ScrollAction].\n  ///\n  /// If [incrementCalculator] is null, the default for\n  /// [ScrollIncrementType.page] is 80% of the size of the scroll window, and\n  /// for [ScrollIncrementType.line], 50 logical pixels.\n  /// {@endtemplate}\n  final ScrollIncrementCalculator? incrementCalculator;\n\n  /// {@template flutter.widgets.scrollable.excludeFromSemantics}\n  /// Whether the scroll actions introduced by this [Scrollable] are exposed\n  /// in the semantics tree.\n  ///\n  /// Text fields with an overflow are usually scrollable to make sure that the\n  /// user can get to the beginning/end of the entered text. However, these\n  /// scrolling actions are generally not exposed to the semantics layer.\n  /// {@endtemplate}\n  ///\n  /// See also:\n  ///\n  ///  * [GestureDetector.excludeFromSemantics], which is used to accomplish the\n  ///    exclusion.\n  final bool excludeFromSemantics;\n\n  /// {@template flutter.widgets.scrollable.hitTestBehavior}\n  /// Defines the behavior of gesture detector used in this [Scrollable].\n  ///\n  /// This defaults to [HitTestBehavior.opaque] which means it prevents targets\n  /// behind this [Scrollable] from receiving events.\n  /// {@endtemplate}\n  ///\n  /// See also:\n  ///\n  ///  * [HitTestBehavior], for an explanation on different behaviors.\n  final HitTestBehavior hitTestBehavior;\n\n  /// The number of children that will contribute semantic information.\n  ///\n  /// The value will be null if the number of children is unknown or unbounded.\n  ///\n  /// Some subtypes of [ScrollView] can infer this value automatically. For\n  /// example [ListView] will use the number of widgets in the child list,\n  /// while the [ListView.separated] constructor will use half that amount.\n  ///\n  /// For [CustomScrollView] and other types which do not receive a builder\n  /// or list of widgets, the child count must be explicitly provided.\n  ///\n  /// See also:\n  ///\n  ///  * [CustomScrollView], for an explanation of scroll semantics.\n  ///  * [SemanticsConfiguration.scrollChildCount], the corresponding semantics property.\n  final int? semanticChildCount;\n\n  // TODO(jslavitz): Set the DragStartBehavior default to be start across all widgets.\n  /// {@template flutter.widgets.scrollable.dragStartBehavior}\n  /// Determines the way that drag start behavior is handled.\n  ///\n  /// If set to [DragStartBehavior.start], scrolling drag behavior will\n  /// begin at the position where the drag gesture won the arena. If set to\n  /// [DragStartBehavior.down] it will begin at the position where a down\n  /// event is first detected.\n  ///\n  /// In general, setting this to [DragStartBehavior.start] will make drag\n  /// animation smoother and setting it to [DragStartBehavior.down] will make\n  /// drag behavior feel slightly more reactive.\n  ///\n  /// By default, the drag start behavior is [DragStartBehavior.start].\n  ///\n  /// See also:\n  ///\n  ///  * [DragGestureRecognizer.dragStartBehavior], which gives an example for\n  ///    the different behaviors.\n  ///\n  /// {@endtemplate}\n  final DragStartBehavior dragStartBehavior;\n\n  /// {@template flutter.widgets.scrollable.restorationId}\n  /// Restoration ID to save and restore the scroll offset of the scrollable.\n  ///\n  /// If a restoration id is provided, the scrollable will persist its current\n  /// scroll offset and restore it during state restoration.\n  ///\n  /// The scroll offset is persisted in a [RestorationBucket] claimed from\n  /// the surrounding [RestorationScope] using the provided restoration ID.\n  ///\n  /// See also:\n  ///\n  ///  * [RestorationManager], which explains how state restoration works in\n  ///    Flutter.\n  /// {@endtemplate}\n  final String? restorationId;\n\n  /// {@template flutter.widgets.scrollable.scrollBehavior}\n  /// A [ScrollBehavior] that will be applied to this widget individually.\n  ///\n  /// Defaults to null, wherein the inherited [ScrollBehavior] is copied and\n  /// modified to alter the viewport decoration, like [Scrollbar]s.\n  ///\n  /// [ScrollBehavior]s also provide [ScrollPhysics]. If an explicit\n  /// [ScrollPhysics] is provided in [physics], it will take precedence,\n  /// followed by [scrollBehavior], and then the inherited ancestor\n  /// [ScrollBehavior].\n  /// {@endtemplate}\n  final ScrollBehavior? scrollBehavior;\n\n  /// {@macro flutter.material.Material.clipBehavior}\n  ///\n  /// Defaults to [Clip.hardEdge].\n  ///\n  /// This is passed to decorators in [ScrollableDetails], and does not directly affect\n  /// clipping of the [Scrollable]. This reflects the same [Clip] that is provided\n  /// to [ScrollView.clipBehavior] and is supplied to the [Viewport].\n  final Clip clipBehavior;\n\n  /// The axis along which the scroll view scrolls.\n  ///\n  /// Determined by the [axisDirection].\n  Axis get axis => axisDirectionToAxis(axisDirection);\n\n  @override\n  ScrollableState<T> createState() => ScrollableState<T>();\n\n  @override\n  void debugFillProperties(DiagnosticPropertiesBuilder properties) {\n    super.debugFillProperties(properties);\n    properties\n      ..add(EnumProperty<AxisDirection>('axisDirection', axisDirection))\n      ..add(DiagnosticsProperty<ScrollPhysics>('physics', physics))\n      ..add(StringProperty('restorationId', restorationId));\n  }\n\n  /// The state from the closest instance of this class that encloses the given\n  /// context, or null if none is found.\n  ///\n  /// Typical usage is as follows:\n  ///\n  /// ```dart\n  /// ScrollableState? scrollable = Scrollable.maybeOf(context);\n  /// ```\n  ///\n  /// Calling this method will create a dependency on the [ScrollableState]\n  /// that is returned, if there is one. This is typically the closest\n  /// [Scrollable], but may be a more distant ancestor if [axis] is used to\n  /// target a specific [Scrollable].\n  ///\n  /// Using the optional [Axis] is useful when Scrollables are nested and the\n  /// target [Scrollable] is not the closest instance. When [axis] is provided,\n  /// the nearest enclosing [ScrollableState] in that [Axis] is returned, or\n  /// null if there is none.\n  ///\n  /// This finds the nearest _ancestor_ [Scrollable] of the `context`. This\n  /// means that if the `context` is that of a [Scrollable], it will _not_ find\n  /// _that_ [Scrollable].\n  ///\n  /// See also:\n  ///\n  /// * [Scrollable.of], which is similar to this method, but asserts\n  ///   if no [Scrollable] ancestor is found.\n  static ScrollableState? maybeOf(BuildContext context, {Axis? axis}) {\n    // This is the context that will need to establish the dependency.\n    final originalContext = context;\n    InheritedElement? element = context\n        .getElementForInheritedWidgetOfExactType<_ScrollableScope>();\n    while (element != null) {\n      final ScrollableState scrollable =\n          (element.widget as _ScrollableScope).scrollable;\n      if (axis == null ||\n          axisDirectionToAxis(scrollable.axisDirection) == axis) {\n        // Establish the dependency on the correct context.\n        originalContext.dependOnInheritedElement(element);\n        return scrollable;\n      }\n      context = scrollable.context;\n      element = context\n          .getElementForInheritedWidgetOfExactType<_ScrollableScope>();\n    }\n    return null;\n  }\n\n  /// The state from the closest instance of this class that encloses the given\n  /// context.\n  ///\n  /// Typical usage is as follows:\n  ///\n  /// ```dart\n  /// ScrollableState scrollable = Scrollable.of(context);\n  /// ```\n  ///\n  /// Calling this method will create a dependency on the [ScrollableState]\n  /// that is returned, if there is one. This is typically the closest\n  /// [Scrollable], but may be a more distant ancestor if [axis] is used to\n  /// target a specific [Scrollable].\n  ///\n  /// Using the optional [Axis] is useful when Scrollables are nested and the\n  /// target [Scrollable] is not the closest instance. When [axis] is provided,\n  /// the nearest enclosing [ScrollableState] in that [Axis] is returned.\n  ///\n  /// This finds the nearest _ancestor_ [Scrollable] of the `context`. This\n  /// means that if the `context` is that of a [Scrollable], it will _not_ find\n  /// _that_ [Scrollable].\n  ///\n  /// If no [Scrollable] ancestor is found, then this method will assert in\n  /// debug mode, and throw an exception in release mode.\n  ///\n  /// See also:\n  ///\n  /// * [Scrollable.maybeOf], which is similar to this method, but returns null\n  ///   if no [Scrollable] ancestor is found.\n  static ScrollableState of(BuildContext context, {Axis? axis}) {\n    final ScrollableState? scrollableState = maybeOf(context, axis: axis);\n    assert(() {\n      if (scrollableState == null) {\n        throw FlutterError.fromParts(<DiagnosticsNode>[\n          ErrorSummary(\n            'Scrollable.of() was called with a context that does not contain a '\n            'Scrollable widget.',\n          ),\n          ErrorDescription(\n            'No Scrollable widget ancestor could be found '\n            '${axis == null ? '' : 'for the provided Axis: $axis '}'\n            'starting from the context that was passed to Scrollable.of(). This '\n            'can happen because you are using a widget that looks for a Scrollable '\n            'ancestor, but no such ancestor exists.\\n'\n            'The context used was:\\n'\n            '  $context',\n          ),\n          if (axis != null)\n            ErrorHint(\n              'When specifying an axis, this method will only look for a Scrollable '\n              'that matches the given Axis.',\n            ),\n        ]);\n      }\n      return true;\n    }());\n    return scrollableState!;\n  }\n\n  /// Provides a heuristic to determine if expensive frame-bound tasks should be\n  /// deferred for the [context] at a specific point in time.\n  ///\n  /// Calling this method does _not_ create a dependency on any other widget.\n  /// This also means that the value returned is only good for the point in time\n  /// when it is called, and callers will not get updated if the value changes.\n  ///\n  /// The heuristic used is determined by the [physics] of this [Scrollable]\n  /// via [ScrollPhysics.recommendDeferredLoading]. That method is called with\n  /// the current [ScrollPosition.activity]'s [ScrollActivity.velocity].\n  ///\n  /// The optional [Axis] allows targeting of a specific [Scrollable] of that\n  /// axis, useful when Scrollables are nested. When [axis] is provided,\n  /// [ScrollPosition.recommendDeferredLoading] is called for the nearest\n  /// [Scrollable] in that [Axis].\n  ///\n  /// If there is no [Scrollable] in the widget tree above the [context], this\n  /// method returns false.\n  static bool recommendDeferredLoadingForContext(\n    BuildContext context, {\n    Axis? axis,\n  }) {\n    _ScrollableScope? widget = context\n        .getInheritedWidgetOfExactType<_ScrollableScope>();\n    while (widget != null) {\n      if (axis == null ||\n          axisDirectionToAxis(widget.scrollable.axisDirection) == axis) {\n        return widget.position.recommendDeferredLoading(context);\n      }\n      context = widget.scrollable.context;\n      widget = context.getInheritedWidgetOfExactType<_ScrollableScope>();\n    }\n    return false;\n  }\n\n  /// Scrolls all scrollables that enclose the given context so as to make the\n  /// given context visible.\n  ///\n  /// If a [Scrollable] enclosing the provided [BuildContext] is a\n  /// [TwoDimensionalScrollable], both vertical and horizontal axes will ensure\n  /// the target is made visible.\n  static Future<void> ensureVisible(\n    BuildContext context, {\n    double alignment = 0.0,\n    Duration duration = Duration.zero,\n    Curve curve = Curves.ease,\n    ScrollPositionAlignmentPolicy alignmentPolicy =\n        ScrollPositionAlignmentPolicy.explicit,\n  }) {\n    final futures = <Future<void>>[];\n\n    // The targetRenderObject is used to record the first target renderObject.\n    // If there are multiple scrollable widgets nested, the targetRenderObject\n    // is made to be as visible as possible to improve the user experience. If\n    // the targetRenderObject is already visible, then let the outer\n    // renderObject be as visible as possible.\n    //\n    // Also see https://github.com/flutter/flutter/issues/65100\n    RenderObject? targetRenderObject;\n    ScrollableState? scrollable = Scrollable.maybeOf(context);\n    while (scrollable != null) {\n      final List<Future<void>> newFutures;\n      (newFutures, scrollable) = scrollable._performEnsureVisible(\n        context.findRenderObject()!,\n        alignment: alignment,\n        duration: duration,\n        curve: curve,\n        alignmentPolicy: alignmentPolicy,\n        targetRenderObject: targetRenderObject,\n      );\n      futures.addAll(newFutures);\n\n      targetRenderObject ??= context.findRenderObject();\n      context = scrollable.context;\n      scrollable = Scrollable.maybeOf(context);\n    }\n\n    if (futures.isEmpty || duration == Duration.zero) {\n      return Future<void>.value();\n    }\n    if (futures.length == 1) {\n      return futures.single;\n    }\n    return Future.wait<void>(futures).then<void>((List<void> _) => null);\n  }\n}\n\n// Enable Scrollable.of() to work as if ScrollableState was an inherited widget.\n// ScrollableState.build() always rebuilds its _ScrollableScope.\nclass _ScrollableScope extends InheritedWidget {\n  const _ScrollableScope({\n    required this.scrollable,\n    required this.position,\n    required super.child,\n  });\n\n  final ScrollableState scrollable;\n  final ScrollPosition position;\n\n  @override\n  bool updateShouldNotify(_ScrollableScope old) {\n    return position != old.position;\n  }\n}\n\n/// State object for a [Scrollable] widget.\n///\n/// To manipulate a [Scrollable] widget's scroll position, use the object\n/// obtained from the [position] property.\n///\n/// To be informed of when a [Scrollable] widget is scrolling, use a\n/// [NotificationListener] to listen for [ScrollNotification] notifications.\n///\n/// This class is not intended to be subclassed. To specialize the behavior of a\n/// [Scrollable], provide it with a [ScrollPhysics].\nclass ScrollableState<T extends HorizontalDragGestureRecognizer>\n    extends State<Scrollable<T>>\n    with TickerProviderStateMixin, RestorationMixin\n    implements ScrollContext {\n  // GETTERS\n\n  /// The manager for this [Scrollable] widget's viewport position.\n  ///\n  /// To control what kind of [ScrollPosition] is created for a [Scrollable],\n  /// provide it with custom [ScrollController] that creates the appropriate\n  /// [ScrollPosition] in its [ScrollController.createScrollPosition] method.\n  ScrollPosition get position => _position!;\n  ScrollPosition? _position;\n\n  /// The resolved [ScrollPhysics] of the [ScrollableState].\n  ScrollPhysics? get resolvedPhysics => _physics;\n  ScrollPhysics? _physics;\n\n  /// An [Offset] that represents the absolute distance from the origin, or 0,\n  /// of the [ScrollPosition] expressed in the associated [Axis].\n  ///\n  /// Used by [EdgeDraggingAutoScroller] to progress the position forward when a\n  /// drag gesture reaches the edge of the [Viewport].\n  Offset get deltaToScrollOrigin => switch (axisDirection) {\n    AxisDirection.up => Offset(0, -position.pixels),\n    AxisDirection.down => Offset(0, position.pixels),\n    AxisDirection.left => Offset(-position.pixels, 0),\n    AxisDirection.right => Offset(position.pixels, 0),\n  };\n\n  ScrollController get _effectiveScrollController =>\n      widget.controller ?? _fallbackScrollController!;\n\n  @override\n  AxisDirection get axisDirection => widget.axisDirection;\n\n  @override\n  TickerProvider get vsync => this;\n\n  @override\n  double get devicePixelRatio => _devicePixelRatio;\n  late double _devicePixelRatio;\n\n  @override\n  BuildContext? get notificationContext => _gestureDetectorKey.currentContext;\n\n  @override\n  BuildContext get storageContext => context;\n\n  @override\n  String? get restorationId => widget.restorationId;\n  final _RestorableScrollOffset _persistedScrollOffset =\n      _RestorableScrollOffset();\n\n  late ScrollBehavior _configuration;\n  ScrollController? _fallbackScrollController;\n  DeviceGestureSettings? _mediaQueryGestureSettings;\n\n  // Only call this from places that will definitely trigger a rebuild.\n  void _updatePosition() {\n    _configuration = widget.scrollBehavior ?? ScrollConfiguration.of(context);\n    final ScrollPhysics? physicsFromWidget =\n        widget.physics ?? widget.scrollBehavior?.getScrollPhysics(context);\n    _physics = _configuration.getScrollPhysics(context);\n    _physics = physicsFromWidget?.applyTo(_physics) ?? _physics;\n\n    final ScrollPosition? oldPosition = _position;\n    if (oldPosition != null) {\n      _effectiveScrollController.detach(oldPosition);\n      // It's important that we not dispose the old position until after the\n      // viewport has had a chance to unregister its listeners from the old\n      // position. So, schedule a microtask to do it.\n      scheduleMicrotask(oldPosition.dispose);\n    }\n\n    _position = _effectiveScrollController.createScrollPosition(\n      _physics!,\n      this,\n      oldPosition,\n    );\n    assert(_position != null);\n    _effectiveScrollController.attach(position);\n  }\n\n  @protected\n  @override\n  void restoreState(RestorationBucket? oldBucket, bool initialRestore) {\n    registerForRestoration(_persistedScrollOffset, 'offset');\n    assert(_position != null);\n    if (_persistedScrollOffset.value != null) {\n      position.restoreOffset(\n        _persistedScrollOffset.value!,\n        initialRestore: initialRestore,\n      );\n    }\n  }\n\n  @protected\n  @override\n  void saveOffset(double offset) {\n    assert(debugIsSerializableForRestoration(offset));\n    _persistedScrollOffset.value = offset;\n    // [saveOffset] is called after a scrolling ends and it is usually not\n    // followed by a frame. Therefore, manually flush restoration data.\n    ServicesBinding.instance.restorationManager.flushData();\n  }\n\n  @protected\n  @override\n  void initState() {\n    if (widget.controller == null) {\n      _fallbackScrollController = ScrollController();\n    }\n    super.initState();\n  }\n\n  @protected\n  @override\n  void didChangeDependencies() {\n    _mediaQueryGestureSettings = MediaQuery.maybeGestureSettingsOf(context);\n    _devicePixelRatio =\n        MediaQuery.maybeDevicePixelRatioOf(context) ??\n        View.of(context).devicePixelRatio;\n    _updatePosition();\n    super.didChangeDependencies();\n  }\n\n  bool _shouldUpdatePosition(Scrollable oldWidget) {\n    if ((widget.scrollBehavior == null) != (oldWidget.scrollBehavior == null)) {\n      return true;\n    }\n    if (widget.scrollBehavior != null &&\n        oldWidget.scrollBehavior != null &&\n        widget.scrollBehavior!.shouldNotify(oldWidget.scrollBehavior!)) {\n      return true;\n    }\n    ScrollPhysics? newPhysics =\n        widget.physics ?? widget.scrollBehavior?.getScrollPhysics(context);\n    ScrollPhysics? oldPhysics =\n        oldWidget.physics ??\n        oldWidget.scrollBehavior?.getScrollPhysics(context);\n    do {\n      if (newPhysics?.runtimeType != oldPhysics?.runtimeType) {\n        return true;\n      }\n      newPhysics = newPhysics?.parent;\n      oldPhysics = oldPhysics?.parent;\n    } while (newPhysics != null || oldPhysics != null);\n\n    return widget.controller?.runtimeType != oldWidget.controller?.runtimeType;\n  }\n\n  @protected\n  @override\n  void didUpdateWidget(Scrollable<T> oldWidget) {\n    super.didUpdateWidget(oldWidget);\n\n    if (widget.controller != oldWidget.controller) {\n      if (oldWidget.controller == null) {\n        // The old controller was null, meaning the fallback cannot be null.\n        // Dispose of the fallback.\n        assert(_fallbackScrollController != null);\n        assert(widget.controller != null);\n        _fallbackScrollController!.detach(position);\n        _fallbackScrollController!.dispose();\n        _fallbackScrollController = null;\n      } else {\n        // The old controller was not null, detach.\n        oldWidget.controller?.detach(position);\n        if (widget.controller == null) {\n          // If the new controller is null, we need to set up the fallback\n          // ScrollController.\n          _fallbackScrollController = ScrollController();\n        }\n      }\n      // Attach the updated effective scroll controller.\n      _effectiveScrollController.attach(position);\n    }\n\n    if (_shouldUpdatePosition(oldWidget)) {\n      _updatePosition();\n    }\n  }\n\n  @protected\n  @override\n  void dispose() {\n    if (widget.controller != null) {\n      widget.controller!.detach(position);\n    } else {\n      _fallbackScrollController?.detach(position);\n      _fallbackScrollController?.dispose();\n    }\n\n    position.dispose();\n    _persistedScrollOffset.dispose();\n    super.dispose();\n  }\n\n  // SEMANTICS\n\n  final GlobalKey _scrollSemanticsKey = GlobalKey();\n\n  @override\n  @protected\n  void setSemanticsActions(Set<SemanticsAction> actions) {\n    if (_gestureDetectorKey.currentState != null) {\n      _gestureDetectorKey.currentState!.replaceSemanticsActions(actions);\n    }\n  }\n\n  // GESTURE RECOGNITION AND POINTER IGNORING\n\n  final GlobalKey<RawGestureDetectorState> _gestureDetectorKey =\n      GlobalKey<RawGestureDetectorState>();\n  final GlobalKey _ignorePointerKey = GlobalKey();\n\n  // This field is set during layout, and then reused until the next time it is set.\n  Map<Type, GestureRecognizerFactory> _gestureRecognizers =\n      const <Type, GestureRecognizerFactory>{};\n  bool _shouldIgnorePointer = false;\n\n  bool? _lastCanDrag;\n  Axis? _lastAxisDirection;\n\n  @override\n  @protected\n  void setCanDrag(bool value) {\n    if (value == _lastCanDrag &&\n        (!value || widget.axis == _lastAxisDirection)) {\n      return;\n    }\n    if (!value) {\n      _gestureRecognizers = const <Type, GestureRecognizerFactory>{};\n      // Cancel the active hold/drag (if any) because the gesture recognizers\n      // will soon be disposed by our RawGestureDetector, and we won't be\n      // receiving pointer up events to cancel the hold/drag.\n      _handleDragCancel();\n    } else {\n      switch (widget.axis) {\n        case Axis.vertical:\n          _gestureRecognizers = <Type, GestureRecognizerFactory>{\n            VerticalDragGestureRecognizer:\n                GestureRecognizerFactoryWithHandlers<\n                  VerticalDragGestureRecognizer\n                >(\n                  () => VerticalDragGestureRecognizer(\n                    supportedDevices: _configuration.dragDevices,\n                  ),\n                  (VerticalDragGestureRecognizer instance) {\n                    instance\n                      ..onDown = _handleDragDown\n                      ..onStart = _handleDragStart\n                      ..onUpdate = _handleDragUpdate\n                      ..onEnd = _handleDragEnd\n                      ..onCancel = _handleDragCancel\n                      ..minFlingDistance = _physics?.minFlingDistance\n                      ..minFlingVelocity = _physics?.minFlingVelocity\n                      ..maxFlingVelocity = _physics?.maxFlingVelocity\n                      ..velocityTrackerBuilder = _configuration\n                          .velocityTrackerBuilder(context)\n                      ..dragStartBehavior = widget.dragStartBehavior\n                      ..multitouchDragStrategy = _configuration\n                          .getMultitouchDragStrategy(context)\n                      ..gestureSettings = _mediaQueryGestureSettings\n                      ..supportedDevices = _configuration.dragDevices;\n                  },\n                ),\n          };\n        case Axis.horizontal:\n          _gestureRecognizers = <Type, GestureRecognizerFactory>{\n            T: GestureRecognizerFactoryWithHandlers<T>(\n              widget.horizontalDragGestureRecognizer,\n              (T instance) {\n                instance\n                  ..onDown = _handleDragDown\n                  ..onStart = _handleDragStart\n                  ..onUpdate = _handleDragUpdate\n                  ..onEnd = _handleDragEnd\n                  ..onCancel = _handleDragCancel\n                  ..minFlingDistance = _physics?.minFlingDistance\n                  ..minFlingVelocity = _physics?.minFlingVelocity\n                  ..maxFlingVelocity = _physics?.maxFlingVelocity\n                  ..velocityTrackerBuilder = _configuration\n                      .velocityTrackerBuilder(context)\n                  ..dragStartBehavior = widget.dragStartBehavior\n                  ..multitouchDragStrategy = _configuration\n                      .getMultitouchDragStrategy(context)\n                  ..gestureSettings = _mediaQueryGestureSettings\n                  ..supportedDevices = _configuration.dragDevices;\n              },\n            ),\n          };\n      }\n    }\n    _lastCanDrag = value;\n    _lastAxisDirection = widget.axis;\n    if (_gestureDetectorKey.currentState != null) {\n      _gestureDetectorKey.currentState!.replaceGestureRecognizers(\n        _gestureRecognizers,\n      );\n    }\n  }\n\n  @override\n  @protected\n  void setIgnorePointer(bool value) {\n    if (_shouldIgnorePointer == value) {\n      return;\n    }\n    _shouldIgnorePointer = value;\n    if (_ignorePointerKey.currentContext != null) {\n      final renderBox =\n          _ignorePointerKey.currentContext!.findRenderObject()!\n              as RenderIgnorePointer;\n      renderBox.ignoring = _shouldIgnorePointer;\n    }\n  }\n\n  // TOUCH HANDLERS\n\n  Drag? _drag;\n  ScrollHoldController? _hold;\n\n  void _handleDragDown(DragDownDetails details) {\n    assert(_drag == null);\n    assert(_hold == null);\n    _hold = position.hold(_disposeHold);\n  }\n\n  void _handleDragStart(DragStartDetails details) {\n    // It's possible for _hold to become null between _handleDragDown and\n    // _handleDragStart, for example if some user code calls jumpTo or otherwise\n    // triggers a new activity to begin.\n    assert(_drag == null);\n    _drag = position.drag(details, _disposeDrag);\n    assert(_drag != null);\n    // _hold might be non-null if the scroll position is currently animating.\n    if (_hold != null) {\n      _disposeHold();\n    }\n  }\n\n  void _handleDragUpdate(DragUpdateDetails details) {\n    // _drag might be null if the drag activity ended and called _disposeDrag.\n    assert(_hold == null || _drag == null);\n    _drag?.update(details);\n  }\n\n  void _handleDragEnd(DragEndDetails details) {\n    // _drag might be null if the drag activity ended and called _disposeDrag.\n    assert(_hold == null || _drag == null);\n    _drag?.end(details);\n    assert(_drag == null);\n  }\n\n  void _handleDragCancel() {\n    if (_gestureDetectorKey.currentContext == null) {\n      // The cancel was caused by the GestureDetector getting disposed, which\n      // means we will get disposed momentarily as well and shouldn't do\n      // any work.\n      return;\n    }\n    // _hold might be null if the drag started.\n    // _drag might be null if the drag activity ended and called _disposeDrag.\n    assert(_hold == null || _drag == null);\n    _hold?.cancel();\n    _drag?.cancel();\n    assert(_hold == null);\n    assert(_drag == null);\n  }\n\n  void _disposeHold() {\n    _hold = null;\n  }\n\n  void _disposeDrag() {\n    _drag = null;\n  }\n\n  // SCROLL WHEEL\n\n  // Returns the offset that should result from applying [event] to the current\n  // position, taking min/max scroll extent into account.\n  double _targetScrollOffsetForPointerScroll(double delta) {\n    return math.min(\n      math.max(position.pixels + delta, position.minScrollExtent),\n      position.maxScrollExtent,\n    );\n  }\n\n  // Returns the delta that should result from applying [event] with axis,\n  // direction, and any modifiers specified by the ScrollBehavior taken into\n  // account.\n  double _pointerSignalEventDelta(PointerScrollEvent event) {\n    final Set<LogicalKeyboardKey> pressed =\n        HardwareKeyboard.instance.logicalKeysPressed;\n    final bool flipAxes =\n        pressed.any(_configuration.pointerAxisModifiers.contains) &&\n        // Axes are only flipped for physical mouse wheel input.\n        // On some platforms, like web, trackpad input is handled through pointer\n        // signals, but should not be included in this axis modifying behavior.\n        // This is because on a trackpad, all directional axes are available to\n        // the user, while mouse scroll wheels typically are restricted to one\n        // axis.\n        event.kind == PointerDeviceKind.mouse;\n\n    final Axis axis = flipAxes ? flipAxis(widget.axis) : widget.axis;\n    final double delta = switch (axis) {\n      Axis.horizontal => event.scrollDelta.dx,\n      Axis.vertical => event.scrollDelta.dy,\n    };\n\n    return axisDirectionIsReversed(widget.axisDirection) ? -delta : delta;\n  }\n\n  void _receivedPointerSignal(PointerSignalEvent event) {\n    if (event is PointerScrollEvent && _position != null) {\n      if (_physics != null && !_physics!.shouldAcceptUserOffset(position)) {\n        // The handler won't use the `event`, so allow the platform to trigger\n        // any default native actions.\n        event.respond(allowPlatformDefault: true);\n        return;\n      }\n      final double delta = _pointerSignalEventDelta(event);\n      final double targetScrollOffset = _targetScrollOffsetForPointerScroll(\n        delta,\n      );\n      // Only express interest in the event if it would actually result in a scroll.\n      if (delta != 0.0 && targetScrollOffset != position.pixels) {\n        GestureBinding.instance.pointerSignalResolver.register(\n          event,\n          _handlePointerScroll,\n        );\n        return;\n      }\n      // The `event` won't result in a scroll, so allow the platform to trigger\n      // any default native actions.\n      event.respond(allowPlatformDefault: true);\n    } else if (event is PointerScrollInertiaCancelEvent) {\n      position.pointerScroll(0);\n      // Don't use the pointer signal resolver, all hit-tested scrollables should stop.\n    }\n  }\n\n  void _handlePointerScroll(PointerEvent event) {\n    assert(event is PointerScrollEvent);\n    final double delta = _pointerSignalEventDelta(event as PointerScrollEvent);\n    final double targetScrollOffset = _targetScrollOffsetForPointerScroll(\n      delta,\n    );\n    if (delta != 0.0 && targetScrollOffset != position.pixels) {\n      position.pointerScroll(delta);\n    }\n  }\n\n  bool _handleScrollMetricsNotification(\n    ScrollMetricsNotification notification,\n  ) {\n    if (notification.depth == 0) {\n      final RenderObject? scrollSemanticsRenderObject = _scrollSemanticsKey\n          .currentContext\n          ?.findRenderObject();\n      if (scrollSemanticsRenderObject != null) {\n        scrollSemanticsRenderObject.markNeedsSemanticsUpdate();\n      }\n    }\n    return false;\n  }\n\n  Widget _buildChrome(BuildContext context, Widget child) {\n    final details = ScrollableDetails(\n      direction: widget.axisDirection,\n      controller: _effectiveScrollController,\n      decorationClipBehavior: widget.clipBehavior,\n    );\n\n    return _configuration.buildScrollbar(\n      context,\n      _configuration.buildOverscrollIndicator(context, child, details),\n      details,\n    );\n  }\n\n  // DESCRIPTION\n\n  @protected\n  @override\n  Widget build(BuildContext context) {\n    assert(_position != null);\n    // _ScrollableScope must be placed above the BuildContext returned by notificationContext\n    // so that we can get this ScrollableState by doing the following:\n    //\n    // ScrollNotification notification;\n    // Scrollable.of(notification.context)\n    //\n    // Since notificationContext is pointing to _gestureDetectorKey.context, _ScrollableScope\n    // must be placed above the widget using it: RawGestureDetector\n    Widget result = _ScrollableScope(\n      scrollable: this,\n      position: position,\n      child: Listener(\n        onPointerSignal: _receivedPointerSignal,\n        child: RawGestureDetector(\n          key: _gestureDetectorKey,\n          gestures: _gestureRecognizers,\n          behavior: widget.hitTestBehavior,\n          excludeFromSemantics: widget.excludeFromSemantics,\n          child: Semantics(\n            explicitChildNodes: !widget.excludeFromSemantics,\n            child: IgnorePointer(\n              key: _ignorePointerKey,\n              ignoring: _shouldIgnorePointer,\n              child: widget.viewportBuilder(context, position),\n            ),\n          ),\n        ),\n      ),\n    );\n\n    if (!widget.excludeFromSemantics) {\n      result = NotificationListener<ScrollMetricsNotification>(\n        onNotification: _handleScrollMetricsNotification,\n        child: _ScrollSemantics(\n          key: _scrollSemanticsKey,\n          position: position,\n          allowImplicitScrolling: _physics!.allowImplicitScrolling,\n          axis: widget.axis,\n          semanticChildCount: widget.semanticChildCount,\n          child: result,\n        ),\n      );\n    }\n\n    result = _buildChrome(context, result);\n\n    // Selection is only enabled when there is a parent registrar.\n    final SelectionRegistrar? registrar = SelectionContainer.maybeOf(context);\n    if (registrar != null) {\n      result = _ScrollableSelectionHandler(\n        state: this,\n        position: position,\n        registrar: registrar,\n        child: result,\n      );\n    }\n\n    return result;\n  }\n\n  // Returns the Future from calling ensureVisible for the ScrollPosition, as\n  // as well as this ScrollableState instance so its context can be used to\n  // check for other ancestor Scrollables in executing ensureVisible.\n  _EnsureVisibleResults _performEnsureVisible(\n    RenderObject object, {\n    double alignment = 0.0,\n    Duration duration = Duration.zero,\n    Curve curve = Curves.ease,\n    ScrollPositionAlignmentPolicy alignmentPolicy =\n        ScrollPositionAlignmentPolicy.explicit,\n    RenderObject? targetRenderObject,\n  }) {\n    final Future<void> ensureVisibleFuture = position.ensureVisible(\n      object,\n      alignment: alignment,\n      duration: duration,\n      curve: curve,\n      alignmentPolicy: alignmentPolicy,\n      targetRenderObject: targetRenderObject,\n    );\n    return (<Future<void>>[ensureVisibleFuture], this);\n  }\n\n  @protected\n  @override\n  void debugFillProperties(DiagnosticPropertiesBuilder properties) {\n    super.debugFillProperties(properties);\n    properties\n      ..add(DiagnosticsProperty<ScrollPosition>('position', _position))\n      ..add(DiagnosticsProperty<ScrollPhysics>('effective physics', _physics));\n  }\n}\n\n/// A widget to handle selection for a scrollable.\n///\n/// This widget registers itself to the [registrar] and uses\n/// [SelectionContainer] to collect selectables from its subtree.\nclass _ScrollableSelectionHandler extends StatefulWidget {\n  const _ScrollableSelectionHandler({\n    required this.state,\n    required this.position,\n    required this.registrar,\n    required this.child,\n  });\n\n  final ScrollableState state;\n  final ScrollPosition position;\n  final Widget child;\n  final SelectionRegistrar registrar;\n\n  @override\n  _ScrollableSelectionHandlerState createState() =>\n      _ScrollableSelectionHandlerState();\n}\n\nclass _ScrollableSelectionHandlerState\n    extends State<_ScrollableSelectionHandler> {\n  late _ScrollableSelectionContainerDelegate _selectionDelegate;\n\n  @override\n  void initState() {\n    super.initState();\n    _selectionDelegate = _ScrollableSelectionContainerDelegate(\n      state: widget.state,\n      position: widget.position,\n    );\n  }\n\n  @override\n  void didUpdateWidget(_ScrollableSelectionHandler oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (oldWidget.position != widget.position) {\n      _selectionDelegate.position = widget.position;\n    }\n  }\n\n  @override\n  void dispose() {\n    _selectionDelegate.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return SelectionContainer(\n      registrar: widget.registrar,\n      delegate: _selectionDelegate,\n      child: widget.child,\n    );\n  }\n}\n\n/// This updater handles the case where the selectables change frequently, and\n/// it optimizes toward scrolling updates.\n///\n/// It keeps track of the drag start offset relative to scroll origin for every\n/// selectable. The records are used to determine whether the selection is up to\n/// date with the scroll position when it sends the drag update event to a\n/// selectable.\nclass _ScrollableSelectionContainerDelegate\n    extends MultiSelectableSelectionContainerDelegate {\n  _ScrollableSelectionContainerDelegate({\n    required this.state,\n    required ScrollPosition position,\n  }) : _position = position,\n       _autoScroller = EdgeDraggingAutoScroller(\n         state,\n         velocityScalar: _kDefaultSelectToScrollVelocityScalar,\n       ) {\n    _position.addListener(_scheduleLayoutChange);\n  }\n\n  // Pointer drag is a single point, it should not have a size.\n  static const double _kDefaultDragTargetSize = 0;\n\n  // An eye-balled value for a smooth scrolling speed.\n  static const double _kDefaultSelectToScrollVelocityScalar = 30;\n\n  final ScrollableState state;\n  final EdgeDraggingAutoScroller _autoScroller;\n  bool _scheduledLayoutChange = false;\n  Offset? _currentDragStartRelatedToOrigin;\n  Offset? _currentDragEndRelatedToOrigin;\n\n  // The scrollable only auto scrolls if the selection starts in the scrollable.\n  bool _selectionStartsInScrollable = false;\n\n  ScrollPosition get position => _position;\n  ScrollPosition _position;\n  set position(ScrollPosition other) {\n    if (other == _position) {\n      return;\n    }\n    _position.removeListener(_scheduleLayoutChange);\n    _position = other;\n    _position.addListener(_scheduleLayoutChange);\n  }\n\n  // The layout will only be updated a frame later than position changes.\n  // Schedule PostFrameCallback to capture the accurate layout.\n  void _scheduleLayoutChange() {\n    if (_scheduledLayoutChange) {\n      return;\n    }\n    _scheduledLayoutChange = true;\n    SchedulerBinding.instance.addPostFrameCallback((Duration timeStamp) {\n      if (!_scheduledLayoutChange) {\n        return;\n      }\n      _scheduledLayoutChange = false;\n      layoutDidChange();\n    }, debugLabel: 'ScrollableSelectionContainer.layoutDidChange');\n  }\n\n  /// Stores the scroll offset when a scrollable receives the last\n  /// [SelectionEdgeUpdateEvent].\n  ///\n  /// The stored scroll offset may be null if a scrollable never receives a\n  /// [SelectionEdgeUpdateEvent].\n  ///\n  /// When a new [SelectionEdgeUpdateEvent] is dispatched to a selectable, this\n  /// updater checks the current scroll offset against the one stored in these\n  /// records. If the scroll offset is different, it synthesizes an opposite\n  /// [SelectionEdgeUpdateEvent] and dispatches the event before dispatching the\n  /// new event.\n  ///\n  /// For example, if a selectable receives an end [SelectionEdgeUpdateEvent]\n  /// and its scroll offset in the records is different from the current value,\n  /// it synthesizes a start [SelectionEdgeUpdateEvent] and dispatches it before\n  /// dispatching the original end [SelectionEdgeUpdateEvent].\n  final Map<Selectable, double> _selectableStartEdgeUpdateRecords =\n      <Selectable, double>{};\n  final Map<Selectable, double> _selectableEndEdgeUpdateRecords =\n      <Selectable, double>{};\n\n  @override\n  void didChangeSelectables() {\n    final Set<Selectable> selectableSet = selectables.toSet();\n    _selectableStartEdgeUpdateRecords.removeWhere(\n      (Selectable key, double value) => !selectableSet.contains(key),\n    );\n    _selectableEndEdgeUpdateRecords.removeWhere(\n      (Selectable key, double value) => !selectableSet.contains(key),\n    );\n    super.didChangeSelectables();\n  }\n\n  @override\n  SelectionResult handleClearSelection(ClearSelectionEvent event) {\n    _selectableStartEdgeUpdateRecords.clear();\n    _selectableEndEdgeUpdateRecords.clear();\n    _currentDragStartRelatedToOrigin = null;\n    _currentDragEndRelatedToOrigin = null;\n    _selectionStartsInScrollable = false;\n    return super.handleClearSelection(event);\n  }\n\n  @override\n  SelectionResult handleSelectionEdgeUpdate(SelectionEdgeUpdateEvent event) {\n    if (_currentDragEndRelatedToOrigin == null &&\n        _currentDragStartRelatedToOrigin == null) {\n      assert(!_selectionStartsInScrollable);\n      _selectionStartsInScrollable = _globalPositionInScrollable(\n        event.globalPosition,\n      );\n    }\n    final Offset deltaToOrigin = _getDeltaToScrollOrigin(state);\n    if (event.type == SelectionEventType.endEdgeUpdate) {\n      _currentDragEndRelatedToOrigin = _inferPositionRelatedToOrigin(\n        event.globalPosition,\n      );\n      final Offset endOffset = _currentDragEndRelatedToOrigin!.translate(\n        -deltaToOrigin.dx,\n        -deltaToOrigin.dy,\n      );\n      event = SelectionEdgeUpdateEvent.forEnd(\n        globalPosition: endOffset,\n        granularity: event.granularity,\n      );\n    } else {\n      _currentDragStartRelatedToOrigin = _inferPositionRelatedToOrigin(\n        event.globalPosition,\n      );\n      final Offset startOffset = _currentDragStartRelatedToOrigin!.translate(\n        -deltaToOrigin.dx,\n        -deltaToOrigin.dy,\n      );\n      event = SelectionEdgeUpdateEvent.forStart(\n        globalPosition: startOffset,\n        granularity: event.granularity,\n      );\n    }\n    final SelectionResult result = super.handleSelectionEdgeUpdate(event);\n\n    // Result may be pending if one of the selectable child is also a scrollable.\n    // In that case, the parent scrollable needs to wait for the child to finish\n    // scrolling.\n    if (result == SelectionResult.pending) {\n      _autoScroller.stopAutoScroll();\n      return result;\n    }\n    if (_selectionStartsInScrollable) {\n      _autoScroller.startAutoScrollIfNecessary(_dragTargetFromEvent(event));\n      if (_autoScroller.scrolling) {\n        return SelectionResult.pending;\n      }\n    }\n    return result;\n  }\n\n  Offset _inferPositionRelatedToOrigin(Offset globalPosition) {\n    final box = state.context.findRenderObject()! as RenderBox;\n    final Offset localPosition = box.globalToLocal(globalPosition);\n    if (!_selectionStartsInScrollable) {\n      // If the selection starts outside of the scrollable, selecting across the\n      // scrollable boundary will act as selecting the entire content in the\n      // scrollable. This logic move the offset to the 0.0 or infinity to cover\n      // the entire content if the input position is outside of the scrollable.\n      if (localPosition.dy < 0 || localPosition.dx < 0) {\n        return box.localToGlobal(Offset.zero);\n      }\n      if (localPosition.dy > box.size.height ||\n          localPosition.dx > box.size.width) {\n        return Offset.infinite;\n      }\n    }\n    final Offset deltaToOrigin = _getDeltaToScrollOrigin(state);\n    return box.localToGlobal(\n      localPosition.translate(deltaToOrigin.dx, deltaToOrigin.dy),\n    );\n  }\n\n  /// Infers the [_currentDragStartRelatedToOrigin] and\n  /// [_currentDragEndRelatedToOrigin] from the geometry.\n  ///\n  /// This method is called after a select word and select all event where the\n  /// selection is triggered by none drag events. The\n  /// [_currentDragStartRelatedToOrigin] and [_currentDragEndRelatedToOrigin]\n  /// are essential to handle future [SelectionEdgeUpdateEvent]s.\n  void _updateDragLocationsFromGeometries({\n    bool forceUpdateStart = true,\n    bool forceUpdateEnd = true,\n  }) {\n    final Offset deltaToOrigin = _getDeltaToScrollOrigin(state);\n    final box = state.context.findRenderObject()! as RenderBox;\n    final Matrix4 transform = box.getTransformTo(null);\n    if (currentSelectionStartIndex != -1 &&\n        (_currentDragStartRelatedToOrigin == null || forceUpdateStart)) {\n      final SelectionGeometry geometry =\n          selectables[currentSelectionStartIndex].value;\n      assert(geometry.hasSelection);\n      final SelectionPoint start = geometry.startSelectionPoint!;\n      final Matrix4 childTransform = selectables[currentSelectionStartIndex]\n          .getTransformTo(box);\n      final Offset localDragStart = MatrixUtils.transformPoint(\n        childTransform,\n        start.localPosition + Offset(0, -start.lineHeight / 2),\n      );\n      _currentDragStartRelatedToOrigin = MatrixUtils.transformPoint(\n        transform,\n        localDragStart + deltaToOrigin,\n      );\n    }\n    if (currentSelectionEndIndex != -1 &&\n        (_currentDragEndRelatedToOrigin == null || forceUpdateEnd)) {\n      final SelectionGeometry geometry =\n          selectables[currentSelectionEndIndex].value;\n      assert(geometry.hasSelection);\n      final SelectionPoint end = geometry.endSelectionPoint!;\n      final Matrix4 childTransform = selectables[currentSelectionEndIndex]\n          .getTransformTo(box);\n      final Offset localDragEnd = MatrixUtils.transformPoint(\n        childTransform,\n        end.localPosition + Offset(0, -end.lineHeight / 2),\n      );\n      _currentDragEndRelatedToOrigin = MatrixUtils.transformPoint(\n        transform,\n        localDragEnd + deltaToOrigin,\n      );\n    }\n  }\n\n  @override\n  SelectionResult handleSelectAll(SelectAllSelectionEvent event) {\n    assert(!_selectionStartsInScrollable);\n    final SelectionResult result = super.handleSelectAll(event);\n    assert(\n      (currentSelectionStartIndex == -1) == (currentSelectionEndIndex == -1),\n    );\n    if (currentSelectionStartIndex != -1) {\n      _updateDragLocationsFromGeometries();\n    }\n    return result;\n  }\n\n  @override\n  SelectionResult handleSelectWord(SelectWordSelectionEvent event) {\n    _selectionStartsInScrollable = _globalPositionInScrollable(\n      event.globalPosition,\n    );\n    final SelectionResult result = super.handleSelectWord(event);\n    _updateDragLocationsFromGeometries();\n    return result;\n  }\n\n  @override\n  SelectionResult handleGranularlyExtendSelection(\n    GranularlyExtendSelectionEvent event,\n  ) {\n    final SelectionResult result = super.handleGranularlyExtendSelection(event);\n    // The selection geometry may not have the accurate offset for the edges\n    // that are outside of the viewport whose transform may not be valid. Only\n    // the edge this event is updating is sure to be accurate.\n    _updateDragLocationsFromGeometries(\n      forceUpdateStart: !event.isEnd,\n      forceUpdateEnd: event.isEnd,\n    );\n    if (_selectionStartsInScrollable) {\n      _jumpToEdge(event.isEnd);\n    }\n    return result;\n  }\n\n  @override\n  SelectionResult handleDirectionallyExtendSelection(\n    DirectionallyExtendSelectionEvent event,\n  ) {\n    final SelectionResult result = super.handleDirectionallyExtendSelection(\n      event,\n    );\n    // The selection geometry may not have the accurate offset for the edges\n    // that are outside of the viewport whose transform may not be valid. Only\n    // the edge this event is updating is sure to be accurate.\n    _updateDragLocationsFromGeometries(\n      forceUpdateStart: !event.isEnd,\n      forceUpdateEnd: event.isEnd,\n    );\n    if (_selectionStartsInScrollable) {\n      _jumpToEdge(event.isEnd);\n    }\n    return result;\n  }\n\n  void _jumpToEdge(bool isExtent) {\n    final Selectable selectable;\n    final double? lineHeight;\n    final SelectionPoint? edge;\n    if (isExtent) {\n      selectable = selectables[currentSelectionEndIndex];\n      edge = selectable.value.endSelectionPoint;\n      lineHeight = selectable.value.endSelectionPoint!.lineHeight;\n    } else {\n      selectable = selectables[currentSelectionStartIndex];\n      edge = selectable.value.startSelectionPoint;\n      lineHeight = selectable.value.startSelectionPoint?.lineHeight;\n    }\n    if (lineHeight == null || edge == null) {\n      return;\n    }\n    final scrollableBox = state.context.findRenderObject()! as RenderBox;\n    final Matrix4 transform = selectable.getTransformTo(scrollableBox);\n    final Offset edgeOffsetInScrollableCoordinates = MatrixUtils.transformPoint(\n      transform,\n      edge.localPosition,\n    );\n    final scrollableRect = Rect.fromLTRB(\n      0,\n      0,\n      scrollableBox.size.width,\n      scrollableBox.size.height,\n    );\n    switch (state.axisDirection) {\n      case AxisDirection.up:\n        final double edgeBottom = edgeOffsetInScrollableCoordinates.dy;\n        final double edgeTop =\n            edgeOffsetInScrollableCoordinates.dy - lineHeight;\n        if (edgeBottom >= scrollableRect.bottom &&\n            edgeTop <= scrollableRect.top) {\n          return;\n        }\n        if (edgeBottom > scrollableRect.bottom) {\n          position.jumpTo(position.pixels + scrollableRect.bottom - edgeBottom);\n          return;\n        }\n        if (edgeTop < scrollableRect.top) {\n          position.jumpTo(position.pixels + scrollableRect.top - edgeTop);\n        }\n        return;\n      case AxisDirection.right:\n        final double edge = edgeOffsetInScrollableCoordinates.dx;\n        if (edge >= scrollableRect.right && edge <= scrollableRect.left) {\n          return;\n        }\n        if (edge > scrollableRect.right) {\n          position.jumpTo(position.pixels + edge - scrollableRect.right);\n          return;\n        }\n        if (edge < scrollableRect.left) {\n          position.jumpTo(position.pixels + edge - scrollableRect.left);\n        }\n        return;\n      case AxisDirection.down:\n        final double edgeBottom = edgeOffsetInScrollableCoordinates.dy;\n        final double edgeTop =\n            edgeOffsetInScrollableCoordinates.dy - lineHeight;\n        if (edgeBottom >= scrollableRect.bottom &&\n            edgeTop <= scrollableRect.top) {\n          return;\n        }\n        if (edgeBottom > scrollableRect.bottom) {\n          position.jumpTo(position.pixels + edgeBottom - scrollableRect.bottom);\n          return;\n        }\n        if (edgeTop < scrollableRect.top) {\n          position.jumpTo(position.pixels + edgeTop - scrollableRect.top);\n        }\n        return;\n      case AxisDirection.left:\n        final double edge = edgeOffsetInScrollableCoordinates.dx;\n        if (edge >= scrollableRect.right && edge <= scrollableRect.left) {\n          return;\n        }\n        if (edge > scrollableRect.right) {\n          position.jumpTo(position.pixels + scrollableRect.right - edge);\n          return;\n        }\n        if (edge < scrollableRect.left) {\n          position.jumpTo(position.pixels + scrollableRect.left - edge);\n        }\n        return;\n    }\n  }\n\n  bool _globalPositionInScrollable(Offset globalPosition) {\n    final box = state.context.findRenderObject()! as RenderBox;\n    final Offset localPosition = box.globalToLocal(globalPosition);\n    final rect = Rect.fromLTRB(0, 0, box.size.width, box.size.height);\n    return rect.contains(localPosition);\n  }\n\n  Rect _dragTargetFromEvent(SelectionEdgeUpdateEvent event) {\n    return Rect.fromCenter(\n      center: event.globalPosition,\n      width: _kDefaultDragTargetSize,\n      height: _kDefaultDragTargetSize,\n    );\n  }\n\n  @override\n  SelectionResult dispatchSelectionEventToChild(\n    Selectable selectable,\n    SelectionEvent event,\n  ) {\n    switch (event.type) {\n      case SelectionEventType.startEdgeUpdate:\n        _selectableStartEdgeUpdateRecords[selectable] = state.position.pixels;\n        ensureChildUpdated(selectable);\n      case SelectionEventType.endEdgeUpdate:\n        _selectableEndEdgeUpdateRecords[selectable] = state.position.pixels;\n        ensureChildUpdated(selectable);\n      case SelectionEventType.granularlyExtendSelection:\n      case SelectionEventType.directionallyExtendSelection:\n        ensureChildUpdated(selectable);\n        _selectableStartEdgeUpdateRecords[selectable] = state.position.pixels;\n        _selectableEndEdgeUpdateRecords[selectable] = state.position.pixels;\n      case SelectionEventType.clear:\n        _selectableEndEdgeUpdateRecords.remove(selectable);\n        _selectableStartEdgeUpdateRecords.remove(selectable);\n      case SelectionEventType.selectAll:\n      case SelectionEventType.selectWord:\n      case SelectionEventType.selectParagraph:\n        _selectableEndEdgeUpdateRecords[selectable] = state.position.pixels;\n        _selectableStartEdgeUpdateRecords[selectable] = state.position.pixels;\n    }\n    return super.dispatchSelectionEventToChild(selectable, event);\n  }\n\n  @override\n  void ensureChildUpdated(Selectable selectable) {\n    final double newRecord = state.position.pixels;\n    final double? previousStartRecord =\n        _selectableStartEdgeUpdateRecords[selectable];\n    if (_currentDragStartRelatedToOrigin != null &&\n        (previousStartRecord == null ||\n            (newRecord - previousStartRecord).abs() >\n                precisionErrorTolerance)) {\n      // Make sure the selectable has up to date events.\n      final Offset deltaToOrigin = _getDeltaToScrollOrigin(state);\n      final Offset startOffset = _currentDragStartRelatedToOrigin!.translate(\n        -deltaToOrigin.dx,\n        -deltaToOrigin.dy,\n      );\n      selectable.dispatchSelectionEvent(\n        SelectionEdgeUpdateEvent.forStart(globalPosition: startOffset),\n      );\n      // Make sure we track that we have synthesized a start event for this selectable,\n      // so we don't synthesize events unnecessarily.\n      _selectableStartEdgeUpdateRecords[selectable] = state.position.pixels;\n    }\n    final double? previousEndRecord =\n        _selectableEndEdgeUpdateRecords[selectable];\n    if (_currentDragEndRelatedToOrigin != null &&\n        (previousEndRecord == null ||\n            (newRecord - previousEndRecord).abs() > precisionErrorTolerance)) {\n      // Make sure the selectable has up to date events.\n      final Offset deltaToOrigin = _getDeltaToScrollOrigin(state);\n      final Offset endOffset = _currentDragEndRelatedToOrigin!.translate(\n        -deltaToOrigin.dx,\n        -deltaToOrigin.dy,\n      );\n      selectable.dispatchSelectionEvent(\n        SelectionEdgeUpdateEvent.forEnd(globalPosition: endOffset),\n      );\n      // Make sure we track that we have synthesized an end event for this selectable,\n      // so we don't synthesize events unnecessarily.\n      _selectableEndEdgeUpdateRecords[selectable] = state.position.pixels;\n    }\n  }\n\n  @override\n  void dispose() {\n    _selectableStartEdgeUpdateRecords.clear();\n    _selectableEndEdgeUpdateRecords.clear();\n    _scheduledLayoutChange = false;\n    _autoScroller.stopAutoScroll();\n    super.dispose();\n  }\n}\n\nOffset _getDeltaToScrollOrigin(ScrollableState scrollableState) {\n  return switch (scrollableState.axisDirection) {\n    AxisDirection.up => Offset(0, -scrollableState.position.pixels),\n    AxisDirection.down => Offset(0, scrollableState.position.pixels),\n    AxisDirection.left => Offset(-scrollableState.position.pixels, 0),\n    AxisDirection.right => Offset(scrollableState.position.pixels, 0),\n  };\n}\n\n/// With [_ScrollSemantics] certain child [SemanticsNode]s can be\n/// excluded from the scrollable area for semantics purposes.\n///\n/// Nodes, that are to be excluded, have to be tagged with\n/// [RenderViewport.excludeFromScrolling] and the [RenderAbstractViewport] in\n/// use has to add the [RenderViewport.useTwoPaneSemantics] tag to its\n/// [SemanticsConfiguration] by overriding\n/// [RenderObject.describeSemanticsConfiguration].\n///\n/// If the tag [RenderViewport.useTwoPaneSemantics] is present on the viewport,\n/// two semantics nodes will be used to represent the [Scrollable]: The outer\n/// node will contain all children, that are excluded from scrolling. The inner\n/// node, which is annotated with the scrolling actions, will house the\n/// scrollable children.\nclass _ScrollSemantics extends SingleChildRenderObjectWidget {\n  const _ScrollSemantics({\n    super.key,\n    required this.position,\n    required this.allowImplicitScrolling,\n    required this.axis,\n    required this.semanticChildCount,\n    super.child,\n  }) : assert(semanticChildCount == null || semanticChildCount >= 0);\n\n  final ScrollPosition position;\n  final bool allowImplicitScrolling;\n  final int? semanticChildCount;\n  final Axis axis;\n\n  @override\n  _RenderScrollSemantics createRenderObject(BuildContext context) {\n    return _RenderScrollSemantics(\n      position: position,\n      allowImplicitScrolling: allowImplicitScrolling,\n      semanticChildCount: semanticChildCount,\n      axis: axis,\n    );\n  }\n\n  @override\n  void updateRenderObject(\n    BuildContext context,\n    _RenderScrollSemantics renderObject,\n  ) {\n    renderObject\n      ..allowImplicitScrolling = allowImplicitScrolling\n      ..axis = axis\n      ..position = position\n      ..semanticChildCount = semanticChildCount;\n  }\n}\n\nclass _RenderScrollSemantics extends RenderProxyBox {\n  _RenderScrollSemantics({\n    required ScrollPosition position,\n    required bool allowImplicitScrolling,\n    required this.axis,\n    required int? semanticChildCount,\n    RenderBox? child,\n  }) : _position = position,\n       _allowImplicitScrolling = allowImplicitScrolling,\n       _semanticChildCount = semanticChildCount,\n       super(child) {\n    position.addListener(markNeedsSemanticsUpdate);\n  }\n\n  /// Whether this render object is excluded from the semantic tree.\n  ScrollPosition get position => _position;\n  ScrollPosition _position;\n  set position(ScrollPosition value) {\n    if (value == _position) {\n      return;\n    }\n    _position.removeListener(markNeedsSemanticsUpdate);\n    _position = value;\n    _position.addListener(markNeedsSemanticsUpdate);\n    markNeedsSemanticsUpdate();\n  }\n\n  /// Whether this node can be scrolled implicitly.\n  bool get allowImplicitScrolling => _allowImplicitScrolling;\n  bool _allowImplicitScrolling;\n  set allowImplicitScrolling(bool value) {\n    if (value == _allowImplicitScrolling) {\n      return;\n    }\n    _allowImplicitScrolling = value;\n    markNeedsSemanticsUpdate();\n  }\n\n  Axis axis;\n\n  int? get semanticChildCount => _semanticChildCount;\n  int? _semanticChildCount;\n  set semanticChildCount(int? value) {\n    if (value == semanticChildCount) {\n      return;\n    }\n    _semanticChildCount = value;\n    markNeedsSemanticsUpdate();\n  }\n\n  void _onScrollToOffset(Offset targetOffset) {\n    final double offset = switch (axis) {\n      Axis.horizontal => targetOffset.dx,\n      Axis.vertical => targetOffset.dy,\n    };\n    _position.jumpTo(offset);\n  }\n\n  @override\n  void describeSemanticsConfiguration(SemanticsConfiguration config) {\n    super.describeSemanticsConfiguration(config);\n    config.isSemanticBoundary = true;\n    if (position.haveDimensions) {\n      config\n        ..hasImplicitScrolling = allowImplicitScrolling\n        ..scrollPosition = _position.pixels\n        ..scrollExtentMax = _position.maxScrollExtent\n        ..scrollExtentMin = _position.minScrollExtent\n        ..scrollChildCount = semanticChildCount;\n      if (position.maxScrollExtent > position.minScrollExtent &&\n          allowImplicitScrolling) {\n        config.onScrollToOffset = _onScrollToOffset;\n      }\n    }\n  }\n\n  SemanticsNode? _innerNode;\n\n  @override\n  void assembleSemanticsNode(\n    SemanticsNode node,\n    SemanticsConfiguration config,\n    Iterable<SemanticsNode> children,\n  ) {\n    if (children.isEmpty ||\n        !children.first.isTagged(RenderViewport.useTwoPaneSemantics)) {\n      _innerNode = null;\n      super.assembleSemanticsNode(node, config, children);\n      return;\n    }\n\n    (_innerNode ??= SemanticsNode(showOnScreen: showOnScreen)).rect = node.rect;\n\n    int? firstVisibleIndex;\n    final excluded = <SemanticsNode>[_innerNode!];\n    final included = <SemanticsNode>[];\n    for (final child in children) {\n      assert(child.isTagged(RenderViewport.useTwoPaneSemantics));\n      if (child.isTagged(RenderViewport.excludeFromScrolling)) {\n        excluded.add(child);\n      } else {\n        if (!child.flagsCollection.isHidden) {\n          firstVisibleIndex ??= child.indexInParent;\n        }\n        included.add(child);\n      }\n    }\n    config.scrollIndex = firstVisibleIndex;\n    node.updateWith(config: null, childrenInInversePaintOrder: excluded);\n    _innerNode!.updateWith(\n      config: config,\n      childrenInInversePaintOrder: included,\n    );\n  }\n\n  @override\n  void clearSemantics() {\n    super.clearSemantics();\n    _innerNode = null;\n  }\n}\n\n// Not using a RestorableDouble because we want to allow null values and override\n// [enabled].\nclass _RestorableScrollOffset extends RestorableValue<double?> {\n  @override\n  double? createDefaultValue() => null;\n\n  @override\n  void didUpdateValue(double? oldValue) {\n    notifyListeners();\n  }\n\n  @override\n  double fromPrimitives(Object? data) {\n    return data! as double;\n  }\n\n  @override\n  Object? toPrimitives() {\n    return value;\n  }\n\n  @override\n  bool get enabled => value != null;\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/page/scrollable_helpers.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n/// @docImport 'package:flutter/material.dart';\n///\n/// @docImport 'overscroll_indicator.dart';\n/// @docImport 'viewport.dart';\n\n// ignore_for_file: dangling_library_doc_comments\n\nimport 'dart:math' as math;\n\nimport 'package:PiliPlus/common/widgets/flutter/page/scrollable.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart'\n    hide EdgeDraggingAutoScroller, Scrollable, ScrollableState;\n\n/// An auto scroller that scrolls the [scrollable] if a drag gesture drags close\n/// to its edge.\n///\n/// The scroll velocity is controlled by the [velocityScalar]:\n///\n/// velocity = (distance of overscroll) * [velocityScalar].\nclass EdgeDraggingAutoScroller {\n  /// Creates a auto scroller that scrolls the [scrollable].\n  EdgeDraggingAutoScroller(\n    this.scrollable, {\n    this.onScrollViewScrolled,\n    required this.velocityScalar,\n  });\n\n  /// The [Scrollable] this auto scroller is scrolling.\n  final ScrollableState scrollable;\n\n  /// Called when a scroll view is scrolled.\n  ///\n  /// The scroll view may be scrolled multiple times in a row until the drag\n  /// target no longer triggers the auto scroll. This callback will be called\n  /// in between each scroll.\n  final VoidCallback? onScrollViewScrolled;\n\n  /// {@template flutter.widgets.EdgeDraggingAutoScroller.velocityScalar}\n  /// The velocity scalar per pixel over scroll.\n  ///\n  /// It represents how the velocity scale with the over scroll distance. The\n  /// auto-scroll velocity = (distance of overscroll) * velocityScalar.\n  /// {@endtemplate}\n  final double velocityScalar;\n\n  late Rect _dragTargetRelatedToScrollOrigin;\n\n  /// Whether the auto scroll is in progress.\n  bool get scrolling => _scrolling;\n  bool _scrolling = false;\n\n  double _offsetExtent(Offset offset, Axis scrollDirection) {\n    return switch (scrollDirection) {\n      Axis.horizontal => offset.dx,\n      Axis.vertical => offset.dy,\n    };\n  }\n\n  double _sizeExtent(Size size, Axis scrollDirection) {\n    return switch (scrollDirection) {\n      Axis.horizontal => size.width,\n      Axis.vertical => size.height,\n    };\n  }\n\n  AxisDirection get _axisDirection => scrollable.axisDirection;\n  Axis get _scrollDirection => axisDirectionToAxis(_axisDirection);\n\n  /// Starts the auto scroll if the [dragTarget] is close to the edge.\n  ///\n  /// The scroll starts to scroll the [scrollable] if the target rect is close\n  /// to the edge of the [scrollable]; otherwise, it remains stationary.\n  ///\n  /// If the scrollable is already scrolling, calling this method updates the\n  /// previous dragTarget to the new value and continues scrolling if necessary.\n  void startAutoScrollIfNecessary(Rect dragTarget) {\n    final Offset deltaToOrigin = scrollable.deltaToScrollOrigin;\n    _dragTargetRelatedToScrollOrigin = dragTarget.translate(\n      deltaToOrigin.dx,\n      deltaToOrigin.dy,\n    );\n    if (_scrolling) {\n      // The change will be picked up in the next scroll.\n      return;\n    }\n    assert(!_scrolling);\n    _scroll();\n  }\n\n  /// Stop any ongoing auto scrolling.\n  void stopAutoScroll() {\n    _scrolling = false;\n  }\n\n  Future<void> _scroll() async {\n    final scrollRenderBox = scrollable.context.findRenderObject()! as RenderBox;\n    final Matrix4 transform = scrollRenderBox.getTransformTo(null);\n    final Rect globalRect = MatrixUtils.transformRect(\n      transform,\n      Rect.fromLTRB(\n        0,\n        0,\n        scrollRenderBox.size.width,\n        scrollRenderBox.size.height,\n      ),\n    );\n    final Rect transformedDragTarget = MatrixUtils.transformRect(\n      transform,\n      _dragTargetRelatedToScrollOrigin,\n    );\n\n    assert(\n      (globalRect.size.width + precisionErrorTolerance) >=\n              transformedDragTarget.size.width &&\n          (globalRect.size.height + precisionErrorTolerance) >=\n              transformedDragTarget.size.height,\n      'Drag target size is larger than scrollable size, which may cause bouncing',\n    );\n    _scrolling = true;\n    double? newOffset;\n    const overDragMax = 20.0;\n\n    final Offset deltaToOrigin = scrollable.deltaToScrollOrigin;\n    final Offset viewportOrigin = globalRect.topLeft.translate(\n      deltaToOrigin.dx,\n      deltaToOrigin.dy,\n    );\n    final double viewportStart = _offsetExtent(\n      viewportOrigin,\n      _scrollDirection,\n    );\n    final double viewportEnd =\n        viewportStart + _sizeExtent(globalRect.size, _scrollDirection);\n\n    final double proxyStart = _offsetExtent(\n      _dragTargetRelatedToScrollOrigin.topLeft,\n      _scrollDirection,\n    );\n    final double proxyEnd = _offsetExtent(\n      _dragTargetRelatedToScrollOrigin.bottomRight,\n      _scrollDirection,\n    );\n    switch (_axisDirection) {\n      case AxisDirection.up:\n      case AxisDirection.left:\n        if (proxyEnd > viewportEnd &&\n            scrollable.position.pixels > scrollable.position.minScrollExtent) {\n          final double overDrag = math.min(proxyEnd - viewportEnd, overDragMax);\n          newOffset = math.max(\n            scrollable.position.minScrollExtent,\n            scrollable.position.pixels - overDrag,\n          );\n        } else if (proxyStart < viewportStart &&\n            scrollable.position.pixels < scrollable.position.maxScrollExtent) {\n          final double overDrag = math.min(\n            viewportStart - proxyStart,\n            overDragMax,\n          );\n          newOffset = math.min(\n            scrollable.position.maxScrollExtent,\n            scrollable.position.pixels + overDrag,\n          );\n        }\n      case AxisDirection.right:\n      case AxisDirection.down:\n        if (proxyStart < viewportStart &&\n            scrollable.position.pixels > scrollable.position.minScrollExtent) {\n          final double overDrag = math.min(\n            viewportStart - proxyStart,\n            overDragMax,\n          );\n          newOffset = math.max(\n            scrollable.position.minScrollExtent,\n            scrollable.position.pixels - overDrag,\n          );\n        } else if (proxyEnd > viewportEnd &&\n            scrollable.position.pixels < scrollable.position.maxScrollExtent) {\n          final double overDrag = math.min(proxyEnd - viewportEnd, overDragMax);\n          newOffset = math.min(\n            scrollable.position.maxScrollExtent,\n            scrollable.position.pixels + overDrag,\n          );\n        }\n    }\n\n    if (newOffset == null ||\n        (newOffset - scrollable.position.pixels).abs() < 1.0) {\n      // Drag should not trigger scroll.\n      _scrolling = false;\n      return;\n    }\n    final duration = Duration(milliseconds: (1000 / velocityScalar).round());\n    await scrollable.position.animateTo(\n      newOffset,\n      duration: duration,\n      curve: Curves.linear,\n    );\n    onScrollViewScrolled?.call();\n    if (_scrolling) {\n      await _scroll();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/page/tabs.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'package:PiliPlus/common/widgets/flutter/page/page_view.dart';\nimport 'package:flutter/foundation.dart' show clampDouble;\nimport 'package:flutter/gestures.dart'\n    show DragStartBehavior, HorizontalDragGestureRecognizer;\nimport 'package:flutter/material.dart' hide TabBarView, PageView;\n\n/// A page view that displays the widget which corresponds to the currently\n/// selected tab.\n///\n/// This widget is typically used in conjunction with a [TabBar].\n///\n/// {@youtube 560 315 https://www.youtube.com/watch?v=POtoEH-5l40}\n///\n/// If a [TabController] is not provided, then there must be a [DefaultTabController]\n/// ancestor.\n///\n/// The tab controller's [TabController.length] must equal the length of the\n/// [children] list and the length of the [TabBar.tabs] list.\n///\n/// To see a sample implementation, visit the [TabController] documentation.\nclass TabBarView<T extends HorizontalDragGestureRecognizer>\n    extends StatefulWidget {\n  /// Creates a page view with one child per tab.\n  ///\n  /// The length of [children] must be the same as the [controller]'s length.\n  const TabBarView({\n    super.key,\n    required this.children,\n    this.controller,\n    this.physics,\n    this.dragStartBehavior = DragStartBehavior.start,\n    this.viewportFraction = 1.0,\n    this.clipBehavior = Clip.hardEdge,\n    required this.horizontalDragGestureRecognizer,\n  });\n\n  final GestureRecognizerFactoryConstructor<T> horizontalDragGestureRecognizer;\n\n  /// This widget's selection and animation state.\n  ///\n  /// If [TabController] is not provided, then the value of [DefaultTabController.of]\n  /// will be used.\n  final TabController? controller;\n\n  /// One widget per tab.\n  ///\n  /// Its length must match the length of the [TabBar.tabs]\n  /// list, as well as the [controller]'s [TabController.length].\n  final List<Widget> children;\n\n  /// How the page view should respond to user input.\n  ///\n  /// For example, determines how the page view continues to animate after the\n  /// user stops dragging the page view.\n  ///\n  /// The physics are modified to snap to page boundaries using\n  /// [PageScrollPhysics] prior to being used.\n  ///\n  /// Defaults to matching platform conventions.\n  final ScrollPhysics? physics;\n\n  /// {@macro flutter.widgets.scrollable.dragStartBehavior}\n  final DragStartBehavior dragStartBehavior;\n\n  /// {@macro flutter.widgets.pageview.viewportFraction}\n  final double viewportFraction;\n\n  /// {@macro flutter.material.Material.clipBehavior}\n  ///\n  /// Defaults to [Clip.hardEdge].\n  final Clip clipBehavior;\n\n  @override\n  State<TabBarView<T>> createState() => _TabBarViewState<T>();\n}\n\nclass _TabBarViewState<T extends HorizontalDragGestureRecognizer>\n    extends State<TabBarView<T>> {\n  TabController? _controller;\n  PageController? _pageController;\n  late List<Widget> _childrenWithKey;\n  int? _currentIndex;\n  int _warpUnderwayCount = 0;\n  int _scrollUnderwayCount = 0;\n  bool _debugHasScheduledValidChildrenCountCheck = false;\n\n  // If the TabBarView is rebuilt with a new tab controller, the caller should\n  // dispose the old one. In that case the old controller's animation will be\n  // null and should not be accessed.\n  bool get _controllerIsValid => _controller?.animation != null;\n\n  void _updateTabController() {\n    final TabController? newController =\n        widget.controller ?? DefaultTabController.maybeOf(context);\n    assert(() {\n      if (newController == null) {\n        throw FlutterError(\n          'No TabController for ${widget.runtimeType}.\\n'\n          'When creating a ${widget.runtimeType}, you must either provide an explicit '\n          'TabController using the \"controller\" property, or you must ensure that there '\n          'is a DefaultTabController above the ${widget.runtimeType}.\\n'\n          'In this case, there was neither an explicit controller nor a default controller.',\n        );\n      }\n      return true;\n    }());\n\n    if (newController == _controller) {\n      return;\n    }\n\n    if (_controllerIsValid) {\n      _controller!.animation!.removeListener(_handleTabControllerAnimationTick);\n    }\n    _controller = newController;\n    if (_controller != null) {\n      _controller!.animation!.addListener(_handleTabControllerAnimationTick);\n    }\n  }\n\n  void _jumpToPage(int page) {\n    _warpUnderwayCount += 1;\n    _pageController!.jumpToPage(page);\n    _warpUnderwayCount -= 1;\n  }\n\n  Future<void> _animateToPage(\n    int page, {\n    required Duration duration,\n    required Curve curve,\n  }) async {\n    _warpUnderwayCount += 1;\n    await _pageController!.animateToPage(\n      page,\n      duration: duration,\n      curve: curve,\n    );\n    _warpUnderwayCount -= 1;\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    _updateChildren();\n  }\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    _updateTabController();\n    _currentIndex = _controller!.index;\n    if (_pageController == null) {\n      _pageController = PageController(\n        initialPage: _currentIndex!,\n        viewportFraction: widget.viewportFraction,\n      );\n    } else {\n      _pageController!.jumpToPage(_currentIndex!);\n    }\n  }\n\n  @override\n  void didUpdateWidget(TabBarView<T> oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (widget.controller != oldWidget.controller) {\n      _updateTabController();\n      _currentIndex = _controller!.index;\n      _jumpToPage(_currentIndex!);\n    }\n    if (widget.viewportFraction != oldWidget.viewportFraction) {\n      _pageController?.dispose();\n      _pageController = PageController(\n        initialPage: _currentIndex!,\n        viewportFraction: widget.viewportFraction,\n      );\n    }\n    // While a warp is under way, we stop updating the tab page contents.\n    // This is tracked in https://github.com/flutter/flutter/issues/31269.\n    if (widget.children != oldWidget.children && _warpUnderwayCount == 0) {\n      _updateChildren();\n    }\n  }\n\n  @override\n  void dispose() {\n    if (_controllerIsValid) {\n      _controller!.animation!.removeListener(_handleTabControllerAnimationTick);\n    }\n    _controller = null;\n    _pageController?.dispose();\n    // We don't own the _controller Animation, so it's not disposed here.\n    super.dispose();\n  }\n\n  void _updateChildren() {\n    _childrenWithKey = KeyedSubtree.ensureUniqueKeysForList(\n      widget.children.map<Widget>((Widget child) {\n        return Semantics(role: .tabPanel, child: child);\n      }).toList(),\n    );\n  }\n\n  void _handleTabControllerAnimationTick() {\n    if (_scrollUnderwayCount > 0 || !_controller!.indexIsChanging) {\n      return;\n    } // This widget is driving the controller's animation.\n\n    if (_controller!.index != _currentIndex) {\n      _currentIndex = _controller!.index;\n      _warpToCurrentIndex();\n    }\n  }\n\n  void _warpToCurrentIndex() {\n    if (!mounted || _pageController!.page == _currentIndex!.toDouble()) {\n      return;\n    }\n\n    final adjacentDestination =\n        (_currentIndex! - _controller!.previousIndex).abs() == 1;\n    if (adjacentDestination) {\n      _warpToAdjacentTab(_controller!.animationDuration);\n    } else {\n      _warpToNonAdjacentTab(_controller!.animationDuration);\n    }\n  }\n\n  Future<void> _warpToAdjacentTab(Duration duration) async {\n    if (duration == Duration.zero) {\n      _jumpToPage(_currentIndex!);\n    } else {\n      await _animateToPage(\n        _currentIndex!,\n        duration: duration,\n        curve: Curves.ease,\n      );\n    }\n    if (mounted) {\n      setState(_updateChildren);\n    }\n    return Future<void>.value();\n  }\n\n  Future<void> _warpToNonAdjacentTab(Duration duration) async {\n    final int previousIndex = _controller!.previousIndex;\n    assert((_currentIndex! - previousIndex).abs() > 1);\n\n    // initialPage defines which page is shown when starting the animation.\n    // This page is adjacent to the destination page.\n    final int initialPage = _currentIndex! > previousIndex\n        ? _currentIndex! - 1\n        : _currentIndex! + 1;\n\n    setState(() {\n      // Needed for `RenderSliverMultiBoxAdaptor.move` and kept alive children.\n      // For motivation, see https://github.com/flutter/flutter/pull/29188 and\n      // https://github.com/flutter/flutter/issues/27010#issuecomment-486475152.\n      _childrenWithKey = List<Widget>.of(_childrenWithKey, growable: false);\n      final Widget temp = _childrenWithKey[initialPage];\n      _childrenWithKey[initialPage] = _childrenWithKey[previousIndex];\n      _childrenWithKey[previousIndex] = temp;\n    });\n\n    // Make a first jump to the adjacent page.\n    _jumpToPage(initialPage);\n\n    // Jump or animate to the destination page.\n    if (duration == Duration.zero) {\n      _jumpToPage(_currentIndex!);\n    } else {\n      await _animateToPage(\n        _currentIndex!,\n        duration: duration,\n        curve: Curves.ease,\n      );\n    }\n\n    if (mounted) {\n      setState(_updateChildren);\n    }\n  }\n\n  void _syncControllerOffset() {\n    _controller!.offset = clampDouble(\n      _pageController!.page! - _controller!.index,\n      -1.0,\n      1.0,\n    );\n  }\n\n  // Called when the PageView scrolls\n  bool _handleScrollNotification(ScrollNotification notification) {\n    if (_warpUnderwayCount > 0 || _scrollUnderwayCount > 0) {\n      return false;\n    }\n\n    if (notification.depth != 0) {\n      return false;\n    }\n\n    if (!_controllerIsValid) {\n      return false;\n    }\n\n    _scrollUnderwayCount += 1;\n    final double page = _pageController!.page!;\n    if (notification is ScrollUpdateNotification &&\n        !_controller!.indexIsChanging) {\n      final bool pageChanged = (page - _controller!.index).abs() > 1.0;\n      if (pageChanged) {\n        _controller!.index = page.round();\n        _currentIndex = _controller!.index;\n      }\n      _syncControllerOffset();\n    } else if (notification is ScrollEndNotification) {\n      _controller!.index = page.round();\n      _currentIndex = _controller!.index;\n      if (!_controller!.indexIsChanging) {\n        _syncControllerOffset();\n      }\n    }\n    _scrollUnderwayCount -= 1;\n\n    return false;\n  }\n\n  bool _debugScheduleCheckHasValidChildrenCount() {\n    if (_debugHasScheduledValidChildrenCountCheck) {\n      return true;\n    }\n    WidgetsBinding.instance.addPostFrameCallback((Duration duration) {\n      _debugHasScheduledValidChildrenCountCheck = false;\n      if (!mounted) {\n        return;\n      }\n      assert(() {\n        if (_controller!.length != widget.children.length) {\n          throw FlutterError(\n            \"Controller's length property (${_controller!.length}) does not match the \"\n            \"number of children (${widget.children.length}) present in TabBarView's children property.\",\n          );\n        }\n        return true;\n      }());\n    }, debugLabel: 'TabBarView.validChildrenCountCheck');\n    _debugHasScheduledValidChildrenCountCheck = true;\n    return true;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    assert(_debugScheduleCheckHasValidChildrenCount());\n\n    return NotificationListener<ScrollNotification>(\n      onNotification: _handleScrollNotification,\n      child: PageView<T>(\n        dragStartBehavior: widget.dragStartBehavior,\n        clipBehavior: widget.clipBehavior,\n        controller: _pageController,\n        physics: widget.physics == null\n            ? const PageScrollPhysics().applyTo(const ClampingScrollPhysics())\n            : const PageScrollPhysics().applyTo(widget.physics),\n        horizontalDragGestureRecognizer: widget.horizontalDragGestureRecognizer,\n        children: _childrenWithKey,\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/pop_scope.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'package:flutter/material.dart' hide PopScope;\nimport 'package:get/get_core/src/get_main.dart';\nimport 'package:get/get_navigation/src/extension_navigation.dart';\n\nabstract class PopScopeState<T extends StatefulWidget> extends State<T>\n    implements PopEntry<Object> {\n  ModalRoute<dynamic>? _route;\n\n  @override\n  void onPopInvoked(bool didPop) {}\n\n  @override\n  late final ValueNotifier<bool> canPopNotifier;\n\n  bool get initCanPop => true;\n\n  @override\n  void initState() {\n    super.initState();\n    canPopNotifier = ValueNotifier<bool>(initCanPop);\n    _route = (Get.routing.route as ModalRoute)..registerPopEntry(this);\n  }\n\n  @override\n  void dispose() {\n    _route?.unregisterPopEntry(this);\n    _route = null;\n    canPopNotifier.dispose();\n    super.dispose();\n  }\n}\n\n// ignore: camel_case_types\ntypedef popScope = PopScope;\n\nclass PopScope extends StatefulWidget {\n  const PopScope({\n    super.key,\n    required this.child,\n    this.canPop = true,\n    required this.onPopInvokedWithResult,\n  });\n\n  final Widget child;\n\n  final PopInvokedWithResultCallback<Object> onPopInvokedWithResult;\n\n  final bool canPop;\n\n  @override\n  State<PopScope> createState() => _PopScopeState();\n}\n\nclass _PopScopeState<T extends PopScope> extends PopScopeState<T> {\n  @override\n  bool get initCanPop => widget.canPop;\n\n  @override\n  void onPopInvokedWithResult(bool didPop, Object? result) {\n    widget.onPopInvokedWithResult(didPop, result);\n  }\n\n  @override\n  void didUpdateWidget(T oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    canPopNotifier.value = widget.canPop;\n  }\n\n  @override\n  Widget build(BuildContext context) => widget.child;\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/popup_menu.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nlibrary;\n\nimport 'package:flutter/material.dart';\n\nclass CustomPopupMenuItem<T> extends PopupMenuEntry<T> {\n  const CustomPopupMenuItem({\n    super.key,\n    this.value,\n    this.height = kMinInteractiveDimension,\n    required this.child,\n  });\n\n  final T? value;\n\n  @override\n  final double height;\n\n  final Widget? child;\n\n  @override\n  bool represents(T? value) => value == this.value;\n\n  @override\n  CustomPopupMenuItemState<T, CustomPopupMenuItem<T>> createState() =>\n      CustomPopupMenuItemState<T, CustomPopupMenuItem<T>>();\n}\n\nclass CustomPopupMenuItemState<T, W extends CustomPopupMenuItem<T>>\n    extends State<W> {\n  @protected\n  @override\n  Widget build(BuildContext context) {\n    final PopupMenuThemeData popupMenuTheme = PopupMenuTheme.of(context);\n    const Set<WidgetState> states = <WidgetState>{};\n\n    final style =\n        popupMenuTheme.labelTextStyle?.resolve(states)! ??\n        _PopupMenuDefaultsM3(context).labelTextStyle!.resolve(states)!;\n\n    return ListTileTheme.merge(\n      contentPadding: .zero,\n      titleTextStyle: style,\n      child: AnimatedDefaultTextStyle(\n        style: style,\n        duration: kThemeChangeDuration,\n        child: ConstrainedBox(\n          constraints: BoxConstraints(minHeight: widget.height),\n          child: Padding(\n            padding: _PopupMenuDefaultsM3.menuItemPadding,\n            child: Align(\n              alignment: AlignmentDirectional.centerStart,\n              child: widget.child,\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n\nclass CustomPopupMenuDivider extends PopupMenuEntry<Never> {\n  const CustomPopupMenuDivider({\n    super.key,\n    required this.height,\n    this.thickness,\n    this.indent,\n    this.endIndent,\n    this.radius,\n  });\n\n  @override\n  final double height;\n\n  final double? thickness;\n\n  final double? indent;\n\n  final double? endIndent;\n\n  final BorderRadiusGeometry? radius;\n\n  @override\n  bool represents(void value) => false;\n\n  @override\n  State<CustomPopupMenuDivider> createState() => _CustomPopupMenuDividerState();\n}\n\nclass _CustomPopupMenuDividerState extends State<CustomPopupMenuDivider> {\n  @override\n  Widget build(BuildContext context) {\n    return Divider(\n      height: widget.height,\n      thickness: widget.thickness,\n      indent: widget.indent,\n      color: ColorScheme.of(context).outline.withValues(alpha: 0.2),\n      endIndent: widget.endIndent,\n      radius: widget.radius,\n    );\n  }\n}\n\n// BEGIN GENERATED TOKEN PROPERTIES - PopupMenu\n\n// Do not edit by hand. The code between the \"BEGIN GENERATED\" and\n// \"END GENERATED\" comments are generated from data in the Material\n// Design token database by the script:\n//   dev/tools/gen_defaults/bin/gen_defaults.dart.\n\n// dart format off\nclass _PopupMenuDefaultsM3 extends PopupMenuThemeData {\n  _PopupMenuDefaultsM3(this.context)\n      : super(elevation: 3.0);\n\n  final BuildContext context;\n  late final ThemeData _theme = Theme.of(context);\n  late final ColorScheme _colors = _theme.colorScheme;\n  late final TextTheme _textTheme = _theme.textTheme;\n\n  @override WidgetStateProperty<TextStyle?>? get labelTextStyle {\n    return WidgetStateProperty.resolveWith((Set<WidgetState> states) {\n      // TODO(quncheng): Update this hard-coded value to use the latest tokens.\n      final TextStyle style = _textTheme.labelLarge!;\n      if (states.contains(WidgetState.disabled)) {\n        return style.apply(color: _colors.onSurface.withValues(alpha: 0.38));\n      }\n      return style.apply(color: _colors.onSurface);\n    });\n  }\n\n  @override\n  Color? get color => _colors.surfaceContainer;\n\n  @override\n  Color? get shadowColor => _colors.shadow;\n\n  @override\n  Color? get surfaceTintColor => Colors.transparent;\n\n  @override\n  ShapeBorder? get shape => const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(4.0)));\n\n  // TODO(bleroux): This is taken from https://m3.material.io/components/menus/specs\n  // Update this when the token is available.\n  @override\n  EdgeInsets? get menuPadding => const EdgeInsets.symmetric(vertical: 8.0);\n\n  // TODO(tahatesser): This is taken from https://m3.material.io/components/menus/specs\n  // Update this when the token is available.\n  static EdgeInsets menuItemPadding  = const EdgeInsets.symmetric(horizontal: 12.0);\n}// dart format on\n\n// END GENERATED TOKEN PROPERTIES - PopupMenu\n"
  },
  {
    "path": "lib/common/widgets/flutter/refresh_indicator.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'dart:async' show Completer;\nimport 'dart:io' show Platform;\n\nimport 'package:PiliPlus/common/widgets/scroll_behavior.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart'\n    show RefreshScrollPhysics;\nimport 'package:flutter/foundation.dart' show clampDouble;\nimport 'package:flutter/material.dart' hide RefreshIndicator;\n\n/// The distance from the child's top or bottom [edgeOffset] where\n/// the refresh indicator will settle. During the drag that exposes the refresh\n/// indicator, its actual displacement may significantly exceed this value.\n///\n/// In most cases, [displacement] distance starts counting from the parent's\n/// edges. However, if [edgeOffset] is larger than zero then the [displacement]\n/// value is calculated from that offset instead of the parent's edge.\ndouble displacement = Pref.refreshDisplacement;\n\n// The over-scroll distance that moves the indicator to its maximum\n// displacement, as a percentage of the scrollable's container extent.\ndouble kDragContainerExtentPercentage = Pref.refreshDragPercentage;\n\n// How much the scroll's drag gesture can overshoot the RefreshIndicator's\n// displacement; max displacement = _kDragSizeFactorLimit * displacement.\nconst double _kDragSizeFactorLimit = 1.5;\n\n// When the scroll ends, the duration of the refresh indicator's animation\n// to the RefreshIndicator's displacement.\nconst Duration _kIndicatorSnapDuration = Duration(milliseconds: 150);\n\n// The duration of the ScaleTransition that starts when the refresh action\n// has completed.\nconst Duration _kIndicatorScaleDuration = Duration(milliseconds: 200);\n\n/// Indicates current status of Material `RefreshIndicator`.\nenum RefreshIndicatorStatus {\n  /// Pointer is down.\n  drag,\n\n  /// Dragged far enough that an up event will run the onRefresh callback.\n  // armed,\n\n  /// Animating to the indicator's final \"displacement\".\n  snap,\n\n  /// Running the refresh callback.\n  refresh,\n\n  /// Animating the indicator's fade-out after refreshing.\n  done,\n\n  /// Animating the indicator's fade-out after not arming.\n  canceled,\n}\n\n/// A widget that supports the Material \"swipe to refresh\" idiom.\n///\n/// {@youtube 560 315 https://www.youtube.com/watch?v=ORApMlzwMdM}\n///\n/// When the child's [Scrollable] descendant overscrolls, an animated circular\n/// progress indicator is faded into view. When the scroll ends, if the\n/// indicator has been dragged far enough for it to become completely opaque,\n/// the [onRefresh] callback is called. The callback is expected to update the\n/// scrollable's contents and then complete the [Future] it returns. The refresh\n/// indicator disappears after the callback's [Future] has completed.\n///\n/// The trigger mode is configured by [RefreshIndicator.triggerMode].\n///\n/// {@tool dartpad}\n/// This example shows how [RefreshIndicator] can be triggered in different ways.\n///\n/// ** See code in examples/api/lib/material/refresh_indicator/refresh_indicator.0.dart **\n/// {@end-tool}\n///\n/// {@tool dartpad}\n/// This example shows how to trigger [RefreshIndicator] in a nested scroll view using\n/// the [notificationPredicate] property.\n///\n/// ** See code in examples/api/lib/material/refresh_indicator/refresh_indicator.1.dart **\n/// {@end-tool}\n///\n/// {@tool dartpad}\n/// This example shows how to use [RefreshIndicator] without the spinner.\n///\n/// ** See code in examples/api/lib/material/refresh_indicator/refresh_indicator.2.dart **\n/// {@end-tool}\n///\n/// ## Troubleshooting\n///\n/// ### Refresh indicator does not show up\n///\n/// The [RefreshIndicator] will appear if its scrollable descendant can be\n/// overscrolled, i.e. if the scrollable's content is bigger than its viewport.\n/// To ensure that the [RefreshIndicator] will always appear, even if the\n/// scrollable's content fits within its viewport, set the scrollable's\n/// [Scrollable.physics] property to [AlwaysScrollableScrollPhysics]:\n///\n/// ```dart\n/// ListView(\n///   physics: const AlwaysScrollableScrollPhysics(),\n///   // ...\n/// )\n/// ```\n///\n/// A [RefreshIndicator] can only be used with a vertical scroll view.\n///\n/// See also:\n///\n///  * <https://material.io/design/platform-guidance/android-swipe-to-refresh.html>\n///  * [RefreshIndicatorState], can be used to programmatically show the refresh indicator.\n///  * [RefreshProgressIndicator], widget used by [RefreshIndicator] to show\n///    the inner circular progress spinner during refreshes.\n///  * [CupertinoSliverRefreshControl], an iOS equivalent of the pull-to-refresh pattern.\n///    Must be used as a sliver inside a [CustomScrollView] instead of wrapping\n///    around a [ScrollView] because it's a part of the scrollable instead of\n///    being overlaid on top of it.\nclass RefreshIndicator extends StatefulWidget {\n  /// Creates a refresh indicator.\n  ///\n  /// The [onRefresh], [child], and [notificationPredicate] arguments must be\n  /// non-null. The default\n  /// [displacement] is 40.0 logical pixels.\n  ///\n  /// The [semanticsLabel] is used to specify an accessibility label for this widget.\n  /// If it is null, it will be defaulted to [MaterialLocalizations.refreshIndicatorSemanticLabel].\n  /// An empty string may be passed to avoid having anything read by screen reading software.\n  /// The [semanticsValue] may be used to specify progress on the widget.\n  const RefreshIndicator({\n    super.key,\n    this.edgeOffset = 0.0,\n    required this.onRefresh,\n    this.color,\n    this.backgroundColor,\n    this.notificationPredicate = defaultScrollNotificationPredicate,\n    this.strokeWidth = RefreshProgressIndicator.defaultStrokeWidth,\n    this.elevation = 2.0,\n    this.isClampingScrollPhysics = false,\n    required this.child,\n  }) : assert(elevation >= 0.0);\n\n  /// The widget below this widget in the tree.\n  ///\n  /// The refresh indicator will be stacked on top of this child. The indicator\n  /// will appear when child's Scrollable descendant is over-scrolled.\n  ///\n  /// Typically a [ListView] or [CustomScrollView].\n  final Widget child;\n\n  /// The offset where [RefreshProgressIndicator] starts to appear on drag start.\n  ///\n  /// Depending whether the indicator is showing on the top or bottom, the value\n  /// of this variable controls how far from the parent's edge the progress\n  /// indicator starts to appear. This may come in handy when, for example, the\n  /// UI contains a top [Widget] which covers the parent's edge where the progress\n  /// indicator would otherwise appear.\n  ///\n  /// By default, the edge offset is set to 0.\n  ///\n  /// See also:\n  ///\n  ///  * [displacement], can be used to change the distance from the edge that\n  ///    the indicator settles.\n  final double edgeOffset;\n\n  /// A function that's called when the user has dragged the refresh indicator\n  /// far enough to demonstrate that they want the app to refresh. The returned\n  /// [Future] must complete when the refresh operation is finished.\n  final RefreshCallback onRefresh;\n\n  /// The progress indicator's foreground color. The current theme's\n  /// [ColorScheme.primary] by default.\n  final Color? color;\n\n  /// The progress indicator's background color. The current theme's\n  /// [ThemeData.canvasColor] by default.\n  final Color? backgroundColor;\n\n  /// A check that specifies whether a [ScrollNotification] should be\n  /// handled by this widget.\n  ///\n  /// By default, checks whether `notification.depth == 0`. Set it to something\n  /// else for more complicated layouts.\n  final ScrollNotificationPredicate notificationPredicate;\n\n  /// Defines [strokeWidth] for `RefreshIndicator`.\n  ///\n  /// By default, the value of [strokeWidth] is 2.0 pixels.\n  final double strokeWidth;\n\n  /// Defines the elevation of the underlying [RefreshIndicator].\n  ///\n  /// Defaults to 2.0.\n  final double elevation;\n\n  final bool isClampingScrollPhysics;\n\n  @override\n  RefreshIndicatorState createState() => RefreshIndicatorState();\n}\n\n/// Contains the state for a [RefreshIndicator]. This class can be used to\n/// programmatically show the refresh indicator, see the [show] method.\nclass RefreshIndicatorState extends State<RefreshIndicator>\n    with TickerProviderStateMixin<RefreshIndicator> {\n  late AnimationController _positionController;\n  late AnimationController _scaleController;\n  late Animation<double> _positionFactor;\n  late Animation<double> _scaleFactor;\n  late Animation<double> _value;\n  late Animation<Color?> _valueColor;\n\n  RefreshIndicatorStatus? _status;\n  late Future<void> _pendingRefreshFuture;\n  double? _dragOffset;\n  late Color _effectiveValueColor =\n      widget.color ?? Theme.of(context).colorScheme.primary;\n\n  static final Animatable<double> _threeQuarterTween = Tween<double>(\n    begin: 0.0,\n    end: 0.75,\n  );\n\n  static final Animatable<double> _kDragSizeFactorLimitTween = Tween<double>(\n    begin: 0.0,\n    end: _kDragSizeFactorLimit,\n  );\n\n  static final Animatable<double> _oneToZeroTween = Tween<double>(\n    begin: 1.0,\n    end: 0.0,\n  );\n\n  @protected\n  @override\n  void initState() {\n    super.initState();\n    _positionController = AnimationController(vsync: this);\n    _positionFactor = _positionController.drive(_kDragSizeFactorLimitTween);\n\n    // The \"value\" of the circular progress indicator during a drag.\n    _value = _positionController.drive(_threeQuarterTween);\n\n    _scaleController = AnimationController(vsync: this);\n    _scaleFactor = _scaleController.drive(_oneToZeroTween);\n  }\n\n  @protected\n  @override\n  void didChangeDependencies() {\n    _setupColorTween();\n    super.didChangeDependencies();\n  }\n\n  @protected\n  @override\n  void didUpdateWidget(covariant RefreshIndicator oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (oldWidget.color != widget.color) {\n      _setupColorTween();\n    }\n  }\n\n  @protected\n  @override\n  void dispose() {\n    _positionController.dispose();\n    _scaleController.dispose();\n    super.dispose();\n  }\n\n  void _setupColorTween() {\n    // Reset the current value color.\n    _effectiveValueColor =\n        widget.color ?? Theme.of(context).colorScheme.primary;\n    final Color color = _effectiveValueColor;\n    if (color.a == 0) {\n      // Set an always stopped animation instead of a driven tween.\n      _valueColor = AlwaysStoppedAnimation<Color>(color);\n    } else {\n      // Respect the alpha of the given color.\n      _valueColor = _positionController.drive(\n        ColorTween(\n          begin: color.withValues(alpha: 0),\n          end: color,\n        ).chain(\n          CurveTween(curve: const Interval(0.0, 1.0 / _kDragSizeFactorLimit)),\n        ),\n      );\n    }\n  }\n\n  bool _shouldStart(ScrollNotification notification) {\n    // If the notification.dragDetails is null, this scroll is not triggered by\n    // user dragging. It may be a result of ScrollController.jumpTo or ballistic scroll.\n    // In this case, we don't want to trigger the refresh indicator.\n    return _status == null &&\n        ((notification is ScrollStartNotification &&\n                notification.dragDetails != null) ||\n            (notification is ScrollUpdateNotification &&\n                notification.dragDetails != null)) &&\n        notification.metrics.extentBefore == 0.0 &&\n        _start();\n  }\n\n  bool _handleScrollNotification(ScrollNotification notification) {\n    if (!widget.notificationPredicate(notification)) {\n      return false;\n    }\n    if (_shouldStart(notification)) {\n      setState(() {\n        _status = RefreshIndicatorStatus.drag;\n      });\n      return false;\n    }\n    if (notification is ScrollUpdateNotification) {\n      if (_status == RefreshIndicatorStatus.drag) {\n        _dragOffset = _dragOffset! - notification.scrollDelta!;\n        _checkDragOffset(notification.metrics.viewportDimension);\n\n        if (notification.dragDetails == null &&\n            _valueColor.value!.a == _effectiveValueColor.a) {\n          // On iOS start the refresh when the Scrollable bounces back from the\n          // overscroll (ScrollNotification indicating this don't have dragDetails\n          // because the scroll activity is not directly triggered by a drag).\n          _show();\n        }\n      }\n    } else if (notification is OverscrollNotification) {\n      if (_status == RefreshIndicatorStatus.drag) {\n        _dragOffset = _dragOffset! - notification.overscroll;\n        _checkDragOffset(notification.metrics.viewportDimension);\n      }\n    } else if (notification is ScrollEndNotification) {\n      switch (_status) {\n        case RefreshIndicatorStatus.drag:\n          if (_valueColor.value!.a == _effectiveValueColor.a) {\n            _show();\n          } else {\n            _dismiss(RefreshIndicatorStatus.canceled);\n          }\n        case RefreshIndicatorStatus.canceled:\n        case RefreshIndicatorStatus.done:\n        case RefreshIndicatorStatus.refresh:\n        case RefreshIndicatorStatus.snap:\n        case null:\n          // do nothing\n          break;\n      }\n    }\n    return false;\n  }\n\n  bool _handleIndicatorNotification(\n    OverscrollIndicatorNotification notification,\n  ) {\n    if (notification.depth != 0 || !notification.leading) {\n      return false;\n    }\n    if (_status == RefreshIndicatorStatus.drag) {\n      notification.disallowIndicator();\n      return true;\n    }\n    return false;\n  }\n\n  bool _start() {\n    assert(_status == null);\n    assert(_dragOffset == null);\n    _dragOffset = 0.0;\n    _scaleController.value = 0.0;\n    _positionController.value = 0.0;\n    return true;\n  }\n\n  void _checkDragOffset(double containerExtent) {\n    assert(\n      _status == RefreshIndicatorStatus.drag,\n    );\n    double newValue =\n        _dragOffset! / (containerExtent * kDragContainerExtentPercentage);\n    _positionController.value = clampDouble(\n      newValue,\n      0.0,\n      1.0,\n    ); // This triggers various rebuilds.\n  }\n\n  // Stop showing the refresh indicator.\n  Future<void> _dismiss(RefreshIndicatorStatus newMode) async {\n    await Future<void>.value();\n    // This can only be called from _show() when refreshing and\n    // _handleScrollNotification in response to a ScrollEndNotification or\n    // direction change.\n    assert(\n      newMode == RefreshIndicatorStatus.canceled ||\n          newMode == RefreshIndicatorStatus.done,\n    );\n    setState(() {\n      _status = newMode;\n    });\n    switch (_status!) {\n      case RefreshIndicatorStatus.done:\n        await _scaleController.animateTo(\n          1.0,\n          duration: _kIndicatorScaleDuration,\n        );\n      case RefreshIndicatorStatus.canceled:\n        await _positionController.animateTo(\n          0.0,\n          duration: _kIndicatorScaleDuration,\n        );\n      case RefreshIndicatorStatus.drag:\n      case RefreshIndicatorStatus.refresh:\n      case RefreshIndicatorStatus.snap:\n        assert(false);\n    }\n    if (mounted && _status == newMode) {\n      _dragOffset = null;\n      setState(() {\n        _status = null;\n      });\n    }\n  }\n\n  void _show() {\n    assert(_status != RefreshIndicatorStatus.refresh);\n    assert(_status != RefreshIndicatorStatus.snap);\n    final Completer<void> completer = Completer<void>();\n    _pendingRefreshFuture = completer.future;\n    _status = RefreshIndicatorStatus.snap;\n    _positionController\n        .animateTo(\n          1.0 / _kDragSizeFactorLimit,\n          duration: _kIndicatorSnapDuration,\n        )\n        .whenComplete(() {\n          if (mounted && _status == RefreshIndicatorStatus.snap) {\n            setState(() {\n              // Show the indeterminate progress indicator.\n              _status = RefreshIndicatorStatus.refresh;\n            });\n\n            widget.onRefresh().whenComplete(() {\n              if (mounted && _status == RefreshIndicatorStatus.refresh) {\n                completer.complete();\n                _dismiss(RefreshIndicatorStatus.done);\n              }\n            });\n          }\n        });\n  }\n\n  /// Show the refresh indicator and run the refresh callback as if it had\n  /// been started interactively. If this method is called while the refresh\n  /// callback is running, it quietly does nothing.\n  ///\n  /// Creating the [RefreshIndicator] with a [GlobalKey<RefreshIndicatorState>]\n  /// makes it possible to refer to the [RefreshIndicatorState].\n  ///\n  /// The future returned from this method completes when the\n  /// [RefreshIndicator.onRefresh] callback's future completes.\n  ///\n  /// If you await the future returned by this function from a [State], you\n  /// should check that the state is still [mounted] before calling [setState].\n  ///\n  /// When initiated in this manner, the refresh indicator is independent of any\n  /// actual scroll view. It defaults to showing the indicator at the top. To\n  /// show it at the bottom, set `atTop` to false.\n  Future<void> show() {\n    if (_status != RefreshIndicatorStatus.refresh &&\n        _status != RefreshIndicatorStatus.snap) {\n      if (_status == null) {\n        _start();\n      }\n      _show();\n    }\n    return _pendingRefreshFuture;\n  }\n\n  @protected\n  @override\n  Widget build(BuildContext context) {\n    assert(debugCheckHasMaterialLocalizations(context));\n    Widget child = NotificationListener<ScrollNotification>(\n      onNotification: _handleScrollNotification,\n      child: NotificationListener<OverscrollIndicatorNotification>(\n        onNotification: _handleIndicatorNotification,\n        child: widget.child,\n      ),\n    );\n    assert(() {\n      if (_status == null) {\n        assert(_dragOffset == null);\n      } else {\n        assert(_dragOffset != null);\n      }\n      return true;\n    }());\n\n    final bool showIndeterminateIndicator =\n        _status == RefreshIndicatorStatus.refresh ||\n        _status == RefreshIndicatorStatus.done;\n\n    child = Stack(\n      clipBehavior: Clip.none,\n      children: <Widget>[\n        child,\n        if (_status != null)\n          Positioned(\n            top: widget.edgeOffset,\n            left: 0.0,\n            right: 0.0,\n            child: SizeTransition(\n              axisAlignment: 1.0,\n              sizeFactor: _positionFactor, // This is what brings it down.\n              child: Padding(\n                padding: EdgeInsets.only(top: displacement),\n                child: Align(\n                  alignment: Alignment.topCenter,\n                  child: ScaleTransition(\n                    scale: _scaleFactor,\n                    child: AnimatedBuilder(\n                      animation: _positionController,\n                      builder: (context, child) => RefreshProgressIndicator(\n                        value: showIndeterminateIndicator ? null : _value.value,\n                        valueColor: _valueColor,\n                        backgroundColor: widget.backgroundColor,\n                        strokeWidth: widget.strokeWidth,\n                        elevation: widget.elevation,\n                      ),\n                    ),\n                  ),\n                ),\n              ),\n            ),\n          ),\n      ],\n    );\n    if (!widget.isClampingScrollPhysics &&\n        (Platform.isIOS || Platform.isMacOS)) {\n      return child;\n    }\n    return ScrollConfiguration(\n      behavior: RefreshScrollBehavior(\n        desktopDragDevices,\n        scrollPhysics: RefreshScrollPhysics(\n          parent: const RangeMaintainingScrollPhysics(),\n          onDrag: _onDrag,\n        ),\n      ),\n      child: child,\n    );\n  }\n\n  bool _onDrag(double offset, double viewportDimension) {\n    if (_positionController.value > 0.0 &&\n        _status == RefreshIndicatorStatus.drag) {\n      _dragOffset = _dragOffset! + offset;\n      _checkDragOffset(viewportDimension);\n      return true;\n    }\n    return false;\n  }\n}\n\n// ignore: camel_case_types\ntypedef refreshIndicator = RefreshIndicator;\n\nclass RefreshScrollBehavior extends CustomScrollBehavior {\n  const RefreshScrollBehavior(\n    super.dragDevices, {\n    required this.scrollPhysics,\n  });\n\n  final RefreshScrollPhysics scrollPhysics;\n\n  @override\n  ScrollPhysics getScrollPhysics(BuildContext context) {\n    return scrollPhysics;\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/selectable_text/selectable_region.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'dart:async';\nimport 'dart:math';\n\nimport 'package:PiliPlus/common/widgets/flutter/selectable_text/tap_and_drag.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/gestures.dart'\n    hide\n        BaseTapAndDragGestureRecognizer,\n        TapAndHorizontalDragGestureRecognizer,\n        TapAndPanGestureRecognizer;\nimport 'package:flutter/material.dart' hide SelectableRegion;\nimport 'package:flutter/rendering.dart';\nimport 'package:flutter/scheduler.dart';\nimport 'package:flutter/services.dart';\nimport 'package:vector_math/vector_math_64.dart';\n\n// Examples can assume:\n// late GlobalKey key;\n\nconst Set<PointerDeviceKind> _kLongPressSelectionDevices = <PointerDeviceKind>{\n  PointerDeviceKind.touch,\n  PointerDeviceKind.stylus,\n  PointerDeviceKind.invertedStylus,\n};\n\n/// A widget that introduces an area for user selections.\n///\n/// Flutter widgets are not selectable by default. Wrapping a widget subtree\n/// with a [SelectableRegion] widget enables selection within that subtree (for\n/// example, [Text] widgets automatically look for selectable regions to enable\n/// selection). The wrapped subtree can be selected by users using mouse or\n/// touch gestures, e.g. users can select widgets by holding the mouse\n/// left-click and dragging across widgets, or they can use long press gestures\n/// to select words on touch devices.\n///\n/// A [SelectableRegion] widget requires configuration; in particular specific\n/// [selectionControls] must be provided.\n///\n/// The [SelectionArea] widget from the [material] library configures a\n/// [SelectableRegion] in a platform-specific manner (e.g. using a Material\n/// toolbar on Android, a Cupertino toolbar on iOS), and it may therefore be\n/// simpler to use that widget rather than using [SelectableRegion] directly.\n///\n/// ## An overview of the selection system.\n///\n/// Every [Selectable] under the [SelectableRegion] can be selected. They form a\n/// selection tree structure to handle the selection.\n///\n/// The [SelectableRegion] is a wrapper over [SelectionContainer]. It listens to\n/// user gestures and sends corresponding [SelectionEvent]s to the\n/// [SelectionContainer] it creates.\n///\n/// A [SelectionContainer] is a single [Selectable] that handles\n/// [SelectionEvent]s on behalf of child [Selectable]s in the subtree. It\n/// creates a [SelectionRegistrarScope] with its [SelectionContainer.delegate]\n/// to collect child [Selectable]s and sends the [SelectionEvent]s it receives\n/// from the parent [SelectionRegistrar] to the appropriate child [Selectable]s.\n/// It creates an abstraction for the parent [SelectionRegistrar] as if it is\n/// interacting with a single [Selectable].\n///\n/// The [SelectionContainer] created by [SelectableRegion] is the root node of a\n/// selection tree. Each non-leaf node in the tree is a [SelectionContainer],\n/// and the leaf node is a leaf widget whose render object implements\n/// [Selectable]. They are connected through [SelectionRegistrarScope]s created\n/// by [SelectionContainer]s.\n///\n/// Both [SelectionContainer]s and the leaf [Selectable]s need to register\n/// themselves to the [SelectionRegistrar] from the\n/// [SelectionContainer.maybeOf] if they want to participate in the\n/// selection.\n///\n/// An example selection tree will look like:\n///\n/// {@tool snippet}\n///\n/// ```dart\n/// MaterialApp(\n///   home: SelectableRegion(\n///     selectionControls: materialTextSelectionControls,\n///     child: Scaffold(\n///       appBar: AppBar(title: const Text('Flutter Code Sample')),\n///       body: ListView(\n///         children: const <Widget>[\n///           Text('Item 0', style: TextStyle(fontSize: 50.0)),\n///           Text('Item 1', style: TextStyle(fontSize: 50.0)),\n///         ],\n///       ),\n///     ),\n///   ),\n/// )\n/// ```\n/// {@end-tool}\n///\n///\n///               SelectionContainer\n///               (SelectableRegion)\n///                  /         \\\n///                 /           \\\n///                /             \\\n///           Selectable          \\\n///      (\"Flutter Code Sample\")   \\\n///                                 \\\n///                          SelectionContainer\n///                              (ListView)\n///                              /       \\\n///                             /         \\\n///                            /           \\\n///                     Selectable        Selectable\n///                     (\"Item 0\")         (\"Item 1\")\n///\n///\n/// ## Making a widget selectable\n///\n/// Some leaf widgets, such as [Text], have all of the selection logic wired up\n/// automatically and can be selected as long as they are under a\n/// [SelectableRegion].\n///\n/// To make a custom selectable widget, its render object needs to mix in\n/// [Selectable] and implement the required APIs to handle [SelectionEvent]s\n/// as well as paint appropriate selection highlights.\n///\n/// The render object also needs to register itself to a [SelectionRegistrar].\n/// For the most cases, one can use [SelectionRegistrant] to auto-register\n/// itself with the register returned from [SelectionContainer.maybeOf] as\n/// seen in the example below.\n///\n/// {@tool dartpad}\n/// This sample demonstrates how to create an adapter widget that makes any\n/// child widget selectable.\n///\n/// ** See code in examples/api/lib/material/selectable_region/selectable_region.0.dart **\n/// {@end-tool}\n///\n/// ## Complex layout\n///\n/// By default, the screen order is used as the selection order. If a group of\n/// [Selectable]s needs to select differently, consider wrapping them with a\n/// [SelectionContainer] to customize its selection behavior.\n///\n/// {@tool dartpad}\n/// This sample demonstrates how to create a [SelectionContainer] that only\n/// allows selecting everything or nothing with no partial selection.\n///\n/// ** See code in examples/api/lib/material/selection_container/selection_container.0.dart **\n/// {@end-tool}\n///\n/// In the case where a group of widgets should be excluded from selection under\n/// a [SelectableRegion], consider wrapping that group of widgets using\n/// [SelectionContainer.disabled].\n///\n/// {@tool dartpad}\n/// This sample demonstrates how to disable selection for a Text in a Column.\n///\n/// ** See code in examples/api/lib/material/selection_container/selection_container_disabled.0.dart **\n/// {@end-tool}\n///\n/// To create a separate selection system from its parent selection area,\n/// wrap part of the subtree with another [SelectableRegion]. The selection of the\n/// child selection area can not extend past its subtree, and the selection of\n/// the parent selection area can not extend inside the child selection area.\n///\n/// ## Selection status\n///\n/// A [SelectableRegion]s [SelectableRegionSelectionStatus] is used to indicate whether\n/// the [SelectableRegion] is actively changing the selection, or has finalized it. For\n/// example, during a mouse click + drag, the [SelectableRegionSelectionStatus] will be\n/// set to [SelectableRegionSelectionStatus.changing], and when the mouse click is released\n/// the status will be set to [SelectableRegionSelectionStatus.finalized].\n///\n/// The default value of [SelectableRegion]s selection status\n/// is [SelectableRegionSelectionStatus.finalized].\n///\n/// To access the [SelectableRegionSelectionStatus] of a parent [SelectableRegion]\n/// use [SelectableRegionSelectionStatusScope.maybeOf] and retrieve the value from\n/// the [ValueListenable].\n///\n/// One can also listen for changes to the [SelectableRegionSelectionStatus] by\n/// adding a listener to the [ValueListenable] retrieved from [SelectableRegionSelectionStatusScope.maybeOf]\n/// through [ValueListenable.addListener]. In Stateful widgets this is typically\n/// done in [State.didChangeDependencies]. Remove the listener when no longer\n/// needed, typically in your Stateful widgets [State.dispose] method through\n/// [ValueListenable.removeListener].\n///\n/// ## Tests\n///\n/// In a test, a region can be selected either by faking drag events (e.g. using\n/// [WidgetTester.dragFrom]) or by sending intents to a widget inside the region\n/// that has been given a [GlobalKey], e.g.:\n///\n/// ```dart\n/// Actions.invoke(key.currentContext!, const SelectAllTextIntent(SelectionChangedCause.keyboard));\n/// ```\n///\n/// See also:\n///\n///  * [SelectionArea], which creates a [SelectableRegion] with\n///    platform-adaptive selection controls.\n///  * [SelectableText], which enables selection on a single run of text.\n///  * [SelectionHandler], which contains APIs to handle selection events from the\n///    [SelectableRegion].\n///  * [Selectable], which provides API to participate in the selection system.\n///  * [SelectionRegistrar], which [Selectable] needs to subscribe to receive\n///    selection events.\n///  * [SelectionContainer], which collects selectable widgets in the subtree\n///    and provides api to dispatch selection event to the collected widget.\n///  * [SelectionListener], which enables accessing the [SelectionDetails] of\n///    the selectable subtree it wraps.\nclass SelectableRegion extends StatefulWidget {\n  /// Create a new [SelectableRegion] widget.\n  ///\n  /// The [selectionControls] are used for building the selection handles and\n  /// toolbar for mobile devices.\n  const SelectableRegion({\n    super.key,\n    this.contextMenuBuilder,\n    this.focusNode,\n    this.magnifierConfiguration = TextMagnifierConfiguration.disabled,\n    this.onSelectionChanged,\n    required this.selectionControls,\n    required this.child,\n  });\n\n  /// The configuration for the magnifier used with selections in this region.\n  ///\n  /// By default, [SelectableRegion]'s [TextMagnifierConfiguration] is disabled.\n  /// For a version of [SelectableRegion] that adapts automatically to the\n  /// current platform, consider [SelectionArea].\n  ///\n  /// {@macro flutter.widgets.magnifier.intro}\n  final TextMagnifierConfiguration magnifierConfiguration;\n\n  /// {@macro flutter.widgets.Focus.focusNode}\n  final FocusNode? focusNode;\n\n  /// The child widget this selection area applies to.\n  ///\n  /// {@macro flutter.widgets.ProxyWidget.child}\n  final Widget child;\n\n  /// {@macro flutter.widgets.EditableText.contextMenuBuilder}\n  final SelectableRegionContextMenuBuilder? contextMenuBuilder;\n\n  /// The delegate to build the selection handles and toolbar for mobile\n  /// devices.\n  ///\n  /// The [emptyTextSelectionControls] global variable provides a default\n  /// [TextSelectionControls] implementation with no controls.\n  final TextSelectionControls selectionControls;\n\n  /// Called when the selected content changes.\n  final ValueChanged<SelectedContent?>? onSelectionChanged;\n\n  /// Returns the [ContextMenuButtonItem]s representing the buttons in this\n  /// platform's default selection menu.\n  ///\n  /// For example, [SelectableRegion] uses this to generate the default buttons\n  /// for its context menu.\n  ///\n  /// See also:\n  ///\n  /// * [SelectableRegionState.contextMenuButtonItems], which gives the\n  ///   [ContextMenuButtonItem]s for a specific SelectableRegion.\n  /// * [EditableText.getEditableButtonItems], which performs a similar role but\n  ///   for content that is both selectable and editable.\n  /// * [AdaptiveTextSelectionToolbar], which builds the toolbar itself, and can\n  ///   take a list of [ContextMenuButtonItem]s with\n  ///   [AdaptiveTextSelectionToolbar.buttonItems].\n  /// * [AdaptiveTextSelectionToolbar.getAdaptiveButtons], which builds the button\n  ///   Widgets for the current platform given [ContextMenuButtonItem]s.\n  static List<ContextMenuButtonItem> getSelectableButtonItems({\n    required final SelectionGeometry selectionGeometry,\n    required final VoidCallback onCopy,\n    required final VoidCallback onSelectAll,\n    required final VoidCallback? onShare,\n  }) {\n    final canCopy = selectionGeometry.status == SelectionStatus.uncollapsed;\n    final bool canSelectAll = selectionGeometry.hasContent;\n    // The share button is not supported on the web.\n    final bool platformCanShare =\n        !kIsWeb &&\n        switch (defaultTargetPlatform) {\n          TargetPlatform.android =>\n            selectionGeometry.status == SelectionStatus.uncollapsed,\n          TargetPlatform.macOS ||\n          TargetPlatform.fuchsia ||\n          TargetPlatform.linux ||\n          TargetPlatform.windows => false,\n          // TODO(bleroux): the share button should be shown on iOS but the share\n          // functionality requires some changes on the engine side because, on iPad,\n          // it needs an anchor for the popup.\n          // See: https://github.com/flutter/flutter/issues/141775.\n          TargetPlatform.iOS => false,\n        };\n    final bool canShare = onShare != null && platformCanShare;\n\n    // On Android, the share button is before the select all button.\n    final showShareBeforeSelectAll =\n        defaultTargetPlatform == TargetPlatform.android;\n\n    // Determine which buttons will appear so that the order and total number is\n    // known. A button's position in the menu can slightly affect its\n    // appearance.\n    return <ContextMenuButtonItem>[\n      if (canCopy)\n        ContextMenuButtonItem(\n          onPressed: onCopy,\n          type: ContextMenuButtonType.copy,\n        ),\n      if (canShare && showShareBeforeSelectAll)\n        ContextMenuButtonItem(\n          onPressed: onShare,\n          type: ContextMenuButtonType.share,\n        ),\n      if (canSelectAll)\n        ContextMenuButtonItem(\n          onPressed: onSelectAll,\n          type: ContextMenuButtonType.selectAll,\n        ),\n      if (canShare && !showShareBeforeSelectAll)\n        ContextMenuButtonItem(\n          onPressed: onShare,\n          type: ContextMenuButtonType.share,\n        ),\n    ];\n  }\n\n  @override\n  State<StatefulWidget> createState() => SelectableRegionState();\n}\n\n/// State for a [SelectableRegion].\nclass SelectableRegionState extends State<SelectableRegion>\n    with TextSelectionDelegate\n    implements SelectionRegistrar {\n  late final Map<Type, Action<Intent>> _actions = <Type, Action<Intent>>{\n    SelectAllTextIntent: _makeOverridable(_SelectAllAction(this)),\n    CopySelectionTextIntent: _makeOverridable(_CopySelectionAction(this)),\n    ExtendSelectionToNextWordBoundaryOrCaretLocationIntent: _makeOverridable(\n      _GranularlyExtendSelectionAction<\n        ExtendSelectionToNextWordBoundaryOrCaretLocationIntent\n      >(\n        this,\n        granularity: TextGranularity.word,\n      ),\n    ),\n    ExpandSelectionToDocumentBoundaryIntent: _makeOverridable(\n      _GranularlyExtendSelectionAction<ExpandSelectionToDocumentBoundaryIntent>(\n        this,\n        granularity: TextGranularity.document,\n      ),\n    ),\n    ExpandSelectionToLineBreakIntent: _makeOverridable(\n      _GranularlyExtendSelectionAction<ExpandSelectionToLineBreakIntent>(\n        this,\n        granularity: TextGranularity.line,\n      ),\n    ),\n    ExtendSelectionByCharacterIntent: _makeOverridable(\n      _GranularlyExtendCaretSelectionAction<ExtendSelectionByCharacterIntent>(\n        this,\n        granularity: TextGranularity.character,\n      ),\n    ),\n    ExtendSelectionToNextWordBoundaryIntent: _makeOverridable(\n      _GranularlyExtendCaretSelectionAction<\n        ExtendSelectionToNextWordBoundaryIntent\n      >(\n        this,\n        granularity: TextGranularity.word,\n      ),\n    ),\n    ExtendSelectionToLineBreakIntent: _makeOverridable(\n      _GranularlyExtendCaretSelectionAction<ExtendSelectionToLineBreakIntent>(\n        this,\n        granularity: TextGranularity.line,\n      ),\n    ),\n    ExtendSelectionVerticallyToAdjacentLineIntent: _makeOverridable(\n      _DirectionallyExtendCaretSelectionAction<\n        ExtendSelectionVerticallyToAdjacentLineIntent\n      >(this),\n    ),\n    ExtendSelectionToDocumentBoundaryIntent: _makeOverridable(\n      _GranularlyExtendCaretSelectionAction<\n        ExtendSelectionToDocumentBoundaryIntent\n      >(\n        this,\n        granularity: TextGranularity.document,\n      ),\n    ),\n  };\n\n  final Map<Type, GestureRecognizerFactory> _gestureRecognizers =\n      <Type, GestureRecognizerFactory>{};\n  SelectionOverlay? _selectionOverlay;\n  final LayerLink _startHandleLayerLink = LayerLink();\n  final LayerLink _endHandleLayerLink = LayerLink();\n  final LayerLink _toolbarLayerLink = LayerLink();\n  final StaticSelectionContainerDelegate _selectionDelegate =\n      StaticSelectionContainerDelegate();\n  // there should only ever be one selectable, which is the SelectionContainer.\n  Selectable? _selectable;\n\n  bool get _hasSelectionOverlayGeometry =>\n      _selectionDelegate.value.startSelectionPoint != null ||\n      _selectionDelegate.value.endSelectionPoint != null;\n\n  Orientation? _lastOrientation;\n  SelectedContent? _lastSelectedContent;\n\n  /// Whether the native browser context menu is enabled.\n  // TODO(Renzo-Olivares): Re-enable web context menu for Android\n  // and iOS when https://github.com/flutter/flutter/issues/177123\n  // is resolved.\n  bool get _webContextMenuEnabled =>\n      kIsWeb &&\n      BrowserContextMenu.enabled &&\n      defaultTargetPlatform != TargetPlatform.android &&\n      defaultTargetPlatform != TargetPlatform.iOS;\n\n  /// The [SelectionOverlay] that is currently visible on the screen.\n  ///\n  /// Can be null if there is no visible [SelectionOverlay].\n  @visibleForTesting\n  SelectionOverlay? get selectionOverlay => _selectionOverlay;\n\n  /// The text processing service used to retrieve the native text processing actions.\n  final ProcessTextService _processTextService = DefaultProcessTextService();\n\n  /// The list of native text processing actions provided by the engine.\n  final List<ProcessTextAction> _processTextActions = <ProcessTextAction>[];\n\n  // The focus node to use if the widget didn't supply one.\n  FocusNode? _localFocusNode;\n  FocusNode get _focusNode =>\n      widget.focusNode ??\n      (_localFocusNode ??= FocusNode(debugLabel: 'SelectableRegion'));\n\n  /// Notifies its listeners when the selection state in this [SelectableRegion] changes.\n  final _SelectableRegionSelectionStatusNotifier _selectionStatusNotifier =\n      _SelectableRegionSelectionStatusNotifier._();\n\n  @protected\n  @override\n  void initState() {\n    super.initState();\n    _focusNode.addListener(_handleFocusChanged);\n    _initMouseGestureRecognizer();\n    _initTouchGestureRecognizer();\n    // Right clicks.\n    _gestureRecognizers[TapGestureRecognizer] =\n        GestureRecognizerFactoryWithHandlers<TapGestureRecognizer>(\n          () => TapGestureRecognizer(debugOwner: this),\n          (TapGestureRecognizer instance) {\n            instance.onSecondaryTapDown = _handleRightClickDown;\n          },\n        );\n    _initProcessTextActions();\n  }\n\n  /// Query the engine to initialize the list of text processing actions to show\n  /// in the text selection toolbar.\n  Future<void> _initProcessTextActions() async {\n    _processTextActions\n      ..clear()\n      ..addAll(await _processTextService.queryTextActions());\n  }\n\n  @protected\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    switch (defaultTargetPlatform) {\n      case TargetPlatform.android:\n      case TargetPlatform.iOS:\n        break;\n      case TargetPlatform.fuchsia:\n      case TargetPlatform.linux:\n      case TargetPlatform.macOS:\n      case TargetPlatform.windows:\n        return;\n    }\n\n    // Hide the text selection toolbar on mobile when orientation changes.\n    final Orientation orientation = MediaQuery.orientationOf(context);\n    if (_lastOrientation == null) {\n      _lastOrientation = orientation;\n      return;\n    }\n    if (orientation != _lastOrientation) {\n      _lastOrientation = orientation;\n      hideToolbar(defaultTargetPlatform == TargetPlatform.android);\n    }\n  }\n\n  @protected\n  @override\n  void didUpdateWidget(SelectableRegion oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (widget.focusNode != oldWidget.focusNode) {\n      if (oldWidget.focusNode == null && widget.focusNode != null) {\n        _localFocusNode?.removeListener(_handleFocusChanged);\n        _localFocusNode?.dispose();\n        _localFocusNode = null;\n      } else if (widget.focusNode == null && oldWidget.focusNode != null) {\n        oldWidget.focusNode!.removeListener(_handleFocusChanged);\n      }\n      _focusNode.addListener(_handleFocusChanged);\n      if (_focusNode.hasFocus != oldWidget.focusNode?.hasFocus) {\n        _handleFocusChanged();\n      }\n    }\n  }\n\n  Action<T> _makeOverridable<T extends Intent>(Action<T> defaultAction) {\n    return Action<T>.overridable(\n      context: context,\n      defaultAction: defaultAction,\n    );\n  }\n\n  void _handleFocusChanged() {\n    if (!_focusNode.hasFocus) {\n      if (_webContextMenuEnabled) {\n        PlatformSelectableRegionContextMenu.detach(_selectionDelegate);\n      }\n      if (SchedulerBinding.instance.lifecycleState ==\n          AppLifecycleState.resumed) {\n        // We should only clear the selection when this SelectableRegion loses\n        // focus while the application is currently running. It is possible\n        // that the application is not currently running, for example on desktop\n        // platforms, clicking on a different window switches the focus to\n        // the new window causing the Flutter application to go inactive. In this\n        // case we want to retain the selection so it remains when we return to\n        // the Flutter application.\n        clearSelection();\n        _selectionStatusNotifier.value =\n            SelectableRegionSelectionStatus.changing;\n        _finalizeSelectableRegionStatus();\n      }\n    }\n    if (_webContextMenuEnabled) {\n      PlatformSelectableRegionContextMenu.attach(_selectionDelegate);\n    }\n  }\n\n  void _updateSelectionStatus() {\n    final SelectionGeometry geometry = _selectionDelegate.value;\n    final TextSelection selection = switch (geometry.status) {\n      SelectionStatus.uncollapsed || SelectionStatus.collapsed =>\n        const TextSelection(baseOffset: 0, extentOffset: 1),\n      SelectionStatus.none => const TextSelection.collapsed(offset: 1),\n    };\n    textEditingValue = TextEditingValue(text: '__', selection: selection);\n    if (_hasSelectionOverlayGeometry) {\n      _updateSelectionOverlay();\n    } else {\n      _selectionOverlay?.dispose();\n      _selectionOverlay = null;\n    }\n  }\n\n  // gestures.\n\n  /// Whether the Shift key was pressed when the most recent [PointerDownEvent]\n  /// was tracked by the [BaseTapAndDragGestureRecognizer].\n  bool _isShiftPressed = false;\n\n  // The position of the most recent secondary tap down event on this\n  // SelectableRegion.\n  Offset? _lastSecondaryTapDownPosition;\n\n  // The device kind for the pointer of the most recent tap down event on this\n  // SelectableRegion.\n  PointerDeviceKind? _lastPointerDeviceKind;\n\n  static bool _isPrecisePointerDevice(PointerDeviceKind pointerDeviceKind) {\n    switch (pointerDeviceKind) {\n      case PointerDeviceKind.mouse:\n        return true;\n      case PointerDeviceKind.trackpad:\n      case PointerDeviceKind.stylus:\n      case PointerDeviceKind.invertedStylus:\n      case PointerDeviceKind.touch:\n      case PointerDeviceKind.unknown:\n        return false;\n    }\n  }\n\n  void _finalizeSelectableRegionStatus() {\n    if (_selectionStatusNotifier.value !=\n        SelectableRegionSelectionStatus.changing) {\n      // Don't finalize the selection again if it is not currently changing.\n      return;\n    }\n    _selectionStatusNotifier.value = SelectableRegionSelectionStatus.finalized;\n  }\n\n  // Converts the details.consecutiveTapCount from a TapAndDrag*Details object,\n  // which can grow to be infinitely large, to a value between 1 and the supported\n  // max consecutive tap count. The value that the raw count is converted to is\n  // based on the default observed behavior on the native platforms.\n  //\n  // This method should be used in all instances when details.consecutiveTapCount\n  // would be used.\n  int _getEffectiveConsecutiveTapCount(int rawCount) {\n    var maxConsecutiveTap = 3;\n    switch (defaultTargetPlatform) {\n      case TargetPlatform.android:\n      case TargetPlatform.fuchsia:\n        if (_lastPointerDeviceKind != null &&\n            _lastPointerDeviceKind != PointerDeviceKind.mouse) {\n          // When the pointer device kind is not precise like a mouse, native\n          // Android resets the tap count at 2. For example, this is so the\n          // selection can collapse on the third tap.\n          maxConsecutiveTap = 2;\n        }\n        // From observation, these platforms reset their tap count to 0 when\n        // the number of consecutive taps exceeds the max consecutive tap supported.\n        // For example on native Android, when going past a triple click,\n        // on the fourth click the selection is moved to the precise click\n        // position, on the fifth click the word at the position is selected, and\n        // on the sixth click the paragraph at the position is selected.\n        return rawCount <= maxConsecutiveTap\n            ? rawCount\n            : (rawCount % maxConsecutiveTap == 0\n                  ? maxConsecutiveTap\n                  : rawCount % maxConsecutiveTap);\n      case TargetPlatform.linux:\n        // From observation, these platforms reset their tap count to 0 when\n        // the number of consecutive taps exceeds the max consecutive tap supported.\n        // For example on Debian Linux with GTK, when going past a triple click,\n        // on the fourth click the selection is moved to the precise click\n        // position, on the fifth click the word at the position is selected, and\n        // on the sixth click the paragraph at the position is selected.\n        return rawCount <= maxConsecutiveTap\n            ? rawCount\n            : (rawCount % maxConsecutiveTap == 0\n                  ? maxConsecutiveTap\n                  : rawCount % maxConsecutiveTap);\n      case TargetPlatform.iOS:\n      case TargetPlatform.macOS:\n      case TargetPlatform.windows:\n        // From observation, these platforms hold their tap count at the max\n        // consecutive tap supported. For example on macOS, when going past a triple\n        // click, the selection should be retained at the paragraph that was first\n        // selected on triple click.\n        return min(rawCount, maxConsecutiveTap);\n    }\n  }\n\n  void _initMouseGestureRecognizer() {\n    _gestureRecognizers[TapAndPanGestureRecognizer] =\n        GestureRecognizerFactoryWithHandlers<TapAndPanGestureRecognizer>(\n          () => TapAndPanGestureRecognizer(\n            debugOwner: this,\n            supportedDevices: <PointerDeviceKind>{PointerDeviceKind.mouse},\n          ),\n          (TapAndPanGestureRecognizer instance) {\n            instance\n              ..onTapTrackStart = _onTapTrackStart\n              ..onTapTrackReset = _onTapTrackReset\n              ..onTapDown = _startNewMouseSelectionGesture\n              ..onTapUp = _handleMouseTapUp\n              ..onDragStart = _handleMouseDragStart\n              ..onDragUpdate = _handleMouseDragUpdate\n              ..onDragEnd = _handleMouseDragEnd\n              ..onCancel = clearSelection\n              ..dragStartBehavior = DragStartBehavior.down;\n          },\n        );\n  }\n\n  void _onTapTrackStart() {\n    _isShiftPressed = HardwareKeyboard.instance.logicalKeysPressed.intersection(\n      <LogicalKeyboardKey>{\n        LogicalKeyboardKey.shiftLeft,\n        LogicalKeyboardKey.shiftRight,\n      },\n    ).isNotEmpty;\n  }\n\n  void _onTapTrackReset() {\n    _isShiftPressed = false;\n  }\n\n  void _initTouchGestureRecognizer() {\n    // A [TapAndHorizontalDragGestureRecognizer] is used on non-precise pointer devices\n    // like PointerDeviceKind.touch so [SelectableRegion] gestures do not conflict with\n    // ancestor Scrollable gestures in common scenarios like a vertically scrolling list view.\n    _gestureRecognizers[TapAndHorizontalDragGestureRecognizer] =\n        GestureRecognizerFactoryWithHandlers<\n          TapAndHorizontalDragGestureRecognizer\n        >(\n          () => TapAndHorizontalDragGestureRecognizer(\n            debugOwner: this,\n            supportedDevices: PointerDeviceKind.values.where((\n              PointerDeviceKind device,\n            ) {\n              return device != PointerDeviceKind.mouse;\n            }).toSet(),\n          ),\n          (TapAndHorizontalDragGestureRecognizer instance) {\n            instance\n              // iOS does not provide a device specific touch slop\n              // unlike Android (~8.0), so the touch slop for a [Scrollable]\n              // always default to kTouchSlop which is 18.0. When\n              // [SelectableRegion] is the child of a horizontal\n              // scrollable that means the [SelectableRegion] will\n              // always win the gesture arena when competing with\n              // the ancestor scrollable because they both have\n              // the same touch slop threshold and the child receives\n              // the [PointerEvent] first. To avoid this conflict\n              // and ensure a smooth scrolling experience, on\n              // iOS the [TapAndHorizontalDragGestureRecognizer]\n              // will wait for all other gestures to lose before\n              // declaring victory.\n              ..eagerVictoryOnDrag = defaultTargetPlatform != TargetPlatform.iOS\n              ..onTapDown = _startNewMouseSelectionGesture\n              ..onTapUp = _handleMouseTapUp\n              ..onDragStart = _handleMouseDragStart\n              ..onDragUpdate = _handleMouseDragUpdate\n              ..onDragEnd = _handleMouseDragEnd\n              ..onCancel = clearSelection\n              ..dragStartBehavior = DragStartBehavior.down;\n          },\n        );\n    _gestureRecognizers[LongPressGestureRecognizer] =\n        GestureRecognizerFactoryWithHandlers<LongPressGestureRecognizer>(\n          () => LongPressGestureRecognizer(\n            debugOwner: this,\n            supportedDevices: _kLongPressSelectionDevices,\n          ),\n          (LongPressGestureRecognizer instance) {\n            instance\n              ..onLongPressStart = _handleTouchLongPressStart\n              ..onLongPressMoveUpdate = _handleTouchLongPressMoveUpdate\n              ..onLongPressEnd = _handleTouchLongPressEnd;\n          },\n        );\n  }\n\n  Offset? _doubleTapOffset;\n  void _startNewMouseSelectionGesture(TapDragDownDetails details) {\n    _lastPointerDeviceKind = details.kind;\n    switch (_getEffectiveConsecutiveTapCount(details.consecutiveTapCount)) {\n      case 1:\n        _focusNode.requestFocus();\n        switch (defaultTargetPlatform) {\n          case TargetPlatform.android:\n          case TargetPlatform.fuchsia:\n          case TargetPlatform.iOS:\n            // On mobile platforms the selection is set on tap up for the first\n            // tap.\n            break;\n          case TargetPlatform.macOS:\n          case TargetPlatform.linux:\n          case TargetPlatform.windows:\n            hideToolbar();\n            // It is impossible to extend the selection when the shift key is\n            // pressed and the start of the selection has not been initialized.\n            // In this case we fallback on collapsing the selection to first\n            // initialize the selection.\n            final bool isShiftPressedValid =\n                _isShiftPressed &&\n                _selectionDelegate.value.startSelectionPoint != null;\n            if (isShiftPressedValid) {\n              _selectEndTo(offset: details.globalPosition);\n              _selectionStatusNotifier.value =\n                  SelectableRegionSelectionStatus.changing;\n              break;\n            }\n            clearSelection();\n            _collapseSelectionAt(offset: details.globalPosition);\n            _selectionStatusNotifier.value =\n                SelectableRegionSelectionStatus.changing;\n        }\n      case 2:\n        switch (defaultTargetPlatform) {\n          case TargetPlatform.iOS:\n            if (kIsWeb &&\n                details.kind != null &&\n                !_isPrecisePointerDevice(details.kind!)) {\n              // Double tap on iOS web triggers when a drag begins after the double tap.\n              _doubleTapOffset = details.globalPosition;\n              break;\n            }\n            _selectWordAt(offset: details.globalPosition);\n            _selectionStatusNotifier.value =\n                SelectableRegionSelectionStatus.changing;\n            if (details.kind != null &&\n                !_isPrecisePointerDevice(details.kind!)) {\n              _showHandles();\n            }\n          case TargetPlatform.android:\n          case TargetPlatform.fuchsia:\n          case TargetPlatform.macOS:\n          case TargetPlatform.linux:\n          case TargetPlatform.windows:\n            _selectWordAt(offset: details.globalPosition);\n            _selectionStatusNotifier.value =\n                SelectableRegionSelectionStatus.changing;\n        }\n      case 3:\n        switch (defaultTargetPlatform) {\n          case TargetPlatform.android:\n          case TargetPlatform.fuchsia:\n          case TargetPlatform.iOS:\n            if (details.kind != null &&\n                _isPrecisePointerDevice(details.kind!)) {\n              // Triple tap on static text is only supported on mobile\n              // platforms using a precise pointer device.\n              _selectParagraphAt(offset: details.globalPosition);\n              _selectionStatusNotifier.value =\n                  SelectableRegionSelectionStatus.changing;\n            }\n          case TargetPlatform.macOS:\n          case TargetPlatform.linux:\n          case TargetPlatform.windows:\n            _selectParagraphAt(offset: details.globalPosition);\n            _selectionStatusNotifier.value =\n                SelectableRegionSelectionStatus.changing;\n        }\n    }\n    _updateSelectedContentIfNeeded();\n  }\n\n  void _handleMouseDragStart(TapDragStartDetails details) {\n    switch (_getEffectiveConsecutiveTapCount(details.consecutiveTapCount)) {\n      case 1:\n        if (details.kind != null && !_isPrecisePointerDevice(details.kind!)) {\n          // Drag to select is only enabled with a precise pointer device.\n          return;\n        }\n        _selectStartTo(offset: details.globalPosition);\n        _selectionStatusNotifier.value =\n            SelectableRegionSelectionStatus.changing;\n    }\n    _updateSelectedContentIfNeeded();\n  }\n\n  void _handleMouseDragUpdate(TapDragUpdateDetails details) {\n    switch (_getEffectiveConsecutiveTapCount(details.consecutiveTapCount)) {\n      case 1:\n        if (details.kind != null && !_isPrecisePointerDevice(details.kind!)) {\n          // Drag to select is only enabled with a precise pointer device.\n          return;\n        }\n        _selectEndTo(offset: details.globalPosition, continuous: true);\n        _selectionStatusNotifier.value =\n            SelectableRegionSelectionStatus.changing;\n      case 2:\n        switch (defaultTargetPlatform) {\n          case TargetPlatform.android:\n          case TargetPlatform.fuchsia:\n            // Double tap + drag is only supported on Android when using a precise\n            // pointer device or when not on the web.\n            if (!kIsWeb ||\n                details.kind != null &&\n                    _isPrecisePointerDevice(details.kind!)) {\n              _selectEndTo(\n                offset: details.globalPosition,\n                continuous: true,\n                textGranularity: TextGranularity.word,\n              );\n              _selectionStatusNotifier.value =\n                  SelectableRegionSelectionStatus.changing;\n            }\n          case TargetPlatform.iOS:\n            if (kIsWeb &&\n                details.kind != null &&\n                !_isPrecisePointerDevice(details.kind!) &&\n                _doubleTapOffset != null) {\n              // On iOS web a double tap does not select the word at the position,\n              // until the drag has begun.\n              _selectWordAt(offset: _doubleTapOffset!);\n              _doubleTapOffset = null;\n            }\n            _selectEndTo(\n              offset: details.globalPosition,\n              continuous: true,\n              textGranularity: TextGranularity.word,\n            );\n            _selectionStatusNotifier.value =\n                SelectableRegionSelectionStatus.changing;\n            if (details.kind != null &&\n                !_isPrecisePointerDevice(details.kind!)) {\n              _showHandles();\n            }\n          case TargetPlatform.macOS:\n          case TargetPlatform.linux:\n          case TargetPlatform.windows:\n            _selectEndTo(\n              offset: details.globalPosition,\n              continuous: true,\n              textGranularity: TextGranularity.word,\n            );\n            _selectionStatusNotifier.value =\n                SelectableRegionSelectionStatus.changing;\n        }\n      case 3:\n        switch (defaultTargetPlatform) {\n          case TargetPlatform.android:\n          case TargetPlatform.fuchsia:\n          case TargetPlatform.iOS:\n            // Triple tap + drag is only supported on mobile devices when using\n            // a precise pointer device.\n            if (details.kind != null &&\n                _isPrecisePointerDevice(details.kind!)) {\n              _selectEndTo(\n                offset: details.globalPosition,\n                continuous: true,\n                textGranularity: TextGranularity.paragraph,\n              );\n              _selectionStatusNotifier.value =\n                  SelectableRegionSelectionStatus.changing;\n            }\n          case TargetPlatform.macOS:\n          case TargetPlatform.linux:\n          case TargetPlatform.windows:\n            _selectEndTo(\n              offset: details.globalPosition,\n              continuous: true,\n              textGranularity: TextGranularity.paragraph,\n            );\n            _selectionStatusNotifier.value =\n                SelectableRegionSelectionStatus.changing;\n        }\n    }\n    _updateSelectedContentIfNeeded();\n  }\n\n  void _handleMouseDragEnd(TapDragEndDetails details) {\n    assert(_lastPointerDeviceKind != null);\n    final bool isPointerPrecise = _isPrecisePointerDevice(\n      _lastPointerDeviceKind!,\n    );\n    // On mobile platforms like android, fuchsia, and iOS, a drag gesture will\n    // only show the selection overlay when the drag has finished and the pointer\n    // device kind is not precise, for example at the end of a double tap + drag\n    // to select on native iOS.\n    final bool shouldShowSelectionOverlayOnMobile = !isPointerPrecise;\n    switch (defaultTargetPlatform) {\n      case TargetPlatform.android:\n      case TargetPlatform.fuchsia:\n        if (shouldShowSelectionOverlayOnMobile) {\n          _showHandles();\n          _showToolbar();\n        }\n      case TargetPlatform.iOS:\n        if (shouldShowSelectionOverlayOnMobile) {\n          _showToolbar();\n        }\n      case TargetPlatform.macOS:\n      case TargetPlatform.linux:\n      case TargetPlatform.windows:\n        // The selection overlay is not shown on desktop platforms after a drag.\n        break;\n    }\n    _finalizeSelection();\n    _updateSelectedContentIfNeeded();\n    _finalizeSelectableRegionStatus();\n  }\n\n  void _handleMouseTapUp(TapDragUpDetails details) {\n    if (defaultTargetPlatform == TargetPlatform.iOS &&\n        _positionIsOnActiveSelection(globalPosition: details.globalPosition)) {\n      // On iOS when the tap occurs on the previous selection, instead of\n      // moving the selection, the context menu will be toggled.\n      final bool toolbarIsVisible =\n          _selectionOverlay?.toolbarIsVisible ?? false;\n      if (toolbarIsVisible) {\n        hideToolbar(false);\n      } else {\n        _showToolbar();\n      }\n      return;\n    }\n    switch (_getEffectiveConsecutiveTapCount(details.consecutiveTapCount)) {\n      case 1:\n        switch (defaultTargetPlatform) {\n          case TargetPlatform.android:\n          case TargetPlatform.fuchsia:\n          case TargetPlatform.iOS:\n            hideToolbar();\n            _collapseSelectionAt(offset: details.globalPosition);\n            _selectionStatusNotifier.value =\n                SelectableRegionSelectionStatus.changing;\n          case TargetPlatform.macOS:\n          case TargetPlatform.linux:\n          case TargetPlatform.windows:\n          // On desktop platforms the selection is set on tap down.\n        }\n      case 2:\n        final bool isPointerPrecise = _isPrecisePointerDevice(details.kind);\n        switch (defaultTargetPlatform) {\n          case TargetPlatform.android:\n          case TargetPlatform.fuchsia:\n            if (!isPointerPrecise) {\n              // On Android, a double tap will only show the selection overlay after\n              // the following tap up when the pointer device kind is not precise.\n              _showHandles();\n              _showToolbar();\n            }\n          case TargetPlatform.iOS:\n            if (!isPointerPrecise) {\n              if (kIsWeb) {\n                // Double tap on iOS web only triggers when a drag begins after the double tap.\n                break;\n              }\n              // On iOS, a double tap will only show the selection toolbar after\n              // the following tap up when the pointer device kind is not precise.\n              _showToolbar();\n            }\n          case TargetPlatform.macOS:\n          case TargetPlatform.linux:\n          case TargetPlatform.windows:\n            // The selection overlay is not shown on desktop platforms\n            // on a double click.\n            break;\n        }\n    }\n    _finalizeSelectableRegionStatus();\n    _updateSelectedContentIfNeeded();\n  }\n\n  void _updateSelectedContentIfNeeded() {\n    if (widget.onSelectionChanged == null) {\n      return;\n    }\n    final SelectedContent? content = _selectable?.getSelectedContent();\n    if (_lastSelectedContent?.plainText != content?.plainText) {\n      _lastSelectedContent = content;\n      widget.onSelectionChanged!.call(_lastSelectedContent);\n    }\n  }\n\n  void _handleTouchLongPressStart(LongPressStartDetails details) {\n    HapticFeedback.selectionClick();\n    _focusNode.requestFocus();\n    _selectWordAt(offset: details.globalPosition);\n    _selectionStatusNotifier.value = SelectableRegionSelectionStatus.changing;\n    // Platforms besides Android will show the text selection handles when\n    // the long press is initiated. Android shows the text selection handles when\n    // the long press has ended, usually after a pointer up event is received.\n    if (defaultTargetPlatform != TargetPlatform.android) {\n      _showHandles();\n    }\n    _updateSelectedContentIfNeeded();\n  }\n\n  void _handleTouchLongPressMoveUpdate(LongPressMoveUpdateDetails details) {\n    _selectEndTo(\n      offset: details.globalPosition,\n      textGranularity: TextGranularity.word,\n    );\n    _selectionStatusNotifier.value = SelectableRegionSelectionStatus.changing;\n    _updateSelectedContentIfNeeded();\n  }\n\n  void _handleTouchLongPressEnd(LongPressEndDetails details) {\n    _finalizeSelection();\n    _updateSelectedContentIfNeeded();\n    _finalizeSelectableRegionStatus();\n    _showToolbar();\n    if (defaultTargetPlatform == TargetPlatform.android) {\n      _showHandles();\n    }\n  }\n\n  bool _positionIsOnActiveSelection({required Offset globalPosition}) {\n    for (final Rect selectionRect in _selectionDelegate.value.selectionRects) {\n      final Matrix4 transform = _selectable!.getTransformTo(null);\n      final Rect globalRect = MatrixUtils.transformRect(\n        transform,\n        selectionRect,\n      );\n      if (globalRect.contains(globalPosition)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  void _handleRightClickDown(TapDownDetails details) {\n    final Offset? previousSecondaryTapDownPosition =\n        _lastSecondaryTapDownPosition;\n    final bool toolbarIsVisible = _selectionOverlay?.toolbarIsVisible ?? false;\n    _lastSecondaryTapDownPosition = details.globalPosition;\n    _focusNode.requestFocus();\n    switch (defaultTargetPlatform) {\n      case TargetPlatform.android:\n      case TargetPlatform.fuchsia:\n      case TargetPlatform.windows:\n        // If _lastSecondaryTapDownPosition is within the current selection then\n        // keep the current selection, if not then collapse it.\n        final bool lastSecondaryTapDownPositionWasOnActiveSelection =\n            _positionIsOnActiveSelection(\n              globalPosition: details.globalPosition,\n            );\n        if (lastSecondaryTapDownPositionWasOnActiveSelection) {\n          // Restore _lastSecondaryTapDownPosition since it may be cleared if a user\n          // accesses contextMenuAnchors.\n          _lastSecondaryTapDownPosition = details.globalPosition;\n          _showHandles();\n          _showToolbar(location: _lastSecondaryTapDownPosition);\n          _updateSelectedContentIfNeeded();\n          return;\n        }\n        _collapseSelectionAt(offset: _lastSecondaryTapDownPosition!);\n      case TargetPlatform.iOS:\n        _selectWordAt(offset: _lastSecondaryTapDownPosition!);\n      case TargetPlatform.macOS:\n        if (previousSecondaryTapDownPosition == _lastSecondaryTapDownPosition &&\n            toolbarIsVisible) {\n          hideToolbar();\n          return;\n        }\n        _selectWordAt(offset: _lastSecondaryTapDownPosition!);\n      case TargetPlatform.linux:\n        if (toolbarIsVisible) {\n          hideToolbar();\n          return;\n        }\n        // If _lastSecondaryTapDownPosition is within the current selection then\n        // keep the current selection, if not then collapse it.\n        final bool lastSecondaryTapDownPositionWasOnActiveSelection =\n            _positionIsOnActiveSelection(\n              globalPosition: details.globalPosition,\n            );\n        if (!lastSecondaryTapDownPositionWasOnActiveSelection) {\n          _collapseSelectionAt(offset: _lastSecondaryTapDownPosition!);\n        }\n    }\n    _selectionStatusNotifier.value = SelectableRegionSelectionStatus.changing;\n    _finalizeSelectableRegionStatus();\n    // Restore _lastSecondaryTapDownPosition since it may be cleared if a user\n    // accesses contextMenuAnchors.\n    _lastSecondaryTapDownPosition = details.globalPosition;\n    _showHandles();\n    _showToolbar(location: _lastSecondaryTapDownPosition);\n    _updateSelectedContentIfNeeded();\n  }\n\n  // Selection update helper methods.\n\n  Offset? _selectionEndPosition;\n  bool get _userDraggingSelectionEnd => _selectionEndPosition != null;\n  bool _scheduledSelectionEndEdgeUpdate = false;\n\n  /// Sends end [SelectionEdgeUpdateEvent] to the selectable subtree.\n  ///\n  /// If the selectable subtree returns a [SelectionResult.pending], this method\n  /// continues to send [SelectionEdgeUpdateEvent]s every frame until the result\n  /// is not pending or users end their gestures.\n  void _triggerSelectionEndEdgeUpdate({TextGranularity? textGranularity}) {\n    // This method can be called when the drag is not in progress. This can\n    // happen if the child scrollable returns SelectionResult.pending, and\n    // the selection area scheduled a selection update for the next frame, but\n    // the drag is lifted before the scheduled selection update is run.\n    if (_scheduledSelectionEndEdgeUpdate || !_userDraggingSelectionEnd) {\n      return;\n    }\n    if (_selectable?.dispatchSelectionEvent(\n          SelectionEdgeUpdateEvent.forEnd(\n            globalPosition: _selectionEndPosition!,\n            granularity: textGranularity,\n          ),\n        ) ==\n        SelectionResult.pending) {\n      _scheduledSelectionEndEdgeUpdate = true;\n      SchedulerBinding.instance.addPostFrameCallback((Duration timeStamp) {\n        if (!_scheduledSelectionEndEdgeUpdate) {\n          return;\n        }\n        _scheduledSelectionEndEdgeUpdate = false;\n        _triggerSelectionEndEdgeUpdate(textGranularity: textGranularity);\n      }, debugLabel: 'SelectableRegion.endEdgeUpdate');\n      return;\n    }\n  }\n\n  void _onAnyDragEnd(DragEndDetails details) {\n    final bool draggingHandles =\n        _selectionOverlay != null &&\n        (_selectionOverlay!.isDraggingStartHandle ||\n            _selectionOverlay!.isDraggingEndHandle);\n    if (!draggingHandles) {\n      _selectionOverlay!.hideMagnifier();\n      _showToolbar();\n    }\n    _finalizeSelection();\n    _updateSelectedContentIfNeeded();\n    _finalizeSelectableRegionStatus();\n  }\n\n  void _stopSelectionEndEdgeUpdate() {\n    _scheduledSelectionEndEdgeUpdate = false;\n    _selectionEndPosition = null;\n  }\n\n  Offset? _selectionStartPosition;\n  bool get _userDraggingSelectionStart => _selectionStartPosition != null;\n  bool _scheduledSelectionStartEdgeUpdate = false;\n\n  /// Sends start [SelectionEdgeUpdateEvent] to the selectable subtree.\n  ///\n  /// If the selectable subtree returns a [SelectionResult.pending], this method\n  /// continues to send [SelectionEdgeUpdateEvent]s every frame until the result\n  /// is not pending or users end their gestures.\n  void _triggerSelectionStartEdgeUpdate({TextGranularity? textGranularity}) {\n    // This method can be called when the drag is not in progress. This can\n    // happen if the child scrollable returns SelectionResult.pending, and\n    // the selection area scheduled a selection update for the next frame, but\n    // the drag is lifted before the scheduled selection update is run.\n    if (_scheduledSelectionStartEdgeUpdate || !_userDraggingSelectionStart) {\n      return;\n    }\n    if (_selectable?.dispatchSelectionEvent(\n          SelectionEdgeUpdateEvent.forStart(\n            globalPosition: _selectionStartPosition!,\n            granularity: textGranularity,\n          ),\n        ) ==\n        SelectionResult.pending) {\n      _scheduledSelectionStartEdgeUpdate = true;\n      SchedulerBinding.instance.addPostFrameCallback((Duration timeStamp) {\n        if (!_scheduledSelectionStartEdgeUpdate) {\n          return;\n        }\n        _scheduledSelectionStartEdgeUpdate = false;\n        _triggerSelectionStartEdgeUpdate(textGranularity: textGranularity);\n      }, debugLabel: 'SelectableRegion.startEdgeUpdate');\n      return;\n    }\n  }\n\n  void _stopSelectionStartEdgeUpdate() {\n    _scheduledSelectionStartEdgeUpdate = false;\n    _selectionEndPosition = null;\n  }\n\n  // SelectionOverlay helper methods.\n\n  late Offset _selectionStartHandleDragPosition;\n  late Offset _selectionEndHandleDragPosition;\n\n  void _handleSelectionStartHandleDragStart(DragStartDetails details) {\n    assert(_selectionDelegate.value.startSelectionPoint != null);\n\n    final Offset localPosition =\n        _selectionDelegate.value.startSelectionPoint!.localPosition;\n    final Matrix4 globalTransform = _selectable!.getTransformTo(null);\n    _selectionStartHandleDragPosition = MatrixUtils.transformPoint(\n      globalTransform,\n      localPosition,\n    );\n\n    _selectionOverlay!.showMagnifier(\n      _buildInfoForMagnifier(\n        details.globalPosition,\n        _selectionDelegate.value.startSelectionPoint!,\n      ),\n    );\n    _updateSelectedContentIfNeeded();\n  }\n\n  void _handleSelectionStartHandleDragUpdate(DragUpdateDetails details) {\n    _selectionStartHandleDragPosition =\n        _selectionStartHandleDragPosition + details.delta;\n    // The value corresponds to the paint origin of the selection handle.\n    // Offset it to the center of the line to make it feel more natural.\n    _selectionStartPosition =\n        _selectionStartHandleDragPosition -\n        Offset(0, _selectionDelegate.value.startSelectionPoint!.lineHeight / 2);\n    _triggerSelectionStartEdgeUpdate();\n\n    _selectionOverlay!.updateMagnifier(\n      _buildInfoForMagnifier(\n        details.globalPosition,\n        _selectionDelegate.value.startSelectionPoint!,\n      ),\n    );\n    _updateSelectedContentIfNeeded();\n    _selectionStatusNotifier.value = SelectableRegionSelectionStatus.changing;\n  }\n\n  void _handleSelectionEndHandleDragStart(DragStartDetails details) {\n    assert(_selectionDelegate.value.endSelectionPoint != null);\n    final Offset localPosition =\n        _selectionDelegate.value.endSelectionPoint!.localPosition;\n    final Matrix4 globalTransform = _selectable!.getTransformTo(null);\n    _selectionEndHandleDragPosition = MatrixUtils.transformPoint(\n      globalTransform,\n      localPosition,\n    );\n\n    _selectionOverlay!.showMagnifier(\n      _buildInfoForMagnifier(\n        details.globalPosition,\n        _selectionDelegate.value.endSelectionPoint!,\n      ),\n    );\n    _updateSelectedContentIfNeeded();\n  }\n\n  void _handleSelectionEndHandleDragUpdate(DragUpdateDetails details) {\n    _selectionEndHandleDragPosition =\n        _selectionEndHandleDragPosition + details.delta;\n    // The value corresponds to the paint origin of the selection handle.\n    // Offset it to the center of the line to make it feel more natural.\n    _selectionEndPosition =\n        _selectionEndHandleDragPosition -\n        Offset(0, _selectionDelegate.value.endSelectionPoint!.lineHeight / 2);\n    _triggerSelectionEndEdgeUpdate();\n\n    _selectionOverlay!.updateMagnifier(\n      _buildInfoForMagnifier(\n        details.globalPosition,\n        _selectionDelegate.value.endSelectionPoint!,\n      ),\n    );\n    _updateSelectedContentIfNeeded();\n    _selectionStatusNotifier.value = SelectableRegionSelectionStatus.changing;\n  }\n\n  MagnifierInfo _buildInfoForMagnifier(\n    Offset globalGesturePosition,\n    SelectionPoint selectionPoint,\n  ) {\n    final Vector3 globalTransform = _selectable!\n        .getTransformTo(null)\n        .getTranslation();\n    final globalTransformAsOffset = Offset(\n      globalTransform.x,\n      globalTransform.y,\n    );\n    final Offset globalSelectionPointPosition =\n        selectionPoint.localPosition + globalTransformAsOffset;\n    final caretRect = Rect.fromLTWH(\n      globalSelectionPointPosition.dx,\n      globalSelectionPointPosition.dy - selectionPoint.lineHeight,\n      0,\n      selectionPoint.lineHeight,\n    );\n\n    return MagnifierInfo(\n      globalGesturePosition: globalGesturePosition,\n      caretRect: caretRect,\n      fieldBounds: globalTransformAsOffset & _selectable!.size,\n      currentLineBoundaries: globalTransformAsOffset & _selectable!.size,\n    );\n  }\n\n  void _createSelectionOverlay() {\n    assert(_hasSelectionOverlayGeometry);\n    if (_selectionOverlay != null) {\n      return;\n    }\n    final SelectionPoint? start = _selectionDelegate.value.startSelectionPoint;\n    final SelectionPoint? end = _selectionDelegate.value.endSelectionPoint;\n    _selectionOverlay = SelectionOverlay(\n      context: context,\n      debugRequiredFor: widget,\n      startHandleType: start?.handleType ?? TextSelectionHandleType.collapsed,\n      lineHeightAtStart: start?.lineHeight ?? end!.lineHeight,\n      onStartHandleDragStart: _handleSelectionStartHandleDragStart,\n      onStartHandleDragUpdate: _handleSelectionStartHandleDragUpdate,\n      onStartHandleDragEnd: _onAnyDragEnd,\n      endHandleType: end?.handleType ?? TextSelectionHandleType.collapsed,\n      lineHeightAtEnd: end?.lineHeight ?? start!.lineHeight,\n      onEndHandleDragStart: _handleSelectionEndHandleDragStart,\n      onEndHandleDragUpdate: _handleSelectionEndHandleDragUpdate,\n      onEndHandleDragEnd: _onAnyDragEnd,\n      selectionEndpoints: selectionEndpoints,\n      selectionControls: widget.selectionControls,\n      selectionDelegate: this,\n      clipboardStatus: null,\n      startHandleLayerLink: _startHandleLayerLink,\n      endHandleLayerLink: _endHandleLayerLink,\n      toolbarLayerLink: _toolbarLayerLink,\n      magnifierConfiguration: widget.magnifierConfiguration,\n    );\n  }\n\n  void _updateSelectionOverlay() {\n    if (_selectionOverlay == null) {\n      return;\n    }\n    assert(_hasSelectionOverlayGeometry);\n    final SelectionPoint? start = _selectionDelegate.value.startSelectionPoint;\n    final SelectionPoint? end = _selectionDelegate.value.endSelectionPoint;\n    _selectionOverlay!\n      ..startHandleType = start?.handleType ?? TextSelectionHandleType.left\n      ..lineHeightAtStart = start?.lineHeight ?? end!.lineHeight\n      ..endHandleType = end?.handleType ?? TextSelectionHandleType.right\n      ..lineHeightAtEnd = end?.lineHeight ?? start!.lineHeight\n      ..selectionEndpoints = selectionEndpoints;\n  }\n\n  /// Shows the selection handles.\n  ///\n  /// Returns true if the handles are shown, false if the handles can't be\n  /// shown.\n  bool _showHandles() {\n    if (_selectionOverlay != null) {\n      _selectionOverlay!.showHandles();\n      return true;\n    }\n\n    if (!_hasSelectionOverlayGeometry) {\n      return false;\n    }\n\n    _createSelectionOverlay();\n    _selectionOverlay!.showHandles();\n    return true;\n  }\n\n  /// Shows the text selection toolbar.\n  ///\n  /// If the parameter `location` is set, the toolbar will be shown at the\n  /// location. Otherwise, the toolbar location will be calculated based on the\n  /// handles' locations. The `location` is in the coordinates system of the\n  /// [Overlay].\n  ///\n  /// Returns true if the toolbar is shown, false if the toolbar can't be shown.\n  bool _showToolbar({Offset? location}) {\n    if (!_hasSelectionOverlayGeometry && _selectionOverlay == null) {\n      return false;\n    }\n\n    // Web is using native dom elements to enable clipboard functionality of the\n    // context menu: copy, paste, select, cut. It might also provide additional\n    // functionality depending on the browser (such as translate). Due to this,\n    // we should not show a Flutter toolbar for the editable text elements\n    // unless the browser's context menu is explicitly disabled.\n    if (_webContextMenuEnabled) {\n      return false;\n    }\n\n    if (_selectionOverlay == null) {\n      _createSelectionOverlay();\n    }\n\n    _selectionOverlay!.toolbarLocation = location;\n    // TODO(Renzo-Olivares): Remove the logic below that does a runtimeType\n    // check for TextSelectionHandleControls when TextSelectionHandleControls\n    // is fully removed, see: https://github.com/flutter/flutter/pull/124262.\n    if (widget.selectionControls is! TextSelectionHandleControls) {\n      _selectionOverlay!.showToolbar();\n      return true;\n    }\n\n    _selectionOverlay!.hideToolbar();\n\n    _selectionOverlay!.showToolbar(\n      context: context,\n      contextMenuBuilder: (BuildContext context) {\n        return widget.contextMenuBuilder!(context, this);\n      },\n    );\n    return true;\n  }\n\n  /// Sets or updates selection end edge to the `offset` location.\n  ///\n  /// A selection always contains a select start edge and selection end edge.\n  /// They can be created by calling both [_selectStartTo] and [_selectEndTo], or\n  /// use other selection APIs, such as [_selectWordAt] or [selectAll].\n  ///\n  /// This method sets or updates the selection end edge by sending\n  /// [SelectionEdgeUpdateEvent]s to the child [Selectable]s.\n  ///\n  /// If `continuous` is set to true and the update causes scrolling, the\n  /// method will continue sending the same [SelectionEdgeUpdateEvent]s to the\n  /// child [Selectable]s every frame until the scrolling finishes or a\n  /// [_finalizeSelection] is called.\n  ///\n  /// The `continuous` argument defaults to false.\n  ///\n  /// The `offset` is in global coordinates.\n  ///\n  /// Provide the `textGranularity` if the selection should not move by the default\n  /// [TextGranularity.character]. Only [TextGranularity.character] and\n  /// [TextGranularity.word] are currently supported.\n  ///\n  /// See also:\n  ///  * [_selectStartTo], which sets or updates selection start edge.\n  ///  * [_finalizeSelection], which stops the `continuous` updates.\n  ///  * [clearSelection], which clears the ongoing selection.\n  ///  * [_selectWordAt], which selects a whole word at the location.\n  ///  * [_selectParagraphAt], which selects an entire paragraph at the location.\n  ///  * [_collapseSelectionAt], which collapses the selection at the location.\n  ///  * [selectAll], which selects the entire content.\n  void _selectEndTo({\n    required Offset offset,\n    bool continuous = false,\n    TextGranularity? textGranularity,\n  }) {\n    if (!continuous) {\n      _selectable?.dispatchSelectionEvent(\n        SelectionEdgeUpdateEvent.forEnd(\n          globalPosition: offset,\n          granularity: textGranularity,\n        ),\n      );\n      return;\n    }\n    if (_selectionEndPosition != offset) {\n      _selectionEndPosition = offset;\n      _triggerSelectionEndEdgeUpdate(textGranularity: textGranularity);\n    }\n  }\n\n  /// Sets or updates selection start edge to the `offset` location.\n  ///\n  /// A selection always contains a select start edge and selection end edge.\n  /// They can be created by calling both [_selectStartTo] and [_selectEndTo], or\n  /// use other selection APIs, such as [_selectWordAt] or [selectAll].\n  ///\n  /// This method sets or updates the selection start edge by sending\n  /// [SelectionEdgeUpdateEvent]s to the child [Selectable]s.\n  ///\n  /// If `continuous` is set to true and the update causes scrolling, the\n  /// method will continue sending the same [SelectionEdgeUpdateEvent]s to the\n  /// child [Selectable]s every frame until the scrolling finishes or a\n  /// [_finalizeSelection] is called.\n  ///\n  /// The `continuous` argument defaults to false.\n  ///\n  /// The `offset` is in global coordinates.\n  ///\n  /// Provide the `textGranularity` if the selection should not move by the default\n  /// [TextGranularity.character]. Only [TextGranularity.character] and\n  /// [TextGranularity.word] are currently supported.\n  ///\n  /// See also:\n  ///  * [_selectEndTo], which sets or updates selection end edge.\n  ///  * [_finalizeSelection], which stops the `continuous` updates.\n  ///  * [clearSelection], which clears the ongoing selection.\n  ///  * [_selectWordAt], which selects a whole word at the location.\n  ///  * [_selectParagraphAt], which selects an entire paragraph at the location.\n  ///  * [_collapseSelectionAt], which collapses the selection at the location.\n  ///  * [selectAll], which selects the entire content.\n  void _selectStartTo({\n    required Offset offset,\n    bool continuous = false,\n    TextGranularity? textGranularity,\n  }) {\n    if (!continuous) {\n      _selectable?.dispatchSelectionEvent(\n        SelectionEdgeUpdateEvent.forStart(\n          globalPosition: offset,\n          granularity: textGranularity,\n        ),\n      );\n      return;\n    }\n    if (_selectionStartPosition != offset) {\n      _selectionStartPosition = offset;\n      _triggerSelectionStartEdgeUpdate(textGranularity: textGranularity);\n    }\n  }\n\n  /// Collapses the selection at the given `offset` location.\n  ///\n  /// The `offset` is in global coordinates.\n  ///\n  /// See also:\n  ///  * [_selectStartTo], which sets or updates selection start edge.\n  ///  * [_selectEndTo], which sets or updates selection end edge.\n  ///  * [_finalizeSelection], which stops the `continuous` updates.\n  ///  * [clearSelection], which clears the ongoing selection.\n  ///  * [_selectWordAt], which selects a whole word at the location.\n  ///  * [_selectParagraphAt], which selects an entire paragraph at the location.\n  ///  * [selectAll], which selects the entire content.\n  void _collapseSelectionAt({required Offset offset}) {\n    // There may be other selection ongoing.\n    _finalizeSelection();\n    _selectStartTo(offset: offset);\n    _selectEndTo(offset: offset);\n  }\n\n  /// Selects a whole word at the `offset` location.\n  ///\n  /// The `offset` is in global coordinates.\n  ///\n  /// If the whole word is already in the current selection, selection won't\n  /// change. One call [clearSelection] first if the selection needs to be\n  /// updated even if the word is already covered by the current selection.\n  ///\n  /// One can also use [_selectEndTo] or [_selectStartTo] to adjust the selection\n  /// edges after calling this method.\n  ///\n  /// See also:\n  ///  * [_selectStartTo], which sets or updates selection start edge.\n  ///  * [_selectEndTo], which sets or updates selection end edge.\n  ///  * [_finalizeSelection], which stops the `continuous` updates.\n  ///  * [clearSelection], which clears the ongoing selection.\n  ///  * [_collapseSelectionAt], which collapses the selection at the location.\n  ///  * [_selectParagraphAt], which selects an entire paragraph at the location.\n  ///  * [selectAll], which selects the entire content.\n  void _selectWordAt({required Offset offset}) {\n    // There may be other selection ongoing.\n    _finalizeSelection();\n    _selectable?.dispatchSelectionEvent(\n      SelectWordSelectionEvent(globalPosition: offset),\n    );\n  }\n\n  /// Selects the entire paragraph at the `offset` location.\n  ///\n  /// The `offset` is in global coordinates.\n  ///\n  /// If the paragraph is already in the current selection, selection won't\n  /// change. One call [clearSelection] first if the selection needs to be\n  /// updated even if the paragraph is already covered by the current selection.\n  ///\n  /// One can also use [_selectEndTo] or [_selectStartTo] to adjust the selection\n  /// edges after calling this method.\n  ///\n  /// See also:\n  ///  * [_selectStartTo], which sets or updates selection start edge.\n  ///  * [_selectEndTo], which sets or updates selection end edge.\n  ///  * [_finalizeSelection], which stops the `continuous` updates.\n  ///  * [clearSelection], which clear the ongoing selection.\n  ///  * [_selectWordAt], which selects a whole word at the location.\n  ///  * [selectAll], which selects the entire content.\n  void _selectParagraphAt({required Offset offset}) {\n    // There may be other selection ongoing.\n    _finalizeSelection();\n    _selectable?.dispatchSelectionEvent(\n      SelectParagraphSelectionEvent(globalPosition: offset),\n    );\n  }\n\n  /// Stops any ongoing selection updates.\n  ///\n  /// This method is different from [clearSelection] that it does not remove\n  /// the current selection. It only stops the continuous updates.\n  ///\n  /// A continuous update can happen as result of calling [_selectStartTo] or\n  /// [_selectEndTo] with `continuous` sets to true which causes a [Selectable]\n  /// to scroll. Calling this method will stop the update as well as the\n  /// scrolling.\n  void _finalizeSelection() {\n    _stopSelectionEndEdgeUpdate();\n    _stopSelectionStartEdgeUpdate();\n  }\n\n  /// Removes the ongoing selection for this [SelectableRegion].\n  void clearSelection() {\n    _finalizeSelection();\n    _directionalHorizontalBaseline = null;\n    _adjustingSelectionEnd = null;\n    _selectable?.dispatchSelectionEvent(const ClearSelectionEvent());\n    _updateSelectedContentIfNeeded();\n  }\n\n  Future<void> _copy() async {\n    final SelectedContent? data = _selectable?.getSelectedContent();\n    if (data == null) {\n      return;\n    }\n    await Clipboard.setData(ClipboardData(text: data.plainText));\n  }\n\n  Future<void> _share() async {\n    final SelectedContent? data = _selectable?.getSelectedContent();\n    if (data == null) {\n      return;\n    }\n    await SystemChannels.platform.invokeMethod('Share.invoke', data.plainText);\n  }\n\n  /// {@macro flutter.widgets.EditableText.getAnchors}\n  ///\n  /// See also:\n  ///\n  ///  * [contextMenuButtonItems], which provides the [ContextMenuButtonItem]s\n  ///    for the default context menu buttons.\n  TextSelectionToolbarAnchors get contextMenuAnchors {\n    if (_lastSecondaryTapDownPosition != null) {\n      final anchors = TextSelectionToolbarAnchors(\n        primaryAnchor: _lastSecondaryTapDownPosition!,\n      );\n      // Clear the state of _lastSecondaryTapDownPosition after use since a user may\n      // access contextMenuAnchors and receive invalid anchors for their context menu.\n      _lastSecondaryTapDownPosition = null;\n      return anchors;\n    }\n    final renderBox = context.findRenderObject()! as RenderBox;\n    return TextSelectionToolbarAnchors.fromSelection(\n      renderBox: renderBox,\n      startGlyphHeight: startGlyphHeight,\n      endGlyphHeight: endGlyphHeight,\n      selectionEndpoints: selectionEndpoints,\n    );\n  }\n\n  bool? _adjustingSelectionEnd;\n  bool _determineIsAdjustingSelectionEnd(bool forward) {\n    if (_adjustingSelectionEnd != null) {\n      return _adjustingSelectionEnd!;\n    }\n    final bool isReversed;\n    final SelectionPoint start = _selectionDelegate.value.startSelectionPoint!;\n    final SelectionPoint end = _selectionDelegate.value.endSelectionPoint!;\n    if (start.localPosition.dy > end.localPosition.dy) {\n      isReversed = true;\n    } else if (start.localPosition.dy < end.localPosition.dy) {\n      isReversed = false;\n    } else {\n      isReversed = start.localPosition.dx > end.localPosition.dx;\n    }\n    // Always move the selection edge that increases the selection range.\n    return _adjustingSelectionEnd = forward != isReversed;\n  }\n\n  void _granularlyExtendSelection(TextGranularity granularity, bool forward) {\n    _directionalHorizontalBaseline = null;\n    if (!_selectionDelegate.value.hasSelection) {\n      return;\n    }\n    _selectable?.dispatchSelectionEvent(\n      GranularlyExtendSelectionEvent(\n        forward: forward,\n        isEnd: _determineIsAdjustingSelectionEnd(forward),\n        granularity: granularity,\n      ),\n    );\n    _updateSelectedContentIfNeeded();\n    _selectionStatusNotifier.value = SelectableRegionSelectionStatus.changing;\n    _finalizeSelectableRegionStatus();\n  }\n\n  double? _directionalHorizontalBaseline;\n\n  void _directionallyExtendSelection(bool forward) {\n    if (!_selectionDelegate.value.hasSelection) {\n      return;\n    }\n    final bool adjustingSelectionExtend = _determineIsAdjustingSelectionEnd(\n      forward,\n    );\n    final SelectionPoint baseLinePoint = adjustingSelectionExtend\n        ? _selectionDelegate.value.endSelectionPoint!\n        : _selectionDelegate.value.startSelectionPoint!;\n    _directionalHorizontalBaseline ??= baseLinePoint.localPosition.dx;\n    final Offset globalSelectionPointOffset = MatrixUtils.transformPoint(\n      context.findRenderObject()!.getTransformTo(null),\n      Offset(_directionalHorizontalBaseline!, 0),\n    );\n    _selectable?.dispatchSelectionEvent(\n      DirectionallyExtendSelectionEvent(\n        isEnd: _adjustingSelectionEnd!,\n        direction: forward\n            ? SelectionExtendDirection.nextLine\n            : SelectionExtendDirection.previousLine,\n        dx: globalSelectionPointOffset.dx,\n      ),\n    );\n    _updateSelectedContentIfNeeded();\n    _selectionStatusNotifier.value = SelectableRegionSelectionStatus.changing;\n    _finalizeSelectableRegionStatus();\n  }\n\n  // [TextSelectionDelegate] overrides.\n\n  /// Returns the [ContextMenuButtonItem]s representing the buttons in this\n  /// platform's default selection menu.\n  ///\n  /// See also:\n  ///\n  /// * [SelectableRegion.getSelectableButtonItems], which performs a similar role,\n  ///   but for any selectable text, not just specifically SelectableRegion.\n  /// * [EditableTextState.contextMenuButtonItems], which performs a similar role\n  ///   but for content that is not just selectable but also editable.\n  /// * [contextMenuAnchors], which provides the anchor points for the default\n  ///   context menu.\n  /// * [AdaptiveTextSelectionToolbar], which builds the toolbar itself, and can\n  ///   take a list of [ContextMenuButtonItem]s with\n  ///   [AdaptiveTextSelectionToolbar.buttonItems].\n  /// * [AdaptiveTextSelectionToolbar.getAdaptiveButtons], which builds the\n  ///   button Widgets for the current platform given [ContextMenuButtonItem]s.\n  List<ContextMenuButtonItem> get contextMenuButtonItems {\n    return SelectableRegion.getSelectableButtonItems(\n      selectionGeometry: _selectionDelegate.value,\n      onCopy: () {\n        _copy();\n\n        // On Android copy should clear the selection.\n        switch (defaultTargetPlatform) {\n          case TargetPlatform.android:\n          case TargetPlatform.fuchsia:\n            clearSelection();\n            _selectionStatusNotifier.value =\n                SelectableRegionSelectionStatus.changing;\n            _finalizeSelectableRegionStatus();\n          case TargetPlatform.iOS:\n            hideToolbar(false);\n          case TargetPlatform.linux:\n          case TargetPlatform.macOS:\n          case TargetPlatform.windows:\n            hideToolbar();\n        }\n      },\n      onSelectAll: () {\n        switch (defaultTargetPlatform) {\n          case TargetPlatform.android:\n          case TargetPlatform.iOS:\n          case TargetPlatform.fuchsia:\n            selectAll(SelectionChangedCause.toolbar);\n          case TargetPlatform.linux:\n          case TargetPlatform.macOS:\n          case TargetPlatform.windows:\n            selectAll();\n            hideToolbar();\n        }\n      },\n      onShare: () {\n        _share();\n\n        // On Android, share should clear the selection.\n        switch (defaultTargetPlatform) {\n          case TargetPlatform.android:\n          case TargetPlatform.fuchsia:\n            clearSelection();\n            _selectionStatusNotifier.value =\n                SelectableRegionSelectionStatus.changing;\n            _finalizeSelectableRegionStatus();\n          case TargetPlatform.iOS:\n            hideToolbar(false);\n          case TargetPlatform.linux:\n          case TargetPlatform.macOS:\n          case TargetPlatform.windows:\n            hideToolbar();\n        }\n      },\n    )..addAll(_textProcessingActionButtonItems);\n  }\n\n  List<ContextMenuButtonItem> get _textProcessingActionButtonItems {\n    final buttonItems = <ContextMenuButtonItem>[];\n    final SelectedContent? data = _selectable?.getSelectedContent();\n    if (data == null) {\n      return buttonItems;\n    }\n\n    for (final ProcessTextAction action in _processTextActions) {\n      buttonItems.add(\n        ContextMenuButtonItem(\n          label: action.label,\n          onPressed: () async {\n            final String selectedText = data.plainText;\n            if (selectedText.isNotEmpty) {\n              await _processTextService.processTextAction(\n                action.id,\n                selectedText,\n                true,\n              );\n              hideToolbar();\n            }\n          },\n        ),\n      );\n    }\n    return buttonItems;\n  }\n\n  /// The line height at the start of the current selection.\n  double get startGlyphHeight {\n    return _selectionDelegate.value.startSelectionPoint!.lineHeight;\n  }\n\n  /// The line height at the end of the current selection.\n  double get endGlyphHeight {\n    return _selectionDelegate.value.endSelectionPoint!.lineHeight;\n  }\n\n  /// Returns the local coordinates of the endpoints of the current selection.\n  List<TextSelectionPoint> get selectionEndpoints {\n    final SelectionPoint? start = _selectionDelegate.value.startSelectionPoint;\n    final SelectionPoint? end = _selectionDelegate.value.endSelectionPoint;\n    late List<TextSelectionPoint> points;\n    final Offset startLocalPosition =\n        start?.localPosition ?? end!.localPosition;\n    final Offset endLocalPosition = end?.localPosition ?? start!.localPosition;\n    if (startLocalPosition.dy > endLocalPosition.dy) {\n      points = <TextSelectionPoint>[\n        TextSelectionPoint(endLocalPosition, TextDirection.ltr),\n        TextSelectionPoint(startLocalPosition, TextDirection.ltr),\n      ];\n    } else {\n      points = <TextSelectionPoint>[\n        TextSelectionPoint(startLocalPosition, TextDirection.ltr),\n        TextSelectionPoint(endLocalPosition, TextDirection.ltr),\n      ];\n    }\n    return points;\n  }\n\n  // [TextSelectionDelegate] overrides.\n  // TODO(justinmc): After deprecations have been removed, remove\n  // TextSelectionDelegate from this class.\n  // https://github.com/flutter/flutter/issues/111213\n\n  @Deprecated(\n    'Use `contextMenuBuilder` instead. '\n    'This feature was deprecated after v3.3.0-0.5.pre.',\n  )\n  @override\n  bool get cutEnabled => false;\n\n  @Deprecated(\n    'Use `contextMenuBuilder` instead. '\n    'This feature was deprecated after v3.3.0-0.5.pre.',\n  )\n  @override\n  bool get pasteEnabled => false;\n\n  @override\n  void hideToolbar([bool hideHandles = true]) {\n    _selectionOverlay?.hideToolbar();\n    if (hideHandles) {\n      _selectionOverlay?.hideHandles();\n    }\n  }\n\n  @override\n  void selectAll([SelectionChangedCause? cause]) {\n    clearSelection();\n    _selectable?.dispatchSelectionEvent(const SelectAllSelectionEvent());\n    if (cause == SelectionChangedCause.toolbar) {\n      _showToolbar();\n      _showHandles();\n    }\n    _updateSelectedContentIfNeeded();\n    _selectionStatusNotifier.value = SelectableRegionSelectionStatus.changing;\n    _finalizeSelectableRegionStatus();\n  }\n\n  @Deprecated(\n    'Use `contextMenuBuilder` instead. '\n    'This feature was deprecated after v3.3.0-0.5.pre.',\n  )\n  @override\n  void copySelection(SelectionChangedCause cause) {\n    _copy();\n    clearSelection();\n    _selectionStatusNotifier.value = SelectableRegionSelectionStatus.changing;\n    _finalizeSelectableRegionStatus();\n  }\n\n  @Deprecated(\n    'Use `contextMenuBuilder` instead. '\n    'This feature was deprecated after v3.3.0-0.5.pre.',\n  )\n  @override\n  TextEditingValue textEditingValue = const TextEditingValue(text: '_');\n\n  @Deprecated(\n    'Use `contextMenuBuilder` instead. '\n    'This feature was deprecated after v3.3.0-0.5.pre.',\n  )\n  @override\n  void bringIntoView(TextPosition position) {\n    /* SelectableRegion must be in view at this point. */\n  }\n\n  @Deprecated(\n    'Use `contextMenuBuilder` instead. '\n    'This feature was deprecated after v3.3.0-0.5.pre.',\n  )\n  @override\n  void cutSelection(SelectionChangedCause cause) {\n    assert(false);\n  }\n\n  @Deprecated(\n    'Use `contextMenuBuilder` instead. '\n    'This feature was deprecated after v3.3.0-0.5.pre.',\n  )\n  @override\n  void userUpdateTextEditingValue(\n    TextEditingValue value,\n    SelectionChangedCause cause,\n  ) {\n    /* SelectableRegion maintains its own state */\n  }\n\n  @Deprecated(\n    'Use `contextMenuBuilder` instead. '\n    'This feature was deprecated after v3.3.0-0.5.pre.',\n  )\n  @override\n  Future<void> pasteText(SelectionChangedCause cause) async {\n    assert(false);\n  }\n\n  // [SelectionRegistrar] override.\n\n  @override\n  void add(Selectable selectable) {\n    assert(_selectable == null);\n    _selectable = selectable;\n    _selectable!.addListener(_updateSelectionStatus);\n    _selectable!.pushHandleLayers(_startHandleLayerLink, _endHandleLayerLink);\n  }\n\n  @override\n  void remove(Selectable selectable) {\n    assert(_selectable == selectable);\n    _selectable!.removeListener(_updateSelectionStatus);\n    _selectable!.pushHandleLayers(null, null);\n    _selectable = null;\n  }\n\n  @protected\n  @override\n  void dispose() {\n    _selectable?.removeListener(_updateSelectionStatus);\n    _selectable?.pushHandleLayers(null, null);\n    _selectionDelegate.dispose();\n    _selectionStatusNotifier.dispose();\n    // In case dispose was triggered before gesture end, remove the magnifier\n    // so it doesn't remain stuck in the overlay forever.\n    _selectionOverlay?.hideMagnifier();\n    _selectionOverlay?.dispose();\n    _selectionOverlay = null;\n    widget.focusNode?.removeListener(_handleFocusChanged);\n    _localFocusNode?.removeListener(_handleFocusChanged);\n    _localFocusNode?.dispose();\n    super.dispose();\n  }\n\n  @protected\n  @override\n  Widget build(BuildContext context) {\n    assert(debugCheckHasOverlay(context));\n    Widget result = SelectableRegionSelectionStatusScope._(\n      selectionStatusNotifier: _selectionStatusNotifier,\n      child: SelectionContainer(\n        registrar: this,\n        delegate: _selectionDelegate,\n        child: widget.child,\n      ),\n    );\n    if (_webContextMenuEnabled) {\n      result = PlatformSelectableRegionContextMenu(child: result);\n    }\n    return CompositedTransformTarget(\n      link: _toolbarLayerLink,\n      child: RawGestureDetector(\n        gestures: _gestureRecognizers,\n        behavior: HitTestBehavior.translucent,\n        excludeFromSemantics: true,\n        child: Actions(\n          actions: _actions,\n          child: Focus.withExternalFocusNode(\n            includeSemantics: false,\n            focusNode: _focusNode,\n            child: result,\n          ),\n        ),\n      ),\n    );\n  }\n}\n\n/// An action that does not override any [Action.overridable] in the subtree.\n///\n/// If this action is invoked by an [Action.overridable], it will immediately\n/// invoke the [Action.overridable] and do nothing else. Otherwise, it will call\n/// [invokeAction].\nabstract class _NonOverrideAction<T extends Intent> extends ContextAction<T> {\n  Object? invokeAction(T intent, [BuildContext? context]);\n\n  @override\n  Object? invoke(T intent, [BuildContext? context]) {\n    if (callingAction != null) {\n      return callingAction!.invoke(intent);\n    }\n    return invokeAction(intent, context);\n  }\n}\n\nclass _SelectAllAction extends _NonOverrideAction<SelectAllTextIntent> {\n  _SelectAllAction(this.state);\n\n  final SelectableRegionState state;\n\n  @override\n  void invokeAction(SelectAllTextIntent intent, [BuildContext? context]) {\n    state.selectAll(SelectionChangedCause.keyboard);\n  }\n}\n\nclass _CopySelectionAction extends _NonOverrideAction<CopySelectionTextIntent> {\n  _CopySelectionAction(this.state);\n\n  final SelectableRegionState state;\n\n  @override\n  void invokeAction(CopySelectionTextIntent intent, [BuildContext? context]) {\n    state._copy();\n  }\n}\n\nclass _GranularlyExtendSelectionAction<T extends DirectionalTextEditingIntent>\n    extends _NonOverrideAction<T> {\n  _GranularlyExtendSelectionAction(this.state, {required this.granularity});\n\n  final SelectableRegionState state;\n  final TextGranularity granularity;\n\n  @override\n  void invokeAction(T intent, [BuildContext? context]) {\n    state._granularlyExtendSelection(granularity, intent.forward);\n  }\n}\n\nclass _GranularlyExtendCaretSelectionAction<\n  T extends DirectionalCaretMovementIntent\n>\n    extends _NonOverrideAction<T> {\n  _GranularlyExtendCaretSelectionAction(\n    this.state, {\n    required this.granularity,\n  });\n\n  final SelectableRegionState state;\n  final TextGranularity granularity;\n\n  @override\n  void invokeAction(T intent, [BuildContext? context]) {\n    if (intent.collapseSelection) {\n      // Selectable region never collapses selection.\n      return;\n    }\n    state._granularlyExtendSelection(granularity, intent.forward);\n  }\n}\n\nclass _DirectionallyExtendCaretSelectionAction<\n  T extends DirectionalCaretMovementIntent\n>\n    extends _NonOverrideAction<T> {\n  _DirectionallyExtendCaretSelectionAction(this.state);\n\n  final SelectableRegionState state;\n\n  @override\n  void invokeAction(T intent, [BuildContext? context]) {\n    if (intent.collapseSelection) {\n      // Selectable region never collapses selection.\n      return;\n    }\n    state._directionallyExtendSelection(intent.forward);\n  }\n}\n\n/// Signature for a widget builder that builds a context menu for the given\n/// [SelectableRegionState].\n///\n/// See also:\n///\n///  * [EditableTextContextMenuBuilder], which performs the same role for\n///    [EditableText].\ntypedef SelectableRegionContextMenuBuilder =\n    Widget Function(\n      BuildContext context,\n      SelectableRegionState selectableRegionState,\n    );\n\n/// Notifies its listeners when the [SelectableRegion] that created this object\n/// is changing or finalizes its selection.\n///\n/// To access the [_SelectableRegionSelectionStatusNotifier] from the nearest [SelectableRegion]\n/// ancestor, use [SelectableRegionSelectionStatusScope.maybeOf].\nfinal class _SelectableRegionSelectionStatusNotifier extends ChangeNotifier\n    implements ValueListenable<SelectableRegionSelectionStatus> {\n  _SelectableRegionSelectionStatusNotifier._();\n\n  SelectableRegionSelectionStatus _selectableRegionSelectionStatus =\n      SelectableRegionSelectionStatus.finalized;\n\n  /// The current value of the [SelectableRegionSelectionStatus] of the [SelectableRegion]\n  /// that owns this object.\n  ///\n  /// Defaults to [SelectableRegionSelectionStatus.finalized].\n  @override\n  SelectableRegionSelectionStatus get value => _selectableRegionSelectionStatus;\n\n  /// Sets the [SelectableRegionSelectionStatus] for the [SelectableRegion] that\n  /// owns this object.\n  ///\n  /// Listeners are notified even if the value did not change.\n  @protected\n  set value(SelectableRegionSelectionStatus newStatus) {\n    assert(\n      newStatus == SelectableRegionSelectionStatus.finalized &&\n              value == SelectableRegionSelectionStatus.changing ||\n          newStatus == SelectableRegionSelectionStatus.changing,\n      'Attempting to finalize the selection when it is already finalized.',\n    );\n    _selectableRegionSelectionStatus = newStatus;\n    notifyListeners();\n  }\n}\n\n/// Notifies its listeners when the selection under a [SelectableRegion] or\n/// [SelectionArea] is being changed or finalized.\n///\n/// Use [SelectableRegionSelectionStatusScope.maybeOf], to access the [ValueListenable] of type\n/// [SelectableRegionSelectionStatus] under a [SelectableRegion]. Its listeners\n/// will be called even when the value of the [SelectableRegionSelectionStatus]\n/// does not change.\nfinal class SelectableRegionSelectionStatusScope extends InheritedWidget {\n  const SelectableRegionSelectionStatusScope._({\n    required this.selectionStatusNotifier,\n    required super.child,\n  });\n\n  /// Tracks updates to the [SelectableRegionSelectionStatus] of the owning\n  /// [SelectableRegion].\n  ///\n  /// Listeners will be called even when the value of the [SelectableRegionSelectionStatus]\n  /// does not change. The selection under the [SelectableRegion] still may have changed.\n  final ValueListenable<SelectableRegionSelectionStatus>\n  selectionStatusNotifier;\n\n  /// The closest instance of this class that encloses the given context.\n  ///\n  /// If there is no enclosing [SelectableRegion] or [SelectionArea] widget, then null is\n  /// returned.\n  ///\n  /// Calling this method will create a dependency on the closest\n  /// [SelectableRegionSelectionStatusScope] in the [context], if there is one.\n  static ValueListenable<SelectableRegionSelectionStatus>? maybeOf(\n    BuildContext context,\n  ) {\n    return context\n        .dependOnInheritedWidgetOfExactType<\n          SelectableRegionSelectionStatusScope\n        >()\n        ?.selectionStatusNotifier;\n  }\n\n  @override\n  bool updateShouldNotify(SelectableRegionSelectionStatusScope oldWidget) {\n    return selectionStatusNotifier != oldWidget.selectionStatusNotifier;\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/selectable_text/selectable_text.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'dart:ui' as ui show BoxHeightStyle, BoxWidthStyle;\n\nimport 'package:PiliPlus/common/widgets/flutter/selectable_text/text_selection.dart';\nimport 'package:flutter/cupertino.dart'\n    hide TextSelectionGestureDetectorBuilder;\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart'\n    hide SelectableText, TextSelectionGestureDetectorBuilder;\nimport 'package:flutter/rendering.dart';\nimport 'package:flutter/scheduler.dart';\n\nclass _TextSpanEditingController extends TextEditingController {\n  _TextSpanEditingController({required TextSpan textSpan})\n    : _textSpan = textSpan,\n      super(text: textSpan.toPlainText(includeSemanticsLabels: false));\n\n  final TextSpan _textSpan;\n\n  @override\n  TextSpan buildTextSpan({\n    required BuildContext context,\n    TextStyle? style,\n    required bool withComposing,\n  }) {\n    // This does not care about composing.\n    return TextSpan(style: style, children: <TextSpan>[_textSpan]);\n  }\n\n  @override\n  set text(String? newText) {\n    // This should never be reached.\n    throw UnimplementedError();\n  }\n}\n\nclass _SelectableTextSelectionGestureDetectorBuilder\n    extends CustomTextSelectionGestureDetectorBuilder {\n  _SelectableTextSelectionGestureDetectorBuilder({\n    required _SelectableTextState state,\n  }) : _state = state,\n       super(delegate: state);\n\n  final _SelectableTextState _state;\n\n  @override\n  void onSingleTapUp(TapDragUpDetails details) {\n    if (!delegate.selectionEnabled) {\n      return;\n    }\n    super.onSingleTapUp(details);\n    _state.widget.onTap?.call();\n  }\n}\n\n/// A run of selectable text with a single style.\n///\n/// Consider using [SelectionArea] or [SelectableRegion] instead, which enable\n/// selection on a widget subtree, including but not limited to [Text] widgets.\n///\n/// The [SelectableText] widget displays a string of text with a single style.\n/// The string might break across multiple lines or might all be displayed on\n/// the same line depending on the layout constraints.\n///\n/// {@youtube 560 315 https://www.youtube.com/watch?v=ZSU3ZXOs6hc}\n///\n/// The [style] argument is optional. When omitted, the text will use the style\n/// from the closest enclosing [DefaultTextStyle]. If the given style's\n/// [TextStyle.inherit] property is true (the default), the given style will\n/// be merged with the closest enclosing [DefaultTextStyle]. This merging\n/// behavior is useful, for example, to make the text bold while using the\n/// default font family and size.\n///\n/// {@macro flutter.material.textfield.wantKeepAlive}\n///\n/// {@tool snippet}\n///\n/// ```dart\n/// const SelectableText(\n///   'Hello! How are you?',\n///   textAlign: TextAlign.center,\n///   style: TextStyle(fontWeight: FontWeight.bold),\n/// )\n/// ```\n/// {@end-tool}\n///\n/// Using the [SelectableText.rich] constructor, the [SelectableText] widget can\n/// display a paragraph with differently styled [TextSpan]s. The sample\n/// that follows displays \"Hello beautiful world\" with different styles\n/// for each word.\n///\n/// {@tool snippet}\n///\n/// ```dart\n/// const SelectableText.rich(\n///   TextSpan(\n///     text: 'Hello', // default text style\n///     children: <TextSpan>[\n///       TextSpan(text: ' beautiful ', style: TextStyle(fontStyle: FontStyle.italic)),\n///       TextSpan(text: 'world', style: TextStyle(fontWeight: FontWeight.bold)),\n///     ],\n///   ),\n/// )\n/// ```\n/// {@end-tool}\n///\n/// ## Interactivity\n///\n/// To make [SelectableText] react to touch events, use callback [onTap] to achieve\n/// the desired behavior.\n///\n/// ## Scrolling Considerations\n///\n/// If this [SelectableText] is not a descendant of [Scaffold] and is being used\n/// within a [Scrollable] or nested [Scrollable]s, consider placing a\n/// [ScrollNotificationObserver] above the root [Scrollable] that contains this\n/// [SelectableText] to ensure proper scroll coordination for [SelectableText]\n/// and its components like [TextSelectionOverlay].\n///\n/// See also:\n///\n///  * [Text], which is the non selectable version of this widget.\n///  * [TextField], which is the editable version of this widget.\n///  * [SelectionArea], which enables the selection of multiple [Text] widgets\n///    and of other widgets.\nclass SelectableText extends StatefulWidget {\n  /// Creates a selectable text widget.\n  ///\n  /// If the [style] argument is null, the text will use the style from the\n  /// closest enclosing [DefaultTextStyle].\n  ///\n\n  /// If the [showCursor], [autofocus], [dragStartBehavior],\n  /// [selectionHeightStyle], [selectionWidthStyle] and [data] arguments are\n  /// specified, the [maxLines] argument must be greater than zero.\n  const SelectableText(\n    String this.data, {\n    super.key,\n    this.focusNode,\n    this.style,\n    this.strutStyle,\n    this.textAlign,\n    this.textDirection,\n    @Deprecated(\n      'Use textScaler instead. '\n      'Use of textScaleFactor was deprecated in preparation for the upcoming nonlinear text scaling support. '\n      'This feature was deprecated after v3.12.0-2.0.pre.',\n    )\n    this.textScaleFactor,\n    this.textScaler,\n    this.showCursor = false,\n    this.autofocus = false,\n    @Deprecated(\n      'Use `contextMenuBuilder` instead. '\n      'This feature was deprecated after v3.3.0-0.5.pre.',\n    )\n    this.toolbarOptions,\n    this.minLines,\n    this.maxLines,\n    this.cursorWidth = 2.0,\n    this.cursorHeight,\n    this.cursorRadius,\n    this.cursorColor,\n    this.selectionColor,\n    this.selectionHeightStyle,\n    this.selectionWidthStyle,\n    this.dragStartBehavior = DragStartBehavior.start,\n    this.enableInteractiveSelection = true,\n    this.selectionControls,\n    this.onTap,\n    this.scrollPhysics,\n    this.scrollBehavior,\n    this.semanticsLabel,\n    this.textHeightBehavior,\n    this.textWidthBasis,\n    this.onSelectionChanged,\n    this.contextMenuBuilder = _defaultContextMenuBuilder,\n    this.magnifierConfiguration,\n  }) : assert(maxLines == null || maxLines > 0),\n       assert(minLines == null || minLines > 0),\n       assert(\n         (maxLines == null) || (minLines == null) || (maxLines >= minLines),\n         \"minLines can't be greater than maxLines\",\n       ),\n       assert(\n         textScaler == null || textScaleFactor == null,\n         'textScaleFactor is deprecated and cannot be specified when textScaler is specified.',\n       ),\n       textSpan = null;\n\n  /// Creates a selectable text widget with a [TextSpan].\n  ///\n  /// The [TextSpan.children] attribute of the [textSpan] parameter must only\n  /// contain [TextSpan]s. Other types of [InlineSpan] are not allowed.\n  const SelectableText.rich(\n    TextSpan this.textSpan, {\n    super.key,\n    this.focusNode,\n    this.style,\n    this.strutStyle,\n    this.textAlign,\n    this.textDirection,\n    @Deprecated(\n      'Use textScaler instead. '\n      'Use of textScaleFactor was deprecated in preparation for the upcoming nonlinear text scaling support. '\n      'This feature was deprecated after v3.12.0-2.0.pre.',\n    )\n    this.textScaleFactor,\n    this.textScaler,\n    this.showCursor = false,\n    this.autofocus = false,\n    @Deprecated(\n      'Use `contextMenuBuilder` instead. '\n      'This feature was deprecated after v3.3.0-0.5.pre.',\n    )\n    this.toolbarOptions,\n    this.minLines,\n    this.maxLines,\n    this.cursorWidth = 2.0,\n    this.cursorHeight,\n    this.cursorRadius,\n    this.cursorColor,\n    this.selectionColor,\n    this.selectionHeightStyle,\n    this.selectionWidthStyle,\n    this.dragStartBehavior = DragStartBehavior.start,\n    this.enableInteractiveSelection = true,\n    this.selectionControls,\n    this.onTap,\n    this.scrollPhysics,\n    this.scrollBehavior,\n    this.semanticsLabel,\n    this.textHeightBehavior,\n    this.textWidthBasis,\n    this.onSelectionChanged,\n    this.contextMenuBuilder = _defaultContextMenuBuilder,\n    this.magnifierConfiguration,\n  }) : assert(maxLines == null || maxLines > 0),\n       assert(minLines == null || minLines > 0),\n       assert(\n         (maxLines == null) || (minLines == null) || (maxLines >= minLines),\n         \"minLines can't be greater than maxLines\",\n       ),\n       assert(\n         textScaler == null || textScaleFactor == null,\n         'textScaleFactor is deprecated and cannot be specified when textScaler is specified.',\n       ),\n       data = null;\n\n  /// The text to display.\n  ///\n  /// This will be null if a [textSpan] is provided instead.\n  final String? data;\n\n  /// The text to display as a [TextSpan].\n  ///\n  /// This will be null if [data] is provided instead.\n  final TextSpan? textSpan;\n\n  /// Defines the focus for this widget.\n  ///\n  /// Text is only selectable when widget is focused.\n  ///\n  /// The [focusNode] is a long-lived object that's typically managed by a\n  /// [StatefulWidget] parent. See [FocusNode] for more information.\n  ///\n  /// To give the focus to this widget, provide a [focusNode] and then\n  /// use the current [FocusScope] to request the focus:\n  ///\n  /// ```dart\n  /// FocusScope.of(context).requestFocus(myFocusNode);\n  /// ```\n  ///\n  /// This happens automatically when the widget is tapped.\n  ///\n  /// To be notified when the widget gains or loses the focus, add a listener\n  /// to the [focusNode]:\n  ///\n  /// ```dart\n  /// myFocusNode.addListener(() { print(myFocusNode.hasFocus); });\n  /// ```\n  ///\n  /// If null, this widget will create its own [FocusNode] with\n  /// [FocusNode.skipTraversal] parameter set to `true`, which causes the widget\n  /// to be skipped over during focus traversal.\n  final FocusNode? focusNode;\n\n  /// The style to use for the text.\n  ///\n  /// If null, defaults [DefaultTextStyle] of context.\n  final TextStyle? style;\n\n  /// {@macro flutter.widgets.editableText.strutStyle}\n  final StrutStyle? strutStyle;\n\n  /// {@macro flutter.widgets.editableText.textAlign}\n  final TextAlign? textAlign;\n\n  /// {@macro flutter.widgets.editableText.textDirection}\n  final TextDirection? textDirection;\n\n  /// {@macro flutter.widgets.editableText.textScaleFactor}\n  @Deprecated(\n    'Use textScaler instead. '\n    'Use of textScaleFactor was deprecated in preparation for the upcoming nonlinear text scaling support. '\n    'This feature was deprecated after v3.12.0-2.0.pre.',\n  )\n  final double? textScaleFactor;\n\n  /// {@macro flutter.painting.textPainter.textScaler}\n  final TextScaler? textScaler;\n\n  /// {@macro flutter.widgets.editableText.autofocus}\n  final bool autofocus;\n\n  /// {@macro flutter.widgets.editableText.minLines}\n  final int? minLines;\n\n  /// {@macro flutter.widgets.editableText.maxLines}\n  final int? maxLines;\n\n  /// {@macro flutter.widgets.editableText.showCursor}\n  final bool showCursor;\n\n  /// {@macro flutter.widgets.editableText.cursorWidth}\n  final double cursorWidth;\n\n  /// {@macro flutter.widgets.editableText.cursorHeight}\n  final double? cursorHeight;\n\n  /// {@macro flutter.widgets.editableText.cursorRadius}\n  final Radius? cursorRadius;\n\n  /// The color of the cursor.\n  ///\n  /// The cursor indicates the current text insertion point.\n  ///\n  /// If null then [DefaultSelectionStyle.cursorColor] is used. If that is also\n  /// null and [ThemeData.platform] is [TargetPlatform.iOS] or\n  /// [TargetPlatform.macOS], then [CupertinoThemeData.primaryColor] is used.\n  /// Otherwise [ColorScheme.primary] of [ThemeData.colorScheme] is used.\n  final Color? cursorColor;\n\n  /// The color to use when painting the selection.\n  ///\n  /// If this property is null, this widget gets the selection color from the\n  /// inherited [DefaultSelectionStyle] (if any); if none, the selection\n  /// color is derived from the [CupertinoThemeData.primaryColor] on\n  /// Apple platforms and [ColorScheme.primary] of [ThemeData.colorScheme] on\n  /// other platforms.\n  final Color? selectionColor;\n\n  /// Controls how tall the selection highlight boxes are computed to be.\n  ///\n  /// See [ui.BoxHeightStyle] for details on available styles.\n  final ui.BoxHeightStyle? selectionHeightStyle;\n\n  /// Controls how wide the selection highlight boxes are computed to be.\n  ///\n  /// See [ui.BoxWidthStyle] for details on available styles.\n  final ui.BoxWidthStyle? selectionWidthStyle;\n\n  /// {@macro flutter.widgets.editableText.enableInteractiveSelection}\n  final bool enableInteractiveSelection;\n\n  /// {@macro flutter.widgets.editableText.selectionControls}\n  final TextSelectionControls? selectionControls;\n\n  /// {@macro flutter.widgets.scrollable.dragStartBehavior}\n  final DragStartBehavior dragStartBehavior;\n\n  /// Configuration of toolbar options.\n  ///\n  /// Paste and cut will be disabled regardless.\n  ///\n  /// If not set, select all and copy will be enabled by default.\n  @Deprecated(\n    'Use `contextMenuBuilder` instead. '\n    'This feature was deprecated after v3.3.0-0.5.pre.',\n  )\n  final ToolbarOptions? toolbarOptions;\n\n  /// {@macro flutter.widgets.editableText.selectionEnabled}\n  bool get selectionEnabled => enableInteractiveSelection;\n\n  /// Called when the user taps on this selectable text.\n  ///\n  /// The selectable text builds a [GestureDetector] to handle input events like tap,\n  /// to trigger focus requests, to move the caret, adjust the selection, etc.\n  /// Handling some of those events by wrapping the selectable text with a competing\n  /// GestureDetector is problematic.\n  ///\n  /// To unconditionally handle taps, without interfering with the selectable text's\n  /// internal gesture detector, provide this callback.\n  ///\n  /// To be notified when the text field gains or loses the focus, provide a\n  /// [focusNode] and add a listener to that.\n  ///\n  /// To listen to arbitrary pointer events without competing with the\n  /// selectable text's internal gesture detector, use a [Listener].\n  final GestureTapCallback? onTap;\n\n  /// {@macro flutter.widgets.editableText.scrollPhysics}\n  final ScrollPhysics? scrollPhysics;\n\n  /// {@macro flutter.widgets.editableText.scrollBehavior}\n  final ScrollBehavior? scrollBehavior;\n\n  /// {@macro flutter.widgets.Text.semanticsLabel}\n  final String? semanticsLabel;\n\n  /// {@macro dart.ui.textHeightBehavior}\n  final TextHeightBehavior? textHeightBehavior;\n\n  /// {@macro flutter.painting.textPainter.textWidthBasis}\n  final TextWidthBasis? textWidthBasis;\n\n  /// {@macro flutter.widgets.editableText.onSelectionChanged}\n  final SelectionChangedCallback? onSelectionChanged;\n\n  /// {@macro flutter.widgets.EditableText.contextMenuBuilder}\n  final EditableTextContextMenuBuilder? contextMenuBuilder;\n\n  static Widget _defaultContextMenuBuilder(\n    BuildContext context,\n    EditableTextState editableTextState,\n  ) {\n    return AdaptiveTextSelectionToolbar.editableText(\n      editableTextState: editableTextState,\n    );\n  }\n\n  /// The configuration for the magnifier used when the text is selected.\n  ///\n  /// By default, builds a [CupertinoTextMagnifier] on iOS and [TextMagnifier]\n  /// on Android, and builds nothing on all other platforms. To suppress the\n  /// magnifier, consider passing [TextMagnifierConfiguration.disabled].\n  ///\n  /// {@macro flutter.widgets.magnifier.intro}\n  final TextMagnifierConfiguration? magnifierConfiguration;\n\n  @override\n  State<SelectableText> createState() => _SelectableTextState();\n\n  @override\n  void debugFillProperties(DiagnosticPropertiesBuilder properties) {\n    super.debugFillProperties(properties);\n    properties\n      ..add(\n        DiagnosticsProperty<String>('data', data, defaultValue: null),\n      )\n      ..add(\n        DiagnosticsProperty<String>(\n          'semanticsLabel',\n          semanticsLabel,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<FocusNode>(\n          'focusNode',\n          focusNode,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<TextStyle>('style', style, defaultValue: null),\n      )\n      ..add(\n        DiagnosticsProperty<bool>('autofocus', autofocus, defaultValue: false),\n      )\n      ..add(\n        DiagnosticsProperty<bool>(\n          'showCursor',\n          showCursor,\n          defaultValue: false,\n        ),\n      )\n      ..add(IntProperty('minLines', minLines, defaultValue: null))\n      ..add(IntProperty('maxLines', maxLines, defaultValue: null))\n      ..add(\n        EnumProperty<TextAlign>('textAlign', textAlign, defaultValue: null),\n      )\n      ..add(\n        EnumProperty<TextDirection>(\n          'textDirection',\n          textDirection,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DoubleProperty('textScaleFactor', textScaleFactor, defaultValue: null),\n      )\n      ..add(\n        DiagnosticsProperty<TextScaler>(\n          'textScaler',\n          textScaler,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DoubleProperty('cursorWidth', cursorWidth, defaultValue: 2.0),\n      )\n      ..add(\n        DoubleProperty('cursorHeight', cursorHeight, defaultValue: null),\n      )\n      ..add(\n        DiagnosticsProperty<Radius>(\n          'cursorRadius',\n          cursorRadius,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<Color>(\n          'cursorColor',\n          cursorColor,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<Color>(\n          'selectionColor',\n          selectionColor,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        FlagProperty(\n          'selectionEnabled',\n          value: selectionEnabled,\n          defaultValue: true,\n          ifFalse: 'selection disabled',\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<TextSelectionControls>(\n          'selectionControls',\n          selectionControls,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<ScrollPhysics>(\n          'scrollPhysics',\n          scrollPhysics,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<ScrollBehavior>(\n          'scrollBehavior',\n          scrollBehavior,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<TextHeightBehavior>(\n          'textHeightBehavior',\n          textHeightBehavior,\n          defaultValue: null,\n        ),\n      );\n  }\n}\n\nclass _SelectableTextState extends State<SelectableText>\n    implements TextSelectionGestureDetectorBuilderDelegate {\n  EditableTextState? get _editableText => editableTextKey.currentState;\n\n  late _TextSpanEditingController _controller;\n\n  FocusNode? _focusNode;\n  FocusNode get _effectiveFocusNode =>\n      widget.focusNode ?? (_focusNode ??= FocusNode(skipTraversal: true));\n\n  bool _showSelectionHandles = false;\n\n  late _SelectableTextSelectionGestureDetectorBuilder\n  _selectionGestureDetectorBuilder;\n\n  // API for TextSelectionGestureDetectorBuilderDelegate.\n  @override\n  late bool forcePressEnabled;\n\n  @override\n  final GlobalKey<EditableTextState> editableTextKey =\n      GlobalKey<EditableTextState>();\n\n  @override\n  bool get selectionEnabled => widget.selectionEnabled;\n  // End of API for TextSelectionGestureDetectorBuilderDelegate.\n\n  @override\n  void initState() {\n    super.initState();\n    _selectionGestureDetectorBuilder =\n        _SelectableTextSelectionGestureDetectorBuilder(state: this);\n    _controller = _TextSpanEditingController(\n      textSpan: widget.textSpan ?? TextSpan(text: widget.data),\n    );\n    _controller.addListener(_onControllerChanged);\n    _effectiveFocusNode.addListener(_handleFocusChanged);\n  }\n\n  @override\n  void didUpdateWidget(SelectableText oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (widget.data != oldWidget.data ||\n        widget.textSpan != oldWidget.textSpan) {\n      _controller\n        ..removeListener(_onControllerChanged)\n        ..dispose();\n      _controller = _TextSpanEditingController(\n        textSpan: widget.textSpan ?? TextSpan(text: widget.data),\n      );\n      _controller.addListener(_onControllerChanged);\n    }\n    if (widget.focusNode != oldWidget.focusNode) {\n      (oldWidget.focusNode ?? _focusNode)?.removeListener(_handleFocusChanged);\n      (widget.focusNode ?? _focusNode)?.addListener(_handleFocusChanged);\n    }\n    if (_effectiveFocusNode.hasFocus && _controller.selection.isCollapsed) {\n      _showSelectionHandles = false;\n    } else {\n      _showSelectionHandles = true;\n    }\n  }\n\n  @override\n  void dispose() {\n    _effectiveFocusNode.removeListener(_handleFocusChanged);\n    _focusNode?.dispose();\n    _controller.dispose();\n    super.dispose();\n  }\n\n  void _onControllerChanged() {\n    final bool showSelectionHandles =\n        !_effectiveFocusNode.hasFocus || !_controller.selection.isCollapsed;\n    if (showSelectionHandles == _showSelectionHandles) {\n      return;\n    }\n    setState(() {\n      _showSelectionHandles = showSelectionHandles;\n    });\n  }\n\n  void _handleFocusChanged() {\n    if (!_effectiveFocusNode.hasFocus &&\n        SchedulerBinding.instance.lifecycleState == AppLifecycleState.resumed) {\n      // We should only clear the selection when this SelectableText loses\n      // focus while the application is currently running. It is possible\n      // that the application is not currently running, for example on desktop\n      // platforms, clicking on a different window switches the focus to\n      // the new window causing the Flutter application to go inactive. In this\n      // case we want to retain the selection so it remains when we return to\n      // the Flutter application.\n      _controller.value = TextEditingValue(text: _controller.value.text);\n    }\n  }\n\n  void _handleSelectionChanged(\n    TextSelection selection,\n    SelectionChangedCause? cause,\n  ) {\n    final bool willShowSelectionHandles = _shouldShowSelectionHandles(cause);\n    if (willShowSelectionHandles != _showSelectionHandles) {\n      setState(() {\n        _showSelectionHandles = willShowSelectionHandles;\n      });\n    }\n\n    widget.onSelectionChanged?.call(selection, cause);\n\n    switch (Theme.of(context).platform) {\n      case TargetPlatform.iOS:\n      case TargetPlatform.macOS:\n        if (cause == SelectionChangedCause.longPress) {\n          _editableText?.bringIntoView(selection.base);\n        }\n        return;\n      case TargetPlatform.android:\n      case TargetPlatform.fuchsia:\n      case TargetPlatform.linux:\n      case TargetPlatform.windows:\n      // Do nothing.\n    }\n  }\n\n  /// Toggle the toolbar when a selection handle is tapped.\n  void _handleSelectionHandleTapped() {\n    if (_controller.selection.isCollapsed) {\n      _editableText!.toggleToolbar();\n    }\n  }\n\n  bool _shouldShowSelectionHandles(SelectionChangedCause? cause) {\n    // When the text field is activated by something that doesn't trigger the\n    // selection overlay, we shouldn't show the handles either.\n    if (!_selectionGestureDetectorBuilder.shouldShowSelectionToolbar) {\n      return false;\n    }\n\n    if (_controller.selection.isCollapsed) {\n      return false;\n    }\n\n    if (cause == SelectionChangedCause.keyboard) {\n      return false;\n    }\n\n    if (cause == SelectionChangedCause.longPress) {\n      return true;\n    }\n\n    if (_controller.text.isNotEmpty) {\n      return true;\n    }\n\n    return false;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    // TODO(garyq): Assert to block WidgetSpans from being used here are removed,\n    // but we still do not yet have nice handling of things like carets, clipboard,\n    // and other features. We should add proper support. Currently, caret handling\n    // is blocked on SkParagraph switch and https://github.com/flutter/engine/pull/27010\n    // should be landed in SkParagraph after the switch is complete.\n    assert(debugCheckHasMediaQuery(context));\n    assert(debugCheckHasDirectionality(context));\n    assert(\n      !(widget.style != null &&\n          !widget.style!.inherit &&\n          (widget.style!.fontSize == null ||\n              widget.style!.textBaseline == null)),\n      'inherit false style must supply fontSize and textBaseline',\n    );\n\n    final ThemeData theme = Theme.of(context);\n    final DefaultSelectionStyle selectionStyle = DefaultSelectionStyle.of(\n      context,\n    );\n    final FocusNode focusNode = _effectiveFocusNode;\n\n    TextSelectionControls? textSelectionControls = widget.selectionControls;\n    final bool paintCursorAboveText;\n    final bool cursorOpacityAnimates;\n    Offset? cursorOffset;\n    final Color cursorColor;\n    final Color selectionColor;\n    Radius? cursorRadius = widget.cursorRadius;\n\n    switch (theme.platform) {\n      case TargetPlatform.iOS:\n        final CupertinoThemeData cupertinoTheme = CupertinoTheme.of(context);\n        forcePressEnabled = true;\n        textSelectionControls ??= cupertinoTextSelectionHandleControls;\n        paintCursorAboveText = true;\n        cursorOpacityAnimates = true;\n        cursorColor =\n            widget.cursorColor ??\n            selectionStyle.cursorColor ??\n            cupertinoTheme.primaryColor;\n        selectionColor =\n            selectionStyle.selectionColor ??\n            cupertinoTheme.primaryColor.withValues(alpha: 0.40);\n        cursorRadius ??= const Radius.circular(2.0);\n        cursorOffset = Offset(\n          iOSHorizontalOffset / MediaQuery.devicePixelRatioOf(context),\n          0,\n        );\n\n      case TargetPlatform.macOS:\n        final CupertinoThemeData cupertinoTheme = CupertinoTheme.of(context);\n        forcePressEnabled = false;\n        textSelectionControls ??= cupertinoDesktopTextSelectionHandleControls;\n        paintCursorAboveText = true;\n        cursorOpacityAnimates = true;\n        cursorColor =\n            widget.cursorColor ??\n            selectionStyle.cursorColor ??\n            cupertinoTheme.primaryColor;\n        selectionColor =\n            selectionStyle.selectionColor ??\n            cupertinoTheme.primaryColor.withValues(alpha: 0.40);\n        cursorRadius ??= const Radius.circular(2.0);\n        cursorOffset = Offset(\n          iOSHorizontalOffset / MediaQuery.devicePixelRatioOf(context),\n          0,\n        );\n\n      case TargetPlatform.android:\n      case TargetPlatform.fuchsia:\n        forcePressEnabled = false;\n        textSelectionControls ??= materialTextSelectionHandleControls;\n        paintCursorAboveText = false;\n        cursorOpacityAnimates = false;\n        cursorColor =\n            widget.cursorColor ??\n            selectionStyle.cursorColor ??\n            theme.colorScheme.primary;\n        selectionColor =\n            selectionStyle.selectionColor ??\n            theme.colorScheme.primary.withValues(alpha: 0.40);\n\n      case TargetPlatform.linux:\n      case TargetPlatform.windows:\n        forcePressEnabled = false;\n        textSelectionControls ??= desktopTextSelectionHandleControls;\n        paintCursorAboveText = false;\n        cursorOpacityAnimates = false;\n        cursorColor =\n            widget.cursorColor ??\n            selectionStyle.cursorColor ??\n            theme.colorScheme.primary;\n        selectionColor =\n            selectionStyle.selectionColor ??\n            theme.colorScheme.primary.withValues(alpha: 0.40);\n    }\n\n    final DefaultTextStyle defaultTextStyle = DefaultTextStyle.of(context);\n    TextStyle? effectiveTextStyle = widget.style;\n    if (effectiveTextStyle == null || effectiveTextStyle.inherit) {\n      effectiveTextStyle = defaultTextStyle.style.merge(\n        widget.style ?? _controller._textSpan.style,\n      );\n    }\n    final TextScaler? effectiveScaler =\n        widget.textScaler ??\n        switch (widget.textScaleFactor) {\n          null => null,\n          final double textScaleFactor => TextScaler.linear(textScaleFactor),\n        };\n    final Widget child = RepaintBoundary(\n      child: EditableText(\n        key: editableTextKey,\n        style: effectiveTextStyle,\n        readOnly: true,\n        toolbarOptions: widget.toolbarOptions,\n        textWidthBasis:\n            widget.textWidthBasis ?? defaultTextStyle.textWidthBasis,\n        textHeightBehavior:\n            widget.textHeightBehavior ?? defaultTextStyle.textHeightBehavior,\n        showSelectionHandles: _showSelectionHandles,\n        showCursor: widget.showCursor,\n        controller: _controller,\n        focusNode: focusNode,\n        strutStyle: widget.strutStyle ?? const StrutStyle(),\n        textAlign:\n            widget.textAlign ?? defaultTextStyle.textAlign ?? TextAlign.start,\n        textDirection: widget.textDirection,\n        textScaler: effectiveScaler,\n        autofocus: widget.autofocus,\n        forceLine: false,\n        minLines: widget.minLines,\n        maxLines: widget.maxLines ?? defaultTextStyle.maxLines,\n        selectionColor: widget.selectionColor ?? selectionColor,\n        selectionControls: widget.selectionEnabled\n            ? textSelectionControls\n            : null,\n        onSelectionChanged: _handleSelectionChanged,\n        onSelectionHandleTapped: _handleSelectionHandleTapped,\n        rendererIgnoresPointer: true,\n        cursorWidth: widget.cursorWidth,\n        cursorHeight: widget.cursorHeight,\n        cursorRadius: cursorRadius,\n        cursorColor: cursorColor,\n        selectionHeightStyle: widget.selectionHeightStyle,\n        selectionWidthStyle: widget.selectionWidthStyle,\n        cursorOpacityAnimates: cursorOpacityAnimates,\n        cursorOffset: cursorOffset,\n        paintCursorAboveText: paintCursorAboveText,\n        backgroundCursorColor: CupertinoColors.inactiveGray,\n        enableInteractiveSelection: widget.enableInteractiveSelection,\n        magnifierConfiguration:\n            widget.magnifierConfiguration ??\n            TextMagnifier.adaptiveMagnifierConfiguration,\n        dragStartBehavior: widget.dragStartBehavior,\n        scrollPhysics: widget.scrollPhysics,\n        scrollBehavior: widget.scrollBehavior,\n        autofillHints: null,\n        contextMenuBuilder: widget.contextMenuBuilder,\n      ),\n    );\n\n    return Semantics(\n      label: widget.semanticsLabel,\n      excludeSemantics: widget.semanticsLabel != null,\n      onLongPress: () {\n        _effectiveFocusNode.requestFocus();\n      },\n      child: _selectionGestureDetectorBuilder.buildGestureDetector(\n        behavior: HitTestBehavior.translucent,\n        child: child,\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/selectable_text/selection_area.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'package:PiliPlus/common/widgets/flutter/selectable_text/selectable_region.dart';\nimport 'package:flutter/cupertino.dart'\n    hide\n        SelectableRegion,\n        SelectableRegionState,\n        SelectableRegionContextMenuBuilder;\nimport 'package:flutter/material.dart'\n    hide\n        SelectionArea,\n        SelectableRegion,\n        SelectableRegionState,\n        SelectableRegionContextMenuBuilder;\nimport 'package:flutter/rendering.dart';\n\n/// A widget that introduces an area for user selections with adaptive selection\n/// controls.\n///\n/// This widget creates a [SelectableRegion] with platform-adaptive selection\n/// controls.\n///\n/// Flutter widgets are not selectable by default. To enable selection for\n/// a specific screen, consider wrapping the body of the [Route] with a\n/// [SelectionArea].\n///\n/// The [SelectionArea] widget must have a [Localizations] ancestor that\n/// contains a [MaterialLocalizations] delegate; using the [MaterialApp] widget\n/// ensures that such an ancestor is present.\n///\n/// {@tool dartpad}\n/// This example shows how to make a screen selectable.\n///\n/// ** See code in examples/api/lib/material/selection_area/selection_area.0.dart **\n/// {@end-tool}\n///\n/// See also:\n///\n///  * [SelectableRegion], which provides an overview of the selection system.\n///  * [SelectableText], which enables selection on a single run of text.\n///  * [SelectionListener], which enables accessing the [SelectionDetails] of\n///    the selectable subtree it wraps.\nclass SelectionArea extends StatefulWidget {\n  /// Creates a [SelectionArea].\n  ///\n  /// If [selectionControls] is null, a platform specific one is used.\n  const SelectionArea({\n    super.key,\n    this.focusNode,\n    this.selectionControls,\n    this.contextMenuBuilder = _defaultContextMenuBuilder,\n    this.magnifierConfiguration,\n    this.onSelectionChanged,\n    required this.child,\n  });\n\n  /// The configuration for the magnifier in the selection region.\n  ///\n  /// By default, builds a [CupertinoTextMagnifier] on iOS and [TextMagnifier]\n  /// on Android, and builds nothing on all other platforms. To suppress the\n  /// magnifier, consider passing [TextMagnifierConfiguration.disabled].\n  ///\n  /// {@macro flutter.widgets.magnifier.intro}\n  final TextMagnifierConfiguration? magnifierConfiguration;\n\n  /// {@macro flutter.widgets.Focus.focusNode}\n  final FocusNode? focusNode;\n\n  /// The delegate to build the selection handles and toolbar.\n  ///\n  /// If it is null, the platform specific selection control is used.\n  final TextSelectionControls? selectionControls;\n\n  /// {@macro flutter.widgets.EditableText.contextMenuBuilder}\n  ///\n  /// If not provided, will build a default menu based on the ambient\n  /// [ThemeData.platform].\n  ///\n  /// {@tool dartpad}\n  /// This example shows how to build a custom context menu for any selected\n  /// content in a SelectionArea.\n  ///\n  /// ** See code in examples/api/lib/material/context_menu/selectable_region_toolbar_builder.0.dart **\n  /// {@end-tool}\n  ///\n  /// See also:\n  ///\n  ///  * [AdaptiveTextSelectionToolbar], which is built by default.\n  final SelectableRegionContextMenuBuilder? contextMenuBuilder;\n\n  /// Called when the selected content changes.\n  final ValueChanged<SelectedContent?>? onSelectionChanged;\n\n  /// The child widget this selection area applies to.\n  ///\n  /// {@macro flutter.widgets.ProxyWidget.child}\n  final Widget child;\n\n  static Widget _defaultContextMenuBuilder(\n    BuildContext context,\n    SelectableRegionState selectableRegionState,\n  ) => AdaptiveTextSelectionToolbar.buttonItems(\n    buttonItems: selectableRegionState.contextMenuButtonItems,\n    anchors: selectableRegionState.contextMenuAnchors,\n  );\n\n  @override\n  State<StatefulWidget> createState() => SelectionAreaState();\n}\n\n/// State for a [SelectionArea].\nclass SelectionAreaState extends State<SelectionArea> {\n  final GlobalKey<SelectableRegionState> _selectableRegionKey =\n      GlobalKey<SelectableRegionState>();\n\n  /// The [State] of the [SelectableRegion] for which this [SelectionArea] wraps.\n  SelectableRegionState get selectableRegion =>\n      _selectableRegionKey.currentState!;\n\n  @protected\n  @override\n  Widget build(BuildContext context) {\n    assert(debugCheckHasMaterialLocalizations(context));\n    final TextSelectionControls controls =\n        widget.selectionControls ??\n        switch (Theme.of(context).platform) {\n          TargetPlatform.android ||\n          TargetPlatform.fuchsia => materialTextSelectionHandleControls,\n          TargetPlatform.linux ||\n          TargetPlatform.windows => desktopTextSelectionHandleControls,\n          TargetPlatform.iOS => cupertinoTextSelectionHandleControls,\n          TargetPlatform.macOS => cupertinoDesktopTextSelectionHandleControls,\n        };\n    return SelectableRegion(\n      key: _selectableRegionKey,\n      selectionControls: controls,\n      focusNode: widget.focusNode,\n      contextMenuBuilder: widget.contextMenuBuilder,\n      magnifierConfiguration:\n          widget.magnifierConfiguration ??\n          TextMagnifier.adaptiveMagnifierConfiguration,\n      onSelectionChanged: widget.onSelectionChanged,\n      child: widget.child,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/selectable_text/tap_and_drag.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'dart:async';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/gestures.dart'\n    hide TapAndHorizontalDragGestureRecognizer;\n\n// Examples can assume:\n// void setState(VoidCallback fn) { }\n// late String _last;\n\ndouble _getGlobalDistance(PointerEvent event, OffsetPair? originPosition) {\n  assert(originPosition != null);\n  final Offset offset = event.position - originPosition!.global;\n  return offset.distance;\n}\n\n// The possible states of a [BaseTapAndDragGestureRecognizer].\n//\n// The recognizer advances from [ready] to [possible] when it starts tracking\n// a pointer in [BaseTapAndDragGestureRecognizer.addAllowedPointer]. Where it advances\n// from there depends on the sequence of pointer events that is tracked by the\n// recognizer, following the initial [PointerDownEvent]:\n//\n// * If a [PointerUpEvent] has not been tracked, the recognizer stays in the [possible]\n//   state as long as it continues to track a pointer.\n// * If a [PointerMoveEvent] is tracked that has moved a sufficient global distance\n//   from the initial [PointerDownEvent] and it came before a [PointerUpEvent], then\n//   this recognizer moves from the [possible] state to [accepted].\n// * If a [PointerUpEvent] is tracked before the pointer has moved a sufficient global\n//   distance to be considered a drag, then this recognizer moves from the [possible]\n//   state to [ready].\n// * If a [PointerCancelEvent] is tracked then this recognizer moves from its current\n//   state to [ready].\n//\n// Once the recognizer has stopped tracking any remaining pointers, the recognizer\n// returns to the [ready] state.\nenum _DragState {\n  // The recognizer is ready to start recognizing a drag.\n  ready,\n\n  // The sequence of pointer events seen thus far is consistent with a drag but\n  // it has not been accepted definitively.\n  possible,\n\n  // The sequence of pointer events has been accepted definitively as a drag.\n  accepted,\n}\n\n// A mixin for [OneSequenceGestureRecognizer] that tracks the number of taps\n// that occur in a series of [PointerEvent]s and the most recent set of\n// [LogicalKeyboardKey]s pressed on the most recent tap down.\n//\n// A tap is tracked as part of a series of taps if:\n//\n// 1. The elapsed time between when a [PointerUpEvent] and the subsequent\n// [PointerDownEvent] does not exceed [kDoubleTapTimeout].\n// 2. The delta between the position tapped in the global coordinate system\n// and the position that was tapped previously must be less than or equal\n// to [kDoubleTapSlop].\n//\n// This mixin's state, i.e. the series of taps being tracked is reset when\n// a tap is tracked that does not meet any of the specifications stated above.\nmixin _TapStatusTrackerMixin on OneSequenceGestureRecognizer {\n  // Public state available to [OneSequenceGestureRecognizer].\n\n  // The [PointerDownEvent] that was most recently tracked in [addAllowedPointer].\n  //\n  // This value will be null if a [PointerDownEvent] has not been tracked yet in\n  // [addAllowedPointer] or the timer between two taps has elapsed.\n  //\n  // This value is only reset when the timer between a [PointerUpEvent] and the\n  // [PointerDownEvent] times out or when a new [PointerDownEvent] is tracked in\n  // [addAllowedPointer].\n  PointerDownEvent? get currentDown => _down;\n\n  // The [PointerUpEvent] that was most recently tracked in [handleEvent].\n  //\n  // This value will be null if a [PointerUpEvent] has not been tracked yet in\n  // [handleEvent] or the timer between two taps has elapsed.\n  //\n  // This value is only reset when the timer between a [PointerUpEvent] and the\n  // [PointerDownEvent] times out or when a new [PointerDownEvent] is tracked in\n  // [addAllowedPointer].\n  PointerUpEvent? get currentUp => _up;\n\n  // The number of consecutive taps that the most recently tracked [PointerDownEvent]\n  // in [currentDown] represents.\n  //\n  // This value defaults to zero, meaning a tap series is not currently being tracked.\n  //\n  // When this value is greater than zero it means [addAllowedPointer] has run\n  // and at least one [PointerDownEvent] belongs to the current series of taps\n  // being tracked.\n  //\n  // [addAllowedPointer] will either increment this value by `1` or set the value to `1`\n  // depending if the new [PointerDownEvent] is determined to be in the same series as the\n  // tap that preceded it. If too much time has elapsed between two taps, the recognizer has lost\n  // in the arena, the gesture has been cancelled, or the recognizer is being disposed then\n  // this value will be set to `0`, and a new series will begin.\n  int get consecutiveTapCount => _consecutiveTapCount;\n\n  // The upper limit for the [consecutiveTapCount]. When this limit is reached\n  // all tap related state is reset and a new tap series is tracked.\n  //\n  // If this value is null, [consecutiveTapCount] can grow infinitely large.\n  int? get maxConsecutiveTap;\n\n  // Private tap state tracked.\n  PointerDownEvent? _down;\n  PointerUpEvent? _up;\n  int _consecutiveTapCount = 0;\n\n  OffsetPair? _originPosition;\n  int? _previousButtons;\n\n  // For timing taps.\n  Timer? _consecutiveTapTimer;\n  Offset? _lastTapOffset;\n\n  /// {@macro flutter.gestures.selectionrecognizers.TextSelectionGestureDetector.onTapTrackStart}\n  VoidCallback? onTapTrackStart;\n\n  /// {@macro flutter.gestures.selectionrecognizers.TextSelectionGestureDetector.onTapTrackReset}\n  VoidCallback? onTapTrackReset;\n\n  // When tracking a tap, the [consecutiveTapCount] is incremented if the given tap\n  // falls under the tolerance specifications and reset to 1 if not.\n  @override\n  void addAllowedPointer(PointerDownEvent event) {\n    super.addAllowedPointer(event);\n    if (_consecutiveTapTimer != null && !_consecutiveTapTimer!.isActive) {\n      _tapTrackerReset();\n    }\n    if (maxConsecutiveTap == _consecutiveTapCount) {\n      _tapTrackerReset();\n    }\n    _up = null;\n    if (_down != null && !_representsSameSeries(event)) {\n      // The given tap does not match the specifications of the series of taps being tracked,\n      // reset the tap count and related state.\n      _consecutiveTapCount = 1;\n    } else {\n      _consecutiveTapCount += 1;\n    }\n    _consecutiveTapTimerStop();\n    // `_down` must be assigned in this method instead of [handleEvent],\n    // because [acceptGesture] might be called before [handleEvent],\n    // which may rely on `_down` to initiate a callback.\n    _trackTap(event);\n  }\n\n  @override\n  void handleEvent(PointerEvent event) {\n    if (event is PointerMoveEvent) {\n      final double computedSlop = computeHitSlop(event.kind, gestureSettings);\n      final bool isSlopPastTolerance =\n          _getGlobalDistance(event, _originPosition) > computedSlop;\n\n      if (isSlopPastTolerance) {\n        _consecutiveTapTimerStop();\n        _previousButtons = null;\n        _lastTapOffset = null;\n      }\n    } else if (event is PointerUpEvent) {\n      _up = event;\n      if (_down != null) {\n        _consecutiveTapTimerStop();\n        _consecutiveTapTimerStart();\n      }\n    } else if (event is PointerCancelEvent) {\n      _tapTrackerReset();\n    }\n  }\n\n  @override\n  void rejectGesture(int pointer) {\n    _tapTrackerReset();\n  }\n\n  @override\n  void dispose() {\n    _tapTrackerReset();\n    super.dispose();\n  }\n\n  void _trackTap(PointerDownEvent event) {\n    _down = event;\n    _previousButtons = event.buttons;\n    _lastTapOffset = event.position;\n    _originPosition = OffsetPair(\n      local: event.localPosition,\n      global: event.position,\n    );\n    onTapTrackStart?.call();\n  }\n\n  bool _hasSameButton(int buttons) {\n    assert(_previousButtons != null);\n    if (buttons == _previousButtons!) {\n      return true;\n    } else {\n      return false;\n    }\n  }\n\n  bool _isWithinConsecutiveTapTolerance(Offset secondTapOffset) {\n    if (_lastTapOffset == null) {\n      return false;\n    }\n\n    final Offset difference = secondTapOffset - _lastTapOffset!;\n    return difference.distance <= kDoubleTapSlop;\n  }\n\n  bool _representsSameSeries(PointerDownEvent event) {\n    return _consecutiveTapTimer != null &&\n        _isWithinConsecutiveTapTolerance(event.position) &&\n        _hasSameButton(event.buttons);\n  }\n\n  void _consecutiveTapTimerStart() {\n    _consecutiveTapTimer ??= Timer(\n      kDoubleTapTimeout,\n      _consecutiveTapTimerTimeout,\n    );\n  }\n\n  void _consecutiveTapTimerStop() {\n    if (_consecutiveTapTimer != null) {\n      _consecutiveTapTimer!.cancel();\n      _consecutiveTapTimer = null;\n    }\n  }\n\n  void _consecutiveTapTimerTimeout() {\n    // The consecutive tap timer may time out before a tap down/tap up event is\n    // fired. In this case we should not reset the tap tracker state immediately.\n    // Instead we should reset the tap tracker on the next call to [addAllowedPointer],\n    // if the timer is no longer active.\n  }\n\n  void _tapTrackerReset() {\n    // The timer has timed out, i.e. the time between a [PointerUpEvent] and the subsequent\n    // [PointerDownEvent] exceeded the duration of [kDoubleTapTimeout], so the tap belonging\n    // to the [PointerDownEvent] cannot be considered part of the same tap series as the\n    // previous [PointerUpEvent].\n    _consecutiveTapTimerStop();\n    _previousButtons = null;\n    _originPosition = null;\n    _lastTapOffset = null;\n    _consecutiveTapCount = 0;\n    _down = null;\n    _up = null;\n    onTapTrackReset?.call();\n  }\n}\n\n/// A base class for gesture recognizers that recognize taps and movements.\n///\n/// Takes on the responsibilities of [TapGestureRecognizer] and\n/// [DragGestureRecognizer] in one [GestureRecognizer].\n///\n/// ### Gesture arena behavior\n///\n/// [BaseTapAndDragGestureRecognizer] competes on the pointer events of\n/// [kPrimaryButton] only when it has at least one non-null `onTap*`\n/// or `onDrag*` callback.\n///\n/// It will declare defeat if it determines that a gesture is not a\n/// tap (e.g. if the pointer is dragged too far while it's contacting the\n/// screen) or a drag (e.g. if the pointer was not dragged far enough to\n/// be considered a drag.\n///\n/// This recognizer will not immediately declare victory for every tap that it\n/// recognizes, but it declares victory for every drag.\n///\n/// The recognizer will declare victory when all other recognizer's in\n/// the arena have lost, if the timer of [kPressTimeout] elapses and a tap\n/// series greater than 1 is being tracked, or until the pointer has moved\n/// a sufficient global distance from the origin to be considered a drag.\n///\n/// If this recognizer loses the arena (either by declaring defeat or by\n/// another recognizer declaring victory) while the pointer is contacting the\n/// screen, it will fire [onCancel] instead of [onTapUp] or [onDragEnd].\n///\n/// ### When competing with `TapGestureRecognizer` and `DragGestureRecognizer`\n///\n/// Similar to [TapGestureRecognizer] and [DragGestureRecognizer],\n/// [BaseTapAndDragGestureRecognizer] will not aggressively declare victory when\n/// it detects a tap, so when it is competing with those gesture recognizers and\n/// others it has a chance of losing. Similarly, when `eagerVictoryOnDrag` is set\n/// to `false`, this recognizer will not aggressively declare victory when it\n/// detects a drag. By default, `eagerVictoryOnDrag` is set to `true`, so this\n/// recognizer will aggressively declare victory when it detects a drag.\n///\n/// When competing against [TapGestureRecognizer], if the pointer does not move past the tap\n/// tolerance, then the recognizer that entered the arena first will win. In this case the\n/// gesture detected is a tap. If the pointer does travel past the tap tolerance then this\n/// recognizer will be declared winner by default. The gesture detected in this case is a drag.\n///\n/// When competing against [DragGestureRecognizer], if the pointer does not move a sufficient\n/// global distance to be considered a drag, the recognizers will tie in the arena. If the\n/// pointer does travel enough distance then the recognizer that entered the arena\n/// first will win. The gesture detected in this case is a drag.\n///\n/// {@tool dartpad}\n/// This example shows how to use the [TapAndPanGestureRecognizer] along with a\n/// [RawGestureDetector] to scale a Widget.\n///\n/// ** See code in examples/api/lib/gestures/tap_and_drag/tap_and_drag.0.dart **\n/// {@end-tool}\n///\n/// {@tool snippet}\n///\n/// This example shows how to hook up [TapAndPanGestureRecognizer]s' to nested\n/// [RawGestureDetector]s'. It assumes that the code is being used inside a [State]\n/// object with a `_last` field that is then displayed as the child of the gesture detector.\n///\n/// In this example, if the pointer has moved past the drag threshold, then the\n/// the first [TapAndPanGestureRecognizer] instance to receive the [PointerEvent]\n/// will win the arena because the recognizer will immediately declare victory.\n///\n/// The first one to receive the event in the example will depend on where on both\n/// containers the pointer lands first. If your pointer begins in the overlapping\n/// area of both containers, then the inner-most widget will receive the event first.\n/// If your pointer begins in the yellow container then it will be the first to\n/// receive the event.\n///\n/// If the pointer has not moved past the drag threshold, then the first recognizer\n/// to enter the arena will win (i.e. they both tie and the gesture arena will call\n/// [GestureArenaManager.sweep] so the first member of the arena will win).\n///\n/// ```dart\n/// RawGestureDetector(\n///   gestures: <Type, GestureRecognizerFactory>{\n///     TapAndPanGestureRecognizer: GestureRecognizerFactoryWithHandlers<TapAndPanGestureRecognizer>(\n///       () => TapAndPanGestureRecognizer(),\n///       (TapAndPanGestureRecognizer instance) {\n///         instance\n///           ..onTapDown = (TapDragDownDetails details) { setState(() { _last = 'down_a'; }); }\n///           ..onDragStart = (TapDragStartDetails details) { setState(() { _last = 'drag_start_a'; }); }\n///           ..onDragUpdate = (TapDragUpdateDetails details) { setState(() { _last = 'drag_update_a'; }); }\n///           ..onDragEnd = (TapDragEndDetails details) { setState(() { _last = 'drag_end_a'; }); }\n///           ..onTapUp = (TapDragUpDetails details) { setState(() { _last = 'up_a'; }); }\n///           ..onCancel = () { setState(() { _last = 'cancel_a'; }); };\n///       },\n///     ),\n///   },\n///   child: Container(\n///     width: 300.0,\n///     height: 300.0,\n///     color: Colors.yellow,\n///     alignment: Alignment.center,\n///     child: RawGestureDetector(\n///       gestures: <Type, GestureRecognizerFactory>{\n///         TapAndPanGestureRecognizer: GestureRecognizerFactoryWithHandlers<TapAndPanGestureRecognizer>(\n///           () => TapAndPanGestureRecognizer(),\n///           (TapAndPanGestureRecognizer instance) {\n///             instance\n///               ..onTapDown = (TapDragDownDetails details) { setState(() { _last = 'down_b'; }); }\n///               ..onDragStart = (TapDragStartDetails details) { setState(() { _last = 'drag_start_b'; }); }\n///               ..onDragUpdate = (TapDragUpdateDetails details) { setState(() { _last = 'drag_update_b'; }); }\n///               ..onDragEnd = (TapDragEndDetails details) { setState(() { _last = 'drag_end_b'; }); }\n///               ..onTapUp = (TapDragUpDetails details) { setState(() { _last = 'up_b'; }); }\n///               ..onCancel = () { setState(() { _last = 'cancel_b'; }); };\n///           },\n///         ),\n///       },\n///       child: Container(\n///         width: 150.0,\n///         height: 150.0,\n///         color: Colors.blue,\n///         child: Text(_last),\n///       ),\n///     ),\n///   ),\n/// )\n/// ```\n/// {@end-tool}\nsealed class BaseTapAndDragGestureRecognizer\n    extends OneSequenceGestureRecognizer\n    with _TapStatusTrackerMixin {\n  /// Creates a tap and drag gesture recognizer.\n  ///\n  /// {@macro flutter.gestures.GestureRecognizer.supportedDevices}\n  BaseTapAndDragGestureRecognizer({\n    super.debugOwner,\n    super.supportedDevices,\n    super.allowedButtonsFilter,\n    this.eagerVictoryOnDrag = true,\n  }) : _deadline = kPressTimeout,\n       dragStartBehavior = DragStartBehavior.start;\n\n  /// Configure the behavior of offsets passed to [onDragStart].\n  ///\n  /// If set to [DragStartBehavior.start], the [onDragStart] callback will be called\n  /// with the position of the pointer at the time this gesture recognizer won\n  /// the arena. If [DragStartBehavior.down], [onDragStart] will be called with\n  /// the position of the first detected down event for the pointer. When there\n  /// are no other gestures competing with this gesture in the arena, there's\n  /// no difference in behavior between the two settings.\n  ///\n  /// For more information about the gesture arena:\n  /// https://flutter.dev/to/gesture-disambiguation\n  ///\n  /// By default, the drag start behavior is [DragStartBehavior.start].\n  ///\n  /// See also:\n  ///\n  ///  * [DragGestureRecognizer.dragStartBehavior], which includes more details and an example.\n  DragStartBehavior dragStartBehavior;\n\n  /// The frequency at which the [onDragUpdate] callback is called.\n  ///\n  /// The value defaults to null, meaning there is no delay for [onDragUpdate] callback.\n  Duration? dragUpdateThrottleFrequency;\n\n  /// An upper bound for the amount of taps that can belong to one tap series.\n  ///\n  /// When this limit is reached the series of taps being tracked by this\n  /// recognizer will be reset.\n  @override\n  int? maxConsecutiveTap;\n\n  /// Whether this recognizer eagerly declares victory when it has detected\n  /// a drag.\n  ///\n  /// When this value is `false`, this recognizer will wait until it is the last\n  /// recognizer in the gesture arena before declaring victory on a drag.\n  ///\n  /// Defaults to `true`.\n  bool eagerVictoryOnDrag;\n\n  /// {@macro flutter.gestures.tap.TapGestureRecognizer.onTapDown}\n  ///\n  /// This triggers after the down event, once a short timeout ([kPressTimeout]) has\n  /// elapsed, or once the gestures has won the arena, whichever comes first.\n  ///\n  /// The position of the pointer is provided in the callback's `details`\n  /// argument, which is a [TapDragDownDetails] object.\n  ///\n  /// {@template flutter.gestures.selectionrecognizers.BaseTapAndDragGestureRecognizer.tapStatusTrackerData}\n  /// The number of consecutive taps, and the keys that were pressed on tap down\n  /// are also provided in the callback's `details` argument.\n  /// {@endtemplate}\n  ///\n  /// See also:\n  ///\n  ///  * [kPrimaryButton], the button this callback responds to.\n  ///  * [TapDragDownDetails], which is passed as an argument to this callback.\n  GestureTapDragDownCallback? onTapDown;\n\n  /// {@macro flutter.gestures.tap.TapGestureRecognizer.onTapUp}\n  ///\n  /// This triggers on the up event, if the recognizer wins the arena with it\n  /// or has previously won.\n  ///\n  /// The position of the pointer is provided in the callback's `details`\n  /// argument, which is a [TapDragUpDetails] object.\n  ///\n  /// {@macro flutter.gestures.selectionrecognizers.BaseTapAndDragGestureRecognizer.tapStatusTrackerData}\n  ///\n  /// See also:\n  ///\n  ///  * [kPrimaryButton], the button this callback responds to.\n  ///  * [TapDragUpDetails], which is passed as an argument to this callback.\n  GestureTapDragUpCallback? onTapUp;\n\n  /// {@macro flutter.gestures.monodrag.DragGestureRecognizer.onStart}\n  ///\n  /// The position of the pointer is provided in the callback's `details`\n  /// argument, which is a [TapDragStartDetails] object. The [dragStartBehavior]\n  /// determines this position.\n  ///\n  /// {@macro flutter.gestures.selectionrecognizers.BaseTapAndDragGestureRecognizer.tapStatusTrackerData}\n  ///\n  /// See also:\n  ///\n  ///  * [kPrimaryButton], the button this callback responds to.\n  ///  * [TapDragStartDetails], which is passed as an argument to this callback.\n  GestureTapDragStartCallback? onDragStart;\n\n  /// {@macro flutter.gestures.monodrag.DragGestureRecognizer.onUpdate}\n  ///\n  /// The distance traveled by the pointer since the last update is provided in\n  /// the callback's `details` argument, which is a [TapDragUpdateDetails] object.\n  ///\n  /// {@macro flutter.gestures.selectionrecognizers.BaseTapAndDragGestureRecognizer.tapStatusTrackerData}\n  ///\n  /// See also:\n  ///\n  ///  * [kPrimaryButton], the button this callback responds to.\n  ///  * [TapDragUpdateDetails], which is passed as an argument to this callback.\n  GestureTapDragUpdateCallback? onDragUpdate;\n\n  /// {@macro flutter.gestures.monodrag.DragGestureRecognizer.onEnd}\n  ///\n  /// The velocity is provided in the callback's `details` argument, which is a\n  /// [TapDragEndDetails] object.\n  ///\n  /// {@macro flutter.gestures.selectionrecognizers.BaseTapAndDragGestureRecognizer.tapStatusTrackerData}\n  ///\n  /// See also:\n  ///\n  ///  * [kPrimaryButton], the button this callback responds to.\n  ///  * [TapDragEndDetails], which is passed as an argument to this callback.\n  GestureTapDragEndCallback? onDragEnd;\n\n  /// The pointer that previously triggered [onTapDown] did not complete.\n  ///\n  /// This is called when a [PointerCancelEvent] is tracked when the [onTapDown] callback\n  /// was previously called.\n  ///\n  /// It may also be called if a [PointerUpEvent] is tracked after the pointer has moved\n  /// past the tap tolerance but not past the drag tolerance, and the recognizer has not\n  /// yet won the arena.\n  ///\n  /// See also:\n  ///\n  ///  * [kPrimaryButton], the button this callback responds to.\n  GestureCancelCallback? onCancel;\n\n  // Tap related state.\n  bool _pastSlopTolerance = false;\n  bool _sentTapDown = false;\n  bool _wonArenaForPrimaryPointer = false;\n\n  // Primary pointer being tracked by this recognizer.\n  int? _primaryPointer;\n  Timer? _deadlineTimer;\n  // The recognizer will call [onTapDown] after this amount of time has elapsed\n  // since starting to track the primary pointer.\n  //\n  // [onTapDown] will not be called if the primary pointer is\n  // accepted, rejected, or all pointers are up or canceled before [_deadline].\n  final Duration _deadline;\n\n  // Drag related state.\n  _DragState _dragState = _DragState.ready;\n  PointerEvent? _start;\n  late OffsetPair _initialPosition;\n  late OffsetPair _currentPosition;\n  // late double _globalDistanceMoved;\n  late double _globalDistanceMovedAllAxes;\n\n  // For drag update throttle.\n  TapDragUpdateDetails? _lastDragUpdateDetails;\n  Timer? _dragUpdateThrottleTimer;\n\n  final Set<int> _acceptedActivePointers = <int>{};\n\n  // Offset _getDeltaForDetails(Offset delta);\n  // double? _getPrimaryValueFromOffset(Offset value);\n  bool _hasSufficientGlobalDistanceToAccept(\n    PointerDeviceKind pointerDeviceKind,\n  );\n\n  // Drag updates may require throttling to avoid excessive updating, such as for text layouts in text\n  // fields. The frequency of invocations is controlled by the [dragUpdateThrottleFrequency].\n  //\n  // Once the drag gesture ends, any pending drag update will be fired\n  // immediately. See [_checkDragEnd].\n  void _handleDragUpdateThrottled() {\n    assert(_lastDragUpdateDetails != null);\n    if (onDragUpdate != null) {\n      invokeCallback<void>(\n        'onDragUpdate',\n        () => onDragUpdate!(_lastDragUpdateDetails!),\n      );\n    }\n    _dragUpdateThrottleTimer = null;\n    _lastDragUpdateDetails = null;\n  }\n\n  @override\n  bool isPointerAllowed(PointerEvent event) {\n    if (_primaryPointer == null) {\n      switch (event.buttons) {\n        case kPrimaryButton:\n          if (onTapDown == null &&\n              onDragStart == null &&\n              onDragUpdate == null &&\n              onDragEnd == null &&\n              onTapUp == null &&\n              onCancel == null) {\n            return false;\n          }\n        default:\n          return false;\n      }\n    } else {\n      if (event.pointer != _primaryPointer) {\n        return false;\n      }\n    }\n\n    return super.isPointerAllowed(event as PointerDownEvent);\n  }\n\n  @override\n  void addAllowedPointer(PointerDownEvent event) {\n    if (_dragState == _DragState.ready) {\n      super.addAllowedPointer(event);\n      _primaryPointer = event.pointer;\n      // _globalDistanceMoved = 0.0;\n      _globalDistanceMovedAllAxes = 0.0;\n      _dragState = _DragState.possible;\n      _initialPosition = OffsetPair(\n        global: event.position,\n        local: event.localPosition,\n      );\n      _currentPosition = _initialPosition;\n      _deadlineTimer = Timer(\n        _deadline,\n        () => _didExceedDeadlineWithEvent(event),\n      );\n    }\n  }\n\n  @override\n  void handleNonAllowedPointer(PointerDownEvent event) {\n    // There can be multiple drags simultaneously. Their effects are combined.\n    if (event.buttons != kPrimaryButton) {\n      if (!_wonArenaForPrimaryPointer) {\n        super.handleNonAllowedPointer(event);\n      }\n    }\n  }\n\n  @override\n  void acceptGesture(int pointer) {\n    if (pointer != _primaryPointer) {\n      return;\n    }\n\n    _stopDeadlineTimer();\n\n    assert(!_acceptedActivePointers.contains(pointer));\n    _acceptedActivePointers.add(pointer);\n\n    // Called when this recognizer is accepted by the [GestureArena].\n    if (currentDown != null) {\n      _checkTapDown(currentDown!);\n    }\n\n    _wonArenaForPrimaryPointer = true;\n\n    // resolve(GestureDisposition.accepted) will be called when the [PointerMoveEvent]\n    // has moved a sufficient global distance to be considered a drag and\n    // `eagerVictoryOnDrag` is set to `true`.\n    if (_start != null && eagerVictoryOnDrag) {\n      assert(_dragState == _DragState.accepted);\n      assert(currentUp == null);\n      _acceptDrag(_start!);\n    }\n\n    // This recognizer will wait until it is the last one in the gesture arena\n    // before accepting a drag when `eagerVictoryOnDrag` is set to `false`.\n    if (_start != null && !eagerVictoryOnDrag) {\n      assert(_dragState == _DragState.possible);\n      assert(currentUp == null);\n      _dragState = _DragState.accepted;\n      _acceptDrag(_start!);\n    }\n\n    if (currentUp != null) {\n      _checkTapUp(currentUp!);\n    }\n  }\n\n  @override\n  void didStopTrackingLastPointer(int pointer) {\n    switch (_dragState) {\n      case _DragState.ready:\n        _checkCancel();\n        resolve(GestureDisposition.rejected);\n\n      case _DragState.possible:\n        if (_pastSlopTolerance) {\n          // This means the pointer was not accepted as a tap.\n          if (_wonArenaForPrimaryPointer) {\n            // If the recognizer has already won the arena for the primary pointer being tracked\n            // but the pointer has exceeded the tap tolerance, then the pointer is accepted as a\n            // drag gesture.\n            if (currentDown != null) {\n              if (!_acceptedActivePointers.remove(pointer)) {\n                resolvePointer(pointer, GestureDisposition.rejected);\n              }\n              _dragState = _DragState.accepted;\n              _acceptDrag(currentDown!);\n              _checkDragEnd();\n            }\n          } else {\n            _checkCancel();\n            resolve(GestureDisposition.rejected);\n          }\n        } else {\n          // The pointer is accepted as a tap.\n          if (currentUp != null) {\n            _checkTapUp(currentUp!);\n          }\n        }\n\n      case _DragState.accepted:\n        // For the case when the pointer has been accepted as a drag.\n        // Meaning [_checkTapDown] and [_checkDragStart] have already ran.\n        _checkDragEnd();\n    }\n\n    _stopDeadlineTimer();\n    _start = null;\n    _dragState = _DragState.ready;\n    _pastSlopTolerance = false;\n  }\n\n  @override\n  void handleEvent(PointerEvent event) {\n    if (event.pointer != _primaryPointer) {\n      return;\n    }\n    super.handleEvent(event);\n    if (event is PointerMoveEvent) {\n      // Receiving a [PointerMoveEvent], does not automatically mean the pointer\n      // being tracked is doing a drag gesture. There is some drift that can happen\n      // between the initial [PointerDownEvent] and subsequent [PointerMoveEvent]s.\n      // Accessing [_pastSlopTolerance] lets us know if our tap has moved past the\n      // acceptable tolerance. If the pointer does not move past this tolerance than\n      // it is not considered a drag.\n      //\n      // To be recognized as a drag, the [PointerMoveEvent] must also have moved\n      // a sufficient global distance from the initial [PointerDownEvent] to be\n      // accepted as a drag. This logic is handled in [_hasSufficientGlobalDistanceToAccept].\n      //\n      // The recognizer will also detect the gesture as a drag when the pointer\n      // has been accepted and it has moved past the [slopTolerance] but has not moved\n      // a sufficient global distance from the initial position to be considered a drag.\n      // In this case since the gesture cannot be a tap, it defaults to a drag.\n      final double computedSlop = computeHitSlop(event.kind, gestureSettings);\n      _pastSlopTolerance =\n          _pastSlopTolerance ||\n          _getGlobalDistance(event, _initialPosition) > computedSlop;\n\n      if (_dragState == _DragState.accepted) {\n        _currentPosition = OffsetPair.fromEventPosition(event);\n        _checkDragUpdate(event);\n      } else if (_dragState == _DragState.possible) {\n        if (_start == null) {\n          // Only check for a drag if the start of a drag was not already identified.\n          _checkDrag(event);\n        }\n\n        // This can occur when the recognizer is accepted before a [PointerMoveEvent] has been\n        // received that moves the pointer a sufficient global distance to be considered a drag.\n        if (_start != null && _wonArenaForPrimaryPointer) {\n          _dragState = _DragState.accepted;\n          _acceptDrag(_start!);\n        }\n      }\n    } else if (event is PointerUpEvent) {\n      if (_dragState == _DragState.possible) {\n        // The drag has not been accepted before a [PointerUpEvent], therefore the recognizer\n        // attempts to recognize a tap.\n        stopTrackingIfPointerNoLongerDown(event);\n      } else if (_dragState == _DragState.accepted) {\n        _giveUpPointer(event.pointer);\n      }\n    } else if (event is PointerCancelEvent) {\n      _dragState = _DragState.ready;\n      _giveUpPointer(event.pointer);\n    }\n  }\n\n  @override\n  void rejectGesture(int pointer) {\n    if (pointer != _primaryPointer) {\n      return;\n    }\n    super.rejectGesture(pointer);\n\n    _stopDeadlineTimer();\n    _giveUpPointer(pointer);\n    _resetTaps();\n    _resetDragUpdateThrottle();\n  }\n\n  @override\n  void dispose() {\n    _stopDeadlineTimer();\n    _resetDragUpdateThrottle();\n    super.dispose();\n  }\n\n  @override\n  String get debugDescription => 'tap_and_drag';\n\n  void _acceptDrag(PointerEvent event) {\n    assert(_dragState == _DragState.accepted);\n\n    if (!_wonArenaForPrimaryPointer) {\n      return;\n    }\n\n    if (dragStartBehavior == DragStartBehavior.start) {\n      _initialPosition += OffsetPair(\n        global: event.delta,\n        local: event.localDelta,\n      );\n      _currentPosition = _initialPosition;\n    }\n    _checkDragStart(event);\n    final Offset localDelta = event.localDelta;\n    if (localDelta != Offset.zero) {\n      _currentPosition = OffsetPair.fromEventPosition(event);\n      final Offset correctedLocalPosition = _initialPosition.local + localDelta;\n      final Matrix4? localToGlobalTransform = event.transform == null\n          ? null\n          : Matrix4.tryInvert(event.transform!);\n      final Offset globalUpdateDelta = PointerEvent.transformDeltaViaPositions(\n        transform: localToGlobalTransform,\n        untransformedDelta: localDelta,\n        untransformedEndPosition: correctedLocalPosition,\n      );\n      final updateDelta = OffsetPair(\n        local: localDelta,\n        global: globalUpdateDelta,\n      );\n      // Only adds delta for down behaviour\n      _checkDragUpdate(event, corrected: _initialPosition + updateDelta);\n    }\n  }\n\n  void _checkDrag(PointerMoveEvent event) {\n    final Matrix4? localToGlobalTransform = event.transform == null\n        ? null\n        : Matrix4.tryInvert(event.transform!);\n    // final Offset movedLocally = _getDeltaForDetails(event.localDelta);\n    // _globalDistanceMoved +=\n    //     PointerEvent.transformDeltaViaPositions(\n    //       transform: localToGlobalTransform,\n    //       untransformedDelta: movedLocally,\n    //       untransformedEndPosition: event.localPosition,\n    //     ).distance *\n    //     (_getPrimaryValueFromOffset(movedLocally) ?? 1).sign;\n    _globalDistanceMovedAllAxes +=\n        PointerEvent.transformDeltaViaPositions(\n          transform: localToGlobalTransform,\n          untransformedDelta: event.localDelta,\n          untransformedEndPosition: event.localPosition,\n        ).distance *\n        1.sign;\n    if (_hasSufficientGlobalDistanceToAccept(event.kind) ||\n        (_wonArenaForPrimaryPointer &&\n            _globalDistanceMovedAllAxes.abs() >\n                computePanSlop(event.kind, gestureSettings))) {\n      _start = event;\n      if (eagerVictoryOnDrag) {\n        _dragState = _DragState.accepted;\n        if (!_wonArenaForPrimaryPointer) {\n          resolve(GestureDisposition.accepted);\n        }\n      }\n    }\n  }\n\n  void _checkTapDown(PointerDownEvent event) {\n    if (_sentTapDown) {\n      return;\n    }\n\n    final details = TapDragDownDetails(\n      globalPosition: event.position,\n      localPosition: event.localPosition,\n      kind: getKindForPointer(event.pointer),\n      consecutiveTapCount: consecutiveTapCount,\n    );\n\n    if (onTapDown != null) {\n      invokeCallback('onTapDown', () => onTapDown!(details));\n    }\n\n    _sentTapDown = true;\n  }\n\n  void _checkTapUp(PointerUpEvent event) {\n    if (!_wonArenaForPrimaryPointer) {\n      return;\n    }\n\n    final upDetails = TapDragUpDetails(\n      kind: event.kind,\n      globalPosition: event.position,\n      localPosition: event.localPosition,\n      consecutiveTapCount: consecutiveTapCount,\n    );\n\n    if (onTapUp != null) {\n      invokeCallback('onTapUp', () => onTapUp!(upDetails));\n    }\n\n    _resetTaps();\n    if (!_acceptedActivePointers.remove(event.pointer)) {\n      resolvePointer(event.pointer, GestureDisposition.rejected);\n    }\n  }\n\n  void _checkDragStart(PointerEvent event) {\n    if (onDragStart != null) {\n      final details = TapDragStartDetails(\n        sourceTimeStamp: event.timeStamp,\n        globalPosition: _initialPosition.global,\n        localPosition: _initialPosition.local,\n        kind: getKindForPointer(event.pointer),\n        consecutiveTapCount: consecutiveTapCount,\n      );\n\n      invokeCallback<void>('onDragStart', () => onDragStart!(details));\n    }\n\n    _start = null;\n  }\n\n  void _checkDragUpdate(PointerEvent event, {OffsetPair? corrected}) {\n    final Offset globalPosition = corrected?.global ?? event.position;\n    final Offset localPosition = corrected?.local ?? event.localPosition;\n\n    final details = TapDragUpdateDetails(\n      sourceTimeStamp: event.timeStamp,\n      delta: event.localDelta,\n      globalPosition: globalPosition,\n      kind: getKindForPointer(event.pointer),\n      localPosition: localPosition,\n      offsetFromOrigin: globalPosition - _initialPosition.global,\n      localOffsetFromOrigin: localPosition - _initialPosition.local,\n      consecutiveTapCount: consecutiveTapCount,\n    );\n\n    if (dragUpdateThrottleFrequency != null) {\n      _lastDragUpdateDetails = details;\n      // Only schedule a new timer if there's not one pending.\n      _dragUpdateThrottleTimer ??= Timer(\n        dragUpdateThrottleFrequency!,\n        _handleDragUpdateThrottled,\n      );\n    } else {\n      if (onDragUpdate != null) {\n        invokeCallback<void>('onDragUpdate', () => onDragUpdate!(details));\n      }\n    }\n  }\n\n  void _checkDragEnd() {\n    final Offset globalPosition = _currentPosition.global;\n    final Offset localPosition = _currentPosition.local;\n\n    if (_dragUpdateThrottleTimer != null) {\n      // If there's already an update scheduled, trigger it immediately and\n      // cancel the timer.\n      _dragUpdateThrottleTimer!.cancel();\n      _handleDragUpdateThrottled();\n    }\n\n    final endDetails = TapDragEndDetails(\n      globalPosition: globalPosition,\n      localPosition: localPosition,\n      primaryVelocity: 0.0,\n      consecutiveTapCount: consecutiveTapCount,\n    );\n\n    if (onDragEnd != null) {\n      invokeCallback<void>('onDragEnd', () => onDragEnd!(endDetails));\n    }\n\n    _resetTaps();\n    _resetDragUpdateThrottle();\n  }\n\n  void _checkCancel() {\n    if (!_sentTapDown) {\n      // Do not fire tap cancel if [onTapDown] was never called.\n      return;\n    }\n    if (onCancel != null) {\n      invokeCallback('onCancel', onCancel!);\n    }\n    _resetDragUpdateThrottle();\n    _resetTaps();\n  }\n\n  void _didExceedDeadlineWithEvent(PointerDownEvent event) {\n    _didExceedDeadline();\n  }\n\n  void _didExceedDeadline() {\n    if (currentDown != null) {\n      _checkTapDown(currentDown!);\n\n      if (consecutiveTapCount > 1) {\n        // If our consecutive tap count is greater than 1, i.e. is a double tap or greater,\n        // then this recognizer declares victory to prevent the [LongPressGestureRecognizer]\n        // from declaring itself the winner if a double tap is held for too long.\n        resolve(GestureDisposition.accepted);\n      }\n    }\n  }\n\n  void _giveUpPointer(int pointer) {\n    stopTrackingPointer(pointer);\n    // If the pointer was never accepted, then it is rejected since this recognizer is no longer\n    // interested in winning the gesture arena for it.\n    if (!_acceptedActivePointers.remove(pointer)) {\n      resolvePointer(pointer, GestureDisposition.rejected);\n    }\n  }\n\n  void _resetTaps() {\n    _sentTapDown = false;\n    _wonArenaForPrimaryPointer = false;\n    _primaryPointer = null;\n  }\n\n  void _resetDragUpdateThrottle() {\n    if (dragUpdateThrottleFrequency == null) {\n      return;\n    }\n    _lastDragUpdateDetails = null;\n    if (_dragUpdateThrottleTimer != null) {\n      _dragUpdateThrottleTimer!.cancel();\n      _dragUpdateThrottleTimer = null;\n    }\n  }\n\n  void _stopDeadlineTimer() {\n    if (_deadlineTimer != null) {\n      _deadlineTimer!.cancel();\n      _deadlineTimer = null;\n    }\n  }\n}\n\n/// Recognizes taps along with movement in the horizontal direction.\n///\n/// Before this recognizer has won the arena for the primary pointer being tracked,\n/// it will only accept a drag on the horizontal axis. If a drag is detected after\n/// this recognizer has won the arena then it will accept a drag on any axis.\n///\n/// See also:\n///\n///  * [BaseTapAndDragGestureRecognizer], for the class that provides the main\n///  implementation details of this recognizer.\n///  * [TapAndPanGestureRecognizer], for a similar recognizer that accepts a drag\n///  on any axis regardless if the recognizer has won the arena for the primary\n///  pointer being tracked.\n///  * [HorizontalDragGestureRecognizer], for a similar recognizer that only recognizes\n///  horizontal movement.\nclass TapAndHorizontalDragGestureRecognizer\n    extends BaseTapAndDragGestureRecognizer {\n  /// Create a gesture recognizer for interactions in the horizontal axis.\n  ///\n  /// {@macro flutter.gestures.GestureRecognizer.supportedDevices}\n  TapAndHorizontalDragGestureRecognizer({\n    super.debugOwner,\n    super.supportedDevices,\n  });\n\n  @override\n  bool _hasSufficientGlobalDistanceToAccept(\n    PointerDeviceKind pointerDeviceKind,\n  ) {\n    return false;\n    // return _globalDistanceMoved.abs() >\n    //     computeHitSlop(pointerDeviceKind, gestureSettings);\n  }\n\n  // @override\n  // Offset _getDeltaForDetails(Offset delta) => Offset(delta.dx, 0.0);\n\n  // @override\n  // double _getPrimaryValueFromOffset(Offset value) => value.dx;\n\n  @override\n  String get debugDescription => 'tap and horizontal drag';\n}\n\n/// {@template flutter.gestures.selectionrecognizers.TapAndPanGestureRecognizer}\n/// Recognizes taps along with both horizontal and vertical movement.\n///\n/// This recognizer will accept a drag on any axis, regardless if it has won the\n/// arena for the primary pointer being tracked.\n///\n/// See also:\n///\n///  * [BaseTapAndDragGestureRecognizer], for the class that provides the main\n///  implementation details of this recognizer.\n///  * [TapAndHorizontalDragGestureRecognizer], for a similar recognizer that\n///  only accepts horizontal drags before it has won the arena for the primary\n///  pointer being tracked.\n///  * [PanGestureRecognizer], for a similar recognizer that only recognizes\n///  movement.\n/// {@endtemplate}\nclass TapAndPanGestureRecognizer extends BaseTapAndDragGestureRecognizer {\n  /// Create a gesture recognizer for interactions on a plane.\n  TapAndPanGestureRecognizer({super.debugOwner, super.supportedDevices});\n\n  @override\n  bool _hasSufficientGlobalDistanceToAccept(\n    PointerDeviceKind pointerDeviceKind,\n  ) {\n    return true;\n    // return _globalDistanceMoved.abs() >\n    //     computePanSlop(pointerDeviceKind, gestureSettings);\n  }\n\n  // @override\n  // Offset _getDeltaForDetails(Offset delta) => delta;\n\n  // @override\n  // double? _getPrimaryValueFromOffset(Offset value) => null;\n\n  @override\n  String get debugDescription => 'tap and pan';\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/selectable_text/text.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/selectable_text/selectable_text.dart';\nimport 'package:PiliPlus/common/widgets/flutter/selectable_text/selection_area.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide SelectableText, SelectionArea;\n\nWidget selectableText(\n  String text, {\n  TextStyle? style,\n}) {\n  if (PlatformUtils.isDesktop) {\n    return SelectionArea(\n      child: Text(\n        style: style,\n        text,\n      ),\n    );\n  }\n  return SelectableText(\n    style: style,\n    text,\n    scrollPhysics: const NeverScrollableScrollPhysics(),\n  );\n}\n\nWidget selectableRichText(\n  TextSpan textSpan, {\n  TextStyle? style,\n}) {\n  if (PlatformUtils.isDesktop) {\n    return SelectionArea(\n      child: Text.rich(\n        style: style,\n        textSpan,\n      ),\n    );\n  }\n  return SelectableText.rich(\n    style: style,\n    textSpan,\n    scrollPhysics: const NeverScrollableScrollPhysics(),\n  );\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/selectable_text/text_selection.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'dart:math' as math;\n\nimport 'package:PiliPlus/common/widgets/flutter/selectable_text/tap_and_drag.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/gestures.dart'\n    hide\n        BaseTapAndDragGestureRecognizer,\n        TapAndHorizontalDragGestureRecognizer,\n        TapAndPanGestureRecognizer;\nimport 'package:flutter/material.dart' hide TextSelectionGestureDetector;\n\nclass CustomTextSelectionGestureDetectorBuilder\n    extends TextSelectionGestureDetectorBuilder {\n  CustomTextSelectionGestureDetectorBuilder({required super.delegate});\n\n  @override\n  Widget buildGestureDetector({\n    Key? key,\n    HitTestBehavior? behavior,\n    required Widget child,\n  }) {\n    return TextSelectionGestureDetector(\n      key: key,\n      onTapTrackStart: onTapTrackStart,\n      onTapTrackReset: onTapTrackReset,\n      onTapDown: onTapDown,\n      onForcePressStart: delegate.forcePressEnabled ? onForcePressStart : null,\n      onForcePressEnd: delegate.forcePressEnabled ? onForcePressEnd : null,\n      onSecondaryTap: onSecondaryTap,\n      onSecondaryTapDown: onSecondaryTapDown,\n      onSingleTapUp: onSingleTapUp,\n      onSingleTapCancel: onSingleTapCancel,\n      onUserTap: onUserTap,\n      onSingleLongTapStart: onSingleLongTapStart,\n      onSingleLongTapMoveUpdate: onSingleLongTapMoveUpdate,\n      onSingleLongTapEnd: onSingleLongTapEnd,\n      onSingleLongTapCancel: onSingleLongTapCancel,\n      onDoubleTapDown: onDoubleTapDown,\n      onTripleTapDown: onTripleTapDown,\n      onDragSelectionStart: onDragSelectionStart,\n      onDragSelectionUpdate: onDragSelectionUpdate,\n      onDragSelectionEnd: onDragSelectionEnd,\n      onUserTapAlwaysCalled: onUserTapAlwaysCalled,\n      behavior: behavior,\n      child: child,\n    );\n  }\n}\n\n/// A gesture detector to respond to non-exclusive event chains for a text field.\n///\n/// An ordinary [GestureDetector] configured to handle events like tap and\n/// double tap will only recognize one or the other. This widget detects both:\n/// the first tap and then any subsequent taps that occurs within a time limit\n/// after the first.\n///\n/// See also:\n///\n///  * [TextField], a Material text field which uses this gesture detector.\n///  * [CupertinoTextField], a Cupertino text field which uses this gesture\n///    detector.\nclass TextSelectionGestureDetector extends StatefulWidget {\n  /// Create a [TextSelectionGestureDetector].\n  ///\n  /// Multiple callbacks can be called for one sequence of input gesture.\n  const TextSelectionGestureDetector({\n    super.key,\n    this.onTapTrackStart,\n    this.onTapTrackReset,\n    this.onTapDown,\n    this.onForcePressStart,\n    this.onForcePressEnd,\n    this.onSecondaryTap,\n    this.onSecondaryTapDown,\n    this.onSingleTapUp,\n    this.onSingleTapCancel,\n    this.onUserTap,\n    this.onSingleLongTapStart,\n    this.onSingleLongTapMoveUpdate,\n    this.onSingleLongTapEnd,\n    this.onSingleLongTapCancel,\n    this.onDoubleTapDown,\n    this.onTripleTapDown,\n    this.onDragSelectionStart,\n    this.onDragSelectionUpdate,\n    this.onDragSelectionEnd,\n    this.onUserTapAlwaysCalled = false,\n    this.behavior,\n    required this.child,\n  });\n\n  /// {@template flutter.gestures.selectionrecognizers.TextSelectionGestureDetector.onTapTrackStart}\n  /// Callback used to indicate that a tap tracking has started upon\n  /// a [PointerDownEvent].\n  /// {@endtemplate}\n  final VoidCallback? onTapTrackStart;\n\n  /// {@template flutter.gestures.selectionrecognizers.TextSelectionGestureDetector.onTapTrackReset}\n  /// Callback used to indicate that a tap tracking has been reset which\n  /// happens on the next [PointerDownEvent] after the timer between two taps\n  /// elapses, the recognizer loses the arena, the gesture is cancelled or\n  /// the recognizer is disposed of.\n  /// {@endtemplate}\n  final VoidCallback? onTapTrackReset;\n\n  /// Called for every tap down including every tap down that's part of a\n  /// double click or a long press, except touches that include enough movement\n  /// to not qualify as taps (e.g. pans and flings).\n  final GestureTapDragDownCallback? onTapDown;\n\n  /// Called when a pointer has tapped down and the force of the pointer has\n  /// just become greater than [ForcePressGestureRecognizer.startPressure].\n  final GestureForcePressStartCallback? onForcePressStart;\n\n  /// Called when a pointer that had previously triggered [onForcePressStart] is\n  /// lifted off the screen.\n  final GestureForcePressEndCallback? onForcePressEnd;\n\n  /// Called for a tap event with the secondary mouse button.\n  final GestureTapCallback? onSecondaryTap;\n\n  /// Called for a tap down event with the secondary mouse button.\n  final GestureTapDownCallback? onSecondaryTapDown;\n\n  /// Called for the first tap in a series of taps, consecutive taps do not call\n  /// this method.\n  ///\n  /// For example, if the detector was configured with [onTapDown] and\n  /// [onDoubleTapDown], three quick taps would be recognized as a single tap\n  /// down, followed by a tap up, then a double tap down, followed by a single tap down.\n  final GestureTapDragUpCallback? onSingleTapUp;\n\n  /// Called for each touch that becomes recognized as a gesture that is not a\n  /// short tap, such as a long tap or drag. It is called at the moment when\n  /// another gesture from the touch is recognized.\n  final GestureCancelCallback? onSingleTapCancel;\n\n  /// Called for the first tap in a series of taps when [onUserTapAlwaysCalled] is\n  /// disabled, which is the default behavior.\n  ///\n  /// When [onUserTapAlwaysCalled] is enabled, this is called for every tap,\n  /// including consecutive taps.\n  final GestureTapCallback? onUserTap;\n\n  /// Called for a single long tap that's sustained for longer than\n  /// [kLongPressTimeout] but not necessarily lifted. Not called for a\n  /// double-tap-hold, which calls [onDoubleTapDown] instead.\n  final GestureLongPressStartCallback? onSingleLongTapStart;\n\n  /// Called after [onSingleLongTapStart] when the pointer is dragged.\n  final GestureLongPressMoveUpdateCallback? onSingleLongTapMoveUpdate;\n\n  /// Called after [onSingleLongTapStart] when the pointer is lifted.\n  final GestureLongPressEndCallback? onSingleLongTapEnd;\n\n  /// Called after [onSingleLongTapStart] when the pointer is canceled.\n  final GestureLongPressCancelCallback? onSingleLongTapCancel;\n\n  /// Called after a momentary hold or a short tap that is close in space and\n  /// time (within [kDoubleTapTimeout]) to a previous short tap.\n  final GestureTapDragDownCallback? onDoubleTapDown;\n\n  /// Called after a momentary hold or a short tap that is close in space and\n  /// time (within [kDoubleTapTimeout]) to a previous double-tap.\n  final GestureTapDragDownCallback? onTripleTapDown;\n\n  /// Called when a mouse starts dragging to select text.\n  final GestureTapDragStartCallback? onDragSelectionStart;\n\n  /// Called repeatedly as a mouse moves while dragging.\n  final GestureTapDragUpdateCallback? onDragSelectionUpdate;\n\n  /// Called when a mouse that was previously dragging is released.\n  final GestureTapDragEndCallback? onDragSelectionEnd;\n\n  /// Whether [onUserTap] will be called for all taps including consecutive taps.\n  ///\n  /// Defaults to false, so [onUserTap] is only called for each distinct tap.\n  final bool onUserTapAlwaysCalled;\n\n  /// How this gesture detector should behave during hit testing.\n  ///\n  /// This defaults to [HitTestBehavior.deferToChild].\n  final HitTestBehavior? behavior;\n\n  /// Child below this widget.\n  final Widget child;\n\n  @override\n  State<StatefulWidget> createState() => _TextSelectionGestureDetectorState();\n}\n\nclass _TextSelectionGestureDetectorState\n    extends State<TextSelectionGestureDetector> {\n  // Converts the details.consecutiveTapCount from a TapAndDrag*Details object,\n  // which can grow to be infinitely large, to a value between 1 and 3. The value\n  // that the raw count is converted to is based on the default observed behavior\n  // on the native platforms.\n  //\n  // This method should be used in all instances when details.consecutiveTapCount\n  // would be used.\n  static int _getEffectiveConsecutiveTapCount(int rawCount) {\n    switch (defaultTargetPlatform) {\n      case TargetPlatform.android:\n      case TargetPlatform.fuchsia:\n      case TargetPlatform.linux:\n        // From observation, these platform's reset their tap count to 0 when\n        // the number of consecutive taps exceeds 3. For example on Debian Linux\n        // with GTK, when going past a triple click, on the fourth click the\n        // selection is moved to the precise click position, on the fifth click\n        // the word at the position is selected, and on the sixth click the\n        // paragraph at the position is selected.\n        return rawCount <= 3\n            ? rawCount\n            : (rawCount % 3 == 0 ? 3 : rawCount % 3);\n      case TargetPlatform.iOS:\n      case TargetPlatform.macOS:\n        // From observation, these platform's either hold their tap count at 3.\n        // For example on macOS, when going past a triple click, the selection\n        // should be retained at the paragraph that was first selected on triple\n        // click.\n        return math.min(rawCount, 3);\n      case TargetPlatform.windows:\n        // From observation, this platform's consecutive tap actions alternate\n        // between double click and triple click actions. For example, after a\n        // triple click has selected a paragraph, on the next click the word at\n        // the clicked position will be selected, and on the next click the\n        // paragraph at the position is selected.\n        return rawCount < 2 ? rawCount : 2 + rawCount % 2;\n    }\n  }\n\n  void _handleTapTrackStart() {\n    widget.onTapTrackStart?.call();\n  }\n\n  void _handleTapTrackReset() {\n    widget.onTapTrackReset?.call();\n  }\n\n  // The down handler is force-run on success of a single tap and optimistically\n  // run before a long press success.\n  void _handleTapDown(TapDragDownDetails details) {\n    widget.onTapDown?.call(details);\n    // This isn't detected as a double tap gesture in the gesture recognizer\n    // because it's 2 single taps, each of which may do different things depending\n    // on whether it's a single tap, the first tap of a double tap, the second\n    // tap held down, a clean double tap etc.\n    if (_getEffectiveConsecutiveTapCount(details.consecutiveTapCount) == 2) {\n      return widget.onDoubleTapDown?.call(details);\n    }\n\n    if (_getEffectiveConsecutiveTapCount(details.consecutiveTapCount) == 3) {\n      return widget.onTripleTapDown?.call(details);\n    }\n  }\n\n  void _handleTapUp(TapDragUpDetails details) {\n    if (_getEffectiveConsecutiveTapCount(details.consecutiveTapCount) == 1) {\n      widget.onSingleTapUp?.call(details);\n      widget.onUserTap?.call();\n    } else if (widget.onUserTapAlwaysCalled) {\n      widget.onUserTap?.call();\n    }\n  }\n\n  void _handleTapCancel() {\n    widget.onSingleTapCancel?.call();\n  }\n\n  void _handleDragStart(TapDragStartDetails details) {\n    widget.onDragSelectionStart?.call(details);\n  }\n\n  void _handleDragUpdate(TapDragUpdateDetails details) {\n    widget.onDragSelectionUpdate?.call(details);\n  }\n\n  void _handleDragEnd(TapDragEndDetails details) {\n    widget.onDragSelectionEnd?.call(details);\n  }\n\n  void _forcePressStarted(ForcePressDetails details) {\n    widget.onForcePressStart?.call(details);\n  }\n\n  void _forcePressEnded(ForcePressDetails details) {\n    widget.onForcePressEnd?.call(details);\n  }\n\n  void _handleLongPressStart(LongPressStartDetails details) {\n    widget.onSingleLongTapStart?.call(details);\n  }\n\n  void _handleLongPressMoveUpdate(LongPressMoveUpdateDetails details) {\n    widget.onSingleLongTapMoveUpdate?.call(details);\n  }\n\n  void _handleLongPressEnd(LongPressEndDetails details) {\n    widget.onSingleLongTapEnd?.call(details);\n  }\n\n  void _handleLongPressCancel() {\n    widget.onSingleLongTapCancel?.call();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final gestures = <Type, GestureRecognizerFactory>{};\n\n    gestures[TapGestureRecognizer] =\n        GestureRecognizerFactoryWithHandlers<TapGestureRecognizer>(\n          () => TapGestureRecognizer(debugOwner: this),\n          (TapGestureRecognizer instance) {\n            instance\n              ..onSecondaryTap = widget.onSecondaryTap\n              ..onSecondaryTapDown = widget.onSecondaryTapDown;\n          },\n        );\n\n    if (widget.onSingleLongTapStart != null ||\n        widget.onSingleLongTapMoveUpdate != null ||\n        widget.onSingleLongTapEnd != null ||\n        widget.onSingleLongTapCancel != null) {\n      gestures[LongPressGestureRecognizer] =\n          GestureRecognizerFactoryWithHandlers<LongPressGestureRecognizer>(\n            () => LongPressGestureRecognizer(\n              debugOwner: this,\n              supportedDevices: <PointerDeviceKind>{PointerDeviceKind.touch},\n            ),\n            (LongPressGestureRecognizer instance) {\n              instance\n                ..onLongPressStart = _handleLongPressStart\n                ..onLongPressMoveUpdate = _handleLongPressMoveUpdate\n                ..onLongPressEnd = _handleLongPressEnd\n                ..onLongPressCancel = _handleLongPressCancel;\n            },\n          );\n    }\n\n    if (widget.onDragSelectionStart != null ||\n        widget.onDragSelectionUpdate != null ||\n        widget.onDragSelectionEnd != null) {\n      switch (defaultTargetPlatform) {\n        case TargetPlatform.android:\n        case TargetPlatform.fuchsia:\n        case TargetPlatform.iOS:\n          gestures[TapAndHorizontalDragGestureRecognizer] =\n              GestureRecognizerFactoryWithHandlers<\n                TapAndHorizontalDragGestureRecognizer\n              >(\n                () => TapAndHorizontalDragGestureRecognizer(debugOwner: this),\n                (TapAndHorizontalDragGestureRecognizer instance) {\n                  instance\n                    // Text selection should start from the position of the first pointer\n                    // down event.\n                    ..dragStartBehavior = DragStartBehavior.down\n                    ..eagerVictoryOnDrag =\n                        defaultTargetPlatform != TargetPlatform.iOS\n                    ..onTapTrackStart = _handleTapTrackStart\n                    ..onTapTrackReset = _handleTapTrackReset\n                    ..onTapDown = _handleTapDown\n                    ..onDragStart = _handleDragStart\n                    ..onDragUpdate = _handleDragUpdate\n                    ..onDragEnd = _handleDragEnd\n                    ..onTapUp = _handleTapUp\n                    ..onCancel = _handleTapCancel;\n                },\n              );\n        case TargetPlatform.linux:\n        case TargetPlatform.macOS:\n        case TargetPlatform.windows:\n          gestures[TapAndPanGestureRecognizer] =\n              GestureRecognizerFactoryWithHandlers<TapAndPanGestureRecognizer>(\n                () => TapAndPanGestureRecognizer(debugOwner: this),\n                (TapAndPanGestureRecognizer instance) {\n                  instance\n                    // Text selection should start from the position of the first pointer\n                    // down event.\n                    ..dragStartBehavior = DragStartBehavior.down\n                    ..onTapTrackStart = _handleTapTrackStart\n                    ..onTapTrackReset = _handleTapTrackReset\n                    ..onTapDown = _handleTapDown\n                    ..onDragStart = _handleDragStart\n                    ..onDragUpdate = _handleDragUpdate\n                    ..onDragEnd = _handleDragEnd\n                    ..onTapUp = _handleTapUp\n                    ..onCancel = _handleTapCancel;\n                },\n              );\n      }\n    }\n\n    if (widget.onForcePressStart != null || widget.onForcePressEnd != null) {\n      gestures[ForcePressGestureRecognizer] =\n          GestureRecognizerFactoryWithHandlers<ForcePressGestureRecognizer>(\n            () => ForcePressGestureRecognizer(debugOwner: this),\n            (ForcePressGestureRecognizer instance) {\n              instance\n                ..onStart = widget.onForcePressStart != null\n                    ? _forcePressStarted\n                    : null\n                ..onEnd = widget.onForcePressEnd != null\n                    ? _forcePressEnded\n                    : null;\n            },\n          );\n    }\n\n    return RawGestureDetector(\n      gestures: gestures,\n      excludeFromSemantics: true,\n      behavior: widget.behavior,\n      child: widget.child,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/sliver_layout_builder.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:flutter/rendering.dart';\nimport 'package:flutter/widgets.dart'\n    hide\n        ConstrainedLayoutBuilder,\n        LayoutBuilder,\n        RenderConstrainedLayoutBuilder;\n\n/// Builds a sliver widget tree that can depend on its own [SliverConstraints].\n///\n/// Similar to the [LayoutBuilder] widget except its builder should return a sliver\n/// widget, and [SliverLayoutBuilder] is itself a sliver. The framework calls the\n/// [builder] function at layout time and provides the current [SliverConstraints].\n/// The [SliverLayoutBuilder]'s final [SliverGeometry] will match the [SliverGeometry]\n/// of its child.\n///\n/// {@macro flutter.widgets.ConstrainedLayoutBuilder}\n///\n/// See also:\n///\n///  * [LayoutBuilder], the non-sliver version of this widget.\nclass SliverLayoutBuilder extends ConstrainedLayoutBuilder<SliverConstraints> {\n  /// Creates a sliver widget that defers its building until layout.\n  const SliverLayoutBuilder({super.key, required super.builder});\n\n  @override\n  RenderConstrainedLayoutBuilder<SliverConstraints, RenderSliver>\n  createRenderObject(\n    BuildContext context,\n  ) => _RenderSliverLayoutBuilder();\n}\n\nclass _RenderSliverLayoutBuilder extends RenderSliver\n    with\n        RenderObjectWithChildMixin<RenderSliver>,\n        RenderObjectWithLayoutCallbackMixin,\n        RenderConstrainedLayoutBuilder<SliverConstraints, RenderSliver> {\n  @override\n  double childMainAxisPosition(RenderObject child) {\n    assert(child == this.child);\n    return 0;\n  }\n\n  @override\n  void performLayout() {\n    runLayoutCallback();\n    child?.layout(constraints, parentUsesSize: true);\n    geometry = child?.geometry ?? SliverGeometry.zero;\n  }\n\n  @override\n  void applyPaintTransform(RenderObject child, Matrix4 transform) {\n    assert(child == this.child);\n    // child's offset is always (0, 0), transform.translate(0, 0) does not mutate the transform.\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    // This renderObject does not introduce additional offset to child's position.\n    if (child?.geometry?.visible ?? false) {\n      context.paintChild(child!, offset);\n    }\n  }\n\n  @override\n  bool hitTestChildren(\n    SliverHitTestResult result, {\n    required double mainAxisPosition,\n    required double crossAxisPosition,\n  }) {\n    return child != null &&\n        child!.geometry!.hitTestExtent > 0 &&\n        child!.hitTest(\n          result,\n          mainAxisPosition: mainAxisPosition,\n          crossAxisPosition: crossAxisPosition,\n        );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/tabs.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'dart:ui' show SemanticsRole;\n\nimport 'package:flutter/foundation.dart' show clampDouble;\nimport 'package:flutter/gestures.dart' show DragStartBehavior;\nimport 'package:flutter/material.dart' hide TabBarView;\n\n/// A page view that displays the widget which corresponds to the currently\n/// selected tab.\n///\n/// This widget is typically used in conjunction with a [TabBar].\n///\n/// {@youtube 560 315 https://www.youtube.com/watch?v=POtoEH-5l40}\n///\n/// If a [TabController] is not provided, then there must be a [DefaultTabController]\n/// ancestor.\n///\n/// The tab controller's [TabController.length] must equal the length of the\n/// [children] list and the length of the [TabBar.tabs] list.\n///\n/// To see a sample implementation, visit the [TabController] documentation.\nclass CustomTabBarView extends StatefulWidget {\n  /// Creates a page view with one child per tab.\n  ///\n  /// The length of [children] must be the same as the [controller]'s length.\n  const CustomTabBarView({\n    super.key,\n    required this.children,\n    this.controller,\n    this.physics,\n    this.dragStartBehavior = DragStartBehavior.start,\n    this.viewportFraction = 1.0,\n    this.clipBehavior = Clip.hardEdge,\n    this.scrollDirection = Axis.horizontal,\n  });\n\n  /// This widget's selection and animation state.\n  ///\n  /// If [TabController] is not provided, then the value of [DefaultTabController.of]\n  /// will be used.\n  final TabController? controller;\n\n  /// One widget per tab.\n  ///\n  /// Its length must match the length of the [TabBar.tabs]\n  /// list, as well as the [controller]'s [TabController.length].\n  final List<Widget> children;\n\n  /// How the page view should respond to user input.\n  ///\n  /// For example, determines how the page view continues to animate after the\n  /// user stops dragging the page view.\n  ///\n  /// The physics are modified to snap to page boundaries using\n  /// [PageScrollPhysics] prior to being used.\n  ///\n  /// Defaults to matching platform conventions.\n  final ScrollPhysics? physics;\n\n  /// {@macro flutter.widgets.scrollable.dragStartBehavior}\n  final DragStartBehavior dragStartBehavior;\n\n  /// {@macro flutter.widgets.pageview.viewportFraction}\n  final double viewportFraction;\n\n  /// {@macro flutter.material.Material.clipBehavior}\n  ///\n  /// Defaults to [Clip.hardEdge].\n  final Clip clipBehavior;\n\n  final Axis scrollDirection;\n\n  @override\n  State<CustomTabBarView> createState() => _CustomTabBarViewState();\n}\n\nclass _CustomTabBarViewState extends State<CustomTabBarView> {\n  TabController? _controller;\n  PageController? _pageController;\n  late List<Widget> _childrenWithKey;\n  int? _currentIndex;\n  int _warpUnderwayCount = 0;\n  int _scrollUnderwayCount = 0;\n  bool _debugHasScheduledValidChildrenCountCheck = false;\n\n  // If the TabBarView is rebuilt with a new tab controller, the caller should\n  // dispose the old one. In that case the old controller's animation will be\n  // null and should not be accessed.\n  bool get _controllerIsValid => _controller?.animation != null;\n\n  void _updateTabController() {\n    final TabController? newController =\n        widget.controller ?? DefaultTabController.maybeOf(context);\n    assert(() {\n      if (newController == null) {\n        throw FlutterError(\n          'No TabController for ${widget.runtimeType}.\\n'\n          'When creating a ${widget.runtimeType}, you must either provide an explicit '\n          'TabController using the \"controller\" property, or you must ensure that there '\n          'is a DefaultTabController above the ${widget.runtimeType}.\\n'\n          'In this case, there was neither an explicit controller nor a default controller.',\n        );\n      }\n      return true;\n    }());\n\n    if (newController == _controller) {\n      return;\n    }\n\n    if (_controllerIsValid) {\n      _controller!.animation!.removeListener(_handleTabControllerAnimationTick);\n    }\n    _controller = newController;\n    if (_controller != null) {\n      _controller!.animation!.addListener(_handleTabControllerAnimationTick);\n    }\n  }\n\n  void _jumpToPage(int page) {\n    _warpUnderwayCount += 1;\n    _pageController!.jumpToPage(page);\n    _warpUnderwayCount -= 1;\n  }\n\n  Future<void> _animateToPage(\n    int page, {\n    required Duration duration,\n    required Curve curve,\n  }) async {\n    _warpUnderwayCount += 1;\n    await _pageController!.animateToPage(\n      page,\n      duration: duration,\n      curve: curve,\n    );\n    _warpUnderwayCount -= 1;\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    _updateChildren();\n  }\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    _updateTabController();\n    _currentIndex = _controller!.index;\n    if (_pageController == null) {\n      _pageController = PageController(\n        initialPage: _currentIndex!,\n        viewportFraction: widget.viewportFraction,\n      );\n    } else {\n      _pageController!.jumpToPage(_currentIndex!);\n    }\n  }\n\n  @override\n  void didUpdateWidget(CustomTabBarView oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (widget.controller != oldWidget.controller) {\n      _updateTabController();\n      _currentIndex = _controller!.index;\n      _jumpToPage(_currentIndex!);\n    }\n    if (widget.viewportFraction != oldWidget.viewportFraction) {\n      _pageController?.dispose();\n      _pageController = PageController(\n        initialPage: _currentIndex!,\n        viewportFraction: widget.viewportFraction,\n      );\n    }\n    // While a warp is under way, we stop updating the tab page contents.\n    // This is tracked in https://github.com/flutter/flutter/issues/31269.\n    if (widget.children != oldWidget.children && _warpUnderwayCount == 0) {\n      _updateChildren();\n    }\n  }\n\n  @override\n  void dispose() {\n    if (_controllerIsValid) {\n      _controller!.animation!.removeListener(_handleTabControllerAnimationTick);\n    }\n    _controller = null;\n    _pageController?.dispose();\n    // We don't own the _controller Animation, so it's not disposed here.\n    super.dispose();\n  }\n\n  void _updateChildren() {\n    _childrenWithKey = KeyedSubtree.ensureUniqueKeysForList(\n      widget.children.map<Widget>((Widget child) {\n        return Semantics(role: SemanticsRole.tabPanel, child: child);\n      }).toList(),\n    );\n  }\n\n  void _handleTabControllerAnimationTick() {\n    if (_scrollUnderwayCount > 0 || !_controller!.indexIsChanging) {\n      return;\n    } // This widget is driving the controller's animation.\n\n    if (_controller!.index != _currentIndex) {\n      _currentIndex = _controller!.index;\n      _warpToCurrentIndex();\n    }\n  }\n\n  void _warpToCurrentIndex() {\n    if (!mounted || _pageController!.page == _currentIndex!.toDouble()) {\n      return;\n    }\n\n    final bool adjacentDestination =\n        (_currentIndex! - _controller!.previousIndex).abs() == 1;\n    if (adjacentDestination) {\n      _warpToAdjacentTab(_controller!.animationDuration);\n    } else {\n      _warpToNonAdjacentTab(_controller!.animationDuration);\n    }\n  }\n\n  Future<void> _warpToAdjacentTab(Duration duration) async {\n    if (duration == Duration.zero) {\n      _jumpToPage(_currentIndex!);\n    } else {\n      await _animateToPage(\n        _currentIndex!,\n        duration: duration,\n        curve: Curves.ease,\n      );\n    }\n    if (mounted) {\n      setState(_updateChildren);\n    }\n    return Future<void>.value();\n  }\n\n  Future<void> _warpToNonAdjacentTab(Duration duration) async {\n    final int previousIndex = _controller!.previousIndex;\n    assert((_currentIndex! - previousIndex).abs() > 1);\n\n    // initialPage defines which page is shown when starting the animation.\n    // This page is adjacent to the destination page.\n    final int initialPage = _currentIndex! > previousIndex\n        ? _currentIndex! - 1\n        : _currentIndex! + 1;\n\n    setState(() {\n      // Needed for `RenderSliverMultiBoxAdaptor.move` and kept alive children.\n      // For motivation, see https://github.com/flutter/flutter/pull/29188 and\n      // https://github.com/flutter/flutter/issues/27010#issuecomment-486475152.\n      _childrenWithKey = List<Widget>.of(_childrenWithKey, growable: false);\n      final Widget temp = _childrenWithKey[initialPage];\n      _childrenWithKey[initialPage] = _childrenWithKey[previousIndex];\n      _childrenWithKey[previousIndex] = temp;\n    });\n\n    // Make a first jump to the adjacent page.\n    _jumpToPage(initialPage);\n\n    // Jump or animate to the destination page.\n    if (duration == Duration.zero) {\n      _jumpToPage(_currentIndex!);\n    } else {\n      await _animateToPage(\n        _currentIndex!,\n        duration: duration,\n        curve: Curves.ease,\n      );\n    }\n\n    if (mounted) {\n      setState(_updateChildren);\n    }\n  }\n\n  void _syncControllerOffset() {\n    _controller!.offset = clampDouble(\n      _pageController!.page! - _controller!.index,\n      -1.0,\n      1.0,\n    );\n  }\n\n  // Called when the PageView scrolls\n  bool _handleScrollNotification(ScrollNotification notification) {\n    if (_warpUnderwayCount > 0 || _scrollUnderwayCount > 0) {\n      return false;\n    }\n\n    if (notification.depth != 0) {\n      return false;\n    }\n\n    if (!_controllerIsValid) {\n      return false;\n    }\n\n    _scrollUnderwayCount += 1;\n    final double page = _pageController!.page!;\n    if (notification is ScrollUpdateNotification &&\n        !_controller!.indexIsChanging) {\n      final bool pageChanged = (page - _controller!.index).abs() > 1.0;\n      if (pageChanged) {\n        _controller!.index = page.round();\n        _currentIndex = _controller!.index;\n      }\n      _syncControllerOffset();\n    } else if (notification is ScrollEndNotification) {\n      _controller!.index = page.round();\n      _currentIndex = _controller!.index;\n      if (!_controller!.indexIsChanging) {\n        _syncControllerOffset();\n      }\n    }\n    _scrollUnderwayCount -= 1;\n\n    return false;\n  }\n\n  bool _debugScheduleCheckHasValidChildrenCount() {\n    if (_debugHasScheduledValidChildrenCountCheck) {\n      return true;\n    }\n    WidgetsBinding.instance.addPostFrameCallback((Duration duration) {\n      _debugHasScheduledValidChildrenCountCheck = false;\n      if (!mounted) {\n        return;\n      }\n      assert(() {\n        if (_controller!.length != widget.children.length) {\n          throw FlutterError(\n            \"Controller's length property (${_controller!.length}) does not match the \"\n            \"number of children (${widget.children.length}) present in TabBarView's children property.\",\n          );\n        }\n        return true;\n      }());\n    }, debugLabel: 'TabBarView.validChildrenCountCheck');\n    _debugHasScheduledValidChildrenCountCheck = true;\n    return true;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    assert(_debugScheduleCheckHasValidChildrenCount());\n\n    return NotificationListener<ScrollNotification>(\n      onNotification: _handleScrollNotification,\n      child: PageView(\n        scrollDirection: widget.scrollDirection,\n        dragStartBehavior: widget.dragStartBehavior,\n        clipBehavior: widget.clipBehavior,\n        controller: _pageController,\n        physics: widget.physics == null\n            ? const PageScrollPhysics().applyTo(const ClampingScrollPhysics())\n            : const PageScrollPhysics().applyTo(widget.physics),\n        children: _childrenWithKey,\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/text/paragraph.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// ignore_for_file: uri_does_not_exist_in_doc_import\n\n/// @docImport 'package:flutter/widgets.dart';\n///\n/// @docImport 'editable.dart';\nlibrary;\n\nimport 'dart:math' as math;\nimport 'dart:ui'\n    as ui\n    show\n        BoxHeightStyle,\n        BoxWidthStyle,\n        Gradient,\n        LineMetrics,\n        Shader,\n        TextBox,\n        TextHeightBehavior;\n\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart' hide RenderParagraph;\nimport 'package:flutter/services.dart';\n\n/// The start and end positions for a text boundary.\ntypedef _TextBoundaryRecord = ({\n  TextPosition boundaryStart,\n  TextPosition boundaryEnd,\n});\n\n/// Signature for a function that determines the [_TextBoundaryRecord] at the given\n/// [TextPosition].\ntypedef _TextBoundaryAtPosition =\n    _TextBoundaryRecord Function(TextPosition position);\n\n/// Signature for a function that determines the [_TextBoundaryRecord] at the given\n/// [TextPosition], for the given [String].\ntypedef _TextBoundaryAtPositionInText =\n    _TextBoundaryRecord Function(TextPosition position, String text);\n\nconst String _kEllipsis = '\\u2026';\n\nclass _UnspecifiedTextScaler extends TextScaler {\n  const _UnspecifiedTextScaler();\n  @override\n  Never get textScaleFactor => throw UnimplementedError();\n\n  @override\n  Never scale(double fontSize) => throw UnimplementedError();\n}\n\n/// A render object that displays a paragraph of text.\nclass RenderParagraph extends RenderBox\n    with\n        ContainerRenderObjectMixin<RenderBox, TextParentData>,\n        RenderInlineChildrenContainerDefaults,\n        RelayoutWhenSystemFontsChangeMixin {\n  /// Creates a paragraph render object.\n  ///\n  /// The [maxLines] property may be null (and indeed defaults to null), but if\n  /// it is not null, it must be greater than zero.\n  RenderParagraph(\n    InlineSpan text, {\n    TextAlign textAlign = TextAlign.start,\n    required TextDirection textDirection,\n    bool softWrap = true,\n    TextOverflow overflow = TextOverflow.clip,\n    @Deprecated(\n      'Use textScaler instead. '\n      'Use of textScaleFactor was deprecated in preparation for the upcoming nonlinear text scaling support. '\n      'This feature was deprecated after v3.12.0-2.0.pre.',\n    )\n    double textScaleFactor = 1.0,\n    TextScaler textScaler = const _UnspecifiedTextScaler(),\n    int? maxLines,\n    Locale? locale,\n    StrutStyle? strutStyle,\n    TextWidthBasis textWidthBasis = TextWidthBasis.parent,\n    ui.TextHeightBehavior? textHeightBehavior,\n    List<RenderBox>? children,\n    Color? selectionColor,\n    SelectionRegistrar? registrar,\n    required Color primary,\n    VoidCallback? onShowMore,\n  }) : assert(text.debugAssertIsValid()),\n       assert(maxLines == null || maxLines > 0),\n       assert(\n         identical(textScaler, const _UnspecifiedTextScaler()) ||\n             textScaleFactor == 1.0,\n         'textScaleFactor is deprecated and cannot be specified when textScaler is specified.',\n       ),\n       _primary = primary,\n       _onShowMore = onShowMore,\n       _softWrap = softWrap,\n       _overflow = overflow,\n       _selectionColor = selectionColor,\n       _textPainter = TextPainter(\n         text: text,\n         textAlign: textAlign,\n         textDirection: textDirection,\n         textScaler: textScaler == const _UnspecifiedTextScaler()\n             ? TextScaler.linear(textScaleFactor)\n             : textScaler,\n         maxLines: maxLines,\n         ellipsis: overflow == TextOverflow.ellipsis ? _kEllipsis : null,\n         locale: locale,\n         strutStyle: strutStyle,\n         textWidthBasis: textWidthBasis,\n         textHeightBehavior: textHeightBehavior,\n       ) {\n    addAll(children);\n    this.registrar = registrar;\n  }\n\n  static final String _placeholderCharacter = String.fromCharCode(\n    PlaceholderSpan.placeholderCodeUnit,\n  );\n\n  final TextPainter _textPainter;\n\n  // Currently, computing min/max intrinsic width/height will destroy state\n  // inside the painter. Instead of calling _layout again to get back the correct\n  // state, use a separate TextPainter for intrinsics calculation.\n  //\n  // TODO(abarth): Make computing the min/max intrinsic width/height a\n  //  non-destructive operation.\n  TextPainter? _textIntrinsicsCache;\n  TextPainter get _textIntrinsics {\n    return (_textIntrinsicsCache ??= TextPainter())\n      ..text = _textPainter.text\n      ..textAlign = _textPainter.textAlign\n      ..textDirection = _textPainter.textDirection\n      ..textScaler = _textPainter.textScaler\n      ..maxLines = _textPainter.maxLines\n      ..ellipsis = _textPainter.ellipsis\n      ..locale = _textPainter.locale\n      ..strutStyle = _textPainter.strutStyle\n      ..textWidthBasis = _textPainter.textWidthBasis\n      ..textHeightBehavior = _textPainter.textHeightBehavior;\n  }\n\n  List<AttributedString>? _cachedAttributedLabels;\n\n  List<InlineSpanSemanticsInformation>? _cachedCombinedSemanticsInfos;\n\n  /// The text to display.\n  InlineSpan get text => _textPainter.text!;\n  set text(({InlineSpan text, Color primary}) params) {\n    final value = params.text;\n    _primary = params.primary;\n    if (_morePainter case final textPainter?) {\n      final textSpan = _moreTextSpan(value.style);\n      switch (textPainter.text!.compareTo(textSpan)) {\n        case RenderComparison.paint:\n          textPainter.text = textSpan;\n        case RenderComparison.layout:\n          textPainter\n            ..text = textSpan\n            ..layout();\n        default:\n      }\n    }\n\n    switch (_textPainter.text!.compareTo(value)) {\n      case RenderComparison.identical:\n        return;\n      case RenderComparison.metadata:\n        _textPainter.text = value;\n        _cachedCombinedSemanticsInfos = null;\n        markNeedsSemanticsUpdate();\n      case RenderComparison.paint:\n        _textPainter.text = value;\n        _cachedAttributedLabels = null;\n        _cachedCombinedSemanticsInfos = null;\n        markNeedsPaint();\n        markNeedsSemanticsUpdate();\n      case RenderComparison.layout:\n        _textPainter.text = value;\n        _overflowShader = null;\n        _cachedAttributedLabels = null;\n        _cachedCombinedSemanticsInfos = null;\n        markNeedsLayout();\n        _removeSelectionRegistrarSubscription();\n        _disposeSelectableFragments();\n        _updateSelectionRegistrarSubscription();\n    }\n  }\n\n  /// The ongoing selections in this paragraph.\n  ///\n  /// The selection does not include selections in [PlaceholderSpan] if there\n  /// are any.\n  @visibleForTesting\n  List<TextSelection> get selections {\n    if (_lastSelectableFragments == null) {\n      return const <TextSelection>[];\n    }\n    final List<TextSelection> results = <TextSelection>[];\n    for (final _SelectableFragment fragment in _lastSelectableFragments!) {\n      if (fragment._textSelectionStart != null &&\n          fragment._textSelectionEnd != null) {\n        results.add(\n          TextSelection(\n            baseOffset: fragment._textSelectionStart!.offset,\n            extentOffset: fragment._textSelectionEnd!.offset,\n          ),\n        );\n      }\n    }\n    return results;\n  }\n\n  // Should be null if selection is not enabled, i.e. _registrar = null. The\n  // paragraph splits on [PlaceholderSpan.placeholderCodeUnit], and stores each\n  // fragment in this list.\n  List<_SelectableFragment>? _lastSelectableFragments;\n\n  /// The [SelectionRegistrar] this paragraph will be, or is, registered to.\n  SelectionRegistrar? get registrar => _registrar;\n  SelectionRegistrar? _registrar;\n  set registrar(SelectionRegistrar? value) {\n    if (value == _registrar) {\n      return;\n    }\n    _removeSelectionRegistrarSubscription();\n    _disposeSelectableFragments();\n    _registrar = value;\n    _updateSelectionRegistrarSubscription();\n  }\n\n  void _updateSelectionRegistrarSubscription() {\n    if (_registrar == null) {\n      return;\n    }\n    _lastSelectableFragments ??= _getSelectableFragments();\n    _lastSelectableFragments!.forEach(_registrar!.add);\n    if (_lastSelectableFragments!.isNotEmpty) {\n      markNeedsCompositingBitsUpdate();\n    }\n  }\n\n  void _removeSelectionRegistrarSubscription() {\n    if (_registrar == null || _lastSelectableFragments == null) {\n      return;\n    }\n    _lastSelectableFragments!.forEach(_registrar!.remove);\n  }\n\n  List<_SelectableFragment> _getSelectableFragments() {\n    final String plainText = text.toPlainText(includeSemanticsLabels: false);\n    final List<_SelectableFragment> result = <_SelectableFragment>[];\n    int start = 0;\n    while (start < plainText.length) {\n      int end = plainText.indexOf(_placeholderCharacter, start);\n      if (start != end) {\n        if (end == -1) {\n          end = plainText.length;\n        }\n        result.add(\n          _SelectableFragment(\n            paragraph: this,\n            range: TextRange(start: start, end: end),\n            fullText: plainText,\n          ),\n        );\n        start = end;\n      }\n      start += 1;\n    }\n    return result;\n  }\n\n  /// Determines whether the given [Selectable] was created by this\n  /// [RenderParagraph].\n  ///\n  /// The [RenderParagraph] splits its text into multiple [Selectable]s,\n  /// delimited by [PlaceholderSpan]s or [WidgetSpan]s.\n  bool selectableBelongsToParagraph(Selectable selectable) {\n    if (_lastSelectableFragments == null) {\n      return false;\n    }\n    return _lastSelectableFragments!.contains(selectable);\n  }\n\n  void _disposeSelectableFragments() {\n    if (_lastSelectableFragments == null) {\n      return;\n    }\n    for (final _SelectableFragment fragment in _lastSelectableFragments!) {\n      fragment.dispose();\n    }\n    _lastSelectableFragments = null;\n  }\n\n  @override\n  bool get alwaysNeedsCompositing =>\n      _lastSelectableFragments?.isNotEmpty ?? false;\n\n  @override\n  void markNeedsLayout() {\n    _lastSelectableFragments?.forEach(\n      (_SelectableFragment element) => element.didChangeParagraphLayout(),\n    );\n    super.markNeedsLayout();\n  }\n\n  @override\n  void dispose() {\n    _removeSelectionRegistrarSubscription();\n    _disposeSelectableFragments();\n    _textPainter.dispose();\n    _textIntrinsicsCache?.dispose();\n    _tapGestureRecognizer?.dispose();\n    _tapGestureRecognizer = null;\n    _morePainter?.dispose();\n    _morePainter = null;\n    super.dispose();\n  }\n\n  /// How the text should be aligned horizontally.\n  TextAlign get textAlign => _textPainter.textAlign;\n  set textAlign(TextAlign value) {\n    if (_textPainter.textAlign == value) {\n      return;\n    }\n    _textPainter.textAlign = value;\n    markNeedsPaint();\n  }\n\n  /// The directionality of the text.\n  ///\n  /// This decides how the [TextAlign.start], [TextAlign.end], and\n  /// [TextAlign.justify] values of [textAlign] are interpreted.\n  ///\n  /// This is also used to disambiguate how to render bidirectional text. For\n  /// example, if the [text] is an English phrase followed by a Hebrew phrase,\n  /// in a [TextDirection.ltr] context the English phrase will be on the left\n  /// and the Hebrew phrase to its right, while in a [TextDirection.rtl]\n  /// context, the English phrase will be on the right and the Hebrew phrase on\n  /// its left.\n  TextDirection get textDirection => _textPainter.textDirection!;\n  set textDirection(TextDirection value) {\n    if (_textPainter.textDirection == value) {\n      return;\n    }\n    _textPainter.textDirection = value;\n    markNeedsLayout();\n  }\n\n  /// Whether the text should break at soft line breaks.\n  ///\n  /// If false, the glyphs in the text will be positioned as if there was\n  /// unlimited horizontal space.\n  ///\n  /// If [softWrap] is false, [overflow] and [textAlign] may have unexpected\n  /// effects.\n  bool get softWrap => _softWrap;\n  bool _softWrap;\n  set softWrap(bool value) {\n    if (_softWrap == value) {\n      return;\n    }\n    _softWrap = value;\n    markNeedsLayout();\n  }\n\n  /// How visual overflow should be handled.\n  TextOverflow get overflow => _overflow;\n  TextOverflow _overflow;\n  set overflow(TextOverflow value) {\n    if (_overflow == value) {\n      return;\n    }\n    _overflow = value;\n    _textPainter.ellipsis = value == TextOverflow.ellipsis ? _kEllipsis : null;\n    markNeedsLayout();\n  }\n\n  /// Deprecated. Will be removed in a future version of Flutter. Use\n  /// [textScaler] instead.\n  ///\n  /// The number of font pixels for each logical pixel.\n  ///\n  /// For example, if the text scale factor is 1.5, text will be 50% larger than\n  /// the specified font size.\n  @Deprecated(\n    'Use textScaler instead. '\n    'Use of textScaleFactor was deprecated in preparation for the upcoming nonlinear text scaling support. '\n    'This feature was deprecated after v3.12.0-2.0.pre.',\n  )\n  double get textScaleFactor => _textPainter.textScaleFactor;\n  @Deprecated(\n    'Use textScaler instead. '\n    'Use of textScaleFactor was deprecated in preparation for the upcoming nonlinear text scaling support. '\n    'This feature was deprecated after v3.12.0-2.0.pre.',\n  )\n  set textScaleFactor(double value) {\n    textScaler = TextScaler.linear(value);\n  }\n\n  /// {@macro flutter.painting.textPainter.textScaler}\n  TextScaler get textScaler => _textPainter.textScaler;\n  set textScaler(TextScaler value) {\n    if (_textPainter.textScaler == value) {\n      return;\n    }\n    _morePainter\n      ?..textScaler = value\n      ..layout();\n    _textPainter.textScaler = value;\n    _overflowShader = null;\n    markNeedsLayout();\n  }\n\n  /// An optional maximum number of lines for the text to span, wrapping if\n  /// necessary. If the text exceeds the given number of lines, it will be\n  /// truncated according to [overflow] and [softWrap].\n  int? get maxLines => _textPainter.maxLines;\n\n  /// The value may be null. If it is not null, then it must be greater than\n  /// zero.\n  set maxLines(int? value) {\n    assert(value == null || value > 0);\n    if (_textPainter.maxLines == value) {\n      return;\n    }\n    _textPainter.maxLines = value;\n    _overflowShader = null;\n    markNeedsLayout();\n  }\n\n  /// Used by this paragraph's internal [TextPainter] to select a\n  /// locale-specific font.\n  ///\n  /// In some cases, the same Unicode character may be rendered differently\n  /// depending on the locale. For example, the '骨' character is rendered\n  /// differently in the Chinese and Japanese locales. In these cases, the\n  /// [locale] may be used to select a locale-specific font.\n  Locale? get locale => _textPainter.locale;\n\n  /// The value may be null.\n  set locale(Locale? value) {\n    if (_textPainter.locale == value) {\n      return;\n    }\n    _textPainter.locale = value;\n    _overflowShader = null;\n    markNeedsLayout();\n  }\n\n  /// {@macro flutter.painting.textPainter.strutStyle}\n  StrutStyle? get strutStyle => _textPainter.strutStyle;\n\n  /// The value may be null.\n  set strutStyle(StrutStyle? value) {\n    if (_textPainter.strutStyle == value) {\n      return;\n    }\n    _textPainter.strutStyle = value;\n    _overflowShader = null;\n    markNeedsLayout();\n  }\n\n  /// {@macro flutter.painting.textPainter.textWidthBasis}\n  TextWidthBasis get textWidthBasis => _textPainter.textWidthBasis;\n  set textWidthBasis(TextWidthBasis value) {\n    if (_textPainter.textWidthBasis == value) {\n      return;\n    }\n    _textPainter.textWidthBasis = value;\n    _overflowShader = null;\n    markNeedsLayout();\n  }\n\n  /// {@macro dart.ui.textHeightBehavior}\n  ui.TextHeightBehavior? get textHeightBehavior =>\n      _textPainter.textHeightBehavior;\n  set textHeightBehavior(ui.TextHeightBehavior? value) {\n    if (_textPainter.textHeightBehavior == value) {\n      return;\n    }\n    _textPainter.textHeightBehavior = value;\n    _overflowShader = null;\n    markNeedsLayout();\n  }\n\n  /// The color to use when painting the selection.\n  ///\n  /// Ignored if the text is not selectable (e.g. if [registrar] is null).\n  Color? get selectionColor => _selectionColor;\n  Color? _selectionColor;\n  set selectionColor(Color? value) {\n    if (_selectionColor == value) {\n      return;\n    }\n    _selectionColor = value;\n    if (_lastSelectableFragments?.any(\n          (_SelectableFragment fragment) => fragment.value.hasSelection,\n        ) ??\n        false) {\n      markNeedsPaint();\n    }\n  }\n\n  Offset _getOffsetForPosition(TextPosition position) {\n    return getOffsetForCaret(position, Rect.zero) +\n        Offset(0, getFullHeightForCaret(position));\n  }\n\n  @override\n  double computeMinIntrinsicWidth(double height) {\n    final List<PlaceholderDimensions> placeholderDimensions =\n        layoutInlineChildren(\n          double.infinity,\n          (RenderBox child, BoxConstraints constraints) =>\n              Size(child.getMinIntrinsicWidth(double.infinity), 0.0),\n          ChildLayoutHelper.getDryBaseline,\n        );\n    return (_textIntrinsics\n          ..setPlaceholderDimensions(placeholderDimensions)\n          ..layout())\n        .minIntrinsicWidth;\n  }\n\n  @override\n  double computeMaxIntrinsicWidth(double height) {\n    final List<PlaceholderDimensions>\n    placeholderDimensions = layoutInlineChildren(\n      double.infinity,\n      // Height and baseline is irrelevant as all text will be laid\n      // out in a single line. Therefore, using 0.0 as a dummy for the height.\n      (RenderBox child, BoxConstraints constraints) =>\n          Size(child.getMaxIntrinsicWidth(double.infinity), 0.0),\n      ChildLayoutHelper.getDryBaseline,\n    );\n    return (_textIntrinsics\n          ..setPlaceholderDimensions(placeholderDimensions)\n          ..layout())\n        .maxIntrinsicWidth;\n  }\n\n  /// An estimate of the height of a line in the text. See [TextPainter.preferredLineHeight].\n  ///\n  /// This does not require the layout to be updated.\n  @visibleForTesting\n  double get preferredLineHeight => _textPainter.preferredLineHeight;\n\n  double _computeIntrinsicHeight(double width) {\n    return (_textIntrinsics\n          ..setPlaceholderDimensions(\n            layoutInlineChildren(\n              width,\n              ChildLayoutHelper.dryLayoutChild,\n              ChildLayoutHelper.getDryBaseline,\n            ),\n          )\n          ..layout(minWidth: width, maxWidth: _adjustMaxWidth(width)))\n        .height;\n  }\n\n  @override\n  double computeMinIntrinsicHeight(double width) {\n    return _computeIntrinsicHeight(width);\n  }\n\n  @override\n  double computeMaxIntrinsicHeight(double width) {\n    return _computeIntrinsicHeight(width);\n  }\n\n  @override\n  bool hitTestSelf(Offset position) => true;\n\n  @override\n  @protected\n  bool hitTestChildren(BoxHitTestResult result, {required Offset position}) {\n    if (_tapGestureRecognizer != null) {\n      if (_morePainter case final textPainter?) {\n        late final height = _textPainter.height;\n        if (position.dx < textPainter.width &&\n            position.dy > height &&\n            position.dy < height + textPainter.height) {\n          result.add(HitTestEntry(textPainter.text as TextSpan));\n          return true;\n        }\n      }\n    }\n\n    final GlyphInfo? glyph = _textPainter.getClosestGlyphForOffset(position);\n    // The hit-test can't fall through the horizontal gaps between visually\n    // adjacent characters on the same line, even with a large letter-spacing or\n    // text justification, as graphemeClusterLayoutBounds.width is the advance\n    // width to the next character, so there's no gap between their\n    // graphemeClusterLayoutBounds rects.\n    final InlineSpan? spanHit =\n        glyph != null && glyph.graphemeClusterLayoutBounds.contains(position)\n        ? _textPainter.text!.getSpanForPosition(\n            TextPosition(offset: glyph.graphemeClusterCodeUnitRange.start),\n          )\n        : null;\n    switch (spanHit) {\n      case final HitTestTarget span:\n        result.add(HitTestEntry(span));\n        return true;\n      case _:\n        return hitTestInlineChildren(result, position);\n    }\n  }\n\n  bool _needsClipping = false;\n  ui.Shader? _overflowShader;\n\n  /// Whether this paragraph currently has a [dart:ui.Shader] for its overflow\n  /// effect.\n  ///\n  /// Used to test this object. Not for use in production.\n  @visibleForTesting\n  bool get debugHasOverflowShader => _overflowShader != null;\n\n  @override\n  void systemFontsDidChange() {\n    super.systemFontsDidChange();\n    _textPainter.markNeedsLayout();\n  }\n\n  // Placeholder dimensions representing the sizes of child inline widgets.\n  //\n  // These need to be cached because the text painter's placeholder dimensions\n  // will be overwritten during intrinsic width/height calculations and must be\n  // restored to the original values before final layout and painting.\n  List<PlaceholderDimensions>? _placeholderDimensions;\n\n  double _adjustMaxWidth(double maxWidth) {\n    return softWrap || overflow == TextOverflow.ellipsis\n        ? maxWidth\n        : double.infinity;\n  }\n\n  void _layoutTextWithConstraints(BoxConstraints constraints) {\n    _textPainter\n      ..setPlaceholderDimensions(_placeholderDimensions)\n      ..layout(\n        minWidth: constraints.minWidth,\n        maxWidth: _adjustMaxWidth(constraints.maxWidth),\n      );\n  }\n\n  @override\n  @protected\n  Size computeDryLayout(covariant BoxConstraints constraints) {\n    final Size size =\n        (_textIntrinsics\n              ..setPlaceholderDimensions(\n                layoutInlineChildren(\n                  constraints.maxWidth,\n                  ChildLayoutHelper.dryLayoutChild,\n                  ChildLayoutHelper.getDryBaseline,\n                ),\n              )\n              ..layout(\n                minWidth: constraints.minWidth,\n                maxWidth: _adjustMaxWidth(constraints.maxWidth),\n              ))\n            .size;\n    return constraints.constrain(size);\n  }\n\n  @override\n  double computeDistanceToActualBaseline(TextBaseline baseline) {\n    assert(!debugNeedsLayout);\n    assert(constraints.debugAssertIsValid());\n    _layoutTextWithConstraints(constraints);\n    // TODO(garyq): Since our metric for ideographic baseline is currently\n    // inaccurate and the non-alphabetic baselines are based off of the\n    // alphabetic baseline, we use the alphabetic for now to produce correct\n    // layouts. We should eventually change this back to pass the `baseline`\n    // property when the ideographic baseline is properly implemented\n    // (https://github.com/flutter/flutter/issues/22625).\n    return _textPainter.computeDistanceToActualBaseline(\n      TextBaseline.alphabetic,\n    );\n  }\n\n  @override\n  double computeDryBaseline(\n    covariant BoxConstraints constraints,\n    TextBaseline baseline,\n  ) {\n    assert(constraints.debugAssertIsValid());\n    _textIntrinsics\n      ..setPlaceholderDimensions(\n        layoutInlineChildren(\n          constraints.maxWidth,\n          ChildLayoutHelper.dryLayoutChild,\n          ChildLayoutHelper.getDryBaseline,\n        ),\n      )\n      ..layout(\n        minWidth: constraints.minWidth,\n        maxWidth: _adjustMaxWidth(constraints.maxWidth),\n      );\n    return _textIntrinsics.computeDistanceToActualBaseline(\n      TextBaseline.alphabetic,\n    );\n  }\n\n  Color _primary;\n\n  VoidCallback? _onShowMore;\n  set onShowMore(VoidCallback? onShowMore) {\n    if (_onShowMore != onShowMore) {\n      _onShowMore = onShowMore;\n      _tapGestureRecognizer?.onTap = onShowMore;\n    }\n  }\n\n  TapGestureRecognizer? _tapGestureRecognizer;\n\n  TextSpan _moreTextSpan([TextStyle? style]) => TextSpan(\n    style: (style ?? text.style!).copyWith(color: _primary),\n    text: '查看更多',\n    recognizer: _tapGestureRecognizer,\n  );\n  TextPainter? _morePainter;\n\n  bool didOverflowHeight = false;\n\n  @override\n  void performLayout() {\n    _lastSelectableFragments?.forEach(\n      (_SelectableFragment element) => element.didChangeParagraphLayout(),\n    );\n    final BoxConstraints constraints = this.constraints;\n    _placeholderDimensions = layoutInlineChildren(\n      constraints.maxWidth,\n      ChildLayoutHelper.layoutChild,\n      ChildLayoutHelper.getBaseline,\n    );\n    _layoutTextWithConstraints(constraints);\n    positionInlineChildren(_textPainter.inlinePlaceholderBoxes!);\n\n    final Size textSize = _textPainter.size;\n    size = constraints.constrain(textSize);\n\n    didOverflowHeight =\n        size.height < textSize.height || _textPainter.didExceedMaxLines;\n\n    if (didOverflowHeight) {\n      if (_onShowMore != null) {\n        _tapGestureRecognizer ??= TapGestureRecognizer()..onTap = _onShowMore;\n      }\n      _morePainter ??= TextPainter(\n        text: _moreTextSpan(),\n        textDirection: textDirection,\n        textScaler: textScaler,\n        locale: locale,\n      )..layout(maxWidth: constraints.maxWidth);\n      size = Size(\n        size.width,\n        constraints.constrainHeight(size.height + _morePainter!.height),\n      );\n    }\n\n    final bool didOverflowWidth = size.width < textSize.width;\n    // TODO(abarth): We're only measuring the sizes of the line boxes here. If\n    // the glyphs draw outside the line boxes, we might think that there isn't\n    // visual overflow when there actually is visual overflow. This can become\n    // a problem if we start having horizontal overflow and introduce a clip\n    // that affects the actual (but undetected) vertical overflow.\n    final bool hasVisualOverflow = didOverflowWidth || didOverflowHeight;\n    if (hasVisualOverflow) {\n      switch (_overflow) {\n        case TextOverflow.visible:\n          _needsClipping = false;\n          _overflowShader = null;\n        case TextOverflow.clip:\n        case TextOverflow.ellipsis:\n          _needsClipping = true;\n          _overflowShader = null;\n        case TextOverflow.fade:\n          _needsClipping = true;\n          final TextPainter fadeSizePainter = TextPainter(\n            text: TextSpan(style: _textPainter.text!.style, text: '\\u2026'),\n            textDirection: textDirection,\n            textScaler: textScaler,\n            locale: locale,\n          )..layout();\n          if (didOverflowWidth) {\n            final (double fadeStart, double fadeEnd) = switch (textDirection) {\n              TextDirection.rtl => (fadeSizePainter.width, 0.0),\n              TextDirection.ltr => (\n                size.width - fadeSizePainter.width,\n                size.width,\n              ),\n            };\n            _overflowShader = ui.Gradient.linear(\n              Offset(fadeStart, 0.0),\n              Offset(fadeEnd, 0.0),\n              <Color>[const Color(0xFFFFFFFF), const Color(0x00FFFFFF)],\n            );\n          } else {\n            final double fadeEnd = size.height;\n            final double fadeStart = fadeEnd - fadeSizePainter.height / 2.0;\n            _overflowShader = ui.Gradient.linear(\n              Offset(0.0, fadeStart),\n              Offset(0.0, fadeEnd),\n              <Color>[const Color(0xFFFFFFFF), const Color(0x00FFFFFF)],\n            );\n          }\n          fadeSizePainter.dispose();\n      }\n    } else {\n      _needsClipping = false;\n      _overflowShader = null;\n    }\n  }\n\n  @override\n  void applyPaintTransform(RenderBox child, Matrix4 transform) {\n    defaultApplyPaintTransform(child, transform);\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    // Text alignment only triggers repaint so it's possible the text layout has\n    // been invalidated but performLayout wasn't called at this point. Make sure\n    // the TextPainter has a valid layout.\n    _layoutTextWithConstraints(constraints);\n    assert(() {\n      if (debugRepaintTextRainbowEnabled) {\n        final Paint paint = Paint()..color = debugCurrentRepaintColor.toColor();\n        context.canvas.drawRect(offset & size, paint);\n      }\n      return true;\n    }());\n\n    if (_needsClipping) {\n      final Rect bounds = offset & size;\n      if (_overflowShader != null) {\n        // This layer limits what the shader below blends with to be just the\n        // text (as opposed to the text and its background).\n        context.canvas.saveLayer(bounds, Paint());\n      } else {\n        context.canvas.save();\n      }\n      context.canvas.clipRect(bounds);\n    }\n\n    if (_lastSelectableFragments != null) {\n      for (final _SelectableFragment fragment in _lastSelectableFragments!) {\n        fragment.paint(context, offset);\n      }\n    }\n\n    assert(() {\n      _textPainter.debugPaintTextLayoutBoxes = debugPaintTextLayoutBoxes;\n      return true;\n    }());\n\n    _textPainter.paint(context.canvas, offset);\n\n    paintInlineChildren(context, offset);\n\n    if (_needsClipping) {\n      if (_overflowShader != null) {\n        context.canvas.translate(offset.dx, offset.dy);\n        final Paint paint = Paint()\n          ..blendMode = BlendMode.modulate\n          ..shader = _overflowShader;\n        context.canvas.drawRect(Offset.zero & size, paint);\n      }\n      context.canvas.restore();\n    }\n\n    if (didOverflowHeight) {\n      _morePainter?.paint(\n        context.canvas,\n        offset + Offset(0, _textPainter.height),\n      );\n    }\n  }\n\n  /// Returns the offset at which to paint the caret.\n  ///\n  /// Valid only after [layout].\n  Offset getOffsetForCaret(TextPosition position, Rect caretPrototype) {\n    assert(!debugNeedsLayout);\n    _layoutTextWithConstraints(constraints);\n    return _textPainter.getOffsetForCaret(position, caretPrototype);\n  }\n\n  /// {@macro flutter.painting.textPainter.getFullHeightForCaret}\n  ///\n  /// Valid only after [layout].\n  double getFullHeightForCaret(TextPosition position) {\n    assert(!debugNeedsLayout);\n    _layoutTextWithConstraints(constraints);\n    return _textPainter.getFullHeightForCaret(position, Rect.zero);\n  }\n\n  /// Returns a list of rects that bound the given selection.\n  ///\n  /// The [boxHeightStyle] and [boxWidthStyle] arguments may be used to select\n  /// the shape of the [TextBox]es. These properties default to\n  /// [ui.BoxHeightStyle.tight] and [ui.BoxWidthStyle.tight] respectively.\n  ///\n  /// A given selection might have more than one rect if the [RenderParagraph]\n  /// contains multiple [InlineSpan]s or bidirectional text, because logically\n  /// contiguous text might not be visually contiguous.\n  ///\n  /// Valid only after [layout].\n  ///\n  /// See also:\n  ///\n  ///  * [TextPainter.getBoxesForSelection], the method in TextPainter to get\n  ///    the equivalent boxes.\n  List<ui.TextBox> getBoxesForSelection(\n    TextSelection selection, {\n    ui.BoxHeightStyle boxHeightStyle = ui.BoxHeightStyle.tight,\n    ui.BoxWidthStyle boxWidthStyle = ui.BoxWidthStyle.tight,\n  }) {\n    assert(!debugNeedsLayout);\n    _layoutTextWithConstraints(constraints);\n    return _textPainter.getBoxesForSelection(\n      selection,\n      boxHeightStyle: boxHeightStyle,\n      boxWidthStyle: boxWidthStyle,\n    );\n  }\n\n  /// Returns the position within the text for the given pixel offset.\n  ///\n  /// Valid only after [layout].\n  TextPosition getPositionForOffset(Offset offset) {\n    assert(!debugNeedsLayout);\n    _layoutTextWithConstraints(constraints);\n    return _textPainter.getPositionForOffset(offset);\n  }\n\n  /// Returns the text range of the word at the given offset. Characters not\n  /// part of a word, such as spaces, symbols, and punctuation, have word breaks\n  /// on both sides. In such cases, this method will return a text range that\n  /// contains the given text position.\n  ///\n  /// Word boundaries are defined more precisely in Unicode Standard Annex #29\n  /// <http://www.unicode.org/reports/tr29/#Word_Boundaries>.\n  ///\n  /// Valid only after [layout].\n  TextRange getWordBoundary(TextPosition position) {\n    assert(!debugNeedsLayout);\n    _layoutTextWithConstraints(constraints);\n    return _textPainter.getWordBoundary(position);\n  }\n\n  TextRange _getLineAtOffset(TextPosition position) =>\n      _textPainter.getLineBoundary(position);\n\n  TextPosition _getTextPositionAbove(TextPosition position) {\n    // -0.5 of preferredLineHeight points to the middle of the line above.\n    final double preferredLineHeight = _textPainter.preferredLineHeight;\n    final double verticalOffset = -0.5 * preferredLineHeight;\n    return _getTextPositionVertical(position, verticalOffset);\n  }\n\n  TextPosition _getTextPositionBelow(TextPosition position) {\n    // 1.5 of preferredLineHeight points to the middle of the line below.\n    final double preferredLineHeight = _textPainter.preferredLineHeight;\n    final double verticalOffset = 1.5 * preferredLineHeight;\n    return _getTextPositionVertical(position, verticalOffset);\n  }\n\n  TextPosition _getTextPositionVertical(\n    TextPosition position,\n    double verticalOffset,\n  ) {\n    final Offset caretOffset = _textPainter.getOffsetForCaret(\n      position,\n      Rect.zero,\n    );\n    final Offset caretOffsetTranslated = caretOffset.translate(\n      0.0,\n      verticalOffset,\n    );\n    return _textPainter.getPositionForOffset(caretOffsetTranslated);\n  }\n\n  /// Returns the size of the text as laid out.\n  ///\n  /// This can differ from [size] if the text overflowed or if the [constraints]\n  /// provided by the parent [RenderObject] forced the layout to be bigger than\n  /// necessary for the given [text].\n  ///\n  /// This returns the [TextPainter.size] of the underlying [TextPainter].\n  ///\n  /// Valid only after [layout].\n  Size get textSize {\n    assert(!debugNeedsLayout);\n    return _textPainter.size;\n  }\n\n  /// Whether the text was truncated or ellipsized as laid out.\n  ///\n  /// This returns the [TextPainter.didExceedMaxLines] of the underlying [TextPainter].\n  ///\n  /// Valid only after [layout].\n  bool get didExceedMaxLines {\n    assert(!debugNeedsLayout);\n    return _textPainter.didExceedMaxLines;\n  }\n\n  /// Collected during [describeSemanticsConfiguration], used by\n  /// [assembleSemanticsNode].\n  List<InlineSpanSemanticsInformation>? _semanticsInfo;\n\n  @override\n  void describeSemanticsConfiguration(SemanticsConfiguration config) {\n    super.describeSemanticsConfiguration(config);\n    _semanticsInfo = text.getSemanticsInformation();\n    bool needsAssembleSemanticsNode = false;\n    bool needsChildConfigurationsDelegate = false;\n    for (final InlineSpanSemanticsInformation info in _semanticsInfo!) {\n      if (info.recognizer != null || info.semanticsIdentifier != null) {\n        needsAssembleSemanticsNode = true;\n        break;\n      }\n      needsChildConfigurationsDelegate =\n          needsChildConfigurationsDelegate || info.isPlaceholder;\n    }\n\n    if (needsAssembleSemanticsNode) {\n      config\n        ..explicitChildNodes = true\n        ..isSemanticBoundary = true;\n    } else if (needsChildConfigurationsDelegate) {\n      config.childConfigurationsDelegate =\n          _childSemanticsConfigurationsDelegate;\n    } else {\n      if (_cachedAttributedLabels == null) {\n        final StringBuffer buffer = StringBuffer();\n        int offset = 0;\n        final List<StringAttribute> attributes = <StringAttribute>[];\n        for (final InlineSpanSemanticsInformation info in _semanticsInfo!) {\n          final String label = info.semanticsLabel ?? info.text;\n          for (final StringAttribute infoAttribute in info.stringAttributes) {\n            final TextRange originalRange = infoAttribute.range;\n            attributes.add(\n              infoAttribute.copy(\n                range: TextRange(\n                  start: offset + originalRange.start,\n                  end: offset + originalRange.end,\n                ),\n              ),\n            );\n          }\n          buffer.write(label);\n          offset += label.length;\n        }\n        _cachedAttributedLabels = <AttributedString>[\n          AttributedString(buffer.toString(), attributes: attributes),\n        ];\n      }\n      config\n        ..attributedLabel = _cachedAttributedLabels![0]\n        ..textDirection = textDirection;\n    }\n  }\n\n  ChildSemanticsConfigurationsResult _childSemanticsConfigurationsDelegate(\n    List<SemanticsConfiguration> childConfigs,\n  ) {\n    final ChildSemanticsConfigurationsResultBuilder builder =\n        ChildSemanticsConfigurationsResultBuilder();\n    int placeholderIndex = 0;\n    int childConfigsIndex = 0;\n    int attributedLabelCacheIndex = 0;\n    InlineSpanSemanticsInformation? seenTextInfo;\n    _cachedCombinedSemanticsInfos ??= combineSemanticsInfo(_semanticsInfo!);\n    for (final InlineSpanSemanticsInformation info\n        in _cachedCombinedSemanticsInfos!) {\n      if (info.isPlaceholder) {\n        if (seenTextInfo != null) {\n          builder.markAsMergeUp(\n            _createSemanticsConfigForTextInfo(\n              seenTextInfo,\n              attributedLabelCacheIndex,\n            ),\n          );\n          attributedLabelCacheIndex += 1;\n        }\n        // Mark every childConfig belongs to this placeholder to merge up group.\n        while (childConfigsIndex < childConfigs.length &&\n            childConfigs[childConfigsIndex].tagsChildrenWith(\n              PlaceholderSpanIndexSemanticsTag(placeholderIndex),\n            )) {\n          builder.markAsMergeUp(childConfigs[childConfigsIndex]);\n          childConfigsIndex += 1;\n        }\n        placeholderIndex += 1;\n      } else {\n        seenTextInfo = info;\n      }\n    }\n\n    // Handle plain text info at the end.\n    if (seenTextInfo != null) {\n      builder.markAsMergeUp(\n        _createSemanticsConfigForTextInfo(\n          seenTextInfo,\n          attributedLabelCacheIndex,\n        ),\n      );\n    }\n    return builder.build();\n  }\n\n  SemanticsConfiguration _createSemanticsConfigForTextInfo(\n    InlineSpanSemanticsInformation textInfo,\n    int cacheIndex,\n  ) {\n    assert(!textInfo.requiresOwnNode);\n    final List<AttributedString> cachedStrings = _cachedAttributedLabels ??=\n        <AttributedString>[];\n    assert(cacheIndex <= cachedStrings.length);\n    final bool hasCache = cacheIndex < cachedStrings.length;\n\n    late AttributedString attributedLabel;\n    if (hasCache) {\n      attributedLabel = cachedStrings[cacheIndex];\n    } else {\n      assert(cachedStrings.length == cacheIndex);\n      attributedLabel = AttributedString(\n        textInfo.semanticsLabel ?? textInfo.text,\n        attributes: textInfo.stringAttributes,\n      );\n      cachedStrings.add(attributedLabel);\n    }\n    return SemanticsConfiguration()\n      ..textDirection = textDirection\n      ..attributedLabel = attributedLabel;\n  }\n\n  // Caches [SemanticsNode]s created during [assembleSemanticsNode] so they\n  // can be re-used when [assembleSemanticsNode] is called again. This ensures\n  // stable ids for the [SemanticsNode]s of [TextSpan]s across\n  // [assembleSemanticsNode] invocations.\n  Map<Key, SemanticsNode>? _cachedChildNodes;\n\n  @override\n  void assembleSemanticsNode(\n    SemanticsNode node,\n    SemanticsConfiguration config,\n    Iterable<SemanticsNode> children,\n  ) {\n    assert(_semanticsInfo != null && _semanticsInfo!.isNotEmpty);\n    final List<SemanticsNode> newChildren = <SemanticsNode>[];\n    TextDirection currentDirection = textDirection;\n    Rect currentRect;\n    double ordinal = 0.0;\n    int start = 0;\n    int placeholderIndex = 0;\n    int childIndex = 0;\n    RenderBox? child = firstChild;\n    final Map<Key, SemanticsNode> newChildCache = <Key, SemanticsNode>{};\n    _cachedCombinedSemanticsInfos ??= combineSemanticsInfo(_semanticsInfo!);\n    for (final InlineSpanSemanticsInformation info\n        in _cachedCombinedSemanticsInfos!) {\n      final TextSelection selection = TextSelection(\n        baseOffset: start,\n        extentOffset: start + info.text.length,\n      );\n      start += info.text.length;\n\n      if (info.isPlaceholder) {\n        // A placeholder span may have 0 to multiple semantics nodes, we need\n        // to annotate all of the semantics nodes belong to this span.\n        while (children.length > childIndex &&\n            children\n                .elementAt(childIndex)\n                .isTagged(PlaceholderSpanIndexSemanticsTag(placeholderIndex))) {\n          final SemanticsNode childNode = children.elementAt(childIndex);\n          final TextParentData parentData =\n              child!.parentData! as TextParentData;\n          // parentData.scale may be null if the render object is truncated.\n          if (parentData.offset != null) {\n            newChildren.add(childNode);\n          }\n          childIndex += 1;\n        }\n        child = childAfter(child!);\n        placeholderIndex += 1;\n      } else {\n        final TextDirection initialDirection = currentDirection;\n        final List<ui.TextBox> rects = getBoxesForSelection(selection);\n        if (rects.isEmpty) {\n          continue;\n        }\n        Rect rect = rects.first.toRect();\n        currentDirection = rects.first.direction;\n        for (final ui.TextBox textBox in rects.skip(1)) {\n          rect = rect.expandToInclude(textBox.toRect());\n          currentDirection = textBox.direction;\n        }\n        // Any of the text boxes may have had infinite dimensions.\n        // We shouldn't pass infinite dimensions up to the bridges.\n        rect = Rect.fromLTWH(\n          math.max(0.0, rect.left),\n          math.max(0.0, rect.top),\n          math.min(rect.width, constraints.maxWidth),\n          math.min(rect.height, constraints.maxHeight),\n        );\n        // round the current rectangle to make this API testable and add some\n        // padding so that the accessibility rects do not overlap with the text.\n        currentRect = Rect.fromLTRB(\n          rect.left.floorToDouble() - 4.0,\n          rect.top.floorToDouble() - 4.0,\n          rect.right.ceilToDouble() + 4.0,\n          rect.bottom.ceilToDouble() + 4.0,\n        );\n        final SemanticsConfiguration configuration = SemanticsConfiguration()\n          ..sortKey = OrdinalSortKey(ordinal++)\n          ..textDirection = initialDirection\n          ..identifier = info.semanticsIdentifier ?? ''\n          ..attributedLabel = AttributedString(\n            info.semanticsLabel ?? info.text,\n            attributes: info.stringAttributes,\n          );\n        switch (info.recognizer) {\n          case TapGestureRecognizer(onTap: final VoidCallback? handler):\n          case DoubleTapGestureRecognizer(\n            onDoubleTap: final VoidCallback? handler,\n          ):\n            if (handler != null) {\n              configuration\n                ..onTap = handler\n                ..isLink = true;\n            }\n          case LongPressGestureRecognizer(\n            onLongPress: final GestureLongPressCallback? onLongPress,\n          ):\n            if (onLongPress != null) {\n              configuration.onLongPress = onLongPress;\n            }\n          case null:\n            break;\n          default:\n            assert(false, '${info.recognizer.runtimeType} is not supported.');\n        }\n        if (node.parentPaintClipRect != null) {\n          final Rect paintRect = node.parentPaintClipRect!.intersect(\n            currentRect,\n          );\n          configuration.isHidden = paintRect.isEmpty && !currentRect.isEmpty;\n        }\n        final SemanticsNode newChild;\n        if (_cachedChildNodes?.isNotEmpty ?? false) {\n          newChild = _cachedChildNodes!.remove(_cachedChildNodes!.keys.first)!;\n        } else {\n          final UniqueKey key = UniqueKey();\n          newChild = SemanticsNode(\n            key: key,\n            showOnScreen: _createShowOnScreenFor(key),\n          );\n        }\n        newChild\n          ..updateWith(config: configuration)\n          ..rect = currentRect;\n        newChildCache[newChild.key!] = newChild;\n        newChildren.add(newChild);\n      }\n    }\n    // Makes sure we annotated all of the semantics children.\n    assert(childIndex == children.length);\n    assert(child == null);\n\n    _cachedChildNodes = newChildCache;\n    node.updateWith(config: config, childrenInInversePaintOrder: newChildren);\n  }\n\n  VoidCallback? _createShowOnScreenFor(Key key) {\n    return () {\n      final SemanticsNode node = _cachedChildNodes![key]!;\n      showOnScreen(descendant: this, rect: node.rect);\n    };\n  }\n\n  @override\n  void clearSemantics() {\n    super.clearSemantics();\n    _cachedChildNodes = null;\n  }\n\n  @override\n  List<DiagnosticsNode> debugDescribeChildren() {\n    return <DiagnosticsNode>[\n      text.toDiagnosticsNode(\n        name: 'text',\n        style: DiagnosticsTreeStyle.transition,\n      ),\n    ];\n  }\n\n  @override\n  void debugFillProperties(DiagnosticPropertiesBuilder properties) {\n    super.debugFillProperties(properties);\n    properties\n      ..add(EnumProperty<TextAlign>('textAlign', textAlign))\n      ..add(EnumProperty<TextDirection>('textDirection', textDirection))\n      ..add(\n        FlagProperty(\n          'softWrap',\n          value: softWrap,\n          ifTrue: 'wrapping at box width',\n          ifFalse: 'no wrapping except at line break characters',\n          showName: true,\n        ),\n      )\n      ..add(EnumProperty<TextOverflow>('overflow', overflow))\n      ..add(\n        DiagnosticsProperty<TextScaler>(\n          'textScaler',\n          textScaler,\n          defaultValue: TextScaler.noScaling,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<Locale>('locale', locale, defaultValue: null),\n      )\n      ..add(IntProperty('maxLines', maxLines, ifNull: 'unlimited'));\n  }\n}\n\n/// A continuous, selectable piece of paragraph.\n///\n/// Since the selections in [PlaceholderSpan] are handled independently in its\n/// subtree, a selection in [RenderParagraph] can't continue across a\n/// [PlaceholderSpan]. The [RenderParagraph] splits itself on [PlaceholderSpan]\n/// to create multiple `_SelectableFragment`s so that they can be selected\n/// separately.\nclass _SelectableFragment\n    with Selectable, Diagnosticable, ChangeNotifier\n    implements TextLayoutMetrics {\n  _SelectableFragment({\n    required this.paragraph,\n    required this.fullText,\n    required this.range,\n  }) : assert(range.isValid && !range.isCollapsed && range.isNormalized) {\n    if (kFlutterMemoryAllocationsEnabled) {\n      ChangeNotifier.maybeDispatchObjectCreation(this);\n    }\n    _selectionGeometry = _getSelectionGeometry();\n  }\n\n  final TextRange range;\n  final RenderParagraph paragraph;\n  final String fullText;\n\n  TextPosition? _textSelectionStart;\n  TextPosition? _textSelectionEnd;\n\n  bool _selectableContainsOriginTextBoundary = false;\n\n  LayerLink? _startHandleLayerLink;\n  LayerLink? _endHandleLayerLink;\n\n  @override\n  SelectionGeometry get value => _selectionGeometry;\n  late SelectionGeometry _selectionGeometry;\n  void _updateSelectionGeometry() {\n    final SelectionGeometry newValue = _getSelectionGeometry();\n\n    if (_selectionGeometry == newValue) {\n      return;\n    }\n    _selectionGeometry = newValue;\n    notifyListeners();\n  }\n\n  SelectionGeometry _getSelectionGeometry() {\n    if (_textSelectionStart == null || _textSelectionEnd == null) {\n      return const SelectionGeometry(\n        status: SelectionStatus.none,\n        hasContent: true,\n      );\n    }\n\n    final int selectionStart = _textSelectionStart!.offset;\n    final int selectionEnd = _textSelectionEnd!.offset;\n    final bool isReversed = selectionStart > selectionEnd;\n    final Offset startOffsetInParagraphCoordinates = paragraph\n        ._getOffsetForPosition(\n          TextPosition(offset: selectionStart),\n        );\n    final Offset endOffsetInParagraphCoordinates =\n        selectionStart == selectionEnd\n        ? startOffsetInParagraphCoordinates\n        : paragraph._getOffsetForPosition(TextPosition(offset: selectionEnd));\n    final bool flipHandles =\n        isReversed != (TextDirection.rtl == paragraph.textDirection);\n    final TextSelection selection = TextSelection(\n      baseOffset: selectionStart,\n      extentOffset: selectionEnd,\n    );\n    final List<Rect> selectionRects = <Rect>[];\n    for (final TextBox textBox in paragraph.getBoxesForSelection(selection)) {\n      selectionRects.add(textBox.toRect());\n    }\n    final bool selectionCollapsed = selectionStart == selectionEnd;\n    final (\n      TextSelectionHandleType startSelectionHandleType,\n      TextSelectionHandleType endSelectionHandleType,\n    ) = switch ((selectionCollapsed, flipHandles)) {\n      // Always prefer collapsed handle when selection is collapsed.\n      (true, _) => (\n        TextSelectionHandleType.collapsed,\n        TextSelectionHandleType.collapsed,\n      ),\n      (false, true) => (\n        TextSelectionHandleType.right,\n        TextSelectionHandleType.left,\n      ),\n      (false, false) => (\n        TextSelectionHandleType.left,\n        TextSelectionHandleType.right,\n      ),\n    };\n    return SelectionGeometry(\n      startSelectionPoint: SelectionPoint(\n        localPosition: startOffsetInParagraphCoordinates,\n        lineHeight: paragraph._textPainter.preferredLineHeight,\n        handleType: startSelectionHandleType,\n      ),\n      endSelectionPoint: SelectionPoint(\n        localPosition: endOffsetInParagraphCoordinates,\n        lineHeight: paragraph._textPainter.preferredLineHeight,\n        handleType: endSelectionHandleType,\n      ),\n      selectionRects: selectionRects,\n      status: selectionCollapsed\n          ? SelectionStatus.collapsed\n          : SelectionStatus.uncollapsed,\n      hasContent: true,\n    );\n  }\n\n  @override\n  SelectionResult dispatchSelectionEvent(SelectionEvent event) {\n    late final SelectionResult result;\n    final TextPosition? existingSelectionStart = _textSelectionStart;\n    final TextPosition? existingSelectionEnd = _textSelectionEnd;\n    switch (event.type) {\n      case SelectionEventType.startEdgeUpdate:\n      case SelectionEventType.endEdgeUpdate:\n        final SelectionEdgeUpdateEvent edgeUpdate =\n            event as SelectionEdgeUpdateEvent;\n        final TextGranularity granularity = event.granularity;\n\n        switch (granularity) {\n          case TextGranularity.character:\n            result = _updateSelectionEdge(\n              edgeUpdate.globalPosition,\n              isEnd: edgeUpdate.type == SelectionEventType.endEdgeUpdate,\n            );\n          case TextGranularity.word:\n            result = _updateSelectionEdgeByTextBoundary(\n              edgeUpdate.globalPosition,\n              isEnd: edgeUpdate.type == SelectionEventType.endEdgeUpdate,\n              getTextBoundary: _getWordBoundaryAtPosition,\n            );\n          case TextGranularity.paragraph:\n            result = _updateSelectionEdgeByMultiSelectableTextBoundary(\n              edgeUpdate.globalPosition,\n              isEnd: edgeUpdate.type == SelectionEventType.endEdgeUpdate,\n              getTextBoundary: _getParagraphBoundaryAtPosition,\n              getClampedTextBoundary: _getClampedParagraphBoundaryAtPosition,\n            );\n          case TextGranularity.document:\n          case TextGranularity.line:\n            assert(\n              false,\n              'Moving the selection edge by line or document is not supported.',\n            );\n        }\n      case SelectionEventType.clear:\n        result = _handleClearSelection();\n      case SelectionEventType.selectAll:\n        result = _handleSelectAll();\n      case SelectionEventType.selectWord:\n        final SelectWordSelectionEvent selectWord =\n            event as SelectWordSelectionEvent;\n        result = _handleSelectWord(selectWord.globalPosition);\n      case SelectionEventType.selectParagraph:\n        final SelectParagraphSelectionEvent selectParagraph =\n            event as SelectParagraphSelectionEvent;\n        if (selectParagraph.absorb) {\n          _handleSelectAll();\n          result = SelectionResult.next;\n          _selectableContainsOriginTextBoundary = true;\n        } else {\n          result = _handleSelectParagraph(selectParagraph.globalPosition);\n        }\n      case SelectionEventType.granularlyExtendSelection:\n        final GranularlyExtendSelectionEvent granularlyExtendSelection =\n            event as GranularlyExtendSelectionEvent;\n        result = _handleGranularlyExtendSelection(\n          granularlyExtendSelection.forward,\n          granularlyExtendSelection.isEnd,\n          granularlyExtendSelection.granularity,\n        );\n      case SelectionEventType.directionallyExtendSelection:\n        final DirectionallyExtendSelectionEvent directionallyExtendSelection =\n            event as DirectionallyExtendSelectionEvent;\n        result = _handleDirectionallyExtendSelection(\n          directionallyExtendSelection.dx,\n          directionallyExtendSelection.isEnd,\n          directionallyExtendSelection.direction,\n        );\n    }\n\n    if (existingSelectionStart != _textSelectionStart ||\n        existingSelectionEnd != _textSelectionEnd) {\n      _didChangeSelection();\n    }\n    return result;\n  }\n\n  @override\n  SelectedContent? getSelectedContent() {\n    if (_textSelectionStart == null || _textSelectionEnd == null) {\n      return null;\n    }\n    final int start = math.min(\n      _textSelectionStart!.offset,\n      _textSelectionEnd!.offset,\n    );\n    final int end = math.max(\n      _textSelectionStart!.offset,\n      _textSelectionEnd!.offset,\n    );\n    return SelectedContent(plainText: fullText.substring(start, end));\n  }\n\n  @override\n  SelectedContentRange? getSelection() {\n    if (_textSelectionStart == null || _textSelectionEnd == null) {\n      return null;\n    }\n    return SelectedContentRange(\n      startOffset: _textSelectionStart!.offset,\n      endOffset: _textSelectionEnd!.offset,\n    );\n  }\n\n  void _didChangeSelection() {\n    paragraph.markNeedsPaint();\n    _updateSelectionGeometry();\n  }\n\n  TextPosition _updateSelectionStartEdgeByTextBoundary(\n    _TextBoundaryRecord? textBoundary,\n    _TextBoundaryAtPosition getTextBoundary,\n    TextPosition position,\n    TextPosition? existingSelectionStart,\n    TextPosition? existingSelectionEnd,\n  ) {\n    TextPosition? targetPosition;\n    if (textBoundary != null) {\n      assert(\n        textBoundary.boundaryStart.offset >= range.start &&\n            textBoundary.boundaryEnd.offset <= range.end,\n      );\n      if (_selectableContainsOriginTextBoundary &&\n          existingSelectionStart != null &&\n          existingSelectionEnd != null) {\n        final bool isSamePosition =\n            position.offset == existingSelectionEnd.offset;\n        final bool isSelectionInverted =\n            existingSelectionStart.offset > existingSelectionEnd.offset;\n        final bool shouldSwapEdges =\n            !isSamePosition &&\n            (isSelectionInverted !=\n                (position.offset > existingSelectionEnd.offset));\n        if (shouldSwapEdges) {\n          if (position.offset < existingSelectionEnd.offset) {\n            targetPosition = textBoundary.boundaryStart;\n          } else {\n            targetPosition = textBoundary.boundaryEnd;\n          }\n          // When the selection is inverted by the new position it is necessary to\n          // swap the start edge (moving edge) with the end edge (static edge) to\n          // maintain the origin text boundary within the selection.\n          final _TextBoundaryRecord localTextBoundary = getTextBoundary(\n            existingSelectionEnd,\n          );\n          assert(\n            localTextBoundary.boundaryStart.offset >= range.start &&\n                localTextBoundary.boundaryEnd.offset <= range.end,\n          );\n          _setSelectionPosition(\n            existingSelectionEnd.offset ==\n                    localTextBoundary.boundaryStart.offset\n                ? localTextBoundary.boundaryEnd\n                : localTextBoundary.boundaryStart,\n            isEnd: true,\n          );\n        } else {\n          if (position.offset < existingSelectionEnd.offset) {\n            targetPosition = textBoundary.boundaryStart;\n          } else if (position.offset > existingSelectionEnd.offset) {\n            targetPosition = textBoundary.boundaryEnd;\n          } else {\n            // Keep the origin text boundary in bounds when position is at the static edge.\n            targetPosition = existingSelectionStart;\n          }\n        }\n      } else {\n        if (existingSelectionEnd != null) {\n          // If the end edge exists and the start edge is being moved, then the\n          // start edge is moved to encompass the entire text boundary at the new position.\n          if (position.offset < existingSelectionEnd.offset) {\n            targetPosition = textBoundary.boundaryStart;\n          } else {\n            targetPosition = textBoundary.boundaryEnd;\n          }\n        } else {\n          // Move the start edge to the closest text boundary.\n          targetPosition = _closestTextBoundary(textBoundary, position);\n        }\n      }\n    } else {\n      // The position is not contained within the current rect. The targetPosition\n      // will either be at the end or beginning of the current rect. See [SelectionUtils.adjustDragOffset]\n      // for a more in depth explanation on this adjustment.\n      if (_selectableContainsOriginTextBoundary &&\n          existingSelectionStart != null &&\n          existingSelectionEnd != null) {\n        // When the selection is inverted by the new position it is necessary to\n        // swap the start edge (moving edge) with the end edge (static edge) to\n        // maintain the origin text boundary within the selection.\n        final bool isSamePosition =\n            position.offset == existingSelectionEnd.offset;\n        final bool isSelectionInverted =\n            existingSelectionStart.offset > existingSelectionEnd.offset;\n        final bool shouldSwapEdges =\n            !isSamePosition &&\n            (isSelectionInverted !=\n                (position.offset > existingSelectionEnd.offset));\n\n        if (shouldSwapEdges) {\n          final _TextBoundaryRecord localTextBoundary = getTextBoundary(\n            existingSelectionEnd,\n          );\n          assert(\n            localTextBoundary.boundaryStart.offset >= range.start &&\n                localTextBoundary.boundaryEnd.offset <= range.end,\n          );\n          _setSelectionPosition(\n            isSelectionInverted\n                ? localTextBoundary.boundaryEnd\n                : localTextBoundary.boundaryStart,\n            isEnd: true,\n          );\n        }\n      }\n    }\n    return targetPosition ?? position;\n  }\n\n  TextPosition _updateSelectionEndEdgeByTextBoundary(\n    _TextBoundaryRecord? textBoundary,\n    _TextBoundaryAtPosition getTextBoundary,\n    TextPosition position,\n    TextPosition? existingSelectionStart,\n    TextPosition? existingSelectionEnd,\n  ) {\n    TextPosition? targetPosition;\n    if (textBoundary != null) {\n      assert(\n        textBoundary.boundaryStart.offset >= range.start &&\n            textBoundary.boundaryEnd.offset <= range.end,\n      );\n      if (_selectableContainsOriginTextBoundary &&\n          existingSelectionStart != null &&\n          existingSelectionEnd != null) {\n        final bool isSamePosition =\n            position.offset == existingSelectionStart.offset;\n        final bool isSelectionInverted =\n            existingSelectionStart.offset > existingSelectionEnd.offset;\n        final bool shouldSwapEdges =\n            !isSamePosition &&\n            (isSelectionInverted !=\n                (position.offset < existingSelectionStart.offset));\n        if (shouldSwapEdges) {\n          if (position.offset < existingSelectionStart.offset) {\n            targetPosition = textBoundary.boundaryStart;\n          } else {\n            targetPosition = textBoundary.boundaryEnd;\n          }\n          // When the selection is inverted by the new position it is necessary to\n          // swap the end edge (moving edge) with the start edge (static edge) to\n          // maintain the origin text boundary within the selection.\n          final _TextBoundaryRecord localTextBoundary = getTextBoundary(\n            existingSelectionStart,\n          );\n          assert(\n            localTextBoundary.boundaryStart.offset >= range.start &&\n                localTextBoundary.boundaryEnd.offset <= range.end,\n          );\n          _setSelectionPosition(\n            existingSelectionStart.offset ==\n                    localTextBoundary.boundaryStart.offset\n                ? localTextBoundary.boundaryEnd\n                : localTextBoundary.boundaryStart,\n            isEnd: false,\n          );\n        } else {\n          if (position.offset < existingSelectionStart.offset) {\n            targetPosition = textBoundary.boundaryStart;\n          } else if (position.offset > existingSelectionStart.offset) {\n            targetPosition = textBoundary.boundaryEnd;\n          } else {\n            // Keep the origin text boundary in bounds when position is at the static edge.\n            targetPosition = existingSelectionEnd;\n          }\n        }\n      } else {\n        if (existingSelectionStart != null) {\n          // If the start edge exists and the end edge is being moved, then the\n          // end edge is moved to encompass the entire text boundary at the new position.\n          if (position.offset < existingSelectionStart.offset) {\n            targetPosition = textBoundary.boundaryStart;\n          } else {\n            targetPosition = textBoundary.boundaryEnd;\n          }\n        } else {\n          // Move the end edge to the closest text boundary.\n          targetPosition = _closestTextBoundary(textBoundary, position);\n        }\n      }\n    } else {\n      // The position is not contained within the current rect. The targetPosition\n      // will either be at the end or beginning of the current rect. See [SelectionUtils.adjustDragOffset]\n      // for a more in depth explanation on this adjustment.\n      if (_selectableContainsOriginTextBoundary &&\n          existingSelectionStart != null &&\n          existingSelectionEnd != null) {\n        // When the selection is inverted by the new position it is necessary to\n        // swap the end edge (moving edge) with the start edge (static edge) to\n        // maintain the origin text boundary within the selection.\n        final bool isSamePosition =\n            position.offset == existingSelectionStart.offset;\n        final bool isSelectionInverted =\n            existingSelectionStart.offset > existingSelectionEnd.offset;\n        final bool shouldSwapEdges =\n            isSelectionInverted !=\n                (position.offset < existingSelectionStart.offset) ||\n            isSamePosition;\n        if (shouldSwapEdges) {\n          final _TextBoundaryRecord localTextBoundary = getTextBoundary(\n            existingSelectionStart,\n          );\n          assert(\n            localTextBoundary.boundaryStart.offset >= range.start &&\n                localTextBoundary.boundaryEnd.offset <= range.end,\n          );\n          _setSelectionPosition(\n            isSelectionInverted\n                ? localTextBoundary.boundaryStart\n                : localTextBoundary.boundaryEnd,\n            isEnd: false,\n          );\n        }\n      }\n    }\n    return targetPosition ?? position;\n  }\n\n  SelectionResult _updateSelectionEdgeByTextBoundary(\n    Offset globalPosition, {\n    required bool isEnd,\n    required _TextBoundaryAtPosition getTextBoundary,\n  }) {\n    // When the start/end edges are swapped, i.e. the start is after the end, and\n    // the scrollable synthesizes an event for the opposite edge, this will potentially\n    // move the opposite edge outside of the origin text boundary and we are unable to recover.\n    final TextPosition? existingSelectionStart = _textSelectionStart;\n    final TextPosition? existingSelectionEnd = _textSelectionEnd;\n\n    _setSelectionPosition(null, isEnd: isEnd);\n    final Matrix4 transform = paragraph.getTransformTo(null)..invert();\n    final Offset localPosition = MatrixUtils.transformPoint(\n      transform,\n      globalPosition,\n    );\n    if (_rect.isEmpty) {\n      return SelectionUtils.getResultBasedOnRect(_rect, localPosition);\n    }\n    final Offset adjustedOffset = SelectionUtils.adjustDragOffset(\n      _rect,\n      localPosition,\n      direction: paragraph.textDirection,\n    );\n\n    final TextPosition position = paragraph.getPositionForOffset(\n      adjustedOffset,\n    );\n    // Check if the original local position is within the rect, if it is not then\n    // we do not need to look up the text boundary for that position. This is to\n    // maintain a selectables selection collapsed at 0 when the local position is\n    // not located inside its rect.\n    _TextBoundaryRecord? textBoundary = _rect.contains(localPosition)\n        ? getTextBoundary(position)\n        : null;\n    if (textBoundary != null &&\n        (textBoundary.boundaryStart.offset < range.start &&\n                textBoundary.boundaryEnd.offset <= range.start ||\n            textBoundary.boundaryStart.offset >= range.end &&\n                textBoundary.boundaryEnd.offset > range.end)) {\n      // When the position is located at a placeholder inside of the text, then we may compute\n      // a text boundary that does not belong to the current selectable fragment. In this case\n      // we should invalidate the text boundary so that it is not taken into account when\n      // computing the target position.\n      textBoundary = null;\n    }\n    final TextPosition targetPosition = _clampTextPosition(\n      isEnd\n          ? _updateSelectionEndEdgeByTextBoundary(\n              textBoundary,\n              getTextBoundary,\n              position,\n              existingSelectionStart,\n              existingSelectionEnd,\n            )\n          : _updateSelectionStartEdgeByTextBoundary(\n              textBoundary,\n              getTextBoundary,\n              position,\n              existingSelectionStart,\n              existingSelectionEnd,\n            ),\n    );\n\n    _setSelectionPosition(targetPosition, isEnd: isEnd);\n    if (targetPosition.offset == range.end) {\n      return SelectionResult.next;\n    }\n\n    if (targetPosition.offset == range.start) {\n      return SelectionResult.previous;\n    }\n    // TODO(chunhtai): The geometry information should not be used to determine\n    // selection result. This is a workaround to RenderParagraph, where it does\n    // not have a way to get accurate text length if its text is truncated due to\n    // layout constraint.\n    return SelectionUtils.getResultBasedOnRect(_rect, localPosition);\n  }\n\n  SelectionResult _updateSelectionEdge(\n    Offset globalPosition, {\n    required bool isEnd,\n  }) {\n    _setSelectionPosition(null, isEnd: isEnd);\n    final Matrix4 transform = paragraph.getTransformTo(null)..invert();\n    final Offset localPosition = MatrixUtils.transformPoint(\n      transform,\n      globalPosition,\n    );\n    if (_rect.isEmpty) {\n      return SelectionUtils.getResultBasedOnRect(_rect, localPosition);\n    }\n    final Offset adjustedOffset = SelectionUtils.adjustDragOffset(\n      _rect,\n      localPosition,\n      direction: paragraph.textDirection,\n    );\n\n    final TextPosition position = _clampTextPosition(\n      paragraph.getPositionForOffset(adjustedOffset),\n    );\n    _setSelectionPosition(position, isEnd: isEnd);\n    if (position.offset == range.end) {\n      return SelectionResult.next;\n    }\n    if (position.offset == range.start) {\n      return SelectionResult.previous;\n    }\n    // TODO(chunhtai): The geometry information should not be used to determine\n    // selection result. This is a workaround to RenderParagraph, where it does\n    // not have a way to get accurate text length if its text is truncated due to\n    // layout constraint.\n    return SelectionUtils.getResultBasedOnRect(_rect, localPosition);\n  }\n\n  // This method handles updating the start edge by a text boundary that may\n  // not be contained within this selectable fragment. It is possible\n  // that a boundary spans multiple selectable fragments when the text contains\n  // [WidgetSpan]s.\n  //\n  // This method differs from [_updateSelectionStartEdgeByTextBoundary] in that\n  // to pivot offset used to swap selection edges and maintain the origin\n  // text boundary selected may be located outside of this selectable fragment.\n  //\n  // See [_updateSelectionEndEdgeByMultiSelectableTextBoundary] for the method\n  // that handles updating the end edge.\n  SelectionResult? _updateSelectionStartEdgeByMultiSelectableTextBoundary(\n    _TextBoundaryAtPositionInText getTextBoundary,\n    bool paragraphContainsPosition,\n    TextPosition position,\n    TextPosition? existingSelectionStart,\n    TextPosition? existingSelectionEnd,\n  ) {\n    const bool isEnd = false;\n    if (_selectableContainsOriginTextBoundary &&\n        existingSelectionStart != null &&\n        existingSelectionEnd != null) {\n      // If this selectable contains the origin boundary, maintain the existing\n      // selection.\n      final bool forwardSelection =\n          existingSelectionEnd.offset >= existingSelectionStart.offset;\n      if (paragraphContainsPosition) {\n        // When the position is within the root paragraph, swap the start and end\n        // edges when the selection is inverted.\n        final _TextBoundaryRecord boundaryAtPosition = getTextBoundary(\n          position,\n          fullText,\n        );\n        // To accurately retrieve the origin text boundary when the selection\n        // is forward, use existingSelectionEnd.offset - 1. This is necessary\n        // because in a forwards selection, existingSelectionEnd marks the end\n        // of the origin text boundary. Using the unmodified offset incorrectly\n        // targets the subsequent text boundary.\n        final _TextBoundaryRecord originTextBoundary = getTextBoundary(\n          forwardSelection\n              ? TextPosition(\n                  offset: existingSelectionEnd.offset - 1,\n                  affinity: existingSelectionEnd.affinity,\n                )\n              : existingSelectionEnd,\n          fullText,\n        );\n        final TextPosition targetPosition;\n        final int pivotOffset = forwardSelection\n            ? originTextBoundary.boundaryEnd.offset\n            : originTextBoundary.boundaryStart.offset;\n        final bool shouldSwapEdges =\n            !forwardSelection != (position.offset > pivotOffset);\n        if (position.offset < pivotOffset) {\n          targetPosition = boundaryAtPosition.boundaryStart;\n        } else if (position.offset > pivotOffset) {\n          targetPosition = boundaryAtPosition.boundaryEnd;\n        } else {\n          // Keep the origin text boundary in bounds when position is at the static edge.\n          targetPosition = forwardSelection\n              ? existingSelectionStart\n              : existingSelectionEnd;\n        }\n        if (shouldSwapEdges) {\n          _setSelectionPosition(\n            _clampTextPosition(\n              forwardSelection\n                  ? originTextBoundary.boundaryStart\n                  : originTextBoundary.boundaryEnd,\n            ),\n            isEnd: true,\n          );\n        }\n        _setSelectionPosition(_clampTextPosition(targetPosition), isEnd: isEnd);\n        final bool finalSelectionIsForward =\n            _textSelectionEnd!.offset >= _textSelectionStart!.offset;\n        if (boundaryAtPosition.boundaryStart.offset > range.end &&\n            boundaryAtPosition.boundaryEnd.offset > range.end) {\n          return SelectionResult.next;\n        }\n        if (boundaryAtPosition.boundaryStart.offset < range.start &&\n            boundaryAtPosition.boundaryEnd.offset < range.start) {\n          return SelectionResult.previous;\n        }\n        if (finalSelectionIsForward) {\n          if (boundaryAtPosition.boundaryStart.offset >=\n              originTextBoundary.boundaryStart.offset) {\n            return SelectionResult.end;\n          }\n          if (boundaryAtPosition.boundaryStart.offset <\n              originTextBoundary.boundaryStart.offset) {\n            return SelectionResult.previous;\n          }\n        } else {\n          if (boundaryAtPosition.boundaryEnd.offset <=\n              originTextBoundary.boundaryEnd.offset) {\n            return SelectionResult.end;\n          }\n          if (boundaryAtPosition.boundaryEnd.offset >\n              originTextBoundary.boundaryEnd.offset) {\n            return SelectionResult.next;\n          }\n        }\n      } else {\n        // When the drag position is not contained within the root paragraph,\n        // swap the edges when the selection changes direction.\n        final TextPosition clampedPosition = _clampTextPosition(position);\n        // To accurately retrieve the origin text boundary when the selection\n        // is forward, use existingSelectionEnd.offset - 1. This is necessary\n        // because in a forwards selection, existingSelectionEnd marks the end\n        // of the origin text boundary. Using the unmodified offset incorrectly\n        // targets the subsequent text boundary.\n        final _TextBoundaryRecord originTextBoundary = getTextBoundary(\n          forwardSelection\n              ? TextPosition(\n                  offset: existingSelectionEnd.offset - 1,\n                  affinity: existingSelectionEnd.affinity,\n                )\n              : existingSelectionEnd,\n          fullText,\n        );\n        if (forwardSelection && clampedPosition.offset == range.start) {\n          _setSelectionPosition(clampedPosition, isEnd: isEnd);\n          return SelectionResult.previous;\n        }\n        if (!forwardSelection && clampedPosition.offset == range.end) {\n          _setSelectionPosition(clampedPosition, isEnd: isEnd);\n          return SelectionResult.next;\n        }\n        if (forwardSelection && clampedPosition.offset == range.end) {\n          _setSelectionPosition(\n            _clampTextPosition(originTextBoundary.boundaryStart),\n            isEnd: true,\n          );\n          _setSelectionPosition(clampedPosition, isEnd: isEnd);\n          return SelectionResult.next;\n        }\n        if (!forwardSelection && clampedPosition.offset == range.start) {\n          _setSelectionPosition(\n            _clampTextPosition(originTextBoundary.boundaryEnd),\n            isEnd: true,\n          );\n          _setSelectionPosition(clampedPosition, isEnd: isEnd);\n          return SelectionResult.previous;\n        }\n      }\n    } else {\n      // A paragraph boundary may not be completely contained within this root\n      // selectable fragment. Keep searching until we find the end of the\n      // boundary. Do not search when the current drag position is on a placeholder\n      // to allow traversal to reach that placeholder.\n      final bool positionOnPlaceholder =\n          paragraph.getWordBoundary(position).textInside(fullText) ==\n          _placeholderCharacter;\n      if (!paragraphContainsPosition || positionOnPlaceholder) {\n        return null;\n      }\n      if (existingSelectionEnd != null) {\n        final _TextBoundaryRecord boundaryAtPosition = getTextBoundary(\n          position,\n          fullText,\n        );\n        final bool backwardSelection =\n            existingSelectionStart == null &&\n                existingSelectionEnd.offset == range.start ||\n            existingSelectionStart == existingSelectionEnd &&\n                existingSelectionEnd.offset == range.start ||\n            existingSelectionStart != null &&\n                existingSelectionStart.offset > existingSelectionEnd.offset;\n        if (boundaryAtPosition.boundaryStart.offset < range.start &&\n            boundaryAtPosition.boundaryEnd.offset < range.start) {\n          _setSelectionPosition(\n            TextPosition(offset: range.start),\n            isEnd: isEnd,\n          );\n          return SelectionResult.previous;\n        }\n        if (boundaryAtPosition.boundaryStart.offset > range.end &&\n            boundaryAtPosition.boundaryEnd.offset > range.end) {\n          _setSelectionPosition(TextPosition(offset: range.end), isEnd: isEnd);\n          return SelectionResult.next;\n        }\n        if (backwardSelection) {\n          if (boundaryAtPosition.boundaryEnd.offset <= range.end) {\n            _setSelectionPosition(\n              _clampTextPosition(boundaryAtPosition.boundaryEnd),\n              isEnd: isEnd,\n            );\n            return SelectionResult.end;\n          }\n          if (boundaryAtPosition.boundaryEnd.offset > range.end) {\n            _setSelectionPosition(\n              TextPosition(offset: range.end),\n              isEnd: isEnd,\n            );\n            return SelectionResult.next;\n          }\n        } else {\n          _setSelectionPosition(\n            _clampTextPosition(boundaryAtPosition.boundaryStart),\n            isEnd: isEnd,\n          );\n          if (boundaryAtPosition.boundaryStart.offset < range.start) {\n            return SelectionResult.previous;\n          }\n          if (boundaryAtPosition.boundaryStart.offset >= range.start) {\n            return SelectionResult.end;\n          }\n        }\n      }\n    }\n    return null;\n  }\n\n  // This method handles updating the end edge by a text boundary that may\n  // not be contained within this selectable fragment. It is possible\n  // that a boundary spans multiple selectable fragments when the text contains\n  // [WidgetSpan]s.\n  //\n  // This method differs from [_updateSelectionEndEdgeByTextBoundary] in that\n  // to pivot offset used to swap selection edges and maintain the origin\n  // text boundary selected may be located outside of this selectable fragment.\n  //\n  // See [_updateSelectionStartEdgeByMultiSelectableTextBoundary] for the method\n  // that handles updating the end edge.\n  SelectionResult? _updateSelectionEndEdgeByMultiSelectableTextBoundary(\n    _TextBoundaryAtPositionInText getTextBoundary,\n    bool paragraphContainsPosition,\n    TextPosition position,\n    TextPosition? existingSelectionStart,\n    TextPosition? existingSelectionEnd,\n  ) {\n    const bool isEnd = true;\n    if (_selectableContainsOriginTextBoundary &&\n        existingSelectionStart != null &&\n        existingSelectionEnd != null) {\n      // If this selectable contains the origin boundary, maintain the existing\n      // selection.\n      final bool forwardSelection =\n          existingSelectionEnd.offset >= existingSelectionStart.offset;\n      if (paragraphContainsPosition) {\n        // When the position is within the root paragraph, swap the start and end\n        // edges when the selection is inverted.\n        final _TextBoundaryRecord boundaryAtPosition = getTextBoundary(\n          position,\n          fullText,\n        );\n        // To accurately retrieve the origin text boundary when the selection\n        // is backwards, use existingSelectionStart.offset - 1. This is necessary\n        // because in a backwards selection, existingSelectionStart marks the end\n        // of the origin text boundary. Using the unmodified offset incorrectly\n        // targets the subsequent text boundary.\n        final _TextBoundaryRecord originTextBoundary = getTextBoundary(\n          forwardSelection\n              ? existingSelectionStart\n              : TextPosition(\n                  offset: existingSelectionStart.offset - 1,\n                  affinity: existingSelectionStart.affinity,\n                ),\n          fullText,\n        );\n        final TextPosition targetPosition;\n        final int pivotOffset = forwardSelection\n            ? originTextBoundary.boundaryStart.offset\n            : originTextBoundary.boundaryEnd.offset;\n        final bool shouldSwapEdges =\n            !forwardSelection != (position.offset < pivotOffset);\n        if (position.offset < pivotOffset) {\n          targetPosition = boundaryAtPosition.boundaryStart;\n        } else if (position.offset > pivotOffset) {\n          targetPosition = boundaryAtPosition.boundaryEnd;\n        } else {\n          // Keep the origin text boundary in bounds when position is at the static edge.\n          targetPosition = forwardSelection\n              ? existingSelectionEnd\n              : existingSelectionStart;\n        }\n        if (shouldSwapEdges) {\n          _setSelectionPosition(\n            _clampTextPosition(\n              forwardSelection\n                  ? originTextBoundary.boundaryEnd\n                  : originTextBoundary.boundaryStart,\n            ),\n            isEnd: false,\n          );\n        }\n        _setSelectionPosition(_clampTextPosition(targetPosition), isEnd: isEnd);\n        final bool finalSelectionIsForward =\n            _textSelectionEnd!.offset >= _textSelectionStart!.offset;\n        if (boundaryAtPosition.boundaryStart.offset > range.end &&\n            boundaryAtPosition.boundaryEnd.offset > range.end) {\n          return SelectionResult.next;\n        }\n        if (boundaryAtPosition.boundaryStart.offset < range.start &&\n            boundaryAtPosition.boundaryEnd.offset < range.start) {\n          return SelectionResult.previous;\n        }\n        if (finalSelectionIsForward) {\n          if (boundaryAtPosition.boundaryEnd.offset <=\n              originTextBoundary.boundaryEnd.offset) {\n            return SelectionResult.end;\n          }\n          if (boundaryAtPosition.boundaryEnd.offset >\n              originTextBoundary.boundaryEnd.offset) {\n            return SelectionResult.next;\n          }\n        } else {\n          if (boundaryAtPosition.boundaryStart.offset >=\n              originTextBoundary.boundaryStart.offset) {\n            return SelectionResult.end;\n          }\n          if (boundaryAtPosition.boundaryStart.offset <\n              originTextBoundary.boundaryStart.offset) {\n            return SelectionResult.previous;\n          }\n        }\n      } else {\n        // When the drag position is not contained within the root paragraph,\n        // swap the edges when the selection changes direction.\n        final TextPosition clampedPosition = _clampTextPosition(position);\n        // To accurately retrieve the origin text boundary when the selection\n        // is backwards, use existingSelectionStart.offset - 1. This is necessary\n        // because in a backwards selection, existingSelectionStart marks the end\n        // of the origin text boundary. Using the unmodified offset incorrectly\n        // targets the subsequent text boundary.\n        final _TextBoundaryRecord originTextBoundary = getTextBoundary(\n          forwardSelection\n              ? existingSelectionStart\n              : TextPosition(\n                  offset: existingSelectionStart.offset - 1,\n                  affinity: existingSelectionStart.affinity,\n                ),\n          fullText,\n        );\n        if (forwardSelection && clampedPosition.offset == range.start) {\n          _setSelectionPosition(\n            _clampTextPosition(originTextBoundary.boundaryEnd),\n            isEnd: false,\n          );\n          _setSelectionPosition(clampedPosition, isEnd: isEnd);\n          return SelectionResult.previous;\n        }\n        if (!forwardSelection && clampedPosition.offset == range.end) {\n          _setSelectionPosition(\n            _clampTextPosition(originTextBoundary.boundaryStart),\n            isEnd: false,\n          );\n          _setSelectionPosition(clampedPosition, isEnd: isEnd);\n          return SelectionResult.next;\n        }\n        if (forwardSelection && clampedPosition.offset == range.end) {\n          _setSelectionPosition(clampedPosition, isEnd: isEnd);\n          return SelectionResult.next;\n        }\n        if (!forwardSelection && clampedPosition.offset == range.start) {\n          _setSelectionPosition(clampedPosition, isEnd: isEnd);\n          return SelectionResult.previous;\n        }\n      }\n    } else {\n      // A paragraph boundary may not be completely contained within this root\n      // selectable fragment. Keep searching until we find the end of the\n      // boundary. Do not search when the current drag position is on a placeholder\n      // to allow traversal to reach that placeholder.\n      final bool positionOnPlaceholder =\n          paragraph.getWordBoundary(position).textInside(fullText) ==\n          _placeholderCharacter;\n      if (!paragraphContainsPosition || positionOnPlaceholder) {\n        return null;\n      }\n      if (existingSelectionStart != null) {\n        final _TextBoundaryRecord boundaryAtPosition = getTextBoundary(\n          position,\n          fullText,\n        );\n        final bool backwardSelection =\n            existingSelectionEnd == null &&\n                existingSelectionStart.offset == range.end ||\n            existingSelectionStart == existingSelectionEnd &&\n                existingSelectionStart.offset == range.end ||\n            existingSelectionEnd != null &&\n                existingSelectionStart.offset > existingSelectionEnd.offset;\n        if (boundaryAtPosition.boundaryStart.offset < range.start &&\n            boundaryAtPosition.boundaryEnd.offset < range.start) {\n          _setSelectionPosition(\n            TextPosition(offset: range.start),\n            isEnd: isEnd,\n          );\n          return SelectionResult.previous;\n        }\n        if (boundaryAtPosition.boundaryStart.offset > range.end &&\n            boundaryAtPosition.boundaryEnd.offset > range.end) {\n          _setSelectionPosition(TextPosition(offset: range.end), isEnd: isEnd);\n          return SelectionResult.next;\n        }\n        if (backwardSelection) {\n          _setSelectionPosition(\n            _clampTextPosition(boundaryAtPosition.boundaryStart),\n            isEnd: isEnd,\n          );\n          if (boundaryAtPosition.boundaryStart.offset < range.start) {\n            return SelectionResult.previous;\n          }\n          if (boundaryAtPosition.boundaryStart.offset >= range.start) {\n            return SelectionResult.end;\n          }\n        } else {\n          if (boundaryAtPosition.boundaryEnd.offset <= range.end) {\n            _setSelectionPosition(\n              _clampTextPosition(boundaryAtPosition.boundaryEnd),\n              isEnd: isEnd,\n            );\n            return SelectionResult.end;\n          }\n          if (boundaryAtPosition.boundaryEnd.offset > range.end) {\n            _setSelectionPosition(\n              TextPosition(offset: range.end),\n              isEnd: isEnd,\n            );\n            return SelectionResult.next;\n          }\n        }\n      }\n    }\n    return null;\n  }\n\n  // The placeholder character used by [RenderParagraph].\n  static final String _placeholderCharacter = String.fromCharCode(\n    PlaceholderSpan.placeholderCodeUnit,\n  );\n  static final int _placeholderLength = _placeholderCharacter.length;\n  // This method handles updating the start edge by a text boundary that may\n  // not be contained within this selectable fragment. It is possible\n  // that a boundary spans multiple selectable fragments when the text contains\n  // [WidgetSpan]s.\n  //\n  // This method differs from [_updateSelectionStartEdgeByMultiSelectableBoundary]\n  // in that to maintain the origin text boundary selected at a placeholder,\n  // this selectable fragment must be aware of the [RenderParagraph] that closely\n  // encompasses the complete origin text boundary.\n  //\n  // See [_updateSelectionEndEdgeAtPlaceholderByMultiSelectableTextBoundary] for the method\n  // that handles updating the end edge.\n  SelectionResult?\n  _updateSelectionStartEdgeAtPlaceholderByMultiSelectableTextBoundary(\n    _TextBoundaryAtPositionInText getTextBoundary,\n    Offset globalPosition,\n    bool paragraphContainsPosition,\n    TextPosition position,\n    TextPosition? existingSelectionStart,\n    TextPosition? existingSelectionEnd,\n  ) {\n    const bool isEnd = false;\n    if (_selectableContainsOriginTextBoundary &&\n        existingSelectionStart != null &&\n        existingSelectionEnd != null) {\n      // If this selectable contains the origin boundary, maintain the existing\n      // selection.\n      final bool forwardSelection =\n          existingSelectionEnd.offset >= existingSelectionStart.offset;\n      final RenderParagraph originParagraph = _getOriginParagraph();\n      final bool fragmentBelongsToOriginParagraph =\n          originParagraph == paragraph;\n      if (fragmentBelongsToOriginParagraph) {\n        return _updateSelectionStartEdgeByMultiSelectableTextBoundary(\n          getTextBoundary,\n          paragraphContainsPosition,\n          position,\n          existingSelectionStart,\n          existingSelectionEnd,\n        );\n      }\n      final Matrix4 originTransform = originParagraph.getTransformTo(null)\n        ..invert();\n      final Offset originParagraphLocalPosition = MatrixUtils.transformPoint(\n        originTransform,\n        globalPosition,\n      );\n      final bool positionWithinOriginParagraph = originParagraph.paintBounds\n          .contains(\n            originParagraphLocalPosition,\n          );\n      final TextPosition positionRelativeToOriginParagraph = originParagraph\n          .getPositionForOffset(\n            originParagraphLocalPosition,\n          );\n      if (positionWithinOriginParagraph) {\n        // When the selection is inverted by the new position it is necessary to\n        // swap the start edge (moving edge) with the end edge (static edge) to\n        // maintain the origin text boundary within the selection.\n        final String originText = originParagraph.text.toPlainText(\n          includeSemanticsLabels: false,\n        );\n        final _TextBoundaryRecord boundaryAtPosition = getTextBoundary(\n          positionRelativeToOriginParagraph,\n          originText,\n        );\n        final _TextBoundaryRecord originTextBoundary = getTextBoundary(\n          _getPositionInParagraph(originParagraph),\n          originText,\n        );\n        final TextPosition targetPosition;\n        final int pivotOffset = forwardSelection\n            ? originTextBoundary.boundaryEnd.offset\n            : originTextBoundary.boundaryStart.offset;\n        final bool shouldSwapEdges =\n            !forwardSelection !=\n            (positionRelativeToOriginParagraph.offset > pivotOffset);\n        if (positionRelativeToOriginParagraph.offset < pivotOffset) {\n          targetPosition = boundaryAtPosition.boundaryStart;\n        } else if (positionRelativeToOriginParagraph.offset > pivotOffset) {\n          targetPosition = boundaryAtPosition.boundaryEnd;\n        } else {\n          // Keep the origin text boundary in bounds when position is at the static edge.\n          targetPosition = existingSelectionStart;\n        }\n        if (shouldSwapEdges) {\n          _setSelectionPosition(existingSelectionStart, isEnd: true);\n        }\n        _setSelectionPosition(_clampTextPosition(targetPosition), isEnd: isEnd);\n        final bool finalSelectionIsForward =\n            _textSelectionEnd!.offset >= _textSelectionStart!.offset;\n        final TextPosition originParagraphPlaceholderTextPosition =\n            _getPositionInParagraph(\n              originParagraph,\n            );\n        final TextRange originParagraphPlaceholderRange = TextRange(\n          start: originParagraphPlaceholderTextPosition.offset,\n          end:\n              originParagraphPlaceholderTextPosition.offset +\n              _placeholderLength,\n        );\n        if (boundaryAtPosition.boundaryStart.offset >\n                originParagraphPlaceholderRange.end &&\n            boundaryAtPosition.boundaryEnd.offset >\n                originParagraphPlaceholderRange.end) {\n          return SelectionResult.next;\n        }\n        if (boundaryAtPosition.boundaryStart.offset <\n                originParagraphPlaceholderRange.start &&\n            boundaryAtPosition.boundaryEnd.offset <\n                originParagraphPlaceholderRange.start) {\n          return SelectionResult.previous;\n        }\n        if (finalSelectionIsForward) {\n          if (boundaryAtPosition.boundaryEnd.offset <=\n              originTextBoundary.boundaryEnd.offset) {\n            return SelectionResult.end;\n          }\n          if (boundaryAtPosition.boundaryEnd.offset >\n              originTextBoundary.boundaryEnd.offset) {\n            return SelectionResult.next;\n          }\n        } else {\n          if (boundaryAtPosition.boundaryStart.offset >=\n              originTextBoundary.boundaryStart.offset) {\n            return SelectionResult.end;\n          }\n          if (boundaryAtPosition.boundaryStart.offset <\n              originTextBoundary.boundaryStart.offset) {\n            return SelectionResult.previous;\n          }\n        }\n      } else {\n        // When the drag position is not contained within the origin paragraph,\n        // swap the edges when the selection changes direction.\n        //\n        // [SelectionUtils.adjustDragOffset] will adjust the given [Offset] to the\n        // beginning or end of the provided [Rect] based on whether the [Offset]\n        // is located within the given [Rect].\n        final Offset adjustedOffset = SelectionUtils.adjustDragOffset(\n          originParagraph.paintBounds,\n          originParagraphLocalPosition,\n          direction: paragraph.textDirection,\n        );\n        final TextPosition adjustedPositionRelativeToOriginParagraph =\n            originParagraph.getPositionForOffset(adjustedOffset);\n        final TextPosition originParagraphPlaceholderTextPosition =\n            _getPositionInParagraph(\n              originParagraph,\n            );\n        final TextRange originParagraphPlaceholderRange = TextRange(\n          start: originParagraphPlaceholderTextPosition.offset,\n          end:\n              originParagraphPlaceholderTextPosition.offset +\n              _placeholderLength,\n        );\n        if (forwardSelection &&\n            adjustedPositionRelativeToOriginParagraph.offset <=\n                originParagraphPlaceholderRange.start) {\n          _setSelectionPosition(\n            TextPosition(offset: range.start),\n            isEnd: isEnd,\n          );\n          return SelectionResult.previous;\n        }\n        if (!forwardSelection &&\n            adjustedPositionRelativeToOriginParagraph.offset >=\n                originParagraphPlaceholderRange.end) {\n          _setSelectionPosition(TextPosition(offset: range.end), isEnd: isEnd);\n          return SelectionResult.next;\n        }\n        if (forwardSelection &&\n            adjustedPositionRelativeToOriginParagraph.offset >=\n                originParagraphPlaceholderRange.end) {\n          _setSelectionPosition(existingSelectionStart, isEnd: true);\n          _setSelectionPosition(TextPosition(offset: range.end), isEnd: isEnd);\n          return SelectionResult.next;\n        }\n        if (!forwardSelection &&\n            adjustedPositionRelativeToOriginParagraph.offset <=\n                originParagraphPlaceholderRange.start) {\n          _setSelectionPosition(existingSelectionStart, isEnd: true);\n          _setSelectionPosition(\n            TextPosition(offset: range.start),\n            isEnd: isEnd,\n          );\n          return SelectionResult.previous;\n        }\n      }\n    } else {\n      // When the drag position is somewhere on the root text and not a placeholder,\n      // traverse the selectable fragments relative to the [RenderParagraph] that\n      // contains the drag position.\n      if (paragraphContainsPosition) {\n        return _updateSelectionStartEdgeByMultiSelectableTextBoundary(\n          getTextBoundary,\n          paragraphContainsPosition,\n          position,\n          existingSelectionStart,\n          existingSelectionEnd,\n        );\n      }\n      if (existingSelectionEnd != null) {\n        final ({RenderParagraph paragraph, Offset localPosition})?\n        targetDetails = _getParagraphContainingPosition(globalPosition);\n        if (targetDetails == null) {\n          return null;\n        }\n        final RenderParagraph targetParagraph = targetDetails.paragraph;\n        final TextPosition positionRelativeToTargetParagraph = targetParagraph\n            .getPositionForOffset(\n              targetDetails.localPosition,\n            );\n        final String targetText = targetParagraph.text.toPlainText(\n          includeSemanticsLabels: false,\n        );\n        final bool positionOnPlaceholder =\n            targetParagraph\n                .getWordBoundary(positionRelativeToTargetParagraph)\n                .textInside(targetText) ==\n            _placeholderCharacter;\n        if (positionOnPlaceholder) {\n          return null;\n        }\n        final bool backwardSelection =\n            existingSelectionStart == null &&\n                existingSelectionEnd.offset == range.start ||\n            existingSelectionStart == existingSelectionEnd &&\n                existingSelectionEnd.offset == range.start ||\n            existingSelectionStart != null &&\n                existingSelectionStart.offset > existingSelectionEnd.offset;\n        final _TextBoundaryRecord boundaryAtPositionRelativeToTargetParagraph =\n            getTextBoundary(\n              positionRelativeToTargetParagraph,\n              targetText,\n            );\n        final TextPosition targetParagraphPlaceholderTextPosition =\n            _getPositionInParagraph(\n              targetParagraph,\n            );\n        final TextRange targetParagraphPlaceholderRange = TextRange(\n          start: targetParagraphPlaceholderTextPosition.offset,\n          end:\n              targetParagraphPlaceholderTextPosition.offset +\n              _placeholderLength,\n        );\n        if (boundaryAtPositionRelativeToTargetParagraph.boundaryStart.offset <\n                targetParagraphPlaceholderRange.start &&\n            boundaryAtPositionRelativeToTargetParagraph.boundaryEnd.offset <\n                targetParagraphPlaceholderRange.start) {\n          _setSelectionPosition(\n            TextPosition(offset: range.start),\n            isEnd: isEnd,\n          );\n          return SelectionResult.previous;\n        }\n        if (boundaryAtPositionRelativeToTargetParagraph.boundaryStart.offset >\n                targetParagraphPlaceholderRange.end &&\n            boundaryAtPositionRelativeToTargetParagraph.boundaryEnd.offset >\n                targetParagraphPlaceholderRange.end) {\n          _setSelectionPosition(TextPosition(offset: range.end), isEnd: isEnd);\n          return SelectionResult.next;\n        }\n        if (backwardSelection) {\n          if (boundaryAtPositionRelativeToTargetParagraph.boundaryEnd.offset <=\n              targetParagraphPlaceholderRange.end) {\n            _setSelectionPosition(\n              TextPosition(offset: range.end),\n              isEnd: isEnd,\n            );\n            return SelectionResult.end;\n          }\n          if (boundaryAtPositionRelativeToTargetParagraph.boundaryEnd.offset >\n              targetParagraphPlaceholderRange.end) {\n            _setSelectionPosition(\n              TextPosition(offset: range.end),\n              isEnd: isEnd,\n            );\n            return SelectionResult.next;\n          }\n        } else {\n          if (boundaryAtPositionRelativeToTargetParagraph\n                  .boundaryStart\n                  .offset >=\n              targetParagraphPlaceholderRange.start) {\n            _setSelectionPosition(\n              TextPosition(offset: range.start),\n              isEnd: isEnd,\n            );\n            return SelectionResult.end;\n          }\n          if (boundaryAtPositionRelativeToTargetParagraph.boundaryStart.offset <\n              targetParagraphPlaceholderRange.start) {\n            _setSelectionPosition(\n              TextPosition(offset: range.start),\n              isEnd: isEnd,\n            );\n            return SelectionResult.previous;\n          }\n        }\n      }\n    }\n    return null;\n  }\n\n  // This method handles updating the end edge by a text boundary that may\n  // not be contained within this selectable fragment. It is possible\n  // that a boundary spans multiple selectable fragments when the text contains\n  // [WidgetSpan]s.\n  //\n  // This method differs from [_updateSelectionEndEdgeByMultiSelectableBoundary]\n  // in that to maintain the origin text boundary selected at a placeholder, this\n  // selectable fragment must be aware of the [RenderParagraph] that closely\n  // encompasses the complete origin text boundary.\n  //\n  // See [_updateSelectionStartEdgeAtPlaceholderByMultiSelectableTextBoundary]\n  // for the method that handles updating the start edge.\n  SelectionResult?\n  _updateSelectionEndEdgeAtPlaceholderByMultiSelectableTextBoundary(\n    _TextBoundaryAtPositionInText getTextBoundary,\n    Offset globalPosition,\n    bool paragraphContainsPosition,\n    TextPosition position,\n    TextPosition? existingSelectionStart,\n    TextPosition? existingSelectionEnd,\n  ) {\n    const bool isEnd = true;\n    if (_selectableContainsOriginTextBoundary &&\n        existingSelectionStart != null &&\n        existingSelectionEnd != null) {\n      // If this selectable contains the origin boundary, maintain the existing\n      // selection.\n      final bool forwardSelection =\n          existingSelectionEnd.offset >= existingSelectionStart.offset;\n      final RenderParagraph originParagraph = _getOriginParagraph();\n      final bool fragmentBelongsToOriginParagraph =\n          originParagraph == paragraph;\n      if (fragmentBelongsToOriginParagraph) {\n        return _updateSelectionEndEdgeByMultiSelectableTextBoundary(\n          getTextBoundary,\n          paragraphContainsPosition,\n          position,\n          existingSelectionStart,\n          existingSelectionEnd,\n        );\n      }\n      final Matrix4 originTransform = originParagraph.getTransformTo(null)\n        ..invert();\n      final Offset originParagraphLocalPosition = MatrixUtils.transformPoint(\n        originTransform,\n        globalPosition,\n      );\n      final bool positionWithinOriginParagraph = originParagraph.paintBounds\n          .contains(\n            originParagraphLocalPosition,\n          );\n      final TextPosition positionRelativeToOriginParagraph = originParagraph\n          .getPositionForOffset(\n            originParagraphLocalPosition,\n          );\n      if (positionWithinOriginParagraph) {\n        // When the selection is inverted by the new position it is necessary to\n        // swap the end edge (moving edge) with the start edge (static edge) to\n        // maintain the origin text boundary within the selection.\n        final String originText = originParagraph.text.toPlainText(\n          includeSemanticsLabels: false,\n        );\n        final _TextBoundaryRecord boundaryAtPosition = getTextBoundary(\n          positionRelativeToOriginParagraph,\n          originText,\n        );\n        final _TextBoundaryRecord originTextBoundary = getTextBoundary(\n          _getPositionInParagraph(originParagraph),\n          originText,\n        );\n        final TextPosition targetPosition;\n        final int pivotOffset = forwardSelection\n            ? originTextBoundary.boundaryStart.offset\n            : originTextBoundary.boundaryEnd.offset;\n        final bool shouldSwapEdges =\n            !forwardSelection !=\n            (positionRelativeToOriginParagraph.offset < pivotOffset);\n        if (positionRelativeToOriginParagraph.offset < pivotOffset) {\n          targetPosition = boundaryAtPosition.boundaryStart;\n        } else if (positionRelativeToOriginParagraph.offset > pivotOffset) {\n          targetPosition = boundaryAtPosition.boundaryEnd;\n        } else {\n          // Keep the origin text boundary in bounds when position is at the static edge.\n          targetPosition = existingSelectionEnd;\n        }\n        if (shouldSwapEdges) {\n          _setSelectionPosition(existingSelectionEnd, isEnd: false);\n        }\n        _setSelectionPosition(_clampTextPosition(targetPosition), isEnd: isEnd);\n        final bool finalSelectionIsForward =\n            _textSelectionEnd!.offset >= _textSelectionStart!.offset;\n        final TextPosition originParagraphPlaceholderTextPosition =\n            _getPositionInParagraph(\n              originParagraph,\n            );\n        final TextRange originParagraphPlaceholderRange = TextRange(\n          start: originParagraphPlaceholderTextPosition.offset,\n          end:\n              originParagraphPlaceholderTextPosition.offset +\n              _placeholderLength,\n        );\n        if (boundaryAtPosition.boundaryStart.offset >\n                originParagraphPlaceholderRange.end &&\n            boundaryAtPosition.boundaryEnd.offset >\n                originParagraphPlaceholderRange.end) {\n          return SelectionResult.next;\n        }\n        if (boundaryAtPosition.boundaryStart.offset <\n                originParagraphPlaceholderRange.start &&\n            boundaryAtPosition.boundaryEnd.offset <\n                originParagraphPlaceholderRange.start) {\n          return SelectionResult.previous;\n        }\n        if (finalSelectionIsForward) {\n          if (boundaryAtPosition.boundaryEnd.offset <=\n              originTextBoundary.boundaryEnd.offset) {\n            return SelectionResult.end;\n          }\n          if (boundaryAtPosition.boundaryEnd.offset >\n              originTextBoundary.boundaryEnd.offset) {\n            return SelectionResult.next;\n          }\n        } else {\n          if (boundaryAtPosition.boundaryStart.offset >=\n              originTextBoundary.boundaryStart.offset) {\n            return SelectionResult.end;\n          }\n          if (boundaryAtPosition.boundaryStart.offset <\n              originTextBoundary.boundaryStart.offset) {\n            return SelectionResult.previous;\n          }\n        }\n      } else {\n        // When the drag position is not contained within the origin paragraph,\n        // swap the edges when the selection changes direction.\n        //\n        // [SelectionUtils.adjustDragOffset] will adjust the given [Offset] to the\n        // beginning or end of the provided [Rect] based on whether the [Offset]\n        // is located within the given [Rect].\n        final Offset adjustedOffset = SelectionUtils.adjustDragOffset(\n          originParagraph.paintBounds,\n          originParagraphLocalPosition,\n          direction: paragraph.textDirection,\n        );\n        final TextPosition adjustedPositionRelativeToOriginParagraph =\n            originParagraph.getPositionForOffset(adjustedOffset);\n        final TextPosition originParagraphPlaceholderTextPosition =\n            _getPositionInParagraph(\n              originParagraph,\n            );\n        final TextRange originParagraphPlaceholderRange = TextRange(\n          start: originParagraphPlaceholderTextPosition.offset,\n          end:\n              originParagraphPlaceholderTextPosition.offset +\n              _placeholderLength,\n        );\n        if (forwardSelection &&\n            adjustedPositionRelativeToOriginParagraph.offset <=\n                originParagraphPlaceholderRange.start) {\n          _setSelectionPosition(existingSelectionEnd, isEnd: false);\n          _setSelectionPosition(\n            TextPosition(offset: range.start),\n            isEnd: isEnd,\n          );\n          return SelectionResult.previous;\n        }\n        if (!forwardSelection &&\n            adjustedPositionRelativeToOriginParagraph.offset >=\n                originParagraphPlaceholderRange.end) {\n          _setSelectionPosition(existingSelectionEnd, isEnd: false);\n          _setSelectionPosition(TextPosition(offset: range.end), isEnd: isEnd);\n          return SelectionResult.next;\n        }\n        if (forwardSelection &&\n            adjustedPositionRelativeToOriginParagraph.offset >=\n                originParagraphPlaceholderRange.end) {\n          _setSelectionPosition(TextPosition(offset: range.end), isEnd: isEnd);\n          return SelectionResult.next;\n        }\n        if (!forwardSelection &&\n            adjustedPositionRelativeToOriginParagraph.offset <=\n                originParagraphPlaceholderRange.start) {\n          _setSelectionPosition(\n            TextPosition(offset: range.start),\n            isEnd: isEnd,\n          );\n          return SelectionResult.previous;\n        }\n      }\n    } else {\n      // When the drag position is somewhere on the root text and not a placeholder,\n      // traverse the selectable fragments relative to the [RenderParagraph] that\n      // contains the drag position.\n      if (paragraphContainsPosition) {\n        return _updateSelectionEndEdgeByMultiSelectableTextBoundary(\n          getTextBoundary,\n          paragraphContainsPosition,\n          position,\n          existingSelectionStart,\n          existingSelectionEnd,\n        );\n      }\n      if (existingSelectionStart != null) {\n        final ({RenderParagraph paragraph, Offset localPosition})?\n        targetDetails = _getParagraphContainingPosition(globalPosition);\n        if (targetDetails == null) {\n          return null;\n        }\n        final RenderParagraph targetParagraph = targetDetails.paragraph;\n        final TextPosition positionRelativeToTargetParagraph = targetParagraph\n            .getPositionForOffset(\n              targetDetails.localPosition,\n            );\n        final String targetText = targetParagraph.text.toPlainText(\n          includeSemanticsLabels: false,\n        );\n        final bool positionOnPlaceholder =\n            targetParagraph\n                .getWordBoundary(positionRelativeToTargetParagraph)\n                .textInside(targetText) ==\n            _placeholderCharacter;\n        if (positionOnPlaceholder) {\n          return null;\n        }\n        final bool backwardSelection =\n            existingSelectionEnd == null &&\n                existingSelectionStart.offset == range.end ||\n            existingSelectionStart == existingSelectionEnd &&\n                existingSelectionStart.offset == range.end ||\n            existingSelectionEnd != null &&\n                existingSelectionStart.offset > existingSelectionEnd.offset;\n        final _TextBoundaryRecord boundaryAtPositionRelativeToTargetParagraph =\n            getTextBoundary(\n              positionRelativeToTargetParagraph,\n              targetText,\n            );\n        final TextPosition targetParagraphPlaceholderTextPosition =\n            _getPositionInParagraph(\n              targetParagraph,\n            );\n        final TextRange targetParagraphPlaceholderRange = TextRange(\n          start: targetParagraphPlaceholderTextPosition.offset,\n          end:\n              targetParagraphPlaceholderTextPosition.offset +\n              _placeholderLength,\n        );\n        if (boundaryAtPositionRelativeToTargetParagraph.boundaryStart.offset <\n                targetParagraphPlaceholderRange.start &&\n            boundaryAtPositionRelativeToTargetParagraph.boundaryEnd.offset <\n                targetParagraphPlaceholderRange.start) {\n          _setSelectionPosition(\n            TextPosition(offset: range.start),\n            isEnd: isEnd,\n          );\n          return SelectionResult.previous;\n        }\n        if (boundaryAtPositionRelativeToTargetParagraph.boundaryStart.offset >\n                targetParagraphPlaceholderRange.end &&\n            boundaryAtPositionRelativeToTargetParagraph.boundaryEnd.offset >\n                targetParagraphPlaceholderRange.end) {\n          _setSelectionPosition(TextPosition(offset: range.end), isEnd: isEnd);\n          return SelectionResult.next;\n        }\n        if (backwardSelection) {\n          if (boundaryAtPositionRelativeToTargetParagraph\n                  .boundaryStart\n                  .offset >=\n              targetParagraphPlaceholderRange.start) {\n            _setSelectionPosition(\n              TextPosition(offset: range.start),\n              isEnd: isEnd,\n            );\n            return SelectionResult.end;\n          }\n          if (boundaryAtPositionRelativeToTargetParagraph.boundaryStart.offset <\n              targetParagraphPlaceholderRange.start) {\n            _setSelectionPosition(\n              TextPosition(offset: range.start),\n              isEnd: isEnd,\n            );\n            return SelectionResult.previous;\n          }\n        } else {\n          if (boundaryAtPositionRelativeToTargetParagraph.boundaryEnd.offset <=\n              targetParagraphPlaceholderRange.end) {\n            _setSelectionPosition(\n              TextPosition(offset: range.end),\n              isEnd: isEnd,\n            );\n            return SelectionResult.end;\n          }\n          if (boundaryAtPositionRelativeToTargetParagraph.boundaryEnd.offset >\n              targetParagraphPlaceholderRange.end) {\n            _setSelectionPosition(\n              TextPosition(offset: range.end),\n              isEnd: isEnd,\n            );\n            return SelectionResult.next;\n          }\n        }\n      }\n    }\n    return null;\n  }\n\n  SelectionResult _updateSelectionEdgeByMultiSelectableTextBoundary(\n    Offset globalPosition, {\n    required bool isEnd,\n    required _TextBoundaryAtPositionInText getTextBoundary,\n    required _TextBoundaryAtPosition getClampedTextBoundary,\n  }) {\n    // When the start/end edges are swapped, i.e. the start is after the end, and\n    // the scrollable synthesizes an event for the opposite edge, this will potentially\n    // move the opposite edge outside of the origin text boundary and we are unable to recover.\n    final TextPosition? existingSelectionStart = _textSelectionStart;\n    final TextPosition? existingSelectionEnd = _textSelectionEnd;\n\n    _setSelectionPosition(null, isEnd: isEnd);\n    final Matrix4 transform = paragraph.getTransformTo(null);\n    transform.invert();\n    final Offset localPosition = MatrixUtils.transformPoint(\n      transform,\n      globalPosition,\n    );\n    if (_rect.isEmpty) {\n      return SelectionUtils.getResultBasedOnRect(_rect, localPosition);\n    }\n    final Offset adjustedOffset = SelectionUtils.adjustDragOffset(\n      _rect,\n      localPosition,\n      direction: paragraph.textDirection,\n    );\n    final Offset adjustedOffsetRelativeToParagraph =\n        SelectionUtils.adjustDragOffset(\n          paragraph.paintBounds,\n          localPosition,\n          direction: paragraph.textDirection,\n        );\n\n    final TextPosition position = paragraph.getPositionForOffset(\n      adjustedOffset,\n    );\n    final TextPosition positionInFullText = paragraph.getPositionForOffset(\n      adjustedOffsetRelativeToParagraph,\n    );\n\n    final SelectionResult? result;\n    if (_isPlaceholder()) {\n      result = isEnd\n          ? _updateSelectionEndEdgeAtPlaceholderByMultiSelectableTextBoundary(\n              getTextBoundary,\n              globalPosition,\n              paragraph.paintBounds.contains(localPosition),\n              positionInFullText,\n              existingSelectionStart,\n              existingSelectionEnd,\n            )\n          : _updateSelectionStartEdgeAtPlaceholderByMultiSelectableTextBoundary(\n              getTextBoundary,\n              globalPosition,\n              paragraph.paintBounds.contains(localPosition),\n              positionInFullText,\n              existingSelectionStart,\n              existingSelectionEnd,\n            );\n    } else {\n      result = isEnd\n          ? _updateSelectionEndEdgeByMultiSelectableTextBoundary(\n              getTextBoundary,\n              paragraph.paintBounds.contains(localPosition),\n              positionInFullText,\n              existingSelectionStart,\n              existingSelectionEnd,\n            )\n          : _updateSelectionStartEdgeByMultiSelectableTextBoundary(\n              getTextBoundary,\n              paragraph.paintBounds.contains(localPosition),\n              positionInFullText,\n              existingSelectionStart,\n              existingSelectionEnd,\n            );\n    }\n    if (result != null) {\n      return result;\n    }\n\n    // Check if the original local position is within the rect, if it is not then\n    // we do not need to look up the text boundary for that position. This is to\n    // maintain a selectables selection collapsed at 0 when the local position is\n    // not located inside its rect.\n    _TextBoundaryRecord? textBoundary = _boundingBoxesContains(localPosition)\n        ? getClampedTextBoundary(position)\n        : null;\n    if (textBoundary != null &&\n        (textBoundary.boundaryStart.offset < range.start &&\n                textBoundary.boundaryEnd.offset <= range.start ||\n            textBoundary.boundaryStart.offset >= range.end &&\n                textBoundary.boundaryEnd.offset > range.end)) {\n      // When the position is located at a placeholder inside of the text, then we may compute\n      // a text boundary that does not belong to the current selectable fragment. In this case\n      // we should invalidate the text boundary so that it is not taken into account when\n      // computing the target position.\n      textBoundary = null;\n    }\n    final TextPosition targetPosition = _clampTextPosition(\n      isEnd\n          ? _updateSelectionEndEdgeByTextBoundary(\n              textBoundary,\n              getClampedTextBoundary,\n              position,\n              existingSelectionStart,\n              existingSelectionEnd,\n            )\n          : _updateSelectionStartEdgeByTextBoundary(\n              textBoundary,\n              getClampedTextBoundary,\n              position,\n              existingSelectionStart,\n              existingSelectionEnd,\n            ),\n    );\n\n    _setSelectionPosition(targetPosition, isEnd: isEnd);\n    if (targetPosition.offset == range.end) {\n      return SelectionResult.next;\n    }\n\n    if (targetPosition.offset == range.start) {\n      return SelectionResult.previous;\n    }\n    // TODO(chunhtai): The geometry information should not be used to determine\n    // selection result. This is a workaround to RenderParagraph, where it does\n    // not have a way to get accurate text length if its text is truncated due to\n    // layout constraint.\n    return SelectionUtils.getResultBasedOnRect(_rect, localPosition);\n  }\n\n  TextPosition _closestTextBoundary(\n    _TextBoundaryRecord textBoundary,\n    TextPosition position,\n  ) {\n    final int differenceA =\n        (position.offset - textBoundary.boundaryStart.offset).abs();\n    final int differenceB = (position.offset - textBoundary.boundaryEnd.offset)\n        .abs();\n    return differenceA < differenceB\n        ? textBoundary.boundaryStart\n        : textBoundary.boundaryEnd;\n  }\n\n  bool _isPlaceholder() {\n    // Determine whether this selectable fragment is a placeholder.\n    RenderObject? current = paragraph.parent;\n    while (current != null) {\n      if (current is RenderParagraph) {\n        return true;\n      }\n      current = current.parent;\n    }\n    return false;\n  }\n\n  RenderParagraph _getOriginParagraph() {\n    // This method should only be called from a fragment that contains\n    // the origin boundary. By traversing up the RenderTree, determine the\n    // highest RenderParagraph that contains the origin text boundary.\n    assert(_selectableContainsOriginTextBoundary);\n    // Begin at the parent because it is guaranteed the paragraph containing\n    // this selectable fragment contains the origin boundary.\n    RenderObject? current = paragraph.parent;\n    RenderParagraph? originParagraph;\n    while (current != null) {\n      if (current is RenderParagraph) {\n        if (current._lastSelectableFragments != null) {\n          bool paragraphContainsOriginTextBoundary = false;\n          for (final _SelectableFragment fragment\n              in current._lastSelectableFragments!) {\n            if (fragment._selectableContainsOriginTextBoundary) {\n              paragraphContainsOriginTextBoundary = true;\n              originParagraph = current;\n              break;\n            }\n          }\n          if (!paragraphContainsOriginTextBoundary) {\n            return originParagraph ?? paragraph;\n          }\n        }\n      }\n      current = current.parent;\n    }\n    return originParagraph ?? paragraph;\n  }\n\n  ({RenderParagraph paragraph, Offset localPosition})?\n  _getParagraphContainingPosition(\n    Offset globalPosition,\n  ) {\n    // This method will return the closest [RenderParagraph] whose rect\n    // contains the given `globalPosition` and the given `globalPosition`\n    // relative to that [RenderParagraph]. If no ancestor [RenderParagraph]\n    // contains the given `globalPosition` then this method will return null.\n    RenderObject? current = paragraph;\n    while (current != null) {\n      if (current is RenderParagraph) {\n        final Matrix4 currentTransform = current.getTransformTo(null)..invert();\n        final Offset currentParagraphLocalPosition = MatrixUtils.transformPoint(\n          currentTransform,\n          globalPosition,\n        );\n        final bool positionWithinCurrentParagraph = current.paintBounds\n            .contains(\n              currentParagraphLocalPosition,\n            );\n        if (positionWithinCurrentParagraph) {\n          return (\n            paragraph: current,\n            localPosition: currentParagraphLocalPosition,\n          );\n        }\n      }\n      current = current.parent;\n    }\n    return null;\n  }\n\n  bool _boundingBoxesContains(Offset position) {\n    for (final Rect rect in boundingBoxes) {\n      if (rect.contains(position)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  TextPosition _clampTextPosition(TextPosition position) {\n    // Affinity of range.end is upstream.\n    if (position.offset > range.end ||\n        (position.offset == range.end &&\n            position.affinity == TextAffinity.downstream)) {\n      return TextPosition(offset: range.end, affinity: TextAffinity.upstream);\n    }\n    if (position.offset < range.start) {\n      return TextPosition(offset: range.start);\n    }\n    return position;\n  }\n\n  void _setSelectionPosition(TextPosition? position, {required bool isEnd}) {\n    if (isEnd) {\n      _textSelectionEnd = position;\n    } else {\n      _textSelectionStart = position;\n    }\n  }\n\n  SelectionResult _handleClearSelection() {\n    _textSelectionStart = null;\n    _textSelectionEnd = null;\n    _selectableContainsOriginTextBoundary = false;\n    return SelectionResult.none;\n  }\n\n  SelectionResult _handleSelectAll() {\n    _textSelectionStart = TextPosition(offset: range.start);\n    _textSelectionEnd = TextPosition(\n      offset: range.end,\n      affinity: TextAffinity.upstream,\n    );\n    return SelectionResult.none;\n  }\n\n  SelectionResult _handleSelectTextBoundary(_TextBoundaryRecord textBoundary) {\n    // This fragment may not contain the boundary, decide what direction the target\n    // fragment is located in. Because fragments are separated by placeholder\n    // spans, we also check if the beginning or end of the boundary is touching\n    // either edge of this fragment.\n    if (textBoundary.boundaryStart.offset < range.start &&\n        textBoundary.boundaryEnd.offset <= range.start) {\n      return SelectionResult.previous;\n    } else if (textBoundary.boundaryStart.offset >= range.end &&\n        textBoundary.boundaryEnd.offset > range.end) {\n      return SelectionResult.next;\n    }\n    // Fragments are separated by placeholder span, the text boundary shouldn't\n    // expand across fragments.\n    assert(\n      textBoundary.boundaryStart.offset >= range.start &&\n          textBoundary.boundaryEnd.offset <= range.end,\n    );\n    _textSelectionStart = textBoundary.boundaryStart;\n    _textSelectionEnd = textBoundary.boundaryEnd;\n    _selectableContainsOriginTextBoundary = true;\n    return SelectionResult.end;\n  }\n\n  TextRange? _intersect(TextRange a, TextRange b) {\n    assert(a.isNormalized);\n    assert(b.isNormalized);\n    final int startMax = math.max(a.start, b.start);\n    final int endMin = math.min(a.end, b.end);\n    if (startMax <= endMin) {\n      // Intersection.\n      return TextRange(start: startMax, end: endMin);\n    }\n    return null;\n  }\n\n  SelectionResult _handleSelectMultiFragmentTextBoundary(\n    _TextBoundaryRecord textBoundary,\n  ) {\n    // This fragment may not contain the boundary, decide what direction the target\n    // fragment is located in. Because fragments are separated by placeholder\n    // spans, we also check if the beginning or end of the boundary is touching\n    // either edge of this fragment.\n    if (textBoundary.boundaryStart.offset < range.start &&\n        textBoundary.boundaryEnd.offset <= range.start) {\n      return SelectionResult.previous;\n    } else if (textBoundary.boundaryStart.offset >= range.end &&\n        textBoundary.boundaryEnd.offset > range.end) {\n      return SelectionResult.next;\n    }\n    final TextRange boundaryAsRange = TextRange(\n      start: textBoundary.boundaryStart.offset,\n      end: textBoundary.boundaryEnd.offset,\n    );\n    final TextRange? intersectRange = _intersect(range, boundaryAsRange);\n    if (intersectRange != null) {\n      _textSelectionStart = TextPosition(offset: intersectRange.start);\n      _textSelectionEnd = TextPosition(offset: intersectRange.end);\n      _selectableContainsOriginTextBoundary = true;\n      if (range.end < textBoundary.boundaryEnd.offset) {\n        return SelectionResult.next;\n      }\n      return SelectionResult.end;\n    }\n    return SelectionResult.none;\n  }\n\n  _TextBoundaryRecord _adjustTextBoundaryAtPosition(\n    TextRange textBoundary,\n    TextPosition position,\n  ) {\n    late final TextPosition start;\n    late final TextPosition end;\n    if (position.offset > textBoundary.end) {\n      start = end = TextPosition(offset: position.offset);\n    } else {\n      start = TextPosition(offset: textBoundary.start);\n      end = TextPosition(\n        offset: textBoundary.end,\n        affinity: TextAffinity.upstream,\n      );\n    }\n    return (boundaryStart: start, boundaryEnd: end);\n  }\n\n  SelectionResult _handleSelectWord(Offset globalPosition) {\n    final TextPosition position = paragraph.getPositionForOffset(\n      paragraph.globalToLocal(globalPosition),\n    );\n    if (_positionIsWithinCurrentSelection(position) &&\n        _textSelectionStart != _textSelectionEnd) {\n      return SelectionResult.end;\n    }\n    final _TextBoundaryRecord wordBoundary = _getWordBoundaryAtPosition(\n      position,\n    );\n    return _handleSelectTextBoundary(wordBoundary);\n  }\n\n  _TextBoundaryRecord _getWordBoundaryAtPosition(TextPosition position) {\n    final TextRange word = paragraph.getWordBoundary(position);\n    assert(word.isNormalized);\n    return _adjustTextBoundaryAtPosition(word, position);\n  }\n\n  SelectionResult _handleSelectParagraph(Offset globalPosition) {\n    final Offset localPosition = paragraph.globalToLocal(globalPosition);\n    final TextPosition position = paragraph.getPositionForOffset(localPosition);\n    final _TextBoundaryRecord paragraphBoundary =\n        _getParagraphBoundaryAtPosition(\n          position,\n          fullText,\n        );\n    return _handleSelectMultiFragmentTextBoundary(paragraphBoundary);\n  }\n\n  TextPosition _getPositionInParagraph(RenderParagraph targetParagraph) {\n    final Matrix4 transform = paragraph.getTransformTo(targetParagraph);\n    final Offset localCenter = paragraph.paintBounds.centerLeft;\n    final Offset localPos = MatrixUtils.transformPoint(transform, localCenter);\n    final TextPosition position = targetParagraph.getPositionForOffset(\n      localPos,\n    );\n    return position;\n  }\n\n  _TextBoundaryRecord _getParagraphBoundaryAtPosition(\n    TextPosition position,\n    String text,\n  ) {\n    final ParagraphBoundary paragraphBoundary = ParagraphBoundary(text);\n    // Use position.offset - 1 when `position` is at the end of the selectable to retrieve\n    // the previous text boundary's location.\n    final int paragraphStart =\n        paragraphBoundary.getLeadingTextBoundaryAt(\n          position.offset == text.length ||\n                  position.affinity == TextAffinity.upstream\n              ? position.offset - 1\n              : position.offset,\n        ) ??\n        0;\n    final int paragraphEnd =\n        paragraphBoundary.getTrailingTextBoundaryAt(position.offset) ??\n        text.length;\n    final TextRange paragraphRange = TextRange(\n      start: paragraphStart,\n      end: paragraphEnd,\n    );\n    assert(paragraphRange.isNormalized);\n    return _adjustTextBoundaryAtPosition(paragraphRange, position);\n  }\n\n  _TextBoundaryRecord _getClampedParagraphBoundaryAtPosition(\n    TextPosition position,\n  ) {\n    final ParagraphBoundary paragraphBoundary = ParagraphBoundary(fullText);\n    // Use position.offset - 1 when `position` is at the end of the selectable to retrieve\n    // the previous text boundary's location.\n    int paragraphStart =\n        paragraphBoundary.getLeadingTextBoundaryAt(\n          position.offset == fullText.length ||\n                  position.affinity == TextAffinity.upstream\n              ? position.offset - 1\n              : position.offset,\n        ) ??\n        0;\n    int paragraphEnd =\n        paragraphBoundary.getTrailingTextBoundaryAt(position.offset) ??\n        fullText.length;\n    paragraphStart = paragraphStart < range.start\n        ? range.start\n        : paragraphStart > range.end\n        ? range.end\n        : paragraphStart;\n    paragraphEnd = paragraphEnd > range.end\n        ? range.end\n        : paragraphEnd < range.start\n        ? range.start\n        : paragraphEnd;\n    final TextRange paragraphRange = TextRange(\n      start: paragraphStart,\n      end: paragraphEnd,\n    );\n    assert(paragraphRange.isNormalized);\n    return _adjustTextBoundaryAtPosition(paragraphRange, position);\n  }\n\n  SelectionResult _handleDirectionallyExtendSelection(\n    double horizontalBaseline,\n    bool isExtent,\n    SelectionExtendDirection movement,\n  ) {\n    final Matrix4 transform = paragraph.getTransformTo(null);\n    if (transform.invert() == 0.0) {\n      switch (movement) {\n        case SelectionExtendDirection.previousLine:\n        case SelectionExtendDirection.backward:\n          return SelectionResult.previous;\n        case SelectionExtendDirection.nextLine:\n        case SelectionExtendDirection.forward:\n          return SelectionResult.next;\n      }\n    }\n    final double baselineInParagraphCoordinates = MatrixUtils.transformPoint(\n      transform,\n      Offset(horizontalBaseline, 0),\n    ).dx;\n    assert(!baselineInParagraphCoordinates.isNaN);\n    final TextPosition newPosition;\n    final SelectionResult result;\n    switch (movement) {\n      case SelectionExtendDirection.previousLine:\n      case SelectionExtendDirection.nextLine:\n        assert(_textSelectionEnd != null && _textSelectionStart != null);\n        final TextPosition targetedEdge = isExtent\n            ? _textSelectionEnd!\n            : _textSelectionStart!;\n        final MapEntry<TextPosition, SelectionResult> moveResult =\n            _handleVerticalMovement(\n              targetedEdge,\n              horizontalBaselineInParagraphCoordinates:\n                  baselineInParagraphCoordinates,\n              below: movement == SelectionExtendDirection.nextLine,\n            );\n        newPosition = moveResult.key;\n        result = moveResult.value;\n      case SelectionExtendDirection.forward:\n      case SelectionExtendDirection.backward:\n        _textSelectionEnd ??= movement == SelectionExtendDirection.forward\n            ? TextPosition(offset: range.start)\n            : TextPosition(offset: range.end, affinity: TextAffinity.upstream);\n        _textSelectionStart ??= _textSelectionEnd;\n        final TextPosition targetedEdge = isExtent\n            ? _textSelectionEnd!\n            : _textSelectionStart!;\n        final Offset edgeOffsetInParagraphCoordinates = paragraph\n            ._getOffsetForPosition(\n              targetedEdge,\n            );\n        final Offset baselineOffsetInParagraphCoordinates = Offset(\n          baselineInParagraphCoordinates,\n          // Use half of line height to point to the middle of the line.\n          edgeOffsetInParagraphCoordinates.dy -\n              paragraph._textPainter.preferredLineHeight / 2,\n        );\n        newPosition = paragraph.getPositionForOffset(\n          baselineOffsetInParagraphCoordinates,\n        );\n        result = SelectionResult.end;\n    }\n    if (isExtent) {\n      _textSelectionEnd = newPosition;\n    } else {\n      _textSelectionStart = newPosition;\n    }\n    return result;\n  }\n\n  SelectionResult _handleGranularlyExtendSelection(\n    bool forward,\n    bool isExtent,\n    TextGranularity granularity,\n  ) {\n    _textSelectionEnd ??= forward\n        ? TextPosition(offset: range.start)\n        : TextPosition(offset: range.end, affinity: TextAffinity.upstream);\n    _textSelectionStart ??= _textSelectionEnd;\n    final TextPosition targetedEdge = isExtent\n        ? _textSelectionEnd!\n        : _textSelectionStart!;\n    if (forward && (targetedEdge.offset == range.end)) {\n      return SelectionResult.next;\n    }\n    if (!forward && (targetedEdge.offset == range.start)) {\n      return SelectionResult.previous;\n    }\n    final SelectionResult result;\n    final TextPosition newPosition;\n    switch (granularity) {\n      case TextGranularity.character:\n        final String text = range.textInside(fullText);\n        newPosition = _moveBeyondTextBoundaryAtDirection(\n          targetedEdge,\n          forward,\n          CharacterBoundary(text),\n        );\n        result = SelectionResult.end;\n      case TextGranularity.word:\n        final TextBoundary textBoundary =\n            paragraph._textPainter.wordBoundaries.moveByWordBoundary;\n        newPosition = _moveBeyondTextBoundaryAtDirection(\n          targetedEdge,\n          forward,\n          textBoundary,\n        );\n        result = SelectionResult.end;\n      case TextGranularity.paragraph:\n        final String text = range.textInside(fullText);\n        newPosition = _moveBeyondTextBoundaryAtDirection(\n          targetedEdge,\n          forward,\n          ParagraphBoundary(text),\n        );\n        result = SelectionResult.end;\n      case TextGranularity.line:\n        newPosition = _moveToTextBoundaryAtDirection(\n          targetedEdge,\n          forward,\n          LineBoundary(this),\n        );\n        result = SelectionResult.end;\n      case TextGranularity.document:\n        final String text = range.textInside(fullText);\n        newPosition = _moveBeyondTextBoundaryAtDirection(\n          targetedEdge,\n          forward,\n          DocumentBoundary(text),\n        );\n        if (forward && newPosition.offset == range.end) {\n          result = SelectionResult.next;\n        } else if (!forward && newPosition.offset == range.start) {\n          result = SelectionResult.previous;\n        } else {\n          result = SelectionResult.end;\n        }\n    }\n\n    if (isExtent) {\n      _textSelectionEnd = newPosition;\n    } else {\n      _textSelectionStart = newPosition;\n    }\n    return result;\n  }\n\n  // Move **beyond** the local boundary of the given type (unless range.start or\n  // range.end is reached). Used for most TextGranularity types except for\n  // TextGranularity.line, to ensure the selection movement doesn't get stuck at\n  // a local fixed point.\n  TextPosition _moveBeyondTextBoundaryAtDirection(\n    TextPosition end,\n    bool forward,\n    TextBoundary textBoundary,\n  ) {\n    final int newOffset = forward\n        ? textBoundary.getTrailingTextBoundaryAt(end.offset) ?? range.end\n        : textBoundary.getLeadingTextBoundaryAt(end.offset - 1) ?? range.start;\n    return TextPosition(offset: newOffset);\n  }\n\n  // Move **to** the local boundary of the given type. Typically used for line\n  // boundaries, such that performing \"move to line start\" more than once never\n  // moves the selection to the previous line.\n  TextPosition _moveToTextBoundaryAtDirection(\n    TextPosition end,\n    bool forward,\n    TextBoundary textBoundary,\n  ) {\n    assert(end.offset >= 0);\n    final int caretOffset;\n    switch (end.affinity) {\n      case TextAffinity.upstream:\n        if (end.offset < 1 && !forward) {\n          assert(end.offset == 0);\n          return const TextPosition(offset: 0);\n        }\n        final CharacterBoundary characterBoundary = CharacterBoundary(fullText);\n        caretOffset =\n            math.max(\n              0,\n              characterBoundary.getLeadingTextBoundaryAt(\n                    range.start + end.offset,\n                  ) ??\n                  range.start,\n            ) -\n            1;\n      case TextAffinity.downstream:\n        caretOffset = end.offset;\n    }\n    final int offset = forward\n        ? textBoundary.getTrailingTextBoundaryAt(caretOffset) ?? range.end\n        : textBoundary.getLeadingTextBoundaryAt(caretOffset) ?? range.start;\n    return TextPosition(offset: offset);\n  }\n\n  MapEntry<TextPosition, SelectionResult> _handleVerticalMovement(\n    TextPosition position, {\n    required double horizontalBaselineInParagraphCoordinates,\n    required bool below,\n  }) {\n    final List<ui.LineMetrics> lines = paragraph._textPainter\n        .computeLineMetrics();\n    final Offset offset = paragraph.getOffsetForCaret(position, Rect.zero);\n    int currentLine = lines.length - 1;\n    for (final ui.LineMetrics lineMetrics in lines) {\n      if (lineMetrics.baseline > offset.dy) {\n        currentLine = lineMetrics.lineNumber;\n        break;\n      }\n    }\n    final TextPosition newPosition;\n    if (below && currentLine == lines.length - 1) {\n      newPosition = TextPosition(\n        offset: range.end,\n        affinity: TextAffinity.upstream,\n      );\n    } else if (!below && currentLine == 0) {\n      newPosition = TextPosition(offset: range.start);\n    } else {\n      final int newLine = below ? currentLine + 1 : currentLine - 1;\n      newPosition = _clampTextPosition(\n        paragraph.getPositionForOffset(\n          Offset(\n            horizontalBaselineInParagraphCoordinates,\n            lines[newLine].baseline,\n          ),\n        ),\n      );\n    }\n    final SelectionResult result;\n    if (newPosition.offset == range.start) {\n      result = SelectionResult.previous;\n    } else if (newPosition.offset == range.end) {\n      result = SelectionResult.next;\n    } else {\n      result = SelectionResult.end;\n    }\n    assert(result != SelectionResult.next || below);\n    assert(result != SelectionResult.previous || !below);\n    return MapEntry<TextPosition, SelectionResult>(newPosition, result);\n  }\n\n  /// Whether the given text position is contained in current selection\n  /// range.\n  ///\n  /// The parameter `start` must be smaller than `end`.\n  bool _positionIsWithinCurrentSelection(TextPosition position) {\n    if (_textSelectionStart == null || _textSelectionEnd == null) {\n      return false;\n    }\n    // Normalize current selection.\n    late TextPosition currentStart;\n    late TextPosition currentEnd;\n    if (_compareTextPositions(_textSelectionStart!, _textSelectionEnd!) > 0) {\n      currentStart = _textSelectionStart!;\n      currentEnd = _textSelectionEnd!;\n    } else {\n      currentStart = _textSelectionEnd!;\n      currentEnd = _textSelectionStart!;\n    }\n    return _compareTextPositions(currentStart, position) >= 0 &&\n        _compareTextPositions(currentEnd, position) <= 0;\n  }\n\n  /// Compares two text positions.\n  ///\n  /// Returns 1 if `position` < `otherPosition`, -1 if `position` > `otherPosition`,\n  /// or 0 if they are equal.\n  static int _compareTextPositions(\n    TextPosition position,\n    TextPosition otherPosition,\n  ) {\n    if (position.offset < otherPosition.offset) {\n      return 1;\n    } else if (position.offset > otherPosition.offset) {\n      return -1;\n    } else if (position.affinity == otherPosition.affinity) {\n      return 0;\n    } else {\n      return position.affinity == TextAffinity.upstream ? 1 : -1;\n    }\n  }\n\n  @override\n  Matrix4 getTransformTo(RenderObject? ancestor) {\n    return paragraph.getTransformTo(ancestor);\n  }\n\n  @override\n  void pushHandleLayers(LayerLink? startHandle, LayerLink? endHandle) {\n    if (!paragraph.attached) {\n      assert(\n        startHandle == null && endHandle == null,\n        'Only clean up can be called.',\n      );\n      return;\n    }\n    if (_startHandleLayerLink != startHandle) {\n      _startHandleLayerLink = startHandle;\n      paragraph.markNeedsPaint();\n    }\n    if (_endHandleLayerLink != endHandle) {\n      _endHandleLayerLink = endHandle;\n      paragraph.markNeedsPaint();\n    }\n  }\n\n  List<Rect>? _cachedBoundingBoxes;\n  @override\n  List<Rect> get boundingBoxes {\n    if (_cachedBoundingBoxes == null) {\n      final List<TextBox> boxes = paragraph.getBoxesForSelection(\n        TextSelection(baseOffset: range.start, extentOffset: range.end),\n        boxHeightStyle: ui.BoxHeightStyle.max,\n      );\n      if (boxes.isNotEmpty) {\n        _cachedBoundingBoxes = <Rect>[];\n        for (final TextBox textBox in boxes) {\n          _cachedBoundingBoxes!.add(textBox.toRect());\n        }\n      } else {\n        final Offset offset = paragraph._getOffsetForPosition(\n          TextPosition(offset: range.start),\n        );\n        final Rect rect = Rect.fromPoints(\n          offset,\n          offset.translate(0, -paragraph._textPainter.preferredLineHeight),\n        );\n        _cachedBoundingBoxes = <Rect>[rect];\n      }\n    }\n    return _cachedBoundingBoxes!;\n  }\n\n  Rect? _cachedRect;\n  Rect get _rect {\n    if (_cachedRect == null) {\n      final List<TextBox> boxes = paragraph.getBoxesForSelection(\n        TextSelection(baseOffset: range.start, extentOffset: range.end),\n      );\n      if (boxes.isNotEmpty) {\n        Rect result = boxes.first.toRect();\n        for (int index = 1; index < boxes.length; index += 1) {\n          result = result.expandToInclude(boxes[index].toRect());\n        }\n        _cachedRect = result;\n      } else {\n        final Offset offset = paragraph._getOffsetForPosition(\n          TextPosition(offset: range.start),\n        );\n        _cachedRect = Rect.fromPoints(\n          offset,\n          offset.translate(0, -paragraph._textPainter.preferredLineHeight),\n        );\n      }\n    }\n    return _cachedRect!;\n  }\n\n  void didChangeParagraphLayout() {\n    _cachedRect = null;\n    _cachedBoundingBoxes = null;\n  }\n\n  @override\n  int get contentLength => range.end - range.start;\n\n  @override\n  Size get size {\n    return _rect.size;\n  }\n\n  void paint(PaintingContext context, Offset offset) {\n    if (_textSelectionStart == null || _textSelectionEnd == null) {\n      return;\n    }\n    if (paragraph.selectionColor != null) {\n      final TextSelection selection = TextSelection(\n        baseOffset: _textSelectionStart!.offset,\n        extentOffset: _textSelectionEnd!.offset,\n      );\n      final Paint selectionPaint = Paint()\n        ..style = PaintingStyle.fill\n        ..color = paragraph.selectionColor!;\n      for (final TextBox textBox in paragraph.getBoxesForSelection(selection)) {\n        context.canvas.drawRect(textBox.toRect().shift(offset), selectionPaint);\n      }\n    }\n    if (_startHandleLayerLink != null && value.startSelectionPoint != null) {\n      context.pushLayer(\n        LeaderLayer(\n          link: _startHandleLayerLink!,\n          offset: offset + value.startSelectionPoint!.localPosition,\n        ),\n        (PaintingContext context, Offset offset) {},\n        Offset.zero,\n      );\n    }\n    if (_endHandleLayerLink != null && value.endSelectionPoint != null) {\n      context.pushLayer(\n        LeaderLayer(\n          link: _endHandleLayerLink!,\n          offset: offset + value.endSelectionPoint!.localPosition,\n        ),\n        (PaintingContext context, Offset offset) {},\n        Offset.zero,\n      );\n    }\n  }\n\n  @override\n  TextSelection getLineAtOffset(TextPosition position) {\n    final TextRange line = paragraph._getLineAtOffset(position);\n    final int start = line.start.clamp(range.start, range.end);\n    final int end = line.end.clamp(range.start, range.end);\n    return TextSelection(baseOffset: start, extentOffset: end);\n  }\n\n  @override\n  TextPosition getTextPositionAbove(TextPosition position) {\n    return _clampTextPosition(paragraph._getTextPositionAbove(position));\n  }\n\n  @override\n  TextPosition getTextPositionBelow(TextPosition position) {\n    return _clampTextPosition(paragraph._getTextPositionBelow(position));\n  }\n\n  @override\n  TextRange getWordBoundary(TextPosition position) =>\n      paragraph.getWordBoundary(position);\n\n  @override\n  void debugFillProperties(DiagnosticPropertiesBuilder properties) {\n    super.debugFillProperties(properties);\n    properties\n      ..add(\n        DiagnosticsProperty<String>(\n          'textInsideRange',\n          range.textInside(fullText),\n        ),\n      )\n      ..add(DiagnosticsProperty<TextRange>('range', range))\n      ..add(DiagnosticsProperty<String>('fullText', fullText));\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/text/rich_text.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'dart:ui' as ui show TextHeightBehavior;\n\nimport 'package:PiliPlus/common/widgets/flutter/text/paragraph.dart';\nimport 'package:flutter/material.dart' hide RichText;\nimport 'package:flutter/rendering.dart' hide RenderParagraph;\n\n/// A paragraph of rich text.\n///\n/// {@youtube 560 315 https://www.youtube.com/watch?v=rykDVh-QFfw}\n///\n/// The [RichText] widget displays text that uses multiple different styles. The\n/// text to display is described using a tree of [TextSpan] objects, each of\n/// which has an associated style that is used for that subtree. The text might\n/// break across multiple lines or might all be displayed on the same line\n/// depending on the layout constraints.\n///\n/// Text displayed in a [RichText] widget must be explicitly styled. When\n/// picking which style to use, consider using [DefaultTextStyle.of] the current\n/// [BuildContext] to provide defaults. For more details on how to style text in\n/// a [RichText] widget, see the documentation for [TextStyle].\n///\n/// Consider using the [Text] widget to integrate with the [DefaultTextStyle]\n/// automatically. When all the text uses the same style, the default constructor\n/// is less verbose. The [Text.rich] constructor allows you to style multiple\n/// spans with the default text style while still allowing specified styles per\n/// span.\n///\n/// {@tool snippet}\n///\n/// This sample demonstrates how to mix and match text with different text\n/// styles using the [RichText] Widget. It displays the text \"Hello bold world,\"\n/// emphasizing the word \"bold\" using a bold font weight.\n///\n/// ![](https://flutter.github.io/assets-for-api-docs/assets/widgets/rich_text.png)\n///\n/// ```dart\n/// RichText(\n///   text: TextSpan(\n///     text: 'Hello ',\n///     style: DefaultTextStyle.of(context).style,\n///     children: const <TextSpan>[\n///       TextSpan(text: 'bold', style: TextStyle(fontWeight: FontWeight.bold)),\n///       TextSpan(text: ' world!'),\n///     ],\n///   ),\n/// )\n/// ```\n/// {@end-tool}\n///\n/// ## Selections\n///\n/// To make this [RichText] Selectable, the [RichText] needs to be in the\n/// subtree of a [SelectionArea] or [SelectableRegion] and a\n/// [SelectionRegistrar] needs to be assigned to the\n/// [RichText.selectionRegistrar]. One can use\n/// [SelectionContainer.maybeOf] to get the [SelectionRegistrar] from a\n/// context. This enables users to select the text in [RichText]s with mice or\n/// touch events.\n///\n/// The [selectionColor] also needs to be set if the selection is enabled to\n/// draw the selection highlights.\n///\n/// {@tool snippet}\n///\n/// This sample demonstrates how to assign a [SelectionRegistrar] for RichTexts\n/// in the SelectionArea subtree.\n///\n/// ![](https://flutter.github.io/assets-for-api-docs/assets/widgets/rich_text.png)\n///\n/// ```dart\n/// RichText(\n///   text: const TextSpan(text: 'Hello'),\n///   selectionRegistrar: SelectionContainer.maybeOf(context),\n///   selectionColor: const Color(0xAF6694e8),\n/// )\n/// ```\n/// {@end-tool}\n///\n/// See also:\n///\n///  * [TextStyle], which discusses how to style text.\n///  * [TextSpan], which is used to describe the text in a paragraph.\n///  * [Text], which automatically applies the ambient styles described by a\n///    [DefaultTextStyle] to a single string.\n///  * [Text.rich], a const text widget that provides similar functionality\n///    as [RichText]. [Text.rich] will inherit [TextStyle] from [DefaultTextStyle].\n///  * [SelectableRegion], which provides an overview of the selection system.\nclass RichText extends MultiChildRenderObjectWidget {\n  /// Creates a paragraph of rich text.\n  ///\n  /// The [maxLines] property may be null (and indeed defaults to null), but if\n  /// it is not null, it must be greater than zero.\n  ///\n  /// The [textDirection], if null, defaults to the ambient [Directionality],\n  /// which in that case must not be null.\n  RichText({\n    super.key,\n    required this.text,\n    this.textAlign = TextAlign.start,\n    this.textDirection,\n    this.softWrap = true,\n    this.overflow = TextOverflow.clip,\n    @Deprecated(\n      'Use textScaler instead. '\n      'Use of textScaleFactor was deprecated in preparation for the upcoming nonlinear text scaling support. '\n      'This feature was deprecated after v3.12.0-2.0.pre.',\n    )\n    double textScaleFactor = 1.0,\n    TextScaler textScaler = TextScaler.noScaling,\n    this.maxLines,\n    this.locale,\n    this.strutStyle,\n    this.textWidthBasis = TextWidthBasis.parent,\n    this.textHeightBehavior,\n    this.selectionRegistrar,\n    this.selectionColor,\n    required this.primary,\n    this.onShowMore,\n  }) : assert(maxLines == null || maxLines > 0),\n       assert(selectionRegistrar == null || selectionColor != null),\n       assert(\n         textScaleFactor == 1.0 || identical(textScaler, TextScaler.noScaling),\n         'Use textScaler instead.',\n       ),\n       textScaler = _effectiveTextScalerFrom(textScaler, textScaleFactor),\n       super(\n         children: WidgetSpan.extractFromInlineSpan(\n           text,\n           _effectiveTextScalerFrom(textScaler, textScaleFactor),\n         ),\n       );\n\n  static TextScaler _effectiveTextScalerFrom(\n    TextScaler textScaler,\n    double textScaleFactor,\n  ) {\n    return switch ((textScaler, textScaleFactor)) {\n      (final TextScaler scaler, 1.0) => scaler,\n      (TextScaler.noScaling, final double textScaleFactor) => TextScaler.linear(\n        textScaleFactor,\n      ),\n      (final TextScaler scaler, _) => scaler,\n    };\n  }\n\n  /// The text to display in this widget.\n  final InlineSpan text;\n\n  /// How the text should be aligned horizontally.\n  final TextAlign textAlign;\n\n  /// The directionality of the text.\n  ///\n  /// This decides how [textAlign] values like [TextAlign.start] and\n  /// [TextAlign.end] are interpreted.\n  ///\n  /// This is also used to disambiguate how to render bidirectional text. For\n  /// example, if the [text] is an English phrase followed by a Hebrew phrase,\n  /// in a [TextDirection.ltr] context the English phrase will be on the left\n  /// and the Hebrew phrase to its right, while in a [TextDirection.rtl]\n  /// context, the English phrase will be on the right and the Hebrew phrase on\n  /// its left.\n  ///\n  /// Defaults to the ambient [Directionality], if any. If there is no ambient\n  /// [Directionality], then this must not be null.\n  final TextDirection? textDirection;\n\n  /// Whether the text should break at soft line breaks.\n  ///\n  /// If false, the glyphs in the text will be positioned as if there was unlimited horizontal space.\n  final bool softWrap;\n\n  /// How visual overflow should be handled.\n  final TextOverflow overflow;\n\n  /// Deprecated. Will be removed in a future version of Flutter. Use\n  /// [textScaler] instead.\n  ///\n  /// The number of font pixels for each logical pixel.\n  ///\n  /// For example, if the text scale factor is 1.5, text will be 50% larger than\n  /// the specified font size.\n  @Deprecated(\n    'Use textScaler instead. '\n    'Use of textScaleFactor was deprecated in preparation for the upcoming nonlinear text scaling support. '\n    'This feature was deprecated after v3.12.0-2.0.pre.',\n  )\n  double get textScaleFactor => textScaler.textScaleFactor;\n\n  /// {@macro flutter.painting.textPainter.textScaler}\n  final TextScaler textScaler;\n\n  /// An optional maximum number of lines for the text to span, wrapping if necessary.\n  /// If the text exceeds the given number of lines, it will be truncated according\n  /// to [overflow].\n  ///\n  /// If this is 1, text will not wrap. Otherwise, text will be wrapped at the\n  /// edge of the box.\n  final int? maxLines;\n\n  /// Used to select a font when the same Unicode character can\n  /// be rendered differently, depending on the locale.\n  ///\n  /// It's rarely necessary to set this property. By default its value\n  /// is inherited from the enclosing app with `Localizations.localeOf(context)`.\n  ///\n  /// See [RenderParagraph.locale] for more information.\n  final Locale? locale;\n\n  /// {@macro flutter.painting.textPainter.strutStyle}\n  final StrutStyle? strutStyle;\n\n  /// {@macro flutter.painting.textPainter.textWidthBasis}\n  final TextWidthBasis textWidthBasis;\n\n  /// {@macro dart.ui.textHeightBehavior}\n  final ui.TextHeightBehavior? textHeightBehavior;\n\n  /// The [SelectionRegistrar] this rich text is subscribed to.\n  ///\n  /// If this is set, [selectionColor] must be non-null.\n  final SelectionRegistrar? selectionRegistrar;\n\n  /// The color to use when painting the selection.\n  ///\n  /// This is ignored if [selectionRegistrar] is null.\n  ///\n  /// See the section on selections in the [RichText] top-level API\n  /// documentation for more details on enabling selection in [RichText]\n  /// widgets.\n  final Color? selectionColor;\n\n  final Color primary;\n\n  final VoidCallback? onShowMore;\n\n  @override\n  RenderParagraph createRenderObject(BuildContext context) {\n    assert(textDirection != null || debugCheckHasDirectionality(context));\n    return RenderParagraph(\n      text,\n      textAlign: textAlign,\n      textDirection: textDirection ?? Directionality.of(context),\n      softWrap: softWrap,\n      overflow: overflow,\n      textScaler: textScaler,\n      maxLines: maxLines,\n      strutStyle: strutStyle,\n      textWidthBasis: textWidthBasis,\n      textHeightBehavior: textHeightBehavior,\n      locale: locale ?? Localizations.maybeLocaleOf(context),\n      registrar: selectionRegistrar,\n      selectionColor: selectionColor,\n      primary: primary,\n      onShowMore: onShowMore,\n    );\n  }\n\n  @override\n  void updateRenderObject(BuildContext context, RenderParagraph renderObject) {\n    assert(textDirection != null || debugCheckHasDirectionality(context));\n    renderObject\n      ..text = (text: text, primary: primary)\n      ..textAlign = textAlign\n      ..textDirection = textDirection ?? Directionality.of(context)\n      ..softWrap = softWrap\n      ..overflow = overflow\n      ..textScaler = textScaler\n      ..maxLines = maxLines\n      ..strutStyle = strutStyle\n      ..textWidthBasis = textWidthBasis\n      ..textHeightBehavior = textHeightBehavior\n      ..locale = locale ?? Localizations.maybeLocaleOf(context)\n      ..registrar = selectionRegistrar\n      ..selectionColor = selectionColor\n      ..onShowMore = onShowMore;\n  }\n\n  @override\n  void debugFillProperties(DiagnosticPropertiesBuilder properties) {\n    super.debugFillProperties(properties);\n    properties\n      ..add(\n        EnumProperty<TextAlign>(\n          'textAlign',\n          textAlign,\n          defaultValue: TextAlign.start,\n        ),\n      )\n      ..add(\n        EnumProperty<TextDirection>(\n          'textDirection',\n          textDirection,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        FlagProperty(\n          'softWrap',\n          value: softWrap,\n          ifTrue: 'wrapping at box width',\n          ifFalse: 'no wrapping except at line break characters',\n          showName: true,\n        ),\n      )\n      ..add(\n        EnumProperty<TextOverflow>(\n          'overflow',\n          overflow,\n          defaultValue: TextOverflow.clip,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<TextScaler>(\n          'textScaler',\n          textScaler,\n          defaultValue: TextScaler.noScaling,\n        ),\n      )\n      ..add(IntProperty('maxLines', maxLines, ifNull: 'unlimited'))\n      ..add(\n        EnumProperty<TextWidthBasis>(\n          'textWidthBasis',\n          textWidthBasis,\n          defaultValue: TextWidthBasis.parent,\n        ),\n      )\n      ..add(StringProperty('text', text.toPlainText()))\n      ..add(\n        DiagnosticsProperty<Locale>('locale', locale, defaultValue: null),\n      )\n      ..add(\n        DiagnosticsProperty<StrutStyle>(\n          'strutStyle',\n          strutStyle,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<TextHeightBehavior>(\n          'textHeightBehavior',\n          textHeightBehavior,\n          defaultValue: null,\n        ),\n      );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/text/text.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// ignore_for_file: uri_does_not_exist_in_doc_import\n\n/// @docImport 'package:flutter/gestures.dart';\n/// @docImport 'package:flutter/material.dart';\n///\n/// @docImport 'editable_text.dart';\n/// @docImport 'gesture_detector.dart';\n/// @docImport 'implicit_animations.dart';\n/// @docImport 'transitions.dart';\n/// @docImport 'widget_span.dart';\nlibrary;\n\nimport 'dart:math';\nimport 'dart:ui' as ui show TextHeightBehavior;\n\nimport 'package:PiliPlus/common/widgets/flutter/text/paragraph.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text/rich_text.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart' hide Text, RichText;\nimport 'package:flutter/rendering.dart' hide RenderParagraph;\n\n/// A run of text with a single style.\n///\n/// The [Text] widget displays a string of text with single style. The string\n/// might break across multiple lines or might all be displayed on the same line\n/// depending on the layout constraints.\n///\n/// The [style] argument is optional. When omitted, the text will use the style\n/// from the closest enclosing [DefaultTextStyle]. If the given style's\n/// [TextStyle.inherit] property is true (the default), the given style will\n/// be merged with the closest enclosing [DefaultTextStyle]. This merging\n/// behavior is useful, for example, to make the text bold while using the\n/// default font family and size.\n///\n/// {@tool snippet}\n///\n/// This example shows how to display text using the [Text] widget with the\n/// [overflow] set to [TextOverflow.ellipsis].\n///\n/// ![If the text overflows, the Text widget displays an ellipsis to trim the overflowing text](https://flutter.github.io/assets-for-api-docs/assets/widgets/text_ellipsis.png)\n///\n/// ```dart\n/// Container(\n///   width: 100,\n///   decoration: BoxDecoration(border: Border.all()),\n///   child: const Text(\n///     'Hello, how are you?',\n///     overflow: TextOverflow.ellipsis,\n///   ),\n/// )\n/// ```\n/// {@end-tool}\n///\n/// {@tool snippet}\n///\n/// Setting [maxLines] to `1` is not equivalent to disabling soft wrapping with\n/// [softWrap]. This is apparent when using [TextOverflow.fade] as the following\n/// examples show.\n///\n/// ![If a second line overflows the Text widget displays a horizontal fade](https://flutter.github.io/assets-for-api-docs/assets/widgets/text_fade_max_lines.png)\n///\n/// ```dart\n/// const Text(\n///   'Hello, how are you?',\n///   overflow: TextOverflow.fade,\n///   maxLines: 1,\n/// )\n/// ```\n///\n/// Here soft wrapping is enabled and the [Text] widget tries to wrap the words\n/// \"how are you?\" to a second line. This is prevented by the [maxLines] value\n/// of `1`. The result is that a second line overflows and the fade appears in a\n/// horizontal direction at the bottom.\n///\n/// ![If a single line overflows the Text widget displays a horizontal fade](https://flutter.github.io/assets-for-api-docs/assets/widgets/text_fade_soft_wrap.png)\n///\n/// ```dart\n/// const Text(\n///   'Hello, how are you?',\n///   overflow: TextOverflow.fade,\n///   softWrap: false,\n/// )\n/// ```\n///\n/// Here soft wrapping is disabled with `softWrap: false` and the [Text] widget\n/// attempts to display its text in a single unbroken line. The result is that\n/// the single line overflows and the fade appears in a vertical direction at\n/// the right.\n///\n/// {@end-tool}\n///\n/// Using the [Text.rich] constructor, the [Text] widget can\n/// display a paragraph with differently styled [TextSpan]s. The sample\n/// that follows displays \"Hello beautiful world\" with different styles\n/// for each word.\n///\n/// {@tool snippet}\n///\n/// ![The word \"Hello\" is shown with the default text styles. The word \"beautiful\" is italicized. The word \"world\" is bold.](https://flutter.github.io/assets-for-api-docs/assets/widgets/text_rich.png)\n///\n/// ```dart\n/// const Text.rich(\n///   TextSpan(\n///     text: 'Hello', // default text style\n///     children: <TextSpan>[\n///       TextSpan(text: ' beautiful ', style: TextStyle(fontStyle: FontStyle.italic)),\n///       TextSpan(text: 'world', style: TextStyle(fontWeight: FontWeight.bold)),\n///     ],\n///   ),\n/// )\n/// ```\n/// {@end-tool}\n///\n/// ## Interactivity\n///\n/// To make [Text] react to touch events, wrap it in a [GestureDetector] widget\n/// with a [GestureDetector.onTap] handler.\n///\n/// In a Material Design application, consider using a [TextButton] instead, or\n/// if that isn't appropriate, at least using an [InkWell] instead of\n/// [GestureDetector].\n///\n/// To make sections of the text interactive, use [RichText] and specify a\n/// [TapGestureRecognizer] as the [TextSpan.recognizer] of the relevant part of\n/// the text.\n///\n/// ## Selection\n///\n/// [Text] is not selectable by default. To make a [Text] selectable, one can\n/// wrap a subtree with a [SelectionArea] widget. To exclude a part of a subtree\n/// under [SelectionArea] from selection, once can also wrap that part of the\n/// subtree with [SelectionContainer.disabled].\n///\n/// {@tool dartpad}\n/// This sample demonstrates how to disable selection for a Text under a\n/// SelectionArea.\n///\n/// ** See code in examples/api/lib/material/selection_container/selection_container_disabled.0.dart **\n/// {@end-tool}\n///\n/// See also:\n///\n///  * [RichText], which gives you more control over the text styles.\n///  * [DefaultTextStyle], which sets default styles for [Text] widgets.\n///  * [SelectableRegion], which provides an overview of the selection system.\nclass Text extends StatelessWidget {\n  /// Creates a text widget.\n  ///\n  /// If the [style] argument is null, the text will use the style from the\n  /// closest enclosing [DefaultTextStyle].\n  ///\n  /// The [overflow] property's behavior is affected by the [softWrap] argument.\n  /// If the [softWrap] is true or null, the glyph causing overflow, and those\n  /// that follow, will not be rendered. Otherwise, it will be shown with the\n  /// given overflow option.\n  const Text(\n    String this.data, {\n    super.key,\n    this.style,\n    this.strutStyle,\n    this.textAlign,\n    this.textDirection,\n    this.locale,\n    this.softWrap,\n    this.overflow,\n    @Deprecated(\n      'Use textScaler instead. '\n      'Use of textScaleFactor was deprecated in preparation for the upcoming nonlinear text scaling support. '\n      'This feature was deprecated after v3.12.0-2.0.pre.',\n    )\n    this.textScaleFactor,\n    this.textScaler,\n    this.maxLines,\n    this.semanticsLabel,\n    this.semanticsIdentifier,\n    this.textWidthBasis,\n    this.textHeightBehavior,\n    this.selectionColor,\n    required this.primary,\n    this.onShowMore,\n  }) : textSpan = null,\n       assert(\n         textScaler == null || textScaleFactor == null,\n         'textScaleFactor is deprecated and cannot be specified when textScaler is specified.',\n       );\n\n  /// Creates a text widget with a [InlineSpan].\n  ///\n  /// The following subclasses of [InlineSpan] may be used to build rich text:\n  ///\n  /// * [TextSpan]s define text and children [InlineSpan]s.\n  /// * [WidgetSpan]s define embedded inline widgets.\n  ///\n  /// See [RichText] which provides a lower-level way to draw text.\n  const Text.rich(\n    InlineSpan this.textSpan, {\n    super.key,\n    this.style,\n    this.strutStyle,\n    this.textAlign,\n    this.textDirection,\n    this.locale,\n    this.softWrap,\n    this.overflow,\n    @Deprecated(\n      'Use textScaler instead. '\n      'Use of textScaleFactor was deprecated in preparation for the upcoming nonlinear text scaling support. '\n      'This feature was deprecated after v3.12.0-2.0.pre.',\n    )\n    this.textScaleFactor,\n    this.textScaler,\n    this.maxLines,\n    this.semanticsLabel,\n    this.semanticsIdentifier,\n    this.textWidthBasis,\n    this.textHeightBehavior,\n    this.selectionColor,\n    required this.primary,\n    this.onShowMore,\n  }) : data = null,\n       assert(\n         textScaler == null || textScaleFactor == null,\n         'textScaleFactor is deprecated and cannot be specified when textScaler is specified.',\n       );\n\n  /// The text to display.\n  ///\n  /// This will be null if a [textSpan] is provided instead.\n  final String? data;\n\n  /// The text to display as a [InlineSpan].\n  ///\n  /// This will be null if [data] is provided instead.\n  final InlineSpan? textSpan;\n\n  /// If non-null, the style to use for this text.\n  ///\n  /// If the style's \"inherit\" property is true, the style will be merged with\n  /// the closest enclosing [DefaultTextStyle]. Otherwise, the style will\n  /// replace the closest enclosing [DefaultTextStyle].\n  ///\n  /// The user or platform may override this [style]'s [TextStyle.fontWeight],\n  /// [TextStyle.height], [TextStyle.letterSpacing], and [TextStyle.wordSpacing]\n  /// via a [MediaQuery] ancestor's [MediaQueryData.boldText],\n  /// [MediaQueryData.lineHeightScaleFactorOverride],\n  /// [MediaQueryData.letterSpacingOverride], and [MediaQueryData.wordSpacingOverride]\n  /// regardless of its [TextStyle.inherit] value.\n  final TextStyle? style;\n\n  /// {@macro flutter.painting.textPainter.strutStyle}\n  ///\n  /// The user or platform may override this [strutStyle]'s [StrutStyle.height]\n  /// via a [MediaQuery] ancestor's [MediaQueryData.lineHeightScaleFactorOverride].\n  final StrutStyle? strutStyle;\n\n  /// How the text should be aligned horizontally.\n  final TextAlign? textAlign;\n\n  /// The directionality of the text.\n  ///\n  /// This decides how [textAlign] values like [TextAlign.start] and\n  /// [TextAlign.end] are interpreted.\n  ///\n  /// This is also used to disambiguate how to render bidirectional text. For\n  /// example, if the [data] is an English phrase followed by a Hebrew phrase,\n  /// in a [TextDirection.ltr] context the English phrase will be on the left\n  /// and the Hebrew phrase to its right, while in a [TextDirection.rtl]\n  /// context, the English phrase will be on the right and the Hebrew phrase on\n  /// its left.\n  ///\n  /// Defaults to the ambient [Directionality], if any.\n  final TextDirection? textDirection;\n\n  /// Used to select a font when the same Unicode character can\n  /// be rendered differently, depending on the locale.\n  ///\n  /// It's rarely necessary to set this property. By default its value\n  /// is inherited from the enclosing app with `Localizations.localeOf(context)`.\n  ///\n  /// See [RenderParagraph.locale] for more information.\n  final Locale? locale;\n\n  /// Whether the text should break at soft line breaks.\n  ///\n  /// If false, the glyphs in the text will be positioned as if there was unlimited horizontal space.\n  final bool? softWrap;\n\n  /// How visual overflow should be handled.\n  ///\n  /// If this is null [TextStyle.overflow] will be used, otherwise the value\n  /// from the nearest [DefaultTextStyle] ancestor will be used.\n  final TextOverflow? overflow;\n\n  /// Deprecated. Will be removed in a future version of Flutter. Use\n  /// [textScaler] instead.\n  ///\n  /// The number of font pixels for each logical pixel.\n  ///\n  /// For example, if the text scale factor is 1.5, text will be 50% larger than\n  /// the specified font size.\n  ///\n  /// The value given to the constructor as textScaleFactor. If null, will\n  /// use the [MediaQueryData.textScaleFactor] obtained from the ambient\n  /// [MediaQuery], or 1.0 if there is no [MediaQuery] in scope.\n  @Deprecated(\n    'Use textScaler instead. '\n    'Use of textScaleFactor was deprecated in preparation for the upcoming nonlinear text scaling support. '\n    'This feature was deprecated after v3.12.0-2.0.pre.',\n  )\n  final double? textScaleFactor;\n\n  /// {@macro flutter.painting.textPainter.textScaler}\n  final TextScaler? textScaler;\n\n  /// An optional maximum number of lines for the text to span, wrapping if necessary.\n  /// If the text exceeds the given number of lines, it will be truncated according\n  /// to [overflow].\n  ///\n  /// If this is 1, text will not wrap. Otherwise, text will be wrapped at the\n  /// edge of the box.\n  ///\n  /// If this is null, but there is an ambient [DefaultTextStyle] that specifies\n  /// an explicit number for its [DefaultTextStyle.maxLines], then the\n  /// [DefaultTextStyle] value will take precedence. You can use a [RichText]\n  /// widget directly to entirely override the [DefaultTextStyle].\n  final int? maxLines;\n\n  /// {@template flutter.widgets.Text.semanticsLabel}\n  /// An alternative semantics label for this text.\n  ///\n  /// If present, the semantics of this widget will contain this value instead\n  /// of the actual text. This will overwrite any of the semantics labels applied\n  /// directly to the [TextSpan]s.\n  ///\n  /// This is useful for replacing abbreviations or shorthands with the full\n  /// text value:\n  ///\n  /// ```dart\n  /// const Text(r'$$', semanticsLabel: 'Double dollars')\n  /// ```\n  /// {@endtemplate}\n  final String? semanticsLabel;\n\n  /// A unique identifier for the semantics node for this widget.\n  ///\n  /// This is useful for cases where the text widget needs to have a uniquely\n  /// identifiable ID that is recognized through the automation tools without\n  /// having a dependency on the actual content of the text that can possibly be\n  /// dynamic in nature.\n  final String? semanticsIdentifier;\n\n  /// {@macro flutter.painting.textPainter.textWidthBasis}\n  final TextWidthBasis? textWidthBasis;\n\n  /// {@macro dart.ui.textHeightBehavior}\n  final ui.TextHeightBehavior? textHeightBehavior;\n\n  /// The color to use when painting the selection.\n  ///\n  /// This is ignored if [SelectionContainer.maybeOf] returns null\n  /// in the [BuildContext] of the [Text] widget.\n  ///\n  /// If null, the ambient [DefaultSelectionStyle] is used (if any); failing\n  /// that, the selection color defaults to [DefaultSelectionStyle.defaultColor]\n  /// (semi-transparent grey).\n  final Color? selectionColor;\n\n  final Color primary;\n\n  final VoidCallback? onShowMore;\n\n  @override\n  Widget build(BuildContext context) {\n    final DefaultTextStyle defaultTextStyle = DefaultTextStyle.of(context);\n    TextStyle? effectiveTextStyle = style;\n    if (style == null || style!.inherit) {\n      effectiveTextStyle = defaultTextStyle.style.merge(style);\n    }\n    if (MediaQuery.boldTextOf(context)) {\n      effectiveTextStyle = effectiveTextStyle!.merge(\n        const TextStyle(fontWeight: FontWeight.bold),\n      );\n    }\n    // TODO(Renzo-Olivares): Investigate ways the framework can automatically\n    // apply MediaQueryData.paragraphSpacingOverride to its own text components.\n    // See: https://github.com/flutter/flutter/issues/177953 and https://github.com/flutter/flutter/issues/177408.\n    final double? lineHeightScaleFactor =\n        MediaQuery.maybeLineHeightScaleFactorOverrideOf(context);\n    final double? letterSpacing = MediaQuery.maybeLetterSpacingOverrideOf(\n      context,\n    );\n    final double? wordSpacing = MediaQuery.maybeWordSpacingOverrideOf(context);\n    final TextSpan effectiveTextSpan =\n        _OverridingTextStyleTextSpanUtils.applyTextSpacingOverrides(\n          lineHeightScaleFactor: lineHeightScaleFactor,\n          letterSpacing: letterSpacing,\n          wordSpacing: wordSpacing,\n          textSpan: TextSpan(\n            style: effectiveTextStyle,\n            text: data,\n            locale: locale,\n            children: textSpan != null ? <InlineSpan>[textSpan!] : null,\n          ),\n        );\n    final StrutStyle? effectiveStrutStyle = strutStyle?.merge(\n      StrutStyle(height: lineHeightScaleFactor),\n    );\n    final SelectionRegistrar? registrar = SelectionContainer.maybeOf(context);\n    final TextScaler textScaler = switch ((this.textScaler, textScaleFactor)) {\n      (final TextScaler textScaler, _) => textScaler,\n      // For unmigrated apps, fall back to textScaleFactor.\n      (null, final double textScaleFactor) => TextScaler.linear(\n        textScaleFactor,\n      ),\n      (null, null) => MediaQuery.textScalerOf(context),\n    };\n    late Widget result;\n    if (registrar != null) {\n      result = MouseRegion(\n        cursor:\n            DefaultSelectionStyle.of(context).mouseCursor ??\n            SystemMouseCursors.text,\n        child: _SelectableTextContainer(\n          textAlign: textAlign ?? defaultTextStyle.textAlign ?? TextAlign.start,\n          textDirection:\n              textDirection, // RichText uses Directionality.of to obtain a default if this is null.\n          locale:\n              locale, // RichText uses Localizations.localeOf to obtain a default if this is null\n          softWrap: softWrap ?? defaultTextStyle.softWrap,\n          overflow:\n              overflow ??\n              effectiveTextStyle?.overflow ??\n              defaultTextStyle.overflow,\n          textScaler: textScaler,\n          maxLines: maxLines ?? defaultTextStyle.maxLines,\n          strutStyle: effectiveStrutStyle,\n          textWidthBasis: textWidthBasis ?? defaultTextStyle.textWidthBasis,\n          textHeightBehavior:\n              textHeightBehavior ??\n              defaultTextStyle.textHeightBehavior ??\n              DefaultTextHeightBehavior.maybeOf(context),\n          selectionColor:\n              selectionColor ??\n              DefaultSelectionStyle.of(context).selectionColor ??\n              DefaultSelectionStyle.defaultColor,\n          text: effectiveTextSpan,\n          primary: primary,\n        ),\n      );\n    } else {\n      result = RichText(\n        textAlign: textAlign ?? defaultTextStyle.textAlign ?? TextAlign.start,\n        textDirection:\n            textDirection, // RichText uses Directionality.of to obtain a default if this is null.\n        locale:\n            locale, // RichText uses Localizations.localeOf to obtain a default if this is null\n        softWrap: softWrap ?? defaultTextStyle.softWrap,\n        overflow:\n            overflow ??\n            effectiveTextStyle?.overflow ??\n            defaultTextStyle.overflow,\n        textScaler: textScaler,\n        maxLines: maxLines ?? defaultTextStyle.maxLines,\n        strutStyle: effectiveStrutStyle,\n        textWidthBasis: textWidthBasis ?? defaultTextStyle.textWidthBasis,\n        textHeightBehavior:\n            textHeightBehavior ??\n            defaultTextStyle.textHeightBehavior ??\n            DefaultTextHeightBehavior.maybeOf(context),\n        selectionColor:\n            selectionColor ??\n            DefaultSelectionStyle.of(context).selectionColor ??\n            DefaultSelectionStyle.defaultColor,\n        text: effectiveTextSpan,\n        primary: primary,\n        onShowMore: onShowMore,\n      );\n    }\n    if (semanticsLabel != null || semanticsIdentifier != null) {\n      result = Semantics(\n        textDirection: textDirection,\n        label: semanticsLabel,\n        identifier: semanticsIdentifier,\n        child: ExcludeSemantics(\n          excluding: semanticsLabel != null,\n          child: result,\n        ),\n      );\n    }\n    return result;\n  }\n\n  @override\n  void debugFillProperties(DiagnosticPropertiesBuilder properties) {\n    super.debugFillProperties(properties);\n    properties.add(StringProperty('data', data, showName: false));\n    if (textSpan != null) {\n      properties.add(\n        textSpan!.toDiagnosticsNode(\n          name: 'textSpan',\n          style: DiagnosticsTreeStyle.transition,\n        ),\n      );\n    }\n    style?.debugFillProperties(properties);\n    properties\n      ..add(\n        EnumProperty<TextAlign>('textAlign', textAlign, defaultValue: null),\n      )\n      ..add(\n        EnumProperty<TextDirection>(\n          'textDirection',\n          textDirection,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<Locale>('locale', locale, defaultValue: null),\n      )\n      ..add(\n        FlagProperty(\n          'softWrap',\n          value: softWrap,\n          ifTrue: 'wrapping at box width',\n          ifFalse: 'no wrapping except at line break characters',\n          showName: true,\n        ),\n      )\n      ..add(\n        EnumProperty<TextOverflow>('overflow', overflow, defaultValue: null),\n      )\n      ..add(\n        DoubleProperty('textScaleFactor', textScaleFactor, defaultValue: null),\n      )\n      ..add(IntProperty('maxLines', maxLines, defaultValue: null))\n      ..add(\n        EnumProperty<TextWidthBasis>(\n          'textWidthBasis',\n          textWidthBasis,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<ui.TextHeightBehavior>(\n          'textHeightBehavior',\n          textHeightBehavior,\n          defaultValue: null,\n        ),\n      );\n    if (semanticsLabel != null) {\n      properties.add(StringProperty('semanticsLabel', semanticsLabel));\n    }\n    if (semanticsIdentifier != null) {\n      properties.add(\n        StringProperty('semanticsIdentifier', semanticsIdentifier),\n      );\n    }\n  }\n}\n\nclass _SelectableTextContainer extends StatefulWidget {\n  const _SelectableTextContainer({\n    required this.text,\n    required this.textAlign,\n    this.textDirection,\n    required this.softWrap,\n    required this.overflow,\n    required this.textScaler,\n    this.maxLines,\n    this.locale,\n    this.strutStyle,\n    required this.textWidthBasis,\n    this.textHeightBehavior,\n    required this.selectionColor,\n    required this.primary,\n  });\n\n  final TextSpan text;\n  final TextAlign textAlign;\n  final TextDirection? textDirection;\n  final bool softWrap;\n  final TextOverflow overflow;\n  final TextScaler textScaler;\n  final int? maxLines;\n  final Locale? locale;\n  final StrutStyle? strutStyle;\n  final TextWidthBasis textWidthBasis;\n  final ui.TextHeightBehavior? textHeightBehavior;\n  final Color selectionColor;\n  final Color primary;\n\n  @override\n  State<_SelectableTextContainer> createState() =>\n      _SelectableTextContainerState();\n}\n\nclass _SelectableTextContainerState extends State<_SelectableTextContainer> {\n  late final _SelectableTextContainerDelegate _selectionDelegate;\n  final GlobalKey _textKey = GlobalKey();\n\n  @override\n  void initState() {\n    super.initState();\n    _selectionDelegate = _SelectableTextContainerDelegate(_textKey);\n  }\n\n  @override\n  void dispose() {\n    _selectionDelegate.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return SelectionContainer(\n      delegate: _selectionDelegate,\n      // Use [_RichText] wrapper so the underlying [RenderParagraph] can register\n      // its [Selectable]s to the [SelectionContainer] created by this widget.\n      child: _RichText(\n        textKey: _textKey,\n        textAlign: widget.textAlign,\n        textDirection: widget.textDirection,\n        locale: widget.locale,\n        softWrap: widget.softWrap,\n        overflow: widget.overflow,\n        textScaler: widget.textScaler,\n        maxLines: widget.maxLines,\n        strutStyle: widget.strutStyle,\n        textWidthBasis: widget.textWidthBasis,\n        textHeightBehavior: widget.textHeightBehavior,\n        selectionColor: widget.selectionColor,\n        text: widget.text,\n        primary: widget.primary,\n      ),\n    );\n  }\n}\n\nclass _RichText extends StatelessWidget {\n  const _RichText({\n    this.textKey,\n    required this.text,\n    required this.textAlign,\n    this.textDirection,\n    required this.softWrap,\n    required this.overflow,\n    required this.textScaler,\n    this.maxLines,\n    this.locale,\n    this.strutStyle,\n    required this.textWidthBasis,\n    this.textHeightBehavior,\n    required this.selectionColor,\n    required this.primary,\n  });\n\n  final GlobalKey? textKey;\n  final InlineSpan text;\n  final TextAlign textAlign;\n  final TextDirection? textDirection;\n  final bool softWrap;\n  final TextOverflow overflow;\n  final TextScaler textScaler;\n  final int? maxLines;\n  final Locale? locale;\n  final StrutStyle? strutStyle;\n  final TextWidthBasis textWidthBasis;\n  final ui.TextHeightBehavior? textHeightBehavior;\n  final Color selectionColor;\n  final Color primary;\n\n  @override\n  Widget build(BuildContext context) {\n    final SelectionRegistrar? registrar = SelectionContainer.maybeOf(context);\n    return RichText(\n      key: textKey,\n      textAlign: textAlign,\n      textDirection: textDirection,\n      locale: locale,\n      softWrap: softWrap,\n      overflow: overflow,\n      textScaler: textScaler,\n      maxLines: maxLines,\n      strutStyle: strutStyle,\n      textWidthBasis: textWidthBasis,\n      textHeightBehavior: textHeightBehavior,\n      selectionRegistrar: registrar,\n      selectionColor: selectionColor,\n      text: text,\n      primary: primary,\n    );\n  }\n}\n\n// In practice some selectables like widgetspan shift several pixels. So when\n// the vertical position diff is within the threshold, compare the horizontal\n// position to make the compareScreenOrder function more robust.\nconst double _kSelectableVerticalComparingThreshold = 3.0;\n\nclass _SelectableTextContainerDelegate\n    extends StaticSelectionContainerDelegate {\n  _SelectableTextContainerDelegate(GlobalKey textKey) : _textKey = textKey;\n\n  final GlobalKey _textKey;\n  RenderParagraph get paragraph =>\n      _textKey.currentContext!.findRenderObject()! as RenderParagraph;\n\n  @override\n  SelectionResult handleSelectParagraph(SelectParagraphSelectionEvent event) {\n    final SelectionResult result = _handleSelectParagraph(event);\n    super.didReceiveSelectionBoundaryEvents();\n    return result;\n  }\n\n  SelectionResult _handleSelectParagraph(SelectParagraphSelectionEvent event) {\n    if (event.absorb) {\n      for (var index = 0; index < selectables.length; index += 1) {\n        dispatchSelectionEventToChild(selectables[index], event);\n      }\n      currentSelectionStartIndex = 0;\n      currentSelectionEndIndex = selectables.length - 1;\n      return SelectionResult.next;\n    }\n\n    // First pass, if the position is on a placeholder then dispatch the selection\n    // event to the [Selectable] at the location and terminate.\n    for (var index = 0; index < selectables.length; index += 1) {\n      final bool selectableIsPlaceholder = !paragraph\n          .selectableBelongsToParagraph(selectables[index]);\n      if (selectableIsPlaceholder &&\n          selectables[index].boundingBoxes.isNotEmpty) {\n        for (final Rect rect in selectables[index].boundingBoxes) {\n          final Rect globalRect = MatrixUtils.transformRect(\n            selectables[index].getTransformTo(null),\n            rect,\n          );\n          if (globalRect.contains(event.globalPosition)) {\n            currentSelectionStartIndex = currentSelectionEndIndex = index;\n            return dispatchSelectionEventToChild(selectables[index], event);\n          }\n        }\n      }\n    }\n\n    SelectionResult? lastSelectionResult;\n    var foundStart = false;\n    int? lastNextIndex;\n    for (var index = 0; index < selectables.length; index += 1) {\n      if (!paragraph.selectableBelongsToParagraph(selectables[index])) {\n        if (foundStart) {\n          final SelectionEvent synthesizedEvent = SelectParagraphSelectionEvent(\n            globalPosition: event.globalPosition,\n            absorb: true,\n          );\n          final SelectionResult result = dispatchSelectionEventToChild(\n            selectables[index],\n            synthesizedEvent,\n          );\n          if (selectables.length - 1 == index) {\n            currentSelectionEndIndex = index;\n            _flushInactiveSelections();\n            return result;\n          }\n        }\n        continue;\n      }\n      final SelectionGeometry existingGeometry = selectables[index].value;\n      lastSelectionResult = dispatchSelectionEventToChild(\n        selectables[index],\n        event,\n      );\n      if (index == selectables.length - 1 &&\n          lastSelectionResult == SelectionResult.next) {\n        if (foundStart) {\n          currentSelectionEndIndex = index;\n        } else {\n          currentSelectionStartIndex = currentSelectionEndIndex = index;\n        }\n        return SelectionResult.next;\n      }\n      if (lastSelectionResult == SelectionResult.next) {\n        if (selectables[index].value == existingGeometry && !foundStart) {\n          lastNextIndex = index;\n        }\n        if (selectables[index].value != existingGeometry && !foundStart) {\n          assert(selectables[index].boundingBoxes.isNotEmpty);\n          assert(selectables[index].value.selectionRects.isNotEmpty);\n          final bool selectionAtStartOfSelectable = selectables[index]\n              .boundingBoxes[0]\n              .overlaps(\n                selectables[index].value.selectionRects[0],\n              );\n          var startIndex = 0;\n          if (lastNextIndex != null && selectionAtStartOfSelectable) {\n            startIndex = lastNextIndex + 1;\n          } else {\n            startIndex = lastNextIndex == null && selectionAtStartOfSelectable\n                ? 0\n                : index;\n          }\n          for (var i = startIndex; i < index; i += 1) {\n            final SelectionEvent synthesizedEvent =\n                SelectParagraphSelectionEvent(\n                  globalPosition: event.globalPosition,\n                  absorb: true,\n                );\n            dispatchSelectionEventToChild(selectables[i], synthesizedEvent);\n          }\n          currentSelectionStartIndex = startIndex;\n          foundStart = true;\n        }\n        continue;\n      }\n      if (index == 0 && lastSelectionResult == SelectionResult.previous) {\n        return SelectionResult.previous;\n      }\n      if (selectables[index].value != existingGeometry) {\n        if (!foundStart && lastNextIndex == null) {\n          currentSelectionStartIndex = 0;\n          for (var i = 0; i < index; i += 1) {\n            final SelectionEvent synthesizedEvent =\n                SelectParagraphSelectionEvent(\n                  globalPosition: event.globalPosition,\n                  absorb: true,\n                );\n            dispatchSelectionEventToChild(selectables[i], synthesizedEvent);\n          }\n        }\n        currentSelectionEndIndex = index;\n        // Geometry has changed as a result of select paragraph, need to clear the\n        // selection of other selectables to keep selection in sync.\n        _flushInactiveSelections();\n      }\n      return SelectionResult.end;\n    }\n    assert(lastSelectionResult == null);\n    return SelectionResult.end;\n  }\n\n  /// Initializes the selection of the selectable children.\n  ///\n  /// The goal is to find the selectable child that contains the selection edge.\n  /// Returns [SelectionResult.end] if the selection edge ends on any of the\n  /// children. Otherwise, it returns [SelectionResult.previous] if the selection\n  /// does not reach any of its children. Returns [SelectionResult.next]\n  /// if the selection reaches the end of its children.\n  ///\n  /// Ideally, this method should only be called twice at the beginning of the\n  /// drag selection, once for start edge update event, once for end edge update\n  /// event.\n  SelectionResult _initSelection(\n    SelectionEdgeUpdateEvent event, {\n    required bool isEnd,\n  }) {\n    assert(\n      (isEnd && currentSelectionEndIndex == -1) ||\n          (!isEnd && currentSelectionStartIndex == -1),\n    );\n    SelectionResult? finalResult;\n    // Begin the search for the selection edge at the opposite edge if it exists.\n    final hasOppositeEdge = isEnd\n        ? currentSelectionStartIndex != -1\n        : currentSelectionEndIndex != -1;\n    int newIndex = switch ((isEnd, hasOppositeEdge)) {\n      (true, true) => currentSelectionStartIndex,\n      (true, false) => 0,\n      (false, true) => currentSelectionEndIndex,\n      (false, false) => 0,\n    };\n    bool? forward;\n    late SelectionResult currentSelectableResult;\n    // This loop sends the selection event to one of the following to determine\n    // the direction of the search.\n    //  - The opposite edge index if it exists.\n    //  - Index 0 if the opposite edge index does not exist.\n    //\n    // If the result is `SelectionResult.next`, this loop look backward.\n    // Otherwise, it looks forward.\n    //\n    // The terminate condition are:\n    // 1. the selectable returns end, pending, none.\n    // 2. the selectable returns previous when looking forward.\n    // 2. the selectable returns next when looking backward.\n    while (newIndex < selectables.length &&\n        newIndex >= 0 &&\n        finalResult == null) {\n      currentSelectableResult = dispatchSelectionEventToChild(\n        selectables[newIndex],\n        event,\n      );\n      switch (currentSelectableResult) {\n        case SelectionResult.end:\n        case SelectionResult.pending:\n        case SelectionResult.none:\n          finalResult = currentSelectableResult;\n        case SelectionResult.next:\n          if (forward == false) {\n            newIndex += 1;\n            finalResult = SelectionResult.end;\n          } else if (newIndex == selectables.length - 1) {\n            finalResult = currentSelectableResult;\n          } else {\n            forward = true;\n            newIndex += 1;\n          }\n        case SelectionResult.previous:\n          if (forward ?? false) {\n            newIndex -= 1;\n            finalResult = SelectionResult.end;\n          } else if (newIndex == 0) {\n            finalResult = currentSelectableResult;\n          } else {\n            forward = false;\n            newIndex -= 1;\n          }\n      }\n    }\n    if (isEnd) {\n      currentSelectionEndIndex = newIndex;\n    } else {\n      currentSelectionStartIndex = newIndex;\n    }\n    _flushInactiveSelections();\n    return finalResult!;\n  }\n\n  SelectionResult _adjustSelection(\n    SelectionEdgeUpdateEvent event, {\n    required bool isEnd,\n  }) {\n    assert(() {\n      if (isEnd) {\n        assert(\n          currentSelectionEndIndex < selectables.length &&\n              currentSelectionEndIndex >= 0,\n        );\n        return true;\n      }\n      assert(\n        currentSelectionStartIndex < selectables.length &&\n            currentSelectionStartIndex >= 0,\n      );\n      return true;\n    }());\n    SelectionResult? finalResult;\n    // Determines if the edge being adjusted is within the current viewport.\n    //  - If so, we begin the search for the new selection edge position at the\n    //    currentSelectionEndIndex/currentSelectionStartIndex.\n    //  - If not, we attempt to locate the new selection edge starting from\n    //    the opposite end.\n    //  - If neither edge is in the current viewport, the search for the new\n    //    selection edge position begins at 0.\n    //\n    // This can happen when there is a scrollable child and the edge being adjusted\n    // has been scrolled out of view.\n    final isCurrentEdgeWithinViewport = isEnd\n        ? value.endSelectionPoint != null\n        : value.startSelectionPoint != null;\n    final isOppositeEdgeWithinViewport = isEnd\n        ? value.startSelectionPoint != null\n        : value.endSelectionPoint != null;\n    int newIndex = switch ((\n      isEnd,\n      isCurrentEdgeWithinViewport,\n      isOppositeEdgeWithinViewport,\n    )) {\n      (true, true, true) => currentSelectionEndIndex,\n      (true, true, false) => currentSelectionEndIndex,\n      (true, false, true) => currentSelectionStartIndex,\n      (true, false, false) => 0,\n      (false, true, true) => currentSelectionStartIndex,\n      (false, true, false) => currentSelectionStartIndex,\n      (false, false, true) => currentSelectionEndIndex,\n      (false, false, false) => 0,\n    };\n    bool? forward;\n    late SelectionResult currentSelectableResult;\n    // This loop sends the selection event to one of the following to determine\n    // the direction of the search.\n    //  - currentSelectionEndIndex/currentSelectionStartIndex if the current edge\n    //    is in the current viewport.\n    //  - The opposite edge index if the current edge is not in the current viewport.\n    //  - Index 0 if neither edge is in the current viewport.\n    //\n    // If the result is `SelectionResult.next`, this loop look backward.\n    // Otherwise, it looks forward.\n    //\n    // The terminate condition are:\n    // 1. the selectable returns end, pending, none.\n    // 2. the selectable returns previous when looking forward.\n    // 2. the selectable returns next when looking backward.\n    while (newIndex < selectables.length &&\n        newIndex >= 0 &&\n        finalResult == null) {\n      currentSelectableResult = dispatchSelectionEventToChild(\n        selectables[newIndex],\n        event,\n      );\n      switch (currentSelectableResult) {\n        case SelectionResult.end:\n        case SelectionResult.pending:\n        case SelectionResult.none:\n          finalResult = currentSelectableResult;\n        case SelectionResult.next:\n          if (forward == false) {\n            newIndex += 1;\n            finalResult = SelectionResult.end;\n          } else if (newIndex == selectables.length - 1) {\n            finalResult = currentSelectableResult;\n          } else {\n            forward = true;\n            newIndex += 1;\n          }\n        case SelectionResult.previous:\n          if (forward ?? false) {\n            newIndex -= 1;\n            finalResult = SelectionResult.end;\n          } else if (newIndex == 0) {\n            finalResult = currentSelectableResult;\n          } else {\n            forward = false;\n            newIndex -= 1;\n          }\n      }\n    }\n    if (isEnd) {\n      final bool forwardSelection =\n          currentSelectionEndIndex >= currentSelectionStartIndex;\n      if (forward != null &&\n          ((!forwardSelection &&\n                  forward &&\n                  newIndex >= currentSelectionStartIndex) ||\n              (forwardSelection &&\n                  !forward &&\n                  newIndex <= currentSelectionStartIndex))) {\n        currentSelectionStartIndex = currentSelectionEndIndex;\n      }\n      currentSelectionEndIndex = newIndex;\n    } else {\n      final bool forwardSelection =\n          currentSelectionEndIndex >= currentSelectionStartIndex;\n      if (forward != null &&\n          ((!forwardSelection &&\n                  !forward &&\n                  newIndex <= currentSelectionEndIndex) ||\n              (forwardSelection &&\n                  forward &&\n                  newIndex >= currentSelectionEndIndex))) {\n        currentSelectionEndIndex = currentSelectionStartIndex;\n      }\n      currentSelectionStartIndex = newIndex;\n    }\n    _flushInactiveSelections();\n    return finalResult!;\n  }\n\n  /// The compare function this delegate used for determining the selection\n  /// order of the [Selectable]s.\n  ///\n  /// Sorts the [Selectable]s by their top left [Rect].\n  @override\n  Comparator<Selectable> get compareOrder => _compareScreenOrder;\n\n  static int _compareScreenOrder(Selectable a, Selectable b) {\n    // Attempt to sort the selectables under a [_SelectableTextContainerDelegate]\n    // by the top left rect.\n    final Rect rectA = MatrixUtils.transformRect(\n      a.getTransformTo(null),\n      a.boundingBoxes.first,\n    );\n    final Rect rectB = MatrixUtils.transformRect(\n      b.getTransformTo(null),\n      b.boundingBoxes.first,\n    );\n    final int result = _compareVertically(rectA, rectB);\n    if (result != 0) {\n      return result;\n    }\n    return _compareHorizontally(rectA, rectB);\n  }\n\n  /// Compares two rectangles in the screen order solely by their vertical\n  /// positions.\n  ///\n  /// Returns positive if a is lower, negative if a is higher, 0 if their\n  /// order can't be determine solely by their vertical position.\n  static int _compareVertically(Rect a, Rect b) {\n    // The rectangles overlap so defer to horizontal comparison.\n    if ((a.top - b.top < _kSelectableVerticalComparingThreshold &&\n            a.bottom - b.bottom > -_kSelectableVerticalComparingThreshold) ||\n        (b.top - a.top < _kSelectableVerticalComparingThreshold &&\n            b.bottom - a.bottom > -_kSelectableVerticalComparingThreshold)) {\n      return 0;\n    }\n    if ((a.top - b.top).abs() > _kSelectableVerticalComparingThreshold) {\n      return a.top > b.top ? 1 : -1;\n    }\n    return a.bottom > b.bottom ? 1 : -1;\n  }\n\n  /// Compares two rectangles in the screen order by their horizontal positions\n  /// assuming one of the rectangles enclose the other rect vertically.\n  ///\n  /// Returns positive if a is lower, negative if a is higher.\n  static int _compareHorizontally(Rect a, Rect b) {\n    // a encloses b.\n    if (a.left - b.left < precisionErrorTolerance &&\n        a.right - b.right > -precisionErrorTolerance) {\n      return -1;\n    }\n    // b encloses a.\n    if (b.left - a.left < precisionErrorTolerance &&\n        b.right - a.right > -precisionErrorTolerance) {\n      return 1;\n    }\n    if ((a.left - b.left).abs() > precisionErrorTolerance) {\n      return a.left > b.left ? 1 : -1;\n    }\n    return a.right > b.right ? 1 : -1;\n  }\n\n  /// This method calculates a local [SelectedContentRange] based on the list\n  /// of [selections] that are accumulated from the [Selectable] children under this\n  /// delegate. This calculation takes into account the accumulated content\n  /// length before the active selection, and returns null when either selection\n  /// edge has not been set.\n  SelectedContentRange? _calculateLocalRange(List<_SelectionInfo> selections) {\n    if (currentSelectionStartIndex == -1 || currentSelectionEndIndex == -1) {\n      return null;\n    }\n    var startOffset = 0;\n    var endOffset = 0;\n    var foundStart = false;\n    bool forwardSelection =\n        currentSelectionEndIndex >= currentSelectionStartIndex;\n    if (currentSelectionEndIndex == currentSelectionStartIndex) {\n      // Determining selection direction is inaccurate if currentSelectionStartIndex == currentSelectionEndIndex.\n      // Use the range from the selectable within the selection as the source of truth for selection direction.\n      final SelectedContentRange rangeAtSelectableInSelection =\n          selectables[currentSelectionStartIndex].getSelection()!;\n      forwardSelection =\n          rangeAtSelectableInSelection.endOffset >=\n          rangeAtSelectableInSelection.startOffset;\n    }\n    for (var index = 0; index < selections.length; index++) {\n      final _SelectionInfo selection = selections[index];\n      if (selection.range == null) {\n        if (foundStart) {\n          return SelectedContentRange(\n            startOffset: forwardSelection ? startOffset : endOffset,\n            endOffset: forwardSelection ? endOffset : startOffset,\n          );\n        }\n        startOffset += selection.contentLength;\n        endOffset = startOffset;\n        continue;\n      }\n      final int selectionStartNormalized = min(\n        selection.range!.startOffset,\n        selection.range!.endOffset,\n      );\n      final int selectionEndNormalized = max(\n        selection.range!.startOffset,\n        selection.range!.endOffset,\n      );\n      if (!foundStart) {\n        // Because a RenderParagraph may split its content into multiple selectables\n        // we have to consider at what offset a selectable starts at relative\n        // to the RenderParagraph, when the selectable is not the start of the content.\n        final bool shouldConsiderContentStart =\n            index > 0 &&\n            paragraph.selectableBelongsToParagraph(selectables[index]);\n        startOffset +=\n            (selectionStartNormalized -\n                    (shouldConsiderContentStart\n                        ? paragraph\n                              .getPositionForOffset(\n                                selectables[index]\n                                    .boundingBoxes\n                                    .first\n                                    .centerLeft,\n                              )\n                              .offset\n                        : 0))\n                .abs();\n        endOffset =\n            startOffset +\n            (selectionEndNormalized - selectionStartNormalized).abs();\n        foundStart = true;\n      } else {\n        endOffset += (selectionEndNormalized - selectionStartNormalized).abs();\n      }\n    }\n    assert(\n      foundStart,\n      'The start of the selection has not been found despite this selection delegate having an existing currentSelectionStartIndex and currentSelectionEndIndex.',\n    );\n    return SelectedContentRange(\n      startOffset: forwardSelection ? startOffset : endOffset,\n      endOffset: forwardSelection ? endOffset : startOffset,\n    );\n  }\n\n  /// Returns a [SelectedContentRange] considering the [SelectedContentRange]\n  /// from each [Selectable] child managed under this delegate.\n  ///\n  /// When nothing is selected or either selection edge has not been set,\n  /// this method will return `null`.\n  @override\n  SelectedContentRange? getSelection() {\n    final selections = <_SelectionInfo>[\n      for (final Selectable selectable in selectables)\n        (\n          contentLength: selectable.contentLength,\n          range: selectable.getSelection(),\n        ),\n    ];\n    return _calculateLocalRange(selections);\n  }\n\n  // From [SelectableRegion].\n\n  // Clears the selection on all selectables not in the range of\n  // currentSelectionStartIndex..currentSelectionEndIndex.\n  //\n  // If one of the edges does not exist, then this method will clear the selection\n  // in all selectables except the existing edge.\n  //\n  // If neither of the edges exist this method immediately returns.\n  void _flushInactiveSelections() {\n    if (currentSelectionStartIndex == -1 && currentSelectionEndIndex == -1) {\n      return;\n    }\n    if (currentSelectionStartIndex == -1 || currentSelectionEndIndex == -1) {\n      final int skipIndex = currentSelectionStartIndex == -1\n          ? currentSelectionEndIndex\n          : currentSelectionStartIndex;\n      selectables\n          .where((Selectable target) => target != selectables[skipIndex])\n          .forEach(\n            (Selectable target) => dispatchSelectionEventToChild(\n              target,\n              const ClearSelectionEvent(),\n            ),\n          );\n      return;\n    }\n    final int skipStart = min(\n      currentSelectionStartIndex,\n      currentSelectionEndIndex,\n    );\n    final int skipEnd = max(\n      currentSelectionStartIndex,\n      currentSelectionEndIndex,\n    );\n    for (var index = 0; index < selectables.length; index += 1) {\n      if (index >= skipStart && index <= skipEnd) {\n        continue;\n      }\n      dispatchSelectionEventToChild(\n        selectables[index],\n        const ClearSelectionEvent(),\n      );\n    }\n  }\n\n  @override\n  SelectionResult handleSelectionEdgeUpdate(SelectionEdgeUpdateEvent event) {\n    if (event.granularity != TextGranularity.paragraph) {\n      return super.handleSelectionEdgeUpdate(event);\n    }\n    updateLastSelectionEdgeLocation(\n      globalSelectionEdgeLocation: event.globalPosition,\n      forEnd: event.type == SelectionEventType.endEdgeUpdate,\n    );\n    if (event.type == SelectionEventType.endEdgeUpdate) {\n      return currentSelectionEndIndex == -1\n          ? _initSelection(event, isEnd: true)\n          : _adjustSelection(event, isEnd: true);\n    }\n    return currentSelectionStartIndex == -1\n        ? _initSelection(event, isEnd: false)\n        : _adjustSelection(event, isEnd: false);\n  }\n}\n\n/// The length of the content that can be selected, and the range that is\n/// selected.\ntypedef _SelectionInfo = ({int contentLength, SelectedContentRange? range});\n\n/// A utility class for overriding the text styles of a [TextSpan] tree.\n// When changes are made to this class, the equivalent API in editable_text.dart\n// must also be updated.\n// TODO(Renzo-Olivares): Remove after investigating a solution for overriding all\n// styles for children in an [InlineSpan] tree, see: https://github.com/flutter/flutter/issues/177952.\nclass _OverridingTextStyleTextSpanUtils {\n  static TextSpan applyTextSpacingOverrides({\n    double? lineHeightScaleFactor,\n    double? letterSpacing,\n    double? wordSpacing,\n    required TextSpan textSpan,\n  }) {\n    if (lineHeightScaleFactor == null &&\n        letterSpacing == null &&\n        wordSpacing == null) {\n      return textSpan;\n    }\n    return _applyTextStyleOverrides(\n      TextStyle(\n        height: lineHeightScaleFactor,\n        letterSpacing: letterSpacing,\n        wordSpacing: wordSpacing,\n      ),\n      textSpan,\n    );\n  }\n\n  static TextSpan _applyTextStyleOverrides(\n    TextStyle overrideTextStyle,\n    TextSpan textSpan,\n  ) {\n    return TextSpan(\n      text: textSpan.text,\n      children: textSpan.children?.map((InlineSpan child) {\n        if (child is TextSpan && child.runtimeType == TextSpan) {\n          return _applyTextStyleOverrides(overrideTextStyle, child);\n        }\n        return child;\n      }).toList(),\n      style: textSpan.style?.merge(overrideTextStyle) ?? overrideTextStyle,\n      recognizer: textSpan.recognizer,\n      mouseCursor: textSpan.mouseCursor,\n      onEnter: textSpan.onEnter,\n      onExit: textSpan.onExit,\n      semanticsLabel: textSpan.semanticsLabel,\n      semanticsIdentifier: textSpan.semanticsIdentifier,\n      locale: textSpan.locale,\n      spellOut: textSpan.spellOut,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/text_field/adaptive_text_selection_toolbar.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// ignore_for_file: uri_does_not_exist_in_doc_import\n\n/// @docImport 'selectable_text.dart';\n/// @docImport 'selection_area.dart';\n/// @docImport 'text_field.dart';\nlibrary;\n\nimport 'package:PiliPlus/common/widgets/flutter/text_field/editable_text.dart';\nimport 'package:flutter/cupertino.dart' hide EditableText, EditableTextState;\nimport 'package:flutter/material.dart' hide EditableText, EditableTextState;\nimport 'package:flutter/rendering.dart';\n\n/// The default context menu for text selection for the current platform.\n///\n/// {@template flutter.material.AdaptiveTextSelectionToolbar.contextMenuBuilders}\n/// Typically, this widget would be passed to `contextMenuBuilder` in a\n/// supported parent widget, such as:\n///\n/// * [EditableText.contextMenuBuilder]\n/// * [TextField.contextMenuBuilder]\n/// * [CupertinoTextField.contextMenuBuilder]\n/// * [SelectionArea.contextMenuBuilder]\n/// * [SelectableText.contextMenuBuilder]\n/// {@endtemplate}\n///\n/// See also:\n///\n/// * [EditableText.getEditableButtonItems], which returns the default\n///   [ContextMenuButtonItem]s for [EditableText] on the platform.\n/// * [AdaptiveTextSelectionToolbar.getAdaptiveButtons], which builds the button\n///   Widgets for the current platform given [ContextMenuButtonItem]s.\n/// * [CupertinoAdaptiveTextSelectionToolbar], which does the same thing as this\n///   widget but only for Cupertino context menus.\n/// * [TextSelectionToolbar], the default toolbar for Android.\n/// * [DesktopTextSelectionToolbar], the default toolbar for desktop platforms\n///    other than MacOS.\n/// * [CupertinoTextSelectionToolbar], the default toolbar for iOS.\n/// * [CupertinoDesktopTextSelectionToolbar], the default toolbar for MacOS.\nclass AdaptiveTextSelectionToolbar extends StatelessWidget {\n  /// Create an instance of [AdaptiveTextSelectionToolbar] with the\n  /// given [children].\n  ///\n  /// See also:\n  ///\n  /// {@template flutter.material.AdaptiveTextSelectionToolbar.buttonItems}\n  /// * [AdaptiveTextSelectionToolbar.buttonItems], which takes a list of\n  ///   [ContextMenuButtonItem]s instead of [children] widgets.\n  /// {@endtemplate}\n  /// {@template flutter.material.AdaptiveTextSelectionToolbar.editable}\n  /// * [AdaptiveTextSelectionToolbar.editable], which builds the default\n  ///   children for an editable field.\n  /// {@endtemplate}\n  /// {@template flutter.material.AdaptiveTextSelectionToolbar.editableText}\n  /// * [AdaptiveTextSelectionToolbar.editableText], which builds the default\n  ///   children for an [EditableText].\n  /// {@endtemplate}\n  /// {@template flutter.material.AdaptiveTextSelectionToolbar.selectable}\n  /// * [AdaptiveTextSelectionToolbar.selectable], which builds the default\n  ///   children for content that is selectable but not editable.\n  /// {@endtemplate}\n  const AdaptiveTextSelectionToolbar({\n    super.key,\n    required this.children,\n    required this.anchors,\n  }) : buttonItems = null;\n\n  /// Create an instance of [AdaptiveTextSelectionToolbar] whose children will\n  /// be built from the given [buttonItems].\n  ///\n  /// See also:\n  ///\n  /// {@template flutter.material.AdaptiveTextSelectionToolbar.new}\n  /// * [AdaptiveTextSelectionToolbar.new], which takes the children directly as\n  ///   a list of widgets.\n  /// {@endtemplate}\n  /// {@macro flutter.material.AdaptiveTextSelectionToolbar.editable}\n  /// {@macro flutter.material.AdaptiveTextSelectionToolbar.editableText}\n  /// {@macro flutter.material.AdaptiveTextSelectionToolbar.selectable}\n  const AdaptiveTextSelectionToolbar.buttonItems({\n    super.key,\n    required this.buttonItems,\n    required this.anchors,\n  }) : children = null;\n\n  /// Create an instance of [AdaptiveTextSelectionToolbar] with the default\n  /// children for an editable field.\n  ///\n  /// If an on* callback parameter is null, then its corresponding button will\n  /// not be built.\n  ///\n  /// These callbacks are called when their corresponding button is activated\n  /// and only then. For example, `onPaste` is called when the user taps the\n  /// \"Paste\" button in the context menu and not when the user pastes with the\n  /// keyboard.\n  ///\n  /// See also:\n  ///\n  /// {@macro flutter.material.AdaptiveTextSelectionToolbar.new}\n  /// {@macro flutter.material.AdaptiveTextSelectionToolbar.editableText}\n  /// {@macro flutter.material.AdaptiveTextSelectionToolbar.buttonItems}\n  /// {@macro flutter.material.AdaptiveTextSelectionToolbar.selectable}\n  AdaptiveTextSelectionToolbar.editable({\n    super.key,\n    required ClipboardStatus clipboardStatus,\n    required VoidCallback? onCopy,\n    required VoidCallback? onCut,\n    required VoidCallback? onPaste,\n    required VoidCallback? onSelectAll,\n    required VoidCallback? onLookUp,\n    required VoidCallback? onSearchWeb,\n    required VoidCallback? onShare,\n    required VoidCallback? onLiveTextInput,\n    required this.anchors,\n  }) : children = null,\n       buttonItems = EditableText.getEditableButtonItems(\n         clipboardStatus: clipboardStatus,\n         onCopy: onCopy,\n         onCut: onCut,\n         onPaste: onPaste,\n         onSelectAll: onSelectAll,\n         onLookUp: onLookUp,\n         onSearchWeb: onSearchWeb,\n         onShare: onShare,\n         onLiveTextInput: onLiveTextInput,\n       );\n\n  /// Create an instance of [AdaptiveTextSelectionToolbar] with the default\n  /// children for an [EditableText].\n  ///\n  /// See also:\n  ///\n  /// {@macro flutter.material.AdaptiveTextSelectionToolbar.new}\n  /// {@macro flutter.material.AdaptiveTextSelectionToolbar.editable}\n  /// {@macro flutter.material.AdaptiveTextSelectionToolbar.buttonItems}\n  /// {@macro flutter.material.AdaptiveTextSelectionToolbar.selectable}\n  AdaptiveTextSelectionToolbar.editableText({\n    super.key,\n    required EditableTextState editableTextState,\n  }) : children = null,\n       buttonItems = editableTextState.contextMenuButtonItems,\n       anchors = editableTextState.contextMenuAnchors;\n\n  /// Create an instance of [AdaptiveTextSelectionToolbar] with the default\n  /// children for selectable, but not editable, content.\n  ///\n  /// See also:\n  ///\n  /// {@macro flutter.material.AdaptiveTextSelectionToolbar.new}\n  /// {@macro flutter.material.AdaptiveTextSelectionToolbar.buttonItems}\n  /// {@macro flutter.material.AdaptiveTextSelectionToolbar.editable}\n  /// {@macro flutter.material.AdaptiveTextSelectionToolbar.editableText}\n  AdaptiveTextSelectionToolbar.selectable({\n    super.key,\n    required VoidCallback onCopy,\n    required VoidCallback onSelectAll,\n    required VoidCallback? onShare,\n    required SelectionGeometry selectionGeometry,\n    required this.anchors,\n  }) : children = null,\n       buttonItems = SelectableRegion.getSelectableButtonItems(\n         selectionGeometry: selectionGeometry,\n         onCopy: onCopy,\n         onSelectAll: onSelectAll,\n         onShare: onShare,\n       );\n\n  /// Create an instance of [AdaptiveTextSelectionToolbar] with the default\n  /// children for a [SelectableRegion].\n  ///\n  /// See also:\n  ///\n  /// {@macro flutter.material.AdaptiveTextSelectionToolbar.new}\n  /// {@macro flutter.material.AdaptiveTextSelectionToolbar.buttonItems}\n  /// {@macro flutter.material.AdaptiveTextSelectionToolbar.editable}\n  /// {@macro flutter.material.AdaptiveTextSelectionToolbar.editableText}\n  /// {@macro flutter.material.AdaptiveTextSelectionToolbar.selectable}\n  AdaptiveTextSelectionToolbar.selectableRegion({\n    super.key,\n    required SelectableRegionState selectableRegionState,\n  }) : children = null,\n       buttonItems = selectableRegionState.contextMenuButtonItems,\n       anchors = selectableRegionState.contextMenuAnchors;\n\n  /// {@template flutter.material.AdaptiveTextSelectionToolbar.buttonItems}\n  /// The [ContextMenuButtonItem]s that will be turned into the correct button\n  /// widgets for the current platform.\n  /// {@endtemplate}\n  final List<ContextMenuButtonItem>? buttonItems;\n\n  /// The children of the toolbar, typically buttons.\n  final List<Widget>? children;\n\n  /// {@template flutter.material.AdaptiveTextSelectionToolbar.anchors}\n  /// The location on which to anchor the menu.\n  /// {@endtemplate}\n  final TextSelectionToolbarAnchors anchors;\n\n  /// Returns the default button label String for the button of the given\n  /// [ContextMenuButtonType] on any platform.\n  static String getButtonLabel(\n    BuildContext context,\n    ContextMenuButtonItem buttonItem,\n  ) {\n    if (buttonItem.label != null) {\n      return buttonItem.label!;\n    }\n\n    switch (Theme.of(context).platform) {\n      case TargetPlatform.iOS:\n      case TargetPlatform.macOS:\n        return CupertinoTextSelectionToolbarButton.getButtonLabel(\n          context,\n          buttonItem,\n        );\n      case TargetPlatform.android:\n      case TargetPlatform.fuchsia:\n      case TargetPlatform.linux:\n      case TargetPlatform.windows:\n        assert(debugCheckHasMaterialLocalizations(context));\n        final MaterialLocalizations localizations = MaterialLocalizations.of(\n          context,\n        );\n        return switch (buttonItem.type) {\n          ContextMenuButtonType.cut => localizations.cutButtonLabel,\n          ContextMenuButtonType.copy => localizations.copyButtonLabel,\n          ContextMenuButtonType.paste => localizations.pasteButtonLabel,\n          ContextMenuButtonType.selectAll => localizations.selectAllButtonLabel,\n          ContextMenuButtonType.delete =>\n            localizations.deleteButtonTooltip.toUpperCase(),\n          ContextMenuButtonType.lookUp => localizations.lookUpButtonLabel,\n          ContextMenuButtonType.searchWeb => localizations.searchWebButtonLabel,\n          ContextMenuButtonType.share => localizations.shareButtonLabel,\n          ContextMenuButtonType.liveTextInput =>\n            localizations.scanTextButtonLabel,\n          ContextMenuButtonType.custom => '',\n        };\n    }\n  }\n\n  /// Returns a List of Widgets generated by turning [buttonItems] into the\n  /// default context menu buttons for the current platform.\n  ///\n  /// This is useful when building a text selection toolbar with the default\n  /// button appearance for the given platform, but where the toolbar and/or the\n  /// button actions and labels may be custom.\n  ///\n  /// {@tool dartpad}\n  /// This sample demonstrates how to use `getAdaptiveButtons` to generate\n  /// default button widgets in a custom toolbar.\n  ///\n  /// ** See code in examples/api/lib/material/context_menu/editable_text_toolbar_builder.2.dart **\n  /// {@end-tool}\n  ///\n  /// See also:\n  ///\n  /// * [CupertinoAdaptiveTextSelectionToolbar.getAdaptiveButtons], which is the\n  ///   Cupertino equivalent of this class and builds only the Cupertino\n  ///   buttons.\n  static Iterable<Widget> getAdaptiveButtons(\n    BuildContext context,\n    List<ContextMenuButtonItem> buttonItems,\n  ) {\n    switch (Theme.of(context).platform) {\n      case TargetPlatform.iOS:\n        return buttonItems.map((ContextMenuButtonItem buttonItem) {\n          return CupertinoTextSelectionToolbarButton.buttonItem(\n            buttonItem: buttonItem,\n          );\n        });\n      case TargetPlatform.fuchsia:\n      case TargetPlatform.android:\n        final buttons = <Widget>[];\n        for (var i = 0; i < buttonItems.length; i++) {\n          final ContextMenuButtonItem buttonItem = buttonItems[i];\n          buttons.add(\n            TextSelectionToolbarTextButton(\n              padding: TextSelectionToolbarTextButton.getPadding(\n                i,\n                buttonItems.length,\n              ),\n              onPressed: buttonItem.onPressed,\n              alignment: AlignmentDirectional.centerStart,\n              child: Text(getButtonLabel(context, buttonItem)),\n            ),\n          );\n        }\n        return buttons;\n      case TargetPlatform.linux:\n      case TargetPlatform.windows:\n        return buttonItems.map((ContextMenuButtonItem buttonItem) {\n          return DesktopTextSelectionToolbarButton.text(\n            context: context,\n            onPressed: buttonItem.onPressed,\n            text: getButtonLabel(context, buttonItem),\n          );\n        });\n      case TargetPlatform.macOS:\n        return buttonItems.map((ContextMenuButtonItem buttonItem) {\n          return CupertinoDesktopTextSelectionToolbarButton.text(\n            onPressed: buttonItem.onPressed,\n            text: getButtonLabel(context, buttonItem),\n          );\n        });\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    // If there aren't any buttons to build, build an empty toolbar.\n    if ((children ?? buttonItems)?.isEmpty ?? true) {\n      return const SizedBox.shrink();\n    }\n\n    final List<Widget> resultChildren = children != null\n        ? children!\n        : getAdaptiveButtons(context, buttonItems!).toList();\n\n    switch (Theme.of(context).platform) {\n      case TargetPlatform.iOS:\n        return CupertinoTextSelectionToolbar(\n          anchorAbove: anchors.primaryAnchor,\n          anchorBelow: anchors.secondaryAnchor == null\n              ? anchors.primaryAnchor\n              : anchors.secondaryAnchor!,\n          children: resultChildren,\n        );\n      case TargetPlatform.android:\n        return TextSelectionToolbar(\n          anchorAbove: anchors.primaryAnchor,\n          anchorBelow: anchors.secondaryAnchor == null\n              ? anchors.primaryAnchor\n              : anchors.secondaryAnchor!,\n          children: resultChildren,\n        );\n      case TargetPlatform.fuchsia:\n      case TargetPlatform.linux:\n      case TargetPlatform.windows:\n        return DesktopTextSelectionToolbar(\n          anchor: anchors.primaryAnchor,\n          children: resultChildren,\n        );\n      case TargetPlatform.macOS:\n        return CupertinoDesktopTextSelectionToolbar(\n          anchor: anchors.primaryAnchor,\n          children: resultChildren,\n        );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/text_field/controller.dart",
    "content": "/*\n * This file is part of PiliPlus\n *\n * PiliPlus 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 * PiliPlus 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 PiliPlus.  If not, see <https://www.gnu.org/licenses/>.\n */\n\nimport 'dart:math';\n\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\n\n///\n/// created by bggRGjQaUbCoE on 2025/6/27\n///\n\nenum RichTextType { text, composing, at, emoji, vote, common }\n\nclass Emote {\n  late String url;\n  late double width;\n  late double height;\n\n  Emote({\n    required this.url,\n    required this.width,\n    double? height,\n  }) : height = height ?? width;\n}\n\nmixin RichTextTypeMixin {\n  RichTextType get type;\n  Emote? get emote;\n  String? get id;\n  String? get rawText;\n}\n\nextension TextEditingDeltaExt on TextEditingDelta {\n  ({RichTextType type, String? rawText, Emote? emote, String? id}) get config {\n    if (this case final RichTextTypeMixin e) {\n      return (type: e.type, rawText: e.rawText, emote: e.emote, id: e.id);\n    }\n    return (\n      type: composing.isValid ? RichTextType.composing : RichTextType.text,\n      rawText: null,\n      emote: null,\n      id: null,\n    );\n  }\n\n  bool get isText {\n    if (this case final RichTextTypeMixin e) {\n      return e.type == RichTextType.text;\n    }\n    return !composing.isValid;\n  }\n\n  bool get isComposing {\n    return composing.isValid;\n  }\n}\n\nclass RichTextEditingDeltaInsertion extends TextEditingDeltaInsertion\n    with RichTextTypeMixin {\n  RichTextEditingDeltaInsertion({\n    required super.oldText,\n    required super.textInserted,\n    required super.insertionOffset,\n    required super.selection,\n    required super.composing,\n    RichTextType? type,\n    this.emote,\n    this.id,\n    this.rawText,\n  }) : type =\n           type ??\n           (composing.isValid ? RichTextType.composing : RichTextType.text);\n\n  @override\n  late final RichTextType type;\n\n  @override\n  final Emote? emote;\n\n  @override\n  final String? id;\n\n  @override\n  final String? rawText;\n}\n\nclass RichTextEditingDeltaReplacement extends TextEditingDeltaReplacement\n    with RichTextTypeMixin {\n  RichTextEditingDeltaReplacement({\n    required super.oldText,\n    required super.replacementText,\n    required super.replacedRange,\n    required super.selection,\n    required super.composing,\n    RichTextType? type,\n    this.emote,\n    this.id,\n    this.rawText,\n  }) : type =\n           type ??\n           (composing.isValid ? RichTextType.composing : RichTextType.text);\n\n  @override\n  late final RichTextType type;\n\n  @override\n  final Emote? emote;\n\n  @override\n  final String? id;\n\n  @override\n  final String? rawText;\n}\n\nclass RichTextItem {\n  late RichTextType type;\n  late String text;\n  String? _rawText;\n  late TextRange range;\n  Emote? emote;\n  String? id;\n\n  String get rawText => _rawText ?? text;\n\n  bool get isText => type == RichTextType.text;\n\n  bool get isComposing => type == RichTextType.composing;\n\n  bool get isRich => !isText && !isComposing;\n\n  RichTextItem({\n    this.type = RichTextType.text,\n    required this.text,\n    String? rawText,\n    required this.range,\n    this.emote,\n    this.id,\n  }) : _rawText = rawText;\n\n  RichTextItem.fromStart(\n    this.text, {\n    String? rawText,\n    this.type = RichTextType.text,\n    this.emote,\n    this.id,\n  }) : range = TextRange(start: 0, end: text.length),\n       _rawText = rawText;\n\n  List<RichTextItem>? onInsert(\n    TextEditingDeltaInsertion delta,\n    RichTextEditingController controller,\n  ) {\n    final int insertionOffset = delta.insertionOffset;\n\n    if (range.end < insertionOffset) {\n      return null;\n    }\n\n    if (insertionOffset == 0 && range.start == 0) {\n      final insertedLength = delta.textInserted.length;\n      controller.newSelection = TextSelection.collapsed(offset: insertedLength);\n      if (!isRich && delta.isText) {\n        text = delta.textInserted + text;\n        range = TextRange(start: range.start, end: range.start + text.length);\n        return null;\n      }\n      range = TextRange(\n        start: range.start + insertedLength,\n        end: range.end + insertedLength,\n      );\n      final config = delta.config;\n      final insertedItem = RichTextItem.fromStart(\n        delta.textInserted,\n        rawText: config.rawText,\n        type: config.type,\n        emote: config.emote,\n        id: config.id,\n      );\n      return [insertedItem];\n    }\n\n    if (range.start >= insertionOffset) {\n      final int insertedLength = delta.textInserted.length;\n      range = TextRange(\n        start: range.start + insertedLength,\n        end: range.end + insertedLength,\n      );\n      return null;\n    }\n\n    if (range.end == insertionOffset) {\n      final end = insertionOffset + delta.textInserted.length;\n      controller.newSelection = TextSelection.collapsed(offset: end);\n      if ((isText && delta.isText) || (isComposing && delta.isComposing)) {\n        text += delta.textInserted;\n        range = TextRange(start: range.start, end: end);\n        return null;\n      }\n      final config = delta.config;\n      final insertedItem = RichTextItem(\n        type: config.type,\n        emote: config.emote,\n        id: config.id,\n        text: delta.textInserted,\n        rawText: config.rawText,\n        range: TextRange(start: insertionOffset, end: end),\n      );\n      return [insertedItem];\n    }\n\n    if (!isRich &&\n        range.start < insertionOffset &&\n        range.end > insertionOffset) {\n      final leadingText = text.substring(0, insertionOffset - range.start);\n      final trailingString = text.substring(leadingText.length);\n      final insertEnd = insertionOffset + delta.textInserted.length;\n      controller.newSelection = TextSelection.collapsed(offset: insertEnd);\n      if (delta.isText) {\n        text = leadingText + delta.textInserted + trailingString;\n        range = TextRange(\n          start: range.start,\n          end: range.start + text.length,\n        );\n        return null;\n      }\n      final config = delta.config;\n      final insertedItem = RichTextItem(\n        type: config.type,\n        emote: config.emote,\n        id: config.id,\n        text: delta.textInserted,\n        rawText: config.rawText,\n        range: TextRange(start: insertionOffset, end: insertEnd),\n      );\n      final trailItem = RichTextItem(\n        text: trailingString,\n        range: TextRange(\n          start: insertEnd,\n          end: insertEnd + trailingString.length,\n        ),\n      );\n      text = leadingText;\n      range = TextRange(\n        start: range.start,\n        end: range.start + leadingText.length,\n      );\n      return [insertedItem, trailItem];\n    }\n\n    return null;\n  }\n\n  ({bool remove, bool cal})? onDelete(\n    TextEditingDeltaDeletion delta,\n    RichTextEditingController controller,\n    int? delLength,\n  ) {\n    final deletedRange = delta.deletedRange;\n\n    if (range.end <= deletedRange.start) {\n      return null;\n    }\n\n    if (range.start >= deletedRange.end) {\n      final length = delLength ?? delta.textDeleted.length;\n      range = TextRange(\n        start: range.start - length,\n        end: range.end - length,\n      );\n      return null;\n    }\n\n    if (range.start < deletedRange.start && range.end > deletedRange.end) {\n      if (isRich) {\n        controller.newSelection = TextSelection.collapsed(offset: range.start);\n        return (remove: true, cal: true);\n      }\n      text = text.replaceRange(\n        deletedRange.start - range.start,\n        deletedRange.end - range.start,\n        '',\n      );\n      range = TextRange(start: range.start, end: range.start + text.length);\n      controller.newSelection = TextSelection.collapsed(\n        offset: deletedRange.start,\n      );\n      return null;\n    }\n\n    if (range.start >= deletedRange.start && range.end <= deletedRange.end) {\n      if (range.start == deletedRange.start) {\n        controller.newSelection = TextSelection.collapsed(offset: range.start);\n      }\n      return (remove: true, cal: false);\n    }\n\n    if (range.start < deletedRange.start && range.end <= deletedRange.end) {\n      if (isRich) {\n        controller.newSelection = TextSelection.collapsed(offset: range.start);\n        return (remove: true, cal: true);\n      }\n      text = text.replaceRange(\n        text.length - (range.end - deletedRange.start),\n        null,\n        '',\n      );\n      range = TextRange(\n        start: range.start,\n        end: deletedRange.start,\n      );\n      controller.newSelection = TextSelection.collapsed(\n        offset: deletedRange.start,\n      );\n      return null;\n    }\n\n    if (range.start >= deletedRange.start && range.end > deletedRange.end) {\n      final start = min(deletedRange.start, range.start);\n      controller.newSelection = TextSelection.collapsed(offset: start);\n      if (isRich) {\n        return (remove: true, cal: true);\n      }\n      text = text.substring(deletedRange.end - range.start);\n      range = TextRange(\n        start: start,\n        end: start + text.length,\n      );\n      return null;\n    }\n\n    return null;\n  }\n\n  ({bool remove, List<RichTextItem>? toAdd})? onReplace(\n    TextEditingDeltaReplacement delta,\n    RichTextEditingController controller,\n  ) {\n    final replacedRange = delta.replacedRange;\n\n    if (range.end <= replacedRange.start) {\n      return null;\n    }\n\n    if (range.start >= replacedRange.end) {\n      final before = replacedRange.end - replacedRange.start;\n      final after = delta.replacementText.length;\n      final length = after - before;\n      range = TextRange(\n        start: range.start + length,\n        end: range.end + length,\n      );\n      return null;\n    }\n\n    if (range.start < replacedRange.start && range.end > replacedRange.end) {\n      if (!isRich) {\n        if (delta.isText) {\n          text = text.replaceRange(\n            replacedRange.start - range.start,\n            replacedRange.end - range.start,\n            delta.replacementText,\n          );\n          final end = range.start + text.length;\n          range = TextRange(start: range.start, end: end);\n          controller.newSelection = TextSelection.collapsed(\n            offset: replacedRange.start + delta.replacementText.length,\n          );\n          return null;\n        } else {\n          final leadingText = text.substring(\n            0,\n            replacedRange.start - range.start,\n          );\n          final trailString = text.substring(replacedRange.end - range.start);\n          final insertEnd = replacedRange.start + delta.replacementText.length;\n          controller.newSelection = TextSelection.collapsed(offset: insertEnd);\n          final config = delta.config;\n          final insertedItem = RichTextItem(\n            type: config.type,\n            emote: config.emote,\n            id: config.id,\n            text: delta.replacementText,\n            rawText: config.rawText,\n            range: TextRange(\n              start: replacedRange.start,\n              end: insertEnd,\n            ),\n          );\n          final trailItem = RichTextItem(\n            text: trailString,\n            range: TextRange(\n              start: insertEnd,\n              end: insertEnd + trailString.length,\n            ),\n          );\n          text = leadingText;\n          range = TextRange(\n            start: range.start,\n            end: range.start + leadingText.length,\n          );\n          return (\n            remove: false,\n            toAdd: [insertedItem, trailItem],\n          );\n        }\n      }\n      final config = delta.config;\n      text = delta.replacementText;\n      type = config.type;\n      emote = config.emote;\n      id = config.id;\n      final end = range.start + text.length;\n      range = TextRange(start: range.start, end: end);\n      controller.newSelection = TextSelection.collapsed(offset: end);\n      return null;\n    }\n\n    if (range.start >= replacedRange.start && range.end <= replacedRange.end) {\n      if (range.start == replacedRange.start) {\n        text = delta.replacementText;\n        final config = delta.config;\n        _rawText = config.rawText;\n        type = config.type;\n        emote = config.emote;\n        id = config.id;\n        final end = range.start + text.length;\n        range = TextRange(start: range.start, end: end);\n        controller.newSelection = TextSelection.collapsed(offset: end);\n        return (remove: false, toAdd: null);\n      }\n      return (remove: true, toAdd: null);\n    }\n\n    if (range.start < replacedRange.start && range.end <= replacedRange.end) {\n      if (!isRich) {\n        if (delta.isText) {\n          text = text.replaceRange(\n            text.length - (range.end - replacedRange.start),\n            null,\n            delta.replacementText,\n          );\n          final end = range.start + text.length;\n          range = TextRange(start: range.start, end: end);\n          controller.newSelection = TextSelection.collapsed(offset: end);\n          return null;\n        } else {\n          text = text.replaceRange(\n            text.length - (range.end - replacedRange.start),\n            null,\n            '',\n          );\n          range = TextRange(start: range.start, end: range.start + text.length);\n          final end = replacedRange.start + delta.replacementText.length;\n          final config = delta.config;\n          final insertedItem = RichTextItem(\n            text: delta.replacementText,\n            rawText: config.rawText,\n            type: config.type,\n            emote: config.emote,\n            id: config.id,\n            range: TextRange(start: replacedRange.start, end: end),\n          );\n          controller.newSelection = TextSelection.collapsed(offset: end);\n          return (remove: false, toAdd: [insertedItem]);\n        }\n      }\n      text = delta.replacementText;\n      final config = delta.config;\n      type = config.type;\n      emote = config.emote;\n      id = config.id;\n      final end = range.start + text.length;\n      range = TextRange(start: range.start, end: end);\n      controller.newSelection = TextSelection.collapsed(offset: end);\n      return null;\n    }\n\n    if (range.start >= replacedRange.start && range.end > replacedRange.end) {\n      if (range.start > replacedRange.start) {\n        if (!isRich) {\n          text = text.substring(replacedRange.end - range.start);\n          final start = replacedRange.start + delta.replacementText.length;\n          range = TextRange(start: start, end: start + text.length);\n          return null;\n        }\n        return (remove: true, toAdd: null);\n      }\n      if (!isRich) {\n        if (delta.isText) {\n          text = text.replaceRange(\n            0,\n            replacedRange.end - range.start,\n            delta.replacementText,\n          );\n          final end = range.start + text.length;\n          range = TextRange(start: range.start, end: end);\n          controller.newSelection = TextSelection.collapsed(offset: end);\n          return null;\n        } else {\n          final end = range.start + delta.replacementText.length;\n          final config = delta.config;\n          final insertedItem = RichTextItem(\n            text: delta.replacementText,\n            rawText: config.rawText,\n            type: config.type,\n            emote: config.emote,\n            id: config.id,\n            range: TextRange(start: range.start, end: end),\n          );\n          controller.newSelection = TextSelection.collapsed(offset: end);\n          text = text.substring(replacedRange.end - range.start);\n          range = TextRange(start: end, end: end + text.length);\n          return (remove: true, toAdd: [insertedItem]);\n        }\n      }\n      text = delta.replacementText;\n      final config = delta.config;\n      type = config.type;\n      emote = config.emote;\n      id = config.id;\n      final end = range.start + text.length;\n      range = TextRange(start: range.start, end: end);\n      controller.newSelection = TextSelection.collapsed(offset: end);\n      return null;\n    }\n\n    return null;\n  }\n\n  @override\n  String toString() {\n    return '\\ntype: [${type.name}],'\n        'text: [$text],'\n        'rawText: [$_rawText],'\n        '\\nrange: [TextRange(start: ${range.start}, end: ${range.end})]\\n';\n  }\n}\n\nclass RichTextEditingController extends TextEditingController {\n  RichTextEditingController({\n    List<RichTextItem>? items,\n    this.onMention,\n  }) : super(\n         text: items != null && items.isNotEmpty\n             ? (StringBuffer()..writeAll(items.map((e) => e.text))).toString()\n             : null,\n       ) {\n    if (items != null && items.isNotEmpty) {\n      this.items.addAll(items);\n    }\n  }\n\n  final VoidCallback? onMention;\n\n  TextSelection newSelection = const TextSelection.collapsed(offset: 0);\n\n  final List<RichTextItem> items = <RichTextItem>[];\n\n  String get plainText {\n    if (items.isEmpty) {\n      return '';\n    }\n    final buffer = StringBuffer();\n    for (final e in items) {\n      buffer.write(e.text);\n    }\n    return buffer.toString();\n  }\n\n  String get rawText {\n    if (items.isEmpty) {\n      return '';\n    }\n    final buffer = StringBuffer();\n    for (final e in items) {\n      if (e.type == RichTextType.at) {\n        buffer.write(e.text);\n      } else {\n        buffer.write(e.rawText);\n      }\n    }\n    return buffer.toString();\n  }\n\n  void syncRichText(TextEditingDelta delta) {\n    int? addIndex;\n    List<RichTextItem>? toAdd;\n\n    int? delLength;\n    List<RichTextItem>? toDel;\n\n    switch (delta) {\n      case TextEditingDeltaInsertion e:\n        if (e.textInserted == '@') {\n          onMention?.call();\n        }\n\n        if (items.isEmpty) {\n          final config = delta.config;\n          items.add(\n            RichTextItem.fromStart(\n              delta.textInserted,\n              rawText: config.rawText,\n              type: config.type,\n              emote: config.emote,\n              id: config.id,\n            ),\n          );\n          newSelection = TextSelection.collapsed(\n            offset: delta.textInserted.length,\n          );\n          return;\n        }\n        for (int index = 0; index < items.length; index++) {\n          List<RichTextItem>? newItems = items[index].onInsert(e, this);\n          if (newItems != null) {\n            addIndex = (e.insertionOffset == 0 && index == 0) ? 0 : index + 1;\n            toAdd = newItems;\n          }\n        }\n\n      case TextEditingDeltaDeletion e:\n        for (int index = 0; index < items.length; index++) {\n          final item = items[index];\n          ({bool remove, bool cal})? res = item.onDelete(e, this, delLength);\n          if (res != null) {\n            if (res.remove) {\n              (toDel ??= <RichTextItem>[]).add(item);\n            }\n            if (res.cal) {\n              delLength ??= item.text.length;\n            }\n          }\n        }\n\n      case TextEditingDeltaReplacement e:\n        for (int index = 0; index < items.length; index++) {\n          final item = items[index];\n          ({bool remove, List<RichTextItem>? toAdd})? res = item.onReplace(\n            e,\n            this,\n          );\n          if (res != null) {\n            if (res.toAdd != null) {\n              addIndex = res.remove\n                  ? index\n                  : (e.replacedRange.start == 0 && index == 0)\n                  ? 0\n                  : index + 1;\n              (toAdd ??= <RichTextItem>[]).addAll(res.toAdd!);\n            } else if (res.remove) {\n              (toDel ??= <RichTextItem>[]).add(item);\n            }\n          }\n        }\n\n      case TextEditingDeltaNonTextUpdate e:\n        newSelection = e.selection;\n        if (newSelection.isCollapsed) {\n          final newPos = dragOffset(newSelection.base);\n          newSelection = newSelection.copyWith(\n            baseOffset: newPos.offset,\n            extentOffset: newPos.offset,\n          );\n        } else {\n          final isNormalized =\n              newSelection.baseOffset < newSelection.extentOffset;\n          var startOffset = newSelection.start;\n          var endOffset = newSelection.end;\n          final newOffset = longPressOffset(startOffset, endOffset);\n          startOffset = newOffset.startOffset;\n          endOffset = newOffset.endOffset;\n          newSelection = newSelection.copyWith(\n            baseOffset: isNormalized ? startOffset : endOffset,\n            extentOffset: isNormalized ? endOffset : startOffset,\n          );\n        }\n    }\n\n    if (addIndex != null && toAdd != null && toAdd.isNotEmpty) {\n      items.insertAll(addIndex, toAdd);\n    }\n    if (toDel != null && toDel.isNotEmpty) {\n      for (final item in toDel) {\n        items.remove(item);\n      }\n    }\n  }\n\n  TextStyle? composingStyle;\n  TextStyle? richStyle;\n\n  @override\n  TextSpan buildTextSpan({\n    required BuildContext context,\n    TextStyle? style,\n    required bool withComposing,\n  }) {\n    assert(\n      !value.composing.isValid || !withComposing || value.isComposingRangeValid,\n    );\n\n    final bool composingRegionOutOfRange =\n        !value.isComposingRangeValid || !withComposing;\n\n    // if (composingRegionOutOfRange) {\n    //   return TextSpan(style: style, text: text);\n    // }\n\n    // bool isValid = true;\n    // int cursor = 0;\n    // for (final e in items) {\n    //   final range = e.range;\n    //   if (range.start == cursor) {\n    //     cursor = range.end;\n    //   } else {\n    //     isValid = false;\n    //     break;\n    //   }\n    // }\n    // debugPrint('isValid: $isValid,,${text.length},,${plainText.length}');\n    // debugPrint('$items\\n$selection');\n\n    return TextSpan(\n      style: style,\n      children: items.map((e) {\n        switch (e.type) {\n          case RichTextType.text:\n            return TextSpan(text: e.text);\n          case RichTextType.composing:\n            composingStyle ??=\n                style?.merge(\n                  const TextStyle(decoration: TextDecoration.underline),\n                ) ??\n                const TextStyle(decoration: TextDecoration.underline);\n            if (composingRegionOutOfRange) {\n              e.type = RichTextType.text;\n            }\n            return TextSpan(\n              text: e.text,\n              style: composingRegionOutOfRange ? null : composingStyle,\n            );\n          case RichTextType.at || RichTextType.common:\n            richStyle ??= (style ?? const TextStyle()).copyWith(\n              color: Theme.of(context).colorScheme.primary,\n            );\n            return TextSpan(\n              text: e.text,\n              style: richStyle,\n            );\n          case RichTextType.emoji:\n            final emote = e.emote;\n            if (emote != null) {\n              return WidgetSpan(\n                alignment: PlaceholderAlignment.middle,\n                child: Padding(\n                  padding: const EdgeInsets.symmetric(horizontal: 2),\n                  child: NetworkImgLayer(\n                    src: emote.url,\n                    width: 22, // emote.width,\n                    height: 22, // emote.height,\n                    type: ImageType.emote,\n                    fit: BoxFit.contain,\n                  ),\n                ),\n              );\n            }\n            return TextSpan(text: e.text);\n          case RichTextType.vote:\n            richStyle ??= (style ?? const TextStyle()).copyWith(\n              color: Theme.of(context).colorScheme.primary,\n            );\n            return TextSpan(\n              children: [\n                WidgetSpan(\n                  alignment: PlaceholderAlignment.middle,\n                  child: Icon(\n                    Icons.bar_chart_rounded,\n                    size: 22,\n                    color: richStyle!.color,\n                  ),\n                ),\n                TextSpan(\n                  text: '${e.rawText} ',\n                  style: richStyle,\n                ),\n              ],\n            );\n        }\n      }).toList(),\n    );\n\n    // final TextStyle composingStyle =\n    //     style?.merge(const TextStyle(decoration: TextDecoration.underline)) ??\n    //         const TextStyle(decoration: TextDecoration.underline);\n    // return TextSpan(\n    //   style: style,\n    //   children: <TextSpan>[\n    //     TextSpan(text: value.composing.textBefore(value.text)),\n    //     TextSpan(\n    //         style: composingStyle,\n    //         text: value.composing.textInside(value.text)),\n    //     TextSpan(text: value.composing.textAfter(value.text)),\n    //   ],\n    // );\n  }\n\n  @override\n  void clear() {\n    items.clear();\n    super.clear();\n  }\n\n  @override\n  void dispose() {\n    items.clear();\n    super.dispose();\n  }\n\n  TextPosition dragOffset(TextPosition position) {\n    final offset = position.offset;\n    for (final e in items) {\n      final range = e.range;\n      if (offset >= range.end) {\n        continue;\n      }\n      if (offset <= range.start) {\n        break;\n      }\n      if (e.isRich) {\n        if (offset * 2 > range.start + range.end) {\n          return TextPosition(offset: range.end);\n        } else {\n          return TextPosition(offset: range.start);\n        }\n      }\n    }\n    return position;\n  }\n\n  int tapOffsetSimple(int offset) {\n    for (final e in items) {\n      final range = e.range;\n      if (offset >= range.end) {\n        continue;\n      }\n      if (offset <= range.start) {\n        break;\n      }\n      if (e.isRich) {\n        if (offset * 2 > range.start + range.end) {\n          return range.end;\n        } else {\n          return range.start;\n        }\n      }\n    }\n    return offset;\n  }\n\n  int tapOffset(\n    int offset, {\n    required TextPainter textPainter,\n    required Offset localPos,\n    required Offset lastTapDownPosition,\n  }) {\n    for (final e in items) {\n      final range = e.range;\n      if (offset >= range.end) {\n        continue;\n      }\n      if (offset < range.start) {\n        break;\n      }\n      // emoji tap\n      if (offset == range.start) {\n        if (e.emote != null) {\n          final closestOffset = textPainter.getClosestGlyphForOffset(localPos);\n          if (closestOffset != null) {\n            final offsetRect = closestOffset.graphemeClusterLayoutBounds;\n            final offsetRange = closestOffset.graphemeClusterCodeUnitRange;\n            if (lastTapDownPosition.dx > offsetRect.right) {\n              return offsetRange.end;\n            } else {\n              return offsetRange.start;\n            }\n          }\n        }\n      } else {\n        if (e.isRich) {\n          if (offset * 2 > range.start + range.end) {\n            return range.end;\n          } else {\n            return range.start;\n          }\n        }\n      }\n    }\n    return offset;\n  }\n\n  ({int startOffset, int endOffset}) longPressOffset(\n    int startOffset,\n    int endOffset,\n  ) {\n    for (final e in items) {\n      final range = e.range;\n      if (startOffset >= range.end) {\n        continue;\n      }\n      if (endOffset <= range.start) {\n        break;\n      }\n      late final cal = range.start + range.end;\n      if (startOffset > range.start && startOffset < range.end) {\n        if (e.isRich) {\n          if (startOffset * 2 > cal) {\n            startOffset = range.end;\n          } else {\n            startOffset = range.start;\n          }\n        }\n      }\n      if (endOffset > range.start && endOffset < range.end) {\n        if (e.isRich) {\n          if (endOffset * 2 > cal) {\n            endOffset = range.end;\n          } else {\n            endOffset = range.start;\n          }\n        }\n      }\n    }\n    return (startOffset: startOffset, endOffset: endOffset);\n  }\n\n  TextSelection keyboardOffset(TextSelection newSelection) {\n    final offset = newSelection.baseOffset;\n    for (final e in items) {\n      final range = e.range;\n      if (offset >= range.end) {\n        continue;\n      }\n      if (offset <= range.start) {\n        break;\n      }\n      if (offset > range.start && offset < range.end) {\n        if (e.isRich) {\n          if (offset < selection.baseOffset) {\n            return newSelection.copyWith(\n              baseOffset: range.start,\n              extentOffset: range.start,\n            );\n          } else {\n            return newSelection.copyWith(\n              baseOffset: range.end,\n              extentOffset: range.end,\n            );\n          }\n        }\n      }\n    }\n    return newSelection;\n  }\n\n  TextSelection keyboardOffsets(TextSelection newSelection) {\n    final startOffset = newSelection.start;\n    final endOffset = newSelection.end;\n    final isNormalized = newSelection.baseOffset < newSelection.extentOffset;\n    for (final e in items) {\n      final range = e.range;\n      if (startOffset >= range.end) {\n        continue;\n      }\n      if (endOffset <= range.start) {\n        break;\n      }\n      if (isNormalized) {\n        if (startOffset <= range.start &&\n            endOffset > range.start &&\n            endOffset < range.end) {\n          if (e.isRich) {\n            if (endOffset < selection.extentOffset) {\n              return newSelection.copyWith(\n                baseOffset: startOffset,\n                extentOffset: range.start,\n              );\n            } else {\n              return newSelection.copyWith(\n                baseOffset: startOffset,\n                extentOffset: range.end,\n              );\n            }\n          }\n        }\n      } else {\n        if (startOffset < range.end && startOffset > range.start) {\n          if (e.isRich) {\n            if (startOffset > selection.extentOffset) {\n              return newSelection.copyWith(\n                baseOffset: endOffset,\n                extentOffset: range.end,\n              );\n            } else {\n              return newSelection.copyWith(\n                baseOffset: endOffset,\n                extentOffset: range.start,\n              );\n            }\n          }\n        }\n      }\n    }\n    return newSelection;\n  }\n\n  String? getSelectionText(TextSelection selection) {\n    try {\n      String text = '';\n      final start = selection.start;\n      final end = selection.end;\n      for (final e in items) {\n        final range = e.range;\n        if (start >= range.end) {\n          continue;\n        }\n        if (end <= range.start) {\n          break;\n        }\n        if (e.isRich) {\n          if (e.emote != null) {\n            text += e.rawText;\n          } else {\n            text += e.text;\n          }\n        } else {\n          text += e.text.substring(\n            max(start, range.start) - range.start,\n            min(end, range.end) - range.start,\n          );\n        }\n      }\n      return text;\n    } catch (e) {\n      if (kDebugMode) debugPrint('err getSelectionText: $e');\n      return null;\n    }\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/text_field/cupertino/adaptive_text_selection_toolbar.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n/// @docImport 'package:flutter/material.dart';\nlibrary;\n\nimport 'package:PiliPlus/common/widgets/flutter/text_field/editable_text.dart';\nimport 'package:flutter/cupertino.dart' hide EditableText, EditableTextState;\nimport 'package:flutter/foundation.dart' show defaultTargetPlatform;\nimport 'package:flutter/rendering.dart';\n\n/// The default Cupertino context menu for text selection for the current\n/// platform with the given children.\n///\n/// {@template flutter.cupertino.CupertinoAdaptiveTextSelectionToolbar.platforms}\n/// Builds the mobile Cupertino context menu on all mobile platforms, not just\n/// iOS, and builds the desktop Cupertino context menu on all desktop platforms,\n/// not just MacOS. For a widget that builds the native-looking context menu for\n/// all platforms, see [AdaptiveTextSelectionToolbar].\n/// {@endtemplate}\n///\n/// See also:\n///\n/// * [AdaptiveTextSelectionToolbar], which does the same thing as this widget\n///   but for all platforms, not just the Cupertino-styled platforms.\n/// * [CupertinoAdaptiveTextSelectionToolbar.getAdaptiveButtons], which builds\n///   the Cupertino button Widgets for the current platform given\n///   [ContextMenuButtonItem]s.\nclass CupertinoAdaptiveTextSelectionToolbar extends StatelessWidget {\n  /// Create an instance of [CupertinoAdaptiveTextSelectionToolbar] with the\n  /// given [children].\n  ///\n  /// See also:\n  ///\n  /// {@template flutter.cupertino.CupertinoAdaptiveTextSelectionToolbar.buttonItems}\n  /// * [CupertinoAdaptiveTextSelectionToolbar.buttonItems], which takes a list\n  ///   of [ContextMenuButtonItem]s instead of [children] widgets.\n  /// {@endtemplate}\n  /// {@template flutter.cupertino.CupertinoAdaptiveTextSelectionToolbar.editable}\n  /// * [CupertinoAdaptiveTextSelectionToolbar.editable], which builds the\n  ///   default Cupertino children for an editable field.\n  /// {@endtemplate}\n  /// {@template flutter.cupertino.CupertinoAdaptiveTextSelectionToolbar.editableText}\n  /// * [CupertinoAdaptiveTextSelectionToolbar.editableText], which builds the\n  ///   default Cupertino children for an [EditableText].\n  /// {@endtemplate}\n  /// {@template flutter.cupertino.CupertinoAdaptiveTextSelectionToolbar.selectable}\n  /// * [CupertinoAdaptiveTextSelectionToolbar.selectable], which builds the\n  ///   Cupertino children for content that is selectable but not editable.\n  /// {@endtemplate}\n  const CupertinoAdaptiveTextSelectionToolbar({\n    super.key,\n    required this.children,\n    required this.anchors,\n  }) : buttonItems = null;\n\n  /// Create an instance of [CupertinoAdaptiveTextSelectionToolbar] whose\n  /// children will be built from the given [buttonItems].\n  ///\n  /// See also:\n  ///\n  /// {@template flutter.cupertino.CupertinoAdaptiveTextSelectionToolbar.new}\n  /// * [CupertinoAdaptiveTextSelectionToolbar.new], which takes the children\n  ///   directly as a list of widgets.\n  /// {@endtemplate}\n  /// {@macro flutter.cupertino.CupertinoAdaptiveTextSelectionToolbar.editable}\n  /// {@macro flutter.cupertino.CupertinoAdaptiveTextSelectionToolbar.editableText}\n  /// {@macro flutter.cupertino.CupertinoAdaptiveTextSelectionToolbar.selectable}\n  const CupertinoAdaptiveTextSelectionToolbar.buttonItems({\n    super.key,\n    required this.buttonItems,\n    required this.anchors,\n  }) : children = null;\n\n  /// Create an instance of [CupertinoAdaptiveTextSelectionToolbar] with the\n  /// default children for an editable field.\n  ///\n  /// If a callback is null, then its corresponding button will not be built.\n  ///\n  /// See also:\n  ///\n  /// * [AdaptiveTextSelectionToolbar.editable], which is similar to this but\n  ///   includes Material and Cupertino toolbars.\n  /// {@macro flutter.cupertino.CupertinoAdaptiveTextSelectionToolbar.new}\n  /// {@macro flutter.cupertino.CupertinoAdaptiveTextSelectionToolbar.editableText}\n  /// {@macro flutter.cupertino.CupertinoAdaptiveTextSelectionToolbar.buttonItems}\n  /// {@macro flutter.cupertino.CupertinoAdaptiveTextSelectionToolbar.selectable}\n  CupertinoAdaptiveTextSelectionToolbar.editable({\n    super.key,\n    required ClipboardStatus clipboardStatus,\n    required VoidCallback? onCopy,\n    required VoidCallback? onCut,\n    required VoidCallback? onPaste,\n    required VoidCallback? onSelectAll,\n    required VoidCallback? onLookUp,\n    required VoidCallback? onSearchWeb,\n    required VoidCallback? onShare,\n    required VoidCallback? onLiveTextInput,\n    required this.anchors,\n  }) : children = null,\n       buttonItems = EditableText.getEditableButtonItems(\n         clipboardStatus: clipboardStatus,\n         onCopy: onCopy,\n         onCut: onCut,\n         onPaste: onPaste,\n         onSelectAll: onSelectAll,\n         onLookUp: onLookUp,\n         onSearchWeb: onSearchWeb,\n         onShare: onShare,\n         onLiveTextInput: onLiveTextInput,\n       );\n\n  /// Create an instance of [CupertinoAdaptiveTextSelectionToolbar] with the\n  /// default children for an [EditableText].\n  ///\n  /// See also:\n  ///\n  /// * [AdaptiveTextSelectionToolbar.editableText], which is similar to this\n  ///   but includes Material and Cupertino toolbars.\n  /// {@macro flutter.cupertino.CupertinoAdaptiveTextSelectionToolbar.new}\n  /// {@macro flutter.cupertino.CupertinoAdaptiveTextSelectionToolbar.editable}\n  /// {@macro flutter.cupertino.CupertinoAdaptiveTextSelectionToolbar.buttonItems}\n  /// {@macro flutter.cupertino.CupertinoAdaptiveTextSelectionToolbar.selectable}\n  CupertinoAdaptiveTextSelectionToolbar.editableText({\n    super.key,\n    required EditableTextState editableTextState,\n  }) : children = null,\n       buttonItems = editableTextState.contextMenuButtonItems,\n       anchors = editableTextState.contextMenuAnchors;\n\n  /// Create an instance of [CupertinoAdaptiveTextSelectionToolbar] with the\n  /// default children for selectable, but not editable, content.\n  ///\n  /// See also:\n  ///\n  /// * [AdaptiveTextSelectionToolbar.selectable], which is similar to this but\n  ///   includes Material and Cupertino toolbars.\n  /// {@macro flutter.cupertino.CupertinoAdaptiveTextSelectionToolbar.new}\n  /// {@macro flutter.cupertino.CupertinoAdaptiveTextSelectionToolbar.buttonItems}\n  /// {@macro flutter.cupertino.CupertinoAdaptiveTextSelectionToolbar.editable}\n  /// {@macro flutter.cupertino.CupertinoAdaptiveTextSelectionToolbar.editableText}\n  CupertinoAdaptiveTextSelectionToolbar.selectable({\n    super.key,\n    required VoidCallback onCopy,\n    required VoidCallback onSelectAll,\n    required SelectionGeometry selectionGeometry,\n    required this.anchors,\n  }) : children = null,\n       buttonItems = SelectableRegion.getSelectableButtonItems(\n         selectionGeometry: selectionGeometry,\n         onCopy: onCopy,\n         onSelectAll: onSelectAll,\n         onShare: null, // See https://github.com/flutter/flutter/issues/141775.\n       );\n\n  /// {@macro flutter.material.AdaptiveTextSelectionToolbar.anchors}\n  final TextSelectionToolbarAnchors anchors;\n\n  /// The children of the toolbar, typically buttons.\n  final List<Widget>? children;\n\n  /// The [ContextMenuButtonItem]s that will be turned into the correct button\n  /// widgets for the current platform.\n  final List<ContextMenuButtonItem>? buttonItems;\n\n  /// Returns a List of Widgets generated by turning [buttonItems] into the\n  /// default context menu buttons for Cupertino on the current platform.\n  ///\n  /// This is useful when building a text selection toolbar with the default\n  /// button appearance for the given platform, but where the toolbar and/or the\n  /// button actions and labels may be custom.\n  ///\n  /// Does not build Material buttons. On non-Apple platforms, Cupertino buttons\n  /// will still be used, because the Cupertino library does not access the\n  /// Material library. To get the native-looking buttons on every platform,\n  /// use [AdaptiveTextSelectionToolbar.getAdaptiveButtons] in the Material\n  /// library.\n  ///\n  /// See also:\n  ///\n  /// * [AdaptiveTextSelectionToolbar.getAdaptiveButtons], which is the Material\n  ///   equivalent of this class and builds only the Material buttons. It\n  ///   includes a live example of using `getAdaptiveButtons`.\n  static Iterable<Widget> getAdaptiveButtons(\n    BuildContext context,\n    List<ContextMenuButtonItem> buttonItems,\n  ) {\n    switch (defaultTargetPlatform) {\n      case TargetPlatform.android:\n      case TargetPlatform.fuchsia:\n      case TargetPlatform.iOS:\n        return buttonItems.map((ContextMenuButtonItem buttonItem) {\n          return CupertinoTextSelectionToolbarButton.buttonItem(\n            buttonItem: buttonItem,\n          );\n        });\n      case TargetPlatform.linux:\n      case TargetPlatform.windows:\n      case TargetPlatform.macOS:\n        return buttonItems.map((ContextMenuButtonItem buttonItem) {\n          return CupertinoDesktopTextSelectionToolbarButton.buttonItem(\n            buttonItem: buttonItem,\n          );\n        });\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    // If there aren't any buttons to build, build an empty toolbar.\n    if ((children ?? buttonItems)?.isEmpty ?? true) {\n      return const SizedBox.shrink();\n    }\n\n    final List<Widget> resultChildren =\n        children ?? getAdaptiveButtons(context, buttonItems!).toList();\n\n    switch (defaultTargetPlatform) {\n      case TargetPlatform.android:\n      case TargetPlatform.iOS:\n      case TargetPlatform.fuchsia:\n        return CupertinoTextSelectionToolbar(\n          anchorAbove: anchors.primaryAnchor,\n          anchorBelow: anchors.secondaryAnchor ?? anchors.primaryAnchor,\n          children: resultChildren,\n        );\n      case TargetPlatform.linux:\n      case TargetPlatform.windows:\n      case TargetPlatform.macOS:\n        return CupertinoDesktopTextSelectionToolbar(\n          anchor: anchors.primaryAnchor,\n          children: resultChildren,\n        );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/text_field/cupertino/spell_check_suggestions_toolbar.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n/// @docImport 'package:flutter/material.dart';\nlibrary;\n\nimport 'package:PiliPlus/common/widgets/flutter/text_field/editable_text.dart';\nimport 'package:flutter/cupertino.dart' hide EditableText, EditableTextState;\nimport 'package:flutter/scheduler.dart';\nimport 'package:flutter/services.dart'\n    show SelectionChangedCause, SuggestionSpan;\n\n/// iOS only shows 3 spell check suggestions in the toolbar.\nconst int _kMaxSuggestions = 3;\n\n/// The default spell check suggestions toolbar for iOS.\n///\n/// Tries to position itself below the [anchors], but if it doesn't fit, then it\n/// readjusts to fit above bottom view insets.\n///\n/// See also:\n///  * [SpellCheckSuggestionsToolbar], which is similar but for both the\n///    Material and Cupertino libraries.\nclass CupertinoSpellCheckSuggestionsToolbar extends StatelessWidget {\n  /// Constructs a [CupertinoSpellCheckSuggestionsToolbar].\n  ///\n  /// [buttonItems] must not contain more than three items.\n  const CupertinoSpellCheckSuggestionsToolbar({\n    super.key,\n    required this.anchors,\n    required this.buttonItems,\n  }) : assert(buttonItems.length <= _kMaxSuggestions);\n\n  /// Constructs a [CupertinoSpellCheckSuggestionsToolbar] with the default\n  /// children for an [EditableText].\n  ///\n  /// See also:\n  ///  * [SpellCheckSuggestionsToolbar.editableText], which is similar but\n  ///    builds an Android-style toolbar.\n  CupertinoSpellCheckSuggestionsToolbar.editableText({\n    super.key,\n    required EditableTextState editableTextState,\n  }) : buttonItems =\n           buildButtonItems(editableTextState) ?? <ContextMenuButtonItem>[],\n       anchors = editableTextState.contextMenuAnchors;\n\n  /// The location on which to anchor the menu.\n  final TextSelectionToolbarAnchors anchors;\n\n  /// The [ContextMenuButtonItem]s that will be turned into the correct button\n  /// widgets and displayed in the spell check suggestions toolbar.\n  ///\n  /// Must not contain more than three items.\n  ///\n  /// See also:\n  ///\n  ///  * [AdaptiveTextSelectionToolbar.buttonItems], the list of\n  ///    [ContextMenuButtonItem]s that are used to build the buttons of the\n  ///    text selection toolbar.\n  ///  * [SpellCheckSuggestionsToolbar.buttonItems], the list of\n  ///    [ContextMenuButtonItem]s used to build the Material style spell check\n  ///    suggestions toolbar.\n  final List<ContextMenuButtonItem> buttonItems;\n\n  /// Builds the button items for the toolbar based on the available\n  /// spell check suggestions.\n  static List<ContextMenuButtonItem>? buildButtonItems(\n    EditableTextState editableTextState,\n  ) {\n    // Determine if composing region is misspelled.\n    final SuggestionSpan? spanAtCursorIndex = editableTextState\n        .findSuggestionSpanAtCursorIndex(\n          editableTextState.currentTextEditingValue.selection.baseOffset,\n        );\n\n    if (spanAtCursorIndex == null) {\n      return null;\n    }\n    if (spanAtCursorIndex.suggestions.isEmpty) {\n      assert(debugCheckHasCupertinoLocalizations(editableTextState.context));\n      final CupertinoLocalizations localizations = CupertinoLocalizations.of(\n        editableTextState.context,\n      );\n      return <ContextMenuButtonItem>[\n        ContextMenuButtonItem(\n          onPressed: null,\n          label: localizations.noSpellCheckReplacementsLabel,\n        ),\n      ];\n    }\n\n    final buttonItems = <ContextMenuButtonItem>[];\n\n    // Build suggestion buttons.\n    for (final String suggestion in spanAtCursorIndex.suggestions.take(\n      _kMaxSuggestions,\n    )) {\n      buttonItems.add(\n        ContextMenuButtonItem(\n          onPressed: () {\n            if (!editableTextState.mounted) {\n              return;\n            }\n            _replaceText(\n              editableTextState,\n              suggestion,\n              spanAtCursorIndex.range,\n            );\n          },\n          label: suggestion,\n        ),\n      );\n    }\n    return buttonItems;\n  }\n\n  static void _replaceText(\n    EditableTextState editableTextState,\n    String text,\n    TextRange replacementRange,\n  ) {\n    // Replacement cannot be performed if the text is read only or obscured.\n    assert(\n      !editableTextState.widget.readOnly &&\n          !editableTextState.widget.obscureText,\n    );\n\n    final TextEditingValue newValue = editableTextState.textEditingValue\n        .replaced(replacementRange, text)\n        .copyWith(\n          selection: TextSelection.collapsed(\n            offset: replacementRange.start + text.length,\n          ),\n        );\n    editableTextState.userUpdateTextEditingValue(\n      newValue,\n      SelectionChangedCause.toolbar,\n    );\n\n    // Schedule a call to bringIntoView() after renderEditable updates.\n    SchedulerBinding.instance.addPostFrameCallback((Duration duration) {\n      if (editableTextState.mounted) {\n        editableTextState.bringIntoView(\n          editableTextState.textEditingValue.selection.extent,\n        );\n      }\n    }, debugLabel: 'SpellCheckSuggestions.bringIntoView');\n    editableTextState.hideToolbar();\n  }\n\n  /// Builds the toolbar buttons based on the [buttonItems].\n  List<Widget> _buildToolbarButtons(BuildContext context) {\n    return buttonItems.map((ContextMenuButtonItem buttonItem) {\n      return CupertinoTextSelectionToolbarButton.buttonItem(\n        buttonItem: buttonItem,\n      );\n    }).toList();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    if (buttonItems.isEmpty) {\n      return const SizedBox.shrink();\n    }\n\n    final List<Widget> children = _buildToolbarButtons(context);\n    return CupertinoTextSelectionToolbar(\n      anchorAbove: anchors.primaryAnchor,\n      anchorBelow: anchors.secondaryAnchor == null\n          ? anchors.primaryAnchor\n          : anchors.secondaryAnchor!,\n      children: children,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/text_field/cupertino/text_field.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n/// @docImport 'package:flutter/material.dart';\nlibrary;\n\nimport 'dart:math' as math;\nimport 'dart:ui' as ui show BoxHeightStyle, BoxWidthStyle;\n\nimport 'package:PiliPlus/common/widgets/flutter/text_field/controller.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text_field/cupertino/adaptive_text_selection_toolbar.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text_field/cupertino/spell_check_suggestions_toolbar.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text_field/editable_text.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text_field/spell_check.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text_field/system_context_menu.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text_field/text_selection.dart';\nimport 'package:flutter/cupertino.dart'\n    hide\n        EditableText,\n        EditableTextState,\n        CupertinoSpellCheckSuggestionsToolbar,\n        EditableTextContextMenuBuilder,\n        SystemContextMenu,\n        CupertinoAdaptiveTextSelectionToolbar,\n        SpellCheckConfiguration,\n        TextSelectionGestureDetectorBuilderDelegate,\n        TextSelectionGestureDetectorBuilder,\n        TextSelectionOverlay;\nimport 'package:flutter/foundation.dart' show defaultTargetPlatform;\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/rendering.dart';\nimport 'package:flutter/services.dart';\n\nconst TextStyle _kDefaultPlaceholderStyle = TextStyle(\n  fontWeight: FontWeight.w400,\n  color: CupertinoColors.placeholderText,\n);\n\n// Value inspected from Xcode 11 & iOS 13.0 Simulator.\nconst BorderSide _kDefaultRoundedBorderSide = BorderSide(\n  color: CupertinoDynamicColor.withBrightness(\n    color: Color(0x33000000),\n    darkColor: Color(0x33FFFFFF),\n  ),\n  width: 0.0,\n);\nconst Border _kDefaultRoundedBorder = Border(\n  top: _kDefaultRoundedBorderSide,\n  bottom: _kDefaultRoundedBorderSide,\n  left: _kDefaultRoundedBorderSide,\n  right: _kDefaultRoundedBorderSide,\n);\n\nconst BoxDecoration _kDefaultRoundedBorderDecoration = BoxDecoration(\n  color: CupertinoDynamicColor.withBrightness(\n    color: CupertinoColors.white,\n    darkColor: CupertinoColors.black,\n  ),\n  border: _kDefaultRoundedBorder,\n  borderRadius: BorderRadius.all(Radius.circular(5.0)),\n);\n\nconst Color _kDisabledBackground = CupertinoDynamicColor.withBrightness(\n  color: Color(0xFFFAFAFA),\n  darkColor: Color(0xFF050505),\n);\n\n// Value inspected from Xcode 12 & iOS 14.0 Simulator.\n// Note it may not be consistent with https://developer.apple.com/design/resources/.\nconst CupertinoDynamicColor _kClearButtonColor =\n    CupertinoDynamicColor.withBrightness(\n      color: Color(0x33000000),\n      darkColor: Color(0x33FFFFFF),\n    );\n\n// An eyeballed value that moves the cursor slightly left of where it is\n// rendered for text on Android so it's positioning more accurately matches the\n// native iOS text cursor positioning.\n//\n// This value is in device pixels, not logical pixels as is typically used\n// throughout the codebase.\nconst int _iOSHorizontalCursorOffsetPixels = -2;\n\nclass _CupertinoTextFieldSelectionGestureDetectorBuilder\n    extends TextSelectionGestureDetectorBuilder {\n  _CupertinoTextFieldSelectionGestureDetectorBuilder({\n    required _CupertinoRichTextFieldState state,\n    required super.controller,\n  }) : _state = state,\n       super(delegate: state);\n\n  final _CupertinoRichTextFieldState _state;\n\n  @override\n  void onSingleTapUp(TapDragUpDetails details) {\n    // Because TextSelectionGestureDetector listens to taps that happen on\n    // widgets in front of it, tapping the clear button will also trigger\n    // this handler. If the clear button widget recognizes the up event,\n    // then do not handle it.\n    if (_state._clearGlobalKey.currentContext != null) {\n      final renderBox =\n          _state._clearGlobalKey.currentContext!.findRenderObject()!\n              as RenderBox;\n      final Offset localOffset = renderBox.globalToLocal(\n        details.globalPosition,\n      );\n      if (renderBox.hitTest(BoxHitTestResult(), position: localOffset)) {\n        return;\n      }\n    }\n    super.onSingleTapUp(details);\n    _state.widget.onTap?.call();\n  }\n\n  @override\n  void onDragSelectionEnd(TapDragEndDetails details) {\n    _state._requestKeyboard();\n    super.onDragSelectionEnd(details);\n  }\n}\n\n/// An iOS-style text field.\n///\n/// A text field lets the user enter text, either with a hardware keyboard or with\n/// an onscreen keyboard.\n///\n/// This widget corresponds to both a `UITextField` and an editable `UITextView`\n/// on iOS.\n///\n/// The text field calls the [onChanged] callback whenever the user changes the\n/// text in the field. If the user indicates that they are done typing in the\n/// field (e.g., by pressing a button on the soft keyboard), the text field\n/// calls the [onSubmitted] callback.\n///\n/// {@macro flutter.widgets.EditableText.onChanged}\n///\n/// {@tool dartpad}\n/// This example shows how to set the initial value of the [CupertinoRichTextField] using\n/// a [controller] that already contains some text.\n///\n/// ** See code in examples/api/lib/cupertino/text_field/cupertino_text_field.0.dart **\n/// {@end-tool}\n///\n/// The [controller] can also control the selection and composing region (and to\n/// observe changes to the text, selection, and composing region).\n///\n/// The text field has an overridable [decoration] that, by default, draws a\n/// rounded rectangle border around the text field. If you set the [decoration]\n/// property to null, the decoration will be removed entirely.\n///\n/// {@macro flutter.material.textfield.wantKeepAlive}\n///\n/// Remember to call [RichTextEditingController.dispose] when it is no longer\n/// needed. This will ensure we discard any resources used by the object.\n///\n/// {@macro flutter.widgets.editableText.showCaretOnScreen}\n///\n/// ## Scrolling Considerations\n///\n/// If this [CupertinoRichTextField] is not a descendant of [Scaffold] and is being\n/// used within a [Scrollable] or nested [Scrollable]s, consider placing a\n/// [ScrollNotificationObserver] above the root [Scrollable] that contains this\n/// [CupertinoRichTextField] to ensure proper scroll coordination for\n/// [CupertinoRichTextField] and its components like [TextSelectionOverlay].\n///\n/// See also:\n///\n///  * <https://developer.apple.com/documentation/uikit/uitextfield>\n///  * [TextField], an alternative text field widget that follows the Material\n///    Design UI conventions.\n///  * [EditableText], which is the raw text editing control at the heart of a\n///    [TextField].\n///  * Learn how to use a [RichTextEditingController] in one of our [cookbook recipes](https://docs.flutter.dev/cookbook/forms/text-field-changes#2-use-a-texteditingcontroller).\n///  * <https://developer.apple.com/design/human-interface-guidelines/ios/controls/text-fields/>\nclass CupertinoRichTextField extends StatefulWidget {\n  /// Creates an iOS-style text field.\n  ///\n  /// To provide a prefilled text entry, pass in a [RichTextEditingController] with\n  /// an initial value to the [controller] parameter.\n  ///\n  /// To provide a hint placeholder text that appears when the text entry is\n  /// empty, pass a [String] to the [placeholder] parameter.\n  ///\n  /// The [maxLines] property can be set to null to remove the restriction on\n  /// the number of lines. In this mode, the intrinsic height of the widget will\n  /// grow as the number of lines of text grows. By default, it is `1`, meaning\n  /// this is a single-line text field and will scroll horizontally when\n  /// it overflows. [maxLines] must not be zero.\n  ///\n  /// The text cursor is not shown if [showCursor] is false or if [showCursor]\n  /// is null (the default) and [readOnly] is true.\n  ///\n  /// If specified, the [maxLength] property must be greater than zero.\n  ///\n  /// The [selectionHeightStyle] and [selectionWidthStyle] properties allow\n  /// changing the shape of the selection highlighting. These properties default\n  /// to [EditableText.defaultSelectionHeightStyle] and\n  /// [EditableText.defaultSelectionWidthStyle], respectively.\n  ///\n  /// The [autocorrect], [autofocus], [clearButtonMode], [dragStartBehavior],\n  /// [expands], [obscureText], [prefixMode], [readOnly], [scrollPadding],\n  /// [suffixMode], [textAlign], [selectionHeightStyle], [selectionWidthStyle],\n  /// [enableSuggestions], and [enableIMEPersonalizedLearning] properties must\n  /// not be null.\n  ///\n  /// {@macro flutter.widgets.editableText.accessibility}\n  ///\n  /// See also:\n  ///\n  ///  * [minLines], which is the minimum number of lines to occupy when the\n  ///    content spans fewer lines.\n  ///  * [expands], to allow the widget to size itself to its parent's height.\n  ///  * [maxLength], which discusses the precise meaning of \"number of\n  ///    characters\" and how it may differ from the intuitive meaning.\n  const CupertinoRichTextField({\n    super.key,\n    this.groupId = EditableText,\n    required this.controller,\n    this.focusNode,\n    this.decoration = _kDefaultRoundedBorderDecoration,\n    this.padding = const EdgeInsets.all(7.0),\n    this.placeholder,\n    this.placeholderStyle = const TextStyle(\n      fontWeight: FontWeight.w400,\n      color: CupertinoColors.placeholderText,\n    ),\n    this.prefix,\n    this.prefixMode = OverlayVisibilityMode.always,\n    this.suffix,\n    this.suffixMode = OverlayVisibilityMode.always,\n    this.crossAxisAlignment = CrossAxisAlignment.center,\n    this.clearButtonMode = OverlayVisibilityMode.never,\n    this.clearButtonSemanticLabel,\n    TextInputType? keyboardType,\n    this.textInputAction,\n    this.textCapitalization = TextCapitalization.none,\n    this.style,\n    this.strutStyle,\n    this.textAlign = TextAlign.start,\n    this.textAlignVertical,\n    this.textDirection,\n    this.readOnly = false,\n    @Deprecated(\n      'Use `contextMenuBuilder` instead. '\n      'This feature was deprecated after v3.3.0-0.5.pre.',\n    )\n    this.toolbarOptions,\n    this.showCursor,\n    this.autofocus = false,\n    this.obscuringCharacter = '•',\n    this.obscureText = false,\n    this.autocorrect = true,\n    SmartDashesType? smartDashesType,\n    SmartQuotesType? smartQuotesType,\n    this.enableSuggestions = true,\n    this.maxLines = 1,\n    this.minLines,\n    this.expands = false,\n    this.maxLength,\n    this.maxLengthEnforcement,\n    this.onChanged,\n    this.onEditingComplete,\n    this.onSubmitted,\n    this.onTapOutside,\n    this.onTapUpOutside,\n    this.inputFormatters,\n    this.enabled = true,\n    this.cursorWidth = 2.0,\n    this.cursorHeight,\n    this.cursorRadius = const Radius.circular(2.0),\n    this.cursorOpacityAnimates = true,\n    this.cursorColor,\n    this.selectionHeightStyle,\n    this.selectionWidthStyle,\n    this.keyboardAppearance,\n    this.scrollPadding = const EdgeInsets.all(20.0),\n    this.dragStartBehavior = DragStartBehavior.start,\n    bool? enableInteractiveSelection,\n    this.selectAllOnFocus,\n    this.selectionControls,\n    this.onTap,\n    this.scrollController,\n    this.scrollPhysics,\n    this.autofillHints = const <String>[],\n    this.contentInsertionConfiguration,\n    this.clipBehavior = Clip.hardEdge,\n    this.restorationId,\n    @Deprecated(\n      'Use `stylusHandwritingEnabled` instead. '\n      'This feature was deprecated after v3.27.0-0.2.pre.',\n    )\n    this.scribbleEnabled = true,\n    this.stylusHandwritingEnabled =\n        EditableText.defaultStylusHandwritingEnabled,\n    this.enableIMEPersonalizedLearning = true,\n    this.contextMenuBuilder = _defaultContextMenuBuilder,\n    this.spellCheckConfiguration,\n    this.magnifierConfiguration,\n  }) : assert(obscuringCharacter.length == 1),\n       smartDashesType =\n           smartDashesType ??\n           (obscureText ? SmartDashesType.disabled : SmartDashesType.enabled),\n       smartQuotesType =\n           smartQuotesType ??\n           (obscureText ? SmartQuotesType.disabled : SmartQuotesType.enabled),\n       assert(maxLines == null || maxLines > 0),\n       assert(minLines == null || minLines > 0),\n       assert(\n         (maxLines == null) || (minLines == null) || (maxLines >= minLines),\n         \"minLines can't be greater than maxLines\",\n       ),\n       assert(\n         !expands || (maxLines == null && minLines == null),\n         'minLines and maxLines must be null when expands is true.',\n       ),\n       assert(\n         !obscureText || maxLines == 1,\n         'Obscured fields cannot be multiline.',\n       ),\n       assert(maxLength == null || maxLength > 0),\n       // Assert the following instead of setting it directly to avoid surprising the user by silently changing the value they set.\n       assert(\n         !identical(textInputAction, TextInputAction.newline) ||\n             maxLines == 1 ||\n             !identical(keyboardType, TextInputType.text),\n         'Use keyboardType TextInputType.multiline when using TextInputAction.newline on a multiline TextField.',\n       ),\n       keyboardType =\n           keyboardType ??\n           (maxLines == 1 ? TextInputType.text : TextInputType.multiline),\n       enableInteractiveSelection =\n           enableInteractiveSelection ?? (!readOnly || !obscureText);\n\n  /// Creates a borderless iOS-style text field.\n  ///\n  /// To provide a prefilled text entry, pass in a [RichTextEditingController] with\n  /// an initial value to the [controller] parameter.\n  ///\n  /// To provide a hint placeholder text that appears when the text entry is\n  /// empty, pass a [String] to the [placeholder] parameter.\n  ///\n  /// The [maxLines] property can be set to null to remove the restriction on\n  /// the number of lines. In this mode, the intrinsic height of the widget will\n  /// grow as the number of lines of text grows. By default, it is `1`, meaning\n  /// this is a single-line text field and will scroll horizontally when\n  /// it overflows. [maxLines] must not be zero.\n  ///\n  /// The text cursor is not shown if [showCursor] is false or if [showCursor]\n  /// is null (the default) and [readOnly] is true.\n  ///\n  /// If specified, the [maxLength] property must be greater than zero.\n  ///\n  /// The [selectionHeightStyle] and [selectionWidthStyle] properties allow\n  /// changing the shape of the selection highlighting. These properties default\n  /// to [ui.BoxHeightStyle.tight] and [ui.BoxWidthStyle.tight] respectively.\n  ///\n  /// See also:\n  ///\n  ///  * [minLines], which is the minimum number of lines to occupy when the\n  ///    content spans fewer lines.\n  ///  * [expands], to allow the widget to size itself to its parent's height.\n  ///  * [maxLength], which discusses the precise meaning of \"number of\n  ///    characters\" and how it may differ from the intuitive meaning.\n  const CupertinoRichTextField.borderless({\n    super.key,\n    this.groupId = EditableText,\n    required this.controller,\n    this.focusNode,\n    this.decoration,\n    this.padding = const EdgeInsets.all(7.0),\n    this.placeholder,\n    this.placeholderStyle = _kDefaultPlaceholderStyle,\n    this.prefix,\n    this.prefixMode = OverlayVisibilityMode.always,\n    this.suffix,\n    this.suffixMode = OverlayVisibilityMode.always,\n    this.crossAxisAlignment = CrossAxisAlignment.center,\n    this.clearButtonMode = OverlayVisibilityMode.never,\n    this.clearButtonSemanticLabel,\n    TextInputType? keyboardType,\n    this.textInputAction,\n    this.textCapitalization = TextCapitalization.none,\n    this.style,\n    this.strutStyle,\n    this.textAlign = TextAlign.start,\n    this.textAlignVertical,\n    this.textDirection,\n    this.readOnly = false,\n    @Deprecated(\n      'Use `contextMenuBuilder` instead. '\n      'This feature was deprecated after v3.3.0-0.5.pre.',\n    )\n    this.toolbarOptions,\n    this.showCursor,\n    this.autofocus = false,\n    this.obscuringCharacter = '•',\n    this.obscureText = false,\n    this.autocorrect,\n    SmartDashesType? smartDashesType,\n    SmartQuotesType? smartQuotesType,\n    this.enableSuggestions = true,\n    this.maxLines = 1,\n    this.minLines,\n    this.expands = false,\n    this.maxLength,\n    this.maxLengthEnforcement,\n    this.onChanged,\n    this.onEditingComplete,\n    this.onSubmitted,\n    this.onTapOutside,\n    this.onTapUpOutside,\n    this.inputFormatters,\n    this.enabled = true,\n    this.cursorWidth = 2.0,\n    this.cursorHeight,\n    this.cursorRadius = const Radius.circular(2.0),\n    this.cursorOpacityAnimates = true,\n    this.cursorColor,\n    this.selectionHeightStyle,\n    this.selectionWidthStyle,\n    this.keyboardAppearance,\n    this.scrollPadding = const EdgeInsets.all(20.0),\n    this.dragStartBehavior = DragStartBehavior.start,\n    bool? enableInteractiveSelection,\n    this.selectAllOnFocus,\n    this.selectionControls,\n    this.onTap,\n    this.scrollController,\n    this.scrollPhysics,\n    this.autofillHints = const <String>[],\n    this.contentInsertionConfiguration,\n    this.clipBehavior = Clip.hardEdge,\n    this.restorationId,\n    @Deprecated(\n      'Use `stylusHandwritingEnabled` instead. '\n      'This feature was deprecated after v3.27.0-0.2.pre.',\n    )\n    this.scribbleEnabled = true,\n    this.stylusHandwritingEnabled = true,\n    this.enableIMEPersonalizedLearning = true,\n    this.contextMenuBuilder = _defaultContextMenuBuilder,\n    this.spellCheckConfiguration,\n    this.magnifierConfiguration,\n  }) : assert(obscuringCharacter.length == 1),\n       smartDashesType =\n           smartDashesType ??\n           (obscureText ? SmartDashesType.disabled : SmartDashesType.enabled),\n       smartQuotesType =\n           smartQuotesType ??\n           (obscureText ? SmartQuotesType.disabled : SmartQuotesType.enabled),\n       assert(maxLines == null || maxLines > 0),\n       assert(minLines == null || minLines > 0),\n       assert(\n         (maxLines == null) || (minLines == null) || (maxLines >= minLines),\n         \"minLines can't be greater than maxLines\",\n       ),\n       assert(\n         !expands || (maxLines == null && minLines == null),\n         'minLines and maxLines must be null when expands is true.',\n       ),\n       assert(\n         !obscureText || maxLines == 1,\n         'Obscured fields cannot be multiline.',\n       ),\n       assert(maxLength == null || maxLength > 0),\n       // Assert the following instead of setting it directly to avoid surprising the user by silently changing the value they set.\n       assert(\n         !identical(textInputAction, TextInputAction.newline) ||\n             maxLines == 1 ||\n             !identical(keyboardType, TextInputType.text),\n         'Use keyboardType TextInputType.multiline when using TextInputAction.newline on a multiline TextField.',\n       ),\n       keyboardType =\n           keyboardType ??\n           (maxLines == 1 ? TextInputType.text : TextInputType.multiline),\n       enableInteractiveSelection =\n           enableInteractiveSelection ?? (!readOnly || !obscureText);\n\n  /// {@macro flutter.widgets.editableText.groupId}\n  final Object groupId;\n\n  /// Controls the text being edited.\n  ///\n  /// If null, this widget will create its own [RichTextEditingController].\n  final RichTextEditingController controller;\n\n  /// {@macro flutter.widgets.Focus.focusNode}\n  final FocusNode? focusNode;\n\n  /// Controls the [BoxDecoration] of the box behind the text input.\n  ///\n  /// Defaults to having a rounded rectangle grey border and can be null to have\n  /// no box decoration.\n  final BoxDecoration? decoration;\n\n  /// Padding around the text entry area between the [prefix] and [suffix]\n  /// or the clear button when [clearButtonMode] is not never.\n  ///\n  /// Defaults to a padding of 6 pixels on all sides and can be null.\n  final EdgeInsetsGeometry padding;\n\n  /// A lighter colored placeholder hint that appears on the first line of the\n  /// text field when the text entry is empty.\n  ///\n  /// Defaults to having no placeholder text.\n  ///\n  /// The text style of the placeholder text matches that of the text field's\n  /// main text entry except a lighter font weight and a grey font color.\n  final String? placeholder;\n\n  /// The style to use for the placeholder text.\n  ///\n  /// The [placeholderStyle] is merged with the [style] [TextStyle] when applied\n  /// to the [placeholder] text. To avoid merging with [style], specify\n  /// [TextStyle.inherit] as false.\n  ///\n  /// Defaults to the [style] property with w300 font weight and grey color.\n  ///\n  /// If specifically set to null, placeholder's style will be the same as [style].\n  final TextStyle? placeholderStyle;\n\n  /// An optional [Widget] to display before the text.\n  final Widget? prefix;\n\n  /// Controls the visibility of the [prefix] widget based on the state of\n  /// text entry when the [prefix] argument is not null.\n  ///\n  /// Defaults to [OverlayVisibilityMode.always].\n  ///\n  /// Has no effect when [prefix] is null.\n  final OverlayVisibilityMode prefixMode;\n\n  /// An optional [Widget] to display after the text.\n  final Widget? suffix;\n\n  /// Controls the visibility of the [suffix] widget based on the state of\n  /// text entry when the [suffix] argument is not null.\n  ///\n  /// Defaults to [OverlayVisibilityMode.always].\n  ///\n  /// Has no effect when [suffix] is null.\n  final OverlayVisibilityMode suffixMode;\n\n  /// Controls the vertical alignment of the [prefix] and the [suffix] widget in relation to content.\n  ///\n  /// Defaults to [CrossAxisAlignment.center].\n  ///\n  /// Has no effect when both the [prefix] and [suffix] are null.\n  final CrossAxisAlignment crossAxisAlignment;\n\n  /// Show an iOS-style clear button to clear the current text entry.\n  ///\n  /// Can be made to appear depending on various text states of the\n  /// [RichTextEditingController].\n  ///\n  /// Will only appear if no [suffix] widget is appearing.\n  ///\n  /// Defaults to [OverlayVisibilityMode.never].\n  final OverlayVisibilityMode clearButtonMode;\n\n  /// The semantic label for the clear button used by screen readers.\n  ///\n  /// This will be used by screen reading software to identify the clear button\n  /// widget. Defaults to \"Clear\".\n  final String? clearButtonSemanticLabel;\n\n  /// {@macro flutter.widgets.editableText.keyboardType}\n  final TextInputType keyboardType;\n\n  /// The type of action button to use for the keyboard.\n  ///\n  /// Defaults to [TextInputAction.newline] if [keyboardType] is\n  /// [TextInputType.multiline] and [TextInputAction.done] otherwise.\n  final TextInputAction? textInputAction;\n\n  /// {@macro flutter.widgets.editableText.textCapitalization}\n  final TextCapitalization textCapitalization;\n\n  /// The style to use for the text being edited.\n  ///\n  /// Also serves as a base for the [placeholder] text's style.\n  ///\n  /// Defaults to the standard iOS font style from [CupertinoTheme] if null.\n  final TextStyle? style;\n\n  /// {@macro flutter.widgets.editableText.strutStyle}\n  final StrutStyle? strutStyle;\n\n  /// {@macro flutter.widgets.editableText.textAlign}\n  final TextAlign textAlign;\n\n  /// Configuration of toolbar options.\n  ///\n  /// If not set, select all and paste will default to be enabled. Copy and cut\n  /// will be disabled if [obscureText] is true. If [readOnly] is true,\n  /// paste and cut will be disabled regardless.\n  @Deprecated(\n    'Use `contextMenuBuilder` instead. '\n    'This feature was deprecated after v3.3.0-0.5.pre.',\n  )\n  final ToolbarOptions? toolbarOptions;\n\n  /// {@macro flutter.material.InputDecorator.textAlignVertical}\n  final TextAlignVertical? textAlignVertical;\n\n  /// {@macro flutter.widgets.editableText.textDirection}\n  final TextDirection? textDirection;\n\n  /// {@macro flutter.widgets.editableText.readOnly}\n  final bool readOnly;\n\n  /// {@macro flutter.widgets.editableText.showCursor}\n  final bool? showCursor;\n\n  /// {@macro flutter.widgets.editableText.autofocus}\n  final bool autofocus;\n\n  /// {@macro flutter.widgets.editableText.obscuringCharacter}\n  final String obscuringCharacter;\n\n  /// {@macro flutter.widgets.editableText.obscureText}\n  final bool obscureText;\n\n  /// {@macro flutter.widgets.editableText.autocorrect}\n  final bool? autocorrect;\n\n  /// {@macro flutter.services.TextInputConfiguration.smartDashesType}\n  final SmartDashesType smartDashesType;\n\n  /// {@macro flutter.services.TextInputConfiguration.smartQuotesType}\n  final SmartQuotesType smartQuotesType;\n\n  /// {@macro flutter.services.TextInputConfiguration.enableSuggestions}\n  final bool enableSuggestions;\n\n  /// {@macro flutter.widgets.editableText.maxLines}\n  ///  * [expands], which determines whether the field should fill the height of\n  ///    its parent.\n  final int? maxLines;\n\n  /// {@macro flutter.widgets.editableText.minLines}\n  ///  * [expands], which determines whether the field should fill the height of\n  ///    its parent.\n  final int? minLines;\n\n  /// {@macro flutter.widgets.editableText.expands}\n  final bool expands;\n\n  /// The maximum number of characters (Unicode grapheme clusters) to allow in\n  /// the text field.\n  ///\n  /// After [maxLength] characters have been input, additional input\n  /// is ignored, unless [maxLengthEnforcement] is set to\n  /// [MaxLengthEnforcement.none].\n  ///\n  /// The TextField enforces the length with a\n  /// [LengthLimitingTextInputFormatter], which is evaluated after the supplied\n  /// [inputFormatters], if any.\n  ///\n  /// This value must be either null or greater than zero. If set to null\n  /// (the default), there is no limit to the number of characters allowed.\n  ///\n  /// Whitespace characters (e.g. newline, space, tab) are included in the\n  /// character count.\n  ///\n  /// {@macro flutter.services.lengthLimitingTextInputFormatter.maxLength}\n  final int? maxLength;\n\n  /// Determines how the [maxLength] limit should be enforced.\n  ///\n  /// If [MaxLengthEnforcement.none] is set, additional input beyond [maxLength]\n  /// will not be enforced by the limit.\n  ///\n  /// {@macro flutter.services.textFormatter.effectiveMaxLengthEnforcement}\n  ///\n  /// {@macro flutter.services.textFormatter.maxLengthEnforcement}\n  final MaxLengthEnforcement? maxLengthEnforcement;\n\n  /// {@macro flutter.widgets.editableText.onChanged}\n  final ValueChanged<String>? onChanged;\n\n  /// {@macro flutter.widgets.editableText.onEditingComplete}\n  final VoidCallback? onEditingComplete;\n\n  /// {@macro flutter.widgets.editableText.onSubmitted}\n  ///\n  /// See also:\n  ///\n  ///  * [TextInputAction.next] and [TextInputAction.previous], which\n  ///    automatically shift the focus to the next/previous focusable item when\n  ///    the user is done editing.\n  final ValueChanged<String>? onSubmitted;\n\n  /// {@macro flutter.widgets.editableText.onTapOutside}\n  final TapRegionCallback? onTapOutside;\n\n  /// {@macro flutter.widgets.editableText.onTapUpOutside}\n  final TapRegionCallback? onTapUpOutside;\n\n  /// {@macro flutter.widgets.editableText.inputFormatters}\n  final List<TextInputFormatter>? inputFormatters;\n\n  /// Disables the text field when false.\n  ///\n  /// Text fields in disabled states have a light grey background and don't\n  /// respond to touch events including the [prefix], [suffix] and the clear\n  /// button.\n  ///\n  /// Defaults to true.\n  final bool enabled;\n\n  /// {@macro flutter.widgets.editableText.cursorWidth}\n  final double cursorWidth;\n\n  /// {@macro flutter.widgets.editableText.cursorHeight}\n  final double? cursorHeight;\n\n  /// {@macro flutter.widgets.editableText.cursorRadius}\n  final Radius cursorRadius;\n\n  /// {@macro flutter.widgets.editableText.cursorOpacityAnimates}\n  final bool cursorOpacityAnimates;\n\n  /// The color to use when painting the cursor.\n  ///\n  /// Defaults to the [DefaultSelectionStyle.cursorColor]. If that color is\n  /// null, it uses the [CupertinoThemeData.primaryColor] of the ambient theme,\n  /// which itself defaults to [CupertinoColors.activeBlue] in the light theme\n  /// and [CupertinoColors.activeOrange] in the dark theme.\n  final Color? cursorColor;\n\n  /// Controls how tall the selection highlight boxes are computed to be.\n  ///\n  /// See [ui.BoxHeightStyle] for details on available styles.\n  final ui.BoxHeightStyle? selectionHeightStyle;\n\n  /// Controls how wide the selection highlight boxes are computed to be.\n  ///\n  /// See [ui.BoxWidthStyle] for details on available styles.\n  final ui.BoxWidthStyle? selectionWidthStyle;\n\n  /// The appearance of the keyboard.\n  ///\n  /// This setting is only honored on iOS devices.\n  ///\n  /// If null, defaults to [Brightness.light].\n  final Brightness? keyboardAppearance;\n\n  /// {@macro flutter.widgets.editableText.scrollPadding}\n  final EdgeInsets scrollPadding;\n\n  /// {@macro flutter.widgets.editableText.enableInteractiveSelection}\n  final bool enableInteractiveSelection;\n\n  /// {@macro flutter.widgets.editableText.selectAllOnFocus}\n  final bool? selectAllOnFocus;\n\n  /// {@macro flutter.widgets.editableText.selectionControls}\n  final TextSelectionControls? selectionControls;\n\n  /// {@macro flutter.widgets.scrollable.dragStartBehavior}\n  final DragStartBehavior dragStartBehavior;\n\n  /// {@macro flutter.widgets.editableText.scrollController}\n  final ScrollController? scrollController;\n\n  /// {@macro flutter.widgets.editableText.scrollPhysics}\n  final ScrollPhysics? scrollPhysics;\n\n  /// {@macro flutter.widgets.editableText.selectionEnabled}\n  bool get selectionEnabled => enableInteractiveSelection;\n\n  /// {@macro flutter.material.textfield.onTap}\n  final GestureTapCallback? onTap;\n\n  /// {@macro flutter.widgets.editableText.autofillHints}\n  /// {@macro flutter.services.AutofillConfiguration.autofillHints}\n  final Iterable<String>? autofillHints;\n\n  /// {@macro flutter.material.Material.clipBehavior}\n  ///\n  /// Defaults to [Clip.hardEdge].\n  final Clip clipBehavior;\n\n  /// {@macro flutter.material.textfield.restorationId}\n  final String? restorationId;\n\n  /// {@macro flutter.widgets.editableText.scribbleEnabled}\n  @Deprecated(\n    'Use `stylusHandwritingEnabled` instead. '\n    'This feature was deprecated after v3.27.0-0.2.pre.',\n  )\n  final bool scribbleEnabled;\n\n  /// {@macro flutter.widgets.editableText.stylusHandwritingEnabled}\n  final bool stylusHandwritingEnabled;\n\n  /// {@macro flutter.services.TextInputConfiguration.enableIMEPersonalizedLearning}\n  final bool enableIMEPersonalizedLearning;\n\n  /// {@macro flutter.widgets.editableText.contentInsertionConfiguration}\n  final ContentInsertionConfiguration? contentInsertionConfiguration;\n\n  /// {@macro flutter.widgets.EditableText.contextMenuBuilder}\n  ///\n  /// If not provided, will build a default menu based on the platform.\n  ///\n  /// See also:\n  ///\n  ///  * [CupertinoAdaptiveTextSelectionToolbar], which is built by default.\n  final EditableTextContextMenuBuilder? contextMenuBuilder;\n\n  static Widget _defaultContextMenuBuilder(\n    BuildContext context,\n    EditableTextState editableTextState,\n  ) {\n    if (SystemContextMenu.isSupportedByField(editableTextState)) {\n      return SystemContextMenu.editableText(\n        editableTextState: editableTextState,\n      );\n    }\n    return CupertinoAdaptiveTextSelectionToolbar.editableText(\n      editableTextState: editableTextState,\n    );\n  }\n\n  /// Configuration for the text field magnifier.\n  ///\n  /// By default (when this property is set to null), a [CupertinoTextMagnifier]\n  /// is used on mobile platforms, and nothing on desktop platforms. To suppress\n  /// the magnifier on all platforms, consider passing\n  /// [TextMagnifierConfiguration.disabled] explicitly.\n  ///\n  /// {@macro flutter.widgets.magnifier.intro}\n  ///\n  /// {@tool dartpad}\n  /// This sample demonstrates how to customize the magnifier that this text field uses.\n  ///\n  /// ** See code in examples/api/lib/widgets/text_magnifier/text_magnifier.0.dart **\n  /// {@end-tool}\n  final TextMagnifierConfiguration? magnifierConfiguration;\n\n  /// {@macro flutter.widgets.EditableText.spellCheckConfiguration}\n  ///\n  /// If [SpellCheckConfiguration.misspelledTextStyle] is not specified in this\n  /// configuration, then [cupertinoMisspelledTextStyle] is used by default.\n  final SpellCheckConfiguration? spellCheckConfiguration;\n\n  /// The [TextStyle] used to indicate misspelled words in the Cupertino style.\n  ///\n  /// See also:\n  ///  * [SpellCheckConfiguration.misspelledTextStyle], the style configured to\n  ///    mark misspelled words with.\n  ///  * [TextField.materialMisspelledTextStyle], the style configured\n  ///    to mark misspelled words with in the Material style.\n  static const TextStyle cupertinoMisspelledTextStyle = TextStyle(\n    decoration: TextDecoration.underline,\n    decorationColor: CupertinoColors.systemRed,\n    decorationStyle: TextDecorationStyle.dotted,\n  );\n\n  /// The color of the selection highlight when the spell check menu is visible.\n  ///\n  /// Eyeballed from a screenshot taken on an iPhone 11 running iOS 16.2.\n  @visibleForTesting\n  static const Color kMisspelledSelectionColor = Color(0x62ff9699);\n\n  /// Default builder for the spell check suggestions toolbar in the Cupertino\n  /// style.\n  ///\n  /// See also:\n  ///  * [spellCheckConfiguration], where this is typically specified for\n  ///    [CupertinoRichTextField].\n  ///  * [SpellCheckConfiguration.spellCheckSuggestionsToolbarBuilder], the\n  ///    parameter for which this is the default value for [CupertinoRichTextField].\n  ///  * [TextField.defaultSpellCheckSuggestionsToolbarBuilder], which is like\n  ///    this but specifies the default for [CupertinoRichTextField].\n  @visibleForTesting\n  static Widget defaultSpellCheckSuggestionsToolbarBuilder(\n    BuildContext context,\n    EditableTextState editableTextState,\n  ) {\n    return CupertinoSpellCheckSuggestionsToolbar.editableText(\n      editableTextState: editableTextState,\n    );\n  }\n\n  @override\n  State<CupertinoRichTextField> createState() => _CupertinoRichTextFieldState();\n\n  @override\n  void debugFillProperties(DiagnosticPropertiesBuilder properties) {\n    super.debugFillProperties(properties);\n    properties\n      ..add(\n        DiagnosticsProperty<RichTextEditingController>(\n          'controller',\n          controller,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<FocusNode>(\n          'focusNode',\n          focusNode,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<BoxDecoration>('decoration', decoration),\n      )\n      ..add(DiagnosticsProperty<EdgeInsetsGeometry>('padding', padding))\n      ..add(StringProperty('placeholder', placeholder))\n      ..add(\n        DiagnosticsProperty<TextStyle>('placeholderStyle', placeholderStyle),\n      )\n      ..add(\n        DiagnosticsProperty<OverlayVisibilityMode>(\n          'prefix',\n          prefix == null ? null : prefixMode,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<OverlayVisibilityMode>(\n          'suffix',\n          suffix == null ? null : suffixMode,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<OverlayVisibilityMode>(\n          'clearButtonMode',\n          clearButtonMode,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<String>(\n          'clearButtonSemanticLabel',\n          clearButtonSemanticLabel,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<TextInputType>(\n          'keyboardType',\n          keyboardType,\n          defaultValue: TextInputType.text,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<TextStyle>('style', style, defaultValue: null),\n      )\n      ..add(\n        DiagnosticsProperty<bool>('autofocus', autofocus, defaultValue: false),\n      )\n      ..add(\n        DiagnosticsProperty<String>(\n          'obscuringCharacter',\n          obscuringCharacter,\n          defaultValue: '•',\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<bool>(\n          'obscureText',\n          obscureText,\n          defaultValue: false,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<bool>(\n          'autocorrect',\n          autocorrect,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        EnumProperty<SmartDashesType>(\n          'smartDashesType',\n          smartDashesType,\n          defaultValue: obscureText\n              ? SmartDashesType.disabled\n              : SmartDashesType.enabled,\n        ),\n      )\n      ..add(\n        EnumProperty<SmartQuotesType>(\n          'smartQuotesType',\n          smartQuotesType,\n          defaultValue: obscureText\n              ? SmartQuotesType.disabled\n              : SmartQuotesType.enabled,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<bool>(\n          'enableSuggestions',\n          enableSuggestions,\n          defaultValue: true,\n        ),\n      )\n      ..add(IntProperty('maxLines', maxLines, defaultValue: 1))\n      ..add(IntProperty('minLines', minLines, defaultValue: null))\n      ..add(\n        DiagnosticsProperty<bool>('expands', expands, defaultValue: false),\n      )\n      ..add(IntProperty('maxLength', maxLength, defaultValue: null))\n      ..add(\n        EnumProperty<MaxLengthEnforcement>(\n          'maxLengthEnforcement',\n          maxLengthEnforcement,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DoubleProperty('cursorWidth', cursorWidth, defaultValue: 2.0),\n      )\n      ..add(\n        DoubleProperty('cursorHeight', cursorHeight, defaultValue: null),\n      )\n      ..add(\n        DiagnosticsProperty<Radius>(\n          'cursorRadius',\n          cursorRadius,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<bool>(\n          'cursorOpacityAnimates',\n          cursorOpacityAnimates,\n          defaultValue: true,\n        ),\n      )\n      ..add(\n        createCupertinoColorProperty(\n          'cursorColor',\n          cursorColor,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        FlagProperty(\n          'selectionEnabled',\n          value: selectionEnabled,\n          defaultValue: true,\n          ifFalse: 'selection disabled',\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<TextSelectionControls>(\n          'selectionControls',\n          selectionControls,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<ScrollController>(\n          'scrollController',\n          scrollController,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<ScrollPhysics>(\n          'scrollPhysics',\n          scrollPhysics,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        EnumProperty<TextAlign>(\n          'textAlign',\n          textAlign,\n          defaultValue: TextAlign.start,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<TextAlignVertical>(\n          'textAlignVertical',\n          textAlignVertical,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        EnumProperty<TextDirection>(\n          'textDirection',\n          textDirection,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<Clip>(\n          'clipBehavior',\n          clipBehavior,\n          defaultValue: Clip.hardEdge,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<bool>(\n          'scribbleEnabled',\n          scribbleEnabled,\n          defaultValue: true,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<bool>(\n          'stylusHandwritingEnabled',\n          stylusHandwritingEnabled,\n          defaultValue: EditableText.defaultStylusHandwritingEnabled,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<bool>(\n          'enableIMEPersonalizedLearning',\n          enableIMEPersonalizedLearning,\n          defaultValue: true,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<SpellCheckConfiguration>(\n          'spellCheckConfiguration',\n          spellCheckConfiguration,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<List<String>>(\n          'contentCommitMimeTypes',\n          contentInsertionConfiguration?.allowedMimeTypes ?? const <String>[],\n          defaultValue: contentInsertionConfiguration == null\n              ? const <String>[]\n              : kDefaultContentInsertionMimeTypes,\n        ),\n      );\n  }\n\n  static final TextMagnifierConfiguration _iosMagnifierConfiguration =\n      TextMagnifierConfiguration(\n        magnifierBuilder:\n            (\n              BuildContext context,\n              MagnifierController controller,\n              ValueNotifier<MagnifierInfo> magnifierInfo,\n            ) {\n              switch (defaultTargetPlatform) {\n                case TargetPlatform.android:\n                case TargetPlatform.iOS:\n                  return CupertinoTextMagnifier(\n                    controller: controller,\n                    magnifierInfo: magnifierInfo,\n                  );\n                case TargetPlatform.fuchsia:\n                case TargetPlatform.linux:\n                case TargetPlatform.macOS:\n                case TargetPlatform.windows:\n                  return null;\n              }\n            },\n      );\n\n  /// Returns a new [SpellCheckConfiguration] where the given configuration has\n  /// had any missing values replaced with their defaults for the iOS platform.\n  static SpellCheckConfiguration inferIOSSpellCheckConfiguration(\n    SpellCheckConfiguration? configuration,\n  ) {\n    if (configuration == null ||\n        configuration == const SpellCheckConfiguration.disabled()) {\n      return const SpellCheckConfiguration.disabled();\n    }\n\n    return configuration.copyWith(\n      misspelledTextStyle:\n          configuration.misspelledTextStyle ??\n          CupertinoRichTextField.cupertinoMisspelledTextStyle,\n      misspelledSelectionColor:\n          configuration.misspelledSelectionColor ??\n          CupertinoRichTextField.kMisspelledSelectionColor,\n      spellCheckSuggestionsToolbarBuilder:\n          configuration.spellCheckSuggestionsToolbarBuilder ??\n          CupertinoRichTextField.defaultSpellCheckSuggestionsToolbarBuilder,\n    );\n  }\n}\n\nclass _CupertinoRichTextFieldState extends State<CupertinoRichTextField>\n    with RestorationMixin, AutomaticKeepAliveClientMixin<CupertinoRichTextField>\n    implements TextSelectionGestureDetectorBuilderDelegate, AutofillClient {\n  final GlobalKey _clearGlobalKey = GlobalKey();\n\n  RichTextEditingController get _effectiveController => widget.controller;\n\n  FocusNode? _focusNode;\n  FocusNode get _effectiveFocusNode =>\n      widget.focusNode ?? (_focusNode ??= FocusNode());\n\n  MaxLengthEnforcement get _effectiveMaxLengthEnforcement =>\n      widget.maxLengthEnforcement ??\n      LengthLimitingTextInputFormatter.getDefaultMaxLengthEnforcement();\n\n  bool _showSelectionHandles = false;\n\n  late _CupertinoTextFieldSelectionGestureDetectorBuilder\n  _selectionGestureDetectorBuilder;\n\n  // API for TextSelectionGestureDetectorBuilderDelegate.\n  @override\n  bool get forcePressEnabled => true;\n\n  @override\n  final GlobalKey<EditableTextState> editableTextKey =\n      GlobalKey<EditableTextState>();\n\n  @override\n  bool get selectionEnabled => widget.selectionEnabled;\n  // End of API for TextSelectionGestureDetectorBuilderDelegate.\n\n  @override\n  void initState() {\n    super.initState();\n    _selectionGestureDetectorBuilder =\n        _CupertinoTextFieldSelectionGestureDetectorBuilder(\n          state: this,\n          controller: widget.controller,\n        );\n    _effectiveFocusNode.canRequestFocus = widget.enabled;\n    _effectiveFocusNode.addListener(_handleFocusChanged);\n  }\n\n  @override\n  void didUpdateWidget(CupertinoRichTextField oldWidget) {\n    super.didUpdateWidget(oldWidget);\n\n    if (widget.focusNode != oldWidget.focusNode) {\n      (oldWidget.focusNode ?? _focusNode)?.removeListener(_handleFocusChanged);\n      (widget.focusNode ?? _focusNode)?.addListener(_handleFocusChanged);\n    }\n    _effectiveFocusNode.canRequestFocus = widget.enabled;\n  }\n\n  @override\n  void restoreState(RestorationBucket? oldBucket, bool initialRestore) {}\n\n  @override\n  String? get restorationId => widget.restorationId;\n\n  @override\n  void dispose() {\n    _effectiveFocusNode.removeListener(_handleFocusChanged);\n    _focusNode?.dispose();\n    super.dispose();\n  }\n\n  EditableTextState get _editableText => editableTextKey.currentState!;\n\n  void _requestKeyboard() {\n    _editableText.requestKeyboard();\n  }\n\n  void _handleFocusChanged() {\n    setState(() {\n      // Rebuild the widget on focus change to show/hide the text selection\n      // highlight.\n    });\n  }\n\n  bool _shouldShowSelectionHandles(SelectionChangedCause? cause) {\n    // When the text field is activated by something that doesn't trigger the\n    // selection toolbar, we shouldn't show the handles either.\n    if (!_selectionGestureDetectorBuilder.shouldShowSelectionToolbar ||\n        !_selectionGestureDetectorBuilder.shouldShowSelectionHandles) {\n      return false;\n    }\n\n    // On iOS, we don't show handles when the selection is collapsed.\n    if (_effectiveController.selection.isCollapsed) {\n      return false;\n    }\n\n    if (cause == SelectionChangedCause.keyboard) {\n      return false;\n    }\n\n    if (cause == SelectionChangedCause.stylusHandwriting) {\n      return true;\n    }\n\n    if (_effectiveController.text.isNotEmpty) {\n      return true;\n    }\n\n    return false;\n  }\n\n  void _handleSelectionChanged(\n    TextSelection selection,\n    SelectionChangedCause? cause,\n  ) {\n    final bool willShowSelectionHandles = _shouldShowSelectionHandles(cause);\n    if (willShowSelectionHandles != _showSelectionHandles) {\n      setState(() {\n        _showSelectionHandles = willShowSelectionHandles;\n      });\n    }\n\n    switch (defaultTargetPlatform) {\n      case TargetPlatform.iOS:\n      case TargetPlatform.macOS:\n      case TargetPlatform.linux:\n      case TargetPlatform.windows:\n      case TargetPlatform.fuchsia:\n      case TargetPlatform.android:\n        if (cause == SelectionChangedCause.longPress) {\n          _editableText.bringIntoView(selection.extent);\n        }\n    }\n\n    switch (defaultTargetPlatform) {\n      case TargetPlatform.iOS:\n      case TargetPlatform.fuchsia:\n      case TargetPlatform.android:\n        break;\n      case TargetPlatform.macOS:\n      case TargetPlatform.linux:\n      case TargetPlatform.windows:\n        if (cause == SelectionChangedCause.drag) {\n          _editableText.hideToolbar();\n        }\n    }\n  }\n\n  @override\n  bool get wantKeepAlive => _effectiveController.value.text.isNotEmpty;\n\n  static bool _shouldShowAttachment({\n    required OverlayVisibilityMode attachment,\n    required bool hasText,\n  }) {\n    return switch (attachment) {\n      OverlayVisibilityMode.never => false,\n      OverlayVisibilityMode.always => true,\n      OverlayVisibilityMode.editing => hasText,\n      OverlayVisibilityMode.notEditing => !hasText,\n    };\n  }\n\n  // True if any surrounding decoration widgets will be shown.\n  bool get _hasDecoration {\n    return widget.placeholder != null ||\n        widget.clearButtonMode != OverlayVisibilityMode.never ||\n        widget.prefix != null ||\n        widget.suffix != null;\n  }\n\n  // Provide default behavior if widget.textAlignVertical is not set.\n  // CupertinoTextField has top alignment by default, unless it has decoration\n  // like a prefix or suffix, in which case it's aligned to the center.\n  TextAlignVertical get _textAlignVertical {\n    if (widget.textAlignVertical != null) {\n      return widget.textAlignVertical!;\n    }\n    return _hasDecoration ? TextAlignVertical.center : TextAlignVertical.top;\n  }\n\n  void _onClearButtonTapped() {\n    final bool hadText = _effectiveController.text.isNotEmpty;\n    _effectiveController.clear();\n    if (hadText) {\n      // Tapping the clear button is also considered a \"user initiated\" change\n      // (instead of a programmatical one), so call `onChanged` if the text\n      // changed as a result.\n      widget.onChanged?.call(_effectiveController.text);\n    }\n  }\n\n  Widget _buildClearButton() {\n    final String clearLabel =\n        widget.clearButtonSemanticLabel ??\n        CupertinoLocalizations.of(context).clearButtonLabel;\n\n    return Semantics(\n      button: true,\n      label: clearLabel,\n      child: GestureDetector(\n        key: _clearGlobalKey,\n        onTap: widget.enabled ? _onClearButtonTapped : null,\n        child: Padding(\n          padding: const EdgeInsets.symmetric(horizontal: 6.0),\n          child: Icon(\n            CupertinoIcons.clear_thick_circled,\n            size: 18.0,\n            color: CupertinoDynamicColor.resolve(_kClearButtonColor, context),\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget _addTextDependentAttachments(\n    Widget editableText,\n    TextStyle textStyle,\n    TextStyle placeholderStyle,\n  ) {\n    // If there are no surrounding widgets, just return the core editable text\n    // part.\n    if (!_hasDecoration) {\n      return editableText;\n    }\n\n    // Otherwise, listen to the current state of the text entry.\n    return ValueListenableBuilder<TextEditingValue>(\n      valueListenable: _effectiveController,\n      child: editableText,\n      builder: (BuildContext context, TextEditingValue text, Widget? child) {\n        final bool hasText = text.text.isNotEmpty;\n        final String? placeholderText = widget.placeholder;\n        final Widget? placeholder = placeholderText == null\n            ? null\n            // Make the placeholder invisible when hasText is true.\n            : Visibility(\n                maintainAnimation: true,\n                maintainSize: true,\n                maintainState: true,\n                visible: !hasText,\n                child: SizedBox(\n                  width: double.infinity,\n                  child: Padding(\n                    padding: widget.padding,\n                    child: Text(\n                      placeholderText,\n                      // This is to make sure the text field is always tall enough\n                      // to accommodate the first line of the placeholder, so the\n                      // text does not shrink vertically as you type (however in\n                      // rare circumstances, the height may still change when\n                      // there's no placeholder text).\n                      maxLines: hasText ? 1 : widget.maxLines,\n                      overflow: placeholderStyle.overflow,\n                      style: placeholderStyle,\n                      textAlign: widget.textAlign,\n                    ),\n                  ),\n                ),\n              );\n\n        final Widget? prefixWidget =\n            _shouldShowAttachment(\n              attachment: widget.prefixMode,\n              hasText: hasText,\n            )\n            ? widget.prefix\n            : null;\n\n        // Show user specified suffix if applicable and fall back to clear button.\n        final bool showUserSuffix = _shouldShowAttachment(\n          attachment: widget.suffixMode,\n          hasText: hasText,\n        );\n        final bool showClearButton = _shouldShowAttachment(\n          attachment: widget.clearButtonMode,\n          hasText: hasText,\n        );\n        final Widget? suffixWidget = switch ((\n          showUserSuffix,\n          showClearButton,\n        )) {\n          (false, false) => null,\n          (true, false) => widget.suffix,\n          (true, true) => widget.suffix ?? _buildClearButton(),\n          (false, true) => _buildClearButton(),\n        };\n        return Row(\n          crossAxisAlignment: widget.crossAxisAlignment,\n          children: <Widget>[\n            // Insert a prefix at the front if the prefix visibility mode matches\n            // the current text state.\n            ?prefixWidget,\n            // In the middle part, stack the placeholder on top of the main EditableText\n            // if needed.\n            Expanded(\n              child: Directionality(\n                textDirection:\n                    widget.textDirection ?? Directionality.of(context),\n                child: _BaselineAlignedStack(\n                  placeholder: placeholder,\n                  editableText: editableText,\n                  textAlignVertical: _textAlignVertical,\n                  editableTextBaseline:\n                      textStyle.textBaseline ?? TextBaseline.alphabetic,\n                  placeholderBaseline:\n                      placeholderStyle.textBaseline ?? TextBaseline.alphabetic,\n                ),\n              ),\n            ),\n            ?suffixWidget,\n          ],\n        );\n      },\n    );\n  }\n\n  // AutofillClient implementation start.\n  @override\n  String get autofillId => _editableText.autofillId;\n\n  @override\n  void autofill(TextEditingValue newEditingValue) =>\n      _editableText.autofill(newEditingValue);\n\n  @override\n  TextInputConfiguration get textInputConfiguration {\n    final List<String>? autofillHints = widget.autofillHints?.toList(\n      growable: false,\n    );\n    final AutofillConfiguration autofillConfiguration = autofillHints != null\n        ? AutofillConfiguration(\n            uniqueIdentifier: autofillId,\n            autofillHints: autofillHints,\n            currentEditingValue: _effectiveController.value,\n            hintText: widget.placeholder,\n          )\n        : AutofillConfiguration.disabled;\n\n    return _editableText.textInputConfiguration.copyWith(\n      autofillConfiguration: autofillConfiguration,\n    );\n  }\n  // AutofillClient implementation end.\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context); // See AutomaticKeepAliveClientMixin.\n    assert(debugCheckHasDirectionality(context));\n    final RichTextEditingController controller = _effectiveController;\n\n    TextSelectionControls? textSelectionControls = widget.selectionControls;\n    VoidCallback? handleDidGainAccessibilityFocus;\n    VoidCallback? handleDidLoseAccessibilityFocus;\n    switch (defaultTargetPlatform) {\n      case TargetPlatform.iOS:\n      case TargetPlatform.android:\n      case TargetPlatform.fuchsia:\n        textSelectionControls ??= cupertinoTextSelectionHandleControls;\n      case TargetPlatform.linux:\n      case TargetPlatform.macOS:\n      case TargetPlatform.windows:\n        textSelectionControls ??= cupertinoDesktopTextSelectionHandleControls;\n        handleDidGainAccessibilityFocus = () {\n          // Automatically activate the TextField when it receives accessibility focus.\n          if (!_effectiveFocusNode.hasFocus &&\n              _effectiveFocusNode.canRequestFocus) {\n            _effectiveFocusNode.requestFocus();\n          }\n        };\n        handleDidLoseAccessibilityFocus = () {\n          _effectiveFocusNode.unfocus();\n        };\n    }\n\n    final bool enabled = widget.enabled;\n    final cursorOffset = Offset(\n      _iOSHorizontalCursorOffsetPixels / MediaQuery.devicePixelRatioOf(context),\n      0,\n    );\n    final formatters = <TextInputFormatter>[\n      ...?widget.inputFormatters,\n      if (widget.maxLength != null)\n        LengthLimitingTextInputFormatter(\n          widget.maxLength,\n          maxLengthEnforcement: _effectiveMaxLengthEnforcement,\n        ),\n    ];\n    final CupertinoThemeData themeData = CupertinoTheme.of(context);\n\n    final TextStyle? resolvedStyle = widget.style?.copyWith(\n      color: CupertinoDynamicColor.maybeResolve(widget.style?.color, context),\n      backgroundColor: CupertinoDynamicColor.maybeResolve(\n        widget.style?.backgroundColor,\n        context,\n      ),\n    );\n\n    final TextStyle textStyle = themeData.textTheme.textStyle.merge(\n      resolvedStyle,\n    );\n\n    final TextStyle? resolvedPlaceholderStyle = widget.placeholderStyle\n        ?.copyWith(\n          color: CupertinoDynamicColor.maybeResolve(\n            widget.placeholderStyle?.color,\n            context,\n          ),\n          backgroundColor: CupertinoDynamicColor.maybeResolve(\n            widget.placeholderStyle?.backgroundColor,\n            context,\n          ),\n        );\n\n    final TextStyle placeholderStyle = textStyle.merge(\n      resolvedPlaceholderStyle,\n    );\n\n    final Brightness keyboardAppearance =\n        widget.keyboardAppearance ?? CupertinoTheme.brightnessOf(context);\n    final Color cursorColor =\n        CupertinoDynamicColor.maybeResolve(\n          widget.cursorColor ?? DefaultSelectionStyle.of(context).cursorColor,\n          context,\n        ) ??\n        themeData.primaryColor;\n\n    final Color disabledColor = CupertinoDynamicColor.resolve(\n      _kDisabledBackground,\n      context,\n    );\n\n    final Color? decorationColor = CupertinoDynamicColor.maybeResolve(\n      widget.decoration?.color,\n      context,\n    );\n\n    final BoxBorder? border = widget.decoration?.border;\n    var resolvedBorder = border as Border?;\n    if (border is Border) {\n      BorderSide resolveBorderSide(BorderSide side) {\n        return side == BorderSide.none\n            ? side\n            : side.copyWith(\n                color: CupertinoDynamicColor.resolve(side.color, context),\n              );\n      }\n\n      resolvedBorder = border.runtimeType != Border\n          ? border\n          : Border(\n              top: resolveBorderSide(border.top),\n              left: resolveBorderSide(border.left),\n              bottom: resolveBorderSide(border.bottom),\n              right: resolveBorderSide(border.right),\n            );\n    }\n\n    // Use the default disabled color only if the box decoration was not set.\n    final BoxDecoration? effectiveDecoration = widget.decoration?.copyWith(\n      border: resolvedBorder,\n      color: enabled\n          ? decorationColor\n          : (widget.decoration == _kDefaultRoundedBorderDecoration\n                ? disabledColor\n                : widget.decoration?.color),\n    );\n\n    final Color selectionColor =\n        CupertinoDynamicColor.maybeResolve(\n          DefaultSelectionStyle.of(context).selectionColor,\n          context,\n        ) ??\n        CupertinoTheme.of(context).primaryColor.withValues(alpha: 0.2);\n\n    // Set configuration as disabled if not otherwise specified. If specified,\n    // ensure that configuration uses Cupertino text style for misspelled words\n    // unless a custom style is specified.\n    final SpellCheckConfiguration spellCheckConfiguration =\n        CupertinoRichTextField.inferIOSSpellCheckConfiguration(\n          widget.spellCheckConfiguration,\n        );\n\n    final Widget paddedEditable = Padding(\n      padding: widget.padding,\n      child: RepaintBoundary(\n        child: UnmanagedRestorationScope(\n          bucket: bucket,\n          child: EditableText(\n            key: editableTextKey,\n            controller: controller,\n            readOnly: widget.readOnly || !enabled,\n            toolbarOptions: widget.toolbarOptions,\n            showCursor: widget.showCursor,\n            showSelectionHandles: _showSelectionHandles,\n            focusNode: _effectiveFocusNode,\n            keyboardType: widget.keyboardType,\n            textInputAction: widget.textInputAction,\n            textCapitalization: widget.textCapitalization,\n            style: textStyle,\n            strutStyle: widget.strutStyle,\n            textAlign: widget.textAlign,\n            textDirection: widget.textDirection,\n            autofocus: widget.autofocus,\n            obscuringCharacter: widget.obscuringCharacter,\n            obscureText: widget.obscureText,\n            autocorrect: widget.autocorrect,\n            smartDashesType: widget.smartDashesType,\n            smartQuotesType: widget.smartQuotesType,\n            enableSuggestions: widget.enableSuggestions,\n            maxLines: widget.maxLines,\n            minLines: widget.minLines,\n            expands: widget.expands,\n            magnifierConfiguration:\n                widget.magnifierConfiguration ??\n                CupertinoRichTextField._iosMagnifierConfiguration,\n            // Only show the selection highlight when the text field is focused.\n            selectionColor: _effectiveFocusNode.hasFocus\n                ? selectionColor\n                : null,\n            selectionControls: widget.selectionEnabled\n                ? textSelectionControls\n                : null,\n            groupId: widget.groupId,\n            onChanged: widget.onChanged,\n            onSelectionChanged: _handleSelectionChanged,\n            onEditingComplete: widget.onEditingComplete,\n            onSubmitted: widget.onSubmitted,\n            onTapOutside: widget.onTapOutside,\n            inputFormatters: formatters,\n            rendererIgnoresPointer: true,\n            cursorWidth: widget.cursorWidth,\n            cursorHeight: widget.cursorHeight,\n            cursorRadius: widget.cursorRadius,\n            cursorColor: cursorColor,\n            cursorOpacityAnimates: widget.cursorOpacityAnimates,\n            cursorOffset: cursorOffset,\n            paintCursorAboveText: true,\n            autocorrectionTextRectColor: selectionColor,\n            backgroundCursorColor: CupertinoDynamicColor.resolve(\n              CupertinoColors.inactiveGray,\n              context,\n            ),\n            selectionHeightStyle: widget.selectionHeightStyle,\n            selectionWidthStyle: widget.selectionWidthStyle,\n            scrollPadding: widget.scrollPadding,\n            keyboardAppearance: keyboardAppearance,\n            dragStartBehavior: widget.dragStartBehavior,\n            scrollController: widget.scrollController,\n            scrollPhysics: widget.scrollPhysics,\n            enableInteractiveSelection: widget.enableInteractiveSelection,\n            selectAllOnFocus: widget.selectAllOnFocus,\n            autofillClient: this,\n            clipBehavior: widget.clipBehavior,\n            restorationId: 'editable',\n            scribbleEnabled: widget.scribbleEnabled,\n            stylusHandwritingEnabled: widget.stylusHandwritingEnabled,\n            enableIMEPersonalizedLearning: widget.enableIMEPersonalizedLearning,\n            contentInsertionConfiguration: widget.contentInsertionConfiguration,\n            contextMenuBuilder: widget.contextMenuBuilder,\n            spellCheckConfiguration: spellCheckConfiguration,\n          ),\n        ),\n      ),\n    );\n\n    return Semantics(\n      enabled: enabled,\n      onTap: !enabled || widget.readOnly\n          ? null\n          : () {\n              if (!controller.selection.isValid) {\n                controller.selection = TextSelection.collapsed(\n                  offset: controller.text.length,\n                );\n              }\n              _requestKeyboard();\n            },\n      onDidGainAccessibilityFocus: handleDidGainAccessibilityFocus,\n      onDidLoseAccessibilityFocus: handleDidLoseAccessibilityFocus,\n      onFocus: enabled\n          ? () {\n              assert(\n                _effectiveFocusNode.canRequestFocus,\n                'Received SemanticsAction.focus from the engine. However, the FocusNode '\n                'of this text field cannot gain focus. This likely indicates a bug. '\n                'If this text field cannot be focused (e.g. because it is not '\n                'enabled), then its corresponding semantics node must be configured '\n                'such that the assistive technology cannot request focus on it.',\n              );\n\n              if (_effectiveFocusNode.canRequestFocus &&\n                  !_effectiveFocusNode.hasFocus) {\n                _effectiveFocusNode.requestFocus();\n              } else if (!widget.readOnly) {\n                // If the platform requested focus, that means that previously the\n                // platform believed that the text field did not have focus (even\n                // though Flutter's widget system believed otherwise). This likely\n                // means that the on-screen keyboard is hidden, or more generally,\n                // there is no current editing session in this field. To correct\n                // that, keyboard must be requested.\n                //\n                // A concrete scenario where this can happen is when the user\n                // dismisses the keyboard on the web. The editing session is\n                // closed by the engine, but the text field widget stays focused\n                // in the framework.\n                _requestKeyboard();\n              }\n            }\n          : null,\n      child: TextFieldTapRegion(\n        child: IgnorePointer(\n          ignoring: !enabled,\n          child: Container(\n            decoration: effectiveDecoration,\n            color: !enabled && effectiveDecoration == null\n                ? disabledColor\n                : null,\n            child: _selectionGestureDetectorBuilder.buildGestureDetector(\n              behavior: HitTestBehavior.translucent,\n              child: Align(\n                alignment: Alignment(-1.0, _textAlignVertical.y),\n                widthFactor: 1.0,\n                heightFactor: 1.0,\n                child: _addTextDependentAttachments(\n                  paddedEditable,\n                  textStyle,\n                  placeholderStyle,\n                ),\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n\nenum _BaselineAlignedStackSlot { placeholder, editableText }\n\nclass _BaselineAlignedStack\n    extends\n        SlottedMultiChildRenderObjectWidget<\n          _BaselineAlignedStackSlot,\n          RenderBox\n        > {\n  const _BaselineAlignedStack({\n    required this.editableTextBaseline,\n    required this.placeholderBaseline,\n    required this.textAlignVertical,\n    required this.editableText,\n    this.placeholder,\n  });\n\n  final TextBaseline editableTextBaseline;\n  final TextBaseline placeholderBaseline;\n  final TextAlignVertical textAlignVertical;\n  final Widget editableText;\n  final Widget? placeholder;\n\n  @override\n  Iterable<_BaselineAlignedStackSlot> get slots =>\n      _BaselineAlignedStackSlot.values;\n\n  @override\n  Widget? childForSlot(_BaselineAlignedStackSlot slot) {\n    return switch (slot) {\n      _BaselineAlignedStackSlot.placeholder => placeholder,\n      _BaselineAlignedStackSlot.editableText => editableText,\n    };\n  }\n\n  @override\n  _RenderBaselineAlignedStack createRenderObject(BuildContext context) {\n    return _RenderBaselineAlignedStack(\n      textAlignVertical: textAlignVertical,\n      editableTextBaseline: editableTextBaseline,\n      placeholderBaseline: placeholderBaseline,\n    );\n  }\n\n  @override\n  void updateRenderObject(\n    BuildContext context,\n    _RenderBaselineAlignedStack renderObject,\n  ) {\n    renderObject\n      ..textAlignVertical = textAlignVertical\n      ..editableTextBaseline = editableTextBaseline\n      ..placeholderBaseline = placeholderBaseline;\n  }\n}\n\nclass _BaselineAlignedStackParentData\n    extends ContainerBoxParentData<RenderBox> {}\n\nclass _RenderBaselineAlignedStack extends RenderBox\n    with\n        SlottedContainerRenderObjectMixin<\n          _BaselineAlignedStackSlot,\n          RenderBox\n        > {\n  _RenderBaselineAlignedStack({\n    required TextAlignVertical textAlignVertical,\n    required TextBaseline editableTextBaseline,\n    required TextBaseline placeholderBaseline,\n  }) : _textAlignVertical = textAlignVertical,\n       _editableTextBaseline = editableTextBaseline,\n       _placeholderBaseline = placeholderBaseline;\n\n  TextAlignVertical get textAlignVertical => _textAlignVertical;\n  TextAlignVertical _textAlignVertical;\n  set textAlignVertical(TextAlignVertical value) {\n    if (_textAlignVertical == value) {\n      return;\n    }\n    _textAlignVertical = value;\n    markNeedsLayout();\n  }\n\n  TextBaseline get editableTextBaseline => _editableTextBaseline;\n  TextBaseline _editableTextBaseline;\n  set editableTextBaseline(TextBaseline value) {\n    if (_editableTextBaseline == value) {\n      return;\n    }\n    _editableTextBaseline = value;\n    markNeedsLayout();\n  }\n\n  TextBaseline get placeholderBaseline => _placeholderBaseline;\n  TextBaseline _placeholderBaseline;\n  set placeholderBaseline(TextBaseline value) {\n    if (_placeholderBaseline == value) {\n      return;\n    }\n    _placeholderBaseline = value;\n    markNeedsLayout();\n  }\n\n  @override\n  void setupParentData(RenderBox child) {\n    if (child.parentData is! _BaselineAlignedStackParentData) {\n      child.parentData = _BaselineAlignedStackParentData();\n    }\n  }\n\n  RenderBox? get _placeholderChild {\n    return childForSlot(_BaselineAlignedStackSlot.placeholder);\n  }\n\n  RenderBox get _editableTextChild {\n    final RenderBox? child = childForSlot(\n      _BaselineAlignedStackSlot.editableText,\n    );\n    assert(child != null);\n    return child!;\n  }\n\n  @override\n  double computeMinIntrinsicHeight(double width) {\n    return math.max(\n      _placeholderChild?.getMinIntrinsicHeight(width) ?? 0.0,\n      _editableTextChild.getMinIntrinsicHeight(width),\n    );\n  }\n\n  @override\n  double computeMaxIntrinsicHeight(double width) {\n    return math.max(\n      _placeholderChild?.getMaxIntrinsicHeight(width) ?? 0.0,\n      _editableTextChild.getMaxIntrinsicHeight(width),\n    );\n  }\n\n  @override\n  double computeMinIntrinsicWidth(double height) {\n    return math.max(\n      _placeholderChild?.getMinIntrinsicWidth(height) ?? 0.0,\n      _editableTextChild.getMinIntrinsicWidth(height),\n    );\n  }\n\n  @override\n  double computeMaxIntrinsicWidth(double height) {\n    return math.max(\n      _placeholderChild?.getMaxIntrinsicWidth(height) ?? 0.0,\n      _editableTextChild.getMaxIntrinsicWidth(height),\n    );\n  }\n\n  @override\n  void performLayout() {\n    assert(constraints.hasTightWidth);\n    final RenderBox? placeholder = _placeholderChild;\n    final RenderBox editableText = _editableTextChild;\n\n    final editableTextParentData =\n        editableText.parentData! as _BaselineAlignedStackParentData;\n    final placeholderParentData =\n        placeholder?.parentData as _BaselineAlignedStackParentData?;\n\n    size = _computeSize(\n      constraints: constraints,\n      layoutChild: ChildLayoutHelper.layoutChild,\n      getBaseline: ChildLayoutHelper.getBaseline,\n    );\n\n    final double editableTextBaselineValue = editableText.getDistanceToBaseline(\n      editableTextBaseline,\n    )!;\n    final double? placeholderBaselineValue = placeholder?.getDistanceToBaseline(\n      placeholderBaseline,\n    );\n\n    assert(placeholder != null || placeholderBaselineValue == null);\n    final Offset baselineDiff = placeholderBaselineValue != null\n        ? Offset(0.0, editableTextBaselineValue - placeholderBaselineValue)\n        : Offset.zero;\n    final verticalAlignment = Alignment(0.0, textAlignVertical.y);\n\n    editableTextParentData.offset = verticalAlignment.alongOffset(\n      size - editableText.size as Offset,\n    );\n    // Baseline-align the placeholder to the editable text.\n    placeholderParentData?.offset =\n        editableTextParentData.offset + baselineDiff;\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    final RenderBox? placeholder = _placeholderChild;\n    final RenderBox editableText = _editableTextChild;\n\n    if (placeholder != null) {\n      final placeholderParentData =\n          placeholder.parentData! as _BaselineAlignedStackParentData;\n      context.paintChild(placeholder, offset + placeholderParentData.offset);\n    }\n\n    final editableTextParentData =\n        editableText.parentData! as _BaselineAlignedStackParentData;\n    context.paintChild(editableText, offset + editableTextParentData.offset);\n  }\n\n  @override\n  Size computeDryLayout(covariant BoxConstraints constraints) {\n    return _computeSize(\n      constraints: constraints,\n      layoutChild: ChildLayoutHelper.dryLayoutChild,\n      getBaseline: ChildLayoutHelper.getDryBaseline,\n    );\n  }\n\n  Size _computeSize({\n    required BoxConstraints constraints,\n    required ChildLayouter layoutChild,\n    required ChildBaselineGetter getBaseline,\n  }) {\n    double width = constraints.minWidth;\n    double height = constraints.minHeight;\n\n    final RenderBox editableText = _editableTextChild;\n    final Size editableTextSize = layoutChild(editableText, constraints);\n    final double editableTextBaselineValue = getBaseline(\n      editableText,\n      constraints,\n      editableTextBaseline,\n    )!;\n    final double editableTextDescent =\n        editableTextSize.height - editableTextBaselineValue;\n\n    Size? placeholderSize;\n    double? placeholderBaselineValue;\n    final RenderBox? placeholder = _placeholderChild;\n    if (placeholder != null) {\n      placeholderSize = layoutChild(placeholder, constraints);\n      width = math.max(width, placeholderSize.width);\n      placeholderBaselineValue = getBaseline(\n        placeholder,\n        constraints,\n        placeholderBaseline,\n      );\n      final double placeholderDescent =\n          placeholderSize.height - placeholderBaselineValue!;\n      // The size is the sum of the placeholder's max ascent and descent and the\n      // editable text's max ascent and descent.\n      final double maxExtentBaseline =\n          math.max(editableTextBaselineValue, placeholderBaselineValue) +\n          math.max(editableTextDescent, placeholderDescent);\n      height = math.max(height, maxExtentBaseline);\n    }\n\n    height = math.max(height, editableTextSize.height);\n    width = math.max(width, editableTextSize.width);\n    final size = Size(width, height);\n    assert(size.isFinite);\n    return constraints.constrain(size);\n  }\n\n  @override\n  bool hitTestChildren(BoxHitTestResult result, {required Offset position}) {\n    final RenderBox editableText = _editableTextChild;\n    final editableTextParentData =\n        editableText.parentData! as _BaselineAlignedStackParentData;\n\n    return result.addWithPaintOffset(\n      offset: editableTextParentData.offset,\n      position: position,\n      hitTest: (BoxHitTestResult result, Offset transformed) {\n        assert(transformed == position - editableTextParentData.offset);\n        return editableText.hitTest(result, position: transformed);\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/text_field/editable.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n/// @docImport 'package:flutter/cupertino.dart';\nlibrary;\n\nimport 'dart:math' as math;\nimport 'dart:ui'\n    as ui\n    show\n        BoxHeightStyle,\n        BoxWidthStyle,\n        LineMetrics,\n        SemanticsInputType,\n        TextBox;\n\nimport 'package:PiliPlus/common/widgets/flutter/text_field/controller.dart';\nimport 'package:characters/characters.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/rendering.dart';\nimport 'package:flutter/services.dart';\n\nconst double _kCaretGap = 1.0; // pixels\nconst double _kCaretHeightOffset = 2.0; // pixels\n\n// The additional size on the x and y axis with which to expand the prototype\n// cursor to render the floating cursor in pixels.\nconst EdgeInsets _kFloatingCursorSizeIncrease = EdgeInsets.symmetric(\n  horizontal: 0.5,\n  vertical: 1.0,\n);\n\n// The corner radius of the floating cursor in pixels.\nconst Radius _kFloatingCursorRadius = Radius.circular(1.0);\n\n// This constant represents the shortest squared distance required between the floating cursor\n// and the regular cursor when both are present in the text field.\n// If the squared distance between the two cursors is less than this value,\n// it's not necessary to display both cursors at the same time.\n// This behavior is consistent with the one observed in iOS UITextField.\nconst double _kShortestDistanceSquaredWithFloatingAndRegularCursors =\n    15.0 * 15.0;\n\n/// The consecutive sequence of [TextPosition]s that the caret should move to\n/// when the user navigates the paragraph using the upward arrow key or the\n/// downward arrow key.\n///\n/// {@template flutter.rendering.RenderEditable.verticalArrowKeyMovement}\n/// When the user presses the upward arrow key or the downward arrow key, on\n/// many platforms (macOS for instance), the caret will move to the previous\n/// line or the next line, while maintaining its original horizontal location.\n/// When it encounters a shorter line, the caret moves to the closest horizontal\n/// location within that line, and restores the original horizontal location\n/// when a long enough line is encountered.\n///\n/// Additionally, the caret will move to the beginning of the document if the\n/// upward arrow key is pressed and the caret is already on the first line. If\n/// the downward arrow key is pressed next, the caret will restore its original\n/// horizontal location and move to the second line. Similarly the caret moves\n/// to the end of the document if the downward arrow key is pressed when it's\n/// already on the last line.\n///\n/// Consider a left-aligned paragraph:\n///   aa|\n///   a\n///   aaa\n/// where the caret was initially placed at the end of the first line. Pressing\n/// the downward arrow key once will move the caret to the end of the second\n/// line, and twice the arrow key moves to the third line after the second \"a\"\n/// on that line. Pressing the downward arrow key again, the caret will move to\n/// the end of the third line (the end of the document). Pressing the upward\n/// arrow key in this state will result in the caret moving to the end of the\n/// second line.\n///\n/// Vertical caret runs are typically interrupted when the layout of the text\n/// changes (including when the text itself changes), or when the selection is\n/// changed by other input events or programmatically (for example, when the\n/// user pressed the left arrow key).\n/// {@endtemplate}\n///\n/// The [movePrevious] method moves the caret location (which is\n/// [VerticalCaretMovementRun.current]) to the previous line, and in case\n/// the caret is already on the first line, the method does nothing and returns\n/// false. Similarly the [moveNext] method moves the caret to the next line, and\n/// returns false if the caret is already on the last line.\n///\n/// The [moveByOffset] method takes a pixel offset from the current position to move\n/// the caret up or down.\n///\n/// If the underlying paragraph's layout changes, [isValid] becomes false and\n/// the [VerticalCaretMovementRun] must not be used. The [isValid] property must\n/// be checked before calling [movePrevious], [moveNext] and [moveByOffset],\n/// or accessing [current].\nclass VerticalCaretMovementRun implements Iterator<TextPosition> {\n  VerticalCaretMovementRun._(\n    this._editable,\n    this._lineMetrics,\n    this._currentTextPosition,\n    this._currentLine,\n    this._currentOffset,\n  );\n\n  Offset _currentOffset;\n  int _currentLine;\n  TextPosition _currentTextPosition;\n\n  final List<ui.LineMetrics> _lineMetrics;\n  final RenderEditable _editable;\n\n  bool _isValid = true;\n\n  /// Whether this [VerticalCaretMovementRun] can still continue.\n  ///\n  /// A [VerticalCaretMovementRun] run is valid if the underlying text layout\n  /// hasn't changed.\n  ///\n  /// The [current] value and the [movePrevious], [moveNext] and [moveByOffset]\n  /// methods must not be accessed when [isValid] is false.\n  bool get isValid {\n    if (!_isValid) {\n      return false;\n    }\n    final List<ui.LineMetrics> newLineMetrics = _editable._textPainter\n        .computeLineMetrics();\n    // Use the implementation detail of the computeLineMetrics method to figure\n    // out if the current text layout has been invalidated.\n    if (!identical(newLineMetrics, _lineMetrics)) {\n      _isValid = false;\n    }\n    return _isValid;\n  }\n\n  final Map<int, MapEntry<Offset, TextPosition>> _positionCache =\n      <int, MapEntry<Offset, TextPosition>>{};\n\n  MapEntry<Offset, TextPosition> _getTextPositionForLine(int lineNumber) {\n    assert(isValid);\n    assert(lineNumber >= 0);\n    final MapEntry<Offset, TextPosition>? cachedPosition =\n        _positionCache[lineNumber];\n    if (cachedPosition != null) {\n      return cachedPosition;\n    }\n    assert(lineNumber != _currentLine);\n\n    final newOffset = Offset(\n      _currentOffset.dx,\n      _lineMetrics[lineNumber].baseline,\n    );\n    final TextPosition closestPosition = _editable._textPainter\n        .getPositionForOffset(newOffset);\n    final position = MapEntry<Offset, TextPosition>(newOffset, closestPosition);\n    _positionCache[lineNumber] = position;\n    return position;\n  }\n\n  @override\n  TextPosition get current {\n    assert(isValid);\n    return _currentTextPosition;\n  }\n\n  @override\n  bool moveNext() {\n    assert(isValid);\n    if (_currentLine + 1 >= _lineMetrics.length) {\n      return false;\n    }\n    final MapEntry<Offset, TextPosition> position = _getTextPositionForLine(\n      _currentLine + 1,\n    );\n    _currentLine += 1;\n    _currentOffset = position.key;\n    _currentTextPosition = position.value;\n    return true;\n  }\n\n  /// Move back to the previous element.\n  ///\n  /// Returns true and updates [current] if successful.\n  bool movePrevious() {\n    assert(isValid);\n    if (_currentLine <= 0) {\n      return false;\n    }\n    final MapEntry<Offset, TextPosition> position = _getTextPositionForLine(\n      _currentLine - 1,\n    );\n    _currentLine -= 1;\n    _currentOffset = position.key;\n    _currentTextPosition = position.value;\n    return true;\n  }\n\n  /// Move forward or backward by a number of elements determined\n  /// by pixel [offset].\n  ///\n  /// If [offset] is negative, move backward; otherwise move forward.\n  ///\n  /// Returns true and updates [current] if successful.\n  bool moveByOffset(double offset) {\n    final Offset initialOffset = _currentOffset;\n    if (offset >= 0.0) {\n      while (_currentOffset.dy < initialOffset.dy + offset) {\n        if (!moveNext()) {\n          break;\n        }\n      }\n    } else {\n      while (_currentOffset.dy > initialOffset.dy + offset) {\n        if (!movePrevious()) {\n          break;\n        }\n      }\n    }\n    return initialOffset != _currentOffset;\n  }\n}\n\n/// Displays some text in a scrollable container with a potentially blinking\n/// cursor and with gesture recognizers.\n///\n/// This is the renderer for an editable text field. It does not directly\n/// provide affordances for editing the text, but it does handle text selection\n/// and manipulation of the text cursor.\n///\n/// The [text] is displayed, scrolled by the given [offset], aligned according\n/// to [textAlign]. The [maxLines] property controls whether the text displays\n/// on one line or many. The [selection], if it is not collapsed, is painted in\n/// the [selectionColor]. If it _is_ collapsed, then it represents the cursor\n/// position. The cursor is shown while [showCursor] is true. It is painted in\n/// the [cursorColor].\n///\n/// Keyboard handling, IME handling, scrolling, toggling the [showCursor] value\n/// to actually blink the cursor, and other features not mentioned above are the\n/// responsibility of higher layers and not handled by this object.\nclass RenderEditable extends RenderBox\n    with\n        RelayoutWhenSystemFontsChangeMixin,\n        ContainerRenderObjectMixin<RenderBox, TextParentData>,\n        RenderInlineChildrenContainerDefaults\n    implements TextLayoutMetrics {\n  /// Creates a render object that implements the visual aspects of a text field.\n  ///\n  /// The [textAlign] argument defaults to [TextAlign.start].\n  ///\n  /// If [showCursor] is not specified, then it defaults to hiding the cursor.\n  ///\n  /// The [maxLines] property can be set to null to remove the restriction on\n  /// the number of lines. By default, it is 1, meaning this is a single-line\n  /// text field. If it is not null, it must be greater than zero.\n  ///\n  /// Use [ViewportOffset.zero] for the [offset] if there is no need for\n  /// scrolling.\n  RenderEditable({\n    InlineSpan? text,\n    required TextDirection textDirection,\n    TextAlign textAlign = TextAlign.start,\n    Color? cursorColor,\n    Color? backgroundCursorColor,\n    ValueNotifier<bool>? showCursor,\n    bool? hasFocus,\n    required LayerLink startHandleLayerLink,\n    required LayerLink endHandleLayerLink,\n    int? maxLines = 1,\n    int? minLines,\n    bool expands = false,\n    StrutStyle? strutStyle,\n    Color? selectionColor,\n    @Deprecated(\n      'Use textScaler instead. '\n      'Use of textScaleFactor was deprecated in preparation for the upcoming nonlinear text scaling support. '\n      'This feature was deprecated after v3.12.0-2.0.pre.',\n    )\n    double textScaleFactor = 1.0,\n    TextScaler textScaler = TextScaler.noScaling,\n    TextSelection? selection,\n    required ViewportOffset offset,\n    this.ignorePointer = false,\n    bool readOnly = false,\n    bool forceLine = true,\n    TextHeightBehavior? textHeightBehavior,\n    TextWidthBasis textWidthBasis = TextWidthBasis.parent,\n    String obscuringCharacter = '•',\n    bool obscureText = false,\n    Locale? locale,\n    double cursorWidth = 1.0,\n    double? cursorHeight,\n    Radius? cursorRadius,\n    bool paintCursorAboveText = false,\n    Offset cursorOffset = Offset.zero,\n    double devicePixelRatio = 1.0,\n    ui.BoxHeightStyle selectionHeightStyle = ui.BoxHeightStyle.max,\n    ui.BoxWidthStyle selectionWidthStyle = ui.BoxWidthStyle.max,\n    bool? enableInteractiveSelection,\n    this.floatingCursorAddedMargin = const EdgeInsets.fromLTRB(4, 4, 4, 5),\n    TextRange? promptRectRange,\n    Color? promptRectColor,\n    Clip clipBehavior = Clip.hardEdge,\n    required this.textSelectionDelegate,\n    RenderEditablePainter? painter,\n    RenderEditablePainter? foregroundPainter,\n    List<RenderBox>? children,\n    required this.controller,\n  }) : assert(maxLines == null || maxLines > 0),\n       assert(minLines == null || minLines > 0),\n       assert(\n         (maxLines == null) || (minLines == null) || (maxLines >= minLines),\n         \"minLines can't be greater than maxLines\",\n       ),\n       assert(\n         !expands || (maxLines == null && minLines == null),\n         'minLines and maxLines must be null when expands is true.',\n       ),\n       assert(\n         identical(textScaler, TextScaler.noScaling) || textScaleFactor == 1.0,\n         'textScaleFactor is deprecated and cannot be specified when textScaler is specified.',\n       ),\n       assert(obscuringCharacter.characters.length == 1),\n       assert(cursorWidth >= 0.0),\n       assert(cursorHeight == null || cursorHeight >= 0.0),\n       _textPainter = TextPainter(\n         text: text,\n         textAlign: textAlign,\n         textDirection: textDirection,\n         textScaler: textScaler == TextScaler.noScaling\n             ? TextScaler.linear(textScaleFactor)\n             : textScaler,\n         locale: locale,\n         maxLines: maxLines == 1 ? 1 : null,\n         strutStyle: strutStyle,\n         textHeightBehavior: textHeightBehavior,\n         textWidthBasis: textWidthBasis,\n       ),\n       _showCursor = showCursor ?? ValueNotifier<bool>(false),\n       _maxLines = maxLines,\n       _minLines = minLines,\n       _expands = expands,\n       _selection = selection,\n       _offset = offset,\n       _cursorWidth = cursorWidth,\n       _cursorHeight = cursorHeight,\n       _paintCursorOnTop = paintCursorAboveText,\n       _enableInteractiveSelection = enableInteractiveSelection,\n       _devicePixelRatio = devicePixelRatio,\n       _startHandleLayerLink = startHandleLayerLink,\n       _endHandleLayerLink = endHandleLayerLink,\n       _obscuringCharacter = obscuringCharacter,\n       _obscureText = obscureText,\n       _readOnly = readOnly,\n       _forceLine = forceLine,\n       _clipBehavior = clipBehavior,\n       _hasFocus = hasFocus ?? false,\n       _disposeShowCursor = showCursor == null {\n    assert(!_showCursor.value || cursorColor != null);\n\n    _selectionPainter.highlightColor = selectionColor;\n    _selectionPainter.highlightedRange = selection;\n    _selectionPainter.selectionHeightStyle = selectionHeightStyle;\n    _selectionPainter.selectionWidthStyle = selectionWidthStyle;\n\n    _autocorrectHighlightPainter.highlightColor = promptRectColor;\n    _autocorrectHighlightPainter.highlightedRange = promptRectRange;\n\n    _caretPainter.caretColor = cursorColor;\n    _caretPainter.cursorRadius = cursorRadius;\n    _caretPainter.cursorOffset = cursorOffset;\n    _caretPainter.backgroundCursorColor = backgroundCursorColor;\n\n    _updateForegroundPainter(foregroundPainter);\n    _updatePainter(painter);\n    addAll(children);\n  }\n\n  final RichTextEditingController controller;\n\n  /// Child render objects\n  _RenderEditableCustomPaint? _foregroundRenderObject;\n  _RenderEditableCustomPaint? _backgroundRenderObject;\n\n  @override\n  void dispose() {\n    _leaderLayerHandler.layer = null;\n    _foregroundRenderObject?.dispose();\n    _foregroundRenderObject = null;\n    _backgroundRenderObject?.dispose();\n    _backgroundRenderObject = null;\n    _clipRectLayer.layer = null;\n    _cachedBuiltInForegroundPainters?.dispose();\n    _cachedBuiltInPainters?.dispose();\n    _selectionStartInViewport.dispose();\n    _selectionEndInViewport.dispose();\n    _autocorrectHighlightPainter.dispose();\n    _selectionPainter.dispose();\n    _caretPainter.dispose();\n    _textPainter.dispose();\n    _textIntrinsicsCache?.dispose();\n    if (_disposeShowCursor) {\n      _showCursor.dispose();\n      _disposeShowCursor = false;\n    }\n    super.dispose();\n  }\n\n  void _updateForegroundPainter(RenderEditablePainter? newPainter) {\n    final _CompositeRenderEditablePainter effectivePainter = newPainter == null\n        ? _builtInForegroundPainters\n        : _CompositeRenderEditablePainter(\n            painters: <RenderEditablePainter>[\n              _builtInForegroundPainters,\n              newPainter,\n            ],\n          );\n\n    if (_foregroundRenderObject == null) {\n      final foregroundRenderObject = _RenderEditableCustomPaint(\n        painter: effectivePainter,\n      );\n      adoptChild(foregroundRenderObject);\n      _foregroundRenderObject = foregroundRenderObject;\n    } else {\n      _foregroundRenderObject?.painter = effectivePainter;\n    }\n    _foregroundPainter = newPainter;\n  }\n\n  /// The [RenderEditablePainter] to use for painting above this\n  /// [RenderEditable]'s text content.\n  ///\n  /// The new [RenderEditablePainter] will replace the previously specified\n  /// foreground painter, and schedule a repaint if the new painter's\n  /// `shouldRepaint` method returns true.\n  RenderEditablePainter? get foregroundPainter => _foregroundPainter;\n  RenderEditablePainter? _foregroundPainter;\n  set foregroundPainter(RenderEditablePainter? newPainter) {\n    if (newPainter == _foregroundPainter) {\n      return;\n    }\n    _updateForegroundPainter(newPainter);\n  }\n\n  void _updatePainter(RenderEditablePainter? newPainter) {\n    final _CompositeRenderEditablePainter effectivePainter = newPainter == null\n        ? _builtInPainters\n        : _CompositeRenderEditablePainter(\n            painters: <RenderEditablePainter>[_builtInPainters, newPainter],\n          );\n\n    if (_backgroundRenderObject == null) {\n      final backgroundRenderObject = _RenderEditableCustomPaint(\n        painter: effectivePainter,\n      );\n      adoptChild(backgroundRenderObject);\n      _backgroundRenderObject = backgroundRenderObject;\n    } else {\n      _backgroundRenderObject?.painter = effectivePainter;\n    }\n    _painter = newPainter;\n  }\n\n  /// Sets the [RenderEditablePainter] to use for painting beneath this\n  /// [RenderEditable]'s text content.\n  ///\n  /// The new [RenderEditablePainter] will replace the previously specified\n  /// painter, and schedule a repaint if the new painter's `shouldRepaint`\n  /// method returns true.\n  RenderEditablePainter? get painter => _painter;\n  RenderEditablePainter? _painter;\n  set painter(RenderEditablePainter? newPainter) {\n    if (newPainter == _painter) {\n      return;\n    }\n    _updatePainter(newPainter);\n  }\n\n  // Caret Painters:\n  // A single painter for both the regular caret and the floating cursor.\n  late final _CaretPainter _caretPainter = _CaretPainter();\n\n  // Text Highlight painters:\n  final _TextHighlightPainter _selectionPainter = _TextHighlightPainter();\n  final _TextHighlightPainter _autocorrectHighlightPainter =\n      _TextHighlightPainter();\n\n  _CompositeRenderEditablePainter get _builtInForegroundPainters =>\n      _cachedBuiltInForegroundPainters ??= _createBuiltInForegroundPainters();\n  _CompositeRenderEditablePainter? _cachedBuiltInForegroundPainters;\n  _CompositeRenderEditablePainter _createBuiltInForegroundPainters() {\n    return _CompositeRenderEditablePainter(\n      painters: <RenderEditablePainter>[\n        if (paintCursorAboveText) _caretPainter,\n      ],\n    );\n  }\n\n  _CompositeRenderEditablePainter get _builtInPainters =>\n      _cachedBuiltInPainters ??= _createBuiltInPainters();\n  _CompositeRenderEditablePainter? _cachedBuiltInPainters;\n  _CompositeRenderEditablePainter _createBuiltInPainters() {\n    return _CompositeRenderEditablePainter(\n      painters: <RenderEditablePainter>[\n        _autocorrectHighlightPainter,\n        _selectionPainter,\n        if (!paintCursorAboveText) _caretPainter,\n      ],\n    );\n  }\n\n  /// Whether the [handleEvent] will propagate pointer events to selection\n  /// handlers.\n  ///\n  /// If this property is true, the [handleEvent] assumes that this renderer\n  /// will be notified of input gestures via [handleTapDown], [handleTap],\n  /// [handleDoubleTap], and [handleLongPress].\n  ///\n  /// If there are any gesture recognizers in the text span, the [handleEvent]\n  /// will still propagate pointer events to those recognizers.\n  ///\n  /// The default value of this property is false.\n  bool ignorePointer;\n\n  /// {@macro dart.ui.textHeightBehavior}\n  TextHeightBehavior? get textHeightBehavior => _textPainter.textHeightBehavior;\n  set textHeightBehavior(TextHeightBehavior? value) {\n    if (_textPainter.textHeightBehavior == value) {\n      return;\n    }\n    _textPainter.textHeightBehavior = value;\n    markNeedsLayout();\n  }\n\n  /// {@macro flutter.painting.textPainter.textWidthBasis}\n  TextWidthBasis get textWidthBasis => _textPainter.textWidthBasis;\n  set textWidthBasis(TextWidthBasis value) {\n    if (_textPainter.textWidthBasis == value) {\n      return;\n    }\n    _textPainter.textWidthBasis = value;\n    markNeedsLayout();\n  }\n\n  /// The pixel ratio of the current device.\n  ///\n  /// Should be obtained by querying MediaQuery for the devicePixelRatio.\n  double get devicePixelRatio => _devicePixelRatio;\n  double _devicePixelRatio;\n  set devicePixelRatio(double value) {\n    if (devicePixelRatio == value) {\n      return;\n    }\n    _devicePixelRatio = value;\n    markNeedsLayout();\n  }\n\n  /// Character used for obscuring text if [obscureText] is true.\n  ///\n  /// Must have a length of exactly one.\n  String get obscuringCharacter => _obscuringCharacter;\n  String _obscuringCharacter;\n  set obscuringCharacter(String value) {\n    if (_obscuringCharacter == value) {\n      return;\n    }\n    assert(value.characters.length == 1);\n    _obscuringCharacter = value;\n    markNeedsLayout();\n  }\n\n  /// Whether to hide the text being edited (e.g., for passwords).\n  bool get obscureText => _obscureText;\n  bool _obscureText;\n  set obscureText(bool value) {\n    if (_obscureText == value) {\n      return;\n    }\n    _obscureText = value;\n    _cachedAttributedValue = null;\n    markNeedsSemanticsUpdate();\n  }\n\n  /// Controls how tall the selection highlight boxes are computed to be.\n  ///\n  /// See [ui.BoxHeightStyle] for details on available styles.\n  ui.BoxHeightStyle get selectionHeightStyle =>\n      _selectionPainter.selectionHeightStyle;\n  set selectionHeightStyle(ui.BoxHeightStyle value) {\n    _selectionPainter.selectionHeightStyle = value;\n  }\n\n  /// Controls how wide the selection highlight boxes are computed to be.\n  ///\n  /// See [ui.BoxWidthStyle] for details on available styles.\n  ui.BoxWidthStyle get selectionWidthStyle =>\n      _selectionPainter.selectionWidthStyle;\n  set selectionWidthStyle(ui.BoxWidthStyle value) {\n    _selectionPainter.selectionWidthStyle = value;\n  }\n\n  /// The object that controls the text selection, used by this render object\n  /// for implementing cut, copy, and paste keyboard shortcuts.\n  ///\n  /// It will make cut, copy and paste functionality work with the most recently\n  /// set [TextSelectionDelegate].\n  TextSelectionDelegate textSelectionDelegate;\n\n  /// Track whether position of the start of the selected text is within the viewport.\n  ///\n  /// For example, if the text contains \"Hello World\", and the user selects\n  /// \"Hello\", then scrolls so only \"World\" is visible, this will become false.\n  /// If the user scrolls back so that the \"H\" is visible again, this will\n  /// become true.\n  ///\n  /// This bool indicates whether the text is scrolled so that the handle is\n  /// inside the text field viewport, as opposed to whether it is actually\n  /// visible on the screen.\n  ValueListenable<bool> get selectionStartInViewport =>\n      _selectionStartInViewport;\n  final ValueNotifier<bool> _selectionStartInViewport = ValueNotifier<bool>(\n    true,\n  );\n\n  /// Track whether position of the end of the selected text is within the viewport.\n  ///\n  /// For example, if the text contains \"Hello World\", and the user selects\n  /// \"World\", then scrolls so only \"Hello\" is visible, this will become\n  /// 'false'. If the user scrolls back so that the \"d\" is visible again, this\n  /// will become 'true'.\n  ///\n  /// This bool indicates whether the text is scrolled so that the handle is\n  /// inside the text field viewport, as opposed to whether it is actually\n  /// visible on the screen.\n  ValueListenable<bool> get selectionEndInViewport => _selectionEndInViewport;\n  final ValueNotifier<bool> _selectionEndInViewport = ValueNotifier<bool>(true);\n\n  /// Returns the TextPosition above or below the given offset.\n  TextPosition _getTextPositionVertical(\n    TextPosition position,\n    double verticalOffset,\n  ) {\n    final Offset caretOffset = _textPainter.getOffsetForCaret(\n      position,\n      _caretPrototype,\n    );\n    final Offset caretOffsetTranslated = caretOffset.translate(\n      0.0,\n      verticalOffset,\n    );\n    return _textPainter.getPositionForOffset(caretOffsetTranslated);\n  }\n\n  // Start TextLayoutMetrics.\n\n  /// {@macro flutter.services.TextLayoutMetrics.getLineAtOffset}\n  @override\n  TextSelection getLineAtOffset(TextPosition position) {\n    final TextRange line = _textPainter.getLineBoundary(position);\n    // If text is obscured, the entire string should be treated as one line.\n    if (obscureText) {\n      return TextSelection(baseOffset: 0, extentOffset: plainText.length);\n    }\n    return TextSelection(baseOffset: line.start, extentOffset: line.end);\n  }\n\n  /// {@macro flutter.painting.TextPainter.getWordBoundary}\n  @override\n  TextRange getWordBoundary(TextPosition position) {\n    return _textPainter.getWordBoundary(position);\n  }\n\n  /// {@macro flutter.services.TextLayoutMetrics.getTextPositionAbove}\n  @override\n  TextPosition getTextPositionAbove(TextPosition position) {\n    // The caret offset gives a location in the upper left hand corner of\n    // the caret so the middle of the line above is a half line above that\n    // point and the line below is 1.5 lines below that point.\n    final double preferredLineHeight = _textPainter.preferredLineHeight;\n    final double verticalOffset = -0.5 * preferredLineHeight;\n    return _getTextPositionVertical(position, verticalOffset);\n  }\n\n  /// {@macro flutter.services.TextLayoutMetrics.getTextPositionBelow}\n  @override\n  TextPosition getTextPositionBelow(TextPosition position) {\n    // The caret offset gives a location in the upper left hand corner of\n    // the caret so the middle of the line above is a half line above that\n    // point and the line below is 1.5 lines below that point.\n    final double preferredLineHeight = _textPainter.preferredLineHeight;\n    final double verticalOffset = 1.5 * preferredLineHeight;\n    return _getTextPositionVertical(position, verticalOffset);\n  }\n\n  // End TextLayoutMetrics.\n\n  void _updateSelectionExtentsVisibility(Offset effectiveOffset) {\n    assert(selection != null);\n    if (!selection!.isValid) {\n      _selectionStartInViewport.value = false;\n      _selectionEndInViewport.value = false;\n      return;\n    }\n    final Rect visibleRegion = Offset.zero & size;\n\n    final Offset startOffset = _textPainter.getOffsetForCaret(\n      TextPosition(offset: selection!.start, affinity: selection!.affinity),\n      _caretPrototype,\n    );\n    // Check if the selection is visible with an approximation because a\n    // difference between rounded and unrounded values causes the caret to be\n    // reported as having a slightly (< 0.5) negative y offset. This rounding\n    // happens in paragraph.cc's layout and TextPainter's\n    // _applyFloatingPointHack. Ideally, the rounding mismatch will be fixed and\n    // this can be changed to be a strict check instead of an approximation.\n    const visibleRegionSlop = 0.5;\n    _selectionStartInViewport.value = visibleRegion\n        .inflate(visibleRegionSlop)\n        .contains(startOffset + effectiveOffset);\n\n    final Offset endOffset = _textPainter.getOffsetForCaret(\n      TextPosition(offset: selection!.end, affinity: selection!.affinity),\n      _caretPrototype,\n    );\n    _selectionEndInViewport.value = visibleRegion\n        .inflate(visibleRegionSlop)\n        .contains(endOffset + effectiveOffset);\n  }\n\n  void _setTextEditingValue(\n    TextEditingValue newValue,\n    SelectionChangedCause cause,\n  ) {\n    textSelectionDelegate.userUpdateTextEditingValue(newValue, cause);\n  }\n\n  void _setSelection(TextSelection nextSelection, SelectionChangedCause cause) {\n    if (nextSelection.isValid) {\n      // The nextSelection is calculated based on plainText, which can be out\n      // of sync with the textSelectionDelegate.textEditingValue by one frame.\n      // This is due to the render editable and editable text handle pointer\n      // event separately. If the editable text changes the text during the\n      // event handler, the render editable will use the outdated text stored in\n      // the plainText when handling the pointer event.\n      //\n      // If this happens, we need to make sure the new selection is still valid.\n      final int textLength = textSelectionDelegate.textEditingValue.text.length;\n      nextSelection = nextSelection.copyWith(\n        baseOffset: math.min(nextSelection.baseOffset, textLength),\n        extentOffset: math.min(nextSelection.extentOffset, textLength),\n      );\n    }\n    _setTextEditingValue(\n      textSelectionDelegate.textEditingValue.copyWith(selection: nextSelection),\n      cause,\n    );\n  }\n\n  @override\n  void markNeedsPaint() {\n    super.markNeedsPaint();\n    // Tell the painters to repaint since text layout may have changed.\n    _foregroundRenderObject?.markNeedsPaint();\n    _backgroundRenderObject?.markNeedsPaint();\n  }\n\n  @override\n  void systemFontsDidChange() {\n    super.systemFontsDidChange();\n    _textPainter.markNeedsLayout();\n  }\n\n  /// Returns a plain text version of the text in [TextPainter].\n  ///\n  /// If [obscureText] is true, returns the obscured text. See\n  /// [obscureText] and [obscuringCharacter].\n  /// In order to get the styled text as an [InlineSpan] tree, use [text].\n  String get plainText => _textPainter.plainText;\n\n  /// The text to paint in the form of a tree of [InlineSpan]s.\n  ///\n  /// In order to get the plain text representation, use [plainText].\n  InlineSpan? get text => _textPainter.text;\n  final TextPainter _textPainter;\n  AttributedString? _cachedAttributedValue;\n  List<InlineSpanSemanticsInformation>? _cachedCombinedSemanticsInfos;\n  set text(InlineSpan? value) {\n    if (_textPainter.text == value) {\n      return;\n    }\n    _cachedLineBreakCount = null;\n    _textPainter.text = value;\n    _cachedAttributedValue = null;\n    _cachedCombinedSemanticsInfos = null;\n    markNeedsLayout();\n    markNeedsSemanticsUpdate();\n  }\n\n  TextPainter? _textIntrinsicsCache;\n  TextPainter get _textIntrinsics {\n    return (_textIntrinsicsCache ??= TextPainter())\n      ..text = _textPainter.text\n      ..textAlign = _textPainter.textAlign\n      ..textDirection = _textPainter.textDirection\n      ..textScaler = _textPainter.textScaler\n      ..maxLines = _textPainter.maxLines\n      ..ellipsis = _textPainter.ellipsis\n      ..locale = _textPainter.locale\n      ..strutStyle = _textPainter.strutStyle\n      ..textWidthBasis = _textPainter.textWidthBasis\n      ..textHeightBehavior = _textPainter.textHeightBehavior;\n  }\n\n  /// How the text should be aligned horizontally.\n  TextAlign get textAlign => _textPainter.textAlign;\n  set textAlign(TextAlign value) {\n    if (_textPainter.textAlign == value) {\n      return;\n    }\n    _textPainter.textAlign = value;\n    markNeedsLayout();\n  }\n\n  /// The directionality of the text.\n  ///\n  /// This decides how the [TextAlign.start], [TextAlign.end], and\n  /// [TextAlign.justify] values of [textAlign] are interpreted.\n  ///\n  /// This is also used to disambiguate how to render bidirectional text. For\n  /// example, if the [text] is an English phrase followed by a Hebrew phrase,\n  /// in a [TextDirection.ltr] context the English phrase will be on the left\n  /// and the Hebrew phrase to its right, while in a [TextDirection.rtl]\n  /// context, the English phrase will be on the right and the Hebrew phrase on\n  /// its left.\n  // TextPainter.textDirection is nullable, but it is set to a\n  // non-null value in the RenderEditable constructor and we refuse to\n  // set it to null here, so _textPainter.textDirection cannot be null.\n  TextDirection get textDirection => _textPainter.textDirection!;\n  set textDirection(TextDirection value) {\n    if (_textPainter.textDirection == value) {\n      return;\n    }\n    _textPainter.textDirection = value;\n    markNeedsLayout();\n    markNeedsSemanticsUpdate();\n  }\n\n  /// Used by this renderer's internal [TextPainter] to select a locale-specific\n  /// font.\n  ///\n  /// In some cases the same Unicode character may be rendered differently depending\n  /// on the locale. For example the '骨' character is rendered differently in\n  /// the Chinese and Japanese locales. In these cases the [locale] may be used\n  /// to select a locale-specific font.\n  ///\n  /// If this value is null, a system-dependent algorithm is used to select\n  /// the font.\n  Locale? get locale => _textPainter.locale;\n  set locale(Locale? value) {\n    if (_textPainter.locale == value) {\n      return;\n    }\n    _textPainter.locale = value;\n    markNeedsLayout();\n  }\n\n  /// The [StrutStyle] used by the renderer's internal [TextPainter] to\n  /// determine the strut to use.\n  StrutStyle? get strutStyle => _textPainter.strutStyle;\n  set strutStyle(StrutStyle? value) {\n    if (_textPainter.strutStyle == value) {\n      return;\n    }\n    _textPainter.strutStyle = value;\n    markNeedsLayout();\n  }\n\n  /// The color to use when painting the cursor.\n  Color? get cursorColor => _caretPainter.caretColor;\n  set cursorColor(Color? value) {\n    _caretPainter.caretColor = value;\n  }\n\n  /// The color to use when painting the cursor aligned to the text while\n  /// rendering the floating cursor.\n  ///\n  /// Typically this would be set to [CupertinoColors.inactiveGray].\n  ///\n  /// If this is null, the background cursor is not painted.\n  ///\n  /// See also:\n  ///\n  ///  * [FloatingCursorDragState], which explains the floating cursor feature\n  ///    in detail.\n  Color? get backgroundCursorColor => _caretPainter.backgroundCursorColor;\n  set backgroundCursorColor(Color? value) {\n    _caretPainter.backgroundCursorColor = value;\n  }\n\n  bool _disposeShowCursor;\n\n  /// Whether to paint the cursor.\n  ValueNotifier<bool> get showCursor => _showCursor;\n  ValueNotifier<bool> _showCursor;\n  set showCursor(ValueNotifier<bool> value) {\n    if (_showCursor == value) {\n      return;\n    }\n    if (attached) {\n      _showCursor.removeListener(_showHideCursor);\n    }\n    if (_disposeShowCursor) {\n      _showCursor.dispose();\n      _disposeShowCursor = false;\n    }\n    _showCursor = value;\n    if (attached) {\n      _showHideCursor();\n      _showCursor.addListener(_showHideCursor);\n    }\n  }\n\n  void _showHideCursor() {\n    _caretPainter.shouldPaint = showCursor.value;\n  }\n\n  /// Whether the editable is currently focused.\n  bool get hasFocus => _hasFocus;\n  bool _hasFocus = false;\n  set hasFocus(bool value) {\n    if (_hasFocus == value) {\n      return;\n    }\n    _hasFocus = value;\n    markNeedsSemanticsUpdate();\n  }\n\n  /// Whether this rendering object will take a full line regardless the text width.\n  bool get forceLine => _forceLine;\n  bool _forceLine = false;\n  set forceLine(bool value) {\n    if (_forceLine == value) {\n      return;\n    }\n    _forceLine = value;\n    markNeedsLayout();\n  }\n\n  /// Whether this rendering object is read only.\n  bool get readOnly => _readOnly;\n  bool _readOnly = false;\n  set readOnly(bool value) {\n    if (_readOnly == value) {\n      return;\n    }\n    _readOnly = value;\n    markNeedsSemanticsUpdate();\n  }\n\n  /// The maximum number of lines for the text to span, wrapping if necessary.\n  ///\n  /// If this is 1 (the default), the text will not wrap, but will extend\n  /// indefinitely instead.\n  ///\n  /// If this is null, there is no limit to the number of lines.\n  ///\n  /// When this is not null, the intrinsic height of the render object is the\n  /// height of one line of text multiplied by this value. In other words, this\n  /// also controls the height of the actual editing widget.\n  int? get maxLines => _maxLines;\n  int? _maxLines;\n\n  /// The value may be null. If it is not null, then it must be greater than zero.\n  set maxLines(int? value) {\n    assert(value == null || value > 0);\n    if (maxLines == value) {\n      return;\n    }\n    _maxLines = value;\n\n    // Special case maxLines == 1 to keep only the first line so we can get the\n    // height of the first line in case there are hard line breaks in the text.\n    // See the `_preferredHeight` method.\n    _textPainter.maxLines = value == 1 ? 1 : null;\n    markNeedsLayout();\n  }\n\n  /// {@macro flutter.widgets.editableText.minLines}\n  int? get minLines => _minLines;\n  int? _minLines;\n\n  /// The value may be null. If it is not null, then it must be greater than zero.\n  set minLines(int? value) {\n    assert(value == null || value > 0);\n    if (minLines == value) {\n      return;\n    }\n    _minLines = value;\n    markNeedsLayout();\n  }\n\n  /// {@macro flutter.widgets.editableText.expands}\n  bool get expands => _expands;\n  bool _expands;\n  set expands(bool value) {\n    if (expands == value) {\n      return;\n    }\n    _expands = value;\n    markNeedsLayout();\n  }\n\n  /// The color to use when painting the selection.\n  Color? get selectionColor => _selectionPainter.highlightColor;\n  set selectionColor(Color? value) {\n    _selectionPainter.highlightColor = value;\n  }\n\n  /// Deprecated. Will be removed in a future version of Flutter. Use\n  /// [textScaler] instead.\n  ///\n  /// The number of font pixels for each logical pixel.\n  ///\n  /// For example, if the text scale factor is 1.5, text will be 50% larger than\n  /// the specified font size.\n  @Deprecated(\n    'Use textScaler instead. '\n    'Use of textScaleFactor was deprecated in preparation for the upcoming nonlinear text scaling support. '\n    'This feature was deprecated after v3.12.0-2.0.pre.',\n  )\n  double get textScaleFactor => _textPainter.textScaleFactor;\n  @Deprecated(\n    'Use textScaler instead. '\n    'Use of textScaleFactor was deprecated in preparation for the upcoming nonlinear text scaling support. '\n    'This feature was deprecated after v3.12.0-2.0.pre.',\n  )\n  set textScaleFactor(double value) {\n    textScaler = TextScaler.linear(value);\n  }\n\n  /// {@macro flutter.painting.textPainter.textScaler}\n  TextScaler get textScaler => _textPainter.textScaler;\n  set textScaler(TextScaler value) {\n    if (_textPainter.textScaler == value) {\n      return;\n    }\n    _textPainter.textScaler = value;\n    markNeedsLayout();\n  }\n\n  /// The region of text that is selected, if any.\n  ///\n  /// The caret position is represented by a collapsed selection.\n  ///\n  /// If [selection] is null, there is no selection and attempts to\n  /// manipulate the selection will throw.\n  TextSelection? get selection => _selection;\n  TextSelection? _selection;\n  set selection(TextSelection? value) {\n    if (_selection == value) {\n      return;\n    }\n    _selection = value;\n    _selectionPainter.highlightedRange = value;\n    markNeedsPaint();\n    markNeedsSemanticsUpdate();\n  }\n\n  /// The offset at which the text should be painted.\n  ///\n  /// If the text content is larger than the editable line itself, the editable\n  /// line clips the text. This property controls which part of the text is\n  /// visible by shifting the text by the given offset before clipping.\n  ViewportOffset get offset => _offset;\n  ViewportOffset _offset;\n  set offset(ViewportOffset value) {\n    if (_offset == value) {\n      return;\n    }\n    if (attached) {\n      _offset.removeListener(markNeedsPaint);\n    }\n    _offset = value;\n    if (attached) {\n      _offset.addListener(markNeedsPaint);\n    }\n    markNeedsLayout();\n  }\n\n  /// How thick the cursor will be.\n  double get cursorWidth => _cursorWidth;\n  double _cursorWidth = 1.0;\n  set cursorWidth(double value) {\n    if (_cursorWidth == value) {\n      return;\n    }\n    _cursorWidth = value;\n    markNeedsLayout();\n  }\n\n  /// How tall the cursor will be.\n  ///\n  /// This can be null, in which case the getter will actually return [preferredLineHeight].\n  ///\n  /// Setting this to itself fixes the value to the current [preferredLineHeight]. Setting\n  /// this to null returns the behavior of deferring to [preferredLineHeight].\n  // TODO(ianh): This is a confusing API. We should have a separate getter for the effective cursor height.\n  double get cursorHeight => _cursorHeight ?? preferredLineHeight;\n  double? _cursorHeight;\n  set cursorHeight(double? value) {\n    if (_cursorHeight == value) {\n      return;\n    }\n    _cursorHeight = value;\n    markNeedsLayout();\n  }\n\n  /// {@template flutter.rendering.RenderEditable.paintCursorAboveText}\n  /// If the cursor should be painted on top of the text or underneath it.\n  ///\n  /// By default, the cursor should be painted on top for iOS platforms and\n  /// underneath for Android platforms.\n  /// {@endtemplate}\n  bool get paintCursorAboveText => _paintCursorOnTop;\n  bool _paintCursorOnTop;\n  set paintCursorAboveText(bool value) {\n    if (_paintCursorOnTop == value) {\n      return;\n    }\n    _paintCursorOnTop = value;\n    // Clear cached built-in painters and reconfigure painters.\n    _cachedBuiltInForegroundPainters = null;\n    _cachedBuiltInPainters = null;\n    // Call update methods to rebuild and set the effective painters.\n    _updateForegroundPainter(_foregroundPainter);\n    _updatePainter(_painter);\n  }\n\n  /// {@template flutter.rendering.RenderEditable.cursorOffset}\n  /// The offset that is used, in pixels, when painting the cursor on screen.\n  ///\n  /// By default, the cursor position should be set to an offset of\n  /// (-[cursorWidth] * 0.5, 0.0) on iOS platforms and (0, 0) on Android\n  /// platforms. The origin from where the offset is applied to is the arbitrary\n  /// location where the cursor ends up being rendered from by default.\n  /// {@endtemplate}\n  Offset get cursorOffset => _caretPainter.cursorOffset;\n  set cursorOffset(Offset value) {\n    _caretPainter.cursorOffset = value;\n  }\n\n  /// How rounded the corners of the cursor should be.\n  ///\n  /// A null value is the same as [Radius.zero].\n  Radius? get cursorRadius => _caretPainter.cursorRadius;\n  set cursorRadius(Radius? value) {\n    _caretPainter.cursorRadius = value;\n  }\n\n  /// The [LayerLink] of start selection handle.\n  ///\n  /// [RenderEditable] is responsible for calculating the [Offset] of this\n  /// [LayerLink], which will be used as [CompositedTransformTarget] of start handle.\n  LayerLink get startHandleLayerLink => _startHandleLayerLink;\n  LayerLink _startHandleLayerLink;\n  set startHandleLayerLink(LayerLink value) {\n    if (_startHandleLayerLink == value) {\n      return;\n    }\n    _startHandleLayerLink = value;\n    markNeedsPaint();\n  }\n\n  /// The [LayerLink] of end selection handle.\n  ///\n  /// [RenderEditable] is responsible for calculating the [Offset] of this\n  /// [LayerLink], which will be used as [CompositedTransformTarget] of end handle.\n  LayerLink get endHandleLayerLink => _endHandleLayerLink;\n  LayerLink _endHandleLayerLink;\n  set endHandleLayerLink(LayerLink value) {\n    if (_endHandleLayerLink == value) {\n      return;\n    }\n    _endHandleLayerLink = value;\n    markNeedsPaint();\n  }\n\n  /// The padding applied to text field. Used to determine the bounds when\n  /// moving the floating cursor.\n  ///\n  /// Defaults to a padding with left, top and right set to 4, bottom to 5.\n  ///\n  /// See also:\n  ///\n  ///  * [FloatingCursorDragState], which explains the floating cursor feature\n  ///    in detail.\n  EdgeInsets floatingCursorAddedMargin;\n\n  /// Returns true if the floating cursor is visible, false otherwise.\n  bool get floatingCursorOn => _floatingCursorOn;\n  bool _floatingCursorOn = false;\n  late TextPosition _floatingCursorTextPosition;\n\n  /// Whether to allow the user to change the selection.\n  ///\n  /// Since [RenderEditable] does not handle selection manipulation\n  /// itself, this actually only affects whether the accessibility\n  /// hints provided to the system (via\n  /// [describeSemanticsConfiguration]) will enable selection\n  /// manipulation. It's the responsibility of this object's owner\n  /// to provide selection manipulation affordances.\n  ///\n  /// This field is used by [selectionEnabled] (which then controls\n  /// the accessibility hints mentioned above). When null,\n  /// [obscureText] is used to determine the value of\n  /// [selectionEnabled] instead.\n  bool? get enableInteractiveSelection => _enableInteractiveSelection;\n  bool? _enableInteractiveSelection;\n  set enableInteractiveSelection(bool? value) {\n    if (_enableInteractiveSelection == value) {\n      return;\n    }\n    _enableInteractiveSelection = value;\n    markNeedsLayout();\n    markNeedsSemanticsUpdate();\n  }\n\n  /// Whether interactive selection are enabled based on the values of\n  /// [enableInteractiveSelection] and [obscureText].\n  ///\n  /// Since [RenderEditable] does not handle selection manipulation\n  /// itself, this actually only affects whether the accessibility\n  /// hints provided to the system (via\n  /// [describeSemanticsConfiguration]) will enable selection\n  /// manipulation. It's the responsibility of this object's owner\n  /// to provide selection manipulation affordances.\n  ///\n  /// By default, [enableInteractiveSelection] is null, [obscureText] is false,\n  /// and this getter returns true.\n  ///\n  /// If [enableInteractiveSelection] is null and [obscureText] is true, then this\n  /// getter returns false. This is the common case for password fields.\n  ///\n  /// If [enableInteractiveSelection] is non-null then its value is\n  /// returned. An application might [enableInteractiveSelection] to\n  /// true to enable interactive selection for a password field, or to\n  /// false to unconditionally disable interactive selection.\n  bool get selectionEnabled {\n    return enableInteractiveSelection ?? !obscureText;\n  }\n\n  /// The color used to paint the prompt rectangle.\n  ///\n  /// The prompt rectangle will only be requested on non-web iOS applications.\n  // TODO(ianh): We should change the getter to return null when _promptRectRange is null\n  // (otherwise, if you set it to null and then get it, you get back non-null).\n  // Alternatively, we could stop supporting setting this to null.\n  Color? get promptRectColor => _autocorrectHighlightPainter.highlightColor;\n  set promptRectColor(Color? newValue) {\n    _autocorrectHighlightPainter.highlightColor = newValue;\n  }\n\n  /// Dismisses the currently displayed prompt rectangle and displays a new prompt rectangle\n  /// over [newRange] in the given color [promptRectColor].\n  ///\n  /// The prompt rectangle will only be requested on non-web iOS applications.\n  ///\n  /// When set to null, the currently displayed prompt rectangle (if any) will be dismissed.\n  // ignore: use_setters_to_change_properties, (API predates enforcing the lint)\n  void setPromptRectRange(TextRange? newRange) {\n    _autocorrectHighlightPainter.highlightedRange = newRange;\n  }\n\n  /// The maximum amount the text is allowed to scroll.\n  ///\n  /// This value is only valid after layout and can change as additional\n  /// text is entered or removed in order to accommodate expanding when\n  /// [expands] is set to true.\n  double get maxScrollExtent => _maxScrollExtent;\n  double _maxScrollExtent = 0;\n\n  double get _caretMargin => _kCaretGap + cursorWidth;\n\n  /// {@macro flutter.material.Material.clipBehavior}\n  ///\n  /// Defaults to [Clip.hardEdge].\n  Clip get clipBehavior => _clipBehavior;\n  Clip _clipBehavior = Clip.hardEdge;\n  set clipBehavior(Clip value) {\n    if (value != _clipBehavior) {\n      _clipBehavior = value;\n      markNeedsPaint();\n      markNeedsSemanticsUpdate();\n    }\n  }\n\n  /// Collected during [describeSemanticsConfiguration], used by\n  /// [assembleSemanticsNode].\n  List<InlineSpanSemanticsInformation>? _semanticsInfo;\n\n  // Caches [SemanticsNode]s created during [assembleSemanticsNode] so they\n  // can be re-used when [assembleSemanticsNode] is called again. This ensures\n  // stable ids for the [SemanticsNode]s of [TextSpan]s across\n  // [assembleSemanticsNode] invocations.\n  Map<Key, SemanticsNode>? _cachedChildNodes;\n\n  /// Returns a list of rects that bound the given selection, and the text\n  /// direction. The text direction is used by the engine to calculate\n  /// the closest position to a given point.\n  ///\n  /// See [TextPainter.getBoxesForSelection] for more details.\n  List<TextBox> getBoxesForSelection(TextSelection selection) {\n    _computeTextMetricsIfNeeded();\n    return _textPainter\n        .getBoxesForSelection(\n          selection,\n          boxHeightStyle: selectionHeightStyle,\n          boxWidthStyle: selectionWidthStyle,\n        )\n        .map(\n          (TextBox textBox) => TextBox.fromLTRBD(\n            textBox.left + _paintOffset.dx,\n            textBox.top + _paintOffset.dy,\n            textBox.right + _paintOffset.dx,\n            textBox.bottom + _paintOffset.dy,\n            textBox.direction,\n          ),\n        )\n        .toList();\n  }\n\n  @override\n  void describeSemanticsConfiguration(SemanticsConfiguration config) {\n    super.describeSemanticsConfiguration(config);\n    _semanticsInfo = _textPainter.text!.getSemanticsInformation();\n    // TODO(chunhtai): the macOS does not provide a public API to support text\n    // selections across multiple semantics nodes. Remove this platform check\n    // once we can support it.\n    // https://github.com/flutter/flutter/issues/77957\n    if (_semanticsInfo!.any(\n          (InlineSpanSemanticsInformation info) => info.recognizer != null,\n        ) &&\n        defaultTargetPlatform != TargetPlatform.macOS) {\n      // assert(readOnly && !obscureText);\n      // For Selectable rich text with recognizer, we need to create a semantics\n      // node for each text fragment.\n      config\n        ..isSemanticBoundary = true\n        ..explicitChildNodes = true;\n      return;\n    }\n    if (_cachedAttributedValue == null) {\n      if (obscureText) {\n        _cachedAttributedValue = AttributedString(\n          obscuringCharacter * plainText.length,\n        );\n      } else {\n        final buffer = StringBuffer();\n        var offset = 0;\n        final attributes = <StringAttribute>[];\n        for (final InlineSpanSemanticsInformation info in _semanticsInfo!) {\n          final String label = info.semanticsLabel ?? info.text;\n          for (final StringAttribute infoAttribute in info.stringAttributes) {\n            final TextRange originalRange = infoAttribute.range;\n            attributes.add(\n              infoAttribute.copy(\n                range: TextRange(\n                  start: offset + originalRange.start,\n                  end: offset + originalRange.end,\n                ),\n              ),\n            );\n          }\n          buffer.write(label);\n          offset += label.length;\n        }\n        _cachedAttributedValue = AttributedString(\n          buffer.toString(),\n          attributes: attributes,\n        );\n      }\n    }\n    config\n      ..attributedValue = _cachedAttributedValue!\n      ..isObscured = obscureText\n      ..isMultiline = _isMultiline\n      ..textDirection = textDirection\n      ..isFocused = hasFocus\n      ..isFocusable = true\n      ..isTextField = true\n      ..isReadOnly = readOnly\n      // This is the default for customer that uses RenderEditable directly.\n      // The real value is typically set by EditableText.\n      ..inputType = ui.SemanticsInputType.text;\n\n    if (hasFocus && selectionEnabled) {\n      config.onSetSelection = _handleSetSelection;\n    }\n\n    if (hasFocus && !readOnly) {\n      config.onSetText = _handleSetText;\n    }\n\n    if (selectionEnabled && (selection?.isValid ?? false)) {\n      config.textSelection = selection;\n      if (_textPainter.getOffsetBefore(selection!.extentOffset) != null) {\n        config\n          ..onMoveCursorBackwardByWord = _handleMoveCursorBackwardByWord\n          ..onMoveCursorBackwardByCharacter =\n              _handleMoveCursorBackwardByCharacter;\n      }\n      if (_textPainter.getOffsetAfter(selection!.extentOffset) != null) {\n        config\n          ..onMoveCursorForwardByWord = _handleMoveCursorForwardByWord\n          ..onMoveCursorForwardByCharacter =\n              _handleMoveCursorForwardByCharacter;\n      }\n    }\n  }\n\n  void _handleSetText(String text) {\n    textSelectionDelegate.userUpdateTextEditingValue(\n      TextEditingValue(\n        text: text,\n        selection: TextSelection.collapsed(offset: text.length),\n      ),\n      SelectionChangedCause.keyboard,\n    );\n  }\n\n  @override\n  void assembleSemanticsNode(\n    SemanticsNode node,\n    SemanticsConfiguration config,\n    Iterable<SemanticsNode> children,\n  ) {\n    assert(_semanticsInfo != null && _semanticsInfo!.isNotEmpty);\n    final newChildren = <SemanticsNode>[];\n    TextDirection currentDirection = textDirection;\n    Rect currentRect;\n    var ordinal = 0.0;\n    var start = 0;\n    var placeholderIndex = 0;\n    var childIndex = 0;\n    RenderBox? child = firstChild;\n    final newChildCache = <Key, SemanticsNode>{};\n    _cachedCombinedSemanticsInfos ??= combineSemanticsInfo(_semanticsInfo!);\n    for (final InlineSpanSemanticsInformation info\n        in _cachedCombinedSemanticsInfos!) {\n      final selection = TextSelection(\n        baseOffset: start,\n        extentOffset: start + info.text.length,\n      );\n      start += info.text.length;\n\n      if (info.isPlaceholder) {\n        // A placeholder span may have 0 to multiple semantics nodes, we need\n        // to annotate all of the semantics nodes belong to this span.\n        while (children.length > childIndex &&\n            children\n                .elementAt(childIndex)\n                .isTagged(PlaceholderSpanIndexSemanticsTag(placeholderIndex))) {\n          final SemanticsNode childNode = children.elementAt(childIndex);\n          final parentData = child!.parentData! as TextParentData;\n          assert(parentData.offset != null);\n          newChildren.add(childNode);\n          childIndex += 1;\n        }\n        child = childAfter(child!);\n        placeholderIndex += 1;\n      } else {\n        final initialDirection = currentDirection;\n        final List<ui.TextBox> rects = _textPainter.getBoxesForSelection(\n          selection,\n        );\n        if (rects.isEmpty) {\n          continue;\n        }\n        Rect rect = rects.first.toRect();\n        currentDirection = rects.first.direction;\n        for (final ui.TextBox textBox in rects.skip(1)) {\n          rect = rect.expandToInclude(textBox.toRect());\n          currentDirection = textBox.direction;\n        }\n        // Any of the text boxes may have had infinite dimensions.\n        // We shouldn't pass infinite dimensions up to the bridges.\n        rect = Rect.fromLTWH(\n          math.max(0.0, rect.left),\n          math.max(0.0, rect.top),\n          math.min(rect.width, constraints.maxWidth),\n          math.min(rect.height, constraints.maxHeight),\n        );\n        // Round the current rectangle to make this API testable and add some\n        // padding so that the accessibility rects do not overlap with the text.\n        currentRect = Rect.fromLTRB(\n          rect.left.floorToDouble() - 4.0,\n          rect.top.floorToDouble() - 4.0,\n          rect.right.ceilToDouble() + 4.0,\n          rect.bottom.ceilToDouble() + 4.0,\n        );\n        final configuration = SemanticsConfiguration()\n          ..sortKey = OrdinalSortKey(ordinal++)\n          ..textDirection = initialDirection\n          ..attributedLabel = AttributedString(\n            info.semanticsLabel ?? info.text,\n            attributes: info.stringAttributes,\n          );\n        switch (info.recognizer) {\n          case TapGestureRecognizer(onTap: final VoidCallback? handler):\n          case DoubleTapGestureRecognizer(\n            onDoubleTap: final VoidCallback? handler,\n          ):\n            if (handler != null) {\n              configuration\n                ..onTap = handler\n                ..isLink = true;\n            }\n          case LongPressGestureRecognizer(\n            onLongPress: final GestureLongPressCallback? onLongPress,\n          ):\n            if (onLongPress != null) {\n              configuration.onLongPress = onLongPress;\n            }\n          case null:\n            break;\n          default:\n            assert(false, '${info.recognizer.runtimeType} is not supported.');\n        }\n        if (node.parentPaintClipRect != null) {\n          final Rect paintRect = node.parentPaintClipRect!.intersect(\n            currentRect,\n          );\n          configuration.isHidden = paintRect.isEmpty && !currentRect.isEmpty;\n        }\n        late final SemanticsNode newChild;\n        if (_cachedChildNodes?.isNotEmpty ?? false) {\n          newChild = _cachedChildNodes!.remove(_cachedChildNodes!.keys.first)!;\n        } else {\n          final key = UniqueKey();\n          newChild = SemanticsNode(\n            key: key,\n            showOnScreen: _createShowOnScreenFor(key),\n          );\n        }\n        newChild\n          ..updateWith(config: configuration)\n          ..rect = currentRect;\n        newChildCache[newChild.key!] = newChild;\n        newChildren.add(newChild);\n      }\n    }\n    _cachedChildNodes = newChildCache;\n    node.updateWith(config: config, childrenInInversePaintOrder: newChildren);\n  }\n\n  VoidCallback? _createShowOnScreenFor(Key key) {\n    return () {\n      final SemanticsNode node = _cachedChildNodes![key]!;\n      showOnScreen(descendant: this, rect: node.rect);\n    };\n  }\n\n  // TODO(ianh): in theory, [selection] could become null between when\n  // we last called describeSemanticsConfiguration and when the\n  // callbacks are invoked, in which case the callbacks will crash...\n\n  void _handleSetSelection(TextSelection selection) {\n    _setSelection(selection, SelectionChangedCause.keyboard);\n  }\n\n  void _handleMoveCursorForwardByCharacter(bool extendSelection) {\n    assert(selection != null);\n    final int? extentOffset = _textPainter.getOffsetAfter(\n      selection!.extentOffset,\n    );\n    if (extentOffset == null) {\n      return;\n    }\n    final int baseOffset = !extendSelection\n        ? extentOffset\n        : selection!.baseOffset;\n    _setSelection(\n      TextSelection(baseOffset: baseOffset, extentOffset: extentOffset),\n      SelectionChangedCause.keyboard,\n    );\n  }\n\n  void _handleMoveCursorBackwardByCharacter(bool extendSelection) {\n    assert(selection != null);\n    final int? extentOffset = _textPainter.getOffsetBefore(\n      selection!.extentOffset,\n    );\n    if (extentOffset == null) {\n      return;\n    }\n    final int baseOffset = !extendSelection\n        ? extentOffset\n        : selection!.baseOffset;\n    _setSelection(\n      TextSelection(baseOffset: baseOffset, extentOffset: extentOffset),\n      SelectionChangedCause.keyboard,\n    );\n  }\n\n  void _handleMoveCursorForwardByWord(bool extendSelection) {\n    assert(selection != null);\n    final TextRange currentWord = _textPainter.getWordBoundary(\n      selection!.extent,\n    );\n    final TextRange? nextWord = _getNextWord(currentWord.end);\n    if (nextWord == null) {\n      return;\n    }\n    final int baseOffset = extendSelection\n        ? selection!.baseOffset\n        : nextWord.start;\n    _setSelection(\n      TextSelection(baseOffset: baseOffset, extentOffset: nextWord.start),\n      SelectionChangedCause.keyboard,\n    );\n  }\n\n  void _handleMoveCursorBackwardByWord(bool extendSelection) {\n    assert(selection != null);\n    final TextRange currentWord = _textPainter.getWordBoundary(\n      selection!.extent,\n    );\n    final TextRange? previousWord = _getPreviousWord(currentWord.start - 1);\n    if (previousWord == null) {\n      return;\n    }\n    final int baseOffset = extendSelection\n        ? selection!.baseOffset\n        : previousWord.start;\n    _setSelection(\n      TextSelection(baseOffset: baseOffset, extentOffset: previousWord.start),\n      SelectionChangedCause.keyboard,\n    );\n  }\n\n  TextRange? _getNextWord(int offset) {\n    while (true) {\n      final TextRange range = _textPainter.getWordBoundary(\n        TextPosition(offset: offset),\n      );\n      if (!range.isValid || range.isCollapsed) {\n        return null;\n      }\n      if (!_onlyWhitespace(range)) {\n        return range;\n      }\n      offset = range.end;\n    }\n  }\n\n  TextRange? _getPreviousWord(int offset) {\n    while (offset >= 0) {\n      final TextRange range = _textPainter.getWordBoundary(\n        TextPosition(offset: offset),\n      );\n      if (!range.isValid || range.isCollapsed) {\n        return null;\n      }\n      if (!_onlyWhitespace(range)) {\n        return range;\n      }\n      offset = range.start - 1;\n    }\n    return null;\n  }\n\n  // Check if the given text range only contains white space or separator\n  // characters.\n  //\n  // Includes newline characters from ASCII and separators from the\n  // [unicode separator category](https://www.compart.com/en/unicode/category/Zs)\n  // TODO(zanderso): replace when we expose this ICU information.\n  bool _onlyWhitespace(TextRange range) {\n    for (int i = range.start; i < range.end; i++) {\n      final int codeUnit = text!.codeUnitAt(i)!;\n      if (!TextLayoutMetrics.isWhitespace(codeUnit)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  @override\n  void attach(PipelineOwner owner) {\n    super.attach(owner);\n    _foregroundRenderObject?.attach(owner);\n    _backgroundRenderObject?.attach(owner);\n\n    _tap = TapGestureRecognizer(debugOwner: this)\n      ..onTapDown = _handleTapDown\n      ..onTap = _handleTap;\n    _longPress = LongPressGestureRecognizer(debugOwner: this)\n      ..onLongPress = _handleLongPress;\n    _offset.addListener(markNeedsPaint);\n    _showHideCursor();\n    _showCursor.addListener(_showHideCursor);\n  }\n\n  @override\n  void detach() {\n    _tap.dispose();\n    _longPress.dispose();\n    _offset.removeListener(markNeedsPaint);\n    _showCursor.removeListener(_showHideCursor);\n    super.detach();\n    _foregroundRenderObject?.detach();\n    _backgroundRenderObject?.detach();\n  }\n\n  @override\n  void redepthChildren() {\n    final RenderObject? foregroundChild = _foregroundRenderObject;\n    final RenderObject? backgroundChild = _backgroundRenderObject;\n    if (foregroundChild != null) {\n      redepthChild(foregroundChild);\n    }\n    if (backgroundChild != null) {\n      redepthChild(backgroundChild);\n    }\n    super.redepthChildren();\n  }\n\n  @override\n  void visitChildren(RenderObjectVisitor visitor) {\n    final RenderObject? foregroundChild = _foregroundRenderObject;\n    final RenderObject? backgroundChild = _backgroundRenderObject;\n    if (foregroundChild != null) {\n      visitor(foregroundChild);\n    }\n    if (backgroundChild != null) {\n      visitor(backgroundChild);\n    }\n    super.visitChildren(visitor);\n  }\n\n  bool get _isMultiline => maxLines != 1;\n\n  Axis get _viewportAxis => _isMultiline ? Axis.vertical : Axis.horizontal;\n\n  Offset get _paintOffset => switch (_viewportAxis) {\n    Axis.horizontal => Offset(-offset.pixels, 0.0),\n    Axis.vertical => Offset(0.0, -offset.pixels),\n  };\n\n  double get _viewportExtent {\n    assert(hasSize);\n    return switch (_viewportAxis) {\n      Axis.horizontal => size.width,\n      Axis.vertical => size.height,\n    };\n  }\n\n  double _getMaxScrollExtent(Size contentSize) {\n    assert(hasSize);\n    return switch (_viewportAxis) {\n      Axis.horizontal => math.max(0.0, contentSize.width - size.width),\n      Axis.vertical => math.max(0.0, contentSize.height - size.height),\n    };\n  }\n\n  // We need to check the paint offset here because during animation, the start of\n  // the text may position outside the visible region even when the text fits.\n  bool get _hasVisualOverflow =>\n      _maxScrollExtent > 0 || _paintOffset != Offset.zero;\n\n  /// Returns the local coordinates of the endpoints of the given selection.\n  ///\n  /// If the selection is collapsed (and therefore occupies a single point), the\n  /// returned list is of length one. Otherwise, the selection is not collapsed\n  /// and the returned list is of length two. In this case, however, the two\n  /// points might actually be co-located (e.g., because of a bidirectional\n  /// selection that contains some text but whose ends meet in the middle).\n  ///\n  /// See also:\n  ///\n  ///  * [getLocalRectForCaret], which is the equivalent but for\n  ///    a [TextPosition] rather than a [TextSelection].\n  List<TextSelectionPoint> getEndpointsForSelection(TextSelection selection) {\n    _computeTextMetricsIfNeeded();\n\n    final Offset paintOffset = _paintOffset;\n\n    final List<ui.TextBox> boxes = selection.isCollapsed\n        ? <ui.TextBox>[]\n        : _textPainter.getBoxesForSelection(\n            selection,\n            boxHeightStyle: selectionHeightStyle,\n            boxWidthStyle: selectionWidthStyle,\n          );\n    if (boxes.isEmpty) {\n      // TODO(mpcomplete): This doesn't work well at an RTL/LTR boundary.\n      final Offset caretOffset = _textPainter.getOffsetForCaret(\n        selection.extent,\n        _caretPrototype,\n      );\n      final Offset start =\n          Offset(0.0, preferredLineHeight) + caretOffset + paintOffset;\n      return <TextSelectionPoint>[TextSelectionPoint(start, null)];\n    } else {\n      final Offset start =\n          Offset(\n            clampDouble(boxes.first.start, 0, _textPainter.size.width),\n            boxes.first.bottom,\n          ) +\n          paintOffset;\n      final Offset end =\n          Offset(\n            clampDouble(boxes.last.end, 0, _textPainter.size.width),\n            boxes.last.bottom,\n          ) +\n          paintOffset;\n      return <TextSelectionPoint>[\n        TextSelectionPoint(start, boxes.first.direction),\n        TextSelectionPoint(end, boxes.last.direction),\n      ];\n    }\n  }\n\n  /// Returns the smallest [Rect], in the local coordinate system, that covers\n  /// the text within the [TextRange] specified.\n  ///\n  /// This method is used to calculate the approximate position of the IME bar\n  /// on iOS.\n  ///\n  /// Returns null if [TextRange.isValid] is false for the given `range`, or the\n  /// given `range` is collapsed.\n  Rect? getRectForComposingRange(TextRange range) {\n    if (!range.isValid || range.isCollapsed) {\n      return null;\n    }\n    _computeTextMetricsIfNeeded();\n\n    final List<ui.TextBox> boxes = _textPainter.getBoxesForSelection(\n      TextSelection(baseOffset: range.start, extentOffset: range.end),\n      boxHeightStyle: selectionHeightStyle,\n      boxWidthStyle: selectionWidthStyle,\n    );\n\n    return boxes\n        .fold(\n          null,\n          (Rect? accum, TextBox incoming) =>\n              accum?.expandToInclude(incoming.toRect()) ?? incoming.toRect(),\n        )\n        ?.shift(_paintOffset);\n  }\n\n  /// Returns the position in the text for the given global coordinate.\n  ///\n  /// See also:\n  ///\n  ///  * [getLocalRectForCaret], which is the reverse operation, taking\n  ///    a [TextPosition] and returning a [Rect].\n  ///  * [TextPainter.getPositionForOffset], which is the equivalent method\n  ///    for a [TextPainter] object.\n  TextPosition getPositionForPoint(Offset globalPosition) {\n    _computeTextMetricsIfNeeded();\n    return _textPainter.getPositionForOffset(\n      globalToLocal(globalPosition) - _paintOffset,\n    );\n  }\n\n  /// Returns the [Rect] in local coordinates for the caret at the given text\n  /// position.\n  ///\n  /// See also:\n  ///\n  ///  * [getPositionForPoint], which is the reverse operation, taking\n  ///    an [Offset] in global coordinates and returning a [TextPosition].\n  ///  * [getEndpointsForSelection], which is the equivalent but for\n  ///    a selection rather than a particular text position.\n  ///  * [TextPainter.getOffsetForCaret], the equivalent method for a\n  ///    [TextPainter] object.\n  Rect getLocalRectForCaret(TextPosition caretPosition) {\n    _computeTextMetricsIfNeeded();\n    final Rect caretPrototype = _caretPrototype;\n    final Offset caretOffset = _textPainter.getOffsetForCaret(\n      caretPosition,\n      caretPrototype,\n    );\n    Rect caretRect = caretPrototype.shift(caretOffset + cursorOffset);\n    final double scrollableWidth = math.max(\n      _textPainter.width + _caretMargin,\n      size.width,\n    );\n\n    final double caretX = clampDouble(\n      caretRect.left,\n      0,\n      math.max(scrollableWidth - _caretMargin, 0),\n    );\n    caretRect = Offset(caretX, caretRect.top) & caretRect.size;\n\n    final double fullHeight = _textPainter.getFullHeightForCaret(\n      caretPosition,\n      caretPrototype,\n    );\n    switch (defaultTargetPlatform) {\n      case TargetPlatform.iOS:\n      case TargetPlatform.macOS:\n        // Center the caret vertically along the text.\n        final double heightDiff = fullHeight - caretRect.height;\n        caretRect = Rect.fromLTWH(\n          caretRect.left,\n          caretRect.top + heightDiff / 2,\n          caretRect.width,\n          caretRect.height,\n        );\n      case TargetPlatform.android:\n      case TargetPlatform.fuchsia:\n      case TargetPlatform.linux:\n      case TargetPlatform.windows:\n        // Override the height to take the full height of the glyph at the TextPosition\n        // when not on iOS. iOS has special handling that creates a taller caret.\n        // TODO(garyq): see https://github.com/flutter/flutter/issues/120836.\n        final double caretHeight = cursorHeight;\n        // Center the caret vertically along the text.\n        final double heightDiff = fullHeight - caretHeight;\n        caretRect = Rect.fromLTWH(\n          caretRect.left,\n          caretRect.top - _kCaretHeightOffset + heightDiff / 2,\n          caretRect.width,\n          caretHeight,\n        );\n    }\n\n    caretRect = caretRect.shift(_paintOffset);\n    return caretRect.shift(_snapToPhysicalPixel(caretRect.topLeft));\n  }\n\n  @override\n  double computeMinIntrinsicWidth(double height) {\n    final List<PlaceholderDimensions> placeholderDimensions =\n        layoutInlineChildren(\n          double.infinity,\n          (RenderBox child, BoxConstraints constraints) =>\n              Size(child.getMinIntrinsicWidth(double.infinity), 0.0),\n          ChildLayoutHelper.getDryBaseline,\n        );\n    final (double minWidth, double maxWidth) = _adjustConstraints();\n    return (_textIntrinsics\n          ..setPlaceholderDimensions(placeholderDimensions)\n          ..layout(minWidth: minWidth, maxWidth: maxWidth))\n        .minIntrinsicWidth;\n  }\n\n  @override\n  double computeMaxIntrinsicWidth(double height) {\n    final List<PlaceholderDimensions>\n    placeholderDimensions = layoutInlineChildren(\n      double.infinity,\n      // Height and baseline is irrelevant as all text will be laid\n      // out in a single line. Therefore, using 0.0 as a dummy for the height.\n      (RenderBox child, BoxConstraints constraints) =>\n          Size(child.getMaxIntrinsicWidth(double.infinity), 0.0),\n      ChildLayoutHelper.getDryBaseline,\n    );\n    final (double minWidth, double maxWidth) = _adjustConstraints();\n    return (_textIntrinsics\n              ..setPlaceholderDimensions(placeholderDimensions)\n              ..layout(minWidth: minWidth, maxWidth: maxWidth))\n            .maxIntrinsicWidth +\n        _caretMargin;\n  }\n\n  /// An estimate of the height of a line in the text. See [TextPainter.preferredLineHeight].\n  /// This does not require the layout to be updated.\n  double get preferredLineHeight => _textPainter.preferredLineHeight;\n\n  int? _cachedLineBreakCount;\n  int _countHardLineBreaks(String text) {\n    final int? cachedValue = _cachedLineBreakCount;\n    if (cachedValue != null) {\n      return cachedValue;\n    }\n    var count = 0;\n    for (var index = 0; index < text.length; index += 1) {\n      switch (text.codeUnitAt(index)) {\n        case 0x000A: // LF\n        case 0x0085: // NEL\n        case 0x000B: // VT\n        case 0x000C: // FF, treating it as a regular line separator\n        case 0x2028: // LS\n        case 0x2029: // PS\n          count += 1;\n      }\n    }\n    return _cachedLineBreakCount = count;\n  }\n\n  double _preferredHeight(double width) {\n    final int? maxLines = this.maxLines;\n    final int? minLines = this.minLines ?? maxLines;\n    final double minHeight = preferredLineHeight * (minLines ?? 0);\n    assert(maxLines != 1 || _textIntrinsics.maxLines == 1);\n\n    if (maxLines == null) {\n      final double estimatedHeight;\n      if (width == double.infinity) {\n        estimatedHeight =\n            preferredLineHeight * (_countHardLineBreaks(plainText) + 1);\n      } else {\n        final (double minWidth, double maxWidth) = _adjustConstraints(\n          maxWidth: width,\n        );\n        estimatedHeight =\n            (_textIntrinsics..layout(minWidth: minWidth, maxWidth: maxWidth))\n                .height;\n      }\n      return math.max(estimatedHeight, minHeight);\n    }\n\n    // Special case maxLines == 1 since it forces the scrollable direction\n    // to be horizontal. Report the real height to prevent the text from being\n    // clipped.\n    if (maxLines == 1) {\n      // The _layoutText call lays out the paragraph using infinite width when\n      // maxLines == 1. Also _textPainter.maxLines will be set to 1 so should\n      // there be any line breaks only the first line is shown.\n      final (double minWidth, double maxWidth) = _adjustConstraints(\n        maxWidth: width,\n      );\n      return (_textIntrinsics..layout(minWidth: minWidth, maxWidth: maxWidth))\n          .height;\n    }\n    if (minLines == maxLines) {\n      return minHeight;\n    }\n    final double maxHeight = preferredLineHeight * maxLines;\n    final (double minWidth, double maxWidth) = _adjustConstraints(\n      maxWidth: width,\n    );\n    return clampDouble(\n      (_textIntrinsics..layout(minWidth: minWidth, maxWidth: maxWidth)).height,\n      minHeight,\n      maxHeight,\n    );\n  }\n\n  @override\n  double computeMinIntrinsicHeight(double width) =>\n      getMaxIntrinsicHeight(width);\n\n  @override\n  double computeMaxIntrinsicHeight(double width) {\n    _textIntrinsics.setPlaceholderDimensions(\n      layoutInlineChildren(\n        width,\n        ChildLayoutHelper.dryLayoutChild,\n        ChildLayoutHelper.getDryBaseline,\n      ),\n    );\n    return _preferredHeight(width);\n  }\n\n  @override\n  double computeDistanceToActualBaseline(TextBaseline baseline) {\n    _computeTextMetricsIfNeeded();\n    return _textPainter.computeDistanceToActualBaseline(baseline);\n  }\n\n  @override\n  bool hitTestSelf(Offset position) => true;\n\n  @override\n  @protected\n  bool hitTestChildren(BoxHitTestResult result, {required Offset position}) {\n    final Offset effectivePosition = position - _paintOffset;\n    final GlyphInfo? glyph = _textPainter.getClosestGlyphForOffset(\n      effectivePosition,\n    );\n    // The hit-test can't fall through the horizontal gaps between visually\n    // adjacent characters on the same line, even with a large letter-spacing or\n    // text justification, as graphemeClusterLayoutBounds.width is the advance\n    // width to the next character, so there's no gap between their\n    // graphemeClusterLayoutBounds rects.\n    final InlineSpan? spanHit =\n        glyph != null &&\n            glyph.graphemeClusterLayoutBounds.contains(effectivePosition)\n        ? _textPainter.text!.getSpanForPosition(\n            TextPosition(offset: glyph.graphemeClusterCodeUnitRange.start),\n          )\n        : null;\n    switch (spanHit) {\n      case final HitTestTarget span:\n        result.add(HitTestEntry(span));\n        return true;\n      case _:\n        return hitTestInlineChildren(result, effectivePosition);\n    }\n  }\n\n  late TapGestureRecognizer _tap;\n  late LongPressGestureRecognizer _longPress;\n\n  @override\n  void handleEvent(PointerEvent event, BoxHitTestEntry entry) {\n    assert(debugHandleEvent(event, entry));\n    if (event is PointerDownEvent) {\n      assert(!debugNeedsLayout);\n\n      if (!ignorePointer) {\n        // Propagates the pointer event to selection handlers.\n        _tap.addPointer(event);\n        _longPress.addPointer(event);\n      }\n    }\n  }\n\n  Offset? _lastTapDownPosition;\n  Offset? _lastSecondaryTapDownPosition;\n\n  /// {@template flutter.rendering.RenderEditable.lastSecondaryTapDownPosition}\n  /// The position of the most recent secondary tap down event on this text\n  /// input.\n  /// {@endtemplate}\n  Offset? get lastSecondaryTapDownPosition => _lastSecondaryTapDownPosition;\n\n  /// Tracks the position of a secondary tap event.\n  ///\n  /// Should be called before attempting to change the selection based on the\n  /// position of a secondary tap.\n  void handleSecondaryTapDown(TapDownDetails details) {\n    _lastTapDownPosition = details.globalPosition;\n    _lastSecondaryTapDownPosition = details.globalPosition;\n  }\n\n  /// If [ignorePointer] is false (the default) then this method is called by\n  /// the internal gesture recognizer's [TapGestureRecognizer.onTapDown]\n  /// callback.\n  ///\n  /// When [ignorePointer] is true, an ancestor widget must respond to tap\n  /// down events by calling this method.\n  void handleTapDown(TapDownDetails details) {\n    _lastTapDownPosition = details.globalPosition;\n  }\n\n  void _handleTapDown(TapDownDetails details) {\n    assert(!ignorePointer);\n    handleTapDown(details);\n  }\n\n  /// If [ignorePointer] is false (the default) then this method is called by\n  /// the internal gesture recognizer's [TapGestureRecognizer.onTap]\n  /// callback.\n  ///\n  /// When [ignorePointer] is true, an ancestor widget must respond to tap\n  /// events by calling this method.\n  void handleTap() {\n    selectPosition(cause: SelectionChangedCause.tap);\n  }\n\n  void _handleTap() {\n    assert(!ignorePointer);\n    handleTap();\n  }\n\n  /// If [ignorePointer] is false (the default) then this method is called by\n  /// the internal gesture recognizer's [DoubleTapGestureRecognizer.onDoubleTap]\n  /// callback.\n  ///\n  /// When [ignorePointer] is true, an ancestor widget must respond to double\n  /// tap events by calling this method.\n  void handleDoubleTap() {\n    selectWord(cause: SelectionChangedCause.doubleTap);\n  }\n\n  /// If [ignorePointer] is false (the default) then this method is called by\n  /// the internal gesture recognizer's [LongPressGestureRecognizer.onLongPress]\n  /// callback.\n  ///\n  /// When [ignorePointer] is true, an ancestor widget must respond to long\n  /// press events by calling this method.\n  void handleLongPress() {\n    selectWord(cause: SelectionChangedCause.longPress);\n  }\n\n  void _handleLongPress() {\n    assert(!ignorePointer);\n    handleLongPress();\n  }\n\n  /// Move selection to the location of the last tap down.\n  ///\n  /// {@template flutter.rendering.RenderEditable.selectPosition}\n  /// This method is mainly used to translate user inputs in global positions\n  /// into a [TextSelection]. When used in conjunction with a [EditableText],\n  /// the selection change is fed back into [TextEditingController.selection].\n  ///\n  /// If you have a [TextEditingController], it's generally easier to\n  /// programmatically manipulate its `value` or `selection` directly.\n  /// {@endtemplate}\n  void selectPosition({required SelectionChangedCause cause}) {\n    selectPositionAt(from: _lastTapDownPosition!, cause: cause);\n  }\n\n  /// Select text between the global positions [from] and [to].\n  ///\n  /// [from] corresponds to the [TextSelection.baseOffset], and [to] corresponds\n  /// to the [TextSelection.extentOffset].\n  void selectPositionAt({\n    required Offset from,\n    Offset? to,\n    required SelectionChangedCause cause,\n  }) {\n    _computeTextMetricsIfNeeded();\n    final localFrom = globalToLocal(from);\n    final TextPosition fromPosition = _textPainter.getPositionForOffset(\n      localFrom - _paintOffset,\n    );\n    final TextPosition? toPosition = to == null\n        ? null\n        : _textPainter.getPositionForOffset(globalToLocal(to) - _paintOffset);\n\n    int baseOffset = fromPosition.offset;\n    int extentOffset = toPosition?.offset ?? fromPosition.offset;\n\n    // bggRGjQaUbCoE tap\n    if (toPosition == null) {\n      baseOffset = controller.tapOffset(\n        baseOffset,\n        textPainter: _textPainter,\n        localPos: localFrom,\n        lastTapDownPosition: from,\n      );\n      extentOffset = baseOffset;\n    } else {\n      // select\n      final isNormalized = baseOffset < extentOffset;\n      final newOffset = controller.longPressOffset(\n        isNormalized ? baseOffset : extentOffset,\n        isNormalized ? extentOffset : baseOffset,\n      );\n      baseOffset = isNormalized ? newOffset.startOffset : newOffset.endOffset;\n      extentOffset = isNormalized ? newOffset.endOffset : newOffset.startOffset;\n    }\n\n    final newSelection = TextSelection(\n      baseOffset: baseOffset,\n      extentOffset: extentOffset,\n      affinity: fromPosition.affinity,\n    );\n\n    _setSelection(newSelection, cause);\n  }\n\n  /// {@macro flutter.painting.TextPainter.wordBoundaries}\n  WordBoundary get wordBoundaries => _textPainter.wordBoundaries;\n\n  /// Select a word around the location of the last tap down.\n  ///\n  /// {@macro flutter.rendering.RenderEditable.selectPosition}\n  void selectWord({required SelectionChangedCause cause}) {\n    selectWordsInRange(from: _lastTapDownPosition!, cause: cause);\n  }\n\n  /// Selects the set words of a paragraph that intersect a given range of global positions.\n  ///\n  /// The set of words selected are not strictly bounded by the range of global positions.\n  ///\n  /// The first and last endpoints of the selection will always be at the\n  /// beginning and end of a word respectively.\n  ///\n  /// {@macro flutter.rendering.RenderEditable.selectPosition}\n  void selectWordsInRange({\n    required Offset from,\n    Offset? to,\n    required SelectionChangedCause cause,\n  }) {\n    _computeTextMetricsIfNeeded();\n    final TextPosition fromPosition = _textPainter.getPositionForOffset(\n      globalToLocal(from) - _paintOffset,\n    );\n    final TextSelection fromWord = getWordAtOffset(fromPosition);\n    final TextPosition toPosition = to == null\n        ? fromPosition\n        : _textPainter.getPositionForOffset(globalToLocal(to) - _paintOffset);\n    final TextSelection toWord = toPosition == fromPosition\n        ? fromWord\n        : getWordAtOffset(toPosition);\n    final bool isFromWordBeforeToWord = fromWord.start < toWord.end;\n\n    // bggRGjQaUbCoE longpress\n    var startOffset = isFromWordBeforeToWord\n        ? fromWord.baseOffset\n        : toWord.baseOffset;\n    var endOffset = isFromWordBeforeToWord\n        ? toWord.extentOffset\n        : fromWord.extentOffset;\n    final newOffset = controller.longPressOffset(startOffset, endOffset);\n    startOffset = newOffset.startOffset;\n    endOffset = newOffset.endOffset;\n\n    _setSelection(\n      TextSelection(\n        baseOffset: isFromWordBeforeToWord ? startOffset : endOffset,\n        extentOffset: isFromWordBeforeToWord ? endOffset : startOffset,\n        affinity: fromWord.affinity,\n      ),\n      cause,\n    );\n  }\n\n  /// Move the selection to the beginning or end of a word.\n  ///\n  /// {@macro flutter.rendering.RenderEditable.selectPosition}\n  void selectWordEdge({required SelectionChangedCause cause}) {\n    _computeTextMetricsIfNeeded();\n    assert(_lastTapDownPosition != null);\n    final localPos = globalToLocal(_lastTapDownPosition!);\n    TextPosition position = _textPainter.getPositionForOffset(\n      localPos - _paintOffset,\n    );\n\n    // bggRGjQaUbCoE ios tap\n    final newOffset = controller.tapOffset(\n      position.offset,\n      textPainter: _textPainter,\n      localPos: localPos,\n      lastTapDownPosition: _lastTapDownPosition!,\n    );\n    final newSelection = TextSelection.collapsed(offset: newOffset);\n\n    // final TextRange word = _textPainter.getWordBoundary(position);\n    // late TextSelection newSelection;\n    // if (position.offset <= word.start) {\n    //   newSelection = TextSelection.collapsed(offset: word.start);\n    // } else {\n    //   newSelection = TextSelection.collapsed(\n    //     offset: word.end,\n    //     affinity: TextAffinity.upstream,\n    //   );\n    // }\n    _setSelection(newSelection, cause);\n  }\n\n  /// Returns a [TextSelection] that encompasses the word at the given\n  /// [TextPosition].\n  @visibleForTesting\n  TextSelection getWordAtOffset(TextPosition position) {\n    // When long-pressing past the end of the text, we want a collapsed cursor.\n    if (position.offset >= plainText.length) {\n      return TextSelection.fromPosition(\n        TextPosition(offset: plainText.length, affinity: TextAffinity.upstream),\n      );\n    }\n    // If text is obscured, the entire sentence should be treated as one word.\n    if (obscureText) {\n      return TextSelection(baseOffset: 0, extentOffset: plainText.length);\n    }\n    final TextRange word = _textPainter.getWordBoundary(position);\n    final int effectiveOffset;\n    switch (position.affinity) {\n      case TextAffinity.upstream:\n        // upstream affinity is effectively -1 in text position.\n        effectiveOffset = position.offset - 1;\n      case TextAffinity.downstream:\n        effectiveOffset = position.offset;\n    }\n    assert(effectiveOffset >= 0);\n\n    // On iOS, select the previous word if there is a previous word, or select\n    // to the end of the next word if there is a next word. Select nothing if\n    // there is neither a previous word nor a next word.\n    //\n    // If the platform is Android and the text is read only, try to select the\n    // previous word if there is one; otherwise, select the single whitespace at\n    // the position.\n    if (effectiveOffset > 0 &&\n        TextLayoutMetrics.isWhitespace(plainText.codeUnitAt(effectiveOffset))) {\n      final TextRange? previousWord = _getPreviousWord(word.start);\n      switch (defaultTargetPlatform) {\n        case TargetPlatform.iOS:\n          if (previousWord == null) {\n            final TextRange? nextWord = _getNextWord(word.start);\n            if (nextWord == null) {\n              return TextSelection.collapsed(offset: position.offset);\n            }\n            return TextSelection(\n              baseOffset: position.offset,\n              extentOffset: nextWord.end,\n            );\n          }\n          return TextSelection(\n            baseOffset: previousWord.start,\n            extentOffset: position.offset,\n          );\n        case TargetPlatform.android:\n          if (readOnly) {\n            if (previousWord == null) {\n              return TextSelection(\n                baseOffset: position.offset,\n                extentOffset: position.offset + 1,\n              );\n            }\n            return TextSelection(\n              baseOffset: previousWord.start,\n              extentOffset: position.offset,\n            );\n          }\n        case TargetPlatform.fuchsia:\n        case TargetPlatform.macOS:\n        case TargetPlatform.linux:\n        case TargetPlatform.windows:\n          break;\n      }\n    }\n\n    return TextSelection(baseOffset: word.start, extentOffset: word.end);\n  }\n\n  // Placeholder dimensions representing the sizes of child inline widgets.\n  //\n  // These need to be cached because the text painter's placeholder dimensions\n  // will be overwritten during intrinsic width/height calculations and must be\n  // restored to the original values before final layout and painting.\n  List<PlaceholderDimensions>? _placeholderDimensions;\n\n  (double minWidth, double maxWidth) _adjustConstraints({\n    double minWidth = 0.0,\n    double maxWidth = double.infinity,\n  }) {\n    final double availableMaxWidth = math.max(0.0, maxWidth - _caretMargin);\n    final double availableMinWidth = math.min(minWidth, availableMaxWidth);\n    return (\n      forceLine ? availableMaxWidth : availableMinWidth,\n      _isMultiline ? availableMaxWidth : double.infinity,\n    );\n  }\n\n  // Computes the text metrics if `_textPainter`'s layout information was marked\n  // as dirty.\n  //\n  // This method must be called in `RenderEditable`'s public methods that expose\n  // `_textPainter`'s metrics. For instance, `systemFontsDidChange` sets\n  // _textPainter._paragraph to null, so accessing _textPainter's metrics\n  // immediately after `systemFontsDidChange` without first calling this method\n  // may crash.\n  //\n  // This method is also called in various paint methods (`RenderEditable.paint`\n  // as well as its foreground/background painters' `paint`). It's needed\n  // because invisible render objects kept in the tree by `KeepAlive` may not\n  // get a chance to do layout but can still paint.\n  // See https://github.com/flutter/flutter/issues/84896.\n  //\n  // This method only re-computes layout if the underlying `_textPainter`'s\n  // layout cache is invalidated (by calling `TextPainter.markNeedsLayout`), or\n  // the constraints used to layout the `_textPainter` is different. See\n  // `TextPainter.layout`.\n  void _computeTextMetricsIfNeeded() {\n    final (double minWidth, double maxWidth) = _adjustConstraints(\n      minWidth: constraints.minWidth,\n      maxWidth: constraints.maxWidth,\n    );\n    _textPainter.layout(minWidth: minWidth, maxWidth: maxWidth);\n  }\n\n  late Rect _caretPrototype;\n\n  // TODO(LongCatIsLooong): https://github.com/flutter/flutter/issues/120836\n  //\n  /// On iOS, the cursor is taller than the cursor on Android. The height\n  /// of the cursor for iOS is approximate and obtained through an eyeball\n  /// comparison.\n  void _computeCaretPrototype() {\n    switch (defaultTargetPlatform) {\n      case TargetPlatform.iOS:\n      case TargetPlatform.macOS:\n        _caretPrototype = Rect.fromLTRB(\n          0.0,\n          0.0,\n          cursorWidth,\n          cursorHeight + 2,\n        );\n      case TargetPlatform.android:\n      case TargetPlatform.fuchsia:\n      case TargetPlatform.linux:\n      case TargetPlatform.windows:\n        _caretPrototype = Rect.fromLTWH(\n          0.0,\n          _kCaretHeightOffset,\n          cursorWidth,\n          cursorHeight - 2.0 * _kCaretHeightOffset,\n        );\n    }\n  }\n\n  // Computes the offset to apply to the given [sourceOffset] so it perfectly\n  // snaps to physical pixels.\n  Offset _snapToPhysicalPixel(Offset sourceOffset) {\n    final Offset globalOffset = localToGlobal(sourceOffset);\n    final double pixelMultiple = 1.0 / _devicePixelRatio;\n    return Offset(\n      globalOffset.dx.isFinite\n          ? (globalOffset.dx / pixelMultiple).round() * pixelMultiple -\n                globalOffset.dx\n          : 0,\n      globalOffset.dy.isFinite\n          ? (globalOffset.dy / pixelMultiple).round() * pixelMultiple -\n                globalOffset.dy\n          : 0,\n    );\n  }\n\n  @override\n  @protected\n  Size computeDryLayout(covariant BoxConstraints constraints) {\n    final (double minWidth, double maxWidth) = _adjustConstraints(\n      minWidth: constraints.minWidth,\n      maxWidth: constraints.maxWidth,\n    );\n    _textIntrinsics\n      ..setPlaceholderDimensions(\n        layoutInlineChildren(\n          constraints.maxWidth,\n          ChildLayoutHelper.dryLayoutChild,\n          ChildLayoutHelper.getDryBaseline,\n        ),\n      )\n      ..layout(minWidth: minWidth, maxWidth: maxWidth);\n    final double width = forceLine\n        ? constraints.maxWidth\n        : constraints.constrainWidth(_textIntrinsics.size.width + _caretMargin);\n    return Size(\n      width,\n      constraints.constrainHeight(_preferredHeight(constraints.maxWidth)),\n    );\n  }\n\n  @override\n  double computeDryBaseline(\n    covariant BoxConstraints constraints,\n    TextBaseline baseline,\n  ) {\n    final (double minWidth, double maxWidth) = _adjustConstraints(\n      minWidth: constraints.minWidth,\n      maxWidth: constraints.maxWidth,\n    );\n    _textIntrinsics\n      ..setPlaceholderDimensions(\n        layoutInlineChildren(\n          constraints.maxWidth,\n          ChildLayoutHelper.dryLayoutChild,\n          ChildLayoutHelper.getDryBaseline,\n        ),\n      )\n      ..layout(minWidth: minWidth, maxWidth: maxWidth);\n    return _textIntrinsics.computeDistanceToActualBaseline(baseline);\n  }\n\n  @override\n  void performLayout() {\n    final BoxConstraints constraints = this.constraints;\n    _placeholderDimensions = layoutInlineChildren(\n      constraints.maxWidth,\n      ChildLayoutHelper.layoutChild,\n      ChildLayoutHelper.getBaseline,\n    );\n    final (double minWidth, double maxWidth) = _adjustConstraints(\n      minWidth: constraints.minWidth,\n      maxWidth: constraints.maxWidth,\n    );\n    _textPainter\n      ..setPlaceholderDimensions(_placeholderDimensions)\n      ..layout(minWidth: minWidth, maxWidth: maxWidth);\n    positionInlineChildren(_textPainter.inlinePlaceholderBoxes!);\n    _computeCaretPrototype();\n\n    final double width = forceLine\n        ? constraints.maxWidth\n        : constraints.constrainWidth(_textPainter.width + _caretMargin);\n    assert(maxLines != 1 || _textPainter.maxLines == 1);\n    final double preferredHeight = switch (maxLines) {\n      null => math.max(\n        _textPainter.height,\n        preferredLineHeight * (minLines ?? 0),\n      ),\n      1 => _textPainter.height,\n      final int maxLines => clampDouble(\n        _textPainter.height,\n        preferredLineHeight * (minLines ?? maxLines),\n        preferredLineHeight * maxLines,\n      ),\n    };\n\n    size = Size(width, constraints.constrainHeight(preferredHeight));\n    final contentSize = Size(\n      _textPainter.width + _caretMargin,\n      _textPainter.height,\n    );\n\n    final painterConstraints = BoxConstraints.tight(contentSize);\n\n    _foregroundRenderObject?.layout(painterConstraints);\n    _backgroundRenderObject?.layout(painterConstraints);\n\n    _maxScrollExtent = _getMaxScrollExtent(contentSize);\n    offset\n      ..applyViewportDimension(_viewportExtent)\n      ..applyContentDimensions(0.0, _maxScrollExtent);\n  }\n\n  // The relative origin in relation to the distance the user has theoretically\n  // dragged the floating cursor offscreen. This value is used to account for the\n  // difference in the rendering position and the raw offset value.\n  Offset _relativeOrigin = Offset.zero;\n  Offset? _previousOffset;\n  bool _shouldResetOrigin = true;\n  bool _resetOriginOnLeft = false;\n  bool _resetOriginOnRight = false;\n  bool _resetOriginOnTop = false;\n  bool _resetOriginOnBottom = false;\n  double? _resetFloatingCursorAnimationValue;\n\n  static Offset _calculateAdjustedCursorOffset(\n    Offset offset,\n    Rect boundingRects,\n  ) {\n    final double adjustedX = clampDouble(\n      offset.dx,\n      boundingRects.left,\n      boundingRects.right,\n    );\n    final double adjustedY = clampDouble(\n      offset.dy,\n      boundingRects.top,\n      boundingRects.bottom,\n    );\n    return Offset(adjustedX, adjustedY);\n  }\n\n  /// Returns the position within the text field closest to the raw cursor offset.\n  ///\n  /// See also:\n  ///\n  ///  * [FloatingCursorDragState], which explains the floating cursor feature\n  ///    in detail.\n  Offset calculateBoundedFloatingCursorOffset(\n    Offset rawCursorOffset, {\n    bool? shouldResetOrigin,\n  }) {\n    Offset deltaPosition = Offset.zero;\n    final double topBound = -floatingCursorAddedMargin.top;\n    final double bottomBound =\n        math.min(size.height, _textPainter.height) -\n        preferredLineHeight +\n        floatingCursorAddedMargin.bottom;\n    final double leftBound = -floatingCursorAddedMargin.left;\n    final double rightBound =\n        math.min(size.width, _textPainter.width) +\n        floatingCursorAddedMargin.right;\n    final boundingRects = Rect.fromLTRB(\n      leftBound,\n      topBound,\n      rightBound,\n      bottomBound,\n    );\n\n    if (shouldResetOrigin != null) {\n      _shouldResetOrigin = shouldResetOrigin;\n    }\n\n    if (!_shouldResetOrigin) {\n      return _calculateAdjustedCursorOffset(rawCursorOffset, boundingRects);\n    }\n\n    if (_previousOffset != null) {\n      deltaPosition = rawCursorOffset - _previousOffset!;\n    }\n\n    // If the raw cursor offset has gone off an edge, we want to reset the relative\n    // origin of the dragging when the user drags back into the field.\n    if (_resetOriginOnLeft && deltaPosition.dx > 0) {\n      _relativeOrigin = Offset(\n        rawCursorOffset.dx - boundingRects.left,\n        _relativeOrigin.dy,\n      );\n      _resetOriginOnLeft = false;\n    } else if (_resetOriginOnRight && deltaPosition.dx < 0) {\n      _relativeOrigin = Offset(\n        rawCursorOffset.dx - boundingRects.right,\n        _relativeOrigin.dy,\n      );\n      _resetOriginOnRight = false;\n    }\n    if (_resetOriginOnTop && deltaPosition.dy > 0) {\n      _relativeOrigin = Offset(\n        _relativeOrigin.dx,\n        rawCursorOffset.dy - boundingRects.top,\n      );\n      _resetOriginOnTop = false;\n    } else if (_resetOriginOnBottom && deltaPosition.dy < 0) {\n      _relativeOrigin = Offset(\n        _relativeOrigin.dx,\n        rawCursorOffset.dy - boundingRects.bottom,\n      );\n      _resetOriginOnBottom = false;\n    }\n\n    final double currentX = rawCursorOffset.dx - _relativeOrigin.dx;\n    final double currentY = rawCursorOffset.dy - _relativeOrigin.dy;\n    final Offset adjustedOffset = _calculateAdjustedCursorOffset(\n      Offset(currentX, currentY),\n      boundingRects,\n    );\n\n    if (currentX < boundingRects.left && deltaPosition.dx < 0) {\n      _resetOriginOnLeft = true;\n    } else if (currentX > boundingRects.right && deltaPosition.dx > 0) {\n      _resetOriginOnRight = true;\n    }\n    if (currentY < boundingRects.top && deltaPosition.dy < 0) {\n      _resetOriginOnTop = true;\n    } else if (currentY > boundingRects.bottom && deltaPosition.dy > 0) {\n      _resetOriginOnBottom = true;\n    }\n\n    _previousOffset = rawCursorOffset;\n\n    return adjustedOffset;\n  }\n\n  /// Sets the screen position of the floating cursor and the text position\n  /// closest to the cursor.\n  ///\n  /// See also:\n  ///\n  ///  * [FloatingCursorDragState], which explains the floating cursor feature\n  ///    in detail.\n  void setFloatingCursor(\n    FloatingCursorDragState state,\n    Offset boundedOffset,\n    TextPosition lastTextPosition, {\n    double? resetLerpValue,\n  }) {\n    if (state == FloatingCursorDragState.End) {\n      _relativeOrigin = Offset.zero;\n      _previousOffset = null;\n      _shouldResetOrigin = true;\n      _resetOriginOnBottom = false;\n      _resetOriginOnTop = false;\n      _resetOriginOnRight = false;\n      _resetOriginOnBottom = false;\n    }\n    _floatingCursorOn = state != FloatingCursorDragState.End;\n    _resetFloatingCursorAnimationValue = resetLerpValue;\n    if (_floatingCursorOn) {\n      _floatingCursorTextPosition = lastTextPosition;\n      final double? animationValue = _resetFloatingCursorAnimationValue;\n      final EdgeInsets sizeAdjustment = animationValue != null\n          ? EdgeInsets.lerp(\n              _kFloatingCursorSizeIncrease,\n              EdgeInsets.zero,\n              animationValue,\n            )!\n          : _kFloatingCursorSizeIncrease;\n      _caretPainter.floatingCursorRect = sizeAdjustment\n          .inflateRect(_caretPrototype)\n          .shift(boundedOffset);\n    } else {\n      _caretPainter.floatingCursorRect = null;\n    }\n    _caretPainter.showRegularCaret = _resetFloatingCursorAnimationValue == null;\n  }\n\n  MapEntry<int, Offset> _lineNumberFor(\n    TextPosition startPosition,\n    List<ui.LineMetrics> metrics,\n  ) {\n    // TODO(LongCatIsLooong): include line boundaries information in\n    // ui.LineMetrics, then we can get rid of this.\n    final Offset offset = _textPainter.getOffsetForCaret(\n      startPosition,\n      Rect.zero,\n    );\n    for (final lineMetrics in metrics) {\n      if (lineMetrics.baseline > offset.dy) {\n        return MapEntry<int, Offset>(\n          lineMetrics.lineNumber,\n          Offset(offset.dx, lineMetrics.baseline),\n        );\n      }\n    }\n    assert(\n      startPosition.offset == 0,\n      'unable to find the line for $startPosition',\n    );\n    return MapEntry<int, Offset>(\n      math.max(0, metrics.length - 1),\n      Offset(\n        offset.dx,\n        metrics.isNotEmpty ? metrics.last.baseline + metrics.last.descent : 0.0,\n      ),\n    );\n  }\n\n  /// Starts a [VerticalCaretMovementRun] at the given location in the text, for\n  /// handling consecutive vertical caret movements.\n  ///\n  /// This can be used to handle consecutive upward/downward arrow key movements\n  /// in an input field.\n  ///\n  /// {@macro flutter.rendering.RenderEditable.verticalArrowKeyMovement}\n  ///\n  /// The [VerticalCaretMovementRun.isValid] property indicates whether the text\n  /// layout has changed and the vertical caret run is invalidated.\n  ///\n  /// The caller should typically discard a [VerticalCaretMovementRun] when\n  /// its [VerticalCaretMovementRun.isValid] becomes false, or on other\n  /// occasions where the vertical caret run should be interrupted.\n  VerticalCaretMovementRun startVerticalCaretMovement(\n    TextPosition startPosition,\n  ) {\n    final List<ui.LineMetrics> metrics = _textPainter.computeLineMetrics();\n    final MapEntry<int, Offset> currentLine = _lineNumberFor(\n      startPosition,\n      metrics,\n    );\n    return VerticalCaretMovementRun._(\n      this,\n      metrics,\n      startPosition,\n      currentLine.key,\n      currentLine.value,\n    );\n  }\n\n  void _paintContents(PaintingContext context, Offset offset) {\n    final Offset effectiveOffset = offset + _paintOffset;\n\n    if (selection != null && !_floatingCursorOn) {\n      _updateSelectionExtentsVisibility(effectiveOffset);\n    }\n\n    final RenderBox? foregroundChild = _foregroundRenderObject;\n    final RenderBox? backgroundChild = _backgroundRenderObject;\n\n    // The painters paint in the viewport's coordinate space, since the\n    // textPainter's coordinate space is not known to high level widgets.\n    if (backgroundChild != null) {\n      context.paintChild(backgroundChild, offset);\n    }\n\n    _textPainter.paint(context.canvas, effectiveOffset);\n    paintInlineChildren(context, effectiveOffset);\n\n    if (foregroundChild != null) {\n      context.paintChild(foregroundChild, offset);\n    }\n  }\n\n  final LayerHandle<LeaderLayer> _leaderLayerHandler =\n      LayerHandle<LeaderLayer>();\n\n  void _paintHandleLayers(\n    PaintingContext context,\n    List<TextSelectionPoint> endpoints,\n    Offset offset,\n  ) {\n    Offset startPoint = endpoints[0].point;\n    startPoint = Offset(\n      clampDouble(startPoint.dx, 0.0, size.width),\n      clampDouble(startPoint.dy, 0.0, size.height),\n    );\n    _leaderLayerHandler.layer = LeaderLayer(\n      link: startHandleLayerLink,\n      offset: startPoint + offset,\n    );\n    context.pushLayer(_leaderLayerHandler.layer!, super.paint, Offset.zero);\n    if (endpoints.length == 2) {\n      Offset endPoint = endpoints[1].point;\n      endPoint = Offset(\n        clampDouble(endPoint.dx, 0.0, size.width),\n        clampDouble(endPoint.dy, 0.0, size.height),\n      );\n      context.pushLayer(\n        LeaderLayer(link: endHandleLayerLink, offset: endPoint + offset),\n        super.paint,\n        Offset.zero,\n      );\n    } else if (selection!.isCollapsed) {\n      context.pushLayer(\n        LeaderLayer(link: endHandleLayerLink, offset: startPoint + offset),\n        super.paint,\n        Offset.zero,\n      );\n    }\n  }\n\n  @override\n  void applyPaintTransform(RenderBox child, Matrix4 transform) {\n    if (child == _foregroundRenderObject || child == _backgroundRenderObject) {\n      return;\n    }\n    defaultApplyPaintTransform(child, transform);\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    _computeTextMetricsIfNeeded();\n    if (_hasVisualOverflow && clipBehavior != Clip.none) {\n      _clipRectLayer.layer = context.pushClipRect(\n        needsCompositing,\n        offset,\n        Offset.zero & size,\n        _paintContents,\n        clipBehavior: clipBehavior,\n        oldLayer: _clipRectLayer.layer,\n      );\n    } else {\n      _clipRectLayer.layer = null;\n      _paintContents(context, offset);\n    }\n    final TextSelection? selection = this.selection;\n    if (selection != null && selection.isValid) {\n      _paintHandleLayers(context, getEndpointsForSelection(selection), offset);\n    }\n  }\n\n  final LayerHandle<ClipRectLayer> _clipRectLayer =\n      LayerHandle<ClipRectLayer>();\n\n  @override\n  Rect? describeApproximatePaintClip(RenderObject child) {\n    switch (clipBehavior) {\n      case Clip.none:\n        return null;\n      case Clip.hardEdge:\n      case Clip.antiAlias:\n      case Clip.antiAliasWithSaveLayer:\n        return _hasVisualOverflow ? Offset.zero & size : null;\n    }\n  }\n\n  @override\n  void debugFillProperties(DiagnosticPropertiesBuilder properties) {\n    super.debugFillProperties(properties);\n    properties\n      ..add(ColorProperty('cursorColor', cursorColor))\n      ..add(\n        DiagnosticsProperty<ValueNotifier<bool>>('showCursor', showCursor),\n      )\n      ..add(IntProperty('maxLines', maxLines))\n      ..add(IntProperty('minLines', minLines))\n      ..add(\n        DiagnosticsProperty<bool>('expands', expands, defaultValue: false),\n      )\n      ..add(ColorProperty('selectionColor', selectionColor))\n      ..add(\n        DiagnosticsProperty<TextScaler>(\n          'textScaler',\n          textScaler,\n          defaultValue: TextScaler.noScaling,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<Locale>('locale', locale, defaultValue: null),\n      )\n      ..add(DiagnosticsProperty<TextSelection>('selection', selection))\n      ..add(DiagnosticsProperty<ViewportOffset>('offset', offset));\n  }\n\n  @override\n  List<DiagnosticsNode> debugDescribeChildren() {\n    return <DiagnosticsNode>[\n      if (text != null)\n        text!.toDiagnosticsNode(\n          name: 'text',\n          style: DiagnosticsTreeStyle.transition,\n        ),\n    ];\n  }\n}\n\nclass _RenderEditableCustomPaint extends RenderBox {\n  _RenderEditableCustomPaint({RenderEditablePainter? painter})\n    : _painter = painter,\n      super();\n\n  @override\n  RenderEditable? get parent => super.parent as RenderEditable?;\n\n  @override\n  bool get isRepaintBoundary => true;\n\n  @override\n  bool get sizedByParent => true;\n\n  RenderEditablePainter? get painter => _painter;\n  RenderEditablePainter? _painter;\n  set painter(RenderEditablePainter? newValue) {\n    if (newValue == painter) {\n      return;\n    }\n\n    final RenderEditablePainter? oldPainter = painter;\n    _painter = newValue;\n\n    if (newValue?.shouldRepaint(oldPainter) ?? true) {\n      markNeedsPaint();\n    }\n\n    if (attached) {\n      oldPainter?.removeListener(markNeedsPaint);\n      newValue?.addListener(markNeedsPaint);\n    }\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    final RenderEditable? parent = this.parent;\n    assert(parent != null);\n    final RenderEditablePainter? painter = this.painter;\n    if (painter != null && parent != null) {\n      parent._computeTextMetricsIfNeeded();\n      painter.paint(context.canvas, size, parent);\n    }\n  }\n\n  @override\n  void attach(PipelineOwner owner) {\n    super.attach(owner);\n    _painter?.addListener(markNeedsPaint);\n  }\n\n  @override\n  void detach() {\n    _painter?.removeListener(markNeedsPaint);\n    super.detach();\n  }\n\n  @override\n  @protected\n  Size computeDryLayout(covariant BoxConstraints constraints) =>\n      constraints.biggest;\n}\n\n/// An interface that paints within a [RenderEditable]'s bounds, above or\n/// beneath its text content.\n///\n/// This painter is typically used for painting auxiliary content that depends\n/// on text layout metrics (for instance, for painting carets and text highlight\n/// blocks). It can paint independently from its [RenderEditable], allowing it\n/// to repaint without triggering a repaint on the entire [RenderEditable] stack\n/// when only auxiliary content changes (e.g. a blinking cursor) are present. It\n/// will be scheduled to repaint when:\n///\n///  * It's assigned to a new [RenderEditable] (replacing a prior\n///    [RenderEditablePainter]) and the [shouldRepaint] method returns true.\n///  * Any of the [RenderEditable]s it is attached to repaints.\n///  * The [notifyListeners] method is called, which typically happens when the\n///    painter's attributes change.\n///\n/// See also:\n///\n///  * [RenderEditable.foregroundPainter], which takes a [RenderEditablePainter]\n///    and sets it as the foreground painter of the [RenderEditable].\n///  * [RenderEditable.painter], which takes a [RenderEditablePainter]\n///    and sets it as the background painter of the [RenderEditable].\n///  * [CustomPainter], a similar class which paints within a [RenderCustomPaint].\nabstract class RenderEditablePainter extends ChangeNotifier {\n  /// Determines whether repaint is needed when a new [RenderEditablePainter]\n  /// is provided to a [RenderEditable].\n  ///\n  /// If the new instance represents different information than the old\n  /// instance, then the method should return true, otherwise it should return\n  /// false. When [oldDelegate] is null, this method should always return true\n  /// unless the new painter initially does not paint anything.\n  ///\n  /// If the method returns false, then the [paint] call might be optimized\n  /// away. However, the [paint] method will get called whenever the\n  /// [RenderEditable]s it attaches to repaint, even if [shouldRepaint] returns\n  /// false.\n  bool shouldRepaint(RenderEditablePainter? oldDelegate);\n\n  /// Paints within the bounds of a [RenderEditable].\n  ///\n  /// The given [Canvas] has the same coordinate space as the [RenderEditable],\n  /// which may be different from the coordinate space the [RenderEditable]'s\n  /// [TextPainter] uses, when the text moves inside the [RenderEditable].\n  ///\n  /// Paint operations performed outside of the region defined by the [canvas]'s\n  /// origin and the [size] parameter may get clipped, when [RenderEditable]'s\n  /// [RenderEditable.clipBehavior] is not [Clip.none].\n  void paint(Canvas canvas, Size size, RenderEditable renderEditable);\n}\n\nclass _TextHighlightPainter extends RenderEditablePainter {\n  _TextHighlightPainter({TextRange? highlightedRange, Color? highlightColor})\n    : _highlightedRange = highlightedRange,\n      _highlightColor = highlightColor;\n\n  final Paint highlightPaint = Paint();\n\n  Color? get highlightColor => _highlightColor;\n  Color? _highlightColor;\n  set highlightColor(Color? newValue) {\n    if (newValue == _highlightColor) {\n      return;\n    }\n    _highlightColor = newValue;\n    notifyListeners();\n  }\n\n  TextRange? get highlightedRange => _highlightedRange;\n  TextRange? _highlightedRange;\n  set highlightedRange(TextRange? newValue) {\n    if (newValue == _highlightedRange) {\n      return;\n    }\n    _highlightedRange = newValue;\n    notifyListeners();\n  }\n\n  /// Controls how tall the selection highlight boxes are computed to be.\n  ///\n  /// See [ui.BoxHeightStyle] for details on available styles.\n  ui.BoxHeightStyle get selectionHeightStyle => _selectionHeightStyle;\n  ui.BoxHeightStyle _selectionHeightStyle = ui.BoxHeightStyle.tight;\n  set selectionHeightStyle(ui.BoxHeightStyle value) {\n    if (_selectionHeightStyle == value) {\n      return;\n    }\n    _selectionHeightStyle = value;\n    notifyListeners();\n  }\n\n  /// Controls how wide the selection highlight boxes are computed to be.\n  ///\n  /// See [ui.BoxWidthStyle] for details on available styles.\n  ui.BoxWidthStyle get selectionWidthStyle => _selectionWidthStyle;\n  ui.BoxWidthStyle _selectionWidthStyle = ui.BoxWidthStyle.tight;\n  set selectionWidthStyle(ui.BoxWidthStyle value) {\n    if (_selectionWidthStyle == value) {\n      return;\n    }\n    _selectionWidthStyle = value;\n    notifyListeners();\n  }\n\n  @override\n  void paint(Canvas canvas, Size size, RenderEditable renderEditable) {\n    final TextRange? range = highlightedRange;\n    final Color? color = highlightColor;\n    if (range == null || color == null || range.isCollapsed) {\n      return;\n    }\n\n    highlightPaint.color = color;\n    final TextPainter textPainter = renderEditable._textPainter;\n    final Set<TextBox> boxes = textPainter\n        .getBoxesForSelection(\n          TextSelection(baseOffset: range.start, extentOffset: range.end),\n          boxHeightStyle: selectionHeightStyle,\n          boxWidthStyle: selectionWidthStyle,\n        )\n        .toSet();\n\n    for (final box in boxes) {\n      canvas.drawRect(\n        box\n            .toRect()\n            .shift(renderEditable._paintOffset)\n            .intersect(\n              Rect.fromLTRB(0, 0, textPainter.width, textPainter.height),\n            ),\n        highlightPaint,\n      );\n    }\n  }\n\n  @override\n  bool shouldRepaint(RenderEditablePainter? oldDelegate) {\n    if (identical(oldDelegate, this)) {\n      return false;\n    }\n    if (oldDelegate == null) {\n      return highlightColor != null && highlightedRange != null;\n    }\n    return oldDelegate is! _TextHighlightPainter ||\n        oldDelegate.highlightColor != highlightColor ||\n        oldDelegate.highlightedRange != highlightedRange ||\n        oldDelegate.selectionHeightStyle != selectionHeightStyle ||\n        oldDelegate.selectionWidthStyle != selectionWidthStyle;\n  }\n}\n\nclass _CaretPainter extends RenderEditablePainter {\n  _CaretPainter();\n\n  bool get shouldPaint => _shouldPaint;\n  bool _shouldPaint = true;\n  set shouldPaint(bool value) {\n    if (shouldPaint == value) {\n      return;\n    }\n    _shouldPaint = value;\n    notifyListeners();\n  }\n\n  // This is directly manipulated by the RenderEditable during\n  // setFloatingCursor.\n  //\n  // When changing this value, the caller is responsible for ensuring that\n  // listeners are notified.\n  bool showRegularCaret = false;\n\n  final Paint caretPaint = Paint();\n  late final Paint floatingCursorPaint = Paint();\n\n  Color? get caretColor => _caretColor;\n  Color? _caretColor;\n  set caretColor(Color? value) {\n    if (caretColor?.toARGB32() == value?.toARGB32()) {\n      return;\n    }\n\n    _caretColor = value;\n    notifyListeners();\n  }\n\n  Radius? get cursorRadius => _cursorRadius;\n  Radius? _cursorRadius;\n  set cursorRadius(Radius? value) {\n    if (_cursorRadius == value) {\n      return;\n    }\n    _cursorRadius = value;\n    notifyListeners();\n  }\n\n  Offset get cursorOffset => _cursorOffset;\n  Offset _cursorOffset = Offset.zero;\n  set cursorOffset(Offset value) {\n    if (_cursorOffset == value) {\n      return;\n    }\n    _cursorOffset = value;\n    notifyListeners();\n  }\n\n  Color? get backgroundCursorColor => _backgroundCursorColor;\n  Color? _backgroundCursorColor;\n  set backgroundCursorColor(Color? value) {\n    if (backgroundCursorColor?.toARGB32() == value?.toARGB32()) {\n      return;\n    }\n\n    _backgroundCursorColor = value;\n    if (showRegularCaret) {\n      notifyListeners();\n    }\n  }\n\n  Rect? get floatingCursorRect => _floatingCursorRect;\n  Rect? _floatingCursorRect;\n  set floatingCursorRect(Rect? value) {\n    if (_floatingCursorRect == value) {\n      return;\n    }\n    _floatingCursorRect = value;\n    notifyListeners();\n  }\n\n  void paintRegularCursor(\n    Canvas canvas,\n    RenderEditable renderEditable,\n    Color caretColor,\n    TextPosition textPosition,\n  ) {\n    final Rect integralRect = renderEditable.getLocalRectForCaret(textPosition);\n    if (shouldPaint) {\n      if (floatingCursorRect != null) {\n        final double distanceSquared =\n            (floatingCursorRect!.center - integralRect.center).distanceSquared;\n        if (distanceSquared <\n            _kShortestDistanceSquaredWithFloatingAndRegularCursors) {\n          return;\n        }\n      }\n      final Radius? radius = cursorRadius;\n      caretPaint.color = caretColor;\n      if (radius == null) {\n        canvas.drawRect(integralRect, caretPaint);\n      } else {\n        final caretRRect = RRect.fromRectAndRadius(integralRect, radius);\n        canvas.drawRRect(caretRRect, caretPaint);\n      }\n    }\n  }\n\n  @override\n  void paint(Canvas canvas, Size size, RenderEditable renderEditable) {\n    // Compute the caret location even when `shouldPaint` is false.\n\n    final TextSelection? selection = renderEditable.selection;\n\n    if (selection == null || !selection.isCollapsed || !selection.isValid) {\n      return;\n    }\n\n    final Rect? floatingCursorRect = this.floatingCursorRect;\n\n    final Color? caretColor = floatingCursorRect == null\n        ? this.caretColor\n        : showRegularCaret\n        ? backgroundCursorColor\n        : null;\n    final TextPosition caretTextPosition = floatingCursorRect == null\n        ? selection.extent\n        : renderEditable._floatingCursorTextPosition;\n\n    if (caretColor != null) {\n      paintRegularCursor(canvas, renderEditable, caretColor, caretTextPosition);\n    }\n\n    final Color? floatingCursorColor = this.caretColor?.withValues(alpha: 0.75);\n    // Floating Cursor.\n    if (floatingCursorRect == null ||\n        floatingCursorColor == null ||\n        !shouldPaint) {\n      return;\n    }\n\n    canvas.drawRRect(\n      RRect.fromRectAndRadius(floatingCursorRect, _kFloatingCursorRadius),\n      floatingCursorPaint..color = floatingCursorColor,\n    );\n  }\n\n  @override\n  bool shouldRepaint(RenderEditablePainter? oldDelegate) {\n    if (identical(this, oldDelegate)) {\n      return false;\n    }\n\n    if (oldDelegate == null) {\n      return shouldPaint;\n    }\n    return oldDelegate is! _CaretPainter ||\n        oldDelegate.shouldPaint != shouldPaint ||\n        oldDelegate.showRegularCaret != showRegularCaret ||\n        oldDelegate.caretColor != caretColor ||\n        oldDelegate.cursorRadius != cursorRadius ||\n        oldDelegate.cursorOffset != cursorOffset ||\n        oldDelegate.backgroundCursorColor != backgroundCursorColor ||\n        oldDelegate.floatingCursorRect != floatingCursorRect;\n  }\n}\n\nclass _CompositeRenderEditablePainter extends RenderEditablePainter {\n  _CompositeRenderEditablePainter({required this.painters});\n\n  final List<RenderEditablePainter> painters;\n\n  @override\n  void addListener(VoidCallback listener) {\n    for (final RenderEditablePainter painter in painters) {\n      painter.addListener(listener);\n    }\n  }\n\n  @override\n  void removeListener(VoidCallback listener) {\n    for (final RenderEditablePainter painter in painters) {\n      painter.removeListener(listener);\n    }\n  }\n\n  @override\n  void paint(Canvas canvas, Size size, RenderEditable renderEditable) {\n    for (final RenderEditablePainter painter in painters) {\n      painter.paint(canvas, size, renderEditable);\n    }\n  }\n\n  @override\n  bool shouldRepaint(RenderEditablePainter? oldDelegate) {\n    if (identical(oldDelegate, this)) {\n      return false;\n    }\n    if (oldDelegate is! _CompositeRenderEditablePainter ||\n        oldDelegate.painters.length != painters.length) {\n      return true;\n    }\n\n    final Iterator<RenderEditablePainter> oldPainters =\n        oldDelegate.painters.iterator;\n    final Iterator<RenderEditablePainter> newPainters = painters.iterator;\n    while (oldPainters.moveNext() && newPainters.moveNext()) {\n      if (newPainters.current.shouldRepaint(oldPainters.current)) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/text_field/editable_text.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// ignore_for_file: uri_does_not_exist_in_doc_import\n\n/// @docImport 'package:flutter/cupertino.dart';\n/// @docImport 'package:flutter/material.dart';\n///\n/// @docImport 'app.dart';\n/// @docImport 'context_menu_controller.dart';\n/// @docImport 'form.dart';\n/// @docImport 'restoration.dart';\n/// @docImport 'restoration_properties.dart';\n/// @docImport 'selectable_region.dart';\n/// @docImport 'text_selection_toolbar_layout_delegate.dart';\nlibrary;\n\nimport 'dart:async';\nimport 'dart:io' show Platform;\nimport 'dart:math' as math;\nimport 'dart:ui' as ui hide TextStyle;\n\nimport 'package:PiliPlus/common/widgets/flutter/text_field/controller.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text_field/editable.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text_field/spell_check.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text_field/text_selection.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart'\n    hide\n        EditableText,\n        EditableTextState,\n        SpellCheckConfiguration,\n        TextSelectionGestureDetectorBuilder,\n        TextSelectionOverlay;\nimport 'package:flutter/rendering.dart'\n    hide RenderEditable, VerticalCaretMovementRun;\nimport 'package:flutter/scheduler.dart';\nimport 'package:flutter/services.dart';\n\n/// Signature for a widget builder that builds a context menu for the given\n/// [EditableTextState].\n///\n/// See also:\n///\n///  * [SelectableRegionContextMenuBuilder], which performs the same role for\n///    [SelectableRegion].\ntypedef EditableTextContextMenuBuilder =\n    Widget Function(BuildContext context, EditableTextState editableTextState);\n\n// Signature for a function that determines the target location of the given\n// [TextPosition] after applying the given [TextBoundary].\ntypedef _ApplyTextBoundary =\n    TextPosition Function(TextPosition, bool, TextBoundary);\n\n// The time it takes for the cursor to fade from fully opaque to fully\n// transparent and vice versa. A full cursor blink, from transparent to opaque\n// to transparent, is twice this duration.\nconst Duration _kCursorBlinkHalfPeriod = Duration(milliseconds: 500);\n\n// Number of cursor ticks during which the most recently entered character\n// is shown in an obscured text field.\nconst int _kObscureShowLatestCharCursorTicks = 3;\n\nclass _CompositionCallback extends SingleChildRenderObjectWidget {\n  const _CompositionCallback({\n    required this.compositeCallback,\n    required this.enabled,\n    super.child,\n  });\n  final CompositionCallback compositeCallback;\n  final bool enabled;\n\n  @override\n  RenderObject createRenderObject(BuildContext context) {\n    return _RenderCompositionCallback(compositeCallback, enabled);\n  }\n\n  @override\n  void updateRenderObject(\n    BuildContext context,\n    _RenderCompositionCallback renderObject,\n  ) {\n    super.updateRenderObject(context, renderObject);\n    // _EditableTextState always uses the same callback.\n    assert(renderObject.compositeCallback == compositeCallback);\n    renderObject.enabled = enabled;\n  }\n}\n\nclass _RenderCompositionCallback extends RenderProxyBox {\n  _RenderCompositionCallback(this.compositeCallback, this._enabled);\n\n  final CompositionCallback compositeCallback;\n  VoidCallback? _cancelCallback;\n\n  bool get enabled => _enabled;\n  bool _enabled = false;\n  set enabled(bool newValue) {\n    _enabled = newValue;\n    if (!newValue) {\n      _cancelCallback?.call();\n      _cancelCallback = null;\n    } else if (_cancelCallback == null) {\n      markNeedsPaint();\n    }\n  }\n\n  @override\n  void paint(PaintingContext context, ui.Offset offset) {\n    if (enabled) {\n      _cancelCallback ??= context.addCompositionCallback(compositeCallback);\n    }\n    super.paint(context, offset);\n  }\n}\n\n// A time-value pair that represents a key frame in an animation.\nclass _KeyFrame {\n  const _KeyFrame(this.time, this.value);\n  // Values extracted from iOS 15.4 UIKit.\n  static const List<_KeyFrame> iOSBlinkingCaretKeyFrames = <_KeyFrame>[\n    _KeyFrame(0, 1), // 0\n    _KeyFrame(0.5, 1), // 1\n    _KeyFrame(0.5375, 0.75), // 2\n    _KeyFrame(0.575, 0.5), // 3\n    _KeyFrame(0.6125, 0.25), // 4\n    _KeyFrame(0.65, 0), // 5\n    _KeyFrame(0.85, 0), // 6\n    _KeyFrame(0.8875, 0.25), // 7\n    _KeyFrame(0.925, 0.5), // 8\n    _KeyFrame(0.9625, 0.75), // 9\n    _KeyFrame(1, 1), // 10\n  ];\n\n  // The timing, in seconds, of the specified animation `value`.\n  final double time;\n  final double value;\n}\n\nclass _DiscreteKeyFrameSimulation extends Simulation {\n  _DiscreteKeyFrameSimulation.iOSBlinkingCaret()\n    : this._(_KeyFrame.iOSBlinkingCaretKeyFrames, 1);\n  _DiscreteKeyFrameSimulation._(this._keyFrames, this.maxDuration)\n    : assert(_keyFrames.isNotEmpty),\n      assert(_keyFrames.last.time <= maxDuration),\n      assert(() {\n        for (var i = 0; i < _keyFrames.length - 1; i += 1) {\n          if (_keyFrames[i].time > _keyFrames[i + 1].time) {\n            return false;\n          }\n        }\n        return true;\n      }(), 'The key frame sequence must be sorted by time.');\n\n  final double maxDuration;\n\n  final List<_KeyFrame> _keyFrames;\n\n  @override\n  double dx(double time) => 0;\n\n  @override\n  bool isDone(double time) => time >= maxDuration;\n\n  // The index of the KeyFrame corresponds to the most recent input `time`.\n  int _lastKeyFrameIndex = 0;\n\n  @override\n  double x(double time) {\n    final int length = _keyFrames.length;\n\n    // Perform a linear search in the sorted key frame list, starting from the\n    // last key frame found, since the input `time` usually monotonically\n    // increases by a small amount.\n    int searchIndex;\n    final int endIndex;\n    if (_keyFrames[_lastKeyFrameIndex].time > time) {\n      // The simulation may have restarted. Search within the index range\n      // [0, _lastKeyFrameIndex).\n      searchIndex = 0;\n      endIndex = _lastKeyFrameIndex;\n    } else {\n      searchIndex = _lastKeyFrameIndex;\n      endIndex = length;\n    }\n\n    // Find the target key frame. Don't have to check (endIndex - 1): if\n    // (endIndex - 2) doesn't work we'll have to pick (endIndex - 1) anyways.\n    while (searchIndex < endIndex - 1) {\n      assert(_keyFrames[searchIndex].time <= time);\n      final _KeyFrame next = _keyFrames[searchIndex + 1];\n      if (time < next.time) {\n        break;\n      }\n      searchIndex += 1;\n    }\n\n    _lastKeyFrameIndex = searchIndex;\n    return _keyFrames[_lastKeyFrameIndex].value;\n  }\n}\n\n/// A basic text input field.\n///\n/// This widget interacts with the [TextInput] service to let the user edit the\n/// text it contains. It also provides scrolling, selection, and cursor\n/// movement.\n///\n/// The [EditableText] widget is a low-level widget that is intended as a\n/// building block for custom widget sets. For a complete user experience,\n/// consider using a [TextField] or [CupertinoTextField].\n///\n/// ## Handling User Input\n///\n/// Currently the user may change the text this widget contains via keyboard or\n/// the text selection menu. When the user inserted or deleted text, you will be\n/// notified of the change and get a chance to modify the new text value:\n///\n/// * The [inputFormatters] will be first applied to the user input.\n///\n/// * The [controller]'s [RichTextEditingController.value] will be updated with the\n///   formatted result, and the [controller]'s listeners will be notified.\n///\n/// * The [onChanged] callback, if specified, will be called last.\n///\n/// ## Input Actions\n///\n/// A [TextInputAction] can be provided to customize the appearance of the\n/// action button on the soft keyboard for Android and iOS. The default action\n/// is [TextInputAction.done].\n///\n/// Many [TextInputAction]s are common between Android and iOS. However, if a\n/// [textInputAction] is provided that is not supported by the current\n/// platform in debug mode, an error will be thrown when the corresponding\n/// EditableText receives focus. For example, providing iOS's \"emergencyCall\"\n/// action when running on an Android device will result in an error when in\n/// debug mode. In release mode, incompatible [TextInputAction]s are replaced\n/// either with \"unspecified\" on Android, or \"default\" on iOS. Appropriate\n/// [textInputAction]s can be chosen by checking the current platform and then\n/// selecting the appropriate action.\n///\n/// {@template flutter.widgets.EditableText.lifeCycle}\n/// ## Lifecycle\n///\n/// Upon completion of editing, like pressing the \"done\" button on the keyboard,\n/// two actions take place:\n///\n///   1st: Editing is finalized. The default behavior of this step includes\n///   an invocation of [onChanged]. That default behavior can be overridden.\n///   See [onEditingComplete] for details.\n///\n///   2nd: [onSubmitted] is invoked with the user's input value.\n///\n/// [onSubmitted] can be used to manually move focus to another input widget\n/// when a user finishes with the currently focused input widget.\n///\n/// When the widget has focus, it will prevent itself from disposing via\n/// [AutomaticKeepAliveClientMixin.wantKeepAlive] in order to avoid losing the\n/// selection. Removing the focus will allow it to be disposed.\n/// {@endtemplate}\n///\n/// Rather than using this widget directly, consider using [TextField], which\n/// is a full-featured, material-design text input field with placeholder text,\n/// labels, and [Form] integration.\n///\n/// ## Text Editing [Intent]s and Their Default [Action]s\n///\n/// This widget provides default [Action]s for handling common text editing\n/// [Intent]s such as deleting, copying and pasting in the text field. These\n/// [Action]s can be directly invoked using [Actions.invoke] or the\n/// [Actions.maybeInvoke] method. The default text editing keyboard [Shortcuts],\n/// typically declared in [DefaultTextEditingShortcuts], also use these\n/// [Intent]s and [Action]s to perform the text editing operations they are\n/// bound to.\n///\n/// The default handling of a specific [Intent] can be overridden by placing an\n/// [Actions] widget above this widget. See the [Action] class and the\n/// [Action.overridable] constructor for more information on how a pre-defined\n/// overridable [Action] can be overridden.\n///\n/// ### Intents for Deleting Text and Their Default Behavior\n///\n/// | **Intent Class**                 | **Default Behavior when there's selected text**      | **Default Behavior when there is a [caret](https://en.wikipedia.org/wiki/Caret_navigation) (The selection is [TextSelection.collapsed])**  |\n/// | :------------------------------- | :--------------------------------------------------- | :----------------------------------------------------------------------- |\n/// | [DeleteCharacterIntent]          | Deletes the selected text                            | Deletes the user-perceived character before or after the caret location. |\n/// | [DeleteToNextWordBoundaryIntent] | Deletes the selected text and the word before/after the selection's [TextSelection.extent] position | Deletes from the caret location to the previous or the next word boundary |\n/// | [DeleteToLineBreakIntent]        | Deletes the selected text, and deletes to the start/end of the line from the selection's [TextSelection.extent] position | Deletes from the caret location to the logical start or end of the current line |\n///\n/// ### Intents for Moving the [Caret](https://en.wikipedia.org/wiki/Caret_navigation)\n///\n/// | **Intent Class**                                                                     | **Default Behavior when there's selected text**                  | **Default Behavior when there is a caret ([TextSelection.collapsed])**  |\n/// | :----------------------------------------------------------------------------------- | :--------------------------------------------------------------- | :---------------------------------------------------------------------- |\n/// | [ExtendSelectionByCharacterIntent](`collapseSelection: true`)                        | Collapses the selection to the logical start/end of the selection | Moves the caret past the user-perceived character before or after the current caret location. |\n/// | [ExtendSelectionToNextWordBoundaryIntent](`collapseSelection: true`)                 | Collapses the selection to the word boundary before/after the selection's [TextSelection.extent] position | Moves the caret to the previous/next word boundary. |\n/// | [ExtendSelectionToNextWordBoundaryOrCaretLocationIntent](`collapseSelection: true`)  | Collapses the selection to the word boundary before/after the selection's [TextSelection.extent] position, or [TextSelection.base], whichever is closest in the given direction | Moves the caret to the previous/next word boundary. |\n/// | [ExtendSelectionToLineBreakIntent](`collapseSelection: true`)                        | Collapses the selection to the start/end of the line at the selection's [TextSelection.extent] position | Moves the caret to the start/end of the current line .|\n/// | [ExtendSelectionVerticallyToAdjacentLineIntent](`collapseSelection: true`)           | Collapses the selection to the position closest to the selection's [TextSelection.extent], on the previous/next adjacent line | Moves the caret to the closest position on the previous/next adjacent line. |\n/// | [ExtendSelectionVerticallyToAdjacentPageIntent](`collapseSelection: true`)           | Collapses the selection to the position closest to the selection's [TextSelection.extent], on the previous/next adjacent page | Moves the caret to the closest position on the previous/next adjacent page. |\n/// | [ExtendSelectionToDocumentBoundaryIntent](`collapseSelection: true`)                 | Collapses the selection to the start/end of the document | Moves the caret to the start/end of the document. |\n///\n/// #### Intents for Extending the Selection\n///\n/// | **Intent Class**                                                                     | **Default Behavior when there's selected text**                  | **Default Behavior when there is a caret ([TextSelection.collapsed])**  |\n/// | :----------------------------------------------------------------------------------- | :--------------------------------------------------------------- | :---------------------------------------------------------------------- |\n/// | [ExtendSelectionByCharacterIntent](`collapseSelection: false`)                       | Moves the selection's [TextSelection.extent] past the user-perceived character before/after it |\n/// | [ExtendSelectionToNextWordBoundaryIntent](`collapseSelection: false`)                | Moves the selection's [TextSelection.extent] to the previous/next word boundary |\n/// | [ExtendSelectionToNextWordBoundaryOrCaretLocationIntent](`collapseSelection: false`) | Moves the selection's [TextSelection.extent] to the previous/next word boundary, or [TextSelection.base] whichever is closest in the given direction | Moves the selection's [TextSelection.extent] to the previous/next word boundary. |\n/// | [ExtendSelectionToLineBreakIntent](`collapseSelection: false`)                       | Moves the selection's [TextSelection.extent] to the start/end of the line |\n/// | [ExtendSelectionVerticallyToAdjacentLineIntent](`collapseSelection: false`)          | Moves the selection's [TextSelection.extent] to the closest position on the previous/next adjacent line |\n/// | [ExtendSelectionVerticallyToAdjacentPageIntent](`collapseSelection: false`)          | Moves the selection's [TextSelection.extent] to the closest position on the previous/next adjacent page |\n/// | [ExtendSelectionToDocumentBoundaryIntent](`collapseSelection: false`)                | Moves the selection's [TextSelection.extent] to the start/end of the document |\n/// | [SelectAllTextIntent]  | Selects the entire document |\n///\n/// ### Other Intents\n///\n/// | **Intent Class**                        | **Default Behavior**                                 |\n/// | :-------------------------------------- | :--------------------------------------------------- |\n/// | [DoNothingAndStopPropagationTextIntent] | Does nothing in the input field, and prevents the key event from further propagating in the widget tree. |\n/// | [ReplaceTextIntent]                     | Replaces the current [TextEditingValue] in the input field's [RichTextEditingController], and triggers all related user callbacks and [TextInputFormatter]s. |\n/// | [UpdateSelectionIntent]                 | Updates the current selection in the input field's [RichTextEditingController], and triggers the [onSelectionChanged] callback. |\n/// | [CopySelectionTextIntent]               | Copies or cuts the selected text into the clipboard |\n/// | [PasteTextIntent]                       | Inserts the current text in the clipboard after the caret location, or replaces the selected text if the selection is not collapsed. |\n///\n/// ## Text Editing [Shortcuts]\n///\n/// It's also possible to directly remap keyboard shortcuts to new [Intent]s by\n/// inserting a [Shortcuts] widget above this in the widget tree. When using\n/// [WidgetsApp], the large set of default text editing keyboard shortcuts are\n/// declared near the top of the widget tree in [DefaultTextEditingShortcuts],\n/// and any [Shortcuts] widget between it and this [EditableText] will override\n/// those defaults.\n///\n/// {@template flutter.widgets.editableText.shortcutsAndTextInput}\n/// ### Interactions Between [Shortcuts] and Text Input\n///\n/// Shortcuts prevent text input fields from receiving their keystrokes as text\n/// input. For example, placing a [Shortcuts] widget in the widget tree above\n/// a text input field and creating a shortcut for [LogicalKeyboardKey.keyA]\n/// will prevent the field from receiving that key as text input. In other\n/// words, typing key \"A\" into the field will trigger the shortcut and will not\n/// insert a letter \"a\" into the field.\n///\n/// This happens because of the way that key strokes are handled in Flutter.\n/// When a keystroke is received in Flutter's engine, it first gives the\n/// framework the opportunity to handle it as a raw key event through\n/// [SystemChannels.keyEvent]. This is what [Shortcuts] listens to indirectly\n/// through its [FocusNode]. If it is not handled, then it will proceed to try\n/// handling it as text input through [SystemChannels.textInput], which is what\n/// [EditableTextState] listens to through [TextInputClient].\n///\n/// This behavior, where a shortcut prevents text input into some field, can be\n/// overridden by using another [Shortcuts] widget lower in the widget tree and\n/// mapping the desired key stroke(s) to [DoNothingAndStopPropagationIntent].\n/// The key event will be reported as unhandled by the framework and will then\n/// be sent as text input as usual.\n/// {@endtemplate}\n///\n/// ## Gesture Events Handling\n///\n/// When [rendererIgnoresPointer] is false (the default), this widget provides\n/// rudimentary, platform-agnostic gesture handling for user actions such as\n/// tapping, long-pressing, and scrolling.\n///\n/// To provide more complete gesture handling, including double-click to select\n/// a word, drag selection, and platform-specific handling of gestures such as\n/// long presses, consider setting [rendererIgnoresPointer] to true and using\n/// [TextSelectionGestureDetectorBuilder].\n///\n/// {@template flutter.widgets.editableText.showCaretOnScreen}\n/// ## Keep the caret visible when focused\n///\n/// When focused, this widget will make attempts to keep the text area and its\n/// caret (even when [showCursor] is `false`) visible, on these occasions:\n///\n///  * When the user focuses this text field and it is not [readOnly].\n///  * When the user changes the selection of the text field, or changes the\n///    text when the text field is not [readOnly].\n///  * When the virtual keyboard pops up.\n/// {@endtemplate}\n///\n/// ## Scrolling Considerations\n///\n/// If this [EditableText] is not a descendant of [Scaffold] and is being used\n/// within a [Scrollable] or nested [Scrollable]s, consider placing a\n/// [ScrollNotificationObserver] above the root [Scrollable] that contains this\n/// [EditableText] to ensure proper scroll coordination for [EditableText] and\n/// its components like [TextSelectionOverlay].\n///\n/// {@template flutter.widgets.editableText.accessibility}\n/// ## Troubleshooting Common Accessibility Issues\n///\n/// ### Customizing User Input Accessibility Announcements\n///\n/// To customize user input accessibility announcements triggered by text\n/// changes, use [SemanticsService.announce] to make the desired\n/// accessibility announcement.\n///\n/// On iOS, the on-screen keyboard may announce the most recent input\n/// incorrectly when a [TextInputFormatter] inserts a thousands separator to\n/// a currency value text field. The following example demonstrates how to\n/// suppress the default accessibility announcements by always announcing\n/// the content of the text field as a US currency value (the `\\$` inserts\n/// a dollar sign, the `$newText` interpolates the `newText` variable):\n///\n/// ```dart\n/// onChanged: (String newText) {\n///   if (newText.isNotEmpty) {\n///     SemanticsService.sendAnnouncement(\n///       View.of(context),\n///       '\\$$newText',\n///        Directionality.of(context),\n///     );\n///   }\n/// }\n/// ```\n///\n/// {@endtemplate}\n///\n/// See also:\n///\n///  * [TextField], which is a full-featured, material-design text input field\n///    with placeholder text, labels, and [Form] integration.\nclass EditableText extends StatefulWidget {\n  /// Creates a basic text input control.\n  ///\n  /// The [maxLines] property can be set to null to remove the restriction on\n  /// the number of lines. By default, it is one, meaning this is a single-line\n  /// text field. [maxLines] must be null or greater than zero.\n  ///\n  /// If [keyboardType] is not set or is null, its value will be inferred from\n  /// [autofillHints], if [autofillHints] is not empty. Otherwise it defaults to\n  /// [TextInputType.text] if [maxLines] is exactly one, and\n  /// [TextInputType.multiline] if [maxLines] is null or greater than one.\n  ///\n  /// The text cursor is not shown if [showCursor] is false or if [showCursor]\n  /// is null (the default) and [readOnly] is true.\n  EditableText({\n    super.key,\n    required this.controller,\n    required this.focusNode,\n    this.readOnly = false,\n    this.obscuringCharacter = '•',\n    this.obscureText = false,\n    bool? autocorrect,\n    SmartDashesType? smartDashesType,\n    SmartQuotesType? smartQuotesType,\n    this.enableSuggestions = true,\n    required this.style,\n    StrutStyle? strutStyle,\n    required this.cursorColor,\n    required this.backgroundCursorColor,\n    this.textAlign = TextAlign.start,\n    this.textDirection,\n    this.locale,\n    @Deprecated(\n      'Use textScaler instead. '\n      'Use of textScaleFactor was deprecated in preparation for the upcoming nonlinear text scaling support. '\n      'This feature was deprecated after v3.12.0-2.0.pre.',\n    )\n    this.textScaleFactor,\n    this.textScaler,\n    this.maxLines = 1,\n    this.minLines,\n    this.expands = false,\n    this.forceLine = true,\n    this.textHeightBehavior,\n    this.textWidthBasis = TextWidthBasis.parent,\n    this.autofocus = false,\n    bool? showCursor,\n    this.showSelectionHandles = false,\n    this.selectionColor,\n    this.selectionControls,\n    TextInputType? keyboardType,\n    this.textInputAction,\n    this.textCapitalization = TextCapitalization.none,\n    this.onChanged,\n    this.onEditingComplete,\n    this.onSubmitted,\n    this.onAppPrivateCommand,\n    this.onSelectionChanged,\n    this.onSelectionHandleTapped,\n    this.groupId = EditableText,\n    this.onTapOutside,\n    this.onTapUpOutside,\n    List<TextInputFormatter>? inputFormatters,\n    this.mouseCursor,\n    this.rendererIgnoresPointer = false,\n    this.cursorWidth = 2.0,\n    this.cursorHeight,\n    this.cursorRadius,\n    this.cursorOpacityAnimates = false,\n    this.cursorOffset,\n    this.paintCursorAboveText = false,\n    ui.BoxHeightStyle? selectionHeightStyle,\n    ui.BoxWidthStyle? selectionWidthStyle,\n    this.scrollPadding = const EdgeInsets.all(20.0),\n    this.keyboardAppearance = Brightness.light,\n    this.dragStartBehavior = DragStartBehavior.start,\n    bool? enableInteractiveSelection,\n    bool? selectAllOnFocus,\n    this.scrollController,\n    this.scrollPhysics,\n    this.autocorrectionTextRectColor,\n    @Deprecated(\n      'Use `contextMenuBuilder` instead. '\n      'This feature was deprecated after v3.3.0-0.5.pre.',\n    )\n    ToolbarOptions? toolbarOptions,\n    this.autofillHints = const <String>[],\n    this.autofillClient,\n    this.clipBehavior = Clip.hardEdge,\n    this.restorationId,\n    this.scrollBehavior,\n    @Deprecated(\n      'Use `stylusHandwritingEnabled` instead. '\n      'This feature was deprecated after v3.27.0-0.2.pre.',\n    )\n    this.scribbleEnabled = true,\n    this.stylusHandwritingEnabled = defaultStylusHandwritingEnabled,\n    this.enableIMEPersonalizedLearning = true,\n    this.contentInsertionConfiguration,\n    this.contextMenuBuilder,\n    this.spellCheckConfiguration,\n    this.magnifierConfiguration = TextMagnifierConfiguration.disabled,\n    this.hintLocales,\n  }) : assert(obscuringCharacter.length == 1),\n       autocorrect =\n           autocorrect ?? _inferAutocorrect(autofillHints: autofillHints),\n       smartDashesType =\n           smartDashesType ??\n           (obscureText ? SmartDashesType.disabled : SmartDashesType.enabled),\n       smartQuotesType =\n           smartQuotesType ??\n           (obscureText ? SmartQuotesType.disabled : SmartQuotesType.enabled),\n       assert(minLines == null || minLines > 0),\n       assert(\n         (maxLines == null) || (minLines == null) || (maxLines >= minLines),\n         \"minLines can't be greater than maxLines\",\n       ),\n       assert(\n         !expands || (maxLines == null && minLines == null),\n         'minLines and maxLines must be null when expands is true.',\n       ),\n       assert(\n         !obscureText || maxLines == 1,\n         'Obscured fields cannot be multiline.',\n       ),\n       enableInteractiveSelection =\n           enableInteractiveSelection ?? (!readOnly || !obscureText),\n       selectAllOnFocus = selectAllOnFocus ?? _defaultSelectAllOnFocus,\n       toolbarOptions =\n           selectionControls is TextSelectionHandleControls &&\n               toolbarOptions == null\n           ? ToolbarOptions.empty\n           : toolbarOptions ??\n                 (obscureText\n                     ? (readOnly\n                           // No point in even offering \"Select All\" in a read-only obscured\n                           // field.\n                           ? ToolbarOptions.empty\n                           // Writable, but obscured.\n                           : const ToolbarOptions(selectAll: true, paste: true))\n                     : (readOnly\n                           // Read-only, not obscured.\n                           ? const ToolbarOptions(selectAll: true, copy: true)\n                           // Writable, not obscured.\n                           : const ToolbarOptions(\n                               copy: true,\n                               cut: true,\n                               selectAll: true,\n                               paste: true,\n                             ))),\n       assert(\n         spellCheckConfiguration == null ||\n             spellCheckConfiguration ==\n                 const SpellCheckConfiguration.disabled() ||\n             spellCheckConfiguration.misspelledTextStyle != null,\n         'spellCheckConfiguration must specify a misspelledTextStyle if spell check behavior is desired',\n       ),\n       _strutStyle = strutStyle,\n       keyboardType =\n           keyboardType ??\n           _inferKeyboardType(autofillHints: autofillHints, maxLines: maxLines),\n       inputFormatters = maxLines == 1\n           ? <TextInputFormatter>[\n               FilteringTextInputFormatter.singleLineFormatter,\n               ...inputFormatters ?? const Iterable<TextInputFormatter>.empty(),\n             ]\n           : inputFormatters,\n       showCursor = showCursor ?? !readOnly,\n       selectionHeightStyle =\n           selectionHeightStyle ?? defaultSelectionHeightStyle,\n       selectionWidthStyle = selectionWidthStyle ?? defaultSelectionWidthStyle;\n\n  /// Controls the text being edited.\n  final RichTextEditingController controller;\n\n  /// Controls whether this widget has keyboard focus.\n  final FocusNode focusNode;\n\n  /// {@template flutter.widgets.editableText.obscuringCharacter}\n  /// Character used for obscuring text if [obscureText] is true.\n  ///\n  /// Must be only a single character.\n  ///\n  /// Defaults to the character U+2022 BULLET (•).\n  /// {@endtemplate}\n  final String obscuringCharacter;\n\n  /// {@template flutter.widgets.editableText.obscureText}\n  /// Whether to hide the text being edited (e.g., for passwords).\n  ///\n  /// When this is set to true, all the characters in the text field are\n  /// replaced by [obscuringCharacter], and the text in the field cannot be\n  /// copied with copy or cut. If [readOnly] is also true, then the text cannot\n  /// be selected.\n  ///\n  /// Defaults to false.\n  /// {@endtemplate}\n  final bool obscureText;\n\n  /// {@macro dart.ui.textHeightBehavior}\n  final TextHeightBehavior? textHeightBehavior;\n\n  /// {@macro flutter.painting.textPainter.textWidthBasis}\n  final TextWidthBasis textWidthBasis;\n\n  /// {@template flutter.widgets.editableText.readOnly}\n  /// Whether the text can be changed.\n  ///\n  /// When this is set to true, the text cannot be modified\n  /// by any shortcut or keyboard operation. The text is still selectable.\n  ///\n  /// Defaults to false.\n  /// {@endtemplate}\n  final bool readOnly;\n\n  /// Whether the text will take the full width regardless of the text width.\n  ///\n  /// When this is set to false, the width will be based on text width, which\n  /// will also be affected by [textWidthBasis].\n  ///\n  /// Defaults to true.\n  ///\n  /// See also:\n  ///\n  ///  * [textWidthBasis], which controls the calculation of text width.\n  final bool forceLine;\n\n  /// Configuration of toolbar options.\n  ///\n  /// By default, all options are enabled. If [readOnly] is true, paste and cut\n  /// will be disabled regardless. If [obscureText] is true, cut and copy will\n  /// be disabled regardless. If [readOnly] and [obscureText] are both true,\n  /// select all will also be disabled.\n  final ToolbarOptions toolbarOptions;\n\n  /// Whether to show selection handles.\n  ///\n  /// When a selection is active, there will be two handles at each side of\n  /// boundary, or one handle if the selection is collapsed. The handles can be\n  /// dragged to adjust the selection.\n  ///\n  /// See also:\n  ///\n  ///  * [showCursor], which controls the visibility of the cursor.\n  final bool showSelectionHandles;\n\n  /// {@template flutter.widgets.editableText.showCursor}\n  /// Whether to show cursor.\n  ///\n  /// The cursor refers to the blinking caret when the [EditableText] is focused.\n  /// {@endtemplate}\n  ///\n  /// See also:\n  ///\n  ///  * [showSelectionHandles], which controls the visibility of the selection handles.\n  final bool showCursor;\n\n  /// {@template flutter.widgets.editableText.autocorrect}\n  /// Whether to enable autocorrection.\n  ///\n  /// False on iOS if [autofillHints] contains password-related hints, otherwise true.\n  /// {@endtemplate}\n  final bool autocorrect;\n\n  /// {@macro flutter.services.TextInputConfiguration.smartDashesType}\n  final SmartDashesType smartDashesType;\n\n  /// {@macro flutter.services.TextInputConfiguration.smartQuotesType}\n  final SmartQuotesType smartQuotesType;\n\n  /// {@macro flutter.services.TextInputConfiguration.enableSuggestions}\n  final bool enableSuggestions;\n\n  /// The text style to use for the editable text.\n  ///\n  /// The user or platform may override this [style]'s [TextStyle.fontWeight],\n  /// [TextStyle.height], [TextStyle.letterSpacing], and [TextStyle.wordSpacing]\n  /// via a [MediaQuery] ancestor's [MediaQueryData.boldText],\n  /// [MediaQueryData.lineHeightScaleFactorOverride],\n  /// [MediaQueryData.letterSpacingOverride], and [MediaQueryData.wordSpacingOverride]\n  /// regardless of its [TextStyle.inherit] value.\n  final TextStyle style;\n\n  /// {@template flutter.widgets.editableText.strutStyle}\n  /// The strut style used for the vertical layout.\n  ///\n  /// [StrutStyle] is used to establish a predictable vertical layout.\n  /// Since fonts may vary depending on user input and due to font\n  /// fallback, [StrutStyle.forceStrutHeight] is enabled by default\n  /// to lock all lines to the height of the base [TextStyle], provided by\n  /// [style]. This ensures the typed text fits within the allotted space.\n  ///\n  /// If null, the strut used will inherit values from the [style] and will\n  /// have [StrutStyle.forceStrutHeight] set to true. When no [style] is\n  /// passed, the theme's [TextStyle] will be used to generate [strutStyle]\n  /// instead.\n  ///\n  /// To disable strut-based vertical alignment and allow dynamic vertical\n  /// layout based on the glyphs typed, use [StrutStyle.disabled].\n  ///\n  /// Flutter's strut is based on [typesetting strut](https://en.wikipedia.org/wiki/Strut_(typesetting))\n  /// and CSS's [line-height](https://www.w3.org/TR/CSS2/visudet.html#line-height).\n  /// {@endtemplate}\n  ///\n  /// Within editable text and text fields, [StrutStyle] will not use its standalone\n  /// default values, and will instead inherit omitted/null properties from the\n  /// [TextStyle] instead. See [StrutStyle.inheritFromTextStyle].\n  ///\n  /// The user or platform may override this [strutStyle]'s [StrutStyle.height]\n  /// via a [MediaQuery] ancestor's [MediaQueryData.lineHeightScaleFactorOverride].\n  StrutStyle get strutStyle {\n    if (_strutStyle == null) {\n      return StrutStyle.fromTextStyle(style, forceStrutHeight: true);\n    }\n    return _strutStyle.inheritFromTextStyle(style);\n  }\n\n  final StrutStyle? _strutStyle;\n\n  /// {@template flutter.widgets.editableText.textAlign}\n  /// How the text should be aligned horizontally.\n  ///\n  /// Defaults to [TextAlign.start].\n  /// {@endtemplate}\n  final TextAlign textAlign;\n\n  /// {@template flutter.widgets.editableText.textDirection}\n  /// The directionality of the text.\n  ///\n  /// This decides how [textAlign] values like [TextAlign.start] and\n  /// [TextAlign.end] are interpreted.\n  ///\n  /// This is also used to disambiguate how to render bidirectional text. For\n  /// example, if the text is an English phrase followed by a Hebrew phrase,\n  /// in a [TextDirection.ltr] context the English phrase will be on the left\n  /// and the Hebrew phrase to its right, while in a [TextDirection.rtl]\n  /// context, the English phrase will be on the right and the Hebrew phrase on\n  /// its left.\n  ///\n  /// Defaults to the ambient [Directionality], if any.\n  /// {@endtemplate}\n  final TextDirection? textDirection;\n\n  /// {@template flutter.widgets.editableText.textCapitalization}\n  /// Configures how the platform keyboard will select an uppercase or\n  /// lowercase keyboard.\n  ///\n  /// Only supports text keyboards, other keyboard types will ignore this\n  /// configuration. Capitalization is locale-aware.\n  ///\n  /// Defaults to [TextCapitalization.none].\n  ///\n  /// See also:\n  ///\n  ///  * [TextCapitalization], for a description of each capitalization behavior.\n  ///\n  /// {@endtemplate}\n  final TextCapitalization textCapitalization;\n\n  /// Used to select a font when the same Unicode character can\n  /// be rendered differently, depending on the locale.\n  ///\n  /// It's rarely necessary to set this property. By default its value\n  /// is inherited from the enclosing app with `Localizations.localeOf(context)`.\n  ///\n  /// See [RenderEditable.locale] for more information.\n  final Locale? locale;\n\n  /// {@template flutter.widgets.editableText.textScaleFactor}\n  /// Deprecated. Will be removed in a future version of Flutter. Use\n  /// [textScaler] instead.\n  ///\n  /// The number of font pixels for each logical pixel.\n  ///\n  /// For example, if the text scale factor is 1.5, text will be 50% larger than\n  /// the specified font size.\n  ///\n  /// Defaults to the [MediaQueryData.textScaleFactor] obtained from the ambient\n  /// [MediaQuery], or 1.0 if there is no [MediaQuery] in scope.\n  /// {@endtemplate}\n  @Deprecated(\n    'Use textScaler instead. '\n    'Use of textScaleFactor was deprecated in preparation for the upcoming nonlinear text scaling support. '\n    'This feature was deprecated after v3.12.0-2.0.pre.',\n  )\n  final double? textScaleFactor;\n\n  /// {@macro flutter.painting.textPainter.textScaler}\n  final TextScaler? textScaler;\n\n  /// The color to use when painting the cursor.\n  final Color cursorColor;\n\n  /// The color to use when painting the autocorrection Rect.\n  ///\n  /// For [CupertinoTextField]s, the value is set to the ambient\n  /// [CupertinoThemeData.primaryColor] with 20% opacity. For [TextField]s, the\n  /// value is null on non-iOS platforms and the same color used in [CupertinoTextField]\n  /// on iOS.\n  ///\n  /// Currently the autocorrection Rect only appears on iOS.\n  ///\n  /// Defaults to null, which disables autocorrection Rect painting.\n  final Color? autocorrectionTextRectColor;\n\n  /// The color to use when painting the background cursor aligned with the text\n  /// while rendering the floating cursor.\n  ///\n  /// Typically this would be set to [CupertinoColors.inactiveGray].\n  ///\n  /// See also:\n  ///\n  ///  * [FloatingCursorDragState], which explains the floating cursor feature\n  ///    in detail.\n  final Color backgroundCursorColor;\n\n  /// {@template flutter.widgets.editableText.maxLines}\n  /// The maximum number of lines to show at one time, wrapping if necessary.\n  ///\n  /// This affects the height of the field itself and does not limit the number\n  /// of lines that can be entered into the field.\n  ///\n  /// If this is 1 (the default), the text will not wrap, but will scroll\n  /// horizontally instead.\n  ///\n  /// If this is null, there is no limit to the number of lines, and the text\n  /// container will start with enough vertical space for one line and\n  /// automatically grow to accommodate additional lines as they are entered, up\n  /// to the height of its constraints.\n  ///\n  /// If this is not null, the value must be greater than zero, and it will lock\n  /// the input to the given number of lines and take up enough horizontal space\n  /// to accommodate that number of lines. Setting [minLines] as well allows the\n  /// input to grow and shrink between the indicated range.\n  ///\n  /// The full set of behaviors possible with [minLines] and [maxLines] are as\n  /// follows. These examples apply equally to [TextField], [TextFormField],\n  /// [CupertinoTextField], and [EditableText].\n  ///\n  /// Input that occupies a single line and scrolls horizontally as needed.\n  /// ```dart\n  /// const TextField()\n  /// ```\n  ///\n  /// Input whose height grows from one line up to as many lines as needed for\n  /// the text that was entered. If a height limit is imposed by its parent, it\n  /// will scroll vertically when its height reaches that limit.\n  /// ```dart\n  /// const TextField(maxLines: null)\n  /// ```\n  ///\n  /// The input's height is large enough for the given number of lines. If\n  /// additional lines are entered the input scrolls vertically.\n  /// ```dart\n  /// const TextField(maxLines: 2)\n  /// ```\n  ///\n  /// Input whose height grows with content between a min and max. An infinite\n  /// max is possible with `maxLines: null`.\n  /// ```dart\n  /// const TextField(minLines: 2, maxLines: 4)\n  /// ```\n  ///\n  /// See also:\n  ///\n  ///  * [minLines], which sets the minimum number of lines visible.\n  /// {@endtemplate}\n  ///  * [expands], which determines whether the field should fill the height of\n  ///    its parent.\n  final int? maxLines;\n\n  /// {@template flutter.widgets.editableText.minLines}\n  /// The minimum number of lines to occupy when the content spans fewer lines.\n  ///\n  /// This affects the height of the field itself and does not limit the number\n  /// of lines that can be entered into the field.\n  ///\n  /// If this is null (default), text container starts with enough vertical space\n  /// for one line and grows to accommodate additional lines as they are entered.\n  ///\n  /// This can be used in combination with [maxLines] for a varying set of behaviors.\n  ///\n  /// If the value is set, it must be greater than zero. If the value is greater\n  /// than 1, [maxLines] should also be set to either null or greater than\n  /// this value.\n  ///\n  /// When [maxLines] is set as well, the height will grow between the indicated\n  /// range of lines. When [maxLines] is null, it will grow as high as needed,\n  /// starting from [minLines].\n  ///\n  /// A few examples of behaviors possible with [minLines] and [maxLines] are as follows.\n  /// These apply equally to [TextField], [TextFormField], [CupertinoTextField],\n  /// and [EditableText].\n  ///\n  /// Input that always occupies at least 2 lines and has an infinite max.\n  /// Expands vertically as needed.\n  /// ```dart\n  /// TextField(minLines: 2)\n  /// ```\n  ///\n  /// Input whose height starts from 2 lines and grows up to 4 lines at which\n  /// point the height limit is reached. If additional lines are entered it will\n  /// scroll vertically.\n  /// ```dart\n  /// const TextField(minLines:2, maxLines: 4)\n  /// ```\n  ///\n  /// Defaults to null.\n  ///\n  /// See also:\n  ///\n  ///  * [maxLines], which sets the maximum number of lines visible, and has\n  ///    several examples of how minLines and maxLines interact to produce\n  ///    various behaviors.\n  /// {@endtemplate}\n  ///  * [expands], which determines whether the field should fill the height of\n  ///    its parent.\n  final int? minLines;\n\n  /// {@template flutter.widgets.editableText.expands}\n  /// Whether this widget's height will be sized to fill its parent.\n  ///\n  /// If set to true and wrapped in a parent widget like [Expanded] or\n  /// [SizedBox], the input will expand to fill the parent.\n  ///\n  /// [maxLines] and [minLines] must both be null when this is set to true,\n  /// otherwise an error is thrown.\n  ///\n  /// Defaults to false.\n  ///\n  /// See the examples in [maxLines] for the complete picture of how [maxLines],\n  /// [minLines], and [expands] interact to produce various behaviors.\n  ///\n  /// Input that matches the height of its parent:\n  /// ```dart\n  /// const Expanded(\n  ///   child: TextField(maxLines: null, expands: true),\n  /// )\n  /// ```\n  /// {@endtemplate}\n  final bool expands;\n\n  /// {@template flutter.widgets.editableText.autofocus}\n  /// Whether this text field should focus itself if nothing else is already\n  /// focused.\n  ///\n  /// If true, the keyboard will open as soon as this text field obtains focus.\n  /// Otherwise, the keyboard is only shown after the user taps the text field.\n  ///\n  /// Defaults to false.\n  /// {@endtemplate}\n  // See https://github.com/flutter/flutter/issues/7035 for the rationale for this\n  // keyboard behavior.\n  final bool autofocus;\n\n  /// The color to use when painting the selection.\n  ///\n  /// If this property is null, this widget gets the selection color from the\n  /// [DefaultSelectionStyle].\n  ///\n  /// For [CupertinoTextField]s, the value is set to the ambient\n  /// [CupertinoThemeData.primaryColor] with 20% opacity. For [TextField]s, the\n  /// value is set to the ambient [TextSelectionThemeData.selectionColor].\n  final Color? selectionColor;\n\n  /// {@template flutter.widgets.editableText.selectionControls}\n  /// Optional delegate for building the text selection handles.\n  ///\n  /// Historically, this field also controlled the toolbar. This is now handled\n  /// by [contextMenuBuilder] instead. However, for backwards compatibility, when\n  /// [selectionControls] is set to an object that does not mix in\n  /// [TextSelectionHandleControls], [contextMenuBuilder] is ignored and the\n  /// [TextSelectionControls.buildToolbar] method is used instead.\n  /// {@endtemplate}\n  ///\n  /// See also:\n  ///\n  ///  * [CupertinoTextField], which wraps an [EditableText] and which shows the\n  ///    selection toolbar upon user events that are appropriate on the iOS\n  ///    platform.\n  ///  * [TextField], a Material Design themed wrapper of [EditableText], which\n  ///    shows the selection toolbar upon appropriate user events based on the\n  ///    user's platform set in [ThemeData.platform].\n  final TextSelectionControls? selectionControls;\n\n  /// {@template flutter.widgets.editableText.keyboardType}\n  /// The type of keyboard to use for editing the text.\n  ///\n  /// Defaults to [TextInputType.text] if [maxLines] is one and\n  /// [TextInputType.multiline] otherwise.\n  /// {@endtemplate}\n  final TextInputType keyboardType;\n\n  /// The type of action button to use with the soft keyboard.\n  final TextInputAction? textInputAction;\n\n  /// {@template flutter.widgets.editableText.onChanged}\n  /// Called when the user initiates a change to the TextField's\n  /// value: when they have inserted or deleted text.\n  ///\n  /// This callback doesn't run when the TextField's text is changed\n  /// programmatically, via the TextField's [controller]. Typically it\n  /// isn't necessary to be notified of such changes, since they're\n  /// initiated by the app itself.\n  ///\n  /// To be notified of all changes to the TextField's text, cursor,\n  /// and selection, one can add a listener to its [controller] with\n  /// [RichTextEditingController.addListener].\n  ///\n  /// [onChanged] is called before [onSubmitted] when user indicates completion\n  /// of editing, such as when pressing the \"done\" button on the keyboard. That\n  /// default behavior can be overridden. See [onEditingComplete] for details.\n  ///\n  /// {@tool dartpad}\n  /// This example shows how onChanged could be used to check the TextField's\n  /// current value each time the user inserts or deletes a character.\n  ///\n  /// ** See code in examples/api/lib/widgets/editable_text/editable_text.on_changed.0.dart **\n  /// {@end-tool}\n  /// {@endtemplate}\n  ///\n  /// ## Handling emojis and other complex characters\n  /// {@template flutter.widgets.EditableText.onChanged}\n  /// It's important to always use\n  /// [characters](https://pub.dev/packages/characters) when dealing with user\n  /// input text that may contain complex characters. This will ensure that\n  /// extended grapheme clusters and surrogate pairs are treated as single\n  /// characters, as they appear to the user.\n  ///\n  /// For example, when finding the length of some user input, use\n  /// `string.characters.length`. Do NOT use `string.length` or even\n  /// `string.runes.length`. For the complex character \"👨‍👩‍👦\", this\n  /// appears to the user as a single character, and `string.characters.length`\n  /// intuitively returns 1. On the other hand, `string.length` returns 8, and\n  /// `string.runes.length` returns 5!\n  /// {@endtemplate}\n  ///\n  /// See also:\n  ///\n  ///  * [inputFormatters], which are called before [onChanged]\n  ///    runs and can validate and change (\"format\") the input value.\n  ///  * [onEditingComplete], [onSubmitted], [onSelectionChanged]:\n  ///    which are more specialized input change notifications.\n  ///  * [RichTextEditingController], which implements the [Listenable] interface\n  ///    and notifies its listeners on [TextEditingValue] changes.\n  final ValueChanged<String>? onChanged;\n\n  /// {@template flutter.widgets.editableText.onEditingComplete}\n  /// Called when the user submits editable content (e.g., user presses the \"done\"\n  /// button on the keyboard).\n  ///\n  /// The default implementation of [onEditingComplete] executes 2 different\n  /// behaviors based on the situation:\n  ///\n  ///  - When a completion action is pressed, such as \"done\", \"go\", \"send\", or\n  ///    \"search\", the user's content is submitted to the [controller] and then\n  ///    focus is given up.\n  ///\n  ///  - When a non-completion action is pressed, such as \"next\" or \"previous\",\n  ///    the user's content is submitted to the [controller], but focus is not\n  ///    given up because developers may want to immediately move focus to\n  ///    another input widget within [onSubmitted].\n  ///\n  /// Providing [onEditingComplete] prevents the aforementioned default behavior.\n  /// {@endtemplate}\n  final VoidCallback? onEditingComplete;\n\n  /// {@template flutter.widgets.editableText.onSubmitted}\n  /// Called when the user indicates that they are done editing the text in the\n  /// field.\n  ///\n  /// By default, [onSubmitted] is called after [onChanged] when the user\n  /// has finalized editing; or, if the default behavior has been overridden,\n  /// after [onEditingComplete]. See [onEditingComplete] for details.\n  ///\n  /// ## Testing\n  /// The following is the recommended way to trigger [onSubmitted] in a test:\n  ///\n  /// ```dart\n  /// await tester.testTextInput.receiveAction(TextInputAction.done);\n  /// ```\n  ///\n  /// Sending a `LogicalKeyboardKey.enter` via `tester.sendKeyEvent` will not\n  /// trigger [onSubmitted]. This is because on a real device, the engine\n  /// translates the enter key to a done action, but `tester.sendKeyEvent` sends\n  /// the key to the framework only.\n  /// {@endtemplate}\n  final ValueChanged<String>? onSubmitted;\n\n  /// {@template flutter.widgets.editableText.onAppPrivateCommand}\n  /// This is used to receive a private command from the input method.\n  ///\n  /// Called when the result of [TextInputClient.performPrivateCommand] is\n  /// received.\n  ///\n  /// This can be used to provide domain-specific features that are only known\n  /// between certain input methods and their clients.\n  ///\n  /// See also:\n  ///   * [performPrivateCommand](https://developer.android.com/reference/android/view/inputmethod/InputConnection#performPrivateCommand\\(java.lang.String,%20android.os.Bundle\\)),\n  ///     which is the Android documentation for performPrivateCommand, used to\n  ///     send a command from the input method.\n  ///   * [sendAppPrivateCommand](https://developer.android.com/reference/android/view/inputmethod/InputMethodManager#sendAppPrivateCommand),\n  ///     which is the Android documentation for sendAppPrivateCommand, used to\n  ///     send a command to the input method.\n  /// {@endtemplate}\n  final AppPrivateCommandCallback? onAppPrivateCommand;\n\n  /// {@template flutter.widgets.editableText.onSelectionChanged}\n  /// Called when the user changes the selection of text (including the cursor\n  /// location).\n  /// {@endtemplate}\n  final SelectionChangedCallback? onSelectionChanged;\n\n  /// {@macro flutter.widgets.SelectionOverlay.onSelectionHandleTapped}\n  final VoidCallback? onSelectionHandleTapped;\n\n  /// {@template flutter.widgets.editableText.groupId}\n  /// The group identifier for the [TextFieldTapRegion] of this text field.\n  ///\n  /// Text fields with the same group identifier share the same tap region.\n  /// Defaults to the type of [EditableText].\n  ///\n  /// See also:\n  ///\n  ///  * [TextFieldTapRegion], to give a [groupId] to a widget that is to be\n  ///    included in a [EditableText]'s tap region that has [groupId] set.\n  /// {@endtemplate}\n  final Object groupId;\n\n  /// {@template flutter.widgets.editableText.onTapOutside}\n  /// Called for each tap down that occurs outside of the [TextFieldTapRegion]\n  /// group when the text field is focused.\n  ///\n  /// If this is null, [EditableTextTapOutsideIntent] will be invoked. In the\n  /// default implementation, [FocusNode.unfocus] will be called on the\n  /// [focusNode] for this text field when a [PointerDownEvent] is received on\n  /// another part of the UI. However, it will not unfocus as a result of mobile\n  /// application touch events (which does not include mouse clicks), to conform\n  /// with the platform conventions. To change this behavior, a callback may be\n  /// set here or [EditableTextTapOutsideIntent] may be overridden.\n  ///\n  /// When adding additional controls to a text field (for example, a spinner, a\n  /// button that copies the selected text, or modifies formatting), it is\n  /// helpful if tapping on that control doesn't unfocus the text field. In\n  /// order for an external widget to be considered as part of the text field\n  /// for the purposes of tapping \"outside\" of the field, wrap the control in a\n  /// [TextFieldTapRegion].\n  ///\n  /// The [PointerDownEvent] passed to the function is the event that caused the\n  /// notification. It is possible that the event may occur outside of the\n  /// immediate bounding box defined by the text field, although it will be\n  /// within the bounding box of a [TextFieldTapRegion] member.\n  /// {@endtemplate}\n  ///\n  /// {@tool dartpad}\n  /// This example shows how to use a `TextFieldTapRegion` to wrap a set of\n  /// \"spinner\" buttons that increment and decrement a value in the [TextField]\n  /// without causing the text field to lose keyboard focus.\n  ///\n  /// This example includes a generic `SpinnerField<T>` class that you can copy\n  /// into your own project and customize.\n  ///\n  /// ** See code in examples/api/lib/widgets/tap_region/text_field_tap_region.0.dart **\n  /// {@end-tool}\n  ///\n  /// See also:\n  ///\n  ///  * [TapRegion] for how the region group is determined.\n  ///  * [onTapUpOutside] which is called for each tap up.\n  ///  * [EditableTextTapOutsideIntent] for the intent that is invoked if\n  ///  this is null.\n  final TapRegionCallback? onTapOutside;\n\n  /// {@template flutter.widgets.editableText.onTapUpOutside}\n  /// Called for each tap up that occurs outside of the [TextFieldTapRegion]\n  /// group when the text field is focused.\n  ///\n  /// If this is null, [EditableTextTapUpOutsideIntent] will be invoked. In the\n  /// default implementation, this is a no-op. To change this behavior, set a\n  /// callback here or override [EditableTextTapUpOutsideIntent].\n  ///\n  /// The [PointerUpEvent] passed to the function is the event that caused the\n  /// notification. It is possible that the event may occur outside of the\n  /// immediate bounding box defined by the text field, although it will be\n  /// within the bounding box of a [TextFieldTapRegion] member.\n  /// {@endtemplate}\n  ///\n  /// See also:\n  ///\n  ///  * [TapRegion] for how the region group is determined.\n  ///  * [onTapOutside], which is called for each tap down.\n  ///  * [EditableTextTapOutsideIntent], the intent that is invoked if\n  ///  this is null.\n  final TapRegionUpCallback? onTapUpOutside;\n\n  /// {@template flutter.widgets.editableText.inputFormatters}\n  /// Optional input validation and formatting overrides.\n  ///\n  /// Formatters are run in the provided order when the user changes the text\n  /// this widget contains. When this parameter changes, the new formatters will\n  /// not be applied until the next time the user inserts or deletes text.\n  /// Similar to the [onChanged] callback, formatters don't run when the text is\n  /// changed programmatically via [controller].\n  ///\n  /// See also:\n  ///\n  ///  * [RichTextEditingController], which implements the [Listenable] interface\n  ///    and notifies its listeners on [TextEditingValue] changes.\n  /// {@endtemplate}\n  final List<TextInputFormatter>? inputFormatters;\n\n  /// The cursor for a mouse pointer when it enters or is hovering over the\n  /// widget.\n  ///\n  /// If this property is null, [SystemMouseCursors.text] will be used.\n  ///\n  /// The [mouseCursor] is the only property of [EditableText] that controls the\n  /// appearance of the mouse pointer. All other properties related to \"cursor\"\n  /// stands for the text cursor, which is usually a blinking vertical line at\n  /// the editing position.\n  final MouseCursor? mouseCursor;\n\n  /// Whether the caller will provide gesture handling (true), or if the\n  /// [EditableText] is expected to handle basic gestures (false).\n  ///\n  /// When this is false, the [EditableText] (or more specifically, the\n  /// [RenderEditable]) enables some rudimentary gestures (tap to position the\n  /// cursor, long-press to select all, and some scrolling behavior).\n  ///\n  /// These behaviors are sufficient for debugging purposes but are inadequate\n  /// for user-facing applications. To enable platform-specific behaviors, use a\n  /// [TextSelectionGestureDetectorBuilder] to wrap the [EditableText], and set\n  /// [rendererIgnoresPointer] to true.\n  ///\n  /// When [rendererIgnoresPointer] is true, the [RenderEditable] created\n  /// by this widget will not handle pointer events.\n  ///\n  /// This property is false by default.\n  ///\n  /// See also:\n  ///\n  ///  * [RenderEditable.ignorePointer], which implements this feature.\n  ///  * [TextSelectionGestureDetectorBuilder], which implements platform-specific\n  ///    gestures and behaviors.\n  final bool rendererIgnoresPointer;\n\n  /// {@template flutter.widgets.editableText.cursorWidth}\n  /// How thick the cursor will be.\n  ///\n  /// Defaults to 2.0.\n  ///\n  /// The cursor will draw under the text. The cursor width will extend\n  /// to the right of the boundary between characters for left-to-right text\n  /// and to the left for right-to-left text. This corresponds to extending\n  /// downstream relative to the selected position. Negative values may be used\n  /// to reverse this behavior.\n  /// {@endtemplate}\n  final double cursorWidth;\n\n  /// {@template flutter.widgets.editableText.cursorHeight}\n  /// How tall the cursor will be.\n  ///\n  /// If this property is null, [RenderEditable.preferredLineHeight] will be used.\n  /// {@endtemplate}\n  final double? cursorHeight;\n\n  /// {@template flutter.widgets.editableText.cursorRadius}\n  /// How rounded the corners of the cursor should be.\n  ///\n  /// By default, the cursor has no radius.\n  /// {@endtemplate}\n  final Radius? cursorRadius;\n\n  /// {@template flutter.widgets.editableText.cursorOpacityAnimates}\n  /// Whether the cursor will animate from fully transparent to fully opaque\n  /// during each cursor blink.\n  ///\n  /// By default, the cursor opacity will animate on iOS platforms and will not\n  /// animate on Android platforms.\n  /// {@endtemplate}\n  final bool cursorOpacityAnimates;\n\n  /// {@macro flutter.rendering.RenderEditable.cursorOffset}\n  final Offset? cursorOffset;\n\n  /// {@macro flutter.rendering.RenderEditable.paintCursorAboveText}\n  final bool paintCursorAboveText;\n\n  /// Controls how tall the selection highlight boxes are computed to be.\n  ///\n  /// See [ui.BoxHeightStyle] for details on available styles.\n  final ui.BoxHeightStyle selectionHeightStyle;\n\n  /// Controls how wide the selection highlight boxes are computed to be.\n  ///\n  /// See [ui.BoxWidthStyle] for details on available styles.\n  final ui.BoxWidthStyle selectionWidthStyle;\n\n  /// The appearance of the keyboard.\n  ///\n  /// This setting is only honored on iOS devices.\n  ///\n  /// Defaults to [Brightness.light].\n  final Brightness keyboardAppearance;\n\n  /// {@template flutter.widgets.editableText.scrollPadding}\n  /// Configures the padding for the edges surrounding a [Scrollable] when the\n  /// text field scrolls into view.\n  ///\n  /// When this widget receives focus and is not completely visible (for example\n  /// scrolled partially off the screen or overlapped by the keyboard), then it\n  /// will attempt to make itself visible by scrolling a surrounding\n  /// [Scrollable], if one is present. This value controls how far from the\n  /// edges of a [Scrollable] the TextField will be positioned after the scroll.\n  ///\n  /// Defaults to EdgeInsets.all(20.0).\n  /// {@endtemplate}\n  final EdgeInsets scrollPadding;\n\n  /// {@template flutter.widgets.editableText.enableInteractiveSelection}\n  /// Whether to enable user interface affordances for changing the\n  /// text selection.\n  ///\n  /// For example, setting this to true will enable features such as\n  /// long-pressing the TextField to select text and show the\n  /// cut/copy/paste menu, and tapping to move the text caret.\n  ///\n  /// When this is false, the text selection cannot be adjusted by\n  /// the user, the cut/copy/paste menu is hidden, and the shortcuts to\n  /// cut/copy/paste text do nothing but stop propagation of the key event\n  /// to other key event handlers in the focus chain.\n  ///\n  /// Defaults to true.\n  /// {@endtemplate}\n  final bool enableInteractiveSelection;\n\n  /// Setting this property to true makes the cursor stop blinking or fading\n  /// on and off once the cursor appears on focus. This property is useful for\n  /// testing purposes.\n  ///\n  /// It does not affect the necessity to focus the EditableText for the cursor\n  /// to appear in the first place.\n  ///\n  /// Defaults to false, resulting in a typical blinking cursor.\n  static bool debugDeterministicCursor = false;\n\n  /// {@macro flutter.widgets.scrollable.dragStartBehavior}\n  final DragStartBehavior dragStartBehavior;\n\n  /// {@template flutter.widgets.editableText.scrollController}\n  /// The [ScrollController] to use when vertically scrolling the input.\n  ///\n  /// If null, it will instantiate a new ScrollController.\n  ///\n  /// See [Scrollable.controller].\n  /// {@endtemplate}\n  final ScrollController? scrollController;\n\n  /// {@template flutter.widgets.editableText.scrollPhysics}\n  /// The [ScrollPhysics] to use when vertically scrolling the input.\n  ///\n  /// If not specified, it will behave according to the current platform.\n  ///\n  /// See [Scrollable.physics].\n  /// {@endtemplate}\n  ///\n  /// If an explicit [ScrollBehavior] is provided to [scrollBehavior], the\n  /// [ScrollPhysics] provided by that behavior will take precedence after\n  /// [scrollPhysics].\n  final ScrollPhysics? scrollPhysics;\n\n  /// {@template flutter.widgets.editableText.scribbleEnabled}\n  /// Whether iOS 14 Scribble features are enabled for this widget.\n  ///\n  /// Only available on iPads.\n  ///\n  /// Defaults to true.\n  /// {@endtemplate}\n  @Deprecated(\n    'Use `stylusHandwritingEnabled` instead. '\n    'This feature was deprecated after v3.27.0-0.2.pre.',\n  )\n  final bool scribbleEnabled;\n\n  /// {@template flutter.widgets.editableText.stylusHandwritingEnabled}\n  /// Whether this input supports stylus handwriting, where the user can write\n  /// directly on top of a field.\n  ///\n  /// Currently only the following devices are supported:\n  ///\n  ///  * iPads running iOS 14 and above using an Apple Pencil.\n  ///  * Android devices running API 34 and above and using an active stylus.\n  /// {@endtemplate}\n  ///\n  /// On Android, Scribe gestures are detected outside of [EditableText],\n  /// typically by [TextSelectionGestureDetectorBuilder]. This is handled\n  /// automatically in [TextField].\n  ///\n  /// See also:\n  ///\n  ///   * [ScribbleClient], which can be mixed into an arbitrary widget to\n  ///     provide iOS Scribble functionality.\n  ///   * [Scribe], which can be used to interact with Android Scribe directly.\n  final bool stylusHandwritingEnabled;\n\n  /// {@template flutter.widgets.editableText.selectionEnabled}\n  /// Same as [enableInteractiveSelection].\n  ///\n  /// This getter exists primarily for consistency with\n  /// [RenderEditable.selectionEnabled].\n  /// {@endtemplate}\n  bool get selectionEnabled => enableInteractiveSelection;\n\n  /// {@template flutter.widgets.editableText.selectAllOnFocus}\n  /// Whether this field should select all text when gaining focus.\n  ///\n  /// When false, focusing this text field will leave its\n  /// existing text selection unchanged.\n  ///\n  /// Defaults to true on web and desktop platforms, and false on mobile platforms.\n  /// {@endtemplate}\n  final bool selectAllOnFocus;\n\n  /// {@template flutter.widgets.editableText.autofillHints}\n  /// A list of strings that helps the autofill service identify the type of this\n  /// text input.\n  ///\n  /// When set to null, this text input will not send its autofill information\n  /// to the platform, preventing it from participating in autofills triggered\n  /// by a different [AutofillClient], even if they're in the same\n  /// [AutofillScope]. Additionally, on Android and web, setting this to null\n  /// will disable autofill for this text field.\n  ///\n  /// The minimum platform SDK version that supports Autofill is API level 26\n  /// for Android, and iOS 10.0 for iOS.\n  ///\n  /// Defaults to an empty list.\n  ///\n  /// ### Setting up iOS autofill:\n  ///\n  /// To provide the best user experience and ensure your app fully supports\n  /// password autofill on iOS, follow these steps:\n  ///\n  /// * Set up your iOS app's\n  ///   [associated domains](https://developer.apple.com/documentation/safariservices/supporting_associated_domains_in_your_app).\n  /// * Some autofill hints only work with specific [keyboardType]s. For example,\n  ///   [AutofillHints.name] requires [TextInputType.name] and [AutofillHints.email]\n  ///   works only with [TextInputType.emailAddress]. Make sure the input field has a\n  ///   compatible [keyboardType]. Empirically, [TextInputType.name] works well\n  ///   with many autofill hints that are predefined on iOS.\n  ///\n  /// ### Troubleshooting Autofill\n  ///\n  /// Autofill service providers rely heavily on [autofillHints]. Make sure the\n  /// entries in [autofillHints] are supported by the autofill service currently\n  /// in use (the name of the service can typically be found in your mobile\n  /// device's system settings).\n  ///\n  /// #### Autofill UI refuses to show up when I tap on the text field\n  ///\n  /// Check the device's system settings and make sure autofill is turned on,\n  /// and there are available credentials stored in the autofill service.\n  ///\n  /// * iOS password autofill: Go to Settings -> Password, turn on \"Autofill\n  ///   Passwords\", and add new passwords for testing by pressing the top right\n  ///   \"+\" button. Use an arbitrary \"website\" if you don't have associated\n  ///   domains set up for your app. As long as there's at least one password\n  ///   stored, you should be able to see a key-shaped icon in the quick type\n  ///   bar on the software keyboard, when a password related field is focused.\n  ///\n  /// * iOS contact information autofill: iOS seems to pull contact info from\n  ///   the Apple ID currently associated with the device. Go to Settings ->\n  ///   Apple ID (usually the first entry, or \"Sign in to your iPhone\" if you\n  ///   haven't set up one on the device), and fill out the relevant fields. If\n  ///   you wish to test more contact info types, try adding them in Contacts ->\n  ///   My Card.\n  ///\n  /// * Android autofill: Go to Settings -> System -> Languages & input ->\n  ///   Autofill service. Enable the autofill service of your choice, and make\n  ///   sure there are available credentials associated with your app.\n  ///\n  /// Specifying [InputDecoration.hintText] may also help autofill services\n  /// (like Samsung Pass) determine the expected content type of an input field,\n  /// although this is typically not required when autofillHints are present.\n  ///\n  /// #### I called `TextInput.finishAutofillContext` but the autofill save\n  /// prompt isn't showing\n  ///\n  /// * iOS: iOS may not show a prompt or any other visual indication when it\n  ///   saves user password. Go to Settings -> Password and check if your new\n  ///   password is saved. Neither saving password nor auto-generating strong\n  ///   password works without properly setting up associated domains in your\n  ///   app. To set up associated domains, follow the instructions in\n  ///   <https://developer.apple.com/documentation/safariservices/supporting_associated_domains_in_your_app>.\n  ///\n  /// {@endtemplate}\n  /// {@macro flutter.services.AutofillConfiguration.autofillHints}\n  final Iterable<String>? autofillHints;\n\n  /// The [AutofillClient] that controls this input field's autofill behavior.\n  ///\n  /// When null, this widget's [EditableTextState] will be used as the\n  /// [AutofillClient]. This property may override [autofillHints].\n  final AutofillClient? autofillClient;\n\n  /// {@macro flutter.material.Material.clipBehavior}\n  ///\n  /// Defaults to [Clip.hardEdge].\n  final Clip clipBehavior;\n\n  /// Restoration ID to save and restore the scroll offset of the\n  /// [EditableText].\n  ///\n  /// If a restoration id is provided, the [EditableText] will persist its\n  /// current scroll offset and restore it during state restoration.\n  ///\n  /// The scroll offset is persisted in a [RestorationBucket] claimed from\n  /// the surrounding [RestorationScope] using the provided restoration ID.\n  ///\n  /// Persisting and restoring the content of the [EditableText] is the\n  /// responsibility of the owner of the [controller], who may use a\n  /// [RestorableRichTextEditingController] for that purpose.\n  ///\n  /// See also:\n  ///\n  ///  * [RestorationManager], which explains how state restoration works in\n  ///    Flutter.\n  final String? restorationId;\n\n  /// {@template flutter.widgets.editableText.scrollBehavior}\n  /// A [ScrollBehavior] that will be applied to this widget individually.\n  ///\n  /// Defaults to null, wherein the inherited [ScrollBehavior] is copied and\n  /// modified to alter the viewport decoration, like [Scrollbar]s.\n  ///\n  /// [ScrollBehavior]s also provide [ScrollPhysics]. If an explicit\n  /// [ScrollPhysics] is provided in [scrollPhysics], it will take precedence,\n  /// followed by [scrollBehavior], and then the inherited ancestor\n  /// [ScrollBehavior].\n  /// {@endtemplate}\n  ///\n  /// The [ScrollBehavior] of the inherited [ScrollConfiguration] will be\n  /// modified by default to only apply a [Scrollbar] if [maxLines] is greater\n  /// than 1.\n  final ScrollBehavior? scrollBehavior;\n\n  /// {@macro flutter.services.TextInputConfiguration.enableIMEPersonalizedLearning}\n  final bool enableIMEPersonalizedLearning;\n\n  /// {@template flutter.widgets.editableText.contentInsertionConfiguration}\n  /// Configuration of handler for media content inserted via the system input\n  /// method.\n  ///\n  /// Defaults to null in which case media content insertion will be disabled,\n  /// and the system will display a message informing the user that the text field\n  /// does not support inserting media content.\n  ///\n  /// Set [ContentInsertionConfiguration.onContentInserted] to provide a handler.\n  /// Additionally, set [ContentInsertionConfiguration.allowedMimeTypes]\n  /// to limit the allowable mime types for inserted content.\n  ///\n  /// {@tool dartpad}\n  ///\n  /// This example shows how to access the data for inserted content in your\n  /// `TextField`.\n  ///\n  /// ** See code in examples/api/lib/widgets/editable_text/editable_text.on_content_inserted.0.dart **\n  /// {@end-tool}\n  ///\n  /// If [contentInsertionConfiguration] is not provided, by default\n  /// an empty list of mime types will be sent to the Flutter Engine.\n  /// A handler function must be provided in order to customize the allowable\n  /// mime types for inserted content.\n  ///\n  /// If rich content is inserted without a handler, the system will display\n  /// a message informing the user that the current text input does not support\n  /// inserting rich content.\n  /// {@endtemplate}\n  final ContentInsertionConfiguration? contentInsertionConfiguration;\n\n  /// {@template flutter.widgets.EditableText.contextMenuBuilder}\n  /// Builds the text selection toolbar when requested by the user.\n  ///\n  /// The context menu is built when [EditableTextState.showToolbar] is called,\n  /// typically by one of the callbacks installed by the widget created by\n  /// [TextSelectionGestureDetectorBuilder.buildGestureDetector]. The widget\n  /// returned by [contextMenuBuilder] is passed to a [ContextMenuController].\n  ///\n  /// If no callback is provided, no context menu will be shown.\n  ///\n  /// The [EditableTextContextMenuBuilder] signature used by the\n  /// [contextMenuBuilder] callback has two parameters, the [BuildContext] of\n  /// the [EditableText] and the [EditableTextState] of the [EditableText].\n  ///\n  /// The [EditableTextState] has two properties that are especially useful when\n  /// building the widgets for the context menu:\n  ///\n  /// * [EditableTextState.contextMenuAnchors] specifies the desired anchor\n  ///   position for the context menu.\n  ///\n  /// * [EditableTextState.contextMenuButtonItems] represents the buttons that\n  ///   should typically be built for this widget (e.g. cut, copy, paste).\n  ///\n  /// The [TextSelectionToolbarLayoutDelegate] class may be particularly useful\n  /// in honoring the preferred anchor positions.\n  ///\n  /// For backwards compatibility, when [EditableText.selectionControls] is set\n  /// to an object that does not mix in [TextSelectionHandleControls],\n  /// [contextMenuBuilder] is ignored and the\n  /// [TextSelectionControls.buildToolbar] method is used instead.\n  ///\n  /// {@tool dartpad}\n  /// This example shows how to customize the menu, in this case by keeping the\n  /// default buttons for the platform but modifying their appearance.\n  ///\n  /// ** See code in examples/api/lib/material/context_menu/editable_text_toolbar_builder.0.dart **\n  /// {@end-tool}\n  ///\n  /// {@tool dartpad}\n  /// This example shows how to show a custom button only when an email address\n  /// is currently selected.\n  ///\n  /// ** See code in examples/api/lib/material/context_menu/editable_text_toolbar_builder.1.dart **\n  /// {@end-tool}\n  ///\n  /// See also:\n  ///   * [AdaptiveTextSelectionToolbar], which builds the default text selection\n  ///     toolbar for the current platform, but allows customization of the\n  ///     buttons.\n  ///   * [AdaptiveTextSelectionToolbar.getAdaptiveButtons], which builds the\n  ///     button Widgets for the current platform given\n  ///     [ContextMenuButtonItem]s.\n  ///   * [BrowserContextMenu], which allows the browser's context menu on web\n  ///     to be disabled and Flutter-rendered context menus to appear.\n  /// {@endtemplate}\n  final EditableTextContextMenuBuilder? contextMenuBuilder;\n\n  /// {@template flutter.widgets.EditableText.spellCheckConfiguration}\n  /// Configuration that details how spell check should be performed.\n  ///\n  /// Specifies the [SpellCheckService] used to spell check text input and the\n  /// [TextStyle] used to style text with misspelled words.\n  ///\n  /// If the [SpellCheckService] is left null, spell check is disabled by\n  /// default unless the [DefaultSpellCheckService] is supported, in which case\n  /// it is used. It is currently supported only on Android and iOS.\n  ///\n  /// If this configuration is left null, then spell check is disabled by default.\n  /// {@endtemplate}\n  final SpellCheckConfiguration? spellCheckConfiguration;\n\n  /// The configuration for the magnifier to use with selections in this text\n  /// field.\n  ///\n  /// {@macro flutter.widgets.magnifier.intro}\n  final TextMagnifierConfiguration magnifierConfiguration;\n\n  /// {@macro flutter.services.TextInputConfiguration.hintLocales}\n  final List<Locale>? hintLocales;\n\n  /// The default value for [selectionHeightStyle].\n  ///\n  /// On web platforms, this defaults to [ui.BoxHeightStyle.max].\n  ///\n  /// On native platforms, this defaults to [ui.BoxHeightStyle.includeLineSpacingMiddle] for all\n  /// platforms.\n  static ui.BoxHeightStyle get defaultSelectionHeightStyle {\n    if (kIsWeb) {\n      return ui.BoxHeightStyle.max;\n    }\n    return ui.BoxHeightStyle.includeLineSpacingMiddle;\n  }\n\n  /// The default value for [selectionWidthStyle].\n  ///\n  /// On web platforms, this defaults to [ui.BoxWidthStyle.max] for Apple platforms running\n  /// Safari (webkit) based browsers and [ui.BoxWidthStyle.tight] for all others.\n  ///\n  /// On non-web platforms, this defaults to [ui.BoxWidthStyle.max].\n  static ui.BoxWidthStyle get defaultSelectionWidthStyle {\n    // if (kIsWeb) {\n    //   if (defaultTargetPlatform == TargetPlatform.iOS ||\n    //       WebBrowserDetection.isSafari) {\n    //     // On macOS web, the selection width behavior differs when running on\n    //     // Chrom(e|ium) (blink) or Safari (webkit).\n    //     return ui.BoxWidthStyle.max;\n    //   }\n    //   return ui.BoxWidthStyle.tight;\n    // }\n    return ui.BoxWidthStyle.max;\n  }\n\n  /// The default value for [stylusHandwritingEnabled].\n  static const bool defaultStylusHandwritingEnabled = true;\n\n  bool get _userSelectionEnabled =>\n      enableInteractiveSelection && (!readOnly || !obscureText);\n\n  /// The default value for [selectAllOnFocus].\n  static bool get _defaultSelectAllOnFocus {\n    if (kIsWeb) {\n      return true;\n    }\n    return switch (defaultTargetPlatform) {\n      TargetPlatform.android => false,\n      TargetPlatform.iOS => false,\n      TargetPlatform.fuchsia => false,\n      TargetPlatform.linux => true,\n      TargetPlatform.macOS => true,\n      TargetPlatform.windows => true,\n    };\n  }\n\n  /// Returns the [ContextMenuButtonItem]s representing the buttons in this\n  /// platform's default selection menu for an editable field.\n  ///\n  /// For example, [EditableText] uses this to generate the default buttons for\n  /// its context menu.\n  ///\n  /// See also:\n  ///\n  /// * [EditableTextState.contextMenuButtonItems], which gives the\n  ///   [ContextMenuButtonItem]s for a specific EditableText.\n  /// * [SelectableRegion.getSelectableButtonItems], which performs a similar\n  ///   role but for content that is selectable but not editable.\n  /// * [AdaptiveTextSelectionToolbar], which builds the toolbar itself, and can\n  ///   take a list of [ContextMenuButtonItem]s with\n  ///   [AdaptiveTextSelectionToolbar.buttonItems].\n  /// * [AdaptiveTextSelectionToolbar.getAdaptiveButtons], which builds the button\n  ///   Widgets for the current platform given [ContextMenuButtonItem]s.\n  static List<ContextMenuButtonItem> getEditableButtonItems({\n    required final ClipboardStatus? clipboardStatus,\n    required final VoidCallback? onCopy,\n    required final VoidCallback? onCut,\n    required final VoidCallback? onPaste,\n    required final VoidCallback? onSelectAll,\n    required final VoidCallback? onLookUp,\n    required final VoidCallback? onSearchWeb,\n    required final VoidCallback? onShare,\n    required final VoidCallback? onLiveTextInput,\n  }) {\n    final resultButtonItem = <ContextMenuButtonItem>[];\n\n    // Configure button items with clipboard.\n    if (onPaste == null || clipboardStatus != ClipboardStatus.unknown) {\n      // If the paste button is enabled, don't render anything until the state\n      // of the clipboard is known, since it's used to determine if paste is\n      // shown.\n\n      // On Android, the share button is before the select all button.\n      final showShareBeforeSelectAll =\n          defaultTargetPlatform == TargetPlatform.android;\n\n      resultButtonItem.addAll(<ContextMenuButtonItem>[\n        if (onCut != null)\n          ContextMenuButtonItem(\n            onPressed: onCut,\n            type: ContextMenuButtonType.cut,\n          ),\n        if (onCopy != null)\n          ContextMenuButtonItem(\n            onPressed: onCopy,\n            type: ContextMenuButtonType.copy,\n          ),\n        if (onPaste != null)\n          ContextMenuButtonItem(\n            onPressed: onPaste,\n            type: ContextMenuButtonType.paste,\n          ),\n        if (onShare != null && showShareBeforeSelectAll)\n          ContextMenuButtonItem(\n            onPressed: onShare,\n            type: ContextMenuButtonType.share,\n          ),\n        if (onSelectAll != null)\n          ContextMenuButtonItem(\n            onPressed: onSelectAll,\n            type: ContextMenuButtonType.selectAll,\n          ),\n        if (onLookUp != null)\n          ContextMenuButtonItem(\n            onPressed: onLookUp,\n            type: ContextMenuButtonType.lookUp,\n          ),\n        if (onSearchWeb != null)\n          ContextMenuButtonItem(\n            onPressed: onSearchWeb,\n            type: ContextMenuButtonType.searchWeb,\n          ),\n        if (onShare != null && !showShareBeforeSelectAll)\n          ContextMenuButtonItem(\n            onPressed: onShare,\n            type: ContextMenuButtonType.share,\n          ),\n      ]);\n    }\n\n    // Config button items with Live Text.\n    if (onLiveTextInput != null) {\n      resultButtonItem.add(\n        ContextMenuButtonItem(\n          onPressed: onLiveTextInput,\n          type: ContextMenuButtonType.liveTextInput,\n        ),\n      );\n    }\n\n    return resultButtonItem;\n  }\n\n  // Infer the value of autocorrect from autofillHints.\n  static bool _inferAutocorrect({required Iterable<String>? autofillHints}) {\n    if (autofillHints == null || autofillHints.isEmpty || kIsWeb) {\n      return true;\n    }\n\n    switch (defaultTargetPlatform) {\n      case TargetPlatform.iOS:\n        // username, password and newPassword are password related hint.\n        // newUsername is not supported on iOS.\n        final bool passwordRelatedHint = autofillHints.any(\n          (String hint) =>\n              hint == AutofillHints.username ||\n              hint == AutofillHints.password ||\n              hint == AutofillHints.newPassword,\n        );\n        if (passwordRelatedHint) {\n          // https://github.com/flutter/flutter/issues/134723\n          // Set autocorrect to false to prevent password bar from flashing.\n          return false;\n        }\n      case TargetPlatform.macOS:\n      case TargetPlatform.android:\n      case TargetPlatform.fuchsia:\n      case TargetPlatform.linux:\n      case TargetPlatform.windows:\n        break;\n    }\n\n    return true;\n  }\n\n  // Infer the keyboard type of an `EditableText` if it's not specified.\n  static TextInputType _inferKeyboardType({\n    required Iterable<String>? autofillHints,\n    required int? maxLines,\n  }) {\n    if (autofillHints == null || autofillHints.isEmpty) {\n      return maxLines == 1 ? TextInputType.text : TextInputType.multiline;\n    }\n\n    final String effectiveHint = autofillHints.first;\n\n    // On iOS oftentimes specifying a text content type is not enough to qualify\n    // the input field for autofill. The keyboard type also needs to be compatible\n    // with the content type. To get autofill to work by default on EditableText,\n    // the keyboard type inference on iOS is done differently from other platforms.\n    //\n    // The entries with \"autofill not working\" comments are the iOS text content\n    // types that should work with the specified keyboard type but won't trigger\n    // (even within a native app). Tested on iOS 13.5.\n    if (!kIsWeb) {\n      switch (defaultTargetPlatform) {\n        case TargetPlatform.iOS:\n        case TargetPlatform.macOS:\n          const iOSKeyboardType = <String, TextInputType>{\n            AutofillHints.addressCity: TextInputType.name,\n            AutofillHints.addressCityAndState:\n                TextInputType.name, // Autofill not working.\n            AutofillHints.addressState: TextInputType.name,\n            AutofillHints.countryName: TextInputType.name,\n            AutofillHints.creditCardNumber:\n                TextInputType.number, // Couldn't test.\n            AutofillHints.email: TextInputType.emailAddress,\n            AutofillHints.familyName: TextInputType.name,\n            AutofillHints.fullStreetAddress: TextInputType.name,\n            AutofillHints.givenName: TextInputType.name,\n            AutofillHints.jobTitle: TextInputType.name, // Autofill not working.\n            AutofillHints.location: TextInputType.name, // Autofill not working.\n            AutofillHints.middleName:\n                TextInputType.name, // Autofill not working.\n            AutofillHints.name: TextInputType.name,\n            AutofillHints.namePrefix:\n                TextInputType.name, // Autofill not working.\n            AutofillHints.nameSuffix:\n                TextInputType.name, // Autofill not working.\n            AutofillHints.newPassword: TextInputType.text,\n            AutofillHints.newUsername: TextInputType.text,\n            AutofillHints.nickname: TextInputType.name, // Autofill not working.\n            AutofillHints.oneTimeCode: TextInputType.number,\n            AutofillHints.organizationName:\n                TextInputType.text, // Autofill not working.\n            AutofillHints.password: TextInputType.text,\n            AutofillHints.postalCode: TextInputType.name,\n            AutofillHints.streetAddressLine1: TextInputType.name,\n            AutofillHints.streetAddressLine2:\n                TextInputType.name, // Autofill not working.\n            AutofillHints.sublocality:\n                TextInputType.name, // Autofill not working.\n            AutofillHints.telephoneNumber: TextInputType.name,\n            AutofillHints.url: TextInputType.url, // Autofill not working.\n            AutofillHints.username: TextInputType.text,\n          };\n\n          final TextInputType? keyboardType = iOSKeyboardType[effectiveHint];\n          if (keyboardType != null) {\n            return keyboardType;\n          }\n        case TargetPlatform.android:\n        case TargetPlatform.fuchsia:\n        case TargetPlatform.linux:\n        case TargetPlatform.windows:\n          break;\n      }\n    }\n\n    if (maxLines != 1) {\n      return TextInputType.multiline;\n    }\n\n    const inferKeyboardType = <String, TextInputType>{\n      AutofillHints.addressCity: TextInputType.streetAddress,\n      AutofillHints.addressCityAndState: TextInputType.streetAddress,\n      AutofillHints.addressState: TextInputType.streetAddress,\n      AutofillHints.birthday: TextInputType.datetime,\n      AutofillHints.birthdayDay: TextInputType.datetime,\n      AutofillHints.birthdayMonth: TextInputType.datetime,\n      AutofillHints.birthdayYear: TextInputType.datetime,\n      AutofillHints.countryCode: TextInputType.number,\n      AutofillHints.countryName: TextInputType.text,\n      AutofillHints.creditCardExpirationDate: TextInputType.datetime,\n      AutofillHints.creditCardExpirationDay: TextInputType.datetime,\n      AutofillHints.creditCardExpirationMonth: TextInputType.datetime,\n      AutofillHints.creditCardExpirationYear: TextInputType.datetime,\n      AutofillHints.creditCardFamilyName: TextInputType.name,\n      AutofillHints.creditCardGivenName: TextInputType.name,\n      AutofillHints.creditCardMiddleName: TextInputType.name,\n      AutofillHints.creditCardName: TextInputType.name,\n      AutofillHints.creditCardNumber: TextInputType.number,\n      AutofillHints.creditCardSecurityCode: TextInputType.number,\n      AutofillHints.creditCardType: TextInputType.text,\n      AutofillHints.email: TextInputType.emailAddress,\n      AutofillHints.familyName: TextInputType.name,\n      AutofillHints.fullStreetAddress: TextInputType.streetAddress,\n      AutofillHints.gender: TextInputType.text,\n      AutofillHints.givenName: TextInputType.name,\n      AutofillHints.impp: TextInputType.url,\n      AutofillHints.jobTitle: TextInputType.text,\n      AutofillHints.language: TextInputType.text,\n      AutofillHints.location: TextInputType.streetAddress,\n      AutofillHints.middleInitial: TextInputType.name,\n      AutofillHints.middleName: TextInputType.name,\n      AutofillHints.name: TextInputType.name,\n      AutofillHints.namePrefix: TextInputType.name,\n      AutofillHints.nameSuffix: TextInputType.name,\n      AutofillHints.newPassword: TextInputType.text,\n      AutofillHints.newUsername: TextInputType.text,\n      AutofillHints.nickname: TextInputType.text,\n      AutofillHints.oneTimeCode: TextInputType.text,\n      AutofillHints.organizationName: TextInputType.text,\n      AutofillHints.password: TextInputType.text,\n      AutofillHints.photo: TextInputType.text,\n      AutofillHints.postalAddress: TextInputType.streetAddress,\n      AutofillHints.postalAddressExtended: TextInputType.streetAddress,\n      AutofillHints.postalAddressExtendedPostalCode: TextInputType.number,\n      AutofillHints.postalCode: TextInputType.number,\n      AutofillHints.streetAddressLevel1: TextInputType.streetAddress,\n      AutofillHints.streetAddressLevel2: TextInputType.streetAddress,\n      AutofillHints.streetAddressLevel3: TextInputType.streetAddress,\n      AutofillHints.streetAddressLevel4: TextInputType.streetAddress,\n      AutofillHints.streetAddressLine1: TextInputType.streetAddress,\n      AutofillHints.streetAddressLine2: TextInputType.streetAddress,\n      AutofillHints.streetAddressLine3: TextInputType.streetAddress,\n      AutofillHints.sublocality: TextInputType.streetAddress,\n      AutofillHints.telephoneNumber: TextInputType.phone,\n      AutofillHints.telephoneNumberAreaCode: TextInputType.phone,\n      AutofillHints.telephoneNumberCountryCode: TextInputType.phone,\n      AutofillHints.telephoneNumberDevice: TextInputType.phone,\n      AutofillHints.telephoneNumberExtension: TextInputType.phone,\n      AutofillHints.telephoneNumberLocal: TextInputType.phone,\n      AutofillHints.telephoneNumberLocalPrefix: TextInputType.phone,\n      AutofillHints.telephoneNumberLocalSuffix: TextInputType.phone,\n      AutofillHints.telephoneNumberNational: TextInputType.phone,\n      AutofillHints.transactionAmount: TextInputType.numberWithOptions(\n        decimal: true,\n      ),\n      AutofillHints.transactionCurrency: TextInputType.text,\n      AutofillHints.url: TextInputType.url,\n      AutofillHints.username: TextInputType.text,\n    };\n\n    return inferKeyboardType[effectiveHint] ?? TextInputType.text;\n  }\n\n  @override\n  EditableTextState createState() => EditableTextState();\n\n  @override\n  void debugFillProperties(DiagnosticPropertiesBuilder properties) {\n    super.debugFillProperties(properties);\n    properties\n      ..add(\n        DiagnosticsProperty<RichTextEditingController>(\n          'controller',\n          controller,\n        ),\n      )\n      ..add(DiagnosticsProperty<FocusNode>('focusNode', focusNode))\n      ..add(\n        DiagnosticsProperty<bool>(\n          'obscureText',\n          obscureText,\n          defaultValue: false,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<bool>('readOnly', readOnly, defaultValue: false),\n      )\n      ..add(\n        DiagnosticsProperty<bool>(\n          'autocorrect',\n          autocorrect,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        EnumProperty<SmartDashesType>(\n          'smartDashesType',\n          smartDashesType,\n          defaultValue: obscureText\n              ? SmartDashesType.disabled\n              : SmartDashesType.enabled,\n        ),\n      )\n      ..add(\n        EnumProperty<SmartQuotesType>(\n          'smartQuotesType',\n          smartQuotesType,\n          defaultValue: obscureText\n              ? SmartQuotesType.disabled\n              : SmartQuotesType.enabled,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<bool>(\n          'enableSuggestions',\n          enableSuggestions,\n          defaultValue: true,\n        ),\n      );\n    style.debugFillProperties(properties);\n    properties\n      ..add(\n        EnumProperty<TextAlign>('textAlign', textAlign, defaultValue: null),\n      )\n      ..add(\n        EnumProperty<TextDirection>(\n          'textDirection',\n          textDirection,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<Locale>('locale', locale, defaultValue: null),\n      )\n      ..add(\n        DiagnosticsProperty<TextScaler>(\n          'textScaler',\n          textScaler,\n          defaultValue: null,\n        ),\n      )\n      ..add(IntProperty('maxLines', maxLines, defaultValue: 1))\n      ..add(IntProperty('minLines', minLines, defaultValue: null))\n      ..add(\n        DiagnosticsProperty<bool>('expands', expands, defaultValue: false),\n      )\n      ..add(\n        DiagnosticsProperty<bool>('autofocus', autofocus, defaultValue: false),\n      )\n      ..add(\n        DiagnosticsProperty<TextInputType>(\n          'keyboardType',\n          keyboardType,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<ScrollController>(\n          'scrollController',\n          scrollController,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<ScrollPhysics>(\n          'scrollPhysics',\n          scrollPhysics,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<Iterable<String>>(\n          'autofillHints',\n          autofillHints,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<TextHeightBehavior>(\n          'textHeightBehavior',\n          textHeightBehavior,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<bool>(\n          'scribbleEnabled',\n          scribbleEnabled,\n          defaultValue: true,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<bool>(\n          'stylusHandwritingEnabled',\n          stylusHandwritingEnabled,\n          defaultValue: defaultStylusHandwritingEnabled,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<bool>(\n          'enableIMEPersonalizedLearning',\n          enableIMEPersonalizedLearning,\n          defaultValue: true,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<bool>(\n          'enableInteractiveSelection',\n          enableInteractiveSelection,\n          defaultValue: true,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<SpellCheckConfiguration>(\n          'spellCheckConfiguration',\n          spellCheckConfiguration,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<List<String>>(\n          'contentCommitMimeTypes',\n          contentInsertionConfiguration?.allowedMimeTypes ?? const <String>[],\n          defaultValue: contentInsertionConfiguration == null\n              ? const <String>[]\n              : kDefaultContentInsertionMimeTypes,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<List<Locale>?>(\n          'hintLocales',\n          hintLocales,\n          defaultValue: null,\n        ),\n      );\n  }\n}\n\n/// State for an [EditableText].\nclass EditableTextState extends State<EditableText>\n    with\n        AutomaticKeepAliveClientMixin<EditableText>,\n        WidgetsBindingObserver,\n        TickerProviderStateMixin<EditableText>,\n        TextSelectionDelegate,\n        TextInputClient,\n        DeltaTextInputClient\n    implements AutofillClient {\n  Timer? _cursorTimer;\n  AnimationController get _cursorBlinkOpacityController {\n    return _backingCursorBlinkOpacityController ??= AnimationController(\n      vsync: this,\n    )..addListener(_onCursorColorTick);\n  }\n\n  AnimationController? _backingCursorBlinkOpacityController;\n  late final Simulation _iosBlinkCursorSimulation =\n      _DiscreteKeyFrameSimulation.iOSBlinkingCaret();\n\n  final ValueNotifier<bool> _cursorVisibilityNotifier = ValueNotifier<bool>(\n    true,\n  );\n  final GlobalKey _editableKey = GlobalKey();\n\n  /// Detects whether the clipboard can paste.\n  final ClipboardStatusNotifier clipboardStatus = kIsWeb\n      // Web browsers will show a permission dialog when Clipboard.hasStrings is\n      // called. In an EditableText, this will happen before the paste button is\n      // clicked, often before the context menu is even shown. To avoid this\n      // poor user experience, always show the paste button on web.\n      ? _WebClipboardStatusNotifier()\n      : ClipboardStatusNotifier();\n\n  /// Detects whether the Live Text input is enabled.\n  ///\n  /// See also:\n  ///  * [LiveText], where the availability of Live Text input can be obtained.\n  final LiveTextInputStatusNotifier? _liveTextInputStatus = kIsWeb\n      ? null\n      : LiveTextInputStatusNotifier();\n\n  TextInputConnection? _textInputConnection;\n  bool get _hasInputConnection => _textInputConnection?.attached ?? false;\n\n  TextSelectionOverlay? _selectionOverlay;\n  ScrollNotificationObserverState? _scrollNotificationObserver;\n  ({TextEditingValue value, Rect selectionBounds})?\n  _dataWhenToolbarShowScheduled;\n  bool _listeningToScrollNotificationObserver = false;\n\n  bool get _webContextMenuEnabled => kIsWeb && BrowserContextMenu.enabled;\n\n  final GlobalKey _scrollableKey = GlobalKey();\n  ScrollController? _internalScrollController;\n  ScrollController get _scrollController =>\n      widget.scrollController ??\n      (_internalScrollController ??= ScrollController());\n\n  final LayerLink _toolbarLayerLink = LayerLink();\n  final LayerLink _startHandleLayerLink = LayerLink();\n  final LayerLink _endHandleLayerLink = LayerLink();\n\n  bool _didAutoFocus = false;\n\n  AutofillGroupState? _currentAutofillScope;\n  @override\n  AutofillScope? get currentAutofillScope => _currentAutofillScope;\n\n  AutofillClient get _effectiveAutofillClient => widget.autofillClient ?? this;\n\n  late SpellCheckConfiguration _spellCheckConfiguration;\n  late TextStyle _style;\n\n  /// Configuration that determines how spell check will be performed.\n  ///\n  /// If possible, this configuration will contain a default for the\n  /// [SpellCheckService] if it is not otherwise specified.\n  ///\n  /// See also:\n  ///  * [DefaultSpellCheckService], the spell check service used by default.\n  @visibleForTesting\n  SpellCheckConfiguration get spellCheckConfiguration =>\n      _spellCheckConfiguration;\n\n  /// Whether or not spell check is enabled.\n  ///\n  /// Spell check is enabled when a [SpellCheckConfiguration] has been specified\n  /// for the widget.\n  bool get spellCheckEnabled => _spellCheckConfiguration.spellCheckEnabled;\n\n  /// The most up-to-date spell check results for text input.\n  ///\n  /// These results will be updated via calls to spell check through a\n  /// [SpellCheckService] and used by this widget to build the [TextSpan] tree\n  /// for text input and menus for replacement suggestions of misspelled words.\n  SpellCheckResults? spellCheckResults;\n\n  bool get _spellCheckResultsReceived =>\n      spellCheckEnabled &&\n      spellCheckResults != null &&\n      spellCheckResults!.suggestionSpans.isNotEmpty;\n\n  /// The text processing service used to retrieve the native text processing actions.\n  final ProcessTextService _processTextService = DefaultProcessTextService();\n\n  /// The list of native text processing actions provided by the engine.\n  final List<ProcessTextAction> _processTextActions = <ProcessTextAction>[];\n\n  /// Whether to create an input connection with the platform for text editing\n  /// or not.\n  ///\n  /// Read-only input fields do not need a connection with the platform since\n  /// there's no need for text editing capabilities (e.g. virtual keyboard).\n  ///\n  /// On macOS, most of the selection and focus related shortcuts require a\n  /// connection with the platform because appropriate platform selectors are\n  /// sent from the engine and translated into intents. For read-only fields\n  /// those shortcuts should be available (for instance to allow tab traversal).\n  ///\n  /// On the web, we always need a connection because we want some browser\n  /// functionalities to continue to work on read-only input fields like:\n  /// - Relevant context menu.\n  /// - cmd/ctrl+c shortcut to copy.\n  /// - cmd/ctrl+a to select all.\n  /// - Changing the selection using a physical keyboard.\n  bool get _shouldCreateInputConnection =>\n      kIsWeb ||\n      defaultTargetPlatform == TargetPlatform.macOS ||\n      !widget.readOnly;\n\n  // The time it takes for the floating cursor to snap to the text aligned\n  // cursor position after the user has finished placing it.\n  static const Duration _floatingCursorResetTime = Duration(milliseconds: 125);\n\n  AnimationController? _floatingCursorResetController;\n\n  Orientation? _lastOrientation;\n\n  bool get _stylusHandwritingEnabled {\n    // During the deprecation period, respect scribbleEnabled being explicitly\n    // set.\n    if (!widget.scribbleEnabled) {\n      return widget.scribbleEnabled;\n    }\n    return widget.stylusHandwritingEnabled;\n  }\n\n  late final AppLifecycleListener _appLifecycleListener;\n  bool _justResumed = false;\n\n  @override\n  bool get wantKeepAlive => widget.focusNode.hasFocus;\n\n  Color get _cursorColor {\n    final double effectiveOpacity = math.min(\n      widget.cursorColor.alpha / 255.0,\n      _cursorBlinkOpacityController.value,\n    );\n    return widget.cursorColor.withValues(alpha: effectiveOpacity);\n  }\n\n  @override\n  bool get cutEnabled {\n    if (widget.selectionControls is! TextSelectionHandleControls) {\n      return widget.toolbarOptions.cut &&\n          !widget.readOnly &&\n          !widget.obscureText;\n    }\n    return !widget.readOnly &&\n        !widget.obscureText &&\n        !textEditingValue.selection.isCollapsed;\n  }\n\n  @override\n  bool get copyEnabled {\n    if (widget.selectionControls is! TextSelectionHandleControls) {\n      return widget.toolbarOptions.copy && !widget.obscureText;\n    }\n    return !widget.obscureText && !textEditingValue.selection.isCollapsed;\n  }\n\n  @override\n  bool get pasteEnabled {\n    if (widget.selectionControls is! TextSelectionHandleControls) {\n      return widget.toolbarOptions.paste && !widget.readOnly;\n    }\n    return !widget.readOnly &&\n        (clipboardStatus.value == ClipboardStatus.pasteable);\n  }\n\n  @override\n  bool get selectAllEnabled {\n    if (widget.selectionControls is! TextSelectionHandleControls) {\n      return widget.toolbarOptions.selectAll &&\n          (!widget.readOnly || !widget.obscureText) &&\n          widget.enableInteractiveSelection;\n    }\n\n    if (!widget.enableInteractiveSelection ||\n        (widget.readOnly && widget.obscureText)) {\n      return false;\n    }\n\n    switch (defaultTargetPlatform) {\n      case TargetPlatform.macOS:\n        return false;\n      case TargetPlatform.iOS:\n        return textEditingValue.text.isNotEmpty &&\n            textEditingValue.selection.isCollapsed;\n      case TargetPlatform.android:\n      case TargetPlatform.fuchsia:\n      case TargetPlatform.linux:\n      case TargetPlatform.windows:\n        return textEditingValue.text.isNotEmpty &&\n            !(textEditingValue.selection.start == 0 &&\n                textEditingValue.selection.end == textEditingValue.text.length);\n    }\n  }\n\n  @override\n  bool get lookUpEnabled {\n    if (defaultTargetPlatform != TargetPlatform.iOS) {\n      return false;\n    }\n    return !widget.obscureText &&\n        !textEditingValue.selection.isCollapsed &&\n        textEditingValue.selection.textInside(textEditingValue.text).trim() !=\n            '';\n  }\n\n  @override\n  bool get searchWebEnabled {\n    if (defaultTargetPlatform != TargetPlatform.iOS) {\n      return false;\n    }\n\n    return !widget.obscureText &&\n        !textEditingValue.selection.isCollapsed &&\n        textEditingValue.selection.textInside(textEditingValue.text).trim() !=\n            '';\n  }\n\n  @override\n  bool get shareEnabled {\n    switch (defaultTargetPlatform) {\n      case TargetPlatform.android:\n      case TargetPlatform.iOS:\n        return !widget.obscureText &&\n            !textEditingValue.selection.isCollapsed &&\n            textEditingValue.selection\n                    .textInside(textEditingValue.text)\n                    .trim() !=\n                '';\n      case TargetPlatform.macOS:\n      case TargetPlatform.fuchsia:\n      case TargetPlatform.linux:\n      case TargetPlatform.windows:\n        return false;\n    }\n  }\n\n  @override\n  bool get liveTextInputEnabled {\n    return _liveTextInputStatus?.value == LiveTextInputStatus.enabled &&\n        !widget.obscureText &&\n        !widget.readOnly &&\n        textEditingValue.selection.isCollapsed;\n  }\n\n  void _onChangedClipboardStatus() {\n    setState(() {\n      // Inform the widget that the value of clipboardStatus has changed.\n    });\n  }\n\n  void _onChangedLiveTextInputStatus() {\n    setState(() {\n      // Inform the widget that the value of liveTextInputStatus has changed.\n    });\n  }\n\n  TextEditingValue get _textEditingValueforTextLayoutMetrics {\n    final Widget? editableWidget = _editableKey.currentContext?.widget;\n    if (editableWidget is! _Editable) {\n      throw StateError('_Editable must be mounted.');\n    }\n    return editableWidget.value;\n  }\n\n  /// Copy current selection to [Clipboard].\n  @override\n  void copySelection(SelectionChangedCause cause) {\n    final TextSelection selection = textEditingValue.selection;\n    if (selection.isCollapsed || widget.obscureText) {\n      return;\n    }\n    // bggRGjQaUbCoE copySelection\n    final String text =\n        widget.controller.getSelectionText(selection) ??\n        selection.textInside(textEditingValue.text);\n    Clipboard.setData(ClipboardData(text: text));\n    if (cause == SelectionChangedCause.toolbar) {\n      bringIntoView(textEditingValue.selection.extent);\n      hideToolbar(false);\n\n      switch (defaultTargetPlatform) {\n        case TargetPlatform.iOS:\n        case TargetPlatform.macOS:\n        case TargetPlatform.linux:\n        case TargetPlatform.windows:\n          break;\n        case TargetPlatform.android:\n        case TargetPlatform.fuchsia:\n          // Collapse the selection and hide the toolbar and handles.\n          userUpdateTextEditingValue(\n            TextEditingValue(\n              text: textEditingValue.text,\n              selection: TextSelection.collapsed(\n                offset: textEditingValue.selection.end,\n              ),\n            ),\n            SelectionChangedCause.toolbar,\n          );\n      }\n    }\n    clipboardStatus.update();\n  }\n\n  /// Cut current selection to [Clipboard].\n  @override\n  void cutSelection(SelectionChangedCause cause) {\n    if (widget.readOnly || widget.obscureText) {\n      return;\n    }\n    final TextSelection selection = textEditingValue.selection;\n    if (selection.isCollapsed) {\n      return;\n    }\n    // bggRGjQaUbCoE cutSelection\n    final String text =\n        widget.controller.getSelectionText(selection) ??\n        selection.textInside(textEditingValue.text);\n    Clipboard.setData(ClipboardData(text: text));\n    _replaceText(ReplaceTextIntent(textEditingValue, '', selection, cause));\n    if (cause == SelectionChangedCause.toolbar) {\n      // Schedule a call to bringIntoView() after renderEditable updates.\n      SchedulerBinding.instance.addPostFrameCallback((_) {\n        if (mounted) {\n          bringIntoView(textEditingValue.selection.extent);\n        }\n      }, debugLabel: 'EditableText.bringSelectionIntoView');\n      hideToolbar();\n    }\n    clipboardStatus.update();\n  }\n\n  bool get _allowPaste {\n    return !widget.readOnly && textEditingValue.selection.isValid;\n  }\n\n  /// Paste text from [Clipboard].\n  @override\n  Future<void> pasteText(SelectionChangedCause cause) async {\n    if (!_allowPaste) {\n      return;\n    }\n    // Snapshot the input before using `await`.\n    // See https://github.com/flutter/flutter/issues/11427\n    final ClipboardData? data = await Clipboard.getData(Clipboard.kTextPlain);\n    if (data == null) {\n      return;\n    }\n    _pasteText(cause, data.text!);\n  }\n\n  void _pasteText(SelectionChangedCause cause, String text) {\n    if (!_allowPaste) {\n      return;\n    }\n\n    // After the paste, the cursor should be collapsed and located after the\n    // pasted content.\n    final TextSelection selection = textEditingValue.selection;\n    final int lastSelectionIndex = math.max(\n      selection.baseOffset,\n      selection.extentOffset,\n    );\n    // bggRGjQaUbCoE _pasteText\n    widget.controller.syncRichText(\n      selection.isCollapsed\n          ? TextEditingDeltaInsertion(\n              oldText: textEditingValue.text,\n              textInserted: text,\n              insertionOffset: selection.baseOffset,\n              selection: TextSelection.collapsed(offset: lastSelectionIndex),\n              composing: TextRange.empty,\n            )\n          : TextEditingDeltaReplacement(\n              oldText: textEditingValue.text,\n              replacementText: text,\n              replacedRange: selection,\n              selection: TextSelection.collapsed(offset: lastSelectionIndex),\n              composing: TextRange.empty,\n            ),\n    );\n    final newValue = _value.copyWith(\n      text: widget.controller.plainText,\n      selection: widget.controller.newSelection,\n      composing: TextRange.empty,\n    );\n    userUpdateTextEditingValue(newValue, cause);\n    if (cause == SelectionChangedCause.toolbar) {\n      // Schedule a call to bringIntoView() after renderEditable updates.\n      SchedulerBinding.instance.addPostFrameCallback((_) {\n        if (mounted) {\n          bringIntoView(textEditingValue.selection.extent);\n        }\n      }, debugLabel: 'EditableText.bringSelectionIntoView');\n      hideToolbar();\n    }\n  }\n\n  /// Select the entire text value.\n  @override\n  void selectAll(SelectionChangedCause cause) {\n    if (widget.readOnly && widget.obscureText) {\n      // If we can't modify it, and we can't copy it, there's no point in\n      // selecting it.\n      return;\n    }\n    userUpdateTextEditingValue(\n      textEditingValue.copyWith(\n        selection: TextSelection(\n          baseOffset: 0,\n          extentOffset: textEditingValue.text.length,\n        ),\n      ),\n      cause,\n    );\n\n    if (cause == SelectionChangedCause.toolbar) {\n      switch (defaultTargetPlatform) {\n        case TargetPlatform.android:\n        case TargetPlatform.iOS:\n        case TargetPlatform.fuchsia:\n          break;\n        case TargetPlatform.macOS:\n        case TargetPlatform.linux:\n        case TargetPlatform.windows:\n          hideToolbar();\n      }\n      switch (defaultTargetPlatform) {\n        case TargetPlatform.android:\n        case TargetPlatform.fuchsia:\n        case TargetPlatform.linux:\n        case TargetPlatform.windows:\n          bringIntoView(textEditingValue.selection.extent);\n        case TargetPlatform.macOS:\n        case TargetPlatform.iOS:\n          break;\n      }\n    }\n  }\n\n  /// Look up the current selection,\n  /// as in the \"Look Up\" edit menu button on iOS.\n  ///\n  /// Currently this is only implemented for iOS.\n  ///\n  /// Throws an error if the selection is empty or collapsed.\n  Future<void> lookUpSelection(SelectionChangedCause cause) async {\n    assert(!widget.obscureText);\n\n    final String text = textEditingValue.selection.textInside(\n      textEditingValue.text,\n    );\n    if (widget.obscureText || text.isEmpty) {\n      return;\n    }\n    await SystemChannels.platform.invokeMethod('LookUp.invoke', text);\n  }\n\n  /// Launch a web search on the current selection,\n  /// as in the \"Search Web\" edit menu button on iOS.\n  ///\n  /// Currently this is only implemented for iOS.\n  ///\n  /// When 'obscureText' is true or the selection is empty,\n  /// this function will not do anything\n  Future<void> searchWebForSelection(SelectionChangedCause cause) async {\n    assert(!widget.obscureText);\n    if (widget.obscureText) {\n      return;\n    }\n\n    final String text = textEditingValue.selection.textInside(\n      textEditingValue.text,\n    );\n    if (text.isNotEmpty) {\n      await SystemChannels.platform.invokeMethod('SearchWeb.invoke', text);\n    }\n  }\n\n  /// Launch the share interface for the current selection,\n  /// as in the \"Share...\" edit menu button on iOS.\n  ///\n  /// Currently this is only implemented for iOS and Android.\n  ///\n  /// When 'obscureText' is true or the selection is empty,\n  /// this function will not do anything\n  Future<void> shareSelection(SelectionChangedCause cause) async {\n    assert(!widget.obscureText);\n    if (widget.obscureText) {\n      return;\n    }\n\n    final String text = textEditingValue.selection.textInside(\n      textEditingValue.text,\n    );\n    if (text.isNotEmpty) {\n      await SystemChannels.platform.invokeMethod('Share.invoke', text);\n    }\n  }\n\n  void _startLiveTextInput(SelectionChangedCause cause) {\n    if (!liveTextInputEnabled) {\n      return;\n    }\n    if (_hasInputConnection) {\n      LiveText.startLiveTextInput();\n    }\n    if (cause == SelectionChangedCause.toolbar) {\n      hideToolbar();\n    }\n  }\n\n  /// Finds specified [SuggestionSpan] that matches the provided index using\n  /// binary search.\n  ///\n  /// See also:\n  ///\n  ///  * [SpellCheckSuggestionsToolbar], the Material style spell check\n  ///    suggestions toolbar that uses this method to render the correct\n  ///    suggestions in the toolbar for a misspelled word.\n  SuggestionSpan? findSuggestionSpanAtCursorIndex(int cursorIndex) {\n    if (!_spellCheckResultsReceived ||\n        spellCheckResults!.suggestionSpans.last.range.end < cursorIndex) {\n      // No spell check results have been received or the cursor index is out\n      // of range that suggestionSpans covers.\n      return null;\n    }\n\n    final List<SuggestionSpan> suggestionSpans =\n        spellCheckResults!.suggestionSpans;\n    var leftIndex = 0;\n    int rightIndex = suggestionSpans.length - 1;\n    var midIndex = 0;\n\n    while (leftIndex <= rightIndex) {\n      midIndex = ((leftIndex + rightIndex) / 2).floor();\n      final int currentSpanStart = suggestionSpans[midIndex].range.start;\n      final int currentSpanEnd = suggestionSpans[midIndex].range.end;\n\n      if (cursorIndex <= currentSpanEnd && cursorIndex >= currentSpanStart) {\n        return suggestionSpans[midIndex];\n      } else if (cursorIndex <= currentSpanStart) {\n        rightIndex = midIndex - 1;\n      } else {\n        leftIndex = midIndex + 1;\n      }\n    }\n    return null;\n  }\n\n  /// Infers the [SpellCheckConfiguration] used to perform spell check.\n  ///\n  /// If spell check is enabled, this will try to infer a value for\n  /// the [SpellCheckService] if left unspecified.\n  static SpellCheckConfiguration _inferSpellCheckConfiguration(\n    SpellCheckConfiguration? configuration,\n  ) {\n    final SpellCheckService? spellCheckService =\n        configuration?.spellCheckService;\n    final bool spellCheckAutomaticallyDisabled =\n        configuration == null ||\n        configuration == const SpellCheckConfiguration.disabled();\n    final bool spellCheckServiceIsConfigured =\n        spellCheckService != null ||\n        WidgetsBinding\n            .instance\n            .platformDispatcher\n            .nativeSpellCheckServiceDefined;\n    if (spellCheckAutomaticallyDisabled || !spellCheckServiceIsConfigured) {\n      // Only enable spell check if a non-disabled configuration is provided\n      // and if that configuration does not specify a spell check service,\n      // a native spell checker must be supported.\n      assert(() {\n        if (!spellCheckAutomaticallyDisabled &&\n            !spellCheckServiceIsConfigured) {\n          FlutterError.reportError(\n            FlutterErrorDetails(\n              exception: FlutterError(\n                'Spell check was enabled with spellCheckConfiguration, but the '\n                'current platform does not have a supported spell check '\n                'service, and none was provided. Consider disabling spell '\n                'check for this platform or passing a SpellCheckConfiguration '\n                'with a specified spell check service.',\n              ),\n              library: 'widget library',\n              stack: StackTrace.current,\n            ),\n          );\n        }\n        return true;\n      }());\n      return const SpellCheckConfiguration.disabled();\n    }\n\n    return configuration.copyWith(\n      spellCheckService: spellCheckService ?? DefaultSpellCheckService(),\n    );\n  }\n\n  /// Returns the [ContextMenuButtonItem]s for the given [ToolbarOptions].\n  @Deprecated(\n    'Use `contextMenuBuilder` instead of `toolbarOptions`. '\n    'This feature was deprecated after v3.3.0-0.5.pre.',\n  )\n  List<ContextMenuButtonItem>? buttonItemsForToolbarOptions([\n    TargetPlatform? targetPlatform,\n  ]) {\n    final ToolbarOptions toolbarOptions = widget.toolbarOptions;\n    if (toolbarOptions == ToolbarOptions.empty) {\n      return null;\n    }\n    return <ContextMenuButtonItem>[\n      if (toolbarOptions.cut && cutEnabled)\n        ContextMenuButtonItem(\n          onPressed: () {\n            cutSelection(SelectionChangedCause.toolbar);\n          },\n          type: ContextMenuButtonType.cut,\n        ),\n      if (toolbarOptions.copy && copyEnabled)\n        ContextMenuButtonItem(\n          onPressed: () {\n            copySelection(SelectionChangedCause.toolbar);\n          },\n          type: ContextMenuButtonType.copy,\n        ),\n      if (toolbarOptions.paste && pasteEnabled)\n        ContextMenuButtonItem(\n          onPressed: () {\n            pasteText(SelectionChangedCause.toolbar);\n          },\n          type: ContextMenuButtonType.paste,\n        ),\n      if (toolbarOptions.selectAll && selectAllEnabled)\n        ContextMenuButtonItem(\n          onPressed: () {\n            selectAll(SelectionChangedCause.toolbar);\n          },\n          type: ContextMenuButtonType.selectAll,\n        ),\n    ];\n  }\n\n  /// Gets the line heights at the start and end of the selection for the given\n  /// [EditableTextState].\n  ///\n  /// See also:\n  ///\n  /// * [TextSelectionToolbarAnchors.getSelectionRect], which depends on this\n  ///   information.\n  ({double startGlyphHeight, double endGlyphHeight}) getGlyphHeights() {\n    final TextSelection selection = textEditingValue.selection;\n\n    // Only calculate handle rects if the text in the previous frame\n    // is the same as the text in the current frame. This is done because\n    // widget.renderObject contains the renderEditable from the previous frame.\n    // If the text changed between the current and previous frames then\n    // widget.renderObject.getRectForComposingRange might fail. In cases where\n    // the current frame is different from the previous we fall back to\n    // renderObject.preferredLineHeight.\n    final InlineSpan span = renderEditable.text!;\n    final String prevText = span.toPlainText();\n    final String currText = textEditingValue.text;\n    if (prevText != currText || !selection.isValid || selection.isCollapsed) {\n      return (\n        startGlyphHeight: renderEditable.preferredLineHeight,\n        endGlyphHeight: renderEditable.preferredLineHeight,\n      );\n    }\n\n    final String selectedGraphemes = selection.textInside(currText);\n    final int firstSelectedGraphemeExtent =\n        selectedGraphemes.characters.first.length;\n    final Rect? startCharacterRect = renderEditable.getRectForComposingRange(\n      TextRange(\n        start: selection.start,\n        end: selection.start + firstSelectedGraphemeExtent,\n      ),\n    );\n    final int lastSelectedGraphemeExtent =\n        selectedGraphemes.characters.last.length;\n    final Rect? endCharacterRect = renderEditable.getRectForComposingRange(\n      TextRange(\n        start: selection.end - lastSelectedGraphemeExtent,\n        end: selection.end,\n      ),\n    );\n    return (\n      startGlyphHeight:\n          startCharacterRect?.height ?? renderEditable.preferredLineHeight,\n      endGlyphHeight:\n          endCharacterRect?.height ?? renderEditable.preferredLineHeight,\n    );\n  }\n\n  /// {@template flutter.widgets.EditableText.getAnchors}\n  /// Returns the anchor points for the default context menu.\n  /// {@endtemplate}\n  ///\n  /// See also:\n  ///\n  ///  * [contextMenuButtonItems], which provides the [ContextMenuButtonItem]s\n  ///    for the default context menu buttons.\n  TextSelectionToolbarAnchors get contextMenuAnchors {\n    if (renderEditable.lastSecondaryTapDownPosition != null) {\n      return TextSelectionToolbarAnchors(\n        primaryAnchor: renderEditable.lastSecondaryTapDownPosition!,\n      );\n    }\n\n    final (\n      startGlyphHeight: double startGlyphHeight,\n      endGlyphHeight: double endGlyphHeight,\n    ) = getGlyphHeights();\n    final TextSelection selection = textEditingValue.selection;\n    final List<TextSelectionPoint> points = renderEditable\n        .getEndpointsForSelection(selection);\n    return TextSelectionToolbarAnchors.fromSelection(\n      renderBox: renderEditable,\n      startGlyphHeight: startGlyphHeight,\n      endGlyphHeight: endGlyphHeight,\n      selectionEndpoints: points,\n    );\n  }\n\n  /// Returns the [ContextMenuButtonItem]s representing the buttons in this\n  /// platform's default selection menu for [EditableText].\n  ///\n  /// See also:\n  ///\n  /// * [EditableText.getEditableButtonItems], which performs a similar role,\n  ///   but for any editable field, not just specifically EditableText.\n  /// * [SystemContextMenu.getDefaultItems], which performs a similar role, but\n  ///   for the system-rendered context menu.\n  /// * [SelectableRegionState.contextMenuButtonItems], which performs a similar\n  ///   role but for content that is selectable but not editable.\n  /// * [contextMenuAnchors], which provides the anchor points for the default\n  ///   context menu.\n  /// * [AdaptiveTextSelectionToolbar], which builds the toolbar itself, and can\n  ///   take a list of [ContextMenuButtonItem]s with\n  ///   [AdaptiveTextSelectionToolbar.buttonItems].\n  /// * [AdaptiveTextSelectionToolbar.getAdaptiveButtons], which builds the\n  ///   button Widgets for the current platform given [ContextMenuButtonItem]s.\n  List<ContextMenuButtonItem> get contextMenuButtonItems {\n    return buttonItemsForToolbarOptions() ??\n          EditableText.getEditableButtonItems(\n            clipboardStatus: clipboardStatus.value,\n            onCopy: copyEnabled\n                ? () => copySelection(SelectionChangedCause.toolbar)\n                : null,\n            onCut: cutEnabled\n                ? () => cutSelection(SelectionChangedCause.toolbar)\n                : null,\n            onPaste: pasteEnabled\n                ? () => pasteText(SelectionChangedCause.toolbar)\n                : null,\n            onSelectAll: selectAllEnabled\n                ? () => selectAll(SelectionChangedCause.toolbar)\n                : null,\n            onLookUp: lookUpEnabled\n                ? () => lookUpSelection(SelectionChangedCause.toolbar)\n                : null,\n            onSearchWeb: searchWebEnabled\n                ? () => searchWebForSelection(SelectionChangedCause.toolbar)\n                : null,\n            onShare: shareEnabled\n                ? () => shareSelection(SelectionChangedCause.toolbar)\n                : null,\n            onLiveTextInput: liveTextInputEnabled\n                ? () => _startLiveTextInput(SelectionChangedCause.toolbar)\n                : null,\n          )\n      ..addAll(_textProcessingActionButtonItems);\n  }\n\n  List<ContextMenuButtonItem> get _textProcessingActionButtonItems {\n    final buttonItems = <ContextMenuButtonItem>[];\n    final TextSelection selection = textEditingValue.selection;\n    if (widget.obscureText || !selection.isValid || selection.isCollapsed) {\n      return buttonItems;\n    }\n\n    for (final ProcessTextAction action in _processTextActions) {\n      buttonItems.add(\n        ContextMenuButtonItem(\n          label: action.label,\n          onPressed: () async {\n            final String selectedText = selection.textInside(\n              textEditingValue.text,\n            );\n            if (selectedText.isNotEmpty) {\n              final String? processedText = await _processTextService\n                  .processTextAction(\n                    action.id,\n                    selectedText,\n                    widget.readOnly,\n                  );\n              // If an activity does not return a modified version, just hide the toolbar.\n              // Otherwise use the result to replace the selected text.\n              if (processedText != null && _allowPaste) {\n                _pasteText(SelectionChangedCause.toolbar, processedText);\n              } else {\n                hideToolbar();\n              }\n            }\n          },\n        ),\n      );\n    }\n    return buttonItems;\n  }\n\n  // State lifecycle:\n\n  @protected\n  @override\n  void initState() {\n    super.initState();\n    _liveTextInputStatus?.addListener(_onChangedLiveTextInputStatus);\n    clipboardStatus.addListener(_onChangedClipboardStatus);\n    widget.controller.addListener(_didChangeTextEditingValue);\n    widget.focusNode.addListener(_handleFocusChanged);\n    _cursorVisibilityNotifier.value = widget.showCursor;\n    _spellCheckConfiguration = _inferSpellCheckConfiguration(\n      widget.spellCheckConfiguration,\n    );\n    _appLifecycleListener = AppLifecycleListener(onResume: _onResume);\n    _initProcessTextActions();\n  }\n\n  void _onResume() {\n    _justResumed = true;\n    // To prevent adding multiple listeners, remove any existing one first.\n    FocusManager.instance.removeListener(_resetJustResumed);\n    // Reset _justResumed as soon as there is a focus change.\n    FocusManager.instance.addListener(_resetJustResumed);\n  }\n\n  void _resetJustResumed() {\n    _justResumed = false;\n    FocusManager.instance.removeListener(_resetJustResumed);\n  }\n\n  /// Query the engine to initialize the list of text processing actions to show\n  /// in the text selection toolbar.\n  Future<void> _initProcessTextActions() async {\n    _processTextActions\n      ..clear()\n      ..addAll(await _processTextService.queryTextActions());\n  }\n\n  // Whether `TickerMode.of(context)` is true and animations (like blinking the\n  // cursor) are supposed to run.\n  bool _tickersEnabled = true;\n\n  @protected\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n\n    _style = MediaQuery.boldTextOf(context)\n        ? widget.style.merge(const TextStyle(fontWeight: FontWeight.bold))\n        : widget.style;\n\n    final AutofillGroupState? newAutofillGroup = AutofillGroup.maybeOf(context);\n    if (currentAutofillScope != newAutofillGroup) {\n      _currentAutofillScope?.unregister(autofillId);\n      _currentAutofillScope = newAutofillGroup;\n      _currentAutofillScope?.register(_effectiveAutofillClient);\n    }\n\n    if (!_didAutoFocus && widget.autofocus) {\n      _didAutoFocus = true;\n      SchedulerBinding.instance.addPostFrameCallback((_) {\n        if (mounted && renderEditable.hasSize) {\n          _flagInternalFocus();\n          FocusScope.of(context).autofocus(widget.focusNode);\n        }\n      }, debugLabel: 'EditableText.autofocus');\n    }\n\n    // Restart or stop the blinking cursor when TickerMode changes.\n    final bool newTickerEnabled = TickerMode.of(context);\n    if (_tickersEnabled != newTickerEnabled) {\n      _tickersEnabled = newTickerEnabled;\n      if (_showBlinkingCursor) {\n        _startCursorBlink();\n      } else if (!_tickersEnabled && _cursorTimer != null) {\n        _stopCursorBlink();\n      }\n    }\n\n    // Check for changes in viewId.\n    if (_hasInputConnection) {\n      final int newViewId = View.of(context).viewId;\n      if (newViewId != _viewId) {\n        _textInputConnection!.updateConfig(\n          _effectiveAutofillClient.textInputConfiguration,\n        );\n      }\n    }\n\n    if (defaultTargetPlatform != TargetPlatform.iOS &&\n        defaultTargetPlatform != TargetPlatform.android) {\n      return;\n    }\n\n    // Hide the text selection toolbar on mobile when orientation changes.\n    final Orientation orientation = MediaQuery.orientationOf(context);\n    if (_lastOrientation == null) {\n      _lastOrientation = orientation;\n      return;\n    }\n    if (orientation != _lastOrientation) {\n      _lastOrientation = orientation;\n      if (defaultTargetPlatform == TargetPlatform.iOS) {\n        hideToolbar(false);\n      }\n      if (defaultTargetPlatform == TargetPlatform.android) {\n        hideToolbar();\n      }\n    }\n\n    if (_listeningToScrollNotificationObserver) {\n      // Only update subscription when we have previously subscribed to the\n      // scroll notification observer. We only subscribe to the scroll\n      // notification observer when the context menu is shown on platforms that\n      // support _platformSupportsFadeOnScroll.\n      _scrollNotificationObserver?.removeListener(\n        _handleContextMenuOnParentScroll,\n      );\n      _scrollNotificationObserver = ScrollNotificationObserver.maybeOf(context);\n      _scrollNotificationObserver?.addListener(\n        _handleContextMenuOnParentScroll,\n      );\n    }\n  }\n\n  @protected\n  @override\n  void didUpdateWidget(EditableText oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (widget.controller != oldWidget.controller) {\n      oldWidget.controller.removeListener(_didChangeTextEditingValue);\n      widget.controller.addListener(_didChangeTextEditingValue);\n      _updateRemoteEditingValueIfNeeded();\n    }\n\n    if (_selectionOverlay != null &&\n        (widget.contextMenuBuilder != oldWidget.contextMenuBuilder ||\n            widget.selectionControls != oldWidget.selectionControls ||\n            widget.onSelectionHandleTapped !=\n                oldWidget.onSelectionHandleTapped ||\n            widget.dragStartBehavior != oldWidget.dragStartBehavior ||\n            widget.magnifierConfiguration !=\n                oldWidget.magnifierConfiguration)) {\n      final bool shouldShowToolbar = _selectionOverlay!.toolbarIsVisible;\n      final bool shouldShowHandles = _selectionOverlay!.handlesVisible;\n      _selectionOverlay!.dispose();\n      _selectionOverlay = _createSelectionOverlay();\n      if (shouldShowToolbar || shouldShowHandles) {\n        SchedulerBinding.instance.addPostFrameCallback((Duration _) {\n          if (shouldShowToolbar) {\n            _selectionOverlay!.showToolbar();\n          }\n          if (shouldShowHandles) {\n            _selectionOverlay!.showHandles();\n          }\n        });\n      }\n    } else if (widget.controller.selection != oldWidget.controller.selection) {\n      _selectionOverlay?.update(_value);\n    }\n    _selectionOverlay?.handlesVisible = widget.showSelectionHandles;\n\n    if (widget.autofillClient != oldWidget.autofillClient) {\n      _currentAutofillScope?.unregister(\n        oldWidget.autofillClient?.autofillId ?? autofillId,\n      );\n      _currentAutofillScope?.register(_effectiveAutofillClient);\n    }\n\n    if (widget.focusNode != oldWidget.focusNode) {\n      oldWidget.focusNode.removeListener(_handleFocusChanged);\n      widget.focusNode.addListener(_handleFocusChanged);\n      updateKeepAlive();\n    }\n\n    if (!_shouldCreateInputConnection) {\n      _closeInputConnectionIfNeeded();\n    } else if (oldWidget.readOnly && _hasFocus) {\n      // _openInputConnection must be called after layout information is available.\n      // See https://github.com/flutter/flutter/issues/126312\n      SchedulerBinding.instance.addPostFrameCallback((Duration _) {\n        _openInputConnection();\n      }, debugLabel: 'EditableText.openInputConnection');\n    }\n\n    if (kIsWeb && _hasInputConnection) {\n      if (oldWidget.readOnly != widget.readOnly) {\n        _textInputConnection!.updateConfig(\n          _effectiveAutofillClient.textInputConfiguration,\n        );\n      }\n    }\n\n    if (_hasInputConnection) {\n      if (oldWidget.obscureText != widget.obscureText ||\n          oldWidget.keyboardType != widget.keyboardType) {\n        _textInputConnection!.updateConfig(\n          _effectiveAutofillClient.textInputConfiguration,\n        );\n      }\n    }\n\n    if (widget.style != oldWidget.style) {\n      // The _textInputConnection will pick up the new style when it attaches in\n      // _openInputConnection.\n      _style = MediaQuery.boldTextOf(context)\n          ? widget.style.merge(const TextStyle(fontWeight: FontWeight.bold))\n          : widget.style;\n      if (_hasInputConnection) {\n        _textInputConnection!.setStyle(\n          fontFamily: _style.fontFamily,\n          fontSize: _style.fontSize,\n          fontWeight: _style.fontWeight,\n          textDirection: _textDirection,\n          textAlign: widget.textAlign,\n        );\n      }\n    }\n\n    if (widget.showCursor != oldWidget.showCursor) {\n      _startOrStopCursorTimerIfNeeded();\n    }\n    final bool canPaste =\n        widget.selectionControls is TextSelectionHandleControls\n        ? pasteEnabled\n        : widget.selectionControls?.canPaste(this) ?? false;\n    if (widget.selectionEnabled && pasteEnabled && canPaste) {\n      clipboardStatus.update();\n    }\n  }\n\n  void _disposeScrollNotificationObserver() {\n    _listeningToScrollNotificationObserver = false;\n    if (_scrollNotificationObserver != null) {\n      _scrollNotificationObserver!.removeListener(\n        _handleContextMenuOnParentScroll,\n      );\n      _scrollNotificationObserver = null;\n    }\n  }\n\n  @protected\n  @override\n  void dispose() {\n    _internalScrollController?.dispose();\n    _currentAutofillScope?.unregister(autofillId);\n    widget.controller.removeListener(_didChangeTextEditingValue);\n    _floatingCursorResetController?.dispose();\n    _floatingCursorResetController = null;\n    _closeInputConnectionIfNeeded();\n    assert(!_hasInputConnection);\n    _cursorTimer?.cancel();\n    _cursorTimer = null;\n    _backingCursorBlinkOpacityController?.dispose();\n    _backingCursorBlinkOpacityController = null;\n    _selectionOverlay?.dispose();\n    _selectionOverlay = null;\n    widget.focusNode.removeListener(_handleFocusChanged);\n    WidgetsBinding.instance.removeObserver(this);\n    _liveTextInputStatus?.removeListener(_onChangedLiveTextInputStatus);\n    _liveTextInputStatus?.dispose();\n    clipboardStatus\n      ..removeListener(_onChangedClipboardStatus)\n      ..dispose();\n    _cursorVisibilityNotifier.dispose();\n    _appLifecycleListener.dispose();\n    FocusManager.instance.removeListener(_unflagInternalFocus);\n    FocusManager.instance.removeListener(_resetJustResumed);\n    _disposeScrollNotificationObserver();\n    super.dispose();\n    assert(_batchEditDepth <= 0, 'unfinished batch edits: $_batchEditDepth');\n  }\n\n  // TextInputClient implementation:\n\n  /// The last known [TextEditingValue] of the platform text input plugin.\n  ///\n  /// This value is updated when the platform text input plugin sends a new\n  /// update via [updateEditingValue], or when [EditableText] calls\n  /// [TextInputConnection.setEditingState] to overwrite the platform text input\n  /// plugin's [TextEditingValue].\n  ///\n  /// Used in [_updateRemoteEditingValueIfNeeded] to determine whether the\n  /// remote value is outdated and needs updating.\n  TextEditingValue? _lastKnownRemoteTextEditingValue;\n\n  @override\n  TextEditingValue get currentTextEditingValue => _value;\n\n  @override\n  void updateEditingValue(\n    TextEditingValue value, {\n    TextEditingValue? remoteValue,\n  }) {\n    // This method handles text editing state updates from the platform text\n    // input plugin. The [EditableText] may not have the focus or an open input\n    // connection, as autofill can update a disconnected [EditableText].\n\n    // Since we still have to support keyboard select, this is the best place\n    // to disable text updating.\n    if (!_shouldCreateInputConnection) {\n      return;\n    }\n\n    if (_checkNeedsAdjustAffinity(value)) {\n      value = value.copyWith(\n        selection: value.selection.copyWith(\n          affinity: _value.selection.affinity,\n        ),\n      );\n    }\n\n    if (widget.readOnly) {\n      // In the read-only case, we only care about selection changes, and reject\n      // everything else.\n      value = _value.copyWith(selection: value.selection);\n    }\n    _lastKnownRemoteTextEditingValue = remoteValue ?? value;\n\n    if (value == _value) {\n      if (remoteValue != null && Platform.isIOS) {\n        _updateRemoteEditingValueIfNeeded();\n      }\n      // This is possible, for example, when the numeric keyboard is input,\n      // the engine will notify twice for the same value.\n      // Track at https://github.com/flutter/flutter/issues/65811\n      return;\n    }\n\n    if (value.text == _value.text && value.composing == _value.composing) {\n      // `selection` is the only change.\n      SelectionChangedCause cause;\n      if (_textInputConnection?.scribbleInProgress ?? false) {\n        cause = SelectionChangedCause.stylusHandwriting;\n      } else if (_pointOffsetOrigin != null) {\n        // For floating cursor selection when force pressing the space bar.\n        cause = SelectionChangedCause.forcePress;\n      } else {\n        cause = SelectionChangedCause.keyboard;\n      }\n      _handleSelectionChanged(value.selection, cause);\n    } else {\n      if (value.text != _value.text) {\n        // Hide the toolbar if the text was changed, but only hide the toolbar\n        // overlay; the selection handle's visibility will be handled\n        // by `_handleSelectionChanged`. https://github.com/flutter/flutter/issues/108673\n        hideToolbar(false);\n      }\n      _currentPromptRectRange = null;\n\n      final bool revealObscuredInput =\n          _hasInputConnection &&\n          widget.obscureText &&\n          WidgetsBinding.instance.platformDispatcher.brieflyShowPassword &&\n          value.text.length == _value.text.length + 1;\n\n      _obscureShowCharTicksPending = revealObscuredInput\n          ? _kObscureShowLatestCharCursorTicks\n          : 0;\n      _obscureLatestCharIndex = revealObscuredInput\n          ? _value.selection.baseOffset\n          : null;\n      _formatAndSetValue(value, SelectionChangedCause.keyboard);\n    }\n\n    if (_showBlinkingCursor && _cursorTimer != null) {\n      // To keep the cursor from blinking while typing, restart the timer here.\n      _stopCursorBlink(resetCharTicks: false);\n      _startCursorBlink();\n    }\n\n    // Wherever the value is changed by the user, schedule a showCaretOnScreen\n    // to make sure the user can see the changes they just made. Programmatic\n    // changes to `textEditingValue` do not trigger the behavior even if the\n    // text field is focused.\n    scheduleShowCaretOnScreen(withAnimation: true);\n  }\n\n  bool _checkNeedsAdjustAffinity(TextEditingValue value) {\n    // Trust the engine affinity if the text changes or selection changes.\n    return value.text == _value.text &&\n        value.selection.isCollapsed == _value.selection.isCollapsed &&\n        value.selection.start == _value.selection.start &&\n        value.selection.affinity != _value.selection.affinity;\n  }\n\n  @override\n  void performAction(TextInputAction action) {\n    switch (action) {\n      case TextInputAction.newline:\n        // If this is a multiline EditableText, do nothing for a \"newline\"\n        // action; The newline is already inserted. Otherwise, finalize\n        // editing.\n        if (!_isMultiline) {\n          _finalizeEditing(action, shouldUnfocus: true);\n        } else if (HardwareKeyboard.instance.isControlPressed) {\n          final ctr = widget.controller;\n          final offset = ctr.selection.end;\n          // delete newline\n          ctr.syncRichText(\n            TextEditingDeltaDeletion(\n              composing: TextRange.empty,\n              selection: TextSelection.collapsed(offset: offset - 1),\n              deletedRange: TextRange(start: offset - 1, end: offset),\n              oldText: ctr.text,\n            ),\n          );\n          _finalizeEditing(action, shouldUnfocus: true);\n        }\n      case TextInputAction.done:\n      case TextInputAction.go:\n      case TextInputAction.next:\n      case TextInputAction.previous:\n      case TextInputAction.search:\n      case TextInputAction.send:\n        _finalizeEditing(action, shouldUnfocus: true);\n      case TextInputAction.continueAction:\n      case TextInputAction.emergencyCall:\n      case TextInputAction.join:\n      case TextInputAction.none:\n      case TextInputAction.route:\n      case TextInputAction.unspecified:\n        // Finalize editing, but don't give up focus because this keyboard\n        // action does not imply the user is done inputting information.\n        _finalizeEditing(action, shouldUnfocus: false);\n    }\n  }\n\n  @override\n  void updateEditingValueWithDeltas(List<TextEditingDelta> textEditingDeltas) {\n    if (textEditingDeltas.isEmpty) {\n      updateEditingValue(_value.copyWith(composing: TextRange.empty));\n      return;\n    }\n    TextEditingValue remoteValue = _value;\n    for (final TextEditingDelta delta in textEditingDeltas) {\n      widget.controller.syncRichText(delta);\n      remoteValue = delta.apply(remoteValue);\n    }\n\n    final newValue = _value.copyWith(\n      text: widget.controller.plainText,\n      selection: widget.controller.newSelection,\n      composing: textEditingDeltas.last.composing,\n    );\n\n    updateEditingValue(newValue, remoteValue: remoteValue);\n\n    // TextEditingValue value = _value;\n    // for (final TextEditingDelta delta in textEditingDeltas) {\n    //   value = delta.apply(value);\n    // }\n    // updateEditingValue(value);\n  }\n\n  @override\n  void performPrivateCommand(String action, Map<String, dynamic> data) {\n    widget.onAppPrivateCommand?.call(action, data);\n  }\n\n  @override\n  void insertContent(KeyboardInsertedContent content) {\n    assert(\n      widget.contentInsertionConfiguration?.allowedMimeTypes.contains(\n            content.mimeType,\n          ) ??\n          false,\n    );\n    widget.contentInsertionConfiguration?.onContentInserted.call(content);\n  }\n\n  // The original position of the caret on FloatingCursorDragState.start.\n  Offset? _startCaretCenter;\n\n  // The most recent text position as determined by the location of the floating\n  // cursor.\n  TextPosition? _lastTextPosition;\n\n  // The offset of the floating cursor as determined from the start call.\n  Offset? _pointOffsetOrigin;\n\n  // The most recent position of the floating cursor.\n  Offset? _lastBoundedOffset;\n\n  // Because the center of the cursor is preferredLineHeight / 2 below the touch\n  // origin, but the touch origin is used to determine which line the cursor is\n  // on, we need this offset to correctly render and move the cursor.\n  Offset get _floatingCursorOffset =>\n      Offset(0, renderEditable.preferredLineHeight / 2);\n\n  @override\n  void updateFloatingCursor(RawFloatingCursorPoint point) {\n    _floatingCursorResetController ??= AnimationController(vsync: this)\n      ..addListener(_onFloatingCursorResetTick);\n    switch (point.state) {\n      case FloatingCursorDragState.Start:\n        if (_floatingCursorResetController!.isAnimating) {\n          _floatingCursorResetController!.stop();\n          _onFloatingCursorResetTick();\n        }\n        // Stop cursor blinking and making it visible.\n        _stopCursorBlink(resetCharTicks: false);\n        _cursorBlinkOpacityController.value = 1.0;\n        // We want to send in points that are centered around a (0,0) origin, so\n        // we cache the position.\n        _pointOffsetOrigin = point.offset;\n\n        final Offset startCaretCenter;\n        final TextPosition currentTextPosition;\n        final bool shouldResetOrigin;\n        // Only non-null when starting a floating cursor via long press.\n        if (point.startLocation != null) {\n          shouldResetOrigin = false;\n          (startCaretCenter, currentTextPosition) = point.startLocation!;\n        } else {\n          shouldResetOrigin = true;\n          currentTextPosition = TextPosition(\n            offset: renderEditable.selection!.baseOffset,\n            affinity: renderEditable.selection!.affinity,\n          );\n          startCaretCenter = renderEditable\n              .getLocalRectForCaret(currentTextPosition)\n              .center;\n        }\n\n        _startCaretCenter = startCaretCenter;\n        _lastBoundedOffset = renderEditable\n            .calculateBoundedFloatingCursorOffset(\n              _startCaretCenter! - _floatingCursorOffset,\n              shouldResetOrigin: shouldResetOrigin,\n            );\n        _lastTextPosition = currentTextPosition;\n        renderEditable.setFloatingCursor(\n          point.state,\n          _lastBoundedOffset!,\n          _lastTextPosition!,\n        );\n      case FloatingCursorDragState.Update:\n        final Offset centeredPoint = point.offset! - _pointOffsetOrigin!;\n        final Offset rawCursorOffset =\n            _startCaretCenter! + centeredPoint - _floatingCursorOffset;\n\n        _lastBoundedOffset = renderEditable\n            .calculateBoundedFloatingCursorOffset(rawCursorOffset);\n        _lastTextPosition = renderEditable.getPositionForPoint(\n          renderEditable.localToGlobal(\n            _lastBoundedOffset! + _floatingCursorOffset,\n          ),\n        );\n\n        // bggRGjQaUbCoE ios single long press\n        _lastTextPosition = widget.controller.dragOffset(_lastTextPosition!);\n\n        renderEditable.setFloatingCursor(\n          point.state,\n          _lastBoundedOffset!,\n          _lastTextPosition!,\n        );\n      case FloatingCursorDragState.End:\n        // Resume cursor blinking.\n        if (_hasFocus) {\n          _startCursorBlink();\n        }\n        // We skip animation if no update has happened.\n        if (_lastTextPosition != null && _lastBoundedOffset != null) {\n          _floatingCursorResetController!.value = 0.0;\n          _floatingCursorResetController!.animateTo(\n            1.0,\n            duration: _floatingCursorResetTime,\n            curve: Curves.decelerate,\n          );\n        }\n    }\n  }\n\n  void _onFloatingCursorResetTick() {\n    final Offset finalPosition =\n        renderEditable.getLocalRectForCaret(_lastTextPosition!).centerLeft -\n        _floatingCursorOffset;\n    if (_floatingCursorResetController!.isCompleted) {\n      renderEditable.setFloatingCursor(\n        FloatingCursorDragState.End,\n        finalPosition,\n        _lastTextPosition!,\n      );\n      // During a floating cursor's move gesture (1 finger), a cursor is\n      // animated only visually, without actually updating the selection.\n      // Only after move gesture is complete, this function will be called\n      // to actually update the selection to the new cursor location with\n      // zero selection length.\n\n      // However, During a floating cursor's selection gesture (2 fingers), the\n      // selection is constantly updated by the engine throughout the gesture.\n      // Thus when the gesture is complete, we should not update the selection\n      // to the cursor location with zero selection length, because that would\n      // overwrite the selection made by floating cursor selection.\n\n      // Here we use `isCollapsed` to distinguish between floating cursor's\n      // move gesture (1 finger) vs selection gesture (2 fingers), as\n      // the engine does not provide information other than notifying a\n      // new selection during with selection gesture (2 fingers).\n      if (renderEditable.selection!.isCollapsed) {\n        // The cause is technically the force cursor, but the cause is listed as tap as the desired functionality is the same.\n        _handleSelectionChanged(\n          TextSelection.fromPosition(_lastTextPosition!),\n          SelectionChangedCause.forcePress,\n        );\n      }\n      _startCaretCenter = null;\n      _lastTextPosition = null;\n      _pointOffsetOrigin = null;\n      _lastBoundedOffset = null;\n    } else {\n      final double lerpValue = _floatingCursorResetController!.value;\n      final double lerpX = ui.lerpDouble(\n        _lastBoundedOffset!.dx,\n        finalPosition.dx,\n        lerpValue,\n      )!;\n      final double lerpY = ui.lerpDouble(\n        _lastBoundedOffset!.dy,\n        finalPosition.dy,\n        lerpValue,\n      )!;\n\n      renderEditable.setFloatingCursor(\n        FloatingCursorDragState.Update,\n        Offset(lerpX, lerpY),\n        _lastTextPosition!,\n        resetLerpValue: lerpValue,\n      );\n    }\n  }\n\n  @pragma('vm:notify-debugger-on-exception')\n  void _finalizeEditing(TextInputAction action, {required bool shouldUnfocus}) {\n    // Take any actions necessary now that the user has completed editing.\n    if (widget.onEditingComplete != null) {\n      try {\n        widget.onEditingComplete!();\n      } catch (exception, stack) {\n        FlutterError.reportError(\n          FlutterErrorDetails(\n            exception: exception,\n            stack: stack,\n            library: 'widgets',\n            context: ErrorDescription(\n              'while calling onEditingComplete for $action',\n            ),\n          ),\n        );\n      }\n    } else {\n      // Default behavior if the developer did not provide an\n      // onEditingComplete callback: Finalize editing and remove focus, or move\n      // it to the next/previous field, depending on the action.\n      widget.controller.clearComposing();\n      if (shouldUnfocus) {\n        switch (action) {\n          case TextInputAction.none:\n          case TextInputAction.unspecified:\n          case TextInputAction.done:\n          case TextInputAction.go:\n          case TextInputAction.search:\n          case TextInputAction.send:\n          case TextInputAction.continueAction:\n          case TextInputAction.join:\n          case TextInputAction.route:\n          case TextInputAction.emergencyCall:\n          case TextInputAction.newline:\n            widget.focusNode.unfocus();\n          case TextInputAction.next:\n            widget.focusNode.nextFocus();\n          case TextInputAction.previous:\n            widget.focusNode.previousFocus();\n        }\n      }\n    }\n\n    final ValueChanged<String>? onSubmitted = widget.onSubmitted;\n    if (onSubmitted == null) {\n      return;\n    }\n\n    // Invoke optional callback with the user's submitted content.\n    try {\n      onSubmitted(_value.text);\n    } catch (exception, stack) {\n      FlutterError.reportError(\n        FlutterErrorDetails(\n          exception: exception,\n          stack: stack,\n          library: 'widgets',\n          context: ErrorDescription('while calling onSubmitted for $action'),\n        ),\n      );\n    }\n\n    // If `shouldUnfocus` is true, the text field should no longer be focused\n    // after the microtask queue is drained. But in case the developer cancelled\n    // the focus change in the `onSubmitted` callback by focusing this input\n    // field again, reset the soft keyboard.\n    // See https://github.com/flutter/flutter/issues/84240.\n    //\n    // `_restartConnectionIfNeeded` creates a new TextInputConnection to replace\n    // the current one. This on iOS switches to a new input view and on Android\n    // restarts the input method, and in both cases the soft keyboard will be\n    // reset.\n    if (shouldUnfocus) {\n      _scheduleRestartConnection();\n    }\n  }\n\n  int _batchEditDepth = 0;\n\n  /// Begins a new batch edit, within which new updates made to the text editing\n  /// value will not be sent to the platform text input plugin.\n  ///\n  /// Batch edits nest. When the outermost batch edit finishes, [endBatchEdit]\n  /// will attempt to send [currentTextEditingValue] to the text input plugin if\n  /// it detected a change.\n  void beginBatchEdit() {\n    _batchEditDepth += 1;\n  }\n\n  /// Ends the current batch edit started by the last call to [beginBatchEdit],\n  /// and send [currentTextEditingValue] to the text input plugin if needed.\n  ///\n  /// Throws an error in debug mode if this [EditableText] is not in a batch\n  /// edit.\n  void endBatchEdit() {\n    _batchEditDepth -= 1;\n    assert(\n      _batchEditDepth >= 0,\n      'Unbalanced call to endBatchEdit: beginBatchEdit must be called first.',\n    );\n    _updateRemoteEditingValueIfNeeded();\n  }\n\n  void _updateRemoteEditingValueIfNeeded() {\n    if (_batchEditDepth > 0 || !_hasInputConnection) {\n      return;\n    }\n    final TextEditingValue localValue = _value;\n    if (localValue == _lastKnownRemoteTextEditingValue) {\n      return;\n    }\n    _textInputConnection!.setEditingState(localValue);\n    _lastKnownRemoteTextEditingValue = localValue;\n  }\n\n  TextEditingValue get _value => widget.controller.value;\n  set _value(TextEditingValue value) {\n    widget.controller.value = value;\n  }\n\n  bool get _hasFocus => widget.focusNode.hasFocus;\n  bool get _isMultiline => widget.maxLines != 1;\n\n  /// Flag to track whether this [EditableText] was in focus when [onTapOutside]\n  /// was called.\n  ///\n  /// This is used to determine whether [onTapUpOutside] should be called.\n  /// The reason [_hasFocus] can't be used directly is because [onTapOutside]\n  /// might unfocus this [EditableText] and block the [onTapUpOutside] call.\n  bool _hadFocusOnTapDown = false;\n\n  // Finds the closest scroll offset to the current scroll offset that fully\n  // reveals the given caret rect. If the given rect's main axis extent is too\n  // large to be fully revealed in `renderEditable`, it will be centered along\n  // the main axis.\n  //\n  // If this is a multiline EditableText (which means the Editable can only\n  // scroll vertically), the given rect's height will first be extended to match\n  // `renderEditable.preferredLineHeight`, before the target scroll offset is\n  // calculated.\n  RevealedOffset _getOffsetToRevealCaret(Rect rect) {\n    if (!_scrollController.position.allowImplicitScrolling) {\n      return RevealedOffset(offset: _scrollController.offset, rect: rect);\n    }\n\n    final Size editableSize = renderEditable.size;\n    final double additionalOffset;\n    final Offset unitOffset;\n\n    if (!_isMultiline) {\n      additionalOffset = rect.width >= editableSize.width\n          // Center `rect` if it's oversized.\n          ? editableSize.width / 2 - rect.center.dx\n          // Valid additional offsets range from (rect.right - size.width)\n          // to (rect.left). Pick the closest one if out of range.\n          : clampDouble(0.0, rect.right - editableSize.width, rect.left);\n      unitOffset = const Offset(1, 0);\n    } else {\n      // The caret is vertically centered within the line. Expand the caret's\n      // height so that it spans the line because we're going to ensure that the\n      // entire expanded caret is scrolled into view.\n      final expandedRect = Rect.fromCenter(\n        center: rect.center,\n        width: rect.width,\n        height: math.max(rect.height, renderEditable.preferredLineHeight),\n      );\n\n      additionalOffset = expandedRect.height >= editableSize.height\n          ? editableSize.height / 2 - expandedRect.center.dy\n          : clampDouble(\n              0.0,\n              expandedRect.bottom - editableSize.height,\n              expandedRect.top,\n            );\n      unitOffset = const Offset(0, 1);\n    }\n\n    // No overscrolling when encountering tall fonts/scripts that extend past\n    // the ascent.\n    final double targetOffset = clampDouble(\n      additionalOffset + _scrollController.offset,\n      _scrollController.position.minScrollExtent,\n      _scrollController.position.maxScrollExtent,\n    );\n\n    final double offsetDelta = _scrollController.offset - targetOffset;\n    return RevealedOffset(\n      rect: rect.shift(unitOffset * offsetDelta),\n      offset: targetOffset,\n    );\n  }\n\n  /// Whether to send the autofill information to the autofill service. True by\n  /// default.\n  bool get _needsAutofill => _effectiveAutofillClient\n      .textInputConfiguration\n      .autofillConfiguration\n      .enabled;\n\n  // Must be called after layout.\n  // See https://github.com/flutter/flutter/issues/126312\n  void _openInputConnection() {\n    if (!_shouldCreateInputConnection) {\n      return;\n    }\n    if (!_hasInputConnection) {\n      final TextEditingValue localValue = _value;\n\n      // When _needsAutofill == true && currentAutofillScope == null, autofill\n      // is allowed but saving the user input from the text field is\n      // discouraged.\n      //\n      // In case the autofillScope changes from a non-null value to null, or\n      // _needsAutofill changes to false from true, the platform needs to be\n      // notified to exclude this field from the autofill context. So we need to\n      // provide the autofillId.\n      _textInputConnection = _needsAutofill && currentAutofillScope != null\n          ? currentAutofillScope!.attach(\n              this,\n              _effectiveAutofillClient.textInputConfiguration,\n            )\n          : TextInput.attach(\n              this,\n              _effectiveAutofillClient.textInputConfiguration,\n            );\n      _updateSizeAndTransform();\n      _schedulePeriodicPostFrameCallbacks();\n      _textInputConnection!\n        ..setStyle(\n          fontFamily: _style.fontFamily,\n          fontSize: _style.fontSize,\n          fontWeight: _style.fontWeight,\n          textDirection: _textDirection,\n          textAlign: widget.textAlign,\n        )\n        ..setEditingState(localValue)\n        ..show();\n      if (_needsAutofill) {\n        // Request autofill AFTER the size and the transform have been sent to\n        // the platform text input plugin.\n        _textInputConnection!.requestAutofill();\n      }\n      _lastKnownRemoteTextEditingValue = localValue;\n    } else {\n      _textInputConnection!.show();\n    }\n  }\n\n  void _closeInputConnectionIfNeeded() {\n    if (_hasInputConnection) {\n      _textInputConnection!.close();\n      _textInputConnection = null;\n      _lastKnownRemoteTextEditingValue = null;\n      _scribbleCacheKey = null;\n      removeTextPlaceholder();\n    }\n  }\n\n  void _openOrCloseInputConnectionIfNeeded() {\n    if (_hasFocus && widget.focusNode.consumeKeyboardToken()) {\n      _openInputConnection();\n    } else if (!_hasFocus) {\n      _closeInputConnectionIfNeeded();\n      widget.controller.clearComposing();\n    }\n  }\n\n  bool _restartConnectionScheduled = false;\n  void _scheduleRestartConnection() {\n    if (_restartConnectionScheduled) {\n      return;\n    }\n    _restartConnectionScheduled = true;\n    scheduleMicrotask(_restartConnectionIfNeeded);\n  }\n\n  // Discards the current [TextInputConnection] and establishes a new one.\n  //\n  // This method is rarely needed. This is currently used to reset the input\n  // type when the \"submit\" text input action is triggered and the developer\n  // puts the focus back to this input field..\n  void _restartConnectionIfNeeded() {\n    _restartConnectionScheduled = false;\n    if (!_hasInputConnection || !_shouldCreateInputConnection) {\n      return;\n    }\n    _textInputConnection!.close();\n    _textInputConnection = null;\n    _lastKnownRemoteTextEditingValue = null;\n\n    final AutofillScope? currentAutofillScope = _needsAutofill\n        ? this.currentAutofillScope\n        : null;\n    final TextInputConnection newConnection =\n        currentAutofillScope?.attach(this, textInputConfiguration) ??\n        TextInput.attach(this, _effectiveAutofillClient.textInputConfiguration);\n    _textInputConnection = newConnection;\n\n    newConnection\n      ..show()\n      ..setStyle(\n        fontFamily: _style.fontFamily,\n        fontSize: _style.fontSize,\n        fontWeight: _style.fontWeight,\n        textDirection: _textDirection,\n        textAlign: widget.textAlign,\n      )\n      ..setEditingState(_value);\n    _lastKnownRemoteTextEditingValue = _value;\n  }\n\n  @override\n  void didChangeInputControl(\n    TextInputControl? oldControl,\n    TextInputControl? newControl,\n  ) {\n    if (_hasFocus && _hasInputConnection) {\n      oldControl?.hide();\n      newControl?.show();\n    }\n  }\n\n  @override\n  void connectionClosed() {\n    if (_hasInputConnection) {\n      _textInputConnection!.connectionClosedReceived();\n      _textInputConnection = null;\n      _lastKnownRemoteTextEditingValue = null;\n      widget.focusNode.unfocus();\n    }\n  }\n\n  // Indicates that a call to _handleFocusChanged originated within\n  // EditableText, allowing it to distinguish between internal and external\n  // focus changes.\n  bool _nextFocusChangeIsInternal = false;\n\n  // Sets _nextFocusChangeIsInternal to true only until any subsequent focus\n  // change happens.\n  void _flagInternalFocus() {\n    _nextFocusChangeIsInternal = true;\n    FocusManager.instance.addListener(_unflagInternalFocus);\n  }\n\n  void _unflagInternalFocus() {\n    _nextFocusChangeIsInternal = false;\n    FocusManager.instance.removeListener(_unflagInternalFocus);\n  }\n\n  /// Express interest in interacting with the keyboard.\n  ///\n  /// If this control is already attached to the keyboard, this function will\n  /// request that the keyboard become visible. Otherwise, this function will\n  /// ask the focus system that it become focused. If successful in acquiring\n  /// focus, the control will then attach to the keyboard and request that the\n  /// keyboard become visible.\n  void requestKeyboard() {\n    if (_hasFocus) {\n      _openInputConnection();\n    } else {\n      _flagInternalFocus();\n      widget.focusNode\n          .requestFocus(); // This eventually calls _openInputConnection also, see _handleFocusChanged.\n    }\n  }\n\n  void _updateOrDisposeSelectionOverlayIfNeeded() {\n    if (_selectionOverlay != null) {\n      if (_hasFocus) {\n        _selectionOverlay!.update(_value);\n      } else {\n        _selectionOverlay!.dispose();\n        _selectionOverlay = null;\n      }\n    }\n  }\n\n  final bool _platformSupportsFadeOnScroll = switch (defaultTargetPlatform) {\n    TargetPlatform.android || TargetPlatform.iOS => true,\n    TargetPlatform.fuchsia ||\n    TargetPlatform.linux ||\n    TargetPlatform.macOS ||\n    TargetPlatform.windows => false,\n  };\n\n  bool _isInternalScrollableNotification(BuildContext? notificationContext) {\n    final ScrollableState? scrollableState = notificationContext\n        ?.findAncestorStateOfType<ScrollableState>();\n    return _scrollableKey.currentContext == scrollableState?.context;\n  }\n\n  bool _scrollableNotificationIsFromSameSubtree(\n    BuildContext? notificationContext,\n  ) {\n    if (notificationContext == null) {\n      return false;\n    }\n    BuildContext? currentContext = context;\n    // The notification context of a ScrollNotification points to the RawGestureDetector\n    // of the Scrollable. We get the ScrollableState associated with this notification\n    // by looking up the tree.\n    final ScrollableState? notificationScrollableState = notificationContext\n        .findAncestorStateOfType<ScrollableState>();\n    if (notificationScrollableState == null) {\n      return false;\n    }\n    while (currentContext != null) {\n      final ScrollableState? scrollableState = currentContext\n          .findAncestorStateOfType<ScrollableState>();\n      if (scrollableState == notificationScrollableState) {\n        return true;\n      }\n      currentContext = scrollableState?.context;\n    }\n    return false;\n  }\n\n  void _handleContextMenuOnParentScroll(ScrollNotification notification) {\n    // Do some preliminary checks to avoid expensive subtree traversal.\n    if (notification is! ScrollStartNotification &&\n        notification is! ScrollEndNotification) {\n      return;\n    }\n    switch (notification) {\n      case ScrollStartNotification() when _dataWhenToolbarShowScheduled != null:\n      case ScrollEndNotification() when _dataWhenToolbarShowScheduled == null:\n        break;\n      case ScrollEndNotification()\n          when _dataWhenToolbarShowScheduled!.value != _value:\n        _dataWhenToolbarShowScheduled = null;\n        _disposeScrollNotificationObserver();\n      case ScrollNotification(:final BuildContext? context)\n          when !_isInternalScrollableNotification(context) &&\n              _scrollableNotificationIsFromSameSubtree(context):\n        _handleContextMenuOnScroll(notification);\n    }\n  }\n\n  Rect _calculateDeviceRect() {\n    final Size screenSize = MediaQuery.sizeOf(context);\n    final ui.FlutterView view = View.of(context);\n    final double obscuredVertical =\n        (view.padding.top + view.padding.bottom + view.viewInsets.bottom) /\n        view.devicePixelRatio;\n    final double obscuredHorizontal =\n        (view.padding.left + view.padding.right) / view.devicePixelRatio;\n    final visibleScreenSize = Size(\n      screenSize.width - obscuredHorizontal,\n      screenSize.height - obscuredVertical,\n    );\n    return Rect.fromLTWH(\n      view.padding.left / view.devicePixelRatio,\n      view.padding.top / view.devicePixelRatio,\n      visibleScreenSize.width,\n      visibleScreenSize.height,\n    );\n  }\n\n  bool _showToolbarOnScreenScheduled = false;\n  void _handleContextMenuOnScroll(ScrollNotification notification) {\n    if (_webContextMenuEnabled) {\n      return;\n    }\n    if (!_platformSupportsFadeOnScroll) {\n      _selectionOverlay?.updateForScroll();\n      return;\n    }\n    // When the scroll begins and the toolbar is visible, hide it\n    // until scrolling ends.\n    //\n    // The selection and renderEditable need to be visible within the current\n    // viewport for the toolbar to show when scrolling ends. If they are not\n    // then the toolbar is shown when they are scrolled back into view, unless\n    // invalidated by a change in TextEditingValue.\n    if (notification is ScrollStartNotification) {\n      if (_dataWhenToolbarShowScheduled != null) {\n        return;\n      }\n      final bool toolbarIsVisible =\n          _selectionOverlay != null &&\n          _selectionOverlay!.toolbarIsVisible &&\n          !_selectionOverlay!.spellCheckToolbarIsVisible;\n      if (!toolbarIsVisible) {\n        return;\n      }\n      final List<TextBox> selectionBoxes = renderEditable.getBoxesForSelection(\n        _value.selection,\n      );\n      final Rect selectionBounds =\n          _value.selection.isCollapsed || selectionBoxes.isEmpty\n          ? renderEditable.getLocalRectForCaret(_value.selection.extent)\n          : selectionBoxes\n                .map((TextBox box) => box.toRect())\n                .reduce(\n                  (Rect result, Rect rect) => result.expandToInclude(rect),\n                );\n      _dataWhenToolbarShowScheduled = (\n        value: _value,\n        selectionBounds: selectionBounds,\n      );\n      _selectionOverlay?.hideToolbar();\n    } else if (notification is ScrollEndNotification) {\n      if (_dataWhenToolbarShowScheduled == null) {\n        return;\n      }\n      if (_dataWhenToolbarShowScheduled!.value != _value) {\n        // Value has changed so we should invalidate any toolbar scheduling.\n        _dataWhenToolbarShowScheduled = null;\n        _disposeScrollNotificationObserver();\n        return;\n      }\n\n      if (_showToolbarOnScreenScheduled) {\n        return;\n      }\n      _showToolbarOnScreenScheduled = true;\n      SchedulerBinding.instance.addPostFrameCallback((Duration _) {\n        _showToolbarOnScreenScheduled = false;\n        if (!mounted || _dataWhenToolbarShowScheduled == null) {\n          return;\n        }\n        if (_dataWhenToolbarShowScheduled!.value != _value) {\n          // Value has changed so we should invalidate any toolbar scheduling.\n          _dataWhenToolbarShowScheduled = null;\n          _disposeScrollNotificationObserver();\n          return;\n        }\n        final Rect deviceRect = _calculateDeviceRect();\n        final bool selectionVisibleInEditable =\n            renderEditable.selectionStartInViewport.value ||\n            renderEditable.selectionEndInViewport.value;\n        final Rect selectionBounds = MatrixUtils.transformRect(\n          renderEditable.getTransformTo(null),\n          _dataWhenToolbarShowScheduled!.selectionBounds,\n        );\n        final bool selectionOverlapsWithDeviceRect =\n            !selectionBounds.hasNaN && deviceRect.overlaps(selectionBounds);\n\n        if (selectionVisibleInEditable &&\n            selectionOverlapsWithDeviceRect &&\n            _selectionInViewport(\n              _dataWhenToolbarShowScheduled!.selectionBounds,\n            )) {\n          showToolbar();\n          _dataWhenToolbarShowScheduled = null;\n        }\n      }, debugLabel: 'EditableText.scheduleToolbar');\n    }\n  }\n\n  bool _selectionInViewport(Rect selectionBounds) {\n    RenderAbstractViewport? closestViewport = RenderAbstractViewport.maybeOf(\n      renderEditable,\n    );\n    while (closestViewport != null) {\n      final Rect selectionBoundsLocalToViewport = MatrixUtils.transformRect(\n        renderEditable.getTransformTo(closestViewport),\n        selectionBounds,\n      );\n      if (selectionBoundsLocalToViewport.hasNaN ||\n          closestViewport.paintBounds.hasNaN ||\n          !closestViewport.paintBounds.overlaps(\n            selectionBoundsLocalToViewport,\n          )) {\n        return false;\n      }\n      closestViewport = RenderAbstractViewport.maybeOf(closestViewport.parent);\n    }\n    return true;\n  }\n\n  TextSelectionOverlay _createSelectionOverlay() {\n    final EditableTextContextMenuBuilder? contextMenuBuilder =\n        widget.contextMenuBuilder;\n    final selectionOverlay = TextSelectionOverlay(\n      controller: widget.controller,\n      clipboardStatus: clipboardStatus,\n      context: context,\n      value: _value,\n      debugRequiredFor: widget,\n      toolbarLayerLink: _toolbarLayerLink,\n      startHandleLayerLink: _startHandleLayerLink,\n      endHandleLayerLink: _endHandleLayerLink,\n      renderObject: renderEditable,\n      selectionControls: widget.selectionControls,\n      selectionDelegate: this,\n      dragStartBehavior: widget.dragStartBehavior,\n      onSelectionHandleTapped: widget.onSelectionHandleTapped,\n      contextMenuBuilder: contextMenuBuilder == null || _webContextMenuEnabled\n          ? null\n          : (BuildContext context) {\n              return contextMenuBuilder(context, this);\n            },\n      magnifierConfiguration: widget.magnifierConfiguration,\n    );\n\n    return selectionOverlay;\n  }\n\n  @pragma('vm:notify-debugger-on-exception')\n  void _handleSelectionChanged(\n    TextSelection selection,\n    SelectionChangedCause? cause,\n  ) {\n    // We return early if the selection is not valid. This can happen when the\n    // text of [EditableText] is updated at the same time as the selection is\n    // changed by a gesture event.\n    final String text = widget.controller.value.text;\n    if (text.length < selection.end || text.length < selection.start) {\n      return;\n    }\n\n    widget.controller.selection = selection;\n\n    // This will show the keyboard for all selection changes on the\n    // EditableText except for those triggered by a keyboard input.\n    // Typically EditableText shouldn't take user keyboard input if\n    // it's not focused already. If the EditableText is being\n    // autofilled it shouldn't request focus.\n    switch (cause) {\n      case null:\n      case SelectionChangedCause.doubleTap:\n      case SelectionChangedCause.drag:\n      case SelectionChangedCause.forcePress:\n      case SelectionChangedCause.longPress:\n      case SelectionChangedCause.stylusHandwriting:\n      case SelectionChangedCause.tap:\n      case SelectionChangedCause.toolbar:\n        requestKeyboard();\n      case SelectionChangedCause.keyboard:\n    }\n    if (widget.selectionControls == null && widget.contextMenuBuilder == null) {\n      _selectionOverlay?.dispose();\n      _selectionOverlay = null;\n    } else {\n      if (_selectionOverlay == null) {\n        _selectionOverlay = _createSelectionOverlay();\n      } else {\n        _selectionOverlay!.update(_value);\n      }\n      _selectionOverlay!.handlesVisible = widget.showSelectionHandles;\n      _selectionOverlay!.showHandles();\n    }\n    // TODO(chunhtai): we should make sure selection actually changed before\n    // we call the onSelectionChanged.\n    // https://github.com/flutter/flutter/issues/76349.\n    try {\n      widget.onSelectionChanged?.call(selection, cause);\n    } catch (exception, stack) {\n      FlutterError.reportError(\n        FlutterErrorDetails(\n          exception: exception,\n          stack: stack,\n          library: 'widgets',\n          context: ErrorDescription(\n            'while calling onSelectionChanged for $cause',\n          ),\n        ),\n      );\n    }\n\n    // To keep the cursor from blinking while it moves, restart the timer here.\n    if (_showBlinkingCursor && _cursorTimer != null) {\n      _stopCursorBlink(resetCharTicks: false);\n      _startCursorBlink();\n    }\n  }\n\n  // Animation configuration for scrolling the caret back on screen.\n  static const Duration _caretAnimationDuration = Duration(milliseconds: 100);\n  static const Curve _caretAnimationCurve = Curves.fastOutSlowIn;\n\n  bool _showCaretOnScreenScheduled = false;\n\n  void scheduleShowCaretOnScreen({required bool withAnimation}) {\n    if (_showCaretOnScreenScheduled) {\n      return;\n    }\n    _showCaretOnScreenScheduled = true;\n    SchedulerBinding.instance.addPostFrameCallback((Duration _) {\n      _showCaretOnScreenScheduled = false;\n      // Since we are in a post frame callback, check currentContext in case\n      // RenderEditable has been disposed (in which case it will be null).\n      final renderEditable =\n          _editableKey.currentContext?.findRenderObject() as RenderEditable?;\n      if (renderEditable == null ||\n          !(renderEditable.selection?.isValid ?? false) ||\n          !_scrollController.hasClients) {\n        return;\n      }\n\n      final double lineHeight = renderEditable.preferredLineHeight;\n\n      // Enlarge the target rect by scrollPadding to ensure that caret is not\n      // positioned directly at the edge after scrolling.\n      double bottomSpacing = widget.scrollPadding.bottom;\n      if (_selectionOverlay?.selectionControls != null) {\n        final double handleHeight = _selectionOverlay!.selectionControls!\n            .getHandleSize(lineHeight)\n            .height;\n        final double interactiveHandleHeight = math.max(\n          handleHeight,\n          kMinInteractiveDimension,\n        );\n        final Offset anchor = _selectionOverlay!.selectionControls!\n            .getHandleAnchor(\n              TextSelectionHandleType.collapsed,\n              lineHeight,\n            );\n        final double handleCenter = handleHeight / 2 - anchor.dy;\n        bottomSpacing = math.max(\n          handleCenter + interactiveHandleHeight / 2,\n          bottomSpacing,\n        );\n      }\n\n      final EdgeInsets caretPadding = widget.scrollPadding.copyWith(\n        bottom: bottomSpacing,\n      );\n\n      final Rect caretRect = renderEditable.getLocalRectForCaret(\n        renderEditable.selection!.extent,\n      );\n      final RevealedOffset targetOffset = _getOffsetToRevealCaret(caretRect);\n\n      final Rect rectToReveal;\n      final TextSelection selection = textEditingValue.selection;\n      if (selection.isCollapsed) {\n        rectToReveal = targetOffset.rect;\n      } else {\n        final List<TextBox> selectionBoxes = renderEditable\n            .getBoxesForSelection(selection);\n        // selectionBoxes may be empty if, for example, the selection does not\n        // encompass a full character, like if it only contained part of an\n        // extended grapheme cluster.\n        if (selectionBoxes.isEmpty) {\n          rectToReveal = targetOffset.rect;\n        } else {\n          rectToReveal = selection.baseOffset < selection.extentOffset\n              ? selectionBoxes.last.toRect()\n              : selectionBoxes.first.toRect();\n        }\n      }\n\n      if (withAnimation) {\n        _scrollController.animateTo(\n          targetOffset.offset,\n          duration: _caretAnimationDuration,\n          curve: _caretAnimationCurve,\n        );\n        renderEditable.showOnScreen(\n          rect: caretPadding.inflateRect(rectToReveal),\n          duration: _caretAnimationDuration,\n          curve: _caretAnimationCurve,\n        );\n      } else {\n        _scrollController.jumpTo(targetOffset.offset);\n        renderEditable.showOnScreen(\n          rect: caretPadding.inflateRect(rectToReveal),\n        );\n      }\n    }, debugLabel: 'EditableText.showCaret');\n  }\n\n  late double _lastBottomViewInset;\n\n  @override\n  void didChangeMetrics() {\n    if (!mounted) {\n      return;\n    }\n    final ui.FlutterView view = View.of(context);\n    if (_lastBottomViewInset != view.viewInsets.bottom) {\n      SchedulerBinding.instance.addPostFrameCallback((Duration _) {\n        _selectionOverlay?.updateForScroll();\n      }, debugLabel: 'EditableText.updateForScroll');\n      if (_lastBottomViewInset < view.viewInsets.bottom) {\n        // Because the metrics change signal from engine will come here every frame\n        // (on both iOS and Android). So we don't need to show caret with animation.\n        scheduleShowCaretOnScreen(withAnimation: false);\n      }\n    }\n    _lastBottomViewInset = view.viewInsets.bottom;\n  }\n\n  Future<void> _performSpellCheck(final String text) async {\n    try {\n      final Locale? localeForSpellChecking =\n          widget.locale ?? Localizations.maybeLocaleOf(context);\n\n      assert(\n        localeForSpellChecking != null,\n        'Locale must be specified in widget or Localization widget must be in scope',\n      );\n\n      final List<SuggestionSpan>? suggestions = await _spellCheckConfiguration\n          .spellCheckService!\n          .fetchSpellCheckSuggestions(localeForSpellChecking!, text);\n\n      if (suggestions == null || !mounted) {\n        // The request to fetch spell check suggestions was canceled due to ongoing request,\n        // or the widget was unmounted.\n        return;\n      }\n\n      spellCheckResults = SpellCheckResults(text, suggestions);\n      final double? lineHeightScaleFactor =\n          MediaQuery.maybeLineHeightScaleFactorOverrideOf(\n            context,\n          );\n      final double? letterSpacing = MediaQuery.maybeLetterSpacingOverrideOf(\n        context,\n      );\n      final double? wordSpacing = MediaQuery.maybeWordSpacingOverrideOf(\n        context,\n      );\n      renderEditable.text =\n          _OverridingTextStyleTextSpanUtils.applyTextSpacingOverrides(\n            lineHeightScaleFactor: lineHeightScaleFactor,\n            letterSpacing: letterSpacing,\n            wordSpacing: wordSpacing,\n            textSpan: buildTextSpan(),\n          );\n    } catch (exception, stack) {\n      FlutterError.reportError(\n        FlutterErrorDetails(\n          exception: exception,\n          stack: stack,\n          library: 'widgets',\n          context: ErrorDescription('while performing spell check'),\n        ),\n      );\n    }\n  }\n\n  @pragma('vm:notify-debugger-on-exception')\n  void _formatAndSetValue(\n    TextEditingValue value,\n    SelectionChangedCause? cause, {\n    bool userInteraction = false,\n  }) {\n    final TextEditingValue oldValue = _value;\n    final textChanged = oldValue.text != value.text;\n    final bool textCommitted =\n        !oldValue.composing.isCollapsed && value.composing.isCollapsed;\n    final selectionChanged = oldValue.selection != value.selection;\n\n    if (textChanged || textCommitted) {\n      // Only apply input formatters if the text has changed (including uncommitted\n      // text in the composing region), or when the user committed the composing\n      // text.\n      // Gboard is very persistent in restoring the composing region. Applying\n      // input formatters on composing-region-only changes (except clearing the\n      // current composing region) is very infinite-loop-prone: the formatters\n      // will keep trying to modify the composing region while Gboard will keep\n      // trying to restore the original composing region.\n      try {\n        value =\n            widget.inputFormatters?.fold<TextEditingValue>(\n              value,\n              (TextEditingValue newValue, TextInputFormatter formatter) =>\n                  formatter.formatEditUpdate(_value, newValue),\n            ) ??\n            value;\n\n        if (spellCheckEnabled &&\n            value.text.isNotEmpty &&\n            _value.text != value.text) {\n          _performSpellCheck(value.text);\n        }\n      } catch (exception, stack) {\n        FlutterError.reportError(\n          FlutterErrorDetails(\n            exception: exception,\n            stack: stack,\n            library: 'widgets',\n            context: ErrorDescription('while applying input formatters'),\n          ),\n        );\n      }\n    }\n\n    final TextSelection oldTextSelection = textEditingValue.selection;\n\n    // Put all optional user callback invocations in a batch edit to prevent\n    // sending multiple `TextInput.updateEditingValue` messages.\n    beginBatchEdit();\n    _value = value;\n    // Changes made by the keyboard can sometimes be \"out of band\" for listening\n    // components, so always send those events, even if we didn't think it\n    // changed. Also, the user long pressing should always send a selection change\n    // as well.\n    if (selectionChanged ||\n        (userInteraction &&\n            (cause == SelectionChangedCause.longPress ||\n                cause == SelectionChangedCause.keyboard))) {\n      _handleSelectionChanged(_value.selection, cause);\n      _bringIntoViewBySelectionState(oldTextSelection, value.selection, cause);\n    }\n    final String currentText = _value.text;\n    if (oldValue.text != currentText) {\n      try {\n        widget.onChanged?.call(currentText);\n      } catch (exception, stack) {\n        FlutterError.reportError(\n          FlutterErrorDetails(\n            exception: exception,\n            stack: stack,\n            library: 'widgets',\n            context: ErrorDescription('while calling onChanged'),\n          ),\n        );\n      }\n    }\n    endBatchEdit();\n  }\n\n  void _bringIntoViewBySelectionState(\n    TextSelection oldSelection,\n    TextSelection newSelection,\n    SelectionChangedCause? cause,\n  ) {\n    switch (defaultTargetPlatform) {\n      case TargetPlatform.iOS:\n      case TargetPlatform.macOS:\n        if (cause == SelectionChangedCause.longPress ||\n            cause == SelectionChangedCause.drag) {\n          bringIntoView(newSelection.extent);\n        }\n      case TargetPlatform.linux:\n      case TargetPlatform.windows:\n      case TargetPlatform.fuchsia:\n      case TargetPlatform.android:\n        if (cause == SelectionChangedCause.drag) {\n          if (oldSelection.baseOffset != newSelection.baseOffset) {\n            bringIntoView(newSelection.base);\n          } else if (oldSelection.extentOffset != newSelection.extentOffset) {\n            bringIntoView(newSelection.extent);\n          }\n        }\n    }\n  }\n\n  void _onCursorColorTick() {\n    final double effectiveOpacity = math.min(\n      widget.cursorColor.alpha / 255.0,\n      _cursorBlinkOpacityController.value,\n    );\n    renderEditable.cursorColor = widget.cursorColor.withValues(\n      alpha: effectiveOpacity,\n    );\n    _cursorVisibilityNotifier.value =\n        widget.showCursor &&\n        (EditableText.debugDeterministicCursor ||\n            _cursorBlinkOpacityController.value > 0);\n  }\n\n  bool get _showBlinkingCursor =>\n      _hasFocus &&\n      _value.selection.isCollapsed &&\n      widget.showCursor &&\n      _tickersEnabled &&\n      !renderEditable.floatingCursorOn;\n\n  /// Whether the blinking cursor is actually visible at this precise moment\n  /// (it's hidden half the time, since it blinks).\n  @visibleForTesting\n  bool get cursorCurrentlyVisible => _cursorBlinkOpacityController.value > 0;\n\n  /// The cursor blink interval (the amount of time the cursor is in the \"on\"\n  /// state or the \"off\" state). A complete cursor blink period is twice this\n  /// value (half on, half off).\n  @visibleForTesting\n  Duration get cursorBlinkInterval => _kCursorBlinkHalfPeriod;\n\n  /// The current status of the text selection handles.\n  @visibleForTesting\n  TextSelectionOverlay? get selectionOverlay => _selectionOverlay;\n\n  int _obscureShowCharTicksPending = 0;\n  int? _obscureLatestCharIndex;\n\n  void _startCursorBlink() {\n    assert(\n      !(_cursorTimer?.isActive ?? false) ||\n          !(_backingCursorBlinkOpacityController?.isAnimating ?? false),\n    );\n    if (!widget.showCursor) {\n      return;\n    }\n    if (!_tickersEnabled) {\n      return;\n    }\n    _cursorTimer?.cancel();\n    _cursorBlinkOpacityController.value = 1.0;\n    if (EditableText.debugDeterministicCursor) {\n      return;\n    }\n    if (widget.cursorOpacityAnimates) {\n      _cursorBlinkOpacityController\n          .animateWith(_iosBlinkCursorSimulation)\n          .whenComplete(_onCursorTick);\n    } else {\n      _cursorTimer = Timer.periodic(_kCursorBlinkHalfPeriod, (Timer timer) {\n        _onCursorTick();\n      });\n    }\n  }\n\n  void _onCursorTick() {\n    if (_obscureShowCharTicksPending > 0) {\n      _obscureShowCharTicksPending =\n          WidgetsBinding.instance.platformDispatcher.brieflyShowPassword\n          ? _obscureShowCharTicksPending - 1\n          : 0;\n      if (_obscureShowCharTicksPending == 0) {\n        setState(() {});\n      }\n    }\n\n    if (widget.cursorOpacityAnimates) {\n      _cursorTimer?.cancel();\n      // Schedule this as an async task to avoid blocking tester.pumpAndSettle\n      // indefinitely.\n      _cursorTimer = Timer(\n        Duration.zero,\n        () => _cursorBlinkOpacityController\n            .animateWith(_iosBlinkCursorSimulation)\n            .whenComplete(_onCursorTick),\n      );\n    } else {\n      if (!(_cursorTimer?.isActive ?? false) && _tickersEnabled) {\n        _cursorTimer = Timer.periodic(_kCursorBlinkHalfPeriod, (Timer timer) {\n          _onCursorTick();\n        });\n      }\n      _cursorBlinkOpacityController.value =\n          _cursorBlinkOpacityController.value == 0 ? 1 : 0;\n    }\n  }\n\n  void _stopCursorBlink({bool resetCharTicks = true}) {\n    // If the cursor is animating, stop the animation, and we always\n    // want the cursor to be visible when the floating cursor is enabled.\n    _cursorBlinkOpacityController.value = renderEditable.floatingCursorOn\n        ? 1.0\n        : 0.0;\n    _cursorTimer?.cancel();\n    _cursorTimer = null;\n    if (resetCharTicks) {\n      _obscureShowCharTicksPending = 0;\n    }\n  }\n\n  void _startOrStopCursorTimerIfNeeded() {\n    if (!_showBlinkingCursor) {\n      _stopCursorBlink();\n    } else if (_cursorTimer == null) {\n      _startCursorBlink();\n    }\n  }\n\n  void _didChangeTextEditingValue() {\n    if (_hasFocus && !_value.selection.isValid) {\n      // If this field is focused and the selection is invalid, place the cursor at\n      // the end. Does not rely on _handleFocusChanged because it makes selection\n      // handles visible on Android.\n      // Unregister as a listener to the text controller while making the change.\n      widget.controller.removeListener(_didChangeTextEditingValue);\n      widget.controller.selection = _adjustedSelectionWhenFocused()!;\n      widget.controller.addListener(_didChangeTextEditingValue);\n    }\n    _updateRemoteEditingValueIfNeeded();\n    _startOrStopCursorTimerIfNeeded();\n    _updateOrDisposeSelectionOverlayIfNeeded();\n    // TODO(abarth): Teach RenderEditable about ValueNotifier<TextEditingValue>\n    // to avoid this setState().\n    setState(() {\n      /* We use widget.controller.value in build(). */\n    });\n    _verticalSelectionUpdateAction.stopCurrentVerticalRunIfSelectionChanges();\n  }\n\n  void _handleFocusChanged() {\n    _openOrCloseInputConnectionIfNeeded();\n    _startOrStopCursorTimerIfNeeded();\n    _updateOrDisposeSelectionOverlayIfNeeded();\n    if (_hasFocus) {\n      // Listen for changing viewInsets, which indicates keyboard showing up.\n      WidgetsBinding.instance.addObserver(this);\n      _lastBottomViewInset = View.of(context).viewInsets.bottom;\n      if (!widget.readOnly) {\n        scheduleShowCaretOnScreen(withAnimation: true);\n      }\n      final TextSelection? updatedSelection = _adjustedSelectionWhenFocused();\n      if (updatedSelection != null) {\n        _handleSelectionChanged(updatedSelection, null);\n      }\n    } else {\n      WidgetsBinding.instance.removeObserver(this);\n      setState(() {\n        _currentPromptRectRange = null;\n      });\n    }\n    updateKeepAlive();\n  }\n\n  TextSelection? _adjustedSelectionWhenFocused() {\n    TextSelection? selection;\n    final bool shouldSelectAll =\n        widget.selectAllOnFocus &&\n        widget.selectionEnabled &&\n        !_isMultiline &&\n        !_nextFocusChangeIsInternal &&\n        !_justResumed;\n    _justResumed = false;\n    if (shouldSelectAll) {\n      // On native web and desktop platforms, single line <input> tags\n      // select all when receiving focus.\n      selection = TextSelection(\n        baseOffset: 0,\n        extentOffset: _value.text.length,\n      );\n    } else if (!_value.selection.isValid) {\n      // Place cursor at the end if the selection is invalid when we receive focus.\n      selection = TextSelection.collapsed(offset: _value.text.length);\n    }\n    return selection;\n  }\n\n  void _compositeCallback(Layer layer) {\n    // The callback can be invoked when the layer is detached.\n    // The input connection can be closed by the platform in which case this\n    // widget doesn't rebuild.\n    if (!renderEditable.attached || !_hasInputConnection) {\n      return;\n    }\n    assert(mounted);\n    assert((context as Element).debugIsActive);\n    _updateSizeAndTransform();\n  }\n\n  // Must be called after layout.\n  // See https://github.com/flutter/flutter/issues/126312\n  void _updateSizeAndTransform() {\n    final Size size = renderEditable.size;\n    final Matrix4 transform = renderEditable.getTransformTo(null);\n    _textInputConnection!.setEditableSizeAndTransform(size, transform);\n  }\n\n  void _schedulePeriodicPostFrameCallbacks([Duration? duration]) {\n    if (!_hasInputConnection) {\n      return;\n    }\n    _updateSelectionRects();\n    _updateComposingRectIfNeeded();\n    _updateCaretRectIfNeeded();\n    SchedulerBinding.instance.addPostFrameCallback(\n      _schedulePeriodicPostFrameCallbacks,\n      debugLabel: 'EditableText.postFrameCallbacks',\n    );\n  }\n\n  _ScribbleCacheKey? _scribbleCacheKey;\n\n  void _updateSelectionRects({bool force = false}) {\n    if (!_stylusHandwritingEnabled ||\n        defaultTargetPlatform != TargetPlatform.iOS) {\n      return;\n    }\n\n    final ScrollDirection scrollDirection =\n        _scrollController.position.userScrollDirection;\n    if (scrollDirection != ScrollDirection.idle) {\n      return;\n    }\n\n    final InlineSpan inlineSpan = renderEditable.text!;\n    final double? lineHeightScaleFactor =\n        MediaQuery.maybeLineHeightScaleFactorOverrideOf(context);\n    final TextScaler effectiveTextScaler = switch ((\n      widget.textScaler,\n      widget.textScaleFactor,\n    )) {\n      (final TextScaler textScaler, _) => textScaler,\n      (null, final double textScaleFactor) => TextScaler.linear(\n        textScaleFactor,\n      ),\n      (null, null) => MediaQuery.textScalerOf(context),\n    };\n\n    final newCacheKey = _ScribbleCacheKey(\n      inlineSpan: inlineSpan,\n      textAlign: widget.textAlign,\n      textDirection: _textDirection,\n      textScaler: effectiveTextScaler,\n      textHeightBehavior:\n          widget.textHeightBehavior ??\n          DefaultTextHeightBehavior.maybeOf(context),\n      locale: widget.locale,\n      structStyle: widget.strutStyle.merge(\n        StrutStyle(height: lineHeightScaleFactor),\n      ),\n      placeholder: _placeholderLocation,\n      size: renderEditable.size,\n    );\n\n    final RenderComparison comparison = force\n        ? RenderComparison.layout\n        : _scribbleCacheKey?.compare(newCacheKey) ?? RenderComparison.layout;\n    if (comparison.index < RenderComparison.layout.index) {\n      return;\n    }\n    _scribbleCacheKey = newCacheKey;\n\n    final rects = <SelectionRect>[];\n    var graphemeStart = 0;\n    // Can't use _value.text here: the controller value could change between\n    // frames.\n    final String plainText = inlineSpan.toPlainText(\n      includeSemanticsLabels: false,\n    );\n    final characterRange = CharacterRange(plainText);\n    while (characterRange.moveNext()) {\n      final int graphemeEnd = graphemeStart + characterRange.current.length;\n      final List<TextBox> boxes = renderEditable.getBoxesForSelection(\n        TextSelection(baseOffset: graphemeStart, extentOffset: graphemeEnd),\n      );\n\n      final TextBox? box = boxes.isEmpty ? null : boxes.first;\n      if (box != null) {\n        final Rect paintBounds = renderEditable.paintBounds;\n        // Stop early when characters are already below the bottom edge of the\n        // RenderEditable, regardless of its clipBehavior.\n        if (paintBounds.bottom <= box.top) {\n          break;\n        }\n        // Include any TextBox which intersects with the RenderEditable.\n        if (paintBounds.left <= box.right &&\n            box.left <= paintBounds.right &&\n            paintBounds.top <= box.bottom) {\n          // At least some part of the letter is visible within the text field.\n          rects.add(\n            SelectionRect(\n              position: graphemeStart,\n              bounds: box.toRect(),\n              direction: box.direction,\n            ),\n          );\n        }\n      }\n      graphemeStart = graphemeEnd;\n    }\n    _textInputConnection!.setSelectionRects(rects);\n  }\n\n  // Sends the current composing rect to the embedder's text input plugin.\n  //\n  // In cases where the composing rect hasn't been updated in the embedder due\n  // to the lag of asynchronous messages over the channel, the position of the\n  // current caret rect is used instead.\n  //\n  // See: [_updateCaretRectIfNeeded]\n  void _updateComposingRectIfNeeded() {\n    final TextRange composingRange = _value.composing;\n    assert(mounted);\n    Rect? composingRect = renderEditable.getRectForComposingRange(\n      composingRange,\n    );\n    // Send the caret location instead if there's no marked text yet.\n    if (composingRect == null) {\n      final int offset = composingRange.isValid ? composingRange.start : 0;\n      composingRect = renderEditable.getLocalRectForCaret(\n        TextPosition(offset: offset),\n      );\n    }\n    _textInputConnection!.setComposingRect(composingRect);\n  }\n\n  // Sends the current caret rect to the embedder's text input plugin.\n  //\n  // The position of the caret rect is updated periodically such that if the\n  // user initiates composing input, the current cursor rect can be used for\n  // the first character until the composing rect can be sent.\n  //\n  // On selection changes, the start of the selection is used. This ensures\n  // that regardless of the direction the selection was created, the cursor is\n  // set to the position where next text input occurs. This position is used to\n  // position the IME's candidate selection menu.\n  //\n  // See: [_updateComposingRectIfNeeded]\n  void _updateCaretRectIfNeeded() {\n    final TextSelection? selection = renderEditable.selection;\n    if (selection == null || !selection.isValid) {\n      return;\n    }\n    final currentTextPosition = TextPosition(offset: selection.start);\n    final Rect caretRect = renderEditable.getLocalRectForCaret(\n      currentTextPosition,\n    );\n    _textInputConnection!.setCaretRect(caretRect);\n  }\n\n  TextDirection get _textDirection =>\n      widget.textDirection ?? Directionality.of(context);\n\n  /// The renderer for this widget's descendant.\n  ///\n  /// This property is typically used to notify the renderer of input gestures\n  /// when [RenderEditable.ignorePointer] is true.\n  late final RenderEditable renderEditable =\n      _editableKey.currentContext!.findRenderObject()! as RenderEditable;\n\n  @override\n  TextEditingValue get textEditingValue => _value;\n\n  double get _devicePixelRatio => MediaQuery.devicePixelRatioOf(context);\n\n  @override\n  void userUpdateTextEditingValue(\n    TextEditingValue value,\n    SelectionChangedCause? cause,\n  ) {\n    // Compare the current TextEditingValue with the pre-format new\n    // TextEditingValue value, in case the formatter would reject the change.\n    final shouldShowCaret = widget.readOnly\n        ? _value.selection != value.selection\n        : _value != value;\n    if (shouldShowCaret) {\n      scheduleShowCaretOnScreen(withAnimation: true);\n    }\n\n    // Even if the value doesn't change, it may be necessary to focus and build\n    // the selection overlay. For example, this happens when right clicking an\n    // unfocused field that previously had a selection in the same spot.\n    if (value == textEditingValue) {\n      if (!widget.focusNode.hasFocus) {\n        _flagInternalFocus();\n        widget.focusNode.requestFocus();\n        _selectionOverlay ??= _createSelectionOverlay();\n      }\n      return;\n    }\n\n    _formatAndSetValue(value, cause, userInteraction: true);\n  }\n\n  @override\n  void bringIntoView(TextPosition position) {\n    final Rect localRect = renderEditable.getLocalRectForCaret(position);\n    final RevealedOffset targetOffset = _getOffsetToRevealCaret(localRect);\n\n    _scrollController.jumpTo(targetOffset.offset);\n    renderEditable.showOnScreen(rect: targetOffset.rect);\n  }\n\n  /// Shows the selection toolbar at the location of the current cursor.\n  ///\n  /// Returns `false` if a toolbar couldn't be shown, such as when the toolbar\n  /// is already shown, or when no text selection currently exists.\n  @override\n  bool showToolbar() {\n    // Web is using native dom elements to enable clipboard functionality of the\n    // context menu: copy, paste, select, cut. It might also provide additional\n    // functionality depending on the browser (such as translate). Due to this,\n    // we should not show a Flutter toolbar for the editable text elements\n    // unless the browser's context menu is explicitly disabled.\n    if (_webContextMenuEnabled) {\n      return false;\n    }\n\n    if (_selectionOverlay == null) {\n      return false;\n    }\n    if (_selectionOverlay!.toolbarIsVisible) {\n      return false;\n    }\n    _liveTextInputStatus?.update();\n    clipboardStatus.update();\n    _selectionOverlay!.showToolbar();\n    // Listen to parent scroll events when the toolbar is visible so it can be\n    // hidden during a scroll on supported platforms.\n    if (_platformSupportsFadeOnScroll) {\n      _listeningToScrollNotificationObserver = true;\n      _scrollNotificationObserver?.removeListener(\n        _handleContextMenuOnParentScroll,\n      );\n      _scrollNotificationObserver = ScrollNotificationObserver.maybeOf(context);\n      _scrollNotificationObserver?.addListener(\n        _handleContextMenuOnParentScroll,\n      );\n    }\n    return true;\n  }\n\n  @override\n  void hideToolbar([bool hideHandles = true]) {\n    // Stop listening to parent scroll events when toolbar is hidden.\n    _disposeScrollNotificationObserver();\n    if (hideHandles) {\n      // Hide the handles and the toolbar.\n      _selectionOverlay?.hide();\n    } else if (_selectionOverlay?.toolbarIsVisible ?? false) {\n      // Hide only the toolbar but not the handles.\n      _selectionOverlay?.hideToolbar();\n    }\n  }\n\n  /// Toggles the visibility of the toolbar.\n  void toggleToolbar([bool hideHandles = true]) {\n    final TextSelectionOverlay selectionOverlay = _selectionOverlay ??=\n        _createSelectionOverlay();\n    if (selectionOverlay.toolbarIsVisible) {\n      hideToolbar(hideHandles);\n    } else {\n      showToolbar();\n    }\n  }\n\n  /// Shows toolbar with spell check suggestions of misspelled words that are\n  /// available for click-and-replace.\n  bool showSpellCheckSuggestionsToolbar() {\n    // Spell check suggestions toolbars are intended to be shown on non-web\n    // platforms. Additionally, the Cupertino style toolbar can't be drawn on\n    // the web with the HTML renderer due to\n    // https://github.com/flutter/flutter/issues/123560.\n    if (!spellCheckEnabled ||\n        _webContextMenuEnabled ||\n        widget.readOnly ||\n        _selectionOverlay == null ||\n        !_spellCheckResultsReceived ||\n        findSuggestionSpanAtCursorIndex(\n              textEditingValue.selection.extentOffset,\n            ) ==\n            null) {\n      // Only attempt to show the spell check suggestions toolbar if there\n      // is a toolbar specified and spell check suggestions available to show.\n      return false;\n    }\n\n    assert(\n      _spellCheckConfiguration.spellCheckSuggestionsToolbarBuilder != null,\n      'spellCheckSuggestionsToolbarBuilder must be defined in '\n      'SpellCheckConfiguration to show a toolbar with spell check '\n      'suggestions',\n    );\n\n    _selectionOverlay!.showSpellCheckSuggestionsToolbar((BuildContext context) {\n      return _spellCheckConfiguration.spellCheckSuggestionsToolbarBuilder!(\n        context,\n        this,\n      );\n    });\n    return true;\n  }\n\n  /// Shows the magnifier at the position given by `positionToShow`,\n  /// if no magnifier exists.\n  ///\n  /// Updates the magnifier to the position given by `positionToShow`,\n  /// if a magnifier exits.\n  ///\n  /// Does nothing if a magnifier couldn't be shown, such as when the selection\n  /// overlay does not currently exist.\n  void showMagnifier(Offset positionToShow) {\n    if (_selectionOverlay == null) {\n      return;\n    }\n\n    if (_selectionOverlay!.magnifierExists) {\n      _selectionOverlay!.updateMagnifier(positionToShow);\n    } else {\n      _selectionOverlay!.showMagnifier(positionToShow);\n    }\n  }\n\n  /// Hides the magnifier.\n  void hideMagnifier() {\n    if (_selectionOverlay == null) {\n      return;\n    }\n\n    _selectionOverlay!.hideMagnifier();\n  }\n\n  // Tracks the location a [_ScribblePlaceholder] should be rendered in the\n  // text.\n  //\n  // A value of -1 indicates there should be no placeholder, otherwise the\n  // value should be between 0 and the length of the text, inclusive.\n  int _placeholderLocation = -1;\n\n  @override\n  void insertTextPlaceholder(Size size) {\n    if (!_stylusHandwritingEnabled) {\n      return;\n    }\n\n    if (!widget.controller.selection.isValid) {\n      return;\n    }\n\n    setState(() {\n      _placeholderLocation =\n          _value.text.length - widget.controller.selection.end;\n    });\n  }\n\n  @override\n  void removeTextPlaceholder() {\n    if (!_stylusHandwritingEnabled || _placeholderLocation == -1) {\n      return;\n    }\n\n    setState(() {\n      _placeholderLocation = -1;\n    });\n  }\n\n  @override\n  void performSelector(String selectorName) {\n    final Intent? intent = intentForMacOSSelector(selectorName);\n\n    if (intent != null) {\n      final BuildContext? primaryContext = primaryFocus?.context;\n      if (primaryContext != null) {\n        Actions.invoke(primaryContext, intent);\n      }\n    }\n  }\n\n  @override\n  String get autofillId => 'EditableText-$hashCode';\n\n  int? _viewId;\n\n  @override\n  TextInputConfiguration get textInputConfiguration {\n    final List<String>? autofillHints = widget.autofillHints?.toList(\n      growable: false,\n    );\n    final AutofillConfiguration autofillConfiguration = autofillHints != null\n        ? AutofillConfiguration(\n            uniqueIdentifier: autofillId,\n            autofillHints: autofillHints,\n            currentEditingValue: currentTextEditingValue,\n          )\n        : AutofillConfiguration.disabled;\n\n    _viewId = View.of(context).viewId;\n    return TextInputConfiguration(\n      enableDeltaModel: true,\n      viewId: _viewId,\n      inputType: widget.keyboardType,\n      readOnly: widget.readOnly,\n      obscureText: widget.obscureText,\n      autocorrect: widget.autocorrect,\n      smartDashesType: widget.smartDashesType,\n      smartQuotesType: widget.smartQuotesType,\n      enableSuggestions: widget.enableSuggestions,\n      enableInteractiveSelection: widget._userSelectionEnabled,\n      inputAction:\n          widget.textInputAction ??\n          (widget.keyboardType == TextInputType.multiline\n              ? TextInputAction.newline\n              : TextInputAction.done),\n      textCapitalization: widget.textCapitalization,\n      keyboardAppearance: widget.keyboardAppearance,\n      autofillConfiguration: autofillConfiguration,\n      enableIMEPersonalizedLearning: widget.enableIMEPersonalizedLearning,\n      allowedMimeTypes: widget.contentInsertionConfiguration == null\n          ? const <String>[]\n          : widget.contentInsertionConfiguration!.allowedMimeTypes,\n      hintLocales: widget.hintLocales,\n    );\n  }\n\n  @override\n  void autofill(TextEditingValue value) => updateEditingValue(value);\n\n  // null if no promptRect should be shown.\n  TextRange? _currentPromptRectRange;\n\n  @override\n  void showAutocorrectionPromptRect(int start, int end) {\n    setState(() {\n      _currentPromptRectRange = TextRange(start: start, end: end);\n    });\n  }\n\n  VoidCallback? _semanticsOnCopy(TextSelectionControls? controls) {\n    return widget.selectionEnabled &&\n            _hasFocus &&\n            (widget.selectionControls is TextSelectionHandleControls\n                ? copyEnabled\n                : copyEnabled &&\n                      (widget.selectionControls?.canCopy(this) ?? false))\n        ? () {\n            controls?.handleCopy(this);\n            copySelection(SelectionChangedCause.toolbar);\n          }\n        : null;\n  }\n\n  VoidCallback? _semanticsOnCut(TextSelectionControls? controls) {\n    return widget.selectionEnabled &&\n            _hasFocus &&\n            (widget.selectionControls is TextSelectionHandleControls\n                ? cutEnabled\n                : cutEnabled &&\n                      (widget.selectionControls?.canCut(this) ?? false))\n        ? () {\n            controls?.handleCut(this);\n            cutSelection(SelectionChangedCause.toolbar);\n          }\n        : null;\n  }\n\n  VoidCallback? _semanticsOnPaste(TextSelectionControls? controls) {\n    return widget.selectionEnabled &&\n            _hasFocus &&\n            (widget.selectionControls is TextSelectionHandleControls\n                ? pasteEnabled\n                : pasteEnabled &&\n                      (widget.selectionControls?.canPaste(this) ?? false)) &&\n            (clipboardStatus.value == ClipboardStatus.pasteable)\n        ? () {\n            controls?.handlePaste(this);\n            pasteText(SelectionChangedCause.toolbar);\n          }\n        : null;\n  }\n\n  // Returns the closest boundary location to `extent` but not including `extent`\n  // itself (unless already at the start/end of the text), in the direction\n  // specified by `forward`.\n  TextPosition _moveBeyondTextBoundary(\n    TextPosition extent,\n    bool forward,\n    TextBoundary textBoundary,\n  ) {\n    assert(extent.offset >= 0);\n    final int newOffset = forward\n        ? textBoundary.getTrailingTextBoundaryAt(extent.offset) ??\n              _value.text.length\n        // if x is a boundary defined by `textBoundary`, most textBoundaries (except\n        // LineBreaker) guarantees `x == textBoundary.getLeadingTextBoundaryAt(x)`.\n        // Use x - 1 here to make sure we don't get stuck at the fixed point x.\n        : textBoundary.getLeadingTextBoundaryAt(extent.offset - 1) ?? 0;\n    return TextPosition(offset: newOffset);\n  }\n\n  // Returns the closest boundary location to `extent`, including `extent`\n  // itself, in the direction specified by `forward`.\n  //\n  // This method returns a fixed point of itself: applying `_toTextBoundary`\n  // again on the returned TextPosition gives the same TextPosition. It's used\n  // exclusively for handling line boundaries, since performing \"move to line\n  // start\" more than once usually doesn't move you to the previous line.\n  TextPosition _moveToTextBoundary(\n    TextPosition extent,\n    bool forward,\n    TextBoundary textBoundary,\n  ) {\n    assert(extent.offset >= 0);\n    final int caretOffset;\n    switch (extent.affinity) {\n      case TextAffinity.upstream:\n        if (extent.offset < 1 && !forward) {\n          assert(extent.offset == 0);\n          return const TextPosition(offset: 0);\n        }\n        // When the text affinity is upstream, the caret is associated with the\n        // grapheme before the code unit at `extent.offset`.\n        // TODO(LongCatIsLooong): don't assume extent.offset is at a grapheme\n        // boundary, and do this instead:\n        // final int graphemeStart = CharacterRange.at(string, extent.offset).stringBeforeLength - 1;\n        caretOffset = math.max(0, extent.offset - 1);\n      case TextAffinity.downstream:\n        caretOffset = extent.offset;\n    }\n    // The line boundary range does not include some control characters\n    // (most notably, Line Feed), in which case there's\n    // `x ∉ getTextBoundaryAt(x)`. In case `caretOffset` points to one such\n    // control character, we define that these control characters themselves are\n    // still part of the previous line, but also exclude them from the\n    // line boundary range since they're non-printing. IOW, no additional\n    // processing needed since the LineBoundary class does exactly that.\n    return forward\n        ? TextPosition(\n            offset:\n                textBoundary.getTrailingTextBoundaryAt(caretOffset) ??\n                _value.text.length,\n            affinity: TextAffinity.upstream,\n          )\n        : TextPosition(\n            offset: textBoundary.getLeadingTextBoundaryAt(caretOffset) ?? 0,\n          );\n  }\n\n  // --------------------------- Text Editing Actions ---------------------------\n\n  TextBoundary _characterBoundary() => widget.obscureText\n      ? _CodePointBoundary(_value.text)\n      : CharacterBoundary(_value.text);\n  TextBoundary _nextWordBoundary() => widget.obscureText\n      ? _documentBoundary()\n      : renderEditable.wordBoundaries.moveByWordBoundary;\n  TextBoundary _linebreak() =>\n      widget.obscureText ? _documentBoundary() : LineBoundary(renderEditable);\n  TextBoundary _paragraphBoundary() => ParagraphBoundary(_value.text);\n  TextBoundary _documentBoundary() => DocumentBoundary(_value.text);\n\n  Action<T> _makeOverridable<T extends Intent>(Action<T> defaultAction) {\n    return Action<T>.overridable(\n      context: context,\n      defaultAction: defaultAction,\n    );\n  }\n\n  /// Transpose the characters immediately before and after the current\n  /// collapsed selection.\n  ///\n  /// When the cursor is at the end of the text, transposes the last two\n  /// characters, if they exist.\n  ///\n  /// When the cursor is at the start of the text, does nothing.\n  void _transposeCharacters(TransposeCharactersIntent intent) {\n    if (_value.text.characters.length <= 1 ||\n        !_value.selection.isCollapsed ||\n        _value.selection.baseOffset == 0) {\n      return;\n    }\n\n    final String text = _value.text;\n    final TextSelection selection = _value.selection;\n    final atEnd = selection.baseOffset == text.length;\n    final transposing = CharacterRange.at(text, selection.baseOffset);\n    if (atEnd) {\n      transposing.moveBack(2);\n    } else {\n      transposing\n        ..moveBack()\n        ..expandNext();\n    }\n    assert(transposing.currentCharacters.length == 2);\n\n    userUpdateTextEditingValue(\n      TextEditingValue(\n        text:\n            transposing.stringBefore +\n            transposing.currentCharacters.last +\n            transposing.currentCharacters.first +\n            transposing.stringAfter,\n        selection: TextSelection.collapsed(\n          offset: transposing.stringBeforeLength + transposing.current.length,\n        ),\n      ),\n      SelectionChangedCause.keyboard,\n    );\n  }\n\n  late final Action<TransposeCharactersIntent> _transposeCharactersAction =\n      CallbackAction<TransposeCharactersIntent>(onInvoke: _transposeCharacters);\n\n  void _replaceText(ReplaceTextIntent intent) {\n    final TextEditingValue oldValue = _value;\n    // bggRGjQaUbCoE _replaceText\n    widget.controller.syncRichText(\n      intent.replacementText.isEmpty\n          ? TextEditingDeltaDeletion(\n              oldText: oldValue.text,\n              deletedRange: intent.replacementRange,\n              selection: TextSelection.collapsed(\n                offset: intent.replacementRange.start,\n              ),\n              composing: TextRange.empty,\n            )\n          : TextEditingDeltaReplacement(\n              oldText: oldValue.text,\n              replacementText: intent.replacementText,\n              replacedRange: intent.replacementRange,\n              selection: TextSelection.collapsed(\n                offset: intent.replacementRange.start,\n              ),\n              composing: TextRange.empty,\n            ),\n    );\n\n    final newValue = oldValue.copyWith(\n      text: widget.controller.plainText,\n      selection: widget.controller.newSelection,\n      composing: TextRange.empty,\n    );\n    userUpdateTextEditingValue(newValue, intent.cause);\n\n    // If there's no change in text and selection (e.g. when selecting and\n    // pasting identical text), the widget won't be rebuilt on value update.\n    // Handle this by calling _didChangeTextEditingValue() so caret and scroll\n    // updates can happen.\n    if (newValue == oldValue) {\n      _didChangeTextEditingValue();\n    }\n  }\n\n  late final Action<ReplaceTextIntent> _replaceTextAction =\n      CallbackAction<ReplaceTextIntent>(\n        onInvoke: _replaceText,\n      );\n\n  // Scrolls either to the beginning or end of the document depending on the\n  // intent's `forward` parameter.\n  void _scrollToDocumentBoundary(ScrollToDocumentBoundaryIntent intent) {\n    if (intent.forward) {\n      bringIntoView(TextPosition(offset: _value.text.length));\n    } else {\n      bringIntoView(const TextPosition(offset: 0));\n    }\n  }\n\n  /// Handles [ScrollIntent] by scrolling the [Scrollable] inside of\n  /// [EditableText].\n  void _scroll(ScrollIntent intent) {\n    if (intent.type != ScrollIncrementType.page) {\n      return;\n    }\n\n    final ScrollPosition position = _scrollController.position;\n    if (widget.maxLines == 1) {\n      _scrollController.jumpTo(position.maxScrollExtent);\n      return;\n    }\n\n    // If the field isn't scrollable, do nothing. For example, when the lines of\n    // text is less than maxLines, the field has nothing to scroll.\n    if (position.maxScrollExtent == 0.0 && position.minScrollExtent == 0.0) {\n      return;\n    }\n\n    final state = _scrollableKey.currentState as ScrollableState?;\n    final double increment = ScrollAction.getDirectionalIncrement(\n      state!,\n      intent,\n    );\n    final double destination = clampDouble(\n      position.pixels + increment,\n      position.minScrollExtent,\n      position.maxScrollExtent,\n    );\n    if (destination == position.pixels) {\n      return;\n    }\n    _scrollController.jumpTo(destination);\n  }\n\n  /// Extend the selection down by page if the `forward` parameter is true, or\n  /// up by page otherwise.\n  void _extendSelectionByPage(ExtendSelectionByPageIntent intent) {\n    if (widget.maxLines == 1) {\n      return;\n    }\n\n    final TextSelection nextSelection;\n    final Rect extentRect = renderEditable.getLocalRectForCaret(\n      _value.selection.extent,\n    );\n    final state = _scrollableKey.currentState as ScrollableState?;\n    final double increment = ScrollAction.getDirectionalIncrement(\n      state!,\n      ScrollIntent(\n        direction: intent.forward ? AxisDirection.down : AxisDirection.up,\n        type: ScrollIncrementType.page,\n      ),\n    );\n    final ScrollPosition position = _scrollController.position;\n    if (intent.forward) {\n      if (_value.selection.extentOffset >= _value.text.length) {\n        return;\n      }\n      final nextExtentOffset = Offset(\n        extentRect.left,\n        extentRect.top + increment,\n      );\n      final double height =\n          position.maxScrollExtent + renderEditable.size.height;\n      final TextPosition nextExtent =\n          nextExtentOffset.dy + position.pixels >= height\n          ? TextPosition(offset: _value.text.length)\n          : renderEditable.getPositionForPoint(\n              renderEditable.localToGlobal(nextExtentOffset),\n            );\n      nextSelection = _value.selection.copyWith(\n        extentOffset: nextExtent.offset,\n      );\n    } else {\n      if (_value.selection.extentOffset <= 0) {\n        return;\n      }\n      final nextExtentOffset = Offset(\n        extentRect.left,\n        extentRect.top + increment,\n      );\n      final TextPosition nextExtent = nextExtentOffset.dy + position.pixels <= 0\n          ? const TextPosition(offset: 0)\n          : renderEditable.getPositionForPoint(\n              renderEditable.localToGlobal(nextExtentOffset),\n            );\n      nextSelection = _value.selection.copyWith(\n        extentOffset: nextExtent.offset,\n      );\n    }\n\n    bringIntoView(nextSelection.extent);\n    userUpdateTextEditingValue(\n      _value.copyWith(selection: nextSelection),\n      SelectionChangedCause.keyboard,\n    );\n  }\n\n  void _updateSelection(UpdateSelectionIntent intent) {\n    assert(\n      intent.newSelection.start <= intent.currentTextEditingValue.text.length,\n      'invalid selection: ${intent.newSelection}: it must not exceed the current text length ${intent.currentTextEditingValue.text.length}',\n    );\n    assert(\n      intent.newSelection.end <= intent.currentTextEditingValue.text.length,\n      'invalid selection: ${intent.newSelection}: it must not exceed the current text length ${intent.currentTextEditingValue.text.length}',\n    );\n\n    bringIntoView(intent.newSelection.extent);\n\n    // bggRGjQaUbCoE keyboard\n    TextSelection newSelection = intent.newSelection;\n    if (newSelection.isCollapsed) {\n      newSelection = widget.controller.keyboardOffset(newSelection);\n    } else {\n      newSelection = widget.controller.keyboardOffsets(newSelection);\n    }\n\n    userUpdateTextEditingValue(\n      intent.currentTextEditingValue.copyWith(selection: newSelection),\n      intent.cause,\n    );\n  }\n\n  late final Action<UpdateSelectionIntent> _updateSelectionAction =\n      CallbackAction<UpdateSelectionIntent>(onInvoke: _updateSelection);\n\n  late final _UpdateTextSelectionVerticallyAction<\n    DirectionalCaretMovementIntent\n  >\n  _verticalSelectionUpdateAction =\n      _UpdateTextSelectionVerticallyAction<DirectionalCaretMovementIntent>(\n        this,\n      );\n\n  Object? _hideToolbarIfVisible(DismissIntent intent) {\n    if (_selectionOverlay?.toolbarIsVisible ?? false) {\n      hideToolbar(false);\n      return null;\n    }\n    return Actions.invoke(context, intent);\n  }\n\n  void _onTapOutside(BuildContext context, PointerDownEvent event) {\n    _hadFocusOnTapDown = true;\n\n    if (widget.onTapOutside != null) {\n      widget.onTapOutside!(event);\n    } else {\n      _defaultOnTapOutside(context, event);\n    }\n  }\n\n  void _onTapUpOutside(BuildContext context, PointerUpEvent event) {\n    if (!_hadFocusOnTapDown) {\n      return;\n    }\n\n    // Reset to false so that subsequent events doesn't trigger the callback based on old information.\n    _hadFocusOnTapDown = false;\n\n    if (widget.onTapUpOutside != null) {\n      widget.onTapUpOutside!(event);\n    } else {\n      _defaultOnTapUpOutside(context, event);\n    }\n  }\n\n  /// The default behavior used if [EditableText.onTapOutside] is null.\n  ///\n  /// The `event` argument is the [PointerDownEvent] that caused the notification.\n  void _defaultOnTapOutside(BuildContext context, PointerDownEvent event) {\n    Actions.invoke(\n      context,\n      EditableTextTapOutsideIntent(\n        focusNode: widget.focusNode,\n        pointerDownEvent: event,\n      ),\n    );\n  }\n\n  /// The default behavior used if [EditableText.onTapUpOutside] is null.\n  ///\n  /// The `event` argument is the [PointerUpEvent] that caused the notification.\n  void _defaultOnTapUpOutside(BuildContext context, PointerUpEvent event) {\n    Actions.invoke(\n      context,\n      EditableTextTapUpOutsideIntent(\n        focusNode: widget.focusNode,\n        pointerUpEvent: event,\n      ),\n    );\n  }\n\n  late final Map<Type, Action<Intent>> _actions = <Type, Action<Intent>>{\n    DoNothingAndStopPropagationTextIntent: DoNothingAction(consumesKey: false),\n    ReplaceTextIntent: _replaceTextAction,\n    UpdateSelectionIntent: _updateSelectionAction,\n    DirectionalFocusIntent: DirectionalFocusAction.forTextField(),\n    DismissIntent: CallbackAction<DismissIntent>(\n      onInvoke: _hideToolbarIfVisible,\n    ),\n\n    // Delete\n    DeleteCharacterIntent: _makeOverridable(\n      _DeleteTextAction<DeleteCharacterIntent>(\n        this,\n        _characterBoundary,\n        _moveBeyondTextBoundary,\n      ),\n    ),\n    DeleteToNextWordBoundaryIntent: _makeOverridable(\n      _DeleteTextAction<DeleteToNextWordBoundaryIntent>(\n        this,\n        _nextWordBoundary,\n        _moveBeyondTextBoundary,\n      ),\n    ),\n    DeleteToLineBreakIntent: _makeOverridable(\n      _DeleteTextAction<DeleteToLineBreakIntent>(\n        this,\n        _linebreak,\n        _moveToTextBoundary,\n      ),\n    ),\n\n    // Extend/Move Selection\n    ExtendSelectionByCharacterIntent: _makeOverridable(\n      _UpdateTextSelectionAction<ExtendSelectionByCharacterIntent>(\n        this,\n        _characterBoundary,\n        _moveBeyondTextBoundary,\n        ignoreNonCollapsedSelection: false,\n      ),\n    ),\n    ExtendSelectionByPageIntent: _makeOverridable(\n      CallbackAction<ExtendSelectionByPageIntent>(\n        onInvoke: _extendSelectionByPage,\n      ),\n    ),\n    ExtendSelectionToNextWordBoundaryIntent: _makeOverridable(\n      _UpdateTextSelectionAction<ExtendSelectionToNextWordBoundaryIntent>(\n        this,\n        _nextWordBoundary,\n        _moveBeyondTextBoundary,\n        ignoreNonCollapsedSelection: true,\n      ),\n    ),\n    ExtendSelectionToNextParagraphBoundaryIntent: _makeOverridable(\n      _UpdateTextSelectionAction<ExtendSelectionToNextParagraphBoundaryIntent>(\n        this,\n        _paragraphBoundary,\n        _moveBeyondTextBoundary,\n        ignoreNonCollapsedSelection: true,\n      ),\n    ),\n    ExtendSelectionToLineBreakIntent: _makeOverridable(\n      _UpdateTextSelectionAction<ExtendSelectionToLineBreakIntent>(\n        this,\n        _linebreak,\n        _moveToTextBoundary,\n        ignoreNonCollapsedSelection: true,\n      ),\n    ),\n    ExtendSelectionVerticallyToAdjacentLineIntent: _makeOverridable(\n      _verticalSelectionUpdateAction,\n    ),\n    ExtendSelectionVerticallyToAdjacentPageIntent: _makeOverridable(\n      _verticalSelectionUpdateAction,\n    ),\n    ExtendSelectionToNextParagraphBoundaryOrCaretLocationIntent:\n        _makeOverridable(\n          _UpdateTextSelectionAction<\n            ExtendSelectionToNextParagraphBoundaryOrCaretLocationIntent\n          >(\n            this,\n            _paragraphBoundary,\n            _moveBeyondTextBoundary,\n            ignoreNonCollapsedSelection: true,\n          ),\n        ),\n    ExtendSelectionToDocumentBoundaryIntent: _makeOverridable(\n      _UpdateTextSelectionAction<ExtendSelectionToDocumentBoundaryIntent>(\n        this,\n        _documentBoundary,\n        _moveBeyondTextBoundary,\n        ignoreNonCollapsedSelection: true,\n      ),\n    ),\n    ExtendSelectionToNextWordBoundaryOrCaretLocationIntent: _makeOverridable(\n      _UpdateTextSelectionAction<\n        ExtendSelectionToNextWordBoundaryOrCaretLocationIntent\n      >(\n        this,\n        _nextWordBoundary,\n        _moveBeyondTextBoundary,\n        ignoreNonCollapsedSelection: true,\n      ),\n    ),\n    ScrollToDocumentBoundaryIntent: _makeOverridable(\n      _WebComposingDisablingCallbackAction<ScrollToDocumentBoundaryIntent>(\n        this,\n        onInvoke: _scrollToDocumentBoundary,\n      ),\n    ),\n    ScrollIntent: CallbackAction<ScrollIntent>(onInvoke: _scroll),\n\n    // Expand Selection\n    ExpandSelectionToLineBreakIntent: _makeOverridable(\n      _UpdateTextSelectionAction<ExpandSelectionToLineBreakIntent>(\n        this,\n        _linebreak,\n        _moveToTextBoundary,\n        ignoreNonCollapsedSelection: true,\n        isExpand: true,\n      ),\n    ),\n    ExpandSelectionToDocumentBoundaryIntent: _makeOverridable(\n      _UpdateTextSelectionAction<ExpandSelectionToDocumentBoundaryIntent>(\n        this,\n        _documentBoundary,\n        _moveToTextBoundary,\n        ignoreNonCollapsedSelection: true,\n        isExpand: true,\n        extentAtIndex: true,\n      ),\n    ),\n\n    // Copy Paste\n    SelectAllTextIntent: _makeOverridable(_SelectAllAction(this)),\n    CopySelectionTextIntent: _makeOverridable(_CopySelectionAction(this)),\n    PasteTextIntent: _makeOverridable(_PasteSelectionAction(this)),\n\n    TransposeCharactersIntent: _makeOverridable(_transposeCharactersAction),\n    EditableTextTapOutsideIntent: _makeOverridable(\n      _EditableTextTapOutsideAction(),\n    ),\n    EditableTextTapUpOutsideIntent: _makeOverridable(\n      _EditableTextTapUpOutsideAction(),\n    ),\n  };\n\n  @protected\n  @override\n  Widget build(BuildContext context) {\n    assert(debugCheckHasMediaQuery(context));\n    super.build(context); // See AutomaticKeepAliveClientMixin.\n\n    final TextSelectionControls? controls = widget.selectionControls;\n    final TextScaler effectiveTextScaler = switch ((\n      widget.textScaler,\n      widget.textScaleFactor,\n    )) {\n      (final TextScaler textScaler, _) => textScaler,\n      (null, final double textScaleFactor) => TextScaler.linear(\n        textScaleFactor,\n      ),\n      (null, null) => MediaQuery.textScalerOf(context),\n    };\n    final double? lineHeightScaleFactor =\n        MediaQuery.maybeLineHeightScaleFactorOverrideOf(context);\n    final double? letterSpacing = MediaQuery.maybeLetterSpacingOverrideOf(\n      context,\n    );\n    final double? wordSpacing = MediaQuery.maybeWordSpacingOverrideOf(context);\n    final ui.SemanticsInputType inputType;\n    switch (widget.keyboardType) {\n      case TextInputType.phone:\n        inputType = ui.SemanticsInputType.phone;\n      case TextInputType.url:\n        inputType = ui.SemanticsInputType.url;\n      case TextInputType.emailAddress:\n        inputType = ui.SemanticsInputType.email;\n      default:\n        inputType = ui.SemanticsInputType.text;\n    }\n\n    return _CompositionCallback(\n      compositeCallback: _compositeCallback,\n      enabled: _hasInputConnection,\n      child: Actions(\n        actions: _actions,\n        child: Builder(\n          builder: (BuildContext context) {\n            return TextFieldTapRegion(\n              groupId: widget.groupId,\n              onTapOutside: _hasFocus\n                  ? (PointerDownEvent event) => _onTapOutside(context, event)\n                  : null,\n              onTapUpOutside: (PointerUpEvent event) =>\n                  _onTapUpOutside(context, event),\n              debugLabel: kReleaseMode ? null : 'EditableText',\n              child: MouseRegion(\n                cursor: widget.mouseCursor ?? SystemMouseCursors.text,\n                child: Focus(\n                  focusNode: widget.focusNode,\n                  includeSemantics: false,\n                  debugLabel: kReleaseMode ? null : 'EditableText',\n                  child: NotificationListener<ScrollNotification>(\n                    onNotification: (ScrollNotification notification) {\n                      _handleContextMenuOnScroll(notification);\n                      _scribbleCacheKey = null;\n                      return false;\n                    },\n                    child: Scrollable(\n                      key: _scrollableKey,\n                      excludeFromSemantics: true,\n                      axisDirection: _isMultiline\n                          ? AxisDirection.down\n                          : AxisDirection.right,\n                      controller: _scrollController,\n                      // On iOS a single-line TextField should not scroll.\n                      physics:\n                          widget.scrollPhysics ??\n                          (!_isMultiline &&\n                                  defaultTargetPlatform == TargetPlatform.iOS\n                              ? const _NeverUserScrollableScrollPhysics()\n                              : null),\n                      dragStartBehavior: widget.dragStartBehavior,\n                      restorationId: widget.restorationId,\n                      // If a ScrollBehavior is not provided, only apply scrollbars when\n                      // multiline. The overscroll indicator should not be applied in\n                      // either case, glowing or stretching.\n                      scrollBehavior:\n                          widget.scrollBehavior ??\n                          ScrollConfiguration.of(\n                            context,\n                          ).copyWith(\n                            scrollbars: _isMultiline,\n                            overscroll: false,\n                          ),\n                      viewportBuilder:\n                          (BuildContext context, ViewportOffset offset) {\n                            return CompositedTransformTarget(\n                              link: _toolbarLayerLink,\n                              child: Semantics(\n                                inputType: inputType,\n                                onCopy: _semanticsOnCopy(controls),\n                                onCut: _semanticsOnCut(controls),\n                                onPaste: _semanticsOnPaste(controls),\n                                child: _ScribbleFocusable(\n                                  editableKey: _editableKey,\n                                  enabled: _stylusHandwritingEnabled,\n                                  focusNode: widget.focusNode,\n                                  updateSelectionRects: () {\n                                    _openInputConnection();\n                                    _updateSelectionRects(force: true);\n                                  },\n                                  child: SizeChangedLayoutNotifier(\n                                    child: _Editable(\n                                      key: _editableKey,\n                                      controller: widget.controller,\n                                      startHandleLayerLink:\n                                          _startHandleLayerLink,\n                                      endHandleLayerLink: _endHandleLayerLink,\n                                      inlineSpan:\n                                          _OverridingTextStyleTextSpanUtils.applyTextSpacingOverrides(\n                                            lineHeightScaleFactor:\n                                                lineHeightScaleFactor,\n                                            letterSpacing: letterSpacing,\n                                            wordSpacing: wordSpacing,\n                                            textSpan: buildTextSpan(),\n                                          ),\n                                      value: _value,\n                                      cursorColor: _cursorColor,\n                                      backgroundCursorColor:\n                                          widget.backgroundCursorColor,\n                                      showCursor: _cursorVisibilityNotifier,\n                                      forceLine: widget.forceLine,\n                                      readOnly: widget.readOnly,\n                                      hasFocus: _hasFocus,\n                                      maxLines: widget.maxLines,\n                                      minLines: widget.minLines,\n                                      expands: widget.expands,\n                                      strutStyle: widget.strutStyle.merge(\n                                        StrutStyle(\n                                          height: lineHeightScaleFactor,\n                                        ),\n                                      ),\n                                      selectionColor:\n                                          _selectionOverlay\n                                                  ?.spellCheckToolbarIsVisible ??\n                                              false\n                                          ? _spellCheckConfiguration\n                                                    .misspelledSelectionColor ??\n                                                widget.selectionColor\n                                          : widget.selectionColor,\n                                      textScaler: effectiveTextScaler,\n                                      textAlign: widget.textAlign,\n                                      textDirection: _textDirection,\n                                      locale: widget.locale,\n                                      textHeightBehavior:\n                                          widget.textHeightBehavior ??\n                                          DefaultTextHeightBehavior.maybeOf(\n                                            context,\n                                          ),\n                                      textWidthBasis: widget.textWidthBasis,\n                                      obscuringCharacter:\n                                          widget.obscuringCharacter,\n                                      obscureText: widget.obscureText,\n                                      offset: offset,\n                                      rendererIgnoresPointer:\n                                          widget.rendererIgnoresPointer,\n                                      cursorWidth: widget.cursorWidth,\n                                      cursorHeight: widget.cursorHeight,\n                                      cursorRadius: widget.cursorRadius,\n                                      cursorOffset:\n                                          widget.cursorOffset ?? Offset.zero,\n                                      selectionHeightStyle:\n                                          widget.selectionHeightStyle,\n                                      selectionWidthStyle:\n                                          widget.selectionWidthStyle,\n                                      paintCursorAboveText:\n                                          widget.paintCursorAboveText,\n                                      enableInteractiveSelection:\n                                          widget._userSelectionEnabled,\n                                      textSelectionDelegate: this,\n                                      devicePixelRatio: _devicePixelRatio,\n                                      promptRectRange: _currentPromptRectRange,\n                                      promptRectColor:\n                                          widget.autocorrectionTextRectColor,\n                                      clipBehavior: widget.clipBehavior,\n                                    ),\n                                  ),\n                                ),\n                              ),\n                            );\n                          },\n                    ),\n                  ),\n                ),\n              ),\n            );\n          },\n        ),\n      ),\n    );\n  }\n\n  /// Builds [TextSpan] from current editing value.\n  ///\n  /// By default makes text in composing range appear as underlined.\n  /// Descendants can override this method to customize appearance of text.\n  TextSpan buildTextSpan() {\n    if (widget.obscureText) {\n      String text = _value.text;\n      text = widget.obscuringCharacter * text.length;\n      // Reveal the latest character in an obscured field only on mobile.\n      const mobilePlatforms = <TargetPlatform>{\n        TargetPlatform.android,\n        TargetPlatform.fuchsia,\n        TargetPlatform.iOS,\n      };\n      final bool brieflyShowPassword =\n          WidgetsBinding.instance.platformDispatcher.brieflyShowPassword &&\n          mobilePlatforms.contains(defaultTargetPlatform);\n      if (brieflyShowPassword) {\n        final int? o = _obscureShowCharTicksPending > 0\n            ? _obscureLatestCharIndex\n            : null;\n        if (o != null && o >= 0 && o < text.length) {\n          text = text.replaceRange(o, o + 1, _value.text.substring(o, o + 1));\n        }\n      }\n      return TextSpan(style: _style, text: text);\n    }\n    if (_placeholderLocation >= 0 &&\n        _placeholderLocation <= _value.text.length) {\n      final placeholders = <_ScribblePlaceholder>[];\n      final int placeholderLocation = _value.text.length - _placeholderLocation;\n      if (_isMultiline) {\n        // The zero size placeholder here allows the line to break and keep the caret on the first line.\n        placeholders\n          ..add(\n            const _ScribblePlaceholder(\n              child: SizedBox.shrink(),\n              size: Size.zero,\n            ),\n          )\n          ..add(\n            _ScribblePlaceholder(\n              child: const SizedBox.shrink(),\n              size: Size(renderEditable.size.width, 0.0),\n            ),\n          );\n      } else {\n        placeholders.add(\n          const _ScribblePlaceholder(\n            child: SizedBox.shrink(),\n            size: Size(100.0, 0.0),\n          ),\n        );\n      }\n      return TextSpan(\n        style: _style,\n        children: <InlineSpan>[\n          TextSpan(text: _value.text.substring(0, placeholderLocation)),\n          ...placeholders,\n          TextSpan(text: _value.text.substring(placeholderLocation)),\n        ],\n      );\n    }\n    final bool withComposing = !widget.readOnly && _hasFocus;\n    if (_spellCheckResultsReceived) {\n      // If the composing range is out of range for the current text, ignore it to\n      // preserve the tree integrity, otherwise in release mode a RangeError will\n      // be thrown and this EditableText will be built with a broken subtree.\n      assert(\n        !_value.composing.isValid ||\n            !withComposing ||\n            _value.isComposingRangeValid,\n      );\n\n      final bool composingRegionOutOfRange =\n          !_value.isComposingRangeValid || !withComposing;\n\n      return buildTextSpanWithSpellCheckSuggestions(\n        _value,\n        composingRegionOutOfRange,\n        _style,\n        _spellCheckConfiguration.misspelledTextStyle!,\n        spellCheckResults!,\n      );\n    }\n\n    // Read only mode should not paint text composing.\n    return widget.controller.buildTextSpan(\n      context: context,\n      style: _style,\n      withComposing: withComposing,\n    );\n  }\n}\n\nclass _Editable extends MultiChildRenderObjectWidget {\n  _Editable({\n    super.key,\n    required this.inlineSpan,\n    required this.value,\n    required this.startHandleLayerLink,\n    required this.endHandleLayerLink,\n    this.cursorColor,\n    this.backgroundCursorColor,\n    required this.showCursor,\n    required this.forceLine,\n    required this.readOnly,\n    this.textHeightBehavior,\n    required this.textWidthBasis,\n    required this.hasFocus,\n    required this.maxLines,\n    this.minLines,\n    required this.expands,\n    this.strutStyle,\n    this.selectionColor,\n    required this.textScaler,\n    required this.textAlign,\n    required this.textDirection,\n    this.locale,\n    required this.obscuringCharacter,\n    required this.obscureText,\n    required this.offset,\n    this.rendererIgnoresPointer = false,\n    required this.cursorWidth,\n    this.cursorHeight,\n    this.cursorRadius,\n    required this.cursorOffset,\n    required this.paintCursorAboveText,\n    ui.BoxHeightStyle? selectionHeightStyle,\n    ui.BoxWidthStyle? selectionWidthStyle,\n    this.enableInteractiveSelection = true,\n    required this.textSelectionDelegate,\n    required this.devicePixelRatio,\n    this.promptRectRange,\n    this.promptRectColor,\n    required this.clipBehavior,\n    required this.controller,\n  }) : selectionHeightStyle =\n           selectionHeightStyle ?? EditableText.defaultSelectionHeightStyle,\n       selectionWidthStyle =\n           selectionWidthStyle ?? EditableText.defaultSelectionWidthStyle,\n       super(\n         children: WidgetSpan.extractFromInlineSpan(inlineSpan, textScaler),\n       );\n\n  final InlineSpan inlineSpan;\n  final TextEditingValue value;\n  final Color? cursorColor;\n  final LayerLink startHandleLayerLink;\n  final LayerLink endHandleLayerLink;\n  final Color? backgroundCursorColor;\n  final ValueNotifier<bool> showCursor;\n  final bool forceLine;\n  final bool readOnly;\n  final bool hasFocus;\n  final int? maxLines;\n  final int? minLines;\n  final bool expands;\n  final StrutStyle? strutStyle;\n  final Color? selectionColor;\n  final TextScaler textScaler;\n  final TextAlign textAlign;\n  final TextDirection textDirection;\n  final Locale? locale;\n  final String obscuringCharacter;\n  final bool obscureText;\n  final TextHeightBehavior? textHeightBehavior;\n  final TextWidthBasis textWidthBasis;\n  final ViewportOffset offset;\n  final bool rendererIgnoresPointer;\n  final double cursorWidth;\n  final double? cursorHeight;\n  final Radius? cursorRadius;\n  final Offset cursorOffset;\n  final bool paintCursorAboveText;\n  final ui.BoxHeightStyle selectionHeightStyle;\n  final ui.BoxWidthStyle selectionWidthStyle;\n  final bool enableInteractiveSelection;\n  final TextSelectionDelegate textSelectionDelegate;\n  final double devicePixelRatio;\n  final TextRange? promptRectRange;\n  final Color? promptRectColor;\n  final Clip clipBehavior;\n  final RichTextEditingController controller;\n\n  @override\n  RenderEditable createRenderObject(BuildContext context) {\n    return RenderEditable(\n      controller: controller,\n      text: inlineSpan,\n      cursorColor: cursorColor,\n      startHandleLayerLink: startHandleLayerLink,\n      endHandleLayerLink: endHandleLayerLink,\n      backgroundCursorColor: backgroundCursorColor,\n      showCursor: showCursor,\n      forceLine: forceLine,\n      readOnly: readOnly,\n      hasFocus: hasFocus,\n      maxLines: maxLines,\n      minLines: minLines,\n      expands: expands,\n      strutStyle: strutStyle,\n      selectionColor: selectionColor,\n      textScaler: textScaler,\n      textAlign: textAlign,\n      textDirection: textDirection,\n      locale: locale ?? Localizations.maybeLocaleOf(context),\n      selection: value.selection,\n      offset: offset,\n      ignorePointer: rendererIgnoresPointer,\n      obscuringCharacter: obscuringCharacter,\n      obscureText: obscureText,\n      textHeightBehavior: textHeightBehavior,\n      textWidthBasis: textWidthBasis,\n      cursorWidth: cursorWidth,\n      cursorHeight: cursorHeight,\n      cursorRadius: cursorRadius,\n      cursorOffset: cursorOffset,\n      paintCursorAboveText: paintCursorAboveText,\n      selectionHeightStyle: selectionHeightStyle,\n      selectionWidthStyle: selectionWidthStyle,\n      enableInteractiveSelection: enableInteractiveSelection,\n      textSelectionDelegate: textSelectionDelegate,\n      devicePixelRatio: devicePixelRatio,\n      promptRectRange: promptRectRange,\n      promptRectColor: promptRectColor,\n      clipBehavior: clipBehavior,\n    );\n  }\n\n  @override\n  void updateRenderObject(BuildContext context, RenderEditable renderObject) {\n    renderObject\n      ..text = inlineSpan\n      ..cursorColor = cursorColor\n      ..startHandleLayerLink = startHandleLayerLink\n      ..endHandleLayerLink = endHandleLayerLink\n      ..backgroundCursorColor = backgroundCursorColor\n      ..showCursor = showCursor\n      ..forceLine = forceLine\n      ..readOnly = readOnly\n      ..hasFocus = hasFocus\n      ..maxLines = maxLines\n      ..minLines = minLines\n      ..expands = expands\n      ..strutStyle = strutStyle\n      ..selectionColor = selectionColor\n      ..textScaler = textScaler\n      ..textAlign = textAlign\n      ..textDirection = textDirection\n      ..locale = locale ?? Localizations.maybeLocaleOf(context)\n      ..selection = value.selection\n      ..offset = offset\n      ..ignorePointer = rendererIgnoresPointer\n      ..textHeightBehavior = textHeightBehavior\n      ..textWidthBasis = textWidthBasis\n      ..obscuringCharacter = obscuringCharacter\n      ..obscureText = obscureText\n      ..cursorWidth = cursorWidth\n      ..cursorHeight = cursorHeight\n      ..cursorRadius = cursorRadius\n      ..cursorOffset = cursorOffset\n      ..selectionHeightStyle = selectionHeightStyle\n      ..selectionWidthStyle = selectionWidthStyle\n      ..enableInteractiveSelection = enableInteractiveSelection\n      ..textSelectionDelegate = textSelectionDelegate\n      ..devicePixelRatio = devicePixelRatio\n      ..paintCursorAboveText = paintCursorAboveText\n      ..promptRectColor = promptRectColor\n      ..clipBehavior = clipBehavior\n      ..setPromptRectRange(promptRectRange);\n  }\n}\n\nclass _NeverUserScrollableScrollPhysics extends ScrollPhysics {\n  /// Creates a scroll physics that prevents scrolling with user input, for example\n  /// by dragging, but still allows for programmatic scrolling.\n  const _NeverUserScrollableScrollPhysics({super.parent});\n\n  @override\n  _NeverUserScrollableScrollPhysics applyTo(ScrollPhysics? ancestor) {\n    return _NeverUserScrollableScrollPhysics(parent: buildParent(ancestor));\n  }\n\n  @override\n  bool get allowUserScrolling => false;\n}\n\n@immutable\nclass _ScribbleCacheKey {\n  const _ScribbleCacheKey({\n    required this.inlineSpan,\n    required this.textAlign,\n    required this.textDirection,\n    required this.textScaler,\n    required this.textHeightBehavior,\n    required this.locale,\n    required this.structStyle,\n    required this.placeholder,\n    required this.size,\n  });\n\n  final TextAlign textAlign;\n  final TextDirection textDirection;\n  final TextScaler textScaler;\n  final TextHeightBehavior? textHeightBehavior;\n  final Locale? locale;\n  final StrutStyle structStyle;\n  final int placeholder;\n  final Size size;\n  final InlineSpan inlineSpan;\n\n  RenderComparison compare(_ScribbleCacheKey other) {\n    if (identical(other, this)) {\n      return RenderComparison.identical;\n    }\n    final bool needsLayout =\n        textAlign != other.textAlign ||\n        textDirection != other.textDirection ||\n        textScaler != other.textScaler ||\n        (textHeightBehavior ?? const TextHeightBehavior()) !=\n            (other.textHeightBehavior ?? const TextHeightBehavior()) ||\n        locale != other.locale ||\n        structStyle != other.structStyle ||\n        placeholder != other.placeholder ||\n        size != other.size;\n    return needsLayout\n        ? RenderComparison.layout\n        : inlineSpan.compareTo(other.inlineSpan);\n  }\n}\n\nclass _ScribbleFocusable extends StatefulWidget {\n  const _ScribbleFocusable({\n    required this.child,\n    required this.focusNode,\n    required this.editableKey,\n    required this.updateSelectionRects,\n    required this.enabled,\n  });\n\n  final Widget child;\n  final FocusNode focusNode;\n  final GlobalKey editableKey;\n  final VoidCallback updateSelectionRects;\n  final bool enabled;\n\n  @override\n  _ScribbleFocusableState createState() => _ScribbleFocusableState();\n}\n\nclass _ScribbleFocusableState extends State<_ScribbleFocusable>\n    implements ScribbleClient {\n  _ScribbleFocusableState()\n    : _elementIdentifier = (_nextElementIdentifier++).toString();\n\n  @override\n  void initState() {\n    super.initState();\n    if (widget.enabled) {\n      TextInput.registerScribbleElement(elementIdentifier, this);\n    }\n  }\n\n  @override\n  void didUpdateWidget(_ScribbleFocusable oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (!oldWidget.enabled && widget.enabled) {\n      TextInput.registerScribbleElement(elementIdentifier, this);\n    }\n\n    if (oldWidget.enabled && !widget.enabled) {\n      TextInput.unregisterScribbleElement(elementIdentifier);\n    }\n  }\n\n  @override\n  void dispose() {\n    TextInput.unregisterScribbleElement(elementIdentifier);\n    super.dispose();\n  }\n\n  RenderEditable? get renderEditable =>\n      widget.editableKey.currentContext?.findRenderObject() as RenderEditable?;\n\n  static int _nextElementIdentifier = 1;\n  final String _elementIdentifier;\n\n  @override\n  String get elementIdentifier => _elementIdentifier;\n\n  @override\n  void onScribbleFocus(Offset offset) {\n    widget.focusNode.requestFocus();\n    renderEditable?.selectPositionAt(\n      from: offset,\n      cause: SelectionChangedCause.stylusHandwriting,\n    );\n    widget.updateSelectionRects();\n  }\n\n  @override\n  bool isInScribbleRect(Rect rect) {\n    final Rect calculatedBounds = bounds;\n    if (renderEditable?.readOnly ?? false) {\n      return false;\n    }\n    if (calculatedBounds == Rect.zero) {\n      return false;\n    }\n    if (!calculatedBounds.overlaps(rect)) {\n      return false;\n    }\n    final Rect intersection = calculatedBounds.intersect(rect);\n    final result = HitTestResult();\n    WidgetsBinding.instance.hitTestInView(\n      result,\n      intersection.center,\n      View.of(context).viewId,\n    );\n    return result.path.any(\n      (HitTestEntry entry) => entry.target == renderEditable,\n    );\n  }\n\n  @override\n  Rect get bounds {\n    final box = context.findRenderObject() as RenderBox?;\n    if (box == null || !mounted || !box.attached) {\n      return Rect.zero;\n    }\n    final Matrix4 transform = box.getTransformTo(null);\n    return MatrixUtils.transformRect(\n      transform,\n      Rect.fromLTRB(0, 0, box.size.width, box.size.height),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return widget.child;\n  }\n}\n\nclass _ScribblePlaceholder extends WidgetSpan {\n  const _ScribblePlaceholder({required super.child, required this.size});\n\n  /// The size of the span, used in place of adding a placeholder size to the [TextPainter].\n  final Size size;\n\n  @override\n  void build(\n    ui.ParagraphBuilder builder, {\n    TextScaler textScaler = TextScaler.noScaling,\n    List<PlaceholderDimensions>? dimensions,\n  }) {\n    assert(debugAssertIsValid());\n    final hasStyle = style != null;\n    if (hasStyle) {\n      builder.pushStyle(style!.getTextStyle(textScaler: textScaler));\n    }\n    builder.addPlaceholder(size.width, size.height, alignment);\n    if (hasStyle) {\n      builder.pop();\n    }\n  }\n}\n\n/// A text boundary that uses code points as logical boundaries.\n///\n/// A code point represents a single character. This may be smaller than what is\n/// represented by a user-perceived character, or grapheme. For example, a\n/// single grapheme (in this case a Unicode extended grapheme cluster) like\n/// \"👨‍👩‍👦\" consists of five code points: the man emoji, a zero\n/// width joiner, the woman emoji, another zero width joiner, and the boy emoji.\n/// The [String] has a length of eight because each emoji consists of two code\n/// units.\n///\n/// Code units are the units by which Dart's String class is measured, which is\n/// encoded in UTF-16.\n///\n/// See also:\n///\n///  * [String.runes], which deals with code points like this class.\n///  * [Characters], which deals with graphemes.\n///  * [CharacterBoundary], which is a [TextBoundary] like this class, but whose\n///    boundaries are graphemes instead of code points.\nclass _CodePointBoundary extends TextBoundary {\n  const _CodePointBoundary(this._text);\n\n  final String _text;\n\n  // Returns true if the given position falls in the center of a surrogate pair.\n  bool _breaksSurrogatePair(int position) {\n    assert(position > 0 && position < _text.length && _text.length > 1);\n    return TextPainter.isHighSurrogate(_text.codeUnitAt(position - 1)) &&\n        TextPainter.isLowSurrogate(_text.codeUnitAt(position));\n  }\n\n  @override\n  int? getLeadingTextBoundaryAt(int position) {\n    if (_text.isEmpty || position < 0) {\n      return null;\n    }\n    if (position == 0) {\n      return 0;\n    }\n    if (position >= _text.length) {\n      return _text.length;\n    }\n    if (_text.length <= 1) {\n      return position;\n    }\n\n    return _breaksSurrogatePair(position) ? position - 1 : position;\n  }\n\n  @override\n  int? getTrailingTextBoundaryAt(int position) {\n    if (_text.isEmpty || position >= _text.length) {\n      return null;\n    }\n    if (position < 0) {\n      return 0;\n    }\n    if (position == _text.length - 1) {\n      return _text.length;\n    }\n    if (_text.length <= 1) {\n      return position;\n    }\n\n    return _breaksSurrogatePair(position + 1) ? position + 2 : position + 1;\n  }\n}\n\n// -------------------------------  Text Actions -------------------------------\nclass _DeleteTextAction<T extends DirectionalTextEditingIntent>\n    extends ContextAction<T> {\n  _DeleteTextAction(this.state, this.getTextBoundary, this._applyTextBoundary);\n\n  final EditableTextState state;\n  final TextBoundary Function() getTextBoundary;\n  final _ApplyTextBoundary _applyTextBoundary;\n\n  void _hideToolbarIfTextChanged(ReplaceTextIntent intent) {\n    if (state._selectionOverlay == null ||\n        !state.selectionOverlay!.toolbarIsVisible) {\n      return;\n    }\n    final TextEditingValue oldValue = intent.currentTextEditingValue;\n    final TextEditingValue newValue = intent.currentTextEditingValue.replaced(\n      intent.replacementRange,\n      intent.replacementText,\n    );\n    if (oldValue.text != newValue.text) {\n      // Hide the toolbar if the text was changed, but only hide the toolbar\n      // overlay; the selection handle's visibility will be handled\n      // by `_handleSelectionChanged`.\n      state.hideToolbar(false);\n    }\n  }\n\n  @override\n  Object? invoke(T intent, [BuildContext? context]) {\n    final TextSelection selection = state._value.selection;\n    if (!selection.isValid) {\n      return null;\n    }\n    assert(selection.isValid);\n    // Expands the selection to ensure the range covers full graphemes.\n    final TextBoundary atomicBoundary = state._characterBoundary();\n    if (!selection.isCollapsed) {\n      // Expands the selection to ensure the range covers full graphemes.\n      final range = TextRange(\n        start:\n            atomicBoundary.getLeadingTextBoundaryAt(selection.start) ??\n            state._value.text.length,\n        end: atomicBoundary.getTrailingTextBoundaryAt(selection.end - 1) ?? 0,\n      );\n      final replaceTextIntent = ReplaceTextIntent(\n        state._value,\n        '',\n        range,\n        SelectionChangedCause.keyboard,\n      );\n      _hideToolbarIfTextChanged(replaceTextIntent);\n      return Actions.invoke(context!, replaceTextIntent);\n    }\n\n    final int target = _applyTextBoundary(\n      selection.base,\n      intent.forward,\n      getTextBoundary(),\n    ).offset;\n\n    final TextRange rangeToDelete = TextSelection(\n      baseOffset: intent.forward\n          ? atomicBoundary.getLeadingTextBoundaryAt(selection.baseOffset) ??\n                state._value.text.length\n          : atomicBoundary.getTrailingTextBoundaryAt(\n                  selection.baseOffset - 1,\n                ) ??\n                0,\n      extentOffset: target,\n    );\n    final replaceTextIntent = ReplaceTextIntent(\n      state._value,\n      '',\n      rangeToDelete,\n      SelectionChangedCause.keyboard,\n    );\n    _hideToolbarIfTextChanged(replaceTextIntent);\n    return Actions.invoke(context!, replaceTextIntent);\n  }\n\n  @override\n  bool get isActionEnabled =>\n      !state.widget.readOnly && state._value.selection.isValid;\n}\n\nclass _UpdateTextSelectionAction<T extends DirectionalCaretMovementIntent>\n    extends ContextAction<T> {\n  _UpdateTextSelectionAction(\n    this.state,\n    this.getTextBoundary,\n    this.applyTextBoundary, {\n    required this.ignoreNonCollapsedSelection,\n    this.isExpand = false,\n    this.extentAtIndex = false,\n  });\n\n  final EditableTextState state;\n  final bool ignoreNonCollapsedSelection;\n  final bool isExpand;\n  final bool extentAtIndex;\n  final TextBoundary Function() getTextBoundary;\n  final _ApplyTextBoundary applyTextBoundary;\n\n  static const int NEWLINE_CODE_UNIT = 10;\n\n  // Returns true iff the given position is at a wordwrap boundary in the\n  // upstream position.\n  bool _isAtWordwrapUpstream(TextPosition position) {\n    final end = TextPosition(\n      offset: state.renderEditable.getLineAtOffset(position).end,\n      affinity: TextAffinity.upstream,\n    );\n    return end == position &&\n        end.offset != state.textEditingValue.text.length &&\n        state.textEditingValue.text.codeUnitAt(position.offset) !=\n            NEWLINE_CODE_UNIT;\n  }\n\n  // Returns true if the given position at a wordwrap boundary in the\n  // downstream position.\n  bool _isAtWordwrapDownstream(TextPosition position) {\n    final start = TextPosition(\n      offset: state.renderEditable.getLineAtOffset(position).start,\n    );\n    return start == position &&\n        start.offset != 0 &&\n        state.textEditingValue.text.codeUnitAt(position.offset - 1) !=\n            NEWLINE_CODE_UNIT;\n  }\n\n  @override\n  Object? invoke(T intent, [BuildContext? context]) {\n    final TextSelection selection = state._value.selection;\n    assert(selection.isValid);\n\n    final bool collapseSelection =\n        intent.collapseSelection || !state.widget.selectionEnabled;\n    if (!selection.isCollapsed &&\n        !ignoreNonCollapsedSelection &&\n        collapseSelection) {\n      return Actions.invoke(\n        context!,\n        UpdateSelectionIntent(\n          state._value,\n          TextSelection.collapsed(\n            offset: intent.forward ? selection.end : selection.start,\n          ),\n          SelectionChangedCause.keyboard,\n        ),\n      );\n    }\n\n    TextPosition extent = selection.extent;\n    // If continuesAtWrap is true extent and is at the relevant wordwrap, then\n    // move it just to the other side of the wordwrap.\n    if (intent.continuesAtWrap) {\n      if (intent.forward && _isAtWordwrapUpstream(extent)) {\n        extent = TextPosition(offset: extent.offset);\n      } else if (!intent.forward && _isAtWordwrapDownstream(extent)) {\n        extent = TextPosition(\n          offset: extent.offset,\n          affinity: TextAffinity.upstream,\n        );\n      }\n    }\n\n    final bool shouldTargetBase =\n        isExpand &&\n        (intent.forward\n            ? selection.baseOffset > selection.extentOffset\n            : selection.baseOffset < selection.extentOffset);\n    final TextPosition newExtent = applyTextBoundary(\n      shouldTargetBase ? selection.base : extent,\n      intent.forward,\n      getTextBoundary(),\n    );\n    final TextSelection newSelection =\n        collapseSelection ||\n            (!isExpand && newExtent.offset == selection.baseOffset)\n        ? TextSelection.fromPosition(newExtent)\n        : isExpand\n        ? selection.expandTo(newExtent, extentAtIndex || selection.isCollapsed)\n        : selection.extendTo(newExtent);\n\n    final bool shouldCollapseToBase =\n        intent.collapseAtReversal &&\n        (selection.baseOffset - selection.extentOffset) *\n                (selection.baseOffset - newSelection.extentOffset) <\n            0;\n    final newRange = shouldCollapseToBase\n        ? TextSelection.fromPosition(selection.base)\n        : newSelection;\n    return Actions.invoke(\n      context!,\n      UpdateSelectionIntent(\n        state._value,\n        newRange,\n        SelectionChangedCause.keyboard,\n      ),\n    );\n  }\n\n  @override\n  bool get isActionEnabled {\n    if (kIsWeb &&\n        state.widget.selectionEnabled &&\n        state._value.composing.isValid) {\n      return false;\n    }\n\n    return state._value.selection.isValid;\n  }\n}\n\nclass _UpdateTextSelectionVerticallyAction<\n  T extends DirectionalCaretMovementIntent\n>\n    extends ContextAction<T> {\n  _UpdateTextSelectionVerticallyAction(this.state);\n\n  final EditableTextState state;\n\n  VerticalCaretMovementRun? _verticalMovementRun;\n  TextSelection? _runSelection;\n\n  void stopCurrentVerticalRunIfSelectionChanges() {\n    final TextSelection? runSelection = _runSelection;\n    if (runSelection == null) {\n      assert(_verticalMovementRun == null);\n      return;\n    }\n    _runSelection = state._value.selection;\n    final TextSelection currentSelection = state.widget.controller.selection;\n    final bool continueCurrentRun =\n        currentSelection.isValid &&\n        currentSelection.isCollapsed &&\n        currentSelection.baseOffset == runSelection.baseOffset &&\n        currentSelection.extentOffset == runSelection.extentOffset;\n    if (!continueCurrentRun) {\n      _verticalMovementRun = null;\n      _runSelection = null;\n    }\n  }\n\n  @override\n  void invoke(T intent, [BuildContext? context]) {\n    assert(state._value.selection.isValid);\n\n    final bool collapseSelection =\n        intent.collapseSelection || !state.widget.selectionEnabled;\n    final TextEditingValue value = state._textEditingValueforTextLayoutMetrics;\n    if (!value.selection.isValid) {\n      return;\n    }\n\n    if (_verticalMovementRun?.isValid == false) {\n      _verticalMovementRun = null;\n      _runSelection = null;\n    }\n\n    final VerticalCaretMovementRun currentRun =\n        _verticalMovementRun ??\n        state.renderEditable.startVerticalCaretMovement(\n          state.renderEditable.selection!.extent,\n        );\n\n    final bool shouldMove =\n        intent is ExtendSelectionVerticallyToAdjacentPageIntent\n        ? currentRun.moveByOffset(\n            (intent.forward ? 1.0 : -1.0) * state.renderEditable.size.height,\n          )\n        : intent.forward\n        ? currentRun.moveNext()\n        : currentRun.movePrevious();\n    final TextPosition newExtent = shouldMove\n        ? currentRun.current\n        : intent.forward\n        ? TextPosition(offset: value.text.length)\n        : const TextPosition(offset: 0);\n    final TextSelection newSelection = collapseSelection\n        ? TextSelection.fromPosition(newExtent)\n        : value.selection.extendTo(newExtent);\n\n    Actions.invoke(\n      context!,\n      UpdateSelectionIntent(\n        value,\n        newSelection,\n        SelectionChangedCause.keyboard,\n      ),\n    );\n    if (state._value.selection == newSelection) {\n      _verticalMovementRun = currentRun;\n      _runSelection = newSelection;\n    }\n  }\n\n  @override\n  bool get isActionEnabled {\n    if (kIsWeb &&\n        state.widget.selectionEnabled &&\n        state._value.composing.isValid) {\n      return false;\n    }\n\n    return state._value.selection.isValid;\n  }\n}\n\nclass _WebComposingDisablingCallbackAction<T extends Intent>\n    extends CallbackAction<T> {\n  _WebComposingDisablingCallbackAction(this.state, {required super.onInvoke});\n\n  final EditableTextState state;\n\n  @override\n  bool get isActionEnabled {\n    if (kIsWeb &&\n        state.widget.selectionEnabled &&\n        state._value.composing.isValid) {\n      return false;\n    }\n\n    return super.isActionEnabled;\n  }\n}\n\nclass _SelectAllAction extends ContextAction<SelectAllTextIntent> {\n  _SelectAllAction(this.state);\n\n  final EditableTextState state;\n\n  @override\n  Object? invoke(SelectAllTextIntent intent, [BuildContext? context]) {\n    if (!state.widget.selectionEnabled) {\n      return null;\n    }\n\n    return Actions.invoke(\n      context!,\n      UpdateSelectionIntent(\n        state._value,\n        TextSelection(baseOffset: 0, extentOffset: state._value.text.length),\n        intent.cause,\n      ),\n    );\n  }\n}\n\nclass _CopySelectionAction extends ContextAction<CopySelectionTextIntent> {\n  _CopySelectionAction(this.state);\n\n  final EditableTextState state;\n\n  @override\n  void invoke(CopySelectionTextIntent intent, [BuildContext? context]) {\n    if (!state._value.selection.isValid || state._value.selection.isCollapsed) {\n      return;\n    }\n\n    if (!state.widget.selectionEnabled) {\n      return;\n    }\n\n    if (intent.collapseSelection) {\n      state.cutSelection(intent.cause);\n    } else {\n      state.copySelection(intent.cause);\n    }\n  }\n}\n\nclass _PasteSelectionAction extends ContextAction<PasteTextIntent> {\n  _PasteSelectionAction(this.state);\n\n  final EditableTextState state;\n\n  @override\n  void invoke(PasteTextIntent intent, [BuildContext? context]) {\n    if (!state.widget.selectionEnabled) {\n      return;\n    }\n\n    state.pasteText(intent.cause);\n  }\n}\n\n/// A [ClipboardStatusNotifier] whose [value] is hardcoded to\n/// [ClipboardStatus.pasteable].\n///\n/// Useful to avoid showing a permission dialog on web, which happens when\n/// [Clipboard.hasStrings] is called.\nclass _WebClipboardStatusNotifier extends ClipboardStatusNotifier {\n  @override\n  ClipboardStatus value = ClipboardStatus.pasteable;\n\n  @override\n  Future<void> update() {\n    return Future<void>.value();\n  }\n}\n\nclass _EditableTextTapOutsideAction\n    extends ContextAction<EditableTextTapOutsideIntent> {\n  _EditableTextTapOutsideAction();\n\n  @override\n  void invoke(EditableTextTapOutsideIntent intent, [BuildContext? context]) {\n    // The focus dropping behavior is only present on desktop platforms.\n    switch (defaultTargetPlatform) {\n      case TargetPlatform.android:\n      case TargetPlatform.iOS:\n      case TargetPlatform.fuchsia:\n        // On mobile platforms, we don't unfocus on touch events unless they're\n        // in the web browser, but we do unfocus for all other kinds of events.\n        switch (intent.pointerDownEvent.kind) {\n          case ui.PointerDeviceKind.touch:\n            if (kIsWeb) {\n              intent.focusNode.unfocus();\n            }\n          case ui.PointerDeviceKind.mouse:\n          case ui.PointerDeviceKind.stylus:\n          case ui.PointerDeviceKind.invertedStylus:\n          case ui.PointerDeviceKind.unknown:\n            intent.focusNode.unfocus();\n          case ui.PointerDeviceKind.trackpad:\n            throw UnimplementedError(\n              'Unexpected pointer down event for trackpad',\n            );\n        }\n      case TargetPlatform.linux:\n      case TargetPlatform.macOS:\n      case TargetPlatform.windows:\n        intent.focusNode.unfocus();\n    }\n  }\n}\n\nclass _EditableTextTapUpOutsideAction\n    extends ContextAction<EditableTextTapUpOutsideIntent> {\n  _EditableTextTapUpOutsideAction();\n\n  @override\n  void invoke(EditableTextTapUpOutsideIntent intent, [BuildContext? context]) {\n    // The default action is a no-op.\n  }\n}\n\n/// A utility class for overriding the text styles of a [TextSpan] tree.\n// When changes are made to this class, the equivalent API in text.dart\n// must also be updated.\n// TODO(Renzo-Olivares): Remove after investigating a solution for overriding all\n// styles for children in an [InlineSpan] tree, see: https://github.com/flutter/flutter/issues/177952.\nclass _OverridingTextStyleTextSpanUtils {\n  static TextSpan applyTextSpacingOverrides({\n    double? lineHeightScaleFactor,\n    double? letterSpacing,\n    double? wordSpacing,\n    required TextSpan textSpan,\n  }) {\n    if (lineHeightScaleFactor == null &&\n        letterSpacing == null &&\n        wordSpacing == null) {\n      return textSpan;\n    }\n    return _applyTextStyleOverrides(\n      TextStyle(\n        height: lineHeightScaleFactor,\n        letterSpacing: letterSpacing,\n        wordSpacing: wordSpacing,\n      ),\n      textSpan,\n    );\n  }\n\n  static TextSpan _applyTextStyleOverrides(\n    TextStyle overrideTextStyle,\n    TextSpan textSpan,\n  ) {\n    return TextSpan(\n      text: textSpan.text,\n      children: textSpan.children?.map((InlineSpan child) {\n        if (child is TextSpan && child.runtimeType == TextSpan) {\n          return _applyTextStyleOverrides(overrideTextStyle, child);\n        }\n        return child;\n      }).toList(),\n      style: textSpan.style?.merge(overrideTextStyle) ?? overrideTextStyle,\n      recognizer: textSpan.recognizer,\n      mouseCursor: textSpan.mouseCursor,\n      onEnter: textSpan.onEnter,\n      onExit: textSpan.onExit,\n      semanticsLabel: textSpan.semanticsLabel,\n      semanticsIdentifier: textSpan.semanticsIdentifier,\n      locale: textSpan.locale,\n      spellOut: textSpan.spellOut,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/text_field/spell_check.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n/// @docImport 'editable_text.dart';\nlibrary;\n\nimport 'package:PiliPlus/common/widgets/flutter/text_field/editable_text.dart'\n    show EditableTextContextMenuBuilder;\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/painting.dart';\nimport 'package:flutter/services.dart' show SpellCheckService;\n\n/// Controls how spell check is performed for text input.\n///\n/// This configuration determines the [SpellCheckService] used to fetch the\n/// [List<SuggestionSpan>] spell check results and the [TextStyle] used to\n/// mark misspelled words within text input.\n@immutable\nclass SpellCheckConfiguration {\n  /// Creates a configuration that specifies the service and suggestions handler\n  /// for spell check.\n  const SpellCheckConfiguration({\n    this.spellCheckService,\n    this.misspelledSelectionColor,\n    this.misspelledTextStyle,\n    this.spellCheckSuggestionsToolbarBuilder,\n  }) : _spellCheckEnabled = true;\n\n  /// Creates a configuration that disables spell check.\n  const SpellCheckConfiguration.disabled()\n    : _spellCheckEnabled = false,\n      spellCheckService = null,\n      spellCheckSuggestionsToolbarBuilder = null,\n      misspelledTextStyle = null,\n      misspelledSelectionColor = null;\n\n  /// The service used to fetch spell check results for text input.\n  final SpellCheckService? spellCheckService;\n\n  /// The color the paint the selection highlight when spell check is showing\n  /// suggestions for a misspelled word.\n  ///\n  /// For example, on iOS, the selection appears red while the spell check menu\n  /// is showing.\n  final Color? misspelledSelectionColor;\n\n  /// Style used to indicate misspelled words.\n  ///\n  /// This is nullable to allow style-specific wrappers of [EditableText]\n  /// to infer this, but this must be specified if this configuration is\n  /// provided directly to [EditableText] or its construction will fail with an\n  /// assertion error.\n  final TextStyle? misspelledTextStyle;\n\n  /// Builds the toolbar used to display spell check suggestions for misspelled\n  /// words.\n  final EditableTextContextMenuBuilder? spellCheckSuggestionsToolbarBuilder;\n\n  final bool _spellCheckEnabled;\n\n  /// Whether or not the configuration should enable or disable spell check.\n  bool get spellCheckEnabled => _spellCheckEnabled;\n\n  /// Returns a copy of the current [SpellCheckConfiguration] instance with\n  /// specified overrides.\n  SpellCheckConfiguration copyWith({\n    SpellCheckService? spellCheckService,\n    Color? misspelledSelectionColor,\n    TextStyle? misspelledTextStyle,\n    EditableTextContextMenuBuilder? spellCheckSuggestionsToolbarBuilder,\n  }) {\n    if (!_spellCheckEnabled) {\n      // A new configuration should be constructed to enable spell check.\n      return const SpellCheckConfiguration.disabled();\n    }\n\n    return SpellCheckConfiguration(\n      spellCheckService: spellCheckService ?? this.spellCheckService,\n      misspelledSelectionColor:\n          misspelledSelectionColor ?? this.misspelledSelectionColor,\n      misspelledTextStyle: misspelledTextStyle ?? this.misspelledTextStyle,\n      spellCheckSuggestionsToolbarBuilder:\n          spellCheckSuggestionsToolbarBuilder ??\n          this.spellCheckSuggestionsToolbarBuilder,\n    );\n  }\n\n  @override\n  String toString() {\n    return '${objectRuntimeType(this, 'SpellCheckConfiguration')}('\n        '${_spellCheckEnabled ? 'enabled' : 'disabled'}, '\n        'service: $spellCheckService, '\n        'text style: $misspelledTextStyle, '\n        'toolbar builder: $spellCheckSuggestionsToolbarBuilder'\n        ')';\n  }\n\n  @override\n  bool operator ==(Object other) {\n    if (other.runtimeType != runtimeType) {\n      return false;\n    }\n    return other is SpellCheckConfiguration &&\n        other.spellCheckService == spellCheckService &&\n        other.misspelledTextStyle == misspelledTextStyle &&\n        other.spellCheckSuggestionsToolbarBuilder ==\n            spellCheckSuggestionsToolbarBuilder &&\n        other._spellCheckEnabled == _spellCheckEnabled;\n  }\n\n  @override\n  int get hashCode => Object.hash(\n    spellCheckService,\n    misspelledTextStyle,\n    spellCheckSuggestionsToolbarBuilder,\n    _spellCheckEnabled,\n  );\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/text_field/spell_check_suggestions_toolbar.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'package:PiliPlus/common/widgets/flutter/text_field/adaptive_text_selection_toolbar.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text_field/editable_text.dart';\nimport 'package:flutter/cupertino.dart' hide EditableText, EditableTextState;\nimport 'package:flutter/material.dart'\n    hide EditableText, EditableTextState, AdaptiveTextSelectionToolbar;\nimport 'package:flutter/scheduler.dart';\nimport 'package:flutter/services.dart'\n    show SelectionChangedCause, SuggestionSpan;\n\n// The default height of the SpellCheckSuggestionsToolbar, which\n// assumes there are the maximum number of spell check suggestions available, 3.\n// Size eyeballed on Pixel 4 emulator running Android API 31.\nconst double _kDefaultToolbarHeight = 193.0;\n\n/// The maximum number of suggestions in the toolbar is 3, plus a delete button.\nconst int _kMaxSuggestions = 3;\n\n/// The default spell check suggestions toolbar for Android.\n///\n/// Tries to position itself below the [anchor], but if it doesn't fit, then it\n/// readjusts to fit above bottom view insets.\n///\n/// See also:\n///\n///  * [CupertinoSpellCheckSuggestionsToolbar], which is similar but builds an\n///    iOS-style spell check toolbar.\nclass SpellCheckSuggestionsToolbar extends StatelessWidget {\n  /// Constructs a [SpellCheckSuggestionsToolbar].\n  ///\n  /// [buttonItems] must not contain more than four items, generally three\n  /// suggestions and one delete button.\n  const SpellCheckSuggestionsToolbar({\n    super.key,\n    required this.anchor,\n    required this.buttonItems,\n  }) : assert(buttonItems.length <= _kMaxSuggestions + 1);\n\n  /// Constructs a [SpellCheckSuggestionsToolbar] with the default children for\n  /// an [EditableText].\n  ///\n  /// See also:\n  ///  * [CupertinoSpellCheckSuggestionsToolbar.editableText], which is similar\n  ///    but builds an iOS-style toolbar.\n  SpellCheckSuggestionsToolbar.editableText({\n    super.key,\n    required EditableTextState editableTextState,\n  }) : buttonItems =\n           buildButtonItems(editableTextState) ?? <ContextMenuButtonItem>[],\n       anchor = getToolbarAnchor(editableTextState.contextMenuAnchors);\n\n  /// {@template flutter.material.SpellCheckSuggestionsToolbar.anchor}\n  /// The focal point below which the toolbar attempts to position itself.\n  /// {@endtemplate}\n  final Offset anchor;\n\n  /// The [ContextMenuButtonItem]s that will be turned into the correct button\n  /// widgets and displayed in the spell check suggestions toolbar.\n  ///\n  /// Must not contain more than four items, typically three suggestions and a\n  /// delete button.\n  ///\n  /// See also:\n  ///\n  ///  * [AdaptiveTextSelectionToolbar.buttonItems], the list of\n  ///    [ContextMenuButtonItem]s that are used to build the buttons of the\n  ///    text selection toolbar.\n  ///  * [CupertinoSpellCheckSuggestionsToolbar.buttonItems], the list of\n  ///    [ContextMenuButtonItem]s used to build the Cupertino style spell check\n  ///    suggestions toolbar.\n  final List<ContextMenuButtonItem> buttonItems;\n\n  /// Builds the button items for the toolbar based on the available\n  /// spell check suggestions.\n  static List<ContextMenuButtonItem>? buildButtonItems(\n    EditableTextState editableTextState,\n  ) {\n    // Determine if composing region is misspelled.\n    final SuggestionSpan? spanAtCursorIndex = editableTextState\n        .findSuggestionSpanAtCursorIndex(\n          editableTextState.currentTextEditingValue.selection.baseOffset,\n        );\n\n    if (spanAtCursorIndex == null) {\n      return null;\n    }\n\n    final buttonItems = <ContextMenuButtonItem>[];\n\n    // Build suggestion buttons.\n    for (final String suggestion in spanAtCursorIndex.suggestions.take(\n      _kMaxSuggestions,\n    )) {\n      buttonItems.add(\n        ContextMenuButtonItem(\n          onPressed: () {\n            if (!editableTextState.mounted) {\n              return;\n            }\n            _replaceText(\n              editableTextState,\n              suggestion,\n              spanAtCursorIndex.range,\n            );\n          },\n          label: suggestion,\n        ),\n      );\n    }\n\n    // Build delete button.\n    final deleteButton = ContextMenuButtonItem(\n      onPressed: () {\n        if (!editableTextState.mounted) {\n          return;\n        }\n        _replaceText(\n          editableTextState,\n          '',\n          editableTextState.currentTextEditingValue.composing,\n        );\n      },\n      type: ContextMenuButtonType.delete,\n    );\n    buttonItems.add(deleteButton);\n\n    return buttonItems;\n  }\n\n  static void _replaceText(\n    EditableTextState editableTextState,\n    String text,\n    TextRange replacementRange,\n  ) {\n    // Replacement cannot be performed if the text is read only or obscured.\n    assert(\n      !editableTextState.widget.readOnly &&\n          !editableTextState.widget.obscureText,\n    );\n\n    final TextEditingValue newValue = editableTextState.textEditingValue\n        .replaced(\n          replacementRange,\n          text,\n        );\n    editableTextState.userUpdateTextEditingValue(\n      newValue,\n      SelectionChangedCause.toolbar,\n    );\n\n    // Schedule a call to bringIntoView() after renderEditable updates.\n    SchedulerBinding.instance.addPostFrameCallback((Duration duration) {\n      if (editableTextState.mounted) {\n        editableTextState.bringIntoView(\n          editableTextState.textEditingValue.selection.extent,\n        );\n      }\n    }, debugLabel: 'SpellCheckerSuggestionsToolbar.bringIntoView');\n    editableTextState.hideToolbar();\n  }\n\n  /// Determines the Offset that the toolbar will be anchored to.\n  static Offset getToolbarAnchor(TextSelectionToolbarAnchors anchors) {\n    // Since this will be positioned below the anchor point, use the secondary\n    // anchor by default.\n    return anchors.secondaryAnchor == null\n        ? anchors.primaryAnchor\n        : anchors.secondaryAnchor!;\n  }\n\n  /// Builds the toolbar buttons based on the [buttonItems].\n  List<Widget> _buildToolbarButtons(BuildContext context) {\n    return buttonItems.map((ContextMenuButtonItem buttonItem) {\n      final button = TextSelectionToolbarTextButton(\n        padding: const EdgeInsets.fromLTRB(20, 0, 0, 0),\n        onPressed: buttonItem.onPressed,\n        alignment: Alignment.centerLeft,\n        child: Text(\n          AdaptiveTextSelectionToolbar.getButtonLabel(context, buttonItem),\n          style: buttonItem.type == ContextMenuButtonType.delete\n              ? const TextStyle(color: Colors.blue)\n              : null,\n        ),\n      );\n\n      if (buttonItem.type != ContextMenuButtonType.delete) {\n        return button;\n      }\n      return DecoratedBox(\n        decoration: const BoxDecoration(\n          border: Border(top: BorderSide(color: Colors.grey)),\n        ),\n        child: button,\n      );\n    }).toList();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    if (buttonItems.isEmpty) {\n      return const SizedBox.shrink();\n    }\n\n    // Adjust toolbar height if needed.\n    final double spellCheckSuggestionsToolbarHeight =\n        _kDefaultToolbarHeight - (48.0 * (4 - buttonItems.length));\n    // Incorporate the padding distance between the content and toolbar.\n    final MediaQueryData mediaQueryData = MediaQuery.of(context);\n    final double softKeyboardViewInsetsBottom =\n        mediaQueryData.viewInsets.bottom;\n    final double paddingAbove =\n        mediaQueryData.padding.top +\n        CupertinoTextSelectionToolbar.kToolbarScreenPadding;\n    // Makes up for the Padding.\n    final localAdjustment = Offset(\n      CupertinoTextSelectionToolbar.kToolbarScreenPadding,\n      paddingAbove,\n    );\n\n    return Padding(\n      padding: EdgeInsets.fromLTRB(\n        CupertinoTextSelectionToolbar.kToolbarScreenPadding,\n        paddingAbove,\n        CupertinoTextSelectionToolbar.kToolbarScreenPadding,\n        CupertinoTextSelectionToolbar.kToolbarScreenPadding +\n            softKeyboardViewInsetsBottom,\n      ),\n      child: CustomSingleChildLayout(\n        delegate: SpellCheckSuggestionsToolbarLayoutDelegate(\n          anchor: anchor - localAdjustment,\n        ),\n        child: AnimatedSize(\n          // This duration was eyeballed on a Pixel 2 emulator running Android\n          // API 28 for the Material TextSelectionToolbar.\n          duration: const Duration(milliseconds: 140),\n          child: _SpellCheckSuggestionsToolbarContainer(\n            height: spellCheckSuggestionsToolbarHeight,\n            children: <Widget>[..._buildToolbarButtons(context)],\n          ),\n        ),\n      ),\n    );\n  }\n}\n\n/// The Material-styled toolbar outline for the spell check suggestions\n/// toolbar.\nclass _SpellCheckSuggestionsToolbarContainer extends StatelessWidget {\n  const _SpellCheckSuggestionsToolbarContainer({\n    required this.height,\n    required this.children,\n  });\n\n  final double height;\n  final List<Widget> children;\n\n  @override\n  Widget build(BuildContext context) {\n    return Material(\n      // This elevation was eyeballed on a Pixel 4 emulator running Android\n      // API 31 for the SpellCheckSuggestionsToolbar.\n      elevation: 2.0,\n      type: MaterialType.card,\n      child: SizedBox(\n        // This width was eyeballed on a Pixel 4 emulator running Android\n        // API 31 for the SpellCheckSuggestionsToolbar.\n        width: 165.0,\n        height: height,\n        child: Column(\n          mainAxisSize: MainAxisSize.min,\n          crossAxisAlignment: CrossAxisAlignment.stretch,\n          children: children,\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/text_field/system_context_menu.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n/// @docImport 'package:flutter/material.dart';\nlibrary;\n\nimport 'package:PiliPlus/common/widgets/flutter/text_field/editable_text.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart' hide EditableText, EditableTextState;\nimport 'package:flutter/services.dart';\n\n/// Displays the system context menu on top of the Flutter view.\n///\n/// Currently, only supports iOS 16.0 and above and displays nothing on other\n/// platforms.\n///\n/// The context menu is the menu that appears, for example, when doing text\n/// selection. Flutter typically draws this menu itself, but this class deals\n/// with the platform-rendered context menu instead.\n///\n/// There can only be one system context menu visible at a time. Building this\n/// widget when the system context menu is already visible will hide the old one\n/// and display this one. A system context menu that is hidden is informed via\n/// [onSystemHide].\n///\n/// Pass [items] to specify the buttons that will appear in the menu. Any items\n/// without a title will be given a default title from [WidgetsLocalizations].\n///\n/// By default, [items] will be set to the result of [getDefaultItems]. This\n/// method considers the state of the [EditableTextState] so that, for example,\n/// it will only include [IOSSystemContextMenuItemCopy] if there is currently a\n/// selection to copy.\n///\n/// To check if the current device supports showing the system context menu,\n/// call [isSupported].\n///\n/// {@tool dartpad}\n/// This example shows how to create a [TextField] that uses the system context\n/// menu where supported and does not show a system notification when the user\n/// presses the \"Paste\" button.\n///\n/// ** See code in examples/api/lib/widgets/system_context_menu/system_context_menu.0.dart **\n/// {@end-tool}\n///\n/// See also:\n///\n///  * [SystemContextMenuController], which directly controls the hiding and\n///    showing of the system context menu.\nclass SystemContextMenu extends StatefulWidget {\n  /// Creates an instance of [SystemContextMenu] that points to the given\n  /// [anchor].\n  const SystemContextMenu._({\n    super.key,\n    required this.anchor,\n    required this.items,\n    this.onSystemHide,\n  });\n\n  /// Creates an instance of [SystemContextMenu] for the field indicated by the\n  /// given [EditableTextState].\n  factory SystemContextMenu.editableText({\n    Key? key,\n    required EditableTextState editableTextState,\n    List<IOSSystemContextMenuItem>? items,\n  }) {\n    final (\n      startGlyphHeight: double startGlyphHeight,\n      endGlyphHeight: double endGlyphHeight,\n    ) = editableTextState\n        .getGlyphHeights();\n\n    return SystemContextMenu._(\n      key: key,\n      anchor: TextSelectionToolbarAnchors.getSelectionRect(\n        editableTextState.renderEditable,\n        startGlyphHeight,\n        endGlyphHeight,\n        editableTextState.renderEditable.getEndpointsForSelection(\n          editableTextState.textEditingValue.selection,\n        ),\n      ),\n      items: items ?? getDefaultItems(editableTextState),\n      onSystemHide: () => editableTextState.hideToolbar(false),\n    );\n  }\n\n  /// The [Rect] that the context menu should point to.\n  final Rect anchor;\n\n  /// A list of the items to be displayed in the system context menu.\n  ///\n  /// When passed, items will be shown regardless of the state of text input.\n  /// For example, [IOSSystemContextMenuItemCopy] will produce a copy button\n  /// even when there is no selection to copy. Use [EditableTextState] and/or\n  /// the result of [getDefaultItems] to add and remove items based on the state\n  /// of the input.\n  ///\n  /// Defaults to the result of [getDefaultItems].\n  ///\n  /// To add custom menu items, pass [IOSSystemContextMenuItemCustom] instances\n  /// in the [items] list. Each custom item requires a title and an onPressed callback.\n  ///\n  /// See also:\n  ///\n  ///  * [IOSSystemContextMenuItemCustom], which creates custom menu items.\n  final List<IOSSystemContextMenuItem> items;\n\n  /// Called when the system hides this context menu.\n  ///\n  /// For example, tapping outside of the context menu typically causes the\n  /// system to hide the menu.\n  ///\n  /// This is not called when showing a new system context menu causes another\n  /// to be hidden.\n  final VoidCallback? onSystemHide;\n\n  /// Whether the current device supports showing the system context menu.\n  ///\n  /// Currently, this is only supported on newer versions of iOS.\n  ///\n  /// See also:\n  ///\n  ///  * [isSupportedByField], which uses this method and determines whether an\n  ///    individual [EditableTextState] supports the system context menu.\n  static bool isSupported(BuildContext context) {\n    return defaultTargetPlatform == TargetPlatform.iOS &&\n        (MediaQuery.maybeSupportsShowingSystemContextMenu(context) ?? false);\n  }\n\n  /// Whether the given field supports showing the system context menu.\n  ///\n  /// Currently [SystemContextMenu] is only supported with an active\n  /// [TextInputConnection]. In cases where this isn't possible, such as in a\n  /// read-only field, fall back to using a Flutter-rendered context menu like\n  /// [AdaptiveTextSelectionToolbar].\n  ///\n  /// See also:\n  ///\n  ///  * [isSupported], which is used by this method and determines whether the\n  ///    platform in general supports showing the system context menu.\n  static bool isSupportedByField(EditableTextState editableTextState) {\n    return !editableTextState.widget.readOnly &&\n        isSupported(editableTextState.context);\n  }\n\n  /// The default [items] for the given [EditableTextState].\n  ///\n  /// For example, [IOSSystemContextMenuItemCopy] will only be included when the\n  /// field represented by the [EditableTextState] has a selection.\n  ///\n  /// See also:\n  ///\n  ///  * [EditableTextState.contextMenuButtonItems], which provides the default\n  ///    [ContextMenuButtonItem]s for the Flutter-rendered context menu.\n  static List<IOSSystemContextMenuItem> getDefaultItems(\n    EditableTextState editableTextState,\n  ) {\n    final items = <IOSSystemContextMenuItem>[];\n\n    // Use the generic Flutter-rendered context menu model as the single source of truth.\n    for (final ContextMenuButtonItem button\n        in editableTextState.contextMenuButtonItems) {\n      switch (button.type) {\n        case ContextMenuButtonType.copy:\n          items.add(const IOSSystemContextMenuItemCopy());\n        case ContextMenuButtonType.cut:\n          items.add(const IOSSystemContextMenuItemCut());\n        case ContextMenuButtonType.paste:\n          items.add(const IOSSystemContextMenuItemPaste());\n        case ContextMenuButtonType.selectAll:\n          items.add(const IOSSystemContextMenuItemSelectAll());\n        case ContextMenuButtonType.lookUp:\n          items.add(const IOSSystemContextMenuItemLookUp());\n        case ContextMenuButtonType.searchWeb:\n          items.add(const IOSSystemContextMenuItemSearchWeb());\n        case ContextMenuButtonType.share:\n          items.add(const IOSSystemContextMenuItemShare());\n        case ContextMenuButtonType.liveTextInput:\n          items.add(const IOSSystemContextMenuItemLiveText());\n        case ContextMenuButtonType.delete:\n        // No native iOS system menu button for Delete — intentionally ignored.\n        case ContextMenuButtonType.custom:\n        // Custom items are provided explicitly via SystemContextMenu.items,\n        // not via defaults. Intentionally ignore in default mapping.\n      }\n    }\n\n    return items;\n  }\n\n  @override\n  State<SystemContextMenu> createState() => _SystemContextMenuState();\n}\n\nclass _SystemContextMenuState extends State<SystemContextMenu> {\n  late final SystemContextMenuController _systemContextMenuController;\n\n  @override\n  void initState() {\n    super.initState();\n    _systemContextMenuController = SystemContextMenuController(\n      onSystemHide: widget.onSystemHide,\n    );\n  }\n\n  @override\n  void dispose() {\n    _systemContextMenuController.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    assert(SystemContextMenu.isSupported(context));\n\n    if (widget.items.isNotEmpty) {\n      final WidgetsLocalizations localizations = WidgetsLocalizations.of(\n        context,\n      );\n      final List<IOSSystemContextMenuItemData> itemDatas = widget.items\n          .map((IOSSystemContextMenuItem item) => item.getData(localizations))\n          .toList();\n      _systemContextMenuController.showWithItems(widget.anchor, itemDatas);\n    }\n\n    return const SizedBox.shrink();\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/text_field/text_field.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// ignore_for_file: uri_does_not_exist_in_doc_import\n\n/// @docImport 'input_border.dart';\n/// @docImport 'material.dart';\n/// @docImport 'scaffold.dart';\n/// @docImport 'text_form_field.dart';\n/// @docImport 'text_theme.dart';\nlibrary;\n\nimport 'dart:ui' as ui show BoxHeightStyle, BoxWidthStyle;\n\nimport 'package:PiliPlus/common/widgets/flutter/text_field/adaptive_text_selection_toolbar.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text_field/controller.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text_field/cupertino/spell_check_suggestions_toolbar.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text_field/cupertino/text_field.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text_field/editable_text.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text_field/spell_check.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text_field/spell_check_suggestions_toolbar.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text_field/system_context_menu.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text_field/text_selection.dart';\nimport 'package:flutter/cupertino.dart'\n    hide\n        EditableText,\n        EditableTextState,\n        EditableTextContextMenuBuilder,\n        SystemContextMenu,\n        CupertinoSpellCheckSuggestionsToolbar,\n        SpellCheckConfiguration,\n        CupertinoTextField,\n        TextSelectionGestureDetectorBuilder,\n        TextSelectionOverlay,\n        TextSelectionGestureDetectorBuilderDelegate;\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart'\n    hide\n        EditableText,\n        EditableTextState,\n        EditableTextContextMenuBuilder,\n        AdaptiveTextSelectionToolbar,\n        SystemContextMenu,\n        SpellCheckSuggestionsToolbar,\n        SpellCheckConfiguration,\n        TextSelectionGestureDetectorBuilder,\n        TextSelectionOverlay,\n        TextSelectionGestureDetectorBuilderDelegate;\nimport 'package:flutter/rendering.dart';\nimport 'package:flutter/services.dart';\n\nclass _TextFieldSelectionGestureDetectorBuilder\n    extends TextSelectionGestureDetectorBuilder {\n  _TextFieldSelectionGestureDetectorBuilder({\n    required RichTextFieldState state,\n    required super.controller,\n  }) : _state = state,\n       super(delegate: state);\n\n  final RichTextFieldState _state;\n\n  @override\n  bool get onUserTapAlwaysCalled => _state.widget.onTapAlwaysCalled;\n\n  @override\n  void onUserTap() {\n    _state.widget.onTap?.call();\n  }\n}\n\n/// A Material Design text field.\n///\n/// A text field lets the user enter text, either with hardware keyboard or with\n/// an onscreen keyboard.\n///\n/// The text field calls the [onChanged] callback whenever the user changes the\n/// text in the field. If the user indicates that they are done typing in the\n/// field (e.g., by pressing a button on the soft keyboard), the text field\n/// calls the [onSubmitted] callback.\n///\n/// To control the text that is displayed in the text field, use the\n/// [controller]. For example, to set the initial value of the text field, use\n/// a [controller] that already contains some text. The [controller] can also\n/// control the selection and composing region (and to observe changes to the\n/// text, selection, and composing region).\n///\n/// By default, a text field has a [decoration] that draws a divider below the\n/// text field. You can use the [decoration] property to control the decoration,\n/// for example by adding a label or an icon. If you set the [decoration]\n/// property to null, the decoration will be removed entirely, including the\n/// extra padding introduced by the decoration to save space for the labels.\n///\n/// If [decoration] is non-null (which is the default), the text field requires\n/// one of its ancestors to be a [Material] widget.\n///\n/// To integrate the [RichTextField] into a [Form] with other [FormField] widgets,\n/// consider using [TextFormField].\n///\n/// {@template flutter.material.textfield.wantKeepAlive}\n/// When the widget has focus, it will prevent itself from disposing via its\n/// underlying [EditableText]'s [AutomaticKeepAliveClientMixin.wantKeepAlive] in\n/// order to avoid losing the selection. Removing the focus will allow it to be\n/// disposed.\n/// {@endtemplate}\n///\n/// Remember to call [RichTextEditingController.dispose] on the [RichTextEditingController]\n/// when it is no longer needed. This will ensure we discard any resources used\n/// by the object.\n///\n/// If this field is part of a scrolling container that lazily constructs its\n/// children, like a [ListView] or a [CustomScrollView], then a [controller]\n/// should be specified. The controller's lifetime should be managed by a\n/// stateful widget ancestor of the scrolling container.\n///\n/// ## Obscured Input\n///\n/// {@tool dartpad}\n/// This example shows how to create a [RichTextField] that will obscure input. The\n/// [InputDecoration] surrounds the field in a border using [OutlineInputBorder]\n/// and adds a label.\n///\n/// ** See code in examples/api/lib/material/text_field/text_field.0.dart **\n/// {@end-tool}\n///\n/// ## Reading values\n///\n/// A common way to read a value from a TextField is to use the [onSubmitted]\n/// callback. This callback is applied to the text field's current value when\n/// the user finishes editing.\n///\n/// {@tool dartpad}\n/// This sample shows how to get a value from a TextField via the [onSubmitted]\n/// callback.\n///\n/// ** See code in examples/api/lib/material/text_field/text_field.1.dart **\n/// {@end-tool}\n///\n/// {@macro flutter.widgets.EditableText.lifeCycle}\n///\n/// For most applications the [onSubmitted] callback will be sufficient for\n/// reacting to user input.\n///\n/// The [onEditingComplete] callback also runs when the user finishes editing.\n/// It's different from [onSubmitted] because it has a default value which\n/// updates the text controller and yields the keyboard focus. Applications that\n/// require different behavior can override the default [onEditingComplete]\n/// callback.\n///\n/// Keep in mind you can also always read the current string from a TextField's\n/// [RichTextEditingController] using [RichTextEditingController.text].\n///\n/// ## Handling emojis and other complex characters\n/// {@macro flutter.widgets.EditableText.onChanged}\n///\n/// In the live Dartpad example above, try typing the emoji 👨‍👩‍👦\n/// into the field and submitting. Because the example code measures the length\n/// with `value.characters.length`, the emoji is correctly counted as a single\n/// character.\n///\n/// {@macro flutter.widgets.editableText.showCaretOnScreen}\n///\n/// {@macro flutter.widgets.editableText.accessibility}\n///\n/// {@tool dartpad}\n/// This sample shows how to style a text field to match a filled or outlined\n/// Material Design 3 text field.\n///\n/// ** See code in examples/api/lib/material/text_field/text_field.2.dart **\n/// {@end-tool}\n///\n/// ## Scrolling Considerations\n///\n/// If this [RichTextField] is not a descendant of [Scaffold] and is being used\n/// within a [Scrollable] or nested [Scrollable]s, consider placing a\n/// [ScrollNotificationObserver] above the root [Scrollable] that contains this\n/// [RichTextField] to ensure proper scroll coordination for [RichTextField] and its\n/// components like [TextSelectionOverlay].\n///\n/// {@tool dartpad}\n/// This sample demonstrates how to use the [Shortcuts] and [Actions] widgets\n/// to create a custom `Shift+Enter` keyboard shortcut for inserting a new line\n/// in a [RichTextField].\n///\n/// ** See code in examples/api/lib/material/text_field/text_field.3.dart **\n/// {@end-tool}\n///\n/// See also:\n///\n///  * [TextFormField], which integrates with the [Form] widget.\n///  * [InputDecorator], which shows the labels and other visual elements that\n///    surround the actual text editing widget.\n///  * [EditableText], which is the raw text editing control at the heart of a\n///    [RichTextField]. The [EditableText] widget is rarely used directly unless\n///    you are implementing an entirely different design language, such as\n///    Cupertino.\n///  * <https://material.io/design/components/text-fields.html>\n///  * Cookbook: [Create and style a text field](https://docs.flutter.dev/cookbook/forms/text-input)\n///  * Cookbook: [Handle changes to a text field](https://docs.flutter.dev/cookbook/forms/text-field-changes)\n///  * Cookbook: [Retrieve the value of a text field](https://docs.flutter.dev/cookbook/forms/retrieve-input)\n///  * Cookbook: [Focus and text fields](https://docs.flutter.dev/cookbook/forms/focus)\nclass RichTextField extends StatefulWidget {\n  /// Creates a Material Design text field.\n  ///\n  /// If [decoration] is non-null (which is the default), the text field requires\n  /// one of its ancestors to be a [Material] widget.\n  ///\n  /// To remove the decoration entirely (including the extra padding introduced\n  /// by the decoration to save space for the labels), set the [decoration] to\n  /// null.\n  ///\n  /// The [maxLines] property can be set to null to remove the restriction on\n  /// the number of lines. By default, it is one, meaning this is a single-line\n  /// text field. [maxLines] must not be zero.\n  ///\n  /// The [maxLength] property is set to null by default, which means the\n  /// number of characters allowed in the text field is not restricted. If\n  /// [maxLength] is set a character counter will be displayed below the\n  /// field showing how many characters have been entered. If the value is\n  /// set to a positive integer it will also display the maximum allowed\n  /// number of characters to be entered. If the value is set to\n  /// [RichTextField.noMaxLength] then only the current length is displayed.\n  ///\n  /// After [maxLength] characters have been input, additional input\n  /// is ignored, unless [maxLengthEnforcement] is set to\n  /// [MaxLengthEnforcement.none].\n  /// The text field enforces the length with a [LengthLimitingTextInputFormatter],\n  /// which is evaluated after the supplied [inputFormatters], if any.\n  /// The [maxLength] value must be either null or greater than zero.\n  ///\n  /// If [maxLengthEnforcement] is set to [MaxLengthEnforcement.none], then more\n  /// than [maxLength] characters may be entered, and the error counter and\n  /// divider will switch to the [decoration].errorStyle when the limit is\n  /// exceeded.\n  ///\n  /// The text cursor is not shown if [showCursor] is false or if [showCursor]\n  /// is null (the default) and [readOnly] is true.\n  ///\n  /// The [selectionHeightStyle] and [selectionWidthStyle] properties allow\n  /// changing the shape of the selection highlighting. These properties default\n  /// to [EditableText.defaultSelectionHeightStyle] and\n  /// [EditableText.defaultSelectionHeightStyle], respectively.\n  ///\n  /// See also:\n  ///\n  ///  * [maxLength], which discusses the precise meaning of \"number of\n  ///    characters\" and how it may differ from the intuitive meaning.\n  const RichTextField({\n    super.key,\n    this.groupId = EditableText,\n    required this.controller,\n    this.focusNode,\n    this.decoration = const InputDecoration(),\n    TextInputType? keyboardType,\n    this.textInputAction,\n    this.textCapitalization = TextCapitalization.none,\n    this.style,\n    this.strutStyle,\n    this.textAlign = TextAlign.start,\n    this.textAlignVertical,\n    this.textDirection,\n    this.readOnly = false,\n    @Deprecated(\n      'Use `contextMenuBuilder` instead. '\n      'This feature was deprecated after v3.3.0-0.5.pre.',\n    )\n    this.toolbarOptions,\n    this.showCursor,\n    this.autofocus = false,\n    this.statesController,\n    this.obscuringCharacter = '•',\n    this.obscureText = false,\n    this.autocorrect,\n    SmartDashesType? smartDashesType,\n    SmartQuotesType? smartQuotesType,\n    this.enableSuggestions = true,\n    this.maxLines = 1,\n    this.minLines,\n    this.expands = false,\n    this.maxLength,\n    this.maxLengthEnforcement,\n    this.onChanged,\n    this.onEditingComplete,\n    this.onSubmitted,\n    this.onAppPrivateCommand,\n    this.inputFormatters,\n    this.enabled,\n    this.ignorePointers,\n    this.cursorWidth = 2.0,\n    this.cursorHeight,\n    this.cursorRadius,\n    this.cursorOpacityAnimates,\n    this.cursorColor,\n    this.cursorErrorColor,\n    this.selectionHeightStyle,\n    this.selectionWidthStyle,\n    this.keyboardAppearance,\n    this.scrollPadding = const EdgeInsets.all(20.0),\n    this.dragStartBehavior = DragStartBehavior.start,\n    bool? enableInteractiveSelection,\n    this.selectAllOnFocus,\n    this.selectionControls,\n    this.onTap,\n    this.onTapAlwaysCalled = false,\n    this.onTapOutside,\n    this.onTapUpOutside,\n    this.mouseCursor,\n    this.buildCounter,\n    this.scrollController,\n    this.scrollPhysics,\n    this.autofillHints = const <String>[],\n    this.contentInsertionConfiguration,\n    this.clipBehavior = Clip.hardEdge,\n    this.restorationId,\n    @Deprecated(\n      'Use `stylusHandwritingEnabled` instead. '\n      'This feature was deprecated after v3.27.0-0.2.pre.',\n    )\n    this.scribbleEnabled = true,\n    this.stylusHandwritingEnabled =\n        EditableText.defaultStylusHandwritingEnabled,\n    this.enableIMEPersonalizedLearning = true,\n    this.contextMenuBuilder = _defaultContextMenuBuilder,\n    this.canRequestFocus = true,\n    this.spellCheckConfiguration,\n    this.magnifierConfiguration,\n    this.hintLocales,\n  }) : assert(obscuringCharacter.length == 1),\n       smartDashesType =\n           smartDashesType ??\n           (obscureText ? SmartDashesType.disabled : SmartDashesType.enabled),\n       smartQuotesType =\n           smartQuotesType ??\n           (obscureText ? SmartQuotesType.disabled : SmartQuotesType.enabled),\n       assert(maxLines == null || maxLines > 0),\n       assert(minLines == null || minLines > 0),\n       assert(\n         (maxLines == null) || (minLines == null) || (maxLines >= minLines),\n         \"minLines can't be greater than maxLines\",\n       ),\n       assert(\n         !expands || (maxLines == null && minLines == null),\n         'minLines and maxLines must be null when expands is true.',\n       ),\n       assert(\n         !obscureText || maxLines == 1,\n         'Obscured fields cannot be multiline.',\n       ),\n       assert(\n         maxLength == null ||\n             maxLength == RichTextField.noMaxLength ||\n             maxLength > 0,\n       ),\n       // Assert the following instead of setting it directly to avoid surprising the user by silently changing the value they set.\n       assert(\n         !identical(textInputAction, TextInputAction.newline) ||\n             maxLines == 1 ||\n             !identical(keyboardType, TextInputType.text),\n         'Use keyboardType TextInputType.multiline when using TextInputAction.newline on a multiline TextField.',\n       ),\n       keyboardType =\n           keyboardType ??\n           (maxLines == 1 ? TextInputType.text : TextInputType.multiline),\n       enableInteractiveSelection =\n           enableInteractiveSelection ?? (!readOnly || !obscureText);\n\n  /// The configuration for the magnifier of this text field.\n  ///\n  /// By default, builds a [CupertinoTextMagnifier] on iOS and [TextMagnifier]\n  /// on Android, and builds nothing on all other platforms. To suppress the\n  /// magnifier, consider passing [TextMagnifierConfiguration.disabled].\n  ///\n  /// {@macro flutter.widgets.magnifier.intro}\n  ///\n  /// {@tool dartpad}\n  /// This sample demonstrates how to customize the magnifier that this text field uses.\n  ///\n  /// ** See code in examples/api/lib/widgets/text_magnifier/text_magnifier.0.dart **\n  /// {@end-tool}\n  final TextMagnifierConfiguration? magnifierConfiguration;\n\n  /// {@macro flutter.widgets.editableText.groupId}\n  final Object groupId;\n\n  /// Controls the text being edited.\n  ///\n  /// If null, this widget will create its own [RichTextEditingController].\n  final RichTextEditingController controller;\n\n  /// Defines the keyboard focus for this widget.\n  ///\n  /// The [focusNode] is a long-lived object that's typically managed by a\n  /// [StatefulWidget] parent. See [FocusNode] for more information.\n  ///\n  /// To give the keyboard focus to this widget, provide a [focusNode] and then\n  /// use the current [FocusScope] to request the focus:\n  ///\n  /// ```dart\n  /// FocusScope.of(context).requestFocus(myFocusNode);\n  /// ```\n  ///\n  /// This happens automatically when the widget is tapped.\n  ///\n  /// To be notified when the widget gains or loses the focus, add a listener\n  /// to the [focusNode]:\n  ///\n  /// ```dart\n  /// myFocusNode.addListener(() { print(myFocusNode.hasFocus); });\n  /// ```\n  ///\n  /// If null, this widget will create its own [FocusNode].\n  ///\n  /// ## Keyboard\n  ///\n  /// Requesting the focus will typically cause the keyboard to be shown\n  /// if it's not showing already.\n  ///\n  /// On Android, the user can hide the keyboard - without changing the focus -\n  /// with the system back button. They can restore the keyboard's visibility\n  /// by tapping on a text field. The user might hide the keyboard and\n  /// switch to a physical keyboard, or they might just need to get it\n  /// out of the way for a moment, to expose something it's\n  /// obscuring. In this case requesting the focus again will not\n  /// cause the focus to change, and will not make the keyboard visible.\n  ///\n  /// This widget builds an [EditableText] and will ensure that the keyboard is\n  /// showing when it is tapped by calling [EditableTextState.requestKeyboard()].\n  final FocusNode? focusNode;\n\n  /// The decoration to show around the text field.\n  ///\n  /// By default, draws a horizontal line under the text field but can be\n  /// configured to show an icon, label, hint text, and error text.\n  ///\n  /// Specify null to remove the decoration entirely (including the\n  /// extra padding introduced by the decoration to save space for the labels).\n  final InputDecoration? decoration;\n\n  /// {@macro flutter.widgets.editableText.keyboardType}\n  final TextInputType keyboardType;\n\n  /// {@template flutter.widgets.TextField.textInputAction}\n  /// The type of action button to use for the keyboard.\n  ///\n  /// Defaults to [TextInputAction.newline] if [keyboardType] is\n  /// [TextInputType.multiline] and [TextInputAction.done] otherwise.\n  /// {@endtemplate}\n  final TextInputAction? textInputAction;\n\n  /// {@macro flutter.widgets.editableText.textCapitalization}\n  final TextCapitalization textCapitalization;\n\n  /// The style to use for the text being edited.\n  ///\n  /// This text style is also used as the base style for the [decoration].\n  ///\n  /// If null, [TextTheme.bodyLarge] will be used. When the text field is disabled,\n  /// [TextTheme.bodyLarge] with an opacity of 0.38 will be used instead.\n  ///\n  /// If null and [ThemeData.useMaterial3] is false, [TextTheme.titleMedium] will\n  /// be used. When the text field is disabled, [TextTheme.titleMedium] with\n  /// [ThemeData.disabledColor] will be used instead.\n  final TextStyle? style;\n\n  /// {@macro flutter.widgets.editableText.strutStyle}\n  final StrutStyle? strutStyle;\n\n  /// {@macro flutter.widgets.editableText.textAlign}\n  final TextAlign textAlign;\n\n  /// {@macro flutter.material.InputDecorator.textAlignVertical}\n  final TextAlignVertical? textAlignVertical;\n\n  /// {@macro flutter.widgets.editableText.textDirection}\n  final TextDirection? textDirection;\n\n  /// {@macro flutter.widgets.editableText.autofocus}\n  final bool autofocus;\n\n  /// Represents the interactive \"state\" of this widget in terms of a set of\n  /// [WidgetState]s, including [WidgetState.disabled], [WidgetState.hovered],\n  /// [WidgetState.error], and [WidgetState.focused].\n  ///\n  /// Classes based on this one can provide their own\n  /// [WidgetStatesController] to which they've added listeners.\n  /// They can also update the controller's [WidgetStatesController.value]\n  /// however, this may only be done when it's safe to call\n  /// [State.setState], like in an event handler.\n  ///\n  /// The controller's [WidgetStatesController.value] represents the set of\n  /// states that a widget's visual properties, typically [WidgetStateProperty]\n  /// values, are resolved against. It is _not_ the intrinsic state of the widget.\n  /// The widget is responsible for ensuring that the controller's\n  /// [WidgetStatesController.value] tracks its intrinsic state. For example\n  /// one cannot request the keyboard focus for a widget by adding [WidgetState.focused]\n  /// to its controller. When the widget gains the or loses the focus it will\n  /// [WidgetStatesController.update] its controller's [WidgetStatesController.value]\n  /// and notify listeners of the change.\n  final WidgetStatesController? statesController;\n\n  /// {@macro flutter.widgets.editableText.obscuringCharacter}\n  final String obscuringCharacter;\n\n  /// {@macro flutter.widgets.editableText.obscureText}\n  final bool obscureText;\n\n  /// {@macro flutter.widgets.editableText.autocorrect}\n  final bool? autocorrect;\n\n  /// {@macro flutter.services.TextInputConfiguration.smartDashesType}\n  final SmartDashesType smartDashesType;\n\n  /// {@macro flutter.services.TextInputConfiguration.smartQuotesType}\n  final SmartQuotesType smartQuotesType;\n\n  /// {@macro flutter.services.TextInputConfiguration.enableSuggestions}\n  final bool enableSuggestions;\n\n  /// {@macro flutter.widgets.editableText.maxLines}\n  ///  * [expands], which determines whether the field should fill the height of\n  ///    its parent.\n  final int? maxLines;\n\n  /// {@macro flutter.widgets.editableText.minLines}\n  ///  * [expands], which determines whether the field should fill the height of\n  ///    its parent.\n  final int? minLines;\n\n  /// {@macro flutter.widgets.editableText.expands}\n  final bool expands;\n\n  /// {@macro flutter.widgets.editableText.readOnly}\n  final bool readOnly;\n\n  /// Configuration of toolbar options.\n  ///\n  /// If not set, select all and paste will default to be enabled. Copy and cut\n  /// will be disabled if [obscureText] is true. If [readOnly] is true,\n  /// paste and cut will be disabled regardless.\n  @Deprecated(\n    'Use `contextMenuBuilder` instead. '\n    'This feature was deprecated after v3.3.0-0.5.pre.',\n  )\n  final ToolbarOptions? toolbarOptions;\n\n  /// {@macro flutter.widgets.editableText.showCursor}\n  final bool? showCursor;\n\n  /// If [maxLength] is set to this value, only the \"current input length\"\n  /// part of the character counter is shown.\n  static const int noMaxLength = -1;\n\n  /// The maximum number of characters (Unicode grapheme clusters) to allow in\n  /// the text field.\n  ///\n  /// If set, a character counter will be displayed below the\n  /// field showing how many characters have been entered. If set to a number\n  /// greater than 0, it will also display the maximum number allowed. If set\n  /// to [RichTextField.noMaxLength] then only the current character count is displayed.\n  /// To remove the counter, set [InputDecoration.counterText] to an empty string or\n  /// return null from [RichTextField.buildCounter] callback.\n  ///\n  /// After [maxLength] characters have been input, additional input\n  /// is ignored, unless [maxLengthEnforcement] is set to\n  /// [MaxLengthEnforcement.none].\n  ///\n  /// The text field enforces the length with a [LengthLimitingTextInputFormatter],\n  /// which is evaluated after the supplied [inputFormatters], if any.\n  ///\n  /// This value must be either null, [RichTextField.noMaxLength], or greater than 0.\n  /// If null (the default) then there is no limit to the number of characters\n  /// that can be entered. If set to [RichTextField.noMaxLength], then no limit will\n  /// be enforced, but the number of characters entered will still be displayed.\n  ///\n  /// Whitespace characters (e.g. newline, space, tab) are included in the\n  /// character count.\n  ///\n  /// If [maxLengthEnforcement] is [MaxLengthEnforcement.none], then more than\n  /// [maxLength] characters may be entered, but the error counter and divider\n  /// will switch to the [decoration]'s [InputDecoration.errorStyle] when the\n  /// limit is exceeded.\n  ///\n  /// {@macro flutter.services.lengthLimitingTextInputFormatter.maxLength}\n  final int? maxLength;\n\n  /// Determines how the [maxLength] limit should be enforced.\n  ///\n  /// {@macro flutter.services.textFormatter.effectiveMaxLengthEnforcement}\n  ///\n  /// {@macro flutter.services.textFormatter.maxLengthEnforcement}\n  final MaxLengthEnforcement? maxLengthEnforcement;\n\n  /// {@macro flutter.widgets.editableText.onChanged}\n  ///\n  /// See also:\n  ///\n  ///  * [inputFormatters], which are called before [onChanged]\n  ///    runs and can validate and change (\"format\") the input value.\n  ///  * [onEditingComplete], [onSubmitted]:\n  ///    which are more specialized input change notifications.\n  final ValueChanged<String>? onChanged;\n\n  /// {@macro flutter.widgets.editableText.onEditingComplete}\n  final VoidCallback? onEditingComplete;\n\n  /// {@macro flutter.widgets.editableText.onSubmitted}\n  ///\n  /// See also:\n  ///\n  ///  * [TextInputAction.next] and [TextInputAction.previous], which\n  ///    automatically shift the focus to the next/previous focusable item when\n  ///    the user is done editing.\n  final ValueChanged<String>? onSubmitted;\n\n  /// {@macro flutter.widgets.editableText.onAppPrivateCommand}\n  final AppPrivateCommandCallback? onAppPrivateCommand;\n\n  /// {@macro flutter.widgets.editableText.inputFormatters}\n  final List<TextInputFormatter>? inputFormatters;\n\n  /// If false the text field is \"disabled\": it ignores taps and its\n  /// [decoration] is rendered in grey.\n  ///\n  /// If non-null this property overrides the [decoration]'s\n  /// [InputDecoration.enabled] property.\n  ///\n  /// When a text field is disabled, all of its children widgets are also\n  /// disabled, including the [InputDecoration.suffixIcon]. If you need to keep\n  /// the suffix icon interactive while disabling the text field, consider using\n  /// [readOnly] and [enableInteractiveSelection] instead:\n  ///\n  /// ```dart\n  /// TextField(\n  ///   enabled: true,\n  ///   readOnly: true,\n  ///   enableInteractiveSelection: false,\n  ///   decoration: InputDecoration(\n  ///     suffixIcon: IconButton(\n  ///       onPressed: () {\n  ///         // This will work because the TextField is enabled\n  ///       },\n  ///       icon: const Icon(Icons.edit_outlined),\n  ///     ),\n  ///   ),\n  /// )\n  /// ```\n  final bool? enabled;\n\n  /// Determines whether this widget ignores pointer events.\n  ///\n  /// Defaults to null, and when null, does nothing.\n  final bool? ignorePointers;\n\n  /// {@macro flutter.widgets.editableText.cursorWidth}\n  final double cursorWidth;\n\n  /// {@macro flutter.widgets.editableText.cursorHeight}\n  final double? cursorHeight;\n\n  /// {@macro flutter.widgets.editableText.cursorRadius}\n  final Radius? cursorRadius;\n\n  /// {@macro flutter.widgets.editableText.cursorOpacityAnimates}\n  final bool? cursorOpacityAnimates;\n\n  /// The color of the cursor.\n  ///\n  /// The cursor indicates the current location of text insertion point in\n  /// the field.\n  ///\n  /// If this is null it will default to the ambient\n  /// [DefaultSelectionStyle.cursorColor]. If that is null, and the\n  /// [ThemeData.platform] is [TargetPlatform.iOS] or [TargetPlatform.macOS]\n  /// it will use [CupertinoThemeData.primaryColor]. Otherwise it will use\n  /// the value of [ColorScheme.primary] of [ThemeData.colorScheme].\n  final Color? cursorColor;\n\n  /// The color of the cursor when the [InputDecorator] is showing an error.\n  ///\n  /// If this is null it will default to [TextStyle.color] of\n  /// [InputDecoration.errorStyle]. If that is null, it will use\n  /// [ColorScheme.error] of [ThemeData.colorScheme].\n  final Color? cursorErrorColor;\n\n  /// Controls how tall the selection highlight boxes are computed to be.\n  ///\n  /// See [ui.BoxHeightStyle] for details on available styles.\n  final ui.BoxHeightStyle? selectionHeightStyle;\n\n  /// Controls how wide the selection highlight boxes are computed to be.\n  ///\n  /// See [ui.BoxWidthStyle] for details on available styles.\n  final ui.BoxWidthStyle? selectionWidthStyle;\n\n  /// The appearance of the keyboard.\n  ///\n  /// This setting is only honored on iOS devices.\n  ///\n  /// If unset, defaults to [ThemeData.brightness].\n  final Brightness? keyboardAppearance;\n\n  /// {@macro flutter.widgets.editableText.scrollPadding}\n  final EdgeInsets scrollPadding;\n\n  /// {@macro flutter.widgets.editableText.enableInteractiveSelection}\n  final bool enableInteractiveSelection;\n\n  /// {@macro flutter.widgets.editableText.selectAllOnFocus}\n  final bool? selectAllOnFocus;\n\n  /// {@macro flutter.widgets.editableText.selectionControls}\n  final TextSelectionControls? selectionControls;\n\n  /// {@macro flutter.widgets.scrollable.dragStartBehavior}\n  final DragStartBehavior dragStartBehavior;\n\n  /// {@macro flutter.widgets.editableText.selectionEnabled}\n  bool get selectionEnabled => enableInteractiveSelection;\n\n  /// {@template flutter.material.textfield.onTap}\n  /// Called for the first tap in a series of taps.\n  ///\n  /// The text field builds a [GestureDetector] to handle input events like tap,\n  /// to trigger focus requests, to move the caret, adjust the selection, etc.\n  /// Handling some of those events by wrapping the text field with a competing\n  /// GestureDetector is problematic.\n  ///\n  /// To unconditionally handle taps, without interfering with the text field's\n  /// internal gesture detector, provide this callback.\n  ///\n  /// If the text field is created with [enabled] false, taps will not be\n  /// recognized.\n  ///\n  /// To be notified when the text field gains or loses the focus, provide a\n  /// [focusNode] and add a listener to that.\n  ///\n  /// To listen to arbitrary pointer events without competing with the\n  /// text field's internal gesture detector, use a [Listener].\n  /// {@endtemplate}\n  ///\n  /// If [onTapAlwaysCalled] is enabled, this will also be called for consecutive\n  /// taps.\n  final GestureTapCallback? onTap;\n\n  /// Whether [onTap] should be called for every tap.\n  ///\n  /// Defaults to false, so [onTap] is only called for each distinct tap. When\n  /// enabled, [onTap] is called for every tap including consecutive taps.\n  final bool onTapAlwaysCalled;\n\n  /// {@macro flutter.widgets.editableText.onTapOutside}\n  ///\n  /// {@tool dartpad}\n  /// This example shows how to use a `TextFieldTapRegion` to wrap a set of\n  /// \"spinner\" buttons that increment and decrement a value in the [RichTextField]\n  /// without causing the text field to lose keyboard focus.\n  ///\n  /// This example includes a generic `SpinnerField<T>` class that you can copy\n  /// into your own project and customize.\n  ///\n  /// ** See code in examples/api/lib/widgets/tap_region/text_field_tap_region.0.dart **\n  /// {@end-tool}\n  ///\n  /// See also:\n  ///\n  ///  * [TapRegion] for how the region group is determined.\n  final TapRegionCallback? onTapOutside;\n\n  /// {@macro flutter.widgets.editableText.onTapUpOutside}\n  final TapRegionUpCallback? onTapUpOutside;\n\n  /// The cursor for a mouse pointer when it enters or is hovering over the\n  /// widget.\n  ///\n  /// If [mouseCursor] is a [WidgetStateMouseCursor],\n  /// [WidgetStateProperty.resolve] is used for the following [WidgetState]s:\n  ///\n  ///  * [WidgetState.error].\n  ///  * [WidgetState.hovered].\n  ///  * [WidgetState.focused].\n  ///  * [WidgetState.disabled].\n  ///\n  /// If this property is null, [WidgetStateMouseCursor.textable] will be used.\n  ///\n  /// The [mouseCursor] is the only property of [RichTextField] that controls the\n  /// appearance of the mouse pointer. All other properties related to \"cursor\"\n  /// stand for the text cursor, which is usually a blinking vertical line at\n  /// the editing position.\n  final MouseCursor? mouseCursor;\n\n  /// Callback that generates a custom [InputDecoration.counter] widget.\n  ///\n  /// See [InputCounterWidgetBuilder] for an explanation of the passed in\n  /// arguments. The returned widget will be placed below the line in place of\n  /// the default widget built when [InputDecoration.counterText] is specified.\n  ///\n  /// The returned widget will be wrapped in a [Semantics] widget for\n  /// accessibility, but it also needs to be accessible itself. For example,\n  /// if returning a Text widget, set the [Text.semanticsLabel] property.\n  ///\n  /// {@tool snippet}\n  /// ```dart\n  /// Widget counter(\n  ///   BuildContext context,\n  ///   {\n  ///     required int currentLength,\n  ///     required int? maxLength,\n  ///     required bool isFocused,\n  ///   }\n  /// ) {\n  ///   return Text(\n  ///     '$currentLength of $maxLength characters',\n  ///     semanticsLabel: 'character count',\n  ///   );\n  /// }\n  /// ```\n  /// {@end-tool}\n  ///\n  /// If buildCounter returns null, then no counter and no Semantics widget will\n  /// be created at all.\n  final InputCounterWidgetBuilder? buildCounter;\n\n  /// {@macro flutter.widgets.editableText.scrollPhysics}\n  final ScrollPhysics? scrollPhysics;\n\n  /// {@macro flutter.widgets.editableText.scrollController}\n  final ScrollController? scrollController;\n\n  /// {@macro flutter.widgets.editableText.autofillHints}\n  /// {@macro flutter.services.AutofillConfiguration.autofillHints}\n  final Iterable<String>? autofillHints;\n\n  /// {@macro flutter.material.Material.clipBehavior}\n  ///\n  /// Defaults to [Clip.hardEdge].\n  final Clip clipBehavior;\n\n  /// {@template flutter.material.textfield.restorationId}\n  /// Restoration ID to save and restore the state of the text field.\n  ///\n  /// If non-null, the text field will persist and restore its current scroll\n  /// offset and - if no [controller] has been provided - the content of the\n  /// text field. If a [controller] has been provided, it is the responsibility\n  /// of the owner of that controller to persist and restore it, e.g. by using\n  /// a [RestorableRichTextEditingController].\n  ///\n  /// The state of this widget is persisted in a [RestorationBucket] claimed\n  /// from the surrounding [RestorationScope] using the provided restoration ID.\n  ///\n  /// See also:\n  ///\n  ///  * [RestorationManager], which explains how state restoration works in\n  ///    Flutter.\n  /// {@endtemplate}\n  final String? restorationId;\n\n  /// {@macro flutter.widgets.editableText.scribbleEnabled}\n  @Deprecated(\n    'Use `stylusHandwritingEnabled` instead. '\n    'This feature was deprecated after v3.27.0-0.2.pre.',\n  )\n  final bool scribbleEnabled;\n\n  /// {@macro flutter.widgets.editableText.stylusHandwritingEnabled}\n  final bool stylusHandwritingEnabled;\n\n  /// {@macro flutter.services.TextInputConfiguration.enableIMEPersonalizedLearning}\n  final bool enableIMEPersonalizedLearning;\n\n  /// {@macro flutter.widgets.editableText.contentInsertionConfiguration}\n  final ContentInsertionConfiguration? contentInsertionConfiguration;\n\n  /// {@macro flutter.widgets.EditableText.contextMenuBuilder}\n  ///\n  /// If not provided, will build a default menu based on the platform.\n  ///\n  /// See also:\n  ///\n  ///  * [AdaptiveTextSelectionToolbar], which is built by default.\n  ///  * [BrowserContextMenu], which allows the browser's context menu on web to\n  ///    be disabled and Flutter-rendered context menus to appear.\n  final EditableTextContextMenuBuilder? contextMenuBuilder;\n\n  /// Determine whether this text field can request the primary focus.\n  ///\n  /// Defaults to true. If false, the text field will not request focus\n  /// when tapped, or when its context menu is displayed. If false it will not\n  /// be possible to move the focus to the text field with tab key.\n  final bool canRequestFocus;\n\n  /// {@macro flutter.services.TextInputConfiguration.hintLocales}\n  final List<Locale>? hintLocales;\n\n  static Widget _defaultContextMenuBuilder(\n    BuildContext context,\n    EditableTextState editableTextState,\n  ) {\n    if (SystemContextMenu.isSupportedByField(editableTextState)) {\n      return SystemContextMenu.editableText(\n        editableTextState: editableTextState,\n      );\n    }\n    return AdaptiveTextSelectionToolbar.editableText(\n      editableTextState: editableTextState,\n    );\n  }\n\n  /// {@macro flutter.widgets.EditableText.spellCheckConfiguration}\n  ///\n  /// If [SpellCheckConfiguration.misspelledTextStyle] is not specified in this\n  /// configuration, then [materialMisspelledTextStyle] is used by default.\n  final SpellCheckConfiguration? spellCheckConfiguration;\n\n  /// The [TextStyle] used to indicate misspelled words in the Material style.\n  ///\n  /// See also:\n  ///  * [SpellCheckConfiguration.misspelledTextStyle], the style configured to\n  ///    mark misspelled words with.\n  ///  * [CupertinoRichTextField.cupertinoMisspelledTextStyle], the style configured\n  ///    to mark misspelled words with in the Cupertino style.\n  static const TextStyle materialMisspelledTextStyle = TextStyle(\n    decoration: TextDecoration.underline,\n    decorationColor: Colors.red,\n    decorationStyle: TextDecorationStyle.wavy,\n  );\n\n  /// Default builder for [RichTextField]'s spell check suggestions toolbar.\n  ///\n  /// On Apple platforms, builds an iOS-style toolbar. Everywhere else, builds\n  /// an Android-style toolbar.\n  ///\n  /// See also:\n  ///  * [spellCheckConfiguration], where this is typically specified for\n  ///    [RichTextField].\n  ///  * [SpellCheckConfiguration.spellCheckSuggestionsToolbarBuilder], the\n  ///    parameter for which this is the default value for [RichTextField].\n  ///  * [CupertinoRichTextField.defaultSpellCheckSuggestionsToolbarBuilder], which\n  ///    is like this but specifies the default for [CupertinoRichTextField].\n  @visibleForTesting\n  static Widget defaultSpellCheckSuggestionsToolbarBuilder(\n    BuildContext context,\n    EditableTextState editableTextState,\n  ) {\n    switch (defaultTargetPlatform) {\n      case TargetPlatform.iOS:\n      case TargetPlatform.macOS:\n        return CupertinoSpellCheckSuggestionsToolbar.editableText(\n          editableTextState: editableTextState,\n        );\n      case TargetPlatform.android:\n      case TargetPlatform.fuchsia:\n      case TargetPlatform.linux:\n      case TargetPlatform.windows:\n        return SpellCheckSuggestionsToolbar.editableText(\n          editableTextState: editableTextState,\n        );\n    }\n  }\n\n  /// Returns a new [SpellCheckConfiguration] where the given configuration has\n  /// had any missing values replaced with their defaults for the Android\n  /// platform.\n  static SpellCheckConfiguration inferAndroidSpellCheckConfiguration(\n    SpellCheckConfiguration? configuration,\n  ) {\n    if (configuration == null ||\n        configuration == const SpellCheckConfiguration.disabled()) {\n      return const SpellCheckConfiguration.disabled();\n    }\n    return configuration.copyWith(\n      misspelledTextStyle:\n          configuration.misspelledTextStyle ??\n          RichTextField.materialMisspelledTextStyle,\n      spellCheckSuggestionsToolbarBuilder:\n          configuration.spellCheckSuggestionsToolbarBuilder ??\n          RichTextField.defaultSpellCheckSuggestionsToolbarBuilder,\n    );\n  }\n\n  @override\n  State<RichTextField> createState() => RichTextFieldState();\n\n  @override\n  void debugFillProperties(DiagnosticPropertiesBuilder properties) {\n    super.debugFillProperties(properties);\n    properties\n      ..add(\n        DiagnosticsProperty<RichTextEditingController>(\n          'controller',\n          controller,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<FocusNode>(\n          'focusNode',\n          focusNode,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<bool>('enabled', enabled, defaultValue: null),\n      )\n      ..add(\n        DiagnosticsProperty<InputDecoration>(\n          'decoration',\n          decoration,\n          defaultValue: const InputDecoration(),\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<TextInputType>(\n          'keyboardType',\n          keyboardType,\n          defaultValue: TextInputType.text,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<TextStyle>('style', style, defaultValue: null),\n      )\n      ..add(\n        DiagnosticsProperty<bool>('autofocus', autofocus, defaultValue: false),\n      )\n      ..add(\n        DiagnosticsProperty<String>(\n          'obscuringCharacter',\n          obscuringCharacter,\n          defaultValue: '•',\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<bool>(\n          'obscureText',\n          obscureText,\n          defaultValue: false,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<bool>(\n          'autocorrect',\n          autocorrect,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        EnumProperty<SmartDashesType>(\n          'smartDashesType',\n          smartDashesType,\n          defaultValue: obscureText\n              ? SmartDashesType.disabled\n              : SmartDashesType.enabled,\n        ),\n      )\n      ..add(\n        EnumProperty<SmartQuotesType>(\n          'smartQuotesType',\n          smartQuotesType,\n          defaultValue: obscureText\n              ? SmartQuotesType.disabled\n              : SmartQuotesType.enabled,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<bool>(\n          'enableSuggestions',\n          enableSuggestions,\n          defaultValue: true,\n        ),\n      )\n      ..add(IntProperty('maxLines', maxLines, defaultValue: 1))\n      ..add(IntProperty('minLines', minLines, defaultValue: null))\n      ..add(\n        DiagnosticsProperty<bool>('expands', expands, defaultValue: false),\n      )\n      ..add(IntProperty('maxLength', maxLength, defaultValue: null))\n      ..add(\n        EnumProperty<MaxLengthEnforcement>(\n          'maxLengthEnforcement',\n          maxLengthEnforcement,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        EnumProperty<TextInputAction>(\n          'textInputAction',\n          textInputAction,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        EnumProperty<TextCapitalization>(\n          'textCapitalization',\n          textCapitalization,\n          defaultValue: TextCapitalization.none,\n        ),\n      )\n      ..add(\n        EnumProperty<TextAlign>(\n          'textAlign',\n          textAlign,\n          defaultValue: TextAlign.start,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<TextAlignVertical>(\n          'textAlignVertical',\n          textAlignVertical,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        EnumProperty<TextDirection>(\n          'textDirection',\n          textDirection,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DoubleProperty('cursorWidth', cursorWidth, defaultValue: 2.0),\n      )\n      ..add(\n        DoubleProperty('cursorHeight', cursorHeight, defaultValue: null),\n      )\n      ..add(\n        DiagnosticsProperty<Radius>(\n          'cursorRadius',\n          cursorRadius,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<bool>(\n          'cursorOpacityAnimates',\n          cursorOpacityAnimates,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        ColorProperty('cursorColor', cursorColor, defaultValue: null),\n      )\n      ..add(\n        ColorProperty('cursorErrorColor', cursorErrorColor, defaultValue: null),\n      )\n      ..add(\n        DiagnosticsProperty<Brightness>(\n          'keyboardAppearance',\n          keyboardAppearance,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<EdgeInsetsGeometry>(\n          'scrollPadding',\n          scrollPadding,\n          defaultValue: const EdgeInsets.all(20.0),\n        ),\n      )\n      ..add(\n        FlagProperty(\n          'selectionEnabled',\n          value: selectionEnabled,\n          defaultValue: true,\n          ifFalse: 'selection disabled',\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<TextSelectionControls>(\n          'selectionControls',\n          selectionControls,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<ScrollController>(\n          'scrollController',\n          scrollController,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<ScrollPhysics>(\n          'scrollPhysics',\n          scrollPhysics,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<Clip>(\n          'clipBehavior',\n          clipBehavior,\n          defaultValue: Clip.hardEdge,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<bool>(\n          'scribbleEnabled',\n          scribbleEnabled,\n          defaultValue: true,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<bool>(\n          'stylusHandwritingEnabled',\n          stylusHandwritingEnabled,\n          defaultValue: EditableText.defaultStylusHandwritingEnabled,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<bool>(\n          'enableIMEPersonalizedLearning',\n          enableIMEPersonalizedLearning,\n          defaultValue: true,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<SpellCheckConfiguration>(\n          'spellCheckConfiguration',\n          spellCheckConfiguration,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<List<String>>(\n          'contentCommitMimeTypes',\n          contentInsertionConfiguration?.allowedMimeTypes ?? const <String>[],\n          defaultValue: contentInsertionConfiguration == null\n              ? const <String>[]\n              : kDefaultContentInsertionMimeTypes,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<List<Locale>?>(\n          'hintLocales',\n          hintLocales,\n          defaultValue: null,\n        ),\n      );\n  }\n}\n\nclass RichTextFieldState extends State<RichTextField>\n    with RestorationMixin\n    implements TextSelectionGestureDetectorBuilderDelegate, AutofillClient {\n  RichTextEditingController get _effectiveController => widget.controller;\n\n  FocusNode? _focusNode;\n  FocusNode get _effectiveFocusNode =>\n      widget.focusNode ?? (_focusNode ??= FocusNode());\n\n  MaxLengthEnforcement get _effectiveMaxLengthEnforcement =>\n      widget.maxLengthEnforcement ??\n      LengthLimitingTextInputFormatter.getDefaultMaxLengthEnforcement(\n        Theme.of(context).platform,\n      );\n\n  bool _isHovering = false;\n\n  bool get needsCounter =>\n      widget.maxLength != null &&\n      widget.decoration != null &&\n      widget.decoration!.counterText == null;\n\n  bool _showSelectionHandles = false;\n\n  late _TextFieldSelectionGestureDetectorBuilder\n  _selectionGestureDetectorBuilder;\n\n  // API for TextSelectionGestureDetectorBuilderDelegate.\n  @override\n  late bool forcePressEnabled;\n\n  @override\n  final GlobalKey<EditableTextState> editableTextKey =\n      GlobalKey<EditableTextState>();\n\n  @override\n  bool get selectionEnabled => widget.selectionEnabled && _isEnabled;\n  // End of API for TextSelectionGestureDetectorBuilderDelegate.\n\n  bool get _isEnabled => widget.enabled ?? widget.decoration?.enabled ?? true;\n\n  int get _currentLength => _effectiveController.value.text.characters.length;\n\n  bool get _hasIntrinsicError =>\n      widget.maxLength != null &&\n      widget.maxLength! > 0 &&\n      _effectiveController.value.text.characters.length > widget.maxLength!;\n\n  bool get _hasError =>\n      widget.decoration?.errorText != null ||\n      widget.decoration?.error != null ||\n      _hasIntrinsicError;\n\n  Color get _errorColor =>\n      widget.cursorErrorColor ??\n      _getEffectiveDecoration().errorStyle?.color ??\n      Theme.of(context).colorScheme.error;\n\n  InputDecoration _getEffectiveDecoration() {\n    final MaterialLocalizations localizations = MaterialLocalizations.of(\n      context,\n    );\n    final ThemeData themeData = Theme.of(context);\n    final InputDecorationThemeData decorationTheme = InputDecorationTheme.of(\n      context,\n    );\n    final InputDecoration effectiveDecoration =\n        (widget.decoration ?? const InputDecoration())\n            .applyDefaults(decorationTheme)\n            .copyWith(\n              enabled: _isEnabled,\n              hintMaxLines:\n                  widget.decoration?.hintMaxLines ??\n                  decorationTheme.hintMaxLines ??\n                  widget.maxLines,\n            );\n\n    // No need to build anything if counter or counterText were given directly.\n    if (effectiveDecoration.counter != null ||\n        effectiveDecoration.counterText != null) {\n      return effectiveDecoration;\n    }\n\n    // If buildCounter was provided, use it to generate a counter widget.\n    Widget? counter;\n    final int currentLength = _currentLength;\n    if (effectiveDecoration.counter == null &&\n        effectiveDecoration.counterText == null &&\n        widget.buildCounter != null) {\n      final bool isFocused = _effectiveFocusNode.hasFocus;\n      final Widget? builtCounter = widget.buildCounter!(\n        context,\n        currentLength: currentLength,\n        maxLength: widget.maxLength,\n        isFocused: isFocused,\n      );\n      // If buildCounter returns null, don't add a counter widget to the field.\n      if (builtCounter != null) {\n        counter = Semantics(\n          container: true,\n          liveRegion: isFocused,\n          child: builtCounter,\n        );\n      }\n      return effectiveDecoration.copyWith(counter: counter);\n    }\n\n    if (widget.maxLength == null) {\n      return effectiveDecoration;\n    } // No counter widget\n\n    var counterText = '$currentLength';\n    var semanticCounterText = '';\n\n    // Handle a real maxLength (positive number)\n    if (widget.maxLength! > 0) {\n      // Show the maxLength in the counter\n      counterText += '/${widget.maxLength}';\n      final int remaining = (widget.maxLength! - currentLength).clamp(\n        0,\n        widget.maxLength!,\n      );\n      semanticCounterText = localizations.remainingTextFieldCharacterCount(\n        remaining,\n      );\n    }\n\n    if (_hasIntrinsicError) {\n      return effectiveDecoration.copyWith(\n        errorText: effectiveDecoration.errorText ?? '',\n        counterStyle:\n            effectiveDecoration.errorStyle ??\n            (themeData.useMaterial3\n                ? _m3CounterErrorStyle(context)\n                : _m2CounterErrorStyle(context)),\n        counterText: counterText,\n        semanticCounterText: semanticCounterText,\n      );\n    }\n\n    return effectiveDecoration.copyWith(\n      counterText: counterText,\n      semanticCounterText: semanticCounterText,\n    );\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    _selectionGestureDetectorBuilder =\n        _TextFieldSelectionGestureDetectorBuilder(\n          state: this,\n          controller: widget.controller,\n        );\n    _effectiveFocusNode.canRequestFocus = widget.canRequestFocus && _isEnabled;\n    _effectiveFocusNode.addListener(_handleFocusChanged);\n    _initStatesController();\n  }\n\n  bool get _canRequestFocus {\n    final NavigationMode mode =\n        MediaQuery.maybeNavigationModeOf(context) ?? NavigationMode.traditional;\n    return switch (mode) {\n      NavigationMode.traditional => widget.canRequestFocus && _isEnabled,\n      NavigationMode.directional => true,\n    };\n  }\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    _effectiveFocusNode.canRequestFocus = _canRequestFocus;\n  }\n\n  @override\n  void didUpdateWidget(RichTextField oldWidget) {\n    super.didUpdateWidget(oldWidget);\n\n    if (widget.focusNode != oldWidget.focusNode) {\n      (oldWidget.focusNode ?? _focusNode)?.removeListener(_handleFocusChanged);\n      (widget.focusNode ?? _focusNode)?.addListener(_handleFocusChanged);\n    }\n\n    _effectiveFocusNode.canRequestFocus = _canRequestFocus;\n\n    if (_effectiveFocusNode.hasFocus &&\n        widget.readOnly != oldWidget.readOnly &&\n        _isEnabled) {\n      if (_effectiveController.selection.isCollapsed) {\n        _showSelectionHandles = !widget.readOnly;\n      }\n    }\n\n    if (widget.statesController == oldWidget.statesController) {\n      _statesController\n        ..update(WidgetState.disabled, !_isEnabled)\n        ..update(WidgetState.hovered, _isHovering)\n        ..update(WidgetState.focused, _effectiveFocusNode.hasFocus)\n        ..update(WidgetState.error, _hasError);\n    } else {\n      oldWidget.statesController?.removeListener(_handleStatesControllerChange);\n      if (widget.statesController != null) {\n        _internalStatesController?.dispose();\n        _internalStatesController = null;\n      }\n      _initStatesController();\n    }\n  }\n\n  @override\n  void restoreState(RestorationBucket? oldBucket, bool initialRestore) {}\n\n  @override\n  String? get restorationId => widget.restorationId;\n\n  @override\n  void dispose() {\n    _effectiveFocusNode.removeListener(_handleFocusChanged);\n    _focusNode?.dispose();\n    _statesController.removeListener(_handleStatesControllerChange);\n    _internalStatesController?.dispose();\n    super.dispose();\n  }\n\n  EditableTextState? get _editableText => editableTextKey.currentState;\n\n  void _requestKeyboard() {\n    _editableText?.requestKeyboard();\n  }\n\n  bool _shouldShowSelectionHandles(SelectionChangedCause? cause) {\n    // When the text field is activated by something that doesn't trigger the\n    // selection toolbar, we shouldn't show the handles either.\n    if (!_selectionGestureDetectorBuilder.shouldShowSelectionToolbar ||\n        !_selectionGestureDetectorBuilder.shouldShowSelectionHandles) {\n      return false;\n    }\n\n    if (cause == SelectionChangedCause.keyboard) {\n      return false;\n    }\n\n    if (widget.readOnly && _effectiveController.selection.isCollapsed) {\n      return false;\n    }\n\n    if (!_isEnabled) {\n      return false;\n    }\n\n    if (cause == SelectionChangedCause.longPress ||\n        cause == SelectionChangedCause.stylusHandwriting) {\n      return true;\n    }\n\n    if (_effectiveController.text.isNotEmpty) {\n      return true;\n    }\n\n    return false;\n  }\n\n  void _handleFocusChanged() {\n    setState(() {\n      // Rebuild the widget on focus change to show/hide the text selection\n      // highlight.\n    });\n    _statesController.update(WidgetState.focused, _effectiveFocusNode.hasFocus);\n  }\n\n  void _handleSelectionChanged(\n    TextSelection selection,\n    SelectionChangedCause? cause,\n  ) {\n    final bool willShowSelectionHandles = _shouldShowSelectionHandles(cause);\n    if (willShowSelectionHandles != _showSelectionHandles) {\n      setState(() {\n        _showSelectionHandles = willShowSelectionHandles;\n      });\n    }\n\n    switch (Theme.of(context).platform) {\n      case TargetPlatform.iOS:\n      case TargetPlatform.macOS:\n      case TargetPlatform.linux:\n      case TargetPlatform.windows:\n      case TargetPlatform.fuchsia:\n      case TargetPlatform.android:\n        if (cause == SelectionChangedCause.longPress) {\n          _editableText?.bringIntoView(selection.extent);\n        }\n    }\n\n    switch (Theme.of(context).platform) {\n      case TargetPlatform.iOS:\n      case TargetPlatform.fuchsia:\n      case TargetPlatform.android:\n        break;\n      case TargetPlatform.macOS:\n      case TargetPlatform.linux:\n      case TargetPlatform.windows:\n        if (cause == SelectionChangedCause.drag) {\n          _editableText?.hideToolbar();\n        }\n    }\n  }\n\n  /// Toggle the toolbar when a selection handle is tapped.\n  void _handleSelectionHandleTapped() {\n    if (_effectiveController.selection.isCollapsed) {\n      _editableText!.toggleToolbar();\n    }\n  }\n\n  void _handleHover(bool hovering) {\n    if (hovering != _isHovering) {\n      setState(() {\n        _isHovering = hovering;\n      });\n      _statesController.update(WidgetState.hovered, _isHovering);\n    }\n  }\n\n  // Material states controller.\n  WidgetStatesController? _internalStatesController;\n\n  void _handleStatesControllerChange() {\n    // Force a rebuild to resolve WidgetStateProperty properties.\n    setState(() {});\n  }\n\n  WidgetStatesController get _statesController =>\n      widget.statesController ?? _internalStatesController!;\n\n  void _initStatesController() {\n    if (widget.statesController == null) {\n      _internalStatesController = WidgetStatesController();\n    }\n    _statesController\n      ..update(WidgetState.disabled, !_isEnabled)\n      ..update(WidgetState.hovered, _isHovering)\n      ..update(WidgetState.focused, _effectiveFocusNode.hasFocus)\n      ..update(WidgetState.error, _hasError)\n      ..addListener(_handleStatesControllerChange);\n  }\n\n  // AutofillClient implementation start.\n  @override\n  String get autofillId => _editableText!.autofillId;\n\n  @override\n  void autofill(TextEditingValue newEditingValue) =>\n      _editableText!.autofill(newEditingValue);\n\n  @override\n  TextInputConfiguration get textInputConfiguration {\n    final List<String>? autofillHints = widget.autofillHints?.toList(\n      growable: false,\n    );\n    final AutofillConfiguration autofillConfiguration = autofillHints != null\n        ? AutofillConfiguration(\n            uniqueIdentifier: autofillId,\n            autofillHints: autofillHints,\n            currentEditingValue: _effectiveController.value,\n            hintText: (widget.decoration ?? const InputDecoration()).hintText,\n          )\n        : AutofillConfiguration.disabled;\n\n    return _editableText!.textInputConfiguration.copyWith(\n      autofillConfiguration: autofillConfiguration,\n    );\n  }\n  // AutofillClient implementation end.\n\n  TextStyle _getInputStyleForState(TextStyle style) {\n    final ThemeData theme = Theme.of(context);\n    final TextStyle stateStyle = WidgetStateProperty.resolveAs(\n      theme.useMaterial3\n          ? _m3StateInputStyle(context)!\n          : _m2StateInputStyle(context)!,\n      _statesController.value,\n    );\n    final TextStyle providedStyle = WidgetStateProperty.resolveAs(\n      style,\n      _statesController.value,\n    );\n    return providedStyle.merge(stateStyle);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    assert(debugCheckHasMaterial(context));\n    assert(debugCheckHasMaterialLocalizations(context));\n    assert(debugCheckHasDirectionality(context));\n    assert(\n      !(widget.style != null &&\n          !widget.style!.inherit &&\n          (widget.style!.fontSize == null ||\n              widget.style!.textBaseline == null)),\n      'inherit false style must supply fontSize and textBaseline',\n    );\n\n    final ThemeData theme = Theme.of(context);\n    final DefaultSelectionStyle selectionStyle = DefaultSelectionStyle.of(\n      context,\n    );\n    final TextStyle? providedStyle = WidgetStateProperty.resolveAs(\n      widget.style,\n      _statesController.value,\n    );\n    final TextStyle style = _getInputStyleForState(\n      theme.useMaterial3\n          ? _m3InputStyle(context)\n          : theme.textTheme.titleMedium!,\n    ).merge(providedStyle);\n    final Brightness keyboardAppearance =\n        widget.keyboardAppearance ?? theme.brightness;\n    final RichTextEditingController controller = _effectiveController;\n    final FocusNode focusNode = _effectiveFocusNode;\n    final formatters = <TextInputFormatter>[\n      ...?widget.inputFormatters,\n      if (widget.maxLength != null)\n        LengthLimitingTextInputFormatter(\n          widget.maxLength,\n          maxLengthEnforcement: _effectiveMaxLengthEnforcement,\n        ),\n    ];\n\n    // Set configuration as disabled if not otherwise specified. If specified,\n    // ensure that configuration uses the correct style for misspelled words for\n    // the current platform, unless a custom style is specified.\n    final SpellCheckConfiguration spellCheckConfiguration;\n    switch (defaultTargetPlatform) {\n      case TargetPlatform.iOS:\n      case TargetPlatform.macOS:\n        spellCheckConfiguration =\n            CupertinoRichTextField.inferIOSSpellCheckConfiguration(\n              widget.spellCheckConfiguration,\n            );\n      case TargetPlatform.android:\n      case TargetPlatform.fuchsia:\n      case TargetPlatform.linux:\n      case TargetPlatform.windows:\n        spellCheckConfiguration =\n            RichTextField.inferAndroidSpellCheckConfiguration(\n              widget.spellCheckConfiguration,\n            );\n    }\n\n    TextSelectionControls? textSelectionControls = widget.selectionControls;\n    final bool paintCursorAboveText;\n    bool? cursorOpacityAnimates = widget.cursorOpacityAnimates;\n    Offset? cursorOffset;\n    final Color cursorColor;\n    final Color selectionColor;\n    Color? autocorrectionTextRectColor;\n    Radius? cursorRadius = widget.cursorRadius;\n    VoidCallback? handleDidGainAccessibilityFocus;\n    VoidCallback? handleDidLoseAccessibilityFocus;\n\n    switch (theme.platform) {\n      case TargetPlatform.iOS:\n        final CupertinoThemeData cupertinoTheme = CupertinoTheme.of(context);\n        forcePressEnabled = true;\n        textSelectionControls ??= cupertinoTextSelectionHandleControls;\n        paintCursorAboveText = true;\n        cursorOpacityAnimates ??= true;\n        cursorColor = _hasError\n            ? _errorColor\n            : widget.cursorColor ??\n                  selectionStyle.cursorColor ??\n                  cupertinoTheme.primaryColor;\n        selectionColor =\n            selectionStyle.selectionColor ??\n            cupertinoTheme.primaryColor.withValues(alpha: 0.40);\n        cursorRadius ??= const Radius.circular(2.0);\n        cursorOffset = Offset(\n          iOSHorizontalOffset / MediaQuery.devicePixelRatioOf(context),\n          0,\n        );\n        autocorrectionTextRectColor = selectionColor;\n\n      case TargetPlatform.macOS:\n        final CupertinoThemeData cupertinoTheme = CupertinoTheme.of(context);\n        forcePressEnabled = false;\n        textSelectionControls ??= cupertinoDesktopTextSelectionHandleControls;\n        paintCursorAboveText = true;\n        cursorOpacityAnimates ??= false;\n        cursorColor = _hasError\n            ? _errorColor\n            : widget.cursorColor ??\n                  selectionStyle.cursorColor ??\n                  cupertinoTheme.primaryColor;\n        selectionColor =\n            selectionStyle.selectionColor ??\n            cupertinoTheme.primaryColor.withValues(alpha: 0.40);\n        cursorRadius ??= const Radius.circular(2.0);\n        cursorOffset = Offset(\n          iOSHorizontalOffset / MediaQuery.devicePixelRatioOf(context),\n          0,\n        );\n        handleDidGainAccessibilityFocus = () {\n          // Automatically activate the TextField when it receives accessibility focus.\n          if (!_effectiveFocusNode.hasFocus &&\n              _effectiveFocusNode.canRequestFocus) {\n            _effectiveFocusNode.requestFocus();\n          }\n        };\n        handleDidLoseAccessibilityFocus = () {\n          _effectiveFocusNode.unfocus();\n        };\n\n      case TargetPlatform.android:\n      case TargetPlatform.fuchsia:\n        forcePressEnabled = false;\n        textSelectionControls ??= materialTextSelectionHandleControls;\n        paintCursorAboveText = false;\n        cursorOpacityAnimates ??= false;\n        cursorColor = _hasError\n            ? _errorColor\n            : widget.cursorColor ??\n                  selectionStyle.cursorColor ??\n                  theme.colorScheme.primary;\n        selectionColor =\n            selectionStyle.selectionColor ??\n            theme.colorScheme.primary.withValues(alpha: 0.40);\n\n      case TargetPlatform.linux:\n        forcePressEnabled = false;\n        textSelectionControls ??= desktopTextSelectionHandleControls;\n        paintCursorAboveText = false;\n        cursorOpacityAnimates ??= false;\n        cursorColor = _hasError\n            ? _errorColor\n            : widget.cursorColor ??\n                  selectionStyle.cursorColor ??\n                  theme.colorScheme.primary;\n        selectionColor =\n            selectionStyle.selectionColor ??\n            theme.colorScheme.primary.withValues(alpha: 0.40);\n        handleDidGainAccessibilityFocus = () {\n          // Automatically activate the TextField when it receives accessibility focus.\n          if (!_effectiveFocusNode.hasFocus &&\n              _effectiveFocusNode.canRequestFocus) {\n            _effectiveFocusNode.requestFocus();\n          }\n        };\n        handleDidLoseAccessibilityFocus = () {\n          _effectiveFocusNode.unfocus();\n        };\n\n      case TargetPlatform.windows:\n        forcePressEnabled = false;\n        textSelectionControls ??= desktopTextSelectionHandleControls;\n        paintCursorAboveText = false;\n        cursorOpacityAnimates ??= false;\n        cursorColor = _hasError\n            ? _errorColor\n            : widget.cursorColor ??\n                  selectionStyle.cursorColor ??\n                  theme.colorScheme.primary;\n        selectionColor =\n            selectionStyle.selectionColor ??\n            theme.colorScheme.primary.withValues(alpha: 0.40);\n        handleDidGainAccessibilityFocus = () {\n          // Automatically activate the TextField when it receives accessibility focus.\n          if (!_effectiveFocusNode.hasFocus &&\n              _effectiveFocusNode.canRequestFocus) {\n            _effectiveFocusNode.requestFocus();\n          }\n        };\n        handleDidLoseAccessibilityFocus = () {\n          _effectiveFocusNode.unfocus();\n        };\n    }\n\n    Widget child = RepaintBoundary(\n      child: UnmanagedRestorationScope(\n        bucket: bucket,\n        child: EditableText(\n          key: editableTextKey,\n          readOnly: widget.readOnly || !_isEnabled,\n          toolbarOptions: widget.toolbarOptions,\n          showCursor: widget.showCursor,\n          showSelectionHandles: _showSelectionHandles,\n          controller: controller,\n          focusNode: focusNode,\n          keyboardType: widget.keyboardType,\n          textInputAction: widget.textInputAction,\n          textCapitalization: widget.textCapitalization,\n          style: style,\n          strutStyle: widget.strutStyle,\n          textAlign: widget.textAlign,\n          textDirection: widget.textDirection,\n          autofocus: widget.autofocus,\n          obscuringCharacter: widget.obscuringCharacter,\n          obscureText: widget.obscureText,\n          autocorrect: widget.autocorrect,\n          smartDashesType: widget.smartDashesType,\n          smartQuotesType: widget.smartQuotesType,\n          enableSuggestions: widget.enableSuggestions,\n          maxLines: widget.maxLines,\n          minLines: widget.minLines,\n          expands: widget.expands,\n          // Only show the selection highlight when the text field is focused.\n          selectionColor: focusNode.hasFocus ? selectionColor : null,\n          selectionControls: widget.selectionEnabled\n              ? textSelectionControls\n              : null,\n          onChanged: widget.onChanged,\n          onSelectionChanged: _handleSelectionChanged,\n          onEditingComplete: widget.onEditingComplete,\n          onSubmitted: widget.onSubmitted,\n          onAppPrivateCommand: widget.onAppPrivateCommand,\n          groupId: widget.groupId,\n          onSelectionHandleTapped: _handleSelectionHandleTapped,\n          onTapOutside: widget.onTapOutside,\n          onTapUpOutside: widget.onTapUpOutside,\n          inputFormatters: formatters,\n          rendererIgnoresPointer: true,\n          mouseCursor: MouseCursor.defer, // TextField will handle the cursor\n          cursorWidth: widget.cursorWidth,\n          cursorHeight: widget.cursorHeight,\n          cursorRadius: cursorRadius,\n          cursorColor: cursorColor,\n          selectionHeightStyle: widget.selectionHeightStyle,\n          selectionWidthStyle: widget.selectionWidthStyle,\n          cursorOpacityAnimates: cursorOpacityAnimates,\n          cursorOffset: cursorOffset,\n          paintCursorAboveText: paintCursorAboveText,\n          backgroundCursorColor: CupertinoColors.inactiveGray,\n          scrollPadding: widget.scrollPadding,\n          keyboardAppearance: keyboardAppearance,\n          enableInteractiveSelection: widget.enableInteractiveSelection,\n          selectAllOnFocus: widget.selectAllOnFocus,\n          dragStartBehavior: widget.dragStartBehavior,\n          scrollController: widget.scrollController,\n          scrollPhysics: widget.scrollPhysics,\n          autofillHints: widget.autofillHints,\n          autofillClient: this,\n          autocorrectionTextRectColor: autocorrectionTextRectColor,\n          clipBehavior: widget.clipBehavior,\n          restorationId: 'editable',\n          scribbleEnabled: widget.scribbleEnabled,\n          stylusHandwritingEnabled: widget.stylusHandwritingEnabled,\n          enableIMEPersonalizedLearning: widget.enableIMEPersonalizedLearning,\n          contentInsertionConfiguration: widget.contentInsertionConfiguration,\n          contextMenuBuilder: widget.contextMenuBuilder,\n          spellCheckConfiguration: spellCheckConfiguration,\n          magnifierConfiguration:\n              widget.magnifierConfiguration ??\n              TextMagnifier.adaptiveMagnifierConfiguration,\n          hintLocales: widget.hintLocales,\n        ),\n      ),\n    );\n\n    if (widget.decoration != null) {\n      child = AnimatedBuilder(\n        animation: Listenable.merge(<Listenable>[focusNode, controller]),\n        builder: (BuildContext context, Widget? child) {\n          return InputDecorator(\n            decoration: _getEffectiveDecoration(),\n            baseStyle: widget.style,\n            textAlign: widget.textAlign,\n            textAlignVertical: widget.textAlignVertical,\n            isHovering: _isHovering,\n            isFocused: focusNode.hasFocus,\n            isEmpty: controller.value.text.isEmpty,\n            expands: widget.expands,\n            child: child,\n          );\n        },\n        child: child,\n      );\n    }\n    final MouseCursor effectiveMouseCursor =\n        WidgetStateProperty.resolveAs<MouseCursor>(\n          widget.mouseCursor ?? WidgetStateMouseCursor.textable,\n          _statesController.value,\n        );\n\n    final int? semanticsMaxValueLength;\n    if (_effectiveMaxLengthEnforcement != MaxLengthEnforcement.none &&\n        widget.maxLength != null &&\n        widget.maxLength! > 0) {\n      semanticsMaxValueLength = widget.maxLength;\n    } else {\n      semanticsMaxValueLength = null;\n    }\n\n    return MouseRegion(\n      cursor: effectiveMouseCursor,\n      onEnter: (PointerEnterEvent event) => _handleHover(true),\n      onExit: (PointerExitEvent event) => _handleHover(false),\n      child: TextFieldTapRegion(\n        child: IgnorePointer(\n          ignoring: widget.ignorePointers ?? !_isEnabled,\n          child: AnimatedBuilder(\n            animation: controller, // changes the _currentLength\n            builder: (BuildContext context, Widget? child) {\n              return Semantics(\n                enabled: _isEnabled,\n                maxValueLength: semanticsMaxValueLength,\n                currentValueLength: _currentLength,\n                onTap: widget.readOnly\n                    ? null\n                    : () {\n                        if (!_effectiveController.selection.isValid) {\n                          _effectiveController.selection =\n                              TextSelection.collapsed(\n                                offset: _effectiveController.text.length,\n                              );\n                        }\n                        _requestKeyboard();\n                      },\n                onDidGainAccessibilityFocus: handleDidGainAccessibilityFocus,\n                onDidLoseAccessibilityFocus: handleDidLoseAccessibilityFocus,\n                onFocus: _isEnabled\n                    ? () {\n                        assert(\n                          _effectiveFocusNode.canRequestFocus,\n                          'Received SemanticsAction.focus from the engine. However, the FocusNode '\n                          'of this text field cannot gain focus. This likely indicates a bug. '\n                          'If this text field cannot be focused (e.g. because it is not '\n                          'enabled), then its corresponding semantics node must be configured '\n                          'such that the assistive technology cannot request focus on it.',\n                        );\n\n                        if (_effectiveFocusNode.canRequestFocus &&\n                            !_effectiveFocusNode.hasFocus) {\n                          _effectiveFocusNode.requestFocus();\n                        } else if (!widget.readOnly) {\n                          // If the platform requested focus, that means that previously the\n                          // platform believed that the text field did not have focus (even\n                          // though Flutter's widget system believed otherwise). This likely\n                          // means that the on-screen keyboard is hidden, or more generally,\n                          // there is no current editing session in this field. To correct\n                          // that, keyboard must be requested.\n                          //\n                          // A concrete scenario where this can happen is when the user\n                          // dismisses the keyboard on the web. The editing session is\n                          // closed by the engine, but the text field widget stays focused\n                          // in the framework.\n                          _requestKeyboard();\n                        }\n                      }\n                    : null,\n                child: child,\n              );\n            },\n            child: _selectionGestureDetectorBuilder.buildGestureDetector(\n              behavior: HitTestBehavior.translucent,\n              child: child,\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n\n  void scheduleShowCaretOnScreen({required bool withAnimation}) {\n    _editableText?.scheduleShowCaretOnScreen(withAnimation: withAnimation);\n  }\n}\n\nTextStyle? _m2StateInputStyle(BuildContext context) =>\n    WidgetStateTextStyle.resolveWith((Set<WidgetState> states) {\n      final ThemeData theme = Theme.of(context);\n      if (states.contains(WidgetState.disabled)) {\n        return TextStyle(color: theme.disabledColor);\n      }\n      return TextStyle(color: theme.textTheme.titleMedium?.color);\n    });\n\nTextStyle _m2CounterErrorStyle(BuildContext context) => Theme.of(\n  context,\n).textTheme.bodySmall!.copyWith(color: Theme.of(context).colorScheme.error);\n\n// BEGIN GENERATED TOKEN PROPERTIES - TextField\n\n// Do not edit by hand. The code between the \"BEGIN GENERATED\" and\n// \"END GENERATED\" comments are generated from data in the Material\n// Design token database by the script:\n//   dev/tools/gen_defaults/bin/gen_defaults.dart.\n\n// dart format off\nTextStyle? _m3StateInputStyle(BuildContext context) => WidgetStateTextStyle.resolveWith((Set<WidgetState> states) {\n  if (states.contains(WidgetState.disabled)) {\n    return TextStyle(color: Theme.of(context).textTheme.bodyLarge!.color?.withValues(alpha:0.38));\n  }\n  return TextStyle(color: Theme.of(context).textTheme.bodyLarge!.color);\n});\n\nTextStyle _m3InputStyle(BuildContext context) => Theme.of(context).textTheme.bodyLarge!;\n\nTextStyle _m3CounterErrorStyle(BuildContext context) =>\n  Theme.of(context).textTheme.bodySmall!.copyWith(color: Theme.of(context).colorScheme.error);\n// dart format on\n\n// END GENERATED TOKEN PROPERTIES - TextField\n"
  },
  {
    "path": "lib/common/widgets/flutter/text_field/text_selection.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n/// @docImport 'package:flutter/cupertino.dart';\n/// @docImport 'package:flutter/material.dart';\nlibrary;\n\nimport 'dart:math' as math;\n\nimport 'package:PiliPlus/common/widgets/flutter/text_field/controller.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text_field/editable.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text_field/editable_text.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart' hide EditableText, EditableTextState;\nimport 'package:flutter/scheduler.dart';\nimport 'package:flutter/services.dart';\n\n/// Delegate interface for the [TextSelectionGestureDetectorBuilder].\n///\n/// The interface is usually implemented by the [State] of text field\n/// implementations wrapping [EditableText], so that they can use a\n/// [TextSelectionGestureDetectorBuilder] to build a\n/// [TextSelectionGestureDetector] for their [EditableText]. The delegate\n/// provides the builder with information about the current state of the text\n/// field. Based on that information, the builder adds the correct gesture\n/// handlers to the gesture detector.\n///\n/// See also:\n///\n///  * [TextField], which implements this delegate for the Material text field.\n///  * [CupertinoTextField], which implements this delegate for the Cupertino\n///    text field.\nabstract class TextSelectionGestureDetectorBuilderDelegate {\n  /// [GlobalKey] to the [EditableText] for which the\n  /// [TextSelectionGestureDetectorBuilder] will build a [TextSelectionGestureDetector].\n  GlobalKey<EditableTextState> get editableTextKey;\n\n  /// Whether the text field should respond to force presses.\n  bool get forcePressEnabled;\n\n  /// Whether the user may select text in the text field.\n  bool get selectionEnabled;\n}\n\n/// Builds a [TextSelectionGestureDetector] to wrap an [EditableText].\n///\n/// The class implements sensible defaults for many user interactions\n/// with an [EditableText] (see the documentation of the various gesture handler\n/// methods, e.g. [onTapDown], [onForcePressStart], etc.). Subclasses of\n/// [TextSelectionGestureDetectorBuilder] can change the behavior performed in\n/// responds to these gesture events by overriding the corresponding handler\n/// methods of this class.\n///\n/// The resulting [TextSelectionGestureDetector] to wrap an [EditableText] is\n/// obtained by calling [buildGestureDetector].\n///\n/// A [TextSelectionGestureDetectorBuilder] must be provided a\n/// [TextSelectionGestureDetectorBuilderDelegate], from which information about\n/// the [EditableText] may be obtained. Typically, the [State] of the widget\n/// that builds the [EditableText] implements this interface, and then passes\n/// itself as the [delegate].\n///\n/// See also:\n///\n///  * [TextField], which uses a subclass to implement the Material-specific\n///    gesture logic of an [EditableText].\n///  * [CupertinoTextField], which uses a subclass to implement the\n///    Cupertino-specific gesture logic of an [EditableText].\nclass TextSelectionGestureDetectorBuilder {\n  /// Creates a [TextSelectionGestureDetectorBuilder].\n  TextSelectionGestureDetectorBuilder({\n    required this.delegate,\n    required this.controller,\n  });\n\n  /// The delegate for this [TextSelectionGestureDetectorBuilder].\n  ///\n  /// The delegate provides the builder with information about what actions can\n  /// currently be performed on the text field. Based on this, the builder adds\n  /// the correct gesture handlers to the gesture detector.\n  ///\n  /// Typically implemented by a [State] of a widget that builds an\n  /// [EditableText].\n  @protected\n  final TextSelectionGestureDetectorBuilderDelegate delegate;\n\n  final RichTextEditingController controller;\n\n  // Shows the magnifier on supported platforms at the given offset, currently\n  // only Android and iOS.\n  void _showMagnifierIfSupportedByPlatform(Offset positionToShow) {\n    switch (defaultTargetPlatform) {\n      case TargetPlatform.android:\n      case TargetPlatform.iOS:\n        editableText.showMagnifier(positionToShow);\n      case TargetPlatform.fuchsia:\n      case TargetPlatform.linux:\n      case TargetPlatform.macOS:\n      case TargetPlatform.windows:\n    }\n  }\n\n  // Hides the magnifier on supported platforms, currently only Android and iOS.\n  void _hideMagnifierIfSupportedByPlatform() {\n    if (!_isEditableTextMounted) {\n      return;\n    }\n\n    switch (defaultTargetPlatform) {\n      case TargetPlatform.android:\n      case TargetPlatform.iOS:\n        editableText.hideMagnifier();\n      case TargetPlatform.fuchsia:\n      case TargetPlatform.linux:\n      case TargetPlatform.macOS:\n      case TargetPlatform.windows:\n    }\n  }\n\n  /// Returns true if lastSecondaryTapDownPosition was on selection.\n  bool get _lastSecondaryTapWasOnSelection {\n    assert(renderEditable.lastSecondaryTapDownPosition != null);\n    if (renderEditable.selection == null) {\n      return false;\n    }\n\n    final TextPosition textPosition = renderEditable.getPositionForPoint(\n      renderEditable.lastSecondaryTapDownPosition!,\n    );\n\n    return renderEditable.selection!.start <= textPosition.offset &&\n        renderEditable.selection!.end >= textPosition.offset;\n  }\n\n  bool _positionWasOnSelectionExclusive(TextPosition textPosition) {\n    final TextSelection? selection = renderEditable.selection;\n    if (selection == null) {\n      return false;\n    }\n\n    return selection.start < textPosition.offset &&\n        selection.end > textPosition.offset;\n  }\n\n  bool _positionWasOnSelectionInclusive(TextPosition textPosition) {\n    final TextSelection? selection = renderEditable.selection;\n    if (selection == null) {\n      return false;\n    }\n\n    return selection.start <= textPosition.offset &&\n        selection.end >= textPosition.offset;\n  }\n\n  // Expand the selection to the given global position.\n  //\n  // Either base or extent will be moved to the last tapped position, whichever\n  // is closest. The selection will never shrink or pivot, only grow.\n  //\n  // If fromSelection is given, will expand from that selection instead of the\n  // current selection in renderEditable.\n  //\n  // See also:\n  //\n  //   * [_extendSelection], which is similar but pivots the selection around\n  //     the base.\n  void _expandSelection(\n    Offset offset,\n    SelectionChangedCause cause, [\n    TextSelection? fromSelection,\n  ]) {\n    assert(renderEditable.selection?.baseOffset != null);\n\n    final TextPosition tappedPosition = renderEditable.getPositionForPoint(\n      offset,\n    );\n    final TextSelection selection = fromSelection ?? renderEditable.selection!;\n    final bool baseIsCloser =\n        (tappedPosition.offset - selection.baseOffset).abs() <\n        (tappedPosition.offset - selection.extentOffset).abs();\n    final TextSelection nextSelection = selection.copyWith(\n      baseOffset: baseIsCloser ? selection.extentOffset : selection.baseOffset,\n      extentOffset: tappedPosition.offset,\n    );\n\n    editableText.userUpdateTextEditingValue(\n      editableText.textEditingValue.copyWith(selection: nextSelection),\n      cause,\n    );\n  }\n\n  // Extend the selection to the given global position.\n  //\n  // Holds the base in place and moves the extent.\n  //\n  // See also:\n  //\n  //   * [_expandSelection], which is similar but always increases the size of\n  //     the selection.\n  void _extendSelection(Offset offset, SelectionChangedCause cause) {\n    assert(renderEditable.selection?.baseOffset != null);\n\n    final TextPosition tappedPosition = renderEditable.getPositionForPoint(\n      offset,\n    );\n    final TextSelection selection = renderEditable.selection!;\n    // bggRGjQaUbCoE on select\n    final TextSelection nextSelection = selection.copyWith(\n      extentOffset: controller.tapOffsetSimple(tappedPosition.offset),\n    );\n\n    editableText.userUpdateTextEditingValue(\n      editableText.textEditingValue.copyWith(selection: nextSelection),\n      cause,\n    );\n  }\n\n  /// Whether to show the selection toolbar.\n  ///\n  /// It is based on the signal source when [onTapDown], [onSecondaryTapDown],\n  /// [onDragSelectionStart], or [onForcePressStart] is called. This getter\n  /// will return true if the current [onTapDown], or [onDragSelectionStart] event\n  /// is triggered by a touch or a stylus. It will always return true for the\n  /// current [onSecondaryTapDown] or [onForcePressStart] event.\n  bool get shouldShowSelectionToolbar => _shouldShowSelectionToolbar;\n  bool _shouldShowSelectionToolbar = true;\n\n  /// Whether to show the selection handles.\n  ///\n  /// It is based on the signal source when [onTapDown], [onSecondaryTapDown],\n  /// [onDragSelectionStart], is called. This getter will return true if the\n  /// current [onTapDown], [onSecondaryTapDown], or [onDragSelectionStart] event\n  /// is triggered by a touch or a stylus.\n  bool get shouldShowSelectionHandles => _shouldShowSelectionHandles;\n  bool _shouldShowSelectionHandles = true;\n\n  /// The [State] of the [EditableText] for which the builder will provide a\n  /// [TextSelectionGestureDetector].\n  @protected\n  EditableTextState get editableText => delegate.editableTextKey.currentState!;\n\n  /// The [RenderObject] of the [EditableText] for which the builder will\n  /// provide a [TextSelectionGestureDetector].\n  @protected\n  RenderEditable get renderEditable => editableText.renderEditable;\n\n  /// Returns `true` if a widget with the global key [delegate.editableTextKey]\n  /// is in the tree and the widget is mounted.\n  ///\n  /// Otherwise returns `false`.\n  bool get _isEditableTextMounted =>\n      delegate.editableTextKey.currentContext?.mounted ?? false;\n\n  /// Whether the Shift key was pressed when the most recent [PointerDownEvent]\n  /// was tracked by the [BaseTapAndDragGestureRecognizer].\n  bool _isShiftPressed = false;\n\n  /// The viewport offset pixels of any [Scrollable] containing the\n  /// [RenderEditable] at the last drag start.\n  double _dragStartScrollOffset = 0.0;\n\n  /// The viewport offset pixels of the [RenderEditable] at the last drag start.\n  double _dragStartViewportOffset = 0.0;\n\n  double get _scrollPosition {\n    final ScrollableState? scrollableState =\n        delegate.editableTextKey.currentContext == null\n        ? null\n        : Scrollable.maybeOf(delegate.editableTextKey.currentContext!);\n    return scrollableState == null ? 0.0 : scrollableState.position.pixels;\n  }\n\n  AxisDirection? get _scrollDirection {\n    final ScrollableState? scrollableState =\n        delegate.editableTextKey.currentContext == null\n        ? null\n        : Scrollable.maybeOf(delegate.editableTextKey.currentContext!);\n    return scrollableState?.axisDirection;\n  }\n\n  // For a shift + tap + drag gesture, the TextSelection at the point of the\n  // tap. Mac uses this value to reset to the original selection when an\n  // inversion of the base and offset happens.\n  TextSelection? _dragStartSelection;\n\n  // For iOS long press behavior when the field is not focused. iOS uses this value\n  // to determine if a long press began on a field that was not focused.\n  //\n  // If the field was not focused when the long press began, a long press will select\n  // the word and a long press move will select word-by-word. If the field was\n  // focused, the cursor moves to the long press position.\n  bool _longPressStartedWithoutFocus = false;\n\n  /// Handler for [TextSelectionGestureDetector.onTapTrackStart].\n  ///\n  /// See also:\n  ///\n  ///  * [TextSelectionGestureDetector.onTapTrackStart], which triggers this\n  ///    callback.\n  @protected\n  void onTapTrackStart() {\n    _isShiftPressed = HardwareKeyboard.instance.logicalKeysPressed.intersection(\n      <LogicalKeyboardKey>{\n        LogicalKeyboardKey.shiftLeft,\n        LogicalKeyboardKey.shiftRight,\n      },\n    ).isNotEmpty;\n  }\n\n  /// Handler for [TextSelectionGestureDetector.onTapTrackReset].\n  ///\n  /// See also:\n  ///\n  ///  * [TextSelectionGestureDetector.onTapTrackReset], which triggers this\n  ///    callback.\n  @protected\n  void onTapTrackReset() {\n    _isShiftPressed = false;\n  }\n\n  /// Handler for [TextSelectionGestureDetector.onTapDown].\n  ///\n  /// By default, it forwards the tap to [RenderEditable.handleTapDown] and sets\n  /// [shouldShowSelectionToolbar] to true if the tap was initiated by a finger or stylus.\n  ///\n  /// See also:\n  ///\n  ///  * [TextSelectionGestureDetector.onTapDown], which triggers this callback.\n  @protected\n  void onTapDown(TapDragDownDetails details) {\n    if (!delegate.selectionEnabled) {\n      return;\n    }\n\n    // TODO(Renzo-Olivares): Migrate text selection gestures away from saving state\n    // in renderEditable. The gesture callbacks can use the details objects directly\n    // in callbacks variants that provide them [TapGestureRecognizer.onSecondaryTap]\n    // vs [TapGestureRecognizer.onSecondaryTapUp] instead of having to track state in\n    // renderEditable. When this migration is complete we should remove this hack.\n    // See https://github.com/flutter/flutter/issues/115130.\n    renderEditable.handleTapDown(\n      TapDownDetails(globalPosition: details.globalPosition),\n    );\n    // The selection overlay should only be shown when the user is interacting\n    // through a touch screen (via either a finger or a stylus). A mouse shouldn't\n    // trigger the selection overlay.\n    // For backwards-compatibility, we treat a null kind the same as touch.\n    final PointerDeviceKind? kind = details.kind;\n    // TODO(justinmc): Should a desktop platform show its selection toolbar when\n    // receiving a tap event?  Say a Windows device with a touchscreen.\n    // https://github.com/flutter/flutter/issues/106586\n    _shouldShowSelectionToolbar =\n        kind == null ||\n        kind == PointerDeviceKind.touch ||\n        kind == PointerDeviceKind.stylus;\n    _shouldShowSelectionHandles = _shouldShowSelectionToolbar;\n\n    // It is impossible to extend the selection when the shift key is pressed, if the\n    // renderEditable.selection is invalid.\n    final bool isShiftPressedValid =\n        _isShiftPressed && renderEditable.selection?.baseOffset != null;\n    switch (defaultTargetPlatform) {\n      case TargetPlatform.android:\n        if (editableText.widget.stylusHandwritingEnabled) {\n          final bool stylusEnabled = switch (kind) {\n            PointerDeviceKind.stylus || PointerDeviceKind.invertedStylus =>\n              editableText.widget.stylusHandwritingEnabled,\n            _ => false,\n          };\n          if (stylusEnabled) {\n            Scribe.isFeatureAvailable().then((bool isAvailable) {\n              if (isAvailable) {\n                renderEditable.selectPosition(\n                  cause: SelectionChangedCause.stylusHandwriting,\n                );\n                Scribe.startStylusHandwriting();\n              }\n            });\n          }\n        }\n      case TargetPlatform.fuchsia:\n      case TargetPlatform.iOS:\n        // On mobile platforms the selection is set on tap up.\n        break;\n      case TargetPlatform.macOS:\n        editableText.hideToolbar();\n        // On macOS, a shift-tapped unfocused field expands from 0, not from the\n        // previous selection.\n        if (isShiftPressedValid) {\n          final TextSelection? fromSelection = renderEditable.hasFocus\n              ? null\n              : const TextSelection.collapsed(offset: 0);\n          _expandSelection(\n            details.globalPosition,\n            SelectionChangedCause.tap,\n            fromSelection,\n          );\n          return;\n        }\n        // On macOS, a tap/click places the selection in a precise position.\n        // This differs from iOS/iPadOS, where if the gesture is done by a touch\n        // then the selection moves to the closest word edge, instead of a\n        // precise position.\n        renderEditable.selectPosition(cause: SelectionChangedCause.tap);\n      case TargetPlatform.linux:\n      case TargetPlatform.windows:\n        editableText.hideToolbar();\n        if (isShiftPressedValid) {\n          _extendSelection(details.globalPosition, SelectionChangedCause.tap);\n          return;\n        }\n        renderEditable.selectPosition(cause: SelectionChangedCause.tap);\n    }\n  }\n\n  /// Handler for [TextSelectionGestureDetector.onForcePressStart].\n  ///\n  /// By default, it selects the word at the position of the force press,\n  /// if selection is enabled.\n  ///\n  /// This callback is only applicable when force press is enabled.\n  ///\n  /// See also:\n  ///\n  ///  * [TextSelectionGestureDetector.onForcePressStart], which triggers this\n  ///    callback.\n  @protected\n  void onForcePressStart(ForcePressDetails details) {\n    assert(delegate.forcePressEnabled);\n    _shouldShowSelectionToolbar = true;\n    if (!delegate.selectionEnabled) {\n      return;\n    }\n    renderEditable.selectWordsInRange(\n      from: details.globalPosition,\n      cause: SelectionChangedCause.forcePress,\n    );\n    editableText.showToolbar();\n  }\n\n  /// Handler for [TextSelectionGestureDetector.onForcePressEnd].\n  ///\n  /// By default, it selects words in the range specified in [details] and shows\n  /// toolbar if it is necessary.\n  ///\n  /// This callback is only applicable when force press is enabled.\n  ///\n  /// See also:\n  ///\n  ///  * [TextSelectionGestureDetector.onForcePressEnd], which triggers this\n  ///    callback.\n  @protected\n  void onForcePressEnd(ForcePressDetails details) {\n    assert(delegate.forcePressEnabled);\n    renderEditable.selectWordsInRange(\n      from: details.globalPosition,\n      cause: SelectionChangedCause.forcePress,\n    );\n    if (shouldShowSelectionToolbar) {\n      editableText.showToolbar();\n    }\n  }\n\n  /// Whether the provided [onUserTap] callback should be dispatched on every\n  /// tap or only non-consecutive taps.\n  ///\n  /// Defaults to false.\n  @protected\n  bool get onUserTapAlwaysCalled => false;\n\n  /// Handler for [TextSelectionGestureDetector.onUserTap].\n  ///\n  /// By default, it serves as placeholder to enable subclass override.\n  ///\n  /// See also:\n  ///\n  ///  * [TextSelectionGestureDetector.onUserTap], which triggers this\n  ///    callback.\n  ///  * [TextSelectionGestureDetector.onUserTapAlwaysCalled], which controls\n  ///     whether this callback is called only on the first tap in a series\n  ///     of taps.\n  @protected\n  void onUserTap() {\n    /* Subclass should override this method if needed. */\n  }\n\n  /// Handler for [TextSelectionGestureDetector.onSingleTapUp].\n  ///\n  /// By default, it selects word edge if selection is enabled.\n  ///\n  /// See also:\n  ///\n  ///  * [TextSelectionGestureDetector.onSingleTapUp], which triggers\n  ///    this callback.\n  @protected\n  void onSingleTapUp(TapDragUpDetails details) {\n    if (!delegate.selectionEnabled) {\n      editableText.requestKeyboard();\n      return;\n    }\n    // It is impossible to extend the selection when the shift key is pressed, if the\n    // renderEditable.selection is invalid.\n    final bool isShiftPressedValid =\n        _isShiftPressed && renderEditable.selection?.baseOffset != null;\n    switch (defaultTargetPlatform) {\n      case TargetPlatform.linux:\n      case TargetPlatform.macOS:\n      case TargetPlatform.windows:\n        break;\n      // On desktop platforms the selection is set on tap down.\n      case TargetPlatform.android:\n        editableText.hideToolbar(false);\n        if (isShiftPressedValid) {\n          _extendSelection(details.globalPosition, SelectionChangedCause.tap);\n          return;\n        }\n        renderEditable.selectPosition(cause: SelectionChangedCause.tap);\n        editableText.showSpellCheckSuggestionsToolbar();\n      case TargetPlatform.fuchsia:\n        editableText.hideToolbar(false);\n        if (isShiftPressedValid) {\n          _extendSelection(details.globalPosition, SelectionChangedCause.tap);\n          return;\n        }\n        renderEditable.selectPosition(cause: SelectionChangedCause.tap);\n      case TargetPlatform.iOS:\n        if (isShiftPressedValid) {\n          // On iOS, a shift-tapped unfocused field expands from 0, not from\n          // the previous selection.\n          final TextSelection? fromSelection = renderEditable.hasFocus\n              ? null\n              : const TextSelection.collapsed(offset: 0);\n          _expandSelection(\n            details.globalPosition,\n            SelectionChangedCause.tap,\n            fromSelection,\n          );\n          return;\n        }\n        switch (details.kind) {\n          case PointerDeviceKind.mouse:\n          case PointerDeviceKind.trackpad:\n          case PointerDeviceKind.stylus:\n          case PointerDeviceKind.invertedStylus:\n            // TODO(camsim99): Determine spell check toolbar behavior in these cases:\n            // https://github.com/flutter/flutter/issues/119573.\n            // Precise devices should place the cursor at a precise position if the\n            // word at the text position is not misspelled.\n            renderEditable.selectPosition(cause: SelectionChangedCause.tap);\n            editableText.hideToolbar();\n          case PointerDeviceKind.touch:\n          case PointerDeviceKind.unknown:\n            // If the word that was tapped is misspelled, select the word and show the spell check suggestions\n            // toolbar once. If additional taps are made on a misspelled word, toggle the toolbar. If the word\n            // is not misspelled, default to the following behavior:\n            //\n            // Toggle the toolbar when the tap is exclusively within the bounds of a non-collapsed `previousSelection`,\n            // and the editable is focused.\n            //\n            // Toggle the toolbar if the `previousSelection` is collapsed, the tap is on the selection, the\n            // TextAffinity remains the same, the editable field is not read only, and the editable is focused.\n            // The TextAffinity is important when the cursor is on the boundary of a line wrap, if the affinity\n            // is different (i.e. it is downstream), the selection should move to the following line and not toggle\n            // the toolbar.\n            //\n            // Selects the word edge closest to the tap when the editable is not focused, or if the tap was neither exclusively\n            // or inclusively on `previousSelection`. If the selection remains the same after selecting the word edge, then we\n            // toggle the toolbar, if the editable field is not read only. If the selection changes then we hide the toolbar.\n            final TextSelection previousSelection =\n                renderEditable.selection ??\n                editableText.textEditingValue.selection;\n            final TextPosition textPosition = renderEditable\n                .getPositionForPoint(\n                  details.globalPosition,\n                );\n            final bool isAffinityTheSame =\n                textPosition.affinity == previousSelection.affinity;\n            final bool wordAtCursorIndexIsMisspelled =\n                editableText.findSuggestionSpanAtCursorIndex(\n                  textPosition.offset,\n                ) !=\n                null;\n\n            if (wordAtCursorIndexIsMisspelled) {\n              renderEditable.selectWord(cause: SelectionChangedCause.tap);\n              if (previousSelection !=\n                  editableText.textEditingValue.selection) {\n                editableText.showSpellCheckSuggestionsToolbar();\n              } else {\n                editableText.toggleToolbar(false);\n              }\n            } else if (((_positionWasOnSelectionExclusive(textPosition) &&\n                        !previousSelection.isCollapsed) ||\n                    (_positionWasOnSelectionInclusive(textPosition) &&\n                        previousSelection.isCollapsed &&\n                        isAffinityTheSame &&\n                        !renderEditable.readOnly)) &&\n                renderEditable.hasFocus) {\n              editableText.toggleToolbar(false);\n            } else {\n              renderEditable.selectWordEdge(cause: SelectionChangedCause.tap);\n              if (previousSelection ==\n                      editableText.textEditingValue.selection &&\n                  renderEditable.hasFocus &&\n                  !renderEditable.readOnly) {\n                editableText.toggleToolbar(false);\n              } else {\n                editableText.hideToolbar(false);\n              }\n            }\n        }\n    }\n    editableText.requestKeyboard();\n  }\n\n  /// Handler for [TextSelectionGestureDetector.onSingleTapCancel].\n  ///\n  /// By default, it serves as placeholder to enable subclass override.\n  ///\n  /// See also:\n  ///\n  ///  * [TextSelectionGestureDetector.onSingleTapCancel], which triggers\n  ///    this callback.\n  @protected\n  void onSingleTapCancel() {\n    /* Subclass should override this method if needed. */\n  }\n\n  /// Handler for [TextSelectionGestureDetector.onSingleLongTapStart].\n  ///\n  /// By default, it selects text position specified in [details] if selection\n  /// is enabled.\n  ///\n  /// See also:\n  ///\n  ///  * [TextSelectionGestureDetector.onSingleLongTapStart], which triggers\n  ///    this callback.\n  @protected\n  void onSingleLongTapStart(LongPressStartDetails details) {\n    if (!delegate.selectionEnabled) {\n      return;\n    }\n    switch (defaultTargetPlatform) {\n      case TargetPlatform.iOS:\n      case TargetPlatform.macOS:\n        if (!renderEditable.hasFocus) {\n          _longPressStartedWithoutFocus = true;\n          renderEditable.selectWord(cause: SelectionChangedCause.longPress);\n        } else if (renderEditable.readOnly) {\n          renderEditable.selectWord(cause: SelectionChangedCause.longPress);\n          if (editableText.context.mounted) {\n            Feedback.forLongPress(editableText.context);\n          }\n        } else {\n          renderEditable.selectPositionAt(\n            from: details.globalPosition,\n            cause: SelectionChangedCause.longPress,\n          );\n          // Show the floating cursor.\n          final RawFloatingCursorPoint cursorPoint = RawFloatingCursorPoint(\n            state: FloatingCursorDragState.Start,\n            startLocation: (\n              renderEditable.globalToLocal(details.globalPosition),\n              TextPosition(\n                offset: editableText.textEditingValue.selection.baseOffset,\n                affinity: editableText.textEditingValue.selection.affinity,\n              ),\n            ),\n            offset: Offset.zero,\n          );\n          editableText.updateFloatingCursor(cursorPoint);\n        }\n      case TargetPlatform.android:\n      case TargetPlatform.fuchsia:\n      case TargetPlatform.linux:\n      case TargetPlatform.windows:\n        renderEditable.selectWord(cause: SelectionChangedCause.longPress);\n        if (editableText.context.mounted) {\n          Feedback.forLongPress(editableText.context);\n        }\n    }\n\n    _showMagnifierIfSupportedByPlatform(details.globalPosition);\n\n    _dragStartViewportOffset = renderEditable.offset.pixels;\n    _dragStartScrollOffset = _scrollPosition;\n  }\n\n  /// Handler for [TextSelectionGestureDetector.onSingleLongTapMoveUpdate].\n  ///\n  /// By default, it updates the selection location specified in [details] if\n  /// selection is enabled.\n  ///\n  /// See also:\n  ///\n  ///  * [TextSelectionGestureDetector.onSingleLongTapMoveUpdate], which\n  ///    triggers this callback.\n  @protected\n  void onSingleLongTapMoveUpdate(LongPressMoveUpdateDetails details) {\n    if (!delegate.selectionEnabled) {\n      return;\n    }\n    // Adjust the drag start offset for possible viewport offset changes.\n    final Offset editableOffset = renderEditable.maxLines == 1\n        ? Offset(renderEditable.offset.pixels - _dragStartViewportOffset, 0.0)\n        : Offset(0.0, renderEditable.offset.pixels - _dragStartViewportOffset);\n    final Offset scrollableOffset = switch (axisDirectionToAxis(\n      _scrollDirection ?? AxisDirection.left,\n    )) {\n      Axis.horizontal => Offset(_scrollPosition - _dragStartScrollOffset, 0.0),\n      Axis.vertical => Offset(0.0, _scrollPosition - _dragStartScrollOffset),\n    };\n    switch (defaultTargetPlatform) {\n      case TargetPlatform.iOS:\n      case TargetPlatform.macOS:\n        if (_longPressStartedWithoutFocus || renderEditable.readOnly) {\n          renderEditable.selectWordsInRange(\n            from:\n                details.globalPosition -\n                details.offsetFromOrigin -\n                editableOffset -\n                scrollableOffset,\n            to: details.globalPosition,\n            cause: SelectionChangedCause.longPress,\n          );\n        } else {\n          renderEditable.selectPositionAt(\n            from: details.globalPosition,\n            cause: SelectionChangedCause.longPress,\n          );\n          // Update the floating cursor.\n          final RawFloatingCursorPoint cursorPoint = RawFloatingCursorPoint(\n            state: FloatingCursorDragState.Update,\n            offset: details.offsetFromOrigin,\n          );\n          editableText.updateFloatingCursor(cursorPoint);\n        }\n      case TargetPlatform.android:\n      case TargetPlatform.fuchsia:\n      case TargetPlatform.linux:\n      case TargetPlatform.windows:\n        renderEditable.selectWordsInRange(\n          from:\n              details.globalPosition -\n              details.offsetFromOrigin -\n              editableOffset -\n              scrollableOffset,\n          to: details.globalPosition,\n          cause: SelectionChangedCause.longPress,\n        );\n    }\n\n    _showMagnifierIfSupportedByPlatform(details.globalPosition);\n  }\n\n  /// Handler for [TextSelectionGestureDetector.onSingleLongTapEnd].\n  ///\n  /// By default, it shows toolbar if necessary.\n  ///\n  /// See also:\n  ///\n  ///  * [TextSelectionGestureDetector.onSingleLongTapEnd], which triggers this\n  ///    callback.\n  @protected\n  void onSingleLongTapEnd(LongPressEndDetails details) {\n    _onSingleLongTapEndOrCancel();\n    if (shouldShowSelectionToolbar) {\n      editableText.showToolbar();\n    }\n  }\n\n  /// Handler for [TextSelectionGestureDetector.onSingleLongTapCancel].\n  ///\n  /// By default, it hides the magnifier and the floating cursor if necessary.\n  ///\n  /// See also:\n  ///\n  /// * [TextSelectionGestureDetector.onSingleLongTapCancel], which triggers\n  ///   this callback.\n  @protected\n  void onSingleLongTapCancel() {\n    _onSingleLongTapEndOrCancel();\n  }\n\n  /// Handler for [TextSelectionGestureDetector.onSecondaryTap].\n  ///\n  /// By default, selects the word if possible and shows the toolbar.\n  @protected\n  void onSecondaryTap() {\n    if (!delegate.selectionEnabled) {\n      return;\n    }\n    switch (defaultTargetPlatform) {\n      case TargetPlatform.iOS:\n      case TargetPlatform.macOS:\n        if (!_lastSecondaryTapWasOnSelection || !renderEditable.hasFocus) {\n          renderEditable.selectWord(cause: SelectionChangedCause.tap);\n        }\n        if (shouldShowSelectionToolbar) {\n          editableText.hideToolbar();\n          editableText.showToolbar();\n        }\n      case TargetPlatform.android:\n      case TargetPlatform.fuchsia:\n      case TargetPlatform.linux:\n      case TargetPlatform.windows:\n        if (!renderEditable.hasFocus) {\n          renderEditable.selectPosition(cause: SelectionChangedCause.tap);\n        }\n        editableText.toggleToolbar();\n    }\n  }\n\n  /// Handler for [TextSelectionGestureDetector.onSecondaryTapDown].\n  ///\n  /// See also:\n  ///\n  ///  * [TextSelectionGestureDetector.onSecondaryTapDown], which triggers this\n  ///    callback.\n  ///  * [onSecondaryTap], which is typically called after this.\n  @protected\n  void onSecondaryTapDown(TapDownDetails details) {\n    // TODO(Renzo-Olivares): Migrate text selection gestures away from saving state\n    // in renderEditable. The gesture callbacks can use the details objects directly\n    // in callbacks variants that provide them [TapGestureRecognizer.onSecondaryTap]\n    // vs [TapGestureRecognizer.onSecondaryTapUp] instead of having to track state in\n    // renderEditable. When this migration is complete we should remove this hack.\n    // See https://github.com/flutter/flutter/issues/115130.\n    renderEditable.handleSecondaryTapDown(\n      TapDownDetails(globalPosition: details.globalPosition),\n    );\n    _shouldShowSelectionToolbar = true;\n    _shouldShowSelectionHandles =\n        details.kind == null ||\n        details.kind == PointerDeviceKind.touch ||\n        details.kind == PointerDeviceKind.stylus;\n  }\n\n  /// Handler for [TextSelectionGestureDetector.onDoubleTapDown].\n  ///\n  /// By default, it selects a word through [RenderEditable.selectWord] if\n  /// selectionEnabled and shows toolbar if necessary.\n  ///\n  /// See also:\n  ///\n  ///  * [TextSelectionGestureDetector.onDoubleTapDown], which triggers this\n  ///    callback.\n  @protected\n  void onDoubleTapDown(TapDragDownDetails details) {\n    if (delegate.selectionEnabled) {\n      renderEditable.selectWord(cause: SelectionChangedCause.doubleTap);\n      if (shouldShowSelectionToolbar) {\n        editableText.showToolbar();\n      }\n    }\n  }\n\n  void _onSingleLongTapEndOrCancel() {\n    _hideMagnifierIfSupportedByPlatform();\n    _longPressStartedWithoutFocus = false;\n    _dragStartViewportOffset = 0.0;\n    _dragStartScrollOffset = 0.0;\n    if (_isEditableTextMounted &&\n        defaultTargetPlatform == TargetPlatform.iOS &&\n        delegate.selectionEnabled &&\n        editableText.textEditingValue.selection.isCollapsed) {\n      // Update the floating cursor.\n      final RawFloatingCursorPoint cursorPoint = RawFloatingCursorPoint(\n        state: FloatingCursorDragState.End,\n      );\n      editableText.updateFloatingCursor(cursorPoint);\n    }\n  }\n\n  // Selects the set of paragraphs in a document that intersect a given range of\n  // global positions.\n  void _selectParagraphsInRange({\n    required Offset from,\n    Offset? to,\n    SelectionChangedCause? cause,\n  }) {\n    final TextBoundary paragraphBoundary = ParagraphBoundary(\n      editableText.textEditingValue.text,\n    );\n    _selectTextBoundariesInRange(\n      boundary: paragraphBoundary,\n      from: from,\n      to: to,\n      cause: cause,\n    );\n  }\n\n  // Selects the set of lines in a document that intersect a given range of\n  // global positions.\n  void _selectLinesInRange({\n    required Offset from,\n    Offset? to,\n    SelectionChangedCause? cause,\n  }) {\n    final TextBoundary lineBoundary = LineBoundary(renderEditable);\n    _selectTextBoundariesInRange(\n      boundary: lineBoundary,\n      from: from,\n      to: to,\n      cause: cause,\n    );\n  }\n\n  // Returns the location of a text boundary at `extent`. When `extent` is at\n  // the end of the text, returns the previous text boundary's location.\n  TextRange _moveToTextBoundary(\n    TextPosition extent,\n    TextBoundary textBoundary,\n  ) {\n    assert(extent.offset >= 0);\n    // Use extent.offset - 1 when `extent` is at the end of the text to retrieve\n    // the previous text boundary's location.\n    final int start =\n        textBoundary.getLeadingTextBoundaryAt(\n          extent.offset == editableText.textEditingValue.text.length\n              ? extent.offset - 1\n              : extent.offset,\n        ) ??\n        0;\n    final int end =\n        textBoundary.getTrailingTextBoundaryAt(extent.offset) ??\n        editableText.textEditingValue.text.length;\n    return TextRange(start: start, end: end);\n  }\n\n  // Selects the set of text boundaries in a document that intersect a given\n  // range of global positions.\n  //\n  // The set of text boundaries selected are not strictly bounded by the range\n  // of global positions.\n  //\n  // The first and last endpoints of the selection will always be at the\n  // beginning and end of a text boundary respectively.\n  void _selectTextBoundariesInRange({\n    required TextBoundary boundary,\n    required Offset from,\n    Offset? to,\n    SelectionChangedCause? cause,\n  }) {\n    final TextPosition fromPosition = renderEditable.getPositionForPoint(from);\n    final TextRange fromRange = _moveToTextBoundary(fromPosition, boundary);\n    final TextPosition toPosition = to == null\n        ? fromPosition\n        : renderEditable.getPositionForPoint(to);\n    final TextRange toRange = toPosition == fromPosition\n        ? fromRange\n        : _moveToTextBoundary(toPosition, boundary);\n    final bool isFromBoundaryBeforeToBoundary = fromRange.start < toRange.end;\n\n    final TextSelection newSelection = isFromBoundaryBeforeToBoundary\n        ? TextSelection(baseOffset: fromRange.start, extentOffset: toRange.end)\n        : TextSelection(baseOffset: fromRange.end, extentOffset: toRange.start);\n\n    editableText.userUpdateTextEditingValue(\n      editableText.textEditingValue.copyWith(selection: newSelection),\n      cause,\n    );\n  }\n\n  /// Handler for [TextSelectionGestureDetector.onTripleTapDown].\n  ///\n  /// By default, it selects a paragraph if\n  /// [TextSelectionGestureDetectorBuilderDelegate.selectionEnabled] is true\n  /// and shows the toolbar if necessary.\n  ///\n  /// See also:\n  ///\n  ///  * [TextSelectionGestureDetector.onTripleTapDown], which triggers this\n  ///    callback.\n  @protected\n  void onTripleTapDown(TapDragDownDetails details) {\n    if (!delegate.selectionEnabled) {\n      return;\n    }\n    if (renderEditable.maxLines == 1) {\n      editableText.selectAll(SelectionChangedCause.tap);\n    } else {\n      switch (defaultTargetPlatform) {\n        case TargetPlatform.android:\n        case TargetPlatform.fuchsia:\n        case TargetPlatform.iOS:\n        case TargetPlatform.macOS:\n        case TargetPlatform.windows:\n          _selectParagraphsInRange(\n            from: details.globalPosition,\n            cause: SelectionChangedCause.tap,\n          );\n        case TargetPlatform.linux:\n          _selectLinesInRange(\n            from: details.globalPosition,\n            cause: SelectionChangedCause.tap,\n          );\n      }\n    }\n    if (shouldShowSelectionToolbar) {\n      editableText.showToolbar();\n    }\n  }\n\n  /// Handler for [TextSelectionGestureDetector.onDragSelectionStart].\n  ///\n  /// By default, it selects a text position specified in [details].\n  ///\n  /// See also:\n  ///\n  ///  * [TextSelectionGestureDetector.onDragSelectionStart], which triggers\n  ///    this callback.\n  @protected\n  void onDragSelectionStart(TapDragStartDetails details) {\n    if (!delegate.selectionEnabled) {\n      return;\n    }\n    final PointerDeviceKind? kind = details.kind;\n    _shouldShowSelectionToolbar =\n        kind == null ||\n        kind == PointerDeviceKind.touch ||\n        kind == PointerDeviceKind.stylus;\n    _shouldShowSelectionHandles = _shouldShowSelectionToolbar;\n\n    _dragStartSelection = renderEditable.selection;\n    _dragStartScrollOffset = _scrollPosition;\n    _dragStartViewportOffset = renderEditable.offset.pixels;\n\n    if (_TextSelectionGestureDetectorState._getEffectiveConsecutiveTapCount(\n          details.consecutiveTapCount,\n        ) >\n        1) {\n      // Do not set the selection on a consecutive tap and drag.\n      return;\n    }\n\n    if (_isShiftPressed &&\n        renderEditable.selection != null &&\n        renderEditable.selection!.isValid) {\n      switch (defaultTargetPlatform) {\n        case TargetPlatform.iOS:\n        case TargetPlatform.macOS:\n          _expandSelection(details.globalPosition, SelectionChangedCause.drag);\n        case TargetPlatform.android:\n        case TargetPlatform.fuchsia:\n        case TargetPlatform.linux:\n        case TargetPlatform.windows:\n          _extendSelection(details.globalPosition, SelectionChangedCause.drag);\n      }\n    } else {\n      switch (defaultTargetPlatform) {\n        case TargetPlatform.iOS:\n          switch (details.kind) {\n            case PointerDeviceKind.mouse:\n            case PointerDeviceKind.trackpad:\n              renderEditable.selectPositionAt(\n                from: details.globalPosition,\n                cause: SelectionChangedCause.drag,\n              );\n            case PointerDeviceKind.stylus:\n            case PointerDeviceKind.invertedStylus:\n            case PointerDeviceKind.touch:\n            case PointerDeviceKind.unknown:\n            case null:\n          }\n        case TargetPlatform.android:\n        case TargetPlatform.fuchsia:\n          switch (details.kind) {\n            case PointerDeviceKind.mouse:\n            case PointerDeviceKind.trackpad:\n              renderEditable.selectPositionAt(\n                from: details.globalPosition,\n                cause: SelectionChangedCause.drag,\n              );\n            case PointerDeviceKind.stylus:\n            case PointerDeviceKind.invertedStylus:\n            case PointerDeviceKind.touch:\n            case PointerDeviceKind.unknown:\n              // For Android, Fuchsia, and iOS platforms, a touch drag\n              // does not initiate unless the editable has focus.\n              if (renderEditable.hasFocus) {\n                renderEditable.selectPositionAt(\n                  from: details.globalPosition,\n                  cause: SelectionChangedCause.drag,\n                );\n                _showMagnifierIfSupportedByPlatform(details.globalPosition);\n              }\n            case null:\n          }\n        case TargetPlatform.linux:\n        case TargetPlatform.macOS:\n        case TargetPlatform.windows:\n          renderEditable.selectPositionAt(\n            from: details.globalPosition,\n            cause: SelectionChangedCause.drag,\n          );\n      }\n    }\n  }\n\n  /// Handler for [TextSelectionGestureDetector.onDragSelectionUpdate].\n  ///\n  /// By default, it updates the selection location specified in the provided\n  /// details objects.\n  ///\n  /// See also:\n  ///\n  ///  * [TextSelectionGestureDetector.onDragSelectionUpdate], which triggers\n  ///    this callback./lib/src/material/text_field.dart\n  @protected\n  void onDragSelectionUpdate(TapDragUpdateDetails details) {\n    if (!delegate.selectionEnabled) {\n      return;\n    }\n\n    if (!_isShiftPressed) {\n      // Adjust the drag start offset for possible viewport offset changes.\n      final Offset editableOffset = renderEditable.maxLines == 1\n          ? Offset(renderEditable.offset.pixels - _dragStartViewportOffset, 0.0)\n          : Offset(\n              0.0,\n              renderEditable.offset.pixels - _dragStartViewportOffset,\n            );\n      final Offset scrollableOffset = switch (axisDirectionToAxis(\n        _scrollDirection ?? AxisDirection.left,\n      )) {\n        Axis.horizontal => Offset(\n          _scrollPosition - _dragStartScrollOffset,\n          0.0,\n        ),\n        Axis.vertical => Offset(0.0, _scrollPosition - _dragStartScrollOffset),\n      };\n      final Offset dragStartGlobalPosition =\n          details.globalPosition - details.offsetFromOrigin;\n\n      // Select word by word.\n      if (_TextSelectionGestureDetectorState._getEffectiveConsecutiveTapCount(\n            details.consecutiveTapCount,\n          ) ==\n          2) {\n        renderEditable.selectWordsInRange(\n          from: dragStartGlobalPosition - editableOffset - scrollableOffset,\n          to: details.globalPosition,\n          cause: SelectionChangedCause.drag,\n        );\n\n        switch (details.kind) {\n          case PointerDeviceKind.stylus:\n          case PointerDeviceKind.invertedStylus:\n          case PointerDeviceKind.touch:\n          case PointerDeviceKind.unknown:\n            return _showMagnifierIfSupportedByPlatform(details.globalPosition);\n          case PointerDeviceKind.mouse:\n          case PointerDeviceKind.trackpad:\n          case null:\n            return;\n        }\n      }\n\n      // Select paragraph-by-paragraph.\n      if (_TextSelectionGestureDetectorState._getEffectiveConsecutiveTapCount(\n            details.consecutiveTapCount,\n          ) ==\n          3) {\n        switch (defaultTargetPlatform) {\n          case TargetPlatform.android:\n          case TargetPlatform.fuchsia:\n          case TargetPlatform.iOS:\n            switch (details.kind) {\n              case PointerDeviceKind.mouse:\n              case PointerDeviceKind.trackpad:\n                return _selectParagraphsInRange(\n                  from:\n                      dragStartGlobalPosition -\n                      editableOffset -\n                      scrollableOffset,\n                  to: details.globalPosition,\n                  cause: SelectionChangedCause.drag,\n                );\n              case PointerDeviceKind.stylus:\n              case PointerDeviceKind.invertedStylus:\n              case PointerDeviceKind.touch:\n              case PointerDeviceKind.unknown:\n              case null:\n                // Triple tap to drag is not present on these platforms when using\n                // non-precise pointer devices at the moment.\n                break;\n            }\n            return;\n          case TargetPlatform.linux:\n            return _selectLinesInRange(\n              from: dragStartGlobalPosition - editableOffset - scrollableOffset,\n              to: details.globalPosition,\n              cause: SelectionChangedCause.drag,\n            );\n          case TargetPlatform.windows:\n          case TargetPlatform.macOS:\n            return _selectParagraphsInRange(\n              from: dragStartGlobalPosition - editableOffset - scrollableOffset,\n              to: details.globalPosition,\n              cause: SelectionChangedCause.drag,\n            );\n        }\n      }\n\n      switch (defaultTargetPlatform) {\n        case TargetPlatform.iOS:\n          // With a mouse device, a drag should select the range from the origin of the drag\n          // to the current position of the drag.\n          //\n          // With a touch device, nothing should happen.\n          switch (details.kind) {\n            case PointerDeviceKind.mouse:\n            case PointerDeviceKind.trackpad:\n              return renderEditable.selectPositionAt(\n                from:\n                    dragStartGlobalPosition - editableOffset - scrollableOffset,\n                to: details.globalPosition,\n                cause: SelectionChangedCause.drag,\n              );\n            case PointerDeviceKind.stylus:\n            case PointerDeviceKind.invertedStylus:\n            case PointerDeviceKind.touch:\n            case PointerDeviceKind.unknown:\n            case null:\n              break;\n          }\n          return;\n        case TargetPlatform.android:\n        case TargetPlatform.fuchsia:\n          // With a precise pointer device, such as a mouse, trackpad, or stylus,\n          // the drag will select the text spanning the origin of the drag to the end of the drag.\n          // With a touch device, the cursor should move with the drag.\n          switch (details.kind) {\n            case PointerDeviceKind.mouse:\n            case PointerDeviceKind.trackpad:\n            case PointerDeviceKind.stylus:\n            case PointerDeviceKind.invertedStylus:\n              return renderEditable.selectPositionAt(\n                from:\n                    dragStartGlobalPosition - editableOffset - scrollableOffset,\n                to: details.globalPosition,\n                cause: SelectionChangedCause.drag,\n              );\n            case PointerDeviceKind.touch:\n            case PointerDeviceKind.unknown:\n              if (renderEditable.hasFocus) {\n                renderEditable.selectPositionAt(\n                  from: details.globalPosition,\n                  cause: SelectionChangedCause.drag,\n                );\n                return _showMagnifierIfSupportedByPlatform(\n                  details.globalPosition,\n                );\n              }\n            case null:\n              break;\n          }\n          return;\n        case TargetPlatform.macOS:\n        case TargetPlatform.linux:\n        case TargetPlatform.windows:\n          return renderEditable.selectPositionAt(\n            from: dragStartGlobalPosition - editableOffset - scrollableOffset,\n            to: details.globalPosition,\n            cause: SelectionChangedCause.drag,\n          );\n      }\n    }\n\n    if (_dragStartSelection!.isCollapsed ||\n        (defaultTargetPlatform != TargetPlatform.iOS &&\n            defaultTargetPlatform != TargetPlatform.macOS)) {\n      return _extendSelection(\n        details.globalPosition,\n        SelectionChangedCause.drag,\n      );\n    }\n\n    // If the drag inverts the selection, Mac and iOS revert to the initial\n    // selection.\n    final TextSelection selection = editableText.textEditingValue.selection;\n    final TextPosition nextExtent = renderEditable.getPositionForPoint(\n      details.globalPosition,\n    );\n    final bool isShiftTapDragSelectionForward =\n        _dragStartSelection!.baseOffset < _dragStartSelection!.extentOffset;\n    final bool isInverted = isShiftTapDragSelectionForward\n        ? nextExtent.offset < _dragStartSelection!.baseOffset\n        : nextExtent.offset > _dragStartSelection!.baseOffset;\n    if (isInverted && selection.baseOffset == _dragStartSelection!.baseOffset) {\n      editableText.userUpdateTextEditingValue(\n        editableText.textEditingValue.copyWith(\n          selection: TextSelection(\n            baseOffset: _dragStartSelection!.extentOffset,\n            extentOffset: nextExtent.offset,\n          ),\n        ),\n        SelectionChangedCause.drag,\n      );\n    } else if (!isInverted &&\n        nextExtent.offset != _dragStartSelection!.baseOffset &&\n        selection.baseOffset != _dragStartSelection!.baseOffset) {\n      editableText.userUpdateTextEditingValue(\n        editableText.textEditingValue.copyWith(\n          selection: TextSelection(\n            baseOffset: _dragStartSelection!.baseOffset,\n            extentOffset: nextExtent.offset,\n          ),\n        ),\n        SelectionChangedCause.drag,\n      );\n    } else {\n      _extendSelection(details.globalPosition, SelectionChangedCause.drag);\n    }\n  }\n\n  /// Handler for [TextSelectionGestureDetector.onDragSelectionEnd].\n  ///\n  /// By default, it cleans up the state used for handling certain\n  /// built-in behaviors.\n  ///\n  /// See also:\n  ///\n  ///  * [TextSelectionGestureDetector.onDragSelectionEnd], which triggers this\n  ///    callback.\n  @protected\n  void onDragSelectionEnd(TapDragEndDetails details) {\n    if (_shouldShowSelectionToolbar &&\n        _TextSelectionGestureDetectorState._getEffectiveConsecutiveTapCount(\n              details.consecutiveTapCount,\n            ) ==\n            2) {\n      editableText.showToolbar();\n    }\n\n    if (_isShiftPressed) {\n      _dragStartSelection = null;\n    }\n\n    _hideMagnifierIfSupportedByPlatform();\n  }\n\n  /// Returns a [TextSelectionGestureDetector] configured with the handlers\n  /// provided by this builder.\n  ///\n  /// The [child] or its subtree should contain an [EditableText] whose key is\n  /// the [GlobalKey] provided by the [delegate]'s\n  /// [TextSelectionGestureDetectorBuilderDelegate.editableTextKey].\n  Widget buildGestureDetector({\n    Key? key,\n    HitTestBehavior? behavior,\n    required Widget child,\n  }) {\n    return TextSelectionGestureDetector(\n      key: key,\n      onTapTrackStart: onTapTrackStart,\n      onTapTrackReset: onTapTrackReset,\n      onTapDown: onTapDown,\n      onForcePressStart: delegate.forcePressEnabled ? onForcePressStart : null,\n      onForcePressEnd: delegate.forcePressEnabled ? onForcePressEnd : null,\n      onSecondaryTap: onSecondaryTap,\n      onSecondaryTapDown: onSecondaryTapDown,\n      onSingleTapUp: onSingleTapUp,\n      onSingleTapCancel: onSingleTapCancel,\n      onUserTap: onUserTap,\n      onSingleLongTapStart: onSingleLongTapStart,\n      onSingleLongTapMoveUpdate: onSingleLongTapMoveUpdate,\n      onSingleLongTapEnd: onSingleLongTapEnd,\n      onSingleLongTapCancel: onSingleLongTapCancel,\n      onDoubleTapDown: onDoubleTapDown,\n      onTripleTapDown: onTripleTapDown,\n      onDragSelectionStart: onDragSelectionStart,\n      onDragSelectionUpdate: onDragSelectionUpdate,\n      onDragSelectionEnd: onDragSelectionEnd,\n      onUserTapAlwaysCalled: onUserTapAlwaysCalled,\n      behavior: behavior,\n      child: child,\n    );\n  }\n}\n\n/// A gesture detector to respond to non-exclusive event chains for a text field.\n///\n/// An ordinary [GestureDetector] configured to handle events like tap and\n/// double tap will only recognize one or the other. This widget detects both:\n/// the first tap and then any subsequent taps that occurs within a time limit\n/// after the first.\n///\n/// See also:\n///\n///  * [TextField], a Material text field which uses this gesture detector.\n///  * [CupertinoTextField], a Cupertino text field which uses this gesture\n///    detector.\nclass TextSelectionGestureDetector extends StatefulWidget {\n  /// Create a [TextSelectionGestureDetector].\n  ///\n  /// Multiple callbacks can be called for one sequence of input gesture.\n  const TextSelectionGestureDetector({\n    super.key,\n    this.onTapTrackStart,\n    this.onTapTrackReset,\n    this.onTapDown,\n    this.onForcePressStart,\n    this.onForcePressEnd,\n    this.onSecondaryTap,\n    this.onSecondaryTapDown,\n    this.onSingleTapUp,\n    this.onSingleTapCancel,\n    this.onUserTap,\n    this.onSingleLongTapStart,\n    this.onSingleLongTapMoveUpdate,\n    this.onSingleLongTapEnd,\n    this.onSingleLongTapCancel,\n    this.onDoubleTapDown,\n    this.onTripleTapDown,\n    this.onDragSelectionStart,\n    this.onDragSelectionUpdate,\n    this.onDragSelectionEnd,\n    this.onUserTapAlwaysCalled = false,\n    this.behavior,\n    required this.child,\n  });\n\n  /// {@template flutter.gestures.selectionrecognizers.TextSelectionGestureDetector.onTapTrackStart}\n  /// Callback used to indicate that a tap tracking has started upon\n  /// a [PointerDownEvent].\n  /// {@endtemplate}\n  final VoidCallback? onTapTrackStart;\n\n  /// {@template flutter.gestures.selectionrecognizers.TextSelectionGestureDetector.onTapTrackReset}\n  /// Callback used to indicate that a tap tracking has been reset which\n  /// happens on the next [PointerDownEvent] after the timer between two taps\n  /// elapses, the recognizer loses the arena, the gesture is cancelled or\n  /// the recognizer is disposed of.\n  /// {@endtemplate}\n  final VoidCallback? onTapTrackReset;\n\n  /// Called for every tap down including every tap down that's part of a\n  /// double click or a long press, except touches that include enough movement\n  /// to not qualify as taps (e.g. pans and flings).\n  final GestureTapDragDownCallback? onTapDown;\n\n  /// Called when a pointer has tapped down and the force of the pointer has\n  /// just become greater than [ForcePressGestureRecognizer.startPressure].\n  final GestureForcePressStartCallback? onForcePressStart;\n\n  /// Called when a pointer that had previously triggered [onForcePressStart] is\n  /// lifted off the screen.\n  final GestureForcePressEndCallback? onForcePressEnd;\n\n  /// Called for a tap event with the secondary mouse button.\n  final GestureTapCallback? onSecondaryTap;\n\n  /// Called for a tap down event with the secondary mouse button.\n  final GestureTapDownCallback? onSecondaryTapDown;\n\n  /// Called for the first tap in a series of taps, consecutive taps do not call\n  /// this method.\n  ///\n  /// For example, if the detector was configured with [onTapDown] and\n  /// [onDoubleTapDown], three quick taps would be recognized as a single tap\n  /// down, followed by a tap up, then a double tap down, followed by a single tap down.\n  final GestureTapDragUpCallback? onSingleTapUp;\n\n  /// Called for each touch that becomes recognized as a gesture that is not a\n  /// short tap, such as a long tap or drag. It is called at the moment when\n  /// another gesture from the touch is recognized.\n  final GestureCancelCallback? onSingleTapCancel;\n\n  /// Called for the first tap in a series of taps when [onUserTapAlwaysCalled] is\n  /// disabled, which is the default behavior.\n  ///\n  /// When [onUserTapAlwaysCalled] is enabled, this is called for every tap,\n  /// including consecutive taps.\n  final GestureTapCallback? onUserTap;\n\n  /// Called for a single long tap that's sustained for longer than\n  /// [kLongPressTimeout] but not necessarily lifted. Not called for a\n  /// double-tap-hold, which calls [onDoubleTapDown] instead.\n  final GestureLongPressStartCallback? onSingleLongTapStart;\n\n  /// Called after [onSingleLongTapStart] when the pointer is dragged.\n  final GestureLongPressMoveUpdateCallback? onSingleLongTapMoveUpdate;\n\n  /// Called after [onSingleLongTapStart] when the pointer is lifted.\n  final GestureLongPressEndCallback? onSingleLongTapEnd;\n\n  /// Called after [onSingleLongTapStart] when the pointer is canceled.\n  final GestureLongPressCancelCallback? onSingleLongTapCancel;\n\n  /// Called after a momentary hold or a short tap that is close in space and\n  /// time (within [kDoubleTapTimeout]) to a previous short tap.\n  final GestureTapDragDownCallback? onDoubleTapDown;\n\n  /// Called after a momentary hold or a short tap that is close in space and\n  /// time (within [kDoubleTapTimeout]) to a previous double-tap.\n  final GestureTapDragDownCallback? onTripleTapDown;\n\n  /// Called when a mouse starts dragging to select text.\n  final GestureTapDragStartCallback? onDragSelectionStart;\n\n  /// Called repeatedly as a mouse moves while dragging.\n  final GestureTapDragUpdateCallback? onDragSelectionUpdate;\n\n  /// Called when a mouse that was previously dragging is released.\n  final GestureTapDragEndCallback? onDragSelectionEnd;\n\n  /// Whether [onUserTap] will be called for all taps including consecutive taps.\n  ///\n  /// Defaults to false, so [onUserTap] is only called for each distinct tap.\n  final bool onUserTapAlwaysCalled;\n\n  /// How this gesture detector should behave during hit testing.\n  ///\n  /// This defaults to [HitTestBehavior.deferToChild].\n  final HitTestBehavior? behavior;\n\n  /// Child below this widget.\n  final Widget child;\n\n  @override\n  State<StatefulWidget> createState() => _TextSelectionGestureDetectorState();\n}\n\nclass _TextSelectionGestureDetectorState\n    extends State<TextSelectionGestureDetector> {\n  // Converts the details.consecutiveTapCount from a TapAndDrag*Details object,\n  // which can grow to be infinitely large, to a value between 1 and 3. The value\n  // that the raw count is converted to is based on the default observed behavior\n  // on the native platforms.\n  //\n  // This method should be used in all instances when details.consecutiveTapCount\n  // would be used.\n  static int _getEffectiveConsecutiveTapCount(int rawCount) {\n    switch (defaultTargetPlatform) {\n      case TargetPlatform.android:\n      case TargetPlatform.fuchsia:\n      case TargetPlatform.linux:\n        // From observation, these platform's reset their tap count to 0 when\n        // the number of consecutive taps exceeds 3. For example on Debian Linux\n        // with GTK, when going past a triple click, on the fourth click the\n        // selection is moved to the precise click position, on the fifth click\n        // the word at the position is selected, and on the sixth click the\n        // paragraph at the position is selected.\n        return rawCount <= 3\n            ? rawCount\n            : (rawCount % 3 == 0 ? 3 : rawCount % 3);\n      case TargetPlatform.iOS:\n      case TargetPlatform.macOS:\n        // From observation, these platform's either hold their tap count at 3.\n        // For example on macOS, when going past a triple click, the selection\n        // should be retained at the paragraph that was first selected on triple\n        // click.\n        return math.min(rawCount, 3);\n      case TargetPlatform.windows:\n        // From observation, this platform's consecutive tap actions alternate\n        // between double click and triple click actions. For example, after a\n        // triple click has selected a paragraph, on the next click the word at\n        // the clicked position will be selected, and on the next click the\n        // paragraph at the position is selected.\n        return rawCount < 2 ? rawCount : 2 + rawCount % 2;\n    }\n  }\n\n  void _handleTapTrackStart() {\n    widget.onTapTrackStart?.call();\n  }\n\n  void _handleTapTrackReset() {\n    widget.onTapTrackReset?.call();\n  }\n\n  // The down handler is force-run on success of a single tap and optimistically\n  // run before a long press success.\n  void _handleTapDown(TapDragDownDetails details) {\n    widget.onTapDown?.call(details);\n    // This isn't detected as a double tap gesture in the gesture recognizer\n    // because it's 2 single taps, each of which may do different things depending\n    // on whether it's a single tap, the first tap of a double tap, the second\n    // tap held down, a clean double tap etc.\n    if (_getEffectiveConsecutiveTapCount(details.consecutiveTapCount) == 2) {\n      return widget.onDoubleTapDown?.call(details);\n    }\n\n    if (_getEffectiveConsecutiveTapCount(details.consecutiveTapCount) == 3) {\n      return widget.onTripleTapDown?.call(details);\n    }\n  }\n\n  void _handleTapUp(TapDragUpDetails details) {\n    if (_getEffectiveConsecutiveTapCount(details.consecutiveTapCount) == 1) {\n      widget.onSingleTapUp?.call(details);\n      widget.onUserTap?.call();\n    } else if (widget.onUserTapAlwaysCalled) {\n      widget.onUserTap?.call();\n    }\n  }\n\n  void _handleTapCancel() {\n    widget.onSingleTapCancel?.call();\n  }\n\n  void _handleDragStart(TapDragStartDetails details) {\n    widget.onDragSelectionStart?.call(details);\n  }\n\n  void _handleDragUpdate(TapDragUpdateDetails details) {\n    widget.onDragSelectionUpdate?.call(details);\n  }\n\n  void _handleDragEnd(TapDragEndDetails details) {\n    widget.onDragSelectionEnd?.call(details);\n  }\n\n  void _forcePressStarted(ForcePressDetails details) {\n    widget.onForcePressStart?.call(details);\n  }\n\n  void _forcePressEnded(ForcePressDetails details) {\n    widget.onForcePressEnd?.call(details);\n  }\n\n  void _handleLongPressStart(LongPressStartDetails details) {\n    widget.onSingleLongTapStart?.call(details);\n  }\n\n  void _handleLongPressMoveUpdate(LongPressMoveUpdateDetails details) {\n    widget.onSingleLongTapMoveUpdate?.call(details);\n  }\n\n  void _handleLongPressEnd(LongPressEndDetails details) {\n    widget.onSingleLongTapEnd?.call(details);\n  }\n\n  void _handleLongPressCancel() {\n    widget.onSingleLongTapCancel?.call();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final Map<Type, GestureRecognizerFactory> gestures =\n        <Type, GestureRecognizerFactory>{};\n\n    gestures[TapGestureRecognizer] =\n        GestureRecognizerFactoryWithHandlers<TapGestureRecognizer>(\n          () => TapGestureRecognizer(debugOwner: this),\n          (TapGestureRecognizer instance) {\n            instance\n              ..onSecondaryTap = widget.onSecondaryTap\n              ..onSecondaryTapDown = widget.onSecondaryTapDown;\n          },\n        );\n\n    if (widget.onSingleLongTapStart != null ||\n        widget.onSingleLongTapMoveUpdate != null ||\n        widget.onSingleLongTapEnd != null ||\n        widget.onSingleLongTapCancel != null) {\n      gestures[LongPressGestureRecognizer] =\n          GestureRecognizerFactoryWithHandlers<LongPressGestureRecognizer>(\n            () => LongPressGestureRecognizer(\n              debugOwner: this,\n              supportedDevices: <PointerDeviceKind>{PointerDeviceKind.touch},\n            ),\n            (LongPressGestureRecognizer instance) {\n              instance\n                ..onLongPressStart = _handleLongPressStart\n                ..onLongPressMoveUpdate = _handleLongPressMoveUpdate\n                ..onLongPressEnd = _handleLongPressEnd\n                ..onLongPressCancel = _handleLongPressCancel;\n            },\n          );\n    }\n\n    if (widget.onDragSelectionStart != null ||\n        widget.onDragSelectionUpdate != null ||\n        widget.onDragSelectionEnd != null) {\n      switch (defaultTargetPlatform) {\n        case TargetPlatform.android:\n        case TargetPlatform.fuchsia:\n        case TargetPlatform.iOS:\n          gestures[TapAndHorizontalDragGestureRecognizer] =\n              GestureRecognizerFactoryWithHandlers<\n                TapAndHorizontalDragGestureRecognizer\n              >(\n                () => TapAndHorizontalDragGestureRecognizer(debugOwner: this),\n                (TapAndHorizontalDragGestureRecognizer instance) {\n                  instance\n                    // Text selection should start from the position of the first pointer\n                    // down event.\n                    ..dragStartBehavior = DragStartBehavior.down\n                    ..eagerVictoryOnDrag =\n                        defaultTargetPlatform != TargetPlatform.iOS\n                    ..onTapTrackStart = _handleTapTrackStart\n                    ..onTapTrackReset = _handleTapTrackReset\n                    ..onTapDown = _handleTapDown\n                    ..onDragStart = _handleDragStart\n                    ..onDragUpdate = _handleDragUpdate\n                    ..onDragEnd = _handleDragEnd\n                    ..onTapUp = _handleTapUp\n                    ..onCancel = _handleTapCancel;\n                },\n              );\n        case TargetPlatform.linux:\n        case TargetPlatform.macOS:\n        case TargetPlatform.windows:\n          gestures[TapAndPanGestureRecognizer] =\n              GestureRecognizerFactoryWithHandlers<TapAndPanGestureRecognizer>(\n                () => TapAndPanGestureRecognizer(debugOwner: this),\n                (TapAndPanGestureRecognizer instance) {\n                  instance\n                    // Text selection should start from the position of the first pointer\n                    // down event.\n                    ..dragStartBehavior = DragStartBehavior.down\n                    ..onTapTrackStart = _handleTapTrackStart\n                    ..onTapTrackReset = _handleTapTrackReset\n                    ..onTapDown = _handleTapDown\n                    ..onDragStart = _handleDragStart\n                    ..onDragUpdate = _handleDragUpdate\n                    ..onDragEnd = _handleDragEnd\n                    ..onTapUp = _handleTapUp\n                    ..onCancel = _handleTapCancel;\n                },\n              );\n      }\n    }\n\n    if (widget.onForcePressStart != null || widget.onForcePressEnd != null) {\n      gestures[ForcePressGestureRecognizer] =\n          GestureRecognizerFactoryWithHandlers<ForcePressGestureRecognizer>(\n            () => ForcePressGestureRecognizer(debugOwner: this),\n            (ForcePressGestureRecognizer instance) {\n              instance\n                ..onStart = widget.onForcePressStart != null\n                    ? _forcePressStarted\n                    : null\n                ..onEnd = widget.onForcePressEnd != null\n                    ? _forcePressEnded\n                    : null;\n            },\n          );\n    }\n\n    return RawGestureDetector(\n      gestures: gestures,\n      excludeFromSemantics: true,\n      behavior: widget.behavior,\n      child: widget.child,\n    );\n  }\n}\n\n/// An object that manages a pair of text selection handles for a\n/// [RenderEditable].\n///\n/// This class is a wrapper of [SelectionOverlay] to provide APIs specific for\n/// [RenderEditable]s. To manage selection handles for custom widgets, use\n/// [SelectionOverlay] instead.\nclass TextSelectionOverlay {\n  /// Creates an object that manages overlay entries for selection handles.\n  ///\n  /// The [context] must have an [Overlay] as an ancestor.\n  TextSelectionOverlay({\n    required TextEditingValue value,\n    required this.context,\n    Widget? debugRequiredFor,\n    required LayerLink toolbarLayerLink,\n    required LayerLink startHandleLayerLink,\n    required LayerLink endHandleLayerLink,\n    required this.renderObject,\n    this.selectionControls,\n    bool handlesVisible = false,\n    required this.selectionDelegate,\n    DragStartBehavior dragStartBehavior = DragStartBehavior.start,\n    VoidCallback? onSelectionHandleTapped,\n    ClipboardStatusNotifier? clipboardStatus,\n    this.contextMenuBuilder,\n    required TextMagnifierConfiguration magnifierConfiguration,\n    required this.controller,\n  }) : _handlesVisible = handlesVisible,\n       _value = value {\n    assert(debugMaybeDispatchCreated('widgets', 'TextSelectionOverlay', this));\n    renderObject.selectionStartInViewport.addListener(\n      _updateTextSelectionOverlayVisibilities,\n    );\n    renderObject.selectionEndInViewport.addListener(\n      _updateTextSelectionOverlayVisibilities,\n    );\n    _updateTextSelectionOverlayVisibilities();\n    _selectionOverlay = SelectionOverlay(\n      magnifierConfiguration: magnifierConfiguration,\n      context: context,\n      debugRequiredFor: debugRequiredFor,\n      // The metrics will be set when show handles.\n      startHandleType: TextSelectionHandleType.collapsed,\n      startHandlesVisible: _effectiveStartHandleVisibility,\n      lineHeightAtStart: 0.0,\n      onStartHandleDragStart: _handleSelectionStartHandleDragStart,\n      onStartHandleDragUpdate: _handleSelectionStartHandleDragUpdate,\n      onEndHandleDragEnd: _handleAnyDragEnd,\n      endHandleType: TextSelectionHandleType.collapsed,\n      endHandlesVisible: _effectiveEndHandleVisibility,\n      lineHeightAtEnd: 0.0,\n      onEndHandleDragStart: _handleSelectionEndHandleDragStart,\n      onEndHandleDragUpdate: _handleSelectionEndHandleDragUpdate,\n      onStartHandleDragEnd: _handleAnyDragEnd,\n      toolbarVisible: _effectiveToolbarVisibility,\n      selectionEndpoints: const <TextSelectionPoint>[],\n      selectionControls: selectionControls,\n      selectionDelegate: selectionDelegate,\n      clipboardStatus: clipboardStatus,\n      startHandleLayerLink: startHandleLayerLink,\n      endHandleLayerLink: endHandleLayerLink,\n      toolbarLayerLink: toolbarLayerLink,\n      onSelectionHandleTapped: onSelectionHandleTapped,\n      dragStartBehavior: dragStartBehavior,\n      toolbarLocation: renderObject.lastSecondaryTapDownPosition,\n    );\n  }\n\n  final RichTextEditingController controller;\n\n  /// {@template flutter.widgets.SelectionOverlay.context}\n  /// The context in which the selection UI should appear.\n  ///\n  /// This context must have an [Overlay] as an ancestor because this object\n  /// will display the text selection handles in that [Overlay].\n  /// {@endtemplate}\n  final BuildContext context;\n\n  // TODO(mpcomplete): what if the renderObject is removed or replaced, or\n  // moves? Not sure what cases I need to handle, or how to handle them.\n  /// The editable line in which the selected text is being displayed.\n  final RenderEditable renderObject;\n\n  /// {@macro flutter.widgets.SelectionOverlay.selectionControls}\n  final TextSelectionControls? selectionControls;\n\n  /// {@macro flutter.widgets.SelectionOverlay.selectionDelegate}\n  final TextSelectionDelegate selectionDelegate;\n\n  late final SelectionOverlay _selectionOverlay;\n\n  /// {@macro flutter.widgets.EditableText.contextMenuBuilder}\n  ///\n  /// If not provided, no context menu will be built.\n  final WidgetBuilder? contextMenuBuilder;\n\n  /// Retrieve current value.\n  @visibleForTesting\n  TextEditingValue get value => _value;\n\n  TextEditingValue _value;\n\n  TextSelection get _selection => _value.selection;\n\n  final ValueNotifier<bool> _effectiveStartHandleVisibility =\n      ValueNotifier<bool>(false);\n  final ValueNotifier<bool> _effectiveEndHandleVisibility = ValueNotifier<bool>(\n    false,\n  );\n  final ValueNotifier<bool> _effectiveToolbarVisibility = ValueNotifier<bool>(\n    false,\n  );\n\n  void _updateTextSelectionOverlayVisibilities() {\n    _effectiveStartHandleVisibility.value =\n        _handlesVisible && renderObject.selectionStartInViewport.value;\n    _effectiveEndHandleVisibility.value =\n        _handlesVisible && renderObject.selectionEndInViewport.value;\n    _effectiveToolbarVisibility.value =\n        renderObject.selectionStartInViewport.value ||\n        renderObject.selectionEndInViewport.value;\n  }\n\n  /// Whether selection handles are visible.\n  ///\n  /// Set to false if you want to hide the handles. Use this property to show or\n  /// hide the handle without rebuilding them.\n  ///\n  /// Defaults to false.\n  bool get handlesVisible => _handlesVisible;\n  bool _handlesVisible = false;\n  set handlesVisible(bool visible) {\n    if (_handlesVisible == visible) {\n      return;\n    }\n    _handlesVisible = visible;\n    _updateTextSelectionOverlayVisibilities();\n  }\n\n  /// {@macro flutter.widgets.SelectionOverlay.showHandles}\n  void showHandles() {\n    _updateSelectionOverlay();\n    _selectionOverlay.showHandles();\n  }\n\n  /// {@macro flutter.widgets.SelectionOverlay.hideHandles}\n  void hideHandles() => _selectionOverlay.hideHandles();\n\n  /// {@macro flutter.widgets.SelectionOverlay.showToolbar}\n  void showToolbar() {\n    _updateSelectionOverlay();\n\n    if (selectionControls != null &&\n        selectionControls is! TextSelectionHandleControls) {\n      _selectionOverlay.showToolbar();\n      return;\n    }\n\n    if (contextMenuBuilder == null) {\n      return;\n    }\n\n    assert(context.mounted);\n    _selectionOverlay.showToolbar(\n      context: context,\n      contextMenuBuilder: contextMenuBuilder,\n    );\n    return;\n  }\n\n  /// Shows toolbar with spell check suggestions of misspelled words that are\n  /// available for click-and-replace.\n  void showSpellCheckSuggestionsToolbar(\n    WidgetBuilder spellCheckSuggestionsToolbarBuilder,\n  ) {\n    _updateSelectionOverlay();\n    assert(context.mounted);\n    _selectionOverlay.showSpellCheckSuggestionsToolbar(\n      context: context,\n      builder: spellCheckSuggestionsToolbarBuilder,\n    );\n    hideHandles();\n  }\n\n  /// {@macro flutter.widgets.SelectionOverlay.showMagnifier}\n  void showMagnifier(Offset positionToShow) {\n    final TextPosition position = renderObject.getPositionForPoint(\n      positionToShow,\n    );\n    _updateSelectionOverlay();\n    _selectionOverlay.showMagnifier(\n      _buildMagnifier(\n        currentTextPosition: position,\n        globalGesturePosition: positionToShow,\n        renderEditable: renderObject,\n      ),\n    );\n  }\n\n  /// {@macro flutter.widgets.SelectionOverlay.updateMagnifier}\n  void updateMagnifier(Offset positionToShow) {\n    final TextPosition position = renderObject.getPositionForPoint(\n      positionToShow,\n    );\n    _updateSelectionOverlay();\n    _selectionOverlay.updateMagnifier(\n      _buildMagnifier(\n        currentTextPosition: position,\n        globalGesturePosition: positionToShow,\n        renderEditable: renderObject,\n      ),\n    );\n  }\n\n  /// {@macro flutter.widgets.SelectionOverlay.hideMagnifier}\n  void hideMagnifier() {\n    _selectionOverlay.hideMagnifier();\n  }\n\n  /// Updates the overlay after the selection has changed.\n  ///\n  /// If this method is called while the [SchedulerBinding.schedulerPhase] is\n  /// [SchedulerPhase.persistentCallbacks], i.e. during the build, layout, or\n  /// paint phases (see [WidgetsBinding.drawFrame]), then the update is delayed\n  /// until the post-frame callbacks phase. Otherwise the update is done\n  /// synchronously. This means that it is safe to call during builds, but also\n  /// that if you do call this during a build, the UI will not update until the\n  /// next frame (i.e. many milliseconds later).\n  void update(TextEditingValue newValue) {\n    if (_value == newValue) {\n      return;\n    }\n    _value = newValue;\n    _updateSelectionOverlay();\n    // _updateSelectionOverlay may not rebuild the selection overlay if the\n    // text metrics and selection doesn't change even if the text has changed.\n    // This rebuild is needed for the toolbar to update based on the latest text\n    // value.\n    _selectionOverlay.markNeedsBuild();\n  }\n\n  void _updateSelectionOverlay() {\n    _selectionOverlay\n      // Update selection handle metrics.\n      ..startHandleType = _chooseType(\n        renderObject.textDirection,\n        TextSelectionHandleType.left,\n        TextSelectionHandleType.right,\n      )\n      ..lineHeightAtStart = _getStartGlyphHeight()\n      ..endHandleType = _chooseType(\n        renderObject.textDirection,\n        TextSelectionHandleType.right,\n        TextSelectionHandleType.left,\n      )\n      ..lineHeightAtEnd = _getEndGlyphHeight()\n      // Update selection toolbar metrics.\n      ..selectionEndpoints = renderObject.getEndpointsForSelection(_selection)\n      ..toolbarLocation = renderObject.lastSecondaryTapDownPosition;\n  }\n\n  /// Causes the overlay to update its rendering.\n  ///\n  /// This is intended to be called when the [renderObject] may have changed its\n  /// text metrics (e.g. because the text was scrolled).\n  void updateForScroll() {\n    _updateSelectionOverlay();\n    // This method may be called due to windows metrics changes. In that case,\n    // non of the properties in _selectionOverlay will change, but a rebuild is\n    // still needed.\n    _selectionOverlay.markNeedsBuild();\n  }\n\n  /// Whether the handles are currently visible.\n  bool get handlesAreVisible =>\n      _selectionOverlay._handles != null && handlesVisible;\n\n  /// {@macro flutter.widgets.SelectionOverlay.toolbarIsVisible}\n  ///\n  /// See also:\n  ///\n  ///   * [spellCheckToolbarIsVisible], which is only whether the spell check menu\n  ///     specifically is visible.\n  bool get toolbarIsVisible => _selectionOverlay.toolbarIsVisible;\n\n  /// {@macro flutter.widgets.SelectionOverlay.magnifierIsVisible}\n  bool get magnifierIsVisible => _selectionOverlay.magnifierIsVisible;\n\n  /// {@macro flutter.widgets.SelectionOverlay.magnifierExists}\n  bool get magnifierExists => _selectionOverlay.magnifierExists;\n\n  /// Whether the spell check menu is currently visible.\n  ///\n  /// See also:\n  ///\n  ///   * [toolbarIsVisible], which is whether any toolbar is visible.\n  bool get spellCheckToolbarIsVisible =>\n      _selectionOverlay._spellCheckToolbarController.isShown;\n\n  /// {@macro flutter.widgets.SelectionOverlay.hide}\n  void hide() => _selectionOverlay.hide();\n\n  /// {@macro flutter.widgets.SelectionOverlay.hideToolbar}\n  void hideToolbar() => _selectionOverlay.hideToolbar();\n\n  /// {@macro flutter.widgets.SelectionOverlay.dispose}\n  void dispose() {\n    assert(debugMaybeDispatchDisposed(this));\n    _selectionOverlay.dispose();\n    renderObject.selectionStartInViewport.removeListener(\n      _updateTextSelectionOverlayVisibilities,\n    );\n    renderObject.selectionEndInViewport.removeListener(\n      _updateTextSelectionOverlayVisibilities,\n    );\n    _effectiveToolbarVisibility.dispose();\n    _effectiveStartHandleVisibility.dispose();\n    _effectiveEndHandleVisibility.dispose();\n    hideToolbar();\n  }\n\n  double _getStartGlyphHeight() {\n    final String currText = selectionDelegate.textEditingValue.text;\n    final int firstSelectedGraphemeExtent;\n    Rect? startHandleRect;\n    // Only calculate handle rects if the text in the previous frame\n    // is the same as the text in the current frame. This is done because\n    // widget.renderObject contains the renderEditable from the previous frame.\n    // If the text changed between the current and previous frames then\n    // widget.renderObject.getRectForComposingRange might fail. In cases where\n    // the current frame is different from the previous we fall back to\n    // renderObject.preferredLineHeight.\n    if (renderObject.plainText == currText &&\n        _selection.isValid &&\n        !_selection.isCollapsed) {\n      final String selectedGraphemes = _selection.textInside(currText);\n      firstSelectedGraphemeExtent = selectedGraphemes.characters.first.length;\n      startHandleRect = renderObject.getRectForComposingRange(\n        TextRange(\n          start: _selection.start,\n          end: _selection.start + firstSelectedGraphemeExtent,\n        ),\n      );\n    }\n    return startHandleRect?.height ?? renderObject.preferredLineHeight;\n  }\n\n  double _getEndGlyphHeight() {\n    final String currText = selectionDelegate.textEditingValue.text;\n    final int lastSelectedGraphemeExtent;\n    Rect? endHandleRect;\n    // See the explanation in _getStartGlyphHeight.\n    if (renderObject.plainText == currText &&\n        _selection.isValid &&\n        !_selection.isCollapsed) {\n      final String selectedGraphemes = _selection.textInside(currText);\n      lastSelectedGraphemeExtent = selectedGraphemes.characters.last.length;\n      endHandleRect = renderObject.getRectForComposingRange(\n        TextRange(\n          start: _selection.end - lastSelectedGraphemeExtent,\n          end: _selection.end,\n        ),\n      );\n    }\n    return endHandleRect?.height ?? renderObject.preferredLineHeight;\n  }\n\n  MagnifierInfo _buildMagnifier({\n    required RenderEditable renderEditable,\n    required Offset globalGesturePosition,\n    required TextPosition currentTextPosition,\n  }) {\n    final TextSelection lineAtOffset = renderEditable.getLineAtOffset(\n      currentTextPosition,\n    );\n    final TextPosition positionAtEndOfLine = TextPosition(\n      offset: lineAtOffset.extentOffset,\n      affinity: TextAffinity.upstream,\n    );\n\n    // Default affinity is downstream.\n    final TextPosition positionAtBeginningOfLine = TextPosition(\n      offset: lineAtOffset.baseOffset,\n    );\n\n    final Rect localLineBoundaries = Rect.fromPoints(\n      renderEditable.getLocalRectForCaret(positionAtBeginningOfLine).topCenter,\n      renderEditable.getLocalRectForCaret(positionAtEndOfLine).bottomCenter,\n    );\n    final RenderBox? overlay =\n        Overlay.of(context, rootOverlay: true).context.findRenderObject()\n            as RenderBox?;\n    final Matrix4 transformToOverlay = renderEditable.getTransformTo(overlay);\n    final Rect overlayLineBoundaries = MatrixUtils.transformRect(\n      transformToOverlay,\n      localLineBoundaries,\n    );\n\n    final Rect localCaretRect = renderEditable.getLocalRectForCaret(\n      currentTextPosition,\n    );\n    final Rect overlayCaretRect = MatrixUtils.transformRect(\n      transformToOverlay,\n      localCaretRect,\n    );\n\n    final Offset overlayGesturePosition =\n        overlay?.globalToLocal(globalGesturePosition) ?? globalGesturePosition;\n\n    return MagnifierInfo(\n      fieldBounds: MatrixUtils.transformRect(\n        transformToOverlay,\n        renderEditable.paintBounds,\n      ),\n      globalGesturePosition: overlayGesturePosition,\n      caretRect: overlayCaretRect,\n      currentLineBoundaries: overlayLineBoundaries,\n    );\n  }\n\n  // The contact position of the gesture at the current end handle location, in\n  // global coordinates. Updated when the handle moves.\n  late double _endHandleDragPosition;\n\n  // The distance from _endHandleDragPosition to the center of the line that it\n  // corresponds to, in global coordinates.\n  late double _endHandleDragTarget;\n\n  // The initial selection when a selection handle drag has started.\n  //\n  // This is used on Apple platforms to:\n  //\n  // 1. Preserve a collapsed selection: if the selection was collapsed when the drag\n  // began, then it should remain collapsed throughout the entire drag.\n  // 2. Anchor the non-dragged end of a non-collapsed selection: On Apple platforms,\n  // the dragged handle always defines the selection's new extent. The drag start\n  // selection provides the original position for the selection's new base. This\n  // allows the selection handles to correctly swap their logical order (invert)\n  // during the drag.\n  TextSelection? _dragStartSelection;\n\n  void _handleSelectionEndHandleDragStart(DragStartDetails details) {\n    if (!renderObject.attached) {\n      return;\n    }\n\n    _endHandleDragPosition = details.globalPosition.dy;\n\n    // Use local coordinates when dealing with line height. because in case of a\n    // scale transformation, the line height will also be scaled.\n    final double centerOfLineLocal =\n        _selectionOverlay.selectionEndpoints.last.point.dy -\n        renderObject.preferredLineHeight / 2;\n    final double centerOfLineGlobal = renderObject\n        .localToGlobal(Offset(0.0, centerOfLineLocal))\n        .dy;\n    _endHandleDragTarget = centerOfLineGlobal - details.globalPosition.dy;\n    // Instead of finding the TextPosition at the handle's location directly,\n    // use the vertical center of the line that it points to. This is because\n    // selection handles typically hang above or below the line that they point\n    // to.\n    final TextPosition position = renderObject.getPositionForPoint(\n      Offset(details.globalPosition.dx, centerOfLineGlobal),\n    );\n\n    // The drag start selection is only utilized on Apple platforms.\n    if (defaultTargetPlatform == TargetPlatform.iOS ||\n        defaultTargetPlatform == TargetPlatform.macOS) {\n      _dragStartSelection ??= _selection;\n    }\n\n    _selectionOverlay.showMagnifier(\n      _buildMagnifier(\n        currentTextPosition: position,\n        globalGesturePosition: details.globalPosition,\n        renderEditable: renderObject,\n      ),\n    );\n  }\n\n  /// Given a handle position and drag position, returns the position of handle\n  /// after the drag.\n  ///\n  /// The handle jumps instantly between lines when the drag reaches a full\n  /// line's height away from the original handle position. In other words, the\n  /// line jump happens when the contact point would be located at the same\n  /// place on the handle at the new line as when the gesture started, for both\n  /// directions.\n  ///\n  /// This is not the same as just maintaining an offset from the target and the\n  /// contact point. There is no point at which moving the drag up and down a\n  /// small sub-line-height distance will cause the cursor to jump up and down\n  /// between lines. The drag distance must be a full line height for the cursor\n  /// to change lines, for both directions.\n  ///\n  /// Both parameters must be in local coordinates because the untransformed\n  /// line height is used, and the return value is in local coordinates as well.\n  double _getHandleDy(double dragDy, double handleDy) {\n    final double distanceDragged = dragDy - handleDy;\n    final int dragDirection = distanceDragged < 0.0 ? -1 : 1;\n    final int linesDragged =\n        dragDirection *\n        (distanceDragged.abs() / renderObject.preferredLineHeight).floor();\n    return handleDy + linesDragged * renderObject.preferredLineHeight;\n  }\n\n  void _handleSelectionEndHandleDragUpdate(DragUpdateDetails details) {\n    if (!renderObject.attached) {\n      return;\n    }\n\n    // This is NOT the same as details.localPosition. That is relative to the\n    // selection handle, whereas this is relative to the RenderEditable.\n    final Offset localPosition = renderObject.globalToLocal(\n      details.globalPosition,\n    );\n\n    final double nextEndHandleDragPositionLocal = _getHandleDy(\n      localPosition.dy,\n      renderObject.globalToLocal(Offset(0.0, _endHandleDragPosition)).dy,\n    );\n    _endHandleDragPosition = renderObject\n        .localToGlobal(Offset(0.0, nextEndHandleDragPositionLocal))\n        .dy;\n\n    final Offset handleTargetGlobal = Offset(\n      details.globalPosition.dx,\n      _endHandleDragPosition + _endHandleDragTarget,\n    );\n\n    TextPosition position = renderObject.getPositionForPoint(\n      handleTargetGlobal,\n    );\n\n    // bggRGjQaUbCoE right drag\n    position = controller.dragOffset(position);\n\n    final TextSelection newSelection;\n    switch (defaultTargetPlatform) {\n      // On Apple platforms, dragging the base handle makes it the extent.\n      case TargetPlatform.iOS:\n      case TargetPlatform.macOS:\n        assert(_dragStartSelection != null);\n        if (_dragStartSelection!.isCollapsed) {\n          _selectionOverlay.updateMagnifier(\n            _buildMagnifier(\n              currentTextPosition: position,\n              globalGesturePosition: details.globalPosition,\n              renderEditable: renderObject,\n            ),\n          );\n\n          final TextSelection currentSelection = TextSelection.fromPosition(\n            position,\n          );\n          _handleSelectionHandleChanged(currentSelection);\n          return;\n        }\n        // Use this instead of _dragStartSelection.isNormalized because TextRange.isNormalized\n        // always returns true for a TextSelection.\n        final bool dragStartSelectionNormalized =\n            _dragStartSelection!.extentOffset >=\n            _dragStartSelection!.baseOffset;\n        newSelection = TextSelection(\n          baseOffset: dragStartSelectionNormalized\n              ? _dragStartSelection!.baseOffset\n              : _dragStartSelection!.extentOffset,\n          extentOffset: position.offset,\n        );\n      case TargetPlatform.android:\n      case TargetPlatform.fuchsia:\n      case TargetPlatform.linux:\n      case TargetPlatform.windows:\n        if (_selection.isCollapsed) {\n          _selectionOverlay.updateMagnifier(\n            _buildMagnifier(\n              currentTextPosition: position,\n              globalGesturePosition: details.globalPosition,\n              renderEditable: renderObject,\n            ),\n          );\n\n          final TextSelection currentSelection = TextSelection.fromPosition(\n            position,\n          );\n          _handleSelectionHandleChanged(currentSelection);\n          return;\n        }\n        newSelection = TextSelection(\n          baseOffset: _selection.baseOffset,\n          extentOffset: position.offset,\n        );\n        if (newSelection.baseOffset >= newSelection.extentOffset) {\n          return; // Don't allow order swapping.\n        }\n    }\n\n    _handleSelectionHandleChanged(newSelection);\n\n    _selectionOverlay.updateMagnifier(\n      _buildMagnifier(\n        currentTextPosition: newSelection.extent,\n        globalGesturePosition: details.globalPosition,\n        renderEditable: renderObject,\n      ),\n    );\n  }\n\n  // The contact position of the gesture at the current start handle location,\n  // in global coordinates. Updated when the handle moves.\n  late double _startHandleDragPosition;\n\n  // The distance from _startHandleDragPosition to the center of the line that\n  // it corresponds to, in global coordinates.\n  late double _startHandleDragTarget;\n\n  void _handleSelectionStartHandleDragStart(DragStartDetails details) {\n    if (!renderObject.attached) {\n      return;\n    }\n\n    _startHandleDragPosition = details.globalPosition.dy;\n\n    // Use local coordinates when dealing with line height. because in case of a\n    // scale transformation, the line height will also be scaled.\n    final double centerOfLineLocal =\n        _selectionOverlay.selectionEndpoints.first.point.dy -\n        renderObject.preferredLineHeight / 2;\n    final double centerOfLineGlobal = renderObject\n        .localToGlobal(Offset(0.0, centerOfLineLocal))\n        .dy;\n    _startHandleDragTarget = centerOfLineGlobal - details.globalPosition.dy;\n    // Instead of finding the TextPosition at the handle's location directly,\n    // use the vertical center of the line that it points to. This is because\n    // selection handles typically hang above or below the line that they point\n    // to.\n    final TextPosition position = renderObject.getPositionForPoint(\n      Offset(details.globalPosition.dx, centerOfLineGlobal),\n    );\n\n    // The drag start selection is only utilized on Apple platforms.\n    if (defaultTargetPlatform == TargetPlatform.iOS ||\n        defaultTargetPlatform == TargetPlatform.macOS) {\n      _dragStartSelection ??= _selection;\n    }\n\n    _selectionOverlay.showMagnifier(\n      _buildMagnifier(\n        currentTextPosition: position,\n        globalGesturePosition: details.globalPosition,\n        renderEditable: renderObject,\n      ),\n    );\n  }\n\n  void _handleSelectionStartHandleDragUpdate(DragUpdateDetails details) {\n    if (!renderObject.attached) {\n      return;\n    }\n\n    // This is NOT the same as details.localPosition. That is relative to the\n    // selection handle, whereas this is relative to the RenderEditable.\n    final Offset localPosition = renderObject.globalToLocal(\n      details.globalPosition,\n    );\n    final double nextStartHandleDragPositionLocal = _getHandleDy(\n      localPosition.dy,\n      renderObject.globalToLocal(Offset(0.0, _startHandleDragPosition)).dy,\n    );\n    _startHandleDragPosition = renderObject\n        .localToGlobal(Offset(0.0, nextStartHandleDragPositionLocal))\n        .dy;\n    final Offset handleTargetGlobal = Offset(\n      details.globalPosition.dx,\n      _startHandleDragPosition + _startHandleDragTarget,\n    );\n    TextPosition position = renderObject.getPositionForPoint(\n      handleTargetGlobal,\n    );\n\n    // bggRGjQaUbCoE single drag, left drag\n    position = controller.dragOffset(position);\n\n    final TextSelection newSelection;\n    switch (defaultTargetPlatform) {\n      // On Apple platforms, dragging the base handle makes it the extent.\n      case TargetPlatform.iOS:\n      case TargetPlatform.macOS:\n        assert(_dragStartSelection != null);\n        if (_dragStartSelection!.isCollapsed) {\n          _selectionOverlay.updateMagnifier(\n            _buildMagnifier(\n              currentTextPosition: position,\n              globalGesturePosition: details.globalPosition,\n              renderEditable: renderObject,\n            ),\n          );\n\n          final TextSelection currentSelection = TextSelection.fromPosition(\n            position,\n          );\n          _handleSelectionHandleChanged(currentSelection);\n          return;\n        }\n        // Use this instead of _dragStartSelection.isNormalized because TextRange.isNormalized\n        // always returns true for a TextSelection.\n        final bool dragStartSelectionNormalized =\n            _dragStartSelection!.extentOffset >=\n            _dragStartSelection!.baseOffset;\n        newSelection = TextSelection(\n          baseOffset: dragStartSelectionNormalized\n              ? _dragStartSelection!.extentOffset\n              : _dragStartSelection!.baseOffset,\n          extentOffset: position.offset,\n        );\n      case TargetPlatform.android:\n      case TargetPlatform.fuchsia:\n      case TargetPlatform.linux:\n      case TargetPlatform.windows:\n        if (_selection.isCollapsed) {\n          _selectionOverlay.updateMagnifier(\n            _buildMagnifier(\n              currentTextPosition: position,\n              globalGesturePosition: details.globalPosition,\n              renderEditable: renderObject,\n            ),\n          );\n\n          final TextSelection currentSelection = TextSelection.fromPosition(\n            position,\n          );\n          _handleSelectionHandleChanged(currentSelection);\n          return;\n        }\n        newSelection = TextSelection(\n          baseOffset: position.offset,\n          extentOffset: _selection.extentOffset,\n        );\n        if (newSelection.baseOffset >= newSelection.extentOffset) {\n          return; // Don't allow order swapping.\n        }\n    }\n\n    _selectionOverlay.updateMagnifier(\n      _buildMagnifier(\n        currentTextPosition:\n            newSelection.extent.offset < newSelection.base.offset\n            ? newSelection.extent\n            : newSelection.base,\n        globalGesturePosition: details.globalPosition,\n        renderEditable: renderObject,\n      ),\n    );\n\n    _handleSelectionHandleChanged(newSelection);\n  }\n\n  void _handleAnyDragEnd(DragEndDetails details) {\n    if (!context.mounted) {\n      return;\n    }\n    _dragStartSelection = null;\n    final bool draggingHandles =\n        _selectionOverlay.isDraggingStartHandle ||\n        _selectionOverlay.isDraggingEndHandle;\n    if (selectionControls is! TextSelectionHandleControls) {\n      if (!draggingHandles) {\n        _selectionOverlay.hideMagnifier();\n        if (!_selection.isCollapsed) {\n          _selectionOverlay.showToolbar();\n        }\n      }\n      return;\n    }\n    if (!draggingHandles) {\n      _selectionOverlay.hideMagnifier();\n      if (!_selection.isCollapsed) {\n        _selectionOverlay.showToolbar(\n          context: context,\n          contextMenuBuilder: contextMenuBuilder,\n        );\n      }\n    }\n  }\n\n  void _handleSelectionHandleChanged(TextSelection newSelection) {\n    selectionDelegate.userUpdateTextEditingValue(\n      _value.copyWith(selection: newSelection),\n      SelectionChangedCause.drag,\n    );\n  }\n\n  TextSelectionHandleType _chooseType(\n    TextDirection textDirection,\n    TextSelectionHandleType ltrType,\n    TextSelectionHandleType rtlType,\n  ) {\n    if (_selection.isCollapsed) {\n      return TextSelectionHandleType.collapsed;\n    }\n\n    return switch (textDirection) {\n      TextDirection.ltr => ltrType,\n      TextDirection.rtl => rtlType,\n    };\n  }\n}\n\n/// An object that manages a pair of selection handles and a toolbar.\n///\n/// The selection handles are displayed in the [Overlay] that most closely\n/// encloses the given [BuildContext].\nclass SelectionOverlay {\n  /// Creates an object that manages overlay entries for selection handles.\n  ///\n  /// The [context] must have an [Overlay] as an ancestor.\n  SelectionOverlay({\n    required this.context,\n    this.debugRequiredFor,\n    required TextSelectionHandleType startHandleType,\n    required double lineHeightAtStart,\n    this.startHandlesVisible,\n    this.onStartHandleDragStart,\n    this.onStartHandleDragUpdate,\n    this.onStartHandleDragEnd,\n    required TextSelectionHandleType endHandleType,\n    required double lineHeightAtEnd,\n    this.endHandlesVisible,\n    this.onEndHandleDragStart,\n    this.onEndHandleDragUpdate,\n    this.onEndHandleDragEnd,\n    this.toolbarVisible,\n    required List<TextSelectionPoint> selectionEndpoints,\n    required this.selectionControls,\n    @Deprecated(\n      'Use `contextMenuBuilder` in `showToolbar` instead. '\n      'This feature was deprecated after v3.3.0-0.5.pre.',\n    )\n    required this.selectionDelegate,\n    required this.clipboardStatus,\n    required this.startHandleLayerLink,\n    required this.endHandleLayerLink,\n    required this.toolbarLayerLink,\n    this.dragStartBehavior = DragStartBehavior.start,\n    this.onSelectionHandleTapped,\n    @Deprecated(\n      'Use `contextMenuBuilder` in `showToolbar` instead. '\n      'This feature was deprecated after v3.3.0-0.5.pre.',\n    )\n    Offset? toolbarLocation,\n    this.magnifierConfiguration = TextMagnifierConfiguration.disabled,\n  }) : _startHandleType = startHandleType,\n       _lineHeightAtStart = lineHeightAtStart,\n       _endHandleType = endHandleType,\n       _lineHeightAtEnd = lineHeightAtEnd,\n       _selectionEndpoints = selectionEndpoints,\n       _toolbarLocation = toolbarLocation,\n       assert(debugCheckHasOverlay(context)) {\n    assert(debugMaybeDispatchCreated('widgets', 'SelectionOverlay', this));\n  }\n\n  /// {@macro flutter.widgets.SelectionOverlay.context}\n  final BuildContext context;\n\n  final ValueNotifier<MagnifierInfo> _magnifierInfo =\n      ValueNotifier<MagnifierInfo>(\n        MagnifierInfo.empty,\n      );\n\n  // [MagnifierController.show] and [MagnifierController.hide] should not be\n  // called directly, except from inside [showMagnifier] and [hideMagnifier]. If\n  // it is desired to show or hide the magnifier, call [showMagnifier] or\n  // [hideMagnifier]. This is because the magnifier needs to orchestrate with\n  // other properties in [SelectionOverlay].\n  final MagnifierController _magnifierController = MagnifierController();\n\n  /// The configuration for the magnifier.\n  ///\n  /// By default, [SelectionOverlay]'s [TextMagnifierConfiguration] is disabled.\n  ///\n  /// {@macro flutter.widgets.magnifier.intro}\n  final TextMagnifierConfiguration magnifierConfiguration;\n\n  /// {@template flutter.widgets.SelectionOverlay.toolbarIsVisible}\n  /// Whether the toolbar is currently visible.\n  ///\n  /// Includes both the text selection toolbar and the spell check menu.\n  /// {@endtemplate}\n  bool get toolbarIsVisible {\n    return selectionControls is TextSelectionHandleControls\n        ? _contextMenuController.isShown || _spellCheckToolbarController.isShown\n        : _toolbar != null || _spellCheckToolbarController.isShown;\n  }\n\n  /// {@template flutter.widgets.SelectionOverlay.magnifierIsVisible}\n  /// Whether the magnifier is currently visible.\n  /// {@endtemplate}\n  bool get magnifierIsVisible => _magnifierController.shown;\n\n  /// {@template flutter.widgets.SelectionOverlay.magnifierExists}\n  /// Whether the magnifier currently exists.\n  ///\n  /// This differs from [magnifierIsVisible] in that the magnifier may exist\n  /// in the overlay, but not be shown.\n  /// {@endtemplate}\n  bool get magnifierExists => _magnifierController.overlayEntry != null;\n\n  /// {@template flutter.widgets.SelectionOverlay.showMagnifier}\n  /// Shows the magnifier, and hides the toolbar if it was showing when [showMagnifier]\n  /// was called. This is safe to call on platforms not mobile, since\n  /// a magnifierBuilder will not be provided, or the magnifierBuilder will return null\n  /// on platforms not mobile.\n  ///\n  /// This is NOT the source of truth for if the magnifier is up or not,\n  /// since magnifiers may hide themselves. If this info is needed, check\n  /// [MagnifierController.shown].\n  /// {@endtemplate}\n  void showMagnifier(MagnifierInfo initialMagnifierInfo) {\n    // Do not show the magnifier if one already exists.\n    if (_magnifierController.overlayEntry != null) {\n      return;\n    }\n    if (toolbarIsVisible) {\n      hideToolbar();\n    }\n\n    // Start from empty, so we don't utilize any remnant values.\n    _magnifierInfo.value = initialMagnifierInfo;\n\n    // Pre-build the magnifiers so we can tell if we've built something\n    // or not. If we don't build a magnifiers, then we should not\n    // insert anything in the overlay.\n    final Widget? builtMagnifier = magnifierConfiguration.magnifierBuilder(\n      context,\n      _magnifierController,\n      _magnifierInfo,\n    );\n\n    if (builtMagnifier == null) {\n      return;\n    }\n\n    _magnifierController.show(\n      context: context,\n      below: magnifierConfiguration.shouldDisplayHandlesInMagnifier\n          ? null\n          : _handles?.start,\n      builder: (_) => builtMagnifier,\n    );\n  }\n\n  /// {@template flutter.widgets.SelectionOverlay.hideMagnifier}\n  /// Hide the current magnifier.\n  ///\n  /// This does nothing if there is no magnifier.\n  /// {@endtemplate}\n  void hideMagnifier() {\n    // This cannot be a check on `MagnifierController.shown`, since\n    // it's possible that the magnifier is still in the overlay, but\n    // not shown in cases where the magnifier hides itself.\n    if (_magnifierController.overlayEntry == null) {\n      return;\n    }\n\n    _magnifierController.hide();\n  }\n\n  /// The type of start selection handle.\n  ///\n  /// Changing the value while the handles are visible causes them to rebuild.\n  TextSelectionHandleType get startHandleType => _startHandleType;\n  TextSelectionHandleType _startHandleType;\n  set startHandleType(TextSelectionHandleType value) {\n    if (_startHandleType == value) {\n      return;\n    }\n    _startHandleType = value;\n    markNeedsBuild();\n  }\n\n  /// The line height at the selection start.\n  ///\n  /// This value is used for calculating the size of the start selection handle.\n  ///\n  /// Changing the value while the handles are visible causes them to rebuild.\n  double get lineHeightAtStart => _lineHeightAtStart;\n  double _lineHeightAtStart;\n  set lineHeightAtStart(double value) {\n    if (_lineHeightAtStart == value) {\n      return;\n    }\n    _lineHeightAtStart = value;\n    markNeedsBuild();\n  }\n\n  // Whether a drag is in progress on the start handle. This differs from\n  // `_isDraggingStartHandle` in that it is not blocked by `_canDragStartHandle`.\n  bool _startHandleDragInProgress = false;\n\n  /// Whether the selection start handle is currently being dragged.\n  bool get isDraggingStartHandle =>\n      _isDraggingStartHandle || _startHandleDragInProgress;\n  bool _isDraggingStartHandle = false;\n\n  // Whether the start handle can be dragged.\n  //\n  // On Apple and web platforms only one selection handle can be dragged\n  // at a time, so when the end handle is being dragged on these platforms\n  // the the start handle cannot be dragged.\n  bool get _canDragStartHandle =>\n      !_isDraggingEndHandle ||\n      (defaultTargetPlatform != TargetPlatform.iOS &&\n          defaultTargetPlatform != TargetPlatform.macOS &&\n          !kIsWeb);\n\n  /// Whether the start handle is visible.\n  ///\n  /// If the value changes, the start handle uses [FadeTransition] to transition\n  /// itself on and off the screen.\n  ///\n  /// If this is null, the start selection handle will always be visible.\n  final ValueListenable<bool>? startHandlesVisible;\n\n  /// Called when the users start dragging the start selection handles.\n  final ValueChanged<DragStartDetails>? onStartHandleDragStart;\n\n  void _handleStartHandleDragStart(DragStartDetails details) {\n    assert(!_isDraggingStartHandle);\n    // Calling OverlayEntry.remove may not happen until the following frame, so\n    // it's possible for the handles to receive a gesture after calling remove.\n    if (_handles == null) {\n      _isDraggingStartHandle = false;\n      return;\n    }\n    _startHandleDragInProgress = true;\n    if (!_canDragStartHandle) {\n      return;\n    }\n    _isDraggingStartHandle = details.kind == PointerDeviceKind.touch;\n    onStartHandleDragStart?.call(details);\n  }\n\n  void _handleStartHandleDragUpdate(DragUpdateDetails details) {\n    // Calling OverlayEntry.remove may not happen until the following frame, so\n    // it's possible for the handles to receive a gesture after calling remove.\n    if (_handles == null) {\n      _isDraggingStartHandle = false;\n      return;\n    }\n    if (!_canDragStartHandle) {\n      return;\n    }\n    // The handle drag may have been blocked before on Apple platforms and the web\n    // while the opposite handle was being dragged. Ensure that any logic that was\n    // meant to be run in onStartHandleDragStart is still run.\n    if (!_isDraggingStartHandle) {\n      _isDraggingStartHandle = details.kind == PointerDeviceKind.touch;\n      final DragStartDetails startDetails = DragStartDetails(\n        globalPosition: details.globalPosition,\n        localPosition: details.localPosition,\n        sourceTimeStamp: details.sourceTimeStamp,\n        kind: details.kind,\n      );\n      onStartHandleDragStart?.call(startDetails);\n    }\n    onStartHandleDragUpdate?.call(details);\n  }\n\n  /// Called when the users drag the start selection handles to new locations.\n  final ValueChanged<DragUpdateDetails>? onStartHandleDragUpdate;\n\n  /// Called when the users lift their fingers after dragging the start selection\n  /// handles.\n  final ValueChanged<DragEndDetails>? onStartHandleDragEnd;\n\n  void _handleStartHandleDragEnd(DragEndDetails details) {\n    _isDraggingStartHandle = false;\n    // Calling OverlayEntry.remove may not happen until the following frame, so\n    // it's possible for the handles to receive a gesture after calling remove.\n    if (_handles == null) {\n      return;\n    }\n    _startHandleDragInProgress = false;\n    if (!_canDragStartHandle) {\n      return;\n    }\n    onStartHandleDragEnd?.call(details);\n  }\n\n  /// The type of end selection handle.\n  ///\n  /// Changing the value while the handles are visible causes them to rebuild.\n  TextSelectionHandleType get endHandleType => _endHandleType;\n  TextSelectionHandleType _endHandleType;\n  set endHandleType(TextSelectionHandleType value) {\n    if (_endHandleType == value) {\n      return;\n    }\n    _endHandleType = value;\n    markNeedsBuild();\n  }\n\n  /// The line height at the selection end.\n  ///\n  /// This value is used for calculating the size of the end selection handle.\n  ///\n  /// Changing the value while the handles are visible causes them to rebuild.\n  double get lineHeightAtEnd => _lineHeightAtEnd;\n  double _lineHeightAtEnd;\n  set lineHeightAtEnd(double value) {\n    if (_lineHeightAtEnd == value) {\n      return;\n    }\n    _lineHeightAtEnd = value;\n    markNeedsBuild();\n  }\n\n  // Whether a drag is in progress on the start handle. This differs from\n  // `_isDraggingEndHandle` in that it is not blocked by `_canDragEndHandle`.\n  bool _endHandleDragInProgress = false;\n\n  /// Whether the selection end handle is currently being dragged.\n  bool get isDraggingEndHandle =>\n      _isDraggingEndHandle || _endHandleDragInProgress;\n  bool _isDraggingEndHandle = false;\n\n  // Whether the end handle can be dragged.\n  //\n  // On Apple and web platforms only one selection handle can be dragged\n  // at a time, so when the start handle is being dragged on these platforms\n  // the the end handle cannot be dragged.\n  bool get _canDragEndHandle =>\n      !_isDraggingStartHandle ||\n      (defaultTargetPlatform != TargetPlatform.iOS &&\n          defaultTargetPlatform != TargetPlatform.macOS &&\n          !kIsWeb);\n\n  /// Whether the end handle is visible.\n  ///\n  /// If the value changes, the end handle uses [FadeTransition] to transition\n  /// itself on and off the screen.\n  ///\n  /// If this is null, the end selection handle will always be visible.\n  final ValueListenable<bool>? endHandlesVisible;\n\n  /// Called when the users start dragging the end selection handles.\n  final ValueChanged<DragStartDetails>? onEndHandleDragStart;\n\n  void _handleEndHandleDragStart(DragStartDetails details) {\n    assert(!_isDraggingEndHandle);\n    // Calling OverlayEntry.remove may not happen until the following frame, so\n    // it's possible for the handles to receive a gesture after calling remove.\n    if (_handles == null) {\n      _isDraggingEndHandle = false;\n      return;\n    }\n    _endHandleDragInProgress = true;\n    if (!_canDragEndHandle) {\n      return;\n    }\n    _isDraggingEndHandle = details.kind == PointerDeviceKind.touch;\n    onEndHandleDragStart?.call(details);\n  }\n\n  void _handleEndHandleDragUpdate(DragUpdateDetails details) {\n    // Calling OverlayEntry.remove may not happen until the following frame, so\n    // it's possible for the handles to receive a gesture after calling remove.\n    if (_handles == null) {\n      _isDraggingEndHandle = false;\n      return;\n    }\n    if (!_canDragEndHandle) {\n      return;\n    }\n    // The handle drag may have been blocked before on Apple platforms and the web\n    // while the opposite handle was being dragged. Ensure that any logic that was\n    // meant to be run in onStartHandleDragStart is still run.\n    if (!_isDraggingEndHandle) {\n      _isDraggingEndHandle = details.kind == PointerDeviceKind.touch;\n      final DragStartDetails startDetails = DragStartDetails(\n        globalPosition: details.globalPosition,\n        localPosition: details.localPosition,\n        sourceTimeStamp: details.sourceTimeStamp,\n        kind: details.kind,\n      );\n      onEndHandleDragStart?.call(startDetails);\n    }\n    onEndHandleDragUpdate?.call(details);\n  }\n\n  /// Called when the users drag the end selection handles to new locations.\n  final ValueChanged<DragUpdateDetails>? onEndHandleDragUpdate;\n\n  /// Called when the users lift their fingers after dragging the end selection\n  /// handles.\n  final ValueChanged<DragEndDetails>? onEndHandleDragEnd;\n\n  void _handleEndHandleDragEnd(DragEndDetails details) {\n    _isDraggingEndHandle = false;\n    // Calling OverlayEntry.remove may not happen until the following frame, so\n    // it's possible for the handles to receive a gesture after calling remove.\n    if (_handles == null) {\n      return;\n    }\n    _endHandleDragInProgress = false;\n    if (!_canDragEndHandle) {\n      return;\n    }\n    onEndHandleDragEnd?.call(details);\n  }\n\n  /// Whether the toolbar is visible.\n  ///\n  /// If the value changes, the toolbar uses [FadeTransition] to transition\n  /// itself on and off the screen.\n  ///\n  /// If this is null the toolbar will always be visible.\n  final ValueListenable<bool>? toolbarVisible;\n\n  /// The text selection positions of selection start and end.\n  List<TextSelectionPoint> get selectionEndpoints => _selectionEndpoints;\n  List<TextSelectionPoint> _selectionEndpoints;\n  set selectionEndpoints(List<TextSelectionPoint> value) {\n    if (!listEquals(_selectionEndpoints, value)) {\n      markNeedsBuild();\n      if (_isDraggingEndHandle || _isDraggingStartHandle) {\n        switch (defaultTargetPlatform) {\n          case TargetPlatform.android:\n            HapticFeedback.selectionClick();\n          case TargetPlatform.fuchsia:\n          case TargetPlatform.iOS:\n          case TargetPlatform.linux:\n          case TargetPlatform.macOS:\n          case TargetPlatform.windows:\n            break;\n        }\n      }\n    }\n    _selectionEndpoints = value;\n  }\n\n  /// Debugging information for explaining why the [Overlay] is required.\n  final Widget? debugRequiredFor;\n\n  /// The object supplied to the [CompositedTransformTarget] that wraps the text\n  /// field.\n  final LayerLink toolbarLayerLink;\n\n  /// The objects supplied to the [CompositedTransformTarget] that wraps the\n  /// location of start selection handle.\n  final LayerLink startHandleLayerLink;\n\n  /// The objects supplied to the [CompositedTransformTarget] that wraps the\n  /// location of end selection handle.\n  final LayerLink endHandleLayerLink;\n\n  /// {@template flutter.widgets.SelectionOverlay.selectionControls}\n  /// Builds text selection handles and toolbar.\n  /// {@endtemplate}\n  final TextSelectionControls? selectionControls;\n\n  /// {@template flutter.widgets.SelectionOverlay.selectionDelegate}\n  /// The delegate for manipulating the current selection in the owning\n  /// text field.\n  /// {@endtemplate}\n  @Deprecated(\n    'Use `contextMenuBuilder` instead. '\n    'This feature was deprecated after v3.3.0-0.5.pre.',\n  )\n  final TextSelectionDelegate? selectionDelegate;\n\n  /// Determines the way that drag start behavior is handled.\n  ///\n  /// If set to [DragStartBehavior.start], handle drag behavior will\n  /// begin at the position where the drag gesture won the arena. If set to\n  /// [DragStartBehavior.down] it will begin at the position where a down\n  /// event is first detected.\n  ///\n  /// In general, setting this to [DragStartBehavior.start] will make drag\n  /// animation smoother and setting it to [DragStartBehavior.down] will make\n  /// drag behavior feel slightly more reactive.\n  ///\n  /// By default, the drag start behavior is [DragStartBehavior.start].\n  ///\n  /// See also:\n  ///\n  ///  * [DragGestureRecognizer.dragStartBehavior], which gives an example for the different behaviors.\n  final DragStartBehavior dragStartBehavior;\n\n  /// {@template flutter.widgets.SelectionOverlay.onSelectionHandleTapped}\n  /// A callback that's optionally invoked when a selection handle is tapped.\n  ///\n  /// The [TextSelectionControls.buildHandle] implementation the text field\n  /// uses decides where the handle's tap \"hotspot\" is, or whether the\n  /// selection handle supports tap gestures at all. For instance,\n  /// [MaterialTextSelectionControls] calls [onSelectionHandleTapped] when the\n  /// selection handle's \"knob\" is tapped, while\n  /// [CupertinoTextSelectionControls] builds a handle that's not sufficiently\n  /// large for tapping (as it's not meant to be tapped) so it does not call\n  /// [onSelectionHandleTapped] even when tapped.\n  /// {@endtemplate}\n  // See https://github.com/flutter/flutter/issues/39376#issuecomment-848406415\n  // for provenance.\n  final VoidCallback? onSelectionHandleTapped;\n\n  /// Maintains the status of the clipboard for determining if its contents can\n  /// be pasted or not.\n  ///\n  /// Useful because the actual value of the clipboard can only be checked\n  /// asynchronously (see [Clipboard.getData]).\n  final ClipboardStatusNotifier? clipboardStatus;\n\n  /// The location of where the toolbar should be drawn in relative to the\n  /// location of [toolbarLayerLink].\n  ///\n  /// If this is null, the toolbar is drawn based on [selectionEndpoints] and\n  /// the rect of render object of [context].\n  ///\n  /// This is useful for displaying toolbars at the mouse right-click locations\n  /// in desktop devices.\n  @Deprecated(\n    'Use the `contextMenuBuilder` parameter in `showToolbar` instead. '\n    'This feature was deprecated after v3.3.0-0.5.pre.',\n  )\n  Offset? get toolbarLocation => _toolbarLocation;\n  Offset? _toolbarLocation;\n  set toolbarLocation(Offset? value) {\n    if (_toolbarLocation == value) {\n      return;\n    }\n    _toolbarLocation = value;\n    markNeedsBuild();\n  }\n\n  /// Controls the fade-in and fade-out animations for the toolbar and handles.\n  static const Duration fadeDuration = Duration(milliseconds: 150);\n\n  /// A pair of handles. If this is non-null, there are always 2, though the\n  /// second is hidden when the selection is collapsed.\n  ({OverlayEntry start, OverlayEntry end})? _handles;\n\n  /// A copy/paste toolbar.\n  OverlayEntry? _toolbar;\n\n  // Manages the context menu. Not necessarily visible when non-null.\n  final ContextMenuController _contextMenuController = ContextMenuController();\n\n  final ContextMenuController _spellCheckToolbarController =\n      ContextMenuController();\n\n  /// {@template flutter.widgets.SelectionOverlay.showHandles}\n  /// Builds the handles by inserting them into the [context]'s overlay.\n  /// {@endtemplate}\n  void showHandles() {\n    if (_handles != null) {\n      return;\n    }\n\n    final OverlayState overlay = Overlay.of(\n      context,\n      rootOverlay: true,\n      debugRequiredFor: debugRequiredFor,\n    );\n\n    final CapturedThemes capturedThemes = InheritedTheme.capture(\n      from: context,\n      to: overlay.context,\n    );\n\n    _handles = (\n      start: OverlayEntry(\n        builder: (BuildContext context) {\n          return capturedThemes.wrap(_buildStartHandle(context));\n        },\n      ),\n      end: OverlayEntry(\n        builder: (BuildContext context) {\n          return capturedThemes.wrap(_buildEndHandle(context));\n        },\n      ),\n    );\n    overlay.insertAll(<OverlayEntry>[_handles!.start, _handles!.end]);\n  }\n\n  /// {@template flutter.widgets.SelectionOverlay.hideHandles}\n  /// Destroys the handles by removing them from overlay.\n  /// {@endtemplate}\n  void hideHandles() {\n    if (_handles != null) {\n      _handles!.start.remove();\n      _handles!.start.dispose();\n      _handles!.end.remove();\n      _handles!.end.dispose();\n      _handles = null;\n    }\n  }\n\n  /// {@template flutter.widgets.SelectionOverlay.showToolbar}\n  /// Shows the toolbar by inserting it into the [context]'s overlay.\n  /// {@endtemplate}\n  void showToolbar({BuildContext? context, WidgetBuilder? contextMenuBuilder}) {\n    if (contextMenuBuilder == null) {\n      if (_toolbar != null) {\n        return;\n      }\n      _toolbar = OverlayEntry(builder: _buildToolbar);\n      Overlay.of(\n        this.context,\n        rootOverlay: true,\n        debugRequiredFor: debugRequiredFor,\n      ).insert(_toolbar!);\n      return;\n    }\n\n    if (context == null) {\n      return;\n    }\n\n    final RenderBox renderBox = context.findRenderObject()! as RenderBox;\n    _contextMenuController.show(\n      context: context,\n      contextMenuBuilder: (BuildContext context) {\n        return _SelectionToolbarWrapper(\n          visibility: toolbarVisible,\n          layerLink: toolbarLayerLink,\n          offset: -renderBox.localToGlobal(Offset.zero),\n          child: contextMenuBuilder(context),\n        );\n      },\n    );\n  }\n\n  /// Shows toolbar with spell check suggestions of misspelled words that are\n  /// available for click-and-replace.\n  void showSpellCheckSuggestionsToolbar({\n    BuildContext? context,\n    required WidgetBuilder builder,\n  }) {\n    if (context == null) {\n      return;\n    }\n\n    final RenderBox renderBox = context.findRenderObject()! as RenderBox;\n    _spellCheckToolbarController.show(\n      context: context,\n      contextMenuBuilder: (BuildContext context) {\n        return _SelectionToolbarWrapper(\n          layerLink: toolbarLayerLink,\n          offset: -renderBox.localToGlobal(Offset.zero),\n          child: builder(context),\n        );\n      },\n    );\n  }\n\n  bool _buildScheduled = false;\n\n  /// Rebuilds the selection toolbar or handles if they are present.\n  void markNeedsBuild() {\n    if (_handles == null && _toolbar == null) {\n      return;\n    }\n    // If we are in build state, it will be too late to update visibility.\n    // We will need to schedule the build in next frame.\n    if (SchedulerBinding.instance.schedulerPhase ==\n        SchedulerPhase.persistentCallbacks) {\n      if (_buildScheduled) {\n        return;\n      }\n      _buildScheduled = true;\n      SchedulerBinding.instance.addPostFrameCallback((Duration duration) {\n        _buildScheduled = false;\n        _handles?.start.markNeedsBuild();\n        _handles?.end.markNeedsBuild();\n        _toolbar?.markNeedsBuild();\n        if (_contextMenuController.isShown) {\n          _contextMenuController.markNeedsBuild();\n        } else if (_spellCheckToolbarController.isShown) {\n          _spellCheckToolbarController.markNeedsBuild();\n        }\n      }, debugLabel: 'SelectionOverlay.markNeedsBuild');\n    } else {\n      if (_handles != null) {\n        _handles!.start.markNeedsBuild();\n        _handles!.end.markNeedsBuild();\n      }\n      _toolbar?.markNeedsBuild();\n      if (_contextMenuController.isShown) {\n        _contextMenuController.markNeedsBuild();\n      } else if (_spellCheckToolbarController.isShown) {\n        _spellCheckToolbarController.markNeedsBuild();\n      }\n    }\n  }\n\n  /// {@template flutter.widgets.SelectionOverlay.hide}\n  /// Hides the entire overlay including the toolbar and the handles.\n  /// {@endtemplate}\n  void hide() {\n    _magnifierController.hide();\n    hideHandles();\n    if (_toolbar != null ||\n        _contextMenuController.isShown ||\n        _spellCheckToolbarController.isShown) {\n      hideToolbar();\n    }\n  }\n\n  /// {@template flutter.widgets.SelectionOverlay.hideToolbar}\n  /// Hides the toolbar part of the overlay.\n  ///\n  /// To hide the whole overlay, see [hide].\n  /// {@endtemplate}\n  void hideToolbar() {\n    _contextMenuController.remove();\n    _spellCheckToolbarController.remove();\n    if (_toolbar == null) {\n      return;\n    }\n    _toolbar?.remove();\n    _toolbar?.dispose();\n    _toolbar = null;\n  }\n\n  /// {@template flutter.widgets.SelectionOverlay.dispose}\n  /// Disposes this object and release resources.\n  /// {@endtemplate}\n  void dispose() {\n    assert(debugMaybeDispatchDisposed(this));\n    hide();\n    _magnifierInfo.dispose();\n  }\n\n  Widget _buildStartHandle(BuildContext context) {\n    final Widget handle;\n    final TextSelectionControls? selectionControls = this.selectionControls;\n    if (selectionControls == null ||\n        (_startHandleType == TextSelectionHandleType.collapsed &&\n            _isDraggingEndHandle)) {\n      // Hide the start handle when dragging the end handle and collapsing\n      // the selection.\n      handle = const SizedBox.shrink();\n    } else {\n      handle = _SelectionHandleOverlay(\n        type: _startHandleType,\n        handleLayerLink: startHandleLayerLink,\n        onSelectionHandleTapped: onSelectionHandleTapped,\n        onSelectionHandleDragStart: _handleStartHandleDragStart,\n        onSelectionHandleDragUpdate: _handleStartHandleDragUpdate,\n        onSelectionHandleDragEnd: _handleStartHandleDragEnd,\n        selectionControls: selectionControls,\n        visibility: startHandlesVisible,\n        preferredLineHeight: _lineHeightAtStart,\n        dragStartBehavior: dragStartBehavior,\n      );\n    }\n    return TextFieldTapRegion(child: ExcludeSemantics(child: handle));\n  }\n\n  Widget _buildEndHandle(BuildContext context) {\n    final Widget handle;\n    final TextSelectionControls? selectionControls = this.selectionControls;\n    if (selectionControls == null ||\n        (_endHandleType == TextSelectionHandleType.collapsed &&\n            _isDraggingStartHandle) ||\n        (_endHandleType == TextSelectionHandleType.collapsed &&\n            !_isDraggingStartHandle &&\n            !_isDraggingEndHandle)) {\n      // Hide the end handle when dragging the start handle and collapsing the selection\n      // or when the selection is collapsed and no handle is being dragged.\n      handle = const SizedBox.shrink();\n    } else {\n      handle = _SelectionHandleOverlay(\n        type: _endHandleType,\n        handleLayerLink: endHandleLayerLink,\n        onSelectionHandleTapped: onSelectionHandleTapped,\n        onSelectionHandleDragStart: _handleEndHandleDragStart,\n        onSelectionHandleDragUpdate: _handleEndHandleDragUpdate,\n        onSelectionHandleDragEnd: _handleEndHandleDragEnd,\n        selectionControls: selectionControls,\n        visibility: endHandlesVisible,\n        preferredLineHeight: _lineHeightAtEnd,\n        dragStartBehavior: dragStartBehavior,\n      );\n    }\n    return TextFieldTapRegion(child: ExcludeSemantics(child: handle));\n  }\n\n  // Build the toolbar via TextSelectionControls.\n  Widget _buildToolbar(BuildContext context) {\n    if (selectionControls == null) {\n      return const SizedBox.shrink();\n    }\n    assert(\n      selectionDelegate != null,\n      'If not using contextMenuBuilder, must pass selectionDelegate.',\n    );\n\n    final RenderBox renderBox = this.context.findRenderObject()! as RenderBox;\n\n    final Rect editingRegion = Rect.fromPoints(\n      renderBox.localToGlobal(Offset.zero),\n      renderBox.localToGlobal(renderBox.size.bottomRight(Offset.zero)),\n    );\n\n    final bool isMultiline =\n        selectionEndpoints.last.point.dy - selectionEndpoints.first.point.dy >\n        lineHeightAtEnd / 2;\n\n    // If the selected text spans more than 1 line, horizontally center the toolbar.\n    // Derived from both iOS and Android.\n    final double midX = isMultiline\n        ? editingRegion.width / 2\n        : (selectionEndpoints.first.point.dx +\n                  selectionEndpoints.last.point.dx) /\n              2;\n\n    final Offset midpoint = Offset(\n      midX,\n      // The y-coordinate won't be made use of most likely.\n      selectionEndpoints.first.point.dy - lineHeightAtStart,\n    );\n\n    return _SelectionToolbarWrapper(\n      visibility: toolbarVisible,\n      layerLink: toolbarLayerLink,\n      offset: -editingRegion.topLeft,\n      child: Builder(\n        builder: (BuildContext context) {\n          return selectionControls!.buildToolbar(\n            context,\n            editingRegion,\n            lineHeightAtStart,\n            midpoint,\n            selectionEndpoints,\n            selectionDelegate!,\n            clipboardStatus,\n            toolbarLocation,\n          );\n        },\n      ),\n    );\n  }\n\n  /// {@template flutter.widgets.SelectionOverlay.updateMagnifier}\n  /// Update the current magnifier with new selection data, so the magnifier\n  /// can respond accordingly.\n  ///\n  /// If the magnifier is not shown, this still updates the magnifier position\n  /// because the magnifier may have hidden itself and is looking for a cue to reshow\n  /// itself.\n  ///\n  /// If there is no magnifier in the overlay, this does nothing.\n  /// {@endtemplate}\n  void updateMagnifier(MagnifierInfo magnifierInfo) {\n    if (_magnifierController.overlayEntry == null) {\n      return;\n    }\n\n    _magnifierInfo.value = magnifierInfo;\n  }\n}\n\n// TODO(justinmc): Currently this fades in but not out on all platforms. It\n// should follow the correct fading behavior for the current platform, then be\n// made public and de-duplicated with widgets/selectable_region.dart.\n// https://github.com/flutter/flutter/issues/107732\n// Wrap the given child in the widgets common to both contextMenuBuilder and\n// TextSelectionControls.buildToolbar.\nclass _SelectionToolbarWrapper extends StatefulWidget {\n  const _SelectionToolbarWrapper({\n    this.visibility,\n    required this.layerLink,\n    required this.offset,\n    required this.child,\n  });\n\n  final Widget child;\n  final Offset offset;\n  final LayerLink layerLink;\n  final ValueListenable<bool>? visibility;\n\n  @override\n  State<_SelectionToolbarWrapper> createState() =>\n      _SelectionToolbarWrapperState();\n}\n\nclass _SelectionToolbarWrapperState extends State<_SelectionToolbarWrapper>\n    with SingleTickerProviderStateMixin {\n  late AnimationController _controller;\n  Animation<double> get _opacity => _controller.view;\n\n  @override\n  void initState() {\n    super.initState();\n\n    _controller = AnimationController(\n      duration: SelectionOverlay.fadeDuration,\n      vsync: this,\n    );\n\n    _toolbarVisibilityChanged();\n    widget.visibility?.addListener(_toolbarVisibilityChanged);\n  }\n\n  @override\n  void didUpdateWidget(_SelectionToolbarWrapper oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (oldWidget.visibility == widget.visibility) {\n      return;\n    }\n    oldWidget.visibility?.removeListener(_toolbarVisibilityChanged);\n    _toolbarVisibilityChanged();\n    widget.visibility?.addListener(_toolbarVisibilityChanged);\n  }\n\n  @override\n  void dispose() {\n    widget.visibility?.removeListener(_toolbarVisibilityChanged);\n    _controller.dispose();\n    super.dispose();\n  }\n\n  void _toolbarVisibilityChanged() {\n    if (widget.visibility?.value ?? true) {\n      _controller.forward();\n    } else {\n      _controller.reverse();\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return TextFieldTapRegion(\n      child: Directionality(\n        textDirection: Directionality.of(this.context),\n        child: FadeTransition(\n          opacity: _opacity,\n          child: CompositedTransformFollower(\n            link: widget.layerLink,\n            showWhenUnlinked: false,\n            offset: widget.offset,\n            child: widget.child,\n          ),\n        ),\n      ),\n    );\n  }\n}\n\n/// This widget represents a single draggable selection handle.\nclass _SelectionHandleOverlay extends StatefulWidget {\n  /// Create selection overlay.\n  const _SelectionHandleOverlay({\n    required this.type,\n    required this.handleLayerLink,\n    this.onSelectionHandleTapped,\n    this.onSelectionHandleDragStart,\n    this.onSelectionHandleDragUpdate,\n    this.onSelectionHandleDragEnd,\n    required this.selectionControls,\n    this.visibility,\n    required this.preferredLineHeight,\n    this.dragStartBehavior = DragStartBehavior.start,\n  });\n\n  final LayerLink handleLayerLink;\n  final VoidCallback? onSelectionHandleTapped;\n  final ValueChanged<DragStartDetails>? onSelectionHandleDragStart;\n  final ValueChanged<DragUpdateDetails>? onSelectionHandleDragUpdate;\n  final ValueChanged<DragEndDetails>? onSelectionHandleDragEnd;\n  final TextSelectionControls selectionControls;\n  final ValueListenable<bool>? visibility;\n  final double preferredLineHeight;\n  final TextSelectionHandleType type;\n  final DragStartBehavior dragStartBehavior;\n\n  @override\n  State<_SelectionHandleOverlay> createState() =>\n      _SelectionHandleOverlayState();\n}\n\nclass _SelectionHandleOverlayState extends State<_SelectionHandleOverlay>\n    with SingleTickerProviderStateMixin {\n  late AnimationController _controller;\n  Animation<double> get _opacity => _controller.view;\n\n  @override\n  void initState() {\n    super.initState();\n\n    _controller = AnimationController(\n      duration: SelectionOverlay.fadeDuration,\n      vsync: this,\n    );\n\n    _handleVisibilityChanged();\n    widget.visibility?.addListener(_handleVisibilityChanged);\n  }\n\n  void _handleVisibilityChanged() {\n    if (widget.visibility?.value ?? true) {\n      _controller.forward();\n    } else {\n      _controller.reverse();\n    }\n  }\n\n  /// Returns the bounding [Rect] of the text selection handle in local\n  /// coordinates.\n  ///\n  /// When interacting with a text selection handle through a touch event, the\n  /// interactive area should be at least [kMinInteractiveDimension] square,\n  /// which this method does not consider.\n  Rect _getHandleRect(\n    TextSelectionHandleType type,\n    double preferredLineHeight,\n  ) {\n    final Size handleSize = widget.selectionControls.getHandleSize(\n      preferredLineHeight,\n    );\n    return Rect.fromLTRB(0.0, 0.0, handleSize.width, handleSize.height);\n  }\n\n  @override\n  void didUpdateWidget(_SelectionHandleOverlay oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    oldWidget.visibility?.removeListener(_handleVisibilityChanged);\n    _handleVisibilityChanged();\n    widget.visibility?.addListener(_handleVisibilityChanged);\n  }\n\n  @override\n  void dispose() {\n    widget.visibility?.removeListener(_handleVisibilityChanged);\n    _controller.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final Rect handleRect = _getHandleRect(\n      widget.type,\n      widget.preferredLineHeight,\n    );\n\n    // Make sure the GestureDetector is big enough to be easily interactive.\n    final Rect interactiveRect = handleRect.expandToInclude(\n      Rect.fromCircle(\n        center: handleRect.center,\n        radius: kMinInteractiveDimension / 2,\n      ),\n    );\n    final RelativeRect padding = RelativeRect.fromLTRB(\n      math.max((interactiveRect.width - handleRect.width) / 2, 0),\n      math.max((interactiveRect.height - handleRect.height) / 2, 0),\n      math.max((interactiveRect.width - handleRect.width) / 2, 0),\n      math.max((interactiveRect.height - handleRect.height) / 2, 0),\n    );\n\n    final Offset handleAnchor = widget.selectionControls.getHandleAnchor(\n      widget.type,\n      widget.preferredLineHeight,\n    );\n\n    // Make sure a drag is eagerly accepted. This is used on iOS to match the\n    // behavior where a drag directly on a collapse handle will always win against\n    // other drag gestures.\n    final bool eagerlyAcceptDragWhenCollapsed =\n        widget.type == TextSelectionHandleType.collapsed &&\n        defaultTargetPlatform == TargetPlatform.iOS;\n\n    return CompositedTransformFollower(\n      link: widget.handleLayerLink,\n      // Put the handle's anchor point on the leader's anchor point.\n      offset: -handleAnchor - Offset(padding.left, padding.top),\n      showWhenUnlinked: false,\n      child: FadeTransition(\n        opacity: _opacity,\n        child: SizedBox(\n          width: interactiveRect.width,\n          height: interactiveRect.height,\n          child: Align(\n            alignment: Alignment.topLeft,\n            child: RawGestureDetector(\n              behavior: HitTestBehavior.translucent,\n              gestures: <Type, GestureRecognizerFactory>{\n                PanGestureRecognizer:\n                    GestureRecognizerFactoryWithHandlers<PanGestureRecognizer>(\n                      () => PanGestureRecognizer(\n                        debugOwner: this,\n                        // Mouse events select the text and do not drag the cursor.\n                        supportedDevices: <PointerDeviceKind>{\n                          PointerDeviceKind.touch,\n                          PointerDeviceKind.stylus,\n                          PointerDeviceKind.unknown,\n                        },\n                      ),\n                      (PanGestureRecognizer instance) {\n                        instance\n                          ..dragStartBehavior = widget.dragStartBehavior\n                          ..gestureSettings = eagerlyAcceptDragWhenCollapsed\n                              ? const DeviceGestureSettings(touchSlop: 1.0)\n                              : null\n                          ..onStart = widget.onSelectionHandleDragStart\n                          ..onUpdate = widget.onSelectionHandleDragUpdate\n                          ..onEnd = widget.onSelectionHandleDragEnd;\n                      },\n                    ),\n              },\n              child: Padding(\n                padding: EdgeInsets.only(\n                  left: padding.left,\n                  top: padding.top,\n                  right: padding.right,\n                  bottom: padding.bottom,\n                ),\n                child: widget.selectionControls.buildHandle(\n                  context,\n                  widget.type,\n                  widget.preferredLineHeight,\n                  widget.onSelectionHandleTapped,\n                ),\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/flutter/vertical_tabs.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'dart:math' as math;\nimport 'dart:ui' show SemanticsRole, lerpDouble;\n\nimport 'package:PiliPlus/pages/main/controller.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/gestures.dart' show DragStartBehavior;\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart';\nimport 'package:get/get_core/src/get_main.dart';\nimport 'package:get/get_instance/src/extension_instance.dart';\n\nconst double _kTabWidth = 51.0;\nconst double _kTextAndIconTabWidth = 72.0;\nconst EdgeInsets _kTabLabelPadding = EdgeInsets.symmetric(\n  vertical: 7.0,\n  horizontal: 5.0,\n);\n\n/// A Material Design [VerticalTabBar] tab.\n///\n/// If both [icon] and [text] are provided, the text is displayed below\n/// the icon.\n///\n/// See also:\n///\n///  * [VerticalTabBar], which displays a row of tabs.\n///  * [TabBarView], which displays a widget for the currently selected tab.\n///  * [TabController], which coordinates tab selection between a [VerticalTabBar] and a [TabBarView].\n///  * <https://material.io/design/components/tabs.html>\nclass VerticalTab extends StatelessWidget {\n  /// Creates a Material Design [VerticalTabBar] tab.\n  ///\n  /// At least one of [text], [icon], and [child] must be non-null. The [text]\n  /// and [child] arguments must not be used at the same time. The\n  /// [iconMargin] is only useful when [icon] and either one of [text] or\n  /// [child] is non-null.\n  const VerticalTab({\n    super.key,\n    this.text,\n    this.icon,\n    this.iconMargin,\n    this.width,\n    this.child,\n  }) : assert(text != null || child != null || icon != null),\n       assert(text == null || child == null);\n\n  /// The text to display as the tab's label.\n  ///\n  /// Must not be used in combination with [child].\n  final String? text;\n\n  /// The widget to be used as the tab's label.\n  ///\n  /// Usually a [Text] widget, possibly wrapped in a [Semantics] widget.\n  ///\n  /// Must not be used in combination with [text].\n  final Widget? child;\n\n  /// An icon to display as the tab's label.\n  final Widget? icon;\n\n  /// The margin added around the tab's icon.\n  ///\n  /// Only useful when used in combination with [icon], and either one of\n  /// [text] or [child] is non-null.\n  ///\n  /// Defaults to 2 pixels of bottom margin. If [ThemeData.useMaterial3] is false,\n  /// then defaults to 10 pixels of bottom margin.\n  final EdgeInsetsGeometry? iconMargin;\n\n  /// The height of the [VerticalTab].\n  ///\n  /// If null, the height will be calculated based on the content of the [VerticalTab]. When `icon` is not\n  /// null along with `child` or `text`, the default height is 72.0 pixels. Without an `icon`, the\n  /// height is 46.0 pixels.\n  ///\n  /// {@tool snippet}\n  ///\n  /// The provided tab height cannot be lower than the default height. Use\n  /// [PreferredSize] widget to adjust the overall [VerticalTabBar] height and match\n  /// the provided tab [height]:\n  ///\n  /// ```dart\n  /// bottom: const PreferredSize(\n  ///   preferredSize: Size.fromHeight(20.0),\n  ///   child: TabBar(\n  ///     tabs: <Widget>[\n  ///       Tab(\n  ///         text: 'Tab 1',\n  ///         height: 20.0,\n  ///       ),\n  ///       Tab(\n  ///         text: 'Tab 2',\n  ///         height: 20.0,\n  ///       ),\n  ///     ],\n  ///   ),\n  /// ),\n  /// ```\n  /// {@end-tool}\n  final double? width;\n\n  Widget _buildLabelText() {\n    return child ?? Text(text!, style: const TextStyle(fontSize: 15));\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    assert(debugCheckHasMaterial(context));\n\n    final double calculatedWidth;\n    final Widget label;\n    if (icon == null) {\n      calculatedWidth = _kTabWidth;\n      label = _buildLabelText();\n    } else if (text == null && child == null) {\n      calculatedWidth = _kTabWidth;\n      label = icon!;\n    } else {\n      calculatedWidth = _kTextAndIconTabWidth;\n      final EdgeInsetsGeometry effectiveIconMargin =\n          iconMargin ??\n          (Theme.of(context).useMaterial3\n              ? _TabsPrimaryDefaultsM3.iconMargin\n              : _TabsDefaultsM2.iconMargin);\n      // dom\n      label = Row(\n        mainAxisAlignment: MainAxisAlignment.center,\n        children: <Widget>[\n          Padding(padding: effectiveIconMargin, child: icon),\n          Flexible(child: _buildLabelText()),\n        ],\n      );\n    }\n\n    return SizedBox(\n      width: width ?? calculatedWidth, // dom\n      child: Center(heightFactor: 1.0, child: label),\n    );\n  }\n\n  @override\n  void debugFillProperties(DiagnosticPropertiesBuilder properties) {\n    super.debugFillProperties(properties);\n    properties.add(StringProperty('text', text, defaultValue: null));\n  }\n}\n\nclass _TabStyle extends AnimatedWidget {\n  const _TabStyle({\n    required Animation<double> animation,\n    required this.isSelected,\n    required this.isPrimary,\n    required this.labelColor,\n    required this.unselectedLabelColor,\n    required this.labelStyle,\n    required this.unselectedLabelStyle,\n    required this.defaults,\n    required this.child,\n  }) : super(listenable: animation);\n\n  final TextStyle? labelStyle;\n  final TextStyle? unselectedLabelStyle;\n  final bool isSelected;\n  final bool isPrimary;\n  final Color? labelColor;\n  final Color? unselectedLabelColor;\n  final TabBarThemeData defaults;\n  final Widget child;\n\n  WidgetStateColor _resolveWithLabelColor(\n    BuildContext context, {\n    IconThemeData? iconTheme,\n  }) {\n    final ThemeData themeData = Theme.of(context);\n    final TabBarThemeData tabBarTheme = TabBarTheme.of(context);\n    final Animation<double> animation = listenable as Animation<double>;\n\n    // labelStyle.color (and tabBarTheme.labelStyle.color) is not considered\n    // as it'll be a breaking change without a possible migration plan. for\n    // details: https://github.com/flutter/flutter/pull/109541#issuecomment-1294241417\n    Color selectedColor =\n        labelColor ??\n        tabBarTheme.labelColor ??\n        labelStyle?.color ??\n        tabBarTheme.labelStyle?.color ??\n        defaults.labelColor!;\n\n    final Color unselectedColor;\n\n    if (selectedColor is WidgetStateColor) {\n      unselectedColor = selectedColor.resolve(const <WidgetState>{});\n      selectedColor = selectedColor.resolve(const <WidgetState>{\n        WidgetState.selected,\n      });\n    } else {\n      // unselectedLabelColor and tabBarTheme.unselectedLabelColor are ignored\n      // when labelColor is a WidgetStateColor.\n      unselectedColor =\n          unselectedLabelColor ??\n          tabBarTheme.unselectedLabelColor ??\n          unselectedLabelStyle?.color ??\n          tabBarTheme.unselectedLabelStyle?.color ??\n          iconTheme?.color ??\n          (themeData.useMaterial3\n              ? defaults.unselectedLabelColor!\n              : selectedColor.withAlpha(0xB2)); // 70% alpha\n    }\n\n    return WidgetStateColor.resolveWith((Set<WidgetState> states) {\n      if (states.contains(WidgetState.selected)) {\n        return Color.lerp(selectedColor, unselectedColor, animation.value)!;\n      }\n      return Color.lerp(unselectedColor, selectedColor, animation.value)!;\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final ThemeData theme = Theme.of(context);\n    final TabBarThemeData tabBarTheme = TabBarTheme.of(context);\n    final Animation<double> animation = listenable as Animation<double>;\n\n    final Set<WidgetState> states = isSelected\n        ? const <WidgetState>{WidgetState.selected}\n        : const <WidgetState>{};\n\n    // To enable TextStyle.lerp(style1, style2, value), both styles must have\n    // the same value of inherit. Force that to be inherit=true here.\n    final TextStyle selectedStyle = defaults.labelStyle!\n        .merge(labelStyle ?? tabBarTheme.labelStyle)\n        .copyWith(inherit: true);\n    final TextStyle unselectedStyle = defaults.unselectedLabelStyle!\n        .merge(\n          unselectedLabelStyle ??\n              tabBarTheme.unselectedLabelStyle ??\n              labelStyle,\n        )\n        .copyWith(inherit: true);\n    final TextStyle textStyle = isSelected\n        ? TextStyle.lerp(selectedStyle, unselectedStyle, animation.value)!\n        : TextStyle.lerp(unselectedStyle, selectedStyle, animation.value)!;\n    final Color defaultIconColor = switch (theme.colorScheme.brightness) {\n      Brightness.light => kDefaultIconDarkColor,\n      Brightness.dark => kDefaultIconLightColor,\n    };\n    final IconThemeData? customIconTheme = switch (IconTheme.of(context)) {\n      final IconThemeData iconTheme when iconTheme.color != defaultIconColor =>\n        iconTheme,\n      _ => null,\n    };\n    final Color iconColor = _resolveWithLabelColor(\n      context,\n      iconTheme: customIconTheme,\n    ).resolve(states);\n    final Color labelColor = _resolveWithLabelColor(context).resolve(states);\n\n    return DefaultTextStyle(\n      style: textStyle.copyWith(color: labelColor),\n      child: IconTheme.merge(\n        data: IconThemeData(\n          size: customIconTheme?.size ?? 24.0,\n          color: iconColor,\n        ),\n        child: child,\n      ),\n    );\n  }\n}\n\ntypedef _LayoutCallback =\n    void Function(\n      List<double> yOffsets,\n      TextDirection textDirection,\n      double width,\n    );\n\nclass _TabLabelBarRenderer extends RenderFlex {\n  _TabLabelBarRenderer({\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.onPerformLayout,\n  });\n\n  _LayoutCallback onPerformLayout;\n\n  @override\n  void performLayout() {\n    super.performLayout();\n    // yOffsets will contain childCount+1 values, giving the offsets of the\n    // leading edge of the first tab as the first value, of the leading edge of\n    // the each subsequent tab as each subsequent value, and of the trailing\n    // edge of the last tab as the last value.\n    RenderBox? child = firstChild;\n    final List<double> yOffsets = <double>[];\n    while (child != null) {\n      final FlexParentData childParentData =\n          child.parentData! as FlexParentData;\n      yOffsets.add(childParentData.offset.dy); // dom\n      assert(child.parentData == childParentData);\n      child = childParentData.nextSibling;\n    }\n    yOffsets.add(size.height);\n    onPerformLayout(yOffsets, .ltr, size.height);\n  }\n}\n\n// This class and its renderer class only exist to report the widths of the tabs\n// upon layout. The tab widths are only used at paint time (see _IndicatorPainter)\n// or in response to input.\nclass _TabLabelBar extends Flex {\n  const _TabLabelBar({\n    super.children,\n    required this.onPerformLayout,\n    required super.mainAxisSize,\n  }) : super(\n         direction: Axis.vertical, // dom\n         mainAxisAlignment: MainAxisAlignment.start,\n         crossAxisAlignment: CrossAxisAlignment.start, // dom\n         verticalDirection: VerticalDirection.down,\n       );\n\n  final _LayoutCallback onPerformLayout;\n\n  @override\n  RenderFlex createRenderObject(BuildContext context) {\n    return _TabLabelBarRenderer(\n      direction: direction,\n      mainAxisAlignment: mainAxisAlignment,\n      mainAxisSize: mainAxisSize,\n      crossAxisAlignment: crossAxisAlignment,\n      textDirection: .ltr, // getEffectiveTextDirection(context)!,\n      verticalDirection: verticalDirection,\n      onPerformLayout: onPerformLayout,\n    );\n  }\n\n  @override\n  void updateRenderObject(\n    BuildContext context,\n    _TabLabelBarRenderer renderObject,\n  ) {\n    super.updateRenderObject(context, renderObject);\n    renderObject.onPerformLayout = onPerformLayout;\n  }\n}\n\ndouble _indexChangeProgress(TabController controller) {\n  final double controllerValue = controller.animation!.value;\n  final double previousIndex = controller.previousIndex.toDouble();\n  final double currentIndex = controller.index.toDouble();\n\n  // The controller's offset is changing because the user is dragging the\n  // TabBarView's PageView to the left or right.\n  if (!controller.indexIsChanging) {\n    return clampDouble((currentIndex - controllerValue).abs(), 0.0, 1.0);\n  }\n\n  // The TabController animation's value is changing from previousIndex to currentIndex.\n  return (controllerValue - currentIndex).abs() /\n      (currentIndex - previousIndex).abs();\n}\n\nclass _DividerPainter extends CustomPainter {\n  _DividerPainter({required this.dividerColor, required this.dividerWidth});\n\n  final Color dividerColor;\n  final double dividerWidth;\n\n  @override\n  void paint(Canvas canvas, Size size) {\n    if (dividerWidth <= 0.0) {\n      return;\n    }\n\n    final Paint paint = Paint()\n      ..color = dividerColor\n      ..strokeWidth = dividerWidth;\n\n    // dom\n    final dx = size.width - (paint.strokeWidth / 2);\n    canvas.drawLine(Offset(dx, 0), Offset(dx, size.height), paint);\n  }\n\n  @override\n  bool shouldRepaint(_DividerPainter oldDelegate) {\n    return oldDelegate.dividerColor != dividerColor ||\n        oldDelegate.dividerWidth != dividerWidth;\n  }\n}\n\nclass _IndicatorPainter extends CustomPainter {\n  _IndicatorPainter({\n    required this.controller,\n    required this.indicator,\n    required this.indicatorSize,\n    required this.tabKeys,\n    required _IndicatorPainter? old,\n    required this.indicatorPadding,\n    required this.labelPadding,\n    this.dividerColor,\n    this.dividerWidth,\n    required this.showDivider,\n    this.devicePixelRatio,\n    required this.indicatorAnimation,\n    required this.textDirection,\n  }) : super(repaint: controller.animation) {\n    assert(debugMaybeDispatchCreated('material', '_IndicatorPainter', this));\n    if (old != null) {\n      saveTabOffsets(old._currentTabOffsets, old._currentTextDirection);\n    }\n  }\n\n  final TabController controller;\n  final Decoration indicator;\n  final TabBarIndicatorSize indicatorSize;\n  final EdgeInsetsGeometry indicatorPadding;\n  final List<GlobalKey> tabKeys;\n  final EdgeInsetsGeometry labelPadding;\n  final Color? dividerColor;\n  final double? dividerWidth;\n  final bool showDivider;\n  final double? devicePixelRatio;\n  final TabIndicatorAnimation indicatorAnimation;\n  final TextDirection textDirection;\n\n  // _currentTabOffsets and _currentTextDirection are set each time TabBar\n  // layout is completed. These values can be null when TabBar contains no\n  // tabs, since there are nothing to lay out.\n  List<double>? _currentTabOffsets;\n  TextDirection? _currentTextDirection;\n\n  Rect? _currentRect;\n  BoxPainter? _painter;\n  bool _needsPaint = false;\n  void markNeedsPaint() {\n    _needsPaint = true;\n  }\n\n  void dispose() {\n    assert(debugMaybeDispatchDisposed(this));\n    _painter?.dispose();\n  }\n\n  void saveTabOffsets(List<double>? tabOffsets, TextDirection? textDirection) {\n    _currentTabOffsets = tabOffsets;\n    _currentTextDirection = textDirection;\n  }\n\n  // _currentTabOffsets[index] is the offset of the start edge of the tab at index, and\n  // _currentTabOffsets[_currentTabOffsets.length] is the end edge of the last tab.\n  int get maxTabIndex => _currentTabOffsets!.length - 2;\n\n  double centerOf(int tabIndex) {\n    assert(_currentTabOffsets != null);\n    assert(_currentTabOffsets!.isNotEmpty);\n    assert(tabIndex >= 0);\n    assert(tabIndex <= maxTabIndex);\n    return (_currentTabOffsets![tabIndex] + _currentTabOffsets![tabIndex + 1]) /\n        2.0;\n  }\n\n  Rect indicatorRect(Size tabBarSize, int tabIndex) {\n    assert(_currentTabOffsets != null);\n    assert(_currentTextDirection != null);\n    assert(_currentTabOffsets!.isNotEmpty);\n    assert(tabIndex >= 0);\n    assert(tabIndex <= maxTabIndex);\n    double tabLeft, tabRight;\n    (tabLeft, tabRight) = switch (_currentTextDirection!) {\n      TextDirection.rtl => (\n        _currentTabOffsets![tabIndex + 1],\n        _currentTabOffsets![tabIndex],\n      ),\n      TextDirection.ltr => (\n        _currentTabOffsets![tabIndex],\n        _currentTabOffsets![tabIndex + 1],\n      ),\n    };\n\n    if (indicatorSize == TabBarIndicatorSize.label) {\n      final double tabWidth =\n          tabKeys[tabIndex].currentContext!.size!.height; // dom\n      final EdgeInsets insets = labelPadding.resolve(_currentTextDirection);\n      final double delta =\n          ((tabRight - tabLeft) - (tabWidth + insets.vertical)) / 2.0; // dom\n      tabLeft += delta + insets.top; // dom\n      tabRight = tabLeft + tabWidth;\n    }\n\n    final EdgeInsets insets = indicatorPadding.resolve(_currentTextDirection);\n    // dom\n    final Rect rect = Rect.fromLTWH(\n      0,\n      tabLeft,\n      tabBarSize.width,\n      tabRight - tabLeft,\n    );\n\n    if (!(rect.size >= insets.collapsedSize)) {\n      throw FlutterError(\n        'indicatorPadding insets should be less than Tab Size\\n'\n        'Rect Size : ${rect.size}, Insets: $insets',\n      );\n    }\n    return insets.deflateRect(rect);\n  }\n\n  @override\n  void paint(Canvas canvas, Size size) {\n    _needsPaint = false;\n    _painter ??= indicator.createBoxPainter(markNeedsPaint);\n\n    final double value = controller.animation!.value;\n\n    _currentRect = switch (indicatorAnimation) {\n      TabIndicatorAnimation.linear => _applyLinearEffect(\n        size: size,\n        value: value,\n      ),\n      TabIndicatorAnimation.elastic => _applyElasticEffect(\n        size: size,\n        value: value,\n      ),\n    };\n\n    assert(_currentRect != null);\n\n    final ImageConfiguration configuration = ImageConfiguration(\n      size: _currentRect!.size,\n      textDirection: _currentTextDirection,\n      devicePixelRatio: devicePixelRatio,\n    );\n    if (showDivider && dividerWidth! > 0) {\n      final Paint dividerPaint = Paint()\n        ..color = dividerColor!\n        ..strokeWidth = dividerWidth!;\n      final dx = size.width - (dividerPaint.strokeWidth / 2);\n      final Offset dividerP1 = Offset(dx, 0);\n      final Offset dividerP2 = Offset(dx, size.height);\n      // dom\n      canvas.drawLine(dividerP1, dividerP2, dividerPaint);\n    }\n    _painter!.paint(canvas, _currentRect!.topLeft, configuration);\n  }\n\n  /// Applies the linear effect to the indicator.\n  Rect? _applyLinearEffect({required Size size, required double value}) {\n    final double index = controller.index.toDouble();\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    return Rect.lerp(fromRect, toRect, (value - from).abs());\n  }\n\n  // Ease out sine (decelerating).\n  double decelerateInterpolation(double fraction) {\n    return math.sin((fraction * math.pi) / 2.0);\n  }\n\n  // Ease in sine (accelerating).\n  double accelerateInterpolation(double fraction) {\n    return 1.0 - math.cos((fraction * math.pi) / 2.0);\n  }\n\n  /// Applies the elastic effect to the indicator.\n  // dom\n  Rect? _applyElasticEffect({required Size size, required double value}) {\n    final double index = controller.index.toDouble();\n    double progressLeft = (index - value).abs();\n\n    final int to = progressLeft == 0.0 || !controller.indexIsChanging\n        ? switch (textDirection) {\n            TextDirection.ltr => value.ceil(),\n            TextDirection.rtl => value.floor(),\n          }.clamp(0, maxTabIndex)\n        : controller.index;\n    final int from = progressLeft == 0.0 || !controller.indexIsChanging\n        ? switch (textDirection) {\n            TextDirection.ltr => (to - 1),\n            TextDirection.rtl => (to + 1),\n          }.clamp(0, maxTabIndex)\n        : controller.previousIndex;\n    final Rect toRect = indicatorRect(size, to);\n    final Rect fromRect = indicatorRect(size, from);\n    final Rect rect = Rect.lerp(fromRect, toRect, (value - from).abs())!;\n\n    // If the tab animation is completed, there is no need to stretch the indicator\n    // This only works for the tab change animation via tab index, not when\n    // dragging a [TabBarView], but it's still ok, to avoid unnecessary calculations.\n    if (controller.animation!.isCompleted) {\n      return rect;\n    }\n\n    final double tabChangeProgress;\n\n    if (controller.indexIsChanging) {\n      final int tabsDelta = (controller.index - controller.previousIndex).abs();\n      if (tabsDelta != 0) {\n        progressLeft /= tabsDelta;\n      }\n      tabChangeProgress = 1 - clampDouble(progressLeft, 0.0, 1.0);\n    } else {\n      tabChangeProgress = (index - value).abs();\n    }\n\n    // If the animation has finished, there is no need to apply the stretch effect.\n    if (tabChangeProgress == 1.0) {\n      return rect;\n    }\n\n    final double topFraction;\n    final double bottomFraction;\n    final bool isMovingRight = switch (textDirection) {\n      TextDirection.ltr =>\n        controller.indexIsChanging ? index > value : value > index,\n      TextDirection.rtl =>\n        controller.indexIsChanging ? value > index : index > value,\n    };\n    if (isMovingRight) {\n      topFraction = accelerateInterpolation(tabChangeProgress);\n      bottomFraction = decelerateInterpolation(tabChangeProgress);\n    } else {\n      topFraction = decelerateInterpolation(tabChangeProgress);\n      bottomFraction = accelerateInterpolation(tabChangeProgress);\n    }\n\n    final double lerpRectTop;\n    final double lerpRectBottom;\n\n    // The controller.indexIsChanging is true when the Tab is pressed, instead of swipe to change tabs.\n    // If the tab is pressed then only lerp between fromRect and toRect.\n    if (controller.indexIsChanging) {\n      lerpRectTop = lerpDouble(fromRect.top, toRect.top, topFraction)!;\n      lerpRectBottom = lerpDouble(\n        fromRect.bottom,\n        toRect.bottom,\n        bottomFraction,\n      )!;\n    } else {\n      // Switch the Rect left and right lerp order based on swipe direction.\n      lerpRectTop = switch (isMovingRight) {\n        true => lerpDouble(fromRect.top, toRect.top, topFraction)!,\n        false => lerpDouble(toRect.top, fromRect.top, topFraction)!,\n      };\n      lerpRectBottom = switch (isMovingRight) {\n        true => lerpDouble(fromRect.bottom, toRect.bottom, bottomFraction)!,\n        false => lerpDouble(toRect.bottom, fromRect.bottom, bottomFraction)!,\n      };\n    }\n\n    return Rect.fromLTRB(rect.left, lerpRectTop, rect.right, lerpRectBottom);\n  }\n\n  @override\n  bool shouldRepaint(_IndicatorPainter old) {\n    return _needsPaint ||\n        controller != old.controller ||\n        indicator != old.indicator ||\n        tabKeys.length != old.tabKeys.length ||\n        (!listEquals(_currentTabOffsets, old._currentTabOffsets)) ||\n        _currentTextDirection != old._currentTextDirection;\n  }\n}\n\nclass _ChangeAnimation extends Animation<double>\n    with AnimationWithParentMixin<double> {\n  _ChangeAnimation(this.controller);\n\n  final TabController controller;\n\n  @override\n  Animation<double> get parent => controller.animation!;\n\n  @override\n  void removeStatusListener(AnimationStatusListener listener) {\n    if (controller.animation != null) {\n      super.removeStatusListener(listener);\n    }\n  }\n\n  @override\n  void removeListener(VoidCallback listener) {\n    if (controller.animation != null) {\n      super.removeListener(listener);\n    }\n  }\n\n  @override\n  double get value => _indexChangeProgress(controller);\n}\n\nclass _DragAnimation extends Animation<double>\n    with AnimationWithParentMixin<double> {\n  _DragAnimation(this.controller, this.index);\n\n  final TabController controller;\n  final int index;\n\n  @override\n  Animation<double> get parent => controller.animation!;\n\n  @override\n  void removeStatusListener(AnimationStatusListener listener) {\n    if (controller.animation != null) {\n      super.removeStatusListener(listener);\n    }\n  }\n\n  @override\n  void removeListener(VoidCallback listener) {\n    if (controller.animation != null) {\n      super.removeListener(listener);\n    }\n  }\n\n  @override\n  double get value {\n    assert(!controller.indexIsChanging);\n    final double controllerMaxValue = (controller.length - 1).toDouble();\n    final double controllerValue = clampDouble(\n      controller.animation!.value,\n      0.0,\n      controllerMaxValue,\n    );\n    return clampDouble((controllerValue - index.toDouble()).abs(), 0.0, 1.0);\n  }\n}\n\n// This class, and TabBarScrollController, only exist to handle the case\n// where a scrollable TabBar has a non-zero initialIndex. In that case we can\n// only compute the scroll position's initial scroll offset (the \"correct\"\n// pixels value) after the TabBar viewport width and scroll limits are known.\nclass _TabBarScrollPosition extends ScrollPositionWithSingleContext {\n  _TabBarScrollPosition({\n    required super.physics,\n    required super.context,\n    required super.oldPosition,\n    required this.tabBar,\n  }) : super(initialPixels: null);\n\n  final _VerticalTabBarState tabBar;\n\n  bool _viewportDimensionWasNonZero = false;\n\n  // The scroll position should be adjusted at least once.\n  bool _needsPixelsCorrection = true;\n\n  @override\n  bool applyContentDimensions(double minScrollExtent, double maxScrollExtent) {\n    bool result = true;\n    if (!_viewportDimensionWasNonZero) {\n      _viewportDimensionWasNonZero = viewportDimension != 0.0;\n    }\n    // If the viewport never had a non-zero dimension, we just want to jump\n    // to the initial scroll position to avoid strange scrolling effects in\n    // release mode: the viewport temporarily may have a dimension of zero\n    // before the actual dimension is calculated. In that scenario, setting\n    // the actual dimension would cause a strange scroll effect without this\n    // guard because the super call below would start a ballistic scroll activity.\n    if (!_viewportDimensionWasNonZero || _needsPixelsCorrection) {\n      _needsPixelsCorrection = false;\n      correctPixels(\n        tabBar._initialScrollOffset(\n          viewportDimension,\n          minScrollExtent,\n          maxScrollExtent,\n        ),\n      );\n      result = false;\n    }\n    return super.applyContentDimensions(minScrollExtent, maxScrollExtent) &&\n        result;\n  }\n\n  void markNeedsPixelsCorrection() {\n    _needsPixelsCorrection = true;\n  }\n}\n\n// This class, and TabBarScrollPosition, only exist to handle the case\n// where a scrollable TabBar has a non-zero initialIndex.\nclass _TabBarScrollController extends ScrollController {\n  _TabBarScrollController(this.tabBar);\n\n  final _VerticalTabBarState tabBar;\n\n  @override\n  ScrollPosition createScrollPosition(\n    ScrollPhysics physics,\n    ScrollContext context,\n    ScrollPosition? oldPosition,\n  ) {\n    return _TabBarScrollPosition(\n      physics: physics,\n      context: context,\n      oldPosition: oldPosition,\n      tabBar: tabBar,\n    );\n  }\n}\n\n/// A Material Design primary tab bar.\n///\n/// Primary tabs are placed at the top of the content pane under a top app bar.\n/// They display the main content destinations.\n///\n/// Typically created as the [AppBar.bottom] part of an [AppBar] and in\n/// conjunction with a [TabBarView].\n///\n/// {@youtube 560 315 https://www.youtube.com/watch?v=POtoEH-5l40}\n///\n/// If a [TabController] is not provided, then a [DefaultTabController] ancestor\n/// must be provided instead. The tab controller's [TabController.length] must\n/// equal the length of the [tabs] list and the length of the\n/// [TabBarView.children] list.\n///\n/// Requires one of its ancestors to be a [Material] widget.\n///\n/// Uses values from [TabBarThemeData] if it is set in the current context.\n///\n/// {@tool dartpad}\n/// This sample shows the implementation of [VerticalTabBar] and [TabBarView] using a [DefaultTabController].\n/// Each [VerticalTab] corresponds to a child of the [TabBarView] in the order they are written.\n///\n/// ** See code in examples/api/lib/material/tabs/tab_bar.0.dart **\n/// {@end-tool}\n///\n/// {@tool dartpad}\n/// [VerticalTabBar] can also be implemented by using a [TabController] which provides more options\n/// to control the behavior of the [VerticalTabBar] and [TabBarView]. This can be used instead of\n/// a [DefaultTabController], demonstrated below.\n///\n/// ** See code in examples/api/lib/material/tabs/tab_bar.1.dart **\n/// {@end-tool}\n///\n/// {@tool dartpad}\n/// This sample showcases nested Material 3 [VerticalTabBar]s. It consists of a primary\n/// [VerticalTabBar] with nested a secondary [VerticalTabBar]. The primary [VerticalTabBar] uses a\n/// [DefaultTabController] while the secondary [VerticalTabBar] uses a [TabController].\n///\n/// ** See code in examples/api/lib/material/tabs/tab_bar.2.dart **\n/// {@end-tool}\n///\n/// See also:\n///\n///  * [TabBar.secondary], for a secondary tab bar.\n///  * [TabBarView], which displays page views that correspond to each tab.\n///  * [TabController], which coordinates tab selection between a [VerticalTabBar] and a [TabBarView].\n///  * https://m3.material.io/components/tabs/overview, the Material 3\n///     tab bar specification.\nclass VerticalTabBar extends StatefulWidget {\n  /// Creates a Material Design primary tab bar.\n  ///\n  /// The length of the [tabs] argument must match the [controller]'s\n  /// [TabController.length].\n  ///\n  /// If a [TabController] is not provided, then there must be a\n  /// [DefaultTabController] ancestor.\n  ///\n  /// The [indicatorWeight] parameter defaults to 2.\n  ///\n  /// The [indicatorPadding] parameter defaults to [EdgeInsets.zero].\n  ///\n  /// If [indicator] is not null or provided from [TabBarTheme],\n  /// then [indicatorWeight] and [indicatorColor] are ignored.\n  const VerticalTabBar({\n    super.key,\n    required this.tabs,\n    this.controller,\n    this.isScrollable = false,\n    this.padding,\n    this.indicatorColor,\n    this.automaticIndicatorColorAdjustment = true,\n    this.indicatorWeight = 2.0,\n    this.indicatorPadding = EdgeInsets.zero,\n    this.indicator,\n    this.indicatorSize,\n    this.dividerColor,\n    this.dividerWidth,\n    this.labelColor,\n    this.labelStyle,\n    this.labelPadding,\n    this.unselectedLabelColor,\n    this.unselectedLabelStyle,\n    this.dragStartBehavior = DragStartBehavior.start,\n    this.overlayColor,\n    this.mouseCursor,\n    this.enableFeedback,\n    this.onTap,\n    this.onHover,\n    this.onFocusChange,\n    this.physics,\n    this.splashFactory,\n    this.splashBorderRadius,\n    this.tabAlignment,\n    this.textScaler,\n    this.indicatorAnimation,\n  }) : _isPrimary = true,\n       assert(indicator != null || (indicatorWeight > 0.0));\n\n  /// Creates a Material Design secondary tab bar.\n  ///\n  /// Secondary tabs are used within a content area to further separate related\n  /// content and establish hierarchy.\n  ///\n  /// {@tool dartpad}\n  /// This sample showcases nested Material 3 [VerticalTabBar]s. It consists of a primary\n  /// [VerticalTabBar] with nested a secondary [VerticalTabBar]. The primary [VerticalTabBar] uses a\n  /// [DefaultTabController] while the secondary [VerticalTabBar] uses a [TabController].\n  ///\n  /// ** See code in examples/api/lib/material/tabs/tab_bar.2.dart **\n  /// {@end-tool}\n  ///\n  /// See also:\n  ///\n  ///  * [VerticalTabBar], for a primary tab bar.\n  ///  * [TabBarView], which displays page views that correspond to each tab.\n  ///  * [TabController], which coordinates tab selection between a [VerticalTabBar] and a [TabBarView].\n  ///  * https://m3.material.io/components/tabs/overview, the Material 3\n  ///     tab bar specification.\n  const VerticalTabBar.secondary({\n    super.key,\n    required this.tabs,\n    this.controller,\n    this.isScrollable = false,\n    this.padding,\n    this.indicatorColor,\n    this.automaticIndicatorColorAdjustment = true,\n    this.indicatorWeight = 2.0,\n    this.indicatorPadding = EdgeInsets.zero,\n    this.indicator,\n    this.indicatorSize,\n    this.dividerColor,\n    this.dividerWidth,\n    this.labelColor,\n    this.labelStyle,\n    this.labelPadding,\n    this.unselectedLabelColor,\n    this.unselectedLabelStyle,\n    this.dragStartBehavior = DragStartBehavior.start,\n    this.overlayColor,\n    this.mouseCursor,\n    this.enableFeedback,\n    this.onTap,\n    this.onHover,\n    this.onFocusChange,\n    this.physics,\n    this.splashFactory,\n    this.splashBorderRadius,\n    this.tabAlignment,\n    this.textScaler,\n    this.indicatorAnimation,\n  }) : _isPrimary = false,\n       assert(indicator != null || (indicatorWeight > 0.0));\n\n  /// Typically a list of two or more [VerticalTab] widgets.\n  ///\n  /// The length of this list must match the [controller]'s [TabController.length]\n  /// and the length of the [TabBarView.children] list.\n  final List<Widget> tabs;\n\n  /// This widget's selection and animation state.\n  ///\n  /// If [TabController] is not provided, then the value of [DefaultTabController.of]\n  /// will be used.\n  final TabController? controller;\n\n  /// Whether this tab bar can be scrolled horizontally.\n  ///\n  /// If [isScrollable] is true, then each tab is as wide as needed for its label\n  /// and the entire [VerticalTabBar] is scrollable. Otherwise each tab gets an equal\n  /// share of the available space.\n  final bool isScrollable;\n\n  /// The amount of space by which to inset the tab bar.\n  ///\n  /// When [isScrollable] is false, this will yield the same result as if [VerticalTabBar] was wrapped\n  /// in a [Padding] widget. When [isScrollable] is true, the scrollable itself is inset,\n  /// allowing the padding to scroll with the tab bar, rather than enclosing it.\n  final EdgeInsetsGeometry? padding;\n\n  /// The color of the line that appears below the selected tab.\n  ///\n  /// If this parameter is null, then the value of the Theme's indicatorColor\n  /// property is used.\n  ///\n  /// If [indicator] is specified or provided from [TabBarThemeData],\n  /// this property is ignored.\n  final Color? indicatorColor;\n\n  /// The thickness of the line that appears below the selected tab.\n  ///\n  /// The value of this parameter must be greater than zero.\n  ///\n  /// If [ThemeData.useMaterial3] is true and [VerticalTabBar] is used to create a\n  /// primary tab bar, the default value is 3.0. If the provided value is less\n  /// than 3.0, the default value is used.\n  ///\n  /// If [ThemeData.useMaterial3] is true and [TabBar.secondary] is used to\n  /// create a secondary tab bar, the default value is 2.0.\n  ///\n  /// If [ThemeData.useMaterial3] is false, the default value is 2.0.\n  ///\n  /// If [indicator] is specified or provided from [TabBarThemeData],\n  /// this property is ignored.\n  final double indicatorWeight;\n\n  /// The padding for the indicator.\n  ///\n  /// The default value of this property is [EdgeInsets.zero].\n  ///\n  /// For [isScrollable] tab bars, specifying [kTabLabelPadding] will align\n  /// the indicator with the tab's text for [VerticalTab] widgets and all but the\n  /// shortest [VerticalTab.text] values.\n  final EdgeInsetsGeometry indicatorPadding;\n\n  /// Defines the appearance of the selected tab indicator.\n  ///\n  /// If [indicator] is specified or provided from [TabBarThemeData],\n  /// the [indicatorColor] and [indicatorWeight] properties are ignored.\n  ///\n  /// The default, underline-style, selected tab indicator can be defined with\n  /// [UnderlineTabIndicator].\n  ///\n  /// The indicator's size is based on the tab's bounds. If [indicatorSize]\n  /// is [TabBarIndicatorSize.tab] the tab's bounds are as wide as the space\n  /// occupied by the tab in the tab bar. If [indicatorSize] is\n  /// [TabBarIndicatorSize.label], then the tab's bounds are only as wide as\n  /// the tab widget itself.\n  ///\n  /// See also:\n  ///\n  ///  * [splashBorderRadius], which defines the clipping radius of the splash\n  ///    and is generally used with [BoxDecoration.borderRadius].\n  final Decoration? indicator;\n\n  /// Whether this tab bar should automatically adjust the [indicatorColor].\n  ///\n  /// The default value of this property is true.\n  ///\n  /// If [automaticIndicatorColorAdjustment] is true,\n  /// then the [indicatorColor] will be automatically adjusted to [Colors.white]\n  /// when the [indicatorColor] is same as [Material.color] of the [Material]\n  /// parent widget.\n  final bool automaticIndicatorColorAdjustment;\n\n  /// Defines how the selected tab indicator's size is computed.\n  ///\n  /// The size of the selected tab indicator is defined relative to the\n  /// tab's overall bounds if [indicatorSize] is [TabBarIndicatorSize.tab]\n  /// (the default) or relative to the bounds of the tab's widget if\n  /// [indicatorSize] is [TabBarIndicatorSize.label].\n  ///\n  /// The selected tab's location appearance can be refined further with\n  /// the [indicatorColor], [indicatorWeight], [indicatorPadding], and\n  /// [indicator] properties.\n  final TabBarIndicatorSize? indicatorSize;\n\n  /// The color of the divider.\n  ///\n  /// If the [dividerColor] is [Colors.transparent], then the divider will not be drawn.\n  ///\n  /// If null and [ThemeData.useMaterial3] is false, [TabBarThemeData.dividerColor]\n  /// color is used. If that is null and [ThemeData.useMaterial3] is true,\n  /// [ColorScheme.outlineVariant] will be used, otherwise divider will not be drawn.\n  final Color? dividerColor;\n\n  /// The height of the divider.\n  ///\n  /// If the [dividerWidth] is zero or negative, then the divider will not be drawn.\n  ///\n  /// If null and [ThemeData.useMaterial3] is true, [TabBarThemeData.dividerHeight] is used.\n  /// If that is also null and [ThemeData.useMaterial3] is true, 1.0 will be used.\n  /// Otherwise divider will not be drawn.\n  final double? dividerWidth;\n\n  /// The color of selected tab labels.\n  ///\n  /// If null, then [TabBarThemeData.labelColor] is used. If that is also null and\n  /// [ThemeData.useMaterial3] is true, [ColorScheme.primary] will be used,\n  /// otherwise the color of the [ThemeData.primaryTextTheme]'s\n  /// [TextTheme.bodyLarge] text color is used.\n  ///\n  /// If [labelColor] (or, if null, [TabBarThemeData.labelColor]) is a\n  /// [WidgetStateColor], then the effective tab color will depend on the\n  /// [WidgetState.selected] state, i.e. if the [VerticalTab] is selected or not,\n  /// ignoring [unselectedLabelColor] even if it's non-null.\n  ///\n  /// When this color or the [TabBarThemeData.labelColor] is specified, it overrides\n  /// the [TextStyle.color] specified for the [labelStyle] or the\n  /// [TabBarThemeData.labelStyle].\n  ///\n  /// See also:\n  ///\n  ///   * [unselectedLabelColor], for color of unselected tab labels.\n  final Color? labelColor;\n\n  /// The color of unselected tab labels.\n  ///\n  /// If [labelColor] (or, if null, [TabBarThemeData.labelColor]) is a\n  /// [WidgetStateColor], then the unselected tabs are rendered with\n  /// that [WidgetStateColor]'s resolved color for unselected state, even if\n  /// [unselectedLabelColor] is non-null.\n  ///\n  /// If null, then [TabBarThemeData.unselectedLabelColor] is used. If that is also\n  /// null and [ThemeData.useMaterial3] is true, [ColorScheme.onSurfaceVariant]\n  /// will be used, otherwise unselected tab labels are rendered with\n  /// [labelColor] at 70% opacity.\n  ///\n  /// When this color or the [TabBarThemeData.unselectedLabelColor] is specified, it\n  /// overrides the [TextStyle.color] specified for the [unselectedLabelStyle]\n  /// or the [TabBarThemeData.unselectedLabelStyle].\n  ///\n  /// See also:\n  ///\n  ///  * [labelColor], for color of selected tab labels.\n  final Color? unselectedLabelColor;\n\n  /// The text style of the selected tab labels.\n  ///\n  /// The color specified in [labelStyle] and [TabBarThemeData.labelStyle] is used\n  /// to style the label when [labelColor] or [TabBarThemeData.labelColor] are not\n  /// specified.\n  ///\n  /// If [unselectedLabelStyle] is null, then this text style will be used for\n  /// both selected and unselected label styles.\n  ///\n  /// If this property is null, then [TabBarThemeData.labelStyle] will be used.\n  ///\n  /// If that is also null and [ThemeData.useMaterial3] is true, [TextTheme.titleSmall]\n  /// will be used, otherwise the text style of the [ThemeData.primaryTextTheme]'s\n  /// [TextTheme.bodyLarge] definition is used.\n  final TextStyle? labelStyle;\n\n  /// The text style of the unselected tab labels.\n  ///\n  /// The color specified in [unselectedLabelStyle] and [TabBarThemeData.unselectedLabelStyle]\n  /// is used to style the label when [unselectedLabelColor] or [TabBarThemeData.unselectedLabelColor]\n  /// are not specified.\n  ///\n  /// If this property is null, then [TabBarThemeData.unselectedLabelStyle] will be used.\n  ///\n  /// If that is also null and [ThemeData.useMaterial3] is true, [TextTheme.titleSmall]\n  /// will be used, otherwise then the [labelStyle] value is used. If [labelStyle] is null,\n  /// the text style of the [ThemeData.primaryTextTheme]'s [TextTheme.bodyLarge]\n  /// definition is used.\n  final TextStyle? unselectedLabelStyle;\n\n  /// The padding added to each of the tab labels.\n  ///\n  /// If there are few tabs with both icon and text and few\n  /// tabs with only icon or text, this padding is vertically\n  /// adjusted to provide uniform padding to all tabs.\n  ///\n  /// If this property is null, then [kTabLabelPadding] is used.\n  final EdgeInsetsGeometry? labelPadding;\n\n  /// Defines the ink response focus, hover, and splash colors.\n  ///\n  /// If non-null, it is resolved against one of [WidgetState.focused],\n  /// [WidgetState.hovered], and [WidgetState.pressed].\n  ///\n  /// [WidgetState.pressed] triggers a ripple (an ink splash), per\n  /// the current Material Design spec.\n  ///\n  /// If the overlay color is null or resolves to null, then if [ThemeData.useMaterial3] is\n  /// false, the default values for [InkResponse.focusColor], [InkResponse.hoverColor], [InkResponse.splashColor],\n  /// and [InkResponse.highlightColor] will be used instead. If [ThemeData.useMaterial3]\n  /// if true, the default values are:\n  /// * selected:\n  ///   * pressed - ThemeData.colorScheme.primary(0.1)\n  ///   * hovered - ThemeData.colorScheme.primary(0.08)\n  ///   * focused - ThemeData.colorScheme.primary(0.1)\n  /// * pressed - ThemeData.colorScheme.primary(0.1)\n  /// * hovered - ThemeData.colorScheme.onSurface(0.08)\n  /// * focused - ThemeData.colorScheme.onSurface(0.1)\n  final WidgetStateProperty<Color?>? overlayColor;\n\n  /// {@macro flutter.widgets.scrollable.dragStartBehavior}\n  final DragStartBehavior dragStartBehavior;\n\n  /// {@template flutter.material.tabs.mouseCursor}\n  /// The cursor for a mouse pointer when it enters or is hovering over the\n  /// individual tab widgets.\n  ///\n  /// If [mouseCursor] is a [WidgetStateMouseCursor],\n  /// [WidgetStateProperty.resolve] is used for the following [WidgetState]s:\n  ///\n  ///  * [WidgetState.selected].\n  /// {@endtemplate}\n  ///\n  /// If null, then the value of [TabBarThemeData.mouseCursor] is used. If\n  /// that is also null, then [WidgetStateMouseCursor.clickable] is used.\n  final MouseCursor? mouseCursor;\n\n  /// Whether detected gestures should provide acoustic and/or haptic feedback.\n  ///\n  /// For example, on Android a tap will produce a clicking sound and a long-press\n  /// will produce a short vibration, when feedback is enabled.\n  ///\n  /// Defaults to true.\n  final bool? enableFeedback;\n\n  /// An optional callback that's called when the [VerticalTabBar] is tapped.\n  ///\n  /// The callback is applied to the index of the tab where the tap occurred.\n  ///\n  /// This callback has no effect on the default handling of taps. It's for\n  /// applications that want to do a little extra work when a tab is tapped,\n  /// even if the tap doesn't change the TabController's index. TabBar [onTap]\n  /// callbacks should not make changes to the TabController since that would\n  /// interfere with the default tap handler.\n  final ValueChanged<int>? onTap;\n\n  /// An optional callback that's called when a [VerticalTab]'s hover state in the\n  /// [VerticalTabBar] changes.\n  ///\n  /// Called when a pointer enters or exits the ink response area of the [VerticalTab].\n  ///\n  /// The value passed to the callback is true if a pointer has entered the\n  /// [VerticalTab] at `index` and false if a pointer has exited.\n  ///\n  /// When hover is moved from one tab directly to another, this will be called\n  /// twice. First to represent hover exiting the initial tab, and then second\n  /// for the pointer entering hover over the next tab.\n  ///\n  /// {@tool dartpad}\n  /// This sample shows how to customize a [VerticalTab] in response to hovering over a\n  /// [VerticalTabBar].\n  ///\n  /// ** See code in examples/api/lib/material/tabs/tab_bar.onHover.dart **\n  /// {@end-tool}\n  final TabValueChanged<bool>? onHover;\n\n  /// An optional callback that's called when a [VerticalTab]'s focus state in the\n  /// [VerticalTabBar] changes.\n  ///\n  /// Called when the node for the [VerticalTab] at `index` gains or loses focus.\n  ///\n  /// The value passed to the callback is true if the node has gained focus for\n  /// the [VerticalTab] at `index` and false if focus has been lost.\n  ///\n  /// When focus is moved from one tab directly to another, this will be called\n  /// twice. First to represent focus being lost by the initially focused tab,\n  /// and then second for the next tab gaining focus.\n  ///\n  /// {@tool dartpad}\n  /// This sample shows how to customize a [VerticalTab] based on focus traversal in\n  /// enclosing [VerticalTabBar].\n  ///\n  /// ** See code in examples/api/lib/material/tabs/tab_bar.onFocusChange.dart **\n  /// {@end-tool}\n  final TabValueChanged<bool>? onFocusChange;\n\n  /// How the [VerticalTabBar]'s scroll view should respond to user input.\n  ///\n  /// For example, determines how the scroll view continues to animate after the\n  /// user stops dragging the scroll view.\n  ///\n  /// Defaults to matching platform conventions.\n  final ScrollPhysics? physics;\n\n  /// Creates the tab bar's [InkWell] splash factory, which defines\n  /// the appearance of \"ink\" splashes that occur in response to taps.\n  ///\n  /// Use [NoSplash.splashFactory] to defeat ink splash rendering. For example\n  /// to defeat both the splash and the hover/pressed overlay, but not the\n  /// keyboard focused overlay:\n  ///\n  /// ```dart\n  /// TabBar(\n  ///   splashFactory: NoSplash.splashFactory,\n  ///   overlayColor: WidgetStateProperty.resolveWith<Color?>(\n  ///     (Set<WidgetState> states) {\n  ///       return states.contains(WidgetState.focused) ? null : Colors.transparent;\n  ///     },\n  ///   ),\n  ///   tabs: const <Widget>[\n  ///     // ...\n  ///   ],\n  /// )\n  /// ```\n  final InteractiveInkFeatureFactory? splashFactory;\n\n  /// Defines the clipping radius of splashes that extend outside the bounds of the tab.\n  ///\n  /// This can be useful to match the [BoxDecoration.borderRadius] provided as [indicator].\n  ///\n  /// ```dart\n  /// TabBar(\n  ///   indicator: BoxDecoration(\n  ///     borderRadius: BorderRadius.circular(40),\n  ///   ),\n  ///   splashBorderRadius: BorderRadius.circular(40),\n  ///   tabs: const <Widget>[\n  ///     // ...\n  ///   ],\n  /// )\n  /// ```\n  ///\n  /// If this property is null, it is interpreted as [BorderRadius.zero].\n  final BorderRadius? splashBorderRadius;\n\n  /// Specifies the horizontal alignment of the tabs within a [VerticalTabBar].\n  ///\n  /// If [VerticalTabBar.isScrollable] is false, only [TabAlignment.fill] and\n  /// [TabAlignment.center] are supported. Otherwise an exception is thrown.\n  ///\n  /// If [VerticalTabBar.isScrollable] is true, only [TabAlignment.start], [TabAlignment.startOffset],\n  /// and [TabAlignment.center] are supported. Otherwise an exception is thrown.\n  ///\n  /// If this is null, then the value of [TabBarThemeData.tabAlignment] is used.\n  ///\n  /// If [TabBarThemeData.tabAlignment] is null and [ThemeData.useMaterial3] is true,\n  /// then [TabAlignment.startOffset] is used if [isScrollable] is true,\n  /// otherwise [TabAlignment.fill] is used.\n  ///\n  /// If [TabBarThemeData.tabAlignment] is null and [ThemeData.useMaterial3] is false,\n  /// then [TabAlignment.center] is used if [isScrollable] is true,\n  /// otherwise [TabAlignment.fill] is used.\n  final TabAlignment? tabAlignment;\n\n  /// Specifies the text scaling behavior for the [VerticalTab] label.\n  ///\n  /// If this is null, then the value of [TabBarThemeData.textScaler] is used. If that is\n  /// also null, then the text scaling behavior is determined by the [MediaQueryData.textScaler]\n  /// from the ambient [MediaQuery], or 1.0 if there is no [MediaQuery] in scope.\n  ///\n  /// See also:\n  ///   * [TextScaler], which is used to scale text based on the device's text scale factor.\n  final TextScaler? textScaler;\n\n  /// Specifies the animation behavior of the tab indicator.\n  ///\n  /// If this is null, then the value of [TabBarThemeData.indicatorAnimation] is used.\n  /// If that is also null, then the tab indicator will animate linearly if the\n  /// [indicatorSize] is [TabBarIndicatorSize.tab], otherwise it will animate\n  /// with an elastic effect if the [indicatorSize] is [TabBarIndicatorSize.label].\n  ///\n  /// {@tool dartpad}\n  /// This sample shows how to customize the animation behavior of the tab indicator\n  /// by using the [indicatorAnimation] property.\n  ///\n  /// ** See code in examples/api/lib/material/tabs/tab_bar.indicator_animation.0.dart **\n  /// {@end-tool}\n  ///\n  /// See also:\n  ///\n  ///  * [TabIndicatorAnimation], which specifies the animation behavior of the tab indicator.\n  final TabIndicatorAnimation? indicatorAnimation;\n\n  /// Returns whether the [VerticalTabBar] contains a tab with both text and icon.\n  ///\n  /// [VerticalTabBar] uses this to give uniform padding to all tabs in cases where\n  /// there are some tabs with both text and icon and some which contain only\n  /// text or icon.\n  bool get tabHasTextAndIcon {\n    for (final Widget item in tabs) {\n      if (item is PreferredSizeWidget) {\n        if (item.preferredSize.height == _kTextAndIconTabWidth) {\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n\n  /// Whether this tab bar is a primary tab bar.\n  ///\n  /// Otherwise, it is a secondary tab bar.\n  final bool _isPrimary;\n\n  @override\n  State<VerticalTabBar> createState() => _VerticalTabBarState();\n}\n\nclass _VerticalTabBarState extends State<VerticalTabBar> {\n  ScrollController? _scrollController;\n  TabController? _controller;\n  _IndicatorPainter? _indicatorPainter;\n  int? _currentIndex;\n  // late double _tabStripWidth;\n  late List<GlobalKey> _tabKeys;\n  EdgeInsetsGeometry _labelPadding = EdgeInsets.zero;\n  bool _debugHasScheduledValidTabsCountCheck = false;\n\n  @override\n  void initState() {\n    super.initState();\n    // If indicatorSize is TabIndicatorSize.label, _tabKeys[i] is used to find\n    // the width of tab widget i. See _IndicatorPainter.indicatorRect().\n    _tabKeys = widget.tabs.map((Widget tab) => GlobalKey()).toList();\n    // _labelPaddings = List<EdgeInsetsGeometry>.filled(\n    //   widget.tabs.length,\n    //   EdgeInsets.zero,\n    //   growable: true,\n    // );\n  }\n\n  TabBarThemeData get _defaults {\n    if (Theme.of(context).useMaterial3) {\n      return widget._isPrimary\n          ? _TabsPrimaryDefaultsM3(context, widget.isScrollable)\n          : _TabsSecondaryDefaultsM3(context, widget.isScrollable);\n    } else {\n      return _TabsDefaultsM2(context, widget.isScrollable);\n    }\n  }\n\n  Decoration _getIndicator(TabBarIndicatorSize indicatorSize) {\n    final ThemeData theme = Theme.of(context);\n    final TabBarThemeData tabBarTheme = TabBarTheme.of(context);\n\n    if (widget.indicator != null) {\n      return widget.indicator!;\n    }\n    if (tabBarTheme.indicator != null) {\n      return tabBarTheme.indicator!;\n    }\n\n    Color color =\n        widget.indicatorColor ??\n        tabBarTheme.indicatorColor ??\n        _defaults.indicatorColor!;\n    // ThemeData tries to avoid this by having indicatorColor avoid being the\n    // primaryColor. However, it's possible that the tab bar is on a\n    // Material that isn't the primaryColor. In that case, if the indicator\n    // color ends up matching the material's color, then this overrides it.\n    // When that happens, automatic transitions of the theme will likely look\n    // ugly as the indicator color suddenly snaps to white at one end, but it's\n    // not clear how to avoid that any further.\n    //\n    // The material's color might be null (if it's a transparency). In that case\n    // there's no good way for us to find out what the color is so we don't.\n    //\n    // TODO(xu-baolin): Remove automatic adjustment to white color indicator\n    // with a better long-term solution.\n    // https://github.com/flutter/flutter/pull/68171#pullrequestreview-517753917\n    if (widget.automaticIndicatorColorAdjustment &&\n        color.toARGB32() == Material.maybeOf(context)?.color?.toARGB32()) {\n      color = Colors.white;\n    }\n\n    final double effectiveIndicatorWeight = theme.useMaterial3\n        ? math.max(widget.indicatorWeight, switch (widget._isPrimary) {\n            true => _TabsPrimaryDefaultsM3.indicatorWeight(indicatorSize),\n            false => _TabsSecondaryDefaultsM3.indicatorWeight,\n          })\n        : widget.indicatorWeight;\n    // Only Material 3 primary TabBar with label indicatorSize should be rounded.\n    final bool primaryWithLabelIndicator = switch (indicatorSize) {\n      TabBarIndicatorSize.label => widget._isPrimary,\n      TabBarIndicatorSize.tab => false,\n    };\n    final BorderRadius? effectiveBorderRadius =\n        theme.useMaterial3 && primaryWithLabelIndicator\n        // dom\n        ? BorderRadius.only(\n            topRight: Radius.circular(effectiveIndicatorWeight),\n            bottomRight: Radius.circular(effectiveIndicatorWeight),\n          )\n        : null;\n    return VerticalUnderlineTabIndicator(\n      borderRadius: effectiveBorderRadius,\n      borderSide: BorderSide(\n        // TODO(tahatesser): Make sure this value matches Material 3 Tabs spec\n        // when `preferredSize`and `indicatorWeight` are updated to support Material 3\n        // https://m3.material.io/components/tabs/specs#149a189f-9039-4195-99da-15c205d20e30,\n        // https://github.com/flutter/flutter/issues/116136\n        width: effectiveIndicatorWeight,\n        color: color,\n      ),\n    );\n  }\n\n  // If the TabBar is rebuilt with a new tab controller, the caller should\n  // dispose the old one. In that case the old controller's animation will be\n  // null and should not be accessed.\n  bool get _controllerIsValid => _controller?.animation != null;\n\n  void _updateTabController() {\n    final TabController? newController =\n        widget.controller ?? DefaultTabController.maybeOf(context);\n    assert(() {\n      if (newController == null) {\n        throw FlutterError(\n          'No TabController for ${widget.runtimeType}.\\n'\n          'When creating a ${widget.runtimeType}, you must either provide an explicit '\n          'TabController using the \"controller\" property, or you must ensure that there '\n          'is a DefaultTabController above the ${widget.runtimeType}.\\n'\n          'In this case, there was neither an explicit controller nor a default controller.',\n        );\n      }\n      return true;\n    }());\n\n    if (newController == _controller) {\n      return;\n    }\n\n    if (_controllerIsValid) {\n      _controller!.animation!.removeListener(_handleTabControllerAnimationTick);\n      _controller!.removeListener(_handleTabControllerTick);\n    }\n    _controller = newController;\n    if (_controller != null) {\n      _controller!.animation!.addListener(_handleTabControllerAnimationTick);\n      _controller!.addListener(_handleTabControllerTick);\n      _currentIndex = _controller!.index;\n    }\n  }\n\n  void _initIndicatorPainter() {\n    final ThemeData theme = Theme.of(context);\n    final TabBarThemeData tabBarTheme = TabBarTheme.of(context);\n    final TabBarIndicatorSize indicatorSize =\n        widget.indicatorSize ??\n        tabBarTheme.indicatorSize ??\n        _defaults.indicatorSize!;\n\n    final _IndicatorPainter? oldPainter = _indicatorPainter;\n\n    final TabIndicatorAnimation defaultTabIndicatorAnimation =\n        switch (indicatorSize) {\n          TabBarIndicatorSize.label => TabIndicatorAnimation.elastic,\n          TabBarIndicatorSize.tab => TabIndicatorAnimation.linear,\n        };\n\n    _indicatorPainter = !_controllerIsValid\n        ? null\n        : _IndicatorPainter(\n            controller: _controller!,\n            indicator: _getIndicator(indicatorSize),\n            indicatorSize: indicatorSize,\n            indicatorPadding: widget.indicatorPadding,\n            tabKeys: _tabKeys,\n            // Passing old painter so that the constructor can copy some values from it.\n            old: oldPainter,\n            labelPadding: _labelPadding,\n            dividerColor:\n                widget.dividerColor ??\n                tabBarTheme.dividerColor ??\n                _defaults.dividerColor,\n            dividerWidth:\n                widget.dividerWidth ??\n                tabBarTheme.dividerHeight ??\n                _defaults.dividerHeight,\n            showDivider: theme.useMaterial3 && !widget.isScrollable,\n            devicePixelRatio: MediaQuery.devicePixelRatioOf(context),\n            indicatorAnimation:\n                widget.indicatorAnimation ??\n                tabBarTheme.indicatorAnimation ??\n                defaultTabIndicatorAnimation,\n            textDirection: .ltr,\n          );\n\n    oldPainter?.dispose();\n  }\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    _updateTabController();\n    _initIndicatorPainter();\n  }\n\n  @override\n  void didUpdateWidget(VerticalTabBar oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (widget.controller != oldWidget.controller) {\n      _updateTabController();\n      _initIndicatorPainter();\n      // Adjust scroll position.\n      if (_scrollController != null && _scrollController!.hasClients) {\n        final ScrollPosition position = _scrollController!.position;\n        if (position is _TabBarScrollPosition) {\n          position.markNeedsPixelsCorrection();\n        }\n      }\n    } else if (widget.indicatorColor != oldWidget.indicatorColor ||\n        widget.indicatorWeight != oldWidget.indicatorWeight ||\n        widget.indicatorSize != oldWidget.indicatorSize ||\n        widget.indicatorPadding != oldWidget.indicatorPadding ||\n        widget.indicator != oldWidget.indicator ||\n        widget.dividerColor != oldWidget.dividerColor ||\n        widget.dividerWidth != oldWidget.dividerWidth ||\n        widget.indicatorAnimation != oldWidget.indicatorAnimation) {\n      _initIndicatorPainter();\n    }\n\n    if (widget.tabs.length > _tabKeys.length) {\n      final int delta = widget.tabs.length - _tabKeys.length;\n      _tabKeys.addAll(List<GlobalKey>.generate(delta, (int n) => GlobalKey()));\n      // _labelPaddings.addAll(\n      //   List<EdgeInsetsGeometry>.filled(delta, EdgeInsets.zero),\n      // );\n    } else if (widget.tabs.length < _tabKeys.length) {\n      _tabKeys.removeRange(widget.tabs.length, _tabKeys.length);\n      // _labelPaddings.removeRange(widget.tabs.length, _tabKeys.length);\n    }\n  }\n\n  @override\n  void dispose() {\n    _indicatorPainter!.dispose();\n    if (_controllerIsValid) {\n      _controller!.animation!.removeListener(_handleTabControllerAnimationTick);\n      _controller!.removeListener(_handleTabControllerTick);\n    }\n    _controller = null;\n    _scrollController?.dispose();\n    // We don't own the _controller Animation, so it's not disposed here.\n    super.dispose();\n  }\n\n  int get maxTabIndex => _indicatorPainter!.maxTabIndex;\n\n  final _mainCtr = Get.find<MainController>();\n\n  double _tabScrollOffset(\n    int index,\n    double viewportWidth,\n    double minExtent,\n    double maxExtent,\n  ) {\n    if (!widget.isScrollable) {\n      return 0.0;\n    }\n    double tabCenter = _indicatorPainter!.centerOf(index);\n    // double paddingStart;\n    // switch (Directionality.of(context)) {\n    //   case TextDirection.rtl:\n    //     paddingStart = widget.padding?.resolve(TextDirection.rtl).right ?? 0;\n    //     tabCenter = _tabStripWidth - tabCenter;\n    //   case TextDirection.ltr:\n    //     paddingStart = widget.padding?.resolve(TextDirection.ltr).left ?? 0;\n    // }\n    // dom\n    final double paddingTop =\n        widget.padding?.resolve(TextDirection.ltr).top ?? 0;\n    return clampDouble(\n      tabCenter +\n          paddingTop -\n          viewportWidth / 2.0 +\n          (_mainCtr.useBottomNav &&\n                  switch (_mainCtr.barHideType) {\n                    .instant => _mainCtr.showBottomBar?.value ?? true,\n                    .sync => (_mainCtr.barOffset?.value ?? 0) == 0,\n                  }\n              ? 80.0\n              : 0.0),\n      minExtent,\n      maxExtent,\n    );\n  }\n\n  double _tabCenteredScrollOffset(int index) {\n    final ScrollPosition position = _scrollController!.position;\n    return _tabScrollOffset(\n      index,\n      position.viewportDimension,\n      position.minScrollExtent,\n      position.maxScrollExtent,\n    );\n  }\n\n  double _initialScrollOffset(\n    double viewportWidth,\n    double minExtent,\n    double maxExtent,\n  ) {\n    return _tabScrollOffset(\n      _currentIndex!,\n      viewportWidth,\n      minExtent,\n      maxExtent,\n    );\n  }\n\n  void _scrollToCurrentIndex() {\n    final double offset = _tabCenteredScrollOffset(_currentIndex!);\n    _scrollController!.animateTo(\n      offset,\n      duration: kTabScrollDuration,\n      curve: Curves.ease,\n    );\n  }\n\n  void _scrollToControllerValue() {\n    final double? leadingPosition = _currentIndex! > 0\n        ? _tabCenteredScrollOffset(_currentIndex! - 1)\n        : null;\n    final double middlePosition = _tabCenteredScrollOffset(_currentIndex!);\n    final double? trailingPosition = _currentIndex! < maxTabIndex\n        ? _tabCenteredScrollOffset(_currentIndex! + 1)\n        : null;\n\n    final double index = _controller!.index.toDouble();\n    final double value = _controller!.animation!.value;\n    final double offset = switch (value - index) {\n      -1.0 => leadingPosition ?? middlePosition,\n      1.0 => trailingPosition ?? middlePosition,\n      0 => middlePosition,\n      < 0 =>\n        leadingPosition == null\n            ? middlePosition\n            : lerpDouble(middlePosition, leadingPosition, index - value)!,\n      _ =>\n        trailingPosition == null\n            ? middlePosition\n            : lerpDouble(middlePosition, trailingPosition, value - index)!,\n    };\n\n    _scrollController!.jumpTo(offset);\n  }\n\n  void _handleTabControllerAnimationTick() {\n    assert(mounted);\n    if (!_controller!.indexIsChanging && widget.isScrollable) {\n      // Sync the TabBar's scroll position with the TabBarView's PageView.\n      _currentIndex = _controller!.index;\n      _scrollToControllerValue();\n    }\n  }\n\n  void _handleTabControllerTick() {\n    if (_controller!.index != _currentIndex) {\n      _currentIndex = _controller!.index;\n      if (widget.isScrollable) {\n        _scrollToCurrentIndex();\n      }\n    }\n    setState(() {\n      // Rebuild the tabs after a (potentially animated) index change\n      // has completed.\n    });\n  }\n\n  // Called each time layout completes.\n  void _saveTabOffsets(\n    List<double> tabOffsets,\n    TextDirection textDirection,\n    double width,\n  ) {\n    // _tabStripWidth = width;\n    _indicatorPainter?.saveTabOffsets(tabOffsets, textDirection);\n  }\n\n  void _handleTap(int index) {\n    assert(index >= 0 && index < widget.tabs.length);\n    _controller!.animateTo(index);\n    widget.onTap?.call(index);\n  }\n\n  Widget _buildStyledTab(\n    Widget child,\n    bool isSelected,\n    Animation<double> animation,\n    TabBarThemeData defaults,\n  ) {\n    return _TabStyle(\n      animation: animation,\n      isSelected: isSelected,\n      isPrimary: widget._isPrimary,\n      labelColor: widget.labelColor,\n      unselectedLabelColor: widget.unselectedLabelColor,\n      labelStyle: widget.labelStyle,\n      unselectedLabelStyle: widget.unselectedLabelStyle,\n      defaults: defaults,\n      child: child,\n    );\n  }\n\n  bool _debugScheduleCheckHasValidTabsCount() {\n    if (_debugHasScheduledValidTabsCountCheck) {\n      return true;\n    }\n    WidgetsBinding.instance.addPostFrameCallback((Duration duration) {\n      _debugHasScheduledValidTabsCountCheck = false;\n      if (!mounted) {\n        return;\n      }\n      assert(() {\n        if (_controller!.length != widget.tabs.length) {\n          throw FlutterError(\n            \"Controller's length property (${_controller!.length}) does not match the \"\n            \"number of tabs (${widget.tabs.length}) present in TabBar's tabs property.\",\n          );\n        }\n        return true;\n      }());\n    }, debugLabel: 'TabBar.tabsCountCheck');\n    _debugHasScheduledValidTabsCountCheck = true;\n    return true;\n  }\n\n  bool _debugTabAlignmentIsValid(TabAlignment tabAlignment) {\n    assert(() {\n      if (widget.isScrollable && tabAlignment == TabAlignment.fill) {\n        throw FlutterError(\n          '$tabAlignment is only valid for non-scrollable tab bars.',\n        );\n      }\n      if (!widget.isScrollable &&\n          (tabAlignment == TabAlignment.start ||\n              tabAlignment == TabAlignment.startOffset)) {\n        throw FlutterError(\n          '$tabAlignment is only valid for scrollable tab bars.',\n        );\n      }\n      return true;\n    }());\n    return true;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    assert(debugCheckHasMaterialLocalizations(context));\n    assert(_debugScheduleCheckHasValidTabsCount());\n    final ThemeData theme = Theme.of(context);\n    final TabBarThemeData tabBarTheme = TabBarTheme.of(context);\n    final TabAlignment effectiveTabAlignment =\n        widget.tabAlignment ??\n        tabBarTheme.tabAlignment ??\n        _defaults.tabAlignment!;\n    assert(_debugTabAlignmentIsValid(effectiveTabAlignment));\n\n    // final MaterialLocalizations localizations = MaterialLocalizations.of(\n    //   context,\n    // );\n    if (_controller!.length == 0) {\n      return LimitedBox(\n        maxWidth: 0.0,\n        child: SizedBox(\n          width: double.infinity,\n          height: _kTabWidth + widget.indicatorWeight,\n        ),\n      );\n    }\n\n    final List<Widget> wrappedTabs = List<Widget>.generate(widget.tabs.length, (\n      int index,\n    ) {\n      EdgeInsetsGeometry padding =\n          widget.labelPadding ?? tabBarTheme.labelPadding ?? _kTabLabelPadding;\n      // const double verticalAdjustment =\n      //     (_kTextAndIconTabWidth - _kTabWidth) / 2.0;\n      //\n      // final Widget tab = widget.tabs[index];\n      // if (tab is PreferredSizeWidget &&\n      //     tab.preferredSize.height == _kTabWidth &&\n      //     widget.tabHasTextAndIcon) {\n      //   padding = padding.add(\n      //     const EdgeInsets.symmetric(vertical: verticalAdjustment),\n      //   );\n      // }\n      _labelPadding = padding;\n\n      return Center(\n        widthFactor: 1.0,\n        child: Padding(\n          padding: _labelPadding,\n          child: KeyedSubtree(key: _tabKeys[index], child: widget.tabs[index]),\n        ),\n      );\n    });\n\n    // If the controller was provided by DefaultTabController and we're part\n    // of a Hero (typically the AppBar), then we will not be able to find the\n    // controller during a Hero transition. See https://github.com/flutter/flutter/issues/213.\n    if (_controller != null) {\n      final int previousIndex = _controller!.previousIndex;\n\n      if (_controller!.indexIsChanging) {\n        // The user tapped on a tab, the tab controller's animation is running.\n        assert(_currentIndex != previousIndex);\n        final Animation<double> animation = _ChangeAnimation(_controller!);\n        wrappedTabs[_currentIndex!] = _buildStyledTab(\n          wrappedTabs[_currentIndex!],\n          true,\n          animation,\n          _defaults,\n        );\n        wrappedTabs[previousIndex] = _buildStyledTab(\n          wrappedTabs[previousIndex],\n          false,\n          animation,\n          _defaults,\n        );\n      } else {\n        // The user is dragging the TabBarView's PageView left or right.\n        final int tabIndex = _currentIndex!;\n        final Animation<double> centerAnimation = _DragAnimation(\n          _controller!,\n          tabIndex,\n        );\n        wrappedTabs[tabIndex] = _buildStyledTab(\n          wrappedTabs[tabIndex],\n          true,\n          centerAnimation,\n          _defaults,\n        );\n        if (_currentIndex! > 0) {\n          final int tabIndex = _currentIndex! - 1;\n          final Animation<double> previousAnimation = ReverseAnimation(\n            _DragAnimation(_controller!, tabIndex),\n          );\n          wrappedTabs[tabIndex] = _buildStyledTab(\n            wrappedTabs[tabIndex],\n            false,\n            previousAnimation,\n            _defaults,\n          );\n        }\n        if (_currentIndex! < widget.tabs.length - 1) {\n          final int tabIndex = _currentIndex! + 1;\n          final Animation<double> nextAnimation = ReverseAnimation(\n            _DragAnimation(_controller!, tabIndex),\n          );\n          wrappedTabs[tabIndex] = _buildStyledTab(\n            wrappedTabs[tabIndex],\n            false,\n            nextAnimation,\n            _defaults,\n          );\n        }\n      }\n    }\n\n    // Add the tap handler to each tab. If the tab bar is not scrollable,\n    // then give all of the tabs equal flexibility so that they each occupy\n    // the same share of the tab bar's overall width.\n    final int tabCount = widget.tabs.length;\n    for (int index = 0; index < tabCount; index += 1) {\n      final Set<WidgetState> selectedState = <WidgetState>{\n        if (index == _currentIndex) WidgetState.selected,\n      };\n\n      final MouseCursor effectiveMouseCursor =\n          WidgetStateProperty.resolveAs<MouseCursor?>(\n            widget.mouseCursor,\n            selectedState,\n          ) ??\n          tabBarTheme.mouseCursor?.resolve(selectedState) ??\n          WidgetStateMouseCursor.clickable.resolve(selectedState);\n\n      final WidgetStateProperty<Color?> defaultOverlay =\n          WidgetStateProperty.resolveWith<Color?>((\n            Set<WidgetState> states,\n          ) {\n            final Set<WidgetState> effectiveStates = selectedState.toSet()\n              ..addAll(states);\n            return _defaults.overlayColor?.resolve(effectiveStates);\n          });\n      wrappedTabs[index] = InkWell(\n        mouseCursor: effectiveMouseCursor,\n        onTap: () {\n          _handleTap(index);\n        },\n        onHover: (bool value) {\n          widget.onHover?.call(value, index);\n        },\n        onFocusChange: (bool value) {\n          widget.onFocusChange?.call(value, index);\n        },\n        enableFeedback: widget.enableFeedback ?? true,\n        overlayColor:\n            widget.overlayColor ?? tabBarTheme.overlayColor ?? defaultOverlay,\n        splashFactory:\n            widget.splashFactory ??\n            tabBarTheme.splashFactory ??\n            _defaults.splashFactory,\n        borderRadius:\n            widget.splashBorderRadius ??\n            tabBarTheme.splashBorderRadius ??\n            _defaults.splashBorderRadius,\n        child: Padding(\n          padding: EdgeInsets.only(left: widget.indicatorWeight),\n          child: wrappedTabs[index],\n        ),\n      );\n      wrappedTabs[index] = MergeSemantics(child: wrappedTabs[index]);\n      if (!widget.isScrollable && effectiveTabAlignment == TabAlignment.fill) {\n        wrappedTabs[index] = Expanded(child: wrappedTabs[index]);\n      }\n    }\n\n    Widget tabBar = Semantics(\n      role: SemanticsRole.tabBar,\n      container: true,\n      explicitChildNodes: true,\n      child: CustomPaint(\n        painter: _indicatorPainter,\n        child: _TabStyle(\n          animation: kAlwaysDismissedAnimation,\n          isSelected: false,\n          isPrimary: widget._isPrimary,\n          labelColor: widget.labelColor,\n          unselectedLabelColor: widget.unselectedLabelColor,\n          labelStyle: widget.labelStyle,\n          unselectedLabelStyle: widget.unselectedLabelStyle,\n          defaults: _defaults,\n          child: _TabLabelBar(\n            onPerformLayout: _saveTabOffsets,\n            mainAxisSize: effectiveTabAlignment == TabAlignment.fill\n                ? MainAxisSize.max\n                : MainAxisSize.min,\n            children: wrappedTabs,\n          ),\n        ),\n      ),\n    );\n\n    if (widget.isScrollable) {\n      _scrollController ??= _TabBarScrollController(this);\n      tabBar = ScrollConfiguration(\n        // The scrolling tabs should not show an overscroll indicator.\n        behavior: ScrollConfiguration.of(context).copyWith(overscroll: false),\n        child: SingleChildScrollView(\n          dragStartBehavior: widget.dragStartBehavior,\n          scrollDirection: Axis.vertical, // dom\n          controller: _scrollController,\n          padding: widget.padding,\n          physics: widget.physics,\n          child: tabBar,\n        ),\n      );\n      if (theme.useMaterial3) {\n        final AlignmentGeometry effectiveAlignment =\n            switch (effectiveTabAlignment) {\n              TabAlignment.center => Alignment.center,\n              TabAlignment.start ||\n              TabAlignment.startOffset ||\n              TabAlignment.fill => AlignmentDirectional.topCenter, // dom\n            };\n\n        final Color dividerColor =\n            widget.dividerColor ??\n            tabBarTheme.dividerColor ??\n            _defaults.dividerColor!;\n        final double dividerWidth =\n            widget.dividerWidth ??\n            tabBarTheme.dividerHeight ??\n            _defaults.dividerHeight!;\n\n        tabBar = Align(\n          widthFactor: 1.0,\n          heightFactor: null, // dom\n          // heightFactor: dividerWidth > 0 ? null : 1.0,\n          alignment: effectiveAlignment,\n          child: tabBar,\n        );\n\n        if (dividerColor != Colors.transparent && dividerWidth > 0) {\n          tabBar = CustomPaint(\n            painter: _DividerPainter(\n              dividerColor: dividerColor,\n              dividerWidth: dividerWidth,\n            ),\n            child: tabBar,\n          );\n        }\n      }\n    } else if (widget.padding != null) {\n      tabBar = Padding(padding: widget.padding!, child: tabBar);\n    }\n\n    return MediaQuery(\n      data: MediaQuery.of(\n        context,\n      ).copyWith(textScaler: widget.textScaler ?? tabBarTheme.textScaler),\n      child: tabBar,\n    );\n  }\n}\n\n// Hand coded defaults based on Material Design 2.\nclass _TabsDefaultsM2 extends TabBarThemeData {\n  _TabsDefaultsM2(this.context, this.isScrollable)\n    : super(indicatorSize: TabBarIndicatorSize.tab);\n\n  final BuildContext context;\n  late final ColorScheme _colors = Theme.of(context).colorScheme;\n  late final bool isDark = Theme.brightnessOf(context) == Brightness.dark;\n  late final Color primaryColor = isDark ? Colors.grey[900]! : Colors.blue;\n  final bool isScrollable;\n\n  @override\n  Color? get indicatorColor =>\n      _colors.secondary == primaryColor ? Colors.white : _colors.secondary;\n\n  @override\n  Color? get labelColor => Theme.of(context).primaryTextTheme.bodyLarge!.color!;\n\n  @override\n  TextStyle? get labelStyle => Theme.of(context).primaryTextTheme.bodyLarge;\n\n  @override\n  TextStyle? get unselectedLabelStyle =>\n      Theme.of(context).primaryTextTheme.bodyLarge;\n\n  @override\n  InteractiveInkFeatureFactory? get splashFactory =>\n      Theme.of(context).splashFactory;\n\n  @override\n  TabAlignment? get tabAlignment =>\n      isScrollable ? TabAlignment.start : TabAlignment.fill;\n\n  static const EdgeInsetsGeometry iconMargin = EdgeInsets.only(bottom: 10);\n}\n\n// BEGIN GENERATED TOKEN PROPERTIES - Tabs\n\n// Do not edit by hand. The code between the \"BEGIN GENERATED\" and\n// \"END GENERATED\" comments are generated from data in the Material\n// Design token database by the script:\n//   dev/tools/gen_defaults/bin/gen_defaults.dart.\n\n// dart format off\nclass _TabsPrimaryDefaultsM3 extends TabBarThemeData {\n  _TabsPrimaryDefaultsM3(this.context, this.isScrollable)\n      : super(indicatorSize: TabBarIndicatorSize.label);\n\n  final BuildContext context;\n  late final ColorScheme _colors = Theme.of(context).colorScheme;\n  late final TextTheme _textTheme = Theme.of(context).textTheme;\n  final bool isScrollable;\n\n  // This value comes from Divider widget defaults. Token db deprecated 'primary-navigation-tab.divider.color' token.\n  @override\n  Color? get dividerColor => _colors.outlineVariant;\n\n  // This value comes from Divider widget defaults. Token db deprecated 'primary-navigation-tab.divider.height' token.\n  @override\n  double? get dividerHeight => 1.0;\n\n  @override\n  Color? get indicatorColor => _colors.primary;\n\n  @override\n  Color? get labelColor => _colors.primary;\n\n  @override\n  TextStyle? get labelStyle => _textTheme.titleSmall;\n\n  @override\n  Color? get unselectedLabelColor => _colors.onSurfaceVariant;\n\n  @override\n  TextStyle? get unselectedLabelStyle => _textTheme.titleSmall;\n\n  @override\n  WidgetStateProperty<Color?> get overlayColor {\n    return WidgetStateProperty.resolveWith((Set<WidgetState> states) {\n      if (states.contains(WidgetState.selected)) {\n        if (states.contains(WidgetState.pressed)) {\n          return _colors.primary.withValues(alpha:0.1);\n        }\n        if (states.contains(WidgetState.hovered)) {\n          return _colors.primary.withValues(alpha:0.08);\n        }\n        if (states.contains(WidgetState.focused)) {\n          return _colors.primary.withValues(alpha:0.1);\n        }\n        return null;\n      }\n      if (states.contains(WidgetState.pressed)) {\n        return _colors.primary.withValues(alpha:0.1);\n      }\n      if (states.contains(WidgetState.hovered)) {\n        return _colors.onSurface.withValues(alpha:0.08);\n      }\n      if (states.contains(WidgetState.focused)) {\n        return _colors.onSurface.withValues(alpha:0.1);\n      }\n      return null;\n    });\n  }\n\n  @override\n  InteractiveInkFeatureFactory? get splashFactory => Theme.of(context).splashFactory;\n\n  @override\n  TabAlignment? get tabAlignment => isScrollable ? TabAlignment.startOffset : TabAlignment.fill;\n\n  static double indicatorWeight(TabBarIndicatorSize indicatorSize) {\n    return switch (indicatorSize) {\n      TabBarIndicatorSize.label => 3.0,\n      TabBarIndicatorSize.tab   => 2.0,\n    };\n  }\n\n  // TODO(davidmartos96): This value doesn't currently exist in\n  // https://m3.material.io/components/tabs/specs\n  // Update this when the token is available.\n  static const EdgeInsetsGeometry iconMargin = EdgeInsets.only(bottom: 2);\n}\n\nclass _TabsSecondaryDefaultsM3 extends TabBarThemeData {\n  _TabsSecondaryDefaultsM3(this.context, this.isScrollable)\n      : super(indicatorSize: TabBarIndicatorSize.tab);\n\n  final BuildContext context;\n  late final ColorScheme _colors = Theme.of(context).colorScheme;\n  late final TextTheme _textTheme = Theme.of(context).textTheme;\n  final bool isScrollable;\n\n  // This value comes from Divider widget defaults. Token db deprecated 'secondary-navigation-tab.divider.color' token.\n  @override\n  Color? get dividerColor => _colors.outlineVariant;\n\n  // This value comes from Divider widget defaults. Token db deprecated 'secondary-navigation-tab.divider.height' token.\n  @override\n  double? get dividerHeight => 1.0;\n\n  @override\n  Color? get indicatorColor => _colors.primary;\n\n  @override\n  Color? get labelColor => _colors.onSurface;\n\n  @override\n  TextStyle? get labelStyle => _textTheme.titleSmall;\n\n  @override\n  Color? get unselectedLabelColor => _colors.onSurfaceVariant;\n\n  @override\n  TextStyle? get unselectedLabelStyle => _textTheme.titleSmall;\n\n  @override\n  WidgetStateProperty<Color?> get overlayColor {\n    return WidgetStateProperty.resolveWith((Set<WidgetState> states) {\n      if (states.contains(WidgetState.selected)) {\n        if (states.contains(WidgetState.pressed)) {\n          return _colors.onSurface.withValues(alpha:0.1);\n        }\n        if (states.contains(WidgetState.hovered)) {\n          return _colors.onSurface.withValues(alpha:  0.08);\n        }\n        if (states.contains(WidgetState.focused)) {\n          return _colors.onSurface.withValues(alpha:0.1);\n        }\n        return null;\n      }\n      if (states.contains(WidgetState.pressed)) {\n        return _colors.onSurface.withValues(alpha:0.1);\n      }\n      if (states.contains(WidgetState.hovered)) {\n        return _colors.onSurface.withValues(alpha:0.08);\n      }\n      if (states.contains(WidgetState.focused)) {\n        return _colors.onSurface.withValues(alpha:0.1);\n      }\n      return null;\n    });\n  }\n\n  @override\n  InteractiveInkFeatureFactory? get splashFactory => Theme.of(context).splashFactory;\n\n  @override\n  TabAlignment? get tabAlignment => isScrollable ? TabAlignment.startOffset : TabAlignment.fill;\n\n  static double indicatorWeight = 2.0;\n}\n// dart format on\n\n// END GENERATED TOKEN PROPERTIES - Tabs\n\n/// Used with [TabBar.indicator] to draw a horizontal line below the\n/// selected tab.\n///\n/// The selected tab underline is inset from the tab's boundary by [insets].\n/// The [borderSide] defines the line's color and weight.\n///\n/// The [TabBar.indicatorSize] property can be used to define the indicator's\n/// bounds in terms of its (centered) widget with [TabBarIndicatorSize.label],\n/// or the entire tab with [TabBarIndicatorSize.tab].\nclass VerticalUnderlineTabIndicator extends Decoration {\n  /// Create an underline style selected tab indicator.\n  const VerticalUnderlineTabIndicator({\n    this.borderRadius,\n    this.borderSide = const BorderSide(width: 2.0, color: Colors.white),\n    this.insets = EdgeInsets.zero,\n  });\n\n  /// The radius of the indicator's corners.\n  ///\n  /// If this value is non-null, rounded rectangular tab indicator is\n  /// drawn, otherwise rectangular tab indicator is drawn.\n  final BorderRadius? borderRadius;\n\n  /// The color and weight of the horizontal line drawn below the selected tab.\n  final BorderSide borderSide;\n\n  /// Locates the selected tab's underline relative to the tab's boundary.\n  ///\n  /// The [TabBar.indicatorSize] property can be used to define the tab\n  /// indicator's bounds in terms of its (centered) tab widget with\n  /// [TabBarIndicatorSize.label], or the entire tab with\n  /// [TabBarIndicatorSize.tab].\n  final EdgeInsetsGeometry insets;\n\n  @override\n  Decoration? lerpFrom(Decoration? a, double t) {\n    if (a is VerticalUnderlineTabIndicator) {\n      return VerticalUnderlineTabIndicator(\n        borderSide: BorderSide.lerp(a.borderSide, borderSide, t),\n        insets: EdgeInsetsGeometry.lerp(a.insets, insets, t)!,\n      );\n    }\n    return super.lerpFrom(a, t);\n  }\n\n  @override\n  Decoration? lerpTo(Decoration? b, double t) {\n    if (b is VerticalUnderlineTabIndicator) {\n      return VerticalUnderlineTabIndicator(\n        borderSide: BorderSide.lerp(borderSide, b.borderSide, t),\n        insets: EdgeInsetsGeometry.lerp(insets, b.insets, t)!,\n      );\n    }\n    return super.lerpTo(b, t);\n  }\n\n  @override\n  BoxPainter createBoxPainter([VoidCallback? onChanged]) {\n    return _VerticalUnderlinePainter(this, borderRadius, onChanged);\n  }\n\n  Rect _indicatorRectFor(Rect rect, TextDirection textDirection) {\n    final Rect indicator = insets.resolve(textDirection).deflateRect(rect);\n    // dom\n    return Rect.fromLTWH(\n      indicator.left,\n      indicator.top,\n      borderSide.width,\n      indicator.height,\n    );\n  }\n\n  @override\n  Path getClipPath(Rect rect, TextDirection textDirection) {\n    if (borderRadius != null) {\n      return Path()..addRRect(\n        borderRadius!.toRRect(_indicatorRectFor(rect, textDirection)),\n      );\n    }\n    return Path()..addRect(_indicatorRectFor(rect, textDirection));\n  }\n}\n\nclass _VerticalUnderlinePainter extends BoxPainter {\n  _VerticalUnderlinePainter(\n    this.decoration,\n    this.borderRadius,\n    super.onChanged,\n  );\n\n  final VerticalUnderlineTabIndicator decoration;\n  final BorderRadius? borderRadius;\n\n  @override\n  void paint(Canvas canvas, Offset offset, ImageConfiguration configuration) {\n    assert(configuration.size != null);\n    final Rect rect = offset & configuration.size!;\n    final TextDirection textDirection = configuration.textDirection!;\n    final Paint paint;\n    if (borderRadius != null) {\n      paint = Paint()..color = decoration.borderSide.color;\n      final Rect indicator = decoration._indicatorRectFor(rect, textDirection);\n      final RRect rrect = RRect.fromRectAndCorners(\n        indicator,\n        topLeft: borderRadius!.topLeft,\n        topRight: borderRadius!.topRight,\n        bottomRight: borderRadius!.bottomRight,\n        bottomLeft: borderRadius!.bottomLeft,\n      );\n      canvas.drawRRect(rrect, paint);\n    } else {\n      paint = decoration.borderSide.toPaint()..strokeCap = StrokeCap.square;\n      final Rect indicator = decoration\n          ._indicatorRectFor(rect, textDirection)\n          .deflate(decoration.borderSide.width / 2.0);\n      // dom\n      canvas.drawLine(indicator.topLeft, indicator.bottomLeft, paint);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/gesture/horizontal_drag_gesture_recognizer.dart",
    "content": "import 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:flutter/gestures.dart';\n\nclass CustomHorizontalDragGestureRecognizer\n    extends HorizontalDragGestureRecognizer {\n  CustomHorizontalDragGestureRecognizer({\n    super.debugOwner,\n    super.supportedDevices,\n    super.allowedButtonsFilter,\n  });\n\n  Offset? _initialPosition;\n  Offset? get initialPosition => _initialPosition;\n\n  @override\n  DeviceGestureSettings get gestureSettings => _gestureSettings;\n  final _gestureSettings = DeviceGestureSettings(touchSlop: touchSlopH);\n\n  @override\n  void addAllowedPointer(PointerDownEvent event) {\n    super.addAllowedPointer(event);\n    _initialPosition = event.position;\n  }\n\n  @override\n  bool hasSufficientGlobalDistanceToAccept(\n    PointerDeviceKind pointerDeviceKind,\n    double? deviceTouchSlop,\n  ) {\n    return _computeHitSlop(\n      globalDistanceMoved.abs(),\n      gestureSettings,\n      pointerDeviceKind,\n      _initialPosition,\n      lastPosition.global,\n    );\n  }\n}\n\ndouble touchSlopH = Pref.touchSlopH;\n\nbool _computeHitSlop(\n  double globalDistanceMoved,\n  DeviceGestureSettings? settings,\n  PointerDeviceKind kind,\n  Offset? initialPosition,\n  Offset lastPosition,\n) {\n  switch (kind) {\n    case PointerDeviceKind.mouse:\n      return globalDistanceMoved > kPrecisePointerHitSlop;\n    case PointerDeviceKind.stylus:\n    case PointerDeviceKind.invertedStylus:\n    case PointerDeviceKind.unknown:\n    case PointerDeviceKind.touch:\n      return globalDistanceMoved > touchSlopH &&\n          _calc(initialPosition!, lastPosition);\n    case PointerDeviceKind.trackpad:\n      return globalDistanceMoved > (settings?.touchSlop ?? kTouchSlop);\n  }\n}\n\nbool _calc(Offset initialPosition, Offset lastPosition) {\n  final offset = lastPosition - initialPosition;\n  return offset.dx.abs() > offset.dy.abs() * 3;\n}\n"
  },
  {
    "path": "lib/common/widgets/gesture/image_horizontal_drag_gesture_recognizer.dart",
    "content": "import 'package:PiliPlus/common/widgets/gesture/horizontal_drag_gesture_recognizer.dart';\nimport 'package:flutter/gestures.dart';\n\nmixin ImageGestureRecognizerMixin on GestureRecognizer {\n  int? _pointer;\n\n  @override\n  void addPointer(PointerDownEvent event) {\n    if (_pointer == event.pointer) {\n      return;\n    }\n    _pointer = event.pointer;\n    super.addPointer(event);\n  }\n}\n\ntypedef IsBoundaryAllowed =\n    bool Function(Offset? initialPosition, OffsetPair lastPosition);\n\nclass ImageHorizontalDragGestureRecognizer\n    extends CustomHorizontalDragGestureRecognizer\n    with ImageGestureRecognizerMixin {\n  ImageHorizontalDragGestureRecognizer({\n    super.debugOwner,\n    super.supportedDevices,\n    super.allowedButtonsFilter,\n  });\n\n  IsBoundaryAllowed? isBoundaryAllowed;\n\n  @override\n  bool hasSufficientGlobalDistanceToAccept(\n    PointerDeviceKind pointerDeviceKind,\n    double? deviceTouchSlop,\n  ) {\n    return super.hasSufficientGlobalDistanceToAccept(\n          pointerDeviceKind,\n          deviceTouchSlop,\n        ) &&\n        (isBoundaryAllowed?.call(initialPosition, lastPosition) ?? true);\n  }\n\n  @override\n  void dispose() {\n    isBoundaryAllowed = null;\n    super.dispose();\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/gesture/immediate_tap_gesture_recognizer.dart",
    "content": "import 'package:flutter/foundation.dart';\nimport 'package:flutter/gestures.dart';\n\nclass ImmediateTapGestureRecognizer extends OneSequenceGestureRecognizer {\n  ImmediateTapGestureRecognizer({\n    super.debugOwner,\n    super.supportedDevices,\n    super.allowedButtonsFilter = _defaultButtonAcceptBehavior,\n    this.onTapDown,\n    this.onTapUp,\n    this.onTapCancel,\n    this.onTap,\n  });\n\n  static bool _defaultButtonAcceptBehavior(int buttons) =>\n      buttons == kPrimaryButton;\n\n  GestureTapDownCallback? onTapDown;\n\n  GestureTapUpCallback? onTapUp;\n\n  GestureTapCancelCallback? onTapCancel;\n\n  GestureTapCallback? onTap;\n\n  PointerUpEvent? _up;\n  int? _activePointer;\n  bool _sentTapDown = false;\n  bool _wonArena = false;\n  Offset? _initialPosition;\n\n  @override\n  bool isPointerPanZoomAllowed(PointerPanZoomStartEvent event) => false;\n\n  @override\n  bool isPointerAllowed(PointerDownEvent event) =>\n      _activePointer == null && super.isPointerAllowed(event);\n\n  @override\n  void addAllowedPointer(PointerDownEvent event) {\n    super.addAllowedPointer(event);\n    _reset(event.pointer);\n    _handleTapDown(event);\n    _initialPosition = event.position;\n  }\n\n  @override\n  void handleEvent(PointerEvent event) {\n    if (event.pointer != _activePointer) {\n      resolvePointer(event.pointer, GestureDisposition.rejected);\n      stopTrackingPointer(event.pointer);\n      return;\n    }\n\n    if (event is PointerMoveEvent) {\n      _handlePointerMove(event);\n    } else if (event is PointerUpEvent) {\n      _up = event;\n      _handlePointerUp(event);\n    } else if (event is PointerCancelEvent) {\n      resolve(GestureDisposition.rejected);\n    }\n\n    stopTrackingIfPointerNoLongerDown(event);\n  }\n\n  void _handleTapDown(PointerDownEvent event) {\n    if (_sentTapDown) return;\n    _sentTapDown = true;\n\n    if (onTapDown != null) {\n      final details = TapDownDetails(\n        globalPosition: event.position,\n        localPosition: event.localPosition,\n        kind: event.kind,\n      );\n      invokeCallback<void>('onTapDown', () => onTapDown!(details));\n    }\n  }\n\n  void _handlePointerMove(PointerMoveEvent event) {\n    if ((event.position - _initialPosition!).distanceSquared > 4.0) {\n      resolve(GestureDisposition.rejected);\n      stopTrackingPointer(event.pointer);\n    }\n  }\n\n  void _handlePointerUp(PointerUpEvent event) {\n    if (_wonArena) {\n      _handleTapUp(event);\n    }\n  }\n\n  void _handleTapUp(PointerUpEvent event) {\n    if (onTapUp != null) {\n      final details = TapUpDetails(\n        globalPosition: event.position,\n        localPosition: event.localPosition,\n        kind: event.kind,\n      );\n      invokeCallback<void>('onTapUp', () => onTapUp!(details));\n    }\n\n    if (onTap != null) {\n      invokeCallback<void>('onTap', onTap!);\n    }\n\n    _reset();\n  }\n\n  void _cancelGesture(String reason) {\n    if (_sentTapDown && onTapCancel != null) {\n      invokeCallback<void>('onTapCancel: $reason', onTapCancel!);\n    }\n    _reset();\n  }\n\n  void _reset([int? pointer]) {\n    _activePointer = pointer;\n    _up = null;\n    _sentTapDown = false;\n    _wonArena = false;\n  }\n\n  @override\n  void acceptGesture(int pointer) {\n    super.acceptGesture(pointer);\n\n    if (pointer == _activePointer) {\n      _wonArena = true;\n\n      if (_up != null) {\n        _handleTapUp(_up!);\n      }\n    }\n  }\n\n  @override\n  void rejectGesture(int pointer) {\n    super.rejectGesture(pointer);\n\n    if (pointer == _activePointer) {\n      _cancelGesture('gesture rejected by arena');\n      stopTrackingPointer(pointer);\n    }\n  }\n\n  @override\n  void didStopTrackingLastPointer(int pointer) {\n    _initialPosition = null;\n  }\n\n  @override\n  String get debugDescription => 'immediate tap';\n\n  @override\n  void debugFillProperties(DiagnosticPropertiesBuilder properties) {\n    super.debugFillProperties(properties);\n    properties\n      ..add(IntProperty('activePointer', _activePointer))\n      ..add(\n        FlagProperty(\n          'sentTapDown',\n          value: _sentTapDown,\n          ifTrue: 'has sentTapDown',\n        ),\n      )\n      ..add(FlagProperty('wonArena', value: _wonArena, ifTrue: 'wonArena'))\n      ..add(\n        DiagnosticsProperty<PointerUpEvent>(\n          'pointerUpEvent',\n          _up,\n          defaultValue: null,\n        ),\n      );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/gesture/mouse_interactive_viewer.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'dart:io' show Platform;\nimport 'dart:math' as math;\n\nimport 'package:flutter/foundation.dart' show clampDouble;\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/physics.dart';\nimport 'package:flutter/rendering.dart';\nimport 'package:flutter/services.dart';\nimport 'package:vector_math/vector_math_64.dart' show Quad, Vector3;\n\nclass MouseInteractiveViewer extends StatefulWidget {\n  const MouseInteractiveViewer({\n    super.key,\n    this.clipBehavior = Clip.hardEdge,\n    this.panAxis = PanAxis.free,\n    this.boundaryMargin = EdgeInsets.zero,\n    this.constrained = true,\n    this.maxScale = 2.5,\n    this.minScale = 0.8,\n    this.interactionEndFrictionCoefficient = _kDrag,\n    this.pointerSignalFallback,\n    this.onPointerPanZoomUpdate,\n    this.onPointerPanZoomEnd,\n    this.onPointerDown,\n    this.onInteractionEnd,\n    this.onInteractionStart,\n    this.onInteractionUpdate,\n    this.panEnabled = true,\n    this.scaleEnabled = true,\n    this.scaleFactor = kDefaultMouseScrollToScaleFactor,\n    this.transformationController,\n    this.alignment,\n    this.trackpadScrollCausesScale = false,\n    required this.childKey,\n    required this.child,\n    required this.onTranslate,\n  }) : assert(minScale > 0),\n       assert(interactionEndFrictionCoefficient > 0),\n       assert(maxScale > 0),\n       assert(maxScale >= minScale);\n\n  final Alignment? alignment;\n  final Clip clipBehavior;\n  final PanAxis panAxis;\n  final EdgeInsets boundaryMargin;\n  final Widget child;\n  final bool constrained;\n  final bool panEnabled;\n  final bool scaleEnabled;\n  final bool trackpadScrollCausesScale;\n  final double scaleFactor;\n  final double maxScale;\n  final double minScale;\n  final double interactionEndFrictionCoefficient;\n  final PointerSignalEventListener? pointerSignalFallback;\n  final PointerPanZoomUpdateEventListener? onPointerPanZoomUpdate;\n  final PointerPanZoomEndEventListener? onPointerPanZoomEnd;\n  final PointerDownEventListener? onPointerDown;\n  final GestureScaleEndCallback? onInteractionEnd;\n  final GestureScaleStartCallback? onInteractionStart;\n  final GestureScaleUpdateCallback? onInteractionUpdate;\n  final TransformationController? transformationController;\n  final GlobalKey childKey;\n  final VoidCallback onTranslate;\n\n  static const double _kDrag = 0.0000135;\n\n  @override\n  State<MouseInteractiveViewer> createState() => _MouseInteractiveViewerState();\n}\n\nclass _MouseInteractiveViewerState extends State<MouseInteractiveViewer>\n    with TickerProviderStateMixin {\n  late TransformationController _transformer =\n      widget.transformationController ?? TransformationController();\n\n  final GlobalKey _parentKey = GlobalKey();\n  Animation<Offset>? _animation;\n  Animation<double>? _scaleAnimation;\n  late Offset _scaleAnimationFocalPoint;\n  late AnimationController _controller;\n  late AnimationController _scaleController;\n  Axis? _currentAxis;\n  Offset? _referenceFocalPoint;\n  double? _scaleStart;\n  double? _rotationStart = 0.0;\n  double _currentRotation = 0.0;\n  _GestureType? _gestureType;\n\n  static final gestureSettings = DeviceGestureSettings(\n    touchSlop: Platform.isIOS ? 9 : 4,\n  );\n\n  late final ScaleGestureRecognizer _scaleGestureRecognizer;\n\n  final bool _rotateEnabled = false;\n\n  Rect get _boundaryRect {\n    assert(widget.childKey.currentContext != null);\n    final RenderBox childRenderBox =\n        widget.childKey.currentContext!.findRenderObject()! as RenderBox;\n    final Size childSize = childRenderBox.size;\n    final Rect boundaryRect = widget.boundaryMargin.inflateRect(\n      Offset.zero & childSize,\n    );\n    assert(\n      !boundaryRect.isEmpty,\n      \"InteractiveViewer's child must have nonzero dimensions.\",\n    );\n    assert(\n      boundaryRect.isFinite ||\n          (boundaryRect.left.isInfinite &&\n              boundaryRect.top.isInfinite &&\n              boundaryRect.right.isInfinite &&\n              boundaryRect.bottom.isInfinite),\n      'boundaryRect must either be infinite in all directions or finite in all directions.',\n    );\n    return boundaryRect;\n  }\n\n  Rect get _viewport {\n    assert(_parentKey.currentContext != null);\n    final RenderBox parentRenderBox =\n        _parentKey.currentContext!.findRenderObject()! as RenderBox;\n    return Offset.zero & parentRenderBox.size;\n  }\n\n  Matrix4 _matrixTranslate(Matrix4 matrix, Offset translation) {\n    if (translation == Offset.zero) {\n      return matrix.clone();\n    }\n\n    final Offset alignedTranslation;\n\n    if (_currentAxis != null) {\n      alignedTranslation = switch (widget.panAxis) {\n        PanAxis.horizontal => _alignAxis(translation, Axis.horizontal),\n        PanAxis.vertical => _alignAxis(translation, Axis.vertical),\n        PanAxis.aligned => _alignAxis(translation, _currentAxis!),\n        PanAxis.free => translation,\n      };\n    } else {\n      alignedTranslation = translation;\n    }\n\n    final Matrix4 nextMatrix = matrix.clone()\n      ..translateByDouble(alignedTranslation.dx, alignedTranslation.dy, 0, 1);\n\n    final Quad nextViewport = _transformViewport(nextMatrix, _viewport);\n\n    if (_boundaryRect.isInfinite) {\n      return nextMatrix;\n    }\n\n    final Quad boundariesAabbQuad = _getAxisAlignedBoundingBoxWithRotation(\n      _boundaryRect,\n      _currentRotation,\n    );\n\n    final Offset offendingDistance = _exceedsBy(\n      boundariesAabbQuad,\n      nextViewport,\n    );\n    if (offendingDistance == Offset.zero) {\n      return nextMatrix;\n    }\n\n    final Offset nextTotalTranslation = _getMatrixTranslation(nextMatrix);\n    final double currentScale = matrix.getMaxScaleOnAxis();\n    final Offset correctedTotalTranslation = Offset(\n      nextTotalTranslation.dx - offendingDistance.dx * currentScale,\n      nextTotalTranslation.dy - offendingDistance.dy * currentScale,\n    );\n    final Matrix4 correctedMatrix = matrix.clone()\n      ..setTranslation(\n        Vector3(\n          correctedTotalTranslation.dx,\n          correctedTotalTranslation.dy,\n          0.0,\n        ),\n      );\n\n    final Quad correctedViewport = _transformViewport(\n      correctedMatrix,\n      _viewport,\n    );\n    final Offset offendingCorrectedDistance = _exceedsBy(\n      boundariesAabbQuad,\n      correctedViewport,\n    );\n    if (offendingCorrectedDistance == Offset.zero) {\n      return correctedMatrix;\n    }\n\n    if (offendingCorrectedDistance.dx != 0.0 &&\n        offendingCorrectedDistance.dy != 0.0) {\n      return matrix.clone();\n    }\n\n    final Offset unidirectionalCorrectedTotalTranslation = Offset(\n      offendingCorrectedDistance.dx == 0.0 ? correctedTotalTranslation.dx : 0.0,\n      offendingCorrectedDistance.dy == 0.0 ? correctedTotalTranslation.dy : 0.0,\n    );\n    return matrix.clone()..setTranslation(\n      Vector3(\n        unidirectionalCorrectedTotalTranslation.dx,\n        unidirectionalCorrectedTotalTranslation.dy,\n        0.0,\n      ),\n    );\n  }\n\n  Matrix4 _matrixScale(Matrix4 matrix, double scale) {\n    if (scale == 1.0) {\n      return matrix.clone();\n    }\n    assert(scale != 0.0);\n\n    final double currentScale = _transformer.value.getMaxScaleOnAxis();\n    final double totalScale = math.max(\n      currentScale * scale,\n      math.max(\n        _viewport.width / _boundaryRect.width,\n        _viewport.height / _boundaryRect.height,\n      ),\n    );\n    final double clampedTotalScale = clampDouble(\n      totalScale,\n      widget.minScale,\n      widget.maxScale,\n    );\n    final double clampedScale = clampedTotalScale / currentScale;\n    return matrix.clone()\n      ..scaleByDouble(clampedScale, clampedScale, clampedScale, 1);\n  }\n\n  Matrix4 _matrixRotate(Matrix4 matrix, double rotation, Offset focalPoint) {\n    if (rotation == 0) {\n      return matrix.clone();\n    }\n    final Offset focalPointScene = _transformer.toScene(focalPoint);\n    return matrix.clone()\n      ..translateByDouble(focalPointScene.dx, focalPointScene.dy, 0, 1)\n      ..rotateZ(-rotation)\n      ..translateByDouble(-focalPointScene.dx, -focalPointScene.dy, 0, 1);\n  }\n\n  bool _gestureIsSupported(_GestureType? gestureType) {\n    return switch (gestureType) {\n      _GestureType.rotate => _rotateEnabled,\n      _GestureType.scale => widget.scaleEnabled,\n      _GestureType.pan || null => widget.panEnabled,\n    };\n  }\n\n  _GestureType _getGestureType(ScaleUpdateDetails details) {\n    final double scale = !widget.scaleEnabled ? 1.0 : details.scale;\n    final double rotation = !_rotateEnabled ? 0.0 : details.rotation;\n    if ((scale - 1).abs() > rotation.abs()) {\n      return _GestureType.scale;\n    } else if (rotation != 0.0) {\n      return _GestureType.rotate;\n    } else {\n      return _GestureType.pan;\n    }\n  }\n\n  // Handle the start of a gesture. All of pan, scale, and rotate are handled\n  // with GestureDetector's scale gesture.\n  void _onScaleStart(ScaleStartDetails details) {\n    widget.onInteractionStart?.call(details);\n\n    if (_controller.isAnimating) {\n      _controller\n        ..stop()\n        ..reset();\n      _animation?.removeListener(_handleInertiaAnimation);\n      _animation = null;\n    }\n    if (_scaleController.isAnimating) {\n      _scaleController\n        ..stop()\n        ..reset();\n      _scaleAnimation?.removeListener(_handleScaleAnimation);\n      _scaleAnimation = null;\n    }\n\n    _gestureType = null;\n    _currentAxis = null;\n    _scaleStart = _transformer.value.getMaxScaleOnAxis();\n    _referenceFocalPoint = _transformer.toScene(details.localFocalPoint);\n    _rotationStart = _currentRotation;\n  }\n\n  // Handle an update to an ongoing gesture. All of pan, scale, and rotate are\n  // handled with GestureDetector's scale gesture.\n  void _onScaleUpdate(ScaleUpdateDetails details) {\n    final double scale = _transformer.value.getMaxScaleOnAxis();\n    _scaleAnimationFocalPoint = details.localFocalPoint;\n    final Offset focalPointScene = _transformer.toScene(\n      details.localFocalPoint,\n    );\n\n    if (_gestureType == _GestureType.pan) {\n      // When a gesture first starts, it sometimes has no change in scale and\n      // rotation despite being a two-finger gesture. Here the gesture is\n      // allowed to be reinterpreted as its correct type after originally\n      // being marked as a pan.\n      _gestureType = _getGestureType(details);\n    } else {\n      _gestureType ??= _getGestureType(details);\n    }\n    if (!_gestureIsSupported(_gestureType)) {\n      widget.onInteractionUpdate?.call(details);\n      return;\n    }\n\n    switch (_gestureType!) {\n      case _GestureType.scale:\n        assert(_scaleStart != null);\n        // details.scale gives us the amount to change the scale as of the\n        // start of this gesture, so calculate the amount to scale as of the\n        // previous call to _onScaleUpdate.\n        final double desiredScale = _scaleStart! * details.scale;\n        final double scaleChange = desiredScale / scale;\n        _transformer.value = _matrixScale(_transformer.value, scaleChange);\n\n        // While scaling, translate such that the user's two fingers stay on\n        // the same places in the scene. That means that the focal point of\n        // the scale should be on the same place in the scene before and after\n        // the scale.\n        final Offset focalPointSceneScaled = _transformer.toScene(\n          details.localFocalPoint,\n        );\n        _transformer.value = _matrixTranslate(\n          _transformer.value,\n          focalPointSceneScaled - _referenceFocalPoint!,\n        );\n\n        // details.localFocalPoint should now be at the same location as the\n        // original _referenceFocalPoint point. If it's not, that's because\n        // the translate came in contact with a boundary. In that case, update\n        // _referenceFocalPoint so subsequent updates happen in relation to\n        // the new effective focal point.\n        final Offset focalPointSceneCheck = _transformer.toScene(\n          details.localFocalPoint,\n        );\n        if (_round(_referenceFocalPoint!) != _round(focalPointSceneCheck)) {\n          _referenceFocalPoint = focalPointSceneCheck;\n        }\n\n      case _GestureType.rotate:\n        if (details.rotation == 0.0) {\n          widget.onInteractionUpdate?.call(details);\n          return;\n        }\n        final double desiredRotation = _rotationStart! + details.rotation;\n        _transformer.value = _matrixRotate(\n          _transformer.value,\n          _currentRotation - desiredRotation,\n          details.localFocalPoint,\n        );\n        _currentRotation = desiredRotation;\n\n      case _GestureType.pan:\n        assert(_referenceFocalPoint != null);\n        // details may have a change in scale here when scaleEnabled is false.\n        // In an effort to keep the behavior similar whether or not scaleEnabled\n        // is true, these gestures are thrown away.\n        if (details.scale != 1.0) {\n          widget.onInteractionUpdate?.call(details);\n          return;\n        }\n        _currentAxis ??= _getPanAxis(_referenceFocalPoint!, focalPointScene);\n        // Translate so that the same point in the scene is underneath the\n        // focal point before and after the movement.\n        final Offset translationChange =\n            focalPointScene - _referenceFocalPoint!;\n        _transformer.value = _matrixTranslate(\n          _transformer.value,\n          translationChange,\n        );\n        _referenceFocalPoint = _transformer.toScene(details.localFocalPoint);\n    }\n    widget.onInteractionUpdate?.call(details);\n  }\n\n  // Handle the end of a gesture of _GestureType. All of pan, scale, and rotate\n  // are handled with GestureDetector's scale gesture.\n  void _onScaleEnd(ScaleEndDetails details) {\n    widget.onInteractionEnd?.call(details);\n    _scaleStart = null;\n    _rotationStart = null;\n    _referenceFocalPoint = null;\n\n    _animation?.removeListener(_handleInertiaAnimation);\n    _scaleAnimation?.removeListener(_handleScaleAnimation);\n    _controller.reset();\n    _scaleController.reset();\n\n    if (!_gestureIsSupported(_gestureType)) {\n      _currentAxis = null;\n      return;\n    }\n\n    switch (_gestureType) {\n      case _GestureType.pan:\n        if (details.velocity.pixelsPerSecond.distance < kMinFlingVelocity) {\n          _currentAxis = null;\n          return;\n        }\n        final Vector3 translationVector = _transformer.value.getTranslation();\n        final Offset translation = Offset(\n          translationVector.x,\n          translationVector.y,\n        );\n        final FrictionSimulation frictionSimulationX = FrictionSimulation(\n          widget.interactionEndFrictionCoefficient,\n          translation.dx,\n          details.velocity.pixelsPerSecond.dx,\n        );\n        final FrictionSimulation frictionSimulationY = FrictionSimulation(\n          widget.interactionEndFrictionCoefficient,\n          translation.dy,\n          details.velocity.pixelsPerSecond.dy,\n        );\n        final double tFinal = _getFinalTime(\n          details.velocity.pixelsPerSecond.distance,\n          widget.interactionEndFrictionCoefficient,\n        );\n        _animation = _controller.drive(\n          Tween<Offset>(\n            begin: translation,\n            end: Offset(\n              frictionSimulationX.finalX,\n              frictionSimulationY.finalX,\n            ),\n          ).chain(CurveTween(curve: Curves.decelerate)),\n        )..addListener(_handleInertiaAnimation);\n        _controller\n          ..duration = Duration(milliseconds: (tFinal * 1000).round())\n          ..forward();\n      case _GestureType.scale:\n        if (details.scaleVelocity.abs() < 0.1) {\n          _currentAxis = null;\n          return;\n        }\n        final double scale = _transformer.value.getMaxScaleOnAxis();\n        final FrictionSimulation frictionSimulation = FrictionSimulation(\n          widget.interactionEndFrictionCoefficient * widget.scaleFactor,\n          scale,\n          details.scaleVelocity / 10,\n        );\n        final double tFinal = _getFinalTime(\n          details.scaleVelocity.abs(),\n          widget.interactionEndFrictionCoefficient,\n          effectivelyMotionless: 0.1,\n        );\n        _scaleAnimation = _scaleController.drive(\n          Tween<double>(\n            begin: scale,\n            end: frictionSimulation.x(tFinal),\n          ).chain(CurveTween(curve: Curves.decelerate)),\n        )..addListener(_handleScaleAnimation);\n        _scaleController\n          ..duration = Duration(milliseconds: (tFinal * 1000).round())\n          ..forward();\n      case _GestureType.rotate || null:\n        break;\n    }\n  }\n\n  void _receivedPointerSignal(PointerSignalEvent event) {\n    final Offset local = event.localPosition;\n    final Offset global = event.position;\n    final double scaleChange;\n    if (event is PointerScrollEvent) {\n      if (event.kind == PointerDeviceKind.trackpad) {\n        widget.onInteractionStart?.call(\n          ScaleStartDetails(focalPoint: global, localFocalPoint: local),\n        );\n\n        final Offset localDelta = PointerEvent.transformDeltaViaPositions(\n          untransformedEndPosition: global + event.scrollDelta,\n          untransformedDelta: event.scrollDelta,\n          transform: event.transform,\n        );\n\n        final Offset focalPointScene = _transformer.toScene(local);\n        final Offset newFocalPointScene = _transformer.toScene(\n          local - localDelta,\n        );\n\n        _transformer.value = _matrixTranslate(\n          _transformer.value,\n          newFocalPointScene - focalPointScene,\n        );\n\n        widget.onInteractionUpdate?.call(\n          ScaleUpdateDetails(\n            focalPoint: global - event.scrollDelta,\n            localFocalPoint: local - localDelta,\n            focalPointDelta: -localDelta,\n          ),\n        );\n        widget.onInteractionEnd?.call(ScaleEndDetails());\n        return;\n      }\n      _handlePointerScrollEvent(event);\n      return;\n    } else if (event is PointerScaleEvent) {\n      scaleChange = event.scale;\n    } else {\n      return;\n    }\n    widget.onInteractionStart?.call(\n      ScaleStartDetails(focalPoint: global, localFocalPoint: local),\n    );\n\n    if (!_gestureIsSupported(_GestureType.scale)) {\n      widget.onInteractionUpdate?.call(\n        ScaleUpdateDetails(\n          focalPoint: global,\n          localFocalPoint: local,\n          scale: scaleChange,\n        ),\n      );\n      widget.onInteractionEnd?.call(ScaleEndDetails());\n      return;\n    }\n\n    final Offset focalPointScene = _transformer.toScene(local);\n    _transformer.value = _matrixScale(_transformer.value, scaleChange);\n\n    // After scaling, translate such that the event's position is at the\n    // same scene point before and after the scale.\n    final Offset focalPointSceneScaled = _transformer.toScene(local);\n    _transformer.value = _matrixTranslate(\n      _transformer.value,\n      focalPointSceneScaled - focalPointScene,\n    );\n\n    widget.onInteractionUpdate?.call(\n      ScaleUpdateDetails(\n        focalPoint: global,\n        localFocalPoint: local,\n        scale: scaleChange,\n      ),\n    );\n    widget.onInteractionEnd?.call(ScaleEndDetails());\n  }\n\n  void _handlePointerScrollEvent(PointerScrollEvent event) {\n    final Offset local = event.localPosition;\n    final Offset global = event.position;\n\n    if (_gestureIsSupported(_GestureType.scale)) {\n      if (HardwareKeyboard.instance.isControlPressed) {\n        _handleMouseWheelScale(event, local, global);\n        return;\n      }\n      final shift = HardwareKeyboard.instance.isShiftPressed;\n      if (shift || HardwareKeyboard.instance.isAltPressed) {\n        _handleMouseWheelPanAsScale(event, local, global, shift);\n        return;\n      }\n      widget.pointerSignalFallback?.call(event);\n    }\n    widget.onInteractionUpdate?.call(\n      ScaleUpdateDetails(\n        focalPoint: global,\n        localFocalPoint: local,\n        scale: math.exp(-event.scrollDelta.dy / widget.scaleFactor),\n      ),\n    );\n    widget.onInteractionEnd?.call(ScaleEndDetails());\n  }\n\n  void _handleMouseWheelScale(\n    PointerScrollEvent event,\n    Offset local,\n    Offset global,\n  ) {\n    final double scaleChange = math.exp(\n      -event.scrollDelta.dy / widget.scaleFactor,\n    );\n    final Offset focalPointScene = _transformer.toScene(local);\n    _transformer.value = _matrixScale(_transformer.value, scaleChange);\n\n    final Offset focalPointSceneScaled = _transformer.toScene(local);\n    _transformer.value = _matrixTranslate(\n      _transformer.value,\n      focalPointSceneScaled - focalPointScene,\n    );\n\n    widget.onInteractionUpdate?.call(\n      ScaleUpdateDetails(\n        focalPoint: global,\n        localFocalPoint: local,\n        scale: scaleChange,\n      ),\n    );\n    widget.onInteractionEnd?.call(ScaleEndDetails());\n  }\n\n  void _handleMouseWheelPanAsScale(\n    PointerScrollEvent event,\n    Offset local,\n    Offset global,\n    bool flip,\n  ) {\n    final Offset translation = flip\n        ? event.scrollDelta.flip\n        : event.scrollDelta;\n\n    final Offset focalPointScene = _transformer.toScene(local);\n    final Offset newFocalPointScene = _transformer.toScene(local - translation);\n\n    _transformer.value = _matrixTranslate(\n      _transformer.value,\n      newFocalPointScene - focalPointScene,\n    );\n\n    widget.onTranslate();\n  }\n\n  void _handleInertiaAnimation() {\n    if (!_controller.isAnimating) {\n      _currentAxis = null;\n      _animation?.removeListener(_handleInertiaAnimation);\n      _animation = null;\n      _controller.reset();\n      return;\n    }\n    final Vector3 translationVector = _transformer.value.getTranslation();\n    final Offset translation = Offset(translationVector.x, translationVector.y);\n    _transformer.value = _matrixTranslate(\n      _transformer.value,\n      _transformer.toScene(_animation!.value) -\n          _transformer.toScene(translation),\n    );\n  }\n\n  void _handleScaleAnimation() {\n    if (!_scaleController.isAnimating) {\n      _currentAxis = null;\n      _scaleAnimation?.removeListener(_handleScaleAnimation);\n      _scaleAnimation = null;\n      _scaleController.reset();\n      return;\n    }\n    final double desiredScale = _scaleAnimation!.value;\n    final double scaleChange =\n        desiredScale / _transformer.value.getMaxScaleOnAxis();\n    final Offset referenceFocalPoint = _transformer.toScene(\n      _scaleAnimationFocalPoint,\n    );\n    _transformer.value = _matrixScale(_transformer.value, scaleChange);\n\n    final Offset focalPointSceneScaled = _transformer.toScene(\n      _scaleAnimationFocalPoint,\n    );\n    _transformer.value = _matrixTranslate(\n      _transformer.value,\n      focalPointSceneScaled - referenceFocalPoint,\n    );\n  }\n\n  void _handleTransformation() {\n    setState(() {});\n  }\n\n  void _onPointerDown(PointerDownEvent event) {\n    widget.onPointerDown?.call(event);\n    _scaleGestureRecognizer.addPointer(event);\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    _scaleGestureRecognizer =\n        ScaleGestureRecognizer(\n            debugOwner: this,\n            dragStartBehavior: .start,\n            allowedButtonsFilter: (buttons) => buttons == kPrimaryButton,\n            trackpadScrollToScaleFactor: Offset(0, -1 / widget.scaleFactor),\n            trackpadScrollCausesScale: widget.trackpadScrollCausesScale,\n          )\n          ..gestureSettings = gestureSettings\n          ..onStart = _onScaleStart\n          ..onUpdate = _onScaleUpdate\n          ..onEnd = _onScaleEnd;\n    _controller = AnimationController(vsync: this);\n    _scaleController = AnimationController(vsync: this);\n\n    _transformer.addListener(_handleTransformation);\n  }\n\n  @override\n  void didUpdateWidget(MouseInteractiveViewer oldWidget) {\n    super.didUpdateWidget(oldWidget);\n\n    final TransformationController? newController =\n        widget.transformationController;\n    if (newController == oldWidget.transformationController) {\n      return;\n    }\n    _transformer.removeListener(_handleTransformation);\n    if (oldWidget.transformationController == null) {\n      _transformer.dispose();\n    }\n    _transformer = newController ?? TransformationController();\n    _transformer.addListener(_handleTransformation);\n  }\n\n  @override\n  void dispose() {\n    _scaleGestureRecognizer.dispose();\n    _controller.dispose();\n    _scaleController.dispose();\n    _transformer.removeListener(_handleTransformation);\n    if (widget.transformationController == null) {\n      _transformer.dispose();\n    }\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    assert(widget.child.key == widget.childKey);\n\n    return Listener(\n      key: _parentKey,\n      behavior: HitTestBehavior.opaque,\n      onPointerSignal: _receivedPointerSignal,\n      onPointerDown: _onPointerDown,\n      onPointerPanZoomStart: _scaleGestureRecognizer.addPointerPanZoom,\n      onPointerPanZoomUpdate: widget.onPointerPanZoomUpdate,\n      onPointerPanZoomEnd: widget.onPointerPanZoomEnd,\n      child: _InteractiveViewerBuilt(\n        childKey: widget.childKey,\n        clipBehavior: widget.clipBehavior,\n        constrained: widget.constrained,\n        matrix: _transformer.value,\n        alignment: widget.alignment,\n        child: widget.child,\n      ),\n    );\n  }\n}\n\nclass _InteractiveViewerBuilt extends StatelessWidget {\n  const _InteractiveViewerBuilt({\n    required this.child,\n    required this.childKey,\n    required this.clipBehavior,\n    required this.constrained,\n    required this.matrix,\n    required this.alignment,\n  });\n\n  final Widget child;\n  final GlobalKey childKey;\n  final Clip clipBehavior;\n  final bool constrained;\n  final Matrix4 matrix;\n  final Alignment? alignment;\n\n  @override\n  Widget build(BuildContext context) {\n    Widget child = Transform(\n      transform: matrix,\n      alignment: alignment,\n      child: this.child,\n    );\n\n    if (!constrained) {\n      child = OverflowBox(\n        alignment: Alignment.topLeft,\n        minWidth: 0.0,\n        minHeight: 0.0,\n        maxWidth: double.infinity,\n        maxHeight: double.infinity,\n        child: child,\n      );\n    }\n\n    if (clipBehavior != Clip.none) {\n      child = ClipRect(clipBehavior: clipBehavior, child: child);\n    }\n\n    return child;\n  }\n}\n\nenum _GestureType { pan, scale, rotate }\n\ndouble _getFinalTime(\n  double velocity,\n  double drag, {\n  double effectivelyMotionless = 10,\n}) {\n  return math.log(effectivelyMotionless / velocity) / math.log(drag / 100);\n}\n\nOffset _getMatrixTranslation(Matrix4 matrix) {\n  final Vector3 nextTranslation = matrix.getTranslation();\n  return Offset(nextTranslation.x, nextTranslation.y);\n}\n\nQuad _transformViewport(Matrix4 matrix, Rect viewport) {\n  final Matrix4 inverseMatrix = matrix.clone()..invert();\n  return Quad.points(\n    inverseMatrix.transform3(\n      Vector3(viewport.topLeft.dx, viewport.topLeft.dy, 0.0),\n    ),\n    inverseMatrix.transform3(\n      Vector3(viewport.topRight.dx, viewport.topRight.dy, 0.0),\n    ),\n    inverseMatrix.transform3(\n      Vector3(viewport.bottomRight.dx, viewport.bottomRight.dy, 0.0),\n    ),\n    inverseMatrix.transform3(\n      Vector3(viewport.bottomLeft.dx, viewport.bottomLeft.dy, 0.0),\n    ),\n  );\n}\n\nQuad _getAxisAlignedBoundingBoxWithRotation(Rect rect, double rotation) {\n  final Matrix4 rotationMatrix = Matrix4.identity()\n    ..translateByDouble(rect.size.width / 2, rect.size.height / 2, 0, 1)\n    ..rotateZ(rotation)\n    ..translateByDouble(-rect.size.width / 2, -rect.size.height / 2, 0, 1);\n  final Quad boundariesRotated = Quad.points(\n    rotationMatrix.transform3(Vector3(rect.left, rect.top, 0.0)),\n    rotationMatrix.transform3(Vector3(rect.right, rect.top, 0.0)),\n    rotationMatrix.transform3(Vector3(rect.right, rect.bottom, 0.0)),\n    rotationMatrix.transform3(Vector3(rect.left, rect.bottom, 0.0)),\n  );\n  // ignore: invalid_use_of_visible_for_testing_member\n  return InteractiveViewer.getAxisAlignedBoundingBox(boundariesRotated);\n}\n\nOffset _exceedsBy(Quad boundary, Quad viewport) {\n  final List<Vector3> viewportPoints = <Vector3>[\n    viewport.point0,\n    viewport.point1,\n    viewport.point2,\n    viewport.point3,\n  ];\n  Offset largestExcess = Offset.zero;\n  for (final Vector3 point in viewportPoints) {\n    // ignore: invalid_use_of_visible_for_testing_member\n    final Vector3 pointInside = InteractiveViewer.getNearestPointInside(\n      point,\n      boundary,\n    );\n    final Offset excess = Offset(\n      pointInside.x - point.x,\n      pointInside.y - point.y,\n    );\n    if (excess.dx.abs() > largestExcess.dx.abs()) {\n      largestExcess = Offset(excess.dx, largestExcess.dy);\n    }\n    if (excess.dy.abs() > largestExcess.dy.abs()) {\n      largestExcess = Offset(largestExcess.dx, excess.dy);\n    }\n  }\n\n  return _round(largestExcess);\n}\n\nOffset _round(Offset offset) {\n  return Offset(\n    double.parse(offset.dx.toStringAsFixed(9)),\n    double.parse(offset.dy.toStringAsFixed(9)),\n  );\n}\n\nOffset _alignAxis(Offset offset, Axis axis) {\n  return switch (axis) {\n    Axis.horizontal => Offset(offset.dx, 0.0),\n    Axis.vertical => Offset(0.0, offset.dy),\n  };\n}\n\nAxis? _getPanAxis(Offset point1, Offset point2) {\n  if (point1 == point2) {\n    return null;\n  }\n  final double x = point2.dx - point1.dx;\n  final double y = point2.dy - point1.dy;\n  return x.abs() > y.abs() ? Axis.horizontal : Axis.vertical;\n}\n\nextension on Offset {\n  Offset get flip => Offset(dy, dx);\n}\n"
  },
  {
    "path": "lib/common/widgets/gesture/tap_gesture_recognizer.dart",
    "content": "import 'package:flutter/gestures.dart' show TapGestureRecognizer;\n\nclass NoDeadlineTapGestureRecognizer extends TapGestureRecognizer {\n  NoDeadlineTapGestureRecognizer({\n    super.debugOwner,\n    super.supportedDevices,\n    super.allowedButtonsFilter,\n    super.preAcceptSlopTolerance,\n    super.postAcceptSlopTolerance,\n  });\n\n  @override\n  Duration? get deadline => null;\n}\n"
  },
  {
    "path": "lib/common/widgets/image/cached_network_svg_image.dart",
    "content": "// code from cached_network_svg_image;\n\nimport 'dart:developer';\n\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:flutter/scheduler.dart';\nimport 'package:flutter_cache_manager/flutter_cache_manager.dart';\nimport 'package:flutter_svg/flutter_svg.dart';\n\nclass CachedNetworkSVGImage extends StatefulWidget {\n  CachedNetworkSVGImage(\n    String url, {\n    Key? key,\n    String? cacheKey,\n    Widget? placeholder,\n    Widget? errorWidget,\n    double? width,\n    double? height,\n    Map<String, String>? headers,\n    BoxFit fit = BoxFit.contain,\n    AlignmentGeometry alignment = Alignment.center,\n    bool matchTextDirection = false,\n    bool allowDrawingOutsideViewBox = false,\n    String? semanticsLabel,\n    bool excludeFromSemantics = false,\n    SvgTheme theme = const SvgTheme(),\n    ColorFilter? colorFilter,\n    WidgetBuilder? placeholderBuilder,\n    BaseCacheManager? cacheManager,\n  }) : _url = url,\n       _cacheKey = cacheKey,\n       _placeholder = placeholder,\n       _errorWidget = errorWidget,\n       _width = width,\n       _height = height,\n       _headers = headers,\n       _fit = fit,\n       _alignment = alignment,\n       _matchTextDirection = matchTextDirection,\n       _allowDrawingOutsideViewBox = allowDrawingOutsideViewBox,\n       _semanticsLabel = semanticsLabel,\n       _excludeFromSemantics = excludeFromSemantics,\n       _theme = theme,\n       _colorFilter = colorFilter,\n       _placeholderBuilder = placeholderBuilder,\n       _cacheManager = cacheManager ?? DefaultCacheManager(),\n       super(key: key ?? ValueKey(cacheKey ?? url));\n\n  final String _url;\n  final String? _cacheKey;\n  final Widget? _placeholder;\n  final Widget? _errorWidget;\n  final double? _width;\n  final double? _height;\n  final Map<String, String>? _headers;\n  final BoxFit _fit;\n  final AlignmentGeometry _alignment;\n  final bool _matchTextDirection;\n  final bool _allowDrawingOutsideViewBox;\n  final String? _semanticsLabel;\n  final bool _excludeFromSemantics;\n  final SvgTheme _theme;\n  final ColorFilter? _colorFilter;\n  final WidgetBuilder? _placeholderBuilder;\n  final BaseCacheManager _cacheManager;\n\n  @override\n  State<CachedNetworkSVGImage> createState() => _CachedNetworkSVGImageState();\n\n  static String _generateKeyFromUrl(String url) => url.split('?').first;\n}\n\nclass _CachedNetworkSVGImageState extends State<CachedNetworkSVGImage> {\n  bool _isLoading = false;\n  bool _isError = false;\n  String? _svgString;\n  late final String _cacheKey;\n  double? height;\n  late TextScaler textScaler;\n\n  static final _sizeRegExp = RegExp(\n    r'height=\"([\\d\\.]+)([c-x]{2})?\"',\n  );\n\n  @override\n  void initState() {\n    super.initState();\n    _cacheKey =\n        widget._cacheKey ??\n        CachedNetworkSVGImage._generateKeyFromUrl(widget._url);\n    _loadImage();\n  }\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    textScaler = MediaQuery.textScalerOf(context);\n  }\n\n  Future<void> _loadImage() async {\n    try {\n      final file = await widget._cacheManager.getSingleFile(\n        widget._url,\n        key: _cacheKey,\n        headers: widget._headers ?? const {},\n      );\n      final svg = await file.readAsString();\n      _svgString = svg;\n      if (widget._width == null && widget._height == null) {\n        final match = _sizeRegExp.firstMatch(svg);\n        if (match != null) {\n          double h = double.parse(match.group(1)!);\n          final suffix = match.group(2);\n          if (suffix != null) {\n            h *= switch (suffix) {\n              'em' => textScaler.scale(widget._theme.fontSize),\n              'ex' => textScaler.scale(widget._theme.xHeight),\n              'pt' => 1.25,\n              'pc' => 15.0,\n              'mm' => 3.543307,\n              'cm' => 35.43307,\n              'in' => 90.0,\n              _ => 1.0,\n            };\n          }\n          height = h;\n        }\n      }\n\n      _isLoading = false;\n\n      _setState();\n    } catch (e) {\n      if (kDebugMode) log('CachedNetworkSVGImage: $e');\n\n      _isError = true;\n      _isLoading = false;\n\n      _setState();\n    }\n  }\n\n  void _setState() {\n    if (mounted) {\n      setState(() {});\n    } else {\n      SchedulerBinding.instance.addPostFrameCallback((_) {\n        if (mounted) {\n          setState(() {});\n        }\n      });\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return SizedBox(\n      width: widget._width,\n      height: widget._height,\n      child: _buildImage(),\n    );\n  }\n\n  Widget? _buildImage() {\n    if (_isLoading) return _buildPlaceholderWidget();\n\n    if (_isError) return _buildErrorWidget();\n\n    return _buildSVGImage();\n  }\n\n  Widget _buildPlaceholderWidget() => Center(child: widget._placeholder);\n\n  Widget _buildErrorWidget() => Center(child: widget._errorWidget);\n\n  Widget? _buildSVGImage() {\n    if (_svgString == null) {\n      return Center(child: widget._placeholderBuilder?.call(context));\n    }\n\n    return SvgPicture.string(\n      _svgString!,\n      fit: widget._fit,\n      width: widget._width,\n      height: widget._height ?? height,\n      alignment: widget._alignment,\n      matchTextDirection: widget._matchTextDirection,\n      allowDrawingOutsideViewBox: widget._allowDrawingOutsideViewBox,\n      semanticsLabel: widget._semanticsLabel,\n      excludeFromSemantics: widget._excludeFromSemantics,\n      colorFilter: widget._colorFilter,\n      placeholderBuilder: widget._placeholderBuilder,\n      theme: widget._theme,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/image/image_save.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/http/user.dart';\nimport 'package:PiliPlus/utils/image_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nvoid imageSaveDialog({\n  required String? title,\n  required String? cover,\n  dynamic aid,\n  String? bvid,\n}) {\n  final double imgWidth = MediaQuery.sizeOf(Get.context!).shortestSide - 16;\n  SmartDialog.show(\n    animationType: SmartAnimationType.centerScale_otherSlide,\n    builder: (context) {\n      const iconSize = 20.0;\n      final theme = Theme.of(context);\n      return Container(\n        width: imgWidth,\n        margin: const .symmetric(horizontal: StyleString.safeSpace),\n        decoration: BoxDecoration(\n          color: theme.colorScheme.surface,\n          borderRadius: StyleString.mdRadius,\n        ),\n        child: Column(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            Stack(\n              clipBehavior: Clip.none,\n              children: [\n                GestureDetector(\n                  onTap: SmartDialog.dismiss,\n                  child: NetworkImgLayer(\n                    src: cover,\n                    quality: 100,\n                    width: imgWidth,\n                    height: imgWidth / StyleString.aspectRatio16x9,\n                    borderRadius: const .vertical(top: StyleString.imgRadius),\n                  ),\n                ),\n                Positioned(\n                  right: 8,\n                  top: 8,\n                  width: 30,\n                  height: 30,\n                  child: IconButton(\n                    tooltip: '关闭',\n                    style: IconButton.styleFrom(\n                      padding: .zero,\n                      backgroundColor: Colors.black.withValues(alpha: 0.3),\n                    ),\n                    onPressed: SmartDialog.dismiss,\n                    icon: const Icon(\n                      Icons.close,\n                      size: 18,\n                      color: Colors.white,\n                    ),\n                  ),\n                ),\n              ],\n            ),\n            Padding(\n              padding: const EdgeInsets.fromLTRB(12, 10, 8, 10),\n              child: Row(\n                children: [\n                  if (title != null)\n                    Expanded(\n                      child: SelectableText(\n                        title,\n                        style: theme.textTheme.titleSmall,\n                      ),\n                    )\n                  else\n                    const Spacer(),\n                  if (aid != null || bvid != null)\n                    iconButton(\n                      iconSize: iconSize,\n                      tooltip: '稍后再看',\n                      onPressed: () => {\n                        SmartDialog.dismiss(),\n                        UserHttp.toViewLater(aid: aid, bvid: bvid),\n                      },\n                      icon: const Icon(Icons.watch_later_outlined),\n                    ),\n                  if (cover != null && cover.isNotEmpty) ...[\n                    if (PlatformUtils.isMobile)\n                      iconButton(\n                        iconSize: iconSize,\n                        tooltip: '分享',\n                        onPressed: () {\n                          SmartDialog.dismiss();\n                          ImageUtils.onShareImg(cover);\n                        },\n                        icon: const Icon(Icons.share),\n                      ),\n                    iconButton(\n                      iconSize: iconSize,\n                      tooltip: '保存封面图',\n                      onPressed: () async {\n                        bool saveStatus = await ImageUtils.downloadImg([cover]);\n                        if (saveStatus) {\n                          SmartDialog.dismiss();\n                        }\n                      },\n                      icon: const Icon(Icons.download),\n                    ),\n                  ],\n                ],\n              ),\n            ),\n          ],\n        ),\n      );\n    },\n  );\n}\n"
  },
  {
    "path": "lib/common/widgets/image/network_img_layer.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/image_utils.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:cached_network_image/cached_network_image.dart';\nimport 'package:flutter/material.dart';\n\nclass NetworkImgLayer extends StatelessWidget {\n  const NetworkImgLayer({\n    super.key,\n    required this.src,\n    required this.width,\n    required this.height,\n    this.type = .def,\n    this.fadeOutDuration = const Duration(milliseconds: 120),\n    this.fadeInDuration = const Duration(milliseconds: 120),\n    this.quality = 1,\n    this.borderRadius = StyleString.mdRadius,\n    this.getPlaceHolder,\n    this.fit = .cover,\n    this.alignment = .center,\n    this.cacheWidth,\n  });\n\n  final String? src;\n  final double width;\n  final double height;\n  final ImageType type;\n  final Duration fadeOutDuration;\n  final Duration fadeInDuration;\n  final int quality;\n  final BorderRadius borderRadius;\n  final ValueGetter<Widget>? getPlaceHolder;\n  final BoxFit fit;\n  final Alignment alignment;\n  final bool? cacheWidth;\n\n  static Color? reduceLuxColor = Pref.reduceLuxColor;\n  static bool reduce = false;\n\n  @override\n  Widget build(BuildContext context) {\n    final isEmote = type == ImageType.emote;\n    final isAvatar = type == ImageType.avatar;\n    if (src?.isNotEmpty == true) {\n      Widget child = _buildImage(context, isEmote: isEmote, isAvatar: isAvatar);\n      if (isEmote) {\n        return child;\n      } else if (isAvatar) {\n        return ClipOval(child: child);\n      } else {\n        return ClipRRect(borderRadius: borderRadius, child: child);\n      }\n    } else {\n      return getPlaceHolder?.call() ??\n          _placeholder(context, isEmote: isEmote, isAvatar: isAvatar);\n    }\n  }\n\n  Widget _buildImage(\n    BuildContext context, {\n    required bool isEmote,\n    required bool isAvatar,\n  }) {\n    int? memCacheWidth, memCacheHeight;\n    if (cacheWidth ?? width <= height) {\n      memCacheWidth = width.cacheSize(context);\n    } else {\n      memCacheHeight = height.cacheSize(context);\n    }\n    return CachedNetworkImage(\n      imageUrl: ImageUtils.thumbnailUrl(src, quality),\n      width: width,\n      height: height,\n      memCacheWidth: memCacheWidth,\n      memCacheHeight: memCacheHeight,\n      fit: fit,\n      alignment: alignment,\n      fadeOutDuration: fadeOutDuration,\n      fadeInDuration: fadeInDuration,\n      filterQuality: FilterQuality.low,\n      placeholder: (_, _) =>\n          getPlaceHolder?.call() ??\n          _placeholder(context, isEmote: isEmote, isAvatar: isAvatar),\n      errorWidget: (_, _, _) =>\n          _placeholder(context, isEmote: isEmote, isAvatar: isAvatar),\n      colorBlendMode: reduce ? BlendMode.modulate : null,\n      color: reduce ? reduceLuxColor : null,\n    );\n  }\n\n  Widget _placeholder(\n    BuildContext context, {\n    required bool isEmote,\n    required bool isAvatar,\n  }) {\n    return Container(\n      width: width,\n      height: height,\n      clipBehavior: isEmote ? Clip.none : Clip.antiAlias,\n      decoration: BoxDecoration(\n        shape: isAvatar ? BoxShape.circle : BoxShape.rectangle,\n        color: Theme.of(\n          context,\n        ).colorScheme.onInverseSurface.withValues(alpha: 0.4),\n        borderRadius: isEmote || isAvatar ? null : borderRadius,\n      ),\n      child: Center(\n        child: Image.asset(\n          isAvatar ? 'assets/images/noface.jpeg' : 'assets/images/loading.png',\n          width: width,\n          height: height,\n          cacheWidth: width.cacheSize(context),\n          colorBlendMode: reduce ? BlendMode.modulate : null,\n          color: reduce ? reduceLuxColor : null,\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/image_grid/image_grid_builder.dart",
    "content": "/*\n * This file is part of PiliPlus\n *\n * PiliPlus 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 * PiliPlus 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 PiliPlus.  If not, see <https://www.gnu.org/licenses/>.\n */\n\nimport 'dart:collection' show HashSet;\nimport 'dart:math' as math;\n\nimport 'package:PiliPlus/common/constants.dart' show StyleString;\nimport 'package:PiliPlus/common/widgets/image_grid/image_grid_view.dart'\n    show ImageModel;\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/gestures.dart'\n    show TapGestureRecognizer, LongPressGestureRecognizer;\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart'\n    show\n        ContainerRenderObjectMixin,\n        MultiChildLayoutParentData,\n        RenderBoxContainerDefaultsMixin,\n        RenderObjectWithLayoutCallbackMixin,\n        Constraints,\n        LayoutCallback,\n        BoxHitTestResult,\n        BoxHitTestEntry,\n        ContainerParentDataMixin,\n        InformationCollector,\n        DiagnosticsDebugCreator;\n\n/// ref [LayoutBuilder]\n\nconst space = 5.0;\ntypedef ImageGridInfo = ({int column, int row, Size size});\n\nclass ImageGridBuilder extends RenderObjectWidget {\n  const ImageGridBuilder({\n    super.key,\n    required this.picArr,\n    required this.onTap,\n    required this.onSecondaryTapUp,\n    required this.onLongPressStart,\n    required this.builder,\n  });\n\n  final List<ImageModel> picArr;\n  final ValueChanged<int> onTap;\n  final OnShowMenu? onSecondaryTapUp;\n  final OnShowMenu? onLongPressStart;\n  final List<Widget> Function(BuildContext context, ImageGridInfo imageGridInfo)\n  builder;\n\n  @protected\n  bool updateShouldRebuild(ImageGridBuilder oldWidget) => true;\n\n  @override\n  ImageGridRenderObjectElement createElement() =>\n      ImageGridRenderObjectElement(this);\n\n  @override\n  RenderObject createRenderObject(BuildContext context) {\n    return RenderImageGrid(\n      onTap: onTap,\n      onSecondaryTapUp: onSecondaryTapUp,\n      onLongPressStart: onLongPressStart,\n    );\n  }\n\n  @override\n  void updateRenderObject(BuildContext context, RenderImageGrid renderObject) {\n    renderObject\n      ..onTap = onTap\n      ..onSecondaryTapUp = onSecondaryTapUp\n      ..onLongPressStart = onLongPressStart;\n  }\n}\n\ntypedef OnShowMenu = Function(int index, Offset offset);\n\nclass RenderImageGrid extends RenderBox\n    with\n        ContainerRenderObjectMixin<RenderBox, MultiChildLayoutParentData>,\n        RenderBoxContainerDefaultsMixin<RenderBox, MultiChildLayoutParentData>,\n        RenderObjectWithLayoutCallbackMixin {\n  RenderImageGrid({\n    required ValueChanged<int> onTap,\n    required OnShowMenu? onSecondaryTapUp,\n    required OnShowMenu? onLongPressStart,\n  }) : _onTap = onTap,\n       _onSecondaryTapUp = onSecondaryTapUp,\n       _onLongPressStart = onLongPressStart {\n    _tapGestureRecognizer = TapGestureRecognizer()..onTap = _handleOnTap;\n    if (onSecondaryTapUp != null) {\n      _tapGestureRecognizer.onSecondaryTapUp = _handleSecondaryTapUp;\n    }\n    if (onLongPressStart != null) {\n      _longPressGestureRecognizer = LongPressGestureRecognizer()\n        ..onLongPressStart = _handleLongPressStart;\n    }\n  }\n\n  ValueChanged<int> _onTap;\n  set onTap(ValueChanged<int> value) {\n    _onTap = value;\n  }\n\n  OnShowMenu? _onSecondaryTapUp;\n  set onSecondaryTapUp(OnShowMenu? value) {\n    _onSecondaryTapUp = value;\n  }\n\n  OnShowMenu? _onLongPressStart;\n  set onLongPressStart(OnShowMenu? value) {\n    _onLongPressStart = value;\n  }\n\n  int? _index;\n\n  void _handleOnTap() {\n    _onTap(_index!);\n  }\n\n  void _handleSecondaryTapUp(TapUpDetails details) {\n    _onSecondaryTapUp!(_index!, details.globalPosition);\n  }\n\n  void _handleLongPressStart(LongPressStartDetails details) {\n    _onLongPressStart!(_index!, details.globalPosition);\n  }\n\n  @override\n  void setupParentData(RenderBox child) {\n    if (child.parentData is! MultiChildLayoutParentData) {\n      child.parentData = MultiChildLayoutParentData();\n    }\n  }\n\n  ImageGridInfo? imageGridInfo;\n  LayoutCallback<Constraints>? _callback;\n\n  void _updateCallback(LayoutCallback<Constraints> value) {\n    if (value == _callback) {\n      return;\n    }\n    _callback = value;\n    scheduleLayoutCallback();\n  }\n\n  @override\n  void layoutCallback() => _callback!(constraints);\n\n  @protected\n  BoxConstraints get layoutInfo => constraints;\n\n  @override\n  void performLayout() {\n    final BoxConstraints constraints = this.constraints;\n    runLayoutCallback();\n    final info = imageGridInfo!;\n    final row = info.row;\n    final column = info.column;\n    final width = info.size.width;\n    final height = info.size.height;\n    final childConstraints = BoxConstraints.tightFor(\n      width: width,\n      height: height,\n    );\n    RenderBox? child = firstChild;\n    while (child != null) {\n      child.layout(childConstraints);\n      final childParentData = child.parentData as MultiChildLayoutParentData;\n      final index = childParentData.id as int;\n      childParentData.offset = Offset(\n        (space + width) * (index % column),\n        (space + height) * (index ~/ column),\n      );\n      child = childParentData.nextSibling;\n    }\n    size = constraints.constrainDimensions(\n      width * column + space * (column - 1),\n      height * row + space * (row - 1),\n    );\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    defaultPaint(context, offset);\n  }\n\n  @override\n  bool hitTestChildren(BoxHitTestResult result, {required Offset position}) {\n    RenderBox? child = lastChild;\n    while (child != null) {\n      final childParentData = child.parentData as MultiChildLayoutParentData;\n      final bool isHit = result.addWithPaintOffset(\n        offset: childParentData.offset,\n        position: position,\n        hitTest: (BoxHitTestResult result, Offset transformed) {\n          assert(transformed == position - childParentData.offset);\n          if (child!.size.contains(transformed)) {\n            result.add(BoxHitTestEntry(child, transformed));\n            return true;\n          }\n          return false;\n        },\n      );\n      if (isHit) {\n        _index = childParentData.id as int;\n        return true;\n      }\n      child = childParentData.previousSibling;\n    }\n    _index = null;\n    return false;\n  }\n\n  @override\n  void handleEvent(PointerEvent event, BoxHitTestEntry entry) {\n    if (event is PointerDownEvent) {\n      _tapGestureRecognizer.addPointer(event);\n      _longPressGestureRecognizer?.addPointer(event);\n    }\n  }\n\n  late final TapGestureRecognizer _tapGestureRecognizer;\n  LongPressGestureRecognizer? _longPressGestureRecognizer;\n\n  @override\n  void dispose() {\n    _tapGestureRecognizer\n      ..onTap = null\n      ..onSecondaryTapUp = null\n      ..dispose();\n    _longPressGestureRecognizer\n      ?..onLongPressStart = null\n      ..dispose();\n    _longPressGestureRecognizer = null;\n    _onSecondaryTapUp = null;\n    _onLongPressStart = null;\n    super.dispose();\n  }\n\n  @override\n  bool get isRepaintBoundary => true; // gif repaint\n}\n\nclass ImageGridRenderObjectElement extends RenderObjectElement {\n  ImageGridRenderObjectElement(ImageGridBuilder super.widget);\n\n  @override\n  RenderImageGrid get renderObject {\n    return super.renderObject as RenderImageGrid;\n  }\n\n  @protected\n  @visibleForTesting\n  Iterable<Element> get children =>\n      _children!.where((Element child) => !_forgottenChildren.contains(child));\n\n  List<Element>? _children;\n  // We keep a set of forgotten children to avoid O(n^2) work walking _children\n  // repeatedly to remove children.\n  final Set<Element> _forgottenChildren = HashSet<Element>();\n\n  // @override\n  // BuildScope get buildScope => _buildScope;\n\n  // late final BuildScope _buildScope = BuildScope(\n  //   scheduleRebuild: _scheduleRebuild,\n  // );\n\n  // bool _deferredCallbackScheduled = false;\n  // void _scheduleRebuild() {\n  //   if (_deferredCallbackScheduled) {\n  //     return;\n  //   }\n\n  //   final bool deferMarkNeedsLayout =\n  //       switch (SchedulerBinding.instance.schedulerPhase) {\n  //         SchedulerPhase.idle || SchedulerPhase.postFrameCallbacks => true,\n  //         SchedulerPhase.transientCallbacks ||\n  //         SchedulerPhase.midFrameMicrotasks ||\n  //         SchedulerPhase.persistentCallbacks => false,\n  //       };\n  //   if (!deferMarkNeedsLayout) {\n  //     renderObject.scheduleLayoutCallback();\n  //     return;\n  //   }\n  //   _deferredCallbackScheduled = true;\n  //   SchedulerBinding.instance.scheduleFrameCallback(_frameCallback);\n  // }\n\n  // void _frameCallback(Duration timestamp) {\n  //   _deferredCallbackScheduled = false;\n  //   // This method is only called when the render tree is stable, if the Element\n  //   // is deactivated it will never be reincorporated back to the tree.\n  //   if (mounted) {\n  //     renderObject.scheduleLayoutCallback();\n  //   }\n  // }\n\n  @override\n  void insertRenderObjectChild(RenderObject child, IndexedSlot<Element?> slot) {\n    final ContainerRenderObjectMixin<\n      RenderObject,\n      ContainerParentDataMixin<RenderObject>\n    >\n    renderObject = this.renderObject;\n    assert(renderObject.debugValidateChild(child));\n    renderObject.insert(child, after: slot.value?.renderObject);\n    assert(renderObject == this.renderObject);\n  }\n\n  @override\n  void moveRenderObjectChild(\n    RenderObject child,\n    IndexedSlot<Element?> oldSlot,\n    IndexedSlot<Element?> newSlot,\n  ) {\n    final ContainerRenderObjectMixin<\n      RenderObject,\n      ContainerParentDataMixin<RenderObject>\n    >\n    renderObject = this.renderObject;\n    assert(child.parent == renderObject);\n    renderObject.move(child, after: newSlot.value?.renderObject);\n    assert(renderObject == this.renderObject);\n  }\n\n  @override\n  void removeRenderObjectChild(RenderObject child, Object? slot) {\n    final ContainerRenderObjectMixin<\n      RenderObject,\n      ContainerParentDataMixin<RenderObject>\n    >\n    renderObject = this.renderObject;\n    assert(child.parent == renderObject);\n    renderObject.remove(child);\n    assert(renderObject == this.renderObject);\n  }\n\n  @override\n  void visitChildren(ElementVisitor visitor) {\n    if (_children == null) return;\n    for (final Element child in _children!) {\n      if (!_forgottenChildren.contains(child)) {\n        visitor(child);\n      }\n    }\n  }\n\n  @override\n  void forgetChild(Element child) {\n    if (_children == null) return;\n    assert(_children!.contains(child));\n    assert(!_forgottenChildren.contains(child));\n    _forgottenChildren.add(child);\n    super.forgetChild(child);\n  }\n\n  bool _debugCheckHasAssociatedRenderObject(Element newChild) {\n    assert(() {\n      if (newChild.renderObject == null) {\n        FlutterError.reportError(\n          FlutterErrorDetails(\n            exception: FlutterError.fromParts(<DiagnosticsNode>[\n              ErrorSummary(\n                'The children of `MultiChildRenderObjectElement` must each has an associated render object.',\n              ),\n              ErrorHint(\n                'This typically means that the `${newChild.widget}` or its children\\n'\n                'are not a subtype of `RenderObjectWidget`.',\n              ),\n              newChild.describeElement(\n                'The following element does not have an associated render object',\n              ),\n              DiagnosticsDebugCreator(DebugCreator(newChild)),\n            ]),\n          ),\n        );\n      }\n      return true;\n    }());\n    return true;\n  }\n\n  @override\n  Element inflateWidget(Widget newWidget, Object? newSlot) {\n    final Element newChild = super.inflateWidget(newWidget, newSlot);\n    assert(_debugCheckHasAssociatedRenderObject(newChild));\n    return newChild;\n  }\n\n  @override\n  void mount(Element? parent, Object? newSlot) {\n    super.mount(parent, newSlot);\n    renderObject._updateCallback(_rebuildWithConstraints);\n    // final multiChildRenderObjectWidget = widget as MultiChildRenderObjectWidget;\n    // final children = List<Element>.filled(\n    //   multiChildRenderObjectWidget.children.length,\n    //   _NullElement.instance,\n    // );\n    // Element? previousChild;\n    // for (var i = 0; i < children.length; i += 1) {\n    //   final Element newChild = inflateWidget(\n    //     multiChildRenderObjectWidget.children[i],\n    //     IndexedSlot<Element?>(i, previousChild),\n    //   );\n    //   children[i] = newChild;\n    //   previousChild = newChild;\n    // }\n    // _children = children;\n  }\n\n  @override\n  void update(ImageGridBuilder newWidget) {\n    super.update(newWidget);\n    final multiChildRenderObjectWidget = widget as ImageGridBuilder;\n    assert(widget == newWidget);\n    // _children = updateChildren(\n    //   _children,\n    //   multiChildRenderObjectWidget.children,\n    //   forgottenChildren: _forgottenChildren,\n    // );\n    // _forgottenChildren.clear();\n    renderObject._updateCallback(_rebuildWithConstraints);\n    if (newWidget.updateShouldRebuild(multiChildRenderObjectWidget)) {\n      _needsBuild = true;\n      renderObject.scheduleLayoutCallback();\n    }\n  }\n\n  @override\n  void markNeedsBuild() {\n    // Calling super.markNeedsBuild is not needed. This Element does not need\n    // to performRebuild since this call already does what performRebuild does,\n    // So the element is clean as soon as this method returns and does not have\n    // to be added to the dirty list or marked as dirty.\n    renderObject.scheduleLayoutCallback();\n    _needsBuild = true;\n  }\n\n  @override\n  void performRebuild() {\n    // This gets called if markNeedsBuild() is called on us.\n    // That might happen if, e.g., our builder uses Inherited widgets.\n\n    // Force the callback to be called, even if the layout constraints are the\n    // same. This is because that callback may depend on the updated widget\n    // configuration, or an inherited widget.\n    renderObject.scheduleLayoutCallback();\n    _needsBuild = true;\n    super\n        .performRebuild(); // Calls widget.updateRenderObject (a no-op in this case).\n  }\n\n  @override\n  void unmount() {\n    renderObject._callback = null;\n    super.unmount();\n  }\n\n  // The LayoutInfoType that was used to invoke the layout callback with last time,\n  // during layout. The `_previousLayoutInfo` value is compared to the new one\n  // to determine whether [LayoutBuilderBase.builder] needs to be called.\n  BoxConstraints? _previousLayoutInfo;\n  bool _needsBuild = true;\n\n  static ImageGridInfo _calcGridInfo(\n    List<ImageModel> picArr,\n    BoxConstraints layoutInfo,\n  ) {\n    final maxWidth = layoutInfo.maxWidth;\n    double imageWidth;\n    double imageHeight;\n    final length = picArr.length;\n    final isSingle = length == 1;\n    final isFour = length == 4;\n    if (length == 2) {\n      imageWidth = imageHeight = (maxWidth - space) / 2;\n    } else {\n      imageHeight = imageWidth = (maxWidth - 2 * space) / 3;\n      if (isSingle) {\n        final img = picArr.first;\n        final width = img.width;\n        final height = img.height;\n        final ratioWH = width / height;\n        final ratioHW = height / width;\n        imageWidth = ratioWH > 1.5\n            ? maxWidth\n            : (ratioWH >= 1 || (height > width && ratioHW < 1.5))\n            ? 2 * imageWidth\n            : 1.5 * imageWidth;\n        if (width != 1) {\n          imageWidth = math.min(imageWidth, width.toDouble());\n        }\n        imageHeight = imageWidth * math.min(ratioHW, StyleString.imgMaxRatio);\n      }\n    }\n\n    final int column = isFour ? 2 : 3;\n    final int row = isFour ? 2 : (length / 3).ceil();\n\n    return (\n      row: row,\n      column: column,\n      size: Size(imageWidth, imageHeight),\n    );\n  }\n\n  void _rebuildWithConstraints(Constraints _) {\n    final BoxConstraints layoutInfo = renderObject.layoutInfo;\n    @pragma('vm:notify-debugger-on-exception')\n    void updateChildCallback() {\n      List<Widget> built;\n      try {\n        assert(layoutInfo == renderObject.layoutInfo);\n        built = (widget as ImageGridBuilder).builder(\n          this,\n          renderObject.imageGridInfo = _calcGridInfo(\n            (widget as ImageGridBuilder).picArr,\n            layoutInfo,\n          ),\n        );\n      } catch (e, stack) {\n        built = [\n          ErrorWidget.builder(\n            _reportException(\n              ErrorDescription('building $widget'),\n              e,\n              stack,\n              informationCollector: () => <DiagnosticsNode>[\n                if (kDebugMode) DiagnosticsDebugCreator(DebugCreator(this)),\n              ],\n            ),\n          ),\n        ];\n      }\n      try {\n        if (_children == null) {\n          final children = List<Element>.filled(\n            built.length,\n            _NullElement.instance,\n          );\n          Element? previousChild;\n          for (var i = 0; i < children.length; i += 1) {\n            final Element newChild = inflateWidget(\n              built[i],\n              IndexedSlot<Element?>(i, previousChild),\n            );\n            children[i] = newChild;\n            previousChild = newChild;\n          }\n          _children = children;\n        } else {\n          _children = updateChildren(\n            _children!,\n            built,\n            forgottenChildren: _forgottenChildren,\n          );\n        }\n      } catch (e, stack) {\n        built = [\n          ErrorWidget.builder(\n            _reportException(\n              ErrorDescription('building $widget'),\n              e,\n              stack,\n              informationCollector: () => <DiagnosticsNode>[\n                if (kDebugMode) DiagnosticsDebugCreator(DebugCreator(this)),\n              ],\n            ),\n          ),\n        ];\n        _children = updateChildren([], built);\n      } finally {\n        _needsBuild = false;\n        _previousLayoutInfo = layoutInfo;\n        _forgottenChildren.clear();\n      }\n    }\n\n    final VoidCallback? callback =\n        _needsBuild || (layoutInfo != _previousLayoutInfo)\n        ? updateChildCallback\n        : null;\n    owner!.buildScope(this, callback);\n  }\n}\n\nFlutterErrorDetails _reportException(\n  DiagnosticsNode context,\n  Object exception,\n  StackTrace stack, {\n  InformationCollector? informationCollector,\n}) {\n  final details = FlutterErrorDetails(\n    exception: exception,\n    stack: stack,\n    library: 'widgets library',\n    context: context,\n    informationCollector: informationCollector,\n  );\n  FlutterError.reportError(details);\n  return details;\n}\n\nclass _NullElement extends Element {\n  _NullElement() : super(const _NullWidget());\n\n  static _NullElement instance = _NullElement();\n\n  @override\n  bool get debugDoingBuild => throw UnimplementedError();\n}\n\nclass _NullWidget extends Widget {\n  const _NullWidget();\n\n  @override\n  Element createElement() => throw UnimplementedError();\n}\n"
  },
  {
    "path": "lib/common/widgets/image_grid/image_grid_view.dart",
    "content": "/*\n * This file is part of PiliPlus\n *\n * PiliPlus 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 * PiliPlus 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 PiliPlus.  If not, see <https://www.gnu.org/licenses/>.\n */\n\nimport 'dart:io' show Platform;\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/image_grid/image_grid_builder.dart';\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models/common/image_preview_type.dart';\nimport 'package:PiliPlus/utils/extension/context_ext.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/extension/size_ext.dart';\nimport 'package:PiliPlus/utils/image_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart' show HapticFeedback;\nimport 'package:get/get_core/src/get_main.dart';\nimport 'package:get/get_navigation/src/extension_navigation.dart';\n\nclass ImageModel {\n  ImageModel({\n    required num? width,\n    required num? height,\n    required this.url,\n    this.liveUrl,\n  }) {\n    this.width = width == null || width == 0 ? 1 : width;\n    this.height = height == null || height == 0 ? 1 : height;\n  }\n\n  late num width;\n  late num height;\n  String url;\n  String? liveUrl;\n  bool? _isLongPic;\n  bool? _isLivePhoto;\n\n  bool get isLongPic =>\n      _isLongPic ??= (height / width) > StyleString.imgMaxRatio;\n  bool get isLivePhoto =>\n      _isLivePhoto ??= enableLivePhoto && liveUrl?.isNotEmpty == true;\n\n  static bool enableLivePhoto = Pref.enableLivePhoto;\n}\n\nclass ImageGridView extends StatelessWidget {\n  const ImageGridView({\n    super.key,\n    required this.picArr,\n    this.onViewImage,\n    this.fullScreen = false,\n  });\n\n  final List<ImageModel> picArr;\n  final VoidCallback? onViewImage;\n  final bool fullScreen;\n\n  static bool horizontalPreview = Pref.horizontalPreview;\n  static final _regex = RegExp(r'/videoV|/dynamicDetail$|/articlePage');\n\n  void _onTap(BuildContext context, int index) {\n    final imgList = picArr.map(\n      (item) {\n        bool isLive = item.isLivePhoto;\n        return SourceModel(\n          sourceType: isLive ? .livePhoto : .networkImage,\n          url: item.url,\n          liveUrl: isLive ? item.liveUrl : null,\n          width: isLive ? item.width.toInt() : null,\n          height: isLive ? item.height.toInt() : null,\n          isLongPic: item.isLongPic,\n        );\n      },\n    ).toList();\n    if (horizontalPreview &&\n        !fullScreen &&\n        Get.currentRoute.startsWith(_regex) &&\n        !context.mediaQuerySize.isPortrait) {\n      final scaffoldState = Scaffold.maybeOf(context);\n      if (scaffoldState != null) {\n        onViewImage?.call();\n        PageUtils.onHorizontalPreviewState(\n          scaffoldState,\n          imgList,\n          index,\n        );\n        return;\n      }\n    }\n    PageUtils.imageView(\n      initialPage: index,\n      imgList: imgList,\n      tag: hashCode.toString(),\n    );\n  }\n\n  static BorderRadius _borderRadius(\n    int col,\n    int length,\n    int index, {\n    Radius r = StyleString.imgRadius,\n  }) {\n    if (length == 1) return StyleString.mdRadius;\n\n    final bool hasUp = index - col >= 0;\n    final bool hasDown = index + col < length;\n\n    final bool isRowStart = (index % col) == 0;\n    final bool isRowEnd = (index % col) == col - 1 || index == length - 1;\n\n    final bool hasLeft = !isRowStart;\n    final bool hasRight = !isRowEnd && (index + 1) < length;\n\n    return BorderRadius.only(\n      topLeft: !hasUp && !hasLeft ? r : Radius.zero,\n      topRight: !hasUp && !hasRight ? r : Radius.zero,\n      bottomLeft: !hasDown && !hasLeft ? r : Radius.zero,\n      bottomRight: !hasDown && !hasRight ? r : Radius.zero,\n    );\n  }\n\n  static bool enableImgMenu = Pref.enableImgMenu;\n\n  void _showMenu(BuildContext context, int index, Offset offset) {\n    HapticFeedback.mediumImpact();\n    final item = picArr[index];\n    showMenu(\n      context: context,\n      position: PageUtils.menuPosition(offset),\n      items: [\n        if (PlatformUtils.isMobile)\n          PopupMenuItem(\n            height: 42,\n            onTap: () => ImageUtils.onShareImg(item.url),\n            child: const Text('分享', style: TextStyle(fontSize: 14)),\n          ),\n        PopupMenuItem(\n          height: 42,\n          onTap: () => ImageUtils.downloadImg([item.url]),\n          child: const Text('保存图片', style: TextStyle(fontSize: 14)),\n        ),\n        if (PlatformUtils.isDesktop)\n          PopupMenuItem(\n            height: 42,\n            onTap: () => PageUtils.launchURL(item.url),\n            child: const Text('网页打开', style: TextStyle(fontSize: 14)),\n          )\n        else if (picArr.length > 1)\n          PopupMenuItem(\n            height: 42,\n            onTap: () =>\n                ImageUtils.downloadImg(picArr.map((item) => item.url).toList()),\n            child: const Text('保存全部', style: TextStyle(fontSize: 14)),\n          ),\n        if (item.isLivePhoto)\n          PopupMenuItem(\n            height: 42,\n            onTap: () => ImageUtils.downloadLivePhoto(\n              url: item.url,\n              liveUrl: item.liveUrl!,\n              width: item.width.toInt(),\n              height: item.height.toInt(),\n            ),\n            child: Text(\n              '保存${Platform.isIOS ? '实况' : '视频'}',\n              style: const TextStyle(fontSize: 14),\n            ),\n          ),\n      ],\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Padding(\n      padding: const .only(top: 6),\n      child: ImageGridBuilder(\n        picArr: picArr,\n        onTap: (index) => _onTap(context, index),\n        onSecondaryTapUp: enableImgMenu && PlatformUtils.isDesktop\n            ? (index, offset) => _showMenu(context, index, offset)\n            : null,\n        onLongPressStart: enableImgMenu && PlatformUtils.isMobile\n            ? (index, offset) => _showMenu(context, index, offset)\n            : null,\n        builder: (BuildContext context, ImageGridInfo info) {\n          final width = info.size.width;\n          final height = info.size.height;\n          late final placeHolder = Container(\n            width: width,\n            height: height,\n            decoration: BoxDecoration(\n              color: Theme.of(\n                context,\n              ).colorScheme.onInverseSurface.withValues(alpha: 0.4),\n            ),\n            child: Image.asset(\n              'assets/images/loading.png',\n              width: width,\n              height: height,\n              cacheWidth: width.cacheSize(context),\n            ),\n          );\n          return List.generate(picArr.length, (index) {\n            final item = picArr[index];\n            final borderRadius = _borderRadius(\n              info.column,\n              picArr.length,\n              index,\n            );\n            Widget child = Stack(\n              clipBehavior: Clip.none,\n              alignment: Alignment.center,\n              children: [\n                NetworkImgLayer(\n                  src: item.url,\n                  width: width,\n                  height: height,\n                  borderRadius: borderRadius,\n                  alignment: item.isLongPic ? .topCenter : .center,\n                  cacheWidth: item.width <= item.height,\n                  getPlaceHolder: () => placeHolder,\n                ),\n                if (item.isLivePhoto)\n                  const PBadge(\n                    text: 'Live',\n                    right: 8,\n                    bottom: 8,\n                    type: PBadgeType.gray,\n                  )\n                else if (item.isLongPic)\n                  const PBadge(\n                    text: '长图',\n                    right: 8,\n                    bottom: 8,\n                  ),\n              ],\n            );\n            if (!item.isLongPic) {\n              child = Hero(\n                tag: '${item.url}$hashCode',\n                child: child,\n              );\n            }\n            return LayoutId(\n              id: index,\n              child: child,\n            );\n          });\n        },\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/image_viewer/gallery_viewer.dart",
    "content": "/*\n * This file is part of PiliPlus\n *\n * PiliPlus 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 * PiliPlus 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 PiliPlus.  If not, see <https://www.gnu.org/licenses/>.\n */\n\nimport 'dart:io' show File, Platform;\n\nimport 'package:PiliPlus/common/widgets/colored_box_transition.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/flutter/page/page_view.dart';\nimport 'package:PiliPlus/common/widgets/gesture/image_horizontal_drag_gesture_recognizer.dart';\nimport 'package:PiliPlus/common/widgets/image_viewer/image.dart';\nimport 'package:PiliPlus/common/widgets/image_viewer/loading_indicator.dart';\nimport 'package:PiliPlus/common/widgets/image_viewer/viewer.dart';\nimport 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/models/common/image_preview_type.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/extension/string_ext.dart';\nimport 'package:PiliPlus/utils/image_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:cached_network_image/cached_network_image.dart';\nimport 'package:easy_debounce/easy_throttle.dart';\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart' hide Image, PageView, LayoutBuilder;\nimport 'package:flutter/services.dart' show HapticFeedback;\nimport 'package:get/get.dart';\nimport 'package:media_kit/media_kit.dart';\nimport 'package:media_kit_video/media_kit_video.dart';\n\n///\n/// created by dom on 2026/02/14\n///\n\nclass GalleryViewer extends StatefulWidget {\n  const GalleryViewer({\n    super.key,\n    this.minScale = 1.0,\n    this.maxScale = 8.0,\n    required this.quality,\n    required this.sources,\n    this.initIndex = 0,\n    this.onPageChanged,\n    this.tag = '',\n  });\n\n  final double minScale;\n  final double maxScale;\n  final int quality;\n  final List<SourceModel> sources;\n  final int initIndex;\n  final ValueChanged<int>? onPageChanged;\n  final String tag;\n\n  @override\n  State<GalleryViewer> createState() => _GalleryViewerState();\n}\n\nclass _GalleryViewerState extends State<GalleryViewer>\n    with SingleTickerProviderStateMixin {\n  late Size _containerSize;\n  late final int _quality;\n  late final RxInt _currIndex;\n  GlobalKey? _key;\n\n  late bool _hasInit = false;\n  Player? _player;\n  VideoController? _videoController;\n\n  late final PageController _pageController;\n\n  late final TapGestureRecognizer _tapGestureRecognizer;\n  late final DoubleTapGestureRecognizer _doubleTapGestureRecognizer;\n  late final ImageHorizontalDragGestureRecognizer\n  _horizontalDragGestureRecognizer;\n  late final LongPressGestureRecognizer _longPressGestureRecognizer;\n\n  late final AnimationController _animateController;\n  late final Animation<Color?> _opacityAnimation;\n  double dx = 0, dy = 0;\n\n  Offset _offset = Offset.zero;\n  bool _dragging = false;\n\n  String _getActualUrl(String url) {\n    return _quality != 100\n        ? ImageUtils.thumbnailUrl(url, _quality)\n        : url.http2https;\n  }\n\n  Future<void> _initPlayer() async {\n    assert(_player == null);\n    final player = await Player.create();\n    _videoController = await VideoController.create(player);\n    if (!mounted) {\n      player.dispose();\n      _videoController = null;\n      return;\n    }\n    _player = player;\n    final currItem = widget.sources[_currIndex.value];\n    if (currItem.sourceType == .livePhoto) {\n      player.open(Media(currItem.liveUrl!));\n      _currIndex.refresh();\n    }\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    _quality = Pref.previewQ;\n    _currIndex = widget.initIndex.obs;\n    final item = widget.sources[widget.initIndex];\n    _playIfNeeded(item);\n\n    if (!item.isLongPic) {\n      _key = GlobalKey();\n      WidgetsBinding.instance.addPostFrameCallback((_) => _key = null);\n    }\n\n    _pageController = PageController(initialPage: widget.initIndex);\n\n    final gestureSettings = MediaQuery.maybeGestureSettingsOf(Get.context!);\n    _tapGestureRecognizer = TapGestureRecognizer()\n      // ..onTap = _onTap\n      ..gestureSettings = gestureSettings;\n    if (PlatformUtils.isDesktop) {\n      _tapGestureRecognizer.onSecondaryTapUp = _showDesktopMenu;\n    }\n    _doubleTapGestureRecognizer = DoubleTapGestureRecognizer()\n      ..onDoubleTap = () {}\n      ..gestureSettings = gestureSettings;\n    _horizontalDragGestureRecognizer = ImageHorizontalDragGestureRecognizer();\n    _longPressGestureRecognizer = LongPressGestureRecognizer()\n      ..onLongPress = _onLongPress\n      ..gestureSettings = gestureSettings;\n\n    Future.delayed(const Duration(milliseconds: 300), () {\n      if (mounted) {\n        _tapGestureRecognizer.onTap = _onTap;\n      }\n    });\n\n    _animateController = AnimationController(\n      duration: const Duration(\n        milliseconds: 750,\n      ), // reverse only if value <= 0.2\n      vsync: this,\n    );\n\n    _opacityAnimation = _animateController.drive(\n      ColorTween(\n        begin: Colors.black,\n        end: Colors.transparent,\n      ),\n    );\n  }\n\n  Matrix4 _onTransform(double val) {\n    final scale = val.lerp(1.0, 0.25);\n\n    // Matrix4.identity()\n    //   ..translateByDouble(size.width / 2, size.height / 2, 0, 1)\n    //   ..translateByDouble(size.width * val * dx, size.height * val * dy, 0, 1)\n    //   ..scaleByDouble(scale, scale, scale, 1)\n    //   ..translateByDouble(-size.width / 2, -size.height / 2, 0, 1);\n\n    final tmp = (1.0 - scale) / 2.0;\n    return Matrix4.diagonal3Values(scale, scale, scale)..setTranslationRaw(\n      _containerSize.width * (val * dx + tmp),\n      _containerSize.height * (val * dy + tmp),\n      0,\n    );\n  }\n\n  void _updateMoveAnimation() {\n    dy = _offset.dy.sign;\n    if (dy == 0) {\n      dx = 0;\n    } else {\n      dx = _offset.dx / _offset.dy.abs();\n    }\n  }\n\n  void _onDragStart(ScaleStartDetails details) {\n    _dragging = true;\n\n    if (_animateController.isAnimating) {\n      _animateController.stop();\n    } else {\n      _offset = Offset.zero;\n      _animateController.value = 0.0;\n    }\n    _updateMoveAnimation();\n  }\n\n  void _onDragUpdate(ScaleUpdateDetails details) {\n    if (!_dragging || _animateController.isAnimating) {\n      return;\n    }\n\n    _offset += details.focalPointDelta;\n    _updateMoveAnimation();\n\n    if (!_animateController.isAnimating) {\n      _animateController.value = _offset.dy.abs() / _containerSize.height;\n    }\n  }\n\n  void _onDragEnd(ScaleEndDetails details) {\n    if (!_dragging || _animateController.isAnimating) {\n      return;\n    }\n\n    _dragging = false;\n\n    if (!_animateController.isDismissed) {\n      if (_animateController.value > 0.2) {\n        Get.back();\n      } else {\n        _animateController.reverse();\n      }\n    }\n  }\n\n  @override\n  void dispose() {\n    _player?.dispose();\n    _player = null;\n    _videoController = null;\n    _pageController.dispose();\n    _animateController.dispose();\n    _tapGestureRecognizer.dispose();\n    _doubleTapGestureRecognizer\n      ..onDoubleTapDown = null\n      ..onDoubleTap = null\n      ..dispose();\n    _longPressGestureRecognizer.dispose();\n    if (widget.quality != _quality) {\n      for (final item in widget.sources) {\n        if (item.sourceType == SourceType.networkImage) {\n          CachedNetworkImageProvider(_getActualUrl(item.url)).evict();\n        }\n      }\n    }\n    Future.delayed(const Duration(milliseconds: 200), _currIndex.close);\n    super.dispose();\n  }\n\n  void _onPointerDown(PointerDownEvent event) {\n    _tapGestureRecognizer.addPointer(event);\n    _doubleTapGestureRecognizer.addPointer(event);\n    _longPressGestureRecognizer.addPointer(event);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Listener(\n      behavior: .opaque,\n      onPointerDown: _onPointerDown,\n      child: Stack(\n        fit: .expand,\n        alignment: .center,\n        clipBehavior: .none,\n        children: [\n          ColoredBoxTransition(color: _opacityAnimation),\n          LayoutBuilder(\n            builder: (context, constraints) {\n              _containerSize = constraints.biggest;\n              return MatrixTransition(\n                alignment: .topLeft,\n                animation: _animateController,\n                onTransform: _onTransform,\n                child: PageView<ImageHorizontalDragGestureRecognizer>.builder(\n                  controller: _pageController,\n                  onPageChanged: _onPageChanged,\n                  physics: const CustomTabBarViewScrollPhysics(\n                    parent: AlwaysScrollableScrollPhysics(),\n                  ),\n                  itemCount: widget.sources.length,\n                  itemBuilder: _itemBuilder,\n                  horizontalDragGestureRecognizer: () =>\n                      _horizontalDragGestureRecognizer,\n                ),\n              );\n            },\n          ),\n          _buildIndicator,\n        ],\n      ),\n    );\n  }\n\n  Widget get _buildIndicator => Positioned(\n    bottom: 0,\n    left: 0,\n    right: 0,\n    child: IgnorePointer(\n      child: Container(\n        padding:\n            MediaQuery.viewPaddingOf(context) +\n            const EdgeInsets.fromLTRB(12, 8, 20, 8),\n        decoration: BoxDecoration(\n          gradient: LinearGradient(\n            begin: Alignment.topCenter,\n            end: Alignment.bottomCenter,\n            colors: [\n              Colors.transparent,\n              Colors.black.withValues(alpha: 0.3),\n            ],\n          ),\n        ),\n        alignment: Alignment.center,\n        child: Obx(\n          () => Text(\n            \"${_currIndex.value + 1}/${widget.sources.length}\",\n            style: const TextStyle(color: Colors.white),\n          ),\n        ),\n      ),\n    ),\n  );\n\n  void _playIfNeeded(SourceModel item) {\n    if (item.sourceType == .livePhoto) {\n      if (_player != null) {\n        _player!.open(Media(item.liveUrl!));\n      } else if (!_hasInit) {\n        _hasInit = true;\n        _initPlayer();\n      }\n    }\n  }\n\n  void _onPageChanged(int index) {\n    _player?.pause();\n    _playIfNeeded(widget.sources[index]);\n    _currIndex.value = index;\n    widget.onPageChanged?.call(index);\n  }\n\n  late final ValueChanged<int>? _onChangePage = widget.sources.length == 1\n      ? null\n      : (int offset) {\n          final currPage = _pageController.page?.round() ?? 0;\n          final nextPage = (currPage + offset).clamp(\n            0,\n            widget.sources.length - 1,\n          );\n          if (nextPage != currPage) {\n            _pageController.animateToPage(\n              nextPage,\n              duration: const Duration(milliseconds: 200),\n              curve: Curves.ease,\n            );\n          }\n        };\n\n  Widget _itemBuilder(BuildContext context, int index) {\n    final item = widget.sources[index];\n    final Widget child;\n    switch (item.sourceType) {\n      case SourceType.fileImage:\n        child = Image.file(\n          key: _key,\n          File(item.url),\n          filterQuality: .low,\n          minScale: widget.minScale,\n          maxScale: widget.maxScale,\n          containerSize: _containerSize,\n          onDragStart: _onDragStart,\n          onDragUpdate: _onDragUpdate,\n          onDragEnd: _onDragEnd,\n          doubleTapGestureRecognizer: _doubleTapGestureRecognizer,\n          horizontalDragGestureRecognizer: _horizontalDragGestureRecognizer,\n          onChangePage: _onChangePage,\n        );\n      case SourceType.networkImage:\n        final isLongPic = item.isLongPic;\n        child = Image(\n          key: _key,\n          image: CachedNetworkImageProvider(_getActualUrl(item.url)),\n          minScale: widget.minScale,\n          maxScale: widget.maxScale,\n          containerSize: _containerSize,\n          doubleTapGestureRecognizer: _doubleTapGestureRecognizer,\n          horizontalDragGestureRecognizer: _horizontalDragGestureRecognizer,\n          onChangePage: _onChangePage,\n          frameBuilder: (context, child, frame, wasSynchronouslyLoaded) {\n            if (wasSynchronouslyLoaded) {\n              return child;\n            }\n            if (frame == null) {\n              if (widget.quality == _quality) {\n                return child;\n              } else {\n                return Image(\n                  image: ResizeImage.resizeIfNeeded(\n                    _containerSize.width.cacheSize(context),\n                    null,\n                    CachedNetworkImageProvider(\n                      ImageUtils.thumbnailUrl(item.url, widget.quality),\n                    ),\n                  ),\n                  minScale: widget.minScale,\n                  maxScale: widget.maxScale,\n                  containerSize: _containerSize,\n                  onDragStart: null,\n                  onDragUpdate: null,\n                  onDragEnd: null,\n                  doubleTapGestureRecognizer: _doubleTapGestureRecognizer,\n                  horizontalDragGestureRecognizer:\n                      _horizontalDragGestureRecognizer,\n                  onChangePage: _onChangePage,\n                );\n                // final isLongPic = item.isLongPic;\n                // return CachedNetworkImage(\n                //   fadeInDuration: Duration.zero,\n                //   fadeOutDuration: Duration.zero,\n                //   // fit: isLongPic ? .fitWidth : null,\n                //   // alignment: isLongPic ? .topCenter : .center,\n                //   imageUrl: ImageUtils.thumbnailUrl(item.url, widget.quality),\n                //   placeholder: (_, _) => const SizedBox.expand(),\n                // );\n              }\n            }\n            return child;\n          },\n          loadingBuilder: loadingBuilder,\n          onDragStart: _onDragStart,\n          onDragUpdate: _onDragUpdate,\n          onDragEnd: _onDragEnd,\n        );\n        if (isLongPic) {\n          return child;\n        }\n      case SourceType.livePhoto:\n        child = Obx(\n          key: _key,\n          () => _currIndex.value == index && _videoController != null\n              ? Viewer(\n                  minScale: widget.minScale,\n                  maxScale: widget.maxScale,\n                  containerSize: _containerSize,\n                  childSize: _containerSize,\n                  onDragStart: _onDragStart,\n                  onDragUpdate: _onDragUpdate,\n                  onDragEnd: _onDragEnd,\n                  doubleTapGestureRecognizer: _doubleTapGestureRecognizer,\n                  horizontalDragGestureRecognizer:\n                      _horizontalDragGestureRecognizer,\n                  onChangePage: _onChangePage,\n                  child: FittedBox(\n                    child: SimpleVideo(\n                      controller: _videoController!,\n                      fill: Colors.transparent,\n                    ),\n                  ),\n                )\n              : const SizedBox.shrink(),\n        );\n    }\n    return Hero(tag: '${item.url}${widget.tag}', child: child);\n  }\n\n  void _onTap() {\n    EasyThrottle.throttle(\n      'VIEWER_TAP',\n      const Duration(milliseconds: 555),\n      Get.back,\n    );\n  }\n\n  void _onLongPress() {\n    final item = widget.sources[_currIndex.value];\n    if (item.sourceType == .fileImage) return;\n    HapticFeedback.mediumImpact();\n    showDialog(\n      context: context,\n      builder: (context) => AlertDialog(\n        clipBehavior: Clip.hardEdge,\n        contentPadding: const EdgeInsets.symmetric(vertical: 12),\n        content: Column(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            if (PlatformUtils.isMobile)\n              ListTile(\n                onTap: () {\n                  Get.back();\n                  ImageUtils.onShareImg(item.url);\n                },\n                dense: true,\n                title: const Text('分享', style: TextStyle(fontSize: 14)),\n              ),\n            ListTile(\n              onTap: () {\n                Get.back();\n                Utils.copyText(item.url);\n              },\n              dense: true,\n              title: const Text('复制链接', style: TextStyle(fontSize: 14)),\n            ),\n            ListTile(\n              onTap: () {\n                Get.back();\n                ImageUtils.downloadImg([item.url]);\n              },\n              dense: true,\n              title: const Text('保存图片', style: TextStyle(fontSize: 14)),\n            ),\n            if (PlatformUtils.isDesktop)\n              ListTile(\n                onTap: () {\n                  Get.back();\n                  PageUtils.launchURL(item.url);\n                },\n                dense: true,\n                title: const Text('网页打开', style: TextStyle(fontSize: 14)),\n              )\n            else if (widget.sources.length > 1)\n              ListTile(\n                onTap: () {\n                  Get.back();\n                  ImageUtils.downloadImg(\n                    widget.sources.map((item) => item.url).toList(),\n                  );\n                },\n                dense: true,\n                title: const Text('保存全部图片', style: TextStyle(fontSize: 14)),\n              ),\n            if (item.sourceType == SourceType.livePhoto)\n              ListTile(\n                onTap: () {\n                  Get.back();\n                  ImageUtils.downloadLivePhoto(\n                    url: item.url,\n                    liveUrl: item.liveUrl!,\n                    width: item.width!,\n                    height: item.height!,\n                  );\n                },\n                dense: true,\n                title: Text(\n                  '保存${Platform.isIOS ? ' Live Photo' : '视频'}',\n                  style: const TextStyle(fontSize: 14),\n                ),\n              ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  void _showDesktopMenu(TapUpDetails details) {\n    final item = widget.sources[_currIndex.value];\n    if (item.sourceType == .fileImage) return;\n    showMenu(\n      context: context,\n      position: PageUtils.menuPosition(details.globalPosition),\n      items: [\n        PopupMenuItem(\n          height: 42,\n          onTap: () => Utils.copyText(item.url),\n          child: const Text('复制链接', style: TextStyle(fontSize: 14)),\n        ),\n        PopupMenuItem(\n          height: 42,\n          onTap: () => ImageUtils.downloadImg([item.url]),\n          child: const Text('保存图片', style: TextStyle(fontSize: 14)),\n        ),\n        PopupMenuItem(\n          height: 42,\n          onTap: () => PageUtils.launchURL(item.url),\n          child: const Text('网页打开', style: TextStyle(fontSize: 14)),\n        ),\n        if (item.sourceType == SourceType.livePhoto)\n          PopupMenuItem(\n            height: 42,\n            onTap: () => ImageUtils.downloadLivePhoto(\n              url: item.url,\n              liveUrl: item.liveUrl!,\n              width: item.width!,\n              height: item.height!,\n            ),\n            child: const Text('保存视频', style: TextStyle(fontSize: 14)),\n          ),\n      ],\n    );\n  }\n\n  Widget loadingBuilder(\n    BuildContext context,\n    Widget child,\n    ImageChunkEvent? loadingProgress,\n  ) {\n    return Stack(\n      fit: .expand,\n      alignment: .center,\n      clipBehavior: .none,\n      children: [\n        child,\n        if (loadingProgress != null &&\n            loadingProgress.expectedTotalBytes != null &&\n            loadingProgress.cumulativeBytesLoaded !=\n                loadingProgress.expectedTotalBytes)\n          Center(\n            child: LoadingIndicator(\n              size: 39.4,\n              progress:\n                  loadingProgress.cumulativeBytesLoaded /\n                  loadingProgress.expectedTotalBytes!,\n            ),\n          ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/image_viewer/hero.dart",
    "content": "import 'package:flutter/widgets.dart';\n\nWidget fromHero({\n  required Object tag,\n  required Widget child,\n}) => Hero(\n  tag: tag,\n  createRectTween: createEndRectTween,\n  child: child,\n);\n\nRectTween createEndRectTween(Rect? begin, Rect? end) {\n  if (begin != null && end != null) {\n    final endWidth = end.width;\n    final endHeight = end.height;\n    // TODO: use real image rect\n    final beginRect = Rect.fromLTWH(\n      begin.left + (begin.width - endWidth) / 2,\n      begin.top + (begin.height - endHeight) / 2,\n      endWidth,\n      endHeight,\n    );\n    return RectTween(begin: beginRect, end: end);\n  }\n  return RectTween(begin: begin, end: end);\n}\n"
  },
  {
    "path": "lib/common/widgets/image_viewer/hero_dialog_route.dart",
    "content": "import 'package:flutter/material.dart';\n\n/// https://github.com/qq326646683/interactiveviewer_gallery\n\n/// A [PageRoute] with a semi transparent background.\n///\n/// Similar to calling [showDialog] except it can be used with a [Navigator] to\n/// show a [Hero] animation.\nclass HeroDialogRoute<T> extends PageRoute<T> {\n  HeroDialogRoute({\n    required this.pageBuilder,\n  });\n\n  final RoutePageBuilder pageBuilder;\n\n  @override\n  bool get opaque => false;\n\n  @override\n  bool get barrierDismissible => false;\n\n  @override\n  String? get barrierLabel => null;\n\n  @override\n  Duration get transitionDuration => const Duration(milliseconds: 300);\n\n  @override\n  bool get maintainState => true;\n\n  @override\n  Color? get barrierColor => null;\n\n  @override\n  Widget buildTransitions(\n    BuildContext context,\n    Animation<double> animation,\n    Animation<double> secondaryAnimation,\n    Widget child,\n  ) {\n    return FadeTransition(\n      opacity: animation.drive(CurveTween(curve: Curves.easeOut)),\n      child: child,\n    );\n  }\n\n  @override\n  Widget buildPage(\n    BuildContext context,\n    Animation<double> animation,\n    Animation<double> secondaryAnimation,\n  ) {\n    return Semantics(\n      scopesRoute: true,\n      explicitChildNodes: true,\n      child: pageBuilder(context, animation, secondaryAnimation),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/image_viewer/image.dart",
    "content": "// Copyright 2014 The Flutter Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport 'dart:io' show File;\nimport 'dart:math' as math;\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/gesture/image_horizontal_drag_gesture_recognizer.dart';\nimport 'package:PiliPlus/common/widgets/image_viewer/viewer.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/gestures.dart' show DoubleTapGestureRecognizer;\nimport 'package:flutter/material.dart';\nimport 'package:flutter/scheduler.dart';\nimport 'package:flutter/semantics.dart';\n\nclass Image extends StatefulWidget {\n  const Image({\n    super.key,\n    required this.image,\n    this.frameBuilder,\n    this.loadingBuilder,\n    this.errorBuilder,\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.isAntiAlias = false,\n    this.filterQuality = FilterQuality.medium,\n    required this.minScale,\n    required this.maxScale,\n    required this.containerSize,\n    required this.onDragStart,\n    required this.onDragUpdate,\n    required this.onDragEnd,\n    required this.doubleTapGestureRecognizer,\n    required this.horizontalDragGestureRecognizer,\n    required this.onChangePage,\n  });\n\n  Image.network(\n    String src, {\n    super.key,\n    double scale = 1.0,\n    this.frameBuilder,\n    this.loadingBuilder,\n    this.errorBuilder,\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    WebHtmlElementStrategy webHtmlElementStrategy =\n        WebHtmlElementStrategy.never,\n    required this.minScale,\n    required this.maxScale,\n    required this.containerSize,\n    required this.onDragStart,\n    required this.onDragUpdate,\n    required this.onDragEnd,\n    required this.doubleTapGestureRecognizer,\n    required this.horizontalDragGestureRecognizer,\n    required this.onChangePage,\n  }) : image = ResizeImage.resizeIfNeeded(\n         cacheWidth,\n         cacheHeight,\n         NetworkImage(\n           src,\n           scale: scale,\n           headers: headers,\n           webHtmlElementStrategy: webHtmlElementStrategy,\n         ),\n       ),\n       assert(cacheWidth == null || cacheWidth > 0),\n       assert(cacheHeight == null || cacheHeight > 0);\n\n  Image.file(\n    File file, {\n    super.key,\n    double scale = 1.0,\n    this.frameBuilder,\n    this.errorBuilder,\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.isAntiAlias = false,\n    this.filterQuality = FilterQuality.medium,\n    int? cacheWidth,\n    int? cacheHeight,\n    required this.minScale,\n    required this.maxScale,\n    required this.containerSize,\n    required this.onDragStart,\n    required this.onDragUpdate,\n    required this.onDragEnd,\n    required this.doubleTapGestureRecognizer,\n    required this.horizontalDragGestureRecognizer,\n    required this.onChangePage,\n  }) : assert(\n         !kIsWeb,\n         'Image.file is not supported on Flutter Web. '\n         'Consider using either Image.asset or Image.network instead.',\n       ),\n       image = ResizeImage.resizeIfNeeded(\n         cacheWidth,\n         cacheHeight,\n         FileImage(file, scale: scale),\n       ),\n       loadingBuilder = null,\n       assert(cacheWidth == null || cacheWidth > 0),\n       assert(cacheHeight == null || cacheHeight > 0);\n\n  Image.asset(\n    String name, {\n    super.key,\n    AssetBundle? bundle,\n    this.frameBuilder,\n    this.errorBuilder,\n    this.semanticLabel,\n    this.excludeFromSemantics = false,\n    double? scale,\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.isAntiAlias = false,\n    String? package,\n    this.filterQuality = FilterQuality.medium,\n    int? cacheWidth,\n    int? cacheHeight,\n    required this.minScale,\n    required this.maxScale,\n    required this.containerSize,\n    required this.onDragStart,\n    required this.onDragUpdate,\n    required this.onDragEnd,\n    required this.doubleTapGestureRecognizer,\n    required this.horizontalDragGestureRecognizer,\n    required this.onChangePage,\n  }) : image = ResizeImage.resizeIfNeeded(\n         cacheWidth,\n         cacheHeight,\n         scale != null\n             ? ExactAssetImage(\n                 name,\n                 bundle: bundle,\n                 scale: scale,\n                 package: package,\n               )\n             : AssetImage(name, bundle: bundle, package: package),\n       ),\n       loadingBuilder = null,\n       assert(cacheWidth == null || cacheWidth > 0),\n       assert(cacheHeight == null || cacheHeight > 0);\n\n  Image.memory(\n    Uint8List bytes, {\n    super.key,\n    double scale = 1.0,\n    this.frameBuilder,\n    this.errorBuilder,\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.isAntiAlias = false,\n    this.filterQuality = FilterQuality.medium,\n    int? cacheWidth,\n    int? cacheHeight,\n    required this.minScale,\n    required this.maxScale,\n    required this.containerSize,\n    required this.onDragStart,\n    required this.onDragUpdate,\n    required this.onDragEnd,\n    required this.doubleTapGestureRecognizer,\n    required this.horizontalDragGestureRecognizer,\n    required this.onChangePage,\n  }) : image = ResizeImage.resizeIfNeeded(\n         cacheWidth,\n         cacheHeight,\n         MemoryImage(bytes, scale: scale),\n       ),\n       loadingBuilder = null,\n       assert(cacheWidth == null || cacheWidth > 0),\n       assert(cacheHeight == null || cacheHeight > 0);\n\n  final ImageProvider image;\n\n  final ImageFrameBuilder? frameBuilder;\n\n  final ImageLoadingBuilder? loadingBuilder;\n\n  final ImageErrorWidgetBuilder? errorBuilder;\n\n  final double? width;\n\n  final double? height;\n\n  final Color? color;\n\n  final Animation<double>? opacity;\n\n  final FilterQuality filterQuality;\n\n  final BlendMode? colorBlendMode;\n\n  final BoxFit? fit;\n\n  final AlignmentGeometry alignment;\n\n  final ImageRepeat repeat;\n\n  final Rect? centerSlice;\n\n  final bool matchTextDirection;\n\n  final bool gaplessPlayback;\n\n  final String? semanticLabel;\n\n  final bool excludeFromSemantics;\n\n  final bool isAntiAlias;\n\n  final double minScale;\n  final double maxScale;\n  final Size containerSize;\n\n  final ValueChanged<ScaleStartDetails>? onDragStart;\n  final ValueChanged<ScaleUpdateDetails>? onDragUpdate;\n  final ValueChanged<ScaleEndDetails>? onDragEnd;\n  final ValueChanged<int>? onChangePage;\n\n  final DoubleTapGestureRecognizer doubleTapGestureRecognizer;\n  final ImageHorizontalDragGestureRecognizer horizontalDragGestureRecognizer;\n\n  @override\n  State<Image> createState() => _ImageState();\n\n  @override\n  void debugFillProperties(DiagnosticPropertiesBuilder properties) {\n    super.debugFillProperties(properties);\n    properties\n      ..add(DiagnosticsProperty<ImageProvider>('image', image))\n      ..add(DiagnosticsProperty<Function>('frameBuilder', frameBuilder))\n      ..add(\n        DiagnosticsProperty<Function>('loadingBuilder', loadingBuilder),\n      )\n      ..add(DoubleProperty('width', width, defaultValue: null))\n      ..add(DoubleProperty('height', height, defaultValue: null))\n      ..add(ColorProperty('color', color, defaultValue: null))\n      ..add(\n        DiagnosticsProperty<Animation<double>?>(\n          'opacity',\n          opacity,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        EnumProperty<BlendMode>(\n          'colorBlendMode',\n          colorBlendMode,\n          defaultValue: null,\n        ),\n      )\n      ..add(EnumProperty<BoxFit>('fit', fit, defaultValue: null))\n      ..add(\n        DiagnosticsProperty<AlignmentGeometry>(\n          'alignment',\n          alignment,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        EnumProperty<ImageRepeat>(\n          'repeat',\n          repeat,\n          defaultValue: ImageRepeat.noRepeat,\n        ),\n      )\n      ..add(\n        DiagnosticsProperty<Rect>(\n          'centerSlice',\n          centerSlice,\n          defaultValue: null,\n        ),\n      )\n      ..add(\n        FlagProperty(\n          'matchTextDirection',\n          value: matchTextDirection,\n          ifTrue: 'match text direction',\n        ),\n      )\n      ..add(\n        StringProperty('semanticLabel', semanticLabel, defaultValue: null),\n      )\n      ..add(\n        DiagnosticsProperty<bool>(\n          'this.excludeFromSemantics',\n          excludeFromSemantics,\n        ),\n      )\n      ..add(EnumProperty<FilterQuality>('filterQuality', filterQuality));\n  }\n}\n\nclass _ImageState extends State<Image> with WidgetsBindingObserver {\n  ImageStream? _imageStream;\n  ImageInfo? _imageInfo;\n  ImageChunkEvent? _loadingProgress;\n  bool _isListeningToStream = false;\n  int? _frameNumber;\n  bool _wasSynchronouslyLoaded = false;\n  late DisposableBuildContext<State<Image>> _scrollAwareContext;\n  Object? _lastException;\n  StackTrace? _lastStack;\n  ImageStreamCompleterHandle? _completerHandle;\n\n  bool _isPaused = false;\n\n  @override\n  void initState() {\n    super.initState();\n    WidgetsBinding.instance.addObserver(this);\n    _scrollAwareContext = DisposableBuildContext<State<Image>>(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    _resolveImage();\n\n    _isPaused =\n        !TickerMode.valuesOf(context).enabled ||\n        (MediaQuery.maybeDisableAnimationsOf(context) ?? false);\n\n    if (_isPaused && _frameNumber != null) {\n      _stopListeningToStream(keepStreamAlive: true);\n    } else {\n      _listenToStream();\n    }\n\n    super.didChangeDependencies();\n  }\n\n  @override\n  void didUpdateWidget(Image oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (_isListeningToStream &&\n        (widget.loadingBuilder == null) != (oldWidget.loadingBuilder == null)) {\n      final ImageStreamListener oldListener = _getListener();\n      _imageStream!.addListener(_getListener(recreateListener: true));\n      _imageStream!.removeListener(oldListener);\n    }\n    if (widget.image != oldWidget.image) {\n      _resolveImage();\n      _listenToStream();\n    }\n  }\n\n  @override\n  void reassemble() {\n    _resolveImage();\n    super.reassemble();\n  }\n\n  void _resolveImage() {\n    final provider = ScrollAwareImageProvider<Object>(\n      context: _scrollAwareContext,\n      imageProvider: widget.image,\n    );\n    final ImageStream newStream = provider.resolve(\n      createLocalImageConfiguration(\n        context,\n        size: widget.width != null && widget.height != null\n            ? Size(widget.width!, widget.height!)\n            : null,\n      ),\n    );\n    _updateSourceStream(newStream);\n  }\n\n  ImageStreamListener? _imageStreamListener;\n  ImageStreamListener _getListener({bool recreateListener = false}) {\n    if (_imageStreamListener == null || recreateListener) {\n      _lastException = null;\n      _lastStack = null;\n      _imageStreamListener = ImageStreamListener(\n        _handleImageFrame,\n        onChunk: widget.loadingBuilder == null ? null : _handleImageChunk,\n        onError: widget.errorBuilder != null || kDebugMode\n            ? (Object error, StackTrace? stackTrace) {\n                setState(() {\n                  _lastException = error;\n                  _lastStack = stackTrace;\n                });\n                assert(() {\n                  if (widget.errorBuilder == null) {\n                    throw error;\n                  }\n                  return true;\n                }());\n              }\n            : null,\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      _lastStack = null;\n      _frameNumber = _frameNumber == null ? 0 : _frameNumber! + 1;\n      _wasSynchronouslyLoaded = _wasSynchronouslyLoaded | synchronousCall;\n    });\n    if (_isPaused) {\n      _stopListeningToStream(keepStreamAlive: true);\n    }\n  }\n\n  void _handleImageChunk(ImageChunkEvent event) {\n    assert(widget.loadingBuilder != null);\n    setState(() {\n      _loadingProgress = event;\n      _lastException = null;\n      _lastStack = null;\n    });\n  }\n\n  void _replaceImage({required ImageInfo? info}) {\n    final ImageInfo? oldImageInfo = _imageInfo;\n    if (oldImageInfo != null) {\n      SchedulerBinding.instance.addPostFrameCallback(\n        (Duration duration) => oldImageInfo.dispose(),\n        debugLabel: 'Image.disposeOldInfo',\n      );\n    }\n    _imageInfo = info;\n  }\n\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    _isListeningToStream = true;\n    _imageStream!.addListener(_getListener());\n    _completerHandle?.dispose();\n    _completerHandle = null;\n  }\n\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    if (_imageStream!.completer != null && widget.errorBuilder != null) {\n      _imageStream!.completer!.addEphemeralErrorListener(\n        (\n          Object exception,\n          StackTrace? stackTrace,\n        ) {},\n      );\n    }\n    _imageStream!.removeListener(_getListener());\n    _isListeningToStream = false;\n  }\n\n  // Widget _debugBuildErrorWidget(BuildContext context, Object error) {\n  //   return Stack(\n  //     alignment: Alignment.center,\n  //     children: <Widget>[\n  //       const Positioned.fill(child: Placeholder(color: Color(0xCF8D021F))),\n  //       Padding(\n  //         padding: const EdgeInsets.all(4.0),\n  //         child: FittedBox(\n  //           child: Text(\n  //             '$error',\n  //             textAlign: TextAlign.center,\n  //             textDirection: TextDirection.ltr,\n  //             style: const TextStyle(\n  //               shadows: <Shadow>[Shadow(blurRadius: 1.0)],\n  //             ),\n  //           ),\n  //         ),\n  //       ),\n  //     ],\n  //   );\n  // }\n\n  @override\n  Widget build(BuildContext context) {\n    if (_lastException != null) {\n      if (widget.errorBuilder != null) {\n        return widget.errorBuilder!(context, _lastException!, _lastStack);\n      }\n      // if (kDebugMode) {\n      //   return _debugBuildErrorWidget(context, _lastException!);\n      // }\n    }\n\n    final Size childSize;\n    final bool isLongPic;\n    double? minScale, maxScale;\n    if (_imageInfo != null) {\n      final imgWidth = _imageInfo!.image.width.toDouble();\n      final imgHeight = _imageInfo!.image.height.toDouble();\n      final imgRatio = imgHeight / imgWidth;\n      isLongPic =\n          imgRatio > StyleString.imgMaxRatio &&\n          imgHeight > widget.containerSize.height;\n      if (isLongPic) {\n        final compatWidth = math.min(650.0, widget.containerSize.width);\n        minScale = compatWidth / widget.containerSize.height * imgRatio;\n        maxScale = math.max(widget.maxScale, minScale * 3);\n      }\n      childSize = Size(imgWidth, imgHeight);\n    } else {\n      childSize = .zero;\n      isLongPic = false;\n    }\n    Widget result = Viewer(\n      minScale: minScale ?? widget.minScale,\n      maxScale: maxScale ?? widget.maxScale,\n      isLongPic: isLongPic,\n      containerSize: widget.containerSize,\n      childSize: childSize,\n      onDragStart: widget.onDragStart,\n      onDragUpdate: widget.onDragUpdate,\n      onDragEnd: widget.onDragEnd,\n      doubleTapGestureRecognizer: widget.doubleTapGestureRecognizer,\n      horizontalDragGestureRecognizer: widget.horizontalDragGestureRecognizer,\n      onChangePage: widget.onChangePage,\n      child: RawImage(image: _imageInfo?.image),\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\n    if (widget.frameBuilder != null) {\n      result = widget.frameBuilder!(\n        context,\n        result,\n        _frameNumber,\n        _wasSynchronouslyLoaded,\n      );\n    }\n\n    if (widget.loadingBuilder != null) {\n      result = widget.loadingBuilder!(context, result, _loadingProgress);\n    }\n\n    return result;\n  }\n\n  @override\n  void debugFillProperties(DiagnosticPropertiesBuilder description) {\n    super.debugFillProperties(description);\n    description\n      ..add(DiagnosticsProperty<ImageStream>('stream', _imageStream))\n      ..add(DiagnosticsProperty<ImageInfo>('pixels', _imageInfo))\n      ..add(\n        DiagnosticsProperty<ImageChunkEvent>(\n          'loadingProgress',\n          _loadingProgress,\n        ),\n      )\n      ..add(DiagnosticsProperty<int>('frameNumber', _frameNumber))\n      ..add(\n        DiagnosticsProperty<bool>(\n          'wasSynchronouslyLoaded',\n          _wasSynchronouslyLoaded,\n        ),\n      );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/image_viewer/loading_indicator.dart",
    "content": "/*\n * This file is part of PiliPlus\n *\n * PiliPlus 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 * PiliPlus 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 PiliPlus.  If not, see <https://www.gnu.org/licenses/>.\n */\n\nimport 'dart:math' show pi;\n\nimport 'package:flutter/material.dart';\n\n///\n/// created by dom on 2026/02/14\n///\n\nclass LoadingIndicator extends LeafRenderObjectWidget {\n  const LoadingIndicator({\n    super.key,\n    required this.size,\n    required this.progress,\n  });\n\n  final double size;\n  final double progress;\n\n  @override\n  RenderObject createRenderObject(BuildContext context) {\n    return RenderLoadingIndicator(\n      preferredSize: size,\n      progress: progress,\n    );\n  }\n\n  @override\n  void updateRenderObject(\n    BuildContext context,\n    RenderLoadingIndicator renderObject,\n  ) {\n    renderObject\n      ..preferredSize = size\n      ..progress = progress;\n  }\n}\n\nclass RenderLoadingIndicator extends RenderBox {\n  RenderLoadingIndicator({\n    required double preferredSize,\n    required double progress,\n  }) : _preferredSize = preferredSize,\n       _progress = progress;\n\n  double _preferredSize;\n  double get preferredSize => _preferredSize;\n  set preferredSize(double value) {\n    if (_preferredSize == value) return;\n    _preferredSize = value;\n    markNeedsLayout();\n  }\n\n  double _progress;\n  double get progress => _progress;\n  set progress(double value) {\n    if (_progress == value) return;\n    _progress = value;\n    markNeedsPaint();\n  }\n\n  @override\n  void performLayout() {\n    size = constraints.constrainDimensions(_preferredSize, _preferredSize);\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    if (_progress == 0) {\n      return;\n    }\n    const padding = 8.0;\n    const strokeWidth = 1.4;\n    const startAngle = -pi / 2;\n\n    final paint = Paint()..isAntiAlias = true;\n    final size = this.size;\n    final radius = size.width / 2 - strokeWidth;\n    final center = size.center(.zero);\n\n    context.canvas\n      ..drawCircle(\n        center,\n        radius,\n        paint\n          ..style = .fill\n          ..color = const Color(0x80000000),\n      )\n      ..drawCircle(\n        center,\n        radius,\n        paint\n          ..style = .stroke\n          ..strokeWidth = strokeWidth\n          ..color = Colors.white,\n      )\n      ..drawArc(\n        Rect.fromCircle(center: center, radius: radius - padding),\n        startAngle,\n        progress * 2 * pi,\n        true,\n        paint..style = .fill,\n      );\n  }\n\n  @override\n  bool get isRepaintBoundary => true;\n}\n"
  },
  {
    "path": "lib/common/widgets/image_viewer/viewer.dart",
    "content": "/*\n * This file is part of PiliPlus\n *\n * PiliPlus 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 * PiliPlus 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 PiliPlus.  If not, see <https://www.gnu.org/licenses/>.\n */\n\nimport 'dart:math' as math;\n\nimport 'package:PiliPlus/common/widgets/gesture/horizontal_drag_gesture_recognizer.dart'\n    show touchSlopH;\nimport 'package:PiliPlus/common/widgets/gesture/image_horizontal_drag_gesture_recognizer.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:easy_debounce/easy_throttle.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/physics.dart' show FrictionSimulation;\nimport 'package:flutter/services.dart' show HardwareKeyboard;\n\n///\n/// created by dom on 2026/02/14\n///\n\nclass Viewer extends StatefulWidget {\n  const Viewer({\n    super.key,\n    required this.minScale,\n    required this.maxScale,\n    this.isLongPic = false,\n    required this.containerSize,\n    required this.childSize,\n    required this.onDragStart,\n    required this.onDragUpdate,\n    required this.onDragEnd,\n    required this.doubleTapGestureRecognizer,\n    required this.horizontalDragGestureRecognizer,\n    required this.onChangePage,\n    required this.child,\n  });\n\n  final double minScale;\n  final double maxScale;\n  final bool isLongPic;\n  final Size containerSize;\n  final Size childSize;\n  final Widget child;\n\n  final ValueChanged<ScaleStartDetails>? onDragStart;\n  final ValueChanged<ScaleUpdateDetails>? onDragUpdate;\n  final ValueChanged<ScaleEndDetails>? onDragEnd;\n  final ValueChanged<int>? onChangePage;\n\n  final DoubleTapGestureRecognizer doubleTapGestureRecognizer;\n  final ImageHorizontalDragGestureRecognizer horizontalDragGestureRecognizer;\n\n  @override\n  State<StatefulWidget> createState() => _ViewerState();\n}\n\nclass _ViewerState extends State<Viewer> with SingleTickerProviderStateMixin {\n  double get _interactionEndFrictionCoefficient => 0.0001 * _scale; // 0.0000135\n  static const double _scaleFactor = kDefaultMouseScrollToScaleFactor;\n\n  _GestureType? _gestureType;\n\n  final Matrix4 _matrix = Matrix4.identity();\n\n  late double __scale;\n  double get _scale => __scale;\n  set _scale(double value) {\n    __scale = value;\n    _matrix[0] = _matrix[5] = _matrix[10] = value;\n  }\n\n  late Offset __position;\n  Offset get _position => __position;\n  set _position(Offset value) {\n    __position = value;\n    _matrix\n      ..[12] = value.dx\n      ..[13] = value.dy;\n  }\n\n  Offset? _scalePos;\n  double? _scaleStart;\n  Offset? _referenceFocalPoint;\n\n  late Size _imageSize;\n\n  late final DoubleTapGestureRecognizer _doubleTapGestureRecognizer;\n  late final ImageHorizontalDragGestureRecognizer\n  _horizontalDragGestureRecognizer;\n  late final ScaleGestureRecognizer _scaleGestureRecognizer;\n\n  Offset? _downPos;\n  late final AnimationController _animationController;\n\n  late double _scaleFrom, _scaleTo;\n  late Offset _positionFrom, _positionTo;\n\n  void _listener() {\n    final t = Curves.easeOut.transform(_animationController.value);\n    _scale = t.lerp(_scaleFrom, _scaleTo);\n    _position = Offset.lerp(_positionFrom, _positionTo, t)!;\n    setState(() {});\n  }\n\n  void _reset() {\n    _scale = widget.minScale;\n    _position = .zero;\n  }\n\n  void _initSize() {\n    _reset();\n    _imageSize = applyBoxFit(\n      .scaleDown,\n      widget.childSize,\n      widget.containerSize,\n    ).destination;\n    if (widget.isLongPic) {\n      final containerWidth = widget.containerSize.width;\n      final containerHeight = widget.containerSize.height;\n      final imageHeight = _imageSize.height * _scale;\n      _position = Offset(\n        (1 - _scale) * containerWidth / 2,\n        (imageHeight - _scale * containerHeight) / 2,\n      );\n    }\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    _initSize();\n\n    _animationController = AnimationController(\n      vsync: this,\n      duration: const Duration(milliseconds: 300),\n    )..addListener(_listener);\n\n    _doubleTapGestureRecognizer = widget.doubleTapGestureRecognizer;\n    _horizontalDragGestureRecognizer = widget.horizontalDragGestureRecognizer;\n\n    _scaleGestureRecognizer = ScaleGestureRecognizer(debugOwner: this)\n      ..dragStartBehavior = .start\n      ..onStart = _onScaleStart\n      ..onUpdate = _onScaleUpdate\n      ..onEnd = _onScaleEnd\n      ..gestureSettings = DeviceGestureSettings(touchSlop: touchSlopH);\n  }\n\n  @override\n  void didUpdateWidget(Viewer oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (oldWidget.containerSize != widget.containerSize ||\n        oldWidget.childSize != widget.childSize) {\n      _initSize();\n    }\n  }\n\n  @override\n  void dispose() {\n    _animationController\n      ..removeListener(_listener)\n      ..dispose();\n    _scaleGestureRecognizer.dispose();\n    super.dispose();\n  }\n\n  Offset _toScene(Offset localFocalPoint) {\n    return (localFocalPoint - _position) / _scale;\n  }\n\n  Offset _clampPosition(Offset offset, double scale) {\n    final containerSize = widget.containerSize;\n    final imageWidth = _imageSize.width * scale;\n    final imageHeight = _imageSize.height * scale;\n\n    final center = containerSize * (1 - scale) / 2;\n\n    final dxOffset = (imageWidth - containerSize.width) / 2;\n    final dyOffset = (imageHeight - containerSize.height) / 2;\n\n    return Offset(\n      imageWidth > containerSize.width\n          ? clampDouble(\n              offset.dx,\n              center.width - dxOffset,\n              center.width + dxOffset,\n            )\n          : center.width,\n      imageHeight > containerSize.height\n          ? clampDouble(\n              offset.dy,\n              center.height - dyOffset,\n              center.height + dyOffset,\n            )\n          : center.height,\n    );\n  }\n\n  Offset _matrixTranslate(Offset translation) {\n    if (translation == .zero) {\n      return _position;\n    }\n    return _clampPosition(_position + translation * _scale, _scale);\n  }\n\n  void _onDoubleTapDown(TapDownDetails details) {\n    _downPos = details.localPosition;\n  }\n\n  void _onDoubleTap() {\n    if (!mounted) return;\n    if (_animationController.isAnimating) return;\n    EasyThrottle.throttle(\n      'VIEWER_TAP',\n      const Duration(milliseconds: 555),\n      _handleDoubleTap,\n    );\n  }\n\n  void _handleDoubleTap() {\n    if (!mounted) return;\n    if (_animationController.isAnimating) return;\n    _scaleFrom = _scale;\n    _positionFrom = _position;\n\n    double endScale;\n    if (_scale == widget.minScale) {\n      endScale = widget.maxScale * 0.6;\n      if (endScale <= widget.minScale) {\n        endScale = widget.maxScale;\n      }\n    } else {\n      endScale = widget.minScale;\n    }\n    final position = _clampPosition(\n      Offset.lerp(_downPos!, _position, endScale / _scale)!,\n      endScale,\n    );\n\n    _scaleTo = endScale;\n    _positionTo = position;\n\n    _animationController\n      ..duration = const Duration(milliseconds: 300)\n      ..forward(from: 0);\n  }\n\n  static bool _calc(Offset initialPosition, Offset lastPosition) {\n    final offset = lastPosition - initialPosition;\n    return offset.dy.abs() > offset.dx.abs();\n  }\n\n  void _onScaleStart(ScaleStartDetails details) {\n    if (_animationController.isAnimating) {\n      _animationController.stop();\n    }\n\n    if (details.pointerCount == 1) {\n      if (widget.isLongPic) {\n        final imageHeight = _scale * _imageSize.height;\n        final containerHeight = widget.containerSize.height;\n        if (_scalePos != null && _calc(_scalePos!, details.focalPoint)) {\n          final bool drag;\n          if (details.focalPoint.dy > _scalePos!.dy) {\n            drag = _position.dy.equals(\n              (imageHeight - _scale * containerHeight) / 2,\n              1e-6,\n            );\n          } else {\n            drag = _position.dy.equals(containerHeight - imageHeight, 1e-6);\n          }\n          if (drag) {\n            _gestureType = .drag;\n            widget.onDragStart?.call(details);\n            return;\n          }\n        }\n      } else if (_scale == widget.minScale) {\n        _gestureType = .drag;\n        widget.onDragStart?.call(details);\n        return;\n      }\n    }\n\n    _scaleStart = _scale;\n    _referenceFocalPoint = _toScene(details.localFocalPoint);\n  }\n\n  void _onScaleUpdate(ScaleUpdateDetails details) {\n    if (_gestureType == .drag) {\n      widget.onDragUpdate?.call(details);\n      return;\n    }\n\n    if (details.scale != 1.0) {\n      _gestureType = .scale;\n      _scale = clampDouble(\n        _scaleStart! * details.scale,\n        widget.minScale,\n        widget.maxScale,\n      );\n\n      final Offset focalPointSceneScaled = _toScene(details.localFocalPoint);\n      _position = _matrixTranslate(\n        focalPointSceneScaled - _referenceFocalPoint!,\n      );\n      setState(() {});\n    } else {\n      _gestureType = .pan;\n      final Offset focalPointScene = _toScene(details.localFocalPoint);\n      final Offset translationChange = focalPointScene - _referenceFocalPoint!;\n      _position = _matrixTranslate(translationChange);\n      _referenceFocalPoint = _toScene(details.localFocalPoint);\n      setState(() {});\n    }\n  }\n\n  /// ref [InteractiveViewer]\n  void _onScaleEnd(ScaleEndDetails details) {\n    switch (_gestureType) {\n      case _GestureType.pan:\n        if (details.velocity.pixelsPerSecond.distance < kMinFlingVelocity) {\n          return;\n        }\n        final drag = _interactionEndFrictionCoefficient;\n        final FrictionSimulation frictionSimulationX = FrictionSimulation(\n          drag,\n          _position.dx,\n          details.velocity.pixelsPerSecond.dx,\n        );\n        final FrictionSimulation frictionSimulationY = FrictionSimulation(\n          drag,\n          _position.dy,\n          details.velocity.pixelsPerSecond.dy,\n        );\n        final double tFinal = _getFinalTime(\n          details.velocity.pixelsPerSecond.distance,\n          drag,\n        );\n        final position = _clampPosition(\n          Offset(frictionSimulationX.finalX, frictionSimulationY.finalX),\n          _scale,\n        );\n\n        _scaleFrom = _scaleTo = _scale;\n        _positionFrom = _position;\n        _positionTo = position;\n\n        _animationController\n          ..duration = Duration(milliseconds: (tFinal * 1000).round())\n          ..forward(from: 0);\n      case _GestureType.scale:\n        // if (details.scaleVelocity.abs() < 0.1) {\n        //   return;\n        // }\n        // final double scale = _scale;\n        // final FrictionSimulation frictionSimulation = FrictionSimulation(\n        //   _interactionEndFrictionCoefficient * _scaleFactor,\n        //   scale,\n        //   details.scaleVelocity / 10,\n        // );\n        // final double tFinal = _getFinalTime(\n        //   details.scaleVelocity.abs(),\n        //   _interactionEndFrictionCoefficient,\n        //   effectivelyMotionless: 0.1,\n        // );\n        // _scaleAnimation = _scaleController.drive(\n        //   Tween<double>(\n        //     begin: scale,\n        //     end: frictionSimulation.x(tFinal),\n        //   ).chain(CurveTween(curve: Curves.decelerate)),\n        // )..addListener(_handleScaleAnimation);\n        // _animationController\n        //   ..duration = Duration(milliseconds: (tFinal * 1000).round())\n        //   ..forward(from: 0);\n        break;\n      case _GestureType.drag:\n        widget.onDragEnd?.call(details);\n      case null:\n    }\n    _scalePos = null;\n    _gestureType = null;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Listener(\n      behavior: .opaque,\n      onPointerDown: _onPointerDown,\n      onPointerPanZoomStart: _onPointerPanZoomStart,\n      onPointerSignal: _onPointerSignal,\n      child: ClipRect(\n        child: Transform(\n          transform: _matrix,\n          child: widget.child,\n        ),\n      ),\n    );\n  }\n\n  void _onPointerDown(PointerDownEvent event) {\n    _scalePos = event.position;\n    _doubleTapGestureRecognizer\n      ..onDoubleTapDown = _onDoubleTapDown\n      ..onDoubleTap = _onDoubleTap;\n    _horizontalDragGestureRecognizer\n      ..isBoundaryAllowed = _isBoundaryAllowed\n      ..addPointer(event);\n    _scaleGestureRecognizer.addPointer(event);\n  }\n\n  void _onPointerPanZoomStart(PointerPanZoomStartEvent event) {\n    _scaleGestureRecognizer.addPointerPanZoom(event);\n  }\n\n  bool _isBoundaryAllowed(Offset? initialPosition, OffsetPair lastPosition) {\n    if (initialPosition == null) {\n      return true;\n    }\n    if (_scale <= widget.minScale) {\n      return true;\n    }\n    final containerWidth = widget.containerSize.width;\n    final imageWidth = _imageSize.width * _scale;\n    if (imageWidth <= containerWidth) {\n      return true;\n    }\n    final dx = (1 - _scale) * containerWidth / 2;\n    final dxOffset = (imageWidth - containerWidth) / 2;\n    if (initialPosition.dx < lastPosition.global.dx) {\n      return _position.dx.equals(dx + dxOffset, 1e-6);\n    } else {\n      return _position.dx.equals(dx - dxOffset, 1e-6);\n    }\n  }\n\n  void _onPointerSignal(PointerSignalEvent event) {\n    if (event is PointerScrollEvent) {\n      if (widget.onChangePage != null &&\n          !HardwareKeyboard.instance.isControlPressed) {\n        widget.onChangePage!.call(event.scrollDelta.dy < 0 ? -1 : 1);\n        return;\n      }\n      final double scaleChange = math.exp(-event.scrollDelta.dy / _scaleFactor);\n      final Offset local = event.localPosition;\n      final Offset focalPointScene = _toScene(local);\n      _scale = clampDouble(\n        _scale * scaleChange,\n        widget.minScale,\n        widget.maxScale,\n      );\n      final Offset focalPointSceneScaled = _toScene(local);\n      _position = _matrixTranslate(focalPointSceneScaled - focalPointScene);\n      setState(() {});\n    }\n  }\n}\n\nenum _GestureType { pan, scale, drag }\n\ndouble _getFinalTime(\n  double velocity,\n  double drag, {\n  double effectivelyMotionless = 10,\n}) {\n  return math.log(effectivelyMotionless / velocity) / math.log(drag / 100);\n}\n"
  },
  {
    "path": "lib/common/widgets/keep_alive_wrapper.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass KeepAliveWrapper extends StatefulWidget {\n  const KeepAliveWrapper({\n    super.key,\n    required this.child,\n    this.wantKeepAlive = true,\n  });\n\n  final Widget child;\n  final bool wantKeepAlive;\n\n  @override\n  State<KeepAliveWrapper> createState() => _KeepAliveWrapperState();\n}\n\nclass _KeepAliveWrapperState extends State<KeepAliveWrapper>\n    with AutomaticKeepAliveClientMixin {\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    return widget.child;\n  }\n\n  @override\n  void didUpdateWidget(KeepAliveWrapper oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (oldWidget.wantKeepAlive != widget.wantKeepAlive) {\n      updateKeepAlive();\n    }\n  }\n\n  @override\n  bool get wantKeepAlive => widget.wantKeepAlive;\n}\n"
  },
  {
    "path": "lib/common/widgets/loading_widget/http_error.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_svg/flutter_svg.dart';\n\nclass HttpError extends StatelessWidget {\n  const HttpError({\n    super.key,\n    this.isSliver = true,\n    this.errMsg,\n    this.onReload,\n    this.btnText,\n    this.safeArea = true,\n  });\n\n  final bool isSliver;\n  final String? errMsg;\n  final VoidCallback? onReload;\n  final String? btnText;\n  final bool safeArea;\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    final child = Column(\n      mainAxisSize: MainAxisSize.min,\n      crossAxisAlignment: CrossAxisAlignment.center,\n      mainAxisAlignment: MainAxisAlignment.center,\n      children: [\n        const SizedBox(height: 40),\n        SvgPicture.asset(\n          \"assets/images/error.svg\",\n          height: 200,\n        ),\n        const SizedBox(height: 30),\n        Padding(\n          padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 5),\n          child: SelectableText(\n            errMsg ?? '没有数据',\n            textAlign: TextAlign.center,\n            style: theme.textTheme.titleSmall,\n            scrollPhysics: const NeverScrollableScrollPhysics(),\n          ),\n        ),\n        if (onReload != null)\n          FilledButton.tonal(\n            onPressed: onReload,\n            style: FilledButton.styleFrom(\n              tapTargetSize: .padded,\n              backgroundColor: theme.colorScheme.primary.withAlpha(20),\n              shadowColor: Colors.transparent,\n            ),\n            child: Text(\n              btnText ?? '点击重试',\n              style: TextStyle(color: theme.colorScheme.primary),\n            ),\n          ),\n        if (safeArea)\n          SizedBox(height: 40 + MediaQuery.viewPaddingOf(context).bottom),\n      ],\n    );\n\n    return isSliver\n        ? SliverToBoxAdapter(child: child)\n        : SizedBox(width: double.infinity, child: child);\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/loading_widget/loading_widget.dart",
    "content": "import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/m3e_loading_indicator.dart';\nimport 'package:flutter/material.dart';\n\nconst Widget m3eLoading = Center(child: M3ELoadingIndicator());\n\nconst Widget circularLoading = Center(child: CircularProgressIndicator());\n\nconst Widget linearLoading = SliverToBoxAdapter(\n  child: LinearProgressIndicator(),\n);\n\nconst Widget scrollableError = CustomScrollView(slivers: [HttpError()]);\n\nWidget scrollErrorWidget({\n  String? errMsg,\n  VoidCallback? onReload,\n  ScrollController? controller,\n}) => CustomScrollView(\n  controller: controller,\n  slivers: [\n    HttpError(\n      errMsg: errMsg,\n      onReload: onReload,\n    ),\n  ],\n);\n"
  },
  {
    "path": "lib/common/widgets/loading_widget/m3e_loading_indicator.dart",
    "content": "/*\n * This file is part of PiliPlus\n *\n * PiliPlus 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 * PiliPlus 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 PiliPlus.  If not, see <https://www.gnu.org/licenses/>.\n */\n\nimport 'dart:math' as math;\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/physics.dart' show SpringSimulation;\nimport 'package:material_new_shapes/material_new_shapes.dart';\n\n/// reimplement of https://github.com/EmilyMoonstone/material_3_expressive/tree/main/packages/loading_indicator_m3e\n\nclass M3ELoadingIndicator extends StatefulWidget {\n  const M3ELoadingIndicator({super.key});\n\n  @override\n  State<M3ELoadingIndicator> createState() => _M3ELoadingIndicatorState();\n}\n\nclass _M3ELoadingIndicatorState extends State<M3ELoadingIndicator>\n    with SingleTickerProviderStateMixin {\n  static final List<Morph> _morphs = () {\n    final List<RoundedPolygon> shapes = [\n      MaterialShapes.softBurst,\n      MaterialShapes.cookie9Sided,\n      MaterialShapes.pentagon,\n      MaterialShapes.pill,\n      MaterialShapes.sunny,\n      MaterialShapes.cookie4Sided,\n      MaterialShapes.oval,\n    ];\n    return [\n      for (var i = 0; i < shapes.length; i++)\n        Morph(\n          shapes[i],\n          shapes[(i + 1) % shapes.length],\n        ),\n    ];\n  }();\n\n  static const int _morphIntervalMs = 650;\n  static const double _fullRotation = 360.0;\n  static const int _globalRotationDurationMs = 4666;\n  static const double _quarterRotation = _fullRotation / 4;\n\n  late final AnimationController _controller;\n\n  int _morphIndex = 1;\n\n  double _morphRotationTargetAngle = _quarterRotation;\n\n  final _morphAnimationSpec = SpringSimulation(\n    SpringDescription.withDampingRatio(ratio: 0.6, stiffness: 200.0, mass: 1.0),\n    0.0,\n    1.0,\n    5.0,\n    snapToEnd: true,\n  );\n\n  void _statusListener(AnimationStatus status) {\n    if (status == AnimationStatus.completed) {\n      _startAnimation();\n    }\n  }\n\n  void _startAnimation() {\n    _morphIndex++;\n    _morphRotationTargetAngle =\n        (_morphRotationTargetAngle + _quarterRotation) % _fullRotation;\n    _controller\n      ..value = 0.0\n      ..animateWith(_morphAnimationSpec);\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    _controller =\n        AnimationController(\n            vsync: this,\n            duration: const Duration(milliseconds: _morphIntervalMs),\n          )\n          ..addStatusListener(_statusListener)\n          ..value = 0.0\n          ..animateWith(_morphAnimationSpec);\n  }\n\n  @override\n  void dispose() {\n    _controller\n      ..removeStatusListener(_statusListener)\n      ..dispose();\n    super.dispose();\n  }\n\n  double _calcAngle(double progress) {\n    final elapsedInMs =\n        _morphIntervalMs * (_morphIndex - 1) +\n        (_controller.lastElapsedDuration?.inMilliseconds ?? 0);\n    final globalRotationControllerValue =\n        (elapsedInMs % _globalRotationDurationMs) / _globalRotationDurationMs;\n    final globalRotationDegrees = globalRotationControllerValue * _fullRotation;\n    final totalRotationDegrees =\n        progress * _quarterRotation +\n        _morphRotationTargetAngle +\n        globalRotationDegrees;\n    return totalRotationDegrees * (math.pi / 180.0);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final color = Theme.of(context).colorScheme.secondaryFixedDim;\n    return AnimatedBuilder(\n      animation: _controller,\n      builder: (context, child) {\n        final progress = _controller.value;\n        return _M3ELoadingIndicator(\n          morph: _morphs[_morphIndex % _morphs.length],\n          progress: progress,\n          angle: _calcAngle(progress),\n          color: color,\n        );\n      },\n    );\n  }\n}\n\nclass _M3ELoadingIndicator extends LeafRenderObjectWidget {\n  const _M3ELoadingIndicator({\n    required this.morph,\n    required this.progress,\n    required this.angle,\n    required this.color,\n  });\n\n  final Morph morph;\n\n  final double progress;\n\n  final double angle;\n\n  final Color color;\n\n  @override\n  RenderObject createRenderObject(BuildContext context) {\n    return _RenderM3ELoadingIndicator(\n      morph: morph,\n      progress: progress,\n      angle: angle,\n      color: color,\n    );\n  }\n\n  @override\n  void updateRenderObject(\n    BuildContext context,\n    _RenderM3ELoadingIndicator renderObject,\n  ) {\n    renderObject\n      ..morph = morph\n      ..progress = progress\n      ..angle = angle\n      ..color = color;\n  }\n}\n\nclass _RenderM3ELoadingIndicator extends RenderBox {\n  _RenderM3ELoadingIndicator({\n    required Morph morph,\n    required double progress,\n    required double angle,\n    required Color color,\n  }) : _morph = morph,\n       _progress = progress,\n       _angle = angle,\n       _color = color,\n       _paint = Paint()\n         ..style = PaintingStyle.fill\n         ..color = color;\n\n  Morph _morph;\n  Morph get morph => _morph;\n  set morph(Morph value) {\n    if (_morph == value) return;\n    _morph = value;\n    markNeedsPaint();\n  }\n\n  double _progress;\n  double get progress => _progress;\n  set progress(double value) {\n    if (_progress == value) return;\n    _progress = value;\n    markNeedsPaint();\n  }\n\n  double _angle;\n  double get angle => _angle;\n  set angle(double value) {\n    if (_angle == value) return;\n    _angle = value;\n    markNeedsPaint();\n  }\n\n  Color _color;\n  final Paint _paint;\n  set color(Color value) {\n    if (_color == value) return;\n    _paint.color = _color = value;\n    markNeedsPaint();\n  }\n\n  @override\n  void performLayout() {\n    size = constraints.constrainDimensions(40, 40);\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    final width = size.width;\n    final value = size.width / 2;\n    final matrix = Matrix4.identity()\n      ..translateByDouble(offset.dx + value, offset.dy + value, 0.0, 1.0)\n      ..rotateZ(angle)\n      ..translateByDouble(-value, -value, 0.0, 1.0)\n      ..scaleByDouble(width, width, width, 1.0);\n    final path = morph.toPath(progress: progress).transform(matrix.storage);\n\n    context.canvas.drawPath(path, _paint);\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/loading_widget.dart",
    "content": "import 'package:PiliPlus/common/widgets/custom_arc.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass LoadingWidget extends StatelessWidget {\n  const LoadingWidget({\n    super.key,\n    this.msg = 'loading...',\n    required this.progress,\n  });\n\n  ///loading msg\n  final String msg;\n  final RxDouble progress;\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    final onSurfaceVariant = theme.colorScheme.onSurfaceVariant;\n    return Container(\n      padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 20),\n      decoration: BoxDecoration(\n        color: theme.dialogTheme.backgroundColor,\n        borderRadius: const BorderRadius.all(Radius.circular(15)),\n      ),\n      child: Column(\n        spacing: 20,\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          //loading animation\n          Obx(\n            () => Arc(\n              size: 40,\n              color: onSurfaceVariant,\n              strokeWidth: 3,\n              progress: progress.value,\n            ),\n          ),\n          //msg\n          Text(msg, style: TextStyle(color: onSurfaceVariant)),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/marquee.dart",
    "content": "import 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart';\nimport 'package:flutter/scheduler.dart';\n\nclass MarqueeText extends StatelessWidget {\n  final String text;\n  final TextStyle? style;\n  final double spacing;\n  final double velocity;\n  final ContextSingleTicker? provider;\n\n  const MarqueeText(\n    this.text, {\n    super.key,\n    this.style,\n    this.spacing = 0,\n    this.velocity = 25,\n    this.provider,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    return NormalMarquee(\n      velocity: velocity,\n      spacing: spacing,\n      provider: provider,\n      child: Text(\n        text,\n        style: style,\n        maxLines: 1,\n        textDirection: TextDirection.ltr,\n      ),\n    );\n  }\n}\n\nabstract class Marquee extends SingleChildRenderObjectWidget {\n  final Axis direction;\n  final Clip clipBehavior;\n  final double spacing;\n  final double velocity;\n  final ContextSingleTicker? provider;\n\n  const Marquee({\n    super.key,\n    required this.velocity,\n    required super.child,\n    this.direction = Axis.horizontal,\n    this.clipBehavior = Clip.hardEdge,\n    this.spacing = 0,\n    this.provider,\n  });\n\n  @override\n  void updateRenderObject(\n    BuildContext context,\n    covariant MarqueeRender renderObject,\n  ) {\n    renderObject\n      ..direction = direction\n      ..clipBehavior = clipBehavior\n      ..velocity = velocity\n      ..spacing = spacing;\n\n    if (provider != null) {\n      renderObject.provider = provider!;\n    }\n  }\n}\n\nclass NormalMarquee extends Marquee {\n  const NormalMarquee({\n    super.key,\n    required super.velocity,\n    required super.child,\n    super.direction,\n    super.clipBehavior,\n    super.spacing,\n    super.provider,\n  });\n\n  @override\n  RenderObject createRenderObject(BuildContext context) => _NormalMarqueeRender(\n    direction: direction,\n    velocity: velocity,\n    clipBehavior: clipBehavior,\n    spacing: spacing,\n    provider: provider ?? ContextSingleTicker(context),\n  );\n}\n\nclass BounceMarquee extends Marquee {\n  const BounceMarquee({\n    super.key,\n    required super.velocity,\n    required super.child,\n    super.direction,\n    super.clipBehavior,\n    super.spacing,\n    super.provider,\n  });\n\n  @override\n  RenderObject createRenderObject(BuildContext context) => _BounceMarqueeRender(\n    direction: direction,\n    velocity: velocity,\n    clipBehavior: clipBehavior,\n    spacing: spacing,\n    provider: provider ?? ContextSingleTicker(context),\n  );\n}\n\nabstract class MarqueeRender extends RenderBox\n    with RenderObjectWithChildMixin<RenderBox> {\n  MarqueeRender({\n    required Axis direction,\n    required double velocity,\n    required double spacing,\n    required this.clipBehavior,\n    required ContextSingleTicker provider,\n  }) : _ticker = provider,\n       _spacing = spacing,\n       _velocity = velocity,\n       _direction = direction,\n       assert(spacing.isFinite && !spacing.isNaN);\n\n  Clip clipBehavior;\n\n  Axis _direction;\n  Axis get direction => _direction;\n  set direction(Axis value) {\n    if (_direction == value) return;\n    _direction = value;\n    markNeedsLayout();\n  }\n\n  ContextSingleTicker _ticker;\n  set provider(ContextSingleTicker value) {\n    if (_ticker == value) return;\n    if (_ticker._ticker != null) {\n      if (value._ticker != null) {\n        value._ticker!.absorbTicker(_ticker._ticker!);\n      } else {\n        value\n          ..createTicker(_onTick)\n          ..initStart();\n      }\n    }\n    _ticker.cancel();\n    _ticker = value;\n  }\n\n  double _velocity;\n  set velocity(double value) {\n    if (_velocity == value) return;\n    _velocity = value;\n    _simulation = _simulation?.copyWith(initialValue: _delta, velocity: value);\n    _ticker.reset();\n  }\n\n  double _spacing;\n  set spacing(double value) {\n    if (value.isNegative) {\n      value *= _direction == Axis.horizontal ? -size.width : -size.height;\n    }\n    if (_spacing == value) return;\n\n    _simulation = _simulation?.copyWith(\n      initialValue: _delta,\n      addSize: value - _spacing,\n    );\n    _spacing = value;\n    _ticker.reset();\n  }\n\n  double _delta = 0;\n  set delta(double value) {\n    if (_delta == value) return;\n    _delta = value;\n    markNeedsPaint();\n  }\n\n  @override\n  void attach(PipelineOwner owner) {\n    super.attach(owner);\n    _ticker.updateTicker();\n  }\n\n  @override\n  void dispose() {\n    _ticker.cancel();\n    super.dispose();\n  }\n\n  late double _distance;\n\n  _MarqueeSimulation? _simulation;\n\n  @override\n  void performLayout() {\n    final child = this.child;\n    if (child == null) {\n      size = constraints.smallest;\n      return;\n    }\n\n    if (_direction == Axis.horizontal) {\n      child.layout(\n        BoxConstraints(maxHeight: constraints.maxHeight),\n        parentUsesSize: true,\n      );\n      size = constraints.constrain(child.size);\n      _distance = child.size.width - size.width;\n      if (_spacing.isNegative) _spacing *= -size.width;\n    } else {\n      child.layout(\n        BoxConstraints(maxWidth: constraints.maxWidth),\n        parentUsesSize: true,\n      );\n      size = constraints.constrain(child.size);\n      _distance = child.size.height - size.height;\n      if (_spacing.isNegative) _spacing *= -size.height;\n    }\n\n    if (_distance > 0) {\n      updateSize();\n      _ticker.initIfNeeded(_onTick);\n      markNeedsCompositingBitsUpdate();\n    } else {\n      _ticker.cancel();\n    }\n  }\n\n  @override\n  bool get isRepaintBoundary => _ticker._ticker != null;\n\n  void paintCenter(PaintingContext context, Offset offset) {\n    if (_direction == Axis.horizontal) {\n      context.paintChild(child!, Offset(offset.dx - _distance / 2, offset.dy));\n    } else {\n      context.paintChild(child!, Offset(offset.dx, offset.dy - _distance / 2));\n    }\n  }\n\n  void _onTick(Duration elapsed) {\n    delta = _simulation!.x(\n      elapsed.inMicroseconds.toDouble() / Duration.microsecondsPerSecond,\n    );\n  }\n\n  void updateSize();\n}\n\nclass _BounceMarqueeRender extends MarqueeRender {\n  _BounceMarqueeRender({\n    required super.direction,\n    required super.velocity,\n    required super.clipBehavior,\n    required super.spacing,\n    required super.provider,\n  });\n\n  @override\n  void updateSize() {\n    final size = _distance + _spacing;\n    if (size == _simulation?.size) return;\n    _simulation = _MarqueeSimulation(_delta, size, false, _velocity);\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    if (child == null) return;\n\n    if (_distance > 0) {\n      final delta = _spacing / 2.0 - _delta;\n      void paintChild() {\n        if (_direction == Axis.horizontal) {\n          context.paintChild(child!, Offset(offset.dx + delta, offset.dy));\n        } else {\n          context.paintChild(child!, Offset(offset.dx, offset.dy + delta));\n        }\n      }\n\n      if (clipBehavior == Clip.none) {\n        paintChild();\n      } else {\n        final rect = Rect.fromLTRB(0, 0, size.width, size.height);\n        context.clipRectAndPaint(rect, clipBehavior, rect, paintChild);\n      }\n    } else {\n      context.paintChild(child!, offset);\n    }\n  }\n}\n\nclass _NormalMarqueeRender extends MarqueeRender {\n  _NormalMarqueeRender({\n    required super.direction,\n    required super.velocity,\n    required super.clipBehavior,\n    required super.spacing,\n    required super.provider,\n  });\n\n  @override\n  void updateSize() {\n    final size =\n        (_direction == Axis.horizontal\n            ? child!.size.width\n            : child!.size.height) +\n        _spacing;\n    if (size == _simulation?.size) return;\n    _simulation = _MarqueeSimulation(_delta, size, true, _velocity);\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    final child = this.child;\n    if (child == null) return;\n\n    if (_distance > 0) {\n      void paintChild() {\n        if (_direction == Axis.horizontal) {\n          final dx = _delta;\n          context.paintChild(child, Offset(offset.dx - dx, offset.dy));\n          if (dx > _distance) {\n            context.paintChild(\n              child,\n              Offset(offset.dx + _simulation!.size - dx, offset.dy),\n            );\n          }\n        } else {\n          final dy = _delta;\n          context.paintChild(child, Offset(offset.dx, offset.dy - dy));\n          if (dy > _distance) {\n            context.paintChild(\n              child,\n              Offset(offset.dx, offset.dy + _simulation!.size - dy),\n            );\n          }\n        }\n      }\n\n      if (clipBehavior == Clip.none) {\n        paintChild();\n      } else {\n        final rect = Rect.fromLTRB(0, 0, size.width, size.height);\n        context.clipRectAndPaint(rect, clipBehavior, rect, paintChild);\n      }\n    } else {\n      context.paintChild(child, offset);\n    }\n  }\n}\n\nclass _MarqueeSimulation extends Simulation {\n  _MarqueeSimulation(\n    this.initialValue,\n    this.size,\n    this.notBounce,\n    this.velocity,\n  );\n\n  final double initialValue;\n  final double size;\n  final bool notBounce;\n  final double velocity;\n\n  @override\n  double x(double timeInSeconds) {\n    assert(timeInSeconds >= 0.0);\n    final totalX = initialValue + velocity * timeInSeconds;\n    if (notBounce) return totalX % size;\n\n    final doublePeriod = 2.0 * size;\n    final doubleX = totalX % doublePeriod;\n    return doubleX < size ? doubleX : doublePeriod - doubleX;\n  }\n\n  @override\n  double dx(double timeInSeconds) => velocity;\n\n  @override\n  bool isDone(double timeInSeconds) => false;\n\n  _MarqueeSimulation copyWith({\n    final double? initialValue,\n    final double? addSize,\n    final bool? notBounce,\n    final double? velocity,\n  }) => _MarqueeSimulation(\n    initialValue ?? this.initialValue,\n    addSize == null ? size : size + addSize,\n    notBounce ?? this.notBounce,\n    velocity ?? this.velocity,\n  );\n}\n\nclass ContextSingleTicker implements TickerProvider {\n  Ticker? _ticker;\n  BuildContext context;\n  final ValueGetter<bool>? autoStart;\n\n  ContextSingleTicker(this.context, {this.autoStart});\n\n  void initStart() {\n    if (autoStart?.call() ?? true) {\n      _ticker?.start();\n    }\n  }\n\n  void startIfNeeded() {\n    if (_ticker case final ticker?) {\n      if (!ticker.isActive) {\n        ticker.start();\n      }\n    }\n  }\n\n  void initIfNeeded(TickerCallback onTick) {\n    if (_ticker == null) {\n      createTicker(onTick);\n      initStart();\n    }\n  }\n\n  @override\n  Ticker createTicker(TickerCallback onTick) {\n    assert(() {\n      if (_ticker == null) {\n        return true;\n      }\n      throw FlutterError.fromParts(<DiagnosticsNode>[\n        ErrorSummary(\n          '$runtimeType is a SingleTickerProviderStateMixin but multiple tickers were created.',\n        ),\n        ErrorDescription(\n          'A SingleTickerProviderStateMixin can only be used as a TickerProvider once.',\n        ),\n        ErrorHint(\n          'If a State is used for multiple AnimationController objects, or if it is passed to other '\n          'objects and those objects might use it more than one time in total, then instead of '\n          'mixing in a SingleTickerProviderStateMixin, use a regular TickerProviderStateMixin.',\n        ),\n      ]);\n    }());\n    _ticker = Ticker(\n      onTick,\n      debugLabel: kDebugMode ? 'created by ${describeIdentity(this)}' : null,\n    );\n    _tickerModeNotifier = TickerMode.getValuesNotifier(context)\n      ..addListener(updateTicker);\n    updateTicker(); // Sets _ticker.mute correctly.\n    return _ticker!;\n  }\n\n  void reset() {\n    _ticker\n      ?..stop()\n      ..start();\n  }\n\n  void cancel() {\n    _ticker?.dispose();\n    _ticker = null;\n    _tickerModeNotifier?.removeListener(updateTicker);\n    _tickerModeNotifier = null;\n  }\n\n  ValueListenable<TickerModeData>? _tickerModeNotifier;\n\n  void updateTicker() {\n    if (_tickerModeNotifier != null && _ticker != null) {\n      final TickerModeData values = _tickerModeNotifier!.value;\n      _ticker!.muted = !values.enabled;\n      _ticker!.forceFrames = values.forceFrames;\n    }\n  }\n\n  set muted(bool value) => _ticker?.muted = value;\n}\n"
  },
  {
    "path": "lib/common/widgets/only_layout_widget.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart' show RenderProxyBox;\nimport 'package:flutter/scheduler.dart';\n\ntypedef LayoutCallback = void Function(Size size);\n\nclass OnlyLayoutWidget extends SingleChildRenderObjectWidget {\n  const OnlyLayoutWidget({\n    super.key,\n    super.child,\n    required this.onPerformLayout,\n  });\n\n  final LayoutCallback onPerformLayout;\n\n  @override\n  RenderObject createRenderObject(BuildContext context) =>\n      NoRenderLayoutBox(onPerformLayout: onPerformLayout);\n\n  @override\n  void updateRenderObject(\n    BuildContext context,\n    NoRenderLayoutBox renderObject,\n  ) {\n    super.updateRenderObject(context, renderObject);\n    renderObject.onPerformLayout = onPerformLayout;\n  }\n}\n\nclass NoRenderLayoutBox extends RenderProxyBox {\n  NoRenderLayoutBox({required this.onPerformLayout});\n\n  LayoutCallback onPerformLayout;\n\n  @override\n  void performLayout() {\n    super.performLayout();\n    SchedulerBinding.instance.addPostFrameCallback((_) {\n      onPerformLayout(size);\n    });\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {}\n}\n"
  },
  {
    "path": "lib/common/widgets/pair.dart",
    "content": "class Pair<T, R> {\n  Pair({\n    required this.first,\n    required this.second,\n  });\n  T first;\n  R second;\n}\n\nclass Triple<T, R, S> {\n  Triple({\n    required this.first,\n    required this.second,\n    required this.third,\n  });\n  T first;\n  R second;\n  S third;\n}\n"
  },
  {
    "path": "lib/common/widgets/pendant_avatar.dart",
    "content": "import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models/common/avatar_badge_type.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/extension/string_ext.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:flutter/material.dart';\n\nclass PendantAvatar extends StatelessWidget {\n  final BadgeType _badgeType;\n  final String? avatar;\n  final double size;\n  final double badgeSize;\n  final String? garbPendantImage;\n  final int? roomId;\n  final VoidCallback? onTap;\n  final bool isMemberAvatar;\n\n  const PendantAvatar({\n    super.key,\n    required this.avatar,\n    required this.size,\n    this.isMemberAvatar = false,\n    double? badgeSize,\n    bool isVip = false,\n    int? officialType,\n    this.garbPendantImage,\n    this.roomId,\n    this.onTap,\n  }) : _badgeType = officialType == null || officialType < 0\n           ? isVip\n                 ? BadgeType.vip\n                 : BadgeType.none\n           : officialType == 0\n           ? BadgeType.person\n           : officialType == 1\n           ? BadgeType.institution\n           : BadgeType.none,\n       badgeSize = badgeSize ?? size / 3;\n\n  static bool showDynDecorate = Pref.showDynDecorate;\n\n  @override\n  Widget build(BuildContext context) {\n    final colorScheme = Theme.of(context).colorScheme;\n    Widget? pendant;\n    if (showDynDecorate && !garbPendantImage.isNullOrEmpty) {\n      final pendantSize = size * 1.75;\n      pendant = Positioned(\n        // -(size * 1.75 - size) / 2\n        top: -0.375 * size + (isMemberAvatar ? 2 : 0),\n        child: IgnorePointer(\n          child: NetworkImgLayer(\n            type: .emote,\n            width: pendantSize,\n            height: pendantSize,\n            src: garbPendantImage,\n            getPlaceHolder: () => const SizedBox.shrink(),\n          ),\n        ),\n      );\n    }\n    return Stack(\n      alignment: Alignment.bottomCenter,\n      clipBehavior: Clip.none,\n      children: [\n        onTap == null\n            ? _buildAvatar(colorScheme, isMemberAvatar)\n            : GestureDetector(\n                behavior: HitTestBehavior.opaque,\n                onTap: onTap,\n                child: _buildAvatar(colorScheme, isMemberAvatar),\n              ),\n        ?pendant,\n        if (roomId != null)\n          Positioned(\n            bottom: 0,\n            child: InkWell(\n              onTap: () => PageUtils.toLiveRoom(roomId),\n              child: Container(\n                padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 1),\n                decoration: BoxDecoration(\n                  color: colorScheme.secondaryContainer,\n                  borderRadius: const BorderRadius.all(Radius.circular(36)),\n                ),\n                child: Row(\n                  mainAxisSize: MainAxisSize.min,\n                  children: [\n                    Icon(\n                      size: 16,\n                      applyTextScaling: true,\n                      Icons.equalizer_rounded,\n                      color: colorScheme.onSecondaryContainer,\n                    ),\n                    Text(\n                      '直播中',\n                      style: TextStyle(\n                        height: 1,\n                        fontSize: 13,\n                        color: colorScheme.onSecondaryContainer,\n                      ),\n                    ),\n                  ],\n                ),\n              ),\n            ),\n          )\n        else if (_badgeType != BadgeType.none)\n          _buildBadge(context, colorScheme, isMemberAvatar),\n      ],\n    );\n  }\n\n  Widget _buildAvatar(ColorScheme colorScheme, bool isMemberAvatar) =>\n      isMemberAvatar\n      ? DecoratedBox(\n          decoration: BoxDecoration(\n            border: Border.all(\n              width: 2,\n              color: colorScheme.surface,\n            ),\n            shape: BoxShape.circle,\n          ),\n          child: Padding(\n            padding: const EdgeInsets.all(2),\n            child: NetworkImgLayer(\n              src: avatar,\n              width: size,\n              height: size,\n              type: ImageType.avatar,\n            ),\n          ),\n        )\n      : NetworkImgLayer(\n          src: avatar,\n          width: size,\n          height: size,\n          type: ImageType.avatar,\n        );\n\n  Widget _buildBadge(\n    BuildContext context,\n    ColorScheme colorScheme,\n    bool isMemberAvatar,\n  ) {\n    final child = switch (_badgeType) {\n      BadgeType.vip => Image.asset(\n        'assets/images/big-vip.png',\n        width: badgeSize,\n        height: badgeSize,\n        cacheWidth: badgeSize.cacheSize(context),\n        semanticLabel: _badgeType.desc,\n      ),\n      _ => Icon(\n        Icons.offline_bolt,\n        color: _badgeType.color,\n        size: badgeSize,\n        semanticLabel: _badgeType.desc,\n      ),\n    };\n    final offset = isMemberAvatar ? 2.0 : 0.0;\n    return Positioned(\n      right: offset,\n      bottom: offset,\n      child: IgnorePointer(\n        child: DecoratedBox(\n          decoration: BoxDecoration(\n            shape: BoxShape.circle,\n            color: colorScheme.surface,\n          ),\n          child: child,\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/player_bar.dart",
    "content": "/*\n * This file is part of PiliPlus\n *\n * PiliPlus 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 * PiliPlus 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 PiliPlus.  If not, see <https://www.gnu.org/licenses/>.\n */\n\nimport 'dart:math' as math;\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart'\n    show\n        ContainerRenderObjectMixin,\n        MultiChildLayoutParentData,\n        RenderBoxContainerDefaultsMixin,\n        BoxHitTestResult;\n\nclass PlayerBar extends MultiChildRenderObjectWidget {\n  const PlayerBar({\n    super.key,\n    super.children,\n  });\n\n  @override\n  RenderObject createRenderObject(BuildContext context) {\n    return RenderBottomBar();\n  }\n}\n\nclass RenderBottomBar extends RenderBox\n    with\n        ContainerRenderObjectMixin<RenderBox, MultiChildLayoutParentData>,\n        RenderBoxContainerDefaultsMixin<RenderBox, MultiChildLayoutParentData> {\n  @override\n  void setupParentData(RenderBox child) {\n    if (child.parentData is! MultiChildLayoutParentData) {\n      child.parentData = MultiChildLayoutParentData();\n    }\n  }\n\n  Matrix4? _transform;\n\n  @override\n  void performLayout() {\n    _transform = null;\n\n    final c = constraints.copyWith(maxWidth: .infinity);\n    final RenderBox first = firstChild!..layout(c, parentUsesSize: true);\n    final RenderBox last = lastChild!..layout(c, parentUsesSize: true);\n\n    final firstSize = first.size;\n    final lastSize = last.size;\n\n    final firstParentData = first.parentData as MultiChildLayoutParentData;\n    final lastParentData = last.parentData as MultiChildLayoutParentData;\n\n    final firstWidth = firstSize.width;\n    final lastWidth = lastSize.width;\n    final totalWidth = firstWidth + lastWidth;\n    final maxWidth = constraints.maxWidth;\n    final height = math.max(firstSize.height, lastSize.height);\n    size = constraints.constrainDimensions(maxWidth, height);\n\n    firstParentData.offset = Offset(0.0, (height - firstSize.height) / 2);\n    if (totalWidth <= maxWidth) {\n      lastParentData.offset = Offset(\n        maxWidth - lastWidth,\n        (height - lastSize.height) / 2,\n      );\n    } else {\n      final scale = maxWidth / totalWidth;\n      _transform = Matrix4.identity()\n        ..translateByDouble(0.0, height * (1 - scale) / 2, 0.0, 1.0)\n        ..scaleByDouble(scale, scale, scale, 1.0);\n      lastParentData.offset = Offset(\n        (maxWidth - lastWidth * scale) / scale,\n        (height - lastSize.height) / 2,\n      );\n    }\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    if (_transform != null) {\n      context.pushTransform(\n        needsCompositing,\n        offset,\n        _transform!,\n        defaultPaint,\n      );\n    } else {\n      defaultPaint(context, offset);\n    }\n  }\n\n  @override\n  bool hitTestChildren(BoxHitTestResult result, {required Offset position}) {\n    return result.addWithPaintTransform(\n      transform: _transform,\n      position: position,\n      hitTest: (BoxHitTestResult result, Offset position) {\n        return defaultHitTestChildren(result, position: position);\n      },\n    );\n  }\n\n  @override\n  void applyPaintTransform(RenderBox child, Matrix4 transform) {\n    final childParentData = child.parentData! as MultiChildLayoutParentData;\n    final Offset offset = childParentData.offset;\n    if (_transform != null) {\n      transform\n        ..translateByDouble(offset.dx * _transform!.storage[0], offset.dy, 0, 1)\n        ..multiply(_transform!);\n    } else {\n      transform.translateByDouble(offset.dx, offset.dy, 0, 1);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/progress_bar/audio_video_progress_bar.dart",
    "content": "import 'dart: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/services.dart'\n    show\n        MouseTrackerAnnotation,\n        PointerEnterEventListener,\n        PointerExitEventListener;\n\n/// https://github.com/suragch/audio_video_progress_bar\n\n/// A progress bar widget to show or set the location of the currently\n/// playing audio or video content.\n///\n/// This widget does not itself play audio or video content, but you can\n/// use it in conjunction with an audio plugin. It is a more convenient\n/// replacement for the Flutter Slider widget.\nclass ProgressBar extends LeafRenderObjectWidget {\n  /// You must set the current audio or video duration [progress] and also\n  /// the [total] duration. Optionally set the [buffered] content progress\n  /// as well.\n  ///\n  /// When a user drags the thumb to a new location you can be notified\n  /// by the [onSeek] callback so that you can update your audio/video player.\n  const ProgressBar({\n    super.key,\n    required this.progress,\n    required this.total,\n    this.buffered = .zero,\n    this.onSeek,\n    this.onDragStart,\n    this.onDragUpdate,\n    this.onDragEnd,\n    this.barHeight = 5.0,\n    required this.baseBarColor,\n    required this.progressBarColor,\n    required this.bufferedBarColor,\n    this.thumbRadius = 10.0,\n    required this.thumbColor,\n    required this.thumbGlowColor,\n    this.thumbGlowRadius = 30.0,\n    this.thumbCanPaintOutsideBar = true,\n  });\n\n  /// The elapsed playing time of the media.\n  ///\n  /// This should not be greater than the [total] time.\n  final Duration progress;\n\n  /// The total duration of the media.\n  final Duration total;\n\n  /// The currently buffered content of the media.\n  ///\n  /// This is useful for streamed content. If you are playing a local file\n  /// then you can leave this out.\n  final Duration buffered;\n\n  /// A callback when user moves the thumb.\n  ///\n  /// When the user moved the thumb on the progress bar this callback will\n  /// run. It will not run until after the user has finished the touch event.\n  ///\n  /// You will get the chosen duration to start playing at which you can pass\n  /// on to your media player.\n  ///\n  /// If you want continuous duration updates as the user moves the thumb,\n  /// see [onDragUpdate], where the provided [ThumbDragDetails] has a\n  /// `timeStamp` with the seek duration on it.\n  final ValueChanged<Duration>? onSeek;\n\n  /// A callback when the user starts to move the thumb.\n  ///\n  /// This will be called only once when the drag begins. This provides you\n  /// with the [ThumbDragDetails].\n  ///\n  /// This method is useful if you are planning to do something like add a time\n  /// label and/or video preview over the thumb and you need to do some\n  /// initialization.\n  ///\n  /// Use [onSeek] if you only want to seek to a new audio position when the\n  /// drag event has finished.\n  final ThumbDragStartCallback? onDragStart;\n\n  /// A callback when the user is moving the thumb.\n  ///\n  /// This will be called repeatedly as the thumb position changes. This\n  /// provides you with the [ThumbDragDetails], which notify you of the global\n  /// and local positions of the drag event as well as the current thumb\n  /// duration. The current thumb duration will not go beyond [total] or less\n  /// that `Duration.zero` so you can use this information to clamp the drag\n  /// position values.\n  ///\n  /// This method is useful if you are planning to do something like add a time\n  /// label and/or video preview over the thumb and need to update the position\n  /// to stay in sync with the thumb position.\n  ///\n  /// Use [onSeek] if you only want to seek to a new audio position when the\n  /// drag event has finished.\n  final ThumbDragUpdateCallback? onDragUpdate;\n\n  /// A callback when the user is finished moving the thumb.\n  ///\n  /// This will be called only once when the drag ends.\n  ///\n  /// This method is useful if you are planning to do something like add a time\n  /// label and/or video preview over the thumb and you need to dispose of\n  /// something when the drag is finished.\n  ///\n  /// This method is called directly before [onSeek].\n  final VoidCallback? onDragEnd;\n\n  /// The vertical thickness of the progress bar.\n  final double barHeight;\n\n  /// The color of the progress bar before playback has started.\n  ///\n  /// By default it is a transparent version of your theme's primary color.\n  final Color baseBarColor;\n\n  /// The color of the progress bar to the left of the current playing\n  /// [progress].\n  ///\n  /// By default it is your theme's primary color.\n  final Color progressBarColor;\n\n  /// The color of the progress bar between the [progress] location and the\n  /// [buffered] location.\n  ///\n  /// By default it is a transparent version of your theme's primary color,\n  /// a shade darker than [baseBarColor].\n  final Color bufferedBarColor;\n\n  /// The radius of the circle for the moveable progress bar thumb.\n  final double thumbRadius;\n\n  /// The color of the circle for the moveable progress bar thumb.\n  ///\n  /// By default it is your theme's primary color.\n  final Color thumbColor;\n\n  /// The color of the pressed-down effect of the moveable progress bar thumb.\n  ///\n  /// By default it is [thumbColor] with an alpha value of 80.\n  final Color thumbGlowColor;\n\n  /// The radius of the circle for the pressed-down effect of the moveable\n  /// progress bar thumb.\n  ///\n  /// By default it is 30.\n  final double thumbGlowRadius;\n\n  /// Whether the thumb radius will before the start of the bar when at the\n  /// beginning or after the end of the bar when at the end.\n  ///\n  /// The default is `true` and this means that the thumb will be painted\n  /// outside of the bounds of the widget if there are no side labels. You can\n  /// wrap [ProgressBar] with a `Padding` widget if your layout needs to leave\n  /// some extra room for the thumb.\n  ///\n  /// When set to `false` the thumb will be clamped within the width of the\n  /// bar. This is nice for aligning the thumb with vertical labels at the start\n  /// and end of playback. However, because of the clamping, the thumb won't\n  /// move during audio/video playback when near the ends. Depending on the\n  /// size of the thumb and the length of the song, this usually only lasts\n  /// a few seconds. The progress label still indicates that playback\n  /// is happening during this time, though.\n  final bool thumbCanPaintOutsideBar;\n\n  @override\n  RenderObject createRenderObject(BuildContext context) {\n    return RenderProgressBar(\n      progress: progress,\n      total: total,\n      buffered: buffered,\n      onSeek: onSeek,\n      onDragStart: onDragStart,\n      onDragUpdate: onDragUpdate,\n      onDragEnd: onDragEnd,\n      barHeight: barHeight,\n      baseBarColor: baseBarColor,\n      progressBarColor: progressBarColor,\n      bufferedBarColor: bufferedBarColor,\n      thumbRadius: thumbRadius,\n      thumbColor: thumbColor,\n      thumbGlowColor: thumbGlowColor,\n      thumbGlowRadius: thumbGlowRadius,\n      thumbCanPaintOutsideBar: thumbCanPaintOutsideBar,\n    );\n  }\n\n  @override\n  void updateRenderObject(\n    BuildContext context,\n    RenderProgressBar renderObject,\n  ) {\n    renderObject\n      ..total = total\n      ..progress = progress\n      ..buffered = buffered\n      ..onSeek = onSeek\n      ..onDragStart = onDragStart\n      ..onDragUpdate = onDragUpdate\n      ..onDragEnd = onDragEnd\n      ..barHeight = barHeight\n      ..baseBarColor = baseBarColor\n      ..progressBarColor = progressBarColor\n      ..bufferedBarColor = bufferedBarColor\n      ..thumbRadius = thumbRadius\n      ..thumbColor = thumbColor\n      ..thumbGlowColor = thumbGlowColor\n      ..thumbGlowRadius = thumbGlowRadius\n      ..thumbCanPaintOutsideBar = thumbCanPaintOutsideBar;\n  }\n\n  @override\n  void debugFillProperties(DiagnosticPropertiesBuilder properties) {\n    super.debugFillProperties(properties);\n    properties\n      ..add(StringProperty('progress', progress.toString()))\n      ..add(StringProperty('total', total.toString()))\n      ..add(StringProperty('buffered', buffered.toString()))\n      ..add(\n        ObjectFlagProperty<ValueChanged<Duration>>(\n          'onSeek',\n          onSeek,\n          ifNull: 'unimplemented',\n        ),\n      )\n      ..add(\n        ObjectFlagProperty<ThumbDragStartCallback>(\n          'onDragStart',\n          onDragStart,\n          ifNull: 'unimplemented',\n        ),\n      )\n      ..add(\n        ObjectFlagProperty<ThumbDragUpdateCallback>(\n          'onDragUpdate',\n          onDragUpdate,\n          ifNull: 'unimplemented',\n        ),\n      )\n      ..add(\n        ObjectFlagProperty<VoidCallback>(\n          'onDragEnd',\n          onDragEnd,\n          ifNull: 'unimplemented',\n        ),\n      )\n      ..add(DoubleProperty('barHeight', barHeight))\n      ..add(ColorProperty('baseBarColor', baseBarColor))\n      ..add(ColorProperty('progressBarColor', progressBarColor))\n      ..add(ColorProperty('bufferedBarColor', bufferedBarColor))\n      ..add(DoubleProperty('thumbRadius', thumbRadius))\n      ..add(ColorProperty('thumbColor', thumbColor))\n      ..add(ColorProperty('thumbGlowColor', thumbGlowColor))\n      ..add(DoubleProperty('thumbGlowRadius', thumbGlowRadius))\n      ..add(\n        FlagProperty(\n          'thumbCanPaintOutsideBar',\n          value: thumbCanPaintOutsideBar,\n          ifTrue: 'true',\n          ifFalse: 'false',\n          showName: true,\n        ),\n      );\n  }\n}\n\n/// The callback signature for when the thumb begins a horizontal drag.\ntypedef ThumbDragStartCallback = void Function(ThumbDragDetails details);\n\n/// The callback signature for when the thumb is moving on horizontally and has\n/// new data.\ntypedef ThumbDragUpdateCallback = void Function(ThumbDragDetails details);\n\n/// Data to pass back on drag callback events\nclass ThumbDragDetails {\n  const ThumbDragDetails({\n    this.timeStamp = Duration.zero,\n    this.globalPosition = Offset.zero,\n    this.localPosition = Offset.zero,\n  });\n\n  /// The duration position of the thumb on the progress bar\n  final Duration timeStamp;\n\n  /// The global position of the drag event moving the thumb on the progress bar.\n  final Offset globalPosition;\n\n  /// The local position of the drag event moving the thumb on the progress bar.\n  final Offset localPosition;\n\n  @override\n  String toString() =>\n      '${objectRuntimeType(this, 'ThumbDragDetails')}('\n      'time: $timeStamp, '\n      'global: $globalPosition, '\n      'local: $localPosition)';\n}\n\n// Handles all gestures so that it will always win a the gesture arena.\n// Without doing this, if you used this widget in a swipable tab layout,\n// you would cause a swipe rather than a drag when trying to move the thumb.\nclass _EagerHorizontalDragGestureRecognizer\n    extends HorizontalDragGestureRecognizer {\n  @override\n  void addAllowedPointer(PointerDownEvent event) {\n    super.addAllowedPointer(event);\n    resolve(GestureDisposition.accepted);\n  }\n\n  @override\n  String get debugDescription => '_EagerHorizontalDragGestureRecognizer';\n}\n\nclass RenderProgressBar extends RenderBox implements MouseTrackerAnnotation {\n  RenderProgressBar({\n    required Duration progress,\n    required Duration total,\n    required Duration buffered,\n    ValueChanged<Duration>? onSeek,\n    ThumbDragStartCallback? onDragStart,\n    ThumbDragUpdateCallback? onDragUpdate,\n    VoidCallback? onDragEnd,\n    required double barHeight,\n    required Color baseBarColor,\n    required Color progressBarColor,\n    required Color bufferedBarColor,\n    double thumbRadius = 20.0,\n    required Color thumbColor,\n    required Color thumbGlowColor,\n    double thumbGlowRadius = 30.0,\n    bool thumbCanPaintOutsideBar = true,\n  }) : _total = total,\n       _buffered = buffered,\n       _onSeek = onSeek,\n       _onDragStartUserCallback = onDragStart,\n       _onDragUpdateUserCallback = onDragUpdate,\n       _onDragEndUserCallback = onDragEnd,\n       _barHeight = barHeight,\n       _baseBarColor = baseBarColor,\n       _progressBarColor = progressBarColor,\n       _bufferedBarColor = bufferedBarColor,\n       _thumbRadius = thumbRadius,\n       _thumbColor = thumbColor,\n       _thumbGlowColor = thumbGlowColor,\n       _thumbGlowRadius = thumbGlowRadius,\n       _paintThumbGlow = thumbGlowRadius > thumbRadius,\n       _thumbCanPaintOutsideBar = thumbCanPaintOutsideBar,\n       _hitTestSelf = onDragStart != null {\n    if (onDragStart != null) {\n      _drag = _EagerHorizontalDragGestureRecognizer()\n        ..onStart = _onDragStart\n        ..onUpdate = _onDragUpdate\n        ..onEnd = _onDragEnd\n        ..onCancel = _finishDrag;\n    }\n    if (!_userIsDraggingThumb) {\n      _progress = progress;\n      _thumbValue = _proportionOfTotal(_progress);\n    }\n  }\n\n  @override\n  void dispose() {\n    _drag?.dispose();\n    _drag = null;\n    super.dispose();\n  }\n\n  // This is the gesture recognizer used to move the thumb.\n  _EagerHorizontalDragGestureRecognizer? _drag;\n\n  // This is a value between 0.0 and 1.0 used to indicate the position on\n  // the bar.\n  late double _thumbValue;\n\n  // The thumb can move for two reasons. One is that the [progress] changed.\n  // The other is that the user is dragging the thumb. This variable keeps\n  // track of that so that while the user is dragging the thumb at the same\n  // time as a [progress] update there won't be a conflict.\n  bool _userIsDraggingThumb = false;\n\n  void _onDragStart(DragStartDetails details) {\n    if (onDragStart == null) {\n      return;\n    }\n    _userIsDraggingThumb = true;\n    _updateThumbPosition(details.localPosition);\n    onDragStart?.call(\n      ThumbDragDetails(\n        timeStamp: _currentThumbDuration(),\n        globalPosition: details.globalPosition,\n        localPosition: details.localPosition,\n      ),\n    );\n  }\n\n  void _onDragUpdate(DragUpdateDetails details) {\n    if (onDragUpdate == null) {\n      return;\n    }\n    _updateThumbPosition(details.localPosition);\n    onDragUpdate?.call(\n      ThumbDragDetails(\n        timeStamp: _currentThumbDuration(),\n        globalPosition: details.globalPosition,\n        localPosition: details.localPosition,\n      ),\n    );\n  }\n\n  void _onDragEnd(DragEndDetails details) {\n    if (onSeek == null) {\n      return;\n    }\n    onDragEnd?.call();\n    onSeek?.call(_currentThumbDuration());\n    _finishDrag();\n  }\n\n  void _finishDrag() {\n    _userIsDraggingThumb = false;\n    markNeedsPaint();\n  }\n\n  Duration _currentThumbDuration() {\n    final thumbMilliseconds = _thumbValue * total.inMilliseconds;\n    return Duration(milliseconds: thumbMilliseconds.round());\n  }\n\n  // This needs to stay in sync with the layout. This could be a potential\n  // source of bugs if there is a layout change but we forget to update this.\n  // It might be a good idea to redesign the architecture so that there is\n  // only one place to make changes.\n  void _updateThumbPosition(Offset localPosition) {\n    final dx = localPosition.dx;\n    // The paint used to draw the bar line draws half of the cap before the\n    // start of the line (and after the end of the line). The cap radius is\n    // equal to half of the line width, which in this case is the bar height.\n    final barCapRadius = _barHeight / 2;\n    double barStart = barCapRadius;\n    double barEnd = size.width - barCapRadius;\n    final barWidth = barEnd - barStart;\n    final position = (dx - barStart).clamp(0.0, barWidth);\n    _thumbValue = (position / barWidth);\n    _progress = _currentThumbDuration();\n    markNeedsPaint();\n  }\n\n  /// The play location of the media.\n  ///\n  /// This is used to update the thumb value and the left time label.\n  Duration get progress => _progress;\n  Duration _progress = Duration.zero;\n  set progress(Duration value) {\n    final clamp = _clampDuration(value);\n    if (_progress == clamp) {\n      return;\n    }\n    if (!_userIsDraggingThumb) {\n      _progress = clamp;\n      _thumbValue = _proportionOfTotal(clamp);\n    }\n    markNeedsPaint();\n  }\n\n  /// The total time length of the media.\n  Duration get total => _total;\n  Duration _total;\n  set total(Duration value) {\n    final clamp = (value.isNegative) ? Duration.zero : value;\n    if (_total == clamp) {\n      return;\n    }\n    _total = clamp;\n    if (!_userIsDraggingThumb) {\n      _thumbValue = _proportionOfTotal(progress);\n    }\n    markNeedsPaint();\n  }\n\n  /// The buffered length of the media when streaming.\n  Duration get buffered => _buffered;\n  Duration _buffered;\n  set buffered(Duration value) {\n    final clamp = _clampDuration(value);\n    if (_buffered == clamp) {\n      return;\n    }\n    _buffered = clamp;\n    markNeedsPaint();\n  }\n\n  Duration _clampDuration(Duration value) {\n    if (value.isNegative) return Duration.zero;\n    if (value.compareTo(_total) > 0) return _total;\n    return value;\n  }\n\n  /// A callback for the audio duration position to where the thumb was moved.\n  ValueChanged<Duration>? get onSeek => _onSeek;\n  ValueChanged<Duration>? _onSeek;\n  set onSeek(ValueChanged<Duration>? value) {\n    if (value == _onSeek) {\n      return;\n    }\n    _onSeek = value;\n  }\n\n  /// A callback when the thumb starts being dragged.\n  ThumbDragStartCallback? get onDragStart => _onDragStartUserCallback;\n  ThumbDragStartCallback? _onDragStartUserCallback;\n  set onDragStart(ThumbDragStartCallback? value) {\n    if (value == _onDragStartUserCallback) {\n      return;\n    }\n    _onDragStartUserCallback = value;\n  }\n\n  /// A callback when the thumb is being dragged.\n  ThumbDragUpdateCallback? get onDragUpdate => _onDragUpdateUserCallback;\n  ThumbDragUpdateCallback? _onDragUpdateUserCallback;\n  set onDragUpdate(ThumbDragUpdateCallback? value) {\n    if (value == _onDragUpdateUserCallback) {\n      return;\n    }\n    _onDragUpdateUserCallback = value;\n  }\n\n  /// A callback when the thumb drag is finished.\n  VoidCallback? get onDragEnd => _onDragEndUserCallback;\n  VoidCallback? _onDragEndUserCallback;\n  set onDragEnd(VoidCallback? value) {\n    if (value == _onDragEndUserCallback) {\n      return;\n    }\n    _onDragEndUserCallback = value;\n  }\n\n  /// The vertical thickness of the bar that the thumb moves along.\n  double get barHeight => _barHeight;\n  double _barHeight;\n  set barHeight(double value) {\n    if (_barHeight == value) return;\n    _barHeight = value;\n    markNeedsPaint();\n  }\n\n  /// The color of the progress bar before any playing or buffering.\n  Color get baseBarColor => _baseBarColor;\n  Color _baseBarColor;\n  set baseBarColor(Color value) {\n    if (_baseBarColor == value) return;\n    _baseBarColor = value;\n    markNeedsPaint();\n  }\n\n  /// The color of the played portion of the progress bar.\n  Color get progressBarColor => _progressBarColor;\n  Color _progressBarColor;\n  set progressBarColor(Color value) {\n    if (_progressBarColor == value) return;\n    _progressBarColor = value;\n    markNeedsPaint();\n  }\n\n  /// The color of the visible buffered portion of the progress bar.\n  Color get bufferedBarColor => _bufferedBarColor;\n  Color _bufferedBarColor;\n  set bufferedBarColor(Color value) {\n    if (_bufferedBarColor == value) return;\n    _bufferedBarColor = value;\n    markNeedsPaint();\n  }\n\n  /// The color of the moveable thumb.\n  Color get thumbColor => _thumbColor;\n  Color _thumbColor;\n  set thumbColor(Color value) {\n    if (_thumbColor == value) return;\n    _thumbColor = value;\n    markNeedsPaint();\n  }\n\n  /// The length of the radius for the circular thumb.\n  double get thumbRadius => _thumbRadius;\n  double _thumbRadius;\n  set thumbRadius(double value) {\n    if (_thumbRadius == value) return;\n    _thumbRadius = value;\n    markNeedsLayout();\n  }\n\n  /// The color of the pressed-down effect of the moveable thumb.\n  Color get thumbGlowColor => _thumbGlowColor;\n  Color _thumbGlowColor;\n  set thumbGlowColor(Color value) {\n    if (_thumbGlowColor == value) return;\n    _thumbGlowColor = value;\n    if (_userIsDraggingThumb) markNeedsPaint();\n  }\n\n  /// The length of the radius of the pressed-down effect of the moveable thumb.\n  bool _paintThumbGlow;\n  double get thumbGlowRadius => _thumbGlowRadius;\n  double _thumbGlowRadius;\n  set thumbGlowRadius(double value) {\n    if (_thumbGlowRadius == value) return;\n    _thumbGlowRadius = value;\n    _paintThumbGlow = value > _thumbRadius;\n    markNeedsLayout();\n  }\n\n  /// Whether the thumb will paint before the start or after the end of the bar.\n  bool get thumbCanPaintOutsideBar => _thumbCanPaintOutsideBar;\n  bool _thumbCanPaintOutsideBar;\n  set thumbCanPaintOutsideBar(bool value) {\n    if (_thumbCanPaintOutsideBar == value) return;\n    _thumbCanPaintOutsideBar = value;\n    markNeedsPaint();\n  }\n\n  // The smallest that this widget would ever want to be.\n  static const _minDesiredWidth = 100.0;\n\n  @override\n  double computeMinIntrinsicWidth(double height) => _minDesiredWidth;\n\n  @override\n  double computeMaxIntrinsicWidth(double height) => _minDesiredWidth;\n\n  @override\n  double computeMinIntrinsicHeight(double width) => _heightWhenNoLabels();\n\n  @override\n  double computeMaxIntrinsicHeight(double width) => _heightWhenNoLabels();\n\n  final bool _hitTestSelf;\n  @override\n  bool hitTestSelf(Offset position) => _hitTestSelf;\n\n  @override\n  void handleEvent(PointerEvent event, BoxHitTestEntry entry) {\n    assert(debugHandleEvent(event, entry));\n    if (event is PointerDownEvent) {\n      _drag?.addPointer(event);\n    }\n  }\n\n  @override\n  void performLayout() {\n    size = computeDryLayout(constraints);\n  }\n\n  @override\n  Size computeDryLayout(BoxConstraints constraints) {\n    final desiredWidth = constraints.maxWidth;\n    final desiredHeight = _heightWhenNoLabels();\n    return constraints.constrainDimensions(desiredWidth, desiredHeight);\n  }\n\n  double _heightWhenNoLabels() {\n    return max(2 * _thumbRadius, _barHeight);\n  }\n\n  @override\n  bool get isRepaintBoundary => true;\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    final canvas = context.canvas\n      ..save()\n      ..translate(offset.dx, offset.dy);\n\n    _drawProgressBarWithoutLabels(canvas);\n\n    canvas.restore();\n  }\n\n  /// Draw the progress bar without labels like this:\n  ///\n  /// | -------O---------------- |\n  ///\n  void _drawProgressBarWithoutLabels(Canvas canvas) {\n    final barWidth = size.width;\n    final barHeight = _heightWhenNoLabels();\n    _drawProgressBar(canvas, Offset.zero, Size(barWidth, barHeight));\n  }\n\n  void _drawProgressBar(Canvas canvas, Offset offset, Size localSize) {\n    canvas\n      ..save()\n      ..translate(offset.dx, offset.dy);\n    _drawBaseBar(canvas, localSize);\n    _drawBufferedBar(canvas, localSize);\n    _drawCurrentProgressBar(canvas, localSize);\n    _drawThumb(canvas, localSize);\n    canvas.restore();\n  }\n\n  void _drawBaseBar(Canvas canvas, Size localSize) {\n    _drawBar(\n      canvas: canvas,\n      availableSize: localSize,\n      widthProportion: 1.0,\n      color: baseBarColor,\n    );\n  }\n\n  void _drawBufferedBar(Canvas canvas, Size localSize) {\n    _drawBar(\n      canvas: canvas,\n      availableSize: localSize,\n      widthProportion: _proportionOfTotal(_buffered),\n      color: bufferedBarColor,\n    );\n  }\n\n  void _drawCurrentProgressBar(Canvas canvas, Size localSize) {\n    _drawBar(\n      canvas: canvas,\n      availableSize: localSize,\n      widthProportion: _proportionOfTotal(_progress),\n      color: progressBarColor,\n    );\n  }\n\n  void _drawBar({\n    required Canvas canvas,\n    required Size availableSize,\n    required double widthProportion,\n    required Color color,\n  }) {\n    final baseBarPaint = Paint()\n      ..color = color\n      ..strokeCap = StrokeCap.round\n      ..strokeWidth = _barHeight;\n    final capRadius = _barHeight / 2;\n    final adjustedWidth = availableSize.width - barHeight;\n    final dx = widthProportion * adjustedWidth + capRadius;\n    final startPoint = Offset(capRadius, availableSize.height / 2);\n    final endPoint = Offset(dx, availableSize.height / 2);\n    canvas.drawLine(startPoint, endPoint, baseBarPaint);\n  }\n\n  void _drawThumb(Canvas canvas, Size localSize) {\n    final thumbPaint = Paint()..color = thumbColor;\n    final barCapRadius = _barHeight / 2;\n    final availableWidth = localSize.width - _barHeight;\n    var thumbDx = _thumbValue * availableWidth + barCapRadius;\n    if (!_thumbCanPaintOutsideBar) {\n      thumbDx = thumbDx.clamp(_thumbRadius, localSize.width - _thumbRadius);\n    }\n    final center = Offset(thumbDx, localSize.height / 2);\n    if (_userIsDraggingThumb && _paintThumbGlow) {\n      final thumbGlowPaint = Paint()..color = thumbGlowColor;\n      canvas.drawCircle(center, thumbGlowRadius, thumbGlowPaint);\n    }\n    canvas.drawCircle(center, thumbRadius, thumbPaint);\n  }\n\n  double _proportionOfTotal(Duration duration) {\n    if (total.inMilliseconds == 0) {\n      return 0.0;\n    }\n    return (duration.inMilliseconds / total.inMilliseconds).clamp(0.0, 1.0);\n  }\n\n  @override\n  void describeSemanticsConfiguration(SemanticsConfiguration config) {\n    super.describeSemanticsConfiguration(config);\n\n    // description\n    config\n      ..textDirection = TextDirection.ltr\n      ..label =\n          '进度条' //'Progress bar';\n      ..value = '${(_thumbValue * 100).round()}%'\n      // increase action\n      ..onIncrease = increaseAction;\n    final increased = _thumbValue + _semanticActionUnit;\n    config\n      ..increasedValue = '${((increased).clamp(0.0, 1.0) * 100).round()}%'\n      // decrease action\n      ..onDecrease = decreaseAction;\n    final decreased = _thumbValue - _semanticActionUnit;\n    config.decreasedValue = '${((decreased).clamp(0.0, 1.0) * 100).round()}%';\n  }\n\n  // This is how much to move the thumb if the move is triggered by a\n  // semantic action rather than a touch event.\n  static const double _semanticActionUnit = 0.05;\n\n  void increaseAction() {\n    final newValue = _thumbValue + _semanticActionUnit;\n    _thumbValue = (newValue).clamp(0.0, 1.0);\n    onSeek?.call(_currentThumbDuration());\n    markNeedsPaint();\n    markNeedsSemanticsUpdate();\n  }\n\n  void decreaseAction() {\n    final newValue = _thumbValue - _semanticActionUnit;\n    _thumbValue = (newValue).clamp(0.0, 1.0);\n    onSeek?.call(_currentThumbDuration());\n    markNeedsPaint();\n    markNeedsSemanticsUpdate();\n  }\n\n  @override\n  MouseCursor get cursor => SystemMouseCursors.click;\n\n  @override\n  PointerEnterEventListener? onEnter;\n\n  @override\n  PointerExitEventListener? onExit;\n\n  @override\n  bool get validForMouseTracker => false;\n}\n"
  },
  {
    "path": "lib/common/widgets/progress_bar/segment_progress_bar.dart",
    "content": "/*\n * This file is part of PiliPlus\n *\n * PiliPlus 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 * PiliPlus 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 PiliPlus.  If not, see <https://www.gnu.org/licenses/>.\n */\n\nimport 'dart:ui' as ui;\n\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:collection/collection.dart';\nimport 'package:flutter/foundation.dart' show listEquals;\nimport 'package:flutter/gestures.dart' show TapGestureRecognizer;\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart' show BoxHitTestEntry;\n\n@immutable\nsealed class BaseSegment {\n  final double end;\n\n  const BaseSegment({\n    required this.end,\n  });\n}\n\n@immutable\nclass Segment extends BaseSegment {\n  final double start;\n  final Color color;\n\n  const Segment({\n    required this.start,\n    required super.end,\n    required this.color,\n  });\n\n  @override\n  bool operator ==(Object other) {\n    if (identical(this, other)) {\n      return true;\n    }\n    if (other is Segment) {\n      return start == other.start && end == other.end && color == other.color;\n    }\n    return false;\n  }\n\n  @override\n  int get hashCode => Object.hash(start, end, color);\n}\n\n@immutable\nclass ViewPointSegment extends BaseSegment {\n  final String? title;\n  final String? url;\n  final int? from;\n  final int? to;\n\n  const ViewPointSegment({\n    required super.end,\n    this.title,\n    this.url,\n    this.from,\n    this.to,\n  });\n\n  @override\n  bool operator ==(Object other) {\n    if (identical(this, other)) {\n      return true;\n    }\n    if (other is ViewPointSegment) {\n      return end == other.end &&\n          title == other.title &&\n          url == other.url &&\n          from == other.from &&\n          to == other.to;\n    }\n    return false;\n  }\n\n  @override\n  int get hashCode => Object.hash(end, title, url, from, to);\n}\n\nclass SegmentProgressBar extends BaseSegmentProgressBar<Segment> {\n  const SegmentProgressBar({\n    super.key,\n    super.height,\n    required super.segments,\n  });\n\n  @override\n  RenderObject createRenderObject(BuildContext context) {\n    return RenderProgressBar(\n      height: height,\n      segments: segments,\n    );\n  }\n}\n\nclass RenderProgressBar extends BaseRenderProgressBar<Segment> {\n  RenderProgressBar({\n    required super.height,\n    required super.segments,\n  });\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    final size = this.size;\n    final canvas = context.canvas;\n    final paint = Paint()..style = PaintingStyle.fill;\n\n    for (final segment in segments) {\n      paint.color = segment.color;\n      final segmentStart = offset.dx + segment.start * size.width;\n      final segmentEnd = offset.dx + segment.end * size.width;\n\n      if (segmentEnd > segmentStart ||\n          (segmentEnd == segmentStart && segmentStart > 0)) {\n        canvas.drawRect(\n          Rect.fromLTRB(\n            segmentStart,\n            offset.dy,\n            segmentEnd == segmentStart ? segmentStart + 2 : segmentEnd,\n            size.height + offset.dy,\n          ),\n          paint,\n        );\n      }\n    }\n  }\n}\n\nclass ViewPointSegmentProgressBar\n    extends BaseSegmentProgressBar<ViewPointSegment> {\n  const ViewPointSegmentProgressBar({\n    super.key,\n    super.height,\n    required super.segments,\n    this.onSeek,\n  });\n\n  final ValueSetter<Duration>? onSeek;\n\n  @override\n  RenderObject createRenderObject(BuildContext context) {\n    return RenderViewPointProgressBar(\n      height: height,\n      segments: segments,\n      onSeek: onSeek,\n    );\n  }\n\n  @override\n  void updateRenderObject(\n    BuildContext context,\n    RenderViewPointProgressBar renderObject,\n  ) {\n    renderObject\n      ..height = height\n      ..segments = segments\n      ..onSeek = onSeek;\n  }\n}\n\nclass RenderViewPointProgressBar\n    extends BaseRenderProgressBar<ViewPointSegment> {\n  RenderViewPointProgressBar({\n    required super.height,\n    required super.segments,\n    ValueSetter<Duration>? onSeek,\n  }) : _onSeek = onSeek,\n       _hitTestSelf = onSeek != null {\n    if (onSeek != null) {\n      _tapGestureRecognizer = TapGestureRecognizer()..onTapUp = _onTapUp;\n    }\n  }\n\n  @override\n  void performLayout() {\n    size = constraints.constrainDimensions(constraints.maxWidth, _barHeight);\n  }\n\n  static const double _barHeight = 15.0;\n  static const double _dividerWidth = 2.0;\n\n  static ui.Paragraph _getParagraph(String title, double size) {\n    final builder =\n        ui.ParagraphBuilder(\n            ui.ParagraphStyle(\n              textDirection: .ltr,\n              strutStyle: ui.StrutStyle(\n                leading: 0,\n                height: 1,\n                fontSize: size,\n              ),\n            ),\n          )\n          ..pushStyle(\n            ui.TextStyle(\n              color: Colors.white,\n              fontSize: size,\n              height: 1,\n            ),\n          )\n          ..addText(title);\n    return builder.build()\n      ..layout(const ui.ParagraphConstraints(width: double.infinity));\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    final size = this.size;\n    final canvas = context.canvas;\n    final paint = Paint()..style = PaintingStyle.fill;\n\n    if (offset != .zero) {\n      canvas\n        ..save()\n        ..translate(offset.dx, offset.dy);\n    }\n\n    assert(segments.isSortedBy((i) => i.end));\n\n    canvas.drawRect(\n      Rect.fromLTRB(0, 0, size.width, _barHeight),\n      paint..color = Colors.grey[600]!.withValues(alpha: 0.45),\n    );\n\n    paint.color = Colors.black.withValues(alpha: 0.5);\n\n    double prevEnd = 0.0;\n    for (final segment in segments) {\n      final segmentEnd = segment.end * size.width;\n      canvas.drawRect(\n        Rect.fromLTRB(\n          segmentEnd,\n          0,\n          segmentEnd + _dividerWidth,\n          _barHeight + height,\n        ),\n        paint,\n      );\n      final title = segment.title;\n      if (title != null && title.isNotEmpty) {\n        final segmentWidth = segmentEnd - prevEnd;\n        final paragraph = _getParagraph(title, 10);\n        final textWidth = paragraph.maxIntrinsicWidth;\n        final textHeight = paragraph.height;\n\n        final isOverflow = textWidth > segmentWidth;\n        final Offset offset;\n        if (isOverflow) {\n          final scale = segmentWidth / textWidth;\n          canvas\n            ..save()\n            ..translate(prevEnd, (_barHeight - textHeight * scale) / 2)\n            ..scale(scale);\n          offset = Offset.zero;\n        } else {\n          offset = Offset(\n            (segmentWidth - textWidth) / 2 + prevEnd,\n            (_barHeight - textHeight) / 2,\n          );\n        }\n        canvas.drawParagraph(paragraph, offset);\n        paragraph.dispose();\n        if (isOverflow) {\n          canvas.restore();\n        }\n      }\n      prevEnd = segmentEnd + _dividerWidth;\n    }\n    if (offset != .zero) canvas.restore();\n  }\n\n  ValueSetter<Duration>? _onSeek;\n  set onSeek(ValueSetter<Duration>? value) {\n    if (_onSeek == value) {\n      return;\n    }\n    _onSeek = value;\n  }\n\n  TapGestureRecognizer? _tapGestureRecognizer;\n\n  @override\n  void dispose() {\n    _onSeek = null;\n    _tapGestureRecognizer\n      ?..onTapUp = null\n      ..dispose();\n    _tapGestureRecognizer = null;\n    super.dispose();\n  }\n\n  final bool _hitTestSelf;\n  @override\n  bool hitTestSelf(Offset position) => _hitTestSelf;\n\n  @override\n  void handleEvent(PointerEvent event, BoxHitTestEntry entry) {\n    if (event is PointerDownEvent) {\n      _tapGestureRecognizer?.addPointer(event);\n    }\n  }\n\n  @pragma('vm:notify-debugger-on-exception')\n  void _onTapUp(TapUpDetails details) {\n    try {\n      final seg = details.localPosition.dx / size.width;\n      final item = _segments[_segments.lowerBoundByKey((i) => i.end, seg)];\n      if (item.from case final from?) {\n        _onSeek?.call(Duration(seconds: from));\n      }\n      // if (kDebugMode) debugPrint('${item.title},,${item.from}');\n    } catch (_) {}\n  }\n}\n\nabstract class BaseSegmentProgressBar<T extends BaseSegment>\n    extends LeafRenderObjectWidget {\n  const BaseSegmentProgressBar({\n    super.key,\n    this.height = 3.5,\n    required this.segments,\n  });\n\n  final double height;\n  final List<T> segments;\n\n  @override\n  void updateRenderObject(\n    BuildContext context,\n    BaseRenderProgressBar renderObject,\n  ) {\n    renderObject\n      ..height = height\n      ..segments = segments;\n  }\n}\n\nclass BaseRenderProgressBar<T extends BaseSegment> extends RenderBox {\n  BaseRenderProgressBar({\n    required double height,\n    required List<T> segments,\n  }) : _height = height,\n       _segments = segments;\n\n  double _height;\n  double get height => _height;\n  set height(double value) {\n    if (_height == value) return;\n    _height = value;\n    markNeedsLayout();\n  }\n\n  List<T> _segments;\n  List<T> get segments => _segments;\n  set segments(List<T> value) {\n    if (listEquals(_segments, value)) return;\n    _segments = value;\n    markNeedsPaint();\n  }\n\n  @override\n  void performLayout() {\n    size = constraints.constrainDimensions(constraints.maxWidth, height);\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/progress_bar/video_progress_indicator.dart",
    "content": "/*\n * This file is part of PiliPlus\n *\n * PiliPlus 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 * PiliPlus 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 PiliPlus.  If not, see <https://www.gnu.org/licenses/>.\n */\n\nimport 'package:flutter/widgets.dart';\n\nclass VideoProgressIndicator extends LeafRenderObjectWidget {\n  const VideoProgressIndicator({\n    super.key,\n    required this.color,\n    required this.backgroundColor,\n    this.radius = 10,\n    this.height = 4,\n    required this.progress,\n  }) : assert(progress >= 0 && progress <= 1);\n\n  final Color color;\n  final Color backgroundColor;\n  final double radius;\n  final double height;\n  final double progress;\n\n  @override\n  RenderObject createRenderObject(BuildContext context) {\n    return RenderProgressBar(\n      color: color,\n      backgroundColor: backgroundColor,\n      radius: radius,\n      height: height,\n      progress: progress,\n    );\n  }\n\n  @override\n  void updateRenderObject(\n    BuildContext context,\n    RenderProgressBar renderObject,\n  ) {\n    renderObject\n      ..color = color\n      ..backgroundColor = backgroundColor\n      ..radius = radius\n      ..height = height\n      ..progress = progress;\n  }\n}\n\nclass RenderProgressBar extends RenderBox {\n  RenderProgressBar({\n    required Color color,\n    required Color backgroundColor,\n    required double radius,\n    required double height,\n    required double progress,\n  }) : _color = color,\n       _backgroundColor = backgroundColor,\n       _radius = radius,\n       _height = height,\n       _progress = progress;\n\n  Color _color;\n  Color get color => _color;\n  set color(Color value) {\n    if (_color == value) return;\n    _color = value;\n    markNeedsPaint();\n  }\n\n  Color _backgroundColor;\n  Color get backgroundColor => _backgroundColor;\n  set backgroundColor(Color value) {\n    if (_backgroundColor == value) return;\n    _backgroundColor = value;\n    markNeedsPaint();\n  }\n\n  double _progress;\n  double get progress => _progress;\n  set progress(double value) {\n    if (_progress == value) return;\n    _progress = value;\n    markNeedsPaint();\n  }\n\n  double _radius;\n  double get radius => _radius;\n  set radius(double value) {\n    if (_radius == value) return;\n    _radius = value;\n    markNeedsLayout();\n  }\n\n  double _height;\n  double get height => _height;\n  set height(double value) {\n    if (_height == value) return;\n    _height = value;\n    markNeedsPaint();\n  }\n\n  @override\n  void performLayout() {\n    size = constraints.constrainDimensions(constraints.maxWidth, _radius);\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    final size = this.size;\n    final canvas = context.canvas\n      ..save()\n      ..translate(offset.dx, offset.dy);\n    final paint = Paint()..style = .fill;\n\n    canvas.clipRect(\n      .fromLTRB(0, size.height - height, size.width, size.height),\n    );\n\n    final radius = Radius.circular(_radius);\n    final rect = Rect.fromLTRB(0, 0, size.width, size.height);\n    final rrect = RRect.fromRectAndCorners(\n      rect,\n      bottomLeft: radius,\n      bottomRight: radius,\n    );\n\n    if (progress == 0) {\n      canvas.drawRRect(rrect, paint..color = _backgroundColor);\n    } else if (progress == 1) {\n      canvas.drawRRect(rrect, paint..color = _color);\n    } else {\n      final w = size.width * progress;\n      final left = Rect.fromLTRB(0, 0, w, size.height);\n      final right = Rect.fromLTRB(w, 0, size.width, size.height);\n      canvas\n        ..clipRRect(rrect)\n        ..drawRect(left, paint..color = _color)\n        ..drawRect(right, paint..color = _backgroundColor);\n    }\n    canvas.restore();\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/radio_widget.dart",
    "content": "import 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart';\n\nclass RadioWidget<T> extends StatefulWidget {\n  final T value;\n  final String title;\n  final bool tristate;\n  final EdgeInsetsGeometry? padding;\n  final MainAxisSize mainAxisSize;\n\n  const RadioWidget({\n    super.key,\n    required this.value,\n    required this.title,\n    this.tristate = false,\n    this.padding,\n    this.mainAxisSize = MainAxisSize.min,\n  });\n\n  @override\n  State<RadioWidget<T>> createState() => RadioWidgetState<T>();\n}\n\nclass RadioWidgetState<T> extends State<RadioWidget<T>> with RadioClient<T> {\n  late final _RadioRegistry<T> _radioRegistry = _RadioRegistry<T>(this);\n\n  @override\n  final focusNode = FocusNode();\n\n  @override\n  T get radioValue => widget.value;\n\n  bool get checked => radioValue == registry!.groupValue;\n\n  @override\n  bool get tristate => widget.tristate;\n\n  @override\n  bool get enabled => registry != null;\n\n  @override\n  void dispose() {\n    registry = null;\n    focusNode.dispose();\n    super.dispose();\n  }\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    registry = RadioGroup.maybeOf(context);\n    assert(registry != null);\n  }\n\n  void _handleTap() {\n    if (checked) {\n      if (tristate) registry!.onChanged(null);\n      return;\n    }\n    registry!.onChanged(radioValue);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final child = Row(\n      mainAxisSize: widget.mainAxisSize,\n      children: [\n        ExcludeFocus(\n          child: Radio<T>(\n            value: radioValue,\n            groupRegistry: _radioRegistry,\n            materialTapTargetSize: PlatformUtils.isDesktop\n                ? .padded\n                : .shrinkWrap,\n          ),\n        ),\n        Text(widget.title),\n      ],\n    );\n    return InkWell(\n      onTap: _handleTap,\n      focusNode: focusNode,\n      child: widget.padding == null\n          ? child\n          : Padding(padding: widget.padding!, child: child),\n    );\n  }\n}\n\nclass WrapRadioOptionsGroup<T> extends StatelessWidget {\n  final String groupTitle;\n  final Map<T, String> options;\n  final EdgeInsetsGeometry? itemPadding;\n\n  const WrapRadioOptionsGroup({\n    super.key,\n    required this.groupTitle,\n    required this.options,\n    this.itemPadding,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        if (groupTitle.isNotEmpty)\n          Padding(\n            padding: const EdgeInsets.only(left: 22),\n            child: Text(\n              groupTitle,\n              style: TextStyle(color: Theme.of(context).colorScheme.outline),\n            ),\n          ),\n        Padding(\n          padding: const EdgeInsets.symmetric(horizontal: 12),\n          child: Wrap(\n            children: options.entries.map((entry) {\n              return RadioWidget<T>(\n                value: entry.key,\n                title: entry.value,\n                padding: itemPadding ?? const EdgeInsets.only(right: 10),\n              );\n            }).toList(),\n          ),\n        ),\n      ],\n    );\n  }\n}\n\n/// A registry to controls internal [Radio] and hides it from [RadioGroup]\n/// ancestor.\n///\n/// [RadioListTile] implements the [RadioClient] directly to register to\n/// [RadioGroup] ancestor. Therefore, it has to hide the internal [Radio] from\n/// participate in the [RadioGroup] ancestor.\nclass _RadioRegistry<T> extends RadioGroupRegistry<T> {\n  _RadioRegistry(this.state);\n\n  final RadioWidgetState<T> state;\n\n  @override\n  T? get groupValue => state.registry!.groupValue;\n\n  @override\n  ValueChanged<T?> get onChanged => state.registry!.onChanged;\n\n  @override\n  void registerClient(RadioClient<T> radio) {}\n\n  @override\n  void unregisterClient(RadioClient<T> radio) {}\n}\n"
  },
  {
    "path": "lib/common/widgets/route_aware_mixin.dart",
    "content": "import 'package:flutter/widgets.dart';\nimport 'package:get/get_core/src/get_main.dart';\nimport 'package:get/get_navigation/src/extension_navigation.dart';\nimport 'package:get/get_navigation/src/routes/default_route.dart'\n    show GetPageRoute;\n\nfinal routeObserver = RouteObserver<GetPageRoute>();\n\nmixin RouteAwareMixin<T extends StatefulWidget> on State<T>, RouteAware {\n  @override\n  void initState() {\n    super.initState();\n    routeObserver.subscribe(this, Get.routing.route as GetPageRoute);\n  }\n\n  @override\n  void dispose() {\n    routeObserver.unsubscribe(this);\n    super.dispose();\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/scale_app.dart",
    "content": "import 'dart:async' show scheduleMicrotask;\nimport 'dart:collection' show Queue;\nimport 'dart:ui' show PointerDataPacket;\n\nimport 'package:flutter/gestures.dart' show PointerEventConverter;\nimport 'package:flutter/rendering.dart' show RenderView, ViewConfiguration;\nimport 'package:flutter/widgets.dart';\n\n/// ref https://github.com/LastMonopoly/scaled_app\n\n/// Adapted from [WidgetsFlutterBinding]\n///\nclass ScaledWidgetsFlutterBinding extends WidgetsFlutterBinding {\n  ScaledWidgetsFlutterBinding._({double scaleFactor = 1.0})\n    : _scaleFactor = scaleFactor;\n\n  /// Calculate scale factor from device size.\n  double _scaleFactor;\n\n  /// Update scaleFactor callback, then rebuild layout\n  set scaleFactor(double scaleFactor) {\n    if (_scaleFactor == scaleFactor) return;\n    _scaleFactor = scaleFactor;\n    handleMetricsChanged();\n  }\n\n  double devicePixelRatioScaled = 0;\n\n  static ScaledWidgetsFlutterBinding? _binding;\n\n  static ScaledWidgetsFlutterBinding get instance => _binding!;\n\n  /// Scaling will be applied based on [scaleFactor] callback.\n  ///\n  static WidgetsBinding ensureInitialized({double scaleFactor = 1.0}) =>\n      _binding ??= ScaledWidgetsFlutterBinding._(scaleFactor: scaleFactor);\n\n  /// Override the method from [RendererBinding.createViewConfiguration] to\n  /// change what size or device pixel ratio the [RenderView] will use.\n  ///\n  /// See more:\n  /// * [RendererBinding.createViewConfiguration]\n  /// * [TestWidgetsFlutterBinding.createViewConfiguration]\n  @override\n  ViewConfiguration createViewConfigurationFor(RenderView renderView) {\n    final view = renderView.flutterView;\n    final devicePixelRatio = view.devicePixelRatio;\n    devicePixelRatioScaled = devicePixelRatio * _scaleFactor;\n    final BoxConstraints physicalConstraints =\n        BoxConstraints.fromViewConstraints(view.physicalConstraints);\n    return ViewConfiguration(\n      physicalConstraints: physicalConstraints,\n      logicalConstraints: physicalConstraints / devicePixelRatioScaled,\n      devicePixelRatio: devicePixelRatioScaled,\n    );\n  }\n\n  /// Adapted from [GestureBinding.initInstances]\n  @override\n  void initInstances() {\n    super.initInstances();\n    platformDispatcher.onPointerDataPacket = _handlePointerDataPacket;\n  }\n\n  @override\n  void unlocked() {\n    super.unlocked();\n    _flushPointerEventQueue();\n  }\n\n  final Queue<PointerEvent> _pendingPointerEvents = Queue<PointerEvent>();\n\n  /// When we scale UI using [ViewConfiguration], [ui.window] stays the same.\n  ///\n  /// [GestureBinding] uses [platformDispatcher.implicitView.devicePixelRatio] for calculations,\n  /// so we override corresponding methods.\n  ///\n  void _handlePointerDataPacket(PointerDataPacket packet) {\n    // We convert pointer data to logical pixels so that e.g. the touch slop can be\n    // defined in a device-independent manner.\n    try {\n      _pendingPointerEvents.addAll(\n        PointerEventConverter.expand(packet.data, _devicePixelRatioForView),\n      );\n      if (!locked) {\n        _flushPointerEventQueue();\n      }\n    } catch (error, stack) {\n      FlutterError.reportError(\n        FlutterErrorDetails(\n          exception: error,\n          stack: stack,\n          library: 'gestures library',\n          context: ErrorDescription('while handling a pointer data packet'),\n        ),\n      );\n    }\n  }\n\n  double _devicePixelRatioForView(int viewId) => devicePixelRatioScaled;\n\n  /// Dispatch a [PointerCancelEvent] for the given pointer soon.\n  ///\n  /// The pointer event will be dispatched before the next pointer event and\n  /// before the end of the microtask but not within this function call.\n  @override\n  void cancelPointer(int pointer) {\n    if (_pendingPointerEvents.isEmpty && !locked) {\n      scheduleMicrotask(_flushPointerEventQueue);\n    }\n    _pendingPointerEvents.addFirst(PointerCancelEvent(pointer: pointer));\n  }\n\n  void _flushPointerEventQueue() {\n    assert(!locked);\n\n    while (_pendingPointerEvents.isNotEmpty) {\n      handlePointerEvent(_pendingPointerEvents.removeFirst());\n    }\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/scroll_behavior.dart",
    "content": "import 'package:flutter/gestures.dart' show PointerDeviceKind;\nimport 'package:flutter/material.dart';\n\nclass CustomScrollBehavior extends MaterialScrollBehavior {\n  const CustomScrollBehavior(this.dragDevices);\n\n  @override\n  Widget buildScrollbar(\n    BuildContext context,\n    Widget child,\n    ScrollableDetails details,\n  ) => child;\n\n  @override\n  final Set<PointerDeviceKind> dragDevices;\n}\n\nconst Set<PointerDeviceKind> desktopDragDevices = <PointerDeviceKind>{\n  PointerDeviceKind.touch,\n  PointerDeviceKind.stylus,\n  PointerDeviceKind.invertedStylus,\n  PointerDeviceKind.trackpad,\n  PointerDeviceKind.unknown,\n  PointerDeviceKind.mouse,\n};\n"
  },
  {
    "path": "lib/common/widgets/scroll_physics.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/page/tabs.dart';\nimport 'package:PiliPlus/common/widgets/gesture/horizontal_drag_gesture_recognizer.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:flutter/material.dart' hide TabBarView;\n\nWidget tabBarView({\n  required List<Widget> children,\n  TabController? controller,\n}) => TabBarView<CustomHorizontalDragGestureRecognizer>(\n  controller: controller,\n  physics: clampingScrollPhysics,\n  horizontalDragGestureRecognizer: CustomHorizontalDragGestureRecognizer.new,\n  children: children,\n);\n\nSpringDescription _customSpringDescription() {\n  final List<double> springDescription = Pref.springDescription;\n  return SpringDescription(\n    mass: springDescription[0],\n    stiffness: springDescription[1],\n    damping: springDescription[2],\n  );\n}\n\nconst clampingScrollPhysics = CustomTabBarViewScrollPhysics(\n  parent: ClampingScrollPhysics(),\n);\n\nclass CustomTabBarViewScrollPhysics extends ScrollPhysics {\n  const CustomTabBarViewScrollPhysics({super.parent});\n\n  @override\n  CustomTabBarViewScrollPhysics applyTo(ScrollPhysics? ancestor) {\n    return CustomTabBarViewScrollPhysics(parent: buildParent(ancestor));\n  }\n\n  static final _springDescription = _customSpringDescription();\n\n  @override\n  SpringDescription get spring => _springDescription;\n}\n\nmixin ReloadMixin {\n  late bool reload = false;\n}\n\nclass ReloadScrollPhysics extends AlwaysScrollableScrollPhysics {\n  const ReloadScrollPhysics({super.parent, required this.controller});\n\n  final ReloadMixin controller;\n\n  @override\n  ReloadScrollPhysics applyTo(ScrollPhysics? ancestor) {\n    return ReloadScrollPhysics(\n      parent: buildParent(ancestor),\n      controller: controller,\n    );\n  }\n\n  @override\n  double adjustPositionForNewDimensions({\n    required ScrollMetrics oldPosition,\n    required ScrollMetrics newPosition,\n    required bool isScrolling,\n    required double velocity,\n  }) {\n    if (controller.reload) {\n      controller.reload = false;\n      return 0;\n    }\n    return super.adjustPositionForNewDimensions(\n      oldPosition: oldPosition,\n      newPosition: newPosition,\n      isScrolling: isScrolling,\n      velocity: velocity,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/select_mask.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:flutter/material.dart';\n\nWidget selectMask(\n  ThemeData theme,\n  bool checked, {\n  BorderRadiusGeometry borderRadius = StyleString.mdRadius,\n}) {\n  return AnimatedOpacity(\n    opacity: checked ? 1 : 0,\n    duration: const Duration(milliseconds: 200),\n    child: Container(\n      alignment: Alignment.center,\n      decoration: BoxDecoration(\n        borderRadius: borderRadius,\n        color: Colors.black.withValues(alpha: 0.6),\n      ),\n      child: AnimatedScale(\n        scale: checked ? 1 : 0,\n        duration: const Duration(milliseconds: 250),\n        curve: Curves.easeInOut,\n        child: Container(\n          width: 34,\n          height: 34,\n          decoration: BoxDecoration(\n            color: theme.colorScheme.surface.withValues(alpha: 0.8),\n            shape: BoxShape.circle,\n          ),\n          child: Icon(\n            Icons.done_all_outlined,\n            color: theme.colorScheme.primary,\n            semanticLabel: '取消选择',\n          ),\n        ),\n      ),\n    ),\n  );\n}\n"
  },
  {
    "path": "lib/common/widgets/self_sized_horizontal_list.dart",
    "content": "import 'package:PiliPlus/common/widgets/only_layout_widget.dart';\nimport 'package:flutter/material.dart';\n\nclass SelfSizedHorizontalList extends StatefulWidget {\n  const SelfSizedHorizontalList({\n    super.key,\n    required this.itemCount,\n    required this.itemBuilder,\n    required this.separatorBuilder,\n    this.controller,\n    this.padding,\n  });\n\n  final int itemCount;\n  final EdgeInsets? padding;\n  final IndexedWidgetBuilder itemBuilder;\n  final IndexedWidgetBuilder separatorBuilder;\n  final ScrollController? controller;\n\n  @override\n  State<SelfSizedHorizontalList> createState() =>\n      _SelfSizedHorizontalListState();\n}\n\nclass _SelfSizedHorizontalListState extends State<SelfSizedHorizontalList> {\n  double? _height;\n\n  @override\n  Widget build(BuildContext context) {\n    if (_height == null) {\n      return OnlyLayoutWidget(\n        onPerformLayout: (Size size) {\n          if (!mounted) return;\n          _height = size.height;\n          setState(() {});\n        },\n        child: Padding(\n          padding: widget.padding ?? .zero,\n          child: widget.itemBuilder(context, 0),\n        ),\n      );\n    }\n\n    return SizedBox(\n      height: _height,\n      child: ListView.separated(\n        scrollDirection: .horizontal,\n        padding: widget.padding,\n        itemCount: widget.itemCount,\n        controller: widget.controller,\n        itemBuilder: widget.itemBuilder,\n        separatorBuilder: widget.separatorBuilder,\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/sliver/sliver_floating_header.dart",
    "content": "/*\n * This file is part of PiliPlus\n *\n * PiliPlus 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 * PiliPlus 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 PiliPlus.  If not, see <https://www.gnu.org/licenses/>.\n */\n\nimport 'dart:math' as math;\n\nimport 'package:flutter/foundation.dart' show clampDouble;\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart'\n    show RenderSliverSingleBoxAdapter, SliverGeometry;\n\n/// ref [SliverFloatingHeader]\n\nclass SliverFloatingHeaderWidget extends SingleChildRenderObjectWidget {\n  const SliverFloatingHeaderWidget({\n    super.key,\n    required Widget super.child,\n    required this.backgroundColor,\n  });\n\n  final Color backgroundColor;\n\n  @override\n  RenderObject createRenderObject(BuildContext context) =>\n      RenderSliverFloatingHeader(backgroundColor: backgroundColor);\n\n  @override\n  void updateRenderObject(\n    BuildContext context,\n    RenderSliverFloatingHeader renderObject,\n  ) {\n    renderObject.backgroundColor = backgroundColor;\n  }\n}\n\nclass RenderSliverFloatingHeader extends RenderSliverSingleBoxAdapter {\n  RenderSliverFloatingHeader({\n    required Color backgroundColor,\n  }) : _backgroundColor = backgroundColor;\n\n  Color _backgroundColor;\n  set backgroundColor(Color value) {\n    if (_backgroundColor == value) return;\n    _backgroundColor = value;\n    markNeedsPaint();\n  }\n\n  double? _childPosition;\n\n  double? lastScrollOffset;\n\n  late double effectiveScrollOffset;\n\n  bool get floatingHeaderNeedsToBeUpdated {\n    return lastScrollOffset != null &&\n        (constraints.scrollOffset < lastScrollOffset! ||\n            effectiveScrollOffset < child!.size.height);\n  }\n\n  @override\n  void performLayout() {\n    if (!floatingHeaderNeedsToBeUpdated) {\n      effectiveScrollOffset = constraints.scrollOffset;\n    } else {\n      double delta =\n          lastScrollOffset! -\n          constraints.scrollOffset; // > 0 when the header is growing\n      if (constraints.userScrollDirection == .forward) {\n        final childExtent = child!.size.height;\n        if (effectiveScrollOffset > childExtent) {\n          effectiveScrollOffset =\n              childExtent; // The header is now just above the start edge of viewport.\n        }\n      } else {\n        // delta > 0 and scrolling forward is a contradiction. Assume that it's noise (set delta to 0).\n        delta = clampDouble(delta, -double.infinity, 0);\n      }\n      effectiveScrollOffset = clampDouble(\n        effectiveScrollOffset - delta,\n        0.0,\n        constraints.scrollOffset,\n      );\n    }\n\n    child?.layout(constraints.asBoxConstraints(), parentUsesSize: true);\n    final childExtent = child!.size.height;\n    final double paintExtent = childExtent - effectiveScrollOffset;\n    final double layoutExtent = childExtent - constraints.scrollOffset;\n    geometry = SliverGeometry(\n      paintOrigin: math.min(constraints.overlap, 0.0),\n      scrollExtent: childExtent,\n      paintExtent: clampDouble(\n        paintExtent,\n        0.0,\n        constraints.remainingPaintExtent,\n      ),\n      layoutExtent: clampDouble(\n        layoutExtent,\n        0.0,\n        constraints.remainingPaintExtent,\n      ),\n      maxPaintExtent: childExtent,\n      hasVisualOverflow: false,\n    );\n\n    _childPosition = math.min(0.0, paintExtent - childExtent);\n    lastScrollOffset = constraints.scrollOffset;\n  }\n\n  @override\n  double childMainAxisPosition(covariant RenderObject child) {\n    return _childPosition ?? 0;\n  }\n\n  @override\n  void applyPaintTransform(RenderObject child, Matrix4 transform) {\n    assert(child == this.child);\n    applyPaintTransformForBoxChild(child as RenderBox, transform);\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    if (child != null && geometry!.visible) {\n      offset += Offset(0.0, childMainAxisPosition(child!));\n      final size = child!.size;\n      context.canvas.drawRect(\n        Rect.fromLTWH(\n          offset.dx,\n          offset.dy - 2,\n          size.width,\n          size.height + 2,\n        ),\n        Paint()..color = _backgroundColor,\n      );\n      context.paintChild(child!, offset);\n    }\n  }\n\n  @override\n  bool hitTestSelf({\n    required double mainAxisPosition,\n    required double crossAxisPosition,\n  }) => true;\n}\n"
  },
  {
    "path": "lib/common/widgets/sliver/sliver_pinned_dynamic_header.dart",
    "content": "/*\n * This file is part of PiliPlus\n *\n * PiliPlus 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 * PiliPlus 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 PiliPlus.  If not, see <https://www.gnu.org/licenses/>.\n */\n\nimport 'dart:math' as math;\n\nimport 'package:flutter/foundation.dart' show clampDouble;\nimport 'package:flutter/rendering.dart'\n    show RenderSliverSingleBoxAdapter, SliverConstraints, SliverGeometry;\nimport 'package:flutter/widgets.dart';\n\n/// ref [SliverPersistentHeader]\nclass SliverPinnedDynamicHeader extends SingleChildRenderObjectWidget {\n  const SliverPinnedDynamicHeader({\n    super.key,\n    required Widget super.child,\n    required this.minExtent,\n    required this.maxExtent,\n  });\n\n  final double minExtent;\n  final double maxExtent;\n\n  @override\n  RenderObject createRenderObject(BuildContext context) {\n    return RenderSliverPinnedDynamicHeader(\n      minExtent: minExtent,\n      maxExtent: maxExtent,\n    );\n  }\n\n  @override\n  void updateRenderObject(\n    BuildContext context,\n    RenderSliverPinnedDynamicHeader renderObject,\n  ) {\n    renderObject\n      ..minExtent = minExtent\n      ..maxExtent = maxExtent;\n  }\n}\n\nclass RenderSliverPinnedDynamicHeader extends RenderSliverSingleBoxAdapter {\n  RenderSliverPinnedDynamicHeader({\n    required double minExtent,\n    required double maxExtent,\n  }) : _minExtent = minExtent,\n       _maxExtent = maxExtent;\n\n  double _minExtent;\n  double get minExtent => _minExtent;\n  set minExtent(double value) {\n    if (_minExtent == value) return;\n    _minExtent = value;\n    markNeedsLayout();\n  }\n\n  double _maxExtent;\n  double get maxExtent => _maxExtent;\n  set maxExtent(double value) {\n    // removed\n    // if (_maxExtent == value) return;\n    _maxExtent = value;\n    markNeedsLayout();\n  }\n\n  @override\n  void performLayout() {\n    final SliverConstraints constraints = this.constraints;\n    final double shrinkOffset = math.min(constraints.scrollOffset, maxExtent);\n    child!.layout(\n      constraints.asBoxConstraints(\n        maxExtent: math.max(minExtent, maxExtent - shrinkOffset),\n      ),\n      parentUsesSize: true,\n    );\n    final double childExtent = child!.size.height;\n    final double effectiveRemainingPaintExtent = math.max(\n      0,\n      constraints.remainingPaintExtent - constraints.overlap,\n    );\n    final double layoutExtent = clampDouble(\n      maxExtent - constraints.scrollOffset,\n      0.0,\n      effectiveRemainingPaintExtent,\n    );\n    geometry = SliverGeometry(\n      scrollExtent: maxExtent,\n      paintOrigin: constraints.overlap,\n      paintExtent: math.min(childExtent, effectiveRemainingPaintExtent),\n      layoutExtent: layoutExtent,\n      maxPaintExtent: maxExtent,\n      maxScrollObstructionExtent: minExtent,\n      cacheExtent: layoutExtent > 0.0\n          ? -constraints.cacheOrigin + layoutExtent\n          : layoutExtent,\n      hasVisualOverflow: false,\n    );\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    if (child != null && geometry!.visible) {\n      context.paintChild(child!, offset);\n    }\n  }\n\n  @override\n  double childMainAxisPosition(RenderBox child) => 0.0;\n}\n"
  },
  {
    "path": "lib/common/widgets/sliver/sliver_pinned_header.dart",
    "content": "/*\n * This file is part of PiliPlus\n *\n * PiliPlus 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 * PiliPlus 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 PiliPlus.  If not, see <https://www.gnu.org/licenses/>.\n */\n\nimport 'dart:math' as math;\n\nimport 'package:flutter/foundation.dart' show clampDouble;\nimport 'package:flutter/rendering.dart'\n    show RenderSliverSingleBoxAdapter, SliverGeometry;\nimport 'package:flutter/widgets.dart';\n\n/// ref [SliverPersistentHeader]\nclass SliverPinnedHeader extends SingleChildRenderObjectWidget {\n  const SliverPinnedHeader({\n    super.key,\n    required Widget super.child,\n    this.backgroundColor,\n  });\n\n  final Color? backgroundColor;\n\n  @override\n  RenderObject createRenderObject(BuildContext context) =>\n      RenderSliverPinnedHeader(backgroundColor: backgroundColor);\n\n  @override\n  void updateRenderObject(\n    BuildContext context,\n    RenderSliverPinnedHeader renderObject,\n  ) {\n    renderObject.backgroundColor = backgroundColor;\n  }\n}\n\nclass RenderSliverPinnedHeader extends RenderSliverSingleBoxAdapter {\n  RenderSliverPinnedHeader({\n    required Color? backgroundColor,\n  }) : _backgroundColor = backgroundColor;\n\n  Color? _backgroundColor;\n  set backgroundColor(Color? value) {\n    if (_backgroundColor == value) return;\n    _backgroundColor = value;\n    if (_isPinned) markNeedsPaint();\n  }\n\n  bool _isPinned = false;\n\n  @override\n  void performLayout() {\n    final constraints = this.constraints;\n    child!.layout(constraints.asBoxConstraints(), parentUsesSize: true);\n    final double childExtent = child!.size.height;\n    final double effectiveRemainingPaintExtent = math.max(\n      0,\n      constraints.remainingPaintExtent - constraints.overlap,\n    );\n    final double layoutExtent = clampDouble(\n      childExtent - constraints.scrollOffset,\n      0.0,\n      effectiveRemainingPaintExtent,\n    );\n    _isPinned = constraints.overlap > 0.0 || constraints.scrollOffset > 0.0;\n    geometry = SliverGeometry(\n      scrollExtent: childExtent,\n      paintOrigin: constraints.overlap,\n      paintExtent: math.min(childExtent, effectiveRemainingPaintExtent),\n      layoutExtent: layoutExtent,\n      maxPaintExtent: childExtent,\n      maxScrollObstructionExtent: childExtent,\n      cacheExtent: layoutExtent > 0.0\n          ? -constraints.cacheOrigin + layoutExtent\n          : layoutExtent,\n      hasVisualOverflow: false,\n    );\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    if (child != null && geometry!.visible) {\n      if (_isPinned && _backgroundColor != null) {\n        final size = child!.size;\n        context.canvas.drawRect(\n          Rect.fromLTWH(\n            offset.dx,\n            offset.dy - 2,\n            size.width,\n            size.height + 2,\n          ),\n          Paint()..color = _backgroundColor!,\n        );\n      }\n      context.paintChild(child!, offset);\n    }\n  }\n\n  @override\n  double childMainAxisPosition(RenderBox child) => 0.0;\n\n  @override\n  bool hitTestSelf({\n    required double mainAxisPosition,\n    required double crossAxisPosition,\n  }) => true;\n}\n"
  },
  {
    "path": "lib/common/widgets/sliver_wrap.dart",
    "content": "import 'dart:math' as math;\n\nimport 'package:flutter/rendering.dart';\nimport 'package:flutter/widgets.dart';\n\nclass SliverFixedWrap extends SliverMultiBoxAdaptorWidget {\n  final double mainAxisExtent;\n  final double spacing;\n  final double runSpacing;\n\n  const SliverFixedWrap({\n    super.key,\n    required super.delegate,\n    required this.mainAxisExtent,\n    this.spacing = 0,\n    this.runSpacing = 0,\n  });\n\n  @override\n  SliverWrapElement createElement() =>\n      SliverWrapElement(this, replaceMovedChildren: true);\n\n  @override\n  RenderSliverFixedWrap createRenderObject(BuildContext context) {\n    return RenderSliverFixedWrap(\n      childManager: context as SliverWrapElement,\n      mainAxisExtent: mainAxisExtent,\n      spacing: spacing,\n      runSpacing: runSpacing,\n    );\n  }\n\n  @override\n  void updateRenderObject(\n    BuildContext context,\n    RenderSliverFixedWrap renderObject,\n  ) {\n    renderObject\n      ..mainAxisExtent = mainAxisExtent\n      ..spacing = spacing\n      ..runSpacing = runSpacing;\n  }\n}\n\nclass SliverWrapParentData extends SliverMultiBoxAdaptorParentData {\n  double crossAxisOffset = 0.0;\n\n  @override\n  String toString() => 'crossAxisOffset=$crossAxisOffset; ${super.toString()}';\n}\n\nclass _Row {\n  final int startIndex;\n  final int endIndex;\n  final List<double> childWidths;\n\n  _Row({\n    required this.startIndex,\n    required this.endIndex,\n    required this.childWidths,\n  });\n}\n\nclass RenderSliverFixedWrap extends RenderSliverMultiBoxAdaptor {\n  RenderSliverFixedWrap({\n    required super.childManager,\n    required double mainAxisExtent,\n    double spacing = 0.0,\n    double runSpacing = 0.0,\n  }) : _mainAxisExtent = mainAxisExtent,\n       _spacing = spacing,\n       _runSpacing = runSpacing {\n    assert(mainAxisExtent > 0.0 && mainAxisExtent.isFinite);\n  }\n\n  double _mainAxisExtent;\n  double get mainAxisExtent => _mainAxisExtent;\n  set mainAxisExtent(double value) {\n    if (_mainAxisExtent == value) return;\n    _mainAxisExtent = value;\n    markRowsDirty();\n    markNeedsLayout();\n  }\n\n  double _spacing;\n  double get spacing => _spacing;\n  set spacing(double value) {\n    if (_spacing == value) return;\n    _spacing = value;\n    markRowsDirty();\n    markNeedsLayout();\n  }\n\n  double _runSpacing;\n  double get runSpacing => _runSpacing;\n  set runSpacing(double value) {\n    if (_runSpacing == value) return;\n    _runSpacing = value;\n    markNeedsLayout();\n  }\n\n  final List<_Row> _rows = [];\n\n  void markRowsDirty() {\n    _rows.clear();\n  }\n\n  @override\n  void setupParentData(RenderObject child) {\n    if (child.parentData is! SliverWrapParentData) {\n      child.parentData = SliverWrapParentData();\n    }\n  }\n\n  @override\n  double childCrossAxisPosition(RenderBox child) {\n    return (child.parentData as SliverWrapParentData).crossAxisOffset;\n  }\n\n  double _childCrossExtent(RenderBox child) {\n    assert(child.hasSize);\n    return switch (constraints.axis) {\n      Axis.horizontal => child.size.height,\n      Axis.vertical => child.size.width,\n    };\n  }\n\n  RenderBox _getOrCreateChildAtIndex(\n    int index,\n    BoxConstraints constraints,\n    RenderBox? child,\n  ) {\n    assert(firstChild != null);\n\n    if (index < indexOf(firstChild!)) {\n      do {\n        child = insertAndLayoutLeadingChild(constraints, parentUsesSize: true);\n        assert(child != null);\n      } while (indexOf(child!) > index);\n\n      assert(indexOf(child) == index);\n\n      return child;\n    } else if (index > indexOf(lastChild!)) {\n      do {\n        child = insertAndLayoutChild(\n          constraints,\n          after: lastChild,\n          parentUsesSize: true,\n        );\n        assert(child != null);\n      } while (indexOf(child!) < index);\n\n      assert(indexOf(child) == index);\n\n      return child;\n    } else {\n      child = firstChild;\n      while (indexOf(child!) < index) {\n        child = childAfter(child);\n      }\n      if (indexOf(child) == index) {\n        child.layout(constraints, parentUsesSize: true);\n        return child;\n      }\n      throw RangeError.value(index, 'index', 'Value not included in children');\n    }\n  }\n\n  bool _buildNextRow(int start, BoxConstraints constraints) {\n    final int childCount = childManager.childCount;\n\n    if (start >= childCount) {\n      return false;\n    }\n\n    final crossAxisExtent = this.constraints.crossAxisExtent;\n\n    final List<double> widths = [];\n    int idx = start;\n    RenderBox? child;\n    for (var totalWidth = -_spacing; idx < childCount; idx++) {\n      child = _getOrCreateChildAtIndex(idx, constraints, child);\n      final childWidth = _childCrossExtent(child);\n      totalWidth += childWidth + _spacing;\n\n      if (totalWidth <= crossAxisExtent) {\n        widths.add(childWidth);\n      } else {\n        break;\n      }\n    }\n\n    _rows.add(_Row(startIndex: start, endIndex: idx - 1, childWidths: widths));\n    return true;\n  }\n\n  @override\n  void performLayout() {\n    childManager\n      ..didStartLayout()\n      ..setDidUnderflow(false);\n\n    final constraints = this.constraints;\n    final childCount = childManager.childCount;\n\n    final rowHeight = _mainAxisExtent + _runSpacing;\n\n    final scrollOffset = constraints.scrollOffset;\n\n    final firstCacheOffset = scrollOffset + constraints.cacheOrigin;\n    final lastCacheOffset = scrollOffset + constraints.remainingCacheExtent;\n\n    final firstNeededRow = math.max(0, firstCacheOffset ~/ rowHeight);\n    final lastNeededRow = math.max(0, lastCacheOffset ~/ rowHeight);\n\n    final childConstraints = constraints.toFixedConstraints(_mainAxisExtent);\n\n    if (firstChild == null) {\n      if (!addInitialChild()) {\n        geometry = SliverGeometry.zero;\n        childManager.didFinishLayout();\n        return;\n      }\n      firstChild!.layout(childConstraints, parentUsesSize: true);\n    }\n\n    while (_rows.length <= lastNeededRow) {\n      final int startIndex = _rows.isEmpty ? 0 : _rows.last.endIndex + 1;\n      if (!_buildNextRow(startIndex, childConstraints)) {\n        break;\n      }\n    }\n\n    assert(firstNeededRow >= 0);\n\n    final int firstKeptRow = firstNeededRow.clamp(0, _rows.length - 1);\n    final int lastKeptRow = lastNeededRow.clamp(0, _rows.length - 1);\n\n    final int firstKeptIndex = _rows[firstKeptRow].startIndex;\n    final int lastKeptIndex = _rows[lastKeptRow].endIndex;\n\n    collectGarbage(\n      calculateLeadingGarbage(firstIndex: firstKeptIndex),\n      calculateTrailingGarbage(lastIndex: lastKeptIndex),\n    );\n\n    RenderBox? child;\n    for (var r = firstKeptRow; r <= lastKeptRow; r++) {\n      final row = _rows[r];\n      final rowStartOffset = r * rowHeight;\n      double crossOffset = 0.0;\n      for (var i = row.startIndex; i <= row.endIndex; i++) {\n        child = _getOrCreateChildAtIndex(i, childConstraints, child);\n        (child.parentData as SliverWrapParentData)\n          ..layoutOffset = rowStartOffset\n          ..crossAxisOffset = crossOffset;\n        crossOffset += row.childWidths[i - row.startIndex] + _spacing;\n      }\n    }\n\n    final endOffset = _rows.last.endIndex == childCount - 1\n        ? (_rows.length * rowHeight)\n        : (_rows.last.startIndex + 1) * rowHeight;\n\n    final double estimatedMaxScrollOffset;\n    if (_rows.length <= lastNeededRow || childCount == 0) {\n      estimatedMaxScrollOffset = childManager.estimateMaxScrollOffset(\n        constraints,\n        firstIndex: firstKeptIndex,\n        lastIndex: lastKeptIndex,\n        leadingScrollOffset: firstKeptRow * rowHeight,\n        trailingScrollOffset: endOffset,\n      );\n    } else {\n      estimatedMaxScrollOffset = _rows.length * rowHeight;\n    }\n\n    final double paintExtent = calculatePaintOffset(\n      constraints,\n      from: firstKeptRow * rowHeight,\n      to: endOffset,\n    );\n    final double cacheExtent = calculateCacheOffset(\n      constraints,\n      from: firstCacheOffset,\n      to: lastCacheOffset,\n    );\n\n    geometry = SliverGeometry(\n      scrollExtent: estimatedMaxScrollOffset,\n      paintExtent: paintExtent,\n      cacheExtent: cacheExtent,\n      maxPaintExtent: estimatedMaxScrollOffset,\n      hasVisualOverflow:\n          endOffset >\n          constraints.scrollOffset + constraints.remainingPaintExtent,\n    );\n\n    if (estimatedMaxScrollOffset <= endOffset) {\n      childManager.setDidUnderflow(true);\n    }\n\n    childManager.didFinishLayout();\n  }\n\n  @override\n  void dispose() {\n    markRowsDirty();\n    super.dispose();\n  }\n}\n\nclass SliverWrapElement extends SliverMultiBoxAdaptorElement {\n  SliverWrapElement(SliverFixedWrap super.widget, {super.replaceMovedChildren});\n\n  @override\n  void performRebuild() {\n    (renderObject as RenderSliverFixedWrap).markRowsDirty();\n    super.performRebuild();\n  }\n}\n\nextension on SliverConstraints {\n  BoxConstraints toFixedConstraints(double mainAxisExtent) {\n    switch (axis) {\n      case Axis.horizontal:\n        return BoxConstraints(\n          minHeight: 0,\n          maxHeight: crossAxisExtent,\n          minWidth: mainAxisExtent,\n          maxWidth: mainAxisExtent,\n        );\n      case Axis.vertical:\n        return BoxConstraints(\n          minWidth: 0,\n          maxWidth: crossAxisExtent,\n          minHeight: mainAxisExtent,\n          maxHeight: mainAxisExtent,\n        );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/stat/stat.dart",
    "content": "import 'package:PiliPlus/models/common/stat_type.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\nimport 'package:flutter/material.dart';\n\nclass StatWidget extends StatelessWidget {\n  final StatType type;\n  final dynamic value;\n  final Color? color;\n  final double iconSize;\n\n  const StatWidget({\n    super.key,\n    required this.type,\n    required this.value,\n    this.color,\n    this.iconSize = 13,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    Color color =\n        this.color ??\n        Theme.of(context).colorScheme.outline.withValues(alpha: 0.8);\n    return Row(\n      spacing: 2,\n      mainAxisSize: MainAxisSize.min,\n      children: [\n        Icon(\n          type.iconData,\n          semanticLabel: type.label,\n          size: iconSize,\n          color: color,\n        ),\n        Text(\n          NumUtils.numFormat(value),\n          style: TextStyle(fontSize: 12, color: color),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/stateful_builder.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass StatefulBuilder extends StatefulWidget {\n  const StatefulBuilder({\n    super.key,\n    this.onInit,\n    this.onDispose,\n    required this.builder,\n  });\n\n  final VoidCallback? onInit;\n\n  final VoidCallback? onDispose;\n\n  final StatefulWidgetBuilder builder;\n\n  @override\n  State<StatefulBuilder> createState() => _StatefulBuilderState();\n}\n\nclass _StatefulBuilderState extends State<StatefulBuilder> {\n  @override\n  void initState() {\n    super.initState();\n    widget.onInit?.call();\n  }\n\n  @override\n  void dispose() {\n    widget.onDispose?.call();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) => widget.builder(context, setState);\n}\n"
  },
  {
    "path": "lib/common/widgets/time_picker.dart",
    "content": "import 'package:flutter/material.dart' as material;\n\nFuture<material.TimeOfDay?> showTimePicker({\n  required material.BuildContext context,\n  required material.TimeOfDay initialTime,\n}) => material.showTimePicker(\n  context: context,\n  initialTime: initialTime,\n  builder: (context, child) => material.DialogTheme(\n    data: material.DialogTheme.of(\n      context,\n    ).copyWith(constraints: const material.BoxConstraints(minWidth: 280)),\n    child: child,\n  ),\n);\n"
  },
  {
    "path": "lib/common/widgets/video_card/video_card_h.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/progress_bar/video_progress_indicator.dart';\nimport 'package:PiliPlus/common/widgets/stat/stat.dart';\nimport 'package:PiliPlus/common/widgets/video_popup_menu.dart';\nimport 'package:PiliPlus/http/search.dart';\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models/common/stat_type.dart';\nimport 'package:PiliPlus/models/model_hot_video_item.dart';\nimport 'package:PiliPlus/models/model_video.dart';\nimport 'package:PiliPlus/models/search/result.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/duration_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\n\n// 视频卡片 - 水平布局\nclass VideoCardH extends StatelessWidget {\n  const VideoCardH({\n    super.key,\n    required this.videoItem,\n    this.onTap,\n    this.onViewLater,\n    this.onRemove,\n  });\n  final BaseVideoItemModel videoItem;\n  final VoidCallback? onTap;\n  final ValueChanged<int>? onViewLater;\n  final VoidCallback? onRemove;\n\n  @override\n  Widget build(BuildContext context) {\n    String type = 'video';\n    String? badge;\n    if (videoItem case final SearchVideoItemModel item) {\n      final typeOrNull = item.type;\n      if (typeOrNull != null && typeOrNull.isNotEmpty) {\n        type = typeOrNull;\n        if (type == 'ketang') {\n          badge = '课堂';\n        } else if (type == 'live_room') {\n          badge = '直播';\n        }\n      }\n      if (item.isUnionVideo == 1) {\n        badge = '合作';\n      }\n    } else if (videoItem case final HotVideoItemModel item) {\n      if (item.isCharging == true) {\n        badge = '充电专属';\n      } else if (item.isCooperation == 1) {\n        badge = '合作';\n      } else {\n        badge = item.pgcLabel;\n      }\n    }\n    void onLongPress() => imageSaveDialog(\n      bvid: videoItem.bvid,\n      title: videoItem.title,\n      cover: videoItem.cover,\n    );\n    final colorScheme = ColorScheme.of(context);\n    return Material(\n      type: MaterialType.transparency,\n      child: Stack(\n        clipBehavior: Clip.none,\n        children: [\n          InkWell(\n            onLongPress: onLongPress,\n            onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n            onTap:\n                onTap ??\n                () async {\n                  if (type == 'ketang') {\n                    PageUtils.viewPugv(seasonId: videoItem.aid);\n                    return;\n                  } else if (type == 'live_room') {\n                    if (videoItem case final SearchVideoItemModel item) {\n                      int? roomId = item.id;\n                      if (roomId != null) {\n                        PageUtils.toLiveRoom(roomId);\n                      }\n                    } else {\n                      SmartDialog.showToast(\n                        'err: live_room : ${videoItem.runtimeType}',\n                      );\n                    }\n                    return;\n                  }\n                  if (videoItem case final HotVideoItemModel item) {\n                    if (item.redirectUrl?.isNotEmpty == true &&\n                        PageUtils.viewPgcFromUri(item.redirectUrl!)) {\n                      return;\n                    }\n                  }\n\n                  try {\n                    final int? cid =\n                        videoItem.cid ??\n                        await SearchHttp.ab2c(\n                          aid: videoItem.aid,\n                          bvid: videoItem.bvid,\n                        );\n                    if (cid != null) {\n                      PageUtils.toVideoPage(\n                        bvid: videoItem.bvid,\n                        cid: cid,\n                        cover: videoItem.cover,\n                        title: videoItem.title,\n                      );\n                    }\n                  } catch (err) {\n                    SmartDialog.showToast(err.toString());\n                  }\n                },\n            child: Padding(\n              padding: const EdgeInsets.symmetric(\n                horizontal: StyleString.safeSpace,\n                vertical: 5,\n              ),\n              child: Row(\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: <Widget>[\n                  AspectRatio(\n                    aspectRatio: StyleString.aspectRatio,\n                    child: LayoutBuilder(\n                      builder: (context, boxConstraints) {\n                        final double maxWidth = boxConstraints.maxWidth;\n                        final double maxHeight = boxConstraints.maxHeight;\n                        num? progress;\n                        if (videoItem case final HotVideoItemModel item) {\n                          progress = item.progress;\n                        }\n\n                        return Stack(\n                          clipBehavior: Clip.none,\n                          children: [\n                            NetworkImgLayer(\n                              src: videoItem.cover,\n                              width: maxWidth,\n                              height: maxHeight,\n                            ),\n                            if (badge != null)\n                              PBadge(\n                                text: badge,\n                                top: 6.0,\n                                right: 6.0,\n                                type: switch (badge) {\n                                  '充电专属' => PBadgeType.error,\n                                  _ => PBadgeType.primary,\n                                },\n                              ),\n                            if (progress != null && progress != 0) ...[\n                              PBadge(\n                                text: progress == -1\n                                    ? '已看完'\n                                    : '${DurationUtils.formatDuration(progress)}/${DurationUtils.formatDuration(videoItem.duration)}',\n                                right: 6,\n                                bottom: 8,\n                                type: PBadgeType.gray,\n                              ),\n                              Positioned(\n                                left: 0,\n                                bottom: 0,\n                                right: 0,\n                                child: VideoProgressIndicator(\n                                  color: colorScheme.primary,\n                                  backgroundColor:\n                                      colorScheme.secondaryContainer,\n                                  progress: progress == -1\n                                      ? 1\n                                      : progress / videoItem.duration,\n                                ),\n                              ),\n                            ] else if (videoItem.duration > 0)\n                              PBadge(\n                                text: DurationUtils.formatDuration(\n                                  videoItem.duration,\n                                ),\n                                right: 6.0,\n                                bottom: 6.0,\n                                type: PBadgeType.gray,\n                              ),\n                          ],\n                        );\n                      },\n                    ),\n                  ),\n                  const SizedBox(width: 10),\n                  content(context),\n                ],\n              ),\n            ),\n          ),\n          Positioned(\n            bottom: 0,\n            right: 12,\n            width: 29,\n            height: 29,\n            child: VideoPopupMenu(\n              iconSize: 17,\n              videoItem: videoItem,\n              onRemove: onRemove,\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget content(BuildContext context) {\n    final theme = Theme.of(context);\n    String pubdate = DateFormatUtils.dateFormat(videoItem.pubdate!);\n    if (pubdate != '') pubdate += '  ';\n    return Expanded(\n      child: Column(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          if (videoItem case final SearchVideoItemModel item) ...[\n            if (item.titleList?.isNotEmpty == true)\n              Expanded(\n                child: Text.rich(\n                  overflow: TextOverflow.ellipsis,\n                  maxLines: 2,\n                  TextSpan(\n                    children: item.titleList!\n                        .map(\n                          (e) => TextSpan(\n                            text: e.text,\n                            style: TextStyle(\n                              fontSize: theme.textTheme.bodyMedium!.fontSize,\n                              height: 1.42,\n                              letterSpacing: 0.3,\n                              color: e.isEm\n                                  ? theme.colorScheme.primary\n                                  : theme.colorScheme.onSurface,\n                            ),\n                          ),\n                        )\n                        .toList(),\n                  ),\n                ),\n              ),\n          ] else\n            Expanded(\n              child: Text(\n                videoItem.title,\n                textAlign: TextAlign.start,\n                style: TextStyle(\n                  fontSize: theme.textTheme.bodyMedium!.fontSize,\n                  height: 1.42,\n                  letterSpacing: 0.3,\n                ),\n                maxLines: 2,\n                overflow: TextOverflow.ellipsis,\n              ),\n            ),\n          Text(\n            \"$pubdate${videoItem.owner.name}\",\n            maxLines: 1,\n            style: TextStyle(\n              fontSize: 12,\n              height: 1,\n              color: theme.colorScheme.outline,\n              overflow: TextOverflow.clip,\n            ),\n          ),\n          const SizedBox(height: 3),\n          Row(\n            spacing: 8,\n            children: [\n              StatWidget(\n                type: StatType.play,\n                value: videoItem.stat.view,\n              ),\n              StatWidget(\n                type: StatType.danmaku,\n                value: videoItem.stat.danmu,\n              ),\n            ],\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/video_card/video_card_v.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/stat/stat.dart';\nimport 'package:PiliPlus/common/widgets/video_popup_menu.dart';\nimport 'package:PiliPlus/http/search.dart';\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models/common/stat_type.dart';\nimport 'package:PiliPlus/models/model_rec_video_item.dart';\nimport 'package:PiliPlus/utils/app_scheme.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/duration_utils.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:intl/intl.dart';\n\n// 视频卡片 - 垂直布局\nclass VideoCardV extends StatelessWidget {\n  final BaseRecVideoItemModel videoItem;\n  final VoidCallback? onRemove;\n\n  const VideoCardV({\n    super.key,\n    required this.videoItem,\n    this.onRemove,\n  });\n\n  Future<void> onPushDetail(String heroTag) async {\n    String? goto = videoItem.goto;\n    switch (goto) {\n      case 'bangumi':\n        PageUtils.viewPgc(epId: videoItem.param!);\n        break;\n      case 'av':\n        String bvid = videoItem.bvid ?? IdUtils.av2bv(videoItem.aid!);\n        int? cid =\n            videoItem.cid ??\n            await SearchHttp.ab2c(aid: videoItem.aid, bvid: bvid);\n        if (cid != null) {\n          PageUtils.toVideoPage(\n            aid: videoItem.aid,\n            bvid: bvid,\n            cid: cid,\n            cover: videoItem.cover,\n            title: videoItem.title,\n          );\n        }\n        break;\n      // 动态\n      case 'picture':\n        try {\n          PiliScheme.routePushFromUrl(videoItem.uri!);\n        } catch (err) {\n          SmartDialog.showToast(err.toString());\n        }\n        break;\n      default:\n        if (videoItem.uri?.isNotEmpty == true) {\n          PiliScheme.routePushFromUrl(videoItem.uri!);\n        }\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    void onLongPress() => imageSaveDialog(\n      title: videoItem.title,\n      cover: videoItem.cover,\n      bvid: videoItem.bvid,\n    );\n    return Stack(\n      clipBehavior: Clip.none,\n      children: [\n        Card(\n          clipBehavior: Clip.hardEdge,\n          child: InkWell(\n            onTap: () => onPushDetail(Utils.makeHeroTag(videoItem.aid)),\n            onLongPress: onLongPress,\n            onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n            child: Column(\n              crossAxisAlignment: CrossAxisAlignment.start,\n              children: [\n                AspectRatio(\n                  aspectRatio: StyleString.aspectRatio,\n                  child: LayoutBuilder(\n                    builder: (context, boxConstraints) {\n                      double maxWidth = boxConstraints.maxWidth;\n                      double maxHeight = boxConstraints.maxHeight;\n                      return Stack(\n                        clipBehavior: Clip.none,\n                        children: [\n                          NetworkImgLayer(\n                            src: videoItem.cover,\n                            width: maxWidth,\n                            height: maxHeight,\n                            type: .emote,\n                          ),\n                          if (videoItem.duration > 0)\n                            PBadge(\n                              bottom: 6,\n                              right: 7,\n                              size: PBadgeSize.small,\n                              type: PBadgeType.gray,\n                              text: DurationUtils.formatDuration(\n                                videoItem.duration,\n                              ),\n                            ),\n                        ],\n                      );\n                    },\n                  ),\n                ),\n                content(context),\n              ],\n            ),\n          ),\n        ),\n        if (videoItem.goto == 'av')\n          Positioned(\n            right: -5,\n            bottom: -2,\n            width: 29,\n            height: 29,\n            child: VideoPopupMenu(\n              iconSize: 17,\n              videoItem: videoItem,\n              onRemove: onRemove,\n            ),\n          ),\n      ],\n    );\n  }\n\n  Widget content(BuildContext context) {\n    final theme = Theme.of(context);\n    return Expanded(\n      child: Padding(\n        padding: const EdgeInsets.fromLTRB(6, 5, 6, 5),\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            Expanded(\n              child: Text(\n                \"${videoItem.title}\\n\",\n                maxLines: 2,\n                overflow: TextOverflow.ellipsis,\n                style: const TextStyle(\n                  height: 1.38,\n                ),\n              ),\n            ),\n            videoStat(context, theme),\n            Row(\n              spacing: 2,\n              children: [\n                if (videoItem.goto == 'bangumi')\n                  PBadge(\n                    text: videoItem.pgcBadge,\n                    isStack: false,\n                    size: PBadgeSize.small,\n                    type: PBadgeType.line_primary,\n                    fontSize: 9,\n                  ),\n                if (videoItem.rcmdReason != null)\n                  PBadge(\n                    text: videoItem.rcmdReason,\n                    isStack: false,\n                    size: PBadgeSize.small,\n                    type: PBadgeType.secondary,\n                  ),\n                if (videoItem.goto == 'picture')\n                  const PBadge(\n                    text: '动态',\n                    isStack: false,\n                    size: PBadgeSize.small,\n                    type: PBadgeType.line_primary,\n                    fontSize: 9,\n                  ),\n                if (videoItem.isFollowed)\n                  const PBadge(\n                    text: '已关注',\n                    isStack: false,\n                    size: PBadgeSize.small,\n                    type: PBadgeType.secondary,\n                  ),\n                Expanded(\n                  flex: 1,\n                  child: Text(\n                    videoItem.owner.name.toString(),\n                    maxLines: 1,\n                    overflow: TextOverflow.clip,\n                    semanticsLabel: 'UP：${videoItem.owner.name}',\n                    style: TextStyle(\n                      height: 1.5,\n                      fontSize: theme.textTheme.labelMedium!.fontSize,\n                      color: theme.colorScheme.outline,\n                    ),\n                  ),\n                ),\n                if (videoItem.goto == 'av') const SizedBox(width: 10),\n              ],\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  static final shortFormat = DateFormat('M-d');\n  static final longFormat = DateFormat('yy-M-d');\n\n  Widget videoStat(BuildContext context, ThemeData theme) {\n    return Row(\n      children: [\n        StatWidget(\n          type: StatType.play,\n          value: videoItem.stat.view,\n        ),\n        if (videoItem.goto != 'picture') ...[\n          const SizedBox(width: 4),\n          StatWidget(\n            type: StatType.danmaku,\n            value: videoItem.stat.danmu,\n          ),\n        ],\n        if (videoItem is RecVideoItemModel) ...[\n          const Spacer(),\n          Text.rich(\n            maxLines: 1,\n            TextSpan(\n              style: TextStyle(\n                fontSize: theme.textTheme.labelSmall!.fontSize,\n                color: theme.colorScheme.outline.withValues(alpha: 0.8),\n              ),\n              text: DateFormatUtils.dateFormat(\n                videoItem.pubdate,\n                short: shortFormat,\n                long: longFormat,\n              ),\n            ),\n          ),\n          const SizedBox(width: 2),\n        ],\n        // deprecated\n        //  else if (videoItem is RecVideoItemAppModel &&\n        //     videoItem.desc != null &&\n        //     videoItem.desc!.contains(' · ')) ...[\n        //   const Spacer(),\n        //   Text.rich(\n        //     maxLines: 1,\n        //     TextSpan(\n        //         style: TextStyle(\n        //           fontSize: theme.textTheme.labelSmall!.fontSize,\n        //           color: theme.colorScheme.outline.withValues(alpha: 0.8),\n        //         ),\n        //         text: Utils.shortenChineseDateString(\n        //             videoItem.desc!.split(' · ').last)),\n        //   ),\n        //   const SizedBox(width: 2),\n        // ]\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/video_popup_menu.dart",
    "content": "import 'package:PiliPlus/http/user.dart';\nimport 'package:PiliPlus/http/video.dart';\nimport 'package:PiliPlus/models/common/account_type.dart';\nimport 'package:PiliPlus/models/home/rcmd/result.dart';\nimport 'package:PiliPlus/models/model_video.dart';\nimport 'package:PiliPlus/models_new/space/space_archive/item.dart';\nimport 'package:PiliPlus/pages/mine/controller.dart';\nimport 'package:PiliPlus/pages/search/widgets/search_text.dart';\nimport 'package:PiliPlus/pages/video/ai_conclusion/view.dart';\nimport 'package:PiliPlus/pages/video/introduction/ugc/controller.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\n\nclass _VideoCustomAction {\n  final String title;\n  final Widget icon;\n  final VoidCallback onTap;\n  const _VideoCustomAction(this.title, this.icon, this.onTap);\n}\n\nclass VideoPopupMenu extends StatelessWidget {\n  final double? iconSize;\n  final double menuItemHeight;\n  final BaseSimpleVideoItemModel videoItem;\n  final VoidCallback? onRemove;\n\n  const VideoPopupMenu({\n    super.key,\n    required this.iconSize,\n    required this.videoItem,\n    this.onRemove,\n    this.menuItemHeight = 45,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    return PopupMenuButton(\n      padding: EdgeInsets.zero,\n      icon: Icon(\n        Icons.more_vert_outlined,\n        color: Theme.of(context).colorScheme.outline,\n        size: iconSize,\n      ),\n      position: PopupMenuPosition.under,\n      itemBuilder: (context) =>\n          [\n                if (videoItem.bvid?.isNotEmpty == true) ...[\n                  _VideoCustomAction(\n                    videoItem.bvid!,\n                    const Stack(\n                      clipBehavior: Clip.none,\n                      children: [\n                        Icon(MdiIcons.identifier, size: 16),\n                        Icon(MdiIcons.circleOutline, size: 16),\n                      ],\n                    ),\n                    () => Utils.copyText(videoItem.bvid!),\n                  ),\n                  _VideoCustomAction(\n                    '稍后再看',\n                    const Icon(MdiIcons.clockTimeEightOutline, size: 16),\n                    () => UserHttp.toViewLater(bvid: videoItem.bvid),\n                  ),\n                  if (videoItem.cid != null && Pref.enableAi)\n                    _VideoCustomAction(\n                      'AI总结',\n                      const Stack(\n                        alignment: Alignment.center,\n                        clipBehavior: Clip.none,\n                        children: [\n                          Icon(Icons.circle_outlined, size: 16),\n                          ExcludeSemantics(\n                            child: Text(\n                              'AI',\n                              style: TextStyle(\n                                fontSize: 10,\n                                height: 1,\n                                fontWeight: FontWeight.w700,\n                              ),\n                              strutStyle: StrutStyle(\n                                fontSize: 10,\n                                height: 1,\n                                leading: 0,\n                                fontWeight: FontWeight.w700,\n                              ),\n                              textScaler: TextScaler.noScaling,\n                            ),\n                          ),\n                        ],\n                      ),\n                      () async {\n                        final res = await UgcIntroController.getAiConclusion(\n                          videoItem.bvid!,\n                          videoItem.cid!,\n                          videoItem.owner.mid,\n                        );\n                        if (res != null && context.mounted) {\n                          showDialog(\n                            context: context,\n                            builder: (context) => Dialog(\n                              child: Padding(\n                                padding: const .symmetric(vertical: 14),\n                                child: AiConclusionPanel.buildContent(\n                                  context,\n                                  Theme.of(context),\n                                  res,\n                                  tap: false,\n                                ),\n                              ),\n                            ),\n                          );\n                        }\n                      },\n                    ),\n                ],\n                if (videoItem is! SpaceArchiveItem) ...[\n                  _VideoCustomAction(\n                    '访问：${videoItem.owner.name}',\n                    const Icon(MdiIcons.accountCircleOutline, size: 16),\n                    () => Get.toNamed('/member?mid=${videoItem.owner.mid}'),\n                  ),\n                  _VideoCustomAction(\n                    '不感兴趣',\n                    const Icon(MdiIcons.thumbDownOutline, size: 16),\n                    () {\n                      String? accessKey = Accounts.get(\n                        AccountType.recommend,\n                      ).accessKey;\n                      if (accessKey == null || accessKey == \"\") {\n                        SmartDialog.showToast(\"请退出账号后重新登录\");\n                        return;\n                      }\n                      if (videoItem case final RecVideoItemAppModel item) {\n                        ThreePoint? tp = item.threePoint;\n                        if (tp == null) {\n                          SmartDialog.showToast(\"未能获取threePoint\");\n                          return;\n                        }\n                        if (tp.dislikeReasons == null && tp.feedbacks == null) {\n                          SmartDialog.showToast(\n                            \"未能获取dislikeReasons或feedbacks\",\n                          );\n                          return;\n                        }\n                        Widget actionButton(Reason? r, Reason? f) {\n                          return SearchText(\n                            text: r?.name ?? f?.name ?? '未知',\n                            onTap: (_) async {\n                              Get.back();\n                              SmartDialog.showLoading(msg: '正在提交');\n                              final res = await VideoHttp.feedDislike(\n                                reasonId: r?.id,\n                                feedbackId: f?.id,\n                                id: item.param!,\n                                goto: item.goto!,\n                              );\n                              SmartDialog.dismiss();\n                              if (res.isSuccess) {\n                                SmartDialog.showToast(\n                                  r?.toast ?? f!.toast!,\n                                );\n                                onRemove?.call();\n                              } else {\n                                res.toast();\n                              }\n                            },\n                          );\n                        }\n\n                        showDialog(\n                          context: context,\n                          builder: (context) {\n                            return AlertDialog(\n                              content: SingleChildScrollView(\n                                child: Column(\n                                  crossAxisAlignment: .start,\n                                  children: [\n                                    if (tp.dislikeReasons != null) ...[\n                                      const Text('我不想看'),\n                                      const SizedBox(height: 5),\n                                      Wrap(\n                                        spacing: 8.0,\n                                        runSpacing: 8.0,\n                                        children: tp.dislikeReasons!.map((\n                                          item,\n                                        ) {\n                                          return actionButton(item, null);\n                                        }).toList(),\n                                      ),\n                                    ],\n                                    if (tp.feedbacks != null) ...[\n                                      const SizedBox(height: 5),\n                                      const Text('反馈'),\n                                      const SizedBox(height: 5),\n                                      Wrap(\n                                        spacing: 8.0,\n                                        runSpacing: 8.0,\n                                        children: tp.feedbacks!.map((item) {\n                                          return actionButton(null, item);\n                                        }).toList(),\n                                      ),\n                                    ],\n                                    const Divider(),\n                                    Center(\n                                      child: FilledButton.tonal(\n                                        onPressed: () async {\n                                          SmartDialog.showLoading(\n                                            msg: '正在提交',\n                                          );\n                                          final res =\n                                              await VideoHttp.feedDislikeCancel(\n                                                id: item.param!,\n                                                goto: item.goto!,\n                                              );\n                                          SmartDialog.dismiss();\n                                          SmartDialog.showToast(\n                                            res.isSuccess\n                                                ? \"成功\"\n                                                : res.toString(),\n                                          );\n                                          Get.back();\n                                        },\n                                        style: FilledButton.styleFrom(\n                                          visualDensity: VisualDensity.compact,\n                                        ),\n                                        child: const Text(\"撤销\"),\n                                      ),\n                                    ),\n                                  ],\n                                ),\n                              ),\n                            );\n                          },\n                        );\n                      } else {\n                        showDialog(\n                          context: context,\n                          builder: (context) => AlertDialog(\n                            content: SingleChildScrollView(\n                              child: Column(\n                                children: [\n                                  const SizedBox(height: 5),\n                                  const Text(\"web端暂不支持精细选择\"),\n                                  const SizedBox(height: 5),\n                                  Wrap(\n                                    spacing: 5.0,\n                                    runSpacing: 2.0,\n                                    children: [\n                                      FilledButton.tonal(\n                                        onPressed: () async {\n                                          Get.back();\n                                          SmartDialog.showLoading(\n                                            msg: '正在提交',\n                                          );\n                                          final res =\n                                              await VideoHttp.dislikeVideo(\n                                                bvid: videoItem.bvid!,\n                                                type: true,\n                                              );\n                                          SmartDialog.dismiss();\n                                          if (res.isSuccess) {\n                                            SmartDialog.showToast('点踩成功');\n                                            onRemove?.call();\n                                          } else {\n                                            res.toast();\n                                          }\n                                        },\n                                        style: FilledButton.styleFrom(\n                                          visualDensity: VisualDensity.compact,\n                                        ),\n                                        child: const Text(\"点踩\"),\n                                      ),\n                                      FilledButton.tonal(\n                                        onPressed: () async {\n                                          Get.back();\n                                          SmartDialog.showLoading(\n                                            msg: '正在提交',\n                                          );\n                                          final res =\n                                              await VideoHttp.dislikeVideo(\n                                                bvid: videoItem.bvid!,\n                                                type: false,\n                                              );\n                                          SmartDialog.dismiss();\n                                          SmartDialog.showToast(\n                                            res.isSuccess\n                                                ? '取消踩'\n                                                : res.toString(),\n                                          );\n                                        },\n                                        style: FilledButton.styleFrom(\n                                          visualDensity: VisualDensity.compact,\n                                        ),\n                                        child: const Text(\"撤销\"),\n                                      ),\n                                    ],\n                                  ),\n                                ],\n                              ),\n                            ),\n                          ),\n                        );\n                      }\n                    },\n                  ),\n                  _VideoCustomAction(\n                    '拉黑：${videoItem.owner.name}',\n                    const Icon(MdiIcons.cancel, size: 16),\n                    () => showDialog(\n                      context: context,\n                      builder: (context) {\n                        return AlertDialog(\n                          title: const Text('提示'),\n                          content: Text(\n                            '确定拉黑:${videoItem.owner.name}(${videoItem.owner.mid})?'\n                            '\\n\\n注：被拉黑的Up可以在隐私设置-黑名单管理中解除',\n                          ),\n                          actions: [\n                            TextButton(\n                              onPressed: Get.back,\n                              child: Text(\n                                '点错了',\n                                style: TextStyle(\n                                  color: Theme.of(\n                                    context,\n                                  ).colorScheme.outline,\n                                ),\n                              ),\n                            ),\n                            TextButton(\n                              onPressed: () async {\n                                Get.back();\n                                final res = await VideoHttp.relationMod(\n                                  mid: videoItem.owner.mid!,\n                                  act: 5,\n                                  reSrc: 11,\n                                );\n                                if (res.isSuccess) {\n                                  onRemove?.call();\n                                } else {\n                                  res.toast();\n                                }\n                              },\n                              child: const Text('确认'),\n                            ),\n                          ],\n                        );\n                      },\n                    ),\n                  ),\n                ],\n                _VideoCustomAction(\n                  \"${MineController.anonymity.value ? '退出' : '进入'}无痕模式\",\n                  MineController.anonymity.value\n                      ? const Icon(MdiIcons.incognitoOff, size: 16)\n                      : const Icon(MdiIcons.incognito, size: 16),\n                  MineController.onChangeAnonymity,\n                ),\n              ]\n              .map(\n                (e) => PopupMenuItem(\n                  height: menuItemHeight,\n                  onTap: e.onTap,\n                  child: Row(\n                    children: [\n                      e.icon,\n                      const SizedBox(width: 6),\n                      Text(e.title, style: const TextStyle(fontSize: 13)),\n                    ],\n                  ),\n                ),\n              )\n              .toList(),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/view_safe_area.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass ViewSafeArea extends StatelessWidget {\n  const ViewSafeArea({\n    super.key,\n    this.top = false,\n    this.left = true,\n    this.right = true,\n    required this.child,\n  });\n\n  final bool top;\n  final bool left;\n  final bool right;\n  final Widget child;\n\n  @override\n  Widget build(BuildContext context) {\n    EdgeInsets padding = MediaQuery.viewPaddingOf(context);\n    return Padding(\n      padding: EdgeInsets.only(\n        top: top ? padding.top : 0.0,\n        left: left ? padding.left : 0.0,\n        right: right ? padding.right : 0.0,\n      ),\n      child: child,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/widgets/view_sliver_safe_area.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass ViewSliverSafeArea extends StatelessWidget {\n  const ViewSliverSafeArea({\n    super.key,\n    required this.sliver,\n  });\n\n  final Widget sliver;\n\n  @override\n  Widget build(BuildContext context) {\n    EdgeInsets padding = MediaQuery.viewPaddingOf(context);\n    return SliverPadding(\n      padding: EdgeInsets.only(\n        left: padding.left,\n        right: padding.right,\n        bottom: padding.bottom + 100,\n      ),\n      sliver: sliver,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/grpc/audio.dart",
    "content": "import 'package:PiliPlus/grpc/bilibili/app/archive/middleware/v1.pb.dart';\nimport 'package:PiliPlus/grpc/bilibili/app/listener/v1.pb.dart';\nimport 'package:PiliPlus/grpc/bilibili/pagination.pb.dart';\nimport 'package:PiliPlus/grpc/grpc_req.dart';\nimport 'package:PiliPlus/grpc/url.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:fixnum/fixnum.dart';\n\nabstract final class AudioGrpc {\n  static Future<LoadingState<PlayURLResp>> audioPlayUrl({\n    required Int64 oid,\n    required List<Int64> subId,\n    required int itemType,\n    int qn = 80,\n    int fnval = 4048,\n  }) {\n    return GrpcReq.request(\n      GrpcUrl.audioPlayUrl,\n      PlayURLReq(\n        item: PlayItem(\n          oid: oid,\n          subId: subId,\n          itemType: itemType,\n        ),\n        playerArgs: PlayerArgs(\n          qn: Int64(qn),\n          fnval: Int64(fnval),\n          forceHost: Int64(2),\n          voiceBalance: Int64(1),\n        ),\n      ),\n      PlayURLResp.fromBuffer,\n    );\n  }\n\n  static Future<LoadingState<PlaylistResp>> audioPlayList({\n    PlaylistSource? from,\n    required Int64 id,\n    Int64? oid,\n    List<Int64>? subId,\n    int? itemType,\n    PageOption? pageOpt,\n    Int64? extraId,\n    String? next,\n    int qn = 80,\n    int fnval = 4048,\n    ListOrder order = ListOrder.ORDER_NORMAL,\n  }) {\n    return GrpcReq.request(\n      GrpcUrl.audioPlayList,\n      PlaylistReq(\n        from: from,\n        id: id,\n        anchor: PlayItem(\n          oid: oid,\n          subId: subId,\n          itemType: itemType,\n        ),\n        pageOpt: pageOpt,\n        playerArgs: PlayerArgs(\n          qn: Int64(qn),\n          fnval: Int64(fnval),\n          forceHost: Int64(2),\n          voiceBalance: Int64(1),\n        ),\n        extraId: extraId,\n        sortOpt: SortOption(order: order),\n        pagination: Pagination(pageSize: 20, next: next),\n      ),\n      PlaylistResp.fromBuffer,\n    );\n  }\n\n  static Future<LoadingState<ThumbUpResp>> audioThumbUp({\n    required Int64 oid,\n    required List<Int64> subId,\n    required int itemType,\n    required ThumbUpReq_ThumbType type,\n  }) {\n    return GrpcReq.request(\n      GrpcUrl.audioThumbUp,\n      ThumbUpReq(\n        item: PlayItem(\n          oid: oid,\n          itemType: itemType,\n          subId: subId,\n        ),\n        action: type,\n      ),\n      ThumbUpResp.fromBuffer,\n    );\n  }\n\n  static Future<LoadingState<TripleLikeResp>> audioTripleLike({\n    required Int64 oid,\n    required List<Int64> subId,\n    required int itemType,\n  }) {\n    return GrpcReq.request(\n      GrpcUrl.audioTripleLike,\n      TripleLikeReq(\n        item: PlayItem(\n          oid: oid,\n          subId: subId,\n          itemType: itemType,\n        ),\n      ),\n      TripleLikeResp.fromBuffer,\n    );\n  }\n\n  static Future<LoadingState<CoinAddResp>> audioCoinAdd({\n    required Int64 oid,\n    required List<Int64> subId,\n    required int itemType,\n    required int num,\n    bool thumbUp = false,\n  }) {\n    return GrpcReq.request(\n      GrpcUrl.audioCoinAdd,\n      CoinAddReq(\n        item: PlayItem(\n          oid: oid,\n          subId: subId,\n          itemType: itemType,\n        ),\n        num: num,\n        thumbUp: thumbUp,\n      ),\n      CoinAddResp.fromBuffer,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/grpc/bilibili/account/service/v1.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/account/service/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:fixnum/fixnum.dart' as $fixnum;\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nimport 'v1.pbenum.dart';\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nexport 'v1.pbenum.dart';\n\nclass Color extends $pb.GeneratedMessage {\n  factory Color({\n    $core.String? colorDay,\n    $core.String? colorNight,\n  }) {\n    final result = create();\n    if (colorDay != null) result.colorDay = colorDay;\n    if (colorNight != null) result.colorNight = colorNight;\n    return result;\n  }\n\n  Color._();\n\n  factory Color.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Color.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Color',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.account.service.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'colorDay')\n    ..aOS(2, _omitFieldNames ? '' : 'colorNight')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Color clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Color copyWith(void Function(Color) updates) =>\n      super.copyWith((message) => updates(message as Color)) as Color;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Color create() => Color._();\n  @$core.override\n  Color createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Color getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Color>(create);\n  static Color? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get colorDay => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set colorDay($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasColorDay() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearColorDay() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get colorNight => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set colorNight($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasColorNight() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearColorNight() => $_clearField(2);\n}\n\nclass ColorsInfo extends $pb.GeneratedMessage {\n  factory ColorsInfo({\n    $core.Iterable<$fixnum.Int64>? colorIds,\n    $core.Iterable<Color>? color,\n  }) {\n    final result = create();\n    if (colorIds != null) result.colorIds.addAll(colorIds);\n    if (color != null) result.color.addAll(color);\n    return result;\n  }\n\n  ColorsInfo._();\n\n  factory ColorsInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ColorsInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ColorsInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.account.service.v1'),\n      createEmptyInstance: create)\n    ..p<$fixnum.Int64>(1, _omitFieldNames ? '' : 'colorIds', $pb.PbFieldType.K6)\n    ..pPM<Color>(2, _omitFieldNames ? '' : 'color', subBuilder: Color.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ColorsInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ColorsInfo copyWith(void Function(ColorsInfo) updates) =>\n      super.copyWith((message) => updates(message as ColorsInfo)) as ColorsInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ColorsInfo create() => ColorsInfo._();\n  @$core.override\n  ColorsInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ColorsInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ColorsInfo>(create);\n  static ColorsInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<$fixnum.Int64> get colorIds => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<Color> get color => $_getList(1);\n}\n\nclass NameRender extends $pb.GeneratedMessage {\n  factory NameRender({\n    RenderSchemeEnum? renderScheme,\n    ColorsInfo? colorsInfo,\n  }) {\n    final result = create();\n    if (renderScheme != null) result.renderScheme = renderScheme;\n    if (colorsInfo != null) result.colorsInfo = colorsInfo;\n    return result;\n  }\n\n  NameRender._();\n\n  factory NameRender.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory NameRender.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'NameRender',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.account.service.v1'),\n      createEmptyInstance: create)\n    ..aE<RenderSchemeEnum>(1, _omitFieldNames ? '' : 'renderScheme',\n        enumValues: RenderSchemeEnum.values)\n    ..aOM<ColorsInfo>(2, _omitFieldNames ? '' : 'colorsInfo',\n        subBuilder: ColorsInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NameRender clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NameRender copyWith(void Function(NameRender) updates) =>\n      super.copyWith((message) => updates(message as NameRender)) as NameRender;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static NameRender create() => NameRender._();\n  @$core.override\n  NameRender createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static NameRender getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<NameRender>(create);\n  static NameRender? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  RenderSchemeEnum get renderScheme => $_getN(0);\n  @$pb.TagNumber(1)\n  set renderScheme(RenderSchemeEnum value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasRenderScheme() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRenderScheme() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  ColorsInfo get colorsInfo => $_getN(1);\n  @$pb.TagNumber(2)\n  set colorsInfo(ColorsInfo value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasColorsInfo() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearColorsInfo() => $_clearField(2);\n  @$pb.TagNumber(2)\n  ColorsInfo ensureColorsInfo() => $_ensure(1);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/account/service/v1.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/account/service/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nclass RenderSchemeEnum extends $pb.ProtobufEnum {\n  static const RenderSchemeEnum Default =\n      RenderSchemeEnum._(0, _omitEnumNames ? '' : 'Default');\n  static const RenderSchemeEnum Colorful =\n      RenderSchemeEnum._(1, _omitEnumNames ? '' : 'Colorful');\n\n  static const $core.List<RenderSchemeEnum> values = <RenderSchemeEnum>[\n    Default,\n    Colorful,\n  ];\n\n  static final $core.List<RenderSchemeEnum?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static RenderSchemeEnum? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const RenderSchemeEnum._(super.value, super.name);\n}\n\nconst $core.bool _omitEnumNames =\n    $core.bool.fromEnvironment('protobuf.omit_enum_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/account/service/v1.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/account/service/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use renderSchemeEnumDescriptor instead')\nconst RenderSchemeEnum$json = {\n  '1': 'RenderSchemeEnum',\n  '2': [\n    {'1': 'Default', '2': 0},\n    {'1': 'Colorful', '2': 1},\n  ],\n};\n\n/// Descriptor for `RenderSchemeEnum`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List renderSchemeEnumDescriptor = $convert.base64Decode(\n    'ChBSZW5kZXJTY2hlbWVFbnVtEgsKB0RlZmF1bHQQABIMCghDb2xvcmZ1bBAB');\n\n@$core.Deprecated('Use colorDescriptor instead')\nconst Color$json = {\n  '1': 'Color',\n  '2': [\n    {'1': 'color_day', '3': 1, '4': 1, '5': 9, '10': 'colorDay'},\n    {'1': 'color_night', '3': 2, '4': 1, '5': 9, '10': 'colorNight'},\n  ],\n};\n\n/// Descriptor for `Color`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List colorDescriptor = $convert.base64Decode(\n    'CgVDb2xvchIbCgljb2xvcl9kYXkYASABKAlSCGNvbG9yRGF5Eh8KC2NvbG9yX25pZ2h0GAIgAS'\n    'gJUgpjb2xvck5pZ2h0');\n\n@$core.Deprecated('Use colorsInfoDescriptor instead')\nconst ColorsInfo$json = {\n  '1': 'ColorsInfo',\n  '2': [\n    {'1': 'color_ids', '3': 1, '4': 3, '5': 3, '10': 'colorIds'},\n    {\n      '1': 'color',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.account.service.v1.Color',\n      '10': 'color'\n    },\n  ],\n};\n\n/// Descriptor for `ColorsInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List colorsInfoDescriptor = $convert.base64Decode(\n    'CgpDb2xvcnNJbmZvEhsKCWNvbG9yX2lkcxgBIAMoA1IIY29sb3JJZHMSOAoFY29sb3IYAiADKA'\n    'syIi5iaWxpYmlsaS5hY2NvdW50LnNlcnZpY2UudjEuQ29sb3JSBWNvbG9y');\n\n@$core.Deprecated('Use nameRenderDescriptor instead')\nconst NameRender$json = {\n  '1': 'NameRender',\n  '2': [\n    {\n      '1': 'render_scheme',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.account.service.v1.RenderSchemeEnum',\n      '10': 'renderScheme'\n    },\n    {\n      '1': 'colors_info',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.account.service.v1.ColorsInfo',\n      '10': 'colorsInfo'\n    },\n  ],\n};\n\n/// Descriptor for `NameRender`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List nameRenderDescriptor = $convert.base64Decode(\n    'CgpOYW1lUmVuZGVyElIKDXJlbmRlcl9zY2hlbWUYASABKA4yLS5iaWxpYmlsaS5hY2NvdW50Ln'\n    'NlcnZpY2UudjEuUmVuZGVyU2NoZW1lRW51bVIMcmVuZGVyU2NoZW1lEkgKC2NvbG9yc19pbmZv'\n    'GAIgASgLMicuYmlsaWJpbGkuYWNjb3VudC5zZXJ2aWNlLnYxLkNvbG9yc0luZm9SCmNvbG9yc0'\n    'luZm8=');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/archive/middleware/v1.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/archive/middleware/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:fixnum/fixnum.dart' as $fixnum;\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nimport 'v1.pbenum.dart';\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nexport 'v1.pbenum.dart';\n\nclass PlayerArgs extends $pb.GeneratedMessage {\n  factory PlayerArgs({\n    $fixnum.Int64? qn,\n    $fixnum.Int64? fnver,\n    $fixnum.Int64? fnval,\n    $fixnum.Int64? forceHost,\n    $fixnum.Int64? voiceBalance,\n    QnPolicy? qnPolicy,\n  }) {\n    final result = create();\n    if (qn != null) result.qn = qn;\n    if (fnver != null) result.fnver = fnver;\n    if (fnval != null) result.fnval = fnval;\n    if (forceHost != null) result.forceHost = forceHost;\n    if (voiceBalance != null) result.voiceBalance = voiceBalance;\n    if (qnPolicy != null) result.qnPolicy = qnPolicy;\n    return result;\n  }\n\n  PlayerArgs._();\n\n  factory PlayerArgs.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayerArgs.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayerArgs',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.archive.middleware.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'qn')\n    ..aInt64(2, _omitFieldNames ? '' : 'fnver')\n    ..aInt64(3, _omitFieldNames ? '' : 'fnval')\n    ..aInt64(4, _omitFieldNames ? '' : 'forceHost')\n    ..aInt64(5, _omitFieldNames ? '' : 'voiceBalance')\n    ..aE<QnPolicy>(6, _omitFieldNames ? '' : 'qnPolicy',\n        enumValues: QnPolicy.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerArgs clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerArgs copyWith(void Function(PlayerArgs) updates) =>\n      super.copyWith((message) => updates(message as PlayerArgs)) as PlayerArgs;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayerArgs create() => PlayerArgs._();\n  @$core.override\n  PlayerArgs createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayerArgs getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayerArgs>(create);\n  static PlayerArgs? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get qn => $_getI64(0);\n  @$pb.TagNumber(1)\n  set qn($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasQn() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearQn() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get fnver => $_getI64(1);\n  @$pb.TagNumber(2)\n  set fnver($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFnver() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFnver() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get fnval => $_getI64(2);\n  @$pb.TagNumber(3)\n  set fnval($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFnval() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFnval() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get forceHost => $_getI64(3);\n  @$pb.TagNumber(4)\n  set forceHost($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasForceHost() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearForceHost() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get voiceBalance => $_getI64(4);\n  @$pb.TagNumber(5)\n  set voiceBalance($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasVoiceBalance() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearVoiceBalance() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  QnPolicy get qnPolicy => $_getN(5);\n  @$pb.TagNumber(6)\n  set qnPolicy(QnPolicy value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasQnPolicy() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearQnPolicy() => $_clearField(6);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/archive/middleware/v1.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/archive/middleware/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nclass QnPolicy extends $pb.ProtobufEnum {\n  static const QnPolicy QN_POLICY_DEFAULT =\n      QnPolicy._(0, _omitEnumNames ? '' : 'QN_POLICY_DEFAULT');\n  static const QnPolicy QN_POLICY_AUTO_QN_ENABLE =\n      QnPolicy._(1, _omitEnumNames ? '' : 'QN_POLICY_AUTO_QN_ENABLE');\n\n  static const $core.List<QnPolicy> values = <QnPolicy>[\n    QN_POLICY_DEFAULT,\n    QN_POLICY_AUTO_QN_ENABLE,\n  ];\n\n  static final $core.List<QnPolicy?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static QnPolicy? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const QnPolicy._(super.value, super.name);\n}\n\nconst $core.bool _omitEnumNames =\n    $core.bool.fromEnvironment('protobuf.omit_enum_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/archive/middleware/v1.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/archive/middleware/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use qnPolicyDescriptor instead')\nconst QnPolicy$json = {\n  '1': 'QnPolicy',\n  '2': [\n    {'1': 'QN_POLICY_DEFAULT', '2': 0},\n    {'1': 'QN_POLICY_AUTO_QN_ENABLE', '2': 1},\n  ],\n};\n\n/// Descriptor for `QnPolicy`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List qnPolicyDescriptor = $convert.base64Decode(\n    'CghRblBvbGljeRIVChFRTl9QT0xJQ1lfREVGQVVMVBAAEhwKGFFOX1BPTElDWV9BVVRPX1FOX0'\n    'VOQUJMRRAB');\n\n@$core.Deprecated('Use playerArgsDescriptor instead')\nconst PlayerArgs$json = {\n  '1': 'PlayerArgs',\n  '2': [\n    {'1': 'qn', '3': 1, '4': 1, '5': 3, '10': 'qn'},\n    {'1': 'fnver', '3': 2, '4': 1, '5': 3, '10': 'fnver'},\n    {'1': 'fnval', '3': 3, '4': 1, '5': 3, '10': 'fnval'},\n    {'1': 'force_host', '3': 4, '4': 1, '5': 3, '10': 'forceHost'},\n    {'1': 'voice_balance', '3': 5, '4': 1, '5': 3, '10': 'voiceBalance'},\n    {\n      '1': 'qn_policy',\n      '3': 6,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.archive.middleware.v1.QnPolicy',\n      '10': 'qnPolicy'\n    },\n  ],\n};\n\n/// Descriptor for `PlayerArgs`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playerArgsDescriptor = $convert.base64Decode(\n    'CgpQbGF5ZXJBcmdzEg4KAnFuGAEgASgDUgJxbhIUCgVmbnZlchgCIAEoA1IFZm52ZXISFAoFZm'\n    '52YWwYAyABKANSBWZudmFsEh0KCmZvcmNlX2hvc3QYBCABKANSCWZvcmNlSG9zdBIjCg12b2lj'\n    'ZV9iYWxhbmNlGAUgASgDUgx2b2ljZUJhbGFuY2USSQoJcW5fcG9saWN5GAYgASgOMiwuYmlsaW'\n    'JpbGkuYXBwLmFyY2hpdmUubWlkZGxld2FyZS52MS5RblBvbGljeVIIcW5Qb2xpY3k=');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/archive/v1.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/archive/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:fixnum/fixnum.dart' as $fixnum;\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nclass Arc extends $pb.GeneratedMessage {\n  factory Arc({\n    $fixnum.Int64? aid,\n    $fixnum.Int64? videos,\n    $core.int? typeId,\n    $core.String? typeName,\n    $core.int? copyright,\n    $core.String? pic,\n    $core.String? title,\n    $fixnum.Int64? pubdate,\n    $fixnum.Int64? ctime,\n    $core.String? desc,\n    $core.int? state,\n    $core.int? access,\n    $core.int? attribute,\n    $core.String? tag,\n    $core.Iterable<$core.String>? tags,\n    $fixnum.Int64? duration,\n    $fixnum.Int64? missionId,\n    $fixnum.Int64? orderId,\n    $core.String? redirectUrl,\n    $fixnum.Int64? forward,\n    Rights? rights,\n    Author? author,\n    Stat? stat,\n    $core.String? reportResult,\n    $core.String? dynamic,\n    $fixnum.Int64? firstCid,\n    Dimension? dimension,\n    $core.Iterable<StaffInfo>? staffInfo,\n    $fixnum.Int64? seasonId,\n    $fixnum.Int64? attributeV2,\n    SeasonTheme? seasonTheme,\n    $core.String? shortLinkV2,\n    $core.int? upFromV2,\n    $core.String? firstFrame,\n  }) {\n    final result = create();\n    if (aid != null) result.aid = aid;\n    if (videos != null) result.videos = videos;\n    if (typeId != null) result.typeId = typeId;\n    if (typeName != null) result.typeName = typeName;\n    if (copyright != null) result.copyright = copyright;\n    if (pic != null) result.pic = pic;\n    if (title != null) result.title = title;\n    if (pubdate != null) result.pubdate = pubdate;\n    if (ctime != null) result.ctime = ctime;\n    if (desc != null) result.desc = desc;\n    if (state != null) result.state = state;\n    if (access != null) result.access = access;\n    if (attribute != null) result.attribute = attribute;\n    if (tag != null) result.tag = tag;\n    if (tags != null) result.tags.addAll(tags);\n    if (duration != null) result.duration = duration;\n    if (missionId != null) result.missionId = missionId;\n    if (orderId != null) result.orderId = orderId;\n    if (redirectUrl != null) result.redirectUrl = redirectUrl;\n    if (forward != null) result.forward = forward;\n    if (rights != null) result.rights = rights;\n    if (author != null) result.author = author;\n    if (stat != null) result.stat = stat;\n    if (reportResult != null) result.reportResult = reportResult;\n    if (dynamic != null) result.dynamic = dynamic;\n    if (firstCid != null) result.firstCid = firstCid;\n    if (dimension != null) result.dimension = dimension;\n    if (staffInfo != null) result.staffInfo.addAll(staffInfo);\n    if (seasonId != null) result.seasonId = seasonId;\n    if (attributeV2 != null) result.attributeV2 = attributeV2;\n    if (seasonTheme != null) result.seasonTheme = seasonTheme;\n    if (shortLinkV2 != null) result.shortLinkV2 = shortLinkV2;\n    if (upFromV2 != null) result.upFromV2 = upFromV2;\n    if (firstFrame != null) result.firstFrame = firstFrame;\n    return result;\n  }\n\n  Arc._();\n\n  factory Arc.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Arc.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Arc',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.archive.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'aid')\n    ..aInt64(2, _omitFieldNames ? '' : 'videos')\n    ..aI(3, _omitFieldNames ? '' : 'typeId')\n    ..aOS(4, _omitFieldNames ? '' : 'typeName')\n    ..aI(5, _omitFieldNames ? '' : 'copyright')\n    ..aOS(6, _omitFieldNames ? '' : 'pic')\n    ..aOS(7, _omitFieldNames ? '' : 'title')\n    ..aInt64(8, _omitFieldNames ? '' : 'pubdate')\n    ..aInt64(9, _omitFieldNames ? '' : 'ctime')\n    ..aOS(10, _omitFieldNames ? '' : 'desc')\n    ..aI(11, _omitFieldNames ? '' : 'state')\n    ..aI(12, _omitFieldNames ? '' : 'access')\n    ..aI(13, _omitFieldNames ? '' : 'attribute')\n    ..aOS(14, _omitFieldNames ? '' : 'tag')\n    ..pPS(15, _omitFieldNames ? '' : 'tags')\n    ..aInt64(16, _omitFieldNames ? '' : 'duration')\n    ..aInt64(17, _omitFieldNames ? '' : 'missionId')\n    ..aInt64(18, _omitFieldNames ? '' : 'orderId')\n    ..aOS(19, _omitFieldNames ? '' : 'redirectUrl')\n    ..aInt64(20, _omitFieldNames ? '' : 'forward')\n    ..aOM<Rights>(21, _omitFieldNames ? '' : 'rights',\n        subBuilder: Rights.create)\n    ..aOM<Author>(22, _omitFieldNames ? '' : 'author',\n        subBuilder: Author.create)\n    ..aOM<Stat>(23, _omitFieldNames ? '' : 'stat', subBuilder: Stat.create)\n    ..aOS(24, _omitFieldNames ? '' : 'reportResult')\n    ..aOS(25, _omitFieldNames ? '' : 'dynamic')\n    ..aInt64(26, _omitFieldNames ? '' : 'firstCid')\n    ..aOM<Dimension>(27, _omitFieldNames ? '' : 'dimension',\n        subBuilder: Dimension.create)\n    ..pPM<StaffInfo>(28, _omitFieldNames ? '' : 'staffInfo',\n        subBuilder: StaffInfo.create)\n    ..aInt64(29, _omitFieldNames ? '' : 'seasonId')\n    ..aInt64(30, _omitFieldNames ? '' : 'attributeV2')\n    ..aOM<SeasonTheme>(31, _omitFieldNames ? '' : 'seasonTheme',\n        subBuilder: SeasonTheme.create)\n    ..aOS(40, _omitFieldNames ? '' : 'shortLinkV2')\n    ..aI(41, _omitFieldNames ? '' : 'upFromV2')\n    ..aOS(42, _omitFieldNames ? '' : 'firstFrame')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Arc clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Arc copyWith(void Function(Arc) updates) =>\n      super.copyWith((message) => updates(message as Arc)) as Arc;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Arc create() => Arc._();\n  @$core.override\n  Arc createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Arc getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Arc>(create);\n  static Arc? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get aid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set aid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAid() => $_clearField(1);\n\n  /// 分 P 数\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get videos => $_getI64(1);\n  @$pb.TagNumber(2)\n  set videos($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasVideos() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearVideos() => $_clearField(2);\n\n  /// 分区 ID\n  @$pb.TagNumber(3)\n  $core.int get typeId => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set typeId($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTypeId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTypeId() => $_clearField(3);\n\n  /// 分区名称\n  @$pb.TagNumber(4)\n  $core.String get typeName => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set typeName($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTypeName() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTypeName() => $_clearField(4);\n\n  /// 是否转载\n  ///\n  /// - 0: 历史上可能遗留的脏数据\n  /// - 1: 原创\n  /// - 2: 转载\n  @$pb.TagNumber(5)\n  $core.int get copyright => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set copyright($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCopyright() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCopyright() => $_clearField(5);\n\n  /// 封面地址\n  @$pb.TagNumber(6)\n  $core.String get pic => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set pic($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasPic() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearPic() => $_clearField(6);\n\n  /// 标题\n  @$pb.TagNumber(7)\n  $core.String get title => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set title($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasTitle() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearTitle() => $_clearField(7);\n\n  /// 发布时间戳\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get pubdate => $_getI64(7);\n  @$pb.TagNumber(8)\n  set pubdate($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasPubdate() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearPubdate() => $_clearField(8);\n\n  /// 提交时间戳\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get ctime => $_getI64(8);\n  @$pb.TagNumber(9)\n  set ctime($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasCtime() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearCtime() => $_clearField(9);\n\n  /// 简介\n  @$pb.TagNumber(10)\n  $core.String get desc => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set desc($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasDesc() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearDesc() => $_clearField(10);\n\n  /// 状态 (>= 0 为正常可见状态)\n  @$pb.TagNumber(11)\n  $core.int get state => $_getIZ(10);\n  @$pb.TagNumber(11)\n  set state($core.int value) => $_setSignedInt32(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasState() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearState() => $_clearField(11);\n\n  /// 是否可访问\n  ///\n  /// - 0: 公开\n  /// - 10000: 仅登录用户\n  @$pb.TagNumber(12)\n  $core.int get access => $_getIZ(11);\n  @$pb.TagNumber(12)\n  set access($core.int value) => $_setSignedInt32(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasAccess() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearAccess() => $_clearField(12);\n\n  /// 属性\n  @$pb.TagNumber(13)\n  $core.int get attribute => $_getIZ(12);\n  @$pb.TagNumber(13)\n  set attribute($core.int value) => $_setSignedInt32(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasAttribute() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearAttribute() => $_clearField(13);\n\n  /// Deprecated\n  @$pb.TagNumber(14)\n  $core.String get tag => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set tag($core.String value) => $_setString(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasTag() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearTag() => $_clearField(14);\n\n  /// Deprecated\n  @$pb.TagNumber(15)\n  $pb.PbList<$core.String> get tags => $_getList(14);\n\n  /// 所有分 P 加起来的总时长 (seconds)\n  @$pb.TagNumber(16)\n  $fixnum.Int64 get duration => $_getI64(15);\n  @$pb.TagNumber(16)\n  set duration($fixnum.Int64 value) => $_setInt64(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasDuration() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearDuration() => $_clearField(16);\n\n  /// 参与的活动 id\n  @$pb.TagNumber(17)\n  $fixnum.Int64 get missionId => $_getI64(16);\n  @$pb.TagNumber(17)\n  set missionId($fixnum.Int64 value) => $_setInt64(16, value);\n  @$pb.TagNumber(17)\n  $core.bool hasMissionId() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearMissionId() => $_clearField(17);\n\n  /// 参与的商单 id\n  @$pb.TagNumber(18)\n  $fixnum.Int64 get orderId => $_getI64(17);\n  @$pb.TagNumber(18)\n  set orderId($fixnum.Int64 value) => $_setInt64(17, value);\n  @$pb.TagNumber(18)\n  $core.bool hasOrderId() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearOrderId() => $_clearField(18);\n\n  /// 强制跳转地址\n  @$pb.TagNumber(19)\n  $core.String get redirectUrl => $_getSZ(18);\n  @$pb.TagNumber(19)\n  set redirectUrl($core.String value) => $_setString(18, value);\n  @$pb.TagNumber(19)\n  $core.bool hasRedirectUrl() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearRedirectUrl() => $_clearField(19);\n\n  @$pb.TagNumber(20)\n  $fixnum.Int64 get forward => $_getI64(19);\n  @$pb.TagNumber(20)\n  set forward($fixnum.Int64 value) => $_setInt64(19, value);\n  @$pb.TagNumber(20)\n  $core.bool hasForward() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearForward() => $_clearField(20);\n\n  /// 参见 [`Rights`]\n  @$pb.TagNumber(21)\n  Rights get rights => $_getN(20);\n  @$pb.TagNumber(21)\n  set rights(Rights value) => $_setField(21, value);\n  @$pb.TagNumber(21)\n  $core.bool hasRights() => $_has(20);\n  @$pb.TagNumber(21)\n  void clearRights() => $_clearField(21);\n  @$pb.TagNumber(21)\n  Rights ensureRights() => $_ensure(20);\n\n  /// 稿件作者信息, 参见 [`Author`]\n  @$pb.TagNumber(22)\n  Author get author => $_getN(21);\n  @$pb.TagNumber(22)\n  set author(Author value) => $_setField(22, value);\n  @$pb.TagNumber(22)\n  $core.bool hasAuthor() => $_has(21);\n  @$pb.TagNumber(22)\n  void clearAuthor() => $_clearField(22);\n  @$pb.TagNumber(22)\n  Author ensureAuthor() => $_ensure(21);\n\n  /// 稿件计数信息, 参见 [`Stat`]\n  @$pb.TagNumber(23)\n  Stat get stat => $_getN(22);\n  @$pb.TagNumber(23)\n  set stat(Stat value) => $_setField(23, value);\n  @$pb.TagNumber(23)\n  $core.bool hasStat() => $_has(22);\n  @$pb.TagNumber(23)\n  void clearStat() => $_clearField(23);\n  @$pb.TagNumber(23)\n  Stat ensureStat() => $_ensure(22);\n\n  @$pb.TagNumber(24)\n  $core.String get reportResult => $_getSZ(23);\n  @$pb.TagNumber(24)\n  set reportResult($core.String value) => $_setString(23, value);\n  @$pb.TagNumber(24)\n  $core.bool hasReportResult() => $_has(23);\n  @$pb.TagNumber(24)\n  void clearReportResult() => $_clearField(24);\n\n  /// 发布时动态描述\n  @$pb.TagNumber(25)\n  $core.String get dynamic => $_getSZ(24);\n  @$pb.TagNumber(25)\n  set dynamic($core.String value) => $_setString(24, value);\n  @$pb.TagNumber(25)\n  $core.bool hasDynamic() => $_has(24);\n  @$pb.TagNumber(25)\n  void clearDynamic() => $_clearField(25);\n\n  /// 首个分 P 的 cid\n  @$pb.TagNumber(26)\n  $fixnum.Int64 get firstCid => $_getI64(25);\n  @$pb.TagNumber(26)\n  set firstCid($fixnum.Int64 value) => $_setInt64(25, value);\n  @$pb.TagNumber(26)\n  $core.bool hasFirstCid() => $_has(25);\n  @$pb.TagNumber(26)\n  void clearFirstCid() => $_clearField(26);\n\n  /// 首个分 P 的分辨率\n  @$pb.TagNumber(27)\n  Dimension get dimension => $_getN(26);\n  @$pb.TagNumber(27)\n  set dimension(Dimension value) => $_setField(27, value);\n  @$pb.TagNumber(27)\n  $core.bool hasDimension() => $_has(26);\n  @$pb.TagNumber(27)\n  void clearDimension() => $_clearField(27);\n  @$pb.TagNumber(27)\n  Dimension ensureDimension() => $_ensure(26);\n\n  /// 联合投稿信息\n  @$pb.TagNumber(28)\n  $pb.PbList<StaffInfo> get staffInfo => $_getList(27);\n\n  /// UGC 剧集 ID\n  @$pb.TagNumber(29)\n  $fixnum.Int64 get seasonId => $_getI64(28);\n  @$pb.TagNumber(29)\n  set seasonId($fixnum.Int64 value) => $_setInt64(28, value);\n  @$pb.TagNumber(29)\n  $core.bool hasSeasonId() => $_has(28);\n  @$pb.TagNumber(29)\n  void clearSeasonId() => $_clearField(29);\n\n  /// 属性 (旧的 int32 不够用了)\n  @$pb.TagNumber(30)\n  $fixnum.Int64 get attributeV2 => $_getI64(29);\n  @$pb.TagNumber(30)\n  set attributeV2($fixnum.Int64 value) => $_setInt64(29, value);\n  @$pb.TagNumber(30)\n  $core.bool hasAttributeV2() => $_has(29);\n  @$pb.TagNumber(30)\n  void clearAttributeV2() => $_clearField(30);\n\n  /// ? UGC 剧集主题\n  @$pb.TagNumber(31)\n  SeasonTheme get seasonTheme => $_getN(30);\n  @$pb.TagNumber(31)\n  set seasonTheme(SeasonTheme value) => $_setField(31, value);\n  @$pb.TagNumber(31)\n  $core.bool hasSeasonTheme() => $_has(30);\n  @$pb.TagNumber(31)\n  void clearSeasonTheme() => $_clearField(31);\n  @$pb.TagNumber(31)\n  SeasonTheme ensureSeasonTheme() => $_ensure(30);\n\n  /// ? 短链接\n  @$pb.TagNumber(40)\n  $core.String get shortLinkV2 => $_getSZ(31);\n  @$pb.TagNumber(40)\n  set shortLinkV2($core.String value) => $_setString(31, value);\n  @$pb.TagNumber(40)\n  $core.bool hasShortLinkV2() => $_has(31);\n  @$pb.TagNumber(40)\n  void clearShortLinkV2() => $_clearField(40);\n\n  @$pb.TagNumber(41)\n  $core.int get upFromV2 => $_getIZ(32);\n  @$pb.TagNumber(41)\n  set upFromV2($core.int value) => $_setSignedInt32(32, value);\n  @$pb.TagNumber(41)\n  $core.bool hasUpFromV2() => $_has(32);\n  @$pb.TagNumber(41)\n  void clearUpFromV2() => $_clearField(41);\n\n  @$pb.TagNumber(42)\n  $core.String get firstFrame => $_getSZ(33);\n  @$pb.TagNumber(42)\n  set firstFrame($core.String value) => $_setString(33, value);\n  @$pb.TagNumber(42)\n  $core.bool hasFirstFrame() => $_has(33);\n  @$pb.TagNumber(42)\n  void clearFirstFrame() => $_clearField(42);\n}\n\n/// 作者信息\nclass Author extends $pb.GeneratedMessage {\n  factory Author({\n    $fixnum.Int64? mid,\n    $core.String? name,\n    $core.String? face,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (name != null) result.name = name;\n    if (face != null) result.face = face;\n    return result;\n  }\n\n  Author._();\n\n  factory Author.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Author.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Author',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.archive.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'face')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Author clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Author copyWith(void Function(Author) updates) =>\n      super.copyWith((message) => updates(message as Author)) as Author;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Author create() => Author._();\n  @$core.override\n  Author createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Author getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Author>(create);\n  static Author? _defaultInstance;\n\n  /// UP mid\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  /// UP 昵称\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  /// UP 头像\n  @$pb.TagNumber(3)\n  $core.String get face => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set face($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFace() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFace() => $_clearField(3);\n}\n\n/// 视频分辨率\nclass Dimension extends $pb.GeneratedMessage {\n  factory Dimension({\n    $fixnum.Int64? width,\n    $fixnum.Int64? height,\n    $fixnum.Int64? rotate,\n  }) {\n    final result = create();\n    if (width != null) result.width = width;\n    if (height != null) result.height = height;\n    if (rotate != null) result.rotate = rotate;\n    return result;\n  }\n\n  Dimension._();\n\n  factory Dimension.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Dimension.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Dimension',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.archive.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'width')\n    ..aInt64(2, _omitFieldNames ? '' : 'height')\n    ..aInt64(3, _omitFieldNames ? '' : 'rotate')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Dimension clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Dimension copyWith(void Function(Dimension) updates) =>\n      super.copyWith((message) => updates(message as Dimension)) as Dimension;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Dimension create() => Dimension._();\n  @$core.override\n  Dimension createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Dimension getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Dimension>(create);\n  static Dimension? _defaultInstance;\n\n  /// 宽\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get width => $_getI64(0);\n  @$pb.TagNumber(1)\n  set width($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasWidth() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearWidth() => $_clearField(1);\n\n  /// 高\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get height => $_getI64(1);\n  @$pb.TagNumber(2)\n  set height($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHeight() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHeight() => $_clearField(2);\n\n  /// 是否竖屏\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get rotate => $_getI64(2);\n  @$pb.TagNumber(3)\n  set rotate($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRotate() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRotate() => $_clearField(3);\n}\n\n/// 分 P 信息\nclass Page extends $pb.GeneratedMessage {\n  factory Page({\n    $fixnum.Int64? cid,\n    $core.int? page,\n    $core.String? from,\n    $core.String? part,\n    $fixnum.Int64? duration,\n    $core.String? vid,\n    $core.String? desc,\n    $core.String? webLink,\n    Dimension? dimension,\n    $core.String? firstFrame,\n  }) {\n    final result = create();\n    if (cid != null) result.cid = cid;\n    if (page != null) result.page = page;\n    if (from != null) result.from = from;\n    if (part != null) result.part = part;\n    if (duration != null) result.duration = duration;\n    if (vid != null) result.vid = vid;\n    if (desc != null) result.desc = desc;\n    if (webLink != null) result.webLink = webLink;\n    if (dimension != null) result.dimension = dimension;\n    if (firstFrame != null) result.firstFrame = firstFrame;\n    return result;\n  }\n\n  Page._();\n\n  factory Page.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Page.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Page',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.archive.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'cid')\n    ..aI(2, _omitFieldNames ? '' : 'page')\n    ..aOS(3, _omitFieldNames ? '' : 'from')\n    ..aOS(4, _omitFieldNames ? '' : 'part')\n    ..aInt64(5, _omitFieldNames ? '' : 'duration')\n    ..aOS(6, _omitFieldNames ? '' : 'vid')\n    ..aOS(7, _omitFieldNames ? '' : 'desc')\n    ..aOS(8, _omitFieldNames ? '' : 'webLink')\n    ..aOM<Dimension>(9, _omitFieldNames ? '' : 'dimension',\n        subBuilder: Dimension.create)\n    ..aOS(10, _omitFieldNames ? '' : 'firstFrame')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Page clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Page copyWith(void Function(Page) updates) =>\n      super.copyWith((message) => updates(message as Page)) as Page;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Page create() => Page._();\n  @$core.override\n  Page createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Page getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Page>(create);\n  static Page? _defaultInstance;\n\n  /// 视频流 CID\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get cid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set cid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCid() => $_clearField(1);\n\n  /// 视频序号\n  @$pb.TagNumber(2)\n  $core.int get page => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set page($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPage() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPage() => $_clearField(2);\n\n  /// 视频来源\n  ///\n  /// - vupload\n  /// - qq: Tencent\n  /// - hunan: Hunan TV\n  @$pb.TagNumber(3)\n  $core.String get from => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set from($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFrom() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFrom() => $_clearField(3);\n\n  /// 视频标题\n  @$pb.TagNumber(4)\n  $core.String get part => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set part($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPart() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPart() => $_clearField(4);\n\n  /// 视频时长 (seconds)\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get duration => $_getI64(4);\n  @$pb.TagNumber(5)\n  set duration($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDuration() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDuration() => $_clearField(5);\n\n  /// 站外视频 vid\n  @$pb.TagNumber(6)\n  $core.String get vid => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set vid($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasVid() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearVid() => $_clearField(6);\n\n  /// 视频简介\n  @$pb.TagNumber(7)\n  $core.String get desc => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set desc($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasDesc() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearDesc() => $_clearField(7);\n\n  /// 站外视频跳转地址\n  @$pb.TagNumber(8)\n  $core.String get webLink => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set webLink($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasWebLink() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearWebLink() => $_clearField(8);\n\n  /// 见 [`Dimension`]\n  @$pb.TagNumber(9)\n  Dimension get dimension => $_getN(8);\n  @$pb.TagNumber(9)\n  set dimension(Dimension value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasDimension() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearDimension() => $_clearField(9);\n  @$pb.TagNumber(9)\n  Dimension ensureDimension() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  $core.String get firstFrame => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set firstFrame($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasFirstFrame() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearFirstFrame() => $_clearField(10);\n}\n\n/// 常用属性, 0 否 1 是\nclass Rights extends $pb.GeneratedMessage {\n  factory Rights({\n    $core.int? bp,\n    $core.int? elec,\n    $core.int? download,\n    $core.int? movie,\n    $core.int? pay,\n    $core.int? hd5,\n    $core.int? noReprint,\n    $core.int? autoplay,\n    $core.int? ugcPay,\n    $core.int? isCooperation,\n    $core.int? ugcPayPreview,\n    $core.int? noBackground,\n    $core.int? arcPay,\n    $core.int? payFreeWatch,\n  }) {\n    final result = create();\n    if (bp != null) result.bp = bp;\n    if (elec != null) result.elec = elec;\n    if (download != null) result.download = download;\n    if (movie != null) result.movie = movie;\n    if (pay != null) result.pay = pay;\n    if (hd5 != null) result.hd5 = hd5;\n    if (noReprint != null) result.noReprint = noReprint;\n    if (autoplay != null) result.autoplay = autoplay;\n    if (ugcPay != null) result.ugcPay = ugcPay;\n    if (isCooperation != null) result.isCooperation = isCooperation;\n    if (ugcPayPreview != null) result.ugcPayPreview = ugcPayPreview;\n    if (noBackground != null) result.noBackground = noBackground;\n    if (arcPay != null) result.arcPay = arcPay;\n    if (payFreeWatch != null) result.payFreeWatch = payFreeWatch;\n    return result;\n  }\n\n  Rights._();\n\n  factory Rights.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Rights.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Rights',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.archive.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'bp')\n    ..aI(2, _omitFieldNames ? '' : 'elec')\n    ..aI(3, _omitFieldNames ? '' : 'download')\n    ..aI(4, _omitFieldNames ? '' : 'movie')\n    ..aI(5, _omitFieldNames ? '' : 'pay')\n    ..aI(6, _omitFieldNames ? '' : 'hd5')\n    ..aI(7, _omitFieldNames ? '' : 'noReprint')\n    ..aI(8, _omitFieldNames ? '' : 'autoplay')\n    ..aI(9, _omitFieldNames ? '' : 'ugcPay')\n    ..aI(10, _omitFieldNames ? '' : 'isCooperation')\n    ..aI(11, _omitFieldNames ? '' : 'ugcPayPreview')\n    ..aI(12, _omitFieldNames ? '' : 'noBackground')\n    ..aI(13, _omitFieldNames ? '' : 'arcPay')\n    ..aI(14, _omitFieldNames ? '' : 'payFreeWatch')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Rights clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Rights copyWith(void Function(Rights) updates) =>\n      super.copyWith((message) => updates(message as Rights)) as Rights;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Rights create() => Rights._();\n  @$core.override\n  Rights createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Rights getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Rights>(create);\n  static Rights? _defaultInstance;\n\n  /// 是否付费(旧版)\n  @$pb.TagNumber(1)\n  $core.int get bp => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set bp($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBp() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBp() => $_clearField(1);\n\n  /// 是否支持充电\n  @$pb.TagNumber(2)\n  $core.int get elec => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set elec($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasElec() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearElec() => $_clearField(2);\n\n  /// 是否下载\n  @$pb.TagNumber(3)\n  $core.int get download => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set download($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDownload() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDownload() => $_clearField(3);\n\n  /// 是否电影\n  @$pb.TagNumber(4)\n  $core.int get movie => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set movie($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasMovie() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearMovie() => $_clearField(4);\n\n  /// 是否是需要付费的 PGC 稿件\n  @$pb.TagNumber(5)\n  $core.int get pay => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set pay($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPay() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPay() => $_clearField(5);\n\n  /// Deprecated\n  @$pb.TagNumber(6)\n  $core.int get hd5 => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set hd5($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasHd5() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearHd5() => $_clearField(6);\n\n  /// 是否允许转发\n  @$pb.TagNumber(7)\n  $core.int get noReprint => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set noReprint($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasNoReprint() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearNoReprint() => $_clearField(7);\n\n  /// 是否可以自动播放\n  @$pb.TagNumber(8)\n  $core.int get autoplay => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set autoplay($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasAutoplay() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearAutoplay() => $_clearField(8);\n\n  /// 是否是需要付费的 UGC 稿件\n  @$pb.TagNumber(9)\n  $core.int get ugcPay => $_getIZ(8);\n  @$pb.TagNumber(9)\n  set ugcPay($core.int value) => $_setSignedInt32(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasUgcPay() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearUgcPay() => $_clearField(9);\n\n  /// 是否联合投稿\n  @$pb.TagNumber(10)\n  $core.int get isCooperation => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set isCooperation($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasIsCooperation() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearIsCooperation() => $_clearField(10);\n\n  /// 需要付费的 PGC 稿件是否支持预览\n  @$pb.TagNumber(11)\n  $core.int get ugcPayPreview => $_getIZ(10);\n  @$pb.TagNumber(11)\n  set ugcPayPreview($core.int value) => $_setSignedInt32(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasUgcPayPreview() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearUgcPayPreview() => $_clearField(11);\n\n  /// 是否禁止后台播放\n  @$pb.TagNumber(12)\n  $core.int get noBackground => $_getIZ(11);\n  @$pb.TagNumber(12)\n  set noBackground($core.int value) => $_setSignedInt32(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasNoBackground() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearNoBackground() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.int get arcPay => $_getIZ(12);\n  @$pb.TagNumber(13)\n  set arcPay($core.int value) => $_setSignedInt32(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasArcPay() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearArcPay() => $_clearField(13);\n\n  /// ? 需要付费的稿件是否支持免费畅览\n  @$pb.TagNumber(14)\n  $core.int get payFreeWatch => $_getIZ(13);\n  @$pb.TagNumber(14)\n  set payFreeWatch($core.int value) => $_setSignedInt32(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasPayFreeWatch() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearPayFreeWatch() => $_clearField(14);\n}\n\nclass SeasonTheme extends $pb.GeneratedMessage {\n  factory SeasonTheme({\n    $core.String? bgColor,\n    $core.String? selectedBgColor,\n    $core.String? textColor,\n  }) {\n    final result = create();\n    if (bgColor != null) result.bgColor = bgColor;\n    if (selectedBgColor != null) result.selectedBgColor = selectedBgColor;\n    if (textColor != null) result.textColor = textColor;\n    return result;\n  }\n\n  SeasonTheme._();\n\n  factory SeasonTheme.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SeasonTheme.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SeasonTheme',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.archive.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'bgColor')\n    ..aOS(2, _omitFieldNames ? '' : 'selectedBgColor')\n    ..aOS(3, _omitFieldNames ? '' : 'textColor')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SeasonTheme clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SeasonTheme copyWith(void Function(SeasonTheme) updates) =>\n      super.copyWith((message) => updates(message as SeasonTheme))\n          as SeasonTheme;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SeasonTheme create() => SeasonTheme._();\n  @$core.override\n  SeasonTheme createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SeasonTheme getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SeasonTheme>(create);\n  static SeasonTheme? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get bgColor => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set bgColor($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBgColor() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBgColor() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get selectedBgColor => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set selectedBgColor($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSelectedBgColor() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSelectedBgColor() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get textColor => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set textColor($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTextColor() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTextColor() => $_clearField(3);\n}\n\n/// 联合投稿成员\nclass StaffInfo extends $pb.GeneratedMessage {\n  factory StaffInfo({\n    $fixnum.Int64? mid,\n    $core.String? title,\n    $fixnum.Int64? attribute,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (title != null) result.title = title;\n    if (attribute != null) result.attribute = attribute;\n    return result;\n  }\n\n  StaffInfo._();\n\n  factory StaffInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory StaffInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'StaffInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.archive.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aInt64(3, _omitFieldNames ? '' : 'attribute')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StaffInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StaffInfo copyWith(void Function(StaffInfo) updates) =>\n      super.copyWith((message) => updates(message as StaffInfo)) as StaffInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static StaffInfo create() => StaffInfo._();\n  @$core.override\n  StaffInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static StaffInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<StaffInfo>(create);\n  static StaffInfo? _defaultInstance;\n\n  /// 联合投稿成员 mid\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  /// 联合投稿成员角色\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  /// 属性\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get attribute => $_getI64(2);\n  @$pb.TagNumber(3)\n  set attribute($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAttribute() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAttribute() => $_clearField(3);\n}\n\n/// 计数相关信息\nclass Stat extends $pb.GeneratedMessage {\n  factory Stat({\n    $fixnum.Int64? aid,\n    $core.int? view,\n    $core.int? danmaku,\n    $core.int? reply,\n    $core.int? fav,\n    $core.int? coin,\n    $core.int? share,\n    $core.int? nowRank,\n    $core.int? hisRank,\n    $core.int? like,\n    $core.int? dislike,\n  }) {\n    final result = create();\n    if (aid != null) result.aid = aid;\n    if (view != null) result.view = view;\n    if (danmaku != null) result.danmaku = danmaku;\n    if (reply != null) result.reply = reply;\n    if (fav != null) result.fav = fav;\n    if (coin != null) result.coin = coin;\n    if (share != null) result.share = share;\n    if (nowRank != null) result.nowRank = nowRank;\n    if (hisRank != null) result.hisRank = hisRank;\n    if (like != null) result.like = like;\n    if (dislike != null) result.dislike = dislike;\n    return result;\n  }\n\n  Stat._();\n\n  factory Stat.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Stat.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Stat',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.archive.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'aid')\n    ..aI(2, _omitFieldNames ? '' : 'view')\n    ..aI(3, _omitFieldNames ? '' : 'danmaku')\n    ..aI(4, _omitFieldNames ? '' : 'reply')\n    ..aI(5, _omitFieldNames ? '' : 'fav')\n    ..aI(6, _omitFieldNames ? '' : 'coin')\n    ..aI(7, _omitFieldNames ? '' : 'share')\n    ..aI(8, _omitFieldNames ? '' : 'nowRank')\n    ..aI(9, _omitFieldNames ? '' : 'hisRank')\n    ..aI(10, _omitFieldNames ? '' : 'like')\n    ..aI(11, _omitFieldNames ? '' : 'dislike')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Stat clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Stat copyWith(void Function(Stat) updates) =>\n      super.copyWith((message) => updates(message as Stat)) as Stat;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Stat create() => Stat._();\n  @$core.override\n  Stat createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Stat getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Stat>(create);\n  static Stat? _defaultInstance;\n\n  /// 稿件 avid\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get aid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set aid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAid() => $_clearField(1);\n\n  /// 播放量\n  @$pb.TagNumber(2)\n  $core.int get view => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set view($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasView() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearView() => $_clearField(2);\n\n  /// 弹幕数\n  @$pb.TagNumber(3)\n  $core.int get danmaku => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set danmaku($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDanmaku() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDanmaku() => $_clearField(3);\n\n  /// 评论数\n  @$pb.TagNumber(4)\n  $core.int get reply => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set reply($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasReply() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearReply() => $_clearField(4);\n\n  /// 收藏数\n  @$pb.TagNumber(5)\n  $core.int get fav => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set fav($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasFav() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearFav() => $_clearField(5);\n\n  /// 投币数\n  @$pb.TagNumber(6)\n  $core.int get coin => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set coin($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCoin() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCoin() => $_clearField(6);\n\n  /// 分享数\n  @$pb.TagNumber(7)\n  $core.int get share => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set share($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasShare() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearShare() => $_clearField(7);\n\n  /// 当前排名\n  @$pb.TagNumber(8)\n  $core.int get nowRank => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set nowRank($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasNowRank() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearNowRank() => $_clearField(8);\n\n  /// 历史最高排名\n  @$pb.TagNumber(9)\n  $core.int get hisRank => $_getIZ(8);\n  @$pb.TagNumber(9)\n  set hisRank($core.int value) => $_setSignedInt32(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasHisRank() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearHisRank() => $_clearField(9);\n\n  /// 点赞数\n  @$pb.TagNumber(10)\n  $core.int get like => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set like($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasLike() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearLike() => $_clearField(10);\n\n  /// 点踩数 (Deprecated)\n  @$pb.TagNumber(11)\n  $core.int get dislike => $_getIZ(10);\n  @$pb.TagNumber(11)\n  set dislike($core.int value) => $_setSignedInt32(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasDislike() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearDislike() => $_clearField(11);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/archive/v1.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/archive/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n"
  },
  {
    "path": "lib/grpc/bilibili/app/archive/v1.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/archive/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use arcDescriptor instead')\nconst Arc$json = {\n  '1': 'Arc',\n  '2': [\n    {'1': 'aid', '3': 1, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'videos', '3': 2, '4': 1, '5': 3, '10': 'videos'},\n    {'1': 'type_id', '3': 3, '4': 1, '5': 5, '10': 'typeId'},\n    {'1': 'type_name', '3': 4, '4': 1, '5': 9, '10': 'typeName'},\n    {'1': 'copyright', '3': 5, '4': 1, '5': 5, '10': 'copyright'},\n    {'1': 'pic', '3': 6, '4': 1, '5': 9, '10': 'pic'},\n    {'1': 'title', '3': 7, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'pubdate', '3': 8, '4': 1, '5': 3, '10': 'pubdate'},\n    {'1': 'ctime', '3': 9, '4': 1, '5': 3, '10': 'ctime'},\n    {'1': 'desc', '3': 10, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'state', '3': 11, '4': 1, '5': 5, '10': 'state'},\n    {'1': 'access', '3': 12, '4': 1, '5': 5, '10': 'access'},\n    {'1': 'attribute', '3': 13, '4': 1, '5': 5, '10': 'attribute'},\n    {'1': 'tag', '3': 14, '4': 1, '5': 9, '10': 'tag'},\n    {'1': 'tags', '3': 15, '4': 3, '5': 9, '10': 'tags'},\n    {'1': 'duration', '3': 16, '4': 1, '5': 3, '10': 'duration'},\n    {'1': 'mission_id', '3': 17, '4': 1, '5': 3, '10': 'missionId'},\n    {'1': 'order_id', '3': 18, '4': 1, '5': 3, '10': 'orderId'},\n    {'1': 'redirect_url', '3': 19, '4': 1, '5': 9, '10': 'redirectUrl'},\n    {'1': 'forward', '3': 20, '4': 1, '5': 3, '10': 'forward'},\n    {\n      '1': 'rights',\n      '3': 21,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.v1.Rights',\n      '10': 'rights'\n    },\n    {\n      '1': 'author',\n      '3': 22,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.v1.Author',\n      '10': 'author'\n    },\n    {\n      '1': 'stat',\n      '3': 23,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.v1.Stat',\n      '10': 'stat'\n    },\n    {'1': 'report_result', '3': 24, '4': 1, '5': 9, '10': 'reportResult'},\n    {'1': 'dynamic', '3': 25, '4': 1, '5': 9, '10': 'dynamic'},\n    {'1': 'first_cid', '3': 26, '4': 1, '5': 3, '10': 'firstCid'},\n    {\n      '1': 'dimension',\n      '3': 27,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.v1.Dimension',\n      '10': 'dimension'\n    },\n    {\n      '1': 'staff_info',\n      '3': 28,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.archive.v1.StaffInfo',\n      '10': 'staffInfo'\n    },\n    {'1': 'season_id', '3': 29, '4': 1, '5': 3, '10': 'seasonId'},\n    {'1': 'attribute_v2', '3': 30, '4': 1, '5': 3, '10': 'attributeV2'},\n    {\n      '1': 'season_theme',\n      '3': 31,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.v1.SeasonTheme',\n      '10': 'seasonTheme'\n    },\n    {'1': 'short_link_v2', '3': 40, '4': 1, '5': 9, '10': 'shortLinkV2'},\n    {'1': 'up_from_v2', '3': 41, '4': 1, '5': 5, '10': 'upFromV2'},\n    {'1': 'first_frame', '3': 42, '4': 1, '5': 9, '10': 'firstFrame'},\n  ],\n};\n\n/// Descriptor for `Arc`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List arcDescriptor = $convert.base64Decode(\n    'CgNBcmMSEAoDYWlkGAEgASgDUgNhaWQSFgoGdmlkZW9zGAIgASgDUgZ2aWRlb3MSFwoHdHlwZV'\n    '9pZBgDIAEoBVIGdHlwZUlkEhsKCXR5cGVfbmFtZRgEIAEoCVIIdHlwZU5hbWUSHAoJY29weXJp'\n    'Z2h0GAUgASgFUgljb3B5cmlnaHQSEAoDcGljGAYgASgJUgNwaWMSFAoFdGl0bGUYByABKAlSBX'\n    'RpdGxlEhgKB3B1YmRhdGUYCCABKANSB3B1YmRhdGUSFAoFY3RpbWUYCSABKANSBWN0aW1lEhIK'\n    'BGRlc2MYCiABKAlSBGRlc2MSFAoFc3RhdGUYCyABKAVSBXN0YXRlEhYKBmFjY2VzcxgMIAEoBV'\n    'IGYWNjZXNzEhwKCWF0dHJpYnV0ZRgNIAEoBVIJYXR0cmlidXRlEhAKA3RhZxgOIAEoCVIDdGFn'\n    'EhIKBHRhZ3MYDyADKAlSBHRhZ3MSGgoIZHVyYXRpb24YECABKANSCGR1cmF0aW9uEh0KCm1pc3'\n    'Npb25faWQYESABKANSCW1pc3Npb25JZBIZCghvcmRlcl9pZBgSIAEoA1IHb3JkZXJJZBIhCgxy'\n    'ZWRpcmVjdF91cmwYEyABKAlSC3JlZGlyZWN0VXJsEhgKB2ZvcndhcmQYFCABKANSB2Zvcndhcm'\n    'QSNwoGcmlnaHRzGBUgASgLMh8uYmlsaWJpbGkuYXBwLmFyY2hpdmUudjEuUmlnaHRzUgZyaWdo'\n    'dHMSNwoGYXV0aG9yGBYgASgLMh8uYmlsaWJpbGkuYXBwLmFyY2hpdmUudjEuQXV0aG9yUgZhdX'\n    'Rob3ISMQoEc3RhdBgXIAEoCzIdLmJpbGliaWxpLmFwcC5hcmNoaXZlLnYxLlN0YXRSBHN0YXQS'\n    'IwoNcmVwb3J0X3Jlc3VsdBgYIAEoCVIMcmVwb3J0UmVzdWx0EhgKB2R5bmFtaWMYGSABKAlSB2'\n    'R5bmFtaWMSGwoJZmlyc3RfY2lkGBogASgDUghmaXJzdENpZBJACglkaW1lbnNpb24YGyABKAsy'\n    'Ii5iaWxpYmlsaS5hcHAuYXJjaGl2ZS52MS5EaW1lbnNpb25SCWRpbWVuc2lvbhJBCgpzdGFmZl'\n    '9pbmZvGBwgAygLMiIuYmlsaWJpbGkuYXBwLmFyY2hpdmUudjEuU3RhZmZJbmZvUglzdGFmZklu'\n    'Zm8SGwoJc2Vhc29uX2lkGB0gASgDUghzZWFzb25JZBIhCgxhdHRyaWJ1dGVfdjIYHiABKANSC2'\n    'F0dHJpYnV0ZVYyEkcKDHNlYXNvbl90aGVtZRgfIAEoCzIkLmJpbGliaWxpLmFwcC5hcmNoaXZl'\n    'LnYxLlNlYXNvblRoZW1lUgtzZWFzb25UaGVtZRIiCg1zaG9ydF9saW5rX3YyGCggASgJUgtzaG'\n    '9ydExpbmtWMhIcCgp1cF9mcm9tX3YyGCkgASgFUgh1cEZyb21WMhIfCgtmaXJzdF9mcmFtZRgq'\n    'IAEoCVIKZmlyc3RGcmFtZQ==');\n\n@$core.Deprecated('Use authorDescriptor instead')\nconst Author$json = {\n  '1': 'Author',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'face', '3': 3, '4': 1, '5': 9, '10': 'face'},\n  ],\n};\n\n/// Descriptor for `Author`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List authorDescriptor = $convert.base64Decode(\n    'CgZBdXRob3ISEAoDbWlkGAEgASgDUgNtaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRISCgRmYWNlGA'\n    'MgASgJUgRmYWNl');\n\n@$core.Deprecated('Use dimensionDescriptor instead')\nconst Dimension$json = {\n  '1': 'Dimension',\n  '2': [\n    {'1': 'width', '3': 1, '4': 1, '5': 3, '10': 'width'},\n    {'1': 'height', '3': 2, '4': 1, '5': 3, '10': 'height'},\n    {'1': 'rotate', '3': 3, '4': 1, '5': 3, '10': 'rotate'},\n  ],\n};\n\n/// Descriptor for `Dimension`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dimensionDescriptor = $convert.base64Decode(\n    'CglEaW1lbnNpb24SFAoFd2lkdGgYASABKANSBXdpZHRoEhYKBmhlaWdodBgCIAEoA1IGaGVpZ2'\n    'h0EhYKBnJvdGF0ZRgDIAEoA1IGcm90YXRl');\n\n@$core.Deprecated('Use pageDescriptor instead')\nconst Page$json = {\n  '1': 'Page',\n  '2': [\n    {'1': 'cid', '3': 1, '4': 1, '5': 3, '10': 'cid'},\n    {'1': 'page', '3': 2, '4': 1, '5': 5, '10': 'page'},\n    {'1': 'from', '3': 3, '4': 1, '5': 9, '10': 'from'},\n    {'1': 'part', '3': 4, '4': 1, '5': 9, '10': 'part'},\n    {'1': 'duration', '3': 5, '4': 1, '5': 3, '10': 'duration'},\n    {'1': 'vid', '3': 6, '4': 1, '5': 9, '10': 'vid'},\n    {'1': 'desc', '3': 7, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'web_link', '3': 8, '4': 1, '5': 9, '10': 'webLink'},\n    {\n      '1': 'dimension',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.v1.Dimension',\n      '10': 'dimension'\n    },\n    {'1': 'first_frame', '3': 10, '4': 1, '5': 9, '10': 'firstFrame'},\n  ],\n};\n\n/// Descriptor for `Page`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pageDescriptor = $convert.base64Decode(\n    'CgRQYWdlEhAKA2NpZBgBIAEoA1IDY2lkEhIKBHBhZ2UYAiABKAVSBHBhZ2USEgoEZnJvbRgDIA'\n    'EoCVIEZnJvbRISCgRwYXJ0GAQgASgJUgRwYXJ0EhoKCGR1cmF0aW9uGAUgASgDUghkdXJhdGlv'\n    'bhIQCgN2aWQYBiABKAlSA3ZpZBISCgRkZXNjGAcgASgJUgRkZXNjEhkKCHdlYl9saW5rGAggAS'\n    'gJUgd3ZWJMaW5rEkAKCWRpbWVuc2lvbhgJIAEoCzIiLmJpbGliaWxpLmFwcC5hcmNoaXZlLnYx'\n    'LkRpbWVuc2lvblIJZGltZW5zaW9uEh8KC2ZpcnN0X2ZyYW1lGAogASgJUgpmaXJzdEZyYW1l');\n\n@$core.Deprecated('Use rightsDescriptor instead')\nconst Rights$json = {\n  '1': 'Rights',\n  '2': [\n    {'1': 'bp', '3': 1, '4': 1, '5': 5, '10': 'bp'},\n    {'1': 'elec', '3': 2, '4': 1, '5': 5, '10': 'elec'},\n    {'1': 'download', '3': 3, '4': 1, '5': 5, '10': 'download'},\n    {'1': 'movie', '3': 4, '4': 1, '5': 5, '10': 'movie'},\n    {'1': 'pay', '3': 5, '4': 1, '5': 5, '10': 'pay'},\n    {'1': 'hd5', '3': 6, '4': 1, '5': 5, '10': 'hd5'},\n    {'1': 'no_reprint', '3': 7, '4': 1, '5': 5, '10': 'noReprint'},\n    {'1': 'autoplay', '3': 8, '4': 1, '5': 5, '10': 'autoplay'},\n    {'1': 'ugc_pay', '3': 9, '4': 1, '5': 5, '10': 'ugcPay'},\n    {'1': 'is_cooperation', '3': 10, '4': 1, '5': 5, '10': 'isCooperation'},\n    {'1': 'ugc_pay_preview', '3': 11, '4': 1, '5': 5, '10': 'ugcPayPreview'},\n    {'1': 'no_background', '3': 12, '4': 1, '5': 5, '10': 'noBackground'},\n    {'1': 'arc_pay', '3': 13, '4': 1, '5': 5, '10': 'arcPay'},\n    {'1': 'pay_free_watch', '3': 14, '4': 1, '5': 5, '10': 'payFreeWatch'},\n  ],\n};\n\n/// Descriptor for `Rights`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rightsDescriptor = $convert.base64Decode(\n    'CgZSaWdodHMSDgoCYnAYASABKAVSAmJwEhIKBGVsZWMYAiABKAVSBGVsZWMSGgoIZG93bmxvYW'\n    'QYAyABKAVSCGRvd25sb2FkEhQKBW1vdmllGAQgASgFUgVtb3ZpZRIQCgNwYXkYBSABKAVSA3Bh'\n    'eRIQCgNoZDUYBiABKAVSA2hkNRIdCgpub19yZXByaW50GAcgASgFUglub1JlcHJpbnQSGgoIYX'\n    'V0b3BsYXkYCCABKAVSCGF1dG9wbGF5EhcKB3VnY19wYXkYCSABKAVSBnVnY1BheRIlCg5pc19j'\n    'b29wZXJhdGlvbhgKIAEoBVINaXNDb29wZXJhdGlvbhImCg91Z2NfcGF5X3ByZXZpZXcYCyABKA'\n    'VSDXVnY1BheVByZXZpZXcSIwoNbm9fYmFja2dyb3VuZBgMIAEoBVIMbm9CYWNrZ3JvdW5kEhcK'\n    'B2FyY19wYXkYDSABKAVSBmFyY1BheRIkCg5wYXlfZnJlZV93YXRjaBgOIAEoBVIMcGF5RnJlZV'\n    'dhdGNo');\n\n@$core.Deprecated('Use seasonThemeDescriptor instead')\nconst SeasonTheme$json = {\n  '1': 'SeasonTheme',\n  '2': [\n    {'1': 'bg_color', '3': 1, '4': 1, '5': 9, '10': 'bgColor'},\n    {'1': 'selected_bg_color', '3': 2, '4': 1, '5': 9, '10': 'selectedBgColor'},\n    {'1': 'text_color', '3': 3, '4': 1, '5': 9, '10': 'textColor'},\n  ],\n};\n\n/// Descriptor for `SeasonTheme`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List seasonThemeDescriptor = $convert.base64Decode(\n    'CgtTZWFzb25UaGVtZRIZCghiZ19jb2xvchgBIAEoCVIHYmdDb2xvchIqChFzZWxlY3RlZF9iZ1'\n    '9jb2xvchgCIAEoCVIPc2VsZWN0ZWRCZ0NvbG9yEh0KCnRleHRfY29sb3IYAyABKAlSCXRleHRD'\n    'b2xvcg==');\n\n@$core.Deprecated('Use staffInfoDescriptor instead')\nconst StaffInfo$json = {\n  '1': 'StaffInfo',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'attribute', '3': 3, '4': 1, '5': 3, '10': 'attribute'},\n  ],\n};\n\n/// Descriptor for `StaffInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List staffInfoDescriptor = $convert.base64Decode(\n    'CglTdGFmZkluZm8SEAoDbWlkGAEgASgDUgNtaWQSFAoFdGl0bGUYAiABKAlSBXRpdGxlEhwKCW'\n    'F0dHJpYnV0ZRgDIAEoA1IJYXR0cmlidXRl');\n\n@$core.Deprecated('Use statDescriptor instead')\nconst Stat$json = {\n  '1': 'Stat',\n  '2': [\n    {'1': 'aid', '3': 1, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'view', '3': 2, '4': 1, '5': 5, '10': 'view'},\n    {'1': 'danmaku', '3': 3, '4': 1, '5': 5, '10': 'danmaku'},\n    {'1': 'reply', '3': 4, '4': 1, '5': 5, '10': 'reply'},\n    {'1': 'fav', '3': 5, '4': 1, '5': 5, '10': 'fav'},\n    {'1': 'coin', '3': 6, '4': 1, '5': 5, '10': 'coin'},\n    {'1': 'share', '3': 7, '4': 1, '5': 5, '10': 'share'},\n    {'1': 'now_rank', '3': 8, '4': 1, '5': 5, '10': 'nowRank'},\n    {'1': 'his_rank', '3': 9, '4': 1, '5': 5, '10': 'hisRank'},\n    {'1': 'like', '3': 10, '4': 1, '5': 5, '10': 'like'},\n    {'1': 'dislike', '3': 11, '4': 1, '5': 5, '10': 'dislike'},\n  ],\n};\n\n/// Descriptor for `Stat`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List statDescriptor = $convert.base64Decode(\n    'CgRTdGF0EhAKA2FpZBgBIAEoA1IDYWlkEhIKBHZpZXcYAiABKAVSBHZpZXcSGAoHZGFubWFrdR'\n    'gDIAEoBVIHZGFubWFrdRIUCgVyZXBseRgEIAEoBVIFcmVwbHkSEAoDZmF2GAUgASgFUgNmYXYS'\n    'EgoEY29pbhgGIAEoBVIEY29pbhIUCgVzaGFyZRgHIAEoBVIFc2hhcmUSGQoIbm93X3JhbmsYCC'\n    'ABKAVSB25vd1JhbmsSGQoIaGlzX3JhbmsYCSABKAVSB2hpc1JhbmsSEgoEbGlrZRgKIAEoBVIE'\n    'bGlrZRIYCgdkaXNsaWtlGAsgASgFUgdkaXNsaWtl');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/card/v1.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/card/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:fixnum/fixnum.dart' as $fixnum;\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nclass AdInfo extends $pb.GeneratedMessage {\n  factory AdInfo({\n    $fixnum.Int64? creativeId,\n    $core.int? creativeType,\n    $core.int? cardType,\n    CreativeContent? creativeContent,\n    $core.String? adCb,\n    $fixnum.Int64? resource,\n    $core.int? source,\n    $core.String? requestId,\n    $core.bool? isAd,\n    $fixnum.Int64? cmMark,\n    $core.int? index,\n    $core.bool? isAdLoc,\n    $core.int? cardIndex,\n    $core.String? clientIp,\n    $core.List<$core.int>? extra,\n    $core.int? creativeStyle,\n    $fixnum.Int64? natureAd,\n    $core.int? contentFastAccess,\n  }) {\n    final result = create();\n    if (creativeId != null) result.creativeId = creativeId;\n    if (creativeType != null) result.creativeType = creativeType;\n    if (cardType != null) result.cardType = cardType;\n    if (creativeContent != null) result.creativeContent = creativeContent;\n    if (adCb != null) result.adCb = adCb;\n    if (resource != null) result.resource = resource;\n    if (source != null) result.source = source;\n    if (requestId != null) result.requestId = requestId;\n    if (isAd != null) result.isAd = isAd;\n    if (cmMark != null) result.cmMark = cmMark;\n    if (index != null) result.index = index;\n    if (isAdLoc != null) result.isAdLoc = isAdLoc;\n    if (cardIndex != null) result.cardIndex = cardIndex;\n    if (clientIp != null) result.clientIp = clientIp;\n    if (extra != null) result.extra = extra;\n    if (creativeStyle != null) result.creativeStyle = creativeStyle;\n    if (natureAd != null) result.natureAd = natureAd;\n    if (contentFastAccess != null) result.contentFastAccess = contentFastAccess;\n    return result;\n  }\n\n  AdInfo._();\n\n  factory AdInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AdInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AdInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'creativeId')\n    ..aI(2, _omitFieldNames ? '' : 'creativeType')\n    ..aI(3, _omitFieldNames ? '' : 'cardType')\n    ..aOM<CreativeContent>(4, _omitFieldNames ? '' : 'creativeContent',\n        subBuilder: CreativeContent.create)\n    ..aOS(5, _omitFieldNames ? '' : 'adCb')\n    ..aInt64(6, _omitFieldNames ? '' : 'resource')\n    ..aI(7, _omitFieldNames ? '' : 'source')\n    ..aOS(8, _omitFieldNames ? '' : 'requestId')\n    ..aOB(9, _omitFieldNames ? '' : 'isAd')\n    ..aInt64(10, _omitFieldNames ? '' : 'cmMark')\n    ..aI(11, _omitFieldNames ? '' : 'index')\n    ..aOB(12, _omitFieldNames ? '' : 'isAdLoc')\n    ..aI(13, _omitFieldNames ? '' : 'cardIndex')\n    ..aOS(14, _omitFieldNames ? '' : 'clientIp')\n    ..a<$core.List<$core.int>>(\n        15, _omitFieldNames ? '' : 'extra', $pb.PbFieldType.OY)\n    ..aI(16, _omitFieldNames ? '' : 'creativeStyle')\n    ..aInt64(17, _omitFieldNames ? '' : 'natureAd')\n    ..aI(18, _omitFieldNames ? '' : 'contentFastAccess')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdInfo copyWith(void Function(AdInfo) updates) =>\n      super.copyWith((message) => updates(message as AdInfo)) as AdInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AdInfo create() => AdInfo._();\n  @$core.override\n  AdInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AdInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<AdInfo>(create);\n  static AdInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get creativeId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set creativeId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCreativeId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCreativeId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get creativeType => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set creativeType($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCreativeType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCreativeType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get cardType => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set cardType($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCardType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCardType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  CreativeContent get creativeContent => $_getN(3);\n  @$pb.TagNumber(4)\n  set creativeContent(CreativeContent value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCreativeContent() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCreativeContent() => $_clearField(4);\n  @$pb.TagNumber(4)\n  CreativeContent ensureCreativeContent() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.String get adCb => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set adCb($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasAdCb() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearAdCb() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get resource => $_getI64(5);\n  @$pb.TagNumber(6)\n  set resource($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasResource() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearResource() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get source => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set source($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasSource() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearSource() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get requestId => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set requestId($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasRequestId() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearRequestId() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.bool get isAd => $_getBF(8);\n  @$pb.TagNumber(9)\n  set isAd($core.bool value) => $_setBool(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasIsAd() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearIsAd() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $fixnum.Int64 get cmMark => $_getI64(9);\n  @$pb.TagNumber(10)\n  set cmMark($fixnum.Int64 value) => $_setInt64(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasCmMark() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearCmMark() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.int get index => $_getIZ(10);\n  @$pb.TagNumber(11)\n  set index($core.int value) => $_setSignedInt32(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasIndex() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearIndex() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.bool get isAdLoc => $_getBF(11);\n  @$pb.TagNumber(12)\n  set isAdLoc($core.bool value) => $_setBool(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasIsAdLoc() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearIsAdLoc() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.int get cardIndex => $_getIZ(12);\n  @$pb.TagNumber(13)\n  set cardIndex($core.int value) => $_setSignedInt32(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasCardIndex() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearCardIndex() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.String get clientIp => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set clientIp($core.String value) => $_setString(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasClientIp() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearClientIp() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $core.List<$core.int> get extra => $_getN(14);\n  @$pb.TagNumber(15)\n  set extra($core.List<$core.int> value) => $_setBytes(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasExtra() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearExtra() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $core.int get creativeStyle => $_getIZ(15);\n  @$pb.TagNumber(16)\n  set creativeStyle($core.int value) => $_setSignedInt32(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasCreativeStyle() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearCreativeStyle() => $_clearField(16);\n\n  @$pb.TagNumber(17)\n  $fixnum.Int64 get natureAd => $_getI64(16);\n  @$pb.TagNumber(17)\n  set natureAd($fixnum.Int64 value) => $_setInt64(16, value);\n  @$pb.TagNumber(17)\n  $core.bool hasNatureAd() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearNatureAd() => $_clearField(17);\n\n  @$pb.TagNumber(18)\n  $core.int get contentFastAccess => $_getIZ(17);\n  @$pb.TagNumber(18)\n  set contentFastAccess($core.int value) => $_setSignedInt32(17, value);\n  @$pb.TagNumber(18)\n  $core.bool hasContentFastAccess() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearContentFastAccess() => $_clearField(18);\n}\n\nclass Args extends $pb.GeneratedMessage {\n  factory Args({\n    $core.int? type,\n    $fixnum.Int64? upId,\n    $core.String? upName,\n    $core.int? rid,\n    $core.String? rname,\n    $fixnum.Int64? tid,\n    $core.String? tname,\n    $core.String? trackId,\n    $core.String? state,\n    $core.int? convergeType,\n    $fixnum.Int64? aid,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (upId != null) result.upId = upId;\n    if (upName != null) result.upName = upName;\n    if (rid != null) result.rid = rid;\n    if (rname != null) result.rname = rname;\n    if (tid != null) result.tid = tid;\n    if (tname != null) result.tname = tname;\n    if (trackId != null) result.trackId = trackId;\n    if (state != null) result.state = state;\n    if (convergeType != null) result.convergeType = convergeType;\n    if (aid != null) result.aid = aid;\n    return result;\n  }\n\n  Args._();\n\n  factory Args.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Args.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Args',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'type')\n    ..aInt64(2, _omitFieldNames ? '' : 'upId')\n    ..aOS(3, _omitFieldNames ? '' : 'upName')\n    ..aI(4, _omitFieldNames ? '' : 'rid')\n    ..aOS(5, _omitFieldNames ? '' : 'rname')\n    ..aInt64(6, _omitFieldNames ? '' : 'tid')\n    ..aOS(7, _omitFieldNames ? '' : 'tname')\n    ..aOS(8, _omitFieldNames ? '' : 'trackId')\n    ..aOS(9, _omitFieldNames ? '' : 'state')\n    ..aI(10, _omitFieldNames ? '' : 'convergeType')\n    ..aInt64(11, _omitFieldNames ? '' : 'aid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Args clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Args copyWith(void Function(Args) updates) =>\n      super.copyWith((message) => updates(message as Args)) as Args;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Args create() => Args._();\n  @$core.override\n  Args createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Args getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Args>(create);\n  static Args? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get type => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set type($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get upId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set upId($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUpId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUpId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get upName => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set upName($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUpName() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUpName() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get rid => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set rid($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasRid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearRid() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get rname => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set rname($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasRname() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearRname() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get tid => $_getI64(5);\n  @$pb.TagNumber(6)\n  set tid($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasTid() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearTid() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get tname => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set tname($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasTname() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearTname() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get trackId => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set trackId($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasTrackId() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearTrackId() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get state => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set state($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasState() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearState() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.int get convergeType => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set convergeType($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasConvergeType() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearConvergeType() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $fixnum.Int64 get aid => $_getI64(10);\n  @$pb.TagNumber(11)\n  set aid($fixnum.Int64 value) => $_setInt64(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasAid() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearAid() => $_clearField(11);\n}\n\nclass Avatar extends $pb.GeneratedMessage {\n  factory Avatar({\n    $core.String? cover,\n    $core.String? text,\n    $core.String? uri,\n    $core.int? type,\n    $core.String? event,\n    $core.String? eventV2,\n    $core.int? defalutCover,\n  }) {\n    final result = create();\n    if (cover != null) result.cover = cover;\n    if (text != null) result.text = text;\n    if (uri != null) result.uri = uri;\n    if (type != null) result.type = type;\n    if (event != null) result.event = event;\n    if (eventV2 != null) result.eventV2 = eventV2;\n    if (defalutCover != null) result.defalutCover = defalutCover;\n    return result;\n  }\n\n  Avatar._();\n\n  factory Avatar.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Avatar.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Avatar',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'cover')\n    ..aOS(2, _omitFieldNames ? '' : 'text')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..aI(4, _omitFieldNames ? '' : 'type')\n    ..aOS(5, _omitFieldNames ? '' : 'event')\n    ..aOS(6, _omitFieldNames ? '' : 'eventV2')\n    ..aI(7, _omitFieldNames ? '' : 'defalutCover')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Avatar clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Avatar copyWith(void Function(Avatar) updates) =>\n      super.copyWith((message) => updates(message as Avatar)) as Avatar;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Avatar create() => Avatar._();\n  @$core.override\n  Avatar createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Avatar getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Avatar>(create);\n  static Avatar? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get cover => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set cover($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCover() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCover() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get type => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set type($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearType() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get event => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set event($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasEvent() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearEvent() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get eventV2 => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set eventV2($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasEventV2() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearEventV2() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get defalutCover => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set defalutCover($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasDefalutCover() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearDefalutCover() => $_clearField(7);\n}\n\nclass Base extends $pb.GeneratedMessage {\n  factory Base({\n    $core.String? cardType,\n    $core.String? cardGoto,\n    $core.String? goto,\n    $core.String? param,\n    $core.String? cover,\n    $core.String? title,\n    $core.String? uri,\n    ThreePoint? threePoint,\n    Args? args,\n    PlayerArgs? playerArgs,\n    $fixnum.Int64? idx,\n    AdInfo? adInfo,\n    Mask? mask,\n    $core.String? fromType,\n    $core.Iterable<ThreePointV2>? threePointV2,\n    $core.Iterable<ThreePointV3>? threePointV3,\n    Button? descButton,\n    ThreePointV4? threePointV4,\n    UpArgs? upArgs,\n    $core.String? trackId,\n  }) {\n    final result = create();\n    if (cardType != null) result.cardType = cardType;\n    if (cardGoto != null) result.cardGoto = cardGoto;\n    if (goto != null) result.goto = goto;\n    if (param != null) result.param = param;\n    if (cover != null) result.cover = cover;\n    if (title != null) result.title = title;\n    if (uri != null) result.uri = uri;\n    if (threePoint != null) result.threePoint = threePoint;\n    if (args != null) result.args = args;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    if (idx != null) result.idx = idx;\n    if (adInfo != null) result.adInfo = adInfo;\n    if (mask != null) result.mask = mask;\n    if (fromType != null) result.fromType = fromType;\n    if (threePointV2 != null) result.threePointV2.addAll(threePointV2);\n    if (threePointV3 != null) result.threePointV3.addAll(threePointV3);\n    if (descButton != null) result.descButton = descButton;\n    if (threePointV4 != null) result.threePointV4 = threePointV4;\n    if (upArgs != null) result.upArgs = upArgs;\n    if (trackId != null) result.trackId = trackId;\n    return result;\n  }\n\n  Base._();\n\n  factory Base.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Base.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Base',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'cardType')\n    ..aOS(2, _omitFieldNames ? '' : 'cardGoto')\n    ..aOS(3, _omitFieldNames ? '' : 'goto')\n    ..aOS(4, _omitFieldNames ? '' : 'param')\n    ..aOS(5, _omitFieldNames ? '' : 'cover')\n    ..aOS(6, _omitFieldNames ? '' : 'title')\n    ..aOS(7, _omitFieldNames ? '' : 'uri')\n    ..aOM<ThreePoint>(8, _omitFieldNames ? '' : 'threePoint',\n        subBuilder: ThreePoint.create)\n    ..aOM<Args>(9, _omitFieldNames ? '' : 'args', subBuilder: Args.create)\n    ..aOM<PlayerArgs>(10, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: PlayerArgs.create)\n    ..aInt64(11, _omitFieldNames ? '' : 'idx')\n    ..aOM<AdInfo>(12, _omitFieldNames ? '' : 'adInfo',\n        subBuilder: AdInfo.create)\n    ..aOM<Mask>(13, _omitFieldNames ? '' : 'mask', subBuilder: Mask.create)\n    ..aOS(14, _omitFieldNames ? '' : 'fromType')\n    ..pPM<ThreePointV2>(15, _omitFieldNames ? '' : 'threePointV2',\n        subBuilder: ThreePointV2.create)\n    ..pPM<ThreePointV3>(16, _omitFieldNames ? '' : 'threePointV3',\n        subBuilder: ThreePointV3.create)\n    ..aOM<Button>(17, _omitFieldNames ? '' : 'descButton',\n        subBuilder: Button.create)\n    ..aOM<ThreePointV4>(18, _omitFieldNames ? '' : 'threePointV4',\n        subBuilder: ThreePointV4.create)\n    ..aOM<UpArgs>(19, _omitFieldNames ? '' : 'upArgs',\n        subBuilder: UpArgs.create)\n    ..aOS(20, _omitFieldNames ? '' : 'trackId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Base clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Base copyWith(void Function(Base) updates) =>\n      super.copyWith((message) => updates(message as Base)) as Base;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Base create() => Base._();\n  @$core.override\n  Base createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Base getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Base>(create);\n  static Base? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get cardType => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set cardType($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCardType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCardType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get cardGoto => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cardGoto($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCardGoto() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCardGoto() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get goto => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set goto($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasGoto() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearGoto() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get param => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set param($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasParam() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearParam() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get cover => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set cover($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCover() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCover() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get title => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set title($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasTitle() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearTitle() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get uri => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set uri($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasUri() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearUri() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  ThreePoint get threePoint => $_getN(7);\n  @$pb.TagNumber(8)\n  set threePoint(ThreePoint value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasThreePoint() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearThreePoint() => $_clearField(8);\n  @$pb.TagNumber(8)\n  ThreePoint ensureThreePoint() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  Args get args => $_getN(8);\n  @$pb.TagNumber(9)\n  set args(Args value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasArgs() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearArgs() => $_clearField(9);\n  @$pb.TagNumber(9)\n  Args ensureArgs() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  PlayerArgs get playerArgs => $_getN(9);\n  @$pb.TagNumber(10)\n  set playerArgs(PlayerArgs value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasPlayerArgs() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearPlayerArgs() => $_clearField(10);\n  @$pb.TagNumber(10)\n  PlayerArgs ensurePlayerArgs() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  $fixnum.Int64 get idx => $_getI64(10);\n  @$pb.TagNumber(11)\n  set idx($fixnum.Int64 value) => $_setInt64(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasIdx() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearIdx() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  AdInfo get adInfo => $_getN(11);\n  @$pb.TagNumber(12)\n  set adInfo(AdInfo value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasAdInfo() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearAdInfo() => $_clearField(12);\n  @$pb.TagNumber(12)\n  AdInfo ensureAdInfo() => $_ensure(11);\n\n  @$pb.TagNumber(13)\n  Mask get mask => $_getN(12);\n  @$pb.TagNumber(13)\n  set mask(Mask value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasMask() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearMask() => $_clearField(13);\n  @$pb.TagNumber(13)\n  Mask ensureMask() => $_ensure(12);\n\n  @$pb.TagNumber(14)\n  $core.String get fromType => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set fromType($core.String value) => $_setString(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasFromType() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearFromType() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $pb.PbList<ThreePointV2> get threePointV2 => $_getList(14);\n\n  @$pb.TagNumber(16)\n  $pb.PbList<ThreePointV3> get threePointV3 => $_getList(15);\n\n  @$pb.TagNumber(17)\n  Button get descButton => $_getN(16);\n  @$pb.TagNumber(17)\n  set descButton(Button value) => $_setField(17, value);\n  @$pb.TagNumber(17)\n  $core.bool hasDescButton() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearDescButton() => $_clearField(17);\n  @$pb.TagNumber(17)\n  Button ensureDescButton() => $_ensure(16);\n\n  @$pb.TagNumber(18)\n  ThreePointV4 get threePointV4 => $_getN(17);\n  @$pb.TagNumber(18)\n  set threePointV4(ThreePointV4 value) => $_setField(18, value);\n  @$pb.TagNumber(18)\n  $core.bool hasThreePointV4() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearThreePointV4() => $_clearField(18);\n  @$pb.TagNumber(18)\n  ThreePointV4 ensureThreePointV4() => $_ensure(17);\n\n  @$pb.TagNumber(19)\n  UpArgs get upArgs => $_getN(18);\n  @$pb.TagNumber(19)\n  set upArgs(UpArgs value) => $_setField(19, value);\n  @$pb.TagNumber(19)\n  $core.bool hasUpArgs() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearUpArgs() => $_clearField(19);\n  @$pb.TagNumber(19)\n  UpArgs ensureUpArgs() => $_ensure(18);\n\n  @$pb.TagNumber(20)\n  $core.String get trackId => $_getSZ(19);\n  @$pb.TagNumber(20)\n  set trackId($core.String value) => $_setString(19, value);\n  @$pb.TagNumber(20)\n  $core.bool hasTrackId() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearTrackId() => $_clearField(20);\n}\n\nclass Bubble extends $pb.GeneratedMessage {\n  factory Bubble({\n    $core.String? bubbleContent,\n    $core.int? version,\n    $fixnum.Int64? stime,\n  }) {\n    final result = create();\n    if (bubbleContent != null) result.bubbleContent = bubbleContent;\n    if (version != null) result.version = version;\n    if (stime != null) result.stime = stime;\n    return result;\n  }\n\n  Bubble._();\n\n  factory Bubble.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Bubble.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Bubble',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'bubbleContent')\n    ..aI(2, _omitFieldNames ? '' : 'version')\n    ..aInt64(3, _omitFieldNames ? '' : 'stime')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Bubble clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Bubble copyWith(void Function(Bubble) updates) =>\n      super.copyWith((message) => updates(message as Bubble)) as Bubble;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Bubble create() => Bubble._();\n  @$core.override\n  Bubble createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Bubble getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Bubble>(create);\n  static Bubble? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get bubbleContent => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set bubbleContent($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBubbleContent() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBubbleContent() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get version => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set version($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasVersion() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearVersion() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get stime => $_getI64(2);\n  @$pb.TagNumber(3)\n  set stime($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasStime() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearStime() => $_clearField(3);\n}\n\nclass Button extends $pb.GeneratedMessage {\n  factory Button({\n    $core.String? text,\n    $core.String? param,\n    $core.String? uri,\n    $core.String? event,\n    $core.int? selected,\n    $core.int? type,\n    $core.String? eventV2,\n    Relation? relation,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (param != null) result.param = param;\n    if (uri != null) result.uri = uri;\n    if (event != null) result.event = event;\n    if (selected != null) result.selected = selected;\n    if (type != null) result.type = type;\n    if (eventV2 != null) result.eventV2 = eventV2;\n    if (relation != null) result.relation = relation;\n    return result;\n  }\n\n  Button._();\n\n  factory Button.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Button.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Button',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aOS(2, _omitFieldNames ? '' : 'param')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..aOS(4, _omitFieldNames ? '' : 'event')\n    ..aI(5, _omitFieldNames ? '' : 'selected')\n    ..aI(6, _omitFieldNames ? '' : 'type')\n    ..aOS(7, _omitFieldNames ? '' : 'eventV2')\n    ..aOM<Relation>(8, _omitFieldNames ? '' : 'relation',\n        subBuilder: Relation.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Button clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Button copyWith(void Function(Button) updates) =>\n      super.copyWith((message) => updates(message as Button)) as Button;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Button create() => Button._();\n  @$core.override\n  Button createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Button getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Button>(create);\n  static Button? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get param => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set param($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasParam() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearParam() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get event => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set event($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasEvent() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearEvent() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get selected => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set selected($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasSelected() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearSelected() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get type => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set type($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasType() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearType() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get eventV2 => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set eventV2($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasEventV2() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearEventV2() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  Relation get relation => $_getN(7);\n  @$pb.TagNumber(8)\n  set relation(Relation value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasRelation() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearRelation() => $_clearField(8);\n  @$pb.TagNumber(8)\n  Relation ensureRelation() => $_ensure(7);\n}\n\nenum Card_Item {\n  smallCoverV5,\n  largeCoverV1,\n  threeItemAllV2,\n  threeItemV1,\n  hotTopic,\n  threeItemHV5,\n  middleCoverV3,\n  largeCoverV4,\n  popularTopEntrance,\n  rcmdOneItem,\n  smallCoverV5Ad,\n  topicList,\n  notSet\n}\n\nclass Card extends $pb.GeneratedMessage {\n  factory Card({\n    SmallCoverV5? smallCoverV5,\n    LargeCoverV1? largeCoverV1,\n    ThreeItemAllV2? threeItemAllV2,\n    ThreeItemV1? threeItemV1,\n    HotTopic? hotTopic,\n    DynamicHot? threeItemHV5,\n    MiddleCoverV3? middleCoverV3,\n    LargeCoverV4? largeCoverV4,\n    PopularTopEntrance? popularTopEntrance,\n    RcmdOneItem? rcmdOneItem,\n    SmallCoverV5Ad? smallCoverV5Ad,\n    TopicList? topicList,\n  }) {\n    final result = create();\n    if (smallCoverV5 != null) result.smallCoverV5 = smallCoverV5;\n    if (largeCoverV1 != null) result.largeCoverV1 = largeCoverV1;\n    if (threeItemAllV2 != null) result.threeItemAllV2 = threeItemAllV2;\n    if (threeItemV1 != null) result.threeItemV1 = threeItemV1;\n    if (hotTopic != null) result.hotTopic = hotTopic;\n    if (threeItemHV5 != null) result.threeItemHV5 = threeItemHV5;\n    if (middleCoverV3 != null) result.middleCoverV3 = middleCoverV3;\n    if (largeCoverV4 != null) result.largeCoverV4 = largeCoverV4;\n    if (popularTopEntrance != null)\n      result.popularTopEntrance = popularTopEntrance;\n    if (rcmdOneItem != null) result.rcmdOneItem = rcmdOneItem;\n    if (smallCoverV5Ad != null) result.smallCoverV5Ad = smallCoverV5Ad;\n    if (topicList != null) result.topicList = topicList;\n    return result;\n  }\n\n  Card._();\n\n  factory Card.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Card.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, Card_Item> _Card_ItemByTag = {\n    1: Card_Item.smallCoverV5,\n    2: Card_Item.largeCoverV1,\n    3: Card_Item.threeItemAllV2,\n    4: Card_Item.threeItemV1,\n    5: Card_Item.hotTopic,\n    6: Card_Item.threeItemHV5,\n    7: Card_Item.middleCoverV3,\n    8: Card_Item.largeCoverV4,\n    9: Card_Item.popularTopEntrance,\n    10: Card_Item.rcmdOneItem,\n    11: Card_Item.smallCoverV5Ad,\n    12: Card_Item.topicList,\n    0: Card_Item.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Card',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])\n    ..aOM<SmallCoverV5>(1, _omitFieldNames ? '' : 'smallCoverV5',\n        subBuilder: SmallCoverV5.create)\n    ..aOM<LargeCoverV1>(2, _omitFieldNames ? '' : 'largeCoverV1',\n        subBuilder: LargeCoverV1.create)\n    ..aOM<ThreeItemAllV2>(3, _omitFieldNames ? '' : 'threeItemAllV2',\n        subBuilder: ThreeItemAllV2.create)\n    ..aOM<ThreeItemV1>(4, _omitFieldNames ? '' : 'threeItemV1',\n        subBuilder: ThreeItemV1.create)\n    ..aOM<HotTopic>(5, _omitFieldNames ? '' : 'hotTopic',\n        subBuilder: HotTopic.create)\n    ..aOM<DynamicHot>(6, _omitFieldNames ? '' : 'threeItemHV5',\n        subBuilder: DynamicHot.create)\n    ..aOM<MiddleCoverV3>(7, _omitFieldNames ? '' : 'middleCoverV3',\n        subBuilder: MiddleCoverV3.create)\n    ..aOM<LargeCoverV4>(8, _omitFieldNames ? '' : 'largeCoverV4',\n        subBuilder: LargeCoverV4.create)\n    ..aOM<PopularTopEntrance>(9, _omitFieldNames ? '' : 'popularTopEntrance',\n        subBuilder: PopularTopEntrance.create)\n    ..aOM<RcmdOneItem>(10, _omitFieldNames ? '' : 'rcmdOneItem',\n        subBuilder: RcmdOneItem.create)\n    ..aOM<SmallCoverV5Ad>(11, _omitFieldNames ? '' : 'smallCoverV5Ad',\n        subBuilder: SmallCoverV5Ad.create)\n    ..aOM<TopicList>(12, _omitFieldNames ? '' : 'topicList',\n        subBuilder: TopicList.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Card clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Card copyWith(void Function(Card) updates) =>\n      super.copyWith((message) => updates(message as Card)) as Card;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Card create() => Card._();\n  @$core.override\n  Card createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Card getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Card>(create);\n  static Card? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(7)\n  @$pb.TagNumber(8)\n  @$pb.TagNumber(9)\n  @$pb.TagNumber(10)\n  @$pb.TagNumber(11)\n  @$pb.TagNumber(12)\n  Card_Item whichItem() => _Card_ItemByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(1)\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(7)\n  @$pb.TagNumber(8)\n  @$pb.TagNumber(9)\n  @$pb.TagNumber(10)\n  @$pb.TagNumber(11)\n  @$pb.TagNumber(12)\n  void clearItem() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  SmallCoverV5 get smallCoverV5 => $_getN(0);\n  @$pb.TagNumber(1)\n  set smallCoverV5(SmallCoverV5 value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSmallCoverV5() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSmallCoverV5() => $_clearField(1);\n  @$pb.TagNumber(1)\n  SmallCoverV5 ensureSmallCoverV5() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  LargeCoverV1 get largeCoverV1 => $_getN(1);\n  @$pb.TagNumber(2)\n  set largeCoverV1(LargeCoverV1 value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLargeCoverV1() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLargeCoverV1() => $_clearField(2);\n  @$pb.TagNumber(2)\n  LargeCoverV1 ensureLargeCoverV1() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  ThreeItemAllV2 get threeItemAllV2 => $_getN(2);\n  @$pb.TagNumber(3)\n  set threeItemAllV2(ThreeItemAllV2 value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasThreeItemAllV2() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearThreeItemAllV2() => $_clearField(3);\n  @$pb.TagNumber(3)\n  ThreeItemAllV2 ensureThreeItemAllV2() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  ThreeItemV1 get threeItemV1 => $_getN(3);\n  @$pb.TagNumber(4)\n  set threeItemV1(ThreeItemV1 value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasThreeItemV1() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearThreeItemV1() => $_clearField(4);\n  @$pb.TagNumber(4)\n  ThreeItemV1 ensureThreeItemV1() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  HotTopic get hotTopic => $_getN(4);\n  @$pb.TagNumber(5)\n  set hotTopic(HotTopic value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasHotTopic() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearHotTopic() => $_clearField(5);\n  @$pb.TagNumber(5)\n  HotTopic ensureHotTopic() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  DynamicHot get threeItemHV5 => $_getN(5);\n  @$pb.TagNumber(6)\n  set threeItemHV5(DynamicHot value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasThreeItemHV5() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearThreeItemHV5() => $_clearField(6);\n  @$pb.TagNumber(6)\n  DynamicHot ensureThreeItemHV5() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  MiddleCoverV3 get middleCoverV3 => $_getN(6);\n  @$pb.TagNumber(7)\n  set middleCoverV3(MiddleCoverV3 value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasMiddleCoverV3() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearMiddleCoverV3() => $_clearField(7);\n  @$pb.TagNumber(7)\n  MiddleCoverV3 ensureMiddleCoverV3() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  LargeCoverV4 get largeCoverV4 => $_getN(7);\n  @$pb.TagNumber(8)\n  set largeCoverV4(LargeCoverV4 value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasLargeCoverV4() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearLargeCoverV4() => $_clearField(8);\n  @$pb.TagNumber(8)\n  LargeCoverV4 ensureLargeCoverV4() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  PopularTopEntrance get popularTopEntrance => $_getN(8);\n  @$pb.TagNumber(9)\n  set popularTopEntrance(PopularTopEntrance value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasPopularTopEntrance() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearPopularTopEntrance() => $_clearField(9);\n  @$pb.TagNumber(9)\n  PopularTopEntrance ensurePopularTopEntrance() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  RcmdOneItem get rcmdOneItem => $_getN(9);\n  @$pb.TagNumber(10)\n  set rcmdOneItem(RcmdOneItem value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasRcmdOneItem() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearRcmdOneItem() => $_clearField(10);\n  @$pb.TagNumber(10)\n  RcmdOneItem ensureRcmdOneItem() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  SmallCoverV5Ad get smallCoverV5Ad => $_getN(10);\n  @$pb.TagNumber(11)\n  set smallCoverV5Ad(SmallCoverV5Ad value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasSmallCoverV5Ad() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearSmallCoverV5Ad() => $_clearField(11);\n  @$pb.TagNumber(11)\n  SmallCoverV5Ad ensureSmallCoverV5Ad() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  TopicList get topicList => $_getN(11);\n  @$pb.TagNumber(12)\n  set topicList(TopicList value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasTopicList() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearTopicList() => $_clearField(12);\n  @$pb.TagNumber(12)\n  TopicList ensureTopicList() => $_ensure(11);\n}\n\nclass CreativeContent extends $pb.GeneratedMessage {\n  factory CreativeContent({\n    $core.String? title,\n    $core.String? description,\n    $fixnum.Int64? videoId,\n    $core.String? username,\n    $core.String? imageUrl,\n    $core.String? imageMd5,\n    $core.String? logUrl,\n    $core.String? logMd5,\n    $core.String? url,\n    $core.String? clickUrl,\n    $core.String? showUrl,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (description != null) result.description = description;\n    if (videoId != null) result.videoId = videoId;\n    if (username != null) result.username = username;\n    if (imageUrl != null) result.imageUrl = imageUrl;\n    if (imageMd5 != null) result.imageMd5 = imageMd5;\n    if (logUrl != null) result.logUrl = logUrl;\n    if (logMd5 != null) result.logMd5 = logMd5;\n    if (url != null) result.url = url;\n    if (clickUrl != null) result.clickUrl = clickUrl;\n    if (showUrl != null) result.showUrl = showUrl;\n    return result;\n  }\n\n  CreativeContent._();\n\n  factory CreativeContent.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CreativeContent.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CreativeContent',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'description')\n    ..aInt64(3, _omitFieldNames ? '' : 'videoId')\n    ..aOS(4, _omitFieldNames ? '' : 'username')\n    ..aOS(5, _omitFieldNames ? '' : 'imageUrl')\n    ..aOS(6, _omitFieldNames ? '' : 'imageMd5')\n    ..aOS(7, _omitFieldNames ? '' : 'logUrl')\n    ..aOS(8, _omitFieldNames ? '' : 'logMd5')\n    ..aOS(9, _omitFieldNames ? '' : 'url')\n    ..aOS(10, _omitFieldNames ? '' : 'clickUrl')\n    ..aOS(11, _omitFieldNames ? '' : 'showUrl')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CreativeContent clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CreativeContent copyWith(void Function(CreativeContent) updates) =>\n      super.copyWith((message) => updates(message as CreativeContent))\n          as CreativeContent;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CreativeContent create() => CreativeContent._();\n  @$core.override\n  CreativeContent createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CreativeContent getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CreativeContent>(create);\n  static CreativeContent? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get description => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set description($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDescription() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDescription() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get videoId => $_getI64(2);\n  @$pb.TagNumber(3)\n  set videoId($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasVideoId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearVideoId() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get username => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set username($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUsername() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUsername() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get imageUrl => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set imageUrl($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasImageUrl() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearImageUrl() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get imageMd5 => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set imageMd5($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasImageMd5() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearImageMd5() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get logUrl => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set logUrl($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasLogUrl() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearLogUrl() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get logMd5 => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set logMd5($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasLogMd5() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearLogMd5() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get url => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set url($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasUrl() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearUrl() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get clickUrl => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set clickUrl($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasClickUrl() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearClickUrl() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get showUrl => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set showUrl($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasShowUrl() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearShowUrl() => $_clearField(11);\n}\n\nclass DislikeReason extends $pb.GeneratedMessage {\n  factory DislikeReason({\n    $fixnum.Int64? id,\n    $core.String? name,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (name != null) result.name = name;\n    return result;\n  }\n\n  DislikeReason._();\n\n  factory DislikeReason.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DislikeReason.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DislikeReason',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DislikeReason clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DislikeReason copyWith(void Function(DislikeReason) updates) =>\n      super.copyWith((message) => updates(message as DislikeReason))\n          as DislikeReason;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DislikeReason create() => DislikeReason._();\n  @$core.override\n  DislikeReason createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DislikeReason getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DislikeReason>(create);\n  static DislikeReason? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n}\n\nenum DoubleCards_Card { smallCoverV2, onePicV2, threePicV2, notSet }\n\nclass DoubleCards extends $pb.GeneratedMessage {\n  factory DoubleCards({\n    SmallCoverV2? smallCoverV2,\n    OnePicV2? onePicV2,\n    ThreePicV2? threePicV2,\n  }) {\n    final result = create();\n    if (smallCoverV2 != null) result.smallCoverV2 = smallCoverV2;\n    if (onePicV2 != null) result.onePicV2 = onePicV2;\n    if (threePicV2 != null) result.threePicV2 = threePicV2;\n    return result;\n  }\n\n  DoubleCards._();\n\n  factory DoubleCards.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DoubleCards.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, DoubleCards_Card> _DoubleCards_CardByTag = {\n    1: DoubleCards_Card.smallCoverV2,\n    2: DoubleCards_Card.onePicV2,\n    3: DoubleCards_Card.threePicV2,\n    0: DoubleCards_Card.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DoubleCards',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [1, 2, 3])\n    ..aOM<SmallCoverV2>(1, _omitFieldNames ? '' : 'smallCoverV2',\n        subBuilder: SmallCoverV2.create)\n    ..aOM<OnePicV2>(2, _omitFieldNames ? '' : 'onePicV2',\n        subBuilder: OnePicV2.create)\n    ..aOM<ThreePicV2>(3, _omitFieldNames ? '' : 'threePicV2',\n        subBuilder: ThreePicV2.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DoubleCards clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DoubleCards copyWith(void Function(DoubleCards) updates) =>\n      super.copyWith((message) => updates(message as DoubleCards))\n          as DoubleCards;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DoubleCards create() => DoubleCards._();\n  @$core.override\n  DoubleCards createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DoubleCards getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DoubleCards>(create);\n  static DoubleCards? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  DoubleCards_Card whichCard() => _DoubleCards_CardByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(1)\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  void clearCard() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  SmallCoverV2 get smallCoverV2 => $_getN(0);\n  @$pb.TagNumber(1)\n  set smallCoverV2(SmallCoverV2 value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSmallCoverV2() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSmallCoverV2() => $_clearField(1);\n  @$pb.TagNumber(1)\n  SmallCoverV2 ensureSmallCoverV2() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  OnePicV2 get onePicV2 => $_getN(1);\n  @$pb.TagNumber(2)\n  set onePicV2(OnePicV2 value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOnePicV2() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOnePicV2() => $_clearField(2);\n  @$pb.TagNumber(2)\n  OnePicV2 ensureOnePicV2() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  ThreePicV2 get threePicV2 => $_getN(2);\n  @$pb.TagNumber(3)\n  set threePicV2(ThreePicV2 value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasThreePicV2() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearThreePicV2() => $_clearField(3);\n  @$pb.TagNumber(3)\n  ThreePicV2 ensureThreePicV2() => $_ensure(2);\n}\n\nclass DynamicHot extends $pb.GeneratedMessage {\n  factory DynamicHot({\n    Base? base,\n    $core.String? topLeftTitle,\n    $core.String? desc1,\n    $core.String? desc2,\n    $core.String? moreUri,\n    $core.String? moreText,\n    $core.Iterable<$core.String>? covers,\n    $core.String? coverRightText,\n    ReasonStyle? topRcmdReasonStyle,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (topLeftTitle != null) result.topLeftTitle = topLeftTitle;\n    if (desc1 != null) result.desc1 = desc1;\n    if (desc2 != null) result.desc2 = desc2;\n    if (moreUri != null) result.moreUri = moreUri;\n    if (moreText != null) result.moreText = moreText;\n    if (covers != null) result.covers.addAll(covers);\n    if (coverRightText != null) result.coverRightText = coverRightText;\n    if (topRcmdReasonStyle != null)\n      result.topRcmdReasonStyle = topRcmdReasonStyle;\n    return result;\n  }\n\n  DynamicHot._();\n\n  factory DynamicHot.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynamicHot.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynamicHot',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..aOS(2, _omitFieldNames ? '' : 'topLeftTitle')\n    ..aOS(3, _omitFieldNames ? '' : 'desc1')\n    ..aOS(4, _omitFieldNames ? '' : 'desc2')\n    ..aOS(5, _omitFieldNames ? '' : 'moreUri')\n    ..aOS(6, _omitFieldNames ? '' : 'moreText')\n    ..pPS(7, _omitFieldNames ? '' : 'covers')\n    ..aOS(8, _omitFieldNames ? '' : 'coverRightText')\n    ..aOM<ReasonStyle>(9, _omitFieldNames ? '' : 'topRcmdReasonStyle',\n        subBuilder: ReasonStyle.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynamicHot clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynamicHot copyWith(void Function(DynamicHot) updates) =>\n      super.copyWith((message) => updates(message as DynamicHot)) as DynamicHot;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynamicHot create() => DynamicHot._();\n  @$core.override\n  DynamicHot createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynamicHot getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynamicHot>(create);\n  static DynamicHot? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get topLeftTitle => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set topLeftTitle($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTopLeftTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTopLeftTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get desc1 => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set desc1($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDesc1() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDesc1() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get desc2 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set desc2($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDesc2() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDesc2() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get moreUri => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set moreUri($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasMoreUri() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearMoreUri() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get moreText => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set moreText($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasMoreText() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearMoreText() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $pb.PbList<$core.String> get covers => $_getList(6);\n\n  @$pb.TagNumber(8)\n  $core.String get coverRightText => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set coverRightText($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasCoverRightText() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearCoverRightText() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  ReasonStyle get topRcmdReasonStyle => $_getN(8);\n  @$pb.TagNumber(9)\n  set topRcmdReasonStyle(ReasonStyle value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasTopRcmdReasonStyle() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearTopRcmdReasonStyle() => $_clearField(9);\n  @$pb.TagNumber(9)\n  ReasonStyle ensureTopRcmdReasonStyle() => $_ensure(8);\n}\n\nclass EntranceItem extends $pb.GeneratedMessage {\n  factory EntranceItem({\n    $core.String? goto,\n    $core.String? icon,\n    $core.String? title,\n    $core.String? moduleId,\n    $core.String? uri,\n    $fixnum.Int64? entranceId,\n    Bubble? bubble,\n    $core.int? entranceType,\n  }) {\n    final result = create();\n    if (goto != null) result.goto = goto;\n    if (icon != null) result.icon = icon;\n    if (title != null) result.title = title;\n    if (moduleId != null) result.moduleId = moduleId;\n    if (uri != null) result.uri = uri;\n    if (entranceId != null) result.entranceId = entranceId;\n    if (bubble != null) result.bubble = bubble;\n    if (entranceType != null) result.entranceType = entranceType;\n    return result;\n  }\n\n  EntranceItem._();\n\n  factory EntranceItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory EntranceItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'EntranceItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'goto')\n    ..aOS(2, _omitFieldNames ? '' : 'icon')\n    ..aOS(3, _omitFieldNames ? '' : 'title')\n    ..aOS(4, _omitFieldNames ? '' : 'moduleId')\n    ..aOS(5, _omitFieldNames ? '' : 'uri')\n    ..aInt64(6, _omitFieldNames ? '' : 'entranceId')\n    ..aOM<Bubble>(7, _omitFieldNames ? '' : 'bubble', subBuilder: Bubble.create)\n    ..aI(8, _omitFieldNames ? '' : 'entranceType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  EntranceItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  EntranceItem copyWith(void Function(EntranceItem) updates) =>\n      super.copyWith((message) => updates(message as EntranceItem))\n          as EntranceItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static EntranceItem create() => EntranceItem._();\n  @$core.override\n  EntranceItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static EntranceItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<EntranceItem>(create);\n  static EntranceItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get goto => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set goto($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasGoto() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearGoto() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get icon => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set icon($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIcon() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIcon() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get title => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set title($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get moduleId => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set moduleId($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasModuleId() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearModuleId() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get uri => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set uri($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasUri() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearUri() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get entranceId => $_getI64(5);\n  @$pb.TagNumber(6)\n  set entranceId($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasEntranceId() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearEntranceId() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  Bubble get bubble => $_getN(6);\n  @$pb.TagNumber(7)\n  set bubble(Bubble value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBubble() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBubble() => $_clearField(7);\n  @$pb.TagNumber(7)\n  Bubble ensureBubble() => $_ensure(6);\n\n  /// 入口类型\n  ///\n  /// - 1: 分品类热门\n  @$pb.TagNumber(8)\n  $core.int get entranceType => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set entranceType($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasEntranceType() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearEntranceType() => $_clearField(8);\n}\n\nclass FunctionalButton extends $pb.GeneratedMessage {\n  factory FunctionalButton({\n    $core.int? type,\n    $core.Iterable<FunctionalButtonMeta>? buttonMetas,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (buttonMetas != null) result.buttonMetas.addAll(buttonMetas);\n    return result;\n  }\n\n  FunctionalButton._();\n\n  factory FunctionalButton.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FunctionalButton.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FunctionalButton',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'type')\n    ..pPM<FunctionalButtonMeta>(2, _omitFieldNames ? '' : 'buttonMetas',\n        subBuilder: FunctionalButtonMeta.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FunctionalButton clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FunctionalButton copyWith(void Function(FunctionalButton) updates) =>\n      super.copyWith((message) => updates(message as FunctionalButton))\n          as FunctionalButton;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FunctionalButton create() => FunctionalButton._();\n  @$core.override\n  FunctionalButton createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FunctionalButton getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FunctionalButton>(create);\n  static FunctionalButton? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get type => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set type($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<FunctionalButtonMeta> get buttonMetas => $_getList(1);\n}\n\nclass FunctionalButtonMeta extends $pb.GeneratedMessage {\n  factory FunctionalButtonMeta({\n    $core.String? icon,\n    $core.String? text,\n    $core.String? buttonStatus,\n    $core.String? toast,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (text != null) result.text = text;\n    if (buttonStatus != null) result.buttonStatus = buttonStatus;\n    if (toast != null) result.toast = toast;\n    return result;\n  }\n\n  FunctionalButtonMeta._();\n\n  factory FunctionalButtonMeta.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FunctionalButtonMeta.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FunctionalButtonMeta',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'text')\n    ..aOS(3, _omitFieldNames ? '' : 'buttonStatus')\n    ..aOS(4, _omitFieldNames ? '' : 'toast')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FunctionalButtonMeta clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FunctionalButtonMeta copyWith(void Function(FunctionalButtonMeta) updates) =>\n      super.copyWith((message) => updates(message as FunctionalButtonMeta))\n          as FunctionalButtonMeta;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FunctionalButtonMeta create() => FunctionalButtonMeta._();\n  @$core.override\n  FunctionalButtonMeta createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FunctionalButtonMeta getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FunctionalButtonMeta>(create);\n  static FunctionalButtonMeta? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get buttonStatus => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set buttonStatus($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasButtonStatus() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearButtonStatus() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get toast => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set toast($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasToast() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearToast() => $_clearField(4);\n}\n\nclass HotTopic extends $pb.GeneratedMessage {\n  factory HotTopic({\n    Base? base,\n    $core.String? desc,\n    $core.Iterable<HotTopicItem>? items,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (desc != null) result.desc = desc;\n    if (items != null) result.items.addAll(items);\n    return result;\n  }\n\n  HotTopic._();\n\n  factory HotTopic.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory HotTopic.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'HotTopic',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..aOS(2, _omitFieldNames ? '' : 'desc')\n    ..pPM<HotTopicItem>(3, _omitFieldNames ? '' : 'items',\n        subBuilder: HotTopicItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  HotTopic clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  HotTopic copyWith(void Function(HotTopic) updates) =>\n      super.copyWith((message) => updates(message as HotTopic)) as HotTopic;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static HotTopic create() => HotTopic._();\n  @$core.override\n  HotTopic createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static HotTopic getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<HotTopic>(create);\n  static HotTopic? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get desc => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set desc($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDesc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDesc() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<HotTopicItem> get items => $_getList(2);\n}\n\nclass HotTopicItem extends $pb.GeneratedMessage {\n  factory HotTopicItem({\n    $core.String? cover,\n    $core.String? uri,\n    $core.String? param,\n    $core.String? name,\n  }) {\n    final result = create();\n    if (cover != null) result.cover = cover;\n    if (uri != null) result.uri = uri;\n    if (param != null) result.param = param;\n    if (name != null) result.name = name;\n    return result;\n  }\n\n  HotTopicItem._();\n\n  factory HotTopicItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory HotTopicItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'HotTopicItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'cover')\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..aOS(3, _omitFieldNames ? '' : 'param')\n    ..aOS(4, _omitFieldNames ? '' : 'name')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  HotTopicItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  HotTopicItem copyWith(void Function(HotTopicItem) updates) =>\n      super.copyWith((message) => updates(message as HotTopicItem))\n          as HotTopicItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static HotTopicItem create() => HotTopicItem._();\n  @$core.override\n  HotTopicItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static HotTopicItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<HotTopicItem>(create);\n  static HotTopicItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get cover => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set cover($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCover() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCover() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get param => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set param($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasParam() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearParam() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get name => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set name($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasName() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearName() => $_clearField(4);\n}\n\nclass HotwordEntrance extends $pb.GeneratedMessage {\n  factory HotwordEntrance({\n    $fixnum.Int64? hotwordId,\n    $core.String? hotText,\n    $core.String? h5Url,\n    $core.String? icon,\n  }) {\n    final result = create();\n    if (hotwordId != null) result.hotwordId = hotwordId;\n    if (hotText != null) result.hotText = hotText;\n    if (h5Url != null) result.h5Url = h5Url;\n    if (icon != null) result.icon = icon;\n    return result;\n  }\n\n  HotwordEntrance._();\n\n  factory HotwordEntrance.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory HotwordEntrance.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'HotwordEntrance',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'hotwordId')\n    ..aOS(2, _omitFieldNames ? '' : 'hotText')\n    ..aOS(3, _omitFieldNames ? '' : 'h5Url')\n    ..aOS(4, _omitFieldNames ? '' : 'icon')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  HotwordEntrance clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  HotwordEntrance copyWith(void Function(HotwordEntrance) updates) =>\n      super.copyWith((message) => updates(message as HotwordEntrance))\n          as HotwordEntrance;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static HotwordEntrance create() => HotwordEntrance._();\n  @$core.override\n  HotwordEntrance createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static HotwordEntrance getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<HotwordEntrance>(create);\n  static HotwordEntrance? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get hotwordId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set hotwordId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasHotwordId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearHotwordId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get hotText => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set hotText($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHotText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHotText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get h5Url => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set h5Url($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasH5Url() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearH5Url() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get icon => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set icon($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIcon() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIcon() => $_clearField(4);\n}\n\nclass InlineProgressBar extends $pb.GeneratedMessage {\n  factory InlineProgressBar({\n    $core.String? iconDrag,\n    $core.String? iconDragHash,\n    $core.String? iconStop,\n    $core.String? iconStopHash,\n  }) {\n    final result = create();\n    if (iconDrag != null) result.iconDrag = iconDrag;\n    if (iconDragHash != null) result.iconDragHash = iconDragHash;\n    if (iconStop != null) result.iconStop = iconStop;\n    if (iconStopHash != null) result.iconStopHash = iconStopHash;\n    return result;\n  }\n\n  InlineProgressBar._();\n\n  factory InlineProgressBar.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory InlineProgressBar.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'InlineProgressBar',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'iconDrag')\n    ..aOS(2, _omitFieldNames ? '' : 'iconDragHash')\n    ..aOS(3, _omitFieldNames ? '' : 'iconStop')\n    ..aOS(4, _omitFieldNames ? '' : 'iconStopHash')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  InlineProgressBar clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  InlineProgressBar copyWith(void Function(InlineProgressBar) updates) =>\n      super.copyWith((message) => updates(message as InlineProgressBar))\n          as InlineProgressBar;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static InlineProgressBar create() => InlineProgressBar._();\n  @$core.override\n  InlineProgressBar createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static InlineProgressBar getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<InlineProgressBar>(create);\n  static InlineProgressBar? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get iconDrag => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set iconDrag($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIconDrag() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIconDrag() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get iconDragHash => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set iconDragHash($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIconDragHash() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIconDragHash() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get iconStop => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set iconStop($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIconStop() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIconStop() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get iconStopHash => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set iconStopHash($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIconStopHash() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIconStopHash() => $_clearField(4);\n}\n\nclass LargeCoverV1 extends $pb.GeneratedMessage {\n  factory LargeCoverV1({\n    Base? base,\n    $core.String? coverGif,\n    Avatar? avatar,\n    $core.String? coverLeftText1,\n    $core.String? coverLeftText2,\n    $core.String? coverLeftText3,\n    $core.String? coverBadge,\n    $core.String? topRcmdReason,\n    $core.String? bottomRcmdReason,\n    $core.String? desc,\n    $core.int? officialIcon,\n    $core.int? canPlay,\n    ReasonStyle? topRcmdReasonStyle,\n    ReasonStyle? bottomRcmdReasonStyle,\n    ReasonStyle? rcmdReasonStyleV2,\n    ReasonStyle? leftCoverBadgeStyle,\n    ReasonStyle? rightCoverBadgeStyle,\n    $core.String? coverBadge2,\n    LikeButton? likeButton,\n    $core.int? titleSingleLine,\n    $core.String? coverRightText,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (coverGif != null) result.coverGif = coverGif;\n    if (avatar != null) result.avatar = avatar;\n    if (coverLeftText1 != null) result.coverLeftText1 = coverLeftText1;\n    if (coverLeftText2 != null) result.coverLeftText2 = coverLeftText2;\n    if (coverLeftText3 != null) result.coverLeftText3 = coverLeftText3;\n    if (coverBadge != null) result.coverBadge = coverBadge;\n    if (topRcmdReason != null) result.topRcmdReason = topRcmdReason;\n    if (bottomRcmdReason != null) result.bottomRcmdReason = bottomRcmdReason;\n    if (desc != null) result.desc = desc;\n    if (officialIcon != null) result.officialIcon = officialIcon;\n    if (canPlay != null) result.canPlay = canPlay;\n    if (topRcmdReasonStyle != null)\n      result.topRcmdReasonStyle = topRcmdReasonStyle;\n    if (bottomRcmdReasonStyle != null)\n      result.bottomRcmdReasonStyle = bottomRcmdReasonStyle;\n    if (rcmdReasonStyleV2 != null) result.rcmdReasonStyleV2 = rcmdReasonStyleV2;\n    if (leftCoverBadgeStyle != null)\n      result.leftCoverBadgeStyle = leftCoverBadgeStyle;\n    if (rightCoverBadgeStyle != null)\n      result.rightCoverBadgeStyle = rightCoverBadgeStyle;\n    if (coverBadge2 != null) result.coverBadge2 = coverBadge2;\n    if (likeButton != null) result.likeButton = likeButton;\n    if (titleSingleLine != null) result.titleSingleLine = titleSingleLine;\n    if (coverRightText != null) result.coverRightText = coverRightText;\n    return result;\n  }\n\n  LargeCoverV1._();\n\n  factory LargeCoverV1.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LargeCoverV1.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LargeCoverV1',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..aOS(2, _omitFieldNames ? '' : 'coverGif')\n    ..aOM<Avatar>(3, _omitFieldNames ? '' : 'avatar', subBuilder: Avatar.create)\n    ..aOS(4, _omitFieldNames ? '' : 'coverLeftText1')\n    ..aOS(5, _omitFieldNames ? '' : 'coverLeftText2')\n    ..aOS(6, _omitFieldNames ? '' : 'coverLeftText3')\n    ..aOS(7, _omitFieldNames ? '' : 'coverBadge')\n    ..aOS(8, _omitFieldNames ? '' : 'topRcmdReason')\n    ..aOS(9, _omitFieldNames ? '' : 'bottomRcmdReason')\n    ..aOS(10, _omitFieldNames ? '' : 'desc')\n    ..aI(11, _omitFieldNames ? '' : 'officialIcon')\n    ..aI(12, _omitFieldNames ? '' : 'canPlay')\n    ..aOM<ReasonStyle>(13, _omitFieldNames ? '' : 'topRcmdReasonStyle',\n        subBuilder: ReasonStyle.create)\n    ..aOM<ReasonStyle>(14, _omitFieldNames ? '' : 'bottomRcmdReasonStyle',\n        subBuilder: ReasonStyle.create)\n    ..aOM<ReasonStyle>(15, _omitFieldNames ? '' : 'rcmdReasonStyleV2',\n        subBuilder: ReasonStyle.create)\n    ..aOM<ReasonStyle>(16, _omitFieldNames ? '' : 'leftCoverBadgeStyle',\n        subBuilder: ReasonStyle.create)\n    ..aOM<ReasonStyle>(17, _omitFieldNames ? '' : 'rightCoverBadgeStyle',\n        subBuilder: ReasonStyle.create)\n    ..aOS(18, _omitFieldNames ? '' : 'coverBadge2')\n    ..aOM<LikeButton>(19, _omitFieldNames ? '' : 'likeButton',\n        subBuilder: LikeButton.create)\n    ..aI(20, _omitFieldNames ? '' : 'titleSingleLine')\n    ..aOS(21, _omitFieldNames ? '' : 'coverRightText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LargeCoverV1 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LargeCoverV1 copyWith(void Function(LargeCoverV1) updates) =>\n      super.copyWith((message) => updates(message as LargeCoverV1))\n          as LargeCoverV1;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LargeCoverV1 create() => LargeCoverV1._();\n  @$core.override\n  LargeCoverV1 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LargeCoverV1 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LargeCoverV1>(create);\n  static LargeCoverV1? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get coverGif => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set coverGif($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCoverGif() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCoverGif() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  Avatar get avatar => $_getN(2);\n  @$pb.TagNumber(3)\n  set avatar(Avatar value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAvatar() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAvatar() => $_clearField(3);\n  @$pb.TagNumber(3)\n  Avatar ensureAvatar() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.String get coverLeftText1 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set coverLeftText1($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCoverLeftText1() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCoverLeftText1() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get coverLeftText2 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set coverLeftText2($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCoverLeftText2() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCoverLeftText2() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get coverLeftText3 => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set coverLeftText3($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCoverLeftText3() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCoverLeftText3() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get coverBadge => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set coverBadge($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCoverBadge() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCoverBadge() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get topRcmdReason => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set topRcmdReason($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasTopRcmdReason() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearTopRcmdReason() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get bottomRcmdReason => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set bottomRcmdReason($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasBottomRcmdReason() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearBottomRcmdReason() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get desc => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set desc($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasDesc() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearDesc() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.int get officialIcon => $_getIZ(10);\n  @$pb.TagNumber(11)\n  set officialIcon($core.int value) => $_setSignedInt32(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasOfficialIcon() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearOfficialIcon() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.int get canPlay => $_getIZ(11);\n  @$pb.TagNumber(12)\n  set canPlay($core.int value) => $_setSignedInt32(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasCanPlay() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearCanPlay() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  ReasonStyle get topRcmdReasonStyle => $_getN(12);\n  @$pb.TagNumber(13)\n  set topRcmdReasonStyle(ReasonStyle value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasTopRcmdReasonStyle() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearTopRcmdReasonStyle() => $_clearField(13);\n  @$pb.TagNumber(13)\n  ReasonStyle ensureTopRcmdReasonStyle() => $_ensure(12);\n\n  @$pb.TagNumber(14)\n  ReasonStyle get bottomRcmdReasonStyle => $_getN(13);\n  @$pb.TagNumber(14)\n  set bottomRcmdReasonStyle(ReasonStyle value) => $_setField(14, value);\n  @$pb.TagNumber(14)\n  $core.bool hasBottomRcmdReasonStyle() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearBottomRcmdReasonStyle() => $_clearField(14);\n  @$pb.TagNumber(14)\n  ReasonStyle ensureBottomRcmdReasonStyle() => $_ensure(13);\n\n  @$pb.TagNumber(15)\n  ReasonStyle get rcmdReasonStyleV2 => $_getN(14);\n  @$pb.TagNumber(15)\n  set rcmdReasonStyleV2(ReasonStyle value) => $_setField(15, value);\n  @$pb.TagNumber(15)\n  $core.bool hasRcmdReasonStyleV2() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearRcmdReasonStyleV2() => $_clearField(15);\n  @$pb.TagNumber(15)\n  ReasonStyle ensureRcmdReasonStyleV2() => $_ensure(14);\n\n  @$pb.TagNumber(16)\n  ReasonStyle get leftCoverBadgeStyle => $_getN(15);\n  @$pb.TagNumber(16)\n  set leftCoverBadgeStyle(ReasonStyle value) => $_setField(16, value);\n  @$pb.TagNumber(16)\n  $core.bool hasLeftCoverBadgeStyle() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearLeftCoverBadgeStyle() => $_clearField(16);\n  @$pb.TagNumber(16)\n  ReasonStyle ensureLeftCoverBadgeStyle() => $_ensure(15);\n\n  @$pb.TagNumber(17)\n  ReasonStyle get rightCoverBadgeStyle => $_getN(16);\n  @$pb.TagNumber(17)\n  set rightCoverBadgeStyle(ReasonStyle value) => $_setField(17, value);\n  @$pb.TagNumber(17)\n  $core.bool hasRightCoverBadgeStyle() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearRightCoverBadgeStyle() => $_clearField(17);\n  @$pb.TagNumber(17)\n  ReasonStyle ensureRightCoverBadgeStyle() => $_ensure(16);\n\n  @$pb.TagNumber(18)\n  $core.String get coverBadge2 => $_getSZ(17);\n  @$pb.TagNumber(18)\n  set coverBadge2($core.String value) => $_setString(17, value);\n  @$pb.TagNumber(18)\n  $core.bool hasCoverBadge2() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearCoverBadge2() => $_clearField(18);\n\n  @$pb.TagNumber(19)\n  LikeButton get likeButton => $_getN(18);\n  @$pb.TagNumber(19)\n  set likeButton(LikeButton value) => $_setField(19, value);\n  @$pb.TagNumber(19)\n  $core.bool hasLikeButton() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearLikeButton() => $_clearField(19);\n  @$pb.TagNumber(19)\n  LikeButton ensureLikeButton() => $_ensure(18);\n\n  @$pb.TagNumber(20)\n  $core.int get titleSingleLine => $_getIZ(19);\n  @$pb.TagNumber(20)\n  set titleSingleLine($core.int value) => $_setSignedInt32(19, value);\n  @$pb.TagNumber(20)\n  $core.bool hasTitleSingleLine() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearTitleSingleLine() => $_clearField(20);\n\n  @$pb.TagNumber(21)\n  $core.String get coverRightText => $_getSZ(20);\n  @$pb.TagNumber(21)\n  set coverRightText($core.String value) => $_setString(20, value);\n  @$pb.TagNumber(21)\n  $core.bool hasCoverRightText() => $_has(20);\n  @$pb.TagNumber(21)\n  void clearCoverRightText() => $_clearField(21);\n}\n\nclass LargeCoverV2 extends $pb.GeneratedMessage {\n  factory LargeCoverV2({\n    Base? base,\n    Avatar? avatar,\n    $core.String? badge,\n    Button? coverRightButton,\n    $core.String? coverLeftText1,\n    $core.int? coverLeftIcon1,\n    $core.String? coverLeftText2,\n    $core.int? coverLeftIcon2,\n    $core.String? rcmdReason,\n    $core.int? officialIcon,\n    $core.int? canPlay,\n    ReasonStyle? rcmdReasonStyle,\n    $core.int? showTop,\n    $core.int? showBottom,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (avatar != null) result.avatar = avatar;\n    if (badge != null) result.badge = badge;\n    if (coverRightButton != null) result.coverRightButton = coverRightButton;\n    if (coverLeftText1 != null) result.coverLeftText1 = coverLeftText1;\n    if (coverLeftIcon1 != null) result.coverLeftIcon1 = coverLeftIcon1;\n    if (coverLeftText2 != null) result.coverLeftText2 = coverLeftText2;\n    if (coverLeftIcon2 != null) result.coverLeftIcon2 = coverLeftIcon2;\n    if (rcmdReason != null) result.rcmdReason = rcmdReason;\n    if (officialIcon != null) result.officialIcon = officialIcon;\n    if (canPlay != null) result.canPlay = canPlay;\n    if (rcmdReasonStyle != null) result.rcmdReasonStyle = rcmdReasonStyle;\n    if (showTop != null) result.showTop = showTop;\n    if (showBottom != null) result.showBottom = showBottom;\n    return result;\n  }\n\n  LargeCoverV2._();\n\n  factory LargeCoverV2.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LargeCoverV2.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LargeCoverV2',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..aOM<Avatar>(2, _omitFieldNames ? '' : 'avatar', subBuilder: Avatar.create)\n    ..aOS(3, _omitFieldNames ? '' : 'badge')\n    ..aOM<Button>(4, _omitFieldNames ? '' : 'coverRightButton',\n        subBuilder: Button.create)\n    ..aOS(5, _omitFieldNames ? '' : 'coverLeftText1')\n    ..aI(6, _omitFieldNames ? '' : 'coverLeftIcon1')\n    ..aOS(7, _omitFieldNames ? '' : 'coverLeftText2')\n    ..aI(8, _omitFieldNames ? '' : 'coverLeftIcon2')\n    ..aOS(9, _omitFieldNames ? '' : 'rcmdReason')\n    ..aI(10, _omitFieldNames ? '' : 'officialIcon')\n    ..aI(11, _omitFieldNames ? '' : 'canPlay')\n    ..aOM<ReasonStyle>(12, _omitFieldNames ? '' : 'rcmdReasonStyle',\n        subBuilder: ReasonStyle.create)\n    ..aI(13, _omitFieldNames ? '' : 'showTop')\n    ..aI(14, _omitFieldNames ? '' : 'showBottom')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LargeCoverV2 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LargeCoverV2 copyWith(void Function(LargeCoverV2) updates) =>\n      super.copyWith((message) => updates(message as LargeCoverV2))\n          as LargeCoverV2;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LargeCoverV2 create() => LargeCoverV2._();\n  @$core.override\n  LargeCoverV2 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LargeCoverV2 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LargeCoverV2>(create);\n  static LargeCoverV2? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  Avatar get avatar => $_getN(1);\n  @$pb.TagNumber(2)\n  set avatar(Avatar value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAvatar() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAvatar() => $_clearField(2);\n  @$pb.TagNumber(2)\n  Avatar ensureAvatar() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.String get badge => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set badge($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBadge() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBadge() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  Button get coverRightButton => $_getN(3);\n  @$pb.TagNumber(4)\n  set coverRightButton(Button value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCoverRightButton() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCoverRightButton() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Button ensureCoverRightButton() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.String get coverLeftText1 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set coverLeftText1($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCoverLeftText1() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCoverLeftText1() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get coverLeftIcon1 => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set coverLeftIcon1($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCoverLeftIcon1() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCoverLeftIcon1() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get coverLeftText2 => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set coverLeftText2($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCoverLeftText2() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCoverLeftText2() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get coverLeftIcon2 => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set coverLeftIcon2($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasCoverLeftIcon2() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearCoverLeftIcon2() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get rcmdReason => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set rcmdReason($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasRcmdReason() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearRcmdReason() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.int get officialIcon => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set officialIcon($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasOfficialIcon() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearOfficialIcon() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.int get canPlay => $_getIZ(10);\n  @$pb.TagNumber(11)\n  set canPlay($core.int value) => $_setSignedInt32(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasCanPlay() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearCanPlay() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  ReasonStyle get rcmdReasonStyle => $_getN(11);\n  @$pb.TagNumber(12)\n  set rcmdReasonStyle(ReasonStyle value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasRcmdReasonStyle() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearRcmdReasonStyle() => $_clearField(12);\n  @$pb.TagNumber(12)\n  ReasonStyle ensureRcmdReasonStyle() => $_ensure(11);\n\n  @$pb.TagNumber(13)\n  $core.int get showTop => $_getIZ(12);\n  @$pb.TagNumber(13)\n  set showTop($core.int value) => $_setSignedInt32(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasShowTop() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearShowTop() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.int get showBottom => $_getIZ(13);\n  @$pb.TagNumber(14)\n  set showBottom($core.int value) => $_setSignedInt32(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasShowBottom() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearShowBottom() => $_clearField(14);\n}\n\nclass LargeCoverV3 extends $pb.GeneratedMessage {\n  factory LargeCoverV3({\n    Base? base,\n    $core.String? coverGif,\n    Avatar? avatar,\n    ReasonStyle? topRcmdReasonStyle,\n    ReasonStyle? bottomRcmdReasonStyle,\n    $core.String? coverLeftText1,\n    $core.int? coverLeftIcon1,\n    $core.String? coverLeftText2,\n    $core.int? coverLeftIcon2,\n    $core.String? coverRightText,\n    $core.String? desc,\n    $core.int? officialIcon,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (coverGif != null) result.coverGif = coverGif;\n    if (avatar != null) result.avatar = avatar;\n    if (topRcmdReasonStyle != null)\n      result.topRcmdReasonStyle = topRcmdReasonStyle;\n    if (bottomRcmdReasonStyle != null)\n      result.bottomRcmdReasonStyle = bottomRcmdReasonStyle;\n    if (coverLeftText1 != null) result.coverLeftText1 = coverLeftText1;\n    if (coverLeftIcon1 != null) result.coverLeftIcon1 = coverLeftIcon1;\n    if (coverLeftText2 != null) result.coverLeftText2 = coverLeftText2;\n    if (coverLeftIcon2 != null) result.coverLeftIcon2 = coverLeftIcon2;\n    if (coverRightText != null) result.coverRightText = coverRightText;\n    if (desc != null) result.desc = desc;\n    if (officialIcon != null) result.officialIcon = officialIcon;\n    return result;\n  }\n\n  LargeCoverV3._();\n\n  factory LargeCoverV3.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LargeCoverV3.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LargeCoverV3',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..aOS(2, _omitFieldNames ? '' : 'coverGif')\n    ..aOM<Avatar>(3, _omitFieldNames ? '' : 'avatar', subBuilder: Avatar.create)\n    ..aOM<ReasonStyle>(4, _omitFieldNames ? '' : 'topRcmdReasonStyle',\n        subBuilder: ReasonStyle.create)\n    ..aOM<ReasonStyle>(5, _omitFieldNames ? '' : 'bottomRcmdReasonStyle',\n        subBuilder: ReasonStyle.create)\n    ..aOS(6, _omitFieldNames ? '' : 'coverLeftText1')\n    ..aI(7, _omitFieldNames ? '' : 'coverLeftIcon1')\n    ..aOS(8, _omitFieldNames ? '' : 'coverLeftText2')\n    ..aI(9, _omitFieldNames ? '' : 'coverLeftIcon2')\n    ..aOS(10, _omitFieldNames ? '' : 'coverRightText')\n    ..aOS(11, _omitFieldNames ? '' : 'desc')\n    ..aI(12, _omitFieldNames ? '' : 'officialIcon')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LargeCoverV3 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LargeCoverV3 copyWith(void Function(LargeCoverV3) updates) =>\n      super.copyWith((message) => updates(message as LargeCoverV3))\n          as LargeCoverV3;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LargeCoverV3 create() => LargeCoverV3._();\n  @$core.override\n  LargeCoverV3 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LargeCoverV3 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LargeCoverV3>(create);\n  static LargeCoverV3? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get coverGif => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set coverGif($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCoverGif() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCoverGif() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  Avatar get avatar => $_getN(2);\n  @$pb.TagNumber(3)\n  set avatar(Avatar value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAvatar() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAvatar() => $_clearField(3);\n  @$pb.TagNumber(3)\n  Avatar ensureAvatar() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  ReasonStyle get topRcmdReasonStyle => $_getN(3);\n  @$pb.TagNumber(4)\n  set topRcmdReasonStyle(ReasonStyle value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTopRcmdReasonStyle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTopRcmdReasonStyle() => $_clearField(4);\n  @$pb.TagNumber(4)\n  ReasonStyle ensureTopRcmdReasonStyle() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  ReasonStyle get bottomRcmdReasonStyle => $_getN(4);\n  @$pb.TagNumber(5)\n  set bottomRcmdReasonStyle(ReasonStyle value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBottomRcmdReasonStyle() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBottomRcmdReasonStyle() => $_clearField(5);\n  @$pb.TagNumber(5)\n  ReasonStyle ensureBottomRcmdReasonStyle() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.String get coverLeftText1 => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set coverLeftText1($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCoverLeftText1() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCoverLeftText1() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get coverLeftIcon1 => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set coverLeftIcon1($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCoverLeftIcon1() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCoverLeftIcon1() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get coverLeftText2 => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set coverLeftText2($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasCoverLeftText2() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearCoverLeftText2() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.int get coverLeftIcon2 => $_getIZ(8);\n  @$pb.TagNumber(9)\n  set coverLeftIcon2($core.int value) => $_setSignedInt32(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasCoverLeftIcon2() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearCoverLeftIcon2() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get coverRightText => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set coverRightText($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasCoverRightText() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearCoverRightText() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get desc => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set desc($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasDesc() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearDesc() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.int get officialIcon => $_getIZ(11);\n  @$pb.TagNumber(12)\n  set officialIcon($core.int value) => $_setSignedInt32(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasOfficialIcon() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearOfficialIcon() => $_clearField(12);\n}\n\nclass LargeCoverV4 extends $pb.GeneratedMessage {\n  factory LargeCoverV4({\n    Base? base,\n    $core.String? coverLeftText1,\n    $core.String? coverLeftText2,\n    $core.String? coverLeftText3,\n    $core.String? coverBadge,\n    $core.int? canPlay,\n    Up? up,\n    $core.String? shortLink,\n    $core.String? shareSubtitle,\n    $core.String? playNumber,\n    $core.String? bvid,\n    $core.String? subParam,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (coverLeftText1 != null) result.coverLeftText1 = coverLeftText1;\n    if (coverLeftText2 != null) result.coverLeftText2 = coverLeftText2;\n    if (coverLeftText3 != null) result.coverLeftText3 = coverLeftText3;\n    if (coverBadge != null) result.coverBadge = coverBadge;\n    if (canPlay != null) result.canPlay = canPlay;\n    if (up != null) result.up = up;\n    if (shortLink != null) result.shortLink = shortLink;\n    if (shareSubtitle != null) result.shareSubtitle = shareSubtitle;\n    if (playNumber != null) result.playNumber = playNumber;\n    if (bvid != null) result.bvid = bvid;\n    if (subParam != null) result.subParam = subParam;\n    return result;\n  }\n\n  LargeCoverV4._();\n\n  factory LargeCoverV4.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LargeCoverV4.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LargeCoverV4',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..aOS(2, _omitFieldNames ? '' : 'coverLeftText1')\n    ..aOS(3, _omitFieldNames ? '' : 'coverLeftText2')\n    ..aOS(4, _omitFieldNames ? '' : 'coverLeftText3')\n    ..aOS(5, _omitFieldNames ? '' : 'coverBadge')\n    ..aI(6, _omitFieldNames ? '' : 'canPlay')\n    ..aOM<Up>(7, _omitFieldNames ? '' : 'up', subBuilder: Up.create)\n    ..aOS(8, _omitFieldNames ? '' : 'shortLink')\n    ..aOS(9, _omitFieldNames ? '' : 'shareSubtitle')\n    ..aOS(10, _omitFieldNames ? '' : 'playNumber')\n    ..aOS(11, _omitFieldNames ? '' : 'bvid')\n    ..aOS(12, _omitFieldNames ? '' : 'subParam')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LargeCoverV4 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LargeCoverV4 copyWith(void Function(LargeCoverV4) updates) =>\n      super.copyWith((message) => updates(message as LargeCoverV4))\n          as LargeCoverV4;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LargeCoverV4 create() => LargeCoverV4._();\n  @$core.override\n  LargeCoverV4 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LargeCoverV4 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LargeCoverV4>(create);\n  static LargeCoverV4? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get coverLeftText1 => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set coverLeftText1($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCoverLeftText1() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCoverLeftText1() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get coverLeftText2 => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set coverLeftText2($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCoverLeftText2() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCoverLeftText2() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get coverLeftText3 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set coverLeftText3($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCoverLeftText3() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCoverLeftText3() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get coverBadge => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set coverBadge($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCoverBadge() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCoverBadge() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get canPlay => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set canPlay($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCanPlay() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCanPlay() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  Up get up => $_getN(6);\n  @$pb.TagNumber(7)\n  set up(Up value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasUp() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearUp() => $_clearField(7);\n  @$pb.TagNumber(7)\n  Up ensureUp() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  $core.String get shortLink => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set shortLink($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasShortLink() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearShortLink() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get shareSubtitle => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set shareSubtitle($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasShareSubtitle() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearShareSubtitle() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get playNumber => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set playNumber($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasPlayNumber() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearPlayNumber() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get bvid => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set bvid($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasBvid() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearBvid() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get subParam => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set subParam($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasSubParam() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearSubParam() => $_clearField(12);\n}\n\nclass LikeButton extends $pb.GeneratedMessage {\n  factory LikeButton({\n    $fixnum.Int64? aid,\n    $core.int? count,\n    $core.bool? showCount,\n    $core.String? event,\n    $core.int? selected,\n    $core.String? eventV2,\n  }) {\n    final result = create();\n    if (aid != null) result.aid = aid;\n    if (count != null) result.count = count;\n    if (showCount != null) result.showCount = showCount;\n    if (event != null) result.event = event;\n    if (selected != null) result.selected = selected;\n    if (eventV2 != null) result.eventV2 = eventV2;\n    return result;\n  }\n\n  LikeButton._();\n\n  factory LikeButton.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LikeButton.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LikeButton',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'aid')\n    ..aI(2, _omitFieldNames ? '' : 'count')\n    ..aOB(3, _omitFieldNames ? '' : 'showCount')\n    ..aOS(4, _omitFieldNames ? '' : 'event')\n    ..aI(5, _omitFieldNames ? '' : 'selected')\n    ..aOS(6, _omitFieldNames ? '' : 'eventV2')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeButton clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeButton copyWith(void Function(LikeButton) updates) =>\n      super.copyWith((message) => updates(message as LikeButton)) as LikeButton;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LikeButton create() => LikeButton._();\n  @$core.override\n  LikeButton createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LikeButton getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LikeButton>(create);\n  static LikeButton? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get aid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set aid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get count => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set count($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCount() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCount() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get showCount => $_getBF(2);\n  @$pb.TagNumber(3)\n  set showCount($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasShowCount() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearShowCount() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get event => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set event($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasEvent() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearEvent() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get selected => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set selected($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasSelected() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearSelected() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get eventV2 => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set eventV2($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasEventV2() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearEventV2() => $_clearField(6);\n}\n\nclass Mask extends $pb.GeneratedMessage {\n  factory Mask({\n    Avatar? avatar,\n    Button? button,\n  }) {\n    final result = create();\n    if (avatar != null) result.avatar = avatar;\n    if (button != null) result.button = button;\n    return result;\n  }\n\n  Mask._();\n\n  factory Mask.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Mask.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Mask',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Avatar>(1, _omitFieldNames ? '' : 'avatar', subBuilder: Avatar.create)\n    ..aOM<Button>(2, _omitFieldNames ? '' : 'button', subBuilder: Button.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Mask clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Mask copyWith(void Function(Mask) updates) =>\n      super.copyWith((message) => updates(message as Mask)) as Mask;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Mask create() => Mask._();\n  @$core.override\n  Mask createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Mask getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Mask>(create);\n  static Mask? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Avatar get avatar => $_getN(0);\n  @$pb.TagNumber(1)\n  set avatar(Avatar value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAvatar() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAvatar() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Avatar ensureAvatar() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  Button get button => $_getN(1);\n  @$pb.TagNumber(2)\n  set button(Button value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasButton() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearButton() => $_clearField(2);\n  @$pb.TagNumber(2)\n  Button ensureButton() => $_ensure(1);\n}\n\nclass MiddleCoverV2 extends $pb.GeneratedMessage {\n  factory MiddleCoverV2({\n    Base? base,\n    $core.int? ratio,\n    $core.String? desc,\n    $core.String? badge,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (ratio != null) result.ratio = ratio;\n    if (desc != null) result.desc = desc;\n    if (badge != null) result.badge = badge;\n    return result;\n  }\n\n  MiddleCoverV2._();\n\n  factory MiddleCoverV2.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MiddleCoverV2.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MiddleCoverV2',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..aI(2, _omitFieldNames ? '' : 'ratio')\n    ..aOS(3, _omitFieldNames ? '' : 'desc')\n    ..aOS(4, _omitFieldNames ? '' : 'badge')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MiddleCoverV2 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MiddleCoverV2 copyWith(void Function(MiddleCoverV2) updates) =>\n      super.copyWith((message) => updates(message as MiddleCoverV2))\n          as MiddleCoverV2;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MiddleCoverV2 create() => MiddleCoverV2._();\n  @$core.override\n  MiddleCoverV2 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MiddleCoverV2 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MiddleCoverV2>(create);\n  static MiddleCoverV2? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.int get ratio => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set ratio($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasRatio() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRatio() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get desc => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set desc($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDesc() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDesc() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get badge => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set badge($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBadge() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBadge() => $_clearField(4);\n}\n\nclass MiddleCoverV3 extends $pb.GeneratedMessage {\n  factory MiddleCoverV3({\n    Base? base,\n    $core.String? desc1,\n    $core.String? desc2,\n    ReasonStyle? coverBadgeStyle,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (desc1 != null) result.desc1 = desc1;\n    if (desc2 != null) result.desc2 = desc2;\n    if (coverBadgeStyle != null) result.coverBadgeStyle = coverBadgeStyle;\n    return result;\n  }\n\n  MiddleCoverV3._();\n\n  factory MiddleCoverV3.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MiddleCoverV3.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MiddleCoverV3',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..aOS(2, _omitFieldNames ? '' : 'desc1')\n    ..aOS(3, _omitFieldNames ? '' : 'desc2')\n    ..aOM<ReasonStyle>(4, _omitFieldNames ? '' : 'coverBadgeStyle',\n        subBuilder: ReasonStyle.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MiddleCoverV3 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MiddleCoverV3 copyWith(void Function(MiddleCoverV3) updates) =>\n      super.copyWith((message) => updates(message as MiddleCoverV3))\n          as MiddleCoverV3;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MiddleCoverV3 create() => MiddleCoverV3._();\n  @$core.override\n  MiddleCoverV3 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MiddleCoverV3 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MiddleCoverV3>(create);\n  static MiddleCoverV3? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get desc1 => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set desc1($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDesc1() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDesc1() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get desc2 => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set desc2($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDesc2() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDesc2() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  ReasonStyle get coverBadgeStyle => $_getN(3);\n  @$pb.TagNumber(4)\n  set coverBadgeStyle(ReasonStyle value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCoverBadgeStyle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCoverBadgeStyle() => $_clearField(4);\n  @$pb.TagNumber(4)\n  ReasonStyle ensureCoverBadgeStyle() => $_ensure(3);\n}\n\nclass MultiItem extends $pb.GeneratedMessage {\n  factory MultiItem({\n    Base? base,\n    $core.String? moreUri,\n    $core.String? moreText,\n    $core.Iterable<DoubleCards>? items,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (moreUri != null) result.moreUri = moreUri;\n    if (moreText != null) result.moreText = moreText;\n    if (items != null) result.items.addAll(items);\n    return result;\n  }\n\n  MultiItem._();\n\n  factory MultiItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MultiItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MultiItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..aOS(2, _omitFieldNames ? '' : 'moreUri')\n    ..aOS(3, _omitFieldNames ? '' : 'moreText')\n    ..pPM<DoubleCards>(4, _omitFieldNames ? '' : 'items',\n        subBuilder: DoubleCards.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MultiItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MultiItem copyWith(void Function(MultiItem) updates) =>\n      super.copyWith((message) => updates(message as MultiItem)) as MultiItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MultiItem create() => MultiItem._();\n  @$core.override\n  MultiItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MultiItem getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<MultiItem>(create);\n  static MultiItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get moreUri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set moreUri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMoreUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMoreUri() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get moreText => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set moreText($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasMoreText() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearMoreText() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<DoubleCards> get items => $_getList(3);\n}\n\nclass OnePicV2 extends $pb.GeneratedMessage {\n  factory OnePicV2({\n    Base? base,\n    $core.int? coverLeftIcon1,\n    $core.String? coverLeftText2,\n    $core.String? coverRightText,\n    $core.int? coverRightIcon,\n    $core.String? coverRightBackgroundColor,\n    $core.String? badge,\n    $core.String? rcmdReason,\n    Avatar? avatar,\n    ReasonStyle? rcmdReasonStyle,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (coverLeftIcon1 != null) result.coverLeftIcon1 = coverLeftIcon1;\n    if (coverLeftText2 != null) result.coverLeftText2 = coverLeftText2;\n    if (coverRightText != null) result.coverRightText = coverRightText;\n    if (coverRightIcon != null) result.coverRightIcon = coverRightIcon;\n    if (coverRightBackgroundColor != null)\n      result.coverRightBackgroundColor = coverRightBackgroundColor;\n    if (badge != null) result.badge = badge;\n    if (rcmdReason != null) result.rcmdReason = rcmdReason;\n    if (avatar != null) result.avatar = avatar;\n    if (rcmdReasonStyle != null) result.rcmdReasonStyle = rcmdReasonStyle;\n    return result;\n  }\n\n  OnePicV2._();\n\n  factory OnePicV2.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OnePicV2.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OnePicV2',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..aI(2, _omitFieldNames ? '' : 'coverLeftIcon1')\n    ..aOS(3, _omitFieldNames ? '' : 'coverLeftText2')\n    ..aOS(4, _omitFieldNames ? '' : 'coverRightText')\n    ..aI(5, _omitFieldNames ? '' : 'coverRightIcon')\n    ..aOS(6, _omitFieldNames ? '' : 'coverRightBackgroundColor')\n    ..aOS(7, _omitFieldNames ? '' : 'badge')\n    ..aOS(8, _omitFieldNames ? '' : 'rcmdReason')\n    ..aOM<Avatar>(9, _omitFieldNames ? '' : 'avatar', subBuilder: Avatar.create)\n    ..aOM<ReasonStyle>(10, _omitFieldNames ? '' : 'rcmdReasonStyle',\n        subBuilder: ReasonStyle.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OnePicV2 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OnePicV2 copyWith(void Function(OnePicV2) updates) =>\n      super.copyWith((message) => updates(message as OnePicV2)) as OnePicV2;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OnePicV2 create() => OnePicV2._();\n  @$core.override\n  OnePicV2 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OnePicV2 getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<OnePicV2>(create);\n  static OnePicV2? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.int get coverLeftIcon1 => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set coverLeftIcon1($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCoverLeftIcon1() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCoverLeftIcon1() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get coverLeftText2 => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set coverLeftText2($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCoverLeftText2() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCoverLeftText2() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get coverRightText => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set coverRightText($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCoverRightText() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCoverRightText() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get coverRightIcon => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set coverRightIcon($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCoverRightIcon() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCoverRightIcon() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get coverRightBackgroundColor => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set coverRightBackgroundColor($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCoverRightBackgroundColor() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCoverRightBackgroundColor() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get badge => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set badge($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBadge() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBadge() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get rcmdReason => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set rcmdReason($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasRcmdReason() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearRcmdReason() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  Avatar get avatar => $_getN(8);\n  @$pb.TagNumber(9)\n  set avatar(Avatar value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasAvatar() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearAvatar() => $_clearField(9);\n  @$pb.TagNumber(9)\n  Avatar ensureAvatar() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  ReasonStyle get rcmdReasonStyle => $_getN(9);\n  @$pb.TagNumber(10)\n  set rcmdReasonStyle(ReasonStyle value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasRcmdReasonStyle() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearRcmdReasonStyle() => $_clearField(10);\n  @$pb.TagNumber(10)\n  ReasonStyle ensureRcmdReasonStyle() => $_ensure(9);\n}\n\nclass OnePicV3 extends $pb.GeneratedMessage {\n  factory OnePicV3({\n    Base? base,\n    $core.String? coverLeftText1,\n    $core.int? coverLeftIcon1,\n    $core.String? coverRightText,\n    $core.int? coverRightIcon,\n    $core.String? coverRightBackgroundColor,\n    $core.String? badge,\n    ReasonStyle? rcmdReasonStyle,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (coverLeftText1 != null) result.coverLeftText1 = coverLeftText1;\n    if (coverLeftIcon1 != null) result.coverLeftIcon1 = coverLeftIcon1;\n    if (coverRightText != null) result.coverRightText = coverRightText;\n    if (coverRightIcon != null) result.coverRightIcon = coverRightIcon;\n    if (coverRightBackgroundColor != null)\n      result.coverRightBackgroundColor = coverRightBackgroundColor;\n    if (badge != null) result.badge = badge;\n    if (rcmdReasonStyle != null) result.rcmdReasonStyle = rcmdReasonStyle;\n    return result;\n  }\n\n  OnePicV3._();\n\n  factory OnePicV3.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OnePicV3.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OnePicV3',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..aOS(2, _omitFieldNames ? '' : 'coverLeftText1')\n    ..aI(3, _omitFieldNames ? '' : 'coverLeftIcon1')\n    ..aOS(4, _omitFieldNames ? '' : 'coverRightText')\n    ..aI(5, _omitFieldNames ? '' : 'coverRightIcon')\n    ..aOS(6, _omitFieldNames ? '' : 'coverRightBackgroundColor')\n    ..aOS(7, _omitFieldNames ? '' : 'badge')\n    ..aOM<ReasonStyle>(8, _omitFieldNames ? '' : 'rcmdReasonStyle',\n        subBuilder: ReasonStyle.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OnePicV3 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OnePicV3 copyWith(void Function(OnePicV3) updates) =>\n      super.copyWith((message) => updates(message as OnePicV3)) as OnePicV3;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OnePicV3 create() => OnePicV3._();\n  @$core.override\n  OnePicV3 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OnePicV3 getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<OnePicV3>(create);\n  static OnePicV3? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get coverLeftText1 => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set coverLeftText1($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCoverLeftText1() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCoverLeftText1() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get coverLeftIcon1 => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set coverLeftIcon1($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCoverLeftIcon1() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCoverLeftIcon1() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get coverRightText => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set coverRightText($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCoverRightText() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCoverRightText() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get coverRightIcon => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set coverRightIcon($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCoverRightIcon() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCoverRightIcon() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get coverRightBackgroundColor => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set coverRightBackgroundColor($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCoverRightBackgroundColor() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCoverRightBackgroundColor() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get badge => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set badge($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBadge() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBadge() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  ReasonStyle get rcmdReasonStyle => $_getN(7);\n  @$pb.TagNumber(8)\n  set rcmdReasonStyle(ReasonStyle value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasRcmdReasonStyle() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearRcmdReasonStyle() => $_clearField(8);\n  @$pb.TagNumber(8)\n  ReasonStyle ensureRcmdReasonStyle() => $_ensure(7);\n}\n\nclass PanelMeta extends $pb.GeneratedMessage {\n  factory PanelMeta({\n    $core.int? panelType,\n    $core.String? shareOrigin,\n    $core.String? shareId,\n    $core.Iterable<FunctionalButton>? functionalButtons,\n  }) {\n    final result = create();\n    if (panelType != null) result.panelType = panelType;\n    if (shareOrigin != null) result.shareOrigin = shareOrigin;\n    if (shareId != null) result.shareId = shareId;\n    if (functionalButtons != null)\n      result.functionalButtons.addAll(functionalButtons);\n    return result;\n  }\n\n  PanelMeta._();\n\n  factory PanelMeta.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PanelMeta.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PanelMeta',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'panelType')\n    ..aOS(2, _omitFieldNames ? '' : 'shareOrigin')\n    ..aOS(3, _omitFieldNames ? '' : 'shareId')\n    ..pPM<FunctionalButton>(4, _omitFieldNames ? '' : 'functionalButtons',\n        subBuilder: FunctionalButton.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PanelMeta clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PanelMeta copyWith(void Function(PanelMeta) updates) =>\n      super.copyWith((message) => updates(message as PanelMeta)) as PanelMeta;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PanelMeta create() => PanelMeta._();\n  @$core.override\n  PanelMeta createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PanelMeta getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PanelMeta>(create);\n  static PanelMeta? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get panelType => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set panelType($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPanelType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPanelType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get shareOrigin => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set shareOrigin($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasShareOrigin() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearShareOrigin() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get shareId => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set shareId($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasShareId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearShareId() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<FunctionalButton> get functionalButtons => $_getList(3);\n}\n\nclass PlayerArgs extends $pb.GeneratedMessage {\n  factory PlayerArgs({\n    $core.int? isLive,\n    $fixnum.Int64? aid,\n    $fixnum.Int64? cid,\n    $core.int? subType,\n    $fixnum.Int64? roomId,\n    $fixnum.Int64? epId,\n    $core.int? isPreview,\n    $core.String? type,\n    $fixnum.Int64? duration,\n    $fixnum.Int64? seasonId,\n  }) {\n    final result = create();\n    if (isLive != null) result.isLive = isLive;\n    if (aid != null) result.aid = aid;\n    if (cid != null) result.cid = cid;\n    if (subType != null) result.subType = subType;\n    if (roomId != null) result.roomId = roomId;\n    if (epId != null) result.epId = epId;\n    if (isPreview != null) result.isPreview = isPreview;\n    if (type != null) result.type = type;\n    if (duration != null) result.duration = duration;\n    if (seasonId != null) result.seasonId = seasonId;\n    return result;\n  }\n\n  PlayerArgs._();\n\n  factory PlayerArgs.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayerArgs.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayerArgs',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'isLive')\n    ..aInt64(2, _omitFieldNames ? '' : 'aid')\n    ..aInt64(3, _omitFieldNames ? '' : 'cid')\n    ..aI(4, _omitFieldNames ? '' : 'subType')\n    ..aInt64(5, _omitFieldNames ? '' : 'roomId')\n    ..aInt64(7, _omitFieldNames ? '' : 'epId')\n    ..aI(8, _omitFieldNames ? '' : 'isPreview')\n    ..aOS(9, _omitFieldNames ? '' : 'type')\n    ..aInt64(10, _omitFieldNames ? '' : 'duration')\n    ..aInt64(11, _omitFieldNames ? '' : 'seasonId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerArgs clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerArgs copyWith(void Function(PlayerArgs) updates) =>\n      super.copyWith((message) => updates(message as PlayerArgs)) as PlayerArgs;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayerArgs create() => PlayerArgs._();\n  @$core.override\n  PlayerArgs createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayerArgs getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayerArgs>(create);\n  static PlayerArgs? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get isLive => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set isLive($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIsLive() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIsLive() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get aid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set aid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get cid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set cid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCid() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get subType => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set subType($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSubType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSubType() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get roomId => $_getI64(4);\n  @$pb.TagNumber(5)\n  set roomId($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasRoomId() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearRoomId() => $_clearField(5);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get epId => $_getI64(5);\n  @$pb.TagNumber(7)\n  set epId($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(7)\n  $core.bool hasEpId() => $_has(5);\n  @$pb.TagNumber(7)\n  void clearEpId() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get isPreview => $_getIZ(6);\n  @$pb.TagNumber(8)\n  set isPreview($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(8)\n  $core.bool hasIsPreview() => $_has(6);\n  @$pb.TagNumber(8)\n  void clearIsPreview() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get type => $_getSZ(7);\n  @$pb.TagNumber(9)\n  set type($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(9)\n  $core.bool hasType() => $_has(7);\n  @$pb.TagNumber(9)\n  void clearType() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $fixnum.Int64 get duration => $_getI64(8);\n  @$pb.TagNumber(10)\n  set duration($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(10)\n  $core.bool hasDuration() => $_has(8);\n  @$pb.TagNumber(10)\n  void clearDuration() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $fixnum.Int64 get seasonId => $_getI64(9);\n  @$pb.TagNumber(11)\n  set seasonId($fixnum.Int64 value) => $_setInt64(9, value);\n  @$pb.TagNumber(11)\n  $core.bool hasSeasonId() => $_has(9);\n  @$pb.TagNumber(11)\n  void clearSeasonId() => $_clearField(11);\n}\n\nclass PopularTopEntrance extends $pb.GeneratedMessage {\n  factory PopularTopEntrance({\n    Base? base,\n    $core.Iterable<EntranceItem>? items,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (items != null) result.items.addAll(items);\n    return result;\n  }\n\n  PopularTopEntrance._();\n\n  factory PopularTopEntrance.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PopularTopEntrance.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PopularTopEntrance',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..pPM<EntranceItem>(2, _omitFieldNames ? '' : 'items',\n        subBuilder: EntranceItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PopularTopEntrance clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PopularTopEntrance copyWith(void Function(PopularTopEntrance) updates) =>\n      super.copyWith((message) => updates(message as PopularTopEntrance))\n          as PopularTopEntrance;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PopularTopEntrance create() => PopularTopEntrance._();\n  @$core.override\n  PopularTopEntrance createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PopularTopEntrance getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PopularTopEntrance>(create);\n  static PopularTopEntrance? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<EntranceItem> get items => $_getList(1);\n}\n\nclass RcmdOneItem extends $pb.GeneratedMessage {\n  factory RcmdOneItem({\n    Base? base,\n    ReasonStyle? topRcmdReasonStyle,\n    SmallCoverRcmdItem? item,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (topRcmdReasonStyle != null)\n      result.topRcmdReasonStyle = topRcmdReasonStyle;\n    if (item != null) result.item = item;\n    return result;\n  }\n\n  RcmdOneItem._();\n\n  factory RcmdOneItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RcmdOneItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RcmdOneItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..aOM<ReasonStyle>(2, _omitFieldNames ? '' : 'topRcmdReasonStyle',\n        subBuilder: ReasonStyle.create)\n    ..aOM<SmallCoverRcmdItem>(3, _omitFieldNames ? '' : 'item',\n        subBuilder: SmallCoverRcmdItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RcmdOneItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RcmdOneItem copyWith(void Function(RcmdOneItem) updates) =>\n      super.copyWith((message) => updates(message as RcmdOneItem))\n          as RcmdOneItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RcmdOneItem create() => RcmdOneItem._();\n  @$core.override\n  RcmdOneItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RcmdOneItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RcmdOneItem>(create);\n  static RcmdOneItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  ReasonStyle get topRcmdReasonStyle => $_getN(1);\n  @$pb.TagNumber(2)\n  set topRcmdReasonStyle(ReasonStyle value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTopRcmdReasonStyle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTopRcmdReasonStyle() => $_clearField(2);\n  @$pb.TagNumber(2)\n  ReasonStyle ensureTopRcmdReasonStyle() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  SmallCoverRcmdItem get item => $_getN(2);\n  @$pb.TagNumber(3)\n  set item(SmallCoverRcmdItem value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasItem() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearItem() => $_clearField(3);\n  @$pb.TagNumber(3)\n  SmallCoverRcmdItem ensureItem() => $_ensure(2);\n}\n\nclass ReasonStyle extends $pb.GeneratedMessage {\n  factory ReasonStyle({\n    $core.String? text,\n    $core.String? textColor,\n    $core.String? bgColor,\n    $core.String? borderColor,\n    $core.String? iconUrl,\n    $core.String? textColorNight,\n    $core.String? bgColorNight,\n    $core.String? borderColorNight,\n    $core.String? iconNightUrl,\n    $core.int? bgStyle,\n    $core.String? uri,\n    $core.String? iconBgUrl,\n    $core.String? event,\n    $core.String? eventV2,\n    $core.int? rightIconType,\n    $core.String? leftIconType,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (textColor != null) result.textColor = textColor;\n    if (bgColor != null) result.bgColor = bgColor;\n    if (borderColor != null) result.borderColor = borderColor;\n    if (iconUrl != null) result.iconUrl = iconUrl;\n    if (textColorNight != null) result.textColorNight = textColorNight;\n    if (bgColorNight != null) result.bgColorNight = bgColorNight;\n    if (borderColorNight != null) result.borderColorNight = borderColorNight;\n    if (iconNightUrl != null) result.iconNightUrl = iconNightUrl;\n    if (bgStyle != null) result.bgStyle = bgStyle;\n    if (uri != null) result.uri = uri;\n    if (iconBgUrl != null) result.iconBgUrl = iconBgUrl;\n    if (event != null) result.event = event;\n    if (eventV2 != null) result.eventV2 = eventV2;\n    if (rightIconType != null) result.rightIconType = rightIconType;\n    if (leftIconType != null) result.leftIconType = leftIconType;\n    return result;\n  }\n\n  ReasonStyle._();\n\n  factory ReasonStyle.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReasonStyle.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReasonStyle',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aOS(2, _omitFieldNames ? '' : 'textColor')\n    ..aOS(3, _omitFieldNames ? '' : 'bgColor')\n    ..aOS(4, _omitFieldNames ? '' : 'borderColor')\n    ..aOS(5, _omitFieldNames ? '' : 'iconUrl')\n    ..aOS(6, _omitFieldNames ? '' : 'textColorNight')\n    ..aOS(7, _omitFieldNames ? '' : 'bgColorNight')\n    ..aOS(8, _omitFieldNames ? '' : 'borderColorNight')\n    ..aOS(9, _omitFieldNames ? '' : 'iconNightUrl')\n    ..aI(10, _omitFieldNames ? '' : 'bgStyle')\n    ..aOS(11, _omitFieldNames ? '' : 'uri')\n    ..aOS(12, _omitFieldNames ? '' : 'iconBgUrl')\n    ..aOS(13, _omitFieldNames ? '' : 'event')\n    ..aOS(14, _omitFieldNames ? '' : 'eventV2')\n    ..aI(15, _omitFieldNames ? '' : 'rightIconType')\n    ..aOS(16, _omitFieldNames ? '' : 'leftIconType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReasonStyle clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReasonStyle copyWith(void Function(ReasonStyle) updates) =>\n      super.copyWith((message) => updates(message as ReasonStyle))\n          as ReasonStyle;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReasonStyle create() => ReasonStyle._();\n  @$core.override\n  ReasonStyle createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReasonStyle getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReasonStyle>(create);\n  static ReasonStyle? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get textColor => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set textColor($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTextColor() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTextColor() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get bgColor => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set bgColor($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBgColor() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBgColor() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get borderColor => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set borderColor($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBorderColor() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBorderColor() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get iconUrl => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set iconUrl($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasIconUrl() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearIconUrl() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get textColorNight => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set textColorNight($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasTextColorNight() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearTextColorNight() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get bgColorNight => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set bgColorNight($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBgColorNight() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBgColorNight() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get borderColorNight => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set borderColorNight($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasBorderColorNight() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearBorderColorNight() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get iconNightUrl => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set iconNightUrl($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasIconNightUrl() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearIconNightUrl() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.int get bgStyle => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set bgStyle($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasBgStyle() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearBgStyle() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get uri => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set uri($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasUri() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearUri() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get iconBgUrl => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set iconBgUrl($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasIconBgUrl() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearIconBgUrl() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.String get event => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set event($core.String value) => $_setString(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasEvent() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearEvent() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.String get eventV2 => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set eventV2($core.String value) => $_setString(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasEventV2() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearEventV2() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $core.int get rightIconType => $_getIZ(14);\n  @$pb.TagNumber(15)\n  set rightIconType($core.int value) => $_setSignedInt32(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasRightIconType() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearRightIconType() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $core.String get leftIconType => $_getSZ(15);\n  @$pb.TagNumber(16)\n  set leftIconType($core.String value) => $_setString(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasLeftIconType() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearLeftIconType() => $_clearField(16);\n}\n\n/// 新关注组件\nclass Relation extends $pb.GeneratedMessage {\n  factory Relation({\n    $core.int? status,\n    $core.int? isFollow,\n    $core.int? isFollowed,\n  }) {\n    final result = create();\n    if (status != null) result.status = status;\n    if (isFollow != null) result.isFollow = isFollow;\n    if (isFollowed != null) result.isFollowed = isFollowed;\n    return result;\n  }\n\n  Relation._();\n\n  factory Relation.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Relation.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Relation',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'status')\n    ..aI(2, _omitFieldNames ? '' : 'isFollow')\n    ..aI(3, _omitFieldNames ? '' : 'isFollowed')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Relation clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Relation copyWith(void Function(Relation) updates) =>\n      super.copyWith((message) => updates(message as Relation)) as Relation;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Relation create() => Relation._();\n  @$core.override\n  Relation createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Relation getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Relation>(create);\n  static Relation? _defaultInstance;\n\n  /// - 1: 未关注\n  /// - 2: 已关注\n  /// - 3: 被关注\n  /// - 4: 互相关注\n  @$pb.TagNumber(1)\n  $core.int get status => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set status($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStatus() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStatus() => $_clearField(1);\n\n  /// 用户关注 UP 主\n  ///\n  /// - 0: 未关注\n  /// - 1: 已关注\n  @$pb.TagNumber(2)\n  $core.int get isFollow => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set isFollow($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIsFollow() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIsFollow() => $_clearField(2);\n\n  ///   UP 主关注用户\n  ///\n  ///  - 0: 未被关注\n  ///  - 1: 已被关注\n  @$pb.TagNumber(3)\n  $core.int get isFollowed => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set isFollowed($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIsFollowed() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIsFollowed() => $_clearField(3);\n}\n\nclass SharePlane extends $pb.GeneratedMessage {\n  factory SharePlane({\n    $core.String? title,\n    $core.String? shareSubtitle,\n    $core.String? desc,\n    $core.String? cover,\n    $fixnum.Int64? aid,\n    $core.String? bvid,\n    $core.Iterable<$core.MapEntry<$core.String, $core.bool>>? shareTo,\n    $core.String? author,\n    $fixnum.Int64? authorId,\n    $core.String? shortLink,\n    $core.String? playNumber,\n    $fixnum.Int64? firstCid,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (shareSubtitle != null) result.shareSubtitle = shareSubtitle;\n    if (desc != null) result.desc = desc;\n    if (cover != null) result.cover = cover;\n    if (aid != null) result.aid = aid;\n    if (bvid != null) result.bvid = bvid;\n    if (shareTo != null) result.shareTo.addEntries(shareTo);\n    if (author != null) result.author = author;\n    if (authorId != null) result.authorId = authorId;\n    if (shortLink != null) result.shortLink = shortLink;\n    if (playNumber != null) result.playNumber = playNumber;\n    if (firstCid != null) result.firstCid = firstCid;\n    return result;\n  }\n\n  SharePlane._();\n\n  factory SharePlane.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SharePlane.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SharePlane',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'shareSubtitle')\n    ..aOS(3, _omitFieldNames ? '' : 'desc')\n    ..aOS(4, _omitFieldNames ? '' : 'cover')\n    ..aInt64(5, _omitFieldNames ? '' : 'aid')\n    ..aOS(6, _omitFieldNames ? '' : 'bvid')\n    ..m<$core.String, $core.bool>(7, _omitFieldNames ? '' : 'shareTo',\n        entryClassName: 'SharePlane.ShareToEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OB,\n        packageName: const $pb.PackageName('bilibili.app.card.v1'))\n    ..aOS(8, _omitFieldNames ? '' : 'author')\n    ..aInt64(9, _omitFieldNames ? '' : 'authorId')\n    ..aOS(10, _omitFieldNames ? '' : 'shortLink')\n    ..aOS(11, _omitFieldNames ? '' : 'playNumber')\n    ..aInt64(12, _omitFieldNames ? '' : 'firstCid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SharePlane clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SharePlane copyWith(void Function(SharePlane) updates) =>\n      super.copyWith((message) => updates(message as SharePlane)) as SharePlane;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SharePlane create() => SharePlane._();\n  @$core.override\n  SharePlane createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SharePlane getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SharePlane>(create);\n  static SharePlane? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get shareSubtitle => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set shareSubtitle($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasShareSubtitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearShareSubtitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get desc => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set desc($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDesc() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDesc() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get cover => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set cover($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCover() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCover() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get aid => $_getI64(4);\n  @$pb.TagNumber(5)\n  set aid($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasAid() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearAid() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get bvid => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set bvid($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasBvid() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearBvid() => $_clearField(6);\n\n  /// 分享渠道, 如: `\"weibo\": true`\n  @$pb.TagNumber(7)\n  $pb.PbMap<$core.String, $core.bool> get shareTo => $_getMap(6);\n\n  @$pb.TagNumber(8)\n  $core.String get author => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set author($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasAuthor() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearAuthor() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get authorId => $_getI64(8);\n  @$pb.TagNumber(9)\n  set authorId($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasAuthorId() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearAuthorId() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get shortLink => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set shortLink($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasShortLink() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearShortLink() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get playNumber => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set playNumber($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasPlayNumber() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearPlayNumber() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $fixnum.Int64 get firstCid => $_getI64(11);\n  @$pb.TagNumber(12)\n  set firstCid($fixnum.Int64 value) => $_setInt64(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasFirstCid() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearFirstCid() => $_clearField(12);\n}\n\nclass SmallChannelSpecial extends $pb.GeneratedMessage {\n  factory SmallChannelSpecial({\n    Base? base,\n    $core.String? bgCover,\n    $core.String? desc1,\n    $core.String? desc2,\n    $core.String? badge,\n    ReasonStyle? rcmdReasonStyle2,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (bgCover != null) result.bgCover = bgCover;\n    if (desc1 != null) result.desc1 = desc1;\n    if (desc2 != null) result.desc2 = desc2;\n    if (badge != null) result.badge = badge;\n    if (rcmdReasonStyle2 != null) result.rcmdReasonStyle2 = rcmdReasonStyle2;\n    return result;\n  }\n\n  SmallChannelSpecial._();\n\n  factory SmallChannelSpecial.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SmallChannelSpecial.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SmallChannelSpecial',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..aOS(2, _omitFieldNames ? '' : 'bgCover')\n    ..aOS(3, _omitFieldNames ? '' : 'desc1')\n    ..aOS(4, _omitFieldNames ? '' : 'desc2')\n    ..aOS(5, _omitFieldNames ? '' : 'badge')\n    ..aOM<ReasonStyle>(6, _omitFieldNames ? '' : 'rcmdReasonStyle2',\n        subBuilder: ReasonStyle.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SmallChannelSpecial clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SmallChannelSpecial copyWith(void Function(SmallChannelSpecial) updates) =>\n      super.copyWith((message) => updates(message as SmallChannelSpecial))\n          as SmallChannelSpecial;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SmallChannelSpecial create() => SmallChannelSpecial._();\n  @$core.override\n  SmallChannelSpecial createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SmallChannelSpecial getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SmallChannelSpecial>(create);\n  static SmallChannelSpecial? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get bgCover => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set bgCover($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBgCover() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBgCover() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get desc1 => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set desc1($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDesc1() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDesc1() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get desc2 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set desc2($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDesc2() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDesc2() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get badge => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set badge($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBadge() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBadge() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  ReasonStyle get rcmdReasonStyle2 => $_getN(5);\n  @$pb.TagNumber(6)\n  set rcmdReasonStyle2(ReasonStyle value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasRcmdReasonStyle2() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearRcmdReasonStyle2() => $_clearField(6);\n  @$pb.TagNumber(6)\n  ReasonStyle ensureRcmdReasonStyle2() => $_ensure(5);\n}\n\nclass SmallCoverConvergeV2 extends $pb.GeneratedMessage {\n  factory SmallCoverConvergeV2({\n    Base? base,\n    $core.String? coverLeftText1,\n    $core.int? coverLeftIcon1,\n    $core.String? coverLeftText2,\n    $core.int? coverLeftIcon2,\n    $core.String? coverRightText,\n    $core.String? coverRightTopText,\n    ReasonStyle? rcmdReasonStyle,\n    ReasonStyle? rcmdReasonStyleV2,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (coverLeftText1 != null) result.coverLeftText1 = coverLeftText1;\n    if (coverLeftIcon1 != null) result.coverLeftIcon1 = coverLeftIcon1;\n    if (coverLeftText2 != null) result.coverLeftText2 = coverLeftText2;\n    if (coverLeftIcon2 != null) result.coverLeftIcon2 = coverLeftIcon2;\n    if (coverRightText != null) result.coverRightText = coverRightText;\n    if (coverRightTopText != null) result.coverRightTopText = coverRightTopText;\n    if (rcmdReasonStyle != null) result.rcmdReasonStyle = rcmdReasonStyle;\n    if (rcmdReasonStyleV2 != null) result.rcmdReasonStyleV2 = rcmdReasonStyleV2;\n    return result;\n  }\n\n  SmallCoverConvergeV2._();\n\n  factory SmallCoverConvergeV2.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SmallCoverConvergeV2.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SmallCoverConvergeV2',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..aOS(2, _omitFieldNames ? '' : 'coverLeftText1')\n    ..aI(3, _omitFieldNames ? '' : 'coverLeftIcon1')\n    ..aOS(4, _omitFieldNames ? '' : 'coverLeftText2')\n    ..aI(5, _omitFieldNames ? '' : 'coverLeftIcon2')\n    ..aOS(6, _omitFieldNames ? '' : 'coverRightText')\n    ..aOS(7, _omitFieldNames ? '' : 'coverRightTopText')\n    ..aOM<ReasonStyle>(8, _omitFieldNames ? '' : 'rcmdReasonStyle',\n        subBuilder: ReasonStyle.create)\n    ..aOM<ReasonStyle>(9, _omitFieldNames ? '' : 'rcmdReasonStyleV2',\n        subBuilder: ReasonStyle.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SmallCoverConvergeV2 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SmallCoverConvergeV2 copyWith(void Function(SmallCoverConvergeV2) updates) =>\n      super.copyWith((message) => updates(message as SmallCoverConvergeV2))\n          as SmallCoverConvergeV2;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SmallCoverConvergeV2 create() => SmallCoverConvergeV2._();\n  @$core.override\n  SmallCoverConvergeV2 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SmallCoverConvergeV2 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SmallCoverConvergeV2>(create);\n  static SmallCoverConvergeV2? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get coverLeftText1 => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set coverLeftText1($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCoverLeftText1() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCoverLeftText1() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get coverLeftIcon1 => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set coverLeftIcon1($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCoverLeftIcon1() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCoverLeftIcon1() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get coverLeftText2 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set coverLeftText2($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCoverLeftText2() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCoverLeftText2() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get coverLeftIcon2 => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set coverLeftIcon2($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCoverLeftIcon2() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCoverLeftIcon2() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get coverRightText => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set coverRightText($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCoverRightText() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCoverRightText() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get coverRightTopText => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set coverRightTopText($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCoverRightTopText() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCoverRightTopText() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  ReasonStyle get rcmdReasonStyle => $_getN(7);\n  @$pb.TagNumber(8)\n  set rcmdReasonStyle(ReasonStyle value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasRcmdReasonStyle() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearRcmdReasonStyle() => $_clearField(8);\n  @$pb.TagNumber(8)\n  ReasonStyle ensureRcmdReasonStyle() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  ReasonStyle get rcmdReasonStyleV2 => $_getN(8);\n  @$pb.TagNumber(9)\n  set rcmdReasonStyleV2(ReasonStyle value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasRcmdReasonStyleV2() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearRcmdReasonStyleV2() => $_clearField(9);\n  @$pb.TagNumber(9)\n  ReasonStyle ensureRcmdReasonStyleV2() => $_ensure(8);\n}\n\nclass SmallCoverRcmdItem extends $pb.GeneratedMessage {\n  factory SmallCoverRcmdItem({\n    $core.String? title,\n    $core.String? cover,\n    $core.String? uri,\n    $core.String? param,\n    $core.String? goto,\n    $core.String? coverRightText1,\n    $core.String? rightDesc1,\n    $core.String? rightDesc2,\n    $core.String? coverGif,\n    $core.int? rightIcon1,\n    $core.int? rightIcon2,\n    $core.String? coverRightTextContentDescription,\n    $core.String? rightDesc1ContentDescription,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (uri != null) result.uri = uri;\n    if (param != null) result.param = param;\n    if (goto != null) result.goto = goto;\n    if (coverRightText1 != null) result.coverRightText1 = coverRightText1;\n    if (rightDesc1 != null) result.rightDesc1 = rightDesc1;\n    if (rightDesc2 != null) result.rightDesc2 = rightDesc2;\n    if (coverGif != null) result.coverGif = coverGif;\n    if (rightIcon1 != null) result.rightIcon1 = rightIcon1;\n    if (rightIcon2 != null) result.rightIcon2 = rightIcon2;\n    if (coverRightTextContentDescription != null)\n      result.coverRightTextContentDescription =\n          coverRightTextContentDescription;\n    if (rightDesc1ContentDescription != null)\n      result.rightDesc1ContentDescription = rightDesc1ContentDescription;\n    return result;\n  }\n\n  SmallCoverRcmdItem._();\n\n  factory SmallCoverRcmdItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SmallCoverRcmdItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SmallCoverRcmdItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'cover')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..aOS(4, _omitFieldNames ? '' : 'param')\n    ..aOS(5, _omitFieldNames ? '' : 'goto')\n    ..aOS(6, _omitFieldNames ? '' : 'coverRightText1')\n    ..aOS(7, _omitFieldNames ? '' : 'rightDesc1')\n    ..aOS(8, _omitFieldNames ? '' : 'rightDesc2')\n    ..aOS(9, _omitFieldNames ? '' : 'coverGif')\n    ..aI(10, _omitFieldNames ? '' : 'rightIcon1')\n    ..aI(11, _omitFieldNames ? '' : 'rightIcon2')\n    ..aOS(12, _omitFieldNames ? '' : 'coverRightTextContentDescription')\n    ..aOS(13, _omitFieldNames ? '' : 'rightDesc1ContentDescription')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SmallCoverRcmdItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SmallCoverRcmdItem copyWith(void Function(SmallCoverRcmdItem) updates) =>\n      super.copyWith((message) => updates(message as SmallCoverRcmdItem))\n          as SmallCoverRcmdItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SmallCoverRcmdItem create() => SmallCoverRcmdItem._();\n  @$core.override\n  SmallCoverRcmdItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SmallCoverRcmdItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SmallCoverRcmdItem>(create);\n  static SmallCoverRcmdItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get cover => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cover($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCover() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCover() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get param => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set param($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasParam() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearParam() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get goto => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set goto($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasGoto() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearGoto() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get coverRightText1 => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set coverRightText1($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCoverRightText1() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCoverRightText1() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get rightDesc1 => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set rightDesc1($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasRightDesc1() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearRightDesc1() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get rightDesc2 => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set rightDesc2($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasRightDesc2() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearRightDesc2() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get coverGif => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set coverGif($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasCoverGif() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearCoverGif() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.int get rightIcon1 => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set rightIcon1($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasRightIcon1() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearRightIcon1() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.int get rightIcon2 => $_getIZ(10);\n  @$pb.TagNumber(11)\n  set rightIcon2($core.int value) => $_setSignedInt32(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasRightIcon2() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearRightIcon2() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get coverRightTextContentDescription => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set coverRightTextContentDescription($core.String value) =>\n      $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasCoverRightTextContentDescription() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearCoverRightTextContentDescription() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.String get rightDesc1ContentDescription => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set rightDesc1ContentDescription($core.String value) =>\n      $_setString(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasRightDesc1ContentDescription() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearRightDesc1ContentDescription() => $_clearField(13);\n}\n\nclass SmallCoverV2 extends $pb.GeneratedMessage {\n  factory SmallCoverV2({\n    Base? base,\n    $core.String? coverGif,\n    $core.int? coverBlur,\n    $core.String? coverLeftText1,\n    $core.int? coverLeftIcon1,\n    $core.String? coverLeftText2,\n    $core.int? coverLeftIcon2,\n    $core.String? coverRightText,\n    $core.int? coverRightIcon,\n    $core.String? coverRightBackgroundColor,\n    $core.String? subtitle,\n    $core.String? badge,\n    $core.String? rcmdReason,\n    $core.String? desc,\n    Avatar? avatar,\n    $core.int? officialIcon,\n    $core.int? canPlay,\n    ReasonStyle? rcmdReasonStyle,\n    ReasonStyle? rcmdReasonStyleV2,\n    LikeButton? likeButton,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (coverGif != null) result.coverGif = coverGif;\n    if (coverBlur != null) result.coverBlur = coverBlur;\n    if (coverLeftText1 != null) result.coverLeftText1 = coverLeftText1;\n    if (coverLeftIcon1 != null) result.coverLeftIcon1 = coverLeftIcon1;\n    if (coverLeftText2 != null) result.coverLeftText2 = coverLeftText2;\n    if (coverLeftIcon2 != null) result.coverLeftIcon2 = coverLeftIcon2;\n    if (coverRightText != null) result.coverRightText = coverRightText;\n    if (coverRightIcon != null) result.coverRightIcon = coverRightIcon;\n    if (coverRightBackgroundColor != null)\n      result.coverRightBackgroundColor = coverRightBackgroundColor;\n    if (subtitle != null) result.subtitle = subtitle;\n    if (badge != null) result.badge = badge;\n    if (rcmdReason != null) result.rcmdReason = rcmdReason;\n    if (desc != null) result.desc = desc;\n    if (avatar != null) result.avatar = avatar;\n    if (officialIcon != null) result.officialIcon = officialIcon;\n    if (canPlay != null) result.canPlay = canPlay;\n    if (rcmdReasonStyle != null) result.rcmdReasonStyle = rcmdReasonStyle;\n    if (rcmdReasonStyleV2 != null) result.rcmdReasonStyleV2 = rcmdReasonStyleV2;\n    if (likeButton != null) result.likeButton = likeButton;\n    return result;\n  }\n\n  SmallCoverV2._();\n\n  factory SmallCoverV2.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SmallCoverV2.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SmallCoverV2',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..aOS(2, _omitFieldNames ? '' : 'coverGif')\n    ..aI(3, _omitFieldNames ? '' : 'coverBlur')\n    ..aOS(4, _omitFieldNames ? '' : 'coverLeftText1')\n    ..aI(5, _omitFieldNames ? '' : 'coverLeftIcon1')\n    ..aOS(6, _omitFieldNames ? '' : 'coverLeftText2')\n    ..aI(7, _omitFieldNames ? '' : 'coverLeftIcon2')\n    ..aOS(8, _omitFieldNames ? '' : 'coverRightText')\n    ..aI(9, _omitFieldNames ? '' : 'coverRightIcon')\n    ..aOS(10, _omitFieldNames ? '' : 'coverRightBackgroundColor')\n    ..aOS(11, _omitFieldNames ? '' : 'subtitle')\n    ..aOS(12, _omitFieldNames ? '' : 'badge')\n    ..aOS(13, _omitFieldNames ? '' : 'rcmdReason')\n    ..aOS(14, _omitFieldNames ? '' : 'desc')\n    ..aOM<Avatar>(15, _omitFieldNames ? '' : 'avatar',\n        subBuilder: Avatar.create)\n    ..aI(16, _omitFieldNames ? '' : 'officialIcon')\n    ..aI(17, _omitFieldNames ? '' : 'canPlay')\n    ..aOM<ReasonStyle>(18, _omitFieldNames ? '' : 'rcmdReasonStyle',\n        subBuilder: ReasonStyle.create)\n    ..aOM<ReasonStyle>(19, _omitFieldNames ? '' : 'rcmdReasonStyleV2',\n        subBuilder: ReasonStyle.create)\n    ..aOM<LikeButton>(20, _omitFieldNames ? '' : 'likeButton',\n        subBuilder: LikeButton.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SmallCoverV2 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SmallCoverV2 copyWith(void Function(SmallCoverV2) updates) =>\n      super.copyWith((message) => updates(message as SmallCoverV2))\n          as SmallCoverV2;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SmallCoverV2 create() => SmallCoverV2._();\n  @$core.override\n  SmallCoverV2 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SmallCoverV2 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SmallCoverV2>(create);\n  static SmallCoverV2? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get coverGif => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set coverGif($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCoverGif() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCoverGif() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get coverBlur => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set coverBlur($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCoverBlur() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCoverBlur() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get coverLeftText1 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set coverLeftText1($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCoverLeftText1() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCoverLeftText1() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get coverLeftIcon1 => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set coverLeftIcon1($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCoverLeftIcon1() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCoverLeftIcon1() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get coverLeftText2 => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set coverLeftText2($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCoverLeftText2() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCoverLeftText2() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get coverLeftIcon2 => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set coverLeftIcon2($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCoverLeftIcon2() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCoverLeftIcon2() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get coverRightText => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set coverRightText($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasCoverRightText() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearCoverRightText() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.int get coverRightIcon => $_getIZ(8);\n  @$pb.TagNumber(9)\n  set coverRightIcon($core.int value) => $_setSignedInt32(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasCoverRightIcon() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearCoverRightIcon() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get coverRightBackgroundColor => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set coverRightBackgroundColor($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasCoverRightBackgroundColor() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearCoverRightBackgroundColor() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get subtitle => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set subtitle($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasSubtitle() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearSubtitle() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get badge => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set badge($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasBadge() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearBadge() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.String get rcmdReason => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set rcmdReason($core.String value) => $_setString(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasRcmdReason() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearRcmdReason() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.String get desc => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set desc($core.String value) => $_setString(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasDesc() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearDesc() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  Avatar get avatar => $_getN(14);\n  @$pb.TagNumber(15)\n  set avatar(Avatar value) => $_setField(15, value);\n  @$pb.TagNumber(15)\n  $core.bool hasAvatar() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearAvatar() => $_clearField(15);\n  @$pb.TagNumber(15)\n  Avatar ensureAvatar() => $_ensure(14);\n\n  @$pb.TagNumber(16)\n  $core.int get officialIcon => $_getIZ(15);\n  @$pb.TagNumber(16)\n  set officialIcon($core.int value) => $_setSignedInt32(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasOfficialIcon() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearOfficialIcon() => $_clearField(16);\n\n  @$pb.TagNumber(17)\n  $core.int get canPlay => $_getIZ(16);\n  @$pb.TagNumber(17)\n  set canPlay($core.int value) => $_setSignedInt32(16, value);\n  @$pb.TagNumber(17)\n  $core.bool hasCanPlay() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearCanPlay() => $_clearField(17);\n\n  @$pb.TagNumber(18)\n  ReasonStyle get rcmdReasonStyle => $_getN(17);\n  @$pb.TagNumber(18)\n  set rcmdReasonStyle(ReasonStyle value) => $_setField(18, value);\n  @$pb.TagNumber(18)\n  $core.bool hasRcmdReasonStyle() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearRcmdReasonStyle() => $_clearField(18);\n  @$pb.TagNumber(18)\n  ReasonStyle ensureRcmdReasonStyle() => $_ensure(17);\n\n  @$pb.TagNumber(19)\n  ReasonStyle get rcmdReasonStyleV2 => $_getN(18);\n  @$pb.TagNumber(19)\n  set rcmdReasonStyleV2(ReasonStyle value) => $_setField(19, value);\n  @$pb.TagNumber(19)\n  $core.bool hasRcmdReasonStyleV2() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearRcmdReasonStyleV2() => $_clearField(19);\n  @$pb.TagNumber(19)\n  ReasonStyle ensureRcmdReasonStyleV2() => $_ensure(18);\n\n  @$pb.TagNumber(20)\n  LikeButton get likeButton => $_getN(19);\n  @$pb.TagNumber(20)\n  set likeButton(LikeButton value) => $_setField(20, value);\n  @$pb.TagNumber(20)\n  $core.bool hasLikeButton() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearLikeButton() => $_clearField(20);\n  @$pb.TagNumber(20)\n  LikeButton ensureLikeButton() => $_ensure(19);\n}\n\nclass SmallCoverV3 extends $pb.GeneratedMessage {\n  factory SmallCoverV3({\n    Base? base,\n    Avatar? avatar,\n    $core.String? coverLeftText,\n    Button? coverRightButton,\n    $core.String? rcmdReason,\n    $core.String? desc,\n    $core.int? officialIcon,\n    $core.int? canPlay,\n    ReasonStyle? rcmdReasonStyle,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (avatar != null) result.avatar = avatar;\n    if (coverLeftText != null) result.coverLeftText = coverLeftText;\n    if (coverRightButton != null) result.coverRightButton = coverRightButton;\n    if (rcmdReason != null) result.rcmdReason = rcmdReason;\n    if (desc != null) result.desc = desc;\n    if (officialIcon != null) result.officialIcon = officialIcon;\n    if (canPlay != null) result.canPlay = canPlay;\n    if (rcmdReasonStyle != null) result.rcmdReasonStyle = rcmdReasonStyle;\n    return result;\n  }\n\n  SmallCoverV3._();\n\n  factory SmallCoverV3.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SmallCoverV3.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SmallCoverV3',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..aOM<Avatar>(2, _omitFieldNames ? '' : 'avatar', subBuilder: Avatar.create)\n    ..aOS(3, _omitFieldNames ? '' : 'coverLeftText')\n    ..aOM<Button>(4, _omitFieldNames ? '' : 'coverRightButton',\n        subBuilder: Button.create)\n    ..aOS(5, _omitFieldNames ? '' : 'rcmdReason')\n    ..aOS(6, _omitFieldNames ? '' : 'desc')\n    ..aI(7, _omitFieldNames ? '' : 'officialIcon')\n    ..aI(8, _omitFieldNames ? '' : 'canPlay')\n    ..aOM<ReasonStyle>(9, _omitFieldNames ? '' : 'rcmdReasonStyle',\n        subBuilder: ReasonStyle.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SmallCoverV3 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SmallCoverV3 copyWith(void Function(SmallCoverV3) updates) =>\n      super.copyWith((message) => updates(message as SmallCoverV3))\n          as SmallCoverV3;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SmallCoverV3 create() => SmallCoverV3._();\n  @$core.override\n  SmallCoverV3 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SmallCoverV3 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SmallCoverV3>(create);\n  static SmallCoverV3? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  Avatar get avatar => $_getN(1);\n  @$pb.TagNumber(2)\n  set avatar(Avatar value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAvatar() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAvatar() => $_clearField(2);\n  @$pb.TagNumber(2)\n  Avatar ensureAvatar() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.String get coverLeftText => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set coverLeftText($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCoverLeftText() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCoverLeftText() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  Button get coverRightButton => $_getN(3);\n  @$pb.TagNumber(4)\n  set coverRightButton(Button value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCoverRightButton() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCoverRightButton() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Button ensureCoverRightButton() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.String get rcmdReason => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set rcmdReason($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasRcmdReason() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearRcmdReason() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get desc => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set desc($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasDesc() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearDesc() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get officialIcon => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set officialIcon($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasOfficialIcon() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearOfficialIcon() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get canPlay => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set canPlay($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasCanPlay() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearCanPlay() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  ReasonStyle get rcmdReasonStyle => $_getN(8);\n  @$pb.TagNumber(9)\n  set rcmdReasonStyle(ReasonStyle value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasRcmdReasonStyle() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearRcmdReasonStyle() => $_clearField(9);\n  @$pb.TagNumber(9)\n  ReasonStyle ensureRcmdReasonStyle() => $_ensure(8);\n}\n\nclass SmallCoverV4 extends $pb.GeneratedMessage {\n  factory SmallCoverV4({\n    Base? base,\n    $core.String? coverBadge,\n    $core.String? desc,\n    $core.String? titleRightText,\n    $core.int? titleRightPic,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (coverBadge != null) result.coverBadge = coverBadge;\n    if (desc != null) result.desc = desc;\n    if (titleRightText != null) result.titleRightText = titleRightText;\n    if (titleRightPic != null) result.titleRightPic = titleRightPic;\n    return result;\n  }\n\n  SmallCoverV4._();\n\n  factory SmallCoverV4.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SmallCoverV4.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SmallCoverV4',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..aOS(2, _omitFieldNames ? '' : 'coverBadge')\n    ..aOS(3, _omitFieldNames ? '' : 'desc')\n    ..aOS(4, _omitFieldNames ? '' : 'titleRightText')\n    ..aI(5, _omitFieldNames ? '' : 'titleRightPic')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SmallCoverV4 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SmallCoverV4 copyWith(void Function(SmallCoverV4) updates) =>\n      super.copyWith((message) => updates(message as SmallCoverV4))\n          as SmallCoverV4;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SmallCoverV4 create() => SmallCoverV4._();\n  @$core.override\n  SmallCoverV4 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SmallCoverV4 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SmallCoverV4>(create);\n  static SmallCoverV4? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get coverBadge => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set coverBadge($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCoverBadge() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCoverBadge() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get desc => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set desc($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDesc() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDesc() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get titleRightText => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set titleRightText($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTitleRightText() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTitleRightText() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get titleRightPic => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set titleRightPic($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasTitleRightPic() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearTitleRightPic() => $_clearField(5);\n}\n\nclass SmallCoverV5 extends $pb.GeneratedMessage {\n  factory SmallCoverV5({\n    Base? base,\n    $core.String? coverGif,\n    Up? up,\n    $core.String? coverRightText1,\n    $core.String? rightDesc1,\n    $core.String? rightDesc2,\n    ReasonStyle? rcmdReasonStyle,\n    HotwordEntrance? hotwordEntrance,\n    ReasonStyle? cornerMarkStyle,\n    $core.int? rightIcon1,\n    $core.int? rightIcon2,\n    ReasonStyle? leftCornerMarkStyle,\n    $core.String? coverRightTextContentDescription,\n    $core.String? rightDesc1ContentDescription,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (coverGif != null) result.coverGif = coverGif;\n    if (up != null) result.up = up;\n    if (coverRightText1 != null) result.coverRightText1 = coverRightText1;\n    if (rightDesc1 != null) result.rightDesc1 = rightDesc1;\n    if (rightDesc2 != null) result.rightDesc2 = rightDesc2;\n    if (rcmdReasonStyle != null) result.rcmdReasonStyle = rcmdReasonStyle;\n    if (hotwordEntrance != null) result.hotwordEntrance = hotwordEntrance;\n    if (cornerMarkStyle != null) result.cornerMarkStyle = cornerMarkStyle;\n    if (rightIcon1 != null) result.rightIcon1 = rightIcon1;\n    if (rightIcon2 != null) result.rightIcon2 = rightIcon2;\n    if (leftCornerMarkStyle != null)\n      result.leftCornerMarkStyle = leftCornerMarkStyle;\n    if (coverRightTextContentDescription != null)\n      result.coverRightTextContentDescription =\n          coverRightTextContentDescription;\n    if (rightDesc1ContentDescription != null)\n      result.rightDesc1ContentDescription = rightDesc1ContentDescription;\n    return result;\n  }\n\n  SmallCoverV5._();\n\n  factory SmallCoverV5.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SmallCoverV5.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SmallCoverV5',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..aOS(2, _omitFieldNames ? '' : 'coverGif')\n    ..aOM<Up>(3, _omitFieldNames ? '' : 'up', subBuilder: Up.create)\n    ..aOS(4, _omitFieldNames ? '' : 'coverRightText1')\n    ..aOS(5, _omitFieldNames ? '' : 'rightDesc1')\n    ..aOS(6, _omitFieldNames ? '' : 'rightDesc2')\n    ..aOM<ReasonStyle>(7, _omitFieldNames ? '' : 'rcmdReasonStyle',\n        subBuilder: ReasonStyle.create)\n    ..aOM<HotwordEntrance>(8, _omitFieldNames ? '' : 'hotwordEntrance',\n        subBuilder: HotwordEntrance.create)\n    ..aOM<ReasonStyle>(9, _omitFieldNames ? '' : 'cornerMarkStyle',\n        subBuilder: ReasonStyle.create)\n    ..aI(10, _omitFieldNames ? '' : 'rightIcon1')\n    ..aI(11, _omitFieldNames ? '' : 'rightIcon2')\n    ..aOM<ReasonStyle>(12, _omitFieldNames ? '' : 'leftCornerMarkStyle',\n        subBuilder: ReasonStyle.create)\n    ..aOS(13, _omitFieldNames ? '' : 'coverRightTextContentDescription')\n    ..aOS(14, _omitFieldNames ? '' : 'rightDesc1ContentDescription')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SmallCoverV5 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SmallCoverV5 copyWith(void Function(SmallCoverV5) updates) =>\n      super.copyWith((message) => updates(message as SmallCoverV5))\n          as SmallCoverV5;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SmallCoverV5 create() => SmallCoverV5._();\n  @$core.override\n  SmallCoverV5 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SmallCoverV5 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SmallCoverV5>(create);\n  static SmallCoverV5? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get coverGif => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set coverGif($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCoverGif() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCoverGif() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  Up get up => $_getN(2);\n  @$pb.TagNumber(3)\n  set up(Up value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUp() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUp() => $_clearField(3);\n  @$pb.TagNumber(3)\n  Up ensureUp() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.String get coverRightText1 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set coverRightText1($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCoverRightText1() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCoverRightText1() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get rightDesc1 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set rightDesc1($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasRightDesc1() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearRightDesc1() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get rightDesc2 => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set rightDesc2($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasRightDesc2() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearRightDesc2() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  ReasonStyle get rcmdReasonStyle => $_getN(6);\n  @$pb.TagNumber(7)\n  set rcmdReasonStyle(ReasonStyle value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasRcmdReasonStyle() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearRcmdReasonStyle() => $_clearField(7);\n  @$pb.TagNumber(7)\n  ReasonStyle ensureRcmdReasonStyle() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  HotwordEntrance get hotwordEntrance => $_getN(7);\n  @$pb.TagNumber(8)\n  set hotwordEntrance(HotwordEntrance value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasHotwordEntrance() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearHotwordEntrance() => $_clearField(8);\n  @$pb.TagNumber(8)\n  HotwordEntrance ensureHotwordEntrance() => $_ensure(7);\n\n  /// 直播小卡角标\n  @$pb.TagNumber(9)\n  ReasonStyle get cornerMarkStyle => $_getN(8);\n  @$pb.TagNumber(9)\n  set cornerMarkStyle(ReasonStyle value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasCornerMarkStyle() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearCornerMarkStyle() => $_clearField(9);\n  @$pb.TagNumber(9)\n  ReasonStyle ensureCornerMarkStyle() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  $core.int get rightIcon1 => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set rightIcon1($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasRightIcon1() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearRightIcon1() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.int get rightIcon2 => $_getIZ(10);\n  @$pb.TagNumber(11)\n  set rightIcon2($core.int value) => $_setSignedInt32(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasRightIcon2() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearRightIcon2() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  ReasonStyle get leftCornerMarkStyle => $_getN(11);\n  @$pb.TagNumber(12)\n  set leftCornerMarkStyle(ReasonStyle value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasLeftCornerMarkStyle() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearLeftCornerMarkStyle() => $_clearField(12);\n  @$pb.TagNumber(12)\n  ReasonStyle ensureLeftCornerMarkStyle() => $_ensure(11);\n\n  @$pb.TagNumber(13)\n  $core.String get coverRightTextContentDescription => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set coverRightTextContentDescription($core.String value) =>\n      $_setString(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasCoverRightTextContentDescription() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearCoverRightTextContentDescription() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.String get rightDesc1ContentDescription => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set rightDesc1ContentDescription($core.String value) =>\n      $_setString(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasRightDesc1ContentDescription() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearRightDesc1ContentDescription() => $_clearField(14);\n}\n\nclass SmallCoverV5Ad extends $pb.GeneratedMessage {\n  factory SmallCoverV5Ad({\n    Base? base,\n    $core.String? coverGif,\n    Up? up,\n    $core.String? coverRightText1,\n    $core.String? rightDesc1,\n    $core.String? rightDesc2,\n    ReasonStyle? rcmdReasonStyle,\n    HotwordEntrance? hotwordEntrance,\n    ReasonStyle? cornerMarkStyle,\n    $core.int? rightIcon1,\n    $core.int? rightIcon2,\n    ReasonStyle? leftCornerMarkStyle,\n    $core.String? coverRightTextContentDescription,\n    $core.String? rightDesc1ContentDescription,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (coverGif != null) result.coverGif = coverGif;\n    if (up != null) result.up = up;\n    if (coverRightText1 != null) result.coverRightText1 = coverRightText1;\n    if (rightDesc1 != null) result.rightDesc1 = rightDesc1;\n    if (rightDesc2 != null) result.rightDesc2 = rightDesc2;\n    if (rcmdReasonStyle != null) result.rcmdReasonStyle = rcmdReasonStyle;\n    if (hotwordEntrance != null) result.hotwordEntrance = hotwordEntrance;\n    if (cornerMarkStyle != null) result.cornerMarkStyle = cornerMarkStyle;\n    if (rightIcon1 != null) result.rightIcon1 = rightIcon1;\n    if (rightIcon2 != null) result.rightIcon2 = rightIcon2;\n    if (leftCornerMarkStyle != null)\n      result.leftCornerMarkStyle = leftCornerMarkStyle;\n    if (coverRightTextContentDescription != null)\n      result.coverRightTextContentDescription =\n          coverRightTextContentDescription;\n    if (rightDesc1ContentDescription != null)\n      result.rightDesc1ContentDescription = rightDesc1ContentDescription;\n    return result;\n  }\n\n  SmallCoverV5Ad._();\n\n  factory SmallCoverV5Ad.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SmallCoverV5Ad.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SmallCoverV5Ad',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..aOS(2, _omitFieldNames ? '' : 'coverGif')\n    ..aOM<Up>(3, _omitFieldNames ? '' : 'up', subBuilder: Up.create)\n    ..aOS(4, _omitFieldNames ? '' : 'coverRightText1')\n    ..aOS(5, _omitFieldNames ? '' : 'rightDesc1')\n    ..aOS(6, _omitFieldNames ? '' : 'rightDesc2')\n    ..aOM<ReasonStyle>(7, _omitFieldNames ? '' : 'rcmdReasonStyle',\n        subBuilder: ReasonStyle.create)\n    ..aOM<HotwordEntrance>(8, _omitFieldNames ? '' : 'hotwordEntrance',\n        subBuilder: HotwordEntrance.create)\n    ..aOM<ReasonStyle>(9, _omitFieldNames ? '' : 'cornerMarkStyle',\n        subBuilder: ReasonStyle.create)\n    ..aI(10, _omitFieldNames ? '' : 'rightIcon1')\n    ..aI(11, _omitFieldNames ? '' : 'rightIcon2')\n    ..aOM<ReasonStyle>(12, _omitFieldNames ? '' : 'leftCornerMarkStyle',\n        subBuilder: ReasonStyle.create)\n    ..aOS(13, _omitFieldNames ? '' : 'coverRightTextContentDescription')\n    ..aOS(14, _omitFieldNames ? '' : 'rightDesc1ContentDescription')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SmallCoverV5Ad clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SmallCoverV5Ad copyWith(void Function(SmallCoverV5Ad) updates) =>\n      super.copyWith((message) => updates(message as SmallCoverV5Ad))\n          as SmallCoverV5Ad;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SmallCoverV5Ad create() => SmallCoverV5Ad._();\n  @$core.override\n  SmallCoverV5Ad createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SmallCoverV5Ad getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SmallCoverV5Ad>(create);\n  static SmallCoverV5Ad? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get coverGif => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set coverGif($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCoverGif() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCoverGif() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  Up get up => $_getN(2);\n  @$pb.TagNumber(3)\n  set up(Up value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUp() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUp() => $_clearField(3);\n  @$pb.TagNumber(3)\n  Up ensureUp() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.String get coverRightText1 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set coverRightText1($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCoverRightText1() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCoverRightText1() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get rightDesc1 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set rightDesc1($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasRightDesc1() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearRightDesc1() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get rightDesc2 => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set rightDesc2($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasRightDesc2() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearRightDesc2() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  ReasonStyle get rcmdReasonStyle => $_getN(6);\n  @$pb.TagNumber(7)\n  set rcmdReasonStyle(ReasonStyle value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasRcmdReasonStyle() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearRcmdReasonStyle() => $_clearField(7);\n  @$pb.TagNumber(7)\n  ReasonStyle ensureRcmdReasonStyle() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  HotwordEntrance get hotwordEntrance => $_getN(7);\n  @$pb.TagNumber(8)\n  set hotwordEntrance(HotwordEntrance value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasHotwordEntrance() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearHotwordEntrance() => $_clearField(8);\n  @$pb.TagNumber(8)\n  HotwordEntrance ensureHotwordEntrance() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  ReasonStyle get cornerMarkStyle => $_getN(8);\n  @$pb.TagNumber(9)\n  set cornerMarkStyle(ReasonStyle value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasCornerMarkStyle() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearCornerMarkStyle() => $_clearField(9);\n  @$pb.TagNumber(9)\n  ReasonStyle ensureCornerMarkStyle() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  $core.int get rightIcon1 => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set rightIcon1($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasRightIcon1() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearRightIcon1() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.int get rightIcon2 => $_getIZ(10);\n  @$pb.TagNumber(11)\n  set rightIcon2($core.int value) => $_setSignedInt32(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasRightIcon2() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearRightIcon2() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  ReasonStyle get leftCornerMarkStyle => $_getN(11);\n  @$pb.TagNumber(12)\n  set leftCornerMarkStyle(ReasonStyle value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasLeftCornerMarkStyle() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearLeftCornerMarkStyle() => $_clearField(12);\n  @$pb.TagNumber(12)\n  ReasonStyle ensureLeftCornerMarkStyle() => $_ensure(11);\n\n  @$pb.TagNumber(13)\n  $core.String get coverRightTextContentDescription => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set coverRightTextContentDescription($core.String value) =>\n      $_setString(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasCoverRightTextContentDescription() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearCoverRightTextContentDescription() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.String get rightDesc1ContentDescription => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set rightDesc1ContentDescription($core.String value) =>\n      $_setString(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasRightDesc1ContentDescription() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearRightDesc1ContentDescription() => $_clearField(14);\n}\n\nclass SmallCoverV7 extends $pb.GeneratedMessage {\n  factory SmallCoverV7({\n    Base? base,\n    $core.String? desc,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (desc != null) result.desc = desc;\n    return result;\n  }\n\n  SmallCoverV7._();\n\n  factory SmallCoverV7.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SmallCoverV7.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SmallCoverV7',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..aOS(2, _omitFieldNames ? '' : 'desc')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SmallCoverV7 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SmallCoverV7 copyWith(void Function(SmallCoverV7) updates) =>\n      super.copyWith((message) => updates(message as SmallCoverV7))\n          as SmallCoverV7;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SmallCoverV7 create() => SmallCoverV7._();\n  @$core.override\n  SmallCoverV7 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SmallCoverV7 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SmallCoverV7>(create);\n  static SmallCoverV7? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get desc => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set desc($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDesc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDesc() => $_clearField(2);\n}\n\nclass SmallCoverV9 extends $pb.GeneratedMessage {\n  factory SmallCoverV9({\n    Base? base,\n    $core.String? coverLeftText1,\n    $core.int? coverLeftIcon1,\n    $core.String? coverLeftText2,\n    $core.int? coverLeftIcon2,\n    $core.String? coverRightText,\n    $core.int? coverRightIcon,\n    $core.int? canPlay,\n    ReasonStyle? rcmdReasonStyle,\n    Up? up,\n    ReasonStyle? leftCoverBadgeStyle,\n    ReasonStyle? leftBottomRcmdReasonStyle,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (coverLeftText1 != null) result.coverLeftText1 = coverLeftText1;\n    if (coverLeftIcon1 != null) result.coverLeftIcon1 = coverLeftIcon1;\n    if (coverLeftText2 != null) result.coverLeftText2 = coverLeftText2;\n    if (coverLeftIcon2 != null) result.coverLeftIcon2 = coverLeftIcon2;\n    if (coverRightText != null) result.coverRightText = coverRightText;\n    if (coverRightIcon != null) result.coverRightIcon = coverRightIcon;\n    if (canPlay != null) result.canPlay = canPlay;\n    if (rcmdReasonStyle != null) result.rcmdReasonStyle = rcmdReasonStyle;\n    if (up != null) result.up = up;\n    if (leftCoverBadgeStyle != null)\n      result.leftCoverBadgeStyle = leftCoverBadgeStyle;\n    if (leftBottomRcmdReasonStyle != null)\n      result.leftBottomRcmdReasonStyle = leftBottomRcmdReasonStyle;\n    return result;\n  }\n\n  SmallCoverV9._();\n\n  factory SmallCoverV9.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SmallCoverV9.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SmallCoverV9',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..aOS(2, _omitFieldNames ? '' : 'coverLeftText1')\n    ..aI(3, _omitFieldNames ? '' : 'coverLeftIcon1')\n    ..aOS(4, _omitFieldNames ? '' : 'coverLeftText2')\n    ..aI(5, _omitFieldNames ? '' : 'coverLeftIcon2')\n    ..aOS(6, _omitFieldNames ? '' : 'coverRightText')\n    ..aI(7, _omitFieldNames ? '' : 'coverRightIcon')\n    ..aI(8, _omitFieldNames ? '' : 'canPlay')\n    ..aOM<ReasonStyle>(9, _omitFieldNames ? '' : 'rcmdReasonStyle',\n        subBuilder: ReasonStyle.create)\n    ..aOM<Up>(10, _omitFieldNames ? '' : 'up', subBuilder: Up.create)\n    ..aOM<ReasonStyle>(11, _omitFieldNames ? '' : 'leftCoverBadgeStyle',\n        subBuilder: ReasonStyle.create)\n    ..aOM<ReasonStyle>(12, _omitFieldNames ? '' : 'leftBottomRcmdReasonStyle',\n        subBuilder: ReasonStyle.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SmallCoverV9 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SmallCoverV9 copyWith(void Function(SmallCoverV9) updates) =>\n      super.copyWith((message) => updates(message as SmallCoverV9))\n          as SmallCoverV9;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SmallCoverV9 create() => SmallCoverV9._();\n  @$core.override\n  SmallCoverV9 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SmallCoverV9 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SmallCoverV9>(create);\n  static SmallCoverV9? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get coverLeftText1 => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set coverLeftText1($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCoverLeftText1() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCoverLeftText1() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get coverLeftIcon1 => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set coverLeftIcon1($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCoverLeftIcon1() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCoverLeftIcon1() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get coverLeftText2 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set coverLeftText2($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCoverLeftText2() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCoverLeftText2() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get coverLeftIcon2 => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set coverLeftIcon2($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCoverLeftIcon2() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCoverLeftIcon2() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get coverRightText => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set coverRightText($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCoverRightText() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCoverRightText() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get coverRightIcon => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set coverRightIcon($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCoverRightIcon() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCoverRightIcon() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get canPlay => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set canPlay($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasCanPlay() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearCanPlay() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  ReasonStyle get rcmdReasonStyle => $_getN(8);\n  @$pb.TagNumber(9)\n  set rcmdReasonStyle(ReasonStyle value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasRcmdReasonStyle() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearRcmdReasonStyle() => $_clearField(9);\n  @$pb.TagNumber(9)\n  ReasonStyle ensureRcmdReasonStyle() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  Up get up => $_getN(9);\n  @$pb.TagNumber(10)\n  set up(Up value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasUp() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearUp() => $_clearField(10);\n  @$pb.TagNumber(10)\n  Up ensureUp() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  ReasonStyle get leftCoverBadgeStyle => $_getN(10);\n  @$pb.TagNumber(11)\n  set leftCoverBadgeStyle(ReasonStyle value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasLeftCoverBadgeStyle() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearLeftCoverBadgeStyle() => $_clearField(11);\n  @$pb.TagNumber(11)\n  ReasonStyle ensureLeftCoverBadgeStyle() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  ReasonStyle get leftBottomRcmdReasonStyle => $_getN(11);\n  @$pb.TagNumber(12)\n  set leftBottomRcmdReasonStyle(ReasonStyle value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasLeftBottomRcmdReasonStyle() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearLeftBottomRcmdReasonStyle() => $_clearField(12);\n  @$pb.TagNumber(12)\n  ReasonStyle ensureLeftBottomRcmdReasonStyle() => $_ensure(11);\n}\n\nclass ThreeItemAllV2 extends $pb.GeneratedMessage {\n  factory ThreeItemAllV2({\n    Base? base,\n    ReasonStyle? topRcmdReasonStyle,\n    $core.Iterable<TwoItemHV1Item>? item,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (topRcmdReasonStyle != null)\n      result.topRcmdReasonStyle = topRcmdReasonStyle;\n    if (item != null) result.item.addAll(item);\n    return result;\n  }\n\n  ThreeItemAllV2._();\n\n  factory ThreeItemAllV2.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreeItemAllV2.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreeItemAllV2',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..aOM<ReasonStyle>(2, _omitFieldNames ? '' : 'topRcmdReasonStyle',\n        subBuilder: ReasonStyle.create)\n    ..pPM<TwoItemHV1Item>(3, _omitFieldNames ? '' : 'item',\n        subBuilder: TwoItemHV1Item.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreeItemAllV2 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreeItemAllV2 copyWith(void Function(ThreeItemAllV2) updates) =>\n      super.copyWith((message) => updates(message as ThreeItemAllV2))\n          as ThreeItemAllV2;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreeItemAllV2 create() => ThreeItemAllV2._();\n  @$core.override\n  ThreeItemAllV2 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreeItemAllV2 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreeItemAllV2>(create);\n  static ThreeItemAllV2? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  ReasonStyle get topRcmdReasonStyle => $_getN(1);\n  @$pb.TagNumber(2)\n  set topRcmdReasonStyle(ReasonStyle value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTopRcmdReasonStyle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTopRcmdReasonStyle() => $_clearField(2);\n  @$pb.TagNumber(2)\n  ReasonStyle ensureTopRcmdReasonStyle() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<TwoItemHV1Item> get item => $_getList(2);\n}\n\nclass ThreeItemV1 extends $pb.GeneratedMessage {\n  factory ThreeItemV1({\n    Base? base,\n    $core.int? titleIcon,\n    $core.String? moreUri,\n    $core.String? moreText,\n    $core.Iterable<ThreeItemV1Item>? items,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (titleIcon != null) result.titleIcon = titleIcon;\n    if (moreUri != null) result.moreUri = moreUri;\n    if (moreText != null) result.moreText = moreText;\n    if (items != null) result.items.addAll(items);\n    return result;\n  }\n\n  ThreeItemV1._();\n\n  factory ThreeItemV1.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreeItemV1.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreeItemV1',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..aI(2, _omitFieldNames ? '' : 'titleIcon')\n    ..aOS(3, _omitFieldNames ? '' : 'moreUri')\n    ..aOS(4, _omitFieldNames ? '' : 'moreText')\n    ..pPM<ThreeItemV1Item>(5, _omitFieldNames ? '' : 'items',\n        subBuilder: ThreeItemV1Item.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreeItemV1 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreeItemV1 copyWith(void Function(ThreeItemV1) updates) =>\n      super.copyWith((message) => updates(message as ThreeItemV1))\n          as ThreeItemV1;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreeItemV1 create() => ThreeItemV1._();\n  @$core.override\n  ThreeItemV1 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreeItemV1 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreeItemV1>(create);\n  static ThreeItemV1? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.int get titleIcon => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set titleIcon($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitleIcon() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitleIcon() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get moreUri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set moreUri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasMoreUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearMoreUri() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get moreText => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set moreText($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasMoreText() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearMoreText() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $pb.PbList<ThreeItemV1Item> get items => $_getList(4);\n}\n\nclass ThreeItemV1Item extends $pb.GeneratedMessage {\n  factory ThreeItemV1Item({\n    Base? base,\n    $core.String? coverLeftText,\n    $core.int? coverLeftIcon,\n    $core.String? desc1,\n    $core.String? desc2,\n    $core.String? badge,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (coverLeftText != null) result.coverLeftText = coverLeftText;\n    if (coverLeftIcon != null) result.coverLeftIcon = coverLeftIcon;\n    if (desc1 != null) result.desc1 = desc1;\n    if (desc2 != null) result.desc2 = desc2;\n    if (badge != null) result.badge = badge;\n    return result;\n  }\n\n  ThreeItemV1Item._();\n\n  factory ThreeItemV1Item.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreeItemV1Item.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreeItemV1Item',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..aOS(2, _omitFieldNames ? '' : 'coverLeftText')\n    ..aI(3, _omitFieldNames ? '' : 'coverLeftIcon')\n    ..aOS(4, _omitFieldNames ? '' : 'desc1')\n    ..aOS(5, _omitFieldNames ? '' : 'desc2')\n    ..aOS(6, _omitFieldNames ? '' : 'badge')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreeItemV1Item clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreeItemV1Item copyWith(void Function(ThreeItemV1Item) updates) =>\n      super.copyWith((message) => updates(message as ThreeItemV1Item))\n          as ThreeItemV1Item;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreeItemV1Item create() => ThreeItemV1Item._();\n  @$core.override\n  ThreeItemV1Item createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreeItemV1Item getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreeItemV1Item>(create);\n  static ThreeItemV1Item? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get coverLeftText => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set coverLeftText($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCoverLeftText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCoverLeftText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get coverLeftIcon => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set coverLeftIcon($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCoverLeftIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCoverLeftIcon() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get desc1 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set desc1($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDesc1() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDesc1() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get desc2 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set desc2($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDesc2() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDesc2() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get badge => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set badge($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasBadge() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearBadge() => $_clearField(6);\n}\n\nclass ThreeItemV2 extends $pb.GeneratedMessage {\n  factory ThreeItemV2({\n    Base? base,\n    $core.int? titleIcon,\n    $core.String? moreUri,\n    $core.String? moreText,\n    $core.Iterable<ThreeItemV2Item>? items,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (titleIcon != null) result.titleIcon = titleIcon;\n    if (moreUri != null) result.moreUri = moreUri;\n    if (moreText != null) result.moreText = moreText;\n    if (items != null) result.items.addAll(items);\n    return result;\n  }\n\n  ThreeItemV2._();\n\n  factory ThreeItemV2.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreeItemV2.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreeItemV2',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..aI(2, _omitFieldNames ? '' : 'titleIcon')\n    ..aOS(3, _omitFieldNames ? '' : 'moreUri')\n    ..aOS(4, _omitFieldNames ? '' : 'moreText')\n    ..pPM<ThreeItemV2Item>(5, _omitFieldNames ? '' : 'items',\n        subBuilder: ThreeItemV2Item.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreeItemV2 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreeItemV2 copyWith(void Function(ThreeItemV2) updates) =>\n      super.copyWith((message) => updates(message as ThreeItemV2))\n          as ThreeItemV2;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreeItemV2 create() => ThreeItemV2._();\n  @$core.override\n  ThreeItemV2 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreeItemV2 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreeItemV2>(create);\n  static ThreeItemV2? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.int get titleIcon => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set titleIcon($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitleIcon() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitleIcon() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get moreUri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set moreUri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasMoreUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearMoreUri() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get moreText => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set moreText($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasMoreText() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearMoreText() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $pb.PbList<ThreeItemV2Item> get items => $_getList(4);\n}\n\nclass ThreeItemV2Item extends $pb.GeneratedMessage {\n  factory ThreeItemV2Item({\n    Base? base,\n    $core.int? coverLeftIcon,\n    $core.String? descText1,\n    $core.int? descIcon1,\n    $core.String? descText2,\n    $core.int? descIcon2,\n    $core.String? badge,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (coverLeftIcon != null) result.coverLeftIcon = coverLeftIcon;\n    if (descText1 != null) result.descText1 = descText1;\n    if (descIcon1 != null) result.descIcon1 = descIcon1;\n    if (descText2 != null) result.descText2 = descText2;\n    if (descIcon2 != null) result.descIcon2 = descIcon2;\n    if (badge != null) result.badge = badge;\n    return result;\n  }\n\n  ThreeItemV2Item._();\n\n  factory ThreeItemV2Item.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreeItemV2Item.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreeItemV2Item',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..aI(2, _omitFieldNames ? '' : 'coverLeftIcon')\n    ..aOS(3, _omitFieldNames ? '' : 'descText1')\n    ..aI(4, _omitFieldNames ? '' : 'descIcon1')\n    ..aOS(5, _omitFieldNames ? '' : 'descText2')\n    ..aI(6, _omitFieldNames ? '' : 'descIcon2')\n    ..aOS(7, _omitFieldNames ? '' : 'badge')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreeItemV2Item clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreeItemV2Item copyWith(void Function(ThreeItemV2Item) updates) =>\n      super.copyWith((message) => updates(message as ThreeItemV2Item))\n          as ThreeItemV2Item;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreeItemV2Item create() => ThreeItemV2Item._();\n  @$core.override\n  ThreeItemV2Item createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreeItemV2Item getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreeItemV2Item>(create);\n  static ThreeItemV2Item? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.int get coverLeftIcon => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set coverLeftIcon($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCoverLeftIcon() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCoverLeftIcon() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get descText1 => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set descText1($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDescText1() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDescText1() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get descIcon1 => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set descIcon1($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDescIcon1() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDescIcon1() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get descText2 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set descText2($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDescText2() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDescText2() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get descIcon2 => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set descIcon2($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasDescIcon2() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearDescIcon2() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get badge => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set badge($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBadge() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBadge() => $_clearField(7);\n}\n\nclass ThreePicV2 extends $pb.GeneratedMessage {\n  factory ThreePicV2({\n    Base? base,\n    $core.String? leftCover,\n    $core.String? rightCover1,\n    $core.String? rightCover2,\n    $core.String? coverLeftText1,\n    $core.int? coverLeftIcon1,\n    $core.String? coverLeftText2,\n    $core.int? coverLeftIcon2,\n    $core.String? coverRightText,\n    $core.int? coverRightIcon,\n    $core.String? coverRightBackgroundColor,\n    $core.String? badge,\n    $core.String? rcmdReason,\n    $core.String? desc,\n    Avatar? avatar,\n    ReasonStyle? rcmdReasonStyle,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (leftCover != null) result.leftCover = leftCover;\n    if (rightCover1 != null) result.rightCover1 = rightCover1;\n    if (rightCover2 != null) result.rightCover2 = rightCover2;\n    if (coverLeftText1 != null) result.coverLeftText1 = coverLeftText1;\n    if (coverLeftIcon1 != null) result.coverLeftIcon1 = coverLeftIcon1;\n    if (coverLeftText2 != null) result.coverLeftText2 = coverLeftText2;\n    if (coverLeftIcon2 != null) result.coverLeftIcon2 = coverLeftIcon2;\n    if (coverRightText != null) result.coverRightText = coverRightText;\n    if (coverRightIcon != null) result.coverRightIcon = coverRightIcon;\n    if (coverRightBackgroundColor != null)\n      result.coverRightBackgroundColor = coverRightBackgroundColor;\n    if (badge != null) result.badge = badge;\n    if (rcmdReason != null) result.rcmdReason = rcmdReason;\n    if (desc != null) result.desc = desc;\n    if (avatar != null) result.avatar = avatar;\n    if (rcmdReasonStyle != null) result.rcmdReasonStyle = rcmdReasonStyle;\n    return result;\n  }\n\n  ThreePicV2._();\n\n  factory ThreePicV2.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreePicV2.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreePicV2',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..aOS(2, _omitFieldNames ? '' : 'leftCover')\n    ..aOS(3, _omitFieldNames ? '' : 'rightCover1')\n    ..aOS(4, _omitFieldNames ? '' : 'rightCover2')\n    ..aOS(5, _omitFieldNames ? '' : 'coverLeftText1')\n    ..aI(6, _omitFieldNames ? '' : 'coverLeftIcon1')\n    ..aOS(7, _omitFieldNames ? '' : 'coverLeftText2')\n    ..aI(8, _omitFieldNames ? '' : 'coverLeftIcon2')\n    ..aOS(9, _omitFieldNames ? '' : 'coverRightText')\n    ..aI(10, _omitFieldNames ? '' : 'coverRightIcon')\n    ..aOS(11, _omitFieldNames ? '' : 'coverRightBackgroundColor')\n    ..aOS(12, _omitFieldNames ? '' : 'badge')\n    ..aOS(13, _omitFieldNames ? '' : 'rcmdReason')\n    ..aOS(14, _omitFieldNames ? '' : 'desc')\n    ..aOM<Avatar>(15, _omitFieldNames ? '' : 'avatar',\n        subBuilder: Avatar.create)\n    ..aOM<ReasonStyle>(16, _omitFieldNames ? '' : 'rcmdReasonStyle',\n        subBuilder: ReasonStyle.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePicV2 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePicV2 copyWith(void Function(ThreePicV2) updates) =>\n      super.copyWith((message) => updates(message as ThreePicV2)) as ThreePicV2;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreePicV2 create() => ThreePicV2._();\n  @$core.override\n  ThreePicV2 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreePicV2 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreePicV2>(create);\n  static ThreePicV2? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get leftCover => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set leftCover($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLeftCover() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLeftCover() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get rightCover1 => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set rightCover1($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRightCover1() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRightCover1() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get rightCover2 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set rightCover2($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasRightCover2() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearRightCover2() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get coverLeftText1 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set coverLeftText1($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCoverLeftText1() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCoverLeftText1() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get coverLeftIcon1 => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set coverLeftIcon1($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCoverLeftIcon1() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCoverLeftIcon1() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get coverLeftText2 => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set coverLeftText2($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCoverLeftText2() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCoverLeftText2() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get coverLeftIcon2 => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set coverLeftIcon2($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasCoverLeftIcon2() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearCoverLeftIcon2() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get coverRightText => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set coverRightText($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasCoverRightText() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearCoverRightText() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.int get coverRightIcon => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set coverRightIcon($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasCoverRightIcon() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearCoverRightIcon() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get coverRightBackgroundColor => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set coverRightBackgroundColor($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasCoverRightBackgroundColor() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearCoverRightBackgroundColor() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get badge => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set badge($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasBadge() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearBadge() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.String get rcmdReason => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set rcmdReason($core.String value) => $_setString(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasRcmdReason() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearRcmdReason() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.String get desc => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set desc($core.String value) => $_setString(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasDesc() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearDesc() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  Avatar get avatar => $_getN(14);\n  @$pb.TagNumber(15)\n  set avatar(Avatar value) => $_setField(15, value);\n  @$pb.TagNumber(15)\n  $core.bool hasAvatar() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearAvatar() => $_clearField(15);\n  @$pb.TagNumber(15)\n  Avatar ensureAvatar() => $_ensure(14);\n\n  @$pb.TagNumber(16)\n  ReasonStyle get rcmdReasonStyle => $_getN(15);\n  @$pb.TagNumber(16)\n  set rcmdReasonStyle(ReasonStyle value) => $_setField(16, value);\n  @$pb.TagNumber(16)\n  $core.bool hasRcmdReasonStyle() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearRcmdReasonStyle() => $_clearField(16);\n  @$pb.TagNumber(16)\n  ReasonStyle ensureRcmdReasonStyle() => $_ensure(15);\n}\n\nclass ThreePicV3 extends $pb.GeneratedMessage {\n  factory ThreePicV3({\n    Base? base,\n    $core.String? leftCover,\n    $core.String? rightCover1,\n    $core.String? rightCover2,\n    $core.String? coverLeftText1,\n    $core.int? coverLeftIcon1,\n    $core.String? coverLeftText2,\n    $core.int? coverLeftIcon2,\n    $core.String? coverRightText,\n    $core.int? coverRightIcon,\n    $core.String? coverRightBackgroundColor,\n    $core.String? badge,\n    ReasonStyle? rcmdReasonStyle,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (leftCover != null) result.leftCover = leftCover;\n    if (rightCover1 != null) result.rightCover1 = rightCover1;\n    if (rightCover2 != null) result.rightCover2 = rightCover2;\n    if (coverLeftText1 != null) result.coverLeftText1 = coverLeftText1;\n    if (coverLeftIcon1 != null) result.coverLeftIcon1 = coverLeftIcon1;\n    if (coverLeftText2 != null) result.coverLeftText2 = coverLeftText2;\n    if (coverLeftIcon2 != null) result.coverLeftIcon2 = coverLeftIcon2;\n    if (coverRightText != null) result.coverRightText = coverRightText;\n    if (coverRightIcon != null) result.coverRightIcon = coverRightIcon;\n    if (coverRightBackgroundColor != null)\n      result.coverRightBackgroundColor = coverRightBackgroundColor;\n    if (badge != null) result.badge = badge;\n    if (rcmdReasonStyle != null) result.rcmdReasonStyle = rcmdReasonStyle;\n    return result;\n  }\n\n  ThreePicV3._();\n\n  factory ThreePicV3.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreePicV3.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreePicV3',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..aOS(2, _omitFieldNames ? '' : 'leftCover')\n    ..aOS(3, _omitFieldNames ? '' : 'rightCover1')\n    ..aOS(4, _omitFieldNames ? '' : 'rightCover2')\n    ..aOS(5, _omitFieldNames ? '' : 'coverLeftText1')\n    ..aI(6, _omitFieldNames ? '' : 'coverLeftIcon1')\n    ..aOS(7, _omitFieldNames ? '' : 'coverLeftText2')\n    ..aI(8, _omitFieldNames ? '' : 'coverLeftIcon2')\n    ..aOS(9, _omitFieldNames ? '' : 'coverRightText')\n    ..aI(10, _omitFieldNames ? '' : 'coverRightIcon')\n    ..aOS(11, _omitFieldNames ? '' : 'coverRightBackgroundColor')\n    ..aOS(12, _omitFieldNames ? '' : 'badge')\n    ..aOM<ReasonStyle>(13, _omitFieldNames ? '' : 'rcmdReasonStyle',\n        subBuilder: ReasonStyle.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePicV3 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePicV3 copyWith(void Function(ThreePicV3) updates) =>\n      super.copyWith((message) => updates(message as ThreePicV3)) as ThreePicV3;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreePicV3 create() => ThreePicV3._();\n  @$core.override\n  ThreePicV3 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreePicV3 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreePicV3>(create);\n  static ThreePicV3? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get leftCover => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set leftCover($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLeftCover() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLeftCover() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get rightCover1 => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set rightCover1($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRightCover1() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRightCover1() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get rightCover2 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set rightCover2($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasRightCover2() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearRightCover2() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get coverLeftText1 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set coverLeftText1($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCoverLeftText1() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCoverLeftText1() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get coverLeftIcon1 => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set coverLeftIcon1($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCoverLeftIcon1() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCoverLeftIcon1() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get coverLeftText2 => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set coverLeftText2($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCoverLeftText2() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCoverLeftText2() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get coverLeftIcon2 => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set coverLeftIcon2($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasCoverLeftIcon2() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearCoverLeftIcon2() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get coverRightText => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set coverRightText($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasCoverRightText() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearCoverRightText() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.int get coverRightIcon => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set coverRightIcon($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasCoverRightIcon() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearCoverRightIcon() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get coverRightBackgroundColor => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set coverRightBackgroundColor($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasCoverRightBackgroundColor() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearCoverRightBackgroundColor() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get badge => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set badge($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasBadge() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearBadge() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  ReasonStyle get rcmdReasonStyle => $_getN(12);\n  @$pb.TagNumber(13)\n  set rcmdReasonStyle(ReasonStyle value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasRcmdReasonStyle() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearRcmdReasonStyle() => $_clearField(13);\n  @$pb.TagNumber(13)\n  ReasonStyle ensureRcmdReasonStyle() => $_ensure(12);\n}\n\nclass ThreePoint extends $pb.GeneratedMessage {\n  factory ThreePoint({\n    $core.Iterable<DislikeReason>? dislikeReasons,\n    $core.Iterable<DislikeReason>? feedbacks,\n    $core.int? watchLater,\n  }) {\n    final result = create();\n    if (dislikeReasons != null) result.dislikeReasons.addAll(dislikeReasons);\n    if (feedbacks != null) result.feedbacks.addAll(feedbacks);\n    if (watchLater != null) result.watchLater = watchLater;\n    return result;\n  }\n\n  ThreePoint._();\n\n  factory ThreePoint.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreePoint.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreePoint',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..pPM<DislikeReason>(1, _omitFieldNames ? '' : 'dislikeReasons',\n        subBuilder: DislikeReason.create)\n    ..pPM<DislikeReason>(2, _omitFieldNames ? '' : 'feedbacks',\n        subBuilder: DislikeReason.create)\n    ..aI(3, _omitFieldNames ? '' : 'watchLater')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePoint clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePoint copyWith(void Function(ThreePoint) updates) =>\n      super.copyWith((message) => updates(message as ThreePoint)) as ThreePoint;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreePoint create() => ThreePoint._();\n  @$core.override\n  ThreePoint createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreePoint getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreePoint>(create);\n  static ThreePoint? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<DislikeReason> get dislikeReasons => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<DislikeReason> get feedbacks => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $core.int get watchLater => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set watchLater($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasWatchLater() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearWatchLater() => $_clearField(3);\n}\n\nclass ThreePointV2 extends $pb.GeneratedMessage {\n  factory ThreePointV2({\n    $core.String? title,\n    $core.String? subtitle,\n    $core.Iterable<DislikeReason>? reasons,\n    $core.String? type,\n    $fixnum.Int64? id,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (subtitle != null) result.subtitle = subtitle;\n    if (reasons != null) result.reasons.addAll(reasons);\n    if (type != null) result.type = type;\n    if (id != null) result.id = id;\n    return result;\n  }\n\n  ThreePointV2._();\n\n  factory ThreePointV2.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreePointV2.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreePointV2',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'subtitle')\n    ..pPM<DislikeReason>(3, _omitFieldNames ? '' : 'reasons',\n        subBuilder: DislikeReason.create)\n    ..aOS(4, _omitFieldNames ? '' : 'type')\n    ..aInt64(5, _omitFieldNames ? '' : 'id')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointV2 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointV2 copyWith(void Function(ThreePointV2) updates) =>\n      super.copyWith((message) => updates(message as ThreePointV2))\n          as ThreePointV2;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreePointV2 create() => ThreePointV2._();\n  @$core.override\n  ThreePointV2 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreePointV2 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreePointV2>(create);\n  static ThreePointV2? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get subtitle => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set subtitle($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSubtitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSubtitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<DislikeReason> get reasons => $_getList(2);\n\n  @$pb.TagNumber(4)\n  $core.String get type => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set type($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearType() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get id => $_getI64(4);\n  @$pb.TagNumber(5)\n  set id($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasId() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearId() => $_clearField(5);\n}\n\nclass ThreePointV3 extends $pb.GeneratedMessage {\n  factory ThreePointV3({\n    $core.String? title,\n    $core.String? selectedTitle,\n    $core.String? subtitle,\n    $core.Iterable<DislikeReason>? reasons,\n    $core.String? type,\n    $fixnum.Int64? id,\n    $core.int? selected,\n    $core.String? icon,\n    $core.String? selectedIcon,\n    $core.String? url,\n    $core.int? defaultId,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (selectedTitle != null) result.selectedTitle = selectedTitle;\n    if (subtitle != null) result.subtitle = subtitle;\n    if (reasons != null) result.reasons.addAll(reasons);\n    if (type != null) result.type = type;\n    if (id != null) result.id = id;\n    if (selected != null) result.selected = selected;\n    if (icon != null) result.icon = icon;\n    if (selectedIcon != null) result.selectedIcon = selectedIcon;\n    if (url != null) result.url = url;\n    if (defaultId != null) result.defaultId = defaultId;\n    return result;\n  }\n\n  ThreePointV3._();\n\n  factory ThreePointV3.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreePointV3.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreePointV3',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'selectedTitle')\n    ..aOS(3, _omitFieldNames ? '' : 'subtitle')\n    ..pPM<DislikeReason>(4, _omitFieldNames ? '' : 'reasons',\n        subBuilder: DislikeReason.create)\n    ..aOS(5, _omitFieldNames ? '' : 'type')\n    ..aInt64(6, _omitFieldNames ? '' : 'id')\n    ..aI(7, _omitFieldNames ? '' : 'selected')\n    ..aOS(8, _omitFieldNames ? '' : 'icon')\n    ..aOS(9, _omitFieldNames ? '' : 'selectedIcon')\n    ..aOS(10, _omitFieldNames ? '' : 'url')\n    ..aI(11, _omitFieldNames ? '' : 'defaultId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointV3 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointV3 copyWith(void Function(ThreePointV3) updates) =>\n      super.copyWith((message) => updates(message as ThreePointV3))\n          as ThreePointV3;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreePointV3 create() => ThreePointV3._();\n  @$core.override\n  ThreePointV3 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreePointV3 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreePointV3>(create);\n  static ThreePointV3? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get selectedTitle => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set selectedTitle($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSelectedTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSelectedTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get subtitle => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set subtitle($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSubtitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSubtitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<DislikeReason> get reasons => $_getList(3);\n\n  @$pb.TagNumber(5)\n  $core.String get type => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set type($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearType() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get id => $_getI64(5);\n  @$pb.TagNumber(6)\n  set id($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasId() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearId() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get selected => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set selected($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasSelected() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearSelected() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get icon => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set icon($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasIcon() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearIcon() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get selectedIcon => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set selectedIcon($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasSelectedIcon() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearSelectedIcon() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get url => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set url($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasUrl() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearUrl() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.int get defaultId => $_getIZ(10);\n  @$pb.TagNumber(11)\n  set defaultId($core.int value) => $_setSignedInt32(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasDefaultId() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearDefaultId() => $_clearField(11);\n}\n\nclass ThreePointV4 extends $pb.GeneratedMessage {\n  factory ThreePointV4({\n    SharePlane? sharePlane,\n    WatchLater? watchLater,\n  }) {\n    final result = create();\n    if (sharePlane != null) result.sharePlane = sharePlane;\n    if (watchLater != null) result.watchLater = watchLater;\n    return result;\n  }\n\n  ThreePointV4._();\n\n  factory ThreePointV4.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreePointV4.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreePointV4',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<SharePlane>(1, _omitFieldNames ? '' : 'sharePlane',\n        subBuilder: SharePlane.create)\n    ..aOM<WatchLater>(2, _omitFieldNames ? '' : 'watchLater',\n        subBuilder: WatchLater.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointV4 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointV4 copyWith(void Function(ThreePointV4) updates) =>\n      super.copyWith((message) => updates(message as ThreePointV4))\n          as ThreePointV4;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreePointV4 create() => ThreePointV4._();\n  @$core.override\n  ThreePointV4 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreePointV4 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreePointV4>(create);\n  static ThreePointV4? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  SharePlane get sharePlane => $_getN(0);\n  @$pb.TagNumber(1)\n  set sharePlane(SharePlane value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSharePlane() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSharePlane() => $_clearField(1);\n  @$pb.TagNumber(1)\n  SharePlane ensureSharePlane() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  WatchLater get watchLater => $_getN(1);\n  @$pb.TagNumber(2)\n  set watchLater(WatchLater value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasWatchLater() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearWatchLater() => $_clearField(2);\n  @$pb.TagNumber(2)\n  WatchLater ensureWatchLater() => $_ensure(1);\n}\n\nclass TopicButton extends $pb.GeneratedMessage {\n  factory TopicButton({\n    $core.String? title,\n    $core.String? jumpUri,\n    $core.bool? redDot,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (jumpUri != null) result.jumpUri = jumpUri;\n    if (redDot != null) result.redDot = redDot;\n    return result;\n  }\n\n  TopicButton._();\n\n  factory TopicButton.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TopicButton.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TopicButton',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'jumpUri')\n    ..aOB(3, _omitFieldNames ? '' : 'redDot')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopicButton clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopicButton copyWith(void Function(TopicButton) updates) =>\n      super.copyWith((message) => updates(message as TopicButton))\n          as TopicButton;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TopicButton create() => TopicButton._();\n  @$core.override\n  TopicButton createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TopicButton getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<TopicButton>(create);\n  static TopicButton? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get jumpUri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set jumpUri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasJumpUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearJumpUri() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get redDot => $_getBF(2);\n  @$pb.TagNumber(3)\n  set redDot($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRedDot() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRedDot() => $_clearField(3);\n}\n\nclass TopicList extends $pb.GeneratedMessage {\n  factory TopicList({\n    Base? base,\n    $core.String? title,\n    $core.String? titleIcon,\n    TopicButton? moreButton,\n    $core.Iterable<TopicListItem>? topicListItem,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (title != null) result.title = title;\n    if (titleIcon != null) result.titleIcon = titleIcon;\n    if (moreButton != null) result.moreButton = moreButton;\n    if (topicListItem != null) result.topicListItem.addAll(topicListItem);\n    return result;\n  }\n\n  TopicList._();\n\n  factory TopicList.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TopicList.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TopicList',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'titleIcon')\n    ..aOM<TopicButton>(4, _omitFieldNames ? '' : 'moreButton',\n        subBuilder: TopicButton.create)\n    ..pPM<TopicListItem>(5, _omitFieldNames ? '' : 'topicListItem',\n        subBuilder: TopicListItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopicList clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopicList copyWith(void Function(TopicList) updates) =>\n      super.copyWith((message) => updates(message as TopicList)) as TopicList;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TopicList create() => TopicList._();\n  @$core.override\n  TopicList createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TopicList getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TopicList>(create);\n  static TopicList? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get titleIcon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set titleIcon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTitleIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTitleIcon() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  TopicButton get moreButton => $_getN(3);\n  @$pb.TagNumber(4)\n  set moreButton(TopicButton value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasMoreButton() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearMoreButton() => $_clearField(4);\n  @$pb.TagNumber(4)\n  TopicButton ensureMoreButton() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $pb.PbList<TopicListItem> get topicListItem => $_getList(4);\n}\n\nclass TopicListItem extends $pb.GeneratedMessage {\n  factory TopicListItem({\n    $core.String? icon,\n    $core.String? iconTitle,\n    $fixnum.Int64? topicId,\n    $core.String? topicName,\n    $core.String? url,\n    $fixnum.Int64? upMid,\n    $fixnum.Int64? position,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (iconTitle != null) result.iconTitle = iconTitle;\n    if (topicId != null) result.topicId = topicId;\n    if (topicName != null) result.topicName = topicName;\n    if (url != null) result.url = url;\n    if (upMid != null) result.upMid = upMid;\n    if (position != null) result.position = position;\n    return result;\n  }\n\n  TopicListItem._();\n\n  factory TopicListItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TopicListItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TopicListItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'iconTitle')\n    ..aInt64(3, _omitFieldNames ? '' : 'topicId')\n    ..aOS(4, _omitFieldNames ? '' : 'topicName')\n    ..aOS(5, _omitFieldNames ? '' : 'url')\n    ..aInt64(6, _omitFieldNames ? '' : 'upMid')\n    ..aInt64(7, _omitFieldNames ? '' : 'position')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopicListItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopicListItem copyWith(void Function(TopicListItem) updates) =>\n      super.copyWith((message) => updates(message as TopicListItem))\n          as TopicListItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TopicListItem create() => TopicListItem._();\n  @$core.override\n  TopicListItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TopicListItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<TopicListItem>(create);\n  static TopicListItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get iconTitle => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set iconTitle($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIconTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIconTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get topicId => $_getI64(2);\n  @$pb.TagNumber(3)\n  set topicId($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTopicId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTopicId() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get topicName => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set topicName($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTopicName() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTopicName() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get url => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set url($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasUrl() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearUrl() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get upMid => $_getI64(5);\n  @$pb.TagNumber(6)\n  set upMid($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasUpMid() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearUpMid() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get position => $_getI64(6);\n  @$pb.TagNumber(7)\n  set position($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasPosition() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearPosition() => $_clearField(7);\n}\n\nclass TwoItemHV1Item extends $pb.GeneratedMessage {\n  factory TwoItemHV1Item({\n    $core.String? title,\n    $core.String? cover,\n    $core.String? uri,\n    $core.String? param,\n    Args? args,\n    $core.String? goto,\n    $core.String? coverLeftText1,\n    $core.int? coverLeftIcon1,\n    $core.String? coverRightText,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (uri != null) result.uri = uri;\n    if (param != null) result.param = param;\n    if (args != null) result.args = args;\n    if (goto != null) result.goto = goto;\n    if (coverLeftText1 != null) result.coverLeftText1 = coverLeftText1;\n    if (coverLeftIcon1 != null) result.coverLeftIcon1 = coverLeftIcon1;\n    if (coverRightText != null) result.coverRightText = coverRightText;\n    return result;\n  }\n\n  TwoItemHV1Item._();\n\n  factory TwoItemHV1Item.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TwoItemHV1Item.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TwoItemHV1Item',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'cover')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..aOS(4, _omitFieldNames ? '' : 'param')\n    ..aOM<Args>(5, _omitFieldNames ? '' : 'args', subBuilder: Args.create)\n    ..aOS(6, _omitFieldNames ? '' : 'goto')\n    ..aOS(7, _omitFieldNames ? '' : 'coverLeftText1')\n    ..aI(8, _omitFieldNames ? '' : 'coverLeftIcon1')\n    ..aOS(9, _omitFieldNames ? '' : 'coverRightText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TwoItemHV1Item clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TwoItemHV1Item copyWith(void Function(TwoItemHV1Item) updates) =>\n      super.copyWith((message) => updates(message as TwoItemHV1Item))\n          as TwoItemHV1Item;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TwoItemHV1Item create() => TwoItemHV1Item._();\n  @$core.override\n  TwoItemHV1Item createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TwoItemHV1Item getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<TwoItemHV1Item>(create);\n  static TwoItemHV1Item? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get cover => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cover($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCover() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCover() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get param => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set param($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasParam() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearParam() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  Args get args => $_getN(4);\n  @$pb.TagNumber(5)\n  set args(Args value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasArgs() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearArgs() => $_clearField(5);\n  @$pb.TagNumber(5)\n  Args ensureArgs() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.String get goto => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set goto($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasGoto() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearGoto() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get coverLeftText1 => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set coverLeftText1($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCoverLeftText1() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCoverLeftText1() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get coverLeftIcon1 => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set coverLeftIcon1($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasCoverLeftIcon1() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearCoverLeftIcon1() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get coverRightText => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set coverRightText($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasCoverRightText() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearCoverRightText() => $_clearField(9);\n}\n\nclass TwoItemV2 extends $pb.GeneratedMessage {\n  factory TwoItemV2({\n    Base? base,\n    $core.Iterable<TwoItemV2Item>? items,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (items != null) result.items.addAll(items);\n    return result;\n  }\n\n  TwoItemV2._();\n\n  factory TwoItemV2.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TwoItemV2.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TwoItemV2',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..pPM<TwoItemV2Item>(2, _omitFieldNames ? '' : 'items',\n        subBuilder: TwoItemV2Item.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TwoItemV2 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TwoItemV2 copyWith(void Function(TwoItemV2) updates) =>\n      super.copyWith((message) => updates(message as TwoItemV2)) as TwoItemV2;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TwoItemV2 create() => TwoItemV2._();\n  @$core.override\n  TwoItemV2 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TwoItemV2 getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TwoItemV2>(create);\n  static TwoItemV2? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<TwoItemV2Item> get items => $_getList(1);\n}\n\nclass TwoItemV2Item extends $pb.GeneratedMessage {\n  factory TwoItemV2Item({\n    Base? base,\n    $core.String? badge,\n    $core.String? coverLeftText1,\n    $core.int? coverLeftIcon1,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (badge != null) result.badge = badge;\n    if (coverLeftText1 != null) result.coverLeftText1 = coverLeftText1;\n    if (coverLeftIcon1 != null) result.coverLeftIcon1 = coverLeftIcon1;\n    return result;\n  }\n\n  TwoItemV2Item._();\n\n  factory TwoItemV2Item.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TwoItemV2Item.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TwoItemV2Item',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aOM<Base>(1, _omitFieldNames ? '' : 'base', subBuilder: Base.create)\n    ..aOS(2, _omitFieldNames ? '' : 'badge')\n    ..aOS(3, _omitFieldNames ? '' : 'coverLeftText1')\n    ..aI(4, _omitFieldNames ? '' : 'coverLeftIcon1')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TwoItemV2Item clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TwoItemV2Item copyWith(void Function(TwoItemV2Item) updates) =>\n      super.copyWith((message) => updates(message as TwoItemV2Item))\n          as TwoItemV2Item;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TwoItemV2Item create() => TwoItemV2Item._();\n  @$core.override\n  TwoItemV2Item createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TwoItemV2Item getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<TwoItemV2Item>(create);\n  static TwoItemV2Item? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Base get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(Base value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Base ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get badge => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set badge($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBadge() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBadge() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get coverLeftText1 => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set coverLeftText1($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCoverLeftText1() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCoverLeftText1() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get coverLeftIcon1 => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set coverLeftIcon1($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCoverLeftIcon1() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCoverLeftIcon1() => $_clearField(4);\n}\n\nclass Up extends $pb.GeneratedMessage {\n  factory Up({\n    $fixnum.Int64? id,\n    $core.String? name,\n    $core.String? desc,\n    Avatar? avatar,\n    $core.int? officialIcon,\n    Button? descButton,\n    $core.String? cooperation,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (name != null) result.name = name;\n    if (desc != null) result.desc = desc;\n    if (avatar != null) result.avatar = avatar;\n    if (officialIcon != null) result.officialIcon = officialIcon;\n    if (descButton != null) result.descButton = descButton;\n    if (cooperation != null) result.cooperation = cooperation;\n    return result;\n  }\n\n  Up._();\n\n  factory Up.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Up.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Up',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'desc')\n    ..aOM<Avatar>(4, _omitFieldNames ? '' : 'avatar', subBuilder: Avatar.create)\n    ..aI(5, _omitFieldNames ? '' : 'officialIcon')\n    ..aOM<Button>(6, _omitFieldNames ? '' : 'descButton',\n        subBuilder: Button.create)\n    ..aOS(7, _omitFieldNames ? '' : 'cooperation')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Up clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Up copyWith(void Function(Up) updates) =>\n      super.copyWith((message) => updates(message as Up)) as Up;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Up create() => Up._();\n  @$core.override\n  Up createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Up getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Up>(create);\n  static Up? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get desc => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set desc($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDesc() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDesc() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  Avatar get avatar => $_getN(3);\n  @$pb.TagNumber(4)\n  set avatar(Avatar value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasAvatar() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearAvatar() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Avatar ensureAvatar() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.int get officialIcon => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set officialIcon($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasOfficialIcon() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearOfficialIcon() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  Button get descButton => $_getN(5);\n  @$pb.TagNumber(6)\n  set descButton(Button value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasDescButton() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearDescButton() => $_clearField(6);\n  @$pb.TagNumber(6)\n  Button ensureDescButton() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $core.String get cooperation => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set cooperation($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCooperation() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCooperation() => $_clearField(7);\n}\n\nclass UpArgs extends $pb.GeneratedMessage {\n  factory UpArgs({\n    $fixnum.Int64? upId,\n    $core.String? upName,\n    $core.String? upFace,\n    $fixnum.Int64? selected,\n  }) {\n    final result = create();\n    if (upId != null) result.upId = upId;\n    if (upName != null) result.upName = upName;\n    if (upFace != null) result.upFace = upFace;\n    if (selected != null) result.selected = selected;\n    return result;\n  }\n\n  UpArgs._();\n\n  factory UpArgs.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UpArgs.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UpArgs',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'upId')\n    ..aOS(2, _omitFieldNames ? '' : 'upName')\n    ..aOS(3, _omitFieldNames ? '' : 'upFace')\n    ..aInt64(4, _omitFieldNames ? '' : 'selected')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpArgs clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpArgs copyWith(void Function(UpArgs) updates) =>\n      super.copyWith((message) => updates(message as UpArgs)) as UpArgs;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UpArgs create() => UpArgs._();\n  @$core.override\n  UpArgs createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UpArgs getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<UpArgs>(create);\n  static UpArgs? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get upId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set upId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUpId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUpId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get upName => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set upName($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUpName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUpName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get upFace => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set upFace($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUpFace() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUpFace() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get selected => $_getI64(3);\n  @$pb.TagNumber(4)\n  set selected($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSelected() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSelected() => $_clearField(4);\n}\n\nclass WatchLater extends $pb.GeneratedMessage {\n  factory WatchLater({\n    $fixnum.Int64? aid,\n    $core.String? bvid,\n  }) {\n    final result = create();\n    if (aid != null) result.aid = aid;\n    if (bvid != null) result.bvid = bvid;\n    return result;\n  }\n\n  WatchLater._();\n\n  factory WatchLater.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory WatchLater.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'WatchLater',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.card.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'aid')\n    ..aOS(2, _omitFieldNames ? '' : 'bvid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  WatchLater clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  WatchLater copyWith(void Function(WatchLater) updates) =>\n      super.copyWith((message) => updates(message as WatchLater)) as WatchLater;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static WatchLater create() => WatchLater._();\n  @$core.override\n  WatchLater createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static WatchLater getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<WatchLater>(create);\n  static WatchLater? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get aid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set aid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get bvid => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set bvid($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBvid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBvid() => $_clearField(2);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/card/v1.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/card/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n"
  },
  {
    "path": "lib/grpc/bilibili/app/card/v1.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/card/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use adInfoDescriptor instead')\nconst AdInfo$json = {\n  '1': 'AdInfo',\n  '2': [\n    {'1': 'creative_id', '3': 1, '4': 1, '5': 3, '10': 'creativeId'},\n    {'1': 'creative_type', '3': 2, '4': 1, '5': 5, '10': 'creativeType'},\n    {'1': 'card_type', '3': 3, '4': 1, '5': 5, '10': 'cardType'},\n    {\n      '1': 'creative_content',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.CreativeContent',\n      '10': 'creativeContent'\n    },\n    {'1': 'ad_cb', '3': 5, '4': 1, '5': 9, '10': 'adCb'},\n    {'1': 'resource', '3': 6, '4': 1, '5': 3, '10': 'resource'},\n    {'1': 'source', '3': 7, '4': 1, '5': 5, '10': 'source'},\n    {'1': 'request_id', '3': 8, '4': 1, '5': 9, '10': 'requestId'},\n    {'1': 'is_ad', '3': 9, '4': 1, '5': 8, '10': 'isAd'},\n    {'1': 'cm_mark', '3': 10, '4': 1, '5': 3, '10': 'cmMark'},\n    {'1': 'index', '3': 11, '4': 1, '5': 5, '10': 'index'},\n    {'1': 'is_ad_loc', '3': 12, '4': 1, '5': 8, '10': 'isAdLoc'},\n    {'1': 'card_index', '3': 13, '4': 1, '5': 5, '10': 'cardIndex'},\n    {'1': 'client_ip', '3': 14, '4': 1, '5': 9, '10': 'clientIp'},\n    {'1': 'extra', '3': 15, '4': 1, '5': 12, '10': 'extra'},\n    {'1': 'creative_style', '3': 16, '4': 1, '5': 5, '10': 'creativeStyle'},\n    {'1': 'nature_ad', '3': 17, '4': 1, '5': 3, '10': 'natureAd'},\n    {\n      '1': 'content_fast_access',\n      '3': 18,\n      '4': 1,\n      '5': 5,\n      '10': 'contentFastAccess'\n    },\n  ],\n};\n\n/// Descriptor for `AdInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List adInfoDescriptor = $convert.base64Decode(\n    'CgZBZEluZm8SHwoLY3JlYXRpdmVfaWQYASABKANSCmNyZWF0aXZlSWQSIwoNY3JlYXRpdmVfdH'\n    'lwZRgCIAEoBVIMY3JlYXRpdmVUeXBlEhsKCWNhcmRfdHlwZRgDIAEoBVIIY2FyZFR5cGUSUAoQ'\n    'Y3JlYXRpdmVfY29udGVudBgEIAEoCzIlLmJpbGliaWxpLmFwcC5jYXJkLnYxLkNyZWF0aXZlQ2'\n    '9udGVudFIPY3JlYXRpdmVDb250ZW50EhMKBWFkX2NiGAUgASgJUgRhZENiEhoKCHJlc291cmNl'\n    'GAYgASgDUghyZXNvdXJjZRIWCgZzb3VyY2UYByABKAVSBnNvdXJjZRIdCgpyZXF1ZXN0X2lkGA'\n    'ggASgJUglyZXF1ZXN0SWQSEwoFaXNfYWQYCSABKAhSBGlzQWQSFwoHY21fbWFyaxgKIAEoA1IG'\n    'Y21NYXJrEhQKBWluZGV4GAsgASgFUgVpbmRleBIaCglpc19hZF9sb2MYDCABKAhSB2lzQWRMb2'\n    'MSHQoKY2FyZF9pbmRleBgNIAEoBVIJY2FyZEluZGV4EhsKCWNsaWVudF9pcBgOIAEoCVIIY2xp'\n    'ZW50SXASFAoFZXh0cmEYDyABKAxSBWV4dHJhEiUKDmNyZWF0aXZlX3N0eWxlGBAgASgFUg1jcm'\n    'VhdGl2ZVN0eWxlEhsKCW5hdHVyZV9hZBgRIAEoA1IIbmF0dXJlQWQSLgoTY29udGVudF9mYXN0'\n    'X2FjY2VzcxgSIAEoBVIRY29udGVudEZhc3RBY2Nlc3M=');\n\n@$core.Deprecated('Use argsDescriptor instead')\nconst Args$json = {\n  '1': 'Args',\n  '2': [\n    {'1': 'type', '3': 1, '4': 1, '5': 5, '10': 'type'},\n    {'1': 'up_id', '3': 2, '4': 1, '5': 3, '10': 'upId'},\n    {'1': 'up_name', '3': 3, '4': 1, '5': 9, '10': 'upName'},\n    {'1': 'rid', '3': 4, '4': 1, '5': 5, '10': 'rid'},\n    {'1': 'rname', '3': 5, '4': 1, '5': 9, '10': 'rname'},\n    {'1': 'tid', '3': 6, '4': 1, '5': 3, '10': 'tid'},\n    {'1': 'tname', '3': 7, '4': 1, '5': 9, '10': 'tname'},\n    {'1': 'track_id', '3': 8, '4': 1, '5': 9, '10': 'trackId'},\n    {'1': 'state', '3': 9, '4': 1, '5': 9, '10': 'state'},\n    {'1': 'converge_type', '3': 10, '4': 1, '5': 5, '10': 'convergeType'},\n    {'1': 'aid', '3': 11, '4': 1, '5': 3, '10': 'aid'},\n  ],\n};\n\n/// Descriptor for `Args`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List argsDescriptor = $convert.base64Decode(\n    'CgRBcmdzEhIKBHR5cGUYASABKAVSBHR5cGUSEwoFdXBfaWQYAiABKANSBHVwSWQSFwoHdXBfbm'\n    'FtZRgDIAEoCVIGdXBOYW1lEhAKA3JpZBgEIAEoBVIDcmlkEhQKBXJuYW1lGAUgASgJUgVybmFt'\n    'ZRIQCgN0aWQYBiABKANSA3RpZBIUCgV0bmFtZRgHIAEoCVIFdG5hbWUSGQoIdHJhY2tfaWQYCC'\n    'ABKAlSB3RyYWNrSWQSFAoFc3RhdGUYCSABKAlSBXN0YXRlEiMKDWNvbnZlcmdlX3R5cGUYCiAB'\n    'KAVSDGNvbnZlcmdlVHlwZRIQCgNhaWQYCyABKANSA2FpZA==');\n\n@$core.Deprecated('Use avatarDescriptor instead')\nconst Avatar$json = {\n  '1': 'Avatar',\n  '2': [\n    {'1': 'cover', '3': 1, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'type', '3': 4, '4': 1, '5': 5, '10': 'type'},\n    {'1': 'event', '3': 5, '4': 1, '5': 9, '10': 'event'},\n    {'1': 'event_v2', '3': 6, '4': 1, '5': 9, '10': 'eventV2'},\n    {'1': 'defalut_cover', '3': 7, '4': 1, '5': 5, '10': 'defalutCover'},\n  ],\n};\n\n/// Descriptor for `Avatar`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List avatarDescriptor = $convert.base64Decode(\n    'CgZBdmF0YXISFAoFY292ZXIYASABKAlSBWNvdmVyEhIKBHRleHQYAiABKAlSBHRleHQSEAoDdX'\n    'JpGAMgASgJUgN1cmkSEgoEdHlwZRgEIAEoBVIEdHlwZRIUCgVldmVudBgFIAEoCVIFZXZlbnQS'\n    'GQoIZXZlbnRfdjIYBiABKAlSB2V2ZW50VjISIwoNZGVmYWx1dF9jb3ZlchgHIAEoBVIMZGVmYW'\n    'x1dENvdmVy');\n\n@$core.Deprecated('Use baseDescriptor instead')\nconst Base$json = {\n  '1': 'Base',\n  '2': [\n    {'1': 'card_type', '3': 1, '4': 1, '5': 9, '10': 'cardType'},\n    {'1': 'card_goto', '3': 2, '4': 1, '5': 9, '10': 'cardGoto'},\n    {'1': 'goto', '3': 3, '4': 1, '5': 9, '10': 'goto'},\n    {'1': 'param', '3': 4, '4': 1, '5': 9, '10': 'param'},\n    {'1': 'cover', '3': 5, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'title', '3': 6, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'uri', '3': 7, '4': 1, '5': 9, '10': 'uri'},\n    {\n      '1': 'three_point',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ThreePoint',\n      '10': 'threePoint'\n    },\n    {\n      '1': 'args',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Args',\n      '10': 'args'\n    },\n    {\n      '1': 'player_args',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n    {'1': 'idx', '3': 11, '4': 1, '5': 3, '10': 'idx'},\n    {\n      '1': 'ad_info',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.AdInfo',\n      '10': 'adInfo'\n    },\n    {\n      '1': 'mask',\n      '3': 13,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Mask',\n      '10': 'mask'\n    },\n    {'1': 'from_type', '3': 14, '4': 1, '5': 9, '10': 'fromType'},\n    {\n      '1': 'three_point_v2',\n      '3': 15,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ThreePointV2',\n      '10': 'threePointV2'\n    },\n    {\n      '1': 'three_point_v3',\n      '3': 16,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ThreePointV3',\n      '10': 'threePointV3'\n    },\n    {\n      '1': 'desc_button',\n      '3': 17,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Button',\n      '10': 'descButton'\n    },\n    {\n      '1': 'three_point_v4',\n      '3': 18,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ThreePointV4',\n      '10': 'threePointV4'\n    },\n    {\n      '1': 'up_args',\n      '3': 19,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.UpArgs',\n      '10': 'upArgs'\n    },\n    {'1': 'track_id', '3': 20, '4': 1, '5': 9, '10': 'trackId'},\n  ],\n};\n\n/// Descriptor for `Base`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List baseDescriptor = $convert.base64Decode(\n    'CgRCYXNlEhsKCWNhcmRfdHlwZRgBIAEoCVIIY2FyZFR5cGUSGwoJY2FyZF9nb3RvGAIgASgJUg'\n    'hjYXJkR290bxISCgRnb3RvGAMgASgJUgRnb3RvEhQKBXBhcmFtGAQgASgJUgVwYXJhbRIUCgVj'\n    'b3ZlchgFIAEoCVIFY292ZXISFAoFdGl0bGUYBiABKAlSBXRpdGxlEhAKA3VyaRgHIAEoCVIDdX'\n    'JpEkEKC3RocmVlX3BvaW50GAggASgLMiAuYmlsaWJpbGkuYXBwLmNhcmQudjEuVGhyZWVQb2lu'\n    'dFIKdGhyZWVQb2ludBIuCgRhcmdzGAkgASgLMhouYmlsaWJpbGkuYXBwLmNhcmQudjEuQXJnc1'\n    'IEYXJncxJBCgtwbGF5ZXJfYXJncxgKIAEoCzIgLmJpbGliaWxpLmFwcC5jYXJkLnYxLlBsYXll'\n    'ckFyZ3NSCnBsYXllckFyZ3MSEAoDaWR4GAsgASgDUgNpZHgSNQoHYWRfaW5mbxgMIAEoCzIcLm'\n    'JpbGliaWxpLmFwcC5jYXJkLnYxLkFkSW5mb1IGYWRJbmZvEi4KBG1hc2sYDSABKAsyGi5iaWxp'\n    'YmlsaS5hcHAuY2FyZC52MS5NYXNrUgRtYXNrEhsKCWZyb21fdHlwZRgOIAEoCVIIZnJvbVR5cG'\n    'USSAoOdGhyZWVfcG9pbnRfdjIYDyADKAsyIi5iaWxpYmlsaS5hcHAuY2FyZC52MS5UaHJlZVBv'\n    'aW50VjJSDHRocmVlUG9pbnRWMhJICg50aHJlZV9wb2ludF92MxgQIAMoCzIiLmJpbGliaWxpLm'\n    'FwcC5jYXJkLnYxLlRocmVlUG9pbnRWM1IMdGhyZWVQb2ludFYzEj0KC2Rlc2NfYnV0dG9uGBEg'\n    'ASgLMhwuYmlsaWJpbGkuYXBwLmNhcmQudjEuQnV0dG9uUgpkZXNjQnV0dG9uEkgKDnRocmVlX3'\n    'BvaW50X3Y0GBIgASgLMiIuYmlsaWJpbGkuYXBwLmNhcmQudjEuVGhyZWVQb2ludFY0Ugx0aHJl'\n    'ZVBvaW50VjQSNQoHdXBfYXJncxgTIAEoCzIcLmJpbGliaWxpLmFwcC5jYXJkLnYxLlVwQXJnc1'\n    'IGdXBBcmdzEhkKCHRyYWNrX2lkGBQgASgJUgd0cmFja0lk');\n\n@$core.Deprecated('Use bubbleDescriptor instead')\nconst Bubble$json = {\n  '1': 'Bubble',\n  '2': [\n    {'1': 'bubble_content', '3': 1, '4': 1, '5': 9, '10': 'bubbleContent'},\n    {'1': 'version', '3': 2, '4': 1, '5': 5, '10': 'version'},\n    {'1': 'stime', '3': 3, '4': 1, '5': 3, '10': 'stime'},\n  ],\n};\n\n/// Descriptor for `Bubble`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bubbleDescriptor = $convert.base64Decode(\n    'CgZCdWJibGUSJQoOYnViYmxlX2NvbnRlbnQYASABKAlSDWJ1YmJsZUNvbnRlbnQSGAoHdmVyc2'\n    'lvbhgCIAEoBVIHdmVyc2lvbhIUCgVzdGltZRgDIAEoA1IFc3RpbWU=');\n\n@$core.Deprecated('Use buttonDescriptor instead')\nconst Button$json = {\n  '1': 'Button',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'param', '3': 2, '4': 1, '5': 9, '10': 'param'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'event', '3': 4, '4': 1, '5': 9, '10': 'event'},\n    {'1': 'selected', '3': 5, '4': 1, '5': 5, '10': 'selected'},\n    {'1': 'type', '3': 6, '4': 1, '5': 5, '10': 'type'},\n    {'1': 'event_v2', '3': 7, '4': 1, '5': 9, '10': 'eventV2'},\n    {\n      '1': 'relation',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Relation',\n      '10': 'relation'\n    },\n  ],\n};\n\n/// Descriptor for `Button`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List buttonDescriptor = $convert.base64Decode(\n    'CgZCdXR0b24SEgoEdGV4dBgBIAEoCVIEdGV4dBIUCgVwYXJhbRgCIAEoCVIFcGFyYW0SEAoDdX'\n    'JpGAMgASgJUgN1cmkSFAoFZXZlbnQYBCABKAlSBWV2ZW50EhoKCHNlbGVjdGVkGAUgASgFUghz'\n    'ZWxlY3RlZBISCgR0eXBlGAYgASgFUgR0eXBlEhkKCGV2ZW50X3YyGAcgASgJUgdldmVudFYyEj'\n    'oKCHJlbGF0aW9uGAggASgLMh4uYmlsaWJpbGkuYXBwLmNhcmQudjEuUmVsYXRpb25SCHJlbGF0'\n    'aW9u');\n\n@$core.Deprecated('Use cardDescriptor instead')\nconst Card$json = {\n  '1': 'Card',\n  '2': [\n    {\n      '1': 'small_cover_v5',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.SmallCoverV5',\n      '9': 0,\n      '10': 'smallCoverV5'\n    },\n    {\n      '1': 'large_cover_v1',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.LargeCoverV1',\n      '9': 0,\n      '10': 'largeCoverV1'\n    },\n    {\n      '1': 'three_item_all_v2',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ThreeItemAllV2',\n      '9': 0,\n      '10': 'threeItemAllV2'\n    },\n    {\n      '1': 'three_item_v1',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ThreeItemV1',\n      '9': 0,\n      '10': 'threeItemV1'\n    },\n    {\n      '1': 'hot_topic',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.HotTopic',\n      '9': 0,\n      '10': 'hotTopic'\n    },\n    {\n      '1': 'three_item_h_v5',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.DynamicHot',\n      '9': 0,\n      '10': 'threeItemHV5'\n    },\n    {\n      '1': 'middle_cover_v3',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.MiddleCoverV3',\n      '9': 0,\n      '10': 'middleCoverV3'\n    },\n    {\n      '1': 'large_cover_v4',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.LargeCoverV4',\n      '9': 0,\n      '10': 'largeCoverV4'\n    },\n    {\n      '1': 'popular_top_entrance',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.PopularTopEntrance',\n      '9': 0,\n      '10': 'popularTopEntrance'\n    },\n    {\n      '1': 'rcmd_one_item',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.RcmdOneItem',\n      '9': 0,\n      '10': 'rcmdOneItem'\n    },\n    {\n      '1': 'small_cover_v5_ad',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.SmallCoverV5Ad',\n      '9': 0,\n      '10': 'smallCoverV5Ad'\n    },\n    {\n      '1': 'topic_list',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.TopicList',\n      '9': 0,\n      '10': 'topicList'\n    },\n  ],\n  '8': [\n    {'1': 'item'},\n  ],\n};\n\n/// Descriptor for `Card`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cardDescriptor = $convert.base64Decode(\n    'CgRDYXJkEkoKDnNtYWxsX2NvdmVyX3Y1GAEgASgLMiIuYmlsaWJpbGkuYXBwLmNhcmQudjEuU2'\n    '1hbGxDb3ZlclY1SABSDHNtYWxsQ292ZXJWNRJKCg5sYXJnZV9jb3Zlcl92MRgCIAEoCzIiLmJp'\n    'bGliaWxpLmFwcC5jYXJkLnYxLkxhcmdlQ292ZXJWMUgAUgxsYXJnZUNvdmVyVjESUQoRdGhyZW'\n    'VfaXRlbV9hbGxfdjIYAyABKAsyJC5iaWxpYmlsaS5hcHAuY2FyZC52MS5UaHJlZUl0ZW1BbGxW'\n    'MkgAUg50aHJlZUl0ZW1BbGxWMhJHCg10aHJlZV9pdGVtX3YxGAQgASgLMiEuYmlsaWJpbGkuYX'\n    'BwLmNhcmQudjEuVGhyZWVJdGVtVjFIAFILdGhyZWVJdGVtVjESPQoJaG90X3RvcGljGAUgASgL'\n    'Mh4uYmlsaWJpbGkuYXBwLmNhcmQudjEuSG90VG9waWNIAFIIaG90VG9waWMSSQoPdGhyZWVfaX'\n    'RlbV9oX3Y1GAYgASgLMiAuYmlsaWJpbGkuYXBwLmNhcmQudjEuRHluYW1pY0hvdEgAUgx0aHJl'\n    'ZUl0ZW1IVjUSTQoPbWlkZGxlX2NvdmVyX3YzGAcgASgLMiMuYmlsaWJpbGkuYXBwLmNhcmQudj'\n    'EuTWlkZGxlQ292ZXJWM0gAUg1taWRkbGVDb3ZlclYzEkoKDmxhcmdlX2NvdmVyX3Y0GAggASgL'\n    'MiIuYmlsaWJpbGkuYXBwLmNhcmQudjEuTGFyZ2VDb3ZlclY0SABSDGxhcmdlQ292ZXJWNBJcCh'\n    'Rwb3B1bGFyX3RvcF9lbnRyYW5jZRgJIAEoCzIoLmJpbGliaWxpLmFwcC5jYXJkLnYxLlBvcHVs'\n    'YXJUb3BFbnRyYW5jZUgAUhJwb3B1bGFyVG9wRW50cmFuY2USRwoNcmNtZF9vbmVfaXRlbRgKIA'\n    'EoCzIhLmJpbGliaWxpLmFwcC5jYXJkLnYxLlJjbWRPbmVJdGVtSABSC3JjbWRPbmVJdGVtElEK'\n    'EXNtYWxsX2NvdmVyX3Y1X2FkGAsgASgLMiQuYmlsaWJpbGkuYXBwLmNhcmQudjEuU21hbGxDb3'\n    'ZlclY1QWRIAFIOc21hbGxDb3ZlclY1QWQSQAoKdG9waWNfbGlzdBgMIAEoCzIfLmJpbGliaWxp'\n    'LmFwcC5jYXJkLnYxLlRvcGljTGlzdEgAUgl0b3BpY0xpc3RCBgoEaXRlbQ==');\n\n@$core.Deprecated('Use creativeContentDescriptor instead')\nconst CreativeContent$json = {\n  '1': 'CreativeContent',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'description', '3': 2, '4': 1, '5': 9, '10': 'description'},\n    {'1': 'video_id', '3': 3, '4': 1, '5': 3, '10': 'videoId'},\n    {'1': 'username', '3': 4, '4': 1, '5': 9, '10': 'username'},\n    {'1': 'image_url', '3': 5, '4': 1, '5': 9, '10': 'imageUrl'},\n    {'1': 'image_md5', '3': 6, '4': 1, '5': 9, '10': 'imageMd5'},\n    {'1': 'log_url', '3': 7, '4': 1, '5': 9, '10': 'logUrl'},\n    {'1': 'log_md5', '3': 8, '4': 1, '5': 9, '10': 'logMd5'},\n    {'1': 'url', '3': 9, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'click_url', '3': 10, '4': 1, '5': 9, '10': 'clickUrl'},\n    {'1': 'show_url', '3': 11, '4': 1, '5': 9, '10': 'showUrl'},\n  ],\n};\n\n/// Descriptor for `CreativeContent`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List creativeContentDescriptor = $convert.base64Decode(\n    'Cg9DcmVhdGl2ZUNvbnRlbnQSFAoFdGl0bGUYASABKAlSBXRpdGxlEiAKC2Rlc2NyaXB0aW9uGA'\n    'IgASgJUgtkZXNjcmlwdGlvbhIZCgh2aWRlb19pZBgDIAEoA1IHdmlkZW9JZBIaCgh1c2VybmFt'\n    'ZRgEIAEoCVIIdXNlcm5hbWUSGwoJaW1hZ2VfdXJsGAUgASgJUghpbWFnZVVybBIbCglpbWFnZV'\n    '9tZDUYBiABKAlSCGltYWdlTWQ1EhcKB2xvZ191cmwYByABKAlSBmxvZ1VybBIXCgdsb2dfbWQ1'\n    'GAggASgJUgZsb2dNZDUSEAoDdXJsGAkgASgJUgN1cmwSGwoJY2xpY2tfdXJsGAogASgJUghjbG'\n    'lja1VybBIZCghzaG93X3VybBgLIAEoCVIHc2hvd1VybA==');\n\n@$core.Deprecated('Use dislikeReasonDescriptor instead')\nconst DislikeReason$json = {\n  '1': 'DislikeReason',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n  ],\n};\n\n/// Descriptor for `DislikeReason`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dislikeReasonDescriptor = $convert.base64Decode(\n    'Cg1EaXNsaWtlUmVhc29uEg4KAmlkGAEgASgDUgJpZBISCgRuYW1lGAIgASgJUgRuYW1l');\n\n@$core.Deprecated('Use doubleCardsDescriptor instead')\nconst DoubleCards$json = {\n  '1': 'DoubleCards',\n  '2': [\n    {\n      '1': 'small_cover_v2',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.SmallCoverV2',\n      '9': 0,\n      '10': 'smallCoverV2'\n    },\n    {\n      '1': 'one_pic_v2',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.OnePicV2',\n      '9': 0,\n      '10': 'onePicV2'\n    },\n    {\n      '1': 'three_pic_v2',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ThreePicV2',\n      '9': 0,\n      '10': 'threePicV2'\n    },\n  ],\n  '8': [\n    {'1': 'card'},\n  ],\n};\n\n/// Descriptor for `DoubleCards`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List doubleCardsDescriptor = $convert.base64Decode(\n    'CgtEb3VibGVDYXJkcxJKCg5zbWFsbF9jb3Zlcl92MhgBIAEoCzIiLmJpbGliaWxpLmFwcC5jYX'\n    'JkLnYxLlNtYWxsQ292ZXJWMkgAUgxzbWFsbENvdmVyVjISPgoKb25lX3BpY192MhgCIAEoCzIe'\n    'LmJpbGliaWxpLmFwcC5jYXJkLnYxLk9uZVBpY1YySABSCG9uZVBpY1YyEkQKDHRocmVlX3BpY1'\n    '92MhgDIAEoCzIgLmJpbGliaWxpLmFwcC5jYXJkLnYxLlRocmVlUGljVjJIAFIKdGhyZWVQaWNW'\n    'MkIGCgRjYXJk');\n\n@$core.Deprecated('Use dynamicHotDescriptor instead')\nconst DynamicHot$json = {\n  '1': 'DynamicHot',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {'1': 'top_left_title', '3': 2, '4': 1, '5': 9, '10': 'topLeftTitle'},\n    {'1': 'desc1', '3': 3, '4': 1, '5': 9, '10': 'desc1'},\n    {'1': 'desc2', '3': 4, '4': 1, '5': 9, '10': 'desc2'},\n    {'1': 'more_uri', '3': 5, '4': 1, '5': 9, '10': 'moreUri'},\n    {'1': 'more_text', '3': 6, '4': 1, '5': 9, '10': 'moreText'},\n    {'1': 'covers', '3': 7, '4': 3, '5': 9, '10': 'covers'},\n    {'1': 'cover_right_text', '3': 8, '4': 1, '5': 9, '10': 'coverRightText'},\n    {\n      '1': 'top_rcmd_reason_style',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'topRcmdReasonStyle'\n    },\n  ],\n};\n\n/// Descriptor for `DynamicHot`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynamicHotDescriptor = $convert.base64Decode(\n    'CgpEeW5hbWljSG90Ei4KBGJhc2UYASABKAsyGi5iaWxpYmlsaS5hcHAuY2FyZC52MS5CYXNlUg'\n    'RiYXNlEiQKDnRvcF9sZWZ0X3RpdGxlGAIgASgJUgx0b3BMZWZ0VGl0bGUSFAoFZGVzYzEYAyAB'\n    'KAlSBWRlc2MxEhQKBWRlc2MyGAQgASgJUgVkZXNjMhIZCghtb3JlX3VyaRgFIAEoCVIHbW9yZV'\n    'VyaRIbCgltb3JlX3RleHQYBiABKAlSCG1vcmVUZXh0EhYKBmNvdmVycxgHIAMoCVIGY292ZXJz'\n    'EigKEGNvdmVyX3JpZ2h0X3RleHQYCCABKAlSDmNvdmVyUmlnaHRUZXh0ElQKFXRvcF9yY21kX3'\n    'JlYXNvbl9zdHlsZRgJIAEoCzIhLmJpbGliaWxpLmFwcC5jYXJkLnYxLlJlYXNvblN0eWxlUhJ0'\n    'b3BSY21kUmVhc29uU3R5bGU=');\n\n@$core.Deprecated('Use entranceItemDescriptor instead')\nconst EntranceItem$json = {\n  '1': 'EntranceItem',\n  '2': [\n    {'1': 'goto', '3': 1, '4': 1, '5': 9, '10': 'goto'},\n    {'1': 'icon', '3': 2, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'title', '3': 3, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'module_id', '3': 4, '4': 1, '5': 9, '10': 'moduleId'},\n    {'1': 'uri', '3': 5, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'entrance_id', '3': 6, '4': 1, '5': 3, '10': 'entranceId'},\n    {\n      '1': 'bubble',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Bubble',\n      '10': 'bubble'\n    },\n    {'1': 'entrance_type', '3': 8, '4': 1, '5': 5, '10': 'entranceType'},\n  ],\n};\n\n/// Descriptor for `EntranceItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List entranceItemDescriptor = $convert.base64Decode(\n    'CgxFbnRyYW5jZUl0ZW0SEgoEZ290bxgBIAEoCVIEZ290bxISCgRpY29uGAIgASgJUgRpY29uEh'\n    'QKBXRpdGxlGAMgASgJUgV0aXRsZRIbCgltb2R1bGVfaWQYBCABKAlSCG1vZHVsZUlkEhAKA3Vy'\n    'aRgFIAEoCVIDdXJpEh8KC2VudHJhbmNlX2lkGAYgASgDUgplbnRyYW5jZUlkEjQKBmJ1YmJsZR'\n    'gHIAEoCzIcLmJpbGliaWxpLmFwcC5jYXJkLnYxLkJ1YmJsZVIGYnViYmxlEiMKDWVudHJhbmNl'\n    'X3R5cGUYCCABKAVSDGVudHJhbmNlVHlwZQ==');\n\n@$core.Deprecated('Use functionalButtonDescriptor instead')\nconst FunctionalButton$json = {\n  '1': 'FunctionalButton',\n  '2': [\n    {'1': 'type', '3': 1, '4': 1, '5': 5, '10': 'type'},\n    {\n      '1': 'button_metas',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.FunctionalButtonMeta',\n      '10': 'buttonMetas'\n    },\n  ],\n};\n\n/// Descriptor for `FunctionalButton`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List functionalButtonDescriptor = $convert.base64Decode(\n    'ChBGdW5jdGlvbmFsQnV0dG9uEhIKBHR5cGUYASABKAVSBHR5cGUSTQoMYnV0dG9uX21ldGFzGA'\n    'IgAygLMiouYmlsaWJpbGkuYXBwLmNhcmQudjEuRnVuY3Rpb25hbEJ1dHRvbk1ldGFSC2J1dHRv'\n    'bk1ldGFz');\n\n@$core.Deprecated('Use functionalButtonMetaDescriptor instead')\nconst FunctionalButtonMeta$json = {\n  '1': 'FunctionalButtonMeta',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'button_status', '3': 3, '4': 1, '5': 9, '10': 'buttonStatus'},\n    {'1': 'toast', '3': 4, '4': 1, '5': 9, '10': 'toast'},\n  ],\n};\n\n/// Descriptor for `FunctionalButtonMeta`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List functionalButtonMetaDescriptor = $convert.base64Decode(\n    'ChRGdW5jdGlvbmFsQnV0dG9uTWV0YRISCgRpY29uGAEgASgJUgRpY29uEhIKBHRleHQYAiABKA'\n    'lSBHRleHQSIwoNYnV0dG9uX3N0YXR1cxgDIAEoCVIMYnV0dG9uU3RhdHVzEhQKBXRvYXN0GAQg'\n    'ASgJUgV0b2FzdA==');\n\n@$core.Deprecated('Use hotTopicDescriptor instead')\nconst HotTopic$json = {\n  '1': 'HotTopic',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {'1': 'desc', '3': 2, '4': 1, '5': 9, '10': 'desc'},\n    {\n      '1': 'items',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.HotTopicItem',\n      '10': 'items'\n    },\n  ],\n};\n\n/// Descriptor for `HotTopic`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List hotTopicDescriptor = $convert.base64Decode(\n    'CghIb3RUb3BpYxIuCgRiYXNlGAEgASgLMhouYmlsaWJpbGkuYXBwLmNhcmQudjEuQmFzZVIEYm'\n    'FzZRISCgRkZXNjGAIgASgJUgRkZXNjEjgKBWl0ZW1zGAMgAygLMiIuYmlsaWJpbGkuYXBwLmNh'\n    'cmQudjEuSG90VG9waWNJdGVtUgVpdGVtcw==');\n\n@$core.Deprecated('Use hotTopicItemDescriptor instead')\nconst HotTopicItem$json = {\n  '1': 'HotTopicItem',\n  '2': [\n    {'1': 'cover', '3': 1, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'param', '3': 3, '4': 1, '5': 9, '10': 'param'},\n    {'1': 'name', '3': 4, '4': 1, '5': 9, '10': 'name'},\n  ],\n};\n\n/// Descriptor for `HotTopicItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List hotTopicItemDescriptor = $convert.base64Decode(\n    'CgxIb3RUb3BpY0l0ZW0SFAoFY292ZXIYASABKAlSBWNvdmVyEhAKA3VyaRgCIAEoCVIDdXJpEh'\n    'QKBXBhcmFtGAMgASgJUgVwYXJhbRISCgRuYW1lGAQgASgJUgRuYW1l');\n\n@$core.Deprecated('Use hotwordEntranceDescriptor instead')\nconst HotwordEntrance$json = {\n  '1': 'HotwordEntrance',\n  '2': [\n    {'1': 'hotword_id', '3': 1, '4': 1, '5': 3, '10': 'hotwordId'},\n    {'1': 'hot_text', '3': 2, '4': 1, '5': 9, '10': 'hotText'},\n    {'1': 'h5_url', '3': 3, '4': 1, '5': 9, '10': 'h5Url'},\n    {'1': 'icon', '3': 4, '4': 1, '5': 9, '10': 'icon'},\n  ],\n};\n\n/// Descriptor for `HotwordEntrance`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List hotwordEntranceDescriptor = $convert.base64Decode(\n    'Cg9Ib3R3b3JkRW50cmFuY2USHQoKaG90d29yZF9pZBgBIAEoA1IJaG90d29yZElkEhkKCGhvdF'\n    '90ZXh0GAIgASgJUgdob3RUZXh0EhUKBmg1X3VybBgDIAEoCVIFaDVVcmwSEgoEaWNvbhgEIAEo'\n    'CVIEaWNvbg==');\n\n@$core.Deprecated('Use inlineProgressBarDescriptor instead')\nconst InlineProgressBar$json = {\n  '1': 'InlineProgressBar',\n  '2': [\n    {'1': 'icon_drag', '3': 1, '4': 1, '5': 9, '10': 'iconDrag'},\n    {'1': 'icon_drag_hash', '3': 2, '4': 1, '5': 9, '10': 'iconDragHash'},\n    {'1': 'icon_stop', '3': 3, '4': 1, '5': 9, '10': 'iconStop'},\n    {'1': 'icon_stop_hash', '3': 4, '4': 1, '5': 9, '10': 'iconStopHash'},\n  ],\n};\n\n/// Descriptor for `InlineProgressBar`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List inlineProgressBarDescriptor = $convert.base64Decode(\n    'ChFJbmxpbmVQcm9ncmVzc0JhchIbCglpY29uX2RyYWcYASABKAlSCGljb25EcmFnEiQKDmljb2'\n    '5fZHJhZ19oYXNoGAIgASgJUgxpY29uRHJhZ0hhc2gSGwoJaWNvbl9zdG9wGAMgASgJUghpY29u'\n    'U3RvcBIkCg5pY29uX3N0b3BfaGFzaBgEIAEoCVIMaWNvblN0b3BIYXNo');\n\n@$core.Deprecated('Use largeCoverV1Descriptor instead')\nconst LargeCoverV1$json = {\n  '1': 'LargeCoverV1',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {'1': 'cover_gif', '3': 2, '4': 1, '5': 9, '10': 'coverGif'},\n    {\n      '1': 'avatar',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Avatar',\n      '10': 'avatar'\n    },\n    {'1': 'cover_left_text1', '3': 4, '4': 1, '5': 9, '10': 'coverLeftText1'},\n    {'1': 'cover_left_text2', '3': 5, '4': 1, '5': 9, '10': 'coverLeftText2'},\n    {'1': 'cover_left_text3', '3': 6, '4': 1, '5': 9, '10': 'coverLeftText3'},\n    {'1': 'cover_badge', '3': 7, '4': 1, '5': 9, '10': 'coverBadge'},\n    {'1': 'top_rcmd_reason', '3': 8, '4': 1, '5': 9, '10': 'topRcmdReason'},\n    {\n      '1': 'bottom_rcmd_reason',\n      '3': 9,\n      '4': 1,\n      '5': 9,\n      '10': 'bottomRcmdReason'\n    },\n    {'1': 'desc', '3': 10, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'official_icon', '3': 11, '4': 1, '5': 5, '10': 'officialIcon'},\n    {'1': 'can_play', '3': 12, '4': 1, '5': 5, '10': 'canPlay'},\n    {\n      '1': 'top_rcmd_reason_style',\n      '3': 13,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'topRcmdReasonStyle'\n    },\n    {\n      '1': 'bottom_rcmd_reason_style',\n      '3': 14,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'bottomRcmdReasonStyle'\n    },\n    {\n      '1': 'rcmd_reason_style_v2',\n      '3': 15,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'rcmdReasonStyleV2'\n    },\n    {\n      '1': 'left_cover_badge_style',\n      '3': 16,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'leftCoverBadgeStyle'\n    },\n    {\n      '1': 'right_cover_badge_style',\n      '3': 17,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'rightCoverBadgeStyle'\n    },\n    {'1': 'cover_badge2', '3': 18, '4': 1, '5': 9, '10': 'coverBadge2'},\n    {\n      '1': 'like_button',\n      '3': 19,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.LikeButton',\n      '10': 'likeButton'\n    },\n    {\n      '1': 'title_single_line',\n      '3': 20,\n      '4': 1,\n      '5': 5,\n      '10': 'titleSingleLine'\n    },\n    {'1': 'cover_right_text', '3': 21, '4': 1, '5': 9, '10': 'coverRightText'},\n  ],\n};\n\n/// Descriptor for `LargeCoverV1`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List largeCoverV1Descriptor = $convert.base64Decode(\n    'CgxMYXJnZUNvdmVyVjESLgoEYmFzZRgBIAEoCzIaLmJpbGliaWxpLmFwcC5jYXJkLnYxLkJhc2'\n    'VSBGJhc2USGwoJY292ZXJfZ2lmGAIgASgJUghjb3ZlckdpZhI0CgZhdmF0YXIYAyABKAsyHC5i'\n    'aWxpYmlsaS5hcHAuY2FyZC52MS5BdmF0YXJSBmF2YXRhchIoChBjb3Zlcl9sZWZ0X3RleHQxGA'\n    'QgASgJUg5jb3ZlckxlZnRUZXh0MRIoChBjb3Zlcl9sZWZ0X3RleHQyGAUgASgJUg5jb3Zlckxl'\n    'ZnRUZXh0MhIoChBjb3Zlcl9sZWZ0X3RleHQzGAYgASgJUg5jb3ZlckxlZnRUZXh0MxIfCgtjb3'\n    'Zlcl9iYWRnZRgHIAEoCVIKY292ZXJCYWRnZRImCg90b3BfcmNtZF9yZWFzb24YCCABKAlSDXRv'\n    'cFJjbWRSZWFzb24SLAoSYm90dG9tX3JjbWRfcmVhc29uGAkgASgJUhBib3R0b21SY21kUmVhc2'\n    '9uEhIKBGRlc2MYCiABKAlSBGRlc2MSIwoNb2ZmaWNpYWxfaWNvbhgLIAEoBVIMb2ZmaWNpYWxJ'\n    'Y29uEhkKCGNhbl9wbGF5GAwgASgFUgdjYW5QbGF5ElQKFXRvcF9yY21kX3JlYXNvbl9zdHlsZR'\n    'gNIAEoCzIhLmJpbGliaWxpLmFwcC5jYXJkLnYxLlJlYXNvblN0eWxlUhJ0b3BSY21kUmVhc29u'\n    'U3R5bGUSWgoYYm90dG9tX3JjbWRfcmVhc29uX3N0eWxlGA4gASgLMiEuYmlsaWJpbGkuYXBwLm'\n    'NhcmQudjEuUmVhc29uU3R5bGVSFWJvdHRvbVJjbWRSZWFzb25TdHlsZRJSChRyY21kX3JlYXNv'\n    'bl9zdHlsZV92MhgPIAEoCzIhLmJpbGliaWxpLmFwcC5jYXJkLnYxLlJlYXNvblN0eWxlUhFyY2'\n    '1kUmVhc29uU3R5bGVWMhJWChZsZWZ0X2NvdmVyX2JhZGdlX3N0eWxlGBAgASgLMiEuYmlsaWJp'\n    'bGkuYXBwLmNhcmQudjEuUmVhc29uU3R5bGVSE2xlZnRDb3ZlckJhZGdlU3R5bGUSWAoXcmlnaH'\n    'RfY292ZXJfYmFkZ2Vfc3R5bGUYESABKAsyIS5iaWxpYmlsaS5hcHAuY2FyZC52MS5SZWFzb25T'\n    'dHlsZVIUcmlnaHRDb3ZlckJhZGdlU3R5bGUSIQoMY292ZXJfYmFkZ2UyGBIgASgJUgtjb3Zlck'\n    'JhZGdlMhJBCgtsaWtlX2J1dHRvbhgTIAEoCzIgLmJpbGliaWxpLmFwcC5jYXJkLnYxLkxpa2VC'\n    'dXR0b25SCmxpa2VCdXR0b24SKgoRdGl0bGVfc2luZ2xlX2xpbmUYFCABKAVSD3RpdGxlU2luZ2'\n    'xlTGluZRIoChBjb3Zlcl9yaWdodF90ZXh0GBUgASgJUg5jb3ZlclJpZ2h0VGV4dA==');\n\n@$core.Deprecated('Use largeCoverV2Descriptor instead')\nconst LargeCoverV2$json = {\n  '1': 'LargeCoverV2',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {\n      '1': 'avatar',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Avatar',\n      '10': 'avatar'\n    },\n    {'1': 'badge', '3': 3, '4': 1, '5': 9, '10': 'badge'},\n    {\n      '1': 'cover_right_button',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Button',\n      '10': 'coverRightButton'\n    },\n    {'1': 'cover_left_text1', '3': 5, '4': 1, '5': 9, '10': 'coverLeftText1'},\n    {'1': 'cover_left_icon1', '3': 6, '4': 1, '5': 5, '10': 'coverLeftIcon1'},\n    {'1': 'cover_left_text2', '3': 7, '4': 1, '5': 9, '10': 'coverLeftText2'},\n    {'1': 'cover_left_icon2', '3': 8, '4': 1, '5': 5, '10': 'coverLeftIcon2'},\n    {'1': 'rcmd_reason', '3': 9, '4': 1, '5': 9, '10': 'rcmdReason'},\n    {'1': 'official_icon', '3': 10, '4': 1, '5': 5, '10': 'officialIcon'},\n    {'1': 'can_play', '3': 11, '4': 1, '5': 5, '10': 'canPlay'},\n    {\n      '1': 'rcmd_reason_style',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'rcmdReasonStyle'\n    },\n    {'1': 'show_top', '3': 13, '4': 1, '5': 5, '10': 'showTop'},\n    {'1': 'show_bottom', '3': 14, '4': 1, '5': 5, '10': 'showBottom'},\n  ],\n};\n\n/// Descriptor for `LargeCoverV2`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List largeCoverV2Descriptor = $convert.base64Decode(\n    'CgxMYXJnZUNvdmVyVjISLgoEYmFzZRgBIAEoCzIaLmJpbGliaWxpLmFwcC5jYXJkLnYxLkJhc2'\n    'VSBGJhc2USNAoGYXZhdGFyGAIgASgLMhwuYmlsaWJpbGkuYXBwLmNhcmQudjEuQXZhdGFyUgZh'\n    'dmF0YXISFAoFYmFkZ2UYAyABKAlSBWJhZGdlEkoKEmNvdmVyX3JpZ2h0X2J1dHRvbhgEIAEoCz'\n    'IcLmJpbGliaWxpLmFwcC5jYXJkLnYxLkJ1dHRvblIQY292ZXJSaWdodEJ1dHRvbhIoChBjb3Zl'\n    'cl9sZWZ0X3RleHQxGAUgASgJUg5jb3ZlckxlZnRUZXh0MRIoChBjb3Zlcl9sZWZ0X2ljb24xGA'\n    'YgASgFUg5jb3ZlckxlZnRJY29uMRIoChBjb3Zlcl9sZWZ0X3RleHQyGAcgASgJUg5jb3Zlckxl'\n    'ZnRUZXh0MhIoChBjb3Zlcl9sZWZ0X2ljb24yGAggASgFUg5jb3ZlckxlZnRJY29uMhIfCgtyY2'\n    '1kX3JlYXNvbhgJIAEoCVIKcmNtZFJlYXNvbhIjCg1vZmZpY2lhbF9pY29uGAogASgFUgxvZmZp'\n    'Y2lhbEljb24SGQoIY2FuX3BsYXkYCyABKAVSB2NhblBsYXkSTQoRcmNtZF9yZWFzb25fc3R5bG'\n    'UYDCABKAsyIS5iaWxpYmlsaS5hcHAuY2FyZC52MS5SZWFzb25TdHlsZVIPcmNtZFJlYXNvblN0'\n    'eWxlEhkKCHNob3dfdG9wGA0gASgFUgdzaG93VG9wEh8KC3Nob3dfYm90dG9tGA4gASgFUgpzaG'\n    '93Qm90dG9t');\n\n@$core.Deprecated('Use largeCoverV3Descriptor instead')\nconst LargeCoverV3$json = {\n  '1': 'LargeCoverV3',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {'1': 'cover_gif', '3': 2, '4': 1, '5': 9, '10': 'coverGif'},\n    {\n      '1': 'avatar',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Avatar',\n      '10': 'avatar'\n    },\n    {\n      '1': 'top_rcmd_reason_style',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'topRcmdReasonStyle'\n    },\n    {\n      '1': 'bottom_rcmd_reason_style',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'bottomRcmdReasonStyle'\n    },\n    {'1': 'cover_left_text1', '3': 6, '4': 1, '5': 9, '10': 'coverLeftText1'},\n    {'1': 'cover_left_icon1', '3': 7, '4': 1, '5': 5, '10': 'coverLeftIcon1'},\n    {'1': 'cover_left_text2', '3': 8, '4': 1, '5': 9, '10': 'coverLeftText2'},\n    {'1': 'cover_left_icon2', '3': 9, '4': 1, '5': 5, '10': 'coverLeftIcon2'},\n    {'1': 'cover_right_text', '3': 10, '4': 1, '5': 9, '10': 'coverRightText'},\n    {'1': 'desc', '3': 11, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'official_icon', '3': 12, '4': 1, '5': 5, '10': 'officialIcon'},\n  ],\n};\n\n/// Descriptor for `LargeCoverV3`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List largeCoverV3Descriptor = $convert.base64Decode(\n    'CgxMYXJnZUNvdmVyVjMSLgoEYmFzZRgBIAEoCzIaLmJpbGliaWxpLmFwcC5jYXJkLnYxLkJhc2'\n    'VSBGJhc2USGwoJY292ZXJfZ2lmGAIgASgJUghjb3ZlckdpZhI0CgZhdmF0YXIYAyABKAsyHC5i'\n    'aWxpYmlsaS5hcHAuY2FyZC52MS5BdmF0YXJSBmF2YXRhchJUChV0b3BfcmNtZF9yZWFzb25fc3'\n    'R5bGUYBCABKAsyIS5iaWxpYmlsaS5hcHAuY2FyZC52MS5SZWFzb25TdHlsZVISdG9wUmNtZFJl'\n    'YXNvblN0eWxlEloKGGJvdHRvbV9yY21kX3JlYXNvbl9zdHlsZRgFIAEoCzIhLmJpbGliaWxpLm'\n    'FwcC5jYXJkLnYxLlJlYXNvblN0eWxlUhVib3R0b21SY21kUmVhc29uU3R5bGUSKAoQY292ZXJf'\n    'bGVmdF90ZXh0MRgGIAEoCVIOY292ZXJMZWZ0VGV4dDESKAoQY292ZXJfbGVmdF9pY29uMRgHIA'\n    'EoBVIOY292ZXJMZWZ0SWNvbjESKAoQY292ZXJfbGVmdF90ZXh0MhgIIAEoCVIOY292ZXJMZWZ0'\n    'VGV4dDISKAoQY292ZXJfbGVmdF9pY29uMhgJIAEoBVIOY292ZXJMZWZ0SWNvbjISKAoQY292ZX'\n    'JfcmlnaHRfdGV4dBgKIAEoCVIOY292ZXJSaWdodFRleHQSEgoEZGVzYxgLIAEoCVIEZGVzYxIj'\n    'Cg1vZmZpY2lhbF9pY29uGAwgASgFUgxvZmZpY2lhbEljb24=');\n\n@$core.Deprecated('Use largeCoverV4Descriptor instead')\nconst LargeCoverV4$json = {\n  '1': 'LargeCoverV4',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {'1': 'cover_left_text1', '3': 2, '4': 1, '5': 9, '10': 'coverLeftText1'},\n    {'1': 'cover_left_text2', '3': 3, '4': 1, '5': 9, '10': 'coverLeftText2'},\n    {'1': 'cover_left_text3', '3': 4, '4': 1, '5': 9, '10': 'coverLeftText3'},\n    {'1': 'cover_badge', '3': 5, '4': 1, '5': 9, '10': 'coverBadge'},\n    {'1': 'can_play', '3': 6, '4': 1, '5': 5, '10': 'canPlay'},\n    {\n      '1': 'up',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Up',\n      '10': 'up'\n    },\n    {'1': 'short_link', '3': 8, '4': 1, '5': 9, '10': 'shortLink'},\n    {'1': 'share_subtitle', '3': 9, '4': 1, '5': 9, '10': 'shareSubtitle'},\n    {'1': 'play_number', '3': 10, '4': 1, '5': 9, '10': 'playNumber'},\n    {'1': 'bvid', '3': 11, '4': 1, '5': 9, '10': 'bvid'},\n    {'1': 'sub_param', '3': 12, '4': 1, '5': 9, '10': 'subParam'},\n  ],\n};\n\n/// Descriptor for `LargeCoverV4`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List largeCoverV4Descriptor = $convert.base64Decode(\n    'CgxMYXJnZUNvdmVyVjQSLgoEYmFzZRgBIAEoCzIaLmJpbGliaWxpLmFwcC5jYXJkLnYxLkJhc2'\n    'VSBGJhc2USKAoQY292ZXJfbGVmdF90ZXh0MRgCIAEoCVIOY292ZXJMZWZ0VGV4dDESKAoQY292'\n    'ZXJfbGVmdF90ZXh0MhgDIAEoCVIOY292ZXJMZWZ0VGV4dDISKAoQY292ZXJfbGVmdF90ZXh0Mx'\n    'gEIAEoCVIOY292ZXJMZWZ0VGV4dDMSHwoLY292ZXJfYmFkZ2UYBSABKAlSCmNvdmVyQmFkZ2US'\n    'GQoIY2FuX3BsYXkYBiABKAVSB2NhblBsYXkSKAoCdXAYByABKAsyGC5iaWxpYmlsaS5hcHAuY2'\n    'FyZC52MS5VcFICdXASHQoKc2hvcnRfbGluaxgIIAEoCVIJc2hvcnRMaW5rEiUKDnNoYXJlX3N1'\n    'YnRpdGxlGAkgASgJUg1zaGFyZVN1YnRpdGxlEh8KC3BsYXlfbnVtYmVyGAogASgJUgpwbGF5Tn'\n    'VtYmVyEhIKBGJ2aWQYCyABKAlSBGJ2aWQSGwoJc3ViX3BhcmFtGAwgASgJUghzdWJQYXJhbQ==');\n\n@$core.Deprecated('Use likeButtonDescriptor instead')\nconst LikeButton$json = {\n  '1': 'LikeButton',\n  '2': [\n    {'1': 'aid', '3': 1, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'count', '3': 2, '4': 1, '5': 5, '10': 'count'},\n    {'1': 'show_count', '3': 3, '4': 1, '5': 8, '10': 'showCount'},\n    {'1': 'event', '3': 4, '4': 1, '5': 9, '10': 'event'},\n    {'1': 'selected', '3': 5, '4': 1, '5': 5, '10': 'selected'},\n    {'1': 'event_v2', '3': 6, '4': 1, '5': 9, '10': 'eventV2'},\n  ],\n};\n\n/// Descriptor for `LikeButton`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List likeButtonDescriptor = $convert.base64Decode(\n    'CgpMaWtlQnV0dG9uEhAKA2FpZBgBIAEoA1IDYWlkEhQKBWNvdW50GAIgASgFUgVjb3VudBIdCg'\n    'pzaG93X2NvdW50GAMgASgIUglzaG93Q291bnQSFAoFZXZlbnQYBCABKAlSBWV2ZW50EhoKCHNl'\n    'bGVjdGVkGAUgASgFUghzZWxlY3RlZBIZCghldmVudF92MhgGIAEoCVIHZXZlbnRWMg==');\n\n@$core.Deprecated('Use maskDescriptor instead')\nconst Mask$json = {\n  '1': 'Mask',\n  '2': [\n    {\n      '1': 'avatar',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Avatar',\n      '10': 'avatar'\n    },\n    {\n      '1': 'button',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Button',\n      '10': 'button'\n    },\n  ],\n};\n\n/// Descriptor for `Mask`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List maskDescriptor = $convert.base64Decode(\n    'CgRNYXNrEjQKBmF2YXRhchgBIAEoCzIcLmJpbGliaWxpLmFwcC5jYXJkLnYxLkF2YXRhclIGYX'\n    'ZhdGFyEjQKBmJ1dHRvbhgCIAEoCzIcLmJpbGliaWxpLmFwcC5jYXJkLnYxLkJ1dHRvblIGYnV0'\n    'dG9u');\n\n@$core.Deprecated('Use middleCoverV2Descriptor instead')\nconst MiddleCoverV2$json = {\n  '1': 'MiddleCoverV2',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {'1': 'ratio', '3': 2, '4': 1, '5': 5, '10': 'ratio'},\n    {'1': 'desc', '3': 3, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'badge', '3': 4, '4': 1, '5': 9, '10': 'badge'},\n  ],\n};\n\n/// Descriptor for `MiddleCoverV2`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List middleCoverV2Descriptor = $convert.base64Decode(\n    'Cg1NaWRkbGVDb3ZlclYyEi4KBGJhc2UYASABKAsyGi5iaWxpYmlsaS5hcHAuY2FyZC52MS5CYX'\n    'NlUgRiYXNlEhQKBXJhdGlvGAIgASgFUgVyYXRpbxISCgRkZXNjGAMgASgJUgRkZXNjEhQKBWJh'\n    'ZGdlGAQgASgJUgViYWRnZQ==');\n\n@$core.Deprecated('Use middleCoverV3Descriptor instead')\nconst MiddleCoverV3$json = {\n  '1': 'MiddleCoverV3',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {'1': 'desc1', '3': 2, '4': 1, '5': 9, '10': 'desc1'},\n    {'1': 'desc2', '3': 3, '4': 1, '5': 9, '10': 'desc2'},\n    {\n      '1': 'cover_badge_style',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'coverBadgeStyle'\n    },\n  ],\n};\n\n/// Descriptor for `MiddleCoverV3`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List middleCoverV3Descriptor = $convert.base64Decode(\n    'Cg1NaWRkbGVDb3ZlclYzEi4KBGJhc2UYASABKAsyGi5iaWxpYmlsaS5hcHAuY2FyZC52MS5CYX'\n    'NlUgRiYXNlEhQKBWRlc2MxGAIgASgJUgVkZXNjMRIUCgVkZXNjMhgDIAEoCVIFZGVzYzISTQoR'\n    'Y292ZXJfYmFkZ2Vfc3R5bGUYBCABKAsyIS5iaWxpYmlsaS5hcHAuY2FyZC52MS5SZWFzb25TdH'\n    'lsZVIPY292ZXJCYWRnZVN0eWxl');\n\n@$core.Deprecated('Use multiItemDescriptor instead')\nconst MultiItem$json = {\n  '1': 'MultiItem',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {'1': 'more_uri', '3': 2, '4': 1, '5': 9, '10': 'moreUri'},\n    {'1': 'more_text', '3': 3, '4': 1, '5': 9, '10': 'moreText'},\n    {\n      '1': 'items',\n      '3': 4,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.DoubleCards',\n      '10': 'items'\n    },\n  ],\n};\n\n/// Descriptor for `MultiItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List multiItemDescriptor = $convert.base64Decode(\n    'CglNdWx0aUl0ZW0SLgoEYmFzZRgBIAEoCzIaLmJpbGliaWxpLmFwcC5jYXJkLnYxLkJhc2VSBG'\n    'Jhc2USGQoIbW9yZV91cmkYAiABKAlSB21vcmVVcmkSGwoJbW9yZV90ZXh0GAMgASgJUghtb3Jl'\n    'VGV4dBI3CgVpdGVtcxgEIAMoCzIhLmJpbGliaWxpLmFwcC5jYXJkLnYxLkRvdWJsZUNhcmRzUg'\n    'VpdGVtcw==');\n\n@$core.Deprecated('Use onePicV2Descriptor instead')\nconst OnePicV2$json = {\n  '1': 'OnePicV2',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {'1': 'cover_left_icon1', '3': 2, '4': 1, '5': 5, '10': 'coverLeftIcon1'},\n    {'1': 'cover_left_text2', '3': 3, '4': 1, '5': 9, '10': 'coverLeftText2'},\n    {'1': 'cover_right_text', '3': 4, '4': 1, '5': 9, '10': 'coverRightText'},\n    {'1': 'cover_right_icon', '3': 5, '4': 1, '5': 5, '10': 'coverRightIcon'},\n    {\n      '1': 'cover_right_background_color',\n      '3': 6,\n      '4': 1,\n      '5': 9,\n      '10': 'coverRightBackgroundColor'\n    },\n    {'1': 'badge', '3': 7, '4': 1, '5': 9, '10': 'badge'},\n    {'1': 'rcmd_reason', '3': 8, '4': 1, '5': 9, '10': 'rcmdReason'},\n    {\n      '1': 'avatar',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Avatar',\n      '10': 'avatar'\n    },\n    {\n      '1': 'rcmd_reason_style',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'rcmdReasonStyle'\n    },\n  ],\n};\n\n/// Descriptor for `OnePicV2`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List onePicV2Descriptor = $convert.base64Decode(\n    'CghPbmVQaWNWMhIuCgRiYXNlGAEgASgLMhouYmlsaWJpbGkuYXBwLmNhcmQudjEuQmFzZVIEYm'\n    'FzZRIoChBjb3Zlcl9sZWZ0X2ljb24xGAIgASgFUg5jb3ZlckxlZnRJY29uMRIoChBjb3Zlcl9s'\n    'ZWZ0X3RleHQyGAMgASgJUg5jb3ZlckxlZnRUZXh0MhIoChBjb3Zlcl9yaWdodF90ZXh0GAQgAS'\n    'gJUg5jb3ZlclJpZ2h0VGV4dBIoChBjb3Zlcl9yaWdodF9pY29uGAUgASgFUg5jb3ZlclJpZ2h0'\n    'SWNvbhI/Chxjb3Zlcl9yaWdodF9iYWNrZ3JvdW5kX2NvbG9yGAYgASgJUhljb3ZlclJpZ2h0Qm'\n    'Fja2dyb3VuZENvbG9yEhQKBWJhZGdlGAcgASgJUgViYWRnZRIfCgtyY21kX3JlYXNvbhgIIAEo'\n    'CVIKcmNtZFJlYXNvbhI0CgZhdmF0YXIYCSABKAsyHC5iaWxpYmlsaS5hcHAuY2FyZC52MS5Bdm'\n    'F0YXJSBmF2YXRhchJNChFyY21kX3JlYXNvbl9zdHlsZRgKIAEoCzIhLmJpbGliaWxpLmFwcC5j'\n    'YXJkLnYxLlJlYXNvblN0eWxlUg9yY21kUmVhc29uU3R5bGU=');\n\n@$core.Deprecated('Use onePicV3Descriptor instead')\nconst OnePicV3$json = {\n  '1': 'OnePicV3',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {'1': 'cover_left_text1', '3': 2, '4': 1, '5': 9, '10': 'coverLeftText1'},\n    {'1': 'cover_left_icon1', '3': 3, '4': 1, '5': 5, '10': 'coverLeftIcon1'},\n    {'1': 'cover_right_text', '3': 4, '4': 1, '5': 9, '10': 'coverRightText'},\n    {'1': 'cover_right_icon', '3': 5, '4': 1, '5': 5, '10': 'coverRightIcon'},\n    {\n      '1': 'cover_right_background_color',\n      '3': 6,\n      '4': 1,\n      '5': 9,\n      '10': 'coverRightBackgroundColor'\n    },\n    {'1': 'badge', '3': 7, '4': 1, '5': 9, '10': 'badge'},\n    {\n      '1': 'rcmd_reason_style',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'rcmdReasonStyle'\n    },\n  ],\n};\n\n/// Descriptor for `OnePicV3`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List onePicV3Descriptor = $convert.base64Decode(\n    'CghPbmVQaWNWMxIuCgRiYXNlGAEgASgLMhouYmlsaWJpbGkuYXBwLmNhcmQudjEuQmFzZVIEYm'\n    'FzZRIoChBjb3Zlcl9sZWZ0X3RleHQxGAIgASgJUg5jb3ZlckxlZnRUZXh0MRIoChBjb3Zlcl9s'\n    'ZWZ0X2ljb24xGAMgASgFUg5jb3ZlckxlZnRJY29uMRIoChBjb3Zlcl9yaWdodF90ZXh0GAQgAS'\n    'gJUg5jb3ZlclJpZ2h0VGV4dBIoChBjb3Zlcl9yaWdodF9pY29uGAUgASgFUg5jb3ZlclJpZ2h0'\n    'SWNvbhI/Chxjb3Zlcl9yaWdodF9iYWNrZ3JvdW5kX2NvbG9yGAYgASgJUhljb3ZlclJpZ2h0Qm'\n    'Fja2dyb3VuZENvbG9yEhQKBWJhZGdlGAcgASgJUgViYWRnZRJNChFyY21kX3JlYXNvbl9zdHls'\n    'ZRgIIAEoCzIhLmJpbGliaWxpLmFwcC5jYXJkLnYxLlJlYXNvblN0eWxlUg9yY21kUmVhc29uU3'\n    'R5bGU=');\n\n@$core.Deprecated('Use panelMetaDescriptor instead')\nconst PanelMeta$json = {\n  '1': 'PanelMeta',\n  '2': [\n    {'1': 'panel_type', '3': 1, '4': 1, '5': 5, '10': 'panelType'},\n    {'1': 'share_origin', '3': 2, '4': 1, '5': 9, '10': 'shareOrigin'},\n    {'1': 'share_id', '3': 3, '4': 1, '5': 9, '10': 'shareId'},\n    {\n      '1': 'functional_buttons',\n      '3': 4,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.FunctionalButton',\n      '10': 'functionalButtons'\n    },\n  ],\n};\n\n/// Descriptor for `PanelMeta`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List panelMetaDescriptor = $convert.base64Decode(\n    'CglQYW5lbE1ldGESHQoKcGFuZWxfdHlwZRgBIAEoBVIJcGFuZWxUeXBlEiEKDHNoYXJlX29yaW'\n    'dpbhgCIAEoCVILc2hhcmVPcmlnaW4SGQoIc2hhcmVfaWQYAyABKAlSB3NoYXJlSWQSVQoSZnVu'\n    'Y3Rpb25hbF9idXR0b25zGAQgAygLMiYuYmlsaWJpbGkuYXBwLmNhcmQudjEuRnVuY3Rpb25hbE'\n    'J1dHRvblIRZnVuY3Rpb25hbEJ1dHRvbnM=');\n\n@$core.Deprecated('Use playerArgsDescriptor instead')\nconst PlayerArgs$json = {\n  '1': 'PlayerArgs',\n  '2': [\n    {'1': 'is_live', '3': 1, '4': 1, '5': 5, '10': 'isLive'},\n    {'1': 'aid', '3': 2, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'cid', '3': 3, '4': 1, '5': 3, '10': 'cid'},\n    {'1': 'sub_type', '3': 4, '4': 1, '5': 5, '10': 'subType'},\n    {'1': 'room_id', '3': 5, '4': 1, '5': 3, '10': 'roomId'},\n    {'1': 'ep_id', '3': 7, '4': 1, '5': 3, '10': 'epId'},\n    {'1': 'is_preview', '3': 8, '4': 1, '5': 5, '10': 'isPreview'},\n    {'1': 'type', '3': 9, '4': 1, '5': 9, '10': 'type'},\n    {'1': 'duration', '3': 10, '4': 1, '5': 3, '10': 'duration'},\n    {'1': 'season_id', '3': 11, '4': 1, '5': 3, '10': 'seasonId'},\n  ],\n};\n\n/// Descriptor for `PlayerArgs`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playerArgsDescriptor = $convert.base64Decode(\n    'CgpQbGF5ZXJBcmdzEhcKB2lzX2xpdmUYASABKAVSBmlzTGl2ZRIQCgNhaWQYAiABKANSA2FpZB'\n    'IQCgNjaWQYAyABKANSA2NpZBIZCghzdWJfdHlwZRgEIAEoBVIHc3ViVHlwZRIXCgdyb29tX2lk'\n    'GAUgASgDUgZyb29tSWQSEwoFZXBfaWQYByABKANSBGVwSWQSHQoKaXNfcHJldmlldxgIIAEoBV'\n    'IJaXNQcmV2aWV3EhIKBHR5cGUYCSABKAlSBHR5cGUSGgoIZHVyYXRpb24YCiABKANSCGR1cmF0'\n    'aW9uEhsKCXNlYXNvbl9pZBgLIAEoA1IIc2Vhc29uSWQ=');\n\n@$core.Deprecated('Use popularTopEntranceDescriptor instead')\nconst PopularTopEntrance$json = {\n  '1': 'PopularTopEntrance',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {\n      '1': 'items',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.EntranceItem',\n      '10': 'items'\n    },\n  ],\n};\n\n/// Descriptor for `PopularTopEntrance`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List popularTopEntranceDescriptor = $convert.base64Decode(\n    'ChJQb3B1bGFyVG9wRW50cmFuY2USLgoEYmFzZRgBIAEoCzIaLmJpbGliaWxpLmFwcC5jYXJkLn'\n    'YxLkJhc2VSBGJhc2USOAoFaXRlbXMYAiADKAsyIi5iaWxpYmlsaS5hcHAuY2FyZC52MS5FbnRy'\n    'YW5jZUl0ZW1SBWl0ZW1z');\n\n@$core.Deprecated('Use rcmdOneItemDescriptor instead')\nconst RcmdOneItem$json = {\n  '1': 'RcmdOneItem',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {\n      '1': 'top_rcmd_reason_style',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'topRcmdReasonStyle'\n    },\n    {\n      '1': 'item',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.SmallCoverRcmdItem',\n      '10': 'item'\n    },\n  ],\n};\n\n/// Descriptor for `RcmdOneItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rcmdOneItemDescriptor = $convert.base64Decode(\n    'CgtSY21kT25lSXRlbRIuCgRiYXNlGAEgASgLMhouYmlsaWJpbGkuYXBwLmNhcmQudjEuQmFzZV'\n    'IEYmFzZRJUChV0b3BfcmNtZF9yZWFzb25fc3R5bGUYAiABKAsyIS5iaWxpYmlsaS5hcHAuY2Fy'\n    'ZC52MS5SZWFzb25TdHlsZVISdG9wUmNtZFJlYXNvblN0eWxlEjwKBGl0ZW0YAyABKAsyKC5iaW'\n    'xpYmlsaS5hcHAuY2FyZC52MS5TbWFsbENvdmVyUmNtZEl0ZW1SBGl0ZW0=');\n\n@$core.Deprecated('Use reasonStyleDescriptor instead')\nconst ReasonStyle$json = {\n  '1': 'ReasonStyle',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'text_color', '3': 2, '4': 1, '5': 9, '10': 'textColor'},\n    {'1': 'bg_color', '3': 3, '4': 1, '5': 9, '10': 'bgColor'},\n    {'1': 'border_color', '3': 4, '4': 1, '5': 9, '10': 'borderColor'},\n    {'1': 'icon_url', '3': 5, '4': 1, '5': 9, '10': 'iconUrl'},\n    {'1': 'text_color_night', '3': 6, '4': 1, '5': 9, '10': 'textColorNight'},\n    {'1': 'bg_color_night', '3': 7, '4': 1, '5': 9, '10': 'bgColorNight'},\n    {\n      '1': 'border_color_night',\n      '3': 8,\n      '4': 1,\n      '5': 9,\n      '10': 'borderColorNight'\n    },\n    {'1': 'icon_night_url', '3': 9, '4': 1, '5': 9, '10': 'iconNightUrl'},\n    {'1': 'bg_style', '3': 10, '4': 1, '5': 5, '10': 'bgStyle'},\n    {'1': 'uri', '3': 11, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'icon_bg_url', '3': 12, '4': 1, '5': 9, '10': 'iconBgUrl'},\n    {'1': 'event', '3': 13, '4': 1, '5': 9, '10': 'event'},\n    {'1': 'event_v2', '3': 14, '4': 1, '5': 9, '10': 'eventV2'},\n    {'1': 'right_icon_type', '3': 15, '4': 1, '5': 5, '10': 'rightIconType'},\n    {'1': 'left_icon_type', '3': 16, '4': 1, '5': 9, '10': 'leftIconType'},\n  ],\n};\n\n/// Descriptor for `ReasonStyle`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reasonStyleDescriptor = $convert.base64Decode(\n    'CgtSZWFzb25TdHlsZRISCgR0ZXh0GAEgASgJUgR0ZXh0Eh0KCnRleHRfY29sb3IYAiABKAlSCX'\n    'RleHRDb2xvchIZCghiZ19jb2xvchgDIAEoCVIHYmdDb2xvchIhCgxib3JkZXJfY29sb3IYBCAB'\n    'KAlSC2JvcmRlckNvbG9yEhkKCGljb25fdXJsGAUgASgJUgdpY29uVXJsEigKEHRleHRfY29sb3'\n    'JfbmlnaHQYBiABKAlSDnRleHRDb2xvck5pZ2h0EiQKDmJnX2NvbG9yX25pZ2h0GAcgASgJUgxi'\n    'Z0NvbG9yTmlnaHQSLAoSYm9yZGVyX2NvbG9yX25pZ2h0GAggASgJUhBib3JkZXJDb2xvck5pZ2'\n    'h0EiQKDmljb25fbmlnaHRfdXJsGAkgASgJUgxpY29uTmlnaHRVcmwSGQoIYmdfc3R5bGUYCiAB'\n    'KAVSB2JnU3R5bGUSEAoDdXJpGAsgASgJUgN1cmkSHgoLaWNvbl9iZ191cmwYDCABKAlSCWljb2'\n    '5CZ1VybBIUCgVldmVudBgNIAEoCVIFZXZlbnQSGQoIZXZlbnRfdjIYDiABKAlSB2V2ZW50VjIS'\n    'JgoPcmlnaHRfaWNvbl90eXBlGA8gASgFUg1yaWdodEljb25UeXBlEiQKDmxlZnRfaWNvbl90eX'\n    'BlGBAgASgJUgxsZWZ0SWNvblR5cGU=');\n\n@$core.Deprecated('Use relationDescriptor instead')\nconst Relation$json = {\n  '1': 'Relation',\n  '2': [\n    {'1': 'status', '3': 1, '4': 1, '5': 5, '10': 'status'},\n    {'1': 'is_follow', '3': 2, '4': 1, '5': 5, '10': 'isFollow'},\n    {'1': 'is_followed', '3': 3, '4': 1, '5': 5, '10': 'isFollowed'},\n  ],\n};\n\n/// Descriptor for `Relation`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List relationDescriptor = $convert.base64Decode(\n    'CghSZWxhdGlvbhIWCgZzdGF0dXMYASABKAVSBnN0YXR1cxIbCglpc19mb2xsb3cYAiABKAVSCG'\n    'lzRm9sbG93Eh8KC2lzX2ZvbGxvd2VkGAMgASgFUgppc0ZvbGxvd2Vk');\n\n@$core.Deprecated('Use sharePlaneDescriptor instead')\nconst SharePlane$json = {\n  '1': 'SharePlane',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'share_subtitle', '3': 2, '4': 1, '5': 9, '10': 'shareSubtitle'},\n    {'1': 'desc', '3': 3, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'cover', '3': 4, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'aid', '3': 5, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'bvid', '3': 6, '4': 1, '5': 9, '10': 'bvid'},\n    {\n      '1': 'share_to',\n      '3': 7,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.SharePlane.ShareToEntry',\n      '10': 'shareTo'\n    },\n    {'1': 'author', '3': 8, '4': 1, '5': 9, '10': 'author'},\n    {'1': 'author_id', '3': 9, '4': 1, '5': 3, '10': 'authorId'},\n    {'1': 'short_link', '3': 10, '4': 1, '5': 9, '10': 'shortLink'},\n    {'1': 'play_number', '3': 11, '4': 1, '5': 9, '10': 'playNumber'},\n    {'1': 'first_cid', '3': 12, '4': 1, '5': 3, '10': 'firstCid'},\n  ],\n  '3': [SharePlane_ShareToEntry$json],\n};\n\n@$core.Deprecated('Use sharePlaneDescriptor instead')\nconst SharePlane_ShareToEntry$json = {\n  '1': 'ShareToEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 8, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `SharePlane`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sharePlaneDescriptor = $convert.base64Decode(\n    'CgpTaGFyZVBsYW5lEhQKBXRpdGxlGAEgASgJUgV0aXRsZRIlCg5zaGFyZV9zdWJ0aXRsZRgCIA'\n    'EoCVINc2hhcmVTdWJ0aXRsZRISCgRkZXNjGAMgASgJUgRkZXNjEhQKBWNvdmVyGAQgASgJUgVj'\n    'b3ZlchIQCgNhaWQYBSABKANSA2FpZBISCgRidmlkGAYgASgJUgRidmlkEkgKCHNoYXJlX3RvGA'\n    'cgAygLMi0uYmlsaWJpbGkuYXBwLmNhcmQudjEuU2hhcmVQbGFuZS5TaGFyZVRvRW50cnlSB3No'\n    'YXJlVG8SFgoGYXV0aG9yGAggASgJUgZhdXRob3ISGwoJYXV0aG9yX2lkGAkgASgDUghhdXRob3'\n    'JJZBIdCgpzaG9ydF9saW5rGAogASgJUglzaG9ydExpbmsSHwoLcGxheV9udW1iZXIYCyABKAlS'\n    'CnBsYXlOdW1iZXISGwoJZmlyc3RfY2lkGAwgASgDUghmaXJzdENpZBo6CgxTaGFyZVRvRW50cn'\n    'kSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAhSBXZhbHVlOgI4AQ==');\n\n@$core.Deprecated('Use smallChannelSpecialDescriptor instead')\nconst SmallChannelSpecial$json = {\n  '1': 'SmallChannelSpecial',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {'1': 'bg_cover', '3': 2, '4': 1, '5': 9, '10': 'bgCover'},\n    {'1': 'desc1', '3': 3, '4': 1, '5': 9, '10': 'desc1'},\n    {'1': 'desc2', '3': 4, '4': 1, '5': 9, '10': 'desc2'},\n    {'1': 'badge', '3': 5, '4': 1, '5': 9, '10': 'badge'},\n    {\n      '1': 'rcmd_reason_style2',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'rcmdReasonStyle2'\n    },\n  ],\n};\n\n/// Descriptor for `SmallChannelSpecial`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List smallChannelSpecialDescriptor = $convert.base64Decode(\n    'ChNTbWFsbENoYW5uZWxTcGVjaWFsEi4KBGJhc2UYASABKAsyGi5iaWxpYmlsaS5hcHAuY2FyZC'\n    '52MS5CYXNlUgRiYXNlEhkKCGJnX2NvdmVyGAIgASgJUgdiZ0NvdmVyEhQKBWRlc2MxGAMgASgJ'\n    'UgVkZXNjMRIUCgVkZXNjMhgEIAEoCVIFZGVzYzISFAoFYmFkZ2UYBSABKAlSBWJhZGdlEk8KEn'\n    'JjbWRfcmVhc29uX3N0eWxlMhgGIAEoCzIhLmJpbGliaWxpLmFwcC5jYXJkLnYxLlJlYXNvblN0'\n    'eWxlUhByY21kUmVhc29uU3R5bGUy');\n\n@$core.Deprecated('Use smallCoverConvergeV2Descriptor instead')\nconst SmallCoverConvergeV2$json = {\n  '1': 'SmallCoverConvergeV2',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {'1': 'cover_left_text1', '3': 2, '4': 1, '5': 9, '10': 'coverLeftText1'},\n    {'1': 'cover_left_icon1', '3': 3, '4': 1, '5': 5, '10': 'coverLeftIcon1'},\n    {'1': 'cover_left_text2', '3': 4, '4': 1, '5': 9, '10': 'coverLeftText2'},\n    {'1': 'cover_left_icon2', '3': 5, '4': 1, '5': 5, '10': 'coverLeftIcon2'},\n    {'1': 'cover_right_text', '3': 6, '4': 1, '5': 9, '10': 'coverRightText'},\n    {\n      '1': 'cover_right_top_text',\n      '3': 7,\n      '4': 1,\n      '5': 9,\n      '10': 'coverRightTopText'\n    },\n    {\n      '1': 'rcmd_reason_style',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'rcmdReasonStyle'\n    },\n    {\n      '1': 'rcmd_reason_style_v2',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'rcmdReasonStyleV2'\n    },\n  ],\n};\n\n/// Descriptor for `SmallCoverConvergeV2`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List smallCoverConvergeV2Descriptor = $convert.base64Decode(\n    'ChRTbWFsbENvdmVyQ29udmVyZ2VWMhIuCgRiYXNlGAEgASgLMhouYmlsaWJpbGkuYXBwLmNhcm'\n    'QudjEuQmFzZVIEYmFzZRIoChBjb3Zlcl9sZWZ0X3RleHQxGAIgASgJUg5jb3ZlckxlZnRUZXh0'\n    'MRIoChBjb3Zlcl9sZWZ0X2ljb24xGAMgASgFUg5jb3ZlckxlZnRJY29uMRIoChBjb3Zlcl9sZW'\n    'Z0X3RleHQyGAQgASgJUg5jb3ZlckxlZnRUZXh0MhIoChBjb3Zlcl9sZWZ0X2ljb24yGAUgASgF'\n    'Ug5jb3ZlckxlZnRJY29uMhIoChBjb3Zlcl9yaWdodF90ZXh0GAYgASgJUg5jb3ZlclJpZ2h0VG'\n    'V4dBIvChRjb3Zlcl9yaWdodF90b3BfdGV4dBgHIAEoCVIRY292ZXJSaWdodFRvcFRleHQSTQoR'\n    'cmNtZF9yZWFzb25fc3R5bGUYCCABKAsyIS5iaWxpYmlsaS5hcHAuY2FyZC52MS5SZWFzb25TdH'\n    'lsZVIPcmNtZFJlYXNvblN0eWxlElIKFHJjbWRfcmVhc29uX3N0eWxlX3YyGAkgASgLMiEuYmls'\n    'aWJpbGkuYXBwLmNhcmQudjEuUmVhc29uU3R5bGVSEXJjbWRSZWFzb25TdHlsZVYy');\n\n@$core.Deprecated('Use smallCoverRcmdItemDescriptor instead')\nconst SmallCoverRcmdItem$json = {\n  '1': 'SmallCoverRcmdItem',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 2, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'param', '3': 4, '4': 1, '5': 9, '10': 'param'},\n    {'1': 'goto', '3': 5, '4': 1, '5': 9, '10': 'goto'},\n    {'1': 'cover_right_text1', '3': 6, '4': 1, '5': 9, '10': 'coverRightText1'},\n    {'1': 'right_desc1', '3': 7, '4': 1, '5': 9, '10': 'rightDesc1'},\n    {'1': 'right_desc2', '3': 8, '4': 1, '5': 9, '10': 'rightDesc2'},\n    {'1': 'cover_gif', '3': 9, '4': 1, '5': 9, '10': 'coverGif'},\n    {'1': 'right_icon1', '3': 10, '4': 1, '5': 5, '10': 'rightIcon1'},\n    {'1': 'right_icon2', '3': 11, '4': 1, '5': 5, '10': 'rightIcon2'},\n    {\n      '1': 'cover_right_text_content_description',\n      '3': 12,\n      '4': 1,\n      '5': 9,\n      '10': 'coverRightTextContentDescription'\n    },\n    {\n      '1': 'right_desc1_content_description',\n      '3': 13,\n      '4': 1,\n      '5': 9,\n      '10': 'rightDesc1ContentDescription'\n    },\n  ],\n};\n\n/// Descriptor for `SmallCoverRcmdItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List smallCoverRcmdItemDescriptor = $convert.base64Decode(\n    'ChJTbWFsbENvdmVyUmNtZEl0ZW0SFAoFdGl0bGUYASABKAlSBXRpdGxlEhQKBWNvdmVyGAIgAS'\n    'gJUgVjb3ZlchIQCgN1cmkYAyABKAlSA3VyaRIUCgVwYXJhbRgEIAEoCVIFcGFyYW0SEgoEZ290'\n    'bxgFIAEoCVIEZ290bxIqChFjb3Zlcl9yaWdodF90ZXh0MRgGIAEoCVIPY292ZXJSaWdodFRleH'\n    'QxEh8KC3JpZ2h0X2Rlc2MxGAcgASgJUgpyaWdodERlc2MxEh8KC3JpZ2h0X2Rlc2MyGAggASgJ'\n    'UgpyaWdodERlc2MyEhsKCWNvdmVyX2dpZhgJIAEoCVIIY292ZXJHaWYSHwoLcmlnaHRfaWNvbj'\n    'EYCiABKAVSCnJpZ2h0SWNvbjESHwoLcmlnaHRfaWNvbjIYCyABKAVSCnJpZ2h0SWNvbjISTgok'\n    'Y292ZXJfcmlnaHRfdGV4dF9jb250ZW50X2Rlc2NyaXB0aW9uGAwgASgJUiBjb3ZlclJpZ2h0VG'\n    'V4dENvbnRlbnREZXNjcmlwdGlvbhJFCh9yaWdodF9kZXNjMV9jb250ZW50X2Rlc2NyaXB0aW9u'\n    'GA0gASgJUhxyaWdodERlc2MxQ29udGVudERlc2NyaXB0aW9u');\n\n@$core.Deprecated('Use smallCoverV2Descriptor instead')\nconst SmallCoverV2$json = {\n  '1': 'SmallCoverV2',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {'1': 'cover_gif', '3': 2, '4': 1, '5': 9, '10': 'coverGif'},\n    {'1': 'cover_blur', '3': 3, '4': 1, '5': 5, '10': 'coverBlur'},\n    {'1': 'cover_left_text1', '3': 4, '4': 1, '5': 9, '10': 'coverLeftText1'},\n    {'1': 'cover_left_icon1', '3': 5, '4': 1, '5': 5, '10': 'coverLeftIcon1'},\n    {'1': 'cover_left_text2', '3': 6, '4': 1, '5': 9, '10': 'coverLeftText2'},\n    {'1': 'cover_left_icon2', '3': 7, '4': 1, '5': 5, '10': 'coverLeftIcon2'},\n    {'1': 'cover_right_text', '3': 8, '4': 1, '5': 9, '10': 'coverRightText'},\n    {'1': 'cover_right_icon', '3': 9, '4': 1, '5': 5, '10': 'coverRightIcon'},\n    {\n      '1': 'cover_right_background_color',\n      '3': 10,\n      '4': 1,\n      '5': 9,\n      '10': 'coverRightBackgroundColor'\n    },\n    {'1': 'subtitle', '3': 11, '4': 1, '5': 9, '10': 'subtitle'},\n    {'1': 'badge', '3': 12, '4': 1, '5': 9, '10': 'badge'},\n    {'1': 'rcmd_reason', '3': 13, '4': 1, '5': 9, '10': 'rcmdReason'},\n    {'1': 'desc', '3': 14, '4': 1, '5': 9, '10': 'desc'},\n    {\n      '1': 'avatar',\n      '3': 15,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Avatar',\n      '10': 'avatar'\n    },\n    {'1': 'official_icon', '3': 16, '4': 1, '5': 5, '10': 'officialIcon'},\n    {'1': 'can_play', '3': 17, '4': 1, '5': 5, '10': 'canPlay'},\n    {\n      '1': 'rcmd_reason_style',\n      '3': 18,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'rcmdReasonStyle'\n    },\n    {\n      '1': 'rcmd_reason_style_v2',\n      '3': 19,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'rcmdReasonStyleV2'\n    },\n    {\n      '1': 'like_button',\n      '3': 20,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.LikeButton',\n      '10': 'likeButton'\n    },\n  ],\n};\n\n/// Descriptor for `SmallCoverV2`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List smallCoverV2Descriptor = $convert.base64Decode(\n    'CgxTbWFsbENvdmVyVjISLgoEYmFzZRgBIAEoCzIaLmJpbGliaWxpLmFwcC5jYXJkLnYxLkJhc2'\n    'VSBGJhc2USGwoJY292ZXJfZ2lmGAIgASgJUghjb3ZlckdpZhIdCgpjb3Zlcl9ibHVyGAMgASgF'\n    'Ugljb3ZlckJsdXISKAoQY292ZXJfbGVmdF90ZXh0MRgEIAEoCVIOY292ZXJMZWZ0VGV4dDESKA'\n    'oQY292ZXJfbGVmdF9pY29uMRgFIAEoBVIOY292ZXJMZWZ0SWNvbjESKAoQY292ZXJfbGVmdF90'\n    'ZXh0MhgGIAEoCVIOY292ZXJMZWZ0VGV4dDISKAoQY292ZXJfbGVmdF9pY29uMhgHIAEoBVIOY2'\n    '92ZXJMZWZ0SWNvbjISKAoQY292ZXJfcmlnaHRfdGV4dBgIIAEoCVIOY292ZXJSaWdodFRleHQS'\n    'KAoQY292ZXJfcmlnaHRfaWNvbhgJIAEoBVIOY292ZXJSaWdodEljb24SPwocY292ZXJfcmlnaH'\n    'RfYmFja2dyb3VuZF9jb2xvchgKIAEoCVIZY292ZXJSaWdodEJhY2tncm91bmRDb2xvchIaCghz'\n    'dWJ0aXRsZRgLIAEoCVIIc3VidGl0bGUSFAoFYmFkZ2UYDCABKAlSBWJhZGdlEh8KC3JjbWRfcm'\n    'Vhc29uGA0gASgJUgpyY21kUmVhc29uEhIKBGRlc2MYDiABKAlSBGRlc2MSNAoGYXZhdGFyGA8g'\n    'ASgLMhwuYmlsaWJpbGkuYXBwLmNhcmQudjEuQXZhdGFyUgZhdmF0YXISIwoNb2ZmaWNpYWxfaW'\n    'NvbhgQIAEoBVIMb2ZmaWNpYWxJY29uEhkKCGNhbl9wbGF5GBEgASgFUgdjYW5QbGF5Ek0KEXJj'\n    'bWRfcmVhc29uX3N0eWxlGBIgASgLMiEuYmlsaWJpbGkuYXBwLmNhcmQudjEuUmVhc29uU3R5bG'\n    'VSD3JjbWRSZWFzb25TdHlsZRJSChRyY21kX3JlYXNvbl9zdHlsZV92MhgTIAEoCzIhLmJpbGli'\n    'aWxpLmFwcC5jYXJkLnYxLlJlYXNvblN0eWxlUhFyY21kUmVhc29uU3R5bGVWMhJBCgtsaWtlX2'\n    'J1dHRvbhgUIAEoCzIgLmJpbGliaWxpLmFwcC5jYXJkLnYxLkxpa2VCdXR0b25SCmxpa2VCdXR0'\n    'b24=');\n\n@$core.Deprecated('Use smallCoverV3Descriptor instead')\nconst SmallCoverV3$json = {\n  '1': 'SmallCoverV3',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {\n      '1': 'avatar',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Avatar',\n      '10': 'avatar'\n    },\n    {'1': 'cover_left_text', '3': 3, '4': 1, '5': 9, '10': 'coverLeftText'},\n    {\n      '1': 'cover_right_button',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Button',\n      '10': 'coverRightButton'\n    },\n    {'1': 'rcmd_reason', '3': 5, '4': 1, '5': 9, '10': 'rcmdReason'},\n    {'1': 'desc', '3': 6, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'official_icon', '3': 7, '4': 1, '5': 5, '10': 'officialIcon'},\n    {'1': 'can_play', '3': 8, '4': 1, '5': 5, '10': 'canPlay'},\n    {\n      '1': 'rcmd_reason_style',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'rcmdReasonStyle'\n    },\n  ],\n};\n\n/// Descriptor for `SmallCoverV3`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List smallCoverV3Descriptor = $convert.base64Decode(\n    'CgxTbWFsbENvdmVyVjMSLgoEYmFzZRgBIAEoCzIaLmJpbGliaWxpLmFwcC5jYXJkLnYxLkJhc2'\n    'VSBGJhc2USNAoGYXZhdGFyGAIgASgLMhwuYmlsaWJpbGkuYXBwLmNhcmQudjEuQXZhdGFyUgZh'\n    'dmF0YXISJgoPY292ZXJfbGVmdF90ZXh0GAMgASgJUg1jb3ZlckxlZnRUZXh0EkoKEmNvdmVyX3'\n    'JpZ2h0X2J1dHRvbhgEIAEoCzIcLmJpbGliaWxpLmFwcC5jYXJkLnYxLkJ1dHRvblIQY292ZXJS'\n    'aWdodEJ1dHRvbhIfCgtyY21kX3JlYXNvbhgFIAEoCVIKcmNtZFJlYXNvbhISCgRkZXNjGAYgAS'\n    'gJUgRkZXNjEiMKDW9mZmljaWFsX2ljb24YByABKAVSDG9mZmljaWFsSWNvbhIZCghjYW5fcGxh'\n    'eRgIIAEoBVIHY2FuUGxheRJNChFyY21kX3JlYXNvbl9zdHlsZRgJIAEoCzIhLmJpbGliaWxpLm'\n    'FwcC5jYXJkLnYxLlJlYXNvblN0eWxlUg9yY21kUmVhc29uU3R5bGU=');\n\n@$core.Deprecated('Use smallCoverV4Descriptor instead')\nconst SmallCoverV4$json = {\n  '1': 'SmallCoverV4',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {'1': 'cover_badge', '3': 2, '4': 1, '5': 9, '10': 'coverBadge'},\n    {'1': 'desc', '3': 3, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'title_right_text', '3': 4, '4': 1, '5': 9, '10': 'titleRightText'},\n    {'1': 'title_right_pic', '3': 5, '4': 1, '5': 5, '10': 'titleRightPic'},\n  ],\n};\n\n/// Descriptor for `SmallCoverV4`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List smallCoverV4Descriptor = $convert.base64Decode(\n    'CgxTbWFsbENvdmVyVjQSLgoEYmFzZRgBIAEoCzIaLmJpbGliaWxpLmFwcC5jYXJkLnYxLkJhc2'\n    'VSBGJhc2USHwoLY292ZXJfYmFkZ2UYAiABKAlSCmNvdmVyQmFkZ2USEgoEZGVzYxgDIAEoCVIE'\n    'ZGVzYxIoChB0aXRsZV9yaWdodF90ZXh0GAQgASgJUg50aXRsZVJpZ2h0VGV4dBImCg90aXRsZV'\n    '9yaWdodF9waWMYBSABKAVSDXRpdGxlUmlnaHRQaWM=');\n\n@$core.Deprecated('Use smallCoverV5Descriptor instead')\nconst SmallCoverV5$json = {\n  '1': 'SmallCoverV5',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {'1': 'cover_gif', '3': 2, '4': 1, '5': 9, '10': 'coverGif'},\n    {\n      '1': 'up',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Up',\n      '10': 'up'\n    },\n    {'1': 'cover_right_text1', '3': 4, '4': 1, '5': 9, '10': 'coverRightText1'},\n    {'1': 'right_desc1', '3': 5, '4': 1, '5': 9, '10': 'rightDesc1'},\n    {'1': 'right_desc2', '3': 6, '4': 1, '5': 9, '10': 'rightDesc2'},\n    {\n      '1': 'rcmd_reason_style',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'rcmdReasonStyle'\n    },\n    {\n      '1': 'hotword_entrance',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.HotwordEntrance',\n      '10': 'hotwordEntrance'\n    },\n    {\n      '1': 'corner_mark_style',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'cornerMarkStyle'\n    },\n    {'1': 'right_icon1', '3': 10, '4': 1, '5': 5, '10': 'rightIcon1'},\n    {'1': 'right_icon2', '3': 11, '4': 1, '5': 5, '10': 'rightIcon2'},\n    {\n      '1': 'left_corner_mark_style',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'leftCornerMarkStyle'\n    },\n    {\n      '1': 'cover_right_text_content_description',\n      '3': 13,\n      '4': 1,\n      '5': 9,\n      '10': 'coverRightTextContentDescription'\n    },\n    {\n      '1': 'right_desc1_content_description',\n      '3': 14,\n      '4': 1,\n      '5': 9,\n      '10': 'rightDesc1ContentDescription'\n    },\n  ],\n};\n\n/// Descriptor for `SmallCoverV5`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List smallCoverV5Descriptor = $convert.base64Decode(\n    'CgxTbWFsbENvdmVyVjUSLgoEYmFzZRgBIAEoCzIaLmJpbGliaWxpLmFwcC5jYXJkLnYxLkJhc2'\n    'VSBGJhc2USGwoJY292ZXJfZ2lmGAIgASgJUghjb3ZlckdpZhIoCgJ1cBgDIAEoCzIYLmJpbGli'\n    'aWxpLmFwcC5jYXJkLnYxLlVwUgJ1cBIqChFjb3Zlcl9yaWdodF90ZXh0MRgEIAEoCVIPY292ZX'\n    'JSaWdodFRleHQxEh8KC3JpZ2h0X2Rlc2MxGAUgASgJUgpyaWdodERlc2MxEh8KC3JpZ2h0X2Rl'\n    'c2MyGAYgASgJUgpyaWdodERlc2MyEk0KEXJjbWRfcmVhc29uX3N0eWxlGAcgASgLMiEuYmlsaW'\n    'JpbGkuYXBwLmNhcmQudjEuUmVhc29uU3R5bGVSD3JjbWRSZWFzb25TdHlsZRJQChBob3R3b3Jk'\n    'X2VudHJhbmNlGAggASgLMiUuYmlsaWJpbGkuYXBwLmNhcmQudjEuSG90d29yZEVudHJhbmNlUg'\n    '9ob3R3b3JkRW50cmFuY2USTQoRY29ybmVyX21hcmtfc3R5bGUYCSABKAsyIS5iaWxpYmlsaS5h'\n    'cHAuY2FyZC52MS5SZWFzb25TdHlsZVIPY29ybmVyTWFya1N0eWxlEh8KC3JpZ2h0X2ljb24xGA'\n    'ogASgFUgpyaWdodEljb24xEh8KC3JpZ2h0X2ljb24yGAsgASgFUgpyaWdodEljb24yElYKFmxl'\n    'ZnRfY29ybmVyX21hcmtfc3R5bGUYDCABKAsyIS5iaWxpYmlsaS5hcHAuY2FyZC52MS5SZWFzb2'\n    '5TdHlsZVITbGVmdENvcm5lck1hcmtTdHlsZRJOCiRjb3Zlcl9yaWdodF90ZXh0X2NvbnRlbnRf'\n    'ZGVzY3JpcHRpb24YDSABKAlSIGNvdmVyUmlnaHRUZXh0Q29udGVudERlc2NyaXB0aW9uEkUKH3'\n    'JpZ2h0X2Rlc2MxX2NvbnRlbnRfZGVzY3JpcHRpb24YDiABKAlSHHJpZ2h0RGVzYzFDb250ZW50'\n    'RGVzY3JpcHRpb24=');\n\n@$core.Deprecated('Use smallCoverV5AdDescriptor instead')\nconst SmallCoverV5Ad$json = {\n  '1': 'SmallCoverV5Ad',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {'1': 'cover_gif', '3': 2, '4': 1, '5': 9, '10': 'coverGif'},\n    {\n      '1': 'up',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Up',\n      '10': 'up'\n    },\n    {'1': 'cover_right_text1', '3': 4, '4': 1, '5': 9, '10': 'coverRightText1'},\n    {'1': 'right_desc1', '3': 5, '4': 1, '5': 9, '10': 'rightDesc1'},\n    {'1': 'right_desc2', '3': 6, '4': 1, '5': 9, '10': 'rightDesc2'},\n    {\n      '1': 'rcmd_reason_style',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'rcmdReasonStyle'\n    },\n    {\n      '1': 'hotword_entrance',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.HotwordEntrance',\n      '10': 'hotwordEntrance'\n    },\n    {\n      '1': 'corner_mark_style',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'cornerMarkStyle'\n    },\n    {'1': 'right_icon1', '3': 10, '4': 1, '5': 5, '10': 'rightIcon1'},\n    {'1': 'right_icon2', '3': 11, '4': 1, '5': 5, '10': 'rightIcon2'},\n    {\n      '1': 'left_corner_mark_style',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'leftCornerMarkStyle'\n    },\n    {\n      '1': 'cover_right_text_content_description',\n      '3': 13,\n      '4': 1,\n      '5': 9,\n      '10': 'coverRightTextContentDescription'\n    },\n    {\n      '1': 'right_desc1_content_description',\n      '3': 14,\n      '4': 1,\n      '5': 9,\n      '10': 'rightDesc1ContentDescription'\n    },\n  ],\n};\n\n/// Descriptor for `SmallCoverV5Ad`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List smallCoverV5AdDescriptor = $convert.base64Decode(\n    'Cg5TbWFsbENvdmVyVjVBZBIuCgRiYXNlGAEgASgLMhouYmlsaWJpbGkuYXBwLmNhcmQudjEuQm'\n    'FzZVIEYmFzZRIbCgljb3Zlcl9naWYYAiABKAlSCGNvdmVyR2lmEigKAnVwGAMgASgLMhguYmls'\n    'aWJpbGkuYXBwLmNhcmQudjEuVXBSAnVwEioKEWNvdmVyX3JpZ2h0X3RleHQxGAQgASgJUg9jb3'\n    'ZlclJpZ2h0VGV4dDESHwoLcmlnaHRfZGVzYzEYBSABKAlSCnJpZ2h0RGVzYzESHwoLcmlnaHRf'\n    'ZGVzYzIYBiABKAlSCnJpZ2h0RGVzYzISTQoRcmNtZF9yZWFzb25fc3R5bGUYByABKAsyIS5iaW'\n    'xpYmlsaS5hcHAuY2FyZC52MS5SZWFzb25TdHlsZVIPcmNtZFJlYXNvblN0eWxlElAKEGhvdHdv'\n    'cmRfZW50cmFuY2UYCCABKAsyJS5iaWxpYmlsaS5hcHAuY2FyZC52MS5Ib3R3b3JkRW50cmFuY2'\n    'VSD2hvdHdvcmRFbnRyYW5jZRJNChFjb3JuZXJfbWFya19zdHlsZRgJIAEoCzIhLmJpbGliaWxp'\n    'LmFwcC5jYXJkLnYxLlJlYXNvblN0eWxlUg9jb3JuZXJNYXJrU3R5bGUSHwoLcmlnaHRfaWNvbj'\n    'EYCiABKAVSCnJpZ2h0SWNvbjESHwoLcmlnaHRfaWNvbjIYCyABKAVSCnJpZ2h0SWNvbjISVgoW'\n    'bGVmdF9jb3JuZXJfbWFya19zdHlsZRgMIAEoCzIhLmJpbGliaWxpLmFwcC5jYXJkLnYxLlJlYX'\n    'NvblN0eWxlUhNsZWZ0Q29ybmVyTWFya1N0eWxlEk4KJGNvdmVyX3JpZ2h0X3RleHRfY29udGVu'\n    'dF9kZXNjcmlwdGlvbhgNIAEoCVIgY292ZXJSaWdodFRleHRDb250ZW50RGVzY3JpcHRpb24SRQ'\n    'ofcmlnaHRfZGVzYzFfY29udGVudF9kZXNjcmlwdGlvbhgOIAEoCVIccmlnaHREZXNjMUNvbnRl'\n    'bnREZXNjcmlwdGlvbg==');\n\n@$core.Deprecated('Use smallCoverV7Descriptor instead')\nconst SmallCoverV7$json = {\n  '1': 'SmallCoverV7',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {'1': 'desc', '3': 2, '4': 1, '5': 9, '10': 'desc'},\n  ],\n};\n\n/// Descriptor for `SmallCoverV7`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List smallCoverV7Descriptor = $convert.base64Decode(\n    'CgxTbWFsbENvdmVyVjcSLgoEYmFzZRgBIAEoCzIaLmJpbGliaWxpLmFwcC5jYXJkLnYxLkJhc2'\n    'VSBGJhc2USEgoEZGVzYxgCIAEoCVIEZGVzYw==');\n\n@$core.Deprecated('Use smallCoverV9Descriptor instead')\nconst SmallCoverV9$json = {\n  '1': 'SmallCoverV9',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {'1': 'cover_left_text1', '3': 2, '4': 1, '5': 9, '10': 'coverLeftText1'},\n    {'1': 'cover_left_icon1', '3': 3, '4': 1, '5': 5, '10': 'coverLeftIcon1'},\n    {'1': 'cover_left_text2', '3': 4, '4': 1, '5': 9, '10': 'coverLeftText2'},\n    {'1': 'cover_left_icon2', '3': 5, '4': 1, '5': 5, '10': 'coverLeftIcon2'},\n    {'1': 'cover_right_text', '3': 6, '4': 1, '5': 9, '10': 'coverRightText'},\n    {'1': 'cover_right_icon', '3': 7, '4': 1, '5': 5, '10': 'coverRightIcon'},\n    {'1': 'can_play', '3': 8, '4': 1, '5': 5, '10': 'canPlay'},\n    {\n      '1': 'rcmd_reason_style',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'rcmdReasonStyle'\n    },\n    {\n      '1': 'up',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Up',\n      '10': 'up'\n    },\n    {\n      '1': 'left_cover_badge_style',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'leftCoverBadgeStyle'\n    },\n    {\n      '1': 'left_bottom_rcmd_reason_style',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'leftBottomRcmdReasonStyle'\n    },\n  ],\n};\n\n/// Descriptor for `SmallCoverV9`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List smallCoverV9Descriptor = $convert.base64Decode(\n    'CgxTbWFsbENvdmVyVjkSLgoEYmFzZRgBIAEoCzIaLmJpbGliaWxpLmFwcC5jYXJkLnYxLkJhc2'\n    'VSBGJhc2USKAoQY292ZXJfbGVmdF90ZXh0MRgCIAEoCVIOY292ZXJMZWZ0VGV4dDESKAoQY292'\n    'ZXJfbGVmdF9pY29uMRgDIAEoBVIOY292ZXJMZWZ0SWNvbjESKAoQY292ZXJfbGVmdF90ZXh0Mh'\n    'gEIAEoCVIOY292ZXJMZWZ0VGV4dDISKAoQY292ZXJfbGVmdF9pY29uMhgFIAEoBVIOY292ZXJM'\n    'ZWZ0SWNvbjISKAoQY292ZXJfcmlnaHRfdGV4dBgGIAEoCVIOY292ZXJSaWdodFRleHQSKAoQY2'\n    '92ZXJfcmlnaHRfaWNvbhgHIAEoBVIOY292ZXJSaWdodEljb24SGQoIY2FuX3BsYXkYCCABKAVS'\n    'B2NhblBsYXkSTQoRcmNtZF9yZWFzb25fc3R5bGUYCSABKAsyIS5iaWxpYmlsaS5hcHAuY2FyZC'\n    '52MS5SZWFzb25TdHlsZVIPcmNtZFJlYXNvblN0eWxlEigKAnVwGAogASgLMhguYmlsaWJpbGku'\n    'YXBwLmNhcmQudjEuVXBSAnVwElYKFmxlZnRfY292ZXJfYmFkZ2Vfc3R5bGUYCyABKAsyIS5iaW'\n    'xpYmlsaS5hcHAuY2FyZC52MS5SZWFzb25TdHlsZVITbGVmdENvdmVyQmFkZ2VTdHlsZRJjCh1s'\n    'ZWZ0X2JvdHRvbV9yY21kX3JlYXNvbl9zdHlsZRgMIAEoCzIhLmJpbGliaWxpLmFwcC5jYXJkLn'\n    'YxLlJlYXNvblN0eWxlUhlsZWZ0Qm90dG9tUmNtZFJlYXNvblN0eWxl');\n\n@$core.Deprecated('Use threeItemAllV2Descriptor instead')\nconst ThreeItemAllV2$json = {\n  '1': 'ThreeItemAllV2',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {\n      '1': 'top_rcmd_reason_style',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'topRcmdReasonStyle'\n    },\n    {\n      '1': 'item',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.TwoItemHV1Item',\n      '10': 'item'\n    },\n  ],\n};\n\n/// Descriptor for `ThreeItemAllV2`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threeItemAllV2Descriptor = $convert.base64Decode(\n    'Cg5UaHJlZUl0ZW1BbGxWMhIuCgRiYXNlGAEgASgLMhouYmlsaWJpbGkuYXBwLmNhcmQudjEuQm'\n    'FzZVIEYmFzZRJUChV0b3BfcmNtZF9yZWFzb25fc3R5bGUYAiABKAsyIS5iaWxpYmlsaS5hcHAu'\n    'Y2FyZC52MS5SZWFzb25TdHlsZVISdG9wUmNtZFJlYXNvblN0eWxlEjgKBGl0ZW0YAyADKAsyJC'\n    '5iaWxpYmlsaS5hcHAuY2FyZC52MS5Ud29JdGVtSFYxSXRlbVIEaXRlbQ==');\n\n@$core.Deprecated('Use threeItemV1Descriptor instead')\nconst ThreeItemV1$json = {\n  '1': 'ThreeItemV1',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {'1': 'title_icon', '3': 2, '4': 1, '5': 5, '10': 'titleIcon'},\n    {'1': 'more_uri', '3': 3, '4': 1, '5': 9, '10': 'moreUri'},\n    {'1': 'more_text', '3': 4, '4': 1, '5': 9, '10': 'moreText'},\n    {\n      '1': 'items',\n      '3': 5,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ThreeItemV1Item',\n      '10': 'items'\n    },\n  ],\n};\n\n/// Descriptor for `ThreeItemV1`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threeItemV1Descriptor = $convert.base64Decode(\n    'CgtUaHJlZUl0ZW1WMRIuCgRiYXNlGAEgASgLMhouYmlsaWJpbGkuYXBwLmNhcmQudjEuQmFzZV'\n    'IEYmFzZRIdCgp0aXRsZV9pY29uGAIgASgFUgl0aXRsZUljb24SGQoIbW9yZV91cmkYAyABKAlS'\n    'B21vcmVVcmkSGwoJbW9yZV90ZXh0GAQgASgJUghtb3JlVGV4dBI7CgVpdGVtcxgFIAMoCzIlLm'\n    'JpbGliaWxpLmFwcC5jYXJkLnYxLlRocmVlSXRlbVYxSXRlbVIFaXRlbXM=');\n\n@$core.Deprecated('Use threeItemV1ItemDescriptor instead')\nconst ThreeItemV1Item$json = {\n  '1': 'ThreeItemV1Item',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {'1': 'cover_left_text', '3': 2, '4': 1, '5': 9, '10': 'coverLeftText'},\n    {'1': 'cover_left_icon', '3': 3, '4': 1, '5': 5, '10': 'coverLeftIcon'},\n    {'1': 'desc1', '3': 4, '4': 1, '5': 9, '10': 'desc1'},\n    {'1': 'desc2', '3': 5, '4': 1, '5': 9, '10': 'desc2'},\n    {'1': 'badge', '3': 6, '4': 1, '5': 9, '10': 'badge'},\n  ],\n};\n\n/// Descriptor for `ThreeItemV1Item`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threeItemV1ItemDescriptor = $convert.base64Decode(\n    'Cg9UaHJlZUl0ZW1WMUl0ZW0SLgoEYmFzZRgBIAEoCzIaLmJpbGliaWxpLmFwcC5jYXJkLnYxLk'\n    'Jhc2VSBGJhc2USJgoPY292ZXJfbGVmdF90ZXh0GAIgASgJUg1jb3ZlckxlZnRUZXh0EiYKD2Nv'\n    'dmVyX2xlZnRfaWNvbhgDIAEoBVINY292ZXJMZWZ0SWNvbhIUCgVkZXNjMRgEIAEoCVIFZGVzYz'\n    'ESFAoFZGVzYzIYBSABKAlSBWRlc2MyEhQKBWJhZGdlGAYgASgJUgViYWRnZQ==');\n\n@$core.Deprecated('Use threeItemV2Descriptor instead')\nconst ThreeItemV2$json = {\n  '1': 'ThreeItemV2',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {'1': 'title_icon', '3': 2, '4': 1, '5': 5, '10': 'titleIcon'},\n    {'1': 'more_uri', '3': 3, '4': 1, '5': 9, '10': 'moreUri'},\n    {'1': 'more_text', '3': 4, '4': 1, '5': 9, '10': 'moreText'},\n    {\n      '1': 'items',\n      '3': 5,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ThreeItemV2Item',\n      '10': 'items'\n    },\n  ],\n};\n\n/// Descriptor for `ThreeItemV2`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threeItemV2Descriptor = $convert.base64Decode(\n    'CgtUaHJlZUl0ZW1WMhIuCgRiYXNlGAEgASgLMhouYmlsaWJpbGkuYXBwLmNhcmQudjEuQmFzZV'\n    'IEYmFzZRIdCgp0aXRsZV9pY29uGAIgASgFUgl0aXRsZUljb24SGQoIbW9yZV91cmkYAyABKAlS'\n    'B21vcmVVcmkSGwoJbW9yZV90ZXh0GAQgASgJUghtb3JlVGV4dBI7CgVpdGVtcxgFIAMoCzIlLm'\n    'JpbGliaWxpLmFwcC5jYXJkLnYxLlRocmVlSXRlbVYySXRlbVIFaXRlbXM=');\n\n@$core.Deprecated('Use threeItemV2ItemDescriptor instead')\nconst ThreeItemV2Item$json = {\n  '1': 'ThreeItemV2Item',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {'1': 'cover_left_icon', '3': 2, '4': 1, '5': 5, '10': 'coverLeftIcon'},\n    {'1': 'desc_text1', '3': 3, '4': 1, '5': 9, '10': 'descText1'},\n    {'1': 'desc_icon1', '3': 4, '4': 1, '5': 5, '10': 'descIcon1'},\n    {'1': 'desc_text2', '3': 5, '4': 1, '5': 9, '10': 'descText2'},\n    {'1': 'desc_icon2', '3': 6, '4': 1, '5': 5, '10': 'descIcon2'},\n    {'1': 'badge', '3': 7, '4': 1, '5': 9, '10': 'badge'},\n  ],\n};\n\n/// Descriptor for `ThreeItemV2Item`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threeItemV2ItemDescriptor = $convert.base64Decode(\n    'Cg9UaHJlZUl0ZW1WMkl0ZW0SLgoEYmFzZRgBIAEoCzIaLmJpbGliaWxpLmFwcC5jYXJkLnYxLk'\n    'Jhc2VSBGJhc2USJgoPY292ZXJfbGVmdF9pY29uGAIgASgFUg1jb3ZlckxlZnRJY29uEh0KCmRl'\n    'c2NfdGV4dDEYAyABKAlSCWRlc2NUZXh0MRIdCgpkZXNjX2ljb24xGAQgASgFUglkZXNjSWNvbj'\n    'ESHQoKZGVzY190ZXh0MhgFIAEoCVIJZGVzY1RleHQyEh0KCmRlc2NfaWNvbjIYBiABKAVSCWRl'\n    'c2NJY29uMhIUCgViYWRnZRgHIAEoCVIFYmFkZ2U=');\n\n@$core.Deprecated('Use threePicV2Descriptor instead')\nconst ThreePicV2$json = {\n  '1': 'ThreePicV2',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {'1': 'left_cover', '3': 2, '4': 1, '5': 9, '10': 'leftCover'},\n    {'1': 'right_cover1', '3': 3, '4': 1, '5': 9, '10': 'rightCover1'},\n    {'1': 'right_cover2', '3': 4, '4': 1, '5': 9, '10': 'rightCover2'},\n    {'1': 'cover_left_text1', '3': 5, '4': 1, '5': 9, '10': 'coverLeftText1'},\n    {'1': 'cover_left_icon1', '3': 6, '4': 1, '5': 5, '10': 'coverLeftIcon1'},\n    {'1': 'cover_left_text2', '3': 7, '4': 1, '5': 9, '10': 'coverLeftText2'},\n    {'1': 'cover_left_icon2', '3': 8, '4': 1, '5': 5, '10': 'coverLeftIcon2'},\n    {'1': 'cover_right_text', '3': 9, '4': 1, '5': 9, '10': 'coverRightText'},\n    {'1': 'cover_right_icon', '3': 10, '4': 1, '5': 5, '10': 'coverRightIcon'},\n    {\n      '1': 'cover_right_background_color',\n      '3': 11,\n      '4': 1,\n      '5': 9,\n      '10': 'coverRightBackgroundColor'\n    },\n    {'1': 'badge', '3': 12, '4': 1, '5': 9, '10': 'badge'},\n    {'1': 'rcmd_reason', '3': 13, '4': 1, '5': 9, '10': 'rcmdReason'},\n    {'1': 'desc', '3': 14, '4': 1, '5': 9, '10': 'desc'},\n    {\n      '1': 'avatar',\n      '3': 15,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Avatar',\n      '10': 'avatar'\n    },\n    {\n      '1': 'rcmd_reason_style',\n      '3': 16,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'rcmdReasonStyle'\n    },\n  ],\n};\n\n/// Descriptor for `ThreePicV2`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threePicV2Descriptor = $convert.base64Decode(\n    'CgpUaHJlZVBpY1YyEi4KBGJhc2UYASABKAsyGi5iaWxpYmlsaS5hcHAuY2FyZC52MS5CYXNlUg'\n    'RiYXNlEh0KCmxlZnRfY292ZXIYAiABKAlSCWxlZnRDb3ZlchIhCgxyaWdodF9jb3ZlcjEYAyAB'\n    'KAlSC3JpZ2h0Q292ZXIxEiEKDHJpZ2h0X2NvdmVyMhgEIAEoCVILcmlnaHRDb3ZlcjISKAoQY2'\n    '92ZXJfbGVmdF90ZXh0MRgFIAEoCVIOY292ZXJMZWZ0VGV4dDESKAoQY292ZXJfbGVmdF9pY29u'\n    'MRgGIAEoBVIOY292ZXJMZWZ0SWNvbjESKAoQY292ZXJfbGVmdF90ZXh0MhgHIAEoCVIOY292ZX'\n    'JMZWZ0VGV4dDISKAoQY292ZXJfbGVmdF9pY29uMhgIIAEoBVIOY292ZXJMZWZ0SWNvbjISKAoQ'\n    'Y292ZXJfcmlnaHRfdGV4dBgJIAEoCVIOY292ZXJSaWdodFRleHQSKAoQY292ZXJfcmlnaHRfaW'\n    'NvbhgKIAEoBVIOY292ZXJSaWdodEljb24SPwocY292ZXJfcmlnaHRfYmFja2dyb3VuZF9jb2xv'\n    'chgLIAEoCVIZY292ZXJSaWdodEJhY2tncm91bmRDb2xvchIUCgViYWRnZRgMIAEoCVIFYmFkZ2'\n    'USHwoLcmNtZF9yZWFzb24YDSABKAlSCnJjbWRSZWFzb24SEgoEZGVzYxgOIAEoCVIEZGVzYxI0'\n    'CgZhdmF0YXIYDyABKAsyHC5iaWxpYmlsaS5hcHAuY2FyZC52MS5BdmF0YXJSBmF2YXRhchJNCh'\n    'FyY21kX3JlYXNvbl9zdHlsZRgQIAEoCzIhLmJpbGliaWxpLmFwcC5jYXJkLnYxLlJlYXNvblN0'\n    'eWxlUg9yY21kUmVhc29uU3R5bGU=');\n\n@$core.Deprecated('Use threePicV3Descriptor instead')\nconst ThreePicV3$json = {\n  '1': 'ThreePicV3',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {'1': 'left_cover', '3': 2, '4': 1, '5': 9, '10': 'leftCover'},\n    {'1': 'right_cover1', '3': 3, '4': 1, '5': 9, '10': 'rightCover1'},\n    {'1': 'right_cover2', '3': 4, '4': 1, '5': 9, '10': 'rightCover2'},\n    {'1': 'cover_left_text1', '3': 5, '4': 1, '5': 9, '10': 'coverLeftText1'},\n    {'1': 'cover_left_icon1', '3': 6, '4': 1, '5': 5, '10': 'coverLeftIcon1'},\n    {'1': 'cover_left_text2', '3': 7, '4': 1, '5': 9, '10': 'coverLeftText2'},\n    {'1': 'cover_left_icon2', '3': 8, '4': 1, '5': 5, '10': 'coverLeftIcon2'},\n    {'1': 'cover_right_text', '3': 9, '4': 1, '5': 9, '10': 'coverRightText'},\n    {'1': 'cover_right_icon', '3': 10, '4': 1, '5': 5, '10': 'coverRightIcon'},\n    {\n      '1': 'cover_right_background_color',\n      '3': 11,\n      '4': 1,\n      '5': 9,\n      '10': 'coverRightBackgroundColor'\n    },\n    {'1': 'badge', '3': 12, '4': 1, '5': 9, '10': 'badge'},\n    {\n      '1': 'rcmd_reason_style',\n      '3': 13,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.ReasonStyle',\n      '10': 'rcmdReasonStyle'\n    },\n  ],\n};\n\n/// Descriptor for `ThreePicV3`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threePicV3Descriptor = $convert.base64Decode(\n    'CgpUaHJlZVBpY1YzEi4KBGJhc2UYASABKAsyGi5iaWxpYmlsaS5hcHAuY2FyZC52MS5CYXNlUg'\n    'RiYXNlEh0KCmxlZnRfY292ZXIYAiABKAlSCWxlZnRDb3ZlchIhCgxyaWdodF9jb3ZlcjEYAyAB'\n    'KAlSC3JpZ2h0Q292ZXIxEiEKDHJpZ2h0X2NvdmVyMhgEIAEoCVILcmlnaHRDb3ZlcjISKAoQY2'\n    '92ZXJfbGVmdF90ZXh0MRgFIAEoCVIOY292ZXJMZWZ0VGV4dDESKAoQY292ZXJfbGVmdF9pY29u'\n    'MRgGIAEoBVIOY292ZXJMZWZ0SWNvbjESKAoQY292ZXJfbGVmdF90ZXh0MhgHIAEoCVIOY292ZX'\n    'JMZWZ0VGV4dDISKAoQY292ZXJfbGVmdF9pY29uMhgIIAEoBVIOY292ZXJMZWZ0SWNvbjISKAoQ'\n    'Y292ZXJfcmlnaHRfdGV4dBgJIAEoCVIOY292ZXJSaWdodFRleHQSKAoQY292ZXJfcmlnaHRfaW'\n    'NvbhgKIAEoBVIOY292ZXJSaWdodEljb24SPwocY292ZXJfcmlnaHRfYmFja2dyb3VuZF9jb2xv'\n    'chgLIAEoCVIZY292ZXJSaWdodEJhY2tncm91bmRDb2xvchIUCgViYWRnZRgMIAEoCVIFYmFkZ2'\n    'USTQoRcmNtZF9yZWFzb25fc3R5bGUYDSABKAsyIS5iaWxpYmlsaS5hcHAuY2FyZC52MS5SZWFz'\n    'b25TdHlsZVIPcmNtZFJlYXNvblN0eWxl');\n\n@$core.Deprecated('Use threePointDescriptor instead')\nconst ThreePoint$json = {\n  '1': 'ThreePoint',\n  '2': [\n    {\n      '1': 'dislike_reasons',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.DislikeReason',\n      '10': 'dislikeReasons'\n    },\n    {\n      '1': 'feedbacks',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.DislikeReason',\n      '10': 'feedbacks'\n    },\n    {'1': 'watch_later', '3': 3, '4': 1, '5': 5, '10': 'watchLater'},\n  ],\n};\n\n/// Descriptor for `ThreePoint`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threePointDescriptor = $convert.base64Decode(\n    'CgpUaHJlZVBvaW50EkwKD2Rpc2xpa2VfcmVhc29ucxgBIAMoCzIjLmJpbGliaWxpLmFwcC5jYX'\n    'JkLnYxLkRpc2xpa2VSZWFzb25SDmRpc2xpa2VSZWFzb25zEkEKCWZlZWRiYWNrcxgCIAMoCzIj'\n    'LmJpbGliaWxpLmFwcC5jYXJkLnYxLkRpc2xpa2VSZWFzb25SCWZlZWRiYWNrcxIfCgt3YXRjaF'\n    '9sYXRlchgDIAEoBVIKd2F0Y2hMYXRlcg==');\n\n@$core.Deprecated('Use threePointV2Descriptor instead')\nconst ThreePointV2$json = {\n  '1': 'ThreePointV2',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'subtitle', '3': 2, '4': 1, '5': 9, '10': 'subtitle'},\n    {\n      '1': 'reasons',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.DislikeReason',\n      '10': 'reasons'\n    },\n    {'1': 'type', '3': 4, '4': 1, '5': 9, '10': 'type'},\n    {'1': 'id', '3': 5, '4': 1, '5': 3, '10': 'id'},\n  ],\n};\n\n/// Descriptor for `ThreePointV2`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threePointV2Descriptor = $convert.base64Decode(\n    'CgxUaHJlZVBvaW50VjISFAoFdGl0bGUYASABKAlSBXRpdGxlEhoKCHN1YnRpdGxlGAIgASgJUg'\n    'hzdWJ0aXRsZRI9CgdyZWFzb25zGAMgAygLMiMuYmlsaWJpbGkuYXBwLmNhcmQudjEuRGlzbGlr'\n    'ZVJlYXNvblIHcmVhc29ucxISCgR0eXBlGAQgASgJUgR0eXBlEg4KAmlkGAUgASgDUgJpZA==');\n\n@$core.Deprecated('Use threePointV3Descriptor instead')\nconst ThreePointV3$json = {\n  '1': 'ThreePointV3',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'selected_title', '3': 2, '4': 1, '5': 9, '10': 'selectedTitle'},\n    {'1': 'subtitle', '3': 3, '4': 1, '5': 9, '10': 'subtitle'},\n    {\n      '1': 'reasons',\n      '3': 4,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.DislikeReason',\n      '10': 'reasons'\n    },\n    {'1': 'type', '3': 5, '4': 1, '5': 9, '10': 'type'},\n    {'1': 'id', '3': 6, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'selected', '3': 7, '4': 1, '5': 5, '10': 'selected'},\n    {'1': 'icon', '3': 8, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'selected_icon', '3': 9, '4': 1, '5': 9, '10': 'selectedIcon'},\n    {'1': 'url', '3': 10, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'default_id', '3': 11, '4': 1, '5': 5, '10': 'defaultId'},\n  ],\n};\n\n/// Descriptor for `ThreePointV3`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threePointV3Descriptor = $convert.base64Decode(\n    'CgxUaHJlZVBvaW50VjMSFAoFdGl0bGUYASABKAlSBXRpdGxlEiUKDnNlbGVjdGVkX3RpdGxlGA'\n    'IgASgJUg1zZWxlY3RlZFRpdGxlEhoKCHN1YnRpdGxlGAMgASgJUghzdWJ0aXRsZRI9CgdyZWFz'\n    'b25zGAQgAygLMiMuYmlsaWJpbGkuYXBwLmNhcmQudjEuRGlzbGlrZVJlYXNvblIHcmVhc29ucx'\n    'ISCgR0eXBlGAUgASgJUgR0eXBlEg4KAmlkGAYgASgDUgJpZBIaCghzZWxlY3RlZBgHIAEoBVII'\n    'c2VsZWN0ZWQSEgoEaWNvbhgIIAEoCVIEaWNvbhIjCg1zZWxlY3RlZF9pY29uGAkgASgJUgxzZW'\n    'xlY3RlZEljb24SEAoDdXJsGAogASgJUgN1cmwSHQoKZGVmYXVsdF9pZBgLIAEoBVIJZGVmYXVs'\n    'dElk');\n\n@$core.Deprecated('Use threePointV4Descriptor instead')\nconst ThreePointV4$json = {\n  '1': 'ThreePointV4',\n  '2': [\n    {\n      '1': 'share_plane',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.SharePlane',\n      '10': 'sharePlane'\n    },\n    {\n      '1': 'watch_later',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.WatchLater',\n      '10': 'watchLater'\n    },\n  ],\n};\n\n/// Descriptor for `ThreePointV4`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threePointV4Descriptor = $convert.base64Decode(\n    'CgxUaHJlZVBvaW50VjQSQQoLc2hhcmVfcGxhbmUYASABKAsyIC5iaWxpYmlsaS5hcHAuY2FyZC'\n    '52MS5TaGFyZVBsYW5lUgpzaGFyZVBsYW5lEkEKC3dhdGNoX2xhdGVyGAIgASgLMiAuYmlsaWJp'\n    'bGkuYXBwLmNhcmQudjEuV2F0Y2hMYXRlclIKd2F0Y2hMYXRlcg==');\n\n@$core.Deprecated('Use topicButtonDescriptor instead')\nconst TopicButton$json = {\n  '1': 'TopicButton',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'jump_uri', '3': 2, '4': 1, '5': 9, '10': 'jumpUri'},\n    {'1': 'red_dot', '3': 3, '4': 1, '5': 8, '10': 'redDot'},\n  ],\n};\n\n/// Descriptor for `TopicButton`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List topicButtonDescriptor = $convert.base64Decode(\n    'CgtUb3BpY0J1dHRvbhIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSGQoIanVtcF91cmkYAiABKAlSB2'\n    'p1bXBVcmkSFwoHcmVkX2RvdBgDIAEoCFIGcmVkRG90');\n\n@$core.Deprecated('Use topicListDescriptor instead')\nconst TopicList$json = {\n  '1': 'TopicList',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'title_icon', '3': 3, '4': 1, '5': 9, '10': 'titleIcon'},\n    {\n      '1': 'more_button',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.TopicButton',\n      '10': 'moreButton'\n    },\n    {\n      '1': 'topic_list_item',\n      '3': 5,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.TopicListItem',\n      '10': 'topicListItem'\n    },\n  ],\n};\n\n/// Descriptor for `TopicList`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List topicListDescriptor = $convert.base64Decode(\n    'CglUb3BpY0xpc3QSLgoEYmFzZRgBIAEoCzIaLmJpbGliaWxpLmFwcC5jYXJkLnYxLkJhc2VSBG'\n    'Jhc2USFAoFdGl0bGUYAiABKAlSBXRpdGxlEh0KCnRpdGxlX2ljb24YAyABKAlSCXRpdGxlSWNv'\n    'bhJCCgttb3JlX2J1dHRvbhgEIAEoCzIhLmJpbGliaWxpLmFwcC5jYXJkLnYxLlRvcGljQnV0dG'\n    '9uUgptb3JlQnV0dG9uEksKD3RvcGljX2xpc3RfaXRlbRgFIAMoCzIjLmJpbGliaWxpLmFwcC5j'\n    'YXJkLnYxLlRvcGljTGlzdEl0ZW1SDXRvcGljTGlzdEl0ZW0=');\n\n@$core.Deprecated('Use topicListItemDescriptor instead')\nconst TopicListItem$json = {\n  '1': 'TopicListItem',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'icon_title', '3': 2, '4': 1, '5': 9, '10': 'iconTitle'},\n    {'1': 'topic_id', '3': 3, '4': 1, '5': 3, '10': 'topicId'},\n    {'1': 'topic_name', '3': 4, '4': 1, '5': 9, '10': 'topicName'},\n    {'1': 'url', '3': 5, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'up_mid', '3': 6, '4': 1, '5': 3, '10': 'upMid'},\n    {'1': 'position', '3': 7, '4': 1, '5': 3, '10': 'position'},\n  ],\n};\n\n/// Descriptor for `TopicListItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List topicListItemDescriptor = $convert.base64Decode(\n    'Cg1Ub3BpY0xpc3RJdGVtEhIKBGljb24YASABKAlSBGljb24SHQoKaWNvbl90aXRsZRgCIAEoCV'\n    'IJaWNvblRpdGxlEhkKCHRvcGljX2lkGAMgASgDUgd0b3BpY0lkEh0KCnRvcGljX25hbWUYBCAB'\n    'KAlSCXRvcGljTmFtZRIQCgN1cmwYBSABKAlSA3VybBIVCgZ1cF9taWQYBiABKANSBXVwTWlkEh'\n    'oKCHBvc2l0aW9uGAcgASgDUghwb3NpdGlvbg==');\n\n@$core.Deprecated('Use twoItemHV1ItemDescriptor instead')\nconst TwoItemHV1Item$json = {\n  '1': 'TwoItemHV1Item',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 2, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'param', '3': 4, '4': 1, '5': 9, '10': 'param'},\n    {\n      '1': 'args',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Args',\n      '10': 'args'\n    },\n    {'1': 'goto', '3': 6, '4': 1, '5': 9, '10': 'goto'},\n    {'1': 'cover_left_text1', '3': 7, '4': 1, '5': 9, '10': 'coverLeftText1'},\n    {'1': 'cover_left_icon1', '3': 8, '4': 1, '5': 5, '10': 'coverLeftIcon1'},\n    {'1': 'cover_right_text', '3': 9, '4': 1, '5': 9, '10': 'coverRightText'},\n  ],\n};\n\n/// Descriptor for `TwoItemHV1Item`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List twoItemHV1ItemDescriptor = $convert.base64Decode(\n    'Cg5Ud29JdGVtSFYxSXRlbRIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSFAoFY292ZXIYAiABKAlSBW'\n    'NvdmVyEhAKA3VyaRgDIAEoCVIDdXJpEhQKBXBhcmFtGAQgASgJUgVwYXJhbRIuCgRhcmdzGAUg'\n    'ASgLMhouYmlsaWJpbGkuYXBwLmNhcmQudjEuQXJnc1IEYXJncxISCgRnb3RvGAYgASgJUgRnb3'\n    'RvEigKEGNvdmVyX2xlZnRfdGV4dDEYByABKAlSDmNvdmVyTGVmdFRleHQxEigKEGNvdmVyX2xl'\n    'ZnRfaWNvbjEYCCABKAVSDmNvdmVyTGVmdEljb24xEigKEGNvdmVyX3JpZ2h0X3RleHQYCSABKA'\n    'lSDmNvdmVyUmlnaHRUZXh0');\n\n@$core.Deprecated('Use twoItemV2Descriptor instead')\nconst TwoItemV2$json = {\n  '1': 'TwoItemV2',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {\n      '1': 'items',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.TwoItemV2Item',\n      '10': 'items'\n    },\n  ],\n};\n\n/// Descriptor for `TwoItemV2`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List twoItemV2Descriptor = $convert.base64Decode(\n    'CglUd29JdGVtVjISLgoEYmFzZRgBIAEoCzIaLmJpbGliaWxpLmFwcC5jYXJkLnYxLkJhc2VSBG'\n    'Jhc2USOQoFaXRlbXMYAiADKAsyIy5iaWxpYmlsaS5hcHAuY2FyZC52MS5Ud29JdGVtVjJJdGVt'\n    'UgVpdGVtcw==');\n\n@$core.Deprecated('Use twoItemV2ItemDescriptor instead')\nconst TwoItemV2Item$json = {\n  '1': 'TwoItemV2Item',\n  '2': [\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Base',\n      '10': 'base'\n    },\n    {'1': 'badge', '3': 2, '4': 1, '5': 9, '10': 'badge'},\n    {'1': 'cover_left_text1', '3': 3, '4': 1, '5': 9, '10': 'coverLeftText1'},\n    {'1': 'cover_left_icon1', '3': 4, '4': 1, '5': 5, '10': 'coverLeftIcon1'},\n  ],\n};\n\n/// Descriptor for `TwoItemV2Item`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List twoItemV2ItemDescriptor = $convert.base64Decode(\n    'Cg1Ud29JdGVtVjJJdGVtEi4KBGJhc2UYASABKAsyGi5iaWxpYmlsaS5hcHAuY2FyZC52MS5CYX'\n    'NlUgRiYXNlEhQKBWJhZGdlGAIgASgJUgViYWRnZRIoChBjb3Zlcl9sZWZ0X3RleHQxGAMgASgJ'\n    'Ug5jb3ZlckxlZnRUZXh0MRIoChBjb3Zlcl9sZWZ0X2ljb24xGAQgASgFUg5jb3ZlckxlZnRJY2'\n    '9uMQ==');\n\n@$core.Deprecated('Use upDescriptor instead')\nconst Up$json = {\n  '1': 'Up',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'desc', '3': 3, '4': 1, '5': 9, '10': 'desc'},\n    {\n      '1': 'avatar',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Avatar',\n      '10': 'avatar'\n    },\n    {'1': 'official_icon', '3': 5, '4': 1, '5': 5, '10': 'officialIcon'},\n    {\n      '1': 'desc_button',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.Button',\n      '10': 'descButton'\n    },\n    {'1': 'cooperation', '3': 7, '4': 1, '5': 9, '10': 'cooperation'},\n  ],\n};\n\n/// Descriptor for `Up`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List upDescriptor = $convert.base64Decode(\n    'CgJVcBIOCgJpZBgBIAEoA1ICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRISCgRkZXNjGAMgASgJUg'\n    'RkZXNjEjQKBmF2YXRhchgEIAEoCzIcLmJpbGliaWxpLmFwcC5jYXJkLnYxLkF2YXRhclIGYXZh'\n    'dGFyEiMKDW9mZmljaWFsX2ljb24YBSABKAVSDG9mZmljaWFsSWNvbhI9CgtkZXNjX2J1dHRvbh'\n    'gGIAEoCzIcLmJpbGliaWxpLmFwcC5jYXJkLnYxLkJ1dHRvblIKZGVzY0J1dHRvbhIgCgtjb29w'\n    'ZXJhdGlvbhgHIAEoCVILY29vcGVyYXRpb24=');\n\n@$core.Deprecated('Use upArgsDescriptor instead')\nconst UpArgs$json = {\n  '1': 'UpArgs',\n  '2': [\n    {'1': 'up_id', '3': 1, '4': 1, '5': 3, '10': 'upId'},\n    {'1': 'up_name', '3': 2, '4': 1, '5': 9, '10': 'upName'},\n    {'1': 'up_face', '3': 3, '4': 1, '5': 9, '10': 'upFace'},\n    {'1': 'selected', '3': 4, '4': 1, '5': 3, '10': 'selected'},\n  ],\n};\n\n/// Descriptor for `UpArgs`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List upArgsDescriptor = $convert.base64Decode(\n    'CgZVcEFyZ3MSEwoFdXBfaWQYASABKANSBHVwSWQSFwoHdXBfbmFtZRgCIAEoCVIGdXBOYW1lEh'\n    'cKB3VwX2ZhY2UYAyABKAlSBnVwRmFjZRIaCghzZWxlY3RlZBgEIAEoA1IIc2VsZWN0ZWQ=');\n\n@$core.Deprecated('Use watchLaterDescriptor instead')\nconst WatchLater$json = {\n  '1': 'WatchLater',\n  '2': [\n    {'1': 'aid', '3': 1, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'bvid', '3': 2, '4': 1, '5': 9, '10': 'bvid'},\n  ],\n};\n\n/// Descriptor for `WatchLater`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List watchLaterDescriptor = $convert.base64Decode(\n    'CgpXYXRjaExhdGVyEhAKA2FpZBgBIAEoA1IDYWlkEhIKBGJ2aWQYAiABKAlSBGJ2aWQ=');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/dynamic/common.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/dynamic/common.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nimport 'common.pbenum.dart';\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nexport 'common.pbenum.dart';\n\nclass ItemWHRatio extends $pb.GeneratedMessage {\n  factory ItemWHRatio({\n    WHRatio? ratio,\n    $core.int? width,\n    $core.int? height,\n  }) {\n    final result = create();\n    if (ratio != null) result.ratio = ratio;\n    if (width != null) result.width = width;\n    if (height != null) result.height = height;\n    return result;\n  }\n\n  ItemWHRatio._();\n\n  factory ItemWHRatio.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ItemWHRatio.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ItemWHRatio',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.common'),\n      createEmptyInstance: create)\n    ..aE<WHRatio>(1, _omitFieldNames ? '' : 'ratio', enumValues: WHRatio.values)\n    ..aI(2, _omitFieldNames ? '' : 'width')\n    ..aI(3, _omitFieldNames ? '' : 'height')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ItemWHRatio clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ItemWHRatio copyWith(void Function(ItemWHRatio) updates) =>\n      super.copyWith((message) => updates(message as ItemWHRatio))\n          as ItemWHRatio;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ItemWHRatio create() => ItemWHRatio._();\n  @$core.override\n  ItemWHRatio createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ItemWHRatio getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ItemWHRatio>(create);\n  static ItemWHRatio? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  WHRatio get ratio => $_getN(0);\n  @$pb.TagNumber(1)\n  set ratio(WHRatio value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasRatio() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRatio() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get width => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set width($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasWidth() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearWidth() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get height => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set height($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasHeight() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearHeight() => $_clearField(3);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/dynamic/common.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/dynamic/common.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nclass WHRatio extends $pb.ProtobufEnum {\n  static const WHRatio W_H_RATIO_1_1 =\n      WHRatio._(0, _omitEnumNames ? '' : 'W_H_RATIO_1_1');\n  static const WHRatio W_H_RATIO_16_9 =\n      WHRatio._(1, _omitEnumNames ? '' : 'W_H_RATIO_16_9');\n  static const WHRatio W_H_RATIO_3_4 =\n      WHRatio._(2, _omitEnumNames ? '' : 'W_H_RATIO_3_4');\n  static const WHRatio W_H_RATIO_CUSTOM =\n      WHRatio._(3, _omitEnumNames ? '' : 'W_H_RATIO_CUSTOM');\n\n  static const $core.List<WHRatio> values = <WHRatio>[\n    W_H_RATIO_1_1,\n    W_H_RATIO_16_9,\n    W_H_RATIO_3_4,\n    W_H_RATIO_CUSTOM,\n  ];\n\n  static final $core.List<WHRatio?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static WHRatio? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const WHRatio._(super.value, super.name);\n}\n\nconst $core.bool _omitEnumNames =\n    $core.bool.fromEnvironment('protobuf.omit_enum_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/dynamic/common.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/dynamic/common.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use wHRatioDescriptor instead')\nconst WHRatio$json = {\n  '1': 'WHRatio',\n  '2': [\n    {'1': 'W_H_RATIO_1_1', '2': 0},\n    {'1': 'W_H_RATIO_16_9', '2': 1},\n    {'1': 'W_H_RATIO_3_4', '2': 2},\n    {'1': 'W_H_RATIO_CUSTOM', '2': 3},\n  ],\n};\n\n/// Descriptor for `WHRatio`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List wHRatioDescriptor = $convert.base64Decode(\n    'CgdXSFJhdGlvEhEKDVdfSF9SQVRJT18xXzEQABISCg5XX0hfUkFUSU9fMTZfORABEhEKDVdfSF'\n    '9SQVRJT18zXzQQAhIUChBXX0hfUkFUSU9fQ1VTVE9NEAM=');\n\n@$core.Deprecated('Use itemWHRatioDescriptor instead')\nconst ItemWHRatio$json = {\n  '1': 'ItemWHRatio',\n  '2': [\n    {\n      '1': 'ratio',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.common.WHRatio',\n      '10': 'ratio'\n    },\n    {'1': 'width', '3': 2, '4': 1, '5': 5, '10': 'width'},\n    {'1': 'height', '3': 3, '4': 1, '5': 5, '10': 'height'},\n  ],\n};\n\n/// Descriptor for `ItemWHRatio`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List itemWHRatioDescriptor = $convert.base64Decode(\n    'CgtJdGVtV0hSYXRpbxI6CgVyYXRpbxgBIAEoDjIkLmJpbGliaWxpLmFwcC5keW5hbWljLmNvbW'\n    '1vbi5XSFJhdGlvUgVyYXRpbxIUCgV3aWR0aBgCIAEoBVIFd2lkdGgSFgoGaGVpZ2h0GAMgASgF'\n    'UgZoZWlnaHQ=');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/dynamic/v1.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/dynamic/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:fixnum/fixnum.dart' as $fixnum;\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nimport '../archive/middleware/v1.pb.dart' as $1;\nimport 'v1.pbenum.dart';\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nexport 'v1.pbenum.dart';\n\nclass AdInfo extends $pb.GeneratedMessage {\n  factory AdInfo({\n    $core.String? nationCode,\n    $core.String? adcode,\n    $core.String? cityCode,\n    $core.String? name,\n    Gps? gps,\n  }) {\n    final result = create();\n    if (nationCode != null) result.nationCode = nationCode;\n    if (adcode != null) result.adcode = adcode;\n    if (cityCode != null) result.cityCode = cityCode;\n    if (name != null) result.name = name;\n    if (gps != null) result.gps = gps;\n    return result;\n  }\n\n  AdInfo._();\n\n  factory AdInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AdInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AdInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'nationCode')\n    ..aOS(2, _omitFieldNames ? '' : 'adcode')\n    ..aOS(3, _omitFieldNames ? '' : 'cityCode')\n    ..aOS(4, _omitFieldNames ? '' : 'name')\n    ..aOM<Gps>(5, _omitFieldNames ? '' : 'gps', subBuilder: Gps.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdInfo copyWith(void Function(AdInfo) updates) =>\n      super.copyWith((message) => updates(message as AdInfo)) as AdInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AdInfo create() => AdInfo._();\n  @$core.override\n  AdInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AdInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<AdInfo>(create);\n  static AdInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get nationCode => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set nationCode($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasNationCode() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearNationCode() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get adcode => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set adcode($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAdcode() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAdcode() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get cityCode => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set cityCode($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCityCode() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCityCode() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get name => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set name($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasName() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearName() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  Gps get gps => $_getN(4);\n  @$pb.TagNumber(5)\n  set gps(Gps value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasGps() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearGps() => $_clearField(5);\n  @$pb.TagNumber(5)\n  Gps ensureGps() => $_ensure(4);\n}\n\nclass AddressComponent extends $pb.GeneratedMessage {\n  factory AddressComponent({\n    $core.String? nation,\n    $core.String? province,\n    $core.String? city,\n    $core.String? district,\n    $core.String? street,\n    $core.String? streetNumber,\n  }) {\n    final result = create();\n    if (nation != null) result.nation = nation;\n    if (province != null) result.province = province;\n    if (city != null) result.city = city;\n    if (district != null) result.district = district;\n    if (street != null) result.street = street;\n    if (streetNumber != null) result.streetNumber = streetNumber;\n    return result;\n  }\n\n  AddressComponent._();\n\n  factory AddressComponent.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AddressComponent.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AddressComponent',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'nation')\n    ..aOS(2, _omitFieldNames ? '' : 'province')\n    ..aOS(3, _omitFieldNames ? '' : 'city')\n    ..aOS(4, _omitFieldNames ? '' : 'district')\n    ..aOS(5, _omitFieldNames ? '' : 'street')\n    ..aOS(6, _omitFieldNames ? '' : 'streetNumber')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AddressComponent clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AddressComponent copyWith(void Function(AddressComponent) updates) =>\n      super.copyWith((message) => updates(message as AddressComponent))\n          as AddressComponent;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AddressComponent create() => AddressComponent._();\n  @$core.override\n  AddressComponent createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AddressComponent getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AddressComponent>(create);\n  static AddressComponent? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get nation => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set nation($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasNation() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearNation() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get province => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set province($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasProvince() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearProvince() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get city => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set city($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCity() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCity() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get district => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set district($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDistrict() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDistrict() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get street => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set street($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasStreet() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearStreet() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get streetNumber => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set streetNumber($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasStreetNumber() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearStreetNumber() => $_clearField(6);\n}\n\nclass BubbleInfo extends $pb.GeneratedMessage {\n  factory BubbleInfo({\n    $core.Iterable<BubbleModule>? modules,\n    $core.String? trackId,\n    $core.String? bubbleRecallExtraWhenShow,\n  }) {\n    final result = create();\n    if (modules != null) result.modules.addAll(modules);\n    if (trackId != null) result.trackId = trackId;\n    if (bubbleRecallExtraWhenShow != null)\n      result.bubbleRecallExtraWhenShow = bubbleRecallExtraWhenShow;\n    return result;\n  }\n\n  BubbleInfo._();\n\n  factory BubbleInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BubbleInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BubbleInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..pPM<BubbleModule>(1, _omitFieldNames ? '' : 'modules',\n        subBuilder: BubbleModule.create)\n    ..aOS(2, _omitFieldNames ? '' : 'trackId')\n    ..aOS(3, _omitFieldNames ? '' : 'bubbleRecallExtraWhenShow')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BubbleInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BubbleInfo copyWith(void Function(BubbleInfo) updates) =>\n      super.copyWith((message) => updates(message as BubbleInfo)) as BubbleInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BubbleInfo create() => BubbleInfo._();\n  @$core.override\n  BubbleInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BubbleInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<BubbleInfo>(create);\n  static BubbleInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<BubbleModule> get modules => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.String get trackId => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set trackId($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTrackId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTrackId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get bubbleRecallExtraWhenShow => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set bubbleRecallExtraWhenShow($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBubbleRecallExtraWhenShow() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBubbleRecallExtraWhenShow() => $_clearField(3);\n}\n\nenum BubbleModule_Module { user, text, coloredTip, pic, notSet }\n\nclass BubbleModule extends $pb.GeneratedMessage {\n  factory BubbleModule({\n    BubbleModuleType? moduleType,\n    BubbleModuleUser? user,\n    BubbleModuleText? text,\n    BubbleModuleColoredTip? coloredTip,\n    BubbleModulePic? pic,\n  }) {\n    final result = create();\n    if (moduleType != null) result.moduleType = moduleType;\n    if (user != null) result.user = user;\n    if (text != null) result.text = text;\n    if (coloredTip != null) result.coloredTip = coloredTip;\n    if (pic != null) result.pic = pic;\n    return result;\n  }\n\n  BubbleModule._();\n\n  factory BubbleModule.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BubbleModule.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, BubbleModule_Module>\n      _BubbleModule_ModuleByTag = {\n    2: BubbleModule_Module.user,\n    3: BubbleModule_Module.text,\n    4: BubbleModule_Module.coloredTip,\n    5: BubbleModule_Module.pic,\n    0: BubbleModule_Module.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BubbleModule',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [2, 3, 4, 5])\n    ..aE<BubbleModuleType>(1, _omitFieldNames ? '' : 'moduleType',\n        enumValues: BubbleModuleType.values)\n    ..aOM<BubbleModuleUser>(2, _omitFieldNames ? '' : 'user',\n        subBuilder: BubbleModuleUser.create)\n    ..aOM<BubbleModuleText>(3, _omitFieldNames ? '' : 'text',\n        subBuilder: BubbleModuleText.create)\n    ..aOM<BubbleModuleColoredTip>(4, _omitFieldNames ? '' : 'coloredTip',\n        subBuilder: BubbleModuleColoredTip.create)\n    ..aOM<BubbleModulePic>(5, _omitFieldNames ? '' : 'pic',\n        subBuilder: BubbleModulePic.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BubbleModule clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BubbleModule copyWith(void Function(BubbleModule) updates) =>\n      super.copyWith((message) => updates(message as BubbleModule))\n          as BubbleModule;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BubbleModule create() => BubbleModule._();\n  @$core.override\n  BubbleModule createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BubbleModule getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<BubbleModule>(create);\n  static BubbleModule? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  BubbleModule_Module whichModule() =>\n      _BubbleModule_ModuleByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  void clearModule() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  BubbleModuleType get moduleType => $_getN(0);\n  @$pb.TagNumber(1)\n  set moduleType(BubbleModuleType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasModuleType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearModuleType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  BubbleModuleUser get user => $_getN(1);\n  @$pb.TagNumber(2)\n  set user(BubbleModuleUser value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUser() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUser() => $_clearField(2);\n  @$pb.TagNumber(2)\n  BubbleModuleUser ensureUser() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  BubbleModuleText get text => $_getN(2);\n  @$pb.TagNumber(3)\n  set text(BubbleModuleText value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasText() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearText() => $_clearField(3);\n  @$pb.TagNumber(3)\n  BubbleModuleText ensureText() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  BubbleModuleColoredTip get coloredTip => $_getN(3);\n  @$pb.TagNumber(4)\n  set coloredTip(BubbleModuleColoredTip value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasColoredTip() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearColoredTip() => $_clearField(4);\n  @$pb.TagNumber(4)\n  BubbleModuleColoredTip ensureColoredTip() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  BubbleModulePic get pic => $_getN(4);\n  @$pb.TagNumber(5)\n  set pic(BubbleModulePic value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPic() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPic() => $_clearField(5);\n  @$pb.TagNumber(5)\n  BubbleModulePic ensurePic() => $_ensure(4);\n}\n\nclass BubbleModuleColoredTip extends $pb.GeneratedMessage {\n  factory BubbleModuleColoredTip({\n    $core.String? prefixIcon,\n    $core.bool? isSvgaPrefixIcon,\n    $core.String? text,\n    Color? textColor,\n  }) {\n    final result = create();\n    if (prefixIcon != null) result.prefixIcon = prefixIcon;\n    if (isSvgaPrefixIcon != null) result.isSvgaPrefixIcon = isSvgaPrefixIcon;\n    if (text != null) result.text = text;\n    if (textColor != null) result.textColor = textColor;\n    return result;\n  }\n\n  BubbleModuleColoredTip._();\n\n  factory BubbleModuleColoredTip.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BubbleModuleColoredTip.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BubbleModuleColoredTip',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'prefixIcon')\n    ..aOB(2, _omitFieldNames ? '' : 'isSvgaPrefixIcon')\n    ..aOS(3, _omitFieldNames ? '' : 'text')\n    ..aOM<Color>(4, _omitFieldNames ? '' : 'textColor',\n        subBuilder: Color.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BubbleModuleColoredTip clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BubbleModuleColoredTip copyWith(\n          void Function(BubbleModuleColoredTip) updates) =>\n      super.copyWith((message) => updates(message as BubbleModuleColoredTip))\n          as BubbleModuleColoredTip;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BubbleModuleColoredTip create() => BubbleModuleColoredTip._();\n  @$core.override\n  BubbleModuleColoredTip createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BubbleModuleColoredTip getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<BubbleModuleColoredTip>(create);\n  static BubbleModuleColoredTip? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get prefixIcon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set prefixIcon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPrefixIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPrefixIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get isSvgaPrefixIcon => $_getBF(1);\n  @$pb.TagNumber(2)\n  set isSvgaPrefixIcon($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIsSvgaPrefixIcon() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIsSvgaPrefixIcon() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get text => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set text($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasText() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearText() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  Color get textColor => $_getN(3);\n  @$pb.TagNumber(4)\n  set textColor(Color value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTextColor() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTextColor() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Color ensureTextColor() => $_ensure(3);\n}\n\nclass BubbleModulePic extends $pb.GeneratedMessage {\n  factory BubbleModulePic({\n    $core.String? picDay,\n    $core.String? picNight,\n    $fixnum.Int64? picWidth,\n    $fixnum.Int64? picHeight,\n    $core.bool? roundedCorner,\n    $fixnum.Int64? roundedCornerRadius,\n  }) {\n    final result = create();\n    if (picDay != null) result.picDay = picDay;\n    if (picNight != null) result.picNight = picNight;\n    if (picWidth != null) result.picWidth = picWidth;\n    if (picHeight != null) result.picHeight = picHeight;\n    if (roundedCorner != null) result.roundedCorner = roundedCorner;\n    if (roundedCornerRadius != null)\n      result.roundedCornerRadius = roundedCornerRadius;\n    return result;\n  }\n\n  BubbleModulePic._();\n\n  factory BubbleModulePic.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BubbleModulePic.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BubbleModulePic',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'picDay')\n    ..aOS(2, _omitFieldNames ? '' : 'picNight')\n    ..aInt64(3, _omitFieldNames ? '' : 'picWidth')\n    ..aInt64(4, _omitFieldNames ? '' : 'picHeight')\n    ..aOB(5, _omitFieldNames ? '' : 'roundedCorner')\n    ..aInt64(6, _omitFieldNames ? '' : 'roundedCornerRadius')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BubbleModulePic clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BubbleModulePic copyWith(void Function(BubbleModulePic) updates) =>\n      super.copyWith((message) => updates(message as BubbleModulePic))\n          as BubbleModulePic;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BubbleModulePic create() => BubbleModulePic._();\n  @$core.override\n  BubbleModulePic createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BubbleModulePic getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<BubbleModulePic>(create);\n  static BubbleModulePic? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get picDay => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set picDay($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPicDay() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPicDay() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get picNight => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set picNight($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPicNight() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPicNight() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get picWidth => $_getI64(2);\n  @$pb.TagNumber(3)\n  set picWidth($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPicWidth() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPicWidth() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get picHeight => $_getI64(3);\n  @$pb.TagNumber(4)\n  set picHeight($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPicHeight() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPicHeight() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.bool get roundedCorner => $_getBF(4);\n  @$pb.TagNumber(5)\n  set roundedCorner($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasRoundedCorner() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearRoundedCorner() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get roundedCornerRadius => $_getI64(5);\n  @$pb.TagNumber(6)\n  set roundedCornerRadius($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasRoundedCornerRadius() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearRoundedCornerRadius() => $_clearField(6);\n}\n\nclass BubbleModuleText extends $pb.GeneratedMessage {\n  factory BubbleModuleText({\n    $core.String? content,\n  }) {\n    final result = create();\n    if (content != null) result.content = content;\n    return result;\n  }\n\n  BubbleModuleText._();\n\n  factory BubbleModuleText.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BubbleModuleText.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BubbleModuleText',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'content')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BubbleModuleText clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BubbleModuleText copyWith(void Function(BubbleModuleText) updates) =>\n      super.copyWith((message) => updates(message as BubbleModuleText))\n          as BubbleModuleText;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BubbleModuleText create() => BubbleModuleText._();\n  @$core.override\n  BubbleModuleText createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BubbleModuleText getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<BubbleModuleText>(create);\n  static BubbleModuleText? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get content => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set content($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasContent() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearContent() => $_clearField(1);\n}\n\nclass BubbleModuleUser extends $pb.GeneratedMessage {\n  factory BubbleModuleUser({\n    $core.Iterable<UserInfo>? users,\n  }) {\n    final result = create();\n    if (users != null) result.users.addAll(users);\n    return result;\n  }\n\n  BubbleModuleUser._();\n\n  factory BubbleModuleUser.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BubbleModuleUser.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BubbleModuleUser',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..pPM<UserInfo>(1, _omitFieldNames ? '' : 'users',\n        subBuilder: UserInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BubbleModuleUser clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BubbleModuleUser copyWith(void Function(BubbleModuleUser) updates) =>\n      super.copyWith((message) => updates(message as BubbleModuleUser))\n          as BubbleModuleUser;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BubbleModuleUser create() => BubbleModuleUser._();\n  @$core.override\n  BubbleModuleUser createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BubbleModuleUser getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<BubbleModuleUser>(create);\n  static BubbleModuleUser? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<UserInfo> get users => $_getList(0);\n}\n\n/// 付费课程批次卡片数据\nclass CardCurrBatch extends $pb.GeneratedMessage {\n  factory CardCurrBatch({\n    $core.String? title,\n    $core.String? cover,\n    $core.String? uri,\n    $core.String? text1,\n    $core.String? text2,\n    VideoBadge? badge,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (uri != null) result.uri = uri;\n    if (text1 != null) result.text1 = text1;\n    if (text2 != null) result.text2 = text2;\n    if (badge != null) result.badge = badge;\n    return result;\n  }\n\n  CardCurrBatch._();\n\n  factory CardCurrBatch.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CardCurrBatch.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CardCurrBatch',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'cover')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..aOS(4, _omitFieldNames ? '' : 'text1')\n    ..aOS(5, _omitFieldNames ? '' : 'text2')\n    ..aOM<VideoBadge>(6, _omitFieldNames ? '' : 'badge',\n        subBuilder: VideoBadge.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardCurrBatch clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardCurrBatch copyWith(void Function(CardCurrBatch) updates) =>\n      super.copyWith((message) => updates(message as CardCurrBatch))\n          as CardCurrBatch;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CardCurrBatch create() => CardCurrBatch._();\n  @$core.override\n  CardCurrBatch createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CardCurrBatch getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CardCurrBatch>(create);\n  static CardCurrBatch? _defaultInstance;\n\n  /// 标题\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  /// 封面\n  @$pb.TagNumber(2)\n  $core.String get cover => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cover($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCover() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCover() => $_clearField(2);\n\n  /// 跳转地址\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n\n  /// 展示项 1: 本集标题\n  @$pb.TagNumber(4)\n  $core.String get text1 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set text1($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasText1() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearText1() => $_clearField(4);\n\n  /// 展示项 2: 更新了多少个视频\n  @$pb.TagNumber(5)\n  $core.String get text2 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set text2($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasText2() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearText2() => $_clearField(5);\n\n  /// 角标\n  @$pb.TagNumber(6)\n  VideoBadge get badge => $_getN(5);\n  @$pb.TagNumber(6)\n  set badge(VideoBadge value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasBadge() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearBadge() => $_clearField(6);\n  @$pb.TagNumber(6)\n  VideoBadge ensureBadge() => $_ensure(5);\n}\n\n/// 付费课程系列卡片数据\nclass CardCurrSeason extends $pb.GeneratedMessage {\n  factory CardCurrSeason({\n    $core.String? title,\n    $core.String? cover,\n    $core.String? uri,\n    $core.String? text1,\n    $core.String? desc,\n    VideoBadge? badge,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (uri != null) result.uri = uri;\n    if (text1 != null) result.text1 = text1;\n    if (desc != null) result.desc = desc;\n    if (badge != null) result.badge = badge;\n    return result;\n  }\n\n  CardCurrSeason._();\n\n  factory CardCurrSeason.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CardCurrSeason.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CardCurrSeason',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'cover')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..aOS(4, _omitFieldNames ? '' : 'text1')\n    ..aOS(5, _omitFieldNames ? '' : 'desc')\n    ..aOM<VideoBadge>(6, _omitFieldNames ? '' : 'badge',\n        subBuilder: VideoBadge.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardCurrSeason clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardCurrSeason copyWith(void Function(CardCurrSeason) updates) =>\n      super.copyWith((message) => updates(message as CardCurrSeason))\n          as CardCurrSeason;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CardCurrSeason create() => CardCurrSeason._();\n  @$core.override\n  CardCurrSeason createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CardCurrSeason getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CardCurrSeason>(create);\n  static CardCurrSeason? _defaultInstance;\n\n  /// 标题\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  /// 封面\n  @$pb.TagNumber(2)\n  $core.String get cover => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cover($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCover() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCover() => $_clearField(2);\n\n  /// 跳转地址\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n\n  /// 展示项 1 (展示更新信息)\n  @$pb.TagNumber(4)\n  $core.String get text1 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set text1($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasText1() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearText1() => $_clearField(4);\n\n  /// 描述信息\n  @$pb.TagNumber(5)\n  $core.String get desc => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set desc($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDesc() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDesc() => $_clearField(5);\n\n  /// 角标\n  @$pb.TagNumber(6)\n  VideoBadge get badge => $_getN(5);\n  @$pb.TagNumber(6)\n  set badge(VideoBadge value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasBadge() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearBadge() => $_clearField(6);\n  @$pb.TagNumber(6)\n  VideoBadge ensureBadge() => $_ensure(5);\n}\n\n/// PGC 视频卡片数据\nclass CardPGC extends $pb.GeneratedMessage {\n  factory CardPGC({\n    $core.String? title,\n    $core.String? cover,\n    $core.String? uri,\n    $core.String? coverLeftText1,\n    $core.String? coverLeftText2,\n    $core.String? coverLeftText3,\n    $fixnum.Int64? cid,\n    $fixnum.Int64? seasonId,\n    $fixnum.Int64? epid,\n    $fixnum.Int64? aid,\n    MediaType? mediaType,\n    VideoSubType? subType,\n    $core.int? isPreview,\n    Dimension? dimension,\n    $core.Iterable<VideoBadge>? badge,\n    $core.int? canPlay,\n    PGCSeason? season,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (uri != null) result.uri = uri;\n    if (coverLeftText1 != null) result.coverLeftText1 = coverLeftText1;\n    if (coverLeftText2 != null) result.coverLeftText2 = coverLeftText2;\n    if (coverLeftText3 != null) result.coverLeftText3 = coverLeftText3;\n    if (cid != null) result.cid = cid;\n    if (seasonId != null) result.seasonId = seasonId;\n    if (epid != null) result.epid = epid;\n    if (aid != null) result.aid = aid;\n    if (mediaType != null) result.mediaType = mediaType;\n    if (subType != null) result.subType = subType;\n    if (isPreview != null) result.isPreview = isPreview;\n    if (dimension != null) result.dimension = dimension;\n    if (badge != null) result.badge.addAll(badge);\n    if (canPlay != null) result.canPlay = canPlay;\n    if (season != null) result.season = season;\n    return result;\n  }\n\n  CardPGC._();\n\n  factory CardPGC.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CardPGC.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CardPGC',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'cover')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..aOS(4, _omitFieldNames ? '' : 'coverLeftText1')\n    ..aOS(5, _omitFieldNames ? '' : 'coverLeftText2')\n    ..aOS(6, _omitFieldNames ? '' : 'coverLeftText3')\n    ..aInt64(7, _omitFieldNames ? '' : 'cid')\n    ..aInt64(8, _omitFieldNames ? '' : 'seasonId')\n    ..aInt64(9, _omitFieldNames ? '' : 'epid')\n    ..aInt64(10, _omitFieldNames ? '' : 'aid')\n    ..aE<MediaType>(11, _omitFieldNames ? '' : 'mediaType',\n        enumValues: MediaType.values)\n    ..aE<VideoSubType>(12, _omitFieldNames ? '' : 'subType',\n        enumValues: VideoSubType.values)\n    ..aI(13, _omitFieldNames ? '' : 'isPreview')\n    ..aOM<Dimension>(14, _omitFieldNames ? '' : 'dimension',\n        subBuilder: Dimension.create)\n    ..pPM<VideoBadge>(15, _omitFieldNames ? '' : 'badge',\n        subBuilder: VideoBadge.create)\n    ..aI(16, _omitFieldNames ? '' : 'canPlay')\n    ..aOM<PGCSeason>(17, _omitFieldNames ? '' : 'season',\n        subBuilder: PGCSeason.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardPGC clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardPGC copyWith(void Function(CardPGC) updates) =>\n      super.copyWith((message) => updates(message as CardPGC)) as CardPGC;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CardPGC create() => CardPGC._();\n  @$core.override\n  CardPGC createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CardPGC getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CardPGC>(create);\n  static CardPGC? _defaultInstance;\n\n  /// 标题\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  /// 封面\n  @$pb.TagNumber(2)\n  $core.String get cover => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cover($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCover() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCover() => $_clearField(2);\n\n  /// 秒开地址\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n\n  /// 视频封面展示项 1\n  @$pb.TagNumber(4)\n  $core.String get coverLeftText1 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set coverLeftText1($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCoverLeftText1() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCoverLeftText1() => $_clearField(4);\n\n  /// 视频封面展示项 2\n  @$pb.TagNumber(5)\n  $core.String get coverLeftText2 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set coverLeftText2($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCoverLeftText2() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCoverLeftText2() => $_clearField(5);\n\n  /// 视频封面展示项 3\n  @$pb.TagNumber(6)\n  $core.String get coverLeftText3 => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set coverLeftText3($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCoverLeftText3() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCoverLeftText3() => $_clearField(6);\n\n  /// 视频 cid\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get cid => $_getI64(6);\n  @$pb.TagNumber(7)\n  set cid($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCid() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCid() => $_clearField(7);\n\n  /// PGC 剧集 ID\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get seasonId => $_getI64(7);\n  @$pb.TagNumber(8)\n  set seasonId($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasSeasonId() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearSeasonId() => $_clearField(8);\n\n  /// PGC 剧集分集 ID\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get epid => $_getI64(8);\n  @$pb.TagNumber(9)\n  set epid($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasEpid() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearEpid() => $_clearField(9);\n\n  /// 视频 avid\n  @$pb.TagNumber(10)\n  $fixnum.Int64 get aid => $_getI64(9);\n  @$pb.TagNumber(10)\n  set aid($fixnum.Int64 value) => $_setInt64(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasAid() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearAid() => $_clearField(10);\n\n  /// 视频源类型\n  @$pb.TagNumber(11)\n  MediaType get mediaType => $_getN(10);\n  @$pb.TagNumber(11)\n  set mediaType(MediaType value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasMediaType() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearMediaType() => $_clearField(11);\n\n  /// 番剧类型\n  @$pb.TagNumber(12)\n  VideoSubType get subType => $_getN(11);\n  @$pb.TagNumber(12)\n  set subType(VideoSubType value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasSubType() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearSubType() => $_clearField(12);\n\n  /// 番剧是否为预览视频\n  @$pb.TagNumber(13)\n  $core.int get isPreview => $_getIZ(12);\n  @$pb.TagNumber(13)\n  set isPreview($core.int value) => $_setSignedInt32(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasIsPreview() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearIsPreview() => $_clearField(13);\n\n  /// 分辨率\n  @$pb.TagNumber(14)\n  Dimension get dimension => $_getN(13);\n  @$pb.TagNumber(14)\n  set dimension(Dimension value) => $_setField(14, value);\n  @$pb.TagNumber(14)\n  $core.bool hasDimension() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearDimension() => $_clearField(14);\n  @$pb.TagNumber(14)\n  Dimension ensureDimension() => $_ensure(13);\n\n  /// 角标\n  @$pb.TagNumber(15)\n  $pb.PbList<VideoBadge> get badge => $_getList(14);\n\n  /// 是否能够自动播放\n  @$pb.TagNumber(16)\n  $core.int get canPlay => $_getIZ(15);\n  @$pb.TagNumber(16)\n  set canPlay($core.int value) => $_setSignedInt32(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasCanPlay() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearCanPlay() => $_clearField(16);\n\n  /// PGC 剧集信息\n  @$pb.TagNumber(17)\n  PGCSeason get season => $_getN(16);\n  @$pb.TagNumber(17)\n  set season(PGCSeason value) => $_setField(17, value);\n  @$pb.TagNumber(17)\n  $core.bool hasSeason() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearSeason() => $_clearField(17);\n  @$pb.TagNumber(17)\n  PGCSeason ensureSeason() => $_ensure(16);\n}\n\n/// UGC 视频卡片数据\nclass CardUGC extends $pb.GeneratedMessage {\n  factory CardUGC({\n    $core.String? title,\n    $core.String? cover,\n    $core.String? uri,\n    $core.String? coverLeftText1,\n    $core.String? coverLeftText2,\n    $core.String? coverLeftText3,\n    $fixnum.Int64? avid,\n    $fixnum.Int64? cid,\n    MediaType? mediaType,\n    Dimension? dimension,\n    $core.Iterable<VideoBadge>? badge,\n    $core.int? canPlay,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (uri != null) result.uri = uri;\n    if (coverLeftText1 != null) result.coverLeftText1 = coverLeftText1;\n    if (coverLeftText2 != null) result.coverLeftText2 = coverLeftText2;\n    if (coverLeftText3 != null) result.coverLeftText3 = coverLeftText3;\n    if (avid != null) result.avid = avid;\n    if (cid != null) result.cid = cid;\n    if (mediaType != null) result.mediaType = mediaType;\n    if (dimension != null) result.dimension = dimension;\n    if (badge != null) result.badge.addAll(badge);\n    if (canPlay != null) result.canPlay = canPlay;\n    return result;\n  }\n\n  CardUGC._();\n\n  factory CardUGC.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CardUGC.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CardUGC',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'cover')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..aOS(4, _omitFieldNames ? '' : 'coverLeftText1')\n    ..aOS(5, _omitFieldNames ? '' : 'coverLeftText2')\n    ..aOS(6, _omitFieldNames ? '' : 'coverLeftText3')\n    ..aInt64(7, _omitFieldNames ? '' : 'avid')\n    ..aInt64(8, _omitFieldNames ? '' : 'cid')\n    ..aE<MediaType>(9, _omitFieldNames ? '' : 'mediaType',\n        enumValues: MediaType.values)\n    ..aOM<Dimension>(10, _omitFieldNames ? '' : 'dimension',\n        subBuilder: Dimension.create)\n    ..pPM<VideoBadge>(11, _omitFieldNames ? '' : 'badge',\n        subBuilder: VideoBadge.create)\n    ..aI(12, _omitFieldNames ? '' : 'canPlay')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardUGC clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardUGC copyWith(void Function(CardUGC) updates) =>\n      super.copyWith((message) => updates(message as CardUGC)) as CardUGC;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CardUGC create() => CardUGC._();\n  @$core.override\n  CardUGC createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CardUGC getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CardUGC>(create);\n  static CardUGC? _defaultInstance;\n\n  /// 标题\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  /// 封面图\n  @$pb.TagNumber(2)\n  $core.String get cover => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cover($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCover() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCover() => $_clearField(2);\n\n  /// 秒开地址\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n\n  /// 视频封面展示项 1\n  @$pb.TagNumber(4)\n  $core.String get coverLeftText1 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set coverLeftText1($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCoverLeftText1() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCoverLeftText1() => $_clearField(4);\n\n  /// 视频封面展示项 2\n  @$pb.TagNumber(5)\n  $core.String get coverLeftText2 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set coverLeftText2($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCoverLeftText2() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCoverLeftText2() => $_clearField(5);\n\n  /// 视频封面展示项 3\n  @$pb.TagNumber(6)\n  $core.String get coverLeftText3 => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set coverLeftText3($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCoverLeftText3() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCoverLeftText3() => $_clearField(6);\n\n  /// 视频 avid\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get avid => $_getI64(6);\n  @$pb.TagNumber(7)\n  set avid($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasAvid() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearAvid() => $_clearField(7);\n\n  /// 视频 cid\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get cid => $_getI64(7);\n  @$pb.TagNumber(8)\n  set cid($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasCid() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearCid() => $_clearField(8);\n\n  /// 视频源类型\n  @$pb.TagNumber(9)\n  MediaType get mediaType => $_getN(8);\n  @$pb.TagNumber(9)\n  set mediaType(MediaType value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasMediaType() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearMediaType() => $_clearField(9);\n\n  /// 分辨率\n  @$pb.TagNumber(10)\n  Dimension get dimension => $_getN(9);\n  @$pb.TagNumber(10)\n  set dimension(Dimension value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasDimension() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearDimension() => $_clearField(10);\n  @$pb.TagNumber(10)\n  Dimension ensureDimension() => $_ensure(9);\n\n  /// 角标\n  @$pb.TagNumber(11)\n  $pb.PbList<VideoBadge> get badge => $_getList(10);\n\n  /// 是否能够自动播放\n  @$pb.TagNumber(12)\n  $core.int get canPlay => $_getIZ(11);\n  @$pb.TagNumber(12)\n  set canPlay($core.int value) => $_setSignedInt32(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasCanPlay() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearCanPlay() => $_clearField(12);\n}\n\nclass Color extends $pb.GeneratedMessage {\n  factory Color({\n    $core.String? colorDay,\n    $core.String? colorNight,\n  }) {\n    final result = create();\n    if (colorDay != null) result.colorDay = colorDay;\n    if (colorNight != null) result.colorNight = colorNight;\n    return result;\n  }\n\n  Color._();\n\n  factory Color.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Color.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Color',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'colorDay')\n    ..aOS(2, _omitFieldNames ? '' : 'colorNight')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Color clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Color copyWith(void Function(Color) updates) =>\n      super.copyWith((message) => updates(message as Color)) as Color;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Color create() => Color._();\n  @$core.override\n  Color createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Color getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Color>(create);\n  static Color? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get colorDay => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set colorDay($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasColorDay() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearColorDay() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get colorNight => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set colorNight($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasColorNight() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearColorNight() => $_clearField(2);\n}\n\nclass CornerInfo extends $pb.GeneratedMessage {\n  factory CornerInfo({\n    CornerType? cornerType,\n    $core.String? cornerText,\n    Color? cornerTextColor,\n    Color? cornerTextBgColor,\n    $core.String? cornerIcon,\n    $fixnum.Int64? cornerNumber,\n  }) {\n    final result = create();\n    if (cornerType != null) result.cornerType = cornerType;\n    if (cornerText != null) result.cornerText = cornerText;\n    if (cornerTextColor != null) result.cornerTextColor = cornerTextColor;\n    if (cornerTextBgColor != null) result.cornerTextBgColor = cornerTextBgColor;\n    if (cornerIcon != null) result.cornerIcon = cornerIcon;\n    if (cornerNumber != null) result.cornerNumber = cornerNumber;\n    return result;\n  }\n\n  CornerInfo._();\n\n  factory CornerInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CornerInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CornerInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aE<CornerType>(1, _omitFieldNames ? '' : 'cornerType',\n        enumValues: CornerType.values)\n    ..aOS(2, _omitFieldNames ? '' : 'cornerText')\n    ..aOM<Color>(3, _omitFieldNames ? '' : 'cornerTextColor',\n        subBuilder: Color.create)\n    ..aOM<Color>(4, _omitFieldNames ? '' : 'cornerTextBgColor',\n        subBuilder: Color.create)\n    ..aOS(5, _omitFieldNames ? '' : 'cornerIcon')\n    ..aInt64(6, _omitFieldNames ? '' : 'cornerNumber')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CornerInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CornerInfo copyWith(void Function(CornerInfo) updates) =>\n      super.copyWith((message) => updates(message as CornerInfo)) as CornerInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CornerInfo create() => CornerInfo._();\n  @$core.override\n  CornerInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CornerInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CornerInfo>(create);\n  static CornerInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  CornerType get cornerType => $_getN(0);\n  @$pb.TagNumber(1)\n  set cornerType(CornerType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCornerType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCornerType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get cornerText => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cornerText($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCornerText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCornerText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  Color get cornerTextColor => $_getN(2);\n  @$pb.TagNumber(3)\n  set cornerTextColor(Color value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCornerTextColor() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCornerTextColor() => $_clearField(3);\n  @$pb.TagNumber(3)\n  Color ensureCornerTextColor() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  Color get cornerTextBgColor => $_getN(3);\n  @$pb.TagNumber(4)\n  set cornerTextBgColor(Color value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCornerTextBgColor() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCornerTextBgColor() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Color ensureCornerTextBgColor() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.String get cornerIcon => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set cornerIcon($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCornerIcon() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCornerIcon() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get cornerNumber => $_getI64(5);\n  @$pb.TagNumber(6)\n  set cornerNumber($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCornerNumber() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCornerNumber() => $_clearField(6);\n}\n\n/// 粉丝样式\nclass DecoCardFan extends $pb.GeneratedMessage {\n  factory DecoCardFan({\n    $core.int? isFan,\n    $core.int? number,\n    $core.String? color,\n  }) {\n    final result = create();\n    if (isFan != null) result.isFan = isFan;\n    if (number != null) result.number = number;\n    if (color != null) result.color = color;\n    return result;\n  }\n\n  DecoCardFan._();\n\n  factory DecoCardFan.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DecoCardFan.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DecoCardFan',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'isFan')\n    ..aI(2, _omitFieldNames ? '' : 'number')\n    ..aOS(3, _omitFieldNames ? '' : 'color')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DecoCardFan clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DecoCardFan copyWith(void Function(DecoCardFan) updates) =>\n      super.copyWith((message) => updates(message as DecoCardFan))\n          as DecoCardFan;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DecoCardFan create() => DecoCardFan._();\n  @$core.override\n  DecoCardFan createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DecoCardFan getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DecoCardFan>(create);\n  static DecoCardFan? _defaultInstance;\n\n  /// 是否是粉丝\n  @$pb.TagNumber(1)\n  $core.int get isFan => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set isFan($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIsFan() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIsFan() => $_clearField(1);\n\n  /// 数量\n  @$pb.TagNumber(2)\n  $core.int get number => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set number($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasNumber() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearNumber() => $_clearField(2);\n\n  /// 颜色\n  @$pb.TagNumber(3)\n  $core.String get color => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set color($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasColor() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearColor() => $_clearField(3);\n}\n\n/// 装扮卡片\nclass DecorateCard extends $pb.GeneratedMessage {\n  factory DecorateCard({\n    $fixnum.Int64? id,\n    $core.String? cardUrl,\n    $core.String? jumpUrl,\n    DecoCardFan? fan,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (cardUrl != null) result.cardUrl = cardUrl;\n    if (jumpUrl != null) result.jumpUrl = jumpUrl;\n    if (fan != null) result.fan = fan;\n    return result;\n  }\n\n  DecorateCard._();\n\n  factory DecorateCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DecorateCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DecorateCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'cardUrl')\n    ..aOS(3, _omitFieldNames ? '' : 'jumpUrl')\n    ..aOM<DecoCardFan>(4, _omitFieldNames ? '' : 'fan',\n        subBuilder: DecoCardFan.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DecorateCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DecorateCard copyWith(void Function(DecorateCard) updates) =>\n      super.copyWith((message) => updates(message as DecorateCard))\n          as DecorateCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DecorateCard create() => DecorateCard._();\n  @$core.override\n  DecorateCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DecorateCard getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DecorateCard>(create);\n  static DecorateCard? _defaultInstance;\n\n  /// 装扮卡片 ID\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  /// 装扮卡片链接\n  @$pb.TagNumber(2)\n  $core.String get cardUrl => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cardUrl($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCardUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCardUrl() => $_clearField(2);\n\n  /// 装扮卡片点击跳转链接\n  @$pb.TagNumber(3)\n  $core.String get jumpUrl => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set jumpUrl($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasJumpUrl() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearJumpUrl() => $_clearField(3);\n\n  /// 粉丝样式\n  @$pb.TagNumber(4)\n  DecoCardFan get fan => $_getN(3);\n  @$pb.TagNumber(4)\n  set fan(DecoCardFan value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFan() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFan() => $_clearField(4);\n  @$pb.TagNumber(4)\n  DecoCardFan ensureFan() => $_ensure(3);\n}\n\n/// 文本描述\nclass Description extends $pb.GeneratedMessage {\n  factory Description({\n    $core.String? text,\n    $core.String? type,\n    $core.String? uri,\n    $core.String? emojiType,\n    $core.String? goodsType,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (type != null) result.type = type;\n    if (uri != null) result.uri = uri;\n    if (emojiType != null) result.emojiType = emojiType;\n    if (goodsType != null) result.goodsType = goodsType;\n    return result;\n  }\n\n  Description._();\n\n  factory Description.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Description.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Description',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aOS(2, _omitFieldNames ? '' : 'type')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..aOS(4, _omitFieldNames ? '' : 'emojiType')\n    ..aOS(5, _omitFieldNames ? '' : 'goodsType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Description clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Description copyWith(void Function(Description) updates) =>\n      super.copyWith((message) => updates(message as Description))\n          as Description;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Description create() => Description._();\n  @$core.override\n  Description createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Description getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<Description>(create);\n  static Description? _defaultInstance;\n\n  /// 文本内容\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  /// 文本类型\n  @$pb.TagNumber(2)\n  $core.String get type => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set type($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearType() => $_clearField(2);\n\n  /// 跳转地址\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n\n  /// emoji 类型\n  @$pb.TagNumber(4)\n  $core.String get emojiType => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set emojiType($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasEmojiType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearEmojiType() => $_clearField(4);\n\n  /// 商品类型\n  @$pb.TagNumber(5)\n  $core.String get goodsType => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set goodsType($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasGoodsType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearGoodsType() => $_clearField(5);\n}\n\n/// 分辨率信息\nclass Dimension extends $pb.GeneratedMessage {\n  factory Dimension({\n    $fixnum.Int64? height,\n    $fixnum.Int64? width,\n    $fixnum.Int64? rotate,\n  }) {\n    final result = create();\n    if (height != null) result.height = height;\n    if (width != null) result.width = width;\n    if (rotate != null) result.rotate = rotate;\n    return result;\n  }\n\n  Dimension._();\n\n  factory Dimension.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Dimension.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Dimension',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'height')\n    ..aInt64(2, _omitFieldNames ? '' : 'width')\n    ..aInt64(3, _omitFieldNames ? '' : 'rotate')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Dimension clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Dimension copyWith(void Function(Dimension) updates) =>\n      super.copyWith((message) => updates(message as Dimension)) as Dimension;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Dimension create() => Dimension._();\n  @$core.override\n  Dimension createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Dimension getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Dimension>(create);\n  static Dimension? _defaultInstance;\n\n  /// 高\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get height => $_getI64(0);\n  @$pb.TagNumber(1)\n  set height($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasHeight() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearHeight() => $_clearField(1);\n\n  /// 宽\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get width => $_getI64(1);\n  @$pb.TagNumber(2)\n  set width($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasWidth() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearWidth() => $_clearField(2);\n\n  /// 是否为竖屏\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get rotate => $_getI64(2);\n  @$pb.TagNumber(3)\n  set rotate($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRotate() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRotate() => $_clearField(3);\n}\n\n/// 通过动态 ID 批量获取动态详情返回值\nclass DynDetailsReply extends $pb.GeneratedMessage {\n  factory DynDetailsReply({\n    $core.Iterable<DynamicItem>? list,\n  }) {\n    final result = create();\n    if (list != null) result.list.addAll(list);\n    return result;\n  }\n\n  DynDetailsReply._();\n\n  factory DynDetailsReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynDetailsReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynDetailsReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..pPM<DynamicItem>(1, _omitFieldNames ? '' : 'list',\n        subBuilder: DynamicItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynDetailsReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynDetailsReply copyWith(void Function(DynDetailsReply) updates) =>\n      super.copyWith((message) => updates(message as DynDetailsReply))\n          as DynDetailsReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynDetailsReply create() => DynDetailsReply._();\n  @$core.override\n  DynDetailsReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynDetailsReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynDetailsReply>(create);\n  static DynDetailsReply? _defaultInstance;\n\n  /// 动态列表\n  @$pb.TagNumber(1)\n  $pb.PbList<DynamicItem> get list => $_getList(0);\n}\n\n/// 通过动态 ID 批量获取动态详情请求参数\nclass DynDetailsReq extends $pb.GeneratedMessage {\n  factory DynDetailsReq({\n    $core.int? teenagersMode,\n    $core.String? dynamicIds,\n    $core.int? qn,\n    $core.int? fnver,\n    $core.int? fnval,\n    $core.int? forceHost,\n    $core.int? fourk,\n  }) {\n    final result = create();\n    if (teenagersMode != null) result.teenagersMode = teenagersMode;\n    if (dynamicIds != null) result.dynamicIds = dynamicIds;\n    if (qn != null) result.qn = qn;\n    if (fnver != null) result.fnver = fnver;\n    if (fnval != null) result.fnval = fnval;\n    if (forceHost != null) result.forceHost = forceHost;\n    if (fourk != null) result.fourk = fourk;\n    return result;\n  }\n\n  DynDetailsReq._();\n\n  factory DynDetailsReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynDetailsReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynDetailsReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'teenagersMode')\n    ..aOS(2, _omitFieldNames ? '' : 'dynamicIds')\n    ..aI(3, _omitFieldNames ? '' : 'qn')\n    ..aI(4, _omitFieldNames ? '' : 'fnver')\n    ..aI(5, _omitFieldNames ? '' : 'fnval')\n    ..aI(6, _omitFieldNames ? '' : 'forceHost')\n    ..aI(7, _omitFieldNames ? '' : 'fourk')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynDetailsReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynDetailsReq copyWith(void Function(DynDetailsReq) updates) =>\n      super.copyWith((message) => updates(message as DynDetailsReq))\n          as DynDetailsReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynDetailsReq create() => DynDetailsReq._();\n  @$core.override\n  DynDetailsReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynDetailsReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynDetailsReq>(create);\n  static DynDetailsReq? _defaultInstance;\n\n  /// 青少年模式\n  @$pb.TagNumber(1)\n  $core.int get teenagersMode => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set teenagersMode($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTeenagersMode() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTeenagersMode() => $_clearField(1);\n\n  /// 动态 ID\n  @$pb.TagNumber(2)\n  $core.String get dynamicIds => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set dynamicIds($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDynamicIds() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDynamicIds() => $_clearField(2);\n\n  /// 清晰度 (供秒开)\n  @$pb.TagNumber(3)\n  $core.int get qn => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set qn($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasQn() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearQn() => $_clearField(3);\n\n  /// 功能版本号 (供秒开)\n  @$pb.TagNumber(4)\n  $core.int get fnver => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set fnver($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFnver() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFnver() => $_clearField(4);\n\n  /// 功能标识 (供秒开)\n  @$pb.TagNumber(5)\n  $core.int get fnval => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set fnval($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasFnval() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearFnval() => $_clearField(5);\n\n  /// 返回 playurl 是否强制使用域名 (供秒开)\n  @$pb.TagNumber(6)\n  $core.int get forceHost => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set forceHost($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasForceHost() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearForceHost() => $_clearField(6);\n\n  /// 是否需要 4K 视频 (供秒开)\n  @$pb.TagNumber(7)\n  $core.int get fourk => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set fourk($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasFourk() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearFourk() => $_clearField(7);\n}\n\nclass DynMixUpListSearchReply extends $pb.GeneratedMessage {\n  factory DynMixUpListSearchReply({\n    $core.Iterable<MixUpListItem>? items,\n  }) {\n    final result = create();\n    if (items != null) result.items.addAll(items);\n    return result;\n  }\n\n  DynMixUpListSearchReply._();\n\n  factory DynMixUpListSearchReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynMixUpListSearchReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynMixUpListSearchReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..pPM<MixUpListItem>(1, _omitFieldNames ? '' : 'items',\n        subBuilder: MixUpListItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynMixUpListSearchReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynMixUpListSearchReply copyWith(\n          void Function(DynMixUpListSearchReply) updates) =>\n      super.copyWith((message) => updates(message as DynMixUpListSearchReply))\n          as DynMixUpListSearchReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynMixUpListSearchReply create() => DynMixUpListSearchReply._();\n  @$core.override\n  DynMixUpListSearchReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynMixUpListSearchReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynMixUpListSearchReply>(create);\n  static DynMixUpListSearchReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<MixUpListItem> get items => $_getList(0);\n}\n\nclass DynMixUpListSearchReq extends $pb.GeneratedMessage {\n  factory DynMixUpListSearchReq({\n    $core.String? name,\n  }) {\n    final result = create();\n    if (name != null) result.name = name;\n    return result;\n  }\n\n  DynMixUpListSearchReq._();\n\n  factory DynMixUpListSearchReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynMixUpListSearchReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynMixUpListSearchReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'name')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynMixUpListSearchReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynMixUpListSearchReq copyWith(\n          void Function(DynMixUpListSearchReq) updates) =>\n      super.copyWith((message) => updates(message as DynMixUpListSearchReq))\n          as DynMixUpListSearchReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynMixUpListSearchReq create() => DynMixUpListSearchReq._();\n  @$core.override\n  DynMixUpListSearchReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynMixUpListSearchReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynMixUpListSearchReq>(create);\n  static DynMixUpListSearchReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get name => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set name($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasName() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearName() => $_clearField(1);\n}\n\nclass DynMixUpListViewMoreReply extends $pb.GeneratedMessage {\n  factory DynMixUpListViewMoreReply({\n    $core.Iterable<MixUpListItem>? items,\n    $core.String? searchDefaultText,\n  }) {\n    final result = create();\n    if (items != null) result.items.addAll(items);\n    if (searchDefaultText != null) result.searchDefaultText = searchDefaultText;\n    return result;\n  }\n\n  DynMixUpListViewMoreReply._();\n\n  factory DynMixUpListViewMoreReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynMixUpListViewMoreReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynMixUpListViewMoreReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..pPM<MixUpListItem>(1, _omitFieldNames ? '' : 'items',\n        subBuilder: MixUpListItem.create)\n    ..aOS(2, _omitFieldNames ? '' : 'searchDefaultText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynMixUpListViewMoreReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynMixUpListViewMoreReply copyWith(\n          void Function(DynMixUpListViewMoreReply) updates) =>\n      super.copyWith((message) => updates(message as DynMixUpListViewMoreReply))\n          as DynMixUpListViewMoreReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynMixUpListViewMoreReply create() => DynMixUpListViewMoreReply._();\n  @$core.override\n  DynMixUpListViewMoreReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynMixUpListViewMoreReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynMixUpListViewMoreReply>(create);\n  static DynMixUpListViewMoreReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<MixUpListItem> get items => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.String get searchDefaultText => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set searchDefaultText($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSearchDefaultText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSearchDefaultText() => $_clearField(2);\n}\n\n/// 动态同城物料\nclass DynOurCityItem extends $pb.GeneratedMessage {\n  factory DynOurCityItem({\n    $core.String? cardType,\n    $fixnum.Int64? dynId,\n    $core.String? uri,\n    $core.Iterable<DynOurCityModule>? modules,\n    $fixnum.Int64? rid,\n    $core.String? debugInfo,\n  }) {\n    final result = create();\n    if (cardType != null) result.cardType = cardType;\n    if (dynId != null) result.dynId = dynId;\n    if (uri != null) result.uri = uri;\n    if (modules != null) result.modules.addAll(modules);\n    if (rid != null) result.rid = rid;\n    if (debugInfo != null) result.debugInfo = debugInfo;\n    return result;\n  }\n\n  DynOurCityItem._();\n\n  factory DynOurCityItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynOurCityItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynOurCityItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'cardType')\n    ..aInt64(2, _omitFieldNames ? '' : 'dynId')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..pPM<DynOurCityModule>(4, _omitFieldNames ? '' : 'modules',\n        subBuilder: DynOurCityModule.create)\n    ..aInt64(5, _omitFieldNames ? '' : 'rid')\n    ..aOS(6, _omitFieldNames ? '' : 'debugInfo')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynOurCityItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynOurCityItem copyWith(void Function(DynOurCityItem) updates) =>\n      super.copyWith((message) => updates(message as DynOurCityItem))\n          as DynOurCityItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynOurCityItem create() => DynOurCityItem._();\n  @$core.override\n  DynOurCityItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynOurCityItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynOurCityItem>(create);\n  static DynOurCityItem? _defaultInstance;\n\n  /// 卡片类型\n  ///\n  /// - av: 稿件\n  /// - draw: 图文\n  @$pb.TagNumber(1)\n  $core.String get cardType => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set cardType($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCardType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCardType() => $_clearField(1);\n\n  /// 动态 ID\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get dynId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set dynId($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDynId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDynId() => $_clearField(2);\n\n  /// 跳转地址\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n\n  /// 模块列表\n  @$pb.TagNumber(4)\n  $pb.PbList<DynOurCityModule> get modules => $_getList(3);\n\n  /// 资源 ID\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get rid => $_getI64(4);\n  @$pb.TagNumber(5)\n  set rid($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasRid() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearRid() => $_clearField(5);\n\n  /// ? DEBUG 信息\n  @$pb.TagNumber(6)\n  $core.String get debugInfo => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set debugInfo($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasDebugInfo() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearDebugInfo() => $_clearField(6);\n}\n\nenum DynOurCityModule_ModuleItem {\n  moduleCover,\n  moduleDesc,\n  moduleAuthor,\n  moduleExtend,\n  notSet\n}\n\n/// 动态同城物料模块\nclass DynOurCityModule extends $pb.GeneratedMessage {\n  factory DynOurCityModule({\n    $core.String? moduleType,\n    DynOurCityModuleCover? moduleCover,\n    DynOurCityModuleDesc? moduleDesc,\n    DynOurCityModuleAuthor? moduleAuthor,\n    DynOurCityModuleExtend? moduleExtend,\n  }) {\n    final result = create();\n    if (moduleType != null) result.moduleType = moduleType;\n    if (moduleCover != null) result.moduleCover = moduleCover;\n    if (moduleDesc != null) result.moduleDesc = moduleDesc;\n    if (moduleAuthor != null) result.moduleAuthor = moduleAuthor;\n    if (moduleExtend != null) result.moduleExtend = moduleExtend;\n    return result;\n  }\n\n  DynOurCityModule._();\n\n  factory DynOurCityModule.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynOurCityModule.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, DynOurCityModule_ModuleItem>\n      _DynOurCityModule_ModuleItemByTag = {\n    2: DynOurCityModule_ModuleItem.moduleCover,\n    3: DynOurCityModule_ModuleItem.moduleDesc,\n    4: DynOurCityModule_ModuleItem.moduleAuthor,\n    5: DynOurCityModule_ModuleItem.moduleExtend,\n    0: DynOurCityModule_ModuleItem.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynOurCityModule',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [2, 3, 4, 5])\n    ..aOS(1, _omitFieldNames ? '' : 'moduleType')\n    ..aOM<DynOurCityModuleCover>(2, _omitFieldNames ? '' : 'moduleCover',\n        subBuilder: DynOurCityModuleCover.create)\n    ..aOM<DynOurCityModuleDesc>(3, _omitFieldNames ? '' : 'moduleDesc',\n        subBuilder: DynOurCityModuleDesc.create)\n    ..aOM<DynOurCityModuleAuthor>(4, _omitFieldNames ? '' : 'moduleAuthor',\n        subBuilder: DynOurCityModuleAuthor.create)\n    ..aOM<DynOurCityModuleExtend>(5, _omitFieldNames ? '' : 'moduleExtend',\n        subBuilder: DynOurCityModuleExtend.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynOurCityModule clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynOurCityModule copyWith(void Function(DynOurCityModule) updates) =>\n      super.copyWith((message) => updates(message as DynOurCityModule))\n          as DynOurCityModule;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynOurCityModule create() => DynOurCityModule._();\n  @$core.override\n  DynOurCityModule createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynOurCityModule getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynOurCityModule>(create);\n  static DynOurCityModule? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  DynOurCityModule_ModuleItem whichModuleItem() =>\n      _DynOurCityModule_ModuleItemByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  void clearModuleItem() => $_clearField($_whichOneof(0));\n\n  /// 模块类型\n  ///\n  /// - `cover`: 封面\n  /// - `desc`: 描述\n  /// - `author`: 发布人\n  /// - `extend`: 扩展部分\n  @$pb.TagNumber(1)\n  $core.String get moduleType => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set moduleType($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasModuleType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearModuleType() => $_clearField(1);\n\n  /// 参见 [`DynOurCityModuleCover`]\n  @$pb.TagNumber(2)\n  DynOurCityModuleCover get moduleCover => $_getN(1);\n  @$pb.TagNumber(2)\n  set moduleCover(DynOurCityModuleCover value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasModuleCover() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearModuleCover() => $_clearField(2);\n  @$pb.TagNumber(2)\n  DynOurCityModuleCover ensureModuleCover() => $_ensure(1);\n\n  /// 参见 [`DynOurCityModuleDesc`]\n  @$pb.TagNumber(3)\n  DynOurCityModuleDesc get moduleDesc => $_getN(2);\n  @$pb.TagNumber(3)\n  set moduleDesc(DynOurCityModuleDesc value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasModuleDesc() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearModuleDesc() => $_clearField(3);\n  @$pb.TagNumber(3)\n  DynOurCityModuleDesc ensureModuleDesc() => $_ensure(2);\n\n  /// 参见 [`DynOurCityModuleAuthor`]\n  @$pb.TagNumber(4)\n  DynOurCityModuleAuthor get moduleAuthor => $_getN(3);\n  @$pb.TagNumber(4)\n  set moduleAuthor(DynOurCityModuleAuthor value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasModuleAuthor() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearModuleAuthor() => $_clearField(4);\n  @$pb.TagNumber(4)\n  DynOurCityModuleAuthor ensureModuleAuthor() => $_ensure(3);\n\n  /// 参见 [`DynOurCityModuleExtend`]\n  @$pb.TagNumber(5)\n  DynOurCityModuleExtend get moduleExtend => $_getN(4);\n  @$pb.TagNumber(5)\n  set moduleExtend(DynOurCityModuleExtend value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasModuleExtend() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearModuleExtend() => $_clearField(5);\n  @$pb.TagNumber(5)\n  DynOurCityModuleExtend ensureModuleExtend() => $_ensure(4);\n}\n\n/// 动态同城物料发布人模块\nclass DynOurCityModuleAuthor extends $pb.GeneratedMessage {\n  factory DynOurCityModuleAuthor({\n    $fixnum.Int64? mid,\n    $core.String? name,\n    $core.String? face,\n    $core.String? uri,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (name != null) result.name = name;\n    if (face != null) result.face = face;\n    if (uri != null) result.uri = uri;\n    return result;\n  }\n\n  DynOurCityModuleAuthor._();\n\n  factory DynOurCityModuleAuthor.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynOurCityModuleAuthor.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynOurCityModuleAuthor',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'face')\n    ..aOS(4, _omitFieldNames ? '' : 'uri')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynOurCityModuleAuthor clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynOurCityModuleAuthor copyWith(\n          void Function(DynOurCityModuleAuthor) updates) =>\n      super.copyWith((message) => updates(message as DynOurCityModuleAuthor))\n          as DynOurCityModuleAuthor;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynOurCityModuleAuthor create() => DynOurCityModuleAuthor._();\n  @$core.override\n  DynOurCityModuleAuthor createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynOurCityModuleAuthor getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynOurCityModuleAuthor>(create);\n  static DynOurCityModuleAuthor? _defaultInstance;\n\n  /// 发布人 mid\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  /// 发布人昵称\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  /// 发布人头像\n  @$pb.TagNumber(3)\n  $core.String get face => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set face($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFace() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFace() => $_clearField(3);\n\n  /// 跳转地址\n  @$pb.TagNumber(4)\n  $core.String get uri => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set uri($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUri() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUri() => $_clearField(4);\n}\n\n/// 动态同城物料封面模块\nclass DynOurCityModuleCover extends $pb.GeneratedMessage {\n  factory DynOurCityModuleCover({\n    $core.Iterable<$core.String>? covers,\n    $core.int? style,\n    $core.int? coverLeftIcon1,\n    $core.String? coverLeftText1,\n    $core.int? coverLeftIcon2,\n    $core.String? coverLeftText2,\n    $core.String? coverLeftText3,\n    $core.Iterable<VideoBadge>? badge,\n  }) {\n    final result = create();\n    if (covers != null) result.covers.addAll(covers);\n    if (style != null) result.style = style;\n    if (coverLeftIcon1 != null) result.coverLeftIcon1 = coverLeftIcon1;\n    if (coverLeftText1 != null) result.coverLeftText1 = coverLeftText1;\n    if (coverLeftIcon2 != null) result.coverLeftIcon2 = coverLeftIcon2;\n    if (coverLeftText2 != null) result.coverLeftText2 = coverLeftText2;\n    if (coverLeftText3 != null) result.coverLeftText3 = coverLeftText3;\n    if (badge != null) result.badge.addAll(badge);\n    return result;\n  }\n\n  DynOurCityModuleCover._();\n\n  factory DynOurCityModuleCover.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynOurCityModuleCover.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynOurCityModuleCover',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..pPS(1, _omitFieldNames ? '' : 'covers')\n    ..aI(2, _omitFieldNames ? '' : 'style')\n    ..aI(3, _omitFieldNames ? '' : 'coverLeftIcon1')\n    ..aOS(4, _omitFieldNames ? '' : 'coverLeftText1')\n    ..aI(5, _omitFieldNames ? '' : 'coverLeftIcon2')\n    ..aOS(6, _omitFieldNames ? '' : 'coverLeftText2')\n    ..aOS(7, _omitFieldNames ? '' : 'coverLeftText3')\n    ..pPM<VideoBadge>(8, _omitFieldNames ? '' : 'badge',\n        subBuilder: VideoBadge.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynOurCityModuleCover clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynOurCityModuleCover copyWith(\n          void Function(DynOurCityModuleCover) updates) =>\n      super.copyWith((message) => updates(message as DynOurCityModuleCover))\n          as DynOurCityModuleCover;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynOurCityModuleCover create() => DynOurCityModuleCover._();\n  @$core.override\n  DynOurCityModuleCover createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynOurCityModuleCover getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynOurCityModuleCover>(create);\n  static DynOurCityModuleCover? _defaultInstance;\n\n  /// 封面图\n  ///\n  /// 单图样式取第一个元素\n  @$pb.TagNumber(1)\n  $pb.PbList<$core.String> get covers => $_getList(0);\n\n  /// 封面样式\n  ///\n  /// - 1: 横图\n  /// - 2: 竖图\n  /// - 3: 方图\n  @$pb.TagNumber(2)\n  $core.int get style => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set style($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasStyle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearStyle() => $_clearField(2);\n\n  /// 视频封面展示项图标 1\n  @$pb.TagNumber(3)\n  $core.int get coverLeftIcon1 => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set coverLeftIcon1($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCoverLeftIcon1() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCoverLeftIcon1() => $_clearField(3);\n\n  /// 视频封面展示项 1\n  @$pb.TagNumber(4)\n  $core.String get coverLeftText1 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set coverLeftText1($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCoverLeftText1() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCoverLeftText1() => $_clearField(4);\n\n  /// 视频封面展示项图标 2\n  @$pb.TagNumber(5)\n  $core.int get coverLeftIcon2 => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set coverLeftIcon2($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCoverLeftIcon2() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCoverLeftIcon2() => $_clearField(5);\n\n  /// 视频封面展示项 2\n  @$pb.TagNumber(6)\n  $core.String get coverLeftText2 => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set coverLeftText2($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCoverLeftText2() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCoverLeftText2() => $_clearField(6);\n\n  /// 视频封面展示项 3\n  @$pb.TagNumber(7)\n  $core.String get coverLeftText3 => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set coverLeftText3($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCoverLeftText3() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCoverLeftText3() => $_clearField(7);\n\n  /// 角标\n  @$pb.TagNumber(8)\n  $pb.PbList<VideoBadge> get badge => $_getList(7);\n}\n\n/// 动态同城物料详情模块\nclass DynOurCityModuleDesc extends $pb.GeneratedMessage {\n  factory DynOurCityModuleDesc({\n    $core.String? desc,\n  }) {\n    final result = create();\n    if (desc != null) result.desc = desc;\n    return result;\n  }\n\n  DynOurCityModuleDesc._();\n\n  factory DynOurCityModuleDesc.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynOurCityModuleDesc.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynOurCityModuleDesc',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'desc')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynOurCityModuleDesc clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynOurCityModuleDesc copyWith(void Function(DynOurCityModuleDesc) updates) =>\n      super.copyWith((message) => updates(message as DynOurCityModuleDesc))\n          as DynOurCityModuleDesc;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynOurCityModuleDesc create() => DynOurCityModuleDesc._();\n  @$core.override\n  DynOurCityModuleDesc createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynOurCityModuleDesc getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynOurCityModuleDesc>(create);\n  static DynOurCityModuleDesc? _defaultInstance;\n\n  /// 详情\n  @$pb.TagNumber(1)\n  $core.String get desc => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set desc($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDesc() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDesc() => $_clearField(1);\n}\n\nenum DynOurCityModuleExtend_Extend { extendLbs, notSet }\n\n/// 动态同城物料拓展模块\nclass DynOurCityModuleExtend extends $pb.GeneratedMessage {\n  factory DynOurCityModuleExtend({\n    $core.String? type,\n    DynOurCityModuleExtendLBS? extendLbs,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (extendLbs != null) result.extendLbs = extendLbs;\n    return result;\n  }\n\n  DynOurCityModuleExtend._();\n\n  factory DynOurCityModuleExtend.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynOurCityModuleExtend.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, DynOurCityModuleExtend_Extend>\n      _DynOurCityModuleExtend_ExtendByTag = {\n    2: DynOurCityModuleExtend_Extend.extendLbs,\n    0: DynOurCityModuleExtend_Extend.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynOurCityModuleExtend',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [2])\n    ..aOS(1, _omitFieldNames ? '' : 'type')\n    ..aOM<DynOurCityModuleExtendLBS>(2, _omitFieldNames ? '' : 'extendLbs',\n        subBuilder: DynOurCityModuleExtendLBS.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynOurCityModuleExtend clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynOurCityModuleExtend copyWith(\n          void Function(DynOurCityModuleExtend) updates) =>\n      super.copyWith((message) => updates(message as DynOurCityModuleExtend))\n          as DynOurCityModuleExtend;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynOurCityModuleExtend create() => DynOurCityModuleExtend._();\n  @$core.override\n  DynOurCityModuleExtend createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynOurCityModuleExtend getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynOurCityModuleExtend>(create);\n  static DynOurCityModuleExtend? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  DynOurCityModuleExtend_Extend whichExtend() =>\n      _DynOurCityModuleExtend_ExtendByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  void clearExtend() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  $core.String get type => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set type($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  DynOurCityModuleExtendLBS get extendLbs => $_getN(1);\n  @$pb.TagNumber(2)\n  set extendLbs(DynOurCityModuleExtendLBS value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasExtendLbs() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearExtendLbs() => $_clearField(2);\n  @$pb.TagNumber(2)\n  DynOurCityModuleExtendLBS ensureExtendLbs() => $_ensure(1);\n}\n\n/// 动态同城物料拓展模块: LBS\nclass DynOurCityModuleExtendLBS extends $pb.GeneratedMessage {\n  factory DynOurCityModuleExtendLBS({\n    $core.String? title,\n    $core.String? uri,\n    $core.String? icon,\n    $core.int? poiType,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (uri != null) result.uri = uri;\n    if (icon != null) result.icon = icon;\n    if (poiType != null) result.poiType = poiType;\n    return result;\n  }\n\n  DynOurCityModuleExtendLBS._();\n\n  factory DynOurCityModuleExtendLBS.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynOurCityModuleExtendLBS.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynOurCityModuleExtendLBS',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..aOS(3, _omitFieldNames ? '' : 'icon')\n    ..aI(4, _omitFieldNames ? '' : 'poiType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynOurCityModuleExtendLBS clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynOurCityModuleExtendLBS copyWith(\n          void Function(DynOurCityModuleExtendLBS) updates) =>\n      super.copyWith((message) => updates(message as DynOurCityModuleExtendLBS))\n          as DynOurCityModuleExtendLBS;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynOurCityModuleExtendLBS create() => DynOurCityModuleExtendLBS._();\n  @$core.override\n  DynOurCityModuleExtendLBS createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynOurCityModuleExtendLBS getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynOurCityModuleExtendLBS>(create);\n  static DynOurCityModuleExtendLBS? _defaultInstance;\n\n  /// 标题\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  /// 跳转地址\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n\n  /// 小图标\n  @$pb.TagNumber(3)\n  $core.String get icon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set icon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIcon() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get poiType => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set poiType($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPoiType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPoiType() => $_clearField(4);\n}\n\n/// 动态同城页请求返回值\nclass DynOurCityReply extends $pb.GeneratedMessage {\n  factory DynOurCityReply({\n    $core.String? offset,\n    $core.int? hasMore,\n    $core.int? style,\n    $core.String? topLabel,\n    $core.Iterable<DynOurCityItem>? list,\n    $core.String? topButtonLabel,\n    $core.int? cityId,\n    $core.String? cityName,\n  }) {\n    final result = create();\n    if (offset != null) result.offset = offset;\n    if (hasMore != null) result.hasMore = hasMore;\n    if (style != null) result.style = style;\n    if (topLabel != null) result.topLabel = topLabel;\n    if (list != null) result.list.addAll(list);\n    if (topButtonLabel != null) result.topButtonLabel = topButtonLabel;\n    if (cityId != null) result.cityId = cityId;\n    if (cityName != null) result.cityName = cityName;\n    return result;\n  }\n\n  DynOurCityReply._();\n\n  factory DynOurCityReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynOurCityReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynOurCityReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'offset')\n    ..aI(2, _omitFieldNames ? '' : 'hasMore')\n    ..aI(3, _omitFieldNames ? '' : 'style')\n    ..aOS(4, _omitFieldNames ? '' : 'topLabel')\n    ..pPM<DynOurCityItem>(5, _omitFieldNames ? '' : 'list',\n        subBuilder: DynOurCityItem.create)\n    ..aOS(6, _omitFieldNames ? '' : 'topButtonLabel')\n    ..aI(7, _omitFieldNames ? '' : 'cityId')\n    ..aOS(8, _omitFieldNames ? '' : 'cityName')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynOurCityReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynOurCityReply copyWith(void Function(DynOurCityReply) updates) =>\n      super.copyWith((message) => updates(message as DynOurCityReply))\n          as DynOurCityReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynOurCityReply create() => DynOurCityReply._();\n  @$core.override\n  DynOurCityReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynOurCityReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynOurCityReply>(create);\n  static DynOurCityReply? _defaultInstance;\n\n  /// 翻页游标\n  @$pb.TagNumber(1)\n  $core.String get offset => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set offset($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOffset() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOffset() => $_clearField(1);\n\n  /// 是否还有更多\n  @$pb.TagNumber(2)\n  $core.int get hasMore => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set hasMore($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHasMore() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHasMore() => $_clearField(2);\n\n  /// 样式类型\n  ///\n  /// - 1: 双列\n  /// - 2: 瀑布流\n  @$pb.TagNumber(3)\n  $core.int get style => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set style($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasStyle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearStyle() => $_clearField(3);\n\n  /// ? 顶部导引信息\n  @$pb.TagNumber(4)\n  $core.String get topLabel => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set topLabel($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTopLabel() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTopLabel() => $_clearField(4);\n\n  /// 列表详情\n  @$pb.TagNumber(5)\n  $pb.PbList<DynOurCityItem> get list => $_getList(4);\n\n  /// ? 顶部导引按钮信息\n  @$pb.TagNumber(6)\n  $core.String get topButtonLabel => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set topButtonLabel($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasTopButtonLabel() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearTopButtonLabel() => $_clearField(6);\n\n  /// 城市 ID\n  @$pb.TagNumber(7)\n  $core.int get cityId => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set cityId($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCityId() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCityId() => $_clearField(7);\n\n  /// 城市名称\n  @$pb.TagNumber(8)\n  $core.String get cityName => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set cityName($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasCityName() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearCityName() => $_clearField(8);\n}\n\n/// 动态同城页请求参数\nclass DynOurCityReq extends $pb.GeneratedMessage {\n  factory DynOurCityReq({\n    $fixnum.Int64? cityId,\n    $core.double? lat,\n    $core.double? lng,\n    $core.String? offset,\n    $core.int? pageSize,\n    $core.int? teenagersMode,\n    $core.int? qn,\n    $core.int? fnver,\n    $core.int? fnval,\n    $core.int? forceHost,\n    $core.int? fourk,\n    $core.int? lbsState,\n    $core.int? refreshCity,\n    ExpConf? expConf,\n    $1.PlayerArgs? playerArgs,\n    $fixnum.Int64? cityCode,\n    $fixnum.Int64? buildTime,\n  }) {\n    final result = create();\n    if (cityId != null) result.cityId = cityId;\n    if (lat != null) result.lat = lat;\n    if (lng != null) result.lng = lng;\n    if (offset != null) result.offset = offset;\n    if (pageSize != null) result.pageSize = pageSize;\n    if (teenagersMode != null) result.teenagersMode = teenagersMode;\n    if (qn != null) result.qn = qn;\n    if (fnver != null) result.fnver = fnver;\n    if (fnval != null) result.fnval = fnval;\n    if (forceHost != null) result.forceHost = forceHost;\n    if (fourk != null) result.fourk = fourk;\n    if (lbsState != null) result.lbsState = lbsState;\n    if (refreshCity != null) result.refreshCity = refreshCity;\n    if (expConf != null) result.expConf = expConf;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    if (cityCode != null) result.cityCode = cityCode;\n    if (buildTime != null) result.buildTime = buildTime;\n    return result;\n  }\n\n  DynOurCityReq._();\n\n  factory DynOurCityReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynOurCityReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynOurCityReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'cityId')\n    ..aD(2, _omitFieldNames ? '' : 'lat')\n    ..aD(3, _omitFieldNames ? '' : 'lng')\n    ..aOS(4, _omitFieldNames ? '' : 'offset')\n    ..aI(5, _omitFieldNames ? '' : 'pageSize')\n    ..aI(6, _omitFieldNames ? '' : 'teenagersMode')\n    ..aI(7, _omitFieldNames ? '' : 'qn')\n    ..aI(8, _omitFieldNames ? '' : 'fnver')\n    ..aI(9, _omitFieldNames ? '' : 'fnval')\n    ..aI(10, _omitFieldNames ? '' : 'forceHost')\n    ..aI(11, _omitFieldNames ? '' : 'fourk')\n    ..aI(12, _omitFieldNames ? '' : 'lbsState')\n    ..aI(13, _omitFieldNames ? '' : 'refreshCity')\n    ..aOM<ExpConf>(14, _omitFieldNames ? '' : 'expConf',\n        subBuilder: ExpConf.create)\n    ..aOM<$1.PlayerArgs>(15, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $1.PlayerArgs.create)\n    ..aInt64(16, _omitFieldNames ? '' : 'cityCode')\n    ..aInt64(17, _omitFieldNames ? '' : 'buildTime')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynOurCityReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynOurCityReq copyWith(void Function(DynOurCityReq) updates) =>\n      super.copyWith((message) => updates(message as DynOurCityReq))\n          as DynOurCityReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynOurCityReq create() => DynOurCityReq._();\n  @$core.override\n  DynOurCityReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynOurCityReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynOurCityReq>(create);\n  static DynOurCityReq? _defaultInstance;\n\n  /// 城市 ID\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get cityId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set cityId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCityId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCityId() => $_clearField(1);\n\n  /// 纬度\n  @$pb.TagNumber(2)\n  $core.double get lat => $_getN(1);\n  @$pb.TagNumber(2)\n  set lat($core.double value) => $_setDouble(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLat() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLat() => $_clearField(2);\n\n  /// 精度\n  @$pb.TagNumber(3)\n  $core.double get lng => $_getN(2);\n  @$pb.TagNumber(3)\n  set lng($core.double value) => $_setDouble(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLng() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLng() => $_clearField(3);\n\n  /// 透传上一次接口请求返回的 offset\n  @$pb.TagNumber(4)\n  $core.String get offset => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set offset($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasOffset() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearOffset() => $_clearField(4);\n\n  /// 每页元素个数\n  @$pb.TagNumber(5)\n  $core.int get pageSize => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set pageSize($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPageSize() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPageSize() => $_clearField(5);\n\n  /// 青少年模式\n  @$pb.TagNumber(6)\n  $core.int get teenagersMode => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set teenagersMode($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasTeenagersMode() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearTeenagersMode() => $_clearField(6);\n\n  /// 清晰度 (供秒开)\n  @$pb.TagNumber(7)\n  $core.int get qn => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set qn($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasQn() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearQn() => $_clearField(7);\n\n  /// 功能版本号 (供秒开)\n  @$pb.TagNumber(8)\n  $core.int get fnver => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set fnver($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasFnver() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearFnver() => $_clearField(8);\n\n  /// 功能标识 (供秒开)\n  @$pb.TagNumber(9)\n  $core.int get fnval => $_getIZ(8);\n  @$pb.TagNumber(9)\n  set fnval($core.int value) => $_setSignedInt32(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasFnval() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearFnval() => $_clearField(9);\n\n  /// 返回 playurl 是否强制使用域名 (供秒开)\n  @$pb.TagNumber(10)\n  $core.int get forceHost => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set forceHost($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasForceHost() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearForceHost() => $_clearField(10);\n\n  /// 是否需要 4K 视频 (供秒开)\n  @$pb.TagNumber(11)\n  $core.int get fourk => $_getIZ(10);\n  @$pb.TagNumber(11)\n  set fourk($core.int value) => $_setSignedInt32(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasFourk() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearFourk() => $_clearField(11);\n\n  /// 是否开启 LBS\n  @$pb.TagNumber(12)\n  $core.int get lbsState => $_getIZ(11);\n  @$pb.TagNumber(12)\n  set lbsState($core.int value) => $_setSignedInt32(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasLbsState() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearLbsState() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.int get refreshCity => $_getIZ(12);\n  @$pb.TagNumber(13)\n  set refreshCity($core.int value) => $_setSignedInt32(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasRefreshCity() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearRefreshCity() => $_clearField(13);\n\n  /// ab 测试配置\n  @$pb.TagNumber(14)\n  ExpConf get expConf => $_getN(13);\n  @$pb.TagNumber(14)\n  set expConf(ExpConf value) => $_setField(14, value);\n  @$pb.TagNumber(14)\n  $core.bool hasExpConf() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearExpConf() => $_clearField(14);\n  @$pb.TagNumber(14)\n  ExpConf ensureExpConf() => $_ensure(13);\n\n  /// 播放器参数 (供秒开)\n  @$pb.TagNumber(15)\n  $1.PlayerArgs get playerArgs => $_getN(14);\n  @$pb.TagNumber(15)\n  set playerArgs($1.PlayerArgs value) => $_setField(15, value);\n  @$pb.TagNumber(15)\n  $core.bool hasPlayerArgs() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearPlayerArgs() => $_clearField(15);\n  @$pb.TagNumber(15)\n  $1.PlayerArgs ensurePlayerArgs() => $_ensure(14);\n\n  @$pb.TagNumber(16)\n  $fixnum.Int64 get cityCode => $_getI64(15);\n  @$pb.TagNumber(16)\n  set cityCode($fixnum.Int64 value) => $_setInt64(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasCityCode() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearCityCode() => $_clearField(16);\n\n  @$pb.TagNumber(17)\n  $fixnum.Int64 get buildTime => $_getI64(16);\n  @$pb.TagNumber(17)\n  set buildTime($fixnum.Int64 value) => $_setInt64(16, value);\n  @$pb.TagNumber(17)\n  $core.bool hasBuildTime() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearBuildTime() => $_clearField(17);\n}\n\n/// 动态同城开关请求参数\nclass DynOurCitySwitchReq extends $pb.GeneratedMessage {\n  factory DynOurCitySwitchReq({\n    $core.int? switch_1,\n  }) {\n    final result = create();\n    if (switch_1 != null) result.switch_1 = switch_1;\n    return result;\n  }\n\n  DynOurCitySwitchReq._();\n\n  factory DynOurCitySwitchReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynOurCitySwitchReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynOurCitySwitchReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'switch')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynOurCitySwitchReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynOurCitySwitchReq copyWith(void Function(DynOurCitySwitchReq) updates) =>\n      super.copyWith((message) => updates(message as DynOurCitySwitchReq))\n          as DynOurCitySwitchReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynOurCitySwitchReq create() => DynOurCitySwitchReq._();\n  @$core.override\n  DynOurCitySwitchReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynOurCitySwitchReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynOurCitySwitchReq>(create);\n  static DynOurCitySwitchReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get switch_1 => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set switch_1($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSwitch_1() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSwitch_1() => $_clearField(1);\n}\n\n/// 红点具体信息\nclass DynRedItem extends $pb.GeneratedMessage {\n  factory DynRedItem({\n    $fixnum.Int64? count,\n  }) {\n    final result = create();\n    if (count != null) result.count = count;\n    return result;\n  }\n\n  DynRedItem._();\n\n  factory DynRedItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynRedItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynRedItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'count')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynRedItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynRedItem copyWith(void Function(DynRedItem) updates) =>\n      super.copyWith((message) => updates(message as DynRedItem)) as DynRedItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynRedItem create() => DynRedItem._();\n  @$core.override\n  DynRedItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynRedItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynRedItem>(create);\n  static DynRedItem? _defaultInstance;\n\n  /// 数字红点有效更新数\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get count => $_getI64(0);\n  @$pb.TagNumber(1)\n  set count($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCount() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCount() => $_clearField(1);\n}\n\n/// 动态红点返回值\nclass DynRedReply extends $pb.GeneratedMessage {\n  factory DynRedReply({\n    $core.String? redType,\n    DynRedItem? dynRedItem,\n    $core.String? defaultTab,\n    DynRedStyle? redStyle,\n    $core.String? tabRecallExtra,\n    BubbleInfo? bubbleInfo,\n  }) {\n    final result = create();\n    if (redType != null) result.redType = redType;\n    if (dynRedItem != null) result.dynRedItem = dynRedItem;\n    if (defaultTab != null) result.defaultTab = defaultTab;\n    if (redStyle != null) result.redStyle = redStyle;\n    if (tabRecallExtra != null) result.tabRecallExtra = tabRecallExtra;\n    if (bubbleInfo != null) result.bubbleInfo = bubbleInfo;\n    return result;\n  }\n\n  DynRedReply._();\n\n  factory DynRedReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynRedReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynRedReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'redType')\n    ..aOM<DynRedItem>(2, _omitFieldNames ? '' : 'dynRedItem',\n        subBuilder: DynRedItem.create)\n    ..aOS(3, _omitFieldNames ? '' : 'defaultTab')\n    ..aOM<DynRedStyle>(4, _omitFieldNames ? '' : 'redStyle',\n        subBuilder: DynRedStyle.create)\n    ..aOS(5, _omitFieldNames ? '' : 'tabRecallExtra')\n    ..aOM<BubbleInfo>(6, _omitFieldNames ? '' : 'bubbleInfo',\n        subBuilder: BubbleInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynRedReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynRedReply copyWith(void Function(DynRedReply) updates) =>\n      super.copyWith((message) => updates(message as DynRedReply))\n          as DynRedReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynRedReply create() => DynRedReply._();\n  @$core.override\n  DynRedReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynRedReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynRedReply>(create);\n  static DynRedReply? _defaultInstance;\n\n  /// 动态红点类型\n  ///\n  /// - count: 数字红点\n  /// - point: 普通红点\n  /// - no_point: 没有红点\n  @$pb.TagNumber(1)\n  $core.String get redType => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set redType($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasRedType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRedType() => $_clearField(1);\n\n  /// 动态红点具体信息, 参见 [`DynRedItem`]\n  @$pb.TagNumber(2)\n  DynRedItem get dynRedItem => $_getN(1);\n  @$pb.TagNumber(2)\n  set dynRedItem(DynRedItem value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDynRedItem() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDynRedItem() => $_clearField(2);\n  @$pb.TagNumber(2)\n  DynRedItem ensureDynRedItem() => $_ensure(1);\n\n  /// 动态红点默认 tab 值, 对应 tab 接口下发的 anchor\n  @$pb.TagNumber(3)\n  $core.String get defaultTab => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set defaultTab($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDefaultTab() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDefaultTab() => $_clearField(3);\n\n  /// 动态红点样式\n  @$pb.TagNumber(4)\n  DynRedStyle get redStyle => $_getN(3);\n  @$pb.TagNumber(4)\n  set redStyle(DynRedStyle value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasRedStyle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearRedStyle() => $_clearField(4);\n  @$pb.TagNumber(4)\n  DynRedStyle ensureRedStyle() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.String get tabRecallExtra => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set tabRecallExtra($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasTabRecallExtra() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearTabRecallExtra() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  BubbleInfo get bubbleInfo => $_getN(5);\n  @$pb.TagNumber(6)\n  set bubbleInfo(BubbleInfo value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasBubbleInfo() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearBubbleInfo() => $_clearField(6);\n  @$pb.TagNumber(6)\n  BubbleInfo ensureBubbleInfo() => $_ensure(5);\n}\n\n/// 动态红点请求参数\nclass DynRedReq extends $pb.GeneratedMessage {\n  factory DynRedReq({\n    $core.Iterable<TabOffset>? tabOffset,\n    $core.bool? isNewInstall,\n    $core.bool? isCodeStart,\n    $core.Iterable<$fixnum.Int64>? newFollowUpMids,\n    DynRedReq_DynRedReqScene? reqScene,\n  }) {\n    final result = create();\n    if (tabOffset != null) result.tabOffset.addAll(tabOffset);\n    if (isNewInstall != null) result.isNewInstall = isNewInstall;\n    if (isCodeStart != null) result.isCodeStart = isCodeStart;\n    if (newFollowUpMids != null) result.newFollowUpMids.addAll(newFollowUpMids);\n    if (reqScene != null) result.reqScene = reqScene;\n    return result;\n  }\n\n  DynRedReq._();\n\n  factory DynRedReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynRedReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynRedReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..pPM<TabOffset>(1, _omitFieldNames ? '' : 'tabOffset',\n        subBuilder: TabOffset.create)\n    ..aOB(2, _omitFieldNames ? '' : 'isNewInstall')\n    ..aOB(3, _omitFieldNames ? '' : 'isCodeStart')\n    ..p<$fixnum.Int64>(\n        4, _omitFieldNames ? '' : 'newFollowUpMids', $pb.PbFieldType.K6)\n    ..aE<DynRedReq_DynRedReqScene>(5, _omitFieldNames ? '' : 'reqScene',\n        enumValues: DynRedReq_DynRedReqScene.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynRedReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynRedReq copyWith(void Function(DynRedReq) updates) =>\n      super.copyWith((message) => updates(message as DynRedReq)) as DynRedReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynRedReq create() => DynRedReq._();\n  @$core.override\n  DynRedReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynRedReq getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DynRedReq>(create);\n  static DynRedReq? _defaultInstance;\n\n  /// 参见 [`TabOffset`]\n  @$pb.TagNumber(1)\n  $pb.PbList<TabOffset> get tabOffset => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.bool get isNewInstall => $_getBF(1);\n  @$pb.TagNumber(2)\n  set isNewInstall($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIsNewInstall() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIsNewInstall() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get isCodeStart => $_getBF(2);\n  @$pb.TagNumber(3)\n  set isCodeStart($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIsCodeStart() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIsCodeStart() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<$fixnum.Int64> get newFollowUpMids => $_getList(3);\n\n  @$pb.TagNumber(5)\n  DynRedReq_DynRedReqScene get reqScene => $_getN(4);\n  @$pb.TagNumber(5)\n  set reqScene(DynRedReq_DynRedReqScene value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasReqScene() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearReqScene() => $_clearField(5);\n}\n\n/// 动态红点样式\nclass DynRedStyle extends $pb.GeneratedMessage {\n  factory DynRedStyle({\n    BgType? bgType,\n    CornerType? cornerType,\n    $core.int? displayTime,\n    $core.String? cornerMark,\n    DynRedStyleUp? up,\n    StyleType? type,\n    CornerInfo? cornerInfo,\n  }) {\n    final result = create();\n    if (bgType != null) result.bgType = bgType;\n    if (cornerType != null) result.cornerType = cornerType;\n    if (displayTime != null) result.displayTime = displayTime;\n    if (cornerMark != null) result.cornerMark = cornerMark;\n    if (up != null) result.up = up;\n    if (type != null) result.type = type;\n    if (cornerInfo != null) result.cornerInfo = cornerInfo;\n    return result;\n  }\n\n  DynRedStyle._();\n\n  factory DynRedStyle.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynRedStyle.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynRedStyle',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aE<BgType>(1, _omitFieldNames ? '' : 'bgType', enumValues: BgType.values)\n    ..aE<CornerType>(2, _omitFieldNames ? '' : 'cornerType',\n        enumValues: CornerType.values)\n    ..aI(3, _omitFieldNames ? '' : 'displayTime')\n    ..aOS(4, _omitFieldNames ? '' : 'cornerMark')\n    ..aOM<DynRedStyleUp>(5, _omitFieldNames ? '' : 'up',\n        subBuilder: DynRedStyleUp.create)\n    ..aE<StyleType>(6, _omitFieldNames ? '' : 'type',\n        enumValues: StyleType.values)\n    ..aOM<CornerInfo>(7, _omitFieldNames ? '' : 'cornerInfo',\n        subBuilder: CornerInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynRedStyle clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynRedStyle copyWith(void Function(DynRedStyle) updates) =>\n      super.copyWith((message) => updates(message as DynRedStyle))\n          as DynRedStyle;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynRedStyle create() => DynRedStyle._();\n  @$core.override\n  DynRedStyle createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynRedStyle getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynRedStyle>(create);\n  static DynRedStyle? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  BgType get bgType => $_getN(0);\n  @$pb.TagNumber(1)\n  set bgType(BgType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBgType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBgType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  CornerType get cornerType => $_getN(1);\n  @$pb.TagNumber(2)\n  set cornerType(CornerType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCornerType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCornerType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get displayTime => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set displayTime($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDisplayTime() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDisplayTime() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get cornerMark => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set cornerMark($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCornerMark() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCornerMark() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  DynRedStyleUp get up => $_getN(4);\n  @$pb.TagNumber(5)\n  set up(DynRedStyleUp value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasUp() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearUp() => $_clearField(5);\n  @$pb.TagNumber(5)\n  DynRedStyleUp ensureUp() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  StyleType get type => $_getN(5);\n  @$pb.TagNumber(6)\n  set type(StyleType value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasType() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearType() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  CornerInfo get cornerInfo => $_getN(6);\n  @$pb.TagNumber(7)\n  set cornerInfo(CornerInfo value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCornerInfo() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCornerInfo() => $_clearField(7);\n  @$pb.TagNumber(7)\n  CornerInfo ensureCornerInfo() => $_ensure(6);\n}\n\nclass DynRedStyleUp extends $pb.GeneratedMessage {\n  factory DynRedStyleUp({\n    $fixnum.Int64? uid,\n    $core.String? face,\n    StyleType? faceType,\n    Color? borderColor,\n  }) {\n    final result = create();\n    if (uid != null) result.uid = uid;\n    if (face != null) result.face = face;\n    if (faceType != null) result.faceType = faceType;\n    if (borderColor != null) result.borderColor = borderColor;\n    return result;\n  }\n\n  DynRedStyleUp._();\n\n  factory DynRedStyleUp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynRedStyleUp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynRedStyleUp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'uid')\n    ..aOS(2, _omitFieldNames ? '' : 'face')\n    ..aE<StyleType>(3, _omitFieldNames ? '' : 'faceType',\n        enumValues: StyleType.values)\n    ..aOM<Color>(4, _omitFieldNames ? '' : 'borderColor',\n        subBuilder: Color.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynRedStyleUp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynRedStyleUp copyWith(void Function(DynRedStyleUp) updates) =>\n      super.copyWith((message) => updates(message as DynRedStyleUp))\n          as DynRedStyleUp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynRedStyleUp create() => DynRedStyleUp._();\n  @$core.override\n  DynRedStyleUp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynRedStyleUp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynRedStyleUp>(create);\n  static DynRedStyleUp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get uid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set uid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get face => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set face($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFace() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFace() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  StyleType get faceType => $_getN(2);\n  @$pb.TagNumber(3)\n  set faceType(StyleType value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFaceType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFaceType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  Color get borderColor => $_getN(3);\n  @$pb.TagNumber(4)\n  set borderColor(Color value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBorderColor() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBorderColor() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Color ensureBorderColor() => $_ensure(3);\n}\n\n/// 动态 tab\nclass DynTab extends $pb.GeneratedMessage {\n  factory DynTab({\n    $core.String? title,\n    $core.String? uri,\n    $core.String? bubble,\n    $core.int? redPoint,\n    $fixnum.Int64? cityId,\n    $core.int? isPopup,\n    Popup? popup,\n    $core.bool? defaultTab,\n    $core.String? subTitle,\n    $core.String? anchor,\n    $core.String? internalTest,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (uri != null) result.uri = uri;\n    if (bubble != null) result.bubble = bubble;\n    if (redPoint != null) result.redPoint = redPoint;\n    if (cityId != null) result.cityId = cityId;\n    if (isPopup != null) result.isPopup = isPopup;\n    if (popup != null) result.popup = popup;\n    if (defaultTab != null) result.defaultTab = defaultTab;\n    if (subTitle != null) result.subTitle = subTitle;\n    if (anchor != null) result.anchor = anchor;\n    if (internalTest != null) result.internalTest = internalTest;\n    return result;\n  }\n\n  DynTab._();\n\n  factory DynTab.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynTab.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynTab',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..aOS(3, _omitFieldNames ? '' : 'bubble')\n    ..aI(4, _omitFieldNames ? '' : 'redPoint')\n    ..aInt64(5, _omitFieldNames ? '' : 'cityId')\n    ..aI(6, _omitFieldNames ? '' : 'isPopup')\n    ..aOM<Popup>(7, _omitFieldNames ? '' : 'popup', subBuilder: Popup.create)\n    ..aOB(8, _omitFieldNames ? '' : 'defaultTab')\n    ..aOS(9, _omitFieldNames ? '' : 'subTitle')\n    ..aOS(10, _omitFieldNames ? '' : 'anchor')\n    ..aOS(11, _omitFieldNames ? '' : 'internalTest')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynTab clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynTab copyWith(void Function(DynTab) updates) =>\n      super.copyWith((message) => updates(message as DynTab)) as DynTab;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynTab create() => DynTab._();\n  @$core.override\n  DynTab createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynTab getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DynTab>(create);\n  static DynTab? _defaultInstance;\n\n  /// tab 标题\n  ///\n  /// 优先展示用, 未开启状态第一次请求返回 `同城`, 后续请求返回对应城市名\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  /// 跳转链接\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n\n  /// 气泡内容\n  @$pb.TagNumber(3)\n  $core.String get bubble => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set bubble($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBubble() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBubble() => $_clearField(3);\n\n  /// 是否推红点\n  @$pb.TagNumber(4)\n  $core.int get redPoint => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set redPoint($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasRedPoint() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearRedPoint() => $_clearField(4);\n\n  /// 城市 ID\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get cityId => $_getI64(4);\n  @$pb.TagNumber(5)\n  set cityId($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCityId() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCityId() => $_clearField(5);\n\n  /// 是否弹窗\n  @$pb.TagNumber(6)\n  $core.int get isPopup => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set isPopup($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasIsPopup() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearIsPopup() => $_clearField(6);\n\n  /// 弹窗内容\n  @$pb.TagNumber(7)\n  Popup get popup => $_getN(6);\n  @$pb.TagNumber(7)\n  set popup(Popup value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasPopup() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearPopup() => $_clearField(7);\n  @$pb.TagNumber(7)\n  Popup ensurePopup() => $_ensure(6);\n\n  /// 是否默认 tab\n  @$pb.TagNumber(8)\n  $core.bool get defaultTab => $_getBF(7);\n  @$pb.TagNumber(8)\n  set defaultTab($core.bool value) => $_setBool(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasDefaultTab() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearDefaultTab() => $_clearField(8);\n\n  /// 副标题\n  ///\n  /// 对应城市名\n  @$pb.TagNumber(9)\n  $core.String get subTitle => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set subTitle($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasSubTitle() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearSubTitle() => $_clearField(9);\n\n  /// 锚点字段\n  @$pb.TagNumber(10)\n  $core.String get anchor => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set anchor($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasAnchor() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearAnchor() => $_clearField(10);\n\n  /// ? 内部测试\n  @$pb.TagNumber(11)\n  $core.String get internalTest => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set internalTest($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasInternalTest() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearInternalTest() => $_clearField(11);\n}\n\n/// 动态 tab 请求返回值\nclass DynTabReply extends $pb.GeneratedMessage {\n  factory DynTabReply({\n    $core.Iterable<DynTab>? dynTab,\n  }) {\n    final result = create();\n    if (dynTab != null) result.dynTab.addAll(dynTab);\n    return result;\n  }\n\n  DynTabReply._();\n\n  factory DynTabReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynTabReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynTabReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..pPM<DynTab>(1, _omitFieldNames ? '' : 'dynTab', subBuilder: DynTab.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynTabReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynTabReply copyWith(void Function(DynTabReply) updates) =>\n      super.copyWith((message) => updates(message as DynTabReply))\n          as DynTabReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynTabReply create() => DynTabReply._();\n  @$core.override\n  DynTabReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynTabReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynTabReply>(create);\n  static DynTabReply? _defaultInstance;\n\n  /// 参见 [`DynTab`]\n  @$pb.TagNumber(1)\n  $pb.PbList<DynTab> get dynTab => $_getList(0);\n}\n\n/// 动态 tab 请求参数\nclass DynTabReq extends $pb.GeneratedMessage {\n  factory DynTabReq({\n    $core.int? teenagersMode,\n  }) {\n    final result = create();\n    if (teenagersMode != null) result.teenagersMode = teenagersMode;\n    return result;\n  }\n\n  DynTabReq._();\n\n  factory DynTabReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynTabReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynTabReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'teenagersMode')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynTabReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynTabReq copyWith(void Function(DynTabReq) updates) =>\n      super.copyWith((message) => updates(message as DynTabReq)) as DynTabReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynTabReq create() => DynTabReq._();\n  @$core.override\n  DynTabReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynTabReq getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DynTabReq>(create);\n  static DynTabReq? _defaultInstance;\n\n  /// 青少年模式\n  @$pb.TagNumber(1)\n  $core.int get teenagersMode => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set teenagersMode($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTeenagersMode() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTeenagersMode() => $_clearField(1);\n}\n\n/// 最近访问标记已读请求参数\nclass DynUpdOffsetReq extends $pb.GeneratedMessage {\n  factory DynUpdOffsetReq({\n    $fixnum.Int64? hostUid,\n    $core.String? readOffset,\n  }) {\n    final result = create();\n    if (hostUid != null) result.hostUid = hostUid;\n    if (readOffset != null) result.readOffset = readOffset;\n    return result;\n  }\n\n  DynUpdOffsetReq._();\n\n  factory DynUpdOffsetReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynUpdOffsetReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynUpdOffsetReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'hostUid')\n    ..aOS(2, _omitFieldNames ? '' : 'readOffset')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynUpdOffsetReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynUpdOffsetReq copyWith(void Function(DynUpdOffsetReq) updates) =>\n      super.copyWith((message) => updates(message as DynUpdOffsetReq))\n          as DynUpdOffsetReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynUpdOffsetReq create() => DynUpdOffsetReq._();\n  @$core.override\n  DynUpdOffsetReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynUpdOffsetReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynUpdOffsetReq>(create);\n  static DynUpdOffsetReq? _defaultInstance;\n\n  /// 被访问者的 mid\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get hostUid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set hostUid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasHostUid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearHostUid() => $_clearField(1);\n\n  /// 用户已读进度\n  @$pb.TagNumber(2)\n  $core.String get readOffset => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set readOffset($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasReadOffset() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearReadOffset() => $_clearField(2);\n}\n\n/// 最近访问个人视频 feed 流返回值\nclass DynVideoPersonalReply extends $pb.GeneratedMessage {\n  factory DynVideoPersonalReply({\n    $core.Iterable<DynamicItem>? list,\n    $core.String? offset,\n    $core.int? hasMore,\n    $core.String? readOffset,\n  }) {\n    final result = create();\n    if (list != null) result.list.addAll(list);\n    if (offset != null) result.offset = offset;\n    if (hasMore != null) result.hasMore = hasMore;\n    if (readOffset != null) result.readOffset = readOffset;\n    return result;\n  }\n\n  DynVideoPersonalReply._();\n\n  factory DynVideoPersonalReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynVideoPersonalReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynVideoPersonalReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..pPM<DynamicItem>(1, _omitFieldNames ? '' : 'list',\n        subBuilder: DynamicItem.create)\n    ..aOS(2, _omitFieldNames ? '' : 'offset')\n    ..aI(3, _omitFieldNames ? '' : 'hasMore')\n    ..aOS(4, _omitFieldNames ? '' : 'readOffset')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynVideoPersonalReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynVideoPersonalReply copyWith(\n          void Function(DynVideoPersonalReply) updates) =>\n      super.copyWith((message) => updates(message as DynVideoPersonalReply))\n          as DynVideoPersonalReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynVideoPersonalReply create() => DynVideoPersonalReply._();\n  @$core.override\n  DynVideoPersonalReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynVideoPersonalReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynVideoPersonalReply>(create);\n  static DynVideoPersonalReply? _defaultInstance;\n\n  /// 参见 [`DynamicItem`]\n  @$pb.TagNumber(1)\n  $pb.PbList<DynamicItem> get list => $_getList(0);\n\n  /// 偏移量\n  @$pb.TagNumber(2)\n  $core.String get offset => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set offset($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOffset() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOffset() => $_clearField(2);\n\n  /// 是否还有更多\n  @$pb.TagNumber(3)\n  $core.int get hasMore => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set hasMore($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasHasMore() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearHasMore() => $_clearField(3);\n\n  /// 已读进度\n  @$pb.TagNumber(4)\n  $core.String get readOffset => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set readOffset($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasReadOffset() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearReadOffset() => $_clearField(4);\n}\n\n/// 最近访问个人视频 feed 流请求参数\nclass DynVideoPersonalReq extends $pb.GeneratedMessage {\n  factory DynVideoPersonalReq({\n    $core.int? teenagersMode,\n    $fixnum.Int64? hostUid,\n    $core.String? offset,\n    $core.int? page,\n    $core.int? isPreload,\n    $core.int? qn,\n    $core.int? fnver,\n    $core.int? fnval,\n    $core.int? forceHost,\n    $core.int? fourk,\n  }) {\n    final result = create();\n    if (teenagersMode != null) result.teenagersMode = teenagersMode;\n    if (hostUid != null) result.hostUid = hostUid;\n    if (offset != null) result.offset = offset;\n    if (page != null) result.page = page;\n    if (isPreload != null) result.isPreload = isPreload;\n    if (qn != null) result.qn = qn;\n    if (fnver != null) result.fnver = fnver;\n    if (fnval != null) result.fnval = fnval;\n    if (forceHost != null) result.forceHost = forceHost;\n    if (fourk != null) result.fourk = fourk;\n    return result;\n  }\n\n  DynVideoPersonalReq._();\n\n  factory DynVideoPersonalReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynVideoPersonalReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynVideoPersonalReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'teenagersMode')\n    ..aInt64(2, _omitFieldNames ? '' : 'hostUid')\n    ..aOS(3, _omitFieldNames ? '' : 'offset')\n    ..aI(4, _omitFieldNames ? '' : 'page')\n    ..aI(5, _omitFieldNames ? '' : 'isPreload')\n    ..aI(6, _omitFieldNames ? '' : 'qn')\n    ..aI(7, _omitFieldNames ? '' : 'fnver')\n    ..aI(8, _omitFieldNames ? '' : 'fnval')\n    ..aI(9, _omitFieldNames ? '' : 'forceHost')\n    ..aI(10, _omitFieldNames ? '' : 'fourk')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynVideoPersonalReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynVideoPersonalReq copyWith(void Function(DynVideoPersonalReq) updates) =>\n      super.copyWith((message) => updates(message as DynVideoPersonalReq))\n          as DynVideoPersonalReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynVideoPersonalReq create() => DynVideoPersonalReq._();\n  @$core.override\n  DynVideoPersonalReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynVideoPersonalReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynVideoPersonalReq>(create);\n  static DynVideoPersonalReq? _defaultInstance;\n\n  /// 青少年模式\n  @$pb.TagNumber(1)\n  $core.int get teenagersMode => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set teenagersMode($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTeenagersMode() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTeenagersMode() => $_clearField(1);\n\n  /// 被访问者的 mid\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get hostUid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set hostUid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHostUid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHostUid() => $_clearField(2);\n\n  /// 偏移量\n  ///\n  /// 第一页可传空\n  @$pb.TagNumber(3)\n  $core.String get offset => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set offset($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasOffset() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearOffset() => $_clearField(3);\n\n  /// 标明下拉几次\n  @$pb.TagNumber(4)\n  $core.int get page => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set page($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPage() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPage() => $_clearField(4);\n\n  /// 是否是预加载\n  @$pb.TagNumber(5)\n  $core.int get isPreload => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set isPreload($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasIsPreload() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearIsPreload() => $_clearField(5);\n\n  /// 清晰度 (供秒开)\n  @$pb.TagNumber(6)\n  $core.int get qn => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set qn($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasQn() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearQn() => $_clearField(6);\n\n  /// 功能版本号 (供秒开)\n  @$pb.TagNumber(7)\n  $core.int get fnver => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set fnver($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasFnver() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearFnver() => $_clearField(7);\n\n  /// 功能标识 (供秒开)\n  @$pb.TagNumber(8)\n  $core.int get fnval => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set fnval($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasFnval() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearFnval() => $_clearField(8);\n\n  /// 返回 playurl 是否强制使用域名 (供秒开)\n  @$pb.TagNumber(9)\n  $core.int get forceHost => $_getIZ(8);\n  @$pb.TagNumber(9)\n  set forceHost($core.int value) => $_setSignedInt32(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasForceHost() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearForceHost() => $_clearField(9);\n\n  /// 是否需要 4K 视频 (供秒开)\n  @$pb.TagNumber(10)\n  $core.int get fourk => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set fourk($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasFourk() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearFourk() => $_clearField(10);\n}\n\n/// 动态视频页请求参数\nclass DynVideoReq extends $pb.GeneratedMessage {\n  factory DynVideoReq({\n    $core.int? teenagersMode,\n    $core.String? updateBaseline,\n    $core.String? offset,\n    $core.int? page,\n    $core.int? refreshType,\n    $core.int? qn,\n    $core.int? fnver,\n    $core.int? fnval,\n    $core.int? forceHost,\n    $core.int? fourk,\n  }) {\n    final result = create();\n    if (teenagersMode != null) result.teenagersMode = teenagersMode;\n    if (updateBaseline != null) result.updateBaseline = updateBaseline;\n    if (offset != null) result.offset = offset;\n    if (page != null) result.page = page;\n    if (refreshType != null) result.refreshType = refreshType;\n    if (qn != null) result.qn = qn;\n    if (fnver != null) result.fnver = fnver;\n    if (fnval != null) result.fnval = fnval;\n    if (forceHost != null) result.forceHost = forceHost;\n    if (fourk != null) result.fourk = fourk;\n    return result;\n  }\n\n  DynVideoReq._();\n\n  factory DynVideoReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynVideoReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynVideoReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'teenagersMode')\n    ..aOS(2, _omitFieldNames ? '' : 'updateBaseline')\n    ..aOS(3, _omitFieldNames ? '' : 'offset')\n    ..aI(4, _omitFieldNames ? '' : 'page')\n    ..aI(5, _omitFieldNames ? '' : 'refreshType')\n    ..aI(6, _omitFieldNames ? '' : 'qn')\n    ..aI(7, _omitFieldNames ? '' : 'fnver')\n    ..aI(8, _omitFieldNames ? '' : 'fnval')\n    ..aI(9, _omitFieldNames ? '' : 'forceHost')\n    ..aI(10, _omitFieldNames ? '' : 'fourk')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynVideoReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynVideoReq copyWith(void Function(DynVideoReq) updates) =>\n      super.copyWith((message) => updates(message as DynVideoReq))\n          as DynVideoReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynVideoReq create() => DynVideoReq._();\n  @$core.override\n  DynVideoReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynVideoReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynVideoReq>(create);\n  static DynVideoReq? _defaultInstance;\n\n  /// 青少年模式\n  @$pb.TagNumber(1)\n  $core.int get teenagersMode => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set teenagersMode($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTeenagersMode() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTeenagersMode() => $_clearField(1);\n\n  /// 透传参数\n  @$pb.TagNumber(2)\n  $core.String get updateBaseline => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set updateBaseline($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUpdateBaseline() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUpdateBaseline() => $_clearField(2);\n\n  /// 透传参数\n  @$pb.TagNumber(3)\n  $core.String get offset => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set offset($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasOffset() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearOffset() => $_clearField(3);\n\n  /// 向下翻页数\n  @$pb.TagNumber(4)\n  $core.int get page => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set page($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPage() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPage() => $_clearField(4);\n\n  /// 刷新方式\n  ///\n  /// - 1: 向上刷新\n  /// - 2: 向下翻页\n  @$pb.TagNumber(5)\n  $core.int get refreshType => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set refreshType($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasRefreshType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearRefreshType() => $_clearField(5);\n\n  /// 清晰度 (供秒开)\n  @$pb.TagNumber(6)\n  $core.int get qn => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set qn($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasQn() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearQn() => $_clearField(6);\n\n  /// 功能版本号 (供秒开)\n  @$pb.TagNumber(7)\n  $core.int get fnver => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set fnver($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasFnver() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearFnver() => $_clearField(7);\n\n  /// 功能标识 (供秒开)\n  @$pb.TagNumber(8)\n  $core.int get fnval => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set fnval($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasFnval() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearFnval() => $_clearField(8);\n\n  /// 返回 playurl 是否强制使用域名 (供秒开)\n  @$pb.TagNumber(9)\n  $core.int get forceHost => $_getIZ(8);\n  @$pb.TagNumber(9)\n  set forceHost($core.int value) => $_setSignedInt32(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasForceHost() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearForceHost() => $_clearField(9);\n\n  /// 是否需要 4K 视频 (供秒开)\n  @$pb.TagNumber(10)\n  $core.int get fourk => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set fourk($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasFourk() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearFourk() => $_clearField(10);\n}\n\n/// 动态视频页返回值\nclass DynVideoReqReply extends $pb.GeneratedMessage {\n  factory DynVideoReqReply({\n    $core.Iterable<DynamicItem>? list,\n    $core.int? updateNum,\n    $core.String? historyOffset,\n    $core.String? updateBaseline,\n    $core.int? hasMore,\n  }) {\n    final result = create();\n    if (list != null) result.list.addAll(list);\n    if (updateNum != null) result.updateNum = updateNum;\n    if (historyOffset != null) result.historyOffset = historyOffset;\n    if (updateBaseline != null) result.updateBaseline = updateBaseline;\n    if (hasMore != null) result.hasMore = hasMore;\n    return result;\n  }\n\n  DynVideoReqReply._();\n\n  factory DynVideoReqReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynVideoReqReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynVideoReqReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..pPM<DynamicItem>(1, _omitFieldNames ? '' : 'list',\n        subBuilder: DynamicItem.create)\n    ..aI(2, _omitFieldNames ? '' : 'updateNum')\n    ..aOS(3, _omitFieldNames ? '' : 'historyOffset')\n    ..aOS(4, _omitFieldNames ? '' : 'updateBaseline')\n    ..aI(5, _omitFieldNames ? '' : 'hasMore')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynVideoReqReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynVideoReqReply copyWith(void Function(DynVideoReqReply) updates) =>\n      super.copyWith((message) => updates(message as DynVideoReqReply))\n          as DynVideoReqReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynVideoReqReply create() => DynVideoReqReply._();\n  @$core.override\n  DynVideoReqReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynVideoReqReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynVideoReqReply>(create);\n  static DynVideoReqReply? _defaultInstance;\n\n  /// 动态列表\n  @$pb.TagNumber(1)\n  $pb.PbList<DynamicItem> get list => $_getList(0);\n\n  /// 更新的动态数\n  @$pb.TagNumber(2)\n  $core.int get updateNum => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set updateNum($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUpdateNum() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUpdateNum() => $_clearField(2);\n\n  /// 历史偏移\n  @$pb.TagNumber(3)\n  $core.String get historyOffset => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set historyOffset($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasHistoryOffset() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearHistoryOffset() => $_clearField(3);\n\n  /// 更新基础信息\n  @$pb.TagNumber(4)\n  $core.String get updateBaseline => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set updateBaseline($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUpdateBaseline() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUpdateBaseline() => $_clearField(4);\n\n  /// 是否还有更多\n  @$pb.TagNumber(5)\n  $core.int get hasMore => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set hasMore($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasHasMore() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearHasMore() => $_clearField(5);\n}\n\n/// 动态卡片项\nclass DynamicItem extends $pb.GeneratedMessage {\n  factory DynamicItem({\n    $core.String? cardType,\n    $core.String? itemType,\n    $core.Iterable<Module>? modules,\n    $core.String? dynIdStr,\n    $core.String? origDynIdStr,\n    $core.int? rType,\n    $core.int? hasFold,\n  }) {\n    final result = create();\n    if (cardType != null) result.cardType = cardType;\n    if (itemType != null) result.itemType = itemType;\n    if (modules != null) result.modules.addAll(modules);\n    if (dynIdStr != null) result.dynIdStr = dynIdStr;\n    if (origDynIdStr != null) result.origDynIdStr = origDynIdStr;\n    if (rType != null) result.rType = rType;\n    if (hasFold != null) result.hasFold = hasFold;\n    return result;\n  }\n\n  DynamicItem._();\n\n  factory DynamicItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynamicItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynamicItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'cardType')\n    ..aOS(2, _omitFieldNames ? '' : 'itemType')\n    ..pPM<Module>(3, _omitFieldNames ? '' : 'modules',\n        subBuilder: Module.create)\n    ..aOS(4, _omitFieldNames ? '' : 'dynIdStr')\n    ..aOS(5, _omitFieldNames ? '' : 'origDynIdStr')\n    ..aI(6, _omitFieldNames ? '' : 'rType')\n    ..aI(7, _omitFieldNames ? '' : 'hasFold')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynamicItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynamicItem copyWith(void Function(DynamicItem) updates) =>\n      super.copyWith((message) => updates(message as DynamicItem))\n          as DynamicItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynamicItem create() => DynamicItem._();\n  @$core.override\n  DynamicItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynamicItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynamicItem>(create);\n  static DynamicItem? _defaultInstance;\n\n  /// 动态卡片类型\n  ///\n  /// - 转发: `forward`\n  /// - 稿件视频: `av`\n  /// - 折叠: `fold`\n  /// - PGC 内容: `pgc`\n  /// - 付费视频: `courses`\n  /// - 最近访问列表: `upList`\n  /// - 我的追番列表: `followList`\n  @$pb.TagNumber(1)\n  $core.String get cardType => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set cardType($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCardType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCardType() => $_clearField(1);\n\n  /// 转发类型的 items 的类型\n  @$pb.TagNumber(2)\n  $core.String get itemType => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set itemType($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasItemType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearItemType() => $_clearField(2);\n\n  /// 模块内容\n  @$pb.TagNumber(3)\n  $pb.PbList<Module> get modules => $_getList(2);\n\n  /// 动态 ID (string)\n  @$pb.TagNumber(4)\n  $core.String get dynIdStr => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set dynIdStr($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDynIdStr() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDynIdStr() => $_clearField(4);\n\n  /// 转发源动态 ID(string)\n  @$pb.TagNumber(5)\n  $core.String get origDynIdStr => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set origDynIdStr($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasOrigDynIdStr() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearOrigDynIdStr() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get rType => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set rType($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasRType() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearRType() => $_clearField(6);\n\n  /// 该卡片下面是否含折叠卡片\n  @$pb.TagNumber(7)\n  $core.int get hasFold => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set hasFold($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasHasFold() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearHasFold() => $_clearField(7);\n}\n\nclass Exp extends $pb.GeneratedMessage {\n  factory Exp({\n    $core.String? expName,\n    $core.String? expGroup,\n  }) {\n    final result = create();\n    if (expName != null) result.expName = expName;\n    if (expGroup != null) result.expGroup = expGroup;\n    return result;\n  }\n\n  Exp._();\n\n  factory Exp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Exp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Exp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'expName')\n    ..aOS(2, _omitFieldNames ? '' : 'expGroup')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Exp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Exp copyWith(void Function(Exp) updates) =>\n      super.copyWith((message) => updates(message as Exp)) as Exp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Exp create() => Exp._();\n  @$core.override\n  Exp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Exp getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Exp>(create);\n  static Exp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get expName => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set expName($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasExpName() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearExpName() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get expGroup => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set expGroup($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasExpGroup() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearExpGroup() => $_clearField(2);\n}\n\nclass ExpConf extends $pb.GeneratedMessage {\n  factory ExpConf({\n    $core.int? expEnable,\n    $core.Iterable<Exp>? exps,\n  }) {\n    final result = create();\n    if (expEnable != null) result.expEnable = expEnable;\n    if (exps != null) result.exps.addAll(exps);\n    return result;\n  }\n\n  ExpConf._();\n\n  factory ExpConf.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ExpConf.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ExpConf',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'expEnable')\n    ..pPM<Exp>(2, _omitFieldNames ? '' : 'exps', subBuilder: Exp.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExpConf clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExpConf copyWith(void Function(ExpConf) updates) =>\n      super.copyWith((message) => updates(message as ExpConf)) as ExpConf;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ExpConf create() => ExpConf._();\n  @$core.override\n  ExpConf createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ExpConf getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ExpConf>(create);\n  static ExpConf? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get expEnable => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set expEnable($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasExpEnable() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearExpEnable() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<Exp> get exps => $_getList(1);\n}\n\n/// 拓展信息: 游戏小卡\nclass ExtInfoGame extends $pb.GeneratedMessage {\n  factory ExtInfoGame({\n    $core.String? title,\n    $core.String? uri,\n    $core.String? icon,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (uri != null) result.uri = uri;\n    if (icon != null) result.icon = icon;\n    return result;\n  }\n\n  ExtInfoGame._();\n\n  factory ExtInfoGame.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ExtInfoGame.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ExtInfoGame',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..aOS(3, _omitFieldNames ? '' : 'icon')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtInfoGame clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtInfoGame copyWith(void Function(ExtInfoGame) updates) =>\n      super.copyWith((message) => updates(message as ExtInfoGame))\n          as ExtInfoGame;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ExtInfoGame create() => ExtInfoGame._();\n  @$core.override\n  ExtInfoGame createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ExtInfoGame getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ExtInfoGame>(create);\n  static ExtInfoGame? _defaultInstance;\n\n  /// 标题\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  /// 跳转地址\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n\n  /// 图标\n  @$pb.TagNumber(3)\n  $core.String get icon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set icon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIcon() => $_clearField(3);\n}\n\n/// 拓展信息: 热门视频\nclass ExtInfoHot extends $pb.GeneratedMessage {\n  factory ExtInfoHot({\n    $core.String? title,\n    $core.String? uri,\n    $core.String? icon,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (uri != null) result.uri = uri;\n    if (icon != null) result.icon = icon;\n    return result;\n  }\n\n  ExtInfoHot._();\n\n  factory ExtInfoHot.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ExtInfoHot.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ExtInfoHot',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..aOS(3, _omitFieldNames ? '' : 'icon')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtInfoHot clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtInfoHot copyWith(void Function(ExtInfoHot) updates) =>\n      super.copyWith((message) => updates(message as ExtInfoHot)) as ExtInfoHot;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ExtInfoHot create() => ExtInfoHot._();\n  @$core.override\n  ExtInfoHot createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ExtInfoHot getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ExtInfoHot>(create);\n  static ExtInfoHot? _defaultInstance;\n\n  /// 标题\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  /// 跳转地址\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n\n  /// 图标\n  @$pb.TagNumber(3)\n  $core.String get icon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set icon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIcon() => $_clearField(3);\n}\n\n/// 拓展信息: LBS\nclass ExtInfoLBS extends $pb.GeneratedMessage {\n  factory ExtInfoLBS({\n    $core.String? title,\n    $core.String? uri,\n    $core.String? icon,\n    $core.int? poiType,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (uri != null) result.uri = uri;\n    if (icon != null) result.icon = icon;\n    if (poiType != null) result.poiType = poiType;\n    return result;\n  }\n\n  ExtInfoLBS._();\n\n  factory ExtInfoLBS.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ExtInfoLBS.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ExtInfoLBS',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..aOS(3, _omitFieldNames ? '' : 'icon')\n    ..aI(4, _omitFieldNames ? '' : 'poiType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtInfoLBS clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtInfoLBS copyWith(void Function(ExtInfoLBS) updates) =>\n      super.copyWith((message) => updates(message as ExtInfoLBS)) as ExtInfoLBS;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ExtInfoLBS create() => ExtInfoLBS._();\n  @$core.override\n  ExtInfoLBS createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ExtInfoLBS getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ExtInfoLBS>(create);\n  static ExtInfoLBS? _defaultInstance;\n\n  /// 标题\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  /// 跳转地址\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n\n  /// 图标\n  @$pb.TagNumber(3)\n  $core.String get icon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set icon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIcon() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get poiType => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set poiType($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPoiType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPoiType() => $_clearField(4);\n}\n\n/// 拓展信息: 话题小卡\nclass ExtInfoTopic extends $pb.GeneratedMessage {\n  factory ExtInfoTopic({\n    $core.String? title,\n    $core.String? uri,\n    $core.String? icon,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (uri != null) result.uri = uri;\n    if (icon != null) result.icon = icon;\n    return result;\n  }\n\n  ExtInfoTopic._();\n\n  factory ExtInfoTopic.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ExtInfoTopic.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ExtInfoTopic',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..aOS(3, _omitFieldNames ? '' : 'icon')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtInfoTopic clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtInfoTopic copyWith(void Function(ExtInfoTopic) updates) =>\n      super.copyWith((message) => updates(message as ExtInfoTopic))\n          as ExtInfoTopic;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ExtInfoTopic create() => ExtInfoTopic._();\n  @$core.override\n  ExtInfoTopic createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ExtInfoTopic getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ExtInfoTopic>(create);\n  static ExtInfoTopic? _defaultInstance;\n\n  /// 话题名\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  /// 跳转地址\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n\n  /// 图标\n  @$pb.TagNumber(3)\n  $core.String get icon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set icon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIcon() => $_clearField(3);\n}\n\nenum Extend_Extend { extInfoTopic, extInfoLbs, extInfoHot, extInfoGame, notSet }\n\n/// 拓展\nclass Extend extends $pb.GeneratedMessage {\n  factory Extend({\n    $core.String? type,\n    ExtInfoTopic? extInfoTopic,\n    ExtInfoLBS? extInfoLbs,\n    ExtInfoHot? extInfoHot,\n    ExtInfoGame? extInfoGame,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (extInfoTopic != null) result.extInfoTopic = extInfoTopic;\n    if (extInfoLbs != null) result.extInfoLbs = extInfoLbs;\n    if (extInfoHot != null) result.extInfoHot = extInfoHot;\n    if (extInfoGame != null) result.extInfoGame = extInfoGame;\n    return result;\n  }\n\n  Extend._();\n\n  factory Extend.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Extend.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, Extend_Extend> _Extend_ExtendByTag = {\n    2: Extend_Extend.extInfoTopic,\n    3: Extend_Extend.extInfoLbs,\n    4: Extend_Extend.extInfoHot,\n    5: Extend_Extend.extInfoGame,\n    0: Extend_Extend.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Extend',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [2, 3, 4, 5])\n    ..aOS(1, _omitFieldNames ? '' : 'type')\n    ..aOM<ExtInfoTopic>(2, _omitFieldNames ? '' : 'extInfoTopic',\n        subBuilder: ExtInfoTopic.create)\n    ..aOM<ExtInfoLBS>(3, _omitFieldNames ? '' : 'extInfoLbs',\n        subBuilder: ExtInfoLBS.create)\n    ..aOM<ExtInfoHot>(4, _omitFieldNames ? '' : 'extInfoHot',\n        subBuilder: ExtInfoHot.create)\n    ..aOM<ExtInfoGame>(5, _omitFieldNames ? '' : 'extInfoGame',\n        subBuilder: ExtInfoGame.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Extend clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Extend copyWith(void Function(Extend) updates) =>\n      super.copyWith((message) => updates(message as Extend)) as Extend;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Extend create() => Extend._();\n  @$core.override\n  Extend createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Extend getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Extend>(create);\n  static Extend? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  Extend_Extend whichExtend() => _Extend_ExtendByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  void clearExtend() => $_clearField($_whichOneof(0));\n\n  /// 类型\n  ///\n  /// - 话题小卡: `topic`\n  /// - lbs: `lbs`\n  /// - 热门视频: `hot`\n  /// - 游戏: `game`\n  @$pb.TagNumber(1)\n  $core.String get type => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set type($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  /// 参见 [`ExtInfoTopic`]\n  @$pb.TagNumber(2)\n  ExtInfoTopic get extInfoTopic => $_getN(1);\n  @$pb.TagNumber(2)\n  set extInfoTopic(ExtInfoTopic value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasExtInfoTopic() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearExtInfoTopic() => $_clearField(2);\n  @$pb.TagNumber(2)\n  ExtInfoTopic ensureExtInfoTopic() => $_ensure(1);\n\n  /// 参见 [`ExtInfoLBS`]\n  @$pb.TagNumber(3)\n  ExtInfoLBS get extInfoLbs => $_getN(2);\n  @$pb.TagNumber(3)\n  set extInfoLbs(ExtInfoLBS value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasExtInfoLbs() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearExtInfoLbs() => $_clearField(3);\n  @$pb.TagNumber(3)\n  ExtInfoLBS ensureExtInfoLbs() => $_ensure(2);\n\n  /// 参见 [`ExtInfoHot`]\n  @$pb.TagNumber(4)\n  ExtInfoHot get extInfoHot => $_getN(3);\n  @$pb.TagNumber(4)\n  set extInfoHot(ExtInfoHot value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasExtInfoHot() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearExtInfoHot() => $_clearField(4);\n  @$pb.TagNumber(4)\n  ExtInfoHot ensureExtInfoHot() => $_ensure(3);\n\n  /// 参见 [`ExtInfoGame`]\n  @$pb.TagNumber(5)\n  ExtInfoGame get extInfoGame => $_getN(4);\n  @$pb.TagNumber(5)\n  set extInfoGame(ExtInfoGame value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasExtInfoGame() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearExtInfoGame() => $_clearField(5);\n  @$pb.TagNumber(5)\n  ExtInfoGame ensureExtInfoGame() => $_ensure(4);\n}\n\n/// 我的追番列表项目\nclass FollowListItem extends $pb.GeneratedMessage {\n  factory FollowListItem({\n    $core.int? seasonId,\n    $core.String? title,\n    $core.String? cover,\n    $core.String? url,\n    NewEP? newEp,\n  }) {\n    final result = create();\n    if (seasonId != null) result.seasonId = seasonId;\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (url != null) result.url = url;\n    if (newEp != null) result.newEp = newEp;\n    return result;\n  }\n\n  FollowListItem._();\n\n  factory FollowListItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FollowListItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FollowListItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'seasonId')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'cover')\n    ..aOS(4, _omitFieldNames ? '' : 'url')\n    ..aOM<NewEP>(5, _omitFieldNames ? '' : 'newEp', subBuilder: NewEP.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FollowListItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FollowListItem copyWith(void Function(FollowListItem) updates) =>\n      super.copyWith((message) => updates(message as FollowListItem))\n          as FollowListItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FollowListItem create() => FollowListItem._();\n  @$core.override\n  FollowListItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FollowListItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FollowListItem>(create);\n  static FollowListItem? _defaultInstance;\n\n  /// 剧集 ID\n  @$pb.TagNumber(1)\n  $core.int get seasonId => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set seasonId($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSeasonId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSeasonId() => $_clearField(1);\n\n  /// 标题\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  /// 封面\n  @$pb.TagNumber(3)\n  $core.String get cover => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set cover($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCover() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCover() => $_clearField(3);\n\n  /// 跳转链接\n  @$pb.TagNumber(4)\n  $core.String get url => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set url($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUrl() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUrl() => $_clearField(4);\n\n  /// 剧集最新分集\n  @$pb.TagNumber(5)\n  NewEP get newEp => $_getN(4);\n  @$pb.TagNumber(5)\n  set newEp(NewEP value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasNewEp() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearNewEp() => $_clearField(5);\n  @$pb.TagNumber(5)\n  NewEP ensureNewEp() => $_ensure(4);\n}\n\nclass GeoCoderReply extends $pb.GeneratedMessage {\n  factory GeoCoderReply({\n    $core.String? address,\n    AddressComponent? addressComponent,\n    AdInfo? adInfo,\n  }) {\n    final result = create();\n    if (address != null) result.address = address;\n    if (addressComponent != null) result.addressComponent = addressComponent;\n    if (adInfo != null) result.adInfo = adInfo;\n    return result;\n  }\n\n  GeoCoderReply._();\n\n  factory GeoCoderReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory GeoCoderReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'GeoCoderReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'address')\n    ..aOM<AddressComponent>(2, _omitFieldNames ? '' : 'addressComponent',\n        subBuilder: AddressComponent.create)\n    ..aOM<AdInfo>(3, _omitFieldNames ? '' : 'adInfo', subBuilder: AdInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GeoCoderReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GeoCoderReply copyWith(void Function(GeoCoderReply) updates) =>\n      super.copyWith((message) => updates(message as GeoCoderReply))\n          as GeoCoderReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static GeoCoderReply create() => GeoCoderReply._();\n  @$core.override\n  GeoCoderReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static GeoCoderReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<GeoCoderReply>(create);\n  static GeoCoderReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get address => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set address($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAddress() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAddress() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  AddressComponent get addressComponent => $_getN(1);\n  @$pb.TagNumber(2)\n  set addressComponent(AddressComponent value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAddressComponent() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAddressComponent() => $_clearField(2);\n  @$pb.TagNumber(2)\n  AddressComponent ensureAddressComponent() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  AdInfo get adInfo => $_getN(2);\n  @$pb.TagNumber(3)\n  set adInfo(AdInfo value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAdInfo() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAdInfo() => $_clearField(3);\n  @$pb.TagNumber(3)\n  AdInfo ensureAdInfo() => $_ensure(2);\n}\n\nclass GeoCoderReq extends $pb.GeneratedMessage {\n  factory GeoCoderReq({\n    $core.double? lat,\n    $core.double? lng,\n    $core.String? from,\n  }) {\n    final result = create();\n    if (lat != null) result.lat = lat;\n    if (lng != null) result.lng = lng;\n    if (from != null) result.from = from;\n    return result;\n  }\n\n  GeoCoderReq._();\n\n  factory GeoCoderReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory GeoCoderReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'GeoCoderReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aD(1, _omitFieldNames ? '' : 'lat')\n    ..aD(2, _omitFieldNames ? '' : 'lng')\n    ..aOS(3, _omitFieldNames ? '' : 'from')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GeoCoderReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GeoCoderReq copyWith(void Function(GeoCoderReq) updates) =>\n      super.copyWith((message) => updates(message as GeoCoderReq))\n          as GeoCoderReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static GeoCoderReq create() => GeoCoderReq._();\n  @$core.override\n  GeoCoderReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static GeoCoderReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<GeoCoderReq>(create);\n  static GeoCoderReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.double get lat => $_getN(0);\n  @$pb.TagNumber(1)\n  set lat($core.double value) => $_setDouble(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLat() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLat() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.double get lng => $_getN(1);\n  @$pb.TagNumber(2)\n  set lng($core.double value) => $_setDouble(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLng() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLng() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get from => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set from($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFrom() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFrom() => $_clearField(3);\n}\n\nclass Gps extends $pb.GeneratedMessage {\n  factory Gps({\n    $core.double? lat,\n    $core.double? lng,\n  }) {\n    final result = create();\n    if (lat != null) result.lat = lat;\n    if (lng != null) result.lng = lng;\n    return result;\n  }\n\n  Gps._();\n\n  factory Gps.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Gps.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Gps',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aD(1, _omitFieldNames ? '' : 'lat')\n    ..aD(2, _omitFieldNames ? '' : 'lng')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Gps clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Gps copyWith(void Function(Gps) updates) =>\n      super.copyWith((message) => updates(message as Gps)) as Gps;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Gps create() => Gps._();\n  @$core.override\n  Gps createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Gps getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Gps>(create);\n  static Gps? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.double get lat => $_getN(0);\n  @$pb.TagNumber(1)\n  set lat($core.double value) => $_setDouble(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLat() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLat() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.double get lng => $_getN(1);\n  @$pb.TagNumber(2)\n  set lng($core.double value) => $_setDouble(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLng() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLng() => $_clearField(2);\n}\n\n/// 点赞动画\nclass LikeAnimation extends $pb.GeneratedMessage {\n  factory LikeAnimation({\n    $core.String? begin,\n    $core.String? proc,\n    $core.String? end,\n    $fixnum.Int64? likeIconId,\n  }) {\n    final result = create();\n    if (begin != null) result.begin = begin;\n    if (proc != null) result.proc = proc;\n    if (end != null) result.end = end;\n    if (likeIconId != null) result.likeIconId = likeIconId;\n    return result;\n  }\n\n  LikeAnimation._();\n\n  factory LikeAnimation.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LikeAnimation.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LikeAnimation',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'begin')\n    ..aOS(2, _omitFieldNames ? '' : 'proc')\n    ..aOS(3, _omitFieldNames ? '' : 'end')\n    ..aInt64(4, _omitFieldNames ? '' : 'likeIconId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeAnimation clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeAnimation copyWith(void Function(LikeAnimation) updates) =>\n      super.copyWith((message) => updates(message as LikeAnimation))\n          as LikeAnimation;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LikeAnimation create() => LikeAnimation._();\n  @$core.override\n  LikeAnimation createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LikeAnimation getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LikeAnimation>(create);\n  static LikeAnimation? _defaultInstance;\n\n  /// 开始动画\n  @$pb.TagNumber(1)\n  $core.String get begin => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set begin($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBegin() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBegin() => $_clearField(1);\n\n  /// 过程动画\n  @$pb.TagNumber(2)\n  $core.String get proc => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set proc($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasProc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearProc() => $_clearField(2);\n\n  /// 结束动画\n  @$pb.TagNumber(3)\n  $core.String get end => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set end($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasEnd() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearEnd() => $_clearField(3);\n\n  /// ID\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get likeIconId => $_getI64(3);\n  @$pb.TagNumber(4)\n  set likeIconId($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLikeIconId() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLikeIconId() => $_clearField(4);\n}\n\n/// 点赞拓展信息\nclass LikeInfo extends $pb.GeneratedMessage {\n  factory LikeInfo({\n    LikeAnimation? animation,\n    $core.int? isLike,\n  }) {\n    final result = create();\n    if (animation != null) result.animation = animation;\n    if (isLike != null) result.isLike = isLike;\n    return result;\n  }\n\n  LikeInfo._();\n\n  factory LikeInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LikeInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LikeInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOM<LikeAnimation>(1, _omitFieldNames ? '' : 'animation',\n        subBuilder: LikeAnimation.create)\n    ..aI(2, _omitFieldNames ? '' : 'isLike')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeInfo copyWith(void Function(LikeInfo) updates) =>\n      super.copyWith((message) => updates(message as LikeInfo)) as LikeInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LikeInfo create() => LikeInfo._();\n  @$core.override\n  LikeInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LikeInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<LikeInfo>(create);\n  static LikeInfo? _defaultInstance;\n\n  /// 点赞动画\n  @$pb.TagNumber(1)\n  LikeAnimation get animation => $_getN(0);\n  @$pb.TagNumber(1)\n  set animation(LikeAnimation value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAnimation() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAnimation() => $_clearField(1);\n  @$pb.TagNumber(1)\n  LikeAnimation ensureAnimation() => $_ensure(0);\n\n  /// 是否点赞\n  @$pb.TagNumber(2)\n  $core.int get isLike => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set isLike($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIsLike() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIsLike() => $_clearField(2);\n}\n\n/// 点赞用户\nclass LikeUser extends $pb.GeneratedMessage {\n  factory LikeUser({\n    $fixnum.Int64? uid,\n    $core.String? uname,\n    $core.String? uri,\n  }) {\n    final result = create();\n    if (uid != null) result.uid = uid;\n    if (uname != null) result.uname = uname;\n    if (uri != null) result.uri = uri;\n    return result;\n  }\n\n  LikeUser._();\n\n  factory LikeUser.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LikeUser.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LikeUser',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'uid')\n    ..aOS(2, _omitFieldNames ? '' : 'uname')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeUser clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeUser copyWith(void Function(LikeUser) updates) =>\n      super.copyWith((message) => updates(message as LikeUser)) as LikeUser;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LikeUser create() => LikeUser._();\n  @$core.override\n  LikeUser createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LikeUser getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<LikeUser>(create);\n  static LikeUser? _defaultInstance;\n\n  /// 点赞用户 mid\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get uid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set uid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUid() => $_clearField(1);\n\n  /// 点赞用户昵称\n  @$pb.TagNumber(2)\n  $core.String get uname => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uname($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUname() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUname() => $_clearField(2);\n\n  /// 点击跳转链接\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n}\n\n/// 直播信息\nclass LiveInfo extends $pb.GeneratedMessage {\n  factory LiveInfo({\n    $core.int? isLiving,\n    $core.String? uri,\n  }) {\n    final result = create();\n    if (isLiving != null) result.isLiving = isLiving;\n    if (uri != null) result.uri = uri;\n    return result;\n  }\n\n  LiveInfo._();\n\n  factory LiveInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LiveInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LiveInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'isLiving')\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LiveInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LiveInfo copyWith(void Function(LiveInfo) updates) =>\n      super.copyWith((message) => updates(message as LiveInfo)) as LiveInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LiveInfo create() => LiveInfo._();\n  @$core.override\n  LiveInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LiveInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<LiveInfo>(create);\n  static LiveInfo? _defaultInstance;\n\n  /// 正在直播\n  @$pb.TagNumber(1)\n  $core.int get isLiving => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set isLiving($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIsLiving() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIsLiving() => $_clearField(1);\n\n  /// 跳转地址\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n}\n\nclass MixUpListItem extends $pb.GeneratedMessage {\n  factory MixUpListItem({\n    $fixnum.Int64? uid,\n    $core.int? specialAttention,\n    $core.int? reddotState,\n    MixUpListLiveItem? liveInfo,\n    $core.String? name,\n    $core.String? face,\n    OfficialVerify? official,\n    VipInfo? vip,\n    Relation? relation,\n    $core.int? premiereState,\n    $core.String? uri,\n  }) {\n    final result = create();\n    if (uid != null) result.uid = uid;\n    if (specialAttention != null) result.specialAttention = specialAttention;\n    if (reddotState != null) result.reddotState = reddotState;\n    if (liveInfo != null) result.liveInfo = liveInfo;\n    if (name != null) result.name = name;\n    if (face != null) result.face = face;\n    if (official != null) result.official = official;\n    if (vip != null) result.vip = vip;\n    if (relation != null) result.relation = relation;\n    if (premiereState != null) result.premiereState = premiereState;\n    if (uri != null) result.uri = uri;\n    return result;\n  }\n\n  MixUpListItem._();\n\n  factory MixUpListItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MixUpListItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MixUpListItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'uid')\n    ..aI(2, _omitFieldNames ? '' : 'specialAttention')\n    ..aI(3, _omitFieldNames ? '' : 'reddotState')\n    ..aOM<MixUpListLiveItem>(4, _omitFieldNames ? '' : 'liveInfo',\n        subBuilder: MixUpListLiveItem.create)\n    ..aOS(5, _omitFieldNames ? '' : 'name')\n    ..aOS(6, _omitFieldNames ? '' : 'face')\n    ..aOM<OfficialVerify>(7, _omitFieldNames ? '' : 'official',\n        subBuilder: OfficialVerify.create)\n    ..aOM<VipInfo>(8, _omitFieldNames ? '' : 'vip', subBuilder: VipInfo.create)\n    ..aOM<Relation>(9, _omitFieldNames ? '' : 'relation',\n        subBuilder: Relation.create)\n    ..aI(10, _omitFieldNames ? '' : 'premiereState')\n    ..aOS(11, _omitFieldNames ? '' : 'uri')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MixUpListItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MixUpListItem copyWith(void Function(MixUpListItem) updates) =>\n      super.copyWith((message) => updates(message as MixUpListItem))\n          as MixUpListItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MixUpListItem create() => MixUpListItem._();\n  @$core.override\n  MixUpListItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MixUpListItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MixUpListItem>(create);\n  static MixUpListItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get uid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set uid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get specialAttention => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set specialAttention($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSpecialAttention() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSpecialAttention() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get reddotState => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set reddotState($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasReddotState() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearReddotState() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  MixUpListLiveItem get liveInfo => $_getN(3);\n  @$pb.TagNumber(4)\n  set liveInfo(MixUpListLiveItem value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLiveInfo() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLiveInfo() => $_clearField(4);\n  @$pb.TagNumber(4)\n  MixUpListLiveItem ensureLiveInfo() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.String get name => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set name($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasName() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearName() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get face => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set face($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasFace() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearFace() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  OfficialVerify get official => $_getN(6);\n  @$pb.TagNumber(7)\n  set official(OfficialVerify value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasOfficial() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearOfficial() => $_clearField(7);\n  @$pb.TagNumber(7)\n  OfficialVerify ensureOfficial() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  VipInfo get vip => $_getN(7);\n  @$pb.TagNumber(8)\n  set vip(VipInfo value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasVip() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearVip() => $_clearField(8);\n  @$pb.TagNumber(8)\n  VipInfo ensureVip() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  Relation get relation => $_getN(8);\n  @$pb.TagNumber(9)\n  set relation(Relation value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasRelation() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearRelation() => $_clearField(9);\n  @$pb.TagNumber(9)\n  Relation ensureRelation() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  $core.int get premiereState => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set premiereState($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasPremiereState() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearPremiereState() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get uri => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set uri($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasUri() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearUri() => $_clearField(11);\n}\n\nclass MixUpListLiveItem extends $pb.GeneratedMessage {\n  factory MixUpListLiveItem({\n    $core.bool? status,\n    $fixnum.Int64? roomId,\n    $core.String? uri,\n  }) {\n    final result = create();\n    if (status != null) result.status = status;\n    if (roomId != null) result.roomId = roomId;\n    if (uri != null) result.uri = uri;\n    return result;\n  }\n\n  MixUpListLiveItem._();\n\n  factory MixUpListLiveItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MixUpListLiveItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MixUpListLiveItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'status')\n    ..aInt64(2, _omitFieldNames ? '' : 'roomId')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MixUpListLiveItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MixUpListLiveItem copyWith(void Function(MixUpListLiveItem) updates) =>\n      super.copyWith((message) => updates(message as MixUpListLiveItem))\n          as MixUpListLiveItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MixUpListLiveItem create() => MixUpListLiveItem._();\n  @$core.override\n  MixUpListLiveItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MixUpListLiveItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MixUpListLiveItem>(create);\n  static MixUpListLiveItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get status => $_getBF(0);\n  @$pb.TagNumber(1)\n  set status($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStatus() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStatus() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get roomId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set roomId($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasRoomId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRoomId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n}\n\nenum Module_ModuleItem {\n  moduleFold,\n  moduleAuthor,\n  moduleDynamic,\n  moduleState,\n  moduleForward,\n  moduleExtend,\n  moduleDispute,\n  moduleDesc,\n  moduleLikeUser,\n  moduleUpList,\n  moduleFollowList,\n  notSet\n}\n\n/// 卡片模块\nclass Module extends $pb.GeneratedMessage {\n  factory Module({\n    $core.String? moduleType,\n    ModuleFold? moduleFold,\n    ModuleAuthor? moduleAuthor,\n    ModuleDynamic? moduleDynamic,\n    ModuleState? moduleState,\n    ModuleForward? moduleForward,\n    ModuleExtend? moduleExtend,\n    ModuleDispute? moduleDispute,\n    ModuleDesc? moduleDesc,\n    ModuleLikeUser? moduleLikeUser,\n    ModuleDynUpList? moduleUpList,\n    ModuleFollowList? moduleFollowList,\n  }) {\n    final result = create();\n    if (moduleType != null) result.moduleType = moduleType;\n    if (moduleFold != null) result.moduleFold = moduleFold;\n    if (moduleAuthor != null) result.moduleAuthor = moduleAuthor;\n    if (moduleDynamic != null) result.moduleDynamic = moduleDynamic;\n    if (moduleState != null) result.moduleState = moduleState;\n    if (moduleForward != null) result.moduleForward = moduleForward;\n    if (moduleExtend != null) result.moduleExtend = moduleExtend;\n    if (moduleDispute != null) result.moduleDispute = moduleDispute;\n    if (moduleDesc != null) result.moduleDesc = moduleDesc;\n    if (moduleLikeUser != null) result.moduleLikeUser = moduleLikeUser;\n    if (moduleUpList != null) result.moduleUpList = moduleUpList;\n    if (moduleFollowList != null) result.moduleFollowList = moduleFollowList;\n    return result;\n  }\n\n  Module._();\n\n  factory Module.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Module.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, Module_ModuleItem> _Module_ModuleItemByTag =\n      {\n    2: Module_ModuleItem.moduleFold,\n    3: Module_ModuleItem.moduleAuthor,\n    4: Module_ModuleItem.moduleDynamic,\n    5: Module_ModuleItem.moduleState,\n    6: Module_ModuleItem.moduleForward,\n    7: Module_ModuleItem.moduleExtend,\n    8: Module_ModuleItem.moduleDispute,\n    9: Module_ModuleItem.moduleDesc,\n    10: Module_ModuleItem.moduleLikeUser,\n    11: Module_ModuleItem.moduleUpList,\n    12: Module_ModuleItem.moduleFollowList,\n    0: Module_ModuleItem.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Module',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])\n    ..aOS(1, _omitFieldNames ? '' : 'moduleType')\n    ..aOM<ModuleFold>(2, _omitFieldNames ? '' : 'moduleFold',\n        subBuilder: ModuleFold.create)\n    ..aOM<ModuleAuthor>(3, _omitFieldNames ? '' : 'moduleAuthor',\n        subBuilder: ModuleAuthor.create)\n    ..aOM<ModuleDynamic>(4, _omitFieldNames ? '' : 'moduleDynamic',\n        subBuilder: ModuleDynamic.create)\n    ..aOM<ModuleState>(5, _omitFieldNames ? '' : 'moduleState',\n        subBuilder: ModuleState.create)\n    ..aOM<ModuleForward>(6, _omitFieldNames ? '' : 'moduleForward',\n        subBuilder: ModuleForward.create)\n    ..aOM<ModuleExtend>(7, _omitFieldNames ? '' : 'moduleExtend',\n        subBuilder: ModuleExtend.create)\n    ..aOM<ModuleDispute>(8, _omitFieldNames ? '' : 'moduleDispute',\n        subBuilder: ModuleDispute.create)\n    ..aOM<ModuleDesc>(9, _omitFieldNames ? '' : 'moduleDesc',\n        subBuilder: ModuleDesc.create)\n    ..aOM<ModuleLikeUser>(10, _omitFieldNames ? '' : 'moduleLikeUser',\n        subBuilder: ModuleLikeUser.create)\n    ..aOM<ModuleDynUpList>(11, _omitFieldNames ? '' : 'moduleUpList',\n        subBuilder: ModuleDynUpList.create)\n    ..aOM<ModuleFollowList>(12, _omitFieldNames ? '' : 'moduleFollowList',\n        subBuilder: ModuleFollowList.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Module clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Module copyWith(void Function(Module) updates) =>\n      super.copyWith((message) => updates(message as Module)) as Module;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Module create() => Module._();\n  @$core.override\n  Module createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Module getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Module>(create);\n  static Module? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(7)\n  @$pb.TagNumber(8)\n  @$pb.TagNumber(9)\n  @$pb.TagNumber(10)\n  @$pb.TagNumber(11)\n  @$pb.TagNumber(12)\n  Module_ModuleItem whichModuleItem() =>\n      _Module_ModuleItemByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(7)\n  @$pb.TagNumber(8)\n  @$pb.TagNumber(9)\n  @$pb.TagNumber(10)\n  @$pb.TagNumber(11)\n  @$pb.TagNumber(12)\n  void clearModuleItem() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  $core.String get moduleType => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set moduleType($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasModuleType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearModuleType() => $_clearField(1);\n\n  /// 参见 [`ModuleFold`]\n  @$pb.TagNumber(2)\n  ModuleFold get moduleFold => $_getN(1);\n  @$pb.TagNumber(2)\n  set moduleFold(ModuleFold value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasModuleFold() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearModuleFold() => $_clearField(2);\n  @$pb.TagNumber(2)\n  ModuleFold ensureModuleFold() => $_ensure(1);\n\n  /// 参见 [`ModuleAuthor`]\n  @$pb.TagNumber(3)\n  ModuleAuthor get moduleAuthor => $_getN(2);\n  @$pb.TagNumber(3)\n  set moduleAuthor(ModuleAuthor value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasModuleAuthor() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearModuleAuthor() => $_clearField(3);\n  @$pb.TagNumber(3)\n  ModuleAuthor ensureModuleAuthor() => $_ensure(2);\n\n  /// 参见 [`ModuleDynamic`]\n  @$pb.TagNumber(4)\n  ModuleDynamic get moduleDynamic => $_getN(3);\n  @$pb.TagNumber(4)\n  set moduleDynamic(ModuleDynamic value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasModuleDynamic() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearModuleDynamic() => $_clearField(4);\n  @$pb.TagNumber(4)\n  ModuleDynamic ensureModuleDynamic() => $_ensure(3);\n\n  /// 参见 [`ModuleState`]\n  @$pb.TagNumber(5)\n  ModuleState get moduleState => $_getN(4);\n  @$pb.TagNumber(5)\n  set moduleState(ModuleState value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasModuleState() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearModuleState() => $_clearField(5);\n  @$pb.TagNumber(5)\n  ModuleState ensureModuleState() => $_ensure(4);\n\n  /// 参见 [`ModuleForward`]\n  @$pb.TagNumber(6)\n  ModuleForward get moduleForward => $_getN(5);\n  @$pb.TagNumber(6)\n  set moduleForward(ModuleForward value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasModuleForward() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearModuleForward() => $_clearField(6);\n  @$pb.TagNumber(6)\n  ModuleForward ensureModuleForward() => $_ensure(5);\n\n  /// 参见 [`ModuleExtend`]\n  @$pb.TagNumber(7)\n  ModuleExtend get moduleExtend => $_getN(6);\n  @$pb.TagNumber(7)\n  set moduleExtend(ModuleExtend value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasModuleExtend() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearModuleExtend() => $_clearField(7);\n  @$pb.TagNumber(7)\n  ModuleExtend ensureModuleExtend() => $_ensure(6);\n\n  /// 参见 [`ModuleDispute`]\n  @$pb.TagNumber(8)\n  ModuleDispute get moduleDispute => $_getN(7);\n  @$pb.TagNumber(8)\n  set moduleDispute(ModuleDispute value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasModuleDispute() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearModuleDispute() => $_clearField(8);\n  @$pb.TagNumber(8)\n  ModuleDispute ensureModuleDispute() => $_ensure(7);\n\n  /// 参见 [`ModuleDesc`]\n  @$pb.TagNumber(9)\n  ModuleDesc get moduleDesc => $_getN(8);\n  @$pb.TagNumber(9)\n  set moduleDesc(ModuleDesc value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasModuleDesc() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearModuleDesc() => $_clearField(9);\n  @$pb.TagNumber(9)\n  ModuleDesc ensureModuleDesc() => $_ensure(8);\n\n  /// 参见 [`ModuleLikeUser`]\n  @$pb.TagNumber(10)\n  ModuleLikeUser get moduleLikeUser => $_getN(9);\n  @$pb.TagNumber(10)\n  set moduleLikeUser(ModuleLikeUser value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasModuleLikeUser() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearModuleLikeUser() => $_clearField(10);\n  @$pb.TagNumber(10)\n  ModuleLikeUser ensureModuleLikeUser() => $_ensure(9);\n\n  /// 参见 [`ModuleDynUpList`]\n  @$pb.TagNumber(11)\n  ModuleDynUpList get moduleUpList => $_getN(10);\n  @$pb.TagNumber(11)\n  set moduleUpList(ModuleDynUpList value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasModuleUpList() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearModuleUpList() => $_clearField(11);\n  @$pb.TagNumber(11)\n  ModuleDynUpList ensureModuleUpList() => $_ensure(10);\n\n  /// 参见 [`ModuleFollowList`]\n  @$pb.TagNumber(12)\n  ModuleFollowList get moduleFollowList => $_getN(11);\n  @$pb.TagNumber(12)\n  set moduleFollowList(ModuleFollowList value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasModuleFollowList() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearModuleFollowList() => $_clearField(12);\n  @$pb.TagNumber(12)\n  ModuleFollowList ensureModuleFollowList() => $_ensure(11);\n}\n\n/// Module: 作者信息\nclass ModuleAuthor extends $pb.GeneratedMessage {\n  factory ModuleAuthor({\n    $fixnum.Int64? id,\n    $core.String? ptimeLabelText,\n    UserInfo? author,\n    DecorateCard? decorateCard,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (ptimeLabelText != null) result.ptimeLabelText = ptimeLabelText;\n    if (author != null) result.author = author;\n    if (decorateCard != null) result.decorateCard = decorateCard;\n    return result;\n  }\n\n  ModuleAuthor._();\n\n  factory ModuleAuthor.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleAuthor.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleAuthor',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'ptimeLabelText')\n    ..aOM<UserInfo>(3, _omitFieldNames ? '' : 'author',\n        subBuilder: UserInfo.create)\n    ..aOM<DecorateCard>(4, _omitFieldNames ? '' : 'decorateCard',\n        subBuilder: DecorateCard.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleAuthor clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleAuthor copyWith(void Function(ModuleAuthor) updates) =>\n      super.copyWith((message) => updates(message as ModuleAuthor))\n          as ModuleAuthor;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleAuthor create() => ModuleAuthor._();\n  @$core.override\n  ModuleAuthor createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleAuthor getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleAuthor>(create);\n  static ModuleAuthor? _defaultInstance;\n\n  /// 作者 mid\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  /// 时间标签\n  @$pb.TagNumber(2)\n  $core.String get ptimeLabelText => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set ptimeLabelText($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPtimeLabelText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPtimeLabelText() => $_clearField(2);\n\n  /// 用户详情\n  @$pb.TagNumber(3)\n  UserInfo get author => $_getN(2);\n  @$pb.TagNumber(3)\n  set author(UserInfo value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAuthor() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAuthor() => $_clearField(3);\n  @$pb.TagNumber(3)\n  UserInfo ensureAuthor() => $_ensure(2);\n\n  /// 装扮卡片\n  @$pb.TagNumber(4)\n  DecorateCard get decorateCard => $_getN(3);\n  @$pb.TagNumber(4)\n  set decorateCard(DecorateCard value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDecorateCard() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDecorateCard() => $_clearField(4);\n  @$pb.TagNumber(4)\n  DecorateCard ensureDecorateCard() => $_ensure(3);\n}\n\n/// Module: 文本内容\nclass ModuleDesc extends $pb.GeneratedMessage {\n  factory ModuleDesc({\n    $core.Iterable<Description>? desc,\n  }) {\n    final result = create();\n    if (desc != null) result.desc.addAll(desc);\n    return result;\n  }\n\n  ModuleDesc._();\n\n  factory ModuleDesc.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleDesc.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleDesc',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..pPM<Description>(1, _omitFieldNames ? '' : 'desc',\n        subBuilder: Description.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleDesc clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleDesc copyWith(void Function(ModuleDesc) updates) =>\n      super.copyWith((message) => updates(message as ModuleDesc)) as ModuleDesc;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleDesc create() => ModuleDesc._();\n  @$core.override\n  ModuleDesc createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleDesc getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleDesc>(create);\n  static ModuleDesc? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<Description> get desc => $_getList(0);\n}\n\n/// Module: 争议小黄条\nclass ModuleDispute extends $pb.GeneratedMessage {\n  factory ModuleDispute({\n    $core.String? title,\n    $core.String? desc,\n    $core.String? uri,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (desc != null) result.desc = desc;\n    if (uri != null) result.uri = uri;\n    return result;\n  }\n\n  ModuleDispute._();\n\n  factory ModuleDispute.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleDispute.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleDispute',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'desc')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleDispute clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleDispute copyWith(void Function(ModuleDispute) updates) =>\n      super.copyWith((message) => updates(message as ModuleDispute))\n          as ModuleDispute;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleDispute create() => ModuleDispute._();\n  @$core.override\n  ModuleDispute createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleDispute getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleDispute>(create);\n  static ModuleDispute? _defaultInstance;\n\n  /// 标题\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  /// 描述\n  @$pb.TagNumber(2)\n  $core.String get desc => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set desc($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDesc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDesc() => $_clearField(2);\n\n  /// 跳转地址\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n}\n\n/// 最近访问 UP 主列表\nclass ModuleDynUpList extends $pb.GeneratedMessage {\n  factory ModuleDynUpList({\n    $core.String? moduleTitle,\n    $core.String? showAll,\n    $core.Iterable<UpListItem>? list,\n  }) {\n    final result = create();\n    if (moduleTitle != null) result.moduleTitle = moduleTitle;\n    if (showAll != null) result.showAll = showAll;\n    if (list != null) result.list.addAll(list);\n    return result;\n  }\n\n  ModuleDynUpList._();\n\n  factory ModuleDynUpList.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleDynUpList.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleDynUpList',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'moduleTitle')\n    ..aOS(2, _omitFieldNames ? '' : 'showAll')\n    ..pPM<UpListItem>(3, _omitFieldNames ? '' : 'list',\n        subBuilder: UpListItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleDynUpList clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleDynUpList copyWith(void Function(ModuleDynUpList) updates) =>\n      super.copyWith((message) => updates(message as ModuleDynUpList))\n          as ModuleDynUpList;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleDynUpList create() => ModuleDynUpList._();\n  @$core.override\n  ModuleDynUpList createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleDynUpList getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleDynUpList>(create);\n  static ModuleDynUpList? _defaultInstance;\n\n  /// 标题展示文案\n  @$pb.TagNumber(1)\n  $core.String get moduleTitle => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set moduleTitle($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasModuleTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearModuleTitle() => $_clearField(1);\n\n  /// \"全部\" 按钮文案\n  @$pb.TagNumber(2)\n  $core.String get showAll => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set showAll($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasShowAll() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearShowAll() => $_clearField(2);\n\n  /// UP 主列表\n  @$pb.TagNumber(3)\n  $pb.PbList<UpListItem> get list => $_getList(2);\n}\n\nenum ModuleDynamic_Card {\n  cardUgc,\n  cardPgc,\n  cardCurrSeason,\n  cardCurrBatch,\n  notSet\n}\n\n/// Module: 动态详情\nclass ModuleDynamic extends $pb.GeneratedMessage {\n  factory ModuleDynamic({\n    $core.String? cardType,\n    CardUGC? cardUgc,\n    CardPGC? cardPgc,\n    CardCurrSeason? cardCurrSeason,\n    CardCurrBatch? cardCurrBatch,\n  }) {\n    final result = create();\n    if (cardType != null) result.cardType = cardType;\n    if (cardUgc != null) result.cardUgc = cardUgc;\n    if (cardPgc != null) result.cardPgc = cardPgc;\n    if (cardCurrSeason != null) result.cardCurrSeason = cardCurrSeason;\n    if (cardCurrBatch != null) result.cardCurrBatch = cardCurrBatch;\n    return result;\n  }\n\n  ModuleDynamic._();\n\n  factory ModuleDynamic.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleDynamic.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, ModuleDynamic_Card>\n      _ModuleDynamic_CardByTag = {\n    2: ModuleDynamic_Card.cardUgc,\n    3: ModuleDynamic_Card.cardPgc,\n    4: ModuleDynamic_Card.cardCurrSeason,\n    5: ModuleDynamic_Card.cardCurrBatch,\n    0: ModuleDynamic_Card.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleDynamic',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [2, 3, 4, 5])\n    ..aOS(1, _omitFieldNames ? '' : 'cardType')\n    ..aOM<CardUGC>(2, _omitFieldNames ? '' : 'cardUgc',\n        subBuilder: CardUGC.create)\n    ..aOM<CardPGC>(3, _omitFieldNames ? '' : 'cardPgc',\n        subBuilder: CardPGC.create)\n    ..aOM<CardCurrSeason>(4, _omitFieldNames ? '' : 'cardCurrSeason',\n        subBuilder: CardCurrSeason.create)\n    ..aOM<CardCurrBatch>(5, _omitFieldNames ? '' : 'cardCurrBatch',\n        subBuilder: CardCurrBatch.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleDynamic clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleDynamic copyWith(void Function(ModuleDynamic) updates) =>\n      super.copyWith((message) => updates(message as ModuleDynamic))\n          as ModuleDynamic;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleDynamic create() => ModuleDynamic._();\n  @$core.override\n  ModuleDynamic createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleDynamic getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleDynamic>(create);\n  static ModuleDynamic? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  ModuleDynamic_Card whichCard() => _ModuleDynamic_CardByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  void clearCard() => $_clearField($_whichOneof(0));\n\n  /// 动态卡片类型\n  ///\n  /// - UGC 视频卡片: `ugc`\n  /// - PGC 视频卡片: `pgc`\n  /// - 付费课程系列: `currSeason`\n  /// - 付费课程批次: `currBatch`\n  @$pb.TagNumber(1)\n  $core.String get cardType => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set cardType($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCardType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCardType() => $_clearField(1);\n\n  /// UGC 视频卡片\n  @$pb.TagNumber(2)\n  CardUGC get cardUgc => $_getN(1);\n  @$pb.TagNumber(2)\n  set cardUgc(CardUGC value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCardUgc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCardUgc() => $_clearField(2);\n  @$pb.TagNumber(2)\n  CardUGC ensureCardUgc() => $_ensure(1);\n\n  /// PGC 视频卡片\n  @$pb.TagNumber(3)\n  CardPGC get cardPgc => $_getN(2);\n  @$pb.TagNumber(3)\n  set cardPgc(CardPGC value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCardPgc() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCardPgc() => $_clearField(3);\n  @$pb.TagNumber(3)\n  CardPGC ensureCardPgc() => $_ensure(2);\n\n  /// 付费课程系列\n  @$pb.TagNumber(4)\n  CardCurrSeason get cardCurrSeason => $_getN(3);\n  @$pb.TagNumber(4)\n  set cardCurrSeason(CardCurrSeason value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCardCurrSeason() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCardCurrSeason() => $_clearField(4);\n  @$pb.TagNumber(4)\n  CardCurrSeason ensureCardCurrSeason() => $_ensure(3);\n\n  /// 付费课程批次\n  @$pb.TagNumber(5)\n  CardCurrBatch get cardCurrBatch => $_getN(4);\n  @$pb.TagNumber(5)\n  set cardCurrBatch(CardCurrBatch value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCardCurrBatch() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCardCurrBatch() => $_clearField(5);\n  @$pb.TagNumber(5)\n  CardCurrBatch ensureCardCurrBatch() => $_ensure(4);\n}\n\n/// Module: 拓展\nclass ModuleExtend extends $pb.GeneratedMessage {\n  factory ModuleExtend({\n    $core.Iterable<Extend>? extend,\n  }) {\n    final result = create();\n    if (extend != null) result.extend.addAll(extend);\n    return result;\n  }\n\n  ModuleExtend._();\n\n  factory ModuleExtend.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleExtend.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleExtend',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..pPM<Extend>(1, _omitFieldNames ? '' : 'extend', subBuilder: Extend.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleExtend clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleExtend copyWith(void Function(ModuleExtend) updates) =>\n      super.copyWith((message) => updates(message as ModuleExtend))\n          as ModuleExtend;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleExtend create() => ModuleExtend._();\n  @$core.override\n  ModuleExtend createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleExtend getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleExtend>(create);\n  static ModuleExtend? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<Extend> get extend => $_getList(0);\n}\n\n/// Module: 折叠\nclass ModuleFold extends $pb.GeneratedMessage {\n  factory ModuleFold({\n    FoldType? foldType,\n    $core.String? text,\n    $core.String? foldIds,\n    $core.Iterable<UserInfo>? foldUsers,\n    FoldType? foldTypeV2,\n  }) {\n    final result = create();\n    if (foldType != null) result.foldType = foldType;\n    if (text != null) result.text = text;\n    if (foldIds != null) result.foldIds = foldIds;\n    if (foldUsers != null) result.foldUsers.addAll(foldUsers);\n    if (foldTypeV2 != null) result.foldTypeV2 = foldTypeV2;\n    return result;\n  }\n\n  ModuleFold._();\n\n  factory ModuleFold.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleFold.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleFold',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aE<FoldType>(1, _omitFieldNames ? '' : 'foldType',\n        enumValues: FoldType.values)\n    ..aOS(2, _omitFieldNames ? '' : 'text')\n    ..aOS(3, _omitFieldNames ? '' : 'foldIds')\n    ..pPM<UserInfo>(4, _omitFieldNames ? '' : 'foldUsers',\n        subBuilder: UserInfo.create)\n    ..aE<FoldType>(5, _omitFieldNames ? '' : 'foldTypeV2',\n        enumValues: FoldType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleFold clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleFold copyWith(void Function(ModuleFold) updates) =>\n      super.copyWith((message) => updates(message as ModuleFold)) as ModuleFold;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleFold create() => ModuleFold._();\n  @$core.override\n  ModuleFold createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleFold getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleFold>(create);\n  static ModuleFold? _defaultInstance;\n\n  /// Deprecated, see [`Self::fold_type_v2`] instead.\n  @$pb.TagNumber(1)\n  FoldType get foldType => $_getN(0);\n  @$pb.TagNumber(1)\n  set foldType(FoldType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFoldType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFoldType() => $_clearField(1);\n\n  /// 折叠文案\n  @$pb.TagNumber(2)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n\n  /// 被折叠的动态\n  @$pb.TagNumber(3)\n  $core.String get foldIds => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set foldIds($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFoldIds() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFoldIds() => $_clearField(3);\n\n  /// 被折叠的用户\n  @$pb.TagNumber(4)\n  $pb.PbList<UserInfo> get foldUsers => $_getList(3);\n\n  /// 折叠分类\n  @$pb.TagNumber(5)\n  FoldType get foldTypeV2 => $_getN(4);\n  @$pb.TagNumber(5)\n  set foldTypeV2(FoldType value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasFoldTypeV2() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearFoldTypeV2() => $_clearField(5);\n}\n\n/// 我的追番列表\nclass ModuleFollowList extends $pb.GeneratedMessage {\n  factory ModuleFollowList({\n    $core.String? viewAllLink,\n    $core.Iterable<FollowListItem>? list,\n  }) {\n    final result = create();\n    if (viewAllLink != null) result.viewAllLink = viewAllLink;\n    if (list != null) result.list.addAll(list);\n    return result;\n  }\n\n  ModuleFollowList._();\n\n  factory ModuleFollowList.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleFollowList.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleFollowList',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'viewAllLink')\n    ..pPM<FollowListItem>(2, _omitFieldNames ? '' : 'list',\n        subBuilder: FollowListItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleFollowList clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleFollowList copyWith(void Function(ModuleFollowList) updates) =>\n      super.copyWith((message) => updates(message as ModuleFollowList))\n          as ModuleFollowList;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleFollowList create() => ModuleFollowList._();\n  @$core.override\n  ModuleFollowList createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleFollowList getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleFollowList>(create);\n  static ModuleFollowList? _defaultInstance;\n\n  /// 查看全部的跳转链接\n  @$pb.TagNumber(1)\n  $core.String get viewAllLink => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set viewAllLink($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasViewAllLink() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearViewAllLink() => $_clearField(1);\n\n  /// 参见 [`FollowListItem`]\n  @$pb.TagNumber(2)\n  $pb.PbList<FollowListItem> get list => $_getList(1);\n}\n\n/// Module: 转发\nclass ModuleForward extends $pb.GeneratedMessage {\n  factory ModuleForward({\n    $core.String? cardType,\n    $core.Iterable<Module>? modules,\n  }) {\n    final result = create();\n    if (cardType != null) result.cardType = cardType;\n    if (modules != null) result.modules.addAll(modules);\n    return result;\n  }\n\n  ModuleForward._();\n\n  factory ModuleForward.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleForward.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleForward',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'cardType')\n    ..pPM<Module>(2, _omitFieldNames ? '' : 'modules',\n        subBuilder: Module.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleForward clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleForward copyWith(void Function(ModuleForward) updates) =>\n      super.copyWith((message) => updates(message as ModuleForward))\n          as ModuleForward;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleForward create() => ModuleForward._();\n  @$core.override\n  ModuleForward createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleForward getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleForward>(create);\n  static ModuleForward? _defaultInstance;\n\n  /// 卡片类型\n  @$pb.TagNumber(1)\n  $core.String get cardType => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set cardType($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCardType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCardType() => $_clearField(1);\n\n  /// 嵌套的 modules\n  @$pb.TagNumber(2)\n  $pb.PbList<Module> get modules => $_getList(1);\n}\n\n/// Module: 点赞用户\nclass ModuleLikeUser extends $pb.GeneratedMessage {\n  factory ModuleLikeUser({\n    $core.Iterable<LikeUser>? likeUsers,\n    $core.String? displayText,\n  }) {\n    final result = create();\n    if (likeUsers != null) result.likeUsers.addAll(likeUsers);\n    if (displayText != null) result.displayText = displayText;\n    return result;\n  }\n\n  ModuleLikeUser._();\n\n  factory ModuleLikeUser.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleLikeUser.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleLikeUser',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..pPM<LikeUser>(1, _omitFieldNames ? '' : 'likeUsers',\n        subBuilder: LikeUser.create)\n    ..aOS(2, _omitFieldNames ? '' : 'displayText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleLikeUser clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleLikeUser copyWith(void Function(ModuleLikeUser) updates) =>\n      super.copyWith((message) => updates(message as ModuleLikeUser))\n          as ModuleLikeUser;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleLikeUser create() => ModuleLikeUser._();\n  @$core.override\n  ModuleLikeUser createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleLikeUser getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleLikeUser>(create);\n  static ModuleLikeUser? _defaultInstance;\n\n  /// 点赞用户\n  @$pb.TagNumber(1)\n  $pb.PbList<LikeUser> get likeUsers => $_getList(0);\n\n  /// 文案\n  @$pb.TagNumber(2)\n  $core.String get displayText => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set displayText($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDisplayText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDisplayText() => $_clearField(2);\n}\n\n/// Module: 计数状态\nclass ModuleState extends $pb.GeneratedMessage {\n  factory ModuleState({\n    $core.int? repost,\n    $core.int? like,\n    $core.int? reply,\n    LikeInfo? likeInfo,\n    $core.bool? noComment,\n    $core.bool? noForward,\n  }) {\n    final result = create();\n    if (repost != null) result.repost = repost;\n    if (like != null) result.like = like;\n    if (reply != null) result.reply = reply;\n    if (likeInfo != null) result.likeInfo = likeInfo;\n    if (noComment != null) result.noComment = noComment;\n    if (noForward != null) result.noForward = noForward;\n    return result;\n  }\n\n  ModuleState._();\n\n  factory ModuleState.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleState.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleState',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'repost')\n    ..aI(2, _omitFieldNames ? '' : 'like')\n    ..aI(3, _omitFieldNames ? '' : 'reply')\n    ..aOM<LikeInfo>(4, _omitFieldNames ? '' : 'likeInfo',\n        subBuilder: LikeInfo.create)\n    ..aOB(5, _omitFieldNames ? '' : 'noComment')\n    ..aOB(6, _omitFieldNames ? '' : 'noForward')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleState clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleState copyWith(void Function(ModuleState) updates) =>\n      super.copyWith((message) => updates(message as ModuleState))\n          as ModuleState;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleState create() => ModuleState._();\n  @$core.override\n  ModuleState createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleState getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleState>(create);\n  static ModuleState? _defaultInstance;\n\n  /// 转发数\n  @$pb.TagNumber(1)\n  $core.int get repost => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set repost($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasRepost() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRepost() => $_clearField(1);\n\n  /// 点赞数\n  @$pb.TagNumber(2)\n  $core.int get like => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set like($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLike() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLike() => $_clearField(2);\n\n  /// 评论数\n  @$pb.TagNumber(3)\n  $core.int get reply => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set reply($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasReply() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearReply() => $_clearField(3);\n\n  /// 点赞拓展信息\n  @$pb.TagNumber(4)\n  LikeInfo get likeInfo => $_getN(3);\n  @$pb.TagNumber(4)\n  set likeInfo(LikeInfo value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLikeInfo() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLikeInfo() => $_clearField(4);\n  @$pb.TagNumber(4)\n  LikeInfo ensureLikeInfo() => $_ensure(3);\n\n  /// 禁止评论\n  @$pb.TagNumber(5)\n  $core.bool get noComment => $_getBF(4);\n  @$pb.TagNumber(5)\n  set noComment($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasNoComment() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearNoComment() => $_clearField(5);\n\n  /// 禁止转发\n  @$pb.TagNumber(6)\n  $core.bool get noForward => $_getBF(5);\n  @$pb.TagNumber(6)\n  set noForward($core.bool value) => $_setBool(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasNoForward() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearNoForward() => $_clearField(6);\n}\n\n/// 认证名牌\nclass Nameplate extends $pb.GeneratedMessage {\n  factory Nameplate({\n    $fixnum.Int64? nid,\n    $core.String? name,\n    $core.String? image,\n    $core.String? imageSmall,\n    $core.String? level,\n    $core.String? condition,\n  }) {\n    final result = create();\n    if (nid != null) result.nid = nid;\n    if (name != null) result.name = name;\n    if (image != null) result.image = image;\n    if (imageSmall != null) result.imageSmall = imageSmall;\n    if (level != null) result.level = level;\n    if (condition != null) result.condition = condition;\n    return result;\n  }\n\n  Nameplate._();\n\n  factory Nameplate.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Nameplate.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Nameplate',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'nid')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'image')\n    ..aOS(4, _omitFieldNames ? '' : 'imageSmall')\n    ..aOS(5, _omitFieldNames ? '' : 'level')\n    ..aOS(6, _omitFieldNames ? '' : 'condition')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Nameplate clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Nameplate copyWith(void Function(Nameplate) updates) =>\n      super.copyWith((message) => updates(message as Nameplate)) as Nameplate;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Nameplate create() => Nameplate._();\n  @$core.override\n  Nameplate createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Nameplate getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Nameplate>(create);\n  static Nameplate? _defaultInstance;\n\n  /// 认证名牌 ID\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get nid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set nid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasNid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearNid() => $_clearField(1);\n\n  /// 认证名牌名称\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  /// 认证名牌图片\n  @$pb.TagNumber(3)\n  $core.String get image => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set image($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasImage() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearImage() => $_clearField(3);\n\n  /// 认证名牌图片(小)\n  @$pb.TagNumber(4)\n  $core.String get imageSmall => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set imageSmall($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasImageSmall() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearImageSmall() => $_clearField(4);\n\n  /// 等级\n  @$pb.TagNumber(5)\n  $core.String get level => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set level($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasLevel() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearLevel() => $_clearField(5);\n\n  /// 获取条件\n  @$pb.TagNumber(6)\n  $core.String get condition => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set condition($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCondition() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCondition() => $_clearField(6);\n}\n\n/// 剧集最新分集\nclass NewEP extends $pb.GeneratedMessage {\n  factory NewEP({\n    $core.int? id,\n    $core.String? indexShow,\n    $core.String? cover,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (indexShow != null) result.indexShow = indexShow;\n    if (cover != null) result.cover = cover;\n    return result;\n  }\n\n  NewEP._();\n\n  factory NewEP.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory NewEP.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'NewEP',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'indexShow')\n    ..aOS(3, _omitFieldNames ? '' : 'cover')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NewEP clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NewEP copyWith(void Function(NewEP) updates) =>\n      super.copyWith((message) => updates(message as NewEP)) as NewEP;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static NewEP create() => NewEP._();\n  @$core.override\n  NewEP createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static NewEP getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<NewEP>(create);\n  static NewEP? _defaultInstance;\n\n  /// 剧集最新分集的 ID\n  @$pb.TagNumber(1)\n  $core.int get id => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set id($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  /// 更新至 XX 话\n  @$pb.TagNumber(2)\n  $core.String get indexShow => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set indexShow($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIndexShow() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIndexShow() => $_clearField(2);\n\n  /// 更新剧集的封面\n  @$pb.TagNumber(3)\n  $core.String get cover => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set cover($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCover() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCover() => $_clearField(3);\n}\n\nclass NoReply extends $pb.GeneratedMessage {\n  factory NoReply() => create();\n\n  NoReply._();\n\n  factory NoReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory NoReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'NoReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NoReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NoReply copyWith(void Function(NoReply) updates) =>\n      super.copyWith((message) => updates(message as NoReply)) as NoReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static NoReply create() => NoReply._();\n  @$core.override\n  NoReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static NoReply getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<NoReply>(create);\n  static NoReply? _defaultInstance;\n}\n\nclass NoReq extends $pb.GeneratedMessage {\n  factory NoReq() => create();\n\n  NoReq._();\n\n  factory NoReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory NoReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'NoReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NoReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NoReq copyWith(void Function(NoReq) updates) =>\n      super.copyWith((message) => updates(message as NoReq)) as NoReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static NoReq create() => NoReq._();\n  @$core.override\n  NoReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static NoReq getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<NoReq>(create);\n  static NoReq? _defaultInstance;\n}\n\n/// 认证信息\nclass OfficialVerify extends $pb.GeneratedMessage {\n  factory OfficialVerify({\n    $core.int? type,\n    $core.String? desc,\n    $core.int? isAtten,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (desc != null) result.desc = desc;\n    if (isAtten != null) result.isAtten = isAtten;\n    return result;\n  }\n\n  OfficialVerify._();\n\n  factory OfficialVerify.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OfficialVerify.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OfficialVerify',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'type')\n    ..aOS(2, _omitFieldNames ? '' : 'desc')\n    ..aI(3, _omitFieldNames ? '' : 'isAtten')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OfficialVerify clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OfficialVerify copyWith(void Function(OfficialVerify) updates) =>\n      super.copyWith((message) => updates(message as OfficialVerify))\n          as OfficialVerify;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OfficialVerify create() => OfficialVerify._();\n  @$core.override\n  OfficialVerify createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OfficialVerify getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OfficialVerify>(create);\n  static OfficialVerify? _defaultInstance;\n\n  /// - 0: 个人\n  /// - 1: 官方\n  /// - 127: 未认证\n  @$pb.TagNumber(1)\n  $core.int get type => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set type($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  /// 认证描述\n  @$pb.TagNumber(2)\n  $core.String get desc => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set desc($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDesc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDesc() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get isAtten => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set isAtten($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIsAtten() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIsAtten() => $_clearField(3);\n}\n\nclass OurCityClickReportReply extends $pb.GeneratedMessage {\n  factory OurCityClickReportReply() => create();\n\n  OurCityClickReportReply._();\n\n  factory OurCityClickReportReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OurCityClickReportReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OurCityClickReportReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OurCityClickReportReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OurCityClickReportReply copyWith(\n          void Function(OurCityClickReportReply) updates) =>\n      super.copyWith((message) => updates(message as OurCityClickReportReply))\n          as OurCityClickReportReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OurCityClickReportReply create() => OurCityClickReportReply._();\n  @$core.override\n  OurCityClickReportReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OurCityClickReportReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OurCityClickReportReply>(create);\n  static OurCityClickReportReply? _defaultInstance;\n}\n\nclass OurCityClickReportReq extends $pb.GeneratedMessage {\n  factory OurCityClickReportReq({\n    $core.String? dynamicId,\n    $fixnum.Int64? cityId,\n    $core.double? lat,\n    $core.double? lng,\n  }) {\n    final result = create();\n    if (dynamicId != null) result.dynamicId = dynamicId;\n    if (cityId != null) result.cityId = cityId;\n    if (lat != null) result.lat = lat;\n    if (lng != null) result.lng = lng;\n    return result;\n  }\n\n  OurCityClickReportReq._();\n\n  factory OurCityClickReportReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OurCityClickReportReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OurCityClickReportReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'dynamicId')\n    ..aInt64(2, _omitFieldNames ? '' : 'cityId')\n    ..aD(3, _omitFieldNames ? '' : 'lat')\n    ..aD(4, _omitFieldNames ? '' : 'lng')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OurCityClickReportReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OurCityClickReportReq copyWith(\n          void Function(OurCityClickReportReq) updates) =>\n      super.copyWith((message) => updates(message as OurCityClickReportReq))\n          as OurCityClickReportReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OurCityClickReportReq create() => OurCityClickReportReq._();\n  @$core.override\n  OurCityClickReportReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OurCityClickReportReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OurCityClickReportReq>(create);\n  static OurCityClickReportReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get dynamicId => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set dynamicId($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDynamicId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDynamicId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get cityId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set cityId($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCityId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCityId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.double get lat => $_getN(2);\n  @$pb.TagNumber(3)\n  set lat($core.double value) => $_setDouble(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLat() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLat() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.double get lng => $_getN(3);\n  @$pb.TagNumber(4)\n  set lng($core.double value) => $_setDouble(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLng() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLng() => $_clearField(4);\n}\n\n/// PGC 剧集信息\nclass PGCSeason extends $pb.GeneratedMessage {\n  factory PGCSeason({\n    $core.int? isFinish,\n    $core.String? title,\n    $core.int? type,\n  }) {\n    final result = create();\n    if (isFinish != null) result.isFinish = isFinish;\n    if (title != null) result.title = title;\n    if (type != null) result.type = type;\n    return result;\n  }\n\n  PGCSeason._();\n\n  factory PGCSeason.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PGCSeason.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PGCSeason',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'isFinish')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aI(3, _omitFieldNames ? '' : 'type')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PGCSeason clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PGCSeason copyWith(void Function(PGCSeason) updates) =>\n      super.copyWith((message) => updates(message as PGCSeason)) as PGCSeason;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PGCSeason create() => PGCSeason._();\n  @$core.override\n  PGCSeason createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PGCSeason getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PGCSeason>(create);\n  static PGCSeason? _defaultInstance;\n\n  /// 已完结\n  @$pb.TagNumber(1)\n  $core.int get isFinish => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set isFinish($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIsFinish() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIsFinish() => $_clearField(1);\n\n  /// 标题\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  /// 类型\n  @$pb.TagNumber(3)\n  $core.int get type => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set type($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearType() => $_clearField(3);\n}\n\nclass PlayerPreloadParams extends $pb.GeneratedMessage {\n  factory PlayerPreloadParams({\n    $core.int? qn,\n    $core.int? fnver,\n    $core.int? fnval,\n    $core.int? forceHost,\n    $core.int? fourk,\n  }) {\n    final result = create();\n    if (qn != null) result.qn = qn;\n    if (fnver != null) result.fnver = fnver;\n    if (fnval != null) result.fnval = fnval;\n    if (forceHost != null) result.forceHost = forceHost;\n    if (fourk != null) result.fourk = fourk;\n    return result;\n  }\n\n  PlayerPreloadParams._();\n\n  factory PlayerPreloadParams.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayerPreloadParams.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayerPreloadParams',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'qn')\n    ..aI(2, _omitFieldNames ? '' : 'fnver')\n    ..aI(3, _omitFieldNames ? '' : 'fnval')\n    ..aI(4, _omitFieldNames ? '' : 'forceHost')\n    ..aI(5, _omitFieldNames ? '' : 'fourk')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerPreloadParams clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerPreloadParams copyWith(void Function(PlayerPreloadParams) updates) =>\n      super.copyWith((message) => updates(message as PlayerPreloadParams))\n          as PlayerPreloadParams;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayerPreloadParams create() => PlayerPreloadParams._();\n  @$core.override\n  PlayerPreloadParams createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayerPreloadParams getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayerPreloadParams>(create);\n  static PlayerPreloadParams? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get qn => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set qn($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasQn() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearQn() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get fnver => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set fnver($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFnver() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFnver() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get fnval => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set fnval($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFnval() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFnval() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get forceHost => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set forceHost($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasForceHost() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearForceHost() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get fourk => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set fourk($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasFourk() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearFourk() => $_clearField(5);\n}\n\n/// 动态 tab 弹窗详情\nclass Popup extends $pb.GeneratedMessage {\n  factory Popup({\n    $core.String? title,\n    $core.String? desc,\n    $core.String? uri,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (desc != null) result.desc = desc;\n    if (uri != null) result.uri = uri;\n    return result;\n  }\n\n  Popup._();\n\n  factory Popup.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Popup.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Popup',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'desc')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Popup clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Popup copyWith(void Function(Popup) updates) =>\n      super.copyWith((message) => updates(message as Popup)) as Popup;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Popup create() => Popup._();\n  @$core.override\n  Popup createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Popup getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Popup>(create);\n  static Popup? _defaultInstance;\n\n  /// 标题\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  /// 文案\n  @$pb.TagNumber(2)\n  $core.String get desc => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set desc($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDesc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDesc() => $_clearField(2);\n\n  /// 文案附加跳转地址\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n}\n\nclass Relation extends $pb.GeneratedMessage {\n  factory Relation({\n    RelationStatus? status,\n    $core.int? isFollow,\n    $core.int? isFollowed,\n    $core.String? title,\n  }) {\n    final result = create();\n    if (status != null) result.status = status;\n    if (isFollow != null) result.isFollow = isFollow;\n    if (isFollowed != null) result.isFollowed = isFollowed;\n    if (title != null) result.title = title;\n    return result;\n  }\n\n  Relation._();\n\n  factory Relation.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Relation.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Relation',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aE<RelationStatus>(1, _omitFieldNames ? '' : 'status',\n        enumValues: RelationStatus.values)\n    ..aI(2, _omitFieldNames ? '' : 'isFollow')\n    ..aI(3, _omitFieldNames ? '' : 'isFollowed')\n    ..aOS(4, _omitFieldNames ? '' : 'title')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Relation clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Relation copyWith(void Function(Relation) updates) =>\n      super.copyWith((message) => updates(message as Relation)) as Relation;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Relation create() => Relation._();\n  @$core.override\n  Relation createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Relation getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Relation>(create);\n  static Relation? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  RelationStatus get status => $_getN(0);\n  @$pb.TagNumber(1)\n  set status(RelationStatus value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStatus() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStatus() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get isFollow => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set isFollow($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIsFollow() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIsFollow() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get isFollowed => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set isFollowed($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIsFollowed() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIsFollowed() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get title => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set title($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTitle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTitle() => $_clearField(4);\n}\n\nclass SVideoItem extends $pb.GeneratedMessage {\n  factory SVideoItem({\n    $core.String? cardType,\n    $core.Iterable<SVideoModule>? modules,\n    $core.String? dynIdStr,\n    $fixnum.Int64? index,\n  }) {\n    final result = create();\n    if (cardType != null) result.cardType = cardType;\n    if (modules != null) result.modules.addAll(modules);\n    if (dynIdStr != null) result.dynIdStr = dynIdStr;\n    if (index != null) result.index = index;\n    return result;\n  }\n\n  SVideoItem._();\n\n  factory SVideoItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SVideoItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SVideoItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'cardType')\n    ..pPM<SVideoModule>(2, _omitFieldNames ? '' : 'modules',\n        subBuilder: SVideoModule.create)\n    ..aOS(3, _omitFieldNames ? '' : 'dynIdStr')\n    ..aInt64(4, _omitFieldNames ? '' : 'index')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SVideoItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SVideoItem copyWith(void Function(SVideoItem) updates) =>\n      super.copyWith((message) => updates(message as SVideoItem)) as SVideoItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SVideoItem create() => SVideoItem._();\n  @$core.override\n  SVideoItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SVideoItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SVideoItem>(create);\n  static SVideoItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get cardType => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set cardType($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCardType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCardType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<SVideoModule> get modules => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $core.String get dynIdStr => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set dynIdStr($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDynIdStr() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDynIdStr() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get index => $_getI64(3);\n  @$pb.TagNumber(4)\n  set index($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIndex() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIndex() => $_clearField(4);\n}\n\nenum SVideoModule_ModuleItem {\n  moduleAuthor,\n  modulePlayer,\n  moduleDesc,\n  moduleStat,\n  notSet\n}\n\nclass SVideoModule extends $pb.GeneratedMessage {\n  factory SVideoModule({\n    $core.String? moduleType,\n    SVideoModuleAuthor? moduleAuthor,\n    SVideoModulePlayer? modulePlayer,\n    SVideoModuleDesc? moduleDesc,\n    SVideoModuleStat? moduleStat,\n  }) {\n    final result = create();\n    if (moduleType != null) result.moduleType = moduleType;\n    if (moduleAuthor != null) result.moduleAuthor = moduleAuthor;\n    if (modulePlayer != null) result.modulePlayer = modulePlayer;\n    if (moduleDesc != null) result.moduleDesc = moduleDesc;\n    if (moduleStat != null) result.moduleStat = moduleStat;\n    return result;\n  }\n\n  SVideoModule._();\n\n  factory SVideoModule.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SVideoModule.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, SVideoModule_ModuleItem>\n      _SVideoModule_ModuleItemByTag = {\n    2: SVideoModule_ModuleItem.moduleAuthor,\n    3: SVideoModule_ModuleItem.modulePlayer,\n    4: SVideoModule_ModuleItem.moduleDesc,\n    5: SVideoModule_ModuleItem.moduleStat,\n    0: SVideoModule_ModuleItem.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SVideoModule',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [2, 3, 4, 5])\n    ..aOS(1, _omitFieldNames ? '' : 'moduleType')\n    ..aOM<SVideoModuleAuthor>(2, _omitFieldNames ? '' : 'moduleAuthor',\n        subBuilder: SVideoModuleAuthor.create)\n    ..aOM<SVideoModulePlayer>(3, _omitFieldNames ? '' : 'modulePlayer',\n        subBuilder: SVideoModulePlayer.create)\n    ..aOM<SVideoModuleDesc>(4, _omitFieldNames ? '' : 'moduleDesc',\n        subBuilder: SVideoModuleDesc.create)\n    ..aOM<SVideoModuleStat>(5, _omitFieldNames ? '' : 'moduleStat',\n        subBuilder: SVideoModuleStat.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SVideoModule clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SVideoModule copyWith(void Function(SVideoModule) updates) =>\n      super.copyWith((message) => updates(message as SVideoModule))\n          as SVideoModule;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SVideoModule create() => SVideoModule._();\n  @$core.override\n  SVideoModule createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SVideoModule getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SVideoModule>(create);\n  static SVideoModule? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  SVideoModule_ModuleItem whichModuleItem() =>\n      _SVideoModule_ModuleItemByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  void clearModuleItem() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  $core.String get moduleType => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set moduleType($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasModuleType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearModuleType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  SVideoModuleAuthor get moduleAuthor => $_getN(1);\n  @$pb.TagNumber(2)\n  set moduleAuthor(SVideoModuleAuthor value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasModuleAuthor() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearModuleAuthor() => $_clearField(2);\n  @$pb.TagNumber(2)\n  SVideoModuleAuthor ensureModuleAuthor() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  SVideoModulePlayer get modulePlayer => $_getN(2);\n  @$pb.TagNumber(3)\n  set modulePlayer(SVideoModulePlayer value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasModulePlayer() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearModulePlayer() => $_clearField(3);\n  @$pb.TagNumber(3)\n  SVideoModulePlayer ensureModulePlayer() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  SVideoModuleDesc get moduleDesc => $_getN(3);\n  @$pb.TagNumber(4)\n  set moduleDesc(SVideoModuleDesc value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasModuleDesc() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearModuleDesc() => $_clearField(4);\n  @$pb.TagNumber(4)\n  SVideoModuleDesc ensureModuleDesc() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  SVideoModuleStat get moduleStat => $_getN(4);\n  @$pb.TagNumber(5)\n  set moduleStat(SVideoModuleStat value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasModuleStat() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearModuleStat() => $_clearField(5);\n  @$pb.TagNumber(5)\n  SVideoModuleStat ensureModuleStat() => $_ensure(4);\n}\n\nclass SVideoModuleAuthor extends $pb.GeneratedMessage {\n  factory SVideoModuleAuthor({\n    $fixnum.Int64? mid,\n    $core.String? name,\n    $core.String? face,\n    $core.String? pubDesc,\n    $core.int? isAttention,\n    $core.String? uri,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (name != null) result.name = name;\n    if (face != null) result.face = face;\n    if (pubDesc != null) result.pubDesc = pubDesc;\n    if (isAttention != null) result.isAttention = isAttention;\n    if (uri != null) result.uri = uri;\n    return result;\n  }\n\n  SVideoModuleAuthor._();\n\n  factory SVideoModuleAuthor.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SVideoModuleAuthor.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SVideoModuleAuthor',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'face')\n    ..aOS(4, _omitFieldNames ? '' : 'pubDesc')\n    ..aI(5, _omitFieldNames ? '' : 'isAttention')\n    ..aOS(6, _omitFieldNames ? '' : 'uri')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SVideoModuleAuthor clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SVideoModuleAuthor copyWith(void Function(SVideoModuleAuthor) updates) =>\n      super.copyWith((message) => updates(message as SVideoModuleAuthor))\n          as SVideoModuleAuthor;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SVideoModuleAuthor create() => SVideoModuleAuthor._();\n  @$core.override\n  SVideoModuleAuthor createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SVideoModuleAuthor getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SVideoModuleAuthor>(create);\n  static SVideoModuleAuthor? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get face => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set face($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFace() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFace() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get pubDesc => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set pubDesc($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPubDesc() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPubDesc() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get isAttention => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set isAttention($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasIsAttention() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearIsAttention() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get uri => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set uri($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasUri() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearUri() => $_clearField(6);\n}\n\nclass SVideoModuleDesc extends $pb.GeneratedMessage {\n  factory SVideoModuleDesc({\n    $core.String? text,\n    $core.String? uri,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (uri != null) result.uri = uri;\n    return result;\n  }\n\n  SVideoModuleDesc._();\n\n  factory SVideoModuleDesc.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SVideoModuleDesc.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SVideoModuleDesc',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SVideoModuleDesc clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SVideoModuleDesc copyWith(void Function(SVideoModuleDesc) updates) =>\n      super.copyWith((message) => updates(message as SVideoModuleDesc))\n          as SVideoModuleDesc;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SVideoModuleDesc create() => SVideoModuleDesc._();\n  @$core.override\n  SVideoModuleDesc createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SVideoModuleDesc getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SVideoModuleDesc>(create);\n  static SVideoModuleDesc? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n}\n\nclass SVideoModulePlayer extends $pb.GeneratedMessage {\n  factory SVideoModulePlayer({\n    $core.String? title,\n    $core.String? cover,\n    $core.String? uri,\n    $fixnum.Int64? aid,\n    $fixnum.Int64? cid,\n    $fixnum.Int64? duration,\n    Dimension? dimension,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (uri != null) result.uri = uri;\n    if (aid != null) result.aid = aid;\n    if (cid != null) result.cid = cid;\n    if (duration != null) result.duration = duration;\n    if (dimension != null) result.dimension = dimension;\n    return result;\n  }\n\n  SVideoModulePlayer._();\n\n  factory SVideoModulePlayer.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SVideoModulePlayer.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SVideoModulePlayer',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'cover')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..aInt64(4, _omitFieldNames ? '' : 'aid')\n    ..aInt64(5, _omitFieldNames ? '' : 'cid')\n    ..aInt64(6, _omitFieldNames ? '' : 'duration')\n    ..aOM<Dimension>(7, _omitFieldNames ? '' : 'dimension',\n        subBuilder: Dimension.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SVideoModulePlayer clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SVideoModulePlayer copyWith(void Function(SVideoModulePlayer) updates) =>\n      super.copyWith((message) => updates(message as SVideoModulePlayer))\n          as SVideoModulePlayer;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SVideoModulePlayer create() => SVideoModulePlayer._();\n  @$core.override\n  SVideoModulePlayer createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SVideoModulePlayer getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SVideoModulePlayer>(create);\n  static SVideoModulePlayer? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get cover => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cover($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCover() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCover() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get aid => $_getI64(3);\n  @$pb.TagNumber(4)\n  set aid($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasAid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearAid() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get cid => $_getI64(4);\n  @$pb.TagNumber(5)\n  set cid($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCid() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCid() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get duration => $_getI64(5);\n  @$pb.TagNumber(6)\n  set duration($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasDuration() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearDuration() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  Dimension get dimension => $_getN(6);\n  @$pb.TagNumber(7)\n  set dimension(Dimension value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasDimension() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearDimension() => $_clearField(7);\n  @$pb.TagNumber(7)\n  Dimension ensureDimension() => $_ensure(6);\n}\n\nclass SVideoModuleStat extends $pb.GeneratedMessage {\n  factory SVideoModuleStat({\n    $core.Iterable<SVideoStatInfo>? statInfo,\n    ShareInfo? shareInfo,\n  }) {\n    final result = create();\n    if (statInfo != null) result.statInfo.addAll(statInfo);\n    if (shareInfo != null) result.shareInfo = shareInfo;\n    return result;\n  }\n\n  SVideoModuleStat._();\n\n  factory SVideoModuleStat.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SVideoModuleStat.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SVideoModuleStat',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..pPM<SVideoStatInfo>(1, _omitFieldNames ? '' : 'statInfo',\n        subBuilder: SVideoStatInfo.create)\n    ..aOM<ShareInfo>(2, _omitFieldNames ? '' : 'shareInfo',\n        subBuilder: ShareInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SVideoModuleStat clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SVideoModuleStat copyWith(void Function(SVideoModuleStat) updates) =>\n      super.copyWith((message) => updates(message as SVideoModuleStat))\n          as SVideoModuleStat;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SVideoModuleStat create() => SVideoModuleStat._();\n  @$core.override\n  SVideoModuleStat createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SVideoModuleStat getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SVideoModuleStat>(create);\n  static SVideoModuleStat? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<SVideoStatInfo> get statInfo => $_getList(0);\n\n  @$pb.TagNumber(2)\n  ShareInfo get shareInfo => $_getN(1);\n  @$pb.TagNumber(2)\n  set shareInfo(ShareInfo value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasShareInfo() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearShareInfo() => $_clearField(2);\n  @$pb.TagNumber(2)\n  ShareInfo ensureShareInfo() => $_ensure(1);\n}\n\nclass SVideoReply extends $pb.GeneratedMessage {\n  factory SVideoReply({\n    $core.Iterable<SVideoItem>? list,\n    $core.String? offset,\n    $core.int? hasMore,\n    SVideoTop? top,\n  }) {\n    final result = create();\n    if (list != null) result.list.addAll(list);\n    if (offset != null) result.offset = offset;\n    if (hasMore != null) result.hasMore = hasMore;\n    if (top != null) result.top = top;\n    return result;\n  }\n\n  SVideoReply._();\n\n  factory SVideoReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SVideoReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SVideoReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..pPM<SVideoItem>(1, _omitFieldNames ? '' : 'list',\n        subBuilder: SVideoItem.create)\n    ..aOS(2, _omitFieldNames ? '' : 'offset')\n    ..aI(3, _omitFieldNames ? '' : 'hasMore')\n    ..aOM<SVideoTop>(4, _omitFieldNames ? '' : 'top',\n        subBuilder: SVideoTop.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SVideoReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SVideoReply copyWith(void Function(SVideoReply) updates) =>\n      super.copyWith((message) => updates(message as SVideoReply))\n          as SVideoReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SVideoReply create() => SVideoReply._();\n  @$core.override\n  SVideoReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SVideoReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SVideoReply>(create);\n  static SVideoReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<SVideoItem> get list => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.String get offset => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set offset($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOffset() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOffset() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get hasMore => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set hasMore($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasHasMore() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearHasMore() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  SVideoTop get top => $_getN(3);\n  @$pb.TagNumber(4)\n  set top(SVideoTop value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTop() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTop() => $_clearField(4);\n  @$pb.TagNumber(4)\n  SVideoTop ensureTop() => $_ensure(3);\n}\n\n/// 小视频连播页请求参数\nclass SVideoReq extends $pb.GeneratedMessage {\n  factory SVideoReq({\n    $fixnum.Int64? oid,\n    SVideoType? type,\n    $core.String? offset,\n    $core.int? qn,\n    $core.int? fnver,\n    $core.int? fnval,\n    $core.int? forceHost,\n    $core.int? fourk,\n    $core.String? spmid,\n    $core.String? fromSpmid,\n    PlayerPreloadParams? playerPreload,\n    $fixnum.Int64? focusAid,\n    $1.PlayerArgs? playerArgs,\n  }) {\n    final result = create();\n    if (oid != null) result.oid = oid;\n    if (type != null) result.type = type;\n    if (offset != null) result.offset = offset;\n    if (qn != null) result.qn = qn;\n    if (fnver != null) result.fnver = fnver;\n    if (fnval != null) result.fnval = fnval;\n    if (forceHost != null) result.forceHost = forceHost;\n    if (fourk != null) result.fourk = fourk;\n    if (spmid != null) result.spmid = spmid;\n    if (fromSpmid != null) result.fromSpmid = fromSpmid;\n    if (playerPreload != null) result.playerPreload = playerPreload;\n    if (focusAid != null) result.focusAid = focusAid;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    return result;\n  }\n\n  SVideoReq._();\n\n  factory SVideoReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SVideoReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SVideoReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'oid')\n    ..aE<SVideoType>(2, _omitFieldNames ? '' : 'type',\n        enumValues: SVideoType.values)\n    ..aOS(3, _omitFieldNames ? '' : 'offset')\n    ..aI(4, _omitFieldNames ? '' : 'qn')\n    ..aI(5, _omitFieldNames ? '' : 'fnver')\n    ..aI(6, _omitFieldNames ? '' : 'fnval')\n    ..aI(7, _omitFieldNames ? '' : 'forceHost')\n    ..aI(8, _omitFieldNames ? '' : 'fourk')\n    ..aOS(9, _omitFieldNames ? '' : 'spmid')\n    ..aOS(10, _omitFieldNames ? '' : 'fromSpmid')\n    ..aOM<PlayerPreloadParams>(11, _omitFieldNames ? '' : 'playerPreload',\n        subBuilder: PlayerPreloadParams.create)\n    ..aInt64(12, _omitFieldNames ? '' : 'focusAid')\n    ..aOM<$1.PlayerArgs>(13, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $1.PlayerArgs.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SVideoReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SVideoReq copyWith(void Function(SVideoReq) updates) =>\n      super.copyWith((message) => updates(message as SVideoReq)) as SVideoReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SVideoReq create() => SVideoReq._();\n  @$core.override\n  SVideoReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SVideoReq getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<SVideoReq>(create);\n  static SVideoReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get oid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set oid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  SVideoType get type => $_getN(1);\n  @$pb.TagNumber(2)\n  set type(SVideoType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get offset => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set offset($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasOffset() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearOffset() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get qn => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set qn($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasQn() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearQn() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get fnver => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set fnver($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasFnver() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearFnver() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get fnval => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set fnval($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasFnval() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearFnval() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get forceHost => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set forceHost($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasForceHost() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearForceHost() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get fourk => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set fourk($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasFourk() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearFourk() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get spmid => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set spmid($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasSpmid() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearSpmid() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get fromSpmid => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set fromSpmid($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasFromSpmid() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearFromSpmid() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  PlayerPreloadParams get playerPreload => $_getN(10);\n  @$pb.TagNumber(11)\n  set playerPreload(PlayerPreloadParams value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasPlayerPreload() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearPlayerPreload() => $_clearField(11);\n  @$pb.TagNumber(11)\n  PlayerPreloadParams ensurePlayerPreload() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  $fixnum.Int64 get focusAid => $_getI64(11);\n  @$pb.TagNumber(12)\n  set focusAid($fixnum.Int64 value) => $_setInt64(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasFocusAid() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearFocusAid() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $1.PlayerArgs get playerArgs => $_getN(12);\n  @$pb.TagNumber(13)\n  set playerArgs($1.PlayerArgs value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasPlayerArgs() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearPlayerArgs() => $_clearField(13);\n  @$pb.TagNumber(13)\n  $1.PlayerArgs ensurePlayerArgs() => $_ensure(12);\n}\n\nclass SVideoStatInfo extends $pb.GeneratedMessage {\n  factory SVideoStatInfo({\n    $core.int? icon,\n    $fixnum.Int64? num,\n    $core.int? selected,\n    $core.String? uri,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (num != null) result.num = num;\n    if (selected != null) result.selected = selected;\n    if (uri != null) result.uri = uri;\n    return result;\n  }\n\n  SVideoStatInfo._();\n\n  factory SVideoStatInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SVideoStatInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SVideoStatInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'icon')\n    ..aInt64(2, _omitFieldNames ? '' : 'num')\n    ..aI(3, _omitFieldNames ? '' : 'selected')\n    ..aOS(4, _omitFieldNames ? '' : 'uri')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SVideoStatInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SVideoStatInfo copyWith(void Function(SVideoStatInfo) updates) =>\n      super.copyWith((message) => updates(message as SVideoStatInfo))\n          as SVideoStatInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SVideoStatInfo create() => SVideoStatInfo._();\n  @$core.override\n  SVideoStatInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SVideoStatInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SVideoStatInfo>(create);\n  static SVideoStatInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get icon => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get num => $_getI64(1);\n  @$pb.TagNumber(2)\n  set num($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasNum() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearNum() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get selected => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set selected($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSelected() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSelected() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get uri => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set uri($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUri() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUri() => $_clearField(4);\n}\n\nclass SVideoTop extends $pb.GeneratedMessage {\n  factory SVideoTop({\n    $core.String? title,\n    $core.String? desc,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (desc != null) result.desc = desc;\n    return result;\n  }\n\n  SVideoTop._();\n\n  factory SVideoTop.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SVideoTop.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SVideoTop',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'desc')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SVideoTop clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SVideoTop copyWith(void Function(SVideoTop) updates) =>\n      super.copyWith((message) => updates(message as SVideoTop)) as SVideoTop;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SVideoTop create() => SVideoTop._();\n  @$core.override\n  SVideoTop createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SVideoTop getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<SVideoTop>(create);\n  static SVideoTop? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get desc => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set desc($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDesc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDesc() => $_clearField(2);\n}\n\n/// 分享信息\nclass ShareInfo extends $pb.GeneratedMessage {\n  factory ShareInfo({\n    $fixnum.Int64? aid,\n    $core.String? bvid,\n    $core.String? title,\n    $core.String? subtitle,\n    $core.String? cover,\n    $fixnum.Int64? mid,\n    $core.String? name,\n  }) {\n    final result = create();\n    if (aid != null) result.aid = aid;\n    if (bvid != null) result.bvid = bvid;\n    if (title != null) result.title = title;\n    if (subtitle != null) result.subtitle = subtitle;\n    if (cover != null) result.cover = cover;\n    if (mid != null) result.mid = mid;\n    if (name != null) result.name = name;\n    return result;\n  }\n\n  ShareInfo._();\n\n  factory ShareInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ShareInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ShareInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'aid')\n    ..aOS(2, _omitFieldNames ? '' : 'bvid')\n    ..aOS(3, _omitFieldNames ? '' : 'title')\n    ..aOS(4, _omitFieldNames ? '' : 'subtitle')\n    ..aOS(5, _omitFieldNames ? '' : 'cover')\n    ..aInt64(6, _omitFieldNames ? '' : 'mid')\n    ..aOS(7, _omitFieldNames ? '' : 'name')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareInfo copyWith(void Function(ShareInfo) updates) =>\n      super.copyWith((message) => updates(message as ShareInfo)) as ShareInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ShareInfo create() => ShareInfo._();\n  @$core.override\n  ShareInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ShareInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ShareInfo>(create);\n  static ShareInfo? _defaultInstance;\n\n  /// 稿件 avid\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get aid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set aid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAid() => $_clearField(1);\n\n  /// 稿件 bvid\n  @$pb.TagNumber(2)\n  $core.String get bvid => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set bvid($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBvid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBvid() => $_clearField(2);\n\n  /// 稿件标题\n  @$pb.TagNumber(3)\n  $core.String get title => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set title($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTitle() => $_clearField(3);\n\n  /// 稿件字幕\n  @$pb.TagNumber(4)\n  $core.String get subtitle => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set subtitle($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSubtitle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSubtitle() => $_clearField(4);\n\n  /// 稿件方面\n  @$pb.TagNumber(5)\n  $core.String get cover => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set cover($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCover() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCover() => $_clearField(5);\n\n  /// UP 主 mid\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get mid => $_getI64(5);\n  @$pb.TagNumber(6)\n  set mid($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasMid() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearMid() => $_clearField(6);\n\n  /// UP 主昵称\n  @$pb.TagNumber(7)\n  $core.String get name => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set name($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasName() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearName() => $_clearField(7);\n}\n\n/// 动态红点接口各 tab offset 信息\nclass TabOffset extends $pb.GeneratedMessage {\n  factory TabOffset({\n    $core.int? tab,\n    $core.String? offset,\n  }) {\n    final result = create();\n    if (tab != null) result.tab = tab;\n    if (offset != null) result.offset = offset;\n    return result;\n  }\n\n  TabOffset._();\n\n  factory TabOffset.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TabOffset.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TabOffset',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'tab')\n    ..aOS(2, _omitFieldNames ? '' : 'offset')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TabOffset clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TabOffset copyWith(void Function(TabOffset) updates) =>\n      super.copyWith((message) => updates(message as TabOffset)) as TabOffset;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TabOffset create() => TabOffset._();\n  @$core.override\n  TabOffset createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TabOffset getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TabOffset>(create);\n  static TabOffset? _defaultInstance;\n\n  /// - 1: 综合页\n  /// - 2: 视频页\n  @$pb.TagNumber(1)\n  $core.int get tab => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set tab($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTab() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTab() => $_clearField(1);\n\n  /// 上一次对应列表页 offset\n  @$pb.TagNumber(2)\n  $core.String get offset => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set offset($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOffset() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOffset() => $_clearField(2);\n}\n\n/// UP 主列表\nclass UpListItem extends $pb.GeneratedMessage {\n  factory UpListItem({\n    $core.int? hasUpdate,\n    $core.String? face,\n    $core.String? name,\n    $fixnum.Int64? uid,\n  }) {\n    final result = create();\n    if (hasUpdate != null) result.hasUpdate = hasUpdate;\n    if (face != null) result.face = face;\n    if (name != null) result.name = name;\n    if (uid != null) result.uid = uid;\n    return result;\n  }\n\n  UpListItem._();\n\n  factory UpListItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UpListItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UpListItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'hasUpdate')\n    ..aOS(2, _omitFieldNames ? '' : 'face')\n    ..aOS(3, _omitFieldNames ? '' : 'name')\n    ..aInt64(4, _omitFieldNames ? '' : 'uid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpListItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpListItem copyWith(void Function(UpListItem) updates) =>\n      super.copyWith((message) => updates(message as UpListItem)) as UpListItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UpListItem create() => UpListItem._();\n  @$core.override\n  UpListItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UpListItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UpListItem>(create);\n  static UpListItem? _defaultInstance;\n\n  /// 是否有更新\n  @$pb.TagNumber(1)\n  $core.int get hasUpdate => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set hasUpdate($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasHasUpdate() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearHasUpdate() => $_clearField(1);\n\n  /// 头像\n  @$pb.TagNumber(2)\n  $core.String get face => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set face($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFace() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFace() => $_clearField(2);\n\n  /// 昵称\n  @$pb.TagNumber(3)\n  $core.String get name => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set name($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasName() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearName() => $_clearField(3);\n\n  /// mid\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get uid => $_getI64(3);\n  @$pb.TagNumber(4)\n  set uid($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUid() => $_clearField(4);\n}\n\n/// 用户信息\nclass UserInfo extends $pb.GeneratedMessage {\n  factory UserInfo({\n    $fixnum.Int64? mid,\n    $core.String? name,\n    $core.String? face,\n    OfficialVerify? official,\n    VipInfo? vip,\n    LiveInfo? live,\n    $core.String? uri,\n    UserPendant? pendant,\n    Nameplate? nameplate,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (name != null) result.name = name;\n    if (face != null) result.face = face;\n    if (official != null) result.official = official;\n    if (vip != null) result.vip = vip;\n    if (live != null) result.live = live;\n    if (uri != null) result.uri = uri;\n    if (pendant != null) result.pendant = pendant;\n    if (nameplate != null) result.nameplate = nameplate;\n    return result;\n  }\n\n  UserInfo._();\n\n  factory UserInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UserInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UserInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'face')\n    ..aOM<OfficialVerify>(4, _omitFieldNames ? '' : 'official',\n        subBuilder: OfficialVerify.create)\n    ..aOM<VipInfo>(5, _omitFieldNames ? '' : 'vip', subBuilder: VipInfo.create)\n    ..aOM<LiveInfo>(6, _omitFieldNames ? '' : 'live',\n        subBuilder: LiveInfo.create)\n    ..aOS(7, _omitFieldNames ? '' : 'uri')\n    ..aOM<UserPendant>(8, _omitFieldNames ? '' : 'pendant',\n        subBuilder: UserPendant.create)\n    ..aOM<Nameplate>(9, _omitFieldNames ? '' : 'nameplate',\n        subBuilder: Nameplate.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserInfo copyWith(void Function(UserInfo) updates) =>\n      super.copyWith((message) => updates(message as UserInfo)) as UserInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UserInfo create() => UserInfo._();\n  @$core.override\n  UserInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UserInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<UserInfo>(create);\n  static UserInfo? _defaultInstance;\n\n  /// 用户 mid\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  /// 用户昵称\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  /// 用户头像\n  @$pb.TagNumber(3)\n  $core.String get face => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set face($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFace() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFace() => $_clearField(3);\n\n  /// 用户认证信息\n  @$pb.TagNumber(4)\n  OfficialVerify get official => $_getN(3);\n  @$pb.TagNumber(4)\n  set official(OfficialVerify value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasOfficial() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearOfficial() => $_clearField(4);\n  @$pb.TagNumber(4)\n  OfficialVerify ensureOfficial() => $_ensure(3);\n\n  /// 用户大会员信息\n  @$pb.TagNumber(5)\n  VipInfo get vip => $_getN(4);\n  @$pb.TagNumber(5)\n  set vip(VipInfo value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasVip() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearVip() => $_clearField(5);\n  @$pb.TagNumber(5)\n  VipInfo ensureVip() => $_ensure(4);\n\n  /// 用户直播信息\n  @$pb.TagNumber(6)\n  LiveInfo get live => $_getN(5);\n  @$pb.TagNumber(6)\n  set live(LiveInfo value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasLive() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearLive() => $_clearField(6);\n  @$pb.TagNumber(6)\n  LiveInfo ensureLive() => $_ensure(5);\n\n  /// 空间页跳转链接\n  @$pb.TagNumber(7)\n  $core.String get uri => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set uri($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasUri() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearUri() => $_clearField(7);\n\n  /// 挂件\n  @$pb.TagNumber(8)\n  UserPendant get pendant => $_getN(7);\n  @$pb.TagNumber(8)\n  set pendant(UserPendant value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasPendant() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearPendant() => $_clearField(8);\n  @$pb.TagNumber(8)\n  UserPendant ensurePendant() => $_ensure(7);\n\n  /// 认证名牌\n  @$pb.TagNumber(9)\n  Nameplate get nameplate => $_getN(8);\n  @$pb.TagNumber(9)\n  set nameplate(Nameplate value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasNameplate() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearNameplate() => $_clearField(9);\n  @$pb.TagNumber(9)\n  Nameplate ensureNameplate() => $_ensure(8);\n}\n\n/// 挂件\nclass UserPendant extends $pb.GeneratedMessage {\n  factory UserPendant({\n    $fixnum.Int64? pid,\n    $core.String? name,\n    $core.String? image,\n    $fixnum.Int64? expire,\n  }) {\n    final result = create();\n    if (pid != null) result.pid = pid;\n    if (name != null) result.name = name;\n    if (image != null) result.image = image;\n    if (expire != null) result.expire = expire;\n    return result;\n  }\n\n  UserPendant._();\n\n  factory UserPendant.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UserPendant.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UserPendant',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'pid')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'image')\n    ..aInt64(4, _omitFieldNames ? '' : 'expire')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserPendant clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserPendant copyWith(void Function(UserPendant) updates) =>\n      super.copyWith((message) => updates(message as UserPendant))\n          as UserPendant;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UserPendant create() => UserPendant._();\n  @$core.override\n  UserPendant createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UserPendant getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UserPendant>(create);\n  static UserPendant? _defaultInstance;\n\n  /// 挂件 ID\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get pid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set pid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPid() => $_clearField(1);\n\n  /// 挂件名称\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  /// 挂件图片\n  @$pb.TagNumber(3)\n  $core.String get image => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set image($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasImage() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearImage() => $_clearField(3);\n\n  /// 挂件有效期\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get expire => $_getI64(3);\n  @$pb.TagNumber(4)\n  set expire($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasExpire() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearExpire() => $_clearField(4);\n}\n\n/// 角标\nclass VideoBadge extends $pb.GeneratedMessage {\n  factory VideoBadge({\n    $core.String? text,\n    $core.String? textColor,\n    $core.String? textColorNight,\n    $core.String? bgColor,\n    $core.String? bgColorNight,\n    $core.String? borderColor,\n    $core.String? borderColorNight,\n    $core.int? bgStyle,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (textColor != null) result.textColor = textColor;\n    if (textColorNight != null) result.textColorNight = textColorNight;\n    if (bgColor != null) result.bgColor = bgColor;\n    if (bgColorNight != null) result.bgColorNight = bgColorNight;\n    if (borderColor != null) result.borderColor = borderColor;\n    if (borderColorNight != null) result.borderColorNight = borderColorNight;\n    if (bgStyle != null) result.bgStyle = bgStyle;\n    return result;\n  }\n\n  VideoBadge._();\n\n  factory VideoBadge.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory VideoBadge.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'VideoBadge',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aOS(2, _omitFieldNames ? '' : 'textColor')\n    ..aOS(3, _omitFieldNames ? '' : 'textColorNight')\n    ..aOS(4, _omitFieldNames ? '' : 'bgColor')\n    ..aOS(5, _omitFieldNames ? '' : 'bgColorNight')\n    ..aOS(6, _omitFieldNames ? '' : 'borderColor')\n    ..aOS(7, _omitFieldNames ? '' : 'borderColorNight')\n    ..aI(8, _omitFieldNames ? '' : 'bgStyle')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VideoBadge clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VideoBadge copyWith(void Function(VideoBadge) updates) =>\n      super.copyWith((message) => updates(message as VideoBadge)) as VideoBadge;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static VideoBadge create() => VideoBadge._();\n  @$core.override\n  VideoBadge createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static VideoBadge getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<VideoBadge>(create);\n  static VideoBadge? _defaultInstance;\n\n  /// 文案\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  /// 文案文本颜色\n  @$pb.TagNumber(2)\n  $core.String get textColor => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set textColor($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTextColor() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTextColor() => $_clearField(2);\n\n  /// 文案文本颜色 (暗黑模式下)\n  @$pb.TagNumber(3)\n  $core.String get textColorNight => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set textColorNight($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTextColorNight() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTextColorNight() => $_clearField(3);\n\n  /// 背景颜色\n  @$pb.TagNumber(4)\n  $core.String get bgColor => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set bgColor($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBgColor() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBgColor() => $_clearField(4);\n\n  /// 背景颜色 (暗黑模式下)\n  @$pb.TagNumber(5)\n  $core.String get bgColorNight => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set bgColorNight($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBgColorNight() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBgColorNight() => $_clearField(5);\n\n  /// 边框颜色\n  @$pb.TagNumber(6)\n  $core.String get borderColor => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set borderColor($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasBorderColor() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearBorderColor() => $_clearField(6);\n\n  /// 边框颜色 (暗黑模式下)\n  @$pb.TagNumber(7)\n  $core.String get borderColorNight => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set borderColorNight($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBorderColorNight() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBorderColorNight() => $_clearField(7);\n\n  /// 样式\n  @$pb.TagNumber(8)\n  $core.int get bgStyle => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set bgStyle($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasBgStyle() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearBgStyle() => $_clearField(8);\n}\n\n/// 大会员信息\nclass VipInfo extends $pb.GeneratedMessage {\n  factory VipInfo({\n    $core.int? type,\n    $core.int? status,\n    $fixnum.Int64? dueDate,\n    VipLabel? label,\n    $core.int? themeType,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (status != null) result.status = status;\n    if (dueDate != null) result.dueDate = dueDate;\n    if (label != null) result.label = label;\n    if (themeType != null) result.themeType = themeType;\n    return result;\n  }\n\n  VipInfo._();\n\n  factory VipInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory VipInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'VipInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'type')\n    ..aI(2, _omitFieldNames ? '' : 'status')\n    ..aInt64(3, _omitFieldNames ? '' : 'dueDate')\n    ..aOM<VipLabel>(4, _omitFieldNames ? '' : 'label',\n        subBuilder: VipLabel.create)\n    ..aI(5, _omitFieldNames ? '' : 'themeType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VipInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VipInfo copyWith(void Function(VipInfo) updates) =>\n      super.copyWith((message) => updates(message as VipInfo)) as VipInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static VipInfo create() => VipInfo._();\n  @$core.override\n  VipInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static VipInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<VipInfo>(create);\n  static VipInfo? _defaultInstance;\n\n  /// 大会员类型\n  @$pb.TagNumber(1)\n  $core.int get type => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set type($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  /// 大会员状态\n  @$pb.TagNumber(2)\n  $core.int get status => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set status($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasStatus() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearStatus() => $_clearField(2);\n\n  /// 大会员过期时间\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get dueDate => $_getI64(2);\n  @$pb.TagNumber(3)\n  set dueDate($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDueDate() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDueDate() => $_clearField(3);\n\n  /// 大会员标签\n  @$pb.TagNumber(4)\n  VipLabel get label => $_getN(3);\n  @$pb.TagNumber(4)\n  set label(VipLabel value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLabel() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLabel() => $_clearField(4);\n  @$pb.TagNumber(4)\n  VipLabel ensureLabel() => $_ensure(3);\n\n  /// 大会员主题\n  @$pb.TagNumber(5)\n  $core.int get themeType => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set themeType($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasThemeType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearThemeType() => $_clearField(5);\n}\n\n/// 大会员标签\nclass VipLabel extends $pb.GeneratedMessage {\n  factory VipLabel({\n    $core.String? path,\n  }) {\n    final result = create();\n    if (path != null) result.path = path;\n    return result;\n  }\n\n  VipLabel._();\n\n  factory VipLabel.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory VipLabel.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'VipLabel',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'path')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VipLabel clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VipLabel copyWith(void Function(VipLabel) updates) =>\n      super.copyWith((message) => updates(message as VipLabel)) as VipLabel;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static VipLabel create() => VipLabel._();\n  @$core.override\n  VipLabel createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static VipLabel getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<VipLabel>(create);\n  static VipLabel? _defaultInstance;\n\n  /// 图片地址\n  @$pb.TagNumber(1)\n  $core.String get path => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set path($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPath() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPath() => $_clearField(1);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/dynamic/v1.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/dynamic/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nclass BgType extends $pb.ProtobufEnum {\n  static const BgType bg_type_default =\n      BgType._(0, _omitEnumNames ? '' : 'bg_type_default');\n  static const BgType bg_type_face =\n      BgType._(1, _omitEnumNames ? '' : 'bg_type_face');\n\n  static const $core.List<BgType> values = <BgType>[\n    bg_type_default,\n    bg_type_face,\n  ];\n\n  static final $core.List<BgType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static BgType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const BgType._(super.value, super.name);\n}\n\nclass BubbleModuleType extends $pb.ProtobufEnum {\n  static const BubbleModuleType BUBBLE_MODULE_NONE =\n      BubbleModuleType._(0, _omitEnumNames ? '' : 'BUBBLE_MODULE_NONE');\n  static const BubbleModuleType BUBBLE_MODULE_USER =\n      BubbleModuleType._(1, _omitEnumNames ? '' : 'BUBBLE_MODULE_USER');\n  static const BubbleModuleType BUBBLE_MODULE_TEXT =\n      BubbleModuleType._(2, _omitEnumNames ? '' : 'BUBBLE_MODULE_TEXT');\n  static const BubbleModuleType BUBBLE_MODULE_COLORED_TIP =\n      BubbleModuleType._(3, _omitEnumNames ? '' : 'BUBBLE_MODULE_COLORED_TIP');\n  static const BubbleModuleType BUBBLE_MODULE_PIC =\n      BubbleModuleType._(4, _omitEnumNames ? '' : 'BUBBLE_MODULE_PIC');\n\n  static const $core.List<BubbleModuleType> values = <BubbleModuleType>[\n    BUBBLE_MODULE_NONE,\n    BUBBLE_MODULE_USER,\n    BUBBLE_MODULE_TEXT,\n    BUBBLE_MODULE_COLORED_TIP,\n    BUBBLE_MODULE_PIC,\n  ];\n\n  static final $core.List<BubbleModuleType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 4);\n  static BubbleModuleType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const BubbleModuleType._(super.value, super.name);\n}\n\nclass CornerType extends $pb.ProtobufEnum {\n  static const CornerType corner_type_none =\n      CornerType._(0, _omitEnumNames ? '' : 'corner_type_none');\n  static const CornerType corner_type_text =\n      CornerType._(1, _omitEnumNames ? '' : 'corner_type_text');\n  static const CornerType corner_type_animation =\n      CornerType._(2, _omitEnumNames ? '' : 'corner_type_animation');\n  static const CornerType corner_type_static =\n      CornerType._(3, _omitEnumNames ? '' : 'corner_type_static');\n  static const CornerType corner_type_red_dot =\n      CornerType._(4, _omitEnumNames ? '' : 'corner_type_red_dot');\n  static const CornerType corner_type_number =\n      CornerType._(5, _omitEnumNames ? '' : 'corner_type_number');\n\n  static const $core.List<CornerType> values = <CornerType>[\n    corner_type_none,\n    corner_type_text,\n    corner_type_animation,\n    corner_type_static,\n    corner_type_red_dot,\n    corner_type_number,\n  ];\n\n  static final $core.List<CornerType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 5);\n  static CornerType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const CornerType._(super.value, super.name);\n}\n\n/// 折叠分类\nclass FoldType extends $pb.ProtobufEnum {\n  /// 占位\n  static const FoldType FoldTypeZero =\n      FoldType._(0, _omitEnumNames ? '' : 'FoldTypeZero');\n\n  /// 用户发布折叠\n  static const FoldType FoldTypePublish =\n      FoldType._(1, _omitEnumNames ? '' : 'FoldTypePublish');\n\n  /// 转发超频折叠\n  static const FoldType FoldTypeFrequent =\n      FoldType._(2, _omitEnumNames ? '' : 'FoldTypeFrequent');\n\n  /// 联合投稿折叠\n  static const FoldType FoldTypeUnite =\n      FoldType._(3, _omitEnumNames ? '' : 'FoldTypeUnite');\n\n  /// 动态受限折叠\n  static const FoldType FoldTypeLimit =\n      FoldType._(4, _omitEnumNames ? '' : 'FoldTypeLimit');\n\n  static const $core.List<FoldType> values = <FoldType>[\n    FoldTypeZero,\n    FoldTypePublish,\n    FoldTypeFrequent,\n    FoldTypeUnite,\n    FoldTypeLimit,\n  ];\n\n  static final $core.List<FoldType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 4);\n  static FoldType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const FoldType._(super.value, super.name);\n}\n\n/// 播放器类型\nclass MediaType extends $pb.ProtobufEnum {\n  /// 本地\n  static const MediaType MediaTypeNone =\n      MediaType._(0, _omitEnumNames ? '' : 'MediaTypeNone');\n\n  /// UGC\n  static const MediaType MediaTypeUGC =\n      MediaType._(1, _omitEnumNames ? '' : 'MediaTypeUGC');\n\n  /// PGC\n  static const MediaType MediaTypePGC =\n      MediaType._(2, _omitEnumNames ? '' : 'MediaTypePGC');\n\n  /// 直播\n  static const MediaType MediaTypeLive =\n      MediaType._(3, _omitEnumNames ? '' : 'MediaTypeLive');\n\n  /// 小视频\n  static const MediaType MediaTypeVCS =\n      MediaType._(4, _omitEnumNames ? '' : 'MediaTypeVCS');\n\n  static const $core.List<MediaType> values = <MediaType>[\n    MediaTypeNone,\n    MediaTypeUGC,\n    MediaTypePGC,\n    MediaTypeLive,\n    MediaTypeVCS,\n  ];\n\n  static final $core.List<MediaType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 4);\n  static MediaType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const MediaType._(super.value, super.name);\n}\n\nclass RelationStatus extends $pb.ProtobufEnum {\n  static const RelationStatus relation_status_none =\n      RelationStatus._(0, _omitEnumNames ? '' : 'relation_status_none');\n  static const RelationStatus relation_status_nofollow =\n      RelationStatus._(1, _omitEnumNames ? '' : 'relation_status_nofollow');\n  static const RelationStatus relation_status_follow =\n      RelationStatus._(2, _omitEnumNames ? '' : 'relation_status_follow');\n  static const RelationStatus relation_status_followed =\n      RelationStatus._(3, _omitEnumNames ? '' : 'relation_status_followed');\n  static const RelationStatus relation_status_mutual_concern = RelationStatus._(\n      4, _omitEnumNames ? '' : 'relation_status_mutual_concern');\n  static const RelationStatus relation_status_special =\n      RelationStatus._(5, _omitEnumNames ? '' : 'relation_status_special');\n\n  static const $core.List<RelationStatus> values = <RelationStatus>[\n    relation_status_none,\n    relation_status_nofollow,\n    relation_status_follow,\n    relation_status_followed,\n    relation_status_mutual_concern,\n    relation_status_special,\n  ];\n\n  static final $core.List<RelationStatus?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 5);\n  static RelationStatus? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const RelationStatus._(super.value, super.name);\n}\n\nclass SVideoType extends $pb.ProtobufEnum {\n  static const SVideoType TypeNone =\n      SVideoType._(0, _omitEnumNames ? '' : 'TypeNone');\n  static const SVideoType TypeDynamic =\n      SVideoType._(1, _omitEnumNames ? '' : 'TypeDynamic');\n  static const SVideoType TypePopularIndex =\n      SVideoType._(2, _omitEnumNames ? '' : 'TypePopularIndex');\n  static const SVideoType TypePopularHotword =\n      SVideoType._(3, _omitEnumNames ? '' : 'TypePopularHotword');\n\n  static const $core.List<SVideoType> values = <SVideoType>[\n    TypeNone,\n    TypeDynamic,\n    TypePopularIndex,\n    TypePopularHotword,\n  ];\n\n  static final $core.List<SVideoType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static SVideoType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const SVideoType._(super.value, super.name);\n}\n\nclass StyleType extends $pb.ProtobufEnum {\n  static const StyleType STYLE_TYPE_NONE =\n      StyleType._(0, _omitEnumNames ? '' : 'STYLE_TYPE_NONE');\n  static const StyleType STYLE_TYPE_LIVE =\n      StyleType._(1, _omitEnumNames ? '' : 'STYLE_TYPE_LIVE');\n  static const StyleType STYLE_TYPE_DYN_UP =\n      StyleType._(2, _omitEnumNames ? '' : 'STYLE_TYPE_DYN_UP');\n  static const StyleType STYLE_TYPE_OGV_UP =\n      StyleType._(3, _omitEnumNames ? '' : 'STYLE_TYPE_OGV_UP');\n  static const StyleType STYLE_TYPE_COLLECTION_UP =\n      StyleType._(4, _omitEnumNames ? '' : 'STYLE_TYPE_COLLECTION_UP');\n\n  static const $core.List<StyleType> values = <StyleType>[\n    STYLE_TYPE_NONE,\n    STYLE_TYPE_LIVE,\n    STYLE_TYPE_DYN_UP,\n    STYLE_TYPE_OGV_UP,\n    STYLE_TYPE_COLLECTION_UP,\n  ];\n\n  static final $core.List<StyleType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 4);\n  static StyleType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const StyleType._(super.value, super.name);\n}\n\n/// 番剧类型\nclass VideoSubType extends $pb.ProtobufEnum {\n  /// 没有子类型\n  static const VideoSubType VideoSubTypeNone =\n      VideoSubType._(0, _omitEnumNames ? '' : 'VideoSubTypeNone');\n\n  /// 番剧\n  static const VideoSubType VideoSubTypeBangumi =\n      VideoSubType._(1, _omitEnumNames ? '' : 'VideoSubTypeBangumi');\n\n  /// 电影\n  static const VideoSubType VideoSubTypeMovie =\n      VideoSubType._(2, _omitEnumNames ? '' : 'VideoSubTypeMovie');\n\n  /// 纪录片\n  static const VideoSubType VideoSubTypeDocumentary =\n      VideoSubType._(3, _omitEnumNames ? '' : 'VideoSubTypeDocumentary');\n\n  /// 国创\n  static const VideoSubType VideoSubTypeDomestic =\n      VideoSubType._(4, _omitEnumNames ? '' : 'VideoSubTypeDomestic');\n\n  /// 电视剧\n  static const VideoSubType VideoSubTypeTeleplay =\n      VideoSubType._(5, _omitEnumNames ? '' : 'VideoSubTypeTeleplay');\n\n  static const $core.List<VideoSubType> values = <VideoSubType>[\n    VideoSubTypeNone,\n    VideoSubTypeBangumi,\n    VideoSubTypeMovie,\n    VideoSubTypeDocumentary,\n    VideoSubTypeDomestic,\n    VideoSubTypeTeleplay,\n  ];\n\n  static final $core.List<VideoSubType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 5);\n  static VideoSubType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const VideoSubType._(super.value, super.name);\n}\n\nclass DynRedReq_DynRedReqScene extends $pb.ProtobufEnum {\n  static const DynRedReq_DynRedReqScene RED_REQ_NONE =\n      DynRedReq_DynRedReqScene._(0, _omitEnumNames ? '' : 'RED_REQ_NONE');\n  static const DynRedReq_DynRedReqScene RED_REQ_RETURN_TO_TAB_1 =\n      DynRedReq_DynRedReqScene._(\n          1, _omitEnumNames ? '' : 'RED_REQ_RETURN_TO_TAB_1');\n  static const DynRedReq_DynRedReqScene RED_REQ_PERIODICALLY_AWAKE =\n      DynRedReq_DynRedReqScene._(\n          2, _omitEnumNames ? '' : 'RED_REQ_PERIODICALLY_AWAKE');\n  static const DynRedReq_DynRedReqScene RED_REQ_SWITCH_ACCOUNT =\n      DynRedReq_DynRedReqScene._(\n          3, _omitEnumNames ? '' : 'RED_REQ_SWITCH_ACCOUNT');\n\n  static const $core.List<DynRedReq_DynRedReqScene> values =\n      <DynRedReq_DynRedReqScene>[\n    RED_REQ_NONE,\n    RED_REQ_RETURN_TO_TAB_1,\n    RED_REQ_PERIODICALLY_AWAKE,\n    RED_REQ_SWITCH_ACCOUNT,\n  ];\n\n  static final $core.List<DynRedReq_DynRedReqScene?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static DynRedReq_DynRedReqScene? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const DynRedReq_DynRedReqScene._(super.value, super.name);\n}\n\nconst $core.bool _omitEnumNames =\n    $core.bool.fromEnvironment('protobuf.omit_enum_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/dynamic/v1.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/dynamic/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use bgTypeDescriptor instead')\nconst BgType$json = {\n  '1': 'BgType',\n  '2': [\n    {'1': 'bg_type_default', '2': 0},\n    {'1': 'bg_type_face', '2': 1},\n  ],\n};\n\n/// Descriptor for `BgType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List bgTypeDescriptor = $convert.base64Decode(\n    'CgZCZ1R5cGUSEwoPYmdfdHlwZV9kZWZhdWx0EAASEAoMYmdfdHlwZV9mYWNlEAE=');\n\n@$core.Deprecated('Use bubbleModuleTypeDescriptor instead')\nconst BubbleModuleType$json = {\n  '1': 'BubbleModuleType',\n  '2': [\n    {'1': 'BUBBLE_MODULE_NONE', '2': 0},\n    {'1': 'BUBBLE_MODULE_USER', '2': 1},\n    {'1': 'BUBBLE_MODULE_TEXT', '2': 2},\n    {'1': 'BUBBLE_MODULE_COLORED_TIP', '2': 3},\n    {'1': 'BUBBLE_MODULE_PIC', '2': 4},\n  ],\n};\n\n/// Descriptor for `BubbleModuleType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List bubbleModuleTypeDescriptor = $convert.base64Decode(\n    'ChBCdWJibGVNb2R1bGVUeXBlEhYKEkJVQkJMRV9NT0RVTEVfTk9ORRAAEhYKEkJVQkJMRV9NT0'\n    'RVTEVfVVNFUhABEhYKEkJVQkJMRV9NT0RVTEVfVEVYVBACEh0KGUJVQkJMRV9NT0RVTEVfQ09M'\n    'T1JFRF9USVAQAxIVChFCVUJCTEVfTU9EVUxFX1BJQxAE');\n\n@$core.Deprecated('Use cornerTypeDescriptor instead')\nconst CornerType$json = {\n  '1': 'CornerType',\n  '2': [\n    {'1': 'corner_type_none', '2': 0},\n    {'1': 'corner_type_text', '2': 1},\n    {'1': 'corner_type_animation', '2': 2},\n    {'1': 'corner_type_static', '2': 3},\n    {'1': 'corner_type_red_dot', '2': 4},\n    {'1': 'corner_type_number', '2': 5},\n  ],\n};\n\n/// Descriptor for `CornerType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List cornerTypeDescriptor = $convert.base64Decode(\n    'CgpDb3JuZXJUeXBlEhQKEGNvcm5lcl90eXBlX25vbmUQABIUChBjb3JuZXJfdHlwZV90ZXh0EA'\n    'ESGQoVY29ybmVyX3R5cGVfYW5pbWF0aW9uEAISFgoSY29ybmVyX3R5cGVfc3RhdGljEAMSFwoT'\n    'Y29ybmVyX3R5cGVfcmVkX2RvdBAEEhYKEmNvcm5lcl90eXBlX251bWJlchAF');\n\n@$core.Deprecated('Use foldTypeDescriptor instead')\nconst FoldType$json = {\n  '1': 'FoldType',\n  '2': [\n    {'1': 'FoldTypeZero', '2': 0},\n    {'1': 'FoldTypePublish', '2': 1},\n    {'1': 'FoldTypeFrequent', '2': 2},\n    {'1': 'FoldTypeUnite', '2': 3},\n    {'1': 'FoldTypeLimit', '2': 4},\n  ],\n};\n\n/// Descriptor for `FoldType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List foldTypeDescriptor = $convert.base64Decode(\n    'CghGb2xkVHlwZRIQCgxGb2xkVHlwZVplcm8QABITCg9Gb2xkVHlwZVB1Ymxpc2gQARIUChBGb2'\n    'xkVHlwZUZyZXF1ZW50EAISEQoNRm9sZFR5cGVVbml0ZRADEhEKDUZvbGRUeXBlTGltaXQQBA==');\n\n@$core.Deprecated('Use mediaTypeDescriptor instead')\nconst MediaType$json = {\n  '1': 'MediaType',\n  '2': [\n    {'1': 'MediaTypeNone', '2': 0},\n    {'1': 'MediaTypeUGC', '2': 1},\n    {'1': 'MediaTypePGC', '2': 2},\n    {'1': 'MediaTypeLive', '2': 3},\n    {'1': 'MediaTypeVCS', '2': 4},\n  ],\n};\n\n/// Descriptor for `MediaType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List mediaTypeDescriptor = $convert.base64Decode(\n    'CglNZWRpYVR5cGUSEQoNTWVkaWFUeXBlTm9uZRAAEhAKDE1lZGlhVHlwZVVHQxABEhAKDE1lZG'\n    'lhVHlwZVBHQxACEhEKDU1lZGlhVHlwZUxpdmUQAxIQCgxNZWRpYVR5cGVWQ1MQBA==');\n\n@$core.Deprecated('Use relationStatusDescriptor instead')\nconst RelationStatus$json = {\n  '1': 'RelationStatus',\n  '2': [\n    {'1': 'relation_status_none', '2': 0},\n    {'1': 'relation_status_nofollow', '2': 1},\n    {'1': 'relation_status_follow', '2': 2},\n    {'1': 'relation_status_followed', '2': 3},\n    {'1': 'relation_status_mutual_concern', '2': 4},\n    {'1': 'relation_status_special', '2': 5},\n  ],\n};\n\n/// Descriptor for `RelationStatus`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List relationStatusDescriptor = $convert.base64Decode(\n    'Cg5SZWxhdGlvblN0YXR1cxIYChRyZWxhdGlvbl9zdGF0dXNfbm9uZRAAEhwKGHJlbGF0aW9uX3'\n    'N0YXR1c19ub2ZvbGxvdxABEhoKFnJlbGF0aW9uX3N0YXR1c19mb2xsb3cQAhIcChhyZWxhdGlv'\n    'bl9zdGF0dXNfZm9sbG93ZWQQAxIiCh5yZWxhdGlvbl9zdGF0dXNfbXV0dWFsX2NvbmNlcm4QBB'\n    'IbChdyZWxhdGlvbl9zdGF0dXNfc3BlY2lhbBAF');\n\n@$core.Deprecated('Use sVideoTypeDescriptor instead')\nconst SVideoType$json = {\n  '1': 'SVideoType',\n  '2': [\n    {'1': 'TypeNone', '2': 0},\n    {'1': 'TypeDynamic', '2': 1},\n    {'1': 'TypePopularIndex', '2': 2},\n    {'1': 'TypePopularHotword', '2': 3},\n  ],\n};\n\n/// Descriptor for `SVideoType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List sVideoTypeDescriptor = $convert.base64Decode(\n    'CgpTVmlkZW9UeXBlEgwKCFR5cGVOb25lEAASDwoLVHlwZUR5bmFtaWMQARIUChBUeXBlUG9wdW'\n    'xhckluZGV4EAISFgoSVHlwZVBvcHVsYXJIb3R3b3JkEAM=');\n\n@$core.Deprecated('Use styleTypeDescriptor instead')\nconst StyleType$json = {\n  '1': 'StyleType',\n  '2': [\n    {'1': 'STYLE_TYPE_NONE', '2': 0},\n    {'1': 'STYLE_TYPE_LIVE', '2': 1},\n    {'1': 'STYLE_TYPE_DYN_UP', '2': 2},\n    {'1': 'STYLE_TYPE_OGV_UP', '2': 3},\n    {'1': 'STYLE_TYPE_COLLECTION_UP', '2': 4},\n  ],\n};\n\n/// Descriptor for `StyleType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List styleTypeDescriptor = $convert.base64Decode(\n    'CglTdHlsZVR5cGUSEwoPU1RZTEVfVFlQRV9OT05FEAASEwoPU1RZTEVfVFlQRV9MSVZFEAESFQ'\n    'oRU1RZTEVfVFlQRV9EWU5fVVAQAhIVChFTVFlMRV9UWVBFX09HVl9VUBADEhwKGFNUWUxFX1RZ'\n    'UEVfQ09MTEVDVElPTl9VUBAE');\n\n@$core.Deprecated('Use videoSubTypeDescriptor instead')\nconst VideoSubType$json = {\n  '1': 'VideoSubType',\n  '2': [\n    {'1': 'VideoSubTypeNone', '2': 0},\n    {'1': 'VideoSubTypeBangumi', '2': 1},\n    {'1': 'VideoSubTypeMovie', '2': 2},\n    {'1': 'VideoSubTypeDocumentary', '2': 3},\n    {'1': 'VideoSubTypeDomestic', '2': 4},\n    {'1': 'VideoSubTypeTeleplay', '2': 5},\n  ],\n};\n\n/// Descriptor for `VideoSubType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List videoSubTypeDescriptor = $convert.base64Decode(\n    'CgxWaWRlb1N1YlR5cGUSFAoQVmlkZW9TdWJUeXBlTm9uZRAAEhcKE1ZpZGVvU3ViVHlwZUJhbm'\n    'd1bWkQARIVChFWaWRlb1N1YlR5cGVNb3ZpZRACEhsKF1ZpZGVvU3ViVHlwZURvY3VtZW50YXJ5'\n    'EAMSGAoUVmlkZW9TdWJUeXBlRG9tZXN0aWMQBBIYChRWaWRlb1N1YlR5cGVUZWxlcGxheRAF');\n\n@$core.Deprecated('Use adInfoDescriptor instead')\nconst AdInfo$json = {\n  '1': 'AdInfo',\n  '2': [\n    {'1': 'nation_code', '3': 1, '4': 1, '5': 9, '10': 'nationCode'},\n    {'1': 'adcode', '3': 2, '4': 1, '5': 9, '10': 'adcode'},\n    {'1': 'city_code', '3': 3, '4': 1, '5': 9, '10': 'cityCode'},\n    {'1': 'name', '3': 4, '4': 1, '5': 9, '10': 'name'},\n    {\n      '1': 'gps',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.Gps',\n      '10': 'gps'\n    },\n  ],\n};\n\n/// Descriptor for `AdInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List adInfoDescriptor = $convert.base64Decode(\n    'CgZBZEluZm8SHwoLbmF0aW9uX2NvZGUYASABKAlSCm5hdGlvbkNvZGUSFgoGYWRjb2RlGAIgAS'\n    'gJUgZhZGNvZGUSGwoJY2l0eV9jb2RlGAMgASgJUghjaXR5Q29kZRISCgRuYW1lGAQgASgJUgRu'\n    'YW1lEi4KA2dwcxgFIAEoCzIcLmJpbGliaWxpLmFwcC5keW5hbWljLnYxLkdwc1IDZ3Bz');\n\n@$core.Deprecated('Use addressComponentDescriptor instead')\nconst AddressComponent$json = {\n  '1': 'AddressComponent',\n  '2': [\n    {'1': 'nation', '3': 1, '4': 1, '5': 9, '10': 'nation'},\n    {'1': 'province', '3': 2, '4': 1, '5': 9, '10': 'province'},\n    {'1': 'city', '3': 3, '4': 1, '5': 9, '10': 'city'},\n    {'1': 'district', '3': 4, '4': 1, '5': 9, '10': 'district'},\n    {'1': 'street', '3': 5, '4': 1, '5': 9, '10': 'street'},\n    {'1': 'street_number', '3': 6, '4': 1, '5': 9, '10': 'streetNumber'},\n  ],\n};\n\n/// Descriptor for `AddressComponent`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List addressComponentDescriptor = $convert.base64Decode(\n    'ChBBZGRyZXNzQ29tcG9uZW50EhYKBm5hdGlvbhgBIAEoCVIGbmF0aW9uEhoKCHByb3ZpbmNlGA'\n    'IgASgJUghwcm92aW5jZRISCgRjaXR5GAMgASgJUgRjaXR5EhoKCGRpc3RyaWN0GAQgASgJUghk'\n    'aXN0cmljdBIWCgZzdHJlZXQYBSABKAlSBnN0cmVldBIjCg1zdHJlZXRfbnVtYmVyGAYgASgJUg'\n    'xzdHJlZXROdW1iZXI=');\n\n@$core.Deprecated('Use bubbleInfoDescriptor instead')\nconst BubbleInfo$json = {\n  '1': 'BubbleInfo',\n  '2': [\n    {\n      '1': 'modules',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.BubbleModule',\n      '10': 'modules'\n    },\n    {'1': 'track_id', '3': 2, '4': 1, '5': 9, '10': 'trackId'},\n    {\n      '1': 'bubble_recall_extra_when_show',\n      '3': 3,\n      '4': 1,\n      '5': 9,\n      '10': 'bubbleRecallExtraWhenShow'\n    },\n  ],\n};\n\n/// Descriptor for `BubbleInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bubbleInfoDescriptor = $convert.base64Decode(\n    'CgpCdWJibGVJbmZvEj8KB21vZHVsZXMYASADKAsyJS5iaWxpYmlsaS5hcHAuZHluYW1pYy52MS'\n    '5CdWJibGVNb2R1bGVSB21vZHVsZXMSGQoIdHJhY2tfaWQYAiABKAlSB3RyYWNrSWQSQAodYnVi'\n    'YmxlX3JlY2FsbF9leHRyYV93aGVuX3Nob3cYAyABKAlSGWJ1YmJsZVJlY2FsbEV4dHJhV2hlbl'\n    'Nob3c=');\n\n@$core.Deprecated('Use bubbleModuleDescriptor instead')\nconst BubbleModule$json = {\n  '1': 'BubbleModule',\n  '2': [\n    {\n      '1': 'user',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.BubbleModuleUser',\n      '9': 0,\n      '10': 'user'\n    },\n    {\n      '1': 'text',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.BubbleModuleText',\n      '9': 0,\n      '10': 'text'\n    },\n    {\n      '1': 'colored_tip',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.BubbleModuleColoredTip',\n      '9': 0,\n      '10': 'coloredTip'\n    },\n    {\n      '1': 'pic',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.BubbleModulePic',\n      '9': 0,\n      '10': 'pic'\n    },\n    {\n      '1': 'module_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v1.BubbleModuleType',\n      '10': 'moduleType'\n    },\n  ],\n  '8': [\n    {'1': 'module'},\n  ],\n};\n\n/// Descriptor for `BubbleModule`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bubbleModuleDescriptor = $convert.base64Decode(\n    'CgxCdWJibGVNb2R1bGUSPwoEdXNlchgCIAEoCzIpLmJpbGliaWxpLmFwcC5keW5hbWljLnYxLk'\n    'J1YmJsZU1vZHVsZVVzZXJIAFIEdXNlchI/CgR0ZXh0GAMgASgLMikuYmlsaWJpbGkuYXBwLmR5'\n    'bmFtaWMudjEuQnViYmxlTW9kdWxlVGV4dEgAUgR0ZXh0ElIKC2NvbG9yZWRfdGlwGAQgASgLMi'\n    '8uYmlsaWJpbGkuYXBwLmR5bmFtaWMudjEuQnViYmxlTW9kdWxlQ29sb3JlZFRpcEgAUgpjb2xv'\n    'cmVkVGlwEjwKA3BpYxgFIAEoCzIoLmJpbGliaWxpLmFwcC5keW5hbWljLnYxLkJ1YmJsZU1vZH'\n    'VsZVBpY0gAUgNwaWMSSgoLbW9kdWxlX3R5cGUYASABKA4yKS5iaWxpYmlsaS5hcHAuZHluYW1p'\n    'Yy52MS5CdWJibGVNb2R1bGVUeXBlUgptb2R1bGVUeXBlQggKBm1vZHVsZQ==');\n\n@$core.Deprecated('Use bubbleModuleColoredTipDescriptor instead')\nconst BubbleModuleColoredTip$json = {\n  '1': 'BubbleModuleColoredTip',\n  '2': [\n    {'1': 'prefix_icon', '3': 1, '4': 1, '5': 9, '10': 'prefixIcon'},\n    {\n      '1': 'is_svga_prefix_icon',\n      '3': 2,\n      '4': 1,\n      '5': 8,\n      '10': 'isSvgaPrefixIcon'\n    },\n    {'1': 'text', '3': 3, '4': 1, '5': 9, '10': 'text'},\n    {\n      '1': 'text_color',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.Color',\n      '10': 'textColor'\n    },\n  ],\n};\n\n/// Descriptor for `BubbleModuleColoredTip`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bubbleModuleColoredTipDescriptor = $convert.base64Decode(\n    'ChZCdWJibGVNb2R1bGVDb2xvcmVkVGlwEh8KC3ByZWZpeF9pY29uGAEgASgJUgpwcmVmaXhJY2'\n    '9uEi0KE2lzX3N2Z2FfcHJlZml4X2ljb24YAiABKAhSEGlzU3ZnYVByZWZpeEljb24SEgoEdGV4'\n    'dBgDIAEoCVIEdGV4dBI9Cgp0ZXh0X2NvbG9yGAQgASgLMh4uYmlsaWJpbGkuYXBwLmR5bmFtaW'\n    'MudjEuQ29sb3JSCXRleHRDb2xvcg==');\n\n@$core.Deprecated('Use bubbleModulePicDescriptor instead')\nconst BubbleModulePic$json = {\n  '1': 'BubbleModulePic',\n  '2': [\n    {'1': 'pic_day', '3': 1, '4': 1, '5': 9, '10': 'picDay'},\n    {'1': 'pic_night', '3': 2, '4': 1, '5': 9, '10': 'picNight'},\n    {'1': 'pic_width', '3': 3, '4': 1, '5': 3, '10': 'picWidth'},\n    {'1': 'pic_height', '3': 4, '4': 1, '5': 3, '10': 'picHeight'},\n    {'1': 'rounded_corner', '3': 5, '4': 1, '5': 8, '10': 'roundedCorner'},\n    {\n      '1': 'rounded_corner_radius',\n      '3': 6,\n      '4': 1,\n      '5': 3,\n      '10': 'roundedCornerRadius'\n    },\n  ],\n};\n\n/// Descriptor for `BubbleModulePic`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bubbleModulePicDescriptor = $convert.base64Decode(\n    'Cg9CdWJibGVNb2R1bGVQaWMSFwoHcGljX2RheRgBIAEoCVIGcGljRGF5EhsKCXBpY19uaWdodB'\n    'gCIAEoCVIIcGljTmlnaHQSGwoJcGljX3dpZHRoGAMgASgDUghwaWNXaWR0aBIdCgpwaWNfaGVp'\n    'Z2h0GAQgASgDUglwaWNIZWlnaHQSJQoOcm91bmRlZF9jb3JuZXIYBSABKAhSDXJvdW5kZWRDb3'\n    'JuZXISMgoVcm91bmRlZF9jb3JuZXJfcmFkaXVzGAYgASgDUhNyb3VuZGVkQ29ybmVyUmFkaXVz');\n\n@$core.Deprecated('Use bubbleModuleTextDescriptor instead')\nconst BubbleModuleText$json = {\n  '1': 'BubbleModuleText',\n  '2': [\n    {'1': 'content', '3': 1, '4': 1, '5': 9, '10': 'content'},\n  ],\n};\n\n/// Descriptor for `BubbleModuleText`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bubbleModuleTextDescriptor = $convert.base64Decode(\n    'ChBCdWJibGVNb2R1bGVUZXh0EhgKB2NvbnRlbnQYASABKAlSB2NvbnRlbnQ=');\n\n@$core.Deprecated('Use bubbleModuleUserDescriptor instead')\nconst BubbleModuleUser$json = {\n  '1': 'BubbleModuleUser',\n  '2': [\n    {\n      '1': 'users',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.UserInfo',\n      '10': 'users'\n    },\n  ],\n};\n\n/// Descriptor for `BubbleModuleUser`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bubbleModuleUserDescriptor = $convert.base64Decode(\n    'ChBCdWJibGVNb2R1bGVVc2VyEjcKBXVzZXJzGAEgAygLMiEuYmlsaWJpbGkuYXBwLmR5bmFtaW'\n    'MudjEuVXNlckluZm9SBXVzZXJz');\n\n@$core.Deprecated('Use cardCurrBatchDescriptor instead')\nconst CardCurrBatch$json = {\n  '1': 'CardCurrBatch',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 2, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'text1', '3': 4, '4': 1, '5': 9, '10': 'text1'},\n    {'1': 'text2', '3': 5, '4': 1, '5': 9, '10': 'text2'},\n    {\n      '1': 'badge',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.VideoBadge',\n      '10': 'badge'\n    },\n  ],\n};\n\n/// Descriptor for `CardCurrBatch`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cardCurrBatchDescriptor = $convert.base64Decode(\n    'Cg1DYXJkQ3VyckJhdGNoEhQKBXRpdGxlGAEgASgJUgV0aXRsZRIUCgVjb3ZlchgCIAEoCVIFY2'\n    '92ZXISEAoDdXJpGAMgASgJUgN1cmkSFAoFdGV4dDEYBCABKAlSBXRleHQxEhQKBXRleHQyGAUg'\n    'ASgJUgV0ZXh0MhI5CgViYWRnZRgGIAEoCzIjLmJpbGliaWxpLmFwcC5keW5hbWljLnYxLlZpZG'\n    'VvQmFkZ2VSBWJhZGdl');\n\n@$core.Deprecated('Use cardCurrSeasonDescriptor instead')\nconst CardCurrSeason$json = {\n  '1': 'CardCurrSeason',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 2, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'text1', '3': 4, '4': 1, '5': 9, '10': 'text1'},\n    {'1': 'desc', '3': 5, '4': 1, '5': 9, '10': 'desc'},\n    {\n      '1': 'badge',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.VideoBadge',\n      '10': 'badge'\n    },\n  ],\n};\n\n/// Descriptor for `CardCurrSeason`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cardCurrSeasonDescriptor = $convert.base64Decode(\n    'Cg5DYXJkQ3VyclNlYXNvbhIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSFAoFY292ZXIYAiABKAlSBW'\n    'NvdmVyEhAKA3VyaRgDIAEoCVIDdXJpEhQKBXRleHQxGAQgASgJUgV0ZXh0MRISCgRkZXNjGAUg'\n    'ASgJUgRkZXNjEjkKBWJhZGdlGAYgASgLMiMuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjEuVmlkZW'\n    '9CYWRnZVIFYmFkZ2U=');\n\n@$core.Deprecated('Use cardPGCDescriptor instead')\nconst CardPGC$json = {\n  '1': 'CardPGC',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 2, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'cover_left_text1', '3': 4, '4': 1, '5': 9, '10': 'coverLeftText1'},\n    {'1': 'cover_left_text2', '3': 5, '4': 1, '5': 9, '10': 'coverLeftText2'},\n    {'1': 'cover_left_text3', '3': 6, '4': 1, '5': 9, '10': 'coverLeftText3'},\n    {'1': 'cid', '3': 7, '4': 1, '5': 3, '10': 'cid'},\n    {'1': 'season_id', '3': 8, '4': 1, '5': 3, '10': 'seasonId'},\n    {'1': 'epid', '3': 9, '4': 1, '5': 3, '10': 'epid'},\n    {'1': 'aid', '3': 10, '4': 1, '5': 3, '10': 'aid'},\n    {\n      '1': 'media_type',\n      '3': 11,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v1.MediaType',\n      '10': 'mediaType'\n    },\n    {\n      '1': 'sub_type',\n      '3': 12,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v1.VideoSubType',\n      '10': 'subType'\n    },\n    {'1': 'is_preview', '3': 13, '4': 1, '5': 5, '10': 'isPreview'},\n    {\n      '1': 'dimension',\n      '3': 14,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.Dimension',\n      '10': 'dimension'\n    },\n    {\n      '1': 'badge',\n      '3': 15,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.VideoBadge',\n      '10': 'badge'\n    },\n    {'1': 'can_play', '3': 16, '4': 1, '5': 5, '10': 'canPlay'},\n    {\n      '1': 'season',\n      '3': 17,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.PGCSeason',\n      '10': 'season'\n    },\n  ],\n};\n\n/// Descriptor for `CardPGC`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cardPGCDescriptor = $convert.base64Decode(\n    'CgdDYXJkUEdDEhQKBXRpdGxlGAEgASgJUgV0aXRsZRIUCgVjb3ZlchgCIAEoCVIFY292ZXISEA'\n    'oDdXJpGAMgASgJUgN1cmkSKAoQY292ZXJfbGVmdF90ZXh0MRgEIAEoCVIOY292ZXJMZWZ0VGV4'\n    'dDESKAoQY292ZXJfbGVmdF90ZXh0MhgFIAEoCVIOY292ZXJMZWZ0VGV4dDISKAoQY292ZXJfbG'\n    'VmdF90ZXh0MxgGIAEoCVIOY292ZXJMZWZ0VGV4dDMSEAoDY2lkGAcgASgDUgNjaWQSGwoJc2Vh'\n    'c29uX2lkGAggASgDUghzZWFzb25JZBISCgRlcGlkGAkgASgDUgRlcGlkEhAKA2FpZBgKIAEoA1'\n    'IDYWlkEkEKCm1lZGlhX3R5cGUYCyABKA4yIi5iaWxpYmlsaS5hcHAuZHluYW1pYy52MS5NZWRp'\n    'YVR5cGVSCW1lZGlhVHlwZRJACghzdWJfdHlwZRgMIAEoDjIlLmJpbGliaWxpLmFwcC5keW5hbW'\n    'ljLnYxLlZpZGVvU3ViVHlwZVIHc3ViVHlwZRIdCgppc19wcmV2aWV3GA0gASgFUglpc1ByZXZp'\n    'ZXcSQAoJZGltZW5zaW9uGA4gASgLMiIuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjEuRGltZW5zaW'\n    '9uUglkaW1lbnNpb24SOQoFYmFkZ2UYDyADKAsyIy5iaWxpYmlsaS5hcHAuZHluYW1pYy52MS5W'\n    'aWRlb0JhZGdlUgViYWRnZRIZCghjYW5fcGxheRgQIAEoBVIHY2FuUGxheRI6CgZzZWFzb24YES'\n    'ABKAsyIi5iaWxpYmlsaS5hcHAuZHluYW1pYy52MS5QR0NTZWFzb25SBnNlYXNvbg==');\n\n@$core.Deprecated('Use cardUGCDescriptor instead')\nconst CardUGC$json = {\n  '1': 'CardUGC',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 2, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'cover_left_text1', '3': 4, '4': 1, '5': 9, '10': 'coverLeftText1'},\n    {'1': 'cover_left_text2', '3': 5, '4': 1, '5': 9, '10': 'coverLeftText2'},\n    {'1': 'cover_left_text3', '3': 6, '4': 1, '5': 9, '10': 'coverLeftText3'},\n    {'1': 'avid', '3': 7, '4': 1, '5': 3, '10': 'avid'},\n    {'1': 'cid', '3': 8, '4': 1, '5': 3, '10': 'cid'},\n    {\n      '1': 'media_type',\n      '3': 9,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v1.MediaType',\n      '10': 'mediaType'\n    },\n    {\n      '1': 'dimension',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.Dimension',\n      '10': 'dimension'\n    },\n    {\n      '1': 'badge',\n      '3': 11,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.VideoBadge',\n      '10': 'badge'\n    },\n    {'1': 'can_play', '3': 12, '4': 1, '5': 5, '10': 'canPlay'},\n  ],\n};\n\n/// Descriptor for `CardUGC`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cardUGCDescriptor = $convert.base64Decode(\n    'CgdDYXJkVUdDEhQKBXRpdGxlGAEgASgJUgV0aXRsZRIUCgVjb3ZlchgCIAEoCVIFY292ZXISEA'\n    'oDdXJpGAMgASgJUgN1cmkSKAoQY292ZXJfbGVmdF90ZXh0MRgEIAEoCVIOY292ZXJMZWZ0VGV4'\n    'dDESKAoQY292ZXJfbGVmdF90ZXh0MhgFIAEoCVIOY292ZXJMZWZ0VGV4dDISKAoQY292ZXJfbG'\n    'VmdF90ZXh0MxgGIAEoCVIOY292ZXJMZWZ0VGV4dDMSEgoEYXZpZBgHIAEoA1IEYXZpZBIQCgNj'\n    'aWQYCCABKANSA2NpZBJBCgptZWRpYV90eXBlGAkgASgOMiIuYmlsaWJpbGkuYXBwLmR5bmFtaW'\n    'MudjEuTWVkaWFUeXBlUgltZWRpYVR5cGUSQAoJZGltZW5zaW9uGAogASgLMiIuYmlsaWJpbGku'\n    'YXBwLmR5bmFtaWMudjEuRGltZW5zaW9uUglkaW1lbnNpb24SOQoFYmFkZ2UYCyADKAsyIy5iaW'\n    'xpYmlsaS5hcHAuZHluYW1pYy52MS5WaWRlb0JhZGdlUgViYWRnZRIZCghjYW5fcGxheRgMIAEo'\n    'BVIHY2FuUGxheQ==');\n\n@$core.Deprecated('Use colorDescriptor instead')\nconst Color$json = {\n  '1': 'Color',\n  '2': [\n    {'1': 'color_day', '3': 1, '4': 1, '5': 9, '10': 'colorDay'},\n    {'1': 'color_night', '3': 2, '4': 1, '5': 9, '10': 'colorNight'},\n  ],\n};\n\n/// Descriptor for `Color`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List colorDescriptor = $convert.base64Decode(\n    'CgVDb2xvchIbCgljb2xvcl9kYXkYASABKAlSCGNvbG9yRGF5Eh8KC2NvbG9yX25pZ2h0GAIgAS'\n    'gJUgpjb2xvck5pZ2h0');\n\n@$core.Deprecated('Use cornerInfoDescriptor instead')\nconst CornerInfo$json = {\n  '1': 'CornerInfo',\n  '2': [\n    {\n      '1': 'corner_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v1.CornerType',\n      '10': 'cornerType'\n    },\n    {'1': 'corner_text', '3': 2, '4': 1, '5': 9, '10': 'cornerText'},\n    {\n      '1': 'corner_text_color',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.Color',\n      '10': 'cornerTextColor'\n    },\n    {\n      '1': 'corner_text_bg_color',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.Color',\n      '10': 'cornerTextBgColor'\n    },\n    {'1': 'corner_icon', '3': 5, '4': 1, '5': 9, '10': 'cornerIcon'},\n    {'1': 'corner_number', '3': 6, '4': 1, '5': 3, '10': 'cornerNumber'},\n  ],\n};\n\n/// Descriptor for `CornerInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cornerInfoDescriptor = $convert.base64Decode(\n    'CgpDb3JuZXJJbmZvEkQKC2Nvcm5lcl90eXBlGAEgASgOMiMuYmlsaWJpbGkuYXBwLmR5bmFtaW'\n    'MudjEuQ29ybmVyVHlwZVIKY29ybmVyVHlwZRIfCgtjb3JuZXJfdGV4dBgCIAEoCVIKY29ybmVy'\n    'VGV4dBJKChFjb3JuZXJfdGV4dF9jb2xvchgDIAEoCzIeLmJpbGliaWxpLmFwcC5keW5hbWljLn'\n    'YxLkNvbG9yUg9jb3JuZXJUZXh0Q29sb3ISTwoUY29ybmVyX3RleHRfYmdfY29sb3IYBCABKAsy'\n    'Hi5iaWxpYmlsaS5hcHAuZHluYW1pYy52MS5Db2xvclIRY29ybmVyVGV4dEJnQ29sb3ISHwoLY2'\n    '9ybmVyX2ljb24YBSABKAlSCmNvcm5lckljb24SIwoNY29ybmVyX251bWJlchgGIAEoA1IMY29y'\n    'bmVyTnVtYmVy');\n\n@$core.Deprecated('Use decoCardFanDescriptor instead')\nconst DecoCardFan$json = {\n  '1': 'DecoCardFan',\n  '2': [\n    {'1': 'is_fan', '3': 1, '4': 1, '5': 5, '10': 'isFan'},\n    {'1': 'number', '3': 2, '4': 1, '5': 5, '10': 'number'},\n    {'1': 'color', '3': 3, '4': 1, '5': 9, '10': 'color'},\n  ],\n};\n\n/// Descriptor for `DecoCardFan`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List decoCardFanDescriptor = $convert.base64Decode(\n    'CgtEZWNvQ2FyZEZhbhIVCgZpc19mYW4YASABKAVSBWlzRmFuEhYKBm51bWJlchgCIAEoBVIGbn'\n    'VtYmVyEhQKBWNvbG9yGAMgASgJUgVjb2xvcg==');\n\n@$core.Deprecated('Use decorateCardDescriptor instead')\nconst DecorateCard$json = {\n  '1': 'DecorateCard',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'card_url', '3': 2, '4': 1, '5': 9, '10': 'cardUrl'},\n    {'1': 'jump_url', '3': 3, '4': 1, '5': 9, '10': 'jumpUrl'},\n    {\n      '1': 'fan',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.DecoCardFan',\n      '10': 'fan'\n    },\n  ],\n};\n\n/// Descriptor for `DecorateCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List decorateCardDescriptor = $convert.base64Decode(\n    'CgxEZWNvcmF0ZUNhcmQSDgoCaWQYASABKANSAmlkEhkKCGNhcmRfdXJsGAIgASgJUgdjYXJkVX'\n    'JsEhkKCGp1bXBfdXJsGAMgASgJUgdqdW1wVXJsEjYKA2ZhbhgEIAEoCzIkLmJpbGliaWxpLmFw'\n    'cC5keW5hbWljLnYxLkRlY29DYXJkRmFuUgNmYW4=');\n\n@$core.Deprecated('Use descriptionDescriptor instead')\nconst Description$json = {\n  '1': 'Description',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'type', '3': 2, '4': 1, '5': 9, '10': 'type'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'emoji_type', '3': 4, '4': 1, '5': 9, '10': 'emojiType'},\n    {'1': 'goods_type', '3': 5, '4': 1, '5': 9, '10': 'goodsType'},\n  ],\n};\n\n/// Descriptor for `Description`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List descriptionDescriptor = $convert.base64Decode(\n    'CgtEZXNjcmlwdGlvbhISCgR0ZXh0GAEgASgJUgR0ZXh0EhIKBHR5cGUYAiABKAlSBHR5cGUSEA'\n    'oDdXJpGAMgASgJUgN1cmkSHQoKZW1vamlfdHlwZRgEIAEoCVIJZW1vamlUeXBlEh0KCmdvb2Rz'\n    'X3R5cGUYBSABKAlSCWdvb2RzVHlwZQ==');\n\n@$core.Deprecated('Use dimensionDescriptor instead')\nconst Dimension$json = {\n  '1': 'Dimension',\n  '2': [\n    {'1': 'height', '3': 1, '4': 1, '5': 3, '10': 'height'},\n    {'1': 'width', '3': 2, '4': 1, '5': 3, '10': 'width'},\n    {'1': 'rotate', '3': 3, '4': 1, '5': 3, '10': 'rotate'},\n  ],\n};\n\n/// Descriptor for `Dimension`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dimensionDescriptor = $convert.base64Decode(\n    'CglEaW1lbnNpb24SFgoGaGVpZ2h0GAEgASgDUgZoZWlnaHQSFAoFd2lkdGgYAiABKANSBXdpZH'\n    'RoEhYKBnJvdGF0ZRgDIAEoA1IGcm90YXRl');\n\n@$core.Deprecated('Use dynDetailsReplyDescriptor instead')\nconst DynDetailsReply$json = {\n  '1': 'DynDetailsReply',\n  '2': [\n    {\n      '1': 'list',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.DynamicItem',\n      '10': 'list'\n    },\n  ],\n};\n\n/// Descriptor for `DynDetailsReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynDetailsReplyDescriptor = $convert.base64Decode(\n    'Cg9EeW5EZXRhaWxzUmVwbHkSOAoEbGlzdBgBIAMoCzIkLmJpbGliaWxpLmFwcC5keW5hbWljLn'\n    'YxLkR5bmFtaWNJdGVtUgRsaXN0');\n\n@$core.Deprecated('Use dynDetailsReqDescriptor instead')\nconst DynDetailsReq$json = {\n  '1': 'DynDetailsReq',\n  '2': [\n    {'1': 'teenagers_mode', '3': 1, '4': 1, '5': 5, '10': 'teenagersMode'},\n    {'1': 'dynamic_ids', '3': 2, '4': 1, '5': 9, '10': 'dynamicIds'},\n    {'1': 'qn', '3': 3, '4': 1, '5': 5, '10': 'qn'},\n    {'1': 'fnver', '3': 4, '4': 1, '5': 5, '10': 'fnver'},\n    {'1': 'fnval', '3': 5, '4': 1, '5': 5, '10': 'fnval'},\n    {'1': 'force_host', '3': 6, '4': 1, '5': 5, '10': 'forceHost'},\n    {'1': 'fourk', '3': 7, '4': 1, '5': 5, '10': 'fourk'},\n  ],\n};\n\n/// Descriptor for `DynDetailsReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynDetailsReqDescriptor = $convert.base64Decode(\n    'Cg1EeW5EZXRhaWxzUmVxEiUKDnRlZW5hZ2Vyc19tb2RlGAEgASgFUg10ZWVuYWdlcnNNb2RlEh'\n    '8KC2R5bmFtaWNfaWRzGAIgASgJUgpkeW5hbWljSWRzEg4KAnFuGAMgASgFUgJxbhIUCgVmbnZl'\n    'chgEIAEoBVIFZm52ZXISFAoFZm52YWwYBSABKAVSBWZudmFsEh0KCmZvcmNlX2hvc3QYBiABKA'\n    'VSCWZvcmNlSG9zdBIUCgVmb3VyaxgHIAEoBVIFZm91cms=');\n\n@$core.Deprecated('Use dynMixUpListSearchReplyDescriptor instead')\nconst DynMixUpListSearchReply$json = {\n  '1': 'DynMixUpListSearchReply',\n  '2': [\n    {\n      '1': 'items',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.MixUpListItem',\n      '10': 'items'\n    },\n  ],\n};\n\n/// Descriptor for `DynMixUpListSearchReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynMixUpListSearchReplyDescriptor =\n    $convert.base64Decode(\n        'ChdEeW5NaXhVcExpc3RTZWFyY2hSZXBseRI8CgVpdGVtcxgBIAMoCzImLmJpbGliaWxpLmFwcC'\n        '5keW5hbWljLnYxLk1peFVwTGlzdEl0ZW1SBWl0ZW1z');\n\n@$core.Deprecated('Use dynMixUpListSearchReqDescriptor instead')\nconst DynMixUpListSearchReq$json = {\n  '1': 'DynMixUpListSearchReq',\n  '2': [\n    {'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'},\n  ],\n};\n\n/// Descriptor for `DynMixUpListSearchReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynMixUpListSearchReqDescriptor =\n    $convert.base64Decode(\n        'ChVEeW5NaXhVcExpc3RTZWFyY2hSZXESEgoEbmFtZRgBIAEoCVIEbmFtZQ==');\n\n@$core.Deprecated('Use dynMixUpListViewMoreReplyDescriptor instead')\nconst DynMixUpListViewMoreReply$json = {\n  '1': 'DynMixUpListViewMoreReply',\n  '2': [\n    {\n      '1': 'items',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.MixUpListItem',\n      '10': 'items'\n    },\n    {\n      '1': 'search_default_text',\n      '3': 2,\n      '4': 1,\n      '5': 9,\n      '10': 'searchDefaultText'\n    },\n  ],\n};\n\n/// Descriptor for `DynMixUpListViewMoreReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynMixUpListViewMoreReplyDescriptor = $convert.base64Decode(\n    'ChlEeW5NaXhVcExpc3RWaWV3TW9yZVJlcGx5EjwKBWl0ZW1zGAEgAygLMiYuYmlsaWJpbGkuYX'\n    'BwLmR5bmFtaWMudjEuTWl4VXBMaXN0SXRlbVIFaXRlbXMSLgoTc2VhcmNoX2RlZmF1bHRfdGV4'\n    'dBgCIAEoCVIRc2VhcmNoRGVmYXVsdFRleHQ=');\n\n@$core.Deprecated('Use dynOurCityItemDescriptor instead')\nconst DynOurCityItem$json = {\n  '1': 'DynOurCityItem',\n  '2': [\n    {'1': 'card_type', '3': 1, '4': 1, '5': 9, '10': 'cardType'},\n    {'1': 'dyn_id', '3': 2, '4': 1, '5': 3, '10': 'dynId'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n    {\n      '1': 'modules',\n      '3': 4,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.DynOurCityModule',\n      '10': 'modules'\n    },\n    {'1': 'rid', '3': 5, '4': 1, '5': 3, '10': 'rid'},\n    {'1': 'debug_info', '3': 6, '4': 1, '5': 9, '10': 'debugInfo'},\n  ],\n};\n\n/// Descriptor for `DynOurCityItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynOurCityItemDescriptor = $convert.base64Decode(\n    'Cg5EeW5PdXJDaXR5SXRlbRIbCgljYXJkX3R5cGUYASABKAlSCGNhcmRUeXBlEhUKBmR5bl9pZB'\n    'gCIAEoA1IFZHluSWQSEAoDdXJpGAMgASgJUgN1cmkSQwoHbW9kdWxlcxgEIAMoCzIpLmJpbGli'\n    'aWxpLmFwcC5keW5hbWljLnYxLkR5bk91ckNpdHlNb2R1bGVSB21vZHVsZXMSEAoDcmlkGAUgAS'\n    'gDUgNyaWQSHQoKZGVidWdfaW5mbxgGIAEoCVIJZGVidWdJbmZv');\n\n@$core.Deprecated('Use dynOurCityModuleDescriptor instead')\nconst DynOurCityModule$json = {\n  '1': 'DynOurCityModule',\n  '2': [\n    {\n      '1': 'module_cover',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.DynOurCityModuleCover',\n      '9': 0,\n      '10': 'moduleCover'\n    },\n    {\n      '1': 'module_desc',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.DynOurCityModuleDesc',\n      '9': 0,\n      '10': 'moduleDesc'\n    },\n    {\n      '1': 'module_author',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.DynOurCityModuleAuthor',\n      '9': 0,\n      '10': 'moduleAuthor'\n    },\n    {\n      '1': 'module_extend',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.DynOurCityModuleExtend',\n      '9': 0,\n      '10': 'moduleExtend'\n    },\n    {'1': 'module_type', '3': 1, '4': 1, '5': 9, '10': 'moduleType'},\n  ],\n  '8': [\n    {'1': 'module_item'},\n  ],\n};\n\n/// Descriptor for `DynOurCityModule`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynOurCityModuleDescriptor = $convert.base64Decode(\n    'ChBEeW5PdXJDaXR5TW9kdWxlElMKDG1vZHVsZV9jb3ZlchgCIAEoCzIuLmJpbGliaWxpLmFwcC'\n    '5keW5hbWljLnYxLkR5bk91ckNpdHlNb2R1bGVDb3ZlckgAUgttb2R1bGVDb3ZlchJQCgttb2R1'\n    'bGVfZGVzYxgDIAEoCzItLmJpbGliaWxpLmFwcC5keW5hbWljLnYxLkR5bk91ckNpdHlNb2R1bG'\n    'VEZXNjSABSCm1vZHVsZURlc2MSVgoNbW9kdWxlX2F1dGhvchgEIAEoCzIvLmJpbGliaWxpLmFw'\n    'cC5keW5hbWljLnYxLkR5bk91ckNpdHlNb2R1bGVBdXRob3JIAFIMbW9kdWxlQXV0aG9yElYKDW'\n    '1vZHVsZV9leHRlbmQYBSABKAsyLy5iaWxpYmlsaS5hcHAuZHluYW1pYy52MS5EeW5PdXJDaXR5'\n    'TW9kdWxlRXh0ZW5kSABSDG1vZHVsZUV4dGVuZBIfCgttb2R1bGVfdHlwZRgBIAEoCVIKbW9kdW'\n    'xlVHlwZUINCgttb2R1bGVfaXRlbQ==');\n\n@$core.Deprecated('Use dynOurCityModuleAuthorDescriptor instead')\nconst DynOurCityModuleAuthor$json = {\n  '1': 'DynOurCityModuleAuthor',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'face', '3': 3, '4': 1, '5': 9, '10': 'face'},\n    {'1': 'uri', '3': 4, '4': 1, '5': 9, '10': 'uri'},\n  ],\n};\n\n/// Descriptor for `DynOurCityModuleAuthor`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynOurCityModuleAuthorDescriptor =\n    $convert.base64Decode(\n        'ChZEeW5PdXJDaXR5TW9kdWxlQXV0aG9yEhAKA21pZBgBIAEoA1IDbWlkEhIKBG5hbWUYAiABKA'\n        'lSBG5hbWUSEgoEZmFjZRgDIAEoCVIEZmFjZRIQCgN1cmkYBCABKAlSA3VyaQ==');\n\n@$core.Deprecated('Use dynOurCityModuleCoverDescriptor instead')\nconst DynOurCityModuleCover$json = {\n  '1': 'DynOurCityModuleCover',\n  '2': [\n    {'1': 'covers', '3': 1, '4': 3, '5': 9, '10': 'covers'},\n    {'1': 'style', '3': 2, '4': 1, '5': 5, '10': 'style'},\n    {'1': 'cover_left_icon1', '3': 3, '4': 1, '5': 5, '10': 'coverLeftIcon1'},\n    {'1': 'cover_left_text1', '3': 4, '4': 1, '5': 9, '10': 'coverLeftText1'},\n    {'1': 'cover_left_icon2', '3': 5, '4': 1, '5': 5, '10': 'coverLeftIcon2'},\n    {'1': 'cover_left_text2', '3': 6, '4': 1, '5': 9, '10': 'coverLeftText2'},\n    {'1': 'cover_left_text3', '3': 7, '4': 1, '5': 9, '10': 'coverLeftText3'},\n    {\n      '1': 'badge',\n      '3': 8,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.VideoBadge',\n      '10': 'badge'\n    },\n  ],\n};\n\n/// Descriptor for `DynOurCityModuleCover`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynOurCityModuleCoverDescriptor = $convert.base64Decode(\n    'ChVEeW5PdXJDaXR5TW9kdWxlQ292ZXISFgoGY292ZXJzGAEgAygJUgZjb3ZlcnMSFAoFc3R5bG'\n    'UYAiABKAVSBXN0eWxlEigKEGNvdmVyX2xlZnRfaWNvbjEYAyABKAVSDmNvdmVyTGVmdEljb24x'\n    'EigKEGNvdmVyX2xlZnRfdGV4dDEYBCABKAlSDmNvdmVyTGVmdFRleHQxEigKEGNvdmVyX2xlZn'\n    'RfaWNvbjIYBSABKAVSDmNvdmVyTGVmdEljb24yEigKEGNvdmVyX2xlZnRfdGV4dDIYBiABKAlS'\n    'DmNvdmVyTGVmdFRleHQyEigKEGNvdmVyX2xlZnRfdGV4dDMYByABKAlSDmNvdmVyTGVmdFRleH'\n    'QzEjkKBWJhZGdlGAggAygLMiMuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjEuVmlkZW9CYWRnZVIF'\n    'YmFkZ2U=');\n\n@$core.Deprecated('Use dynOurCityModuleDescDescriptor instead')\nconst DynOurCityModuleDesc$json = {\n  '1': 'DynOurCityModuleDesc',\n  '2': [\n    {'1': 'desc', '3': 1, '4': 1, '5': 9, '10': 'desc'},\n  ],\n};\n\n/// Descriptor for `DynOurCityModuleDesc`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynOurCityModuleDescDescriptor = $convert\n    .base64Decode('ChREeW5PdXJDaXR5TW9kdWxlRGVzYxISCgRkZXNjGAEgASgJUgRkZXNj');\n\n@$core.Deprecated('Use dynOurCityModuleExtendDescriptor instead')\nconst DynOurCityModuleExtend$json = {\n  '1': 'DynOurCityModuleExtend',\n  '2': [\n    {\n      '1': 'extend_lbs',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.DynOurCityModuleExtendLBS',\n      '9': 0,\n      '10': 'extendLbs'\n    },\n    {'1': 'type', '3': 1, '4': 1, '5': 9, '10': 'type'},\n  ],\n  '8': [\n    {'1': 'extend'},\n  ],\n};\n\n/// Descriptor for `DynOurCityModuleExtend`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynOurCityModuleExtendDescriptor = $convert.base64Decode(\n    'ChZEeW5PdXJDaXR5TW9kdWxlRXh0ZW5kElMKCmV4dGVuZF9sYnMYAiABKAsyMi5iaWxpYmlsaS'\n    '5hcHAuZHluYW1pYy52MS5EeW5PdXJDaXR5TW9kdWxlRXh0ZW5kTEJTSABSCWV4dGVuZExicxIS'\n    'CgR0eXBlGAEgASgJUgR0eXBlQggKBmV4dGVuZA==');\n\n@$core.Deprecated('Use dynOurCityModuleExtendLBSDescriptor instead')\nconst DynOurCityModuleExtendLBS$json = {\n  '1': 'DynOurCityModuleExtendLBS',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'icon', '3': 3, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'poi_type', '3': 4, '4': 1, '5': 5, '10': 'poiType'},\n  ],\n};\n\n/// Descriptor for `DynOurCityModuleExtendLBS`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynOurCityModuleExtendLBSDescriptor = $convert.base64Decode(\n    'ChlEeW5PdXJDaXR5TW9kdWxlRXh0ZW5kTEJTEhQKBXRpdGxlGAEgASgJUgV0aXRsZRIQCgN1cm'\n    'kYAiABKAlSA3VyaRISCgRpY29uGAMgASgJUgRpY29uEhkKCHBvaV90eXBlGAQgASgFUgdwb2lU'\n    'eXBl');\n\n@$core.Deprecated('Use dynOurCityReplyDescriptor instead')\nconst DynOurCityReply$json = {\n  '1': 'DynOurCityReply',\n  '2': [\n    {'1': 'offset', '3': 1, '4': 1, '5': 9, '10': 'offset'},\n    {'1': 'has_more', '3': 2, '4': 1, '5': 5, '10': 'hasMore'},\n    {'1': 'style', '3': 3, '4': 1, '5': 5, '10': 'style'},\n    {'1': 'top_label', '3': 4, '4': 1, '5': 9, '10': 'topLabel'},\n    {\n      '1': 'list',\n      '3': 5,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.DynOurCityItem',\n      '10': 'list'\n    },\n    {'1': 'top_button_label', '3': 6, '4': 1, '5': 9, '10': 'topButtonLabel'},\n    {'1': 'city_id', '3': 7, '4': 1, '5': 5, '10': 'cityId'},\n    {'1': 'city_name', '3': 8, '4': 1, '5': 9, '10': 'cityName'},\n  ],\n};\n\n/// Descriptor for `DynOurCityReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynOurCityReplyDescriptor = $convert.base64Decode(\n    'Cg9EeW5PdXJDaXR5UmVwbHkSFgoGb2Zmc2V0GAEgASgJUgZvZmZzZXQSGQoIaGFzX21vcmUYAi'\n    'ABKAVSB2hhc01vcmUSFAoFc3R5bGUYAyABKAVSBXN0eWxlEhsKCXRvcF9sYWJlbBgEIAEoCVII'\n    'dG9wTGFiZWwSOwoEbGlzdBgFIAMoCzInLmJpbGliaWxpLmFwcC5keW5hbWljLnYxLkR5bk91ck'\n    'NpdHlJdGVtUgRsaXN0EigKEHRvcF9idXR0b25fbGFiZWwYBiABKAlSDnRvcEJ1dHRvbkxhYmVs'\n    'EhcKB2NpdHlfaWQYByABKAVSBmNpdHlJZBIbCgljaXR5X25hbWUYCCABKAlSCGNpdHlOYW1l');\n\n@$core.Deprecated('Use dynOurCityReqDescriptor instead')\nconst DynOurCityReq$json = {\n  '1': 'DynOurCityReq',\n  '2': [\n    {'1': 'city_id', '3': 1, '4': 1, '5': 3, '10': 'cityId'},\n    {'1': 'lat', '3': 2, '4': 1, '5': 1, '10': 'lat'},\n    {'1': 'lng', '3': 3, '4': 1, '5': 1, '10': 'lng'},\n    {'1': 'offset', '3': 4, '4': 1, '5': 9, '10': 'offset'},\n    {'1': 'page_size', '3': 5, '4': 1, '5': 5, '10': 'pageSize'},\n    {'1': 'teenagers_mode', '3': 6, '4': 1, '5': 5, '10': 'teenagersMode'},\n    {'1': 'qn', '3': 7, '4': 1, '5': 5, '10': 'qn'},\n    {'1': 'fnver', '3': 8, '4': 1, '5': 5, '10': 'fnver'},\n    {'1': 'fnval', '3': 9, '4': 1, '5': 5, '10': 'fnval'},\n    {'1': 'force_host', '3': 10, '4': 1, '5': 5, '10': 'forceHost'},\n    {'1': 'fourk', '3': 11, '4': 1, '5': 5, '10': 'fourk'},\n    {'1': 'lbs_state', '3': 12, '4': 1, '5': 5, '10': 'lbsState'},\n    {'1': 'refresh_city', '3': 13, '4': 1, '5': 5, '10': 'refreshCity'},\n    {\n      '1': 'exp_conf',\n      '3': 14,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.ExpConf',\n      '10': 'expConf'\n    },\n    {\n      '1': 'player_args',\n      '3': 15,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n    {'1': 'city_code', '3': 16, '4': 1, '5': 3, '10': 'cityCode'},\n    {'1': 'build_time', '3': 17, '4': 1, '5': 3, '10': 'buildTime'},\n  ],\n};\n\n/// Descriptor for `DynOurCityReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynOurCityReqDescriptor = $convert.base64Decode(\n    'Cg1EeW5PdXJDaXR5UmVxEhcKB2NpdHlfaWQYASABKANSBmNpdHlJZBIQCgNsYXQYAiABKAFSA2'\n    'xhdBIQCgNsbmcYAyABKAFSA2xuZxIWCgZvZmZzZXQYBCABKAlSBm9mZnNldBIbCglwYWdlX3Np'\n    'emUYBSABKAVSCHBhZ2VTaXplEiUKDnRlZW5hZ2Vyc19tb2RlGAYgASgFUg10ZWVuYWdlcnNNb2'\n    'RlEg4KAnFuGAcgASgFUgJxbhIUCgVmbnZlchgIIAEoBVIFZm52ZXISFAoFZm52YWwYCSABKAVS'\n    'BWZudmFsEh0KCmZvcmNlX2hvc3QYCiABKAVSCWZvcmNlSG9zdBIUCgVmb3VyaxgLIAEoBVIFZm'\n    '91cmsSGwoJbGJzX3N0YXRlGAwgASgFUghsYnNTdGF0ZRIhCgxyZWZyZXNoX2NpdHkYDSABKAVS'\n    'C3JlZnJlc2hDaXR5EjsKCGV4cF9jb25mGA4gASgLMiAuYmlsaWJpbGkuYXBwLmR5bmFtaWMudj'\n    'EuRXhwQ29uZlIHZXhwQ29uZhJPCgtwbGF5ZXJfYXJncxgPIAEoCzIuLmJpbGliaWxpLmFwcC5h'\n    'cmNoaXZlLm1pZGRsZXdhcmUudjEuUGxheWVyQXJnc1IKcGxheWVyQXJncxIbCgljaXR5X2NvZG'\n    'UYECABKANSCGNpdHlDb2RlEh0KCmJ1aWxkX3RpbWUYESABKANSCWJ1aWxkVGltZQ==');\n\n@$core.Deprecated('Use dynOurCitySwitchReqDescriptor instead')\nconst DynOurCitySwitchReq$json = {\n  '1': 'DynOurCitySwitchReq',\n  '2': [\n    {'1': 'switch', '3': 1, '4': 1, '5': 5, '10': 'switch'},\n  ],\n};\n\n/// Descriptor for `DynOurCitySwitchReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynOurCitySwitchReqDescriptor =\n    $convert.base64Decode(\n        'ChNEeW5PdXJDaXR5U3dpdGNoUmVxEhYKBnN3aXRjaBgBIAEoBVIGc3dpdGNo');\n\n@$core.Deprecated('Use dynRedItemDescriptor instead')\nconst DynRedItem$json = {\n  '1': 'DynRedItem',\n  '2': [\n    {'1': 'count', '3': 1, '4': 1, '5': 3, '10': 'count'},\n  ],\n};\n\n/// Descriptor for `DynRedItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynRedItemDescriptor =\n    $convert.base64Decode('CgpEeW5SZWRJdGVtEhQKBWNvdW50GAEgASgDUgVjb3VudA==');\n\n@$core.Deprecated('Use dynRedReplyDescriptor instead')\nconst DynRedReply$json = {\n  '1': 'DynRedReply',\n  '2': [\n    {'1': 'red_type', '3': 1, '4': 1, '5': 9, '10': 'redType'},\n    {\n      '1': 'dyn_red_item',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.DynRedItem',\n      '10': 'dynRedItem'\n    },\n    {'1': 'default_tab', '3': 3, '4': 1, '5': 9, '10': 'defaultTab'},\n    {\n      '1': 'red_style',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.DynRedStyle',\n      '10': 'redStyle'\n    },\n    {'1': 'tab_recall_extra', '3': 5, '4': 1, '5': 9, '10': 'tabRecallExtra'},\n    {\n      '1': 'bubble_info',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.BubbleInfo',\n      '10': 'bubbleInfo'\n    },\n  ],\n};\n\n/// Descriptor for `DynRedReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynRedReplyDescriptor = $convert.base64Decode(\n    'CgtEeW5SZWRSZXBseRIZCghyZWRfdHlwZRgBIAEoCVIHcmVkVHlwZRJFCgxkeW5fcmVkX2l0ZW'\n    '0YAiABKAsyIy5iaWxpYmlsaS5hcHAuZHluYW1pYy52MS5EeW5SZWRJdGVtUgpkeW5SZWRJdGVt'\n    'Eh8KC2RlZmF1bHRfdGFiGAMgASgJUgpkZWZhdWx0VGFiEkEKCXJlZF9zdHlsZRgEIAEoCzIkLm'\n    'JpbGliaWxpLmFwcC5keW5hbWljLnYxLkR5blJlZFN0eWxlUghyZWRTdHlsZRIoChB0YWJfcmVj'\n    'YWxsX2V4dHJhGAUgASgJUg50YWJSZWNhbGxFeHRyYRJECgtidWJibGVfaW5mbxgGIAEoCzIjLm'\n    'JpbGliaWxpLmFwcC5keW5hbWljLnYxLkJ1YmJsZUluZm9SCmJ1YmJsZUluZm8=');\n\n@$core.Deprecated('Use dynRedReqDescriptor instead')\nconst DynRedReq$json = {\n  '1': 'DynRedReq',\n  '2': [\n    {\n      '1': 'tab_offset',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.TabOffset',\n      '10': 'tabOffset'\n    },\n    {'1': 'is_new_install', '3': 2, '4': 1, '5': 8, '10': 'isNewInstall'},\n    {'1': 'is_code_start', '3': 3, '4': 1, '5': 8, '10': 'isCodeStart'},\n    {\n      '1': 'new_follow_up_mids',\n      '3': 4,\n      '4': 3,\n      '5': 3,\n      '10': 'newFollowUpMids'\n    },\n    {\n      '1': 'req_scene',\n      '3': 5,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v1.DynRedReq.DynRedReqScene',\n      '10': 'reqScene'\n    },\n  ],\n  '4': [DynRedReq_DynRedReqScene$json],\n};\n\n@$core.Deprecated('Use dynRedReqDescriptor instead')\nconst DynRedReq_DynRedReqScene$json = {\n  '1': 'DynRedReqScene',\n  '2': [\n    {'1': 'RED_REQ_NONE', '2': 0},\n    {'1': 'RED_REQ_RETURN_TO_TAB_1', '2': 1},\n    {'1': 'RED_REQ_PERIODICALLY_AWAKE', '2': 2},\n    {'1': 'RED_REQ_SWITCH_ACCOUNT', '2': 3},\n  ],\n};\n\n/// Descriptor for `DynRedReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynRedReqDescriptor = $convert.base64Decode(\n    'CglEeW5SZWRSZXESQQoKdGFiX29mZnNldBgBIAMoCzIiLmJpbGliaWxpLmFwcC5keW5hbWljLn'\n    'YxLlRhYk9mZnNldFIJdGFiT2Zmc2V0EiQKDmlzX25ld19pbnN0YWxsGAIgASgIUgxpc05ld0lu'\n    'c3RhbGwSIgoNaXNfY29kZV9zdGFydBgDIAEoCFILaXNDb2RlU3RhcnQSKwoSbmV3X2ZvbGxvd1'\n    '91cF9taWRzGAQgAygDUg9uZXdGb2xsb3dVcE1pZHMSTgoJcmVxX3NjZW5lGAUgASgOMjEuYmls'\n    'aWJpbGkuYXBwLmR5bmFtaWMudjEuRHluUmVkUmVxLkR5blJlZFJlcVNjZW5lUghyZXFTY2VuZS'\n    'J7Cg5EeW5SZWRSZXFTY2VuZRIQCgxSRURfUkVRX05PTkUQABIbChdSRURfUkVRX1JFVFVSTl9U'\n    'T19UQUJfMRABEh4KGlJFRF9SRVFfUEVSSU9ESUNBTExZX0FXQUtFEAISGgoWUkVEX1JFUV9TV0'\n    'lUQ0hfQUNDT1VOVBAD');\n\n@$core.Deprecated('Use dynRedStyleDescriptor instead')\nconst DynRedStyle$json = {\n  '1': 'DynRedStyle',\n  '2': [\n    {\n      '1': 'bg_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v1.BgType',\n      '10': 'bgType'\n    },\n    {\n      '1': 'corner_type',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v1.CornerType',\n      '10': 'cornerType'\n    },\n    {'1': 'display_time', '3': 3, '4': 1, '5': 5, '10': 'displayTime'},\n    {'1': 'corner_mark', '3': 4, '4': 1, '5': 9, '10': 'cornerMark'},\n    {\n      '1': 'up',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.DynRedStyleUp',\n      '10': 'up'\n    },\n    {\n      '1': 'type',\n      '3': 6,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v1.StyleType',\n      '10': 'type'\n    },\n    {\n      '1': 'corner_info',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.CornerInfo',\n      '10': 'cornerInfo'\n    },\n  ],\n};\n\n/// Descriptor for `DynRedStyle`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynRedStyleDescriptor = $convert.base64Decode(\n    'CgtEeW5SZWRTdHlsZRI4CgdiZ190eXBlGAEgASgOMh8uYmlsaWJpbGkuYXBwLmR5bmFtaWMudj'\n    'EuQmdUeXBlUgZiZ1R5cGUSRAoLY29ybmVyX3R5cGUYAiABKA4yIy5iaWxpYmlsaS5hcHAuZHlu'\n    'YW1pYy52MS5Db3JuZXJUeXBlUgpjb3JuZXJUeXBlEiEKDGRpc3BsYXlfdGltZRgDIAEoBVILZG'\n    'lzcGxheVRpbWUSHwoLY29ybmVyX21hcmsYBCABKAlSCmNvcm5lck1hcmsSNgoCdXAYBSABKAsy'\n    'Ji5iaWxpYmlsaS5hcHAuZHluYW1pYy52MS5EeW5SZWRTdHlsZVVwUgJ1cBI2CgR0eXBlGAYgAS'\n    'gOMiIuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjEuU3R5bGVUeXBlUgR0eXBlEkQKC2Nvcm5lcl9p'\n    'bmZvGAcgASgLMiMuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjEuQ29ybmVySW5mb1IKY29ybmVySW'\n    '5mbw==');\n\n@$core.Deprecated('Use dynRedStyleUpDescriptor instead')\nconst DynRedStyleUp$json = {\n  '1': 'DynRedStyleUp',\n  '2': [\n    {'1': 'uid', '3': 1, '4': 1, '5': 3, '10': 'uid'},\n    {'1': 'face', '3': 2, '4': 1, '5': 9, '10': 'face'},\n    {\n      '1': 'face_type',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v1.StyleType',\n      '10': 'faceType'\n    },\n    {\n      '1': 'border_color',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.Color',\n      '10': 'borderColor'\n    },\n  ],\n};\n\n/// Descriptor for `DynRedStyleUp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynRedStyleUpDescriptor = $convert.base64Decode(\n    'Cg1EeW5SZWRTdHlsZVVwEhAKA3VpZBgBIAEoA1IDdWlkEhIKBGZhY2UYAiABKAlSBGZhY2USPw'\n    'oJZmFjZV90eXBlGAMgASgOMiIuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjEuU3R5bGVUeXBlUghm'\n    'YWNlVHlwZRJBCgxib3JkZXJfY29sb3IYBCABKAsyHi5iaWxpYmlsaS5hcHAuZHluYW1pYy52MS'\n    '5Db2xvclILYm9yZGVyQ29sb3I=');\n\n@$core.Deprecated('Use dynTabDescriptor instead')\nconst DynTab$json = {\n  '1': 'DynTab',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'bubble', '3': 3, '4': 1, '5': 9, '10': 'bubble'},\n    {'1': 'red_point', '3': 4, '4': 1, '5': 5, '10': 'redPoint'},\n    {'1': 'city_id', '3': 5, '4': 1, '5': 3, '10': 'cityId'},\n    {'1': 'is_popup', '3': 6, '4': 1, '5': 5, '10': 'isPopup'},\n    {\n      '1': 'popup',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.Popup',\n      '10': 'popup'\n    },\n    {'1': 'default_tab', '3': 8, '4': 1, '5': 8, '10': 'defaultTab'},\n    {'1': 'sub_title', '3': 9, '4': 1, '5': 9, '10': 'subTitle'},\n    {'1': 'anchor', '3': 10, '4': 1, '5': 9, '10': 'anchor'},\n    {'1': 'internal_test', '3': 11, '4': 1, '5': 9, '10': 'internalTest'},\n  ],\n};\n\n/// Descriptor for `DynTab`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynTabDescriptor = $convert.base64Decode(\n    'CgZEeW5UYWISFAoFdGl0bGUYASABKAlSBXRpdGxlEhAKA3VyaRgCIAEoCVIDdXJpEhYKBmJ1Ym'\n    'JsZRgDIAEoCVIGYnViYmxlEhsKCXJlZF9wb2ludBgEIAEoBVIIcmVkUG9pbnQSFwoHY2l0eV9p'\n    'ZBgFIAEoA1IGY2l0eUlkEhkKCGlzX3BvcHVwGAYgASgFUgdpc1BvcHVwEjQKBXBvcHVwGAcgAS'\n    'gLMh4uYmlsaWJpbGkuYXBwLmR5bmFtaWMudjEuUG9wdXBSBXBvcHVwEh8KC2RlZmF1bHRfdGFi'\n    'GAggASgIUgpkZWZhdWx0VGFiEhsKCXN1Yl90aXRsZRgJIAEoCVIIc3ViVGl0bGUSFgoGYW5jaG'\n    '9yGAogASgJUgZhbmNob3ISIwoNaW50ZXJuYWxfdGVzdBgLIAEoCVIMaW50ZXJuYWxUZXN0');\n\n@$core.Deprecated('Use dynTabReplyDescriptor instead')\nconst DynTabReply$json = {\n  '1': 'DynTabReply',\n  '2': [\n    {\n      '1': 'dyn_tab',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.DynTab',\n      '10': 'dynTab'\n    },\n  ],\n};\n\n/// Descriptor for `DynTabReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynTabReplyDescriptor = $convert.base64Decode(\n    'CgtEeW5UYWJSZXBseRI4CgdkeW5fdGFiGAEgAygLMh8uYmlsaWJpbGkuYXBwLmR5bmFtaWMudj'\n    'EuRHluVGFiUgZkeW5UYWI=');\n\n@$core.Deprecated('Use dynTabReqDescriptor instead')\nconst DynTabReq$json = {\n  '1': 'DynTabReq',\n  '2': [\n    {'1': 'teenagers_mode', '3': 1, '4': 1, '5': 5, '10': 'teenagersMode'},\n  ],\n};\n\n/// Descriptor for `DynTabReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynTabReqDescriptor = $convert.base64Decode(\n    'CglEeW5UYWJSZXESJQoOdGVlbmFnZXJzX21vZGUYASABKAVSDXRlZW5hZ2Vyc01vZGU=');\n\n@$core.Deprecated('Use dynUpdOffsetReqDescriptor instead')\nconst DynUpdOffsetReq$json = {\n  '1': 'DynUpdOffsetReq',\n  '2': [\n    {'1': 'host_uid', '3': 1, '4': 1, '5': 3, '10': 'hostUid'},\n    {'1': 'read_offset', '3': 2, '4': 1, '5': 9, '10': 'readOffset'},\n  ],\n};\n\n/// Descriptor for `DynUpdOffsetReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynUpdOffsetReqDescriptor = $convert.base64Decode(\n    'Cg9EeW5VcGRPZmZzZXRSZXESGQoIaG9zdF91aWQYASABKANSB2hvc3RVaWQSHwoLcmVhZF9vZm'\n    'ZzZXQYAiABKAlSCnJlYWRPZmZzZXQ=');\n\n@$core.Deprecated('Use dynVideoPersonalReplyDescriptor instead')\nconst DynVideoPersonalReply$json = {\n  '1': 'DynVideoPersonalReply',\n  '2': [\n    {\n      '1': 'list',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.DynamicItem',\n      '10': 'list'\n    },\n    {'1': 'offset', '3': 2, '4': 1, '5': 9, '10': 'offset'},\n    {'1': 'has_more', '3': 3, '4': 1, '5': 5, '10': 'hasMore'},\n    {'1': 'read_offset', '3': 4, '4': 1, '5': 9, '10': 'readOffset'},\n  ],\n};\n\n/// Descriptor for `DynVideoPersonalReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynVideoPersonalReplyDescriptor = $convert.base64Decode(\n    'ChVEeW5WaWRlb1BlcnNvbmFsUmVwbHkSOAoEbGlzdBgBIAMoCzIkLmJpbGliaWxpLmFwcC5keW'\n    '5hbWljLnYxLkR5bmFtaWNJdGVtUgRsaXN0EhYKBm9mZnNldBgCIAEoCVIGb2Zmc2V0EhkKCGhh'\n    'c19tb3JlGAMgASgFUgdoYXNNb3JlEh8KC3JlYWRfb2Zmc2V0GAQgASgJUgpyZWFkT2Zmc2V0');\n\n@$core.Deprecated('Use dynVideoPersonalReqDescriptor instead')\nconst DynVideoPersonalReq$json = {\n  '1': 'DynVideoPersonalReq',\n  '2': [\n    {'1': 'teenagers_mode', '3': 1, '4': 1, '5': 5, '10': 'teenagersMode'},\n    {'1': 'host_uid', '3': 2, '4': 1, '5': 3, '10': 'hostUid'},\n    {'1': 'offset', '3': 3, '4': 1, '5': 9, '10': 'offset'},\n    {'1': 'page', '3': 4, '4': 1, '5': 5, '10': 'page'},\n    {'1': 'is_preload', '3': 5, '4': 1, '5': 5, '10': 'isPreload'},\n    {'1': 'qn', '3': 6, '4': 1, '5': 5, '10': 'qn'},\n    {'1': 'fnver', '3': 7, '4': 1, '5': 5, '10': 'fnver'},\n    {'1': 'fnval', '3': 8, '4': 1, '5': 5, '10': 'fnval'},\n    {'1': 'force_host', '3': 9, '4': 1, '5': 5, '10': 'forceHost'},\n    {'1': 'fourk', '3': 10, '4': 1, '5': 5, '10': 'fourk'},\n  ],\n};\n\n/// Descriptor for `DynVideoPersonalReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynVideoPersonalReqDescriptor = $convert.base64Decode(\n    'ChNEeW5WaWRlb1BlcnNvbmFsUmVxEiUKDnRlZW5hZ2Vyc19tb2RlGAEgASgFUg10ZWVuYWdlcn'\n    'NNb2RlEhkKCGhvc3RfdWlkGAIgASgDUgdob3N0VWlkEhYKBm9mZnNldBgDIAEoCVIGb2Zmc2V0'\n    'EhIKBHBhZ2UYBCABKAVSBHBhZ2USHQoKaXNfcHJlbG9hZBgFIAEoBVIJaXNQcmVsb2FkEg4KAn'\n    'FuGAYgASgFUgJxbhIUCgVmbnZlchgHIAEoBVIFZm52ZXISFAoFZm52YWwYCCABKAVSBWZudmFs'\n    'Eh0KCmZvcmNlX2hvc3QYCSABKAVSCWZvcmNlSG9zdBIUCgVmb3VyaxgKIAEoBVIFZm91cms=');\n\n@$core.Deprecated('Use dynVideoReqDescriptor instead')\nconst DynVideoReq$json = {\n  '1': 'DynVideoReq',\n  '2': [\n    {'1': 'teenagers_mode', '3': 1, '4': 1, '5': 5, '10': 'teenagersMode'},\n    {'1': 'update_baseline', '3': 2, '4': 1, '5': 9, '10': 'updateBaseline'},\n    {'1': 'offset', '3': 3, '4': 1, '5': 9, '10': 'offset'},\n    {'1': 'page', '3': 4, '4': 1, '5': 5, '10': 'page'},\n    {'1': 'refresh_type', '3': 5, '4': 1, '5': 5, '10': 'refreshType'},\n    {'1': 'qn', '3': 6, '4': 1, '5': 5, '10': 'qn'},\n    {'1': 'fnver', '3': 7, '4': 1, '5': 5, '10': 'fnver'},\n    {'1': 'fnval', '3': 8, '4': 1, '5': 5, '10': 'fnval'},\n    {'1': 'force_host', '3': 9, '4': 1, '5': 5, '10': 'forceHost'},\n    {'1': 'fourk', '3': 10, '4': 1, '5': 5, '10': 'fourk'},\n  ],\n};\n\n/// Descriptor for `DynVideoReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynVideoReqDescriptor = $convert.base64Decode(\n    'CgtEeW5WaWRlb1JlcRIlCg50ZWVuYWdlcnNfbW9kZRgBIAEoBVINdGVlbmFnZXJzTW9kZRInCg'\n    '91cGRhdGVfYmFzZWxpbmUYAiABKAlSDnVwZGF0ZUJhc2VsaW5lEhYKBm9mZnNldBgDIAEoCVIG'\n    'b2Zmc2V0EhIKBHBhZ2UYBCABKAVSBHBhZ2USIQoMcmVmcmVzaF90eXBlGAUgASgFUgtyZWZyZX'\n    'NoVHlwZRIOCgJxbhgGIAEoBVICcW4SFAoFZm52ZXIYByABKAVSBWZudmVyEhQKBWZudmFsGAgg'\n    'ASgFUgVmbnZhbBIdCgpmb3JjZV9ob3N0GAkgASgFUglmb3JjZUhvc3QSFAoFZm91cmsYCiABKA'\n    'VSBWZvdXJr');\n\n@$core.Deprecated('Use dynVideoReqReplyDescriptor instead')\nconst DynVideoReqReply$json = {\n  '1': 'DynVideoReqReply',\n  '2': [\n    {\n      '1': 'list',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.DynamicItem',\n      '10': 'list'\n    },\n    {'1': 'update_num', '3': 2, '4': 1, '5': 5, '10': 'updateNum'},\n    {'1': 'history_offset', '3': 3, '4': 1, '5': 9, '10': 'historyOffset'},\n    {'1': 'update_baseline', '3': 4, '4': 1, '5': 9, '10': 'updateBaseline'},\n    {'1': 'has_more', '3': 5, '4': 1, '5': 5, '10': 'hasMore'},\n  ],\n};\n\n/// Descriptor for `DynVideoReqReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynVideoReqReplyDescriptor = $convert.base64Decode(\n    'ChBEeW5WaWRlb1JlcVJlcGx5EjgKBGxpc3QYASADKAsyJC5iaWxpYmlsaS5hcHAuZHluYW1pYy'\n    '52MS5EeW5hbWljSXRlbVIEbGlzdBIdCgp1cGRhdGVfbnVtGAIgASgFUgl1cGRhdGVOdW0SJQoO'\n    'aGlzdG9yeV9vZmZzZXQYAyABKAlSDWhpc3RvcnlPZmZzZXQSJwoPdXBkYXRlX2Jhc2VsaW5lGA'\n    'QgASgJUg51cGRhdGVCYXNlbGluZRIZCghoYXNfbW9yZRgFIAEoBVIHaGFzTW9yZQ==');\n\n@$core.Deprecated('Use dynamicItemDescriptor instead')\nconst DynamicItem$json = {\n  '1': 'DynamicItem',\n  '2': [\n    {'1': 'card_type', '3': 1, '4': 1, '5': 9, '10': 'cardType'},\n    {'1': 'item_type', '3': 2, '4': 1, '5': 9, '10': 'itemType'},\n    {\n      '1': 'modules',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.Module',\n      '10': 'modules'\n    },\n    {'1': 'dyn_id_str', '3': 4, '4': 1, '5': 9, '10': 'dynIdStr'},\n    {'1': 'orig_dyn_id_str', '3': 5, '4': 1, '5': 9, '10': 'origDynIdStr'},\n    {'1': 'r_type', '3': 6, '4': 1, '5': 5, '10': 'rType'},\n    {'1': 'has_fold', '3': 7, '4': 1, '5': 5, '10': 'hasFold'},\n  ],\n};\n\n/// Descriptor for `DynamicItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynamicItemDescriptor = $convert.base64Decode(\n    'CgtEeW5hbWljSXRlbRIbCgljYXJkX3R5cGUYASABKAlSCGNhcmRUeXBlEhsKCWl0ZW1fdHlwZR'\n    'gCIAEoCVIIaXRlbVR5cGUSOQoHbW9kdWxlcxgDIAMoCzIfLmJpbGliaWxpLmFwcC5keW5hbWlj'\n    'LnYxLk1vZHVsZVIHbW9kdWxlcxIcCgpkeW5faWRfc3RyGAQgASgJUghkeW5JZFN0chIlCg9vcm'\n    'lnX2R5bl9pZF9zdHIYBSABKAlSDG9yaWdEeW5JZFN0chIVCgZyX3R5cGUYBiABKAVSBXJUeXBl'\n    'EhkKCGhhc19mb2xkGAcgASgFUgdoYXNGb2xk');\n\n@$core.Deprecated('Use expDescriptor instead')\nconst Exp$json = {\n  '1': 'Exp',\n  '2': [\n    {'1': 'exp_name', '3': 1, '4': 1, '5': 9, '10': 'expName'},\n    {'1': 'exp_group', '3': 2, '4': 1, '5': 9, '10': 'expGroup'},\n  ],\n};\n\n/// Descriptor for `Exp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List expDescriptor = $convert.base64Decode(\n    'CgNFeHASGQoIZXhwX25hbWUYASABKAlSB2V4cE5hbWUSGwoJZXhwX2dyb3VwGAIgASgJUghleH'\n    'BHcm91cA==');\n\n@$core.Deprecated('Use expConfDescriptor instead')\nconst ExpConf$json = {\n  '1': 'ExpConf',\n  '2': [\n    {'1': 'exp_enable', '3': 1, '4': 1, '5': 5, '10': 'expEnable'},\n    {\n      '1': 'exps',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.Exp',\n      '10': 'exps'\n    },\n  ],\n};\n\n/// Descriptor for `ExpConf`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List expConfDescriptor = $convert.base64Decode(\n    'CgdFeHBDb25mEh0KCmV4cF9lbmFibGUYASABKAVSCWV4cEVuYWJsZRIwCgRleHBzGAIgAygLMh'\n    'wuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjEuRXhwUgRleHBz');\n\n@$core.Deprecated('Use extInfoGameDescriptor instead')\nconst ExtInfoGame$json = {\n  '1': 'ExtInfoGame',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'icon', '3': 3, '4': 1, '5': 9, '10': 'icon'},\n  ],\n};\n\n/// Descriptor for `ExtInfoGame`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List extInfoGameDescriptor = $convert.base64Decode(\n    'CgtFeHRJbmZvR2FtZRIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSEAoDdXJpGAIgASgJUgN1cmkSEg'\n    'oEaWNvbhgDIAEoCVIEaWNvbg==');\n\n@$core.Deprecated('Use extInfoHotDescriptor instead')\nconst ExtInfoHot$json = {\n  '1': 'ExtInfoHot',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'icon', '3': 3, '4': 1, '5': 9, '10': 'icon'},\n  ],\n};\n\n/// Descriptor for `ExtInfoHot`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List extInfoHotDescriptor = $convert.base64Decode(\n    'CgpFeHRJbmZvSG90EhQKBXRpdGxlGAEgASgJUgV0aXRsZRIQCgN1cmkYAiABKAlSA3VyaRISCg'\n    'RpY29uGAMgASgJUgRpY29u');\n\n@$core.Deprecated('Use extInfoLBSDescriptor instead')\nconst ExtInfoLBS$json = {\n  '1': 'ExtInfoLBS',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'icon', '3': 3, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'poi_type', '3': 4, '4': 1, '5': 5, '10': 'poiType'},\n  ],\n};\n\n/// Descriptor for `ExtInfoLBS`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List extInfoLBSDescriptor = $convert.base64Decode(\n    'CgpFeHRJbmZvTEJTEhQKBXRpdGxlGAEgASgJUgV0aXRsZRIQCgN1cmkYAiABKAlSA3VyaRISCg'\n    'RpY29uGAMgASgJUgRpY29uEhkKCHBvaV90eXBlGAQgASgFUgdwb2lUeXBl');\n\n@$core.Deprecated('Use extInfoTopicDescriptor instead')\nconst ExtInfoTopic$json = {\n  '1': 'ExtInfoTopic',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'icon', '3': 3, '4': 1, '5': 9, '10': 'icon'},\n  ],\n};\n\n/// Descriptor for `ExtInfoTopic`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List extInfoTopicDescriptor = $convert.base64Decode(\n    'CgxFeHRJbmZvVG9waWMSFAoFdGl0bGUYASABKAlSBXRpdGxlEhAKA3VyaRgCIAEoCVIDdXJpEh'\n    'IKBGljb24YAyABKAlSBGljb24=');\n\n@$core.Deprecated('Use extendDescriptor instead')\nconst Extend$json = {\n  '1': 'Extend',\n  '2': [\n    {\n      '1': 'ext_info_topic',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.ExtInfoTopic',\n      '9': 0,\n      '10': 'extInfoTopic'\n    },\n    {\n      '1': 'ext_info_lbs',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.ExtInfoLBS',\n      '9': 0,\n      '10': 'extInfoLbs'\n    },\n    {\n      '1': 'ext_info_hot',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.ExtInfoHot',\n      '9': 0,\n      '10': 'extInfoHot'\n    },\n    {\n      '1': 'ext_info_game',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.ExtInfoGame',\n      '9': 0,\n      '10': 'extInfoGame'\n    },\n    {'1': 'type', '3': 1, '4': 1, '5': 9, '10': 'type'},\n  ],\n  '8': [\n    {'1': 'extend'},\n  ],\n};\n\n/// Descriptor for `Extend`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List extendDescriptor = $convert.base64Decode(\n    'CgZFeHRlbmQSTQoOZXh0X2luZm9fdG9waWMYAiABKAsyJS5iaWxpYmlsaS5hcHAuZHluYW1pYy'\n    '52MS5FeHRJbmZvVG9waWNIAFIMZXh0SW5mb1RvcGljEkcKDGV4dF9pbmZvX2xicxgDIAEoCzIj'\n    'LmJpbGliaWxpLmFwcC5keW5hbWljLnYxLkV4dEluZm9MQlNIAFIKZXh0SW5mb0xicxJHCgxleH'\n    'RfaW5mb19ob3QYBCABKAsyIy5iaWxpYmlsaS5hcHAuZHluYW1pYy52MS5FeHRJbmZvSG90SABS'\n    'CmV4dEluZm9Ib3QSSgoNZXh0X2luZm9fZ2FtZRgFIAEoCzIkLmJpbGliaWxpLmFwcC5keW5hbW'\n    'ljLnYxLkV4dEluZm9HYW1lSABSC2V4dEluZm9HYW1lEhIKBHR5cGUYASABKAlSBHR5cGVCCAoG'\n    'ZXh0ZW5k');\n\n@$core.Deprecated('Use followListItemDescriptor instead')\nconst FollowListItem$json = {\n  '1': 'FollowListItem',\n  '2': [\n    {'1': 'season_id', '3': 1, '4': 1, '5': 5, '10': 'seasonId'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 3, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'url', '3': 4, '4': 1, '5': 9, '10': 'url'},\n    {\n      '1': 'new_ep',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.NewEP',\n      '10': 'newEp'\n    },\n  ],\n};\n\n/// Descriptor for `FollowListItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List followListItemDescriptor = $convert.base64Decode(\n    'Cg5Gb2xsb3dMaXN0SXRlbRIbCglzZWFzb25faWQYASABKAVSCHNlYXNvbklkEhQKBXRpdGxlGA'\n    'IgASgJUgV0aXRsZRIUCgVjb3ZlchgDIAEoCVIFY292ZXISEAoDdXJsGAQgASgJUgN1cmwSNQoG'\n    'bmV3X2VwGAUgASgLMh4uYmlsaWJpbGkuYXBwLmR5bmFtaWMudjEuTmV3RVBSBW5ld0Vw');\n\n@$core.Deprecated('Use geoCoderReplyDescriptor instead')\nconst GeoCoderReply$json = {\n  '1': 'GeoCoderReply',\n  '2': [\n    {'1': 'address', '3': 1, '4': 1, '5': 9, '10': 'address'},\n    {\n      '1': 'address_component',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.AddressComponent',\n      '10': 'addressComponent'\n    },\n    {\n      '1': 'ad_info',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.AdInfo',\n      '10': 'adInfo'\n    },\n  ],\n};\n\n/// Descriptor for `GeoCoderReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List geoCoderReplyDescriptor = $convert.base64Decode(\n    'Cg1HZW9Db2RlclJlcGx5EhgKB2FkZHJlc3MYASABKAlSB2FkZHJlc3MSVgoRYWRkcmVzc19jb2'\n    '1wb25lbnQYAiABKAsyKS5iaWxpYmlsaS5hcHAuZHluYW1pYy52MS5BZGRyZXNzQ29tcG9uZW50'\n    'UhBhZGRyZXNzQ29tcG9uZW50EjgKB2FkX2luZm8YAyABKAsyHy5iaWxpYmlsaS5hcHAuZHluYW'\n    '1pYy52MS5BZEluZm9SBmFkSW5mbw==');\n\n@$core.Deprecated('Use geoCoderReqDescriptor instead')\nconst GeoCoderReq$json = {\n  '1': 'GeoCoderReq',\n  '2': [\n    {'1': 'lat', '3': 1, '4': 1, '5': 1, '10': 'lat'},\n    {'1': 'lng', '3': 2, '4': 1, '5': 1, '10': 'lng'},\n    {'1': 'from', '3': 3, '4': 1, '5': 9, '10': 'from'},\n  ],\n};\n\n/// Descriptor for `GeoCoderReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List geoCoderReqDescriptor = $convert.base64Decode(\n    'CgtHZW9Db2RlclJlcRIQCgNsYXQYASABKAFSA2xhdBIQCgNsbmcYAiABKAFSA2xuZxISCgRmcm'\n    '9tGAMgASgJUgRmcm9t');\n\n@$core.Deprecated('Use gpsDescriptor instead')\nconst Gps$json = {\n  '1': 'Gps',\n  '2': [\n    {'1': 'lat', '3': 1, '4': 1, '5': 1, '10': 'lat'},\n    {'1': 'lng', '3': 2, '4': 1, '5': 1, '10': 'lng'},\n  ],\n};\n\n/// Descriptor for `Gps`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List gpsDescriptor = $convert\n    .base64Decode('CgNHcHMSEAoDbGF0GAEgASgBUgNsYXQSEAoDbG5nGAIgASgBUgNsbmc=');\n\n@$core.Deprecated('Use likeAnimationDescriptor instead')\nconst LikeAnimation$json = {\n  '1': 'LikeAnimation',\n  '2': [\n    {'1': 'begin', '3': 1, '4': 1, '5': 9, '10': 'begin'},\n    {'1': 'proc', '3': 2, '4': 1, '5': 9, '10': 'proc'},\n    {'1': 'end', '3': 3, '4': 1, '5': 9, '10': 'end'},\n    {'1': 'like_icon_id', '3': 4, '4': 1, '5': 3, '10': 'likeIconId'},\n  ],\n};\n\n/// Descriptor for `LikeAnimation`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List likeAnimationDescriptor = $convert.base64Decode(\n    'Cg1MaWtlQW5pbWF0aW9uEhQKBWJlZ2luGAEgASgJUgViZWdpbhISCgRwcm9jGAIgASgJUgRwcm'\n    '9jEhAKA2VuZBgDIAEoCVIDZW5kEiAKDGxpa2VfaWNvbl9pZBgEIAEoA1IKbGlrZUljb25JZA==');\n\n@$core.Deprecated('Use likeInfoDescriptor instead')\nconst LikeInfo$json = {\n  '1': 'LikeInfo',\n  '2': [\n    {\n      '1': 'animation',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.LikeAnimation',\n      '10': 'animation'\n    },\n    {'1': 'is_like', '3': 2, '4': 1, '5': 5, '10': 'isLike'},\n  ],\n};\n\n/// Descriptor for `LikeInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List likeInfoDescriptor = $convert.base64Decode(\n    'CghMaWtlSW5mbxJECglhbmltYXRpb24YASABKAsyJi5iaWxpYmlsaS5hcHAuZHluYW1pYy52MS'\n    '5MaWtlQW5pbWF0aW9uUglhbmltYXRpb24SFwoHaXNfbGlrZRgCIAEoBVIGaXNMaWtl');\n\n@$core.Deprecated('Use likeUserDescriptor instead')\nconst LikeUser$json = {\n  '1': 'LikeUser',\n  '2': [\n    {'1': 'uid', '3': 1, '4': 1, '5': 3, '10': 'uid'},\n    {'1': 'uname', '3': 2, '4': 1, '5': 9, '10': 'uname'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n  ],\n};\n\n/// Descriptor for `LikeUser`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List likeUserDescriptor = $convert.base64Decode(\n    'CghMaWtlVXNlchIQCgN1aWQYASABKANSA3VpZBIUCgV1bmFtZRgCIAEoCVIFdW5hbWUSEAoDdX'\n    'JpGAMgASgJUgN1cmk=');\n\n@$core.Deprecated('Use liveInfoDescriptor instead')\nconst LiveInfo$json = {\n  '1': 'LiveInfo',\n  '2': [\n    {'1': 'is_living', '3': 1, '4': 1, '5': 5, '10': 'isLiving'},\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n  ],\n};\n\n/// Descriptor for `LiveInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List liveInfoDescriptor = $convert.base64Decode(\n    'CghMaXZlSW5mbxIbCglpc19saXZpbmcYASABKAVSCGlzTGl2aW5nEhAKA3VyaRgCIAEoCVIDdX'\n    'Jp');\n\n@$core.Deprecated('Use mixUpListItemDescriptor instead')\nconst MixUpListItem$json = {\n  '1': 'MixUpListItem',\n  '2': [\n    {'1': 'uid', '3': 1, '4': 1, '5': 3, '10': 'uid'},\n    {\n      '1': 'special_attention',\n      '3': 2,\n      '4': 1,\n      '5': 5,\n      '10': 'specialAttention'\n    },\n    {'1': 'reddot_state', '3': 3, '4': 1, '5': 5, '10': 'reddotState'},\n    {\n      '1': 'live_info',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.MixUpListLiveItem',\n      '10': 'liveInfo'\n    },\n    {'1': 'name', '3': 5, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'face', '3': 6, '4': 1, '5': 9, '10': 'face'},\n    {\n      '1': 'official',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.OfficialVerify',\n      '10': 'official'\n    },\n    {\n      '1': 'vip',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.VipInfo',\n      '10': 'vip'\n    },\n    {\n      '1': 'relation',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.Relation',\n      '10': 'relation'\n    },\n    {'1': 'premiere_state', '3': 10, '4': 1, '5': 5, '10': 'premiereState'},\n    {'1': 'uri', '3': 11, '4': 1, '5': 9, '10': 'uri'},\n  ],\n};\n\n/// Descriptor for `MixUpListItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mixUpListItemDescriptor = $convert.base64Decode(\n    'Cg1NaXhVcExpc3RJdGVtEhAKA3VpZBgBIAEoA1IDdWlkEisKEXNwZWNpYWxfYXR0ZW50aW9uGA'\n    'IgASgFUhBzcGVjaWFsQXR0ZW50aW9uEiEKDHJlZGRvdF9zdGF0ZRgDIAEoBVILcmVkZG90U3Rh'\n    'dGUSRwoJbGl2ZV9pbmZvGAQgASgLMiouYmlsaWJpbGkuYXBwLmR5bmFtaWMudjEuTWl4VXBMaX'\n    'N0TGl2ZUl0ZW1SCGxpdmVJbmZvEhIKBG5hbWUYBSABKAlSBG5hbWUSEgoEZmFjZRgGIAEoCVIE'\n    'ZmFjZRJDCghvZmZpY2lhbBgHIAEoCzInLmJpbGliaWxpLmFwcC5keW5hbWljLnYxLk9mZmljaW'\n    'FsVmVyaWZ5UghvZmZpY2lhbBIyCgN2aXAYCCABKAsyIC5iaWxpYmlsaS5hcHAuZHluYW1pYy52'\n    'MS5WaXBJbmZvUgN2aXASPQoIcmVsYXRpb24YCSABKAsyIS5iaWxpYmlsaS5hcHAuZHluYW1pYy'\n    '52MS5SZWxhdGlvblIIcmVsYXRpb24SJQoOcHJlbWllcmVfc3RhdGUYCiABKAVSDXByZW1pZXJl'\n    'U3RhdGUSEAoDdXJpGAsgASgJUgN1cmk=');\n\n@$core.Deprecated('Use mixUpListLiveItemDescriptor instead')\nconst MixUpListLiveItem$json = {\n  '1': 'MixUpListLiveItem',\n  '2': [\n    {'1': 'status', '3': 1, '4': 1, '5': 8, '10': 'status'},\n    {'1': 'room_id', '3': 2, '4': 1, '5': 3, '10': 'roomId'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n  ],\n};\n\n/// Descriptor for `MixUpListLiveItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mixUpListLiveItemDescriptor = $convert.base64Decode(\n    'ChFNaXhVcExpc3RMaXZlSXRlbRIWCgZzdGF0dXMYASABKAhSBnN0YXR1cxIXCgdyb29tX2lkGA'\n    'IgASgDUgZyb29tSWQSEAoDdXJpGAMgASgJUgN1cmk=');\n\n@$core.Deprecated('Use moduleDescriptor instead')\nconst Module$json = {\n  '1': 'Module',\n  '2': [\n    {\n      '1': 'module_fold',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.ModuleFold',\n      '9': 0,\n      '10': 'moduleFold'\n    },\n    {\n      '1': 'module_author',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.ModuleAuthor',\n      '9': 0,\n      '10': 'moduleAuthor'\n    },\n    {\n      '1': 'module_dynamic',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.ModuleDynamic',\n      '9': 0,\n      '10': 'moduleDynamic'\n    },\n    {\n      '1': 'module_state',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.ModuleState',\n      '9': 0,\n      '10': 'moduleState'\n    },\n    {\n      '1': 'module_forward',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.ModuleForward',\n      '9': 0,\n      '10': 'moduleForward'\n    },\n    {\n      '1': 'module_extend',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.ModuleExtend',\n      '9': 0,\n      '10': 'moduleExtend'\n    },\n    {\n      '1': 'module_dispute',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.ModuleDispute',\n      '9': 0,\n      '10': 'moduleDispute'\n    },\n    {\n      '1': 'module_desc',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.ModuleDesc',\n      '9': 0,\n      '10': 'moduleDesc'\n    },\n    {\n      '1': 'module_like_user',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.ModuleLikeUser',\n      '9': 0,\n      '10': 'moduleLikeUser'\n    },\n    {\n      '1': 'module_up_list',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.ModuleDynUpList',\n      '9': 0,\n      '10': 'moduleUpList'\n    },\n    {\n      '1': 'module_follow_list',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.ModuleFollowList',\n      '9': 0,\n      '10': 'moduleFollowList'\n    },\n    {'1': 'module_type', '3': 1, '4': 1, '5': 9, '10': 'moduleType'},\n  ],\n  '8': [\n    {'1': 'module_item'},\n  ],\n};\n\n/// Descriptor for `Module`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleDescriptor = $convert.base64Decode(\n    'CgZNb2R1bGUSRgoLbW9kdWxlX2ZvbGQYAiABKAsyIy5iaWxpYmlsaS5hcHAuZHluYW1pYy52MS'\n    '5Nb2R1bGVGb2xkSABSCm1vZHVsZUZvbGQSTAoNbW9kdWxlX2F1dGhvchgDIAEoCzIlLmJpbGli'\n    'aWxpLmFwcC5keW5hbWljLnYxLk1vZHVsZUF1dGhvckgAUgxtb2R1bGVBdXRob3ISTwoObW9kdW'\n    'xlX2R5bmFtaWMYBCABKAsyJi5iaWxpYmlsaS5hcHAuZHluYW1pYy52MS5Nb2R1bGVEeW5hbWlj'\n    'SABSDW1vZHVsZUR5bmFtaWMSSQoMbW9kdWxlX3N0YXRlGAUgASgLMiQuYmlsaWJpbGkuYXBwLm'\n    'R5bmFtaWMudjEuTW9kdWxlU3RhdGVIAFILbW9kdWxlU3RhdGUSTwoObW9kdWxlX2ZvcndhcmQY'\n    'BiABKAsyJi5iaWxpYmlsaS5hcHAuZHluYW1pYy52MS5Nb2R1bGVGb3J3YXJkSABSDW1vZHVsZU'\n    'ZvcndhcmQSTAoNbW9kdWxlX2V4dGVuZBgHIAEoCzIlLmJpbGliaWxpLmFwcC5keW5hbWljLnYx'\n    'Lk1vZHVsZUV4dGVuZEgAUgxtb2R1bGVFeHRlbmQSTwoObW9kdWxlX2Rpc3B1dGUYCCABKAsyJi'\n    '5iaWxpYmlsaS5hcHAuZHluYW1pYy52MS5Nb2R1bGVEaXNwdXRlSABSDW1vZHVsZURpc3B1dGUS'\n    'RgoLbW9kdWxlX2Rlc2MYCSABKAsyIy5iaWxpYmlsaS5hcHAuZHluYW1pYy52MS5Nb2R1bGVEZX'\n    'NjSABSCm1vZHVsZURlc2MSUwoQbW9kdWxlX2xpa2VfdXNlchgKIAEoCzInLmJpbGliaWxpLmFw'\n    'cC5keW5hbWljLnYxLk1vZHVsZUxpa2VVc2VySABSDm1vZHVsZUxpa2VVc2VyElAKDm1vZHVsZV'\n    '91cF9saXN0GAsgASgLMiguYmlsaWJpbGkuYXBwLmR5bmFtaWMudjEuTW9kdWxlRHluVXBMaXN0'\n    'SABSDG1vZHVsZVVwTGlzdBJZChJtb2R1bGVfZm9sbG93X2xpc3QYDCABKAsyKS5iaWxpYmlsaS'\n    '5hcHAuZHluYW1pYy52MS5Nb2R1bGVGb2xsb3dMaXN0SABSEG1vZHVsZUZvbGxvd0xpc3QSHwoL'\n    'bW9kdWxlX3R5cGUYASABKAlSCm1vZHVsZVR5cGVCDQoLbW9kdWxlX2l0ZW0=');\n\n@$core.Deprecated('Use moduleAuthorDescriptor instead')\nconst ModuleAuthor$json = {\n  '1': 'ModuleAuthor',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'ptime_label_text', '3': 2, '4': 1, '5': 9, '10': 'ptimeLabelText'},\n    {\n      '1': 'author',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.UserInfo',\n      '10': 'author'\n    },\n    {\n      '1': 'decorate_card',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.DecorateCard',\n      '10': 'decorateCard'\n    },\n  ],\n};\n\n/// Descriptor for `ModuleAuthor`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleAuthorDescriptor = $convert.base64Decode(\n    'CgxNb2R1bGVBdXRob3ISDgoCaWQYASABKANSAmlkEigKEHB0aW1lX2xhYmVsX3RleHQYAiABKA'\n    'lSDnB0aW1lTGFiZWxUZXh0EjkKBmF1dGhvchgDIAEoCzIhLmJpbGliaWxpLmFwcC5keW5hbWlj'\n    'LnYxLlVzZXJJbmZvUgZhdXRob3ISSgoNZGVjb3JhdGVfY2FyZBgEIAEoCzIlLmJpbGliaWxpLm'\n    'FwcC5keW5hbWljLnYxLkRlY29yYXRlQ2FyZFIMZGVjb3JhdGVDYXJk');\n\n@$core.Deprecated('Use moduleDescDescriptor instead')\nconst ModuleDesc$json = {\n  '1': 'ModuleDesc',\n  '2': [\n    {\n      '1': 'desc',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.Description',\n      '10': 'desc'\n    },\n  ],\n};\n\n/// Descriptor for `ModuleDesc`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleDescDescriptor = $convert.base64Decode(\n    'CgpNb2R1bGVEZXNjEjgKBGRlc2MYASADKAsyJC5iaWxpYmlsaS5hcHAuZHluYW1pYy52MS5EZX'\n    'NjcmlwdGlvblIEZGVzYw==');\n\n@$core.Deprecated('Use moduleDisputeDescriptor instead')\nconst ModuleDispute$json = {\n  '1': 'ModuleDispute',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'desc', '3': 2, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n  ],\n};\n\n/// Descriptor for `ModuleDispute`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleDisputeDescriptor = $convert.base64Decode(\n    'Cg1Nb2R1bGVEaXNwdXRlEhQKBXRpdGxlGAEgASgJUgV0aXRsZRISCgRkZXNjGAIgASgJUgRkZX'\n    'NjEhAKA3VyaRgDIAEoCVIDdXJp');\n\n@$core.Deprecated('Use moduleDynUpListDescriptor instead')\nconst ModuleDynUpList$json = {\n  '1': 'ModuleDynUpList',\n  '2': [\n    {'1': 'module_title', '3': 1, '4': 1, '5': 9, '10': 'moduleTitle'},\n    {'1': 'show_all', '3': 2, '4': 1, '5': 9, '10': 'showAll'},\n    {\n      '1': 'list',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.UpListItem',\n      '10': 'list'\n    },\n  ],\n};\n\n/// Descriptor for `ModuleDynUpList`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleDynUpListDescriptor = $convert.base64Decode(\n    'Cg9Nb2R1bGVEeW5VcExpc3QSIQoMbW9kdWxlX3RpdGxlGAEgASgJUgttb2R1bGVUaXRsZRIZCg'\n    'hzaG93X2FsbBgCIAEoCVIHc2hvd0FsbBI3CgRsaXN0GAMgAygLMiMuYmlsaWJpbGkuYXBwLmR5'\n    'bmFtaWMudjEuVXBMaXN0SXRlbVIEbGlzdA==');\n\n@$core.Deprecated('Use moduleDynamicDescriptor instead')\nconst ModuleDynamic$json = {\n  '1': 'ModuleDynamic',\n  '2': [\n    {\n      '1': 'card_ugc',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.CardUGC',\n      '9': 0,\n      '10': 'cardUgc'\n    },\n    {\n      '1': 'card_pgc',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.CardPGC',\n      '9': 0,\n      '10': 'cardPgc'\n    },\n    {\n      '1': 'card_curr_season',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.CardCurrSeason',\n      '9': 0,\n      '10': 'cardCurrSeason'\n    },\n    {\n      '1': 'card_curr_batch',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.CardCurrBatch',\n      '9': 0,\n      '10': 'cardCurrBatch'\n    },\n    {'1': 'card_type', '3': 1, '4': 1, '5': 9, '10': 'cardType'},\n  ],\n  '8': [\n    {'1': 'card'},\n  ],\n};\n\n/// Descriptor for `ModuleDynamic`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleDynamicDescriptor = $convert.base64Decode(\n    'Cg1Nb2R1bGVEeW5hbWljEj0KCGNhcmRfdWdjGAIgASgLMiAuYmlsaWJpbGkuYXBwLmR5bmFtaW'\n    'MudjEuQ2FyZFVHQ0gAUgdjYXJkVWdjEj0KCGNhcmRfcGdjGAMgASgLMiAuYmlsaWJpbGkuYXBw'\n    'LmR5bmFtaWMudjEuQ2FyZFBHQ0gAUgdjYXJkUGdjElMKEGNhcmRfY3Vycl9zZWFzb24YBCABKA'\n    'syJy5iaWxpYmlsaS5hcHAuZHluYW1pYy52MS5DYXJkQ3VyclNlYXNvbkgAUg5jYXJkQ3VyclNl'\n    'YXNvbhJQCg9jYXJkX2N1cnJfYmF0Y2gYBSABKAsyJi5iaWxpYmlsaS5hcHAuZHluYW1pYy52MS'\n    '5DYXJkQ3VyckJhdGNoSABSDWNhcmRDdXJyQmF0Y2gSGwoJY2FyZF90eXBlGAEgASgJUghjYXJk'\n    'VHlwZUIGCgRjYXJk');\n\n@$core.Deprecated('Use moduleExtendDescriptor instead')\nconst ModuleExtend$json = {\n  '1': 'ModuleExtend',\n  '2': [\n    {\n      '1': 'extend',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.Extend',\n      '10': 'extend'\n    },\n  ],\n};\n\n/// Descriptor for `ModuleExtend`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleExtendDescriptor = $convert.base64Decode(\n    'CgxNb2R1bGVFeHRlbmQSNwoGZXh0ZW5kGAEgAygLMh8uYmlsaWJpbGkuYXBwLmR5bmFtaWMudj'\n    'EuRXh0ZW5kUgZleHRlbmQ=');\n\n@$core.Deprecated('Use moduleFoldDescriptor instead')\nconst ModuleFold$json = {\n  '1': 'ModuleFold',\n  '2': [\n    {\n      '1': 'fold_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v1.FoldType',\n      '10': 'foldType'\n    },\n    {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'fold_ids', '3': 3, '4': 1, '5': 9, '10': 'foldIds'},\n    {\n      '1': 'fold_users',\n      '3': 4,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.UserInfo',\n      '10': 'foldUsers'\n    },\n    {\n      '1': 'fold_type_v2',\n      '3': 5,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v1.FoldType',\n      '10': 'foldTypeV2'\n    },\n  ],\n};\n\n/// Descriptor for `ModuleFold`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleFoldDescriptor = $convert.base64Decode(\n    'CgpNb2R1bGVGb2xkEj4KCWZvbGRfdHlwZRgBIAEoDjIhLmJpbGliaWxpLmFwcC5keW5hbWljLn'\n    'YxLkZvbGRUeXBlUghmb2xkVHlwZRISCgR0ZXh0GAIgASgJUgR0ZXh0EhkKCGZvbGRfaWRzGAMg'\n    'ASgJUgdmb2xkSWRzEkAKCmZvbGRfdXNlcnMYBCADKAsyIS5iaWxpYmlsaS5hcHAuZHluYW1pYy'\n    '52MS5Vc2VySW5mb1IJZm9sZFVzZXJzEkMKDGZvbGRfdHlwZV92MhgFIAEoDjIhLmJpbGliaWxp'\n    'LmFwcC5keW5hbWljLnYxLkZvbGRUeXBlUgpmb2xkVHlwZVYy');\n\n@$core.Deprecated('Use moduleFollowListDescriptor instead')\nconst ModuleFollowList$json = {\n  '1': 'ModuleFollowList',\n  '2': [\n    {'1': 'view_all_link', '3': 1, '4': 1, '5': 9, '10': 'viewAllLink'},\n    {\n      '1': 'list',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.FollowListItem',\n      '10': 'list'\n    },\n  ],\n};\n\n/// Descriptor for `ModuleFollowList`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleFollowListDescriptor = $convert.base64Decode(\n    'ChBNb2R1bGVGb2xsb3dMaXN0EiIKDXZpZXdfYWxsX2xpbmsYASABKAlSC3ZpZXdBbGxMaW5rEj'\n    'sKBGxpc3QYAiADKAsyJy5iaWxpYmlsaS5hcHAuZHluYW1pYy52MS5Gb2xsb3dMaXN0SXRlbVIE'\n    'bGlzdA==');\n\n@$core.Deprecated('Use moduleForwardDescriptor instead')\nconst ModuleForward$json = {\n  '1': 'ModuleForward',\n  '2': [\n    {'1': 'card_type', '3': 1, '4': 1, '5': 9, '10': 'cardType'},\n    {\n      '1': 'modules',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.Module',\n      '10': 'modules'\n    },\n  ],\n};\n\n/// Descriptor for `ModuleForward`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleForwardDescriptor = $convert.base64Decode(\n    'Cg1Nb2R1bGVGb3J3YXJkEhsKCWNhcmRfdHlwZRgBIAEoCVIIY2FyZFR5cGUSOQoHbW9kdWxlcx'\n    'gCIAMoCzIfLmJpbGliaWxpLmFwcC5keW5hbWljLnYxLk1vZHVsZVIHbW9kdWxlcw==');\n\n@$core.Deprecated('Use moduleLikeUserDescriptor instead')\nconst ModuleLikeUser$json = {\n  '1': 'ModuleLikeUser',\n  '2': [\n    {\n      '1': 'like_users',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.LikeUser',\n      '10': 'likeUsers'\n    },\n    {'1': 'display_text', '3': 2, '4': 1, '5': 9, '10': 'displayText'},\n  ],\n};\n\n/// Descriptor for `ModuleLikeUser`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleLikeUserDescriptor = $convert.base64Decode(\n    'Cg5Nb2R1bGVMaWtlVXNlchJACgpsaWtlX3VzZXJzGAEgAygLMiEuYmlsaWJpbGkuYXBwLmR5bm'\n    'FtaWMudjEuTGlrZVVzZXJSCWxpa2VVc2VycxIhCgxkaXNwbGF5X3RleHQYAiABKAlSC2Rpc3Bs'\n    'YXlUZXh0');\n\n@$core.Deprecated('Use moduleStateDescriptor instead')\nconst ModuleState$json = {\n  '1': 'ModuleState',\n  '2': [\n    {'1': 'repost', '3': 1, '4': 1, '5': 5, '10': 'repost'},\n    {'1': 'like', '3': 2, '4': 1, '5': 5, '10': 'like'},\n    {'1': 'reply', '3': 3, '4': 1, '5': 5, '10': 'reply'},\n    {\n      '1': 'like_info',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.LikeInfo',\n      '10': 'likeInfo'\n    },\n    {'1': 'no_comment', '3': 5, '4': 1, '5': 8, '10': 'noComment'},\n    {'1': 'no_forward', '3': 6, '4': 1, '5': 8, '10': 'noForward'},\n  ],\n};\n\n/// Descriptor for `ModuleState`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleStateDescriptor = $convert.base64Decode(\n    'CgtNb2R1bGVTdGF0ZRIWCgZyZXBvc3QYASABKAVSBnJlcG9zdBISCgRsaWtlGAIgASgFUgRsaW'\n    'tlEhQKBXJlcGx5GAMgASgFUgVyZXBseRI+CglsaWtlX2luZm8YBCABKAsyIS5iaWxpYmlsaS5h'\n    'cHAuZHluYW1pYy52MS5MaWtlSW5mb1IIbGlrZUluZm8SHQoKbm9fY29tbWVudBgFIAEoCFIJbm'\n    '9Db21tZW50Eh0KCm5vX2ZvcndhcmQYBiABKAhSCW5vRm9yd2FyZA==');\n\n@$core.Deprecated('Use nameplateDescriptor instead')\nconst Nameplate$json = {\n  '1': 'Nameplate',\n  '2': [\n    {'1': 'nid', '3': 1, '4': 1, '5': 3, '10': 'nid'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'image', '3': 3, '4': 1, '5': 9, '10': 'image'},\n    {'1': 'image_small', '3': 4, '4': 1, '5': 9, '10': 'imageSmall'},\n    {'1': 'level', '3': 5, '4': 1, '5': 9, '10': 'level'},\n    {'1': 'condition', '3': 6, '4': 1, '5': 9, '10': 'condition'},\n  ],\n};\n\n/// Descriptor for `Nameplate`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List nameplateDescriptor = $convert.base64Decode(\n    'CglOYW1lcGxhdGUSEAoDbmlkGAEgASgDUgNuaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIUCgVpbW'\n    'FnZRgDIAEoCVIFaW1hZ2USHwoLaW1hZ2Vfc21hbGwYBCABKAlSCmltYWdlU21hbGwSFAoFbGV2'\n    'ZWwYBSABKAlSBWxldmVsEhwKCWNvbmRpdGlvbhgGIAEoCVIJY29uZGl0aW9u');\n\n@$core.Deprecated('Use newEPDescriptor instead')\nconst NewEP$json = {\n  '1': 'NewEP',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 5, '10': 'id'},\n    {'1': 'index_show', '3': 2, '4': 1, '5': 9, '10': 'indexShow'},\n    {'1': 'cover', '3': 3, '4': 1, '5': 9, '10': 'cover'},\n  ],\n};\n\n/// Descriptor for `NewEP`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List newEPDescriptor = $convert.base64Decode(\n    'CgVOZXdFUBIOCgJpZBgBIAEoBVICaWQSHQoKaW5kZXhfc2hvdxgCIAEoCVIJaW5kZXhTaG93Eh'\n    'QKBWNvdmVyGAMgASgJUgVjb3Zlcg==');\n\n@$core.Deprecated('Use noReplyDescriptor instead')\nconst NoReply$json = {\n  '1': 'NoReply',\n};\n\n/// Descriptor for `NoReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List noReplyDescriptor =\n    $convert.base64Decode('CgdOb1JlcGx5');\n\n@$core.Deprecated('Use noReqDescriptor instead')\nconst NoReq$json = {\n  '1': 'NoReq',\n};\n\n/// Descriptor for `NoReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List noReqDescriptor =\n    $convert.base64Decode('CgVOb1JlcQ==');\n\n@$core.Deprecated('Use officialVerifyDescriptor instead')\nconst OfficialVerify$json = {\n  '1': 'OfficialVerify',\n  '2': [\n    {'1': 'type', '3': 1, '4': 1, '5': 5, '10': 'type'},\n    {'1': 'desc', '3': 2, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'is_atten', '3': 3, '4': 1, '5': 5, '10': 'isAtten'},\n  ],\n};\n\n/// Descriptor for `OfficialVerify`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List officialVerifyDescriptor = $convert.base64Decode(\n    'Cg5PZmZpY2lhbFZlcmlmeRISCgR0eXBlGAEgASgFUgR0eXBlEhIKBGRlc2MYAiABKAlSBGRlc2'\n    'MSGQoIaXNfYXR0ZW4YAyABKAVSB2lzQXR0ZW4=');\n\n@$core.Deprecated('Use ourCityClickReportReplyDescriptor instead')\nconst OurCityClickReportReply$json = {\n  '1': 'OurCityClickReportReply',\n};\n\n/// Descriptor for `OurCityClickReportReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List ourCityClickReportReplyDescriptor =\n    $convert.base64Decode('ChdPdXJDaXR5Q2xpY2tSZXBvcnRSZXBseQ==');\n\n@$core.Deprecated('Use ourCityClickReportReqDescriptor instead')\nconst OurCityClickReportReq$json = {\n  '1': 'OurCityClickReportReq',\n  '2': [\n    {'1': 'dynamic_id', '3': 1, '4': 1, '5': 9, '10': 'dynamicId'},\n    {'1': 'city_id', '3': 2, '4': 1, '5': 3, '10': 'cityId'},\n    {'1': 'lat', '3': 3, '4': 1, '5': 1, '10': 'lat'},\n    {'1': 'lng', '3': 4, '4': 1, '5': 1, '10': 'lng'},\n  ],\n};\n\n/// Descriptor for `OurCityClickReportReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List ourCityClickReportReqDescriptor = $convert.base64Decode(\n    'ChVPdXJDaXR5Q2xpY2tSZXBvcnRSZXESHQoKZHluYW1pY19pZBgBIAEoCVIJZHluYW1pY0lkEh'\n    'cKB2NpdHlfaWQYAiABKANSBmNpdHlJZBIQCgNsYXQYAyABKAFSA2xhdBIQCgNsbmcYBCABKAFS'\n    'A2xuZw==');\n\n@$core.Deprecated('Use pGCSeasonDescriptor instead')\nconst PGCSeason$json = {\n  '1': 'PGCSeason',\n  '2': [\n    {'1': 'is_finish', '3': 1, '4': 1, '5': 5, '10': 'isFinish'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'type', '3': 3, '4': 1, '5': 5, '10': 'type'},\n  ],\n};\n\n/// Descriptor for `PGCSeason`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pGCSeasonDescriptor = $convert.base64Decode(\n    'CglQR0NTZWFzb24SGwoJaXNfZmluaXNoGAEgASgFUghpc0ZpbmlzaBIUCgV0aXRsZRgCIAEoCV'\n    'IFdGl0bGUSEgoEdHlwZRgDIAEoBVIEdHlwZQ==');\n\n@$core.Deprecated('Use playerPreloadParamsDescriptor instead')\nconst PlayerPreloadParams$json = {\n  '1': 'PlayerPreloadParams',\n  '2': [\n    {'1': 'qn', '3': 1, '4': 1, '5': 5, '10': 'qn'},\n    {'1': 'fnver', '3': 2, '4': 1, '5': 5, '10': 'fnver'},\n    {'1': 'fnval', '3': 3, '4': 1, '5': 5, '10': 'fnval'},\n    {'1': 'force_host', '3': 4, '4': 1, '5': 5, '10': 'forceHost'},\n    {'1': 'fourk', '3': 5, '4': 1, '5': 5, '10': 'fourk'},\n  ],\n};\n\n/// Descriptor for `PlayerPreloadParams`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playerPreloadParamsDescriptor = $convert.base64Decode(\n    'ChNQbGF5ZXJQcmVsb2FkUGFyYW1zEg4KAnFuGAEgASgFUgJxbhIUCgVmbnZlchgCIAEoBVIFZm'\n    '52ZXISFAoFZm52YWwYAyABKAVSBWZudmFsEh0KCmZvcmNlX2hvc3QYBCABKAVSCWZvcmNlSG9z'\n    'dBIUCgVmb3VyaxgFIAEoBVIFZm91cms=');\n\n@$core.Deprecated('Use popupDescriptor instead')\nconst Popup$json = {\n  '1': 'Popup',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'desc', '3': 2, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n  ],\n};\n\n/// Descriptor for `Popup`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List popupDescriptor = $convert.base64Decode(\n    'CgVQb3B1cBIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSEgoEZGVzYxgCIAEoCVIEZGVzYxIQCgN1cm'\n    'kYAyABKAlSA3VyaQ==');\n\n@$core.Deprecated('Use relationDescriptor instead')\nconst Relation$json = {\n  '1': 'Relation',\n  '2': [\n    {\n      '1': 'status',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v1.RelationStatus',\n      '10': 'status'\n    },\n    {'1': 'is_follow', '3': 2, '4': 1, '5': 5, '10': 'isFollow'},\n    {'1': 'is_followed', '3': 3, '4': 1, '5': 5, '10': 'isFollowed'},\n    {'1': 'title', '3': 4, '4': 1, '5': 9, '10': 'title'},\n  ],\n};\n\n/// Descriptor for `Relation`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List relationDescriptor = $convert.base64Decode(\n    'CghSZWxhdGlvbhI/CgZzdGF0dXMYASABKA4yJy5iaWxpYmlsaS5hcHAuZHluYW1pYy52MS5SZW'\n    'xhdGlvblN0YXR1c1IGc3RhdHVzEhsKCWlzX2ZvbGxvdxgCIAEoBVIIaXNGb2xsb3cSHwoLaXNf'\n    'Zm9sbG93ZWQYAyABKAVSCmlzRm9sbG93ZWQSFAoFdGl0bGUYBCABKAlSBXRpdGxl');\n\n@$core.Deprecated('Use sVideoItemDescriptor instead')\nconst SVideoItem$json = {\n  '1': 'SVideoItem',\n  '2': [\n    {'1': 'card_type', '3': 1, '4': 1, '5': 9, '10': 'cardType'},\n    {\n      '1': 'modules',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.SVideoModule',\n      '10': 'modules'\n    },\n    {'1': 'dyn_id_str', '3': 3, '4': 1, '5': 9, '10': 'dynIdStr'},\n    {'1': 'index', '3': 4, '4': 1, '5': 3, '10': 'index'},\n  ],\n};\n\n/// Descriptor for `SVideoItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sVideoItemDescriptor = $convert.base64Decode(\n    'CgpTVmlkZW9JdGVtEhsKCWNhcmRfdHlwZRgBIAEoCVIIY2FyZFR5cGUSPwoHbW9kdWxlcxgCIA'\n    'MoCzIlLmJpbGliaWxpLmFwcC5keW5hbWljLnYxLlNWaWRlb01vZHVsZVIHbW9kdWxlcxIcCgpk'\n    'eW5faWRfc3RyGAMgASgJUghkeW5JZFN0chIUCgVpbmRleBgEIAEoA1IFaW5kZXg=');\n\n@$core.Deprecated('Use sVideoModuleDescriptor instead')\nconst SVideoModule$json = {\n  '1': 'SVideoModule',\n  '2': [\n    {\n      '1': 'module_author',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.SVideoModuleAuthor',\n      '9': 0,\n      '10': 'moduleAuthor'\n    },\n    {\n      '1': 'module_player',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.SVideoModulePlayer',\n      '9': 0,\n      '10': 'modulePlayer'\n    },\n    {\n      '1': 'module_desc',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.SVideoModuleDesc',\n      '9': 0,\n      '10': 'moduleDesc'\n    },\n    {\n      '1': 'module_stat',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.SVideoModuleStat',\n      '9': 0,\n      '10': 'moduleStat'\n    },\n    {'1': 'module_type', '3': 1, '4': 1, '5': 9, '10': 'moduleType'},\n  ],\n  '8': [\n    {'1': 'module_item'},\n  ],\n};\n\n/// Descriptor for `SVideoModule`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sVideoModuleDescriptor = $convert.base64Decode(\n    'CgxTVmlkZW9Nb2R1bGUSUgoNbW9kdWxlX2F1dGhvchgCIAEoCzIrLmJpbGliaWxpLmFwcC5keW'\n    '5hbWljLnYxLlNWaWRlb01vZHVsZUF1dGhvckgAUgxtb2R1bGVBdXRob3ISUgoNbW9kdWxlX3Bs'\n    'YXllchgDIAEoCzIrLmJpbGliaWxpLmFwcC5keW5hbWljLnYxLlNWaWRlb01vZHVsZVBsYXllck'\n    'gAUgxtb2R1bGVQbGF5ZXISTAoLbW9kdWxlX2Rlc2MYBCABKAsyKS5iaWxpYmlsaS5hcHAuZHlu'\n    'YW1pYy52MS5TVmlkZW9Nb2R1bGVEZXNjSABSCm1vZHVsZURlc2MSTAoLbW9kdWxlX3N0YXQYBS'\n    'ABKAsyKS5iaWxpYmlsaS5hcHAuZHluYW1pYy52MS5TVmlkZW9Nb2R1bGVTdGF0SABSCm1vZHVs'\n    'ZVN0YXQSHwoLbW9kdWxlX3R5cGUYASABKAlSCm1vZHVsZVR5cGVCDQoLbW9kdWxlX2l0ZW0=');\n\n@$core.Deprecated('Use sVideoModuleAuthorDescriptor instead')\nconst SVideoModuleAuthor$json = {\n  '1': 'SVideoModuleAuthor',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'face', '3': 3, '4': 1, '5': 9, '10': 'face'},\n    {'1': 'pub_desc', '3': 4, '4': 1, '5': 9, '10': 'pubDesc'},\n    {'1': 'is_attention', '3': 5, '4': 1, '5': 5, '10': 'isAttention'},\n    {'1': 'uri', '3': 6, '4': 1, '5': 9, '10': 'uri'},\n  ],\n};\n\n/// Descriptor for `SVideoModuleAuthor`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sVideoModuleAuthorDescriptor = $convert.base64Decode(\n    'ChJTVmlkZW9Nb2R1bGVBdXRob3ISEAoDbWlkGAEgASgDUgNtaWQSEgoEbmFtZRgCIAEoCVIEbm'\n    'FtZRISCgRmYWNlGAMgASgJUgRmYWNlEhkKCHB1Yl9kZXNjGAQgASgJUgdwdWJEZXNjEiEKDGlz'\n    'X2F0dGVudGlvbhgFIAEoBVILaXNBdHRlbnRpb24SEAoDdXJpGAYgASgJUgN1cmk=');\n\n@$core.Deprecated('Use sVideoModuleDescDescriptor instead')\nconst SVideoModuleDesc$json = {\n  '1': 'SVideoModuleDesc',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n  ],\n};\n\n/// Descriptor for `SVideoModuleDesc`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sVideoModuleDescDescriptor = $convert.base64Decode(\n    'ChBTVmlkZW9Nb2R1bGVEZXNjEhIKBHRleHQYASABKAlSBHRleHQSEAoDdXJpGAIgASgJUgN1cm'\n    'k=');\n\n@$core.Deprecated('Use sVideoModulePlayerDescriptor instead')\nconst SVideoModulePlayer$json = {\n  '1': 'SVideoModulePlayer',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 2, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'aid', '3': 4, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'cid', '3': 5, '4': 1, '5': 3, '10': 'cid'},\n    {'1': 'duration', '3': 6, '4': 1, '5': 3, '10': 'duration'},\n    {\n      '1': 'dimension',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.Dimension',\n      '10': 'dimension'\n    },\n  ],\n};\n\n/// Descriptor for `SVideoModulePlayer`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sVideoModulePlayerDescriptor = $convert.base64Decode(\n    'ChJTVmlkZW9Nb2R1bGVQbGF5ZXISFAoFdGl0bGUYASABKAlSBXRpdGxlEhQKBWNvdmVyGAIgAS'\n    'gJUgVjb3ZlchIQCgN1cmkYAyABKAlSA3VyaRIQCgNhaWQYBCABKANSA2FpZBIQCgNjaWQYBSAB'\n    'KANSA2NpZBIaCghkdXJhdGlvbhgGIAEoA1IIZHVyYXRpb24SQAoJZGltZW5zaW9uGAcgASgLMi'\n    'IuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjEuRGltZW5zaW9uUglkaW1lbnNpb24=');\n\n@$core.Deprecated('Use sVideoModuleStatDescriptor instead')\nconst SVideoModuleStat$json = {\n  '1': 'SVideoModuleStat',\n  '2': [\n    {\n      '1': 'stat_info',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.SVideoStatInfo',\n      '10': 'statInfo'\n    },\n    {\n      '1': 'share_info',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.ShareInfo',\n      '10': 'shareInfo'\n    },\n  ],\n};\n\n/// Descriptor for `SVideoModuleStat`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sVideoModuleStatDescriptor = $convert.base64Decode(\n    'ChBTVmlkZW9Nb2R1bGVTdGF0EkQKCXN0YXRfaW5mbxgBIAMoCzInLmJpbGliaWxpLmFwcC5keW'\n    '5hbWljLnYxLlNWaWRlb1N0YXRJbmZvUghzdGF0SW5mbxJBCgpzaGFyZV9pbmZvGAIgASgLMiIu'\n    'YmlsaWJpbGkuYXBwLmR5bmFtaWMudjEuU2hhcmVJbmZvUglzaGFyZUluZm8=');\n\n@$core.Deprecated('Use sVideoReplyDescriptor instead')\nconst SVideoReply$json = {\n  '1': 'SVideoReply',\n  '2': [\n    {\n      '1': 'list',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.SVideoItem',\n      '10': 'list'\n    },\n    {'1': 'offset', '3': 2, '4': 1, '5': 9, '10': 'offset'},\n    {'1': 'has_more', '3': 3, '4': 1, '5': 5, '10': 'hasMore'},\n    {\n      '1': 'top',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.SVideoTop',\n      '10': 'top'\n    },\n  ],\n};\n\n/// Descriptor for `SVideoReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sVideoReplyDescriptor = $convert.base64Decode(\n    'CgtTVmlkZW9SZXBseRI3CgRsaXN0GAEgAygLMiMuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjEuU1'\n    'ZpZGVvSXRlbVIEbGlzdBIWCgZvZmZzZXQYAiABKAlSBm9mZnNldBIZCghoYXNfbW9yZRgDIAEo'\n    'BVIHaGFzTW9yZRI0CgN0b3AYBCABKAsyIi5iaWxpYmlsaS5hcHAuZHluYW1pYy52MS5TVmlkZW'\n    '9Ub3BSA3RvcA==');\n\n@$core.Deprecated('Use sVideoReqDescriptor instead')\nconst SVideoReq$json = {\n  '1': 'SVideoReq',\n  '2': [\n    {'1': 'oid', '3': 1, '4': 1, '5': 3, '10': 'oid'},\n    {\n      '1': 'type',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v1.SVideoType',\n      '10': 'type'\n    },\n    {'1': 'offset', '3': 3, '4': 1, '5': 9, '10': 'offset'},\n    {'1': 'qn', '3': 4, '4': 1, '5': 5, '10': 'qn'},\n    {'1': 'fnver', '3': 5, '4': 1, '5': 5, '10': 'fnver'},\n    {'1': 'fnval', '3': 6, '4': 1, '5': 5, '10': 'fnval'},\n    {'1': 'force_host', '3': 7, '4': 1, '5': 5, '10': 'forceHost'},\n    {'1': 'fourk', '3': 8, '4': 1, '5': 5, '10': 'fourk'},\n    {'1': 'spmid', '3': 9, '4': 1, '5': 9, '10': 'spmid'},\n    {'1': 'from_spmid', '3': 10, '4': 1, '5': 9, '10': 'fromSpmid'},\n    {\n      '1': 'player_preload',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.PlayerPreloadParams',\n      '10': 'playerPreload'\n    },\n    {'1': 'focus_aid', '3': 12, '4': 1, '5': 3, '10': 'focusAid'},\n    {\n      '1': 'player_args',\n      '3': 13,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n  ],\n};\n\n/// Descriptor for `SVideoReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sVideoReqDescriptor = $convert.base64Decode(\n    'CglTVmlkZW9SZXESEAoDb2lkGAEgASgDUgNvaWQSNwoEdHlwZRgCIAEoDjIjLmJpbGliaWxpLm'\n    'FwcC5keW5hbWljLnYxLlNWaWRlb1R5cGVSBHR5cGUSFgoGb2Zmc2V0GAMgASgJUgZvZmZzZXQS'\n    'DgoCcW4YBCABKAVSAnFuEhQKBWZudmVyGAUgASgFUgVmbnZlchIUCgVmbnZhbBgGIAEoBVIFZm'\n    '52YWwSHQoKZm9yY2VfaG9zdBgHIAEoBVIJZm9yY2VIb3N0EhQKBWZvdXJrGAggASgFUgVmb3Vy'\n    'axIUCgVzcG1pZBgJIAEoCVIFc3BtaWQSHQoKZnJvbV9zcG1pZBgKIAEoCVIJZnJvbVNwbWlkEl'\n    'MKDnBsYXllcl9wcmVsb2FkGAsgASgLMiwuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjEuUGxheWVy'\n    'UHJlbG9hZFBhcmFtc1INcGxheWVyUHJlbG9hZBIbCglmb2N1c19haWQYDCABKANSCGZvY3VzQW'\n    'lkEk8KC3BsYXllcl9hcmdzGA0gASgLMi4uYmlsaWJpbGkuYXBwLmFyY2hpdmUubWlkZGxld2Fy'\n    'ZS52MS5QbGF5ZXJBcmdzUgpwbGF5ZXJBcmdz');\n\n@$core.Deprecated('Use sVideoStatInfoDescriptor instead')\nconst SVideoStatInfo$json = {\n  '1': 'SVideoStatInfo',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 5, '10': 'icon'},\n    {'1': 'num', '3': 2, '4': 1, '5': 3, '10': 'num'},\n    {'1': 'selected', '3': 3, '4': 1, '5': 5, '10': 'selected'},\n    {'1': 'uri', '3': 4, '4': 1, '5': 9, '10': 'uri'},\n  ],\n};\n\n/// Descriptor for `SVideoStatInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sVideoStatInfoDescriptor = $convert.base64Decode(\n    'Cg5TVmlkZW9TdGF0SW5mbxISCgRpY29uGAEgASgFUgRpY29uEhAKA251bRgCIAEoA1IDbnVtEh'\n    'oKCHNlbGVjdGVkGAMgASgFUghzZWxlY3RlZBIQCgN1cmkYBCABKAlSA3VyaQ==');\n\n@$core.Deprecated('Use sVideoTopDescriptor instead')\nconst SVideoTop$json = {\n  '1': 'SVideoTop',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'desc', '3': 2, '4': 1, '5': 9, '10': 'desc'},\n  ],\n};\n\n/// Descriptor for `SVideoTop`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sVideoTopDescriptor = $convert.base64Decode(\n    'CglTVmlkZW9Ub3ASFAoFdGl0bGUYASABKAlSBXRpdGxlEhIKBGRlc2MYAiABKAlSBGRlc2M=');\n\n@$core.Deprecated('Use shareInfoDescriptor instead')\nconst ShareInfo$json = {\n  '1': 'ShareInfo',\n  '2': [\n    {'1': 'aid', '3': 1, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'bvid', '3': 2, '4': 1, '5': 9, '10': 'bvid'},\n    {'1': 'title', '3': 3, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'subtitle', '3': 4, '4': 1, '5': 9, '10': 'subtitle'},\n    {'1': 'cover', '3': 5, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'mid', '3': 6, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'name', '3': 7, '4': 1, '5': 9, '10': 'name'},\n  ],\n};\n\n/// Descriptor for `ShareInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List shareInfoDescriptor = $convert.base64Decode(\n    'CglTaGFyZUluZm8SEAoDYWlkGAEgASgDUgNhaWQSEgoEYnZpZBgCIAEoCVIEYnZpZBIUCgV0aX'\n    'RsZRgDIAEoCVIFdGl0bGUSGgoIc3VidGl0bGUYBCABKAlSCHN1YnRpdGxlEhQKBWNvdmVyGAUg'\n    'ASgJUgVjb3ZlchIQCgNtaWQYBiABKANSA21pZBISCgRuYW1lGAcgASgJUgRuYW1l');\n\n@$core.Deprecated('Use tabOffsetDescriptor instead')\nconst TabOffset$json = {\n  '1': 'TabOffset',\n  '2': [\n    {'1': 'tab', '3': 1, '4': 1, '5': 5, '10': 'tab'},\n    {'1': 'offset', '3': 2, '4': 1, '5': 9, '10': 'offset'},\n  ],\n};\n\n/// Descriptor for `TabOffset`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List tabOffsetDescriptor = $convert.base64Decode(\n    'CglUYWJPZmZzZXQSEAoDdGFiGAEgASgFUgN0YWISFgoGb2Zmc2V0GAIgASgJUgZvZmZzZXQ=');\n\n@$core.Deprecated('Use upListItemDescriptor instead')\nconst UpListItem$json = {\n  '1': 'UpListItem',\n  '2': [\n    {'1': 'has_update', '3': 1, '4': 1, '5': 5, '10': 'hasUpdate'},\n    {'1': 'face', '3': 2, '4': 1, '5': 9, '10': 'face'},\n    {'1': 'name', '3': 3, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'uid', '3': 4, '4': 1, '5': 3, '10': 'uid'},\n  ],\n};\n\n/// Descriptor for `UpListItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List upListItemDescriptor = $convert.base64Decode(\n    'CgpVcExpc3RJdGVtEh0KCmhhc191cGRhdGUYASABKAVSCWhhc1VwZGF0ZRISCgRmYWNlGAIgAS'\n    'gJUgRmYWNlEhIKBG5hbWUYAyABKAlSBG5hbWUSEAoDdWlkGAQgASgDUgN1aWQ=');\n\n@$core.Deprecated('Use userInfoDescriptor instead')\nconst UserInfo$json = {\n  '1': 'UserInfo',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'face', '3': 3, '4': 1, '5': 9, '10': 'face'},\n    {\n      '1': 'official',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.OfficialVerify',\n      '10': 'official'\n    },\n    {\n      '1': 'vip',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.VipInfo',\n      '10': 'vip'\n    },\n    {\n      '1': 'live',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.LiveInfo',\n      '10': 'live'\n    },\n    {'1': 'uri', '3': 7, '4': 1, '5': 9, '10': 'uri'},\n    {\n      '1': 'pendant',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.UserPendant',\n      '10': 'pendant'\n    },\n    {\n      '1': 'nameplate',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.Nameplate',\n      '10': 'nameplate'\n    },\n  ],\n};\n\n/// Descriptor for `UserInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List userInfoDescriptor = $convert.base64Decode(\n    'CghVc2VySW5mbxIQCgNtaWQYASABKANSA21pZBISCgRuYW1lGAIgASgJUgRuYW1lEhIKBGZhY2'\n    'UYAyABKAlSBGZhY2USQwoIb2ZmaWNpYWwYBCABKAsyJy5iaWxpYmlsaS5hcHAuZHluYW1pYy52'\n    'MS5PZmZpY2lhbFZlcmlmeVIIb2ZmaWNpYWwSMgoDdmlwGAUgASgLMiAuYmlsaWJpbGkuYXBwLm'\n    'R5bmFtaWMudjEuVmlwSW5mb1IDdmlwEjUKBGxpdmUYBiABKAsyIS5iaWxpYmlsaS5hcHAuZHlu'\n    'YW1pYy52MS5MaXZlSW5mb1IEbGl2ZRIQCgN1cmkYByABKAlSA3VyaRI+CgdwZW5kYW50GAggAS'\n    'gLMiQuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjEuVXNlclBlbmRhbnRSB3BlbmRhbnQSQAoJbmFt'\n    'ZXBsYXRlGAkgASgLMiIuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjEuTmFtZXBsYXRlUgluYW1lcG'\n    'xhdGU=');\n\n@$core.Deprecated('Use userPendantDescriptor instead')\nconst UserPendant$json = {\n  '1': 'UserPendant',\n  '2': [\n    {'1': 'pid', '3': 1, '4': 1, '5': 3, '10': 'pid'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'image', '3': 3, '4': 1, '5': 9, '10': 'image'},\n    {'1': 'expire', '3': 4, '4': 1, '5': 3, '10': 'expire'},\n  ],\n};\n\n/// Descriptor for `UserPendant`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List userPendantDescriptor = $convert.base64Decode(\n    'CgtVc2VyUGVuZGFudBIQCgNwaWQYASABKANSA3BpZBISCgRuYW1lGAIgASgJUgRuYW1lEhQKBW'\n    'ltYWdlGAMgASgJUgVpbWFnZRIWCgZleHBpcmUYBCABKANSBmV4cGlyZQ==');\n\n@$core.Deprecated('Use videoBadgeDescriptor instead')\nconst VideoBadge$json = {\n  '1': 'VideoBadge',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'text_color', '3': 2, '4': 1, '5': 9, '10': 'textColor'},\n    {'1': 'text_color_night', '3': 3, '4': 1, '5': 9, '10': 'textColorNight'},\n    {'1': 'bg_color', '3': 4, '4': 1, '5': 9, '10': 'bgColor'},\n    {'1': 'bg_color_night', '3': 5, '4': 1, '5': 9, '10': 'bgColorNight'},\n    {'1': 'border_color', '3': 6, '4': 1, '5': 9, '10': 'borderColor'},\n    {\n      '1': 'border_color_night',\n      '3': 7,\n      '4': 1,\n      '5': 9,\n      '10': 'borderColorNight'\n    },\n    {'1': 'bg_style', '3': 8, '4': 1, '5': 5, '10': 'bgStyle'},\n  ],\n};\n\n/// Descriptor for `VideoBadge`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List videoBadgeDescriptor = $convert.base64Decode(\n    'CgpWaWRlb0JhZGdlEhIKBHRleHQYASABKAlSBHRleHQSHQoKdGV4dF9jb2xvchgCIAEoCVIJdG'\n    'V4dENvbG9yEigKEHRleHRfY29sb3JfbmlnaHQYAyABKAlSDnRleHRDb2xvck5pZ2h0EhkKCGJn'\n    'X2NvbG9yGAQgASgJUgdiZ0NvbG9yEiQKDmJnX2NvbG9yX25pZ2h0GAUgASgJUgxiZ0NvbG9yTm'\n    'lnaHQSIQoMYm9yZGVyX2NvbG9yGAYgASgJUgtib3JkZXJDb2xvchIsChJib3JkZXJfY29sb3Jf'\n    'bmlnaHQYByABKAlSEGJvcmRlckNvbG9yTmlnaHQSGQoIYmdfc3R5bGUYCCABKAVSB2JnU3R5bG'\n    'U=');\n\n@$core.Deprecated('Use vipInfoDescriptor instead')\nconst VipInfo$json = {\n  '1': 'VipInfo',\n  '2': [\n    {'1': 'type', '3': 1, '4': 1, '5': 5, '10': 'type'},\n    {'1': 'status', '3': 2, '4': 1, '5': 5, '10': 'status'},\n    {'1': 'due_date', '3': 3, '4': 1, '5': 3, '10': 'dueDate'},\n    {\n      '1': 'label',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v1.VipLabel',\n      '10': 'label'\n    },\n    {'1': 'theme_type', '3': 5, '4': 1, '5': 5, '10': 'themeType'},\n  ],\n};\n\n/// Descriptor for `VipInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List vipInfoDescriptor = $convert.base64Decode(\n    'CgdWaXBJbmZvEhIKBHR5cGUYASABKAVSBHR5cGUSFgoGc3RhdHVzGAIgASgFUgZzdGF0dXMSGQ'\n    'oIZHVlX2RhdGUYAyABKANSB2R1ZURhdGUSNwoFbGFiZWwYBCABKAsyIS5iaWxpYmlsaS5hcHAu'\n    'ZHluYW1pYy52MS5WaXBMYWJlbFIFbGFiZWwSHQoKdGhlbWVfdHlwZRgFIAEoBVIJdGhlbWVUeX'\n    'Bl');\n\n@$core.Deprecated('Use vipLabelDescriptor instead')\nconst VipLabel$json = {\n  '1': 'VipLabel',\n  '2': [\n    {'1': 'path', '3': 1, '4': 1, '5': 9, '10': 'path'},\n  ],\n};\n\n/// Descriptor for `VipLabel`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List vipLabelDescriptor =\n    $convert.base64Decode('CghWaXBMYWJlbBISCgRwYXRoGAEgASgJUgRwYXRo');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/dynamic/v2.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/dynamic/v2.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:fixnum/fixnum.dart' as $fixnum;\nimport 'package:protobuf/protobuf.dart' as $pb;\nimport 'package:protobuf/well_known_types/google/protobuf/any.pb.dart' as $6;\n\nimport '../../account/service/v1.pb.dart' as $3;\nimport '../../dagw/component/avatar/v1.pb.dart' as $2;\nimport '../../pagination.pb.dart' as $7;\nimport '../../vas/garb/service.pb.dart' as $5;\nimport '../archive/middleware/v1.pb.dart' as $1;\nimport 'common.pb.dart' as $4;\nimport 'v2.pbenum.dart';\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nexport 'v2.pbenum.dart';\n\nclass AdParam extends $pb.GeneratedMessage {\n  factory AdParam({\n    $core.String? adExtra,\n    $core.String? requestId,\n  }) {\n    final result = create();\n    if (adExtra != null) result.adExtra = adExtra;\n    if (requestId != null) result.requestId = requestId;\n    return result;\n  }\n\n  AdParam._();\n\n  factory AdParam.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AdParam.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AdParam',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'adExtra')\n    ..aOS(2, _omitFieldNames ? '' : 'requestId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdParam clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdParam copyWith(void Function(AdParam) updates) =>\n      super.copyWith((message) => updates(message as AdParam)) as AdParam;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AdParam create() => AdParam._();\n  @$core.override\n  AdParam createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AdParam getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<AdParam>(create);\n  static AdParam? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get adExtra => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set adExtra($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAdExtra() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAdExtra() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get requestId => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set requestId($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasRequestId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRequestId() => $_clearField(2);\n}\n\nclass AdditionArticle extends $pb.GeneratedMessage {\n  factory AdditionArticle({\n    $core.String? title,\n    MdlDynDrawItem? cover,\n    $core.String? descTextLeft,\n    $core.String? descTextRight,\n    $core.String? uri,\n    $core.String? cardType,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (descTextLeft != null) result.descTextLeft = descTextLeft;\n    if (descTextRight != null) result.descTextRight = descTextRight;\n    if (uri != null) result.uri = uri;\n    if (cardType != null) result.cardType = cardType;\n    return result;\n  }\n\n  AdditionArticle._();\n\n  factory AdditionArticle.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AdditionArticle.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AdditionArticle',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOM<MdlDynDrawItem>(2, _omitFieldNames ? '' : 'cover',\n        subBuilder: MdlDynDrawItem.create)\n    ..aOS(3, _omitFieldNames ? '' : 'descTextLeft')\n    ..aOS(4, _omitFieldNames ? '' : 'descTextRight')\n    ..aOS(5, _omitFieldNames ? '' : 'uri')\n    ..aOS(6, _omitFieldNames ? '' : 'cardType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionArticle clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionArticle copyWith(void Function(AdditionArticle) updates) =>\n      super.copyWith((message) => updates(message as AdditionArticle))\n          as AdditionArticle;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AdditionArticle create() => AdditionArticle._();\n  @$core.override\n  AdditionArticle createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AdditionArticle getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AdditionArticle>(create);\n  static AdditionArticle? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  MdlDynDrawItem get cover => $_getN(1);\n  @$pb.TagNumber(2)\n  set cover(MdlDynDrawItem value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCover() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCover() => $_clearField(2);\n  @$pb.TagNumber(2)\n  MdlDynDrawItem ensureCover() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.String get descTextLeft => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set descTextLeft($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDescTextLeft() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDescTextLeft() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get descTextRight => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set descTextRight($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDescTextRight() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDescTextRight() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get uri => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set uri($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasUri() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearUri() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get cardType => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set cardType($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCardType() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCardType() => $_clearField(6);\n}\n\nclass AdditionCommon extends $pb.GeneratedMessage {\n  factory AdditionCommon({\n    $core.String? headText,\n    $core.String? title,\n    $core.String? imageUrl,\n    $core.String? descText1,\n    $core.String? descText2,\n    $core.String? url,\n    AdditionalButton? button,\n    $core.String? headIcon,\n    ImageStyle? style,\n    $core.String? type,\n    $core.String? cardType,\n  }) {\n    final result = create();\n    if (headText != null) result.headText = headText;\n    if (title != null) result.title = title;\n    if (imageUrl != null) result.imageUrl = imageUrl;\n    if (descText1 != null) result.descText1 = descText1;\n    if (descText2 != null) result.descText2 = descText2;\n    if (url != null) result.url = url;\n    if (button != null) result.button = button;\n    if (headIcon != null) result.headIcon = headIcon;\n    if (style != null) result.style = style;\n    if (type != null) result.type = type;\n    if (cardType != null) result.cardType = cardType;\n    return result;\n  }\n\n  AdditionCommon._();\n\n  factory AdditionCommon.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AdditionCommon.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AdditionCommon',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'headText')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'imageUrl')\n    ..aOS(4, _omitFieldNames ? '' : 'descText1')\n    ..aOS(5, _omitFieldNames ? '' : 'descText2')\n    ..aOS(6, _omitFieldNames ? '' : 'url')\n    ..aOM<AdditionalButton>(7, _omitFieldNames ? '' : 'button',\n        subBuilder: AdditionalButton.create)\n    ..aOS(8, _omitFieldNames ? '' : 'headIcon')\n    ..aE<ImageStyle>(9, _omitFieldNames ? '' : 'style',\n        enumValues: ImageStyle.values)\n    ..aOS(10, _omitFieldNames ? '' : 'type')\n    ..aOS(11, _omitFieldNames ? '' : 'cardType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionCommon clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionCommon copyWith(void Function(AdditionCommon) updates) =>\n      super.copyWith((message) => updates(message as AdditionCommon))\n          as AdditionCommon;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AdditionCommon create() => AdditionCommon._();\n  @$core.override\n  AdditionCommon createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AdditionCommon getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AdditionCommon>(create);\n  static AdditionCommon? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get headText => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set headText($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasHeadText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearHeadText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get imageUrl => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set imageUrl($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasImageUrl() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearImageUrl() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get descText1 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set descText1($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDescText1() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDescText1() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get descText2 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set descText2($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDescText2() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDescText2() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get url => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set url($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasUrl() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearUrl() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  AdditionalButton get button => $_getN(6);\n  @$pb.TagNumber(7)\n  set button(AdditionalButton value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasButton() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearButton() => $_clearField(7);\n  @$pb.TagNumber(7)\n  AdditionalButton ensureButton() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  $core.String get headIcon => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set headIcon($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasHeadIcon() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearHeadIcon() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  ImageStyle get style => $_getN(8);\n  @$pb.TagNumber(9)\n  set style(ImageStyle value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasStyle() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearStyle() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get type => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set type($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasType() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearType() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get cardType => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set cardType($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasCardType() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearCardType() => $_clearField(11);\n}\n\nenum AdditionEsport_Item { additionEsportMoba, notSet }\n\nclass AdditionEsport extends $pb.GeneratedMessage {\n  factory AdditionEsport({\n    EspaceStyle? style,\n    AdditionEsportMoba? additionEsportMoba,\n    $core.String? type,\n    $core.String? cardType,\n  }) {\n    final result = create();\n    if (style != null) result.style = style;\n    if (additionEsportMoba != null)\n      result.additionEsportMoba = additionEsportMoba;\n    if (type != null) result.type = type;\n    if (cardType != null) result.cardType = cardType;\n    return result;\n  }\n\n  AdditionEsport._();\n\n  factory AdditionEsport.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AdditionEsport.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, AdditionEsport_Item>\n      _AdditionEsport_ItemByTag = {\n    2: AdditionEsport_Item.additionEsportMoba,\n    0: AdditionEsport_Item.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AdditionEsport',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..oo(0, [2])\n    ..aE<EspaceStyle>(1, _omitFieldNames ? '' : 'style',\n        enumValues: EspaceStyle.values)\n    ..aOM<AdditionEsportMoba>(2, _omitFieldNames ? '' : 'additionEsportMoba',\n        subBuilder: AdditionEsportMoba.create)\n    ..aOS(3, _omitFieldNames ? '' : 'type')\n    ..aOS(4, _omitFieldNames ? '' : 'cardType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionEsport clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionEsport copyWith(void Function(AdditionEsport) updates) =>\n      super.copyWith((message) => updates(message as AdditionEsport))\n          as AdditionEsport;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AdditionEsport create() => AdditionEsport._();\n  @$core.override\n  AdditionEsport createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AdditionEsport getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AdditionEsport>(create);\n  static AdditionEsport? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  AdditionEsport_Item whichItem() =>\n      _AdditionEsport_ItemByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  void clearItem() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  EspaceStyle get style => $_getN(0);\n  @$pb.TagNumber(1)\n  set style(EspaceStyle value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStyle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStyle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  AdditionEsportMoba get additionEsportMoba => $_getN(1);\n  @$pb.TagNumber(2)\n  set additionEsportMoba(AdditionEsportMoba value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAdditionEsportMoba() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAdditionEsportMoba() => $_clearField(2);\n  @$pb.TagNumber(2)\n  AdditionEsportMoba ensureAdditionEsportMoba() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.String get type => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set type($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get cardType => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set cardType($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCardType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCardType() => $_clearField(4);\n}\n\nclass AdditionEsportMoba extends $pb.GeneratedMessage {\n  factory AdditionEsportMoba({\n    $core.String? headText,\n    $core.String? title,\n    $core.Iterable<MatchTeam>? matchTeam,\n    AdditionEsportMobaStatus? additionEsportMobaStatus,\n    $core.String? uri,\n    AdditionalButton? button,\n    $core.String? subTitle,\n    $core.String? type,\n    $core.String? cardType,\n    $core.String? headIcon,\n  }) {\n    final result = create();\n    if (headText != null) result.headText = headText;\n    if (title != null) result.title = title;\n    if (matchTeam != null) result.matchTeam.addAll(matchTeam);\n    if (additionEsportMobaStatus != null)\n      result.additionEsportMobaStatus = additionEsportMobaStatus;\n    if (uri != null) result.uri = uri;\n    if (button != null) result.button = button;\n    if (subTitle != null) result.subTitle = subTitle;\n    if (type != null) result.type = type;\n    if (cardType != null) result.cardType = cardType;\n    if (headIcon != null) result.headIcon = headIcon;\n    return result;\n  }\n\n  AdditionEsportMoba._();\n\n  factory AdditionEsportMoba.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AdditionEsportMoba.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AdditionEsportMoba',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'headText')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..pPM<MatchTeam>(3, _omitFieldNames ? '' : 'matchTeam',\n        subBuilder: MatchTeam.create)\n    ..aOM<AdditionEsportMobaStatus>(\n        4, _omitFieldNames ? '' : 'additionEsportMobaStatus',\n        subBuilder: AdditionEsportMobaStatus.create)\n    ..aOS(5, _omitFieldNames ? '' : 'uri')\n    ..aOM<AdditionalButton>(6, _omitFieldNames ? '' : 'button',\n        subBuilder: AdditionalButton.create)\n    ..aOS(7, _omitFieldNames ? '' : 'subTitle')\n    ..aOS(10, _omitFieldNames ? '' : 'type')\n    ..aOS(11, _omitFieldNames ? '' : 'cardType')\n    ..aOS(12, _omitFieldNames ? '' : 'headIcon')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionEsportMoba clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionEsportMoba copyWith(void Function(AdditionEsportMoba) updates) =>\n      super.copyWith((message) => updates(message as AdditionEsportMoba))\n          as AdditionEsportMoba;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AdditionEsportMoba create() => AdditionEsportMoba._();\n  @$core.override\n  AdditionEsportMoba createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AdditionEsportMoba getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AdditionEsportMoba>(create);\n  static AdditionEsportMoba? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get headText => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set headText($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasHeadText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearHeadText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<MatchTeam> get matchTeam => $_getList(2);\n\n  @$pb.TagNumber(4)\n  AdditionEsportMobaStatus get additionEsportMobaStatus => $_getN(3);\n  @$pb.TagNumber(4)\n  set additionEsportMobaStatus(AdditionEsportMobaStatus value) =>\n      $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasAdditionEsportMobaStatus() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearAdditionEsportMobaStatus() => $_clearField(4);\n  @$pb.TagNumber(4)\n  AdditionEsportMobaStatus ensureAdditionEsportMobaStatus() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.String get uri => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set uri($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasUri() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearUri() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  AdditionalButton get button => $_getN(5);\n  @$pb.TagNumber(6)\n  set button(AdditionalButton value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasButton() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearButton() => $_clearField(6);\n  @$pb.TagNumber(6)\n  AdditionalButton ensureButton() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $core.String get subTitle => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set subTitle($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasSubTitle() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearSubTitle() => $_clearField(7);\n\n  @$pb.TagNumber(10)\n  $core.String get type => $_getSZ(7);\n  @$pb.TagNumber(10)\n  set type($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(10)\n  $core.bool hasType() => $_has(7);\n  @$pb.TagNumber(10)\n  void clearType() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get cardType => $_getSZ(8);\n  @$pb.TagNumber(11)\n  set cardType($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(11)\n  $core.bool hasCardType() => $_has(8);\n  @$pb.TagNumber(11)\n  void clearCardType() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get headIcon => $_getSZ(9);\n  @$pb.TagNumber(12)\n  set headIcon($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(12)\n  $core.bool hasHeadIcon() => $_has(9);\n  @$pb.TagNumber(12)\n  void clearHeadIcon() => $_clearField(12);\n}\n\nclass AdditionEsportMobaStatus extends $pb.GeneratedMessage {\n  factory AdditionEsportMobaStatus({\n    $core.Iterable<AdditionEsportMobaStatusDesc>? additionEsportMobaStatusDesc,\n    $core.String? title,\n    $core.int? status,\n    $core.String? color,\n    $core.String? nightColor,\n  }) {\n    final result = create();\n    if (additionEsportMobaStatusDesc != null)\n      result.additionEsportMobaStatusDesc.addAll(additionEsportMobaStatusDesc);\n    if (title != null) result.title = title;\n    if (status != null) result.status = status;\n    if (color != null) result.color = color;\n    if (nightColor != null) result.nightColor = nightColor;\n    return result;\n  }\n\n  AdditionEsportMobaStatus._();\n\n  factory AdditionEsportMobaStatus.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AdditionEsportMobaStatus.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AdditionEsportMobaStatus',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<AdditionEsportMobaStatusDesc>(\n        1, _omitFieldNames ? '' : 'additionEsportMobaStatusDesc',\n        subBuilder: AdditionEsportMobaStatusDesc.create)\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aI(3, _omitFieldNames ? '' : 'status')\n    ..aOS(4, _omitFieldNames ? '' : 'color')\n    ..aOS(5, _omitFieldNames ? '' : 'nightColor')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionEsportMobaStatus clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionEsportMobaStatus copyWith(\n          void Function(AdditionEsportMobaStatus) updates) =>\n      super.copyWith((message) => updates(message as AdditionEsportMobaStatus))\n          as AdditionEsportMobaStatus;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AdditionEsportMobaStatus create() => AdditionEsportMobaStatus._();\n  @$core.override\n  AdditionEsportMobaStatus createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AdditionEsportMobaStatus getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AdditionEsportMobaStatus>(create);\n  static AdditionEsportMobaStatus? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<AdditionEsportMobaStatusDesc> get additionEsportMobaStatusDesc =>\n      $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get status => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set status($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasStatus() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearStatus() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get color => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set color($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasColor() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearColor() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get nightColor => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set nightColor($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasNightColor() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearNightColor() => $_clearField(5);\n}\n\nclass AdditionEsportMobaStatusDesc extends $pb.GeneratedMessage {\n  factory AdditionEsportMobaStatusDesc({\n    $core.String? title,\n    $core.String? color,\n    $core.String? nightColor,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (color != null) result.color = color;\n    if (nightColor != null) result.nightColor = nightColor;\n    return result;\n  }\n\n  AdditionEsportMobaStatusDesc._();\n\n  factory AdditionEsportMobaStatusDesc.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AdditionEsportMobaStatusDesc.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AdditionEsportMobaStatusDesc',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'color')\n    ..aOS(3, _omitFieldNames ? '' : 'nightColor')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionEsportMobaStatusDesc clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionEsportMobaStatusDesc copyWith(\n          void Function(AdditionEsportMobaStatusDesc) updates) =>\n      super.copyWith(\n              (message) => updates(message as AdditionEsportMobaStatusDesc))\n          as AdditionEsportMobaStatusDesc;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AdditionEsportMobaStatusDesc create() =>\n      AdditionEsportMobaStatusDesc._();\n  @$core.override\n  AdditionEsportMobaStatusDesc createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AdditionEsportMobaStatusDesc getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AdditionEsportMobaStatusDesc>(create);\n  static AdditionEsportMobaStatusDesc? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get color => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set color($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasColor() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearColor() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get nightColor => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set nightColor($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasNightColor() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearNightColor() => $_clearField(3);\n}\n\nclass AdditionGoods extends $pb.GeneratedMessage {\n  factory AdditionGoods({\n    $core.String? rcmdDesc,\n    $core.Iterable<GoodsItem>? goodsItems,\n    $core.String? cardType,\n    $core.String? icon,\n    $core.String? uri,\n    $core.int? sourceType,\n    GoodsJumpType? jumpType,\n    $core.String? appName,\n    $core.String? adMarkIcon,\n  }) {\n    final result = create();\n    if (rcmdDesc != null) result.rcmdDesc = rcmdDesc;\n    if (goodsItems != null) result.goodsItems.addAll(goodsItems);\n    if (cardType != null) result.cardType = cardType;\n    if (icon != null) result.icon = icon;\n    if (uri != null) result.uri = uri;\n    if (sourceType != null) result.sourceType = sourceType;\n    if (jumpType != null) result.jumpType = jumpType;\n    if (appName != null) result.appName = appName;\n    if (adMarkIcon != null) result.adMarkIcon = adMarkIcon;\n    return result;\n  }\n\n  AdditionGoods._();\n\n  factory AdditionGoods.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AdditionGoods.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AdditionGoods',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'rcmdDesc')\n    ..pPM<GoodsItem>(2, _omitFieldNames ? '' : 'goodsItems',\n        subBuilder: GoodsItem.create)\n    ..aOS(3, _omitFieldNames ? '' : 'cardType')\n    ..aOS(4, _omitFieldNames ? '' : 'icon')\n    ..aOS(5, _omitFieldNames ? '' : 'uri')\n    ..aI(6, _omitFieldNames ? '' : 'sourceType')\n    ..aE<GoodsJumpType>(7, _omitFieldNames ? '' : 'jumpType',\n        enumValues: GoodsJumpType.values)\n    ..aOS(8, _omitFieldNames ? '' : 'appName')\n    ..aOS(9, _omitFieldNames ? '' : 'adMarkIcon')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionGoods clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionGoods copyWith(void Function(AdditionGoods) updates) =>\n      super.copyWith((message) => updates(message as AdditionGoods))\n          as AdditionGoods;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AdditionGoods create() => AdditionGoods._();\n  @$core.override\n  AdditionGoods createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AdditionGoods getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AdditionGoods>(create);\n  static AdditionGoods? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get rcmdDesc => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set rcmdDesc($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasRcmdDesc() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRcmdDesc() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<GoodsItem> get goodsItems => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $core.String get cardType => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set cardType($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCardType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCardType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get icon => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set icon($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIcon() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIcon() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get uri => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set uri($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasUri() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearUri() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get sourceType => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set sourceType($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasSourceType() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearSourceType() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  GoodsJumpType get jumpType => $_getN(6);\n  @$pb.TagNumber(7)\n  set jumpType(GoodsJumpType value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasJumpType() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearJumpType() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get appName => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set appName($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasAppName() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearAppName() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get adMarkIcon => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set adMarkIcon($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasAdMarkIcon() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearAdMarkIcon() => $_clearField(9);\n}\n\nclass AdditionLiveRoom extends $pb.GeneratedMessage {\n  factory AdditionLiveRoom({\n    $core.String? title,\n    $core.String? cover,\n    VideoBadge? badge,\n    CoverIconWithText? descTextUpper,\n    $core.String? descTextLower,\n    $core.String? uri,\n    $core.String? cardType,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (badge != null) result.badge = badge;\n    if (descTextUpper != null) result.descTextUpper = descTextUpper;\n    if (descTextLower != null) result.descTextLower = descTextLower;\n    if (uri != null) result.uri = uri;\n    if (cardType != null) result.cardType = cardType;\n    return result;\n  }\n\n  AdditionLiveRoom._();\n\n  factory AdditionLiveRoom.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AdditionLiveRoom.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AdditionLiveRoom',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'cover')\n    ..aOM<VideoBadge>(3, _omitFieldNames ? '' : 'badge',\n        subBuilder: VideoBadge.create)\n    ..aOM<CoverIconWithText>(4, _omitFieldNames ? '' : 'descTextUpper',\n        subBuilder: CoverIconWithText.create)\n    ..aOS(5, _omitFieldNames ? '' : 'descTextLower')\n    ..aOS(6, _omitFieldNames ? '' : 'uri')\n    ..aOS(7, _omitFieldNames ? '' : 'cardType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionLiveRoom clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionLiveRoom copyWith(void Function(AdditionLiveRoom) updates) =>\n      super.copyWith((message) => updates(message as AdditionLiveRoom))\n          as AdditionLiveRoom;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AdditionLiveRoom create() => AdditionLiveRoom._();\n  @$core.override\n  AdditionLiveRoom createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AdditionLiveRoom getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AdditionLiveRoom>(create);\n  static AdditionLiveRoom? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get cover => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cover($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCover() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCover() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  VideoBadge get badge => $_getN(2);\n  @$pb.TagNumber(3)\n  set badge(VideoBadge value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBadge() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBadge() => $_clearField(3);\n  @$pb.TagNumber(3)\n  VideoBadge ensureBadge() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  CoverIconWithText get descTextUpper => $_getN(3);\n  @$pb.TagNumber(4)\n  set descTextUpper(CoverIconWithText value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDescTextUpper() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDescTextUpper() => $_clearField(4);\n  @$pb.TagNumber(4)\n  CoverIconWithText ensureDescTextUpper() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.String get descTextLower => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set descTextLower($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDescTextLower() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDescTextLower() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get uri => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set uri($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasUri() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearUri() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get cardType => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set cardType($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCardType() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCardType() => $_clearField(7);\n}\n\nclass AdditionMusic extends $pb.GeneratedMessage {\n  factory AdditionMusic({\n    MdlDynMusic? musicCard,\n    $core.String? cardType,\n  }) {\n    final result = create();\n    if (musicCard != null) result.musicCard = musicCard;\n    if (cardType != null) result.cardType = cardType;\n    return result;\n  }\n\n  AdditionMusic._();\n\n  factory AdditionMusic.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AdditionMusic.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AdditionMusic',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<MdlDynMusic>(1, _omitFieldNames ? '' : 'musicCard',\n        subBuilder: MdlDynMusic.create)\n    ..aOS(2, _omitFieldNames ? '' : 'cardType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionMusic clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionMusic copyWith(void Function(AdditionMusic) updates) =>\n      super.copyWith((message) => updates(message as AdditionMusic))\n          as AdditionMusic;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AdditionMusic create() => AdditionMusic._();\n  @$core.override\n  AdditionMusic createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AdditionMusic getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AdditionMusic>(create);\n  static AdditionMusic? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  MdlDynMusic get musicCard => $_getN(0);\n  @$pb.TagNumber(1)\n  set musicCard(MdlDynMusic value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMusicCard() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMusicCard() => $_clearField(1);\n  @$pb.TagNumber(1)\n  MdlDynMusic ensureMusicCard() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get cardType => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cardType($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCardType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCardType() => $_clearField(2);\n}\n\nclass AdditionUP extends $pb.GeneratedMessage {\n  factory AdditionUP({\n    $core.String? title,\n    HighlightText? descText1,\n    $core.String? descText2,\n    $core.String? url,\n    AdditionalButton? button,\n    $core.String? cardType,\n    $fixnum.Int64? reserveTotal,\n    AdditionalActSkin? actSkin,\n    $fixnum.Int64? rid,\n    ReserveRelationLotteryType? lotteryType,\n    HighlightText? descText3,\n    $fixnum.Int64? upMid,\n    AdditionUserInfo? userInfo,\n    $core.String? dynamicId,\n    $core.bool? showText2,\n    $fixnum.Int64? dynType,\n    $core.String? businessId,\n    $core.String? badgeText,\n    $core.bool? isPremiere,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (descText1 != null) result.descText1 = descText1;\n    if (descText2 != null) result.descText2 = descText2;\n    if (url != null) result.url = url;\n    if (button != null) result.button = button;\n    if (cardType != null) result.cardType = cardType;\n    if (reserveTotal != null) result.reserveTotal = reserveTotal;\n    if (actSkin != null) result.actSkin = actSkin;\n    if (rid != null) result.rid = rid;\n    if (lotteryType != null) result.lotteryType = lotteryType;\n    if (descText3 != null) result.descText3 = descText3;\n    if (upMid != null) result.upMid = upMid;\n    if (userInfo != null) result.userInfo = userInfo;\n    if (dynamicId != null) result.dynamicId = dynamicId;\n    if (showText2 != null) result.showText2 = showText2;\n    if (dynType != null) result.dynType = dynType;\n    if (businessId != null) result.businessId = businessId;\n    if (badgeText != null) result.badgeText = badgeText;\n    if (isPremiere != null) result.isPremiere = isPremiere;\n    return result;\n  }\n\n  AdditionUP._();\n\n  factory AdditionUP.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AdditionUP.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AdditionUP',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOM<HighlightText>(2, _omitFieldNames ? '' : 'descText1',\n        subBuilder: HighlightText.create)\n    ..aOS(3, _omitFieldNames ? '' : 'descText2')\n    ..aOS(4, _omitFieldNames ? '' : 'url')\n    ..aOM<AdditionalButton>(5, _omitFieldNames ? '' : 'button',\n        subBuilder: AdditionalButton.create)\n    ..aOS(6, _omitFieldNames ? '' : 'cardType')\n    ..aInt64(7, _omitFieldNames ? '' : 'reserveTotal')\n    ..aOM<AdditionalActSkin>(8, _omitFieldNames ? '' : 'actSkin',\n        subBuilder: AdditionalActSkin.create)\n    ..aInt64(9, _omitFieldNames ? '' : 'rid')\n    ..aE<ReserveRelationLotteryType>(10, _omitFieldNames ? '' : 'lotteryType',\n        enumValues: ReserveRelationLotteryType.values)\n    ..aOM<HighlightText>(11, _omitFieldNames ? '' : 'descText3',\n        subBuilder: HighlightText.create)\n    ..aInt64(12, _omitFieldNames ? '' : 'upMid')\n    ..aOM<AdditionUserInfo>(13, _omitFieldNames ? '' : 'userInfo',\n        subBuilder: AdditionUserInfo.create)\n    ..aOS(14, _omitFieldNames ? '' : 'dynamicId')\n    ..aOB(15, _omitFieldNames ? '' : 'showText2')\n    ..aInt64(16, _omitFieldNames ? '' : 'dynType')\n    ..aOS(17, _omitFieldNames ? '' : 'businessId')\n    ..aOS(18, _omitFieldNames ? '' : 'badgeText')\n    ..aOB(19, _omitFieldNames ? '' : 'isPremiere')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionUP clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionUP copyWith(void Function(AdditionUP) updates) =>\n      super.copyWith((message) => updates(message as AdditionUP)) as AdditionUP;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AdditionUP create() => AdditionUP._();\n  @$core.override\n  AdditionUP createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AdditionUP getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AdditionUP>(create);\n  static AdditionUP? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  HighlightText get descText1 => $_getN(1);\n  @$pb.TagNumber(2)\n  set descText1(HighlightText value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDescText1() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDescText1() => $_clearField(2);\n  @$pb.TagNumber(2)\n  HighlightText ensureDescText1() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.String get descText2 => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set descText2($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDescText2() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDescText2() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get url => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set url($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUrl() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUrl() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  AdditionalButton get button => $_getN(4);\n  @$pb.TagNumber(5)\n  set button(AdditionalButton value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasButton() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearButton() => $_clearField(5);\n  @$pb.TagNumber(5)\n  AdditionalButton ensureButton() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.String get cardType => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set cardType($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCardType() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCardType() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get reserveTotal => $_getI64(6);\n  @$pb.TagNumber(7)\n  set reserveTotal($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasReserveTotal() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearReserveTotal() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  AdditionalActSkin get actSkin => $_getN(7);\n  @$pb.TagNumber(8)\n  set actSkin(AdditionalActSkin value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasActSkin() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearActSkin() => $_clearField(8);\n  @$pb.TagNumber(8)\n  AdditionalActSkin ensureActSkin() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get rid => $_getI64(8);\n  @$pb.TagNumber(9)\n  set rid($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasRid() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearRid() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  ReserveRelationLotteryType get lotteryType => $_getN(9);\n  @$pb.TagNumber(10)\n  set lotteryType(ReserveRelationLotteryType value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasLotteryType() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearLotteryType() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  HighlightText get descText3 => $_getN(10);\n  @$pb.TagNumber(11)\n  set descText3(HighlightText value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasDescText3() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearDescText3() => $_clearField(11);\n  @$pb.TagNumber(11)\n  HighlightText ensureDescText3() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  $fixnum.Int64 get upMid => $_getI64(11);\n  @$pb.TagNumber(12)\n  set upMid($fixnum.Int64 value) => $_setInt64(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasUpMid() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearUpMid() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  AdditionUserInfo get userInfo => $_getN(12);\n  @$pb.TagNumber(13)\n  set userInfo(AdditionUserInfo value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasUserInfo() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearUserInfo() => $_clearField(13);\n  @$pb.TagNumber(13)\n  AdditionUserInfo ensureUserInfo() => $_ensure(12);\n\n  @$pb.TagNumber(14)\n  $core.String get dynamicId => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set dynamicId($core.String value) => $_setString(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasDynamicId() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearDynamicId() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $core.bool get showText2 => $_getBF(14);\n  @$pb.TagNumber(15)\n  set showText2($core.bool value) => $_setBool(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasShowText2() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearShowText2() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $fixnum.Int64 get dynType => $_getI64(15);\n  @$pb.TagNumber(16)\n  set dynType($fixnum.Int64 value) => $_setInt64(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasDynType() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearDynType() => $_clearField(16);\n\n  @$pb.TagNumber(17)\n  $core.String get businessId => $_getSZ(16);\n  @$pb.TagNumber(17)\n  set businessId($core.String value) => $_setString(16, value);\n  @$pb.TagNumber(17)\n  $core.bool hasBusinessId() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearBusinessId() => $_clearField(17);\n\n  @$pb.TagNumber(18)\n  $core.String get badgeText => $_getSZ(17);\n  @$pb.TagNumber(18)\n  set badgeText($core.String value) => $_setString(17, value);\n  @$pb.TagNumber(18)\n  $core.bool hasBadgeText() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearBadgeText() => $_clearField(18);\n\n  @$pb.TagNumber(19)\n  $core.bool get isPremiere => $_getBF(18);\n  @$pb.TagNumber(19)\n  set isPremiere($core.bool value) => $_setBool(18, value);\n  @$pb.TagNumber(19)\n  $core.bool hasIsPremiere() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearIsPremiere() => $_clearField(19);\n}\n\nclass AdditionUgc extends $pb.GeneratedMessage {\n  factory AdditionUgc({\n    $core.String? headText,\n    $core.String? title,\n    $core.String? cover,\n    $core.String? descText1,\n    $core.String? descText2,\n    $core.String? uri,\n    $core.String? duration,\n    $core.bool? lineFeed,\n    $core.String? cardType,\n  }) {\n    final result = create();\n    if (headText != null) result.headText = headText;\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (descText1 != null) result.descText1 = descText1;\n    if (descText2 != null) result.descText2 = descText2;\n    if (uri != null) result.uri = uri;\n    if (duration != null) result.duration = duration;\n    if (lineFeed != null) result.lineFeed = lineFeed;\n    if (cardType != null) result.cardType = cardType;\n    return result;\n  }\n\n  AdditionUgc._();\n\n  factory AdditionUgc.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AdditionUgc.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AdditionUgc',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'headText')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'cover')\n    ..aOS(4, _omitFieldNames ? '' : 'descText1')\n    ..aOS(5, _omitFieldNames ? '' : 'descText2')\n    ..aOS(6, _omitFieldNames ? '' : 'uri')\n    ..aOS(7, _omitFieldNames ? '' : 'duration')\n    ..aOB(8, _omitFieldNames ? '' : 'lineFeed')\n    ..aOS(9, _omitFieldNames ? '' : 'cardType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionUgc clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionUgc copyWith(void Function(AdditionUgc) updates) =>\n      super.copyWith((message) => updates(message as AdditionUgc))\n          as AdditionUgc;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AdditionUgc create() => AdditionUgc._();\n  @$core.override\n  AdditionUgc createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AdditionUgc getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AdditionUgc>(create);\n  static AdditionUgc? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get headText => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set headText($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasHeadText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearHeadText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get cover => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set cover($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCover() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCover() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get descText1 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set descText1($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDescText1() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDescText1() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get descText2 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set descText2($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDescText2() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDescText2() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get uri => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set uri($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasUri() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearUri() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get duration => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set duration($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasDuration() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearDuration() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.bool get lineFeed => $_getBF(7);\n  @$pb.TagNumber(8)\n  set lineFeed($core.bool value) => $_setBool(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasLineFeed() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearLineFeed() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get cardType => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set cardType($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasCardType() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearCardType() => $_clearField(9);\n}\n\nclass AdditionUserInfo extends $pb.GeneratedMessage {\n  factory AdditionUserInfo({\n    $core.String? name,\n    $core.String? face,\n  }) {\n    final result = create();\n    if (name != null) result.name = name;\n    if (face != null) result.face = face;\n    return result;\n  }\n\n  AdditionUserInfo._();\n\n  factory AdditionUserInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AdditionUserInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AdditionUserInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'name')\n    ..aOS(2, _omitFieldNames ? '' : 'face')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionUserInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionUserInfo copyWith(void Function(AdditionUserInfo) updates) =>\n      super.copyWith((message) => updates(message as AdditionUserInfo))\n          as AdditionUserInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AdditionUserInfo create() => AdditionUserInfo._();\n  @$core.override\n  AdditionUserInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AdditionUserInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AdditionUserInfo>(create);\n  static AdditionUserInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get name => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set name($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasName() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearName() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get face => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set face($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFace() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFace() => $_clearField(2);\n}\n\nclass AdditionVote extends $pb.GeneratedMessage {\n  factory AdditionVote({\n    $core.String? imageUrl,\n    $core.String? title,\n    $core.String? text1,\n    $core.String? buttonText,\n    $core.String? url,\n  }) {\n    final result = create();\n    if (imageUrl != null) result.imageUrl = imageUrl;\n    if (title != null) result.title = title;\n    if (text1 != null) result.text1 = text1;\n    if (buttonText != null) result.buttonText = buttonText;\n    if (url != null) result.url = url;\n    return result;\n  }\n\n  AdditionVote._();\n\n  factory AdditionVote.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AdditionVote.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AdditionVote',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'imageUrl')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'text1')\n    ..aOS(4, _omitFieldNames ? '' : 'buttonText')\n    ..aOS(5, _omitFieldNames ? '' : 'url')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionVote clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionVote copyWith(void Function(AdditionVote) updates) =>\n      super.copyWith((message) => updates(message as AdditionVote))\n          as AdditionVote;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AdditionVote create() => AdditionVote._();\n  @$core.override\n  AdditionVote createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AdditionVote getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AdditionVote>(create);\n  static AdditionVote? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get imageUrl => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set imageUrl($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasImageUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearImageUrl() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get text1 => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set text1($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasText1() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearText1() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get buttonText => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set buttonText($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasButtonText() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearButtonText() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get url => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set url($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasUrl() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearUrl() => $_clearField(5);\n}\n\nenum AdditionVote2_Item {\n  additionVoteWord,\n  additionVotePic,\n  additionVoteDefaule,\n  notSet\n}\n\nclass AdditionVote2 extends $pb.GeneratedMessage {\n  factory AdditionVote2({\n    AdditionVoteType? additionVoteType,\n    $fixnum.Int64? voteId,\n    $core.String? title,\n    $core.String? label,\n    $fixnum.Int64? deadline,\n    $core.String? openText,\n    $core.String? closeText,\n    $core.String? votedText,\n    AdditionVoteState? state,\n    AdditionVoteWord? additionVoteWord,\n    AdditionVotePic? additionVotePic,\n    AdditionVoteDefaule? additionVoteDefaule,\n    $core.int? bizType,\n    $fixnum.Int64? total,\n    $core.String? cardType,\n    $core.String? tips,\n    $core.String? uri,\n    $core.bool? isVoted,\n    $core.int? choiceCnt,\n    $core.bool? defauleSelectShare,\n    OnlyFansVoteProperty? onlyFansVote,\n    $fixnum.Int64? voteOwnerMid,\n  }) {\n    final result = create();\n    if (additionVoteType != null) result.additionVoteType = additionVoteType;\n    if (voteId != null) result.voteId = voteId;\n    if (title != null) result.title = title;\n    if (label != null) result.label = label;\n    if (deadline != null) result.deadline = deadline;\n    if (openText != null) result.openText = openText;\n    if (closeText != null) result.closeText = closeText;\n    if (votedText != null) result.votedText = votedText;\n    if (state != null) result.state = state;\n    if (additionVoteWord != null) result.additionVoteWord = additionVoteWord;\n    if (additionVotePic != null) result.additionVotePic = additionVotePic;\n    if (additionVoteDefaule != null)\n      result.additionVoteDefaule = additionVoteDefaule;\n    if (bizType != null) result.bizType = bizType;\n    if (total != null) result.total = total;\n    if (cardType != null) result.cardType = cardType;\n    if (tips != null) result.tips = tips;\n    if (uri != null) result.uri = uri;\n    if (isVoted != null) result.isVoted = isVoted;\n    if (choiceCnt != null) result.choiceCnt = choiceCnt;\n    if (defauleSelectShare != null)\n      result.defauleSelectShare = defauleSelectShare;\n    if (onlyFansVote != null) result.onlyFansVote = onlyFansVote;\n    if (voteOwnerMid != null) result.voteOwnerMid = voteOwnerMid;\n    return result;\n  }\n\n  AdditionVote2._();\n\n  factory AdditionVote2.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AdditionVote2.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, AdditionVote2_Item>\n      _AdditionVote2_ItemByTag = {\n    10: AdditionVote2_Item.additionVoteWord,\n    11: AdditionVote2_Item.additionVotePic,\n    12: AdditionVote2_Item.additionVoteDefaule,\n    0: AdditionVote2_Item.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AdditionVote2',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..oo(0, [10, 11, 12])\n    ..aE<AdditionVoteType>(1, _omitFieldNames ? '' : 'additionVoteType',\n        enumValues: AdditionVoteType.values)\n    ..aInt64(2, _omitFieldNames ? '' : 'voteId')\n    ..aOS(3, _omitFieldNames ? '' : 'title')\n    ..aOS(4, _omitFieldNames ? '' : 'label')\n    ..aInt64(5, _omitFieldNames ? '' : 'deadline')\n    ..aOS(6, _omitFieldNames ? '' : 'openText')\n    ..aOS(7, _omitFieldNames ? '' : 'closeText')\n    ..aOS(8, _omitFieldNames ? '' : 'votedText')\n    ..aE<AdditionVoteState>(9, _omitFieldNames ? '' : 'state',\n        enumValues: AdditionVoteState.values)\n    ..aOM<AdditionVoteWord>(10, _omitFieldNames ? '' : 'additionVoteWord',\n        subBuilder: AdditionVoteWord.create)\n    ..aOM<AdditionVotePic>(11, _omitFieldNames ? '' : 'additionVotePic',\n        subBuilder: AdditionVotePic.create)\n    ..aOM<AdditionVoteDefaule>(12, _omitFieldNames ? '' : 'additionVoteDefaule',\n        subBuilder: AdditionVoteDefaule.create)\n    ..aI(13, _omitFieldNames ? '' : 'bizType')\n    ..aInt64(14, _omitFieldNames ? '' : 'total')\n    ..aOS(15, _omitFieldNames ? '' : 'cardType')\n    ..aOS(16, _omitFieldNames ? '' : 'tips')\n    ..aOS(17, _omitFieldNames ? '' : 'uri')\n    ..aOB(18, _omitFieldNames ? '' : 'isVoted')\n    ..aI(19, _omitFieldNames ? '' : 'choiceCnt')\n    ..aOB(20, _omitFieldNames ? '' : 'defauleSelectShare')\n    ..aOM<OnlyFansVoteProperty>(21, _omitFieldNames ? '' : 'onlyFansVote',\n        subBuilder: OnlyFansVoteProperty.create)\n    ..aInt64(22, _omitFieldNames ? '' : 'voteOwnerMid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionVote2 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionVote2 copyWith(void Function(AdditionVote2) updates) =>\n      super.copyWith((message) => updates(message as AdditionVote2))\n          as AdditionVote2;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AdditionVote2 create() => AdditionVote2._();\n  @$core.override\n  AdditionVote2 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AdditionVote2 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AdditionVote2>(create);\n  static AdditionVote2? _defaultInstance;\n\n  @$pb.TagNumber(10)\n  @$pb.TagNumber(11)\n  @$pb.TagNumber(12)\n  AdditionVote2_Item whichItem() => _AdditionVote2_ItemByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(10)\n  @$pb.TagNumber(11)\n  @$pb.TagNumber(12)\n  void clearItem() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  AdditionVoteType get additionVoteType => $_getN(0);\n  @$pb.TagNumber(1)\n  set additionVoteType(AdditionVoteType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAdditionVoteType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAdditionVoteType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get voteId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set voteId($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasVoteId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearVoteId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get title => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set title($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get label => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set label($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLabel() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLabel() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get deadline => $_getI64(4);\n  @$pb.TagNumber(5)\n  set deadline($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDeadline() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDeadline() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get openText => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set openText($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasOpenText() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearOpenText() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get closeText => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set closeText($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCloseText() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCloseText() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get votedText => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set votedText($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasVotedText() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearVotedText() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  AdditionVoteState get state => $_getN(8);\n  @$pb.TagNumber(9)\n  set state(AdditionVoteState value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasState() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearState() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  AdditionVoteWord get additionVoteWord => $_getN(9);\n  @$pb.TagNumber(10)\n  set additionVoteWord(AdditionVoteWord value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasAdditionVoteWord() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearAdditionVoteWord() => $_clearField(10);\n  @$pb.TagNumber(10)\n  AdditionVoteWord ensureAdditionVoteWord() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  AdditionVotePic get additionVotePic => $_getN(10);\n  @$pb.TagNumber(11)\n  set additionVotePic(AdditionVotePic value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasAdditionVotePic() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearAdditionVotePic() => $_clearField(11);\n  @$pb.TagNumber(11)\n  AdditionVotePic ensureAdditionVotePic() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  AdditionVoteDefaule get additionVoteDefaule => $_getN(11);\n  @$pb.TagNumber(12)\n  set additionVoteDefaule(AdditionVoteDefaule value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasAdditionVoteDefaule() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearAdditionVoteDefaule() => $_clearField(12);\n  @$pb.TagNumber(12)\n  AdditionVoteDefaule ensureAdditionVoteDefaule() => $_ensure(11);\n\n  @$pb.TagNumber(13)\n  $core.int get bizType => $_getIZ(12);\n  @$pb.TagNumber(13)\n  set bizType($core.int value) => $_setSignedInt32(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasBizType() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearBizType() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $fixnum.Int64 get total => $_getI64(13);\n  @$pb.TagNumber(14)\n  set total($fixnum.Int64 value) => $_setInt64(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasTotal() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearTotal() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $core.String get cardType => $_getSZ(14);\n  @$pb.TagNumber(15)\n  set cardType($core.String value) => $_setString(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasCardType() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearCardType() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $core.String get tips => $_getSZ(15);\n  @$pb.TagNumber(16)\n  set tips($core.String value) => $_setString(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasTips() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearTips() => $_clearField(16);\n\n  @$pb.TagNumber(17)\n  $core.String get uri => $_getSZ(16);\n  @$pb.TagNumber(17)\n  set uri($core.String value) => $_setString(16, value);\n  @$pb.TagNumber(17)\n  $core.bool hasUri() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearUri() => $_clearField(17);\n\n  @$pb.TagNumber(18)\n  $core.bool get isVoted => $_getBF(17);\n  @$pb.TagNumber(18)\n  set isVoted($core.bool value) => $_setBool(17, value);\n  @$pb.TagNumber(18)\n  $core.bool hasIsVoted() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearIsVoted() => $_clearField(18);\n\n  @$pb.TagNumber(19)\n  $core.int get choiceCnt => $_getIZ(18);\n  @$pb.TagNumber(19)\n  set choiceCnt($core.int value) => $_setSignedInt32(18, value);\n  @$pb.TagNumber(19)\n  $core.bool hasChoiceCnt() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearChoiceCnt() => $_clearField(19);\n\n  @$pb.TagNumber(20)\n  $core.bool get defauleSelectShare => $_getBF(19);\n  @$pb.TagNumber(20)\n  set defauleSelectShare($core.bool value) => $_setBool(19, value);\n  @$pb.TagNumber(20)\n  $core.bool hasDefauleSelectShare() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearDefauleSelectShare() => $_clearField(20);\n\n  @$pb.TagNumber(21)\n  OnlyFansVoteProperty get onlyFansVote => $_getN(20);\n  @$pb.TagNumber(21)\n  set onlyFansVote(OnlyFansVoteProperty value) => $_setField(21, value);\n  @$pb.TagNumber(21)\n  $core.bool hasOnlyFansVote() => $_has(20);\n  @$pb.TagNumber(21)\n  void clearOnlyFansVote() => $_clearField(21);\n  @$pb.TagNumber(21)\n  OnlyFansVoteProperty ensureOnlyFansVote() => $_ensure(20);\n\n  @$pb.TagNumber(22)\n  $fixnum.Int64 get voteOwnerMid => $_getI64(21);\n  @$pb.TagNumber(22)\n  set voteOwnerMid($fixnum.Int64 value) => $_setInt64(21, value);\n  @$pb.TagNumber(22)\n  $core.bool hasVoteOwnerMid() => $_has(21);\n  @$pb.TagNumber(22)\n  void clearVoteOwnerMid() => $_clearField(22);\n}\n\nclass AdditionVoteDefaule extends $pb.GeneratedMessage {\n  factory AdditionVoteDefaule({\n    $core.Iterable<$core.String>? cover,\n  }) {\n    final result = create();\n    if (cover != null) result.cover.addAll(cover);\n    return result;\n  }\n\n  AdditionVoteDefaule._();\n\n  factory AdditionVoteDefaule.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AdditionVoteDefaule.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AdditionVoteDefaule',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPS(1, _omitFieldNames ? '' : 'cover')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionVoteDefaule clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionVoteDefaule copyWith(void Function(AdditionVoteDefaule) updates) =>\n      super.copyWith((message) => updates(message as AdditionVoteDefaule))\n          as AdditionVoteDefaule;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AdditionVoteDefaule create() => AdditionVoteDefaule._();\n  @$core.override\n  AdditionVoteDefaule createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AdditionVoteDefaule getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AdditionVoteDefaule>(create);\n  static AdditionVoteDefaule? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<$core.String> get cover => $_getList(0);\n}\n\nclass AdditionVotePic extends $pb.GeneratedMessage {\n  factory AdditionVotePic({\n    $core.Iterable<AdditionVotePicItem>? item,\n  }) {\n    final result = create();\n    if (item != null) result.item.addAll(item);\n    return result;\n  }\n\n  AdditionVotePic._();\n\n  factory AdditionVotePic.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AdditionVotePic.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AdditionVotePic',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<AdditionVotePicItem>(1, _omitFieldNames ? '' : 'item',\n        subBuilder: AdditionVotePicItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionVotePic clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionVotePic copyWith(void Function(AdditionVotePic) updates) =>\n      super.copyWith((message) => updates(message as AdditionVotePic))\n          as AdditionVotePic;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AdditionVotePic create() => AdditionVotePic._();\n  @$core.override\n  AdditionVotePic createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AdditionVotePic getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AdditionVotePic>(create);\n  static AdditionVotePic? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<AdditionVotePicItem> get item => $_getList(0);\n}\n\nclass AdditionVotePicItem extends $pb.GeneratedMessage {\n  factory AdditionVotePicItem({\n    $core.int? optIdx,\n    $core.String? cover,\n    $core.bool? isVote,\n    $core.int? total,\n    $core.double? persent,\n    $core.String? title,\n    $core.bool? isMaxOption,\n  }) {\n    final result = create();\n    if (optIdx != null) result.optIdx = optIdx;\n    if (cover != null) result.cover = cover;\n    if (isVote != null) result.isVote = isVote;\n    if (total != null) result.total = total;\n    if (persent != null) result.persent = persent;\n    if (title != null) result.title = title;\n    if (isMaxOption != null) result.isMaxOption = isMaxOption;\n    return result;\n  }\n\n  AdditionVotePicItem._();\n\n  factory AdditionVotePicItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AdditionVotePicItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AdditionVotePicItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'optIdx')\n    ..aOS(2, _omitFieldNames ? '' : 'cover')\n    ..aOB(3, _omitFieldNames ? '' : 'isVote')\n    ..aI(4, _omitFieldNames ? '' : 'total')\n    ..aD(5, _omitFieldNames ? '' : 'persent')\n    ..aOS(6, _omitFieldNames ? '' : 'title')\n    ..aOB(7, _omitFieldNames ? '' : 'isMaxOption')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionVotePicItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionVotePicItem copyWith(void Function(AdditionVotePicItem) updates) =>\n      super.copyWith((message) => updates(message as AdditionVotePicItem))\n          as AdditionVotePicItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AdditionVotePicItem create() => AdditionVotePicItem._();\n  @$core.override\n  AdditionVotePicItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AdditionVotePicItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AdditionVotePicItem>(create);\n  static AdditionVotePicItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get optIdx => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set optIdx($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOptIdx() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOptIdx() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get cover => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cover($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCover() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCover() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get isVote => $_getBF(2);\n  @$pb.TagNumber(3)\n  set isVote($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIsVote() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIsVote() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get total => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set total($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTotal() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTotal() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.double get persent => $_getN(4);\n  @$pb.TagNumber(5)\n  set persent($core.double value) => $_setDouble(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPersent() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPersent() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get title => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set title($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasTitle() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearTitle() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.bool get isMaxOption => $_getBF(6);\n  @$pb.TagNumber(7)\n  set isMaxOption($core.bool value) => $_setBool(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasIsMaxOption() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearIsMaxOption() => $_clearField(7);\n}\n\nclass AdditionVoteWord extends $pb.GeneratedMessage {\n  factory AdditionVoteWord({\n    $core.Iterable<AdditionVoteWordItem>? item,\n  }) {\n    final result = create();\n    if (item != null) result.item.addAll(item);\n    return result;\n  }\n\n  AdditionVoteWord._();\n\n  factory AdditionVoteWord.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AdditionVoteWord.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AdditionVoteWord',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<AdditionVoteWordItem>(1, _omitFieldNames ? '' : 'item',\n        subBuilder: AdditionVoteWordItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionVoteWord clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionVoteWord copyWith(void Function(AdditionVoteWord) updates) =>\n      super.copyWith((message) => updates(message as AdditionVoteWord))\n          as AdditionVoteWord;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AdditionVoteWord create() => AdditionVoteWord._();\n  @$core.override\n  AdditionVoteWord createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AdditionVoteWord getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AdditionVoteWord>(create);\n  static AdditionVoteWord? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<AdditionVoteWordItem> get item => $_getList(0);\n}\n\nclass AdditionVoteWordItem extends $pb.GeneratedMessage {\n  factory AdditionVoteWordItem({\n    $core.int? optIdx,\n    $core.String? title,\n    $core.bool? isVote,\n    $core.int? total,\n    $core.double? persent,\n    $core.bool? isMaxOption,\n  }) {\n    final result = create();\n    if (optIdx != null) result.optIdx = optIdx;\n    if (title != null) result.title = title;\n    if (isVote != null) result.isVote = isVote;\n    if (total != null) result.total = total;\n    if (persent != null) result.persent = persent;\n    if (isMaxOption != null) result.isMaxOption = isMaxOption;\n    return result;\n  }\n\n  AdditionVoteWordItem._();\n\n  factory AdditionVoteWordItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AdditionVoteWordItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AdditionVoteWordItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'optIdx')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOB(3, _omitFieldNames ? '' : 'isVote')\n    ..aI(4, _omitFieldNames ? '' : 'total')\n    ..aD(5, _omitFieldNames ? '' : 'persent')\n    ..aOB(6, _omitFieldNames ? '' : 'isMaxOption')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionVoteWordItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionVoteWordItem copyWith(void Function(AdditionVoteWordItem) updates) =>\n      super.copyWith((message) => updates(message as AdditionVoteWordItem))\n          as AdditionVoteWordItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AdditionVoteWordItem create() => AdditionVoteWordItem._();\n  @$core.override\n  AdditionVoteWordItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AdditionVoteWordItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AdditionVoteWordItem>(create);\n  static AdditionVoteWordItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get optIdx => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set optIdx($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOptIdx() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOptIdx() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get isVote => $_getBF(2);\n  @$pb.TagNumber(3)\n  set isVote($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIsVote() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIsVote() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get total => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set total($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTotal() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTotal() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.double get persent => $_getN(4);\n  @$pb.TagNumber(5)\n  set persent($core.double value) => $_setDouble(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPersent() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPersent() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.bool get isMaxOption => $_getBF(5);\n  @$pb.TagNumber(6)\n  set isMaxOption($core.bool value) => $_setBool(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasIsMaxOption() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearIsMaxOption() => $_clearField(6);\n}\n\nclass AdditionalActSkin extends $pb.GeneratedMessage {\n  factory AdditionalActSkin({\n    $core.String? svga,\n    $core.String? lastImage,\n    $fixnum.Int64? playTimes,\n  }) {\n    final result = create();\n    if (svga != null) result.svga = svga;\n    if (lastImage != null) result.lastImage = lastImage;\n    if (playTimes != null) result.playTimes = playTimes;\n    return result;\n  }\n\n  AdditionalActSkin._();\n\n  factory AdditionalActSkin.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AdditionalActSkin.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AdditionalActSkin',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'svga')\n    ..aOS(2, _omitFieldNames ? '' : 'lastImage')\n    ..aInt64(3, _omitFieldNames ? '' : 'playTimes')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionalActSkin clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionalActSkin copyWith(void Function(AdditionalActSkin) updates) =>\n      super.copyWith((message) => updates(message as AdditionalActSkin))\n          as AdditionalActSkin;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AdditionalActSkin create() => AdditionalActSkin._();\n  @$core.override\n  AdditionalActSkin createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AdditionalActSkin getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AdditionalActSkin>(create);\n  static AdditionalActSkin? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get svga => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set svga($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSvga() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSvga() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get lastImage => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set lastImage($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLastImage() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLastImage() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get playTimes => $_getI64(2);\n  @$pb.TagNumber(3)\n  set playTimes($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPlayTimes() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPlayTimes() => $_clearField(3);\n}\n\nclass AdditionalButton extends $pb.GeneratedMessage {\n  factory AdditionalButton({\n    AddButtonType? type,\n    AdditionalButtonStyle? jumpStyle,\n    $core.String? jumpUrl,\n    AdditionalButtonStyle? uncheck,\n    AdditionalButtonStyle? check_5,\n    AdditionalButtonStatus? status,\n    AdditionalButtonClickType? clickType,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (jumpStyle != null) result.jumpStyle = jumpStyle;\n    if (jumpUrl != null) result.jumpUrl = jumpUrl;\n    if (uncheck != null) result.uncheck = uncheck;\n    if (check_5 != null) result.check_5 = check_5;\n    if (status != null) result.status = status;\n    if (clickType != null) result.clickType = clickType;\n    return result;\n  }\n\n  AdditionalButton._();\n\n  factory AdditionalButton.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AdditionalButton.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AdditionalButton',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aE<AddButtonType>(1, _omitFieldNames ? '' : 'type',\n        enumValues: AddButtonType.values)\n    ..aOM<AdditionalButtonStyle>(2, _omitFieldNames ? '' : 'jumpStyle',\n        subBuilder: AdditionalButtonStyle.create)\n    ..aOS(3, _omitFieldNames ? '' : 'jumpUrl')\n    ..aOM<AdditionalButtonStyle>(4, _omitFieldNames ? '' : 'uncheck',\n        subBuilder: AdditionalButtonStyle.create)\n    ..aOM<AdditionalButtonStyle>(5, _omitFieldNames ? '' : 'check',\n        subBuilder: AdditionalButtonStyle.create)\n    ..aE<AdditionalButtonStatus>(6, _omitFieldNames ? '' : 'status',\n        enumValues: AdditionalButtonStatus.values)\n    ..aE<AdditionalButtonClickType>(7, _omitFieldNames ? '' : 'clickType',\n        enumValues: AdditionalButtonClickType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionalButton clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionalButton copyWith(void Function(AdditionalButton) updates) =>\n      super.copyWith((message) => updates(message as AdditionalButton))\n          as AdditionalButton;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AdditionalButton create() => AdditionalButton._();\n  @$core.override\n  AdditionalButton createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AdditionalButton getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AdditionalButton>(create);\n  static AdditionalButton? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  AddButtonType get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(AddButtonType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  AdditionalButtonStyle get jumpStyle => $_getN(1);\n  @$pb.TagNumber(2)\n  set jumpStyle(AdditionalButtonStyle value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasJumpStyle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearJumpStyle() => $_clearField(2);\n  @$pb.TagNumber(2)\n  AdditionalButtonStyle ensureJumpStyle() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.String get jumpUrl => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set jumpUrl($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasJumpUrl() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearJumpUrl() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  AdditionalButtonStyle get uncheck => $_getN(3);\n  @$pb.TagNumber(4)\n  set uncheck(AdditionalButtonStyle value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUncheck() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUncheck() => $_clearField(4);\n  @$pb.TagNumber(4)\n  AdditionalButtonStyle ensureUncheck() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  AdditionalButtonStyle get check_5 => $_getN(4);\n  @$pb.TagNumber(5)\n  set check_5(AdditionalButtonStyle value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCheck_5() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCheck_5() => $_clearField(5);\n  @$pb.TagNumber(5)\n  AdditionalButtonStyle ensureCheck_5() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  AdditionalButtonStatus get status => $_getN(5);\n  @$pb.TagNumber(6)\n  set status(AdditionalButtonStatus value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasStatus() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearStatus() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  AdditionalButtonClickType get clickType => $_getN(6);\n  @$pb.TagNumber(7)\n  set clickType(AdditionalButtonClickType value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasClickType() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearClickType() => $_clearField(7);\n}\n\nclass AdditionalButtonInteractive extends $pb.GeneratedMessage {\n  factory AdditionalButtonInteractive({\n    $core.String? popups,\n    $core.String? confirm,\n    $core.String? cancel,\n    $core.String? desc,\n  }) {\n    final result = create();\n    if (popups != null) result.popups = popups;\n    if (confirm != null) result.confirm = confirm;\n    if (cancel != null) result.cancel = cancel;\n    if (desc != null) result.desc = desc;\n    return result;\n  }\n\n  AdditionalButtonInteractive._();\n\n  factory AdditionalButtonInteractive.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AdditionalButtonInteractive.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AdditionalButtonInteractive',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'popups')\n    ..aOS(2, _omitFieldNames ? '' : 'confirm')\n    ..aOS(3, _omitFieldNames ? '' : 'cancel')\n    ..aOS(4, _omitFieldNames ? '' : 'desc')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionalButtonInteractive clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionalButtonInteractive copyWith(\n          void Function(AdditionalButtonInteractive) updates) =>\n      super.copyWith(\n              (message) => updates(message as AdditionalButtonInteractive))\n          as AdditionalButtonInteractive;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AdditionalButtonInteractive create() =>\n      AdditionalButtonInteractive._();\n  @$core.override\n  AdditionalButtonInteractive createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AdditionalButtonInteractive getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AdditionalButtonInteractive>(create);\n  static AdditionalButtonInteractive? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get popups => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set popups($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPopups() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPopups() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get confirm => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set confirm($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasConfirm() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearConfirm() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get cancel => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set cancel($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCancel() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCancel() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get desc => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set desc($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDesc() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDesc() => $_clearField(4);\n}\n\nclass AdditionalButtonShare extends $pb.GeneratedMessage {\n  factory AdditionalButtonShare({\n    AdditionalShareShowType? show,\n    $core.String? icon,\n    $core.String? text,\n  }) {\n    final result = create();\n    if (show != null) result.show = show;\n    if (icon != null) result.icon = icon;\n    if (text != null) result.text = text;\n    return result;\n  }\n\n  AdditionalButtonShare._();\n\n  factory AdditionalButtonShare.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AdditionalButtonShare.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AdditionalButtonShare',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aE<AdditionalShareShowType>(1, _omitFieldNames ? '' : 'show',\n        enumValues: AdditionalShareShowType.values)\n    ..aOS(2, _omitFieldNames ? '' : 'icon')\n    ..aOS(3, _omitFieldNames ? '' : 'text')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionalButtonShare clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionalButtonShare copyWith(\n          void Function(AdditionalButtonShare) updates) =>\n      super.copyWith((message) => updates(message as AdditionalButtonShare))\n          as AdditionalButtonShare;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AdditionalButtonShare create() => AdditionalButtonShare._();\n  @$core.override\n  AdditionalButtonShare createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AdditionalButtonShare getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AdditionalButtonShare>(create);\n  static AdditionalButtonShare? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  AdditionalShareShowType get show => $_getN(0);\n  @$pb.TagNumber(1)\n  set show(AdditionalShareShowType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasShow() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearShow() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get icon => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set icon($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIcon() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIcon() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get text => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set text($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasText() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearText() => $_clearField(3);\n}\n\nclass AdditionalButtonStyle extends $pb.GeneratedMessage {\n  factory AdditionalButtonStyle({\n    $core.String? icon,\n    $core.String? text,\n    AdditionalButtonInteractive? interactive,\n    AddButtonBgStyle? bgStyle,\n    $core.String? toast,\n    DisableState? disable,\n    AdditionalButtonShare? share,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (text != null) result.text = text;\n    if (interactive != null) result.interactive = interactive;\n    if (bgStyle != null) result.bgStyle = bgStyle;\n    if (toast != null) result.toast = toast;\n    if (disable != null) result.disable = disable;\n    if (share != null) result.share = share;\n    return result;\n  }\n\n  AdditionalButtonStyle._();\n\n  factory AdditionalButtonStyle.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AdditionalButtonStyle.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AdditionalButtonStyle',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'text')\n    ..aOM<AdditionalButtonInteractive>(3, _omitFieldNames ? '' : 'interactive',\n        subBuilder: AdditionalButtonInteractive.create)\n    ..aE<AddButtonBgStyle>(4, _omitFieldNames ? '' : 'bgStyle',\n        enumValues: AddButtonBgStyle.values)\n    ..aOS(5, _omitFieldNames ? '' : 'toast')\n    ..aE<DisableState>(6, _omitFieldNames ? '' : 'disable',\n        enumValues: DisableState.values)\n    ..aOM<AdditionalButtonShare>(7, _omitFieldNames ? '' : 'share',\n        subBuilder: AdditionalButtonShare.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionalButtonStyle clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionalButtonStyle copyWith(\n          void Function(AdditionalButtonStyle) updates) =>\n      super.copyWith((message) => updates(message as AdditionalButtonStyle))\n          as AdditionalButtonStyle;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AdditionalButtonStyle create() => AdditionalButtonStyle._();\n  @$core.override\n  AdditionalButtonStyle createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AdditionalButtonStyle getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AdditionalButtonStyle>(create);\n  static AdditionalButtonStyle? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  AdditionalButtonInteractive get interactive => $_getN(2);\n  @$pb.TagNumber(3)\n  set interactive(AdditionalButtonInteractive value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasInteractive() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearInteractive() => $_clearField(3);\n  @$pb.TagNumber(3)\n  AdditionalButtonInteractive ensureInteractive() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  AddButtonBgStyle get bgStyle => $_getN(3);\n  @$pb.TagNumber(4)\n  set bgStyle(AddButtonBgStyle value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBgStyle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBgStyle() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get toast => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set toast($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasToast() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearToast() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  DisableState get disable => $_getN(5);\n  @$pb.TagNumber(6)\n  set disable(DisableState value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasDisable() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearDisable() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  AdditionalButtonShare get share => $_getN(6);\n  @$pb.TagNumber(7)\n  set share(AdditionalButtonShare value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasShare() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearShare() => $_clearField(7);\n  @$pb.TagNumber(7)\n  AdditionalButtonShare ensureShare() => $_ensure(6);\n}\n\nclass AdditionalPGC extends $pb.GeneratedMessage {\n  factory AdditionalPGC({\n    $core.String? headText,\n    $core.String? title,\n    $core.String? imageUrl,\n    $core.String? descText1,\n    $core.String? descText2,\n    $core.String? url,\n    AdditionalButton? button,\n    $core.String? headIcon,\n    ImageStyle? style,\n    $core.String? type,\n  }) {\n    final result = create();\n    if (headText != null) result.headText = headText;\n    if (title != null) result.title = title;\n    if (imageUrl != null) result.imageUrl = imageUrl;\n    if (descText1 != null) result.descText1 = descText1;\n    if (descText2 != null) result.descText2 = descText2;\n    if (url != null) result.url = url;\n    if (button != null) result.button = button;\n    if (headIcon != null) result.headIcon = headIcon;\n    if (style != null) result.style = style;\n    if (type != null) result.type = type;\n    return result;\n  }\n\n  AdditionalPGC._();\n\n  factory AdditionalPGC.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AdditionalPGC.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AdditionalPGC',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'headText')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'imageUrl')\n    ..aOS(4, _omitFieldNames ? '' : 'descText1')\n    ..aOS(5, _omitFieldNames ? '' : 'descText2')\n    ..aOS(6, _omitFieldNames ? '' : 'url')\n    ..aOM<AdditionalButton>(7, _omitFieldNames ? '' : 'button',\n        subBuilder: AdditionalButton.create)\n    ..aOS(8, _omitFieldNames ? '' : 'headIcon')\n    ..aE<ImageStyle>(9, _omitFieldNames ? '' : 'style',\n        enumValues: ImageStyle.values)\n    ..aOS(10, _omitFieldNames ? '' : 'type')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionalPGC clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AdditionalPGC copyWith(void Function(AdditionalPGC) updates) =>\n      super.copyWith((message) => updates(message as AdditionalPGC))\n          as AdditionalPGC;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AdditionalPGC create() => AdditionalPGC._();\n  @$core.override\n  AdditionalPGC createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AdditionalPGC getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AdditionalPGC>(create);\n  static AdditionalPGC? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get headText => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set headText($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasHeadText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearHeadText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get imageUrl => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set imageUrl($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasImageUrl() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearImageUrl() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get descText1 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set descText1($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDescText1() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDescText1() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get descText2 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set descText2($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDescText2() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDescText2() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get url => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set url($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasUrl() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearUrl() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  AdditionalButton get button => $_getN(6);\n  @$pb.TagNumber(7)\n  set button(AdditionalButton value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasButton() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearButton() => $_clearField(7);\n  @$pb.TagNumber(7)\n  AdditionalButton ensureButton() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  $core.String get headIcon => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set headIcon($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasHeadIcon() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearHeadIcon() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  ImageStyle get style => $_getN(8);\n  @$pb.TagNumber(9)\n  set style(ImageStyle value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasStyle() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearStyle() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get type => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set type($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasType() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearType() => $_clearField(10);\n}\n\nclass AlumniDynamicsReply extends $pb.GeneratedMessage {\n  factory AlumniDynamicsReply({\n    $core.Iterable<DynamicItem>? list,\n    $core.String? toast,\n  }) {\n    final result = create();\n    if (list != null) result.list.addAll(list);\n    if (toast != null) result.toast = toast;\n    return result;\n  }\n\n  AlumniDynamicsReply._();\n\n  factory AlumniDynamicsReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AlumniDynamicsReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AlumniDynamicsReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<DynamicItem>(1, _omitFieldNames ? '' : 'list',\n        subBuilder: DynamicItem.create)\n    ..aOS(2, _omitFieldNames ? '' : 'toast')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AlumniDynamicsReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AlumniDynamicsReply copyWith(void Function(AlumniDynamicsReply) updates) =>\n      super.copyWith((message) => updates(message as AlumniDynamicsReply))\n          as AlumniDynamicsReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AlumniDynamicsReply create() => AlumniDynamicsReply._();\n  @$core.override\n  AlumniDynamicsReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AlumniDynamicsReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AlumniDynamicsReply>(create);\n  static AlumniDynamicsReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<DynamicItem> get list => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.String get toast => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set toast($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasToast() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearToast() => $_clearField(2);\n}\n\nclass AlumniDynamicsReq extends $pb.GeneratedMessage {\n  factory AlumniDynamicsReq({\n    $fixnum.Int64? campusId,\n    $core.int? firstTime,\n    $1.PlayerArgs? playerArgs,\n    $core.int? localTime,\n    $core.int? page,\n    CampusReqFromType? fromType,\n  }) {\n    final result = create();\n    if (campusId != null) result.campusId = campusId;\n    if (firstTime != null) result.firstTime = firstTime;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    if (localTime != null) result.localTime = localTime;\n    if (page != null) result.page = page;\n    if (fromType != null) result.fromType = fromType;\n    return result;\n  }\n\n  AlumniDynamicsReq._();\n\n  factory AlumniDynamicsReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AlumniDynamicsReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AlumniDynamicsReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'campusId')\n    ..aI(2, _omitFieldNames ? '' : 'firstTime')\n    ..aOM<$1.PlayerArgs>(3, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $1.PlayerArgs.create)\n    ..aI(4, _omitFieldNames ? '' : 'localTime')\n    ..aI(5, _omitFieldNames ? '' : 'page')\n    ..aE<CampusReqFromType>(6, _omitFieldNames ? '' : 'fromType',\n        enumValues: CampusReqFromType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AlumniDynamicsReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AlumniDynamicsReq copyWith(void Function(AlumniDynamicsReq) updates) =>\n      super.copyWith((message) => updates(message as AlumniDynamicsReq))\n          as AlumniDynamicsReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AlumniDynamicsReq create() => AlumniDynamicsReq._();\n  @$core.override\n  AlumniDynamicsReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AlumniDynamicsReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AlumniDynamicsReq>(create);\n  static AlumniDynamicsReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get campusId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set campusId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCampusId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCampusId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get firstTime => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set firstTime($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFirstTime() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFirstTime() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $1.PlayerArgs get playerArgs => $_getN(2);\n  @$pb.TagNumber(3)\n  set playerArgs($1.PlayerArgs value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPlayerArgs() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPlayerArgs() => $_clearField(3);\n  @$pb.TagNumber(3)\n  $1.PlayerArgs ensurePlayerArgs() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.int get localTime => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set localTime($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLocalTime() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLocalTime() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get page => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set page($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPage() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPage() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  CampusReqFromType get fromType => $_getN(5);\n  @$pb.TagNumber(6)\n  set fromType(CampusReqFromType value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasFromType() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearFromType() => $_clearField(6);\n}\n\nclass AuthorBadge extends $pb.GeneratedMessage {\n  factory AuthorBadge({\n    AuthorBadgeStyle? badgeStyle,\n    IconBadge? badge,\n  }) {\n    final result = create();\n    if (badgeStyle != null) result.badgeStyle = badgeStyle;\n    if (badge != null) result.badge = badge;\n    return result;\n  }\n\n  AuthorBadge._();\n\n  factory AuthorBadge.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AuthorBadge.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AuthorBadge',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aE<AuthorBadgeStyle>(1, _omitFieldNames ? '' : 'badgeStyle',\n        enumValues: AuthorBadgeStyle.values)\n    ..aOM<IconBadge>(2, _omitFieldNames ? '' : 'badge',\n        subBuilder: IconBadge.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AuthorBadge clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AuthorBadge copyWith(void Function(AuthorBadge) updates) =>\n      super.copyWith((message) => updates(message as AuthorBadge))\n          as AuthorBadge;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AuthorBadge create() => AuthorBadge._();\n  @$core.override\n  AuthorBadge createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AuthorBadge getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AuthorBadge>(create);\n  static AuthorBadge? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  AuthorBadgeStyle get badgeStyle => $_getN(0);\n  @$pb.TagNumber(1)\n  set badgeStyle(AuthorBadgeStyle value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBadgeStyle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBadgeStyle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  IconBadge get badge => $_getN(1);\n  @$pb.TagNumber(2)\n  set badge(IconBadge value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBadge() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBadge() => $_clearField(2);\n  @$pb.TagNumber(2)\n  IconBadge ensureBadge() => $_ensure(1);\n}\n\nclass BasicUserInfoV2 extends $pb.GeneratedMessage {\n  factory BasicUserInfoV2({\n    $fixnum.Int64? mid,\n    $core.String? name,\n    $core.String? face,\n    $2.AvatarItem? avatar,\n    $core.int? level,\n    $core.int? isSeniorMember,\n    VipInfo? vip,\n    $core.String? jumpUri,\n    Relation? relation,\n    $core.String? nameSubText,\n    $3.NameRender? nameRender,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (name != null) result.name = name;\n    if (face != null) result.face = face;\n    if (avatar != null) result.avatar = avatar;\n    if (level != null) result.level = level;\n    if (isSeniorMember != null) result.isSeniorMember = isSeniorMember;\n    if (vip != null) result.vip = vip;\n    if (jumpUri != null) result.jumpUri = jumpUri;\n    if (relation != null) result.relation = relation;\n    if (nameSubText != null) result.nameSubText = nameSubText;\n    if (nameRender != null) result.nameRender = nameRender;\n    return result;\n  }\n\n  BasicUserInfoV2._();\n\n  factory BasicUserInfoV2.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BasicUserInfoV2.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BasicUserInfoV2',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'face')\n    ..aOM<$2.AvatarItem>(4, _omitFieldNames ? '' : 'avatar',\n        subBuilder: $2.AvatarItem.create)\n    ..aI(5, _omitFieldNames ? '' : 'level')\n    ..aI(6, _omitFieldNames ? '' : 'isSeniorMember')\n    ..aOM<VipInfo>(7, _omitFieldNames ? '' : 'vip', subBuilder: VipInfo.create)\n    ..aOS(8, _omitFieldNames ? '' : 'jumpUri')\n    ..aOM<Relation>(9, _omitFieldNames ? '' : 'relation',\n        subBuilder: Relation.create)\n    ..aOS(10, _omitFieldNames ? '' : 'nameSubText')\n    ..aOM<$3.NameRender>(11, _omitFieldNames ? '' : 'nameRender',\n        subBuilder: $3.NameRender.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BasicUserInfoV2 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BasicUserInfoV2 copyWith(void Function(BasicUserInfoV2) updates) =>\n      super.copyWith((message) => updates(message as BasicUserInfoV2))\n          as BasicUserInfoV2;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BasicUserInfoV2 create() => BasicUserInfoV2._();\n  @$core.override\n  BasicUserInfoV2 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BasicUserInfoV2 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<BasicUserInfoV2>(create);\n  static BasicUserInfoV2? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get face => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set face($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFace() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFace() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $2.AvatarItem get avatar => $_getN(3);\n  @$pb.TagNumber(4)\n  set avatar($2.AvatarItem value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasAvatar() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearAvatar() => $_clearField(4);\n  @$pb.TagNumber(4)\n  $2.AvatarItem ensureAvatar() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.int get level => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set level($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasLevel() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearLevel() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get isSeniorMember => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set isSeniorMember($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasIsSeniorMember() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearIsSeniorMember() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  VipInfo get vip => $_getN(6);\n  @$pb.TagNumber(7)\n  set vip(VipInfo value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasVip() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearVip() => $_clearField(7);\n  @$pb.TagNumber(7)\n  VipInfo ensureVip() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  $core.String get jumpUri => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set jumpUri($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasJumpUri() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearJumpUri() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  Relation get relation => $_getN(8);\n  @$pb.TagNumber(9)\n  set relation(Relation value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasRelation() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearRelation() => $_clearField(9);\n  @$pb.TagNumber(9)\n  Relation ensureRelation() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  $core.String get nameSubText => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set nameSubText($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasNameSubText() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearNameSubText() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $3.NameRender get nameRender => $_getN(10);\n  @$pb.TagNumber(11)\n  set nameRender($3.NameRender value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasNameRender() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearNameRender() => $_clearField(11);\n  @$pb.TagNumber(11)\n  $3.NameRender ensureNameRender() => $_ensure(10);\n}\n\nclass ButtonWithSubTitle extends $pb.GeneratedMessage {\n  factory ButtonWithSubTitle({\n    $core.String? btnTitle,\n    $core.String? btnSubTitle,\n    $core.String? jumpUri,\n  }) {\n    final result = create();\n    if (btnTitle != null) result.btnTitle = btnTitle;\n    if (btnSubTitle != null) result.btnSubTitle = btnSubTitle;\n    if (jumpUri != null) result.jumpUri = jumpUri;\n    return result;\n  }\n\n  ButtonWithSubTitle._();\n\n  factory ButtonWithSubTitle.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ButtonWithSubTitle.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ButtonWithSubTitle',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'btnTitle')\n    ..aOS(2, _omitFieldNames ? '' : 'btnSubTitle')\n    ..aOS(3, _omitFieldNames ? '' : 'jumpUri')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ButtonWithSubTitle clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ButtonWithSubTitle copyWith(void Function(ButtonWithSubTitle) updates) =>\n      super.copyWith((message) => updates(message as ButtonWithSubTitle))\n          as ButtonWithSubTitle;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ButtonWithSubTitle create() => ButtonWithSubTitle._();\n  @$core.override\n  ButtonWithSubTitle createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ButtonWithSubTitle getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ButtonWithSubTitle>(create);\n  static ButtonWithSubTitle? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get btnTitle => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set btnTitle($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBtnTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBtnTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get btnSubTitle => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set btnSubTitle($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBtnSubTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBtnSubTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get jumpUri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set jumpUri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasJumpUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearJumpUri() => $_clearField(3);\n}\n\nclass ButtonWithSubscribeParam extends $pb.GeneratedMessage {\n  factory ButtonWithSubscribeParam({\n    $core.String? btnText,\n    $core.String? btnIcon,\n    $core.String? subscribeParam,\n  }) {\n    final result = create();\n    if (btnText != null) result.btnText = btnText;\n    if (btnIcon != null) result.btnIcon = btnIcon;\n    if (subscribeParam != null) result.subscribeParam = subscribeParam;\n    return result;\n  }\n\n  ButtonWithSubscribeParam._();\n\n  factory ButtonWithSubscribeParam.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ButtonWithSubscribeParam.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ButtonWithSubscribeParam',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'btnText')\n    ..aOS(2, _omitFieldNames ? '' : 'btnIcon')\n    ..aOS(3, _omitFieldNames ? '' : 'subscribeParam')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ButtonWithSubscribeParam clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ButtonWithSubscribeParam copyWith(\n          void Function(ButtonWithSubscribeParam) updates) =>\n      super.copyWith((message) => updates(message as ButtonWithSubscribeParam))\n          as ButtonWithSubscribeParam;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ButtonWithSubscribeParam create() => ButtonWithSubscribeParam._();\n  @$core.override\n  ButtonWithSubscribeParam createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ButtonWithSubscribeParam getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ButtonWithSubscribeParam>(create);\n  static ButtonWithSubscribeParam? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get btnText => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set btnText($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBtnText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBtnText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get btnIcon => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set btnIcon($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBtnIcon() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBtnIcon() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get subscribeParam => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set subscribeParam($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSubscribeParam() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSubscribeParam() => $_clearField(3);\n}\n\nclass CampusBannerInfo extends $pb.GeneratedMessage {\n  factory CampusBannerInfo({\n    $core.String? image,\n    $core.String? jumpUrl,\n  }) {\n    final result = create();\n    if (image != null) result.image = image;\n    if (jumpUrl != null) result.jumpUrl = jumpUrl;\n    return result;\n  }\n\n  CampusBannerInfo._();\n\n  factory CampusBannerInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusBannerInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusBannerInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'image')\n    ..aOS(2, _omitFieldNames ? '' : 'jumpUrl')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusBannerInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusBannerInfo copyWith(void Function(CampusBannerInfo) updates) =>\n      super.copyWith((message) => updates(message as CampusBannerInfo))\n          as CampusBannerInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusBannerInfo create() => CampusBannerInfo._();\n  @$core.override\n  CampusBannerInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusBannerInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusBannerInfo>(create);\n  static CampusBannerInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get image => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set image($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasImage() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearImage() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get jumpUrl => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set jumpUrl($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasJumpUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearJumpUrl() => $_clearField(2);\n}\n\nclass CampusBillBoardReply extends $pb.GeneratedMessage {\n  factory CampusBillBoardReply({\n    $core.String? title,\n    $core.String? helpUri,\n    $core.String? campusName,\n    $fixnum.Int64? buildTime,\n    $core.String? versionCode,\n    $core.Iterable<OfficialItem>? list,\n    $core.String? shareUri,\n    $core.int? bindNotice,\n    $core.String? updateToast,\n    $fixnum.Int64? campusId,\n    CampusFeatureProgress? openProgress,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (helpUri != null) result.helpUri = helpUri;\n    if (campusName != null) result.campusName = campusName;\n    if (buildTime != null) result.buildTime = buildTime;\n    if (versionCode != null) result.versionCode = versionCode;\n    if (list != null) result.list.addAll(list);\n    if (shareUri != null) result.shareUri = shareUri;\n    if (bindNotice != null) result.bindNotice = bindNotice;\n    if (updateToast != null) result.updateToast = updateToast;\n    if (campusId != null) result.campusId = campusId;\n    if (openProgress != null) result.openProgress = openProgress;\n    return result;\n  }\n\n  CampusBillBoardReply._();\n\n  factory CampusBillBoardReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusBillBoardReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusBillBoardReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'helpUri')\n    ..aOS(3, _omitFieldNames ? '' : 'campusName')\n    ..aInt64(4, _omitFieldNames ? '' : 'buildTime')\n    ..aOS(5, _omitFieldNames ? '' : 'versionCode')\n    ..pPM<OfficialItem>(6, _omitFieldNames ? '' : 'list',\n        subBuilder: OfficialItem.create)\n    ..aOS(7, _omitFieldNames ? '' : 'shareUri')\n    ..aI(8, _omitFieldNames ? '' : 'bindNotice')\n    ..aOS(9, _omitFieldNames ? '' : 'updateToast')\n    ..aInt64(10, _omitFieldNames ? '' : 'campusId')\n    ..aOM<CampusFeatureProgress>(11, _omitFieldNames ? '' : 'openProgress',\n        subBuilder: CampusFeatureProgress.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusBillBoardReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusBillBoardReply copyWith(void Function(CampusBillBoardReply) updates) =>\n      super.copyWith((message) => updates(message as CampusBillBoardReply))\n          as CampusBillBoardReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusBillBoardReply create() => CampusBillBoardReply._();\n  @$core.override\n  CampusBillBoardReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusBillBoardReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusBillBoardReply>(create);\n  static CampusBillBoardReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get helpUri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set helpUri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHelpUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHelpUri() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get campusName => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set campusName($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCampusName() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCampusName() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get buildTime => $_getI64(3);\n  @$pb.TagNumber(4)\n  set buildTime($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBuildTime() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBuildTime() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get versionCode => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set versionCode($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasVersionCode() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearVersionCode() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $pb.PbList<OfficialItem> get list => $_getList(5);\n\n  @$pb.TagNumber(7)\n  $core.String get shareUri => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set shareUri($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasShareUri() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearShareUri() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get bindNotice => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set bindNotice($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasBindNotice() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearBindNotice() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get updateToast => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set updateToast($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasUpdateToast() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearUpdateToast() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $fixnum.Int64 get campusId => $_getI64(9);\n  @$pb.TagNumber(10)\n  set campusId($fixnum.Int64 value) => $_setInt64(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasCampusId() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearCampusId() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  CampusFeatureProgress get openProgress => $_getN(10);\n  @$pb.TagNumber(11)\n  set openProgress(CampusFeatureProgress value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasOpenProgress() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearOpenProgress() => $_clearField(11);\n  @$pb.TagNumber(11)\n  CampusFeatureProgress ensureOpenProgress() => $_ensure(10);\n}\n\nclass CampusBillBoardReq extends $pb.GeneratedMessage {\n  factory CampusBillBoardReq({\n    $fixnum.Int64? campusId,\n    $core.String? versionCode,\n    $1.PlayerArgs? playerArgs,\n    CampusReqFromType? fromType,\n  }) {\n    final result = create();\n    if (campusId != null) result.campusId = campusId;\n    if (versionCode != null) result.versionCode = versionCode;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    if (fromType != null) result.fromType = fromType;\n    return result;\n  }\n\n  CampusBillBoardReq._();\n\n  factory CampusBillBoardReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusBillBoardReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusBillBoardReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'campusId')\n    ..aOS(2, _omitFieldNames ? '' : 'versionCode')\n    ..aOM<$1.PlayerArgs>(3, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $1.PlayerArgs.create)\n    ..aE<CampusReqFromType>(4, _omitFieldNames ? '' : 'fromType',\n        enumValues: CampusReqFromType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusBillBoardReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusBillBoardReq copyWith(void Function(CampusBillBoardReq) updates) =>\n      super.copyWith((message) => updates(message as CampusBillBoardReq))\n          as CampusBillBoardReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusBillBoardReq create() => CampusBillBoardReq._();\n  @$core.override\n  CampusBillBoardReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusBillBoardReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusBillBoardReq>(create);\n  static CampusBillBoardReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get campusId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set campusId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCampusId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCampusId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get versionCode => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set versionCode($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasVersionCode() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearVersionCode() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $1.PlayerArgs get playerArgs => $_getN(2);\n  @$pb.TagNumber(3)\n  set playerArgs($1.PlayerArgs value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPlayerArgs() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPlayerArgs() => $_clearField(3);\n  @$pb.TagNumber(3)\n  $1.PlayerArgs ensurePlayerArgs() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  CampusReqFromType get fromType => $_getN(3);\n  @$pb.TagNumber(4)\n  set fromType(CampusReqFromType value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFromType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFromType() => $_clearField(4);\n}\n\nclass CampusBillboardInternalReq extends $pb.GeneratedMessage {\n  factory CampusBillboardInternalReq({\n    $fixnum.Int64? mid,\n    $fixnum.Int64? campusId,\n    $core.String? versionCode,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (campusId != null) result.campusId = campusId;\n    if (versionCode != null) result.versionCode = versionCode;\n    return result;\n  }\n\n  CampusBillboardInternalReq._();\n\n  factory CampusBillboardInternalReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusBillboardInternalReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusBillboardInternalReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aInt64(2, _omitFieldNames ? '' : 'campusId')\n    ..aOS(3, _omitFieldNames ? '' : 'versionCode')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusBillboardInternalReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusBillboardInternalReq copyWith(\n          void Function(CampusBillboardInternalReq) updates) =>\n      super.copyWith(\n              (message) => updates(message as CampusBillboardInternalReq))\n          as CampusBillboardInternalReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusBillboardInternalReq create() => CampusBillboardInternalReq._();\n  @$core.override\n  CampusBillboardInternalReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusBillboardInternalReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusBillboardInternalReq>(create);\n  static CampusBillboardInternalReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get campusId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set campusId($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCampusId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCampusId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get versionCode => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set versionCode($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasVersionCode() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearVersionCode() => $_clearField(3);\n}\n\nclass CampusEntryTabReq extends $pb.GeneratedMessage {\n  factory CampusEntryTabReq({\n    $fixnum.Int64? campusId,\n  }) {\n    final result = create();\n    if (campusId != null) result.campusId = campusId;\n    return result;\n  }\n\n  CampusEntryTabReq._();\n\n  factory CampusEntryTabReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusEntryTabReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusEntryTabReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'campusId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusEntryTabReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusEntryTabReq copyWith(void Function(CampusEntryTabReq) updates) =>\n      super.copyWith((message) => updates(message as CampusEntryTabReq))\n          as CampusEntryTabReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusEntryTabReq create() => CampusEntryTabReq._();\n  @$core.override\n  CampusEntryTabReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusEntryTabReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusEntryTabReq>(create);\n  static CampusEntryTabReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get campusId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set campusId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCampusId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCampusId() => $_clearField(1);\n}\n\nclass CampusEntryTabResp extends $pb.GeneratedMessage {\n  factory CampusEntryTabResp({\n    CampusEntryType? entryType,\n  }) {\n    final result = create();\n    if (entryType != null) result.entryType = entryType;\n    return result;\n  }\n\n  CampusEntryTabResp._();\n\n  factory CampusEntryTabResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusEntryTabResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusEntryTabResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aE<CampusEntryType>(1, _omitFieldNames ? '' : 'entryType',\n        enumValues: CampusEntryType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusEntryTabResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusEntryTabResp copyWith(void Function(CampusEntryTabResp) updates) =>\n      super.copyWith((message) => updates(message as CampusEntryTabResp))\n          as CampusEntryTabResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusEntryTabResp create() => CampusEntryTabResp._();\n  @$core.override\n  CampusEntryTabResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusEntryTabResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusEntryTabResp>(create);\n  static CampusEntryTabResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  CampusEntryType get entryType => $_getN(0);\n  @$pb.TagNumber(1)\n  set entryType(CampusEntryType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasEntryType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearEntryType() => $_clearField(1);\n}\n\nclass CampusFeatureProgress extends $pb.GeneratedMessage {\n  factory CampusFeatureProgress({\n    $fixnum.Int64? progressFull,\n    $fixnum.Int64? progressAchieved,\n    $core.String? descTitle,\n    $core.String? desc1,\n    CampusLabel? btn,\n  }) {\n    final result = create();\n    if (progressFull != null) result.progressFull = progressFull;\n    if (progressAchieved != null) result.progressAchieved = progressAchieved;\n    if (descTitle != null) result.descTitle = descTitle;\n    if (desc1 != null) result.desc1 = desc1;\n    if (btn != null) result.btn = btn;\n    return result;\n  }\n\n  CampusFeatureProgress._();\n\n  factory CampusFeatureProgress.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusFeatureProgress.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusFeatureProgress',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'progressFull')\n    ..aInt64(2, _omitFieldNames ? '' : 'progressAchieved')\n    ..aOS(3, _omitFieldNames ? '' : 'descTitle')\n    ..aOS(4, _omitFieldNames ? '' : 'desc1')\n    ..aOM<CampusLabel>(5, _omitFieldNames ? '' : 'btn',\n        subBuilder: CampusLabel.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusFeatureProgress clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusFeatureProgress copyWith(\n          void Function(CampusFeatureProgress) updates) =>\n      super.copyWith((message) => updates(message as CampusFeatureProgress))\n          as CampusFeatureProgress;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusFeatureProgress create() => CampusFeatureProgress._();\n  @$core.override\n  CampusFeatureProgress createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusFeatureProgress getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusFeatureProgress>(create);\n  static CampusFeatureProgress? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get progressFull => $_getI64(0);\n  @$pb.TagNumber(1)\n  set progressFull($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasProgressFull() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearProgressFull() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get progressAchieved => $_getI64(1);\n  @$pb.TagNumber(2)\n  set progressAchieved($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasProgressAchieved() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearProgressAchieved() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get descTitle => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set descTitle($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDescTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDescTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get desc1 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set desc1($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDesc1() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDesc1() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  CampusLabel get btn => $_getN(4);\n  @$pb.TagNumber(5)\n  set btn(CampusLabel value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBtn() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBtn() => $_clearField(5);\n  @$pb.TagNumber(5)\n  CampusLabel ensureBtn() => $_ensure(4);\n}\n\nclass CampusFeedbackInfo extends $pb.GeneratedMessage {\n  factory CampusFeedbackInfo({\n    $core.int? bizType,\n    $fixnum.Int64? bizId,\n    $fixnum.Int64? campusId,\n    $core.String? reason,\n  }) {\n    final result = create();\n    if (bizType != null) result.bizType = bizType;\n    if (bizId != null) result.bizId = bizId;\n    if (campusId != null) result.campusId = campusId;\n    if (reason != null) result.reason = reason;\n    return result;\n  }\n\n  CampusFeedbackInfo._();\n\n  factory CampusFeedbackInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusFeedbackInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusFeedbackInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'bizType')\n    ..aInt64(2, _omitFieldNames ? '' : 'bizId')\n    ..aInt64(3, _omitFieldNames ? '' : 'campusId')\n    ..aOS(4, _omitFieldNames ? '' : 'reason')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusFeedbackInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusFeedbackInfo copyWith(void Function(CampusFeedbackInfo) updates) =>\n      super.copyWith((message) => updates(message as CampusFeedbackInfo))\n          as CampusFeedbackInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusFeedbackInfo create() => CampusFeedbackInfo._();\n  @$core.override\n  CampusFeedbackInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusFeedbackInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusFeedbackInfo>(create);\n  static CampusFeedbackInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get bizType => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set bizType($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBizType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBizType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get bizId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set bizId($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBizId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBizId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get campusId => $_getI64(2);\n  @$pb.TagNumber(3)\n  set campusId($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCampusId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCampusId() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get reason => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set reason($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasReason() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearReason() => $_clearField(4);\n}\n\nclass CampusFeedbackReply extends $pb.GeneratedMessage {\n  factory CampusFeedbackReply({\n    $core.String? message,\n  }) {\n    final result = create();\n    if (message != null) result.message = message;\n    return result;\n  }\n\n  CampusFeedbackReply._();\n\n  factory CampusFeedbackReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusFeedbackReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusFeedbackReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'message')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusFeedbackReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusFeedbackReply copyWith(void Function(CampusFeedbackReply) updates) =>\n      super.copyWith((message) => updates(message as CampusFeedbackReply))\n          as CampusFeedbackReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusFeedbackReply create() => CampusFeedbackReply._();\n  @$core.override\n  CampusFeedbackReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusFeedbackReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusFeedbackReply>(create);\n  static CampusFeedbackReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get message => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set message($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMessage() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMessage() => $_clearField(1);\n}\n\nclass CampusFeedbackReq extends $pb.GeneratedMessage {\n  factory CampusFeedbackReq({\n    $core.Iterable<CampusFeedbackInfo>? infos,\n    CampusReqFromType? from,\n    CampusReqFromType? fromType,\n  }) {\n    final result = create();\n    if (infos != null) result.infos.addAll(infos);\n    if (from != null) result.from = from;\n    if (fromType != null) result.fromType = fromType;\n    return result;\n  }\n\n  CampusFeedbackReq._();\n\n  factory CampusFeedbackReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusFeedbackReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusFeedbackReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<CampusFeedbackInfo>(1, _omitFieldNames ? '' : 'infos',\n        subBuilder: CampusFeedbackInfo.create)\n    ..aE<CampusReqFromType>(2, _omitFieldNames ? '' : 'from',\n        enumValues: CampusReqFromType.values)\n    ..aE<CampusReqFromType>(3, _omitFieldNames ? '' : 'fromType',\n        enumValues: CampusReqFromType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusFeedbackReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusFeedbackReq copyWith(void Function(CampusFeedbackReq) updates) =>\n      super.copyWith((message) => updates(message as CampusFeedbackReq))\n          as CampusFeedbackReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusFeedbackReq create() => CampusFeedbackReq._();\n  @$core.override\n  CampusFeedbackReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusFeedbackReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusFeedbackReq>(create);\n  static CampusFeedbackReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<CampusFeedbackInfo> get infos => $_getList(0);\n\n  @$pb.TagNumber(2)\n  CampusReqFromType get from => $_getN(1);\n  @$pb.TagNumber(2)\n  set from(CampusReqFromType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFrom() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFrom() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  CampusReqFromType get fromType => $_getN(2);\n  @$pb.TagNumber(3)\n  set fromType(CampusReqFromType value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFromType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFromType() => $_clearField(3);\n}\n\nclass CampusHomePagesReply extends $pb.GeneratedMessage {\n  factory CampusHomePagesReply({\n    CampusRcmdTop? top,\n    CampusTop? campusTop,\n    $core.int? pageType,\n  }) {\n    final result = create();\n    if (top != null) result.top = top;\n    if (campusTop != null) result.campusTop = campusTop;\n    if (pageType != null) result.pageType = pageType;\n    return result;\n  }\n\n  CampusHomePagesReply._();\n\n  factory CampusHomePagesReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusHomePagesReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusHomePagesReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<CampusRcmdTop>(1, _omitFieldNames ? '' : 'top',\n        subBuilder: CampusRcmdTop.create)\n    ..aOM<CampusTop>(2, _omitFieldNames ? '' : 'campusTop',\n        subBuilder: CampusTop.create)\n    ..aI(3, _omitFieldNames ? '' : 'pageType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusHomePagesReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusHomePagesReply copyWith(void Function(CampusHomePagesReply) updates) =>\n      super.copyWith((message) => updates(message as CampusHomePagesReply))\n          as CampusHomePagesReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusHomePagesReply create() => CampusHomePagesReply._();\n  @$core.override\n  CampusHomePagesReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusHomePagesReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusHomePagesReply>(create);\n  static CampusHomePagesReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  CampusRcmdTop get top => $_getN(0);\n  @$pb.TagNumber(1)\n  set top(CampusRcmdTop value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTop() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTop() => $_clearField(1);\n  @$pb.TagNumber(1)\n  CampusRcmdTop ensureTop() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  CampusTop get campusTop => $_getN(1);\n  @$pb.TagNumber(2)\n  set campusTop(CampusTop value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCampusTop() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCampusTop() => $_clearField(2);\n  @$pb.TagNumber(2)\n  CampusTop ensureCampusTop() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.int get pageType => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set pageType($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPageType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPageType() => $_clearField(3);\n}\n\nclass CampusHomePagesReq extends $pb.GeneratedMessage {\n  factory CampusHomePagesReq({\n    $fixnum.Int64? campusId,\n    $core.String? campusName,\n    $core.double? lat,\n    $core.double? lng,\n    $1.PlayerArgs? playerArgs,\n    CampusHomePageType? pageType,\n  }) {\n    final result = create();\n    if (campusId != null) result.campusId = campusId;\n    if (campusName != null) result.campusName = campusName;\n    if (lat != null) result.lat = lat;\n    if (lng != null) result.lng = lng;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    if (pageType != null) result.pageType = pageType;\n    return result;\n  }\n\n  CampusHomePagesReq._();\n\n  factory CampusHomePagesReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusHomePagesReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusHomePagesReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'campusId')\n    ..aOS(2, _omitFieldNames ? '' : 'campusName')\n    ..aD(3, _omitFieldNames ? '' : 'lat')\n    ..aD(4, _omitFieldNames ? '' : 'lng')\n    ..aOM<$1.PlayerArgs>(5, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $1.PlayerArgs.create)\n    ..aE<CampusHomePageType>(6, _omitFieldNames ? '' : 'pageType',\n        enumValues: CampusHomePageType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusHomePagesReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusHomePagesReq copyWith(void Function(CampusHomePagesReq) updates) =>\n      super.copyWith((message) => updates(message as CampusHomePagesReq))\n          as CampusHomePagesReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusHomePagesReq create() => CampusHomePagesReq._();\n  @$core.override\n  CampusHomePagesReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusHomePagesReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusHomePagesReq>(create);\n  static CampusHomePagesReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get campusId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set campusId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCampusId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCampusId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get campusName => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set campusName($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCampusName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCampusName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.double get lat => $_getN(2);\n  @$pb.TagNumber(3)\n  set lat($core.double value) => $_setDouble(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLat() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLat() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.double get lng => $_getN(3);\n  @$pb.TagNumber(4)\n  set lng($core.double value) => $_setDouble(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLng() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLng() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $1.PlayerArgs get playerArgs => $_getN(4);\n  @$pb.TagNumber(5)\n  set playerArgs($1.PlayerArgs value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPlayerArgs() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPlayerArgs() => $_clearField(5);\n  @$pb.TagNumber(5)\n  $1.PlayerArgs ensurePlayerArgs() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  CampusHomePageType get pageType => $_getN(5);\n  @$pb.TagNumber(6)\n  set pageType(CampusHomePageType value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasPageType() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearPageType() => $_clearField(6);\n}\n\nclass CampusHomeRcmdTopic extends $pb.GeneratedMessage {\n  factory CampusHomeRcmdTopic({\n    ModuleTitle? title,\n    $core.Iterable<TopicItem>? topic,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (topic != null) result.topic.addAll(topic);\n    return result;\n  }\n\n  CampusHomeRcmdTopic._();\n\n  factory CampusHomeRcmdTopic.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusHomeRcmdTopic.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusHomeRcmdTopic',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<ModuleTitle>(1, _omitFieldNames ? '' : 'title',\n        subBuilder: ModuleTitle.create)\n    ..pPM<TopicItem>(2, _omitFieldNames ? '' : 'topic',\n        subBuilder: TopicItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusHomeRcmdTopic clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusHomeRcmdTopic copyWith(void Function(CampusHomeRcmdTopic) updates) =>\n      super.copyWith((message) => updates(message as CampusHomeRcmdTopic))\n          as CampusHomeRcmdTopic;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusHomeRcmdTopic create() => CampusHomeRcmdTopic._();\n  @$core.override\n  CampusHomeRcmdTopic createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusHomeRcmdTopic getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusHomeRcmdTopic>(create);\n  static CampusHomeRcmdTopic? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  ModuleTitle get title => $_getN(0);\n  @$pb.TagNumber(1)\n  set title(ModuleTitle value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n  @$pb.TagNumber(1)\n  ModuleTitle ensureTitle() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<TopicItem> get topic => $_getList(1);\n}\n\nclass CampusInfo extends $pb.GeneratedMessage {\n  factory CampusInfo({\n    $fixnum.Int64? campusId,\n    $core.String? campusName,\n    $core.String? desc,\n    $fixnum.Int64? online,\n    $core.String? url,\n  }) {\n    final result = create();\n    if (campusId != null) result.campusId = campusId;\n    if (campusName != null) result.campusName = campusName;\n    if (desc != null) result.desc = desc;\n    if (online != null) result.online = online;\n    if (url != null) result.url = url;\n    return result;\n  }\n\n  CampusInfo._();\n\n  factory CampusInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'campusId')\n    ..aOS(2, _omitFieldNames ? '' : 'campusName')\n    ..aOS(3, _omitFieldNames ? '' : 'desc')\n    ..aInt64(4, _omitFieldNames ? '' : 'online')\n    ..aOS(5, _omitFieldNames ? '' : 'url')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusInfo copyWith(void Function(CampusInfo) updates) =>\n      super.copyWith((message) => updates(message as CampusInfo)) as CampusInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusInfo create() => CampusInfo._();\n  @$core.override\n  CampusInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusInfo>(create);\n  static CampusInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get campusId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set campusId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCampusId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCampusId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get campusName => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set campusName($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCampusName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCampusName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get desc => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set desc($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDesc() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDesc() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get online => $_getI64(3);\n  @$pb.TagNumber(4)\n  set online($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasOnline() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearOnline() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get url => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set url($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasUrl() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearUrl() => $_clearField(5);\n}\n\nclass CampusLabel extends $pb.GeneratedMessage {\n  factory CampusLabel({\n    $core.String? text,\n    $core.String? url,\n    $core.String? desc,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (url != null) result.url = url;\n    if (desc != null) result.desc = desc;\n    return result;\n  }\n\n  CampusLabel._();\n\n  factory CampusLabel.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusLabel.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusLabel',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aOS(2, _omitFieldNames ? '' : 'url')\n    ..aOS(3, _omitFieldNames ? '' : 'desc')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusLabel clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusLabel copyWith(void Function(CampusLabel) updates) =>\n      super.copyWith((message) => updates(message as CampusLabel))\n          as CampusLabel;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusLabel create() => CampusLabel._();\n  @$core.override\n  CampusLabel createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusLabel getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusLabel>(create);\n  static CampusLabel? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get url => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set url($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUrl() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get desc => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set desc($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDesc() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDesc() => $_clearField(3);\n}\n\nclass CampusMateLikeListReply extends $pb.GeneratedMessage {\n  factory CampusMateLikeListReply({\n    $core.Iterable<ModuleAuthor>? list,\n  }) {\n    final result = create();\n    if (list != null) result.list.addAll(list);\n    return result;\n  }\n\n  CampusMateLikeListReply._();\n\n  factory CampusMateLikeListReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusMateLikeListReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusMateLikeListReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<ModuleAuthor>(1, _omitFieldNames ? '' : 'list',\n        subBuilder: ModuleAuthor.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusMateLikeListReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusMateLikeListReply copyWith(\n          void Function(CampusMateLikeListReply) updates) =>\n      super.copyWith((message) => updates(message as CampusMateLikeListReply))\n          as CampusMateLikeListReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusMateLikeListReply create() => CampusMateLikeListReply._();\n  @$core.override\n  CampusMateLikeListReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusMateLikeListReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusMateLikeListReply>(create);\n  static CampusMateLikeListReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<ModuleAuthor> get list => $_getList(0);\n}\n\nclass CampusMateLikeListReq extends $pb.GeneratedMessage {\n  factory CampusMateLikeListReq({\n    $fixnum.Int64? dynamicId,\n    CampusReqFromType? fromType,\n  }) {\n    final result = create();\n    if (dynamicId != null) result.dynamicId = dynamicId;\n    if (fromType != null) result.fromType = fromType;\n    return result;\n  }\n\n  CampusMateLikeListReq._();\n\n  factory CampusMateLikeListReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusMateLikeListReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusMateLikeListReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'dynamicId')\n    ..aE<CampusReqFromType>(2, _omitFieldNames ? '' : 'fromType',\n        enumValues: CampusReqFromType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusMateLikeListReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusMateLikeListReq copyWith(\n          void Function(CampusMateLikeListReq) updates) =>\n      super.copyWith((message) => updates(message as CampusMateLikeListReq))\n          as CampusMateLikeListReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusMateLikeListReq create() => CampusMateLikeListReq._();\n  @$core.override\n  CampusMateLikeListReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusMateLikeListReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusMateLikeListReq>(create);\n  static CampusMateLikeListReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get dynamicId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set dynamicId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDynamicId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDynamicId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  CampusReqFromType get fromType => $_getN(1);\n  @$pb.TagNumber(2)\n  set fromType(CampusReqFromType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFromType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFromType() => $_clearField(2);\n}\n\nclass CampusMngBadge extends $pb.GeneratedMessage {\n  factory CampusMngBadge({\n    $core.String? title,\n    $core.String? badgeUrl,\n    $core.String? uploadHintMsg,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (badgeUrl != null) result.badgeUrl = badgeUrl;\n    if (uploadHintMsg != null) result.uploadHintMsg = uploadHintMsg;\n    return result;\n  }\n\n  CampusMngBadge._();\n\n  factory CampusMngBadge.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusMngBadge.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusMngBadge',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'badgeUrl')\n    ..aOS(3, _omitFieldNames ? '' : 'uploadHintMsg')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusMngBadge clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusMngBadge copyWith(void Function(CampusMngBadge) updates) =>\n      super.copyWith((message) => updates(message as CampusMngBadge))\n          as CampusMngBadge;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusMngBadge create() => CampusMngBadge._();\n  @$core.override\n  CampusMngBadge createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusMngBadge getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusMngBadge>(create);\n  static CampusMngBadge? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get badgeUrl => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set badgeUrl($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBadgeUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBadgeUrl() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get uploadHintMsg => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uploadHintMsg($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUploadHintMsg() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUploadHintMsg() => $_clearField(3);\n}\n\nclass CampusMngBasicInfo extends $pb.GeneratedMessage {\n  factory CampusMngBasicInfo({\n    $fixnum.Int64? campusId,\n    $core.String? campusName,\n    $core.String? hintMsg,\n  }) {\n    final result = create();\n    if (campusId != null) result.campusId = campusId;\n    if (campusName != null) result.campusName = campusName;\n    if (hintMsg != null) result.hintMsg = hintMsg;\n    return result;\n  }\n\n  CampusMngBasicInfo._();\n\n  factory CampusMngBasicInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusMngBasicInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusMngBasicInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'campusId')\n    ..aOS(2, _omitFieldNames ? '' : 'campusName')\n    ..aOS(3, _omitFieldNames ? '' : 'hintMsg')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusMngBasicInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusMngBasicInfo copyWith(void Function(CampusMngBasicInfo) updates) =>\n      super.copyWith((message) => updates(message as CampusMngBasicInfo))\n          as CampusMngBasicInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusMngBasicInfo create() => CampusMngBasicInfo._();\n  @$core.override\n  CampusMngBasicInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusMngBasicInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusMngBasicInfo>(create);\n  static CampusMngBasicInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get campusId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set campusId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCampusId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCampusId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get campusName => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set campusName($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCampusName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCampusName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get hintMsg => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set hintMsg($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasHintMsg() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearHintMsg() => $_clearField(3);\n}\n\nclass CampusMngDetailReply extends $pb.GeneratedMessage {\n  factory CampusMngDetailReply({\n    $core.Iterable<CampusMngItem>? items,\n    $core.String? topHintBarMsg,\n    $core.String? bottomSubmitHintMsg,\n    $fixnum.Int64? campusId,\n    $core.String? campusName,\n  }) {\n    final result = create();\n    if (items != null) result.items.addAll(items);\n    if (topHintBarMsg != null) result.topHintBarMsg = topHintBarMsg;\n    if (bottomSubmitHintMsg != null)\n      result.bottomSubmitHintMsg = bottomSubmitHintMsg;\n    if (campusId != null) result.campusId = campusId;\n    if (campusName != null) result.campusName = campusName;\n    return result;\n  }\n\n  CampusMngDetailReply._();\n\n  factory CampusMngDetailReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusMngDetailReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusMngDetailReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<CampusMngItem>(1, _omitFieldNames ? '' : 'items',\n        subBuilder: CampusMngItem.create)\n    ..aOS(2, _omitFieldNames ? '' : 'topHintBarMsg')\n    ..aOS(3, _omitFieldNames ? '' : 'bottomSubmitHintMsg')\n    ..aInt64(4, _omitFieldNames ? '' : 'campusId')\n    ..aOS(5, _omitFieldNames ? '' : 'campusName')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusMngDetailReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusMngDetailReply copyWith(void Function(CampusMngDetailReply) updates) =>\n      super.copyWith((message) => updates(message as CampusMngDetailReply))\n          as CampusMngDetailReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusMngDetailReply create() => CampusMngDetailReply._();\n  @$core.override\n  CampusMngDetailReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusMngDetailReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusMngDetailReply>(create);\n  static CampusMngDetailReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<CampusMngItem> get items => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.String get topHintBarMsg => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set topHintBarMsg($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTopHintBarMsg() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTopHintBarMsg() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get bottomSubmitHintMsg => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set bottomSubmitHintMsg($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBottomSubmitHintMsg() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBottomSubmitHintMsg() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get campusId => $_getI64(3);\n  @$pb.TagNumber(4)\n  set campusId($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCampusId() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCampusId() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get campusName => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set campusName($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCampusName() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCampusName() => $_clearField(5);\n}\n\nclass CampusMngDetailReq extends $pb.GeneratedMessage {\n  factory CampusMngDetailReq({\n    $fixnum.Int64? campusId,\n  }) {\n    final result = create();\n    if (campusId != null) result.campusId = campusId;\n    return result;\n  }\n\n  CampusMngDetailReq._();\n\n  factory CampusMngDetailReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusMngDetailReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusMngDetailReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'campusId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusMngDetailReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusMngDetailReq copyWith(void Function(CampusMngDetailReq) updates) =>\n      super.copyWith((message) => updates(message as CampusMngDetailReq))\n          as CampusMngDetailReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusMngDetailReq create() => CampusMngDetailReq._();\n  @$core.override\n  CampusMngDetailReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusMngDetailReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusMngDetailReq>(create);\n  static CampusMngDetailReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get campusId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set campusId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCampusId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCampusId() => $_clearField(1);\n}\n\nenum CampusMngItem_Item { basicInfo, badge, slogan, quiz, notSet }\n\nclass CampusMngItem extends $pb.GeneratedMessage {\n  factory CampusMngItem({\n    CampusMngAuditStatus? auditStatus,\n    $core.String? auditMessage,\n    CampusMngItemType? itemType,\n    $core.String? mngItemId,\n    $core.bool? isDel,\n    CampusMngBasicInfo? basicInfo,\n    CampusMngBadge? badge,\n    CampusMngSlogan? slogan,\n    CampusMngQuiz? quiz,\n  }) {\n    final result = create();\n    if (auditStatus != null) result.auditStatus = auditStatus;\n    if (auditMessage != null) result.auditMessage = auditMessage;\n    if (itemType != null) result.itemType = itemType;\n    if (mngItemId != null) result.mngItemId = mngItemId;\n    if (isDel != null) result.isDel = isDel;\n    if (basicInfo != null) result.basicInfo = basicInfo;\n    if (badge != null) result.badge = badge;\n    if (slogan != null) result.slogan = slogan;\n    if (quiz != null) result.quiz = quiz;\n    return result;\n  }\n\n  CampusMngItem._();\n\n  factory CampusMngItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusMngItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, CampusMngItem_Item>\n      _CampusMngItem_ItemByTag = {\n    6: CampusMngItem_Item.basicInfo,\n    7: CampusMngItem_Item.badge,\n    8: CampusMngItem_Item.slogan,\n    9: CampusMngItem_Item.quiz,\n    0: CampusMngItem_Item.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusMngItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..oo(0, [6, 7, 8, 9])\n    ..aE<CampusMngAuditStatus>(1, _omitFieldNames ? '' : 'auditStatus',\n        enumValues: CampusMngAuditStatus.values)\n    ..aOS(2, _omitFieldNames ? '' : 'auditMessage')\n    ..aE<CampusMngItemType>(3, _omitFieldNames ? '' : 'itemType',\n        enumValues: CampusMngItemType.values)\n    ..aOS(4, _omitFieldNames ? '' : 'mngItemId')\n    ..aOB(5, _omitFieldNames ? '' : 'isDel')\n    ..aOM<CampusMngBasicInfo>(6, _omitFieldNames ? '' : 'basicInfo',\n        subBuilder: CampusMngBasicInfo.create)\n    ..aOM<CampusMngBadge>(7, _omitFieldNames ? '' : 'badge',\n        subBuilder: CampusMngBadge.create)\n    ..aOM<CampusMngSlogan>(8, _omitFieldNames ? '' : 'slogan',\n        subBuilder: CampusMngSlogan.create)\n    ..aOM<CampusMngQuiz>(9, _omitFieldNames ? '' : 'quiz',\n        subBuilder: CampusMngQuiz.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusMngItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusMngItem copyWith(void Function(CampusMngItem) updates) =>\n      super.copyWith((message) => updates(message as CampusMngItem))\n          as CampusMngItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusMngItem create() => CampusMngItem._();\n  @$core.override\n  CampusMngItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusMngItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusMngItem>(create);\n  static CampusMngItem? _defaultInstance;\n\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(7)\n  @$pb.TagNumber(8)\n  @$pb.TagNumber(9)\n  CampusMngItem_Item whichItem() => _CampusMngItem_ItemByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(7)\n  @$pb.TagNumber(8)\n  @$pb.TagNumber(9)\n  void clearItem() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  CampusMngAuditStatus get auditStatus => $_getN(0);\n  @$pb.TagNumber(1)\n  set auditStatus(CampusMngAuditStatus value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAuditStatus() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAuditStatus() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get auditMessage => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set auditMessage($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAuditMessage() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAuditMessage() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  CampusMngItemType get itemType => $_getN(2);\n  @$pb.TagNumber(3)\n  set itemType(CampusMngItemType value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasItemType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearItemType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get mngItemId => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set mngItemId($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasMngItemId() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearMngItemId() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.bool get isDel => $_getBF(4);\n  @$pb.TagNumber(5)\n  set isDel($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasIsDel() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearIsDel() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  CampusMngBasicInfo get basicInfo => $_getN(5);\n  @$pb.TagNumber(6)\n  set basicInfo(CampusMngBasicInfo value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasBasicInfo() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearBasicInfo() => $_clearField(6);\n  @$pb.TagNumber(6)\n  CampusMngBasicInfo ensureBasicInfo() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  CampusMngBadge get badge => $_getN(6);\n  @$pb.TagNumber(7)\n  set badge(CampusMngBadge value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBadge() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBadge() => $_clearField(7);\n  @$pb.TagNumber(7)\n  CampusMngBadge ensureBadge() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  CampusMngSlogan get slogan => $_getN(7);\n  @$pb.TagNumber(8)\n  set slogan(CampusMngSlogan value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasSlogan() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearSlogan() => $_clearField(8);\n  @$pb.TagNumber(8)\n  CampusMngSlogan ensureSlogan() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  CampusMngQuiz get quiz => $_getN(8);\n  @$pb.TagNumber(9)\n  set quiz(CampusMngQuiz value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasQuiz() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearQuiz() => $_clearField(9);\n  @$pb.TagNumber(9)\n  CampusMngQuiz ensureQuiz() => $_ensure(8);\n}\n\nclass CampusMngQuiz extends $pb.GeneratedMessage {\n  factory CampusMngQuiz({\n    $core.String? title,\n    CampusLabel? moreLabel,\n    $core.String? addLabel,\n    $core.String? submitLabel,\n    $fixnum.Int64? quizCount,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (moreLabel != null) result.moreLabel = moreLabel;\n    if (addLabel != null) result.addLabel = addLabel;\n    if (submitLabel != null) result.submitLabel = submitLabel;\n    if (quizCount != null) result.quizCount = quizCount;\n    return result;\n  }\n\n  CampusMngQuiz._();\n\n  factory CampusMngQuiz.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusMngQuiz.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusMngQuiz',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOM<CampusLabel>(2, _omitFieldNames ? '' : 'moreLabel',\n        subBuilder: CampusLabel.create)\n    ..aOS(3, _omitFieldNames ? '' : 'addLabel')\n    ..aOS(4, _omitFieldNames ? '' : 'submitLabel')\n    ..aInt64(5, _omitFieldNames ? '' : 'quizCount')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusMngQuiz clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusMngQuiz copyWith(void Function(CampusMngQuiz) updates) =>\n      super.copyWith((message) => updates(message as CampusMngQuiz))\n          as CampusMngQuiz;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusMngQuiz create() => CampusMngQuiz._();\n  @$core.override\n  CampusMngQuiz createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusMngQuiz getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusMngQuiz>(create);\n  static CampusMngQuiz? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  CampusLabel get moreLabel => $_getN(1);\n  @$pb.TagNumber(2)\n  set moreLabel(CampusLabel value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMoreLabel() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMoreLabel() => $_clearField(2);\n  @$pb.TagNumber(2)\n  CampusLabel ensureMoreLabel() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.String get addLabel => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set addLabel($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAddLabel() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAddLabel() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get submitLabel => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set submitLabel($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSubmitLabel() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSubmitLabel() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get quizCount => $_getI64(4);\n  @$pb.TagNumber(5)\n  set quizCount($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasQuizCount() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearQuizCount() => $_clearField(5);\n}\n\nclass CampusMngQuizDetail extends $pb.GeneratedMessage {\n  factory CampusMngQuizDetail({\n    $fixnum.Int64? quizId,\n    $core.String? question,\n    $core.String? correctAnswer,\n    $core.Iterable<$core.String>? wrongAnswerList,\n    CampusMngAuditStatus? auditStatus,\n    $core.String? auditMessage,\n  }) {\n    final result = create();\n    if (quizId != null) result.quizId = quizId;\n    if (question != null) result.question = question;\n    if (correctAnswer != null) result.correctAnswer = correctAnswer;\n    if (wrongAnswerList != null) result.wrongAnswerList.addAll(wrongAnswerList);\n    if (auditStatus != null) result.auditStatus = auditStatus;\n    if (auditMessage != null) result.auditMessage = auditMessage;\n    return result;\n  }\n\n  CampusMngQuizDetail._();\n\n  factory CampusMngQuizDetail.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusMngQuizDetail.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusMngQuizDetail',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'quizId')\n    ..aOS(2, _omitFieldNames ? '' : 'question')\n    ..aOS(3, _omitFieldNames ? '' : 'correctAnswer')\n    ..pPS(4, _omitFieldNames ? '' : 'wrongAnswerList')\n    ..aE<CampusMngAuditStatus>(5, _omitFieldNames ? '' : 'auditStatus',\n        enumValues: CampusMngAuditStatus.values)\n    ..aOS(6, _omitFieldNames ? '' : 'auditMessage')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusMngQuizDetail clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusMngQuizDetail copyWith(void Function(CampusMngQuizDetail) updates) =>\n      super.copyWith((message) => updates(message as CampusMngQuizDetail))\n          as CampusMngQuizDetail;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusMngQuizDetail create() => CampusMngQuizDetail._();\n  @$core.override\n  CampusMngQuizDetail createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusMngQuizDetail getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusMngQuizDetail>(create);\n  static CampusMngQuizDetail? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get quizId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set quizId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasQuizId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearQuizId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get question => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set question($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasQuestion() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearQuestion() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get correctAnswer => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set correctAnswer($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCorrectAnswer() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCorrectAnswer() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<$core.String> get wrongAnswerList => $_getList(3);\n\n  @$pb.TagNumber(5)\n  CampusMngAuditStatus get auditStatus => $_getN(4);\n  @$pb.TagNumber(5)\n  set auditStatus(CampusMngAuditStatus value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasAuditStatus() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearAuditStatus() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get auditMessage => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set auditMessage($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasAuditMessage() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearAuditMessage() => $_clearField(6);\n}\n\nclass CampusMngQuizOperateReply extends $pb.GeneratedMessage {\n  factory CampusMngQuizOperateReply({\n    $core.String? toast,\n    $core.Iterable<CampusMngQuizDetail>? quiz,\n    $fixnum.Int64? quizTotal,\n  }) {\n    final result = create();\n    if (toast != null) result.toast = toast;\n    if (quiz != null) result.quiz.addAll(quiz);\n    if (quizTotal != null) result.quizTotal = quizTotal;\n    return result;\n  }\n\n  CampusMngQuizOperateReply._();\n\n  factory CampusMngQuizOperateReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusMngQuizOperateReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusMngQuizOperateReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'toast')\n    ..pPM<CampusMngQuizDetail>(2, _omitFieldNames ? '' : 'quiz',\n        subBuilder: CampusMngQuizDetail.create)\n    ..aInt64(3, _omitFieldNames ? '' : 'quizTotal')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusMngQuizOperateReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusMngQuizOperateReply copyWith(\n          void Function(CampusMngQuizOperateReply) updates) =>\n      super.copyWith((message) => updates(message as CampusMngQuizOperateReply))\n          as CampusMngQuizOperateReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusMngQuizOperateReply create() => CampusMngQuizOperateReply._();\n  @$core.override\n  CampusMngQuizOperateReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusMngQuizOperateReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusMngQuizOperateReply>(create);\n  static CampusMngQuizOperateReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get toast => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set toast($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasToast() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearToast() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<CampusMngQuizDetail> get quiz => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get quizTotal => $_getI64(2);\n  @$pb.TagNumber(3)\n  set quizTotal($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasQuizTotal() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearQuizTotal() => $_clearField(3);\n}\n\nclass CampusMngQuizOperateReq extends $pb.GeneratedMessage {\n  factory CampusMngQuizOperateReq({\n    CampusMngQuizAction? action,\n    $fixnum.Int64? campusId,\n    $core.Iterable<CampusMngQuizDetail>? quiz,\n  }) {\n    final result = create();\n    if (action != null) result.action = action;\n    if (campusId != null) result.campusId = campusId;\n    if (quiz != null) result.quiz.addAll(quiz);\n    return result;\n  }\n\n  CampusMngQuizOperateReq._();\n\n  factory CampusMngQuizOperateReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusMngQuizOperateReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusMngQuizOperateReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aE<CampusMngQuizAction>(1, _omitFieldNames ? '' : 'action',\n        enumValues: CampusMngQuizAction.values)\n    ..aInt64(2, _omitFieldNames ? '' : 'campusId')\n    ..pPM<CampusMngQuizDetail>(3, _omitFieldNames ? '' : 'quiz',\n        subBuilder: CampusMngQuizDetail.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusMngQuizOperateReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusMngQuizOperateReq copyWith(\n          void Function(CampusMngQuizOperateReq) updates) =>\n      super.copyWith((message) => updates(message as CampusMngQuizOperateReq))\n          as CampusMngQuizOperateReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusMngQuizOperateReq create() => CampusMngQuizOperateReq._();\n  @$core.override\n  CampusMngQuizOperateReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusMngQuizOperateReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusMngQuizOperateReq>(create);\n  static CampusMngQuizOperateReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  CampusMngQuizAction get action => $_getN(0);\n  @$pb.TagNumber(1)\n  set action(CampusMngQuizAction value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAction() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAction() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get campusId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set campusId($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCampusId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCampusId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<CampusMngQuizDetail> get quiz => $_getList(2);\n}\n\nclass CampusMngSlogan extends $pb.GeneratedMessage {\n  factory CampusMngSlogan({\n    $core.String? title,\n    $core.String? slogan,\n    $core.String? inputHintMsg,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (slogan != null) result.slogan = slogan;\n    if (inputHintMsg != null) result.inputHintMsg = inputHintMsg;\n    return result;\n  }\n\n  CampusMngSlogan._();\n\n  factory CampusMngSlogan.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusMngSlogan.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusMngSlogan',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'slogan')\n    ..aOS(3, _omitFieldNames ? '' : 'inputHintMsg')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusMngSlogan clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusMngSlogan copyWith(void Function(CampusMngSlogan) updates) =>\n      super.copyWith((message) => updates(message as CampusMngSlogan))\n          as CampusMngSlogan;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusMngSlogan create() => CampusMngSlogan._();\n  @$core.override\n  CampusMngSlogan createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusMngSlogan getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusMngSlogan>(create);\n  static CampusMngSlogan? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get slogan => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set slogan($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSlogan() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSlogan() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get inputHintMsg => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set inputHintMsg($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasInputHintMsg() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearInputHintMsg() => $_clearField(3);\n}\n\nclass CampusMngSubmitReply extends $pb.GeneratedMessage {\n  factory CampusMngSubmitReply({\n    $core.String? toast,\n  }) {\n    final result = create();\n    if (toast != null) result.toast = toast;\n    return result;\n  }\n\n  CampusMngSubmitReply._();\n\n  factory CampusMngSubmitReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusMngSubmitReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusMngSubmitReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'toast')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusMngSubmitReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusMngSubmitReply copyWith(void Function(CampusMngSubmitReply) updates) =>\n      super.copyWith((message) => updates(message as CampusMngSubmitReply))\n          as CampusMngSubmitReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusMngSubmitReply create() => CampusMngSubmitReply._();\n  @$core.override\n  CampusMngSubmitReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusMngSubmitReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusMngSubmitReply>(create);\n  static CampusMngSubmitReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get toast => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set toast($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasToast() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearToast() => $_clearField(1);\n}\n\nclass CampusMngSubmitReq extends $pb.GeneratedMessage {\n  factory CampusMngSubmitReq({\n    $fixnum.Int64? campusId,\n    $core.Iterable<CampusMngItem>? modifiedItems,\n  }) {\n    final result = create();\n    if (campusId != null) result.campusId = campusId;\n    if (modifiedItems != null) result.modifiedItems.addAll(modifiedItems);\n    return result;\n  }\n\n  CampusMngSubmitReq._();\n\n  factory CampusMngSubmitReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusMngSubmitReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusMngSubmitReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'campusId')\n    ..pPM<CampusMngItem>(2, _omitFieldNames ? '' : 'modifiedItems',\n        subBuilder: CampusMngItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusMngSubmitReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusMngSubmitReq copyWith(void Function(CampusMngSubmitReq) updates) =>\n      super.copyWith((message) => updates(message as CampusMngSubmitReq))\n          as CampusMngSubmitReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusMngSubmitReq create() => CampusMngSubmitReq._();\n  @$core.override\n  CampusMngSubmitReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusMngSubmitReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusMngSubmitReq>(create);\n  static CampusMngSubmitReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get campusId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set campusId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCampusId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCampusId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<CampusMngItem> get modifiedItems => $_getList(1);\n}\n\nclass CampusNoticeInfo extends $pb.GeneratedMessage {\n  factory CampusNoticeInfo({\n    $core.String? title,\n    $core.String? desc,\n    CampusLabel? button,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (desc != null) result.desc = desc;\n    if (button != null) result.button = button;\n    return result;\n  }\n\n  CampusNoticeInfo._();\n\n  factory CampusNoticeInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusNoticeInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusNoticeInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'desc')\n    ..aOM<CampusLabel>(3, _omitFieldNames ? '' : 'button',\n        subBuilder: CampusLabel.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusNoticeInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusNoticeInfo copyWith(void Function(CampusNoticeInfo) updates) =>\n      super.copyWith((message) => updates(message as CampusNoticeInfo))\n          as CampusNoticeInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusNoticeInfo create() => CampusNoticeInfo._();\n  @$core.override\n  CampusNoticeInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusNoticeInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusNoticeInfo>(create);\n  static CampusNoticeInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get desc => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set desc($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDesc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDesc() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  CampusLabel get button => $_getN(2);\n  @$pb.TagNumber(3)\n  set button(CampusLabel value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasButton() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearButton() => $_clearField(3);\n  @$pb.TagNumber(3)\n  CampusLabel ensureButton() => $_ensure(2);\n}\n\nclass CampusRcmdFeedReply extends $pb.GeneratedMessage {\n  factory CampusRcmdFeedReply({\n    $core.Iterable<DynamicItem>? list,\n    $core.String? toast,\n    GuideBarInfo? guideBar,\n    $core.bool? hasMore,\n    $core.bool? update,\n  }) {\n    final result = create();\n    if (list != null) result.list.addAll(list);\n    if (toast != null) result.toast = toast;\n    if (guideBar != null) result.guideBar = guideBar;\n    if (hasMore != null) result.hasMore = hasMore;\n    if (update != null) result.update = update;\n    return result;\n  }\n\n  CampusRcmdFeedReply._();\n\n  factory CampusRcmdFeedReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusRcmdFeedReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusRcmdFeedReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<DynamicItem>(1, _omitFieldNames ? '' : 'list',\n        subBuilder: DynamicItem.create)\n    ..aOS(2, _omitFieldNames ? '' : 'toast')\n    ..aOM<GuideBarInfo>(3, _omitFieldNames ? '' : 'guideBar',\n        subBuilder: GuideBarInfo.create)\n    ..aOB(4, _omitFieldNames ? '' : 'hasMore')\n    ..aOB(5, _omitFieldNames ? '' : 'update')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusRcmdFeedReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusRcmdFeedReply copyWith(void Function(CampusRcmdFeedReply) updates) =>\n      super.copyWith((message) => updates(message as CampusRcmdFeedReply))\n          as CampusRcmdFeedReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusRcmdFeedReply create() => CampusRcmdFeedReply._();\n  @$core.override\n  CampusRcmdFeedReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusRcmdFeedReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusRcmdFeedReply>(create);\n  static CampusRcmdFeedReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<DynamicItem> get list => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.String get toast => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set toast($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasToast() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearToast() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  GuideBarInfo get guideBar => $_getN(2);\n  @$pb.TagNumber(3)\n  set guideBar(GuideBarInfo value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasGuideBar() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearGuideBar() => $_clearField(3);\n  @$pb.TagNumber(3)\n  GuideBarInfo ensureGuideBar() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.bool get hasMore => $_getBF(3);\n  @$pb.TagNumber(4)\n  set hasMore($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasHasMore() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearHasMore() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.bool get update => $_getBF(4);\n  @$pb.TagNumber(5)\n  set update($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasUpdate() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearUpdate() => $_clearField(5);\n}\n\nclass CampusRcmdFeedReq extends $pb.GeneratedMessage {\n  factory CampusRcmdFeedReq({\n    $fixnum.Int64? campusId,\n    $core.int? firstTime,\n    $1.PlayerArgs? playerArgs,\n    $core.int? localTime,\n    $core.int? page,\n    $core.int? scroll,\n    $core.String? viewDynId,\n    CampusReqFromType? fromType,\n  }) {\n    final result = create();\n    if (campusId != null) result.campusId = campusId;\n    if (firstTime != null) result.firstTime = firstTime;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    if (localTime != null) result.localTime = localTime;\n    if (page != null) result.page = page;\n    if (scroll != null) result.scroll = scroll;\n    if (viewDynId != null) result.viewDynId = viewDynId;\n    if (fromType != null) result.fromType = fromType;\n    return result;\n  }\n\n  CampusRcmdFeedReq._();\n\n  factory CampusRcmdFeedReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusRcmdFeedReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusRcmdFeedReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'campusId')\n    ..aI(2, _omitFieldNames ? '' : 'firstTime')\n    ..aOM<$1.PlayerArgs>(3, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $1.PlayerArgs.create)\n    ..aI(4, _omitFieldNames ? '' : 'localTime')\n    ..aI(5, _omitFieldNames ? '' : 'page')\n    ..aI(6, _omitFieldNames ? '' : 'scroll')\n    ..aOS(7, _omitFieldNames ? '' : 'viewDynId')\n    ..aE<CampusReqFromType>(8, _omitFieldNames ? '' : 'fromType',\n        enumValues: CampusReqFromType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusRcmdFeedReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusRcmdFeedReq copyWith(void Function(CampusRcmdFeedReq) updates) =>\n      super.copyWith((message) => updates(message as CampusRcmdFeedReq))\n          as CampusRcmdFeedReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusRcmdFeedReq create() => CampusRcmdFeedReq._();\n  @$core.override\n  CampusRcmdFeedReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusRcmdFeedReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusRcmdFeedReq>(create);\n  static CampusRcmdFeedReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get campusId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set campusId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCampusId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCampusId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get firstTime => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set firstTime($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFirstTime() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFirstTime() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $1.PlayerArgs get playerArgs => $_getN(2);\n  @$pb.TagNumber(3)\n  set playerArgs($1.PlayerArgs value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPlayerArgs() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPlayerArgs() => $_clearField(3);\n  @$pb.TagNumber(3)\n  $1.PlayerArgs ensurePlayerArgs() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.int get localTime => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set localTime($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLocalTime() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLocalTime() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get page => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set page($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPage() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPage() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get scroll => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set scroll($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasScroll() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearScroll() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get viewDynId => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set viewDynId($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasViewDynId() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearViewDynId() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  CampusReqFromType get fromType => $_getN(7);\n  @$pb.TagNumber(8)\n  set fromType(CampusReqFromType value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasFromType() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearFromType() => $_clearField(8);\n}\n\nclass CampusRcmdInfo extends $pb.GeneratedMessage {\n  factory CampusRcmdInfo({\n    $core.String? title,\n    $core.Iterable<CampusRcmdItem>? items,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (items != null) result.items.addAll(items);\n    return result;\n  }\n\n  CampusRcmdInfo._();\n\n  factory CampusRcmdInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusRcmdInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusRcmdInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..pPM<CampusRcmdItem>(2, _omitFieldNames ? '' : 'items',\n        subBuilder: CampusRcmdItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusRcmdInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusRcmdInfo copyWith(void Function(CampusRcmdInfo) updates) =>\n      super.copyWith((message) => updates(message as CampusRcmdInfo))\n          as CampusRcmdInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusRcmdInfo create() => CampusRcmdInfo._();\n  @$core.override\n  CampusRcmdInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusRcmdInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusRcmdInfo>(create);\n  static CampusRcmdInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<CampusRcmdItem> get items => $_getList(1);\n}\n\nclass CampusRcmdItem extends $pb.GeneratedMessage {\n  factory CampusRcmdItem({\n    $core.String? title,\n    $core.Iterable<RcmdItem>? items,\n    $fixnum.Int64? campusId,\n    CampusLabel? entryLabel,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (items != null) result.items.addAll(items);\n    if (campusId != null) result.campusId = campusId;\n    if (entryLabel != null) result.entryLabel = entryLabel;\n    return result;\n  }\n\n  CampusRcmdItem._();\n\n  factory CampusRcmdItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusRcmdItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusRcmdItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..pPM<RcmdItem>(2, _omitFieldNames ? '' : 'items',\n        subBuilder: RcmdItem.create)\n    ..aInt64(3, _omitFieldNames ? '' : 'campusId')\n    ..aOM<CampusLabel>(4, _omitFieldNames ? '' : 'entryLabel',\n        subBuilder: CampusLabel.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusRcmdItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusRcmdItem copyWith(void Function(CampusRcmdItem) updates) =>\n      super.copyWith((message) => updates(message as CampusRcmdItem))\n          as CampusRcmdItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusRcmdItem create() => CampusRcmdItem._();\n  @$core.override\n  CampusRcmdItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusRcmdItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusRcmdItem>(create);\n  static CampusRcmdItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<RcmdItem> get items => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get campusId => $_getI64(2);\n  @$pb.TagNumber(3)\n  set campusId($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCampusId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCampusId() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  CampusLabel get entryLabel => $_getN(3);\n  @$pb.TagNumber(4)\n  set entryLabel(CampusLabel value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasEntryLabel() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearEntryLabel() => $_clearField(4);\n  @$pb.TagNumber(4)\n  CampusLabel ensureEntryLabel() => $_ensure(3);\n}\n\nclass CampusRcmdReply extends $pb.GeneratedMessage {\n  factory CampusRcmdReply({\n    CampusRcmdTop? top,\n    CampusRcmdInfo? rcmd,\n    CampusTop? campusTop,\n    $core.int? pageType,\n    $core.int? jumpHomePop,\n  }) {\n    final result = create();\n    if (top != null) result.top = top;\n    if (rcmd != null) result.rcmd = rcmd;\n    if (campusTop != null) result.campusTop = campusTop;\n    if (pageType != null) result.pageType = pageType;\n    if (jumpHomePop != null) result.jumpHomePop = jumpHomePop;\n    return result;\n  }\n\n  CampusRcmdReply._();\n\n  factory CampusRcmdReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusRcmdReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusRcmdReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<CampusRcmdTop>(1, _omitFieldNames ? '' : 'top',\n        subBuilder: CampusRcmdTop.create)\n    ..aOM<CampusRcmdInfo>(2, _omitFieldNames ? '' : 'rcmd',\n        subBuilder: CampusRcmdInfo.create)\n    ..aOM<CampusTop>(3, _omitFieldNames ? '' : 'campusTop',\n        subBuilder: CampusTop.create)\n    ..aI(4, _omitFieldNames ? '' : 'pageType')\n    ..aI(5, _omitFieldNames ? '' : 'jumpHomePop')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusRcmdReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusRcmdReply copyWith(void Function(CampusRcmdReply) updates) =>\n      super.copyWith((message) => updates(message as CampusRcmdReply))\n          as CampusRcmdReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusRcmdReply create() => CampusRcmdReply._();\n  @$core.override\n  CampusRcmdReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusRcmdReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusRcmdReply>(create);\n  static CampusRcmdReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  CampusRcmdTop get top => $_getN(0);\n  @$pb.TagNumber(1)\n  set top(CampusRcmdTop value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTop() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTop() => $_clearField(1);\n  @$pb.TagNumber(1)\n  CampusRcmdTop ensureTop() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  CampusRcmdInfo get rcmd => $_getN(1);\n  @$pb.TagNumber(2)\n  set rcmd(CampusRcmdInfo value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasRcmd() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRcmd() => $_clearField(2);\n  @$pb.TagNumber(2)\n  CampusRcmdInfo ensureRcmd() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  CampusTop get campusTop => $_getN(2);\n  @$pb.TagNumber(3)\n  set campusTop(CampusTop value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCampusTop() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCampusTop() => $_clearField(3);\n  @$pb.TagNumber(3)\n  CampusTop ensureCampusTop() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.int get pageType => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set pageType($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPageType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPageType() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get jumpHomePop => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set jumpHomePop($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasJumpHomePop() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearJumpHomePop() => $_clearField(5);\n}\n\nclass CampusRcmdReq extends $pb.GeneratedMessage {\n  factory CampusRcmdReq({\n    $fixnum.Int64? campusId,\n    $core.String? campusName,\n    $core.double? lat,\n    $core.double? lng,\n    $1.PlayerArgs? playerArgs,\n    CampusReqFromType? fromType,\n    CampusHomePageType? pageType,\n  }) {\n    final result = create();\n    if (campusId != null) result.campusId = campusId;\n    if (campusName != null) result.campusName = campusName;\n    if (lat != null) result.lat = lat;\n    if (lng != null) result.lng = lng;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    if (fromType != null) result.fromType = fromType;\n    if (pageType != null) result.pageType = pageType;\n    return result;\n  }\n\n  CampusRcmdReq._();\n\n  factory CampusRcmdReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusRcmdReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusRcmdReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'campusId')\n    ..aOS(2, _omitFieldNames ? '' : 'campusName')\n    ..aD(3, _omitFieldNames ? '' : 'lat')\n    ..aD(4, _omitFieldNames ? '' : 'lng')\n    ..aOM<$1.PlayerArgs>(5, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $1.PlayerArgs.create)\n    ..aE<CampusReqFromType>(6, _omitFieldNames ? '' : 'fromType',\n        enumValues: CampusReqFromType.values)\n    ..aE<CampusHomePageType>(7, _omitFieldNames ? '' : 'pageType',\n        enumValues: CampusHomePageType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusRcmdReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusRcmdReq copyWith(void Function(CampusRcmdReq) updates) =>\n      super.copyWith((message) => updates(message as CampusRcmdReq))\n          as CampusRcmdReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusRcmdReq create() => CampusRcmdReq._();\n  @$core.override\n  CampusRcmdReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusRcmdReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusRcmdReq>(create);\n  static CampusRcmdReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get campusId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set campusId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCampusId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCampusId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get campusName => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set campusName($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCampusName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCampusName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.double get lat => $_getN(2);\n  @$pb.TagNumber(3)\n  set lat($core.double value) => $_setDouble(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLat() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLat() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.double get lng => $_getN(3);\n  @$pb.TagNumber(4)\n  set lng($core.double value) => $_setDouble(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLng() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLng() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $1.PlayerArgs get playerArgs => $_getN(4);\n  @$pb.TagNumber(5)\n  set playerArgs($1.PlayerArgs value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPlayerArgs() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPlayerArgs() => $_clearField(5);\n  @$pb.TagNumber(5)\n  $1.PlayerArgs ensurePlayerArgs() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  CampusReqFromType get fromType => $_getN(5);\n  @$pb.TagNumber(6)\n  set fromType(CampusReqFromType value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasFromType() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearFromType() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  CampusHomePageType get pageType => $_getN(6);\n  @$pb.TagNumber(7)\n  set pageType(CampusHomePageType value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasPageType() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearPageType() => $_clearField(7);\n}\n\nclass CampusRcmdTop extends $pb.GeneratedMessage {\n  factory CampusRcmdTop({\n    $fixnum.Int64? campusId,\n    $core.String? campusName,\n    $core.String? title,\n    $core.String? desc,\n    $core.int? type,\n    RcmdTopButton? button,\n    CampusLabel? switchLabel,\n    CampusLabel? noticeLabel,\n    $core.String? desc2,\n    $core.String? desc3,\n    CampusLabel? inviteLabel,\n    CampusLabel? reserveLabel,\n    $fixnum.Int64? reserveNumber,\n    $fixnum.Int64? maxReserve,\n    CampusLabel? schoolLabel,\n    CampusLabel? mngLabel,\n    CampusHomeRcmdTopic? rcmdTopic,\n    $core.bool? auditBeforeOpen,\n    $core.String? auditMessage,\n  }) {\n    final result = create();\n    if (campusId != null) result.campusId = campusId;\n    if (campusName != null) result.campusName = campusName;\n    if (title != null) result.title = title;\n    if (desc != null) result.desc = desc;\n    if (type != null) result.type = type;\n    if (button != null) result.button = button;\n    if (switchLabel != null) result.switchLabel = switchLabel;\n    if (noticeLabel != null) result.noticeLabel = noticeLabel;\n    if (desc2 != null) result.desc2 = desc2;\n    if (desc3 != null) result.desc3 = desc3;\n    if (inviteLabel != null) result.inviteLabel = inviteLabel;\n    if (reserveLabel != null) result.reserveLabel = reserveLabel;\n    if (reserveNumber != null) result.reserveNumber = reserveNumber;\n    if (maxReserve != null) result.maxReserve = maxReserve;\n    if (schoolLabel != null) result.schoolLabel = schoolLabel;\n    if (mngLabel != null) result.mngLabel = mngLabel;\n    if (rcmdTopic != null) result.rcmdTopic = rcmdTopic;\n    if (auditBeforeOpen != null) result.auditBeforeOpen = auditBeforeOpen;\n    if (auditMessage != null) result.auditMessage = auditMessage;\n    return result;\n  }\n\n  CampusRcmdTop._();\n\n  factory CampusRcmdTop.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusRcmdTop.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusRcmdTop',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'campusId')\n    ..aOS(2, _omitFieldNames ? '' : 'campusName')\n    ..aOS(3, _omitFieldNames ? '' : 'title')\n    ..aOS(4, _omitFieldNames ? '' : 'desc')\n    ..aI(5, _omitFieldNames ? '' : 'type')\n    ..aOM<RcmdTopButton>(6, _omitFieldNames ? '' : 'button',\n        subBuilder: RcmdTopButton.create)\n    ..aOM<CampusLabel>(7, _omitFieldNames ? '' : 'switchLabel',\n        subBuilder: CampusLabel.create)\n    ..aOM<CampusLabel>(8, _omitFieldNames ? '' : 'noticeLabel',\n        subBuilder: CampusLabel.create)\n    ..aOS(9, _omitFieldNames ? '' : 'desc2')\n    ..aOS(10, _omitFieldNames ? '' : 'desc3')\n    ..aOM<CampusLabel>(11, _omitFieldNames ? '' : 'inviteLabel',\n        subBuilder: CampusLabel.create)\n    ..aOM<CampusLabel>(12, _omitFieldNames ? '' : 'reserveLabel',\n        subBuilder: CampusLabel.create)\n    ..aInt64(13, _omitFieldNames ? '' : 'reserveNumber')\n    ..aInt64(14, _omitFieldNames ? '' : 'maxReserve')\n    ..aOM<CampusLabel>(15, _omitFieldNames ? '' : 'schoolLabel',\n        subBuilder: CampusLabel.create)\n    ..aOM<CampusLabel>(16, _omitFieldNames ? '' : 'mngLabel',\n        subBuilder: CampusLabel.create)\n    ..aOM<CampusHomeRcmdTopic>(17, _omitFieldNames ? '' : 'rcmdTopic',\n        subBuilder: CampusHomeRcmdTopic.create)\n    ..aOB(18, _omitFieldNames ? '' : 'auditBeforeOpen')\n    ..aOS(19, _omitFieldNames ? '' : 'auditMessage')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusRcmdTop clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusRcmdTop copyWith(void Function(CampusRcmdTop) updates) =>\n      super.copyWith((message) => updates(message as CampusRcmdTop))\n          as CampusRcmdTop;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusRcmdTop create() => CampusRcmdTop._();\n  @$core.override\n  CampusRcmdTop createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusRcmdTop getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusRcmdTop>(create);\n  static CampusRcmdTop? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get campusId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set campusId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCampusId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCampusId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get campusName => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set campusName($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCampusName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCampusName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get title => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set title($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get desc => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set desc($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDesc() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDesc() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get type => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set type($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearType() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  RcmdTopButton get button => $_getN(5);\n  @$pb.TagNumber(6)\n  set button(RcmdTopButton value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasButton() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearButton() => $_clearField(6);\n  @$pb.TagNumber(6)\n  RcmdTopButton ensureButton() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  CampusLabel get switchLabel => $_getN(6);\n  @$pb.TagNumber(7)\n  set switchLabel(CampusLabel value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasSwitchLabel() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearSwitchLabel() => $_clearField(7);\n  @$pb.TagNumber(7)\n  CampusLabel ensureSwitchLabel() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  CampusLabel get noticeLabel => $_getN(7);\n  @$pb.TagNumber(8)\n  set noticeLabel(CampusLabel value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasNoticeLabel() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearNoticeLabel() => $_clearField(8);\n  @$pb.TagNumber(8)\n  CampusLabel ensureNoticeLabel() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  $core.String get desc2 => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set desc2($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasDesc2() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearDesc2() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get desc3 => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set desc3($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasDesc3() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearDesc3() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  CampusLabel get inviteLabel => $_getN(10);\n  @$pb.TagNumber(11)\n  set inviteLabel(CampusLabel value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasInviteLabel() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearInviteLabel() => $_clearField(11);\n  @$pb.TagNumber(11)\n  CampusLabel ensureInviteLabel() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  CampusLabel get reserveLabel => $_getN(11);\n  @$pb.TagNumber(12)\n  set reserveLabel(CampusLabel value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasReserveLabel() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearReserveLabel() => $_clearField(12);\n  @$pb.TagNumber(12)\n  CampusLabel ensureReserveLabel() => $_ensure(11);\n\n  @$pb.TagNumber(13)\n  $fixnum.Int64 get reserveNumber => $_getI64(12);\n  @$pb.TagNumber(13)\n  set reserveNumber($fixnum.Int64 value) => $_setInt64(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasReserveNumber() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearReserveNumber() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $fixnum.Int64 get maxReserve => $_getI64(13);\n  @$pb.TagNumber(14)\n  set maxReserve($fixnum.Int64 value) => $_setInt64(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasMaxReserve() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearMaxReserve() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  CampusLabel get schoolLabel => $_getN(14);\n  @$pb.TagNumber(15)\n  set schoolLabel(CampusLabel value) => $_setField(15, value);\n  @$pb.TagNumber(15)\n  $core.bool hasSchoolLabel() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearSchoolLabel() => $_clearField(15);\n  @$pb.TagNumber(15)\n  CampusLabel ensureSchoolLabel() => $_ensure(14);\n\n  @$pb.TagNumber(16)\n  CampusLabel get mngLabel => $_getN(15);\n  @$pb.TagNumber(16)\n  set mngLabel(CampusLabel value) => $_setField(16, value);\n  @$pb.TagNumber(16)\n  $core.bool hasMngLabel() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearMngLabel() => $_clearField(16);\n  @$pb.TagNumber(16)\n  CampusLabel ensureMngLabel() => $_ensure(15);\n\n  @$pb.TagNumber(17)\n  CampusHomeRcmdTopic get rcmdTopic => $_getN(16);\n  @$pb.TagNumber(17)\n  set rcmdTopic(CampusHomeRcmdTopic value) => $_setField(17, value);\n  @$pb.TagNumber(17)\n  $core.bool hasRcmdTopic() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearRcmdTopic() => $_clearField(17);\n  @$pb.TagNumber(17)\n  CampusHomeRcmdTopic ensureRcmdTopic() => $_ensure(16);\n\n  @$pb.TagNumber(18)\n  $core.bool get auditBeforeOpen => $_getBF(17);\n  @$pb.TagNumber(18)\n  set auditBeforeOpen($core.bool value) => $_setBool(17, value);\n  @$pb.TagNumber(18)\n  $core.bool hasAuditBeforeOpen() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearAuditBeforeOpen() => $_clearField(18);\n\n  @$pb.TagNumber(19)\n  $core.String get auditMessage => $_getSZ(18);\n  @$pb.TagNumber(19)\n  set auditMessage($core.String value) => $_setString(18, value);\n  @$pb.TagNumber(19)\n  $core.bool hasAuditMessage() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearAuditMessage() => $_clearField(19);\n}\n\nclass CampusRecommendReply extends $pb.GeneratedMessage {\n  factory CampusRecommendReply({\n    $core.Iterable<RcmdItem>? items,\n    $core.bool? hasMore,\n  }) {\n    final result = create();\n    if (items != null) result.items.addAll(items);\n    if (hasMore != null) result.hasMore = hasMore;\n    return result;\n  }\n\n  CampusRecommendReply._();\n\n  factory CampusRecommendReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusRecommendReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusRecommendReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<RcmdItem>(1, _omitFieldNames ? '' : 'items',\n        subBuilder: RcmdItem.create)\n    ..aOB(2, _omitFieldNames ? '' : 'hasMore')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusRecommendReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusRecommendReply copyWith(void Function(CampusRecommendReply) updates) =>\n      super.copyWith((message) => updates(message as CampusRecommendReply))\n          as CampusRecommendReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusRecommendReply create() => CampusRecommendReply._();\n  @$core.override\n  CampusRecommendReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusRecommendReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusRecommendReply>(create);\n  static CampusRecommendReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<RcmdItem> get items => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.bool get hasMore => $_getBF(1);\n  @$pb.TagNumber(2)\n  set hasMore($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHasMore() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHasMore() => $_clearField(2);\n}\n\nclass CampusRecommendReq extends $pb.GeneratedMessage {\n  factory CampusRecommendReq({\n    $fixnum.Int64? campusId,\n    $fixnum.Int64? pageNo,\n    $1.PlayerArgs? playerArgs,\n    CampusRcmdReqFrom? from,\n  }) {\n    final result = create();\n    if (campusId != null) result.campusId = campusId;\n    if (pageNo != null) result.pageNo = pageNo;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    if (from != null) result.from = from;\n    return result;\n  }\n\n  CampusRecommendReq._();\n\n  factory CampusRecommendReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusRecommendReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusRecommendReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'campusId')\n    ..aInt64(2, _omitFieldNames ? '' : 'pageNo')\n    ..aOM<$1.PlayerArgs>(3, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $1.PlayerArgs.create)\n    ..aE<CampusRcmdReqFrom>(4, _omitFieldNames ? '' : 'from',\n        enumValues: CampusRcmdReqFrom.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusRecommendReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusRecommendReq copyWith(void Function(CampusRecommendReq) updates) =>\n      super.copyWith((message) => updates(message as CampusRecommendReq))\n          as CampusRecommendReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusRecommendReq create() => CampusRecommendReq._();\n  @$core.override\n  CampusRecommendReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusRecommendReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusRecommendReq>(create);\n  static CampusRecommendReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get campusId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set campusId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCampusId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCampusId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get pageNo => $_getI64(1);\n  @$pb.TagNumber(2)\n  set pageNo($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPageNo() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPageNo() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $1.PlayerArgs get playerArgs => $_getN(2);\n  @$pb.TagNumber(3)\n  set playerArgs($1.PlayerArgs value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPlayerArgs() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPlayerArgs() => $_clearField(3);\n  @$pb.TagNumber(3)\n  $1.PlayerArgs ensurePlayerArgs() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  CampusRcmdReqFrom get from => $_getN(3);\n  @$pb.TagNumber(4)\n  set from(CampusRcmdReqFrom value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFrom() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFrom() => $_clearField(4);\n}\n\nclass CampusRedDotReply extends $pb.GeneratedMessage {\n  factory CampusRedDotReply({\n    $core.int? redDot,\n  }) {\n    final result = create();\n    if (redDot != null) result.redDot = redDot;\n    return result;\n  }\n\n  CampusRedDotReply._();\n\n  factory CampusRedDotReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusRedDotReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusRedDotReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'redDot')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusRedDotReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusRedDotReply copyWith(void Function(CampusRedDotReply) updates) =>\n      super.copyWith((message) => updates(message as CampusRedDotReply))\n          as CampusRedDotReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusRedDotReply create() => CampusRedDotReply._();\n  @$core.override\n  CampusRedDotReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusRedDotReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusRedDotReply>(create);\n  static CampusRedDotReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get redDot => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set redDot($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasRedDot() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRedDot() => $_clearField(1);\n}\n\nclass CampusRedDotReq extends $pb.GeneratedMessage {\n  factory CampusRedDotReq({\n    $fixnum.Int64? campusId,\n    CampusReqFromType? fromType,\n  }) {\n    final result = create();\n    if (campusId != null) result.campusId = campusId;\n    if (fromType != null) result.fromType = fromType;\n    return result;\n  }\n\n  CampusRedDotReq._();\n\n  factory CampusRedDotReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusRedDotReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusRedDotReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'campusId')\n    ..aE<CampusReqFromType>(2, _omitFieldNames ? '' : 'fromType',\n        enumValues: CampusReqFromType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusRedDotReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusRedDotReq copyWith(void Function(CampusRedDotReq) updates) =>\n      super.copyWith((message) => updates(message as CampusRedDotReq))\n          as CampusRedDotReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusRedDotReq create() => CampusRedDotReq._();\n  @$core.override\n  CampusRedDotReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusRedDotReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusRedDotReq>(create);\n  static CampusRedDotReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get campusId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set campusId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCampusId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCampusId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  CampusReqFromType get fromType => $_getN(1);\n  @$pb.TagNumber(2)\n  set fromType(CampusReqFromType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFromType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFromType() => $_clearField(2);\n}\n\nclass CampusShowTabInfo extends $pb.GeneratedMessage {\n  factory CampusShowTabInfo({\n    $core.String? name,\n    $core.String? url,\n    CampusTabType? type,\n    $core.int? redDot,\n    $core.String? iconUrl,\n  }) {\n    final result = create();\n    if (name != null) result.name = name;\n    if (url != null) result.url = url;\n    if (type != null) result.type = type;\n    if (redDot != null) result.redDot = redDot;\n    if (iconUrl != null) result.iconUrl = iconUrl;\n    return result;\n  }\n\n  CampusShowTabInfo._();\n\n  factory CampusShowTabInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusShowTabInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusShowTabInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'name')\n    ..aOS(2, _omitFieldNames ? '' : 'url')\n    ..aE<CampusTabType>(3, _omitFieldNames ? '' : 'type',\n        enumValues: CampusTabType.values)\n    ..aI(4, _omitFieldNames ? '' : 'redDot')\n    ..aOS(5, _omitFieldNames ? '' : 'iconUrl')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusShowTabInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusShowTabInfo copyWith(void Function(CampusShowTabInfo) updates) =>\n      super.copyWith((message) => updates(message as CampusShowTabInfo))\n          as CampusShowTabInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusShowTabInfo create() => CampusShowTabInfo._();\n  @$core.override\n  CampusShowTabInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusShowTabInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusShowTabInfo>(create);\n  static CampusShowTabInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get name => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set name($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasName() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearName() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get url => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set url($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUrl() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  CampusTabType get type => $_getN(2);\n  @$pb.TagNumber(3)\n  set type(CampusTabType value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get redDot => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set redDot($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasRedDot() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearRedDot() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get iconUrl => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set iconUrl($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasIconUrl() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearIconUrl() => $_clearField(5);\n}\n\nclass CampusSquareReply extends $pb.GeneratedMessage {\n  factory CampusSquareReply({\n    $core.String? title,\n    $core.Iterable<RcmdCampusBrief>? list,\n    CampusLabel? button,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (list != null) result.list.addAll(list);\n    if (button != null) result.button = button;\n    return result;\n  }\n\n  CampusSquareReply._();\n\n  factory CampusSquareReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusSquareReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusSquareReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..pPM<RcmdCampusBrief>(2, _omitFieldNames ? '' : 'list',\n        subBuilder: RcmdCampusBrief.create)\n    ..aOM<CampusLabel>(3, _omitFieldNames ? '' : 'button',\n        subBuilder: CampusLabel.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusSquareReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusSquareReply copyWith(void Function(CampusSquareReply) updates) =>\n      super.copyWith((message) => updates(message as CampusSquareReply))\n          as CampusSquareReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusSquareReply create() => CampusSquareReply._();\n  @$core.override\n  CampusSquareReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusSquareReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusSquareReply>(create);\n  static CampusSquareReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<RcmdCampusBrief> get list => $_getList(1);\n\n  @$pb.TagNumber(3)\n  CampusLabel get button => $_getN(2);\n  @$pb.TagNumber(3)\n  set button(CampusLabel value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasButton() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearButton() => $_clearField(3);\n  @$pb.TagNumber(3)\n  CampusLabel ensureButton() => $_ensure(2);\n}\n\nclass CampusSquareReq extends $pb.GeneratedMessage {\n  factory CampusSquareReq({\n    $fixnum.Int64? campusId,\n    $core.double? lat,\n    $core.double? lng,\n  }) {\n    final result = create();\n    if (campusId != null) result.campusId = campusId;\n    if (lat != null) result.lat = lat;\n    if (lng != null) result.lng = lng;\n    return result;\n  }\n\n  CampusSquareReq._();\n\n  factory CampusSquareReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusSquareReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusSquareReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'campusId')\n    ..aD(2, _omitFieldNames ? '' : 'lat')\n    ..aD(3, _omitFieldNames ? '' : 'lng')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusSquareReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusSquareReq copyWith(void Function(CampusSquareReq) updates) =>\n      super.copyWith((message) => updates(message as CampusSquareReq))\n          as CampusSquareReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusSquareReq create() => CampusSquareReq._();\n  @$core.override\n  CampusSquareReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusSquareReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusSquareReq>(create);\n  static CampusSquareReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get campusId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set campusId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCampusId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCampusId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.double get lat => $_getN(1);\n  @$pb.TagNumber(2)\n  set lat($core.double value) => $_setDouble(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLat() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLat() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.double get lng => $_getN(2);\n  @$pb.TagNumber(3)\n  set lng($core.double value) => $_setDouble(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLng() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLng() => $_clearField(3);\n}\n\nclass CampusTop extends $pb.GeneratedMessage {\n  factory CampusTop({\n    $fixnum.Int64? campusId,\n    $core.String? campusName,\n    $core.Iterable<CampusShowTabInfo>? tabs,\n    CampusLabel? switchLabel,\n    $core.String? title,\n    $core.Iterable<CampusBannerInfo>? banner,\n    CampusLabel? inviteLabel,\n    CampusNoticeInfo? notice,\n    TopicSquareInfo? topicSquare,\n    $core.String? campusBadge,\n    $core.String? campusBackground,\n    $core.String? campusMotto,\n    CampusLabel? mngEntry,\n    $core.String? campusIntro,\n    $core.String? campusNameLink,\n    $core.String? bottomLeftText,\n  }) {\n    final result = create();\n    if (campusId != null) result.campusId = campusId;\n    if (campusName != null) result.campusName = campusName;\n    if (tabs != null) result.tabs.addAll(tabs);\n    if (switchLabel != null) result.switchLabel = switchLabel;\n    if (title != null) result.title = title;\n    if (banner != null) result.banner.addAll(banner);\n    if (inviteLabel != null) result.inviteLabel = inviteLabel;\n    if (notice != null) result.notice = notice;\n    if (topicSquare != null) result.topicSquare = topicSquare;\n    if (campusBadge != null) result.campusBadge = campusBadge;\n    if (campusBackground != null) result.campusBackground = campusBackground;\n    if (campusMotto != null) result.campusMotto = campusMotto;\n    if (mngEntry != null) result.mngEntry = mngEntry;\n    if (campusIntro != null) result.campusIntro = campusIntro;\n    if (campusNameLink != null) result.campusNameLink = campusNameLink;\n    if (bottomLeftText != null) result.bottomLeftText = bottomLeftText;\n    return result;\n  }\n\n  CampusTop._();\n\n  factory CampusTop.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusTop.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusTop',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'campusId')\n    ..aOS(2, _omitFieldNames ? '' : 'campusName')\n    ..pPM<CampusShowTabInfo>(3, _omitFieldNames ? '' : 'tabs',\n        subBuilder: CampusShowTabInfo.create)\n    ..aOM<CampusLabel>(4, _omitFieldNames ? '' : 'switchLabel',\n        subBuilder: CampusLabel.create)\n    ..aOS(5, _omitFieldNames ? '' : 'title')\n    ..pPM<CampusBannerInfo>(6, _omitFieldNames ? '' : 'banner',\n        subBuilder: CampusBannerInfo.create)\n    ..aOM<CampusLabel>(7, _omitFieldNames ? '' : 'inviteLabel',\n        subBuilder: CampusLabel.create)\n    ..aOM<CampusNoticeInfo>(8, _omitFieldNames ? '' : 'notice',\n        subBuilder: CampusNoticeInfo.create)\n    ..aOM<TopicSquareInfo>(9, _omitFieldNames ? '' : 'topicSquare',\n        subBuilder: TopicSquareInfo.create)\n    ..aOS(10, _omitFieldNames ? '' : 'campusBadge')\n    ..aOS(11, _omitFieldNames ? '' : 'campusBackground')\n    ..aOS(12, _omitFieldNames ? '' : 'campusMotto')\n    ..aOM<CampusLabel>(13, _omitFieldNames ? '' : 'mngEntry',\n        subBuilder: CampusLabel.create)\n    ..aOS(14, _omitFieldNames ? '' : 'campusIntro')\n    ..aOS(15, _omitFieldNames ? '' : 'campusNameLink')\n    ..aOS(16, _omitFieldNames ? '' : 'bottomLeftText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusTop clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusTop copyWith(void Function(CampusTop) updates) =>\n      super.copyWith((message) => updates(message as CampusTop)) as CampusTop;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusTop create() => CampusTop._();\n  @$core.override\n  CampusTop createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusTop getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CampusTop>(create);\n  static CampusTop? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get campusId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set campusId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCampusId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCampusId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get campusName => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set campusName($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCampusName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCampusName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<CampusShowTabInfo> get tabs => $_getList(2);\n\n  @$pb.TagNumber(4)\n  CampusLabel get switchLabel => $_getN(3);\n  @$pb.TagNumber(4)\n  set switchLabel(CampusLabel value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSwitchLabel() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSwitchLabel() => $_clearField(4);\n  @$pb.TagNumber(4)\n  CampusLabel ensureSwitchLabel() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.String get title => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set title($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasTitle() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearTitle() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $pb.PbList<CampusBannerInfo> get banner => $_getList(5);\n\n  @$pb.TagNumber(7)\n  CampusLabel get inviteLabel => $_getN(6);\n  @$pb.TagNumber(7)\n  set inviteLabel(CampusLabel value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasInviteLabel() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearInviteLabel() => $_clearField(7);\n  @$pb.TagNumber(7)\n  CampusLabel ensureInviteLabel() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  CampusNoticeInfo get notice => $_getN(7);\n  @$pb.TagNumber(8)\n  set notice(CampusNoticeInfo value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasNotice() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearNotice() => $_clearField(8);\n  @$pb.TagNumber(8)\n  CampusNoticeInfo ensureNotice() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  TopicSquareInfo get topicSquare => $_getN(8);\n  @$pb.TagNumber(9)\n  set topicSquare(TopicSquareInfo value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasTopicSquare() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearTopicSquare() => $_clearField(9);\n  @$pb.TagNumber(9)\n  TopicSquareInfo ensureTopicSquare() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  $core.String get campusBadge => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set campusBadge($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasCampusBadge() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearCampusBadge() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get campusBackground => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set campusBackground($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasCampusBackground() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearCampusBackground() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get campusMotto => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set campusMotto($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasCampusMotto() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearCampusMotto() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  CampusLabel get mngEntry => $_getN(12);\n  @$pb.TagNumber(13)\n  set mngEntry(CampusLabel value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasMngEntry() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearMngEntry() => $_clearField(13);\n  @$pb.TagNumber(13)\n  CampusLabel ensureMngEntry() => $_ensure(12);\n\n  @$pb.TagNumber(14)\n  $core.String get campusIntro => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set campusIntro($core.String value) => $_setString(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasCampusIntro() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearCampusIntro() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $core.String get campusNameLink => $_getSZ(14);\n  @$pb.TagNumber(15)\n  set campusNameLink($core.String value) => $_setString(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasCampusNameLink() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearCampusNameLink() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $core.String get bottomLeftText => $_getSZ(15);\n  @$pb.TagNumber(16)\n  set bottomLeftText($core.String value) => $_setString(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasBottomLeftText() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearBottomLeftText() => $_clearField(16);\n}\n\nclass CampusTopicRcmdFeedReply extends $pb.GeneratedMessage {\n  factory CampusTopicRcmdFeedReply({\n    $core.Iterable<DynamicItem>? list,\n    $core.String? toast,\n    $core.bool? hasMore,\n    $core.String? offset,\n    IconButton? joinDiscuss,\n  }) {\n    final result = create();\n    if (list != null) result.list.addAll(list);\n    if (toast != null) result.toast = toast;\n    if (hasMore != null) result.hasMore = hasMore;\n    if (offset != null) result.offset = offset;\n    if (joinDiscuss != null) result.joinDiscuss = joinDiscuss;\n    return result;\n  }\n\n  CampusTopicRcmdFeedReply._();\n\n  factory CampusTopicRcmdFeedReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusTopicRcmdFeedReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusTopicRcmdFeedReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<DynamicItem>(1, _omitFieldNames ? '' : 'list',\n        subBuilder: DynamicItem.create)\n    ..aOS(2, _omitFieldNames ? '' : 'toast')\n    ..aOB(3, _omitFieldNames ? '' : 'hasMore')\n    ..aOS(4, _omitFieldNames ? '' : 'offset')\n    ..aOM<IconButton>(5, _omitFieldNames ? '' : 'joinDiscuss',\n        subBuilder: IconButton.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusTopicRcmdFeedReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusTopicRcmdFeedReply copyWith(\n          void Function(CampusTopicRcmdFeedReply) updates) =>\n      super.copyWith((message) => updates(message as CampusTopicRcmdFeedReply))\n          as CampusTopicRcmdFeedReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusTopicRcmdFeedReply create() => CampusTopicRcmdFeedReply._();\n  @$core.override\n  CampusTopicRcmdFeedReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusTopicRcmdFeedReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusTopicRcmdFeedReply>(create);\n  static CampusTopicRcmdFeedReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<DynamicItem> get list => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.String get toast => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set toast($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasToast() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearToast() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get hasMore => $_getBF(2);\n  @$pb.TagNumber(3)\n  set hasMore($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasHasMore() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearHasMore() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get offset => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set offset($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasOffset() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearOffset() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  IconButton get joinDiscuss => $_getN(4);\n  @$pb.TagNumber(5)\n  set joinDiscuss(IconButton value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasJoinDiscuss() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearJoinDiscuss() => $_clearField(5);\n  @$pb.TagNumber(5)\n  IconButton ensureJoinDiscuss() => $_ensure(4);\n}\n\nclass CampusTopicRcmdFeedReq extends $pb.GeneratedMessage {\n  factory CampusTopicRcmdFeedReq({\n    $fixnum.Int64? campusId,\n    $core.String? offset,\n    $1.PlayerArgs? playerArgs,\n    $core.int? localTime,\n    CampusReqFromType? fromType,\n  }) {\n    final result = create();\n    if (campusId != null) result.campusId = campusId;\n    if (offset != null) result.offset = offset;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    if (localTime != null) result.localTime = localTime;\n    if (fromType != null) result.fromType = fromType;\n    return result;\n  }\n\n  CampusTopicRcmdFeedReq._();\n\n  factory CampusTopicRcmdFeedReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusTopicRcmdFeedReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusTopicRcmdFeedReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'campusId')\n    ..aOS(2, _omitFieldNames ? '' : 'offset')\n    ..aOM<$1.PlayerArgs>(3, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $1.PlayerArgs.create)\n    ..aI(4, _omitFieldNames ? '' : 'localTime')\n    ..aE<CampusReqFromType>(5, _omitFieldNames ? '' : 'fromType',\n        enumValues: CampusReqFromType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusTopicRcmdFeedReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusTopicRcmdFeedReq copyWith(\n          void Function(CampusTopicRcmdFeedReq) updates) =>\n      super.copyWith((message) => updates(message as CampusTopicRcmdFeedReq))\n          as CampusTopicRcmdFeedReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusTopicRcmdFeedReq create() => CampusTopicRcmdFeedReq._();\n  @$core.override\n  CampusTopicRcmdFeedReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusTopicRcmdFeedReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusTopicRcmdFeedReq>(create);\n  static CampusTopicRcmdFeedReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get campusId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set campusId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCampusId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCampusId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get offset => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set offset($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOffset() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOffset() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $1.PlayerArgs get playerArgs => $_getN(2);\n  @$pb.TagNumber(3)\n  set playerArgs($1.PlayerArgs value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPlayerArgs() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPlayerArgs() => $_clearField(3);\n  @$pb.TagNumber(3)\n  $1.PlayerArgs ensurePlayerArgs() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.int get localTime => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set localTime($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLocalTime() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLocalTime() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  CampusReqFromType get fromType => $_getN(4);\n  @$pb.TagNumber(5)\n  set fromType(CampusReqFromType value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasFromType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearFromType() => $_clearField(5);\n}\n\nenum CampusWaterFlowItem_FlowItem { itemDefault, notSet }\n\nclass CampusWaterFlowItem extends $pb.GeneratedMessage {\n  factory CampusWaterFlowItem({\n    WFItemType? itemType,\n    $4.ItemWHRatio? whRatio,\n    WFItemDefault? itemDefault,\n  }) {\n    final result = create();\n    if (itemType != null) result.itemType = itemType;\n    if (whRatio != null) result.whRatio = whRatio;\n    if (itemDefault != null) result.itemDefault = itemDefault;\n    return result;\n  }\n\n  CampusWaterFlowItem._();\n\n  factory CampusWaterFlowItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CampusWaterFlowItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, CampusWaterFlowItem_FlowItem>\n      _CampusWaterFlowItem_FlowItemByTag = {\n    3: CampusWaterFlowItem_FlowItem.itemDefault,\n    0: CampusWaterFlowItem_FlowItem.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CampusWaterFlowItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..oo(0, [3])\n    ..aE<WFItemType>(1, _omitFieldNames ? '' : 'itemType',\n        enumValues: WFItemType.values)\n    ..aOM<$4.ItemWHRatio>(2, _omitFieldNames ? '' : 'whRatio',\n        subBuilder: $4.ItemWHRatio.create)\n    ..aOM<WFItemDefault>(3, _omitFieldNames ? '' : 'itemDefault',\n        subBuilder: WFItemDefault.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusWaterFlowItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CampusWaterFlowItem copyWith(void Function(CampusWaterFlowItem) updates) =>\n      super.copyWith((message) => updates(message as CampusWaterFlowItem))\n          as CampusWaterFlowItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CampusWaterFlowItem create() => CampusWaterFlowItem._();\n  @$core.override\n  CampusWaterFlowItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CampusWaterFlowItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CampusWaterFlowItem>(create);\n  static CampusWaterFlowItem? _defaultInstance;\n\n  @$pb.TagNumber(3)\n  CampusWaterFlowItem_FlowItem whichFlowItem() =>\n      _CampusWaterFlowItem_FlowItemByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(3)\n  void clearFlowItem() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  WFItemType get itemType => $_getN(0);\n  @$pb.TagNumber(1)\n  set itemType(WFItemType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasItemType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearItemType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $4.ItemWHRatio get whRatio => $_getN(1);\n  @$pb.TagNumber(2)\n  set whRatio($4.ItemWHRatio value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasWhRatio() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearWhRatio() => $_clearField(2);\n  @$pb.TagNumber(2)\n  $4.ItemWHRatio ensureWhRatio() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  WFItemDefault get itemDefault => $_getN(2);\n  @$pb.TagNumber(3)\n  set itemDefault(WFItemDefault value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasItemDefault() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearItemDefault() => $_clearField(3);\n  @$pb.TagNumber(3)\n  WFItemDefault ensureItemDefault() => $_ensure(2);\n}\n\nclass CardParagraph extends $pb.GeneratedMessage {\n  factory CardParagraph({\n    ModuleAdditional? additionalCard,\n    LinkNodeType? bizType,\n    $core.String? bizId,\n  }) {\n    final result = create();\n    if (additionalCard != null) result.additionalCard = additionalCard;\n    if (bizType != null) result.bizType = bizType;\n    if (bizId != null) result.bizId = bizId;\n    return result;\n  }\n\n  CardParagraph._();\n\n  factory CardParagraph.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CardParagraph.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CardParagraph',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<ModuleAdditional>(1, _omitFieldNames ? '' : 'additionalCard',\n        subBuilder: ModuleAdditional.create)\n    ..aE<LinkNodeType>(2, _omitFieldNames ? '' : 'bizType',\n        enumValues: LinkNodeType.values)\n    ..aOS(3, _omitFieldNames ? '' : 'bizId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardParagraph clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardParagraph copyWith(void Function(CardParagraph) updates) =>\n      super.copyWith((message) => updates(message as CardParagraph))\n          as CardParagraph;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CardParagraph create() => CardParagraph._();\n  @$core.override\n  CardParagraph createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CardParagraph getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CardParagraph>(create);\n  static CardParagraph? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  ModuleAdditional get additionalCard => $_getN(0);\n  @$pb.TagNumber(1)\n  set additionalCard(ModuleAdditional value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAdditionalCard() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAdditionalCard() => $_clearField(1);\n  @$pb.TagNumber(1)\n  ModuleAdditional ensureAdditionalCard() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  LinkNodeType get bizType => $_getN(1);\n  @$pb.TagNumber(2)\n  set bizType(LinkNodeType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBizType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBizType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get bizId => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set bizId($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBizId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBizId() => $_clearField(3);\n}\n\nclass CardVideoDynList extends $pb.GeneratedMessage {\n  factory CardVideoDynList({\n    $core.Iterable<DynamicItem>? list,\n    $fixnum.Int64? updateNum,\n    $core.String? historyOffset,\n    $core.String? updateBaseline,\n    $core.bool? hasMore,\n  }) {\n    final result = create();\n    if (list != null) result.list.addAll(list);\n    if (updateNum != null) result.updateNum = updateNum;\n    if (historyOffset != null) result.historyOffset = historyOffset;\n    if (updateBaseline != null) result.updateBaseline = updateBaseline;\n    if (hasMore != null) result.hasMore = hasMore;\n    return result;\n  }\n\n  CardVideoDynList._();\n\n  factory CardVideoDynList.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CardVideoDynList.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CardVideoDynList',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<DynamicItem>(1, _omitFieldNames ? '' : 'list',\n        subBuilder: DynamicItem.create)\n    ..aInt64(2, _omitFieldNames ? '' : 'updateNum')\n    ..aOS(3, _omitFieldNames ? '' : 'historyOffset')\n    ..aOS(4, _omitFieldNames ? '' : 'updateBaseline')\n    ..aOB(5, _omitFieldNames ? '' : 'hasMore')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardVideoDynList clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardVideoDynList copyWith(void Function(CardVideoDynList) updates) =>\n      super.copyWith((message) => updates(message as CardVideoDynList))\n          as CardVideoDynList;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CardVideoDynList create() => CardVideoDynList._();\n  @$core.override\n  CardVideoDynList createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CardVideoDynList getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CardVideoDynList>(create);\n  static CardVideoDynList? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<DynamicItem> get list => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get updateNum => $_getI64(1);\n  @$pb.TagNumber(2)\n  set updateNum($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUpdateNum() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUpdateNum() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get historyOffset => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set historyOffset($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasHistoryOffset() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearHistoryOffset() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get updateBaseline => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set updateBaseline($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUpdateBaseline() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUpdateBaseline() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.bool get hasMore => $_getBF(4);\n  @$pb.TagNumber(5)\n  set hasMore($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasHasMore() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearHasMore() => $_clearField(5);\n}\n\nclass CardVideoFollowList extends $pb.GeneratedMessage {\n  factory CardVideoFollowList({\n    $core.String? viewAllLink,\n    $core.Iterable<FollowListItem>? list,\n  }) {\n    final result = create();\n    if (viewAllLink != null) result.viewAllLink = viewAllLink;\n    if (list != null) result.list.addAll(list);\n    return result;\n  }\n\n  CardVideoFollowList._();\n\n  factory CardVideoFollowList.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CardVideoFollowList.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CardVideoFollowList',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'viewAllLink')\n    ..pPM<FollowListItem>(2, _omitFieldNames ? '' : 'list',\n        subBuilder: FollowListItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardVideoFollowList clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardVideoFollowList copyWith(void Function(CardVideoFollowList) updates) =>\n      super.copyWith((message) => updates(message as CardVideoFollowList))\n          as CardVideoFollowList;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CardVideoFollowList create() => CardVideoFollowList._();\n  @$core.override\n  CardVideoFollowList createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CardVideoFollowList getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CardVideoFollowList>(create);\n  static CardVideoFollowList? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get viewAllLink => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set viewAllLink($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasViewAllLink() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearViewAllLink() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<FollowListItem> get list => $_getList(1);\n}\n\nclass CardVideoUpList extends $pb.GeneratedMessage {\n  factory CardVideoUpList({\n    $core.String? title,\n    $core.Iterable<UpListItem>? list,\n    $core.String? footprint,\n    $core.int? showLiveNum,\n    UpListMoreLabel? moreLabel,\n    $core.int? titleSwitch,\n    $core.bool? showMoreLabel,\n    $core.bool? showInPersonal,\n    $core.bool? showMoreButton,\n    $core.Iterable<UpListItem>? listSecond,\n    $core.bool? hasMoreList,\n    $core.String? moreListOffset,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (list != null) result.list.addAll(list);\n    if (footprint != null) result.footprint = footprint;\n    if (showLiveNum != null) result.showLiveNum = showLiveNum;\n    if (moreLabel != null) result.moreLabel = moreLabel;\n    if (titleSwitch != null) result.titleSwitch = titleSwitch;\n    if (showMoreLabel != null) result.showMoreLabel = showMoreLabel;\n    if (showInPersonal != null) result.showInPersonal = showInPersonal;\n    if (showMoreButton != null) result.showMoreButton = showMoreButton;\n    if (listSecond != null) result.listSecond.addAll(listSecond);\n    if (hasMoreList != null) result.hasMoreList = hasMoreList;\n    if (moreListOffset != null) result.moreListOffset = moreListOffset;\n    return result;\n  }\n\n  CardVideoUpList._();\n\n  factory CardVideoUpList.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CardVideoUpList.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CardVideoUpList',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..pPM<UpListItem>(2, _omitFieldNames ? '' : 'list',\n        subBuilder: UpListItem.create)\n    ..aOS(3, _omitFieldNames ? '' : 'footprint')\n    ..aI(4, _omitFieldNames ? '' : 'showLiveNum')\n    ..aOM<UpListMoreLabel>(5, _omitFieldNames ? '' : 'moreLabel',\n        subBuilder: UpListMoreLabel.create)\n    ..aI(6, _omitFieldNames ? '' : 'titleSwitch')\n    ..aOB(7, _omitFieldNames ? '' : 'showMoreLabel')\n    ..aOB(8, _omitFieldNames ? '' : 'showInPersonal')\n    ..aOB(9, _omitFieldNames ? '' : 'showMoreButton')\n    ..pPM<UpListItem>(10, _omitFieldNames ? '' : 'listSecond',\n        subBuilder: UpListItem.create)\n    ..aOB(11, _omitFieldNames ? '' : 'hasMoreList')\n    ..aOS(12, _omitFieldNames ? '' : 'moreListOffset')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardVideoUpList clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardVideoUpList copyWith(void Function(CardVideoUpList) updates) =>\n      super.copyWith((message) => updates(message as CardVideoUpList))\n          as CardVideoUpList;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CardVideoUpList create() => CardVideoUpList._();\n  @$core.override\n  CardVideoUpList createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CardVideoUpList getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CardVideoUpList>(create);\n  static CardVideoUpList? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<UpListItem> get list => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $core.String get footprint => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set footprint($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFootprint() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFootprint() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get showLiveNum => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set showLiveNum($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasShowLiveNum() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearShowLiveNum() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  UpListMoreLabel get moreLabel => $_getN(4);\n  @$pb.TagNumber(5)\n  set moreLabel(UpListMoreLabel value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasMoreLabel() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearMoreLabel() => $_clearField(5);\n  @$pb.TagNumber(5)\n  UpListMoreLabel ensureMoreLabel() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.int get titleSwitch => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set titleSwitch($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasTitleSwitch() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearTitleSwitch() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.bool get showMoreLabel => $_getBF(6);\n  @$pb.TagNumber(7)\n  set showMoreLabel($core.bool value) => $_setBool(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasShowMoreLabel() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearShowMoreLabel() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.bool get showInPersonal => $_getBF(7);\n  @$pb.TagNumber(8)\n  set showInPersonal($core.bool value) => $_setBool(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasShowInPersonal() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearShowInPersonal() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.bool get showMoreButton => $_getBF(8);\n  @$pb.TagNumber(9)\n  set showMoreButton($core.bool value) => $_setBool(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasShowMoreButton() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearShowMoreButton() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $pb.PbList<UpListItem> get listSecond => $_getList(9);\n\n  @$pb.TagNumber(11)\n  $core.bool get hasMoreList => $_getBF(10);\n  @$pb.TagNumber(11)\n  set hasMoreList($core.bool value) => $_setBool(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasHasMoreList() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearHasMoreList() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get moreListOffset => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set moreListOffset($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasMoreListOffset() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearMoreListOffset() => $_clearField(12);\n}\n\nclass ChannelInfo extends $pb.GeneratedMessage {\n  factory ChannelInfo({\n    $fixnum.Int64? channelId,\n    $core.String? channelName,\n    $core.String? desc,\n    $core.bool? isAtten,\n    $core.String? typeIcon,\n    $core.Iterable<RcmdItem>? items,\n    $core.String? icon,\n    $core.String? jumpUri,\n  }) {\n    final result = create();\n    if (channelId != null) result.channelId = channelId;\n    if (channelName != null) result.channelName = channelName;\n    if (desc != null) result.desc = desc;\n    if (isAtten != null) result.isAtten = isAtten;\n    if (typeIcon != null) result.typeIcon = typeIcon;\n    if (items != null) result.items.addAll(items);\n    if (icon != null) result.icon = icon;\n    if (jumpUri != null) result.jumpUri = jumpUri;\n    return result;\n  }\n\n  ChannelInfo._();\n\n  factory ChannelInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ChannelInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ChannelInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'channelId')\n    ..aOS(2, _omitFieldNames ? '' : 'channelName')\n    ..aOS(3, _omitFieldNames ? '' : 'desc')\n    ..aOB(4, _omitFieldNames ? '' : 'isAtten')\n    ..aOS(5, _omitFieldNames ? '' : 'typeIcon')\n    ..pPM<RcmdItem>(6, _omitFieldNames ? '' : 'items',\n        subBuilder: RcmdItem.create)\n    ..aOS(7, _omitFieldNames ? '' : 'icon')\n    ..aOS(8, _omitFieldNames ? '' : 'jumpUri')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ChannelInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ChannelInfo copyWith(void Function(ChannelInfo) updates) =>\n      super.copyWith((message) => updates(message as ChannelInfo))\n          as ChannelInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ChannelInfo create() => ChannelInfo._();\n  @$core.override\n  ChannelInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ChannelInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ChannelInfo>(create);\n  static ChannelInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get channelId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set channelId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasChannelId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearChannelId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get channelName => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set channelName($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasChannelName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearChannelName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get desc => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set desc($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDesc() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDesc() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get isAtten => $_getBF(3);\n  @$pb.TagNumber(4)\n  set isAtten($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIsAtten() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIsAtten() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get typeIcon => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set typeIcon($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasTypeIcon() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearTypeIcon() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $pb.PbList<RcmdItem> get items => $_getList(5);\n\n  @$pb.TagNumber(7)\n  $core.String get icon => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set icon($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasIcon() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearIcon() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get jumpUri => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set jumpUri($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasJumpUri() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearJumpUri() => $_clearField(8);\n}\n\nclass CmtShowItem extends $pb.GeneratedMessage {\n  factory CmtShowItem({\n    $fixnum.Int64? uid,\n    $core.String? uname,\n    $core.String? uri,\n    $core.String? comment,\n  }) {\n    final result = create();\n    if (uid != null) result.uid = uid;\n    if (uname != null) result.uname = uname;\n    if (uri != null) result.uri = uri;\n    if (comment != null) result.comment = comment;\n    return result;\n  }\n\n  CmtShowItem._();\n\n  factory CmtShowItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CmtShowItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CmtShowItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'uid')\n    ..aOS(2, _omitFieldNames ? '' : 'uname')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..aOS(4, _omitFieldNames ? '' : 'comment')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CmtShowItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CmtShowItem copyWith(void Function(CmtShowItem) updates) =>\n      super.copyWith((message) => updates(message as CmtShowItem))\n          as CmtShowItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CmtShowItem create() => CmtShowItem._();\n  @$core.override\n  CmtShowItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CmtShowItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CmtShowItem>(create);\n  static CmtShowItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get uid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set uid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get uname => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uname($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUname() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUname() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get comment => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set comment($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasComment() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearComment() => $_clearField(4);\n}\n\nclass CodeParagraph extends $pb.GeneratedMessage {\n  factory CodeParagraph({\n    $core.String? codeLang,\n    $core.String? codeContent,\n    $core.String? popupLink,\n    $core.String? barIcon,\n    $core.String? barNotice,\n    $core.String? btnText,\n  }) {\n    final result = create();\n    if (codeLang != null) result.codeLang = codeLang;\n    if (codeContent != null) result.codeContent = codeContent;\n    if (popupLink != null) result.popupLink = popupLink;\n    if (barIcon != null) result.barIcon = barIcon;\n    if (barNotice != null) result.barNotice = barNotice;\n    if (btnText != null) result.btnText = btnText;\n    return result;\n  }\n\n  CodeParagraph._();\n\n  factory CodeParagraph.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CodeParagraph.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CodeParagraph',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'codeLang')\n    ..aOS(2, _omitFieldNames ? '' : 'codeContent')\n    ..aOS(3, _omitFieldNames ? '' : 'popupLink')\n    ..aOS(4, _omitFieldNames ? '' : 'barIcon')\n    ..aOS(5, _omitFieldNames ? '' : 'barNotice')\n    ..aOS(6, _omitFieldNames ? '' : 'btnText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CodeParagraph clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CodeParagraph copyWith(void Function(CodeParagraph) updates) =>\n      super.copyWith((message) => updates(message as CodeParagraph))\n          as CodeParagraph;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CodeParagraph create() => CodeParagraph._();\n  @$core.override\n  CodeParagraph createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CodeParagraph getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CodeParagraph>(create);\n  static CodeParagraph? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get codeLang => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set codeLang($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCodeLang() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCodeLang() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get codeContent => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set codeContent($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCodeContent() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCodeContent() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get popupLink => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set popupLink($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPopupLink() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPopupLink() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get barIcon => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set barIcon($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBarIcon() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBarIcon() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get barNotice => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set barNotice($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBarNotice() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBarNotice() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get btnText => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set btnText($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasBtnText() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearBtnText() => $_clearField(6);\n}\n\nclass ColoredText extends $pb.GeneratedMessage {\n  factory ColoredText({\n    $core.String? text,\n    Colors? color,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (color != null) result.color = color;\n    return result;\n  }\n\n  ColoredText._();\n\n  factory ColoredText.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ColoredText.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ColoredText',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aOM<Colors>(2, _omitFieldNames ? '' : 'color', subBuilder: Colors.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ColoredText clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ColoredText copyWith(void Function(ColoredText) updates) =>\n      super.copyWith((message) => updates(message as ColoredText))\n          as ColoredText;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ColoredText create() => ColoredText._();\n  @$core.override\n  ColoredText createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ColoredText getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ColoredText>(create);\n  static ColoredText? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  Colors get color => $_getN(1);\n  @$pb.TagNumber(2)\n  set color(Colors value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasColor() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearColor() => $_clearField(2);\n  @$pb.TagNumber(2)\n  Colors ensureColor() => $_ensure(1);\n}\n\nclass Colors extends $pb.GeneratedMessage {\n  factory Colors({\n    $core.String? colorDay,\n    $core.String? colorNight,\n  }) {\n    final result = create();\n    if (colorDay != null) result.colorDay = colorDay;\n    if (colorNight != null) result.colorNight = colorNight;\n    return result;\n  }\n\n  Colors._();\n\n  factory Colors.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Colors.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Colors',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'colorDay')\n    ..aOS(2, _omitFieldNames ? '' : 'colorNight')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Colors clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Colors copyWith(void Function(Colors) updates) =>\n      super.copyWith((message) => updates(message as Colors)) as Colors;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Colors create() => Colors._();\n  @$core.override\n  Colors createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Colors getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Colors>(create);\n  static Colors? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get colorDay => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set colorDay($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasColorDay() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearColorDay() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get colorNight => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set colorNight($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasColorNight() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearColorNight() => $_clearField(2);\n}\n\nclass CommentDetail extends $pb.GeneratedMessage {\n  factory CommentDetail({\n    $core.bool? canModify,\n    $fixnum.Int64? status,\n  }) {\n    final result = create();\n    if (canModify != null) result.canModify = canModify;\n    if (status != null) result.status = status;\n    return result;\n  }\n\n  CommentDetail._();\n\n  factory CommentDetail.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CommentDetail.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CommentDetail',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'canModify')\n    ..aInt64(2, _omitFieldNames ? '' : 'status')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CommentDetail clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CommentDetail copyWith(void Function(CommentDetail) updates) =>\n      super.copyWith((message) => updates(message as CommentDetail))\n          as CommentDetail;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CommentDetail create() => CommentDetail._();\n  @$core.override\n  CommentDetail createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CommentDetail getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CommentDetail>(create);\n  static CommentDetail? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get canModify => $_getBF(0);\n  @$pb.TagNumber(1)\n  set canModify($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCanModify() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCanModify() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get status => $_getI64(1);\n  @$pb.TagNumber(2)\n  set status($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasStatus() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearStatus() => $_clearField(2);\n}\n\nclass CommonShareCardInfo extends $pb.GeneratedMessage {\n  factory CommonShareCardInfo({\n    $fixnum.Int64? sketchId,\n    $fixnum.Int64? bizType,\n    $fixnum.Int64? bizId,\n  }) {\n    final result = create();\n    if (sketchId != null) result.sketchId = sketchId;\n    if (bizType != null) result.bizType = bizType;\n    if (bizId != null) result.bizId = bizId;\n    return result;\n  }\n\n  CommonShareCardInfo._();\n\n  factory CommonShareCardInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CommonShareCardInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CommonShareCardInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'sketchId')\n    ..aInt64(2, _omitFieldNames ? '' : 'bizType')\n    ..aInt64(3, _omitFieldNames ? '' : 'bizId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CommonShareCardInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CommonShareCardInfo copyWith(void Function(CommonShareCardInfo) updates) =>\n      super.copyWith((message) => updates(message as CommonShareCardInfo))\n          as CommonShareCardInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CommonShareCardInfo create() => CommonShareCardInfo._();\n  @$core.override\n  CommonShareCardInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CommonShareCardInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CommonShareCardInfo>(create);\n  static CommonShareCardInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get sketchId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set sketchId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSketchId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSketchId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get bizType => $_getI64(1);\n  @$pb.TagNumber(2)\n  set bizType($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBizType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBizType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get bizId => $_getI64(2);\n  @$pb.TagNumber(3)\n  set bizId($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBizId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBizId() => $_clearField(3);\n}\n\nclass Config extends $pb.GeneratedMessage {\n  factory Config({\n    $core.bool? storyVerticalExp,\n    $fixnum.Int64? detailViewBits,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? extraRouterKvs,\n  }) {\n    final result = create();\n    if (storyVerticalExp != null) result.storyVerticalExp = storyVerticalExp;\n    if (detailViewBits != null) result.detailViewBits = detailViewBits;\n    if (extraRouterKvs != null)\n      result.extraRouterKvs.addEntries(extraRouterKvs);\n    return result;\n  }\n\n  Config._();\n\n  factory Config.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Config.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Config',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'storyVerticalExp')\n    ..aInt64(2, _omitFieldNames ? '' : 'detailViewBits')\n    ..m<$core.String, $core.String>(3, _omitFieldNames ? '' : 'extraRouterKvs',\n        entryClassName: 'Config.ExtraRouterKvsEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.dynamic.v2'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Config clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Config copyWith(void Function(Config) updates) =>\n      super.copyWith((message) => updates(message as Config)) as Config;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Config create() => Config._();\n  @$core.override\n  Config createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Config getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Config>(create);\n  static Config? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get storyVerticalExp => $_getBF(0);\n  @$pb.TagNumber(1)\n  set storyVerticalExp($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStoryVerticalExp() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStoryVerticalExp() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get detailViewBits => $_getI64(1);\n  @$pb.TagNumber(2)\n  set detailViewBits($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDetailViewBits() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDetailViewBits() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbMap<$core.String, $core.String> get extraRouterKvs => $_getMap(2);\n}\n\nclass CooperationStaffListReq extends $pb.GeneratedMessage {\n  factory CooperationStaffListReq({\n    $core.String? oid,\n  }) {\n    final result = create();\n    if (oid != null) result.oid = oid;\n    return result;\n  }\n\n  CooperationStaffListReq._();\n\n  factory CooperationStaffListReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CooperationStaffListReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CooperationStaffListReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'oid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CooperationStaffListReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CooperationStaffListReq copyWith(\n          void Function(CooperationStaffListReq) updates) =>\n      super.copyWith((message) => updates(message as CooperationStaffListReq))\n          as CooperationStaffListReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CooperationStaffListReq create() => CooperationStaffListReq._();\n  @$core.override\n  CooperationStaffListReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CooperationStaffListReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CooperationStaffListReq>(create);\n  static CooperationStaffListReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get oid => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set oid($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOid() => $_clearField(1);\n}\n\nclass CooperationStaffListResp extends $pb.GeneratedMessage {\n  factory CooperationStaffListResp({\n    $core.Iterable<CooperationUpInfo>? upList,\n  }) {\n    final result = create();\n    if (upList != null) result.upList.addAll(upList);\n    return result;\n  }\n\n  CooperationStaffListResp._();\n\n  factory CooperationStaffListResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CooperationStaffListResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CooperationStaffListResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<CooperationUpInfo>(1, _omitFieldNames ? '' : 'upList',\n        subBuilder: CooperationUpInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CooperationStaffListResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CooperationStaffListResp copyWith(\n          void Function(CooperationStaffListResp) updates) =>\n      super.copyWith((message) => updates(message as CooperationStaffListResp))\n          as CooperationStaffListResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CooperationStaffListResp create() => CooperationStaffListResp._();\n  @$core.override\n  CooperationStaffListResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CooperationStaffListResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CooperationStaffListResp>(create);\n  static CooperationStaffListResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<CooperationUpInfo> get upList => $_getList(0);\n}\n\nclass CooperationUpInfo extends $pb.GeneratedMessage {\n  factory CooperationUpInfo({\n    BasicUserInfoV2? userInfo,\n    $core.String? upRole,\n  }) {\n    final result = create();\n    if (userInfo != null) result.userInfo = userInfo;\n    if (upRole != null) result.upRole = upRole;\n    return result;\n  }\n\n  CooperationUpInfo._();\n\n  factory CooperationUpInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CooperationUpInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CooperationUpInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<BasicUserInfoV2>(1, _omitFieldNames ? '' : 'userInfo',\n        subBuilder: BasicUserInfoV2.create)\n    ..aOS(2, _omitFieldNames ? '' : 'upRole')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CooperationUpInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CooperationUpInfo copyWith(void Function(CooperationUpInfo) updates) =>\n      super.copyWith((message) => updates(message as CooperationUpInfo))\n          as CooperationUpInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CooperationUpInfo create() => CooperationUpInfo._();\n  @$core.override\n  CooperationUpInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CooperationUpInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CooperationUpInfo>(create);\n  static CooperationUpInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  BasicUserInfoV2 get userInfo => $_getN(0);\n  @$pb.TagNumber(1)\n  set userInfo(BasicUserInfoV2 value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUserInfo() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUserInfo() => $_clearField(1);\n  @$pb.TagNumber(1)\n  BasicUserInfoV2 ensureUserInfo() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get upRole => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set upRole($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUpRole() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUpRole() => $_clearField(2);\n}\n\nclass CoverIconWithText extends $pb.GeneratedMessage {\n  factory CoverIconWithText({\n    CoverIcon? icon,\n    $core.String? text,\n    $core.bool? iconChecked,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (text != null) result.text = text;\n    if (iconChecked != null) result.iconChecked = iconChecked;\n    return result;\n  }\n\n  CoverIconWithText._();\n\n  factory CoverIconWithText.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CoverIconWithText.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CoverIconWithText',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aE<CoverIcon>(1, _omitFieldNames ? '' : 'icon',\n        enumValues: CoverIcon.values)\n    ..aOS(2, _omitFieldNames ? '' : 'text')\n    ..aOB(3, _omitFieldNames ? '' : 'iconChecked')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CoverIconWithText clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CoverIconWithText copyWith(void Function(CoverIconWithText) updates) =>\n      super.copyWith((message) => updates(message as CoverIconWithText))\n          as CoverIconWithText;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CoverIconWithText create() => CoverIconWithText._();\n  @$core.override\n  CoverIconWithText createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CoverIconWithText getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CoverIconWithText>(create);\n  static CoverIconWithText? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  CoverIcon get icon => $_getN(0);\n  @$pb.TagNumber(1)\n  set icon(CoverIcon value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get iconChecked => $_getBF(2);\n  @$pb.TagNumber(3)\n  set iconChecked($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIconChecked() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIconChecked() => $_clearField(3);\n}\n\nclass CreationClassification extends $pb.GeneratedMessage {\n  factory CreationClassification({\n    $core.String? classificationName,\n    $fixnum.Int64? count,\n    $core.String? classificationType,\n    $core.bool? isChosen,\n  }) {\n    final result = create();\n    if (classificationName != null)\n      result.classificationName = classificationName;\n    if (count != null) result.count = count;\n    if (classificationType != null)\n      result.classificationType = classificationType;\n    if (isChosen != null) result.isChosen = isChosen;\n    return result;\n  }\n\n  CreationClassification._();\n\n  factory CreationClassification.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CreationClassification.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CreationClassification',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'classificationName')\n    ..aInt64(2, _omitFieldNames ? '' : 'count')\n    ..aOS(3, _omitFieldNames ? '' : 'classificationType')\n    ..aOB(4, _omitFieldNames ? '' : 'isChosen')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CreationClassification clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CreationClassification copyWith(\n          void Function(CreationClassification) updates) =>\n      super.copyWith((message) => updates(message as CreationClassification))\n          as CreationClassification;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CreationClassification create() => CreationClassification._();\n  @$core.override\n  CreationClassification createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CreationClassification getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CreationClassification>(create);\n  static CreationClassification? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get classificationName => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set classificationName($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasClassificationName() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearClassificationName() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get count => $_getI64(1);\n  @$pb.TagNumber(2)\n  set count($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCount() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCount() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get classificationType => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set classificationType($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasClassificationType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearClassificationType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get isChosen => $_getBF(3);\n  @$pb.TagNumber(4)\n  set isChosen($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIsChosen() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIsChosen() => $_clearField(4);\n}\n\nclass CreationItemAction extends $pb.GeneratedMessage {\n  factory CreationItemAction({\n    $core.String? icon,\n    $core.String? actionName,\n    CreationItemAction_CreationAction? actionType,\n    $core.String? jumpUrl,\n    $fixnum.Int64? remainEditTimes,\n    ThreePointDefaultToast? confirmationToast,\n    ThreePointVisibilityChange? visibilityChange,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (actionName != null) result.actionName = actionName;\n    if (actionType != null) result.actionType = actionType;\n    if (jumpUrl != null) result.jumpUrl = jumpUrl;\n    if (remainEditTimes != null) result.remainEditTimes = remainEditTimes;\n    if (confirmationToast != null) result.confirmationToast = confirmationToast;\n    if (visibilityChange != null) result.visibilityChange = visibilityChange;\n    return result;\n  }\n\n  CreationItemAction._();\n\n  factory CreationItemAction.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CreationItemAction.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CreationItemAction',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'actionName')\n    ..aE<CreationItemAction_CreationAction>(\n        3, _omitFieldNames ? '' : 'actionType',\n        enumValues: CreationItemAction_CreationAction.values)\n    ..aOS(4, _omitFieldNames ? '' : 'jumpUrl')\n    ..aInt64(5, _omitFieldNames ? '' : 'remainEditTimes')\n    ..aOM<ThreePointDefaultToast>(6, _omitFieldNames ? '' : 'confirmationToast',\n        subBuilder: ThreePointDefaultToast.create)\n    ..aOM<ThreePointVisibilityChange>(\n        7, _omitFieldNames ? '' : 'visibilityChange',\n        subBuilder: ThreePointVisibilityChange.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CreationItemAction clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CreationItemAction copyWith(void Function(CreationItemAction) updates) =>\n      super.copyWith((message) => updates(message as CreationItemAction))\n          as CreationItemAction;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CreationItemAction create() => CreationItemAction._();\n  @$core.override\n  CreationItemAction createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CreationItemAction getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CreationItemAction>(create);\n  static CreationItemAction? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get actionName => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set actionName($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasActionName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearActionName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  CreationItemAction_CreationAction get actionType => $_getN(2);\n  @$pb.TagNumber(3)\n  set actionType(CreationItemAction_CreationAction value) =>\n      $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasActionType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearActionType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get jumpUrl => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set jumpUrl($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasJumpUrl() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearJumpUrl() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get remainEditTimes => $_getI64(4);\n  @$pb.TagNumber(5)\n  set remainEditTimes($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasRemainEditTimes() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearRemainEditTimes() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  ThreePointDefaultToast get confirmationToast => $_getN(5);\n  @$pb.TagNumber(6)\n  set confirmationToast(ThreePointDefaultToast value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasConfirmationToast() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearConfirmationToast() => $_clearField(6);\n  @$pb.TagNumber(6)\n  ThreePointDefaultToast ensureConfirmationToast() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  ThreePointVisibilityChange get visibilityChange => $_getN(6);\n  @$pb.TagNumber(7)\n  set visibilityChange(ThreePointVisibilityChange value) =>\n      $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasVisibilityChange() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearVisibilityChange() => $_clearField(7);\n  @$pb.TagNumber(7)\n  ThreePointVisibilityChange ensureVisibilityChange() => $_ensure(6);\n}\n\nclass CreationSortType extends $pb.GeneratedMessage {\n  factory CreationSortType({\n    $core.String? sortName,\n    $core.String? sortType,\n    $core.bool? isChosen,\n  }) {\n    final result = create();\n    if (sortName != null) result.sortName = sortName;\n    if (sortType != null) result.sortType = sortType;\n    if (isChosen != null) result.isChosen = isChosen;\n    return result;\n  }\n\n  CreationSortType._();\n\n  factory CreationSortType.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CreationSortType.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CreationSortType',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'sortName')\n    ..aOS(2, _omitFieldNames ? '' : 'sortType')\n    ..aOB(3, _omitFieldNames ? '' : 'isChosen')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CreationSortType clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CreationSortType copyWith(void Function(CreationSortType) updates) =>\n      super.copyWith((message) => updates(message as CreationSortType))\n          as CreationSortType;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CreationSortType create() => CreationSortType._();\n  @$core.override\n  CreationSortType createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CreationSortType getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CreationSortType>(create);\n  static CreationSortType? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get sortName => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set sortName($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSortName() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSortName() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get sortType => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set sortType($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSortType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSortType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get isChosen => $_getBF(2);\n  @$pb.TagNumber(3)\n  set isChosen($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIsChosen() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIsChosen() => $_clearField(3);\n}\n\nclass DecoCardFan extends $pb.GeneratedMessage {\n  factory DecoCardFan({\n    $core.int? isFan,\n    $core.int? number,\n    $core.String? numberStr,\n    $core.String? color,\n    DecoCardFanNumColorFormat? colorFormat,\n    $core.String? numPrefix,\n  }) {\n    final result = create();\n    if (isFan != null) result.isFan = isFan;\n    if (number != null) result.number = number;\n    if (numberStr != null) result.numberStr = numberStr;\n    if (color != null) result.color = color;\n    if (colorFormat != null) result.colorFormat = colorFormat;\n    if (numPrefix != null) result.numPrefix = numPrefix;\n    return result;\n  }\n\n  DecoCardFan._();\n\n  factory DecoCardFan.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DecoCardFan.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DecoCardFan',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'isFan')\n    ..aI(2, _omitFieldNames ? '' : 'number')\n    ..aOS(3, _omitFieldNames ? '' : 'numberStr')\n    ..aOS(4, _omitFieldNames ? '' : 'color')\n    ..aOM<DecoCardFanNumColorFormat>(5, _omitFieldNames ? '' : 'colorFormat',\n        subBuilder: DecoCardFanNumColorFormat.create)\n    ..aOS(6, _omitFieldNames ? '' : 'numPrefix')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DecoCardFan clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DecoCardFan copyWith(void Function(DecoCardFan) updates) =>\n      super.copyWith((message) => updates(message as DecoCardFan))\n          as DecoCardFan;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DecoCardFan create() => DecoCardFan._();\n  @$core.override\n  DecoCardFan createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DecoCardFan getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DecoCardFan>(create);\n  static DecoCardFan? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get isFan => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set isFan($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIsFan() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIsFan() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get number => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set number($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasNumber() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearNumber() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get numberStr => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set numberStr($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasNumberStr() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearNumberStr() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get color => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set color($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasColor() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearColor() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  DecoCardFanNumColorFormat get colorFormat => $_getN(4);\n  @$pb.TagNumber(5)\n  set colorFormat(DecoCardFanNumColorFormat value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasColorFormat() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearColorFormat() => $_clearField(5);\n  @$pb.TagNumber(5)\n  DecoCardFanNumColorFormat ensureColorFormat() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.String get numPrefix => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set numPrefix($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasNumPrefix() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearNumPrefix() => $_clearField(6);\n}\n\nclass DecoCardFanNumColorFormat extends $pb.GeneratedMessage {\n  factory DecoCardFanNumColorFormat({\n    $core.String? startPoint,\n    $core.String? endPoint,\n    $core.Iterable<$core.String>? colors,\n    $core.Iterable<$fixnum.Int64>? gradients,\n  }) {\n    final result = create();\n    if (startPoint != null) result.startPoint = startPoint;\n    if (endPoint != null) result.endPoint = endPoint;\n    if (colors != null) result.colors.addAll(colors);\n    if (gradients != null) result.gradients.addAll(gradients);\n    return result;\n  }\n\n  DecoCardFanNumColorFormat._();\n\n  factory DecoCardFanNumColorFormat.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DecoCardFanNumColorFormat.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DecoCardFanNumColorFormat',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'startPoint')\n    ..aOS(2, _omitFieldNames ? '' : 'endPoint')\n    ..pPS(3, _omitFieldNames ? '' : 'colors')\n    ..p<$fixnum.Int64>(\n        4, _omitFieldNames ? '' : 'gradients', $pb.PbFieldType.K6)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DecoCardFanNumColorFormat clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DecoCardFanNumColorFormat copyWith(\n          void Function(DecoCardFanNumColorFormat) updates) =>\n      super.copyWith((message) => updates(message as DecoCardFanNumColorFormat))\n          as DecoCardFanNumColorFormat;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DecoCardFanNumColorFormat create() => DecoCardFanNumColorFormat._();\n  @$core.override\n  DecoCardFanNumColorFormat createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DecoCardFanNumColorFormat getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DecoCardFanNumColorFormat>(create);\n  static DecoCardFanNumColorFormat? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get startPoint => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set startPoint($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStartPoint() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStartPoint() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get endPoint => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set endPoint($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasEndPoint() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearEndPoint() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<$core.String> get colors => $_getList(2);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<$fixnum.Int64> get gradients => $_getList(3);\n}\n\nclass DecorateCard extends $pb.GeneratedMessage {\n  factory DecorateCard({\n    $fixnum.Int64? id,\n    $core.String? cardUrl,\n    $core.String? jumpUrl,\n    DecoCardFan? fan,\n    $5.UserCard? vasDecoCard,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (cardUrl != null) result.cardUrl = cardUrl;\n    if (jumpUrl != null) result.jumpUrl = jumpUrl;\n    if (fan != null) result.fan = fan;\n    if (vasDecoCard != null) result.vasDecoCard = vasDecoCard;\n    return result;\n  }\n\n  DecorateCard._();\n\n  factory DecorateCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DecorateCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DecorateCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'cardUrl')\n    ..aOS(3, _omitFieldNames ? '' : 'jumpUrl')\n    ..aOM<DecoCardFan>(4, _omitFieldNames ? '' : 'fan',\n        subBuilder: DecoCardFan.create)\n    ..aOM<$5.UserCard>(5, _omitFieldNames ? '' : 'vasDecoCard',\n        subBuilder: $5.UserCard.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DecorateCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DecorateCard copyWith(void Function(DecorateCard) updates) =>\n      super.copyWith((message) => updates(message as DecorateCard))\n          as DecorateCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DecorateCard create() => DecorateCard._();\n  @$core.override\n  DecorateCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DecorateCard getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DecorateCard>(create);\n  static DecorateCard? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get cardUrl => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cardUrl($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCardUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCardUrl() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get jumpUrl => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set jumpUrl($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasJumpUrl() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearJumpUrl() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  DecoCardFan get fan => $_getN(3);\n  @$pb.TagNumber(4)\n  set fan(DecoCardFan value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFan() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFan() => $_clearField(4);\n  @$pb.TagNumber(4)\n  DecoCardFan ensureFan() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $5.UserCard get vasDecoCard => $_getN(4);\n  @$pb.TagNumber(5)\n  set vasDecoCard($5.UserCard value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasVasDecoCard() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearVasDecoCard() => $_clearField(5);\n  @$pb.TagNumber(5)\n  $5.UserCard ensureVasDecoCard() => $_ensure(4);\n}\n\nclass Description extends $pb.GeneratedMessage {\n  factory Description({\n    $core.String? text,\n    DescType? type,\n    $core.String? uri,\n    EmojiType? emojiType,\n    $core.String? goodsType,\n    $core.String? iconUrl,\n    $core.String? iconName,\n    $core.String? rid,\n    ModuleDescGoods? goods,\n    $core.String? origText,\n    $core.int? emojiSize,\n    EmojiSizeSpec? emojiSizeSpec,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (type != null) result.type = type;\n    if (uri != null) result.uri = uri;\n    if (emojiType != null) result.emojiType = emojiType;\n    if (goodsType != null) result.goodsType = goodsType;\n    if (iconUrl != null) result.iconUrl = iconUrl;\n    if (iconName != null) result.iconName = iconName;\n    if (rid != null) result.rid = rid;\n    if (goods != null) result.goods = goods;\n    if (origText != null) result.origText = origText;\n    if (emojiSize != null) result.emojiSize = emojiSize;\n    if (emojiSizeSpec != null) result.emojiSizeSpec = emojiSizeSpec;\n    return result;\n  }\n\n  Description._();\n\n  factory Description.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Description.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Description',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aE<DescType>(2, _omitFieldNames ? '' : 'type',\n        enumValues: DescType.values)\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..aE<EmojiType>(4, _omitFieldNames ? '' : 'emojiType',\n        enumValues: EmojiType.values)\n    ..aOS(5, _omitFieldNames ? '' : 'goodsType')\n    ..aOS(6, _omitFieldNames ? '' : 'iconUrl')\n    ..aOS(7, _omitFieldNames ? '' : 'iconName')\n    ..aOS(8, _omitFieldNames ? '' : 'rid')\n    ..aOM<ModuleDescGoods>(9, _omitFieldNames ? '' : 'goods',\n        subBuilder: ModuleDescGoods.create)\n    ..aOS(10, _omitFieldNames ? '' : 'origText')\n    ..aI(11, _omitFieldNames ? '' : 'emojiSize')\n    ..aOM<EmojiSizeSpec>(12, _omitFieldNames ? '' : 'emojiSizeSpec',\n        subBuilder: EmojiSizeSpec.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Description clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Description copyWith(void Function(Description) updates) =>\n      super.copyWith((message) => updates(message as Description))\n          as Description;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Description create() => Description._();\n  @$core.override\n  Description createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Description getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<Description>(create);\n  static Description? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  DescType get type => $_getN(1);\n  @$pb.TagNumber(2)\n  set type(DescType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  EmojiType get emojiType => $_getN(3);\n  @$pb.TagNumber(4)\n  set emojiType(EmojiType value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasEmojiType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearEmojiType() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get goodsType => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set goodsType($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasGoodsType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearGoodsType() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get iconUrl => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set iconUrl($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasIconUrl() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearIconUrl() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get iconName => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set iconName($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasIconName() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearIconName() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get rid => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set rid($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasRid() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearRid() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  ModuleDescGoods get goods => $_getN(8);\n  @$pb.TagNumber(9)\n  set goods(ModuleDescGoods value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasGoods() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearGoods() => $_clearField(9);\n  @$pb.TagNumber(9)\n  ModuleDescGoods ensureGoods() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  $core.String get origText => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set origText($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasOrigText() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearOrigText() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.int get emojiSize => $_getIZ(10);\n  @$pb.TagNumber(11)\n  set emojiSize($core.int value) => $_setSignedInt32(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasEmojiSize() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearEmojiSize() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  EmojiSizeSpec get emojiSizeSpec => $_getN(11);\n  @$pb.TagNumber(12)\n  set emojiSizeSpec(EmojiSizeSpec value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasEmojiSizeSpec() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearEmojiSizeSpec() => $_clearField(12);\n  @$pb.TagNumber(12)\n  EmojiSizeSpec ensureEmojiSizeSpec() => $_ensure(11);\n}\n\nclass Dimension extends $pb.GeneratedMessage {\n  factory Dimension({\n    $fixnum.Int64? height,\n    $fixnum.Int64? width,\n    $fixnum.Int64? rotate,\n    $core.bool? forceHorizontal,\n  }) {\n    final result = create();\n    if (height != null) result.height = height;\n    if (width != null) result.width = width;\n    if (rotate != null) result.rotate = rotate;\n    if (forceHorizontal != null) result.forceHorizontal = forceHorizontal;\n    return result;\n  }\n\n  Dimension._();\n\n  factory Dimension.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Dimension.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Dimension',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'height')\n    ..aInt64(2, _omitFieldNames ? '' : 'width')\n    ..aInt64(3, _omitFieldNames ? '' : 'rotate')\n    ..aOB(4, _omitFieldNames ? '' : 'forceHorizontal')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Dimension clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Dimension copyWith(void Function(Dimension) updates) =>\n      super.copyWith((message) => updates(message as Dimension)) as Dimension;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Dimension create() => Dimension._();\n  @$core.override\n  Dimension createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Dimension getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Dimension>(create);\n  static Dimension? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get height => $_getI64(0);\n  @$pb.TagNumber(1)\n  set height($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasHeight() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearHeight() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get width => $_getI64(1);\n  @$pb.TagNumber(2)\n  set width($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasWidth() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearWidth() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get rotate => $_getI64(2);\n  @$pb.TagNumber(3)\n  set rotate($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRotate() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRotate() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get forceHorizontal => $_getBF(3);\n  @$pb.TagNumber(4)\n  set forceHorizontal($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasForceHorizontal() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearForceHorizontal() => $_clearField(4);\n}\n\nclass DynAdditionCommonFollowReply extends $pb.GeneratedMessage {\n  factory DynAdditionCommonFollowReply({\n    AdditionalButtonStatus? status,\n  }) {\n    final result = create();\n    if (status != null) result.status = status;\n    return result;\n  }\n\n  DynAdditionCommonFollowReply._();\n\n  factory DynAdditionCommonFollowReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynAdditionCommonFollowReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynAdditionCommonFollowReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aE<AdditionalButtonStatus>(1, _omitFieldNames ? '' : 'status',\n        enumValues: AdditionalButtonStatus.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynAdditionCommonFollowReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynAdditionCommonFollowReply copyWith(\n          void Function(DynAdditionCommonFollowReply) updates) =>\n      super.copyWith(\n              (message) => updates(message as DynAdditionCommonFollowReply))\n          as DynAdditionCommonFollowReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynAdditionCommonFollowReply create() =>\n      DynAdditionCommonFollowReply._();\n  @$core.override\n  DynAdditionCommonFollowReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynAdditionCommonFollowReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynAdditionCommonFollowReply>(create);\n  static DynAdditionCommonFollowReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  AdditionalButtonStatus get status => $_getN(0);\n  @$pb.TagNumber(1)\n  set status(AdditionalButtonStatus value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStatus() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStatus() => $_clearField(1);\n}\n\nclass DynAdditionCommonFollowReq extends $pb.GeneratedMessage {\n  factory DynAdditionCommonFollowReq({\n    AdditionalButtonStatus? status,\n    $core.String? dynId,\n    $core.String? cardType,\n  }) {\n    final result = create();\n    if (status != null) result.status = status;\n    if (dynId != null) result.dynId = dynId;\n    if (cardType != null) result.cardType = cardType;\n    return result;\n  }\n\n  DynAdditionCommonFollowReq._();\n\n  factory DynAdditionCommonFollowReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynAdditionCommonFollowReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynAdditionCommonFollowReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aE<AdditionalButtonStatus>(1, _omitFieldNames ? '' : 'status',\n        enumValues: AdditionalButtonStatus.values)\n    ..aOS(2, _omitFieldNames ? '' : 'dynId')\n    ..aOS(3, _omitFieldNames ? '' : 'cardType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynAdditionCommonFollowReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynAdditionCommonFollowReq copyWith(\n          void Function(DynAdditionCommonFollowReq) updates) =>\n      super.copyWith(\n              (message) => updates(message as DynAdditionCommonFollowReq))\n          as DynAdditionCommonFollowReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynAdditionCommonFollowReq create() => DynAdditionCommonFollowReq._();\n  @$core.override\n  DynAdditionCommonFollowReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynAdditionCommonFollowReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynAdditionCommonFollowReq>(create);\n  static DynAdditionCommonFollowReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  AdditionalButtonStatus get status => $_getN(0);\n  @$pb.TagNumber(1)\n  set status(AdditionalButtonStatus value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStatus() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStatus() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get dynId => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set dynId($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDynId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDynId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get cardType => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set cardType($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCardType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCardType() => $_clearField(3);\n}\n\nclass DynAllPersonalReply extends $pb.GeneratedMessage {\n  factory DynAllPersonalReply({\n    $core.Iterable<DynamicItem>? list,\n    $core.String? offset,\n    $core.bool? hasMore,\n    $core.String? readOffset,\n    Relation? relation,\n    TopAdditionUP? additionUp,\n    $core.String? title,\n    $core.String? titleSub,\n  }) {\n    final result = create();\n    if (list != null) result.list.addAll(list);\n    if (offset != null) result.offset = offset;\n    if (hasMore != null) result.hasMore = hasMore;\n    if (readOffset != null) result.readOffset = readOffset;\n    if (relation != null) result.relation = relation;\n    if (additionUp != null) result.additionUp = additionUp;\n    if (title != null) result.title = title;\n    if (titleSub != null) result.titleSub = titleSub;\n    return result;\n  }\n\n  DynAllPersonalReply._();\n\n  factory DynAllPersonalReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynAllPersonalReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynAllPersonalReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<DynamicItem>(1, _omitFieldNames ? '' : 'list',\n        subBuilder: DynamicItem.create)\n    ..aOS(2, _omitFieldNames ? '' : 'offset')\n    ..aOB(3, _omitFieldNames ? '' : 'hasMore')\n    ..aOS(4, _omitFieldNames ? '' : 'readOffset')\n    ..aOM<Relation>(5, _omitFieldNames ? '' : 'relation',\n        subBuilder: Relation.create)\n    ..aOM<TopAdditionUP>(6, _omitFieldNames ? '' : 'additionUp',\n        subBuilder: TopAdditionUP.create)\n    ..aOS(7, _omitFieldNames ? '' : 'title')\n    ..aOS(8, _omitFieldNames ? '' : 'titleSub')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynAllPersonalReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynAllPersonalReply copyWith(void Function(DynAllPersonalReply) updates) =>\n      super.copyWith((message) => updates(message as DynAllPersonalReply))\n          as DynAllPersonalReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynAllPersonalReply create() => DynAllPersonalReply._();\n  @$core.override\n  DynAllPersonalReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynAllPersonalReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynAllPersonalReply>(create);\n  static DynAllPersonalReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<DynamicItem> get list => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.String get offset => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set offset($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOffset() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOffset() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get hasMore => $_getBF(2);\n  @$pb.TagNumber(3)\n  set hasMore($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasHasMore() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearHasMore() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get readOffset => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set readOffset($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasReadOffset() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearReadOffset() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  Relation get relation => $_getN(4);\n  @$pb.TagNumber(5)\n  set relation(Relation value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasRelation() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearRelation() => $_clearField(5);\n  @$pb.TagNumber(5)\n  Relation ensureRelation() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  TopAdditionUP get additionUp => $_getN(5);\n  @$pb.TagNumber(6)\n  set additionUp(TopAdditionUP value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasAdditionUp() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearAdditionUp() => $_clearField(6);\n  @$pb.TagNumber(6)\n  TopAdditionUP ensureAdditionUp() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $core.String get title => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set title($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasTitle() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearTitle() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get titleSub => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set titleSub($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasTitleSub() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearTitleSub() => $_clearField(8);\n}\n\nclass DynAllPersonalReq extends $pb.GeneratedMessage {\n  factory DynAllPersonalReq({\n    $fixnum.Int64? hostUid,\n    $core.String? offset,\n    $core.int? page,\n    $core.int? isPreload,\n    PlayurlParam? playurlParam,\n    $core.int? localTime,\n    $core.String? footprint,\n    $core.String? from,\n    $1.PlayerArgs? playerArgs,\n    $core.String? personalExtra,\n    AdParam? adParam,\n  }) {\n    final result = create();\n    if (hostUid != null) result.hostUid = hostUid;\n    if (offset != null) result.offset = offset;\n    if (page != null) result.page = page;\n    if (isPreload != null) result.isPreload = isPreload;\n    if (playurlParam != null) result.playurlParam = playurlParam;\n    if (localTime != null) result.localTime = localTime;\n    if (footprint != null) result.footprint = footprint;\n    if (from != null) result.from = from;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    if (personalExtra != null) result.personalExtra = personalExtra;\n    if (adParam != null) result.adParam = adParam;\n    return result;\n  }\n\n  DynAllPersonalReq._();\n\n  factory DynAllPersonalReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynAllPersonalReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynAllPersonalReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'hostUid')\n    ..aOS(2, _omitFieldNames ? '' : 'offset')\n    ..aI(3, _omitFieldNames ? '' : 'page')\n    ..aI(4, _omitFieldNames ? '' : 'isPreload')\n    ..aOM<PlayurlParam>(5, _omitFieldNames ? '' : 'playurlParam',\n        subBuilder: PlayurlParam.create)\n    ..aI(6, _omitFieldNames ? '' : 'localTime')\n    ..aOS(7, _omitFieldNames ? '' : 'footprint')\n    ..aOS(8, _omitFieldNames ? '' : 'from')\n    ..aOM<$1.PlayerArgs>(9, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $1.PlayerArgs.create)\n    ..aOS(10, _omitFieldNames ? '' : 'personalExtra')\n    ..aOM<AdParam>(11, _omitFieldNames ? '' : 'adParam',\n        subBuilder: AdParam.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynAllPersonalReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynAllPersonalReq copyWith(void Function(DynAllPersonalReq) updates) =>\n      super.copyWith((message) => updates(message as DynAllPersonalReq))\n          as DynAllPersonalReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynAllPersonalReq create() => DynAllPersonalReq._();\n  @$core.override\n  DynAllPersonalReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynAllPersonalReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynAllPersonalReq>(create);\n  static DynAllPersonalReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get hostUid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set hostUid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasHostUid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearHostUid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get offset => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set offset($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOffset() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOffset() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get page => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set page($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPage() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPage() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get isPreload => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set isPreload($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIsPreload() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIsPreload() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  PlayurlParam get playurlParam => $_getN(4);\n  @$pb.TagNumber(5)\n  set playurlParam(PlayurlParam value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPlayurlParam() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPlayurlParam() => $_clearField(5);\n  @$pb.TagNumber(5)\n  PlayurlParam ensurePlayurlParam() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.int get localTime => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set localTime($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasLocalTime() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearLocalTime() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get footprint => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set footprint($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasFootprint() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearFootprint() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get from => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set from($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasFrom() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearFrom() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $1.PlayerArgs get playerArgs => $_getN(8);\n  @$pb.TagNumber(9)\n  set playerArgs($1.PlayerArgs value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasPlayerArgs() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearPlayerArgs() => $_clearField(9);\n  @$pb.TagNumber(9)\n  $1.PlayerArgs ensurePlayerArgs() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  $core.String get personalExtra => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set personalExtra($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasPersonalExtra() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearPersonalExtra() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  AdParam get adParam => $_getN(10);\n  @$pb.TagNumber(11)\n  set adParam(AdParam value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasAdParam() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearAdParam() => $_clearField(11);\n  @$pb.TagNumber(11)\n  AdParam ensureAdParam() => $_ensure(10);\n}\n\nclass DynAllReply extends $pb.GeneratedMessage {\n  factory DynAllReply({\n    DynamicList? dynamicList,\n    CardVideoUpList? upList,\n    TopicList? topicList,\n    Unfollow? unfollow,\n    DynRegionRcmd? regionRcmd,\n    Config? config,\n    FeedSortConfig? sortConfig,\n  }) {\n    final result = create();\n    if (dynamicList != null) result.dynamicList = dynamicList;\n    if (upList != null) result.upList = upList;\n    if (topicList != null) result.topicList = topicList;\n    if (unfollow != null) result.unfollow = unfollow;\n    if (regionRcmd != null) result.regionRcmd = regionRcmd;\n    if (config != null) result.config = config;\n    if (sortConfig != null) result.sortConfig = sortConfig;\n    return result;\n  }\n\n  DynAllReply._();\n\n  factory DynAllReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynAllReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynAllReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<DynamicList>(1, _omitFieldNames ? '' : 'dynamicList',\n        subBuilder: DynamicList.create)\n    ..aOM<CardVideoUpList>(2, _omitFieldNames ? '' : 'upList',\n        subBuilder: CardVideoUpList.create)\n    ..aOM<TopicList>(3, _omitFieldNames ? '' : 'topicList',\n        subBuilder: TopicList.create)\n    ..aOM<Unfollow>(4, _omitFieldNames ? '' : 'unfollow',\n        subBuilder: Unfollow.create)\n    ..aOM<DynRegionRcmd>(5, _omitFieldNames ? '' : 'regionRcmd',\n        subBuilder: DynRegionRcmd.create)\n    ..aOM<Config>(6, _omitFieldNames ? '' : 'config', subBuilder: Config.create)\n    ..aOM<FeedSortConfig>(7, _omitFieldNames ? '' : 'sortConfig',\n        subBuilder: FeedSortConfig.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynAllReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynAllReply copyWith(void Function(DynAllReply) updates) =>\n      super.copyWith((message) => updates(message as DynAllReply))\n          as DynAllReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynAllReply create() => DynAllReply._();\n  @$core.override\n  DynAllReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynAllReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynAllReply>(create);\n  static DynAllReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  DynamicList get dynamicList => $_getN(0);\n  @$pb.TagNumber(1)\n  set dynamicList(DynamicList value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDynamicList() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDynamicList() => $_clearField(1);\n  @$pb.TagNumber(1)\n  DynamicList ensureDynamicList() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  CardVideoUpList get upList => $_getN(1);\n  @$pb.TagNumber(2)\n  set upList(CardVideoUpList value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUpList() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUpList() => $_clearField(2);\n  @$pb.TagNumber(2)\n  CardVideoUpList ensureUpList() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  TopicList get topicList => $_getN(2);\n  @$pb.TagNumber(3)\n  set topicList(TopicList value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTopicList() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTopicList() => $_clearField(3);\n  @$pb.TagNumber(3)\n  TopicList ensureTopicList() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  Unfollow get unfollow => $_getN(3);\n  @$pb.TagNumber(4)\n  set unfollow(Unfollow value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUnfollow() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUnfollow() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Unfollow ensureUnfollow() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  DynRegionRcmd get regionRcmd => $_getN(4);\n  @$pb.TagNumber(5)\n  set regionRcmd(DynRegionRcmd value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasRegionRcmd() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearRegionRcmd() => $_clearField(5);\n  @$pb.TagNumber(5)\n  DynRegionRcmd ensureRegionRcmd() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  Config get config => $_getN(5);\n  @$pb.TagNumber(6)\n  set config(Config value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasConfig() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearConfig() => $_clearField(6);\n  @$pb.TagNumber(6)\n  Config ensureConfig() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  FeedSortConfig get sortConfig => $_getN(6);\n  @$pb.TagNumber(7)\n  set sortConfig(FeedSortConfig value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasSortConfig() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearSortConfig() => $_clearField(7);\n  @$pb.TagNumber(7)\n  FeedSortConfig ensureSortConfig() => $_ensure(6);\n}\n\nclass DynAllReq extends $pb.GeneratedMessage {\n  factory DynAllReq({\n    $core.String? updateBaseline,\n    $core.String? offset,\n    $core.int? page,\n    Refresh? refreshType,\n    PlayurlParam? playurlParam,\n    $core.String? assistBaseline,\n    $core.int? localTime,\n    RcmdUPsParam? rcmdUpsParam,\n    AdParam? adParam,\n    $core.int? coldStart,\n    $core.String? from,\n    $1.PlayerArgs? playerArgs,\n    $fixnum.Int64? tabRecallUid,\n    StyleType? tabRecallType,\n    $core.String? tabRecallExtra,\n    FeedSortOptionReq? reqSortOption,\n    $core.String? bubbleRecallExtraWhenShow,\n  }) {\n    final result = create();\n    if (updateBaseline != null) result.updateBaseline = updateBaseline;\n    if (offset != null) result.offset = offset;\n    if (page != null) result.page = page;\n    if (refreshType != null) result.refreshType = refreshType;\n    if (playurlParam != null) result.playurlParam = playurlParam;\n    if (assistBaseline != null) result.assistBaseline = assistBaseline;\n    if (localTime != null) result.localTime = localTime;\n    if (rcmdUpsParam != null) result.rcmdUpsParam = rcmdUpsParam;\n    if (adParam != null) result.adParam = adParam;\n    if (coldStart != null) result.coldStart = coldStart;\n    if (from != null) result.from = from;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    if (tabRecallUid != null) result.tabRecallUid = tabRecallUid;\n    if (tabRecallType != null) result.tabRecallType = tabRecallType;\n    if (tabRecallExtra != null) result.tabRecallExtra = tabRecallExtra;\n    if (reqSortOption != null) result.reqSortOption = reqSortOption;\n    if (bubbleRecallExtraWhenShow != null)\n      result.bubbleRecallExtraWhenShow = bubbleRecallExtraWhenShow;\n    return result;\n  }\n\n  DynAllReq._();\n\n  factory DynAllReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynAllReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynAllReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'updateBaseline')\n    ..aOS(2, _omitFieldNames ? '' : 'offset')\n    ..aI(3, _omitFieldNames ? '' : 'page')\n    ..aE<Refresh>(4, _omitFieldNames ? '' : 'refreshType',\n        enumValues: Refresh.values)\n    ..aOM<PlayurlParam>(5, _omitFieldNames ? '' : 'playurlParam',\n        subBuilder: PlayurlParam.create)\n    ..aOS(6, _omitFieldNames ? '' : 'assistBaseline')\n    ..aI(7, _omitFieldNames ? '' : 'localTime')\n    ..aOM<RcmdUPsParam>(8, _omitFieldNames ? '' : 'rcmdUpsParam',\n        subBuilder: RcmdUPsParam.create)\n    ..aOM<AdParam>(9, _omitFieldNames ? '' : 'adParam',\n        subBuilder: AdParam.create)\n    ..aI(10, _omitFieldNames ? '' : 'coldStart')\n    ..aOS(11, _omitFieldNames ? '' : 'from')\n    ..aOM<$1.PlayerArgs>(12, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $1.PlayerArgs.create)\n    ..aInt64(13, _omitFieldNames ? '' : 'tabRecallUid')\n    ..aE<StyleType>(14, _omitFieldNames ? '' : 'tabRecallType',\n        enumValues: StyleType.values)\n    ..aOS(15, _omitFieldNames ? '' : 'tabRecallExtra')\n    ..aOM<FeedSortOptionReq>(16, _omitFieldNames ? '' : 'reqSortOption',\n        subBuilder: FeedSortOptionReq.create)\n    ..aOS(17, _omitFieldNames ? '' : 'bubbleRecallExtraWhenShow')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynAllReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynAllReq copyWith(void Function(DynAllReq) updates) =>\n      super.copyWith((message) => updates(message as DynAllReq)) as DynAllReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynAllReq create() => DynAllReq._();\n  @$core.override\n  DynAllReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynAllReq getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DynAllReq>(create);\n  static DynAllReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get updateBaseline => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set updateBaseline($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUpdateBaseline() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUpdateBaseline() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get offset => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set offset($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOffset() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOffset() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get page => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set page($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPage() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPage() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  Refresh get refreshType => $_getN(3);\n  @$pb.TagNumber(4)\n  set refreshType(Refresh value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasRefreshType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearRefreshType() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  PlayurlParam get playurlParam => $_getN(4);\n  @$pb.TagNumber(5)\n  set playurlParam(PlayurlParam value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPlayurlParam() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPlayurlParam() => $_clearField(5);\n  @$pb.TagNumber(5)\n  PlayurlParam ensurePlayurlParam() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.String get assistBaseline => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set assistBaseline($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasAssistBaseline() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearAssistBaseline() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get localTime => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set localTime($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasLocalTime() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearLocalTime() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  RcmdUPsParam get rcmdUpsParam => $_getN(7);\n  @$pb.TagNumber(8)\n  set rcmdUpsParam(RcmdUPsParam value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasRcmdUpsParam() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearRcmdUpsParam() => $_clearField(8);\n  @$pb.TagNumber(8)\n  RcmdUPsParam ensureRcmdUpsParam() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  AdParam get adParam => $_getN(8);\n  @$pb.TagNumber(9)\n  set adParam(AdParam value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasAdParam() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearAdParam() => $_clearField(9);\n  @$pb.TagNumber(9)\n  AdParam ensureAdParam() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  $core.int get coldStart => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set coldStart($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasColdStart() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearColdStart() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get from => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set from($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasFrom() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearFrom() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $1.PlayerArgs get playerArgs => $_getN(11);\n  @$pb.TagNumber(12)\n  set playerArgs($1.PlayerArgs value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasPlayerArgs() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearPlayerArgs() => $_clearField(12);\n  @$pb.TagNumber(12)\n  $1.PlayerArgs ensurePlayerArgs() => $_ensure(11);\n\n  @$pb.TagNumber(13)\n  $fixnum.Int64 get tabRecallUid => $_getI64(12);\n  @$pb.TagNumber(13)\n  set tabRecallUid($fixnum.Int64 value) => $_setInt64(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasTabRecallUid() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearTabRecallUid() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  StyleType get tabRecallType => $_getN(13);\n  @$pb.TagNumber(14)\n  set tabRecallType(StyleType value) => $_setField(14, value);\n  @$pb.TagNumber(14)\n  $core.bool hasTabRecallType() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearTabRecallType() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $core.String get tabRecallExtra => $_getSZ(14);\n  @$pb.TagNumber(15)\n  set tabRecallExtra($core.String value) => $_setString(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasTabRecallExtra() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearTabRecallExtra() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  FeedSortOptionReq get reqSortOption => $_getN(15);\n  @$pb.TagNumber(16)\n  set reqSortOption(FeedSortOptionReq value) => $_setField(16, value);\n  @$pb.TagNumber(16)\n  $core.bool hasReqSortOption() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearReqSortOption() => $_clearField(16);\n  @$pb.TagNumber(16)\n  FeedSortOptionReq ensureReqSortOption() => $_ensure(15);\n\n  @$pb.TagNumber(17)\n  $core.String get bubbleRecallExtraWhenShow => $_getSZ(16);\n  @$pb.TagNumber(17)\n  set bubbleRecallExtraWhenShow($core.String value) => $_setString(16, value);\n  @$pb.TagNumber(17)\n  $core.bool hasBubbleRecallExtraWhenShow() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearBubbleRecallExtraWhenShow() => $_clearField(17);\n}\n\nclass DynAllUpdOffsetReq extends $pb.GeneratedMessage {\n  factory DynAllUpdOffsetReq({\n    $fixnum.Int64? hostUid,\n    $core.String? readOffset,\n    $core.String? footprint,\n    $core.String? personalExtra,\n  }) {\n    final result = create();\n    if (hostUid != null) result.hostUid = hostUid;\n    if (readOffset != null) result.readOffset = readOffset;\n    if (footprint != null) result.footprint = footprint;\n    if (personalExtra != null) result.personalExtra = personalExtra;\n    return result;\n  }\n\n  DynAllUpdOffsetReq._();\n\n  factory DynAllUpdOffsetReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynAllUpdOffsetReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynAllUpdOffsetReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'hostUid')\n    ..aOS(2, _omitFieldNames ? '' : 'readOffset')\n    ..aOS(3, _omitFieldNames ? '' : 'footprint')\n    ..aOS(4, _omitFieldNames ? '' : 'personalExtra')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynAllUpdOffsetReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynAllUpdOffsetReq copyWith(void Function(DynAllUpdOffsetReq) updates) =>\n      super.copyWith((message) => updates(message as DynAllUpdOffsetReq))\n          as DynAllUpdOffsetReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynAllUpdOffsetReq create() => DynAllUpdOffsetReq._();\n  @$core.override\n  DynAllUpdOffsetReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynAllUpdOffsetReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynAllUpdOffsetReq>(create);\n  static DynAllUpdOffsetReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get hostUid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set hostUid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasHostUid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearHostUid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get readOffset => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set readOffset($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasReadOffset() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearReadOffset() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get footprint => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set footprint($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFootprint() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFootprint() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get personalExtra => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set personalExtra($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPersonalExtra() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPersonalExtra() => $_clearField(4);\n}\n\nclass DynDetailReply extends $pb.GeneratedMessage {\n  factory DynDetailReply({\n    DynamicItem? item,\n  }) {\n    final result = create();\n    if (item != null) result.item = item;\n    return result;\n  }\n\n  DynDetailReply._();\n\n  factory DynDetailReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynDetailReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynDetailReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<DynamicItem>(1, _omitFieldNames ? '' : 'item',\n        subBuilder: DynamicItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynDetailReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynDetailReply copyWith(void Function(DynDetailReply) updates) =>\n      super.copyWith((message) => updates(message as DynDetailReply))\n          as DynDetailReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynDetailReply create() => DynDetailReply._();\n  @$core.override\n  DynDetailReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynDetailReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynDetailReply>(create);\n  static DynDetailReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  DynamicItem get item => $_getN(0);\n  @$pb.TagNumber(1)\n  set item(DynamicItem value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasItem() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearItem() => $_clearField(1);\n  @$pb.TagNumber(1)\n  DynamicItem ensureItem() => $_ensure(0);\n}\n\nclass DynDetailReq extends $pb.GeneratedMessage {\n  factory DynDetailReq({\n    $fixnum.Int64? uid,\n    $core.String? dynamicId,\n    $fixnum.Int64? dynType,\n    $fixnum.Int64? rid,\n    AdParam? adParam,\n    $core.String? from,\n    $1.PlayerArgs? playerArgs,\n    $core.String? shareId,\n    $core.int? shareMode,\n    $core.int? localTime,\n    $core.String? pattern,\n    Config? config,\n  }) {\n    final result = create();\n    if (uid != null) result.uid = uid;\n    if (dynamicId != null) result.dynamicId = dynamicId;\n    if (dynType != null) result.dynType = dynType;\n    if (rid != null) result.rid = rid;\n    if (adParam != null) result.adParam = adParam;\n    if (from != null) result.from = from;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    if (shareId != null) result.shareId = shareId;\n    if (shareMode != null) result.shareMode = shareMode;\n    if (localTime != null) result.localTime = localTime;\n    if (pattern != null) result.pattern = pattern;\n    if (config != null) result.config = config;\n    return result;\n  }\n\n  DynDetailReq._();\n\n  factory DynDetailReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynDetailReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynDetailReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'uid')\n    ..aOS(2, _omitFieldNames ? '' : 'dynamicId')\n    ..aInt64(3, _omitFieldNames ? '' : 'dynType')\n    ..aInt64(4, _omitFieldNames ? '' : 'rid')\n    ..aOM<AdParam>(5, _omitFieldNames ? '' : 'adParam',\n        subBuilder: AdParam.create)\n    ..aOS(6, _omitFieldNames ? '' : 'from')\n    ..aOM<$1.PlayerArgs>(7, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $1.PlayerArgs.create)\n    ..aOS(8, _omitFieldNames ? '' : 'shareId')\n    ..aI(9, _omitFieldNames ? '' : 'shareMode')\n    ..aI(10, _omitFieldNames ? '' : 'localTime')\n    ..aOS(11, _omitFieldNames ? '' : 'pattern')\n    ..aOM<Config>(12, _omitFieldNames ? '' : 'config',\n        subBuilder: Config.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynDetailReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynDetailReq copyWith(void Function(DynDetailReq) updates) =>\n      super.copyWith((message) => updates(message as DynDetailReq))\n          as DynDetailReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynDetailReq create() => DynDetailReq._();\n  @$core.override\n  DynDetailReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynDetailReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynDetailReq>(create);\n  static DynDetailReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get uid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set uid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get dynamicId => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set dynamicId($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDynamicId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDynamicId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get dynType => $_getI64(2);\n  @$pb.TagNumber(3)\n  set dynType($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDynType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDynType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get rid => $_getI64(3);\n  @$pb.TagNumber(4)\n  set rid($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasRid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearRid() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  AdParam get adParam => $_getN(4);\n  @$pb.TagNumber(5)\n  set adParam(AdParam value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasAdParam() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearAdParam() => $_clearField(5);\n  @$pb.TagNumber(5)\n  AdParam ensureAdParam() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.String get from => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set from($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasFrom() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearFrom() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $1.PlayerArgs get playerArgs => $_getN(6);\n  @$pb.TagNumber(7)\n  set playerArgs($1.PlayerArgs value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasPlayerArgs() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearPlayerArgs() => $_clearField(7);\n  @$pb.TagNumber(7)\n  $1.PlayerArgs ensurePlayerArgs() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  $core.String get shareId => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set shareId($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasShareId() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearShareId() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.int get shareMode => $_getIZ(8);\n  @$pb.TagNumber(9)\n  set shareMode($core.int value) => $_setSignedInt32(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasShareMode() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearShareMode() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.int get localTime => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set localTime($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasLocalTime() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearLocalTime() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get pattern => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set pattern($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasPattern() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearPattern() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  Config get config => $_getN(11);\n  @$pb.TagNumber(12)\n  set config(Config value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasConfig() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearConfig() => $_clearField(12);\n  @$pb.TagNumber(12)\n  Config ensureConfig() => $_ensure(11);\n}\n\nclass DynDetailsReply extends $pb.GeneratedMessage {\n  factory DynDetailsReply({\n    $core.Iterable<DynamicItem>? list,\n  }) {\n    final result = create();\n    if (list != null) result.list.addAll(list);\n    return result;\n  }\n\n  DynDetailsReply._();\n\n  factory DynDetailsReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynDetailsReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynDetailsReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<DynamicItem>(1, _omitFieldNames ? '' : 'list',\n        subBuilder: DynamicItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynDetailsReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynDetailsReply copyWith(void Function(DynDetailsReply) updates) =>\n      super.copyWith((message) => updates(message as DynDetailsReply))\n          as DynDetailsReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynDetailsReply create() => DynDetailsReply._();\n  @$core.override\n  DynDetailsReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynDetailsReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynDetailsReply>(create);\n  static DynDetailsReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<DynamicItem> get list => $_getList(0);\n}\n\nclass DynDetailsReq extends $pb.GeneratedMessage {\n  factory DynDetailsReq({\n    $core.String? dynamicIds,\n    PlayurlParam? playurlParam,\n    $core.int? localTime,\n    $1.PlayerArgs? playerArgs,\n    Config? config,\n  }) {\n    final result = create();\n    if (dynamicIds != null) result.dynamicIds = dynamicIds;\n    if (playurlParam != null) result.playurlParam = playurlParam;\n    if (localTime != null) result.localTime = localTime;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    if (config != null) result.config = config;\n    return result;\n  }\n\n  DynDetailsReq._();\n\n  factory DynDetailsReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynDetailsReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynDetailsReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'dynamicIds')\n    ..aOM<PlayurlParam>(2, _omitFieldNames ? '' : 'playurlParam',\n        subBuilder: PlayurlParam.create)\n    ..aI(3, _omitFieldNames ? '' : 'localTime')\n    ..aOM<$1.PlayerArgs>(4, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $1.PlayerArgs.create)\n    ..aOM<Config>(5, _omitFieldNames ? '' : 'config', subBuilder: Config.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynDetailsReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynDetailsReq copyWith(void Function(DynDetailsReq) updates) =>\n      super.copyWith((message) => updates(message as DynDetailsReq))\n          as DynDetailsReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynDetailsReq create() => DynDetailsReq._();\n  @$core.override\n  DynDetailsReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynDetailsReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynDetailsReq>(create);\n  static DynDetailsReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get dynamicIds => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set dynamicIds($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDynamicIds() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDynamicIds() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  PlayurlParam get playurlParam => $_getN(1);\n  @$pb.TagNumber(2)\n  set playurlParam(PlayurlParam value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPlayurlParam() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPlayurlParam() => $_clearField(2);\n  @$pb.TagNumber(2)\n  PlayurlParam ensurePlayurlParam() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.int get localTime => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set localTime($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLocalTime() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLocalTime() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $1.PlayerArgs get playerArgs => $_getN(3);\n  @$pb.TagNumber(4)\n  set playerArgs($1.PlayerArgs value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPlayerArgs() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPlayerArgs() => $_clearField(4);\n  @$pb.TagNumber(4)\n  $1.PlayerArgs ensurePlayerArgs() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  Config get config => $_getN(4);\n  @$pb.TagNumber(5)\n  set config(Config value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasConfig() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearConfig() => $_clearField(5);\n  @$pb.TagNumber(5)\n  Config ensureConfig() => $_ensure(4);\n}\n\nclass DynFakeCardReply extends $pb.GeneratedMessage {\n  factory DynFakeCardReply({\n    DynamicItem? item,\n  }) {\n    final result = create();\n    if (item != null) result.item = item;\n    return result;\n  }\n\n  DynFakeCardReply._();\n\n  factory DynFakeCardReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynFakeCardReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynFakeCardReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<DynamicItem>(1, _omitFieldNames ? '' : 'item',\n        subBuilder: DynamicItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynFakeCardReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynFakeCardReply copyWith(void Function(DynFakeCardReply) updates) =>\n      super.copyWith((message) => updates(message as DynFakeCardReply))\n          as DynFakeCardReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynFakeCardReply create() => DynFakeCardReply._();\n  @$core.override\n  DynFakeCardReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynFakeCardReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynFakeCardReply>(create);\n  static DynFakeCardReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  DynamicItem get item => $_getN(0);\n  @$pb.TagNumber(1)\n  set item(DynamicItem value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasItem() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearItem() => $_clearField(1);\n  @$pb.TagNumber(1)\n  DynamicItem ensureItem() => $_ensure(0);\n}\n\nclass DynFakeCardReq extends $pb.GeneratedMessage {\n  factory DynFakeCardReq({\n    $core.String? content,\n  }) {\n    final result = create();\n    if (content != null) result.content = content;\n    return result;\n  }\n\n  DynFakeCardReq._();\n\n  factory DynFakeCardReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynFakeCardReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynFakeCardReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'content')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynFakeCardReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynFakeCardReq copyWith(void Function(DynFakeCardReq) updates) =>\n      super.copyWith((message) => updates(message as DynFakeCardReq))\n          as DynFakeCardReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynFakeCardReq create() => DynFakeCardReq._();\n  @$core.override\n  DynFakeCardReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynFakeCardReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynFakeCardReq>(create);\n  static DynFakeCardReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get content => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set content($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasContent() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearContent() => $_clearField(1);\n}\n\nclass DynFeatureGate extends $pb.GeneratedMessage {\n  factory DynFeatureGate({\n    $core.bool? enhancedInteraction,\n  }) {\n    final result = create();\n    if (enhancedInteraction != null)\n      result.enhancedInteraction = enhancedInteraction;\n    return result;\n  }\n\n  DynFeatureGate._();\n\n  factory DynFeatureGate.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynFeatureGate.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynFeatureGate',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'enhancedInteraction')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynFeatureGate clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynFeatureGate copyWith(void Function(DynFeatureGate) updates) =>\n      super.copyWith((message) => updates(message as DynFeatureGate))\n          as DynFeatureGate;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynFeatureGate create() => DynFeatureGate._();\n  @$core.override\n  DynFeatureGate createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynFeatureGate getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynFeatureGate>(create);\n  static DynFeatureGate? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get enhancedInteraction => $_getBF(0);\n  @$pb.TagNumber(1)\n  set enhancedInteraction($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasEnhancedInteraction() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearEnhancedInteraction() => $_clearField(1);\n}\n\nclass DynFriendReply extends $pb.GeneratedMessage {\n  factory DynFriendReply({\n    $core.Iterable<DynamicItem>? dynList,\n    $core.bool? hasMore,\n    $core.String? offset,\n  }) {\n    final result = create();\n    if (dynList != null) result.dynList.addAll(dynList);\n    if (hasMore != null) result.hasMore = hasMore;\n    if (offset != null) result.offset = offset;\n    return result;\n  }\n\n  DynFriendReply._();\n\n  factory DynFriendReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynFriendReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynFriendReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<DynamicItem>(1, _omitFieldNames ? '' : 'dynList',\n        subBuilder: DynamicItem.create)\n    ..aOB(2, _omitFieldNames ? '' : 'hasMore')\n    ..aOS(3, _omitFieldNames ? '' : 'offset')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynFriendReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynFriendReply copyWith(void Function(DynFriendReply) updates) =>\n      super.copyWith((message) => updates(message as DynFriendReply))\n          as DynFriendReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynFriendReply create() => DynFriendReply._();\n  @$core.override\n  DynFriendReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynFriendReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynFriendReply>(create);\n  static DynFriendReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<DynamicItem> get dynList => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.bool get hasMore => $_getBF(1);\n  @$pb.TagNumber(2)\n  set hasMore($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHasMore() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHasMore() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get offset => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set offset($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasOffset() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearOffset() => $_clearField(3);\n}\n\nclass DynFriendReq extends $pb.GeneratedMessage {\n  factory DynFriendReq({\n    $core.String? offset,\n    $core.int? localTime,\n    $1.PlayerArgs? playerArgs,\n  }) {\n    final result = create();\n    if (offset != null) result.offset = offset;\n    if (localTime != null) result.localTime = localTime;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    return result;\n  }\n\n  DynFriendReq._();\n\n  factory DynFriendReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynFriendReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynFriendReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'offset')\n    ..aI(2, _omitFieldNames ? '' : 'localTime')\n    ..aOM<$1.PlayerArgs>(3, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $1.PlayerArgs.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynFriendReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynFriendReq copyWith(void Function(DynFriendReq) updates) =>\n      super.copyWith((message) => updates(message as DynFriendReq))\n          as DynFriendReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynFriendReq create() => DynFriendReq._();\n  @$core.override\n  DynFriendReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynFriendReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynFriendReq>(create);\n  static DynFriendReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get offset => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set offset($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOffset() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOffset() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get localTime => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set localTime($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLocalTime() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLocalTime() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $1.PlayerArgs get playerArgs => $_getN(2);\n  @$pb.TagNumber(3)\n  set playerArgs($1.PlayerArgs value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPlayerArgs() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPlayerArgs() => $_clearField(3);\n  @$pb.TagNumber(3)\n  $1.PlayerArgs ensurePlayerArgs() => $_ensure(2);\n}\n\nclass DynLightReply extends $pb.GeneratedMessage {\n  factory DynLightReply({\n    DynamicList? dynamicList,\n  }) {\n    final result = create();\n    if (dynamicList != null) result.dynamicList = dynamicList;\n    return result;\n  }\n\n  DynLightReply._();\n\n  factory DynLightReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynLightReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynLightReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<DynamicList>(1, _omitFieldNames ? '' : 'dynamicList',\n        subBuilder: DynamicList.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynLightReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynLightReply copyWith(void Function(DynLightReply) updates) =>\n      super.copyWith((message) => updates(message as DynLightReply))\n          as DynLightReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynLightReply create() => DynLightReply._();\n  @$core.override\n  DynLightReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynLightReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynLightReply>(create);\n  static DynLightReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  DynamicList get dynamicList => $_getN(0);\n  @$pb.TagNumber(1)\n  set dynamicList(DynamicList value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDynamicList() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDynamicList() => $_clearField(1);\n  @$pb.TagNumber(1)\n  DynamicList ensureDynamicList() => $_ensure(0);\n}\n\nclass DynLightReq extends $pb.GeneratedMessage {\n  factory DynLightReq({\n    $core.String? historyOffset,\n    $core.int? page,\n    $core.String? from,\n    $1.PlayerArgs? playerArgs,\n    $core.int? localTime,\n    LightFromType? fromType,\n    $fixnum.Int64? fakeUid,\n  }) {\n    final result = create();\n    if (historyOffset != null) result.historyOffset = historyOffset;\n    if (page != null) result.page = page;\n    if (from != null) result.from = from;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    if (localTime != null) result.localTime = localTime;\n    if (fromType != null) result.fromType = fromType;\n    if (fakeUid != null) result.fakeUid = fakeUid;\n    return result;\n  }\n\n  DynLightReq._();\n\n  factory DynLightReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynLightReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynLightReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'historyOffset')\n    ..aI(2, _omitFieldNames ? '' : 'page')\n    ..aOS(3, _omitFieldNames ? '' : 'from')\n    ..aOM<$1.PlayerArgs>(4, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $1.PlayerArgs.create)\n    ..aI(5, _omitFieldNames ? '' : 'localTime')\n    ..aE<LightFromType>(6, _omitFieldNames ? '' : 'fromType',\n        enumValues: LightFromType.values)\n    ..aInt64(7, _omitFieldNames ? '' : 'fakeUid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynLightReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynLightReq copyWith(void Function(DynLightReq) updates) =>\n      super.copyWith((message) => updates(message as DynLightReq))\n          as DynLightReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynLightReq create() => DynLightReq._();\n  @$core.override\n  DynLightReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynLightReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynLightReq>(create);\n  static DynLightReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get historyOffset => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set historyOffset($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasHistoryOffset() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearHistoryOffset() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get page => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set page($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPage() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPage() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get from => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set from($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFrom() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFrom() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $1.PlayerArgs get playerArgs => $_getN(3);\n  @$pb.TagNumber(4)\n  set playerArgs($1.PlayerArgs value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPlayerArgs() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPlayerArgs() => $_clearField(4);\n  @$pb.TagNumber(4)\n  $1.PlayerArgs ensurePlayerArgs() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.int get localTime => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set localTime($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasLocalTime() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearLocalTime() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  LightFromType get fromType => $_getN(5);\n  @$pb.TagNumber(6)\n  set fromType(LightFromType value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasFromType() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearFromType() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get fakeUid => $_getI64(6);\n  @$pb.TagNumber(7)\n  set fakeUid($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasFakeUid() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearFakeUid() => $_clearField(7);\n}\n\nclass DynMixUpListSearchReply extends $pb.GeneratedMessage {\n  factory DynMixUpListSearchReply({\n    $core.Iterable<MixUpListItem>? items,\n  }) {\n    final result = create();\n    if (items != null) result.items.addAll(items);\n    return result;\n  }\n\n  DynMixUpListSearchReply._();\n\n  factory DynMixUpListSearchReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynMixUpListSearchReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynMixUpListSearchReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<MixUpListItem>(1, _omitFieldNames ? '' : 'items',\n        subBuilder: MixUpListItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynMixUpListSearchReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynMixUpListSearchReply copyWith(\n          void Function(DynMixUpListSearchReply) updates) =>\n      super.copyWith((message) => updates(message as DynMixUpListSearchReply))\n          as DynMixUpListSearchReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynMixUpListSearchReply create() => DynMixUpListSearchReply._();\n  @$core.override\n  DynMixUpListSearchReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynMixUpListSearchReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynMixUpListSearchReply>(create);\n  static DynMixUpListSearchReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<MixUpListItem> get items => $_getList(0);\n}\n\nclass DynMixUpListSearchReq extends $pb.GeneratedMessage {\n  factory DynMixUpListSearchReq({\n    $core.String? name,\n  }) {\n    final result = create();\n    if (name != null) result.name = name;\n    return result;\n  }\n\n  DynMixUpListSearchReq._();\n\n  factory DynMixUpListSearchReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynMixUpListSearchReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynMixUpListSearchReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'name')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynMixUpListSearchReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynMixUpListSearchReq copyWith(\n          void Function(DynMixUpListSearchReq) updates) =>\n      super.copyWith((message) => updates(message as DynMixUpListSearchReq))\n          as DynMixUpListSearchReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynMixUpListSearchReq create() => DynMixUpListSearchReq._();\n  @$core.override\n  DynMixUpListSearchReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynMixUpListSearchReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynMixUpListSearchReq>(create);\n  static DynMixUpListSearchReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get name => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set name($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasName() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearName() => $_clearField(1);\n}\n\nclass DynMixUpListViewMoreReply extends $pb.GeneratedMessage {\n  factory DynMixUpListViewMoreReply({\n    $core.Iterable<MixUpListItem>? items,\n    $core.String? searchDefaultText,\n    $core.Iterable<SortType>? sortTypes,\n    $core.bool? showMoreSortTypes,\n    $core.int? defaultSortType,\n  }) {\n    final result = create();\n    if (items != null) result.items.addAll(items);\n    if (searchDefaultText != null) result.searchDefaultText = searchDefaultText;\n    if (sortTypes != null) result.sortTypes.addAll(sortTypes);\n    if (showMoreSortTypes != null) result.showMoreSortTypes = showMoreSortTypes;\n    if (defaultSortType != null) result.defaultSortType = defaultSortType;\n    return result;\n  }\n\n  DynMixUpListViewMoreReply._();\n\n  factory DynMixUpListViewMoreReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynMixUpListViewMoreReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynMixUpListViewMoreReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<MixUpListItem>(1, _omitFieldNames ? '' : 'items',\n        subBuilder: MixUpListItem.create)\n    ..aOS(2, _omitFieldNames ? '' : 'searchDefaultText')\n    ..pPM<SortType>(3, _omitFieldNames ? '' : 'sortTypes',\n        subBuilder: SortType.create)\n    ..aOB(4, _omitFieldNames ? '' : 'showMoreSortTypes')\n    ..aI(5, _omitFieldNames ? '' : 'defaultSortType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynMixUpListViewMoreReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynMixUpListViewMoreReply copyWith(\n          void Function(DynMixUpListViewMoreReply) updates) =>\n      super.copyWith((message) => updates(message as DynMixUpListViewMoreReply))\n          as DynMixUpListViewMoreReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynMixUpListViewMoreReply create() => DynMixUpListViewMoreReply._();\n  @$core.override\n  DynMixUpListViewMoreReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynMixUpListViewMoreReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynMixUpListViewMoreReply>(create);\n  static DynMixUpListViewMoreReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<MixUpListItem> get items => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.String get searchDefaultText => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set searchDefaultText($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSearchDefaultText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSearchDefaultText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<SortType> get sortTypes => $_getList(2);\n\n  @$pb.TagNumber(4)\n  $core.bool get showMoreSortTypes => $_getBF(3);\n  @$pb.TagNumber(4)\n  set showMoreSortTypes($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasShowMoreSortTypes() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearShowMoreSortTypes() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get defaultSortType => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set defaultSortType($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDefaultSortType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDefaultSortType() => $_clearField(5);\n}\n\nclass DynMixUpListViewMoreReq extends $pb.GeneratedMessage {\n  factory DynMixUpListViewMoreReq({\n    $core.int? sortType,\n  }) {\n    final result = create();\n    if (sortType != null) result.sortType = sortType;\n    return result;\n  }\n\n  DynMixUpListViewMoreReq._();\n\n  factory DynMixUpListViewMoreReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynMixUpListViewMoreReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynMixUpListViewMoreReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'sortType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynMixUpListViewMoreReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynMixUpListViewMoreReq copyWith(\n          void Function(DynMixUpListViewMoreReq) updates) =>\n      super.copyWith((message) => updates(message as DynMixUpListViewMoreReq))\n          as DynMixUpListViewMoreReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynMixUpListViewMoreReq create() => DynMixUpListViewMoreReq._();\n  @$core.override\n  DynMixUpListViewMoreReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynMixUpListViewMoreReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynMixUpListViewMoreReq>(create);\n  static DynMixUpListViewMoreReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get sortType => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set sortType($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSortType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSortType() => $_clearField(1);\n}\n\nclass DynRcmdReply extends $pb.GeneratedMessage {\n  factory DynRcmdReply({\n    DynRegionRcmd? regionRcmd,\n    DynamicList? dynamicList,\n  }) {\n    final result = create();\n    if (regionRcmd != null) result.regionRcmd = regionRcmd;\n    if (dynamicList != null) result.dynamicList = dynamicList;\n    return result;\n  }\n\n  DynRcmdReply._();\n\n  factory DynRcmdReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynRcmdReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynRcmdReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<DynRegionRcmd>(1, _omitFieldNames ? '' : 'regionRcmd',\n        subBuilder: DynRegionRcmd.create)\n    ..aOM<DynamicList>(2, _omitFieldNames ? '' : 'dynamicList',\n        subBuilder: DynamicList.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynRcmdReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynRcmdReply copyWith(void Function(DynRcmdReply) updates) =>\n      super.copyWith((message) => updates(message as DynRcmdReply))\n          as DynRcmdReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynRcmdReply create() => DynRcmdReply._();\n  @$core.override\n  DynRcmdReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynRcmdReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynRcmdReply>(create);\n  static DynRcmdReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  DynRegionRcmd get regionRcmd => $_getN(0);\n  @$pb.TagNumber(1)\n  set regionRcmd(DynRegionRcmd value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasRegionRcmd() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRegionRcmd() => $_clearField(1);\n  @$pb.TagNumber(1)\n  DynRegionRcmd ensureRegionRcmd() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  DynamicList get dynamicList => $_getN(1);\n  @$pb.TagNumber(2)\n  set dynamicList(DynamicList value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDynamicList() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDynamicList() => $_clearField(2);\n  @$pb.TagNumber(2)\n  DynamicList ensureDynamicList() => $_ensure(1);\n}\n\nclass DynRcmdReq extends $pb.GeneratedMessage {\n  factory DynRcmdReq({\n    $1.PlayerArgs? playerArgs,\n    $core.int? localTime,\n    $fixnum.Int64? fakeUid,\n    $core.bool? isRefresh,\n  }) {\n    final result = create();\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    if (localTime != null) result.localTime = localTime;\n    if (fakeUid != null) result.fakeUid = fakeUid;\n    if (isRefresh != null) result.isRefresh = isRefresh;\n    return result;\n  }\n\n  DynRcmdReq._();\n\n  factory DynRcmdReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynRcmdReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynRcmdReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<$1.PlayerArgs>(1, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $1.PlayerArgs.create)\n    ..aI(2, _omitFieldNames ? '' : 'localTime')\n    ..aInt64(3, _omitFieldNames ? '' : 'fakeUid')\n    ..aOB(4, _omitFieldNames ? '' : 'isRefresh')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynRcmdReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynRcmdReq copyWith(void Function(DynRcmdReq) updates) =>\n      super.copyWith((message) => updates(message as DynRcmdReq)) as DynRcmdReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynRcmdReq create() => DynRcmdReq._();\n  @$core.override\n  DynRcmdReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynRcmdReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynRcmdReq>(create);\n  static DynRcmdReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $1.PlayerArgs get playerArgs => $_getN(0);\n  @$pb.TagNumber(1)\n  set playerArgs($1.PlayerArgs value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPlayerArgs() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPlayerArgs() => $_clearField(1);\n  @$pb.TagNumber(1)\n  $1.PlayerArgs ensurePlayerArgs() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.int get localTime => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set localTime($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLocalTime() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLocalTime() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get fakeUid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set fakeUid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFakeUid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFakeUid() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get isRefresh => $_getBF(3);\n  @$pb.TagNumber(4)\n  set isRefresh($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIsRefresh() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIsRefresh() => $_clearField(4);\n}\n\nclass DynRcmdUpExchangeReply extends $pb.GeneratedMessage {\n  factory DynRcmdUpExchangeReply({\n    Unfollow? unfollow,\n  }) {\n    final result = create();\n    if (unfollow != null) result.unfollow = unfollow;\n    return result;\n  }\n\n  DynRcmdUpExchangeReply._();\n\n  factory DynRcmdUpExchangeReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynRcmdUpExchangeReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynRcmdUpExchangeReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<Unfollow>(1, _omitFieldNames ? '' : 'unfollow',\n        subBuilder: Unfollow.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynRcmdUpExchangeReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynRcmdUpExchangeReply copyWith(\n          void Function(DynRcmdUpExchangeReply) updates) =>\n      super.copyWith((message) => updates(message as DynRcmdUpExchangeReply))\n          as DynRcmdUpExchangeReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynRcmdUpExchangeReply create() => DynRcmdUpExchangeReply._();\n  @$core.override\n  DynRcmdUpExchangeReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynRcmdUpExchangeReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynRcmdUpExchangeReply>(create);\n  static DynRcmdUpExchangeReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Unfollow get unfollow => $_getN(0);\n  @$pb.TagNumber(1)\n  set unfollow(Unfollow value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUnfollow() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUnfollow() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Unfollow ensureUnfollow() => $_ensure(0);\n}\n\nclass DynRcmdUpExchangeReq extends $pb.GeneratedMessage {\n  factory DynRcmdUpExchangeReq({\n    $fixnum.Int64? uid,\n    $fixnum.Int64? dislikeTs,\n    $core.String? from,\n  }) {\n    final result = create();\n    if (uid != null) result.uid = uid;\n    if (dislikeTs != null) result.dislikeTs = dislikeTs;\n    if (from != null) result.from = from;\n    return result;\n  }\n\n  DynRcmdUpExchangeReq._();\n\n  factory DynRcmdUpExchangeReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynRcmdUpExchangeReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynRcmdUpExchangeReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'uid')\n    ..aInt64(2, _omitFieldNames ? '' : 'dislikeTs')\n    ..aOS(3, _omitFieldNames ? '' : 'from')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynRcmdUpExchangeReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynRcmdUpExchangeReq copyWith(void Function(DynRcmdUpExchangeReq) updates) =>\n      super.copyWith((message) => updates(message as DynRcmdUpExchangeReq))\n          as DynRcmdUpExchangeReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynRcmdUpExchangeReq create() => DynRcmdUpExchangeReq._();\n  @$core.override\n  DynRcmdUpExchangeReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynRcmdUpExchangeReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynRcmdUpExchangeReq>(create);\n  static DynRcmdUpExchangeReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get uid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set uid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get dislikeTs => $_getI64(1);\n  @$pb.TagNumber(2)\n  set dislikeTs($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDislikeTs() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDislikeTs() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get from => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set from($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFrom() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFrom() => $_clearField(3);\n}\n\nclass DynRegionRcmd extends $pb.GeneratedMessage {\n  factory DynRegionRcmd({\n    $core.Iterable<DynRegionRcmdItem>? items,\n    RcmdOption? opts,\n  }) {\n    final result = create();\n    if (items != null) result.items.addAll(items);\n    if (opts != null) result.opts = opts;\n    return result;\n  }\n\n  DynRegionRcmd._();\n\n  factory DynRegionRcmd.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynRegionRcmd.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynRegionRcmd',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<DynRegionRcmdItem>(1, _omitFieldNames ? '' : 'items',\n        subBuilder: DynRegionRcmdItem.create)\n    ..aOM<RcmdOption>(2, _omitFieldNames ? '' : 'opts',\n        subBuilder: RcmdOption.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynRegionRcmd clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynRegionRcmd copyWith(void Function(DynRegionRcmd) updates) =>\n      super.copyWith((message) => updates(message as DynRegionRcmd))\n          as DynRegionRcmd;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynRegionRcmd create() => DynRegionRcmd._();\n  @$core.override\n  DynRegionRcmd createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynRegionRcmd getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynRegionRcmd>(create);\n  static DynRegionRcmd? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<DynRegionRcmdItem> get items => $_getList(0);\n\n  @$pb.TagNumber(2)\n  RcmdOption get opts => $_getN(1);\n  @$pb.TagNumber(2)\n  set opts(RcmdOption value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOpts() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOpts() => $_clearField(2);\n  @$pb.TagNumber(2)\n  RcmdOption ensureOpts() => $_ensure(1);\n}\n\nclass DynRegionRcmdItem extends $pb.GeneratedMessage {\n  factory DynRegionRcmdItem({\n    $fixnum.Int64? rid,\n    $core.String? title,\n    $core.Iterable<ModuleRcmd>? items,\n  }) {\n    final result = create();\n    if (rid != null) result.rid = rid;\n    if (title != null) result.title = title;\n    if (items != null) result.items.addAll(items);\n    return result;\n  }\n\n  DynRegionRcmdItem._();\n\n  factory DynRegionRcmdItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynRegionRcmdItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynRegionRcmdItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'rid')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..pPM<ModuleRcmd>(3, _omitFieldNames ? '' : 'items',\n        subBuilder: ModuleRcmd.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynRegionRcmdItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynRegionRcmdItem copyWith(void Function(DynRegionRcmdItem) updates) =>\n      super.copyWith((message) => updates(message as DynRegionRcmdItem))\n          as DynRegionRcmdItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynRegionRcmdItem create() => DynRegionRcmdItem._();\n  @$core.override\n  DynRegionRcmdItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynRegionRcmdItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynRegionRcmdItem>(create);\n  static DynRegionRcmdItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get rid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set rid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasRid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<ModuleRcmd> get items => $_getList(2);\n}\n\nclass DynScreenTab extends $pb.GeneratedMessage {\n  factory DynScreenTab({\n    $core.String? title,\n    $core.String? name,\n    $core.bool? defaultTab,\n    $core.bool? strategyShowOnEntrance,\n    $core.bool? strategyShowOnRefresh,\n    $core.bool? strategyShowOnPullUp,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (name != null) result.name = name;\n    if (defaultTab != null) result.defaultTab = defaultTab;\n    if (strategyShowOnEntrance != null)\n      result.strategyShowOnEntrance = strategyShowOnEntrance;\n    if (strategyShowOnRefresh != null)\n      result.strategyShowOnRefresh = strategyShowOnRefresh;\n    if (strategyShowOnPullUp != null)\n      result.strategyShowOnPullUp = strategyShowOnPullUp;\n    return result;\n  }\n\n  DynScreenTab._();\n\n  factory DynScreenTab.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynScreenTab.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynScreenTab',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOB(3, _omitFieldNames ? '' : 'defaultTab')\n    ..aOB(4, _omitFieldNames ? '' : 'strategyShowOnEntrance')\n    ..aOB(5, _omitFieldNames ? '' : 'strategyShowOnRefresh')\n    ..aOB(6, _omitFieldNames ? '' : 'strategyShowOnPullUp')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynScreenTab clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynScreenTab copyWith(void Function(DynScreenTab) updates) =>\n      super.copyWith((message) => updates(message as DynScreenTab))\n          as DynScreenTab;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynScreenTab create() => DynScreenTab._();\n  @$core.override\n  DynScreenTab createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynScreenTab getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynScreenTab>(create);\n  static DynScreenTab? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get defaultTab => $_getBF(2);\n  @$pb.TagNumber(3)\n  set defaultTab($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDefaultTab() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDefaultTab() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get strategyShowOnEntrance => $_getBF(3);\n  @$pb.TagNumber(4)\n  set strategyShowOnEntrance($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasStrategyShowOnEntrance() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearStrategyShowOnEntrance() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.bool get strategyShowOnRefresh => $_getBF(4);\n  @$pb.TagNumber(5)\n  set strategyShowOnRefresh($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasStrategyShowOnRefresh() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearStrategyShowOnRefresh() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.bool get strategyShowOnPullUp => $_getBF(5);\n  @$pb.TagNumber(6)\n  set strategyShowOnPullUp($core.bool value) => $_setBool(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasStrategyShowOnPullUp() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearStrategyShowOnPullUp() => $_clearField(6);\n}\n\nclass DynSearchReply extends $pb.GeneratedMessage {\n  factory DynSearchReply({\n    SearchChannel? channelInfo,\n    SearchTopic? searchTopic,\n    SearchInfo? searchInfo,\n  }) {\n    final result = create();\n    if (channelInfo != null) result.channelInfo = channelInfo;\n    if (searchTopic != null) result.searchTopic = searchTopic;\n    if (searchInfo != null) result.searchInfo = searchInfo;\n    return result;\n  }\n\n  DynSearchReply._();\n\n  factory DynSearchReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynSearchReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynSearchReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<SearchChannel>(1, _omitFieldNames ? '' : 'channelInfo',\n        subBuilder: SearchChannel.create)\n    ..aOM<SearchTopic>(2, _omitFieldNames ? '' : 'searchTopic',\n        subBuilder: SearchTopic.create)\n    ..aOM<SearchInfo>(3, _omitFieldNames ? '' : 'searchInfo',\n        subBuilder: SearchInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynSearchReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynSearchReply copyWith(void Function(DynSearchReply) updates) =>\n      super.copyWith((message) => updates(message as DynSearchReply))\n          as DynSearchReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynSearchReply create() => DynSearchReply._();\n  @$core.override\n  DynSearchReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynSearchReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynSearchReply>(create);\n  static DynSearchReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  SearchChannel get channelInfo => $_getN(0);\n  @$pb.TagNumber(1)\n  set channelInfo(SearchChannel value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasChannelInfo() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearChannelInfo() => $_clearField(1);\n  @$pb.TagNumber(1)\n  SearchChannel ensureChannelInfo() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  SearchTopic get searchTopic => $_getN(1);\n  @$pb.TagNumber(2)\n  set searchTopic(SearchTopic value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSearchTopic() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSearchTopic() => $_clearField(2);\n  @$pb.TagNumber(2)\n  SearchTopic ensureSearchTopic() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  SearchInfo get searchInfo => $_getN(2);\n  @$pb.TagNumber(3)\n  set searchInfo(SearchInfo value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSearchInfo() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSearchInfo() => $_clearField(3);\n  @$pb.TagNumber(3)\n  SearchInfo ensureSearchInfo() => $_ensure(2);\n}\n\nclass DynSearchReq extends $pb.GeneratedMessage {\n  factory DynSearchReq({\n    $core.String? keyword,\n    $core.int? page,\n    $core.int? localTime,\n    $1.PlayerArgs? playerArgs,\n  }) {\n    final result = create();\n    if (keyword != null) result.keyword = keyword;\n    if (page != null) result.page = page;\n    if (localTime != null) result.localTime = localTime;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    return result;\n  }\n\n  DynSearchReq._();\n\n  factory DynSearchReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynSearchReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynSearchReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'keyword')\n    ..aI(2, _omitFieldNames ? '' : 'page')\n    ..aI(3, _omitFieldNames ? '' : 'localTime')\n    ..aOM<$1.PlayerArgs>(4, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $1.PlayerArgs.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynSearchReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynSearchReq copyWith(void Function(DynSearchReq) updates) =>\n      super.copyWith((message) => updates(message as DynSearchReq))\n          as DynSearchReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynSearchReq create() => DynSearchReq._();\n  @$core.override\n  DynSearchReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynSearchReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynSearchReq>(create);\n  static DynSearchReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get keyword => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set keyword($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasKeyword() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearKeyword() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get page => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set page($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPage() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPage() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get localTime => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set localTime($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLocalTime() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLocalTime() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $1.PlayerArgs get playerArgs => $_getN(3);\n  @$pb.TagNumber(4)\n  set playerArgs($1.PlayerArgs value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPlayerArgs() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPlayerArgs() => $_clearField(4);\n  @$pb.TagNumber(4)\n  $1.PlayerArgs ensurePlayerArgs() => $_ensure(3);\n}\n\nclass DynServerDetailsReply extends $pb.GeneratedMessage {\n  factory DynServerDetailsReply({\n    $core.Iterable<$core.MapEntry<$fixnum.Int64, DynamicItem>>? items,\n  }) {\n    final result = create();\n    if (items != null) result.items.addEntries(items);\n    return result;\n  }\n\n  DynServerDetailsReply._();\n\n  factory DynServerDetailsReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynServerDetailsReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynServerDetailsReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..m<$fixnum.Int64, DynamicItem>(1, _omitFieldNames ? '' : 'items',\n        entryClassName: 'DynServerDetailsReply.ItemsEntry',\n        keyFieldType: $pb.PbFieldType.O6,\n        valueFieldType: $pb.PbFieldType.OM,\n        valueCreator: DynamicItem.create,\n        valueDefaultOrMaker: DynamicItem.getDefault,\n        packageName: const $pb.PackageName('bilibili.app.dynamic.v2'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynServerDetailsReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynServerDetailsReply copyWith(\n          void Function(DynServerDetailsReply) updates) =>\n      super.copyWith((message) => updates(message as DynServerDetailsReply))\n          as DynServerDetailsReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynServerDetailsReply create() => DynServerDetailsReply._();\n  @$core.override\n  DynServerDetailsReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynServerDetailsReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynServerDetailsReply>(create);\n  static DynServerDetailsReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbMap<$fixnum.Int64, DynamicItem> get items => $_getMap(0);\n}\n\nclass DynServerDetailsReq extends $pb.GeneratedMessage {\n  factory DynServerDetailsReq({\n    $core.Iterable<$fixnum.Int64>? dynamicIds,\n    $core.int? localTime,\n    $1.PlayerArgs? playerArgs,\n    $core.String? mobiApp,\n    $core.String? device,\n    $core.String? buvid,\n    $fixnum.Int64? build,\n    $fixnum.Int64? mid,\n    $core.String? platform,\n    $core.bool? isMaster,\n    $core.Iterable<$fixnum.Int64>? topDynamicIds,\n  }) {\n    final result = create();\n    if (dynamicIds != null) result.dynamicIds.addAll(dynamicIds);\n    if (localTime != null) result.localTime = localTime;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    if (mobiApp != null) result.mobiApp = mobiApp;\n    if (device != null) result.device = device;\n    if (buvid != null) result.buvid = buvid;\n    if (build != null) result.build = build;\n    if (mid != null) result.mid = mid;\n    if (platform != null) result.platform = platform;\n    if (isMaster != null) result.isMaster = isMaster;\n    if (topDynamicIds != null) result.topDynamicIds.addAll(topDynamicIds);\n    return result;\n  }\n\n  DynServerDetailsReq._();\n\n  factory DynServerDetailsReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynServerDetailsReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynServerDetailsReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..p<$fixnum.Int64>(\n        1, _omitFieldNames ? '' : 'dynamicIds', $pb.PbFieldType.K6)\n    ..aI(2, _omitFieldNames ? '' : 'localTime')\n    ..aOM<$1.PlayerArgs>(3, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $1.PlayerArgs.create)\n    ..aOS(4, _omitFieldNames ? '' : 'mobiApp')\n    ..aOS(5, _omitFieldNames ? '' : 'device')\n    ..aOS(6, _omitFieldNames ? '' : 'buvid')\n    ..aInt64(7, _omitFieldNames ? '' : 'build')\n    ..aInt64(8, _omitFieldNames ? '' : 'mid')\n    ..aOS(9, _omitFieldNames ? '' : 'platform')\n    ..aOB(10, _omitFieldNames ? '' : 'isMaster')\n    ..p<$fixnum.Int64>(\n        11, _omitFieldNames ? '' : 'topDynamicIds', $pb.PbFieldType.K6)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynServerDetailsReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynServerDetailsReq copyWith(void Function(DynServerDetailsReq) updates) =>\n      super.copyWith((message) => updates(message as DynServerDetailsReq))\n          as DynServerDetailsReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynServerDetailsReq create() => DynServerDetailsReq._();\n  @$core.override\n  DynServerDetailsReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynServerDetailsReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynServerDetailsReq>(create);\n  static DynServerDetailsReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<$fixnum.Int64> get dynamicIds => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.int get localTime => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set localTime($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLocalTime() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLocalTime() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $1.PlayerArgs get playerArgs => $_getN(2);\n  @$pb.TagNumber(3)\n  set playerArgs($1.PlayerArgs value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPlayerArgs() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPlayerArgs() => $_clearField(3);\n  @$pb.TagNumber(3)\n  $1.PlayerArgs ensurePlayerArgs() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.String get mobiApp => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set mobiApp($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasMobiApp() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearMobiApp() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get device => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set device($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDevice() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDevice() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get buvid => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set buvid($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasBuvid() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearBuvid() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get build => $_getI64(6);\n  @$pb.TagNumber(7)\n  set build($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBuild() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBuild() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get mid => $_getI64(7);\n  @$pb.TagNumber(8)\n  set mid($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasMid() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearMid() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get platform => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set platform($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasPlatform() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearPlatform() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.bool get isMaster => $_getBF(9);\n  @$pb.TagNumber(10)\n  set isMaster($core.bool value) => $_setBool(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasIsMaster() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearIsMaster() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $pb.PbList<$fixnum.Int64> get topDynamicIds => $_getList(10);\n}\n\nclass DynSpaceReq extends $pb.GeneratedMessage {\n  factory DynSpaceReq({\n    $fixnum.Int64? hostUid,\n    $core.String? historyOffset,\n    $1.PlayerArgs? playerArgs,\n    $core.int? localTime,\n    $fixnum.Int64? page,\n    $core.String? from,\n  }) {\n    final result = create();\n    if (hostUid != null) result.hostUid = hostUid;\n    if (historyOffset != null) result.historyOffset = historyOffset;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    if (localTime != null) result.localTime = localTime;\n    if (page != null) result.page = page;\n    if (from != null) result.from = from;\n    return result;\n  }\n\n  DynSpaceReq._();\n\n  factory DynSpaceReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynSpaceReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynSpaceReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'hostUid')\n    ..aOS(2, _omitFieldNames ? '' : 'historyOffset')\n    ..aOM<$1.PlayerArgs>(3, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $1.PlayerArgs.create)\n    ..aI(4, _omitFieldNames ? '' : 'localTime')\n    ..aInt64(5, _omitFieldNames ? '' : 'page')\n    ..aOS(6, _omitFieldNames ? '' : 'from')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynSpaceReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynSpaceReq copyWith(void Function(DynSpaceReq) updates) =>\n      super.copyWith((message) => updates(message as DynSpaceReq))\n          as DynSpaceReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynSpaceReq create() => DynSpaceReq._();\n  @$core.override\n  DynSpaceReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynSpaceReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynSpaceReq>(create);\n  static DynSpaceReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get hostUid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set hostUid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasHostUid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearHostUid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get historyOffset => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set historyOffset($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHistoryOffset() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHistoryOffset() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $1.PlayerArgs get playerArgs => $_getN(2);\n  @$pb.TagNumber(3)\n  set playerArgs($1.PlayerArgs value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPlayerArgs() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPlayerArgs() => $_clearField(3);\n  @$pb.TagNumber(3)\n  $1.PlayerArgs ensurePlayerArgs() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.int get localTime => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set localTime($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLocalTime() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLocalTime() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get page => $_getI64(4);\n  @$pb.TagNumber(5)\n  set page($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPage() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPage() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get from => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set from($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasFrom() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearFrom() => $_clearField(6);\n}\n\nclass DynSpaceRsp extends $pb.GeneratedMessage {\n  factory DynSpaceRsp({\n    $core.Iterable<DynamicItem>? list,\n    $core.String? historyOffset,\n    $core.bool? hasMore,\n  }) {\n    final result = create();\n    if (list != null) result.list.addAll(list);\n    if (historyOffset != null) result.historyOffset = historyOffset;\n    if (hasMore != null) result.hasMore = hasMore;\n    return result;\n  }\n\n  DynSpaceRsp._();\n\n  factory DynSpaceRsp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynSpaceRsp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynSpaceRsp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<DynamicItem>(1, _omitFieldNames ? '' : 'list',\n        subBuilder: DynamicItem.create)\n    ..aOS(2, _omitFieldNames ? '' : 'historyOffset')\n    ..aOB(3, _omitFieldNames ? '' : 'hasMore')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynSpaceRsp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynSpaceRsp copyWith(void Function(DynSpaceRsp) updates) =>\n      super.copyWith((message) => updates(message as DynSpaceRsp))\n          as DynSpaceRsp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynSpaceRsp create() => DynSpaceRsp._();\n  @$core.override\n  DynSpaceRsp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynSpaceRsp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynSpaceRsp>(create);\n  static DynSpaceRsp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<DynamicItem> get list => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.String get historyOffset => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set historyOffset($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHistoryOffset() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHistoryOffset() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get hasMore => $_getBF(2);\n  @$pb.TagNumber(3)\n  set hasMore($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasHasMore() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearHasMore() => $_clearField(3);\n}\n\nclass DynSpaceSearchDetailsReply extends $pb.GeneratedMessage {\n  factory DynSpaceSearchDetailsReply({\n    $core.Iterable<$core.MapEntry<$fixnum.Int64, DynamicItem>>? items,\n  }) {\n    final result = create();\n    if (items != null) result.items.addEntries(items);\n    return result;\n  }\n\n  DynSpaceSearchDetailsReply._();\n\n  factory DynSpaceSearchDetailsReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynSpaceSearchDetailsReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynSpaceSearchDetailsReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..m<$fixnum.Int64, DynamicItem>(1, _omitFieldNames ? '' : 'items',\n        entryClassName: 'DynSpaceSearchDetailsReply.ItemsEntry',\n        keyFieldType: $pb.PbFieldType.O6,\n        valueFieldType: $pb.PbFieldType.OM,\n        valueCreator: DynamicItem.create,\n        valueDefaultOrMaker: DynamicItem.getDefault,\n        packageName: const $pb.PackageName('bilibili.app.dynamic.v2'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynSpaceSearchDetailsReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynSpaceSearchDetailsReply copyWith(\n          void Function(DynSpaceSearchDetailsReply) updates) =>\n      super.copyWith(\n              (message) => updates(message as DynSpaceSearchDetailsReply))\n          as DynSpaceSearchDetailsReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynSpaceSearchDetailsReply create() => DynSpaceSearchDetailsReply._();\n  @$core.override\n  DynSpaceSearchDetailsReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynSpaceSearchDetailsReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynSpaceSearchDetailsReply>(create);\n  static DynSpaceSearchDetailsReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbMap<$fixnum.Int64, DynamicItem> get items => $_getMap(0);\n}\n\nclass DynSpaceSearchDetailsReq extends $pb.GeneratedMessage {\n  factory DynSpaceSearchDetailsReq({\n    $core.Iterable<$fixnum.Int64>? dynamicIds,\n    $core.Iterable<$core.String>? searchWords,\n    $core.int? localTime,\n    $1.PlayerArgs? playerArgs,\n    $core.String? mobiApp,\n    $core.String? device,\n    $core.String? buvid,\n    $fixnum.Int64? build,\n    $fixnum.Int64? mid,\n    $core.String? platform,\n    $core.String? ip,\n    NetworkType? netType,\n    TFType? tfType,\n  }) {\n    final result = create();\n    if (dynamicIds != null) result.dynamicIds.addAll(dynamicIds);\n    if (searchWords != null) result.searchWords.addAll(searchWords);\n    if (localTime != null) result.localTime = localTime;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    if (mobiApp != null) result.mobiApp = mobiApp;\n    if (device != null) result.device = device;\n    if (buvid != null) result.buvid = buvid;\n    if (build != null) result.build = build;\n    if (mid != null) result.mid = mid;\n    if (platform != null) result.platform = platform;\n    if (ip != null) result.ip = ip;\n    if (netType != null) result.netType = netType;\n    if (tfType != null) result.tfType = tfType;\n    return result;\n  }\n\n  DynSpaceSearchDetailsReq._();\n\n  factory DynSpaceSearchDetailsReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynSpaceSearchDetailsReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynSpaceSearchDetailsReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..p<$fixnum.Int64>(\n        1, _omitFieldNames ? '' : 'dynamicIds', $pb.PbFieldType.K6)\n    ..pPS(2, _omitFieldNames ? '' : 'searchWords')\n    ..aI(3, _omitFieldNames ? '' : 'localTime')\n    ..aOM<$1.PlayerArgs>(4, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $1.PlayerArgs.create)\n    ..aOS(5, _omitFieldNames ? '' : 'mobiApp')\n    ..aOS(6, _omitFieldNames ? '' : 'device')\n    ..aOS(7, _omitFieldNames ? '' : 'buvid')\n    ..aInt64(8, _omitFieldNames ? '' : 'build')\n    ..aInt64(9, _omitFieldNames ? '' : 'mid')\n    ..aOS(10, _omitFieldNames ? '' : 'platform')\n    ..aOS(11, _omitFieldNames ? '' : 'ip')\n    ..aE<NetworkType>(12, _omitFieldNames ? '' : 'netType',\n        enumValues: NetworkType.values)\n    ..aE<TFType>(13, _omitFieldNames ? '' : 'tfType', enumValues: TFType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynSpaceSearchDetailsReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynSpaceSearchDetailsReq copyWith(\n          void Function(DynSpaceSearchDetailsReq) updates) =>\n      super.copyWith((message) => updates(message as DynSpaceSearchDetailsReq))\n          as DynSpaceSearchDetailsReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynSpaceSearchDetailsReq create() => DynSpaceSearchDetailsReq._();\n  @$core.override\n  DynSpaceSearchDetailsReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynSpaceSearchDetailsReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynSpaceSearchDetailsReq>(create);\n  static DynSpaceSearchDetailsReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<$fixnum.Int64> get dynamicIds => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<$core.String> get searchWords => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $core.int get localTime => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set localTime($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLocalTime() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLocalTime() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $1.PlayerArgs get playerArgs => $_getN(3);\n  @$pb.TagNumber(4)\n  set playerArgs($1.PlayerArgs value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPlayerArgs() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPlayerArgs() => $_clearField(4);\n  @$pb.TagNumber(4)\n  $1.PlayerArgs ensurePlayerArgs() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.String get mobiApp => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set mobiApp($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasMobiApp() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearMobiApp() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get device => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set device($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasDevice() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearDevice() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get buvid => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set buvid($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBuvid() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBuvid() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get build => $_getI64(7);\n  @$pb.TagNumber(8)\n  set build($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasBuild() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearBuild() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get mid => $_getI64(8);\n  @$pb.TagNumber(9)\n  set mid($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasMid() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearMid() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get platform => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set platform($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasPlatform() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearPlatform() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get ip => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set ip($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasIp() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearIp() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  NetworkType get netType => $_getN(11);\n  @$pb.TagNumber(12)\n  set netType(NetworkType value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasNetType() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearNetType() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  TFType get tfType => $_getN(12);\n  @$pb.TagNumber(13)\n  set tfType(TFType value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasTfType() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearTfType() => $_clearField(13);\n}\n\nclass DynTab extends $pb.GeneratedMessage {\n  factory DynTab({\n    $core.String? title,\n    $core.String? uri,\n    $core.String? bubble,\n    $core.int? redPoint,\n    $fixnum.Int64? cityId,\n    $core.int? isPopup,\n    Popup? popup,\n    $core.bool? defaultTab,\n    $core.String? subTitle,\n    $core.String? anchor,\n    $core.String? internalTest,\n    ShowType? type,\n    DynTab? backUp,\n    $core.String? jumpHomePop,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (uri != null) result.uri = uri;\n    if (bubble != null) result.bubble = bubble;\n    if (redPoint != null) result.redPoint = redPoint;\n    if (cityId != null) result.cityId = cityId;\n    if (isPopup != null) result.isPopup = isPopup;\n    if (popup != null) result.popup = popup;\n    if (defaultTab != null) result.defaultTab = defaultTab;\n    if (subTitle != null) result.subTitle = subTitle;\n    if (anchor != null) result.anchor = anchor;\n    if (internalTest != null) result.internalTest = internalTest;\n    if (type != null) result.type = type;\n    if (backUp != null) result.backUp = backUp;\n    if (jumpHomePop != null) result.jumpHomePop = jumpHomePop;\n    return result;\n  }\n\n  DynTab._();\n\n  factory DynTab.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynTab.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynTab',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..aOS(3, _omitFieldNames ? '' : 'bubble')\n    ..aI(4, _omitFieldNames ? '' : 'redPoint')\n    ..aInt64(5, _omitFieldNames ? '' : 'cityId')\n    ..aI(6, _omitFieldNames ? '' : 'isPopup')\n    ..aOM<Popup>(7, _omitFieldNames ? '' : 'popup', subBuilder: Popup.create)\n    ..aOB(8, _omitFieldNames ? '' : 'defaultTab')\n    ..aOS(9, _omitFieldNames ? '' : 'subTitle')\n    ..aOS(10, _omitFieldNames ? '' : 'anchor')\n    ..aOS(11, _omitFieldNames ? '' : 'internalTest')\n    ..aE<ShowType>(12, _omitFieldNames ? '' : 'type',\n        enumValues: ShowType.values)\n    ..aOM<DynTab>(13, _omitFieldNames ? '' : 'backUp',\n        subBuilder: DynTab.create)\n    ..aOS(14, _omitFieldNames ? '' : 'jumpHomePop')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynTab clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynTab copyWith(void Function(DynTab) updates) =>\n      super.copyWith((message) => updates(message as DynTab)) as DynTab;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynTab create() => DynTab._();\n  @$core.override\n  DynTab createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynTab getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DynTab>(create);\n  static DynTab? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get bubble => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set bubble($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBubble() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBubble() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get redPoint => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set redPoint($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasRedPoint() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearRedPoint() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get cityId => $_getI64(4);\n  @$pb.TagNumber(5)\n  set cityId($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCityId() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCityId() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get isPopup => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set isPopup($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasIsPopup() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearIsPopup() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  Popup get popup => $_getN(6);\n  @$pb.TagNumber(7)\n  set popup(Popup value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasPopup() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearPopup() => $_clearField(7);\n  @$pb.TagNumber(7)\n  Popup ensurePopup() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  $core.bool get defaultTab => $_getBF(7);\n  @$pb.TagNumber(8)\n  set defaultTab($core.bool value) => $_setBool(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasDefaultTab() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearDefaultTab() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get subTitle => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set subTitle($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasSubTitle() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearSubTitle() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get anchor => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set anchor($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasAnchor() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearAnchor() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get internalTest => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set internalTest($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasInternalTest() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearInternalTest() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  ShowType get type => $_getN(11);\n  @$pb.TagNumber(12)\n  set type(ShowType value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasType() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearType() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  DynTab get backUp => $_getN(12);\n  @$pb.TagNumber(13)\n  set backUp(DynTab value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasBackUp() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearBackUp() => $_clearField(13);\n  @$pb.TagNumber(13)\n  DynTab ensureBackUp() => $_ensure(12);\n\n  @$pb.TagNumber(14)\n  $core.String get jumpHomePop => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set jumpHomePop($core.String value) => $_setString(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasJumpHomePop() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearJumpHomePop() => $_clearField(14);\n}\n\nclass DynTabReply extends $pb.GeneratedMessage {\n  factory DynTabReply({\n    $core.Iterable<DynTab>? dynTab,\n    $core.Iterable<DynScreenTab>? screenTab,\n  }) {\n    final result = create();\n    if (dynTab != null) result.dynTab.addAll(dynTab);\n    if (screenTab != null) result.screenTab.addAll(screenTab);\n    return result;\n  }\n\n  DynTabReply._();\n\n  factory DynTabReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynTabReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynTabReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<DynTab>(1, _omitFieldNames ? '' : 'dynTab', subBuilder: DynTab.create)\n    ..pPM<DynScreenTab>(2, _omitFieldNames ? '' : 'screenTab',\n        subBuilder: DynScreenTab.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynTabReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynTabReply copyWith(void Function(DynTabReply) updates) =>\n      super.copyWith((message) => updates(message as DynTabReply))\n          as DynTabReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynTabReply create() => DynTabReply._();\n  @$core.override\n  DynTabReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynTabReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynTabReply>(create);\n  static DynTabReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<DynTab> get dynTab => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<DynScreenTab> get screenTab => $_getList(1);\n}\n\nclass DynTabReq extends $pb.GeneratedMessage {\n  factory DynTabReq({\n    $core.int? teenagersMode,\n    CampusReqFromType? fromType,\n  }) {\n    final result = create();\n    if (teenagersMode != null) result.teenagersMode = teenagersMode;\n    if (fromType != null) result.fromType = fromType;\n    return result;\n  }\n\n  DynTabReq._();\n\n  factory DynTabReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynTabReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynTabReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'teenagersMode')\n    ..aE<CampusReqFromType>(2, _omitFieldNames ? '' : 'fromType',\n        enumValues: CampusReqFromType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynTabReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynTabReq copyWith(void Function(DynTabReq) updates) =>\n      super.copyWith((message) => updates(message as DynTabReq)) as DynTabReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynTabReq create() => DynTabReq._();\n  @$core.override\n  DynTabReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynTabReq getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DynTabReq>(create);\n  static DynTabReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get teenagersMode => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set teenagersMode($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTeenagersMode() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTeenagersMode() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  CampusReqFromType get fromType => $_getN(1);\n  @$pb.TagNumber(2)\n  set fromType(CampusReqFromType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFromType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFromType() => $_clearField(2);\n}\n\nclass DynThumbReq extends $pb.GeneratedMessage {\n  factory DynThumbReq({\n    $fixnum.Int64? uid,\n    $core.String? dynId,\n    $fixnum.Int64? dynType,\n    $core.String? rid,\n    ThumbType? type,\n  }) {\n    final result = create();\n    if (uid != null) result.uid = uid;\n    if (dynId != null) result.dynId = dynId;\n    if (dynType != null) result.dynType = dynType;\n    if (rid != null) result.rid = rid;\n    if (type != null) result.type = type;\n    return result;\n  }\n\n  DynThumbReq._();\n\n  factory DynThumbReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynThumbReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynThumbReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'uid')\n    ..aOS(2, _omitFieldNames ? '' : 'dynId')\n    ..aInt64(3, _omitFieldNames ? '' : 'dynType')\n    ..aOS(4, _omitFieldNames ? '' : 'rid')\n    ..aE<ThumbType>(5, _omitFieldNames ? '' : 'type',\n        enumValues: ThumbType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynThumbReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynThumbReq copyWith(void Function(DynThumbReq) updates) =>\n      super.copyWith((message) => updates(message as DynThumbReq))\n          as DynThumbReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynThumbReq create() => DynThumbReq._();\n  @$core.override\n  DynThumbReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynThumbReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynThumbReq>(create);\n  static DynThumbReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get uid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set uid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get dynId => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set dynId($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDynId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDynId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get dynType => $_getI64(2);\n  @$pb.TagNumber(3)\n  set dynType($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDynType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDynType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get rid => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set rid($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasRid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearRid() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  ThumbType get type => $_getN(4);\n  @$pb.TagNumber(5)\n  set type(ThumbType value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearType() => $_clearField(5);\n}\n\nclass DynVideoPersonalReply extends $pb.GeneratedMessage {\n  factory DynVideoPersonalReply({\n    $core.Iterable<DynamicItem>? list,\n    $core.String? offset,\n    $core.bool? hasMore,\n    $core.String? readOffset,\n    Relation? relation,\n    TopAdditionUP? additionUp,\n    $core.String? title,\n    $core.String? titleSub,\n  }) {\n    final result = create();\n    if (list != null) result.list.addAll(list);\n    if (offset != null) result.offset = offset;\n    if (hasMore != null) result.hasMore = hasMore;\n    if (readOffset != null) result.readOffset = readOffset;\n    if (relation != null) result.relation = relation;\n    if (additionUp != null) result.additionUp = additionUp;\n    if (title != null) result.title = title;\n    if (titleSub != null) result.titleSub = titleSub;\n    return result;\n  }\n\n  DynVideoPersonalReply._();\n\n  factory DynVideoPersonalReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynVideoPersonalReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynVideoPersonalReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<DynamicItem>(1, _omitFieldNames ? '' : 'list',\n        subBuilder: DynamicItem.create)\n    ..aOS(2, _omitFieldNames ? '' : 'offset')\n    ..aOB(3, _omitFieldNames ? '' : 'hasMore')\n    ..aOS(4, _omitFieldNames ? '' : 'readOffset')\n    ..aOM<Relation>(5, _omitFieldNames ? '' : 'relation',\n        subBuilder: Relation.create)\n    ..aOM<TopAdditionUP>(6, _omitFieldNames ? '' : 'additionUp',\n        subBuilder: TopAdditionUP.create)\n    ..aOS(7, _omitFieldNames ? '' : 'title')\n    ..aOS(8, _omitFieldNames ? '' : 'titleSub')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynVideoPersonalReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynVideoPersonalReply copyWith(\n          void Function(DynVideoPersonalReply) updates) =>\n      super.copyWith((message) => updates(message as DynVideoPersonalReply))\n          as DynVideoPersonalReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynVideoPersonalReply create() => DynVideoPersonalReply._();\n  @$core.override\n  DynVideoPersonalReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynVideoPersonalReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynVideoPersonalReply>(create);\n  static DynVideoPersonalReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<DynamicItem> get list => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.String get offset => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set offset($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOffset() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOffset() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get hasMore => $_getBF(2);\n  @$pb.TagNumber(3)\n  set hasMore($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasHasMore() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearHasMore() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get readOffset => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set readOffset($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasReadOffset() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearReadOffset() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  Relation get relation => $_getN(4);\n  @$pb.TagNumber(5)\n  set relation(Relation value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasRelation() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearRelation() => $_clearField(5);\n  @$pb.TagNumber(5)\n  Relation ensureRelation() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  TopAdditionUP get additionUp => $_getN(5);\n  @$pb.TagNumber(6)\n  set additionUp(TopAdditionUP value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasAdditionUp() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearAdditionUp() => $_clearField(6);\n  @$pb.TagNumber(6)\n  TopAdditionUP ensureAdditionUp() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $core.String get title => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set title($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasTitle() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearTitle() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get titleSub => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set titleSub($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasTitleSub() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearTitleSub() => $_clearField(8);\n}\n\nclass DynVideoPersonalReq extends $pb.GeneratedMessage {\n  factory DynVideoPersonalReq({\n    $fixnum.Int64? hostUid,\n    $core.String? offset,\n    $core.int? page,\n    $core.int? isPreload,\n    PlayurlParam? playurlParam,\n    $core.int? localTime,\n    $core.String? footprint,\n    $core.String? from,\n    $1.PlayerArgs? playerArgs,\n    $fixnum.Int64? pegasusAvid,\n    $core.String? personalExtra,\n  }) {\n    final result = create();\n    if (hostUid != null) result.hostUid = hostUid;\n    if (offset != null) result.offset = offset;\n    if (page != null) result.page = page;\n    if (isPreload != null) result.isPreload = isPreload;\n    if (playurlParam != null) result.playurlParam = playurlParam;\n    if (localTime != null) result.localTime = localTime;\n    if (footprint != null) result.footprint = footprint;\n    if (from != null) result.from = from;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    if (pegasusAvid != null) result.pegasusAvid = pegasusAvid;\n    if (personalExtra != null) result.personalExtra = personalExtra;\n    return result;\n  }\n\n  DynVideoPersonalReq._();\n\n  factory DynVideoPersonalReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynVideoPersonalReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynVideoPersonalReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'hostUid')\n    ..aOS(2, _omitFieldNames ? '' : 'offset')\n    ..aI(3, _omitFieldNames ? '' : 'page')\n    ..aI(4, _omitFieldNames ? '' : 'isPreload')\n    ..aOM<PlayurlParam>(5, _omitFieldNames ? '' : 'playurlParam',\n        subBuilder: PlayurlParam.create)\n    ..aI(6, _omitFieldNames ? '' : 'localTime')\n    ..aOS(7, _omitFieldNames ? '' : 'footprint')\n    ..aOS(8, _omitFieldNames ? '' : 'from')\n    ..aOM<$1.PlayerArgs>(9, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $1.PlayerArgs.create)\n    ..aInt64(10, _omitFieldNames ? '' : 'pegasusAvid')\n    ..aOS(11, _omitFieldNames ? '' : 'personalExtra')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynVideoPersonalReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynVideoPersonalReq copyWith(void Function(DynVideoPersonalReq) updates) =>\n      super.copyWith((message) => updates(message as DynVideoPersonalReq))\n          as DynVideoPersonalReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynVideoPersonalReq create() => DynVideoPersonalReq._();\n  @$core.override\n  DynVideoPersonalReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynVideoPersonalReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynVideoPersonalReq>(create);\n  static DynVideoPersonalReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get hostUid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set hostUid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasHostUid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearHostUid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get offset => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set offset($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOffset() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOffset() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get page => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set page($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPage() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPage() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get isPreload => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set isPreload($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIsPreload() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIsPreload() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  PlayurlParam get playurlParam => $_getN(4);\n  @$pb.TagNumber(5)\n  set playurlParam(PlayurlParam value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPlayurlParam() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPlayurlParam() => $_clearField(5);\n  @$pb.TagNumber(5)\n  PlayurlParam ensurePlayurlParam() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.int get localTime => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set localTime($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasLocalTime() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearLocalTime() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get footprint => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set footprint($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasFootprint() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearFootprint() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get from => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set from($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasFrom() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearFrom() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $1.PlayerArgs get playerArgs => $_getN(8);\n  @$pb.TagNumber(9)\n  set playerArgs($1.PlayerArgs value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasPlayerArgs() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearPlayerArgs() => $_clearField(9);\n  @$pb.TagNumber(9)\n  $1.PlayerArgs ensurePlayerArgs() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  $fixnum.Int64 get pegasusAvid => $_getI64(9);\n  @$pb.TagNumber(10)\n  set pegasusAvid($fixnum.Int64 value) => $_setInt64(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasPegasusAvid() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearPegasusAvid() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get personalExtra => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set personalExtra($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasPersonalExtra() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearPersonalExtra() => $_clearField(11);\n}\n\nclass DynVideoReply extends $pb.GeneratedMessage {\n  factory DynVideoReply({\n    CardVideoDynList? dynamicList,\n    CardVideoUpList? videoUpList,\n    CardVideoFollowList? videoFollowList,\n    FeedSortConfig? sortConfig,\n  }) {\n    final result = create();\n    if (dynamicList != null) result.dynamicList = dynamicList;\n    if (videoUpList != null) result.videoUpList = videoUpList;\n    if (videoFollowList != null) result.videoFollowList = videoFollowList;\n    if (sortConfig != null) result.sortConfig = sortConfig;\n    return result;\n  }\n\n  DynVideoReply._();\n\n  factory DynVideoReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynVideoReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynVideoReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<CardVideoDynList>(1, _omitFieldNames ? '' : 'dynamicList',\n        subBuilder: CardVideoDynList.create)\n    ..aOM<CardVideoUpList>(2, _omitFieldNames ? '' : 'videoUpList',\n        subBuilder: CardVideoUpList.create)\n    ..aOM<CardVideoFollowList>(3, _omitFieldNames ? '' : 'videoFollowList',\n        subBuilder: CardVideoFollowList.create)\n    ..aOM<FeedSortConfig>(4, _omitFieldNames ? '' : 'sortConfig',\n        subBuilder: FeedSortConfig.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynVideoReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynVideoReply copyWith(void Function(DynVideoReply) updates) =>\n      super.copyWith((message) => updates(message as DynVideoReply))\n          as DynVideoReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynVideoReply create() => DynVideoReply._();\n  @$core.override\n  DynVideoReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynVideoReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynVideoReply>(create);\n  static DynVideoReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  CardVideoDynList get dynamicList => $_getN(0);\n  @$pb.TagNumber(1)\n  set dynamicList(CardVideoDynList value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDynamicList() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDynamicList() => $_clearField(1);\n  @$pb.TagNumber(1)\n  CardVideoDynList ensureDynamicList() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  CardVideoUpList get videoUpList => $_getN(1);\n  @$pb.TagNumber(2)\n  set videoUpList(CardVideoUpList value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasVideoUpList() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearVideoUpList() => $_clearField(2);\n  @$pb.TagNumber(2)\n  CardVideoUpList ensureVideoUpList() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  CardVideoFollowList get videoFollowList => $_getN(2);\n  @$pb.TagNumber(3)\n  set videoFollowList(CardVideoFollowList value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasVideoFollowList() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearVideoFollowList() => $_clearField(3);\n  @$pb.TagNumber(3)\n  CardVideoFollowList ensureVideoFollowList() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  FeedSortConfig get sortConfig => $_getN(3);\n  @$pb.TagNumber(4)\n  set sortConfig(FeedSortConfig value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSortConfig() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSortConfig() => $_clearField(4);\n  @$pb.TagNumber(4)\n  FeedSortConfig ensureSortConfig() => $_ensure(3);\n}\n\nclass DynVideoReq extends $pb.GeneratedMessage {\n  factory DynVideoReq({\n    $core.String? updateBaseline,\n    $core.String? offset,\n    $core.int? page,\n    Refresh? refreshType,\n    PlayurlParam? playurlParam,\n    $core.String? assistBaseline,\n    $core.int? localTime,\n    $core.String? from,\n    $1.PlayerArgs? playerArgs,\n    FeedSortOptionReq? reqSortOption,\n  }) {\n    final result = create();\n    if (updateBaseline != null) result.updateBaseline = updateBaseline;\n    if (offset != null) result.offset = offset;\n    if (page != null) result.page = page;\n    if (refreshType != null) result.refreshType = refreshType;\n    if (playurlParam != null) result.playurlParam = playurlParam;\n    if (assistBaseline != null) result.assistBaseline = assistBaseline;\n    if (localTime != null) result.localTime = localTime;\n    if (from != null) result.from = from;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    if (reqSortOption != null) result.reqSortOption = reqSortOption;\n    return result;\n  }\n\n  DynVideoReq._();\n\n  factory DynVideoReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynVideoReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynVideoReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'updateBaseline')\n    ..aOS(2, _omitFieldNames ? '' : 'offset')\n    ..aI(3, _omitFieldNames ? '' : 'page')\n    ..aE<Refresh>(4, _omitFieldNames ? '' : 'refreshType',\n        enumValues: Refresh.values)\n    ..aOM<PlayurlParam>(5, _omitFieldNames ? '' : 'playurlParam',\n        subBuilder: PlayurlParam.create)\n    ..aOS(6, _omitFieldNames ? '' : 'assistBaseline')\n    ..aI(7, _omitFieldNames ? '' : 'localTime')\n    ..aOS(8, _omitFieldNames ? '' : 'from')\n    ..aOM<$1.PlayerArgs>(9, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $1.PlayerArgs.create)\n    ..aOM<FeedSortOptionReq>(10, _omitFieldNames ? '' : 'reqSortOption',\n        subBuilder: FeedSortOptionReq.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynVideoReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynVideoReq copyWith(void Function(DynVideoReq) updates) =>\n      super.copyWith((message) => updates(message as DynVideoReq))\n          as DynVideoReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynVideoReq create() => DynVideoReq._();\n  @$core.override\n  DynVideoReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynVideoReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynVideoReq>(create);\n  static DynVideoReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get updateBaseline => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set updateBaseline($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUpdateBaseline() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUpdateBaseline() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get offset => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set offset($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOffset() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOffset() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get page => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set page($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPage() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPage() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  Refresh get refreshType => $_getN(3);\n  @$pb.TagNumber(4)\n  set refreshType(Refresh value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasRefreshType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearRefreshType() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  PlayurlParam get playurlParam => $_getN(4);\n  @$pb.TagNumber(5)\n  set playurlParam(PlayurlParam value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPlayurlParam() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPlayurlParam() => $_clearField(5);\n  @$pb.TagNumber(5)\n  PlayurlParam ensurePlayurlParam() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.String get assistBaseline => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set assistBaseline($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasAssistBaseline() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearAssistBaseline() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get localTime => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set localTime($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasLocalTime() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearLocalTime() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get from => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set from($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasFrom() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearFrom() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $1.PlayerArgs get playerArgs => $_getN(8);\n  @$pb.TagNumber(9)\n  set playerArgs($1.PlayerArgs value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasPlayerArgs() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearPlayerArgs() => $_clearField(9);\n  @$pb.TagNumber(9)\n  $1.PlayerArgs ensurePlayerArgs() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  FeedSortOptionReq get reqSortOption => $_getN(9);\n  @$pb.TagNumber(10)\n  set reqSortOption(FeedSortOptionReq value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasReqSortOption() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearReqSortOption() => $_clearField(10);\n  @$pb.TagNumber(10)\n  FeedSortOptionReq ensureReqSortOption() => $_ensure(9);\n}\n\nclass DynVideoUpdOffsetReq extends $pb.GeneratedMessage {\n  factory DynVideoUpdOffsetReq({\n    $fixnum.Int64? hostUid,\n    $core.String? readOffset,\n    $core.String? footprint,\n    $core.String? personalExtra,\n  }) {\n    final result = create();\n    if (hostUid != null) result.hostUid = hostUid;\n    if (readOffset != null) result.readOffset = readOffset;\n    if (footprint != null) result.footprint = footprint;\n    if (personalExtra != null) result.personalExtra = personalExtra;\n    return result;\n  }\n\n  DynVideoUpdOffsetReq._();\n\n  factory DynVideoUpdOffsetReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynVideoUpdOffsetReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynVideoUpdOffsetReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'hostUid')\n    ..aOS(2, _omitFieldNames ? '' : 'readOffset')\n    ..aOS(3, _omitFieldNames ? '' : 'footprint')\n    ..aOS(4, _omitFieldNames ? '' : 'personalExtra')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynVideoUpdOffsetReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynVideoUpdOffsetReq copyWith(void Function(DynVideoUpdOffsetReq) updates) =>\n      super.copyWith((message) => updates(message as DynVideoUpdOffsetReq))\n          as DynVideoUpdOffsetReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynVideoUpdOffsetReq create() => DynVideoUpdOffsetReq._();\n  @$core.override\n  DynVideoUpdOffsetReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynVideoUpdOffsetReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynVideoUpdOffsetReq>(create);\n  static DynVideoUpdOffsetReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get hostUid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set hostUid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasHostUid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearHostUid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get readOffset => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set readOffset($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasReadOffset() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearReadOffset() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get footprint => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set footprint($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFootprint() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFootprint() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get personalExtra => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set personalExtra($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPersonalExtra() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPersonalExtra() => $_clearField(4);\n}\n\nclass DynVoteReply extends $pb.GeneratedMessage {\n  factory DynVoteReply({\n    AdditionVote2? item,\n    $core.String? toast,\n  }) {\n    final result = create();\n    if (item != null) result.item = item;\n    if (toast != null) result.toast = toast;\n    return result;\n  }\n\n  DynVoteReply._();\n\n  factory DynVoteReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynVoteReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynVoteReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<AdditionVote2>(1, _omitFieldNames ? '' : 'item',\n        subBuilder: AdditionVote2.create)\n    ..aOS(2, _omitFieldNames ? '' : 'toast')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynVoteReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynVoteReply copyWith(void Function(DynVoteReply) updates) =>\n      super.copyWith((message) => updates(message as DynVoteReply))\n          as DynVoteReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynVoteReply create() => DynVoteReply._();\n  @$core.override\n  DynVoteReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynVoteReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynVoteReply>(create);\n  static DynVoteReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  AdditionVote2 get item => $_getN(0);\n  @$pb.TagNumber(1)\n  set item(AdditionVote2 value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasItem() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearItem() => $_clearField(1);\n  @$pb.TagNumber(1)\n  AdditionVote2 ensureItem() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get toast => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set toast($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasToast() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearToast() => $_clearField(2);\n}\n\nclass DynVoteReq extends $pb.GeneratedMessage {\n  factory DynVoteReq({\n    $fixnum.Int64? voteId,\n    $core.Iterable<$fixnum.Int64>? votes,\n    VoteStatus? status,\n    $core.String? dynamicId,\n    $core.bool? share,\n  }) {\n    final result = create();\n    if (voteId != null) result.voteId = voteId;\n    if (votes != null) result.votes.addAll(votes);\n    if (status != null) result.status = status;\n    if (dynamicId != null) result.dynamicId = dynamicId;\n    if (share != null) result.share = share;\n    return result;\n  }\n\n  DynVoteReq._();\n\n  factory DynVoteReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynVoteReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynVoteReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'voteId')\n    ..p<$fixnum.Int64>(2, _omitFieldNames ? '' : 'votes', $pb.PbFieldType.K6)\n    ..aE<VoteStatus>(3, _omitFieldNames ? '' : 'status',\n        enumValues: VoteStatus.values)\n    ..aOS(4, _omitFieldNames ? '' : 'dynamicId')\n    ..aOB(5, _omitFieldNames ? '' : 'share')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynVoteReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynVoteReq copyWith(void Function(DynVoteReq) updates) =>\n      super.copyWith((message) => updates(message as DynVoteReq)) as DynVoteReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynVoteReq create() => DynVoteReq._();\n  @$core.override\n  DynVoteReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynVoteReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynVoteReq>(create);\n  static DynVoteReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get voteId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set voteId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasVoteId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearVoteId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<$fixnum.Int64> get votes => $_getList(1);\n\n  @$pb.TagNumber(3)\n  VoteStatus get status => $_getN(2);\n  @$pb.TagNumber(3)\n  set status(VoteStatus value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasStatus() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearStatus() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get dynamicId => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set dynamicId($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDynamicId() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDynamicId() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.bool get share => $_getBF(4);\n  @$pb.TagNumber(5)\n  set share($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasShare() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearShare() => $_clearField(5);\n}\n\nclass DynamicItem extends $pb.GeneratedMessage {\n  factory DynamicItem({\n    DynamicType? cardType,\n    DynamicType? itemType,\n    $core.Iterable<Module>? modules,\n    Extend? extend,\n    $core.int? hasFold,\n    $core.String? serverInfo,\n  }) {\n    final result = create();\n    if (cardType != null) result.cardType = cardType;\n    if (itemType != null) result.itemType = itemType;\n    if (modules != null) result.modules.addAll(modules);\n    if (extend != null) result.extend = extend;\n    if (hasFold != null) result.hasFold = hasFold;\n    if (serverInfo != null) result.serverInfo = serverInfo;\n    return result;\n  }\n\n  DynamicItem._();\n\n  factory DynamicItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynamicItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynamicItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aE<DynamicType>(1, _omitFieldNames ? '' : 'cardType',\n        enumValues: DynamicType.values)\n    ..aE<DynamicType>(2, _omitFieldNames ? '' : 'itemType',\n        enumValues: DynamicType.values)\n    ..pPM<Module>(3, _omitFieldNames ? '' : 'modules',\n        subBuilder: Module.create)\n    ..aOM<Extend>(4, _omitFieldNames ? '' : 'extend', subBuilder: Extend.create)\n    ..aI(5, _omitFieldNames ? '' : 'hasFold')\n    ..aOS(6, _omitFieldNames ? '' : 'serverInfo')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynamicItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynamicItem copyWith(void Function(DynamicItem) updates) =>\n      super.copyWith((message) => updates(message as DynamicItem))\n          as DynamicItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynamicItem create() => DynamicItem._();\n  @$core.override\n  DynamicItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynamicItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynamicItem>(create);\n  static DynamicItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  DynamicType get cardType => $_getN(0);\n  @$pb.TagNumber(1)\n  set cardType(DynamicType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCardType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCardType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  DynamicType get itemType => $_getN(1);\n  @$pb.TagNumber(2)\n  set itemType(DynamicType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasItemType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearItemType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<Module> get modules => $_getList(2);\n\n  @$pb.TagNumber(4)\n  Extend get extend => $_getN(3);\n  @$pb.TagNumber(4)\n  set extend(Extend value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasExtend() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearExtend() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Extend ensureExtend() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.int get hasFold => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set hasFold($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasHasFold() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearHasFold() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get serverInfo => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set serverInfo($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasServerInfo() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearServerInfo() => $_clearField(6);\n}\n\nclass DynamicList extends $pb.GeneratedMessage {\n  factory DynamicList({\n    $core.Iterable<DynamicItem>? list,\n    $fixnum.Int64? updateNum,\n    $core.String? historyOffset,\n    $core.String? updateBaseline,\n    $core.bool? hasMore,\n  }) {\n    final result = create();\n    if (list != null) result.list.addAll(list);\n    if (updateNum != null) result.updateNum = updateNum;\n    if (historyOffset != null) result.historyOffset = historyOffset;\n    if (updateBaseline != null) result.updateBaseline = updateBaseline;\n    if (hasMore != null) result.hasMore = hasMore;\n    return result;\n  }\n\n  DynamicList._();\n\n  factory DynamicList.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DynamicList.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DynamicList',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<DynamicItem>(1, _omitFieldNames ? '' : 'list',\n        subBuilder: DynamicItem.create)\n    ..aInt64(2, _omitFieldNames ? '' : 'updateNum')\n    ..aOS(3, _omitFieldNames ? '' : 'historyOffset')\n    ..aOS(4, _omitFieldNames ? '' : 'updateBaseline')\n    ..aOB(5, _omitFieldNames ? '' : 'hasMore')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynamicList clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DynamicList copyWith(void Function(DynamicList) updates) =>\n      super.copyWith((message) => updates(message as DynamicList))\n          as DynamicList;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DynamicList create() => DynamicList._();\n  @$core.override\n  DynamicList createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DynamicList getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DynamicList>(create);\n  static DynamicList? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<DynamicItem> get list => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get updateNum => $_getI64(1);\n  @$pb.TagNumber(2)\n  set updateNum($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUpdateNum() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUpdateNum() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get historyOffset => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set historyOffset($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasHistoryOffset() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearHistoryOffset() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get updateBaseline => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set updateBaseline($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUpdateBaseline() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUpdateBaseline() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.bool get hasMore => $_getBF(4);\n  @$pb.TagNumber(5)\n  set hasMore($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasHasMore() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearHasMore() => $_clearField(5);\n}\n\nclass EmojiSizeSpec extends $pb.GeneratedMessage {\n  factory EmojiSizeSpec({\n    $fixnum.Int64? width,\n  }) {\n    final result = create();\n    if (width != null) result.width = width;\n    return result;\n  }\n\n  EmojiSizeSpec._();\n\n  factory EmojiSizeSpec.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory EmojiSizeSpec.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'EmojiSizeSpec',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'width')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  EmojiSizeSpec clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  EmojiSizeSpec copyWith(void Function(EmojiSizeSpec) updates) =>\n      super.copyWith((message) => updates(message as EmojiSizeSpec))\n          as EmojiSizeSpec;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static EmojiSizeSpec create() => EmojiSizeSpec._();\n  @$core.override\n  EmojiSizeSpec createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static EmojiSizeSpec getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<EmojiSizeSpec>(create);\n  static EmojiSizeSpec? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get width => $_getI64(0);\n  @$pb.TagNumber(1)\n  set width($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasWidth() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearWidth() => $_clearField(1);\n}\n\nclass EmoteNode extends $pb.GeneratedMessage {\n  factory EmoteNode({\n    WordNode? rawText,\n    $core.String? emoteUrl,\n    EmoteSize? emoteWidth,\n    $core.bool? isInlineImg,\n    ImgInlineCfg? inlineImgCfg,\n    $core.bool? allowAnimated,\n    EmoteClickAction? clickAction,\n    $core.String? previewName,\n    $core.String? previewNameJumpUri,\n    $core.String? emoteUrlDark,\n  }) {\n    final result = create();\n    if (rawText != null) result.rawText = rawText;\n    if (emoteUrl != null) result.emoteUrl = emoteUrl;\n    if (emoteWidth != null) result.emoteWidth = emoteWidth;\n    if (isInlineImg != null) result.isInlineImg = isInlineImg;\n    if (inlineImgCfg != null) result.inlineImgCfg = inlineImgCfg;\n    if (allowAnimated != null) result.allowAnimated = allowAnimated;\n    if (clickAction != null) result.clickAction = clickAction;\n    if (previewName != null) result.previewName = previewName;\n    if (previewNameJumpUri != null)\n      result.previewNameJumpUri = previewNameJumpUri;\n    if (emoteUrlDark != null) result.emoteUrlDark = emoteUrlDark;\n    return result;\n  }\n\n  EmoteNode._();\n\n  factory EmoteNode.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory EmoteNode.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'EmoteNode',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<WordNode>(1, _omitFieldNames ? '' : 'rawText',\n        subBuilder: WordNode.create)\n    ..aOS(2, _omitFieldNames ? '' : 'emoteUrl')\n    ..aOM<EmoteSize>(3, _omitFieldNames ? '' : 'emoteWidth',\n        subBuilder: EmoteSize.create)\n    ..aOB(4, _omitFieldNames ? '' : 'isInlineImg')\n    ..aOM<ImgInlineCfg>(5, _omitFieldNames ? '' : 'inlineImgCfg',\n        subBuilder: ImgInlineCfg.create)\n    ..aOB(6, _omitFieldNames ? '' : 'allowAnimated')\n    ..aE<EmoteClickAction>(7, _omitFieldNames ? '' : 'clickAction',\n        enumValues: EmoteClickAction.values)\n    ..aOS(8, _omitFieldNames ? '' : 'previewName')\n    ..aOS(9, _omitFieldNames ? '' : 'previewNameJumpUri')\n    ..aOS(10, _omitFieldNames ? '' : 'emoteUrlDark')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  EmoteNode clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  EmoteNode copyWith(void Function(EmoteNode) updates) =>\n      super.copyWith((message) => updates(message as EmoteNode)) as EmoteNode;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static EmoteNode create() => EmoteNode._();\n  @$core.override\n  EmoteNode createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static EmoteNode getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<EmoteNode>(create);\n  static EmoteNode? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  WordNode get rawText => $_getN(0);\n  @$pb.TagNumber(1)\n  set rawText(WordNode value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasRawText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRawText() => $_clearField(1);\n  @$pb.TagNumber(1)\n  WordNode ensureRawText() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get emoteUrl => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set emoteUrl($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasEmoteUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearEmoteUrl() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  EmoteSize get emoteWidth => $_getN(2);\n  @$pb.TagNumber(3)\n  set emoteWidth(EmoteSize value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasEmoteWidth() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearEmoteWidth() => $_clearField(3);\n  @$pb.TagNumber(3)\n  EmoteSize ensureEmoteWidth() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.bool get isInlineImg => $_getBF(3);\n  @$pb.TagNumber(4)\n  set isInlineImg($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIsInlineImg() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIsInlineImg() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  ImgInlineCfg get inlineImgCfg => $_getN(4);\n  @$pb.TagNumber(5)\n  set inlineImgCfg(ImgInlineCfg value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasInlineImgCfg() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearInlineImgCfg() => $_clearField(5);\n  @$pb.TagNumber(5)\n  ImgInlineCfg ensureInlineImgCfg() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.bool get allowAnimated => $_getBF(5);\n  @$pb.TagNumber(6)\n  set allowAnimated($core.bool value) => $_setBool(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasAllowAnimated() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearAllowAnimated() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  EmoteClickAction get clickAction => $_getN(6);\n  @$pb.TagNumber(7)\n  set clickAction(EmoteClickAction value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasClickAction() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearClickAction() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get previewName => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set previewName($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasPreviewName() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearPreviewName() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get previewNameJumpUri => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set previewNameJumpUri($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasPreviewNameJumpUri() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearPreviewNameJumpUri() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get emoteUrlDark => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set emoteUrlDark($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasEmoteUrlDark() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearEmoteUrlDark() => $_clearField(10);\n}\n\nclass EmoteSize extends $pb.GeneratedMessage {\n  factory EmoteSize({\n    $core.double? width,\n    $core.int? emojiSize,\n  }) {\n    final result = create();\n    if (width != null) result.width = width;\n    if (emojiSize != null) result.emojiSize = emojiSize;\n    return result;\n  }\n\n  EmoteSize._();\n\n  factory EmoteSize.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory EmoteSize.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'EmoteSize',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aD(1, _omitFieldNames ? '' : 'width')\n    ..aI(2, _omitFieldNames ? '' : 'emojiSize')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  EmoteSize clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  EmoteSize copyWith(void Function(EmoteSize) updates) =>\n      super.copyWith((message) => updates(message as EmoteSize)) as EmoteSize;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static EmoteSize create() => EmoteSize._();\n  @$core.override\n  EmoteSize createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static EmoteSize getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<EmoteSize>(create);\n  static EmoteSize? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.double get width => $_getN(0);\n  @$pb.TagNumber(1)\n  set width($core.double value) => $_setDouble(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasWidth() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearWidth() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get emojiSize => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set emojiSize($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasEmojiSize() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearEmojiSize() => $_clearField(2);\n}\n\nclass ExtInfoCommon extends $pb.GeneratedMessage {\n  factory ExtInfoCommon({\n    $core.String? title,\n    $core.String? uri,\n    $core.String? icon,\n    $core.int? poiType,\n    DynExtendType? type,\n    $core.String? subModule,\n    $core.String? actionText,\n    $core.String? actionUrl,\n    $fixnum.Int64? rid,\n    $core.bool? isShowLight,\n    ExtInfoCommon_ExtTagStyle? tagStyle,\n    $core.String? extendReportTag,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (uri != null) result.uri = uri;\n    if (icon != null) result.icon = icon;\n    if (poiType != null) result.poiType = poiType;\n    if (type != null) result.type = type;\n    if (subModule != null) result.subModule = subModule;\n    if (actionText != null) result.actionText = actionText;\n    if (actionUrl != null) result.actionUrl = actionUrl;\n    if (rid != null) result.rid = rid;\n    if (isShowLight != null) result.isShowLight = isShowLight;\n    if (tagStyle != null) result.tagStyle = tagStyle;\n    if (extendReportTag != null) result.extendReportTag = extendReportTag;\n    return result;\n  }\n\n  ExtInfoCommon._();\n\n  factory ExtInfoCommon.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ExtInfoCommon.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ExtInfoCommon',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..aOS(3, _omitFieldNames ? '' : 'icon')\n    ..aI(4, _omitFieldNames ? '' : 'poiType')\n    ..aE<DynExtendType>(5, _omitFieldNames ? '' : 'type',\n        enumValues: DynExtendType.values)\n    ..aOS(6, _omitFieldNames ? '' : 'subModule')\n    ..aOS(7, _omitFieldNames ? '' : 'actionText')\n    ..aOS(8, _omitFieldNames ? '' : 'actionUrl')\n    ..aInt64(9, _omitFieldNames ? '' : 'rid')\n    ..aOB(10, _omitFieldNames ? '' : 'isShowLight')\n    ..aE<ExtInfoCommon_ExtTagStyle>(11, _omitFieldNames ? '' : 'tagStyle',\n        enumValues: ExtInfoCommon_ExtTagStyle.values)\n    ..aOS(12, _omitFieldNames ? '' : 'extendReportTag')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtInfoCommon clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtInfoCommon copyWith(void Function(ExtInfoCommon) updates) =>\n      super.copyWith((message) => updates(message as ExtInfoCommon))\n          as ExtInfoCommon;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ExtInfoCommon create() => ExtInfoCommon._();\n  @$core.override\n  ExtInfoCommon createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ExtInfoCommon getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ExtInfoCommon>(create);\n  static ExtInfoCommon? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get icon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set icon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIcon() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get poiType => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set poiType($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPoiType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPoiType() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  DynExtendType get type => $_getN(4);\n  @$pb.TagNumber(5)\n  set type(DynExtendType value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearType() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get subModule => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set subModule($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasSubModule() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearSubModule() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get actionText => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set actionText($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasActionText() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearActionText() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get actionUrl => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set actionUrl($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasActionUrl() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearActionUrl() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get rid => $_getI64(8);\n  @$pb.TagNumber(9)\n  set rid($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasRid() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearRid() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.bool get isShowLight => $_getBF(9);\n  @$pb.TagNumber(10)\n  set isShowLight($core.bool value) => $_setBool(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasIsShowLight() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearIsShowLight() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  ExtInfoCommon_ExtTagStyle get tagStyle => $_getN(10);\n  @$pb.TagNumber(11)\n  set tagStyle(ExtInfoCommon_ExtTagStyle value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasTagStyle() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearTagStyle() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get extendReportTag => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set extendReportTag($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasExtendReportTag() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearExtendReportTag() => $_clearField(12);\n}\n\nclass ExtInfoGame extends $pb.GeneratedMessage {\n  factory ExtInfoGame({\n    $core.String? title,\n    $core.String? uri,\n    $core.String? icon,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (uri != null) result.uri = uri;\n    if (icon != null) result.icon = icon;\n    return result;\n  }\n\n  ExtInfoGame._();\n\n  factory ExtInfoGame.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ExtInfoGame.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ExtInfoGame',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..aOS(3, _omitFieldNames ? '' : 'icon')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtInfoGame clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtInfoGame copyWith(void Function(ExtInfoGame) updates) =>\n      super.copyWith((message) => updates(message as ExtInfoGame))\n          as ExtInfoGame;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ExtInfoGame create() => ExtInfoGame._();\n  @$core.override\n  ExtInfoGame createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ExtInfoGame getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ExtInfoGame>(create);\n  static ExtInfoGame? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get icon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set icon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIcon() => $_clearField(3);\n}\n\nclass ExtInfoHot extends $pb.GeneratedMessage {\n  factory ExtInfoHot({\n    $core.String? title,\n    $core.String? uri,\n    $core.String? icon,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (uri != null) result.uri = uri;\n    if (icon != null) result.icon = icon;\n    return result;\n  }\n\n  ExtInfoHot._();\n\n  factory ExtInfoHot.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ExtInfoHot.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ExtInfoHot',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..aOS(3, _omitFieldNames ? '' : 'icon')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtInfoHot clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtInfoHot copyWith(void Function(ExtInfoHot) updates) =>\n      super.copyWith((message) => updates(message as ExtInfoHot)) as ExtInfoHot;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ExtInfoHot create() => ExtInfoHot._();\n  @$core.override\n  ExtInfoHot createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ExtInfoHot getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ExtInfoHot>(create);\n  static ExtInfoHot? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get icon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set icon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIcon() => $_clearField(3);\n}\n\nclass ExtInfoLBS extends $pb.GeneratedMessage {\n  factory ExtInfoLBS({\n    $core.String? title,\n    $core.String? uri,\n    $core.String? icon,\n    $core.int? poiType,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (uri != null) result.uri = uri;\n    if (icon != null) result.icon = icon;\n    if (poiType != null) result.poiType = poiType;\n    return result;\n  }\n\n  ExtInfoLBS._();\n\n  factory ExtInfoLBS.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ExtInfoLBS.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ExtInfoLBS',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..aOS(3, _omitFieldNames ? '' : 'icon')\n    ..aI(4, _omitFieldNames ? '' : 'poiType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtInfoLBS clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtInfoLBS copyWith(void Function(ExtInfoLBS) updates) =>\n      super.copyWith((message) => updates(message as ExtInfoLBS)) as ExtInfoLBS;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ExtInfoLBS create() => ExtInfoLBS._();\n  @$core.override\n  ExtInfoLBS createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ExtInfoLBS getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ExtInfoLBS>(create);\n  static ExtInfoLBS? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get icon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set icon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIcon() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get poiType => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set poiType($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPoiType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPoiType() => $_clearField(4);\n}\n\nclass ExtInfoOGV extends $pb.GeneratedMessage {\n  factory ExtInfoOGV({\n    $core.Iterable<InfoOGV>? infoOgv,\n  }) {\n    final result = create();\n    if (infoOgv != null) result.infoOgv.addAll(infoOgv);\n    return result;\n  }\n\n  ExtInfoOGV._();\n\n  factory ExtInfoOGV.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ExtInfoOGV.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ExtInfoOGV',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<InfoOGV>(1, _omitFieldNames ? '' : 'infoOgv',\n        subBuilder: InfoOGV.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtInfoOGV clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtInfoOGV copyWith(void Function(ExtInfoOGV) updates) =>\n      super.copyWith((message) => updates(message as ExtInfoOGV)) as ExtInfoOGV;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ExtInfoOGV create() => ExtInfoOGV._();\n  @$core.override\n  ExtInfoOGV createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ExtInfoOGV getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ExtInfoOGV>(create);\n  static ExtInfoOGV? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<InfoOGV> get infoOgv => $_getList(0);\n}\n\nclass ExtInfoTopic extends $pb.GeneratedMessage {\n  factory ExtInfoTopic({\n    $core.String? title,\n    $core.String? uri,\n    $core.String? icon,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (uri != null) result.uri = uri;\n    if (icon != null) result.icon = icon;\n    return result;\n  }\n\n  ExtInfoTopic._();\n\n  factory ExtInfoTopic.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ExtInfoTopic.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ExtInfoTopic',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..aOS(3, _omitFieldNames ? '' : 'icon')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtInfoTopic clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtInfoTopic copyWith(void Function(ExtInfoTopic) updates) =>\n      super.copyWith((message) => updates(message as ExtInfoTopic))\n          as ExtInfoTopic;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ExtInfoTopic create() => ExtInfoTopic._();\n  @$core.override\n  ExtInfoTopic createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ExtInfoTopic getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ExtInfoTopic>(create);\n  static ExtInfoTopic? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get icon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set icon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIcon() => $_clearField(3);\n}\n\nclass Extend extends $pb.GeneratedMessage {\n  factory Extend({\n    $core.String? dynIdStr,\n    $core.String? businessId,\n    $core.String? origDynIdStr,\n    $core.String? origName,\n    $core.String? origImgUrl,\n    $core.Iterable<Description>? origDesc,\n    $core.Iterable<Description>? desc,\n    DynamicType? origDynType,\n    $core.String? shareType,\n    $core.String? shareScene,\n    $core.bool? isFastShare,\n    $core.int? rType,\n    $fixnum.Int64? dynType,\n    $fixnum.Int64? uid,\n    $core.String? cardUrl,\n    $6.Any? sourceContent,\n    $core.String? origFace,\n    ExtendReply? reply,\n    $core.String? trackId,\n    ModuleOpusSummary? opusSummary,\n    OnlyFansProperty? onlyFansProperty,\n    DynFeatureGate? featureGate,\n    $core.bool? isInAudit,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? historyReport,\n    $core.String? reportMetricData,\n    TextParagraph? descTextOpus,\n    $core.bool? isPreviewOnly,\n    RepostExtraInfo? repostExtraInfo,\n    MangaProperty? mangaProperty,\n    $core.String? upName,\n    $core.String? upFace,\n    DynVisibilityStatus? desiredVisibilityStatus,\n  }) {\n    final result = create();\n    if (dynIdStr != null) result.dynIdStr = dynIdStr;\n    if (businessId != null) result.businessId = businessId;\n    if (origDynIdStr != null) result.origDynIdStr = origDynIdStr;\n    if (origName != null) result.origName = origName;\n    if (origImgUrl != null) result.origImgUrl = origImgUrl;\n    if (origDesc != null) result.origDesc.addAll(origDesc);\n    if (desc != null) result.desc.addAll(desc);\n    if (origDynType != null) result.origDynType = origDynType;\n    if (shareType != null) result.shareType = shareType;\n    if (shareScene != null) result.shareScene = shareScene;\n    if (isFastShare != null) result.isFastShare = isFastShare;\n    if (rType != null) result.rType = rType;\n    if (dynType != null) result.dynType = dynType;\n    if (uid != null) result.uid = uid;\n    if (cardUrl != null) result.cardUrl = cardUrl;\n    if (sourceContent != null) result.sourceContent = sourceContent;\n    if (origFace != null) result.origFace = origFace;\n    if (reply != null) result.reply = reply;\n    if (trackId != null) result.trackId = trackId;\n    if (opusSummary != null) result.opusSummary = opusSummary;\n    if (onlyFansProperty != null) result.onlyFansProperty = onlyFansProperty;\n    if (featureGate != null) result.featureGate = featureGate;\n    if (isInAudit != null) result.isInAudit = isInAudit;\n    if (historyReport != null) result.historyReport.addEntries(historyReport);\n    if (reportMetricData != null) result.reportMetricData = reportMetricData;\n    if (descTextOpus != null) result.descTextOpus = descTextOpus;\n    if (isPreviewOnly != null) result.isPreviewOnly = isPreviewOnly;\n    if (repostExtraInfo != null) result.repostExtraInfo = repostExtraInfo;\n    if (mangaProperty != null) result.mangaProperty = mangaProperty;\n    if (upName != null) result.upName = upName;\n    if (upFace != null) result.upFace = upFace;\n    if (desiredVisibilityStatus != null)\n      result.desiredVisibilityStatus = desiredVisibilityStatus;\n    return result;\n  }\n\n  Extend._();\n\n  factory Extend.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Extend.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Extend',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'dynIdStr')\n    ..aOS(2, _omitFieldNames ? '' : 'businessId')\n    ..aOS(3, _omitFieldNames ? '' : 'origDynIdStr')\n    ..aOS(4, _omitFieldNames ? '' : 'origName')\n    ..aOS(5, _omitFieldNames ? '' : 'origImgUrl')\n    ..pPM<Description>(6, _omitFieldNames ? '' : 'origDesc',\n        subBuilder: Description.create)\n    ..pPM<Description>(7, _omitFieldNames ? '' : 'desc',\n        subBuilder: Description.create)\n    ..aE<DynamicType>(8, _omitFieldNames ? '' : 'origDynType',\n        enumValues: DynamicType.values)\n    ..aOS(9, _omitFieldNames ? '' : 'shareType')\n    ..aOS(10, _omitFieldNames ? '' : 'shareScene')\n    ..aOB(11, _omitFieldNames ? '' : 'isFastShare')\n    ..aI(12, _omitFieldNames ? '' : 'rType')\n    ..aInt64(13, _omitFieldNames ? '' : 'dynType')\n    ..aInt64(14, _omitFieldNames ? '' : 'uid')\n    ..aOS(15, _omitFieldNames ? '' : 'cardUrl')\n    ..aOM<$6.Any>(16, _omitFieldNames ? '' : 'sourceContent',\n        subBuilder: $6.Any.create)\n    ..aOS(17, _omitFieldNames ? '' : 'origFace')\n    ..aOM<ExtendReply>(18, _omitFieldNames ? '' : 'reply',\n        subBuilder: ExtendReply.create)\n    ..aOS(19, _omitFieldNames ? '' : 'trackId')\n    ..aOM<ModuleOpusSummary>(20, _omitFieldNames ? '' : 'opusSummary',\n        subBuilder: ModuleOpusSummary.create)\n    ..aOM<OnlyFansProperty>(21, _omitFieldNames ? '' : 'onlyFansProperty',\n        subBuilder: OnlyFansProperty.create)\n    ..aOM<DynFeatureGate>(22, _omitFieldNames ? '' : 'featureGate',\n        subBuilder: DynFeatureGate.create)\n    ..aOB(23, _omitFieldNames ? '' : 'isInAudit')\n    ..m<$core.String, $core.String>(24, _omitFieldNames ? '' : 'historyReport',\n        entryClassName: 'Extend.HistoryReportEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.dynamic.v2'))\n    ..aOS(25, _omitFieldNames ? '' : 'reportMetricData')\n    ..aOM<TextParagraph>(26, _omitFieldNames ? '' : 'descTextOpus',\n        subBuilder: TextParagraph.create)\n    ..aOB(27, _omitFieldNames ? '' : 'isPreviewOnly')\n    ..aOM<RepostExtraInfo>(28, _omitFieldNames ? '' : 'repostExtraInfo',\n        subBuilder: RepostExtraInfo.create)\n    ..aOM<MangaProperty>(29, _omitFieldNames ? '' : 'mangaProperty',\n        subBuilder: MangaProperty.create)\n    ..aOS(30, _omitFieldNames ? '' : 'upName')\n    ..aOS(31, _omitFieldNames ? '' : 'upFace')\n    ..aE<DynVisibilityStatus>(\n        32, _omitFieldNames ? '' : 'desiredVisibilityStatus',\n        enumValues: DynVisibilityStatus.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Extend clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Extend copyWith(void Function(Extend) updates) =>\n      super.copyWith((message) => updates(message as Extend)) as Extend;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Extend create() => Extend._();\n  @$core.override\n  Extend createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Extend getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Extend>(create);\n  static Extend? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get dynIdStr => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set dynIdStr($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDynIdStr() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDynIdStr() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get businessId => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set businessId($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBusinessId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBusinessId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get origDynIdStr => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set origDynIdStr($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasOrigDynIdStr() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearOrigDynIdStr() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get origName => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set origName($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasOrigName() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearOrigName() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get origImgUrl => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set origImgUrl($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasOrigImgUrl() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearOrigImgUrl() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $pb.PbList<Description> get origDesc => $_getList(5);\n\n  @$pb.TagNumber(7)\n  $pb.PbList<Description> get desc => $_getList(6);\n\n  @$pb.TagNumber(8)\n  DynamicType get origDynType => $_getN(7);\n  @$pb.TagNumber(8)\n  set origDynType(DynamicType value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasOrigDynType() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearOrigDynType() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get shareType => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set shareType($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasShareType() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearShareType() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get shareScene => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set shareScene($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasShareScene() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearShareScene() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.bool get isFastShare => $_getBF(10);\n  @$pb.TagNumber(11)\n  set isFastShare($core.bool value) => $_setBool(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasIsFastShare() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearIsFastShare() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.int get rType => $_getIZ(11);\n  @$pb.TagNumber(12)\n  set rType($core.int value) => $_setSignedInt32(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasRType() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearRType() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $fixnum.Int64 get dynType => $_getI64(12);\n  @$pb.TagNumber(13)\n  set dynType($fixnum.Int64 value) => $_setInt64(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasDynType() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearDynType() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $fixnum.Int64 get uid => $_getI64(13);\n  @$pb.TagNumber(14)\n  set uid($fixnum.Int64 value) => $_setInt64(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasUid() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearUid() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $core.String get cardUrl => $_getSZ(14);\n  @$pb.TagNumber(15)\n  set cardUrl($core.String value) => $_setString(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasCardUrl() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearCardUrl() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $6.Any get sourceContent => $_getN(15);\n  @$pb.TagNumber(16)\n  set sourceContent($6.Any value) => $_setField(16, value);\n  @$pb.TagNumber(16)\n  $core.bool hasSourceContent() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearSourceContent() => $_clearField(16);\n  @$pb.TagNumber(16)\n  $6.Any ensureSourceContent() => $_ensure(15);\n\n  @$pb.TagNumber(17)\n  $core.String get origFace => $_getSZ(16);\n  @$pb.TagNumber(17)\n  set origFace($core.String value) => $_setString(16, value);\n  @$pb.TagNumber(17)\n  $core.bool hasOrigFace() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearOrigFace() => $_clearField(17);\n\n  @$pb.TagNumber(18)\n  ExtendReply get reply => $_getN(17);\n  @$pb.TagNumber(18)\n  set reply(ExtendReply value) => $_setField(18, value);\n  @$pb.TagNumber(18)\n  $core.bool hasReply() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearReply() => $_clearField(18);\n  @$pb.TagNumber(18)\n  ExtendReply ensureReply() => $_ensure(17);\n\n  @$pb.TagNumber(19)\n  $core.String get trackId => $_getSZ(18);\n  @$pb.TagNumber(19)\n  set trackId($core.String value) => $_setString(18, value);\n  @$pb.TagNumber(19)\n  $core.bool hasTrackId() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearTrackId() => $_clearField(19);\n\n  @$pb.TagNumber(20)\n  ModuleOpusSummary get opusSummary => $_getN(19);\n  @$pb.TagNumber(20)\n  set opusSummary(ModuleOpusSummary value) => $_setField(20, value);\n  @$pb.TagNumber(20)\n  $core.bool hasOpusSummary() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearOpusSummary() => $_clearField(20);\n  @$pb.TagNumber(20)\n  ModuleOpusSummary ensureOpusSummary() => $_ensure(19);\n\n  @$pb.TagNumber(21)\n  OnlyFansProperty get onlyFansProperty => $_getN(20);\n  @$pb.TagNumber(21)\n  set onlyFansProperty(OnlyFansProperty value) => $_setField(21, value);\n  @$pb.TagNumber(21)\n  $core.bool hasOnlyFansProperty() => $_has(20);\n  @$pb.TagNumber(21)\n  void clearOnlyFansProperty() => $_clearField(21);\n  @$pb.TagNumber(21)\n  OnlyFansProperty ensureOnlyFansProperty() => $_ensure(20);\n\n  @$pb.TagNumber(22)\n  DynFeatureGate get featureGate => $_getN(21);\n  @$pb.TagNumber(22)\n  set featureGate(DynFeatureGate value) => $_setField(22, value);\n  @$pb.TagNumber(22)\n  $core.bool hasFeatureGate() => $_has(21);\n  @$pb.TagNumber(22)\n  void clearFeatureGate() => $_clearField(22);\n  @$pb.TagNumber(22)\n  DynFeatureGate ensureFeatureGate() => $_ensure(21);\n\n  @$pb.TagNumber(23)\n  $core.bool get isInAudit => $_getBF(22);\n  @$pb.TagNumber(23)\n  set isInAudit($core.bool value) => $_setBool(22, value);\n  @$pb.TagNumber(23)\n  $core.bool hasIsInAudit() => $_has(22);\n  @$pb.TagNumber(23)\n  void clearIsInAudit() => $_clearField(23);\n\n  @$pb.TagNumber(24)\n  $pb.PbMap<$core.String, $core.String> get historyReport => $_getMap(23);\n\n  @$pb.TagNumber(25)\n  $core.String get reportMetricData => $_getSZ(24);\n  @$pb.TagNumber(25)\n  set reportMetricData($core.String value) => $_setString(24, value);\n  @$pb.TagNumber(25)\n  $core.bool hasReportMetricData() => $_has(24);\n  @$pb.TagNumber(25)\n  void clearReportMetricData() => $_clearField(25);\n\n  @$pb.TagNumber(26)\n  TextParagraph get descTextOpus => $_getN(25);\n  @$pb.TagNumber(26)\n  set descTextOpus(TextParagraph value) => $_setField(26, value);\n  @$pb.TagNumber(26)\n  $core.bool hasDescTextOpus() => $_has(25);\n  @$pb.TagNumber(26)\n  void clearDescTextOpus() => $_clearField(26);\n  @$pb.TagNumber(26)\n  TextParagraph ensureDescTextOpus() => $_ensure(25);\n\n  @$pb.TagNumber(27)\n  $core.bool get isPreviewOnly => $_getBF(26);\n  @$pb.TagNumber(27)\n  set isPreviewOnly($core.bool value) => $_setBool(26, value);\n  @$pb.TagNumber(27)\n  $core.bool hasIsPreviewOnly() => $_has(26);\n  @$pb.TagNumber(27)\n  void clearIsPreviewOnly() => $_clearField(27);\n\n  @$pb.TagNumber(28)\n  RepostExtraInfo get repostExtraInfo => $_getN(27);\n  @$pb.TagNumber(28)\n  set repostExtraInfo(RepostExtraInfo value) => $_setField(28, value);\n  @$pb.TagNumber(28)\n  $core.bool hasRepostExtraInfo() => $_has(27);\n  @$pb.TagNumber(28)\n  void clearRepostExtraInfo() => $_clearField(28);\n  @$pb.TagNumber(28)\n  RepostExtraInfo ensureRepostExtraInfo() => $_ensure(27);\n\n  @$pb.TagNumber(29)\n  MangaProperty get mangaProperty => $_getN(28);\n  @$pb.TagNumber(29)\n  set mangaProperty(MangaProperty value) => $_setField(29, value);\n  @$pb.TagNumber(29)\n  $core.bool hasMangaProperty() => $_has(28);\n  @$pb.TagNumber(29)\n  void clearMangaProperty() => $_clearField(29);\n  @$pb.TagNumber(29)\n  MangaProperty ensureMangaProperty() => $_ensure(28);\n\n  @$pb.TagNumber(30)\n  $core.String get upName => $_getSZ(29);\n  @$pb.TagNumber(30)\n  set upName($core.String value) => $_setString(29, value);\n  @$pb.TagNumber(30)\n  $core.bool hasUpName() => $_has(29);\n  @$pb.TagNumber(30)\n  void clearUpName() => $_clearField(30);\n\n  @$pb.TagNumber(31)\n  $core.String get upFace => $_getSZ(30);\n  @$pb.TagNumber(31)\n  set upFace($core.String value) => $_setString(30, value);\n  @$pb.TagNumber(31)\n  $core.bool hasUpFace() => $_has(30);\n  @$pb.TagNumber(31)\n  void clearUpFace() => $_clearField(31);\n\n  @$pb.TagNumber(32)\n  DynVisibilityStatus get desiredVisibilityStatus => $_getN(31);\n  @$pb.TagNumber(32)\n  set desiredVisibilityStatus(DynVisibilityStatus value) =>\n      $_setField(32, value);\n  @$pb.TagNumber(32)\n  $core.bool hasDesiredVisibilityStatus() => $_has(31);\n  @$pb.TagNumber(32)\n  void clearDesiredVisibilityStatus() => $_clearField(32);\n}\n\nclass ExtendReply extends $pb.GeneratedMessage {\n  factory ExtendReply({\n    $core.String? uri,\n    $core.Iterable<ExtendReplyParam>? params,\n    $fixnum.Int64? replyBizType,\n    $fixnum.Int64? replyBizId,\n    $core.bool? noLoadComment,\n    $core.String? noLoadCommentHintText,\n  }) {\n    final result = create();\n    if (uri != null) result.uri = uri;\n    if (params != null) result.params.addAll(params);\n    if (replyBizType != null) result.replyBizType = replyBizType;\n    if (replyBizId != null) result.replyBizId = replyBizId;\n    if (noLoadComment != null) result.noLoadComment = noLoadComment;\n    if (noLoadCommentHintText != null)\n      result.noLoadCommentHintText = noLoadCommentHintText;\n    return result;\n  }\n\n  ExtendReply._();\n\n  factory ExtendReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ExtendReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ExtendReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'uri')\n    ..pPM<ExtendReplyParam>(2, _omitFieldNames ? '' : 'params',\n        subBuilder: ExtendReplyParam.create)\n    ..aInt64(3, _omitFieldNames ? '' : 'replyBizType')\n    ..aInt64(4, _omitFieldNames ? '' : 'replyBizId')\n    ..aOB(5, _omitFieldNames ? '' : 'noLoadComment')\n    ..aOS(6, _omitFieldNames ? '' : 'noLoadCommentHintText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtendReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtendReply copyWith(void Function(ExtendReply) updates) =>\n      super.copyWith((message) => updates(message as ExtendReply))\n          as ExtendReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ExtendReply create() => ExtendReply._();\n  @$core.override\n  ExtendReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ExtendReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ExtendReply>(create);\n  static ExtendReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get uri => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set uri($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUri() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUri() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<ExtendReplyParam> get params => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get replyBizType => $_getI64(2);\n  @$pb.TagNumber(3)\n  set replyBizType($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasReplyBizType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearReplyBizType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get replyBizId => $_getI64(3);\n  @$pb.TagNumber(4)\n  set replyBizId($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasReplyBizId() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearReplyBizId() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.bool get noLoadComment => $_getBF(4);\n  @$pb.TagNumber(5)\n  set noLoadComment($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasNoLoadComment() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearNoLoadComment() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get noLoadCommentHintText => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set noLoadCommentHintText($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasNoLoadCommentHintText() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearNoLoadCommentHintText() => $_clearField(6);\n}\n\nclass ExtendReplyParam extends $pb.GeneratedMessage {\n  factory ExtendReplyParam({\n    $core.String? key,\n    $core.String? value,\n  }) {\n    final result = create();\n    if (key != null) result.key = key;\n    if (value != null) result.value = value;\n    return result;\n  }\n\n  ExtendReplyParam._();\n\n  factory ExtendReplyParam.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ExtendReplyParam.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ExtendReplyParam',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'key')\n    ..aOS(2, _omitFieldNames ? '' : 'value')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtendReplyParam clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtendReplyParam copyWith(void Function(ExtendReplyParam) updates) =>\n      super.copyWith((message) => updates(message as ExtendReplyParam))\n          as ExtendReplyParam;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ExtendReplyParam create() => ExtendReplyParam._();\n  @$core.override\n  ExtendReplyParam createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ExtendReplyParam getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ExtendReplyParam>(create);\n  static ExtendReplyParam? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get key => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set key($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasKey() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearKey() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get value => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set value($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasValue() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearValue() => $_clearField(2);\n}\n\nclass FeedFilterReply extends $pb.GeneratedMessage {\n  factory FeedFilterReply({\n    $core.String? offset,\n    $core.bool? hasMore,\n    $core.Iterable<DynamicItem>? list,\n  }) {\n    final result = create();\n    if (offset != null) result.offset = offset;\n    if (hasMore != null) result.hasMore = hasMore;\n    if (list != null) result.list.addAll(list);\n    return result;\n  }\n\n  FeedFilterReply._();\n\n  factory FeedFilterReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FeedFilterReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FeedFilterReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'offset')\n    ..aOB(2, _omitFieldNames ? '' : 'hasMore')\n    ..pPM<DynamicItem>(3, _omitFieldNames ? '' : 'list',\n        subBuilder: DynamicItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FeedFilterReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FeedFilterReply copyWith(void Function(FeedFilterReply) updates) =>\n      super.copyWith((message) => updates(message as FeedFilterReply))\n          as FeedFilterReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FeedFilterReply create() => FeedFilterReply._();\n  @$core.override\n  FeedFilterReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FeedFilterReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FeedFilterReply>(create);\n  static FeedFilterReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get offset => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set offset($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOffset() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOffset() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get hasMore => $_getBF(1);\n  @$pb.TagNumber(2)\n  set hasMore($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHasMore() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHasMore() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<DynamicItem> get list => $_getList(2);\n}\n\nclass FeedFilterReq extends $pb.GeneratedMessage {\n  factory FeedFilterReq({\n    $core.String? offset,\n    $core.String? tab,\n    $core.int? localTime,\n    $1.PlayerArgs? playerArgs,\n    AdParam? adParam,\n    $core.int? coldStart,\n    $fixnum.Int64? page,\n  }) {\n    final result = create();\n    if (offset != null) result.offset = offset;\n    if (tab != null) result.tab = tab;\n    if (localTime != null) result.localTime = localTime;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    if (adParam != null) result.adParam = adParam;\n    if (coldStart != null) result.coldStart = coldStart;\n    if (page != null) result.page = page;\n    return result;\n  }\n\n  FeedFilterReq._();\n\n  factory FeedFilterReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FeedFilterReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FeedFilterReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'offset')\n    ..aOS(2, _omitFieldNames ? '' : 'tab')\n    ..aI(3, _omitFieldNames ? '' : 'localTime')\n    ..aOM<$1.PlayerArgs>(4, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $1.PlayerArgs.create)\n    ..aOM<AdParam>(5, _omitFieldNames ? '' : 'adParam',\n        subBuilder: AdParam.create)\n    ..aI(6, _omitFieldNames ? '' : 'coldStart')\n    ..aInt64(7, _omitFieldNames ? '' : 'page')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FeedFilterReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FeedFilterReq copyWith(void Function(FeedFilterReq) updates) =>\n      super.copyWith((message) => updates(message as FeedFilterReq))\n          as FeedFilterReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FeedFilterReq create() => FeedFilterReq._();\n  @$core.override\n  FeedFilterReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FeedFilterReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FeedFilterReq>(create);\n  static FeedFilterReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get offset => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set offset($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOffset() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOffset() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get tab => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set tab($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTab() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTab() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get localTime => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set localTime($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLocalTime() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLocalTime() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $1.PlayerArgs get playerArgs => $_getN(3);\n  @$pb.TagNumber(4)\n  set playerArgs($1.PlayerArgs value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPlayerArgs() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPlayerArgs() => $_clearField(4);\n  @$pb.TagNumber(4)\n  $1.PlayerArgs ensurePlayerArgs() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  AdParam get adParam => $_getN(4);\n  @$pb.TagNumber(5)\n  set adParam(AdParam value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasAdParam() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearAdParam() => $_clearField(5);\n  @$pb.TagNumber(5)\n  AdParam ensureAdParam() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.int get coldStart => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set coldStart($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasColdStart() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearColdStart() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get page => $_getI64(6);\n  @$pb.TagNumber(7)\n  set page($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasPage() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearPage() => $_clearField(7);\n}\n\nclass FeedSortConfig extends $pb.GeneratedMessage {\n  factory FeedSortConfig({\n    $core.String? title,\n    $core.Iterable<FeedSortOption>? sortOptions,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (sortOptions != null) result.sortOptions.addAll(sortOptions);\n    return result;\n  }\n\n  FeedSortConfig._();\n\n  factory FeedSortConfig.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FeedSortConfig.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FeedSortConfig',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..pPM<FeedSortOption>(2, _omitFieldNames ? '' : 'sortOptions',\n        subBuilder: FeedSortOption.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FeedSortConfig clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FeedSortConfig copyWith(void Function(FeedSortConfig) updates) =>\n      super.copyWith((message) => updates(message as FeedSortConfig))\n          as FeedSortConfig;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FeedSortConfig create() => FeedSortConfig._();\n  @$core.override\n  FeedSortConfig createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FeedSortConfig getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FeedSortConfig>(create);\n  static FeedSortConfig? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<FeedSortOption> get sortOptions => $_getList(1);\n}\n\nclass FeedSortOption extends $pb.GeneratedMessage {\n  factory FeedSortOption({\n    $core.String? sortName,\n    $core.String? sortType,\n    $core.bool? isSelected,\n    $core.bool? noAutoNextPageWhenUnsatisfied,\n  }) {\n    final result = create();\n    if (sortName != null) result.sortName = sortName;\n    if (sortType != null) result.sortType = sortType;\n    if (isSelected != null) result.isSelected = isSelected;\n    if (noAutoNextPageWhenUnsatisfied != null)\n      result.noAutoNextPageWhenUnsatisfied = noAutoNextPageWhenUnsatisfied;\n    return result;\n  }\n\n  FeedSortOption._();\n\n  factory FeedSortOption.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FeedSortOption.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FeedSortOption',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'sortName')\n    ..aOS(2, _omitFieldNames ? '' : 'sortType')\n    ..aOB(3, _omitFieldNames ? '' : 'isSelected')\n    ..aOB(4, _omitFieldNames ? '' : 'noAutoNextPageWhenUnsatisfied')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FeedSortOption clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FeedSortOption copyWith(void Function(FeedSortOption) updates) =>\n      super.copyWith((message) => updates(message as FeedSortOption))\n          as FeedSortOption;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FeedSortOption create() => FeedSortOption._();\n  @$core.override\n  FeedSortOption createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FeedSortOption getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FeedSortOption>(create);\n  static FeedSortOption? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get sortName => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set sortName($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSortName() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSortName() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get sortType => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set sortType($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSortType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSortType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get isSelected => $_getBF(2);\n  @$pb.TagNumber(3)\n  set isSelected($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIsSelected() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIsSelected() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get noAutoNextPageWhenUnsatisfied => $_getBF(3);\n  @$pb.TagNumber(4)\n  set noAutoNextPageWhenUnsatisfied($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasNoAutoNextPageWhenUnsatisfied() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearNoAutoNextPageWhenUnsatisfied() => $_clearField(4);\n}\n\nclass FeedSortOptionReq extends $pb.GeneratedMessage {\n  factory FeedSortOptionReq({\n    $core.String? sortType,\n    $core.bool? isColdRefresh,\n  }) {\n    final result = create();\n    if (sortType != null) result.sortType = sortType;\n    if (isColdRefresh != null) result.isColdRefresh = isColdRefresh;\n    return result;\n  }\n\n  FeedSortOptionReq._();\n\n  factory FeedSortOptionReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FeedSortOptionReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FeedSortOptionReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'sortType')\n    ..aOB(2, _omitFieldNames ? '' : 'isColdRefresh')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FeedSortOptionReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FeedSortOptionReq copyWith(void Function(FeedSortOptionReq) updates) =>\n      super.copyWith((message) => updates(message as FeedSortOptionReq))\n          as FeedSortOptionReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FeedSortOptionReq create() => FeedSortOptionReq._();\n  @$core.override\n  FeedSortOptionReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FeedSortOptionReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FeedSortOptionReq>(create);\n  static FeedSortOptionReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get sortType => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set sortType($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSortType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSortType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get isColdRefresh => $_getBF(1);\n  @$pb.TagNumber(2)\n  set isColdRefresh($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIsColdRefresh() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIsColdRefresh() => $_clearField(2);\n}\n\nclass FetchTabSettingReply extends $pb.GeneratedMessage {\n  factory FetchTabSettingReply({\n    HomePageTabSttingStatus? status,\n  }) {\n    final result = create();\n    if (status != null) result.status = status;\n    return result;\n  }\n\n  FetchTabSettingReply._();\n\n  factory FetchTabSettingReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FetchTabSettingReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FetchTabSettingReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aE<HomePageTabSttingStatus>(1, _omitFieldNames ? '' : 'status',\n        enumValues: HomePageTabSttingStatus.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FetchTabSettingReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FetchTabSettingReply copyWith(void Function(FetchTabSettingReply) updates) =>\n      super.copyWith((message) => updates(message as FetchTabSettingReply))\n          as FetchTabSettingReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FetchTabSettingReply create() => FetchTabSettingReply._();\n  @$core.override\n  FetchTabSettingReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FetchTabSettingReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FetchTabSettingReply>(create);\n  static FetchTabSettingReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  HomePageTabSttingStatus get status => $_getN(0);\n  @$pb.TagNumber(1)\n  set status(HomePageTabSttingStatus value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStatus() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStatus() => $_clearField(1);\n}\n\nclass FlowItemOpus extends $pb.GeneratedMessage {\n  factory FlowItemOpus({\n    MdlDynDrawItem? coverPic,\n    $4.ItemWHRatio? coverWhRatio,\n    CoverIconWithText? bottomLeftText1,\n    CoverIconWithText? bottomLeftText2,\n    Paragraph? textParagraph,\n    VideoBadge? topRightBadge,\n    MdlDynDrawItem? darkCoverPic,\n  }) {\n    final result = create();\n    if (coverPic != null) result.coverPic = coverPic;\n    if (coverWhRatio != null) result.coverWhRatio = coverWhRatio;\n    if (bottomLeftText1 != null) result.bottomLeftText1 = bottomLeftText1;\n    if (bottomLeftText2 != null) result.bottomLeftText2 = bottomLeftText2;\n    if (textParagraph != null) result.textParagraph = textParagraph;\n    if (topRightBadge != null) result.topRightBadge = topRightBadge;\n    if (darkCoverPic != null) result.darkCoverPic = darkCoverPic;\n    return result;\n  }\n\n  FlowItemOpus._();\n\n  factory FlowItemOpus.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FlowItemOpus.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FlowItemOpus',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<MdlDynDrawItem>(1, _omitFieldNames ? '' : 'coverPic',\n        subBuilder: MdlDynDrawItem.create)\n    ..aOM<$4.ItemWHRatio>(2, _omitFieldNames ? '' : 'coverWhRatio',\n        subBuilder: $4.ItemWHRatio.create)\n    ..aOM<CoverIconWithText>(3, _omitFieldNames ? '' : 'bottomLeftText1',\n        subBuilder: CoverIconWithText.create)\n    ..aOM<CoverIconWithText>(4, _omitFieldNames ? '' : 'bottomLeftText2',\n        subBuilder: CoverIconWithText.create)\n    ..aOM<Paragraph>(5, _omitFieldNames ? '' : 'textParagraph',\n        subBuilder: Paragraph.create)\n    ..aOM<VideoBadge>(6, _omitFieldNames ? '' : 'topRightBadge',\n        subBuilder: VideoBadge.create)\n    ..aOM<MdlDynDrawItem>(7, _omitFieldNames ? '' : 'darkCoverPic',\n        subBuilder: MdlDynDrawItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FlowItemOpus clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FlowItemOpus copyWith(void Function(FlowItemOpus) updates) =>\n      super.copyWith((message) => updates(message as FlowItemOpus))\n          as FlowItemOpus;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FlowItemOpus create() => FlowItemOpus._();\n  @$core.override\n  FlowItemOpus createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FlowItemOpus getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FlowItemOpus>(create);\n  static FlowItemOpus? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  MdlDynDrawItem get coverPic => $_getN(0);\n  @$pb.TagNumber(1)\n  set coverPic(MdlDynDrawItem value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCoverPic() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCoverPic() => $_clearField(1);\n  @$pb.TagNumber(1)\n  MdlDynDrawItem ensureCoverPic() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $4.ItemWHRatio get coverWhRatio => $_getN(1);\n  @$pb.TagNumber(2)\n  set coverWhRatio($4.ItemWHRatio value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCoverWhRatio() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCoverWhRatio() => $_clearField(2);\n  @$pb.TagNumber(2)\n  $4.ItemWHRatio ensureCoverWhRatio() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  CoverIconWithText get bottomLeftText1 => $_getN(2);\n  @$pb.TagNumber(3)\n  set bottomLeftText1(CoverIconWithText value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBottomLeftText1() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBottomLeftText1() => $_clearField(3);\n  @$pb.TagNumber(3)\n  CoverIconWithText ensureBottomLeftText1() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  CoverIconWithText get bottomLeftText2 => $_getN(3);\n  @$pb.TagNumber(4)\n  set bottomLeftText2(CoverIconWithText value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBottomLeftText2() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBottomLeftText2() => $_clearField(4);\n  @$pb.TagNumber(4)\n  CoverIconWithText ensureBottomLeftText2() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  Paragraph get textParagraph => $_getN(4);\n  @$pb.TagNumber(5)\n  set textParagraph(Paragraph value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasTextParagraph() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearTextParagraph() => $_clearField(5);\n  @$pb.TagNumber(5)\n  Paragraph ensureTextParagraph() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  VideoBadge get topRightBadge => $_getN(5);\n  @$pb.TagNumber(6)\n  set topRightBadge(VideoBadge value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasTopRightBadge() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearTopRightBadge() => $_clearField(6);\n  @$pb.TagNumber(6)\n  VideoBadge ensureTopRightBadge() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  MdlDynDrawItem get darkCoverPic => $_getN(6);\n  @$pb.TagNumber(7)\n  set darkCoverPic(MdlDynDrawItem value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasDarkCoverPic() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearDarkCoverPic() => $_clearField(7);\n  @$pb.TagNumber(7)\n  MdlDynDrawItem ensureDarkCoverPic() => $_ensure(6);\n}\n\nclass FollowListItem extends $pb.GeneratedMessage {\n  factory FollowListItem({\n    $fixnum.Int64? seasonId,\n    $core.String? title,\n    $core.String? cover,\n    $core.String? url,\n    NewEP? newEp,\n    $core.String? subTitle,\n    $fixnum.Int64? pos,\n  }) {\n    final result = create();\n    if (seasonId != null) result.seasonId = seasonId;\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (url != null) result.url = url;\n    if (newEp != null) result.newEp = newEp;\n    if (subTitle != null) result.subTitle = subTitle;\n    if (pos != null) result.pos = pos;\n    return result;\n  }\n\n  FollowListItem._();\n\n  factory FollowListItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FollowListItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FollowListItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'seasonId')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'cover')\n    ..aOS(4, _omitFieldNames ? '' : 'url')\n    ..aOM<NewEP>(5, _omitFieldNames ? '' : 'newEp', subBuilder: NewEP.create)\n    ..aOS(6, _omitFieldNames ? '' : 'subTitle')\n    ..aInt64(7, _omitFieldNames ? '' : 'pos')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FollowListItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FollowListItem copyWith(void Function(FollowListItem) updates) =>\n      super.copyWith((message) => updates(message as FollowListItem))\n          as FollowListItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FollowListItem create() => FollowListItem._();\n  @$core.override\n  FollowListItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FollowListItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FollowListItem>(create);\n  static FollowListItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get seasonId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set seasonId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSeasonId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSeasonId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get cover => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set cover($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCover() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCover() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get url => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set url($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUrl() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUrl() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  NewEP get newEp => $_getN(4);\n  @$pb.TagNumber(5)\n  set newEp(NewEP value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasNewEp() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearNewEp() => $_clearField(5);\n  @$pb.TagNumber(5)\n  NewEP ensureNewEp() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.String get subTitle => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set subTitle($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasSubTitle() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearSubTitle() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get pos => $_getI64(6);\n  @$pb.TagNumber(7)\n  set pos($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasPos() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearPos() => $_clearField(7);\n}\n\nclass FormulaNode extends $pb.GeneratedMessage {\n  factory FormulaNode({\n    WordNode? latexContent,\n    ImgInlineCfg? imageSpec,\n    $core.String? imgUrl,\n  }) {\n    final result = create();\n    if (latexContent != null) result.latexContent = latexContent;\n    if (imageSpec != null) result.imageSpec = imageSpec;\n    if (imgUrl != null) result.imgUrl = imgUrl;\n    return result;\n  }\n\n  FormulaNode._();\n\n  factory FormulaNode.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FormulaNode.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FormulaNode',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<WordNode>(1, _omitFieldNames ? '' : 'latexContent',\n        subBuilder: WordNode.create)\n    ..aOM<ImgInlineCfg>(2, _omitFieldNames ? '' : 'imageSpec',\n        subBuilder: ImgInlineCfg.create)\n    ..aOS(4, _omitFieldNames ? '' : 'imgUrl')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FormulaNode clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FormulaNode copyWith(void Function(FormulaNode) updates) =>\n      super.copyWith((message) => updates(message as FormulaNode))\n          as FormulaNode;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FormulaNode create() => FormulaNode._();\n  @$core.override\n  FormulaNode createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FormulaNode getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FormulaNode>(create);\n  static FormulaNode? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  WordNode get latexContent => $_getN(0);\n  @$pb.TagNumber(1)\n  set latexContent(WordNode value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLatexContent() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLatexContent() => $_clearField(1);\n  @$pb.TagNumber(1)\n  WordNode ensureLatexContent() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  ImgInlineCfg get imageSpec => $_getN(1);\n  @$pb.TagNumber(2)\n  set imageSpec(ImgInlineCfg value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasImageSpec() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearImageSpec() => $_clearField(2);\n  @$pb.TagNumber(2)\n  ImgInlineCfg ensureImageSpec() => $_ensure(1);\n\n  @$pb.TagNumber(4)\n  $core.String get imgUrl => $_getSZ(2);\n  @$pb.TagNumber(4)\n  set imgUrl($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(4)\n  $core.bool hasImgUrl() => $_has(2);\n  @$pb.TagNumber(4)\n  void clearImgUrl() => $_clearField(4);\n}\n\nclass GoodsItem extends $pb.GeneratedMessage {\n  factory GoodsItem({\n    $core.String? cover,\n    $core.String? schemaPackageName,\n    $core.int? sourceType,\n    $core.String? jumpUrl,\n    $core.String? jumpDesc,\n    $core.String? title,\n    $core.String? brief,\n    $core.String? price,\n    $fixnum.Int64? itemId,\n    $core.String? schemaUrl,\n    $core.Iterable<$core.String>? openWhiteList,\n    $core.bool? userWebV2,\n    $core.String? adMark,\n    $core.String? appName,\n    GoodsJumpType? jumpType,\n    $core.String? cmCachePassthrough,\n  }) {\n    final result = create();\n    if (cover != null) result.cover = cover;\n    if (schemaPackageName != null) result.schemaPackageName = schemaPackageName;\n    if (sourceType != null) result.sourceType = sourceType;\n    if (jumpUrl != null) result.jumpUrl = jumpUrl;\n    if (jumpDesc != null) result.jumpDesc = jumpDesc;\n    if (title != null) result.title = title;\n    if (brief != null) result.brief = brief;\n    if (price != null) result.price = price;\n    if (itemId != null) result.itemId = itemId;\n    if (schemaUrl != null) result.schemaUrl = schemaUrl;\n    if (openWhiteList != null) result.openWhiteList.addAll(openWhiteList);\n    if (userWebV2 != null) result.userWebV2 = userWebV2;\n    if (adMark != null) result.adMark = adMark;\n    if (appName != null) result.appName = appName;\n    if (jumpType != null) result.jumpType = jumpType;\n    if (cmCachePassthrough != null)\n      result.cmCachePassthrough = cmCachePassthrough;\n    return result;\n  }\n\n  GoodsItem._();\n\n  factory GoodsItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory GoodsItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'GoodsItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'cover')\n    ..aOS(2, _omitFieldNames ? '' : 'schemaPackageName')\n    ..aI(3, _omitFieldNames ? '' : 'sourceType')\n    ..aOS(4, _omitFieldNames ? '' : 'jumpUrl')\n    ..aOS(5, _omitFieldNames ? '' : 'jumpDesc')\n    ..aOS(6, _omitFieldNames ? '' : 'title')\n    ..aOS(7, _omitFieldNames ? '' : 'brief')\n    ..aOS(8, _omitFieldNames ? '' : 'price')\n    ..aInt64(9, _omitFieldNames ? '' : 'itemId')\n    ..aOS(10, _omitFieldNames ? '' : 'schemaUrl')\n    ..pPS(11, _omitFieldNames ? '' : 'openWhiteList')\n    ..aOB(12, _omitFieldNames ? '' : 'userWebV2')\n    ..aOS(13, _omitFieldNames ? '' : 'adMark')\n    ..aOS(14, _omitFieldNames ? '' : 'appName')\n    ..aE<GoodsJumpType>(15, _omitFieldNames ? '' : 'jumpType',\n        enumValues: GoodsJumpType.values)\n    ..aOS(16, _omitFieldNames ? '' : 'cmCachePassthrough')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GoodsItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GoodsItem copyWith(void Function(GoodsItem) updates) =>\n      super.copyWith((message) => updates(message as GoodsItem)) as GoodsItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static GoodsItem create() => GoodsItem._();\n  @$core.override\n  GoodsItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static GoodsItem getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<GoodsItem>(create);\n  static GoodsItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get cover => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set cover($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCover() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCover() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get schemaPackageName => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set schemaPackageName($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSchemaPackageName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSchemaPackageName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get sourceType => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set sourceType($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSourceType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSourceType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get jumpUrl => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set jumpUrl($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasJumpUrl() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearJumpUrl() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get jumpDesc => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set jumpDesc($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasJumpDesc() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearJumpDesc() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get title => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set title($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasTitle() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearTitle() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get brief => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set brief($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBrief() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBrief() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get price => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set price($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasPrice() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearPrice() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get itemId => $_getI64(8);\n  @$pb.TagNumber(9)\n  set itemId($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasItemId() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearItemId() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get schemaUrl => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set schemaUrl($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasSchemaUrl() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearSchemaUrl() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $pb.PbList<$core.String> get openWhiteList => $_getList(10);\n\n  @$pb.TagNumber(12)\n  $core.bool get userWebV2 => $_getBF(11);\n  @$pb.TagNumber(12)\n  set userWebV2($core.bool value) => $_setBool(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasUserWebV2() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearUserWebV2() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.String get adMark => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set adMark($core.String value) => $_setString(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasAdMark() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearAdMark() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.String get appName => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set appName($core.String value) => $_setString(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasAppName() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearAppName() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  GoodsJumpType get jumpType => $_getN(14);\n  @$pb.TagNumber(15)\n  set jumpType(GoodsJumpType value) => $_setField(15, value);\n  @$pb.TagNumber(15)\n  $core.bool hasJumpType() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearJumpType() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $core.String get cmCachePassthrough => $_getSZ(15);\n  @$pb.TagNumber(16)\n  set cmCachePassthrough($core.String value) => $_setString(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasCmCachePassthrough() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearCmCachePassthrough() => $_clearField(16);\n}\n\nclass GuideBarInfo extends $pb.GeneratedMessage {\n  factory GuideBarInfo({\n    $core.int? show,\n    $core.int? page,\n    $core.int? position,\n    $core.String? desc,\n    $core.int? jumpPage,\n    $core.int? jumpPosition,\n  }) {\n    final result = create();\n    if (show != null) result.show = show;\n    if (page != null) result.page = page;\n    if (position != null) result.position = position;\n    if (desc != null) result.desc = desc;\n    if (jumpPage != null) result.jumpPage = jumpPage;\n    if (jumpPosition != null) result.jumpPosition = jumpPosition;\n    return result;\n  }\n\n  GuideBarInfo._();\n\n  factory GuideBarInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory GuideBarInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'GuideBarInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'show')\n    ..aI(2, _omitFieldNames ? '' : 'page')\n    ..aI(3, _omitFieldNames ? '' : 'position')\n    ..aOS(4, _omitFieldNames ? '' : 'desc')\n    ..aI(5, _omitFieldNames ? '' : 'jumpPage')\n    ..aI(6, _omitFieldNames ? '' : 'jumpPosition')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GuideBarInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GuideBarInfo copyWith(void Function(GuideBarInfo) updates) =>\n      super.copyWith((message) => updates(message as GuideBarInfo))\n          as GuideBarInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static GuideBarInfo create() => GuideBarInfo._();\n  @$core.override\n  GuideBarInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static GuideBarInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<GuideBarInfo>(create);\n  static GuideBarInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get show => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set show($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasShow() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearShow() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get page => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set page($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPage() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPage() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get position => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set position($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPosition() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPosition() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get desc => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set desc($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDesc() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDesc() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get jumpPage => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set jumpPage($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasJumpPage() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearJumpPage() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get jumpPosition => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set jumpPosition($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasJumpPosition() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearJumpPosition() => $_clearField(6);\n}\n\nclass HighlightText extends $pb.GeneratedMessage {\n  factory HighlightText({\n    $core.String? text,\n    HighlightTextStyle? textStyle,\n    $core.String? jumpUrl,\n    $core.String? icon,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (textStyle != null) result.textStyle = textStyle;\n    if (jumpUrl != null) result.jumpUrl = jumpUrl;\n    if (icon != null) result.icon = icon;\n    return result;\n  }\n\n  HighlightText._();\n\n  factory HighlightText.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory HighlightText.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'HighlightText',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aE<HighlightTextStyle>(2, _omitFieldNames ? '' : 'textStyle',\n        enumValues: HighlightTextStyle.values)\n    ..aOS(3, _omitFieldNames ? '' : 'jumpUrl')\n    ..aOS(4, _omitFieldNames ? '' : 'icon')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  HighlightText clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  HighlightText copyWith(void Function(HighlightText) updates) =>\n      super.copyWith((message) => updates(message as HighlightText))\n          as HighlightText;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static HighlightText create() => HighlightText._();\n  @$core.override\n  HighlightText createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static HighlightText getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<HighlightText>(create);\n  static HighlightText? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  HighlightTextStyle get textStyle => $_getN(1);\n  @$pb.TagNumber(2)\n  set textStyle(HighlightTextStyle value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTextStyle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTextStyle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get jumpUrl => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set jumpUrl($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasJumpUrl() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearJumpUrl() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get icon => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set icon($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIcon() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIcon() => $_clearField(4);\n}\n\nclass HomeSubscribeReply extends $pb.GeneratedMessage {\n  factory HomeSubscribeReply({\n    CampusOnlineStatus? online,\n  }) {\n    final result = create();\n    if (online != null) result.online = online;\n    return result;\n  }\n\n  HomeSubscribeReply._();\n\n  factory HomeSubscribeReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory HomeSubscribeReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'HomeSubscribeReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aE<CampusOnlineStatus>(1, _omitFieldNames ? '' : 'online',\n        enumValues: CampusOnlineStatus.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  HomeSubscribeReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  HomeSubscribeReply copyWith(void Function(HomeSubscribeReply) updates) =>\n      super.copyWith((message) => updates(message as HomeSubscribeReply))\n          as HomeSubscribeReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static HomeSubscribeReply create() => HomeSubscribeReply._();\n  @$core.override\n  HomeSubscribeReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static HomeSubscribeReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<HomeSubscribeReply>(create);\n  static HomeSubscribeReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  CampusOnlineStatus get online => $_getN(0);\n  @$pb.TagNumber(1)\n  set online(CampusOnlineStatus value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOnline() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOnline() => $_clearField(1);\n}\n\nclass HomeSubscribeReq extends $pb.GeneratedMessage {\n  factory HomeSubscribeReq({\n    $fixnum.Int64? campusId,\n    $core.String? campusName,\n  }) {\n    final result = create();\n    if (campusId != null) result.campusId = campusId;\n    if (campusName != null) result.campusName = campusName;\n    return result;\n  }\n\n  HomeSubscribeReq._();\n\n  factory HomeSubscribeReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory HomeSubscribeReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'HomeSubscribeReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'campusId')\n    ..aOS(2, _omitFieldNames ? '' : 'campusName')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  HomeSubscribeReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  HomeSubscribeReq copyWith(void Function(HomeSubscribeReq) updates) =>\n      super.copyWith((message) => updates(message as HomeSubscribeReq))\n          as HomeSubscribeReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static HomeSubscribeReq create() => HomeSubscribeReq._();\n  @$core.override\n  HomeSubscribeReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static HomeSubscribeReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<HomeSubscribeReq>(create);\n  static HomeSubscribeReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get campusId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set campusId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCampusId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCampusId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get campusName => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set campusName($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCampusName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCampusName() => $_clearField(2);\n}\n\nclass IconBadge extends $pb.GeneratedMessage {\n  factory IconBadge({\n    $core.String? iconBgUrl,\n    $core.String? text,\n  }) {\n    final result = create();\n    if (iconBgUrl != null) result.iconBgUrl = iconBgUrl;\n    if (text != null) result.text = text;\n    return result;\n  }\n\n  IconBadge._();\n\n  factory IconBadge.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory IconBadge.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'IconBadge',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'iconBgUrl')\n    ..aOS(2, _omitFieldNames ? '' : 'text')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  IconBadge clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  IconBadge copyWith(void Function(IconBadge) updates) =>\n      super.copyWith((message) => updates(message as IconBadge)) as IconBadge;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static IconBadge create() => IconBadge._();\n  @$core.override\n  IconBadge createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static IconBadge getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<IconBadge>(create);\n  static IconBadge? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get iconBgUrl => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set iconBgUrl($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIconBgUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIconBgUrl() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n}\n\nclass IconButton extends $pb.GeneratedMessage {\n  factory IconButton({\n    $core.String? text,\n    $core.String? iconHead,\n    $core.String? iconTail,\n    $core.String? jumpUri,\n    RouterAction? routerAction,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (iconHead != null) result.iconHead = iconHead;\n    if (iconTail != null) result.iconTail = iconTail;\n    if (jumpUri != null) result.jumpUri = jumpUri;\n    if (routerAction != null) result.routerAction = routerAction;\n    return result;\n  }\n\n  IconButton._();\n\n  factory IconButton.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory IconButton.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'IconButton',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aOS(2, _omitFieldNames ? '' : 'iconHead')\n    ..aOS(3, _omitFieldNames ? '' : 'iconTail')\n    ..aOS(4, _omitFieldNames ? '' : 'jumpUri')\n    ..aE<RouterAction>(5, _omitFieldNames ? '' : 'routerAction',\n        enumValues: RouterAction.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  IconButton clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  IconButton copyWith(void Function(IconButton) updates) =>\n      super.copyWith((message) => updates(message as IconButton)) as IconButton;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static IconButton create() => IconButton._();\n  @$core.override\n  IconButton createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static IconButton getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<IconButton>(create);\n  static IconButton? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get iconHead => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set iconHead($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIconHead() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIconHead() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get iconTail => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set iconTail($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIconTail() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIconTail() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get jumpUri => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set jumpUri($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasJumpUri() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearJumpUri() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  RouterAction get routerAction => $_getN(4);\n  @$pb.TagNumber(5)\n  set routerAction(RouterAction value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasRouterAction() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearRouterAction() => $_clearField(5);\n}\n\nclass ImageSet extends $pb.GeneratedMessage {\n  factory ImageSet({\n    $core.String? imgDay,\n    $core.String? imgDark,\n  }) {\n    final result = create();\n    if (imgDay != null) result.imgDay = imgDay;\n    if (imgDark != null) result.imgDark = imgDark;\n    return result;\n  }\n\n  ImageSet._();\n\n  factory ImageSet.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ImageSet.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ImageSet',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'imgDay')\n    ..aOS(2, _omitFieldNames ? '' : 'imgDark')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ImageSet clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ImageSet copyWith(void Function(ImageSet) updates) =>\n      super.copyWith((message) => updates(message as ImageSet)) as ImageSet;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ImageSet create() => ImageSet._();\n  @$core.override\n  ImageSet createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ImageSet getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ImageSet>(create);\n  static ImageSet? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get imgDay => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set imgDay($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasImgDay() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearImgDay() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get imgDark => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set imgDark($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasImgDark() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearImgDark() => $_clearField(2);\n}\n\nclass ImgInlineCfg extends $pb.GeneratedMessage {\n  factory ImgInlineCfg({\n    $core.double? width,\n    $core.double? height,\n    Colors? color,\n  }) {\n    final result = create();\n    if (width != null) result.width = width;\n    if (height != null) result.height = height;\n    if (color != null) result.color = color;\n    return result;\n  }\n\n  ImgInlineCfg._();\n\n  factory ImgInlineCfg.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ImgInlineCfg.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ImgInlineCfg',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aD(1, _omitFieldNames ? '' : 'width')\n    ..aD(2, _omitFieldNames ? '' : 'height')\n    ..aOM<Colors>(3, _omitFieldNames ? '' : 'color', subBuilder: Colors.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ImgInlineCfg clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ImgInlineCfg copyWith(void Function(ImgInlineCfg) updates) =>\n      super.copyWith((message) => updates(message as ImgInlineCfg))\n          as ImgInlineCfg;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ImgInlineCfg create() => ImgInlineCfg._();\n  @$core.override\n  ImgInlineCfg createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ImgInlineCfg getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ImgInlineCfg>(create);\n  static ImgInlineCfg? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.double get width => $_getN(0);\n  @$pb.TagNumber(1)\n  set width($core.double value) => $_setDouble(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasWidth() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearWidth() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.double get height => $_getN(1);\n  @$pb.TagNumber(2)\n  set height($core.double value) => $_setDouble(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHeight() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHeight() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  Colors get color => $_getN(2);\n  @$pb.TagNumber(3)\n  set color(Colors value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasColor() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearColor() => $_clearField(3);\n  @$pb.TagNumber(3)\n  Colors ensureColor() => $_ensure(2);\n}\n\nclass InfoOGV extends $pb.GeneratedMessage {\n  factory InfoOGV({\n    $core.String? title,\n    $core.String? uri,\n    $core.String? icon,\n    $core.String? subModule,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (uri != null) result.uri = uri;\n    if (icon != null) result.icon = icon;\n    if (subModule != null) result.subModule = subModule;\n    return result;\n  }\n\n  InfoOGV._();\n\n  factory InfoOGV.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory InfoOGV.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'InfoOGV',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..aOS(3, _omitFieldNames ? '' : 'icon')\n    ..aOS(4, _omitFieldNames ? '' : 'subModule')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  InfoOGV clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  InfoOGV copyWith(void Function(InfoOGV) updates) =>\n      super.copyWith((message) => updates(message as InfoOGV)) as InfoOGV;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static InfoOGV create() => InfoOGV._();\n  @$core.override\n  InfoOGV createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static InfoOGV getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<InfoOGV>(create);\n  static InfoOGV? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get icon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set icon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIcon() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get subModule => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set subModule($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSubModule() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSubModule() => $_clearField(4);\n}\n\nclass InteractionFace extends $pb.GeneratedMessage {\n  factory InteractionFace({\n    $fixnum.Int64? mid,\n    $core.String? face,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (face != null) result.face = face;\n    return result;\n  }\n\n  InteractionFace._();\n\n  factory InteractionFace.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory InteractionFace.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'InteractionFace',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aOS(2, _omitFieldNames ? '' : 'face')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  InteractionFace clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  InteractionFace copyWith(void Function(InteractionFace) updates) =>\n      super.copyWith((message) => updates(message as InteractionFace))\n          as InteractionFace;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static InteractionFace create() => InteractionFace._();\n  @$core.override\n  InteractionFace createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static InteractionFace getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<InteractionFace>(create);\n  static InteractionFace? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get face => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set face($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFace() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFace() => $_clearField(2);\n}\n\nclass InteractionItem extends $pb.GeneratedMessage {\n  factory InteractionItem({\n    LocalIconType? iconType,\n    $core.Iterable<Description>? desc,\n    $core.String? uri,\n    $core.String? dynamicId,\n    $fixnum.Int64? commentMid,\n    $core.Iterable<InteractionFace>? faces,\n    InteractionStat? stat,\n    $core.String? icon,\n    $core.String? tailIcon,\n    $core.Iterable<Description>? tailDesc,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>?\n        extendClickParam,\n  }) {\n    final result = create();\n    if (iconType != null) result.iconType = iconType;\n    if (desc != null) result.desc.addAll(desc);\n    if (uri != null) result.uri = uri;\n    if (dynamicId != null) result.dynamicId = dynamicId;\n    if (commentMid != null) result.commentMid = commentMid;\n    if (faces != null) result.faces.addAll(faces);\n    if (stat != null) result.stat = stat;\n    if (icon != null) result.icon = icon;\n    if (tailIcon != null) result.tailIcon = tailIcon;\n    if (tailDesc != null) result.tailDesc.addAll(tailDesc);\n    if (extendClickParam != null)\n      result.extendClickParam.addEntries(extendClickParam);\n    return result;\n  }\n\n  InteractionItem._();\n\n  factory InteractionItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory InteractionItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'InteractionItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aE<LocalIconType>(1, _omitFieldNames ? '' : 'iconType',\n        enumValues: LocalIconType.values)\n    ..pPM<Description>(2, _omitFieldNames ? '' : 'desc',\n        subBuilder: Description.create)\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..aOS(4, _omitFieldNames ? '' : 'dynamicId')\n    ..aInt64(6, _omitFieldNames ? '' : 'commentMid')\n    ..pPM<InteractionFace>(7, _omitFieldNames ? '' : 'faces',\n        subBuilder: InteractionFace.create)\n    ..aOM<InteractionStat>(8, _omitFieldNames ? '' : 'stat',\n        subBuilder: InteractionStat.create)\n    ..aOS(9, _omitFieldNames ? '' : 'icon')\n    ..aOS(10, _omitFieldNames ? '' : 'tailIcon')\n    ..pPM<Description>(11, _omitFieldNames ? '' : 'tailDesc',\n        subBuilder: Description.create)\n    ..m<$core.String, $core.String>(\n        12, _omitFieldNames ? '' : 'extendClickParam',\n        entryClassName: 'InteractionItem.ExtendClickParamEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.dynamic.v2'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  InteractionItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  InteractionItem copyWith(void Function(InteractionItem) updates) =>\n      super.copyWith((message) => updates(message as InteractionItem))\n          as InteractionItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static InteractionItem create() => InteractionItem._();\n  @$core.override\n  InteractionItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static InteractionItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<InteractionItem>(create);\n  static InteractionItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  LocalIconType get iconType => $_getN(0);\n  @$pb.TagNumber(1)\n  set iconType(LocalIconType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIconType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIconType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<Description> get desc => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get dynamicId => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set dynamicId($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDynamicId() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDynamicId() => $_clearField(4);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get commentMid => $_getI64(4);\n  @$pb.TagNumber(6)\n  set commentMid($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCommentMid() => $_has(4);\n  @$pb.TagNumber(6)\n  void clearCommentMid() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $pb.PbList<InteractionFace> get faces => $_getList(5);\n\n  @$pb.TagNumber(8)\n  InteractionStat get stat => $_getN(6);\n  @$pb.TagNumber(8)\n  set stat(InteractionStat value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasStat() => $_has(6);\n  @$pb.TagNumber(8)\n  void clearStat() => $_clearField(8);\n  @$pb.TagNumber(8)\n  InteractionStat ensureStat() => $_ensure(6);\n\n  @$pb.TagNumber(9)\n  $core.String get icon => $_getSZ(7);\n  @$pb.TagNumber(9)\n  set icon($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(9)\n  $core.bool hasIcon() => $_has(7);\n  @$pb.TagNumber(9)\n  void clearIcon() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get tailIcon => $_getSZ(8);\n  @$pb.TagNumber(10)\n  set tailIcon($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(10)\n  $core.bool hasTailIcon() => $_has(8);\n  @$pb.TagNumber(10)\n  void clearTailIcon() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $pb.PbList<Description> get tailDesc => $_getList(9);\n\n  @$pb.TagNumber(12)\n  $pb.PbMap<$core.String, $core.String> get extendClickParam => $_getMap(10);\n}\n\nclass InteractionStat extends $pb.GeneratedMessage {\n  factory InteractionStat({\n    $fixnum.Int64? like,\n    $fixnum.Int64? forward,\n  }) {\n    final result = create();\n    if (like != null) result.like = like;\n    if (forward != null) result.forward = forward;\n    return result;\n  }\n\n  InteractionStat._();\n\n  factory InteractionStat.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory InteractionStat.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'InteractionStat',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'like')\n    ..aInt64(2, _omitFieldNames ? '' : 'forward')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  InteractionStat clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  InteractionStat copyWith(void Function(InteractionStat) updates) =>\n      super.copyWith((message) => updates(message as InteractionStat))\n          as InteractionStat;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static InteractionStat create() => InteractionStat._();\n  @$core.override\n  InteractionStat createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static InteractionStat getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<InteractionStat>(create);\n  static InteractionStat? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get like => $_getI64(0);\n  @$pb.TagNumber(1)\n  set like($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLike() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLike() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get forward => $_getI64(1);\n  @$pb.TagNumber(2)\n  set forward($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasForward() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearForward() => $_clearField(2);\n}\n\nclass LbsPoiDetail extends $pb.GeneratedMessage {\n  factory LbsPoiDetail({\n    $core.String? poi,\n    $fixnum.Int64? type,\n    $core.Iterable<$core.String>? basePic,\n    $core.Iterable<$core.String>? cover,\n    $core.String? address,\n    $core.String? title,\n  }) {\n    final result = create();\n    if (poi != null) result.poi = poi;\n    if (type != null) result.type = type;\n    if (basePic != null) result.basePic.addAll(basePic);\n    if (cover != null) result.cover.addAll(cover);\n    if (address != null) result.address = address;\n    if (title != null) result.title = title;\n    return result;\n  }\n\n  LbsPoiDetail._();\n\n  factory LbsPoiDetail.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LbsPoiDetail.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LbsPoiDetail',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'poi')\n    ..aInt64(2, _omitFieldNames ? '' : 'type')\n    ..pPS(3, _omitFieldNames ? '' : 'basePic')\n    ..pPS(4, _omitFieldNames ? '' : 'cover')\n    ..aOS(5, _omitFieldNames ? '' : 'address')\n    ..aOS(6, _omitFieldNames ? '' : 'title')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LbsPoiDetail clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LbsPoiDetail copyWith(void Function(LbsPoiDetail) updates) =>\n      super.copyWith((message) => updates(message as LbsPoiDetail))\n          as LbsPoiDetail;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LbsPoiDetail create() => LbsPoiDetail._();\n  @$core.override\n  LbsPoiDetail createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LbsPoiDetail getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LbsPoiDetail>(create);\n  static LbsPoiDetail? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get poi => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set poi($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPoi() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPoi() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get type => $_getI64(1);\n  @$pb.TagNumber(2)\n  set type($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<$core.String> get basePic => $_getList(2);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<$core.String> get cover => $_getList(3);\n\n  @$pb.TagNumber(5)\n  $core.String get address => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set address($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasAddress() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearAddress() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get title => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set title($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasTitle() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearTitle() => $_clearField(6);\n}\n\nclass LbsPoiReply extends $pb.GeneratedMessage {\n  factory LbsPoiReply({\n    $core.bool? hasMore,\n    $core.String? offset,\n    LbsPoiDetail? detail,\n    $core.Iterable<DynamicItem>? list,\n  }) {\n    final result = create();\n    if (hasMore != null) result.hasMore = hasMore;\n    if (offset != null) result.offset = offset;\n    if (detail != null) result.detail = detail;\n    if (list != null) result.list.addAll(list);\n    return result;\n  }\n\n  LbsPoiReply._();\n\n  factory LbsPoiReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LbsPoiReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LbsPoiReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'hasMore')\n    ..aOS(2, _omitFieldNames ? '' : 'offset')\n    ..aOM<LbsPoiDetail>(3, _omitFieldNames ? '' : 'detail',\n        subBuilder: LbsPoiDetail.create)\n    ..pPM<DynamicItem>(4, _omitFieldNames ? '' : 'list',\n        subBuilder: DynamicItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LbsPoiReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LbsPoiReply copyWith(void Function(LbsPoiReply) updates) =>\n      super.copyWith((message) => updates(message as LbsPoiReply))\n          as LbsPoiReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LbsPoiReply create() => LbsPoiReply._();\n  @$core.override\n  LbsPoiReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LbsPoiReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LbsPoiReply>(create);\n  static LbsPoiReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get hasMore => $_getBF(0);\n  @$pb.TagNumber(1)\n  set hasMore($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasHasMore() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearHasMore() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get offset => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set offset($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOffset() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOffset() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  LbsPoiDetail get detail => $_getN(2);\n  @$pb.TagNumber(3)\n  set detail(LbsPoiDetail value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDetail() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDetail() => $_clearField(3);\n  @$pb.TagNumber(3)\n  LbsPoiDetail ensureDetail() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<DynamicItem> get list => $_getList(3);\n}\n\nclass LbsPoiReq extends $pb.GeneratedMessage {\n  factory LbsPoiReq({\n    $core.String? poi,\n    $fixnum.Int64? type,\n    $core.String? offset,\n    Refresh? refreshType,\n    $core.int? localTime,\n    $1.PlayerArgs? playerArgs,\n  }) {\n    final result = create();\n    if (poi != null) result.poi = poi;\n    if (type != null) result.type = type;\n    if (offset != null) result.offset = offset;\n    if (refreshType != null) result.refreshType = refreshType;\n    if (localTime != null) result.localTime = localTime;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    return result;\n  }\n\n  LbsPoiReq._();\n\n  factory LbsPoiReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LbsPoiReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LbsPoiReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'poi')\n    ..aInt64(2, _omitFieldNames ? '' : 'type')\n    ..aOS(3, _omitFieldNames ? '' : 'offset')\n    ..aE<Refresh>(4, _omitFieldNames ? '' : 'refreshType',\n        enumValues: Refresh.values)\n    ..aI(5, _omitFieldNames ? '' : 'localTime')\n    ..aOM<$1.PlayerArgs>(6, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $1.PlayerArgs.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LbsPoiReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LbsPoiReq copyWith(void Function(LbsPoiReq) updates) =>\n      super.copyWith((message) => updates(message as LbsPoiReq)) as LbsPoiReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LbsPoiReq create() => LbsPoiReq._();\n  @$core.override\n  LbsPoiReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LbsPoiReq getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<LbsPoiReq>(create);\n  static LbsPoiReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get poi => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set poi($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPoi() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPoi() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get type => $_getI64(1);\n  @$pb.TagNumber(2)\n  set type($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get offset => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set offset($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasOffset() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearOffset() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  Refresh get refreshType => $_getN(3);\n  @$pb.TagNumber(4)\n  set refreshType(Refresh value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasRefreshType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearRefreshType() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get localTime => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set localTime($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasLocalTime() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearLocalTime() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $1.PlayerArgs get playerArgs => $_getN(5);\n  @$pb.TagNumber(6)\n  set playerArgs($1.PlayerArgs value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasPlayerArgs() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearPlayerArgs() => $_clearField(6);\n  @$pb.TagNumber(6)\n  $1.PlayerArgs ensurePlayerArgs() => $_ensure(5);\n}\n\nclass LegacyTopicFeedReply extends $pb.GeneratedMessage {\n  factory LegacyTopicFeedReply({\n    $core.Iterable<DynamicItem>? list,\n    $core.bool? hasMore,\n    $core.String? offset,\n    $core.Iterable<SortType>? supportedSortTypes,\n    $core.Iterable<SortType>? feedCardFilters,\n  }) {\n    final result = create();\n    if (list != null) result.list.addAll(list);\n    if (hasMore != null) result.hasMore = hasMore;\n    if (offset != null) result.offset = offset;\n    if (supportedSortTypes != null)\n      result.supportedSortTypes.addAll(supportedSortTypes);\n    if (feedCardFilters != null) result.feedCardFilters.addAll(feedCardFilters);\n    return result;\n  }\n\n  LegacyTopicFeedReply._();\n\n  factory LegacyTopicFeedReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LegacyTopicFeedReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LegacyTopicFeedReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<DynamicItem>(1, _omitFieldNames ? '' : 'list',\n        subBuilder: DynamicItem.create)\n    ..aOB(2, _omitFieldNames ? '' : 'hasMore')\n    ..aOS(3, _omitFieldNames ? '' : 'offset')\n    ..pPM<SortType>(4, _omitFieldNames ? '' : 'supportedSortTypes',\n        subBuilder: SortType.create)\n    ..pPM<SortType>(5, _omitFieldNames ? '' : 'feedCardFilters',\n        subBuilder: SortType.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LegacyTopicFeedReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LegacyTopicFeedReply copyWith(void Function(LegacyTopicFeedReply) updates) =>\n      super.copyWith((message) => updates(message as LegacyTopicFeedReply))\n          as LegacyTopicFeedReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LegacyTopicFeedReply create() => LegacyTopicFeedReply._();\n  @$core.override\n  LegacyTopicFeedReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LegacyTopicFeedReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LegacyTopicFeedReply>(create);\n  static LegacyTopicFeedReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<DynamicItem> get list => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.bool get hasMore => $_getBF(1);\n  @$pb.TagNumber(2)\n  set hasMore($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHasMore() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHasMore() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get offset => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set offset($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasOffset() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearOffset() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<SortType> get supportedSortTypes => $_getList(3);\n\n  @$pb.TagNumber(5)\n  $pb.PbList<SortType> get feedCardFilters => $_getList(4);\n}\n\nclass LegacyTopicFeedReq extends $pb.GeneratedMessage {\n  factory LegacyTopicFeedReq({\n    $fixnum.Int64? topicId,\n    $core.String? topicName,\n    $core.String? offset,\n    SortType? sortType,\n    SortType? cardFilter,\n  }) {\n    final result = create();\n    if (topicId != null) result.topicId = topicId;\n    if (topicName != null) result.topicName = topicName;\n    if (offset != null) result.offset = offset;\n    if (sortType != null) result.sortType = sortType;\n    if (cardFilter != null) result.cardFilter = cardFilter;\n    return result;\n  }\n\n  LegacyTopicFeedReq._();\n\n  factory LegacyTopicFeedReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LegacyTopicFeedReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LegacyTopicFeedReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'topicId')\n    ..aOS(2, _omitFieldNames ? '' : 'topicName')\n    ..aOS(3, _omitFieldNames ? '' : 'offset')\n    ..aOM<SortType>(4, _omitFieldNames ? '' : 'sortType',\n        subBuilder: SortType.create)\n    ..aOM<SortType>(5, _omitFieldNames ? '' : 'cardFilter',\n        subBuilder: SortType.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LegacyTopicFeedReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LegacyTopicFeedReq copyWith(void Function(LegacyTopicFeedReq) updates) =>\n      super.copyWith((message) => updates(message as LegacyTopicFeedReq))\n          as LegacyTopicFeedReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LegacyTopicFeedReq create() => LegacyTopicFeedReq._();\n  @$core.override\n  LegacyTopicFeedReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LegacyTopicFeedReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LegacyTopicFeedReq>(create);\n  static LegacyTopicFeedReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get topicId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set topicId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTopicId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTopicId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get topicName => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set topicName($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTopicName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTopicName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get offset => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set offset($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasOffset() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearOffset() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  SortType get sortType => $_getN(3);\n  @$pb.TagNumber(4)\n  set sortType(SortType value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSortType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSortType() => $_clearField(4);\n  @$pb.TagNumber(4)\n  SortType ensureSortType() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  SortType get cardFilter => $_getN(4);\n  @$pb.TagNumber(5)\n  set cardFilter(SortType value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCardFilter() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCardFilter() => $_clearField(5);\n  @$pb.TagNumber(5)\n  SortType ensureCardFilter() => $_ensure(4);\n}\n\nclass LikeAnimation extends $pb.GeneratedMessage {\n  factory LikeAnimation({\n    $core.String? begin,\n    $core.String? proc,\n    $core.String? end,\n    $fixnum.Int64? likeIconId,\n  }) {\n    final result = create();\n    if (begin != null) result.begin = begin;\n    if (proc != null) result.proc = proc;\n    if (end != null) result.end = end;\n    if (likeIconId != null) result.likeIconId = likeIconId;\n    return result;\n  }\n\n  LikeAnimation._();\n\n  factory LikeAnimation.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LikeAnimation.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LikeAnimation',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'begin')\n    ..aOS(2, _omitFieldNames ? '' : 'proc')\n    ..aOS(3, _omitFieldNames ? '' : 'end')\n    ..aInt64(4, _omitFieldNames ? '' : 'likeIconId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeAnimation clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeAnimation copyWith(void Function(LikeAnimation) updates) =>\n      super.copyWith((message) => updates(message as LikeAnimation))\n          as LikeAnimation;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LikeAnimation create() => LikeAnimation._();\n  @$core.override\n  LikeAnimation createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LikeAnimation getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LikeAnimation>(create);\n  static LikeAnimation? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get begin => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set begin($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBegin() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBegin() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get proc => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set proc($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasProc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearProc() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get end => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set end($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasEnd() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearEnd() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get likeIconId => $_getI64(3);\n  @$pb.TagNumber(4)\n  set likeIconId($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLikeIconId() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLikeIconId() => $_clearField(4);\n}\n\nclass LikeInfo extends $pb.GeneratedMessage {\n  factory LikeInfo({\n    LikeAnimation? animation,\n    $core.bool? isLike,\n  }) {\n    final result = create();\n    if (animation != null) result.animation = animation;\n    if (isLike != null) result.isLike = isLike;\n    return result;\n  }\n\n  LikeInfo._();\n\n  factory LikeInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LikeInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LikeInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<LikeAnimation>(1, _omitFieldNames ? '' : 'animation',\n        subBuilder: LikeAnimation.create)\n    ..aOB(2, _omitFieldNames ? '' : 'isLike')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeInfo copyWith(void Function(LikeInfo) updates) =>\n      super.copyWith((message) => updates(message as LikeInfo)) as LikeInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LikeInfo create() => LikeInfo._();\n  @$core.override\n  LikeInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LikeInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<LikeInfo>(create);\n  static LikeInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  LikeAnimation get animation => $_getN(0);\n  @$pb.TagNumber(1)\n  set animation(LikeAnimation value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAnimation() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAnimation() => $_clearField(1);\n  @$pb.TagNumber(1)\n  LikeAnimation ensureAnimation() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.bool get isLike => $_getBF(1);\n  @$pb.TagNumber(2)\n  set isLike($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIsLike() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIsLike() => $_clearField(2);\n}\n\nclass LikeListReply extends $pb.GeneratedMessage {\n  factory LikeListReply({\n    $core.Iterable<ModuleAuthor>? list,\n    $core.bool? hasMore,\n    $fixnum.Int64? totalCount,\n  }) {\n    final result = create();\n    if (list != null) result.list.addAll(list);\n    if (hasMore != null) result.hasMore = hasMore;\n    if (totalCount != null) result.totalCount = totalCount;\n    return result;\n  }\n\n  LikeListReply._();\n\n  factory LikeListReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LikeListReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LikeListReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<ModuleAuthor>(1, _omitFieldNames ? '' : 'list',\n        subBuilder: ModuleAuthor.create)\n    ..aOB(2, _omitFieldNames ? '' : 'hasMore')\n    ..aInt64(3, _omitFieldNames ? '' : 'totalCount')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeListReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeListReply copyWith(void Function(LikeListReply) updates) =>\n      super.copyWith((message) => updates(message as LikeListReply))\n          as LikeListReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LikeListReply create() => LikeListReply._();\n  @$core.override\n  LikeListReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LikeListReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LikeListReply>(create);\n  static LikeListReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<ModuleAuthor> get list => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.bool get hasMore => $_getBF(1);\n  @$pb.TagNumber(2)\n  set hasMore($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHasMore() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHasMore() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get totalCount => $_getI64(2);\n  @$pb.TagNumber(3)\n  set totalCount($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTotalCount() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTotalCount() => $_clearField(3);\n}\n\nclass LikeListReq extends $pb.GeneratedMessage {\n  factory LikeListReq({\n    $core.String? dynamicId,\n    $fixnum.Int64? dynType,\n    $fixnum.Int64? rid,\n    $fixnum.Int64? uidOffset,\n    $core.int? page,\n  }) {\n    final result = create();\n    if (dynamicId != null) result.dynamicId = dynamicId;\n    if (dynType != null) result.dynType = dynType;\n    if (rid != null) result.rid = rid;\n    if (uidOffset != null) result.uidOffset = uidOffset;\n    if (page != null) result.page = page;\n    return result;\n  }\n\n  LikeListReq._();\n\n  factory LikeListReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LikeListReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LikeListReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'dynamicId')\n    ..aInt64(2, _omitFieldNames ? '' : 'dynType')\n    ..aInt64(3, _omitFieldNames ? '' : 'rid')\n    ..aInt64(4, _omitFieldNames ? '' : 'uidOffset')\n    ..aI(5, _omitFieldNames ? '' : 'page')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeListReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeListReq copyWith(void Function(LikeListReq) updates) =>\n      super.copyWith((message) => updates(message as LikeListReq))\n          as LikeListReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LikeListReq create() => LikeListReq._();\n  @$core.override\n  LikeListReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LikeListReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LikeListReq>(create);\n  static LikeListReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get dynamicId => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set dynamicId($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDynamicId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDynamicId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get dynType => $_getI64(1);\n  @$pb.TagNumber(2)\n  set dynType($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDynType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDynType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get rid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set rid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRid() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get uidOffset => $_getI64(3);\n  @$pb.TagNumber(4)\n  set uidOffset($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUidOffset() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUidOffset() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get page => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set page($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPage() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPage() => $_clearField(5);\n}\n\nclass LikeUser extends $pb.GeneratedMessage {\n  factory LikeUser({\n    $fixnum.Int64? uid,\n    $core.String? uname,\n    $core.String? uri,\n  }) {\n    final result = create();\n    if (uid != null) result.uid = uid;\n    if (uname != null) result.uname = uname;\n    if (uri != null) result.uri = uri;\n    return result;\n  }\n\n  LikeUser._();\n\n  factory LikeUser.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LikeUser.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LikeUser',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'uid')\n    ..aOS(2, _omitFieldNames ? '' : 'uname')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeUser clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeUser copyWith(void Function(LikeUser) updates) =>\n      super.copyWith((message) => updates(message as LikeUser)) as LikeUser;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LikeUser create() => LikeUser._();\n  @$core.override\n  LikeUser createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LikeUser getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<LikeUser>(create);\n  static LikeUser? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get uid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set uid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get uname => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uname($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUname() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUname() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n}\n\nclass LineParagraph extends $pb.GeneratedMessage {\n  factory LineParagraph({\n    MdlDynDrawItem? pic,\n  }) {\n    final result = create();\n    if (pic != null) result.pic = pic;\n    return result;\n  }\n\n  LineParagraph._();\n\n  factory LineParagraph.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LineParagraph.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LineParagraph',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<MdlDynDrawItem>(1, _omitFieldNames ? '' : 'pic',\n        subBuilder: MdlDynDrawItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LineParagraph clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LineParagraph copyWith(void Function(LineParagraph) updates) =>\n      super.copyWith((message) => updates(message as LineParagraph))\n          as LineParagraph;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LineParagraph create() => LineParagraph._();\n  @$core.override\n  LineParagraph createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LineParagraph getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LineParagraph>(create);\n  static LineParagraph? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  MdlDynDrawItem get pic => $_getN(0);\n  @$pb.TagNumber(1)\n  set pic(MdlDynDrawItem value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPic() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPic() => $_clearField(1);\n  @$pb.TagNumber(1)\n  MdlDynDrawItem ensurePic() => $_ensure(0);\n}\n\nclass LinkNode extends $pb.GeneratedMessage {\n  factory LinkNode({\n    WordNode? showText,\n    $core.String? link,\n    $core.String? icon,\n    $core.String? iconSuffix,\n    $core.String? linkType,\n    LinkNodeType? linkTypeEnum,\n    $core.String? bizId,\n    $fixnum.Int64? timestamp,\n    GoodsItem? goodsItem,\n    NoteVideoTS? noteVideoTs,\n    $6.Any? bizData,\n    MdlDynDraw? linkPics,\n  }) {\n    final result = create();\n    if (showText != null) result.showText = showText;\n    if (link != null) result.link = link;\n    if (icon != null) result.icon = icon;\n    if (iconSuffix != null) result.iconSuffix = iconSuffix;\n    if (linkType != null) result.linkType = linkType;\n    if (linkTypeEnum != null) result.linkTypeEnum = linkTypeEnum;\n    if (bizId != null) result.bizId = bizId;\n    if (timestamp != null) result.timestamp = timestamp;\n    if (goodsItem != null) result.goodsItem = goodsItem;\n    if (noteVideoTs != null) result.noteVideoTs = noteVideoTs;\n    if (bizData != null) result.bizData = bizData;\n    if (linkPics != null) result.linkPics = linkPics;\n    return result;\n  }\n\n  LinkNode._();\n\n  factory LinkNode.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LinkNode.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LinkNode',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<WordNode>(1, _omitFieldNames ? '' : 'showText',\n        subBuilder: WordNode.create)\n    ..aOS(2, _omitFieldNames ? '' : 'link')\n    ..aOS(3, _omitFieldNames ? '' : 'icon')\n    ..aOS(4, _omitFieldNames ? '' : 'iconSuffix')\n    ..aOS(5, _omitFieldNames ? '' : 'linkType')\n    ..aE<LinkNodeType>(6, _omitFieldNames ? '' : 'linkTypeEnum',\n        enumValues: LinkNodeType.values)\n    ..aOS(7, _omitFieldNames ? '' : 'bizId')\n    ..aInt64(8, _omitFieldNames ? '' : 'timestamp')\n    ..aOM<GoodsItem>(9, _omitFieldNames ? '' : 'goodsItem',\n        subBuilder: GoodsItem.create)\n    ..aOM<NoteVideoTS>(10, _omitFieldNames ? '' : 'noteVideoTs',\n        subBuilder: NoteVideoTS.create)\n    ..aOM<$6.Any>(11, _omitFieldNames ? '' : 'bizData',\n        subBuilder: $6.Any.create)\n    ..aOM<MdlDynDraw>(12, _omitFieldNames ? '' : 'linkPics',\n        subBuilder: MdlDynDraw.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LinkNode clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LinkNode copyWith(void Function(LinkNode) updates) =>\n      super.copyWith((message) => updates(message as LinkNode)) as LinkNode;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LinkNode create() => LinkNode._();\n  @$core.override\n  LinkNode createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LinkNode getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<LinkNode>(create);\n  static LinkNode? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  WordNode get showText => $_getN(0);\n  @$pb.TagNumber(1)\n  set showText(WordNode value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasShowText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearShowText() => $_clearField(1);\n  @$pb.TagNumber(1)\n  WordNode ensureShowText() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get link => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set link($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLink() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLink() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get icon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set icon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIcon() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get iconSuffix => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set iconSuffix($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIconSuffix() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIconSuffix() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get linkType => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set linkType($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasLinkType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearLinkType() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  LinkNodeType get linkTypeEnum => $_getN(5);\n  @$pb.TagNumber(6)\n  set linkTypeEnum(LinkNodeType value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasLinkTypeEnum() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearLinkTypeEnum() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get bizId => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set bizId($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBizId() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBizId() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get timestamp => $_getI64(7);\n  @$pb.TagNumber(8)\n  set timestamp($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasTimestamp() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearTimestamp() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  GoodsItem get goodsItem => $_getN(8);\n  @$pb.TagNumber(9)\n  set goodsItem(GoodsItem value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasGoodsItem() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearGoodsItem() => $_clearField(9);\n  @$pb.TagNumber(9)\n  GoodsItem ensureGoodsItem() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  NoteVideoTS get noteVideoTs => $_getN(9);\n  @$pb.TagNumber(10)\n  set noteVideoTs(NoteVideoTS value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasNoteVideoTs() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearNoteVideoTs() => $_clearField(10);\n  @$pb.TagNumber(10)\n  NoteVideoTS ensureNoteVideoTs() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  $6.Any get bizData => $_getN(10);\n  @$pb.TagNumber(11)\n  set bizData($6.Any value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasBizData() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearBizData() => $_clearField(11);\n  @$pb.TagNumber(11)\n  $6.Any ensureBizData() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  MdlDynDraw get linkPics => $_getN(11);\n  @$pb.TagNumber(12)\n  set linkPics(MdlDynDraw value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasLinkPics() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearLinkPics() => $_clearField(12);\n  @$pb.TagNumber(12)\n  MdlDynDraw ensureLinkPics() => $_ensure(11);\n}\n\nclass ListCreationReq extends $pb.GeneratedMessage {\n  factory ListCreationReq({\n    SelectedClassificationAndSortType? preference,\n    $core.int? localTime,\n    $7.Pagination? pagination,\n  }) {\n    final result = create();\n    if (preference != null) result.preference = preference;\n    if (localTime != null) result.localTime = localTime;\n    if (pagination != null) result.pagination = pagination;\n    return result;\n  }\n\n  ListCreationReq._();\n\n  factory ListCreationReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ListCreationReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ListCreationReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<SelectedClassificationAndSortType>(\n        1, _omitFieldNames ? '' : 'preference',\n        subBuilder: SelectedClassificationAndSortType.create)\n    ..aI(2, _omitFieldNames ? '' : 'localTime')\n    ..aOM<$7.Pagination>(3, _omitFieldNames ? '' : 'pagination',\n        subBuilder: $7.Pagination.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ListCreationReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ListCreationReq copyWith(void Function(ListCreationReq) updates) =>\n      super.copyWith((message) => updates(message as ListCreationReq))\n          as ListCreationReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ListCreationReq create() => ListCreationReq._();\n  @$core.override\n  ListCreationReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ListCreationReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ListCreationReq>(create);\n  static ListCreationReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  SelectedClassificationAndSortType get preference => $_getN(0);\n  @$pb.TagNumber(1)\n  set preference(SelectedClassificationAndSortType value) =>\n      $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPreference() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPreference() => $_clearField(1);\n  @$pb.TagNumber(1)\n  SelectedClassificationAndSortType ensurePreference() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.int get localTime => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set localTime($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLocalTime() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLocalTime() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $7.Pagination get pagination => $_getN(2);\n  @$pb.TagNumber(3)\n  set pagination($7.Pagination value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPagination() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPagination() => $_clearField(3);\n  @$pb.TagNumber(3)\n  $7.Pagination ensurePagination() => $_ensure(2);\n}\n\nclass ListCreationResp extends $pb.GeneratedMessage {\n  factory ListCreationResp({\n    $core.Iterable<CreationClassification>? classifications,\n    $core.Iterable<CreationSortType>? sortTypes,\n    $7.PaginationReply? nextPage,\n    $core.Iterable<OpusCreationItem>? creationList,\n  }) {\n    final result = create();\n    if (classifications != null) result.classifications.addAll(classifications);\n    if (sortTypes != null) result.sortTypes.addAll(sortTypes);\n    if (nextPage != null) result.nextPage = nextPage;\n    if (creationList != null) result.creationList.addAll(creationList);\n    return result;\n  }\n\n  ListCreationResp._();\n\n  factory ListCreationResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ListCreationResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ListCreationResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<CreationClassification>(1, _omitFieldNames ? '' : 'classifications',\n        subBuilder: CreationClassification.create)\n    ..pPM<CreationSortType>(2, _omitFieldNames ? '' : 'sortTypes',\n        subBuilder: CreationSortType.create)\n    ..aOM<$7.PaginationReply>(3, _omitFieldNames ? '' : 'nextPage',\n        subBuilder: $7.PaginationReply.create)\n    ..pPM<OpusCreationItem>(4, _omitFieldNames ? '' : 'creationList',\n        subBuilder: OpusCreationItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ListCreationResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ListCreationResp copyWith(void Function(ListCreationResp) updates) =>\n      super.copyWith((message) => updates(message as ListCreationResp))\n          as ListCreationResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ListCreationResp create() => ListCreationResp._();\n  @$core.override\n  ListCreationResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ListCreationResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ListCreationResp>(create);\n  static ListCreationResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<CreationClassification> get classifications => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<CreationSortType> get sortTypes => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $7.PaginationReply get nextPage => $_getN(2);\n  @$pb.TagNumber(3)\n  set nextPage($7.PaginationReply value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasNextPage() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearNextPage() => $_clearField(3);\n  @$pb.TagNumber(3)\n  $7.PaginationReply ensureNextPage() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<OpusCreationItem> get creationList => $_getList(3);\n}\n\nclass ListFavReq extends $pb.GeneratedMessage {\n  factory ListFavReq({\n    $core.int? localTime,\n    $7.Pagination? pagination,\n  }) {\n    final result = create();\n    if (localTime != null) result.localTime = localTime;\n    if (pagination != null) result.pagination = pagination;\n    return result;\n  }\n\n  ListFavReq._();\n\n  factory ListFavReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ListFavReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ListFavReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'localTime')\n    ..aOM<$7.Pagination>(2, _omitFieldNames ? '' : 'pagination',\n        subBuilder: $7.Pagination.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ListFavReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ListFavReq copyWith(void Function(ListFavReq) updates) =>\n      super.copyWith((message) => updates(message as ListFavReq)) as ListFavReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ListFavReq create() => ListFavReq._();\n  @$core.override\n  ListFavReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ListFavReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ListFavReq>(create);\n  static ListFavReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get localTime => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set localTime($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLocalTime() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLocalTime() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $7.Pagination get pagination => $_getN(1);\n  @$pb.TagNumber(2)\n  set pagination($7.Pagination value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPagination() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPagination() => $_clearField(2);\n  @$pb.TagNumber(2)\n  $7.Pagination ensurePagination() => $_ensure(1);\n}\n\nclass ListFavResp extends $pb.GeneratedMessage {\n  factory ListFavResp({\n    $core.Iterable<OpusFavItem>? itemList,\n    $7.PaginationReply? nextPage,\n  }) {\n    final result = create();\n    if (itemList != null) result.itemList.addAll(itemList);\n    if (nextPage != null) result.nextPage = nextPage;\n    return result;\n  }\n\n  ListFavResp._();\n\n  factory ListFavResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ListFavResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ListFavResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<OpusFavItem>(1, _omitFieldNames ? '' : 'itemList',\n        subBuilder: OpusFavItem.create)\n    ..aOM<$7.PaginationReply>(2, _omitFieldNames ? '' : 'nextPage',\n        subBuilder: $7.PaginationReply.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ListFavResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ListFavResp copyWith(void Function(ListFavResp) updates) =>\n      super.copyWith((message) => updates(message as ListFavResp))\n          as ListFavResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ListFavResp create() => ListFavResp._();\n  @$core.override\n  ListFavResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ListFavResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ListFavResp>(create);\n  static ListFavResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<OpusFavItem> get itemList => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $7.PaginationReply get nextPage => $_getN(1);\n  @$pb.TagNumber(2)\n  set nextPage($7.PaginationReply value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasNextPage() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearNextPage() => $_clearField(2);\n  @$pb.TagNumber(2)\n  $7.PaginationReply ensureNextPage() => $_ensure(1);\n}\n\nclass LiveInfo extends $pb.GeneratedMessage {\n  factory LiveInfo({\n    $core.int? isLiving,\n    $core.String? uri,\n    LiveState? liveState,\n  }) {\n    final result = create();\n    if (isLiving != null) result.isLiving = isLiving;\n    if (uri != null) result.uri = uri;\n    if (liveState != null) result.liveState = liveState;\n    return result;\n  }\n\n  LiveInfo._();\n\n  factory LiveInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LiveInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LiveInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'isLiving')\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..aE<LiveState>(3, _omitFieldNames ? '' : 'liveState',\n        enumValues: LiveState.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LiveInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LiveInfo copyWith(void Function(LiveInfo) updates) =>\n      super.copyWith((message) => updates(message as LiveInfo)) as LiveInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LiveInfo create() => LiveInfo._();\n  @$core.override\n  LiveInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LiveInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<LiveInfo>(create);\n  static LiveInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get isLiving => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set isLiving($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIsLiving() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIsLiving() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  LiveState get liveState => $_getN(2);\n  @$pb.TagNumber(3)\n  set liveState(LiveState value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLiveState() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLiveState() => $_clearField(3);\n}\n\nclass LivePendant extends $pb.GeneratedMessage {\n  factory LivePendant({\n    $core.String? text,\n    $core.String? icon,\n    $fixnum.Int64? pendantId,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (icon != null) result.icon = icon;\n    if (pendantId != null) result.pendantId = pendantId;\n    return result;\n  }\n\n  LivePendant._();\n\n  factory LivePendant.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LivePendant.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LivePendant',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aOS(2, _omitFieldNames ? '' : 'icon')\n    ..aInt64(3, _omitFieldNames ? '' : 'pendantId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LivePendant clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LivePendant copyWith(void Function(LivePendant) updates) =>\n      super.copyWith((message) => updates(message as LivePendant))\n          as LivePendant;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LivePendant create() => LivePendant._();\n  @$core.override\n  LivePendant createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LivePendant getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LivePendant>(create);\n  static LivePendant? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get icon => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set icon($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIcon() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIcon() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get pendantId => $_getI64(2);\n  @$pb.TagNumber(3)\n  set pendantId($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPendantId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPendantId() => $_clearField(3);\n}\n\nclass MangaLikeBrowserGuidance extends $pb.GeneratedMessage {\n  factory MangaLikeBrowserGuidance({\n    $core.bool? showPageRightToLeftGuidance,\n    $core.String? pageRightToLeftGuidanceText,\n  }) {\n    final result = create();\n    if (showPageRightToLeftGuidance != null)\n      result.showPageRightToLeftGuidance = showPageRightToLeftGuidance;\n    if (pageRightToLeftGuidanceText != null)\n      result.pageRightToLeftGuidanceText = pageRightToLeftGuidanceText;\n    return result;\n  }\n\n  MangaLikeBrowserGuidance._();\n\n  factory MangaLikeBrowserGuidance.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MangaLikeBrowserGuidance.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MangaLikeBrowserGuidance',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'showPageRightToLeftGuidance')\n    ..aOS(2, _omitFieldNames ? '' : 'pageRightToLeftGuidanceText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MangaLikeBrowserGuidance clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MangaLikeBrowserGuidance copyWith(\n          void Function(MangaLikeBrowserGuidance) updates) =>\n      super.copyWith((message) => updates(message as MangaLikeBrowserGuidance))\n          as MangaLikeBrowserGuidance;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MangaLikeBrowserGuidance create() => MangaLikeBrowserGuidance._();\n  @$core.override\n  MangaLikeBrowserGuidance createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MangaLikeBrowserGuidance getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MangaLikeBrowserGuidance>(create);\n  static MangaLikeBrowserGuidance? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get showPageRightToLeftGuidance => $_getBF(0);\n  @$pb.TagNumber(1)\n  set showPageRightToLeftGuidance($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasShowPageRightToLeftGuidance() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearShowPageRightToLeftGuidance() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get pageRightToLeftGuidanceText => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set pageRightToLeftGuidanceText($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPageRightToLeftGuidanceText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPageRightToLeftGuidanceText() => $_clearField(2);\n}\n\nclass MangaLikePic extends $pb.GeneratedMessage {\n  factory MangaLikePic({\n    ProtectedStaticResource? pic,\n    $fixnum.Int64? width,\n    $fixnum.Int64? height,\n  }) {\n    final result = create();\n    if (pic != null) result.pic = pic;\n    if (width != null) result.width = width;\n    if (height != null) result.height = height;\n    return result;\n  }\n\n  MangaLikePic._();\n\n  factory MangaLikePic.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MangaLikePic.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MangaLikePic',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<ProtectedStaticResource>(1, _omitFieldNames ? '' : 'pic',\n        subBuilder: ProtectedStaticResource.create)\n    ..aInt64(2, _omitFieldNames ? '' : 'width')\n    ..aInt64(3, _omitFieldNames ? '' : 'height')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MangaLikePic clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MangaLikePic copyWith(void Function(MangaLikePic) updates) =>\n      super.copyWith((message) => updates(message as MangaLikePic))\n          as MangaLikePic;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MangaLikePic create() => MangaLikePic._();\n  @$core.override\n  MangaLikePic createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MangaLikePic getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MangaLikePic>(create);\n  static MangaLikePic? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  ProtectedStaticResource get pic => $_getN(0);\n  @$pb.TagNumber(1)\n  set pic(ProtectedStaticResource value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPic() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPic() => $_clearField(1);\n  @$pb.TagNumber(1)\n  ProtectedStaticResource ensurePic() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get width => $_getI64(1);\n  @$pb.TagNumber(2)\n  set width($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasWidth() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearWidth() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get height => $_getI64(2);\n  @$pb.TagNumber(3)\n  set height($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasHeight() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearHeight() => $_clearField(3);\n}\n\nclass MangaProperty extends $pb.GeneratedMessage {\n  factory MangaProperty({\n    $fixnum.Int64? epId,\n    $fixnum.Int64? mangaId,\n    $core.bool? isPremiumContent,\n    $core.bool? isPaymentNeeded,\n  }) {\n    final result = create();\n    if (epId != null) result.epId = epId;\n    if (mangaId != null) result.mangaId = mangaId;\n    if (isPremiumContent != null) result.isPremiumContent = isPremiumContent;\n    if (isPaymentNeeded != null) result.isPaymentNeeded = isPaymentNeeded;\n    return result;\n  }\n\n  MangaProperty._();\n\n  factory MangaProperty.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MangaProperty.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MangaProperty',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'epId')\n    ..aInt64(2, _omitFieldNames ? '' : 'mangaId')\n    ..aOB(3, _omitFieldNames ? '' : 'isPremiumContent')\n    ..aOB(4, _omitFieldNames ? '' : 'isPaymentNeeded')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MangaProperty clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MangaProperty copyWith(void Function(MangaProperty) updates) =>\n      super.copyWith((message) => updates(message as MangaProperty))\n          as MangaProperty;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MangaProperty create() => MangaProperty._();\n  @$core.override\n  MangaProperty createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MangaProperty getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MangaProperty>(create);\n  static MangaProperty? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get epId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set epId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasEpId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearEpId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get mangaId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set mangaId($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMangaId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMangaId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get isPremiumContent => $_getBF(2);\n  @$pb.TagNumber(3)\n  set isPremiumContent($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIsPremiumContent() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIsPremiumContent() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get isPaymentNeeded => $_getBF(3);\n  @$pb.TagNumber(4)\n  set isPaymentNeeded($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIsPaymentNeeded() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIsPaymentNeeded() => $_clearField(4);\n}\n\nclass MatchTeam extends $pb.GeneratedMessage {\n  factory MatchTeam({\n    $fixnum.Int64? id,\n    $core.String? name,\n    $core.String? cover,\n    $core.String? color,\n    $core.String? nightColor,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (name != null) result.name = name;\n    if (cover != null) result.cover = cover;\n    if (color != null) result.color = color;\n    if (nightColor != null) result.nightColor = nightColor;\n    return result;\n  }\n\n  MatchTeam._();\n\n  factory MatchTeam.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MatchTeam.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MatchTeam',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'cover')\n    ..aOS(4, _omitFieldNames ? '' : 'color')\n    ..aOS(5, _omitFieldNames ? '' : 'nightColor')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MatchTeam clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MatchTeam copyWith(void Function(MatchTeam) updates) =>\n      super.copyWith((message) => updates(message as MatchTeam)) as MatchTeam;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MatchTeam create() => MatchTeam._();\n  @$core.override\n  MatchTeam createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MatchTeam getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<MatchTeam>(create);\n  static MatchTeam? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get cover => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set cover($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCover() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCover() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get color => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set color($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasColor() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearColor() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get nightColor => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set nightColor($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasNightColor() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearNightColor() => $_clearField(5);\n}\n\nclass MdlDynApplet extends $pb.GeneratedMessage {\n  factory MdlDynApplet({\n    $fixnum.Int64? id,\n    $core.String? uri,\n    $core.String? title,\n    $core.String? subTitle,\n    $core.String? cover,\n    $core.String? icon,\n    $core.String? label,\n    $core.String? buttonTitle,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (uri != null) result.uri = uri;\n    if (title != null) result.title = title;\n    if (subTitle != null) result.subTitle = subTitle;\n    if (cover != null) result.cover = cover;\n    if (icon != null) result.icon = icon;\n    if (label != null) result.label = label;\n    if (buttonTitle != null) result.buttonTitle = buttonTitle;\n    return result;\n  }\n\n  MdlDynApplet._();\n\n  factory MdlDynApplet.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MdlDynApplet.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MdlDynApplet',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..aOS(4, _omitFieldNames ? '' : 'title')\n    ..aOS(5, _omitFieldNames ? '' : 'subTitle')\n    ..aOS(6, _omitFieldNames ? '' : 'cover')\n    ..aOS(7, _omitFieldNames ? '' : 'icon')\n    ..aOS(8, _omitFieldNames ? '' : 'label')\n    ..aOS(9, _omitFieldNames ? '' : 'buttonTitle')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynApplet clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynApplet copyWith(void Function(MdlDynApplet) updates) =>\n      super.copyWith((message) => updates(message as MdlDynApplet))\n          as MdlDynApplet;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MdlDynApplet create() => MdlDynApplet._();\n  @$core.override\n  MdlDynApplet createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MdlDynApplet getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MdlDynApplet>(create);\n  static MdlDynApplet? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n\n  @$pb.TagNumber(4)\n  $core.String get title => $_getSZ(2);\n  @$pb.TagNumber(4)\n  set title($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTitle() => $_has(2);\n  @$pb.TagNumber(4)\n  void clearTitle() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get subTitle => $_getSZ(3);\n  @$pb.TagNumber(5)\n  set subTitle($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(5)\n  $core.bool hasSubTitle() => $_has(3);\n  @$pb.TagNumber(5)\n  void clearSubTitle() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get cover => $_getSZ(4);\n  @$pb.TagNumber(6)\n  set cover($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCover() => $_has(4);\n  @$pb.TagNumber(6)\n  void clearCover() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get icon => $_getSZ(5);\n  @$pb.TagNumber(7)\n  set icon($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(7)\n  $core.bool hasIcon() => $_has(5);\n  @$pb.TagNumber(7)\n  void clearIcon() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get label => $_getSZ(6);\n  @$pb.TagNumber(8)\n  set label($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(8)\n  $core.bool hasLabel() => $_has(6);\n  @$pb.TagNumber(8)\n  void clearLabel() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get buttonTitle => $_getSZ(7);\n  @$pb.TagNumber(9)\n  set buttonTitle($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(9)\n  $core.bool hasButtonTitle() => $_has(7);\n  @$pb.TagNumber(9)\n  void clearButtonTitle() => $_clearField(9);\n}\n\nclass MdlDynArchive extends $pb.GeneratedMessage {\n  factory MdlDynArchive({\n    $core.String? title,\n    $core.String? cover,\n    $core.String? uri,\n    $core.String? coverLeftText1,\n    $core.String? coverLeftText2,\n    $core.String? coverLeftText3,\n    $fixnum.Int64? avid,\n    $fixnum.Int64? cid,\n    MediaType? mediaType,\n    Dimension? dimension,\n    $core.Iterable<VideoBadge>? badge,\n    $core.bool? canPlay,\n    VideoType? stype,\n    $core.bool? isPGC,\n    $core.String? inlineURL,\n    $fixnum.Int64? episodeId,\n    $core.int? subType,\n    $fixnum.Int64? pgcSeasonId,\n    $core.String? playIcon,\n    $fixnum.Int64? duration,\n    $core.String? jumpUrl,\n    $core.bool? isPreview,\n    $core.Iterable<VideoBadge>? badgeCategory,\n    $core.bool? isFeature,\n    ReserveType? reserveType,\n    $core.String? bvid,\n    $core.int? view,\n    $core.bool? showPremiereBadge,\n    $core.bool? premiereCard,\n    $core.bool? showProgress,\n    $fixnum.Int64? partDuration,\n    $fixnum.Int64? partProgress,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (uri != null) result.uri = uri;\n    if (coverLeftText1 != null) result.coverLeftText1 = coverLeftText1;\n    if (coverLeftText2 != null) result.coverLeftText2 = coverLeftText2;\n    if (coverLeftText3 != null) result.coverLeftText3 = coverLeftText3;\n    if (avid != null) result.avid = avid;\n    if (cid != null) result.cid = cid;\n    if (mediaType != null) result.mediaType = mediaType;\n    if (dimension != null) result.dimension = dimension;\n    if (badge != null) result.badge.addAll(badge);\n    if (canPlay != null) result.canPlay = canPlay;\n    if (stype != null) result.stype = stype;\n    if (isPGC != null) result.isPGC = isPGC;\n    if (inlineURL != null) result.inlineURL = inlineURL;\n    if (episodeId != null) result.episodeId = episodeId;\n    if (subType != null) result.subType = subType;\n    if (pgcSeasonId != null) result.pgcSeasonId = pgcSeasonId;\n    if (playIcon != null) result.playIcon = playIcon;\n    if (duration != null) result.duration = duration;\n    if (jumpUrl != null) result.jumpUrl = jumpUrl;\n    if (isPreview != null) result.isPreview = isPreview;\n    if (badgeCategory != null) result.badgeCategory.addAll(badgeCategory);\n    if (isFeature != null) result.isFeature = isFeature;\n    if (reserveType != null) result.reserveType = reserveType;\n    if (bvid != null) result.bvid = bvid;\n    if (view != null) result.view = view;\n    if (showPremiereBadge != null) result.showPremiereBadge = showPremiereBadge;\n    if (premiereCard != null) result.premiereCard = premiereCard;\n    if (showProgress != null) result.showProgress = showProgress;\n    if (partDuration != null) result.partDuration = partDuration;\n    if (partProgress != null) result.partProgress = partProgress;\n    return result;\n  }\n\n  MdlDynArchive._();\n\n  factory MdlDynArchive.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MdlDynArchive.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MdlDynArchive',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'cover')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..aOS(4, _omitFieldNames ? '' : 'coverLeftText1')\n    ..aOS(5, _omitFieldNames ? '' : 'coverLeftText2')\n    ..aOS(6, _omitFieldNames ? '' : 'coverLeftText3')\n    ..aInt64(7, _omitFieldNames ? '' : 'avid')\n    ..aInt64(8, _omitFieldNames ? '' : 'cid')\n    ..aE<MediaType>(9, _omitFieldNames ? '' : 'mediaType',\n        enumValues: MediaType.values)\n    ..aOM<Dimension>(10, _omitFieldNames ? '' : 'dimension',\n        subBuilder: Dimension.create)\n    ..pPM<VideoBadge>(11, _omitFieldNames ? '' : 'badge',\n        subBuilder: VideoBadge.create)\n    ..aOB(12, _omitFieldNames ? '' : 'canPlay')\n    ..aE<VideoType>(13, _omitFieldNames ? '' : 'stype',\n        enumValues: VideoType.values)\n    ..aOB(14, _omitFieldNames ? '' : 'isPGC')\n    ..aOS(15, _omitFieldNames ? '' : 'inlineURL')\n    ..aInt64(16, _omitFieldNames ? '' : 'episodeId')\n    ..aI(17, _omitFieldNames ? '' : 'subType')\n    ..aInt64(18, _omitFieldNames ? '' : 'pgcSeasonId')\n    ..aOS(19, _omitFieldNames ? '' : 'playIcon')\n    ..aInt64(20, _omitFieldNames ? '' : 'duration')\n    ..aOS(21, _omitFieldNames ? '' : 'jumpUrl')\n    ..aOB(22, _omitFieldNames ? '' : 'isPreview')\n    ..pPM<VideoBadge>(23, _omitFieldNames ? '' : 'badgeCategory',\n        subBuilder: VideoBadge.create)\n    ..aOB(24, _omitFieldNames ? '' : 'isFeature')\n    ..aE<ReserveType>(25, _omitFieldNames ? '' : 'reserveType',\n        enumValues: ReserveType.values)\n    ..aOS(26, _omitFieldNames ? '' : 'bvid')\n    ..aI(27, _omitFieldNames ? '' : 'view')\n    ..aOB(28, _omitFieldNames ? '' : 'showPremiereBadge')\n    ..aOB(29, _omitFieldNames ? '' : 'premiereCard')\n    ..aOB(30, _omitFieldNames ? '' : 'showProgress')\n    ..aInt64(31, _omitFieldNames ? '' : 'partDuration')\n    ..aInt64(32, _omitFieldNames ? '' : 'partProgress')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynArchive clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynArchive copyWith(void Function(MdlDynArchive) updates) =>\n      super.copyWith((message) => updates(message as MdlDynArchive))\n          as MdlDynArchive;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MdlDynArchive create() => MdlDynArchive._();\n  @$core.override\n  MdlDynArchive createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MdlDynArchive getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MdlDynArchive>(create);\n  static MdlDynArchive? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get cover => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cover($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCover() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCover() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get coverLeftText1 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set coverLeftText1($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCoverLeftText1() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCoverLeftText1() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get coverLeftText2 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set coverLeftText2($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCoverLeftText2() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCoverLeftText2() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get coverLeftText3 => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set coverLeftText3($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCoverLeftText3() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCoverLeftText3() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get avid => $_getI64(6);\n  @$pb.TagNumber(7)\n  set avid($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasAvid() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearAvid() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get cid => $_getI64(7);\n  @$pb.TagNumber(8)\n  set cid($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasCid() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearCid() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  MediaType get mediaType => $_getN(8);\n  @$pb.TagNumber(9)\n  set mediaType(MediaType value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasMediaType() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearMediaType() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  Dimension get dimension => $_getN(9);\n  @$pb.TagNumber(10)\n  set dimension(Dimension value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasDimension() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearDimension() => $_clearField(10);\n  @$pb.TagNumber(10)\n  Dimension ensureDimension() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  $pb.PbList<VideoBadge> get badge => $_getList(10);\n\n  @$pb.TagNumber(12)\n  $core.bool get canPlay => $_getBF(11);\n  @$pb.TagNumber(12)\n  set canPlay($core.bool value) => $_setBool(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasCanPlay() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearCanPlay() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  VideoType get stype => $_getN(12);\n  @$pb.TagNumber(13)\n  set stype(VideoType value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasStype() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearStype() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.bool get isPGC => $_getBF(13);\n  @$pb.TagNumber(14)\n  set isPGC($core.bool value) => $_setBool(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasIsPGC() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearIsPGC() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $core.String get inlineURL => $_getSZ(14);\n  @$pb.TagNumber(15)\n  set inlineURL($core.String value) => $_setString(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasInlineURL() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearInlineURL() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $fixnum.Int64 get episodeId => $_getI64(15);\n  @$pb.TagNumber(16)\n  set episodeId($fixnum.Int64 value) => $_setInt64(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasEpisodeId() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearEpisodeId() => $_clearField(16);\n\n  @$pb.TagNumber(17)\n  $core.int get subType => $_getIZ(16);\n  @$pb.TagNumber(17)\n  set subType($core.int value) => $_setSignedInt32(16, value);\n  @$pb.TagNumber(17)\n  $core.bool hasSubType() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearSubType() => $_clearField(17);\n\n  @$pb.TagNumber(18)\n  $fixnum.Int64 get pgcSeasonId => $_getI64(17);\n  @$pb.TagNumber(18)\n  set pgcSeasonId($fixnum.Int64 value) => $_setInt64(17, value);\n  @$pb.TagNumber(18)\n  $core.bool hasPgcSeasonId() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearPgcSeasonId() => $_clearField(18);\n\n  @$pb.TagNumber(19)\n  $core.String get playIcon => $_getSZ(18);\n  @$pb.TagNumber(19)\n  set playIcon($core.String value) => $_setString(18, value);\n  @$pb.TagNumber(19)\n  $core.bool hasPlayIcon() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearPlayIcon() => $_clearField(19);\n\n  @$pb.TagNumber(20)\n  $fixnum.Int64 get duration => $_getI64(19);\n  @$pb.TagNumber(20)\n  set duration($fixnum.Int64 value) => $_setInt64(19, value);\n  @$pb.TagNumber(20)\n  $core.bool hasDuration() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearDuration() => $_clearField(20);\n\n  @$pb.TagNumber(21)\n  $core.String get jumpUrl => $_getSZ(20);\n  @$pb.TagNumber(21)\n  set jumpUrl($core.String value) => $_setString(20, value);\n  @$pb.TagNumber(21)\n  $core.bool hasJumpUrl() => $_has(20);\n  @$pb.TagNumber(21)\n  void clearJumpUrl() => $_clearField(21);\n\n  @$pb.TagNumber(22)\n  $core.bool get isPreview => $_getBF(21);\n  @$pb.TagNumber(22)\n  set isPreview($core.bool value) => $_setBool(21, value);\n  @$pb.TagNumber(22)\n  $core.bool hasIsPreview() => $_has(21);\n  @$pb.TagNumber(22)\n  void clearIsPreview() => $_clearField(22);\n\n  @$pb.TagNumber(23)\n  $pb.PbList<VideoBadge> get badgeCategory => $_getList(22);\n\n  @$pb.TagNumber(24)\n  $core.bool get isFeature => $_getBF(23);\n  @$pb.TagNumber(24)\n  set isFeature($core.bool value) => $_setBool(23, value);\n  @$pb.TagNumber(24)\n  $core.bool hasIsFeature() => $_has(23);\n  @$pb.TagNumber(24)\n  void clearIsFeature() => $_clearField(24);\n\n  @$pb.TagNumber(25)\n  ReserveType get reserveType => $_getN(24);\n  @$pb.TagNumber(25)\n  set reserveType(ReserveType value) => $_setField(25, value);\n  @$pb.TagNumber(25)\n  $core.bool hasReserveType() => $_has(24);\n  @$pb.TagNumber(25)\n  void clearReserveType() => $_clearField(25);\n\n  @$pb.TagNumber(26)\n  $core.String get bvid => $_getSZ(25);\n  @$pb.TagNumber(26)\n  set bvid($core.String value) => $_setString(25, value);\n  @$pb.TagNumber(26)\n  $core.bool hasBvid() => $_has(25);\n  @$pb.TagNumber(26)\n  void clearBvid() => $_clearField(26);\n\n  @$pb.TagNumber(27)\n  $core.int get view => $_getIZ(26);\n  @$pb.TagNumber(27)\n  set view($core.int value) => $_setSignedInt32(26, value);\n  @$pb.TagNumber(27)\n  $core.bool hasView() => $_has(26);\n  @$pb.TagNumber(27)\n  void clearView() => $_clearField(27);\n\n  @$pb.TagNumber(28)\n  $core.bool get showPremiereBadge => $_getBF(27);\n  @$pb.TagNumber(28)\n  set showPremiereBadge($core.bool value) => $_setBool(27, value);\n  @$pb.TagNumber(28)\n  $core.bool hasShowPremiereBadge() => $_has(27);\n  @$pb.TagNumber(28)\n  void clearShowPremiereBadge() => $_clearField(28);\n\n  @$pb.TagNumber(29)\n  $core.bool get premiereCard => $_getBF(28);\n  @$pb.TagNumber(29)\n  set premiereCard($core.bool value) => $_setBool(28, value);\n  @$pb.TagNumber(29)\n  $core.bool hasPremiereCard() => $_has(28);\n  @$pb.TagNumber(29)\n  void clearPremiereCard() => $_clearField(29);\n\n  @$pb.TagNumber(30)\n  $core.bool get showProgress => $_getBF(29);\n  @$pb.TagNumber(30)\n  set showProgress($core.bool value) => $_setBool(29, value);\n  @$pb.TagNumber(30)\n  $core.bool hasShowProgress() => $_has(29);\n  @$pb.TagNumber(30)\n  void clearShowProgress() => $_clearField(30);\n\n  @$pb.TagNumber(31)\n  $fixnum.Int64 get partDuration => $_getI64(30);\n  @$pb.TagNumber(31)\n  set partDuration($fixnum.Int64 value) => $_setInt64(30, value);\n  @$pb.TagNumber(31)\n  $core.bool hasPartDuration() => $_has(30);\n  @$pb.TagNumber(31)\n  void clearPartDuration() => $_clearField(31);\n\n  @$pb.TagNumber(32)\n  $fixnum.Int64 get partProgress => $_getI64(31);\n  @$pb.TagNumber(32)\n  set partProgress($fixnum.Int64 value) => $_setInt64(31, value);\n  @$pb.TagNumber(32)\n  $core.bool hasPartProgress() => $_has(31);\n  @$pb.TagNumber(32)\n  void clearPartProgress() => $_clearField(32);\n}\n\nclass MdlDynArticle extends $pb.GeneratedMessage {\n  factory MdlDynArticle({\n    $fixnum.Int64? id,\n    $core.String? uri,\n    $core.String? title,\n    $core.String? desc,\n    $core.Iterable<$core.String>? covers,\n    $core.String? label,\n    $core.int? templateID,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (uri != null) result.uri = uri;\n    if (title != null) result.title = title;\n    if (desc != null) result.desc = desc;\n    if (covers != null) result.covers.addAll(covers);\n    if (label != null) result.label = label;\n    if (templateID != null) result.templateID = templateID;\n    return result;\n  }\n\n  MdlDynArticle._();\n\n  factory MdlDynArticle.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MdlDynArticle.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MdlDynArticle',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..aOS(3, _omitFieldNames ? '' : 'title')\n    ..aOS(4, _omitFieldNames ? '' : 'desc')\n    ..pPS(5, _omitFieldNames ? '' : 'covers')\n    ..aOS(6, _omitFieldNames ? '' : 'label')\n    ..aI(7, _omitFieldNames ? '' : 'templateID')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynArticle clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynArticle copyWith(void Function(MdlDynArticle) updates) =>\n      super.copyWith((message) => updates(message as MdlDynArticle))\n          as MdlDynArticle;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MdlDynArticle create() => MdlDynArticle._();\n  @$core.override\n  MdlDynArticle createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MdlDynArticle getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MdlDynArticle>(create);\n  static MdlDynArticle? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get title => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set title($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get desc => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set desc($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDesc() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDesc() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $pb.PbList<$core.String> get covers => $_getList(4);\n\n  @$pb.TagNumber(6)\n  $core.String get label => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set label($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasLabel() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearLabel() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get templateID => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set templateID($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasTemplateID() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearTemplateID() => $_clearField(7);\n}\n\nclass MdlDynChargingArchive extends $pb.GeneratedMessage {\n  factory MdlDynChargingArchive({\n    MdlDynArchive? archiveInfo,\n    $core.bool? hasPermission,\n    $core.bool? canInline,\n    $core.String? chargingBundleName,\n    $fixnum.Int64? cfgPreviewEndToastCountdown,\n    $fixnum.Int64? cfgNormalInlineToastDuration,\n    OneLineText? videoBottomTextUpper,\n    OneLineText? videoBottomTextLower,\n    $core.String? archiveCover,\n    $core.String? archiveTitle,\n    IconButton? actBtn,\n    OneLineText? textNormalInlineToast,\n    OneLineText? textAppendPreviewEndToast,\n  }) {\n    final result = create();\n    if (archiveInfo != null) result.archiveInfo = archiveInfo;\n    if (hasPermission != null) result.hasPermission = hasPermission;\n    if (canInline != null) result.canInline = canInline;\n    if (chargingBundleName != null)\n      result.chargingBundleName = chargingBundleName;\n    if (cfgPreviewEndToastCountdown != null)\n      result.cfgPreviewEndToastCountdown = cfgPreviewEndToastCountdown;\n    if (cfgNormalInlineToastDuration != null)\n      result.cfgNormalInlineToastDuration = cfgNormalInlineToastDuration;\n    if (videoBottomTextUpper != null)\n      result.videoBottomTextUpper = videoBottomTextUpper;\n    if (videoBottomTextLower != null)\n      result.videoBottomTextLower = videoBottomTextLower;\n    if (archiveCover != null) result.archiveCover = archiveCover;\n    if (archiveTitle != null) result.archiveTitle = archiveTitle;\n    if (actBtn != null) result.actBtn = actBtn;\n    if (textNormalInlineToast != null)\n      result.textNormalInlineToast = textNormalInlineToast;\n    if (textAppendPreviewEndToast != null)\n      result.textAppendPreviewEndToast = textAppendPreviewEndToast;\n    return result;\n  }\n\n  MdlDynChargingArchive._();\n\n  factory MdlDynChargingArchive.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MdlDynChargingArchive.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MdlDynChargingArchive',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<MdlDynArchive>(1, _omitFieldNames ? '' : 'archiveInfo',\n        subBuilder: MdlDynArchive.create)\n    ..aOB(2, _omitFieldNames ? '' : 'hasPermission')\n    ..aOB(3, _omitFieldNames ? '' : 'canInline')\n    ..aOS(4, _omitFieldNames ? '' : 'chargingBundleName')\n    ..aInt64(5, _omitFieldNames ? '' : 'cfgPreviewEndToastCountdown')\n    ..aInt64(6, _omitFieldNames ? '' : 'cfgNormalInlineToastDuration')\n    ..aOM<OneLineText>(7, _omitFieldNames ? '' : 'videoBottomTextUpper',\n        subBuilder: OneLineText.create)\n    ..aOM<OneLineText>(8, _omitFieldNames ? '' : 'videoBottomTextLower',\n        subBuilder: OneLineText.create)\n    ..aOS(9, _omitFieldNames ? '' : 'archiveCover')\n    ..aOS(10, _omitFieldNames ? '' : 'archiveTitle')\n    ..aOM<IconButton>(11, _omitFieldNames ? '' : 'actBtn',\n        subBuilder: IconButton.create)\n    ..aOM<OneLineText>(12, _omitFieldNames ? '' : 'textNormalInlineToast',\n        subBuilder: OneLineText.create)\n    ..aOM<OneLineText>(13, _omitFieldNames ? '' : 'textAppendPreviewEndToast',\n        subBuilder: OneLineText.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynChargingArchive clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynChargingArchive copyWith(\n          void Function(MdlDynChargingArchive) updates) =>\n      super.copyWith((message) => updates(message as MdlDynChargingArchive))\n          as MdlDynChargingArchive;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MdlDynChargingArchive create() => MdlDynChargingArchive._();\n  @$core.override\n  MdlDynChargingArchive createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MdlDynChargingArchive getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MdlDynChargingArchive>(create);\n  static MdlDynChargingArchive? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  MdlDynArchive get archiveInfo => $_getN(0);\n  @$pb.TagNumber(1)\n  set archiveInfo(MdlDynArchive value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasArchiveInfo() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearArchiveInfo() => $_clearField(1);\n  @$pb.TagNumber(1)\n  MdlDynArchive ensureArchiveInfo() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.bool get hasPermission => $_getBF(1);\n  @$pb.TagNumber(2)\n  set hasPermission($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHasPermission() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHasPermission() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get canInline => $_getBF(2);\n  @$pb.TagNumber(3)\n  set canInline($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCanInline() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCanInline() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get chargingBundleName => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set chargingBundleName($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasChargingBundleName() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearChargingBundleName() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get cfgPreviewEndToastCountdown => $_getI64(4);\n  @$pb.TagNumber(5)\n  set cfgPreviewEndToastCountdown($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCfgPreviewEndToastCountdown() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCfgPreviewEndToastCountdown() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get cfgNormalInlineToastDuration => $_getI64(5);\n  @$pb.TagNumber(6)\n  set cfgNormalInlineToastDuration($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCfgNormalInlineToastDuration() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCfgNormalInlineToastDuration() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  OneLineText get videoBottomTextUpper => $_getN(6);\n  @$pb.TagNumber(7)\n  set videoBottomTextUpper(OneLineText value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasVideoBottomTextUpper() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearVideoBottomTextUpper() => $_clearField(7);\n  @$pb.TagNumber(7)\n  OneLineText ensureVideoBottomTextUpper() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  OneLineText get videoBottomTextLower => $_getN(7);\n  @$pb.TagNumber(8)\n  set videoBottomTextLower(OneLineText value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasVideoBottomTextLower() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearVideoBottomTextLower() => $_clearField(8);\n  @$pb.TagNumber(8)\n  OneLineText ensureVideoBottomTextLower() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  $core.String get archiveCover => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set archiveCover($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasArchiveCover() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearArchiveCover() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get archiveTitle => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set archiveTitle($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasArchiveTitle() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearArchiveTitle() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  IconButton get actBtn => $_getN(10);\n  @$pb.TagNumber(11)\n  set actBtn(IconButton value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasActBtn() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearActBtn() => $_clearField(11);\n  @$pb.TagNumber(11)\n  IconButton ensureActBtn() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  OneLineText get textNormalInlineToast => $_getN(11);\n  @$pb.TagNumber(12)\n  set textNormalInlineToast(OneLineText value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasTextNormalInlineToast() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearTextNormalInlineToast() => $_clearField(12);\n  @$pb.TagNumber(12)\n  OneLineText ensureTextNormalInlineToast() => $_ensure(11);\n\n  @$pb.TagNumber(13)\n  OneLineText get textAppendPreviewEndToast => $_getN(12);\n  @$pb.TagNumber(13)\n  set textAppendPreviewEndToast(OneLineText value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasTextAppendPreviewEndToast() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearTextAppendPreviewEndToast() => $_clearField(13);\n  @$pb.TagNumber(13)\n  OneLineText ensureTextAppendPreviewEndToast() => $_ensure(12);\n}\n\nclass MdlDynCommon extends $pb.GeneratedMessage {\n  factory MdlDynCommon({\n    $fixnum.Int64? oid,\n    $core.String? uri,\n    $core.String? title,\n    $core.String? desc,\n    $core.String? cover,\n    $core.String? label,\n    $core.int? bizType,\n    $fixnum.Int64? sketchID,\n    MdlDynCommonType? style,\n    $core.Iterable<VideoBadge>? badge,\n    AdditionalButton? button,\n  }) {\n    final result = create();\n    if (oid != null) result.oid = oid;\n    if (uri != null) result.uri = uri;\n    if (title != null) result.title = title;\n    if (desc != null) result.desc = desc;\n    if (cover != null) result.cover = cover;\n    if (label != null) result.label = label;\n    if (bizType != null) result.bizType = bizType;\n    if (sketchID != null) result.sketchID = sketchID;\n    if (style != null) result.style = style;\n    if (badge != null) result.badge.addAll(badge);\n    if (button != null) result.button = button;\n    return result;\n  }\n\n  MdlDynCommon._();\n\n  factory MdlDynCommon.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MdlDynCommon.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MdlDynCommon',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'oid')\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..aOS(3, _omitFieldNames ? '' : 'title')\n    ..aOS(4, _omitFieldNames ? '' : 'desc')\n    ..aOS(5, _omitFieldNames ? '' : 'cover')\n    ..aOS(6, _omitFieldNames ? '' : 'label')\n    ..aI(7, _omitFieldNames ? '' : 'bizType')\n    ..aInt64(8, _omitFieldNames ? '' : 'sketchID')\n    ..aE<MdlDynCommonType>(9, _omitFieldNames ? '' : 'style',\n        enumValues: MdlDynCommonType.values)\n    ..pPM<VideoBadge>(10, _omitFieldNames ? '' : 'badge',\n        subBuilder: VideoBadge.create)\n    ..aOM<AdditionalButton>(11, _omitFieldNames ? '' : 'button',\n        subBuilder: AdditionalButton.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynCommon clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynCommon copyWith(void Function(MdlDynCommon) updates) =>\n      super.copyWith((message) => updates(message as MdlDynCommon))\n          as MdlDynCommon;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MdlDynCommon create() => MdlDynCommon._();\n  @$core.override\n  MdlDynCommon createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MdlDynCommon getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MdlDynCommon>(create);\n  static MdlDynCommon? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get oid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set oid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get title => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set title($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get desc => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set desc($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDesc() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDesc() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get cover => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set cover($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCover() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCover() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get label => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set label($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasLabel() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearLabel() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get bizType => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set bizType($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBizType() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBizType() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get sketchID => $_getI64(7);\n  @$pb.TagNumber(8)\n  set sketchID($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasSketchID() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearSketchID() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  MdlDynCommonType get style => $_getN(8);\n  @$pb.TagNumber(9)\n  set style(MdlDynCommonType value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasStyle() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearStyle() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $pb.PbList<VideoBadge> get badge => $_getList(9);\n\n  @$pb.TagNumber(11)\n  AdditionalButton get button => $_getN(10);\n  @$pb.TagNumber(11)\n  set button(AdditionalButton value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasButton() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearButton() => $_clearField(11);\n  @$pb.TagNumber(11)\n  AdditionalButton ensureButton() => $_ensure(10);\n}\n\nclass MdlDynCourBatch extends $pb.GeneratedMessage {\n  factory MdlDynCourBatch({\n    $core.String? title,\n    $core.String? cover,\n    $core.String? uri,\n    $core.String? text1,\n    $core.String? text2,\n    VideoBadge? badge,\n    $core.String? playIcon,\n    $core.bool? canPlay,\n    $core.bool? isPreview,\n    $core.String? coverLeftText1,\n    $core.String? coverLeftText2,\n    $core.String? coverLeftText3,\n    $fixnum.Int64? avid,\n    $fixnum.Int64? cid,\n    $fixnum.Int64? epid,\n    $fixnum.Int64? duration,\n    $fixnum.Int64? seasonId,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (uri != null) result.uri = uri;\n    if (text1 != null) result.text1 = text1;\n    if (text2 != null) result.text2 = text2;\n    if (badge != null) result.badge = badge;\n    if (playIcon != null) result.playIcon = playIcon;\n    if (canPlay != null) result.canPlay = canPlay;\n    if (isPreview != null) result.isPreview = isPreview;\n    if (coverLeftText1 != null) result.coverLeftText1 = coverLeftText1;\n    if (coverLeftText2 != null) result.coverLeftText2 = coverLeftText2;\n    if (coverLeftText3 != null) result.coverLeftText3 = coverLeftText3;\n    if (avid != null) result.avid = avid;\n    if (cid != null) result.cid = cid;\n    if (epid != null) result.epid = epid;\n    if (duration != null) result.duration = duration;\n    if (seasonId != null) result.seasonId = seasonId;\n    return result;\n  }\n\n  MdlDynCourBatch._();\n\n  factory MdlDynCourBatch.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MdlDynCourBatch.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MdlDynCourBatch',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'cover')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..aOS(4, _omitFieldNames ? '' : 'text1')\n    ..aOS(5, _omitFieldNames ? '' : 'text2')\n    ..aOM<VideoBadge>(6, _omitFieldNames ? '' : 'badge',\n        subBuilder: VideoBadge.create)\n    ..aOS(7, _omitFieldNames ? '' : 'playIcon')\n    ..aOB(8, _omitFieldNames ? '' : 'canPlay')\n    ..aOB(9, _omitFieldNames ? '' : 'isPreview')\n    ..aOS(10, _omitFieldNames ? '' : 'coverLeftText1')\n    ..aOS(11, _omitFieldNames ? '' : 'coverLeftText2')\n    ..aOS(12, _omitFieldNames ? '' : 'coverLeftText3')\n    ..aInt64(13, _omitFieldNames ? '' : 'avid')\n    ..aInt64(14, _omitFieldNames ? '' : 'cid')\n    ..aInt64(15, _omitFieldNames ? '' : 'epid')\n    ..aInt64(16, _omitFieldNames ? '' : 'duration')\n    ..aInt64(17, _omitFieldNames ? '' : 'seasonId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynCourBatch clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynCourBatch copyWith(void Function(MdlDynCourBatch) updates) =>\n      super.copyWith((message) => updates(message as MdlDynCourBatch))\n          as MdlDynCourBatch;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MdlDynCourBatch create() => MdlDynCourBatch._();\n  @$core.override\n  MdlDynCourBatch createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MdlDynCourBatch getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MdlDynCourBatch>(create);\n  static MdlDynCourBatch? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get cover => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cover($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCover() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCover() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get text1 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set text1($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasText1() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearText1() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get text2 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set text2($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasText2() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearText2() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  VideoBadge get badge => $_getN(5);\n  @$pb.TagNumber(6)\n  set badge(VideoBadge value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasBadge() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearBadge() => $_clearField(6);\n  @$pb.TagNumber(6)\n  VideoBadge ensureBadge() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $core.String get playIcon => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set playIcon($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasPlayIcon() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearPlayIcon() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.bool get canPlay => $_getBF(7);\n  @$pb.TagNumber(8)\n  set canPlay($core.bool value) => $_setBool(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasCanPlay() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearCanPlay() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.bool get isPreview => $_getBF(8);\n  @$pb.TagNumber(9)\n  set isPreview($core.bool value) => $_setBool(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasIsPreview() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearIsPreview() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get coverLeftText1 => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set coverLeftText1($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasCoverLeftText1() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearCoverLeftText1() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get coverLeftText2 => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set coverLeftText2($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasCoverLeftText2() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearCoverLeftText2() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get coverLeftText3 => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set coverLeftText3($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasCoverLeftText3() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearCoverLeftText3() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $fixnum.Int64 get avid => $_getI64(12);\n  @$pb.TagNumber(13)\n  set avid($fixnum.Int64 value) => $_setInt64(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasAvid() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearAvid() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $fixnum.Int64 get cid => $_getI64(13);\n  @$pb.TagNumber(14)\n  set cid($fixnum.Int64 value) => $_setInt64(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasCid() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearCid() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $fixnum.Int64 get epid => $_getI64(14);\n  @$pb.TagNumber(15)\n  set epid($fixnum.Int64 value) => $_setInt64(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasEpid() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearEpid() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $fixnum.Int64 get duration => $_getI64(15);\n  @$pb.TagNumber(16)\n  set duration($fixnum.Int64 value) => $_setInt64(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasDuration() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearDuration() => $_clearField(16);\n\n  @$pb.TagNumber(17)\n  $fixnum.Int64 get seasonId => $_getI64(16);\n  @$pb.TagNumber(17)\n  set seasonId($fixnum.Int64 value) => $_setInt64(16, value);\n  @$pb.TagNumber(17)\n  $core.bool hasSeasonId() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearSeasonId() => $_clearField(17);\n}\n\nclass MdlDynCourSeason extends $pb.GeneratedMessage {\n  factory MdlDynCourSeason({\n    $core.String? title,\n    $core.String? cover,\n    $core.String? uri,\n    $core.String? text1,\n    $core.String? desc,\n    VideoBadge? badge,\n    $core.String? playIcon,\n    $core.bool? canPlay,\n    $core.bool? isPreview,\n    $fixnum.Int64? avid,\n    $fixnum.Int64? cid,\n    $fixnum.Int64? epid,\n    $fixnum.Int64? duration,\n    $fixnum.Int64? seasonId,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (uri != null) result.uri = uri;\n    if (text1 != null) result.text1 = text1;\n    if (desc != null) result.desc = desc;\n    if (badge != null) result.badge = badge;\n    if (playIcon != null) result.playIcon = playIcon;\n    if (canPlay != null) result.canPlay = canPlay;\n    if (isPreview != null) result.isPreview = isPreview;\n    if (avid != null) result.avid = avid;\n    if (cid != null) result.cid = cid;\n    if (epid != null) result.epid = epid;\n    if (duration != null) result.duration = duration;\n    if (seasonId != null) result.seasonId = seasonId;\n    return result;\n  }\n\n  MdlDynCourSeason._();\n\n  factory MdlDynCourSeason.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MdlDynCourSeason.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MdlDynCourSeason',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'cover')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..aOS(4, _omitFieldNames ? '' : 'text1')\n    ..aOS(5, _omitFieldNames ? '' : 'desc')\n    ..aOM<VideoBadge>(6, _omitFieldNames ? '' : 'badge',\n        subBuilder: VideoBadge.create)\n    ..aOS(7, _omitFieldNames ? '' : 'playIcon')\n    ..aOB(8, _omitFieldNames ? '' : 'canPlay')\n    ..aOB(9, _omitFieldNames ? '' : 'isPreview')\n    ..aInt64(10, _omitFieldNames ? '' : 'avid')\n    ..aInt64(11, _omitFieldNames ? '' : 'cid')\n    ..aInt64(12, _omitFieldNames ? '' : 'epid')\n    ..aInt64(13, _omitFieldNames ? '' : 'duration')\n    ..aInt64(14, _omitFieldNames ? '' : 'seasonId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynCourSeason clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynCourSeason copyWith(void Function(MdlDynCourSeason) updates) =>\n      super.copyWith((message) => updates(message as MdlDynCourSeason))\n          as MdlDynCourSeason;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MdlDynCourSeason create() => MdlDynCourSeason._();\n  @$core.override\n  MdlDynCourSeason createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MdlDynCourSeason getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MdlDynCourSeason>(create);\n  static MdlDynCourSeason? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get cover => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cover($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCover() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCover() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get text1 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set text1($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasText1() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearText1() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get desc => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set desc($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDesc() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDesc() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  VideoBadge get badge => $_getN(5);\n  @$pb.TagNumber(6)\n  set badge(VideoBadge value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasBadge() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearBadge() => $_clearField(6);\n  @$pb.TagNumber(6)\n  VideoBadge ensureBadge() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $core.String get playIcon => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set playIcon($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasPlayIcon() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearPlayIcon() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.bool get canPlay => $_getBF(7);\n  @$pb.TagNumber(8)\n  set canPlay($core.bool value) => $_setBool(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasCanPlay() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearCanPlay() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.bool get isPreview => $_getBF(8);\n  @$pb.TagNumber(9)\n  set isPreview($core.bool value) => $_setBool(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasIsPreview() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearIsPreview() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $fixnum.Int64 get avid => $_getI64(9);\n  @$pb.TagNumber(10)\n  set avid($fixnum.Int64 value) => $_setInt64(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasAvid() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearAvid() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $fixnum.Int64 get cid => $_getI64(10);\n  @$pb.TagNumber(11)\n  set cid($fixnum.Int64 value) => $_setInt64(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasCid() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearCid() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $fixnum.Int64 get epid => $_getI64(11);\n  @$pb.TagNumber(12)\n  set epid($fixnum.Int64 value) => $_setInt64(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasEpid() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearEpid() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $fixnum.Int64 get duration => $_getI64(12);\n  @$pb.TagNumber(13)\n  set duration($fixnum.Int64 value) => $_setInt64(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasDuration() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearDuration() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $fixnum.Int64 get seasonId => $_getI64(13);\n  @$pb.TagNumber(14)\n  set seasonId($fixnum.Int64 value) => $_setInt64(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasSeasonId() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearSeasonId() => $_clearField(14);\n}\n\nclass MdlDynCourUp extends $pb.GeneratedMessage {\n  factory MdlDynCourUp({\n    $core.String? title,\n    $core.String? desc,\n    $core.String? cover,\n    $core.String? uri,\n    $core.String? text1,\n    VideoBadge? badge,\n    $core.String? playIcon,\n    $core.bool? canPlay,\n    $core.bool? isPreview,\n    $fixnum.Int64? avid,\n    $fixnum.Int64? cid,\n    $fixnum.Int64? epid,\n    $fixnum.Int64? duration,\n    $fixnum.Int64? seasonId,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (desc != null) result.desc = desc;\n    if (cover != null) result.cover = cover;\n    if (uri != null) result.uri = uri;\n    if (text1 != null) result.text1 = text1;\n    if (badge != null) result.badge = badge;\n    if (playIcon != null) result.playIcon = playIcon;\n    if (canPlay != null) result.canPlay = canPlay;\n    if (isPreview != null) result.isPreview = isPreview;\n    if (avid != null) result.avid = avid;\n    if (cid != null) result.cid = cid;\n    if (epid != null) result.epid = epid;\n    if (duration != null) result.duration = duration;\n    if (seasonId != null) result.seasonId = seasonId;\n    return result;\n  }\n\n  MdlDynCourUp._();\n\n  factory MdlDynCourUp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MdlDynCourUp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MdlDynCourUp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'desc')\n    ..aOS(3, _omitFieldNames ? '' : 'cover')\n    ..aOS(4, _omitFieldNames ? '' : 'uri')\n    ..aOS(5, _omitFieldNames ? '' : 'text1')\n    ..aOM<VideoBadge>(6, _omitFieldNames ? '' : 'badge',\n        subBuilder: VideoBadge.create)\n    ..aOS(7, _omitFieldNames ? '' : 'playIcon')\n    ..aOB(8, _omitFieldNames ? '' : 'canPlay')\n    ..aOB(9, _omitFieldNames ? '' : 'isPreview')\n    ..aInt64(10, _omitFieldNames ? '' : 'avid')\n    ..aInt64(11, _omitFieldNames ? '' : 'cid')\n    ..aInt64(12, _omitFieldNames ? '' : 'epid')\n    ..aInt64(13, _omitFieldNames ? '' : 'duration')\n    ..aInt64(14, _omitFieldNames ? '' : 'seasonId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynCourUp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynCourUp copyWith(void Function(MdlDynCourUp) updates) =>\n      super.copyWith((message) => updates(message as MdlDynCourUp))\n          as MdlDynCourUp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MdlDynCourUp create() => MdlDynCourUp._();\n  @$core.override\n  MdlDynCourUp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MdlDynCourUp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MdlDynCourUp>(create);\n  static MdlDynCourUp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get desc => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set desc($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDesc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDesc() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get cover => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set cover($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCover() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCover() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get uri => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set uri($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUri() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUri() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get text1 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set text1($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasText1() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearText1() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  VideoBadge get badge => $_getN(5);\n  @$pb.TagNumber(6)\n  set badge(VideoBadge value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasBadge() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearBadge() => $_clearField(6);\n  @$pb.TagNumber(6)\n  VideoBadge ensureBadge() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $core.String get playIcon => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set playIcon($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasPlayIcon() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearPlayIcon() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.bool get canPlay => $_getBF(7);\n  @$pb.TagNumber(8)\n  set canPlay($core.bool value) => $_setBool(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasCanPlay() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearCanPlay() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.bool get isPreview => $_getBF(8);\n  @$pb.TagNumber(9)\n  set isPreview($core.bool value) => $_setBool(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasIsPreview() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearIsPreview() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $fixnum.Int64 get avid => $_getI64(9);\n  @$pb.TagNumber(10)\n  set avid($fixnum.Int64 value) => $_setInt64(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasAvid() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearAvid() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $fixnum.Int64 get cid => $_getI64(10);\n  @$pb.TagNumber(11)\n  set cid($fixnum.Int64 value) => $_setInt64(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasCid() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearCid() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $fixnum.Int64 get epid => $_getI64(11);\n  @$pb.TagNumber(12)\n  set epid($fixnum.Int64 value) => $_setInt64(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasEpid() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearEpid() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $fixnum.Int64 get duration => $_getI64(12);\n  @$pb.TagNumber(13)\n  set duration($fixnum.Int64 value) => $_setInt64(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasDuration() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearDuration() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $fixnum.Int64 get seasonId => $_getI64(13);\n  @$pb.TagNumber(14)\n  set seasonId($fixnum.Int64 value) => $_setInt64(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasSeasonId() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearSeasonId() => $_clearField(14);\n}\n\nclass MdlDynDraw extends $pb.GeneratedMessage {\n  factory MdlDynDraw({\n    $core.Iterable<MdlDynDrawItem>? items,\n    $core.String? uri,\n    $fixnum.Int64? id,\n    $core.bool? isDrawFirst,\n    $core.bool? isBigCover,\n    $core.bool? isArticleCover,\n    $core.bool? unfoldAll,\n  }) {\n    final result = create();\n    if (items != null) result.items.addAll(items);\n    if (uri != null) result.uri = uri;\n    if (id != null) result.id = id;\n    if (isDrawFirst != null) result.isDrawFirst = isDrawFirst;\n    if (isBigCover != null) result.isBigCover = isBigCover;\n    if (isArticleCover != null) result.isArticleCover = isArticleCover;\n    if (unfoldAll != null) result.unfoldAll = unfoldAll;\n    return result;\n  }\n\n  MdlDynDraw._();\n\n  factory MdlDynDraw.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MdlDynDraw.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MdlDynDraw',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<MdlDynDrawItem>(1, _omitFieldNames ? '' : 'items',\n        subBuilder: MdlDynDrawItem.create)\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..aInt64(3, _omitFieldNames ? '' : 'id')\n    ..aOB(4, _omitFieldNames ? '' : 'isDrawFirst')\n    ..aOB(5, _omitFieldNames ? '' : 'isBigCover')\n    ..aOB(6, _omitFieldNames ? '' : 'isArticleCover')\n    ..aOB(7, _omitFieldNames ? '' : 'unfoldAll')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynDraw clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynDraw copyWith(void Function(MdlDynDraw) updates) =>\n      super.copyWith((message) => updates(message as MdlDynDraw)) as MdlDynDraw;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MdlDynDraw create() => MdlDynDraw._();\n  @$core.override\n  MdlDynDraw createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MdlDynDraw getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MdlDynDraw>(create);\n  static MdlDynDraw? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<MdlDynDrawItem> get items => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get id => $_getI64(2);\n  @$pb.TagNumber(3)\n  set id($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearId() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get isDrawFirst => $_getBF(3);\n  @$pb.TagNumber(4)\n  set isDrawFirst($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIsDrawFirst() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIsDrawFirst() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.bool get isBigCover => $_getBF(4);\n  @$pb.TagNumber(5)\n  set isBigCover($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasIsBigCover() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearIsBigCover() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.bool get isArticleCover => $_getBF(5);\n  @$pb.TagNumber(6)\n  set isArticleCover($core.bool value) => $_setBool(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasIsArticleCover() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearIsArticleCover() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.bool get unfoldAll => $_getBF(6);\n  @$pb.TagNumber(7)\n  set unfoldAll($core.bool value) => $_setBool(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasUnfoldAll() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearUnfoldAll() => $_clearField(7);\n}\n\nclass MdlDynDrawItem extends $pb.GeneratedMessage {\n  factory MdlDynDrawItem({\n    $core.String? src,\n    $fixnum.Int64? width,\n    $fixnum.Int64? height,\n    $core.double? size,\n    $core.Iterable<MdlDynDrawTag>? tags,\n    $core.String? srcDark,\n    $core.bool? isLivePhoto,\n    $core.String? liveVideoUrl,\n    $core.double? liveVideoSize,\n  }) {\n    final result = create();\n    if (src != null) result.src = src;\n    if (width != null) result.width = width;\n    if (height != null) result.height = height;\n    if (size != null) result.size = size;\n    if (tags != null) result.tags.addAll(tags);\n    if (srcDark != null) result.srcDark = srcDark;\n    if (isLivePhoto != null) result.isLivePhoto = isLivePhoto;\n    if (liveVideoUrl != null) result.liveVideoUrl = liveVideoUrl;\n    if (liveVideoSize != null) result.liveVideoSize = liveVideoSize;\n    return result;\n  }\n\n  MdlDynDrawItem._();\n\n  factory MdlDynDrawItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MdlDynDrawItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MdlDynDrawItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'src')\n    ..aInt64(2, _omitFieldNames ? '' : 'width')\n    ..aInt64(3, _omitFieldNames ? '' : 'height')\n    ..aD(4, _omitFieldNames ? '' : 'size', fieldType: $pb.PbFieldType.OF)\n    ..pPM<MdlDynDrawTag>(5, _omitFieldNames ? '' : 'tags',\n        subBuilder: MdlDynDrawTag.create)\n    ..aOS(6, _omitFieldNames ? '' : 'srcDark')\n    ..aOB(7, _omitFieldNames ? '' : 'isLivePhoto')\n    ..aOS(8, _omitFieldNames ? '' : 'liveVideoUrl')\n    ..aD(9, _omitFieldNames ? '' : 'liveVideoSize')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynDrawItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynDrawItem copyWith(void Function(MdlDynDrawItem) updates) =>\n      super.copyWith((message) => updates(message as MdlDynDrawItem))\n          as MdlDynDrawItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MdlDynDrawItem create() => MdlDynDrawItem._();\n  @$core.override\n  MdlDynDrawItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MdlDynDrawItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MdlDynDrawItem>(create);\n  static MdlDynDrawItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get src => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set src($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSrc() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSrc() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get width => $_getI64(1);\n  @$pb.TagNumber(2)\n  set width($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasWidth() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearWidth() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get height => $_getI64(2);\n  @$pb.TagNumber(3)\n  set height($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasHeight() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearHeight() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.double get size => $_getN(3);\n  @$pb.TagNumber(4)\n  set size($core.double value) => $_setFloat(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSize() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSize() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $pb.PbList<MdlDynDrawTag> get tags => $_getList(4);\n\n  @$pb.TagNumber(6)\n  $core.String get srcDark => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set srcDark($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasSrcDark() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearSrcDark() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.bool get isLivePhoto => $_getBF(6);\n  @$pb.TagNumber(7)\n  set isLivePhoto($core.bool value) => $_setBool(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasIsLivePhoto() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearIsLivePhoto() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get liveVideoUrl => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set liveVideoUrl($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasLiveVideoUrl() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearLiveVideoUrl() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.double get liveVideoSize => $_getN(8);\n  @$pb.TagNumber(9)\n  set liveVideoSize($core.double value) => $_setDouble(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasLiveVideoSize() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearLiveVideoSize() => $_clearField(9);\n}\n\nclass MdlDynDrawTag extends $pb.GeneratedMessage {\n  factory MdlDynDrawTag({\n    MdlDynDrawTagType? type,\n    MdlDynDrawTagItem? item,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (item != null) result.item = item;\n    return result;\n  }\n\n  MdlDynDrawTag._();\n\n  factory MdlDynDrawTag.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MdlDynDrawTag.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MdlDynDrawTag',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aE<MdlDynDrawTagType>(1, _omitFieldNames ? '' : 'type',\n        enumValues: MdlDynDrawTagType.values)\n    ..aOM<MdlDynDrawTagItem>(2, _omitFieldNames ? '' : 'item',\n        subBuilder: MdlDynDrawTagItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynDrawTag clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynDrawTag copyWith(void Function(MdlDynDrawTag) updates) =>\n      super.copyWith((message) => updates(message as MdlDynDrawTag))\n          as MdlDynDrawTag;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MdlDynDrawTag create() => MdlDynDrawTag._();\n  @$core.override\n  MdlDynDrawTag createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MdlDynDrawTag getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MdlDynDrawTag>(create);\n  static MdlDynDrawTag? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  MdlDynDrawTagType get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(MdlDynDrawTagType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  MdlDynDrawTagItem get item => $_getN(1);\n  @$pb.TagNumber(2)\n  set item(MdlDynDrawTagItem value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasItem() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearItem() => $_clearField(2);\n  @$pb.TagNumber(2)\n  MdlDynDrawTagItem ensureItem() => $_ensure(1);\n}\n\nclass MdlDynDrawTagItem extends $pb.GeneratedMessage {\n  factory MdlDynDrawTagItem({\n    $core.String? url,\n    $core.String? text,\n    $fixnum.Int64? x,\n    $fixnum.Int64? y,\n    $core.int? orientation,\n    $core.int? source,\n    $fixnum.Int64? itemId,\n    $fixnum.Int64? mid,\n    $fixnum.Int64? tid,\n    $core.String? poi,\n    $core.String? schemaUrl,\n  }) {\n    final result = create();\n    if (url != null) result.url = url;\n    if (text != null) result.text = text;\n    if (x != null) result.x = x;\n    if (y != null) result.y = y;\n    if (orientation != null) result.orientation = orientation;\n    if (source != null) result.source = source;\n    if (itemId != null) result.itemId = itemId;\n    if (mid != null) result.mid = mid;\n    if (tid != null) result.tid = tid;\n    if (poi != null) result.poi = poi;\n    if (schemaUrl != null) result.schemaUrl = schemaUrl;\n    return result;\n  }\n\n  MdlDynDrawTagItem._();\n\n  factory MdlDynDrawTagItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MdlDynDrawTagItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MdlDynDrawTagItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'url')\n    ..aOS(2, _omitFieldNames ? '' : 'text')\n    ..aInt64(3, _omitFieldNames ? '' : 'x')\n    ..aInt64(4, _omitFieldNames ? '' : 'y')\n    ..aI(5, _omitFieldNames ? '' : 'orientation')\n    ..aI(6, _omitFieldNames ? '' : 'source')\n    ..aInt64(7, _omitFieldNames ? '' : 'itemId')\n    ..aInt64(8, _omitFieldNames ? '' : 'mid')\n    ..aInt64(9, _omitFieldNames ? '' : 'tid')\n    ..aOS(10, _omitFieldNames ? '' : 'poi')\n    ..aOS(11, _omitFieldNames ? '' : 'schemaUrl')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynDrawTagItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynDrawTagItem copyWith(void Function(MdlDynDrawTagItem) updates) =>\n      super.copyWith((message) => updates(message as MdlDynDrawTagItem))\n          as MdlDynDrawTagItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MdlDynDrawTagItem create() => MdlDynDrawTagItem._();\n  @$core.override\n  MdlDynDrawTagItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MdlDynDrawTagItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MdlDynDrawTagItem>(create);\n  static MdlDynDrawTagItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get url => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set url($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUrl() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get x => $_getI64(2);\n  @$pb.TagNumber(3)\n  set x($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasX() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearX() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get y => $_getI64(3);\n  @$pb.TagNumber(4)\n  set y($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasY() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearY() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get orientation => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set orientation($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasOrientation() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearOrientation() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get source => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set source($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasSource() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearSource() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get itemId => $_getI64(6);\n  @$pb.TagNumber(7)\n  set itemId($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasItemId() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearItemId() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get mid => $_getI64(7);\n  @$pb.TagNumber(8)\n  set mid($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasMid() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearMid() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get tid => $_getI64(8);\n  @$pb.TagNumber(9)\n  set tid($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasTid() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearTid() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get poi => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set poi($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasPoi() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearPoi() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get schemaUrl => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set schemaUrl($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasSchemaUrl() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearSchemaUrl() => $_clearField(11);\n}\n\nclass MdlDynForward extends $pb.GeneratedMessage {\n  factory MdlDynForward({\n    DynamicItem? item,\n    $core.int? rtype,\n  }) {\n    final result = create();\n    if (item != null) result.item = item;\n    if (rtype != null) result.rtype = rtype;\n    return result;\n  }\n\n  MdlDynForward._();\n\n  factory MdlDynForward.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MdlDynForward.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MdlDynForward',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<DynamicItem>(1, _omitFieldNames ? '' : 'item',\n        subBuilder: DynamicItem.create)\n    ..aI(2, _omitFieldNames ? '' : 'rtype')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynForward clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynForward copyWith(void Function(MdlDynForward) updates) =>\n      super.copyWith((message) => updates(message as MdlDynForward))\n          as MdlDynForward;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MdlDynForward create() => MdlDynForward._();\n  @$core.override\n  MdlDynForward createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MdlDynForward getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MdlDynForward>(create);\n  static MdlDynForward? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  DynamicItem get item => $_getN(0);\n  @$pb.TagNumber(1)\n  set item(DynamicItem value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasItem() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearItem() => $_clearField(1);\n  @$pb.TagNumber(1)\n  DynamicItem ensureItem() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.int get rtype => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set rtype($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasRtype() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRtype() => $_clearField(2);\n}\n\nclass MdlDynLive extends $pb.GeneratedMessage {\n  factory MdlDynLive({\n    $fixnum.Int64? id,\n    $core.String? uri,\n    $core.String? title,\n    $core.String? cover,\n    $core.String? coverLabel,\n    $core.String? coverLabel2,\n    LiveState? liveState,\n    VideoBadge? badge,\n    ReserveType? reserveType,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (uri != null) result.uri = uri;\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (coverLabel != null) result.coverLabel = coverLabel;\n    if (coverLabel2 != null) result.coverLabel2 = coverLabel2;\n    if (liveState != null) result.liveState = liveState;\n    if (badge != null) result.badge = badge;\n    if (reserveType != null) result.reserveType = reserveType;\n    return result;\n  }\n\n  MdlDynLive._();\n\n  factory MdlDynLive.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MdlDynLive.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MdlDynLive',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..aOS(3, _omitFieldNames ? '' : 'title')\n    ..aOS(4, _omitFieldNames ? '' : 'cover')\n    ..aOS(5, _omitFieldNames ? '' : 'coverLabel')\n    ..aOS(6, _omitFieldNames ? '' : 'coverLabel2')\n    ..aE<LiveState>(7, _omitFieldNames ? '' : 'liveState',\n        enumValues: LiveState.values)\n    ..aOM<VideoBadge>(8, _omitFieldNames ? '' : 'badge',\n        subBuilder: VideoBadge.create)\n    ..aE<ReserveType>(9, _omitFieldNames ? '' : 'reserveType',\n        enumValues: ReserveType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynLive clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynLive copyWith(void Function(MdlDynLive) updates) =>\n      super.copyWith((message) => updates(message as MdlDynLive)) as MdlDynLive;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MdlDynLive create() => MdlDynLive._();\n  @$core.override\n  MdlDynLive createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MdlDynLive getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MdlDynLive>(create);\n  static MdlDynLive? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get title => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set title($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get cover => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set cover($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCover() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCover() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get coverLabel => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set coverLabel($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCoverLabel() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCoverLabel() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get coverLabel2 => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set coverLabel2($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCoverLabel2() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCoverLabel2() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  LiveState get liveState => $_getN(6);\n  @$pb.TagNumber(7)\n  set liveState(LiveState value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasLiveState() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearLiveState() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  VideoBadge get badge => $_getN(7);\n  @$pb.TagNumber(8)\n  set badge(VideoBadge value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasBadge() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearBadge() => $_clearField(8);\n  @$pb.TagNumber(8)\n  VideoBadge ensureBadge() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  ReserveType get reserveType => $_getN(8);\n  @$pb.TagNumber(9)\n  set reserveType(ReserveType value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasReserveType() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearReserveType() => $_clearField(9);\n}\n\nclass MdlDynLiveRcmd extends $pb.GeneratedMessage {\n  factory MdlDynLiveRcmd({\n    $core.String? content,\n    ReserveType? reserveType,\n    LivePendant? pendant,\n  }) {\n    final result = create();\n    if (content != null) result.content = content;\n    if (reserveType != null) result.reserveType = reserveType;\n    if (pendant != null) result.pendant = pendant;\n    return result;\n  }\n\n  MdlDynLiveRcmd._();\n\n  factory MdlDynLiveRcmd.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MdlDynLiveRcmd.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MdlDynLiveRcmd',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'content')\n    ..aE<ReserveType>(2, _omitFieldNames ? '' : 'reserveType',\n        enumValues: ReserveType.values)\n    ..aOM<LivePendant>(3, _omitFieldNames ? '' : 'pendant',\n        subBuilder: LivePendant.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynLiveRcmd clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynLiveRcmd copyWith(void Function(MdlDynLiveRcmd) updates) =>\n      super.copyWith((message) => updates(message as MdlDynLiveRcmd))\n          as MdlDynLiveRcmd;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MdlDynLiveRcmd create() => MdlDynLiveRcmd._();\n  @$core.override\n  MdlDynLiveRcmd createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MdlDynLiveRcmd getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MdlDynLiveRcmd>(create);\n  static MdlDynLiveRcmd? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get content => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set content($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasContent() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearContent() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  ReserveType get reserveType => $_getN(1);\n  @$pb.TagNumber(2)\n  set reserveType(ReserveType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasReserveType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearReserveType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  LivePendant get pendant => $_getN(2);\n  @$pb.TagNumber(3)\n  set pendant(LivePendant value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPendant() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPendant() => $_clearField(3);\n  @$pb.TagNumber(3)\n  LivePendant ensurePendant() => $_ensure(2);\n}\n\nclass MdlDynMedialist extends $pb.GeneratedMessage {\n  factory MdlDynMedialist({\n    $fixnum.Int64? id,\n    $core.String? uri,\n    $core.String? title,\n    $core.String? subTitle,\n    $core.String? cover,\n    $core.int? coverType,\n    VideoBadge? badge,\n    $core.String? coverBottomRightIcon,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (uri != null) result.uri = uri;\n    if (title != null) result.title = title;\n    if (subTitle != null) result.subTitle = subTitle;\n    if (cover != null) result.cover = cover;\n    if (coverType != null) result.coverType = coverType;\n    if (badge != null) result.badge = badge;\n    if (coverBottomRightIcon != null)\n      result.coverBottomRightIcon = coverBottomRightIcon;\n    return result;\n  }\n\n  MdlDynMedialist._();\n\n  factory MdlDynMedialist.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MdlDynMedialist.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MdlDynMedialist',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..aOS(3, _omitFieldNames ? '' : 'title')\n    ..aOS(4, _omitFieldNames ? '' : 'subTitle')\n    ..aOS(5, _omitFieldNames ? '' : 'cover')\n    ..aI(6, _omitFieldNames ? '' : 'coverType')\n    ..aOM<VideoBadge>(7, _omitFieldNames ? '' : 'badge',\n        subBuilder: VideoBadge.create)\n    ..aOS(8, _omitFieldNames ? '' : 'coverBottomRightIcon')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynMedialist clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynMedialist copyWith(void Function(MdlDynMedialist) updates) =>\n      super.copyWith((message) => updates(message as MdlDynMedialist))\n          as MdlDynMedialist;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MdlDynMedialist create() => MdlDynMedialist._();\n  @$core.override\n  MdlDynMedialist createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MdlDynMedialist getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MdlDynMedialist>(create);\n  static MdlDynMedialist? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get title => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set title($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get subTitle => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set subTitle($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSubTitle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSubTitle() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get cover => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set cover($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCover() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCover() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get coverType => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set coverType($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCoverType() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCoverType() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  VideoBadge get badge => $_getN(6);\n  @$pb.TagNumber(7)\n  set badge(VideoBadge value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBadge() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBadge() => $_clearField(7);\n  @$pb.TagNumber(7)\n  VideoBadge ensureBadge() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  $core.String get coverBottomRightIcon => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set coverBottomRightIcon($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasCoverBottomRightIcon() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearCoverBottomRightIcon() => $_clearField(8);\n}\n\nclass MdlDynMusic extends $pb.GeneratedMessage {\n  factory MdlDynMusic({\n    $fixnum.Int64? id,\n    $core.String? uri,\n    $fixnum.Int64? upId,\n    $core.String? title,\n    $core.String? cover,\n    $core.String? label1,\n    $core.String? upper,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (uri != null) result.uri = uri;\n    if (upId != null) result.upId = upId;\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (label1 != null) result.label1 = label1;\n    if (upper != null) result.upper = upper;\n    return result;\n  }\n\n  MdlDynMusic._();\n\n  factory MdlDynMusic.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MdlDynMusic.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MdlDynMusic',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..aInt64(3, _omitFieldNames ? '' : 'upId')\n    ..aOS(4, _omitFieldNames ? '' : 'title')\n    ..aOS(5, _omitFieldNames ? '' : 'cover')\n    ..aOS(6, _omitFieldNames ? '' : 'label1')\n    ..aOS(7, _omitFieldNames ? '' : 'upper')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynMusic clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynMusic copyWith(void Function(MdlDynMusic) updates) =>\n      super.copyWith((message) => updates(message as MdlDynMusic))\n          as MdlDynMusic;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MdlDynMusic create() => MdlDynMusic._();\n  @$core.override\n  MdlDynMusic createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MdlDynMusic getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MdlDynMusic>(create);\n  static MdlDynMusic? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get upId => $_getI64(2);\n  @$pb.TagNumber(3)\n  set upId($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUpId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUpId() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get title => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set title($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTitle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTitle() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get cover => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set cover($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCover() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCover() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get label1 => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set label1($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasLabel1() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearLabel1() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get upper => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set upper($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasUpper() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearUpper() => $_clearField(7);\n}\n\nclass MdlDynPGC extends $pb.GeneratedMessage {\n  factory MdlDynPGC({\n    $core.String? title,\n    $core.String? cover,\n    $core.String? uri,\n    $core.String? coverLeftText1,\n    $core.String? coverLeftText2,\n    $core.String? coverLeftText3,\n    $fixnum.Int64? cid,\n    $fixnum.Int64? seasonId,\n    $fixnum.Int64? epid,\n    $fixnum.Int64? aid,\n    MediaType? mediaType,\n    VideoSubType? subType,\n    $core.bool? isPreview,\n    Dimension? dimension,\n    $core.Iterable<VideoBadge>? badge,\n    $core.bool? canPlay,\n    PGCSeason? season,\n    $core.String? playIcon,\n    $fixnum.Int64? duration,\n    $core.String? jumpUrl,\n    $core.Iterable<VideoBadge>? badgeCategory,\n    $core.bool? isFeature,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (uri != null) result.uri = uri;\n    if (coverLeftText1 != null) result.coverLeftText1 = coverLeftText1;\n    if (coverLeftText2 != null) result.coverLeftText2 = coverLeftText2;\n    if (coverLeftText3 != null) result.coverLeftText3 = coverLeftText3;\n    if (cid != null) result.cid = cid;\n    if (seasonId != null) result.seasonId = seasonId;\n    if (epid != null) result.epid = epid;\n    if (aid != null) result.aid = aid;\n    if (mediaType != null) result.mediaType = mediaType;\n    if (subType != null) result.subType = subType;\n    if (isPreview != null) result.isPreview = isPreview;\n    if (dimension != null) result.dimension = dimension;\n    if (badge != null) result.badge.addAll(badge);\n    if (canPlay != null) result.canPlay = canPlay;\n    if (season != null) result.season = season;\n    if (playIcon != null) result.playIcon = playIcon;\n    if (duration != null) result.duration = duration;\n    if (jumpUrl != null) result.jumpUrl = jumpUrl;\n    if (badgeCategory != null) result.badgeCategory.addAll(badgeCategory);\n    if (isFeature != null) result.isFeature = isFeature;\n    return result;\n  }\n\n  MdlDynPGC._();\n\n  factory MdlDynPGC.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MdlDynPGC.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MdlDynPGC',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'cover')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..aOS(4, _omitFieldNames ? '' : 'coverLeftText1')\n    ..aOS(5, _omitFieldNames ? '' : 'coverLeftText2')\n    ..aOS(6, _omitFieldNames ? '' : 'coverLeftText3')\n    ..aInt64(7, _omitFieldNames ? '' : 'cid')\n    ..aInt64(8, _omitFieldNames ? '' : 'seasonId')\n    ..aInt64(9, _omitFieldNames ? '' : 'epid')\n    ..aInt64(10, _omitFieldNames ? '' : 'aid')\n    ..aE<MediaType>(11, _omitFieldNames ? '' : 'mediaType',\n        enumValues: MediaType.values)\n    ..aE<VideoSubType>(12, _omitFieldNames ? '' : 'subType',\n        enumValues: VideoSubType.values)\n    ..aOB(13, _omitFieldNames ? '' : 'isPreview')\n    ..aOM<Dimension>(14, _omitFieldNames ? '' : 'dimension',\n        subBuilder: Dimension.create)\n    ..pPM<VideoBadge>(15, _omitFieldNames ? '' : 'badge',\n        subBuilder: VideoBadge.create)\n    ..aOB(16, _omitFieldNames ? '' : 'canPlay')\n    ..aOM<PGCSeason>(17, _omitFieldNames ? '' : 'season',\n        subBuilder: PGCSeason.create)\n    ..aOS(18, _omitFieldNames ? '' : 'playIcon')\n    ..aInt64(19, _omitFieldNames ? '' : 'duration')\n    ..aOS(20, _omitFieldNames ? '' : 'jumpUrl')\n    ..pPM<VideoBadge>(21, _omitFieldNames ? '' : 'badgeCategory',\n        subBuilder: VideoBadge.create)\n    ..aOB(22, _omitFieldNames ? '' : 'isFeature')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynPGC clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynPGC copyWith(void Function(MdlDynPGC) updates) =>\n      super.copyWith((message) => updates(message as MdlDynPGC)) as MdlDynPGC;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MdlDynPGC create() => MdlDynPGC._();\n  @$core.override\n  MdlDynPGC createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MdlDynPGC getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<MdlDynPGC>(create);\n  static MdlDynPGC? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get cover => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cover($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCover() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCover() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get coverLeftText1 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set coverLeftText1($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCoverLeftText1() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCoverLeftText1() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get coverLeftText2 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set coverLeftText2($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCoverLeftText2() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCoverLeftText2() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get coverLeftText3 => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set coverLeftText3($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCoverLeftText3() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCoverLeftText3() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get cid => $_getI64(6);\n  @$pb.TagNumber(7)\n  set cid($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCid() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCid() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get seasonId => $_getI64(7);\n  @$pb.TagNumber(8)\n  set seasonId($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasSeasonId() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearSeasonId() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get epid => $_getI64(8);\n  @$pb.TagNumber(9)\n  set epid($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasEpid() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearEpid() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $fixnum.Int64 get aid => $_getI64(9);\n  @$pb.TagNumber(10)\n  set aid($fixnum.Int64 value) => $_setInt64(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasAid() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearAid() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  MediaType get mediaType => $_getN(10);\n  @$pb.TagNumber(11)\n  set mediaType(MediaType value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasMediaType() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearMediaType() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  VideoSubType get subType => $_getN(11);\n  @$pb.TagNumber(12)\n  set subType(VideoSubType value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasSubType() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearSubType() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.bool get isPreview => $_getBF(12);\n  @$pb.TagNumber(13)\n  set isPreview($core.bool value) => $_setBool(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasIsPreview() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearIsPreview() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  Dimension get dimension => $_getN(13);\n  @$pb.TagNumber(14)\n  set dimension(Dimension value) => $_setField(14, value);\n  @$pb.TagNumber(14)\n  $core.bool hasDimension() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearDimension() => $_clearField(14);\n  @$pb.TagNumber(14)\n  Dimension ensureDimension() => $_ensure(13);\n\n  @$pb.TagNumber(15)\n  $pb.PbList<VideoBadge> get badge => $_getList(14);\n\n  @$pb.TagNumber(16)\n  $core.bool get canPlay => $_getBF(15);\n  @$pb.TagNumber(16)\n  set canPlay($core.bool value) => $_setBool(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasCanPlay() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearCanPlay() => $_clearField(16);\n\n  @$pb.TagNumber(17)\n  PGCSeason get season => $_getN(16);\n  @$pb.TagNumber(17)\n  set season(PGCSeason value) => $_setField(17, value);\n  @$pb.TagNumber(17)\n  $core.bool hasSeason() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearSeason() => $_clearField(17);\n  @$pb.TagNumber(17)\n  PGCSeason ensureSeason() => $_ensure(16);\n\n  @$pb.TagNumber(18)\n  $core.String get playIcon => $_getSZ(17);\n  @$pb.TagNumber(18)\n  set playIcon($core.String value) => $_setString(17, value);\n  @$pb.TagNumber(18)\n  $core.bool hasPlayIcon() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearPlayIcon() => $_clearField(18);\n\n  @$pb.TagNumber(19)\n  $fixnum.Int64 get duration => $_getI64(18);\n  @$pb.TagNumber(19)\n  set duration($fixnum.Int64 value) => $_setInt64(18, value);\n  @$pb.TagNumber(19)\n  $core.bool hasDuration() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearDuration() => $_clearField(19);\n\n  @$pb.TagNumber(20)\n  $core.String get jumpUrl => $_getSZ(19);\n  @$pb.TagNumber(20)\n  set jumpUrl($core.String value) => $_setString(19, value);\n  @$pb.TagNumber(20)\n  $core.bool hasJumpUrl() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearJumpUrl() => $_clearField(20);\n\n  @$pb.TagNumber(21)\n  $pb.PbList<VideoBadge> get badgeCategory => $_getList(20);\n\n  @$pb.TagNumber(22)\n  $core.bool get isFeature => $_getBF(21);\n  @$pb.TagNumber(22)\n  set isFeature($core.bool value) => $_setBool(21, value);\n  @$pb.TagNumber(22)\n  $core.bool hasIsFeature() => $_has(21);\n  @$pb.TagNumber(22)\n  void clearIsFeature() => $_clearField(22);\n}\n\nclass MdlDynShareChargingQA extends $pb.GeneratedMessage {\n  factory MdlDynShareChargingQA({\n    ImageSet? backgroundImg,\n    ImageSet? leftIconImg,\n    $core.String? title,\n    IconButton? jumpButton,\n    $core.String? uri,\n    CommonShareCardInfo? shareCardMetaInfo,\n    $core.String? titlePrefixBold,\n  }) {\n    final result = create();\n    if (backgroundImg != null) result.backgroundImg = backgroundImg;\n    if (leftIconImg != null) result.leftIconImg = leftIconImg;\n    if (title != null) result.title = title;\n    if (jumpButton != null) result.jumpButton = jumpButton;\n    if (uri != null) result.uri = uri;\n    if (shareCardMetaInfo != null) result.shareCardMetaInfo = shareCardMetaInfo;\n    if (titlePrefixBold != null) result.titlePrefixBold = titlePrefixBold;\n    return result;\n  }\n\n  MdlDynShareChargingQA._();\n\n  factory MdlDynShareChargingQA.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MdlDynShareChargingQA.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MdlDynShareChargingQA',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<ImageSet>(1, _omitFieldNames ? '' : 'backgroundImg',\n        subBuilder: ImageSet.create)\n    ..aOM<ImageSet>(2, _omitFieldNames ? '' : 'leftIconImg',\n        subBuilder: ImageSet.create)\n    ..aOS(3, _omitFieldNames ? '' : 'title')\n    ..aOM<IconButton>(4, _omitFieldNames ? '' : 'jumpButton',\n        subBuilder: IconButton.create)\n    ..aOS(5, _omitFieldNames ? '' : 'uri')\n    ..aOM<CommonShareCardInfo>(6, _omitFieldNames ? '' : 'shareCardMetaInfo',\n        subBuilder: CommonShareCardInfo.create)\n    ..aOS(7, _omitFieldNames ? '' : 'titlePrefixBold')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynShareChargingQA clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynShareChargingQA copyWith(\n          void Function(MdlDynShareChargingQA) updates) =>\n      super.copyWith((message) => updates(message as MdlDynShareChargingQA))\n          as MdlDynShareChargingQA;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MdlDynShareChargingQA create() => MdlDynShareChargingQA._();\n  @$core.override\n  MdlDynShareChargingQA createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MdlDynShareChargingQA getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MdlDynShareChargingQA>(create);\n  static MdlDynShareChargingQA? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  ImageSet get backgroundImg => $_getN(0);\n  @$pb.TagNumber(1)\n  set backgroundImg(ImageSet value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBackgroundImg() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBackgroundImg() => $_clearField(1);\n  @$pb.TagNumber(1)\n  ImageSet ensureBackgroundImg() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  ImageSet get leftIconImg => $_getN(1);\n  @$pb.TagNumber(2)\n  set leftIconImg(ImageSet value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLeftIconImg() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLeftIconImg() => $_clearField(2);\n  @$pb.TagNumber(2)\n  ImageSet ensureLeftIconImg() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.String get title => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set title($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  IconButton get jumpButton => $_getN(3);\n  @$pb.TagNumber(4)\n  set jumpButton(IconButton value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasJumpButton() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearJumpButton() => $_clearField(4);\n  @$pb.TagNumber(4)\n  IconButton ensureJumpButton() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.String get uri => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set uri($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasUri() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearUri() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  CommonShareCardInfo get shareCardMetaInfo => $_getN(5);\n  @$pb.TagNumber(6)\n  set shareCardMetaInfo(CommonShareCardInfo value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasShareCardMetaInfo() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearShareCardMetaInfo() => $_clearField(6);\n  @$pb.TagNumber(6)\n  CommonShareCardInfo ensureShareCardMetaInfo() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $core.String get titlePrefixBold => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set titlePrefixBold($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasTitlePrefixBold() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearTitlePrefixBold() => $_clearField(7);\n}\n\nclass MdlDynSubscription extends $pb.GeneratedMessage {\n  factory MdlDynSubscription({\n    $fixnum.Int64? id,\n    $fixnum.Int64? adId,\n    $core.String? uri,\n    $core.String? title,\n    $core.String? cover,\n    $core.String? adTitle,\n    VideoBadge? badge,\n    $core.String? tips,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (adId != null) result.adId = adId;\n    if (uri != null) result.uri = uri;\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (adTitle != null) result.adTitle = adTitle;\n    if (badge != null) result.badge = badge;\n    if (tips != null) result.tips = tips;\n    return result;\n  }\n\n  MdlDynSubscription._();\n\n  factory MdlDynSubscription.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MdlDynSubscription.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MdlDynSubscription',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aInt64(2, _omitFieldNames ? '' : 'adId')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..aOS(4, _omitFieldNames ? '' : 'title')\n    ..aOS(5, _omitFieldNames ? '' : 'cover')\n    ..aOS(6, _omitFieldNames ? '' : 'adTitle')\n    ..aOM<VideoBadge>(7, _omitFieldNames ? '' : 'badge',\n        subBuilder: VideoBadge.create)\n    ..aOS(8, _omitFieldNames ? '' : 'tips')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynSubscription clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynSubscription copyWith(void Function(MdlDynSubscription) updates) =>\n      super.copyWith((message) => updates(message as MdlDynSubscription))\n          as MdlDynSubscription;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MdlDynSubscription create() => MdlDynSubscription._();\n  @$core.override\n  MdlDynSubscription createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MdlDynSubscription getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MdlDynSubscription>(create);\n  static MdlDynSubscription? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get adId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set adId($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAdId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAdId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get title => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set title($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTitle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTitle() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get cover => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set cover($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCover() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCover() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get adTitle => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set adTitle($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasAdTitle() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearAdTitle() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  VideoBadge get badge => $_getN(6);\n  @$pb.TagNumber(7)\n  set badge(VideoBadge value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBadge() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBadge() => $_clearField(7);\n  @$pb.TagNumber(7)\n  VideoBadge ensureBadge() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  $core.String get tips => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set tips($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasTips() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearTips() => $_clearField(8);\n}\n\nenum MdlDynSubscriptionNew_Item { dynSubscription, dynLiveRcmd, notSet }\n\nclass MdlDynSubscriptionNew extends $pb.GeneratedMessage {\n  factory MdlDynSubscriptionNew({\n    MdlDynSubscriptionNewStyle? style,\n    MdlDynSubscription? dynSubscription,\n    MdlDynLiveRcmd? dynLiveRcmd,\n  }) {\n    final result = create();\n    if (style != null) result.style = style;\n    if (dynSubscription != null) result.dynSubscription = dynSubscription;\n    if (dynLiveRcmd != null) result.dynLiveRcmd = dynLiveRcmd;\n    return result;\n  }\n\n  MdlDynSubscriptionNew._();\n\n  factory MdlDynSubscriptionNew.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MdlDynSubscriptionNew.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, MdlDynSubscriptionNew_Item>\n      _MdlDynSubscriptionNew_ItemByTag = {\n    2: MdlDynSubscriptionNew_Item.dynSubscription,\n    3: MdlDynSubscriptionNew_Item.dynLiveRcmd,\n    0: MdlDynSubscriptionNew_Item.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MdlDynSubscriptionNew',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..oo(0, [2, 3])\n    ..aE<MdlDynSubscriptionNewStyle>(1, _omitFieldNames ? '' : 'style',\n        enumValues: MdlDynSubscriptionNewStyle.values)\n    ..aOM<MdlDynSubscription>(2, _omitFieldNames ? '' : 'dynSubscription',\n        subBuilder: MdlDynSubscription.create)\n    ..aOM<MdlDynLiveRcmd>(3, _omitFieldNames ? '' : 'dynLiveRcmd',\n        subBuilder: MdlDynLiveRcmd.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynSubscriptionNew clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynSubscriptionNew copyWith(\n          void Function(MdlDynSubscriptionNew) updates) =>\n      super.copyWith((message) => updates(message as MdlDynSubscriptionNew))\n          as MdlDynSubscriptionNew;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MdlDynSubscriptionNew create() => MdlDynSubscriptionNew._();\n  @$core.override\n  MdlDynSubscriptionNew createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MdlDynSubscriptionNew getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MdlDynSubscriptionNew>(create);\n  static MdlDynSubscriptionNew? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  MdlDynSubscriptionNew_Item whichItem() =>\n      _MdlDynSubscriptionNew_ItemByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  void clearItem() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  MdlDynSubscriptionNewStyle get style => $_getN(0);\n  @$pb.TagNumber(1)\n  set style(MdlDynSubscriptionNewStyle value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStyle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStyle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  MdlDynSubscription get dynSubscription => $_getN(1);\n  @$pb.TagNumber(2)\n  set dynSubscription(MdlDynSubscription value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDynSubscription() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDynSubscription() => $_clearField(2);\n  @$pb.TagNumber(2)\n  MdlDynSubscription ensureDynSubscription() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  MdlDynLiveRcmd get dynLiveRcmd => $_getN(2);\n  @$pb.TagNumber(3)\n  set dynLiveRcmd(MdlDynLiveRcmd value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDynLiveRcmd() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDynLiveRcmd() => $_clearField(3);\n  @$pb.TagNumber(3)\n  MdlDynLiveRcmd ensureDynLiveRcmd() => $_ensure(2);\n}\n\nclass MdlDynTopicSet extends $pb.GeneratedMessage {\n  factory MdlDynTopicSet({\n    $core.Iterable<TopicItem>? topics,\n    IconButton? moreBtn,\n    $fixnum.Int64? topicSetId,\n    $fixnum.Int64? pushId,\n  }) {\n    final result = create();\n    if (topics != null) result.topics.addAll(topics);\n    if (moreBtn != null) result.moreBtn = moreBtn;\n    if (topicSetId != null) result.topicSetId = topicSetId;\n    if (pushId != null) result.pushId = pushId;\n    return result;\n  }\n\n  MdlDynTopicSet._();\n\n  factory MdlDynTopicSet.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MdlDynTopicSet.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MdlDynTopicSet',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<TopicItem>(1, _omitFieldNames ? '' : 'topics',\n        subBuilder: TopicItem.create)\n    ..aOM<IconButton>(2, _omitFieldNames ? '' : 'moreBtn',\n        subBuilder: IconButton.create)\n    ..aInt64(3, _omitFieldNames ? '' : 'topicSetId')\n    ..aInt64(4, _omitFieldNames ? '' : 'pushId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynTopicSet clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynTopicSet copyWith(void Function(MdlDynTopicSet) updates) =>\n      super.copyWith((message) => updates(message as MdlDynTopicSet))\n          as MdlDynTopicSet;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MdlDynTopicSet create() => MdlDynTopicSet._();\n  @$core.override\n  MdlDynTopicSet createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MdlDynTopicSet getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MdlDynTopicSet>(create);\n  static MdlDynTopicSet? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<TopicItem> get topics => $_getList(0);\n\n  @$pb.TagNumber(2)\n  IconButton get moreBtn => $_getN(1);\n  @$pb.TagNumber(2)\n  set moreBtn(IconButton value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMoreBtn() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMoreBtn() => $_clearField(2);\n  @$pb.TagNumber(2)\n  IconButton ensureMoreBtn() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get topicSetId => $_getI64(2);\n  @$pb.TagNumber(3)\n  set topicSetId($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTopicSetId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTopicSetId() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get pushId => $_getI64(3);\n  @$pb.TagNumber(4)\n  set pushId($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPushId() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPushId() => $_clearField(4);\n}\n\nclass MdlDynUGCSeason extends $pb.GeneratedMessage {\n  factory MdlDynUGCSeason({\n    $core.String? title,\n    $core.String? cover,\n    $core.String? uri,\n    $core.String? coverLeftText1,\n    $core.String? coverLeftText2,\n    $core.String? coverLeftText3,\n    $fixnum.Int64? id,\n    $core.String? inlineURL,\n    $core.bool? canPlay,\n    $core.String? playIcon,\n    $fixnum.Int64? avid,\n    $fixnum.Int64? cid,\n    Dimension? dimension,\n    $fixnum.Int64? duration,\n    $core.String? jumpUrl,\n    $core.Iterable<VideoBadge>? badge,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (uri != null) result.uri = uri;\n    if (coverLeftText1 != null) result.coverLeftText1 = coverLeftText1;\n    if (coverLeftText2 != null) result.coverLeftText2 = coverLeftText2;\n    if (coverLeftText3 != null) result.coverLeftText3 = coverLeftText3;\n    if (id != null) result.id = id;\n    if (inlineURL != null) result.inlineURL = inlineURL;\n    if (canPlay != null) result.canPlay = canPlay;\n    if (playIcon != null) result.playIcon = playIcon;\n    if (avid != null) result.avid = avid;\n    if (cid != null) result.cid = cid;\n    if (dimension != null) result.dimension = dimension;\n    if (duration != null) result.duration = duration;\n    if (jumpUrl != null) result.jumpUrl = jumpUrl;\n    if (badge != null) result.badge.addAll(badge);\n    return result;\n  }\n\n  MdlDynUGCSeason._();\n\n  factory MdlDynUGCSeason.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MdlDynUGCSeason.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MdlDynUGCSeason',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'cover')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..aOS(4, _omitFieldNames ? '' : 'coverLeftText1')\n    ..aOS(5, _omitFieldNames ? '' : 'coverLeftText2')\n    ..aOS(6, _omitFieldNames ? '' : 'coverLeftText3')\n    ..aInt64(7, _omitFieldNames ? '' : 'id')\n    ..aOS(8, _omitFieldNames ? '' : 'inlineURL')\n    ..aOB(9, _omitFieldNames ? '' : 'canPlay')\n    ..aOS(10, _omitFieldNames ? '' : 'playIcon')\n    ..aInt64(11, _omitFieldNames ? '' : 'avid')\n    ..aInt64(12, _omitFieldNames ? '' : 'cid')\n    ..aOM<Dimension>(13, _omitFieldNames ? '' : 'dimension',\n        subBuilder: Dimension.create)\n    ..aInt64(14, _omitFieldNames ? '' : 'duration')\n    ..aOS(15, _omitFieldNames ? '' : 'jumpUrl')\n    ..pPM<VideoBadge>(16, _omitFieldNames ? '' : 'badge',\n        subBuilder: VideoBadge.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynUGCSeason clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MdlDynUGCSeason copyWith(void Function(MdlDynUGCSeason) updates) =>\n      super.copyWith((message) => updates(message as MdlDynUGCSeason))\n          as MdlDynUGCSeason;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MdlDynUGCSeason create() => MdlDynUGCSeason._();\n  @$core.override\n  MdlDynUGCSeason createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MdlDynUGCSeason getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MdlDynUGCSeason>(create);\n  static MdlDynUGCSeason? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get cover => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cover($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCover() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCover() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get coverLeftText1 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set coverLeftText1($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCoverLeftText1() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCoverLeftText1() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get coverLeftText2 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set coverLeftText2($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCoverLeftText2() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCoverLeftText2() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get coverLeftText3 => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set coverLeftText3($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCoverLeftText3() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCoverLeftText3() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get id => $_getI64(6);\n  @$pb.TagNumber(7)\n  set id($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasId() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearId() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get inlineURL => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set inlineURL($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasInlineURL() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearInlineURL() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.bool get canPlay => $_getBF(8);\n  @$pb.TagNumber(9)\n  set canPlay($core.bool value) => $_setBool(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasCanPlay() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearCanPlay() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get playIcon => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set playIcon($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasPlayIcon() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearPlayIcon() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $fixnum.Int64 get avid => $_getI64(10);\n  @$pb.TagNumber(11)\n  set avid($fixnum.Int64 value) => $_setInt64(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasAvid() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearAvid() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $fixnum.Int64 get cid => $_getI64(11);\n  @$pb.TagNumber(12)\n  set cid($fixnum.Int64 value) => $_setInt64(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasCid() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearCid() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  Dimension get dimension => $_getN(12);\n  @$pb.TagNumber(13)\n  set dimension(Dimension value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasDimension() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearDimension() => $_clearField(13);\n  @$pb.TagNumber(13)\n  Dimension ensureDimension() => $_ensure(12);\n\n  @$pb.TagNumber(14)\n  $fixnum.Int64 get duration => $_getI64(13);\n  @$pb.TagNumber(14)\n  set duration($fixnum.Int64 value) => $_setInt64(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasDuration() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearDuration() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $core.String get jumpUrl => $_getSZ(14);\n  @$pb.TagNumber(15)\n  set jumpUrl($core.String value) => $_setString(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasJumpUrl() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearJumpUrl() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $pb.PbList<VideoBadge> get badge => $_getList(15);\n}\n\nclass MixUpListItem extends $pb.GeneratedMessage {\n  factory MixUpListItem({\n    $fixnum.Int64? uid,\n    $core.int? specialAttention,\n    $core.int? reddotState,\n    MixUpListLiveItem? liveInfo,\n    $core.String? name,\n    $core.String? face,\n    OfficialVerify? official,\n    VipInfo? vip,\n    Relation? relation,\n    $core.int? premiereState,\n    $core.String? uri,\n    $2.AvatarItem? avatar,\n    $3.NameRender? nameRender,\n  }) {\n    final result = create();\n    if (uid != null) result.uid = uid;\n    if (specialAttention != null) result.specialAttention = specialAttention;\n    if (reddotState != null) result.reddotState = reddotState;\n    if (liveInfo != null) result.liveInfo = liveInfo;\n    if (name != null) result.name = name;\n    if (face != null) result.face = face;\n    if (official != null) result.official = official;\n    if (vip != null) result.vip = vip;\n    if (relation != null) result.relation = relation;\n    if (premiereState != null) result.premiereState = premiereState;\n    if (uri != null) result.uri = uri;\n    if (avatar != null) result.avatar = avatar;\n    if (nameRender != null) result.nameRender = nameRender;\n    return result;\n  }\n\n  MixUpListItem._();\n\n  factory MixUpListItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MixUpListItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MixUpListItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'uid')\n    ..aI(2, _omitFieldNames ? '' : 'specialAttention')\n    ..aI(3, _omitFieldNames ? '' : 'reddotState')\n    ..aOM<MixUpListLiveItem>(4, _omitFieldNames ? '' : 'liveInfo',\n        subBuilder: MixUpListLiveItem.create)\n    ..aOS(5, _omitFieldNames ? '' : 'name')\n    ..aOS(6, _omitFieldNames ? '' : 'face')\n    ..aOM<OfficialVerify>(7, _omitFieldNames ? '' : 'official',\n        subBuilder: OfficialVerify.create)\n    ..aOM<VipInfo>(8, _omitFieldNames ? '' : 'vip', subBuilder: VipInfo.create)\n    ..aOM<Relation>(9, _omitFieldNames ? '' : 'relation',\n        subBuilder: Relation.create)\n    ..aI(10, _omitFieldNames ? '' : 'premiereState')\n    ..aOS(11, _omitFieldNames ? '' : 'uri')\n    ..aOM<$2.AvatarItem>(12, _omitFieldNames ? '' : 'avatar',\n        subBuilder: $2.AvatarItem.create)\n    ..aOM<$3.NameRender>(13, _omitFieldNames ? '' : 'nameRender',\n        subBuilder: $3.NameRender.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MixUpListItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MixUpListItem copyWith(void Function(MixUpListItem) updates) =>\n      super.copyWith((message) => updates(message as MixUpListItem))\n          as MixUpListItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MixUpListItem create() => MixUpListItem._();\n  @$core.override\n  MixUpListItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MixUpListItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MixUpListItem>(create);\n  static MixUpListItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get uid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set uid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get specialAttention => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set specialAttention($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSpecialAttention() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSpecialAttention() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get reddotState => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set reddotState($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasReddotState() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearReddotState() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  MixUpListLiveItem get liveInfo => $_getN(3);\n  @$pb.TagNumber(4)\n  set liveInfo(MixUpListLiveItem value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLiveInfo() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLiveInfo() => $_clearField(4);\n  @$pb.TagNumber(4)\n  MixUpListLiveItem ensureLiveInfo() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.String get name => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set name($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasName() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearName() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get face => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set face($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasFace() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearFace() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  OfficialVerify get official => $_getN(6);\n  @$pb.TagNumber(7)\n  set official(OfficialVerify value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasOfficial() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearOfficial() => $_clearField(7);\n  @$pb.TagNumber(7)\n  OfficialVerify ensureOfficial() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  VipInfo get vip => $_getN(7);\n  @$pb.TagNumber(8)\n  set vip(VipInfo value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasVip() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearVip() => $_clearField(8);\n  @$pb.TagNumber(8)\n  VipInfo ensureVip() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  Relation get relation => $_getN(8);\n  @$pb.TagNumber(9)\n  set relation(Relation value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasRelation() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearRelation() => $_clearField(9);\n  @$pb.TagNumber(9)\n  Relation ensureRelation() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  $core.int get premiereState => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set premiereState($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasPremiereState() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearPremiereState() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get uri => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set uri($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasUri() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearUri() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $2.AvatarItem get avatar => $_getN(11);\n  @$pb.TagNumber(12)\n  set avatar($2.AvatarItem value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasAvatar() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearAvatar() => $_clearField(12);\n  @$pb.TagNumber(12)\n  $2.AvatarItem ensureAvatar() => $_ensure(11);\n\n  @$pb.TagNumber(13)\n  $3.NameRender get nameRender => $_getN(12);\n  @$pb.TagNumber(13)\n  set nameRender($3.NameRender value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasNameRender() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearNameRender() => $_clearField(13);\n  @$pb.TagNumber(13)\n  $3.NameRender ensureNameRender() => $_ensure(12);\n}\n\nclass MixUpListLiveItem extends $pb.GeneratedMessage {\n  factory MixUpListLiveItem({\n    $core.bool? status,\n    $fixnum.Int64? roomId,\n    $core.String? uri,\n  }) {\n    final result = create();\n    if (status != null) result.status = status;\n    if (roomId != null) result.roomId = roomId;\n    if (uri != null) result.uri = uri;\n    return result;\n  }\n\n  MixUpListLiveItem._();\n\n  factory MixUpListLiveItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MixUpListLiveItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MixUpListLiveItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'status')\n    ..aInt64(2, _omitFieldNames ? '' : 'roomId')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MixUpListLiveItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MixUpListLiveItem copyWith(void Function(MixUpListLiveItem) updates) =>\n      super.copyWith((message) => updates(message as MixUpListLiveItem))\n          as MixUpListLiveItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MixUpListLiveItem create() => MixUpListLiveItem._();\n  @$core.override\n  MixUpListLiveItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MixUpListLiveItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MixUpListLiveItem>(create);\n  static MixUpListLiveItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get status => $_getBF(0);\n  @$pb.TagNumber(1)\n  set status($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStatus() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStatus() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get roomId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set roomId($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasRoomId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRoomId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n}\n\nenum Module_ModuleItem {\n  moduleAuthor,\n  moduleDispute,\n  moduleDesc,\n  moduleDynamic,\n  moduleLikeUser,\n  moduleExtend,\n  moduleAdditional,\n  moduleStat,\n  moduleFold,\n  moduleComment,\n  moduleInteraction,\n  moduleAuthorForward,\n  moduleAd,\n  moduleBanner,\n  moduleItemNull,\n  moduleShareInfo,\n  moduleRecommend,\n  moduleTop,\n  moduleButtom,\n  moduleStatForward,\n  moduleStory,\n  moduleTopic,\n  moduleTopicDetailsExt,\n  moduleTopTag,\n  moduleTopicBrief,\n  moduleTitle,\n  moduleButton,\n  moduleNotice,\n  moduleOpusSummary,\n  moduleCopyright,\n  moduleParagraph,\n  moduleBlocked,\n  moduleTextNotice,\n  moduleOpusCollection,\n  moduleOnetimeNotice,\n  moduleSneakingAd,\n  moduleMangaHorizontalPagePicContent,\n  moduleMangaVerticalSlidePicContent,\n  moduleMangaCoverPicContent,\n  moduleAuthorForSubscribe,\n  moduleAuthorSlim,\n  moduleMangaCollection,\n  moduleCooperation,\n  notSet\n}\n\nclass Module extends $pb.GeneratedMessage {\n  factory Module({\n    DynModuleType? moduleType,\n    ModuleAuthor? moduleAuthor,\n    ModuleDispute? moduleDispute,\n    ModuleDesc? moduleDesc,\n    ModuleDynamic? moduleDynamic,\n    ModuleLikeUser? moduleLikeUser,\n    ModuleExtend? moduleExtend,\n    ModuleAdditional? moduleAdditional,\n    ModuleStat? moduleStat,\n    ModuleFold? moduleFold,\n    ModuleComment? moduleComment,\n    ModuleInteraction? moduleInteraction,\n    ModuleAuthorForward? moduleAuthorForward,\n    ModuleAd? moduleAd,\n    ModuleBanner? moduleBanner,\n    ModuleItemNull? moduleItemNull,\n    ModuleShareInfo? moduleShareInfo,\n    ModuleRecommend? moduleRecommend,\n    ModuleTop? moduleTop,\n    ModuleButtom? moduleButtom,\n    ModuleStat? moduleStatForward,\n    ModuleStory? moduleStory,\n    ModuleTopic? moduleTopic,\n    ModuleTopicDetailsExt? moduleTopicDetailsExt,\n    ModuleTopTag? moduleTopTag,\n    ModuleTopicBrief? moduleTopicBrief,\n    ModuleTitle? moduleTitle,\n    ModuleButton? moduleButton,\n    ModuleNotice? moduleNotice,\n    ModuleOpusSummary? moduleOpusSummary,\n    ModuleCopyright? moduleCopyright,\n    ModuleParagraph? moduleParagraph,\n    ModuleBlocked? moduleBlocked,\n    ModuleTextNotice? moduleTextNotice,\n    ModuleOpusCollection? moduleOpusCollection,\n    ModuleOnetimeNotice? moduleOnetimeNotice,\n    ModuleSneakingAd? moduleSneakingAd,\n    ModuleMangaHorizontalPagePicContent? moduleMangaHorizontalPagePicContent,\n    ModuleMangaVerticalSlidePicContent? moduleMangaVerticalSlidePicContent,\n    ModuleMangaCoverPicContent? moduleMangaCoverPicContent,\n    ModuleAuthorForSubscribe? moduleAuthorForSubscribe,\n    ModuleAuthorSlim? moduleAuthorSlim,\n    ModuleMangaCollection? moduleMangaCollection,\n    ModuleCooperation? moduleCooperation,\n  }) {\n    final result = create();\n    if (moduleType != null) result.moduleType = moduleType;\n    if (moduleAuthor != null) result.moduleAuthor = moduleAuthor;\n    if (moduleDispute != null) result.moduleDispute = moduleDispute;\n    if (moduleDesc != null) result.moduleDesc = moduleDesc;\n    if (moduleDynamic != null) result.moduleDynamic = moduleDynamic;\n    if (moduleLikeUser != null) result.moduleLikeUser = moduleLikeUser;\n    if (moduleExtend != null) result.moduleExtend = moduleExtend;\n    if (moduleAdditional != null) result.moduleAdditional = moduleAdditional;\n    if (moduleStat != null) result.moduleStat = moduleStat;\n    if (moduleFold != null) result.moduleFold = moduleFold;\n    if (moduleComment != null) result.moduleComment = moduleComment;\n    if (moduleInteraction != null) result.moduleInteraction = moduleInteraction;\n    if (moduleAuthorForward != null)\n      result.moduleAuthorForward = moduleAuthorForward;\n    if (moduleAd != null) result.moduleAd = moduleAd;\n    if (moduleBanner != null) result.moduleBanner = moduleBanner;\n    if (moduleItemNull != null) result.moduleItemNull = moduleItemNull;\n    if (moduleShareInfo != null) result.moduleShareInfo = moduleShareInfo;\n    if (moduleRecommend != null) result.moduleRecommend = moduleRecommend;\n    if (moduleTop != null) result.moduleTop = moduleTop;\n    if (moduleButtom != null) result.moduleButtom = moduleButtom;\n    if (moduleStatForward != null) result.moduleStatForward = moduleStatForward;\n    if (moduleStory != null) result.moduleStory = moduleStory;\n    if (moduleTopic != null) result.moduleTopic = moduleTopic;\n    if (moduleTopicDetailsExt != null)\n      result.moduleTopicDetailsExt = moduleTopicDetailsExt;\n    if (moduleTopTag != null) result.moduleTopTag = moduleTopTag;\n    if (moduleTopicBrief != null) result.moduleTopicBrief = moduleTopicBrief;\n    if (moduleTitle != null) result.moduleTitle = moduleTitle;\n    if (moduleButton != null) result.moduleButton = moduleButton;\n    if (moduleNotice != null) result.moduleNotice = moduleNotice;\n    if (moduleOpusSummary != null) result.moduleOpusSummary = moduleOpusSummary;\n    if (moduleCopyright != null) result.moduleCopyright = moduleCopyright;\n    if (moduleParagraph != null) result.moduleParagraph = moduleParagraph;\n    if (moduleBlocked != null) result.moduleBlocked = moduleBlocked;\n    if (moduleTextNotice != null) result.moduleTextNotice = moduleTextNotice;\n    if (moduleOpusCollection != null)\n      result.moduleOpusCollection = moduleOpusCollection;\n    if (moduleOnetimeNotice != null)\n      result.moduleOnetimeNotice = moduleOnetimeNotice;\n    if (moduleSneakingAd != null) result.moduleSneakingAd = moduleSneakingAd;\n    if (moduleMangaHorizontalPagePicContent != null)\n      result.moduleMangaHorizontalPagePicContent =\n          moduleMangaHorizontalPagePicContent;\n    if (moduleMangaVerticalSlidePicContent != null)\n      result.moduleMangaVerticalSlidePicContent =\n          moduleMangaVerticalSlidePicContent;\n    if (moduleMangaCoverPicContent != null)\n      result.moduleMangaCoverPicContent = moduleMangaCoverPicContent;\n    if (moduleAuthorForSubscribe != null)\n      result.moduleAuthorForSubscribe = moduleAuthorForSubscribe;\n    if (moduleAuthorSlim != null) result.moduleAuthorSlim = moduleAuthorSlim;\n    if (moduleMangaCollection != null)\n      result.moduleMangaCollection = moduleMangaCollection;\n    if (moduleCooperation != null) result.moduleCooperation = moduleCooperation;\n    return result;\n  }\n\n  Module._();\n\n  factory Module.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Module.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, Module_ModuleItem> _Module_ModuleItemByTag =\n      {\n    2: Module_ModuleItem.moduleAuthor,\n    3: Module_ModuleItem.moduleDispute,\n    4: Module_ModuleItem.moduleDesc,\n    5: Module_ModuleItem.moduleDynamic,\n    6: Module_ModuleItem.moduleLikeUser,\n    7: Module_ModuleItem.moduleExtend,\n    8: Module_ModuleItem.moduleAdditional,\n    9: Module_ModuleItem.moduleStat,\n    10: Module_ModuleItem.moduleFold,\n    11: Module_ModuleItem.moduleComment,\n    12: Module_ModuleItem.moduleInteraction,\n    13: Module_ModuleItem.moduleAuthorForward,\n    14: Module_ModuleItem.moduleAd,\n    15: Module_ModuleItem.moduleBanner,\n    16: Module_ModuleItem.moduleItemNull,\n    17: Module_ModuleItem.moduleShareInfo,\n    18: Module_ModuleItem.moduleRecommend,\n    19: Module_ModuleItem.moduleTop,\n    20: Module_ModuleItem.moduleButtom,\n    21: Module_ModuleItem.moduleStatForward,\n    22: Module_ModuleItem.moduleStory,\n    23: Module_ModuleItem.moduleTopic,\n    24: Module_ModuleItem.moduleTopicDetailsExt,\n    25: Module_ModuleItem.moduleTopTag,\n    26: Module_ModuleItem.moduleTopicBrief,\n    27: Module_ModuleItem.moduleTitle,\n    28: Module_ModuleItem.moduleButton,\n    29: Module_ModuleItem.moduleNotice,\n    30: Module_ModuleItem.moduleOpusSummary,\n    31: Module_ModuleItem.moduleCopyright,\n    32: Module_ModuleItem.moduleParagraph,\n    33: Module_ModuleItem.moduleBlocked,\n    34: Module_ModuleItem.moduleTextNotice,\n    35: Module_ModuleItem.moduleOpusCollection,\n    36: Module_ModuleItem.moduleOnetimeNotice,\n    37: Module_ModuleItem.moduleSneakingAd,\n    38: Module_ModuleItem.moduleMangaHorizontalPagePicContent,\n    39: Module_ModuleItem.moduleMangaVerticalSlidePicContent,\n    40: Module_ModuleItem.moduleMangaCoverPicContent,\n    41: Module_ModuleItem.moduleAuthorForSubscribe,\n    42: Module_ModuleItem.moduleAuthorSlim,\n    43: Module_ModuleItem.moduleMangaCollection,\n    44: Module_ModuleItem.moduleCooperation,\n    0: Module_ModuleItem.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Module',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..oo(0, [\n      2,\n      3,\n      4,\n      5,\n      6,\n      7,\n      8,\n      9,\n      10,\n      11,\n      12,\n      13,\n      14,\n      15,\n      16,\n      17,\n      18,\n      19,\n      20,\n      21,\n      22,\n      23,\n      24,\n      25,\n      26,\n      27,\n      28,\n      29,\n      30,\n      31,\n      32,\n      33,\n      34,\n      35,\n      36,\n      37,\n      38,\n      39,\n      40,\n      41,\n      42,\n      43,\n      44\n    ])\n    ..aE<DynModuleType>(1, _omitFieldNames ? '' : 'moduleType',\n        enumValues: DynModuleType.values)\n    ..aOM<ModuleAuthor>(2, _omitFieldNames ? '' : 'moduleAuthor',\n        subBuilder: ModuleAuthor.create)\n    ..aOM<ModuleDispute>(3, _omitFieldNames ? '' : 'moduleDispute',\n        subBuilder: ModuleDispute.create)\n    ..aOM<ModuleDesc>(4, _omitFieldNames ? '' : 'moduleDesc',\n        subBuilder: ModuleDesc.create)\n    ..aOM<ModuleDynamic>(5, _omitFieldNames ? '' : 'moduleDynamic',\n        subBuilder: ModuleDynamic.create)\n    ..aOM<ModuleLikeUser>(6, _omitFieldNames ? '' : 'moduleLikeUser',\n        subBuilder: ModuleLikeUser.create)\n    ..aOM<ModuleExtend>(7, _omitFieldNames ? '' : 'moduleExtend',\n        subBuilder: ModuleExtend.create)\n    ..aOM<ModuleAdditional>(8, _omitFieldNames ? '' : 'moduleAdditional',\n        subBuilder: ModuleAdditional.create)\n    ..aOM<ModuleStat>(9, _omitFieldNames ? '' : 'moduleStat',\n        subBuilder: ModuleStat.create)\n    ..aOM<ModuleFold>(10, _omitFieldNames ? '' : 'moduleFold',\n        subBuilder: ModuleFold.create)\n    ..aOM<ModuleComment>(11, _omitFieldNames ? '' : 'moduleComment',\n        subBuilder: ModuleComment.create)\n    ..aOM<ModuleInteraction>(12, _omitFieldNames ? '' : 'moduleInteraction',\n        subBuilder: ModuleInteraction.create)\n    ..aOM<ModuleAuthorForward>(13, _omitFieldNames ? '' : 'moduleAuthorForward',\n        subBuilder: ModuleAuthorForward.create)\n    ..aOM<ModuleAd>(14, _omitFieldNames ? '' : 'moduleAd',\n        subBuilder: ModuleAd.create)\n    ..aOM<ModuleBanner>(15, _omitFieldNames ? '' : 'moduleBanner',\n        subBuilder: ModuleBanner.create)\n    ..aOM<ModuleItemNull>(16, _omitFieldNames ? '' : 'moduleItemNull',\n        subBuilder: ModuleItemNull.create)\n    ..aOM<ModuleShareInfo>(17, _omitFieldNames ? '' : 'moduleShareInfo',\n        subBuilder: ModuleShareInfo.create)\n    ..aOM<ModuleRecommend>(18, _omitFieldNames ? '' : 'moduleRecommend',\n        subBuilder: ModuleRecommend.create)\n    ..aOM<ModuleTop>(19, _omitFieldNames ? '' : 'moduleTop',\n        subBuilder: ModuleTop.create)\n    ..aOM<ModuleButtom>(20, _omitFieldNames ? '' : 'moduleButtom',\n        subBuilder: ModuleButtom.create)\n    ..aOM<ModuleStat>(21, _omitFieldNames ? '' : 'moduleStatForward',\n        subBuilder: ModuleStat.create)\n    ..aOM<ModuleStory>(22, _omitFieldNames ? '' : 'moduleStory',\n        subBuilder: ModuleStory.create)\n    ..aOM<ModuleTopic>(23, _omitFieldNames ? '' : 'moduleTopic',\n        subBuilder: ModuleTopic.create)\n    ..aOM<ModuleTopicDetailsExt>(\n        24, _omitFieldNames ? '' : 'moduleTopicDetailsExt',\n        subBuilder: ModuleTopicDetailsExt.create)\n    ..aOM<ModuleTopTag>(25, _omitFieldNames ? '' : 'moduleTopTag',\n        subBuilder: ModuleTopTag.create)\n    ..aOM<ModuleTopicBrief>(26, _omitFieldNames ? '' : 'moduleTopicBrief',\n        subBuilder: ModuleTopicBrief.create)\n    ..aOM<ModuleTitle>(27, _omitFieldNames ? '' : 'moduleTitle',\n        subBuilder: ModuleTitle.create)\n    ..aOM<ModuleButton>(28, _omitFieldNames ? '' : 'moduleButton',\n        subBuilder: ModuleButton.create)\n    ..aOM<ModuleNotice>(29, _omitFieldNames ? '' : 'moduleNotice',\n        subBuilder: ModuleNotice.create)\n    ..aOM<ModuleOpusSummary>(30, _omitFieldNames ? '' : 'moduleOpusSummary',\n        subBuilder: ModuleOpusSummary.create)\n    ..aOM<ModuleCopyright>(31, _omitFieldNames ? '' : 'moduleCopyright',\n        subBuilder: ModuleCopyright.create)\n    ..aOM<ModuleParagraph>(32, _omitFieldNames ? '' : 'moduleParagraph',\n        subBuilder: ModuleParagraph.create)\n    ..aOM<ModuleBlocked>(33, _omitFieldNames ? '' : 'moduleBlocked',\n        subBuilder: ModuleBlocked.create)\n    ..aOM<ModuleTextNotice>(34, _omitFieldNames ? '' : 'moduleTextNotice',\n        subBuilder: ModuleTextNotice.create)\n    ..aOM<ModuleOpusCollection>(\n        35, _omitFieldNames ? '' : 'moduleOpusCollection',\n        subBuilder: ModuleOpusCollection.create)\n    ..aOM<ModuleOnetimeNotice>(36, _omitFieldNames ? '' : 'moduleOnetimeNotice',\n        subBuilder: ModuleOnetimeNotice.create)\n    ..aOM<ModuleSneakingAd>(37, _omitFieldNames ? '' : 'moduleSneakingAd',\n        subBuilder: ModuleSneakingAd.create)\n    ..aOM<ModuleMangaHorizontalPagePicContent>(\n        38, _omitFieldNames ? '' : 'moduleMangaHorizontalPagePicContent',\n        subBuilder: ModuleMangaHorizontalPagePicContent.create)\n    ..aOM<ModuleMangaVerticalSlidePicContent>(\n        39, _omitFieldNames ? '' : 'moduleMangaVerticalSlidePicContent',\n        subBuilder: ModuleMangaVerticalSlidePicContent.create)\n    ..aOM<ModuleMangaCoverPicContent>(\n        40, _omitFieldNames ? '' : 'moduleMangaCoverPicContent',\n        subBuilder: ModuleMangaCoverPicContent.create)\n    ..aOM<ModuleAuthorForSubscribe>(\n        41, _omitFieldNames ? '' : 'moduleAuthorForSubscribe',\n        subBuilder: ModuleAuthorForSubscribe.create)\n    ..aOM<ModuleAuthorSlim>(42, _omitFieldNames ? '' : 'moduleAuthorSlim',\n        subBuilder: ModuleAuthorSlim.create)\n    ..aOM<ModuleMangaCollection>(\n        43, _omitFieldNames ? '' : 'moduleMangaCollection',\n        subBuilder: ModuleMangaCollection.create)\n    ..aOM<ModuleCooperation>(44, _omitFieldNames ? '' : 'moduleCooperation',\n        subBuilder: ModuleCooperation.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Module clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Module copyWith(void Function(Module) updates) =>\n      super.copyWith((message) => updates(message as Module)) as Module;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Module create() => Module._();\n  @$core.override\n  Module createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Module getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Module>(create);\n  static Module? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(7)\n  @$pb.TagNumber(8)\n  @$pb.TagNumber(9)\n  @$pb.TagNumber(10)\n  @$pb.TagNumber(11)\n  @$pb.TagNumber(12)\n  @$pb.TagNumber(13)\n  @$pb.TagNumber(14)\n  @$pb.TagNumber(15)\n  @$pb.TagNumber(16)\n  @$pb.TagNumber(17)\n  @$pb.TagNumber(18)\n  @$pb.TagNumber(19)\n  @$pb.TagNumber(20)\n  @$pb.TagNumber(21)\n  @$pb.TagNumber(22)\n  @$pb.TagNumber(23)\n  @$pb.TagNumber(24)\n  @$pb.TagNumber(25)\n  @$pb.TagNumber(26)\n  @$pb.TagNumber(27)\n  @$pb.TagNumber(28)\n  @$pb.TagNumber(29)\n  @$pb.TagNumber(30)\n  @$pb.TagNumber(31)\n  @$pb.TagNumber(32)\n  @$pb.TagNumber(33)\n  @$pb.TagNumber(34)\n  @$pb.TagNumber(35)\n  @$pb.TagNumber(36)\n  @$pb.TagNumber(37)\n  @$pb.TagNumber(38)\n  @$pb.TagNumber(39)\n  @$pb.TagNumber(40)\n  @$pb.TagNumber(41)\n  @$pb.TagNumber(42)\n  @$pb.TagNumber(43)\n  @$pb.TagNumber(44)\n  Module_ModuleItem whichModuleItem() =>\n      _Module_ModuleItemByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(7)\n  @$pb.TagNumber(8)\n  @$pb.TagNumber(9)\n  @$pb.TagNumber(10)\n  @$pb.TagNumber(11)\n  @$pb.TagNumber(12)\n  @$pb.TagNumber(13)\n  @$pb.TagNumber(14)\n  @$pb.TagNumber(15)\n  @$pb.TagNumber(16)\n  @$pb.TagNumber(17)\n  @$pb.TagNumber(18)\n  @$pb.TagNumber(19)\n  @$pb.TagNumber(20)\n  @$pb.TagNumber(21)\n  @$pb.TagNumber(22)\n  @$pb.TagNumber(23)\n  @$pb.TagNumber(24)\n  @$pb.TagNumber(25)\n  @$pb.TagNumber(26)\n  @$pb.TagNumber(27)\n  @$pb.TagNumber(28)\n  @$pb.TagNumber(29)\n  @$pb.TagNumber(30)\n  @$pb.TagNumber(31)\n  @$pb.TagNumber(32)\n  @$pb.TagNumber(33)\n  @$pb.TagNumber(34)\n  @$pb.TagNumber(35)\n  @$pb.TagNumber(36)\n  @$pb.TagNumber(37)\n  @$pb.TagNumber(38)\n  @$pb.TagNumber(39)\n  @$pb.TagNumber(40)\n  @$pb.TagNumber(41)\n  @$pb.TagNumber(42)\n  @$pb.TagNumber(43)\n  @$pb.TagNumber(44)\n  void clearModuleItem() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  DynModuleType get moduleType => $_getN(0);\n  @$pb.TagNumber(1)\n  set moduleType(DynModuleType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasModuleType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearModuleType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  ModuleAuthor get moduleAuthor => $_getN(1);\n  @$pb.TagNumber(2)\n  set moduleAuthor(ModuleAuthor value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasModuleAuthor() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearModuleAuthor() => $_clearField(2);\n  @$pb.TagNumber(2)\n  ModuleAuthor ensureModuleAuthor() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  ModuleDispute get moduleDispute => $_getN(2);\n  @$pb.TagNumber(3)\n  set moduleDispute(ModuleDispute value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasModuleDispute() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearModuleDispute() => $_clearField(3);\n  @$pb.TagNumber(3)\n  ModuleDispute ensureModuleDispute() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  ModuleDesc get moduleDesc => $_getN(3);\n  @$pb.TagNumber(4)\n  set moduleDesc(ModuleDesc value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasModuleDesc() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearModuleDesc() => $_clearField(4);\n  @$pb.TagNumber(4)\n  ModuleDesc ensureModuleDesc() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  ModuleDynamic get moduleDynamic => $_getN(4);\n  @$pb.TagNumber(5)\n  set moduleDynamic(ModuleDynamic value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasModuleDynamic() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearModuleDynamic() => $_clearField(5);\n  @$pb.TagNumber(5)\n  ModuleDynamic ensureModuleDynamic() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  ModuleLikeUser get moduleLikeUser => $_getN(5);\n  @$pb.TagNumber(6)\n  set moduleLikeUser(ModuleLikeUser value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasModuleLikeUser() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearModuleLikeUser() => $_clearField(6);\n  @$pb.TagNumber(6)\n  ModuleLikeUser ensureModuleLikeUser() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  ModuleExtend get moduleExtend => $_getN(6);\n  @$pb.TagNumber(7)\n  set moduleExtend(ModuleExtend value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasModuleExtend() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearModuleExtend() => $_clearField(7);\n  @$pb.TagNumber(7)\n  ModuleExtend ensureModuleExtend() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  ModuleAdditional get moduleAdditional => $_getN(7);\n  @$pb.TagNumber(8)\n  set moduleAdditional(ModuleAdditional value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasModuleAdditional() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearModuleAdditional() => $_clearField(8);\n  @$pb.TagNumber(8)\n  ModuleAdditional ensureModuleAdditional() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  ModuleStat get moduleStat => $_getN(8);\n  @$pb.TagNumber(9)\n  set moduleStat(ModuleStat value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasModuleStat() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearModuleStat() => $_clearField(9);\n  @$pb.TagNumber(9)\n  ModuleStat ensureModuleStat() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  ModuleFold get moduleFold => $_getN(9);\n  @$pb.TagNumber(10)\n  set moduleFold(ModuleFold value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasModuleFold() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearModuleFold() => $_clearField(10);\n  @$pb.TagNumber(10)\n  ModuleFold ensureModuleFold() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  ModuleComment get moduleComment => $_getN(10);\n  @$pb.TagNumber(11)\n  set moduleComment(ModuleComment value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasModuleComment() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearModuleComment() => $_clearField(11);\n  @$pb.TagNumber(11)\n  ModuleComment ensureModuleComment() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  ModuleInteraction get moduleInteraction => $_getN(11);\n  @$pb.TagNumber(12)\n  set moduleInteraction(ModuleInteraction value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasModuleInteraction() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearModuleInteraction() => $_clearField(12);\n  @$pb.TagNumber(12)\n  ModuleInteraction ensureModuleInteraction() => $_ensure(11);\n\n  @$pb.TagNumber(13)\n  ModuleAuthorForward get moduleAuthorForward => $_getN(12);\n  @$pb.TagNumber(13)\n  set moduleAuthorForward(ModuleAuthorForward value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasModuleAuthorForward() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearModuleAuthorForward() => $_clearField(13);\n  @$pb.TagNumber(13)\n  ModuleAuthorForward ensureModuleAuthorForward() => $_ensure(12);\n\n  @$pb.TagNumber(14)\n  ModuleAd get moduleAd => $_getN(13);\n  @$pb.TagNumber(14)\n  set moduleAd(ModuleAd value) => $_setField(14, value);\n  @$pb.TagNumber(14)\n  $core.bool hasModuleAd() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearModuleAd() => $_clearField(14);\n  @$pb.TagNumber(14)\n  ModuleAd ensureModuleAd() => $_ensure(13);\n\n  @$pb.TagNumber(15)\n  ModuleBanner get moduleBanner => $_getN(14);\n  @$pb.TagNumber(15)\n  set moduleBanner(ModuleBanner value) => $_setField(15, value);\n  @$pb.TagNumber(15)\n  $core.bool hasModuleBanner() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearModuleBanner() => $_clearField(15);\n  @$pb.TagNumber(15)\n  ModuleBanner ensureModuleBanner() => $_ensure(14);\n\n  @$pb.TagNumber(16)\n  ModuleItemNull get moduleItemNull => $_getN(15);\n  @$pb.TagNumber(16)\n  set moduleItemNull(ModuleItemNull value) => $_setField(16, value);\n  @$pb.TagNumber(16)\n  $core.bool hasModuleItemNull() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearModuleItemNull() => $_clearField(16);\n  @$pb.TagNumber(16)\n  ModuleItemNull ensureModuleItemNull() => $_ensure(15);\n\n  @$pb.TagNumber(17)\n  ModuleShareInfo get moduleShareInfo => $_getN(16);\n  @$pb.TagNumber(17)\n  set moduleShareInfo(ModuleShareInfo value) => $_setField(17, value);\n  @$pb.TagNumber(17)\n  $core.bool hasModuleShareInfo() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearModuleShareInfo() => $_clearField(17);\n  @$pb.TagNumber(17)\n  ModuleShareInfo ensureModuleShareInfo() => $_ensure(16);\n\n  @$pb.TagNumber(18)\n  ModuleRecommend get moduleRecommend => $_getN(17);\n  @$pb.TagNumber(18)\n  set moduleRecommend(ModuleRecommend value) => $_setField(18, value);\n  @$pb.TagNumber(18)\n  $core.bool hasModuleRecommend() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearModuleRecommend() => $_clearField(18);\n  @$pb.TagNumber(18)\n  ModuleRecommend ensureModuleRecommend() => $_ensure(17);\n\n  @$pb.TagNumber(19)\n  ModuleTop get moduleTop => $_getN(18);\n  @$pb.TagNumber(19)\n  set moduleTop(ModuleTop value) => $_setField(19, value);\n  @$pb.TagNumber(19)\n  $core.bool hasModuleTop() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearModuleTop() => $_clearField(19);\n  @$pb.TagNumber(19)\n  ModuleTop ensureModuleTop() => $_ensure(18);\n\n  @$pb.TagNumber(20)\n  ModuleButtom get moduleButtom => $_getN(19);\n  @$pb.TagNumber(20)\n  set moduleButtom(ModuleButtom value) => $_setField(20, value);\n  @$pb.TagNumber(20)\n  $core.bool hasModuleButtom() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearModuleButtom() => $_clearField(20);\n  @$pb.TagNumber(20)\n  ModuleButtom ensureModuleButtom() => $_ensure(19);\n\n  @$pb.TagNumber(21)\n  ModuleStat get moduleStatForward => $_getN(20);\n  @$pb.TagNumber(21)\n  set moduleStatForward(ModuleStat value) => $_setField(21, value);\n  @$pb.TagNumber(21)\n  $core.bool hasModuleStatForward() => $_has(20);\n  @$pb.TagNumber(21)\n  void clearModuleStatForward() => $_clearField(21);\n  @$pb.TagNumber(21)\n  ModuleStat ensureModuleStatForward() => $_ensure(20);\n\n  @$pb.TagNumber(22)\n  ModuleStory get moduleStory => $_getN(21);\n  @$pb.TagNumber(22)\n  set moduleStory(ModuleStory value) => $_setField(22, value);\n  @$pb.TagNumber(22)\n  $core.bool hasModuleStory() => $_has(21);\n  @$pb.TagNumber(22)\n  void clearModuleStory() => $_clearField(22);\n  @$pb.TagNumber(22)\n  ModuleStory ensureModuleStory() => $_ensure(21);\n\n  @$pb.TagNumber(23)\n  ModuleTopic get moduleTopic => $_getN(22);\n  @$pb.TagNumber(23)\n  set moduleTopic(ModuleTopic value) => $_setField(23, value);\n  @$pb.TagNumber(23)\n  $core.bool hasModuleTopic() => $_has(22);\n  @$pb.TagNumber(23)\n  void clearModuleTopic() => $_clearField(23);\n  @$pb.TagNumber(23)\n  ModuleTopic ensureModuleTopic() => $_ensure(22);\n\n  @$pb.TagNumber(24)\n  ModuleTopicDetailsExt get moduleTopicDetailsExt => $_getN(23);\n  @$pb.TagNumber(24)\n  set moduleTopicDetailsExt(ModuleTopicDetailsExt value) =>\n      $_setField(24, value);\n  @$pb.TagNumber(24)\n  $core.bool hasModuleTopicDetailsExt() => $_has(23);\n  @$pb.TagNumber(24)\n  void clearModuleTopicDetailsExt() => $_clearField(24);\n  @$pb.TagNumber(24)\n  ModuleTopicDetailsExt ensureModuleTopicDetailsExt() => $_ensure(23);\n\n  @$pb.TagNumber(25)\n  ModuleTopTag get moduleTopTag => $_getN(24);\n  @$pb.TagNumber(25)\n  set moduleTopTag(ModuleTopTag value) => $_setField(25, value);\n  @$pb.TagNumber(25)\n  $core.bool hasModuleTopTag() => $_has(24);\n  @$pb.TagNumber(25)\n  void clearModuleTopTag() => $_clearField(25);\n  @$pb.TagNumber(25)\n  ModuleTopTag ensureModuleTopTag() => $_ensure(24);\n\n  @$pb.TagNumber(26)\n  ModuleTopicBrief get moduleTopicBrief => $_getN(25);\n  @$pb.TagNumber(26)\n  set moduleTopicBrief(ModuleTopicBrief value) => $_setField(26, value);\n  @$pb.TagNumber(26)\n  $core.bool hasModuleTopicBrief() => $_has(25);\n  @$pb.TagNumber(26)\n  void clearModuleTopicBrief() => $_clearField(26);\n  @$pb.TagNumber(26)\n  ModuleTopicBrief ensureModuleTopicBrief() => $_ensure(25);\n\n  @$pb.TagNumber(27)\n  ModuleTitle get moduleTitle => $_getN(26);\n  @$pb.TagNumber(27)\n  set moduleTitle(ModuleTitle value) => $_setField(27, value);\n  @$pb.TagNumber(27)\n  $core.bool hasModuleTitle() => $_has(26);\n  @$pb.TagNumber(27)\n  void clearModuleTitle() => $_clearField(27);\n  @$pb.TagNumber(27)\n  ModuleTitle ensureModuleTitle() => $_ensure(26);\n\n  @$pb.TagNumber(28)\n  ModuleButton get moduleButton => $_getN(27);\n  @$pb.TagNumber(28)\n  set moduleButton(ModuleButton value) => $_setField(28, value);\n  @$pb.TagNumber(28)\n  $core.bool hasModuleButton() => $_has(27);\n  @$pb.TagNumber(28)\n  void clearModuleButton() => $_clearField(28);\n  @$pb.TagNumber(28)\n  ModuleButton ensureModuleButton() => $_ensure(27);\n\n  @$pb.TagNumber(29)\n  ModuleNotice get moduleNotice => $_getN(28);\n  @$pb.TagNumber(29)\n  set moduleNotice(ModuleNotice value) => $_setField(29, value);\n  @$pb.TagNumber(29)\n  $core.bool hasModuleNotice() => $_has(28);\n  @$pb.TagNumber(29)\n  void clearModuleNotice() => $_clearField(29);\n  @$pb.TagNumber(29)\n  ModuleNotice ensureModuleNotice() => $_ensure(28);\n\n  @$pb.TagNumber(30)\n  ModuleOpusSummary get moduleOpusSummary => $_getN(29);\n  @$pb.TagNumber(30)\n  set moduleOpusSummary(ModuleOpusSummary value) => $_setField(30, value);\n  @$pb.TagNumber(30)\n  $core.bool hasModuleOpusSummary() => $_has(29);\n  @$pb.TagNumber(30)\n  void clearModuleOpusSummary() => $_clearField(30);\n  @$pb.TagNumber(30)\n  ModuleOpusSummary ensureModuleOpusSummary() => $_ensure(29);\n\n  @$pb.TagNumber(31)\n  ModuleCopyright get moduleCopyright => $_getN(30);\n  @$pb.TagNumber(31)\n  set moduleCopyright(ModuleCopyright value) => $_setField(31, value);\n  @$pb.TagNumber(31)\n  $core.bool hasModuleCopyright() => $_has(30);\n  @$pb.TagNumber(31)\n  void clearModuleCopyright() => $_clearField(31);\n  @$pb.TagNumber(31)\n  ModuleCopyright ensureModuleCopyright() => $_ensure(30);\n\n  @$pb.TagNumber(32)\n  ModuleParagraph get moduleParagraph => $_getN(31);\n  @$pb.TagNumber(32)\n  set moduleParagraph(ModuleParagraph value) => $_setField(32, value);\n  @$pb.TagNumber(32)\n  $core.bool hasModuleParagraph() => $_has(31);\n  @$pb.TagNumber(32)\n  void clearModuleParagraph() => $_clearField(32);\n  @$pb.TagNumber(32)\n  ModuleParagraph ensureModuleParagraph() => $_ensure(31);\n\n  @$pb.TagNumber(33)\n  ModuleBlocked get moduleBlocked => $_getN(32);\n  @$pb.TagNumber(33)\n  set moduleBlocked(ModuleBlocked value) => $_setField(33, value);\n  @$pb.TagNumber(33)\n  $core.bool hasModuleBlocked() => $_has(32);\n  @$pb.TagNumber(33)\n  void clearModuleBlocked() => $_clearField(33);\n  @$pb.TagNumber(33)\n  ModuleBlocked ensureModuleBlocked() => $_ensure(32);\n\n  @$pb.TagNumber(34)\n  ModuleTextNotice get moduleTextNotice => $_getN(33);\n  @$pb.TagNumber(34)\n  set moduleTextNotice(ModuleTextNotice value) => $_setField(34, value);\n  @$pb.TagNumber(34)\n  $core.bool hasModuleTextNotice() => $_has(33);\n  @$pb.TagNumber(34)\n  void clearModuleTextNotice() => $_clearField(34);\n  @$pb.TagNumber(34)\n  ModuleTextNotice ensureModuleTextNotice() => $_ensure(33);\n\n  @$pb.TagNumber(35)\n  ModuleOpusCollection get moduleOpusCollection => $_getN(34);\n  @$pb.TagNumber(35)\n  set moduleOpusCollection(ModuleOpusCollection value) => $_setField(35, value);\n  @$pb.TagNumber(35)\n  $core.bool hasModuleOpusCollection() => $_has(34);\n  @$pb.TagNumber(35)\n  void clearModuleOpusCollection() => $_clearField(35);\n  @$pb.TagNumber(35)\n  ModuleOpusCollection ensureModuleOpusCollection() => $_ensure(34);\n\n  @$pb.TagNumber(36)\n  ModuleOnetimeNotice get moduleOnetimeNotice => $_getN(35);\n  @$pb.TagNumber(36)\n  set moduleOnetimeNotice(ModuleOnetimeNotice value) => $_setField(36, value);\n  @$pb.TagNumber(36)\n  $core.bool hasModuleOnetimeNotice() => $_has(35);\n  @$pb.TagNumber(36)\n  void clearModuleOnetimeNotice() => $_clearField(36);\n  @$pb.TagNumber(36)\n  ModuleOnetimeNotice ensureModuleOnetimeNotice() => $_ensure(35);\n\n  @$pb.TagNumber(37)\n  ModuleSneakingAd get moduleSneakingAd => $_getN(36);\n  @$pb.TagNumber(37)\n  set moduleSneakingAd(ModuleSneakingAd value) => $_setField(37, value);\n  @$pb.TagNumber(37)\n  $core.bool hasModuleSneakingAd() => $_has(36);\n  @$pb.TagNumber(37)\n  void clearModuleSneakingAd() => $_clearField(37);\n  @$pb.TagNumber(37)\n  ModuleSneakingAd ensureModuleSneakingAd() => $_ensure(36);\n\n  @$pb.TagNumber(38)\n  ModuleMangaHorizontalPagePicContent get moduleMangaHorizontalPagePicContent =>\n      $_getN(37);\n  @$pb.TagNumber(38)\n  set moduleMangaHorizontalPagePicContent(\n          ModuleMangaHorizontalPagePicContent value) =>\n      $_setField(38, value);\n  @$pb.TagNumber(38)\n  $core.bool hasModuleMangaHorizontalPagePicContent() => $_has(37);\n  @$pb.TagNumber(38)\n  void clearModuleMangaHorizontalPagePicContent() => $_clearField(38);\n  @$pb.TagNumber(38)\n  ModuleMangaHorizontalPagePicContent\n      ensureModuleMangaHorizontalPagePicContent() => $_ensure(37);\n\n  @$pb.TagNumber(39)\n  ModuleMangaVerticalSlidePicContent get moduleMangaVerticalSlidePicContent =>\n      $_getN(38);\n  @$pb.TagNumber(39)\n  set moduleMangaVerticalSlidePicContent(\n          ModuleMangaVerticalSlidePicContent value) =>\n      $_setField(39, value);\n  @$pb.TagNumber(39)\n  $core.bool hasModuleMangaVerticalSlidePicContent() => $_has(38);\n  @$pb.TagNumber(39)\n  void clearModuleMangaVerticalSlidePicContent() => $_clearField(39);\n  @$pb.TagNumber(39)\n  ModuleMangaVerticalSlidePicContent\n      ensureModuleMangaVerticalSlidePicContent() => $_ensure(38);\n\n  @$pb.TagNumber(40)\n  ModuleMangaCoverPicContent get moduleMangaCoverPicContent => $_getN(39);\n  @$pb.TagNumber(40)\n  set moduleMangaCoverPicContent(ModuleMangaCoverPicContent value) =>\n      $_setField(40, value);\n  @$pb.TagNumber(40)\n  $core.bool hasModuleMangaCoverPicContent() => $_has(39);\n  @$pb.TagNumber(40)\n  void clearModuleMangaCoverPicContent() => $_clearField(40);\n  @$pb.TagNumber(40)\n  ModuleMangaCoverPicContent ensureModuleMangaCoverPicContent() => $_ensure(39);\n\n  @$pb.TagNumber(41)\n  ModuleAuthorForSubscribe get moduleAuthorForSubscribe => $_getN(40);\n  @$pb.TagNumber(41)\n  set moduleAuthorForSubscribe(ModuleAuthorForSubscribe value) =>\n      $_setField(41, value);\n  @$pb.TagNumber(41)\n  $core.bool hasModuleAuthorForSubscribe() => $_has(40);\n  @$pb.TagNumber(41)\n  void clearModuleAuthorForSubscribe() => $_clearField(41);\n  @$pb.TagNumber(41)\n  ModuleAuthorForSubscribe ensureModuleAuthorForSubscribe() => $_ensure(40);\n\n  @$pb.TagNumber(42)\n  ModuleAuthorSlim get moduleAuthorSlim => $_getN(41);\n  @$pb.TagNumber(42)\n  set moduleAuthorSlim(ModuleAuthorSlim value) => $_setField(42, value);\n  @$pb.TagNumber(42)\n  $core.bool hasModuleAuthorSlim() => $_has(41);\n  @$pb.TagNumber(42)\n  void clearModuleAuthorSlim() => $_clearField(42);\n  @$pb.TagNumber(42)\n  ModuleAuthorSlim ensureModuleAuthorSlim() => $_ensure(41);\n\n  @$pb.TagNumber(43)\n  ModuleMangaCollection get moduleMangaCollection => $_getN(42);\n  @$pb.TagNumber(43)\n  set moduleMangaCollection(ModuleMangaCollection value) =>\n      $_setField(43, value);\n  @$pb.TagNumber(43)\n  $core.bool hasModuleMangaCollection() => $_has(42);\n  @$pb.TagNumber(43)\n  void clearModuleMangaCollection() => $_clearField(43);\n  @$pb.TagNumber(43)\n  ModuleMangaCollection ensureModuleMangaCollection() => $_ensure(42);\n\n  @$pb.TagNumber(44)\n  ModuleCooperation get moduleCooperation => $_getN(43);\n  @$pb.TagNumber(44)\n  set moduleCooperation(ModuleCooperation value) => $_setField(44, value);\n  @$pb.TagNumber(44)\n  $core.bool hasModuleCooperation() => $_has(43);\n  @$pb.TagNumber(44)\n  void clearModuleCooperation() => $_clearField(44);\n  @$pb.TagNumber(44)\n  ModuleCooperation ensureModuleCooperation() => $_ensure(43);\n}\n\nclass ModuleAd extends $pb.GeneratedMessage {\n  factory ModuleAd({\n    $6.Any? sourceContent,\n    ModuleAuthor? moduleAuthor,\n    $core.int? adContentType,\n    $core.String? coverLeftText1,\n    $core.String? coverLeftText2,\n    $core.String? coverLeftText3,\n  }) {\n    final result = create();\n    if (sourceContent != null) result.sourceContent = sourceContent;\n    if (moduleAuthor != null) result.moduleAuthor = moduleAuthor;\n    if (adContentType != null) result.adContentType = adContentType;\n    if (coverLeftText1 != null) result.coverLeftText1 = coverLeftText1;\n    if (coverLeftText2 != null) result.coverLeftText2 = coverLeftText2;\n    if (coverLeftText3 != null) result.coverLeftText3 = coverLeftText3;\n    return result;\n  }\n\n  ModuleAd._();\n\n  factory ModuleAd.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleAd.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleAd',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<$6.Any>(1, _omitFieldNames ? '' : 'sourceContent',\n        subBuilder: $6.Any.create)\n    ..aOM<ModuleAuthor>(2, _omitFieldNames ? '' : 'moduleAuthor',\n        subBuilder: ModuleAuthor.create)\n    ..aI(3, _omitFieldNames ? '' : 'adContentType')\n    ..aOS(4, _omitFieldNames ? '' : 'coverLeftText1')\n    ..aOS(5, _omitFieldNames ? '' : 'coverLeftText2')\n    ..aOS(6, _omitFieldNames ? '' : 'coverLeftText3')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleAd clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleAd copyWith(void Function(ModuleAd) updates) =>\n      super.copyWith((message) => updates(message as ModuleAd)) as ModuleAd;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleAd create() => ModuleAd._();\n  @$core.override\n  ModuleAd createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleAd getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ModuleAd>(create);\n  static ModuleAd? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $6.Any get sourceContent => $_getN(0);\n  @$pb.TagNumber(1)\n  set sourceContent($6.Any value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSourceContent() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSourceContent() => $_clearField(1);\n  @$pb.TagNumber(1)\n  $6.Any ensureSourceContent() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  ModuleAuthor get moduleAuthor => $_getN(1);\n  @$pb.TagNumber(2)\n  set moduleAuthor(ModuleAuthor value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasModuleAuthor() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearModuleAuthor() => $_clearField(2);\n  @$pb.TagNumber(2)\n  ModuleAuthor ensureModuleAuthor() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.int get adContentType => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set adContentType($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAdContentType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAdContentType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get coverLeftText1 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set coverLeftText1($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCoverLeftText1() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCoverLeftText1() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get coverLeftText2 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set coverLeftText2($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCoverLeftText2() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCoverLeftText2() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get coverLeftText3 => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set coverLeftText3($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCoverLeftText3() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCoverLeftText3() => $_clearField(6);\n}\n\nenum ModuleAdditional_Item {\n  pgc,\n  goods,\n  vote,\n  common,\n  esport,\n  vote2,\n  ugc,\n  up,\n  article,\n  live,\n  music,\n  notSet\n}\n\nclass ModuleAdditional extends $pb.GeneratedMessage {\n  factory ModuleAdditional({\n    AdditionalType? type,\n    AdditionalPGC? pgc,\n    AdditionGoods? goods,\n    AdditionVote? vote,\n    AdditionCommon? common,\n    AdditionEsport? esport,\n    $fixnum.Int64? rid,\n    AdditionVote2? vote2,\n    AdditionUgc? ugc,\n    AdditionUP? up,\n    $core.bool? needWriteCalender,\n    AdditionArticle? article,\n    AdditionLiveRoom? live,\n    AdditionMusic? music,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (pgc != null) result.pgc = pgc;\n    if (goods != null) result.goods = goods;\n    if (vote != null) result.vote = vote;\n    if (common != null) result.common = common;\n    if (esport != null) result.esport = esport;\n    if (rid != null) result.rid = rid;\n    if (vote2 != null) result.vote2 = vote2;\n    if (ugc != null) result.ugc = ugc;\n    if (up != null) result.up = up;\n    if (needWriteCalender != null) result.needWriteCalender = needWriteCalender;\n    if (article != null) result.article = article;\n    if (live != null) result.live = live;\n    if (music != null) result.music = music;\n    return result;\n  }\n\n  ModuleAdditional._();\n\n  factory ModuleAdditional.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleAdditional.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, ModuleAdditional_Item>\n      _ModuleAdditional_ItemByTag = {\n    2: ModuleAdditional_Item.pgc,\n    3: ModuleAdditional_Item.goods,\n    4: ModuleAdditional_Item.vote,\n    5: ModuleAdditional_Item.common,\n    6: ModuleAdditional_Item.esport,\n    8: ModuleAdditional_Item.vote2,\n    9: ModuleAdditional_Item.ugc,\n    10: ModuleAdditional_Item.up,\n    12: ModuleAdditional_Item.article,\n    13: ModuleAdditional_Item.live,\n    14: ModuleAdditional_Item.music,\n    0: ModuleAdditional_Item.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleAdditional',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..oo(0, [2, 3, 4, 5, 6, 8, 9, 10, 12, 13, 14])\n    ..aE<AdditionalType>(1, _omitFieldNames ? '' : 'type',\n        enumValues: AdditionalType.values)\n    ..aOM<AdditionalPGC>(2, _omitFieldNames ? '' : 'pgc',\n        subBuilder: AdditionalPGC.create)\n    ..aOM<AdditionGoods>(3, _omitFieldNames ? '' : 'goods',\n        subBuilder: AdditionGoods.create)\n    ..aOM<AdditionVote>(4, _omitFieldNames ? '' : 'vote',\n        subBuilder: AdditionVote.create)\n    ..aOM<AdditionCommon>(5, _omitFieldNames ? '' : 'common',\n        subBuilder: AdditionCommon.create)\n    ..aOM<AdditionEsport>(6, _omitFieldNames ? '' : 'esport',\n        subBuilder: AdditionEsport.create)\n    ..aInt64(7, _omitFieldNames ? '' : 'rid')\n    ..aOM<AdditionVote2>(8, _omitFieldNames ? '' : 'vote2',\n        subBuilder: AdditionVote2.create)\n    ..aOM<AdditionUgc>(9, _omitFieldNames ? '' : 'ugc',\n        subBuilder: AdditionUgc.create)\n    ..aOM<AdditionUP>(10, _omitFieldNames ? '' : 'up',\n        subBuilder: AdditionUP.create)\n    ..aOB(11, _omitFieldNames ? '' : 'needWriteCalender')\n    ..aOM<AdditionArticle>(12, _omitFieldNames ? '' : 'article',\n        subBuilder: AdditionArticle.create)\n    ..aOM<AdditionLiveRoom>(13, _omitFieldNames ? '' : 'live',\n        subBuilder: AdditionLiveRoom.create)\n    ..aOM<AdditionMusic>(14, _omitFieldNames ? '' : 'music',\n        subBuilder: AdditionMusic.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleAdditional clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleAdditional copyWith(void Function(ModuleAdditional) updates) =>\n      super.copyWith((message) => updates(message as ModuleAdditional))\n          as ModuleAdditional;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleAdditional create() => ModuleAdditional._();\n  @$core.override\n  ModuleAdditional createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleAdditional getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleAdditional>(create);\n  static ModuleAdditional? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(8)\n  @$pb.TagNumber(9)\n  @$pb.TagNumber(10)\n  @$pb.TagNumber(12)\n  @$pb.TagNumber(13)\n  @$pb.TagNumber(14)\n  ModuleAdditional_Item whichItem() =>\n      _ModuleAdditional_ItemByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(8)\n  @$pb.TagNumber(9)\n  @$pb.TagNumber(10)\n  @$pb.TagNumber(12)\n  @$pb.TagNumber(13)\n  @$pb.TagNumber(14)\n  void clearItem() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  AdditionalType get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(AdditionalType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  AdditionalPGC get pgc => $_getN(1);\n  @$pb.TagNumber(2)\n  set pgc(AdditionalPGC value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPgc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPgc() => $_clearField(2);\n  @$pb.TagNumber(2)\n  AdditionalPGC ensurePgc() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  AdditionGoods get goods => $_getN(2);\n  @$pb.TagNumber(3)\n  set goods(AdditionGoods value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasGoods() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearGoods() => $_clearField(3);\n  @$pb.TagNumber(3)\n  AdditionGoods ensureGoods() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  AdditionVote get vote => $_getN(3);\n  @$pb.TagNumber(4)\n  set vote(AdditionVote value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasVote() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearVote() => $_clearField(4);\n  @$pb.TagNumber(4)\n  AdditionVote ensureVote() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  AdditionCommon get common => $_getN(4);\n  @$pb.TagNumber(5)\n  set common(AdditionCommon value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCommon() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCommon() => $_clearField(5);\n  @$pb.TagNumber(5)\n  AdditionCommon ensureCommon() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  AdditionEsport get esport => $_getN(5);\n  @$pb.TagNumber(6)\n  set esport(AdditionEsport value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasEsport() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearEsport() => $_clearField(6);\n  @$pb.TagNumber(6)\n  AdditionEsport ensureEsport() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get rid => $_getI64(6);\n  @$pb.TagNumber(7)\n  set rid($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasRid() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearRid() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  AdditionVote2 get vote2 => $_getN(7);\n  @$pb.TagNumber(8)\n  set vote2(AdditionVote2 value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasVote2() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearVote2() => $_clearField(8);\n  @$pb.TagNumber(8)\n  AdditionVote2 ensureVote2() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  AdditionUgc get ugc => $_getN(8);\n  @$pb.TagNumber(9)\n  set ugc(AdditionUgc value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasUgc() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearUgc() => $_clearField(9);\n  @$pb.TagNumber(9)\n  AdditionUgc ensureUgc() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  AdditionUP get up => $_getN(9);\n  @$pb.TagNumber(10)\n  set up(AdditionUP value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasUp() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearUp() => $_clearField(10);\n  @$pb.TagNumber(10)\n  AdditionUP ensureUp() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  $core.bool get needWriteCalender => $_getBF(10);\n  @$pb.TagNumber(11)\n  set needWriteCalender($core.bool value) => $_setBool(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasNeedWriteCalender() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearNeedWriteCalender() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  AdditionArticle get article => $_getN(11);\n  @$pb.TagNumber(12)\n  set article(AdditionArticle value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasArticle() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearArticle() => $_clearField(12);\n  @$pb.TagNumber(12)\n  AdditionArticle ensureArticle() => $_ensure(11);\n\n  @$pb.TagNumber(13)\n  AdditionLiveRoom get live => $_getN(12);\n  @$pb.TagNumber(13)\n  set live(AdditionLiveRoom value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasLive() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearLive() => $_clearField(13);\n  @$pb.TagNumber(13)\n  AdditionLiveRoom ensureLive() => $_ensure(12);\n\n  @$pb.TagNumber(14)\n  AdditionMusic get music => $_getN(13);\n  @$pb.TagNumber(14)\n  set music(AdditionMusic value) => $_setField(14, value);\n  @$pb.TagNumber(14)\n  $core.bool hasMusic() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearMusic() => $_clearField(14);\n  @$pb.TagNumber(14)\n  AdditionMusic ensureMusic() => $_ensure(13);\n}\n\nclass ModuleAuthor extends $pb.GeneratedMessage {\n  factory ModuleAuthor({\n    $fixnum.Int64? mid,\n    $core.String? ptimeLabelText,\n    UserInfo? author,\n    DecorateCard? decorateCard,\n    $core.String? uri,\n    $core.Iterable<ThreePointItem>? tpList,\n    ModuleAuthorBadgeType? badgeType,\n    ModuleAuthorBadgeButton? badgeButton,\n    $core.int? attend,\n    Relation? relation,\n    Weight? weight,\n    $core.bool? showFollow,\n    $core.bool? isTop,\n    $core.String? ptimeLocationText,\n    $core.bool? showLevel,\n    OnlyFans? onlyFans,\n    AuthorBadge? authorBadge,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (ptimeLabelText != null) result.ptimeLabelText = ptimeLabelText;\n    if (author != null) result.author = author;\n    if (decorateCard != null) result.decorateCard = decorateCard;\n    if (uri != null) result.uri = uri;\n    if (tpList != null) result.tpList.addAll(tpList);\n    if (badgeType != null) result.badgeType = badgeType;\n    if (badgeButton != null) result.badgeButton = badgeButton;\n    if (attend != null) result.attend = attend;\n    if (relation != null) result.relation = relation;\n    if (weight != null) result.weight = weight;\n    if (showFollow != null) result.showFollow = showFollow;\n    if (isTop != null) result.isTop = isTop;\n    if (ptimeLocationText != null) result.ptimeLocationText = ptimeLocationText;\n    if (showLevel != null) result.showLevel = showLevel;\n    if (onlyFans != null) result.onlyFans = onlyFans;\n    if (authorBadge != null) result.authorBadge = authorBadge;\n    return result;\n  }\n\n  ModuleAuthor._();\n\n  factory ModuleAuthor.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleAuthor.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleAuthor',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aOS(2, _omitFieldNames ? '' : 'ptimeLabelText')\n    ..aOM<UserInfo>(3, _omitFieldNames ? '' : 'author',\n        subBuilder: UserInfo.create)\n    ..aOM<DecorateCard>(4, _omitFieldNames ? '' : 'decorateCard',\n        subBuilder: DecorateCard.create)\n    ..aOS(5, _omitFieldNames ? '' : 'uri')\n    ..pPM<ThreePointItem>(6, _omitFieldNames ? '' : 'tpList',\n        subBuilder: ThreePointItem.create)\n    ..aE<ModuleAuthorBadgeType>(7, _omitFieldNames ? '' : 'badgeType',\n        enumValues: ModuleAuthorBadgeType.values)\n    ..aOM<ModuleAuthorBadgeButton>(8, _omitFieldNames ? '' : 'badgeButton',\n        subBuilder: ModuleAuthorBadgeButton.create)\n    ..aI(9, _omitFieldNames ? '' : 'attend')\n    ..aOM<Relation>(10, _omitFieldNames ? '' : 'relation',\n        subBuilder: Relation.create)\n    ..aOM<Weight>(11, _omitFieldNames ? '' : 'weight',\n        subBuilder: Weight.create)\n    ..aOB(12, _omitFieldNames ? '' : 'showFollow')\n    ..aOB(13, _omitFieldNames ? '' : 'isTop')\n    ..aOS(14, _omitFieldNames ? '' : 'ptimeLocationText')\n    ..aOB(15, _omitFieldNames ? '' : 'showLevel')\n    ..aOM<OnlyFans>(16, _omitFieldNames ? '' : 'onlyFans',\n        subBuilder: OnlyFans.create)\n    ..aOM<AuthorBadge>(17, _omitFieldNames ? '' : 'authorBadge',\n        subBuilder: AuthorBadge.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleAuthor clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleAuthor copyWith(void Function(ModuleAuthor) updates) =>\n      super.copyWith((message) => updates(message as ModuleAuthor))\n          as ModuleAuthor;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleAuthor create() => ModuleAuthor._();\n  @$core.override\n  ModuleAuthor createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleAuthor getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleAuthor>(create);\n  static ModuleAuthor? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get ptimeLabelText => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set ptimeLabelText($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPtimeLabelText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPtimeLabelText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  UserInfo get author => $_getN(2);\n  @$pb.TagNumber(3)\n  set author(UserInfo value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAuthor() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAuthor() => $_clearField(3);\n  @$pb.TagNumber(3)\n  UserInfo ensureAuthor() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  DecorateCard get decorateCard => $_getN(3);\n  @$pb.TagNumber(4)\n  set decorateCard(DecorateCard value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDecorateCard() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDecorateCard() => $_clearField(4);\n  @$pb.TagNumber(4)\n  DecorateCard ensureDecorateCard() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.String get uri => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set uri($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasUri() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearUri() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $pb.PbList<ThreePointItem> get tpList => $_getList(5);\n\n  @$pb.TagNumber(7)\n  ModuleAuthorBadgeType get badgeType => $_getN(6);\n  @$pb.TagNumber(7)\n  set badgeType(ModuleAuthorBadgeType value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBadgeType() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBadgeType() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  ModuleAuthorBadgeButton get badgeButton => $_getN(7);\n  @$pb.TagNumber(8)\n  set badgeButton(ModuleAuthorBadgeButton value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasBadgeButton() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearBadgeButton() => $_clearField(8);\n  @$pb.TagNumber(8)\n  ModuleAuthorBadgeButton ensureBadgeButton() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  $core.int get attend => $_getIZ(8);\n  @$pb.TagNumber(9)\n  set attend($core.int value) => $_setSignedInt32(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasAttend() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearAttend() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  Relation get relation => $_getN(9);\n  @$pb.TagNumber(10)\n  set relation(Relation value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasRelation() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearRelation() => $_clearField(10);\n  @$pb.TagNumber(10)\n  Relation ensureRelation() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  Weight get weight => $_getN(10);\n  @$pb.TagNumber(11)\n  set weight(Weight value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasWeight() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearWeight() => $_clearField(11);\n  @$pb.TagNumber(11)\n  Weight ensureWeight() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  $core.bool get showFollow => $_getBF(11);\n  @$pb.TagNumber(12)\n  set showFollow($core.bool value) => $_setBool(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasShowFollow() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearShowFollow() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.bool get isTop => $_getBF(12);\n  @$pb.TagNumber(13)\n  set isTop($core.bool value) => $_setBool(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasIsTop() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearIsTop() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.String get ptimeLocationText => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set ptimeLocationText($core.String value) => $_setString(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasPtimeLocationText() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearPtimeLocationText() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $core.bool get showLevel => $_getBF(14);\n  @$pb.TagNumber(15)\n  set showLevel($core.bool value) => $_setBool(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasShowLevel() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearShowLevel() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  OnlyFans get onlyFans => $_getN(15);\n  @$pb.TagNumber(16)\n  set onlyFans(OnlyFans value) => $_setField(16, value);\n  @$pb.TagNumber(16)\n  $core.bool hasOnlyFans() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearOnlyFans() => $_clearField(16);\n  @$pb.TagNumber(16)\n  OnlyFans ensureOnlyFans() => $_ensure(15);\n\n  @$pb.TagNumber(17)\n  AuthorBadge get authorBadge => $_getN(16);\n  @$pb.TagNumber(17)\n  set authorBadge(AuthorBadge value) => $_setField(17, value);\n  @$pb.TagNumber(17)\n  $core.bool hasAuthorBadge() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearAuthorBadge() => $_clearField(17);\n  @$pb.TagNumber(17)\n  AuthorBadge ensureAuthorBadge() => $_ensure(16);\n}\n\nclass ModuleAuthorBadgeButton extends $pb.GeneratedMessage {\n  factory ModuleAuthorBadgeButton({\n    $core.String? icon,\n    $core.String? title,\n    $core.int? state,\n    $fixnum.Int64? id,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (title != null) result.title = title;\n    if (state != null) result.state = state;\n    if (id != null) result.id = id;\n    return result;\n  }\n\n  ModuleAuthorBadgeButton._();\n\n  factory ModuleAuthorBadgeButton.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleAuthorBadgeButton.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleAuthorBadgeButton',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aI(3, _omitFieldNames ? '' : 'state')\n    ..aInt64(4, _omitFieldNames ? '' : 'id')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleAuthorBadgeButton clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleAuthorBadgeButton copyWith(\n          void Function(ModuleAuthorBadgeButton) updates) =>\n      super.copyWith((message) => updates(message as ModuleAuthorBadgeButton))\n          as ModuleAuthorBadgeButton;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleAuthorBadgeButton create() => ModuleAuthorBadgeButton._();\n  @$core.override\n  ModuleAuthorBadgeButton createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleAuthorBadgeButton getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleAuthorBadgeButton>(create);\n  static ModuleAuthorBadgeButton? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get state => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set state($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasState() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearState() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get id => $_getI64(3);\n  @$pb.TagNumber(4)\n  set id($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasId() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearId() => $_clearField(4);\n}\n\nclass ModuleAuthorForSubscribe extends $pb.GeneratedMessage {\n  factory ModuleAuthorForSubscribe({\n    $core.String? cover,\n    $core.String? title,\n    $core.String? subTitle,\n    SubscribeButton? subscribeBtn,\n  }) {\n    final result = create();\n    if (cover != null) result.cover = cover;\n    if (title != null) result.title = title;\n    if (subTitle != null) result.subTitle = subTitle;\n    if (subscribeBtn != null) result.subscribeBtn = subscribeBtn;\n    return result;\n  }\n\n  ModuleAuthorForSubscribe._();\n\n  factory ModuleAuthorForSubscribe.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleAuthorForSubscribe.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleAuthorForSubscribe',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'cover')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'subTitle')\n    ..aOM<SubscribeButton>(4, _omitFieldNames ? '' : 'subscribeBtn',\n        subBuilder: SubscribeButton.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleAuthorForSubscribe clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleAuthorForSubscribe copyWith(\n          void Function(ModuleAuthorForSubscribe) updates) =>\n      super.copyWith((message) => updates(message as ModuleAuthorForSubscribe))\n          as ModuleAuthorForSubscribe;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleAuthorForSubscribe create() => ModuleAuthorForSubscribe._();\n  @$core.override\n  ModuleAuthorForSubscribe createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleAuthorForSubscribe getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleAuthorForSubscribe>(create);\n  static ModuleAuthorForSubscribe? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get cover => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set cover($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCover() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCover() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get subTitle => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set subTitle($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSubTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSubTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  SubscribeButton get subscribeBtn => $_getN(3);\n  @$pb.TagNumber(4)\n  set subscribeBtn(SubscribeButton value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSubscribeBtn() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSubscribeBtn() => $_clearField(4);\n  @$pb.TagNumber(4)\n  SubscribeButton ensureSubscribeBtn() => $_ensure(3);\n}\n\nclass ModuleAuthorForward extends $pb.GeneratedMessage {\n  factory ModuleAuthorForward({\n    $core.Iterable<ModuleAuthorForwardTitle>? title,\n    $core.String? url,\n    $fixnum.Int64? uid,\n    $core.String? ptimeLabelText,\n    $core.bool? showFollow,\n    $core.String? faceUrl,\n    Relation? relation,\n    $core.Iterable<ThreePointItem>? tpList,\n  }) {\n    final result = create();\n    if (title != null) result.title.addAll(title);\n    if (url != null) result.url = url;\n    if (uid != null) result.uid = uid;\n    if (ptimeLabelText != null) result.ptimeLabelText = ptimeLabelText;\n    if (showFollow != null) result.showFollow = showFollow;\n    if (faceUrl != null) result.faceUrl = faceUrl;\n    if (relation != null) result.relation = relation;\n    if (tpList != null) result.tpList.addAll(tpList);\n    return result;\n  }\n\n  ModuleAuthorForward._();\n\n  factory ModuleAuthorForward.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleAuthorForward.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleAuthorForward',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<ModuleAuthorForwardTitle>(1, _omitFieldNames ? '' : 'title',\n        subBuilder: ModuleAuthorForwardTitle.create)\n    ..aOS(2, _omitFieldNames ? '' : 'url')\n    ..aInt64(3, _omitFieldNames ? '' : 'uid')\n    ..aOS(4, _omitFieldNames ? '' : 'ptimeLabelText')\n    ..aOB(5, _omitFieldNames ? '' : 'showFollow')\n    ..aOS(6, _omitFieldNames ? '' : 'faceUrl')\n    ..aOM<Relation>(7, _omitFieldNames ? '' : 'relation',\n        subBuilder: Relation.create)\n    ..pPM<ThreePointItem>(8, _omitFieldNames ? '' : 'tpList',\n        subBuilder: ThreePointItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleAuthorForward clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleAuthorForward copyWith(void Function(ModuleAuthorForward) updates) =>\n      super.copyWith((message) => updates(message as ModuleAuthorForward))\n          as ModuleAuthorForward;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleAuthorForward create() => ModuleAuthorForward._();\n  @$core.override\n  ModuleAuthorForward createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleAuthorForward getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleAuthorForward>(create);\n  static ModuleAuthorForward? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<ModuleAuthorForwardTitle> get title => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.String get url => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set url($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUrl() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get uid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set uid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUid() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get ptimeLabelText => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set ptimeLabelText($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPtimeLabelText() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPtimeLabelText() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.bool get showFollow => $_getBF(4);\n  @$pb.TagNumber(5)\n  set showFollow($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasShowFollow() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearShowFollow() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get faceUrl => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set faceUrl($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasFaceUrl() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearFaceUrl() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  Relation get relation => $_getN(6);\n  @$pb.TagNumber(7)\n  set relation(Relation value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasRelation() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearRelation() => $_clearField(7);\n  @$pb.TagNumber(7)\n  Relation ensureRelation() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  $pb.PbList<ThreePointItem> get tpList => $_getList(7);\n}\n\nclass ModuleAuthorForwardTitle extends $pb.GeneratedMessage {\n  factory ModuleAuthorForwardTitle({\n    $core.String? text,\n    $core.String? url,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (url != null) result.url = url;\n    return result;\n  }\n\n  ModuleAuthorForwardTitle._();\n\n  factory ModuleAuthorForwardTitle.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleAuthorForwardTitle.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleAuthorForwardTitle',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aOS(2, _omitFieldNames ? '' : 'url')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleAuthorForwardTitle clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleAuthorForwardTitle copyWith(\n          void Function(ModuleAuthorForwardTitle) updates) =>\n      super.copyWith((message) => updates(message as ModuleAuthorForwardTitle))\n          as ModuleAuthorForwardTitle;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleAuthorForwardTitle create() => ModuleAuthorForwardTitle._();\n  @$core.override\n  ModuleAuthorForwardTitle createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleAuthorForwardTitle getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleAuthorForwardTitle>(create);\n  static ModuleAuthorForwardTitle? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get url => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set url($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUrl() => $_clearField(2);\n}\n\nclass ModuleAuthorSlim extends $pb.GeneratedMessage {\n  factory ModuleAuthorSlim({\n    BasicUserInfoV2? userInfo,\n    $core.String? ptimeLabelText,\n  }) {\n    final result = create();\n    if (userInfo != null) result.userInfo = userInfo;\n    if (ptimeLabelText != null) result.ptimeLabelText = ptimeLabelText;\n    return result;\n  }\n\n  ModuleAuthorSlim._();\n\n  factory ModuleAuthorSlim.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleAuthorSlim.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleAuthorSlim',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<BasicUserInfoV2>(1, _omitFieldNames ? '' : 'userInfo',\n        subBuilder: BasicUserInfoV2.create)\n    ..aOS(2, _omitFieldNames ? '' : 'ptimeLabelText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleAuthorSlim clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleAuthorSlim copyWith(void Function(ModuleAuthorSlim) updates) =>\n      super.copyWith((message) => updates(message as ModuleAuthorSlim))\n          as ModuleAuthorSlim;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleAuthorSlim create() => ModuleAuthorSlim._();\n  @$core.override\n  ModuleAuthorSlim createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleAuthorSlim getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleAuthorSlim>(create);\n  static ModuleAuthorSlim? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  BasicUserInfoV2 get userInfo => $_getN(0);\n  @$pb.TagNumber(1)\n  set userInfo(BasicUserInfoV2 value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUserInfo() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUserInfo() => $_clearField(1);\n  @$pb.TagNumber(1)\n  BasicUserInfoV2 ensureUserInfo() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get ptimeLabelText => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set ptimeLabelText($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPtimeLabelText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPtimeLabelText() => $_clearField(2);\n}\n\nenum ModuleBanner_Item { user, notSet }\n\nclass ModuleBanner extends $pb.GeneratedMessage {\n  factory ModuleBanner({\n    $core.String? title,\n    ModuleBannerType? type,\n    ModuleBannerUser? user,\n    $core.String? dislikeText,\n    $core.String? dislikeIcon,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (type != null) result.type = type;\n    if (user != null) result.user = user;\n    if (dislikeText != null) result.dislikeText = dislikeText;\n    if (dislikeIcon != null) result.dislikeIcon = dislikeIcon;\n    return result;\n  }\n\n  ModuleBanner._();\n\n  factory ModuleBanner.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleBanner.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, ModuleBanner_Item> _ModuleBanner_ItemByTag =\n      {3: ModuleBanner_Item.user, 0: ModuleBanner_Item.notSet};\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleBanner',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..oo(0, [3])\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aE<ModuleBannerType>(2, _omitFieldNames ? '' : 'type',\n        enumValues: ModuleBannerType.values)\n    ..aOM<ModuleBannerUser>(3, _omitFieldNames ? '' : 'user',\n        subBuilder: ModuleBannerUser.create)\n    ..aOS(4, _omitFieldNames ? '' : 'dislikeText')\n    ..aOS(5, _omitFieldNames ? '' : 'dislikeIcon')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleBanner clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleBanner copyWith(void Function(ModuleBanner) updates) =>\n      super.copyWith((message) => updates(message as ModuleBanner))\n          as ModuleBanner;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleBanner create() => ModuleBanner._();\n  @$core.override\n  ModuleBanner createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleBanner getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleBanner>(create);\n  static ModuleBanner? _defaultInstance;\n\n  @$pb.TagNumber(3)\n  ModuleBanner_Item whichItem() => _ModuleBanner_ItemByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(3)\n  void clearItem() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  ModuleBannerType get type => $_getN(1);\n  @$pb.TagNumber(2)\n  set type(ModuleBannerType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  ModuleBannerUser get user => $_getN(2);\n  @$pb.TagNumber(3)\n  set user(ModuleBannerUser value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUser() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUser() => $_clearField(3);\n  @$pb.TagNumber(3)\n  ModuleBannerUser ensureUser() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.String get dislikeText => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set dislikeText($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDislikeText() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDislikeText() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get dislikeIcon => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set dislikeIcon($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDislikeIcon() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDislikeIcon() => $_clearField(5);\n}\n\nclass ModuleBannerUser extends $pb.GeneratedMessage {\n  factory ModuleBannerUser({\n    $core.Iterable<ModuleBannerUserItem>? list,\n  }) {\n    final result = create();\n    if (list != null) result.list.addAll(list);\n    return result;\n  }\n\n  ModuleBannerUser._();\n\n  factory ModuleBannerUser.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleBannerUser.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleBannerUser',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<ModuleBannerUserItem>(1, _omitFieldNames ? '' : 'list',\n        subBuilder: ModuleBannerUserItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleBannerUser clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleBannerUser copyWith(void Function(ModuleBannerUser) updates) =>\n      super.copyWith((message) => updates(message as ModuleBannerUser))\n          as ModuleBannerUser;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleBannerUser create() => ModuleBannerUser._();\n  @$core.override\n  ModuleBannerUser createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleBannerUser getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleBannerUser>(create);\n  static ModuleBannerUser? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<ModuleBannerUserItem> get list => $_getList(0);\n}\n\nclass ModuleBannerUserItem extends $pb.GeneratedMessage {\n  factory ModuleBannerUserItem({\n    $core.String? face,\n    $core.String? name,\n    $fixnum.Int64? uid,\n    LiveState? liveState,\n    OfficialVerify? official,\n    VipInfo? vip,\n    $core.String? label,\n    AdditionalButton? button,\n    $core.String? uri,\n    Relation? relation,\n  }) {\n    final result = create();\n    if (face != null) result.face = face;\n    if (name != null) result.name = name;\n    if (uid != null) result.uid = uid;\n    if (liveState != null) result.liveState = liveState;\n    if (official != null) result.official = official;\n    if (vip != null) result.vip = vip;\n    if (label != null) result.label = label;\n    if (button != null) result.button = button;\n    if (uri != null) result.uri = uri;\n    if (relation != null) result.relation = relation;\n    return result;\n  }\n\n  ModuleBannerUserItem._();\n\n  factory ModuleBannerUserItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleBannerUserItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleBannerUserItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'face')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aInt64(3, _omitFieldNames ? '' : 'uid')\n    ..aE<LiveState>(4, _omitFieldNames ? '' : 'liveState',\n        enumValues: LiveState.values)\n    ..aOM<OfficialVerify>(5, _omitFieldNames ? '' : 'official',\n        subBuilder: OfficialVerify.create)\n    ..aOM<VipInfo>(6, _omitFieldNames ? '' : 'vip', subBuilder: VipInfo.create)\n    ..aOS(7, _omitFieldNames ? '' : 'label')\n    ..aOM<AdditionalButton>(8, _omitFieldNames ? '' : 'button',\n        subBuilder: AdditionalButton.create)\n    ..aOS(9, _omitFieldNames ? '' : 'uri')\n    ..aOM<Relation>(10, _omitFieldNames ? '' : 'relation',\n        subBuilder: Relation.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleBannerUserItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleBannerUserItem copyWith(void Function(ModuleBannerUserItem) updates) =>\n      super.copyWith((message) => updates(message as ModuleBannerUserItem))\n          as ModuleBannerUserItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleBannerUserItem create() => ModuleBannerUserItem._();\n  @$core.override\n  ModuleBannerUserItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleBannerUserItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleBannerUserItem>(create);\n  static ModuleBannerUserItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get face => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set face($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFace() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFace() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get uid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set uid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUid() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  LiveState get liveState => $_getN(3);\n  @$pb.TagNumber(4)\n  set liveState(LiveState value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLiveState() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLiveState() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  OfficialVerify get official => $_getN(4);\n  @$pb.TagNumber(5)\n  set official(OfficialVerify value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasOfficial() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearOfficial() => $_clearField(5);\n  @$pb.TagNumber(5)\n  OfficialVerify ensureOfficial() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  VipInfo get vip => $_getN(5);\n  @$pb.TagNumber(6)\n  set vip(VipInfo value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasVip() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearVip() => $_clearField(6);\n  @$pb.TagNumber(6)\n  VipInfo ensureVip() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $core.String get label => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set label($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasLabel() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearLabel() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  AdditionalButton get button => $_getN(7);\n  @$pb.TagNumber(8)\n  set button(AdditionalButton value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasButton() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearButton() => $_clearField(8);\n  @$pb.TagNumber(8)\n  AdditionalButton ensureButton() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  $core.String get uri => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set uri($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasUri() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearUri() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  Relation get relation => $_getN(9);\n  @$pb.TagNumber(10)\n  set relation(Relation value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasRelation() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearRelation() => $_clearField(10);\n  @$pb.TagNumber(10)\n  Relation ensureRelation() => $_ensure(9);\n}\n\nclass ModuleBlocked extends $pb.GeneratedMessage {\n  factory ModuleBlocked({\n    ImageSet? icon,\n    ImageSet? bgImg,\n    $core.String? hintMessage,\n    IconButton? actBtn,\n    MdlBlockedStyle? blockStyle,\n    $core.String? subHintMessage,\n    OneLineText? videoBottomTextUpper,\n    OneLineText? videoBottomTextLower,\n    $core.String? archiveTitle,\n    OneLineText? hintMessageOneLine,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (bgImg != null) result.bgImg = bgImg;\n    if (hintMessage != null) result.hintMessage = hintMessage;\n    if (actBtn != null) result.actBtn = actBtn;\n    if (blockStyle != null) result.blockStyle = blockStyle;\n    if (subHintMessage != null) result.subHintMessage = subHintMessage;\n    if (videoBottomTextUpper != null)\n      result.videoBottomTextUpper = videoBottomTextUpper;\n    if (videoBottomTextLower != null)\n      result.videoBottomTextLower = videoBottomTextLower;\n    if (archiveTitle != null) result.archiveTitle = archiveTitle;\n    if (hintMessageOneLine != null)\n      result.hintMessageOneLine = hintMessageOneLine;\n    return result;\n  }\n\n  ModuleBlocked._();\n\n  factory ModuleBlocked.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleBlocked.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleBlocked',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<ImageSet>(1, _omitFieldNames ? '' : 'icon',\n        subBuilder: ImageSet.create)\n    ..aOM<ImageSet>(2, _omitFieldNames ? '' : 'bgImg',\n        subBuilder: ImageSet.create)\n    ..aOS(3, _omitFieldNames ? '' : 'hintMessage')\n    ..aOM<IconButton>(4, _omitFieldNames ? '' : 'actBtn',\n        subBuilder: IconButton.create)\n    ..aE<MdlBlockedStyle>(5, _omitFieldNames ? '' : 'blockStyle',\n        enumValues: MdlBlockedStyle.values)\n    ..aOS(6, _omitFieldNames ? '' : 'subHintMessage')\n    ..aOM<OneLineText>(7, _omitFieldNames ? '' : 'videoBottomTextUpper',\n        subBuilder: OneLineText.create)\n    ..aOM<OneLineText>(8, _omitFieldNames ? '' : 'videoBottomTextLower',\n        subBuilder: OneLineText.create)\n    ..aOS(9, _omitFieldNames ? '' : 'archiveTitle')\n    ..aOM<OneLineText>(10, _omitFieldNames ? '' : 'hintMessageOneLine',\n        subBuilder: OneLineText.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleBlocked clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleBlocked copyWith(void Function(ModuleBlocked) updates) =>\n      super.copyWith((message) => updates(message as ModuleBlocked))\n          as ModuleBlocked;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleBlocked create() => ModuleBlocked._();\n  @$core.override\n  ModuleBlocked createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleBlocked getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleBlocked>(create);\n  static ModuleBlocked? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  ImageSet get icon => $_getN(0);\n  @$pb.TagNumber(1)\n  set icon(ImageSet value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n  @$pb.TagNumber(1)\n  ImageSet ensureIcon() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  ImageSet get bgImg => $_getN(1);\n  @$pb.TagNumber(2)\n  set bgImg(ImageSet value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBgImg() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBgImg() => $_clearField(2);\n  @$pb.TagNumber(2)\n  ImageSet ensureBgImg() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.String get hintMessage => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set hintMessage($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasHintMessage() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearHintMessage() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  IconButton get actBtn => $_getN(3);\n  @$pb.TagNumber(4)\n  set actBtn(IconButton value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasActBtn() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearActBtn() => $_clearField(4);\n  @$pb.TagNumber(4)\n  IconButton ensureActBtn() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  MdlBlockedStyle get blockStyle => $_getN(4);\n  @$pb.TagNumber(5)\n  set blockStyle(MdlBlockedStyle value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBlockStyle() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBlockStyle() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get subHintMessage => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set subHintMessage($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasSubHintMessage() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearSubHintMessage() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  OneLineText get videoBottomTextUpper => $_getN(6);\n  @$pb.TagNumber(7)\n  set videoBottomTextUpper(OneLineText value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasVideoBottomTextUpper() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearVideoBottomTextUpper() => $_clearField(7);\n  @$pb.TagNumber(7)\n  OneLineText ensureVideoBottomTextUpper() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  OneLineText get videoBottomTextLower => $_getN(7);\n  @$pb.TagNumber(8)\n  set videoBottomTextLower(OneLineText value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasVideoBottomTextLower() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearVideoBottomTextLower() => $_clearField(8);\n  @$pb.TagNumber(8)\n  OneLineText ensureVideoBottomTextLower() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  $core.String get archiveTitle => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set archiveTitle($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasArchiveTitle() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearArchiveTitle() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  OneLineText get hintMessageOneLine => $_getN(9);\n  @$pb.TagNumber(10)\n  set hintMessageOneLine(OneLineText value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasHintMessageOneLine() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearHintMessageOneLine() => $_clearField(10);\n  @$pb.TagNumber(10)\n  OneLineText ensureHintMessageOneLine() => $_ensure(9);\n}\n\nclass ModuleButtom extends $pb.GeneratedMessage {\n  factory ModuleButtom({\n    ModuleStat? moduleStat,\n    $core.bool? commentBox,\n    $core.String? commentBoxMsg,\n    $core.Iterable<$core.int>? interactionIcons,\n    $core.Iterable<InteractionFace>? faces,\n  }) {\n    final result = create();\n    if (moduleStat != null) result.moduleStat = moduleStat;\n    if (commentBox != null) result.commentBox = commentBox;\n    if (commentBoxMsg != null) result.commentBoxMsg = commentBoxMsg;\n    if (interactionIcons != null)\n      result.interactionIcons.addAll(interactionIcons);\n    if (faces != null) result.faces.addAll(faces);\n    return result;\n  }\n\n  ModuleButtom._();\n\n  factory ModuleButtom.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleButtom.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleButtom',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<ModuleStat>(1, _omitFieldNames ? '' : 'moduleStat',\n        subBuilder: ModuleStat.create)\n    ..aOB(2, _omitFieldNames ? '' : 'commentBox')\n    ..aOS(3, _omitFieldNames ? '' : 'commentBoxMsg')\n    ..p<$core.int>(\n        4, _omitFieldNames ? '' : 'interactionIcons', $pb.PbFieldType.K3)\n    ..pPM<InteractionFace>(5, _omitFieldNames ? '' : 'faces',\n        subBuilder: InteractionFace.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleButtom clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleButtom copyWith(void Function(ModuleButtom) updates) =>\n      super.copyWith((message) => updates(message as ModuleButtom))\n          as ModuleButtom;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleButtom create() => ModuleButtom._();\n  @$core.override\n  ModuleButtom createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleButtom getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleButtom>(create);\n  static ModuleButtom? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  ModuleStat get moduleStat => $_getN(0);\n  @$pb.TagNumber(1)\n  set moduleStat(ModuleStat value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasModuleStat() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearModuleStat() => $_clearField(1);\n  @$pb.TagNumber(1)\n  ModuleStat ensureModuleStat() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.bool get commentBox => $_getBF(1);\n  @$pb.TagNumber(2)\n  set commentBox($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCommentBox() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCommentBox() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get commentBoxMsg => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set commentBoxMsg($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCommentBoxMsg() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCommentBoxMsg() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<$core.int> get interactionIcons => $_getList(3);\n\n  @$pb.TagNumber(5)\n  $pb.PbList<InteractionFace> get faces => $_getList(4);\n}\n\nclass ModuleButton extends $pb.GeneratedMessage {\n  factory ModuleButton({\n    IconButton? btn,\n  }) {\n    final result = create();\n    if (btn != null) result.btn = btn;\n    return result;\n  }\n\n  ModuleButton._();\n\n  factory ModuleButton.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleButton.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleButton',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<IconButton>(1, _omitFieldNames ? '' : 'btn',\n        subBuilder: IconButton.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleButton clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleButton copyWith(void Function(ModuleButton) updates) =>\n      super.copyWith((message) => updates(message as ModuleButton))\n          as ModuleButton;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleButton create() => ModuleButton._();\n  @$core.override\n  ModuleButton createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleButton getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleButton>(create);\n  static ModuleButton? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  IconButton get btn => $_getN(0);\n  @$pb.TagNumber(1)\n  set btn(IconButton value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBtn() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBtn() => $_clearField(1);\n  @$pb.TagNumber(1)\n  IconButton ensureBtn() => $_ensure(0);\n}\n\nclass ModuleComment extends $pb.GeneratedMessage {\n  factory ModuleComment({\n    $core.Iterable<CmtShowItem>? cmtShowItem,\n  }) {\n    final result = create();\n    if (cmtShowItem != null) result.cmtShowItem.addAll(cmtShowItem);\n    return result;\n  }\n\n  ModuleComment._();\n\n  factory ModuleComment.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleComment.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleComment',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<CmtShowItem>(1, _omitFieldNames ? '' : 'cmtShowItem',\n        subBuilder: CmtShowItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleComment clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleComment copyWith(void Function(ModuleComment) updates) =>\n      super.copyWith((message) => updates(message as ModuleComment))\n          as ModuleComment;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleComment create() => ModuleComment._();\n  @$core.override\n  ModuleComment createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleComment getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleComment>(create);\n  static ModuleComment? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<CmtShowItem> get cmtShowItem => $_getList(0);\n}\n\nclass ModuleCooperation extends $pb.GeneratedMessage {\n  factory ModuleCooperation({\n    $core.String? oid,\n    $core.Iterable<CooperationUpInfo>? upList,\n    IconButton? moreBtn,\n    $core.Iterable<ThreePointItem>? tpList,\n    $core.String? floatTitle,\n  }) {\n    final result = create();\n    if (oid != null) result.oid = oid;\n    if (upList != null) result.upList.addAll(upList);\n    if (moreBtn != null) result.moreBtn = moreBtn;\n    if (tpList != null) result.tpList.addAll(tpList);\n    if (floatTitle != null) result.floatTitle = floatTitle;\n    return result;\n  }\n\n  ModuleCooperation._();\n\n  factory ModuleCooperation.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleCooperation.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleCooperation',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'oid')\n    ..pPM<CooperationUpInfo>(2, _omitFieldNames ? '' : 'upList',\n        subBuilder: CooperationUpInfo.create)\n    ..aOM<IconButton>(3, _omitFieldNames ? '' : 'moreBtn',\n        subBuilder: IconButton.create)\n    ..pPM<ThreePointItem>(4, _omitFieldNames ? '' : 'tpList',\n        subBuilder: ThreePointItem.create)\n    ..aOS(5, _omitFieldNames ? '' : 'floatTitle')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleCooperation clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleCooperation copyWith(void Function(ModuleCooperation) updates) =>\n      super.copyWith((message) => updates(message as ModuleCooperation))\n          as ModuleCooperation;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleCooperation create() => ModuleCooperation._();\n  @$core.override\n  ModuleCooperation createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleCooperation getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleCooperation>(create);\n  static ModuleCooperation? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get oid => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set oid($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<CooperationUpInfo> get upList => $_getList(1);\n\n  @$pb.TagNumber(3)\n  IconButton get moreBtn => $_getN(2);\n  @$pb.TagNumber(3)\n  set moreBtn(IconButton value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasMoreBtn() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearMoreBtn() => $_clearField(3);\n  @$pb.TagNumber(3)\n  IconButton ensureMoreBtn() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<ThreePointItem> get tpList => $_getList(3);\n\n  @$pb.TagNumber(5)\n  $core.String get floatTitle => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set floatTitle($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasFloatTitle() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearFloatTitle() => $_clearField(5);\n}\n\nclass ModuleCopyright extends $pb.GeneratedMessage {\n  factory ModuleCopyright({\n    $core.String? leftText,\n    $core.String? rightText,\n  }) {\n    final result = create();\n    if (leftText != null) result.leftText = leftText;\n    if (rightText != null) result.rightText = rightText;\n    return result;\n  }\n\n  ModuleCopyright._();\n\n  factory ModuleCopyright.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleCopyright.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleCopyright',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'leftText')\n    ..aOS(2, _omitFieldNames ? '' : 'rightText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleCopyright clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleCopyright copyWith(void Function(ModuleCopyright) updates) =>\n      super.copyWith((message) => updates(message as ModuleCopyright))\n          as ModuleCopyright;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleCopyright create() => ModuleCopyright._();\n  @$core.override\n  ModuleCopyright createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleCopyright getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleCopyright>(create);\n  static ModuleCopyright? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get leftText => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set leftText($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLeftText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLeftText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get rightText => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set rightText($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasRightText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRightText() => $_clearField(2);\n}\n\nclass ModuleDesc extends $pb.GeneratedMessage {\n  factory ModuleDesc({\n    $core.Iterable<Description>? desc,\n    $core.String? jumpUri,\n    $core.String? text,\n  }) {\n    final result = create();\n    if (desc != null) result.desc.addAll(desc);\n    if (jumpUri != null) result.jumpUri = jumpUri;\n    if (text != null) result.text = text;\n    return result;\n  }\n\n  ModuleDesc._();\n\n  factory ModuleDesc.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleDesc.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleDesc',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<Description>(1, _omitFieldNames ? '' : 'desc',\n        subBuilder: Description.create)\n    ..aOS(2, _omitFieldNames ? '' : 'jumpUri')\n    ..aOS(3, _omitFieldNames ? '' : 'text')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleDesc clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleDesc copyWith(void Function(ModuleDesc) updates) =>\n      super.copyWith((message) => updates(message as ModuleDesc)) as ModuleDesc;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleDesc create() => ModuleDesc._();\n  @$core.override\n  ModuleDesc createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleDesc getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleDesc>(create);\n  static ModuleDesc? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<Description> get desc => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.String get jumpUri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set jumpUri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasJumpUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearJumpUri() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get text => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set text($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasText() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearText() => $_clearField(3);\n}\n\nclass ModuleDescGoods extends $pb.GeneratedMessage {\n  factory ModuleDescGoods({\n    $core.int? sourceType,\n    $core.String? jumpUrl,\n    $core.String? schemaUrl,\n    $fixnum.Int64? itemId,\n    $core.Iterable<$core.String>? openWhiteList,\n    $core.bool? userWebV2,\n    $core.String? adMark,\n    $core.String? schemaPackageName,\n    GoodsJumpType? jumpType,\n    $core.String? appName,\n  }) {\n    final result = create();\n    if (sourceType != null) result.sourceType = sourceType;\n    if (jumpUrl != null) result.jumpUrl = jumpUrl;\n    if (schemaUrl != null) result.schemaUrl = schemaUrl;\n    if (itemId != null) result.itemId = itemId;\n    if (openWhiteList != null) result.openWhiteList.addAll(openWhiteList);\n    if (userWebV2 != null) result.userWebV2 = userWebV2;\n    if (adMark != null) result.adMark = adMark;\n    if (schemaPackageName != null) result.schemaPackageName = schemaPackageName;\n    if (jumpType != null) result.jumpType = jumpType;\n    if (appName != null) result.appName = appName;\n    return result;\n  }\n\n  ModuleDescGoods._();\n\n  factory ModuleDescGoods.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleDescGoods.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleDescGoods',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'sourceType')\n    ..aOS(2, _omitFieldNames ? '' : 'jumpUrl')\n    ..aOS(3, _omitFieldNames ? '' : 'schemaUrl')\n    ..aInt64(4, _omitFieldNames ? '' : 'itemId')\n    ..pPS(5, _omitFieldNames ? '' : 'openWhiteList')\n    ..aOB(6, _omitFieldNames ? '' : 'userWebV2')\n    ..aOS(7, _omitFieldNames ? '' : 'adMark')\n    ..aOS(8, _omitFieldNames ? '' : 'schemaPackageName')\n    ..aE<GoodsJumpType>(9, _omitFieldNames ? '' : 'jumpType',\n        enumValues: GoodsJumpType.values)\n    ..aOS(10, _omitFieldNames ? '' : 'appName')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleDescGoods clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleDescGoods copyWith(void Function(ModuleDescGoods) updates) =>\n      super.copyWith((message) => updates(message as ModuleDescGoods))\n          as ModuleDescGoods;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleDescGoods create() => ModuleDescGoods._();\n  @$core.override\n  ModuleDescGoods createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleDescGoods getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleDescGoods>(create);\n  static ModuleDescGoods? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get sourceType => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set sourceType($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSourceType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSourceType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get jumpUrl => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set jumpUrl($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasJumpUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearJumpUrl() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get schemaUrl => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set schemaUrl($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSchemaUrl() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSchemaUrl() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get itemId => $_getI64(3);\n  @$pb.TagNumber(4)\n  set itemId($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasItemId() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearItemId() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $pb.PbList<$core.String> get openWhiteList => $_getList(4);\n\n  @$pb.TagNumber(6)\n  $core.bool get userWebV2 => $_getBF(5);\n  @$pb.TagNumber(6)\n  set userWebV2($core.bool value) => $_setBool(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasUserWebV2() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearUserWebV2() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get adMark => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set adMark($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasAdMark() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearAdMark() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get schemaPackageName => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set schemaPackageName($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasSchemaPackageName() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearSchemaPackageName() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  GoodsJumpType get jumpType => $_getN(8);\n  @$pb.TagNumber(9)\n  set jumpType(GoodsJumpType value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasJumpType() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearJumpType() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get appName => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set appName($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasAppName() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearAppName() => $_clearField(10);\n}\n\nclass ModuleDispute extends $pb.GeneratedMessage {\n  factory ModuleDispute({\n    $core.String? title,\n    $core.String? desc,\n    $core.String? uri,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (desc != null) result.desc = desc;\n    if (uri != null) result.uri = uri;\n    return result;\n  }\n\n  ModuleDispute._();\n\n  factory ModuleDispute.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleDispute.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleDispute',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'desc')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleDispute clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleDispute copyWith(void Function(ModuleDispute) updates) =>\n      super.copyWith((message) => updates(message as ModuleDispute))\n          as ModuleDispute;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleDispute create() => ModuleDispute._();\n  @$core.override\n  ModuleDispute createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleDispute getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleDispute>(create);\n  static ModuleDispute? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get desc => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set desc($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDesc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDesc() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n}\n\nenum ModuleDynamic_ModuleItem {\n  dynArchive,\n  dynPgc,\n  dynCourSeason,\n  dynCourBatch,\n  dynForward,\n  dynDraw,\n  dynArticle,\n  dynMusic,\n  dynCommon,\n  dynCommonLive,\n  dynMedialist,\n  dynApplet,\n  dynSubscription,\n  dynLiveRcmd,\n  dynUgcSeason,\n  dynSubscriptionNew,\n  dynCourBatchUp,\n  dynTopicSet,\n  dynChargingArchive,\n  dynShareChargingQa,\n  notSet\n}\n\nclass ModuleDynamic extends $pb.GeneratedMessage {\n  factory ModuleDynamic({\n    ModuleDynamicType? type,\n    MdlDynArchive? dynArchive,\n    MdlDynPGC? dynPgc,\n    MdlDynCourSeason? dynCourSeason,\n    MdlDynCourBatch? dynCourBatch,\n    MdlDynForward? dynForward,\n    MdlDynDraw? dynDraw,\n    MdlDynArticle? dynArticle,\n    MdlDynMusic? dynMusic,\n    MdlDynCommon? dynCommon,\n    MdlDynLive? dynCommonLive,\n    MdlDynMedialist? dynMedialist,\n    MdlDynApplet? dynApplet,\n    MdlDynSubscription? dynSubscription,\n    MdlDynLiveRcmd? dynLiveRcmd,\n    MdlDynUGCSeason? dynUgcSeason,\n    MdlDynSubscriptionNew? dynSubscriptionNew,\n    MdlDynCourUp? dynCourBatchUp,\n    MdlDynTopicSet? dynTopicSet,\n    MdlDynChargingArchive? dynChargingArchive,\n    MdlDynShareChargingQA? dynShareChargingQa,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (dynArchive != null) result.dynArchive = dynArchive;\n    if (dynPgc != null) result.dynPgc = dynPgc;\n    if (dynCourSeason != null) result.dynCourSeason = dynCourSeason;\n    if (dynCourBatch != null) result.dynCourBatch = dynCourBatch;\n    if (dynForward != null) result.dynForward = dynForward;\n    if (dynDraw != null) result.dynDraw = dynDraw;\n    if (dynArticle != null) result.dynArticle = dynArticle;\n    if (dynMusic != null) result.dynMusic = dynMusic;\n    if (dynCommon != null) result.dynCommon = dynCommon;\n    if (dynCommonLive != null) result.dynCommonLive = dynCommonLive;\n    if (dynMedialist != null) result.dynMedialist = dynMedialist;\n    if (dynApplet != null) result.dynApplet = dynApplet;\n    if (dynSubscription != null) result.dynSubscription = dynSubscription;\n    if (dynLiveRcmd != null) result.dynLiveRcmd = dynLiveRcmd;\n    if (dynUgcSeason != null) result.dynUgcSeason = dynUgcSeason;\n    if (dynSubscriptionNew != null)\n      result.dynSubscriptionNew = dynSubscriptionNew;\n    if (dynCourBatchUp != null) result.dynCourBatchUp = dynCourBatchUp;\n    if (dynTopicSet != null) result.dynTopicSet = dynTopicSet;\n    if (dynChargingArchive != null)\n      result.dynChargingArchive = dynChargingArchive;\n    if (dynShareChargingQa != null)\n      result.dynShareChargingQa = dynShareChargingQa;\n    return result;\n  }\n\n  ModuleDynamic._();\n\n  factory ModuleDynamic.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleDynamic.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, ModuleDynamic_ModuleItem>\n      _ModuleDynamic_ModuleItemByTag = {\n    2: ModuleDynamic_ModuleItem.dynArchive,\n    3: ModuleDynamic_ModuleItem.dynPgc,\n    4: ModuleDynamic_ModuleItem.dynCourSeason,\n    5: ModuleDynamic_ModuleItem.dynCourBatch,\n    6: ModuleDynamic_ModuleItem.dynForward,\n    7: ModuleDynamic_ModuleItem.dynDraw,\n    8: ModuleDynamic_ModuleItem.dynArticle,\n    9: ModuleDynamic_ModuleItem.dynMusic,\n    10: ModuleDynamic_ModuleItem.dynCommon,\n    11: ModuleDynamic_ModuleItem.dynCommonLive,\n    12: ModuleDynamic_ModuleItem.dynMedialist,\n    13: ModuleDynamic_ModuleItem.dynApplet,\n    14: ModuleDynamic_ModuleItem.dynSubscription,\n    15: ModuleDynamic_ModuleItem.dynLiveRcmd,\n    16: ModuleDynamic_ModuleItem.dynUgcSeason,\n    17: ModuleDynamic_ModuleItem.dynSubscriptionNew,\n    18: ModuleDynamic_ModuleItem.dynCourBatchUp,\n    19: ModuleDynamic_ModuleItem.dynTopicSet,\n    20: ModuleDynamic_ModuleItem.dynChargingArchive,\n    21: ModuleDynamic_ModuleItem.dynShareChargingQa,\n    0: ModuleDynamic_ModuleItem.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleDynamic',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..oo(0, [\n      2,\n      3,\n      4,\n      5,\n      6,\n      7,\n      8,\n      9,\n      10,\n      11,\n      12,\n      13,\n      14,\n      15,\n      16,\n      17,\n      18,\n      19,\n      20,\n      21\n    ])\n    ..aE<ModuleDynamicType>(1, _omitFieldNames ? '' : 'type',\n        enumValues: ModuleDynamicType.values)\n    ..aOM<MdlDynArchive>(2, _omitFieldNames ? '' : 'dynArchive',\n        subBuilder: MdlDynArchive.create)\n    ..aOM<MdlDynPGC>(3, _omitFieldNames ? '' : 'dynPgc',\n        subBuilder: MdlDynPGC.create)\n    ..aOM<MdlDynCourSeason>(4, _omitFieldNames ? '' : 'dynCourSeason',\n        subBuilder: MdlDynCourSeason.create)\n    ..aOM<MdlDynCourBatch>(5, _omitFieldNames ? '' : 'dynCourBatch',\n        subBuilder: MdlDynCourBatch.create)\n    ..aOM<MdlDynForward>(6, _omitFieldNames ? '' : 'dynForward',\n        subBuilder: MdlDynForward.create)\n    ..aOM<MdlDynDraw>(7, _omitFieldNames ? '' : 'dynDraw',\n        subBuilder: MdlDynDraw.create)\n    ..aOM<MdlDynArticle>(8, _omitFieldNames ? '' : 'dynArticle',\n        subBuilder: MdlDynArticle.create)\n    ..aOM<MdlDynMusic>(9, _omitFieldNames ? '' : 'dynMusic',\n        subBuilder: MdlDynMusic.create)\n    ..aOM<MdlDynCommon>(10, _omitFieldNames ? '' : 'dynCommon',\n        subBuilder: MdlDynCommon.create)\n    ..aOM<MdlDynLive>(11, _omitFieldNames ? '' : 'dynCommonLive',\n        subBuilder: MdlDynLive.create)\n    ..aOM<MdlDynMedialist>(12, _omitFieldNames ? '' : 'dynMedialist',\n        subBuilder: MdlDynMedialist.create)\n    ..aOM<MdlDynApplet>(13, _omitFieldNames ? '' : 'dynApplet',\n        subBuilder: MdlDynApplet.create)\n    ..aOM<MdlDynSubscription>(14, _omitFieldNames ? '' : 'dynSubscription',\n        subBuilder: MdlDynSubscription.create)\n    ..aOM<MdlDynLiveRcmd>(15, _omitFieldNames ? '' : 'dynLiveRcmd',\n        subBuilder: MdlDynLiveRcmd.create)\n    ..aOM<MdlDynUGCSeason>(16, _omitFieldNames ? '' : 'dynUgcSeason',\n        subBuilder: MdlDynUGCSeason.create)\n    ..aOM<MdlDynSubscriptionNew>(\n        17, _omitFieldNames ? '' : 'dynSubscriptionNew',\n        subBuilder: MdlDynSubscriptionNew.create)\n    ..aOM<MdlDynCourUp>(18, _omitFieldNames ? '' : 'dynCourBatchUp',\n        subBuilder: MdlDynCourUp.create)\n    ..aOM<MdlDynTopicSet>(19, _omitFieldNames ? '' : 'dynTopicSet',\n        subBuilder: MdlDynTopicSet.create)\n    ..aOM<MdlDynChargingArchive>(\n        20, _omitFieldNames ? '' : 'dynChargingArchive',\n        subBuilder: MdlDynChargingArchive.create)\n    ..aOM<MdlDynShareChargingQA>(\n        21, _omitFieldNames ? '' : 'dynShareChargingQa',\n        subBuilder: MdlDynShareChargingQA.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleDynamic clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleDynamic copyWith(void Function(ModuleDynamic) updates) =>\n      super.copyWith((message) => updates(message as ModuleDynamic))\n          as ModuleDynamic;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleDynamic create() => ModuleDynamic._();\n  @$core.override\n  ModuleDynamic createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleDynamic getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleDynamic>(create);\n  static ModuleDynamic? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(7)\n  @$pb.TagNumber(8)\n  @$pb.TagNumber(9)\n  @$pb.TagNumber(10)\n  @$pb.TagNumber(11)\n  @$pb.TagNumber(12)\n  @$pb.TagNumber(13)\n  @$pb.TagNumber(14)\n  @$pb.TagNumber(15)\n  @$pb.TagNumber(16)\n  @$pb.TagNumber(17)\n  @$pb.TagNumber(18)\n  @$pb.TagNumber(19)\n  @$pb.TagNumber(20)\n  @$pb.TagNumber(21)\n  ModuleDynamic_ModuleItem whichModuleItem() =>\n      _ModuleDynamic_ModuleItemByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(7)\n  @$pb.TagNumber(8)\n  @$pb.TagNumber(9)\n  @$pb.TagNumber(10)\n  @$pb.TagNumber(11)\n  @$pb.TagNumber(12)\n  @$pb.TagNumber(13)\n  @$pb.TagNumber(14)\n  @$pb.TagNumber(15)\n  @$pb.TagNumber(16)\n  @$pb.TagNumber(17)\n  @$pb.TagNumber(18)\n  @$pb.TagNumber(19)\n  @$pb.TagNumber(20)\n  @$pb.TagNumber(21)\n  void clearModuleItem() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  ModuleDynamicType get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(ModuleDynamicType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  MdlDynArchive get dynArchive => $_getN(1);\n  @$pb.TagNumber(2)\n  set dynArchive(MdlDynArchive value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDynArchive() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDynArchive() => $_clearField(2);\n  @$pb.TagNumber(2)\n  MdlDynArchive ensureDynArchive() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  MdlDynPGC get dynPgc => $_getN(2);\n  @$pb.TagNumber(3)\n  set dynPgc(MdlDynPGC value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDynPgc() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDynPgc() => $_clearField(3);\n  @$pb.TagNumber(3)\n  MdlDynPGC ensureDynPgc() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  MdlDynCourSeason get dynCourSeason => $_getN(3);\n  @$pb.TagNumber(4)\n  set dynCourSeason(MdlDynCourSeason value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDynCourSeason() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDynCourSeason() => $_clearField(4);\n  @$pb.TagNumber(4)\n  MdlDynCourSeason ensureDynCourSeason() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  MdlDynCourBatch get dynCourBatch => $_getN(4);\n  @$pb.TagNumber(5)\n  set dynCourBatch(MdlDynCourBatch value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDynCourBatch() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDynCourBatch() => $_clearField(5);\n  @$pb.TagNumber(5)\n  MdlDynCourBatch ensureDynCourBatch() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  MdlDynForward get dynForward => $_getN(5);\n  @$pb.TagNumber(6)\n  set dynForward(MdlDynForward value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasDynForward() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearDynForward() => $_clearField(6);\n  @$pb.TagNumber(6)\n  MdlDynForward ensureDynForward() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  MdlDynDraw get dynDraw => $_getN(6);\n  @$pb.TagNumber(7)\n  set dynDraw(MdlDynDraw value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasDynDraw() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearDynDraw() => $_clearField(7);\n  @$pb.TagNumber(7)\n  MdlDynDraw ensureDynDraw() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  MdlDynArticle get dynArticle => $_getN(7);\n  @$pb.TagNumber(8)\n  set dynArticle(MdlDynArticle value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasDynArticle() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearDynArticle() => $_clearField(8);\n  @$pb.TagNumber(8)\n  MdlDynArticle ensureDynArticle() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  MdlDynMusic get dynMusic => $_getN(8);\n  @$pb.TagNumber(9)\n  set dynMusic(MdlDynMusic value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasDynMusic() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearDynMusic() => $_clearField(9);\n  @$pb.TagNumber(9)\n  MdlDynMusic ensureDynMusic() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  MdlDynCommon get dynCommon => $_getN(9);\n  @$pb.TagNumber(10)\n  set dynCommon(MdlDynCommon value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasDynCommon() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearDynCommon() => $_clearField(10);\n  @$pb.TagNumber(10)\n  MdlDynCommon ensureDynCommon() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  MdlDynLive get dynCommonLive => $_getN(10);\n  @$pb.TagNumber(11)\n  set dynCommonLive(MdlDynLive value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasDynCommonLive() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearDynCommonLive() => $_clearField(11);\n  @$pb.TagNumber(11)\n  MdlDynLive ensureDynCommonLive() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  MdlDynMedialist get dynMedialist => $_getN(11);\n  @$pb.TagNumber(12)\n  set dynMedialist(MdlDynMedialist value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasDynMedialist() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearDynMedialist() => $_clearField(12);\n  @$pb.TagNumber(12)\n  MdlDynMedialist ensureDynMedialist() => $_ensure(11);\n\n  @$pb.TagNumber(13)\n  MdlDynApplet get dynApplet => $_getN(12);\n  @$pb.TagNumber(13)\n  set dynApplet(MdlDynApplet value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasDynApplet() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearDynApplet() => $_clearField(13);\n  @$pb.TagNumber(13)\n  MdlDynApplet ensureDynApplet() => $_ensure(12);\n\n  @$pb.TagNumber(14)\n  MdlDynSubscription get dynSubscription => $_getN(13);\n  @$pb.TagNumber(14)\n  set dynSubscription(MdlDynSubscription value) => $_setField(14, value);\n  @$pb.TagNumber(14)\n  $core.bool hasDynSubscription() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearDynSubscription() => $_clearField(14);\n  @$pb.TagNumber(14)\n  MdlDynSubscription ensureDynSubscription() => $_ensure(13);\n\n  @$pb.TagNumber(15)\n  MdlDynLiveRcmd get dynLiveRcmd => $_getN(14);\n  @$pb.TagNumber(15)\n  set dynLiveRcmd(MdlDynLiveRcmd value) => $_setField(15, value);\n  @$pb.TagNumber(15)\n  $core.bool hasDynLiveRcmd() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearDynLiveRcmd() => $_clearField(15);\n  @$pb.TagNumber(15)\n  MdlDynLiveRcmd ensureDynLiveRcmd() => $_ensure(14);\n\n  @$pb.TagNumber(16)\n  MdlDynUGCSeason get dynUgcSeason => $_getN(15);\n  @$pb.TagNumber(16)\n  set dynUgcSeason(MdlDynUGCSeason value) => $_setField(16, value);\n  @$pb.TagNumber(16)\n  $core.bool hasDynUgcSeason() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearDynUgcSeason() => $_clearField(16);\n  @$pb.TagNumber(16)\n  MdlDynUGCSeason ensureDynUgcSeason() => $_ensure(15);\n\n  @$pb.TagNumber(17)\n  MdlDynSubscriptionNew get dynSubscriptionNew => $_getN(16);\n  @$pb.TagNumber(17)\n  set dynSubscriptionNew(MdlDynSubscriptionNew value) => $_setField(17, value);\n  @$pb.TagNumber(17)\n  $core.bool hasDynSubscriptionNew() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearDynSubscriptionNew() => $_clearField(17);\n  @$pb.TagNumber(17)\n  MdlDynSubscriptionNew ensureDynSubscriptionNew() => $_ensure(16);\n\n  @$pb.TagNumber(18)\n  MdlDynCourUp get dynCourBatchUp => $_getN(17);\n  @$pb.TagNumber(18)\n  set dynCourBatchUp(MdlDynCourUp value) => $_setField(18, value);\n  @$pb.TagNumber(18)\n  $core.bool hasDynCourBatchUp() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearDynCourBatchUp() => $_clearField(18);\n  @$pb.TagNumber(18)\n  MdlDynCourUp ensureDynCourBatchUp() => $_ensure(17);\n\n  @$pb.TagNumber(19)\n  MdlDynTopicSet get dynTopicSet => $_getN(18);\n  @$pb.TagNumber(19)\n  set dynTopicSet(MdlDynTopicSet value) => $_setField(19, value);\n  @$pb.TagNumber(19)\n  $core.bool hasDynTopicSet() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearDynTopicSet() => $_clearField(19);\n  @$pb.TagNumber(19)\n  MdlDynTopicSet ensureDynTopicSet() => $_ensure(18);\n\n  @$pb.TagNumber(20)\n  MdlDynChargingArchive get dynChargingArchive => $_getN(19);\n  @$pb.TagNumber(20)\n  set dynChargingArchive(MdlDynChargingArchive value) => $_setField(20, value);\n  @$pb.TagNumber(20)\n  $core.bool hasDynChargingArchive() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearDynChargingArchive() => $_clearField(20);\n  @$pb.TagNumber(20)\n  MdlDynChargingArchive ensureDynChargingArchive() => $_ensure(19);\n\n  @$pb.TagNumber(21)\n  MdlDynShareChargingQA get dynShareChargingQa => $_getN(20);\n  @$pb.TagNumber(21)\n  set dynShareChargingQa(MdlDynShareChargingQA value) => $_setField(21, value);\n  @$pb.TagNumber(21)\n  $core.bool hasDynShareChargingQa() => $_has(20);\n  @$pb.TagNumber(21)\n  void clearDynShareChargingQa() => $_clearField(21);\n  @$pb.TagNumber(21)\n  MdlDynShareChargingQA ensureDynShareChargingQa() => $_ensure(20);\n}\n\nclass ModuleExtend extends $pb.GeneratedMessage {\n  factory ModuleExtend({\n    $core.Iterable<ModuleExtendItem>? extend,\n    $core.String? uri,\n  }) {\n    final result = create();\n    if (extend != null) result.extend.addAll(extend);\n    if (uri != null) result.uri = uri;\n    return result;\n  }\n\n  ModuleExtend._();\n\n  factory ModuleExtend.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleExtend.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleExtend',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<ModuleExtendItem>(1, _omitFieldNames ? '' : 'extend',\n        subBuilder: ModuleExtendItem.create)\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleExtend clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleExtend copyWith(void Function(ModuleExtend) updates) =>\n      super.copyWith((message) => updates(message as ModuleExtend))\n          as ModuleExtend;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleExtend create() => ModuleExtend._();\n  @$core.override\n  ModuleExtend createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleExtend getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleExtend>(create);\n  static ModuleExtend? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<ModuleExtendItem> get extend => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n}\n\nenum ModuleExtendItem_Extend {\n  extInfoTopic,\n  extInfoLbs,\n  extInfoHot,\n  extInfoGame,\n  extInfoCommon,\n  extInfoOgv,\n  notSet\n}\n\nclass ModuleExtendItem extends $pb.GeneratedMessage {\n  factory ModuleExtendItem({\n    DynExtendType? type,\n    ExtInfoTopic? extInfoTopic,\n    ExtInfoLBS? extInfoLbs,\n    ExtInfoHot? extInfoHot,\n    ExtInfoGame? extInfoGame,\n    ExtInfoCommon? extInfoCommon,\n    ExtInfoOGV? extInfoOgv,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (extInfoTopic != null) result.extInfoTopic = extInfoTopic;\n    if (extInfoLbs != null) result.extInfoLbs = extInfoLbs;\n    if (extInfoHot != null) result.extInfoHot = extInfoHot;\n    if (extInfoGame != null) result.extInfoGame = extInfoGame;\n    if (extInfoCommon != null) result.extInfoCommon = extInfoCommon;\n    if (extInfoOgv != null) result.extInfoOgv = extInfoOgv;\n    return result;\n  }\n\n  ModuleExtendItem._();\n\n  factory ModuleExtendItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleExtendItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, ModuleExtendItem_Extend>\n      _ModuleExtendItem_ExtendByTag = {\n    2: ModuleExtendItem_Extend.extInfoTopic,\n    3: ModuleExtendItem_Extend.extInfoLbs,\n    4: ModuleExtendItem_Extend.extInfoHot,\n    5: ModuleExtendItem_Extend.extInfoGame,\n    6: ModuleExtendItem_Extend.extInfoCommon,\n    7: ModuleExtendItem_Extend.extInfoOgv,\n    0: ModuleExtendItem_Extend.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleExtendItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..oo(0, [2, 3, 4, 5, 6, 7])\n    ..aE<DynExtendType>(1, _omitFieldNames ? '' : 'type',\n        enumValues: DynExtendType.values)\n    ..aOM<ExtInfoTopic>(2, _omitFieldNames ? '' : 'extInfoTopic',\n        subBuilder: ExtInfoTopic.create)\n    ..aOM<ExtInfoLBS>(3, _omitFieldNames ? '' : 'extInfoLbs',\n        subBuilder: ExtInfoLBS.create)\n    ..aOM<ExtInfoHot>(4, _omitFieldNames ? '' : 'extInfoHot',\n        subBuilder: ExtInfoHot.create)\n    ..aOM<ExtInfoGame>(5, _omitFieldNames ? '' : 'extInfoGame',\n        subBuilder: ExtInfoGame.create)\n    ..aOM<ExtInfoCommon>(6, _omitFieldNames ? '' : 'extInfoCommon',\n        subBuilder: ExtInfoCommon.create)\n    ..aOM<ExtInfoOGV>(7, _omitFieldNames ? '' : 'extInfoOgv',\n        subBuilder: ExtInfoOGV.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleExtendItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleExtendItem copyWith(void Function(ModuleExtendItem) updates) =>\n      super.copyWith((message) => updates(message as ModuleExtendItem))\n          as ModuleExtendItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleExtendItem create() => ModuleExtendItem._();\n  @$core.override\n  ModuleExtendItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleExtendItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleExtendItem>(create);\n  static ModuleExtendItem? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(7)\n  ModuleExtendItem_Extend whichExtend() =>\n      _ModuleExtendItem_ExtendByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(7)\n  void clearExtend() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  DynExtendType get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(DynExtendType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  ExtInfoTopic get extInfoTopic => $_getN(1);\n  @$pb.TagNumber(2)\n  set extInfoTopic(ExtInfoTopic value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasExtInfoTopic() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearExtInfoTopic() => $_clearField(2);\n  @$pb.TagNumber(2)\n  ExtInfoTopic ensureExtInfoTopic() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  ExtInfoLBS get extInfoLbs => $_getN(2);\n  @$pb.TagNumber(3)\n  set extInfoLbs(ExtInfoLBS value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasExtInfoLbs() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearExtInfoLbs() => $_clearField(3);\n  @$pb.TagNumber(3)\n  ExtInfoLBS ensureExtInfoLbs() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  ExtInfoHot get extInfoHot => $_getN(3);\n  @$pb.TagNumber(4)\n  set extInfoHot(ExtInfoHot value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasExtInfoHot() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearExtInfoHot() => $_clearField(4);\n  @$pb.TagNumber(4)\n  ExtInfoHot ensureExtInfoHot() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  ExtInfoGame get extInfoGame => $_getN(4);\n  @$pb.TagNumber(5)\n  set extInfoGame(ExtInfoGame value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasExtInfoGame() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearExtInfoGame() => $_clearField(5);\n  @$pb.TagNumber(5)\n  ExtInfoGame ensureExtInfoGame() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  ExtInfoCommon get extInfoCommon => $_getN(5);\n  @$pb.TagNumber(6)\n  set extInfoCommon(ExtInfoCommon value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasExtInfoCommon() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearExtInfoCommon() => $_clearField(6);\n  @$pb.TagNumber(6)\n  ExtInfoCommon ensureExtInfoCommon() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  ExtInfoOGV get extInfoOgv => $_getN(6);\n  @$pb.TagNumber(7)\n  set extInfoOgv(ExtInfoOGV value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasExtInfoOgv() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearExtInfoOgv() => $_clearField(7);\n  @$pb.TagNumber(7)\n  ExtInfoOGV ensureExtInfoOgv() => $_ensure(6);\n}\n\nclass ModuleFold extends $pb.GeneratedMessage {\n  factory ModuleFold({\n    FoldType? foldType,\n    $core.String? text,\n    $core.String? foldIds,\n    $core.Iterable<UserInfo>? foldUsers,\n    TopicMergedResource? topicMergedResource,\n  }) {\n    final result = create();\n    if (foldType != null) result.foldType = foldType;\n    if (text != null) result.text = text;\n    if (foldIds != null) result.foldIds = foldIds;\n    if (foldUsers != null) result.foldUsers.addAll(foldUsers);\n    if (topicMergedResource != null)\n      result.topicMergedResource = topicMergedResource;\n    return result;\n  }\n\n  ModuleFold._();\n\n  factory ModuleFold.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleFold.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleFold',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aE<FoldType>(1, _omitFieldNames ? '' : 'foldType',\n        enumValues: FoldType.values)\n    ..aOS(2, _omitFieldNames ? '' : 'text')\n    ..aOS(3, _omitFieldNames ? '' : 'foldIds')\n    ..pPM<UserInfo>(4, _omitFieldNames ? '' : 'foldUsers',\n        subBuilder: UserInfo.create)\n    ..aOM<TopicMergedResource>(5, _omitFieldNames ? '' : 'topicMergedResource',\n        subBuilder: TopicMergedResource.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleFold clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleFold copyWith(void Function(ModuleFold) updates) =>\n      super.copyWith((message) => updates(message as ModuleFold)) as ModuleFold;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleFold create() => ModuleFold._();\n  @$core.override\n  ModuleFold createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleFold getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleFold>(create);\n  static ModuleFold? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  FoldType get foldType => $_getN(0);\n  @$pb.TagNumber(1)\n  set foldType(FoldType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFoldType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFoldType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get foldIds => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set foldIds($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFoldIds() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFoldIds() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<UserInfo> get foldUsers => $_getList(3);\n\n  @$pb.TagNumber(5)\n  TopicMergedResource get topicMergedResource => $_getN(4);\n  @$pb.TagNumber(5)\n  set topicMergedResource(TopicMergedResource value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasTopicMergedResource() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearTopicMergedResource() => $_clearField(5);\n  @$pb.TagNumber(5)\n  TopicMergedResource ensureTopicMergedResource() => $_ensure(4);\n}\n\nclass ModuleInteraction extends $pb.GeneratedMessage {\n  factory ModuleInteraction({\n    $core.Iterable<InteractionItem>? interactionItem,\n  }) {\n    final result = create();\n    if (interactionItem != null) result.interactionItem.addAll(interactionItem);\n    return result;\n  }\n\n  ModuleInteraction._();\n\n  factory ModuleInteraction.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleInteraction.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleInteraction',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<InteractionItem>(1, _omitFieldNames ? '' : 'interactionItem',\n        subBuilder: InteractionItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleInteraction clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleInteraction copyWith(void Function(ModuleInteraction) updates) =>\n      super.copyWith((message) => updates(message as ModuleInteraction))\n          as ModuleInteraction;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleInteraction create() => ModuleInteraction._();\n  @$core.override\n  ModuleInteraction createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleInteraction getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleInteraction>(create);\n  static ModuleInteraction? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<InteractionItem> get interactionItem => $_getList(0);\n}\n\nclass ModuleItemNull extends $pb.GeneratedMessage {\n  factory ModuleItemNull({\n    $core.String? icon,\n    $core.String? text,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (text != null) result.text = text;\n    return result;\n  }\n\n  ModuleItemNull._();\n\n  factory ModuleItemNull.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleItemNull.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleItemNull',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'text')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleItemNull clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleItemNull copyWith(void Function(ModuleItemNull) updates) =>\n      super.copyWith((message) => updates(message as ModuleItemNull))\n          as ModuleItemNull;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleItemNull create() => ModuleItemNull._();\n  @$core.override\n  ModuleItemNull createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleItemNull getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleItemNull>(create);\n  static ModuleItemNull? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n}\n\nclass ModuleLikeUser extends $pb.GeneratedMessage {\n  factory ModuleLikeUser({\n    $core.Iterable<LikeUser>? likeUsers,\n    $core.String? displayText,\n  }) {\n    final result = create();\n    if (likeUsers != null) result.likeUsers.addAll(likeUsers);\n    if (displayText != null) result.displayText = displayText;\n    return result;\n  }\n\n  ModuleLikeUser._();\n\n  factory ModuleLikeUser.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleLikeUser.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleLikeUser',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<LikeUser>(1, _omitFieldNames ? '' : 'likeUsers',\n        subBuilder: LikeUser.create)\n    ..aOS(2, _omitFieldNames ? '' : 'displayText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleLikeUser clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleLikeUser copyWith(void Function(ModuleLikeUser) updates) =>\n      super.copyWith((message) => updates(message as ModuleLikeUser))\n          as ModuleLikeUser;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleLikeUser create() => ModuleLikeUser._();\n  @$core.override\n  ModuleLikeUser createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleLikeUser getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleLikeUser>(create);\n  static ModuleLikeUser? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<LikeUser> get likeUsers => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.String get displayText => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set displayText($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDisplayText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDisplayText() => $_clearField(2);\n}\n\nclass ModuleMangaCollection extends $pb.GeneratedMessage {\n  factory ModuleMangaCollection({\n    $core.String? titleIcon,\n    $core.String? title,\n    $core.String? subTextLeft,\n    $core.String? subTextRight,\n    SubscribeButton? subscribeBtn,\n    OpusCollection? mangaCollectionInfo,\n    $core.String? floatBtnPrevLink,\n    $core.String? floatBtnNextLink,\n  }) {\n    final result = create();\n    if (titleIcon != null) result.titleIcon = titleIcon;\n    if (title != null) result.title = title;\n    if (subTextLeft != null) result.subTextLeft = subTextLeft;\n    if (subTextRight != null) result.subTextRight = subTextRight;\n    if (subscribeBtn != null) result.subscribeBtn = subscribeBtn;\n    if (mangaCollectionInfo != null)\n      result.mangaCollectionInfo = mangaCollectionInfo;\n    if (floatBtnPrevLink != null) result.floatBtnPrevLink = floatBtnPrevLink;\n    if (floatBtnNextLink != null) result.floatBtnNextLink = floatBtnNextLink;\n    return result;\n  }\n\n  ModuleMangaCollection._();\n\n  factory ModuleMangaCollection.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleMangaCollection.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleMangaCollection',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'titleIcon')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'subTextLeft')\n    ..aOS(4, _omitFieldNames ? '' : 'subTextRight')\n    ..aOM<SubscribeButton>(5, _omitFieldNames ? '' : 'subscribeBtn',\n        subBuilder: SubscribeButton.create)\n    ..aOM<OpusCollection>(6, _omitFieldNames ? '' : 'mangaCollectionInfo',\n        subBuilder: OpusCollection.create)\n    ..aOS(7, _omitFieldNames ? '' : 'floatBtnPrevLink')\n    ..aOS(8, _omitFieldNames ? '' : 'floatBtnNextLink')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleMangaCollection clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleMangaCollection copyWith(\n          void Function(ModuleMangaCollection) updates) =>\n      super.copyWith((message) => updates(message as ModuleMangaCollection))\n          as ModuleMangaCollection;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleMangaCollection create() => ModuleMangaCollection._();\n  @$core.override\n  ModuleMangaCollection createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleMangaCollection getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleMangaCollection>(create);\n  static ModuleMangaCollection? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get titleIcon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set titleIcon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitleIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitleIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get subTextLeft => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set subTextLeft($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSubTextLeft() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSubTextLeft() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get subTextRight => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set subTextRight($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSubTextRight() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSubTextRight() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  SubscribeButton get subscribeBtn => $_getN(4);\n  @$pb.TagNumber(5)\n  set subscribeBtn(SubscribeButton value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasSubscribeBtn() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearSubscribeBtn() => $_clearField(5);\n  @$pb.TagNumber(5)\n  SubscribeButton ensureSubscribeBtn() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  OpusCollection get mangaCollectionInfo => $_getN(5);\n  @$pb.TagNumber(6)\n  set mangaCollectionInfo(OpusCollection value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasMangaCollectionInfo() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearMangaCollectionInfo() => $_clearField(6);\n  @$pb.TagNumber(6)\n  OpusCollection ensureMangaCollectionInfo() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $core.String get floatBtnPrevLink => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set floatBtnPrevLink($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasFloatBtnPrevLink() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearFloatBtnPrevLink() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get floatBtnNextLink => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set floatBtnNextLink($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasFloatBtnNextLink() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearFloatBtnNextLink() => $_clearField(8);\n}\n\nclass ModuleMangaCoverPicContent extends $pb.GeneratedMessage {\n  factory ModuleMangaCoverPicContent({\n    MangaLikePic? mangaPic,\n    MangaLikePicClickAction? picClickAction,\n  }) {\n    final result = create();\n    if (mangaPic != null) result.mangaPic = mangaPic;\n    if (picClickAction != null) result.picClickAction = picClickAction;\n    return result;\n  }\n\n  ModuleMangaCoverPicContent._();\n\n  factory ModuleMangaCoverPicContent.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleMangaCoverPicContent.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleMangaCoverPicContent',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<MangaLikePic>(1, _omitFieldNames ? '' : 'mangaPic',\n        subBuilder: MangaLikePic.create)\n    ..aE<MangaLikePicClickAction>(2, _omitFieldNames ? '' : 'picClickAction',\n        enumValues: MangaLikePicClickAction.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleMangaCoverPicContent clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleMangaCoverPicContent copyWith(\n          void Function(ModuleMangaCoverPicContent) updates) =>\n      super.copyWith(\n              (message) => updates(message as ModuleMangaCoverPicContent))\n          as ModuleMangaCoverPicContent;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleMangaCoverPicContent create() => ModuleMangaCoverPicContent._();\n  @$core.override\n  ModuleMangaCoverPicContent createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleMangaCoverPicContent getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleMangaCoverPicContent>(create);\n  static ModuleMangaCoverPicContent? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  MangaLikePic get mangaPic => $_getN(0);\n  @$pb.TagNumber(1)\n  set mangaPic(MangaLikePic value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMangaPic() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMangaPic() => $_clearField(1);\n  @$pb.TagNumber(1)\n  MangaLikePic ensureMangaPic() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  MangaLikePicClickAction get picClickAction => $_getN(1);\n  @$pb.TagNumber(2)\n  set picClickAction(MangaLikePicClickAction value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPicClickAction() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPicClickAction() => $_clearField(2);\n}\n\nclass ModuleMangaHorizontalPagePicContent extends $pb.GeneratedMessage {\n  factory ModuleMangaHorizontalPagePicContent({\n    MangaLikePageDirection? pageDirection,\n    $core.Iterable<MangaLikePic>? mangaPics,\n    MangaLikePicClickAction? picClickAction,\n    MangaLikeBrowserGuidance? browserGuidance,\n  }) {\n    final result = create();\n    if (pageDirection != null) result.pageDirection = pageDirection;\n    if (mangaPics != null) result.mangaPics.addAll(mangaPics);\n    if (picClickAction != null) result.picClickAction = picClickAction;\n    if (browserGuidance != null) result.browserGuidance = browserGuidance;\n    return result;\n  }\n\n  ModuleMangaHorizontalPagePicContent._();\n\n  factory ModuleMangaHorizontalPagePicContent.fromBuffer(\n          $core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleMangaHorizontalPagePicContent.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleMangaHorizontalPagePicContent',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aE<MangaLikePageDirection>(1, _omitFieldNames ? '' : 'pageDirection',\n        enumValues: MangaLikePageDirection.values)\n    ..pPM<MangaLikePic>(2, _omitFieldNames ? '' : 'mangaPics',\n        subBuilder: MangaLikePic.create)\n    ..aE<MangaLikePicClickAction>(3, _omitFieldNames ? '' : 'picClickAction',\n        enumValues: MangaLikePicClickAction.values)\n    ..aOM<MangaLikeBrowserGuidance>(4, _omitFieldNames ? '' : 'browserGuidance',\n        subBuilder: MangaLikeBrowserGuidance.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleMangaHorizontalPagePicContent clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleMangaHorizontalPagePicContent copyWith(\n          void Function(ModuleMangaHorizontalPagePicContent) updates) =>\n      super.copyWith((message) =>\n              updates(message as ModuleMangaHorizontalPagePicContent))\n          as ModuleMangaHorizontalPagePicContent;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleMangaHorizontalPagePicContent create() =>\n      ModuleMangaHorizontalPagePicContent._();\n  @$core.override\n  ModuleMangaHorizontalPagePicContent createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleMangaHorizontalPagePicContent getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<\n          ModuleMangaHorizontalPagePicContent>(create);\n  static ModuleMangaHorizontalPagePicContent? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  MangaLikePageDirection get pageDirection => $_getN(0);\n  @$pb.TagNumber(1)\n  set pageDirection(MangaLikePageDirection value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPageDirection() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPageDirection() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<MangaLikePic> get mangaPics => $_getList(1);\n\n  @$pb.TagNumber(3)\n  MangaLikePicClickAction get picClickAction => $_getN(2);\n  @$pb.TagNumber(3)\n  set picClickAction(MangaLikePicClickAction value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPicClickAction() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPicClickAction() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  MangaLikeBrowserGuidance get browserGuidance => $_getN(3);\n  @$pb.TagNumber(4)\n  set browserGuidance(MangaLikeBrowserGuidance value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBrowserGuidance() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBrowserGuidance() => $_clearField(4);\n  @$pb.TagNumber(4)\n  MangaLikeBrowserGuidance ensureBrowserGuidance() => $_ensure(3);\n}\n\nclass ModuleMangaVerticalSlidePicContent extends $pb.GeneratedMessage {\n  factory ModuleMangaVerticalSlidePicContent({\n    MangaLikePic? mangaPic,\n    MangaLikePicClickAction? picClickAction,\n  }) {\n    final result = create();\n    if (mangaPic != null) result.mangaPic = mangaPic;\n    if (picClickAction != null) result.picClickAction = picClickAction;\n    return result;\n  }\n\n  ModuleMangaVerticalSlidePicContent._();\n\n  factory ModuleMangaVerticalSlidePicContent.fromBuffer(\n          $core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleMangaVerticalSlidePicContent.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleMangaVerticalSlidePicContent',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<MangaLikePic>(1, _omitFieldNames ? '' : 'mangaPic',\n        subBuilder: MangaLikePic.create)\n    ..aE<MangaLikePicClickAction>(2, _omitFieldNames ? '' : 'picClickAction',\n        enumValues: MangaLikePicClickAction.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleMangaVerticalSlidePicContent clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleMangaVerticalSlidePicContent copyWith(\n          void Function(ModuleMangaVerticalSlidePicContent) updates) =>\n      super.copyWith((message) =>\n              updates(message as ModuleMangaVerticalSlidePicContent))\n          as ModuleMangaVerticalSlidePicContent;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleMangaVerticalSlidePicContent create() =>\n      ModuleMangaVerticalSlidePicContent._();\n  @$core.override\n  ModuleMangaVerticalSlidePicContent createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleMangaVerticalSlidePicContent getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleMangaVerticalSlidePicContent>(\n          create);\n  static ModuleMangaVerticalSlidePicContent? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  MangaLikePic get mangaPic => $_getN(0);\n  @$pb.TagNumber(1)\n  set mangaPic(MangaLikePic value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMangaPic() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMangaPic() => $_clearField(1);\n  @$pb.TagNumber(1)\n  MangaLikePic ensureMangaPic() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  MangaLikePicClickAction get picClickAction => $_getN(1);\n  @$pb.TagNumber(2)\n  set picClickAction(MangaLikePicClickAction value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPicClickAction() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPicClickAction() => $_clearField(2);\n}\n\nclass ModuleNotice extends $pb.GeneratedMessage {\n  factory ModuleNotice({\n    $core.String? identity,\n    $core.String? icon,\n    $core.String? title,\n    $core.String? url,\n    $core.int? noticeType,\n  }) {\n    final result = create();\n    if (identity != null) result.identity = identity;\n    if (icon != null) result.icon = icon;\n    if (title != null) result.title = title;\n    if (url != null) result.url = url;\n    if (noticeType != null) result.noticeType = noticeType;\n    return result;\n  }\n\n  ModuleNotice._();\n\n  factory ModuleNotice.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleNotice.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleNotice',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'identity')\n    ..aOS(2, _omitFieldNames ? '' : 'icon')\n    ..aOS(3, _omitFieldNames ? '' : 'title')\n    ..aOS(4, _omitFieldNames ? '' : 'url')\n    ..aI(5, _omitFieldNames ? '' : 'noticeType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleNotice clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleNotice copyWith(void Function(ModuleNotice) updates) =>\n      super.copyWith((message) => updates(message as ModuleNotice))\n          as ModuleNotice;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleNotice create() => ModuleNotice._();\n  @$core.override\n  ModuleNotice createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleNotice getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleNotice>(create);\n  static ModuleNotice? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get identity => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set identity($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIdentity() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIdentity() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get icon => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set icon($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIcon() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIcon() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get title => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set title($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get url => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set url($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUrl() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUrl() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get noticeType => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set noticeType($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasNoticeType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearNoticeType() => $_clearField(5);\n}\n\nclass ModuleOnetimeNotice extends $pb.GeneratedMessage {\n  factory ModuleOnetimeNotice({\n    $core.String? uuid,\n    TextParagraph? textNotice,\n    $core.String? jumpUri,\n  }) {\n    final result = create();\n    if (uuid != null) result.uuid = uuid;\n    if (textNotice != null) result.textNotice = textNotice;\n    if (jumpUri != null) result.jumpUri = jumpUri;\n    return result;\n  }\n\n  ModuleOnetimeNotice._();\n\n  factory ModuleOnetimeNotice.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleOnetimeNotice.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleOnetimeNotice',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'uuid')\n    ..aOM<TextParagraph>(2, _omitFieldNames ? '' : 'textNotice',\n        subBuilder: TextParagraph.create)\n    ..aOS(3, _omitFieldNames ? '' : 'jumpUri')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleOnetimeNotice clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleOnetimeNotice copyWith(void Function(ModuleOnetimeNotice) updates) =>\n      super.copyWith((message) => updates(message as ModuleOnetimeNotice))\n          as ModuleOnetimeNotice;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleOnetimeNotice create() => ModuleOnetimeNotice._();\n  @$core.override\n  ModuleOnetimeNotice createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleOnetimeNotice getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleOnetimeNotice>(create);\n  static ModuleOnetimeNotice? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get uuid => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set uuid($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUuid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUuid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  TextParagraph get textNotice => $_getN(1);\n  @$pb.TagNumber(2)\n  set textNotice(TextParagraph value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTextNotice() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTextNotice() => $_clearField(2);\n  @$pb.TagNumber(2)\n  TextParagraph ensureTextNotice() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.String get jumpUri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set jumpUri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasJumpUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearJumpUri() => $_clearField(3);\n}\n\nclass ModuleOpusCollection extends $pb.GeneratedMessage {\n  factory ModuleOpusCollection({\n    OpusCollection? collectionInfo,\n    $core.String? titleUpper,\n    $core.String? title,\n    $core.String? titlePrefixIcon,\n    $core.String? totalText,\n  }) {\n    final result = create();\n    if (collectionInfo != null) result.collectionInfo = collectionInfo;\n    if (titleUpper != null) result.titleUpper = titleUpper;\n    if (title != null) result.title = title;\n    if (titlePrefixIcon != null) result.titlePrefixIcon = titlePrefixIcon;\n    if (totalText != null) result.totalText = totalText;\n    return result;\n  }\n\n  ModuleOpusCollection._();\n\n  factory ModuleOpusCollection.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleOpusCollection.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleOpusCollection',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<OpusCollection>(1, _omitFieldNames ? '' : 'collectionInfo',\n        subBuilder: OpusCollection.create)\n    ..aOS(2, _omitFieldNames ? '' : 'titleUpper')\n    ..aOS(3, _omitFieldNames ? '' : 'title')\n    ..aOS(4, _omitFieldNames ? '' : 'titlePrefixIcon')\n    ..aOS(5, _omitFieldNames ? '' : 'totalText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleOpusCollection clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleOpusCollection copyWith(void Function(ModuleOpusCollection) updates) =>\n      super.copyWith((message) => updates(message as ModuleOpusCollection))\n          as ModuleOpusCollection;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleOpusCollection create() => ModuleOpusCollection._();\n  @$core.override\n  ModuleOpusCollection createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleOpusCollection getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleOpusCollection>(create);\n  static ModuleOpusCollection? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  OpusCollection get collectionInfo => $_getN(0);\n  @$pb.TagNumber(1)\n  set collectionInfo(OpusCollection value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCollectionInfo() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCollectionInfo() => $_clearField(1);\n  @$pb.TagNumber(1)\n  OpusCollection ensureCollectionInfo() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get titleUpper => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set titleUpper($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitleUpper() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitleUpper() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get title => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set title($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get titlePrefixIcon => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set titlePrefixIcon($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTitlePrefixIcon() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTitlePrefixIcon() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get totalText => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set totalText($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasTotalText() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearTotalText() => $_clearField(5);\n}\n\nclass ModuleOpusSummary extends $pb.GeneratedMessage {\n  factory ModuleOpusSummary({\n    Paragraph? title,\n    Paragraph? summary,\n    $core.String? summaryJumpBtnText,\n    $core.Iterable<MdlDynDrawItem>? covers,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (summary != null) result.summary = summary;\n    if (summaryJumpBtnText != null)\n      result.summaryJumpBtnText = summaryJumpBtnText;\n    if (covers != null) result.covers.addAll(covers);\n    return result;\n  }\n\n  ModuleOpusSummary._();\n\n  factory ModuleOpusSummary.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleOpusSummary.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleOpusSummary',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<Paragraph>(1, _omitFieldNames ? '' : 'title',\n        subBuilder: Paragraph.create)\n    ..aOM<Paragraph>(2, _omitFieldNames ? '' : 'summary',\n        subBuilder: Paragraph.create)\n    ..aOS(3, _omitFieldNames ? '' : 'summaryJumpBtnText')\n    ..pPM<MdlDynDrawItem>(4, _omitFieldNames ? '' : 'covers',\n        subBuilder: MdlDynDrawItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleOpusSummary clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleOpusSummary copyWith(void Function(ModuleOpusSummary) updates) =>\n      super.copyWith((message) => updates(message as ModuleOpusSummary))\n          as ModuleOpusSummary;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleOpusSummary create() => ModuleOpusSummary._();\n  @$core.override\n  ModuleOpusSummary createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleOpusSummary getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleOpusSummary>(create);\n  static ModuleOpusSummary? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Paragraph get title => $_getN(0);\n  @$pb.TagNumber(1)\n  set title(Paragraph value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Paragraph ensureTitle() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  Paragraph get summary => $_getN(1);\n  @$pb.TagNumber(2)\n  set summary(Paragraph value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSummary() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSummary() => $_clearField(2);\n  @$pb.TagNumber(2)\n  Paragraph ensureSummary() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.String get summaryJumpBtnText => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set summaryJumpBtnText($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSummaryJumpBtnText() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSummaryJumpBtnText() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<MdlDynDrawItem> get covers => $_getList(3);\n}\n\nclass ModuleParagraph extends $pb.GeneratedMessage {\n  factory ModuleParagraph({\n    Paragraph? paragraph,\n    $core.bool? isArticleTitle,\n    ParaSpacing? paraSpacing,\n  }) {\n    final result = create();\n    if (paragraph != null) result.paragraph = paragraph;\n    if (isArticleTitle != null) result.isArticleTitle = isArticleTitle;\n    if (paraSpacing != null) result.paraSpacing = paraSpacing;\n    return result;\n  }\n\n  ModuleParagraph._();\n\n  factory ModuleParagraph.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleParagraph.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleParagraph',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<Paragraph>(1, _omitFieldNames ? '' : 'paragraph',\n        subBuilder: Paragraph.create)\n    ..aOB(2, _omitFieldNames ? '' : 'isArticleTitle')\n    ..aOM<ParaSpacing>(3, _omitFieldNames ? '' : 'paraSpacing',\n        subBuilder: ParaSpacing.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleParagraph clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleParagraph copyWith(void Function(ModuleParagraph) updates) =>\n      super.copyWith((message) => updates(message as ModuleParagraph))\n          as ModuleParagraph;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleParagraph create() => ModuleParagraph._();\n  @$core.override\n  ModuleParagraph createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleParagraph getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleParagraph>(create);\n  static ModuleParagraph? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Paragraph get paragraph => $_getN(0);\n  @$pb.TagNumber(1)\n  set paragraph(Paragraph value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasParagraph() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearParagraph() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Paragraph ensureParagraph() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.bool get isArticleTitle => $_getBF(1);\n  @$pb.TagNumber(2)\n  set isArticleTitle($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIsArticleTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIsArticleTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  ParaSpacing get paraSpacing => $_getN(2);\n  @$pb.TagNumber(3)\n  set paraSpacing(ParaSpacing value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasParaSpacing() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearParaSpacing() => $_clearField(3);\n  @$pb.TagNumber(3)\n  ParaSpacing ensureParaSpacing() => $_ensure(2);\n}\n\nclass ModuleRcmd extends $pb.GeneratedMessage {\n  factory ModuleRcmd({\n    RcmdAuthor? author,\n    $core.Iterable<RcmdItem>? items,\n    $core.String? serverInfo,\n  }) {\n    final result = create();\n    if (author != null) result.author = author;\n    if (items != null) result.items.addAll(items);\n    if (serverInfo != null) result.serverInfo = serverInfo;\n    return result;\n  }\n\n  ModuleRcmd._();\n\n  factory ModuleRcmd.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleRcmd.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleRcmd',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<RcmdAuthor>(1, _omitFieldNames ? '' : 'author',\n        subBuilder: RcmdAuthor.create)\n    ..pPM<RcmdItem>(2, _omitFieldNames ? '' : 'items',\n        subBuilder: RcmdItem.create)\n    ..aOS(3, _omitFieldNames ? '' : 'serverInfo')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleRcmd clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleRcmd copyWith(void Function(ModuleRcmd) updates) =>\n      super.copyWith((message) => updates(message as ModuleRcmd)) as ModuleRcmd;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleRcmd create() => ModuleRcmd._();\n  @$core.override\n  ModuleRcmd createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleRcmd getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleRcmd>(create);\n  static ModuleRcmd? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  RcmdAuthor get author => $_getN(0);\n  @$pb.TagNumber(1)\n  set author(RcmdAuthor value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAuthor() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAuthor() => $_clearField(1);\n  @$pb.TagNumber(1)\n  RcmdAuthor ensureAuthor() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<RcmdItem> get items => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $core.String get serverInfo => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set serverInfo($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasServerInfo() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearServerInfo() => $_clearField(3);\n}\n\nclass ModuleRecommend extends $pb.GeneratedMessage {\n  factory ModuleRecommend({\n    $core.String? moduleTitle,\n    $core.String? image,\n    $core.String? tag,\n    $core.String? title,\n    $core.String? jumpUrl,\n    $core.Iterable<$6.Any>? ad,\n  }) {\n    final result = create();\n    if (moduleTitle != null) result.moduleTitle = moduleTitle;\n    if (image != null) result.image = image;\n    if (tag != null) result.tag = tag;\n    if (title != null) result.title = title;\n    if (jumpUrl != null) result.jumpUrl = jumpUrl;\n    if (ad != null) result.ad.addAll(ad);\n    return result;\n  }\n\n  ModuleRecommend._();\n\n  factory ModuleRecommend.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleRecommend.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleRecommend',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'moduleTitle')\n    ..aOS(2, _omitFieldNames ? '' : 'image')\n    ..aOS(3, _omitFieldNames ? '' : 'tag')\n    ..aOS(4, _omitFieldNames ? '' : 'title')\n    ..aOS(5, _omitFieldNames ? '' : 'jumpUrl')\n    ..pPM<$6.Any>(6, _omitFieldNames ? '' : 'ad', subBuilder: $6.Any.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleRecommend clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleRecommend copyWith(void Function(ModuleRecommend) updates) =>\n      super.copyWith((message) => updates(message as ModuleRecommend))\n          as ModuleRecommend;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleRecommend create() => ModuleRecommend._();\n  @$core.override\n  ModuleRecommend createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleRecommend getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleRecommend>(create);\n  static ModuleRecommend? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get moduleTitle => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set moduleTitle($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasModuleTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearModuleTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get image => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set image($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasImage() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearImage() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get tag => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set tag($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTag() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTag() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get title => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set title($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTitle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTitle() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get jumpUrl => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set jumpUrl($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasJumpUrl() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearJumpUrl() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $pb.PbList<$6.Any> get ad => $_getList(5);\n}\n\nclass ModuleShareInfo extends $pb.GeneratedMessage {\n  factory ModuleShareInfo({\n    $core.String? title,\n    $core.Iterable<ShareChannel>? shareChannels,\n    $core.String? shareOrigin,\n    $core.String? oid,\n    $core.String? sid,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (shareChannels != null) result.shareChannels.addAll(shareChannels);\n    if (shareOrigin != null) result.shareOrigin = shareOrigin;\n    if (oid != null) result.oid = oid;\n    if (sid != null) result.sid = sid;\n    return result;\n  }\n\n  ModuleShareInfo._();\n\n  factory ModuleShareInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleShareInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleShareInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..pPM<ShareChannel>(2, _omitFieldNames ? '' : 'shareChannels',\n        subBuilder: ShareChannel.create)\n    ..aOS(3, _omitFieldNames ? '' : 'shareOrigin')\n    ..aOS(4, _omitFieldNames ? '' : 'oid')\n    ..aOS(5, _omitFieldNames ? '' : 'sid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleShareInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleShareInfo copyWith(void Function(ModuleShareInfo) updates) =>\n      super.copyWith((message) => updates(message as ModuleShareInfo))\n          as ModuleShareInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleShareInfo create() => ModuleShareInfo._();\n  @$core.override\n  ModuleShareInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleShareInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleShareInfo>(create);\n  static ModuleShareInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<ShareChannel> get shareChannels => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $core.String get shareOrigin => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set shareOrigin($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasShareOrigin() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearShareOrigin() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get oid => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set oid($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasOid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearOid() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get sid => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set sid($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasSid() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearSid() => $_clearField(5);\n}\n\nclass ModuleSneakingAd extends $pb.GeneratedMessage {\n  factory ModuleSneakingAd({\n    $core.String? clientActionType,\n  }) {\n    final result = create();\n    if (clientActionType != null) result.clientActionType = clientActionType;\n    return result;\n  }\n\n  ModuleSneakingAd._();\n\n  factory ModuleSneakingAd.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleSneakingAd.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleSneakingAd',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'clientActionType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleSneakingAd clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleSneakingAd copyWith(void Function(ModuleSneakingAd) updates) =>\n      super.copyWith((message) => updates(message as ModuleSneakingAd))\n          as ModuleSneakingAd;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleSneakingAd create() => ModuleSneakingAd._();\n  @$core.override\n  ModuleSneakingAd createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleSneakingAd getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleSneakingAd>(create);\n  static ModuleSneakingAd? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get clientActionType => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set clientActionType($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasClientActionType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearClientActionType() => $_clearField(1);\n}\n\nclass ModuleStat extends $pb.GeneratedMessage {\n  factory ModuleStat({\n    $fixnum.Int64? repost,\n    $fixnum.Int64? like,\n    $fixnum.Int64? reply,\n    LikeInfo? likeInfo,\n    $core.bool? noComment,\n    $core.bool? noForward,\n    $core.String? replyUrl,\n    $core.String? noCommentText,\n    $core.String? noForwardText,\n    $fixnum.Int64? favorite,\n    $core.bool? isFavorite,\n    $core.bool? noLike,\n    $core.String? noLikeText,\n  }) {\n    final result = create();\n    if (repost != null) result.repost = repost;\n    if (like != null) result.like = like;\n    if (reply != null) result.reply = reply;\n    if (likeInfo != null) result.likeInfo = likeInfo;\n    if (noComment != null) result.noComment = noComment;\n    if (noForward != null) result.noForward = noForward;\n    if (replyUrl != null) result.replyUrl = replyUrl;\n    if (noCommentText != null) result.noCommentText = noCommentText;\n    if (noForwardText != null) result.noForwardText = noForwardText;\n    if (favorite != null) result.favorite = favorite;\n    if (isFavorite != null) result.isFavorite = isFavorite;\n    if (noLike != null) result.noLike = noLike;\n    if (noLikeText != null) result.noLikeText = noLikeText;\n    return result;\n  }\n\n  ModuleStat._();\n\n  factory ModuleStat.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleStat.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleStat',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'repost')\n    ..aInt64(2, _omitFieldNames ? '' : 'like')\n    ..aInt64(3, _omitFieldNames ? '' : 'reply')\n    ..aOM<LikeInfo>(4, _omitFieldNames ? '' : 'likeInfo',\n        subBuilder: LikeInfo.create)\n    ..aOB(5, _omitFieldNames ? '' : 'noComment')\n    ..aOB(6, _omitFieldNames ? '' : 'noForward')\n    ..aOS(7, _omitFieldNames ? '' : 'replyUrl')\n    ..aOS(8, _omitFieldNames ? '' : 'noCommentText')\n    ..aOS(9, _omitFieldNames ? '' : 'noForwardText')\n    ..aInt64(10, _omitFieldNames ? '' : 'favorite')\n    ..aOB(11, _omitFieldNames ? '' : 'isFavorite')\n    ..aOB(12, _omitFieldNames ? '' : 'noLike')\n    ..aOS(13, _omitFieldNames ? '' : 'noLikeText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleStat clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleStat copyWith(void Function(ModuleStat) updates) =>\n      super.copyWith((message) => updates(message as ModuleStat)) as ModuleStat;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleStat create() => ModuleStat._();\n  @$core.override\n  ModuleStat createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleStat getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleStat>(create);\n  static ModuleStat? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get repost => $_getI64(0);\n  @$pb.TagNumber(1)\n  set repost($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasRepost() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRepost() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get like => $_getI64(1);\n  @$pb.TagNumber(2)\n  set like($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLike() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLike() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get reply => $_getI64(2);\n  @$pb.TagNumber(3)\n  set reply($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasReply() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearReply() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  LikeInfo get likeInfo => $_getN(3);\n  @$pb.TagNumber(4)\n  set likeInfo(LikeInfo value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLikeInfo() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLikeInfo() => $_clearField(4);\n  @$pb.TagNumber(4)\n  LikeInfo ensureLikeInfo() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.bool get noComment => $_getBF(4);\n  @$pb.TagNumber(5)\n  set noComment($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasNoComment() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearNoComment() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.bool get noForward => $_getBF(5);\n  @$pb.TagNumber(6)\n  set noForward($core.bool value) => $_setBool(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasNoForward() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearNoForward() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get replyUrl => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set replyUrl($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasReplyUrl() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearReplyUrl() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get noCommentText => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set noCommentText($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasNoCommentText() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearNoCommentText() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get noForwardText => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set noForwardText($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasNoForwardText() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearNoForwardText() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $fixnum.Int64 get favorite => $_getI64(9);\n  @$pb.TagNumber(10)\n  set favorite($fixnum.Int64 value) => $_setInt64(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasFavorite() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearFavorite() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.bool get isFavorite => $_getBF(10);\n  @$pb.TagNumber(11)\n  set isFavorite($core.bool value) => $_setBool(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasIsFavorite() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearIsFavorite() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.bool get noLike => $_getBF(11);\n  @$pb.TagNumber(12)\n  set noLike($core.bool value) => $_setBool(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasNoLike() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearNoLike() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.String get noLikeText => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set noLikeText($core.String value) => $_setString(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasNoLikeText() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearNoLikeText() => $_clearField(13);\n}\n\nclass ModuleStory extends $pb.GeneratedMessage {\n  factory ModuleStory({\n    $core.String? title,\n    $core.Iterable<StoryItem>? items,\n    $core.bool? showPublishEntrance,\n    $fixnum.Int64? foldState,\n    $core.String? uri,\n    $core.String? cover,\n    $core.String? publishText,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (items != null) result.items.addAll(items);\n    if (showPublishEntrance != null)\n      result.showPublishEntrance = showPublishEntrance;\n    if (foldState != null) result.foldState = foldState;\n    if (uri != null) result.uri = uri;\n    if (cover != null) result.cover = cover;\n    if (publishText != null) result.publishText = publishText;\n    return result;\n  }\n\n  ModuleStory._();\n\n  factory ModuleStory.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleStory.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleStory',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..pPM<StoryItem>(2, _omitFieldNames ? '' : 'items',\n        subBuilder: StoryItem.create)\n    ..aOB(3, _omitFieldNames ? '' : 'showPublishEntrance')\n    ..aInt64(4, _omitFieldNames ? '' : 'foldState')\n    ..aOS(5, _omitFieldNames ? '' : 'uri')\n    ..aOS(6, _omitFieldNames ? '' : 'cover')\n    ..aOS(7, _omitFieldNames ? '' : 'publishText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleStory clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleStory copyWith(void Function(ModuleStory) updates) =>\n      super.copyWith((message) => updates(message as ModuleStory))\n          as ModuleStory;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleStory create() => ModuleStory._();\n  @$core.override\n  ModuleStory createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleStory getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleStory>(create);\n  static ModuleStory? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<StoryItem> get items => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $core.bool get showPublishEntrance => $_getBF(2);\n  @$pb.TagNumber(3)\n  set showPublishEntrance($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasShowPublishEntrance() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearShowPublishEntrance() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get foldState => $_getI64(3);\n  @$pb.TagNumber(4)\n  set foldState($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFoldState() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFoldState() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get uri => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set uri($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasUri() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearUri() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get cover => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set cover($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCover() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCover() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get publishText => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set publishText($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasPublishText() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearPublishText() => $_clearField(7);\n}\n\nclass ModuleTextNotice extends $pb.GeneratedMessage {\n  factory ModuleTextNotice({\n    OneLineText? notice,\n  }) {\n    final result = create();\n    if (notice != null) result.notice = notice;\n    return result;\n  }\n\n  ModuleTextNotice._();\n\n  factory ModuleTextNotice.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleTextNotice.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleTextNotice',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<OneLineText>(1, _omitFieldNames ? '' : 'notice',\n        subBuilder: OneLineText.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleTextNotice clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleTextNotice copyWith(void Function(ModuleTextNotice) updates) =>\n      super.copyWith((message) => updates(message as ModuleTextNotice))\n          as ModuleTextNotice;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleTextNotice create() => ModuleTextNotice._();\n  @$core.override\n  ModuleTextNotice createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleTextNotice getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleTextNotice>(create);\n  static ModuleTextNotice? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  OneLineText get notice => $_getN(0);\n  @$pb.TagNumber(1)\n  set notice(OneLineText value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasNotice() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearNotice() => $_clearField(1);\n  @$pb.TagNumber(1)\n  OneLineText ensureNotice() => $_ensure(0);\n}\n\nclass ModuleTitle extends $pb.GeneratedMessage {\n  factory ModuleTitle({\n    $core.String? title,\n    IconButton? rightBtn,\n    $core.int? titleStyle,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (rightBtn != null) result.rightBtn = rightBtn;\n    if (titleStyle != null) result.titleStyle = titleStyle;\n    return result;\n  }\n\n  ModuleTitle._();\n\n  factory ModuleTitle.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleTitle.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleTitle',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOM<IconButton>(2, _omitFieldNames ? '' : 'rightBtn',\n        subBuilder: IconButton.create)\n    ..aI(3, _omitFieldNames ? '' : 'titleStyle')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleTitle clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleTitle copyWith(void Function(ModuleTitle) updates) =>\n      super.copyWith((message) => updates(message as ModuleTitle))\n          as ModuleTitle;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleTitle create() => ModuleTitle._();\n  @$core.override\n  ModuleTitle createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleTitle getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleTitle>(create);\n  static ModuleTitle? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  IconButton get rightBtn => $_getN(1);\n  @$pb.TagNumber(2)\n  set rightBtn(IconButton value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasRightBtn() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRightBtn() => $_clearField(2);\n  @$pb.TagNumber(2)\n  IconButton ensureRightBtn() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.int get titleStyle => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set titleStyle($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTitleStyle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTitleStyle() => $_clearField(3);\n}\n\nclass ModuleTop extends $pb.GeneratedMessage {\n  factory ModuleTop({\n    $core.Iterable<ThreePointItem>? tpList,\n    MdlDynArchive? archive,\n    ModuleAuthor? author,\n    $core.bool? hiddenNavBar,\n    ModuleAuthorForSubscribe? subscribeAuthor,\n  }) {\n    final result = create();\n    if (tpList != null) result.tpList.addAll(tpList);\n    if (archive != null) result.archive = archive;\n    if (author != null) result.author = author;\n    if (hiddenNavBar != null) result.hiddenNavBar = hiddenNavBar;\n    if (subscribeAuthor != null) result.subscribeAuthor = subscribeAuthor;\n    return result;\n  }\n\n  ModuleTop._();\n\n  factory ModuleTop.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleTop.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleTop',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<ThreePointItem>(1, _omitFieldNames ? '' : 'tpList',\n        subBuilder: ThreePointItem.create)\n    ..aOM<MdlDynArchive>(2, _omitFieldNames ? '' : 'archive',\n        subBuilder: MdlDynArchive.create)\n    ..aOM<ModuleAuthor>(3, _omitFieldNames ? '' : 'author',\n        subBuilder: ModuleAuthor.create)\n    ..aOB(4, _omitFieldNames ? '' : 'hiddenNavBar')\n    ..aOM<ModuleAuthorForSubscribe>(5, _omitFieldNames ? '' : 'subscribeAuthor',\n        subBuilder: ModuleAuthorForSubscribe.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleTop clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleTop copyWith(void Function(ModuleTop) updates) =>\n      super.copyWith((message) => updates(message as ModuleTop)) as ModuleTop;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleTop create() => ModuleTop._();\n  @$core.override\n  ModuleTop createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleTop getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ModuleTop>(create);\n  static ModuleTop? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<ThreePointItem> get tpList => $_getList(0);\n\n  @$pb.TagNumber(2)\n  MdlDynArchive get archive => $_getN(1);\n  @$pb.TagNumber(2)\n  set archive(MdlDynArchive value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasArchive() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearArchive() => $_clearField(2);\n  @$pb.TagNumber(2)\n  MdlDynArchive ensureArchive() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  ModuleAuthor get author => $_getN(2);\n  @$pb.TagNumber(3)\n  set author(ModuleAuthor value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAuthor() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAuthor() => $_clearField(3);\n  @$pb.TagNumber(3)\n  ModuleAuthor ensureAuthor() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.bool get hiddenNavBar => $_getBF(3);\n  @$pb.TagNumber(4)\n  set hiddenNavBar($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasHiddenNavBar() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearHiddenNavBar() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  ModuleAuthorForSubscribe get subscribeAuthor => $_getN(4);\n  @$pb.TagNumber(5)\n  set subscribeAuthor(ModuleAuthorForSubscribe value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasSubscribeAuthor() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearSubscribeAuthor() => $_clearField(5);\n  @$pb.TagNumber(5)\n  ModuleAuthorForSubscribe ensureSubscribeAuthor() => $_ensure(4);\n}\n\nclass ModuleTopTag extends $pb.GeneratedMessage {\n  factory ModuleTopTag({\n    $core.String? tagName,\n  }) {\n    final result = create();\n    if (tagName != null) result.tagName = tagName;\n    return result;\n  }\n\n  ModuleTopTag._();\n\n  factory ModuleTopTag.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleTopTag.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleTopTag',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'tagName')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleTopTag clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleTopTag copyWith(void Function(ModuleTopTag) updates) =>\n      super.copyWith((message) => updates(message as ModuleTopTag))\n          as ModuleTopTag;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleTopTag create() => ModuleTopTag._();\n  @$core.override\n  ModuleTopTag createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleTopTag getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleTopTag>(create);\n  static ModuleTopTag? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get tagName => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set tagName($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTagName() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTagName() => $_clearField(1);\n}\n\nclass ModuleTopic extends $pb.GeneratedMessage {\n  factory ModuleTopic({\n    $fixnum.Int64? id,\n    $core.String? name,\n    $core.String? url,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (name != null) result.name = name;\n    if (url != null) result.url = url;\n    return result;\n  }\n\n  ModuleTopic._();\n\n  factory ModuleTopic.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleTopic.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleTopic',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'url')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleTopic clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleTopic copyWith(void Function(ModuleTopic) updates) =>\n      super.copyWith((message) => updates(message as ModuleTopic))\n          as ModuleTopic;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleTopic create() => ModuleTopic._();\n  @$core.override\n  ModuleTopic createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleTopic getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleTopic>(create);\n  static ModuleTopic? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get url => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set url($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUrl() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUrl() => $_clearField(3);\n}\n\nclass ModuleTopicBrief extends $pb.GeneratedMessage {\n  factory ModuleTopicBrief({\n    TopicItem? topic,\n  }) {\n    final result = create();\n    if (topic != null) result.topic = topic;\n    return result;\n  }\n\n  ModuleTopicBrief._();\n\n  factory ModuleTopicBrief.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleTopicBrief.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleTopicBrief',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<TopicItem>(1, _omitFieldNames ? '' : 'topic',\n        subBuilder: TopicItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleTopicBrief clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleTopicBrief copyWith(void Function(ModuleTopicBrief) updates) =>\n      super.copyWith((message) => updates(message as ModuleTopicBrief))\n          as ModuleTopicBrief;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleTopicBrief create() => ModuleTopicBrief._();\n  @$core.override\n  ModuleTopicBrief createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleTopicBrief getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleTopicBrief>(create);\n  static ModuleTopicBrief? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  TopicItem get topic => $_getN(0);\n  @$pb.TagNumber(1)\n  set topic(TopicItem value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTopic() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTopic() => $_clearField(1);\n  @$pb.TagNumber(1)\n  TopicItem ensureTopic() => $_ensure(0);\n}\n\nclass ModuleTopicDetailsExt extends $pb.GeneratedMessage {\n  factory ModuleTopicDetailsExt({\n    $core.String? commentGuide,\n  }) {\n    final result = create();\n    if (commentGuide != null) result.commentGuide = commentGuide;\n    return result;\n  }\n\n  ModuleTopicDetailsExt._();\n\n  factory ModuleTopicDetailsExt.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModuleTopicDetailsExt.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModuleTopicDetailsExt',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'commentGuide')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleTopicDetailsExt clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModuleTopicDetailsExt copyWith(\n          void Function(ModuleTopicDetailsExt) updates) =>\n      super.copyWith((message) => updates(message as ModuleTopicDetailsExt))\n          as ModuleTopicDetailsExt;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModuleTopicDetailsExt create() => ModuleTopicDetailsExt._();\n  @$core.override\n  ModuleTopicDetailsExt createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModuleTopicDetailsExt getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModuleTopicDetailsExt>(create);\n  static ModuleTopicDetailsExt? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get commentGuide => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set commentGuide($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCommentGuide() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCommentGuide() => $_clearField(1);\n}\n\nclass NFTInfo extends $pb.GeneratedMessage {\n  factory NFTInfo({\n    NFTRegionType? regionType,\n    $core.String? regionIcon,\n    NFTShowStatus? regionShowStatus,\n  }) {\n    final result = create();\n    if (regionType != null) result.regionType = regionType;\n    if (regionIcon != null) result.regionIcon = regionIcon;\n    if (regionShowStatus != null) result.regionShowStatus = regionShowStatus;\n    return result;\n  }\n\n  NFTInfo._();\n\n  factory NFTInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory NFTInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'NFTInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aE<NFTRegionType>(1, _omitFieldNames ? '' : 'regionType',\n        enumValues: NFTRegionType.values)\n    ..aOS(2, _omitFieldNames ? '' : 'regionIcon')\n    ..aE<NFTShowStatus>(3, _omitFieldNames ? '' : 'regionShowStatus',\n        enumValues: NFTShowStatus.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NFTInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NFTInfo copyWith(void Function(NFTInfo) updates) =>\n      super.copyWith((message) => updates(message as NFTInfo)) as NFTInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static NFTInfo create() => NFTInfo._();\n  @$core.override\n  NFTInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static NFTInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<NFTInfo>(create);\n  static NFTInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  NFTRegionType get regionType => $_getN(0);\n  @$pb.TagNumber(1)\n  set regionType(NFTRegionType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasRegionType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRegionType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get regionIcon => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set regionIcon($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasRegionIcon() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRegionIcon() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  NFTShowStatus get regionShowStatus => $_getN(2);\n  @$pb.TagNumber(3)\n  set regionShowStatus(NFTShowStatus value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRegionShowStatus() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRegionShowStatus() => $_clearField(3);\n}\n\nclass Nameplate extends $pb.GeneratedMessage {\n  factory Nameplate({\n    $fixnum.Int64? nid,\n    $core.String? name,\n    $core.String? image,\n    $core.String? imageSmall,\n    $core.String? level,\n    $core.String? condition,\n  }) {\n    final result = create();\n    if (nid != null) result.nid = nid;\n    if (name != null) result.name = name;\n    if (image != null) result.image = image;\n    if (imageSmall != null) result.imageSmall = imageSmall;\n    if (level != null) result.level = level;\n    if (condition != null) result.condition = condition;\n    return result;\n  }\n\n  Nameplate._();\n\n  factory Nameplate.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Nameplate.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Nameplate',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'nid')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'image')\n    ..aOS(4, _omitFieldNames ? '' : 'imageSmall')\n    ..aOS(5, _omitFieldNames ? '' : 'level')\n    ..aOS(6, _omitFieldNames ? '' : 'condition')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Nameplate clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Nameplate copyWith(void Function(Nameplate) updates) =>\n      super.copyWith((message) => updates(message as Nameplate)) as Nameplate;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Nameplate create() => Nameplate._();\n  @$core.override\n  Nameplate createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Nameplate getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Nameplate>(create);\n  static Nameplate? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get nid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set nid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasNid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearNid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get image => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set image($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasImage() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearImage() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get imageSmall => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set imageSmall($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasImageSmall() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearImageSmall() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get level => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set level($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasLevel() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearLevel() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get condition => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set condition($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCondition() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCondition() => $_clearField(6);\n}\n\nclass NewEP extends $pb.GeneratedMessage {\n  factory NewEP({\n    $core.int? id,\n    $core.String? indexShow,\n    $core.String? cover,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (indexShow != null) result.indexShow = indexShow;\n    if (cover != null) result.cover = cover;\n    return result;\n  }\n\n  NewEP._();\n\n  factory NewEP.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory NewEP.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'NewEP',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'indexShow')\n    ..aOS(3, _omitFieldNames ? '' : 'cover')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NewEP clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NewEP copyWith(void Function(NewEP) updates) =>\n      super.copyWith((message) => updates(message as NewEP)) as NewEP;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static NewEP create() => NewEP._();\n  @$core.override\n  NewEP createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static NewEP getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<NewEP>(create);\n  static NewEP? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get id => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set id($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get indexShow => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set indexShow($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIndexShow() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIndexShow() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get cover => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set cover($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCover() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCover() => $_clearField(3);\n}\n\nclass NoReply extends $pb.GeneratedMessage {\n  factory NoReply() => create();\n\n  NoReply._();\n\n  factory NoReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory NoReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'NoReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NoReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NoReply copyWith(void Function(NoReply) updates) =>\n      super.copyWith((message) => updates(message as NoReply)) as NoReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static NoReply create() => NoReply._();\n  @$core.override\n  NoReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static NoReply getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<NoReply>(create);\n  static NoReply? _defaultInstance;\n}\n\nclass NoReq extends $pb.GeneratedMessage {\n  factory NoReq() => create();\n\n  NoReq._();\n\n  factory NoReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory NoReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'NoReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NoReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NoReq copyWith(void Function(NoReq) updates) =>\n      super.copyWith((message) => updates(message as NoReq)) as NoReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static NoReq create() => NoReq._();\n  @$core.override\n  NoReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static NoReq getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<NoReq>(create);\n  static NoReq? _defaultInstance;\n}\n\nclass NoteVideoTS extends $pb.GeneratedMessage {\n  factory NoteVideoTS({\n    $fixnum.Int64? cid,\n    $fixnum.Int64? oidType,\n    $fixnum.Int64? status,\n    $fixnum.Int64? index,\n    $fixnum.Int64? seconds,\n    $fixnum.Int64? cidCount,\n    $core.String? key,\n    $core.String? title,\n    $fixnum.Int64? epid,\n    $core.String? desc,\n  }) {\n    final result = create();\n    if (cid != null) result.cid = cid;\n    if (oidType != null) result.oidType = oidType;\n    if (status != null) result.status = status;\n    if (index != null) result.index = index;\n    if (seconds != null) result.seconds = seconds;\n    if (cidCount != null) result.cidCount = cidCount;\n    if (key != null) result.key = key;\n    if (title != null) result.title = title;\n    if (epid != null) result.epid = epid;\n    if (desc != null) result.desc = desc;\n    return result;\n  }\n\n  NoteVideoTS._();\n\n  factory NoteVideoTS.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory NoteVideoTS.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'NoteVideoTS',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'cid')\n    ..aInt64(2, _omitFieldNames ? '' : 'oidType')\n    ..aInt64(3, _omitFieldNames ? '' : 'status')\n    ..aInt64(4, _omitFieldNames ? '' : 'index')\n    ..aInt64(5, _omitFieldNames ? '' : 'seconds')\n    ..aInt64(6, _omitFieldNames ? '' : 'cidCount')\n    ..aOS(7, _omitFieldNames ? '' : 'key')\n    ..aOS(8, _omitFieldNames ? '' : 'title')\n    ..aInt64(9, _omitFieldNames ? '' : 'epid')\n    ..aOS(10, _omitFieldNames ? '' : 'desc')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NoteVideoTS clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NoteVideoTS copyWith(void Function(NoteVideoTS) updates) =>\n      super.copyWith((message) => updates(message as NoteVideoTS))\n          as NoteVideoTS;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static NoteVideoTS create() => NoteVideoTS._();\n  @$core.override\n  NoteVideoTS createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static NoteVideoTS getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<NoteVideoTS>(create);\n  static NoteVideoTS? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get cid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set cid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get oidType => $_getI64(1);\n  @$pb.TagNumber(2)\n  set oidType($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOidType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOidType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get status => $_getI64(2);\n  @$pb.TagNumber(3)\n  set status($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasStatus() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearStatus() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get index => $_getI64(3);\n  @$pb.TagNumber(4)\n  set index($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIndex() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIndex() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get seconds => $_getI64(4);\n  @$pb.TagNumber(5)\n  set seconds($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasSeconds() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearSeconds() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get cidCount => $_getI64(5);\n  @$pb.TagNumber(6)\n  set cidCount($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCidCount() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCidCount() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get key => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set key($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasKey() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearKey() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get title => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set title($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasTitle() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearTitle() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get epid => $_getI64(8);\n  @$pb.TagNumber(9)\n  set epid($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasEpid() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearEpid() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get desc => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set desc($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasDesc() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearDesc() => $_clearField(10);\n}\n\nclass OfficialAccountInfo extends $pb.GeneratedMessage {\n  factory OfficialAccountInfo({\n    UserInfo? author,\n    $fixnum.Int64? mid,\n    $core.String? uri,\n    Relation? relation,\n    $core.String? descText1,\n    $core.String? descText2,\n  }) {\n    final result = create();\n    if (author != null) result.author = author;\n    if (mid != null) result.mid = mid;\n    if (uri != null) result.uri = uri;\n    if (relation != null) result.relation = relation;\n    if (descText1 != null) result.descText1 = descText1;\n    if (descText2 != null) result.descText2 = descText2;\n    return result;\n  }\n\n  OfficialAccountInfo._();\n\n  factory OfficialAccountInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OfficialAccountInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OfficialAccountInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<UserInfo>(1, _omitFieldNames ? '' : 'author',\n        subBuilder: UserInfo.create)\n    ..aInt64(2, _omitFieldNames ? '' : 'mid')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..aOM<Relation>(4, _omitFieldNames ? '' : 'relation',\n        subBuilder: Relation.create)\n    ..aOS(5, _omitFieldNames ? '' : 'descText1')\n    ..aOS(6, _omitFieldNames ? '' : 'descText2')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OfficialAccountInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OfficialAccountInfo copyWith(void Function(OfficialAccountInfo) updates) =>\n      super.copyWith((message) => updates(message as OfficialAccountInfo))\n          as OfficialAccountInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OfficialAccountInfo create() => OfficialAccountInfo._();\n  @$core.override\n  OfficialAccountInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OfficialAccountInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OfficialAccountInfo>(create);\n  static OfficialAccountInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  UserInfo get author => $_getN(0);\n  @$pb.TagNumber(1)\n  set author(UserInfo value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAuthor() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAuthor() => $_clearField(1);\n  @$pb.TagNumber(1)\n  UserInfo ensureAuthor() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get mid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set mid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  Relation get relation => $_getN(3);\n  @$pb.TagNumber(4)\n  set relation(Relation value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasRelation() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearRelation() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Relation ensureRelation() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.String get descText1 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set descText1($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDescText1() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDescText1() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get descText2 => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set descText2($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasDescText2() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearDescText2() => $_clearField(6);\n}\n\nclass OfficialAccountsReply extends $pb.GeneratedMessage {\n  factory OfficialAccountsReply({\n    $core.Iterable<OfficialAccountInfo>? items,\n    $core.bool? hasMore,\n    $fixnum.Int64? offset,\n  }) {\n    final result = create();\n    if (items != null) result.items.addAll(items);\n    if (hasMore != null) result.hasMore = hasMore;\n    if (offset != null) result.offset = offset;\n    return result;\n  }\n\n  OfficialAccountsReply._();\n\n  factory OfficialAccountsReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OfficialAccountsReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OfficialAccountsReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<OfficialAccountInfo>(1, _omitFieldNames ? '' : 'items',\n        subBuilder: OfficialAccountInfo.create)\n    ..aOB(2, _omitFieldNames ? '' : 'hasMore')\n    ..aInt64(3, _omitFieldNames ? '' : 'offset')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OfficialAccountsReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OfficialAccountsReply copyWith(\n          void Function(OfficialAccountsReply) updates) =>\n      super.copyWith((message) => updates(message as OfficialAccountsReply))\n          as OfficialAccountsReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OfficialAccountsReply create() => OfficialAccountsReply._();\n  @$core.override\n  OfficialAccountsReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OfficialAccountsReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OfficialAccountsReply>(create);\n  static OfficialAccountsReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<OfficialAccountInfo> get items => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.bool get hasMore => $_getBF(1);\n  @$pb.TagNumber(2)\n  set hasMore($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHasMore() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHasMore() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get offset => $_getI64(2);\n  @$pb.TagNumber(3)\n  set offset($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasOffset() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearOffset() => $_clearField(3);\n}\n\nclass OfficialAccountsReq extends $pb.GeneratedMessage {\n  factory OfficialAccountsReq({\n    $fixnum.Int64? campusId,\n    $core.String? campusName,\n    $fixnum.Int64? offset,\n    CampusReqFromType? fromType,\n  }) {\n    final result = create();\n    if (campusId != null) result.campusId = campusId;\n    if (campusName != null) result.campusName = campusName;\n    if (offset != null) result.offset = offset;\n    if (fromType != null) result.fromType = fromType;\n    return result;\n  }\n\n  OfficialAccountsReq._();\n\n  factory OfficialAccountsReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OfficialAccountsReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OfficialAccountsReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'campusId')\n    ..aOS(2, _omitFieldNames ? '' : 'campusName')\n    ..aInt64(3, _omitFieldNames ? '' : 'offset')\n    ..aE<CampusReqFromType>(4, _omitFieldNames ? '' : 'fromType',\n        enumValues: CampusReqFromType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OfficialAccountsReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OfficialAccountsReq copyWith(void Function(OfficialAccountsReq) updates) =>\n      super.copyWith((message) => updates(message as OfficialAccountsReq))\n          as OfficialAccountsReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OfficialAccountsReq create() => OfficialAccountsReq._();\n  @$core.override\n  OfficialAccountsReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OfficialAccountsReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OfficialAccountsReq>(create);\n  static OfficialAccountsReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get campusId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set campusId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCampusId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCampusId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get campusName => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set campusName($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCampusName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCampusName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get offset => $_getI64(2);\n  @$pb.TagNumber(3)\n  set offset($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasOffset() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearOffset() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  CampusReqFromType get fromType => $_getN(3);\n  @$pb.TagNumber(4)\n  set fromType(CampusReqFromType value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFromType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFromType() => $_clearField(4);\n}\n\nclass OfficialDynamicsReply extends $pb.GeneratedMessage {\n  factory OfficialDynamicsReply({\n    $core.Iterable<OfficialItem>? items,\n    $fixnum.Int64? offset,\n    $core.bool? hasMore,\n    $1.PlayerArgs? playerArgs,\n  }) {\n    final result = create();\n    if (items != null) result.items.addAll(items);\n    if (offset != null) result.offset = offset;\n    if (hasMore != null) result.hasMore = hasMore;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    return result;\n  }\n\n  OfficialDynamicsReply._();\n\n  factory OfficialDynamicsReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OfficialDynamicsReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OfficialDynamicsReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<OfficialItem>(1, _omitFieldNames ? '' : 'items',\n        subBuilder: OfficialItem.create)\n    ..aInt64(2, _omitFieldNames ? '' : 'offset')\n    ..aOB(3, _omitFieldNames ? '' : 'hasMore')\n    ..aOM<$1.PlayerArgs>(4, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $1.PlayerArgs.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OfficialDynamicsReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OfficialDynamicsReply copyWith(\n          void Function(OfficialDynamicsReply) updates) =>\n      super.copyWith((message) => updates(message as OfficialDynamicsReply))\n          as OfficialDynamicsReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OfficialDynamicsReply create() => OfficialDynamicsReply._();\n  @$core.override\n  OfficialDynamicsReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OfficialDynamicsReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OfficialDynamicsReply>(create);\n  static OfficialDynamicsReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<OfficialItem> get items => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get offset => $_getI64(1);\n  @$pb.TagNumber(2)\n  set offset($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOffset() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOffset() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get hasMore => $_getBF(2);\n  @$pb.TagNumber(3)\n  set hasMore($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasHasMore() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearHasMore() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $1.PlayerArgs get playerArgs => $_getN(3);\n  @$pb.TagNumber(4)\n  set playerArgs($1.PlayerArgs value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPlayerArgs() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPlayerArgs() => $_clearField(4);\n  @$pb.TagNumber(4)\n  $1.PlayerArgs ensurePlayerArgs() => $_ensure(3);\n}\n\nclass OfficialDynamicsReq extends $pb.GeneratedMessage {\n  factory OfficialDynamicsReq({\n    $fixnum.Int64? campusId,\n    $core.String? campusName,\n    $fixnum.Int64? offset,\n    CampusReqFromType? fromType,\n  }) {\n    final result = create();\n    if (campusId != null) result.campusId = campusId;\n    if (campusName != null) result.campusName = campusName;\n    if (offset != null) result.offset = offset;\n    if (fromType != null) result.fromType = fromType;\n    return result;\n  }\n\n  OfficialDynamicsReq._();\n\n  factory OfficialDynamicsReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OfficialDynamicsReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OfficialDynamicsReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'campusId')\n    ..aOS(2, _omitFieldNames ? '' : 'campusName')\n    ..aInt64(3, _omitFieldNames ? '' : 'offset')\n    ..aE<CampusReqFromType>(4, _omitFieldNames ? '' : 'fromType',\n        enumValues: CampusReqFromType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OfficialDynamicsReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OfficialDynamicsReq copyWith(void Function(OfficialDynamicsReq) updates) =>\n      super.copyWith((message) => updates(message as OfficialDynamicsReq))\n          as OfficialDynamicsReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OfficialDynamicsReq create() => OfficialDynamicsReq._();\n  @$core.override\n  OfficialDynamicsReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OfficialDynamicsReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OfficialDynamicsReq>(create);\n  static OfficialDynamicsReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get campusId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set campusId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCampusId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCampusId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get campusName => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set campusName($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCampusName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCampusName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get offset => $_getI64(2);\n  @$pb.TagNumber(3)\n  set offset($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasOffset() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearOffset() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  CampusReqFromType get fromType => $_getN(3);\n  @$pb.TagNumber(4)\n  set fromType(CampusReqFromType value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFromType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFromType() => $_clearField(4);\n}\n\nenum OfficialItem_RcmdItem { rcmdArchive, rcmdDynamic, notSet }\n\nclass OfficialItem extends $pb.GeneratedMessage {\n  factory OfficialItem({\n    RcmdType? type,\n    OfficialRcmdArchive? rcmdArchive,\n    OfficialRcmdDynamic? rcmdDynamic,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (rcmdArchive != null) result.rcmdArchive = rcmdArchive;\n    if (rcmdDynamic != null) result.rcmdDynamic = rcmdDynamic;\n    return result;\n  }\n\n  OfficialItem._();\n\n  factory OfficialItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OfficialItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, OfficialItem_RcmdItem>\n      _OfficialItem_RcmdItemByTag = {\n    2: OfficialItem_RcmdItem.rcmdArchive,\n    3: OfficialItem_RcmdItem.rcmdDynamic,\n    0: OfficialItem_RcmdItem.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OfficialItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..oo(0, [2, 3])\n    ..aE<RcmdType>(1, _omitFieldNames ? '' : 'type',\n        enumValues: RcmdType.values)\n    ..aOM<OfficialRcmdArchive>(2, _omitFieldNames ? '' : 'rcmdArchive',\n        subBuilder: OfficialRcmdArchive.create)\n    ..aOM<OfficialRcmdDynamic>(3, _omitFieldNames ? '' : 'rcmdDynamic',\n        subBuilder: OfficialRcmdDynamic.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OfficialItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OfficialItem copyWith(void Function(OfficialItem) updates) =>\n      super.copyWith((message) => updates(message as OfficialItem))\n          as OfficialItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OfficialItem create() => OfficialItem._();\n  @$core.override\n  OfficialItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OfficialItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OfficialItem>(create);\n  static OfficialItem? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  OfficialItem_RcmdItem whichRcmdItem() =>\n      _OfficialItem_RcmdItemByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  void clearRcmdItem() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  RcmdType get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(RcmdType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  OfficialRcmdArchive get rcmdArchive => $_getN(1);\n  @$pb.TagNumber(2)\n  set rcmdArchive(OfficialRcmdArchive value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasRcmdArchive() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRcmdArchive() => $_clearField(2);\n  @$pb.TagNumber(2)\n  OfficialRcmdArchive ensureRcmdArchive() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  OfficialRcmdDynamic get rcmdDynamic => $_getN(2);\n  @$pb.TagNumber(3)\n  set rcmdDynamic(OfficialRcmdDynamic value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRcmdDynamic() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRcmdDynamic() => $_clearField(3);\n  @$pb.TagNumber(3)\n  OfficialRcmdDynamic ensureRcmdDynamic() => $_ensure(2);\n}\n\nclass OfficialRcmdArchive extends $pb.GeneratedMessage {\n  factory OfficialRcmdArchive({\n    $core.String? title,\n    $core.String? cover,\n    $core.String? coverRightText,\n    CoverIcon? descIcon1,\n    $core.String? descText1,\n    CoverIcon? descIcon2,\n    $core.String? descText2,\n    $core.String? reason,\n    $core.bool? showThreePoint,\n    $core.String? uri,\n    $fixnum.Int64? aid,\n    $fixnum.Int64? mid,\n    $core.String? name,\n    $fixnum.Int64? dynamicId,\n    $fixnum.Int64? cid,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (coverRightText != null) result.coverRightText = coverRightText;\n    if (descIcon1 != null) result.descIcon1 = descIcon1;\n    if (descText1 != null) result.descText1 = descText1;\n    if (descIcon2 != null) result.descIcon2 = descIcon2;\n    if (descText2 != null) result.descText2 = descText2;\n    if (reason != null) result.reason = reason;\n    if (showThreePoint != null) result.showThreePoint = showThreePoint;\n    if (uri != null) result.uri = uri;\n    if (aid != null) result.aid = aid;\n    if (mid != null) result.mid = mid;\n    if (name != null) result.name = name;\n    if (dynamicId != null) result.dynamicId = dynamicId;\n    if (cid != null) result.cid = cid;\n    return result;\n  }\n\n  OfficialRcmdArchive._();\n\n  factory OfficialRcmdArchive.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OfficialRcmdArchive.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OfficialRcmdArchive',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'cover')\n    ..aOS(3, _omitFieldNames ? '' : 'coverRightText')\n    ..aE<CoverIcon>(4, _omitFieldNames ? '' : 'descIcon1',\n        enumValues: CoverIcon.values)\n    ..aOS(5, _omitFieldNames ? '' : 'descText1')\n    ..aE<CoverIcon>(6, _omitFieldNames ? '' : 'descIcon2',\n        enumValues: CoverIcon.values)\n    ..aOS(7, _omitFieldNames ? '' : 'descText2')\n    ..aOS(8, _omitFieldNames ? '' : 'reason')\n    ..aOB(9, _omitFieldNames ? '' : 'showThreePoint')\n    ..aOS(10, _omitFieldNames ? '' : 'uri')\n    ..aInt64(11, _omitFieldNames ? '' : 'aid')\n    ..aInt64(12, _omitFieldNames ? '' : 'mid')\n    ..aOS(13, _omitFieldNames ? '' : 'name')\n    ..aInt64(14, _omitFieldNames ? '' : 'dynamicId')\n    ..aInt64(15, _omitFieldNames ? '' : 'cid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OfficialRcmdArchive clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OfficialRcmdArchive copyWith(void Function(OfficialRcmdArchive) updates) =>\n      super.copyWith((message) => updates(message as OfficialRcmdArchive))\n          as OfficialRcmdArchive;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OfficialRcmdArchive create() => OfficialRcmdArchive._();\n  @$core.override\n  OfficialRcmdArchive createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OfficialRcmdArchive getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OfficialRcmdArchive>(create);\n  static OfficialRcmdArchive? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get cover => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cover($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCover() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCover() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get coverRightText => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set coverRightText($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCoverRightText() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCoverRightText() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  CoverIcon get descIcon1 => $_getN(3);\n  @$pb.TagNumber(4)\n  set descIcon1(CoverIcon value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDescIcon1() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDescIcon1() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get descText1 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set descText1($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDescText1() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDescText1() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  CoverIcon get descIcon2 => $_getN(5);\n  @$pb.TagNumber(6)\n  set descIcon2(CoverIcon value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasDescIcon2() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearDescIcon2() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get descText2 => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set descText2($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasDescText2() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearDescText2() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get reason => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set reason($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasReason() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearReason() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.bool get showThreePoint => $_getBF(8);\n  @$pb.TagNumber(9)\n  set showThreePoint($core.bool value) => $_setBool(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasShowThreePoint() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearShowThreePoint() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get uri => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set uri($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasUri() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearUri() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $fixnum.Int64 get aid => $_getI64(10);\n  @$pb.TagNumber(11)\n  set aid($fixnum.Int64 value) => $_setInt64(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasAid() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearAid() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $fixnum.Int64 get mid => $_getI64(11);\n  @$pb.TagNumber(12)\n  set mid($fixnum.Int64 value) => $_setInt64(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasMid() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearMid() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.String get name => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set name($core.String value) => $_setString(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasName() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearName() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $fixnum.Int64 get dynamicId => $_getI64(13);\n  @$pb.TagNumber(14)\n  set dynamicId($fixnum.Int64 value) => $_setInt64(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasDynamicId() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearDynamicId() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $fixnum.Int64 get cid => $_getI64(14);\n  @$pb.TagNumber(15)\n  set cid($fixnum.Int64 value) => $_setInt64(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasCid() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearCid() => $_clearField(15);\n}\n\nclass OfficialRcmdDynamic extends $pb.GeneratedMessage {\n  factory OfficialRcmdDynamic({\n    $core.String? title,\n    $core.String? cover,\n    $core.String? coverRightTopText,\n    CoverIcon? descIcon1,\n    $core.String? descText1,\n    CoverIcon? descIcon2,\n    $core.String? descText2,\n    $core.String? reason,\n    $core.String? uri,\n    $fixnum.Int64? dynamicId,\n    $fixnum.Int64? mid,\n    $core.String? userName,\n    $fixnum.Int64? rid,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (coverRightTopText != null) result.coverRightTopText = coverRightTopText;\n    if (descIcon1 != null) result.descIcon1 = descIcon1;\n    if (descText1 != null) result.descText1 = descText1;\n    if (descIcon2 != null) result.descIcon2 = descIcon2;\n    if (descText2 != null) result.descText2 = descText2;\n    if (reason != null) result.reason = reason;\n    if (uri != null) result.uri = uri;\n    if (dynamicId != null) result.dynamicId = dynamicId;\n    if (mid != null) result.mid = mid;\n    if (userName != null) result.userName = userName;\n    if (rid != null) result.rid = rid;\n    return result;\n  }\n\n  OfficialRcmdDynamic._();\n\n  factory OfficialRcmdDynamic.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OfficialRcmdDynamic.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OfficialRcmdDynamic',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'cover')\n    ..aOS(3, _omitFieldNames ? '' : 'coverRightTopText')\n    ..aE<CoverIcon>(4, _omitFieldNames ? '' : 'descIcon1',\n        enumValues: CoverIcon.values)\n    ..aOS(5, _omitFieldNames ? '' : 'descText1')\n    ..aE<CoverIcon>(6, _omitFieldNames ? '' : 'descIcon2',\n        enumValues: CoverIcon.values)\n    ..aOS(7, _omitFieldNames ? '' : 'descText2')\n    ..aOS(8, _omitFieldNames ? '' : 'reason')\n    ..aOS(9, _omitFieldNames ? '' : 'uri')\n    ..aInt64(10, _omitFieldNames ? '' : 'dynamicId')\n    ..aInt64(11, _omitFieldNames ? '' : 'mid')\n    ..aOS(12, _omitFieldNames ? '' : 'userName')\n    ..aInt64(13, _omitFieldNames ? '' : 'rid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OfficialRcmdDynamic clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OfficialRcmdDynamic copyWith(void Function(OfficialRcmdDynamic) updates) =>\n      super.copyWith((message) => updates(message as OfficialRcmdDynamic))\n          as OfficialRcmdDynamic;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OfficialRcmdDynamic create() => OfficialRcmdDynamic._();\n  @$core.override\n  OfficialRcmdDynamic createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OfficialRcmdDynamic getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OfficialRcmdDynamic>(create);\n  static OfficialRcmdDynamic? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get cover => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cover($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCover() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCover() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get coverRightTopText => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set coverRightTopText($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCoverRightTopText() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCoverRightTopText() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  CoverIcon get descIcon1 => $_getN(3);\n  @$pb.TagNumber(4)\n  set descIcon1(CoverIcon value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDescIcon1() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDescIcon1() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get descText1 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set descText1($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDescText1() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDescText1() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  CoverIcon get descIcon2 => $_getN(5);\n  @$pb.TagNumber(6)\n  set descIcon2(CoverIcon value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasDescIcon2() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearDescIcon2() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get descText2 => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set descText2($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasDescText2() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearDescText2() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get reason => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set reason($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasReason() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearReason() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get uri => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set uri($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasUri() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearUri() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $fixnum.Int64 get dynamicId => $_getI64(9);\n  @$pb.TagNumber(10)\n  set dynamicId($fixnum.Int64 value) => $_setInt64(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasDynamicId() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearDynamicId() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $fixnum.Int64 get mid => $_getI64(10);\n  @$pb.TagNumber(11)\n  set mid($fixnum.Int64 value) => $_setInt64(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasMid() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearMid() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get userName => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set userName($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasUserName() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearUserName() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $fixnum.Int64 get rid => $_getI64(12);\n  @$pb.TagNumber(13)\n  set rid($fixnum.Int64 value) => $_setInt64(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasRid() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearRid() => $_clearField(13);\n}\n\nclass OfficialVerify extends $pb.GeneratedMessage {\n  factory OfficialVerify({\n    $core.int? type,\n    $core.String? desc,\n    $core.int? isAtten,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (desc != null) result.desc = desc;\n    if (isAtten != null) result.isAtten = isAtten;\n    return result;\n  }\n\n  OfficialVerify._();\n\n  factory OfficialVerify.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OfficialVerify.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OfficialVerify',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'type')\n    ..aOS(2, _omitFieldNames ? '' : 'desc')\n    ..aI(3, _omitFieldNames ? '' : 'isAtten')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OfficialVerify clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OfficialVerify copyWith(void Function(OfficialVerify) updates) =>\n      super.copyWith((message) => updates(message as OfficialVerify))\n          as OfficialVerify;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OfficialVerify create() => OfficialVerify._();\n  @$core.override\n  OfficialVerify createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OfficialVerify getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OfficialVerify>(create);\n  static OfficialVerify? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get type => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set type($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get desc => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set desc($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDesc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDesc() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get isAtten => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set isAtten($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIsAtten() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIsAtten() => $_clearField(3);\n}\n\nclass OneLineText extends $pb.GeneratedMessage {\n  factory OneLineText({\n    $core.Iterable<TextWithPriority>? texts,\n  }) {\n    final result = create();\n    if (texts != null) result.texts.addAll(texts);\n    return result;\n  }\n\n  OneLineText._();\n\n  factory OneLineText.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OneLineText.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OneLineText',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<TextWithPriority>(1, _omitFieldNames ? '' : 'texts',\n        subBuilder: TextWithPriority.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OneLineText clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OneLineText copyWith(void Function(OneLineText) updates) =>\n      super.copyWith((message) => updates(message as OneLineText))\n          as OneLineText;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OneLineText create() => OneLineText._();\n  @$core.override\n  OneLineText createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OneLineText getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OneLineText>(create);\n  static OneLineText? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<TextWithPriority> get texts => $_getList(0);\n}\n\nclass OnlyFans extends $pb.GeneratedMessage {\n  factory OnlyFans({\n    $core.bool? isOnlyFans,\n    IconBadge? badge,\n  }) {\n    final result = create();\n    if (isOnlyFans != null) result.isOnlyFans = isOnlyFans;\n    if (badge != null) result.badge = badge;\n    return result;\n  }\n\n  OnlyFans._();\n\n  factory OnlyFans.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OnlyFans.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OnlyFans',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'isOnlyFans')\n    ..aOM<IconBadge>(2, _omitFieldNames ? '' : 'badge',\n        subBuilder: IconBadge.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OnlyFans clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OnlyFans copyWith(void Function(OnlyFans) updates) =>\n      super.copyWith((message) => updates(message as OnlyFans)) as OnlyFans;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OnlyFans create() => OnlyFans._();\n  @$core.override\n  OnlyFans createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OnlyFans getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<OnlyFans>(create);\n  static OnlyFans? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get isOnlyFans => $_getBF(0);\n  @$pb.TagNumber(1)\n  set isOnlyFans($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIsOnlyFans() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIsOnlyFans() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  IconBadge get badge => $_getN(1);\n  @$pb.TagNumber(2)\n  set badge(IconBadge value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBadge() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBadge() => $_clearField(2);\n  @$pb.TagNumber(2)\n  IconBadge ensureBadge() => $_ensure(1);\n}\n\nclass OnlyFansProperty extends $pb.GeneratedMessage {\n  factory OnlyFansProperty({\n    $core.bool? hasPrivilege,\n    $core.bool? isOnlyFans,\n    $core.bool? allowDownload,\n    $core.String? embedCashierLink,\n  }) {\n    final result = create();\n    if (hasPrivilege != null) result.hasPrivilege = hasPrivilege;\n    if (isOnlyFans != null) result.isOnlyFans = isOnlyFans;\n    if (allowDownload != null) result.allowDownload = allowDownload;\n    if (embedCashierLink != null) result.embedCashierLink = embedCashierLink;\n    return result;\n  }\n\n  OnlyFansProperty._();\n\n  factory OnlyFansProperty.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OnlyFansProperty.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OnlyFansProperty',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'hasPrivilege')\n    ..aOB(2, _omitFieldNames ? '' : 'isOnlyFans')\n    ..aOB(3, _omitFieldNames ? '' : 'allowDownload')\n    ..aOS(4, _omitFieldNames ? '' : 'embedCashierLink')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OnlyFansProperty clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OnlyFansProperty copyWith(void Function(OnlyFansProperty) updates) =>\n      super.copyWith((message) => updates(message as OnlyFansProperty))\n          as OnlyFansProperty;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OnlyFansProperty create() => OnlyFansProperty._();\n  @$core.override\n  OnlyFansProperty createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OnlyFansProperty getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OnlyFansProperty>(create);\n  static OnlyFansProperty? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get hasPrivilege => $_getBF(0);\n  @$pb.TagNumber(1)\n  set hasPrivilege($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasHasPrivilege() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearHasPrivilege() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get isOnlyFans => $_getBF(1);\n  @$pb.TagNumber(2)\n  set isOnlyFans($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIsOnlyFans() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIsOnlyFans() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get allowDownload => $_getBF(2);\n  @$pb.TagNumber(3)\n  set allowDownload($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAllowDownload() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAllowDownload() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get embedCashierLink => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set embedCashierLink($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasEmbedCashierLink() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearEmbedCashierLink() => $_clearField(4);\n}\n\nclass OnlyFansVoteProperty extends $pb.GeneratedMessage {\n  factory OnlyFansVoteProperty({\n    $core.bool? isOnlyFansVote,\n    $core.bool? hasVotePermission,\n    $core.String? voteBtnText,\n    $core.String? voteBtnUri,\n    $core.String? voteAnnotationPart1,\n    $core.String? voteAnnotationPart2,\n  }) {\n    final result = create();\n    if (isOnlyFansVote != null) result.isOnlyFansVote = isOnlyFansVote;\n    if (hasVotePermission != null) result.hasVotePermission = hasVotePermission;\n    if (voteBtnText != null) result.voteBtnText = voteBtnText;\n    if (voteBtnUri != null) result.voteBtnUri = voteBtnUri;\n    if (voteAnnotationPart1 != null)\n      result.voteAnnotationPart1 = voteAnnotationPart1;\n    if (voteAnnotationPart2 != null)\n      result.voteAnnotationPart2 = voteAnnotationPart2;\n    return result;\n  }\n\n  OnlyFansVoteProperty._();\n\n  factory OnlyFansVoteProperty.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OnlyFansVoteProperty.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OnlyFansVoteProperty',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'isOnlyFansVote')\n    ..aOB(2, _omitFieldNames ? '' : 'hasVotePermission')\n    ..aOS(3, _omitFieldNames ? '' : 'voteBtnText')\n    ..aOS(4, _omitFieldNames ? '' : 'voteBtnUri')\n    ..aOS(5, _omitFieldNames ? '' : 'voteAnnotationPart1')\n    ..aOS(6, _omitFieldNames ? '' : 'voteAnnotationPart2')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OnlyFansVoteProperty clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OnlyFansVoteProperty copyWith(void Function(OnlyFansVoteProperty) updates) =>\n      super.copyWith((message) => updates(message as OnlyFansVoteProperty))\n          as OnlyFansVoteProperty;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OnlyFansVoteProperty create() => OnlyFansVoteProperty._();\n  @$core.override\n  OnlyFansVoteProperty createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OnlyFansVoteProperty getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OnlyFansVoteProperty>(create);\n  static OnlyFansVoteProperty? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get isOnlyFansVote => $_getBF(0);\n  @$pb.TagNumber(1)\n  set isOnlyFansVote($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIsOnlyFansVote() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIsOnlyFansVote() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get hasVotePermission => $_getBF(1);\n  @$pb.TagNumber(2)\n  set hasVotePermission($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHasVotePermission() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHasVotePermission() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get voteBtnText => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set voteBtnText($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasVoteBtnText() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearVoteBtnText() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get voteBtnUri => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set voteBtnUri($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasVoteBtnUri() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearVoteBtnUri() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get voteAnnotationPart1 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set voteAnnotationPart1($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasVoteAnnotationPart1() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearVoteAnnotationPart1() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get voteAnnotationPart2 => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set voteAnnotationPart2($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasVoteAnnotationPart2() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearVoteAnnotationPart2() => $_clearField(6);\n}\n\nclass OpusCollection extends $pb.GeneratedMessage {\n  factory OpusCollection({\n    $fixnum.Int64? collectionId,\n    OneLineText? title,\n    $core.String? detailUri,\n    $core.String? intro,\n    $core.Iterable<OpusCollectionItem>? allItems,\n  }) {\n    final result = create();\n    if (collectionId != null) result.collectionId = collectionId;\n    if (title != null) result.title = title;\n    if (detailUri != null) result.detailUri = detailUri;\n    if (intro != null) result.intro = intro;\n    if (allItems != null) result.allItems.addAll(allItems);\n    return result;\n  }\n\n  OpusCollection._();\n\n  factory OpusCollection.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OpusCollection.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OpusCollection',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'collectionId')\n    ..aOM<OneLineText>(2, _omitFieldNames ? '' : 'title',\n        subBuilder: OneLineText.create)\n    ..aOS(3, _omitFieldNames ? '' : 'detailUri')\n    ..aOS(4, _omitFieldNames ? '' : 'intro')\n    ..pPM<OpusCollectionItem>(5, _omitFieldNames ? '' : 'allItems',\n        subBuilder: OpusCollectionItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OpusCollection clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OpusCollection copyWith(void Function(OpusCollection) updates) =>\n      super.copyWith((message) => updates(message as OpusCollection))\n          as OpusCollection;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OpusCollection create() => OpusCollection._();\n  @$core.override\n  OpusCollection createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OpusCollection getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OpusCollection>(create);\n  static OpusCollection? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get collectionId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set collectionId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCollectionId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCollectionId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  OneLineText get title => $_getN(1);\n  @$pb.TagNumber(2)\n  set title(OneLineText value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n  @$pb.TagNumber(2)\n  OneLineText ensureTitle() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.String get detailUri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set detailUri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDetailUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDetailUri() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get intro => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set intro($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIntro() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIntro() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $pb.PbList<OpusCollectionItem> get allItems => $_getList(4);\n}\n\nclass OpusCollectionDetailReq extends $pb.GeneratedMessage {\n  factory OpusCollectionDetailReq({\n    $core.String? collectionType,\n    $core.String? collectionId,\n    $core.String? selectedOpusId,\n    $core.String? selectedOidType,\n    $core.String? selectedOid,\n    $core.int? localTime,\n  }) {\n    final result = create();\n    if (collectionType != null) result.collectionType = collectionType;\n    if (collectionId != null) result.collectionId = collectionId;\n    if (selectedOpusId != null) result.selectedOpusId = selectedOpusId;\n    if (selectedOidType != null) result.selectedOidType = selectedOidType;\n    if (selectedOid != null) result.selectedOid = selectedOid;\n    if (localTime != null) result.localTime = localTime;\n    return result;\n  }\n\n  OpusCollectionDetailReq._();\n\n  factory OpusCollectionDetailReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OpusCollectionDetailReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OpusCollectionDetailReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'collectionType')\n    ..aOS(2, _omitFieldNames ? '' : 'collectionId')\n    ..aOS(3, _omitFieldNames ? '' : 'selectedOpusId')\n    ..aOS(4, _omitFieldNames ? '' : 'selectedOidType')\n    ..aOS(5, _omitFieldNames ? '' : 'selectedOid')\n    ..aI(6, _omitFieldNames ? '' : 'localTime')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OpusCollectionDetailReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OpusCollectionDetailReq copyWith(\n          void Function(OpusCollectionDetailReq) updates) =>\n      super.copyWith((message) => updates(message as OpusCollectionDetailReq))\n          as OpusCollectionDetailReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OpusCollectionDetailReq create() => OpusCollectionDetailReq._();\n  @$core.override\n  OpusCollectionDetailReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OpusCollectionDetailReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OpusCollectionDetailReq>(create);\n  static OpusCollectionDetailReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get collectionType => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set collectionType($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCollectionType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCollectionType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get collectionId => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set collectionId($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCollectionId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCollectionId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get selectedOpusId => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set selectedOpusId($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSelectedOpusId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSelectedOpusId() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get selectedOidType => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set selectedOidType($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSelectedOidType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSelectedOidType() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get selectedOid => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set selectedOid($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasSelectedOid() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearSelectedOid() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get localTime => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set localTime($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasLocalTime() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearLocalTime() => $_clearField(6);\n}\n\nclass OpusCollectionDetailResp extends $pb.GeneratedMessage {\n  factory OpusCollectionDetailResp({\n    $core.String? collectionType,\n    $core.String? collectionId,\n    $core.String? collectionCover,\n    $core.String? collectionTitle,\n    $core.String? subTitlePart1,\n    $core.String? subTitlePart2,\n    $core.String? collectionIntro,\n    $core.Iterable<OpusCollectionItem>? itemList,\n    $fixnum.Int64? totalCnt,\n    BasicUserInfoV2? authorInfo,\n    ButtonWithSubTitle? bottomButton,\n    SubscribeButton? subscribeBtn,\n  }) {\n    final result = create();\n    if (collectionType != null) result.collectionType = collectionType;\n    if (collectionId != null) result.collectionId = collectionId;\n    if (collectionCover != null) result.collectionCover = collectionCover;\n    if (collectionTitle != null) result.collectionTitle = collectionTitle;\n    if (subTitlePart1 != null) result.subTitlePart1 = subTitlePart1;\n    if (subTitlePart2 != null) result.subTitlePart2 = subTitlePart2;\n    if (collectionIntro != null) result.collectionIntro = collectionIntro;\n    if (itemList != null) result.itemList.addAll(itemList);\n    if (totalCnt != null) result.totalCnt = totalCnt;\n    if (authorInfo != null) result.authorInfo = authorInfo;\n    if (bottomButton != null) result.bottomButton = bottomButton;\n    if (subscribeBtn != null) result.subscribeBtn = subscribeBtn;\n    return result;\n  }\n\n  OpusCollectionDetailResp._();\n\n  factory OpusCollectionDetailResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OpusCollectionDetailResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OpusCollectionDetailResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'collectionType')\n    ..aOS(2, _omitFieldNames ? '' : 'collectionId')\n    ..aOS(3, _omitFieldNames ? '' : 'collectionCover')\n    ..aOS(4, _omitFieldNames ? '' : 'collectionTitle')\n    ..aOS(5, _omitFieldNames ? '' : 'subTitlePart1')\n    ..aOS(6, _omitFieldNames ? '' : 'subTitlePart2')\n    ..aOS(7, _omitFieldNames ? '' : 'collectionIntro')\n    ..pPM<OpusCollectionItem>(8, _omitFieldNames ? '' : 'itemList',\n        subBuilder: OpusCollectionItem.create)\n    ..aInt64(9, _omitFieldNames ? '' : 'totalCnt')\n    ..aOM<BasicUserInfoV2>(10, _omitFieldNames ? '' : 'authorInfo',\n        subBuilder: BasicUserInfoV2.create)\n    ..aOM<ButtonWithSubTitle>(11, _omitFieldNames ? '' : 'bottomButton',\n        subBuilder: ButtonWithSubTitle.create)\n    ..aOM<SubscribeButton>(12, _omitFieldNames ? '' : 'subscribeBtn',\n        subBuilder: SubscribeButton.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OpusCollectionDetailResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OpusCollectionDetailResp copyWith(\n          void Function(OpusCollectionDetailResp) updates) =>\n      super.copyWith((message) => updates(message as OpusCollectionDetailResp))\n          as OpusCollectionDetailResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OpusCollectionDetailResp create() => OpusCollectionDetailResp._();\n  @$core.override\n  OpusCollectionDetailResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OpusCollectionDetailResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OpusCollectionDetailResp>(create);\n  static OpusCollectionDetailResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get collectionType => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set collectionType($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCollectionType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCollectionType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get collectionId => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set collectionId($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCollectionId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCollectionId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get collectionCover => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set collectionCover($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCollectionCover() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCollectionCover() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get collectionTitle => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set collectionTitle($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCollectionTitle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCollectionTitle() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get subTitlePart1 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set subTitlePart1($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasSubTitlePart1() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearSubTitlePart1() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get subTitlePart2 => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set subTitlePart2($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasSubTitlePart2() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearSubTitlePart2() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get collectionIntro => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set collectionIntro($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCollectionIntro() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCollectionIntro() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $pb.PbList<OpusCollectionItem> get itemList => $_getList(7);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get totalCnt => $_getI64(8);\n  @$pb.TagNumber(9)\n  set totalCnt($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasTotalCnt() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearTotalCnt() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  BasicUserInfoV2 get authorInfo => $_getN(9);\n  @$pb.TagNumber(10)\n  set authorInfo(BasicUserInfoV2 value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasAuthorInfo() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearAuthorInfo() => $_clearField(10);\n  @$pb.TagNumber(10)\n  BasicUserInfoV2 ensureAuthorInfo() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  ButtonWithSubTitle get bottomButton => $_getN(10);\n  @$pb.TagNumber(11)\n  set bottomButton(ButtonWithSubTitle value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasBottomButton() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearBottomButton() => $_clearField(11);\n  @$pb.TagNumber(11)\n  ButtonWithSubTitle ensureBottomButton() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  SubscribeButton get subscribeBtn => $_getN(11);\n  @$pb.TagNumber(12)\n  set subscribeBtn(SubscribeButton value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasSubscribeBtn() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearSubscribeBtn() => $_clearField(12);\n  @$pb.TagNumber(12)\n  SubscribeButton ensureSubscribeBtn() => $_ensure(11);\n}\n\nclass OpusCollectionItem extends $pb.GeneratedMessage {\n  factory OpusCollectionItem({\n    $fixnum.Int64? opusId,\n    $core.String? title,\n    $core.String? pubTime,\n    $core.String? uri,\n    $core.bool? isSelectedHighlight,\n    $core.String? prefixIcon,\n    $core.String? collectionItemType,\n    $core.String? collectionItemOid,\n  }) {\n    final result = create();\n    if (opusId != null) result.opusId = opusId;\n    if (title != null) result.title = title;\n    if (pubTime != null) result.pubTime = pubTime;\n    if (uri != null) result.uri = uri;\n    if (isSelectedHighlight != null)\n      result.isSelectedHighlight = isSelectedHighlight;\n    if (prefixIcon != null) result.prefixIcon = prefixIcon;\n    if (collectionItemType != null)\n      result.collectionItemType = collectionItemType;\n    if (collectionItemOid != null) result.collectionItemOid = collectionItemOid;\n    return result;\n  }\n\n  OpusCollectionItem._();\n\n  factory OpusCollectionItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OpusCollectionItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OpusCollectionItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'opusId')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'pubTime')\n    ..aOS(4, _omitFieldNames ? '' : 'uri')\n    ..aOB(5, _omitFieldNames ? '' : 'isSelectedHighlight')\n    ..aOS(6, _omitFieldNames ? '' : 'prefixIcon')\n    ..aOS(7, _omitFieldNames ? '' : 'collectionItemType')\n    ..aOS(8, _omitFieldNames ? '' : 'collectionItemOid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OpusCollectionItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OpusCollectionItem copyWith(void Function(OpusCollectionItem) updates) =>\n      super.copyWith((message) => updates(message as OpusCollectionItem))\n          as OpusCollectionItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OpusCollectionItem create() => OpusCollectionItem._();\n  @$core.override\n  OpusCollectionItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OpusCollectionItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OpusCollectionItem>(create);\n  static OpusCollectionItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get opusId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set opusId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOpusId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOpusId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get pubTime => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set pubTime($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPubTime() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPubTime() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get uri => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set uri($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUri() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUri() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.bool get isSelectedHighlight => $_getBF(4);\n  @$pb.TagNumber(5)\n  set isSelectedHighlight($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasIsSelectedHighlight() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearIsSelectedHighlight() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get prefixIcon => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set prefixIcon($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasPrefixIcon() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearPrefixIcon() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get collectionItemType => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set collectionItemType($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCollectionItemType() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCollectionItemType() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get collectionItemOid => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set collectionItemOid($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasCollectionItemOid() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearCollectionItemOid() => $_clearField(8);\n}\n\nclass OpusCollectionWithCover extends $pb.GeneratedMessage {\n  factory OpusCollectionWithCover({\n    OpusCollection? collectionInfo,\n    $core.String? coverPic,\n    CoverIconWithText? coverBottomText,\n    $core.String? subTitleText,\n  }) {\n    final result = create();\n    if (collectionInfo != null) result.collectionInfo = collectionInfo;\n    if (coverPic != null) result.coverPic = coverPic;\n    if (coverBottomText != null) result.coverBottomText = coverBottomText;\n    if (subTitleText != null) result.subTitleText = subTitleText;\n    return result;\n  }\n\n  OpusCollectionWithCover._();\n\n  factory OpusCollectionWithCover.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OpusCollectionWithCover.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OpusCollectionWithCover',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<OpusCollection>(1, _omitFieldNames ? '' : 'collectionInfo',\n        subBuilder: OpusCollection.create)\n    ..aOS(2, _omitFieldNames ? '' : 'coverPic')\n    ..aOM<CoverIconWithText>(3, _omitFieldNames ? '' : 'coverBottomText',\n        subBuilder: CoverIconWithText.create)\n    ..aOS(4, _omitFieldNames ? '' : 'subTitleText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OpusCollectionWithCover clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OpusCollectionWithCover copyWith(\n          void Function(OpusCollectionWithCover) updates) =>\n      super.copyWith((message) => updates(message as OpusCollectionWithCover))\n          as OpusCollectionWithCover;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OpusCollectionWithCover create() => OpusCollectionWithCover._();\n  @$core.override\n  OpusCollectionWithCover createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OpusCollectionWithCover getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OpusCollectionWithCover>(create);\n  static OpusCollectionWithCover? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  OpusCollection get collectionInfo => $_getN(0);\n  @$pb.TagNumber(1)\n  set collectionInfo(OpusCollection value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCollectionInfo() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCollectionInfo() => $_clearField(1);\n  @$pb.TagNumber(1)\n  OpusCollection ensureCollectionInfo() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get coverPic => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set coverPic($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCoverPic() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCoverPic() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  CoverIconWithText get coverBottomText => $_getN(2);\n  @$pb.TagNumber(3)\n  set coverBottomText(CoverIconWithText value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCoverBottomText() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCoverBottomText() => $_clearField(3);\n  @$pb.TagNumber(3)\n  CoverIconWithText ensureCoverBottomText() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.String get subTitleText => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set subTitleText($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSubTitleText() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSubTitleText() => $_clearField(4);\n}\n\nclass OpusCreationItem extends $pb.GeneratedMessage {\n  factory OpusCreationItem({\n    OpusType? opusType,\n    MdlDynDrawItem? coverPic,\n    VideoBadge? coverTopRightBadge,\n    Paragraph? textParagraph,\n    ColoredText? hintText,\n    $core.String? bottomText,\n    $core.Iterable<CoverIconWithText>? stats,\n    $core.Iterable<CreationItemAction>? tpList,\n    Extend? extend,\n    CoverIconWithText? visibilityStatus,\n  }) {\n    final result = create();\n    if (opusType != null) result.opusType = opusType;\n    if (coverPic != null) result.coverPic = coverPic;\n    if (coverTopRightBadge != null)\n      result.coverTopRightBadge = coverTopRightBadge;\n    if (textParagraph != null) result.textParagraph = textParagraph;\n    if (hintText != null) result.hintText = hintText;\n    if (bottomText != null) result.bottomText = bottomText;\n    if (stats != null) result.stats.addAll(stats);\n    if (tpList != null) result.tpList.addAll(tpList);\n    if (extend != null) result.extend = extend;\n    if (visibilityStatus != null) result.visibilityStatus = visibilityStatus;\n    return result;\n  }\n\n  OpusCreationItem._();\n\n  factory OpusCreationItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OpusCreationItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OpusCreationItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aE<OpusType>(1, _omitFieldNames ? '' : 'opusType',\n        enumValues: OpusType.values)\n    ..aOM<MdlDynDrawItem>(2, _omitFieldNames ? '' : 'coverPic',\n        subBuilder: MdlDynDrawItem.create)\n    ..aOM<VideoBadge>(3, _omitFieldNames ? '' : 'coverTopRightBadge',\n        subBuilder: VideoBadge.create)\n    ..aOM<Paragraph>(4, _omitFieldNames ? '' : 'textParagraph',\n        subBuilder: Paragraph.create)\n    ..aOM<ColoredText>(5, _omitFieldNames ? '' : 'hintText',\n        subBuilder: ColoredText.create)\n    ..aOS(6, _omitFieldNames ? '' : 'bottomText')\n    ..pPM<CoverIconWithText>(7, _omitFieldNames ? '' : 'stats',\n        subBuilder: CoverIconWithText.create)\n    ..pPM<CreationItemAction>(8, _omitFieldNames ? '' : 'tpList',\n        subBuilder: CreationItemAction.create)\n    ..aOM<Extend>(9, _omitFieldNames ? '' : 'extend', subBuilder: Extend.create)\n    ..aOM<CoverIconWithText>(10, _omitFieldNames ? '' : 'visibilityStatus',\n        subBuilder: CoverIconWithText.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OpusCreationItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OpusCreationItem copyWith(void Function(OpusCreationItem) updates) =>\n      super.copyWith((message) => updates(message as OpusCreationItem))\n          as OpusCreationItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OpusCreationItem create() => OpusCreationItem._();\n  @$core.override\n  OpusCreationItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OpusCreationItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OpusCreationItem>(create);\n  static OpusCreationItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  OpusType get opusType => $_getN(0);\n  @$pb.TagNumber(1)\n  set opusType(OpusType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOpusType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOpusType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  MdlDynDrawItem get coverPic => $_getN(1);\n  @$pb.TagNumber(2)\n  set coverPic(MdlDynDrawItem value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCoverPic() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCoverPic() => $_clearField(2);\n  @$pb.TagNumber(2)\n  MdlDynDrawItem ensureCoverPic() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  VideoBadge get coverTopRightBadge => $_getN(2);\n  @$pb.TagNumber(3)\n  set coverTopRightBadge(VideoBadge value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCoverTopRightBadge() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCoverTopRightBadge() => $_clearField(3);\n  @$pb.TagNumber(3)\n  VideoBadge ensureCoverTopRightBadge() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  Paragraph get textParagraph => $_getN(3);\n  @$pb.TagNumber(4)\n  set textParagraph(Paragraph value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTextParagraph() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTextParagraph() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Paragraph ensureTextParagraph() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  ColoredText get hintText => $_getN(4);\n  @$pb.TagNumber(5)\n  set hintText(ColoredText value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasHintText() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearHintText() => $_clearField(5);\n  @$pb.TagNumber(5)\n  ColoredText ensureHintText() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.String get bottomText => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set bottomText($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasBottomText() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearBottomText() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $pb.PbList<CoverIconWithText> get stats => $_getList(6);\n\n  @$pb.TagNumber(8)\n  $pb.PbList<CreationItemAction> get tpList => $_getList(7);\n\n  @$pb.TagNumber(9)\n  Extend get extend => $_getN(8);\n  @$pb.TagNumber(9)\n  set extend(Extend value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasExtend() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearExtend() => $_clearField(9);\n  @$pb.TagNumber(9)\n  Extend ensureExtend() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  CoverIconWithText get visibilityStatus => $_getN(9);\n  @$pb.TagNumber(10)\n  set visibilityStatus(CoverIconWithText value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasVisibilityStatus() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearVisibilityStatus() => $_clearField(10);\n  @$pb.TagNumber(10)\n  CoverIconWithText ensureVisibilityStatus() => $_ensure(9);\n}\n\nclass OpusDetailReq extends $pb.GeneratedMessage {\n  factory OpusDetailReq({\n    OpusType? opusType,\n    $fixnum.Int64? oid,\n    $fixnum.Int64? dynType,\n    $core.String? shareId,\n    $core.int? shareMode,\n    $core.int? localTime,\n    $1.PlayerArgs? playerArgs,\n    Config? config,\n    AdParam? adParam,\n    $core.String? from,\n    $core.String? pattern,\n  }) {\n    final result = create();\n    if (opusType != null) result.opusType = opusType;\n    if (oid != null) result.oid = oid;\n    if (dynType != null) result.dynType = dynType;\n    if (shareId != null) result.shareId = shareId;\n    if (shareMode != null) result.shareMode = shareMode;\n    if (localTime != null) result.localTime = localTime;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    if (config != null) result.config = config;\n    if (adParam != null) result.adParam = adParam;\n    if (from != null) result.from = from;\n    if (pattern != null) result.pattern = pattern;\n    return result;\n  }\n\n  OpusDetailReq._();\n\n  factory OpusDetailReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OpusDetailReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OpusDetailReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aE<OpusType>(1, _omitFieldNames ? '' : 'opusType',\n        enumValues: OpusType.values)\n    ..aInt64(2, _omitFieldNames ? '' : 'oid')\n    ..aInt64(3, _omitFieldNames ? '' : 'dynType')\n    ..aOS(4, _omitFieldNames ? '' : 'shareId')\n    ..aI(9, _omitFieldNames ? '' : 'shareMode')\n    ..aI(10, _omitFieldNames ? '' : 'localTime')\n    ..aOM<$1.PlayerArgs>(11, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $1.PlayerArgs.create)\n    ..aOM<Config>(12, _omitFieldNames ? '' : 'config',\n        subBuilder: Config.create)\n    ..aOM<AdParam>(13, _omitFieldNames ? '' : 'adParam',\n        subBuilder: AdParam.create)\n    ..aOS(14, _omitFieldNames ? '' : 'from')\n    ..aOS(15, _omitFieldNames ? '' : 'pattern')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OpusDetailReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OpusDetailReq copyWith(void Function(OpusDetailReq) updates) =>\n      super.copyWith((message) => updates(message as OpusDetailReq))\n          as OpusDetailReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OpusDetailReq create() => OpusDetailReq._();\n  @$core.override\n  OpusDetailReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OpusDetailReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OpusDetailReq>(create);\n  static OpusDetailReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  OpusType get opusType => $_getN(0);\n  @$pb.TagNumber(1)\n  set opusType(OpusType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOpusType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOpusType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get oid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set oid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get dynType => $_getI64(2);\n  @$pb.TagNumber(3)\n  set dynType($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDynType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDynType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get shareId => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set shareId($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasShareId() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearShareId() => $_clearField(4);\n\n  @$pb.TagNumber(9)\n  $core.int get shareMode => $_getIZ(4);\n  @$pb.TagNumber(9)\n  set shareMode($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(9)\n  $core.bool hasShareMode() => $_has(4);\n  @$pb.TagNumber(9)\n  void clearShareMode() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.int get localTime => $_getIZ(5);\n  @$pb.TagNumber(10)\n  set localTime($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(10)\n  $core.bool hasLocalTime() => $_has(5);\n  @$pb.TagNumber(10)\n  void clearLocalTime() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $1.PlayerArgs get playerArgs => $_getN(6);\n  @$pb.TagNumber(11)\n  set playerArgs($1.PlayerArgs value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasPlayerArgs() => $_has(6);\n  @$pb.TagNumber(11)\n  void clearPlayerArgs() => $_clearField(11);\n  @$pb.TagNumber(11)\n  $1.PlayerArgs ensurePlayerArgs() => $_ensure(6);\n\n  @$pb.TagNumber(12)\n  Config get config => $_getN(7);\n  @$pb.TagNumber(12)\n  set config(Config value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasConfig() => $_has(7);\n  @$pb.TagNumber(12)\n  void clearConfig() => $_clearField(12);\n  @$pb.TagNumber(12)\n  Config ensureConfig() => $_ensure(7);\n\n  @$pb.TagNumber(13)\n  AdParam get adParam => $_getN(8);\n  @$pb.TagNumber(13)\n  set adParam(AdParam value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasAdParam() => $_has(8);\n  @$pb.TagNumber(13)\n  void clearAdParam() => $_clearField(13);\n  @$pb.TagNumber(13)\n  AdParam ensureAdParam() => $_ensure(8);\n\n  @$pb.TagNumber(14)\n  $core.String get from => $_getSZ(9);\n  @$pb.TagNumber(14)\n  set from($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(14)\n  $core.bool hasFrom() => $_has(9);\n  @$pb.TagNumber(14)\n  void clearFrom() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $core.String get pattern => $_getSZ(10);\n  @$pb.TagNumber(15)\n  set pattern($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(15)\n  $core.bool hasPattern() => $_has(10);\n  @$pb.TagNumber(15)\n  void clearPattern() => $_clearField(15);\n}\n\nclass OpusDetailResp extends $pb.GeneratedMessage {\n  factory OpusDetailResp({\n    OpusItem? opusItem,\n  }) {\n    final result = create();\n    if (opusItem != null) result.opusItem = opusItem;\n    return result;\n  }\n\n  OpusDetailResp._();\n\n  factory OpusDetailResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OpusDetailResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OpusDetailResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<OpusItem>(1, _omitFieldNames ? '' : 'opusItem',\n        subBuilder: OpusItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OpusDetailResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OpusDetailResp copyWith(void Function(OpusDetailResp) updates) =>\n      super.copyWith((message) => updates(message as OpusDetailResp))\n          as OpusDetailResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OpusDetailResp create() => OpusDetailResp._();\n  @$core.override\n  OpusDetailResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OpusDetailResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OpusDetailResp>(create);\n  static OpusDetailResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  OpusItem get opusItem => $_getN(0);\n  @$pb.TagNumber(1)\n  set opusItem(OpusItem value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOpusItem() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOpusItem() => $_clearField(1);\n  @$pb.TagNumber(1)\n  OpusItem ensureOpusItem() => $_ensure(0);\n}\n\nclass OpusFavItem extends $pb.GeneratedMessage {\n  factory OpusFavItem({\n    $fixnum.Int64? opusId,\n    $core.String? cardUri,\n    MdlDynDrawItem? coverPic,\n    Paragraph? textParagraph,\n    CoverIconWithText? bottomText,\n    $core.String? clickToast,\n  }) {\n    final result = create();\n    if (opusId != null) result.opusId = opusId;\n    if (cardUri != null) result.cardUri = cardUri;\n    if (coverPic != null) result.coverPic = coverPic;\n    if (textParagraph != null) result.textParagraph = textParagraph;\n    if (bottomText != null) result.bottomText = bottomText;\n    if (clickToast != null) result.clickToast = clickToast;\n    return result;\n  }\n\n  OpusFavItem._();\n\n  factory OpusFavItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OpusFavItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OpusFavItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'opusId')\n    ..aOS(2, _omitFieldNames ? '' : 'cardUri')\n    ..aOM<MdlDynDrawItem>(3, _omitFieldNames ? '' : 'coverPic',\n        subBuilder: MdlDynDrawItem.create)\n    ..aOM<Paragraph>(4, _omitFieldNames ? '' : 'textParagraph',\n        subBuilder: Paragraph.create)\n    ..aOM<CoverIconWithText>(5, _omitFieldNames ? '' : 'bottomText',\n        subBuilder: CoverIconWithText.create)\n    ..aOS(6, _omitFieldNames ? '' : 'clickToast')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OpusFavItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OpusFavItem copyWith(void Function(OpusFavItem) updates) =>\n      super.copyWith((message) => updates(message as OpusFavItem))\n          as OpusFavItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OpusFavItem create() => OpusFavItem._();\n  @$core.override\n  OpusFavItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OpusFavItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OpusFavItem>(create);\n  static OpusFavItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get opusId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set opusId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOpusId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOpusId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get cardUri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cardUri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCardUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCardUri() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  MdlDynDrawItem get coverPic => $_getN(2);\n  @$pb.TagNumber(3)\n  set coverPic(MdlDynDrawItem value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCoverPic() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCoverPic() => $_clearField(3);\n  @$pb.TagNumber(3)\n  MdlDynDrawItem ensureCoverPic() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  Paragraph get textParagraph => $_getN(3);\n  @$pb.TagNumber(4)\n  set textParagraph(Paragraph value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTextParagraph() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTextParagraph() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Paragraph ensureTextParagraph() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  CoverIconWithText get bottomText => $_getN(4);\n  @$pb.TagNumber(5)\n  set bottomText(CoverIconWithText value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBottomText() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBottomText() => $_clearField(5);\n  @$pb.TagNumber(5)\n  CoverIconWithText ensureBottomText() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.String get clickToast => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set clickToast($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasClickToast() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearClickToast() => $_clearField(6);\n}\n\nenum OpusFlowItem_Data { flowItemOpus, notSet }\n\nclass OpusFlowItem extends $pb.GeneratedMessage {\n  factory OpusFlowItem({\n    FlowItemType? itemType,\n    $fixnum.Int64? oid,\n    Extend? extend,\n    FlowItemOpus? flowItemOpus,\n  }) {\n    final result = create();\n    if (itemType != null) result.itemType = itemType;\n    if (oid != null) result.oid = oid;\n    if (extend != null) result.extend = extend;\n    if (flowItemOpus != null) result.flowItemOpus = flowItemOpus;\n    return result;\n  }\n\n  OpusFlowItem._();\n\n  factory OpusFlowItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OpusFlowItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, OpusFlowItem_Data> _OpusFlowItem_DataByTag =\n      {4: OpusFlowItem_Data.flowItemOpus, 0: OpusFlowItem_Data.notSet};\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OpusFlowItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..oo(0, [4])\n    ..aE<FlowItemType>(1, _omitFieldNames ? '' : 'itemType',\n        enumValues: FlowItemType.values)\n    ..aInt64(2, _omitFieldNames ? '' : 'oid')\n    ..aOM<Extend>(3, _omitFieldNames ? '' : 'extend', subBuilder: Extend.create)\n    ..aOM<FlowItemOpus>(4, _omitFieldNames ? '' : 'flowItemOpus',\n        subBuilder: FlowItemOpus.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OpusFlowItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OpusFlowItem copyWith(void Function(OpusFlowItem) updates) =>\n      super.copyWith((message) => updates(message as OpusFlowItem))\n          as OpusFlowItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OpusFlowItem create() => OpusFlowItem._();\n  @$core.override\n  OpusFlowItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OpusFlowItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OpusFlowItem>(create);\n  static OpusFlowItem? _defaultInstance;\n\n  @$pb.TagNumber(4)\n  OpusFlowItem_Data whichData() => _OpusFlowItem_DataByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(4)\n  void clearData() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  FlowItemType get itemType => $_getN(0);\n  @$pb.TagNumber(1)\n  set itemType(FlowItemType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasItemType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearItemType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get oid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set oid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  Extend get extend => $_getN(2);\n  @$pb.TagNumber(3)\n  set extend(Extend value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasExtend() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearExtend() => $_clearField(3);\n  @$pb.TagNumber(3)\n  Extend ensureExtend() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  FlowItemOpus get flowItemOpus => $_getN(3);\n  @$pb.TagNumber(4)\n  set flowItemOpus(FlowItemOpus value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFlowItemOpus() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFlowItemOpus() => $_clearField(4);\n  @$pb.TagNumber(4)\n  FlowItemOpus ensureFlowItemOpus() => $_ensure(3);\n}\n\nclass OpusItem extends $pb.GeneratedMessage {\n  factory OpusItem({\n    $fixnum.Int64? opusId,\n    OpusType? opusType,\n    $fixnum.Int64? oid,\n    $core.Iterable<Module>? modules,\n    Extend? extend,\n  }) {\n    final result = create();\n    if (opusId != null) result.opusId = opusId;\n    if (opusType != null) result.opusType = opusType;\n    if (oid != null) result.oid = oid;\n    if (modules != null) result.modules.addAll(modules);\n    if (extend != null) result.extend = extend;\n    return result;\n  }\n\n  OpusItem._();\n\n  factory OpusItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OpusItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OpusItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'opusId')\n    ..aE<OpusType>(2, _omitFieldNames ? '' : 'opusType',\n        enumValues: OpusType.values)\n    ..aInt64(3, _omitFieldNames ? '' : 'oid')\n    ..pPM<Module>(4, _omitFieldNames ? '' : 'modules',\n        subBuilder: Module.create)\n    ..aOM<Extend>(5, _omitFieldNames ? '' : 'extend', subBuilder: Extend.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OpusItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OpusItem copyWith(void Function(OpusItem) updates) =>\n      super.copyWith((message) => updates(message as OpusItem)) as OpusItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OpusItem create() => OpusItem._();\n  @$core.override\n  OpusItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OpusItem getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<OpusItem>(create);\n  static OpusItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get opusId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set opusId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOpusId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOpusId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  OpusType get opusType => $_getN(1);\n  @$pb.TagNumber(2)\n  set opusType(OpusType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOpusType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOpusType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get oid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set oid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasOid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearOid() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<Module> get modules => $_getList(3);\n\n  @$pb.TagNumber(5)\n  Extend get extend => $_getN(4);\n  @$pb.TagNumber(5)\n  set extend(Extend value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasExtend() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearExtend() => $_clearField(5);\n  @$pb.TagNumber(5)\n  Extend ensureExtend() => $_ensure(4);\n}\n\nclass OpusSpaceFlowReq extends $pb.GeneratedMessage {\n  factory OpusSpaceFlowReq({\n    $fixnum.Int64? hostMid,\n    $core.int? localTime,\n    $7.Pagination? pagination,\n    $core.String? filterType,\n  }) {\n    final result = create();\n    if (hostMid != null) result.hostMid = hostMid;\n    if (localTime != null) result.localTime = localTime;\n    if (pagination != null) result.pagination = pagination;\n    if (filterType != null) result.filterType = filterType;\n    return result;\n  }\n\n  OpusSpaceFlowReq._();\n\n  factory OpusSpaceFlowReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OpusSpaceFlowReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OpusSpaceFlowReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'hostMid')\n    ..aI(2, _omitFieldNames ? '' : 'localTime')\n    ..aOM<$7.Pagination>(3, _omitFieldNames ? '' : 'pagination',\n        subBuilder: $7.Pagination.create)\n    ..aOS(4, _omitFieldNames ? '' : 'filterType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OpusSpaceFlowReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OpusSpaceFlowReq copyWith(void Function(OpusSpaceFlowReq) updates) =>\n      super.copyWith((message) => updates(message as OpusSpaceFlowReq))\n          as OpusSpaceFlowReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OpusSpaceFlowReq create() => OpusSpaceFlowReq._();\n  @$core.override\n  OpusSpaceFlowReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OpusSpaceFlowReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OpusSpaceFlowReq>(create);\n  static OpusSpaceFlowReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get hostMid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set hostMid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasHostMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearHostMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get localTime => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set localTime($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLocalTime() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLocalTime() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $7.Pagination get pagination => $_getN(2);\n  @$pb.TagNumber(3)\n  set pagination($7.Pagination value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPagination() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPagination() => $_clearField(3);\n  @$pb.TagNumber(3)\n  $7.Pagination ensurePagination() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.String get filterType => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set filterType($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFilterType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFilterType() => $_clearField(4);\n}\n\nclass OpusSpaceFlowResp extends $pb.GeneratedMessage {\n  factory OpusSpaceFlowResp({\n    $core.Iterable<OpusFlowItem>? itemList,\n    $7.PaginationReply? nextPage,\n    SectionOpusCollection? hostUpOpusCollection,\n    SectionNoteNavigationBar? hostUpNoteNavBar,\n  }) {\n    final result = create();\n    if (itemList != null) result.itemList.addAll(itemList);\n    if (nextPage != null) result.nextPage = nextPage;\n    if (hostUpOpusCollection != null)\n      result.hostUpOpusCollection = hostUpOpusCollection;\n    if (hostUpNoteNavBar != null) result.hostUpNoteNavBar = hostUpNoteNavBar;\n    return result;\n  }\n\n  OpusSpaceFlowResp._();\n\n  factory OpusSpaceFlowResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OpusSpaceFlowResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OpusSpaceFlowResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<OpusFlowItem>(1, _omitFieldNames ? '' : 'itemList',\n        subBuilder: OpusFlowItem.create)\n    ..aOM<$7.PaginationReply>(2, _omitFieldNames ? '' : 'nextPage',\n        subBuilder: $7.PaginationReply.create)\n    ..aOM<SectionOpusCollection>(\n        3, _omitFieldNames ? '' : 'hostUpOpusCollection',\n        subBuilder: SectionOpusCollection.create)\n    ..aOM<SectionNoteNavigationBar>(\n        4, _omitFieldNames ? '' : 'hostUpNoteNavBar',\n        subBuilder: SectionNoteNavigationBar.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OpusSpaceFlowResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OpusSpaceFlowResp copyWith(void Function(OpusSpaceFlowResp) updates) =>\n      super.copyWith((message) => updates(message as OpusSpaceFlowResp))\n          as OpusSpaceFlowResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OpusSpaceFlowResp create() => OpusSpaceFlowResp._();\n  @$core.override\n  OpusSpaceFlowResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OpusSpaceFlowResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OpusSpaceFlowResp>(create);\n  static OpusSpaceFlowResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<OpusFlowItem> get itemList => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $7.PaginationReply get nextPage => $_getN(1);\n  @$pb.TagNumber(2)\n  set nextPage($7.PaginationReply value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasNextPage() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearNextPage() => $_clearField(2);\n  @$pb.TagNumber(2)\n  $7.PaginationReply ensureNextPage() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  SectionOpusCollection get hostUpOpusCollection => $_getN(2);\n  @$pb.TagNumber(3)\n  set hostUpOpusCollection(SectionOpusCollection value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasHostUpOpusCollection() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearHostUpOpusCollection() => $_clearField(3);\n  @$pb.TagNumber(3)\n  SectionOpusCollection ensureHostUpOpusCollection() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  SectionNoteNavigationBar get hostUpNoteNavBar => $_getN(3);\n  @$pb.TagNumber(4)\n  set hostUpNoteNavBar(SectionNoteNavigationBar value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasHostUpNoteNavBar() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearHostUpNoteNavBar() => $_clearField(4);\n  @$pb.TagNumber(4)\n  SectionNoteNavigationBar ensureHostUpNoteNavBar() => $_ensure(3);\n}\n\nclass PGCSeason extends $pb.GeneratedMessage {\n  factory PGCSeason({\n    $core.int? isFinish,\n    $core.String? title,\n    $core.int? type,\n  }) {\n    final result = create();\n    if (isFinish != null) result.isFinish = isFinish;\n    if (title != null) result.title = title;\n    if (type != null) result.type = type;\n    return result;\n  }\n\n  PGCSeason._();\n\n  factory PGCSeason.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PGCSeason.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PGCSeason',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'isFinish')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aI(3, _omitFieldNames ? '' : 'type')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PGCSeason clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PGCSeason copyWith(void Function(PGCSeason) updates) =>\n      super.copyWith((message) => updates(message as PGCSeason)) as PGCSeason;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PGCSeason create() => PGCSeason._();\n  @$core.override\n  PGCSeason createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PGCSeason getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PGCSeason>(create);\n  static PGCSeason? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get isFinish => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set isFinish($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIsFinish() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIsFinish() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get type => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set type($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearType() => $_clearField(3);\n}\n\nclass ParaSpacing extends $pb.GeneratedMessage {\n  factory ParaSpacing({\n    $core.double? spacingBeforePara,\n    $core.double? spacingAfterPara,\n    $core.double? lineSpacing,\n  }) {\n    final result = create();\n    if (spacingBeforePara != null) result.spacingBeforePara = spacingBeforePara;\n    if (spacingAfterPara != null) result.spacingAfterPara = spacingAfterPara;\n    if (lineSpacing != null) result.lineSpacing = lineSpacing;\n    return result;\n  }\n\n  ParaSpacing._();\n\n  factory ParaSpacing.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ParaSpacing.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ParaSpacing',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aD(1, _omitFieldNames ? '' : 'spacingBeforePara')\n    ..aD(2, _omitFieldNames ? '' : 'spacingAfterPara')\n    ..aD(3, _omitFieldNames ? '' : 'lineSpacing')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ParaSpacing clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ParaSpacing copyWith(void Function(ParaSpacing) updates) =>\n      super.copyWith((message) => updates(message as ParaSpacing))\n          as ParaSpacing;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ParaSpacing create() => ParaSpacing._();\n  @$core.override\n  ParaSpacing createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ParaSpacing getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ParaSpacing>(create);\n  static ParaSpacing? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.double get spacingBeforePara => $_getN(0);\n  @$pb.TagNumber(1)\n  set spacingBeforePara($core.double value) => $_setDouble(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSpacingBeforePara() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSpacingBeforePara() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.double get spacingAfterPara => $_getN(1);\n  @$pb.TagNumber(2)\n  set spacingAfterPara($core.double value) => $_setDouble(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSpacingAfterPara() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSpacingAfterPara() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.double get lineSpacing => $_getN(2);\n  @$pb.TagNumber(3)\n  set lineSpacing($core.double value) => $_setDouble(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLineSpacing() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLineSpacing() => $_clearField(3);\n}\n\nclass Paragraph_ListFormat extends $pb.GeneratedMessage {\n  factory Paragraph_ListFormat({\n    $core.int? level,\n    $core.int? order,\n    $core.String? theme,\n  }) {\n    final result = create();\n    if (level != null) result.level = level;\n    if (order != null) result.order = order;\n    if (theme != null) result.theme = theme;\n    return result;\n  }\n\n  Paragraph_ListFormat._();\n\n  factory Paragraph_ListFormat.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Paragraph_ListFormat.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Paragraph.ListFormat',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'level')\n    ..aI(2, _omitFieldNames ? '' : 'order')\n    ..aOS(3, _omitFieldNames ? '' : 'theme')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Paragraph_ListFormat clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Paragraph_ListFormat copyWith(void Function(Paragraph_ListFormat) updates) =>\n      super.copyWith((message) => updates(message as Paragraph_ListFormat))\n          as Paragraph_ListFormat;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Paragraph_ListFormat create() => Paragraph_ListFormat._();\n  @$core.override\n  Paragraph_ListFormat createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Paragraph_ListFormat getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<Paragraph_ListFormat>(create);\n  static Paragraph_ListFormat? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get level => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set level($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLevel() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLevel() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get order => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set order($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOrder() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOrder() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get theme => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set theme($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTheme() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTheme() => $_clearField(3);\n}\n\nclass Paragraph_ParagraphFormat extends $pb.GeneratedMessage {\n  factory Paragraph_ParagraphFormat({\n    Paragraph_ParagraphAlign? align,\n    Paragraph_ListFormat? listFormat,\n  }) {\n    final result = create();\n    if (align != null) result.align = align;\n    if (listFormat != null) result.listFormat = listFormat;\n    return result;\n  }\n\n  Paragraph_ParagraphFormat._();\n\n  factory Paragraph_ParagraphFormat.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Paragraph_ParagraphFormat.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Paragraph.ParagraphFormat',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aE<Paragraph_ParagraphAlign>(1, _omitFieldNames ? '' : 'align',\n        enumValues: Paragraph_ParagraphAlign.values)\n    ..aOM<Paragraph_ListFormat>(2, _omitFieldNames ? '' : 'listFormat',\n        subBuilder: Paragraph_ListFormat.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Paragraph_ParagraphFormat clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Paragraph_ParagraphFormat copyWith(\n          void Function(Paragraph_ParagraphFormat) updates) =>\n      super.copyWith((message) => updates(message as Paragraph_ParagraphFormat))\n          as Paragraph_ParagraphFormat;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Paragraph_ParagraphFormat create() => Paragraph_ParagraphFormat._();\n  @$core.override\n  Paragraph_ParagraphFormat createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Paragraph_ParagraphFormat getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<Paragraph_ParagraphFormat>(create);\n  static Paragraph_ParagraphFormat? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Paragraph_ParagraphAlign get align => $_getN(0);\n  @$pb.TagNumber(1)\n  set align(Paragraph_ParagraphAlign value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAlign() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAlign() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  Paragraph_ListFormat get listFormat => $_getN(1);\n  @$pb.TagNumber(2)\n  set listFormat(Paragraph_ListFormat value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasListFormat() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearListFormat() => $_clearField(2);\n  @$pb.TagNumber(2)\n  Paragraph_ListFormat ensureListFormat() => $_ensure(1);\n}\n\nenum Paragraph_Content { text, pic, line, linkCard, code, notSet }\n\nclass Paragraph extends $pb.GeneratedMessage {\n  factory Paragraph({\n    Paragraph_ParagraphType? paraType,\n    Paragraph_ParagraphFormat? paraFormat,\n    TextParagraph? text,\n    PicParagraph? pic,\n    LineParagraph? line,\n    CardParagraph? linkCard,\n    CodeParagraph? code,\n  }) {\n    final result = create();\n    if (paraType != null) result.paraType = paraType;\n    if (paraFormat != null) result.paraFormat = paraFormat;\n    if (text != null) result.text = text;\n    if (pic != null) result.pic = pic;\n    if (line != null) result.line = line;\n    if (linkCard != null) result.linkCard = linkCard;\n    if (code != null) result.code = code;\n    return result;\n  }\n\n  Paragraph._();\n\n  factory Paragraph.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Paragraph.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, Paragraph_Content> _Paragraph_ContentByTag =\n      {\n    3: Paragraph_Content.text,\n    4: Paragraph_Content.pic,\n    5: Paragraph_Content.line,\n    6: Paragraph_Content.linkCard,\n    7: Paragraph_Content.code,\n    0: Paragraph_Content.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Paragraph',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..oo(0, [3, 4, 5, 6, 7])\n    ..aE<Paragraph_ParagraphType>(1, _omitFieldNames ? '' : 'paraType',\n        enumValues: Paragraph_ParagraphType.values)\n    ..aOM<Paragraph_ParagraphFormat>(2, _omitFieldNames ? '' : 'paraFormat',\n        subBuilder: Paragraph_ParagraphFormat.create)\n    ..aOM<TextParagraph>(3, _omitFieldNames ? '' : 'text',\n        subBuilder: TextParagraph.create)\n    ..aOM<PicParagraph>(4, _omitFieldNames ? '' : 'pic',\n        subBuilder: PicParagraph.create)\n    ..aOM<LineParagraph>(5, _omitFieldNames ? '' : 'line',\n        subBuilder: LineParagraph.create)\n    ..aOM<CardParagraph>(6, _omitFieldNames ? '' : 'linkCard',\n        subBuilder: CardParagraph.create)\n    ..aOM<CodeParagraph>(7, _omitFieldNames ? '' : 'code',\n        subBuilder: CodeParagraph.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Paragraph clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Paragraph copyWith(void Function(Paragraph) updates) =>\n      super.copyWith((message) => updates(message as Paragraph)) as Paragraph;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Paragraph create() => Paragraph._();\n  @$core.override\n  Paragraph createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Paragraph getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Paragraph>(create);\n  static Paragraph? _defaultInstance;\n\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(7)\n  Paragraph_Content whichContent() => _Paragraph_ContentByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(7)\n  void clearContent() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  Paragraph_ParagraphType get paraType => $_getN(0);\n  @$pb.TagNumber(1)\n  set paraType(Paragraph_ParagraphType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasParaType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearParaType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  Paragraph_ParagraphFormat get paraFormat => $_getN(1);\n  @$pb.TagNumber(2)\n  set paraFormat(Paragraph_ParagraphFormat value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasParaFormat() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearParaFormat() => $_clearField(2);\n  @$pb.TagNumber(2)\n  Paragraph_ParagraphFormat ensureParaFormat() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  TextParagraph get text => $_getN(2);\n  @$pb.TagNumber(3)\n  set text(TextParagraph value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasText() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearText() => $_clearField(3);\n  @$pb.TagNumber(3)\n  TextParagraph ensureText() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  PicParagraph get pic => $_getN(3);\n  @$pb.TagNumber(4)\n  set pic(PicParagraph value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPic() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPic() => $_clearField(4);\n  @$pb.TagNumber(4)\n  PicParagraph ensurePic() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  LineParagraph get line => $_getN(4);\n  @$pb.TagNumber(5)\n  set line(LineParagraph value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasLine() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearLine() => $_clearField(5);\n  @$pb.TagNumber(5)\n  LineParagraph ensureLine() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  CardParagraph get linkCard => $_getN(5);\n  @$pb.TagNumber(6)\n  set linkCard(CardParagraph value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasLinkCard() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearLinkCard() => $_clearField(6);\n  @$pb.TagNumber(6)\n  CardParagraph ensureLinkCard() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  CodeParagraph get code => $_getN(6);\n  @$pb.TagNumber(7)\n  set code(CodeParagraph value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCode() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCode() => $_clearField(7);\n  @$pb.TagNumber(7)\n  CodeParagraph ensureCode() => $_ensure(6);\n}\n\nclass PicParagraph extends $pb.GeneratedMessage {\n  factory PicParagraph({\n    MdlDynDraw? pics,\n    PicParagraph_PicParagraphStyle? style,\n  }) {\n    final result = create();\n    if (pics != null) result.pics = pics;\n    if (style != null) result.style = style;\n    return result;\n  }\n\n  PicParagraph._();\n\n  factory PicParagraph.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PicParagraph.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PicParagraph',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<MdlDynDraw>(1, _omitFieldNames ? '' : 'pics',\n        subBuilder: MdlDynDraw.create)\n    ..aE<PicParagraph_PicParagraphStyle>(2, _omitFieldNames ? '' : 'style',\n        enumValues: PicParagraph_PicParagraphStyle.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PicParagraph clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PicParagraph copyWith(void Function(PicParagraph) updates) =>\n      super.copyWith((message) => updates(message as PicParagraph))\n          as PicParagraph;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PicParagraph create() => PicParagraph._();\n  @$core.override\n  PicParagraph createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PicParagraph getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PicParagraph>(create);\n  static PicParagraph? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  MdlDynDraw get pics => $_getN(0);\n  @$pb.TagNumber(1)\n  set pics(MdlDynDraw value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPics() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPics() => $_clearField(1);\n  @$pb.TagNumber(1)\n  MdlDynDraw ensurePics() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  PicParagraph_PicParagraphStyle get style => $_getN(1);\n  @$pb.TagNumber(2)\n  set style(PicParagraph_PicParagraphStyle value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasStyle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearStyle() => $_clearField(2);\n}\n\nclass PlayurlParam extends $pb.GeneratedMessage {\n  factory PlayurlParam({\n    $core.int? qn,\n    $core.int? fnver,\n    $core.int? fnval,\n    $core.int? forceHost,\n    $core.int? fourk,\n  }) {\n    final result = create();\n    if (qn != null) result.qn = qn;\n    if (fnver != null) result.fnver = fnver;\n    if (fnval != null) result.fnval = fnval;\n    if (forceHost != null) result.forceHost = forceHost;\n    if (fourk != null) result.fourk = fourk;\n    return result;\n  }\n\n  PlayurlParam._();\n\n  factory PlayurlParam.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayurlParam.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayurlParam',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'qn')\n    ..aI(2, _omitFieldNames ? '' : 'fnver')\n    ..aI(3, _omitFieldNames ? '' : 'fnval')\n    ..aI(4, _omitFieldNames ? '' : 'forceHost')\n    ..aI(5, _omitFieldNames ? '' : 'fourk')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayurlParam clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayurlParam copyWith(void Function(PlayurlParam) updates) =>\n      super.copyWith((message) => updates(message as PlayurlParam))\n          as PlayurlParam;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayurlParam create() => PlayurlParam._();\n  @$core.override\n  PlayurlParam createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayurlParam getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayurlParam>(create);\n  static PlayurlParam? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get qn => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set qn($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasQn() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearQn() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get fnver => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set fnver($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFnver() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFnver() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get fnval => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set fnval($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFnval() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFnval() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get forceHost => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set forceHost($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasForceHost() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearForceHost() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get fourk => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set fourk($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasFourk() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearFourk() => $_clearField(5);\n}\n\nclass Popup extends $pb.GeneratedMessage {\n  factory Popup({\n    $core.String? title,\n    $core.String? desc,\n    $core.String? uri,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (desc != null) result.desc = desc;\n    if (uri != null) result.uri = uri;\n    return result;\n  }\n\n  Popup._();\n\n  factory Popup.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Popup.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Popup',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'desc')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Popup clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Popup copyWith(void Function(Popup) updates) =>\n      super.copyWith((message) => updates(message as Popup)) as Popup;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Popup create() => Popup._();\n  @$core.override\n  Popup createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Popup getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Popup>(create);\n  static Popup? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get desc => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set desc($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDesc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDesc() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n}\n\nclass ProtectedStaticResource extends $pb.GeneratedMessage {\n  factory ProtectedStaticResource({\n    $core.String? resUrl,\n    $core.bool? isAlreadySigned,\n    $core.String? signParam,\n  }) {\n    final result = create();\n    if (resUrl != null) result.resUrl = resUrl;\n    if (isAlreadySigned != null) result.isAlreadySigned = isAlreadySigned;\n    if (signParam != null) result.signParam = signParam;\n    return result;\n  }\n\n  ProtectedStaticResource._();\n\n  factory ProtectedStaticResource.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ProtectedStaticResource.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ProtectedStaticResource',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'resUrl')\n    ..aOB(2, _omitFieldNames ? '' : 'isAlreadySigned')\n    ..aOS(3, _omitFieldNames ? '' : 'signParam')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ProtectedStaticResource clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ProtectedStaticResource copyWith(\n          void Function(ProtectedStaticResource) updates) =>\n      super.copyWith((message) => updates(message as ProtectedStaticResource))\n          as ProtectedStaticResource;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ProtectedStaticResource create() => ProtectedStaticResource._();\n  @$core.override\n  ProtectedStaticResource createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ProtectedStaticResource getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ProtectedStaticResource>(create);\n  static ProtectedStaticResource? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get resUrl => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set resUrl($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasResUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearResUrl() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get isAlreadySigned => $_getBF(1);\n  @$pb.TagNumber(2)\n  set isAlreadySigned($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIsAlreadySigned() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIsAlreadySigned() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get signParam => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set signParam($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSignParam() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSignParam() => $_clearField(3);\n}\n\nclass QuickConsumeMoreAvatarListReply extends $pb.GeneratedMessage {\n  factory QuickConsumeMoreAvatarListReply({\n    $core.String? offset,\n    $core.bool? hasMore,\n    $core.Iterable<UpListItem>? upList,\n  }) {\n    final result = create();\n    if (offset != null) result.offset = offset;\n    if (hasMore != null) result.hasMore = hasMore;\n    if (upList != null) result.upList.addAll(upList);\n    return result;\n  }\n\n  QuickConsumeMoreAvatarListReply._();\n\n  factory QuickConsumeMoreAvatarListReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory QuickConsumeMoreAvatarListReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'QuickConsumeMoreAvatarListReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'offset')\n    ..aOB(2, _omitFieldNames ? '' : 'hasMore')\n    ..pPM<UpListItem>(3, _omitFieldNames ? '' : 'upList',\n        subBuilder: UpListItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QuickConsumeMoreAvatarListReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QuickConsumeMoreAvatarListReply copyWith(\n          void Function(QuickConsumeMoreAvatarListReply) updates) =>\n      super.copyWith(\n              (message) => updates(message as QuickConsumeMoreAvatarListReply))\n          as QuickConsumeMoreAvatarListReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static QuickConsumeMoreAvatarListReply create() =>\n      QuickConsumeMoreAvatarListReply._();\n  @$core.override\n  QuickConsumeMoreAvatarListReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static QuickConsumeMoreAvatarListReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<QuickConsumeMoreAvatarListReply>(\n          create);\n  static QuickConsumeMoreAvatarListReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get offset => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set offset($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOffset() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOffset() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get hasMore => $_getBF(1);\n  @$pb.TagNumber(2)\n  set hasMore($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHasMore() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHasMore() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<UpListItem> get upList => $_getList(2);\n}\n\nclass QuickConsumeMoreAvatarListReq extends $pb.GeneratedMessage {\n  factory QuickConsumeMoreAvatarListReq({\n    $core.String? offset,\n  }) {\n    final result = create();\n    if (offset != null) result.offset = offset;\n    return result;\n  }\n\n  QuickConsumeMoreAvatarListReq._();\n\n  factory QuickConsumeMoreAvatarListReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory QuickConsumeMoreAvatarListReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'QuickConsumeMoreAvatarListReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'offset')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QuickConsumeMoreAvatarListReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QuickConsumeMoreAvatarListReq copyWith(\n          void Function(QuickConsumeMoreAvatarListReq) updates) =>\n      super.copyWith(\n              (message) => updates(message as QuickConsumeMoreAvatarListReq))\n          as QuickConsumeMoreAvatarListReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static QuickConsumeMoreAvatarListReq create() =>\n      QuickConsumeMoreAvatarListReq._();\n  @$core.override\n  QuickConsumeMoreAvatarListReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static QuickConsumeMoreAvatarListReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<QuickConsumeMoreAvatarListReq>(create);\n  static QuickConsumeMoreAvatarListReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get offset => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set offset($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOffset() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOffset() => $_clearField(1);\n}\n\nclass RcmdArchive extends $pb.GeneratedMessage {\n  factory RcmdArchive({\n    $core.String? title,\n    $core.String? cover,\n    CoverIcon? coverLeftIcon1,\n    $core.String? coverLeftText1,\n    $core.String? uri,\n    $core.bool? isPgc,\n    $fixnum.Int64? aid,\n    IconBadge? badge,\n    CoverIcon? coverLeftIcon2,\n    $core.String? coverLeftText2,\n    CoverIcon? coverLeftIcon3,\n    $core.String? coverLeftText3,\n    $core.String? desc,\n    $core.String? trackId,\n    RcmdReason? rcmdReason,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (coverLeftIcon1 != null) result.coverLeftIcon1 = coverLeftIcon1;\n    if (coverLeftText1 != null) result.coverLeftText1 = coverLeftText1;\n    if (uri != null) result.uri = uri;\n    if (isPgc != null) result.isPgc = isPgc;\n    if (aid != null) result.aid = aid;\n    if (badge != null) result.badge = badge;\n    if (coverLeftIcon2 != null) result.coverLeftIcon2 = coverLeftIcon2;\n    if (coverLeftText2 != null) result.coverLeftText2 = coverLeftText2;\n    if (coverLeftIcon3 != null) result.coverLeftIcon3 = coverLeftIcon3;\n    if (coverLeftText3 != null) result.coverLeftText3 = coverLeftText3;\n    if (desc != null) result.desc = desc;\n    if (trackId != null) result.trackId = trackId;\n    if (rcmdReason != null) result.rcmdReason = rcmdReason;\n    return result;\n  }\n\n  RcmdArchive._();\n\n  factory RcmdArchive.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RcmdArchive.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RcmdArchive',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'cover')\n    ..aE<CoverIcon>(3, _omitFieldNames ? '' : 'coverLeftIcon1',\n        enumValues: CoverIcon.values)\n    ..aOS(4, _omitFieldNames ? '' : 'coverLeftText1')\n    ..aOS(5, _omitFieldNames ? '' : 'uri')\n    ..aOB(6, _omitFieldNames ? '' : 'isPgc')\n    ..aInt64(7, _omitFieldNames ? '' : 'aid')\n    ..aOM<IconBadge>(8, _omitFieldNames ? '' : 'badge',\n        subBuilder: IconBadge.create)\n    ..aE<CoverIcon>(9, _omitFieldNames ? '' : 'coverLeftIcon2',\n        enumValues: CoverIcon.values)\n    ..aOS(10, _omitFieldNames ? '' : 'coverLeftText2')\n    ..aE<CoverIcon>(11, _omitFieldNames ? '' : 'coverLeftIcon3',\n        enumValues: CoverIcon.values)\n    ..aOS(12, _omitFieldNames ? '' : 'coverLeftText3')\n    ..aOS(13, _omitFieldNames ? '' : 'desc')\n    ..aOS(14, _omitFieldNames ? '' : 'trackId')\n    ..aOM<RcmdReason>(15, _omitFieldNames ? '' : 'rcmdReason',\n        subBuilder: RcmdReason.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RcmdArchive clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RcmdArchive copyWith(void Function(RcmdArchive) updates) =>\n      super.copyWith((message) => updates(message as RcmdArchive))\n          as RcmdArchive;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RcmdArchive create() => RcmdArchive._();\n  @$core.override\n  RcmdArchive createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RcmdArchive getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RcmdArchive>(create);\n  static RcmdArchive? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get cover => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cover($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCover() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCover() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  CoverIcon get coverLeftIcon1 => $_getN(2);\n  @$pb.TagNumber(3)\n  set coverLeftIcon1(CoverIcon value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCoverLeftIcon1() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCoverLeftIcon1() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get coverLeftText1 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set coverLeftText1($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCoverLeftText1() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCoverLeftText1() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get uri => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set uri($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasUri() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearUri() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.bool get isPgc => $_getBF(5);\n  @$pb.TagNumber(6)\n  set isPgc($core.bool value) => $_setBool(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasIsPgc() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearIsPgc() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get aid => $_getI64(6);\n  @$pb.TagNumber(7)\n  set aid($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasAid() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearAid() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  IconBadge get badge => $_getN(7);\n  @$pb.TagNumber(8)\n  set badge(IconBadge value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasBadge() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearBadge() => $_clearField(8);\n  @$pb.TagNumber(8)\n  IconBadge ensureBadge() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  CoverIcon get coverLeftIcon2 => $_getN(8);\n  @$pb.TagNumber(9)\n  set coverLeftIcon2(CoverIcon value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasCoverLeftIcon2() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearCoverLeftIcon2() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get coverLeftText2 => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set coverLeftText2($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasCoverLeftText2() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearCoverLeftText2() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  CoverIcon get coverLeftIcon3 => $_getN(10);\n  @$pb.TagNumber(11)\n  set coverLeftIcon3(CoverIcon value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasCoverLeftIcon3() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearCoverLeftIcon3() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get coverLeftText3 => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set coverLeftText3($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasCoverLeftText3() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearCoverLeftText3() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.String get desc => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set desc($core.String value) => $_setString(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasDesc() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearDesc() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.String get trackId => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set trackId($core.String value) => $_setString(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasTrackId() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearTrackId() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  RcmdReason get rcmdReason => $_getN(14);\n  @$pb.TagNumber(15)\n  set rcmdReason(RcmdReason value) => $_setField(15, value);\n  @$pb.TagNumber(15)\n  $core.bool hasRcmdReason() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearRcmdReason() => $_clearField(15);\n  @$pb.TagNumber(15)\n  RcmdReason ensureRcmdReason() => $_ensure(14);\n}\n\nclass RcmdAuthor extends $pb.GeneratedMessage {\n  factory RcmdAuthor({\n    UserInfo? author,\n    $core.String? desc,\n    Relation? relation,\n  }) {\n    final result = create();\n    if (author != null) result.author = author;\n    if (desc != null) result.desc = desc;\n    if (relation != null) result.relation = relation;\n    return result;\n  }\n\n  RcmdAuthor._();\n\n  factory RcmdAuthor.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RcmdAuthor.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RcmdAuthor',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<UserInfo>(1, _omitFieldNames ? '' : 'author',\n        subBuilder: UserInfo.create)\n    ..aOS(2, _omitFieldNames ? '' : 'desc')\n    ..aOM<Relation>(3, _omitFieldNames ? '' : 'relation',\n        subBuilder: Relation.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RcmdAuthor clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RcmdAuthor copyWith(void Function(RcmdAuthor) updates) =>\n      super.copyWith((message) => updates(message as RcmdAuthor)) as RcmdAuthor;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RcmdAuthor create() => RcmdAuthor._();\n  @$core.override\n  RcmdAuthor createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RcmdAuthor getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RcmdAuthor>(create);\n  static RcmdAuthor? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  UserInfo get author => $_getN(0);\n  @$pb.TagNumber(1)\n  set author(UserInfo value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAuthor() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAuthor() => $_clearField(1);\n  @$pb.TagNumber(1)\n  UserInfo ensureAuthor() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get desc => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set desc($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDesc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDesc() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  Relation get relation => $_getN(2);\n  @$pb.TagNumber(3)\n  set relation(Relation value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRelation() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRelation() => $_clearField(3);\n  @$pb.TagNumber(3)\n  Relation ensureRelation() => $_ensure(2);\n}\n\nclass RcmdCampusBrief extends $pb.GeneratedMessage {\n  factory RcmdCampusBrief({\n    $fixnum.Int64? campusId,\n    $core.String? campusName,\n    $core.String? campusBadge,\n    $core.String? url,\n  }) {\n    final result = create();\n    if (campusId != null) result.campusId = campusId;\n    if (campusName != null) result.campusName = campusName;\n    if (campusBadge != null) result.campusBadge = campusBadge;\n    if (url != null) result.url = url;\n    return result;\n  }\n\n  RcmdCampusBrief._();\n\n  factory RcmdCampusBrief.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RcmdCampusBrief.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RcmdCampusBrief',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'campusId')\n    ..aOS(2, _omitFieldNames ? '' : 'campusName')\n    ..aOS(4, _omitFieldNames ? '' : 'campusBadge')\n    ..aOS(5, _omitFieldNames ? '' : 'url')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RcmdCampusBrief clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RcmdCampusBrief copyWith(void Function(RcmdCampusBrief) updates) =>\n      super.copyWith((message) => updates(message as RcmdCampusBrief))\n          as RcmdCampusBrief;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RcmdCampusBrief create() => RcmdCampusBrief._();\n  @$core.override\n  RcmdCampusBrief createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RcmdCampusBrief getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RcmdCampusBrief>(create);\n  static RcmdCampusBrief? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get campusId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set campusId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCampusId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCampusId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get campusName => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set campusName($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCampusName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCampusName() => $_clearField(2);\n\n  @$pb.TagNumber(4)\n  $core.String get campusBadge => $_getSZ(2);\n  @$pb.TagNumber(4)\n  set campusBadge($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCampusBadge() => $_has(2);\n  @$pb.TagNumber(4)\n  void clearCampusBadge() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get url => $_getSZ(3);\n  @$pb.TagNumber(5)\n  set url($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(5)\n  $core.bool hasUrl() => $_has(3);\n  @$pb.TagNumber(5)\n  void clearUrl() => $_clearField(5);\n}\n\nenum RcmdItem_RcmdItem { rcmdArchive, notSet }\n\nclass RcmdItem extends $pb.GeneratedMessage {\n  factory RcmdItem({\n    RcmdType? type,\n    RcmdArchive? rcmdArchive,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (rcmdArchive != null) result.rcmdArchive = rcmdArchive;\n    return result;\n  }\n\n  RcmdItem._();\n\n  factory RcmdItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RcmdItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, RcmdItem_RcmdItem> _RcmdItem_RcmdItemByTag =\n      {2: RcmdItem_RcmdItem.rcmdArchive, 0: RcmdItem_RcmdItem.notSet};\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RcmdItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..oo(0, [2])\n    ..aE<RcmdType>(1, _omitFieldNames ? '' : 'type',\n        enumValues: RcmdType.values)\n    ..aOM<RcmdArchive>(2, _omitFieldNames ? '' : 'rcmdArchive',\n        subBuilder: RcmdArchive.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RcmdItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RcmdItem copyWith(void Function(RcmdItem) updates) =>\n      super.copyWith((message) => updates(message as RcmdItem)) as RcmdItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RcmdItem create() => RcmdItem._();\n  @$core.override\n  RcmdItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RcmdItem getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<RcmdItem>(create);\n  static RcmdItem? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  RcmdItem_RcmdItem whichRcmdItem() =>\n      _RcmdItem_RcmdItemByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  void clearRcmdItem() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  RcmdType get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(RcmdType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  RcmdArchive get rcmdArchive => $_getN(1);\n  @$pb.TagNumber(2)\n  set rcmdArchive(RcmdArchive value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasRcmdArchive() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRcmdArchive() => $_clearField(2);\n  @$pb.TagNumber(2)\n  RcmdArchive ensureRcmdArchive() => $_ensure(1);\n}\n\nclass RcmdOption extends $pb.GeneratedMessage {\n  factory RcmdOption({\n    $core.bool? showTitle,\n  }) {\n    final result = create();\n    if (showTitle != null) result.showTitle = showTitle;\n    return result;\n  }\n\n  RcmdOption._();\n\n  factory RcmdOption.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RcmdOption.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RcmdOption',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'showTitle')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RcmdOption clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RcmdOption copyWith(void Function(RcmdOption) updates) =>\n      super.copyWith((message) => updates(message as RcmdOption)) as RcmdOption;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RcmdOption create() => RcmdOption._();\n  @$core.override\n  RcmdOption createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RcmdOption getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RcmdOption>(create);\n  static RcmdOption? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get showTitle => $_getBF(0);\n  @$pb.TagNumber(1)\n  set showTitle($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasShowTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearShowTitle() => $_clearField(1);\n}\n\nclass RcmdReason extends $pb.GeneratedMessage {\n  factory RcmdReason({\n    $core.String? campusName,\n    RcmdReasonStyle? style,\n    $core.String? rcmdReason,\n    $core.String? upName,\n  }) {\n    final result = create();\n    if (campusName != null) result.campusName = campusName;\n    if (style != null) result.style = style;\n    if (rcmdReason != null) result.rcmdReason = rcmdReason;\n    if (upName != null) result.upName = upName;\n    return result;\n  }\n\n  RcmdReason._();\n\n  factory RcmdReason.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RcmdReason.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RcmdReason',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'campusName')\n    ..aE<RcmdReasonStyle>(2, _omitFieldNames ? '' : 'style',\n        enumValues: RcmdReasonStyle.values)\n    ..aOS(3, _omitFieldNames ? '' : 'rcmdReason')\n    ..aOS(4, _omitFieldNames ? '' : 'upName')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RcmdReason clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RcmdReason copyWith(void Function(RcmdReason) updates) =>\n      super.copyWith((message) => updates(message as RcmdReason)) as RcmdReason;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RcmdReason create() => RcmdReason._();\n  @$core.override\n  RcmdReason createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RcmdReason getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RcmdReason>(create);\n  static RcmdReason? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get campusName => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set campusName($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCampusName() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCampusName() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  RcmdReasonStyle get style => $_getN(1);\n  @$pb.TagNumber(2)\n  set style(RcmdReasonStyle value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasStyle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearStyle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get rcmdReason => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set rcmdReason($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRcmdReason() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRcmdReason() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get upName => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set upName($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUpName() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUpName() => $_clearField(4);\n}\n\nclass RcmdTopButton extends $pb.GeneratedMessage {\n  factory RcmdTopButton({\n    $core.String? text,\n    $core.String? url,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (url != null) result.url = url;\n    return result;\n  }\n\n  RcmdTopButton._();\n\n  factory RcmdTopButton.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RcmdTopButton.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RcmdTopButton',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aOS(2, _omitFieldNames ? '' : 'url')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RcmdTopButton clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RcmdTopButton copyWith(void Function(RcmdTopButton) updates) =>\n      super.copyWith((message) => updates(message as RcmdTopButton))\n          as RcmdTopButton;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RcmdTopButton create() => RcmdTopButton._();\n  @$core.override\n  RcmdTopButton createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RcmdTopButton getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RcmdTopButton>(create);\n  static RcmdTopButton? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get url => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set url($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUrl() => $_clearField(2);\n}\n\nclass RcmdUPsParam extends $pb.GeneratedMessage {\n  factory RcmdUPsParam({\n    $fixnum.Int64? dislikeTs,\n  }) {\n    final result = create();\n    if (dislikeTs != null) result.dislikeTs = dislikeTs;\n    return result;\n  }\n\n  RcmdUPsParam._();\n\n  factory RcmdUPsParam.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RcmdUPsParam.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RcmdUPsParam',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'dislikeTs')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RcmdUPsParam clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RcmdUPsParam copyWith(void Function(RcmdUPsParam) updates) =>\n      super.copyWith((message) => updates(message as RcmdUPsParam))\n          as RcmdUPsParam;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RcmdUPsParam create() => RcmdUPsParam._();\n  @$core.override\n  RcmdUPsParam createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RcmdUPsParam getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RcmdUPsParam>(create);\n  static RcmdUPsParam? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get dislikeTs => $_getI64(0);\n  @$pb.TagNumber(1)\n  set dislikeTs($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDislikeTs() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDislikeTs() => $_clearField(1);\n}\n\nclass ReactionListItem extends $pb.GeneratedMessage {\n  factory ReactionListItem({\n    UserInfo? user,\n    Relation? relation,\n    $core.String? actText,\n    $core.String? rcmdReason,\n  }) {\n    final result = create();\n    if (user != null) result.user = user;\n    if (relation != null) result.relation = relation;\n    if (actText != null) result.actText = actText;\n    if (rcmdReason != null) result.rcmdReason = rcmdReason;\n    return result;\n  }\n\n  ReactionListItem._();\n\n  factory ReactionListItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReactionListItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReactionListItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<UserInfo>(1, _omitFieldNames ? '' : 'user',\n        subBuilder: UserInfo.create)\n    ..aOM<Relation>(2, _omitFieldNames ? '' : 'relation',\n        subBuilder: Relation.create)\n    ..aOS(3, _omitFieldNames ? '' : 'actText')\n    ..aOS(4, _omitFieldNames ? '' : 'rcmdReason')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReactionListItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReactionListItem copyWith(void Function(ReactionListItem) updates) =>\n      super.copyWith((message) => updates(message as ReactionListItem))\n          as ReactionListItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReactionListItem create() => ReactionListItem._();\n  @$core.override\n  ReactionListItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReactionListItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReactionListItem>(create);\n  static ReactionListItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  UserInfo get user => $_getN(0);\n  @$pb.TagNumber(1)\n  set user(UserInfo value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUser() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUser() => $_clearField(1);\n  @$pb.TagNumber(1)\n  UserInfo ensureUser() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  Relation get relation => $_getN(1);\n  @$pb.TagNumber(2)\n  set relation(Relation value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasRelation() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRelation() => $_clearField(2);\n  @$pb.TagNumber(2)\n  Relation ensureRelation() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.String get actText => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set actText($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasActText() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearActText() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get rcmdReason => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set rcmdReason($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasRcmdReason() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearRcmdReason() => $_clearField(4);\n}\n\nclass ReactionListReply extends $pb.GeneratedMessage {\n  factory ReactionListReply({\n    $core.String? title,\n    $core.Iterable<ReactionListItem>? reactionList,\n    $core.String? offset,\n    $core.bool? hasMore,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (reactionList != null) result.reactionList.addAll(reactionList);\n    if (offset != null) result.offset = offset;\n    if (hasMore != null) result.hasMore = hasMore;\n    return result;\n  }\n\n  ReactionListReply._();\n\n  factory ReactionListReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReactionListReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReactionListReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..pPM<ReactionListItem>(2, _omitFieldNames ? '' : 'reactionList',\n        subBuilder: ReactionListItem.create)\n    ..aOS(3, _omitFieldNames ? '' : 'offset')\n    ..aOB(4, _omitFieldNames ? '' : 'hasMore')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReactionListReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReactionListReply copyWith(void Function(ReactionListReply) updates) =>\n      super.copyWith((message) => updates(message as ReactionListReply))\n          as ReactionListReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReactionListReply create() => ReactionListReply._();\n  @$core.override\n  ReactionListReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReactionListReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReactionListReply>(create);\n  static ReactionListReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<ReactionListItem> get reactionList => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $core.String get offset => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set offset($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasOffset() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearOffset() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get hasMore => $_getBF(3);\n  @$pb.TagNumber(4)\n  set hasMore($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasHasMore() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearHasMore() => $_clearField(4);\n}\n\nclass ReactionListReq extends $pb.GeneratedMessage {\n  factory ReactionListReq({\n    $fixnum.Int64? dynamicId,\n    $fixnum.Int64? dynType,\n    $fixnum.Int64? rid,\n    $core.String? offset,\n  }) {\n    final result = create();\n    if (dynamicId != null) result.dynamicId = dynamicId;\n    if (dynType != null) result.dynType = dynType;\n    if (rid != null) result.rid = rid;\n    if (offset != null) result.offset = offset;\n    return result;\n  }\n\n  ReactionListReq._();\n\n  factory ReactionListReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReactionListReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReactionListReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'dynamicId')\n    ..aInt64(2, _omitFieldNames ? '' : 'dynType')\n    ..aInt64(3, _omitFieldNames ? '' : 'rid')\n    ..aOS(4, _omitFieldNames ? '' : 'offset')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReactionListReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReactionListReq copyWith(void Function(ReactionListReq) updates) =>\n      super.copyWith((message) => updates(message as ReactionListReq))\n          as ReactionListReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReactionListReq create() => ReactionListReq._();\n  @$core.override\n  ReactionListReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReactionListReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReactionListReq>(create);\n  static ReactionListReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get dynamicId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set dynamicId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDynamicId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDynamicId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get dynType => $_getI64(1);\n  @$pb.TagNumber(2)\n  set dynType($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDynType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDynType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get rid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set rid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRid() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get offset => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set offset($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasOffset() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearOffset() => $_clearField(4);\n}\n\nclass Relation extends $pb.GeneratedMessage {\n  factory Relation({\n    RelationStatus? status,\n    $core.int? isFollow,\n    $core.int? isFollowed,\n    $core.String? title,\n  }) {\n    final result = create();\n    if (status != null) result.status = status;\n    if (isFollow != null) result.isFollow = isFollow;\n    if (isFollowed != null) result.isFollowed = isFollowed;\n    if (title != null) result.title = title;\n    return result;\n  }\n\n  Relation._();\n\n  factory Relation.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Relation.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Relation',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aE<RelationStatus>(1, _omitFieldNames ? '' : 'status',\n        enumValues: RelationStatus.values)\n    ..aI(2, _omitFieldNames ? '' : 'isFollow')\n    ..aI(3, _omitFieldNames ? '' : 'isFollowed')\n    ..aOS(4, _omitFieldNames ? '' : 'title')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Relation clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Relation copyWith(void Function(Relation) updates) =>\n      super.copyWith((message) => updates(message as Relation)) as Relation;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Relation create() => Relation._();\n  @$core.override\n  Relation createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Relation getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Relation>(create);\n  static Relation? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  RelationStatus get status => $_getN(0);\n  @$pb.TagNumber(1)\n  set status(RelationStatus value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStatus() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStatus() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get isFollow => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set isFollow($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIsFollow() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIsFollow() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get isFollowed => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set isFollowed($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIsFollowed() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIsFollowed() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get title => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set title($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTitle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTitle() => $_clearField(4);\n}\n\nclass RepostExtraInfo extends $pb.GeneratedMessage {\n  factory RepostExtraInfo({\n    $core.String? adcmId,\n  }) {\n    final result = create();\n    if (adcmId != null) result.adcmId = adcmId;\n    return result;\n  }\n\n  RepostExtraInfo._();\n\n  factory RepostExtraInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RepostExtraInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RepostExtraInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'adcmId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RepostExtraInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RepostExtraInfo copyWith(void Function(RepostExtraInfo) updates) =>\n      super.copyWith((message) => updates(message as RepostExtraInfo))\n          as RepostExtraInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RepostExtraInfo create() => RepostExtraInfo._();\n  @$core.override\n  RepostExtraInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RepostExtraInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RepostExtraInfo>(create);\n  static RepostExtraInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get adcmId => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set adcmId($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAdcmId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAdcmId() => $_clearField(1);\n}\n\nclass RepostListReq extends $pb.GeneratedMessage {\n  factory RepostListReq({\n    $core.String? dynamicId,\n    $fixnum.Int64? dynType,\n    $fixnum.Int64? rid,\n    $core.String? offset,\n    $core.String? from,\n    RepostType? repostType,\n  }) {\n    final result = create();\n    if (dynamicId != null) result.dynamicId = dynamicId;\n    if (dynType != null) result.dynType = dynType;\n    if (rid != null) result.rid = rid;\n    if (offset != null) result.offset = offset;\n    if (from != null) result.from = from;\n    if (repostType != null) result.repostType = repostType;\n    return result;\n  }\n\n  RepostListReq._();\n\n  factory RepostListReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RepostListReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RepostListReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'dynamicId')\n    ..aInt64(2, _omitFieldNames ? '' : 'dynType')\n    ..aInt64(3, _omitFieldNames ? '' : 'rid')\n    ..aOS(4, _omitFieldNames ? '' : 'offset')\n    ..aOS(5, _omitFieldNames ? '' : 'from')\n    ..aE<RepostType>(6, _omitFieldNames ? '' : 'repostType',\n        enumValues: RepostType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RepostListReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RepostListReq copyWith(void Function(RepostListReq) updates) =>\n      super.copyWith((message) => updates(message as RepostListReq))\n          as RepostListReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RepostListReq create() => RepostListReq._();\n  @$core.override\n  RepostListReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RepostListReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RepostListReq>(create);\n  static RepostListReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get dynamicId => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set dynamicId($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDynamicId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDynamicId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get dynType => $_getI64(1);\n  @$pb.TagNumber(2)\n  set dynType($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDynType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDynType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get rid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set rid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRid() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get offset => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set offset($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasOffset() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearOffset() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get from => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set from($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasFrom() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearFrom() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  RepostType get repostType => $_getN(5);\n  @$pb.TagNumber(6)\n  set repostType(RepostType value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasRepostType() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearRepostType() => $_clearField(6);\n}\n\nclass RepostListRsp extends $pb.GeneratedMessage {\n  factory RepostListRsp({\n    $core.Iterable<DynamicItem>? list,\n    $core.String? offset,\n    $core.bool? hasMore,\n    $fixnum.Int64? totalCount,\n    RepostType? repostType,\n  }) {\n    final result = create();\n    if (list != null) result.list.addAll(list);\n    if (offset != null) result.offset = offset;\n    if (hasMore != null) result.hasMore = hasMore;\n    if (totalCount != null) result.totalCount = totalCount;\n    if (repostType != null) result.repostType = repostType;\n    return result;\n  }\n\n  RepostListRsp._();\n\n  factory RepostListRsp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RepostListRsp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RepostListRsp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<DynamicItem>(1, _omitFieldNames ? '' : 'list',\n        subBuilder: DynamicItem.create)\n    ..aOS(2, _omitFieldNames ? '' : 'offset')\n    ..aOB(3, _omitFieldNames ? '' : 'hasMore')\n    ..aInt64(4, _omitFieldNames ? '' : 'totalCount')\n    ..aE<RepostType>(5, _omitFieldNames ? '' : 'repostType',\n        enumValues: RepostType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RepostListRsp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RepostListRsp copyWith(void Function(RepostListRsp) updates) =>\n      super.copyWith((message) => updates(message as RepostListRsp))\n          as RepostListRsp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RepostListRsp create() => RepostListRsp._();\n  @$core.override\n  RepostListRsp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RepostListRsp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RepostListRsp>(create);\n  static RepostListRsp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<DynamicItem> get list => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.String get offset => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set offset($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOffset() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOffset() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get hasMore => $_getBF(2);\n  @$pb.TagNumber(3)\n  set hasMore($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasHasMore() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearHasMore() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get totalCount => $_getI64(3);\n  @$pb.TagNumber(4)\n  set totalCount($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTotalCount() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTotalCount() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  RepostType get repostType => $_getN(4);\n  @$pb.TagNumber(5)\n  set repostType(RepostType value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasRepostType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearRepostType() => $_clearField(5);\n}\n\nclass SchoolRecommendReply extends $pb.GeneratedMessage {\n  factory SchoolRecommendReply({\n    $core.Iterable<CampusInfo>? items,\n  }) {\n    final result = create();\n    if (items != null) result.items.addAll(items);\n    return result;\n  }\n\n  SchoolRecommendReply._();\n\n  factory SchoolRecommendReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SchoolRecommendReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SchoolRecommendReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<CampusInfo>(1, _omitFieldNames ? '' : 'items',\n        subBuilder: CampusInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SchoolRecommendReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SchoolRecommendReply copyWith(void Function(SchoolRecommendReply) updates) =>\n      super.copyWith((message) => updates(message as SchoolRecommendReply))\n          as SchoolRecommendReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SchoolRecommendReply create() => SchoolRecommendReply._();\n  @$core.override\n  SchoolRecommendReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SchoolRecommendReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SchoolRecommendReply>(create);\n  static SchoolRecommendReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<CampusInfo> get items => $_getList(0);\n}\n\nclass SchoolRecommendReq extends $pb.GeneratedMessage {\n  factory SchoolRecommendReq({\n    $core.double? lat,\n    $core.double? lng,\n    CampusReqFromType? fromType,\n  }) {\n    final result = create();\n    if (lat != null) result.lat = lat;\n    if (lng != null) result.lng = lng;\n    if (fromType != null) result.fromType = fromType;\n    return result;\n  }\n\n  SchoolRecommendReq._();\n\n  factory SchoolRecommendReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SchoolRecommendReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SchoolRecommendReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aD(1, _omitFieldNames ? '' : 'lat', fieldType: $pb.PbFieldType.OF)\n    ..aD(2, _omitFieldNames ? '' : 'lng', fieldType: $pb.PbFieldType.OF)\n    ..aE<CampusReqFromType>(3, _omitFieldNames ? '' : 'fromType',\n        enumValues: CampusReqFromType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SchoolRecommendReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SchoolRecommendReq copyWith(void Function(SchoolRecommendReq) updates) =>\n      super.copyWith((message) => updates(message as SchoolRecommendReq))\n          as SchoolRecommendReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SchoolRecommendReq create() => SchoolRecommendReq._();\n  @$core.override\n  SchoolRecommendReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SchoolRecommendReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SchoolRecommendReq>(create);\n  static SchoolRecommendReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.double get lat => $_getN(0);\n  @$pb.TagNumber(1)\n  set lat($core.double value) => $_setFloat(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLat() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLat() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.double get lng => $_getN(1);\n  @$pb.TagNumber(2)\n  set lng($core.double value) => $_setFloat(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLng() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLng() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  CampusReqFromType get fromType => $_getN(2);\n  @$pb.TagNumber(3)\n  set fromType(CampusReqFromType value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFromType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFromType() => $_clearField(3);\n}\n\nclass SchoolSearchReply extends $pb.GeneratedMessage {\n  factory SchoolSearchReply({\n    $core.Iterable<CampusInfo>? items,\n    SearchToast? toast,\n  }) {\n    final result = create();\n    if (items != null) result.items.addAll(items);\n    if (toast != null) result.toast = toast;\n    return result;\n  }\n\n  SchoolSearchReply._();\n\n  factory SchoolSearchReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SchoolSearchReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SchoolSearchReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<CampusInfo>(1, _omitFieldNames ? '' : 'items',\n        subBuilder: CampusInfo.create)\n    ..aOM<SearchToast>(2, _omitFieldNames ? '' : 'toast',\n        subBuilder: SearchToast.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SchoolSearchReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SchoolSearchReply copyWith(void Function(SchoolSearchReply) updates) =>\n      super.copyWith((message) => updates(message as SchoolSearchReply))\n          as SchoolSearchReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SchoolSearchReply create() => SchoolSearchReply._();\n  @$core.override\n  SchoolSearchReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SchoolSearchReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SchoolSearchReply>(create);\n  static SchoolSearchReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<CampusInfo> get items => $_getList(0);\n\n  @$pb.TagNumber(2)\n  SearchToast get toast => $_getN(1);\n  @$pb.TagNumber(2)\n  set toast(SearchToast value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasToast() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearToast() => $_clearField(2);\n  @$pb.TagNumber(2)\n  SearchToast ensureToast() => $_ensure(1);\n}\n\nclass SchoolSearchReq extends $pb.GeneratedMessage {\n  factory SchoolSearchReq({\n    $core.String? keyword,\n    CampusReqFromType? fromType,\n  }) {\n    final result = create();\n    if (keyword != null) result.keyword = keyword;\n    if (fromType != null) result.fromType = fromType;\n    return result;\n  }\n\n  SchoolSearchReq._();\n\n  factory SchoolSearchReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SchoolSearchReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SchoolSearchReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'keyword')\n    ..aE<CampusReqFromType>(2, _omitFieldNames ? '' : 'fromType',\n        enumValues: CampusReqFromType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SchoolSearchReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SchoolSearchReq copyWith(void Function(SchoolSearchReq) updates) =>\n      super.copyWith((message) => updates(message as SchoolSearchReq))\n          as SchoolSearchReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SchoolSearchReq create() => SchoolSearchReq._();\n  @$core.override\n  SchoolSearchReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SchoolSearchReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SchoolSearchReq>(create);\n  static SchoolSearchReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get keyword => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set keyword($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasKeyword() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearKeyword() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  CampusReqFromType get fromType => $_getN(1);\n  @$pb.TagNumber(2)\n  set fromType(CampusReqFromType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFromType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFromType() => $_clearField(2);\n}\n\nclass SearchChannel extends $pb.GeneratedMessage {\n  factory SearchChannel({\n    $core.String? title,\n    SearchTopicButton? moreButton,\n    $core.Iterable<ChannelInfo>? channels,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (moreButton != null) result.moreButton = moreButton;\n    if (channels != null) result.channels.addAll(channels);\n    return result;\n  }\n\n  SearchChannel._();\n\n  factory SearchChannel.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SearchChannel.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SearchChannel',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOM<SearchTopicButton>(2, _omitFieldNames ? '' : 'moreButton',\n        subBuilder: SearchTopicButton.create)\n    ..pPM<ChannelInfo>(3, _omitFieldNames ? '' : 'channels',\n        subBuilder: ChannelInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchChannel clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchChannel copyWith(void Function(SearchChannel) updates) =>\n      super.copyWith((message) => updates(message as SearchChannel))\n          as SearchChannel;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SearchChannel create() => SearchChannel._();\n  @$core.override\n  SearchChannel createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SearchChannel getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SearchChannel>(create);\n  static SearchChannel? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  SearchTopicButton get moreButton => $_getN(1);\n  @$pb.TagNumber(2)\n  set moreButton(SearchTopicButton value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMoreButton() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMoreButton() => $_clearField(2);\n  @$pb.TagNumber(2)\n  SearchTopicButton ensureMoreButton() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<ChannelInfo> get channels => $_getList(2);\n}\n\nclass SearchInfo extends $pb.GeneratedMessage {\n  factory SearchInfo({\n    $core.String? title,\n    $core.Iterable<DynamicItem>? list,\n    $core.String? trackId,\n    $fixnum.Int64? total,\n    $core.bool? hasMore,\n    $core.String? version,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (list != null) result.list.addAll(list);\n    if (trackId != null) result.trackId = trackId;\n    if (total != null) result.total = total;\n    if (hasMore != null) result.hasMore = hasMore;\n    if (version != null) result.version = version;\n    return result;\n  }\n\n  SearchInfo._();\n\n  factory SearchInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SearchInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SearchInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..pPM<DynamicItem>(2, _omitFieldNames ? '' : 'list',\n        subBuilder: DynamicItem.create)\n    ..aOS(3, _omitFieldNames ? '' : 'trackId')\n    ..aInt64(4, _omitFieldNames ? '' : 'total')\n    ..aOB(5, _omitFieldNames ? '' : 'hasMore')\n    ..aOS(6, _omitFieldNames ? '' : 'version')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchInfo copyWith(void Function(SearchInfo) updates) =>\n      super.copyWith((message) => updates(message as SearchInfo)) as SearchInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SearchInfo create() => SearchInfo._();\n  @$core.override\n  SearchInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SearchInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SearchInfo>(create);\n  static SearchInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<DynamicItem> get list => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $core.String get trackId => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set trackId($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTrackId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTrackId() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get total => $_getI64(3);\n  @$pb.TagNumber(4)\n  set total($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTotal() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTotal() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.bool get hasMore => $_getBF(4);\n  @$pb.TagNumber(5)\n  set hasMore($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasHasMore() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearHasMore() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get version => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set version($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasVersion() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearVersion() => $_clearField(6);\n}\n\nclass SearchToast extends $pb.GeneratedMessage {\n  factory SearchToast({\n    $core.String? descText1,\n    $core.String? descText2,\n  }) {\n    final result = create();\n    if (descText1 != null) result.descText1 = descText1;\n    if (descText2 != null) result.descText2 = descText2;\n    return result;\n  }\n\n  SearchToast._();\n\n  factory SearchToast.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SearchToast.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SearchToast',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'descText1')\n    ..aOS(2, _omitFieldNames ? '' : 'descText2')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchToast clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchToast copyWith(void Function(SearchToast) updates) =>\n      super.copyWith((message) => updates(message as SearchToast))\n          as SearchToast;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SearchToast create() => SearchToast._();\n  @$core.override\n  SearchToast createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SearchToast getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SearchToast>(create);\n  static SearchToast? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get descText1 => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set descText1($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDescText1() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDescText1() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get descText2 => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set descText2($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDescText2() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDescText2() => $_clearField(2);\n}\n\nclass SearchTopic extends $pb.GeneratedMessage {\n  factory SearchTopic({\n    $core.String? title,\n    SearchTopicButton? moreButton,\n    $core.Iterable<SearchTopicItem>? items,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (moreButton != null) result.moreButton = moreButton;\n    if (items != null) result.items.addAll(items);\n    return result;\n  }\n\n  SearchTopic._();\n\n  factory SearchTopic.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SearchTopic.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SearchTopic',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOM<SearchTopicButton>(2, _omitFieldNames ? '' : 'moreButton',\n        subBuilder: SearchTopicButton.create)\n    ..pPM<SearchTopicItem>(3, _omitFieldNames ? '' : 'items',\n        subBuilder: SearchTopicItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchTopic clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchTopic copyWith(void Function(SearchTopic) updates) =>\n      super.copyWith((message) => updates(message as SearchTopic))\n          as SearchTopic;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SearchTopic create() => SearchTopic._();\n  @$core.override\n  SearchTopic createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SearchTopic getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SearchTopic>(create);\n  static SearchTopic? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  SearchTopicButton get moreButton => $_getN(1);\n  @$pb.TagNumber(2)\n  set moreButton(SearchTopicButton value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMoreButton() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMoreButton() => $_clearField(2);\n  @$pb.TagNumber(2)\n  SearchTopicButton ensureMoreButton() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<SearchTopicItem> get items => $_getList(2);\n}\n\nclass SearchTopicButton extends $pb.GeneratedMessage {\n  factory SearchTopicButton({\n    $core.String? title,\n    $core.String? jumpUri,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (jumpUri != null) result.jumpUri = jumpUri;\n    return result;\n  }\n\n  SearchTopicButton._();\n\n  factory SearchTopicButton.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SearchTopicButton.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SearchTopicButton',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'jumpUri')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchTopicButton clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchTopicButton copyWith(void Function(SearchTopicButton) updates) =>\n      super.copyWith((message) => updates(message as SearchTopicButton))\n          as SearchTopicButton;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SearchTopicButton create() => SearchTopicButton._();\n  @$core.override\n  SearchTopicButton createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SearchTopicButton getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SearchTopicButton>(create);\n  static SearchTopicButton? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get jumpUri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set jumpUri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasJumpUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearJumpUri() => $_clearField(2);\n}\n\nclass SearchTopicItem extends $pb.GeneratedMessage {\n  factory SearchTopicItem({\n    $fixnum.Int64? topicId,\n    $core.String? topicName,\n    $core.String? desc,\n    $core.String? url,\n    $core.bool? isActivity,\n    $core.String? tagIcon,\n    $core.String? descLong,\n    $core.String? cover,\n    $core.String? tagText,\n  }) {\n    final result = create();\n    if (topicId != null) result.topicId = topicId;\n    if (topicName != null) result.topicName = topicName;\n    if (desc != null) result.desc = desc;\n    if (url != null) result.url = url;\n    if (isActivity != null) result.isActivity = isActivity;\n    if (tagIcon != null) result.tagIcon = tagIcon;\n    if (descLong != null) result.descLong = descLong;\n    if (cover != null) result.cover = cover;\n    if (tagText != null) result.tagText = tagText;\n    return result;\n  }\n\n  SearchTopicItem._();\n\n  factory SearchTopicItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SearchTopicItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SearchTopicItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'topicId')\n    ..aOS(2, _omitFieldNames ? '' : 'topicName')\n    ..aOS(3, _omitFieldNames ? '' : 'desc')\n    ..aOS(4, _omitFieldNames ? '' : 'url')\n    ..aOB(5, _omitFieldNames ? '' : 'isActivity')\n    ..aOS(6, _omitFieldNames ? '' : 'tagIcon')\n    ..aOS(7, _omitFieldNames ? '' : 'descLong')\n    ..aOS(8, _omitFieldNames ? '' : 'cover')\n    ..aOS(9, _omitFieldNames ? '' : 'tagText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchTopicItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchTopicItem copyWith(void Function(SearchTopicItem) updates) =>\n      super.copyWith((message) => updates(message as SearchTopicItem))\n          as SearchTopicItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SearchTopicItem create() => SearchTopicItem._();\n  @$core.override\n  SearchTopicItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SearchTopicItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SearchTopicItem>(create);\n  static SearchTopicItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get topicId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set topicId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTopicId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTopicId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get topicName => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set topicName($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTopicName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTopicName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get desc => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set desc($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDesc() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDesc() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get url => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set url($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUrl() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUrl() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.bool get isActivity => $_getBF(4);\n  @$pb.TagNumber(5)\n  set isActivity($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasIsActivity() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearIsActivity() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get tagIcon => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set tagIcon($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasTagIcon() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearTagIcon() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get descLong => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set descLong($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasDescLong() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearDescLong() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get cover => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set cover($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasCover() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearCover() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get tagText => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set tagText($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasTagText() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearTagText() => $_clearField(9);\n}\n\nclass SectionNoteNavigationBar extends $pb.GeneratedMessage {\n  factory SectionNoteNavigationBar({\n    $core.String? title,\n    $core.String? rightIcon,\n    $core.String? jumpUrl,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (rightIcon != null) result.rightIcon = rightIcon;\n    if (jumpUrl != null) result.jumpUrl = jumpUrl;\n    return result;\n  }\n\n  SectionNoteNavigationBar._();\n\n  factory SectionNoteNavigationBar.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SectionNoteNavigationBar.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SectionNoteNavigationBar',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'rightIcon')\n    ..aOS(3, _omitFieldNames ? '' : 'jumpUrl')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SectionNoteNavigationBar clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SectionNoteNavigationBar copyWith(\n          void Function(SectionNoteNavigationBar) updates) =>\n      super.copyWith((message) => updates(message as SectionNoteNavigationBar))\n          as SectionNoteNavigationBar;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SectionNoteNavigationBar create() => SectionNoteNavigationBar._();\n  @$core.override\n  SectionNoteNavigationBar createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SectionNoteNavigationBar getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SectionNoteNavigationBar>(create);\n  static SectionNoteNavigationBar? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get rightIcon => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set rightIcon($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasRightIcon() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRightIcon() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get jumpUrl => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set jumpUrl($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasJumpUrl() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearJumpUrl() => $_clearField(3);\n}\n\nclass SectionOpusCollection extends $pb.GeneratedMessage {\n  factory SectionOpusCollection({\n    $core.String? title,\n    $core.Iterable<OpusCollectionWithCover>? allCollections,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (allCollections != null) result.allCollections.addAll(allCollections);\n    return result;\n  }\n\n  SectionOpusCollection._();\n\n  factory SectionOpusCollection.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SectionOpusCollection.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SectionOpusCollection',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..pPM<OpusCollectionWithCover>(2, _omitFieldNames ? '' : 'allCollections',\n        subBuilder: OpusCollectionWithCover.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SectionOpusCollection clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SectionOpusCollection copyWith(\n          void Function(SectionOpusCollection) updates) =>\n      super.copyWith((message) => updates(message as SectionOpusCollection))\n          as SectionOpusCollection;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SectionOpusCollection create() => SectionOpusCollection._();\n  @$core.override\n  SectionOpusCollection createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SectionOpusCollection getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SectionOpusCollection>(create);\n  static SectionOpusCollection? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<OpusCollectionWithCover> get allCollections => $_getList(1);\n}\n\nclass SelectedClassificationAndSortType extends $pb.GeneratedMessage {\n  factory SelectedClassificationAndSortType({\n    $core.String? chosenClassificationType,\n    $core.String? chosenSortType,\n  }) {\n    final result = create();\n    if (chosenClassificationType != null)\n      result.chosenClassificationType = chosenClassificationType;\n    if (chosenSortType != null) result.chosenSortType = chosenSortType;\n    return result;\n  }\n\n  SelectedClassificationAndSortType._();\n\n  factory SelectedClassificationAndSortType.fromBuffer(\n          $core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SelectedClassificationAndSortType.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SelectedClassificationAndSortType',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'chosenClassificationType')\n    ..aOS(2, _omitFieldNames ? '' : 'chosenSortType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SelectedClassificationAndSortType clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SelectedClassificationAndSortType copyWith(\n          void Function(SelectedClassificationAndSortType) updates) =>\n      super.copyWith((message) =>\n              updates(message as SelectedClassificationAndSortType))\n          as SelectedClassificationAndSortType;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SelectedClassificationAndSortType create() =>\n      SelectedClassificationAndSortType._();\n  @$core.override\n  SelectedClassificationAndSortType createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SelectedClassificationAndSortType getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SelectedClassificationAndSortType>(\n          create);\n  static SelectedClassificationAndSortType? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get chosenClassificationType => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set chosenClassificationType($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasChosenClassificationType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearChosenClassificationType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get chosenSortType => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set chosenSortType($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasChosenSortType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearChosenSortType() => $_clearField(2);\n}\n\nclass SetDecisionReq extends $pb.GeneratedMessage {\n  factory SetDecisionReq({\n    $core.int? result,\n    CampusReqFromType? fromType,\n  }) {\n    final result$ = create();\n    if (result != null) result$.result = result;\n    if (fromType != null) result$.fromType = fromType;\n    return result$;\n  }\n\n  SetDecisionReq._();\n\n  factory SetDecisionReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SetDecisionReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SetDecisionReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'result')\n    ..aE<CampusReqFromType>(2, _omitFieldNames ? '' : 'fromType',\n        enumValues: CampusReqFromType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SetDecisionReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SetDecisionReq copyWith(void Function(SetDecisionReq) updates) =>\n      super.copyWith((message) => updates(message as SetDecisionReq))\n          as SetDecisionReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SetDecisionReq create() => SetDecisionReq._();\n  @$core.override\n  SetDecisionReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SetDecisionReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SetDecisionReq>(create);\n  static SetDecisionReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get result => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set result($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasResult() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearResult() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  CampusReqFromType get fromType => $_getN(1);\n  @$pb.TagNumber(2)\n  set fromType(CampusReqFromType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFromType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFromType() => $_clearField(2);\n}\n\nclass SetRecentCampusReq extends $pb.GeneratedMessage {\n  factory SetRecentCampusReq({\n    $fixnum.Int64? campusId,\n    $core.String? campusName,\n    CampusReqFromType? fromType,\n  }) {\n    final result = create();\n    if (campusId != null) result.campusId = campusId;\n    if (campusName != null) result.campusName = campusName;\n    if (fromType != null) result.fromType = fromType;\n    return result;\n  }\n\n  SetRecentCampusReq._();\n\n  factory SetRecentCampusReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SetRecentCampusReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SetRecentCampusReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'campusId')\n    ..aOS(2, _omitFieldNames ? '' : 'campusName')\n    ..aE<CampusReqFromType>(3, _omitFieldNames ? '' : 'fromType',\n        enumValues: CampusReqFromType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SetRecentCampusReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SetRecentCampusReq copyWith(void Function(SetRecentCampusReq) updates) =>\n      super.copyWith((message) => updates(message as SetRecentCampusReq))\n          as SetRecentCampusReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SetRecentCampusReq create() => SetRecentCampusReq._();\n  @$core.override\n  SetRecentCampusReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SetRecentCampusReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SetRecentCampusReq>(create);\n  static SetRecentCampusReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get campusId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set campusId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCampusId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCampusId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get campusName => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set campusName($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCampusName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCampusName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  CampusReqFromType get fromType => $_getN(2);\n  @$pb.TagNumber(3)\n  set fromType(CampusReqFromType value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFromType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFromType() => $_clearField(3);\n}\n\nclass ShareChannel extends $pb.GeneratedMessage {\n  factory ShareChannel({\n    $core.String? name,\n    $core.String? image,\n    $core.String? channel,\n    ShareReserve? reserve,\n  }) {\n    final result = create();\n    if (name != null) result.name = name;\n    if (image != null) result.image = image;\n    if (channel != null) result.channel = channel;\n    if (reserve != null) result.reserve = reserve;\n    return result;\n  }\n\n  ShareChannel._();\n\n  factory ShareChannel.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ShareChannel.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ShareChannel',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'name')\n    ..aOS(2, _omitFieldNames ? '' : 'image')\n    ..aOS(3, _omitFieldNames ? '' : 'channel')\n    ..aOM<ShareReserve>(4, _omitFieldNames ? '' : 'reserve',\n        subBuilder: ShareReserve.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareChannel clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareChannel copyWith(void Function(ShareChannel) updates) =>\n      super.copyWith((message) => updates(message as ShareChannel))\n          as ShareChannel;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ShareChannel create() => ShareChannel._();\n  @$core.override\n  ShareChannel createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ShareChannel getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ShareChannel>(create);\n  static ShareChannel? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get name => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set name($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasName() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearName() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get image => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set image($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasImage() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearImage() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get channel => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set channel($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasChannel() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearChannel() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  ShareReserve get reserve => $_getN(3);\n  @$pb.TagNumber(4)\n  set reserve(ShareReserve value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasReserve() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearReserve() => $_clearField(4);\n  @$pb.TagNumber(4)\n  ShareReserve ensureReserve() => $_ensure(3);\n}\n\nclass ShareReserve extends $pb.GeneratedMessage {\n  factory ShareReserve({\n    $core.String? title,\n    $core.String? desc,\n    $core.String? qrCodeIcon,\n    $core.String? qrCodeText,\n    $core.String? qrCodeUrl,\n    AdditionUserInfo? userInfo,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (desc != null) result.desc = desc;\n    if (qrCodeIcon != null) result.qrCodeIcon = qrCodeIcon;\n    if (qrCodeText != null) result.qrCodeText = qrCodeText;\n    if (qrCodeUrl != null) result.qrCodeUrl = qrCodeUrl;\n    if (userInfo != null) result.userInfo = userInfo;\n    return result;\n  }\n\n  ShareReserve._();\n\n  factory ShareReserve.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ShareReserve.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ShareReserve',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'desc')\n    ..aOS(3, _omitFieldNames ? '' : 'qrCodeIcon')\n    ..aOS(4, _omitFieldNames ? '' : 'qrCodeText')\n    ..aOS(5, _omitFieldNames ? '' : 'qrCodeUrl')\n    ..aOM<AdditionUserInfo>(6, _omitFieldNames ? '' : 'userInfo',\n        subBuilder: AdditionUserInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareReserve clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareReserve copyWith(void Function(ShareReserve) updates) =>\n      super.copyWith((message) => updates(message as ShareReserve))\n          as ShareReserve;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ShareReserve create() => ShareReserve._();\n  @$core.override\n  ShareReserve createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ShareReserve getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ShareReserve>(create);\n  static ShareReserve? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get desc => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set desc($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDesc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDesc() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get qrCodeIcon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set qrCodeIcon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasQrCodeIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearQrCodeIcon() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get qrCodeText => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set qrCodeText($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasQrCodeText() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearQrCodeText() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get qrCodeUrl => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set qrCodeUrl($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasQrCodeUrl() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearQrCodeUrl() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  AdditionUserInfo get userInfo => $_getN(5);\n  @$pb.TagNumber(6)\n  set userInfo(AdditionUserInfo value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasUserInfo() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearUserInfo() => $_clearField(6);\n  @$pb.TagNumber(6)\n  AdditionUserInfo ensureUserInfo() => $_ensure(5);\n}\n\nclass SignResourcesReq extends $pb.GeneratedMessage {\n  factory SignResourcesReq({\n    $core.Iterable<ProtectedStaticResource>? toBeSignedRes,\n  }) {\n    final result = create();\n    if (toBeSignedRes != null) result.toBeSignedRes.addAll(toBeSignedRes);\n    return result;\n  }\n\n  SignResourcesReq._();\n\n  factory SignResourcesReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SignResourcesReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SignResourcesReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<ProtectedStaticResource>(1, _omitFieldNames ? '' : 'toBeSignedRes',\n        subBuilder: ProtectedStaticResource.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SignResourcesReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SignResourcesReq copyWith(void Function(SignResourcesReq) updates) =>\n      super.copyWith((message) => updates(message as SignResourcesReq))\n          as SignResourcesReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SignResourcesReq create() => SignResourcesReq._();\n  @$core.override\n  SignResourcesReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SignResourcesReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SignResourcesReq>(create);\n  static SignResourcesReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<ProtectedStaticResource> get toBeSignedRes => $_getList(0);\n}\n\nclass SignResourcesResp extends $pb.GeneratedMessage {\n  factory SignResourcesResp({\n    $core.Iterable<SignedStaticResource>? signedRes,\n  }) {\n    final result = create();\n    if (signedRes != null) result.signedRes.addAll(signedRes);\n    return result;\n  }\n\n  SignResourcesResp._();\n\n  factory SignResourcesResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SignResourcesResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SignResourcesResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<SignedStaticResource>(1, _omitFieldNames ? '' : 'signedRes',\n        subBuilder: SignedStaticResource.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SignResourcesResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SignResourcesResp copyWith(void Function(SignResourcesResp) updates) =>\n      super.copyWith((message) => updates(message as SignResourcesResp))\n          as SignResourcesResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SignResourcesResp create() => SignResourcesResp._();\n  @$core.override\n  SignResourcesResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SignResourcesResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SignResourcesResp>(create);\n  static SignResourcesResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<SignedStaticResource> get signedRes => $_getList(0);\n}\n\nclass SignedStaticResource extends $pb.GeneratedMessage {\n  factory SignedStaticResource({\n    $core.String? signedResUrl,\n    $core.bool? isSucceed,\n  }) {\n    final result = create();\n    if (signedResUrl != null) result.signedResUrl = signedResUrl;\n    if (isSucceed != null) result.isSucceed = isSucceed;\n    return result;\n  }\n\n  SignedStaticResource._();\n\n  factory SignedStaticResource.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SignedStaticResource.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SignedStaticResource',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'signedResUrl')\n    ..aOB(2, _omitFieldNames ? '' : 'isSucceed')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SignedStaticResource clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SignedStaticResource copyWith(void Function(SignedStaticResource) updates) =>\n      super.copyWith((message) => updates(message as SignedStaticResource))\n          as SignedStaticResource;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SignedStaticResource create() => SignedStaticResource._();\n  @$core.override\n  SignedStaticResource createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SignedStaticResource getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SignedStaticResource>(create);\n  static SignedStaticResource? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get signedResUrl => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set signedResUrl($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSignedResUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSignedResUrl() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get isSucceed => $_getBF(1);\n  @$pb.TagNumber(2)\n  set isSucceed($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIsSucceed() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIsSucceed() => $_clearField(2);\n}\n\nclass SortType extends $pb.GeneratedMessage {\n  factory SortType({\n    $core.int? sortType,\n    $core.String? sortTypeName,\n  }) {\n    final result = create();\n    if (sortType != null) result.sortType = sortType;\n    if (sortTypeName != null) result.sortTypeName = sortTypeName;\n    return result;\n  }\n\n  SortType._();\n\n  factory SortType.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SortType.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SortType',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'sortType')\n    ..aOS(2, _omitFieldNames ? '' : 'sortTypeName')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SortType clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SortType copyWith(void Function(SortType) updates) =>\n      super.copyWith((message) => updates(message as SortType)) as SortType;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SortType create() => SortType._();\n  @$core.override\n  SortType createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SortType getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<SortType>(create);\n  static SortType? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get sortType => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set sortType($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSortType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSortType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get sortTypeName => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set sortTypeName($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSortTypeName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSortTypeName() => $_clearField(2);\n}\n\nclass StoryArchive extends $pb.GeneratedMessage {\n  factory StoryArchive({\n    $core.String? cover,\n    $fixnum.Int64? aid,\n    $core.String? uri,\n    Dimension? dimension,\n  }) {\n    final result = create();\n    if (cover != null) result.cover = cover;\n    if (aid != null) result.aid = aid;\n    if (uri != null) result.uri = uri;\n    if (dimension != null) result.dimension = dimension;\n    return result;\n  }\n\n  StoryArchive._();\n\n  factory StoryArchive.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory StoryArchive.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'StoryArchive',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'cover')\n    ..aInt64(2, _omitFieldNames ? '' : 'aid')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..aOM<Dimension>(4, _omitFieldNames ? '' : 'dimension',\n        subBuilder: Dimension.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StoryArchive clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StoryArchive copyWith(void Function(StoryArchive) updates) =>\n      super.copyWith((message) => updates(message as StoryArchive))\n          as StoryArchive;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static StoryArchive create() => StoryArchive._();\n  @$core.override\n  StoryArchive createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static StoryArchive getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<StoryArchive>(create);\n  static StoryArchive? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get cover => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set cover($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCover() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCover() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get aid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set aid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  Dimension get dimension => $_getN(3);\n  @$pb.TagNumber(4)\n  set dimension(Dimension value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDimension() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDimension() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Dimension ensureDimension() => $_ensure(3);\n}\n\nenum StoryItem_RcmdItem { storyArchive, notSet }\n\nclass StoryItem extends $pb.GeneratedMessage {\n  factory StoryItem({\n    UserInfo? author,\n    $core.String? desc,\n    $fixnum.Int64? status,\n    RcmdType? type,\n    StoryArchive? storyArchive,\n  }) {\n    final result = create();\n    if (author != null) result.author = author;\n    if (desc != null) result.desc = desc;\n    if (status != null) result.status = status;\n    if (type != null) result.type = type;\n    if (storyArchive != null) result.storyArchive = storyArchive;\n    return result;\n  }\n\n  StoryItem._();\n\n  factory StoryItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory StoryItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, StoryItem_RcmdItem>\n      _StoryItem_RcmdItemByTag = {\n    5: StoryItem_RcmdItem.storyArchive,\n    0: StoryItem_RcmdItem.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'StoryItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..oo(0, [5])\n    ..aOM<UserInfo>(1, _omitFieldNames ? '' : 'author',\n        subBuilder: UserInfo.create)\n    ..aOS(2, _omitFieldNames ? '' : 'desc')\n    ..aInt64(3, _omitFieldNames ? '' : 'status')\n    ..aE<RcmdType>(4, _omitFieldNames ? '' : 'type',\n        enumValues: RcmdType.values)\n    ..aOM<StoryArchive>(5, _omitFieldNames ? '' : 'storyArchive',\n        subBuilder: StoryArchive.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StoryItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StoryItem copyWith(void Function(StoryItem) updates) =>\n      super.copyWith((message) => updates(message as StoryItem)) as StoryItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static StoryItem create() => StoryItem._();\n  @$core.override\n  StoryItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static StoryItem getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<StoryItem>(create);\n  static StoryItem? _defaultInstance;\n\n  @$pb.TagNumber(5)\n  StoryItem_RcmdItem whichRcmdItem() =>\n      _StoryItem_RcmdItemByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(5)\n  void clearRcmdItem() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  UserInfo get author => $_getN(0);\n  @$pb.TagNumber(1)\n  set author(UserInfo value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAuthor() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAuthor() => $_clearField(1);\n  @$pb.TagNumber(1)\n  UserInfo ensureAuthor() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get desc => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set desc($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDesc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDesc() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get status => $_getI64(2);\n  @$pb.TagNumber(3)\n  set status($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasStatus() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearStatus() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  RcmdType get type => $_getN(3);\n  @$pb.TagNumber(4)\n  set type(RcmdType value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearType() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  StoryArchive get storyArchive => $_getN(4);\n  @$pb.TagNumber(5)\n  set storyArchive(StoryArchive value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasStoryArchive() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearStoryArchive() => $_clearField(5);\n  @$pb.TagNumber(5)\n  StoryArchive ensureStoryArchive() => $_ensure(4);\n}\n\nclass SubscribeButton extends $pb.GeneratedMessage {\n  factory SubscribeButton({\n    $core.String? subscriptionIdentifier,\n    $core.bool? isSubscribed,\n    ButtonWithSubscribeParam? subscribedStyle,\n    ButtonWithSubscribeParam? notSubscribedStyle,\n  }) {\n    final result = create();\n    if (subscriptionIdentifier != null)\n      result.subscriptionIdentifier = subscriptionIdentifier;\n    if (isSubscribed != null) result.isSubscribed = isSubscribed;\n    if (subscribedStyle != null) result.subscribedStyle = subscribedStyle;\n    if (notSubscribedStyle != null)\n      result.notSubscribedStyle = notSubscribedStyle;\n    return result;\n  }\n\n  SubscribeButton._();\n\n  factory SubscribeButton.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SubscribeButton.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SubscribeButton',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'subscriptionIdentifier')\n    ..aOB(2, _omitFieldNames ? '' : 'isSubscribed')\n    ..aOM<ButtonWithSubscribeParam>(3, _omitFieldNames ? '' : 'subscribedStyle',\n        subBuilder: ButtonWithSubscribeParam.create)\n    ..aOM<ButtonWithSubscribeParam>(\n        4, _omitFieldNames ? '' : 'notSubscribedStyle',\n        subBuilder: ButtonWithSubscribeParam.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SubscribeButton clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SubscribeButton copyWith(void Function(SubscribeButton) updates) =>\n      super.copyWith((message) => updates(message as SubscribeButton))\n          as SubscribeButton;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SubscribeButton create() => SubscribeButton._();\n  @$core.override\n  SubscribeButton createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SubscribeButton getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SubscribeButton>(create);\n  static SubscribeButton? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get subscriptionIdentifier => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set subscriptionIdentifier($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSubscriptionIdentifier() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSubscriptionIdentifier() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get isSubscribed => $_getBF(1);\n  @$pb.TagNumber(2)\n  set isSubscribed($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIsSubscribed() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIsSubscribed() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  ButtonWithSubscribeParam get subscribedStyle => $_getN(2);\n  @$pb.TagNumber(3)\n  set subscribedStyle(ButtonWithSubscribeParam value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSubscribedStyle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSubscribedStyle() => $_clearField(3);\n  @$pb.TagNumber(3)\n  ButtonWithSubscribeParam ensureSubscribedStyle() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  ButtonWithSubscribeParam get notSubscribedStyle => $_getN(3);\n  @$pb.TagNumber(4)\n  set notSubscribedStyle(ButtonWithSubscribeParam value) =>\n      $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasNotSubscribedStyle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearNotSubscribedStyle() => $_clearField(4);\n  @$pb.TagNumber(4)\n  ButtonWithSubscribeParam ensureNotSubscribedStyle() => $_ensure(3);\n}\n\nclass SubscribeCampusReq extends $pb.GeneratedMessage {\n  factory SubscribeCampusReq({\n    $fixnum.Int64? campusId,\n    $core.String? campusName,\n    CampusReqFromType? fromType,\n  }) {\n    final result = create();\n    if (campusId != null) result.campusId = campusId;\n    if (campusName != null) result.campusName = campusName;\n    if (fromType != null) result.fromType = fromType;\n    return result;\n  }\n\n  SubscribeCampusReq._();\n\n  factory SubscribeCampusReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SubscribeCampusReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SubscribeCampusReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'campusId')\n    ..aOS(2, _omitFieldNames ? '' : 'campusName')\n    ..aE<CampusReqFromType>(3, _omitFieldNames ? '' : 'fromType',\n        enumValues: CampusReqFromType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SubscribeCampusReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SubscribeCampusReq copyWith(void Function(SubscribeCampusReq) updates) =>\n      super.copyWith((message) => updates(message as SubscribeCampusReq))\n          as SubscribeCampusReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SubscribeCampusReq create() => SubscribeCampusReq._();\n  @$core.override\n  SubscribeCampusReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SubscribeCampusReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SubscribeCampusReq>(create);\n  static SubscribeCampusReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get campusId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set campusId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCampusId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCampusId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get campusName => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set campusName($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCampusName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCampusName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  CampusReqFromType get fromType => $_getN(2);\n  @$pb.TagNumber(3)\n  set fromType(CampusReqFromType value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFromType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFromType() => $_clearField(3);\n}\n\nclass SubscriptionClickReq extends $pb.GeneratedMessage {\n  factory SubscriptionClickReq({\n    $core.String? subscribeParam,\n  }) {\n    final result = create();\n    if (subscribeParam != null) result.subscribeParam = subscribeParam;\n    return result;\n  }\n\n  SubscriptionClickReq._();\n\n  factory SubscriptionClickReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SubscriptionClickReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SubscriptionClickReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'subscribeParam')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SubscriptionClickReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SubscriptionClickReq copyWith(void Function(SubscriptionClickReq) updates) =>\n      super.copyWith((message) => updates(message as SubscriptionClickReq))\n          as SubscriptionClickReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SubscriptionClickReq create() => SubscriptionClickReq._();\n  @$core.override\n  SubscriptionClickReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SubscriptionClickReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SubscriptionClickReq>(create);\n  static SubscriptionClickReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get subscribeParam => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set subscribeParam($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSubscribeParam() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSubscribeParam() => $_clearField(1);\n}\n\nclass SubscriptionClickResp extends $pb.GeneratedMessage {\n  factory SubscriptionClickResp({\n    $core.String? toast,\n  }) {\n    final result = create();\n    if (toast != null) result.toast = toast;\n    return result;\n  }\n\n  SubscriptionClickResp._();\n\n  factory SubscriptionClickResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SubscriptionClickResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SubscriptionClickResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'toast')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SubscriptionClickResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SubscriptionClickResp copyWith(\n          void Function(SubscriptionClickResp) updates) =>\n      super.copyWith((message) => updates(message as SubscriptionClickResp))\n          as SubscriptionClickResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SubscriptionClickResp create() => SubscriptionClickResp._();\n  @$core.override\n  SubscriptionClickResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SubscriptionClickResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SubscriptionClickResp>(create);\n  static SubscriptionClickResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get toast => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set toast($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasToast() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearToast() => $_clearField(1);\n}\n\nenum TextNode_Text { word, emote, link, formula, notSet }\n\nclass TextNode extends $pb.GeneratedMessage {\n  factory TextNode({\n    TextNode_TextNodeType? nodeType,\n    $core.String? rawText,\n    WordNode? word,\n    EmoteNode? emote,\n    LinkNode? link,\n    FormulaNode? formula,\n  }) {\n    final result = create();\n    if (nodeType != null) result.nodeType = nodeType;\n    if (rawText != null) result.rawText = rawText;\n    if (word != null) result.word = word;\n    if (emote != null) result.emote = emote;\n    if (link != null) result.link = link;\n    if (formula != null) result.formula = formula;\n    return result;\n  }\n\n  TextNode._();\n\n  factory TextNode.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TextNode.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, TextNode_Text> _TextNode_TextByTag = {\n    3: TextNode_Text.word,\n    4: TextNode_Text.emote,\n    5: TextNode_Text.link,\n    6: TextNode_Text.formula,\n    0: TextNode_Text.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TextNode',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..oo(0, [3, 4, 5, 6])\n    ..aE<TextNode_TextNodeType>(1, _omitFieldNames ? '' : 'nodeType',\n        enumValues: TextNode_TextNodeType.values)\n    ..aOS(2, _omitFieldNames ? '' : 'rawText')\n    ..aOM<WordNode>(3, _omitFieldNames ? '' : 'word',\n        subBuilder: WordNode.create)\n    ..aOM<EmoteNode>(4, _omitFieldNames ? '' : 'emote',\n        subBuilder: EmoteNode.create)\n    ..aOM<LinkNode>(5, _omitFieldNames ? '' : 'link',\n        subBuilder: LinkNode.create)\n    ..aOM<FormulaNode>(6, _omitFieldNames ? '' : 'formula',\n        subBuilder: FormulaNode.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TextNode clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TextNode copyWith(void Function(TextNode) updates) =>\n      super.copyWith((message) => updates(message as TextNode)) as TextNode;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TextNode create() => TextNode._();\n  @$core.override\n  TextNode createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TextNode getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TextNode>(create);\n  static TextNode? _defaultInstance;\n\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  @$pb.TagNumber(6)\n  TextNode_Text whichText() => _TextNode_TextByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  @$pb.TagNumber(6)\n  void clearText() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  TextNode_TextNodeType get nodeType => $_getN(0);\n  @$pb.TagNumber(1)\n  set nodeType(TextNode_TextNodeType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasNodeType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearNodeType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get rawText => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set rawText($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasRawText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRawText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  WordNode get word => $_getN(2);\n  @$pb.TagNumber(3)\n  set word(WordNode value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasWord() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearWord() => $_clearField(3);\n  @$pb.TagNumber(3)\n  WordNode ensureWord() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  EmoteNode get emote => $_getN(3);\n  @$pb.TagNumber(4)\n  set emote(EmoteNode value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasEmote() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearEmote() => $_clearField(4);\n  @$pb.TagNumber(4)\n  EmoteNode ensureEmote() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  LinkNode get link => $_getN(4);\n  @$pb.TagNumber(5)\n  set link(LinkNode value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasLink() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearLink() => $_clearField(5);\n  @$pb.TagNumber(5)\n  LinkNode ensureLink() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  FormulaNode get formula => $_getN(5);\n  @$pb.TagNumber(6)\n  set formula(FormulaNode value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasFormula() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearFormula() => $_clearField(6);\n  @$pb.TagNumber(6)\n  FormulaNode ensureFormula() => $_ensure(5);\n}\n\nclass TextParagraph extends $pb.GeneratedMessage {\n  factory TextParagraph({\n    $core.Iterable<TextNode>? nodes,\n  }) {\n    final result = create();\n    if (nodes != null) result.nodes.addAll(nodes);\n    return result;\n  }\n\n  TextParagraph._();\n\n  factory TextParagraph.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TextParagraph.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TextParagraph',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<TextNode>(1, _omitFieldNames ? '' : 'nodes',\n        subBuilder: TextNode.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TextParagraph clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TextParagraph copyWith(void Function(TextParagraph) updates) =>\n      super.copyWith((message) => updates(message as TextParagraph))\n          as TextParagraph;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TextParagraph create() => TextParagraph._();\n  @$core.override\n  TextParagraph createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TextParagraph getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<TextParagraph>(create);\n  static TextParagraph? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<TextNode> get nodes => $_getList(0);\n}\n\nclass TextWithPriority extends $pb.GeneratedMessage {\n  factory TextWithPriority({\n    $core.String? text,\n    $fixnum.Int64? priority,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (priority != null) result.priority = priority;\n    return result;\n  }\n\n  TextWithPriority._();\n\n  factory TextWithPriority.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TextWithPriority.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TextWithPriority',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aInt64(2, _omitFieldNames ? '' : 'priority')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TextWithPriority clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TextWithPriority copyWith(void Function(TextWithPriority) updates) =>\n      super.copyWith((message) => updates(message as TextWithPriority))\n          as TextWithPriority;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TextWithPriority create() => TextWithPriority._();\n  @$core.override\n  TextWithPriority createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TextWithPriority getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<TextWithPriority>(create);\n  static TextWithPriority? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get priority => $_getI64(1);\n  @$pb.TagNumber(2)\n  set priority($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPriority() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPriority() => $_clearField(2);\n}\n\nclass ThreePointAttention extends $pb.GeneratedMessage {\n  factory ThreePointAttention({\n    $core.String? attentionIcon,\n    $core.String? attentionText,\n    $core.String? notAttentionIcon,\n    $core.String? notAttentionText,\n    ThreePointAttentionStatus? status,\n    $core.String? subscribeOid,\n  }) {\n    final result = create();\n    if (attentionIcon != null) result.attentionIcon = attentionIcon;\n    if (attentionText != null) result.attentionText = attentionText;\n    if (notAttentionIcon != null) result.notAttentionIcon = notAttentionIcon;\n    if (notAttentionText != null) result.notAttentionText = notAttentionText;\n    if (status != null) result.status = status;\n    if (subscribeOid != null) result.subscribeOid = subscribeOid;\n    return result;\n  }\n\n  ThreePointAttention._();\n\n  factory ThreePointAttention.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreePointAttention.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreePointAttention',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'attentionIcon')\n    ..aOS(2, _omitFieldNames ? '' : 'attentionText')\n    ..aOS(3, _omitFieldNames ? '' : 'notAttentionIcon')\n    ..aOS(4, _omitFieldNames ? '' : 'notAttentionText')\n    ..aE<ThreePointAttentionStatus>(5, _omitFieldNames ? '' : 'status',\n        enumValues: ThreePointAttentionStatus.values)\n    ..aOS(6, _omitFieldNames ? '' : 'subscribeOid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointAttention clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointAttention copyWith(void Function(ThreePointAttention) updates) =>\n      super.copyWith((message) => updates(message as ThreePointAttention))\n          as ThreePointAttention;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreePointAttention create() => ThreePointAttention._();\n  @$core.override\n  ThreePointAttention createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreePointAttention getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreePointAttention>(create);\n  static ThreePointAttention? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get attentionIcon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set attentionIcon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAttentionIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAttentionIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get attentionText => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set attentionText($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAttentionText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAttentionText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get notAttentionIcon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set notAttentionIcon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasNotAttentionIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearNotAttentionIcon() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get notAttentionText => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set notAttentionText($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasNotAttentionText() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearNotAttentionText() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  ThreePointAttentionStatus get status => $_getN(4);\n  @$pb.TagNumber(5)\n  set status(ThreePointAttentionStatus value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasStatus() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearStatus() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get subscribeOid => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set subscribeOid($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasSubscribeOid() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearSubscribeOid() => $_clearField(6);\n}\n\nclass ThreePointAutoPlay extends $pb.GeneratedMessage {\n  factory ThreePointAutoPlay({\n    $core.String? openIcon,\n    $core.String? openText,\n    $core.String? closeIcon,\n    $core.String? closeText,\n    $core.String? openTextV2,\n    $core.String? closeTextV2,\n    $core.String? onlyIcon,\n    $core.String? onlyText,\n    $core.String? openIconV2,\n    $core.String? closeIconV2,\n  }) {\n    final result = create();\n    if (openIcon != null) result.openIcon = openIcon;\n    if (openText != null) result.openText = openText;\n    if (closeIcon != null) result.closeIcon = closeIcon;\n    if (closeText != null) result.closeText = closeText;\n    if (openTextV2 != null) result.openTextV2 = openTextV2;\n    if (closeTextV2 != null) result.closeTextV2 = closeTextV2;\n    if (onlyIcon != null) result.onlyIcon = onlyIcon;\n    if (onlyText != null) result.onlyText = onlyText;\n    if (openIconV2 != null) result.openIconV2 = openIconV2;\n    if (closeIconV2 != null) result.closeIconV2 = closeIconV2;\n    return result;\n  }\n\n  ThreePointAutoPlay._();\n\n  factory ThreePointAutoPlay.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreePointAutoPlay.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreePointAutoPlay',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'openIcon')\n    ..aOS(2, _omitFieldNames ? '' : 'openText')\n    ..aOS(3, _omitFieldNames ? '' : 'closeIcon')\n    ..aOS(4, _omitFieldNames ? '' : 'closeText')\n    ..aOS(5, _omitFieldNames ? '' : 'openTextV2')\n    ..aOS(6, _omitFieldNames ? '' : 'closeTextV2')\n    ..aOS(7, _omitFieldNames ? '' : 'onlyIcon')\n    ..aOS(8, _omitFieldNames ? '' : 'onlyText')\n    ..aOS(9, _omitFieldNames ? '' : 'openIconV2')\n    ..aOS(10, _omitFieldNames ? '' : 'closeIconV2')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointAutoPlay clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointAutoPlay copyWith(void Function(ThreePointAutoPlay) updates) =>\n      super.copyWith((message) => updates(message as ThreePointAutoPlay))\n          as ThreePointAutoPlay;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreePointAutoPlay create() => ThreePointAutoPlay._();\n  @$core.override\n  ThreePointAutoPlay createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreePointAutoPlay getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreePointAutoPlay>(create);\n  static ThreePointAutoPlay? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get openIcon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set openIcon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOpenIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOpenIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get openText => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set openText($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOpenText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOpenText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get closeIcon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set closeIcon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCloseIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCloseIcon() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get closeText => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set closeText($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCloseText() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCloseText() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get openTextV2 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set openTextV2($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasOpenTextV2() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearOpenTextV2() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get closeTextV2 => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set closeTextV2($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCloseTextV2() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCloseTextV2() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get onlyIcon => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set onlyIcon($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasOnlyIcon() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearOnlyIcon() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get onlyText => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set onlyText($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasOnlyText() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearOnlyText() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get openIconV2 => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set openIconV2($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasOpenIconV2() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearOpenIconV2() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get closeIconV2 => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set closeIconV2($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasCloseIconV2() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearCloseIconV2() => $_clearField(10);\n}\n\nclass ThreePointComment extends $pb.GeneratedMessage {\n  factory ThreePointComment({\n    CommentDetail? upSelection,\n    CommentDetail? upClose,\n    $core.String? icon,\n    $core.String? title,\n  }) {\n    final result = create();\n    if (upSelection != null) result.upSelection = upSelection;\n    if (upClose != null) result.upClose = upClose;\n    if (icon != null) result.icon = icon;\n    if (title != null) result.title = title;\n    return result;\n  }\n\n  ThreePointComment._();\n\n  factory ThreePointComment.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreePointComment.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreePointComment',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<CommentDetail>(1, _omitFieldNames ? '' : 'upSelection',\n        subBuilder: CommentDetail.create)\n    ..aOM<CommentDetail>(2, _omitFieldNames ? '' : 'upClose',\n        subBuilder: CommentDetail.create)\n    ..aOS(3, _omitFieldNames ? '' : 'icon')\n    ..aOS(4, _omitFieldNames ? '' : 'title')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointComment clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointComment copyWith(void Function(ThreePointComment) updates) =>\n      super.copyWith((message) => updates(message as ThreePointComment))\n          as ThreePointComment;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreePointComment create() => ThreePointComment._();\n  @$core.override\n  ThreePointComment createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreePointComment getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreePointComment>(create);\n  static ThreePointComment? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  CommentDetail get upSelection => $_getN(0);\n  @$pb.TagNumber(1)\n  set upSelection(CommentDetail value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUpSelection() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUpSelection() => $_clearField(1);\n  @$pb.TagNumber(1)\n  CommentDetail ensureUpSelection() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  CommentDetail get upClose => $_getN(1);\n  @$pb.TagNumber(2)\n  set upClose(CommentDetail value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUpClose() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUpClose() => $_clearField(2);\n  @$pb.TagNumber(2)\n  CommentDetail ensureUpClose() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.String get icon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set icon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIcon() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get title => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set title($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTitle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTitle() => $_clearField(4);\n}\n\nclass ThreePointDefault extends $pb.GeneratedMessage {\n  factory ThreePointDefault({\n    $core.String? icon,\n    $core.String? title,\n    $core.String? uri,\n    $core.String? id,\n    ThreePointDefaultToast? toast,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (title != null) result.title = title;\n    if (uri != null) result.uri = uri;\n    if (id != null) result.id = id;\n    if (toast != null) result.toast = toast;\n    return result;\n  }\n\n  ThreePointDefault._();\n\n  factory ThreePointDefault.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreePointDefault.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreePointDefault',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..aOS(4, _omitFieldNames ? '' : 'id')\n    ..aOM<ThreePointDefaultToast>(5, _omitFieldNames ? '' : 'toast',\n        subBuilder: ThreePointDefaultToast.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointDefault clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointDefault copyWith(void Function(ThreePointDefault) updates) =>\n      super.copyWith((message) => updates(message as ThreePointDefault))\n          as ThreePointDefault;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreePointDefault create() => ThreePointDefault._();\n  @$core.override\n  ThreePointDefault createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreePointDefault getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreePointDefault>(create);\n  static ThreePointDefault? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get id => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set id($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasId() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearId() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  ThreePointDefaultToast get toast => $_getN(4);\n  @$pb.TagNumber(5)\n  set toast(ThreePointDefaultToast value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasToast() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearToast() => $_clearField(5);\n  @$pb.TagNumber(5)\n  ThreePointDefaultToast ensureToast() => $_ensure(4);\n}\n\nclass ThreePointDefaultToast extends $pb.GeneratedMessage {\n  factory ThreePointDefaultToast({\n    $core.String? title,\n    $core.String? desc,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (desc != null) result.desc = desc;\n    return result;\n  }\n\n  ThreePointDefaultToast._();\n\n  factory ThreePointDefaultToast.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreePointDefaultToast.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreePointDefaultToast',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'desc')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointDefaultToast clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointDefaultToast copyWith(\n          void Function(ThreePointDefaultToast) updates) =>\n      super.copyWith((message) => updates(message as ThreePointDefaultToast))\n          as ThreePointDefaultToast;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreePointDefaultToast create() => ThreePointDefaultToast._();\n  @$core.override\n  ThreePointDefaultToast createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreePointDefaultToast getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreePointDefaultToast>(create);\n  static ThreePointDefaultToast? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get desc => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set desc($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDesc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDesc() => $_clearField(2);\n}\n\nclass ThreePointDislike extends $pb.GeneratedMessage {\n  factory ThreePointDislike({\n    $core.String? icon,\n    $core.String? title,\n    $core.String? feedbackBizValue,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (title != null) result.title = title;\n    if (feedbackBizValue != null) result.feedbackBizValue = feedbackBizValue;\n    return result;\n  }\n\n  ThreePointDislike._();\n\n  factory ThreePointDislike.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreePointDislike.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreePointDislike',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'feedbackBizValue')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointDislike clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointDislike copyWith(void Function(ThreePointDislike) updates) =>\n      super.copyWith((message) => updates(message as ThreePointDislike))\n          as ThreePointDislike;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreePointDislike create() => ThreePointDislike._();\n  @$core.override\n  ThreePointDislike createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreePointDislike getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreePointDislike>(create);\n  static ThreePointDislike? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get feedbackBizValue => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set feedbackBizValue($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFeedbackBizValue() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFeedbackBizValue() => $_clearField(3);\n}\n\nclass ThreePointDynCoin extends $pb.GeneratedMessage {\n  factory ThreePointDynCoin({\n    $core.bool? hadCoin,\n    $fixnum.Int64? coinNum,\n    $core.String? coinBusiness,\n    $fixnum.Int64? oid,\n  }) {\n    final result = create();\n    if (hadCoin != null) result.hadCoin = hadCoin;\n    if (coinNum != null) result.coinNum = coinNum;\n    if (coinBusiness != null) result.coinBusiness = coinBusiness;\n    if (oid != null) result.oid = oid;\n    return result;\n  }\n\n  ThreePointDynCoin._();\n\n  factory ThreePointDynCoin.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreePointDynCoin.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreePointDynCoin',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'hadCoin')\n    ..aInt64(2, _omitFieldNames ? '' : 'coinNum')\n    ..aOS(3, _omitFieldNames ? '' : 'coinBusiness')\n    ..aInt64(4, _omitFieldNames ? '' : 'oid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointDynCoin clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointDynCoin copyWith(void Function(ThreePointDynCoin) updates) =>\n      super.copyWith((message) => updates(message as ThreePointDynCoin))\n          as ThreePointDynCoin;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreePointDynCoin create() => ThreePointDynCoin._();\n  @$core.override\n  ThreePointDynCoin createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreePointDynCoin getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreePointDynCoin>(create);\n  static ThreePointDynCoin? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get hadCoin => $_getBF(0);\n  @$pb.TagNumber(1)\n  set hadCoin($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasHadCoin() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearHadCoin() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get coinNum => $_getI64(1);\n  @$pb.TagNumber(2)\n  set coinNum($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCoinNum() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCoinNum() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get coinBusiness => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set coinBusiness($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCoinBusiness() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCoinBusiness() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get oid => $_getI64(3);\n  @$pb.TagNumber(4)\n  set oid($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasOid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearOid() => $_clearField(4);\n}\n\nclass ThreePointDynEdit extends $pb.GeneratedMessage {\n  factory ThreePointDynEdit({\n    $fixnum.Int64? dynId,\n    $fixnum.Int64? originId,\n    $core.bool? isOriginDeleted,\n    $core.String? url,\n  }) {\n    final result = create();\n    if (dynId != null) result.dynId = dynId;\n    if (originId != null) result.originId = originId;\n    if (isOriginDeleted != null) result.isOriginDeleted = isOriginDeleted;\n    if (url != null) result.url = url;\n    return result;\n  }\n\n  ThreePointDynEdit._();\n\n  factory ThreePointDynEdit.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreePointDynEdit.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreePointDynEdit',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'dynId')\n    ..aInt64(2, _omitFieldNames ? '' : 'originId')\n    ..aOB(3, _omitFieldNames ? '' : 'isOriginDeleted')\n    ..aOS(4, _omitFieldNames ? '' : 'url')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointDynEdit clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointDynEdit copyWith(void Function(ThreePointDynEdit) updates) =>\n      super.copyWith((message) => updates(message as ThreePointDynEdit))\n          as ThreePointDynEdit;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreePointDynEdit create() => ThreePointDynEdit._();\n  @$core.override\n  ThreePointDynEdit createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreePointDynEdit getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreePointDynEdit>(create);\n  static ThreePointDynEdit? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get dynId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set dynId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDynId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDynId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get originId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set originId($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOriginId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOriginId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get isOriginDeleted => $_getBF(2);\n  @$pb.TagNumber(3)\n  set isOriginDeleted($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIsOriginDeleted() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIsOriginDeleted() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get url => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set url($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUrl() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUrl() => $_clearField(4);\n}\n\nclass ThreePointFavorite extends $pb.GeneratedMessage {\n  factory ThreePointFavorite({\n    $core.String? icon,\n    $core.String? title,\n    $fixnum.Int64? id,\n    $core.bool? isFavourite,\n    $core.String? cancelIcon,\n    $core.String? cancelTitle,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (title != null) result.title = title;\n    if (id != null) result.id = id;\n    if (isFavourite != null) result.isFavourite = isFavourite;\n    if (cancelIcon != null) result.cancelIcon = cancelIcon;\n    if (cancelTitle != null) result.cancelTitle = cancelTitle;\n    return result;\n  }\n\n  ThreePointFavorite._();\n\n  factory ThreePointFavorite.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreePointFavorite.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreePointFavorite',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aInt64(3, _omitFieldNames ? '' : 'id')\n    ..aOB(4, _omitFieldNames ? '' : 'isFavourite')\n    ..aOS(5, _omitFieldNames ? '' : 'cancelIcon')\n    ..aOS(6, _omitFieldNames ? '' : 'cancelTitle')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointFavorite clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointFavorite copyWith(void Function(ThreePointFavorite) updates) =>\n      super.copyWith((message) => updates(message as ThreePointFavorite))\n          as ThreePointFavorite;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreePointFavorite create() => ThreePointFavorite._();\n  @$core.override\n  ThreePointFavorite createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreePointFavorite getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreePointFavorite>(create);\n  static ThreePointFavorite? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get id => $_getI64(2);\n  @$pb.TagNumber(3)\n  set id($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearId() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get isFavourite => $_getBF(3);\n  @$pb.TagNumber(4)\n  set isFavourite($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIsFavourite() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIsFavourite() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get cancelIcon => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set cancelIcon($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCancelIcon() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCancelIcon() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get cancelTitle => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set cancelTitle($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCancelTitle() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCancelTitle() => $_clearField(6);\n}\n\nclass ThreePointHide extends $pb.GeneratedMessage {\n  factory ThreePointHide({\n    $core.String? icon,\n    $core.String? title,\n    ThreePointHideInteractive? interactive,\n    $fixnum.Int64? blookFid,\n    $core.String? blookType,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (title != null) result.title = title;\n    if (interactive != null) result.interactive = interactive;\n    if (blookFid != null) result.blookFid = blookFid;\n    if (blookType != null) result.blookType = blookType;\n    return result;\n  }\n\n  ThreePointHide._();\n\n  factory ThreePointHide.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreePointHide.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreePointHide',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOM<ThreePointHideInteractive>(3, _omitFieldNames ? '' : 'interactive',\n        subBuilder: ThreePointHideInteractive.create)\n    ..aInt64(4, _omitFieldNames ? '' : 'blookFid')\n    ..aOS(5, _omitFieldNames ? '' : 'blookType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointHide clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointHide copyWith(void Function(ThreePointHide) updates) =>\n      super.copyWith((message) => updates(message as ThreePointHide))\n          as ThreePointHide;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreePointHide create() => ThreePointHide._();\n  @$core.override\n  ThreePointHide createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreePointHide getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreePointHide>(create);\n  static ThreePointHide? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  ThreePointHideInteractive get interactive => $_getN(2);\n  @$pb.TagNumber(3)\n  set interactive(ThreePointHideInteractive value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasInteractive() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearInteractive() => $_clearField(3);\n  @$pb.TagNumber(3)\n  ThreePointHideInteractive ensureInteractive() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get blookFid => $_getI64(3);\n  @$pb.TagNumber(4)\n  set blookFid($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBlookFid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBlookFid() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get blookType => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set blookType($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBlookType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBlookType() => $_clearField(5);\n}\n\nclass ThreePointHideInteractive extends $pb.GeneratedMessage {\n  factory ThreePointHideInteractive({\n    $core.String? title,\n    $core.String? confirm,\n    $core.String? cancel,\n    $core.String? toast,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (confirm != null) result.confirm = confirm;\n    if (cancel != null) result.cancel = cancel;\n    if (toast != null) result.toast = toast;\n    return result;\n  }\n\n  ThreePointHideInteractive._();\n\n  factory ThreePointHideInteractive.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreePointHideInteractive.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreePointHideInteractive',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'confirm')\n    ..aOS(3, _omitFieldNames ? '' : 'cancel')\n    ..aOS(4, _omitFieldNames ? '' : 'toast')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointHideInteractive clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointHideInteractive copyWith(\n          void Function(ThreePointHideInteractive) updates) =>\n      super.copyWith((message) => updates(message as ThreePointHideInteractive))\n          as ThreePointHideInteractive;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreePointHideInteractive create() => ThreePointHideInteractive._();\n  @$core.override\n  ThreePointHideInteractive createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreePointHideInteractive getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreePointHideInteractive>(create);\n  static ThreePointHideInteractive? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get confirm => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set confirm($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasConfirm() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearConfirm() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get cancel => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set cancel($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCancel() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCancel() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get toast => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set toast($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasToast() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearToast() => $_clearField(4);\n}\n\nenum ThreePointItem_Item {\n  default_2,\n  autoPlayer,\n  share,\n  attention,\n  wait,\n  dislike,\n  favorite,\n  top,\n  comment,\n  hide,\n  topicIrrelevant,\n  dynEdit,\n  coin,\n  visibilityChange,\n  topicTop,\n  notSet\n}\n\nclass ThreePointItem extends $pb.GeneratedMessage {\n  factory ThreePointItem({\n    ThreePointType? type,\n    ThreePointDefault? default_2,\n    ThreePointAutoPlay? autoPlayer,\n    ThreePointShare? share,\n    ThreePointAttention? attention,\n    ThreePointWait? wait,\n    ThreePointDislike? dislike,\n    ThreePointFavorite? favorite,\n    ThreePointTop? top,\n    ThreePointComment? comment,\n    ThreePointHide? hide,\n    ThreePointTopicIrrelevant? topicIrrelevant,\n    ThreePointDynEdit? dynEdit,\n    ThreePointDynCoin? coin,\n    ThreePointVisibilityChange? visibilityChange,\n    ThreePointTopicTop? topicTop,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (default_2 != null) result.default_2 = default_2;\n    if (autoPlayer != null) result.autoPlayer = autoPlayer;\n    if (share != null) result.share = share;\n    if (attention != null) result.attention = attention;\n    if (wait != null) result.wait = wait;\n    if (dislike != null) result.dislike = dislike;\n    if (favorite != null) result.favorite = favorite;\n    if (top != null) result.top = top;\n    if (comment != null) result.comment = comment;\n    if (hide != null) result.hide = hide;\n    if (topicIrrelevant != null) result.topicIrrelevant = topicIrrelevant;\n    if (dynEdit != null) result.dynEdit = dynEdit;\n    if (coin != null) result.coin = coin;\n    if (visibilityChange != null) result.visibilityChange = visibilityChange;\n    if (topicTop != null) result.topicTop = topicTop;\n    return result;\n  }\n\n  ThreePointItem._();\n\n  factory ThreePointItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreePointItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, ThreePointItem_Item>\n      _ThreePointItem_ItemByTag = {\n    2: ThreePointItem_Item.default_2,\n    3: ThreePointItem_Item.autoPlayer,\n    4: ThreePointItem_Item.share,\n    5: ThreePointItem_Item.attention,\n    6: ThreePointItem_Item.wait,\n    7: ThreePointItem_Item.dislike,\n    8: ThreePointItem_Item.favorite,\n    9: ThreePointItem_Item.top,\n    10: ThreePointItem_Item.comment,\n    11: ThreePointItem_Item.hide,\n    12: ThreePointItem_Item.topicIrrelevant,\n    13: ThreePointItem_Item.dynEdit,\n    14: ThreePointItem_Item.coin,\n    15: ThreePointItem_Item.visibilityChange,\n    16: ThreePointItem_Item.topicTop,\n    0: ThreePointItem_Item.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreePointItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..oo(0, [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16])\n    ..aE<ThreePointType>(1, _omitFieldNames ? '' : 'type',\n        enumValues: ThreePointType.values)\n    ..aOM<ThreePointDefault>(2, _omitFieldNames ? '' : 'default',\n        subBuilder: ThreePointDefault.create)\n    ..aOM<ThreePointAutoPlay>(3, _omitFieldNames ? '' : 'autoPlayer',\n        subBuilder: ThreePointAutoPlay.create)\n    ..aOM<ThreePointShare>(4, _omitFieldNames ? '' : 'share',\n        subBuilder: ThreePointShare.create)\n    ..aOM<ThreePointAttention>(5, _omitFieldNames ? '' : 'attention',\n        subBuilder: ThreePointAttention.create)\n    ..aOM<ThreePointWait>(6, _omitFieldNames ? '' : 'wait',\n        subBuilder: ThreePointWait.create)\n    ..aOM<ThreePointDislike>(7, _omitFieldNames ? '' : 'dislike',\n        subBuilder: ThreePointDislike.create)\n    ..aOM<ThreePointFavorite>(8, _omitFieldNames ? '' : 'favorite',\n        subBuilder: ThreePointFavorite.create)\n    ..aOM<ThreePointTop>(9, _omitFieldNames ? '' : 'top',\n        subBuilder: ThreePointTop.create)\n    ..aOM<ThreePointComment>(10, _omitFieldNames ? '' : 'comment',\n        subBuilder: ThreePointComment.create)\n    ..aOM<ThreePointHide>(11, _omitFieldNames ? '' : 'hide',\n        subBuilder: ThreePointHide.create)\n    ..aOM<ThreePointTopicIrrelevant>(\n        12, _omitFieldNames ? '' : 'topicIrrelevant',\n        subBuilder: ThreePointTopicIrrelevant.create)\n    ..aOM<ThreePointDynEdit>(13, _omitFieldNames ? '' : 'dynEdit',\n        subBuilder: ThreePointDynEdit.create)\n    ..aOM<ThreePointDynCoin>(14, _omitFieldNames ? '' : 'coin',\n        subBuilder: ThreePointDynCoin.create)\n    ..aOM<ThreePointVisibilityChange>(\n        15, _omitFieldNames ? '' : 'visibilityChange',\n        subBuilder: ThreePointVisibilityChange.create)\n    ..aOM<ThreePointTopicTop>(16, _omitFieldNames ? '' : 'topicTop',\n        subBuilder: ThreePointTopicTop.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointItem copyWith(void Function(ThreePointItem) updates) =>\n      super.copyWith((message) => updates(message as ThreePointItem))\n          as ThreePointItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreePointItem create() => ThreePointItem._();\n  @$core.override\n  ThreePointItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreePointItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreePointItem>(create);\n  static ThreePointItem? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(7)\n  @$pb.TagNumber(8)\n  @$pb.TagNumber(9)\n  @$pb.TagNumber(10)\n  @$pb.TagNumber(11)\n  @$pb.TagNumber(12)\n  @$pb.TagNumber(13)\n  @$pb.TagNumber(14)\n  @$pb.TagNumber(15)\n  @$pb.TagNumber(16)\n  ThreePointItem_Item whichItem() =>\n      _ThreePointItem_ItemByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(7)\n  @$pb.TagNumber(8)\n  @$pb.TagNumber(9)\n  @$pb.TagNumber(10)\n  @$pb.TagNumber(11)\n  @$pb.TagNumber(12)\n  @$pb.TagNumber(13)\n  @$pb.TagNumber(14)\n  @$pb.TagNumber(15)\n  @$pb.TagNumber(16)\n  void clearItem() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  ThreePointType get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(ThreePointType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  ThreePointDefault get default_2 => $_getN(1);\n  @$pb.TagNumber(2)\n  set default_2(ThreePointDefault value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDefault_2() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDefault_2() => $_clearField(2);\n  @$pb.TagNumber(2)\n  ThreePointDefault ensureDefault_2() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  ThreePointAutoPlay get autoPlayer => $_getN(2);\n  @$pb.TagNumber(3)\n  set autoPlayer(ThreePointAutoPlay value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAutoPlayer() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAutoPlayer() => $_clearField(3);\n  @$pb.TagNumber(3)\n  ThreePointAutoPlay ensureAutoPlayer() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  ThreePointShare get share => $_getN(3);\n  @$pb.TagNumber(4)\n  set share(ThreePointShare value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasShare() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearShare() => $_clearField(4);\n  @$pb.TagNumber(4)\n  ThreePointShare ensureShare() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  ThreePointAttention get attention => $_getN(4);\n  @$pb.TagNumber(5)\n  set attention(ThreePointAttention value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasAttention() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearAttention() => $_clearField(5);\n  @$pb.TagNumber(5)\n  ThreePointAttention ensureAttention() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  ThreePointWait get wait => $_getN(5);\n  @$pb.TagNumber(6)\n  set wait(ThreePointWait value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasWait() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearWait() => $_clearField(6);\n  @$pb.TagNumber(6)\n  ThreePointWait ensureWait() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  ThreePointDislike get dislike => $_getN(6);\n  @$pb.TagNumber(7)\n  set dislike(ThreePointDislike value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasDislike() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearDislike() => $_clearField(7);\n  @$pb.TagNumber(7)\n  ThreePointDislike ensureDislike() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  ThreePointFavorite get favorite => $_getN(7);\n  @$pb.TagNumber(8)\n  set favorite(ThreePointFavorite value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasFavorite() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearFavorite() => $_clearField(8);\n  @$pb.TagNumber(8)\n  ThreePointFavorite ensureFavorite() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  ThreePointTop get top => $_getN(8);\n  @$pb.TagNumber(9)\n  set top(ThreePointTop value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasTop() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearTop() => $_clearField(9);\n  @$pb.TagNumber(9)\n  ThreePointTop ensureTop() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  ThreePointComment get comment => $_getN(9);\n  @$pb.TagNumber(10)\n  set comment(ThreePointComment value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasComment() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearComment() => $_clearField(10);\n  @$pb.TagNumber(10)\n  ThreePointComment ensureComment() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  ThreePointHide get hide => $_getN(10);\n  @$pb.TagNumber(11)\n  set hide(ThreePointHide value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasHide() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearHide() => $_clearField(11);\n  @$pb.TagNumber(11)\n  ThreePointHide ensureHide() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  ThreePointTopicIrrelevant get topicIrrelevant => $_getN(11);\n  @$pb.TagNumber(12)\n  set topicIrrelevant(ThreePointTopicIrrelevant value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasTopicIrrelevant() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearTopicIrrelevant() => $_clearField(12);\n  @$pb.TagNumber(12)\n  ThreePointTopicIrrelevant ensureTopicIrrelevant() => $_ensure(11);\n\n  @$pb.TagNumber(13)\n  ThreePointDynEdit get dynEdit => $_getN(12);\n  @$pb.TagNumber(13)\n  set dynEdit(ThreePointDynEdit value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasDynEdit() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearDynEdit() => $_clearField(13);\n  @$pb.TagNumber(13)\n  ThreePointDynEdit ensureDynEdit() => $_ensure(12);\n\n  @$pb.TagNumber(14)\n  ThreePointDynCoin get coin => $_getN(13);\n  @$pb.TagNumber(14)\n  set coin(ThreePointDynCoin value) => $_setField(14, value);\n  @$pb.TagNumber(14)\n  $core.bool hasCoin() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearCoin() => $_clearField(14);\n  @$pb.TagNumber(14)\n  ThreePointDynCoin ensureCoin() => $_ensure(13);\n\n  @$pb.TagNumber(15)\n  ThreePointVisibilityChange get visibilityChange => $_getN(14);\n  @$pb.TagNumber(15)\n  set visibilityChange(ThreePointVisibilityChange value) =>\n      $_setField(15, value);\n  @$pb.TagNumber(15)\n  $core.bool hasVisibilityChange() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearVisibilityChange() => $_clearField(15);\n  @$pb.TagNumber(15)\n  ThreePointVisibilityChange ensureVisibilityChange() => $_ensure(14);\n\n  @$pb.TagNumber(16)\n  ThreePointTopicTop get topicTop => $_getN(15);\n  @$pb.TagNumber(16)\n  set topicTop(ThreePointTopicTop value) => $_setField(16, value);\n  @$pb.TagNumber(16)\n  $core.bool hasTopicTop() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearTopicTop() => $_clearField(16);\n  @$pb.TagNumber(16)\n  ThreePointTopicTop ensureTopicTop() => $_ensure(15);\n}\n\nclass ThreePointShare extends $pb.GeneratedMessage {\n  factory ThreePointShare({\n    $core.String? icon,\n    $core.String? title,\n    $core.Iterable<ThreePointShareChannel>? channel,\n    $core.String? channelName,\n    ShareReserve? reserve,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (title != null) result.title = title;\n    if (channel != null) result.channel.addAll(channel);\n    if (channelName != null) result.channelName = channelName;\n    if (reserve != null) result.reserve = reserve;\n    return result;\n  }\n\n  ThreePointShare._();\n\n  factory ThreePointShare.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreePointShare.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreePointShare',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..pPM<ThreePointShareChannel>(3, _omitFieldNames ? '' : 'channel',\n        subBuilder: ThreePointShareChannel.create)\n    ..aOS(4, _omitFieldNames ? '' : 'channelName')\n    ..aOM<ShareReserve>(5, _omitFieldNames ? '' : 'reserve',\n        subBuilder: ShareReserve.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointShare clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointShare copyWith(void Function(ThreePointShare) updates) =>\n      super.copyWith((message) => updates(message as ThreePointShare))\n          as ThreePointShare;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreePointShare create() => ThreePointShare._();\n  @$core.override\n  ThreePointShare createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreePointShare getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreePointShare>(create);\n  static ThreePointShare? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<ThreePointShareChannel> get channel => $_getList(2);\n\n  @$pb.TagNumber(4)\n  $core.String get channelName => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set channelName($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasChannelName() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearChannelName() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  ShareReserve get reserve => $_getN(4);\n  @$pb.TagNumber(5)\n  set reserve(ShareReserve value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasReserve() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearReserve() => $_clearField(5);\n  @$pb.TagNumber(5)\n  ShareReserve ensureReserve() => $_ensure(4);\n}\n\nclass ThreePointShareChannel extends $pb.GeneratedMessage {\n  factory ThreePointShareChannel({\n    $core.String? icon,\n    $core.String? title,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (title != null) result.title = title;\n    return result;\n  }\n\n  ThreePointShareChannel._();\n\n  factory ThreePointShareChannel.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreePointShareChannel.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreePointShareChannel',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointShareChannel clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointShareChannel copyWith(\n          void Function(ThreePointShareChannel) updates) =>\n      super.copyWith((message) => updates(message as ThreePointShareChannel))\n          as ThreePointShareChannel;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreePointShareChannel create() => ThreePointShareChannel._();\n  @$core.override\n  ThreePointShareChannel createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreePointShareChannel getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreePointShareChannel>(create);\n  static ThreePointShareChannel? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n}\n\nclass ThreePointTop extends $pb.GeneratedMessage {\n  factory ThreePointTop({\n    $core.String? icon,\n    $core.String? title,\n    TopType? type,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (title != null) result.title = title;\n    if (type != null) result.type = type;\n    return result;\n  }\n\n  ThreePointTop._();\n\n  factory ThreePointTop.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreePointTop.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreePointTop',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aE<TopType>(3, _omitFieldNames ? '' : 'type', enumValues: TopType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointTop clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointTop copyWith(void Function(ThreePointTop) updates) =>\n      super.copyWith((message) => updates(message as ThreePointTop))\n          as ThreePointTop;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreePointTop create() => ThreePointTop._();\n  @$core.override\n  ThreePointTop createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreePointTop getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreePointTop>(create);\n  static ThreePointTop? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  TopType get type => $_getN(2);\n  @$pb.TagNumber(3)\n  set type(TopType value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearType() => $_clearField(3);\n}\n\nclass ThreePointTopicIrrelevant extends $pb.GeneratedMessage {\n  factory ThreePointTopicIrrelevant({\n    $core.String? icon,\n    $core.String? title,\n    $core.String? toast,\n    $fixnum.Int64? topicId,\n    $fixnum.Int64? resId,\n    $fixnum.Int64? resType,\n    $core.String? reason,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (title != null) result.title = title;\n    if (toast != null) result.toast = toast;\n    if (topicId != null) result.topicId = topicId;\n    if (resId != null) result.resId = resId;\n    if (resType != null) result.resType = resType;\n    if (reason != null) result.reason = reason;\n    return result;\n  }\n\n  ThreePointTopicIrrelevant._();\n\n  factory ThreePointTopicIrrelevant.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreePointTopicIrrelevant.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreePointTopicIrrelevant',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'toast')\n    ..aInt64(4, _omitFieldNames ? '' : 'topicId')\n    ..aInt64(5, _omitFieldNames ? '' : 'resId')\n    ..aInt64(6, _omitFieldNames ? '' : 'resType')\n    ..aOS(7, _omitFieldNames ? '' : 'reason')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointTopicIrrelevant clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointTopicIrrelevant copyWith(\n          void Function(ThreePointTopicIrrelevant) updates) =>\n      super.copyWith((message) => updates(message as ThreePointTopicIrrelevant))\n          as ThreePointTopicIrrelevant;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreePointTopicIrrelevant create() => ThreePointTopicIrrelevant._();\n  @$core.override\n  ThreePointTopicIrrelevant createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreePointTopicIrrelevant getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreePointTopicIrrelevant>(create);\n  static ThreePointTopicIrrelevant? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get toast => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set toast($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasToast() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearToast() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get topicId => $_getI64(3);\n  @$pb.TagNumber(4)\n  set topicId($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTopicId() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTopicId() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get resId => $_getI64(4);\n  @$pb.TagNumber(5)\n  set resId($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasResId() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearResId() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get resType => $_getI64(5);\n  @$pb.TagNumber(6)\n  set resType($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasResType() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearResType() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get reason => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set reason($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasReason() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearReason() => $_clearField(7);\n}\n\nclass ThreePointTopicTop extends $pb.GeneratedMessage {\n  factory ThreePointTopicTop({\n    $core.String? icon,\n    $core.String? title,\n    TopType? type,\n    $fixnum.Int64? topicId,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (title != null) result.title = title;\n    if (type != null) result.type = type;\n    if (topicId != null) result.topicId = topicId;\n    return result;\n  }\n\n  ThreePointTopicTop._();\n\n  factory ThreePointTopicTop.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreePointTopicTop.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreePointTopicTop',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aE<TopType>(3, _omitFieldNames ? '' : 'type', enumValues: TopType.values)\n    ..aInt64(4, _omitFieldNames ? '' : 'topicId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointTopicTop clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointTopicTop copyWith(void Function(ThreePointTopicTop) updates) =>\n      super.copyWith((message) => updates(message as ThreePointTopicTop))\n          as ThreePointTopicTop;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreePointTopicTop create() => ThreePointTopicTop._();\n  @$core.override\n  ThreePointTopicTop createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreePointTopicTop getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreePointTopicTop>(create);\n  static ThreePointTopicTop? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  TopType get type => $_getN(2);\n  @$pb.TagNumber(3)\n  set type(TopType value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get topicId => $_getI64(3);\n  @$pb.TagNumber(4)\n  set topicId($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTopicId() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTopicId() => $_clearField(4);\n}\n\nclass ThreePointVisibilityChange extends $pb.GeneratedMessage {\n  factory ThreePointVisibilityChange({\n    $core.String? icon,\n    $core.String? title,\n    $core.Iterable<ThreePointVisibilityChangeItem>? itemList,\n    $core.String? objId,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (title != null) result.title = title;\n    if (itemList != null) result.itemList.addAll(itemList);\n    if (objId != null) result.objId = objId;\n    return result;\n  }\n\n  ThreePointVisibilityChange._();\n\n  factory ThreePointVisibilityChange.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreePointVisibilityChange.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreePointVisibilityChange',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..pPM<ThreePointVisibilityChangeItem>(3, _omitFieldNames ? '' : 'itemList',\n        subBuilder: ThreePointVisibilityChangeItem.create)\n    ..aOS(4, _omitFieldNames ? '' : 'objId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointVisibilityChange clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointVisibilityChange copyWith(\n          void Function(ThreePointVisibilityChange) updates) =>\n      super.copyWith(\n              (message) => updates(message as ThreePointVisibilityChange))\n          as ThreePointVisibilityChange;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreePointVisibilityChange create() => ThreePointVisibilityChange._();\n  @$core.override\n  ThreePointVisibilityChange createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreePointVisibilityChange getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreePointVisibilityChange>(create);\n  static ThreePointVisibilityChange? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<ThreePointVisibilityChangeItem> get itemList => $_getList(2);\n\n  @$pb.TagNumber(4)\n  $core.String get objId => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set objId($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasObjId() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearObjId() => $_clearField(4);\n}\n\nclass ThreePointVisibilityChangeItem extends $pb.GeneratedMessage {\n  factory ThreePointVisibilityChangeItem({\n    $core.String? icon,\n    $core.String? title,\n    $core.String? subTitle,\n    $core.bool? isSelected,\n    $core.String? visibilityChangeActionUnselected,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (title != null) result.title = title;\n    if (subTitle != null) result.subTitle = subTitle;\n    if (isSelected != null) result.isSelected = isSelected;\n    if (visibilityChangeActionUnselected != null)\n      result.visibilityChangeActionUnselected =\n          visibilityChangeActionUnselected;\n    return result;\n  }\n\n  ThreePointVisibilityChangeItem._();\n\n  factory ThreePointVisibilityChangeItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreePointVisibilityChangeItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreePointVisibilityChangeItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'subTitle')\n    ..aOB(4, _omitFieldNames ? '' : 'isSelected')\n    ..aOS(5, _omitFieldNames ? '' : 'visibilityChangeActionUnselected')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointVisibilityChangeItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointVisibilityChangeItem copyWith(\n          void Function(ThreePointVisibilityChangeItem) updates) =>\n      super.copyWith(\n              (message) => updates(message as ThreePointVisibilityChangeItem))\n          as ThreePointVisibilityChangeItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreePointVisibilityChangeItem create() =>\n      ThreePointVisibilityChangeItem._();\n  @$core.override\n  ThreePointVisibilityChangeItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreePointVisibilityChangeItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreePointVisibilityChangeItem>(create);\n  static ThreePointVisibilityChangeItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get subTitle => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set subTitle($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSubTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSubTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get isSelected => $_getBF(3);\n  @$pb.TagNumber(4)\n  set isSelected($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIsSelected() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIsSelected() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get visibilityChangeActionUnselected => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set visibilityChangeActionUnselected($core.String value) =>\n      $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasVisibilityChangeActionUnselected() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearVisibilityChangeActionUnselected() => $_clearField(5);\n}\n\nclass ThreePointWait extends $pb.GeneratedMessage {\n  factory ThreePointWait({\n    $core.String? additionIcon,\n    $core.String? additionText,\n    $core.String? noAdditionIcon,\n    $core.String? noAdditionText,\n    $fixnum.Int64? id,\n  }) {\n    final result = create();\n    if (additionIcon != null) result.additionIcon = additionIcon;\n    if (additionText != null) result.additionText = additionText;\n    if (noAdditionIcon != null) result.noAdditionIcon = noAdditionIcon;\n    if (noAdditionText != null) result.noAdditionText = noAdditionText;\n    if (id != null) result.id = id;\n    return result;\n  }\n\n  ThreePointWait._();\n\n  factory ThreePointWait.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreePointWait.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreePointWait',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'additionIcon')\n    ..aOS(2, _omitFieldNames ? '' : 'additionText')\n    ..aOS(3, _omitFieldNames ? '' : 'noAdditionIcon')\n    ..aOS(4, _omitFieldNames ? '' : 'noAdditionText')\n    ..aInt64(5, _omitFieldNames ? '' : 'id')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointWait clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreePointWait copyWith(void Function(ThreePointWait) updates) =>\n      super.copyWith((message) => updates(message as ThreePointWait))\n          as ThreePointWait;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreePointWait create() => ThreePointWait._();\n  @$core.override\n  ThreePointWait createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreePointWait getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreePointWait>(create);\n  static ThreePointWait? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get additionIcon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set additionIcon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAdditionIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAdditionIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get additionText => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set additionText($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAdditionText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAdditionText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get noAdditionIcon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set noAdditionIcon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasNoAdditionIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearNoAdditionIcon() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get noAdditionText => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set noAdditionText($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasNoAdditionText() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearNoAdditionText() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get id => $_getI64(4);\n  @$pb.TagNumber(5)\n  set id($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasId() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearId() => $_clearField(5);\n}\n\nclass TopAdditionUP extends $pb.GeneratedMessage {\n  factory TopAdditionUP({\n    $core.Iterable<AdditionUP>? up,\n    $core.int? hasFold,\n  }) {\n    final result = create();\n    if (up != null) result.up.addAll(up);\n    if (hasFold != null) result.hasFold = hasFold;\n    return result;\n  }\n\n  TopAdditionUP._();\n\n  factory TopAdditionUP.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TopAdditionUP.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TopAdditionUP',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<AdditionUP>(1, _omitFieldNames ? '' : 'up',\n        subBuilder: AdditionUP.create)\n    ..aI(2, _omitFieldNames ? '' : 'hasFold')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopAdditionUP clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopAdditionUP copyWith(void Function(TopAdditionUP) updates) =>\n      super.copyWith((message) => updates(message as TopAdditionUP))\n          as TopAdditionUP;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TopAdditionUP create() => TopAdditionUP._();\n  @$core.override\n  TopAdditionUP createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TopAdditionUP getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<TopAdditionUP>(create);\n  static TopAdditionUP? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<AdditionUP> get up => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.int get hasFold => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set hasFold($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHasFold() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHasFold() => $_clearField(2);\n}\n\nclass TopicButton extends $pb.GeneratedMessage {\n  factory TopicButton({\n    $core.String? icon,\n    $core.String? title,\n    $core.String? jumpUri,\n    $core.bool? redDot,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (title != null) result.title = title;\n    if (jumpUri != null) result.jumpUri = jumpUri;\n    if (redDot != null) result.redDot = redDot;\n    return result;\n  }\n\n  TopicButton._();\n\n  factory TopicButton.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TopicButton.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TopicButton',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'jumpUri')\n    ..aOB(4, _omitFieldNames ? '' : 'redDot')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopicButton clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopicButton copyWith(void Function(TopicButton) updates) =>\n      super.copyWith((message) => updates(message as TopicButton))\n          as TopicButton;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TopicButton create() => TopicButton._();\n  @$core.override\n  TopicButton createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TopicButton getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<TopicButton>(create);\n  static TopicButton? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get jumpUri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set jumpUri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasJumpUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearJumpUri() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get redDot => $_getBF(3);\n  @$pb.TagNumber(4)\n  set redDot($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasRedDot() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearRedDot() => $_clearField(4);\n}\n\nclass TopicItem extends $pb.GeneratedMessage {\n  factory TopicItem({\n    $fixnum.Int64? topicId,\n    $core.String? topicName,\n    $core.String? url,\n    $core.String? desc,\n    $core.String? desc2,\n    $core.String? rcmdDesc,\n    IconButton? button,\n  }) {\n    final result = create();\n    if (topicId != null) result.topicId = topicId;\n    if (topicName != null) result.topicName = topicName;\n    if (url != null) result.url = url;\n    if (desc != null) result.desc = desc;\n    if (desc2 != null) result.desc2 = desc2;\n    if (rcmdDesc != null) result.rcmdDesc = rcmdDesc;\n    if (button != null) result.button = button;\n    return result;\n  }\n\n  TopicItem._();\n\n  factory TopicItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TopicItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TopicItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'topicId')\n    ..aOS(2, _omitFieldNames ? '' : 'topicName')\n    ..aOS(3, _omitFieldNames ? '' : 'url')\n    ..aOS(4, _omitFieldNames ? '' : 'desc')\n    ..aOS(5, _omitFieldNames ? '' : 'desc2')\n    ..aOS(6, _omitFieldNames ? '' : 'rcmdDesc')\n    ..aOM<IconButton>(7, _omitFieldNames ? '' : 'button',\n        subBuilder: IconButton.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopicItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopicItem copyWith(void Function(TopicItem) updates) =>\n      super.copyWith((message) => updates(message as TopicItem)) as TopicItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TopicItem create() => TopicItem._();\n  @$core.override\n  TopicItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TopicItem getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TopicItem>(create);\n  static TopicItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get topicId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set topicId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTopicId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTopicId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get topicName => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set topicName($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTopicName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTopicName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get url => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set url($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUrl() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUrl() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get desc => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set desc($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDesc() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDesc() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get desc2 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set desc2($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDesc2() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDesc2() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get rcmdDesc => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set rcmdDesc($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasRcmdDesc() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearRcmdDesc() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  IconButton get button => $_getN(6);\n  @$pb.TagNumber(7)\n  set button(IconButton value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasButton() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearButton() => $_clearField(7);\n  @$pb.TagNumber(7)\n  IconButton ensureButton() => $_ensure(6);\n}\n\nclass TopicList extends $pb.GeneratedMessage {\n  factory TopicList({\n    $core.String? title,\n    $core.Iterable<TopicListItem>? topicListItem,\n    TopicButton? actButton,\n    TopicButton? moreButton,\n    $core.String? serverInfo,\n    $core.String? subTitle,\n    $core.int? expStyle,\n    $core.String? titleIcon,\n    DynamicItem? hintMessage,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (topicListItem != null) result.topicListItem.addAll(topicListItem);\n    if (actButton != null) result.actButton = actButton;\n    if (moreButton != null) result.moreButton = moreButton;\n    if (serverInfo != null) result.serverInfo = serverInfo;\n    if (subTitle != null) result.subTitle = subTitle;\n    if (expStyle != null) result.expStyle = expStyle;\n    if (titleIcon != null) result.titleIcon = titleIcon;\n    if (hintMessage != null) result.hintMessage = hintMessage;\n    return result;\n  }\n\n  TopicList._();\n\n  factory TopicList.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TopicList.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TopicList',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..pPM<TopicListItem>(2, _omitFieldNames ? '' : 'topicListItem',\n        subBuilder: TopicListItem.create)\n    ..aOM<TopicButton>(3, _omitFieldNames ? '' : 'actButton',\n        subBuilder: TopicButton.create)\n    ..aOM<TopicButton>(4, _omitFieldNames ? '' : 'moreButton',\n        subBuilder: TopicButton.create)\n    ..aOS(5, _omitFieldNames ? '' : 'serverInfo')\n    ..aOS(6, _omitFieldNames ? '' : 'subTitle')\n    ..aI(7, _omitFieldNames ? '' : 'expStyle')\n    ..aOS(8, _omitFieldNames ? '' : 'titleIcon')\n    ..aOM<DynamicItem>(9, _omitFieldNames ? '' : 'hintMessage',\n        subBuilder: DynamicItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopicList clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopicList copyWith(void Function(TopicList) updates) =>\n      super.copyWith((message) => updates(message as TopicList)) as TopicList;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TopicList create() => TopicList._();\n  @$core.override\n  TopicList createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TopicList getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TopicList>(create);\n  static TopicList? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<TopicListItem> get topicListItem => $_getList(1);\n\n  @$pb.TagNumber(3)\n  TopicButton get actButton => $_getN(2);\n  @$pb.TagNumber(3)\n  set actButton(TopicButton value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasActButton() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearActButton() => $_clearField(3);\n  @$pb.TagNumber(3)\n  TopicButton ensureActButton() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  TopicButton get moreButton => $_getN(3);\n  @$pb.TagNumber(4)\n  set moreButton(TopicButton value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasMoreButton() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearMoreButton() => $_clearField(4);\n  @$pb.TagNumber(4)\n  TopicButton ensureMoreButton() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.String get serverInfo => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set serverInfo($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasServerInfo() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearServerInfo() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get subTitle => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set subTitle($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasSubTitle() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearSubTitle() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get expStyle => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set expStyle($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasExpStyle() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearExpStyle() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get titleIcon => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set titleIcon($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasTitleIcon() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearTitleIcon() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  DynamicItem get hintMessage => $_getN(8);\n  @$pb.TagNumber(9)\n  set hintMessage(DynamicItem value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasHintMessage() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearHintMessage() => $_clearField(9);\n  @$pb.TagNumber(9)\n  DynamicItem ensureHintMessage() => $_ensure(8);\n}\n\nclass TopicListItem extends $pb.GeneratedMessage {\n  factory TopicListItem({\n    $core.String? icon,\n    $core.String? iconTitle,\n    $fixnum.Int64? topicId,\n    $core.String? topicName,\n    $core.String? url,\n    $fixnum.Int64? pos,\n    $core.String? serverInfo,\n    $core.String? headIconUrl,\n    $fixnum.Int64? upMid,\n    $core.String? tailIconUrl,\n    $core.String? extension_11,\n    $fixnum.Int64? position,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (iconTitle != null) result.iconTitle = iconTitle;\n    if (topicId != null) result.topicId = topicId;\n    if (topicName != null) result.topicName = topicName;\n    if (url != null) result.url = url;\n    if (pos != null) result.pos = pos;\n    if (serverInfo != null) result.serverInfo = serverInfo;\n    if (headIconUrl != null) result.headIconUrl = headIconUrl;\n    if (upMid != null) result.upMid = upMid;\n    if (tailIconUrl != null) result.tailIconUrl = tailIconUrl;\n    if (extension_11 != null) result.extension_11 = extension_11;\n    if (position != null) result.position = position;\n    return result;\n  }\n\n  TopicListItem._();\n\n  factory TopicListItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TopicListItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TopicListItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'iconTitle')\n    ..aInt64(3, _omitFieldNames ? '' : 'topicId')\n    ..aOS(4, _omitFieldNames ? '' : 'topicName')\n    ..aOS(5, _omitFieldNames ? '' : 'url')\n    ..aInt64(6, _omitFieldNames ? '' : 'pos')\n    ..aOS(7, _omitFieldNames ? '' : 'serverInfo')\n    ..aOS(8, _omitFieldNames ? '' : 'headIconUrl')\n    ..aInt64(9, _omitFieldNames ? '' : 'upMid')\n    ..aOS(10, _omitFieldNames ? '' : 'tailIconUrl')\n    ..aOS(11, _omitFieldNames ? '' : 'extension')\n    ..aInt64(12, _omitFieldNames ? '' : 'position')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopicListItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopicListItem copyWith(void Function(TopicListItem) updates) =>\n      super.copyWith((message) => updates(message as TopicListItem))\n          as TopicListItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TopicListItem create() => TopicListItem._();\n  @$core.override\n  TopicListItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TopicListItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<TopicListItem>(create);\n  static TopicListItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get iconTitle => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set iconTitle($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIconTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIconTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get topicId => $_getI64(2);\n  @$pb.TagNumber(3)\n  set topicId($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTopicId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTopicId() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get topicName => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set topicName($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTopicName() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTopicName() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get url => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set url($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasUrl() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearUrl() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get pos => $_getI64(5);\n  @$pb.TagNumber(6)\n  set pos($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasPos() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearPos() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get serverInfo => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set serverInfo($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasServerInfo() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearServerInfo() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get headIconUrl => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set headIconUrl($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasHeadIconUrl() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearHeadIconUrl() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get upMid => $_getI64(8);\n  @$pb.TagNumber(9)\n  set upMid($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasUpMid() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearUpMid() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get tailIconUrl => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set tailIconUrl($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasTailIconUrl() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearTailIconUrl() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get extension_11 => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set extension_11($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasExtension_11() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearExtension_11() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $fixnum.Int64 get position => $_getI64(11);\n  @$pb.TagNumber(12)\n  set position($fixnum.Int64 value) => $_setInt64(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasPosition() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearPosition() => $_clearField(12);\n}\n\nclass TopicListReply extends $pb.GeneratedMessage {\n  factory TopicListReply({\n    $core.Iterable<TopicItem>? items,\n    $core.bool? hasMore,\n    $core.String? offset,\n    IconButton? createTopicBtn,\n  }) {\n    final result = create();\n    if (items != null) result.items.addAll(items);\n    if (hasMore != null) result.hasMore = hasMore;\n    if (offset != null) result.offset = offset;\n    if (createTopicBtn != null) result.createTopicBtn = createTopicBtn;\n    return result;\n  }\n\n  TopicListReply._();\n\n  factory TopicListReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TopicListReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TopicListReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<TopicItem>(1, _omitFieldNames ? '' : 'items',\n        subBuilder: TopicItem.create)\n    ..aOB(2, _omitFieldNames ? '' : 'hasMore')\n    ..aOS(3, _omitFieldNames ? '' : 'offset')\n    ..aOM<IconButton>(4, _omitFieldNames ? '' : 'createTopicBtn',\n        subBuilder: IconButton.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopicListReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopicListReply copyWith(void Function(TopicListReply) updates) =>\n      super.copyWith((message) => updates(message as TopicListReply))\n          as TopicListReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TopicListReply create() => TopicListReply._();\n  @$core.override\n  TopicListReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TopicListReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<TopicListReply>(create);\n  static TopicListReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<TopicItem> get items => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.bool get hasMore => $_getBF(1);\n  @$pb.TagNumber(2)\n  set hasMore($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHasMore() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHasMore() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get offset => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set offset($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasOffset() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearOffset() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  IconButton get createTopicBtn => $_getN(3);\n  @$pb.TagNumber(4)\n  set createTopicBtn(IconButton value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCreateTopicBtn() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCreateTopicBtn() => $_clearField(4);\n  @$pb.TagNumber(4)\n  IconButton ensureCreateTopicBtn() => $_ensure(3);\n}\n\nclass TopicListReq extends $pb.GeneratedMessage {\n  factory TopicListReq({\n    $fixnum.Int64? campusId,\n    $core.String? offset,\n    CampusReqFromType? fromType,\n  }) {\n    final result = create();\n    if (campusId != null) result.campusId = campusId;\n    if (offset != null) result.offset = offset;\n    if (fromType != null) result.fromType = fromType;\n    return result;\n  }\n\n  TopicListReq._();\n\n  factory TopicListReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TopicListReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TopicListReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'campusId')\n    ..aOS(2, _omitFieldNames ? '' : 'offset')\n    ..aE<CampusReqFromType>(3, _omitFieldNames ? '' : 'fromType',\n        enumValues: CampusReqFromType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopicListReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopicListReq copyWith(void Function(TopicListReq) updates) =>\n      super.copyWith((message) => updates(message as TopicListReq))\n          as TopicListReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TopicListReq create() => TopicListReq._();\n  @$core.override\n  TopicListReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TopicListReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<TopicListReq>(create);\n  static TopicListReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get campusId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set campusId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCampusId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCampusId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get offset => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set offset($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOffset() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOffset() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  CampusReqFromType get fromType => $_getN(2);\n  @$pb.TagNumber(3)\n  set fromType(CampusReqFromType value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFromType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFromType() => $_clearField(3);\n}\n\nclass TopicMergedResource extends $pb.GeneratedMessage {\n  factory TopicMergedResource({\n    $core.int? mergeType,\n    $core.int? mergedResCnt,\n  }) {\n    final result = create();\n    if (mergeType != null) result.mergeType = mergeType;\n    if (mergedResCnt != null) result.mergedResCnt = mergedResCnt;\n    return result;\n  }\n\n  TopicMergedResource._();\n\n  factory TopicMergedResource.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TopicMergedResource.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TopicMergedResource',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'mergeType')\n    ..aI(2, _omitFieldNames ? '' : 'mergedResCnt')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopicMergedResource clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopicMergedResource copyWith(void Function(TopicMergedResource) updates) =>\n      super.copyWith((message) => updates(message as TopicMergedResource))\n          as TopicMergedResource;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TopicMergedResource create() => TopicMergedResource._();\n  @$core.override\n  TopicMergedResource createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TopicMergedResource getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<TopicMergedResource>(create);\n  static TopicMergedResource? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get mergeType => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set mergeType($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMergeType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMergeType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get mergedResCnt => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set mergedResCnt($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMergedResCnt() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMergedResCnt() => $_clearField(2);\n}\n\nclass TopicRcmdCard extends $pb.GeneratedMessage {\n  factory TopicRcmdCard({\n    $fixnum.Int64? topicId,\n    $core.String? topicName,\n    $core.String? url,\n    CampusLabel? button,\n    $core.String? desc1,\n    $core.String? desc2,\n    $core.String? updateDesc,\n  }) {\n    final result = create();\n    if (topicId != null) result.topicId = topicId;\n    if (topicName != null) result.topicName = topicName;\n    if (url != null) result.url = url;\n    if (button != null) result.button = button;\n    if (desc1 != null) result.desc1 = desc1;\n    if (desc2 != null) result.desc2 = desc2;\n    if (updateDesc != null) result.updateDesc = updateDesc;\n    return result;\n  }\n\n  TopicRcmdCard._();\n\n  factory TopicRcmdCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TopicRcmdCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TopicRcmdCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'topicId')\n    ..aOS(2, _omitFieldNames ? '' : 'topicName')\n    ..aOS(3, _omitFieldNames ? '' : 'url')\n    ..aOM<CampusLabel>(4, _omitFieldNames ? '' : 'button',\n        subBuilder: CampusLabel.create)\n    ..aOS(5, _omitFieldNames ? '' : 'desc1')\n    ..aOS(6, _omitFieldNames ? '' : 'desc2')\n    ..aOS(7, _omitFieldNames ? '' : 'updateDesc')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopicRcmdCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopicRcmdCard copyWith(void Function(TopicRcmdCard) updates) =>\n      super.copyWith((message) => updates(message as TopicRcmdCard))\n          as TopicRcmdCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TopicRcmdCard create() => TopicRcmdCard._();\n  @$core.override\n  TopicRcmdCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TopicRcmdCard getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<TopicRcmdCard>(create);\n  static TopicRcmdCard? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get topicId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set topicId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTopicId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTopicId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get topicName => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set topicName($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTopicName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTopicName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get url => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set url($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUrl() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUrl() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  CampusLabel get button => $_getN(3);\n  @$pb.TagNumber(4)\n  set button(CampusLabel value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasButton() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearButton() => $_clearField(4);\n  @$pb.TagNumber(4)\n  CampusLabel ensureButton() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.String get desc1 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set desc1($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDesc1() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDesc1() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get desc2 => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set desc2($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasDesc2() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearDesc2() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get updateDesc => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set updateDesc($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasUpdateDesc() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearUpdateDesc() => $_clearField(7);\n}\n\nclass TopicSquareInfo extends $pb.GeneratedMessage {\n  factory TopicSquareInfo({\n    $core.String? title,\n    CampusLabel? button,\n    TopicRcmdCard? rcmd,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (button != null) result.button = button;\n    if (rcmd != null) result.rcmd = rcmd;\n    return result;\n  }\n\n  TopicSquareInfo._();\n\n  factory TopicSquareInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TopicSquareInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TopicSquareInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOM<CampusLabel>(2, _omitFieldNames ? '' : 'button',\n        subBuilder: CampusLabel.create)\n    ..aOM<TopicRcmdCard>(3, _omitFieldNames ? '' : 'rcmd',\n        subBuilder: TopicRcmdCard.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopicSquareInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopicSquareInfo copyWith(void Function(TopicSquareInfo) updates) =>\n      super.copyWith((message) => updates(message as TopicSquareInfo))\n          as TopicSquareInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TopicSquareInfo create() => TopicSquareInfo._();\n  @$core.override\n  TopicSquareInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TopicSquareInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<TopicSquareInfo>(create);\n  static TopicSquareInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  CampusLabel get button => $_getN(1);\n  @$pb.TagNumber(2)\n  set button(CampusLabel value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasButton() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearButton() => $_clearField(2);\n  @$pb.TagNumber(2)\n  CampusLabel ensureButton() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  TopicRcmdCard get rcmd => $_getN(2);\n  @$pb.TagNumber(3)\n  set rcmd(TopicRcmdCard value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRcmd() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRcmd() => $_clearField(3);\n  @$pb.TagNumber(3)\n  TopicRcmdCard ensureRcmd() => $_ensure(2);\n}\n\nclass TopicSquareReply extends $pb.GeneratedMessage {\n  factory TopicSquareReply({\n    TopicSquareInfo? info,\n  }) {\n    final result = create();\n    if (info != null) result.info = info;\n    return result;\n  }\n\n  TopicSquareReply._();\n\n  factory TopicSquareReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TopicSquareReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TopicSquareReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOM<TopicSquareInfo>(1, _omitFieldNames ? '' : 'info',\n        subBuilder: TopicSquareInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopicSquareReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopicSquareReply copyWith(void Function(TopicSquareReply) updates) =>\n      super.copyWith((message) => updates(message as TopicSquareReply))\n          as TopicSquareReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TopicSquareReply create() => TopicSquareReply._();\n  @$core.override\n  TopicSquareReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TopicSquareReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<TopicSquareReply>(create);\n  static TopicSquareReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  TopicSquareInfo get info => $_getN(0);\n  @$pb.TagNumber(1)\n  set info(TopicSquareInfo value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasInfo() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearInfo() => $_clearField(1);\n  @$pb.TagNumber(1)\n  TopicSquareInfo ensureInfo() => $_ensure(0);\n}\n\nclass TopicSquareReq extends $pb.GeneratedMessage {\n  factory TopicSquareReq({\n    $fixnum.Int64? campusId,\n    CampusReqFromType? fromType,\n  }) {\n    final result = create();\n    if (campusId != null) result.campusId = campusId;\n    if (fromType != null) result.fromType = fromType;\n    return result;\n  }\n\n  TopicSquareReq._();\n\n  factory TopicSquareReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TopicSquareReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TopicSquareReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'campusId')\n    ..aE<CampusReqFromType>(2, _omitFieldNames ? '' : 'fromType',\n        enumValues: CampusReqFromType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopicSquareReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopicSquareReq copyWith(void Function(TopicSquareReq) updates) =>\n      super.copyWith((message) => updates(message as TopicSquareReq))\n          as TopicSquareReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TopicSquareReq create() => TopicSquareReq._();\n  @$core.override\n  TopicSquareReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TopicSquareReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<TopicSquareReq>(create);\n  static TopicSquareReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get campusId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set campusId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCampusId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCampusId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  CampusReqFromType get fromType => $_getN(1);\n  @$pb.TagNumber(2)\n  set fromType(CampusReqFromType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFromType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFromType() => $_clearField(2);\n}\n\nclass Unfollow extends $pb.GeneratedMessage {\n  factory Unfollow({\n    $core.String? title,\n    $core.Iterable<UnfollowUserItem>? list,\n    $core.String? trackId,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (list != null) result.list.addAll(list);\n    if (trackId != null) result.trackId = trackId;\n    return result;\n  }\n\n  Unfollow._();\n\n  factory Unfollow.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Unfollow.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Unfollow',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..pPM<UnfollowUserItem>(2, _omitFieldNames ? '' : 'list',\n        subBuilder: UnfollowUserItem.create)\n    ..aOS(3, _omitFieldNames ? '' : 'trackId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Unfollow clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Unfollow copyWith(void Function(Unfollow) updates) =>\n      super.copyWith((message) => updates(message as Unfollow)) as Unfollow;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Unfollow create() => Unfollow._();\n  @$core.override\n  Unfollow createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Unfollow getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Unfollow>(create);\n  static Unfollow? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<UnfollowUserItem> get list => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $core.String get trackId => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set trackId($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTrackId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTrackId() => $_clearField(3);\n}\n\nclass UnfollowMatchReq extends $pb.GeneratedMessage {\n  factory UnfollowMatchReq({\n    $fixnum.Int64? cid,\n  }) {\n    final result = create();\n    if (cid != null) result.cid = cid;\n    return result;\n  }\n\n  UnfollowMatchReq._();\n\n  factory UnfollowMatchReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UnfollowMatchReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UnfollowMatchReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'cid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UnfollowMatchReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UnfollowMatchReq copyWith(void Function(UnfollowMatchReq) updates) =>\n      super.copyWith((message) => updates(message as UnfollowMatchReq))\n          as UnfollowMatchReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UnfollowMatchReq create() => UnfollowMatchReq._();\n  @$core.override\n  UnfollowMatchReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UnfollowMatchReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UnfollowMatchReq>(create);\n  static UnfollowMatchReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get cid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set cid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCid() => $_clearField(1);\n}\n\nclass UnfollowUserItem extends $pb.GeneratedMessage {\n  factory UnfollowUserItem({\n    $core.bool? hasUpdate,\n    $core.String? face,\n    $core.String? name,\n    $fixnum.Int64? uid,\n    $core.int? pos,\n    LiveState? liveState,\n    OfficialVerify? official,\n    VipInfo? vip,\n    $core.String? sign,\n    $core.String? label,\n    AdditionalButton? button,\n    $core.String? uri,\n  }) {\n    final result = create();\n    if (hasUpdate != null) result.hasUpdate = hasUpdate;\n    if (face != null) result.face = face;\n    if (name != null) result.name = name;\n    if (uid != null) result.uid = uid;\n    if (pos != null) result.pos = pos;\n    if (liveState != null) result.liveState = liveState;\n    if (official != null) result.official = official;\n    if (vip != null) result.vip = vip;\n    if (sign != null) result.sign = sign;\n    if (label != null) result.label = label;\n    if (button != null) result.button = button;\n    if (uri != null) result.uri = uri;\n    return result;\n  }\n\n  UnfollowUserItem._();\n\n  factory UnfollowUserItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UnfollowUserItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UnfollowUserItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'hasUpdate')\n    ..aOS(2, _omitFieldNames ? '' : 'face')\n    ..aOS(3, _omitFieldNames ? '' : 'name')\n    ..aInt64(4, _omitFieldNames ? '' : 'uid')\n    ..aI(5, _omitFieldNames ? '' : 'pos')\n    ..aE<LiveState>(6, _omitFieldNames ? '' : 'liveState',\n        enumValues: LiveState.values)\n    ..aOM<OfficialVerify>(7, _omitFieldNames ? '' : 'official',\n        subBuilder: OfficialVerify.create)\n    ..aOM<VipInfo>(8, _omitFieldNames ? '' : 'vip', subBuilder: VipInfo.create)\n    ..aOS(9, _omitFieldNames ? '' : 'sign')\n    ..aOS(10, _omitFieldNames ? '' : 'label')\n    ..aOM<AdditionalButton>(11, _omitFieldNames ? '' : 'button',\n        subBuilder: AdditionalButton.create)\n    ..aOS(12, _omitFieldNames ? '' : 'uri')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UnfollowUserItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UnfollowUserItem copyWith(void Function(UnfollowUserItem) updates) =>\n      super.copyWith((message) => updates(message as UnfollowUserItem))\n          as UnfollowUserItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UnfollowUserItem create() => UnfollowUserItem._();\n  @$core.override\n  UnfollowUserItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UnfollowUserItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UnfollowUserItem>(create);\n  static UnfollowUserItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get hasUpdate => $_getBF(0);\n  @$pb.TagNumber(1)\n  set hasUpdate($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasHasUpdate() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearHasUpdate() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get face => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set face($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFace() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFace() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get name => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set name($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasName() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearName() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get uid => $_getI64(3);\n  @$pb.TagNumber(4)\n  set uid($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUid() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get pos => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set pos($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPos() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPos() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  LiveState get liveState => $_getN(5);\n  @$pb.TagNumber(6)\n  set liveState(LiveState value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasLiveState() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearLiveState() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  OfficialVerify get official => $_getN(6);\n  @$pb.TagNumber(7)\n  set official(OfficialVerify value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasOfficial() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearOfficial() => $_clearField(7);\n  @$pb.TagNumber(7)\n  OfficialVerify ensureOfficial() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  VipInfo get vip => $_getN(7);\n  @$pb.TagNumber(8)\n  set vip(VipInfo value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasVip() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearVip() => $_clearField(8);\n  @$pb.TagNumber(8)\n  VipInfo ensureVip() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  $core.String get sign => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set sign($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasSign() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearSign() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get label => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set label($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasLabel() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearLabel() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  AdditionalButton get button => $_getN(10);\n  @$pb.TagNumber(11)\n  set button(AdditionalButton value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasButton() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearButton() => $_clearField(11);\n  @$pb.TagNumber(11)\n  AdditionalButton ensureButton() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  $core.String get uri => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set uri($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasUri() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearUri() => $_clearField(12);\n}\n\nclass UpListItem extends $pb.GeneratedMessage {\n  factory UpListItem({\n    $core.bool? hasUpdate,\n    $core.String? face,\n    $core.String? name,\n    $fixnum.Int64? uid,\n    $fixnum.Int64? pos,\n    UserItemType? userItemType,\n    UserItemStyle? displayStyleDay,\n    UserItemStyle? displayStyleNight,\n    $fixnum.Int64? styleId,\n    LiveState? liveState,\n    $core.bool? separator,\n    $core.String? uri,\n    $core.bool? isRecall,\n    IconBadge? updateIcon,\n    $core.String? liveRcmdReason,\n    $core.String? liveCover,\n    $core.String? personalExtra,\n    $core.String? updateIconType,\n    $core.String? trackId,\n    UpListTextBadge? textBadge,\n  }) {\n    final result = create();\n    if (hasUpdate != null) result.hasUpdate = hasUpdate;\n    if (face != null) result.face = face;\n    if (name != null) result.name = name;\n    if (uid != null) result.uid = uid;\n    if (pos != null) result.pos = pos;\n    if (userItemType != null) result.userItemType = userItemType;\n    if (displayStyleDay != null) result.displayStyleDay = displayStyleDay;\n    if (displayStyleNight != null) result.displayStyleNight = displayStyleNight;\n    if (styleId != null) result.styleId = styleId;\n    if (liveState != null) result.liveState = liveState;\n    if (separator != null) result.separator = separator;\n    if (uri != null) result.uri = uri;\n    if (isRecall != null) result.isRecall = isRecall;\n    if (updateIcon != null) result.updateIcon = updateIcon;\n    if (liveRcmdReason != null) result.liveRcmdReason = liveRcmdReason;\n    if (liveCover != null) result.liveCover = liveCover;\n    if (personalExtra != null) result.personalExtra = personalExtra;\n    if (updateIconType != null) result.updateIconType = updateIconType;\n    if (trackId != null) result.trackId = trackId;\n    if (textBadge != null) result.textBadge = textBadge;\n    return result;\n  }\n\n  UpListItem._();\n\n  factory UpListItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UpListItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UpListItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'hasUpdate')\n    ..aOS(2, _omitFieldNames ? '' : 'face')\n    ..aOS(3, _omitFieldNames ? '' : 'name')\n    ..aInt64(4, _omitFieldNames ? '' : 'uid')\n    ..aInt64(5, _omitFieldNames ? '' : 'pos')\n    ..aE<UserItemType>(6, _omitFieldNames ? '' : 'userItemType',\n        enumValues: UserItemType.values)\n    ..aOM<UserItemStyle>(7, _omitFieldNames ? '' : 'displayStyleDay',\n        subBuilder: UserItemStyle.create)\n    ..aOM<UserItemStyle>(8, _omitFieldNames ? '' : 'displayStyleNight',\n        subBuilder: UserItemStyle.create)\n    ..aInt64(9, _omitFieldNames ? '' : 'styleId')\n    ..aE<LiveState>(10, _omitFieldNames ? '' : 'liveState',\n        enumValues: LiveState.values)\n    ..aOB(11, _omitFieldNames ? '' : 'separator')\n    ..aOS(12, _omitFieldNames ? '' : 'uri')\n    ..aOB(13, _omitFieldNames ? '' : 'isRecall')\n    ..aOM<IconBadge>(14, _omitFieldNames ? '' : 'updateIcon',\n        subBuilder: IconBadge.create)\n    ..aOS(15, _omitFieldNames ? '' : 'liveRcmdReason')\n    ..aOS(16, _omitFieldNames ? '' : 'liveCover')\n    ..aOS(17, _omitFieldNames ? '' : 'personalExtra')\n    ..aOS(18, _omitFieldNames ? '' : 'updateIconType')\n    ..aOS(19, _omitFieldNames ? '' : 'trackId')\n    ..aOM<UpListTextBadge>(20, _omitFieldNames ? '' : 'textBadge',\n        subBuilder: UpListTextBadge.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpListItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpListItem copyWith(void Function(UpListItem) updates) =>\n      super.copyWith((message) => updates(message as UpListItem)) as UpListItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UpListItem create() => UpListItem._();\n  @$core.override\n  UpListItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UpListItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UpListItem>(create);\n  static UpListItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get hasUpdate => $_getBF(0);\n  @$pb.TagNumber(1)\n  set hasUpdate($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasHasUpdate() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearHasUpdate() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get face => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set face($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFace() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFace() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get name => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set name($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasName() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearName() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get uid => $_getI64(3);\n  @$pb.TagNumber(4)\n  set uid($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUid() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get pos => $_getI64(4);\n  @$pb.TagNumber(5)\n  set pos($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPos() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPos() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  UserItemType get userItemType => $_getN(5);\n  @$pb.TagNumber(6)\n  set userItemType(UserItemType value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasUserItemType() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearUserItemType() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  UserItemStyle get displayStyleDay => $_getN(6);\n  @$pb.TagNumber(7)\n  set displayStyleDay(UserItemStyle value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasDisplayStyleDay() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearDisplayStyleDay() => $_clearField(7);\n  @$pb.TagNumber(7)\n  UserItemStyle ensureDisplayStyleDay() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  UserItemStyle get displayStyleNight => $_getN(7);\n  @$pb.TagNumber(8)\n  set displayStyleNight(UserItemStyle value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasDisplayStyleNight() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearDisplayStyleNight() => $_clearField(8);\n  @$pb.TagNumber(8)\n  UserItemStyle ensureDisplayStyleNight() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get styleId => $_getI64(8);\n  @$pb.TagNumber(9)\n  set styleId($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasStyleId() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearStyleId() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  LiveState get liveState => $_getN(9);\n  @$pb.TagNumber(10)\n  set liveState(LiveState value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasLiveState() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearLiveState() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.bool get separator => $_getBF(10);\n  @$pb.TagNumber(11)\n  set separator($core.bool value) => $_setBool(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasSeparator() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearSeparator() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get uri => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set uri($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasUri() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearUri() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.bool get isRecall => $_getBF(12);\n  @$pb.TagNumber(13)\n  set isRecall($core.bool value) => $_setBool(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasIsRecall() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearIsRecall() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  IconBadge get updateIcon => $_getN(13);\n  @$pb.TagNumber(14)\n  set updateIcon(IconBadge value) => $_setField(14, value);\n  @$pb.TagNumber(14)\n  $core.bool hasUpdateIcon() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearUpdateIcon() => $_clearField(14);\n  @$pb.TagNumber(14)\n  IconBadge ensureUpdateIcon() => $_ensure(13);\n\n  @$pb.TagNumber(15)\n  $core.String get liveRcmdReason => $_getSZ(14);\n  @$pb.TagNumber(15)\n  set liveRcmdReason($core.String value) => $_setString(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasLiveRcmdReason() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearLiveRcmdReason() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $core.String get liveCover => $_getSZ(15);\n  @$pb.TagNumber(16)\n  set liveCover($core.String value) => $_setString(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasLiveCover() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearLiveCover() => $_clearField(16);\n\n  @$pb.TagNumber(17)\n  $core.String get personalExtra => $_getSZ(16);\n  @$pb.TagNumber(17)\n  set personalExtra($core.String value) => $_setString(16, value);\n  @$pb.TagNumber(17)\n  $core.bool hasPersonalExtra() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearPersonalExtra() => $_clearField(17);\n\n  @$pb.TagNumber(18)\n  $core.String get updateIconType => $_getSZ(17);\n  @$pb.TagNumber(18)\n  set updateIconType($core.String value) => $_setString(17, value);\n  @$pb.TagNumber(18)\n  $core.bool hasUpdateIconType() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearUpdateIconType() => $_clearField(18);\n\n  @$pb.TagNumber(19)\n  $core.String get trackId => $_getSZ(18);\n  @$pb.TagNumber(19)\n  set trackId($core.String value) => $_setString(18, value);\n  @$pb.TagNumber(19)\n  $core.bool hasTrackId() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearTrackId() => $_clearField(19);\n\n  @$pb.TagNumber(20)\n  UpListTextBadge get textBadge => $_getN(19);\n  @$pb.TagNumber(20)\n  set textBadge(UpListTextBadge value) => $_setField(20, value);\n  @$pb.TagNumber(20)\n  $core.bool hasTextBadge() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearTextBadge() => $_clearField(20);\n  @$pb.TagNumber(20)\n  UpListTextBadge ensureTextBadge() => $_ensure(19);\n}\n\nclass UpListMoreLabel extends $pb.GeneratedMessage {\n  factory UpListMoreLabel({\n    $core.String? title,\n    $core.String? uri,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (uri != null) result.uri = uri;\n    return result;\n  }\n\n  UpListMoreLabel._();\n\n  factory UpListMoreLabel.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UpListMoreLabel.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UpListMoreLabel',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpListMoreLabel clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpListMoreLabel copyWith(void Function(UpListMoreLabel) updates) =>\n      super.copyWith((message) => updates(message as UpListMoreLabel))\n          as UpListMoreLabel;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UpListMoreLabel create() => UpListMoreLabel._();\n  @$core.override\n  UpListMoreLabel createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UpListMoreLabel getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UpListMoreLabel>(create);\n  static UpListMoreLabel? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n}\n\nclass UpListTextBadge extends $pb.GeneratedMessage {\n  factory UpListTextBadge({\n    $core.String? text,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    return result;\n  }\n\n  UpListTextBadge._();\n\n  factory UpListTextBadge.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UpListTextBadge.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UpListTextBadge',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpListTextBadge clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpListTextBadge copyWith(void Function(UpListTextBadge) updates) =>\n      super.copyWith((message) => updates(message as UpListTextBadge))\n          as UpListTextBadge;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UpListTextBadge create() => UpListTextBadge._();\n  @$core.override\n  UpListTextBadge createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UpListTextBadge getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UpListTextBadge>(create);\n  static UpListTextBadge? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n}\n\nclass UpdateTabSettingReq extends $pb.GeneratedMessage {\n  factory UpdateTabSettingReq({\n    HomePageTabSttingStatus? status,\n  }) {\n    final result = create();\n    if (status != null) result.status = status;\n    return result;\n  }\n\n  UpdateTabSettingReq._();\n\n  factory UpdateTabSettingReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UpdateTabSettingReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UpdateTabSettingReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aE<HomePageTabSttingStatus>(1, _omitFieldNames ? '' : 'status',\n        enumValues: HomePageTabSttingStatus.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpdateTabSettingReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpdateTabSettingReq copyWith(void Function(UpdateTabSettingReq) updates) =>\n      super.copyWith((message) => updates(message as UpdateTabSettingReq))\n          as UpdateTabSettingReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UpdateTabSettingReq create() => UpdateTabSettingReq._();\n  @$core.override\n  UpdateTabSettingReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UpdateTabSettingReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UpdateTabSettingReq>(create);\n  static UpdateTabSettingReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  HomePageTabSttingStatus get status => $_getN(0);\n  @$pb.TagNumber(1)\n  set status(HomePageTabSttingStatus value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStatus() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStatus() => $_clearField(1);\n}\n\nclass UserInfo extends $pb.GeneratedMessage {\n  factory UserInfo({\n    $fixnum.Int64? mid,\n    $core.String? name,\n    $core.String? face,\n    OfficialVerify? official,\n    VipInfo? vip,\n    LiveInfo? live,\n    $core.String? uri,\n    UserPendant? pendant,\n    Nameplate? nameplate,\n    $core.int? level,\n    $core.String? sign,\n    $core.int? faceNft,\n    $core.int? faceNftNew,\n    NFTInfo? nftInfo,\n    $core.int? isSeniorMember,\n    $2.AvatarItem? avatar,\n    $3.NameRender? nameRender,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (name != null) result.name = name;\n    if (face != null) result.face = face;\n    if (official != null) result.official = official;\n    if (vip != null) result.vip = vip;\n    if (live != null) result.live = live;\n    if (uri != null) result.uri = uri;\n    if (pendant != null) result.pendant = pendant;\n    if (nameplate != null) result.nameplate = nameplate;\n    if (level != null) result.level = level;\n    if (sign != null) result.sign = sign;\n    if (faceNft != null) result.faceNft = faceNft;\n    if (faceNftNew != null) result.faceNftNew = faceNftNew;\n    if (nftInfo != null) result.nftInfo = nftInfo;\n    if (isSeniorMember != null) result.isSeniorMember = isSeniorMember;\n    if (avatar != null) result.avatar = avatar;\n    if (nameRender != null) result.nameRender = nameRender;\n    return result;\n  }\n\n  UserInfo._();\n\n  factory UserInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UserInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UserInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'face')\n    ..aOM<OfficialVerify>(4, _omitFieldNames ? '' : 'official',\n        subBuilder: OfficialVerify.create)\n    ..aOM<VipInfo>(5, _omitFieldNames ? '' : 'vip', subBuilder: VipInfo.create)\n    ..aOM<LiveInfo>(6, _omitFieldNames ? '' : 'live',\n        subBuilder: LiveInfo.create)\n    ..aOS(7, _omitFieldNames ? '' : 'uri')\n    ..aOM<UserPendant>(8, _omitFieldNames ? '' : 'pendant',\n        subBuilder: UserPendant.create)\n    ..aOM<Nameplate>(9, _omitFieldNames ? '' : 'nameplate',\n        subBuilder: Nameplate.create)\n    ..aI(10, _omitFieldNames ? '' : 'level')\n    ..aOS(11, _omitFieldNames ? '' : 'sign')\n    ..aI(12, _omitFieldNames ? '' : 'faceNft')\n    ..aI(13, _omitFieldNames ? '' : 'faceNftNew')\n    ..aOM<NFTInfo>(14, _omitFieldNames ? '' : 'nftInfo',\n        subBuilder: NFTInfo.create)\n    ..aI(15, _omitFieldNames ? '' : 'isSeniorMember')\n    ..aOM<$2.AvatarItem>(16, _omitFieldNames ? '' : 'avatar',\n        subBuilder: $2.AvatarItem.create)\n    ..aOM<$3.NameRender>(17, _omitFieldNames ? '' : 'nameRender',\n        subBuilder: $3.NameRender.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserInfo copyWith(void Function(UserInfo) updates) =>\n      super.copyWith((message) => updates(message as UserInfo)) as UserInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UserInfo create() => UserInfo._();\n  @$core.override\n  UserInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UserInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<UserInfo>(create);\n  static UserInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get face => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set face($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFace() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFace() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  OfficialVerify get official => $_getN(3);\n  @$pb.TagNumber(4)\n  set official(OfficialVerify value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasOfficial() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearOfficial() => $_clearField(4);\n  @$pb.TagNumber(4)\n  OfficialVerify ensureOfficial() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  VipInfo get vip => $_getN(4);\n  @$pb.TagNumber(5)\n  set vip(VipInfo value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasVip() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearVip() => $_clearField(5);\n  @$pb.TagNumber(5)\n  VipInfo ensureVip() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  LiveInfo get live => $_getN(5);\n  @$pb.TagNumber(6)\n  set live(LiveInfo value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasLive() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearLive() => $_clearField(6);\n  @$pb.TagNumber(6)\n  LiveInfo ensureLive() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $core.String get uri => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set uri($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasUri() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearUri() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  UserPendant get pendant => $_getN(7);\n  @$pb.TagNumber(8)\n  set pendant(UserPendant value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasPendant() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearPendant() => $_clearField(8);\n  @$pb.TagNumber(8)\n  UserPendant ensurePendant() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  Nameplate get nameplate => $_getN(8);\n  @$pb.TagNumber(9)\n  set nameplate(Nameplate value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasNameplate() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearNameplate() => $_clearField(9);\n  @$pb.TagNumber(9)\n  Nameplate ensureNameplate() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  $core.int get level => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set level($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasLevel() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearLevel() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get sign => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set sign($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasSign() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearSign() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.int get faceNft => $_getIZ(11);\n  @$pb.TagNumber(12)\n  set faceNft($core.int value) => $_setSignedInt32(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasFaceNft() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearFaceNft() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.int get faceNftNew => $_getIZ(12);\n  @$pb.TagNumber(13)\n  set faceNftNew($core.int value) => $_setSignedInt32(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasFaceNftNew() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearFaceNftNew() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  NFTInfo get nftInfo => $_getN(13);\n  @$pb.TagNumber(14)\n  set nftInfo(NFTInfo value) => $_setField(14, value);\n  @$pb.TagNumber(14)\n  $core.bool hasNftInfo() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearNftInfo() => $_clearField(14);\n  @$pb.TagNumber(14)\n  NFTInfo ensureNftInfo() => $_ensure(13);\n\n  @$pb.TagNumber(15)\n  $core.int get isSeniorMember => $_getIZ(14);\n  @$pb.TagNumber(15)\n  set isSeniorMember($core.int value) => $_setSignedInt32(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasIsSeniorMember() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearIsSeniorMember() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $2.AvatarItem get avatar => $_getN(15);\n  @$pb.TagNumber(16)\n  set avatar($2.AvatarItem value) => $_setField(16, value);\n  @$pb.TagNumber(16)\n  $core.bool hasAvatar() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearAvatar() => $_clearField(16);\n  @$pb.TagNumber(16)\n  $2.AvatarItem ensureAvatar() => $_ensure(15);\n\n  @$pb.TagNumber(17)\n  $3.NameRender get nameRender => $_getN(16);\n  @$pb.TagNumber(17)\n  set nameRender($3.NameRender value) => $_setField(17, value);\n  @$pb.TagNumber(17)\n  $core.bool hasNameRender() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearNameRender() => $_clearField(17);\n  @$pb.TagNumber(17)\n  $3.NameRender ensureNameRender() => $_ensure(16);\n}\n\nclass UserItemStyle extends $pb.GeneratedMessage {\n  factory UserItemStyle({\n    $core.String? rectText,\n    $core.String? rectTextColor,\n    $core.String? rectIcon,\n    $core.String? rectBgColor,\n    $core.String? outerAnimation,\n  }) {\n    final result = create();\n    if (rectText != null) result.rectText = rectText;\n    if (rectTextColor != null) result.rectTextColor = rectTextColor;\n    if (rectIcon != null) result.rectIcon = rectIcon;\n    if (rectBgColor != null) result.rectBgColor = rectBgColor;\n    if (outerAnimation != null) result.outerAnimation = outerAnimation;\n    return result;\n  }\n\n  UserItemStyle._();\n\n  factory UserItemStyle.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UserItemStyle.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UserItemStyle',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'rectText')\n    ..aOS(2, _omitFieldNames ? '' : 'rectTextColor')\n    ..aOS(3, _omitFieldNames ? '' : 'rectIcon')\n    ..aOS(4, _omitFieldNames ? '' : 'rectBgColor')\n    ..aOS(5, _omitFieldNames ? '' : 'outerAnimation')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserItemStyle clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserItemStyle copyWith(void Function(UserItemStyle) updates) =>\n      super.copyWith((message) => updates(message as UserItemStyle))\n          as UserItemStyle;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UserItemStyle create() => UserItemStyle._();\n  @$core.override\n  UserItemStyle createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UserItemStyle getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UserItemStyle>(create);\n  static UserItemStyle? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get rectText => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set rectText($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasRectText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRectText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get rectTextColor => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set rectTextColor($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasRectTextColor() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRectTextColor() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get rectIcon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set rectIcon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRectIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRectIcon() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get rectBgColor => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set rectBgColor($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasRectBgColor() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearRectBgColor() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get outerAnimation => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set outerAnimation($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasOuterAnimation() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearOuterAnimation() => $_clearField(5);\n}\n\nclass UserPendant extends $pb.GeneratedMessage {\n  factory UserPendant({\n    $fixnum.Int64? pid,\n    $core.String? name,\n    $core.String? image,\n    $fixnum.Int64? expire,\n  }) {\n    final result = create();\n    if (pid != null) result.pid = pid;\n    if (name != null) result.name = name;\n    if (image != null) result.image = image;\n    if (expire != null) result.expire = expire;\n    return result;\n  }\n\n  UserPendant._();\n\n  factory UserPendant.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UserPendant.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UserPendant',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'pid')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'image')\n    ..aInt64(4, _omitFieldNames ? '' : 'expire')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserPendant clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserPendant copyWith(void Function(UserPendant) updates) =>\n      super.copyWith((message) => updates(message as UserPendant))\n          as UserPendant;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UserPendant create() => UserPendant._();\n  @$core.override\n  UserPendant createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UserPendant getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UserPendant>(create);\n  static UserPendant? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get pid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set pid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get image => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set image($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasImage() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearImage() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get expire => $_getI64(3);\n  @$pb.TagNumber(4)\n  set expire($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasExpire() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearExpire() => $_clearField(4);\n}\n\nclass VideoBadge extends $pb.GeneratedMessage {\n  factory VideoBadge({\n    $core.String? text,\n    $core.String? textColor,\n    $core.String? textColorNight,\n    $core.String? bgColor,\n    $core.String? bgColorNight,\n    $core.String? borderColor,\n    $core.String? borderColorNight,\n    $core.int? bgStyle,\n    $core.int? bgAlpha,\n    $core.int? bgAlphaNight,\n    $core.String? headIcon,\n    IconResLocal? headIconLocal,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (textColor != null) result.textColor = textColor;\n    if (textColorNight != null) result.textColorNight = textColorNight;\n    if (bgColor != null) result.bgColor = bgColor;\n    if (bgColorNight != null) result.bgColorNight = bgColorNight;\n    if (borderColor != null) result.borderColor = borderColor;\n    if (borderColorNight != null) result.borderColorNight = borderColorNight;\n    if (bgStyle != null) result.bgStyle = bgStyle;\n    if (bgAlpha != null) result.bgAlpha = bgAlpha;\n    if (bgAlphaNight != null) result.bgAlphaNight = bgAlphaNight;\n    if (headIcon != null) result.headIcon = headIcon;\n    if (headIconLocal != null) result.headIconLocal = headIconLocal;\n    return result;\n  }\n\n  VideoBadge._();\n\n  factory VideoBadge.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory VideoBadge.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'VideoBadge',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aOS(2, _omitFieldNames ? '' : 'textColor')\n    ..aOS(3, _omitFieldNames ? '' : 'textColorNight')\n    ..aOS(4, _omitFieldNames ? '' : 'bgColor')\n    ..aOS(5, _omitFieldNames ? '' : 'bgColorNight')\n    ..aOS(6, _omitFieldNames ? '' : 'borderColor')\n    ..aOS(7, _omitFieldNames ? '' : 'borderColorNight')\n    ..aI(8, _omitFieldNames ? '' : 'bgStyle')\n    ..aI(9, _omitFieldNames ? '' : 'bgAlpha')\n    ..aI(10, _omitFieldNames ? '' : 'bgAlphaNight')\n    ..aOS(11, _omitFieldNames ? '' : 'headIcon')\n    ..aE<IconResLocal>(12, _omitFieldNames ? '' : 'headIconLocal',\n        enumValues: IconResLocal.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VideoBadge clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VideoBadge copyWith(void Function(VideoBadge) updates) =>\n      super.copyWith((message) => updates(message as VideoBadge)) as VideoBadge;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static VideoBadge create() => VideoBadge._();\n  @$core.override\n  VideoBadge createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static VideoBadge getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<VideoBadge>(create);\n  static VideoBadge? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get textColor => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set textColor($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTextColor() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTextColor() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get textColorNight => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set textColorNight($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTextColorNight() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTextColorNight() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get bgColor => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set bgColor($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBgColor() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBgColor() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get bgColorNight => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set bgColorNight($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBgColorNight() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBgColorNight() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get borderColor => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set borderColor($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasBorderColor() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearBorderColor() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get borderColorNight => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set borderColorNight($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBorderColorNight() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBorderColorNight() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get bgStyle => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set bgStyle($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasBgStyle() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearBgStyle() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.int get bgAlpha => $_getIZ(8);\n  @$pb.TagNumber(9)\n  set bgAlpha($core.int value) => $_setSignedInt32(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasBgAlpha() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearBgAlpha() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.int get bgAlphaNight => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set bgAlphaNight($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasBgAlphaNight() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearBgAlphaNight() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get headIcon => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set headIcon($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasHeadIcon() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearHeadIcon() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  IconResLocal get headIconLocal => $_getN(11);\n  @$pb.TagNumber(12)\n  set headIconLocal(IconResLocal value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasHeadIconLocal() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearHeadIconLocal() => $_clearField(12);\n}\n\nclass VipInfo extends $pb.GeneratedMessage {\n  factory VipInfo({\n    $core.int? type,\n    $core.int? status,\n    $fixnum.Int64? dueDate,\n    VipLabel? label,\n    $core.int? themeType,\n    $core.int? avatarSubscript,\n    $core.String? nicknameColor,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (status != null) result.status = status;\n    if (dueDate != null) result.dueDate = dueDate;\n    if (label != null) result.label = label;\n    if (themeType != null) result.themeType = themeType;\n    if (avatarSubscript != null) result.avatarSubscript = avatarSubscript;\n    if (nicknameColor != null) result.nicknameColor = nicknameColor;\n    return result;\n  }\n\n  VipInfo._();\n\n  factory VipInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory VipInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'VipInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'type')\n    ..aI(2, _omitFieldNames ? '' : 'status')\n    ..aInt64(3, _omitFieldNames ? '' : 'dueDate')\n    ..aOM<VipLabel>(4, _omitFieldNames ? '' : 'label',\n        subBuilder: VipLabel.create)\n    ..aI(5, _omitFieldNames ? '' : 'themeType')\n    ..aI(6, _omitFieldNames ? '' : 'avatarSubscript')\n    ..aOS(7, _omitFieldNames ? '' : 'nicknameColor')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VipInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VipInfo copyWith(void Function(VipInfo) updates) =>\n      super.copyWith((message) => updates(message as VipInfo)) as VipInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static VipInfo create() => VipInfo._();\n  @$core.override\n  VipInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static VipInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<VipInfo>(create);\n  static VipInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get type => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set type($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get status => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set status($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasStatus() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearStatus() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get dueDate => $_getI64(2);\n  @$pb.TagNumber(3)\n  set dueDate($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDueDate() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDueDate() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  VipLabel get label => $_getN(3);\n  @$pb.TagNumber(4)\n  set label(VipLabel value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLabel() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLabel() => $_clearField(4);\n  @$pb.TagNumber(4)\n  VipLabel ensureLabel() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.int get themeType => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set themeType($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasThemeType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearThemeType() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get avatarSubscript => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set avatarSubscript($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasAvatarSubscript() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearAvatarSubscript() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get nicknameColor => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set nicknameColor($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasNicknameColor() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearNicknameColor() => $_clearField(7);\n}\n\nclass VipLabel extends $pb.GeneratedMessage {\n  factory VipLabel({\n    $core.String? path,\n    $core.String? text,\n    $core.String? labelTheme,\n  }) {\n    final result = create();\n    if (path != null) result.path = path;\n    if (text != null) result.text = text;\n    if (labelTheme != null) result.labelTheme = labelTheme;\n    return result;\n  }\n\n  VipLabel._();\n\n  factory VipLabel.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory VipLabel.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'VipLabel',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'path')\n    ..aOS(2, _omitFieldNames ? '' : 'text')\n    ..aOS(3, _omitFieldNames ? '' : 'labelTheme')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VipLabel clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VipLabel copyWith(void Function(VipLabel) updates) =>\n      super.copyWith((message) => updates(message as VipLabel)) as VipLabel;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static VipLabel create() => VipLabel._();\n  @$core.override\n  VipLabel createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static VipLabel getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<VipLabel>(create);\n  static VipLabel? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get path => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set path($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPath() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPath() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get labelTheme => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set labelTheme($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLabelTheme() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLabelTheme() => $_clearField(3);\n}\n\nclass WFItemDefault extends $pb.GeneratedMessage {\n  factory WFItemDefault({\n    $core.String? title,\n    $core.String? cover,\n    CoverIconWithText? bottomLeft1,\n    CoverIconWithText? bottomLeft2,\n    CoverIconWithText? bottomRight1,\n    $core.String? uri,\n    RcmdReason? rcmdReason,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? annotations,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (bottomLeft1 != null) result.bottomLeft1 = bottomLeft1;\n    if (bottomLeft2 != null) result.bottomLeft2 = bottomLeft2;\n    if (bottomRight1 != null) result.bottomRight1 = bottomRight1;\n    if (uri != null) result.uri = uri;\n    if (rcmdReason != null) result.rcmdReason = rcmdReason;\n    if (annotations != null) result.annotations.addEntries(annotations);\n    return result;\n  }\n\n  WFItemDefault._();\n\n  factory WFItemDefault.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory WFItemDefault.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'WFItemDefault',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'cover')\n    ..aOM<CoverIconWithText>(3, _omitFieldNames ? '' : 'bottomLeft1',\n        subBuilder: CoverIconWithText.create)\n    ..aOM<CoverIconWithText>(4, _omitFieldNames ? '' : 'bottomLeft2',\n        subBuilder: CoverIconWithText.create)\n    ..aOM<CoverIconWithText>(5, _omitFieldNames ? '' : 'bottomRight1',\n        subBuilder: CoverIconWithText.create)\n    ..aOS(6, _omitFieldNames ? '' : 'uri')\n    ..aOM<RcmdReason>(7, _omitFieldNames ? '' : 'rcmdReason',\n        subBuilder: RcmdReason.create)\n    ..m<$core.String, $core.String>(8, _omitFieldNames ? '' : 'annotations',\n        entryClassName: 'WFItemDefault.AnnotationsEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.dynamic.v2'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  WFItemDefault clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  WFItemDefault copyWith(void Function(WFItemDefault) updates) =>\n      super.copyWith((message) => updates(message as WFItemDefault))\n          as WFItemDefault;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static WFItemDefault create() => WFItemDefault._();\n  @$core.override\n  WFItemDefault createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static WFItemDefault getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<WFItemDefault>(create);\n  static WFItemDefault? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get cover => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cover($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCover() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCover() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  CoverIconWithText get bottomLeft1 => $_getN(2);\n  @$pb.TagNumber(3)\n  set bottomLeft1(CoverIconWithText value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBottomLeft1() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBottomLeft1() => $_clearField(3);\n  @$pb.TagNumber(3)\n  CoverIconWithText ensureBottomLeft1() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  CoverIconWithText get bottomLeft2 => $_getN(3);\n  @$pb.TagNumber(4)\n  set bottomLeft2(CoverIconWithText value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBottomLeft2() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBottomLeft2() => $_clearField(4);\n  @$pb.TagNumber(4)\n  CoverIconWithText ensureBottomLeft2() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  CoverIconWithText get bottomRight1 => $_getN(4);\n  @$pb.TagNumber(5)\n  set bottomRight1(CoverIconWithText value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBottomRight1() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBottomRight1() => $_clearField(5);\n  @$pb.TagNumber(5)\n  CoverIconWithText ensureBottomRight1() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.String get uri => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set uri($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasUri() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearUri() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  RcmdReason get rcmdReason => $_getN(6);\n  @$pb.TagNumber(7)\n  set rcmdReason(RcmdReason value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasRcmdReason() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearRcmdReason() => $_clearField(7);\n  @$pb.TagNumber(7)\n  RcmdReason ensureRcmdReason() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  $pb.PbMap<$core.String, $core.String> get annotations => $_getMap(7);\n}\n\nclass WaterFlowRcmdReq extends $pb.GeneratedMessage {\n  factory WaterFlowRcmdReq({\n    $fixnum.Int64? campusId,\n    $7.FeedPagination? page,\n    $1.PlayerArgs? playerArgs,\n    CampusRcmdReqFrom? from,\n  }) {\n    final result = create();\n    if (campusId != null) result.campusId = campusId;\n    if (page != null) result.page = page;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    if (from != null) result.from = from;\n    return result;\n  }\n\n  WaterFlowRcmdReq._();\n\n  factory WaterFlowRcmdReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory WaterFlowRcmdReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'WaterFlowRcmdReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'campusId')\n    ..aOM<$7.FeedPagination>(2, _omitFieldNames ? '' : 'page',\n        subBuilder: $7.FeedPagination.create)\n    ..aOM<$1.PlayerArgs>(3, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $1.PlayerArgs.create)\n    ..aE<CampusRcmdReqFrom>(4, _omitFieldNames ? '' : 'from',\n        enumValues: CampusRcmdReqFrom.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  WaterFlowRcmdReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  WaterFlowRcmdReq copyWith(void Function(WaterFlowRcmdReq) updates) =>\n      super.copyWith((message) => updates(message as WaterFlowRcmdReq))\n          as WaterFlowRcmdReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static WaterFlowRcmdReq create() => WaterFlowRcmdReq._();\n  @$core.override\n  WaterFlowRcmdReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static WaterFlowRcmdReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<WaterFlowRcmdReq>(create);\n  static WaterFlowRcmdReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get campusId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set campusId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCampusId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCampusId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $7.FeedPagination get page => $_getN(1);\n  @$pb.TagNumber(2)\n  set page($7.FeedPagination value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPage() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPage() => $_clearField(2);\n  @$pb.TagNumber(2)\n  $7.FeedPagination ensurePage() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $1.PlayerArgs get playerArgs => $_getN(2);\n  @$pb.TagNumber(3)\n  set playerArgs($1.PlayerArgs value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPlayerArgs() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPlayerArgs() => $_clearField(3);\n  @$pb.TagNumber(3)\n  $1.PlayerArgs ensurePlayerArgs() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  CampusRcmdReqFrom get from => $_getN(3);\n  @$pb.TagNumber(4)\n  set from(CampusRcmdReqFrom value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFrom() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFrom() => $_clearField(4);\n}\n\nclass WaterFlowRcmdResp extends $pb.GeneratedMessage {\n  factory WaterFlowRcmdResp({\n    $core.Iterable<CampusWaterFlowItem>? items,\n    $7.FeedPaginationReply? offset,\n  }) {\n    final result = create();\n    if (items != null) result.items.addAll(items);\n    if (offset != null) result.offset = offset;\n    return result;\n  }\n\n  WaterFlowRcmdResp._();\n\n  factory WaterFlowRcmdResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory WaterFlowRcmdResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'WaterFlowRcmdResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..pPM<CampusWaterFlowItem>(1, _omitFieldNames ? '' : 'items',\n        subBuilder: CampusWaterFlowItem.create)\n    ..aOM<$7.FeedPaginationReply>(2, _omitFieldNames ? '' : 'offset',\n        subBuilder: $7.FeedPaginationReply.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  WaterFlowRcmdResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  WaterFlowRcmdResp copyWith(void Function(WaterFlowRcmdResp) updates) =>\n      super.copyWith((message) => updates(message as WaterFlowRcmdResp))\n          as WaterFlowRcmdResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static WaterFlowRcmdResp create() => WaterFlowRcmdResp._();\n  @$core.override\n  WaterFlowRcmdResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static WaterFlowRcmdResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<WaterFlowRcmdResp>(create);\n  static WaterFlowRcmdResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<CampusWaterFlowItem> get items => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $7.FeedPaginationReply get offset => $_getN(1);\n  @$pb.TagNumber(2)\n  set offset($7.FeedPaginationReply value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOffset() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOffset() => $_clearField(2);\n  @$pb.TagNumber(2)\n  $7.FeedPaginationReply ensureOffset() => $_ensure(1);\n}\n\nclass Weight extends $pb.GeneratedMessage {\n  factory Weight({\n    $core.String? title,\n    $core.Iterable<WeightItem>? items,\n    $core.String? icon,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (items != null) result.items.addAll(items);\n    if (icon != null) result.icon = icon;\n    return result;\n  }\n\n  Weight._();\n\n  factory Weight.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Weight.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Weight',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..pPM<WeightItem>(2, _omitFieldNames ? '' : 'items',\n        subBuilder: WeightItem.create)\n    ..aOS(3, _omitFieldNames ? '' : 'icon')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Weight clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Weight copyWith(void Function(Weight) updates) =>\n      super.copyWith((message) => updates(message as Weight)) as Weight;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Weight create() => Weight._();\n  @$core.override\n  Weight createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Weight getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Weight>(create);\n  static Weight? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<WeightItem> get items => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $core.String get icon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set icon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIcon() => $_clearField(3);\n}\n\nclass WeightButton extends $pb.GeneratedMessage {\n  factory WeightButton({\n    $core.String? jumpUrl,\n    $core.String? title,\n  }) {\n    final result = create();\n    if (jumpUrl != null) result.jumpUrl = jumpUrl;\n    if (title != null) result.title = title;\n    return result;\n  }\n\n  WeightButton._();\n\n  factory WeightButton.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory WeightButton.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'WeightButton',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'jumpUrl')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  WeightButton clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  WeightButton copyWith(void Function(WeightButton) updates) =>\n      super.copyWith((message) => updates(message as WeightButton))\n          as WeightButton;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static WeightButton create() => WeightButton._();\n  @$core.override\n  WeightButton createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static WeightButton getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<WeightButton>(create);\n  static WeightButton? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get jumpUrl => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set jumpUrl($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasJumpUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearJumpUrl() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n}\n\nclass WeightDislike extends $pb.GeneratedMessage {\n  factory WeightDislike({\n    $core.String? feedBackType,\n    $core.String? title,\n    $core.String? feedBackBizValue,\n  }) {\n    final result = create();\n    if (feedBackType != null) result.feedBackType = feedBackType;\n    if (title != null) result.title = title;\n    if (feedBackBizValue != null) result.feedBackBizValue = feedBackBizValue;\n    return result;\n  }\n\n  WeightDislike._();\n\n  factory WeightDislike.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory WeightDislike.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'WeightDislike',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'feedBackType')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'feedBackBizValue')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  WeightDislike clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  WeightDislike copyWith(void Function(WeightDislike) updates) =>\n      super.copyWith((message) => updates(message as WeightDislike))\n          as WeightDislike;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static WeightDislike create() => WeightDislike._();\n  @$core.override\n  WeightDislike createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static WeightDislike getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<WeightDislike>(create);\n  static WeightDislike? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get feedBackType => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set feedBackType($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFeedBackType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFeedBackType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get feedBackBizValue => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set feedBackBizValue($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFeedBackBizValue() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFeedBackBizValue() => $_clearField(3);\n}\n\nenum WeightItem_Item { button, dislike, notSet }\n\nclass WeightItem extends $pb.GeneratedMessage {\n  factory WeightItem({\n    WeightType? type,\n    WeightButton? button,\n    WeightDislike? dislike,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (button != null) result.button = button;\n    if (dislike != null) result.dislike = dislike;\n    return result;\n  }\n\n  WeightItem._();\n\n  factory WeightItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory WeightItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, WeightItem_Item> _WeightItem_ItemByTag = {\n    2: WeightItem_Item.button,\n    3: WeightItem_Item.dislike,\n    0: WeightItem_Item.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'WeightItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..oo(0, [2, 3])\n    ..aE<WeightType>(1, _omitFieldNames ? '' : 'type',\n        enumValues: WeightType.values)\n    ..aOM<WeightButton>(2, _omitFieldNames ? '' : 'button',\n        subBuilder: WeightButton.create)\n    ..aOM<WeightDislike>(3, _omitFieldNames ? '' : 'dislike',\n        subBuilder: WeightDislike.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  WeightItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  WeightItem copyWith(void Function(WeightItem) updates) =>\n      super.copyWith((message) => updates(message as WeightItem)) as WeightItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static WeightItem create() => WeightItem._();\n  @$core.override\n  WeightItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static WeightItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<WeightItem>(create);\n  static WeightItem? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  WeightItem_Item whichItem() => _WeightItem_ItemByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  void clearItem() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  WeightType get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(WeightType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  WeightButton get button => $_getN(1);\n  @$pb.TagNumber(2)\n  set button(WeightButton value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasButton() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearButton() => $_clearField(2);\n  @$pb.TagNumber(2)\n  WeightButton ensureButton() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  WeightDislike get dislike => $_getN(2);\n  @$pb.TagNumber(3)\n  set dislike(WeightDislike value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDislike() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDislike() => $_clearField(3);\n  @$pb.TagNumber(3)\n  WeightDislike ensureDislike() => $_ensure(2);\n}\n\nclass WordNode_UnderlineStyle extends $pb.GeneratedMessage {\n  factory WordNode_UnderlineStyle({\n    $core.double? underlineWidth,\n    Colors? underlineColor,\n  }) {\n    final result = create();\n    if (underlineWidth != null) result.underlineWidth = underlineWidth;\n    if (underlineColor != null) result.underlineColor = underlineColor;\n    return result;\n  }\n\n  WordNode_UnderlineStyle._();\n\n  factory WordNode_UnderlineStyle.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory WordNode_UnderlineStyle.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'WordNode.UnderlineStyle',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aD(1, _omitFieldNames ? '' : 'underlineWidth')\n    ..aOM<Colors>(2, _omitFieldNames ? '' : 'underlineColor',\n        subBuilder: Colors.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  WordNode_UnderlineStyle clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  WordNode_UnderlineStyle copyWith(\n          void Function(WordNode_UnderlineStyle) updates) =>\n      super.copyWith((message) => updates(message as WordNode_UnderlineStyle))\n          as WordNode_UnderlineStyle;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static WordNode_UnderlineStyle create() => WordNode_UnderlineStyle._();\n  @$core.override\n  WordNode_UnderlineStyle createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static WordNode_UnderlineStyle getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<WordNode_UnderlineStyle>(create);\n  static WordNode_UnderlineStyle? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.double get underlineWidth => $_getN(0);\n  @$pb.TagNumber(1)\n  set underlineWidth($core.double value) => $_setDouble(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUnderlineWidth() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUnderlineWidth() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  Colors get underlineColor => $_getN(1);\n  @$pb.TagNumber(2)\n  set underlineColor(Colors value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUnderlineColor() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUnderlineColor() => $_clearField(2);\n  @$pb.TagNumber(2)\n  Colors ensureUnderlineColor() => $_ensure(1);\n}\n\nclass WordNode_WordNodeStyle extends $pb.GeneratedMessage {\n  factory WordNode_WordNodeStyle({\n    $core.bool? bold,\n    $core.bool? italic,\n    $core.bool? strikethrough,\n    $core.bool? underline,\n  }) {\n    final result = create();\n    if (bold != null) result.bold = bold;\n    if (italic != null) result.italic = italic;\n    if (strikethrough != null) result.strikethrough = strikethrough;\n    if (underline != null) result.underline = underline;\n    return result;\n  }\n\n  WordNode_WordNodeStyle._();\n\n  factory WordNode_WordNodeStyle.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory WordNode_WordNodeStyle.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'WordNode.WordNodeStyle',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'bold')\n    ..aOB(2, _omitFieldNames ? '' : 'italic')\n    ..aOB(3, _omitFieldNames ? '' : 'strikethrough')\n    ..aOB(4, _omitFieldNames ? '' : 'underline')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  WordNode_WordNodeStyle clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  WordNode_WordNodeStyle copyWith(\n          void Function(WordNode_WordNodeStyle) updates) =>\n      super.copyWith((message) => updates(message as WordNode_WordNodeStyle))\n          as WordNode_WordNodeStyle;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static WordNode_WordNodeStyle create() => WordNode_WordNodeStyle._();\n  @$core.override\n  WordNode_WordNodeStyle createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static WordNode_WordNodeStyle getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<WordNode_WordNodeStyle>(create);\n  static WordNode_WordNodeStyle? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get bold => $_getBF(0);\n  @$pb.TagNumber(1)\n  set bold($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBold() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBold() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get italic => $_getBF(1);\n  @$pb.TagNumber(2)\n  set italic($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasItalic() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearItalic() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get strikethrough => $_getBF(2);\n  @$pb.TagNumber(3)\n  set strikethrough($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasStrikethrough() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearStrikethrough() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get underline => $_getBF(3);\n  @$pb.TagNumber(4)\n  set underline($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUnderline() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUnderline() => $_clearField(4);\n}\n\nclass WordNode extends $pb.GeneratedMessage {\n  factory WordNode({\n    $core.String? words,\n    $core.double? fontSize,\n    Colors? color,\n    WordNode_WordNodeStyle? style,\n    WordNode_UnderlineStyle? underlineStyle,\n    $core.String? fontLevel,\n  }) {\n    final result = create();\n    if (words != null) result.words = words;\n    if (fontSize != null) result.fontSize = fontSize;\n    if (color != null) result.color = color;\n    if (style != null) result.style = style;\n    if (underlineStyle != null) result.underlineStyle = underlineStyle;\n    if (fontLevel != null) result.fontLevel = fontLevel;\n    return result;\n  }\n\n  WordNode._();\n\n  factory WordNode.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory WordNode.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'WordNode',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.dynamic.v2'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'words')\n    ..aD(2, _omitFieldNames ? '' : 'fontSize')\n    ..aOM<Colors>(3, _omitFieldNames ? '' : 'color', subBuilder: Colors.create)\n    ..aOM<WordNode_WordNodeStyle>(4, _omitFieldNames ? '' : 'style',\n        subBuilder: WordNode_WordNodeStyle.create)\n    ..aOM<WordNode_UnderlineStyle>(5, _omitFieldNames ? '' : 'underlineStyle',\n        subBuilder: WordNode_UnderlineStyle.create)\n    ..aOS(7, _omitFieldNames ? '' : 'fontLevel')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  WordNode clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  WordNode copyWith(void Function(WordNode) updates) =>\n      super.copyWith((message) => updates(message as WordNode)) as WordNode;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static WordNode create() => WordNode._();\n  @$core.override\n  WordNode createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static WordNode getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<WordNode>(create);\n  static WordNode? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get words => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set words($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasWords() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearWords() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.double get fontSize => $_getN(1);\n  @$pb.TagNumber(2)\n  set fontSize($core.double value) => $_setDouble(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFontSize() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFontSize() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  Colors get color => $_getN(2);\n  @$pb.TagNumber(3)\n  set color(Colors value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasColor() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearColor() => $_clearField(3);\n  @$pb.TagNumber(3)\n  Colors ensureColor() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  WordNode_WordNodeStyle get style => $_getN(3);\n  @$pb.TagNumber(4)\n  set style(WordNode_WordNodeStyle value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasStyle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearStyle() => $_clearField(4);\n  @$pb.TagNumber(4)\n  WordNode_WordNodeStyle ensureStyle() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  WordNode_UnderlineStyle get underlineStyle => $_getN(4);\n  @$pb.TagNumber(5)\n  set underlineStyle(WordNode_UnderlineStyle value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasUnderlineStyle() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearUnderlineStyle() => $_clearField(5);\n  @$pb.TagNumber(5)\n  WordNode_UnderlineStyle ensureUnderlineStyle() => $_ensure(4);\n\n  @$pb.TagNumber(7)\n  $core.String get fontLevel => $_getSZ(5);\n  @$pb.TagNumber(7)\n  set fontLevel($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(7)\n  $core.bool hasFontLevel() => $_has(5);\n  @$pb.TagNumber(7)\n  void clearFontLevel() => $_clearField(7);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/dynamic/v2.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/dynamic/v2.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nclass AddButtonBgStyle extends $pb.ProtobufEnum {\n  static const AddButtonBgStyle fill =\n      AddButtonBgStyle._(0, _omitEnumNames ? '' : 'fill');\n  static const AddButtonBgStyle stroke =\n      AddButtonBgStyle._(1, _omitEnumNames ? '' : 'stroke');\n  static const AddButtonBgStyle gray =\n      AddButtonBgStyle._(2, _omitEnumNames ? '' : 'gray');\n\n  static const $core.List<AddButtonBgStyle> values = <AddButtonBgStyle>[\n    fill,\n    stroke,\n    gray,\n  ];\n\n  static final $core.List<AddButtonBgStyle?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static AddButtonBgStyle? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const AddButtonBgStyle._(super.value, super.name);\n}\n\nclass AddButtonType extends $pb.ProtobufEnum {\n  static const AddButtonType bt_none =\n      AddButtonType._(0, _omitEnumNames ? '' : 'bt_none');\n  static const AddButtonType bt_jump =\n      AddButtonType._(1, _omitEnumNames ? '' : 'bt_jump');\n  static const AddButtonType bt_button =\n      AddButtonType._(2, _omitEnumNames ? '' : 'bt_button');\n\n  static const $core.List<AddButtonType> values = <AddButtonType>[\n    bt_none,\n    bt_jump,\n    bt_button,\n  ];\n\n  static final $core.List<AddButtonType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static AddButtonType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const AddButtonType._(super.value, super.name);\n}\n\nclass AdditionVoteState extends $pb.ProtobufEnum {\n  static const AdditionVoteState addition_vote_state_none =\n      AdditionVoteState._(0, _omitEnumNames ? '' : 'addition_vote_state_none');\n  static const AdditionVoteState addition_vote_state_open =\n      AdditionVoteState._(1, _omitEnumNames ? '' : 'addition_vote_state_open');\n  static const AdditionVoteState addition_vote_state_close =\n      AdditionVoteState._(2, _omitEnumNames ? '' : 'addition_vote_state_close');\n\n  static const $core.List<AdditionVoteState> values = <AdditionVoteState>[\n    addition_vote_state_none,\n    addition_vote_state_open,\n    addition_vote_state_close,\n  ];\n\n  static final $core.List<AdditionVoteState?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static AdditionVoteState? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const AdditionVoteState._(super.value, super.name);\n}\n\nclass AdditionVoteType extends $pb.ProtobufEnum {\n  static const AdditionVoteType addition_vote_type_none =\n      AdditionVoteType._(0, _omitEnumNames ? '' : 'addition_vote_type_none');\n  static const AdditionVoteType addition_vote_type_word =\n      AdditionVoteType._(1, _omitEnumNames ? '' : 'addition_vote_type_word');\n  static const AdditionVoteType addition_vote_type_pic =\n      AdditionVoteType._(2, _omitEnumNames ? '' : 'addition_vote_type_pic');\n  static const AdditionVoteType addition_vote_type_default =\n      AdditionVoteType._(3, _omitEnumNames ? '' : 'addition_vote_type_default');\n\n  static const $core.List<AdditionVoteType> values = <AdditionVoteType>[\n    addition_vote_type_none,\n    addition_vote_type_word,\n    addition_vote_type_pic,\n    addition_vote_type_default,\n  ];\n\n  static final $core.List<AdditionVoteType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static AdditionVoteType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const AdditionVoteType._(super.value, super.name);\n}\n\nclass AdditionalButtonClickType extends $pb.ProtobufEnum {\n  static const AdditionalButtonClickType click_none =\n      AdditionalButtonClickType._(0, _omitEnumNames ? '' : 'click_none');\n  static const AdditionalButtonClickType click_up =\n      AdditionalButtonClickType._(1, _omitEnumNames ? '' : 'click_up');\n\n  static const $core.List<AdditionalButtonClickType> values =\n      <AdditionalButtonClickType>[\n    click_none,\n    click_up,\n  ];\n\n  static final $core.List<AdditionalButtonClickType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static AdditionalButtonClickType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const AdditionalButtonClickType._(super.value, super.name);\n}\n\nclass AdditionalButtonStatus extends $pb.ProtobufEnum {\n  static const AdditionalButtonStatus none =\n      AdditionalButtonStatus._(0, _omitEnumNames ? '' : 'none');\n  static const AdditionalButtonStatus uncheck =\n      AdditionalButtonStatus._(1, _omitEnumNames ? '' : 'uncheck');\n  static const AdditionalButtonStatus check =\n      AdditionalButtonStatus._(2, _omitEnumNames ? '' : 'check');\n\n  static const $core.List<AdditionalButtonStatus> values =\n      <AdditionalButtonStatus>[\n    none,\n    uncheck,\n    check,\n  ];\n\n  static final $core.List<AdditionalButtonStatus?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static AdditionalButtonStatus? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const AdditionalButtonStatus._(super.value, super.name);\n}\n\nclass AdditionalShareShowType extends $pb.ProtobufEnum {\n  static const AdditionalShareShowType st_none =\n      AdditionalShareShowType._(0, _omitEnumNames ? '' : 'st_none');\n  static const AdditionalShareShowType st_show =\n      AdditionalShareShowType._(1, _omitEnumNames ? '' : 'st_show');\n\n  static const $core.List<AdditionalShareShowType> values =\n      <AdditionalShareShowType>[\n    st_none,\n    st_show,\n  ];\n\n  static final $core.List<AdditionalShareShowType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static AdditionalShareShowType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const AdditionalShareShowType._(super.value, super.name);\n}\n\nclass AdditionalType extends $pb.ProtobufEnum {\n  static const AdditionalType additional_none =\n      AdditionalType._(0, _omitEnumNames ? '' : 'additional_none');\n  static const AdditionalType additional_type_pgc =\n      AdditionalType._(1, _omitEnumNames ? '' : 'additional_type_pgc');\n  static const AdditionalType additional_type_goods =\n      AdditionalType._(2, _omitEnumNames ? '' : 'additional_type_goods');\n  static const AdditionalType additional_type_vote =\n      AdditionalType._(3, _omitEnumNames ? '' : 'additional_type_vote');\n  static const AdditionalType additional_type_common =\n      AdditionalType._(4, _omitEnumNames ? '' : 'additional_type_common');\n  static const AdditionalType additional_type_esport =\n      AdditionalType._(5, _omitEnumNames ? '' : 'additional_type_esport');\n  static const AdditionalType additional_type_up_rcmd =\n      AdditionalType._(6, _omitEnumNames ? '' : 'additional_type_up_rcmd');\n  static const AdditionalType additional_type_ugc =\n      AdditionalType._(7, _omitEnumNames ? '' : 'additional_type_ugc');\n  static const AdditionalType additional_type_up_reservation = AdditionalType._(\n      8, _omitEnumNames ? '' : 'additional_type_up_reservation');\n  static const AdditionalType additional_type_article =\n      AdditionalType._(9, _omitEnumNames ? '' : 'additional_type_article');\n  static const AdditionalType additional_type_live_room =\n      AdditionalType._(10, _omitEnumNames ? '' : 'additional_type_live_room');\n  static const AdditionalType additional_type_music =\n      AdditionalType._(11, _omitEnumNames ? '' : 'additional_type_music');\n\n  static const $core.List<AdditionalType> values = <AdditionalType>[\n    additional_none,\n    additional_type_pgc,\n    additional_type_goods,\n    additional_type_vote,\n    additional_type_common,\n    additional_type_esport,\n    additional_type_up_rcmd,\n    additional_type_ugc,\n    additional_type_up_reservation,\n    additional_type_article,\n    additional_type_live_room,\n    additional_type_music,\n  ];\n\n  static final $core.List<AdditionalType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 11);\n  static AdditionalType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const AdditionalType._(super.value, super.name);\n}\n\nclass AuthorBadgeStyle extends $pb.ProtobufEnum {\n  static const AuthorBadgeStyle AUTHOR_BADGE_STYLE_INVALID =\n      AuthorBadgeStyle._(0, _omitEnumNames ? '' : 'AUTHOR_BADGE_STYLE_INVALID');\n  static const AuthorBadgeStyle AUTHOR_BADGE_STYLE_GRAY_OUTLINE =\n      AuthorBadgeStyle._(\n          1, _omitEnumNames ? '' : 'AUTHOR_BADGE_STYLE_GRAY_OUTLINE');\n\n  static const $core.List<AuthorBadgeStyle> values = <AuthorBadgeStyle>[\n    AUTHOR_BADGE_STYLE_INVALID,\n    AUTHOR_BADGE_STYLE_GRAY_OUTLINE,\n  ];\n\n  static final $core.List<AuthorBadgeStyle?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static AuthorBadgeStyle? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const AuthorBadgeStyle._(super.value, super.name);\n}\n\nclass CampusEntryType extends $pb.ProtobufEnum {\n  static const CampusEntryType NONE =\n      CampusEntryType._(0, _omitEnumNames ? '' : 'NONE');\n  static const CampusEntryType ENTRY_DYNAMIC =\n      CampusEntryType._(1, _omitEnumNames ? '' : 'ENTRY_DYNAMIC');\n  static const CampusEntryType ENTRY_HOME =\n      CampusEntryType._(2, _omitEnumNames ? '' : 'ENTRY_HOME');\n\n  static const $core.List<CampusEntryType> values = <CampusEntryType>[\n    NONE,\n    ENTRY_DYNAMIC,\n    ENTRY_HOME,\n  ];\n\n  static final $core.List<CampusEntryType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static CampusEntryType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const CampusEntryType._(super.value, super.name);\n}\n\nclass CampusHomePageType extends $pb.ProtobufEnum {\n  static const CampusHomePageType PAGE_MAJOR =\n      CampusHomePageType._(0, _omitEnumNames ? '' : 'PAGE_MAJOR');\n  static const CampusHomePageType PAGE_SUBORDINATE =\n      CampusHomePageType._(1, _omitEnumNames ? '' : 'PAGE_SUBORDINATE');\n  static const CampusHomePageType PAGE_MAJOR_DETAIL =\n      CampusHomePageType._(2, _omitEnumNames ? '' : 'PAGE_MAJOR_DETAIL');\n\n  static const $core.List<CampusHomePageType> values = <CampusHomePageType>[\n    PAGE_MAJOR,\n    PAGE_SUBORDINATE,\n    PAGE_MAJOR_DETAIL,\n  ];\n\n  static final $core.List<CampusHomePageType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static CampusHomePageType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const CampusHomePageType._(super.value, super.name);\n}\n\nclass CampusMngAuditStatus extends $pb.ProtobufEnum {\n  static const CampusMngAuditStatus campus_mng_audit_none =\n      CampusMngAuditStatus._(0, _omitEnumNames ? '' : 'campus_mng_audit_none');\n  static const CampusMngAuditStatus campus_mng_audit_in_process =\n      CampusMngAuditStatus._(\n          1, _omitEnumNames ? '' : 'campus_mng_audit_in_process');\n  static const CampusMngAuditStatus campus_mng_audit_failed =\n      CampusMngAuditStatus._(\n          2, _omitEnumNames ? '' : 'campus_mng_audit_failed');\n\n  static const $core.List<CampusMngAuditStatus> values = <CampusMngAuditStatus>[\n    campus_mng_audit_none,\n    campus_mng_audit_in_process,\n    campus_mng_audit_failed,\n  ];\n\n  static final $core.List<CampusMngAuditStatus?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static CampusMngAuditStatus? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const CampusMngAuditStatus._(super.value, super.name);\n}\n\nclass CampusMngItemType extends $pb.ProtobufEnum {\n  static const CampusMngItemType campus_mng_none =\n      CampusMngItemType._(0, _omitEnumNames ? '' : 'campus_mng_none');\n  static const CampusMngItemType campus_mng_basic_info =\n      CampusMngItemType._(1, _omitEnumNames ? '' : 'campus_mng_basic_info');\n  static const CampusMngItemType campus_mng_badge =\n      CampusMngItemType._(2, _omitEnumNames ? '' : 'campus_mng_badge');\n  static const CampusMngItemType campus_mng_slogan =\n      CampusMngItemType._(3, _omitEnumNames ? '' : 'campus_mng_slogan');\n  static const CampusMngItemType campus_mng_quiz =\n      CampusMngItemType._(4, _omitEnumNames ? '' : 'campus_mng_quiz');\n\n  static const $core.List<CampusMngItemType> values = <CampusMngItemType>[\n    campus_mng_none,\n    campus_mng_basic_info,\n    campus_mng_badge,\n    campus_mng_slogan,\n    campus_mng_quiz,\n  ];\n\n  static final $core.List<CampusMngItemType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 4);\n  static CampusMngItemType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const CampusMngItemType._(super.value, super.name);\n}\n\nclass CampusMngQuizAction extends $pb.ProtobufEnum {\n  static const CampusMngQuizAction campus_mng_quiz_act_list =\n      CampusMngQuizAction._(\n          0, _omitEnumNames ? '' : 'campus_mng_quiz_act_list');\n  static const CampusMngQuizAction campus_mng_quiz_act_add =\n      CampusMngQuizAction._(1, _omitEnumNames ? '' : 'campus_mng_quiz_act_add');\n  static const CampusMngQuizAction campus_mng_quiz_act_del =\n      CampusMngQuizAction._(2, _omitEnumNames ? '' : 'campus_mng_quiz_act_del');\n\n  static const $core.List<CampusMngQuizAction> values = <CampusMngQuizAction>[\n    campus_mng_quiz_act_list,\n    campus_mng_quiz_act_add,\n    campus_mng_quiz_act_del,\n  ];\n\n  static final $core.List<CampusMngQuizAction?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static CampusMngQuizAction? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const CampusMngQuizAction._(super.value, super.name);\n}\n\nclass CampusOnlineStatus extends $pb.ProtobufEnum {\n  static const CampusOnlineStatus campus_online_offline =\n      CampusOnlineStatus._(0, _omitEnumNames ? '' : 'campus_online_offline');\n  static const CampusOnlineStatus campus_online_online =\n      CampusOnlineStatus._(1, _omitEnumNames ? '' : 'campus_online_online');\n\n  static const $core.List<CampusOnlineStatus> values = <CampusOnlineStatus>[\n    campus_online_offline,\n    campus_online_online,\n  ];\n\n  static final $core.List<CampusOnlineStatus?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static CampusOnlineStatus? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const CampusOnlineStatus._(super.value, super.name);\n}\n\nclass CampusRcmdReqFrom extends $pb.ProtobufEnum {\n  static const CampusRcmdReqFrom CAMPUS_RCMD_FROM_UNKNOWN =\n      CampusRcmdReqFrom._(0, _omitEnumNames ? '' : 'CAMPUS_RCMD_FROM_UNKNOWN');\n  static const CampusRcmdReqFrom CAMPUS_RCMD_FROM_HOME_UN_OPEN =\n      CampusRcmdReqFrom._(\n          1, _omitEnumNames ? '' : 'CAMPUS_RCMD_FROM_HOME_UN_OPEN');\n  static const CampusRcmdReqFrom CAMPUS_RCMD_FROM_VISIT_OTHER =\n      CampusRcmdReqFrom._(\n          2, _omitEnumNames ? '' : 'CAMPUS_RCMD_FROM_VISIT_OTHER');\n  static const CampusRcmdReqFrom CAMPUS_RCMD_FROM_HOME_MOMENT =\n      CampusRcmdReqFrom._(\n          3, _omitEnumNames ? '' : 'CAMPUS_RCMD_FROM_HOME_MOMENT');\n  static const CampusRcmdReqFrom CAMPUS_RCMD_FROM_DYN_MOMENT =\n      CampusRcmdReqFrom._(\n          4, _omitEnumNames ? '' : 'CAMPUS_RCMD_FROM_DYN_MOMENT');\n  static const CampusRcmdReqFrom CAMPUS_RCMD_FROM_PAGE_SUBORDINATE_MOMENT =\n      CampusRcmdReqFrom._(\n          5, _omitEnumNames ? '' : 'CAMPUS_RCMD_FROM_PAGE_SUBORDINATE_MOMENT');\n\n  static const $core.List<CampusRcmdReqFrom> values = <CampusRcmdReqFrom>[\n    CAMPUS_RCMD_FROM_UNKNOWN,\n    CAMPUS_RCMD_FROM_HOME_UN_OPEN,\n    CAMPUS_RCMD_FROM_VISIT_OTHER,\n    CAMPUS_RCMD_FROM_HOME_MOMENT,\n    CAMPUS_RCMD_FROM_DYN_MOMENT,\n    CAMPUS_RCMD_FROM_PAGE_SUBORDINATE_MOMENT,\n  ];\n\n  static final $core.List<CampusRcmdReqFrom?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 5);\n  static CampusRcmdReqFrom? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const CampusRcmdReqFrom._(super.value, super.name);\n}\n\nclass CampusReqFromType extends $pb.ProtobufEnum {\n  static const CampusReqFromType DYNAMIC =\n      CampusReqFromType._(0, _omitEnumNames ? '' : 'DYNAMIC');\n  static const CampusReqFromType HOME =\n      CampusReqFromType._(1, _omitEnumNames ? '' : 'HOME');\n\n  static const $core.List<CampusReqFromType> values = <CampusReqFromType>[\n    DYNAMIC,\n    HOME,\n  ];\n\n  static final $core.List<CampusReqFromType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static CampusReqFromType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const CampusReqFromType._(super.value, super.name);\n}\n\nclass CampusTabType extends $pb.ProtobufEnum {\n  static const CampusTabType campus_none =\n      CampusTabType._(0, _omitEnumNames ? '' : 'campus_none');\n  static const CampusTabType campus_school =\n      CampusTabType._(1, _omitEnumNames ? '' : 'campus_school');\n  static const CampusTabType campus_dynamic =\n      CampusTabType._(2, _omitEnumNames ? '' : 'campus_dynamic');\n  static const CampusTabType campus_account =\n      CampusTabType._(3, _omitEnumNames ? '' : 'campus_account');\n  static const CampusTabType campus_billboard =\n      CampusTabType._(4, _omitEnumNames ? '' : 'campus_billboard');\n  static const CampusTabType campus_topic =\n      CampusTabType._(5, _omitEnumNames ? '' : 'campus_topic');\n  static const CampusTabType campues_other =\n      CampusTabType._(6, _omitEnumNames ? '' : 'campues_other');\n\n  static const $core.List<CampusTabType> values = <CampusTabType>[\n    campus_none,\n    campus_school,\n    campus_dynamic,\n    campus_account,\n    campus_billboard,\n    campus_topic,\n    campues_other,\n  ];\n\n  static final $core.List<CampusTabType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 6);\n  static CampusTabType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const CampusTabType._(super.value, super.name);\n}\n\nclass CoverIcon extends $pb.ProtobufEnum {\n  static const CoverIcon cover_icon_none =\n      CoverIcon._(0, _omitEnumNames ? '' : 'cover_icon_none');\n  static const CoverIcon cover_icon_play =\n      CoverIcon._(1, _omitEnumNames ? '' : 'cover_icon_play');\n  static const CoverIcon cover_icon_danmaku =\n      CoverIcon._(2, _omitEnumNames ? '' : 'cover_icon_danmaku');\n  static const CoverIcon cover_icon_up =\n      CoverIcon._(3, _omitEnumNames ? '' : 'cover_icon_up');\n  static const CoverIcon cover_icon_vt =\n      CoverIcon._(4, _omitEnumNames ? '' : 'cover_icon_vt');\n  static const CoverIcon cover_icon_view_cnt =\n      CoverIcon._(5, _omitEnumNames ? '' : 'cover_icon_view_cnt');\n  static const CoverIcon cover_icon_thumb_up =\n      CoverIcon._(6, _omitEnumNames ? '' : 'cover_icon_thumb_up');\n  static const CoverIcon cover_icon_reply =\n      CoverIcon._(7, _omitEnumNames ? '' : 'cover_icon_reply');\n  static const CoverIcon cover_icon_fav =\n      CoverIcon._(8, _omitEnumNames ? '' : 'cover_icon_fav');\n  static const CoverIcon cover_icon_coin =\n      CoverIcon._(9, _omitEnumNames ? '' : 'cover_icon_coin');\n  static const CoverIcon cover_icon_self_seen =\n      CoverIcon._(10, _omitEnumNames ? '' : 'cover_icon_self_seen');\n\n  static const $core.List<CoverIcon> values = <CoverIcon>[\n    cover_icon_none,\n    cover_icon_play,\n    cover_icon_danmaku,\n    cover_icon_up,\n    cover_icon_vt,\n    cover_icon_view_cnt,\n    cover_icon_thumb_up,\n    cover_icon_reply,\n    cover_icon_fav,\n    cover_icon_coin,\n    cover_icon_self_seen,\n  ];\n\n  static final $core.List<CoverIcon?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 10);\n  static CoverIcon? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const CoverIcon._(super.value, super.name);\n}\n\nclass DescType extends $pb.ProtobufEnum {\n  static const DescType desc_type_none =\n      DescType._(0, _omitEnumNames ? '' : 'desc_type_none');\n  static const DescType desc_type_text =\n      DescType._(1, _omitEnumNames ? '' : 'desc_type_text');\n  static const DescType desc_type_aite =\n      DescType._(2, _omitEnumNames ? '' : 'desc_type_aite');\n  static const DescType desc_type_lottery =\n      DescType._(3, _omitEnumNames ? '' : 'desc_type_lottery');\n  static const DescType desc_type_vote =\n      DescType._(4, _omitEnumNames ? '' : 'desc_type_vote');\n  static const DescType desc_type_topic =\n      DescType._(5, _omitEnumNames ? '' : 'desc_type_topic');\n  static const DescType desc_type_goods =\n      DescType._(6, _omitEnumNames ? '' : 'desc_type_goods');\n  static const DescType desc_type_bv =\n      DescType._(7, _omitEnumNames ? '' : 'desc_type_bv');\n  static const DescType desc_type_av =\n      DescType._(8, _omitEnumNames ? '' : 'desc_type_av');\n  static const DescType desc_type_emoji =\n      DescType._(9, _omitEnumNames ? '' : 'desc_type_emoji');\n  static const DescType desc_type_user =\n      DescType._(10, _omitEnumNames ? '' : 'desc_type_user');\n  static const DescType desc_type_cv =\n      DescType._(11, _omitEnumNames ? '' : 'desc_type_cv');\n  static const DescType desc_type_vc =\n      DescType._(12, _omitEnumNames ? '' : 'desc_type_vc');\n  static const DescType desc_type_web =\n      DescType._(13, _omitEnumNames ? '' : 'desc_type_web');\n  static const DescType desc_type_taobao =\n      DescType._(14, _omitEnumNames ? '' : 'desc_type_taobao');\n  static const DescType desc_type_mail =\n      DescType._(15, _omitEnumNames ? '' : 'desc_type_mail');\n  static const DescType desc_type_ogv_season =\n      DescType._(16, _omitEnumNames ? '' : 'desc_type_ogv_season');\n  static const DescType desc_type_ogv_ep =\n      DescType._(17, _omitEnumNames ? '' : 'desc_type_ogv_ep');\n  static const DescType desc_type_search_word =\n      DescType._(18, _omitEnumNames ? '' : 'desc_type_search_word');\n\n  static const $core.List<DescType> values = <DescType>[\n    desc_type_none,\n    desc_type_text,\n    desc_type_aite,\n    desc_type_lottery,\n    desc_type_vote,\n    desc_type_topic,\n    desc_type_goods,\n    desc_type_bv,\n    desc_type_av,\n    desc_type_emoji,\n    desc_type_user,\n    desc_type_cv,\n    desc_type_vc,\n    desc_type_web,\n    desc_type_taobao,\n    desc_type_mail,\n    desc_type_ogv_season,\n    desc_type_ogv_ep,\n    desc_type_search_word,\n  ];\n\n  static final $core.List<DescType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 18);\n  static DescType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const DescType._(super.value, super.name);\n}\n\nclass DisableState extends $pb.ProtobufEnum {\n  static const DisableState highlight =\n      DisableState._(0, _omitEnumNames ? '' : 'highlight');\n  static const DisableState gary =\n      DisableState._(1, _omitEnumNames ? '' : 'gary');\n\n  static const $core.List<DisableState> values = <DisableState>[\n    highlight,\n    gary,\n  ];\n\n  static final $core.List<DisableState?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static DisableState? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const DisableState._(super.value, super.name);\n}\n\nclass DynExtendType extends $pb.ProtobufEnum {\n  static const DynExtendType dyn_ext_type_none =\n      DynExtendType._(0, _omitEnumNames ? '' : 'dyn_ext_type_none');\n  static const DynExtendType dyn_ext_type_topic =\n      DynExtendType._(1, _omitEnumNames ? '' : 'dyn_ext_type_topic');\n  static const DynExtendType dyn_ext_type_lbs =\n      DynExtendType._(2, _omitEnumNames ? '' : 'dyn_ext_type_lbs');\n  static const DynExtendType dyn_ext_type_hot =\n      DynExtendType._(3, _omitEnumNames ? '' : 'dyn_ext_type_hot');\n  static const DynExtendType dyn_ext_type_game =\n      DynExtendType._(4, _omitEnumNames ? '' : 'dyn_ext_type_game');\n  static const DynExtendType dyn_ext_type_common =\n      DynExtendType._(5, _omitEnumNames ? '' : 'dyn_ext_type_common');\n  static const DynExtendType dyn_ext_type_biliCut =\n      DynExtendType._(6, _omitEnumNames ? '' : 'dyn_ext_type_biliCut');\n  static const DynExtendType dyn_ext_type_ogv =\n      DynExtendType._(7, _omitEnumNames ? '' : 'dyn_ext_type_ogv');\n  static const DynExtendType dyn_ext_type_auto_ogv =\n      DynExtendType._(8, _omitEnumNames ? '' : 'dyn_ext_type_auto_ogv');\n  static const DynExtendType dyn_ext_type_article_tag =\n      DynExtendType._(9, _omitEnumNames ? '' : 'dyn_ext_type_article_tag');\n\n  static const $core.List<DynExtendType> values = <DynExtendType>[\n    dyn_ext_type_none,\n    dyn_ext_type_topic,\n    dyn_ext_type_lbs,\n    dyn_ext_type_hot,\n    dyn_ext_type_game,\n    dyn_ext_type_common,\n    dyn_ext_type_biliCut,\n    dyn_ext_type_ogv,\n    dyn_ext_type_auto_ogv,\n    dyn_ext_type_article_tag,\n  ];\n\n  static final $core.List<DynExtendType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 9);\n  static DynExtendType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const DynExtendType._(super.value, super.name);\n}\n\nclass DynModuleType extends $pb.ProtobufEnum {\n  static const DynModuleType module_none =\n      DynModuleType._(0, _omitEnumNames ? '' : 'module_none');\n  static const DynModuleType module_author =\n      DynModuleType._(1, _omitEnumNames ? '' : 'module_author');\n  static const DynModuleType module_dispute =\n      DynModuleType._(2, _omitEnumNames ? '' : 'module_dispute');\n  static const DynModuleType module_desc =\n      DynModuleType._(3, _omitEnumNames ? '' : 'module_desc');\n  static const DynModuleType module_dynamic =\n      DynModuleType._(4, _omitEnumNames ? '' : 'module_dynamic');\n  static const DynModuleType module_forward =\n      DynModuleType._(5, _omitEnumNames ? '' : 'module_forward');\n  static const DynModuleType module_likeUser =\n      DynModuleType._(6, _omitEnumNames ? '' : 'module_likeUser');\n  static const DynModuleType module_extend =\n      DynModuleType._(7, _omitEnumNames ? '' : 'module_extend');\n  static const DynModuleType module_additional =\n      DynModuleType._(8, _omitEnumNames ? '' : 'module_additional');\n  static const DynModuleType module_stat =\n      DynModuleType._(9, _omitEnumNames ? '' : 'module_stat');\n  static const DynModuleType module_fold =\n      DynModuleType._(10, _omitEnumNames ? '' : 'module_fold');\n  static const DynModuleType module_comment =\n      DynModuleType._(11, _omitEnumNames ? '' : 'module_comment');\n  static const DynModuleType module_interaction =\n      DynModuleType._(12, _omitEnumNames ? '' : 'module_interaction');\n  static const DynModuleType module_author_forward =\n      DynModuleType._(13, _omitEnumNames ? '' : 'module_author_forward');\n  static const DynModuleType module_ad =\n      DynModuleType._(14, _omitEnumNames ? '' : 'module_ad');\n  static const DynModuleType module_banner =\n      DynModuleType._(15, _omitEnumNames ? '' : 'module_banner');\n  static const DynModuleType module_item_null =\n      DynModuleType._(16, _omitEnumNames ? '' : 'module_item_null');\n  static const DynModuleType module_share_info =\n      DynModuleType._(17, _omitEnumNames ? '' : 'module_share_info');\n  static const DynModuleType module_recommend =\n      DynModuleType._(18, _omitEnumNames ? '' : 'module_recommend');\n  static const DynModuleType module_stat_forward =\n      DynModuleType._(19, _omitEnumNames ? '' : 'module_stat_forward');\n  static const DynModuleType module_top =\n      DynModuleType._(20, _omitEnumNames ? '' : 'module_top');\n  static const DynModuleType module_bottom =\n      DynModuleType._(21, _omitEnumNames ? '' : 'module_bottom');\n  static const DynModuleType module_story =\n      DynModuleType._(22, _omitEnumNames ? '' : 'module_story');\n  static const DynModuleType module_topic =\n      DynModuleType._(23, _omitEnumNames ? '' : 'module_topic');\n  static const DynModuleType module_topic_details_ext =\n      DynModuleType._(24, _omitEnumNames ? '' : 'module_topic_details_ext');\n  static const DynModuleType module_top_tag =\n      DynModuleType._(25, _omitEnumNames ? '' : 'module_top_tag');\n  static const DynModuleType module_topic_brief =\n      DynModuleType._(26, _omitEnumNames ? '' : 'module_topic_brief');\n  static const DynModuleType module_title =\n      DynModuleType._(27, _omitEnumNames ? '' : 'module_title');\n  static const DynModuleType module_button =\n      DynModuleType._(28, _omitEnumNames ? '' : 'module_button');\n  static const DynModuleType module_notice =\n      DynModuleType._(29, _omitEnumNames ? '' : 'module_notice');\n  static const DynModuleType module_opus_summary =\n      DynModuleType._(30, _omitEnumNames ? '' : 'module_opus_summary');\n  static const DynModuleType module_copyright =\n      DynModuleType._(31, _omitEnumNames ? '' : 'module_copyright');\n  static const DynModuleType module_paragraph =\n      DynModuleType._(32, _omitEnumNames ? '' : 'module_paragraph');\n  static const DynModuleType module_blocked =\n      DynModuleType._(33, _omitEnumNames ? '' : 'module_blocked');\n  static const DynModuleType module_text_notice =\n      DynModuleType._(34, _omitEnumNames ? '' : 'module_text_notice');\n  static const DynModuleType module_opus_collection =\n      DynModuleType._(35, _omitEnumNames ? '' : 'module_opus_collection');\n  static const DynModuleType module_onetime_notice =\n      DynModuleType._(36, _omitEnumNames ? '' : 'module_onetime_notice');\n  static const DynModuleType module_sneaking_ad =\n      DynModuleType._(37, _omitEnumNames ? '' : 'module_sneaking_ad');\n  static const DynModuleType module_manga_horizontal_page_pic_content =\n      DynModuleType._(\n          38, _omitEnumNames ? '' : 'module_manga_horizontal_page_pic_content');\n  static const DynModuleType module_manga_vertical_slide_pic_content =\n      DynModuleType._(\n          39, _omitEnumNames ? '' : 'module_manga_vertical_slide_pic_content');\n  static const DynModuleType module_manga_cover_pic_content = DynModuleType._(\n      40, _omitEnumNames ? '' : 'module_manga_cover_pic_content');\n  static const DynModuleType module_author_for_subscribe =\n      DynModuleType._(41, _omitEnumNames ? '' : 'module_author_for_subscribe');\n  static const DynModuleType module_author_slim =\n      DynModuleType._(42, _omitEnumNames ? '' : 'module_author_slim');\n  static const DynModuleType module_manga_collection =\n      DynModuleType._(43, _omitEnumNames ? '' : 'module_manga_collection');\n  static const DynModuleType module_cooperation =\n      DynModuleType._(44, _omitEnumNames ? '' : 'module_cooperation');\n\n  static const $core.List<DynModuleType> values = <DynModuleType>[\n    module_none,\n    module_author,\n    module_dispute,\n    module_desc,\n    module_dynamic,\n    module_forward,\n    module_likeUser,\n    module_extend,\n    module_additional,\n    module_stat,\n    module_fold,\n    module_comment,\n    module_interaction,\n    module_author_forward,\n    module_ad,\n    module_banner,\n    module_item_null,\n    module_share_info,\n    module_recommend,\n    module_stat_forward,\n    module_top,\n    module_bottom,\n    module_story,\n    module_topic,\n    module_topic_details_ext,\n    module_top_tag,\n    module_topic_brief,\n    module_title,\n    module_button,\n    module_notice,\n    module_opus_summary,\n    module_copyright,\n    module_paragraph,\n    module_blocked,\n    module_text_notice,\n    module_opus_collection,\n    module_onetime_notice,\n    module_sneaking_ad,\n    module_manga_horizontal_page_pic_content,\n    module_manga_vertical_slide_pic_content,\n    module_manga_cover_pic_content,\n    module_author_for_subscribe,\n    module_author_slim,\n    module_manga_collection,\n    module_cooperation,\n  ];\n\n  static final $core.List<DynModuleType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 44);\n  static DynModuleType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const DynModuleType._(super.value, super.name);\n}\n\nclass DynVisibilityStatus extends $pb.ProtobufEnum {\n  static const DynVisibilityStatus DYN_VISIBILITY_PUBLIC =\n      DynVisibilityStatus._(0, _omitEnumNames ? '' : 'DYN_VISIBILITY_PUBLIC');\n  static const DynVisibilityStatus DYN_VISIBILITY_SELF_SEEN_ONLY =\n      DynVisibilityStatus._(\n          1, _omitEnumNames ? '' : 'DYN_VISIBILITY_SELF_SEEN_ONLY');\n\n  static const $core.List<DynVisibilityStatus> values = <DynVisibilityStatus>[\n    DYN_VISIBILITY_PUBLIC,\n    DYN_VISIBILITY_SELF_SEEN_ONLY,\n  ];\n\n  static final $core.List<DynVisibilityStatus?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static DynVisibilityStatus? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const DynVisibilityStatus._(super.value, super.name);\n}\n\nclass DynamicType extends $pb.ProtobufEnum {\n  static const DynamicType dyn_none =\n      DynamicType._(0, _omitEnumNames ? '' : 'dyn_none');\n  static const DynamicType forward =\n      DynamicType._(1, _omitEnumNames ? '' : 'forward');\n  static const DynamicType av = DynamicType._(2, _omitEnumNames ? '' : 'av');\n  static const DynamicType pgc = DynamicType._(3, _omitEnumNames ? '' : 'pgc');\n  static const DynamicType courses =\n      DynamicType._(4, _omitEnumNames ? '' : 'courses');\n  static const DynamicType fold =\n      DynamicType._(5, _omitEnumNames ? '' : 'fold');\n  static const DynamicType word =\n      DynamicType._(6, _omitEnumNames ? '' : 'word');\n  static const DynamicType draw =\n      DynamicType._(7, _omitEnumNames ? '' : 'draw');\n  static const DynamicType article =\n      DynamicType._(8, _omitEnumNames ? '' : 'article');\n  static const DynamicType music =\n      DynamicType._(9, _omitEnumNames ? '' : 'music');\n  static const DynamicType common_square =\n      DynamicType._(10, _omitEnumNames ? '' : 'common_square');\n  static const DynamicType common_vertical =\n      DynamicType._(11, _omitEnumNames ? '' : 'common_vertical');\n  static const DynamicType live =\n      DynamicType._(12, _omitEnumNames ? '' : 'live');\n  static const DynamicType medialist =\n      DynamicType._(13, _omitEnumNames ? '' : 'medialist');\n  static const DynamicType courses_season =\n      DynamicType._(14, _omitEnumNames ? '' : 'courses_season');\n  static const DynamicType ad = DynamicType._(15, _omitEnumNames ? '' : 'ad');\n  static const DynamicType applet =\n      DynamicType._(16, _omitEnumNames ? '' : 'applet');\n  static const DynamicType subscription =\n      DynamicType._(17, _omitEnumNames ? '' : 'subscription');\n  static const DynamicType live_rcmd =\n      DynamicType._(18, _omitEnumNames ? '' : 'live_rcmd');\n  static const DynamicType banner =\n      DynamicType._(19, _omitEnumNames ? '' : 'banner');\n  static const DynamicType ugc_season =\n      DynamicType._(20, _omitEnumNames ? '' : 'ugc_season');\n  static const DynamicType subscription_new =\n      DynamicType._(21, _omitEnumNames ? '' : 'subscription_new');\n  static const DynamicType story =\n      DynamicType._(22, _omitEnumNames ? '' : 'story');\n  static const DynamicType topic_rcmd =\n      DynamicType._(23, _omitEnumNames ? '' : 'topic_rcmd');\n  static const DynamicType cour_up =\n      DynamicType._(24, _omitEnumNames ? '' : 'cour_up');\n  static const DynamicType topic_set =\n      DynamicType._(25, _omitEnumNames ? '' : 'topic_set');\n  static const DynamicType notice =\n      DynamicType._(26, _omitEnumNames ? '' : 'notice');\n  static const DynamicType text_notice =\n      DynamicType._(27, _omitEnumNames ? '' : 'text_notice');\n  static const DynamicType onetime_notice =\n      DynamicType._(28, _omitEnumNames ? '' : 'onetime_notice');\n  static const DynamicType manga_ep =\n      DynamicType._(29, _omitEnumNames ? '' : 'manga_ep');\n\n  static const $core.List<DynamicType> values = <DynamicType>[\n    dyn_none,\n    forward,\n    av,\n    pgc,\n    courses,\n    fold,\n    word,\n    draw,\n    article,\n    music,\n    common_square,\n    common_vertical,\n    live,\n    medialist,\n    courses_season,\n    ad,\n    applet,\n    subscription,\n    live_rcmd,\n    banner,\n    ugc_season,\n    subscription_new,\n    story,\n    topic_rcmd,\n    cour_up,\n    topic_set,\n    notice,\n    text_notice,\n    onetime_notice,\n    manga_ep,\n  ];\n\n  static final $core.List<DynamicType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 29);\n  static DynamicType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const DynamicType._(super.value, super.name);\n}\n\nclass EmojiType extends $pb.ProtobufEnum {\n  static const EmojiType emoji_none =\n      EmojiType._(0, _omitEnumNames ? '' : 'emoji_none');\n  static const EmojiType emoji_old =\n      EmojiType._(1, _omitEnumNames ? '' : 'emoji_old');\n  static const EmojiType emoji_new =\n      EmojiType._(2, _omitEnumNames ? '' : 'emoji_new');\n  static const EmojiType vip = EmojiType._(3, _omitEnumNames ? '' : 'vip');\n\n  static const $core.List<EmojiType> values = <EmojiType>[\n    emoji_none,\n    emoji_old,\n    emoji_new,\n    vip,\n  ];\n\n  static final $core.List<EmojiType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static EmojiType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const EmojiType._(super.value, super.name);\n}\n\nclass EmoteClickAction extends $pb.ProtobufEnum {\n  static const EmoteClickAction EMOTE_CLICK_NONE =\n      EmoteClickAction._(0, _omitEnumNames ? '' : 'EMOTE_CLICK_NONE');\n  static const EmoteClickAction EMOTE_CLICK_POPUP_PREVIEW =\n      EmoteClickAction._(1, _omitEnumNames ? '' : 'EMOTE_CLICK_POPUP_PREVIEW');\n\n  static const $core.List<EmoteClickAction> values = <EmoteClickAction>[\n    EMOTE_CLICK_NONE,\n    EMOTE_CLICK_POPUP_PREVIEW,\n  ];\n\n  static final $core.List<EmoteClickAction?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static EmoteClickAction? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const EmoteClickAction._(super.value, super.name);\n}\n\nclass EspaceStyle extends $pb.ProtobufEnum {\n  static const EspaceStyle moba =\n      EspaceStyle._(0, _omitEnumNames ? '' : 'moba');\n\n  static const $core.List<EspaceStyle> values = <EspaceStyle>[\n    moba,\n  ];\n\n  static final $core.List<EspaceStyle?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 0);\n  static EspaceStyle? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const EspaceStyle._(super.value, super.name);\n}\n\nclass FlowItemType extends $pb.ProtobufEnum {\n  static const FlowItemType FLOW_ITEM_TYPE_INVALID =\n      FlowItemType._(0, _omitEnumNames ? '' : 'FLOW_ITEM_TYPE_INVALID');\n  static const FlowItemType FLOW_ITEM_TYPE_OPUS =\n      FlowItemType._(1, _omitEnumNames ? '' : 'FLOW_ITEM_TYPE_OPUS');\n\n  static const $core.List<FlowItemType> values = <FlowItemType>[\n    FLOW_ITEM_TYPE_INVALID,\n    FLOW_ITEM_TYPE_OPUS,\n  ];\n\n  static final $core.List<FlowItemType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static FlowItemType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const FlowItemType._(super.value, super.name);\n}\n\nclass FoldType extends $pb.ProtobufEnum {\n  static const FoldType FoldTypeZore =\n      FoldType._(0, _omitEnumNames ? '' : 'FoldTypeZore');\n  static const FoldType FoldTypePublish =\n      FoldType._(1, _omitEnumNames ? '' : 'FoldTypePublish');\n  static const FoldType FoldTypeFrequent =\n      FoldType._(2, _omitEnumNames ? '' : 'FoldTypeFrequent');\n  static const FoldType FoldTypeUnite =\n      FoldType._(3, _omitEnumNames ? '' : 'FoldTypeUnite');\n  static const FoldType FoldTypeLimit =\n      FoldType._(4, _omitEnumNames ? '' : 'FoldTypeLimit');\n  static const FoldType FoldTypeTopicMerged =\n      FoldType._(5, _omitEnumNames ? '' : 'FoldTypeTopicMerged');\n\n  static const $core.List<FoldType> values = <FoldType>[\n    FoldTypeZore,\n    FoldTypePublish,\n    FoldTypeFrequent,\n    FoldTypeUnite,\n    FoldTypeLimit,\n    FoldTypeTopicMerged,\n  ];\n\n  static final $core.List<FoldType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 5);\n  static FoldType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const FoldType._(super.value, super.name);\n}\n\nclass GoodsJumpType extends $pb.ProtobufEnum {\n  static const GoodsJumpType goods_none =\n      GoodsJumpType._(0, _omitEnumNames ? '' : 'goods_none');\n  static const GoodsJumpType goods_schema =\n      GoodsJumpType._(1, _omitEnumNames ? '' : 'goods_schema');\n  static const GoodsJumpType goods_url =\n      GoodsJumpType._(2, _omitEnumNames ? '' : 'goods_url');\n\n  static const $core.List<GoodsJumpType> values = <GoodsJumpType>[\n    goods_none,\n    goods_schema,\n    goods_url,\n  ];\n\n  static final $core.List<GoodsJumpType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static GoodsJumpType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const GoodsJumpType._(super.value, super.name);\n}\n\nclass HighlightTextStyle extends $pb.ProtobufEnum {\n  static const HighlightTextStyle style_none =\n      HighlightTextStyle._(0, _omitEnumNames ? '' : 'style_none');\n  static const HighlightTextStyle style_highlight =\n      HighlightTextStyle._(1, _omitEnumNames ? '' : 'style_highlight');\n\n  static const $core.List<HighlightTextStyle> values = <HighlightTextStyle>[\n    style_none,\n    style_highlight,\n  ];\n\n  static final $core.List<HighlightTextStyle?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static HighlightTextStyle? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const HighlightTextStyle._(super.value, super.name);\n}\n\nclass HomePageTabSttingStatus extends $pb.ProtobufEnum {\n  static const HomePageTabSttingStatus SETTING_INVALID =\n      HomePageTabSttingStatus._(0, _omitEnumNames ? '' : 'SETTING_INVALID');\n  static const HomePageTabSttingStatus SETTING_OPEN =\n      HomePageTabSttingStatus._(1, _omitEnumNames ? '' : 'SETTING_OPEN');\n  static const HomePageTabSttingStatus SETTING_CLOSE =\n      HomePageTabSttingStatus._(2, _omitEnumNames ? '' : 'SETTING_CLOSE');\n\n  static const $core.List<HomePageTabSttingStatus> values =\n      <HomePageTabSttingStatus>[\n    SETTING_INVALID,\n    SETTING_OPEN,\n    SETTING_CLOSE,\n  ];\n\n  static final $core.List<HomePageTabSttingStatus?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static HomePageTabSttingStatus? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const HomePageTabSttingStatus._(super.value, super.name);\n}\n\nclass IconResLocal extends $pb.ProtobufEnum {\n  static const IconResLocal ICON_RES_LOCAL_NONE =\n      IconResLocal._(0, _omitEnumNames ? '' : 'ICON_RES_LOCAL_NONE');\n  static const IconResLocal ICON_RES_LOCAL_LIVE =\n      IconResLocal._(1, _omitEnumNames ? '' : 'ICON_RES_LOCAL_LIVE');\n\n  static const $core.List<IconResLocal> values = <IconResLocal>[\n    ICON_RES_LOCAL_NONE,\n    ICON_RES_LOCAL_LIVE,\n  ];\n\n  static final $core.List<IconResLocal?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static IconResLocal? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const IconResLocal._(super.value, super.name);\n}\n\nclass ImageStyle extends $pb.ProtobufEnum {\n  static const ImageStyle add_style_vertical =\n      ImageStyle._(0, _omitEnumNames ? '' : 'add_style_vertical');\n  static const ImageStyle add_style_square =\n      ImageStyle._(1, _omitEnumNames ? '' : 'add_style_square');\n\n  static const $core.List<ImageStyle> values = <ImageStyle>[\n    add_style_vertical,\n    add_style_square,\n  ];\n\n  static final $core.List<ImageStyle?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static ImageStyle? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ImageStyle._(super.value, super.name);\n}\n\nclass LightFromType extends $pb.ProtobufEnum {\n  static const LightFromType from_login =\n      LightFromType._(0, _omitEnumNames ? '' : 'from_login');\n  static const LightFromType from_unlogin =\n      LightFromType._(1, _omitEnumNames ? '' : 'from_unlogin');\n\n  static const $core.List<LightFromType> values = <LightFromType>[\n    from_login,\n    from_unlogin,\n  ];\n\n  static final $core.List<LightFromType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static LightFromType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const LightFromType._(super.value, super.name);\n}\n\nclass LinkNodeType extends $pb.ProtobufEnum {\n  static const LinkNodeType INVALID =\n      LinkNodeType._(0, _omitEnumNames ? '' : 'INVALID');\n  static const LinkNodeType VIDEO =\n      LinkNodeType._(1, _omitEnumNames ? '' : 'VIDEO');\n  static const LinkNodeType RESERVE =\n      LinkNodeType._(2, _omitEnumNames ? '' : 'RESERVE');\n  static const LinkNodeType VOTE =\n      LinkNodeType._(3, _omitEnumNames ? '' : 'VOTE');\n  static const LinkNodeType LIVE =\n      LinkNodeType._(4, _omitEnumNames ? '' : 'LIVE');\n  static const LinkNodeType LOTTERY =\n      LinkNodeType._(5, _omitEnumNames ? '' : 'LOTTERY');\n  static const LinkNodeType MATCH =\n      LinkNodeType._(6, _omitEnumNames ? '' : 'MATCH');\n  static const LinkNodeType GOODS =\n      LinkNodeType._(7, _omitEnumNames ? '' : 'GOODS');\n  static const LinkNodeType OGV_SS =\n      LinkNodeType._(8, _omitEnumNames ? '' : 'OGV_SS');\n  static const LinkNodeType OGV_EP =\n      LinkNodeType._(9, _omitEnumNames ? '' : 'OGV_EP');\n  static const LinkNodeType MANGA =\n      LinkNodeType._(10, _omitEnumNames ? '' : 'MANGA');\n  static const LinkNodeType CHEESE =\n      LinkNodeType._(11, _omitEnumNames ? '' : 'CHEESE');\n  static const LinkNodeType VIDEO_TS =\n      LinkNodeType._(12, _omitEnumNames ? '' : 'VIDEO_TS');\n  static const LinkNodeType AT = LinkNodeType._(13, _omitEnumNames ? '' : 'AT');\n  static const LinkNodeType HASH_TAG =\n      LinkNodeType._(14, _omitEnumNames ? '' : 'HASH_TAG');\n  static const LinkNodeType ARTICLE =\n      LinkNodeType._(15, _omitEnumNames ? '' : 'ARTICLE');\n  static const LinkNodeType URL =\n      LinkNodeType._(16, _omitEnumNames ? '' : 'URL');\n  static const LinkNodeType MAIL =\n      LinkNodeType._(17, _omitEnumNames ? '' : 'MAIL');\n  static const LinkNodeType LBS =\n      LinkNodeType._(18, _omitEnumNames ? '' : 'LBS');\n  static const LinkNodeType ACTIVITY =\n      LinkNodeType._(19, _omitEnumNames ? '' : 'ACTIVITY');\n  static const LinkNodeType ATTACH_CARD_OFFICIAL_ACTIVITY =\n      LinkNodeType._(20, _omitEnumNames ? '' : 'ATTACH_CARD_OFFICIAL_ACTIVITY');\n  static const LinkNodeType GAME =\n      LinkNodeType._(21, _omitEnumNames ? '' : 'GAME');\n  static const LinkNodeType DECORATION =\n      LinkNodeType._(22, _omitEnumNames ? '' : 'DECORATION');\n  static const LinkNodeType UP_TOPIC =\n      LinkNodeType._(23, _omitEnumNames ? '' : 'UP_TOPIC');\n  static const LinkNodeType UP_ACTIVITY =\n      LinkNodeType._(24, _omitEnumNames ? '' : 'UP_ACTIVITY');\n  static const LinkNodeType UP_MAOER =\n      LinkNodeType._(25, _omitEnumNames ? '' : 'UP_MAOER');\n  static const LinkNodeType MEMBER_GOODS =\n      LinkNodeType._(26, _omitEnumNames ? '' : 'MEMBER_GOODS');\n  static const LinkNodeType OPENMALL_UP_ITEMS =\n      LinkNodeType._(27, _omitEnumNames ? '' : 'OPENMALL_UP_ITEMS');\n  static const LinkNodeType SEARCH =\n      LinkNodeType._(28, _omitEnumNames ? '' : 'SEARCH');\n  static const LinkNodeType MUSIC =\n      LinkNodeType._(29, _omitEnumNames ? '' : 'MUSIC');\n  static const LinkNodeType GPT_RCMD_QUESTION =\n      LinkNodeType._(30, _omitEnumNames ? '' : 'GPT_RCMD_QUESTION');\n  static const LinkNodeType MEMBER_TICKET =\n      LinkNodeType._(31, _omitEnumNames ? '' : 'MEMBER_TICKET');\n  static const LinkNodeType REPOST_PIC_URL =\n      LinkNodeType._(32, _omitEnumNames ? '' : 'REPOST_PIC_URL');\n  static const LinkNodeType REPOST_PIC_DYN_URL =\n      LinkNodeType._(33, _omitEnumNames ? '' : 'REPOST_PIC_DYN_URL');\n  static const LinkNodeType OGV_FOLLOW_CARD =\n      LinkNodeType._(34, _omitEnumNames ? '' : 'OGV_FOLLOW_CARD');\n  static const LinkNodeType ARTICLE_GOODS =\n      LinkNodeType._(35, _omitEnumNames ? '' : 'ARTICLE_GOODS');\n  static const LinkNodeType ARTICLE_TAG =\n      LinkNodeType._(36, _omitEnumNames ? '' : 'ARTICLE_TAG');\n\n  static const $core.List<LinkNodeType> values = <LinkNodeType>[\n    INVALID,\n    VIDEO,\n    RESERVE,\n    VOTE,\n    LIVE,\n    LOTTERY,\n    MATCH,\n    GOODS,\n    OGV_SS,\n    OGV_EP,\n    MANGA,\n    CHEESE,\n    VIDEO_TS,\n    AT,\n    HASH_TAG,\n    ARTICLE,\n    URL,\n    MAIL,\n    LBS,\n    ACTIVITY,\n    ATTACH_CARD_OFFICIAL_ACTIVITY,\n    GAME,\n    DECORATION,\n    UP_TOPIC,\n    UP_ACTIVITY,\n    UP_MAOER,\n    MEMBER_GOODS,\n    OPENMALL_UP_ITEMS,\n    SEARCH,\n    MUSIC,\n    GPT_RCMD_QUESTION,\n    MEMBER_TICKET,\n    REPOST_PIC_URL,\n    REPOST_PIC_DYN_URL,\n    OGV_FOLLOW_CARD,\n    ARTICLE_GOODS,\n    ARTICLE_TAG,\n  ];\n\n  static final $core.List<LinkNodeType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 36);\n  static LinkNodeType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const LinkNodeType._(super.value, super.name);\n}\n\nclass LiveState extends $pb.ProtobufEnum {\n  static const LiveState live_none =\n      LiveState._(0, _omitEnumNames ? '' : 'live_none');\n  static const LiveState live_live =\n      LiveState._(1, _omitEnumNames ? '' : 'live_live');\n  static const LiveState live_rotation =\n      LiveState._(2, _omitEnumNames ? '' : 'live_rotation');\n\n  static const $core.List<LiveState> values = <LiveState>[\n    live_none,\n    live_live,\n    live_rotation,\n  ];\n\n  static final $core.List<LiveState?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static LiveState? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const LiveState._(super.value, super.name);\n}\n\nclass LocalIconType extends $pb.ProtobufEnum {\n  static const LocalIconType local_icon_comment =\n      LocalIconType._(0, _omitEnumNames ? '' : 'local_icon_comment');\n  static const LocalIconType local_icon_like =\n      LocalIconType._(1, _omitEnumNames ? '' : 'local_icon_like');\n  static const LocalIconType local_icon_avatar =\n      LocalIconType._(2, _omitEnumNames ? '' : 'local_icon_avatar');\n  static const LocalIconType local_icon_cover =\n      LocalIconType._(3, _omitEnumNames ? '' : 'local_icon_cover');\n  static const LocalIconType local_icon_like_and_forward =\n      LocalIconType._(4, _omitEnumNames ? '' : 'local_icon_like_and_forward');\n\n  static const $core.List<LocalIconType> values = <LocalIconType>[\n    local_icon_comment,\n    local_icon_like,\n    local_icon_avatar,\n    local_icon_cover,\n    local_icon_like_and_forward,\n  ];\n\n  static final $core.List<LocalIconType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 4);\n  static LocalIconType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const LocalIconType._(super.value, super.name);\n}\n\nclass MangaLikePageDirection extends $pb.ProtobufEnum {\n  static const MangaLikePageDirection PAGE_DIRECTION_INVALID =\n      MangaLikePageDirection._(\n          0, _omitEnumNames ? '' : 'PAGE_DIRECTION_INVALID');\n  static const MangaLikePageDirection PAGE_DIRECTION_LEFT_TO_RIGHT =\n      MangaLikePageDirection._(\n          1, _omitEnumNames ? '' : 'PAGE_DIRECTION_LEFT_TO_RIGHT');\n  static const MangaLikePageDirection PAGE_DIRECTION_RIGHT_TO_LEFT =\n      MangaLikePageDirection._(\n          2, _omitEnumNames ? '' : 'PAGE_DIRECTION_RIGHT_TO_LEFT');\n  static const MangaLikePageDirection PAGE_DIRECTION_LEFT_TO_RIGHT_ROTATE =\n      MangaLikePageDirection._(\n          3, _omitEnumNames ? '' : 'PAGE_DIRECTION_LEFT_TO_RIGHT_ROTATE');\n\n  static const $core.List<MangaLikePageDirection> values =\n      <MangaLikePageDirection>[\n    PAGE_DIRECTION_INVALID,\n    PAGE_DIRECTION_LEFT_TO_RIGHT,\n    PAGE_DIRECTION_RIGHT_TO_LEFT,\n    PAGE_DIRECTION_LEFT_TO_RIGHT_ROTATE,\n  ];\n\n  static final $core.List<MangaLikePageDirection?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static MangaLikePageDirection? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const MangaLikePageDirection._(super.value, super.name);\n}\n\nclass MangaLikePicClickAction extends $pb.ProtobufEnum {\n  static const MangaLikePicClickAction CLICK_ACT_NONE =\n      MangaLikePicClickAction._(0, _omitEnumNames ? '' : 'CLICK_ACT_NONE');\n  static const MangaLikePicClickAction CLICK_ACT_MANGA_BROWSER =\n      MangaLikePicClickAction._(\n          1, _omitEnumNames ? '' : 'CLICK_ACT_MANGA_BROWSER');\n  static const MangaLikePicClickAction CLICK_ACT_NORMAL_BROWSER =\n      MangaLikePicClickAction._(\n          2, _omitEnumNames ? '' : 'CLICK_ACT_NORMAL_BROWSER');\n\n  static const $core.List<MangaLikePicClickAction> values =\n      <MangaLikePicClickAction>[\n    CLICK_ACT_NONE,\n    CLICK_ACT_MANGA_BROWSER,\n    CLICK_ACT_NORMAL_BROWSER,\n  ];\n\n  static final $core.List<MangaLikePicClickAction?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static MangaLikePicClickAction? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const MangaLikePicClickAction._(super.value, super.name);\n}\n\nclass MdlBlockedStyle extends $pb.ProtobufEnum {\n  static const MdlBlockedStyle BLOCKED_STYLE_DEFAULT =\n      MdlBlockedStyle._(0, _omitEnumNames ? '' : 'BLOCKED_STYLE_DEFAULT');\n  static const MdlBlockedStyle BLOCKED_STYLE_IN_AUDIT =\n      MdlBlockedStyle._(1, _omitEnumNames ? '' : 'BLOCKED_STYLE_IN_AUDIT');\n  static const MdlBlockedStyle BLOCKED_STYLE_ONLY_FANS_LIST = MdlBlockedStyle._(\n      2, _omitEnumNames ? '' : 'BLOCKED_STYLE_ONLY_FANS_LIST');\n  static const MdlBlockedStyle BLOCKED_STYLE_ONLY_FANS_VIDEO =\n      MdlBlockedStyle._(\n          3, _omitEnumNames ? '' : 'BLOCKED_STYLE_ONLY_FANS_VIDEO');\n  static const MdlBlockedStyle BLOCKED_STYLE_MANGA_PURCHASE = MdlBlockedStyle._(\n      4, _omitEnumNames ? '' : 'BLOCKED_STYLE_MANGA_PURCHASE');\n\n  static const $core.List<MdlBlockedStyle> values = <MdlBlockedStyle>[\n    BLOCKED_STYLE_DEFAULT,\n    BLOCKED_STYLE_IN_AUDIT,\n    BLOCKED_STYLE_ONLY_FANS_LIST,\n    BLOCKED_STYLE_ONLY_FANS_VIDEO,\n    BLOCKED_STYLE_MANGA_PURCHASE,\n  ];\n\n  static final $core.List<MdlBlockedStyle?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 4);\n  static MdlBlockedStyle? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const MdlBlockedStyle._(super.value, super.name);\n}\n\nclass MdlDynCommonType extends $pb.ProtobufEnum {\n  static const MdlDynCommonType mdl_dyn_common_none =\n      MdlDynCommonType._(0, _omitEnumNames ? '' : 'mdl_dyn_common_none');\n  static const MdlDynCommonType mdl_dyn_common_square =\n      MdlDynCommonType._(1, _omitEnumNames ? '' : 'mdl_dyn_common_square');\n  static const MdlDynCommonType mdl_dyn_common_vertica =\n      MdlDynCommonType._(2, _omitEnumNames ? '' : 'mdl_dyn_common_vertica');\n\n  static const $core.List<MdlDynCommonType> values = <MdlDynCommonType>[\n    mdl_dyn_common_none,\n    mdl_dyn_common_square,\n    mdl_dyn_common_vertica,\n  ];\n\n  static final $core.List<MdlDynCommonType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static MdlDynCommonType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const MdlDynCommonType._(super.value, super.name);\n}\n\nclass MdlDynDrawTagType extends $pb.ProtobufEnum {\n  static const MdlDynDrawTagType mdl_draw_tag_none =\n      MdlDynDrawTagType._(0, _omitEnumNames ? '' : 'mdl_draw_tag_none');\n  static const MdlDynDrawTagType mdl_draw_tag_common =\n      MdlDynDrawTagType._(1, _omitEnumNames ? '' : 'mdl_draw_tag_common');\n  static const MdlDynDrawTagType mdl_draw_tag_goods =\n      MdlDynDrawTagType._(2, _omitEnumNames ? '' : 'mdl_draw_tag_goods');\n  static const MdlDynDrawTagType mdl_draw_tag_user =\n      MdlDynDrawTagType._(3, _omitEnumNames ? '' : 'mdl_draw_tag_user');\n  static const MdlDynDrawTagType mdl_draw_tag_topic =\n      MdlDynDrawTagType._(4, _omitEnumNames ? '' : 'mdl_draw_tag_topic');\n  static const MdlDynDrawTagType mdl_draw_tag_lbs =\n      MdlDynDrawTagType._(5, _omitEnumNames ? '' : 'mdl_draw_tag_lbs');\n\n  static const $core.List<MdlDynDrawTagType> values = <MdlDynDrawTagType>[\n    mdl_draw_tag_none,\n    mdl_draw_tag_common,\n    mdl_draw_tag_goods,\n    mdl_draw_tag_user,\n    mdl_draw_tag_topic,\n    mdl_draw_tag_lbs,\n  ];\n\n  static final $core.List<MdlDynDrawTagType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 5);\n  static MdlDynDrawTagType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const MdlDynDrawTagType._(super.value, super.name);\n}\n\nclass MdlDynSubscriptionNewStyle extends $pb.ProtobufEnum {\n  static const MdlDynSubscriptionNewStyle mdl_dyn_subscription_new_style_nont =\n      MdlDynSubscriptionNewStyle._(\n          0, _omitEnumNames ? '' : 'mdl_dyn_subscription_new_style_nont');\n  static const MdlDynSubscriptionNewStyle mdl_dyn_subscription_new_style_live =\n      MdlDynSubscriptionNewStyle._(\n          1, _omitEnumNames ? '' : 'mdl_dyn_subscription_new_style_live');\n  static const MdlDynSubscriptionNewStyle mdl_dyn_subscription_new_style_draw =\n      MdlDynSubscriptionNewStyle._(\n          2, _omitEnumNames ? '' : 'mdl_dyn_subscription_new_style_draw');\n\n  static const $core.List<MdlDynSubscriptionNewStyle> values =\n      <MdlDynSubscriptionNewStyle>[\n    mdl_dyn_subscription_new_style_nont,\n    mdl_dyn_subscription_new_style_live,\n    mdl_dyn_subscription_new_style_draw,\n  ];\n\n  static final $core.List<MdlDynSubscriptionNewStyle?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static MdlDynSubscriptionNewStyle? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const MdlDynSubscriptionNewStyle._(super.value, super.name);\n}\n\nclass MediaType extends $pb.ProtobufEnum {\n  static const MediaType MediaTypeNone =\n      MediaType._(0, _omitEnumNames ? '' : 'MediaTypeNone');\n  static const MediaType MediaTypeUGC =\n      MediaType._(1, _omitEnumNames ? '' : 'MediaTypeUGC');\n  static const MediaType MediaTypePGC =\n      MediaType._(2, _omitEnumNames ? '' : 'MediaTypePGC');\n  static const MediaType MediaTypeLive =\n      MediaType._(3, _omitEnumNames ? '' : 'MediaTypeLive');\n  static const MediaType MediaTypeVCS =\n      MediaType._(4, _omitEnumNames ? '' : 'MediaTypeVCS');\n\n  static const $core.List<MediaType> values = <MediaType>[\n    MediaTypeNone,\n    MediaTypeUGC,\n    MediaTypePGC,\n    MediaTypeLive,\n    MediaTypeVCS,\n  ];\n\n  static final $core.List<MediaType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 4);\n  static MediaType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const MediaType._(super.value, super.name);\n}\n\nclass ModuleAuthorBadgeType extends $pb.ProtobufEnum {\n  static const ModuleAuthorBadgeType module_author_badge_type_none =\n      ModuleAuthorBadgeType._(\n          0, _omitEnumNames ? '' : 'module_author_badge_type_none');\n  static const ModuleAuthorBadgeType module_author_badge_type_threePoint =\n      ModuleAuthorBadgeType._(\n          1, _omitEnumNames ? '' : 'module_author_badge_type_threePoint');\n  static const ModuleAuthorBadgeType module_author_badge_type_button =\n      ModuleAuthorBadgeType._(\n          2, _omitEnumNames ? '' : 'module_author_badge_type_button');\n  static const ModuleAuthorBadgeType module_author_badge_type_weight =\n      ModuleAuthorBadgeType._(\n          3, _omitEnumNames ? '' : 'module_author_badge_type_weight');\n\n  static const $core.List<ModuleAuthorBadgeType> values =\n      <ModuleAuthorBadgeType>[\n    module_author_badge_type_none,\n    module_author_badge_type_threePoint,\n    module_author_badge_type_button,\n    module_author_badge_type_weight,\n  ];\n\n  static final $core.List<ModuleAuthorBadgeType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static ModuleAuthorBadgeType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ModuleAuthorBadgeType._(super.value, super.name);\n}\n\nclass ModuleBannerType extends $pb.ProtobufEnum {\n  static const ModuleBannerType module_banner_type_none =\n      ModuleBannerType._(0, _omitEnumNames ? '' : 'module_banner_type_none');\n  static const ModuleBannerType module_banner_type_user =\n      ModuleBannerType._(1, _omitEnumNames ? '' : 'module_banner_type_user');\n\n  static const $core.List<ModuleBannerType> values = <ModuleBannerType>[\n    module_banner_type_none,\n    module_banner_type_user,\n  ];\n\n  static final $core.List<ModuleBannerType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static ModuleBannerType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ModuleBannerType._(super.value, super.name);\n}\n\nclass ModuleDynamicType extends $pb.ProtobufEnum {\n  static const ModuleDynamicType mdl_dyn_archive =\n      ModuleDynamicType._(0, _omitEnumNames ? '' : 'mdl_dyn_archive');\n  static const ModuleDynamicType mdl_dyn_pgc =\n      ModuleDynamicType._(1, _omitEnumNames ? '' : 'mdl_dyn_pgc');\n  static const ModuleDynamicType mdl_dyn_cour_season =\n      ModuleDynamicType._(2, _omitEnumNames ? '' : 'mdl_dyn_cour_season');\n  static const ModuleDynamicType mdl_dyn_cour_batch =\n      ModuleDynamicType._(3, _omitEnumNames ? '' : 'mdl_dyn_cour_batch');\n  static const ModuleDynamicType mdl_dyn_forward =\n      ModuleDynamicType._(4, _omitEnumNames ? '' : 'mdl_dyn_forward');\n  static const ModuleDynamicType mdl_dyn_draw =\n      ModuleDynamicType._(5, _omitEnumNames ? '' : 'mdl_dyn_draw');\n  static const ModuleDynamicType mdl_dyn_article =\n      ModuleDynamicType._(6, _omitEnumNames ? '' : 'mdl_dyn_article');\n  static const ModuleDynamicType mdl_dyn_music =\n      ModuleDynamicType._(7, _omitEnumNames ? '' : 'mdl_dyn_music');\n  static const ModuleDynamicType mdl_dyn_common =\n      ModuleDynamicType._(8, _omitEnumNames ? '' : 'mdl_dyn_common');\n  static const ModuleDynamicType mdl_dyn_live =\n      ModuleDynamicType._(9, _omitEnumNames ? '' : 'mdl_dyn_live');\n  static const ModuleDynamicType mdl_dyn_medialist =\n      ModuleDynamicType._(10, _omitEnumNames ? '' : 'mdl_dyn_medialist');\n  static const ModuleDynamicType mdl_dyn_applet =\n      ModuleDynamicType._(11, _omitEnumNames ? '' : 'mdl_dyn_applet');\n  static const ModuleDynamicType mdl_dyn_subscription =\n      ModuleDynamicType._(12, _omitEnumNames ? '' : 'mdl_dyn_subscription');\n  static const ModuleDynamicType mdl_dyn_live_rcmd =\n      ModuleDynamicType._(13, _omitEnumNames ? '' : 'mdl_dyn_live_rcmd');\n  static const ModuleDynamicType mdl_dyn_ugc_season =\n      ModuleDynamicType._(14, _omitEnumNames ? '' : 'mdl_dyn_ugc_season');\n  static const ModuleDynamicType mdl_dyn_subscription_new =\n      ModuleDynamicType._(15, _omitEnumNames ? '' : 'mdl_dyn_subscription_new');\n  static const ModuleDynamicType mdl_dyn_cour_up =\n      ModuleDynamicType._(16, _omitEnumNames ? '' : 'mdl_dyn_cour_up');\n  static const ModuleDynamicType mdl_dyn_topic_set =\n      ModuleDynamicType._(17, _omitEnumNames ? '' : 'mdl_dyn_topic_set');\n  static const ModuleDynamicType mdl_dyn_charging_archive =\n      ModuleDynamicType._(18, _omitEnumNames ? '' : 'mdl_dyn_charging_archive');\n  static const ModuleDynamicType mdl_dyn_share_charging_qa =\n      ModuleDynamicType._(\n          19, _omitEnumNames ? '' : 'mdl_dyn_share_charging_qa');\n\n  static const $core.List<ModuleDynamicType> values = <ModuleDynamicType>[\n    mdl_dyn_archive,\n    mdl_dyn_pgc,\n    mdl_dyn_cour_season,\n    mdl_dyn_cour_batch,\n    mdl_dyn_forward,\n    mdl_dyn_draw,\n    mdl_dyn_article,\n    mdl_dyn_music,\n    mdl_dyn_common,\n    mdl_dyn_live,\n    mdl_dyn_medialist,\n    mdl_dyn_applet,\n    mdl_dyn_subscription,\n    mdl_dyn_live_rcmd,\n    mdl_dyn_ugc_season,\n    mdl_dyn_subscription_new,\n    mdl_dyn_cour_up,\n    mdl_dyn_topic_set,\n    mdl_dyn_charging_archive,\n    mdl_dyn_share_charging_qa,\n  ];\n\n  static final $core.List<ModuleDynamicType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 19);\n  static ModuleDynamicType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ModuleDynamicType._(super.value, super.name);\n}\n\nclass NFTRegionType extends $pb.ProtobufEnum {\n  static const NFTRegionType nft_region_default =\n      NFTRegionType._(0, _omitEnumNames ? '' : 'nft_region_default');\n  static const NFTRegionType nft_region_mainlang =\n      NFTRegionType._(1, _omitEnumNames ? '' : 'nft_region_mainlang');\n  static const NFTRegionType nft_region_gat =\n      NFTRegionType._(2, _omitEnumNames ? '' : 'nft_region_gat');\n\n  static const $core.List<NFTRegionType> values = <NFTRegionType>[\n    nft_region_default,\n    nft_region_mainlang,\n    nft_region_gat,\n  ];\n\n  static final $core.List<NFTRegionType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static NFTRegionType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const NFTRegionType._(super.value, super.name);\n}\n\nclass NFTShowStatus extends $pb.ProtobufEnum {\n  static const NFTShowStatus nft_show_default =\n      NFTShowStatus._(0, _omitEnumNames ? '' : 'nft_show_default');\n  static const NFTShowStatus nft_show_zoominmainlang =\n      NFTShowStatus._(1, _omitEnumNames ? '' : 'nft_show_zoominmainlang');\n  static const NFTShowStatus nft_show_raw =\n      NFTShowStatus._(2, _omitEnumNames ? '' : 'nft_show_raw');\n\n  static const $core.List<NFTShowStatus> values = <NFTShowStatus>[\n    nft_show_default,\n    nft_show_zoominmainlang,\n    nft_show_raw,\n  ];\n\n  static final $core.List<NFTShowStatus?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static NFTShowStatus? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const NFTShowStatus._(super.value, super.name);\n}\n\nclass NetworkType extends $pb.ProtobufEnum {\n  static const NetworkType NT_UNKNOWN =\n      NetworkType._(0, _omitEnumNames ? '' : 'NT_UNKNOWN');\n  static const NetworkType WIFI =\n      NetworkType._(1, _omitEnumNames ? '' : 'WIFI');\n  static const NetworkType CELLULAR =\n      NetworkType._(2, _omitEnumNames ? '' : 'CELLULAR');\n  static const NetworkType OFFLINE =\n      NetworkType._(3, _omitEnumNames ? '' : 'OFFLINE');\n  static const NetworkType OTHERNET =\n      NetworkType._(4, _omitEnumNames ? '' : 'OTHERNET');\n  static const NetworkType ETHERNET =\n      NetworkType._(5, _omitEnumNames ? '' : 'ETHERNET');\n\n  static const $core.List<NetworkType> values = <NetworkType>[\n    NT_UNKNOWN,\n    WIFI,\n    CELLULAR,\n    OFFLINE,\n    OTHERNET,\n    ETHERNET,\n  ];\n\n  static final $core.List<NetworkType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 5);\n  static NetworkType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const NetworkType._(super.value, super.name);\n}\n\nclass OpusType extends $pb.ProtobufEnum {\n  static const OpusType OPUS_TYPE_DYN =\n      OpusType._(0, _omitEnumNames ? '' : 'OPUS_TYPE_DYN');\n  static const OpusType OPUS_TYPE_ARTICLE =\n      OpusType._(1, _omitEnumNames ? '' : 'OPUS_TYPE_ARTICLE');\n  static const OpusType OPUS_TYPE_NOTE =\n      OpusType._(2, _omitEnumNames ? '' : 'OPUS_TYPE_NOTE');\n  static const OpusType OPUS_TYPE_WORD =\n      OpusType._(3, _omitEnumNames ? '' : 'OPUS_TYPE_WORD');\n  static const OpusType OPUS_TYPE_REPOST =\n      OpusType._(4, _omitEnumNames ? '' : 'OPUS_TYPE_REPOST');\n  static const OpusType OPUS_TYPE_MANGA_EP =\n      OpusType._(5, _omitEnumNames ? '' : 'OPUS_TYPE_MANGA_EP');\n\n  static const $core.List<OpusType> values = <OpusType>[\n    OPUS_TYPE_DYN,\n    OPUS_TYPE_ARTICLE,\n    OPUS_TYPE_NOTE,\n    OPUS_TYPE_WORD,\n    OPUS_TYPE_REPOST,\n    OPUS_TYPE_MANGA_EP,\n  ];\n\n  static final $core.List<OpusType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 5);\n  static OpusType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const OpusType._(super.value, super.name);\n}\n\nclass RcmdReasonStyle extends $pb.ProtobufEnum {\n  static const RcmdReasonStyle rcmd_reason_style_none =\n      RcmdReasonStyle._(0, _omitEnumNames ? '' : 'rcmd_reason_style_none');\n  static const RcmdReasonStyle rcmd_reason_style_campus_nearby =\n      RcmdReasonStyle._(\n          1, _omitEnumNames ? '' : 'rcmd_reason_style_campus_nearby');\n  static const RcmdReasonStyle rcmd_reason_style_campus_up =\n      RcmdReasonStyle._(2, _omitEnumNames ? '' : 'rcmd_reason_style_campus_up');\n  static const RcmdReasonStyle rcmd_reason_style_campus_near_up_mix =\n      RcmdReasonStyle._(\n          3, _omitEnumNames ? '' : 'rcmd_reason_style_campus_near_up_mix');\n\n  static const $core.List<RcmdReasonStyle> values = <RcmdReasonStyle>[\n    rcmd_reason_style_none,\n    rcmd_reason_style_campus_nearby,\n    rcmd_reason_style_campus_up,\n    rcmd_reason_style_campus_near_up_mix,\n  ];\n\n  static final $core.List<RcmdReasonStyle?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static RcmdReasonStyle? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const RcmdReasonStyle._(super.value, super.name);\n}\n\nclass RcmdType extends $pb.ProtobufEnum {\n  static const RcmdType rcmd_archive =\n      RcmdType._(0, _omitEnumNames ? '' : 'rcmd_archive');\n  static const RcmdType rcmd_dynamic =\n      RcmdType._(1, _omitEnumNames ? '' : 'rcmd_dynamic');\n\n  static const $core.List<RcmdType> values = <RcmdType>[\n    rcmd_archive,\n    rcmd_dynamic,\n  ];\n\n  static final $core.List<RcmdType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static RcmdType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const RcmdType._(super.value, super.name);\n}\n\nclass Refresh extends $pb.ProtobufEnum {\n  static const Refresh refresh_new =\n      Refresh._(0, _omitEnumNames ? '' : 'refresh_new');\n  static const Refresh refresh_history =\n      Refresh._(1, _omitEnumNames ? '' : 'refresh_history');\n\n  static const $core.List<Refresh> values = <Refresh>[\n    refresh_new,\n    refresh_history,\n  ];\n\n  static final $core.List<Refresh?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static Refresh? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const Refresh._(super.value, super.name);\n}\n\nclass RelationStatus extends $pb.ProtobufEnum {\n  static const RelationStatus relation_status_none =\n      RelationStatus._(0, _omitEnumNames ? '' : 'relation_status_none');\n  static const RelationStatus relation_status_nofollow =\n      RelationStatus._(1, _omitEnumNames ? '' : 'relation_status_nofollow');\n  static const RelationStatus relation_status_follow =\n      RelationStatus._(2, _omitEnumNames ? '' : 'relation_status_follow');\n  static const RelationStatus relation_status_followed =\n      RelationStatus._(3, _omitEnumNames ? '' : 'relation_status_followed');\n  static const RelationStatus relation_status_mutual_concern = RelationStatus._(\n      4, _omitEnumNames ? '' : 'relation_status_mutual_concern');\n  static const RelationStatus relation_status_special =\n      RelationStatus._(5, _omitEnumNames ? '' : 'relation_status_special');\n\n  static const $core.List<RelationStatus> values = <RelationStatus>[\n    relation_status_none,\n    relation_status_nofollow,\n    relation_status_follow,\n    relation_status_followed,\n    relation_status_mutual_concern,\n    relation_status_special,\n  ];\n\n  static final $core.List<RelationStatus?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 5);\n  static RelationStatus? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const RelationStatus._(super.value, super.name);\n}\n\nclass RepostType extends $pb.ProtobufEnum {\n  static const RepostType repost_hot =\n      RepostType._(0, _omitEnumNames ? '' : 'repost_hot');\n  static const RepostType repost_general =\n      RepostType._(1, _omitEnumNames ? '' : 'repost_general');\n\n  static const $core.List<RepostType> values = <RepostType>[\n    repost_hot,\n    repost_general,\n  ];\n\n  static final $core.List<RepostType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static RepostType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const RepostType._(super.value, super.name);\n}\n\nclass ReserveRelationLotteryType extends $pb.ProtobufEnum {\n  static const ReserveRelationLotteryType\n      reserve_relation_lottery_type_default = ReserveRelationLotteryType._(\n          0, _omitEnumNames ? '' : 'reserve_relation_lottery_type_default');\n  static const ReserveRelationLotteryType reserve_relation_lottery_type_cron =\n      ReserveRelationLotteryType._(\n          1, _omitEnumNames ? '' : 'reserve_relation_lottery_type_cron');\n\n  static const $core.List<ReserveRelationLotteryType> values =\n      <ReserveRelationLotteryType>[\n    reserve_relation_lottery_type_default,\n    reserve_relation_lottery_type_cron,\n  ];\n\n  static final $core.List<ReserveRelationLotteryType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static ReserveRelationLotteryType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ReserveRelationLotteryType._(super.value, super.name);\n}\n\nclass ReserveType extends $pb.ProtobufEnum {\n  static const ReserveType reserve_none =\n      ReserveType._(0, _omitEnumNames ? '' : 'reserve_none');\n  static const ReserveType reserve_recall =\n      ReserveType._(1, _omitEnumNames ? '' : 'reserve_recall');\n\n  static const $core.List<ReserveType> values = <ReserveType>[\n    reserve_none,\n    reserve_recall,\n  ];\n\n  static final $core.List<ReserveType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static ReserveType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ReserveType._(super.value, super.name);\n}\n\nclass RouterAction extends $pb.ProtobufEnum {\n  static const RouterAction OPEN =\n      RouterAction._(0, _omitEnumNames ? '' : 'OPEN');\n  static const RouterAction EMBED =\n      RouterAction._(1, _omitEnumNames ? '' : 'EMBED');\n\n  static const $core.List<RouterAction> values = <RouterAction>[\n    OPEN,\n    EMBED,\n  ];\n\n  static final $core.List<RouterAction?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static RouterAction? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const RouterAction._(super.value, super.name);\n}\n\nclass ShowType extends $pb.ProtobufEnum {\n  static const ShowType show_type_none =\n      ShowType._(0, _omitEnumNames ? '' : 'show_type_none');\n  static const ShowType show_type_backup =\n      ShowType._(1, _omitEnumNames ? '' : 'show_type_backup');\n\n  static const $core.List<ShowType> values = <ShowType>[\n    show_type_none,\n    show_type_backup,\n  ];\n\n  static final $core.List<ShowType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static ShowType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ShowType._(super.value, super.name);\n}\n\nclass StyleType extends $pb.ProtobufEnum {\n  static const StyleType STYLE_TYPE_NONE =\n      StyleType._(0, _omitEnumNames ? '' : 'STYLE_TYPE_NONE');\n  static const StyleType STYLE_TYPE_LIVE =\n      StyleType._(1, _omitEnumNames ? '' : 'STYLE_TYPE_LIVE');\n  static const StyleType STYLE_TYPE_DYN_UP =\n      StyleType._(2, _omitEnumNames ? '' : 'STYLE_TYPE_DYN_UP');\n\n  static const $core.List<StyleType> values = <StyleType>[\n    STYLE_TYPE_NONE,\n    STYLE_TYPE_LIVE,\n    STYLE_TYPE_DYN_UP,\n  ];\n\n  static final $core.List<StyleType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static StyleType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const StyleType._(super.value, super.name);\n}\n\nclass TFType extends $pb.ProtobufEnum {\n  static const TFType TF_UNKNOWN =\n      TFType._(0, _omitEnumNames ? '' : 'TF_UNKNOWN');\n  static const TFType U_CARD = TFType._(1, _omitEnumNames ? '' : 'U_CARD');\n  static const TFType U_PKG = TFType._(2, _omitEnumNames ? '' : 'U_PKG');\n  static const TFType C_CARD = TFType._(3, _omitEnumNames ? '' : 'C_CARD');\n  static const TFType C_PKG = TFType._(4, _omitEnumNames ? '' : 'C_PKG');\n  static const TFType T_CARD = TFType._(5, _omitEnumNames ? '' : 'T_CARD');\n  static const TFType T_PKG = TFType._(6, _omitEnumNames ? '' : 'T_PKG');\n\n  static const $core.List<TFType> values = <TFType>[\n    TF_UNKNOWN,\n    U_CARD,\n    U_PKG,\n    C_CARD,\n    C_PKG,\n    T_CARD,\n    T_PKG,\n  ];\n\n  static final $core.List<TFType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 6);\n  static TFType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const TFType._(super.value, super.name);\n}\n\nclass ThreePointAttentionStatus extends $pb.ProtobufEnum {\n  static const ThreePointAttentionStatus tp_not_attention =\n      ThreePointAttentionStatus._(0, _omitEnumNames ? '' : 'tp_not_attention');\n  static const ThreePointAttentionStatus tp_attention =\n      ThreePointAttentionStatus._(1, _omitEnumNames ? '' : 'tp_attention');\n\n  static const $core.List<ThreePointAttentionStatus> values =\n      <ThreePointAttentionStatus>[\n    tp_not_attention,\n    tp_attention,\n  ];\n\n  static final $core.List<ThreePointAttentionStatus?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static ThreePointAttentionStatus? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ThreePointAttentionStatus._(super.value, super.name);\n}\n\nclass ThreePointType extends $pb.ProtobufEnum {\n  static const ThreePointType tp_none =\n      ThreePointType._(0, _omitEnumNames ? '' : 'tp_none');\n  static const ThreePointType background =\n      ThreePointType._(1, _omitEnumNames ? '' : 'background');\n  static const ThreePointType auto_play =\n      ThreePointType._(2, _omitEnumNames ? '' : 'auto_play');\n  static const ThreePointType share =\n      ThreePointType._(3, _omitEnumNames ? '' : 'share');\n  static const ThreePointType wait =\n      ThreePointType._(4, _omitEnumNames ? '' : 'wait');\n  static const ThreePointType attention =\n      ThreePointType._(5, _omitEnumNames ? '' : 'attention');\n  static const ThreePointType report =\n      ThreePointType._(6, _omitEnumNames ? '' : 'report');\n  static const ThreePointType delete =\n      ThreePointType._(7, _omitEnumNames ? '' : 'delete');\n  static const ThreePointType dislike =\n      ThreePointType._(8, _omitEnumNames ? '' : 'dislike');\n  static const ThreePointType favorite =\n      ThreePointType._(9, _omitEnumNames ? '' : 'favorite');\n  static const ThreePointType top =\n      ThreePointType._(10, _omitEnumNames ? '' : 'top');\n  static const ThreePointType comment =\n      ThreePointType._(11, _omitEnumNames ? '' : 'comment');\n  static const ThreePointType hide =\n      ThreePointType._(12, _omitEnumNames ? '' : 'hide');\n  static const ThreePointType campus_delete =\n      ThreePointType._(13, _omitEnumNames ? '' : 'campus_delete');\n  static const ThreePointType topic_irrelevant =\n      ThreePointType._(14, _omitEnumNames ? '' : 'topic_irrelevant');\n  static const ThreePointType batch_cancel =\n      ThreePointType._(15, _omitEnumNames ? '' : 'batch_cancel');\n  static const ThreePointType topic_set_cancel =\n      ThreePointType._(16, _omitEnumNames ? '' : 'topic_set_cancel');\n  static const ThreePointType dynamic_edit =\n      ThreePointType._(17, _omitEnumNames ? '' : 'dynamic_edit');\n  static const ThreePointType create_video =\n      ThreePointType._(18, _omitEnumNames ? '' : 'create_video');\n  static const ThreePointType coin =\n      ThreePointType._(19, _omitEnumNames ? '' : 'coin');\n  static const ThreePointType ogv_subscribe =\n      ThreePointType._(20, _omitEnumNames ? '' : 'ogv_subscribe');\n  static const ThreePointType visibility_change =\n      ThreePointType._(21, _omitEnumNames ? '' : 'visibility_change');\n  static const ThreePointType topic_top =\n      ThreePointType._(22, _omitEnumNames ? '' : 'topic_top');\n\n  static const $core.List<ThreePointType> values = <ThreePointType>[\n    tp_none,\n    background,\n    auto_play,\n    share,\n    wait,\n    attention,\n    report,\n    delete,\n    dislike,\n    favorite,\n    top,\n    comment,\n    hide,\n    campus_delete,\n    topic_irrelevant,\n    batch_cancel,\n    topic_set_cancel,\n    dynamic_edit,\n    create_video,\n    coin,\n    ogv_subscribe,\n    visibility_change,\n    topic_top,\n  ];\n\n  static final $core.List<ThreePointType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 22);\n  static ThreePointType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ThreePointType._(super.value, super.name);\n}\n\nclass ThumbType extends $pb.ProtobufEnum {\n  static const ThumbType cancel =\n      ThumbType._(0, _omitEnumNames ? '' : 'cancel');\n  static const ThumbType thumb = ThumbType._(1, _omitEnumNames ? '' : 'thumb');\n\n  static const $core.List<ThumbType> values = <ThumbType>[\n    cancel,\n    thumb,\n  ];\n\n  static final $core.List<ThumbType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static ThumbType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ThumbType._(super.value, super.name);\n}\n\nclass TopType extends $pb.ProtobufEnum {\n  static const TopType top_none =\n      TopType._(0, _omitEnumNames ? '' : 'top_none');\n  static const TopType top_cancel =\n      TopType._(1, _omitEnumNames ? '' : 'top_cancel');\n\n  static const $core.List<TopType> values = <TopType>[\n    top_none,\n    top_cancel,\n  ];\n\n  static final $core.List<TopType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static TopType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const TopType._(super.value, super.name);\n}\n\nclass UserItemType extends $pb.ProtobufEnum {\n  static const UserItemType user_item_type_none =\n      UserItemType._(0, _omitEnumNames ? '' : 'user_item_type_none');\n  static const UserItemType user_item_type_live =\n      UserItemType._(1, _omitEnumNames ? '' : 'user_item_type_live');\n  static const UserItemType user_item_type_live_custom =\n      UserItemType._(2, _omitEnumNames ? '' : 'user_item_type_live_custom');\n  static const UserItemType user_item_type_normal =\n      UserItemType._(3, _omitEnumNames ? '' : 'user_item_type_normal');\n  static const UserItemType user_item_type_extend =\n      UserItemType._(4, _omitEnumNames ? '' : 'user_item_type_extend');\n  static const UserItemType user_item_type_premiere_reserve = UserItemType._(\n      5, _omitEnumNames ? '' : 'user_item_type_premiere_reserve');\n  static const UserItemType user_item_type_premiere =\n      UserItemType._(6, _omitEnumNames ? '' : 'user_item_type_premiere');\n  static const UserItemType user_item_type_live_card =\n      UserItemType._(7, _omitEnumNames ? '' : 'user_item_type_live_card');\n  static const UserItemType user_item_type_ogv_season =\n      UserItemType._(8, _omitEnumNames ? '' : 'user_item_type_ogv_season');\n  static const UserItemType user_item_type_ugc_season =\n      UserItemType._(9, _omitEnumNames ? '' : 'user_item_type_ugc_season');\n\n  static const $core.List<UserItemType> values = <UserItemType>[\n    user_item_type_none,\n    user_item_type_live,\n    user_item_type_live_custom,\n    user_item_type_normal,\n    user_item_type_extend,\n    user_item_type_premiere_reserve,\n    user_item_type_premiere,\n    user_item_type_live_card,\n    user_item_type_ogv_season,\n    user_item_type_ugc_season,\n  ];\n\n  static final $core.List<UserItemType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 9);\n  static UserItemType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const UserItemType._(super.value, super.name);\n}\n\nclass VideoSubType extends $pb.ProtobufEnum {\n  static const VideoSubType VideoSubTypeNone =\n      VideoSubType._(0, _omitEnumNames ? '' : 'VideoSubTypeNone');\n  static const VideoSubType VideoSubTypeBangumi =\n      VideoSubType._(1, _omitEnumNames ? '' : 'VideoSubTypeBangumi');\n  static const VideoSubType VideoSubTypeMovie =\n      VideoSubType._(2, _omitEnumNames ? '' : 'VideoSubTypeMovie');\n  static const VideoSubType VideoSubTypeDocumentary =\n      VideoSubType._(3, _omitEnumNames ? '' : 'VideoSubTypeDocumentary');\n  static const VideoSubType VideoSubTypeDomestic =\n      VideoSubType._(4, _omitEnumNames ? '' : 'VideoSubTypeDomestic');\n  static const VideoSubType VideoSubTypeTeleplay =\n      VideoSubType._(5, _omitEnumNames ? '' : 'VideoSubTypeTeleplay');\n\n  static const $core.List<VideoSubType> values = <VideoSubType>[\n    VideoSubTypeNone,\n    VideoSubTypeBangumi,\n    VideoSubTypeMovie,\n    VideoSubTypeDocumentary,\n    VideoSubTypeDomestic,\n    VideoSubTypeTeleplay,\n  ];\n\n  static final $core.List<VideoSubType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 5);\n  static VideoSubType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const VideoSubType._(super.value, super.name);\n}\n\nclass VideoType extends $pb.ProtobufEnum {\n  static const VideoType video_type_general =\n      VideoType._(0, _omitEnumNames ? '' : 'video_type_general');\n  static const VideoType video_type_dynamic =\n      VideoType._(1, _omitEnumNames ? '' : 'video_type_dynamic');\n  static const VideoType video_type_playback =\n      VideoType._(2, _omitEnumNames ? '' : 'video_type_playback');\n  static const VideoType video_type_story =\n      VideoType._(3, _omitEnumNames ? '' : 'video_type_story');\n\n  static const $core.List<VideoType> values = <VideoType>[\n    video_type_general,\n    video_type_dynamic,\n    video_type_playback,\n    video_type_story,\n  ];\n\n  static final $core.List<VideoType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static VideoType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const VideoType._(super.value, super.name);\n}\n\nclass VoteStatus extends $pb.ProtobufEnum {\n  static const VoteStatus normal =\n      VoteStatus._(0, _omitEnumNames ? '' : 'normal');\n  static const VoteStatus anonymous =\n      VoteStatus._(1, _omitEnumNames ? '' : 'anonymous');\n\n  static const $core.List<VoteStatus> values = <VoteStatus>[\n    normal,\n    anonymous,\n  ];\n\n  static final $core.List<VoteStatus?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static VoteStatus? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const VoteStatus._(super.value, super.name);\n}\n\nclass WFItemType extends $pb.ProtobufEnum {\n  static const WFItemType WATER_FLOW_TYPE_NONE =\n      WFItemType._(0, _omitEnumNames ? '' : 'WATER_FLOW_TYPE_NONE');\n  static const WFItemType WATER_FLOW_TYPE_ARCHIVE =\n      WFItemType._(1, _omitEnumNames ? '' : 'WATER_FLOW_TYPE_ARCHIVE');\n  static const WFItemType WATER_FLOW_TYPE_DYNAMIC =\n      WFItemType._(2, _omitEnumNames ? '' : 'WATER_FLOW_TYPE_DYNAMIC');\n\n  static const $core.List<WFItemType> values = <WFItemType>[\n    WATER_FLOW_TYPE_NONE,\n    WATER_FLOW_TYPE_ARCHIVE,\n    WATER_FLOW_TYPE_DYNAMIC,\n  ];\n\n  static final $core.List<WFItemType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static WFItemType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const WFItemType._(super.value, super.name);\n}\n\nclass WeightType extends $pb.ProtobufEnum {\n  static const WeightType weight_none =\n      WeightType._(0, _omitEnumNames ? '' : 'weight_none');\n  static const WeightType weight_dislike =\n      WeightType._(1, _omitEnumNames ? '' : 'weight_dislike');\n  static const WeightType weight_jump =\n      WeightType._(2, _omitEnumNames ? '' : 'weight_jump');\n\n  static const $core.List<WeightType> values = <WeightType>[\n    weight_none,\n    weight_dislike,\n    weight_jump,\n  ];\n\n  static final $core.List<WeightType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static WeightType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const WeightType._(super.value, super.name);\n}\n\nclass CreationItemAction_CreationAction extends $pb.ProtobufEnum {\n  static const CreationItemAction_CreationAction CREATION_ACTION_INVALID =\n      CreationItemAction_CreationAction._(\n          0, _omitEnumNames ? '' : 'CREATION_ACTION_INVALID');\n  static const CreationItemAction_CreationAction CREATION_ACTION_DELETE =\n      CreationItemAction_CreationAction._(\n          1, _omitEnumNames ? '' : 'CREATION_ACTION_DELETE');\n  static const CreationItemAction_CreationAction CREATION_ACTION_EDIT_DYN =\n      CreationItemAction_CreationAction._(\n          2, _omitEnumNames ? '' : 'CREATION_ACTION_EDIT_DYN');\n  static const CreationItemAction_CreationAction CREATION_ACTION_JUMP_URL =\n      CreationItemAction_CreationAction._(\n          3, _omitEnumNames ? '' : 'CREATION_ACTION_JUMP_URL');\n  static const CreationItemAction_CreationAction CREATION_ACTION_RETRACT_CV =\n      CreationItemAction_CreationAction._(\n          4, _omitEnumNames ? '' : 'CREATION_ACTION_RETRACT_CV');\n  static const CreationItemAction_CreationAction CREATION_ACTION_EDIT_CV =\n      CreationItemAction_CreationAction._(\n          5, _omitEnumNames ? '' : 'CREATION_ACTION_EDIT_CV');\n  static const CreationItemAction_CreationAction\n      CREATION_ACTION_VISIBILITY_CHANGE = CreationItemAction_CreationAction._(\n          6, _omitEnumNames ? '' : 'CREATION_ACTION_VISIBILITY_CHANGE');\n\n  static const $core.List<CreationItemAction_CreationAction> values =\n      <CreationItemAction_CreationAction>[\n    CREATION_ACTION_INVALID,\n    CREATION_ACTION_DELETE,\n    CREATION_ACTION_EDIT_DYN,\n    CREATION_ACTION_JUMP_URL,\n    CREATION_ACTION_RETRACT_CV,\n    CREATION_ACTION_EDIT_CV,\n    CREATION_ACTION_VISIBILITY_CHANGE,\n  ];\n\n  static final $core.List<CreationItemAction_CreationAction?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 6);\n  static CreationItemAction_CreationAction? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const CreationItemAction_CreationAction._(super.value, super.name);\n}\n\nclass ExtInfoCommon_ExtTagStyle extends $pb.ProtobufEnum {\n  static const ExtInfoCommon_ExtTagStyle EXT_TAG_STYLE_DEFAULT =\n      ExtInfoCommon_ExtTagStyle._(\n          0, _omitEnumNames ? '' : 'EXT_TAG_STYLE_DEFAULT');\n  static const ExtInfoCommon_ExtTagStyle EXT_TAG_STYLE_PURE_TEXT =\n      ExtInfoCommon_ExtTagStyle._(\n          1, _omitEnumNames ? '' : 'EXT_TAG_STYLE_PURE_TEXT');\n\n  static const $core.List<ExtInfoCommon_ExtTagStyle> values =\n      <ExtInfoCommon_ExtTagStyle>[\n    EXT_TAG_STYLE_DEFAULT,\n    EXT_TAG_STYLE_PURE_TEXT,\n  ];\n\n  static final $core.List<ExtInfoCommon_ExtTagStyle?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static ExtInfoCommon_ExtTagStyle? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ExtInfoCommon_ExtTagStyle._(super.value, super.name);\n}\n\nclass ModuleButtom_InteractionIcon extends $pb.ProtobufEnum {\n  static const ModuleButtom_InteractionIcon ICON_INVALID =\n      ModuleButtom_InteractionIcon._(0, _omitEnumNames ? '' : 'ICON_INVALID');\n  static const ModuleButtom_InteractionIcon ICON_FORWARD =\n      ModuleButtom_InteractionIcon._(1, _omitEnumNames ? '' : 'ICON_FORWARD');\n  static const ModuleButtom_InteractionIcon ICON_COMMENT =\n      ModuleButtom_InteractionIcon._(2, _omitEnumNames ? '' : 'ICON_COMMENT');\n  static const ModuleButtom_InteractionIcon ICON_FAVORITE =\n      ModuleButtom_InteractionIcon._(3, _omitEnumNames ? '' : 'ICON_FAVORITE');\n  static const ModuleButtom_InteractionIcon ICON_LIKE =\n      ModuleButtom_InteractionIcon._(4, _omitEnumNames ? '' : 'ICON_LIKE');\n\n  static const $core.List<ModuleButtom_InteractionIcon> values =\n      <ModuleButtom_InteractionIcon>[\n    ICON_INVALID,\n    ICON_FORWARD,\n    ICON_COMMENT,\n    ICON_FAVORITE,\n    ICON_LIKE,\n  ];\n\n  static final $core.List<ModuleButtom_InteractionIcon?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 4);\n  static ModuleButtom_InteractionIcon? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ModuleButtom_InteractionIcon._(super.value, super.name);\n}\n\nclass Paragraph_ParagraphAlign extends $pb.ProtobufEnum {\n  static const Paragraph_ParagraphAlign LEFT =\n      Paragraph_ParagraphAlign._(0, _omitEnumNames ? '' : 'LEFT');\n  static const Paragraph_ParagraphAlign MIDDLE =\n      Paragraph_ParagraphAlign._(1, _omitEnumNames ? '' : 'MIDDLE');\n  static const Paragraph_ParagraphAlign RIGHT =\n      Paragraph_ParagraphAlign._(2, _omitEnumNames ? '' : 'RIGHT');\n\n  static const $core.List<Paragraph_ParagraphAlign> values =\n      <Paragraph_ParagraphAlign>[\n    LEFT,\n    MIDDLE,\n    RIGHT,\n  ];\n\n  static final $core.List<Paragraph_ParagraphAlign?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static Paragraph_ParagraphAlign? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const Paragraph_ParagraphAlign._(super.value, super.name);\n}\n\nclass Paragraph_ParagraphType extends $pb.ProtobufEnum {\n  static const Paragraph_ParagraphType INVALID_ParagraphType =\n      Paragraph_ParagraphType._(\n          0, _omitEnumNames ? '' : 'INVALID_ParagraphType');\n  static const Paragraph_ParagraphType TEXT =\n      Paragraph_ParagraphType._(1, _omitEnumNames ? '' : 'TEXT');\n  static const Paragraph_ParagraphType PICTURES =\n      Paragraph_ParagraphType._(2, _omitEnumNames ? '' : 'PICTURES');\n  static const Paragraph_ParagraphType LINE =\n      Paragraph_ParagraphType._(3, _omitEnumNames ? '' : 'LINE');\n  static const Paragraph_ParagraphType REFERENCE =\n      Paragraph_ParagraphType._(4, _omitEnumNames ? '' : 'REFERENCE');\n  static const Paragraph_ParagraphType SORTED_LIST =\n      Paragraph_ParagraphType._(5, _omitEnumNames ? '' : 'SORTED_LIST');\n  static const Paragraph_ParagraphType UNSORTED_LIST =\n      Paragraph_ParagraphType._(6, _omitEnumNames ? '' : 'UNSORTED_LIST');\n  static const Paragraph_ParagraphType LINK_CARD =\n      Paragraph_ParagraphType._(7, _omitEnumNames ? '' : 'LINK_CARD');\n  static const Paragraph_ParagraphType CODE =\n      Paragraph_ParagraphType._(8, _omitEnumNames ? '' : 'CODE');\n\n  static const $core.List<Paragraph_ParagraphType> values =\n      <Paragraph_ParagraphType>[\n    INVALID_ParagraphType,\n    TEXT,\n    PICTURES,\n    LINE,\n    REFERENCE,\n    SORTED_LIST,\n    UNSORTED_LIST,\n    LINK_CARD,\n    CODE,\n  ];\n\n  static final $core.List<Paragraph_ParagraphType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 8);\n  static Paragraph_ParagraphType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const Paragraph_ParagraphType._(super.value, super.name);\n}\n\nclass PicParagraph_PicParagraphStyle extends $pb.ProtobufEnum {\n  static const PicParagraph_PicParagraphStyle INVALID_PicParagraphStyle =\n      PicParagraph_PicParagraphStyle._(\n          0, _omitEnumNames ? '' : 'INVALID_PicParagraphStyle');\n  static const PicParagraph_PicParagraphStyle NINE_CELL =\n      PicParagraph_PicParagraphStyle._(1, _omitEnumNames ? '' : 'NINE_CELL');\n  static const PicParagraph_PicParagraphStyle BIG_SCROLL =\n      PicParagraph_PicParagraphStyle._(2, _omitEnumNames ? '' : 'BIG_SCROLL');\n\n  static const $core.List<PicParagraph_PicParagraphStyle> values =\n      <PicParagraph_PicParagraphStyle>[\n    INVALID_PicParagraphStyle,\n    NINE_CELL,\n    BIG_SCROLL,\n  ];\n\n  static final $core.List<PicParagraph_PicParagraphStyle?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static PicParagraph_PicParagraphStyle? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const PicParagraph_PicParagraphStyle._(super.value, super.name);\n}\n\nclass TextNode_TextNodeType extends $pb.ProtobufEnum {\n  static const TextNode_TextNodeType INVALID_TextNodeType =\n      TextNode_TextNodeType._(0, _omitEnumNames ? '' : 'INVALID_TextNodeType');\n  static const TextNode_TextNodeType WORDS =\n      TextNode_TextNodeType._(1, _omitEnumNames ? '' : 'WORDS');\n  static const TextNode_TextNodeType EMOTE =\n      TextNode_TextNodeType._(2, _omitEnumNames ? '' : 'EMOTE');\n  static const TextNode_TextNodeType AT_TextNodeType =\n      TextNode_TextNodeType._(3, _omitEnumNames ? '' : 'AT_TextNodeType');\n  static const TextNode_TextNodeType BIZ_LINK =\n      TextNode_TextNodeType._(4, _omitEnumNames ? '' : 'BIZ_LINK');\n  static const TextNode_TextNodeType FORMULA =\n      TextNode_TextNodeType._(5, _omitEnumNames ? '' : 'FORMULA');\n\n  static const $core.List<TextNode_TextNodeType> values =\n      <TextNode_TextNodeType>[\n    INVALID_TextNodeType,\n    WORDS,\n    EMOTE,\n    AT_TextNodeType,\n    BIZ_LINK,\n    FORMULA,\n  ];\n\n  static final $core.List<TextNode_TextNodeType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 5);\n  static TextNode_TextNodeType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const TextNode_TextNodeType._(super.value, super.name);\n}\n\nconst $core.bool _omitEnumNames =\n    $core.bool.fromEnvironment('protobuf.omit_enum_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/dynamic/v2.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/dynamic/v2.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use addButtonBgStyleDescriptor instead')\nconst AddButtonBgStyle$json = {\n  '1': 'AddButtonBgStyle',\n  '2': [\n    {'1': 'fill', '2': 0},\n    {'1': 'stroke', '2': 1},\n    {'1': 'gray', '2': 2},\n  ],\n};\n\n/// Descriptor for `AddButtonBgStyle`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List addButtonBgStyleDescriptor = $convert.base64Decode(\n    'ChBBZGRCdXR0b25CZ1N0eWxlEggKBGZpbGwQABIKCgZzdHJva2UQARIICgRncmF5EAI=');\n\n@$core.Deprecated('Use addButtonTypeDescriptor instead')\nconst AddButtonType$json = {\n  '1': 'AddButtonType',\n  '2': [\n    {'1': 'bt_none', '2': 0},\n    {'1': 'bt_jump', '2': 1},\n    {'1': 'bt_button', '2': 2},\n  ],\n};\n\n/// Descriptor for `AddButtonType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List addButtonTypeDescriptor = $convert.base64Decode(\n    'Cg1BZGRCdXR0b25UeXBlEgsKB2J0X25vbmUQABILCgdidF9qdW1wEAESDQoJYnRfYnV0dG9uEA'\n    'I=');\n\n@$core.Deprecated('Use additionVoteStateDescriptor instead')\nconst AdditionVoteState$json = {\n  '1': 'AdditionVoteState',\n  '2': [\n    {'1': 'addition_vote_state_none', '2': 0},\n    {'1': 'addition_vote_state_open', '2': 1},\n    {'1': 'addition_vote_state_close', '2': 2},\n  ],\n};\n\n/// Descriptor for `AdditionVoteState`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List additionVoteStateDescriptor = $convert.base64Decode(\n    'ChFBZGRpdGlvblZvdGVTdGF0ZRIcChhhZGRpdGlvbl92b3RlX3N0YXRlX25vbmUQABIcChhhZG'\n    'RpdGlvbl92b3RlX3N0YXRlX29wZW4QARIdChlhZGRpdGlvbl92b3RlX3N0YXRlX2Nsb3NlEAI=');\n\n@$core.Deprecated('Use additionVoteTypeDescriptor instead')\nconst AdditionVoteType$json = {\n  '1': 'AdditionVoteType',\n  '2': [\n    {'1': 'addition_vote_type_none', '2': 0},\n    {'1': 'addition_vote_type_word', '2': 1},\n    {'1': 'addition_vote_type_pic', '2': 2},\n    {'1': 'addition_vote_type_default', '2': 3},\n  ],\n};\n\n/// Descriptor for `AdditionVoteType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List additionVoteTypeDescriptor = $convert.base64Decode(\n    'ChBBZGRpdGlvblZvdGVUeXBlEhsKF2FkZGl0aW9uX3ZvdGVfdHlwZV9ub25lEAASGwoXYWRkaX'\n    'Rpb25fdm90ZV90eXBlX3dvcmQQARIaChZhZGRpdGlvbl92b3RlX3R5cGVfcGljEAISHgoaYWRk'\n    'aXRpb25fdm90ZV90eXBlX2RlZmF1bHQQAw==');\n\n@$core.Deprecated('Use additionalButtonClickTypeDescriptor instead')\nconst AdditionalButtonClickType$json = {\n  '1': 'AdditionalButtonClickType',\n  '2': [\n    {'1': 'click_none', '2': 0},\n    {'1': 'click_up', '2': 1},\n  ],\n};\n\n/// Descriptor for `AdditionalButtonClickType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List additionalButtonClickTypeDescriptor =\n    $convert.base64Decode(\n        'ChlBZGRpdGlvbmFsQnV0dG9uQ2xpY2tUeXBlEg4KCmNsaWNrX25vbmUQABIMCghjbGlja191cB'\n        'AB');\n\n@$core.Deprecated('Use additionalButtonStatusDescriptor instead')\nconst AdditionalButtonStatus$json = {\n  '1': 'AdditionalButtonStatus',\n  '2': [\n    {'1': 'none', '2': 0},\n    {'1': 'uncheck', '2': 1},\n    {'1': 'check', '2': 2},\n  ],\n};\n\n/// Descriptor for `AdditionalButtonStatus`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List additionalButtonStatusDescriptor =\n    $convert.base64Decode(\n        'ChZBZGRpdGlvbmFsQnV0dG9uU3RhdHVzEggKBG5vbmUQABILCgd1bmNoZWNrEAESCQoFY2hlY2'\n        'sQAg==');\n\n@$core.Deprecated('Use additionalShareShowTypeDescriptor instead')\nconst AdditionalShareShowType$json = {\n  '1': 'AdditionalShareShowType',\n  '2': [\n    {'1': 'st_none', '2': 0},\n    {'1': 'st_show', '2': 1},\n  ],\n};\n\n/// Descriptor for `AdditionalShareShowType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List additionalShareShowTypeDescriptor =\n    $convert.base64Decode(\n        'ChdBZGRpdGlvbmFsU2hhcmVTaG93VHlwZRILCgdzdF9ub25lEAASCwoHc3Rfc2hvdxAB');\n\n@$core.Deprecated('Use additionalTypeDescriptor instead')\nconst AdditionalType$json = {\n  '1': 'AdditionalType',\n  '2': [\n    {'1': 'additional_none', '2': 0},\n    {'1': 'additional_type_pgc', '2': 1},\n    {'1': 'additional_type_goods', '2': 2},\n    {'1': 'additional_type_vote', '2': 3},\n    {'1': 'additional_type_common', '2': 4},\n    {'1': 'additional_type_esport', '2': 5},\n    {'1': 'additional_type_up_rcmd', '2': 6},\n    {'1': 'additional_type_ugc', '2': 7},\n    {'1': 'additional_type_up_reservation', '2': 8},\n    {'1': 'additional_type_article', '2': 9},\n    {'1': 'additional_type_live_room', '2': 10},\n    {'1': 'additional_type_music', '2': 11},\n  ],\n};\n\n/// Descriptor for `AdditionalType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List additionalTypeDescriptor = $convert.base64Decode(\n    'Cg5BZGRpdGlvbmFsVHlwZRITCg9hZGRpdGlvbmFsX25vbmUQABIXChNhZGRpdGlvbmFsX3R5cG'\n    'VfcGdjEAESGQoVYWRkaXRpb25hbF90eXBlX2dvb2RzEAISGAoUYWRkaXRpb25hbF90eXBlX3Zv'\n    'dGUQAxIaChZhZGRpdGlvbmFsX3R5cGVfY29tbW9uEAQSGgoWYWRkaXRpb25hbF90eXBlX2VzcG'\n    '9ydBAFEhsKF2FkZGl0aW9uYWxfdHlwZV91cF9yY21kEAYSFwoTYWRkaXRpb25hbF90eXBlX3Vn'\n    'YxAHEiIKHmFkZGl0aW9uYWxfdHlwZV91cF9yZXNlcnZhdGlvbhAIEhsKF2FkZGl0aW9uYWxfdH'\n    'lwZV9hcnRpY2xlEAkSHQoZYWRkaXRpb25hbF90eXBlX2xpdmVfcm9vbRAKEhkKFWFkZGl0aW9u'\n    'YWxfdHlwZV9tdXNpYxAL');\n\n@$core.Deprecated('Use authorBadgeStyleDescriptor instead')\nconst AuthorBadgeStyle$json = {\n  '1': 'AuthorBadgeStyle',\n  '2': [\n    {'1': 'AUTHOR_BADGE_STYLE_INVALID', '2': 0},\n    {'1': 'AUTHOR_BADGE_STYLE_GRAY_OUTLINE', '2': 1},\n  ],\n};\n\n/// Descriptor for `AuthorBadgeStyle`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List authorBadgeStyleDescriptor = $convert.base64Decode(\n    'ChBBdXRob3JCYWRnZVN0eWxlEh4KGkFVVEhPUl9CQURHRV9TVFlMRV9JTlZBTElEEAASIwofQV'\n    'VUSE9SX0JBREdFX1NUWUxFX0dSQVlfT1VUTElORRAB');\n\n@$core.Deprecated('Use campusEntryTypeDescriptor instead')\nconst CampusEntryType$json = {\n  '1': 'CampusEntryType',\n  '2': [\n    {'1': 'NONE', '2': 0},\n    {'1': 'ENTRY_DYNAMIC', '2': 1},\n    {'1': 'ENTRY_HOME', '2': 2},\n  ],\n};\n\n/// Descriptor for `CampusEntryType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List campusEntryTypeDescriptor = $convert.base64Decode(\n    'Cg9DYW1wdXNFbnRyeVR5cGUSCAoETk9ORRAAEhEKDUVOVFJZX0RZTkFNSUMQARIOCgpFTlRSWV'\n    '9IT01FEAI=');\n\n@$core.Deprecated('Use campusHomePageTypeDescriptor instead')\nconst CampusHomePageType$json = {\n  '1': 'CampusHomePageType',\n  '2': [\n    {'1': 'PAGE_MAJOR', '2': 0},\n    {'1': 'PAGE_SUBORDINATE', '2': 1},\n    {'1': 'PAGE_MAJOR_DETAIL', '2': 2},\n  ],\n};\n\n/// Descriptor for `CampusHomePageType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List campusHomePageTypeDescriptor = $convert.base64Decode(\n    'ChJDYW1wdXNIb21lUGFnZVR5cGUSDgoKUEFHRV9NQUpPUhAAEhQKEFBBR0VfU1VCT1JESU5BVE'\n    'UQARIVChFQQUdFX01BSk9SX0RFVEFJTBAC');\n\n@$core.Deprecated('Use campusMngAuditStatusDescriptor instead')\nconst CampusMngAuditStatus$json = {\n  '1': 'CampusMngAuditStatus',\n  '2': [\n    {'1': 'campus_mng_audit_none', '2': 0},\n    {'1': 'campus_mng_audit_in_process', '2': 1},\n    {'1': 'campus_mng_audit_failed', '2': 2},\n  ],\n};\n\n/// Descriptor for `CampusMngAuditStatus`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List campusMngAuditStatusDescriptor = $convert.base64Decode(\n    'ChRDYW1wdXNNbmdBdWRpdFN0YXR1cxIZChVjYW1wdXNfbW5nX2F1ZGl0X25vbmUQABIfChtjYW'\n    '1wdXNfbW5nX2F1ZGl0X2luX3Byb2Nlc3MQARIbChdjYW1wdXNfbW5nX2F1ZGl0X2ZhaWxlZBAC');\n\n@$core.Deprecated('Use campusMngItemTypeDescriptor instead')\nconst CampusMngItemType$json = {\n  '1': 'CampusMngItemType',\n  '2': [\n    {'1': 'campus_mng_none', '2': 0},\n    {'1': 'campus_mng_basic_info', '2': 1},\n    {'1': 'campus_mng_badge', '2': 2},\n    {'1': 'campus_mng_slogan', '2': 3},\n    {'1': 'campus_mng_quiz', '2': 4},\n  ],\n};\n\n/// Descriptor for `CampusMngItemType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List campusMngItemTypeDescriptor = $convert.base64Decode(\n    'ChFDYW1wdXNNbmdJdGVtVHlwZRITCg9jYW1wdXNfbW5nX25vbmUQABIZChVjYW1wdXNfbW5nX2'\n    'Jhc2ljX2luZm8QARIUChBjYW1wdXNfbW5nX2JhZGdlEAISFQoRY2FtcHVzX21uZ19zbG9nYW4Q'\n    'AxITCg9jYW1wdXNfbW5nX3F1aXoQBA==');\n\n@$core.Deprecated('Use campusMngQuizActionDescriptor instead')\nconst CampusMngQuizAction$json = {\n  '1': 'CampusMngQuizAction',\n  '2': [\n    {'1': 'campus_mng_quiz_act_list', '2': 0},\n    {'1': 'campus_mng_quiz_act_add', '2': 1},\n    {'1': 'campus_mng_quiz_act_del', '2': 2},\n  ],\n};\n\n/// Descriptor for `CampusMngQuizAction`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List campusMngQuizActionDescriptor = $convert.base64Decode(\n    'ChNDYW1wdXNNbmdRdWl6QWN0aW9uEhwKGGNhbXB1c19tbmdfcXVpel9hY3RfbGlzdBAAEhsKF2'\n    'NhbXB1c19tbmdfcXVpel9hY3RfYWRkEAESGwoXY2FtcHVzX21uZ19xdWl6X2FjdF9kZWwQAg==');\n\n@$core.Deprecated('Use campusOnlineStatusDescriptor instead')\nconst CampusOnlineStatus$json = {\n  '1': 'CampusOnlineStatus',\n  '2': [\n    {'1': 'campus_online_offline', '2': 0},\n    {'1': 'campus_online_online', '2': 1},\n  ],\n};\n\n/// Descriptor for `CampusOnlineStatus`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List campusOnlineStatusDescriptor = $convert.base64Decode(\n    'ChJDYW1wdXNPbmxpbmVTdGF0dXMSGQoVY2FtcHVzX29ubGluZV9vZmZsaW5lEAASGAoUY2FtcH'\n    'VzX29ubGluZV9vbmxpbmUQAQ==');\n\n@$core.Deprecated('Use campusRcmdReqFromDescriptor instead')\nconst CampusRcmdReqFrom$json = {\n  '1': 'CampusRcmdReqFrom',\n  '2': [\n    {'1': 'CAMPUS_RCMD_FROM_UNKNOWN', '2': 0},\n    {'1': 'CAMPUS_RCMD_FROM_HOME_UN_OPEN', '2': 1},\n    {'1': 'CAMPUS_RCMD_FROM_VISIT_OTHER', '2': 2},\n    {'1': 'CAMPUS_RCMD_FROM_HOME_MOMENT', '2': 3},\n    {'1': 'CAMPUS_RCMD_FROM_DYN_MOMENT', '2': 4},\n    {'1': 'CAMPUS_RCMD_FROM_PAGE_SUBORDINATE_MOMENT', '2': 5},\n  ],\n};\n\n/// Descriptor for `CampusRcmdReqFrom`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List campusRcmdReqFromDescriptor = $convert.base64Decode(\n    'ChFDYW1wdXNSY21kUmVxRnJvbRIcChhDQU1QVVNfUkNNRF9GUk9NX1VOS05PV04QABIhCh1DQU'\n    '1QVVNfUkNNRF9GUk9NX0hPTUVfVU5fT1BFThABEiAKHENBTVBVU19SQ01EX0ZST01fVklTSVRf'\n    'T1RIRVIQAhIgChxDQU1QVVNfUkNNRF9GUk9NX0hPTUVfTU9NRU5UEAMSHwobQ0FNUFVTX1JDTU'\n    'RfRlJPTV9EWU5fTU9NRU5UEAQSLAooQ0FNUFVTX1JDTURfRlJPTV9QQUdFX1NVQk9SRElOQVRF'\n    'X01PTUVOVBAF');\n\n@$core.Deprecated('Use campusReqFromTypeDescriptor instead')\nconst CampusReqFromType$json = {\n  '1': 'CampusReqFromType',\n  '2': [\n    {'1': 'DYNAMIC', '2': 0},\n    {'1': 'HOME', '2': 1},\n  ],\n};\n\n/// Descriptor for `CampusReqFromType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List campusReqFromTypeDescriptor = $convert\n    .base64Decode('ChFDYW1wdXNSZXFGcm9tVHlwZRILCgdEWU5BTUlDEAASCAoESE9NRRAB');\n\n@$core.Deprecated('Use campusTabTypeDescriptor instead')\nconst CampusTabType$json = {\n  '1': 'CampusTabType',\n  '2': [\n    {'1': 'campus_none', '2': 0},\n    {'1': 'campus_school', '2': 1},\n    {'1': 'campus_dynamic', '2': 2},\n    {'1': 'campus_account', '2': 3},\n    {'1': 'campus_billboard', '2': 4},\n    {'1': 'campus_topic', '2': 5},\n    {'1': 'campues_other', '2': 6},\n  ],\n};\n\n/// Descriptor for `CampusTabType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List campusTabTypeDescriptor = $convert.base64Decode(\n    'Cg1DYW1wdXNUYWJUeXBlEg8KC2NhbXB1c19ub25lEAASEQoNY2FtcHVzX3NjaG9vbBABEhIKDm'\n    'NhbXB1c19keW5hbWljEAISEgoOY2FtcHVzX2FjY291bnQQAxIUChBjYW1wdXNfYmlsbGJvYXJk'\n    'EAQSEAoMY2FtcHVzX3RvcGljEAUSEQoNY2FtcHVlc19vdGhlchAG');\n\n@$core.Deprecated('Use coverIconDescriptor instead')\nconst CoverIcon$json = {\n  '1': 'CoverIcon',\n  '2': [\n    {'1': 'cover_icon_none', '2': 0},\n    {'1': 'cover_icon_play', '2': 1},\n    {'1': 'cover_icon_danmaku', '2': 2},\n    {'1': 'cover_icon_up', '2': 3},\n    {'1': 'cover_icon_vt', '2': 4},\n    {'1': 'cover_icon_view_cnt', '2': 5},\n    {'1': 'cover_icon_thumb_up', '2': 6},\n    {'1': 'cover_icon_reply', '2': 7},\n    {'1': 'cover_icon_fav', '2': 8},\n    {'1': 'cover_icon_coin', '2': 9},\n    {'1': 'cover_icon_self_seen', '2': 10},\n  ],\n};\n\n/// Descriptor for `CoverIcon`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List coverIconDescriptor = $convert.base64Decode(\n    'CglDb3Zlckljb24SEwoPY292ZXJfaWNvbl9ub25lEAASEwoPY292ZXJfaWNvbl9wbGF5EAESFg'\n    'oSY292ZXJfaWNvbl9kYW5tYWt1EAISEQoNY292ZXJfaWNvbl91cBADEhEKDWNvdmVyX2ljb25f'\n    'dnQQBBIXChNjb3Zlcl9pY29uX3ZpZXdfY250EAUSFwoTY292ZXJfaWNvbl90aHVtYl91cBAGEh'\n    'QKEGNvdmVyX2ljb25fcmVwbHkQBxISCg5jb3Zlcl9pY29uX2ZhdhAIEhMKD2NvdmVyX2ljb25f'\n    'Y29pbhAJEhgKFGNvdmVyX2ljb25fc2VsZl9zZWVuEAo=');\n\n@$core.Deprecated('Use descTypeDescriptor instead')\nconst DescType$json = {\n  '1': 'DescType',\n  '2': [\n    {'1': 'desc_type_none', '2': 0},\n    {'1': 'desc_type_text', '2': 1},\n    {'1': 'desc_type_aite', '2': 2},\n    {'1': 'desc_type_lottery', '2': 3},\n    {'1': 'desc_type_vote', '2': 4},\n    {'1': 'desc_type_topic', '2': 5},\n    {'1': 'desc_type_goods', '2': 6},\n    {'1': 'desc_type_bv', '2': 7},\n    {'1': 'desc_type_av', '2': 8},\n    {'1': 'desc_type_emoji', '2': 9},\n    {'1': 'desc_type_user', '2': 10},\n    {'1': 'desc_type_cv', '2': 11},\n    {'1': 'desc_type_vc', '2': 12},\n    {'1': 'desc_type_web', '2': 13},\n    {'1': 'desc_type_taobao', '2': 14},\n    {'1': 'desc_type_mail', '2': 15},\n    {'1': 'desc_type_ogv_season', '2': 16},\n    {'1': 'desc_type_ogv_ep', '2': 17},\n    {'1': 'desc_type_search_word', '2': 18},\n  ],\n};\n\n/// Descriptor for `DescType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List descTypeDescriptor = $convert.base64Decode(\n    'CghEZXNjVHlwZRISCg5kZXNjX3R5cGVfbm9uZRAAEhIKDmRlc2NfdHlwZV90ZXh0EAESEgoOZG'\n    'VzY190eXBlX2FpdGUQAhIVChFkZXNjX3R5cGVfbG90dGVyeRADEhIKDmRlc2NfdHlwZV92b3Rl'\n    'EAQSEwoPZGVzY190eXBlX3RvcGljEAUSEwoPZGVzY190eXBlX2dvb2RzEAYSEAoMZGVzY190eX'\n    'BlX2J2EAcSEAoMZGVzY190eXBlX2F2EAgSEwoPZGVzY190eXBlX2Vtb2ppEAkSEgoOZGVzY190'\n    'eXBlX3VzZXIQChIQCgxkZXNjX3R5cGVfY3YQCxIQCgxkZXNjX3R5cGVfdmMQDBIRCg1kZXNjX3'\n    'R5cGVfd2ViEA0SFAoQZGVzY190eXBlX3Rhb2JhbxAOEhIKDmRlc2NfdHlwZV9tYWlsEA8SGAoU'\n    'ZGVzY190eXBlX29ndl9zZWFzb24QEBIUChBkZXNjX3R5cGVfb2d2X2VwEBESGQoVZGVzY190eX'\n    'BlX3NlYXJjaF93b3JkEBI=');\n\n@$core.Deprecated('Use disableStateDescriptor instead')\nconst DisableState$json = {\n  '1': 'DisableState',\n  '2': [\n    {'1': 'highlight', '2': 0},\n    {'1': 'gary', '2': 1},\n  ],\n};\n\n/// Descriptor for `DisableState`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List disableStateDescriptor = $convert\n    .base64Decode('CgxEaXNhYmxlU3RhdGUSDQoJaGlnaGxpZ2h0EAASCAoEZ2FyeRAB');\n\n@$core.Deprecated('Use dynExtendTypeDescriptor instead')\nconst DynExtendType$json = {\n  '1': 'DynExtendType',\n  '2': [\n    {'1': 'dyn_ext_type_none', '2': 0},\n    {'1': 'dyn_ext_type_topic', '2': 1},\n    {'1': 'dyn_ext_type_lbs', '2': 2},\n    {'1': 'dyn_ext_type_hot', '2': 3},\n    {'1': 'dyn_ext_type_game', '2': 4},\n    {'1': 'dyn_ext_type_common', '2': 5},\n    {'1': 'dyn_ext_type_biliCut', '2': 6},\n    {'1': 'dyn_ext_type_ogv', '2': 7},\n    {'1': 'dyn_ext_type_auto_ogv', '2': 8},\n    {'1': 'dyn_ext_type_article_tag', '2': 9},\n  ],\n};\n\n/// Descriptor for `DynExtendType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List dynExtendTypeDescriptor = $convert.base64Decode(\n    'Cg1EeW5FeHRlbmRUeXBlEhUKEWR5bl9leHRfdHlwZV9ub25lEAASFgoSZHluX2V4dF90eXBlX3'\n    'RvcGljEAESFAoQZHluX2V4dF90eXBlX2xicxACEhQKEGR5bl9leHRfdHlwZV9ob3QQAxIVChFk'\n    'eW5fZXh0X3R5cGVfZ2FtZRAEEhcKE2R5bl9leHRfdHlwZV9jb21tb24QBRIYChRkeW5fZXh0X3'\n    'R5cGVfYmlsaUN1dBAGEhQKEGR5bl9leHRfdHlwZV9vZ3YQBxIZChVkeW5fZXh0X3R5cGVfYXV0'\n    'b19vZ3YQCBIcChhkeW5fZXh0X3R5cGVfYXJ0aWNsZV90YWcQCQ==');\n\n@$core.Deprecated('Use dynModuleTypeDescriptor instead')\nconst DynModuleType$json = {\n  '1': 'DynModuleType',\n  '2': [\n    {'1': 'module_none', '2': 0},\n    {'1': 'module_author', '2': 1},\n    {'1': 'module_dispute', '2': 2},\n    {'1': 'module_desc', '2': 3},\n    {'1': 'module_dynamic', '2': 4},\n    {'1': 'module_forward', '2': 5},\n    {'1': 'module_likeUser', '2': 6},\n    {'1': 'module_extend', '2': 7},\n    {'1': 'module_additional', '2': 8},\n    {'1': 'module_stat', '2': 9},\n    {'1': 'module_fold', '2': 10},\n    {'1': 'module_comment', '2': 11},\n    {'1': 'module_interaction', '2': 12},\n    {'1': 'module_author_forward', '2': 13},\n    {'1': 'module_ad', '2': 14},\n    {'1': 'module_banner', '2': 15},\n    {'1': 'module_item_null', '2': 16},\n    {'1': 'module_share_info', '2': 17},\n    {'1': 'module_recommend', '2': 18},\n    {'1': 'module_stat_forward', '2': 19},\n    {'1': 'module_top', '2': 20},\n    {'1': 'module_bottom', '2': 21},\n    {'1': 'module_story', '2': 22},\n    {'1': 'module_topic', '2': 23},\n    {'1': 'module_topic_details_ext', '2': 24},\n    {'1': 'module_top_tag', '2': 25},\n    {'1': 'module_topic_brief', '2': 26},\n    {'1': 'module_title', '2': 27},\n    {'1': 'module_button', '2': 28},\n    {'1': 'module_notice', '2': 29},\n    {'1': 'module_opus_summary', '2': 30},\n    {'1': 'module_copyright', '2': 31},\n    {'1': 'module_paragraph', '2': 32},\n    {'1': 'module_blocked', '2': 33},\n    {'1': 'module_text_notice', '2': 34},\n    {'1': 'module_opus_collection', '2': 35},\n    {'1': 'module_onetime_notice', '2': 36},\n    {'1': 'module_sneaking_ad', '2': 37},\n    {'1': 'module_manga_horizontal_page_pic_content', '2': 38},\n    {'1': 'module_manga_vertical_slide_pic_content', '2': 39},\n    {'1': 'module_manga_cover_pic_content', '2': 40},\n    {'1': 'module_author_for_subscribe', '2': 41},\n    {'1': 'module_author_slim', '2': 42},\n    {'1': 'module_manga_collection', '2': 43},\n    {'1': 'module_cooperation', '2': 44},\n  ],\n};\n\n/// Descriptor for `DynModuleType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List dynModuleTypeDescriptor = $convert.base64Decode(\n    'Cg1EeW5Nb2R1bGVUeXBlEg8KC21vZHVsZV9ub25lEAASEQoNbW9kdWxlX2F1dGhvchABEhIKDm'\n    '1vZHVsZV9kaXNwdXRlEAISDwoLbW9kdWxlX2Rlc2MQAxISCg5tb2R1bGVfZHluYW1pYxAEEhIK'\n    'Dm1vZHVsZV9mb3J3YXJkEAUSEwoPbW9kdWxlX2xpa2VVc2VyEAYSEQoNbW9kdWxlX2V4dGVuZB'\n    'AHEhUKEW1vZHVsZV9hZGRpdGlvbmFsEAgSDwoLbW9kdWxlX3N0YXQQCRIPCgttb2R1bGVfZm9s'\n    'ZBAKEhIKDm1vZHVsZV9jb21tZW50EAsSFgoSbW9kdWxlX2ludGVyYWN0aW9uEAwSGQoVbW9kdW'\n    'xlX2F1dGhvcl9mb3J3YXJkEA0SDQoJbW9kdWxlX2FkEA4SEQoNbW9kdWxlX2Jhbm5lchAPEhQK'\n    'EG1vZHVsZV9pdGVtX251bGwQEBIVChFtb2R1bGVfc2hhcmVfaW5mbxAREhQKEG1vZHVsZV9yZW'\n    'NvbW1lbmQQEhIXChNtb2R1bGVfc3RhdF9mb3J3YXJkEBMSDgoKbW9kdWxlX3RvcBAUEhEKDW1v'\n    'ZHVsZV9ib3R0b20QFRIQCgxtb2R1bGVfc3RvcnkQFhIQCgxtb2R1bGVfdG9waWMQFxIcChhtb2'\n    'R1bGVfdG9waWNfZGV0YWlsc19leHQQGBISCg5tb2R1bGVfdG9wX3RhZxAZEhYKEm1vZHVsZV90'\n    'b3BpY19icmllZhAaEhAKDG1vZHVsZV90aXRsZRAbEhEKDW1vZHVsZV9idXR0b24QHBIRCg1tb2'\n    'R1bGVfbm90aWNlEB0SFwoTbW9kdWxlX29wdXNfc3VtbWFyeRAeEhQKEG1vZHVsZV9jb3B5cmln'\n    'aHQQHxIUChBtb2R1bGVfcGFyYWdyYXBoECASEgoObW9kdWxlX2Jsb2NrZWQQIRIWChJtb2R1bG'\n    'VfdGV4dF9ub3RpY2UQIhIaChZtb2R1bGVfb3B1c19jb2xsZWN0aW9uECMSGQoVbW9kdWxlX29u'\n    'ZXRpbWVfbm90aWNlECQSFgoSbW9kdWxlX3NuZWFraW5nX2FkECUSLAoobW9kdWxlX21hbmdhX2'\n    'hvcml6b250YWxfcGFnZV9waWNfY29udGVudBAmEisKJ21vZHVsZV9tYW5nYV92ZXJ0aWNhbF9z'\n    'bGlkZV9waWNfY29udGVudBAnEiIKHm1vZHVsZV9tYW5nYV9jb3Zlcl9waWNfY29udGVudBAoEh'\n    '8KG21vZHVsZV9hdXRob3JfZm9yX3N1YnNjcmliZRApEhYKEm1vZHVsZV9hdXRob3Jfc2xpbRAq'\n    'EhsKF21vZHVsZV9tYW5nYV9jb2xsZWN0aW9uECsSFgoSbW9kdWxlX2Nvb3BlcmF0aW9uECw=');\n\n@$core.Deprecated('Use dynVisibilityStatusDescriptor instead')\nconst DynVisibilityStatus$json = {\n  '1': 'DynVisibilityStatus',\n  '2': [\n    {'1': 'DYN_VISIBILITY_PUBLIC', '2': 0},\n    {'1': 'DYN_VISIBILITY_SELF_SEEN_ONLY', '2': 1},\n  ],\n};\n\n/// Descriptor for `DynVisibilityStatus`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List dynVisibilityStatusDescriptor = $convert.base64Decode(\n    'ChNEeW5WaXNpYmlsaXR5U3RhdHVzEhkKFURZTl9WSVNJQklMSVRZX1BVQkxJQxAAEiEKHURZTl'\n    '9WSVNJQklMSVRZX1NFTEZfU0VFTl9PTkxZEAE=');\n\n@$core.Deprecated('Use dynamicTypeDescriptor instead')\nconst DynamicType$json = {\n  '1': 'DynamicType',\n  '2': [\n    {'1': 'dyn_none', '2': 0},\n    {'1': 'forward', '2': 1},\n    {'1': 'av', '2': 2},\n    {'1': 'pgc', '2': 3},\n    {'1': 'courses', '2': 4},\n    {'1': 'fold', '2': 5},\n    {'1': 'word', '2': 6},\n    {'1': 'draw', '2': 7},\n    {'1': 'article', '2': 8},\n    {'1': 'music', '2': 9},\n    {'1': 'common_square', '2': 10},\n    {'1': 'common_vertical', '2': 11},\n    {'1': 'live', '2': 12},\n    {'1': 'medialist', '2': 13},\n    {'1': 'courses_season', '2': 14},\n    {'1': 'ad', '2': 15},\n    {'1': 'applet', '2': 16},\n    {'1': 'subscription', '2': 17},\n    {'1': 'live_rcmd', '2': 18},\n    {'1': 'banner', '2': 19},\n    {'1': 'ugc_season', '2': 20},\n    {'1': 'subscription_new', '2': 21},\n    {'1': 'story', '2': 22},\n    {'1': 'topic_rcmd', '2': 23},\n    {'1': 'cour_up', '2': 24},\n    {'1': 'topic_set', '2': 25},\n    {'1': 'notice', '2': 26},\n    {'1': 'text_notice', '2': 27},\n    {'1': 'onetime_notice', '2': 28},\n    {'1': 'manga_ep', '2': 29},\n  ],\n};\n\n/// Descriptor for `DynamicType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List dynamicTypeDescriptor = $convert.base64Decode(\n    'CgtEeW5hbWljVHlwZRIMCghkeW5fbm9uZRAAEgsKB2ZvcndhcmQQARIGCgJhdhACEgcKA3BnYx'\n    'ADEgsKB2NvdXJzZXMQBBIICgRmb2xkEAUSCAoEd29yZBAGEggKBGRyYXcQBxILCgdhcnRpY2xl'\n    'EAgSCQoFbXVzaWMQCRIRCg1jb21tb25fc3F1YXJlEAoSEwoPY29tbW9uX3ZlcnRpY2FsEAsSCA'\n    'oEbGl2ZRAMEg0KCW1lZGlhbGlzdBANEhIKDmNvdXJzZXNfc2Vhc29uEA4SBgoCYWQQDxIKCgZh'\n    'cHBsZXQQEBIQCgxzdWJzY3JpcHRpb24QERINCglsaXZlX3JjbWQQEhIKCgZiYW5uZXIQExIOCg'\n    'p1Z2Nfc2Vhc29uEBQSFAoQc3Vic2NyaXB0aW9uX25ldxAVEgkKBXN0b3J5EBYSDgoKdG9waWNf'\n    'cmNtZBAXEgsKB2NvdXJfdXAQGBINCgl0b3BpY19zZXQQGRIKCgZub3RpY2UQGhIPCgt0ZXh0X2'\n    '5vdGljZRAbEhIKDm9uZXRpbWVfbm90aWNlEBwSDAoIbWFuZ2FfZXAQHQ==');\n\n@$core.Deprecated('Use emojiTypeDescriptor instead')\nconst EmojiType$json = {\n  '1': 'EmojiType',\n  '2': [\n    {'1': 'emoji_none', '2': 0},\n    {'1': 'emoji_old', '2': 1},\n    {'1': 'emoji_new', '2': 2},\n    {'1': 'vip', '2': 3},\n  ],\n};\n\n/// Descriptor for `EmojiType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List emojiTypeDescriptor = $convert.base64Decode(\n    'CglFbW9qaVR5cGUSDgoKZW1vamlfbm9uZRAAEg0KCWVtb2ppX29sZBABEg0KCWVtb2ppX25ldx'\n    'ACEgcKA3ZpcBAD');\n\n@$core.Deprecated('Use emoteClickActionDescriptor instead')\nconst EmoteClickAction$json = {\n  '1': 'EmoteClickAction',\n  '2': [\n    {'1': 'EMOTE_CLICK_NONE', '2': 0},\n    {'1': 'EMOTE_CLICK_POPUP_PREVIEW', '2': 1},\n  ],\n};\n\n/// Descriptor for `EmoteClickAction`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List emoteClickActionDescriptor = $convert.base64Decode(\n    'ChBFbW90ZUNsaWNrQWN0aW9uEhQKEEVNT1RFX0NMSUNLX05PTkUQABIdChlFTU9URV9DTElDS1'\n    '9QT1BVUF9QUkVWSUVXEAE=');\n\n@$core.Deprecated('Use espaceStyleDescriptor instead')\nconst EspaceStyle$json = {\n  '1': 'EspaceStyle',\n  '2': [\n    {'1': 'moba', '2': 0},\n  ],\n};\n\n/// Descriptor for `EspaceStyle`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List espaceStyleDescriptor =\n    $convert.base64Decode('CgtFc3BhY2VTdHlsZRIICgRtb2JhEAA=');\n\n@$core.Deprecated('Use flowItemTypeDescriptor instead')\nconst FlowItemType$json = {\n  '1': 'FlowItemType',\n  '2': [\n    {'1': 'FLOW_ITEM_TYPE_INVALID', '2': 0},\n    {'1': 'FLOW_ITEM_TYPE_OPUS', '2': 1},\n  ],\n};\n\n/// Descriptor for `FlowItemType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List flowItemTypeDescriptor = $convert.base64Decode(\n    'CgxGbG93SXRlbVR5cGUSGgoWRkxPV19JVEVNX1RZUEVfSU5WQUxJRBAAEhcKE0ZMT1dfSVRFTV'\n    '9UWVBFX09QVVMQAQ==');\n\n@$core.Deprecated('Use foldTypeDescriptor instead')\nconst FoldType$json = {\n  '1': 'FoldType',\n  '2': [\n    {'1': 'FoldTypeZore', '2': 0},\n    {'1': 'FoldTypePublish', '2': 1},\n    {'1': 'FoldTypeFrequent', '2': 2},\n    {'1': 'FoldTypeUnite', '2': 3},\n    {'1': 'FoldTypeLimit', '2': 4},\n    {'1': 'FoldTypeTopicMerged', '2': 5},\n  ],\n};\n\n/// Descriptor for `FoldType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List foldTypeDescriptor = $convert.base64Decode(\n    'CghGb2xkVHlwZRIQCgxGb2xkVHlwZVpvcmUQABITCg9Gb2xkVHlwZVB1Ymxpc2gQARIUChBGb2'\n    'xkVHlwZUZyZXF1ZW50EAISEQoNRm9sZFR5cGVVbml0ZRADEhEKDUZvbGRUeXBlTGltaXQQBBIX'\n    'ChNGb2xkVHlwZVRvcGljTWVyZ2VkEAU=');\n\n@$core.Deprecated('Use goodsJumpTypeDescriptor instead')\nconst GoodsJumpType$json = {\n  '1': 'GoodsJumpType',\n  '2': [\n    {'1': 'goods_none', '2': 0},\n    {'1': 'goods_schema', '2': 1},\n    {'1': 'goods_url', '2': 2},\n  ],\n};\n\n/// Descriptor for `GoodsJumpType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List goodsJumpTypeDescriptor = $convert.base64Decode(\n    'Cg1Hb29kc0p1bXBUeXBlEg4KCmdvb2RzX25vbmUQABIQCgxnb29kc19zY2hlbWEQARINCglnb2'\n    '9kc191cmwQAg==');\n\n@$core.Deprecated('Use highlightTextStyleDescriptor instead')\nconst HighlightTextStyle$json = {\n  '1': 'HighlightTextStyle',\n  '2': [\n    {'1': 'style_none', '2': 0},\n    {'1': 'style_highlight', '2': 1},\n  ],\n};\n\n/// Descriptor for `HighlightTextStyle`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List highlightTextStyleDescriptor = $convert.base64Decode(\n    'ChJIaWdobGlnaHRUZXh0U3R5bGUSDgoKc3R5bGVfbm9uZRAAEhMKD3N0eWxlX2hpZ2hsaWdodB'\n    'AB');\n\n@$core.Deprecated('Use homePageTabSttingStatusDescriptor instead')\nconst HomePageTabSttingStatus$json = {\n  '1': 'HomePageTabSttingStatus',\n  '2': [\n    {'1': 'SETTING_INVALID', '2': 0},\n    {'1': 'SETTING_OPEN', '2': 1},\n    {'1': 'SETTING_CLOSE', '2': 2},\n  ],\n};\n\n/// Descriptor for `HomePageTabSttingStatus`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List homePageTabSttingStatusDescriptor =\n    $convert.base64Decode(\n        'ChdIb21lUGFnZVRhYlN0dGluZ1N0YXR1cxITCg9TRVRUSU5HX0lOVkFMSUQQABIQCgxTRVRUSU'\n        '5HX09QRU4QARIRCg1TRVRUSU5HX0NMT1NFEAI=');\n\n@$core.Deprecated('Use iconResLocalDescriptor instead')\nconst IconResLocal$json = {\n  '1': 'IconResLocal',\n  '2': [\n    {'1': 'ICON_RES_LOCAL_NONE', '2': 0},\n    {'1': 'ICON_RES_LOCAL_LIVE', '2': 1},\n  ],\n};\n\n/// Descriptor for `IconResLocal`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List iconResLocalDescriptor = $convert.base64Decode(\n    'CgxJY29uUmVzTG9jYWwSFwoTSUNPTl9SRVNfTE9DQUxfTk9ORRAAEhcKE0lDT05fUkVTX0xPQ0'\n    'FMX0xJVkUQAQ==');\n\n@$core.Deprecated('Use imageStyleDescriptor instead')\nconst ImageStyle$json = {\n  '1': 'ImageStyle',\n  '2': [\n    {'1': 'add_style_vertical', '2': 0},\n    {'1': 'add_style_square', '2': 1},\n  ],\n};\n\n/// Descriptor for `ImageStyle`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List imageStyleDescriptor = $convert.base64Decode(\n    'CgpJbWFnZVN0eWxlEhYKEmFkZF9zdHlsZV92ZXJ0aWNhbBAAEhQKEGFkZF9zdHlsZV9zcXVhcm'\n    'UQAQ==');\n\n@$core.Deprecated('Use lightFromTypeDescriptor instead')\nconst LightFromType$json = {\n  '1': 'LightFromType',\n  '2': [\n    {'1': 'from_login', '2': 0},\n    {'1': 'from_unlogin', '2': 1},\n  ],\n};\n\n/// Descriptor for `LightFromType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List lightFromTypeDescriptor = $convert.base64Decode(\n    'Cg1MaWdodEZyb21UeXBlEg4KCmZyb21fbG9naW4QABIQCgxmcm9tX3VubG9naW4QAQ==');\n\n@$core.Deprecated('Use linkNodeTypeDescriptor instead')\nconst LinkNodeType$json = {\n  '1': 'LinkNodeType',\n  '2': [\n    {'1': 'INVALID', '2': 0},\n    {'1': 'VIDEO', '2': 1},\n    {'1': 'RESERVE', '2': 2},\n    {'1': 'VOTE', '2': 3},\n    {'1': 'LIVE', '2': 4},\n    {'1': 'LOTTERY', '2': 5},\n    {'1': 'MATCH', '2': 6},\n    {'1': 'GOODS', '2': 7},\n    {'1': 'OGV_SS', '2': 8},\n    {'1': 'OGV_EP', '2': 9},\n    {'1': 'MANGA', '2': 10},\n    {'1': 'CHEESE', '2': 11},\n    {'1': 'VIDEO_TS', '2': 12},\n    {'1': 'AT', '2': 13},\n    {'1': 'HASH_TAG', '2': 14},\n    {'1': 'ARTICLE', '2': 15},\n    {'1': 'URL', '2': 16},\n    {'1': 'MAIL', '2': 17},\n    {'1': 'LBS', '2': 18},\n    {'1': 'ACTIVITY', '2': 19},\n    {'1': 'ATTACH_CARD_OFFICIAL_ACTIVITY', '2': 20},\n    {'1': 'GAME', '2': 21},\n    {'1': 'DECORATION', '2': 22},\n    {'1': 'UP_TOPIC', '2': 23},\n    {'1': 'UP_ACTIVITY', '2': 24},\n    {'1': 'UP_MAOER', '2': 25},\n    {'1': 'MEMBER_GOODS', '2': 26},\n    {'1': 'OPENMALL_UP_ITEMS', '2': 27},\n    {'1': 'SEARCH', '2': 28},\n    {'1': 'MUSIC', '2': 29},\n    {'1': 'GPT_RCMD_QUESTION', '2': 30},\n    {'1': 'MEMBER_TICKET', '2': 31},\n    {'1': 'REPOST_PIC_URL', '2': 32},\n    {'1': 'REPOST_PIC_DYN_URL', '2': 33},\n    {'1': 'OGV_FOLLOW_CARD', '2': 34},\n    {'1': 'ARTICLE_GOODS', '2': 35},\n    {'1': 'ARTICLE_TAG', '2': 36},\n  ],\n};\n\n/// Descriptor for `LinkNodeType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List linkNodeTypeDescriptor = $convert.base64Decode(\n    'CgxMaW5rTm9kZVR5cGUSCwoHSU5WQUxJRBAAEgkKBVZJREVPEAESCwoHUkVTRVJWRRACEggKBF'\n    'ZPVEUQAxIICgRMSVZFEAQSCwoHTE9UVEVSWRAFEgkKBU1BVENIEAYSCQoFR09PRFMQBxIKCgZP'\n    'R1ZfU1MQCBIKCgZPR1ZfRVAQCRIJCgVNQU5HQRAKEgoKBkNIRUVTRRALEgwKCFZJREVPX1RTEA'\n    'wSBgoCQVQQDRIMCghIQVNIX1RBRxAOEgsKB0FSVElDTEUQDxIHCgNVUkwQEBIICgRNQUlMEBES'\n    'BwoDTEJTEBISDAoIQUNUSVZJVFkQExIhCh1BVFRBQ0hfQ0FSRF9PRkZJQ0lBTF9BQ1RJVklUWR'\n    'AUEggKBEdBTUUQFRIOCgpERUNPUkFUSU9OEBYSDAoIVVBfVE9QSUMQFxIPCgtVUF9BQ1RJVklU'\n    'WRAYEgwKCFVQX01BT0VSEBkSEAoMTUVNQkVSX0dPT0RTEBoSFQoRT1BFTk1BTExfVVBfSVRFTV'\n    'MQGxIKCgZTRUFSQ0gQHBIJCgVNVVNJQxAdEhUKEUdQVF9SQ01EX1FVRVNUSU9OEB4SEQoNTUVN'\n    'QkVSX1RJQ0tFVBAfEhIKDlJFUE9TVF9QSUNfVVJMECASFgoSUkVQT1NUX1BJQ19EWU5fVVJMEC'\n    'ESEwoPT0dWX0ZPTExPV19DQVJEECISEQoNQVJUSUNMRV9HT09EUxAjEg8KC0FSVElDTEVfVEFH'\n    'ECQ=');\n\n@$core.Deprecated('Use liveStateDescriptor instead')\nconst LiveState$json = {\n  '1': 'LiveState',\n  '2': [\n    {'1': 'live_none', '2': 0},\n    {'1': 'live_live', '2': 1},\n    {'1': 'live_rotation', '2': 2},\n  ],\n};\n\n/// Descriptor for `LiveState`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List liveStateDescriptor = $convert.base64Decode(\n    'CglMaXZlU3RhdGUSDQoJbGl2ZV9ub25lEAASDQoJbGl2ZV9saXZlEAESEQoNbGl2ZV9yb3RhdG'\n    'lvbhAC');\n\n@$core.Deprecated('Use localIconTypeDescriptor instead')\nconst LocalIconType$json = {\n  '1': 'LocalIconType',\n  '2': [\n    {'1': 'local_icon_comment', '2': 0},\n    {'1': 'local_icon_like', '2': 1},\n    {'1': 'local_icon_avatar', '2': 2},\n    {'1': 'local_icon_cover', '2': 3},\n    {'1': 'local_icon_like_and_forward', '2': 4},\n  ],\n};\n\n/// Descriptor for `LocalIconType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List localIconTypeDescriptor = $convert.base64Decode(\n    'Cg1Mb2NhbEljb25UeXBlEhYKEmxvY2FsX2ljb25fY29tbWVudBAAEhMKD2xvY2FsX2ljb25fbG'\n    'lrZRABEhUKEWxvY2FsX2ljb25fYXZhdGFyEAISFAoQbG9jYWxfaWNvbl9jb3ZlchADEh8KG2xv'\n    'Y2FsX2ljb25fbGlrZV9hbmRfZm9yd2FyZBAE');\n\n@$core.Deprecated('Use mangaLikePageDirectionDescriptor instead')\nconst MangaLikePageDirection$json = {\n  '1': 'MangaLikePageDirection',\n  '2': [\n    {'1': 'PAGE_DIRECTION_INVALID', '2': 0},\n    {'1': 'PAGE_DIRECTION_LEFT_TO_RIGHT', '2': 1},\n    {'1': 'PAGE_DIRECTION_RIGHT_TO_LEFT', '2': 2},\n    {'1': 'PAGE_DIRECTION_LEFT_TO_RIGHT_ROTATE', '2': 3},\n  ],\n};\n\n/// Descriptor for `MangaLikePageDirection`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List mangaLikePageDirectionDescriptor = $convert.base64Decode(\n    'ChZNYW5nYUxpa2VQYWdlRGlyZWN0aW9uEhoKFlBBR0VfRElSRUNUSU9OX0lOVkFMSUQQABIgCh'\n    'xQQUdFX0RJUkVDVElPTl9MRUZUX1RPX1JJR0hUEAESIAocUEFHRV9ESVJFQ1RJT05fUklHSFRf'\n    'VE9fTEVGVBACEicKI1BBR0VfRElSRUNUSU9OX0xFRlRfVE9fUklHSFRfUk9UQVRFEAM=');\n\n@$core.Deprecated('Use mangaLikePicClickActionDescriptor instead')\nconst MangaLikePicClickAction$json = {\n  '1': 'MangaLikePicClickAction',\n  '2': [\n    {'1': 'CLICK_ACT_NONE', '2': 0},\n    {'1': 'CLICK_ACT_MANGA_BROWSER', '2': 1},\n    {'1': 'CLICK_ACT_NORMAL_BROWSER', '2': 2},\n  ],\n};\n\n/// Descriptor for `MangaLikePicClickAction`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List mangaLikePicClickActionDescriptor =\n    $convert.base64Decode(\n        'ChdNYW5nYUxpa2VQaWNDbGlja0FjdGlvbhISCg5DTElDS19BQ1RfTk9ORRAAEhsKF0NMSUNLX0'\n        'FDVF9NQU5HQV9CUk9XU0VSEAESHAoYQ0xJQ0tfQUNUX05PUk1BTF9CUk9XU0VSEAI=');\n\n@$core.Deprecated('Use mdlBlockedStyleDescriptor instead')\nconst MdlBlockedStyle$json = {\n  '1': 'MdlBlockedStyle',\n  '2': [\n    {'1': 'BLOCKED_STYLE_DEFAULT', '2': 0},\n    {'1': 'BLOCKED_STYLE_IN_AUDIT', '2': 1},\n    {'1': 'BLOCKED_STYLE_ONLY_FANS_LIST', '2': 2},\n    {'1': 'BLOCKED_STYLE_ONLY_FANS_VIDEO', '2': 3},\n    {'1': 'BLOCKED_STYLE_MANGA_PURCHASE', '2': 4},\n  ],\n};\n\n/// Descriptor for `MdlBlockedStyle`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List mdlBlockedStyleDescriptor = $convert.base64Decode(\n    'Cg9NZGxCbG9ja2VkU3R5bGUSGQoVQkxPQ0tFRF9TVFlMRV9ERUZBVUxUEAASGgoWQkxPQ0tFRF'\n    '9TVFlMRV9JTl9BVURJVBABEiAKHEJMT0NLRURfU1RZTEVfT05MWV9GQU5TX0xJU1QQAhIhCh1C'\n    'TE9DS0VEX1NUWUxFX09OTFlfRkFOU19WSURFTxADEiAKHEJMT0NLRURfU1RZTEVfTUFOR0FfUF'\n    'VSQ0hBU0UQBA==');\n\n@$core.Deprecated('Use mdlDynCommonTypeDescriptor instead')\nconst MdlDynCommonType$json = {\n  '1': 'MdlDynCommonType',\n  '2': [\n    {'1': 'mdl_dyn_common_none', '2': 0},\n    {'1': 'mdl_dyn_common_square', '2': 1},\n    {'1': 'mdl_dyn_common_vertica', '2': 2},\n  ],\n};\n\n/// Descriptor for `MdlDynCommonType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List mdlDynCommonTypeDescriptor = $convert.base64Decode(\n    'ChBNZGxEeW5Db21tb25UeXBlEhcKE21kbF9keW5fY29tbW9uX25vbmUQABIZChVtZGxfZHluX2'\n    'NvbW1vbl9zcXVhcmUQARIaChZtZGxfZHluX2NvbW1vbl92ZXJ0aWNhEAI=');\n\n@$core.Deprecated('Use mdlDynDrawTagTypeDescriptor instead')\nconst MdlDynDrawTagType$json = {\n  '1': 'MdlDynDrawTagType',\n  '2': [\n    {'1': 'mdl_draw_tag_none', '2': 0},\n    {'1': 'mdl_draw_tag_common', '2': 1},\n    {'1': 'mdl_draw_tag_goods', '2': 2},\n    {'1': 'mdl_draw_tag_user', '2': 3},\n    {'1': 'mdl_draw_tag_topic', '2': 4},\n    {'1': 'mdl_draw_tag_lbs', '2': 5},\n  ],\n};\n\n/// Descriptor for `MdlDynDrawTagType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List mdlDynDrawTagTypeDescriptor = $convert.base64Decode(\n    'ChFNZGxEeW5EcmF3VGFnVHlwZRIVChFtZGxfZHJhd190YWdfbm9uZRAAEhcKE21kbF9kcmF3X3'\n    'RhZ19jb21tb24QARIWChJtZGxfZHJhd190YWdfZ29vZHMQAhIVChFtZGxfZHJhd190YWdfdXNl'\n    'chADEhYKEm1kbF9kcmF3X3RhZ190b3BpYxAEEhQKEG1kbF9kcmF3X3RhZ19sYnMQBQ==');\n\n@$core.Deprecated('Use mdlDynSubscriptionNewStyleDescriptor instead')\nconst MdlDynSubscriptionNewStyle$json = {\n  '1': 'MdlDynSubscriptionNewStyle',\n  '2': [\n    {'1': 'mdl_dyn_subscription_new_style_nont', '2': 0},\n    {'1': 'mdl_dyn_subscription_new_style_live', '2': 1},\n    {'1': 'mdl_dyn_subscription_new_style_draw', '2': 2},\n  ],\n};\n\n/// Descriptor for `MdlDynSubscriptionNewStyle`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List mdlDynSubscriptionNewStyleDescriptor =\n    $convert.base64Decode(\n        'ChpNZGxEeW5TdWJzY3JpcHRpb25OZXdTdHlsZRInCiNtZGxfZHluX3N1YnNjcmlwdGlvbl9uZX'\n        'dfc3R5bGVfbm9udBAAEicKI21kbF9keW5fc3Vic2NyaXB0aW9uX25ld19zdHlsZV9saXZlEAES'\n        'JwojbWRsX2R5bl9zdWJzY3JpcHRpb25fbmV3X3N0eWxlX2RyYXcQAg==');\n\n@$core.Deprecated('Use mediaTypeDescriptor instead')\nconst MediaType$json = {\n  '1': 'MediaType',\n  '2': [\n    {'1': 'MediaTypeNone', '2': 0},\n    {'1': 'MediaTypeUGC', '2': 1},\n    {'1': 'MediaTypePGC', '2': 2},\n    {'1': 'MediaTypeLive', '2': 3},\n    {'1': 'MediaTypeVCS', '2': 4},\n  ],\n};\n\n/// Descriptor for `MediaType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List mediaTypeDescriptor = $convert.base64Decode(\n    'CglNZWRpYVR5cGUSEQoNTWVkaWFUeXBlTm9uZRAAEhAKDE1lZGlhVHlwZVVHQxABEhAKDE1lZG'\n    'lhVHlwZVBHQxACEhEKDU1lZGlhVHlwZUxpdmUQAxIQCgxNZWRpYVR5cGVWQ1MQBA==');\n\n@$core.Deprecated('Use moduleAuthorBadgeTypeDescriptor instead')\nconst ModuleAuthorBadgeType$json = {\n  '1': 'ModuleAuthorBadgeType',\n  '2': [\n    {'1': 'module_author_badge_type_none', '2': 0},\n    {'1': 'module_author_badge_type_threePoint', '2': 1},\n    {'1': 'module_author_badge_type_button', '2': 2},\n    {'1': 'module_author_badge_type_weight', '2': 3},\n  ],\n};\n\n/// Descriptor for `ModuleAuthorBadgeType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List moduleAuthorBadgeTypeDescriptor = $convert.base64Decode(\n    'ChVNb2R1bGVBdXRob3JCYWRnZVR5cGUSIQodbW9kdWxlX2F1dGhvcl9iYWRnZV90eXBlX25vbm'\n    'UQABInCiNtb2R1bGVfYXV0aG9yX2JhZGdlX3R5cGVfdGhyZWVQb2ludBABEiMKH21vZHVsZV9h'\n    'dXRob3JfYmFkZ2VfdHlwZV9idXR0b24QAhIjCh9tb2R1bGVfYXV0aG9yX2JhZGdlX3R5cGVfd2'\n    'VpZ2h0EAM=');\n\n@$core.Deprecated('Use moduleBannerTypeDescriptor instead')\nconst ModuleBannerType$json = {\n  '1': 'ModuleBannerType',\n  '2': [\n    {'1': 'module_banner_type_none', '2': 0},\n    {'1': 'module_banner_type_user', '2': 1},\n  ],\n};\n\n/// Descriptor for `ModuleBannerType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List moduleBannerTypeDescriptor = $convert.base64Decode(\n    'ChBNb2R1bGVCYW5uZXJUeXBlEhsKF21vZHVsZV9iYW5uZXJfdHlwZV9ub25lEAASGwoXbW9kdW'\n    'xlX2Jhbm5lcl90eXBlX3VzZXIQAQ==');\n\n@$core.Deprecated('Use moduleDynamicTypeDescriptor instead')\nconst ModuleDynamicType$json = {\n  '1': 'ModuleDynamicType',\n  '2': [\n    {'1': 'mdl_dyn_archive', '2': 0},\n    {'1': 'mdl_dyn_pgc', '2': 1},\n    {'1': 'mdl_dyn_cour_season', '2': 2},\n    {'1': 'mdl_dyn_cour_batch', '2': 3},\n    {'1': 'mdl_dyn_forward', '2': 4},\n    {'1': 'mdl_dyn_draw', '2': 5},\n    {'1': 'mdl_dyn_article', '2': 6},\n    {'1': 'mdl_dyn_music', '2': 7},\n    {'1': 'mdl_dyn_common', '2': 8},\n    {'1': 'mdl_dyn_live', '2': 9},\n    {'1': 'mdl_dyn_medialist', '2': 10},\n    {'1': 'mdl_dyn_applet', '2': 11},\n    {'1': 'mdl_dyn_subscription', '2': 12},\n    {'1': 'mdl_dyn_live_rcmd', '2': 13},\n    {'1': 'mdl_dyn_ugc_season', '2': 14},\n    {'1': 'mdl_dyn_subscription_new', '2': 15},\n    {'1': 'mdl_dyn_cour_up', '2': 16},\n    {'1': 'mdl_dyn_topic_set', '2': 17},\n    {'1': 'mdl_dyn_charging_archive', '2': 18},\n    {'1': 'mdl_dyn_share_charging_qa', '2': 19},\n  ],\n};\n\n/// Descriptor for `ModuleDynamicType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List moduleDynamicTypeDescriptor = $convert.base64Decode(\n    'ChFNb2R1bGVEeW5hbWljVHlwZRITCg9tZGxfZHluX2FyY2hpdmUQABIPCgttZGxfZHluX3BnYx'\n    'ABEhcKE21kbF9keW5fY291cl9zZWFzb24QAhIWChJtZGxfZHluX2NvdXJfYmF0Y2gQAxITCg9t'\n    'ZGxfZHluX2ZvcndhcmQQBBIQCgxtZGxfZHluX2RyYXcQBRITCg9tZGxfZHluX2FydGljbGUQBh'\n    'IRCg1tZGxfZHluX211c2ljEAcSEgoObWRsX2R5bl9jb21tb24QCBIQCgxtZGxfZHluX2xpdmUQ'\n    'CRIVChFtZGxfZHluX21lZGlhbGlzdBAKEhIKDm1kbF9keW5fYXBwbGV0EAsSGAoUbWRsX2R5bl'\n    '9zdWJzY3JpcHRpb24QDBIVChFtZGxfZHluX2xpdmVfcmNtZBANEhYKEm1kbF9keW5fdWdjX3Nl'\n    'YXNvbhAOEhwKGG1kbF9keW5fc3Vic2NyaXB0aW9uX25ldxAPEhMKD21kbF9keW5fY291cl91cB'\n    'AQEhUKEW1kbF9keW5fdG9waWNfc2V0EBESHAoYbWRsX2R5bl9jaGFyZ2luZ19hcmNoaXZlEBIS'\n    'HQoZbWRsX2R5bl9zaGFyZV9jaGFyZ2luZ19xYRAT');\n\n@$core.Deprecated('Use nFTRegionTypeDescriptor instead')\nconst NFTRegionType$json = {\n  '1': 'NFTRegionType',\n  '2': [\n    {'1': 'nft_region_default', '2': 0},\n    {'1': 'nft_region_mainlang', '2': 1},\n    {'1': 'nft_region_gat', '2': 2},\n  ],\n};\n\n/// Descriptor for `NFTRegionType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List nFTRegionTypeDescriptor = $convert.base64Decode(\n    'Cg1ORlRSZWdpb25UeXBlEhYKEm5mdF9yZWdpb25fZGVmYXVsdBAAEhcKE25mdF9yZWdpb25fbW'\n    'FpbmxhbmcQARISCg5uZnRfcmVnaW9uX2dhdBAC');\n\n@$core.Deprecated('Use nFTShowStatusDescriptor instead')\nconst NFTShowStatus$json = {\n  '1': 'NFTShowStatus',\n  '2': [\n    {'1': 'nft_show_default', '2': 0},\n    {'1': 'nft_show_zoominmainlang', '2': 1},\n    {'1': 'nft_show_raw', '2': 2},\n  ],\n};\n\n/// Descriptor for `NFTShowStatus`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List nFTShowStatusDescriptor = $convert.base64Decode(\n    'Cg1ORlRTaG93U3RhdHVzEhQKEG5mdF9zaG93X2RlZmF1bHQQABIbChduZnRfc2hvd196b29taW'\n    '5tYWlubGFuZxABEhAKDG5mdF9zaG93X3JhdxAC');\n\n@$core.Deprecated('Use networkTypeDescriptor instead')\nconst NetworkType$json = {\n  '1': 'NetworkType',\n  '2': [\n    {'1': 'NT_UNKNOWN', '2': 0},\n    {'1': 'WIFI', '2': 1},\n    {'1': 'CELLULAR', '2': 2},\n    {'1': 'OFFLINE', '2': 3},\n    {'1': 'OTHERNET', '2': 4},\n    {'1': 'ETHERNET', '2': 5},\n  ],\n};\n\n/// Descriptor for `NetworkType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List networkTypeDescriptor = $convert.base64Decode(\n    'CgtOZXR3b3JrVHlwZRIOCgpOVF9VTktOT1dOEAASCAoEV0lGSRABEgwKCENFTExVTEFSEAISCw'\n    'oHT0ZGTElORRADEgwKCE9USEVSTkVUEAQSDAoIRVRIRVJORVQQBQ==');\n\n@$core.Deprecated('Use opusTypeDescriptor instead')\nconst OpusType$json = {\n  '1': 'OpusType',\n  '2': [\n    {'1': 'OPUS_TYPE_DYN', '2': 0},\n    {'1': 'OPUS_TYPE_ARTICLE', '2': 1},\n    {'1': 'OPUS_TYPE_NOTE', '2': 2},\n    {'1': 'OPUS_TYPE_WORD', '2': 3},\n    {'1': 'OPUS_TYPE_REPOST', '2': 4},\n    {'1': 'OPUS_TYPE_MANGA_EP', '2': 5},\n  ],\n};\n\n/// Descriptor for `OpusType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List opusTypeDescriptor = $convert.base64Decode(\n    'CghPcHVzVHlwZRIRCg1PUFVTX1RZUEVfRFlOEAASFQoRT1BVU19UWVBFX0FSVElDTEUQARISCg'\n    '5PUFVTX1RZUEVfTk9URRACEhIKDk9QVVNfVFlQRV9XT1JEEAMSFAoQT1BVU19UWVBFX1JFUE9T'\n    'VBAEEhYKEk9QVVNfVFlQRV9NQU5HQV9FUBAF');\n\n@$core.Deprecated('Use rcmdReasonStyleDescriptor instead')\nconst RcmdReasonStyle$json = {\n  '1': 'RcmdReasonStyle',\n  '2': [\n    {'1': 'rcmd_reason_style_none', '2': 0},\n    {'1': 'rcmd_reason_style_campus_nearby', '2': 1},\n    {'1': 'rcmd_reason_style_campus_up', '2': 2},\n    {'1': 'rcmd_reason_style_campus_near_up_mix', '2': 3},\n  ],\n};\n\n/// Descriptor for `RcmdReasonStyle`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List rcmdReasonStyleDescriptor = $convert.base64Decode(\n    'Cg9SY21kUmVhc29uU3R5bGUSGgoWcmNtZF9yZWFzb25fc3R5bGVfbm9uZRAAEiMKH3JjbWRfcm'\n    'Vhc29uX3N0eWxlX2NhbXB1c19uZWFyYnkQARIfChtyY21kX3JlYXNvbl9zdHlsZV9jYW1wdXNf'\n    'dXAQAhIoCiRyY21kX3JlYXNvbl9zdHlsZV9jYW1wdXNfbmVhcl91cF9taXgQAw==');\n\n@$core.Deprecated('Use rcmdTypeDescriptor instead')\nconst RcmdType$json = {\n  '1': 'RcmdType',\n  '2': [\n    {'1': 'rcmd_archive', '2': 0},\n    {'1': 'rcmd_dynamic', '2': 1},\n  ],\n};\n\n/// Descriptor for `RcmdType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List rcmdTypeDescriptor = $convert.base64Decode(\n    'CghSY21kVHlwZRIQCgxyY21kX2FyY2hpdmUQABIQCgxyY21kX2R5bmFtaWMQAQ==');\n\n@$core.Deprecated('Use refreshDescriptor instead')\nconst Refresh$json = {\n  '1': 'Refresh',\n  '2': [\n    {'1': 'refresh_new', '2': 0},\n    {'1': 'refresh_history', '2': 1},\n  ],\n};\n\n/// Descriptor for `Refresh`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List refreshDescriptor = $convert.base64Decode(\n    'CgdSZWZyZXNoEg8KC3JlZnJlc2hfbmV3EAASEwoPcmVmcmVzaF9oaXN0b3J5EAE=');\n\n@$core.Deprecated('Use relationStatusDescriptor instead')\nconst RelationStatus$json = {\n  '1': 'RelationStatus',\n  '2': [\n    {'1': 'relation_status_none', '2': 0},\n    {'1': 'relation_status_nofollow', '2': 1},\n    {'1': 'relation_status_follow', '2': 2},\n    {'1': 'relation_status_followed', '2': 3},\n    {'1': 'relation_status_mutual_concern', '2': 4},\n    {'1': 'relation_status_special', '2': 5},\n  ],\n};\n\n/// Descriptor for `RelationStatus`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List relationStatusDescriptor = $convert.base64Decode(\n    'Cg5SZWxhdGlvblN0YXR1cxIYChRyZWxhdGlvbl9zdGF0dXNfbm9uZRAAEhwKGHJlbGF0aW9uX3'\n    'N0YXR1c19ub2ZvbGxvdxABEhoKFnJlbGF0aW9uX3N0YXR1c19mb2xsb3cQAhIcChhyZWxhdGlv'\n    'bl9zdGF0dXNfZm9sbG93ZWQQAxIiCh5yZWxhdGlvbl9zdGF0dXNfbXV0dWFsX2NvbmNlcm4QBB'\n    'IbChdyZWxhdGlvbl9zdGF0dXNfc3BlY2lhbBAF');\n\n@$core.Deprecated('Use repostTypeDescriptor instead')\nconst RepostType$json = {\n  '1': 'RepostType',\n  '2': [\n    {'1': 'repost_hot', '2': 0},\n    {'1': 'repost_general', '2': 1},\n  ],\n};\n\n/// Descriptor for `RepostType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List repostTypeDescriptor = $convert.base64Decode(\n    'CgpSZXBvc3RUeXBlEg4KCnJlcG9zdF9ob3QQABISCg5yZXBvc3RfZ2VuZXJhbBAB');\n\n@$core.Deprecated('Use reserveRelationLotteryTypeDescriptor instead')\nconst ReserveRelationLotteryType$json = {\n  '1': 'ReserveRelationLotteryType',\n  '2': [\n    {'1': 'reserve_relation_lottery_type_default', '2': 0},\n    {'1': 'reserve_relation_lottery_type_cron', '2': 1},\n  ],\n};\n\n/// Descriptor for `ReserveRelationLotteryType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List reserveRelationLotteryTypeDescriptor =\n    $convert.base64Decode(\n        'ChpSZXNlcnZlUmVsYXRpb25Mb3R0ZXJ5VHlwZRIpCiVyZXNlcnZlX3JlbGF0aW9uX2xvdHRlcn'\n        'lfdHlwZV9kZWZhdWx0EAASJgoicmVzZXJ2ZV9yZWxhdGlvbl9sb3R0ZXJ5X3R5cGVfY3JvbhAB');\n\n@$core.Deprecated('Use reserveTypeDescriptor instead')\nconst ReserveType$json = {\n  '1': 'ReserveType',\n  '2': [\n    {'1': 'reserve_none', '2': 0},\n    {'1': 'reserve_recall', '2': 1},\n  ],\n};\n\n/// Descriptor for `ReserveType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List reserveTypeDescriptor = $convert.base64Decode(\n    'CgtSZXNlcnZlVHlwZRIQCgxyZXNlcnZlX25vbmUQABISCg5yZXNlcnZlX3JlY2FsbBAB');\n\n@$core.Deprecated('Use routerActionDescriptor instead')\nconst RouterAction$json = {\n  '1': 'RouterAction',\n  '2': [\n    {'1': 'OPEN', '2': 0},\n    {'1': 'EMBED', '2': 1},\n  ],\n};\n\n/// Descriptor for `RouterAction`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List routerActionDescriptor =\n    $convert.base64Decode('CgxSb3V0ZXJBY3Rpb24SCAoET1BFThAAEgkKBUVNQkVEEAE=');\n\n@$core.Deprecated('Use showTypeDescriptor instead')\nconst ShowType$json = {\n  '1': 'ShowType',\n  '2': [\n    {'1': 'show_type_none', '2': 0},\n    {'1': 'show_type_backup', '2': 1},\n  ],\n};\n\n/// Descriptor for `ShowType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List showTypeDescriptor = $convert.base64Decode(\n    'CghTaG93VHlwZRISCg5zaG93X3R5cGVfbm9uZRAAEhQKEHNob3dfdHlwZV9iYWNrdXAQAQ==');\n\n@$core.Deprecated('Use styleTypeDescriptor instead')\nconst StyleType$json = {\n  '1': 'StyleType',\n  '2': [\n    {'1': 'STYLE_TYPE_NONE', '2': 0},\n    {'1': 'STYLE_TYPE_LIVE', '2': 1},\n    {'1': 'STYLE_TYPE_DYN_UP', '2': 2},\n  ],\n};\n\n/// Descriptor for `StyleType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List styleTypeDescriptor = $convert.base64Decode(\n    'CglTdHlsZVR5cGUSEwoPU1RZTEVfVFlQRV9OT05FEAASEwoPU1RZTEVfVFlQRV9MSVZFEAESFQ'\n    'oRU1RZTEVfVFlQRV9EWU5fVVAQAg==');\n\n@$core.Deprecated('Use tFTypeDescriptor instead')\nconst TFType$json = {\n  '1': 'TFType',\n  '2': [\n    {'1': 'TF_UNKNOWN', '2': 0},\n    {'1': 'U_CARD', '2': 1},\n    {'1': 'U_PKG', '2': 2},\n    {'1': 'C_CARD', '2': 3},\n    {'1': 'C_PKG', '2': 4},\n    {'1': 'T_CARD', '2': 5},\n    {'1': 'T_PKG', '2': 6},\n  ],\n};\n\n/// Descriptor for `TFType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List tFTypeDescriptor = $convert.base64Decode(\n    'CgZURlR5cGUSDgoKVEZfVU5LTk9XThAAEgoKBlVfQ0FSRBABEgkKBVVfUEtHEAISCgoGQ19DQV'\n    'JEEAMSCQoFQ19QS0cQBBIKCgZUX0NBUkQQBRIJCgVUX1BLRxAG');\n\n@$core.Deprecated('Use threePointAttentionStatusDescriptor instead')\nconst ThreePointAttentionStatus$json = {\n  '1': 'ThreePointAttentionStatus',\n  '2': [\n    {'1': 'tp_not_attention', '2': 0},\n    {'1': 'tp_attention', '2': 1},\n  ],\n};\n\n/// Descriptor for `ThreePointAttentionStatus`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List threePointAttentionStatusDescriptor =\n    $convert.base64Decode(\n        'ChlUaHJlZVBvaW50QXR0ZW50aW9uU3RhdHVzEhQKEHRwX25vdF9hdHRlbnRpb24QABIQCgx0cF'\n        '9hdHRlbnRpb24QAQ==');\n\n@$core.Deprecated('Use threePointTypeDescriptor instead')\nconst ThreePointType$json = {\n  '1': 'ThreePointType',\n  '2': [\n    {'1': 'tp_none', '2': 0},\n    {'1': 'background', '2': 1},\n    {'1': 'auto_play', '2': 2},\n    {'1': 'share', '2': 3},\n    {'1': 'wait', '2': 4},\n    {'1': 'attention', '2': 5},\n    {'1': 'report', '2': 6},\n    {'1': 'delete', '2': 7},\n    {'1': 'dislike', '2': 8},\n    {'1': 'favorite', '2': 9},\n    {'1': 'top', '2': 10},\n    {'1': 'comment', '2': 11},\n    {'1': 'hide', '2': 12},\n    {'1': 'campus_delete', '2': 13},\n    {'1': 'topic_irrelevant', '2': 14},\n    {'1': 'batch_cancel', '2': 15},\n    {'1': 'topic_set_cancel', '2': 16},\n    {'1': 'dynamic_edit', '2': 17},\n    {'1': 'create_video', '2': 18},\n    {'1': 'coin', '2': 19},\n    {'1': 'ogv_subscribe', '2': 20},\n    {'1': 'visibility_change', '2': 21},\n    {'1': 'topic_top', '2': 22},\n  ],\n};\n\n/// Descriptor for `ThreePointType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List threePointTypeDescriptor = $convert.base64Decode(\n    'Cg5UaHJlZVBvaW50VHlwZRILCgd0cF9ub25lEAASDgoKYmFja2dyb3VuZBABEg0KCWF1dG9fcG'\n    'xheRACEgkKBXNoYXJlEAMSCAoEd2FpdBAEEg0KCWF0dGVudGlvbhAFEgoKBnJlcG9ydBAGEgoK'\n    'BmRlbGV0ZRAHEgsKB2Rpc2xpa2UQCBIMCghmYXZvcml0ZRAJEgcKA3RvcBAKEgsKB2NvbW1lbn'\n    'QQCxIICgRoaWRlEAwSEQoNY2FtcHVzX2RlbGV0ZRANEhQKEHRvcGljX2lycmVsZXZhbnQQDhIQ'\n    'CgxiYXRjaF9jYW5jZWwQDxIUChB0b3BpY19zZXRfY2FuY2VsEBASEAoMZHluYW1pY19lZGl0EB'\n    'ESEAoMY3JlYXRlX3ZpZGVvEBISCAoEY29pbhATEhEKDW9ndl9zdWJzY3JpYmUQFBIVChF2aXNp'\n    'YmlsaXR5X2NoYW5nZRAVEg0KCXRvcGljX3RvcBAW');\n\n@$core.Deprecated('Use thumbTypeDescriptor instead')\nconst ThumbType$json = {\n  '1': 'ThumbType',\n  '2': [\n    {'1': 'cancel', '2': 0},\n    {'1': 'thumb', '2': 1},\n  ],\n};\n\n/// Descriptor for `ThumbType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List thumbTypeDescriptor =\n    $convert.base64Decode('CglUaHVtYlR5cGUSCgoGY2FuY2VsEAASCQoFdGh1bWIQAQ==');\n\n@$core.Deprecated('Use topTypeDescriptor instead')\nconst TopType$json = {\n  '1': 'TopType',\n  '2': [\n    {'1': 'top_none', '2': 0},\n    {'1': 'top_cancel', '2': 1},\n  ],\n};\n\n/// Descriptor for `TopType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List topTypeDescriptor = $convert\n    .base64Decode('CgdUb3BUeXBlEgwKCHRvcF9ub25lEAASDgoKdG9wX2NhbmNlbBAB');\n\n@$core.Deprecated('Use userItemTypeDescriptor instead')\nconst UserItemType$json = {\n  '1': 'UserItemType',\n  '2': [\n    {'1': 'user_item_type_none', '2': 0},\n    {'1': 'user_item_type_live', '2': 1},\n    {'1': 'user_item_type_live_custom', '2': 2},\n    {'1': 'user_item_type_normal', '2': 3},\n    {'1': 'user_item_type_extend', '2': 4},\n    {'1': 'user_item_type_premiere_reserve', '2': 5},\n    {'1': 'user_item_type_premiere', '2': 6},\n    {'1': 'user_item_type_live_card', '2': 7},\n    {'1': 'user_item_type_ogv_season', '2': 8},\n    {'1': 'user_item_type_ugc_season', '2': 9},\n  ],\n};\n\n/// Descriptor for `UserItemType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List userItemTypeDescriptor = $convert.base64Decode(\n    'CgxVc2VySXRlbVR5cGUSFwoTdXNlcl9pdGVtX3R5cGVfbm9uZRAAEhcKE3VzZXJfaXRlbV90eX'\n    'BlX2xpdmUQARIeChp1c2VyX2l0ZW1fdHlwZV9saXZlX2N1c3RvbRACEhkKFXVzZXJfaXRlbV90'\n    'eXBlX25vcm1hbBADEhkKFXVzZXJfaXRlbV90eXBlX2V4dGVuZBAEEiMKH3VzZXJfaXRlbV90eX'\n    'BlX3ByZW1pZXJlX3Jlc2VydmUQBRIbChd1c2VyX2l0ZW1fdHlwZV9wcmVtaWVyZRAGEhwKGHVz'\n    'ZXJfaXRlbV90eXBlX2xpdmVfY2FyZBAHEh0KGXVzZXJfaXRlbV90eXBlX29ndl9zZWFzb24QCB'\n    'IdChl1c2VyX2l0ZW1fdHlwZV91Z2Nfc2Vhc29uEAk=');\n\n@$core.Deprecated('Use videoSubTypeDescriptor instead')\nconst VideoSubType$json = {\n  '1': 'VideoSubType',\n  '2': [\n    {'1': 'VideoSubTypeNone', '2': 0},\n    {'1': 'VideoSubTypeBangumi', '2': 1},\n    {'1': 'VideoSubTypeMovie', '2': 2},\n    {'1': 'VideoSubTypeDocumentary', '2': 3},\n    {'1': 'VideoSubTypeDomestic', '2': 4},\n    {'1': 'VideoSubTypeTeleplay', '2': 5},\n  ],\n};\n\n/// Descriptor for `VideoSubType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List videoSubTypeDescriptor = $convert.base64Decode(\n    'CgxWaWRlb1N1YlR5cGUSFAoQVmlkZW9TdWJUeXBlTm9uZRAAEhcKE1ZpZGVvU3ViVHlwZUJhbm'\n    'd1bWkQARIVChFWaWRlb1N1YlR5cGVNb3ZpZRACEhsKF1ZpZGVvU3ViVHlwZURvY3VtZW50YXJ5'\n    'EAMSGAoUVmlkZW9TdWJUeXBlRG9tZXN0aWMQBBIYChRWaWRlb1N1YlR5cGVUZWxlcGxheRAF');\n\n@$core.Deprecated('Use videoTypeDescriptor instead')\nconst VideoType$json = {\n  '1': 'VideoType',\n  '2': [\n    {'1': 'video_type_general', '2': 0},\n    {'1': 'video_type_dynamic', '2': 1},\n    {'1': 'video_type_playback', '2': 2},\n    {'1': 'video_type_story', '2': 3},\n  ],\n};\n\n/// Descriptor for `VideoType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List videoTypeDescriptor = $convert.base64Decode(\n    'CglWaWRlb1R5cGUSFgoSdmlkZW9fdHlwZV9nZW5lcmFsEAASFgoSdmlkZW9fdHlwZV9keW5hbW'\n    'ljEAESFwoTdmlkZW9fdHlwZV9wbGF5YmFjaxACEhQKEHZpZGVvX3R5cGVfc3RvcnkQAw==');\n\n@$core.Deprecated('Use voteStatusDescriptor instead')\nconst VoteStatus$json = {\n  '1': 'VoteStatus',\n  '2': [\n    {'1': 'normal', '2': 0},\n    {'1': 'anonymous', '2': 1},\n  ],\n};\n\n/// Descriptor for `VoteStatus`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List voteStatusDescriptor = $convert\n    .base64Decode('CgpWb3RlU3RhdHVzEgoKBm5vcm1hbBAAEg0KCWFub255bW91cxAB');\n\n@$core.Deprecated('Use wFItemTypeDescriptor instead')\nconst WFItemType$json = {\n  '1': 'WFItemType',\n  '2': [\n    {'1': 'WATER_FLOW_TYPE_NONE', '2': 0},\n    {'1': 'WATER_FLOW_TYPE_ARCHIVE', '2': 1},\n    {'1': 'WATER_FLOW_TYPE_DYNAMIC', '2': 2},\n  ],\n};\n\n/// Descriptor for `WFItemType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List wFItemTypeDescriptor = $convert.base64Decode(\n    'CgpXRkl0ZW1UeXBlEhgKFFdBVEVSX0ZMT1dfVFlQRV9OT05FEAASGwoXV0FURVJfRkxPV19UWV'\n    'BFX0FSQ0hJVkUQARIbChdXQVRFUl9GTE9XX1RZUEVfRFlOQU1JQxAC');\n\n@$core.Deprecated('Use weightTypeDescriptor instead')\nconst WeightType$json = {\n  '1': 'WeightType',\n  '2': [\n    {'1': 'weight_none', '2': 0},\n    {'1': 'weight_dislike', '2': 1},\n    {'1': 'weight_jump', '2': 2},\n  ],\n};\n\n/// Descriptor for `WeightType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List weightTypeDescriptor = $convert.base64Decode(\n    'CgpXZWlnaHRUeXBlEg8KC3dlaWdodF9ub25lEAASEgoOd2VpZ2h0X2Rpc2xpa2UQARIPCgt3ZW'\n    'lnaHRfanVtcBAC');\n\n@$core.Deprecated('Use adParamDescriptor instead')\nconst AdParam$json = {\n  '1': 'AdParam',\n  '2': [\n    {'1': 'ad_extra', '3': 1, '4': 1, '5': 9, '10': 'adExtra'},\n    {'1': 'request_id', '3': 2, '4': 1, '5': 9, '10': 'requestId'},\n  ],\n};\n\n/// Descriptor for `AdParam`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List adParamDescriptor = $convert.base64Decode(\n    'CgdBZFBhcmFtEhkKCGFkX2V4dHJhGAEgASgJUgdhZEV4dHJhEh0KCnJlcXVlc3RfaWQYAiABKA'\n    'lSCXJlcXVlc3RJZA==');\n\n@$core.Deprecated('Use additionArticleDescriptor instead')\nconst AdditionArticle$json = {\n  '1': 'AdditionArticle',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'cover',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynDrawItem',\n      '10': 'cover'\n    },\n    {'1': 'desc_text_left', '3': 3, '4': 1, '5': 9, '10': 'descTextLeft'},\n    {'1': 'desc_text_right', '3': 4, '4': 1, '5': 9, '10': 'descTextRight'},\n    {'1': 'uri', '3': 5, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'card_type', '3': 6, '4': 1, '5': 9, '10': 'cardType'},\n  ],\n};\n\n/// Descriptor for `AdditionArticle`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List additionArticleDescriptor = $convert.base64Decode(\n    'Cg9BZGRpdGlvbkFydGljbGUSFAoFdGl0bGUYASABKAlSBXRpdGxlEj0KBWNvdmVyGAIgASgLMi'\n    'cuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuTWRsRHluRHJhd0l0ZW1SBWNvdmVyEiQKDmRlc2Nf'\n    'dGV4dF9sZWZ0GAMgASgJUgxkZXNjVGV4dExlZnQSJgoPZGVzY190ZXh0X3JpZ2h0GAQgASgJUg'\n    '1kZXNjVGV4dFJpZ2h0EhAKA3VyaRgFIAEoCVIDdXJpEhsKCWNhcmRfdHlwZRgGIAEoCVIIY2Fy'\n    'ZFR5cGU=');\n\n@$core.Deprecated('Use additionCommonDescriptor instead')\nconst AdditionCommon$json = {\n  '1': 'AdditionCommon',\n  '2': [\n    {'1': 'head_text', '3': 1, '4': 1, '5': 9, '10': 'headText'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'image_url', '3': 3, '4': 1, '5': 9, '10': 'imageUrl'},\n    {'1': 'desc_text1', '3': 4, '4': 1, '5': 9, '10': 'descText1'},\n    {'1': 'desc_text2', '3': 5, '4': 1, '5': 9, '10': 'descText2'},\n    {'1': 'url', '3': 6, '4': 1, '5': 9, '10': 'url'},\n    {\n      '1': 'button',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionalButton',\n      '10': 'button'\n    },\n    {'1': 'head_icon', '3': 8, '4': 1, '5': 9, '10': 'headIcon'},\n    {\n      '1': 'style',\n      '3': 9,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.ImageStyle',\n      '10': 'style'\n    },\n    {'1': 'type', '3': 10, '4': 1, '5': 9, '10': 'type'},\n    {'1': 'card_type', '3': 11, '4': 1, '5': 9, '10': 'cardType'},\n  ],\n};\n\n/// Descriptor for `AdditionCommon`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List additionCommonDescriptor = $convert.base64Decode(\n    'Cg5BZGRpdGlvbkNvbW1vbhIbCgloZWFkX3RleHQYASABKAlSCGhlYWRUZXh0EhQKBXRpdGxlGA'\n    'IgASgJUgV0aXRsZRIbCglpbWFnZV91cmwYAyABKAlSCGltYWdlVXJsEh0KCmRlc2NfdGV4dDEY'\n    'BCABKAlSCWRlc2NUZXh0MRIdCgpkZXNjX3RleHQyGAUgASgJUglkZXNjVGV4dDISEAoDdXJsGA'\n    'YgASgJUgN1cmwSQQoGYnV0dG9uGAcgASgLMikuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQWRk'\n    'aXRpb25hbEJ1dHRvblIGYnV0dG9uEhsKCWhlYWRfaWNvbhgIIAEoCVIIaGVhZEljb24SOQoFc3'\n    'R5bGUYCSABKA4yIy5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5JbWFnZVN0eWxlUgVzdHlsZRIS'\n    'CgR0eXBlGAogASgJUgR0eXBlEhsKCWNhcmRfdHlwZRgLIAEoCVIIY2FyZFR5cGU=');\n\n@$core.Deprecated('Use additionEsportDescriptor instead')\nconst AdditionEsport$json = {\n  '1': 'AdditionEsport',\n  '2': [\n    {\n      '1': 'addition_esport_moba',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionEsportMoba',\n      '9': 0,\n      '10': 'additionEsportMoba'\n    },\n    {\n      '1': 'style',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.EspaceStyle',\n      '10': 'style'\n    },\n    {'1': 'type', '3': 3, '4': 1, '5': 9, '10': 'type'},\n    {'1': 'card_type', '3': 4, '4': 1, '5': 9, '10': 'cardType'},\n  ],\n  '8': [\n    {'1': 'item'},\n  ],\n};\n\n/// Descriptor for `AdditionEsport`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List additionEsportDescriptor = $convert.base64Decode(\n    'Cg5BZGRpdGlvbkVzcG9ydBJfChRhZGRpdGlvbl9lc3BvcnRfbW9iYRgCIAEoCzIrLmJpbGliaW'\n    'xpLmFwcC5keW5hbWljLnYyLkFkZGl0aW9uRXNwb3J0TW9iYUgAUhJhZGRpdGlvbkVzcG9ydE1v'\n    'YmESOgoFc3R5bGUYASABKA4yJC5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5Fc3BhY2VTdHlsZV'\n    'IFc3R5bGUSEgoEdHlwZRgDIAEoCVIEdHlwZRIbCgljYXJkX3R5cGUYBCABKAlSCGNhcmRUeXBl'\n    'QgYKBGl0ZW0=');\n\n@$core.Deprecated('Use additionEsportMobaDescriptor instead')\nconst AdditionEsportMoba$json = {\n  '1': 'AdditionEsportMoba',\n  '2': [\n    {'1': 'head_text', '3': 1, '4': 1, '5': 9, '10': 'headText'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'match_team',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MatchTeam',\n      '10': 'matchTeam'\n    },\n    {\n      '1': 'addition_esport_moba_status',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionEsportMobaStatus',\n      '10': 'additionEsportMobaStatus'\n    },\n    {'1': 'uri', '3': 5, '4': 1, '5': 9, '10': 'uri'},\n    {\n      '1': 'button',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionalButton',\n      '10': 'button'\n    },\n    {'1': 'sub_title', '3': 7, '4': 1, '5': 9, '10': 'subTitle'},\n    {'1': 'type', '3': 10, '4': 1, '5': 9, '10': 'type'},\n    {'1': 'card_type', '3': 11, '4': 1, '5': 9, '10': 'cardType'},\n    {'1': 'head_icon', '3': 12, '4': 1, '5': 9, '10': 'headIcon'},\n  ],\n};\n\n/// Descriptor for `AdditionEsportMoba`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List additionEsportMobaDescriptor = $convert.base64Decode(\n    'ChJBZGRpdGlvbkVzcG9ydE1vYmESGwoJaGVhZF90ZXh0GAEgASgJUghoZWFkVGV4dBIUCgV0aX'\n    'RsZRgCIAEoCVIFdGl0bGUSQQoKbWF0Y2hfdGVhbRgDIAMoCzIiLmJpbGliaWxpLmFwcC5keW5h'\n    'bWljLnYyLk1hdGNoVGVhbVIJbWF0Y2hUZWFtEnAKG2FkZGl0aW9uX2VzcG9ydF9tb2JhX3N0YX'\n    'R1cxgEIAEoCzIxLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkFkZGl0aW9uRXNwb3J0TW9iYVN0'\n    'YXR1c1IYYWRkaXRpb25Fc3BvcnRNb2JhU3RhdHVzEhAKA3VyaRgFIAEoCVIDdXJpEkEKBmJ1dH'\n    'RvbhgGIAEoCzIpLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkFkZGl0aW9uYWxCdXR0b25SBmJ1'\n    'dHRvbhIbCglzdWJfdGl0bGUYByABKAlSCHN1YlRpdGxlEhIKBHR5cGUYCiABKAlSBHR5cGUSGw'\n    'oJY2FyZF90eXBlGAsgASgJUghjYXJkVHlwZRIbCgloZWFkX2ljb24YDCABKAlSCGhlYWRJY29u');\n\n@$core.Deprecated('Use additionEsportMobaStatusDescriptor instead')\nconst AdditionEsportMobaStatus$json = {\n  '1': 'AdditionEsportMobaStatus',\n  '2': [\n    {\n      '1': 'addition_esport_moba_status_desc',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionEsportMobaStatusDesc',\n      '10': 'additionEsportMobaStatusDesc'\n    },\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'status', '3': 3, '4': 1, '5': 5, '10': 'status'},\n    {'1': 'color', '3': 4, '4': 1, '5': 9, '10': 'color'},\n    {'1': 'night_color', '3': 5, '4': 1, '5': 9, '10': 'nightColor'},\n  ],\n};\n\n/// Descriptor for `AdditionEsportMobaStatus`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List additionEsportMobaStatusDescriptor = $convert.base64Decode(\n    'ChhBZGRpdGlvbkVzcG9ydE1vYmFTdGF0dXMSfQogYWRkaXRpb25fZXNwb3J0X21vYmFfc3RhdH'\n    'VzX2Rlc2MYASADKAsyNS5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5BZGRpdGlvbkVzcG9ydE1v'\n    'YmFTdGF0dXNEZXNjUhxhZGRpdGlvbkVzcG9ydE1vYmFTdGF0dXNEZXNjEhQKBXRpdGxlGAIgAS'\n    'gJUgV0aXRsZRIWCgZzdGF0dXMYAyABKAVSBnN0YXR1cxIUCgVjb2xvchgEIAEoCVIFY29sb3IS'\n    'HwoLbmlnaHRfY29sb3IYBSABKAlSCm5pZ2h0Q29sb3I=');\n\n@$core.Deprecated('Use additionEsportMobaStatusDescDescriptor instead')\nconst AdditionEsportMobaStatusDesc$json = {\n  '1': 'AdditionEsportMobaStatusDesc',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'color', '3': 2, '4': 1, '5': 9, '10': 'color'},\n    {'1': 'night_color', '3': 3, '4': 1, '5': 9, '10': 'nightColor'},\n  ],\n};\n\n/// Descriptor for `AdditionEsportMobaStatusDesc`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List additionEsportMobaStatusDescDescriptor =\n    $convert.base64Decode(\n        'ChxBZGRpdGlvbkVzcG9ydE1vYmFTdGF0dXNEZXNjEhQKBXRpdGxlGAEgASgJUgV0aXRsZRIUCg'\n        'Vjb2xvchgCIAEoCVIFY29sb3ISHwoLbmlnaHRfY29sb3IYAyABKAlSCm5pZ2h0Q29sb3I=');\n\n@$core.Deprecated('Use additionGoodsDescriptor instead')\nconst AdditionGoods$json = {\n  '1': 'AdditionGoods',\n  '2': [\n    {'1': 'rcmd_desc', '3': 1, '4': 1, '5': 9, '10': 'rcmdDesc'},\n    {\n      '1': 'goods_items',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.GoodsItem',\n      '10': 'goodsItems'\n    },\n    {'1': 'card_type', '3': 3, '4': 1, '5': 9, '10': 'cardType'},\n    {'1': 'icon', '3': 4, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'uri', '3': 5, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'source_type', '3': 6, '4': 1, '5': 5, '10': 'sourceType'},\n    {\n      '1': 'jump_type',\n      '3': 7,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.GoodsJumpType',\n      '10': 'jumpType'\n    },\n    {'1': 'app_name', '3': 8, '4': 1, '5': 9, '10': 'appName'},\n    {'1': 'ad_mark_icon', '3': 9, '4': 1, '5': 9, '10': 'adMarkIcon'},\n  ],\n};\n\n/// Descriptor for `AdditionGoods`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List additionGoodsDescriptor = $convert.base64Decode(\n    'Cg1BZGRpdGlvbkdvb2RzEhsKCXJjbWRfZGVzYxgBIAEoCVIIcmNtZERlc2MSQwoLZ29vZHNfaX'\n    'RlbXMYAiADKAsyIi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5Hb29kc0l0ZW1SCmdvb2RzSXRl'\n    'bXMSGwoJY2FyZF90eXBlGAMgASgJUghjYXJkVHlwZRISCgRpY29uGAQgASgJUgRpY29uEhAKA3'\n    'VyaRgFIAEoCVIDdXJpEh8KC3NvdXJjZV90eXBlGAYgASgFUgpzb3VyY2VUeXBlEkMKCWp1bXBf'\n    'dHlwZRgHIAEoDjImLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkdvb2RzSnVtcFR5cGVSCGp1bX'\n    'BUeXBlEhkKCGFwcF9uYW1lGAggASgJUgdhcHBOYW1lEiAKDGFkX21hcmtfaWNvbhgJIAEoCVIK'\n    'YWRNYXJrSWNvbg==');\n\n@$core.Deprecated('Use additionLiveRoomDescriptor instead')\nconst AdditionLiveRoom$json = {\n  '1': 'AdditionLiveRoom',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 2, '4': 1, '5': 9, '10': 'cover'},\n    {\n      '1': 'badge',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.VideoBadge',\n      '10': 'badge'\n    },\n    {\n      '1': 'desc_text_upper',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CoverIconWithText',\n      '10': 'descTextUpper'\n    },\n    {'1': 'desc_text_lower', '3': 5, '4': 1, '5': 9, '10': 'descTextLower'},\n    {'1': 'uri', '3': 6, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'card_type', '3': 7, '4': 1, '5': 9, '10': 'cardType'},\n  ],\n};\n\n/// Descriptor for `AdditionLiveRoom`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List additionLiveRoomDescriptor = $convert.base64Decode(\n    'ChBBZGRpdGlvbkxpdmVSb29tEhQKBXRpdGxlGAEgASgJUgV0aXRsZRIUCgVjb3ZlchgCIAEoCV'\n    'IFY292ZXISOQoFYmFkZ2UYAyABKAsyIy5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5WaWRlb0Jh'\n    'ZGdlUgViYWRnZRJSCg9kZXNjX3RleHRfdXBwZXIYBCABKAsyKi5iaWxpYmlsaS5hcHAuZHluYW'\n    '1pYy52Mi5Db3Zlckljb25XaXRoVGV4dFINZGVzY1RleHRVcHBlchImCg9kZXNjX3RleHRfbG93'\n    'ZXIYBSABKAlSDWRlc2NUZXh0TG93ZXISEAoDdXJpGAYgASgJUgN1cmkSGwoJY2FyZF90eXBlGA'\n    'cgASgJUghjYXJkVHlwZQ==');\n\n@$core.Deprecated('Use additionMusicDescriptor instead')\nconst AdditionMusic$json = {\n  '1': 'AdditionMusic',\n  '2': [\n    {\n      '1': 'music_card',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynMusic',\n      '10': 'musicCard'\n    },\n    {'1': 'card_type', '3': 2, '4': 1, '5': 9, '10': 'cardType'},\n  ],\n};\n\n/// Descriptor for `AdditionMusic`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List additionMusicDescriptor = $convert.base64Decode(\n    'Cg1BZGRpdGlvbk11c2ljEkMKCm11c2ljX2NhcmQYASABKAsyJC5iaWxpYmlsaS5hcHAuZHluYW'\n    '1pYy52Mi5NZGxEeW5NdXNpY1IJbXVzaWNDYXJkEhsKCWNhcmRfdHlwZRgCIAEoCVIIY2FyZFR5'\n    'cGU=');\n\n@$core.Deprecated('Use additionUPDescriptor instead')\nconst AdditionUP$json = {\n  '1': 'AdditionUP',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'desc_text1',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.HighlightText',\n      '10': 'descText1'\n    },\n    {'1': 'desc_text2', '3': 3, '4': 1, '5': 9, '10': 'descText2'},\n    {'1': 'url', '3': 4, '4': 1, '5': 9, '10': 'url'},\n    {\n      '1': 'button',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionalButton',\n      '10': 'button'\n    },\n    {'1': 'card_type', '3': 6, '4': 1, '5': 9, '10': 'cardType'},\n    {'1': 'reserve_total', '3': 7, '4': 1, '5': 3, '10': 'reserveTotal'},\n    {\n      '1': 'act_skin',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionalActSkin',\n      '10': 'actSkin'\n    },\n    {'1': 'rid', '3': 9, '4': 1, '5': 3, '10': 'rid'},\n    {\n      '1': 'lottery_type',\n      '3': 10,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.ReserveRelationLotteryType',\n      '10': 'lotteryType'\n    },\n    {\n      '1': 'desc_text3',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.HighlightText',\n      '10': 'descText3'\n    },\n    {'1': 'up_mid', '3': 12, '4': 1, '5': 3, '10': 'upMid'},\n    {\n      '1': 'user_info',\n      '3': 13,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionUserInfo',\n      '10': 'userInfo'\n    },\n    {'1': 'dynamic_id', '3': 14, '4': 1, '5': 9, '10': 'dynamicId'},\n    {'1': 'show_text2', '3': 15, '4': 1, '5': 8, '10': 'showText2'},\n    {'1': 'dyn_type', '3': 16, '4': 1, '5': 3, '10': 'dynType'},\n    {'1': 'business_id', '3': 17, '4': 1, '5': 9, '10': 'businessId'},\n    {'1': 'badge_text', '3': 18, '4': 1, '5': 9, '10': 'badgeText'},\n    {'1': 'is_premiere', '3': 19, '4': 1, '5': 8, '10': 'isPremiere'},\n  ],\n};\n\n/// Descriptor for `AdditionUP`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List additionUPDescriptor = $convert.base64Decode(\n    'CgpBZGRpdGlvblVQEhQKBXRpdGxlGAEgASgJUgV0aXRsZRJFCgpkZXNjX3RleHQxGAIgASgLMi'\n    'YuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuSGlnaGxpZ2h0VGV4dFIJZGVzY1RleHQxEh0KCmRl'\n    'c2NfdGV4dDIYAyABKAlSCWRlc2NUZXh0MhIQCgN1cmwYBCABKAlSA3VybBJBCgZidXR0b24YBS'\n    'ABKAsyKS5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5BZGRpdGlvbmFsQnV0dG9uUgZidXR0b24S'\n    'GwoJY2FyZF90eXBlGAYgASgJUghjYXJkVHlwZRIjCg1yZXNlcnZlX3RvdGFsGAcgASgDUgxyZX'\n    'NlcnZlVG90YWwSRQoIYWN0X3NraW4YCCABKAsyKi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5B'\n    'ZGRpdGlvbmFsQWN0U2tpblIHYWN0U2tpbhIQCgNyaWQYCSABKANSA3JpZBJWCgxsb3R0ZXJ5X3'\n    'R5cGUYCiABKA4yMy5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5SZXNlcnZlUmVsYXRpb25Mb3R0'\n    'ZXJ5VHlwZVILbG90dGVyeVR5cGUSRQoKZGVzY190ZXh0MxgLIAEoCzImLmJpbGliaWxpLmFwcC'\n    '5keW5hbWljLnYyLkhpZ2hsaWdodFRleHRSCWRlc2NUZXh0MxIVCgZ1cF9taWQYDCABKANSBXVw'\n    'TWlkEkYKCXVzZXJfaW5mbxgNIAEoCzIpLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkFkZGl0aW'\n    '9uVXNlckluZm9SCHVzZXJJbmZvEh0KCmR5bmFtaWNfaWQYDiABKAlSCWR5bmFtaWNJZBIdCgpz'\n    'aG93X3RleHQyGA8gASgIUglzaG93VGV4dDISGQoIZHluX3R5cGUYECABKANSB2R5blR5cGUSHw'\n    'oLYnVzaW5lc3NfaWQYESABKAlSCmJ1c2luZXNzSWQSHQoKYmFkZ2VfdGV4dBgSIAEoCVIJYmFk'\n    'Z2VUZXh0Eh8KC2lzX3ByZW1pZXJlGBMgASgIUgppc1ByZW1pZXJl');\n\n@$core.Deprecated('Use additionUgcDescriptor instead')\nconst AdditionUgc$json = {\n  '1': 'AdditionUgc',\n  '2': [\n    {'1': 'head_text', '3': 1, '4': 1, '5': 9, '10': 'headText'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 3, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'desc_text1', '3': 4, '4': 1, '5': 9, '10': 'descText1'},\n    {'1': 'desc_text2', '3': 5, '4': 1, '5': 9, '10': 'descText2'},\n    {'1': 'uri', '3': 6, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'duration', '3': 7, '4': 1, '5': 9, '10': 'duration'},\n    {'1': 'line_feed', '3': 8, '4': 1, '5': 8, '10': 'lineFeed'},\n    {'1': 'card_type', '3': 9, '4': 1, '5': 9, '10': 'cardType'},\n  ],\n};\n\n/// Descriptor for `AdditionUgc`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List additionUgcDescriptor = $convert.base64Decode(\n    'CgtBZGRpdGlvblVnYxIbCgloZWFkX3RleHQYASABKAlSCGhlYWRUZXh0EhQKBXRpdGxlGAIgAS'\n    'gJUgV0aXRsZRIUCgVjb3ZlchgDIAEoCVIFY292ZXISHQoKZGVzY190ZXh0MRgEIAEoCVIJZGVz'\n    'Y1RleHQxEh0KCmRlc2NfdGV4dDIYBSABKAlSCWRlc2NUZXh0MhIQCgN1cmkYBiABKAlSA3VyaR'\n    'IaCghkdXJhdGlvbhgHIAEoCVIIZHVyYXRpb24SGwoJbGluZV9mZWVkGAggASgIUghsaW5lRmVl'\n    'ZBIbCgljYXJkX3R5cGUYCSABKAlSCGNhcmRUeXBl');\n\n@$core.Deprecated('Use additionUserInfoDescriptor instead')\nconst AdditionUserInfo$json = {\n  '1': 'AdditionUserInfo',\n  '2': [\n    {'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'face', '3': 2, '4': 1, '5': 9, '10': 'face'},\n  ],\n};\n\n/// Descriptor for `AdditionUserInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List additionUserInfoDescriptor = $convert.base64Decode(\n    'ChBBZGRpdGlvblVzZXJJbmZvEhIKBG5hbWUYASABKAlSBG5hbWUSEgoEZmFjZRgCIAEoCVIEZm'\n    'FjZQ==');\n\n@$core.Deprecated('Use additionVoteDescriptor instead')\nconst AdditionVote$json = {\n  '1': 'AdditionVote',\n  '2': [\n    {'1': 'image_url', '3': 1, '4': 1, '5': 9, '10': 'imageUrl'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'text1', '3': 3, '4': 1, '5': 9, '10': 'text1'},\n    {'1': 'button_text', '3': 4, '4': 1, '5': 9, '10': 'buttonText'},\n    {'1': 'url', '3': 5, '4': 1, '5': 9, '10': 'url'},\n  ],\n};\n\n/// Descriptor for `AdditionVote`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List additionVoteDescriptor = $convert.base64Decode(\n    'CgxBZGRpdGlvblZvdGUSGwoJaW1hZ2VfdXJsGAEgASgJUghpbWFnZVVybBIUCgV0aXRsZRgCIA'\n    'EoCVIFdGl0bGUSFAoFdGV4dDEYAyABKAlSBXRleHQxEh8KC2J1dHRvbl90ZXh0GAQgASgJUgpi'\n    'dXR0b25UZXh0EhAKA3VybBgFIAEoCVIDdXJs');\n\n@$core.Deprecated('Use additionVote2Descriptor instead')\nconst AdditionVote2$json = {\n  '1': 'AdditionVote2',\n  '2': [\n    {\n      '1': 'addition_vote_word',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionVoteWord',\n      '9': 0,\n      '10': 'additionVoteWord'\n    },\n    {\n      '1': 'addition_vote_pic',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionVotePic',\n      '9': 0,\n      '10': 'additionVotePic'\n    },\n    {\n      '1': 'addition_vote_defaule',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionVoteDefaule',\n      '9': 0,\n      '10': 'additionVoteDefaule'\n    },\n    {\n      '1': 'addition_vote_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.AdditionVoteType',\n      '10': 'additionVoteType'\n    },\n    {'1': 'vote_id', '3': 2, '4': 1, '5': 3, '10': 'voteId'},\n    {'1': 'title', '3': 3, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'label', '3': 4, '4': 1, '5': 9, '10': 'label'},\n    {'1': 'deadline', '3': 5, '4': 1, '5': 3, '10': 'deadline'},\n    {'1': 'open_text', '3': 6, '4': 1, '5': 9, '10': 'openText'},\n    {'1': 'close_text', '3': 7, '4': 1, '5': 9, '10': 'closeText'},\n    {'1': 'voted_text', '3': 8, '4': 1, '5': 9, '10': 'votedText'},\n    {\n      '1': 'state',\n      '3': 9,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.AdditionVoteState',\n      '10': 'state'\n    },\n    {'1': 'biz_type', '3': 13, '4': 1, '5': 5, '10': 'bizType'},\n    {'1': 'total', '3': 14, '4': 1, '5': 3, '10': 'total'},\n    {'1': 'card_type', '3': 15, '4': 1, '5': 9, '10': 'cardType'},\n    {'1': 'tips', '3': 16, '4': 1, '5': 9, '10': 'tips'},\n    {'1': 'uri', '3': 17, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'is_voted', '3': 18, '4': 1, '5': 8, '10': 'isVoted'},\n    {'1': 'choice_cnt', '3': 19, '4': 1, '5': 5, '10': 'choiceCnt'},\n    {\n      '1': 'defaule_select_share',\n      '3': 20,\n      '4': 1,\n      '5': 8,\n      '10': 'defauleSelectShare'\n    },\n    {\n      '1': 'only_fans_vote',\n      '3': 21,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OnlyFansVoteProperty',\n      '10': 'onlyFansVote'\n    },\n    {'1': 'vote_owner_mid', '3': 22, '4': 1, '5': 3, '10': 'voteOwnerMid'},\n  ],\n  '8': [\n    {'1': 'item'},\n  ],\n};\n\n/// Descriptor for `AdditionVote2`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List additionVote2Descriptor = $convert.base64Decode(\n    'Cg1BZGRpdGlvblZvdGUyElkKEmFkZGl0aW9uX3ZvdGVfd29yZBgKIAEoCzIpLmJpbGliaWxpLm'\n    'FwcC5keW5hbWljLnYyLkFkZGl0aW9uVm90ZVdvcmRIAFIQYWRkaXRpb25Wb3RlV29yZBJWChFh'\n    'ZGRpdGlvbl92b3RlX3BpYxgLIAEoCzIoLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkFkZGl0aW'\n    '9uVm90ZVBpY0gAUg9hZGRpdGlvblZvdGVQaWMSYgoVYWRkaXRpb25fdm90ZV9kZWZhdWxlGAwg'\n    'ASgLMiwuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQWRkaXRpb25Wb3RlRGVmYXVsZUgAUhNhZG'\n    'RpdGlvblZvdGVEZWZhdWxlElcKEmFkZGl0aW9uX3ZvdGVfdHlwZRgBIAEoDjIpLmJpbGliaWxp'\n    'LmFwcC5keW5hbWljLnYyLkFkZGl0aW9uVm90ZVR5cGVSEGFkZGl0aW9uVm90ZVR5cGUSFwoHdm'\n    '90ZV9pZBgCIAEoA1IGdm90ZUlkEhQKBXRpdGxlGAMgASgJUgV0aXRsZRIUCgVsYWJlbBgEIAEo'\n    'CVIFbGFiZWwSGgoIZGVhZGxpbmUYBSABKANSCGRlYWRsaW5lEhsKCW9wZW5fdGV4dBgGIAEoCV'\n    'IIb3BlblRleHQSHQoKY2xvc2VfdGV4dBgHIAEoCVIJY2xvc2VUZXh0Eh0KCnZvdGVkX3RleHQY'\n    'CCABKAlSCXZvdGVkVGV4dBJACgVzdGF0ZRgJIAEoDjIqLmJpbGliaWxpLmFwcC5keW5hbWljLn'\n    'YyLkFkZGl0aW9uVm90ZVN0YXRlUgVzdGF0ZRIZCghiaXpfdHlwZRgNIAEoBVIHYml6VHlwZRIU'\n    'CgV0b3RhbBgOIAEoA1IFdG90YWwSGwoJY2FyZF90eXBlGA8gASgJUghjYXJkVHlwZRISCgR0aX'\n    'BzGBAgASgJUgR0aXBzEhAKA3VyaRgRIAEoCVIDdXJpEhkKCGlzX3ZvdGVkGBIgASgIUgdpc1Zv'\n    'dGVkEh0KCmNob2ljZV9jbnQYEyABKAVSCWNob2ljZUNudBIwChRkZWZhdWxlX3NlbGVjdF9zaG'\n    'FyZRgUIAEoCFISZGVmYXVsZVNlbGVjdFNoYXJlElMKDm9ubHlfZmFuc192b3RlGBUgASgLMi0u'\n    'YmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuT25seUZhbnNWb3RlUHJvcGVydHlSDG9ubHlGYW5zVm'\n    '90ZRIkCg52b3RlX293bmVyX21pZBgWIAEoA1IMdm90ZU93bmVyTWlkQgYKBGl0ZW0=');\n\n@$core.Deprecated('Use additionVoteDefauleDescriptor instead')\nconst AdditionVoteDefaule$json = {\n  '1': 'AdditionVoteDefaule',\n  '2': [\n    {'1': 'cover', '3': 1, '4': 3, '5': 9, '10': 'cover'},\n  ],\n};\n\n/// Descriptor for `AdditionVoteDefaule`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List additionVoteDefauleDescriptor =\n    $convert.base64Decode(\n        'ChNBZGRpdGlvblZvdGVEZWZhdWxlEhQKBWNvdmVyGAEgAygJUgVjb3Zlcg==');\n\n@$core.Deprecated('Use additionVotePicDescriptor instead')\nconst AdditionVotePic$json = {\n  '1': 'AdditionVotePic',\n  '2': [\n    {\n      '1': 'item',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionVotePicItem',\n      '10': 'item'\n    },\n  ],\n};\n\n/// Descriptor for `AdditionVotePic`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List additionVotePicDescriptor = $convert.base64Decode(\n    'Cg9BZGRpdGlvblZvdGVQaWMSQAoEaXRlbRgBIAMoCzIsLmJpbGliaWxpLmFwcC5keW5hbWljLn'\n    'YyLkFkZGl0aW9uVm90ZVBpY0l0ZW1SBGl0ZW0=');\n\n@$core.Deprecated('Use additionVotePicItemDescriptor instead')\nconst AdditionVotePicItem$json = {\n  '1': 'AdditionVotePicItem',\n  '2': [\n    {'1': 'opt_idx', '3': 1, '4': 1, '5': 5, '10': 'optIdx'},\n    {'1': 'cover', '3': 2, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'is_vote', '3': 3, '4': 1, '5': 8, '10': 'isVote'},\n    {'1': 'total', '3': 4, '4': 1, '5': 5, '10': 'total'},\n    {'1': 'persent', '3': 5, '4': 1, '5': 1, '10': 'persent'},\n    {'1': 'title', '3': 6, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'is_max_option', '3': 7, '4': 1, '5': 8, '10': 'isMaxOption'},\n  ],\n};\n\n/// Descriptor for `AdditionVotePicItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List additionVotePicItemDescriptor = $convert.base64Decode(\n    'ChNBZGRpdGlvblZvdGVQaWNJdGVtEhcKB29wdF9pZHgYASABKAVSBm9wdElkeBIUCgVjb3Zlch'\n    'gCIAEoCVIFY292ZXISFwoHaXNfdm90ZRgDIAEoCFIGaXNWb3RlEhQKBXRvdGFsGAQgASgFUgV0'\n    'b3RhbBIYCgdwZXJzZW50GAUgASgBUgdwZXJzZW50EhQKBXRpdGxlGAYgASgJUgV0aXRsZRIiCg'\n    '1pc19tYXhfb3B0aW9uGAcgASgIUgtpc01heE9wdGlvbg==');\n\n@$core.Deprecated('Use additionVoteWordDescriptor instead')\nconst AdditionVoteWord$json = {\n  '1': 'AdditionVoteWord',\n  '2': [\n    {\n      '1': 'item',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionVoteWordItem',\n      '10': 'item'\n    },\n  ],\n};\n\n/// Descriptor for `AdditionVoteWord`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List additionVoteWordDescriptor = $convert.base64Decode(\n    'ChBBZGRpdGlvblZvdGVXb3JkEkEKBGl0ZW0YASADKAsyLS5iaWxpYmlsaS5hcHAuZHluYW1pYy'\n    '52Mi5BZGRpdGlvblZvdGVXb3JkSXRlbVIEaXRlbQ==');\n\n@$core.Deprecated('Use additionVoteWordItemDescriptor instead')\nconst AdditionVoteWordItem$json = {\n  '1': 'AdditionVoteWordItem',\n  '2': [\n    {'1': 'opt_idx', '3': 1, '4': 1, '5': 5, '10': 'optIdx'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'is_vote', '3': 3, '4': 1, '5': 8, '10': 'isVote'},\n    {'1': 'total', '3': 4, '4': 1, '5': 5, '10': 'total'},\n    {'1': 'persent', '3': 5, '4': 1, '5': 1, '10': 'persent'},\n    {'1': 'is_max_option', '3': 6, '4': 1, '5': 8, '10': 'isMaxOption'},\n  ],\n};\n\n/// Descriptor for `AdditionVoteWordItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List additionVoteWordItemDescriptor = $convert.base64Decode(\n    'ChRBZGRpdGlvblZvdGVXb3JkSXRlbRIXCgdvcHRfaWR4GAEgASgFUgZvcHRJZHgSFAoFdGl0bG'\n    'UYAiABKAlSBXRpdGxlEhcKB2lzX3ZvdGUYAyABKAhSBmlzVm90ZRIUCgV0b3RhbBgEIAEoBVIF'\n    'dG90YWwSGAoHcGVyc2VudBgFIAEoAVIHcGVyc2VudBIiCg1pc19tYXhfb3B0aW9uGAYgASgIUg'\n    'tpc01heE9wdGlvbg==');\n\n@$core.Deprecated('Use additionalActSkinDescriptor instead')\nconst AdditionalActSkin$json = {\n  '1': 'AdditionalActSkin',\n  '2': [\n    {'1': 'svga', '3': 1, '4': 1, '5': 9, '10': 'svga'},\n    {'1': 'last_image', '3': 2, '4': 1, '5': 9, '10': 'lastImage'},\n    {'1': 'play_times', '3': 3, '4': 1, '5': 3, '10': 'playTimes'},\n  ],\n};\n\n/// Descriptor for `AdditionalActSkin`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List additionalActSkinDescriptor = $convert.base64Decode(\n    'ChFBZGRpdGlvbmFsQWN0U2tpbhISCgRzdmdhGAEgASgJUgRzdmdhEh0KCmxhc3RfaW1hZ2UYAi'\n    'ABKAlSCWxhc3RJbWFnZRIdCgpwbGF5X3RpbWVzGAMgASgDUglwbGF5VGltZXM=');\n\n@$core.Deprecated('Use additionalButtonDescriptor instead')\nconst AdditionalButton$json = {\n  '1': 'AdditionalButton',\n  '2': [\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.AddButtonType',\n      '10': 'type'\n    },\n    {\n      '1': 'jump_style',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionalButtonStyle',\n      '10': 'jumpStyle'\n    },\n    {'1': 'jump_url', '3': 3, '4': 1, '5': 9, '10': 'jumpUrl'},\n    {\n      '1': 'uncheck',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionalButtonStyle',\n      '10': 'uncheck'\n    },\n    {\n      '1': 'check',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionalButtonStyle',\n      '10': 'check'\n    },\n    {\n      '1': 'status',\n      '3': 6,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.AdditionalButtonStatus',\n      '10': 'status'\n    },\n    {\n      '1': 'click_type',\n      '3': 7,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.AdditionalButtonClickType',\n      '10': 'clickType'\n    },\n  ],\n};\n\n/// Descriptor for `AdditionalButton`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List additionalButtonDescriptor = $convert.base64Decode(\n    'ChBBZGRpdGlvbmFsQnV0dG9uEjoKBHR5cGUYASABKA4yJi5iaWxpYmlsaS5hcHAuZHluYW1pYy'\n    '52Mi5BZGRCdXR0b25UeXBlUgR0eXBlEk0KCmp1bXBfc3R5bGUYAiABKAsyLi5iaWxpYmlsaS5h'\n    'cHAuZHluYW1pYy52Mi5BZGRpdGlvbmFsQnV0dG9uU3R5bGVSCWp1bXBTdHlsZRIZCghqdW1wX3'\n    'VybBgDIAEoCVIHanVtcFVybBJICgd1bmNoZWNrGAQgASgLMi4uYmlsaWJpbGkuYXBwLmR5bmFt'\n    'aWMudjIuQWRkaXRpb25hbEJ1dHRvblN0eWxlUgd1bmNoZWNrEkQKBWNoZWNrGAUgASgLMi4uYm'\n    'lsaWJpbGkuYXBwLmR5bmFtaWMudjIuQWRkaXRpb25hbEJ1dHRvblN0eWxlUgVjaGVjaxJHCgZz'\n    'dGF0dXMYBiABKA4yLy5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5BZGRpdGlvbmFsQnV0dG9uU3'\n    'RhdHVzUgZzdGF0dXMSUQoKY2xpY2tfdHlwZRgHIAEoDjIyLmJpbGliaWxpLmFwcC5keW5hbWlj'\n    'LnYyLkFkZGl0aW9uYWxCdXR0b25DbGlja1R5cGVSCWNsaWNrVHlwZQ==');\n\n@$core.Deprecated('Use additionalButtonInteractiveDescriptor instead')\nconst AdditionalButtonInteractive$json = {\n  '1': 'AdditionalButtonInteractive',\n  '2': [\n    {'1': 'popups', '3': 1, '4': 1, '5': 9, '10': 'popups'},\n    {'1': 'confirm', '3': 2, '4': 1, '5': 9, '10': 'confirm'},\n    {'1': 'cancel', '3': 3, '4': 1, '5': 9, '10': 'cancel'},\n    {'1': 'desc', '3': 4, '4': 1, '5': 9, '10': 'desc'},\n  ],\n};\n\n/// Descriptor for `AdditionalButtonInteractive`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List additionalButtonInteractiveDescriptor =\n    $convert.base64Decode(\n        'ChtBZGRpdGlvbmFsQnV0dG9uSW50ZXJhY3RpdmUSFgoGcG9wdXBzGAEgASgJUgZwb3B1cHMSGA'\n        'oHY29uZmlybRgCIAEoCVIHY29uZmlybRIWCgZjYW5jZWwYAyABKAlSBmNhbmNlbBISCgRkZXNj'\n        'GAQgASgJUgRkZXNj');\n\n@$core.Deprecated('Use additionalButtonShareDescriptor instead')\nconst AdditionalButtonShare$json = {\n  '1': 'AdditionalButtonShare',\n  '2': [\n    {\n      '1': 'show',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.AdditionalShareShowType',\n      '10': 'show'\n    },\n    {'1': 'icon', '3': 2, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'text', '3': 3, '4': 1, '5': 9, '10': 'text'},\n  ],\n};\n\n/// Descriptor for `AdditionalButtonShare`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List additionalButtonShareDescriptor = $convert.base64Decode(\n    'ChVBZGRpdGlvbmFsQnV0dG9uU2hhcmUSRAoEc2hvdxgBIAEoDjIwLmJpbGliaWxpLmFwcC5keW'\n    '5hbWljLnYyLkFkZGl0aW9uYWxTaGFyZVNob3dUeXBlUgRzaG93EhIKBGljb24YAiABKAlSBGlj'\n    'b24SEgoEdGV4dBgDIAEoCVIEdGV4dA==');\n\n@$core.Deprecated('Use additionalButtonStyleDescriptor instead')\nconst AdditionalButtonStyle$json = {\n  '1': 'AdditionalButtonStyle',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},\n    {\n      '1': 'interactive',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionalButtonInteractive',\n      '10': 'interactive'\n    },\n    {\n      '1': 'bg_style',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.AddButtonBgStyle',\n      '10': 'bgStyle'\n    },\n    {'1': 'toast', '3': 5, '4': 1, '5': 9, '10': 'toast'},\n    {\n      '1': 'disable',\n      '3': 6,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.DisableState',\n      '10': 'disable'\n    },\n    {\n      '1': 'share',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionalButtonShare',\n      '10': 'share'\n    },\n  ],\n};\n\n/// Descriptor for `AdditionalButtonStyle`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List additionalButtonStyleDescriptor = $convert.base64Decode(\n    'ChVBZGRpdGlvbmFsQnV0dG9uU3R5bGUSEgoEaWNvbhgBIAEoCVIEaWNvbhISCgR0ZXh0GAIgAS'\n    'gJUgR0ZXh0ElYKC2ludGVyYWN0aXZlGAMgASgLMjQuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIu'\n    'QWRkaXRpb25hbEJ1dHRvbkludGVyYWN0aXZlUgtpbnRlcmFjdGl2ZRJECghiZ19zdHlsZRgEIA'\n    'EoDjIpLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkFkZEJ1dHRvbkJnU3R5bGVSB2JnU3R5bGUS'\n    'FAoFdG9hc3QYBSABKAlSBXRvYXN0Ej8KB2Rpc2FibGUYBiABKA4yJS5iaWxpYmlsaS5hcHAuZH'\n    'luYW1pYy52Mi5EaXNhYmxlU3RhdGVSB2Rpc2FibGUSRAoFc2hhcmUYByABKAsyLi5iaWxpYmls'\n    'aS5hcHAuZHluYW1pYy52Mi5BZGRpdGlvbmFsQnV0dG9uU2hhcmVSBXNoYXJl');\n\n@$core.Deprecated('Use additionalPGCDescriptor instead')\nconst AdditionalPGC$json = {\n  '1': 'AdditionalPGC',\n  '2': [\n    {'1': 'head_text', '3': 1, '4': 1, '5': 9, '10': 'headText'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'image_url', '3': 3, '4': 1, '5': 9, '10': 'imageUrl'},\n    {'1': 'desc_text1', '3': 4, '4': 1, '5': 9, '10': 'descText1'},\n    {'1': 'desc_text2', '3': 5, '4': 1, '5': 9, '10': 'descText2'},\n    {'1': 'url', '3': 6, '4': 1, '5': 9, '10': 'url'},\n    {\n      '1': 'button',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionalButton',\n      '10': 'button'\n    },\n    {'1': 'head_icon', '3': 8, '4': 1, '5': 9, '10': 'headIcon'},\n    {\n      '1': 'style',\n      '3': 9,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.ImageStyle',\n      '10': 'style'\n    },\n    {'1': 'type', '3': 10, '4': 1, '5': 9, '10': 'type'},\n  ],\n};\n\n/// Descriptor for `AdditionalPGC`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List additionalPGCDescriptor = $convert.base64Decode(\n    'Cg1BZGRpdGlvbmFsUEdDEhsKCWhlYWRfdGV4dBgBIAEoCVIIaGVhZFRleHQSFAoFdGl0bGUYAi'\n    'ABKAlSBXRpdGxlEhsKCWltYWdlX3VybBgDIAEoCVIIaW1hZ2VVcmwSHQoKZGVzY190ZXh0MRgE'\n    'IAEoCVIJZGVzY1RleHQxEh0KCmRlc2NfdGV4dDIYBSABKAlSCWRlc2NUZXh0MhIQCgN1cmwYBi'\n    'ABKAlSA3VybBJBCgZidXR0b24YByABKAsyKS5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5BZGRp'\n    'dGlvbmFsQnV0dG9uUgZidXR0b24SGwoJaGVhZF9pY29uGAggASgJUghoZWFkSWNvbhI5CgVzdH'\n    'lsZRgJIAEoDjIjLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkltYWdlU3R5bGVSBXN0eWxlEhIK'\n    'BHR5cGUYCiABKAlSBHR5cGU=');\n\n@$core.Deprecated('Use alumniDynamicsReplyDescriptor instead')\nconst AlumniDynamicsReply$json = {\n  '1': 'AlumniDynamicsReply',\n  '2': [\n    {\n      '1': 'list',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynamicItem',\n      '10': 'list'\n    },\n    {'1': 'toast', '3': 2, '4': 1, '5': 9, '10': 'toast'},\n  ],\n};\n\n/// Descriptor for `AlumniDynamicsReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List alumniDynamicsReplyDescriptor = $convert.base64Decode(\n    'ChNBbHVtbmlEeW5hbWljc1JlcGx5EjgKBGxpc3QYASADKAsyJC5iaWxpYmlsaS5hcHAuZHluYW'\n    '1pYy52Mi5EeW5hbWljSXRlbVIEbGlzdBIUCgV0b2FzdBgCIAEoCVIFdG9hc3Q=');\n\n@$core.Deprecated('Use alumniDynamicsReqDescriptor instead')\nconst AlumniDynamicsReq$json = {\n  '1': 'AlumniDynamicsReq',\n  '2': [\n    {'1': 'campus_id', '3': 1, '4': 1, '5': 3, '10': 'campusId'},\n    {'1': 'first_time', '3': 2, '4': 1, '5': 5, '10': 'firstTime'},\n    {\n      '1': 'player_args',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n    {'1': 'local_time', '3': 4, '4': 1, '5': 5, '10': 'localTime'},\n    {'1': 'page', '3': 5, '4': 1, '5': 5, '10': 'page'},\n    {\n      '1': 'from_type',\n      '3': 6,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CampusReqFromType',\n      '10': 'fromType'\n    },\n  ],\n};\n\n/// Descriptor for `AlumniDynamicsReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List alumniDynamicsReqDescriptor = $convert.base64Decode(\n    'ChFBbHVtbmlEeW5hbWljc1JlcRIbCgljYW1wdXNfaWQYASABKANSCGNhbXB1c0lkEh0KCmZpcn'\n    'N0X3RpbWUYAiABKAVSCWZpcnN0VGltZRJPCgtwbGF5ZXJfYXJncxgDIAEoCzIuLmJpbGliaWxp'\n    'LmFwcC5hcmNoaXZlLm1pZGRsZXdhcmUudjEuUGxheWVyQXJnc1IKcGxheWVyQXJncxIdCgpsb2'\n    'NhbF90aW1lGAQgASgFUglsb2NhbFRpbWUSEgoEcGFnZRgFIAEoBVIEcGFnZRJHCglmcm9tX3R5'\n    'cGUYBiABKA4yKi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5DYW1wdXNSZXFGcm9tVHlwZVIIZn'\n    'JvbVR5cGU=');\n\n@$core.Deprecated('Use authorBadgeDescriptor instead')\nconst AuthorBadge$json = {\n  '1': 'AuthorBadge',\n  '2': [\n    {\n      '1': 'badge_style',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.AuthorBadgeStyle',\n      '10': 'badgeStyle'\n    },\n    {\n      '1': 'badge',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.IconBadge',\n      '10': 'badge'\n    },\n  ],\n};\n\n/// Descriptor for `AuthorBadge`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List authorBadgeDescriptor = $convert.base64Decode(\n    'CgtBdXRob3JCYWRnZRJKCgtiYWRnZV9zdHlsZRgBIAEoDjIpLmJpbGliaWxpLmFwcC5keW5hbW'\n    'ljLnYyLkF1dGhvckJhZGdlU3R5bGVSCmJhZGdlU3R5bGUSOAoFYmFkZ2UYAiABKAsyIi5iaWxp'\n    'YmlsaS5hcHAuZHluYW1pYy52Mi5JY29uQmFkZ2VSBWJhZGdl');\n\n@$core.Deprecated('Use basicUserInfoV2Descriptor instead')\nconst BasicUserInfoV2$json = {\n  '1': 'BasicUserInfoV2',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'face', '3': 3, '4': 1, '5': 9, '10': 'face'},\n    {\n      '1': 'avatar',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.AvatarItem',\n      '10': 'avatar'\n    },\n    {'1': 'level', '3': 5, '4': 1, '5': 5, '10': 'level'},\n    {'1': 'is_senior_member', '3': 6, '4': 1, '5': 5, '10': 'isSeniorMember'},\n    {\n      '1': 'vip',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.VipInfo',\n      '10': 'vip'\n    },\n    {'1': 'jump_uri', '3': 8, '4': 1, '5': 9, '10': 'jumpUri'},\n    {\n      '1': 'relation',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Relation',\n      '10': 'relation'\n    },\n    {'1': 'name_sub_text', '3': 10, '4': 1, '5': 9, '10': 'nameSubText'},\n    {\n      '1': 'name_render',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.account.service.v1.NameRender',\n      '10': 'nameRender'\n    },\n  ],\n};\n\n/// Descriptor for `BasicUserInfoV2`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List basicUserInfoV2Descriptor = $convert.base64Decode(\n    'Cg9CYXNpY1VzZXJJbmZvVjISEAoDbWlkGAEgASgDUgNtaWQSEgoEbmFtZRgCIAEoCVIEbmFtZR'\n    'ISCgRmYWNlGAMgASgJUgRmYWNlEkUKBmF2YXRhchgEIAEoCzItLmJpbGliaWxpLmRhZ3cuY29t'\n    'cG9uZW50LmF2YXRhci52MS5BdmF0YXJJdGVtUgZhdmF0YXISFAoFbGV2ZWwYBSABKAVSBWxldm'\n    'VsEigKEGlzX3Nlbmlvcl9tZW1iZXIYBiABKAVSDmlzU2VuaW9yTWVtYmVyEjIKA3ZpcBgHIAEo'\n    'CzIgLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlZpcEluZm9SA3ZpcBIZCghqdW1wX3VyaRgIIA'\n    'EoCVIHanVtcFVyaRI9CghyZWxhdGlvbhgJIAEoCzIhLmJpbGliaWxpLmFwcC5keW5hbWljLnYy'\n    'LlJlbGF0aW9uUghyZWxhdGlvbhIiCg1uYW1lX3N1Yl90ZXh0GAogASgJUgtuYW1lU3ViVGV4dB'\n    'JICgtuYW1lX3JlbmRlchgLIAEoCzInLmJpbGliaWxpLmFjY291bnQuc2VydmljZS52MS5OYW1l'\n    'UmVuZGVyUgpuYW1lUmVuZGVy');\n\n@$core.Deprecated('Use buttonWithSubTitleDescriptor instead')\nconst ButtonWithSubTitle$json = {\n  '1': 'ButtonWithSubTitle',\n  '2': [\n    {'1': 'btn_title', '3': 1, '4': 1, '5': 9, '10': 'btnTitle'},\n    {'1': 'btn_sub_title', '3': 2, '4': 1, '5': 9, '10': 'btnSubTitle'},\n    {'1': 'jump_uri', '3': 3, '4': 1, '5': 9, '10': 'jumpUri'},\n  ],\n};\n\n/// Descriptor for `ButtonWithSubTitle`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List buttonWithSubTitleDescriptor = $convert.base64Decode(\n    'ChJCdXR0b25XaXRoU3ViVGl0bGUSGwoJYnRuX3RpdGxlGAEgASgJUghidG5UaXRsZRIiCg1idG'\n    '5fc3ViX3RpdGxlGAIgASgJUgtidG5TdWJUaXRsZRIZCghqdW1wX3VyaRgDIAEoCVIHanVtcFVy'\n    'aQ==');\n\n@$core.Deprecated('Use buttonWithSubscribeParamDescriptor instead')\nconst ButtonWithSubscribeParam$json = {\n  '1': 'ButtonWithSubscribeParam',\n  '2': [\n    {'1': 'btn_text', '3': 1, '4': 1, '5': 9, '10': 'btnText'},\n    {'1': 'btn_icon', '3': 2, '4': 1, '5': 9, '10': 'btnIcon'},\n    {'1': 'subscribe_param', '3': 3, '4': 1, '5': 9, '10': 'subscribeParam'},\n  ],\n};\n\n/// Descriptor for `ButtonWithSubscribeParam`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List buttonWithSubscribeParamDescriptor = $convert.base64Decode(\n    'ChhCdXR0b25XaXRoU3Vic2NyaWJlUGFyYW0SGQoIYnRuX3RleHQYASABKAlSB2J0blRleHQSGQ'\n    'oIYnRuX2ljb24YAiABKAlSB2J0bkljb24SJwoPc3Vic2NyaWJlX3BhcmFtGAMgASgJUg5zdWJz'\n    'Y3JpYmVQYXJhbQ==');\n\n@$core.Deprecated('Use campusBannerInfoDescriptor instead')\nconst CampusBannerInfo$json = {\n  '1': 'CampusBannerInfo',\n  '2': [\n    {'1': 'image', '3': 1, '4': 1, '5': 9, '10': 'image'},\n    {'1': 'jump_url', '3': 2, '4': 1, '5': 9, '10': 'jumpUrl'},\n  ],\n};\n\n/// Descriptor for `CampusBannerInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusBannerInfoDescriptor = $convert.base64Decode(\n    'ChBDYW1wdXNCYW5uZXJJbmZvEhQKBWltYWdlGAEgASgJUgVpbWFnZRIZCghqdW1wX3VybBgCIA'\n    'EoCVIHanVtcFVybA==');\n\n@$core.Deprecated('Use campusBillBoardReplyDescriptor instead')\nconst CampusBillBoardReply$json = {\n  '1': 'CampusBillBoardReply',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'help_uri', '3': 2, '4': 1, '5': 9, '10': 'helpUri'},\n    {'1': 'campus_name', '3': 3, '4': 1, '5': 9, '10': 'campusName'},\n    {'1': 'build_time', '3': 4, '4': 1, '5': 3, '10': 'buildTime'},\n    {'1': 'version_code', '3': 5, '4': 1, '5': 9, '10': 'versionCode'},\n    {\n      '1': 'list',\n      '3': 6,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OfficialItem',\n      '10': 'list'\n    },\n    {'1': 'share_uri', '3': 7, '4': 1, '5': 9, '10': 'shareUri'},\n    {'1': 'bind_notice', '3': 8, '4': 1, '5': 5, '10': 'bindNotice'},\n    {'1': 'update_toast', '3': 9, '4': 1, '5': 9, '10': 'updateToast'},\n    {'1': 'campus_id', '3': 10, '4': 1, '5': 3, '10': 'campusId'},\n    {\n      '1': 'open_progress',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusFeatureProgress',\n      '10': 'openProgress'\n    },\n  ],\n};\n\n/// Descriptor for `CampusBillBoardReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusBillBoardReplyDescriptor = $convert.base64Decode(\n    'ChRDYW1wdXNCaWxsQm9hcmRSZXBseRIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSGQoIaGVscF91cm'\n    'kYAiABKAlSB2hlbHBVcmkSHwoLY2FtcHVzX25hbWUYAyABKAlSCmNhbXB1c05hbWUSHQoKYnVp'\n    'bGRfdGltZRgEIAEoA1IJYnVpbGRUaW1lEiEKDHZlcnNpb25fY29kZRgFIAEoCVILdmVyc2lvbk'\n    'NvZGUSOQoEbGlzdBgGIAMoCzIlLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLk9mZmljaWFsSXRl'\n    'bVIEbGlzdBIbCglzaGFyZV91cmkYByABKAlSCHNoYXJlVXJpEh8KC2JpbmRfbm90aWNlGAggAS'\n    'gFUgpiaW5kTm90aWNlEiEKDHVwZGF0ZV90b2FzdBgJIAEoCVILdXBkYXRlVG9hc3QSGwoJY2Ft'\n    'cHVzX2lkGAogASgDUghjYW1wdXNJZBJTCg1vcGVuX3Byb2dyZXNzGAsgASgLMi4uYmlsaWJpbG'\n    'kuYXBwLmR5bmFtaWMudjIuQ2FtcHVzRmVhdHVyZVByb2dyZXNzUgxvcGVuUHJvZ3Jlc3M=');\n\n@$core.Deprecated('Use campusBillBoardReqDescriptor instead')\nconst CampusBillBoardReq$json = {\n  '1': 'CampusBillBoardReq',\n  '2': [\n    {'1': 'campus_id', '3': 1, '4': 1, '5': 3, '10': 'campusId'},\n    {'1': 'version_code', '3': 2, '4': 1, '5': 9, '10': 'versionCode'},\n    {\n      '1': 'player_args',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n    {\n      '1': 'from_type',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CampusReqFromType',\n      '10': 'fromType'\n    },\n  ],\n};\n\n/// Descriptor for `CampusBillBoardReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusBillBoardReqDescriptor = $convert.base64Decode(\n    'ChJDYW1wdXNCaWxsQm9hcmRSZXESGwoJY2FtcHVzX2lkGAEgASgDUghjYW1wdXNJZBIhCgx2ZX'\n    'JzaW9uX2NvZGUYAiABKAlSC3ZlcnNpb25Db2RlEk8KC3BsYXllcl9hcmdzGAMgASgLMi4uYmls'\n    'aWJpbGkuYXBwLmFyY2hpdmUubWlkZGxld2FyZS52MS5QbGF5ZXJBcmdzUgpwbGF5ZXJBcmdzEk'\n    'cKCWZyb21fdHlwZRgEIAEoDjIqLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkNhbXB1c1JlcUZy'\n    'b21UeXBlUghmcm9tVHlwZQ==');\n\n@$core.Deprecated('Use campusBillboardInternalReqDescriptor instead')\nconst CampusBillboardInternalReq$json = {\n  '1': 'CampusBillboardInternalReq',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'campus_id', '3': 2, '4': 1, '5': 3, '10': 'campusId'},\n    {'1': 'version_code', '3': 3, '4': 1, '5': 9, '10': 'versionCode'},\n  ],\n};\n\n/// Descriptor for `CampusBillboardInternalReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusBillboardInternalReqDescriptor =\n    $convert.base64Decode(\n        'ChpDYW1wdXNCaWxsYm9hcmRJbnRlcm5hbFJlcRIQCgNtaWQYASABKANSA21pZBIbCgljYW1wdX'\n        'NfaWQYAiABKANSCGNhbXB1c0lkEiEKDHZlcnNpb25fY29kZRgDIAEoCVILdmVyc2lvbkNvZGU=');\n\n@$core.Deprecated('Use campusEntryTabReqDescriptor instead')\nconst CampusEntryTabReq$json = {\n  '1': 'CampusEntryTabReq',\n  '2': [\n    {'1': 'campus_id', '3': 1, '4': 1, '5': 3, '10': 'campusId'},\n  ],\n};\n\n/// Descriptor for `CampusEntryTabReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusEntryTabReqDescriptor = $convert.base64Decode(\n    'ChFDYW1wdXNFbnRyeVRhYlJlcRIbCgljYW1wdXNfaWQYASABKANSCGNhbXB1c0lk');\n\n@$core.Deprecated('Use campusEntryTabRespDescriptor instead')\nconst CampusEntryTabResp$json = {\n  '1': 'CampusEntryTabResp',\n  '2': [\n    {\n      '1': 'entry_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CampusEntryType',\n      '10': 'entryType'\n    },\n  ],\n};\n\n/// Descriptor for `CampusEntryTabResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusEntryTabRespDescriptor = $convert.base64Decode(\n    'ChJDYW1wdXNFbnRyeVRhYlJlc3ASRwoKZW50cnlfdHlwZRgBIAEoDjIoLmJpbGliaWxpLmFwcC'\n    '5keW5hbWljLnYyLkNhbXB1c0VudHJ5VHlwZVIJZW50cnlUeXBl');\n\n@$core.Deprecated('Use campusFeatureProgressDescriptor instead')\nconst CampusFeatureProgress$json = {\n  '1': 'CampusFeatureProgress',\n  '2': [\n    {'1': 'progress_full', '3': 1, '4': 1, '5': 3, '10': 'progressFull'},\n    {\n      '1': 'progress_achieved',\n      '3': 2,\n      '4': 1,\n      '5': 3,\n      '10': 'progressAchieved'\n    },\n    {'1': 'desc_title', '3': 3, '4': 1, '5': 9, '10': 'descTitle'},\n    {'1': 'desc1', '3': 4, '4': 1, '5': 9, '10': 'desc1'},\n    {\n      '1': 'btn',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusLabel',\n      '10': 'btn'\n    },\n  ],\n};\n\n/// Descriptor for `CampusFeatureProgress`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusFeatureProgressDescriptor = $convert.base64Decode(\n    'ChVDYW1wdXNGZWF0dXJlUHJvZ3Jlc3MSIwoNcHJvZ3Jlc3NfZnVsbBgBIAEoA1IMcHJvZ3Jlc3'\n    'NGdWxsEisKEXByb2dyZXNzX2FjaGlldmVkGAIgASgDUhBwcm9ncmVzc0FjaGlldmVkEh0KCmRl'\n    'c2NfdGl0bGUYAyABKAlSCWRlc2NUaXRsZRIUCgVkZXNjMRgEIAEoCVIFZGVzYzESNgoDYnRuGA'\n    'UgASgLMiQuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQ2FtcHVzTGFiZWxSA2J0bg==');\n\n@$core.Deprecated('Use campusFeedbackInfoDescriptor instead')\nconst CampusFeedbackInfo$json = {\n  '1': 'CampusFeedbackInfo',\n  '2': [\n    {'1': 'biz_type', '3': 1, '4': 1, '5': 5, '10': 'bizType'},\n    {'1': 'biz_id', '3': 2, '4': 1, '5': 3, '10': 'bizId'},\n    {'1': 'campus_id', '3': 3, '4': 1, '5': 3, '10': 'campusId'},\n    {'1': 'reason', '3': 4, '4': 1, '5': 9, '10': 'reason'},\n  ],\n};\n\n/// Descriptor for `CampusFeedbackInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusFeedbackInfoDescriptor = $convert.base64Decode(\n    'ChJDYW1wdXNGZWVkYmFja0luZm8SGQoIYml6X3R5cGUYASABKAVSB2JpelR5cGUSFQoGYml6X2'\n    'lkGAIgASgDUgViaXpJZBIbCgljYW1wdXNfaWQYAyABKANSCGNhbXB1c0lkEhYKBnJlYXNvbhgE'\n    'IAEoCVIGcmVhc29u');\n\n@$core.Deprecated('Use campusFeedbackReplyDescriptor instead')\nconst CampusFeedbackReply$json = {\n  '1': 'CampusFeedbackReply',\n  '2': [\n    {'1': 'message', '3': 1, '4': 1, '5': 9, '10': 'message'},\n  ],\n};\n\n/// Descriptor for `CampusFeedbackReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusFeedbackReplyDescriptor =\n    $convert.base64Decode(\n        'ChNDYW1wdXNGZWVkYmFja1JlcGx5EhgKB21lc3NhZ2UYASABKAlSB21lc3NhZ2U=');\n\n@$core.Deprecated('Use campusFeedbackReqDescriptor instead')\nconst CampusFeedbackReq$json = {\n  '1': 'CampusFeedbackReq',\n  '2': [\n    {\n      '1': 'infos',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusFeedbackInfo',\n      '10': 'infos'\n    },\n    {\n      '1': 'from',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CampusReqFromType',\n      '10': 'from'\n    },\n    {\n      '1': 'from_type',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CampusReqFromType',\n      '10': 'fromType'\n    },\n  ],\n};\n\n/// Descriptor for `CampusFeedbackReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusFeedbackReqDescriptor = $convert.base64Decode(\n    'ChFDYW1wdXNGZWVkYmFja1JlcRJBCgVpbmZvcxgBIAMoCzIrLmJpbGliaWxpLmFwcC5keW5hbW'\n    'ljLnYyLkNhbXB1c0ZlZWRiYWNrSW5mb1IFaW5mb3MSPgoEZnJvbRgCIAEoDjIqLmJpbGliaWxp'\n    'LmFwcC5keW5hbWljLnYyLkNhbXB1c1JlcUZyb21UeXBlUgRmcm9tEkcKCWZyb21fdHlwZRgDIA'\n    'EoDjIqLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkNhbXB1c1JlcUZyb21UeXBlUghmcm9tVHlw'\n    'ZQ==');\n\n@$core.Deprecated('Use campusHomePagesReplyDescriptor instead')\nconst CampusHomePagesReply$json = {\n  '1': 'CampusHomePagesReply',\n  '2': [\n    {\n      '1': 'top',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusRcmdTop',\n      '10': 'top'\n    },\n    {\n      '1': 'campus_top',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusTop',\n      '10': 'campusTop'\n    },\n    {'1': 'page_type', '3': 3, '4': 1, '5': 5, '10': 'pageType'},\n  ],\n};\n\n/// Descriptor for `CampusHomePagesReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusHomePagesReplyDescriptor = $convert.base64Decode(\n    'ChRDYW1wdXNIb21lUGFnZXNSZXBseRI4CgN0b3AYASABKAsyJi5iaWxpYmlsaS5hcHAuZHluYW'\n    '1pYy52Mi5DYW1wdXNSY21kVG9wUgN0b3ASQQoKY2FtcHVzX3RvcBgCIAEoCzIiLmJpbGliaWxp'\n    'LmFwcC5keW5hbWljLnYyLkNhbXB1c1RvcFIJY2FtcHVzVG9wEhsKCXBhZ2VfdHlwZRgDIAEoBV'\n    'IIcGFnZVR5cGU=');\n\n@$core.Deprecated('Use campusHomePagesReqDescriptor instead')\nconst CampusHomePagesReq$json = {\n  '1': 'CampusHomePagesReq',\n  '2': [\n    {'1': 'campus_id', '3': 1, '4': 1, '5': 3, '10': 'campusId'},\n    {'1': 'campus_name', '3': 2, '4': 1, '5': 9, '10': 'campusName'},\n    {'1': 'lat', '3': 3, '4': 1, '5': 1, '10': 'lat'},\n    {'1': 'lng', '3': 4, '4': 1, '5': 1, '10': 'lng'},\n    {\n      '1': 'player_args',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n    {\n      '1': 'page_type',\n      '3': 6,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CampusHomePageType',\n      '10': 'pageType'\n    },\n  ],\n};\n\n/// Descriptor for `CampusHomePagesReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusHomePagesReqDescriptor = $convert.base64Decode(\n    'ChJDYW1wdXNIb21lUGFnZXNSZXESGwoJY2FtcHVzX2lkGAEgASgDUghjYW1wdXNJZBIfCgtjYW'\n    '1wdXNfbmFtZRgCIAEoCVIKY2FtcHVzTmFtZRIQCgNsYXQYAyABKAFSA2xhdBIQCgNsbmcYBCAB'\n    'KAFSA2xuZxJPCgtwbGF5ZXJfYXJncxgFIAEoCzIuLmJpbGliaWxpLmFwcC5hcmNoaXZlLm1pZG'\n    'RsZXdhcmUudjEuUGxheWVyQXJnc1IKcGxheWVyQXJncxJICglwYWdlX3R5cGUYBiABKA4yKy5i'\n    'aWxpYmlsaS5hcHAuZHluYW1pYy52Mi5DYW1wdXNIb21lUGFnZVR5cGVSCHBhZ2VUeXBl');\n\n@$core.Deprecated('Use campusHomeRcmdTopicDescriptor instead')\nconst CampusHomeRcmdTopic$json = {\n  '1': 'CampusHomeRcmdTopic',\n  '2': [\n    {\n      '1': 'title',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleTitle',\n      '10': 'title'\n    },\n    {\n      '1': 'topic',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.TopicItem',\n      '10': 'topic'\n    },\n  ],\n};\n\n/// Descriptor for `CampusHomeRcmdTopic`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusHomeRcmdTopicDescriptor = $convert.base64Decode(\n    'ChNDYW1wdXNIb21lUmNtZFRvcGljEjoKBXRpdGxlGAEgASgLMiQuYmlsaWJpbGkuYXBwLmR5bm'\n    'FtaWMudjIuTW9kdWxlVGl0bGVSBXRpdGxlEjgKBXRvcGljGAIgAygLMiIuYmlsaWJpbGkuYXBw'\n    'LmR5bmFtaWMudjIuVG9waWNJdGVtUgV0b3BpYw==');\n\n@$core.Deprecated('Use campusInfoDescriptor instead')\nconst CampusInfo$json = {\n  '1': 'CampusInfo',\n  '2': [\n    {'1': 'campus_id', '3': 1, '4': 1, '5': 3, '10': 'campusId'},\n    {'1': 'campus_name', '3': 2, '4': 1, '5': 9, '10': 'campusName'},\n    {'1': 'desc', '3': 3, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'online', '3': 4, '4': 1, '5': 3, '10': 'online'},\n    {'1': 'url', '3': 5, '4': 1, '5': 9, '10': 'url'},\n  ],\n};\n\n/// Descriptor for `CampusInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusInfoDescriptor = $convert.base64Decode(\n    'CgpDYW1wdXNJbmZvEhsKCWNhbXB1c19pZBgBIAEoA1IIY2FtcHVzSWQSHwoLY2FtcHVzX25hbW'\n    'UYAiABKAlSCmNhbXB1c05hbWUSEgoEZGVzYxgDIAEoCVIEZGVzYxIWCgZvbmxpbmUYBCABKANS'\n    'Bm9ubGluZRIQCgN1cmwYBSABKAlSA3VybA==');\n\n@$core.Deprecated('Use campusLabelDescriptor instead')\nconst CampusLabel$json = {\n  '1': 'CampusLabel',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'url', '3': 2, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'desc', '3': 3, '4': 1, '5': 9, '10': 'desc'},\n  ],\n};\n\n/// Descriptor for `CampusLabel`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusLabelDescriptor = $convert.base64Decode(\n    'CgtDYW1wdXNMYWJlbBISCgR0ZXh0GAEgASgJUgR0ZXh0EhAKA3VybBgCIAEoCVIDdXJsEhIKBG'\n    'Rlc2MYAyABKAlSBGRlc2M=');\n\n@$core.Deprecated('Use campusMateLikeListReplyDescriptor instead')\nconst CampusMateLikeListReply$json = {\n  '1': 'CampusMateLikeListReply',\n  '2': [\n    {\n      '1': 'list',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleAuthor',\n      '10': 'list'\n    },\n  ],\n};\n\n/// Descriptor for `CampusMateLikeListReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusMateLikeListReplyDescriptor =\n    $convert.base64Decode(\n        'ChdDYW1wdXNNYXRlTGlrZUxpc3RSZXBseRI5CgRsaXN0GAEgAygLMiUuYmlsaWJpbGkuYXBwLm'\n        'R5bmFtaWMudjIuTW9kdWxlQXV0aG9yUgRsaXN0');\n\n@$core.Deprecated('Use campusMateLikeListReqDescriptor instead')\nconst CampusMateLikeListReq$json = {\n  '1': 'CampusMateLikeListReq',\n  '2': [\n    {'1': 'dynamic_id', '3': 1, '4': 1, '5': 3, '10': 'dynamicId'},\n    {\n      '1': 'from_type',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CampusReqFromType',\n      '10': 'fromType'\n    },\n  ],\n};\n\n/// Descriptor for `CampusMateLikeListReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusMateLikeListReqDescriptor = $convert.base64Decode(\n    'ChVDYW1wdXNNYXRlTGlrZUxpc3RSZXESHQoKZHluYW1pY19pZBgBIAEoA1IJZHluYW1pY0lkEk'\n    'cKCWZyb21fdHlwZRgCIAEoDjIqLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkNhbXB1c1JlcUZy'\n    'b21UeXBlUghmcm9tVHlwZQ==');\n\n@$core.Deprecated('Use campusMngBadgeDescriptor instead')\nconst CampusMngBadge$json = {\n  '1': 'CampusMngBadge',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'badge_url', '3': 2, '4': 1, '5': 9, '10': 'badgeUrl'},\n    {'1': 'upload_hint_msg', '3': 3, '4': 1, '5': 9, '10': 'uploadHintMsg'},\n  ],\n};\n\n/// Descriptor for `CampusMngBadge`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusMngBadgeDescriptor = $convert.base64Decode(\n    'Cg5DYW1wdXNNbmdCYWRnZRIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSGwoJYmFkZ2VfdXJsGAIgAS'\n    'gJUghiYWRnZVVybBImCg91cGxvYWRfaGludF9tc2cYAyABKAlSDXVwbG9hZEhpbnRNc2c=');\n\n@$core.Deprecated('Use campusMngBasicInfoDescriptor instead')\nconst CampusMngBasicInfo$json = {\n  '1': 'CampusMngBasicInfo',\n  '2': [\n    {'1': 'campus_id', '3': 1, '4': 1, '5': 3, '10': 'campusId'},\n    {'1': 'campus_name', '3': 2, '4': 1, '5': 9, '10': 'campusName'},\n    {'1': 'hint_msg', '3': 3, '4': 1, '5': 9, '10': 'hintMsg'},\n  ],\n};\n\n/// Descriptor for `CampusMngBasicInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusMngBasicInfoDescriptor = $convert.base64Decode(\n    'ChJDYW1wdXNNbmdCYXNpY0luZm8SGwoJY2FtcHVzX2lkGAEgASgDUghjYW1wdXNJZBIfCgtjYW'\n    '1wdXNfbmFtZRgCIAEoCVIKY2FtcHVzTmFtZRIZCghoaW50X21zZxgDIAEoCVIHaGludE1zZw==');\n\n@$core.Deprecated('Use campusMngDetailReplyDescriptor instead')\nconst CampusMngDetailReply$json = {\n  '1': 'CampusMngDetailReply',\n  '2': [\n    {\n      '1': 'items',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusMngItem',\n      '10': 'items'\n    },\n    {'1': 'top_hint_bar_msg', '3': 2, '4': 1, '5': 9, '10': 'topHintBarMsg'},\n    {\n      '1': 'bottom_submit_hint_msg',\n      '3': 3,\n      '4': 1,\n      '5': 9,\n      '10': 'bottomSubmitHintMsg'\n    },\n    {'1': 'campus_id', '3': 4, '4': 1, '5': 3, '10': 'campusId'},\n    {'1': 'campus_name', '3': 5, '4': 1, '5': 9, '10': 'campusName'},\n  ],\n};\n\n/// Descriptor for `CampusMngDetailReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusMngDetailReplyDescriptor = $convert.base64Decode(\n    'ChRDYW1wdXNNbmdEZXRhaWxSZXBseRI8CgVpdGVtcxgBIAMoCzImLmJpbGliaWxpLmFwcC5keW'\n    '5hbWljLnYyLkNhbXB1c01uZ0l0ZW1SBWl0ZW1zEicKEHRvcF9oaW50X2Jhcl9tc2cYAiABKAlS'\n    'DXRvcEhpbnRCYXJNc2cSMwoWYm90dG9tX3N1Ym1pdF9oaW50X21zZxgDIAEoCVITYm90dG9tU3'\n    'VibWl0SGludE1zZxIbCgljYW1wdXNfaWQYBCABKANSCGNhbXB1c0lkEh8KC2NhbXB1c19uYW1l'\n    'GAUgASgJUgpjYW1wdXNOYW1l');\n\n@$core.Deprecated('Use campusMngDetailReqDescriptor instead')\nconst CampusMngDetailReq$json = {\n  '1': 'CampusMngDetailReq',\n  '2': [\n    {'1': 'campus_id', '3': 1, '4': 1, '5': 3, '10': 'campusId'},\n  ],\n};\n\n/// Descriptor for `CampusMngDetailReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusMngDetailReqDescriptor =\n    $convert.base64Decode(\n        'ChJDYW1wdXNNbmdEZXRhaWxSZXESGwoJY2FtcHVzX2lkGAEgASgDUghjYW1wdXNJZA==');\n\n@$core.Deprecated('Use campusMngItemDescriptor instead')\nconst CampusMngItem$json = {\n  '1': 'CampusMngItem',\n  '2': [\n    {\n      '1': 'basic_info',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusMngBasicInfo',\n      '9': 0,\n      '10': 'basicInfo'\n    },\n    {\n      '1': 'badge',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusMngBadge',\n      '9': 0,\n      '10': 'badge'\n    },\n    {\n      '1': 'slogan',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusMngSlogan',\n      '9': 0,\n      '10': 'slogan'\n    },\n    {\n      '1': 'quiz',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusMngQuiz',\n      '9': 0,\n      '10': 'quiz'\n    },\n    {\n      '1': 'audit_status',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CampusMngAuditStatus',\n      '10': 'auditStatus'\n    },\n    {'1': 'audit_message', '3': 2, '4': 1, '5': 9, '10': 'auditMessage'},\n    {\n      '1': 'item_type',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CampusMngItemType',\n      '10': 'itemType'\n    },\n    {'1': 'mng_item_id', '3': 4, '4': 1, '5': 9, '10': 'mngItemId'},\n    {'1': 'is_del', '3': 5, '4': 1, '5': 8, '10': 'isDel'},\n  ],\n  '8': [\n    {'1': 'item'},\n  ],\n};\n\n/// Descriptor for `CampusMngItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusMngItemDescriptor = $convert.base64Decode(\n    'Cg1DYW1wdXNNbmdJdGVtEkwKCmJhc2ljX2luZm8YBiABKAsyKy5iaWxpYmlsaS5hcHAuZHluYW'\n    '1pYy52Mi5DYW1wdXNNbmdCYXNpY0luZm9IAFIJYmFzaWNJbmZvEj8KBWJhZGdlGAcgASgLMicu'\n    'YmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQ2FtcHVzTW5nQmFkZ2VIAFIFYmFkZ2USQgoGc2xvZ2'\n    'FuGAggASgLMiguYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQ2FtcHVzTW5nU2xvZ2FuSABSBnNs'\n    'b2dhbhI8CgRxdWl6GAkgASgLMiYuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQ2FtcHVzTW5nUX'\n    'VpekgAUgRxdWl6ElAKDGF1ZGl0X3N0YXR1cxgBIAEoDjItLmJpbGliaWxpLmFwcC5keW5hbWlj'\n    'LnYyLkNhbXB1c01uZ0F1ZGl0U3RhdHVzUgthdWRpdFN0YXR1cxIjCg1hdWRpdF9tZXNzYWdlGA'\n    'IgASgJUgxhdWRpdE1lc3NhZ2USRwoJaXRlbV90eXBlGAMgASgOMiouYmlsaWJpbGkuYXBwLmR5'\n    'bmFtaWMudjIuQ2FtcHVzTW5nSXRlbVR5cGVSCGl0ZW1UeXBlEh4KC21uZ19pdGVtX2lkGAQgAS'\n    'gJUgltbmdJdGVtSWQSFQoGaXNfZGVsGAUgASgIUgVpc0RlbEIGCgRpdGVt');\n\n@$core.Deprecated('Use campusMngQuizDescriptor instead')\nconst CampusMngQuiz$json = {\n  '1': 'CampusMngQuiz',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'more_label',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusLabel',\n      '10': 'moreLabel'\n    },\n    {'1': 'add_label', '3': 3, '4': 1, '5': 9, '10': 'addLabel'},\n    {'1': 'submit_label', '3': 4, '4': 1, '5': 9, '10': 'submitLabel'},\n    {'1': 'quiz_count', '3': 5, '4': 1, '5': 3, '10': 'quizCount'},\n  ],\n};\n\n/// Descriptor for `CampusMngQuiz`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusMngQuizDescriptor = $convert.base64Decode(\n    'Cg1DYW1wdXNNbmdRdWl6EhQKBXRpdGxlGAEgASgJUgV0aXRsZRJDCgptb3JlX2xhYmVsGAIgAS'\n    'gLMiQuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQ2FtcHVzTGFiZWxSCW1vcmVMYWJlbBIbCglh'\n    'ZGRfbGFiZWwYAyABKAlSCGFkZExhYmVsEiEKDHN1Ym1pdF9sYWJlbBgEIAEoCVILc3VibWl0TG'\n    'FiZWwSHQoKcXVpel9jb3VudBgFIAEoA1IJcXVpekNvdW50');\n\n@$core.Deprecated('Use campusMngQuizDetailDescriptor instead')\nconst CampusMngQuizDetail$json = {\n  '1': 'CampusMngQuizDetail',\n  '2': [\n    {'1': 'quiz_id', '3': 1, '4': 1, '5': 3, '10': 'quizId'},\n    {'1': 'question', '3': 2, '4': 1, '5': 9, '10': 'question'},\n    {'1': 'correct_answer', '3': 3, '4': 1, '5': 9, '10': 'correctAnswer'},\n    {'1': 'wrong_answer_list', '3': 4, '4': 3, '5': 9, '10': 'wrongAnswerList'},\n    {\n      '1': 'audit_status',\n      '3': 5,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CampusMngAuditStatus',\n      '10': 'auditStatus'\n    },\n    {'1': 'audit_message', '3': 6, '4': 1, '5': 9, '10': 'auditMessage'},\n  ],\n};\n\n/// Descriptor for `CampusMngQuizDetail`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusMngQuizDetailDescriptor = $convert.base64Decode(\n    'ChNDYW1wdXNNbmdRdWl6RGV0YWlsEhcKB3F1aXpfaWQYASABKANSBnF1aXpJZBIaCghxdWVzdG'\n    'lvbhgCIAEoCVIIcXVlc3Rpb24SJQoOY29ycmVjdF9hbnN3ZXIYAyABKAlSDWNvcnJlY3RBbnN3'\n    'ZXISKgoRd3JvbmdfYW5zd2VyX2xpc3QYBCADKAlSD3dyb25nQW5zd2VyTGlzdBJQCgxhdWRpdF'\n    '9zdGF0dXMYBSABKA4yLS5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5DYW1wdXNNbmdBdWRpdFN0'\n    'YXR1c1ILYXVkaXRTdGF0dXMSIwoNYXVkaXRfbWVzc2FnZRgGIAEoCVIMYXVkaXRNZXNzYWdl');\n\n@$core.Deprecated('Use campusMngQuizOperateReplyDescriptor instead')\nconst CampusMngQuizOperateReply$json = {\n  '1': 'CampusMngQuizOperateReply',\n  '2': [\n    {'1': 'toast', '3': 1, '4': 1, '5': 9, '10': 'toast'},\n    {\n      '1': 'quiz',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusMngQuizDetail',\n      '10': 'quiz'\n    },\n    {'1': 'quiz_total', '3': 3, '4': 1, '5': 3, '10': 'quizTotal'},\n  ],\n};\n\n/// Descriptor for `CampusMngQuizOperateReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusMngQuizOperateReplyDescriptor = $convert.base64Decode(\n    'ChlDYW1wdXNNbmdRdWl6T3BlcmF0ZVJlcGx5EhQKBXRvYXN0GAEgASgJUgV0b2FzdBJACgRxdW'\n    'l6GAIgAygLMiwuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQ2FtcHVzTW5nUXVpekRldGFpbFIE'\n    'cXVpehIdCgpxdWl6X3RvdGFsGAMgASgDUglxdWl6VG90YWw=');\n\n@$core.Deprecated('Use campusMngQuizOperateReqDescriptor instead')\nconst CampusMngQuizOperateReq$json = {\n  '1': 'CampusMngQuizOperateReq',\n  '2': [\n    {\n      '1': 'action',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CampusMngQuizAction',\n      '10': 'action'\n    },\n    {'1': 'campus_id', '3': 2, '4': 1, '5': 3, '10': 'campusId'},\n    {\n      '1': 'quiz',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusMngQuizDetail',\n      '10': 'quiz'\n    },\n  ],\n};\n\n/// Descriptor for `CampusMngQuizOperateReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusMngQuizOperateReqDescriptor = $convert.base64Decode(\n    'ChdDYW1wdXNNbmdRdWl6T3BlcmF0ZVJlcRJECgZhY3Rpb24YASABKA4yLC5iaWxpYmlsaS5hcH'\n    'AuZHluYW1pYy52Mi5DYW1wdXNNbmdRdWl6QWN0aW9uUgZhY3Rpb24SGwoJY2FtcHVzX2lkGAIg'\n    'ASgDUghjYW1wdXNJZBJACgRxdWl6GAMgAygLMiwuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQ2'\n    'FtcHVzTW5nUXVpekRldGFpbFIEcXVpeg==');\n\n@$core.Deprecated('Use campusMngSloganDescriptor instead')\nconst CampusMngSlogan$json = {\n  '1': 'CampusMngSlogan',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'slogan', '3': 2, '4': 1, '5': 9, '10': 'slogan'},\n    {'1': 'input_hint_msg', '3': 3, '4': 1, '5': 9, '10': 'inputHintMsg'},\n  ],\n};\n\n/// Descriptor for `CampusMngSlogan`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusMngSloganDescriptor = $convert.base64Decode(\n    'Cg9DYW1wdXNNbmdTbG9nYW4SFAoFdGl0bGUYASABKAlSBXRpdGxlEhYKBnNsb2dhbhgCIAEoCV'\n    'IGc2xvZ2FuEiQKDmlucHV0X2hpbnRfbXNnGAMgASgJUgxpbnB1dEhpbnRNc2c=');\n\n@$core.Deprecated('Use campusMngSubmitReplyDescriptor instead')\nconst CampusMngSubmitReply$json = {\n  '1': 'CampusMngSubmitReply',\n  '2': [\n    {'1': 'toast', '3': 1, '4': 1, '5': 9, '10': 'toast'},\n  ],\n};\n\n/// Descriptor for `CampusMngSubmitReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusMngSubmitReplyDescriptor =\n    $convert.base64Decode(\n        'ChRDYW1wdXNNbmdTdWJtaXRSZXBseRIUCgV0b2FzdBgBIAEoCVIFdG9hc3Q=');\n\n@$core.Deprecated('Use campusMngSubmitReqDescriptor instead')\nconst CampusMngSubmitReq$json = {\n  '1': 'CampusMngSubmitReq',\n  '2': [\n    {'1': 'campus_id', '3': 1, '4': 1, '5': 3, '10': 'campusId'},\n    {\n      '1': 'modified_items',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusMngItem',\n      '10': 'modifiedItems'\n    },\n  ],\n};\n\n/// Descriptor for `CampusMngSubmitReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusMngSubmitReqDescriptor = $convert.base64Decode(\n    'ChJDYW1wdXNNbmdTdWJtaXRSZXESGwoJY2FtcHVzX2lkGAEgASgDUghjYW1wdXNJZBJNCg5tb2'\n    'RpZmllZF9pdGVtcxgCIAMoCzImLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkNhbXB1c01uZ0l0'\n    'ZW1SDW1vZGlmaWVkSXRlbXM=');\n\n@$core.Deprecated('Use campusNoticeInfoDescriptor instead')\nconst CampusNoticeInfo$json = {\n  '1': 'CampusNoticeInfo',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'desc', '3': 2, '4': 1, '5': 9, '10': 'desc'},\n    {\n      '1': 'button',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusLabel',\n      '10': 'button'\n    },\n  ],\n};\n\n/// Descriptor for `CampusNoticeInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusNoticeInfoDescriptor = $convert.base64Decode(\n    'ChBDYW1wdXNOb3RpY2VJbmZvEhQKBXRpdGxlGAEgASgJUgV0aXRsZRISCgRkZXNjGAIgASgJUg'\n    'RkZXNjEjwKBmJ1dHRvbhgDIAEoCzIkLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkNhbXB1c0xh'\n    'YmVsUgZidXR0b24=');\n\n@$core.Deprecated('Use campusRcmdFeedReplyDescriptor instead')\nconst CampusRcmdFeedReply$json = {\n  '1': 'CampusRcmdFeedReply',\n  '2': [\n    {\n      '1': 'list',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynamicItem',\n      '10': 'list'\n    },\n    {'1': 'toast', '3': 2, '4': 1, '5': 9, '10': 'toast'},\n    {\n      '1': 'guide_bar',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.GuideBarInfo',\n      '10': 'guideBar'\n    },\n    {'1': 'has_more', '3': 4, '4': 1, '5': 8, '10': 'hasMore'},\n    {'1': 'update', '3': 5, '4': 1, '5': 8, '10': 'update'},\n  ],\n};\n\n/// Descriptor for `CampusRcmdFeedReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusRcmdFeedReplyDescriptor = $convert.base64Decode(\n    'ChNDYW1wdXNSY21kRmVlZFJlcGx5EjgKBGxpc3QYASADKAsyJC5iaWxpYmlsaS5hcHAuZHluYW'\n    '1pYy52Mi5EeW5hbWljSXRlbVIEbGlzdBIUCgV0b2FzdBgCIAEoCVIFdG9hc3QSQgoJZ3VpZGVf'\n    'YmFyGAMgASgLMiUuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuR3VpZGVCYXJJbmZvUghndWlkZU'\n    'JhchIZCghoYXNfbW9yZRgEIAEoCFIHaGFzTW9yZRIWCgZ1cGRhdGUYBSABKAhSBnVwZGF0ZQ==');\n\n@$core.Deprecated('Use campusRcmdFeedReqDescriptor instead')\nconst CampusRcmdFeedReq$json = {\n  '1': 'CampusRcmdFeedReq',\n  '2': [\n    {'1': 'campus_id', '3': 1, '4': 1, '5': 3, '10': 'campusId'},\n    {'1': 'first_time', '3': 2, '4': 1, '5': 5, '10': 'firstTime'},\n    {\n      '1': 'player_args',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n    {'1': 'local_time', '3': 4, '4': 1, '5': 5, '10': 'localTime'},\n    {'1': 'page', '3': 5, '4': 1, '5': 5, '10': 'page'},\n    {'1': 'scroll', '3': 6, '4': 1, '5': 5, '10': 'scroll'},\n    {'1': 'view_dyn_id', '3': 7, '4': 1, '5': 9, '10': 'viewDynId'},\n    {\n      '1': 'from_type',\n      '3': 8,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CampusReqFromType',\n      '10': 'fromType'\n    },\n  ],\n};\n\n/// Descriptor for `CampusRcmdFeedReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusRcmdFeedReqDescriptor = $convert.base64Decode(\n    'ChFDYW1wdXNSY21kRmVlZFJlcRIbCgljYW1wdXNfaWQYASABKANSCGNhbXB1c0lkEh0KCmZpcn'\n    'N0X3RpbWUYAiABKAVSCWZpcnN0VGltZRJPCgtwbGF5ZXJfYXJncxgDIAEoCzIuLmJpbGliaWxp'\n    'LmFwcC5hcmNoaXZlLm1pZGRsZXdhcmUudjEuUGxheWVyQXJnc1IKcGxheWVyQXJncxIdCgpsb2'\n    'NhbF90aW1lGAQgASgFUglsb2NhbFRpbWUSEgoEcGFnZRgFIAEoBVIEcGFnZRIWCgZzY3JvbGwY'\n    'BiABKAVSBnNjcm9sbBIeCgt2aWV3X2R5bl9pZBgHIAEoCVIJdmlld0R5bklkEkcKCWZyb21fdH'\n    'lwZRgIIAEoDjIqLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkNhbXB1c1JlcUZyb21UeXBlUghm'\n    'cm9tVHlwZQ==');\n\n@$core.Deprecated('Use campusRcmdInfoDescriptor instead')\nconst CampusRcmdInfo$json = {\n  '1': 'CampusRcmdInfo',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'items',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusRcmdItem',\n      '10': 'items'\n    },\n  ],\n};\n\n/// Descriptor for `CampusRcmdInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusRcmdInfoDescriptor = $convert.base64Decode(\n    'Cg5DYW1wdXNSY21kSW5mbxIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSPQoFaXRlbXMYAiADKAsyJy'\n    '5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5DYW1wdXNSY21kSXRlbVIFaXRlbXM=');\n\n@$core.Deprecated('Use campusRcmdItemDescriptor instead')\nconst CampusRcmdItem$json = {\n  '1': 'CampusRcmdItem',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'items',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.RcmdItem',\n      '10': 'items'\n    },\n    {'1': 'campus_id', '3': 3, '4': 1, '5': 3, '10': 'campusId'},\n    {\n      '1': 'entry_label',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusLabel',\n      '10': 'entryLabel'\n    },\n  ],\n};\n\n/// Descriptor for `CampusRcmdItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusRcmdItemDescriptor = $convert.base64Decode(\n    'Cg5DYW1wdXNSY21kSXRlbRIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSNwoFaXRlbXMYAiADKAsyIS'\n    '5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5SY21kSXRlbVIFaXRlbXMSGwoJY2FtcHVzX2lkGAMg'\n    'ASgDUghjYW1wdXNJZBJFCgtlbnRyeV9sYWJlbBgEIAEoCzIkLmJpbGliaWxpLmFwcC5keW5hbW'\n    'ljLnYyLkNhbXB1c0xhYmVsUgplbnRyeUxhYmVs');\n\n@$core.Deprecated('Use campusRcmdReplyDescriptor instead')\nconst CampusRcmdReply$json = {\n  '1': 'CampusRcmdReply',\n  '2': [\n    {\n      '1': 'top',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusRcmdTop',\n      '10': 'top'\n    },\n    {\n      '1': 'rcmd',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusRcmdInfo',\n      '10': 'rcmd'\n    },\n    {\n      '1': 'campus_top',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusTop',\n      '10': 'campusTop'\n    },\n    {'1': 'page_type', '3': 4, '4': 1, '5': 5, '10': 'pageType'},\n    {'1': 'jump_home_pop', '3': 5, '4': 1, '5': 5, '10': 'jumpHomePop'},\n  ],\n};\n\n/// Descriptor for `CampusRcmdReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusRcmdReplyDescriptor = $convert.base64Decode(\n    'Cg9DYW1wdXNSY21kUmVwbHkSOAoDdG9wGAEgASgLMiYuYmlsaWJpbGkuYXBwLmR5bmFtaWMudj'\n    'IuQ2FtcHVzUmNtZFRvcFIDdG9wEjsKBHJjbWQYAiABKAsyJy5iaWxpYmlsaS5hcHAuZHluYW1p'\n    'Yy52Mi5DYW1wdXNSY21kSW5mb1IEcmNtZBJBCgpjYW1wdXNfdG9wGAMgASgLMiIuYmlsaWJpbG'\n    'kuYXBwLmR5bmFtaWMudjIuQ2FtcHVzVG9wUgljYW1wdXNUb3ASGwoJcGFnZV90eXBlGAQgASgF'\n    'UghwYWdlVHlwZRIiCg1qdW1wX2hvbWVfcG9wGAUgASgFUgtqdW1wSG9tZVBvcA==');\n\n@$core.Deprecated('Use campusRcmdReqDescriptor instead')\nconst CampusRcmdReq$json = {\n  '1': 'CampusRcmdReq',\n  '2': [\n    {'1': 'campus_id', '3': 1, '4': 1, '5': 3, '10': 'campusId'},\n    {'1': 'campus_name', '3': 2, '4': 1, '5': 9, '10': 'campusName'},\n    {'1': 'lat', '3': 3, '4': 1, '5': 1, '10': 'lat'},\n    {'1': 'lng', '3': 4, '4': 1, '5': 1, '10': 'lng'},\n    {\n      '1': 'player_args',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n    {\n      '1': 'from_type',\n      '3': 6,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CampusReqFromType',\n      '10': 'fromType'\n    },\n    {\n      '1': 'page_type',\n      '3': 7,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CampusHomePageType',\n      '10': 'pageType'\n    },\n  ],\n};\n\n/// Descriptor for `CampusRcmdReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusRcmdReqDescriptor = $convert.base64Decode(\n    'Cg1DYW1wdXNSY21kUmVxEhsKCWNhbXB1c19pZBgBIAEoA1IIY2FtcHVzSWQSHwoLY2FtcHVzX2'\n    '5hbWUYAiABKAlSCmNhbXB1c05hbWUSEAoDbGF0GAMgASgBUgNsYXQSEAoDbG5nGAQgASgBUgNs'\n    'bmcSTwoLcGxheWVyX2FyZ3MYBSABKAsyLi5iaWxpYmlsaS5hcHAuYXJjaGl2ZS5taWRkbGV3YX'\n    'JlLnYxLlBsYXllckFyZ3NSCnBsYXllckFyZ3MSRwoJZnJvbV90eXBlGAYgASgOMiouYmlsaWJp'\n    'bGkuYXBwLmR5bmFtaWMudjIuQ2FtcHVzUmVxRnJvbVR5cGVSCGZyb21UeXBlEkgKCXBhZ2VfdH'\n    'lwZRgHIAEoDjIrLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkNhbXB1c0hvbWVQYWdlVHlwZVII'\n    'cGFnZVR5cGU=');\n\n@$core.Deprecated('Use campusRcmdTopDescriptor instead')\nconst CampusRcmdTop$json = {\n  '1': 'CampusRcmdTop',\n  '2': [\n    {'1': 'campus_id', '3': 1, '4': 1, '5': 3, '10': 'campusId'},\n    {'1': 'campus_name', '3': 2, '4': 1, '5': 9, '10': 'campusName'},\n    {'1': 'title', '3': 3, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'desc', '3': 4, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'type', '3': 5, '4': 1, '5': 5, '10': 'type'},\n    {\n      '1': 'button',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.RcmdTopButton',\n      '10': 'button'\n    },\n    {\n      '1': 'switch_label',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusLabel',\n      '10': 'switchLabel'\n    },\n    {\n      '1': 'notice_label',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusLabel',\n      '10': 'noticeLabel'\n    },\n    {'1': 'desc2', '3': 9, '4': 1, '5': 9, '10': 'desc2'},\n    {'1': 'desc3', '3': 10, '4': 1, '5': 9, '10': 'desc3'},\n    {\n      '1': 'invite_label',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusLabel',\n      '10': 'inviteLabel'\n    },\n    {\n      '1': 'reserve_label',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusLabel',\n      '10': 'reserveLabel'\n    },\n    {'1': 'reserve_number', '3': 13, '4': 1, '5': 3, '10': 'reserveNumber'},\n    {'1': 'max_reserve', '3': 14, '4': 1, '5': 3, '10': 'maxReserve'},\n    {\n      '1': 'school_label',\n      '3': 15,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusLabel',\n      '10': 'schoolLabel'\n    },\n    {\n      '1': 'mng_label',\n      '3': 16,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusLabel',\n      '10': 'mngLabel'\n    },\n    {\n      '1': 'rcmd_topic',\n      '3': 17,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusHomeRcmdTopic',\n      '10': 'rcmdTopic'\n    },\n    {\n      '1': 'audit_before_open',\n      '3': 18,\n      '4': 1,\n      '5': 8,\n      '10': 'auditBeforeOpen'\n    },\n    {'1': 'audit_message', '3': 19, '4': 1, '5': 9, '10': 'auditMessage'},\n  ],\n};\n\n/// Descriptor for `CampusRcmdTop`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusRcmdTopDescriptor = $convert.base64Decode(\n    'Cg1DYW1wdXNSY21kVG9wEhsKCWNhbXB1c19pZBgBIAEoA1IIY2FtcHVzSWQSHwoLY2FtcHVzX2'\n    '5hbWUYAiABKAlSCmNhbXB1c05hbWUSFAoFdGl0bGUYAyABKAlSBXRpdGxlEhIKBGRlc2MYBCAB'\n    'KAlSBGRlc2MSEgoEdHlwZRgFIAEoBVIEdHlwZRI+CgZidXR0b24YBiABKAsyJi5iaWxpYmlsaS'\n    '5hcHAuZHluYW1pYy52Mi5SY21kVG9wQnV0dG9uUgZidXR0b24SRwoMc3dpdGNoX2xhYmVsGAcg'\n    'ASgLMiQuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQ2FtcHVzTGFiZWxSC3N3aXRjaExhYmVsEk'\n    'cKDG5vdGljZV9sYWJlbBgIIAEoCzIkLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkNhbXB1c0xh'\n    'YmVsUgtub3RpY2VMYWJlbBIUCgVkZXNjMhgJIAEoCVIFZGVzYzISFAoFZGVzYzMYCiABKAlSBW'\n    'Rlc2MzEkcKDGludml0ZV9sYWJlbBgLIAEoCzIkLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkNh'\n    'bXB1c0xhYmVsUgtpbnZpdGVMYWJlbBJJCg1yZXNlcnZlX2xhYmVsGAwgASgLMiQuYmlsaWJpbG'\n    'kuYXBwLmR5bmFtaWMudjIuQ2FtcHVzTGFiZWxSDHJlc2VydmVMYWJlbBIlCg5yZXNlcnZlX251'\n    'bWJlchgNIAEoA1INcmVzZXJ2ZU51bWJlchIfCgttYXhfcmVzZXJ2ZRgOIAEoA1IKbWF4UmVzZX'\n    'J2ZRJHCgxzY2hvb2xfbGFiZWwYDyABKAsyJC5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5DYW1w'\n    'dXNMYWJlbFILc2Nob29sTGFiZWwSQQoJbW5nX2xhYmVsGBAgASgLMiQuYmlsaWJpbGkuYXBwLm'\n    'R5bmFtaWMudjIuQ2FtcHVzTGFiZWxSCG1uZ0xhYmVsEksKCnJjbWRfdG9waWMYESABKAsyLC5i'\n    'aWxpYmlsaS5hcHAuZHluYW1pYy52Mi5DYW1wdXNIb21lUmNtZFRvcGljUglyY21kVG9waWMSKg'\n    'oRYXVkaXRfYmVmb3JlX29wZW4YEiABKAhSD2F1ZGl0QmVmb3JlT3BlbhIjCg1hdWRpdF9tZXNz'\n    'YWdlGBMgASgJUgxhdWRpdE1lc3NhZ2U=');\n\n@$core.Deprecated('Use campusRecommendReplyDescriptor instead')\nconst CampusRecommendReply$json = {\n  '1': 'CampusRecommendReply',\n  '2': [\n    {\n      '1': 'items',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.RcmdItem',\n      '10': 'items'\n    },\n    {'1': 'has_more', '3': 2, '4': 1, '5': 8, '10': 'hasMore'},\n  ],\n};\n\n/// Descriptor for `CampusRecommendReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusRecommendReplyDescriptor = $convert.base64Decode(\n    'ChRDYW1wdXNSZWNvbW1lbmRSZXBseRI3CgVpdGVtcxgBIAMoCzIhLmJpbGliaWxpLmFwcC5keW'\n    '5hbWljLnYyLlJjbWRJdGVtUgVpdGVtcxIZCghoYXNfbW9yZRgCIAEoCFIHaGFzTW9yZQ==');\n\n@$core.Deprecated('Use campusRecommendReqDescriptor instead')\nconst CampusRecommendReq$json = {\n  '1': 'CampusRecommendReq',\n  '2': [\n    {'1': 'campus_id', '3': 1, '4': 1, '5': 3, '10': 'campusId'},\n    {'1': 'page_no', '3': 2, '4': 1, '5': 3, '10': 'pageNo'},\n    {\n      '1': 'player_args',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n    {\n      '1': 'from',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CampusRcmdReqFrom',\n      '10': 'from'\n    },\n  ],\n};\n\n/// Descriptor for `CampusRecommendReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusRecommendReqDescriptor = $convert.base64Decode(\n    'ChJDYW1wdXNSZWNvbW1lbmRSZXESGwoJY2FtcHVzX2lkGAEgASgDUghjYW1wdXNJZBIXCgdwYW'\n    'dlX25vGAIgASgDUgZwYWdlTm8STwoLcGxheWVyX2FyZ3MYAyABKAsyLi5iaWxpYmlsaS5hcHAu'\n    'YXJjaGl2ZS5taWRkbGV3YXJlLnYxLlBsYXllckFyZ3NSCnBsYXllckFyZ3MSPgoEZnJvbRgEIA'\n    'EoDjIqLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkNhbXB1c1JjbWRSZXFGcm9tUgRmcm9t');\n\n@$core.Deprecated('Use campusRedDotReplyDescriptor instead')\nconst CampusRedDotReply$json = {\n  '1': 'CampusRedDotReply',\n  '2': [\n    {'1': 'red_dot', '3': 1, '4': 1, '5': 5, '10': 'redDot'},\n  ],\n};\n\n/// Descriptor for `CampusRedDotReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusRedDotReplyDescriptor = $convert.base64Decode(\n    'ChFDYW1wdXNSZWREb3RSZXBseRIXCgdyZWRfZG90GAEgASgFUgZyZWREb3Q=');\n\n@$core.Deprecated('Use campusRedDotReqDescriptor instead')\nconst CampusRedDotReq$json = {\n  '1': 'CampusRedDotReq',\n  '2': [\n    {'1': 'campus_id', '3': 1, '4': 1, '5': 3, '10': 'campusId'},\n    {\n      '1': 'from_type',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CampusReqFromType',\n      '10': 'fromType'\n    },\n  ],\n};\n\n/// Descriptor for `CampusRedDotReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusRedDotReqDescriptor = $convert.base64Decode(\n    'Cg9DYW1wdXNSZWREb3RSZXESGwoJY2FtcHVzX2lkGAEgASgDUghjYW1wdXNJZBJHCglmcm9tX3'\n    'R5cGUYAiABKA4yKi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5DYW1wdXNSZXFGcm9tVHlwZVII'\n    'ZnJvbVR5cGU=');\n\n@$core.Deprecated('Use campusShowTabInfoDescriptor instead')\nconst CampusShowTabInfo$json = {\n  '1': 'CampusShowTabInfo',\n  '2': [\n    {'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'url', '3': 2, '4': 1, '5': 9, '10': 'url'},\n    {\n      '1': 'type',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CampusTabType',\n      '10': 'type'\n    },\n    {'1': 'red_dot', '3': 4, '4': 1, '5': 5, '10': 'redDot'},\n    {'1': 'icon_url', '3': 5, '4': 1, '5': 9, '10': 'iconUrl'},\n  ],\n};\n\n/// Descriptor for `CampusShowTabInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusShowTabInfoDescriptor = $convert.base64Decode(\n    'ChFDYW1wdXNTaG93VGFiSW5mbxISCgRuYW1lGAEgASgJUgRuYW1lEhAKA3VybBgCIAEoCVIDdX'\n    'JsEjoKBHR5cGUYAyABKA4yJi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5DYW1wdXNUYWJUeXBl'\n    'UgR0eXBlEhcKB3JlZF9kb3QYBCABKAVSBnJlZERvdBIZCghpY29uX3VybBgFIAEoCVIHaWNvbl'\n    'VybA==');\n\n@$core.Deprecated('Use campusSquareReplyDescriptor instead')\nconst CampusSquareReply$json = {\n  '1': 'CampusSquareReply',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'list',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.RcmdCampusBrief',\n      '10': 'list'\n    },\n    {\n      '1': 'button',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusLabel',\n      '10': 'button'\n    },\n  ],\n};\n\n/// Descriptor for `CampusSquareReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusSquareReplyDescriptor = $convert.base64Decode(\n    'ChFDYW1wdXNTcXVhcmVSZXBseRIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSPAoEbGlzdBgCIAMoCz'\n    'IoLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlJjbWRDYW1wdXNCcmllZlIEbGlzdBI8CgZidXR0'\n    'b24YAyABKAsyJC5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5DYW1wdXNMYWJlbFIGYnV0dG9u');\n\n@$core.Deprecated('Use campusSquareReqDescriptor instead')\nconst CampusSquareReq$json = {\n  '1': 'CampusSquareReq',\n  '2': [\n    {'1': 'campus_id', '3': 1, '4': 1, '5': 3, '10': 'campusId'},\n    {'1': 'lat', '3': 2, '4': 1, '5': 1, '10': 'lat'},\n    {'1': 'lng', '3': 3, '4': 1, '5': 1, '10': 'lng'},\n  ],\n};\n\n/// Descriptor for `CampusSquareReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusSquareReqDescriptor = $convert.base64Decode(\n    'Cg9DYW1wdXNTcXVhcmVSZXESGwoJY2FtcHVzX2lkGAEgASgDUghjYW1wdXNJZBIQCgNsYXQYAi'\n    'ABKAFSA2xhdBIQCgNsbmcYAyABKAFSA2xuZw==');\n\n@$core.Deprecated('Use campusTopDescriptor instead')\nconst CampusTop$json = {\n  '1': 'CampusTop',\n  '2': [\n    {'1': 'campus_id', '3': 1, '4': 1, '5': 3, '10': 'campusId'},\n    {'1': 'campus_name', '3': 2, '4': 1, '5': 9, '10': 'campusName'},\n    {\n      '1': 'tabs',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusShowTabInfo',\n      '10': 'tabs'\n    },\n    {\n      '1': 'switch_label',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusLabel',\n      '10': 'switchLabel'\n    },\n    {'1': 'title', '3': 5, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'banner',\n      '3': 6,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusBannerInfo',\n      '10': 'banner'\n    },\n    {\n      '1': 'invite_label',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusLabel',\n      '10': 'inviteLabel'\n    },\n    {\n      '1': 'notice',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusNoticeInfo',\n      '10': 'notice'\n    },\n    {\n      '1': 'topic_square',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.TopicSquareInfo',\n      '10': 'topicSquare'\n    },\n    {'1': 'campus_badge', '3': 10, '4': 1, '5': 9, '10': 'campusBadge'},\n    {\n      '1': 'campus_background',\n      '3': 11,\n      '4': 1,\n      '5': 9,\n      '10': 'campusBackground'\n    },\n    {'1': 'campus_motto', '3': 12, '4': 1, '5': 9, '10': 'campusMotto'},\n    {\n      '1': 'mng_entry',\n      '3': 13,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusLabel',\n      '10': 'mngEntry'\n    },\n    {'1': 'campus_intro', '3': 14, '4': 1, '5': 9, '10': 'campusIntro'},\n    {'1': 'campus_name_link', '3': 15, '4': 1, '5': 9, '10': 'campusNameLink'},\n    {'1': 'bottom_left_text', '3': 16, '4': 1, '5': 9, '10': 'bottomLeftText'},\n  ],\n};\n\n/// Descriptor for `CampusTop`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusTopDescriptor = $convert.base64Decode(\n    'CglDYW1wdXNUb3ASGwoJY2FtcHVzX2lkGAEgASgDUghjYW1wdXNJZBIfCgtjYW1wdXNfbmFtZR'\n    'gCIAEoCVIKY2FtcHVzTmFtZRI+CgR0YWJzGAMgAygLMiouYmlsaWJpbGkuYXBwLmR5bmFtaWMu'\n    'djIuQ2FtcHVzU2hvd1RhYkluZm9SBHRhYnMSRwoMc3dpdGNoX2xhYmVsGAQgASgLMiQuYmlsaW'\n    'JpbGkuYXBwLmR5bmFtaWMudjIuQ2FtcHVzTGFiZWxSC3N3aXRjaExhYmVsEhQKBXRpdGxlGAUg'\n    'ASgJUgV0aXRsZRJBCgZiYW5uZXIYBiADKAsyKS5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5DYW'\n    '1wdXNCYW5uZXJJbmZvUgZiYW5uZXISRwoMaW52aXRlX2xhYmVsGAcgASgLMiQuYmlsaWJpbGku'\n    'YXBwLmR5bmFtaWMudjIuQ2FtcHVzTGFiZWxSC2ludml0ZUxhYmVsEkEKBm5vdGljZRgIIAEoCz'\n    'IpLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkNhbXB1c05vdGljZUluZm9SBm5vdGljZRJLCgx0'\n    'b3BpY19zcXVhcmUYCSABKAsyKC5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5Ub3BpY1NxdWFyZU'\n    'luZm9SC3RvcGljU3F1YXJlEiEKDGNhbXB1c19iYWRnZRgKIAEoCVILY2FtcHVzQmFkZ2USKwoR'\n    'Y2FtcHVzX2JhY2tncm91bmQYCyABKAlSEGNhbXB1c0JhY2tncm91bmQSIQoMY2FtcHVzX21vdH'\n    'RvGAwgASgJUgtjYW1wdXNNb3R0bxJBCgltbmdfZW50cnkYDSABKAsyJC5iaWxpYmlsaS5hcHAu'\n    'ZHluYW1pYy52Mi5DYW1wdXNMYWJlbFIIbW5nRW50cnkSIQoMY2FtcHVzX2ludHJvGA4gASgJUg'\n    'tjYW1wdXNJbnRybxIoChBjYW1wdXNfbmFtZV9saW5rGA8gASgJUg5jYW1wdXNOYW1lTGluaxIo'\n    'ChBib3R0b21fbGVmdF90ZXh0GBAgASgJUg5ib3R0b21MZWZ0VGV4dA==');\n\n@$core.Deprecated('Use campusTopicRcmdFeedReplyDescriptor instead')\nconst CampusTopicRcmdFeedReply$json = {\n  '1': 'CampusTopicRcmdFeedReply',\n  '2': [\n    {\n      '1': 'list',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynamicItem',\n      '10': 'list'\n    },\n    {'1': 'toast', '3': 2, '4': 1, '5': 9, '10': 'toast'},\n    {'1': 'has_more', '3': 3, '4': 1, '5': 8, '10': 'hasMore'},\n    {'1': 'offset', '3': 4, '4': 1, '5': 9, '10': 'offset'},\n    {\n      '1': 'join_discuss',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.IconButton',\n      '10': 'joinDiscuss'\n    },\n  ],\n};\n\n/// Descriptor for `CampusTopicRcmdFeedReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusTopicRcmdFeedReplyDescriptor = $convert.base64Decode(\n    'ChhDYW1wdXNUb3BpY1JjbWRGZWVkUmVwbHkSOAoEbGlzdBgBIAMoCzIkLmJpbGliaWxpLmFwcC'\n    '5keW5hbWljLnYyLkR5bmFtaWNJdGVtUgRsaXN0EhQKBXRvYXN0GAIgASgJUgV0b2FzdBIZCgho'\n    'YXNfbW9yZRgDIAEoCFIHaGFzTW9yZRIWCgZvZmZzZXQYBCABKAlSBm9mZnNldBJGCgxqb2luX2'\n    'Rpc2N1c3MYBSABKAsyIy5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5JY29uQnV0dG9uUgtqb2lu'\n    'RGlzY3Vzcw==');\n\n@$core.Deprecated('Use campusTopicRcmdFeedReqDescriptor instead')\nconst CampusTopicRcmdFeedReq$json = {\n  '1': 'CampusTopicRcmdFeedReq',\n  '2': [\n    {'1': 'campus_id', '3': 1, '4': 1, '5': 3, '10': 'campusId'},\n    {'1': 'offset', '3': 2, '4': 1, '5': 9, '10': 'offset'},\n    {\n      '1': 'player_args',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n    {'1': 'local_time', '3': 4, '4': 1, '5': 5, '10': 'localTime'},\n    {\n      '1': 'from_type',\n      '3': 5,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CampusReqFromType',\n      '10': 'fromType'\n    },\n  ],\n};\n\n/// Descriptor for `CampusTopicRcmdFeedReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusTopicRcmdFeedReqDescriptor = $convert.base64Decode(\n    'ChZDYW1wdXNUb3BpY1JjbWRGZWVkUmVxEhsKCWNhbXB1c19pZBgBIAEoA1IIY2FtcHVzSWQSFg'\n    'oGb2Zmc2V0GAIgASgJUgZvZmZzZXQSTwoLcGxheWVyX2FyZ3MYAyABKAsyLi5iaWxpYmlsaS5h'\n    'cHAuYXJjaGl2ZS5taWRkbGV3YXJlLnYxLlBsYXllckFyZ3NSCnBsYXllckFyZ3MSHQoKbG9jYW'\n    'xfdGltZRgEIAEoBVIJbG9jYWxUaW1lEkcKCWZyb21fdHlwZRgFIAEoDjIqLmJpbGliaWxpLmFw'\n    'cC5keW5hbWljLnYyLkNhbXB1c1JlcUZyb21UeXBlUghmcm9tVHlwZQ==');\n\n@$core.Deprecated('Use campusWaterFlowItemDescriptor instead')\nconst CampusWaterFlowItem$json = {\n  '1': 'CampusWaterFlowItem',\n  '2': [\n    {\n      '1': 'item_default',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.WFItemDefault',\n      '9': 0,\n      '10': 'itemDefault'\n    },\n    {\n      '1': 'item_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.WFItemType',\n      '10': 'itemType'\n    },\n    {\n      '1': 'wh_ratio',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.common.ItemWHRatio',\n      '10': 'whRatio'\n    },\n  ],\n  '8': [\n    {'1': 'flow_item'},\n  ],\n};\n\n/// Descriptor for `CampusWaterFlowItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List campusWaterFlowItemDescriptor = $convert.base64Decode(\n    'ChNDYW1wdXNXYXRlckZsb3dJdGVtEksKDGl0ZW1fZGVmYXVsdBgDIAEoCzImLmJpbGliaWxpLm'\n    'FwcC5keW5hbWljLnYyLldGSXRlbURlZmF1bHRIAFILaXRlbURlZmF1bHQSQAoJaXRlbV90eXBl'\n    'GAEgASgOMiMuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuV0ZJdGVtVHlwZVIIaXRlbVR5cGUSQw'\n    'oId2hfcmF0aW8YAiABKAsyKC5iaWxpYmlsaS5hcHAuZHluYW1pYy5jb21tb24uSXRlbVdIUmF0'\n    'aW9SB3doUmF0aW9CCwoJZmxvd19pdGVt');\n\n@$core.Deprecated('Use cardParagraphDescriptor instead')\nconst CardParagraph$json = {\n  '1': 'CardParagraph',\n  '2': [\n    {\n      '1': 'additional_card',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleAdditional',\n      '10': 'additionalCard'\n    },\n    {\n      '1': 'biz_type',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.LinkNodeType',\n      '10': 'bizType'\n    },\n    {'1': 'biz_id', '3': 3, '4': 1, '5': 9, '10': 'bizId'},\n  ],\n};\n\n/// Descriptor for `CardParagraph`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cardParagraphDescriptor = $convert.base64Decode(\n    'Cg1DYXJkUGFyYWdyYXBoElIKD2FkZGl0aW9uYWxfY2FyZBgBIAEoCzIpLmJpbGliaWxpLmFwcC'\n    '5keW5hbWljLnYyLk1vZHVsZUFkZGl0aW9uYWxSDmFkZGl0aW9uYWxDYXJkEkAKCGJpel90eXBl'\n    'GAIgASgOMiUuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuTGlua05vZGVUeXBlUgdiaXpUeXBlEh'\n    'UKBmJpel9pZBgDIAEoCVIFYml6SWQ=');\n\n@$core.Deprecated('Use cardVideoDynListDescriptor instead')\nconst CardVideoDynList$json = {\n  '1': 'CardVideoDynList',\n  '2': [\n    {\n      '1': 'list',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynamicItem',\n      '10': 'list'\n    },\n    {'1': 'update_num', '3': 2, '4': 1, '5': 3, '10': 'updateNum'},\n    {'1': 'history_offset', '3': 3, '4': 1, '5': 9, '10': 'historyOffset'},\n    {'1': 'update_baseline', '3': 4, '4': 1, '5': 9, '10': 'updateBaseline'},\n    {'1': 'has_more', '3': 5, '4': 1, '5': 8, '10': 'hasMore'},\n  ],\n};\n\n/// Descriptor for `CardVideoDynList`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cardVideoDynListDescriptor = $convert.base64Decode(\n    'ChBDYXJkVmlkZW9EeW5MaXN0EjgKBGxpc3QYASADKAsyJC5iaWxpYmlsaS5hcHAuZHluYW1pYy'\n    '52Mi5EeW5hbWljSXRlbVIEbGlzdBIdCgp1cGRhdGVfbnVtGAIgASgDUgl1cGRhdGVOdW0SJQoO'\n    'aGlzdG9yeV9vZmZzZXQYAyABKAlSDWhpc3RvcnlPZmZzZXQSJwoPdXBkYXRlX2Jhc2VsaW5lGA'\n    'QgASgJUg51cGRhdGVCYXNlbGluZRIZCghoYXNfbW9yZRgFIAEoCFIHaGFzTW9yZQ==');\n\n@$core.Deprecated('Use cardVideoFollowListDescriptor instead')\nconst CardVideoFollowList$json = {\n  '1': 'CardVideoFollowList',\n  '2': [\n    {'1': 'view_all_link', '3': 1, '4': 1, '5': 9, '10': 'viewAllLink'},\n    {\n      '1': 'list',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.FollowListItem',\n      '10': 'list'\n    },\n  ],\n};\n\n/// Descriptor for `CardVideoFollowList`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cardVideoFollowListDescriptor = $convert.base64Decode(\n    'ChNDYXJkVmlkZW9Gb2xsb3dMaXN0EiIKDXZpZXdfYWxsX2xpbmsYASABKAlSC3ZpZXdBbGxMaW'\n    '5rEjsKBGxpc3QYAiADKAsyJy5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5Gb2xsb3dMaXN0SXRl'\n    'bVIEbGlzdA==');\n\n@$core.Deprecated('Use cardVideoUpListDescriptor instead')\nconst CardVideoUpList$json = {\n  '1': 'CardVideoUpList',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'list',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.UpListItem',\n      '10': 'list'\n    },\n    {'1': 'footprint', '3': 3, '4': 1, '5': 9, '10': 'footprint'},\n    {'1': 'show_live_num', '3': 4, '4': 1, '5': 5, '10': 'showLiveNum'},\n    {\n      '1': 'more_label',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.UpListMoreLabel',\n      '10': 'moreLabel'\n    },\n    {'1': 'title_switch', '3': 6, '4': 1, '5': 5, '10': 'titleSwitch'},\n    {'1': 'show_more_label', '3': 7, '4': 1, '5': 8, '10': 'showMoreLabel'},\n    {'1': 'show_in_personal', '3': 8, '4': 1, '5': 8, '10': 'showInPersonal'},\n    {'1': 'show_more_button', '3': 9, '4': 1, '5': 8, '10': 'showMoreButton'},\n    {\n      '1': 'list_second',\n      '3': 10,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.UpListItem',\n      '10': 'listSecond'\n    },\n    {'1': 'has_more_list', '3': 11, '4': 1, '5': 8, '10': 'hasMoreList'},\n    {'1': 'more_list_offset', '3': 12, '4': 1, '5': 9, '10': 'moreListOffset'},\n  ],\n};\n\n/// Descriptor for `CardVideoUpList`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cardVideoUpListDescriptor = $convert.base64Decode(\n    'Cg9DYXJkVmlkZW9VcExpc3QSFAoFdGl0bGUYASABKAlSBXRpdGxlEjcKBGxpc3QYAiADKAsyIy'\n    '5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5VcExpc3RJdGVtUgRsaXN0EhwKCWZvb3RwcmludBgD'\n    'IAEoCVIJZm9vdHByaW50EiIKDXNob3dfbGl2ZV9udW0YBCABKAVSC3Nob3dMaXZlTnVtEkcKCm'\n    '1vcmVfbGFiZWwYBSABKAsyKC5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5VcExpc3RNb3JlTGFi'\n    'ZWxSCW1vcmVMYWJlbBIhCgx0aXRsZV9zd2l0Y2gYBiABKAVSC3RpdGxlU3dpdGNoEiYKD3Nob3'\n    'dfbW9yZV9sYWJlbBgHIAEoCFINc2hvd01vcmVMYWJlbBIoChBzaG93X2luX3BlcnNvbmFsGAgg'\n    'ASgIUg5zaG93SW5QZXJzb25hbBIoChBzaG93X21vcmVfYnV0dG9uGAkgASgIUg5zaG93TW9yZU'\n    'J1dHRvbhJECgtsaXN0X3NlY29uZBgKIAMoCzIjLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlVw'\n    'TGlzdEl0ZW1SCmxpc3RTZWNvbmQSIgoNaGFzX21vcmVfbGlzdBgLIAEoCFILaGFzTW9yZUxpc3'\n    'QSKAoQbW9yZV9saXN0X29mZnNldBgMIAEoCVIObW9yZUxpc3RPZmZzZXQ=');\n\n@$core.Deprecated('Use channelInfoDescriptor instead')\nconst ChannelInfo$json = {\n  '1': 'ChannelInfo',\n  '2': [\n    {'1': 'channel_id', '3': 1, '4': 1, '5': 3, '10': 'channelId'},\n    {'1': 'channel_name', '3': 2, '4': 1, '5': 9, '10': 'channelName'},\n    {'1': 'desc', '3': 3, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'is_atten', '3': 4, '4': 1, '5': 8, '10': 'isAtten'},\n    {'1': 'type_icon', '3': 5, '4': 1, '5': 9, '10': 'typeIcon'},\n    {\n      '1': 'items',\n      '3': 6,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.RcmdItem',\n      '10': 'items'\n    },\n    {'1': 'icon', '3': 7, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'jump_uri', '3': 8, '4': 1, '5': 9, '10': 'jumpUri'},\n  ],\n};\n\n/// Descriptor for `ChannelInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List channelInfoDescriptor = $convert.base64Decode(\n    'CgtDaGFubmVsSW5mbxIdCgpjaGFubmVsX2lkGAEgASgDUgljaGFubmVsSWQSIQoMY2hhbm5lbF'\n    '9uYW1lGAIgASgJUgtjaGFubmVsTmFtZRISCgRkZXNjGAMgASgJUgRkZXNjEhkKCGlzX2F0dGVu'\n    'GAQgASgIUgdpc0F0dGVuEhsKCXR5cGVfaWNvbhgFIAEoCVIIdHlwZUljb24SNwoFaXRlbXMYBi'\n    'ADKAsyIS5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5SY21kSXRlbVIFaXRlbXMSEgoEaWNvbhgH'\n    'IAEoCVIEaWNvbhIZCghqdW1wX3VyaRgIIAEoCVIHanVtcFVyaQ==');\n\n@$core.Deprecated('Use cmtShowItemDescriptor instead')\nconst CmtShowItem$json = {\n  '1': 'CmtShowItem',\n  '2': [\n    {'1': 'uid', '3': 1, '4': 1, '5': 3, '10': 'uid'},\n    {'1': 'uname', '3': 2, '4': 1, '5': 9, '10': 'uname'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'comment', '3': 4, '4': 1, '5': 9, '10': 'comment'},\n  ],\n};\n\n/// Descriptor for `CmtShowItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cmtShowItemDescriptor = $convert.base64Decode(\n    'CgtDbXRTaG93SXRlbRIQCgN1aWQYASABKANSA3VpZBIUCgV1bmFtZRgCIAEoCVIFdW5hbWUSEA'\n    'oDdXJpGAMgASgJUgN1cmkSGAoHY29tbWVudBgEIAEoCVIHY29tbWVudA==');\n\n@$core.Deprecated('Use codeParagraphDescriptor instead')\nconst CodeParagraph$json = {\n  '1': 'CodeParagraph',\n  '2': [\n    {'1': 'code_lang', '3': 1, '4': 1, '5': 9, '10': 'codeLang'},\n    {'1': 'code_content', '3': 2, '4': 1, '5': 9, '10': 'codeContent'},\n    {'1': 'popup_link', '3': 3, '4': 1, '5': 9, '10': 'popupLink'},\n    {'1': 'bar_icon', '3': 4, '4': 1, '5': 9, '10': 'barIcon'},\n    {'1': 'bar_notice', '3': 5, '4': 1, '5': 9, '10': 'barNotice'},\n    {'1': 'btn_text', '3': 6, '4': 1, '5': 9, '10': 'btnText'},\n  ],\n};\n\n/// Descriptor for `CodeParagraph`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List codeParagraphDescriptor = $convert.base64Decode(\n    'Cg1Db2RlUGFyYWdyYXBoEhsKCWNvZGVfbGFuZxgBIAEoCVIIY29kZUxhbmcSIQoMY29kZV9jb2'\n    '50ZW50GAIgASgJUgtjb2RlQ29udGVudBIdCgpwb3B1cF9saW5rGAMgASgJUglwb3B1cExpbmsS'\n    'GQoIYmFyX2ljb24YBCABKAlSB2Jhckljb24SHQoKYmFyX25vdGljZRgFIAEoCVIJYmFyTm90aW'\n    'NlEhkKCGJ0bl90ZXh0GAYgASgJUgdidG5UZXh0');\n\n@$core.Deprecated('Use coloredTextDescriptor instead')\nconst ColoredText$json = {\n  '1': 'ColoredText',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {\n      '1': 'color',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Colors',\n      '10': 'color'\n    },\n  ],\n};\n\n/// Descriptor for `ColoredText`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List coloredTextDescriptor = $convert.base64Decode(\n    'CgtDb2xvcmVkVGV4dBISCgR0ZXh0GAEgASgJUgR0ZXh0EjUKBWNvbG9yGAIgASgLMh8uYmlsaW'\n    'JpbGkuYXBwLmR5bmFtaWMudjIuQ29sb3JzUgVjb2xvcg==');\n\n@$core.Deprecated('Use colorsDescriptor instead')\nconst Colors$json = {\n  '1': 'Colors',\n  '2': [\n    {'1': 'color_day', '3': 1, '4': 1, '5': 9, '10': 'colorDay'},\n    {'1': 'color_night', '3': 2, '4': 1, '5': 9, '10': 'colorNight'},\n  ],\n};\n\n/// Descriptor for `Colors`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List colorsDescriptor = $convert.base64Decode(\n    'CgZDb2xvcnMSGwoJY29sb3JfZGF5GAEgASgJUghjb2xvckRheRIfCgtjb2xvcl9uaWdodBgCIA'\n    'EoCVIKY29sb3JOaWdodA==');\n\n@$core.Deprecated('Use commentDetailDescriptor instead')\nconst CommentDetail$json = {\n  '1': 'CommentDetail',\n  '2': [\n    {'1': 'can_modify', '3': 1, '4': 1, '5': 8, '10': 'canModify'},\n    {'1': 'status', '3': 2, '4': 1, '5': 3, '10': 'status'},\n  ],\n};\n\n/// Descriptor for `CommentDetail`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List commentDetailDescriptor = $convert.base64Decode(\n    'Cg1Db21tZW50RGV0YWlsEh0KCmNhbl9tb2RpZnkYASABKAhSCWNhbk1vZGlmeRIWCgZzdGF0dX'\n    'MYAiABKANSBnN0YXR1cw==');\n\n@$core.Deprecated('Use commonShareCardInfoDescriptor instead')\nconst CommonShareCardInfo$json = {\n  '1': 'CommonShareCardInfo',\n  '2': [\n    {'1': 'sketch_id', '3': 1, '4': 1, '5': 3, '10': 'sketchId'},\n    {'1': 'biz_type', '3': 2, '4': 1, '5': 3, '10': 'bizType'},\n    {'1': 'biz_id', '3': 3, '4': 1, '5': 3, '10': 'bizId'},\n  ],\n};\n\n/// Descriptor for `CommonShareCardInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List commonShareCardInfoDescriptor = $convert.base64Decode(\n    'ChNDb21tb25TaGFyZUNhcmRJbmZvEhsKCXNrZXRjaF9pZBgBIAEoA1IIc2tldGNoSWQSGQoIYm'\n    'l6X3R5cGUYAiABKANSB2JpelR5cGUSFQoGYml6X2lkGAMgASgDUgViaXpJZA==');\n\n@$core.Deprecated('Use configDescriptor instead')\nconst Config$json = {\n  '1': 'Config',\n  '2': [\n    {\n      '1': 'story_vertical_exp',\n      '3': 1,\n      '4': 1,\n      '5': 8,\n      '10': 'storyVerticalExp'\n    },\n    {'1': 'detail_view_bits', '3': 2, '4': 1, '5': 3, '10': 'detailViewBits'},\n    {\n      '1': 'extra_router_kvs',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Config.ExtraRouterKvsEntry',\n      '10': 'extraRouterKvs'\n    },\n  ],\n  '3': [Config_ExtraRouterKvsEntry$json],\n};\n\n@$core.Deprecated('Use configDescriptor instead')\nconst Config_ExtraRouterKvsEntry$json = {\n  '1': 'ExtraRouterKvsEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `Config`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List configDescriptor = $convert.base64Decode(\n    'CgZDb25maWcSLAoSc3RvcnlfdmVydGljYWxfZXhwGAEgASgIUhBzdG9yeVZlcnRpY2FsRXhwEi'\n    'gKEGRldGFpbF92aWV3X2JpdHMYAiABKANSDmRldGFpbFZpZXdCaXRzEl0KEGV4dHJhX3JvdXRl'\n    'cl9rdnMYAyADKAsyMy5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5Db25maWcuRXh0cmFSb3V0ZX'\n    'JLdnNFbnRyeVIOZXh0cmFSb3V0ZXJLdnMaQQoTRXh0cmFSb3V0ZXJLdnNFbnRyeRIQCgNrZXkY'\n    'ASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgB');\n\n@$core.Deprecated('Use cooperationStaffListReqDescriptor instead')\nconst CooperationStaffListReq$json = {\n  '1': 'CooperationStaffListReq',\n  '2': [\n    {'1': 'oid', '3': 1, '4': 1, '5': 9, '10': 'oid'},\n  ],\n};\n\n/// Descriptor for `CooperationStaffListReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cooperationStaffListReqDescriptor =\n    $convert.base64Decode(\n        'ChdDb29wZXJhdGlvblN0YWZmTGlzdFJlcRIQCgNvaWQYASABKAlSA29pZA==');\n\n@$core.Deprecated('Use cooperationStaffListRespDescriptor instead')\nconst CooperationStaffListResp$json = {\n  '1': 'CooperationStaffListResp',\n  '2': [\n    {\n      '1': 'up_list',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CooperationUpInfo',\n      '10': 'upList'\n    },\n  ],\n};\n\n/// Descriptor for `CooperationStaffListResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cooperationStaffListRespDescriptor =\n    $convert.base64Decode(\n        'ChhDb29wZXJhdGlvblN0YWZmTGlzdFJlc3ASQwoHdXBfbGlzdBgBIAMoCzIqLmJpbGliaWxpLm'\n        'FwcC5keW5hbWljLnYyLkNvb3BlcmF0aW9uVXBJbmZvUgZ1cExpc3Q=');\n\n@$core.Deprecated('Use cooperationUpInfoDescriptor instead')\nconst CooperationUpInfo$json = {\n  '1': 'CooperationUpInfo',\n  '2': [\n    {\n      '1': 'user_info',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.BasicUserInfoV2',\n      '10': 'userInfo'\n    },\n    {'1': 'up_role', '3': 2, '4': 1, '5': 9, '10': 'upRole'},\n  ],\n};\n\n/// Descriptor for `CooperationUpInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cooperationUpInfoDescriptor = $convert.base64Decode(\n    'ChFDb29wZXJhdGlvblVwSW5mbxJFCgl1c2VyX2luZm8YASABKAsyKC5iaWxpYmlsaS5hcHAuZH'\n    'luYW1pYy52Mi5CYXNpY1VzZXJJbmZvVjJSCHVzZXJJbmZvEhcKB3VwX3JvbGUYAiABKAlSBnVw'\n    'Um9sZQ==');\n\n@$core.Deprecated('Use coverIconWithTextDescriptor instead')\nconst CoverIconWithText$json = {\n  '1': 'CoverIconWithText',\n  '2': [\n    {\n      '1': 'icon',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CoverIcon',\n      '10': 'icon'\n    },\n    {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'icon_checked', '3': 3, '4': 1, '5': 8, '10': 'iconChecked'},\n  ],\n};\n\n/// Descriptor for `CoverIconWithText`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List coverIconWithTextDescriptor = $convert.base64Decode(\n    'ChFDb3Zlckljb25XaXRoVGV4dBI2CgRpY29uGAEgASgOMiIuYmlsaWJpbGkuYXBwLmR5bmFtaW'\n    'MudjIuQ292ZXJJY29uUgRpY29uEhIKBHRleHQYAiABKAlSBHRleHQSIQoMaWNvbl9jaGVja2Vk'\n    'GAMgASgIUgtpY29uQ2hlY2tlZA==');\n\n@$core.Deprecated('Use creationClassificationDescriptor instead')\nconst CreationClassification$json = {\n  '1': 'CreationClassification',\n  '2': [\n    {\n      '1': 'classification_name',\n      '3': 1,\n      '4': 1,\n      '5': 9,\n      '10': 'classificationName'\n    },\n    {'1': 'count', '3': 2, '4': 1, '5': 3, '10': 'count'},\n    {\n      '1': 'classification_type',\n      '3': 3,\n      '4': 1,\n      '5': 9,\n      '10': 'classificationType'\n    },\n    {'1': 'is_chosen', '3': 4, '4': 1, '5': 8, '10': 'isChosen'},\n  ],\n};\n\n/// Descriptor for `CreationClassification`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List creationClassificationDescriptor = $convert.base64Decode(\n    'ChZDcmVhdGlvbkNsYXNzaWZpY2F0aW9uEi8KE2NsYXNzaWZpY2F0aW9uX25hbWUYASABKAlSEm'\n    'NsYXNzaWZpY2F0aW9uTmFtZRIUCgVjb3VudBgCIAEoA1IFY291bnQSLwoTY2xhc3NpZmljYXRp'\n    'b25fdHlwZRgDIAEoCVISY2xhc3NpZmljYXRpb25UeXBlEhsKCWlzX2Nob3NlbhgEIAEoCFIIaX'\n    'NDaG9zZW4=');\n\n@$core.Deprecated('Use creationItemActionDescriptor instead')\nconst CreationItemAction$json = {\n  '1': 'CreationItemAction',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'action_name', '3': 2, '4': 1, '5': 9, '10': 'actionName'},\n    {\n      '1': 'action_type',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CreationItemAction.CreationAction',\n      '10': 'actionType'\n    },\n    {'1': 'jump_url', '3': 4, '4': 1, '5': 9, '10': 'jumpUrl'},\n    {'1': 'remain_edit_times', '3': 5, '4': 1, '5': 3, '10': 'remainEditTimes'},\n    {\n      '1': 'confirmation_toast',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ThreePointDefaultToast',\n      '10': 'confirmationToast'\n    },\n    {\n      '1': 'visibility_change',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ThreePointVisibilityChange',\n      '10': 'visibilityChange'\n    },\n  ],\n  '4': [CreationItemAction_CreationAction$json],\n};\n\n@$core.Deprecated('Use creationItemActionDescriptor instead')\nconst CreationItemAction_CreationAction$json = {\n  '1': 'CreationAction',\n  '2': [\n    {'1': 'CREATION_ACTION_INVALID', '2': 0},\n    {'1': 'CREATION_ACTION_DELETE', '2': 1},\n    {'1': 'CREATION_ACTION_EDIT_DYN', '2': 2},\n    {'1': 'CREATION_ACTION_JUMP_URL', '2': 3},\n    {'1': 'CREATION_ACTION_RETRACT_CV', '2': 4},\n    {'1': 'CREATION_ACTION_EDIT_CV', '2': 5},\n    {'1': 'CREATION_ACTION_VISIBILITY_CHANGE', '2': 6},\n  ],\n};\n\n/// Descriptor for `CreationItemAction`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List creationItemActionDescriptor = $convert.base64Decode(\n    'ChJDcmVhdGlvbkl0ZW1BY3Rpb24SEgoEaWNvbhgBIAEoCVIEaWNvbhIfCgthY3Rpb25fbmFtZR'\n    'gCIAEoCVIKYWN0aW9uTmFtZRJbCgthY3Rpb25fdHlwZRgDIAEoDjI6LmJpbGliaWxpLmFwcC5k'\n    'eW5hbWljLnYyLkNyZWF0aW9uSXRlbUFjdGlvbi5DcmVhdGlvbkFjdGlvblIKYWN0aW9uVHlwZR'\n    'IZCghqdW1wX3VybBgEIAEoCVIHanVtcFVybBIqChFyZW1haW5fZWRpdF90aW1lcxgFIAEoA1IP'\n    'cmVtYWluRWRpdFRpbWVzEl4KEmNvbmZpcm1hdGlvbl90b2FzdBgGIAEoCzIvLmJpbGliaWxpLm'\n    'FwcC5keW5hbWljLnYyLlRocmVlUG9pbnREZWZhdWx0VG9hc3RSEWNvbmZpcm1hdGlvblRvYXN0'\n    'EmAKEXZpc2liaWxpdHlfY2hhbmdlGAcgASgLMjMuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuVG'\n    'hyZWVQb2ludFZpc2liaWxpdHlDaGFuZ2VSEHZpc2liaWxpdHlDaGFuZ2Ui6QEKDkNyZWF0aW9u'\n    'QWN0aW9uEhsKF0NSRUFUSU9OX0FDVElPTl9JTlZBTElEEAASGgoWQ1JFQVRJT05fQUNUSU9OX0'\n    'RFTEVURRABEhwKGENSRUFUSU9OX0FDVElPTl9FRElUX0RZThACEhwKGENSRUFUSU9OX0FDVElP'\n    'Tl9KVU1QX1VSTBADEh4KGkNSRUFUSU9OX0FDVElPTl9SRVRSQUNUX0NWEAQSGwoXQ1JFQVRJT0'\n    '5fQUNUSU9OX0VESVRfQ1YQBRIlCiFDUkVBVElPTl9BQ1RJT05fVklTSUJJTElUWV9DSEFOR0UQ'\n    'Bg==');\n\n@$core.Deprecated('Use creationSortTypeDescriptor instead')\nconst CreationSortType$json = {\n  '1': 'CreationSortType',\n  '2': [\n    {'1': 'sort_name', '3': 1, '4': 1, '5': 9, '10': 'sortName'},\n    {'1': 'sort_type', '3': 2, '4': 1, '5': 9, '10': 'sortType'},\n    {'1': 'is_chosen', '3': 3, '4': 1, '5': 8, '10': 'isChosen'},\n  ],\n};\n\n/// Descriptor for `CreationSortType`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List creationSortTypeDescriptor = $convert.base64Decode(\n    'ChBDcmVhdGlvblNvcnRUeXBlEhsKCXNvcnRfbmFtZRgBIAEoCVIIc29ydE5hbWUSGwoJc29ydF'\n    '90eXBlGAIgASgJUghzb3J0VHlwZRIbCglpc19jaG9zZW4YAyABKAhSCGlzQ2hvc2Vu');\n\n@$core.Deprecated('Use decoCardFanDescriptor instead')\nconst DecoCardFan$json = {\n  '1': 'DecoCardFan',\n  '2': [\n    {'1': 'is_fan', '3': 1, '4': 1, '5': 5, '10': 'isFan'},\n    {'1': 'number', '3': 2, '4': 1, '5': 5, '10': 'number'},\n    {'1': 'number_str', '3': 3, '4': 1, '5': 9, '10': 'numberStr'},\n    {'1': 'color', '3': 4, '4': 1, '5': 9, '10': 'color'},\n    {\n      '1': 'color_format',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DecoCardFanNumColorFormat',\n      '10': 'colorFormat'\n    },\n    {'1': 'num_prefix', '3': 6, '4': 1, '5': 9, '10': 'numPrefix'},\n  ],\n};\n\n/// Descriptor for `DecoCardFan`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List decoCardFanDescriptor = $convert.base64Decode(\n    'CgtEZWNvQ2FyZEZhbhIVCgZpc19mYW4YASABKAVSBWlzRmFuEhYKBm51bWJlchgCIAEoBVIGbn'\n    'VtYmVyEh0KCm51bWJlcl9zdHIYAyABKAlSCW51bWJlclN0chIUCgVjb2xvchgEIAEoCVIFY29s'\n    'b3ISVQoMY29sb3JfZm9ybWF0GAUgASgLMjIuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuRGVjb0'\n    'NhcmRGYW5OdW1Db2xvckZvcm1hdFILY29sb3JGb3JtYXQSHQoKbnVtX3ByZWZpeBgGIAEoCVIJ'\n    'bnVtUHJlZml4');\n\n@$core.Deprecated('Use decoCardFanNumColorFormatDescriptor instead')\nconst DecoCardFanNumColorFormat$json = {\n  '1': 'DecoCardFanNumColorFormat',\n  '2': [\n    {'1': 'start_point', '3': 1, '4': 1, '5': 9, '10': 'startPoint'},\n    {'1': 'end_point', '3': 2, '4': 1, '5': 9, '10': 'endPoint'},\n    {'1': 'colors', '3': 3, '4': 3, '5': 9, '10': 'colors'},\n    {'1': 'gradients', '3': 4, '4': 3, '5': 3, '10': 'gradients'},\n  ],\n};\n\n/// Descriptor for `DecoCardFanNumColorFormat`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List decoCardFanNumColorFormatDescriptor = $convert.base64Decode(\n    'ChlEZWNvQ2FyZEZhbk51bUNvbG9yRm9ybWF0Eh8KC3N0YXJ0X3BvaW50GAEgASgJUgpzdGFydF'\n    'BvaW50EhsKCWVuZF9wb2ludBgCIAEoCVIIZW5kUG9pbnQSFgoGY29sb3JzGAMgAygJUgZjb2xv'\n    'cnMSHAoJZ3JhZGllbnRzGAQgAygDUglncmFkaWVudHM=');\n\n@$core.Deprecated('Use decorateCardDescriptor instead')\nconst DecorateCard$json = {\n  '1': 'DecorateCard',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'card_url', '3': 2, '4': 1, '5': 9, '10': 'cardUrl'},\n    {'1': 'jump_url', '3': 3, '4': 1, '5': 9, '10': 'jumpUrl'},\n    {\n      '1': 'fan',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DecoCardFan',\n      '10': 'fan'\n    },\n    {\n      '1': 'vas_deco_card',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.vas.garb.service.UserCard',\n      '10': 'vasDecoCard'\n    },\n  ],\n};\n\n/// Descriptor for `DecorateCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List decorateCardDescriptor = $convert.base64Decode(\n    'CgxEZWNvcmF0ZUNhcmQSDgoCaWQYASABKANSAmlkEhkKCGNhcmRfdXJsGAIgASgJUgdjYXJkVX'\n    'JsEhkKCGp1bXBfdXJsGAMgASgJUgdqdW1wVXJsEjYKA2ZhbhgEIAEoCzIkLmJpbGliaWxpLmFw'\n    'cC5keW5hbWljLnYyLkRlY29DYXJkRmFuUgNmYW4SRwoNdmFzX2RlY29fY2FyZBgFIAEoCzIjLm'\n    'JpbGliaWxpLnZhcy5nYXJiLnNlcnZpY2UuVXNlckNhcmRSC3Zhc0RlY29DYXJk');\n\n@$core.Deprecated('Use descriptionDescriptor instead')\nconst Description$json = {\n  '1': 'Description',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {\n      '1': 'type',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.DescType',\n      '10': 'type'\n    },\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n    {\n      '1': 'emoji_type',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.EmojiType',\n      '10': 'emojiType'\n    },\n    {'1': 'goods_type', '3': 5, '4': 1, '5': 9, '10': 'goodsType'},\n    {'1': 'icon_url', '3': 6, '4': 1, '5': 9, '10': 'iconUrl'},\n    {'1': 'icon_name', '3': 7, '4': 1, '5': 9, '10': 'iconName'},\n    {'1': 'rid', '3': 8, '4': 1, '5': 9, '10': 'rid'},\n    {\n      '1': 'goods',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleDescGoods',\n      '10': 'goods'\n    },\n    {'1': 'orig_text', '3': 10, '4': 1, '5': 9, '10': 'origText'},\n    {'1': 'emoji_size', '3': 11, '4': 1, '5': 5, '10': 'emojiSize'},\n    {\n      '1': 'emoji_size_spec',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.EmojiSizeSpec',\n      '10': 'emojiSizeSpec'\n    },\n  ],\n};\n\n/// Descriptor for `Description`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List descriptionDescriptor = $convert.base64Decode(\n    'CgtEZXNjcmlwdGlvbhISCgR0ZXh0GAEgASgJUgR0ZXh0EjUKBHR5cGUYAiABKA4yIS5iaWxpYm'\n    'lsaS5hcHAuZHluYW1pYy52Mi5EZXNjVHlwZVIEdHlwZRIQCgN1cmkYAyABKAlSA3VyaRJBCgpl'\n    'bW9qaV90eXBlGAQgASgOMiIuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuRW1vamlUeXBlUgllbW'\n    '9qaVR5cGUSHQoKZ29vZHNfdHlwZRgFIAEoCVIJZ29vZHNUeXBlEhkKCGljb25fdXJsGAYgASgJ'\n    'UgdpY29uVXJsEhsKCWljb25fbmFtZRgHIAEoCVIIaWNvbk5hbWUSEAoDcmlkGAggASgJUgNyaW'\n    'QSPgoFZ29vZHMYCSABKAsyKC5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5Nb2R1bGVEZXNjR29v'\n    'ZHNSBWdvb2RzEhsKCW9yaWdfdGV4dBgKIAEoCVIIb3JpZ1RleHQSHQoKZW1vamlfc2l6ZRgLIA'\n    'EoBVIJZW1vamlTaXplEk4KD2Vtb2ppX3NpemVfc3BlYxgMIAEoCzImLmJpbGliaWxpLmFwcC5k'\n    'eW5hbWljLnYyLkVtb2ppU2l6ZVNwZWNSDWVtb2ppU2l6ZVNwZWM=');\n\n@$core.Deprecated('Use dimensionDescriptor instead')\nconst Dimension$json = {\n  '1': 'Dimension',\n  '2': [\n    {'1': 'height', '3': 1, '4': 1, '5': 3, '10': 'height'},\n    {'1': 'width', '3': 2, '4': 1, '5': 3, '10': 'width'},\n    {'1': 'rotate', '3': 3, '4': 1, '5': 3, '10': 'rotate'},\n    {'1': 'force_horizontal', '3': 4, '4': 1, '5': 8, '10': 'forceHorizontal'},\n  ],\n};\n\n/// Descriptor for `Dimension`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dimensionDescriptor = $convert.base64Decode(\n    'CglEaW1lbnNpb24SFgoGaGVpZ2h0GAEgASgDUgZoZWlnaHQSFAoFd2lkdGgYAiABKANSBXdpZH'\n    'RoEhYKBnJvdGF0ZRgDIAEoA1IGcm90YXRlEikKEGZvcmNlX2hvcml6b250YWwYBCABKAhSD2Zv'\n    'cmNlSG9yaXpvbnRhbA==');\n\n@$core.Deprecated('Use dynAdditionCommonFollowReplyDescriptor instead')\nconst DynAdditionCommonFollowReply$json = {\n  '1': 'DynAdditionCommonFollowReply',\n  '2': [\n    {\n      '1': 'status',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.AdditionalButtonStatus',\n      '10': 'status'\n    },\n  ],\n};\n\n/// Descriptor for `DynAdditionCommonFollowReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynAdditionCommonFollowReplyDescriptor =\n    $convert.base64Decode(\n        'ChxEeW5BZGRpdGlvbkNvbW1vbkZvbGxvd1JlcGx5EkcKBnN0YXR1cxgBIAEoDjIvLmJpbGliaW'\n        'xpLmFwcC5keW5hbWljLnYyLkFkZGl0aW9uYWxCdXR0b25TdGF0dXNSBnN0YXR1cw==');\n\n@$core.Deprecated('Use dynAdditionCommonFollowReqDescriptor instead')\nconst DynAdditionCommonFollowReq$json = {\n  '1': 'DynAdditionCommonFollowReq',\n  '2': [\n    {\n      '1': 'status',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.AdditionalButtonStatus',\n      '10': 'status'\n    },\n    {'1': 'dyn_id', '3': 2, '4': 1, '5': 9, '10': 'dynId'},\n    {'1': 'card_type', '3': 3, '4': 1, '5': 9, '10': 'cardType'},\n  ],\n};\n\n/// Descriptor for `DynAdditionCommonFollowReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynAdditionCommonFollowReqDescriptor =\n    $convert.base64Decode(\n        'ChpEeW5BZGRpdGlvbkNvbW1vbkZvbGxvd1JlcRJHCgZzdGF0dXMYASABKA4yLy5iaWxpYmlsaS'\n        '5hcHAuZHluYW1pYy52Mi5BZGRpdGlvbmFsQnV0dG9uU3RhdHVzUgZzdGF0dXMSFQoGZHluX2lk'\n        'GAIgASgJUgVkeW5JZBIbCgljYXJkX3R5cGUYAyABKAlSCGNhcmRUeXBl');\n\n@$core.Deprecated('Use dynAllPersonalReplyDescriptor instead')\nconst DynAllPersonalReply$json = {\n  '1': 'DynAllPersonalReply',\n  '2': [\n    {\n      '1': 'list',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynamicItem',\n      '10': 'list'\n    },\n    {'1': 'offset', '3': 2, '4': 1, '5': 9, '10': 'offset'},\n    {'1': 'has_more', '3': 3, '4': 1, '5': 8, '10': 'hasMore'},\n    {'1': 'read_offset', '3': 4, '4': 1, '5': 9, '10': 'readOffset'},\n    {\n      '1': 'relation',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Relation',\n      '10': 'relation'\n    },\n    {\n      '1': 'addition_up',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.TopAdditionUP',\n      '10': 'additionUp'\n    },\n    {'1': 'title', '3': 7, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'title_sub', '3': 8, '4': 1, '5': 9, '10': 'titleSub'},\n  ],\n};\n\n/// Descriptor for `DynAllPersonalReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynAllPersonalReplyDescriptor = $convert.base64Decode(\n    'ChNEeW5BbGxQZXJzb25hbFJlcGx5EjgKBGxpc3QYASADKAsyJC5iaWxpYmlsaS5hcHAuZHluYW'\n    '1pYy52Mi5EeW5hbWljSXRlbVIEbGlzdBIWCgZvZmZzZXQYAiABKAlSBm9mZnNldBIZCghoYXNf'\n    'bW9yZRgDIAEoCFIHaGFzTW9yZRIfCgtyZWFkX29mZnNldBgEIAEoCVIKcmVhZE9mZnNldBI9Cg'\n    'hyZWxhdGlvbhgFIAEoCzIhLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlJlbGF0aW9uUghyZWxh'\n    'dGlvbhJHCgthZGRpdGlvbl91cBgGIAEoCzImLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlRvcE'\n    'FkZGl0aW9uVVBSCmFkZGl0aW9uVXASFAoFdGl0bGUYByABKAlSBXRpdGxlEhsKCXRpdGxlX3N1'\n    'YhgIIAEoCVIIdGl0bGVTdWI=');\n\n@$core.Deprecated('Use dynAllPersonalReqDescriptor instead')\nconst DynAllPersonalReq$json = {\n  '1': 'DynAllPersonalReq',\n  '2': [\n    {'1': 'host_uid', '3': 1, '4': 1, '5': 3, '10': 'hostUid'},\n    {'1': 'offset', '3': 2, '4': 1, '5': 9, '10': 'offset'},\n    {'1': 'page', '3': 3, '4': 1, '5': 5, '10': 'page'},\n    {'1': 'is_preload', '3': 4, '4': 1, '5': 5, '10': 'isPreload'},\n    {\n      '1': 'playurl_param',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.PlayurlParam',\n      '10': 'playurlParam'\n    },\n    {'1': 'local_time', '3': 6, '4': 1, '5': 5, '10': 'localTime'},\n    {'1': 'footprint', '3': 7, '4': 1, '5': 9, '10': 'footprint'},\n    {'1': 'from', '3': 8, '4': 1, '5': 9, '10': 'from'},\n    {\n      '1': 'player_args',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n    {'1': 'personal_extra', '3': 10, '4': 1, '5': 9, '10': 'personalExtra'},\n    {\n      '1': 'ad_param',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdParam',\n      '10': 'adParam'\n    },\n  ],\n};\n\n/// Descriptor for `DynAllPersonalReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynAllPersonalReqDescriptor = $convert.base64Decode(\n    'ChFEeW5BbGxQZXJzb25hbFJlcRIZCghob3N0X3VpZBgBIAEoA1IHaG9zdFVpZBIWCgZvZmZzZX'\n    'QYAiABKAlSBm9mZnNldBISCgRwYWdlGAMgASgFUgRwYWdlEh0KCmlzX3ByZWxvYWQYBCABKAVS'\n    'CWlzUHJlbG9hZBJKCg1wbGF5dXJsX3BhcmFtGAUgASgLMiUuYmlsaWJpbGkuYXBwLmR5bmFtaW'\n    'MudjIuUGxheXVybFBhcmFtUgxwbGF5dXJsUGFyYW0SHQoKbG9jYWxfdGltZRgGIAEoBVIJbG9j'\n    'YWxUaW1lEhwKCWZvb3RwcmludBgHIAEoCVIJZm9vdHByaW50EhIKBGZyb20YCCABKAlSBGZyb2'\n    '0STwoLcGxheWVyX2FyZ3MYCSABKAsyLi5iaWxpYmlsaS5hcHAuYXJjaGl2ZS5taWRkbGV3YXJl'\n    'LnYxLlBsYXllckFyZ3NSCnBsYXllckFyZ3MSJQoOcGVyc29uYWxfZXh0cmEYCiABKAlSDXBlcn'\n    'NvbmFsRXh0cmESOwoIYWRfcGFyYW0YCyABKAsyIC5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5B'\n    'ZFBhcmFtUgdhZFBhcmFt');\n\n@$core.Deprecated('Use dynAllReplyDescriptor instead')\nconst DynAllReply$json = {\n  '1': 'DynAllReply',\n  '2': [\n    {\n      '1': 'dynamic_list',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynamicList',\n      '10': 'dynamicList'\n    },\n    {\n      '1': 'up_list',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CardVideoUpList',\n      '10': 'upList'\n    },\n    {\n      '1': 'topic_list',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.TopicList',\n      '10': 'topicList'\n    },\n    {\n      '1': 'unfollow',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Unfollow',\n      '10': 'unfollow'\n    },\n    {\n      '1': 'region_rcmd',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynRegionRcmd',\n      '10': 'regionRcmd'\n    },\n    {\n      '1': 'config',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Config',\n      '10': 'config'\n    },\n    {\n      '1': 'sort_config',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.FeedSortConfig',\n      '10': 'sortConfig'\n    },\n  ],\n};\n\n/// Descriptor for `DynAllReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynAllReplyDescriptor = $convert.base64Decode(\n    'CgtEeW5BbGxSZXBseRJHCgxkeW5hbWljX2xpc3QYASABKAsyJC5iaWxpYmlsaS5hcHAuZHluYW'\n    '1pYy52Mi5EeW5hbWljTGlzdFILZHluYW1pY0xpc3QSQQoHdXBfbGlzdBgCIAEoCzIoLmJpbGli'\n    'aWxpLmFwcC5keW5hbWljLnYyLkNhcmRWaWRlb1VwTGlzdFIGdXBMaXN0EkEKCnRvcGljX2xpc3'\n    'QYAyABKAsyIi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5Ub3BpY0xpc3RSCXRvcGljTGlzdBI9'\n    'Cgh1bmZvbGxvdxgEIAEoCzIhLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlVuZm9sbG93Ugh1bm'\n    'ZvbGxvdxJHCgtyZWdpb25fcmNtZBgFIAEoCzImLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkR5'\n    'blJlZ2lvblJjbWRSCnJlZ2lvblJjbWQSNwoGY29uZmlnGAYgASgLMh8uYmlsaWJpbGkuYXBwLm'\n    'R5bmFtaWMudjIuQ29uZmlnUgZjb25maWcSSAoLc29ydF9jb25maWcYByABKAsyJy5iaWxpYmls'\n    'aS5hcHAuZHluYW1pYy52Mi5GZWVkU29ydENvbmZpZ1IKc29ydENvbmZpZw==');\n\n@$core.Deprecated('Use dynAllReqDescriptor instead')\nconst DynAllReq$json = {\n  '1': 'DynAllReq',\n  '2': [\n    {'1': 'update_baseline', '3': 1, '4': 1, '5': 9, '10': 'updateBaseline'},\n    {'1': 'offset', '3': 2, '4': 1, '5': 9, '10': 'offset'},\n    {'1': 'page', '3': 3, '4': 1, '5': 5, '10': 'page'},\n    {\n      '1': 'refresh_type',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.Refresh',\n      '10': 'refreshType'\n    },\n    {\n      '1': 'playurl_param',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.PlayurlParam',\n      '10': 'playurlParam'\n    },\n    {'1': 'assist_baseline', '3': 6, '4': 1, '5': 9, '10': 'assistBaseline'},\n    {'1': 'local_time', '3': 7, '4': 1, '5': 5, '10': 'localTime'},\n    {\n      '1': 'rcmd_ups_param',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.RcmdUPsParam',\n      '10': 'rcmdUpsParam'\n    },\n    {\n      '1': 'ad_param',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdParam',\n      '10': 'adParam'\n    },\n    {'1': 'cold_start', '3': 10, '4': 1, '5': 5, '10': 'coldStart'},\n    {'1': 'from', '3': 11, '4': 1, '5': 9, '10': 'from'},\n    {\n      '1': 'player_args',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n    {'1': 'tab_recall_uid', '3': 13, '4': 1, '5': 3, '10': 'tabRecallUid'},\n    {\n      '1': 'tab_recall_type',\n      '3': 14,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.StyleType',\n      '10': 'tabRecallType'\n    },\n    {'1': 'tab_recall_extra', '3': 15, '4': 1, '5': 9, '10': 'tabRecallExtra'},\n    {\n      '1': 'req_sort_option',\n      '3': 16,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.FeedSortOptionReq',\n      '10': 'reqSortOption'\n    },\n    {\n      '1': 'bubble_recall_extra_when_show',\n      '3': 17,\n      '4': 1,\n      '5': 9,\n      '10': 'bubbleRecallExtraWhenShow'\n    },\n  ],\n};\n\n/// Descriptor for `DynAllReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynAllReqDescriptor = $convert.base64Decode(\n    'CglEeW5BbGxSZXESJwoPdXBkYXRlX2Jhc2VsaW5lGAEgASgJUg51cGRhdGVCYXNlbGluZRIWCg'\n    'ZvZmZzZXQYAiABKAlSBm9mZnNldBISCgRwYWdlGAMgASgFUgRwYWdlEkMKDHJlZnJlc2hfdHlw'\n    'ZRgEIAEoDjIgLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlJlZnJlc2hSC3JlZnJlc2hUeXBlEk'\n    'oKDXBsYXl1cmxfcGFyYW0YBSABKAsyJS5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5QbGF5dXJs'\n    'UGFyYW1SDHBsYXl1cmxQYXJhbRInCg9hc3Npc3RfYmFzZWxpbmUYBiABKAlSDmFzc2lzdEJhc2'\n    'VsaW5lEh0KCmxvY2FsX3RpbWUYByABKAVSCWxvY2FsVGltZRJLCg5yY21kX3Vwc19wYXJhbRgI'\n    'IAEoCzIlLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlJjbWRVUHNQYXJhbVIMcmNtZFVwc1Bhcm'\n    'FtEjsKCGFkX3BhcmFtGAkgASgLMiAuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQWRQYXJhbVIH'\n    'YWRQYXJhbRIdCgpjb2xkX3N0YXJ0GAogASgFUgljb2xkU3RhcnQSEgoEZnJvbRgLIAEoCVIEZn'\n    'JvbRJPCgtwbGF5ZXJfYXJncxgMIAEoCzIuLmJpbGliaWxpLmFwcC5hcmNoaXZlLm1pZGRsZXdh'\n    'cmUudjEuUGxheWVyQXJnc1IKcGxheWVyQXJncxIkCg50YWJfcmVjYWxsX3VpZBgNIAEoA1IMdG'\n    'FiUmVjYWxsVWlkEkoKD3RhYl9yZWNhbGxfdHlwZRgOIAEoDjIiLmJpbGliaWxpLmFwcC5keW5h'\n    'bWljLnYyLlN0eWxlVHlwZVINdGFiUmVjYWxsVHlwZRIoChB0YWJfcmVjYWxsX2V4dHJhGA8gAS'\n    'gJUg50YWJSZWNhbGxFeHRyYRJSCg9yZXFfc29ydF9vcHRpb24YECABKAsyKi5iaWxpYmlsaS5h'\n    'cHAuZHluYW1pYy52Mi5GZWVkU29ydE9wdGlvblJlcVINcmVxU29ydE9wdGlvbhJACh1idWJibG'\n    'VfcmVjYWxsX2V4dHJhX3doZW5fc2hvdxgRIAEoCVIZYnViYmxlUmVjYWxsRXh0cmFXaGVuU2hv'\n    'dw==');\n\n@$core.Deprecated('Use dynAllUpdOffsetReqDescriptor instead')\nconst DynAllUpdOffsetReq$json = {\n  '1': 'DynAllUpdOffsetReq',\n  '2': [\n    {'1': 'host_uid', '3': 1, '4': 1, '5': 3, '10': 'hostUid'},\n    {'1': 'read_offset', '3': 2, '4': 1, '5': 9, '10': 'readOffset'},\n    {'1': 'footprint', '3': 3, '4': 1, '5': 9, '10': 'footprint'},\n    {'1': 'personal_extra', '3': 4, '4': 1, '5': 9, '10': 'personalExtra'},\n  ],\n};\n\n/// Descriptor for `DynAllUpdOffsetReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynAllUpdOffsetReqDescriptor = $convert.base64Decode(\n    'ChJEeW5BbGxVcGRPZmZzZXRSZXESGQoIaG9zdF91aWQYASABKANSB2hvc3RVaWQSHwoLcmVhZF'\n    '9vZmZzZXQYAiABKAlSCnJlYWRPZmZzZXQSHAoJZm9vdHByaW50GAMgASgJUglmb290cHJpbnQS'\n    'JQoOcGVyc29uYWxfZXh0cmEYBCABKAlSDXBlcnNvbmFsRXh0cmE=');\n\n@$core.Deprecated('Use dynDetailReplyDescriptor instead')\nconst DynDetailReply$json = {\n  '1': 'DynDetailReply',\n  '2': [\n    {\n      '1': 'item',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynamicItem',\n      '10': 'item'\n    },\n  ],\n};\n\n/// Descriptor for `DynDetailReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynDetailReplyDescriptor = $convert.base64Decode(\n    'Cg5EeW5EZXRhaWxSZXBseRI4CgRpdGVtGAEgASgLMiQuYmlsaWJpbGkuYXBwLmR5bmFtaWMudj'\n    'IuRHluYW1pY0l0ZW1SBGl0ZW0=');\n\n@$core.Deprecated('Use dynDetailReqDescriptor instead')\nconst DynDetailReq$json = {\n  '1': 'DynDetailReq',\n  '2': [\n    {'1': 'uid', '3': 1, '4': 1, '5': 3, '10': 'uid'},\n    {'1': 'dynamic_id', '3': 2, '4': 1, '5': 9, '10': 'dynamicId'},\n    {'1': 'dyn_type', '3': 3, '4': 1, '5': 3, '10': 'dynType'},\n    {'1': 'rid', '3': 4, '4': 1, '5': 3, '10': 'rid'},\n    {\n      '1': 'ad_param',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdParam',\n      '10': 'adParam'\n    },\n    {'1': 'from', '3': 6, '4': 1, '5': 9, '10': 'from'},\n    {\n      '1': 'player_args',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n    {'1': 'share_id', '3': 8, '4': 1, '5': 9, '10': 'shareId'},\n    {'1': 'share_mode', '3': 9, '4': 1, '5': 5, '10': 'shareMode'},\n    {'1': 'local_time', '3': 10, '4': 1, '5': 5, '10': 'localTime'},\n    {'1': 'pattern', '3': 11, '4': 1, '5': 9, '10': 'pattern'},\n    {\n      '1': 'config',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Config',\n      '10': 'config'\n    },\n  ],\n};\n\n/// Descriptor for `DynDetailReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynDetailReqDescriptor = $convert.base64Decode(\n    'CgxEeW5EZXRhaWxSZXESEAoDdWlkGAEgASgDUgN1aWQSHQoKZHluYW1pY19pZBgCIAEoCVIJZH'\n    'luYW1pY0lkEhkKCGR5bl90eXBlGAMgASgDUgdkeW5UeXBlEhAKA3JpZBgEIAEoA1IDcmlkEjsK'\n    'CGFkX3BhcmFtGAUgASgLMiAuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQWRQYXJhbVIHYWRQYX'\n    'JhbRISCgRmcm9tGAYgASgJUgRmcm9tEk8KC3BsYXllcl9hcmdzGAcgASgLMi4uYmlsaWJpbGku'\n    'YXBwLmFyY2hpdmUubWlkZGxld2FyZS52MS5QbGF5ZXJBcmdzUgpwbGF5ZXJBcmdzEhkKCHNoYX'\n    'JlX2lkGAggASgJUgdzaGFyZUlkEh0KCnNoYXJlX21vZGUYCSABKAVSCXNoYXJlTW9kZRIdCgps'\n    'b2NhbF90aW1lGAogASgFUglsb2NhbFRpbWUSGAoHcGF0dGVybhgLIAEoCVIHcGF0dGVybhI3Cg'\n    'Zjb25maWcYDCABKAsyHy5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5Db25maWdSBmNvbmZpZw==');\n\n@$core.Deprecated('Use dynDetailsReplyDescriptor instead')\nconst DynDetailsReply$json = {\n  '1': 'DynDetailsReply',\n  '2': [\n    {\n      '1': 'list',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynamicItem',\n      '10': 'list'\n    },\n  ],\n};\n\n/// Descriptor for `DynDetailsReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynDetailsReplyDescriptor = $convert.base64Decode(\n    'Cg9EeW5EZXRhaWxzUmVwbHkSOAoEbGlzdBgBIAMoCzIkLmJpbGliaWxpLmFwcC5keW5hbWljLn'\n    'YyLkR5bmFtaWNJdGVtUgRsaXN0');\n\n@$core.Deprecated('Use dynDetailsReqDescriptor instead')\nconst DynDetailsReq$json = {\n  '1': 'DynDetailsReq',\n  '2': [\n    {'1': 'dynamic_ids', '3': 1, '4': 1, '5': 9, '10': 'dynamicIds'},\n    {\n      '1': 'playurl_param',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.PlayurlParam',\n      '10': 'playurlParam'\n    },\n    {'1': 'local_time', '3': 3, '4': 1, '5': 5, '10': 'localTime'},\n    {\n      '1': 'player_args',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n    {\n      '1': 'config',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Config',\n      '10': 'config'\n    },\n  ],\n};\n\n/// Descriptor for `DynDetailsReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynDetailsReqDescriptor = $convert.base64Decode(\n    'Cg1EeW5EZXRhaWxzUmVxEh8KC2R5bmFtaWNfaWRzGAEgASgJUgpkeW5hbWljSWRzEkoKDXBsYX'\n    'l1cmxfcGFyYW0YAiABKAsyJS5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5QbGF5dXJsUGFyYW1S'\n    'DHBsYXl1cmxQYXJhbRIdCgpsb2NhbF90aW1lGAMgASgFUglsb2NhbFRpbWUSTwoLcGxheWVyX2'\n    'FyZ3MYBCABKAsyLi5iaWxpYmlsaS5hcHAuYXJjaGl2ZS5taWRkbGV3YXJlLnYxLlBsYXllckFy'\n    'Z3NSCnBsYXllckFyZ3MSNwoGY29uZmlnGAUgASgLMh8uYmlsaWJpbGkuYXBwLmR5bmFtaWMudj'\n    'IuQ29uZmlnUgZjb25maWc=');\n\n@$core.Deprecated('Use dynFakeCardReplyDescriptor instead')\nconst DynFakeCardReply$json = {\n  '1': 'DynFakeCardReply',\n  '2': [\n    {\n      '1': 'item',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynamicItem',\n      '10': 'item'\n    },\n  ],\n};\n\n/// Descriptor for `DynFakeCardReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynFakeCardReplyDescriptor = $convert.base64Decode(\n    'ChBEeW5GYWtlQ2FyZFJlcGx5EjgKBGl0ZW0YASABKAsyJC5iaWxpYmlsaS5hcHAuZHluYW1pYy'\n    '52Mi5EeW5hbWljSXRlbVIEaXRlbQ==');\n\n@$core.Deprecated('Use dynFakeCardReqDescriptor instead')\nconst DynFakeCardReq$json = {\n  '1': 'DynFakeCardReq',\n  '2': [\n    {'1': 'content', '3': 1, '4': 1, '5': 9, '10': 'content'},\n  ],\n};\n\n/// Descriptor for `DynFakeCardReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynFakeCardReqDescriptor = $convert\n    .base64Decode('Cg5EeW5GYWtlQ2FyZFJlcRIYCgdjb250ZW50GAEgASgJUgdjb250ZW50');\n\n@$core.Deprecated('Use dynFeatureGateDescriptor instead')\nconst DynFeatureGate$json = {\n  '1': 'DynFeatureGate',\n  '2': [\n    {\n      '1': 'enhanced_interaction',\n      '3': 1,\n      '4': 1,\n      '5': 8,\n      '10': 'enhancedInteraction'\n    },\n  ],\n};\n\n/// Descriptor for `DynFeatureGate`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynFeatureGateDescriptor = $convert.base64Decode(\n    'Cg5EeW5GZWF0dXJlR2F0ZRIxChRlbmhhbmNlZF9pbnRlcmFjdGlvbhgBIAEoCFITZW5oYW5jZW'\n    'RJbnRlcmFjdGlvbg==');\n\n@$core.Deprecated('Use dynFriendReplyDescriptor instead')\nconst DynFriendReply$json = {\n  '1': 'DynFriendReply',\n  '2': [\n    {\n      '1': 'dyn_list',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynamicItem',\n      '10': 'dynList'\n    },\n    {'1': 'has_more', '3': 2, '4': 1, '5': 8, '10': 'hasMore'},\n    {'1': 'offset', '3': 3, '4': 1, '5': 9, '10': 'offset'},\n  ],\n};\n\n/// Descriptor for `DynFriendReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynFriendReplyDescriptor = $convert.base64Decode(\n    'Cg5EeW5GcmllbmRSZXBseRI/CghkeW5fbGlzdBgBIAMoCzIkLmJpbGliaWxpLmFwcC5keW5hbW'\n    'ljLnYyLkR5bmFtaWNJdGVtUgdkeW5MaXN0EhkKCGhhc19tb3JlGAIgASgIUgdoYXNNb3JlEhYK'\n    'Bm9mZnNldBgDIAEoCVIGb2Zmc2V0');\n\n@$core.Deprecated('Use dynFriendReqDescriptor instead')\nconst DynFriendReq$json = {\n  '1': 'DynFriendReq',\n  '2': [\n    {'1': 'offset', '3': 1, '4': 1, '5': 9, '10': 'offset'},\n    {'1': 'local_time', '3': 2, '4': 1, '5': 5, '10': 'localTime'},\n    {\n      '1': 'player_args',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n  ],\n};\n\n/// Descriptor for `DynFriendReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynFriendReqDescriptor = $convert.base64Decode(\n    'CgxEeW5GcmllbmRSZXESFgoGb2Zmc2V0GAEgASgJUgZvZmZzZXQSHQoKbG9jYWxfdGltZRgCIA'\n    'EoBVIJbG9jYWxUaW1lEk8KC3BsYXllcl9hcmdzGAMgASgLMi4uYmlsaWJpbGkuYXBwLmFyY2hp'\n    'dmUubWlkZGxld2FyZS52MS5QbGF5ZXJBcmdzUgpwbGF5ZXJBcmdz');\n\n@$core.Deprecated('Use dynLightReplyDescriptor instead')\nconst DynLightReply$json = {\n  '1': 'DynLightReply',\n  '2': [\n    {\n      '1': 'dynamic_list',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynamicList',\n      '10': 'dynamicList'\n    },\n  ],\n};\n\n/// Descriptor for `DynLightReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynLightReplyDescriptor = $convert.base64Decode(\n    'Cg1EeW5MaWdodFJlcGx5EkcKDGR5bmFtaWNfbGlzdBgBIAEoCzIkLmJpbGliaWxpLmFwcC5keW'\n    '5hbWljLnYyLkR5bmFtaWNMaXN0UgtkeW5hbWljTGlzdA==');\n\n@$core.Deprecated('Use dynLightReqDescriptor instead')\nconst DynLightReq$json = {\n  '1': 'DynLightReq',\n  '2': [\n    {'1': 'history_offset', '3': 1, '4': 1, '5': 9, '10': 'historyOffset'},\n    {'1': 'page', '3': 2, '4': 1, '5': 5, '10': 'page'},\n    {'1': 'from', '3': 3, '4': 1, '5': 9, '10': 'from'},\n    {\n      '1': 'player_args',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n    {'1': 'local_time', '3': 5, '4': 1, '5': 5, '10': 'localTime'},\n    {\n      '1': 'from_type',\n      '3': 6,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.LightFromType',\n      '10': 'fromType'\n    },\n    {'1': 'fake_uid', '3': 7, '4': 1, '5': 3, '10': 'fakeUid'},\n  ],\n};\n\n/// Descriptor for `DynLightReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynLightReqDescriptor = $convert.base64Decode(\n    'CgtEeW5MaWdodFJlcRIlCg5oaXN0b3J5X29mZnNldBgBIAEoCVINaGlzdG9yeU9mZnNldBISCg'\n    'RwYWdlGAIgASgFUgRwYWdlEhIKBGZyb20YAyABKAlSBGZyb20STwoLcGxheWVyX2FyZ3MYBCAB'\n    'KAsyLi5iaWxpYmlsaS5hcHAuYXJjaGl2ZS5taWRkbGV3YXJlLnYxLlBsYXllckFyZ3NSCnBsYX'\n    'llckFyZ3MSHQoKbG9jYWxfdGltZRgFIAEoBVIJbG9jYWxUaW1lEkMKCWZyb21fdHlwZRgGIAEo'\n    'DjImLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkxpZ2h0RnJvbVR5cGVSCGZyb21UeXBlEhkKCG'\n    'Zha2VfdWlkGAcgASgDUgdmYWtlVWlk');\n\n@$core.Deprecated('Use dynMixUpListSearchReplyDescriptor instead')\nconst DynMixUpListSearchReply$json = {\n  '1': 'DynMixUpListSearchReply',\n  '2': [\n    {\n      '1': 'items',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MixUpListItem',\n      '10': 'items'\n    },\n  ],\n};\n\n/// Descriptor for `DynMixUpListSearchReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynMixUpListSearchReplyDescriptor =\n    $convert.base64Decode(\n        'ChdEeW5NaXhVcExpc3RTZWFyY2hSZXBseRI8CgVpdGVtcxgBIAMoCzImLmJpbGliaWxpLmFwcC'\n        '5keW5hbWljLnYyLk1peFVwTGlzdEl0ZW1SBWl0ZW1z');\n\n@$core.Deprecated('Use dynMixUpListSearchReqDescriptor instead')\nconst DynMixUpListSearchReq$json = {\n  '1': 'DynMixUpListSearchReq',\n  '2': [\n    {'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'},\n  ],\n};\n\n/// Descriptor for `DynMixUpListSearchReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynMixUpListSearchReqDescriptor =\n    $convert.base64Decode(\n        'ChVEeW5NaXhVcExpc3RTZWFyY2hSZXESEgoEbmFtZRgBIAEoCVIEbmFtZQ==');\n\n@$core.Deprecated('Use dynMixUpListViewMoreReplyDescriptor instead')\nconst DynMixUpListViewMoreReply$json = {\n  '1': 'DynMixUpListViewMoreReply',\n  '2': [\n    {\n      '1': 'items',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MixUpListItem',\n      '10': 'items'\n    },\n    {\n      '1': 'search_default_text',\n      '3': 2,\n      '4': 1,\n      '5': 9,\n      '10': 'searchDefaultText'\n    },\n    {\n      '1': 'sort_types',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.SortType',\n      '10': 'sortTypes'\n    },\n    {\n      '1': 'show_more_sort_types',\n      '3': 4,\n      '4': 1,\n      '5': 8,\n      '10': 'showMoreSortTypes'\n    },\n    {'1': 'default_sort_type', '3': 5, '4': 1, '5': 5, '10': 'defaultSortType'},\n  ],\n};\n\n/// Descriptor for `DynMixUpListViewMoreReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynMixUpListViewMoreReplyDescriptor = $convert.base64Decode(\n    'ChlEeW5NaXhVcExpc3RWaWV3TW9yZVJlcGx5EjwKBWl0ZW1zGAEgAygLMiYuYmlsaWJpbGkuYX'\n    'BwLmR5bmFtaWMudjIuTWl4VXBMaXN0SXRlbVIFaXRlbXMSLgoTc2VhcmNoX2RlZmF1bHRfdGV4'\n    'dBgCIAEoCVIRc2VhcmNoRGVmYXVsdFRleHQSQAoKc29ydF90eXBlcxgDIAMoCzIhLmJpbGliaW'\n    'xpLmFwcC5keW5hbWljLnYyLlNvcnRUeXBlUglzb3J0VHlwZXMSLwoUc2hvd19tb3JlX3NvcnRf'\n    'dHlwZXMYBCABKAhSEXNob3dNb3JlU29ydFR5cGVzEioKEWRlZmF1bHRfc29ydF90eXBlGAUgAS'\n    'gFUg9kZWZhdWx0U29ydFR5cGU=');\n\n@$core.Deprecated('Use dynMixUpListViewMoreReqDescriptor instead')\nconst DynMixUpListViewMoreReq$json = {\n  '1': 'DynMixUpListViewMoreReq',\n  '2': [\n    {'1': 'sort_type', '3': 1, '4': 1, '5': 5, '10': 'sortType'},\n  ],\n};\n\n/// Descriptor for `DynMixUpListViewMoreReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynMixUpListViewMoreReqDescriptor =\n    $convert.base64Decode(\n        'ChdEeW5NaXhVcExpc3RWaWV3TW9yZVJlcRIbCglzb3J0X3R5cGUYASABKAVSCHNvcnRUeXBl');\n\n@$core.Deprecated('Use dynRcmdReplyDescriptor instead')\nconst DynRcmdReply$json = {\n  '1': 'DynRcmdReply',\n  '2': [\n    {\n      '1': 'region_rcmd',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynRegionRcmd',\n      '10': 'regionRcmd'\n    },\n    {\n      '1': 'dynamic_list',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynamicList',\n      '10': 'dynamicList'\n    },\n  ],\n};\n\n/// Descriptor for `DynRcmdReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynRcmdReplyDescriptor = $convert.base64Decode(\n    'CgxEeW5SY21kUmVwbHkSRwoLcmVnaW9uX3JjbWQYASABKAsyJi5iaWxpYmlsaS5hcHAuZHluYW'\n    '1pYy52Mi5EeW5SZWdpb25SY21kUgpyZWdpb25SY21kEkcKDGR5bmFtaWNfbGlzdBgCIAEoCzIk'\n    'LmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkR5bmFtaWNMaXN0UgtkeW5hbWljTGlzdA==');\n\n@$core.Deprecated('Use dynRcmdReqDescriptor instead')\nconst DynRcmdReq$json = {\n  '1': 'DynRcmdReq',\n  '2': [\n    {\n      '1': 'player_args',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n    {'1': 'local_time', '3': 2, '4': 1, '5': 5, '10': 'localTime'},\n    {'1': 'fake_uid', '3': 3, '4': 1, '5': 3, '10': 'fakeUid'},\n    {'1': 'is_refresh', '3': 4, '4': 1, '5': 8, '10': 'isRefresh'},\n  ],\n};\n\n/// Descriptor for `DynRcmdReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynRcmdReqDescriptor = $convert.base64Decode(\n    'CgpEeW5SY21kUmVxEk8KC3BsYXllcl9hcmdzGAEgASgLMi4uYmlsaWJpbGkuYXBwLmFyY2hpdm'\n    'UubWlkZGxld2FyZS52MS5QbGF5ZXJBcmdzUgpwbGF5ZXJBcmdzEh0KCmxvY2FsX3RpbWUYAiAB'\n    'KAVSCWxvY2FsVGltZRIZCghmYWtlX3VpZBgDIAEoA1IHZmFrZVVpZBIdCgppc19yZWZyZXNoGA'\n    'QgASgIUglpc1JlZnJlc2g=');\n\n@$core.Deprecated('Use dynRcmdUpExchangeReplyDescriptor instead')\nconst DynRcmdUpExchangeReply$json = {\n  '1': 'DynRcmdUpExchangeReply',\n  '2': [\n    {\n      '1': 'unfollow',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Unfollow',\n      '10': 'unfollow'\n    },\n  ],\n};\n\n/// Descriptor for `DynRcmdUpExchangeReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynRcmdUpExchangeReplyDescriptor =\n    $convert.base64Decode(\n        'ChZEeW5SY21kVXBFeGNoYW5nZVJlcGx5Ej0KCHVuZm9sbG93GAEgASgLMiEuYmlsaWJpbGkuYX'\n        'BwLmR5bmFtaWMudjIuVW5mb2xsb3dSCHVuZm9sbG93');\n\n@$core.Deprecated('Use dynRcmdUpExchangeReqDescriptor instead')\nconst DynRcmdUpExchangeReq$json = {\n  '1': 'DynRcmdUpExchangeReq',\n  '2': [\n    {'1': 'uid', '3': 1, '4': 1, '5': 3, '10': 'uid'},\n    {'1': 'dislike_ts', '3': 2, '4': 1, '5': 3, '10': 'dislikeTs'},\n    {'1': 'from', '3': 3, '4': 1, '5': 9, '10': 'from'},\n  ],\n};\n\n/// Descriptor for `DynRcmdUpExchangeReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynRcmdUpExchangeReqDescriptor = $convert.base64Decode(\n    'ChREeW5SY21kVXBFeGNoYW5nZVJlcRIQCgN1aWQYASABKANSA3VpZBIdCgpkaXNsaWtlX3RzGA'\n    'IgASgDUglkaXNsaWtlVHMSEgoEZnJvbRgDIAEoCVIEZnJvbQ==');\n\n@$core.Deprecated('Use dynRegionRcmdDescriptor instead')\nconst DynRegionRcmd$json = {\n  '1': 'DynRegionRcmd',\n  '2': [\n    {\n      '1': 'items',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynRegionRcmdItem',\n      '10': 'items'\n    },\n    {\n      '1': 'opts',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.RcmdOption',\n      '10': 'opts'\n    },\n  ],\n};\n\n/// Descriptor for `DynRegionRcmd`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynRegionRcmdDescriptor = $convert.base64Decode(\n    'Cg1EeW5SZWdpb25SY21kEkAKBWl0ZW1zGAEgAygLMiouYmlsaWJpbGkuYXBwLmR5bmFtaWMudj'\n    'IuRHluUmVnaW9uUmNtZEl0ZW1SBWl0ZW1zEjcKBG9wdHMYAiABKAsyIy5iaWxpYmlsaS5hcHAu'\n    'ZHluYW1pYy52Mi5SY21kT3B0aW9uUgRvcHRz');\n\n@$core.Deprecated('Use dynRegionRcmdItemDescriptor instead')\nconst DynRegionRcmdItem$json = {\n  '1': 'DynRegionRcmdItem',\n  '2': [\n    {'1': 'rid', '3': 1, '4': 1, '5': 3, '10': 'rid'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'items',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleRcmd',\n      '10': 'items'\n    },\n  ],\n};\n\n/// Descriptor for `DynRegionRcmdItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynRegionRcmdItemDescriptor = $convert.base64Decode(\n    'ChFEeW5SZWdpb25SY21kSXRlbRIQCgNyaWQYASABKANSA3JpZBIUCgV0aXRsZRgCIAEoCVIFdG'\n    'l0bGUSOQoFaXRlbXMYAyADKAsyIy5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5Nb2R1bGVSY21k'\n    'UgVpdGVtcw==');\n\n@$core.Deprecated('Use dynScreenTabDescriptor instead')\nconst DynScreenTab$json = {\n  '1': 'DynScreenTab',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'default_tab', '3': 3, '4': 1, '5': 8, '10': 'defaultTab'},\n    {\n      '1': 'strategy_show_on_entrance',\n      '3': 4,\n      '4': 1,\n      '5': 8,\n      '10': 'strategyShowOnEntrance'\n    },\n    {\n      '1': 'strategy_show_on_refresh',\n      '3': 5,\n      '4': 1,\n      '5': 8,\n      '10': 'strategyShowOnRefresh'\n    },\n    {\n      '1': 'strategy_show_on_pull_up',\n      '3': 6,\n      '4': 1,\n      '5': 8,\n      '10': 'strategyShowOnPullUp'\n    },\n  ],\n};\n\n/// Descriptor for `DynScreenTab`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynScreenTabDescriptor = $convert.base64Decode(\n    'CgxEeW5TY3JlZW5UYWISFAoFdGl0bGUYASABKAlSBXRpdGxlEhIKBG5hbWUYAiABKAlSBG5hbW'\n    'USHwoLZGVmYXVsdF90YWIYAyABKAhSCmRlZmF1bHRUYWISOQoZc3RyYXRlZ3lfc2hvd19vbl9l'\n    'bnRyYW5jZRgEIAEoCFIWc3RyYXRlZ3lTaG93T25FbnRyYW5jZRI3ChhzdHJhdGVneV9zaG93X2'\n    '9uX3JlZnJlc2gYBSABKAhSFXN0cmF0ZWd5U2hvd09uUmVmcmVzaBI2ChhzdHJhdGVneV9zaG93'\n    'X29uX3B1bGxfdXAYBiABKAhSFHN0cmF0ZWd5U2hvd09uUHVsbFVw');\n\n@$core.Deprecated('Use dynSearchReplyDescriptor instead')\nconst DynSearchReply$json = {\n  '1': 'DynSearchReply',\n  '2': [\n    {\n      '1': 'channel_info',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.SearchChannel',\n      '10': 'channelInfo'\n    },\n    {\n      '1': 'search_topic',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.SearchTopic',\n      '10': 'searchTopic'\n    },\n    {\n      '1': 'search_info',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.SearchInfo',\n      '10': 'searchInfo'\n    },\n  ],\n};\n\n/// Descriptor for `DynSearchReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynSearchReplyDescriptor = $convert.base64Decode(\n    'Cg5EeW5TZWFyY2hSZXBseRJJCgxjaGFubmVsX2luZm8YASABKAsyJi5iaWxpYmlsaS5hcHAuZH'\n    'luYW1pYy52Mi5TZWFyY2hDaGFubmVsUgtjaGFubmVsSW5mbxJHCgxzZWFyY2hfdG9waWMYAiAB'\n    'KAsyJC5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5TZWFyY2hUb3BpY1ILc2VhcmNoVG9waWMSRA'\n    'oLc2VhcmNoX2luZm8YAyABKAsyIy5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5TZWFyY2hJbmZv'\n    'UgpzZWFyY2hJbmZv');\n\n@$core.Deprecated('Use dynSearchReqDescriptor instead')\nconst DynSearchReq$json = {\n  '1': 'DynSearchReq',\n  '2': [\n    {'1': 'keyword', '3': 1, '4': 1, '5': 9, '10': 'keyword'},\n    {'1': 'page', '3': 2, '4': 1, '5': 5, '10': 'page'},\n    {'1': 'local_time', '3': 3, '4': 1, '5': 5, '10': 'localTime'},\n    {\n      '1': 'player_args',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n  ],\n};\n\n/// Descriptor for `DynSearchReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynSearchReqDescriptor = $convert.base64Decode(\n    'CgxEeW5TZWFyY2hSZXESGAoHa2V5d29yZBgBIAEoCVIHa2V5d29yZBISCgRwYWdlGAIgASgFUg'\n    'RwYWdlEh0KCmxvY2FsX3RpbWUYAyABKAVSCWxvY2FsVGltZRJPCgtwbGF5ZXJfYXJncxgEIAEo'\n    'CzIuLmJpbGliaWxpLmFwcC5hcmNoaXZlLm1pZGRsZXdhcmUudjEuUGxheWVyQXJnc1IKcGxheW'\n    'VyQXJncw==');\n\n@$core.Deprecated('Use dynServerDetailsReplyDescriptor instead')\nconst DynServerDetailsReply$json = {\n  '1': 'DynServerDetailsReply',\n  '2': [\n    {\n      '1': 'items',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynServerDetailsReply.ItemsEntry',\n      '10': 'items'\n    },\n  ],\n  '3': [DynServerDetailsReply_ItemsEntry$json],\n};\n\n@$core.Deprecated('Use dynServerDetailsReplyDescriptor instead')\nconst DynServerDetailsReply_ItemsEntry$json = {\n  '1': 'ItemsEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 3, '10': 'key'},\n    {\n      '1': 'value',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynamicItem',\n      '10': 'value'\n    },\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `DynServerDetailsReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynServerDetailsReplyDescriptor = $convert.base64Decode(\n    'ChVEeW5TZXJ2ZXJEZXRhaWxzUmVwbHkSTwoFaXRlbXMYASADKAsyOS5iaWxpYmlsaS5hcHAuZH'\n    'luYW1pYy52Mi5EeW5TZXJ2ZXJEZXRhaWxzUmVwbHkuSXRlbXNFbnRyeVIFaXRlbXMaXgoKSXRl'\n    'bXNFbnRyeRIQCgNrZXkYASABKANSA2tleRI6CgV2YWx1ZRgCIAEoCzIkLmJpbGliaWxpLmFwcC'\n    '5keW5hbWljLnYyLkR5bmFtaWNJdGVtUgV2YWx1ZToCOAE=');\n\n@$core.Deprecated('Use dynServerDetailsReqDescriptor instead')\nconst DynServerDetailsReq$json = {\n  '1': 'DynServerDetailsReq',\n  '2': [\n    {'1': 'dynamic_ids', '3': 1, '4': 3, '5': 3, '10': 'dynamicIds'},\n    {'1': 'local_time', '3': 2, '4': 1, '5': 5, '10': 'localTime'},\n    {\n      '1': 'player_args',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n    {'1': 'mobi_app', '3': 4, '4': 1, '5': 9, '10': 'mobiApp'},\n    {'1': 'device', '3': 5, '4': 1, '5': 9, '10': 'device'},\n    {'1': 'buvid', '3': 6, '4': 1, '5': 9, '10': 'buvid'},\n    {'1': 'build', '3': 7, '4': 1, '5': 3, '10': 'build'},\n    {'1': 'mid', '3': 8, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'platform', '3': 9, '4': 1, '5': 9, '10': 'platform'},\n    {'1': 'is_master', '3': 10, '4': 1, '5': 8, '10': 'isMaster'},\n    {'1': 'top_dynamic_ids', '3': 11, '4': 3, '5': 3, '10': 'topDynamicIds'},\n  ],\n};\n\n/// Descriptor for `DynServerDetailsReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynServerDetailsReqDescriptor = $convert.base64Decode(\n    'ChNEeW5TZXJ2ZXJEZXRhaWxzUmVxEh8KC2R5bmFtaWNfaWRzGAEgAygDUgpkeW5hbWljSWRzEh'\n    '0KCmxvY2FsX3RpbWUYAiABKAVSCWxvY2FsVGltZRJPCgtwbGF5ZXJfYXJncxgDIAEoCzIuLmJp'\n    'bGliaWxpLmFwcC5hcmNoaXZlLm1pZGRsZXdhcmUudjEuUGxheWVyQXJnc1IKcGxheWVyQXJncx'\n    'IZCghtb2JpX2FwcBgEIAEoCVIHbW9iaUFwcBIWCgZkZXZpY2UYBSABKAlSBmRldmljZRIUCgVi'\n    'dXZpZBgGIAEoCVIFYnV2aWQSFAoFYnVpbGQYByABKANSBWJ1aWxkEhAKA21pZBgIIAEoA1IDbW'\n    'lkEhoKCHBsYXRmb3JtGAkgASgJUghwbGF0Zm9ybRIbCglpc19tYXN0ZXIYCiABKAhSCGlzTWFz'\n    'dGVyEiYKD3RvcF9keW5hbWljX2lkcxgLIAMoA1INdG9wRHluYW1pY0lkcw==');\n\n@$core.Deprecated('Use dynSpaceReqDescriptor instead')\nconst DynSpaceReq$json = {\n  '1': 'DynSpaceReq',\n  '2': [\n    {'1': 'host_uid', '3': 1, '4': 1, '5': 3, '10': 'hostUid'},\n    {'1': 'history_offset', '3': 2, '4': 1, '5': 9, '10': 'historyOffset'},\n    {\n      '1': 'player_args',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n    {'1': 'local_time', '3': 4, '4': 1, '5': 5, '10': 'localTime'},\n    {'1': 'page', '3': 5, '4': 1, '5': 3, '10': 'page'},\n    {'1': 'from', '3': 6, '4': 1, '5': 9, '10': 'from'},\n  ],\n};\n\n/// Descriptor for `DynSpaceReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynSpaceReqDescriptor = $convert.base64Decode(\n    'CgtEeW5TcGFjZVJlcRIZCghob3N0X3VpZBgBIAEoA1IHaG9zdFVpZBIlCg5oaXN0b3J5X29mZn'\n    'NldBgCIAEoCVINaGlzdG9yeU9mZnNldBJPCgtwbGF5ZXJfYXJncxgDIAEoCzIuLmJpbGliaWxp'\n    'LmFwcC5hcmNoaXZlLm1pZGRsZXdhcmUudjEuUGxheWVyQXJnc1IKcGxheWVyQXJncxIdCgpsb2'\n    'NhbF90aW1lGAQgASgFUglsb2NhbFRpbWUSEgoEcGFnZRgFIAEoA1IEcGFnZRISCgRmcm9tGAYg'\n    'ASgJUgRmcm9t');\n\n@$core.Deprecated('Use dynSpaceRspDescriptor instead')\nconst DynSpaceRsp$json = {\n  '1': 'DynSpaceRsp',\n  '2': [\n    {\n      '1': 'list',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynamicItem',\n      '10': 'list'\n    },\n    {'1': 'history_offset', '3': 2, '4': 1, '5': 9, '10': 'historyOffset'},\n    {'1': 'has_more', '3': 3, '4': 1, '5': 8, '10': 'hasMore'},\n  ],\n};\n\n/// Descriptor for `DynSpaceRsp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynSpaceRspDescriptor = $convert.base64Decode(\n    'CgtEeW5TcGFjZVJzcBI4CgRsaXN0GAEgAygLMiQuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuRH'\n    'luYW1pY0l0ZW1SBGxpc3QSJQoOaGlzdG9yeV9vZmZzZXQYAiABKAlSDWhpc3RvcnlPZmZzZXQS'\n    'GQoIaGFzX21vcmUYAyABKAhSB2hhc01vcmU=');\n\n@$core.Deprecated('Use dynSpaceSearchDetailsReplyDescriptor instead')\nconst DynSpaceSearchDetailsReply$json = {\n  '1': 'DynSpaceSearchDetailsReply',\n  '2': [\n    {\n      '1': 'items',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynSpaceSearchDetailsReply.ItemsEntry',\n      '10': 'items'\n    },\n  ],\n  '3': [DynSpaceSearchDetailsReply_ItemsEntry$json],\n};\n\n@$core.Deprecated('Use dynSpaceSearchDetailsReplyDescriptor instead')\nconst DynSpaceSearchDetailsReply_ItemsEntry$json = {\n  '1': 'ItemsEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 3, '10': 'key'},\n    {\n      '1': 'value',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynamicItem',\n      '10': 'value'\n    },\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `DynSpaceSearchDetailsReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynSpaceSearchDetailsReplyDescriptor = $convert.base64Decode(\n    'ChpEeW5TcGFjZVNlYXJjaERldGFpbHNSZXBseRJUCgVpdGVtcxgBIAMoCzI+LmJpbGliaWxpLm'\n    'FwcC5keW5hbWljLnYyLkR5blNwYWNlU2VhcmNoRGV0YWlsc1JlcGx5Lkl0ZW1zRW50cnlSBWl0'\n    'ZW1zGl4KCkl0ZW1zRW50cnkSEAoDa2V5GAEgASgDUgNrZXkSOgoFdmFsdWUYAiABKAsyJC5iaW'\n    'xpYmlsaS5hcHAuZHluYW1pYy52Mi5EeW5hbWljSXRlbVIFdmFsdWU6AjgB');\n\n@$core.Deprecated('Use dynSpaceSearchDetailsReqDescriptor instead')\nconst DynSpaceSearchDetailsReq$json = {\n  '1': 'DynSpaceSearchDetailsReq',\n  '2': [\n    {'1': 'dynamic_ids', '3': 1, '4': 3, '5': 3, '10': 'dynamicIds'},\n    {'1': 'search_words', '3': 2, '4': 3, '5': 9, '10': 'searchWords'},\n    {'1': 'local_time', '3': 3, '4': 1, '5': 5, '10': 'localTime'},\n    {\n      '1': 'player_args',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n    {'1': 'mobi_app', '3': 5, '4': 1, '5': 9, '10': 'mobiApp'},\n    {'1': 'device', '3': 6, '4': 1, '5': 9, '10': 'device'},\n    {'1': 'buvid', '3': 7, '4': 1, '5': 9, '10': 'buvid'},\n    {'1': 'build', '3': 8, '4': 1, '5': 3, '10': 'build'},\n    {'1': 'mid', '3': 9, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'platform', '3': 10, '4': 1, '5': 9, '10': 'platform'},\n    {'1': 'ip', '3': 11, '4': 1, '5': 9, '10': 'ip'},\n    {\n      '1': 'net_type',\n      '3': 12,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.NetworkType',\n      '10': 'netType'\n    },\n    {\n      '1': 'tf_type',\n      '3': 13,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.TFType',\n      '10': 'tfType'\n    },\n  ],\n};\n\n/// Descriptor for `DynSpaceSearchDetailsReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynSpaceSearchDetailsReqDescriptor = $convert.base64Decode(\n    'ChhEeW5TcGFjZVNlYXJjaERldGFpbHNSZXESHwoLZHluYW1pY19pZHMYASADKANSCmR5bmFtaW'\n    'NJZHMSIQoMc2VhcmNoX3dvcmRzGAIgAygJUgtzZWFyY2hXb3JkcxIdCgpsb2NhbF90aW1lGAMg'\n    'ASgFUglsb2NhbFRpbWUSTwoLcGxheWVyX2FyZ3MYBCABKAsyLi5iaWxpYmlsaS5hcHAuYXJjaG'\n    'l2ZS5taWRkbGV3YXJlLnYxLlBsYXllckFyZ3NSCnBsYXllckFyZ3MSGQoIbW9iaV9hcHAYBSAB'\n    'KAlSB21vYmlBcHASFgoGZGV2aWNlGAYgASgJUgZkZXZpY2USFAoFYnV2aWQYByABKAlSBWJ1dm'\n    'lkEhQKBWJ1aWxkGAggASgDUgVidWlsZBIQCgNtaWQYCSABKANSA21pZBIaCghwbGF0Zm9ybRgK'\n    'IAEoCVIIcGxhdGZvcm0SDgoCaXAYCyABKAlSAmlwEj8KCG5ldF90eXBlGAwgASgOMiQuYmlsaW'\n    'JpbGkuYXBwLmR5bmFtaWMudjIuTmV0d29ya1R5cGVSB25ldFR5cGUSOAoHdGZfdHlwZRgNIAEo'\n    'DjIfLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlRGVHlwZVIGdGZUeXBl');\n\n@$core.Deprecated('Use dynTabDescriptor instead')\nconst DynTab$json = {\n  '1': 'DynTab',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'bubble', '3': 3, '4': 1, '5': 9, '10': 'bubble'},\n    {'1': 'red_point', '3': 4, '4': 1, '5': 5, '10': 'redPoint'},\n    {'1': 'city_id', '3': 5, '4': 1, '5': 3, '10': 'cityId'},\n    {'1': 'is_popup', '3': 6, '4': 1, '5': 5, '10': 'isPopup'},\n    {\n      '1': 'popup',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Popup',\n      '10': 'popup'\n    },\n    {'1': 'default_tab', '3': 8, '4': 1, '5': 8, '10': 'defaultTab'},\n    {'1': 'sub_title', '3': 9, '4': 1, '5': 9, '10': 'subTitle'},\n    {'1': 'anchor', '3': 10, '4': 1, '5': 9, '10': 'anchor'},\n    {'1': 'internal_test', '3': 11, '4': 1, '5': 9, '10': 'internalTest'},\n    {\n      '1': 'type',\n      '3': 12,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.ShowType',\n      '10': 'type'\n    },\n    {\n      '1': 'back_up',\n      '3': 13,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynTab',\n      '10': 'backUp'\n    },\n    {'1': 'jump_home_pop', '3': 14, '4': 1, '5': 9, '10': 'jumpHomePop'},\n  ],\n};\n\n/// Descriptor for `DynTab`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynTabDescriptor = $convert.base64Decode(\n    'CgZEeW5UYWISFAoFdGl0bGUYASABKAlSBXRpdGxlEhAKA3VyaRgCIAEoCVIDdXJpEhYKBmJ1Ym'\n    'JsZRgDIAEoCVIGYnViYmxlEhsKCXJlZF9wb2ludBgEIAEoBVIIcmVkUG9pbnQSFwoHY2l0eV9p'\n    'ZBgFIAEoA1IGY2l0eUlkEhkKCGlzX3BvcHVwGAYgASgFUgdpc1BvcHVwEjQKBXBvcHVwGAcgAS'\n    'gLMh4uYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuUG9wdXBSBXBvcHVwEh8KC2RlZmF1bHRfdGFi'\n    'GAggASgIUgpkZWZhdWx0VGFiEhsKCXN1Yl90aXRsZRgJIAEoCVIIc3ViVGl0bGUSFgoGYW5jaG'\n    '9yGAogASgJUgZhbmNob3ISIwoNaW50ZXJuYWxfdGVzdBgLIAEoCVIMaW50ZXJuYWxUZXN0EjUK'\n    'BHR5cGUYDCABKA4yIS5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5TaG93VHlwZVIEdHlwZRI4Cg'\n    'diYWNrX3VwGA0gASgLMh8uYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuRHluVGFiUgZiYWNrVXAS'\n    'IgoNanVtcF9ob21lX3BvcBgOIAEoCVILanVtcEhvbWVQb3A=');\n\n@$core.Deprecated('Use dynTabReplyDescriptor instead')\nconst DynTabReply$json = {\n  '1': 'DynTabReply',\n  '2': [\n    {\n      '1': 'dyn_tab',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynTab',\n      '10': 'dynTab'\n    },\n    {\n      '1': 'screen_tab',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynScreenTab',\n      '10': 'screenTab'\n    },\n  ],\n};\n\n/// Descriptor for `DynTabReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynTabReplyDescriptor = $convert.base64Decode(\n    'CgtEeW5UYWJSZXBseRI4CgdkeW5fdGFiGAEgAygLMh8uYmlsaWJpbGkuYXBwLmR5bmFtaWMudj'\n    'IuRHluVGFiUgZkeW5UYWISRAoKc2NyZWVuX3RhYhgCIAMoCzIlLmJpbGliaWxpLmFwcC5keW5h'\n    'bWljLnYyLkR5blNjcmVlblRhYlIJc2NyZWVuVGFi');\n\n@$core.Deprecated('Use dynTabReqDescriptor instead')\nconst DynTabReq$json = {\n  '1': 'DynTabReq',\n  '2': [\n    {'1': 'teenagers_mode', '3': 1, '4': 1, '5': 5, '10': 'teenagersMode'},\n    {\n      '1': 'from_type',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CampusReqFromType',\n      '10': 'fromType'\n    },\n  ],\n};\n\n/// Descriptor for `DynTabReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynTabReqDescriptor = $convert.base64Decode(\n    'CglEeW5UYWJSZXESJQoOdGVlbmFnZXJzX21vZGUYASABKAVSDXRlZW5hZ2Vyc01vZGUSRwoJZn'\n    'JvbV90eXBlGAIgASgOMiouYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQ2FtcHVzUmVxRnJvbVR5'\n    'cGVSCGZyb21UeXBl');\n\n@$core.Deprecated('Use dynThumbReqDescriptor instead')\nconst DynThumbReq$json = {\n  '1': 'DynThumbReq',\n  '2': [\n    {'1': 'uid', '3': 1, '4': 1, '5': 3, '10': 'uid'},\n    {'1': 'dyn_id', '3': 2, '4': 1, '5': 9, '10': 'dynId'},\n    {'1': 'dyn_type', '3': 3, '4': 1, '5': 3, '10': 'dynType'},\n    {'1': 'rid', '3': 4, '4': 1, '5': 9, '10': 'rid'},\n    {\n      '1': 'type',\n      '3': 5,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.ThumbType',\n      '10': 'type'\n    },\n  ],\n};\n\n/// Descriptor for `DynThumbReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynThumbReqDescriptor = $convert.base64Decode(\n    'CgtEeW5UaHVtYlJlcRIQCgN1aWQYASABKANSA3VpZBIVCgZkeW5faWQYAiABKAlSBWR5bklkEh'\n    'kKCGR5bl90eXBlGAMgASgDUgdkeW5UeXBlEhAKA3JpZBgEIAEoCVIDcmlkEjYKBHR5cGUYBSAB'\n    'KA4yIi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5UaHVtYlR5cGVSBHR5cGU=');\n\n@$core.Deprecated('Use dynVideoPersonalReplyDescriptor instead')\nconst DynVideoPersonalReply$json = {\n  '1': 'DynVideoPersonalReply',\n  '2': [\n    {\n      '1': 'list',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynamicItem',\n      '10': 'list'\n    },\n    {'1': 'offset', '3': 2, '4': 1, '5': 9, '10': 'offset'},\n    {'1': 'has_more', '3': 3, '4': 1, '5': 8, '10': 'hasMore'},\n    {'1': 'read_offset', '3': 4, '4': 1, '5': 9, '10': 'readOffset'},\n    {\n      '1': 'relation',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Relation',\n      '10': 'relation'\n    },\n    {\n      '1': 'addition_up',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.TopAdditionUP',\n      '10': 'additionUp'\n    },\n    {'1': 'title', '3': 7, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'title_sub', '3': 8, '4': 1, '5': 9, '10': 'titleSub'},\n  ],\n};\n\n/// Descriptor for `DynVideoPersonalReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynVideoPersonalReplyDescriptor = $convert.base64Decode(\n    'ChVEeW5WaWRlb1BlcnNvbmFsUmVwbHkSOAoEbGlzdBgBIAMoCzIkLmJpbGliaWxpLmFwcC5keW'\n    '5hbWljLnYyLkR5bmFtaWNJdGVtUgRsaXN0EhYKBm9mZnNldBgCIAEoCVIGb2Zmc2V0EhkKCGhh'\n    'c19tb3JlGAMgASgIUgdoYXNNb3JlEh8KC3JlYWRfb2Zmc2V0GAQgASgJUgpyZWFkT2Zmc2V0Ej'\n    '0KCHJlbGF0aW9uGAUgASgLMiEuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuUmVsYXRpb25SCHJl'\n    'bGF0aW9uEkcKC2FkZGl0aW9uX3VwGAYgASgLMiYuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuVG'\n    '9wQWRkaXRpb25VUFIKYWRkaXRpb25VcBIUCgV0aXRsZRgHIAEoCVIFdGl0bGUSGwoJdGl0bGVf'\n    'c3ViGAggASgJUgh0aXRsZVN1Yg==');\n\n@$core.Deprecated('Use dynVideoPersonalReqDescriptor instead')\nconst DynVideoPersonalReq$json = {\n  '1': 'DynVideoPersonalReq',\n  '2': [\n    {'1': 'host_uid', '3': 1, '4': 1, '5': 3, '10': 'hostUid'},\n    {'1': 'offset', '3': 2, '4': 1, '5': 9, '10': 'offset'},\n    {'1': 'page', '3': 3, '4': 1, '5': 5, '10': 'page'},\n    {'1': 'is_preload', '3': 4, '4': 1, '5': 5, '10': 'isPreload'},\n    {\n      '1': 'playurl_param',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.PlayurlParam',\n      '10': 'playurlParam'\n    },\n    {'1': 'local_time', '3': 6, '4': 1, '5': 5, '10': 'localTime'},\n    {'1': 'footprint', '3': 7, '4': 1, '5': 9, '10': 'footprint'},\n    {'1': 'from', '3': 8, '4': 1, '5': 9, '10': 'from'},\n    {\n      '1': 'player_args',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n    {'1': 'pegasus_avid', '3': 10, '4': 1, '5': 3, '10': 'pegasusAvid'},\n    {'1': 'personal_extra', '3': 11, '4': 1, '5': 9, '10': 'personalExtra'},\n  ],\n};\n\n/// Descriptor for `DynVideoPersonalReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynVideoPersonalReqDescriptor = $convert.base64Decode(\n    'ChNEeW5WaWRlb1BlcnNvbmFsUmVxEhkKCGhvc3RfdWlkGAEgASgDUgdob3N0VWlkEhYKBm9mZn'\n    'NldBgCIAEoCVIGb2Zmc2V0EhIKBHBhZ2UYAyABKAVSBHBhZ2USHQoKaXNfcHJlbG9hZBgEIAEo'\n    'BVIJaXNQcmVsb2FkEkoKDXBsYXl1cmxfcGFyYW0YBSABKAsyJS5iaWxpYmlsaS5hcHAuZHluYW'\n    '1pYy52Mi5QbGF5dXJsUGFyYW1SDHBsYXl1cmxQYXJhbRIdCgpsb2NhbF90aW1lGAYgASgFUgls'\n    'b2NhbFRpbWUSHAoJZm9vdHByaW50GAcgASgJUglmb290cHJpbnQSEgoEZnJvbRgIIAEoCVIEZn'\n    'JvbRJPCgtwbGF5ZXJfYXJncxgJIAEoCzIuLmJpbGliaWxpLmFwcC5hcmNoaXZlLm1pZGRsZXdh'\n    'cmUudjEuUGxheWVyQXJnc1IKcGxheWVyQXJncxIhCgxwZWdhc3VzX2F2aWQYCiABKANSC3BlZ2'\n    'FzdXNBdmlkEiUKDnBlcnNvbmFsX2V4dHJhGAsgASgJUg1wZXJzb25hbEV4dHJh');\n\n@$core.Deprecated('Use dynVideoReplyDescriptor instead')\nconst DynVideoReply$json = {\n  '1': 'DynVideoReply',\n  '2': [\n    {\n      '1': 'dynamic_list',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CardVideoDynList',\n      '10': 'dynamicList'\n    },\n    {\n      '1': 'video_up_list',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CardVideoUpList',\n      '10': 'videoUpList'\n    },\n    {\n      '1': 'video_follow_list',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CardVideoFollowList',\n      '10': 'videoFollowList'\n    },\n    {\n      '1': 'sort_config',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.FeedSortConfig',\n      '10': 'sortConfig'\n    },\n  ],\n};\n\n/// Descriptor for `DynVideoReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynVideoReplyDescriptor = $convert.base64Decode(\n    'Cg1EeW5WaWRlb1JlcGx5EkwKDGR5bmFtaWNfbGlzdBgBIAEoCzIpLmJpbGliaWxpLmFwcC5keW'\n    '5hbWljLnYyLkNhcmRWaWRlb0R5bkxpc3RSC2R5bmFtaWNMaXN0EkwKDXZpZGVvX3VwX2xpc3QY'\n    'AiABKAsyKC5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5DYXJkVmlkZW9VcExpc3RSC3ZpZGVvVX'\n    'BMaXN0ElgKEXZpZGVvX2ZvbGxvd19saXN0GAMgASgLMiwuYmlsaWJpbGkuYXBwLmR5bmFtaWMu'\n    'djIuQ2FyZFZpZGVvRm9sbG93TGlzdFIPdmlkZW9Gb2xsb3dMaXN0EkgKC3NvcnRfY29uZmlnGA'\n    'QgASgLMicuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuRmVlZFNvcnRDb25maWdSCnNvcnRDb25m'\n    'aWc=');\n\n@$core.Deprecated('Use dynVideoReqDescriptor instead')\nconst DynVideoReq$json = {\n  '1': 'DynVideoReq',\n  '2': [\n    {'1': 'update_baseline', '3': 1, '4': 1, '5': 9, '10': 'updateBaseline'},\n    {'1': 'offset', '3': 2, '4': 1, '5': 9, '10': 'offset'},\n    {'1': 'page', '3': 3, '4': 1, '5': 5, '10': 'page'},\n    {\n      '1': 'refresh_type',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.Refresh',\n      '10': 'refreshType'\n    },\n    {\n      '1': 'playurl_param',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.PlayurlParam',\n      '10': 'playurlParam'\n    },\n    {'1': 'assist_baseline', '3': 6, '4': 1, '5': 9, '10': 'assistBaseline'},\n    {'1': 'local_time', '3': 7, '4': 1, '5': 5, '10': 'localTime'},\n    {'1': 'from', '3': 8, '4': 1, '5': 9, '10': 'from'},\n    {\n      '1': 'player_args',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n    {\n      '1': 'req_sort_option',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.FeedSortOptionReq',\n      '10': 'reqSortOption'\n    },\n  ],\n};\n\n/// Descriptor for `DynVideoReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynVideoReqDescriptor = $convert.base64Decode(\n    'CgtEeW5WaWRlb1JlcRInCg91cGRhdGVfYmFzZWxpbmUYASABKAlSDnVwZGF0ZUJhc2VsaW5lEh'\n    'YKBm9mZnNldBgCIAEoCVIGb2Zmc2V0EhIKBHBhZ2UYAyABKAVSBHBhZ2USQwoMcmVmcmVzaF90'\n    'eXBlGAQgASgOMiAuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuUmVmcmVzaFILcmVmcmVzaFR5cG'\n    'USSgoNcGxheXVybF9wYXJhbRgFIAEoCzIlLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlBsYXl1'\n    'cmxQYXJhbVIMcGxheXVybFBhcmFtEicKD2Fzc2lzdF9iYXNlbGluZRgGIAEoCVIOYXNzaXN0Qm'\n    'FzZWxpbmUSHQoKbG9jYWxfdGltZRgHIAEoBVIJbG9jYWxUaW1lEhIKBGZyb20YCCABKAlSBGZy'\n    'b20STwoLcGxheWVyX2FyZ3MYCSABKAsyLi5iaWxpYmlsaS5hcHAuYXJjaGl2ZS5taWRkbGV3YX'\n    'JlLnYxLlBsYXllckFyZ3NSCnBsYXllckFyZ3MSUgoPcmVxX3NvcnRfb3B0aW9uGAogASgLMiou'\n    'YmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuRmVlZFNvcnRPcHRpb25SZXFSDXJlcVNvcnRPcHRpb2'\n    '4=');\n\n@$core.Deprecated('Use dynVideoUpdOffsetReqDescriptor instead')\nconst DynVideoUpdOffsetReq$json = {\n  '1': 'DynVideoUpdOffsetReq',\n  '2': [\n    {'1': 'host_uid', '3': 1, '4': 1, '5': 3, '10': 'hostUid'},\n    {'1': 'read_offset', '3': 2, '4': 1, '5': 9, '10': 'readOffset'},\n    {'1': 'footprint', '3': 3, '4': 1, '5': 9, '10': 'footprint'},\n    {'1': 'personal_extra', '3': 4, '4': 1, '5': 9, '10': 'personalExtra'},\n  ],\n};\n\n/// Descriptor for `DynVideoUpdOffsetReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynVideoUpdOffsetReqDescriptor = $convert.base64Decode(\n    'ChREeW5WaWRlb1VwZE9mZnNldFJlcRIZCghob3N0X3VpZBgBIAEoA1IHaG9zdFVpZBIfCgtyZW'\n    'FkX29mZnNldBgCIAEoCVIKcmVhZE9mZnNldBIcCglmb290cHJpbnQYAyABKAlSCWZvb3Rwcmlu'\n    'dBIlCg5wZXJzb25hbF9leHRyYRgEIAEoCVINcGVyc29uYWxFeHRyYQ==');\n\n@$core.Deprecated('Use dynVoteReplyDescriptor instead')\nconst DynVoteReply$json = {\n  '1': 'DynVoteReply',\n  '2': [\n    {\n      '1': 'item',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionVote2',\n      '10': 'item'\n    },\n    {'1': 'toast', '3': 2, '4': 1, '5': 9, '10': 'toast'},\n  ],\n};\n\n/// Descriptor for `DynVoteReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynVoteReplyDescriptor = $convert.base64Decode(\n    'CgxEeW5Wb3RlUmVwbHkSOgoEaXRlbRgBIAEoCzImLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLk'\n    'FkZGl0aW9uVm90ZTJSBGl0ZW0SFAoFdG9hc3QYAiABKAlSBXRvYXN0');\n\n@$core.Deprecated('Use dynVoteReqDescriptor instead')\nconst DynVoteReq$json = {\n  '1': 'DynVoteReq',\n  '2': [\n    {'1': 'vote_id', '3': 1, '4': 1, '5': 3, '10': 'voteId'},\n    {'1': 'votes', '3': 2, '4': 3, '5': 3, '10': 'votes'},\n    {\n      '1': 'status',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.VoteStatus',\n      '10': 'status'\n    },\n    {'1': 'dynamic_id', '3': 4, '4': 1, '5': 9, '10': 'dynamicId'},\n    {'1': 'share', '3': 5, '4': 1, '5': 8, '10': 'share'},\n  ],\n};\n\n/// Descriptor for `DynVoteReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynVoteReqDescriptor = $convert.base64Decode(\n    'CgpEeW5Wb3RlUmVxEhcKB3ZvdGVfaWQYASABKANSBnZvdGVJZBIUCgV2b3RlcxgCIAMoA1IFdm'\n    '90ZXMSOwoGc3RhdHVzGAMgASgOMiMuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuVm90ZVN0YXR1'\n    'c1IGc3RhdHVzEh0KCmR5bmFtaWNfaWQYBCABKAlSCWR5bmFtaWNJZBIUCgVzaGFyZRgFIAEoCF'\n    'IFc2hhcmU=');\n\n@$core.Deprecated('Use dynamicItemDescriptor instead')\nconst DynamicItem$json = {\n  '1': 'DynamicItem',\n  '2': [\n    {\n      '1': 'card_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.DynamicType',\n      '10': 'cardType'\n    },\n    {\n      '1': 'item_type',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.DynamicType',\n      '10': 'itemType'\n    },\n    {\n      '1': 'modules',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Module',\n      '10': 'modules'\n    },\n    {\n      '1': 'extend',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Extend',\n      '10': 'extend'\n    },\n    {'1': 'has_fold', '3': 5, '4': 1, '5': 5, '10': 'hasFold'},\n    {'1': 'server_info', '3': 6, '4': 1, '5': 9, '10': 'serverInfo'},\n  ],\n};\n\n/// Descriptor for `DynamicItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynamicItemDescriptor = $convert.base64Decode(\n    'CgtEeW5hbWljSXRlbRJBCgljYXJkX3R5cGUYASABKA4yJC5iaWxpYmlsaS5hcHAuZHluYW1pYy'\n    '52Mi5EeW5hbWljVHlwZVIIY2FyZFR5cGUSQQoJaXRlbV90eXBlGAIgASgOMiQuYmlsaWJpbGku'\n    'YXBwLmR5bmFtaWMudjIuRHluYW1pY1R5cGVSCGl0ZW1UeXBlEjkKB21vZHVsZXMYAyADKAsyHy'\n    '5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5Nb2R1bGVSB21vZHVsZXMSNwoGZXh0ZW5kGAQgASgL'\n    'Mh8uYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuRXh0ZW5kUgZleHRlbmQSGQoIaGFzX2ZvbGQYBS'\n    'ABKAVSB2hhc0ZvbGQSHwoLc2VydmVyX2luZm8YBiABKAlSCnNlcnZlckluZm8=');\n\n@$core.Deprecated('Use dynamicListDescriptor instead')\nconst DynamicList$json = {\n  '1': 'DynamicList',\n  '2': [\n    {\n      '1': 'list',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynamicItem',\n      '10': 'list'\n    },\n    {'1': 'update_num', '3': 2, '4': 1, '5': 3, '10': 'updateNum'},\n    {'1': 'history_offset', '3': 3, '4': 1, '5': 9, '10': 'historyOffset'},\n    {'1': 'update_baseline', '3': 4, '4': 1, '5': 9, '10': 'updateBaseline'},\n    {'1': 'has_more', '3': 5, '4': 1, '5': 8, '10': 'hasMore'},\n  ],\n};\n\n/// Descriptor for `DynamicList`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynamicListDescriptor = $convert.base64Decode(\n    'CgtEeW5hbWljTGlzdBI4CgRsaXN0GAEgAygLMiQuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuRH'\n    'luYW1pY0l0ZW1SBGxpc3QSHQoKdXBkYXRlX251bRgCIAEoA1IJdXBkYXRlTnVtEiUKDmhpc3Rv'\n    'cnlfb2Zmc2V0GAMgASgJUg1oaXN0b3J5T2Zmc2V0EicKD3VwZGF0ZV9iYXNlbGluZRgEIAEoCV'\n    'IOdXBkYXRlQmFzZWxpbmUSGQoIaGFzX21vcmUYBSABKAhSB2hhc01vcmU=');\n\n@$core.Deprecated('Use emojiSizeSpecDescriptor instead')\nconst EmojiSizeSpec$json = {\n  '1': 'EmojiSizeSpec',\n  '2': [\n    {'1': 'width', '3': 1, '4': 1, '5': 3, '10': 'width'},\n  ],\n};\n\n/// Descriptor for `EmojiSizeSpec`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List emojiSizeSpecDescriptor = $convert\n    .base64Decode('Cg1FbW9qaVNpemVTcGVjEhQKBXdpZHRoGAEgASgDUgV3aWR0aA==');\n\n@$core.Deprecated('Use emoteNodeDescriptor instead')\nconst EmoteNode$json = {\n  '1': 'EmoteNode',\n  '2': [\n    {\n      '1': 'raw_text',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.WordNode',\n      '10': 'rawText'\n    },\n    {'1': 'emote_url', '3': 2, '4': 1, '5': 9, '10': 'emoteUrl'},\n    {\n      '1': 'emote_width',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.EmoteSize',\n      '10': 'emoteWidth'\n    },\n    {'1': 'is_inline_img', '3': 4, '4': 1, '5': 8, '10': 'isInlineImg'},\n    {\n      '1': 'inline_img_cfg',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ImgInlineCfg',\n      '10': 'inlineImgCfg'\n    },\n    {'1': 'allow_animated', '3': 6, '4': 1, '5': 8, '10': 'allowAnimated'},\n    {\n      '1': 'click_action',\n      '3': 7,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.EmoteClickAction',\n      '10': 'clickAction'\n    },\n    {'1': 'preview_name', '3': 8, '4': 1, '5': 9, '10': 'previewName'},\n    {\n      '1': 'preview_name_jump_uri',\n      '3': 9,\n      '4': 1,\n      '5': 9,\n      '10': 'previewNameJumpUri'\n    },\n    {'1': 'emote_url_dark', '3': 10, '4': 1, '5': 9, '10': 'emoteUrlDark'},\n  ],\n};\n\n/// Descriptor for `EmoteNode`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List emoteNodeDescriptor = $convert.base64Decode(\n    'CglFbW90ZU5vZGUSPAoIcmF3X3RleHQYASABKAsyIS5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi'\n    '5Xb3JkTm9kZVIHcmF3VGV4dBIbCgllbW90ZV91cmwYAiABKAlSCGVtb3RlVXJsEkMKC2Vtb3Rl'\n    'X3dpZHRoGAMgASgLMiIuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuRW1vdGVTaXplUgplbW90ZV'\n    'dpZHRoEiIKDWlzX2lubGluZV9pbWcYBCABKAhSC2lzSW5saW5lSW1nEksKDmlubGluZV9pbWdf'\n    'Y2ZnGAUgASgLMiUuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuSW1nSW5saW5lQ2ZnUgxpbmxpbm'\n    'VJbWdDZmcSJQoOYWxsb3dfYW5pbWF0ZWQYBiABKAhSDWFsbG93QW5pbWF0ZWQSTAoMY2xpY2tf'\n    'YWN0aW9uGAcgASgOMikuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuRW1vdGVDbGlja0FjdGlvbl'\n    'ILY2xpY2tBY3Rpb24SIQoMcHJldmlld19uYW1lGAggASgJUgtwcmV2aWV3TmFtZRIxChVwcmV2'\n    'aWV3X25hbWVfanVtcF91cmkYCSABKAlSEnByZXZpZXdOYW1lSnVtcFVyaRIkCg5lbW90ZV91cm'\n    'xfZGFyaxgKIAEoCVIMZW1vdGVVcmxEYXJr');\n\n@$core.Deprecated('Use emoteSizeDescriptor instead')\nconst EmoteSize$json = {\n  '1': 'EmoteSize',\n  '2': [\n    {'1': 'width', '3': 1, '4': 1, '5': 1, '10': 'width'},\n    {'1': 'emoji_size', '3': 2, '4': 1, '5': 5, '10': 'emojiSize'},\n  ],\n};\n\n/// Descriptor for `EmoteSize`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List emoteSizeDescriptor = $convert.base64Decode(\n    'CglFbW90ZVNpemUSFAoFd2lkdGgYASABKAFSBXdpZHRoEh0KCmVtb2ppX3NpemUYAiABKAVSCW'\n    'Vtb2ppU2l6ZQ==');\n\n@$core.Deprecated('Use extInfoCommonDescriptor instead')\nconst ExtInfoCommon$json = {\n  '1': 'ExtInfoCommon',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'icon', '3': 3, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'poi_type', '3': 4, '4': 1, '5': 5, '10': 'poiType'},\n    {\n      '1': 'type',\n      '3': 5,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.DynExtendType',\n      '10': 'type'\n    },\n    {'1': 'sub_module', '3': 6, '4': 1, '5': 9, '10': 'subModule'},\n    {'1': 'action_text', '3': 7, '4': 1, '5': 9, '10': 'actionText'},\n    {'1': 'action_url', '3': 8, '4': 1, '5': 9, '10': 'actionUrl'},\n    {'1': 'rid', '3': 9, '4': 1, '5': 3, '10': 'rid'},\n    {'1': 'is_show_light', '3': 10, '4': 1, '5': 8, '10': 'isShowLight'},\n    {\n      '1': 'tag_style',\n      '3': 11,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.ExtInfoCommon.ExtTagStyle',\n      '10': 'tagStyle'\n    },\n    {\n      '1': 'extend_report_tag',\n      '3': 12,\n      '4': 1,\n      '5': 9,\n      '10': 'extendReportTag'\n    },\n  ],\n  '4': [ExtInfoCommon_ExtTagStyle$json],\n};\n\n@$core.Deprecated('Use extInfoCommonDescriptor instead')\nconst ExtInfoCommon_ExtTagStyle$json = {\n  '1': 'ExtTagStyle',\n  '2': [\n    {'1': 'EXT_TAG_STYLE_DEFAULT', '2': 0},\n    {'1': 'EXT_TAG_STYLE_PURE_TEXT', '2': 1},\n  ],\n};\n\n/// Descriptor for `ExtInfoCommon`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List extInfoCommonDescriptor = $convert.base64Decode(\n    'Cg1FeHRJbmZvQ29tbW9uEhQKBXRpdGxlGAEgASgJUgV0aXRsZRIQCgN1cmkYAiABKAlSA3VyaR'\n    'ISCgRpY29uGAMgASgJUgRpY29uEhkKCHBvaV90eXBlGAQgASgFUgdwb2lUeXBlEjoKBHR5cGUY'\n    'BSABKA4yJi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5EeW5FeHRlbmRUeXBlUgR0eXBlEh0KCn'\n    'N1Yl9tb2R1bGUYBiABKAlSCXN1Yk1vZHVsZRIfCgthY3Rpb25fdGV4dBgHIAEoCVIKYWN0aW9u'\n    'VGV4dBIdCgphY3Rpb25fdXJsGAggASgJUglhY3Rpb25VcmwSEAoDcmlkGAkgASgDUgNyaWQSIg'\n    'oNaXNfc2hvd19saWdodBgKIAEoCFILaXNTaG93TGlnaHQSTwoJdGFnX3N0eWxlGAsgASgOMjIu'\n    'YmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuRXh0SW5mb0NvbW1vbi5FeHRUYWdTdHlsZVIIdGFnU3'\n    'R5bGUSKgoRZXh0ZW5kX3JlcG9ydF90YWcYDCABKAlSD2V4dGVuZFJlcG9ydFRhZyJFCgtFeHRU'\n    'YWdTdHlsZRIZChVFWFRfVEFHX1NUWUxFX0RFRkFVTFQQABIbChdFWFRfVEFHX1NUWUxFX1BVUk'\n    'VfVEVYVBAB');\n\n@$core.Deprecated('Use extInfoGameDescriptor instead')\nconst ExtInfoGame$json = {\n  '1': 'ExtInfoGame',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'icon', '3': 3, '4': 1, '5': 9, '10': 'icon'},\n  ],\n};\n\n/// Descriptor for `ExtInfoGame`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List extInfoGameDescriptor = $convert.base64Decode(\n    'CgtFeHRJbmZvR2FtZRIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSEAoDdXJpGAIgASgJUgN1cmkSEg'\n    'oEaWNvbhgDIAEoCVIEaWNvbg==');\n\n@$core.Deprecated('Use extInfoHotDescriptor instead')\nconst ExtInfoHot$json = {\n  '1': 'ExtInfoHot',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'icon', '3': 3, '4': 1, '5': 9, '10': 'icon'},\n  ],\n};\n\n/// Descriptor for `ExtInfoHot`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List extInfoHotDescriptor = $convert.base64Decode(\n    'CgpFeHRJbmZvSG90EhQKBXRpdGxlGAEgASgJUgV0aXRsZRIQCgN1cmkYAiABKAlSA3VyaRISCg'\n    'RpY29uGAMgASgJUgRpY29u');\n\n@$core.Deprecated('Use extInfoLBSDescriptor instead')\nconst ExtInfoLBS$json = {\n  '1': 'ExtInfoLBS',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'icon', '3': 3, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'poi_type', '3': 4, '4': 1, '5': 5, '10': 'poiType'},\n  ],\n};\n\n/// Descriptor for `ExtInfoLBS`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List extInfoLBSDescriptor = $convert.base64Decode(\n    'CgpFeHRJbmZvTEJTEhQKBXRpdGxlGAEgASgJUgV0aXRsZRIQCgN1cmkYAiABKAlSA3VyaRISCg'\n    'RpY29uGAMgASgJUgRpY29uEhkKCHBvaV90eXBlGAQgASgFUgdwb2lUeXBl');\n\n@$core.Deprecated('Use extInfoOGVDescriptor instead')\nconst ExtInfoOGV$json = {\n  '1': 'ExtInfoOGV',\n  '2': [\n    {\n      '1': 'info_ogv',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.InfoOGV',\n      '10': 'infoOgv'\n    },\n  ],\n};\n\n/// Descriptor for `ExtInfoOGV`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List extInfoOGVDescriptor = $convert.base64Decode(\n    'CgpFeHRJbmZvT0dWEjsKCGluZm9fb2d2GAEgAygLMiAuYmlsaWJpbGkuYXBwLmR5bmFtaWMudj'\n    'IuSW5mb09HVlIHaW5mb09ndg==');\n\n@$core.Deprecated('Use extInfoTopicDescriptor instead')\nconst ExtInfoTopic$json = {\n  '1': 'ExtInfoTopic',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'icon', '3': 3, '4': 1, '5': 9, '10': 'icon'},\n  ],\n};\n\n/// Descriptor for `ExtInfoTopic`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List extInfoTopicDescriptor = $convert.base64Decode(\n    'CgxFeHRJbmZvVG9waWMSFAoFdGl0bGUYASABKAlSBXRpdGxlEhAKA3VyaRgCIAEoCVIDdXJpEh'\n    'IKBGljb24YAyABKAlSBGljb24=');\n\n@$core.Deprecated('Use extendDescriptor instead')\nconst Extend$json = {\n  '1': 'Extend',\n  '2': [\n    {'1': 'dyn_id_str', '3': 1, '4': 1, '5': 9, '10': 'dynIdStr'},\n    {'1': 'business_id', '3': 2, '4': 1, '5': 9, '10': 'businessId'},\n    {'1': 'orig_dyn_id_str', '3': 3, '4': 1, '5': 9, '10': 'origDynIdStr'},\n    {'1': 'orig_name', '3': 4, '4': 1, '5': 9, '10': 'origName'},\n    {'1': 'orig_img_url', '3': 5, '4': 1, '5': 9, '10': 'origImgUrl'},\n    {\n      '1': 'orig_desc',\n      '3': 6,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Description',\n      '10': 'origDesc'\n    },\n    {\n      '1': 'desc',\n      '3': 7,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Description',\n      '10': 'desc'\n    },\n    {\n      '1': 'orig_dyn_type',\n      '3': 8,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.DynamicType',\n      '10': 'origDynType'\n    },\n    {'1': 'share_type', '3': 9, '4': 1, '5': 9, '10': 'shareType'},\n    {'1': 'share_scene', '3': 10, '4': 1, '5': 9, '10': 'shareScene'},\n    {'1': 'is_fast_share', '3': 11, '4': 1, '5': 8, '10': 'isFastShare'},\n    {'1': 'r_type', '3': 12, '4': 1, '5': 5, '10': 'rType'},\n    {'1': 'dyn_type', '3': 13, '4': 1, '5': 3, '10': 'dynType'},\n    {'1': 'uid', '3': 14, '4': 1, '5': 3, '10': 'uid'},\n    {'1': 'card_url', '3': 15, '4': 1, '5': 9, '10': 'cardUrl'},\n    {\n      '1': 'source_content',\n      '3': 16,\n      '4': 1,\n      '5': 11,\n      '6': '.google.protobuf.Any',\n      '10': 'sourceContent'\n    },\n    {'1': 'orig_face', '3': 17, '4': 1, '5': 9, '10': 'origFace'},\n    {\n      '1': 'reply',\n      '3': 18,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ExtendReply',\n      '10': 'reply'\n    },\n    {'1': 'track_id', '3': 19, '4': 1, '5': 9, '10': 'trackId'},\n    {\n      '1': 'opus_summary',\n      '3': 20,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleOpusSummary',\n      '10': 'opusSummary'\n    },\n    {\n      '1': 'only_fans_property',\n      '3': 21,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OnlyFansProperty',\n      '10': 'onlyFansProperty'\n    },\n    {\n      '1': 'feature_gate',\n      '3': 22,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynFeatureGate',\n      '10': 'featureGate'\n    },\n    {'1': 'is_in_audit', '3': 23, '4': 1, '5': 8, '10': 'isInAudit'},\n    {\n      '1': 'history_report',\n      '3': 24,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Extend.HistoryReportEntry',\n      '10': 'historyReport'\n    },\n    {\n      '1': 'report_metric_data',\n      '3': 25,\n      '4': 1,\n      '5': 9,\n      '10': 'reportMetricData'\n    },\n    {\n      '1': 'desc_text_opus',\n      '3': 26,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.TextParagraph',\n      '10': 'descTextOpus'\n    },\n    {'1': 'is_preview_only', '3': 27, '4': 1, '5': 8, '10': 'isPreviewOnly'},\n    {\n      '1': 'repost_extra_info',\n      '3': 28,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.RepostExtraInfo',\n      '10': 'repostExtraInfo'\n    },\n    {\n      '1': 'manga_property',\n      '3': 29,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MangaProperty',\n      '10': 'mangaProperty'\n    },\n    {'1': 'up_name', '3': 30, '4': 1, '5': 9, '10': 'upName'},\n    {'1': 'up_face', '3': 31, '4': 1, '5': 9, '10': 'upFace'},\n    {\n      '1': 'desired_visibility_status',\n      '3': 32,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.DynVisibilityStatus',\n      '10': 'desiredVisibilityStatus'\n    },\n  ],\n  '3': [Extend_HistoryReportEntry$json],\n};\n\n@$core.Deprecated('Use extendDescriptor instead')\nconst Extend_HistoryReportEntry$json = {\n  '1': 'HistoryReportEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `Extend`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List extendDescriptor = $convert.base64Decode(\n    'CgZFeHRlbmQSHAoKZHluX2lkX3N0chgBIAEoCVIIZHluSWRTdHISHwoLYnVzaW5lc3NfaWQYAi'\n    'ABKAlSCmJ1c2luZXNzSWQSJQoPb3JpZ19keW5faWRfc3RyGAMgASgJUgxvcmlnRHluSWRTdHIS'\n    'GwoJb3JpZ19uYW1lGAQgASgJUghvcmlnTmFtZRIgCgxvcmlnX2ltZ191cmwYBSABKAlSCm9yaW'\n    'dJbWdVcmwSQQoJb3JpZ19kZXNjGAYgAygLMiQuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuRGVz'\n    'Y3JpcHRpb25SCG9yaWdEZXNjEjgKBGRlc2MYByADKAsyJC5iaWxpYmlsaS5hcHAuZHluYW1pYy'\n    '52Mi5EZXNjcmlwdGlvblIEZGVzYxJICg1vcmlnX2R5bl90eXBlGAggASgOMiQuYmlsaWJpbGku'\n    'YXBwLmR5bmFtaWMudjIuRHluYW1pY1R5cGVSC29yaWdEeW5UeXBlEh0KCnNoYXJlX3R5cGUYCS'\n    'ABKAlSCXNoYXJlVHlwZRIfCgtzaGFyZV9zY2VuZRgKIAEoCVIKc2hhcmVTY2VuZRIiCg1pc19m'\n    'YXN0X3NoYXJlGAsgASgIUgtpc0Zhc3RTaGFyZRIVCgZyX3R5cGUYDCABKAVSBXJUeXBlEhkKCG'\n    'R5bl90eXBlGA0gASgDUgdkeW5UeXBlEhAKA3VpZBgOIAEoA1IDdWlkEhkKCGNhcmRfdXJsGA8g'\n    'ASgJUgdjYXJkVXJsEjsKDnNvdXJjZV9jb250ZW50GBAgASgLMhQuZ29vZ2xlLnByb3RvYnVmLk'\n    'FueVINc291cmNlQ29udGVudBIbCglvcmlnX2ZhY2UYESABKAlSCG9yaWdGYWNlEjoKBXJlcGx5'\n    'GBIgASgLMiQuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuRXh0ZW5kUmVwbHlSBXJlcGx5EhkKCH'\n    'RyYWNrX2lkGBMgASgJUgd0cmFja0lkEk0KDG9wdXNfc3VtbWFyeRgUIAEoCzIqLmJpbGliaWxp'\n    'LmFwcC5keW5hbWljLnYyLk1vZHVsZU9wdXNTdW1tYXJ5UgtvcHVzU3VtbWFyeRJXChJvbmx5X2'\n    'ZhbnNfcHJvcGVydHkYFSABKAsyKS5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5Pbmx5RmFuc1By'\n    'b3BlcnR5UhBvbmx5RmFuc1Byb3BlcnR5EkoKDGZlYXR1cmVfZ2F0ZRgWIAEoCzInLmJpbGliaW'\n    'xpLmFwcC5keW5hbWljLnYyLkR5bkZlYXR1cmVHYXRlUgtmZWF0dXJlR2F0ZRIeCgtpc19pbl9h'\n    'dWRpdBgXIAEoCFIJaXNJbkF1ZGl0ElkKDmhpc3RvcnlfcmVwb3J0GBggAygLMjIuYmlsaWJpbG'\n    'kuYXBwLmR5bmFtaWMudjIuRXh0ZW5kLkhpc3RvcnlSZXBvcnRFbnRyeVINaGlzdG9yeVJlcG9y'\n    'dBIsChJyZXBvcnRfbWV0cmljX2RhdGEYGSABKAlSEHJlcG9ydE1ldHJpY0RhdGESTAoOZGVzY1'\n    '90ZXh0X29wdXMYGiABKAsyJi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5UZXh0UGFyYWdyYXBo'\n    'UgxkZXNjVGV4dE9wdXMSJgoPaXNfcHJldmlld19vbmx5GBsgASgIUg1pc1ByZXZpZXdPbmx5El'\n    'QKEXJlcG9zdF9leHRyYV9pbmZvGBwgASgLMiguYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuUmVw'\n    'b3N0RXh0cmFJbmZvUg9yZXBvc3RFeHRyYUluZm8STQoObWFuZ2FfcHJvcGVydHkYHSABKAsyJi'\n    '5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5NYW5nYVByb3BlcnR5Ug1tYW5nYVByb3BlcnR5EhcK'\n    'B3VwX25hbWUYHiABKAlSBnVwTmFtZRIXCgd1cF9mYWNlGB8gASgJUgZ1cEZhY2USaAoZZGVzaX'\n    'JlZF92aXNpYmlsaXR5X3N0YXR1cxggIAEoDjIsLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkR5'\n    'blZpc2liaWxpdHlTdGF0dXNSF2Rlc2lyZWRWaXNpYmlsaXR5U3RhdHVzGkAKEkhpc3RvcnlSZX'\n    'BvcnRFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgB');\n\n@$core.Deprecated('Use extendReplyDescriptor instead')\nconst ExtendReply$json = {\n  '1': 'ExtendReply',\n  '2': [\n    {'1': 'uri', '3': 1, '4': 1, '5': 9, '10': 'uri'},\n    {\n      '1': 'params',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ExtendReplyParam',\n      '10': 'params'\n    },\n    {'1': 'reply_biz_type', '3': 3, '4': 1, '5': 3, '10': 'replyBizType'},\n    {'1': 'reply_biz_id', '3': 4, '4': 1, '5': 3, '10': 'replyBizId'},\n    {'1': 'no_load_comment', '3': 5, '4': 1, '5': 8, '10': 'noLoadComment'},\n    {\n      '1': 'no_load_comment_hint_text',\n      '3': 6,\n      '4': 1,\n      '5': 9,\n      '10': 'noLoadCommentHintText'\n    },\n  ],\n};\n\n/// Descriptor for `ExtendReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List extendReplyDescriptor = $convert.base64Decode(\n    'CgtFeHRlbmRSZXBseRIQCgN1cmkYASABKAlSA3VyaRJBCgZwYXJhbXMYAiADKAsyKS5iaWxpYm'\n    'lsaS5hcHAuZHluYW1pYy52Mi5FeHRlbmRSZXBseVBhcmFtUgZwYXJhbXMSJAoOcmVwbHlfYml6'\n    'X3R5cGUYAyABKANSDHJlcGx5Qml6VHlwZRIgCgxyZXBseV9iaXpfaWQYBCABKANSCnJlcGx5Qm'\n    'l6SWQSJgoPbm9fbG9hZF9jb21tZW50GAUgASgIUg1ub0xvYWRDb21tZW50EjgKGW5vX2xvYWRf'\n    'Y29tbWVudF9oaW50X3RleHQYBiABKAlSFW5vTG9hZENvbW1lbnRIaW50VGV4dA==');\n\n@$core.Deprecated('Use extendReplyParamDescriptor instead')\nconst ExtendReplyParam$json = {\n  '1': 'ExtendReplyParam',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `ExtendReplyParam`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List extendReplyParamDescriptor = $convert.base64Decode(\n    'ChBFeHRlbmRSZXBseVBhcmFtEhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YW'\n    'x1ZQ==');\n\n@$core.Deprecated('Use feedFilterReplyDescriptor instead')\nconst FeedFilterReply$json = {\n  '1': 'FeedFilterReply',\n  '2': [\n    {'1': 'offset', '3': 1, '4': 1, '5': 9, '10': 'offset'},\n    {'1': 'has_more', '3': 2, '4': 1, '5': 8, '10': 'hasMore'},\n    {\n      '1': 'list',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynamicItem',\n      '10': 'list'\n    },\n  ],\n};\n\n/// Descriptor for `FeedFilterReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List feedFilterReplyDescriptor = $convert.base64Decode(\n    'Cg9GZWVkRmlsdGVyUmVwbHkSFgoGb2Zmc2V0GAEgASgJUgZvZmZzZXQSGQoIaGFzX21vcmUYAi'\n    'ABKAhSB2hhc01vcmUSOAoEbGlzdBgDIAMoCzIkLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkR5'\n    'bmFtaWNJdGVtUgRsaXN0');\n\n@$core.Deprecated('Use feedFilterReqDescriptor instead')\nconst FeedFilterReq$json = {\n  '1': 'FeedFilterReq',\n  '2': [\n    {'1': 'offset', '3': 1, '4': 1, '5': 9, '10': 'offset'},\n    {'1': 'tab', '3': 2, '4': 1, '5': 9, '10': 'tab'},\n    {'1': 'local_time', '3': 3, '4': 1, '5': 5, '10': 'localTime'},\n    {\n      '1': 'player_args',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n    {\n      '1': 'ad_param',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdParam',\n      '10': 'adParam'\n    },\n    {'1': 'cold_start', '3': 6, '4': 1, '5': 5, '10': 'coldStart'},\n    {'1': 'page', '3': 7, '4': 1, '5': 3, '10': 'page'},\n  ],\n};\n\n/// Descriptor for `FeedFilterReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List feedFilterReqDescriptor = $convert.base64Decode(\n    'Cg1GZWVkRmlsdGVyUmVxEhYKBm9mZnNldBgBIAEoCVIGb2Zmc2V0EhAKA3RhYhgCIAEoCVIDdG'\n    'FiEh0KCmxvY2FsX3RpbWUYAyABKAVSCWxvY2FsVGltZRJPCgtwbGF5ZXJfYXJncxgEIAEoCzIu'\n    'LmJpbGliaWxpLmFwcC5hcmNoaXZlLm1pZGRsZXdhcmUudjEuUGxheWVyQXJnc1IKcGxheWVyQX'\n    'JncxI7CghhZF9wYXJhbRgFIAEoCzIgLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkFkUGFyYW1S'\n    'B2FkUGFyYW0SHQoKY29sZF9zdGFydBgGIAEoBVIJY29sZFN0YXJ0EhIKBHBhZ2UYByABKANSBH'\n    'BhZ2U=');\n\n@$core.Deprecated('Use feedSortConfigDescriptor instead')\nconst FeedSortConfig$json = {\n  '1': 'FeedSortConfig',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'sort_options',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.FeedSortOption',\n      '10': 'sortOptions'\n    },\n  ],\n};\n\n/// Descriptor for `FeedSortConfig`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List feedSortConfigDescriptor = $convert.base64Decode(\n    'Cg5GZWVkU29ydENvbmZpZxIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSSgoMc29ydF9vcHRpb25zGA'\n    'IgAygLMicuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuRmVlZFNvcnRPcHRpb25SC3NvcnRPcHRp'\n    'b25z');\n\n@$core.Deprecated('Use feedSortOptionDescriptor instead')\nconst FeedSortOption$json = {\n  '1': 'FeedSortOption',\n  '2': [\n    {'1': 'sort_name', '3': 1, '4': 1, '5': 9, '10': 'sortName'},\n    {'1': 'sort_type', '3': 2, '4': 1, '5': 9, '10': 'sortType'},\n    {'1': 'is_selected', '3': 3, '4': 1, '5': 8, '10': 'isSelected'},\n    {\n      '1': 'no_auto_next_page_when_unsatisfied',\n      '3': 4,\n      '4': 1,\n      '5': 8,\n      '10': 'noAutoNextPageWhenUnsatisfied'\n    },\n  ],\n};\n\n/// Descriptor for `FeedSortOption`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List feedSortOptionDescriptor = $convert.base64Decode(\n    'Cg5GZWVkU29ydE9wdGlvbhIbCglzb3J0X25hbWUYASABKAlSCHNvcnROYW1lEhsKCXNvcnRfdH'\n    'lwZRgCIAEoCVIIc29ydFR5cGUSHwoLaXNfc2VsZWN0ZWQYAyABKAhSCmlzU2VsZWN0ZWQSSQoi'\n    'bm9fYXV0b19uZXh0X3BhZ2Vfd2hlbl91bnNhdGlzZmllZBgEIAEoCFIdbm9BdXRvTmV4dFBhZ2'\n    'VXaGVuVW5zYXRpc2ZpZWQ=');\n\n@$core.Deprecated('Use feedSortOptionReqDescriptor instead')\nconst FeedSortOptionReq$json = {\n  '1': 'FeedSortOptionReq',\n  '2': [\n    {'1': 'sort_type', '3': 1, '4': 1, '5': 9, '10': 'sortType'},\n    {'1': 'is_cold_refresh', '3': 2, '4': 1, '5': 8, '10': 'isColdRefresh'},\n  ],\n};\n\n/// Descriptor for `FeedSortOptionReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List feedSortOptionReqDescriptor = $convert.base64Decode(\n    'ChFGZWVkU29ydE9wdGlvblJlcRIbCglzb3J0X3R5cGUYASABKAlSCHNvcnRUeXBlEiYKD2lzX2'\n    'NvbGRfcmVmcmVzaBgCIAEoCFINaXNDb2xkUmVmcmVzaA==');\n\n@$core.Deprecated('Use fetchTabSettingReplyDescriptor instead')\nconst FetchTabSettingReply$json = {\n  '1': 'FetchTabSettingReply',\n  '2': [\n    {\n      '1': 'status',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.HomePageTabSttingStatus',\n      '10': 'status'\n    },\n  ],\n};\n\n/// Descriptor for `FetchTabSettingReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List fetchTabSettingReplyDescriptor = $convert.base64Decode(\n    'ChRGZXRjaFRhYlNldHRpbmdSZXBseRJICgZzdGF0dXMYASABKA4yMC5iaWxpYmlsaS5hcHAuZH'\n    'luYW1pYy52Mi5Ib21lUGFnZVRhYlN0dGluZ1N0YXR1c1IGc3RhdHVz');\n\n@$core.Deprecated('Use flowItemOpusDescriptor instead')\nconst FlowItemOpus$json = {\n  '1': 'FlowItemOpus',\n  '2': [\n    {\n      '1': 'cover_pic',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynDrawItem',\n      '10': 'coverPic'\n    },\n    {\n      '1': 'cover_wh_ratio',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.common.ItemWHRatio',\n      '10': 'coverWhRatio'\n    },\n    {\n      '1': 'bottom_left_text1',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CoverIconWithText',\n      '10': 'bottomLeftText1'\n    },\n    {\n      '1': 'bottom_left_text2',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CoverIconWithText',\n      '10': 'bottomLeftText2'\n    },\n    {\n      '1': 'text_paragraph',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Paragraph',\n      '10': 'textParagraph'\n    },\n    {\n      '1': 'top_right_badge',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.VideoBadge',\n      '10': 'topRightBadge'\n    },\n    {\n      '1': 'dark_cover_pic',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynDrawItem',\n      '10': 'darkCoverPic'\n    },\n  ],\n};\n\n/// Descriptor for `FlowItemOpus`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List flowItemOpusDescriptor = $convert.base64Decode(\n    'CgxGbG93SXRlbU9wdXMSRAoJY292ZXJfcGljGAEgASgLMicuYmlsaWJpbGkuYXBwLmR5bmFtaW'\n    'MudjIuTWRsRHluRHJhd0l0ZW1SCGNvdmVyUGljEk4KDmNvdmVyX3doX3JhdGlvGAIgASgLMigu'\n    'YmlsaWJpbGkuYXBwLmR5bmFtaWMuY29tbW9uLkl0ZW1XSFJhdGlvUgxjb3ZlcldoUmF0aW8SVg'\n    'oRYm90dG9tX2xlZnRfdGV4dDEYAyABKAsyKi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5Db3Zl'\n    'ckljb25XaXRoVGV4dFIPYm90dG9tTGVmdFRleHQxElYKEWJvdHRvbV9sZWZ0X3RleHQyGAQgAS'\n    'gLMiouYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQ292ZXJJY29uV2l0aFRleHRSD2JvdHRvbUxl'\n    'ZnRUZXh0MhJJCg50ZXh0X3BhcmFncmFwaBgFIAEoCzIiLmJpbGliaWxpLmFwcC5keW5hbWljLn'\n    'YyLlBhcmFncmFwaFINdGV4dFBhcmFncmFwaBJLCg90b3BfcmlnaHRfYmFkZ2UYBiABKAsyIy5i'\n    'aWxpYmlsaS5hcHAuZHluYW1pYy52Mi5WaWRlb0JhZGdlUg10b3BSaWdodEJhZGdlEk0KDmRhcm'\n    'tfY292ZXJfcGljGAcgASgLMicuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuTWRsRHluRHJhd0l0'\n    'ZW1SDGRhcmtDb3ZlclBpYw==');\n\n@$core.Deprecated('Use followListItemDescriptor instead')\nconst FollowListItem$json = {\n  '1': 'FollowListItem',\n  '2': [\n    {'1': 'season_id', '3': 1, '4': 1, '5': 3, '10': 'seasonId'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 3, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'url', '3': 4, '4': 1, '5': 9, '10': 'url'},\n    {\n      '1': 'new_ep',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.NewEP',\n      '10': 'newEp'\n    },\n    {'1': 'sub_title', '3': 6, '4': 1, '5': 9, '10': 'subTitle'},\n    {'1': 'pos', '3': 7, '4': 1, '5': 3, '10': 'pos'},\n  ],\n};\n\n/// Descriptor for `FollowListItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List followListItemDescriptor = $convert.base64Decode(\n    'Cg5Gb2xsb3dMaXN0SXRlbRIbCglzZWFzb25faWQYASABKANSCHNlYXNvbklkEhQKBXRpdGxlGA'\n    'IgASgJUgV0aXRsZRIUCgVjb3ZlchgDIAEoCVIFY292ZXISEAoDdXJsGAQgASgJUgN1cmwSNQoG'\n    'bmV3X2VwGAUgASgLMh4uYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuTmV3RVBSBW5ld0VwEhsKCX'\n    'N1Yl90aXRsZRgGIAEoCVIIc3ViVGl0bGUSEAoDcG9zGAcgASgDUgNwb3M=');\n\n@$core.Deprecated('Use formulaNodeDescriptor instead')\nconst FormulaNode$json = {\n  '1': 'FormulaNode',\n  '2': [\n    {\n      '1': 'latex_content',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.WordNode',\n      '10': 'latexContent'\n    },\n    {\n      '1': 'image_spec',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ImgInlineCfg',\n      '10': 'imageSpec'\n    },\n    {'1': 'img_url', '3': 4, '4': 1, '5': 9, '10': 'imgUrl'},\n  ],\n};\n\n/// Descriptor for `FormulaNode`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List formulaNodeDescriptor = $convert.base64Decode(\n    'CgtGb3JtdWxhTm9kZRJGCg1sYXRleF9jb250ZW50GAEgASgLMiEuYmlsaWJpbGkuYXBwLmR5bm'\n    'FtaWMudjIuV29yZE5vZGVSDGxhdGV4Q29udGVudBJECgppbWFnZV9zcGVjGAIgASgLMiUuYmls'\n    'aWJpbGkuYXBwLmR5bmFtaWMudjIuSW1nSW5saW5lQ2ZnUglpbWFnZVNwZWMSFwoHaW1nX3VybB'\n    'gEIAEoCVIGaW1nVXJs');\n\n@$core.Deprecated('Use goodsItemDescriptor instead')\nconst GoodsItem$json = {\n  '1': 'GoodsItem',\n  '2': [\n    {'1': 'cover', '3': 1, '4': 1, '5': 9, '10': 'cover'},\n    {\n      '1': 'schema_package_name',\n      '3': 2,\n      '4': 1,\n      '5': 9,\n      '10': 'schemaPackageName'\n    },\n    {'1': 'source_type', '3': 3, '4': 1, '5': 5, '10': 'sourceType'},\n    {'1': 'jump_url', '3': 4, '4': 1, '5': 9, '10': 'jumpUrl'},\n    {'1': 'jump_desc', '3': 5, '4': 1, '5': 9, '10': 'jumpDesc'},\n    {'1': 'title', '3': 6, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'brief', '3': 7, '4': 1, '5': 9, '10': 'brief'},\n    {'1': 'price', '3': 8, '4': 1, '5': 9, '10': 'price'},\n    {'1': 'item_id', '3': 9, '4': 1, '5': 3, '10': 'itemId'},\n    {'1': 'schema_url', '3': 10, '4': 1, '5': 9, '10': 'schemaUrl'},\n    {'1': 'open_white_list', '3': 11, '4': 3, '5': 9, '10': 'openWhiteList'},\n    {'1': 'user_web_v2', '3': 12, '4': 1, '5': 8, '10': 'userWebV2'},\n    {'1': 'ad_mark', '3': 13, '4': 1, '5': 9, '10': 'adMark'},\n    {'1': 'app_name', '3': 14, '4': 1, '5': 9, '10': 'appName'},\n    {\n      '1': 'jump_type',\n      '3': 15,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.GoodsJumpType',\n      '10': 'jumpType'\n    },\n    {\n      '1': 'cm_cache_passthrough',\n      '3': 16,\n      '4': 1,\n      '5': 9,\n      '10': 'cmCachePassthrough'\n    },\n  ],\n};\n\n/// Descriptor for `GoodsItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List goodsItemDescriptor = $convert.base64Decode(\n    'CglHb29kc0l0ZW0SFAoFY292ZXIYASABKAlSBWNvdmVyEi4KE3NjaGVtYV9wYWNrYWdlX25hbW'\n    'UYAiABKAlSEXNjaGVtYVBhY2thZ2VOYW1lEh8KC3NvdXJjZV90eXBlGAMgASgFUgpzb3VyY2VU'\n    'eXBlEhkKCGp1bXBfdXJsGAQgASgJUgdqdW1wVXJsEhsKCWp1bXBfZGVzYxgFIAEoCVIIanVtcE'\n    'Rlc2MSFAoFdGl0bGUYBiABKAlSBXRpdGxlEhQKBWJyaWVmGAcgASgJUgVicmllZhIUCgVwcmlj'\n    'ZRgIIAEoCVIFcHJpY2USFwoHaXRlbV9pZBgJIAEoA1IGaXRlbUlkEh0KCnNjaGVtYV91cmwYCi'\n    'ABKAlSCXNjaGVtYVVybBImCg9vcGVuX3doaXRlX2xpc3QYCyADKAlSDW9wZW5XaGl0ZUxpc3QS'\n    'HgoLdXNlcl93ZWJfdjIYDCABKAhSCXVzZXJXZWJWMhIXCgdhZF9tYXJrGA0gASgJUgZhZE1hcm'\n    'sSGQoIYXBwX25hbWUYDiABKAlSB2FwcE5hbWUSQwoJanVtcF90eXBlGA8gASgOMiYuYmlsaWJp'\n    'bGkuYXBwLmR5bmFtaWMudjIuR29vZHNKdW1wVHlwZVIIanVtcFR5cGUSMAoUY21fY2FjaGVfcG'\n    'Fzc3Rocm91Z2gYECABKAlSEmNtQ2FjaGVQYXNzdGhyb3VnaA==');\n\n@$core.Deprecated('Use guideBarInfoDescriptor instead')\nconst GuideBarInfo$json = {\n  '1': 'GuideBarInfo',\n  '2': [\n    {'1': 'show', '3': 1, '4': 1, '5': 5, '10': 'show'},\n    {'1': 'page', '3': 2, '4': 1, '5': 5, '10': 'page'},\n    {'1': 'position', '3': 3, '4': 1, '5': 5, '10': 'position'},\n    {'1': 'desc', '3': 4, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'jump_page', '3': 5, '4': 1, '5': 5, '10': 'jumpPage'},\n    {'1': 'jump_position', '3': 6, '4': 1, '5': 5, '10': 'jumpPosition'},\n  ],\n};\n\n/// Descriptor for `GuideBarInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List guideBarInfoDescriptor = $convert.base64Decode(\n    'CgxHdWlkZUJhckluZm8SEgoEc2hvdxgBIAEoBVIEc2hvdxISCgRwYWdlGAIgASgFUgRwYWdlEh'\n    'oKCHBvc2l0aW9uGAMgASgFUghwb3NpdGlvbhISCgRkZXNjGAQgASgJUgRkZXNjEhsKCWp1bXBf'\n    'cGFnZRgFIAEoBVIIanVtcFBhZ2USIwoNanVtcF9wb3NpdGlvbhgGIAEoBVIManVtcFBvc2l0aW'\n    '9u');\n\n@$core.Deprecated('Use highlightTextDescriptor instead')\nconst HighlightText$json = {\n  '1': 'HighlightText',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {\n      '1': 'text_style',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.HighlightTextStyle',\n      '10': 'textStyle'\n    },\n    {'1': 'jump_url', '3': 3, '4': 1, '5': 9, '10': 'jumpUrl'},\n    {'1': 'icon', '3': 4, '4': 1, '5': 9, '10': 'icon'},\n  ],\n};\n\n/// Descriptor for `HighlightText`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List highlightTextDescriptor = $convert.base64Decode(\n    'Cg1IaWdobGlnaHRUZXh0EhIKBHRleHQYASABKAlSBHRleHQSSgoKdGV4dF9zdHlsZRgCIAEoDj'\n    'IrLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkhpZ2hsaWdodFRleHRTdHlsZVIJdGV4dFN0eWxl'\n    'EhkKCGp1bXBfdXJsGAMgASgJUgdqdW1wVXJsEhIKBGljb24YBCABKAlSBGljb24=');\n\n@$core.Deprecated('Use homeSubscribeReplyDescriptor instead')\nconst HomeSubscribeReply$json = {\n  '1': 'HomeSubscribeReply',\n  '2': [\n    {\n      '1': 'online',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CampusOnlineStatus',\n      '10': 'online'\n    },\n  ],\n};\n\n/// Descriptor for `HomeSubscribeReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List homeSubscribeReplyDescriptor = $convert.base64Decode(\n    'ChJIb21lU3Vic2NyaWJlUmVwbHkSQwoGb25saW5lGAEgASgOMisuYmlsaWJpbGkuYXBwLmR5bm'\n    'FtaWMudjIuQ2FtcHVzT25saW5lU3RhdHVzUgZvbmxpbmU=');\n\n@$core.Deprecated('Use homeSubscribeReqDescriptor instead')\nconst HomeSubscribeReq$json = {\n  '1': 'HomeSubscribeReq',\n  '2': [\n    {'1': 'campus_id', '3': 1, '4': 1, '5': 3, '10': 'campusId'},\n    {'1': 'campus_name', '3': 2, '4': 1, '5': 9, '10': 'campusName'},\n  ],\n};\n\n/// Descriptor for `HomeSubscribeReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List homeSubscribeReqDescriptor = $convert.base64Decode(\n    'ChBIb21lU3Vic2NyaWJlUmVxEhsKCWNhbXB1c19pZBgBIAEoA1IIY2FtcHVzSWQSHwoLY2FtcH'\n    'VzX25hbWUYAiABKAlSCmNhbXB1c05hbWU=');\n\n@$core.Deprecated('Use iconBadgeDescriptor instead')\nconst IconBadge$json = {\n  '1': 'IconBadge',\n  '2': [\n    {'1': 'icon_bg_url', '3': 1, '4': 1, '5': 9, '10': 'iconBgUrl'},\n    {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},\n  ],\n};\n\n/// Descriptor for `IconBadge`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List iconBadgeDescriptor = $convert.base64Decode(\n    'CglJY29uQmFkZ2USHgoLaWNvbl9iZ191cmwYASABKAlSCWljb25CZ1VybBISCgR0ZXh0GAIgAS'\n    'gJUgR0ZXh0');\n\n@$core.Deprecated('Use iconButtonDescriptor instead')\nconst IconButton$json = {\n  '1': 'IconButton',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'icon_head', '3': 2, '4': 1, '5': 9, '10': 'iconHead'},\n    {'1': 'icon_tail', '3': 3, '4': 1, '5': 9, '10': 'iconTail'},\n    {'1': 'jump_uri', '3': 4, '4': 1, '5': 9, '10': 'jumpUri'},\n    {\n      '1': 'router_action',\n      '3': 5,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.RouterAction',\n      '10': 'routerAction'\n    },\n  ],\n};\n\n/// Descriptor for `IconButton`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List iconButtonDescriptor = $convert.base64Decode(\n    'CgpJY29uQnV0dG9uEhIKBHRleHQYASABKAlSBHRleHQSGwoJaWNvbl9oZWFkGAIgASgJUghpY2'\n    '9uSGVhZBIbCglpY29uX3RhaWwYAyABKAlSCGljb25UYWlsEhkKCGp1bXBfdXJpGAQgASgJUgdq'\n    'dW1wVXJpEkoKDXJvdXRlcl9hY3Rpb24YBSABKA4yJS5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi'\n    '5Sb3V0ZXJBY3Rpb25SDHJvdXRlckFjdGlvbg==');\n\n@$core.Deprecated('Use imageSetDescriptor instead')\nconst ImageSet$json = {\n  '1': 'ImageSet',\n  '2': [\n    {'1': 'img_day', '3': 1, '4': 1, '5': 9, '10': 'imgDay'},\n    {'1': 'img_dark', '3': 2, '4': 1, '5': 9, '10': 'imgDark'},\n  ],\n};\n\n/// Descriptor for `ImageSet`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List imageSetDescriptor = $convert.base64Decode(\n    'CghJbWFnZVNldBIXCgdpbWdfZGF5GAEgASgJUgZpbWdEYXkSGQoIaW1nX2RhcmsYAiABKAlSB2'\n    'ltZ0Rhcms=');\n\n@$core.Deprecated('Use imgInlineCfgDescriptor instead')\nconst ImgInlineCfg$json = {\n  '1': 'ImgInlineCfg',\n  '2': [\n    {'1': 'width', '3': 1, '4': 1, '5': 1, '10': 'width'},\n    {'1': 'height', '3': 2, '4': 1, '5': 1, '10': 'height'},\n    {\n      '1': 'color',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Colors',\n      '10': 'color'\n    },\n  ],\n};\n\n/// Descriptor for `ImgInlineCfg`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List imgInlineCfgDescriptor = $convert.base64Decode(\n    'CgxJbWdJbmxpbmVDZmcSFAoFd2lkdGgYASABKAFSBXdpZHRoEhYKBmhlaWdodBgCIAEoAVIGaG'\n    'VpZ2h0EjUKBWNvbG9yGAMgASgLMh8uYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQ29sb3JzUgVj'\n    'b2xvcg==');\n\n@$core.Deprecated('Use infoOGVDescriptor instead')\nconst InfoOGV$json = {\n  '1': 'InfoOGV',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'icon', '3': 3, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'sub_module', '3': 4, '4': 1, '5': 9, '10': 'subModule'},\n  ],\n};\n\n/// Descriptor for `InfoOGV`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List infoOGVDescriptor = $convert.base64Decode(\n    'CgdJbmZvT0dWEhQKBXRpdGxlGAEgASgJUgV0aXRsZRIQCgN1cmkYAiABKAlSA3VyaRISCgRpY2'\n    '9uGAMgASgJUgRpY29uEh0KCnN1Yl9tb2R1bGUYBCABKAlSCXN1Yk1vZHVsZQ==');\n\n@$core.Deprecated('Use interactionFaceDescriptor instead')\nconst InteractionFace$json = {\n  '1': 'InteractionFace',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'face', '3': 2, '4': 1, '5': 9, '10': 'face'},\n  ],\n};\n\n/// Descriptor for `InteractionFace`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List interactionFaceDescriptor = $convert.base64Decode(\n    'Cg9JbnRlcmFjdGlvbkZhY2USEAoDbWlkGAEgASgDUgNtaWQSEgoEZmFjZRgCIAEoCVIEZmFjZQ'\n    '==');\n\n@$core.Deprecated('Use interactionItemDescriptor instead')\nconst InteractionItem$json = {\n  '1': 'InteractionItem',\n  '2': [\n    {\n      '1': 'icon_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.LocalIconType',\n      '10': 'iconType'\n    },\n    {\n      '1': 'desc',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Description',\n      '10': 'desc'\n    },\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'dynamic_id', '3': 4, '4': 1, '5': 9, '10': 'dynamicId'},\n    {'1': 'comment_mid', '3': 6, '4': 1, '5': 3, '10': 'commentMid'},\n    {\n      '1': 'faces',\n      '3': 7,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.InteractionFace',\n      '10': 'faces'\n    },\n    {\n      '1': 'stat',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.InteractionStat',\n      '10': 'stat'\n    },\n    {'1': 'icon', '3': 9, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'tail_icon', '3': 10, '4': 1, '5': 9, '10': 'tailIcon'},\n    {\n      '1': 'tail_desc',\n      '3': 11,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Description',\n      '10': 'tailDesc'\n    },\n    {\n      '1': 'extend_click_param',\n      '3': 12,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.InteractionItem.ExtendClickParamEntry',\n      '10': 'extendClickParam'\n    },\n  ],\n  '3': [InteractionItem_ExtendClickParamEntry$json],\n};\n\n@$core.Deprecated('Use interactionItemDescriptor instead')\nconst InteractionItem_ExtendClickParamEntry$json = {\n  '1': 'ExtendClickParamEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `InteractionItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List interactionItemDescriptor = $convert.base64Decode(\n    'Cg9JbnRlcmFjdGlvbkl0ZW0SQwoJaWNvbl90eXBlGAEgASgOMiYuYmlsaWJpbGkuYXBwLmR5bm'\n    'FtaWMudjIuTG9jYWxJY29uVHlwZVIIaWNvblR5cGUSOAoEZGVzYxgCIAMoCzIkLmJpbGliaWxp'\n    'LmFwcC5keW5hbWljLnYyLkRlc2NyaXB0aW9uUgRkZXNjEhAKA3VyaRgDIAEoCVIDdXJpEh0KCm'\n    'R5bmFtaWNfaWQYBCABKAlSCWR5bmFtaWNJZBIfCgtjb21tZW50X21pZBgGIAEoA1IKY29tbWVu'\n    'dE1pZBI+CgVmYWNlcxgHIAMoCzIoLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkludGVyYWN0aW'\n    '9uRmFjZVIFZmFjZXMSPAoEc3RhdBgIIAEoCzIoLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLklu'\n    'dGVyYWN0aW9uU3RhdFIEc3RhdBISCgRpY29uGAkgASgJUgRpY29uEhsKCXRhaWxfaWNvbhgKIA'\n    'EoCVIIdGFpbEljb24SQQoJdGFpbF9kZXNjGAsgAygLMiQuYmlsaWJpbGkuYXBwLmR5bmFtaWMu'\n    'djIuRGVzY3JpcHRpb25SCHRhaWxEZXNjEmwKEmV4dGVuZF9jbGlja19wYXJhbRgMIAMoCzI+Lm'\n    'JpbGliaWxpLmFwcC5keW5hbWljLnYyLkludGVyYWN0aW9uSXRlbS5FeHRlbmRDbGlja1BhcmFt'\n    'RW50cnlSEGV4dGVuZENsaWNrUGFyYW0aQwoVRXh0ZW5kQ2xpY2tQYXJhbUVudHJ5EhAKA2tleR'\n    'gBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAE=');\n\n@$core.Deprecated('Use interactionStatDescriptor instead')\nconst InteractionStat$json = {\n  '1': 'InteractionStat',\n  '2': [\n    {'1': 'like', '3': 1, '4': 1, '5': 3, '10': 'like'},\n    {'1': 'forward', '3': 2, '4': 1, '5': 3, '10': 'forward'},\n  ],\n};\n\n/// Descriptor for `InteractionStat`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List interactionStatDescriptor = $convert.base64Decode(\n    'Cg9JbnRlcmFjdGlvblN0YXQSEgoEbGlrZRgBIAEoA1IEbGlrZRIYCgdmb3J3YXJkGAIgASgDUg'\n    'dmb3J3YXJk');\n\n@$core.Deprecated('Use lbsPoiDetailDescriptor instead')\nconst LbsPoiDetail$json = {\n  '1': 'LbsPoiDetail',\n  '2': [\n    {'1': 'poi', '3': 1, '4': 1, '5': 9, '10': 'poi'},\n    {'1': 'type', '3': 2, '4': 1, '5': 3, '10': 'type'},\n    {'1': 'base_pic', '3': 3, '4': 3, '5': 9, '10': 'basePic'},\n    {'1': 'cover', '3': 4, '4': 3, '5': 9, '10': 'cover'},\n    {'1': 'address', '3': 5, '4': 1, '5': 9, '10': 'address'},\n    {'1': 'title', '3': 6, '4': 1, '5': 9, '10': 'title'},\n  ],\n};\n\n/// Descriptor for `LbsPoiDetail`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List lbsPoiDetailDescriptor = $convert.base64Decode(\n    'CgxMYnNQb2lEZXRhaWwSEAoDcG9pGAEgASgJUgNwb2kSEgoEdHlwZRgCIAEoA1IEdHlwZRIZCg'\n    'hiYXNlX3BpYxgDIAMoCVIHYmFzZVBpYxIUCgVjb3ZlchgEIAMoCVIFY292ZXISGAoHYWRkcmVz'\n    'cxgFIAEoCVIHYWRkcmVzcxIUCgV0aXRsZRgGIAEoCVIFdGl0bGU=');\n\n@$core.Deprecated('Use lbsPoiReplyDescriptor instead')\nconst LbsPoiReply$json = {\n  '1': 'LbsPoiReply',\n  '2': [\n    {'1': 'has_more', '3': 1, '4': 1, '5': 8, '10': 'hasMore'},\n    {'1': 'offset', '3': 2, '4': 1, '5': 9, '10': 'offset'},\n    {\n      '1': 'detail',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.LbsPoiDetail',\n      '10': 'detail'\n    },\n    {\n      '1': 'list',\n      '3': 4,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynamicItem',\n      '10': 'list'\n    },\n  ],\n};\n\n/// Descriptor for `LbsPoiReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List lbsPoiReplyDescriptor = $convert.base64Decode(\n    'CgtMYnNQb2lSZXBseRIZCghoYXNfbW9yZRgBIAEoCFIHaGFzTW9yZRIWCgZvZmZzZXQYAiABKA'\n    'lSBm9mZnNldBI9CgZkZXRhaWwYAyABKAsyJS5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5MYnNQ'\n    'b2lEZXRhaWxSBmRldGFpbBI4CgRsaXN0GAQgAygLMiQuYmlsaWJpbGkuYXBwLmR5bmFtaWMudj'\n    'IuRHluYW1pY0l0ZW1SBGxpc3Q=');\n\n@$core.Deprecated('Use lbsPoiReqDescriptor instead')\nconst LbsPoiReq$json = {\n  '1': 'LbsPoiReq',\n  '2': [\n    {'1': 'poi', '3': 1, '4': 1, '5': 9, '10': 'poi'},\n    {'1': 'type', '3': 2, '4': 1, '5': 3, '10': 'type'},\n    {'1': 'offset', '3': 3, '4': 1, '5': 9, '10': 'offset'},\n    {\n      '1': 'refresh_type',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.Refresh',\n      '10': 'refreshType'\n    },\n    {'1': 'local_time', '3': 5, '4': 1, '5': 5, '10': 'localTime'},\n    {\n      '1': 'player_args',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n  ],\n};\n\n/// Descriptor for `LbsPoiReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List lbsPoiReqDescriptor = $convert.base64Decode(\n    'CglMYnNQb2lSZXESEAoDcG9pGAEgASgJUgNwb2kSEgoEdHlwZRgCIAEoA1IEdHlwZRIWCgZvZm'\n    'ZzZXQYAyABKAlSBm9mZnNldBJDCgxyZWZyZXNoX3R5cGUYBCABKA4yIC5iaWxpYmlsaS5hcHAu'\n    'ZHluYW1pYy52Mi5SZWZyZXNoUgtyZWZyZXNoVHlwZRIdCgpsb2NhbF90aW1lGAUgASgFUglsb2'\n    'NhbFRpbWUSTwoLcGxheWVyX2FyZ3MYBiABKAsyLi5iaWxpYmlsaS5hcHAuYXJjaGl2ZS5taWRk'\n    'bGV3YXJlLnYxLlBsYXllckFyZ3NSCnBsYXllckFyZ3M=');\n\n@$core.Deprecated('Use legacyTopicFeedReplyDescriptor instead')\nconst LegacyTopicFeedReply$json = {\n  '1': 'LegacyTopicFeedReply',\n  '2': [\n    {\n      '1': 'list',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynamicItem',\n      '10': 'list'\n    },\n    {'1': 'has_more', '3': 2, '4': 1, '5': 8, '10': 'hasMore'},\n    {'1': 'offset', '3': 3, '4': 1, '5': 9, '10': 'offset'},\n    {\n      '1': 'supported_sort_types',\n      '3': 4,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.SortType',\n      '10': 'supportedSortTypes'\n    },\n    {\n      '1': 'feed_card_filters',\n      '3': 5,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.SortType',\n      '10': 'feedCardFilters'\n    },\n  ],\n};\n\n/// Descriptor for `LegacyTopicFeedReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List legacyTopicFeedReplyDescriptor = $convert.base64Decode(\n    'ChRMZWdhY3lUb3BpY0ZlZWRSZXBseRI4CgRsaXN0GAEgAygLMiQuYmlsaWJpbGkuYXBwLmR5bm'\n    'FtaWMudjIuRHluYW1pY0l0ZW1SBGxpc3QSGQoIaGFzX21vcmUYAiABKAhSB2hhc01vcmUSFgoG'\n    'b2Zmc2V0GAMgASgJUgZvZmZzZXQSUwoUc3VwcG9ydGVkX3NvcnRfdHlwZXMYBCADKAsyIS5iaW'\n    'xpYmlsaS5hcHAuZHluYW1pYy52Mi5Tb3J0VHlwZVISc3VwcG9ydGVkU29ydFR5cGVzEk0KEWZl'\n    'ZWRfY2FyZF9maWx0ZXJzGAUgAygLMiEuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuU29ydFR5cG'\n    'VSD2ZlZWRDYXJkRmlsdGVycw==');\n\n@$core.Deprecated('Use legacyTopicFeedReqDescriptor instead')\nconst LegacyTopicFeedReq$json = {\n  '1': 'LegacyTopicFeedReq',\n  '2': [\n    {'1': 'topic_id', '3': 1, '4': 1, '5': 3, '10': 'topicId'},\n    {'1': 'topic_name', '3': 2, '4': 1, '5': 9, '10': 'topicName'},\n    {'1': 'offset', '3': 3, '4': 1, '5': 9, '10': 'offset'},\n    {\n      '1': 'sort_type',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.SortType',\n      '10': 'sortType'\n    },\n    {\n      '1': 'card_filter',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.SortType',\n      '10': 'cardFilter'\n    },\n  ],\n};\n\n/// Descriptor for `LegacyTopicFeedReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List legacyTopicFeedReqDescriptor = $convert.base64Decode(\n    'ChJMZWdhY3lUb3BpY0ZlZWRSZXESGQoIdG9waWNfaWQYASABKANSB3RvcGljSWQSHQoKdG9waW'\n    'NfbmFtZRgCIAEoCVIJdG9waWNOYW1lEhYKBm9mZnNldBgDIAEoCVIGb2Zmc2V0Ej4KCXNvcnRf'\n    'dHlwZRgEIAEoCzIhLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlNvcnRUeXBlUghzb3J0VHlwZR'\n    'JCCgtjYXJkX2ZpbHRlchgFIAEoCzIhLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlNvcnRUeXBl'\n    'UgpjYXJkRmlsdGVy');\n\n@$core.Deprecated('Use likeAnimationDescriptor instead')\nconst LikeAnimation$json = {\n  '1': 'LikeAnimation',\n  '2': [\n    {'1': 'begin', '3': 1, '4': 1, '5': 9, '10': 'begin'},\n    {'1': 'proc', '3': 2, '4': 1, '5': 9, '10': 'proc'},\n    {'1': 'end', '3': 3, '4': 1, '5': 9, '10': 'end'},\n    {'1': 'like_icon_id', '3': 4, '4': 1, '5': 3, '10': 'likeIconId'},\n  ],\n};\n\n/// Descriptor for `LikeAnimation`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List likeAnimationDescriptor = $convert.base64Decode(\n    'Cg1MaWtlQW5pbWF0aW9uEhQKBWJlZ2luGAEgASgJUgViZWdpbhISCgRwcm9jGAIgASgJUgRwcm'\n    '9jEhAKA2VuZBgDIAEoCVIDZW5kEiAKDGxpa2VfaWNvbl9pZBgEIAEoA1IKbGlrZUljb25JZA==');\n\n@$core.Deprecated('Use likeInfoDescriptor instead')\nconst LikeInfo$json = {\n  '1': 'LikeInfo',\n  '2': [\n    {\n      '1': 'animation',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.LikeAnimation',\n      '10': 'animation'\n    },\n    {'1': 'is_like', '3': 2, '4': 1, '5': 8, '10': 'isLike'},\n  ],\n};\n\n/// Descriptor for `LikeInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List likeInfoDescriptor = $convert.base64Decode(\n    'CghMaWtlSW5mbxJECglhbmltYXRpb24YASABKAsyJi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi'\n    '5MaWtlQW5pbWF0aW9uUglhbmltYXRpb24SFwoHaXNfbGlrZRgCIAEoCFIGaXNMaWtl');\n\n@$core.Deprecated('Use likeListReplyDescriptor instead')\nconst LikeListReply$json = {\n  '1': 'LikeListReply',\n  '2': [\n    {\n      '1': 'list',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleAuthor',\n      '10': 'list'\n    },\n    {'1': 'has_more', '3': 2, '4': 1, '5': 8, '10': 'hasMore'},\n    {'1': 'total_count', '3': 3, '4': 1, '5': 3, '10': 'totalCount'},\n  ],\n};\n\n/// Descriptor for `LikeListReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List likeListReplyDescriptor = $convert.base64Decode(\n    'Cg1MaWtlTGlzdFJlcGx5EjkKBGxpc3QYASADKAsyJS5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi'\n    '5Nb2R1bGVBdXRob3JSBGxpc3QSGQoIaGFzX21vcmUYAiABKAhSB2hhc01vcmUSHwoLdG90YWxf'\n    'Y291bnQYAyABKANSCnRvdGFsQ291bnQ=');\n\n@$core.Deprecated('Use likeListReqDescriptor instead')\nconst LikeListReq$json = {\n  '1': 'LikeListReq',\n  '2': [\n    {'1': 'dynamic_id', '3': 1, '4': 1, '5': 9, '10': 'dynamicId'},\n    {'1': 'dyn_type', '3': 2, '4': 1, '5': 3, '10': 'dynType'},\n    {'1': 'rid', '3': 3, '4': 1, '5': 3, '10': 'rid'},\n    {'1': 'uid_offset', '3': 4, '4': 1, '5': 3, '10': 'uidOffset'},\n    {'1': 'page', '3': 5, '4': 1, '5': 5, '10': 'page'},\n  ],\n};\n\n/// Descriptor for `LikeListReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List likeListReqDescriptor = $convert.base64Decode(\n    'CgtMaWtlTGlzdFJlcRIdCgpkeW5hbWljX2lkGAEgASgJUglkeW5hbWljSWQSGQoIZHluX3R5cG'\n    'UYAiABKANSB2R5blR5cGUSEAoDcmlkGAMgASgDUgNyaWQSHQoKdWlkX29mZnNldBgEIAEoA1IJ'\n    'dWlkT2Zmc2V0EhIKBHBhZ2UYBSABKAVSBHBhZ2U=');\n\n@$core.Deprecated('Use likeUserDescriptor instead')\nconst LikeUser$json = {\n  '1': 'LikeUser',\n  '2': [\n    {'1': 'uid', '3': 1, '4': 1, '5': 3, '10': 'uid'},\n    {'1': 'uname', '3': 2, '4': 1, '5': 9, '10': 'uname'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n  ],\n};\n\n/// Descriptor for `LikeUser`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List likeUserDescriptor = $convert.base64Decode(\n    'CghMaWtlVXNlchIQCgN1aWQYASABKANSA3VpZBIUCgV1bmFtZRgCIAEoCVIFdW5hbWUSEAoDdX'\n    'JpGAMgASgJUgN1cmk=');\n\n@$core.Deprecated('Use lineParagraphDescriptor instead')\nconst LineParagraph$json = {\n  '1': 'LineParagraph',\n  '2': [\n    {\n      '1': 'pic',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynDrawItem',\n      '10': 'pic'\n    },\n  ],\n};\n\n/// Descriptor for `LineParagraph`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List lineParagraphDescriptor = $convert.base64Decode(\n    'Cg1MaW5lUGFyYWdyYXBoEjkKA3BpYxgBIAEoCzInLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLk'\n    '1kbER5bkRyYXdJdGVtUgNwaWM=');\n\n@$core.Deprecated('Use linkNodeDescriptor instead')\nconst LinkNode$json = {\n  '1': 'LinkNode',\n  '2': [\n    {\n      '1': 'show_text',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.WordNode',\n      '10': 'showText'\n    },\n    {'1': 'link', '3': 2, '4': 1, '5': 9, '10': 'link'},\n    {'1': 'icon', '3': 3, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'icon_suffix', '3': 4, '4': 1, '5': 9, '10': 'iconSuffix'},\n    {'1': 'link_type', '3': 5, '4': 1, '5': 9, '10': 'linkType'},\n    {\n      '1': 'link_type_enum',\n      '3': 6,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.LinkNodeType',\n      '10': 'linkTypeEnum'\n    },\n    {'1': 'biz_id', '3': 7, '4': 1, '5': 9, '10': 'bizId'},\n    {'1': 'timestamp', '3': 8, '4': 1, '5': 3, '10': 'timestamp'},\n    {\n      '1': 'goods_item',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.GoodsItem',\n      '10': 'goodsItem'\n    },\n    {\n      '1': 'note_video_ts',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.NoteVideoTS',\n      '10': 'noteVideoTs'\n    },\n    {\n      '1': 'biz_data',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.google.protobuf.Any',\n      '10': 'bizData'\n    },\n    {\n      '1': 'link_pics',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynDraw',\n      '10': 'linkPics'\n    },\n  ],\n};\n\n/// Descriptor for `LinkNode`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List linkNodeDescriptor = $convert.base64Decode(\n    'CghMaW5rTm9kZRI+CglzaG93X3RleHQYASABKAsyIS5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi'\n    '5Xb3JkTm9kZVIIc2hvd1RleHQSEgoEbGluaxgCIAEoCVIEbGluaxISCgRpY29uGAMgASgJUgRp'\n    'Y29uEh8KC2ljb25fc3VmZml4GAQgASgJUgppY29uU3VmZml4EhsKCWxpbmtfdHlwZRgFIAEoCV'\n    'IIbGlua1R5cGUSSwoObGlua190eXBlX2VudW0YBiABKA4yJS5iaWxpYmlsaS5hcHAuZHluYW1p'\n    'Yy52Mi5MaW5rTm9kZVR5cGVSDGxpbmtUeXBlRW51bRIVCgZiaXpfaWQYByABKAlSBWJpeklkEh'\n    'wKCXRpbWVzdGFtcBgIIAEoA1IJdGltZXN0YW1wEkEKCmdvb2RzX2l0ZW0YCSABKAsyIi5iaWxp'\n    'YmlsaS5hcHAuZHluYW1pYy52Mi5Hb29kc0l0ZW1SCWdvb2RzSXRlbRJICg1ub3RlX3ZpZGVvX3'\n    'RzGAogASgLMiQuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuTm90ZVZpZGVvVFNSC25vdGVWaWRl'\n    'b1RzEi8KCGJpel9kYXRhGAsgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueVIHYml6RGF0YRJACg'\n    'lsaW5rX3BpY3MYDCABKAsyIy5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5NZGxEeW5EcmF3Ughs'\n    'aW5rUGljcw==');\n\n@$core.Deprecated('Use listCreationReqDescriptor instead')\nconst ListCreationReq$json = {\n  '1': 'ListCreationReq',\n  '2': [\n    {\n      '1': 'preference',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.SelectedClassificationAndSortType',\n      '10': 'preference'\n    },\n    {'1': 'local_time', '3': 2, '4': 1, '5': 5, '10': 'localTime'},\n    {\n      '1': 'pagination',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.pagination.Pagination',\n      '10': 'pagination'\n    },\n  ],\n};\n\n/// Descriptor for `ListCreationReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List listCreationReqDescriptor = $convert.base64Decode(\n    'Cg9MaXN0Q3JlYXRpb25SZXESWgoKcHJlZmVyZW5jZRgBIAEoCzI6LmJpbGliaWxpLmFwcC5keW'\n    '5hbWljLnYyLlNlbGVjdGVkQ2xhc3NpZmljYXRpb25BbmRTb3J0VHlwZVIKcHJlZmVyZW5jZRId'\n    'Cgpsb2NhbF90aW1lGAIgASgFUglsb2NhbFRpbWUSPwoKcGFnaW5hdGlvbhgDIAEoCzIfLmJpbG'\n    'liaWxpLnBhZ2luYXRpb24uUGFnaW5hdGlvblIKcGFnaW5hdGlvbg==');\n\n@$core.Deprecated('Use listCreationRespDescriptor instead')\nconst ListCreationResp$json = {\n  '1': 'ListCreationResp',\n  '2': [\n    {\n      '1': 'classifications',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CreationClassification',\n      '10': 'classifications'\n    },\n    {\n      '1': 'sort_types',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CreationSortType',\n      '10': 'sortTypes'\n    },\n    {\n      '1': 'next_page',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.pagination.PaginationReply',\n      '10': 'nextPage'\n    },\n    {\n      '1': 'creation_list',\n      '3': 4,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OpusCreationItem',\n      '10': 'creationList'\n    },\n  ],\n};\n\n/// Descriptor for `ListCreationResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List listCreationRespDescriptor = $convert.base64Decode(\n    'ChBMaXN0Q3JlYXRpb25SZXNwElkKD2NsYXNzaWZpY2F0aW9ucxgBIAMoCzIvLmJpbGliaWxpLm'\n    'FwcC5keW5hbWljLnYyLkNyZWF0aW9uQ2xhc3NpZmljYXRpb25SD2NsYXNzaWZpY2F0aW9ucxJI'\n    'Cgpzb3J0X3R5cGVzGAIgAygLMikuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQ3JlYXRpb25Tb3'\n    'J0VHlwZVIJc29ydFR5cGVzEkEKCW5leHRfcGFnZRgDIAEoCzIkLmJpbGliaWxpLnBhZ2luYXRp'\n    'b24uUGFnaW5hdGlvblJlcGx5UghuZXh0UGFnZRJOCg1jcmVhdGlvbl9saXN0GAQgAygLMikuYm'\n    'lsaWJpbGkuYXBwLmR5bmFtaWMudjIuT3B1c0NyZWF0aW9uSXRlbVIMY3JlYXRpb25MaXN0');\n\n@$core.Deprecated('Use listFavReqDescriptor instead')\nconst ListFavReq$json = {\n  '1': 'ListFavReq',\n  '2': [\n    {'1': 'local_time', '3': 1, '4': 1, '5': 5, '10': 'localTime'},\n    {\n      '1': 'pagination',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.pagination.Pagination',\n      '10': 'pagination'\n    },\n  ],\n};\n\n/// Descriptor for `ListFavReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List listFavReqDescriptor = $convert.base64Decode(\n    'CgpMaXN0RmF2UmVxEh0KCmxvY2FsX3RpbWUYASABKAVSCWxvY2FsVGltZRI/CgpwYWdpbmF0aW'\n    '9uGAIgASgLMh8uYmlsaWJpbGkucGFnaW5hdGlvbi5QYWdpbmF0aW9uUgpwYWdpbmF0aW9u');\n\n@$core.Deprecated('Use listFavRespDescriptor instead')\nconst ListFavResp$json = {\n  '1': 'ListFavResp',\n  '2': [\n    {\n      '1': 'item_list',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OpusFavItem',\n      '10': 'itemList'\n    },\n    {\n      '1': 'next_page',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.pagination.PaginationReply',\n      '10': 'nextPage'\n    },\n  ],\n};\n\n/// Descriptor for `ListFavResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List listFavRespDescriptor = $convert.base64Decode(\n    'CgtMaXN0RmF2UmVzcBJBCglpdGVtX2xpc3QYASADKAsyJC5iaWxpYmlsaS5hcHAuZHluYW1pYy'\n    '52Mi5PcHVzRmF2SXRlbVIIaXRlbUxpc3QSQQoJbmV4dF9wYWdlGAIgASgLMiQuYmlsaWJpbGku'\n    'cGFnaW5hdGlvbi5QYWdpbmF0aW9uUmVwbHlSCG5leHRQYWdl');\n\n@$core.Deprecated('Use liveInfoDescriptor instead')\nconst LiveInfo$json = {\n  '1': 'LiveInfo',\n  '2': [\n    {'1': 'is_living', '3': 1, '4': 1, '5': 5, '10': 'isLiving'},\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n    {\n      '1': 'live_state',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.LiveState',\n      '10': 'liveState'\n    },\n  ],\n};\n\n/// Descriptor for `LiveInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List liveInfoDescriptor = $convert.base64Decode(\n    'CghMaXZlSW5mbxIbCglpc19saXZpbmcYASABKAVSCGlzTGl2aW5nEhAKA3VyaRgCIAEoCVIDdX'\n    'JpEkEKCmxpdmVfc3RhdGUYAyABKA4yIi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5MaXZlU3Rh'\n    'dGVSCWxpdmVTdGF0ZQ==');\n\n@$core.Deprecated('Use livePendantDescriptor instead')\nconst LivePendant$json = {\n  '1': 'LivePendant',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'icon', '3': 2, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'pendant_id', '3': 3, '4': 1, '5': 3, '10': 'pendantId'},\n  ],\n};\n\n/// Descriptor for `LivePendant`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List livePendantDescriptor = $convert.base64Decode(\n    'CgtMaXZlUGVuZGFudBISCgR0ZXh0GAEgASgJUgR0ZXh0EhIKBGljb24YAiABKAlSBGljb24SHQ'\n    'oKcGVuZGFudF9pZBgDIAEoA1IJcGVuZGFudElk');\n\n@$core.Deprecated('Use mangaLikeBrowserGuidanceDescriptor instead')\nconst MangaLikeBrowserGuidance$json = {\n  '1': 'MangaLikeBrowserGuidance',\n  '2': [\n    {\n      '1': 'show_page_right_to_left_guidance',\n      '3': 1,\n      '4': 1,\n      '5': 8,\n      '10': 'showPageRightToLeftGuidance'\n    },\n    {\n      '1': 'page_right_to_left_guidance_text',\n      '3': 2,\n      '4': 1,\n      '5': 9,\n      '10': 'pageRightToLeftGuidanceText'\n    },\n  ],\n};\n\n/// Descriptor for `MangaLikeBrowserGuidance`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mangaLikeBrowserGuidanceDescriptor = $convert.base64Decode(\n    'ChhNYW5nYUxpa2VCcm93c2VyR3VpZGFuY2USRQogc2hvd19wYWdlX3JpZ2h0X3RvX2xlZnRfZ3'\n    'VpZGFuY2UYASABKAhSG3Nob3dQYWdlUmlnaHRUb0xlZnRHdWlkYW5jZRJFCiBwYWdlX3JpZ2h0'\n    'X3RvX2xlZnRfZ3VpZGFuY2VfdGV4dBgCIAEoCVIbcGFnZVJpZ2h0VG9MZWZ0R3VpZGFuY2VUZX'\n    'h0');\n\n@$core.Deprecated('Use mangaLikePicDescriptor instead')\nconst MangaLikePic$json = {\n  '1': 'MangaLikePic',\n  '2': [\n    {\n      '1': 'pic',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ProtectedStaticResource',\n      '10': 'pic'\n    },\n    {'1': 'width', '3': 2, '4': 1, '5': 3, '10': 'width'},\n    {'1': 'height', '3': 3, '4': 1, '5': 3, '10': 'height'},\n  ],\n};\n\n/// Descriptor for `MangaLikePic`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mangaLikePicDescriptor = $convert.base64Decode(\n    'CgxNYW5nYUxpa2VQaWMSQgoDcGljGAEgASgLMjAuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuUH'\n    'JvdGVjdGVkU3RhdGljUmVzb3VyY2VSA3BpYxIUCgV3aWR0aBgCIAEoA1IFd2lkdGgSFgoGaGVp'\n    'Z2h0GAMgASgDUgZoZWlnaHQ=');\n\n@$core.Deprecated('Use mangaPropertyDescriptor instead')\nconst MangaProperty$json = {\n  '1': 'MangaProperty',\n  '2': [\n    {'1': 'ep_id', '3': 1, '4': 1, '5': 3, '10': 'epId'},\n    {'1': 'manga_id', '3': 2, '4': 1, '5': 3, '10': 'mangaId'},\n    {\n      '1': 'is_premium_content',\n      '3': 3,\n      '4': 1,\n      '5': 8,\n      '10': 'isPremiumContent'\n    },\n    {'1': 'is_payment_needed', '3': 4, '4': 1, '5': 8, '10': 'isPaymentNeeded'},\n  ],\n};\n\n/// Descriptor for `MangaProperty`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mangaPropertyDescriptor = $convert.base64Decode(\n    'Cg1NYW5nYVByb3BlcnR5EhMKBWVwX2lkGAEgASgDUgRlcElkEhkKCG1hbmdhX2lkGAIgASgDUg'\n    'dtYW5nYUlkEiwKEmlzX3ByZW1pdW1fY29udGVudBgDIAEoCFIQaXNQcmVtaXVtQ29udGVudBIq'\n    'ChFpc19wYXltZW50X25lZWRlZBgEIAEoCFIPaXNQYXltZW50TmVlZGVk');\n\n@$core.Deprecated('Use matchTeamDescriptor instead')\nconst MatchTeam$json = {\n  '1': 'MatchTeam',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'cover', '3': 3, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'color', '3': 4, '4': 1, '5': 9, '10': 'color'},\n    {'1': 'night_color', '3': 5, '4': 1, '5': 9, '10': 'nightColor'},\n  ],\n};\n\n/// Descriptor for `MatchTeam`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List matchTeamDescriptor = $convert.base64Decode(\n    'CglNYXRjaFRlYW0SDgoCaWQYASABKANSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSFAoFY292ZX'\n    'IYAyABKAlSBWNvdmVyEhQKBWNvbG9yGAQgASgJUgVjb2xvchIfCgtuaWdodF9jb2xvchgFIAEo'\n    'CVIKbmlnaHRDb2xvcg==');\n\n@$core.Deprecated('Use mdlDynAppletDescriptor instead')\nconst MdlDynApplet$json = {\n  '1': 'MdlDynApplet',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'title', '3': 4, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'sub_title', '3': 5, '4': 1, '5': 9, '10': 'subTitle'},\n    {'1': 'cover', '3': 6, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'icon', '3': 7, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'label', '3': 8, '4': 1, '5': 9, '10': 'label'},\n    {'1': 'button_title', '3': 9, '4': 1, '5': 9, '10': 'buttonTitle'},\n  ],\n};\n\n/// Descriptor for `MdlDynApplet`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mdlDynAppletDescriptor = $convert.base64Decode(\n    'CgxNZGxEeW5BcHBsZXQSDgoCaWQYASABKANSAmlkEhAKA3VyaRgCIAEoCVIDdXJpEhQKBXRpdG'\n    'xlGAQgASgJUgV0aXRsZRIbCglzdWJfdGl0bGUYBSABKAlSCHN1YlRpdGxlEhQKBWNvdmVyGAYg'\n    'ASgJUgVjb3ZlchISCgRpY29uGAcgASgJUgRpY29uEhQKBWxhYmVsGAggASgJUgVsYWJlbBIhCg'\n    'xidXR0b25fdGl0bGUYCSABKAlSC2J1dHRvblRpdGxl');\n\n@$core.Deprecated('Use mdlDynArchiveDescriptor instead')\nconst MdlDynArchive$json = {\n  '1': 'MdlDynArchive',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 2, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'cover_left_text1', '3': 4, '4': 1, '5': 9, '10': 'coverLeftText1'},\n    {'1': 'cover_left_text2', '3': 5, '4': 1, '5': 9, '10': 'coverLeftText2'},\n    {'1': 'cover_left_text3', '3': 6, '4': 1, '5': 9, '10': 'coverLeftText3'},\n    {'1': 'avid', '3': 7, '4': 1, '5': 3, '10': 'avid'},\n    {'1': 'cid', '3': 8, '4': 1, '5': 3, '10': 'cid'},\n    {\n      '1': 'media_type',\n      '3': 9,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.MediaType',\n      '10': 'mediaType'\n    },\n    {\n      '1': 'dimension',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Dimension',\n      '10': 'dimension'\n    },\n    {\n      '1': 'badge',\n      '3': 11,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.VideoBadge',\n      '10': 'badge'\n    },\n    {'1': 'can_play', '3': 12, '4': 1, '5': 8, '10': 'canPlay'},\n    {\n      '1': 'stype',\n      '3': 13,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.VideoType',\n      '10': 'stype'\n    },\n    {'1': 'is_p_g_c', '3': 14, '4': 1, '5': 8, '10': 'isPGC'},\n    {'1': 'inline_u_r_l', '3': 15, '4': 1, '5': 9, '10': 'inlineURL'},\n    {'1': 'episode_id', '3': 16, '4': 1, '5': 3, '10': 'episodeId'},\n    {'1': 'sub_type', '3': 17, '4': 1, '5': 5, '10': 'subType'},\n    {'1': 'pgc_season_id', '3': 18, '4': 1, '5': 3, '10': 'pgcSeasonId'},\n    {'1': 'play_icon', '3': 19, '4': 1, '5': 9, '10': 'playIcon'},\n    {'1': 'duration', '3': 20, '4': 1, '5': 3, '10': 'duration'},\n    {'1': 'jump_url', '3': 21, '4': 1, '5': 9, '10': 'jumpUrl'},\n    {'1': 'is_preview', '3': 22, '4': 1, '5': 8, '10': 'isPreview'},\n    {\n      '1': 'badge_category',\n      '3': 23,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.VideoBadge',\n      '10': 'badgeCategory'\n    },\n    {'1': 'is_feature', '3': 24, '4': 1, '5': 8, '10': 'isFeature'},\n    {\n      '1': 'reserve_type',\n      '3': 25,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.ReserveType',\n      '10': 'reserveType'\n    },\n    {'1': 'bvid', '3': 26, '4': 1, '5': 9, '10': 'bvid'},\n    {'1': 'view', '3': 27, '4': 1, '5': 5, '10': 'view'},\n    {\n      '1': 'show_premiere_badge',\n      '3': 28,\n      '4': 1,\n      '5': 8,\n      '10': 'showPremiereBadge'\n    },\n    {'1': 'premiere_card', '3': 29, '4': 1, '5': 8, '10': 'premiereCard'},\n    {'1': 'show_progress', '3': 30, '4': 1, '5': 8, '10': 'showProgress'},\n    {'1': 'part_duration', '3': 31, '4': 1, '5': 3, '10': 'partDuration'},\n    {'1': 'part_progress', '3': 32, '4': 1, '5': 3, '10': 'partProgress'},\n  ],\n};\n\n/// Descriptor for `MdlDynArchive`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mdlDynArchiveDescriptor = $convert.base64Decode(\n    'Cg1NZGxEeW5BcmNoaXZlEhQKBXRpdGxlGAEgASgJUgV0aXRsZRIUCgVjb3ZlchgCIAEoCVIFY2'\n    '92ZXISEAoDdXJpGAMgASgJUgN1cmkSKAoQY292ZXJfbGVmdF90ZXh0MRgEIAEoCVIOY292ZXJM'\n    'ZWZ0VGV4dDESKAoQY292ZXJfbGVmdF90ZXh0MhgFIAEoCVIOY292ZXJMZWZ0VGV4dDISKAoQY2'\n    '92ZXJfbGVmdF90ZXh0MxgGIAEoCVIOY292ZXJMZWZ0VGV4dDMSEgoEYXZpZBgHIAEoA1IEYXZp'\n    'ZBIQCgNjaWQYCCABKANSA2NpZBJBCgptZWRpYV90eXBlGAkgASgOMiIuYmlsaWJpbGkuYXBwLm'\n    'R5bmFtaWMudjIuTWVkaWFUeXBlUgltZWRpYVR5cGUSQAoJZGltZW5zaW9uGAogASgLMiIuYmls'\n    'aWJpbGkuYXBwLmR5bmFtaWMudjIuRGltZW5zaW9uUglkaW1lbnNpb24SOQoFYmFkZ2UYCyADKA'\n    'syIy5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5WaWRlb0JhZGdlUgViYWRnZRIZCghjYW5fcGxh'\n    'eRgMIAEoCFIHY2FuUGxheRI4CgVzdHlwZRgNIAEoDjIiLmJpbGliaWxpLmFwcC5keW5hbWljLn'\n    'YyLlZpZGVvVHlwZVIFc3R5cGUSFwoIaXNfcF9nX2MYDiABKAhSBWlzUEdDEh8KDGlubGluZV91'\n    'X3JfbBgPIAEoCVIJaW5saW5lVVJMEh0KCmVwaXNvZGVfaWQYECABKANSCWVwaXNvZGVJZBIZCg'\n    'hzdWJfdHlwZRgRIAEoBVIHc3ViVHlwZRIiCg1wZ2Nfc2Vhc29uX2lkGBIgASgDUgtwZ2NTZWFz'\n    'b25JZBIbCglwbGF5X2ljb24YEyABKAlSCHBsYXlJY29uEhoKCGR1cmF0aW9uGBQgASgDUghkdX'\n    'JhdGlvbhIZCghqdW1wX3VybBgVIAEoCVIHanVtcFVybBIdCgppc19wcmV2aWV3GBYgASgIUglp'\n    'c1ByZXZpZXcSSgoOYmFkZ2VfY2F0ZWdvcnkYFyADKAsyIy5iaWxpYmlsaS5hcHAuZHluYW1pYy'\n    '52Mi5WaWRlb0JhZGdlUg1iYWRnZUNhdGVnb3J5Eh0KCmlzX2ZlYXR1cmUYGCABKAhSCWlzRmVh'\n    'dHVyZRJHCgxyZXNlcnZlX3R5cGUYGSABKA4yJC5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5SZX'\n    'NlcnZlVHlwZVILcmVzZXJ2ZVR5cGUSEgoEYnZpZBgaIAEoCVIEYnZpZBISCgR2aWV3GBsgASgF'\n    'UgR2aWV3Ei4KE3Nob3dfcHJlbWllcmVfYmFkZ2UYHCABKAhSEXNob3dQcmVtaWVyZUJhZGdlEi'\n    'MKDXByZW1pZXJlX2NhcmQYHSABKAhSDHByZW1pZXJlQ2FyZBIjCg1zaG93X3Byb2dyZXNzGB4g'\n    'ASgIUgxzaG93UHJvZ3Jlc3MSIwoNcGFydF9kdXJhdGlvbhgfIAEoA1IMcGFydER1cmF0aW9uEi'\n    'MKDXBhcnRfcHJvZ3Jlc3MYICABKANSDHBhcnRQcm9ncmVzcw==');\n\n@$core.Deprecated('Use mdlDynArticleDescriptor instead')\nconst MdlDynArticle$json = {\n  '1': 'MdlDynArticle',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'title', '3': 3, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'desc', '3': 4, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'covers', '3': 5, '4': 3, '5': 9, '10': 'covers'},\n    {'1': 'label', '3': 6, '4': 1, '5': 9, '10': 'label'},\n    {'1': 'template_i_d', '3': 7, '4': 1, '5': 5, '10': 'templateID'},\n  ],\n};\n\n/// Descriptor for `MdlDynArticle`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mdlDynArticleDescriptor = $convert.base64Decode(\n    'Cg1NZGxEeW5BcnRpY2xlEg4KAmlkGAEgASgDUgJpZBIQCgN1cmkYAiABKAlSA3VyaRIUCgV0aX'\n    'RsZRgDIAEoCVIFdGl0bGUSEgoEZGVzYxgEIAEoCVIEZGVzYxIWCgZjb3ZlcnMYBSADKAlSBmNv'\n    'dmVycxIUCgVsYWJlbBgGIAEoCVIFbGFiZWwSIAoMdGVtcGxhdGVfaV9kGAcgASgFUgp0ZW1wbG'\n    'F0ZUlE');\n\n@$core.Deprecated('Use mdlDynChargingArchiveDescriptor instead')\nconst MdlDynChargingArchive$json = {\n  '1': 'MdlDynChargingArchive',\n  '2': [\n    {\n      '1': 'archive_info',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynArchive',\n      '10': 'archiveInfo'\n    },\n    {'1': 'has_permission', '3': 2, '4': 1, '5': 8, '10': 'hasPermission'},\n    {'1': 'can_inline', '3': 3, '4': 1, '5': 8, '10': 'canInline'},\n    {\n      '1': 'charging_bundle_name',\n      '3': 4,\n      '4': 1,\n      '5': 9,\n      '10': 'chargingBundleName'\n    },\n    {\n      '1': 'cfg_preview_end_toast_countdown',\n      '3': 5,\n      '4': 1,\n      '5': 3,\n      '10': 'cfgPreviewEndToastCountdown'\n    },\n    {\n      '1': 'cfg_normal_inline_toast_duration',\n      '3': 6,\n      '4': 1,\n      '5': 3,\n      '10': 'cfgNormalInlineToastDuration'\n    },\n    {\n      '1': 'video_bottom_text_upper',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OneLineText',\n      '10': 'videoBottomTextUpper'\n    },\n    {\n      '1': 'video_bottom_text_lower',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OneLineText',\n      '10': 'videoBottomTextLower'\n    },\n    {'1': 'archive_cover', '3': 9, '4': 1, '5': 9, '10': 'archiveCover'},\n    {'1': 'archive_title', '3': 10, '4': 1, '5': 9, '10': 'archiveTitle'},\n    {\n      '1': 'act_btn',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.IconButton',\n      '10': 'actBtn'\n    },\n    {\n      '1': 'text_normal_inline_toast',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OneLineText',\n      '10': 'textNormalInlineToast'\n    },\n    {\n      '1': 'text_append_preview_end_toast',\n      '3': 13,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OneLineText',\n      '10': 'textAppendPreviewEndToast'\n    },\n  ],\n};\n\n/// Descriptor for `MdlDynChargingArchive`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mdlDynChargingArchiveDescriptor = $convert.base64Decode(\n    'ChVNZGxEeW5DaGFyZ2luZ0FyY2hpdmUSSQoMYXJjaGl2ZV9pbmZvGAEgASgLMiYuYmlsaWJpbG'\n    'kuYXBwLmR5bmFtaWMudjIuTWRsRHluQXJjaGl2ZVILYXJjaGl2ZUluZm8SJQoOaGFzX3Blcm1p'\n    'c3Npb24YAiABKAhSDWhhc1Blcm1pc3Npb24SHQoKY2FuX2lubGluZRgDIAEoCFIJY2FuSW5saW'\n    '5lEjAKFGNoYXJnaW5nX2J1bmRsZV9uYW1lGAQgASgJUhJjaGFyZ2luZ0J1bmRsZU5hbWUSRAof'\n    'Y2ZnX3ByZXZpZXdfZW5kX3RvYXN0X2NvdW50ZG93bhgFIAEoA1IbY2ZnUHJldmlld0VuZFRvYX'\n    'N0Q291bnRkb3duEkYKIGNmZ19ub3JtYWxfaW5saW5lX3RvYXN0X2R1cmF0aW9uGAYgASgDUhxj'\n    'ZmdOb3JtYWxJbmxpbmVUb2FzdER1cmF0aW9uElsKF3ZpZGVvX2JvdHRvbV90ZXh0X3VwcGVyGA'\n    'cgASgLMiQuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuT25lTGluZVRleHRSFHZpZGVvQm90dG9t'\n    'VGV4dFVwcGVyElsKF3ZpZGVvX2JvdHRvbV90ZXh0X2xvd2VyGAggASgLMiQuYmlsaWJpbGkuYX'\n    'BwLmR5bmFtaWMudjIuT25lTGluZVRleHRSFHZpZGVvQm90dG9tVGV4dExvd2VyEiMKDWFyY2hp'\n    'dmVfY292ZXIYCSABKAlSDGFyY2hpdmVDb3ZlchIjCg1hcmNoaXZlX3RpdGxlGAogASgJUgxhcm'\n    'NoaXZlVGl0bGUSPAoHYWN0X2J0bhgLIAEoCzIjLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLklj'\n    'b25CdXR0b25SBmFjdEJ0bhJdChh0ZXh0X25vcm1hbF9pbmxpbmVfdG9hc3QYDCABKAsyJC5iaW'\n    'xpYmlsaS5hcHAuZHluYW1pYy52Mi5PbmVMaW5lVGV4dFIVdGV4dE5vcm1hbElubGluZVRvYXN0'\n    'EmYKHXRleHRfYXBwZW5kX3ByZXZpZXdfZW5kX3RvYXN0GA0gASgLMiQuYmlsaWJpbGkuYXBwLm'\n    'R5bmFtaWMudjIuT25lTGluZVRleHRSGXRleHRBcHBlbmRQcmV2aWV3RW5kVG9hc3Q=');\n\n@$core.Deprecated('Use mdlDynCommonDescriptor instead')\nconst MdlDynCommon$json = {\n  '1': 'MdlDynCommon',\n  '2': [\n    {'1': 'oid', '3': 1, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'title', '3': 3, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'desc', '3': 4, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'cover', '3': 5, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'label', '3': 6, '4': 1, '5': 9, '10': 'label'},\n    {'1': 'biz_type', '3': 7, '4': 1, '5': 5, '10': 'bizType'},\n    {'1': 'sketch_i_d', '3': 8, '4': 1, '5': 3, '10': 'sketchID'},\n    {\n      '1': 'style',\n      '3': 9,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.MdlDynCommonType',\n      '10': 'style'\n    },\n    {\n      '1': 'badge',\n      '3': 10,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.VideoBadge',\n      '10': 'badge'\n    },\n    {\n      '1': 'button',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionalButton',\n      '10': 'button'\n    },\n  ],\n};\n\n/// Descriptor for `MdlDynCommon`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mdlDynCommonDescriptor = $convert.base64Decode(\n    'CgxNZGxEeW5Db21tb24SEAoDb2lkGAEgASgDUgNvaWQSEAoDdXJpGAIgASgJUgN1cmkSFAoFdG'\n    'l0bGUYAyABKAlSBXRpdGxlEhIKBGRlc2MYBCABKAlSBGRlc2MSFAoFY292ZXIYBSABKAlSBWNv'\n    'dmVyEhQKBWxhYmVsGAYgASgJUgVsYWJlbBIZCghiaXpfdHlwZRgHIAEoBVIHYml6VHlwZRIcCg'\n    'pza2V0Y2hfaV9kGAggASgDUghza2V0Y2hJRBI/CgVzdHlsZRgJIAEoDjIpLmJpbGliaWxpLmFw'\n    'cC5keW5hbWljLnYyLk1kbER5bkNvbW1vblR5cGVSBXN0eWxlEjkKBWJhZGdlGAogAygLMiMuYm'\n    'lsaWJpbGkuYXBwLmR5bmFtaWMudjIuVmlkZW9CYWRnZVIFYmFkZ2USQQoGYnV0dG9uGAsgASgL'\n    'MikuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQWRkaXRpb25hbEJ1dHRvblIGYnV0dG9u');\n\n@$core.Deprecated('Use mdlDynCourBatchDescriptor instead')\nconst MdlDynCourBatch$json = {\n  '1': 'MdlDynCourBatch',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 2, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'text1', '3': 4, '4': 1, '5': 9, '10': 'text1'},\n    {'1': 'text2', '3': 5, '4': 1, '5': 9, '10': 'text2'},\n    {\n      '1': 'badge',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.VideoBadge',\n      '10': 'badge'\n    },\n    {'1': 'play_icon', '3': 7, '4': 1, '5': 9, '10': 'playIcon'},\n    {'1': 'can_play', '3': 8, '4': 1, '5': 8, '10': 'canPlay'},\n    {'1': 'is_preview', '3': 9, '4': 1, '5': 8, '10': 'isPreview'},\n    {'1': 'cover_left_text1', '3': 10, '4': 1, '5': 9, '10': 'coverLeftText1'},\n    {'1': 'cover_left_text2', '3': 11, '4': 1, '5': 9, '10': 'coverLeftText2'},\n    {'1': 'cover_left_text3', '3': 12, '4': 1, '5': 9, '10': 'coverLeftText3'},\n    {'1': 'avid', '3': 13, '4': 1, '5': 3, '10': 'avid'},\n    {'1': 'cid', '3': 14, '4': 1, '5': 3, '10': 'cid'},\n    {'1': 'epid', '3': 15, '4': 1, '5': 3, '10': 'epid'},\n    {'1': 'duration', '3': 16, '4': 1, '5': 3, '10': 'duration'},\n    {'1': 'season_id', '3': 17, '4': 1, '5': 3, '10': 'seasonId'},\n  ],\n};\n\n/// Descriptor for `MdlDynCourBatch`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mdlDynCourBatchDescriptor = $convert.base64Decode(\n    'Cg9NZGxEeW5Db3VyQmF0Y2gSFAoFdGl0bGUYASABKAlSBXRpdGxlEhQKBWNvdmVyGAIgASgJUg'\n    'Vjb3ZlchIQCgN1cmkYAyABKAlSA3VyaRIUCgV0ZXh0MRgEIAEoCVIFdGV4dDESFAoFdGV4dDIY'\n    'BSABKAlSBXRleHQyEjkKBWJhZGdlGAYgASgLMiMuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuVm'\n    'lkZW9CYWRnZVIFYmFkZ2USGwoJcGxheV9pY29uGAcgASgJUghwbGF5SWNvbhIZCghjYW5fcGxh'\n    'eRgIIAEoCFIHY2FuUGxheRIdCgppc19wcmV2aWV3GAkgASgIUglpc1ByZXZpZXcSKAoQY292ZX'\n    'JfbGVmdF90ZXh0MRgKIAEoCVIOY292ZXJMZWZ0VGV4dDESKAoQY292ZXJfbGVmdF90ZXh0MhgL'\n    'IAEoCVIOY292ZXJMZWZ0VGV4dDISKAoQY292ZXJfbGVmdF90ZXh0MxgMIAEoCVIOY292ZXJMZW'\n    'Z0VGV4dDMSEgoEYXZpZBgNIAEoA1IEYXZpZBIQCgNjaWQYDiABKANSA2NpZBISCgRlcGlkGA8g'\n    'ASgDUgRlcGlkEhoKCGR1cmF0aW9uGBAgASgDUghkdXJhdGlvbhIbCglzZWFzb25faWQYESABKA'\n    'NSCHNlYXNvbklk');\n\n@$core.Deprecated('Use mdlDynCourSeasonDescriptor instead')\nconst MdlDynCourSeason$json = {\n  '1': 'MdlDynCourSeason',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 2, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'text1', '3': 4, '4': 1, '5': 9, '10': 'text1'},\n    {'1': 'desc', '3': 5, '4': 1, '5': 9, '10': 'desc'},\n    {\n      '1': 'badge',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.VideoBadge',\n      '10': 'badge'\n    },\n    {'1': 'play_icon', '3': 7, '4': 1, '5': 9, '10': 'playIcon'},\n    {'1': 'can_play', '3': 8, '4': 1, '5': 8, '10': 'canPlay'},\n    {'1': 'is_preview', '3': 9, '4': 1, '5': 8, '10': 'isPreview'},\n    {'1': 'avid', '3': 10, '4': 1, '5': 3, '10': 'avid'},\n    {'1': 'cid', '3': 11, '4': 1, '5': 3, '10': 'cid'},\n    {'1': 'epid', '3': 12, '4': 1, '5': 3, '10': 'epid'},\n    {'1': 'duration', '3': 13, '4': 1, '5': 3, '10': 'duration'},\n    {'1': 'season_id', '3': 14, '4': 1, '5': 3, '10': 'seasonId'},\n  ],\n};\n\n/// Descriptor for `MdlDynCourSeason`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mdlDynCourSeasonDescriptor = $convert.base64Decode(\n    'ChBNZGxEeW5Db3VyU2Vhc29uEhQKBXRpdGxlGAEgASgJUgV0aXRsZRIUCgVjb3ZlchgCIAEoCV'\n    'IFY292ZXISEAoDdXJpGAMgASgJUgN1cmkSFAoFdGV4dDEYBCABKAlSBXRleHQxEhIKBGRlc2MY'\n    'BSABKAlSBGRlc2MSOQoFYmFkZ2UYBiABKAsyIy5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5WaW'\n    'Rlb0JhZGdlUgViYWRnZRIbCglwbGF5X2ljb24YByABKAlSCHBsYXlJY29uEhkKCGNhbl9wbGF5'\n    'GAggASgIUgdjYW5QbGF5Eh0KCmlzX3ByZXZpZXcYCSABKAhSCWlzUHJldmlldxISCgRhdmlkGA'\n    'ogASgDUgRhdmlkEhAKA2NpZBgLIAEoA1IDY2lkEhIKBGVwaWQYDCABKANSBGVwaWQSGgoIZHVy'\n    'YXRpb24YDSABKANSCGR1cmF0aW9uEhsKCXNlYXNvbl9pZBgOIAEoA1IIc2Vhc29uSWQ=');\n\n@$core.Deprecated('Use mdlDynCourUpDescriptor instead')\nconst MdlDynCourUp$json = {\n  '1': 'MdlDynCourUp',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'desc', '3': 2, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'cover', '3': 3, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'uri', '3': 4, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'text1', '3': 5, '4': 1, '5': 9, '10': 'text1'},\n    {\n      '1': 'badge',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.VideoBadge',\n      '10': 'badge'\n    },\n    {'1': 'play_icon', '3': 7, '4': 1, '5': 9, '10': 'playIcon'},\n    {'1': 'can_play', '3': 8, '4': 1, '5': 8, '10': 'canPlay'},\n    {'1': 'is_preview', '3': 9, '4': 1, '5': 8, '10': 'isPreview'},\n    {'1': 'avid', '3': 10, '4': 1, '5': 3, '10': 'avid'},\n    {'1': 'cid', '3': 11, '4': 1, '5': 3, '10': 'cid'},\n    {'1': 'epid', '3': 12, '4': 1, '5': 3, '10': 'epid'},\n    {'1': 'duration', '3': 13, '4': 1, '5': 3, '10': 'duration'},\n    {'1': 'season_id', '3': 14, '4': 1, '5': 3, '10': 'seasonId'},\n  ],\n};\n\n/// Descriptor for `MdlDynCourUp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mdlDynCourUpDescriptor = $convert.base64Decode(\n    'CgxNZGxEeW5Db3VyVXASFAoFdGl0bGUYASABKAlSBXRpdGxlEhIKBGRlc2MYAiABKAlSBGRlc2'\n    'MSFAoFY292ZXIYAyABKAlSBWNvdmVyEhAKA3VyaRgEIAEoCVIDdXJpEhQKBXRleHQxGAUgASgJ'\n    'UgV0ZXh0MRI5CgViYWRnZRgGIAEoCzIjLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlZpZGVvQm'\n    'FkZ2VSBWJhZGdlEhsKCXBsYXlfaWNvbhgHIAEoCVIIcGxheUljb24SGQoIY2FuX3BsYXkYCCAB'\n    'KAhSB2NhblBsYXkSHQoKaXNfcHJldmlldxgJIAEoCFIJaXNQcmV2aWV3EhIKBGF2aWQYCiABKA'\n    'NSBGF2aWQSEAoDY2lkGAsgASgDUgNjaWQSEgoEZXBpZBgMIAEoA1IEZXBpZBIaCghkdXJhdGlv'\n    'bhgNIAEoA1IIZHVyYXRpb24SGwoJc2Vhc29uX2lkGA4gASgDUghzZWFzb25JZA==');\n\n@$core.Deprecated('Use mdlDynDrawDescriptor instead')\nconst MdlDynDraw$json = {\n  '1': 'MdlDynDraw',\n  '2': [\n    {\n      '1': 'items',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynDrawItem',\n      '10': 'items'\n    },\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'id', '3': 3, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'is_draw_first', '3': 4, '4': 1, '5': 8, '10': 'isDrawFirst'},\n    {'1': 'is_big_cover', '3': 5, '4': 1, '5': 8, '10': 'isBigCover'},\n    {'1': 'is_article_cover', '3': 6, '4': 1, '5': 8, '10': 'isArticleCover'},\n    {'1': 'unfold_all', '3': 7, '4': 1, '5': 8, '10': 'unfoldAll'},\n  ],\n};\n\n/// Descriptor for `MdlDynDraw`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mdlDynDrawDescriptor = $convert.base64Decode(\n    'CgpNZGxEeW5EcmF3Ej0KBWl0ZW1zGAEgAygLMicuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuTW'\n    'RsRHluRHJhd0l0ZW1SBWl0ZW1zEhAKA3VyaRgCIAEoCVIDdXJpEg4KAmlkGAMgASgDUgJpZBIi'\n    'Cg1pc19kcmF3X2ZpcnN0GAQgASgIUgtpc0RyYXdGaXJzdBIgCgxpc19iaWdfY292ZXIYBSABKA'\n    'hSCmlzQmlnQ292ZXISKAoQaXNfYXJ0aWNsZV9jb3ZlchgGIAEoCFIOaXNBcnRpY2xlQ292ZXIS'\n    'HQoKdW5mb2xkX2FsbBgHIAEoCFIJdW5mb2xkQWxs');\n\n@$core.Deprecated('Use mdlDynDrawItemDescriptor instead')\nconst MdlDynDrawItem$json = {\n  '1': 'MdlDynDrawItem',\n  '2': [\n    {'1': 'src', '3': 1, '4': 1, '5': 9, '10': 'src'},\n    {'1': 'width', '3': 2, '4': 1, '5': 3, '10': 'width'},\n    {'1': 'height', '3': 3, '4': 1, '5': 3, '10': 'height'},\n    {'1': 'size', '3': 4, '4': 1, '5': 2, '10': 'size'},\n    {\n      '1': 'tags',\n      '3': 5,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynDrawTag',\n      '10': 'tags'\n    },\n    {'1': 'src_dark', '3': 6, '4': 1, '5': 9, '10': 'srcDark'},\n    {'1': 'is_live_photo', '3': 7, '4': 1, '5': 8, '10': 'isLivePhoto'},\n    {'1': 'live_video_url', '3': 8, '4': 1, '5': 9, '10': 'liveVideoUrl'},\n    {'1': 'live_video_size', '3': 9, '4': 1, '5': 1, '10': 'liveVideoSize'},\n  ],\n};\n\n/// Descriptor for `MdlDynDrawItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mdlDynDrawItemDescriptor = $convert.base64Decode(\n    'Cg5NZGxEeW5EcmF3SXRlbRIQCgNzcmMYASABKAlSA3NyYxIUCgV3aWR0aBgCIAEoA1IFd2lkdG'\n    'gSFgoGaGVpZ2h0GAMgASgDUgZoZWlnaHQSEgoEc2l6ZRgEIAEoAlIEc2l6ZRI6CgR0YWdzGAUg'\n    'AygLMiYuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuTWRsRHluRHJhd1RhZ1IEdGFncxIZCghzcm'\n    'NfZGFyaxgGIAEoCVIHc3JjRGFyaxIiCg1pc19saXZlX3Bob3RvGAcgASgIUgtpc0xpdmVQaG90'\n    'bxIkCg5saXZlX3ZpZGVvX3VybBgIIAEoCVIMbGl2ZVZpZGVvVXJsEiYKD2xpdmVfdmlkZW9fc2'\n    'l6ZRgJIAEoAVINbGl2ZVZpZGVvU2l6ZQ==');\n\n@$core.Deprecated('Use mdlDynDrawTagDescriptor instead')\nconst MdlDynDrawTag$json = {\n  '1': 'MdlDynDrawTag',\n  '2': [\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.MdlDynDrawTagType',\n      '10': 'type'\n    },\n    {\n      '1': 'item',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynDrawTagItem',\n      '10': 'item'\n    },\n  ],\n};\n\n/// Descriptor for `MdlDynDrawTag`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mdlDynDrawTagDescriptor = $convert.base64Decode(\n    'Cg1NZGxEeW5EcmF3VGFnEj4KBHR5cGUYASABKA4yKi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi'\n    '5NZGxEeW5EcmF3VGFnVHlwZVIEdHlwZRI+CgRpdGVtGAIgASgLMiouYmlsaWJpbGkuYXBwLmR5'\n    'bmFtaWMudjIuTWRsRHluRHJhd1RhZ0l0ZW1SBGl0ZW0=');\n\n@$core.Deprecated('Use mdlDynDrawTagItemDescriptor instead')\nconst MdlDynDrawTagItem$json = {\n  '1': 'MdlDynDrawTagItem',\n  '2': [\n    {'1': 'url', '3': 1, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'x', '3': 3, '4': 1, '5': 3, '10': 'x'},\n    {'1': 'y', '3': 4, '4': 1, '5': 3, '10': 'y'},\n    {'1': 'orientation', '3': 5, '4': 1, '5': 5, '10': 'orientation'},\n    {'1': 'source', '3': 6, '4': 1, '5': 5, '10': 'source'},\n    {'1': 'item_id', '3': 7, '4': 1, '5': 3, '10': 'itemId'},\n    {'1': 'mid', '3': 8, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'tid', '3': 9, '4': 1, '5': 3, '10': 'tid'},\n    {'1': 'poi', '3': 10, '4': 1, '5': 9, '10': 'poi'},\n    {'1': 'schema_url', '3': 11, '4': 1, '5': 9, '10': 'schemaUrl'},\n  ],\n};\n\n/// Descriptor for `MdlDynDrawTagItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mdlDynDrawTagItemDescriptor = $convert.base64Decode(\n    'ChFNZGxEeW5EcmF3VGFnSXRlbRIQCgN1cmwYASABKAlSA3VybBISCgR0ZXh0GAIgASgJUgR0ZX'\n    'h0EgwKAXgYAyABKANSAXgSDAoBeRgEIAEoA1IBeRIgCgtvcmllbnRhdGlvbhgFIAEoBVILb3Jp'\n    'ZW50YXRpb24SFgoGc291cmNlGAYgASgFUgZzb3VyY2USFwoHaXRlbV9pZBgHIAEoA1IGaXRlbU'\n    'lkEhAKA21pZBgIIAEoA1IDbWlkEhAKA3RpZBgJIAEoA1IDdGlkEhAKA3BvaRgKIAEoCVIDcG9p'\n    'Eh0KCnNjaGVtYV91cmwYCyABKAlSCXNjaGVtYVVybA==');\n\n@$core.Deprecated('Use mdlDynForwardDescriptor instead')\nconst MdlDynForward$json = {\n  '1': 'MdlDynForward',\n  '2': [\n    {\n      '1': 'item',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynamicItem',\n      '10': 'item'\n    },\n    {'1': 'rtype', '3': 2, '4': 1, '5': 5, '10': 'rtype'},\n  ],\n};\n\n/// Descriptor for `MdlDynForward`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mdlDynForwardDescriptor = $convert.base64Decode(\n    'Cg1NZGxEeW5Gb3J3YXJkEjgKBGl0ZW0YASABKAsyJC5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi'\n    '5EeW5hbWljSXRlbVIEaXRlbRIUCgVydHlwZRgCIAEoBVIFcnR5cGU=');\n\n@$core.Deprecated('Use mdlDynLiveDescriptor instead')\nconst MdlDynLive$json = {\n  '1': 'MdlDynLive',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'title', '3': 3, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 4, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'cover_label', '3': 5, '4': 1, '5': 9, '10': 'coverLabel'},\n    {'1': 'cover_label2', '3': 6, '4': 1, '5': 9, '10': 'coverLabel2'},\n    {\n      '1': 'live_state',\n      '3': 7,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.LiveState',\n      '10': 'liveState'\n    },\n    {\n      '1': 'badge',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.VideoBadge',\n      '10': 'badge'\n    },\n    {\n      '1': 'reserve_type',\n      '3': 9,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.ReserveType',\n      '10': 'reserveType'\n    },\n  ],\n};\n\n/// Descriptor for `MdlDynLive`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mdlDynLiveDescriptor = $convert.base64Decode(\n    'CgpNZGxEeW5MaXZlEg4KAmlkGAEgASgDUgJpZBIQCgN1cmkYAiABKAlSA3VyaRIUCgV0aXRsZR'\n    'gDIAEoCVIFdGl0bGUSFAoFY292ZXIYBCABKAlSBWNvdmVyEh8KC2NvdmVyX2xhYmVsGAUgASgJ'\n    'Ugpjb3ZlckxhYmVsEiEKDGNvdmVyX2xhYmVsMhgGIAEoCVILY292ZXJMYWJlbDISQQoKbGl2ZV'\n    '9zdGF0ZRgHIAEoDjIiLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkxpdmVTdGF0ZVIJbGl2ZVN0'\n    'YXRlEjkKBWJhZGdlGAggASgLMiMuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuVmlkZW9CYWRnZV'\n    'IFYmFkZ2USRwoMcmVzZXJ2ZV90eXBlGAkgASgOMiQuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIu'\n    'UmVzZXJ2ZVR5cGVSC3Jlc2VydmVUeXBl');\n\n@$core.Deprecated('Use mdlDynLiveRcmdDescriptor instead')\nconst MdlDynLiveRcmd$json = {\n  '1': 'MdlDynLiveRcmd',\n  '2': [\n    {'1': 'content', '3': 1, '4': 1, '5': 9, '10': 'content'},\n    {\n      '1': 'reserve_type',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.ReserveType',\n      '10': 'reserveType'\n    },\n    {\n      '1': 'pendant',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.LivePendant',\n      '10': 'pendant'\n    },\n  ],\n};\n\n/// Descriptor for `MdlDynLiveRcmd`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mdlDynLiveRcmdDescriptor = $convert.base64Decode(\n    'Cg5NZGxEeW5MaXZlUmNtZBIYCgdjb250ZW50GAEgASgJUgdjb250ZW50EkcKDHJlc2VydmVfdH'\n    'lwZRgCIAEoDjIkLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlJlc2VydmVUeXBlUgtyZXNlcnZl'\n    'VHlwZRI+CgdwZW5kYW50GAMgASgLMiQuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuTGl2ZVBlbm'\n    'RhbnRSB3BlbmRhbnQ=');\n\n@$core.Deprecated('Use mdlDynMedialistDescriptor instead')\nconst MdlDynMedialist$json = {\n  '1': 'MdlDynMedialist',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'title', '3': 3, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'sub_title', '3': 4, '4': 1, '5': 9, '10': 'subTitle'},\n    {'1': 'cover', '3': 5, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'cover_type', '3': 6, '4': 1, '5': 5, '10': 'coverType'},\n    {\n      '1': 'badge',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.VideoBadge',\n      '10': 'badge'\n    },\n    {\n      '1': 'cover_bottom_right_icon',\n      '3': 8,\n      '4': 1,\n      '5': 9,\n      '10': 'coverBottomRightIcon'\n    },\n  ],\n};\n\n/// Descriptor for `MdlDynMedialist`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mdlDynMedialistDescriptor = $convert.base64Decode(\n    'Cg9NZGxEeW5NZWRpYWxpc3QSDgoCaWQYASABKANSAmlkEhAKA3VyaRgCIAEoCVIDdXJpEhQKBX'\n    'RpdGxlGAMgASgJUgV0aXRsZRIbCglzdWJfdGl0bGUYBCABKAlSCHN1YlRpdGxlEhQKBWNvdmVy'\n    'GAUgASgJUgVjb3ZlchIdCgpjb3Zlcl90eXBlGAYgASgFUgljb3ZlclR5cGUSOQoFYmFkZ2UYBy'\n    'ABKAsyIy5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5WaWRlb0JhZGdlUgViYWRnZRI1Chdjb3Zl'\n    'cl9ib3R0b21fcmlnaHRfaWNvbhgIIAEoCVIUY292ZXJCb3R0b21SaWdodEljb24=');\n\n@$core.Deprecated('Use mdlDynMusicDescriptor instead')\nconst MdlDynMusic$json = {\n  '1': 'MdlDynMusic',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'up_id', '3': 3, '4': 1, '5': 3, '10': 'upId'},\n    {'1': 'title', '3': 4, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 5, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'label1', '3': 6, '4': 1, '5': 9, '10': 'label1'},\n    {'1': 'upper', '3': 7, '4': 1, '5': 9, '10': 'upper'},\n  ],\n};\n\n/// Descriptor for `MdlDynMusic`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mdlDynMusicDescriptor = $convert.base64Decode(\n    'CgtNZGxEeW5NdXNpYxIOCgJpZBgBIAEoA1ICaWQSEAoDdXJpGAIgASgJUgN1cmkSEwoFdXBfaW'\n    'QYAyABKANSBHVwSWQSFAoFdGl0bGUYBCABKAlSBXRpdGxlEhQKBWNvdmVyGAUgASgJUgVjb3Zl'\n    'chIWCgZsYWJlbDEYBiABKAlSBmxhYmVsMRIUCgV1cHBlchgHIAEoCVIFdXBwZXI=');\n\n@$core.Deprecated('Use mdlDynPGCDescriptor instead')\nconst MdlDynPGC$json = {\n  '1': 'MdlDynPGC',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 2, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'cover_left_text1', '3': 4, '4': 1, '5': 9, '10': 'coverLeftText1'},\n    {'1': 'cover_left_text2', '3': 5, '4': 1, '5': 9, '10': 'coverLeftText2'},\n    {'1': 'cover_left_text3', '3': 6, '4': 1, '5': 9, '10': 'coverLeftText3'},\n    {'1': 'cid', '3': 7, '4': 1, '5': 3, '10': 'cid'},\n    {'1': 'season_id', '3': 8, '4': 1, '5': 3, '10': 'seasonId'},\n    {'1': 'epid', '3': 9, '4': 1, '5': 3, '10': 'epid'},\n    {'1': 'aid', '3': 10, '4': 1, '5': 3, '10': 'aid'},\n    {\n      '1': 'media_type',\n      '3': 11,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.MediaType',\n      '10': 'mediaType'\n    },\n    {\n      '1': 'sub_type',\n      '3': 12,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.VideoSubType',\n      '10': 'subType'\n    },\n    {'1': 'is_preview', '3': 13, '4': 1, '5': 8, '10': 'isPreview'},\n    {\n      '1': 'dimension',\n      '3': 14,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Dimension',\n      '10': 'dimension'\n    },\n    {\n      '1': 'badge',\n      '3': 15,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.VideoBadge',\n      '10': 'badge'\n    },\n    {'1': 'can_play', '3': 16, '4': 1, '5': 8, '10': 'canPlay'},\n    {\n      '1': 'season',\n      '3': 17,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.PGCSeason',\n      '10': 'season'\n    },\n    {'1': 'play_icon', '3': 18, '4': 1, '5': 9, '10': 'playIcon'},\n    {'1': 'duration', '3': 19, '4': 1, '5': 3, '10': 'duration'},\n    {'1': 'jump_url', '3': 20, '4': 1, '5': 9, '10': 'jumpUrl'},\n    {\n      '1': 'badge_category',\n      '3': 21,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.VideoBadge',\n      '10': 'badgeCategory'\n    },\n    {'1': 'is_feature', '3': 22, '4': 1, '5': 8, '10': 'isFeature'},\n  ],\n};\n\n/// Descriptor for `MdlDynPGC`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mdlDynPGCDescriptor = $convert.base64Decode(\n    'CglNZGxEeW5QR0MSFAoFdGl0bGUYASABKAlSBXRpdGxlEhQKBWNvdmVyGAIgASgJUgVjb3Zlch'\n    'IQCgN1cmkYAyABKAlSA3VyaRIoChBjb3Zlcl9sZWZ0X3RleHQxGAQgASgJUg5jb3ZlckxlZnRU'\n    'ZXh0MRIoChBjb3Zlcl9sZWZ0X3RleHQyGAUgASgJUg5jb3ZlckxlZnRUZXh0MhIoChBjb3Zlcl'\n    '9sZWZ0X3RleHQzGAYgASgJUg5jb3ZlckxlZnRUZXh0MxIQCgNjaWQYByABKANSA2NpZBIbCglz'\n    'ZWFzb25faWQYCCABKANSCHNlYXNvbklkEhIKBGVwaWQYCSABKANSBGVwaWQSEAoDYWlkGAogAS'\n    'gDUgNhaWQSQQoKbWVkaWFfdHlwZRgLIAEoDjIiLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLk1l'\n    'ZGlhVHlwZVIJbWVkaWFUeXBlEkAKCHN1Yl90eXBlGAwgASgOMiUuYmlsaWJpbGkuYXBwLmR5bm'\n    'FtaWMudjIuVmlkZW9TdWJUeXBlUgdzdWJUeXBlEh0KCmlzX3ByZXZpZXcYDSABKAhSCWlzUHJl'\n    'dmlldxJACglkaW1lbnNpb24YDiABKAsyIi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5EaW1lbn'\n    'Npb25SCWRpbWVuc2lvbhI5CgViYWRnZRgPIAMoCzIjLmJpbGliaWxpLmFwcC5keW5hbWljLnYy'\n    'LlZpZGVvQmFkZ2VSBWJhZGdlEhkKCGNhbl9wbGF5GBAgASgIUgdjYW5QbGF5EjoKBnNlYXNvbh'\n    'gRIAEoCzIiLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlBHQ1NlYXNvblIGc2Vhc29uEhsKCXBs'\n    'YXlfaWNvbhgSIAEoCVIIcGxheUljb24SGgoIZHVyYXRpb24YEyABKANSCGR1cmF0aW9uEhkKCG'\n    'p1bXBfdXJsGBQgASgJUgdqdW1wVXJsEkoKDmJhZGdlX2NhdGVnb3J5GBUgAygLMiMuYmlsaWJp'\n    'bGkuYXBwLmR5bmFtaWMudjIuVmlkZW9CYWRnZVINYmFkZ2VDYXRlZ29yeRIdCgppc19mZWF0dX'\n    'JlGBYgASgIUglpc0ZlYXR1cmU=');\n\n@$core.Deprecated('Use mdlDynShareChargingQADescriptor instead')\nconst MdlDynShareChargingQA$json = {\n  '1': 'MdlDynShareChargingQA',\n  '2': [\n    {\n      '1': 'background_img',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ImageSet',\n      '10': 'backgroundImg'\n    },\n    {\n      '1': 'left_icon_img',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ImageSet',\n      '10': 'leftIconImg'\n    },\n    {'1': 'title', '3': 3, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'jump_button',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.IconButton',\n      '10': 'jumpButton'\n    },\n    {'1': 'uri', '3': 5, '4': 1, '5': 9, '10': 'uri'},\n    {\n      '1': 'share_card_meta_info',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CommonShareCardInfo',\n      '10': 'shareCardMetaInfo'\n    },\n    {'1': 'title_prefix_bold', '3': 7, '4': 1, '5': 9, '10': 'titlePrefixBold'},\n  ],\n};\n\n/// Descriptor for `MdlDynShareChargingQA`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mdlDynShareChargingQADescriptor = $convert.base64Decode(\n    'ChVNZGxEeW5TaGFyZUNoYXJnaW5nUUESSAoOYmFja2dyb3VuZF9pbWcYASABKAsyIS5iaWxpYm'\n    'lsaS5hcHAuZHluYW1pYy52Mi5JbWFnZVNldFINYmFja2dyb3VuZEltZxJFCg1sZWZ0X2ljb25f'\n    'aW1nGAIgASgLMiEuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuSW1hZ2VTZXRSC2xlZnRJY29uSW'\n    '1nEhQKBXRpdGxlGAMgASgJUgV0aXRsZRJECgtqdW1wX2J1dHRvbhgEIAEoCzIjLmJpbGliaWxp'\n    'LmFwcC5keW5hbWljLnYyLkljb25CdXR0b25SCmp1bXBCdXR0b24SEAoDdXJpGAUgASgJUgN1cm'\n    'kSXQoUc2hhcmVfY2FyZF9tZXRhX2luZm8YBiABKAsyLC5iaWxpYmlsaS5hcHAuZHluYW1pYy52'\n    'Mi5Db21tb25TaGFyZUNhcmRJbmZvUhFzaGFyZUNhcmRNZXRhSW5mbxIqChF0aXRsZV9wcmVmaX'\n    'hfYm9sZBgHIAEoCVIPdGl0bGVQcmVmaXhCb2xk');\n\n@$core.Deprecated('Use mdlDynSubscriptionDescriptor instead')\nconst MdlDynSubscription$json = {\n  '1': 'MdlDynSubscription',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'ad_id', '3': 2, '4': 1, '5': 3, '10': 'adId'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'title', '3': 4, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 5, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'ad_title', '3': 6, '4': 1, '5': 9, '10': 'adTitle'},\n    {\n      '1': 'badge',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.VideoBadge',\n      '10': 'badge'\n    },\n    {'1': 'tips', '3': 8, '4': 1, '5': 9, '10': 'tips'},\n  ],\n};\n\n/// Descriptor for `MdlDynSubscription`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mdlDynSubscriptionDescriptor = $convert.base64Decode(\n    'ChJNZGxEeW5TdWJzY3JpcHRpb24SDgoCaWQYASABKANSAmlkEhMKBWFkX2lkGAIgASgDUgRhZE'\n    'lkEhAKA3VyaRgDIAEoCVIDdXJpEhQKBXRpdGxlGAQgASgJUgV0aXRsZRIUCgVjb3ZlchgFIAEo'\n    'CVIFY292ZXISGQoIYWRfdGl0bGUYBiABKAlSB2FkVGl0bGUSOQoFYmFkZ2UYByABKAsyIy5iaW'\n    'xpYmlsaS5hcHAuZHluYW1pYy52Mi5WaWRlb0JhZGdlUgViYWRnZRISCgR0aXBzGAggASgJUgR0'\n    'aXBz');\n\n@$core.Deprecated('Use mdlDynSubscriptionNewDescriptor instead')\nconst MdlDynSubscriptionNew$json = {\n  '1': 'MdlDynSubscriptionNew',\n  '2': [\n    {\n      '1': 'dyn_subscription',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynSubscription',\n      '9': 0,\n      '10': 'dynSubscription'\n    },\n    {\n      '1': 'dyn_live_rcmd',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynLiveRcmd',\n      '9': 0,\n      '10': 'dynLiveRcmd'\n    },\n    {\n      '1': 'style',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.MdlDynSubscriptionNewStyle',\n      '10': 'style'\n    },\n  ],\n  '8': [\n    {'1': 'item'},\n  ],\n};\n\n/// Descriptor for `MdlDynSubscriptionNew`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mdlDynSubscriptionNewDescriptor = $convert.base64Decode(\n    'ChVNZGxEeW5TdWJzY3JpcHRpb25OZXcSWAoQZHluX3N1YnNjcmlwdGlvbhgCIAEoCzIrLmJpbG'\n    'liaWxpLmFwcC5keW5hbWljLnYyLk1kbER5blN1YnNjcmlwdGlvbkgAUg9keW5TdWJzY3JpcHRp'\n    'b24STQoNZHluX2xpdmVfcmNtZBgDIAEoCzInLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLk1kbE'\n    'R5bkxpdmVSY21kSABSC2R5bkxpdmVSY21kEkkKBXN0eWxlGAEgASgOMjMuYmlsaWJpbGkuYXBw'\n    'LmR5bmFtaWMudjIuTWRsRHluU3Vic2NyaXB0aW9uTmV3U3R5bGVSBXN0eWxlQgYKBGl0ZW0=');\n\n@$core.Deprecated('Use mdlDynTopicSetDescriptor instead')\nconst MdlDynTopicSet$json = {\n  '1': 'MdlDynTopicSet',\n  '2': [\n    {\n      '1': 'topics',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.TopicItem',\n      '10': 'topics'\n    },\n    {\n      '1': 'more_btn',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.IconButton',\n      '10': 'moreBtn'\n    },\n    {'1': 'topic_set_id', '3': 3, '4': 1, '5': 3, '10': 'topicSetId'},\n    {'1': 'push_id', '3': 4, '4': 1, '5': 3, '10': 'pushId'},\n  ],\n};\n\n/// Descriptor for `MdlDynTopicSet`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mdlDynTopicSetDescriptor = $convert.base64Decode(\n    'Cg5NZGxEeW5Ub3BpY1NldBI6CgZ0b3BpY3MYASADKAsyIi5iaWxpYmlsaS5hcHAuZHluYW1pYy'\n    '52Mi5Ub3BpY0l0ZW1SBnRvcGljcxI+Cghtb3JlX2J0bhgCIAEoCzIjLmJpbGliaWxpLmFwcC5k'\n    'eW5hbWljLnYyLkljb25CdXR0b25SB21vcmVCdG4SIAoMdG9waWNfc2V0X2lkGAMgASgDUgp0b3'\n    'BpY1NldElkEhcKB3B1c2hfaWQYBCABKANSBnB1c2hJZA==');\n\n@$core.Deprecated('Use mdlDynUGCSeasonDescriptor instead')\nconst MdlDynUGCSeason$json = {\n  '1': 'MdlDynUGCSeason',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 2, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'cover_left_text1', '3': 4, '4': 1, '5': 9, '10': 'coverLeftText1'},\n    {'1': 'cover_left_text2', '3': 5, '4': 1, '5': 9, '10': 'coverLeftText2'},\n    {'1': 'cover_left_text3', '3': 6, '4': 1, '5': 9, '10': 'coverLeftText3'},\n    {'1': 'id', '3': 7, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'inline_u_r_l', '3': 8, '4': 1, '5': 9, '10': 'inlineURL'},\n    {'1': 'can_play', '3': 9, '4': 1, '5': 8, '10': 'canPlay'},\n    {'1': 'play_icon', '3': 10, '4': 1, '5': 9, '10': 'playIcon'},\n    {'1': 'avid', '3': 11, '4': 1, '5': 3, '10': 'avid'},\n    {'1': 'cid', '3': 12, '4': 1, '5': 3, '10': 'cid'},\n    {\n      '1': 'dimension',\n      '3': 13,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Dimension',\n      '10': 'dimension'\n    },\n    {'1': 'duration', '3': 14, '4': 1, '5': 3, '10': 'duration'},\n    {'1': 'jump_url', '3': 15, '4': 1, '5': 9, '10': 'jumpUrl'},\n    {\n      '1': 'badge',\n      '3': 16,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.VideoBadge',\n      '10': 'badge'\n    },\n  ],\n};\n\n/// Descriptor for `MdlDynUGCSeason`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mdlDynUGCSeasonDescriptor = $convert.base64Decode(\n    'Cg9NZGxEeW5VR0NTZWFzb24SFAoFdGl0bGUYASABKAlSBXRpdGxlEhQKBWNvdmVyGAIgASgJUg'\n    'Vjb3ZlchIQCgN1cmkYAyABKAlSA3VyaRIoChBjb3Zlcl9sZWZ0X3RleHQxGAQgASgJUg5jb3Zl'\n    'ckxlZnRUZXh0MRIoChBjb3Zlcl9sZWZ0X3RleHQyGAUgASgJUg5jb3ZlckxlZnRUZXh0MhIoCh'\n    'Bjb3Zlcl9sZWZ0X3RleHQzGAYgASgJUg5jb3ZlckxlZnRUZXh0MxIOCgJpZBgHIAEoA1ICaWQS'\n    'HwoMaW5saW5lX3Vfcl9sGAggASgJUglpbmxpbmVVUkwSGQoIY2FuX3BsYXkYCSABKAhSB2Nhbl'\n    'BsYXkSGwoJcGxheV9pY29uGAogASgJUghwbGF5SWNvbhISCgRhdmlkGAsgASgDUgRhdmlkEhAK'\n    'A2NpZBgMIAEoA1IDY2lkEkAKCWRpbWVuc2lvbhgNIAEoCzIiLmJpbGliaWxpLmFwcC5keW5hbW'\n    'ljLnYyLkRpbWVuc2lvblIJZGltZW5zaW9uEhoKCGR1cmF0aW9uGA4gASgDUghkdXJhdGlvbhIZ'\n    'CghqdW1wX3VybBgPIAEoCVIHanVtcFVybBI5CgViYWRnZRgQIAMoCzIjLmJpbGliaWxpLmFwcC'\n    '5keW5hbWljLnYyLlZpZGVvQmFkZ2VSBWJhZGdl');\n\n@$core.Deprecated('Use mixUpListItemDescriptor instead')\nconst MixUpListItem$json = {\n  '1': 'MixUpListItem',\n  '2': [\n    {'1': 'uid', '3': 1, '4': 1, '5': 3, '10': 'uid'},\n    {\n      '1': 'special_attention',\n      '3': 2,\n      '4': 1,\n      '5': 5,\n      '10': 'specialAttention'\n    },\n    {'1': 'reddot_state', '3': 3, '4': 1, '5': 5, '10': 'reddotState'},\n    {\n      '1': 'live_info',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MixUpListLiveItem',\n      '10': 'liveInfo'\n    },\n    {'1': 'name', '3': 5, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'face', '3': 6, '4': 1, '5': 9, '10': 'face'},\n    {\n      '1': 'official',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OfficialVerify',\n      '10': 'official'\n    },\n    {\n      '1': 'vip',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.VipInfo',\n      '10': 'vip'\n    },\n    {\n      '1': 'relation',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Relation',\n      '10': 'relation'\n    },\n    {'1': 'premiere_state', '3': 10, '4': 1, '5': 5, '10': 'premiereState'},\n    {'1': 'uri', '3': 11, '4': 1, '5': 9, '10': 'uri'},\n    {\n      '1': 'avatar',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.AvatarItem',\n      '10': 'avatar'\n    },\n    {\n      '1': 'name_render',\n      '3': 13,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.account.service.v1.NameRender',\n      '10': 'nameRender'\n    },\n  ],\n};\n\n/// Descriptor for `MixUpListItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mixUpListItemDescriptor = $convert.base64Decode(\n    'Cg1NaXhVcExpc3RJdGVtEhAKA3VpZBgBIAEoA1IDdWlkEisKEXNwZWNpYWxfYXR0ZW50aW9uGA'\n    'IgASgFUhBzcGVjaWFsQXR0ZW50aW9uEiEKDHJlZGRvdF9zdGF0ZRgDIAEoBVILcmVkZG90U3Rh'\n    'dGUSRwoJbGl2ZV9pbmZvGAQgASgLMiouYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuTWl4VXBMaX'\n    'N0TGl2ZUl0ZW1SCGxpdmVJbmZvEhIKBG5hbWUYBSABKAlSBG5hbWUSEgoEZmFjZRgGIAEoCVIE'\n    'ZmFjZRJDCghvZmZpY2lhbBgHIAEoCzInLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLk9mZmljaW'\n    'FsVmVyaWZ5UghvZmZpY2lhbBIyCgN2aXAYCCABKAsyIC5iaWxpYmlsaS5hcHAuZHluYW1pYy52'\n    'Mi5WaXBJbmZvUgN2aXASPQoIcmVsYXRpb24YCSABKAsyIS5iaWxpYmlsaS5hcHAuZHluYW1pYy'\n    '52Mi5SZWxhdGlvblIIcmVsYXRpb24SJQoOcHJlbWllcmVfc3RhdGUYCiABKAVSDXByZW1pZXJl'\n    'U3RhdGUSEAoDdXJpGAsgASgJUgN1cmkSRQoGYXZhdGFyGAwgASgLMi0uYmlsaWJpbGkuZGFndy'\n    '5jb21wb25lbnQuYXZhdGFyLnYxLkF2YXRhckl0ZW1SBmF2YXRhchJICgtuYW1lX3JlbmRlchgN'\n    'IAEoCzInLmJpbGliaWxpLmFjY291bnQuc2VydmljZS52MS5OYW1lUmVuZGVyUgpuYW1lUmVuZG'\n    'Vy');\n\n@$core.Deprecated('Use mixUpListLiveItemDescriptor instead')\nconst MixUpListLiveItem$json = {\n  '1': 'MixUpListLiveItem',\n  '2': [\n    {'1': 'status', '3': 1, '4': 1, '5': 8, '10': 'status'},\n    {'1': 'room_id', '3': 2, '4': 1, '5': 3, '10': 'roomId'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n  ],\n};\n\n/// Descriptor for `MixUpListLiveItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mixUpListLiveItemDescriptor = $convert.base64Decode(\n    'ChFNaXhVcExpc3RMaXZlSXRlbRIWCgZzdGF0dXMYASABKAhSBnN0YXR1cxIXCgdyb29tX2lkGA'\n    'IgASgDUgZyb29tSWQSEAoDdXJpGAMgASgJUgN1cmk=');\n\n@$core.Deprecated('Use moduleDescriptor instead')\nconst Module$json = {\n  '1': 'Module',\n  '2': [\n    {\n      '1': 'module_author',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleAuthor',\n      '9': 0,\n      '10': 'moduleAuthor'\n    },\n    {\n      '1': 'module_dispute',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleDispute',\n      '9': 0,\n      '10': 'moduleDispute'\n    },\n    {\n      '1': 'module_desc',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleDesc',\n      '9': 0,\n      '10': 'moduleDesc'\n    },\n    {\n      '1': 'module_dynamic',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleDynamic',\n      '9': 0,\n      '10': 'moduleDynamic'\n    },\n    {\n      '1': 'module_like_user',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleLikeUser',\n      '9': 0,\n      '10': 'moduleLikeUser'\n    },\n    {\n      '1': 'module_extend',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleExtend',\n      '9': 0,\n      '10': 'moduleExtend'\n    },\n    {\n      '1': 'module_additional',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleAdditional',\n      '9': 0,\n      '10': 'moduleAdditional'\n    },\n    {\n      '1': 'module_stat',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleStat',\n      '9': 0,\n      '10': 'moduleStat'\n    },\n    {\n      '1': 'module_fold',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleFold',\n      '9': 0,\n      '10': 'moduleFold'\n    },\n    {\n      '1': 'module_comment',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleComment',\n      '9': 0,\n      '10': 'moduleComment'\n    },\n    {\n      '1': 'module_interaction',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleInteraction',\n      '9': 0,\n      '10': 'moduleInteraction'\n    },\n    {\n      '1': 'module_author_forward',\n      '3': 13,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleAuthorForward',\n      '9': 0,\n      '10': 'moduleAuthorForward'\n    },\n    {\n      '1': 'module_ad',\n      '3': 14,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleAd',\n      '9': 0,\n      '10': 'moduleAd'\n    },\n    {\n      '1': 'module_banner',\n      '3': 15,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleBanner',\n      '9': 0,\n      '10': 'moduleBanner'\n    },\n    {\n      '1': 'module_item_null',\n      '3': 16,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleItemNull',\n      '9': 0,\n      '10': 'moduleItemNull'\n    },\n    {\n      '1': 'module_share_info',\n      '3': 17,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleShareInfo',\n      '9': 0,\n      '10': 'moduleShareInfo'\n    },\n    {\n      '1': 'module_recommend',\n      '3': 18,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleRecommend',\n      '9': 0,\n      '10': 'moduleRecommend'\n    },\n    {\n      '1': 'module_top',\n      '3': 19,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleTop',\n      '9': 0,\n      '10': 'moduleTop'\n    },\n    {\n      '1': 'module_buttom',\n      '3': 20,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleButtom',\n      '9': 0,\n      '10': 'moduleButtom'\n    },\n    {\n      '1': 'module_stat_forward',\n      '3': 21,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleStat',\n      '9': 0,\n      '10': 'moduleStatForward'\n    },\n    {\n      '1': 'module_story',\n      '3': 22,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleStory',\n      '9': 0,\n      '10': 'moduleStory'\n    },\n    {\n      '1': 'module_topic',\n      '3': 23,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleTopic',\n      '9': 0,\n      '10': 'moduleTopic'\n    },\n    {\n      '1': 'module_topic_details_ext',\n      '3': 24,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleTopicDetailsExt',\n      '9': 0,\n      '10': 'moduleTopicDetailsExt'\n    },\n    {\n      '1': 'module_top_tag',\n      '3': 25,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleTopTag',\n      '9': 0,\n      '10': 'moduleTopTag'\n    },\n    {\n      '1': 'module_topic_brief',\n      '3': 26,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleTopicBrief',\n      '9': 0,\n      '10': 'moduleTopicBrief'\n    },\n    {\n      '1': 'module_title',\n      '3': 27,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleTitle',\n      '9': 0,\n      '10': 'moduleTitle'\n    },\n    {\n      '1': 'module_button',\n      '3': 28,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleButton',\n      '9': 0,\n      '10': 'moduleButton'\n    },\n    {\n      '1': 'module_notice',\n      '3': 29,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleNotice',\n      '9': 0,\n      '10': 'moduleNotice'\n    },\n    {\n      '1': 'module_opus_summary',\n      '3': 30,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleOpusSummary',\n      '9': 0,\n      '10': 'moduleOpusSummary'\n    },\n    {\n      '1': 'module_copyright',\n      '3': 31,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleCopyright',\n      '9': 0,\n      '10': 'moduleCopyright'\n    },\n    {\n      '1': 'module_paragraph',\n      '3': 32,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleParagraph',\n      '9': 0,\n      '10': 'moduleParagraph'\n    },\n    {\n      '1': 'module_blocked',\n      '3': 33,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleBlocked',\n      '9': 0,\n      '10': 'moduleBlocked'\n    },\n    {\n      '1': 'module_text_notice',\n      '3': 34,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleTextNotice',\n      '9': 0,\n      '10': 'moduleTextNotice'\n    },\n    {\n      '1': 'module_opus_collection',\n      '3': 35,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleOpusCollection',\n      '9': 0,\n      '10': 'moduleOpusCollection'\n    },\n    {\n      '1': 'module_onetime_notice',\n      '3': 36,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleOnetimeNotice',\n      '9': 0,\n      '10': 'moduleOnetimeNotice'\n    },\n    {\n      '1': 'module_sneaking_ad',\n      '3': 37,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleSneakingAd',\n      '9': 0,\n      '10': 'moduleSneakingAd'\n    },\n    {\n      '1': 'module_manga_horizontal_page_pic_content',\n      '3': 38,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleMangaHorizontalPagePicContent',\n      '9': 0,\n      '10': 'moduleMangaHorizontalPagePicContent'\n    },\n    {\n      '1': 'module_manga_vertical_slide_pic_content',\n      '3': 39,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleMangaVerticalSlidePicContent',\n      '9': 0,\n      '10': 'moduleMangaVerticalSlidePicContent'\n    },\n    {\n      '1': 'module_manga_cover_pic_content',\n      '3': 40,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleMangaCoverPicContent',\n      '9': 0,\n      '10': 'moduleMangaCoverPicContent'\n    },\n    {\n      '1': 'module_author_for_subscribe',\n      '3': 41,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleAuthorForSubscribe',\n      '9': 0,\n      '10': 'moduleAuthorForSubscribe'\n    },\n    {\n      '1': 'module_author_slim',\n      '3': 42,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleAuthorSlim',\n      '9': 0,\n      '10': 'moduleAuthorSlim'\n    },\n    {\n      '1': 'module_manga_collection',\n      '3': 43,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleMangaCollection',\n      '9': 0,\n      '10': 'moduleMangaCollection'\n    },\n    {\n      '1': 'module_cooperation',\n      '3': 44,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleCooperation',\n      '9': 0,\n      '10': 'moduleCooperation'\n    },\n    {\n      '1': 'module_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.DynModuleType',\n      '10': 'moduleType'\n    },\n  ],\n  '8': [\n    {'1': 'module_item'},\n  ],\n};\n\n/// Descriptor for `Module`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleDescriptor = $convert.base64Decode(\n    'CgZNb2R1bGUSTAoNbW9kdWxlX2F1dGhvchgCIAEoCzIlLmJpbGliaWxpLmFwcC5keW5hbWljLn'\n    'YyLk1vZHVsZUF1dGhvckgAUgxtb2R1bGVBdXRob3ISTwoObW9kdWxlX2Rpc3B1dGUYAyABKAsy'\n    'Ji5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5Nb2R1bGVEaXNwdXRlSABSDW1vZHVsZURpc3B1dG'\n    'USRgoLbW9kdWxlX2Rlc2MYBCABKAsyIy5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5Nb2R1bGVE'\n    'ZXNjSABSCm1vZHVsZURlc2MSTwoObW9kdWxlX2R5bmFtaWMYBSABKAsyJi5iaWxpYmlsaS5hcH'\n    'AuZHluYW1pYy52Mi5Nb2R1bGVEeW5hbWljSABSDW1vZHVsZUR5bmFtaWMSUwoQbW9kdWxlX2xp'\n    'a2VfdXNlchgGIAEoCzInLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLk1vZHVsZUxpa2VVc2VySA'\n    'BSDm1vZHVsZUxpa2VVc2VyEkwKDW1vZHVsZV9leHRlbmQYByABKAsyJS5iaWxpYmlsaS5hcHAu'\n    'ZHluYW1pYy52Mi5Nb2R1bGVFeHRlbmRIAFIMbW9kdWxlRXh0ZW5kElgKEW1vZHVsZV9hZGRpdG'\n    'lvbmFsGAggASgLMikuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuTW9kdWxlQWRkaXRpb25hbEgA'\n    'UhBtb2R1bGVBZGRpdGlvbmFsEkYKC21vZHVsZV9zdGF0GAkgASgLMiMuYmlsaWJpbGkuYXBwLm'\n    'R5bmFtaWMudjIuTW9kdWxlU3RhdEgAUgptb2R1bGVTdGF0EkYKC21vZHVsZV9mb2xkGAogASgL'\n    'MiMuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuTW9kdWxlRm9sZEgAUgptb2R1bGVGb2xkEk8KDm'\n    '1vZHVsZV9jb21tZW50GAsgASgLMiYuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuTW9kdWxlQ29t'\n    'bWVudEgAUg1tb2R1bGVDb21tZW50ElsKEm1vZHVsZV9pbnRlcmFjdGlvbhgMIAEoCzIqLmJpbG'\n    'liaWxpLmFwcC5keW5hbWljLnYyLk1vZHVsZUludGVyYWN0aW9uSABSEW1vZHVsZUludGVyYWN0'\n    'aW9uEmIKFW1vZHVsZV9hdXRob3JfZm9yd2FyZBgNIAEoCzIsLmJpbGliaWxpLmFwcC5keW5hbW'\n    'ljLnYyLk1vZHVsZUF1dGhvckZvcndhcmRIAFITbW9kdWxlQXV0aG9yRm9yd2FyZBJACgltb2R1'\n    'bGVfYWQYDiABKAsyIS5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5Nb2R1bGVBZEgAUghtb2R1bG'\n    'VBZBJMCg1tb2R1bGVfYmFubmVyGA8gASgLMiUuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuTW9k'\n    'dWxlQmFubmVySABSDG1vZHVsZUJhbm5lchJTChBtb2R1bGVfaXRlbV9udWxsGBAgASgLMicuYm'\n    'lsaWJpbGkuYXBwLmR5bmFtaWMudjIuTW9kdWxlSXRlbU51bGxIAFIObW9kdWxlSXRlbU51bGwS'\n    'VgoRbW9kdWxlX3NoYXJlX2luZm8YESABKAsyKC5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5Nb2'\n    'R1bGVTaGFyZUluZm9IAFIPbW9kdWxlU2hhcmVJbmZvElUKEG1vZHVsZV9yZWNvbW1lbmQYEiAB'\n    'KAsyKC5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5Nb2R1bGVSZWNvbW1lbmRIAFIPbW9kdWxlUm'\n    'Vjb21tZW5kEkMKCm1vZHVsZV90b3AYEyABKAsyIi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5N'\n    'b2R1bGVUb3BIAFIJbW9kdWxlVG9wEkwKDW1vZHVsZV9idXR0b20YFCABKAsyJS5iaWxpYmlsaS'\n    '5hcHAuZHluYW1pYy52Mi5Nb2R1bGVCdXR0b21IAFIMbW9kdWxlQnV0dG9tElUKE21vZHVsZV9z'\n    'dGF0X2ZvcndhcmQYFSABKAsyIy5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5Nb2R1bGVTdGF0SA'\n    'BSEW1vZHVsZVN0YXRGb3J3YXJkEkkKDG1vZHVsZV9zdG9yeRgWIAEoCzIkLmJpbGliaWxpLmFw'\n    'cC5keW5hbWljLnYyLk1vZHVsZVN0b3J5SABSC21vZHVsZVN0b3J5EkkKDG1vZHVsZV90b3BpYx'\n    'gXIAEoCzIkLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLk1vZHVsZVRvcGljSABSC21vZHVsZVRv'\n    'cGljEmkKGG1vZHVsZV90b3BpY19kZXRhaWxzX2V4dBgYIAEoCzIuLmJpbGliaWxpLmFwcC5keW'\n    '5hbWljLnYyLk1vZHVsZVRvcGljRGV0YWlsc0V4dEgAUhVtb2R1bGVUb3BpY0RldGFpbHNFeHQS'\n    'TQoObW9kdWxlX3RvcF90YWcYGSABKAsyJS5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5Nb2R1bG'\n    'VUb3BUYWdIAFIMbW9kdWxlVG9wVGFnElkKEm1vZHVsZV90b3BpY19icmllZhgaIAEoCzIpLmJp'\n    'bGliaWxpLmFwcC5keW5hbWljLnYyLk1vZHVsZVRvcGljQnJpZWZIAFIQbW9kdWxlVG9waWNCcm'\n    'llZhJJCgxtb2R1bGVfdGl0bGUYGyABKAsyJC5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5Nb2R1'\n    'bGVUaXRsZUgAUgttb2R1bGVUaXRsZRJMCg1tb2R1bGVfYnV0dG9uGBwgASgLMiUuYmlsaWJpbG'\n    'kuYXBwLmR5bmFtaWMudjIuTW9kdWxlQnV0dG9uSABSDG1vZHVsZUJ1dHRvbhJMCg1tb2R1bGVf'\n    'bm90aWNlGB0gASgLMiUuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuTW9kdWxlTm90aWNlSABSDG'\n    '1vZHVsZU5vdGljZRJcChNtb2R1bGVfb3B1c19zdW1tYXJ5GB4gASgLMiouYmlsaWJpbGkuYXBw'\n    'LmR5bmFtaWMudjIuTW9kdWxlT3B1c1N1bW1hcnlIAFIRbW9kdWxlT3B1c1N1bW1hcnkSVQoQbW'\n    '9kdWxlX2NvcHlyaWdodBgfIAEoCzIoLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLk1vZHVsZUNv'\n    'cHlyaWdodEgAUg9tb2R1bGVDb3B5cmlnaHQSVQoQbW9kdWxlX3BhcmFncmFwaBggIAEoCzIoLm'\n    'JpbGliaWxpLmFwcC5keW5hbWljLnYyLk1vZHVsZVBhcmFncmFwaEgAUg9tb2R1bGVQYXJhZ3Jh'\n    'cGgSTwoObW9kdWxlX2Jsb2NrZWQYISABKAsyJi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5Nb2'\n    'R1bGVCbG9ja2VkSABSDW1vZHVsZUJsb2NrZWQSWQoSbW9kdWxlX3RleHRfbm90aWNlGCIgASgL'\n    'MikuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuTW9kdWxlVGV4dE5vdGljZUgAUhBtb2R1bGVUZX'\n    'h0Tm90aWNlEmUKFm1vZHVsZV9vcHVzX2NvbGxlY3Rpb24YIyABKAsyLS5iaWxpYmlsaS5hcHAu'\n    'ZHluYW1pYy52Mi5Nb2R1bGVPcHVzQ29sbGVjdGlvbkgAUhRtb2R1bGVPcHVzQ29sbGVjdGlvbh'\n    'JiChVtb2R1bGVfb25ldGltZV9ub3RpY2UYJCABKAsyLC5iaWxpYmlsaS5hcHAuZHluYW1pYy52'\n    'Mi5Nb2R1bGVPbmV0aW1lTm90aWNlSABSE21vZHVsZU9uZXRpbWVOb3RpY2USWQoSbW9kdWxlX3'\n    'NuZWFraW5nX2FkGCUgASgLMikuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuTW9kdWxlU25lYWtp'\n    'bmdBZEgAUhBtb2R1bGVTbmVha2luZ0FkEpUBCihtb2R1bGVfbWFuZ2FfaG9yaXpvbnRhbF9wYW'\n    'dlX3BpY19jb250ZW50GCYgASgLMjwuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuTW9kdWxlTWFu'\n    'Z2FIb3Jpem9udGFsUGFnZVBpY0NvbnRlbnRIAFIjbW9kdWxlTWFuZ2FIb3Jpem9udGFsUGFnZV'\n    'BpY0NvbnRlbnQSkgEKJ21vZHVsZV9tYW5nYV92ZXJ0aWNhbF9zbGlkZV9waWNfY29udGVudBgn'\n    'IAEoCzI7LmJpbGliaWxpLmFwcC5keW5hbWljLnYyLk1vZHVsZU1hbmdhVmVydGljYWxTbGlkZV'\n    'BpY0NvbnRlbnRIAFIibW9kdWxlTWFuZ2FWZXJ0aWNhbFNsaWRlUGljQ29udGVudBJ5Ch5tb2R1'\n    'bGVfbWFuZ2FfY292ZXJfcGljX2NvbnRlbnQYKCABKAsyMy5iaWxpYmlsaS5hcHAuZHluYW1pYy'\n    '52Mi5Nb2R1bGVNYW5nYUNvdmVyUGljQ29udGVudEgAUhptb2R1bGVNYW5nYUNvdmVyUGljQ29u'\n    'dGVudBJyChttb2R1bGVfYXV0aG9yX2Zvcl9zdWJzY3JpYmUYKSABKAsyMS5iaWxpYmlsaS5hcH'\n    'AuZHluYW1pYy52Mi5Nb2R1bGVBdXRob3JGb3JTdWJzY3JpYmVIAFIYbW9kdWxlQXV0aG9yRm9y'\n    'U3Vic2NyaWJlElkKEm1vZHVsZV9hdXRob3Jfc2xpbRgqIAEoCzIpLmJpbGliaWxpLmFwcC5keW'\n    '5hbWljLnYyLk1vZHVsZUF1dGhvclNsaW1IAFIQbW9kdWxlQXV0aG9yU2xpbRJoChdtb2R1bGVf'\n    'bWFuZ2FfY29sbGVjdGlvbhgrIAEoCzIuLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLk1vZHVsZU'\n    '1hbmdhQ29sbGVjdGlvbkgAUhVtb2R1bGVNYW5nYUNvbGxlY3Rpb24SWwoSbW9kdWxlX2Nvb3Bl'\n    'cmF0aW9uGCwgASgLMiouYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuTW9kdWxlQ29vcGVyYXRpb2'\n    '5IAFIRbW9kdWxlQ29vcGVyYXRpb24SRwoLbW9kdWxlX3R5cGUYASABKA4yJi5iaWxpYmlsaS5h'\n    'cHAuZHluYW1pYy52Mi5EeW5Nb2R1bGVUeXBlUgptb2R1bGVUeXBlQg0KC21vZHVsZV9pdGVt');\n\n@$core.Deprecated('Use moduleAdDescriptor instead')\nconst ModuleAd$json = {\n  '1': 'ModuleAd',\n  '2': [\n    {\n      '1': 'source_content',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.google.protobuf.Any',\n      '10': 'sourceContent'\n    },\n    {\n      '1': 'module_author',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleAuthor',\n      '10': 'moduleAuthor'\n    },\n    {'1': 'ad_content_type', '3': 3, '4': 1, '5': 5, '10': 'adContentType'},\n    {'1': 'cover_left_text1', '3': 4, '4': 1, '5': 9, '10': 'coverLeftText1'},\n    {'1': 'cover_left_text2', '3': 5, '4': 1, '5': 9, '10': 'coverLeftText2'},\n    {'1': 'cover_left_text3', '3': 6, '4': 1, '5': 9, '10': 'coverLeftText3'},\n  ],\n};\n\n/// Descriptor for `ModuleAd`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleAdDescriptor = $convert.base64Decode(\n    'CghNb2R1bGVBZBI7Cg5zb3VyY2VfY29udGVudBgBIAEoCzIULmdvb2dsZS5wcm90b2J1Zi5Bbn'\n    'lSDXNvdXJjZUNvbnRlbnQSSgoNbW9kdWxlX2F1dGhvchgCIAEoCzIlLmJpbGliaWxpLmFwcC5k'\n    'eW5hbWljLnYyLk1vZHVsZUF1dGhvclIMbW9kdWxlQXV0aG9yEiYKD2FkX2NvbnRlbnRfdHlwZR'\n    'gDIAEoBVINYWRDb250ZW50VHlwZRIoChBjb3Zlcl9sZWZ0X3RleHQxGAQgASgJUg5jb3Zlckxl'\n    'ZnRUZXh0MRIoChBjb3Zlcl9sZWZ0X3RleHQyGAUgASgJUg5jb3ZlckxlZnRUZXh0MhIoChBjb3'\n    'Zlcl9sZWZ0X3RleHQzGAYgASgJUg5jb3ZlckxlZnRUZXh0Mw==');\n\n@$core.Deprecated('Use moduleAdditionalDescriptor instead')\nconst ModuleAdditional$json = {\n  '1': 'ModuleAdditional',\n  '2': [\n    {\n      '1': 'pgc',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionalPGC',\n      '9': 0,\n      '10': 'pgc'\n    },\n    {\n      '1': 'goods',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionGoods',\n      '9': 0,\n      '10': 'goods'\n    },\n    {\n      '1': 'vote',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionVote',\n      '9': 0,\n      '10': 'vote'\n    },\n    {\n      '1': 'common',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionCommon',\n      '9': 0,\n      '10': 'common'\n    },\n    {\n      '1': 'esport',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionEsport',\n      '9': 0,\n      '10': 'esport'\n    },\n    {\n      '1': 'vote2',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionVote2',\n      '9': 0,\n      '10': 'vote2'\n    },\n    {\n      '1': 'ugc',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionUgc',\n      '9': 0,\n      '10': 'ugc'\n    },\n    {\n      '1': 'up',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionUP',\n      '9': 0,\n      '10': 'up'\n    },\n    {\n      '1': 'article',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionArticle',\n      '9': 0,\n      '10': 'article'\n    },\n    {\n      '1': 'live',\n      '3': 13,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionLiveRoom',\n      '9': 0,\n      '10': 'live'\n    },\n    {\n      '1': 'music',\n      '3': 14,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionMusic',\n      '9': 0,\n      '10': 'music'\n    },\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.AdditionalType',\n      '10': 'type'\n    },\n    {'1': 'rid', '3': 7, '4': 1, '5': 3, '10': 'rid'},\n    {\n      '1': 'need_write_calender',\n      '3': 11,\n      '4': 1,\n      '5': 8,\n      '10': 'needWriteCalender'\n    },\n  ],\n  '8': [\n    {'1': 'item'},\n  ],\n};\n\n/// Descriptor for `ModuleAdditional`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleAdditionalDescriptor = $convert.base64Decode(\n    'ChBNb2R1bGVBZGRpdGlvbmFsEjoKA3BnYxgCIAEoCzImLmJpbGliaWxpLmFwcC5keW5hbWljLn'\n    'YyLkFkZGl0aW9uYWxQR0NIAFIDcGdjEj4KBWdvb2RzGAMgASgLMiYuYmlsaWJpbGkuYXBwLmR5'\n    'bmFtaWMudjIuQWRkaXRpb25Hb29kc0gAUgVnb29kcxI7CgR2b3RlGAQgASgLMiUuYmlsaWJpbG'\n    'kuYXBwLmR5bmFtaWMudjIuQWRkaXRpb25Wb3RlSABSBHZvdGUSQQoGY29tbW9uGAUgASgLMicu'\n    'YmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQWRkaXRpb25Db21tb25IAFIGY29tbW9uEkEKBmVzcG'\n    '9ydBgGIAEoCzInLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkFkZGl0aW9uRXNwb3J0SABSBmVz'\n    'cG9ydBI+CgV2b3RlMhgIIAEoCzImLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkFkZGl0aW9uVm'\n    '90ZTJIAFIFdm90ZTISOAoDdWdjGAkgASgLMiQuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQWRk'\n    'aXRpb25VZ2NIAFIDdWdjEjUKAnVwGAogASgLMiMuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQW'\n    'RkaXRpb25VUEgAUgJ1cBJECgdhcnRpY2xlGAwgASgLMiguYmlsaWJpbGkuYXBwLmR5bmFtaWMu'\n    'djIuQWRkaXRpb25BcnRpY2xlSABSB2FydGljbGUSPwoEbGl2ZRgNIAEoCzIpLmJpbGliaWxpLm'\n    'FwcC5keW5hbWljLnYyLkFkZGl0aW9uTGl2ZVJvb21IAFIEbGl2ZRI+CgVtdXNpYxgOIAEoCzIm'\n    'LmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkFkZGl0aW9uTXVzaWNIAFIFbXVzaWMSOwoEdHlwZR'\n    'gBIAEoDjInLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkFkZGl0aW9uYWxUeXBlUgR0eXBlEhAK'\n    'A3JpZBgHIAEoA1IDcmlkEi4KE25lZWRfd3JpdGVfY2FsZW5kZXIYCyABKAhSEW5lZWRXcml0ZU'\n    'NhbGVuZGVyQgYKBGl0ZW0=');\n\n@$core.Deprecated('Use moduleAuthorDescriptor instead')\nconst ModuleAuthor$json = {\n  '1': 'ModuleAuthor',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'ptime_label_text', '3': 2, '4': 1, '5': 9, '10': 'ptimeLabelText'},\n    {\n      '1': 'author',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.UserInfo',\n      '10': 'author'\n    },\n    {\n      '1': 'decorate_card',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DecorateCard',\n      '10': 'decorateCard'\n    },\n    {'1': 'uri', '3': 5, '4': 1, '5': 9, '10': 'uri'},\n    {\n      '1': 'tp_list',\n      '3': 6,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ThreePointItem',\n      '10': 'tpList'\n    },\n    {\n      '1': 'badge_type',\n      '3': 7,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.ModuleAuthorBadgeType',\n      '10': 'badgeType'\n    },\n    {\n      '1': 'badge_button',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleAuthorBadgeButton',\n      '10': 'badgeButton'\n    },\n    {'1': 'attend', '3': 9, '4': 1, '5': 5, '10': 'attend'},\n    {\n      '1': 'relation',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Relation',\n      '10': 'relation'\n    },\n    {\n      '1': 'weight',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Weight',\n      '10': 'weight'\n    },\n    {'1': 'show_follow', '3': 12, '4': 1, '5': 8, '10': 'showFollow'},\n    {'1': 'is_top', '3': 13, '4': 1, '5': 8, '10': 'isTop'},\n    {\n      '1': 'ptime_location_text',\n      '3': 14,\n      '4': 1,\n      '5': 9,\n      '10': 'ptimeLocationText'\n    },\n    {'1': 'show_level', '3': 15, '4': 1, '5': 8, '10': 'showLevel'},\n    {\n      '1': 'only_fans',\n      '3': 16,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OnlyFans',\n      '10': 'onlyFans'\n    },\n    {\n      '1': 'author_badge',\n      '3': 17,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AuthorBadge',\n      '10': 'authorBadge'\n    },\n  ],\n};\n\n/// Descriptor for `ModuleAuthor`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleAuthorDescriptor = $convert.base64Decode(\n    'CgxNb2R1bGVBdXRob3ISEAoDbWlkGAEgASgDUgNtaWQSKAoQcHRpbWVfbGFiZWxfdGV4dBgCIA'\n    'EoCVIOcHRpbWVMYWJlbFRleHQSOQoGYXV0aG9yGAMgASgLMiEuYmlsaWJpbGkuYXBwLmR5bmFt'\n    'aWMudjIuVXNlckluZm9SBmF1dGhvchJKCg1kZWNvcmF0ZV9jYXJkGAQgASgLMiUuYmlsaWJpbG'\n    'kuYXBwLmR5bmFtaWMudjIuRGVjb3JhdGVDYXJkUgxkZWNvcmF0ZUNhcmQSEAoDdXJpGAUgASgJ'\n    'UgN1cmkSQAoHdHBfbGlzdBgGIAMoCzInLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlRocmVlUG'\n    '9pbnRJdGVtUgZ0cExpc3QSTQoKYmFkZ2VfdHlwZRgHIAEoDjIuLmJpbGliaWxpLmFwcC5keW5h'\n    'bWljLnYyLk1vZHVsZUF1dGhvckJhZGdlVHlwZVIJYmFkZ2VUeXBlElMKDGJhZGdlX2J1dHRvbh'\n    'gIIAEoCzIwLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLk1vZHVsZUF1dGhvckJhZGdlQnV0dG9u'\n    'UgtiYWRnZUJ1dHRvbhIWCgZhdHRlbmQYCSABKAVSBmF0dGVuZBI9CghyZWxhdGlvbhgKIAEoCz'\n    'IhLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlJlbGF0aW9uUghyZWxhdGlvbhI3CgZ3ZWlnaHQY'\n    'CyABKAsyHy5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5XZWlnaHRSBndlaWdodBIfCgtzaG93X2'\n    'ZvbGxvdxgMIAEoCFIKc2hvd0ZvbGxvdxIVCgZpc190b3AYDSABKAhSBWlzVG9wEi4KE3B0aW1l'\n    'X2xvY2F0aW9uX3RleHQYDiABKAlSEXB0aW1lTG9jYXRpb25UZXh0Eh0KCnNob3dfbGV2ZWwYDy'\n    'ABKAhSCXNob3dMZXZlbBI+Cglvbmx5X2ZhbnMYECABKAsyIS5iaWxpYmlsaS5hcHAuZHluYW1p'\n    'Yy52Mi5Pbmx5RmFuc1IIb25seUZhbnMSRwoMYXV0aG9yX2JhZGdlGBEgASgLMiQuYmlsaWJpbG'\n    'kuYXBwLmR5bmFtaWMudjIuQXV0aG9yQmFkZ2VSC2F1dGhvckJhZGdl');\n\n@$core.Deprecated('Use moduleAuthorBadgeButtonDescriptor instead')\nconst ModuleAuthorBadgeButton$json = {\n  '1': 'ModuleAuthorBadgeButton',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'state', '3': 3, '4': 1, '5': 5, '10': 'state'},\n    {'1': 'id', '3': 4, '4': 1, '5': 3, '10': 'id'},\n  ],\n};\n\n/// Descriptor for `ModuleAuthorBadgeButton`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleAuthorBadgeButtonDescriptor =\n    $convert.base64Decode(\n        'ChdNb2R1bGVBdXRob3JCYWRnZUJ1dHRvbhISCgRpY29uGAEgASgJUgRpY29uEhQKBXRpdGxlGA'\n        'IgASgJUgV0aXRsZRIUCgVzdGF0ZRgDIAEoBVIFc3RhdGUSDgoCaWQYBCABKANSAmlk');\n\n@$core.Deprecated('Use moduleAuthorForSubscribeDescriptor instead')\nconst ModuleAuthorForSubscribe$json = {\n  '1': 'ModuleAuthorForSubscribe',\n  '2': [\n    {'1': 'cover', '3': 1, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'sub_title', '3': 3, '4': 1, '5': 9, '10': 'subTitle'},\n    {\n      '1': 'subscribe_btn',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.SubscribeButton',\n      '10': 'subscribeBtn'\n    },\n  ],\n};\n\n/// Descriptor for `ModuleAuthorForSubscribe`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleAuthorForSubscribeDescriptor = $convert.base64Decode(\n    'ChhNb2R1bGVBdXRob3JGb3JTdWJzY3JpYmUSFAoFY292ZXIYASABKAlSBWNvdmVyEhQKBXRpdG'\n    'xlGAIgASgJUgV0aXRsZRIbCglzdWJfdGl0bGUYAyABKAlSCHN1YlRpdGxlEk0KDXN1YnNjcmli'\n    'ZV9idG4YBCABKAsyKC5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5TdWJzY3JpYmVCdXR0b25SDH'\n    'N1YnNjcmliZUJ0bg==');\n\n@$core.Deprecated('Use moduleAuthorForwardDescriptor instead')\nconst ModuleAuthorForward$json = {\n  '1': 'ModuleAuthorForward',\n  '2': [\n    {\n      '1': 'title',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleAuthorForwardTitle',\n      '10': 'title'\n    },\n    {'1': 'url', '3': 2, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'uid', '3': 3, '4': 1, '5': 3, '10': 'uid'},\n    {'1': 'ptime_label_text', '3': 4, '4': 1, '5': 9, '10': 'ptimeLabelText'},\n    {'1': 'show_follow', '3': 5, '4': 1, '5': 8, '10': 'showFollow'},\n    {'1': 'face_url', '3': 6, '4': 1, '5': 9, '10': 'faceUrl'},\n    {\n      '1': 'relation',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Relation',\n      '10': 'relation'\n    },\n    {\n      '1': 'tp_list',\n      '3': 8,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ThreePointItem',\n      '10': 'tpList'\n    },\n  ],\n};\n\n/// Descriptor for `ModuleAuthorForward`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleAuthorForwardDescriptor = $convert.base64Decode(\n    'ChNNb2R1bGVBdXRob3JGb3J3YXJkEkcKBXRpdGxlGAEgAygLMjEuYmlsaWJpbGkuYXBwLmR5bm'\n    'FtaWMudjIuTW9kdWxlQXV0aG9yRm9yd2FyZFRpdGxlUgV0aXRsZRIQCgN1cmwYAiABKAlSA3Vy'\n    'bBIQCgN1aWQYAyABKANSA3VpZBIoChBwdGltZV9sYWJlbF90ZXh0GAQgASgJUg5wdGltZUxhYm'\n    'VsVGV4dBIfCgtzaG93X2ZvbGxvdxgFIAEoCFIKc2hvd0ZvbGxvdxIZCghmYWNlX3VybBgGIAEo'\n    'CVIHZmFjZVVybBI9CghyZWxhdGlvbhgHIAEoCzIhLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLl'\n    'JlbGF0aW9uUghyZWxhdGlvbhJACgd0cF9saXN0GAggAygLMicuYmlsaWJpbGkuYXBwLmR5bmFt'\n    'aWMudjIuVGhyZWVQb2ludEl0ZW1SBnRwTGlzdA==');\n\n@$core.Deprecated('Use moduleAuthorForwardTitleDescriptor instead')\nconst ModuleAuthorForwardTitle$json = {\n  '1': 'ModuleAuthorForwardTitle',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'url', '3': 2, '4': 1, '5': 9, '10': 'url'},\n  ],\n};\n\n/// Descriptor for `ModuleAuthorForwardTitle`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleAuthorForwardTitleDescriptor =\n    $convert.base64Decode(\n        'ChhNb2R1bGVBdXRob3JGb3J3YXJkVGl0bGUSEgoEdGV4dBgBIAEoCVIEdGV4dBIQCgN1cmwYAi'\n        'ABKAlSA3VybA==');\n\n@$core.Deprecated('Use moduleAuthorSlimDescriptor instead')\nconst ModuleAuthorSlim$json = {\n  '1': 'ModuleAuthorSlim',\n  '2': [\n    {\n      '1': 'user_info',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.BasicUserInfoV2',\n      '10': 'userInfo'\n    },\n    {'1': 'ptime_label_text', '3': 2, '4': 1, '5': 9, '10': 'ptimeLabelText'},\n  ],\n};\n\n/// Descriptor for `ModuleAuthorSlim`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleAuthorSlimDescriptor = $convert.base64Decode(\n    'ChBNb2R1bGVBdXRob3JTbGltEkUKCXVzZXJfaW5mbxgBIAEoCzIoLmJpbGliaWxpLmFwcC5keW'\n    '5hbWljLnYyLkJhc2ljVXNlckluZm9WMlIIdXNlckluZm8SKAoQcHRpbWVfbGFiZWxfdGV4dBgC'\n    'IAEoCVIOcHRpbWVMYWJlbFRleHQ=');\n\n@$core.Deprecated('Use moduleBannerDescriptor instead')\nconst ModuleBanner$json = {\n  '1': 'ModuleBanner',\n  '2': [\n    {\n      '1': 'user',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleBannerUser',\n      '9': 0,\n      '10': 'user'\n    },\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'type',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.ModuleBannerType',\n      '10': 'type'\n    },\n    {'1': 'dislike_text', '3': 4, '4': 1, '5': 9, '10': 'dislikeText'},\n    {'1': 'dislike_icon', '3': 5, '4': 1, '5': 9, '10': 'dislikeIcon'},\n  ],\n  '8': [\n    {'1': 'item'},\n  ],\n};\n\n/// Descriptor for `ModuleBanner`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleBannerDescriptor = $convert.base64Decode(\n    'CgxNb2R1bGVCYW5uZXISPwoEdXNlchgDIAEoCzIpLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLk'\n    '1vZHVsZUJhbm5lclVzZXJIAFIEdXNlchIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSPQoEdHlwZRgC'\n    'IAEoDjIpLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLk1vZHVsZUJhbm5lclR5cGVSBHR5cGUSIQ'\n    'oMZGlzbGlrZV90ZXh0GAQgASgJUgtkaXNsaWtlVGV4dBIhCgxkaXNsaWtlX2ljb24YBSABKAlS'\n    'C2Rpc2xpa2VJY29uQgYKBGl0ZW0=');\n\n@$core.Deprecated('Use moduleBannerUserDescriptor instead')\nconst ModuleBannerUser$json = {\n  '1': 'ModuleBannerUser',\n  '2': [\n    {\n      '1': 'list',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleBannerUserItem',\n      '10': 'list'\n    },\n  ],\n};\n\n/// Descriptor for `ModuleBannerUser`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleBannerUserDescriptor = $convert.base64Decode(\n    'ChBNb2R1bGVCYW5uZXJVc2VyEkEKBGxpc3QYASADKAsyLS5iaWxpYmlsaS5hcHAuZHluYW1pYy'\n    '52Mi5Nb2R1bGVCYW5uZXJVc2VySXRlbVIEbGlzdA==');\n\n@$core.Deprecated('Use moduleBannerUserItemDescriptor instead')\nconst ModuleBannerUserItem$json = {\n  '1': 'ModuleBannerUserItem',\n  '2': [\n    {'1': 'face', '3': 1, '4': 1, '5': 9, '10': 'face'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'uid', '3': 3, '4': 1, '5': 3, '10': 'uid'},\n    {\n      '1': 'live_state',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.LiveState',\n      '10': 'liveState'\n    },\n    {\n      '1': 'official',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OfficialVerify',\n      '10': 'official'\n    },\n    {\n      '1': 'vip',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.VipInfo',\n      '10': 'vip'\n    },\n    {'1': 'label', '3': 7, '4': 1, '5': 9, '10': 'label'},\n    {\n      '1': 'button',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionalButton',\n      '10': 'button'\n    },\n    {'1': 'uri', '3': 9, '4': 1, '5': 9, '10': 'uri'},\n    {\n      '1': 'relation',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Relation',\n      '10': 'relation'\n    },\n  ],\n};\n\n/// Descriptor for `ModuleBannerUserItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleBannerUserItemDescriptor = $convert.base64Decode(\n    'ChRNb2R1bGVCYW5uZXJVc2VySXRlbRISCgRmYWNlGAEgASgJUgRmYWNlEhIKBG5hbWUYAiABKA'\n    'lSBG5hbWUSEAoDdWlkGAMgASgDUgN1aWQSQQoKbGl2ZV9zdGF0ZRgEIAEoDjIiLmJpbGliaWxp'\n    'LmFwcC5keW5hbWljLnYyLkxpdmVTdGF0ZVIJbGl2ZVN0YXRlEkMKCG9mZmljaWFsGAUgASgLMi'\n    'cuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuT2ZmaWNpYWxWZXJpZnlSCG9mZmljaWFsEjIKA3Zp'\n    'cBgGIAEoCzIgLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlZpcEluZm9SA3ZpcBIUCgVsYWJlbB'\n    'gHIAEoCVIFbGFiZWwSQQoGYnV0dG9uGAggASgLMikuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIu'\n    'QWRkaXRpb25hbEJ1dHRvblIGYnV0dG9uEhAKA3VyaRgJIAEoCVIDdXJpEj0KCHJlbGF0aW9uGA'\n    'ogASgLMiEuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuUmVsYXRpb25SCHJlbGF0aW9u');\n\n@$core.Deprecated('Use moduleBlockedDescriptor instead')\nconst ModuleBlocked$json = {\n  '1': 'ModuleBlocked',\n  '2': [\n    {\n      '1': 'icon',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ImageSet',\n      '10': 'icon'\n    },\n    {\n      '1': 'bg_img',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ImageSet',\n      '10': 'bgImg'\n    },\n    {'1': 'hint_message', '3': 3, '4': 1, '5': 9, '10': 'hintMessage'},\n    {\n      '1': 'act_btn',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.IconButton',\n      '10': 'actBtn'\n    },\n    {\n      '1': 'block_style',\n      '3': 5,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.MdlBlockedStyle',\n      '10': 'blockStyle'\n    },\n    {'1': 'sub_hint_message', '3': 6, '4': 1, '5': 9, '10': 'subHintMessage'},\n    {\n      '1': 'video_bottom_text_upper',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OneLineText',\n      '10': 'videoBottomTextUpper'\n    },\n    {\n      '1': 'video_bottom_text_lower',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OneLineText',\n      '10': 'videoBottomTextLower'\n    },\n    {'1': 'archive_title', '3': 9, '4': 1, '5': 9, '10': 'archiveTitle'},\n    {\n      '1': 'hint_message_one_line',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OneLineText',\n      '10': 'hintMessageOneLine'\n    },\n  ],\n};\n\n/// Descriptor for `ModuleBlocked`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleBlockedDescriptor = $convert.base64Decode(\n    'Cg1Nb2R1bGVCbG9ja2VkEjUKBGljb24YASABKAsyIS5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi'\n    '5JbWFnZVNldFIEaWNvbhI4CgZiZ19pbWcYAiABKAsyIS5iaWxpYmlsaS5hcHAuZHluYW1pYy52'\n    'Mi5JbWFnZVNldFIFYmdJbWcSIQoMaGludF9tZXNzYWdlGAMgASgJUgtoaW50TWVzc2FnZRI8Cg'\n    'dhY3RfYnRuGAQgASgLMiMuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuSWNvbkJ1dHRvblIGYWN0'\n    'QnRuEkkKC2Jsb2NrX3N0eWxlGAUgASgOMiguYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuTWRsQm'\n    'xvY2tlZFN0eWxlUgpibG9ja1N0eWxlEigKEHN1Yl9oaW50X21lc3NhZ2UYBiABKAlSDnN1Ykhp'\n    'bnRNZXNzYWdlElsKF3ZpZGVvX2JvdHRvbV90ZXh0X3VwcGVyGAcgASgLMiQuYmlsaWJpbGkuYX'\n    'BwLmR5bmFtaWMudjIuT25lTGluZVRleHRSFHZpZGVvQm90dG9tVGV4dFVwcGVyElsKF3ZpZGVv'\n    'X2JvdHRvbV90ZXh0X2xvd2VyGAggASgLMiQuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuT25lTG'\n    'luZVRleHRSFHZpZGVvQm90dG9tVGV4dExvd2VyEiMKDWFyY2hpdmVfdGl0bGUYCSABKAlSDGFy'\n    'Y2hpdmVUaXRsZRJXChVoaW50X21lc3NhZ2Vfb25lX2xpbmUYCiABKAsyJC5iaWxpYmlsaS5hcH'\n    'AuZHluYW1pYy52Mi5PbmVMaW5lVGV4dFISaGludE1lc3NhZ2VPbmVMaW5l');\n\n@$core.Deprecated('Use moduleButtomDescriptor instead')\nconst ModuleButtom$json = {\n  '1': 'ModuleButtom',\n  '2': [\n    {\n      '1': 'module_stat',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleStat',\n      '10': 'moduleStat'\n    },\n    {'1': 'comment_box', '3': 2, '4': 1, '5': 8, '10': 'commentBox'},\n    {'1': 'comment_box_msg', '3': 3, '4': 1, '5': 9, '10': 'commentBoxMsg'},\n    {\n      '1': 'interaction_icons',\n      '3': 4,\n      '4': 3,\n      '5': 5,\n      '10': 'interactionIcons'\n    },\n    {\n      '1': 'faces',\n      '3': 5,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.InteractionFace',\n      '10': 'faces'\n    },\n  ],\n  '4': [ModuleButtom_InteractionIcon$json],\n};\n\n@$core.Deprecated('Use moduleButtomDescriptor instead')\nconst ModuleButtom_InteractionIcon$json = {\n  '1': 'InteractionIcon',\n  '2': [\n    {'1': 'ICON_INVALID', '2': 0},\n    {'1': 'ICON_FORWARD', '2': 1},\n    {'1': 'ICON_COMMENT', '2': 2},\n    {'1': 'ICON_FAVORITE', '2': 3},\n    {'1': 'ICON_LIKE', '2': 4},\n  ],\n};\n\n/// Descriptor for `ModuleButtom`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleButtomDescriptor = $convert.base64Decode(\n    'CgxNb2R1bGVCdXR0b20SRAoLbW9kdWxlX3N0YXQYASABKAsyIy5iaWxpYmlsaS5hcHAuZHluYW'\n    '1pYy52Mi5Nb2R1bGVTdGF0Ugptb2R1bGVTdGF0Eh8KC2NvbW1lbnRfYm94GAIgASgIUgpjb21t'\n    'ZW50Qm94EiYKD2NvbW1lbnRfYm94X21zZxgDIAEoCVINY29tbWVudEJveE1zZxIrChFpbnRlcm'\n    'FjdGlvbl9pY29ucxgEIAMoBVIQaW50ZXJhY3Rpb25JY29ucxI+CgVmYWNlcxgFIAMoCzIoLmJp'\n    'bGliaWxpLmFwcC5keW5hbWljLnYyLkludGVyYWN0aW9uRmFjZVIFZmFjZXMiaQoPSW50ZXJhY3'\n    'Rpb25JY29uEhAKDElDT05fSU5WQUxJRBAAEhAKDElDT05fRk9SV0FSRBABEhAKDElDT05fQ09N'\n    'TUVOVBACEhEKDUlDT05fRkFWT1JJVEUQAxINCglJQ09OX0xJS0UQBA==');\n\n@$core.Deprecated('Use moduleButtonDescriptor instead')\nconst ModuleButton$json = {\n  '1': 'ModuleButton',\n  '2': [\n    {\n      '1': 'btn',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.IconButton',\n      '10': 'btn'\n    },\n  ],\n};\n\n/// Descriptor for `ModuleButton`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleButtonDescriptor = $convert.base64Decode(\n    'CgxNb2R1bGVCdXR0b24SNQoDYnRuGAEgASgLMiMuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuSW'\n    'NvbkJ1dHRvblIDYnRu');\n\n@$core.Deprecated('Use moduleCommentDescriptor instead')\nconst ModuleComment$json = {\n  '1': 'ModuleComment',\n  '2': [\n    {\n      '1': 'cmt_show_item',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CmtShowItem',\n      '10': 'cmtShowItem'\n    },\n  ],\n};\n\n/// Descriptor for `ModuleComment`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleCommentDescriptor = $convert.base64Decode(\n    'Cg1Nb2R1bGVDb21tZW50EkgKDWNtdF9zaG93X2l0ZW0YASADKAsyJC5iaWxpYmlsaS5hcHAuZH'\n    'luYW1pYy52Mi5DbXRTaG93SXRlbVILY210U2hvd0l0ZW0=');\n\n@$core.Deprecated('Use moduleCooperationDescriptor instead')\nconst ModuleCooperation$json = {\n  '1': 'ModuleCooperation',\n  '2': [\n    {'1': 'oid', '3': 1, '4': 1, '5': 9, '10': 'oid'},\n    {\n      '1': 'up_list',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CooperationUpInfo',\n      '10': 'upList'\n    },\n    {\n      '1': 'more_btn',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.IconButton',\n      '10': 'moreBtn'\n    },\n    {\n      '1': 'tp_list',\n      '3': 4,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ThreePointItem',\n      '10': 'tpList'\n    },\n    {'1': 'float_title', '3': 5, '4': 1, '5': 9, '10': 'floatTitle'},\n  ],\n};\n\n/// Descriptor for `ModuleCooperation`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleCooperationDescriptor = $convert.base64Decode(\n    'ChFNb2R1bGVDb29wZXJhdGlvbhIQCgNvaWQYASABKAlSA29pZBJDCgd1cF9saXN0GAIgAygLMi'\n    'ouYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQ29vcGVyYXRpb25VcEluZm9SBnVwTGlzdBI+Cght'\n    'b3JlX2J0bhgDIAEoCzIjLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkljb25CdXR0b25SB21vcm'\n    'VCdG4SQAoHdHBfbGlzdBgEIAMoCzInLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlRocmVlUG9p'\n    'bnRJdGVtUgZ0cExpc3QSHwoLZmxvYXRfdGl0bGUYBSABKAlSCmZsb2F0VGl0bGU=');\n\n@$core.Deprecated('Use moduleCopyrightDescriptor instead')\nconst ModuleCopyright$json = {\n  '1': 'ModuleCopyright',\n  '2': [\n    {'1': 'left_text', '3': 1, '4': 1, '5': 9, '10': 'leftText'},\n    {'1': 'right_text', '3': 2, '4': 1, '5': 9, '10': 'rightText'},\n  ],\n};\n\n/// Descriptor for `ModuleCopyright`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleCopyrightDescriptor = $convert.base64Decode(\n    'Cg9Nb2R1bGVDb3B5cmlnaHQSGwoJbGVmdF90ZXh0GAEgASgJUghsZWZ0VGV4dBIdCgpyaWdodF'\n    '90ZXh0GAIgASgJUglyaWdodFRleHQ=');\n\n@$core.Deprecated('Use moduleDescDescriptor instead')\nconst ModuleDesc$json = {\n  '1': 'ModuleDesc',\n  '2': [\n    {\n      '1': 'desc',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Description',\n      '10': 'desc'\n    },\n    {'1': 'jump_uri', '3': 2, '4': 1, '5': 9, '10': 'jumpUri'},\n    {'1': 'text', '3': 3, '4': 1, '5': 9, '10': 'text'},\n  ],\n};\n\n/// Descriptor for `ModuleDesc`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleDescDescriptor = $convert.base64Decode(\n    'CgpNb2R1bGVEZXNjEjgKBGRlc2MYASADKAsyJC5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5EZX'\n    'NjcmlwdGlvblIEZGVzYxIZCghqdW1wX3VyaRgCIAEoCVIHanVtcFVyaRISCgR0ZXh0GAMgASgJ'\n    'UgR0ZXh0');\n\n@$core.Deprecated('Use moduleDescGoodsDescriptor instead')\nconst ModuleDescGoods$json = {\n  '1': 'ModuleDescGoods',\n  '2': [\n    {'1': 'source_type', '3': 1, '4': 1, '5': 5, '10': 'sourceType'},\n    {'1': 'jump_url', '3': 2, '4': 1, '5': 9, '10': 'jumpUrl'},\n    {'1': 'schema_url', '3': 3, '4': 1, '5': 9, '10': 'schemaUrl'},\n    {'1': 'item_id', '3': 4, '4': 1, '5': 3, '10': 'itemId'},\n    {'1': 'open_white_list', '3': 5, '4': 3, '5': 9, '10': 'openWhiteList'},\n    {'1': 'user_web_v2', '3': 6, '4': 1, '5': 8, '10': 'userWebV2'},\n    {'1': 'ad_mark', '3': 7, '4': 1, '5': 9, '10': 'adMark'},\n    {\n      '1': 'schema_package_name',\n      '3': 8,\n      '4': 1,\n      '5': 9,\n      '10': 'schemaPackageName'\n    },\n    {\n      '1': 'jump_type',\n      '3': 9,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.GoodsJumpType',\n      '10': 'jumpType'\n    },\n    {'1': 'app_name', '3': 10, '4': 1, '5': 9, '10': 'appName'},\n  ],\n};\n\n/// Descriptor for `ModuleDescGoods`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleDescGoodsDescriptor = $convert.base64Decode(\n    'Cg9Nb2R1bGVEZXNjR29vZHMSHwoLc291cmNlX3R5cGUYASABKAVSCnNvdXJjZVR5cGUSGQoIan'\n    'VtcF91cmwYAiABKAlSB2p1bXBVcmwSHQoKc2NoZW1hX3VybBgDIAEoCVIJc2NoZW1hVXJsEhcK'\n    'B2l0ZW1faWQYBCABKANSBml0ZW1JZBImCg9vcGVuX3doaXRlX2xpc3QYBSADKAlSDW9wZW5XaG'\n    'l0ZUxpc3QSHgoLdXNlcl93ZWJfdjIYBiABKAhSCXVzZXJXZWJWMhIXCgdhZF9tYXJrGAcgASgJ'\n    'UgZhZE1hcmsSLgoTc2NoZW1hX3BhY2thZ2VfbmFtZRgIIAEoCVIRc2NoZW1hUGFja2FnZU5hbW'\n    'USQwoJanVtcF90eXBlGAkgASgOMiYuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuR29vZHNKdW1w'\n    'VHlwZVIIanVtcFR5cGUSGQoIYXBwX25hbWUYCiABKAlSB2FwcE5hbWU=');\n\n@$core.Deprecated('Use moduleDisputeDescriptor instead')\nconst ModuleDispute$json = {\n  '1': 'ModuleDispute',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'desc', '3': 2, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n  ],\n};\n\n/// Descriptor for `ModuleDispute`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleDisputeDescriptor = $convert.base64Decode(\n    'Cg1Nb2R1bGVEaXNwdXRlEhQKBXRpdGxlGAEgASgJUgV0aXRsZRISCgRkZXNjGAIgASgJUgRkZX'\n    'NjEhAKA3VyaRgDIAEoCVIDdXJp');\n\n@$core.Deprecated('Use moduleDynamicDescriptor instead')\nconst ModuleDynamic$json = {\n  '1': 'ModuleDynamic',\n  '2': [\n    {\n      '1': 'dyn_archive',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynArchive',\n      '9': 0,\n      '10': 'dynArchive'\n    },\n    {\n      '1': 'dyn_pgc',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynPGC',\n      '9': 0,\n      '10': 'dynPgc'\n    },\n    {\n      '1': 'dyn_cour_season',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynCourSeason',\n      '9': 0,\n      '10': 'dynCourSeason'\n    },\n    {\n      '1': 'dyn_cour_batch',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynCourBatch',\n      '9': 0,\n      '10': 'dynCourBatch'\n    },\n    {\n      '1': 'dyn_forward',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynForward',\n      '9': 0,\n      '10': 'dynForward'\n    },\n    {\n      '1': 'dyn_draw',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynDraw',\n      '9': 0,\n      '10': 'dynDraw'\n    },\n    {\n      '1': 'dyn_article',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynArticle',\n      '9': 0,\n      '10': 'dynArticle'\n    },\n    {\n      '1': 'dyn_music',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynMusic',\n      '9': 0,\n      '10': 'dynMusic'\n    },\n    {\n      '1': 'dyn_common',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynCommon',\n      '9': 0,\n      '10': 'dynCommon'\n    },\n    {\n      '1': 'dyn_common_live',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynLive',\n      '9': 0,\n      '10': 'dynCommonLive'\n    },\n    {\n      '1': 'dyn_medialist',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynMedialist',\n      '9': 0,\n      '10': 'dynMedialist'\n    },\n    {\n      '1': 'dyn_applet',\n      '3': 13,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynApplet',\n      '9': 0,\n      '10': 'dynApplet'\n    },\n    {\n      '1': 'dyn_subscription',\n      '3': 14,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynSubscription',\n      '9': 0,\n      '10': 'dynSubscription'\n    },\n    {\n      '1': 'dyn_live_rcmd',\n      '3': 15,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynLiveRcmd',\n      '9': 0,\n      '10': 'dynLiveRcmd'\n    },\n    {\n      '1': 'dyn_ugc_season',\n      '3': 16,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynUGCSeason',\n      '9': 0,\n      '10': 'dynUgcSeason'\n    },\n    {\n      '1': 'dyn_subscription_new',\n      '3': 17,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynSubscriptionNew',\n      '9': 0,\n      '10': 'dynSubscriptionNew'\n    },\n    {\n      '1': 'dyn_cour_batch_up',\n      '3': 18,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynCourUp',\n      '9': 0,\n      '10': 'dynCourBatchUp'\n    },\n    {\n      '1': 'dyn_topic_set',\n      '3': 19,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynTopicSet',\n      '9': 0,\n      '10': 'dynTopicSet'\n    },\n    {\n      '1': 'dyn_charging_archive',\n      '3': 20,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynChargingArchive',\n      '9': 0,\n      '10': 'dynChargingArchive'\n    },\n    {\n      '1': 'dyn_share_charging_qa',\n      '3': 21,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynShareChargingQA',\n      '9': 0,\n      '10': 'dynShareChargingQa'\n    },\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.ModuleDynamicType',\n      '10': 'type'\n    },\n  ],\n  '8': [\n    {'1': 'module_item'},\n  ],\n};\n\n/// Descriptor for `ModuleDynamic`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleDynamicDescriptor = $convert.base64Decode(\n    'Cg1Nb2R1bGVEeW5hbWljEkkKC2R5bl9hcmNoaXZlGAIgASgLMiYuYmlsaWJpbGkuYXBwLmR5bm'\n    'FtaWMudjIuTWRsRHluQXJjaGl2ZUgAUgpkeW5BcmNoaXZlEj0KB2R5bl9wZ2MYAyABKAsyIi5i'\n    'aWxpYmlsaS5hcHAuZHluYW1pYy52Mi5NZGxEeW5QR0NIAFIGZHluUGdjElMKD2R5bl9jb3VyX3'\n    'NlYXNvbhgEIAEoCzIpLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLk1kbER5bkNvdXJTZWFzb25I'\n    'AFINZHluQ291clNlYXNvbhJQCg5keW5fY291cl9iYXRjaBgFIAEoCzIoLmJpbGliaWxpLmFwcC'\n    '5keW5hbWljLnYyLk1kbER5bkNvdXJCYXRjaEgAUgxkeW5Db3VyQmF0Y2gSSQoLZHluX2Zvcndh'\n    'cmQYBiABKAsyJi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5NZGxEeW5Gb3J3YXJkSABSCmR5bk'\n    'ZvcndhcmQSQAoIZHluX2RyYXcYByABKAsyIy5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5NZGxE'\n    'eW5EcmF3SABSB2R5bkRyYXcSSQoLZHluX2FydGljbGUYCCABKAsyJi5iaWxpYmlsaS5hcHAuZH'\n    'luYW1pYy52Mi5NZGxEeW5BcnRpY2xlSABSCmR5bkFydGljbGUSQwoJZHluX211c2ljGAkgASgL'\n    'MiQuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuTWRsRHluTXVzaWNIAFIIZHluTXVzaWMSRgoKZH'\n    'luX2NvbW1vbhgKIAEoCzIlLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLk1kbER5bkNvbW1vbkgA'\n    'UglkeW5Db21tb24STQoPZHluX2NvbW1vbl9saXZlGAsgASgLMiMuYmlsaWJpbGkuYXBwLmR5bm'\n    'FtaWMudjIuTWRsRHluTGl2ZUgAUg1keW5Db21tb25MaXZlEk8KDWR5bl9tZWRpYWxpc3QYDCAB'\n    'KAsyKC5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5NZGxEeW5NZWRpYWxpc3RIAFIMZHluTWVkaW'\n    'FsaXN0EkYKCmR5bl9hcHBsZXQYDSABKAsyJS5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5NZGxE'\n    'eW5BcHBsZXRIAFIJZHluQXBwbGV0ElgKEGR5bl9zdWJzY3JpcHRpb24YDiABKAsyKy5iaWxpYm'\n    'lsaS5hcHAuZHluYW1pYy52Mi5NZGxEeW5TdWJzY3JpcHRpb25IAFIPZHluU3Vic2NyaXB0aW9u'\n    'Ek0KDWR5bl9saXZlX3JjbWQYDyABKAsyJy5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5NZGxEeW'\n    '5MaXZlUmNtZEgAUgtkeW5MaXZlUmNtZBJQCg5keW5fdWdjX3NlYXNvbhgQIAEoCzIoLmJpbGli'\n    'aWxpLmFwcC5keW5hbWljLnYyLk1kbER5blVHQ1NlYXNvbkgAUgxkeW5VZ2NTZWFzb24SYgoUZH'\n    'luX3N1YnNjcmlwdGlvbl9uZXcYESABKAsyLi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5NZGxE'\n    'eW5TdWJzY3JpcHRpb25OZXdIAFISZHluU3Vic2NyaXB0aW9uTmV3ElIKEWR5bl9jb3VyX2JhdG'\n    'NoX3VwGBIgASgLMiUuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuTWRsRHluQ291clVwSABSDmR5'\n    'bkNvdXJCYXRjaFVwEk0KDWR5bl90b3BpY19zZXQYEyABKAsyJy5iaWxpYmlsaS5hcHAuZHluYW'\n    '1pYy52Mi5NZGxEeW5Ub3BpY1NldEgAUgtkeW5Ub3BpY1NldBJiChRkeW5fY2hhcmdpbmdfYXJj'\n    'aGl2ZRgUIAEoCzIuLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLk1kbER5bkNoYXJnaW5nQXJjaG'\n    'l2ZUgAUhJkeW5DaGFyZ2luZ0FyY2hpdmUSYwoVZHluX3NoYXJlX2NoYXJnaW5nX3FhGBUgASgL'\n    'Mi4uYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuTWRsRHluU2hhcmVDaGFyZ2luZ1FBSABSEmR5bl'\n    'NoYXJlQ2hhcmdpbmdRYRI+CgR0eXBlGAEgASgOMiouYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIu'\n    'TW9kdWxlRHluYW1pY1R5cGVSBHR5cGVCDQoLbW9kdWxlX2l0ZW0=');\n\n@$core.Deprecated('Use moduleExtendDescriptor instead')\nconst ModuleExtend$json = {\n  '1': 'ModuleExtend',\n  '2': [\n    {\n      '1': 'extend',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleExtendItem',\n      '10': 'extend'\n    },\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n  ],\n};\n\n/// Descriptor for `ModuleExtend`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleExtendDescriptor = $convert.base64Decode(\n    'CgxNb2R1bGVFeHRlbmQSQQoGZXh0ZW5kGAEgAygLMikuYmlsaWJpbGkuYXBwLmR5bmFtaWMudj'\n    'IuTW9kdWxlRXh0ZW5kSXRlbVIGZXh0ZW5kEhAKA3VyaRgCIAEoCVIDdXJp');\n\n@$core.Deprecated('Use moduleExtendItemDescriptor instead')\nconst ModuleExtendItem$json = {\n  '1': 'ModuleExtendItem',\n  '2': [\n    {\n      '1': 'ext_info_topic',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ExtInfoTopic',\n      '9': 0,\n      '10': 'extInfoTopic'\n    },\n    {\n      '1': 'ext_info_lbs',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ExtInfoLBS',\n      '9': 0,\n      '10': 'extInfoLbs'\n    },\n    {\n      '1': 'ext_info_hot',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ExtInfoHot',\n      '9': 0,\n      '10': 'extInfoHot'\n    },\n    {\n      '1': 'ext_info_game',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ExtInfoGame',\n      '9': 0,\n      '10': 'extInfoGame'\n    },\n    {\n      '1': 'ext_info_common',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ExtInfoCommon',\n      '9': 0,\n      '10': 'extInfoCommon'\n    },\n    {\n      '1': 'ext_info_ogv',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ExtInfoOGV',\n      '9': 0,\n      '10': 'extInfoOgv'\n    },\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.DynExtendType',\n      '10': 'type'\n    },\n  ],\n  '8': [\n    {'1': 'extend'},\n  ],\n};\n\n/// Descriptor for `ModuleExtendItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleExtendItemDescriptor = $convert.base64Decode(\n    'ChBNb2R1bGVFeHRlbmRJdGVtEk0KDmV4dF9pbmZvX3RvcGljGAIgASgLMiUuYmlsaWJpbGkuYX'\n    'BwLmR5bmFtaWMudjIuRXh0SW5mb1RvcGljSABSDGV4dEluZm9Ub3BpYxJHCgxleHRfaW5mb19s'\n    'YnMYAyABKAsyIy5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5FeHRJbmZvTEJTSABSCmV4dEluZm'\n    '9MYnMSRwoMZXh0X2luZm9faG90GAQgASgLMiMuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuRXh0'\n    'SW5mb0hvdEgAUgpleHRJbmZvSG90EkoKDWV4dF9pbmZvX2dhbWUYBSABKAsyJC5iaWxpYmlsaS'\n    '5hcHAuZHluYW1pYy52Mi5FeHRJbmZvR2FtZUgAUgtleHRJbmZvR2FtZRJQCg9leHRfaW5mb19j'\n    'b21tb24YBiABKAsyJi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5FeHRJbmZvQ29tbW9uSABSDW'\n    'V4dEluZm9Db21tb24SRwoMZXh0X2luZm9fb2d2GAcgASgLMiMuYmlsaWJpbGkuYXBwLmR5bmFt'\n    'aWMudjIuRXh0SW5mb09HVkgAUgpleHRJbmZvT2d2EjoKBHR5cGUYASABKA4yJi5iaWxpYmlsaS'\n    '5hcHAuZHluYW1pYy52Mi5EeW5FeHRlbmRUeXBlUgR0eXBlQggKBmV4dGVuZA==');\n\n@$core.Deprecated('Use moduleFoldDescriptor instead')\nconst ModuleFold$json = {\n  '1': 'ModuleFold',\n  '2': [\n    {\n      '1': 'fold_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.FoldType',\n      '10': 'foldType'\n    },\n    {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'fold_ids', '3': 3, '4': 1, '5': 9, '10': 'foldIds'},\n    {\n      '1': 'fold_users',\n      '3': 4,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.UserInfo',\n      '10': 'foldUsers'\n    },\n    {\n      '1': 'topic_merged_resource',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.TopicMergedResource',\n      '10': 'topicMergedResource'\n    },\n  ],\n};\n\n/// Descriptor for `ModuleFold`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleFoldDescriptor = $convert.base64Decode(\n    'CgpNb2R1bGVGb2xkEj4KCWZvbGRfdHlwZRgBIAEoDjIhLmJpbGliaWxpLmFwcC5keW5hbWljLn'\n    'YyLkZvbGRUeXBlUghmb2xkVHlwZRISCgR0ZXh0GAIgASgJUgR0ZXh0EhkKCGZvbGRfaWRzGAMg'\n    'ASgJUgdmb2xkSWRzEkAKCmZvbGRfdXNlcnMYBCADKAsyIS5iaWxpYmlsaS5hcHAuZHluYW1pYy'\n    '52Mi5Vc2VySW5mb1IJZm9sZFVzZXJzEmAKFXRvcGljX21lcmdlZF9yZXNvdXJjZRgFIAEoCzIs'\n    'LmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlRvcGljTWVyZ2VkUmVzb3VyY2VSE3RvcGljTWVyZ2'\n    'VkUmVzb3VyY2U=');\n\n@$core.Deprecated('Use moduleInteractionDescriptor instead')\nconst ModuleInteraction$json = {\n  '1': 'ModuleInteraction',\n  '2': [\n    {\n      '1': 'interaction_item',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.InteractionItem',\n      '10': 'interactionItem'\n    },\n  ],\n};\n\n/// Descriptor for `ModuleInteraction`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleInteractionDescriptor = $convert.base64Decode(\n    'ChFNb2R1bGVJbnRlcmFjdGlvbhJTChBpbnRlcmFjdGlvbl9pdGVtGAEgAygLMiguYmlsaWJpbG'\n    'kuYXBwLmR5bmFtaWMudjIuSW50ZXJhY3Rpb25JdGVtUg9pbnRlcmFjdGlvbkl0ZW0=');\n\n@$core.Deprecated('Use moduleItemNullDescriptor instead')\nconst ModuleItemNull$json = {\n  '1': 'ModuleItemNull',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},\n  ],\n};\n\n/// Descriptor for `ModuleItemNull`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleItemNullDescriptor = $convert.base64Decode(\n    'Cg5Nb2R1bGVJdGVtTnVsbBISCgRpY29uGAEgASgJUgRpY29uEhIKBHRleHQYAiABKAlSBHRleH'\n    'Q=');\n\n@$core.Deprecated('Use moduleLikeUserDescriptor instead')\nconst ModuleLikeUser$json = {\n  '1': 'ModuleLikeUser',\n  '2': [\n    {\n      '1': 'like_users',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.LikeUser',\n      '10': 'likeUsers'\n    },\n    {'1': 'display_text', '3': 2, '4': 1, '5': 9, '10': 'displayText'},\n  ],\n};\n\n/// Descriptor for `ModuleLikeUser`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleLikeUserDescriptor = $convert.base64Decode(\n    'Cg5Nb2R1bGVMaWtlVXNlchJACgpsaWtlX3VzZXJzGAEgAygLMiEuYmlsaWJpbGkuYXBwLmR5bm'\n    'FtaWMudjIuTGlrZVVzZXJSCWxpa2VVc2VycxIhCgxkaXNwbGF5X3RleHQYAiABKAlSC2Rpc3Bs'\n    'YXlUZXh0');\n\n@$core.Deprecated('Use moduleMangaCollectionDescriptor instead')\nconst ModuleMangaCollection$json = {\n  '1': 'ModuleMangaCollection',\n  '2': [\n    {'1': 'title_icon', '3': 1, '4': 1, '5': 9, '10': 'titleIcon'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'sub_text_left', '3': 3, '4': 1, '5': 9, '10': 'subTextLeft'},\n    {'1': 'sub_text_right', '3': 4, '4': 1, '5': 9, '10': 'subTextRight'},\n    {\n      '1': 'subscribe_btn',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.SubscribeButton',\n      '10': 'subscribeBtn'\n    },\n    {\n      '1': 'manga_collection_info',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OpusCollection',\n      '10': 'mangaCollectionInfo'\n    },\n    {\n      '1': 'float_btn_prev_link',\n      '3': 7,\n      '4': 1,\n      '5': 9,\n      '10': 'floatBtnPrevLink'\n    },\n    {\n      '1': 'float_btn_next_link',\n      '3': 8,\n      '4': 1,\n      '5': 9,\n      '10': 'floatBtnNextLink'\n    },\n  ],\n};\n\n/// Descriptor for `ModuleMangaCollection`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleMangaCollectionDescriptor = $convert.base64Decode(\n    'ChVNb2R1bGVNYW5nYUNvbGxlY3Rpb24SHQoKdGl0bGVfaWNvbhgBIAEoCVIJdGl0bGVJY29uEh'\n    'QKBXRpdGxlGAIgASgJUgV0aXRsZRIiCg1zdWJfdGV4dF9sZWZ0GAMgASgJUgtzdWJUZXh0TGVm'\n    'dBIkCg5zdWJfdGV4dF9yaWdodBgEIAEoCVIMc3ViVGV4dFJpZ2h0Ek0KDXN1YnNjcmliZV9idG'\n    '4YBSABKAsyKC5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5TdWJzY3JpYmVCdXR0b25SDHN1YnNj'\n    'cmliZUJ0bhJbChVtYW5nYV9jb2xsZWN0aW9uX2luZm8YBiABKAsyJy5iaWxpYmlsaS5hcHAuZH'\n    'luYW1pYy52Mi5PcHVzQ29sbGVjdGlvblITbWFuZ2FDb2xsZWN0aW9uSW5mbxItChNmbG9hdF9i'\n    'dG5fcHJldl9saW5rGAcgASgJUhBmbG9hdEJ0blByZXZMaW5rEi0KE2Zsb2F0X2J0bl9uZXh0X2'\n    'xpbmsYCCABKAlSEGZsb2F0QnRuTmV4dExpbms=');\n\n@$core.Deprecated('Use moduleMangaCoverPicContentDescriptor instead')\nconst ModuleMangaCoverPicContent$json = {\n  '1': 'ModuleMangaCoverPicContent',\n  '2': [\n    {\n      '1': 'manga_pic',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MangaLikePic',\n      '10': 'mangaPic'\n    },\n    {\n      '1': 'pic_click_action',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.MangaLikePicClickAction',\n      '10': 'picClickAction'\n    },\n  ],\n};\n\n/// Descriptor for `ModuleMangaCoverPicContent`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleMangaCoverPicContentDescriptor = $convert.base64Decode(\n    'ChpNb2R1bGVNYW5nYUNvdmVyUGljQ29udGVudBJCCgltYW5nYV9waWMYASABKAsyJS5iaWxpYm'\n    'lsaS5hcHAuZHluYW1pYy52Mi5NYW5nYUxpa2VQaWNSCG1hbmdhUGljEloKEHBpY19jbGlja19h'\n    'Y3Rpb24YAiABKA4yMC5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5NYW5nYUxpa2VQaWNDbGlja0'\n    'FjdGlvblIOcGljQ2xpY2tBY3Rpb24=');\n\n@$core.Deprecated('Use moduleMangaHorizontalPagePicContentDescriptor instead')\nconst ModuleMangaHorizontalPagePicContent$json = {\n  '1': 'ModuleMangaHorizontalPagePicContent',\n  '2': [\n    {\n      '1': 'page_direction',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.MangaLikePageDirection',\n      '10': 'pageDirection'\n    },\n    {\n      '1': 'manga_pics',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MangaLikePic',\n      '10': 'mangaPics'\n    },\n    {\n      '1': 'pic_click_action',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.MangaLikePicClickAction',\n      '10': 'picClickAction'\n    },\n    {\n      '1': 'browser_guidance',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MangaLikeBrowserGuidance',\n      '10': 'browserGuidance'\n    },\n  ],\n};\n\n/// Descriptor for `ModuleMangaHorizontalPagePicContent`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleMangaHorizontalPagePicContentDescriptor = $convert.base64Decode(\n    'CiNNb2R1bGVNYW5nYUhvcml6b250YWxQYWdlUGljQ29udGVudBJWCg5wYWdlX2RpcmVjdGlvbh'\n    'gBIAEoDjIvLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLk1hbmdhTGlrZVBhZ2VEaXJlY3Rpb25S'\n    'DXBhZ2VEaXJlY3Rpb24SRAoKbWFuZ2FfcGljcxgCIAMoCzIlLmJpbGliaWxpLmFwcC5keW5hbW'\n    'ljLnYyLk1hbmdhTGlrZVBpY1IJbWFuZ2FQaWNzEloKEHBpY19jbGlja19hY3Rpb24YAyABKA4y'\n    'MC5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5NYW5nYUxpa2VQaWNDbGlja0FjdGlvblIOcGljQ2'\n    'xpY2tBY3Rpb24SXAoQYnJvd3Nlcl9ndWlkYW5jZRgEIAEoCzIxLmJpbGliaWxpLmFwcC5keW5h'\n    'bWljLnYyLk1hbmdhTGlrZUJyb3dzZXJHdWlkYW5jZVIPYnJvd3Nlckd1aWRhbmNl');\n\n@$core.Deprecated('Use moduleMangaVerticalSlidePicContentDescriptor instead')\nconst ModuleMangaVerticalSlidePicContent$json = {\n  '1': 'ModuleMangaVerticalSlidePicContent',\n  '2': [\n    {\n      '1': 'manga_pic',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MangaLikePic',\n      '10': 'mangaPic'\n    },\n    {\n      '1': 'pic_click_action',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.MangaLikePicClickAction',\n      '10': 'picClickAction'\n    },\n  ],\n};\n\n/// Descriptor for `ModuleMangaVerticalSlidePicContent`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleMangaVerticalSlidePicContentDescriptor =\n    $convert.base64Decode(\n        'CiJNb2R1bGVNYW5nYVZlcnRpY2FsU2xpZGVQaWNDb250ZW50EkIKCW1hbmdhX3BpYxgBIAEoCz'\n        'IlLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLk1hbmdhTGlrZVBpY1IIbWFuZ2FQaWMSWgoQcGlj'\n        'X2NsaWNrX2FjdGlvbhgCIAEoDjIwLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLk1hbmdhTGlrZV'\n        'BpY0NsaWNrQWN0aW9uUg5waWNDbGlja0FjdGlvbg==');\n\n@$core.Deprecated('Use moduleNoticeDescriptor instead')\nconst ModuleNotice$json = {\n  '1': 'ModuleNotice',\n  '2': [\n    {'1': 'identity', '3': 1, '4': 1, '5': 9, '10': 'identity'},\n    {'1': 'icon', '3': 2, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'title', '3': 3, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'url', '3': 4, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'notice_type', '3': 5, '4': 1, '5': 5, '10': 'noticeType'},\n  ],\n};\n\n/// Descriptor for `ModuleNotice`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleNoticeDescriptor = $convert.base64Decode(\n    'CgxNb2R1bGVOb3RpY2USGgoIaWRlbnRpdHkYASABKAlSCGlkZW50aXR5EhIKBGljb24YAiABKA'\n    'lSBGljb24SFAoFdGl0bGUYAyABKAlSBXRpdGxlEhAKA3VybBgEIAEoCVIDdXJsEh8KC25vdGlj'\n    'ZV90eXBlGAUgASgFUgpub3RpY2VUeXBl');\n\n@$core.Deprecated('Use moduleOnetimeNoticeDescriptor instead')\nconst ModuleOnetimeNotice$json = {\n  '1': 'ModuleOnetimeNotice',\n  '2': [\n    {'1': 'uuid', '3': 1, '4': 1, '5': 9, '10': 'uuid'},\n    {\n      '1': 'text_notice',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.TextParagraph',\n      '10': 'textNotice'\n    },\n    {'1': 'jump_uri', '3': 3, '4': 1, '5': 9, '10': 'jumpUri'},\n  ],\n};\n\n/// Descriptor for `ModuleOnetimeNotice`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleOnetimeNoticeDescriptor = $convert.base64Decode(\n    'ChNNb2R1bGVPbmV0aW1lTm90aWNlEhIKBHV1aWQYASABKAlSBHV1aWQSRwoLdGV4dF9ub3RpY2'\n    'UYAiABKAsyJi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5UZXh0UGFyYWdyYXBoUgp0ZXh0Tm90'\n    'aWNlEhkKCGp1bXBfdXJpGAMgASgJUgdqdW1wVXJp');\n\n@$core.Deprecated('Use moduleOpusCollectionDescriptor instead')\nconst ModuleOpusCollection$json = {\n  '1': 'ModuleOpusCollection',\n  '2': [\n    {\n      '1': 'collection_info',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OpusCollection',\n      '10': 'collectionInfo'\n    },\n    {'1': 'title_upper', '3': 2, '4': 1, '5': 9, '10': 'titleUpper'},\n    {'1': 'title', '3': 3, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'title_prefix_icon', '3': 4, '4': 1, '5': 9, '10': 'titlePrefixIcon'},\n    {'1': 'total_text', '3': 5, '4': 1, '5': 9, '10': 'totalText'},\n  ],\n};\n\n/// Descriptor for `ModuleOpusCollection`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleOpusCollectionDescriptor = $convert.base64Decode(\n    'ChRNb2R1bGVPcHVzQ29sbGVjdGlvbhJQCg9jb2xsZWN0aW9uX2luZm8YASABKAsyJy5iaWxpYm'\n    'lsaS5hcHAuZHluYW1pYy52Mi5PcHVzQ29sbGVjdGlvblIOY29sbGVjdGlvbkluZm8SHwoLdGl0'\n    'bGVfdXBwZXIYAiABKAlSCnRpdGxlVXBwZXISFAoFdGl0bGUYAyABKAlSBXRpdGxlEioKEXRpdG'\n    'xlX3ByZWZpeF9pY29uGAQgASgJUg90aXRsZVByZWZpeEljb24SHQoKdG90YWxfdGV4dBgFIAEo'\n    'CVIJdG90YWxUZXh0');\n\n@$core.Deprecated('Use moduleOpusSummaryDescriptor instead')\nconst ModuleOpusSummary$json = {\n  '1': 'ModuleOpusSummary',\n  '2': [\n    {\n      '1': 'title',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Paragraph',\n      '10': 'title'\n    },\n    {\n      '1': 'summary',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Paragraph',\n      '10': 'summary'\n    },\n    {\n      '1': 'summary_jump_btn_text',\n      '3': 3,\n      '4': 1,\n      '5': 9,\n      '10': 'summaryJumpBtnText'\n    },\n    {\n      '1': 'covers',\n      '3': 4,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynDrawItem',\n      '10': 'covers'\n    },\n  ],\n};\n\n/// Descriptor for `ModuleOpusSummary`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleOpusSummaryDescriptor = $convert.base64Decode(\n    'ChFNb2R1bGVPcHVzU3VtbWFyeRI4CgV0aXRsZRgBIAEoCzIiLmJpbGliaWxpLmFwcC5keW5hbW'\n    'ljLnYyLlBhcmFncmFwaFIFdGl0bGUSPAoHc3VtbWFyeRgCIAEoCzIiLmJpbGliaWxpLmFwcC5k'\n    'eW5hbWljLnYyLlBhcmFncmFwaFIHc3VtbWFyeRIxChVzdW1tYXJ5X2p1bXBfYnRuX3RleHQYAy'\n    'ABKAlSEnN1bW1hcnlKdW1wQnRuVGV4dBI/CgZjb3ZlcnMYBCADKAsyJy5iaWxpYmlsaS5hcHAu'\n    'ZHluYW1pYy52Mi5NZGxEeW5EcmF3SXRlbVIGY292ZXJz');\n\n@$core.Deprecated('Use moduleParagraphDescriptor instead')\nconst ModuleParagraph$json = {\n  '1': 'ModuleParagraph',\n  '2': [\n    {\n      '1': 'paragraph',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Paragraph',\n      '10': 'paragraph'\n    },\n    {'1': 'is_article_title', '3': 2, '4': 1, '5': 8, '10': 'isArticleTitle'},\n    {\n      '1': 'para_spacing',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ParaSpacing',\n      '10': 'paraSpacing'\n    },\n  ],\n};\n\n/// Descriptor for `ModuleParagraph`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleParagraphDescriptor = $convert.base64Decode(\n    'Cg9Nb2R1bGVQYXJhZ3JhcGgSQAoJcGFyYWdyYXBoGAEgASgLMiIuYmlsaWJpbGkuYXBwLmR5bm'\n    'FtaWMudjIuUGFyYWdyYXBoUglwYXJhZ3JhcGgSKAoQaXNfYXJ0aWNsZV90aXRsZRgCIAEoCFIO'\n    'aXNBcnRpY2xlVGl0bGUSRwoMcGFyYV9zcGFjaW5nGAMgASgLMiQuYmlsaWJpbGkuYXBwLmR5bm'\n    'FtaWMudjIuUGFyYVNwYWNpbmdSC3BhcmFTcGFjaW5n');\n\n@$core.Deprecated('Use moduleRcmdDescriptor instead')\nconst ModuleRcmd$json = {\n  '1': 'ModuleRcmd',\n  '2': [\n    {\n      '1': 'author',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.RcmdAuthor',\n      '10': 'author'\n    },\n    {\n      '1': 'items',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.RcmdItem',\n      '10': 'items'\n    },\n    {'1': 'server_info', '3': 3, '4': 1, '5': 9, '10': 'serverInfo'},\n  ],\n};\n\n/// Descriptor for `ModuleRcmd`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleRcmdDescriptor = $convert.base64Decode(\n    'CgpNb2R1bGVSY21kEjsKBmF1dGhvchgBIAEoCzIjLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLl'\n    'JjbWRBdXRob3JSBmF1dGhvchI3CgVpdGVtcxgCIAMoCzIhLmJpbGliaWxpLmFwcC5keW5hbWlj'\n    'LnYyLlJjbWRJdGVtUgVpdGVtcxIfCgtzZXJ2ZXJfaW5mbxgDIAEoCVIKc2VydmVySW5mbw==');\n\n@$core.Deprecated('Use moduleRecommendDescriptor instead')\nconst ModuleRecommend$json = {\n  '1': 'ModuleRecommend',\n  '2': [\n    {'1': 'module_title', '3': 1, '4': 1, '5': 9, '10': 'moduleTitle'},\n    {'1': 'image', '3': 2, '4': 1, '5': 9, '10': 'image'},\n    {'1': 'tag', '3': 3, '4': 1, '5': 9, '10': 'tag'},\n    {'1': 'title', '3': 4, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'jump_url', '3': 5, '4': 1, '5': 9, '10': 'jumpUrl'},\n    {\n      '1': 'ad',\n      '3': 6,\n      '4': 3,\n      '5': 11,\n      '6': '.google.protobuf.Any',\n      '10': 'ad'\n    },\n  ],\n};\n\n/// Descriptor for `ModuleRecommend`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleRecommendDescriptor = $convert.base64Decode(\n    'Cg9Nb2R1bGVSZWNvbW1lbmQSIQoMbW9kdWxlX3RpdGxlGAEgASgJUgttb2R1bGVUaXRsZRIUCg'\n    'VpbWFnZRgCIAEoCVIFaW1hZ2USEAoDdGFnGAMgASgJUgN0YWcSFAoFdGl0bGUYBCABKAlSBXRp'\n    'dGxlEhkKCGp1bXBfdXJsGAUgASgJUgdqdW1wVXJsEiQKAmFkGAYgAygLMhQuZ29vZ2xlLnByb3'\n    'RvYnVmLkFueVICYWQ=');\n\n@$core.Deprecated('Use moduleShareInfoDescriptor instead')\nconst ModuleShareInfo$json = {\n  '1': 'ModuleShareInfo',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'share_channels',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ShareChannel',\n      '10': 'shareChannels'\n    },\n    {'1': 'share_origin', '3': 3, '4': 1, '5': 9, '10': 'shareOrigin'},\n    {'1': 'oid', '3': 4, '4': 1, '5': 9, '10': 'oid'},\n    {'1': 'sid', '3': 5, '4': 1, '5': 9, '10': 'sid'},\n  ],\n};\n\n/// Descriptor for `ModuleShareInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleShareInfoDescriptor = $convert.base64Decode(\n    'Cg9Nb2R1bGVTaGFyZUluZm8SFAoFdGl0bGUYASABKAlSBXRpdGxlEkwKDnNoYXJlX2NoYW5uZW'\n    'xzGAIgAygLMiUuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuU2hhcmVDaGFubmVsUg1zaGFyZUNo'\n    'YW5uZWxzEiEKDHNoYXJlX29yaWdpbhgDIAEoCVILc2hhcmVPcmlnaW4SEAoDb2lkGAQgASgJUg'\n    'NvaWQSEAoDc2lkGAUgASgJUgNzaWQ=');\n\n@$core.Deprecated('Use moduleSneakingAdDescriptor instead')\nconst ModuleSneakingAd$json = {\n  '1': 'ModuleSneakingAd',\n  '2': [\n    {\n      '1': 'client_action_type',\n      '3': 1,\n      '4': 1,\n      '5': 9,\n      '10': 'clientActionType'\n    },\n  ],\n};\n\n/// Descriptor for `ModuleSneakingAd`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleSneakingAdDescriptor = $convert.base64Decode(\n    'ChBNb2R1bGVTbmVha2luZ0FkEiwKEmNsaWVudF9hY3Rpb25fdHlwZRgBIAEoCVIQY2xpZW50QW'\n    'N0aW9uVHlwZQ==');\n\n@$core.Deprecated('Use moduleStatDescriptor instead')\nconst ModuleStat$json = {\n  '1': 'ModuleStat',\n  '2': [\n    {'1': 'repost', '3': 1, '4': 1, '5': 3, '10': 'repost'},\n    {'1': 'like', '3': 2, '4': 1, '5': 3, '10': 'like'},\n    {'1': 'reply', '3': 3, '4': 1, '5': 3, '10': 'reply'},\n    {\n      '1': 'like_info',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.LikeInfo',\n      '10': 'likeInfo'\n    },\n    {'1': 'no_comment', '3': 5, '4': 1, '5': 8, '10': 'noComment'},\n    {'1': 'no_forward', '3': 6, '4': 1, '5': 8, '10': 'noForward'},\n    {'1': 'reply_url', '3': 7, '4': 1, '5': 9, '10': 'replyUrl'},\n    {'1': 'no_comment_text', '3': 8, '4': 1, '5': 9, '10': 'noCommentText'},\n    {'1': 'no_forward_text', '3': 9, '4': 1, '5': 9, '10': 'noForwardText'},\n    {'1': 'favorite', '3': 10, '4': 1, '5': 3, '10': 'favorite'},\n    {'1': 'is_favorite', '3': 11, '4': 1, '5': 8, '10': 'isFavorite'},\n    {'1': 'no_like', '3': 12, '4': 1, '5': 8, '10': 'noLike'},\n    {'1': 'no_like_text', '3': 13, '4': 1, '5': 9, '10': 'noLikeText'},\n  ],\n};\n\n/// Descriptor for `ModuleStat`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleStatDescriptor = $convert.base64Decode(\n    'CgpNb2R1bGVTdGF0EhYKBnJlcG9zdBgBIAEoA1IGcmVwb3N0EhIKBGxpa2UYAiABKANSBGxpa2'\n    'USFAoFcmVwbHkYAyABKANSBXJlcGx5Ej4KCWxpa2VfaW5mbxgEIAEoCzIhLmJpbGliaWxpLmFw'\n    'cC5keW5hbWljLnYyLkxpa2VJbmZvUghsaWtlSW5mbxIdCgpub19jb21tZW50GAUgASgIUglub0'\n    'NvbW1lbnQSHQoKbm9fZm9yd2FyZBgGIAEoCFIJbm9Gb3J3YXJkEhsKCXJlcGx5X3VybBgHIAEo'\n    'CVIIcmVwbHlVcmwSJgoPbm9fY29tbWVudF90ZXh0GAggASgJUg1ub0NvbW1lbnRUZXh0EiYKD2'\n    '5vX2ZvcndhcmRfdGV4dBgJIAEoCVINbm9Gb3J3YXJkVGV4dBIaCghmYXZvcml0ZRgKIAEoA1II'\n    'ZmF2b3JpdGUSHwoLaXNfZmF2b3JpdGUYCyABKAhSCmlzRmF2b3JpdGUSFwoHbm9fbGlrZRgMIA'\n    'EoCFIGbm9MaWtlEiAKDG5vX2xpa2VfdGV4dBgNIAEoCVIKbm9MaWtlVGV4dA==');\n\n@$core.Deprecated('Use moduleStoryDescriptor instead')\nconst ModuleStory$json = {\n  '1': 'ModuleStory',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'items',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.StoryItem',\n      '10': 'items'\n    },\n    {\n      '1': 'show_publish_entrance',\n      '3': 3,\n      '4': 1,\n      '5': 8,\n      '10': 'showPublishEntrance'\n    },\n    {'1': 'fold_state', '3': 4, '4': 1, '5': 3, '10': 'foldState'},\n    {'1': 'uri', '3': 5, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'cover', '3': 6, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'publish_text', '3': 7, '4': 1, '5': 9, '10': 'publishText'},\n  ],\n};\n\n/// Descriptor for `ModuleStory`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleStoryDescriptor = $convert.base64Decode(\n    'CgtNb2R1bGVTdG9yeRIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSOAoFaXRlbXMYAiADKAsyIi5iaW'\n    'xpYmlsaS5hcHAuZHluYW1pYy52Mi5TdG9yeUl0ZW1SBWl0ZW1zEjIKFXNob3dfcHVibGlzaF9l'\n    'bnRyYW5jZRgDIAEoCFITc2hvd1B1Ymxpc2hFbnRyYW5jZRIdCgpmb2xkX3N0YXRlGAQgASgDUg'\n    'lmb2xkU3RhdGUSEAoDdXJpGAUgASgJUgN1cmkSFAoFY292ZXIYBiABKAlSBWNvdmVyEiEKDHB1'\n    'Ymxpc2hfdGV4dBgHIAEoCVILcHVibGlzaFRleHQ=');\n\n@$core.Deprecated('Use moduleTextNoticeDescriptor instead')\nconst ModuleTextNotice$json = {\n  '1': 'ModuleTextNotice',\n  '2': [\n    {\n      '1': 'notice',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OneLineText',\n      '10': 'notice'\n    },\n  ],\n};\n\n/// Descriptor for `ModuleTextNotice`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleTextNoticeDescriptor = $convert.base64Decode(\n    'ChBNb2R1bGVUZXh0Tm90aWNlEjwKBm5vdGljZRgBIAEoCzIkLmJpbGliaWxpLmFwcC5keW5hbW'\n    'ljLnYyLk9uZUxpbmVUZXh0UgZub3RpY2U=');\n\n@$core.Deprecated('Use moduleTitleDescriptor instead')\nconst ModuleTitle$json = {\n  '1': 'ModuleTitle',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'right_btn',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.IconButton',\n      '10': 'rightBtn'\n    },\n    {'1': 'title_style', '3': 3, '4': 1, '5': 5, '10': 'titleStyle'},\n  ],\n};\n\n/// Descriptor for `ModuleTitle`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleTitleDescriptor = $convert.base64Decode(\n    'CgtNb2R1bGVUaXRsZRIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSQAoJcmlnaHRfYnRuGAIgASgLMi'\n    'MuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuSWNvbkJ1dHRvblIIcmlnaHRCdG4SHwoLdGl0bGVf'\n    'c3R5bGUYAyABKAVSCnRpdGxlU3R5bGU=');\n\n@$core.Deprecated('Use moduleTopDescriptor instead')\nconst ModuleTop$json = {\n  '1': 'ModuleTop',\n  '2': [\n    {\n      '1': 'tp_list',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ThreePointItem',\n      '10': 'tpList'\n    },\n    {\n      '1': 'archive',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynArchive',\n      '10': 'archive'\n    },\n    {\n      '1': 'author',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleAuthor',\n      '10': 'author'\n    },\n    {'1': 'hidden_nav_bar', '3': 4, '4': 1, '5': 8, '10': 'hiddenNavBar'},\n    {\n      '1': 'subscribe_author',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ModuleAuthorForSubscribe',\n      '10': 'subscribeAuthor'\n    },\n  ],\n};\n\n/// Descriptor for `ModuleTop`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleTopDescriptor = $convert.base64Decode(\n    'CglNb2R1bGVUb3ASQAoHdHBfbGlzdBgBIAMoCzInLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLl'\n    'RocmVlUG9pbnRJdGVtUgZ0cExpc3QSQAoHYXJjaGl2ZRgCIAEoCzImLmJpbGliaWxpLmFwcC5k'\n    'eW5hbWljLnYyLk1kbER5bkFyY2hpdmVSB2FyY2hpdmUSPQoGYXV0aG9yGAMgASgLMiUuYmlsaW'\n    'JpbGkuYXBwLmR5bmFtaWMudjIuTW9kdWxlQXV0aG9yUgZhdXRob3ISJAoOaGlkZGVuX25hdl9i'\n    'YXIYBCABKAhSDGhpZGRlbk5hdkJhchJcChBzdWJzY3JpYmVfYXV0aG9yGAUgASgLMjEuYmlsaW'\n    'JpbGkuYXBwLmR5bmFtaWMudjIuTW9kdWxlQXV0aG9yRm9yU3Vic2NyaWJlUg9zdWJzY3JpYmVB'\n    'dXRob3I=');\n\n@$core.Deprecated('Use moduleTopTagDescriptor instead')\nconst ModuleTopTag$json = {\n  '1': 'ModuleTopTag',\n  '2': [\n    {'1': 'tag_name', '3': 1, '4': 1, '5': 9, '10': 'tagName'},\n  ],\n};\n\n/// Descriptor for `ModuleTopTag`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleTopTagDescriptor = $convert\n    .base64Decode('CgxNb2R1bGVUb3BUYWcSGQoIdGFnX25hbWUYASABKAlSB3RhZ05hbWU=');\n\n@$core.Deprecated('Use moduleTopicDescriptor instead')\nconst ModuleTopic$json = {\n  '1': 'ModuleTopic',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'url', '3': 3, '4': 1, '5': 9, '10': 'url'},\n  ],\n};\n\n/// Descriptor for `ModuleTopic`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleTopicDescriptor = $convert.base64Decode(\n    'CgtNb2R1bGVUb3BpYxIOCgJpZBgBIAEoA1ICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIQCgN1cm'\n    'wYAyABKAlSA3VybA==');\n\n@$core.Deprecated('Use moduleTopicBriefDescriptor instead')\nconst ModuleTopicBrief$json = {\n  '1': 'ModuleTopicBrief',\n  '2': [\n    {\n      '1': 'topic',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.TopicItem',\n      '10': 'topic'\n    },\n  ],\n};\n\n/// Descriptor for `ModuleTopicBrief`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleTopicBriefDescriptor = $convert.base64Decode(\n    'ChBNb2R1bGVUb3BpY0JyaWVmEjgKBXRvcGljGAEgASgLMiIuYmlsaWJpbGkuYXBwLmR5bmFtaW'\n    'MudjIuVG9waWNJdGVtUgV0b3BpYw==');\n\n@$core.Deprecated('Use moduleTopicDetailsExtDescriptor instead')\nconst ModuleTopicDetailsExt$json = {\n  '1': 'ModuleTopicDetailsExt',\n  '2': [\n    {'1': 'comment_guide', '3': 1, '4': 1, '5': 9, '10': 'commentGuide'},\n  ],\n};\n\n/// Descriptor for `ModuleTopicDetailsExt`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleTopicDetailsExtDescriptor = $convert.base64Decode(\n    'ChVNb2R1bGVUb3BpY0RldGFpbHNFeHQSIwoNY29tbWVudF9ndWlkZRgBIAEoCVIMY29tbWVudE'\n    'd1aWRl');\n\n@$core.Deprecated('Use nFTInfoDescriptor instead')\nconst NFTInfo$json = {\n  '1': 'NFTInfo',\n  '2': [\n    {\n      '1': 'region_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.NFTRegionType',\n      '10': 'regionType'\n    },\n    {'1': 'region_icon', '3': 2, '4': 1, '5': 9, '10': 'regionIcon'},\n    {\n      '1': 'region_show_status',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.NFTShowStatus',\n      '10': 'regionShowStatus'\n    },\n  ],\n};\n\n/// Descriptor for `NFTInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List nFTInfoDescriptor = $convert.base64Decode(\n    'CgdORlRJbmZvEkcKC3JlZ2lvbl90eXBlGAEgASgOMiYuYmlsaWJpbGkuYXBwLmR5bmFtaWMudj'\n    'IuTkZUUmVnaW9uVHlwZVIKcmVnaW9uVHlwZRIfCgtyZWdpb25faWNvbhgCIAEoCVIKcmVnaW9u'\n    'SWNvbhJUChJyZWdpb25fc2hvd19zdGF0dXMYAyABKA4yJi5iaWxpYmlsaS5hcHAuZHluYW1pYy'\n    '52Mi5ORlRTaG93U3RhdHVzUhByZWdpb25TaG93U3RhdHVz');\n\n@$core.Deprecated('Use nameplateDescriptor instead')\nconst Nameplate$json = {\n  '1': 'Nameplate',\n  '2': [\n    {'1': 'nid', '3': 1, '4': 1, '5': 3, '10': 'nid'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'image', '3': 3, '4': 1, '5': 9, '10': 'image'},\n    {'1': 'image_small', '3': 4, '4': 1, '5': 9, '10': 'imageSmall'},\n    {'1': 'level', '3': 5, '4': 1, '5': 9, '10': 'level'},\n    {'1': 'condition', '3': 6, '4': 1, '5': 9, '10': 'condition'},\n  ],\n};\n\n/// Descriptor for `Nameplate`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List nameplateDescriptor = $convert.base64Decode(\n    'CglOYW1lcGxhdGUSEAoDbmlkGAEgASgDUgNuaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIUCgVpbW'\n    'FnZRgDIAEoCVIFaW1hZ2USHwoLaW1hZ2Vfc21hbGwYBCABKAlSCmltYWdlU21hbGwSFAoFbGV2'\n    'ZWwYBSABKAlSBWxldmVsEhwKCWNvbmRpdGlvbhgGIAEoCVIJY29uZGl0aW9u');\n\n@$core.Deprecated('Use newEPDescriptor instead')\nconst NewEP$json = {\n  '1': 'NewEP',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 5, '10': 'id'},\n    {'1': 'index_show', '3': 2, '4': 1, '5': 9, '10': 'indexShow'},\n    {'1': 'cover', '3': 3, '4': 1, '5': 9, '10': 'cover'},\n  ],\n};\n\n/// Descriptor for `NewEP`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List newEPDescriptor = $convert.base64Decode(\n    'CgVOZXdFUBIOCgJpZBgBIAEoBVICaWQSHQoKaW5kZXhfc2hvdxgCIAEoCVIJaW5kZXhTaG93Eh'\n    'QKBWNvdmVyGAMgASgJUgVjb3Zlcg==');\n\n@$core.Deprecated('Use noReplyDescriptor instead')\nconst NoReply$json = {\n  '1': 'NoReply',\n};\n\n/// Descriptor for `NoReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List noReplyDescriptor =\n    $convert.base64Decode('CgdOb1JlcGx5');\n\n@$core.Deprecated('Use noReqDescriptor instead')\nconst NoReq$json = {\n  '1': 'NoReq',\n};\n\n/// Descriptor for `NoReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List noReqDescriptor =\n    $convert.base64Decode('CgVOb1JlcQ==');\n\n@$core.Deprecated('Use noteVideoTSDescriptor instead')\nconst NoteVideoTS$json = {\n  '1': 'NoteVideoTS',\n  '2': [\n    {'1': 'cid', '3': 1, '4': 1, '5': 3, '10': 'cid'},\n    {'1': 'oid_type', '3': 2, '4': 1, '5': 3, '10': 'oidType'},\n    {'1': 'status', '3': 3, '4': 1, '5': 3, '10': 'status'},\n    {'1': 'index', '3': 4, '4': 1, '5': 3, '10': 'index'},\n    {'1': 'seconds', '3': 5, '4': 1, '5': 3, '10': 'seconds'},\n    {'1': 'cid_count', '3': 6, '4': 1, '5': 3, '10': 'cidCount'},\n    {'1': 'key', '3': 7, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'title', '3': 8, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'epid', '3': 9, '4': 1, '5': 3, '10': 'epid'},\n    {'1': 'desc', '3': 10, '4': 1, '5': 9, '10': 'desc'},\n  ],\n};\n\n/// Descriptor for `NoteVideoTS`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List noteVideoTSDescriptor = $convert.base64Decode(\n    'CgtOb3RlVmlkZW9UUxIQCgNjaWQYASABKANSA2NpZBIZCghvaWRfdHlwZRgCIAEoA1IHb2lkVH'\n    'lwZRIWCgZzdGF0dXMYAyABKANSBnN0YXR1cxIUCgVpbmRleBgEIAEoA1IFaW5kZXgSGAoHc2Vj'\n    'b25kcxgFIAEoA1IHc2Vjb25kcxIbCgljaWRfY291bnQYBiABKANSCGNpZENvdW50EhAKA2tleR'\n    'gHIAEoCVIDa2V5EhQKBXRpdGxlGAggASgJUgV0aXRsZRISCgRlcGlkGAkgASgDUgRlcGlkEhIK'\n    'BGRlc2MYCiABKAlSBGRlc2M=');\n\n@$core.Deprecated('Use officialAccountInfoDescriptor instead')\nconst OfficialAccountInfo$json = {\n  '1': 'OfficialAccountInfo',\n  '2': [\n    {\n      '1': 'author',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.UserInfo',\n      '10': 'author'\n    },\n    {'1': 'mid', '3': 2, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n    {\n      '1': 'relation',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Relation',\n      '10': 'relation'\n    },\n    {'1': 'desc_text1', '3': 5, '4': 1, '5': 9, '10': 'descText1'},\n    {'1': 'desc_text2', '3': 6, '4': 1, '5': 9, '10': 'descText2'},\n  ],\n};\n\n/// Descriptor for `OfficialAccountInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List officialAccountInfoDescriptor = $convert.base64Decode(\n    'ChNPZmZpY2lhbEFjY291bnRJbmZvEjkKBmF1dGhvchgBIAEoCzIhLmJpbGliaWxpLmFwcC5keW'\n    '5hbWljLnYyLlVzZXJJbmZvUgZhdXRob3ISEAoDbWlkGAIgASgDUgNtaWQSEAoDdXJpGAMgASgJ'\n    'UgN1cmkSPQoIcmVsYXRpb24YBCABKAsyIS5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5SZWxhdG'\n    'lvblIIcmVsYXRpb24SHQoKZGVzY190ZXh0MRgFIAEoCVIJZGVzY1RleHQxEh0KCmRlc2NfdGV4'\n    'dDIYBiABKAlSCWRlc2NUZXh0Mg==');\n\n@$core.Deprecated('Use officialAccountsReplyDescriptor instead')\nconst OfficialAccountsReply$json = {\n  '1': 'OfficialAccountsReply',\n  '2': [\n    {\n      '1': 'items',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OfficialAccountInfo',\n      '10': 'items'\n    },\n    {'1': 'has_more', '3': 2, '4': 1, '5': 8, '10': 'hasMore'},\n    {'1': 'offset', '3': 3, '4': 1, '5': 3, '10': 'offset'},\n  ],\n};\n\n/// Descriptor for `OfficialAccountsReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List officialAccountsReplyDescriptor = $convert.base64Decode(\n    'ChVPZmZpY2lhbEFjY291bnRzUmVwbHkSQgoFaXRlbXMYASADKAsyLC5iaWxpYmlsaS5hcHAuZH'\n    'luYW1pYy52Mi5PZmZpY2lhbEFjY291bnRJbmZvUgVpdGVtcxIZCghoYXNfbW9yZRgCIAEoCFIH'\n    'aGFzTW9yZRIWCgZvZmZzZXQYAyABKANSBm9mZnNldA==');\n\n@$core.Deprecated('Use officialAccountsReqDescriptor instead')\nconst OfficialAccountsReq$json = {\n  '1': 'OfficialAccountsReq',\n  '2': [\n    {'1': 'campus_id', '3': 1, '4': 1, '5': 3, '10': 'campusId'},\n    {'1': 'campus_name', '3': 2, '4': 1, '5': 9, '10': 'campusName'},\n    {'1': 'offset', '3': 3, '4': 1, '5': 3, '10': 'offset'},\n    {\n      '1': 'from_type',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CampusReqFromType',\n      '10': 'fromType'\n    },\n  ],\n};\n\n/// Descriptor for `OfficialAccountsReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List officialAccountsReqDescriptor = $convert.base64Decode(\n    'ChNPZmZpY2lhbEFjY291bnRzUmVxEhsKCWNhbXB1c19pZBgBIAEoA1IIY2FtcHVzSWQSHwoLY2'\n    'FtcHVzX25hbWUYAiABKAlSCmNhbXB1c05hbWUSFgoGb2Zmc2V0GAMgASgDUgZvZmZzZXQSRwoJ'\n    'ZnJvbV90eXBlGAQgASgOMiouYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQ2FtcHVzUmVxRnJvbV'\n    'R5cGVSCGZyb21UeXBl');\n\n@$core.Deprecated('Use officialDynamicsReplyDescriptor instead')\nconst OfficialDynamicsReply$json = {\n  '1': 'OfficialDynamicsReply',\n  '2': [\n    {\n      '1': 'items',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OfficialItem',\n      '10': 'items'\n    },\n    {'1': 'offset', '3': 2, '4': 1, '5': 3, '10': 'offset'},\n    {'1': 'has_more', '3': 3, '4': 1, '5': 8, '10': 'hasMore'},\n    {\n      '1': 'player_args',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n  ],\n};\n\n/// Descriptor for `OfficialDynamicsReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List officialDynamicsReplyDescriptor = $convert.base64Decode(\n    'ChVPZmZpY2lhbER5bmFtaWNzUmVwbHkSOwoFaXRlbXMYASADKAsyJS5iaWxpYmlsaS5hcHAuZH'\n    'luYW1pYy52Mi5PZmZpY2lhbEl0ZW1SBWl0ZW1zEhYKBm9mZnNldBgCIAEoA1IGb2Zmc2V0EhkK'\n    'CGhhc19tb3JlGAMgASgIUgdoYXNNb3JlEk8KC3BsYXllcl9hcmdzGAQgASgLMi4uYmlsaWJpbG'\n    'kuYXBwLmFyY2hpdmUubWlkZGxld2FyZS52MS5QbGF5ZXJBcmdzUgpwbGF5ZXJBcmdz');\n\n@$core.Deprecated('Use officialDynamicsReqDescriptor instead')\nconst OfficialDynamicsReq$json = {\n  '1': 'OfficialDynamicsReq',\n  '2': [\n    {'1': 'campus_id', '3': 1, '4': 1, '5': 3, '10': 'campusId'},\n    {'1': 'campus_name', '3': 2, '4': 1, '5': 9, '10': 'campusName'},\n    {'1': 'offset', '3': 3, '4': 1, '5': 3, '10': 'offset'},\n    {\n      '1': 'from_type',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CampusReqFromType',\n      '10': 'fromType'\n    },\n  ],\n};\n\n/// Descriptor for `OfficialDynamicsReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List officialDynamicsReqDescriptor = $convert.base64Decode(\n    'ChNPZmZpY2lhbER5bmFtaWNzUmVxEhsKCWNhbXB1c19pZBgBIAEoA1IIY2FtcHVzSWQSHwoLY2'\n    'FtcHVzX25hbWUYAiABKAlSCmNhbXB1c05hbWUSFgoGb2Zmc2V0GAMgASgDUgZvZmZzZXQSRwoJ'\n    'ZnJvbV90eXBlGAQgASgOMiouYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQ2FtcHVzUmVxRnJvbV'\n    'R5cGVSCGZyb21UeXBl');\n\n@$core.Deprecated('Use officialItemDescriptor instead')\nconst OfficialItem$json = {\n  '1': 'OfficialItem',\n  '2': [\n    {\n      '1': 'rcmd_archive',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OfficialRcmdArchive',\n      '9': 0,\n      '10': 'rcmdArchive'\n    },\n    {\n      '1': 'rcmd_dynamic',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OfficialRcmdDynamic',\n      '9': 0,\n      '10': 'rcmdDynamic'\n    },\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.RcmdType',\n      '10': 'type'\n    },\n  ],\n  '8': [\n    {'1': 'rcmd_item'},\n  ],\n};\n\n/// Descriptor for `OfficialItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List officialItemDescriptor = $convert.base64Decode(\n    'CgxPZmZpY2lhbEl0ZW0SUQoMcmNtZF9hcmNoaXZlGAIgASgLMiwuYmlsaWJpbGkuYXBwLmR5bm'\n    'FtaWMudjIuT2ZmaWNpYWxSY21kQXJjaGl2ZUgAUgtyY21kQXJjaGl2ZRJRCgxyY21kX2R5bmFt'\n    'aWMYAyABKAsyLC5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5PZmZpY2lhbFJjbWREeW5hbWljSA'\n    'BSC3JjbWREeW5hbWljEjUKBHR5cGUYASABKA4yIS5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5S'\n    'Y21kVHlwZVIEdHlwZUILCglyY21kX2l0ZW0=');\n\n@$core.Deprecated('Use officialRcmdArchiveDescriptor instead')\nconst OfficialRcmdArchive$json = {\n  '1': 'OfficialRcmdArchive',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 2, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'cover_right_text', '3': 3, '4': 1, '5': 9, '10': 'coverRightText'},\n    {\n      '1': 'desc_icon1',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CoverIcon',\n      '10': 'descIcon1'\n    },\n    {'1': 'desc_text1', '3': 5, '4': 1, '5': 9, '10': 'descText1'},\n    {\n      '1': 'desc_icon2',\n      '3': 6,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CoverIcon',\n      '10': 'descIcon2'\n    },\n    {'1': 'desc_text2', '3': 7, '4': 1, '5': 9, '10': 'descText2'},\n    {'1': 'reason', '3': 8, '4': 1, '5': 9, '10': 'reason'},\n    {'1': 'show_three_point', '3': 9, '4': 1, '5': 8, '10': 'showThreePoint'},\n    {'1': 'uri', '3': 10, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'aid', '3': 11, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'mid', '3': 12, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'name', '3': 13, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'dynamic_id', '3': 14, '4': 1, '5': 3, '10': 'dynamicId'},\n    {'1': 'cid', '3': 15, '4': 1, '5': 3, '10': 'cid'},\n  ],\n};\n\n/// Descriptor for `OfficialRcmdArchive`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List officialRcmdArchiveDescriptor = $convert.base64Decode(\n    'ChNPZmZpY2lhbFJjbWRBcmNoaXZlEhQKBXRpdGxlGAEgASgJUgV0aXRsZRIUCgVjb3ZlchgCIA'\n    'EoCVIFY292ZXISKAoQY292ZXJfcmlnaHRfdGV4dBgDIAEoCVIOY292ZXJSaWdodFRleHQSQQoK'\n    'ZGVzY19pY29uMRgEIAEoDjIiLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkNvdmVySWNvblIJZG'\n    'VzY0ljb24xEh0KCmRlc2NfdGV4dDEYBSABKAlSCWRlc2NUZXh0MRJBCgpkZXNjX2ljb24yGAYg'\n    'ASgOMiIuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQ292ZXJJY29uUglkZXNjSWNvbjISHQoKZG'\n    'VzY190ZXh0MhgHIAEoCVIJZGVzY1RleHQyEhYKBnJlYXNvbhgIIAEoCVIGcmVhc29uEigKEHNo'\n    'b3dfdGhyZWVfcG9pbnQYCSABKAhSDnNob3dUaHJlZVBvaW50EhAKA3VyaRgKIAEoCVIDdXJpEh'\n    'AKA2FpZBgLIAEoA1IDYWlkEhAKA21pZBgMIAEoA1IDbWlkEhIKBG5hbWUYDSABKAlSBG5hbWUS'\n    'HQoKZHluYW1pY19pZBgOIAEoA1IJZHluYW1pY0lkEhAKA2NpZBgPIAEoA1IDY2lk');\n\n@$core.Deprecated('Use officialRcmdDynamicDescriptor instead')\nconst OfficialRcmdDynamic$json = {\n  '1': 'OfficialRcmdDynamic',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 2, '4': 1, '5': 9, '10': 'cover'},\n    {\n      '1': 'cover_right_top_text',\n      '3': 3,\n      '4': 1,\n      '5': 9,\n      '10': 'coverRightTopText'\n    },\n    {\n      '1': 'desc_icon1',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CoverIcon',\n      '10': 'descIcon1'\n    },\n    {'1': 'desc_text1', '3': 5, '4': 1, '5': 9, '10': 'descText1'},\n    {\n      '1': 'desc_icon2',\n      '3': 6,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CoverIcon',\n      '10': 'descIcon2'\n    },\n    {'1': 'desc_text2', '3': 7, '4': 1, '5': 9, '10': 'descText2'},\n    {'1': 'reason', '3': 8, '4': 1, '5': 9, '10': 'reason'},\n    {'1': 'uri', '3': 9, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'dynamic_id', '3': 10, '4': 1, '5': 3, '10': 'dynamicId'},\n    {'1': 'mid', '3': 11, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'user_name', '3': 12, '4': 1, '5': 9, '10': 'userName'},\n    {'1': 'rid', '3': 13, '4': 1, '5': 3, '10': 'rid'},\n  ],\n};\n\n/// Descriptor for `OfficialRcmdDynamic`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List officialRcmdDynamicDescriptor = $convert.base64Decode(\n    'ChNPZmZpY2lhbFJjbWREeW5hbWljEhQKBXRpdGxlGAEgASgJUgV0aXRsZRIUCgVjb3ZlchgCIA'\n    'EoCVIFY292ZXISLwoUY292ZXJfcmlnaHRfdG9wX3RleHQYAyABKAlSEWNvdmVyUmlnaHRUb3BU'\n    'ZXh0EkEKCmRlc2NfaWNvbjEYBCABKA4yIi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5Db3Zlck'\n    'ljb25SCWRlc2NJY29uMRIdCgpkZXNjX3RleHQxGAUgASgJUglkZXNjVGV4dDESQQoKZGVzY19p'\n    'Y29uMhgGIAEoDjIiLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkNvdmVySWNvblIJZGVzY0ljb2'\n    '4yEh0KCmRlc2NfdGV4dDIYByABKAlSCWRlc2NUZXh0MhIWCgZyZWFzb24YCCABKAlSBnJlYXNv'\n    'bhIQCgN1cmkYCSABKAlSA3VyaRIdCgpkeW5hbWljX2lkGAogASgDUglkeW5hbWljSWQSEAoDbW'\n    'lkGAsgASgDUgNtaWQSGwoJdXNlcl9uYW1lGAwgASgJUgh1c2VyTmFtZRIQCgNyaWQYDSABKANS'\n    'A3JpZA==');\n\n@$core.Deprecated('Use officialVerifyDescriptor instead')\nconst OfficialVerify$json = {\n  '1': 'OfficialVerify',\n  '2': [\n    {'1': 'type', '3': 1, '4': 1, '5': 5, '10': 'type'},\n    {'1': 'desc', '3': 2, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'is_atten', '3': 3, '4': 1, '5': 5, '10': 'isAtten'},\n  ],\n};\n\n/// Descriptor for `OfficialVerify`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List officialVerifyDescriptor = $convert.base64Decode(\n    'Cg5PZmZpY2lhbFZlcmlmeRISCgR0eXBlGAEgASgFUgR0eXBlEhIKBGRlc2MYAiABKAlSBGRlc2'\n    'MSGQoIaXNfYXR0ZW4YAyABKAVSB2lzQXR0ZW4=');\n\n@$core.Deprecated('Use oneLineTextDescriptor instead')\nconst OneLineText$json = {\n  '1': 'OneLineText',\n  '2': [\n    {\n      '1': 'texts',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.TextWithPriority',\n      '10': 'texts'\n    },\n  ],\n};\n\n/// Descriptor for `OneLineText`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List oneLineTextDescriptor = $convert.base64Decode(\n    'CgtPbmVMaW5lVGV4dBI/CgV0ZXh0cxgBIAMoCzIpLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLl'\n    'RleHRXaXRoUHJpb3JpdHlSBXRleHRz');\n\n@$core.Deprecated('Use onlyFansDescriptor instead')\nconst OnlyFans$json = {\n  '1': 'OnlyFans',\n  '2': [\n    {'1': 'is_only_fans', '3': 1, '4': 1, '5': 8, '10': 'isOnlyFans'},\n    {\n      '1': 'badge',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.IconBadge',\n      '10': 'badge'\n    },\n  ],\n};\n\n/// Descriptor for `OnlyFans`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List onlyFansDescriptor = $convert.base64Decode(\n    'CghPbmx5RmFucxIgCgxpc19vbmx5X2ZhbnMYASABKAhSCmlzT25seUZhbnMSOAoFYmFkZ2UYAi'\n    'ABKAsyIi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5JY29uQmFkZ2VSBWJhZGdl');\n\n@$core.Deprecated('Use onlyFansPropertyDescriptor instead')\nconst OnlyFansProperty$json = {\n  '1': 'OnlyFansProperty',\n  '2': [\n    {'1': 'has_privilege', '3': 1, '4': 1, '5': 8, '10': 'hasPrivilege'},\n    {'1': 'is_only_fans', '3': 2, '4': 1, '5': 8, '10': 'isOnlyFans'},\n    {'1': 'allow_download', '3': 3, '4': 1, '5': 8, '10': 'allowDownload'},\n    {\n      '1': 'embed_cashier_link',\n      '3': 4,\n      '4': 1,\n      '5': 9,\n      '10': 'embedCashierLink'\n    },\n  ],\n};\n\n/// Descriptor for `OnlyFansProperty`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List onlyFansPropertyDescriptor = $convert.base64Decode(\n    'ChBPbmx5RmFuc1Byb3BlcnR5EiMKDWhhc19wcml2aWxlZ2UYASABKAhSDGhhc1ByaXZpbGVnZR'\n    'IgCgxpc19vbmx5X2ZhbnMYAiABKAhSCmlzT25seUZhbnMSJQoOYWxsb3dfZG93bmxvYWQYAyAB'\n    'KAhSDWFsbG93RG93bmxvYWQSLAoSZW1iZWRfY2FzaGllcl9saW5rGAQgASgJUhBlbWJlZENhc2'\n    'hpZXJMaW5r');\n\n@$core.Deprecated('Use onlyFansVotePropertyDescriptor instead')\nconst OnlyFansVoteProperty$json = {\n  '1': 'OnlyFansVoteProperty',\n  '2': [\n    {'1': 'is_only_fans_vote', '3': 1, '4': 1, '5': 8, '10': 'isOnlyFansVote'},\n    {\n      '1': 'has_vote_permission',\n      '3': 2,\n      '4': 1,\n      '5': 8,\n      '10': 'hasVotePermission'\n    },\n    {'1': 'vote_btn_text', '3': 3, '4': 1, '5': 9, '10': 'voteBtnText'},\n    {'1': 'vote_btn_uri', '3': 4, '4': 1, '5': 9, '10': 'voteBtnUri'},\n    {\n      '1': 'vote_annotation_part1',\n      '3': 5,\n      '4': 1,\n      '5': 9,\n      '10': 'voteAnnotationPart1'\n    },\n    {\n      '1': 'vote_annotation_part2',\n      '3': 6,\n      '4': 1,\n      '5': 9,\n      '10': 'voteAnnotationPart2'\n    },\n  ],\n};\n\n/// Descriptor for `OnlyFansVoteProperty`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List onlyFansVotePropertyDescriptor = $convert.base64Decode(\n    'ChRPbmx5RmFuc1ZvdGVQcm9wZXJ0eRIpChFpc19vbmx5X2ZhbnNfdm90ZRgBIAEoCFIOaXNPbm'\n    'x5RmFuc1ZvdGUSLgoTaGFzX3ZvdGVfcGVybWlzc2lvbhgCIAEoCFIRaGFzVm90ZVBlcm1pc3Np'\n    'b24SIgoNdm90ZV9idG5fdGV4dBgDIAEoCVILdm90ZUJ0blRleHQSIAoMdm90ZV9idG5fdXJpGA'\n    'QgASgJUgp2b3RlQnRuVXJpEjIKFXZvdGVfYW5ub3RhdGlvbl9wYXJ0MRgFIAEoCVITdm90ZUFu'\n    'bm90YXRpb25QYXJ0MRIyChV2b3RlX2Fubm90YXRpb25fcGFydDIYBiABKAlSE3ZvdGVBbm5vdG'\n    'F0aW9uUGFydDI=');\n\n@$core.Deprecated('Use opusCollectionDescriptor instead')\nconst OpusCollection$json = {\n  '1': 'OpusCollection',\n  '2': [\n    {'1': 'collection_id', '3': 1, '4': 1, '5': 3, '10': 'collectionId'},\n    {\n      '1': 'title',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OneLineText',\n      '10': 'title'\n    },\n    {'1': 'detail_uri', '3': 3, '4': 1, '5': 9, '10': 'detailUri'},\n    {'1': 'intro', '3': 4, '4': 1, '5': 9, '10': 'intro'},\n    {\n      '1': 'all_items',\n      '3': 5,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OpusCollectionItem',\n      '10': 'allItems'\n    },\n  ],\n};\n\n/// Descriptor for `OpusCollection`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List opusCollectionDescriptor = $convert.base64Decode(\n    'Cg5PcHVzQ29sbGVjdGlvbhIjCg1jb2xsZWN0aW9uX2lkGAEgASgDUgxjb2xsZWN0aW9uSWQSOg'\n    'oFdGl0bGUYAiABKAsyJC5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5PbmVMaW5lVGV4dFIFdGl0'\n    'bGUSHQoKZGV0YWlsX3VyaRgDIAEoCVIJZGV0YWlsVXJpEhQKBWludHJvGAQgASgJUgVpbnRybx'\n    'JICglhbGxfaXRlbXMYBSADKAsyKy5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5PcHVzQ29sbGVj'\n    'dGlvbkl0ZW1SCGFsbEl0ZW1z');\n\n@$core.Deprecated('Use opusCollectionDetailReqDescriptor instead')\nconst OpusCollectionDetailReq$json = {\n  '1': 'OpusCollectionDetailReq',\n  '2': [\n    {'1': 'collection_type', '3': 1, '4': 1, '5': 9, '10': 'collectionType'},\n    {'1': 'collection_id', '3': 2, '4': 1, '5': 9, '10': 'collectionId'},\n    {'1': 'selected_opus_id', '3': 3, '4': 1, '5': 9, '10': 'selectedOpusId'},\n    {'1': 'selected_oid_type', '3': 4, '4': 1, '5': 9, '10': 'selectedOidType'},\n    {'1': 'selected_oid', '3': 5, '4': 1, '5': 9, '10': 'selectedOid'},\n    {'1': 'local_time', '3': 6, '4': 1, '5': 5, '10': 'localTime'},\n  ],\n};\n\n/// Descriptor for `OpusCollectionDetailReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List opusCollectionDetailReqDescriptor = $convert.base64Decode(\n    'ChdPcHVzQ29sbGVjdGlvbkRldGFpbFJlcRInCg9jb2xsZWN0aW9uX3R5cGUYASABKAlSDmNvbG'\n    'xlY3Rpb25UeXBlEiMKDWNvbGxlY3Rpb25faWQYAiABKAlSDGNvbGxlY3Rpb25JZBIoChBzZWxl'\n    'Y3RlZF9vcHVzX2lkGAMgASgJUg5zZWxlY3RlZE9wdXNJZBIqChFzZWxlY3RlZF9vaWRfdHlwZR'\n    'gEIAEoCVIPc2VsZWN0ZWRPaWRUeXBlEiEKDHNlbGVjdGVkX29pZBgFIAEoCVILc2VsZWN0ZWRP'\n    'aWQSHQoKbG9jYWxfdGltZRgGIAEoBVIJbG9jYWxUaW1l');\n\n@$core.Deprecated('Use opusCollectionDetailRespDescriptor instead')\nconst OpusCollectionDetailResp$json = {\n  '1': 'OpusCollectionDetailResp',\n  '2': [\n    {'1': 'collection_type', '3': 1, '4': 1, '5': 9, '10': 'collectionType'},\n    {'1': 'collection_id', '3': 2, '4': 1, '5': 9, '10': 'collectionId'},\n    {'1': 'collection_cover', '3': 3, '4': 1, '5': 9, '10': 'collectionCover'},\n    {'1': 'collection_title', '3': 4, '4': 1, '5': 9, '10': 'collectionTitle'},\n    {'1': 'sub_title_part1', '3': 5, '4': 1, '5': 9, '10': 'subTitlePart1'},\n    {'1': 'sub_title_part2', '3': 6, '4': 1, '5': 9, '10': 'subTitlePart2'},\n    {'1': 'collection_intro', '3': 7, '4': 1, '5': 9, '10': 'collectionIntro'},\n    {\n      '1': 'item_list',\n      '3': 8,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OpusCollectionItem',\n      '10': 'itemList'\n    },\n    {'1': 'total_cnt', '3': 9, '4': 1, '5': 3, '10': 'totalCnt'},\n    {\n      '1': 'author_info',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.BasicUserInfoV2',\n      '10': 'authorInfo'\n    },\n    {\n      '1': 'bottom_button',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ButtonWithSubTitle',\n      '10': 'bottomButton'\n    },\n    {\n      '1': 'subscribe_btn',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.SubscribeButton',\n      '10': 'subscribeBtn'\n    },\n  ],\n};\n\n/// Descriptor for `OpusCollectionDetailResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List opusCollectionDetailRespDescriptor = $convert.base64Decode(\n    'ChhPcHVzQ29sbGVjdGlvbkRldGFpbFJlc3ASJwoPY29sbGVjdGlvbl90eXBlGAEgASgJUg5jb2'\n    'xsZWN0aW9uVHlwZRIjCg1jb2xsZWN0aW9uX2lkGAIgASgJUgxjb2xsZWN0aW9uSWQSKQoQY29s'\n    'bGVjdGlvbl9jb3ZlchgDIAEoCVIPY29sbGVjdGlvbkNvdmVyEikKEGNvbGxlY3Rpb25fdGl0bG'\n    'UYBCABKAlSD2NvbGxlY3Rpb25UaXRsZRImCg9zdWJfdGl0bGVfcGFydDEYBSABKAlSDXN1YlRp'\n    'dGxlUGFydDESJgoPc3ViX3RpdGxlX3BhcnQyGAYgASgJUg1zdWJUaXRsZVBhcnQyEikKEGNvbG'\n    'xlY3Rpb25faW50cm8YByABKAlSD2NvbGxlY3Rpb25JbnRybxJICglpdGVtX2xpc3QYCCADKAsy'\n    'Ky5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5PcHVzQ29sbGVjdGlvbkl0ZW1SCGl0ZW1MaXN0Eh'\n    'sKCXRvdGFsX2NudBgJIAEoA1IIdG90YWxDbnQSSQoLYXV0aG9yX2luZm8YCiABKAsyKC5iaWxp'\n    'YmlsaS5hcHAuZHluYW1pYy52Mi5CYXNpY1VzZXJJbmZvVjJSCmF1dGhvckluZm8SUAoNYm90dG'\n    '9tX2J1dHRvbhgLIAEoCzIrLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkJ1dHRvbldpdGhTdWJU'\n    'aXRsZVIMYm90dG9tQnV0dG9uEk0KDXN1YnNjcmliZV9idG4YDCABKAsyKC5iaWxpYmlsaS5hcH'\n    'AuZHluYW1pYy52Mi5TdWJzY3JpYmVCdXR0b25SDHN1YnNjcmliZUJ0bg==');\n\n@$core.Deprecated('Use opusCollectionItemDescriptor instead')\nconst OpusCollectionItem$json = {\n  '1': 'OpusCollectionItem',\n  '2': [\n    {'1': 'opus_id', '3': 1, '4': 1, '5': 3, '10': 'opusId'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'pub_time', '3': 3, '4': 1, '5': 9, '10': 'pubTime'},\n    {'1': 'uri', '3': 4, '4': 1, '5': 9, '10': 'uri'},\n    {\n      '1': 'is_selected_highlight',\n      '3': 5,\n      '4': 1,\n      '5': 8,\n      '10': 'isSelectedHighlight'\n    },\n    {'1': 'prefix_icon', '3': 6, '4': 1, '5': 9, '10': 'prefixIcon'},\n    {\n      '1': 'collection_item_type',\n      '3': 7,\n      '4': 1,\n      '5': 9,\n      '10': 'collectionItemType'\n    },\n    {\n      '1': 'collection_item_oid',\n      '3': 8,\n      '4': 1,\n      '5': 9,\n      '10': 'collectionItemOid'\n    },\n  ],\n};\n\n/// Descriptor for `OpusCollectionItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List opusCollectionItemDescriptor = $convert.base64Decode(\n    'ChJPcHVzQ29sbGVjdGlvbkl0ZW0SFwoHb3B1c19pZBgBIAEoA1IGb3B1c0lkEhQKBXRpdGxlGA'\n    'IgASgJUgV0aXRsZRIZCghwdWJfdGltZRgDIAEoCVIHcHViVGltZRIQCgN1cmkYBCABKAlSA3Vy'\n    'aRIyChVpc19zZWxlY3RlZF9oaWdobGlnaHQYBSABKAhSE2lzU2VsZWN0ZWRIaWdobGlnaHQSHw'\n    'oLcHJlZml4X2ljb24YBiABKAlSCnByZWZpeEljb24SMAoUY29sbGVjdGlvbl9pdGVtX3R5cGUY'\n    'ByABKAlSEmNvbGxlY3Rpb25JdGVtVHlwZRIuChNjb2xsZWN0aW9uX2l0ZW1fb2lkGAggASgJUh'\n    'Fjb2xsZWN0aW9uSXRlbU9pZA==');\n\n@$core.Deprecated('Use opusCollectionWithCoverDescriptor instead')\nconst OpusCollectionWithCover$json = {\n  '1': 'OpusCollectionWithCover',\n  '2': [\n    {\n      '1': 'collection_info',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OpusCollection',\n      '10': 'collectionInfo'\n    },\n    {'1': 'cover_pic', '3': 2, '4': 1, '5': 9, '10': 'coverPic'},\n    {\n      '1': 'cover_bottom_text',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CoverIconWithText',\n      '10': 'coverBottomText'\n    },\n    {'1': 'sub_title_text', '3': 4, '4': 1, '5': 9, '10': 'subTitleText'},\n  ],\n};\n\n/// Descriptor for `OpusCollectionWithCover`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List opusCollectionWithCoverDescriptor = $convert.base64Decode(\n    'ChdPcHVzQ29sbGVjdGlvbldpdGhDb3ZlchJQCg9jb2xsZWN0aW9uX2luZm8YASABKAsyJy5iaW'\n    'xpYmlsaS5hcHAuZHluYW1pYy52Mi5PcHVzQ29sbGVjdGlvblIOY29sbGVjdGlvbkluZm8SGwoJ'\n    'Y292ZXJfcGljGAIgASgJUghjb3ZlclBpYxJWChFjb3Zlcl9ib3R0b21fdGV4dBgDIAEoCzIqLm'\n    'JpbGliaWxpLmFwcC5keW5hbWljLnYyLkNvdmVySWNvbldpdGhUZXh0Ug9jb3ZlckJvdHRvbVRl'\n    'eHQSJAoOc3ViX3RpdGxlX3RleHQYBCABKAlSDHN1YlRpdGxlVGV4dA==');\n\n@$core.Deprecated('Use opusCreationItemDescriptor instead')\nconst OpusCreationItem$json = {\n  '1': 'OpusCreationItem',\n  '2': [\n    {\n      '1': 'opus_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.OpusType',\n      '10': 'opusType'\n    },\n    {\n      '1': 'cover_pic',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynDrawItem',\n      '10': 'coverPic'\n    },\n    {\n      '1': 'cover_top_right_badge',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.VideoBadge',\n      '10': 'coverTopRightBadge'\n    },\n    {\n      '1': 'text_paragraph',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Paragraph',\n      '10': 'textParagraph'\n    },\n    {\n      '1': 'hint_text',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ColoredText',\n      '10': 'hintText'\n    },\n    {'1': 'bottom_text', '3': 6, '4': 1, '5': 9, '10': 'bottomText'},\n    {\n      '1': 'stats',\n      '3': 7,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CoverIconWithText',\n      '10': 'stats'\n    },\n    {\n      '1': 'tp_list',\n      '3': 8,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CreationItemAction',\n      '10': 'tpList'\n    },\n    {\n      '1': 'extend',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Extend',\n      '10': 'extend'\n    },\n    {\n      '1': 'visibility_status',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CoverIconWithText',\n      '10': 'visibilityStatus'\n    },\n  ],\n};\n\n/// Descriptor for `OpusCreationItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List opusCreationItemDescriptor = $convert.base64Decode(\n    'ChBPcHVzQ3JlYXRpb25JdGVtEj4KCW9wdXNfdHlwZRgBIAEoDjIhLmJpbGliaWxpLmFwcC5keW'\n    '5hbWljLnYyLk9wdXNUeXBlUghvcHVzVHlwZRJECgljb3Zlcl9waWMYAiABKAsyJy5iaWxpYmls'\n    'aS5hcHAuZHluYW1pYy52Mi5NZGxEeW5EcmF3SXRlbVIIY292ZXJQaWMSVgoVY292ZXJfdG9wX3'\n    'JpZ2h0X2JhZGdlGAMgASgLMiMuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuVmlkZW9CYWRnZVIS'\n    'Y292ZXJUb3BSaWdodEJhZGdlEkkKDnRleHRfcGFyYWdyYXBoGAQgASgLMiIuYmlsaWJpbGkuYX'\n    'BwLmR5bmFtaWMudjIuUGFyYWdyYXBoUg10ZXh0UGFyYWdyYXBoEkEKCWhpbnRfdGV4dBgFIAEo'\n    'CzIkLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkNvbG9yZWRUZXh0UghoaW50VGV4dBIfCgtib3'\n    'R0b21fdGV4dBgGIAEoCVIKYm90dG9tVGV4dBJACgVzdGF0cxgHIAMoCzIqLmJpbGliaWxpLmFw'\n    'cC5keW5hbWljLnYyLkNvdmVySWNvbldpdGhUZXh0UgVzdGF0cxJECgd0cF9saXN0GAggAygLMi'\n    'suYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQ3JlYXRpb25JdGVtQWN0aW9uUgZ0cExpc3QSNwoG'\n    'ZXh0ZW5kGAkgASgLMh8uYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuRXh0ZW5kUgZleHRlbmQSVw'\n    'oRdmlzaWJpbGl0eV9zdGF0dXMYCiABKAsyKi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5Db3Zl'\n    'ckljb25XaXRoVGV4dFIQdmlzaWJpbGl0eVN0YXR1cw==');\n\n@$core.Deprecated('Use opusDetailReqDescriptor instead')\nconst OpusDetailReq$json = {\n  '1': 'OpusDetailReq',\n  '2': [\n    {\n      '1': 'opus_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.OpusType',\n      '10': 'opusType'\n    },\n    {'1': 'oid', '3': 2, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'dyn_type', '3': 3, '4': 1, '5': 3, '10': 'dynType'},\n    {'1': 'share_id', '3': 4, '4': 1, '5': 9, '10': 'shareId'},\n    {'1': 'share_mode', '3': 9, '4': 1, '5': 5, '10': 'shareMode'},\n    {'1': 'local_time', '3': 10, '4': 1, '5': 5, '10': 'localTime'},\n    {\n      '1': 'player_args',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n    {\n      '1': 'config',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Config',\n      '10': 'config'\n    },\n    {\n      '1': 'ad_param',\n      '3': 13,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdParam',\n      '10': 'adParam'\n    },\n    {'1': 'from', '3': 14, '4': 1, '5': 9, '10': 'from'},\n    {'1': 'pattern', '3': 15, '4': 1, '5': 9, '10': 'pattern'},\n  ],\n};\n\n/// Descriptor for `OpusDetailReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List opusDetailReqDescriptor = $convert.base64Decode(\n    'Cg1PcHVzRGV0YWlsUmVxEj4KCW9wdXNfdHlwZRgBIAEoDjIhLmJpbGliaWxpLmFwcC5keW5hbW'\n    'ljLnYyLk9wdXNUeXBlUghvcHVzVHlwZRIQCgNvaWQYAiABKANSA29pZBIZCghkeW5fdHlwZRgD'\n    'IAEoA1IHZHluVHlwZRIZCghzaGFyZV9pZBgEIAEoCVIHc2hhcmVJZBIdCgpzaGFyZV9tb2RlGA'\n    'kgASgFUglzaGFyZU1vZGUSHQoKbG9jYWxfdGltZRgKIAEoBVIJbG9jYWxUaW1lEk8KC3BsYXll'\n    'cl9hcmdzGAsgASgLMi4uYmlsaWJpbGkuYXBwLmFyY2hpdmUubWlkZGxld2FyZS52MS5QbGF5ZX'\n    'JBcmdzUgpwbGF5ZXJBcmdzEjcKBmNvbmZpZxgMIAEoCzIfLmJpbGliaWxpLmFwcC5keW5hbWlj'\n    'LnYyLkNvbmZpZ1IGY29uZmlnEjsKCGFkX3BhcmFtGA0gASgLMiAuYmlsaWJpbGkuYXBwLmR5bm'\n    'FtaWMudjIuQWRQYXJhbVIHYWRQYXJhbRISCgRmcm9tGA4gASgJUgRmcm9tEhgKB3BhdHRlcm4Y'\n    'DyABKAlSB3BhdHRlcm4=');\n\n@$core.Deprecated('Use opusDetailRespDescriptor instead')\nconst OpusDetailResp$json = {\n  '1': 'OpusDetailResp',\n  '2': [\n    {\n      '1': 'opus_item',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OpusItem',\n      '10': 'opusItem'\n    },\n  ],\n};\n\n/// Descriptor for `OpusDetailResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List opusDetailRespDescriptor = $convert.base64Decode(\n    'Cg5PcHVzRGV0YWlsUmVzcBI+CglvcHVzX2l0ZW0YASABKAsyIS5iaWxpYmlsaS5hcHAuZHluYW'\n    '1pYy52Mi5PcHVzSXRlbVIIb3B1c0l0ZW0=');\n\n@$core.Deprecated('Use opusFavItemDescriptor instead')\nconst OpusFavItem$json = {\n  '1': 'OpusFavItem',\n  '2': [\n    {'1': 'opus_id', '3': 1, '4': 1, '5': 3, '10': 'opusId'},\n    {'1': 'card_uri', '3': 2, '4': 1, '5': 9, '10': 'cardUri'},\n    {\n      '1': 'cover_pic',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynDrawItem',\n      '10': 'coverPic'\n    },\n    {\n      '1': 'text_paragraph',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Paragraph',\n      '10': 'textParagraph'\n    },\n    {\n      '1': 'bottom_text',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CoverIconWithText',\n      '10': 'bottomText'\n    },\n    {'1': 'click_toast', '3': 6, '4': 1, '5': 9, '10': 'clickToast'},\n  ],\n};\n\n/// Descriptor for `OpusFavItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List opusFavItemDescriptor = $convert.base64Decode(\n    'CgtPcHVzRmF2SXRlbRIXCgdvcHVzX2lkGAEgASgDUgZvcHVzSWQSGQoIY2FyZF91cmkYAiABKA'\n    'lSB2NhcmRVcmkSRAoJY292ZXJfcGljGAMgASgLMicuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIu'\n    'TWRsRHluRHJhd0l0ZW1SCGNvdmVyUGljEkkKDnRleHRfcGFyYWdyYXBoGAQgASgLMiIuYmlsaW'\n    'JpbGkuYXBwLmR5bmFtaWMudjIuUGFyYWdyYXBoUg10ZXh0UGFyYWdyYXBoEksKC2JvdHRvbV90'\n    'ZXh0GAUgASgLMiouYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQ292ZXJJY29uV2l0aFRleHRSCm'\n    'JvdHRvbVRleHQSHwoLY2xpY2tfdG9hc3QYBiABKAlSCmNsaWNrVG9hc3Q=');\n\n@$core.Deprecated('Use opusFlowItemDescriptor instead')\nconst OpusFlowItem$json = {\n  '1': 'OpusFlowItem',\n  '2': [\n    {\n      '1': 'flow_item_opus',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.FlowItemOpus',\n      '9': 0,\n      '10': 'flowItemOpus'\n    },\n    {\n      '1': 'item_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.FlowItemType',\n      '10': 'itemType'\n    },\n    {'1': 'oid', '3': 2, '4': 1, '5': 3, '10': 'oid'},\n    {\n      '1': 'extend',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Extend',\n      '10': 'extend'\n    },\n  ],\n  '8': [\n    {'1': 'data'},\n  ],\n};\n\n/// Descriptor for `OpusFlowItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List opusFlowItemDescriptor = $convert.base64Decode(\n    'CgxPcHVzRmxvd0l0ZW0STQoOZmxvd19pdGVtX29wdXMYBCABKAsyJS5iaWxpYmlsaS5hcHAuZH'\n    'luYW1pYy52Mi5GbG93SXRlbU9wdXNIAFIMZmxvd0l0ZW1PcHVzEkIKCWl0ZW1fdHlwZRgBIAEo'\n    'DjIlLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkZsb3dJdGVtVHlwZVIIaXRlbVR5cGUSEAoDb2'\n    'lkGAIgASgDUgNvaWQSNwoGZXh0ZW5kGAMgASgLMh8uYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIu'\n    'RXh0ZW5kUgZleHRlbmRCBgoEZGF0YQ==');\n\n@$core.Deprecated('Use opusItemDescriptor instead')\nconst OpusItem$json = {\n  '1': 'OpusItem',\n  '2': [\n    {'1': 'opus_id', '3': 1, '4': 1, '5': 3, '10': 'opusId'},\n    {\n      '1': 'opus_type',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.OpusType',\n      '10': 'opusType'\n    },\n    {'1': 'oid', '3': 3, '4': 1, '5': 3, '10': 'oid'},\n    {\n      '1': 'modules',\n      '3': 4,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Module',\n      '10': 'modules'\n    },\n    {\n      '1': 'extend',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Extend',\n      '10': 'extend'\n    },\n  ],\n};\n\n/// Descriptor for `OpusItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List opusItemDescriptor = $convert.base64Decode(\n    'CghPcHVzSXRlbRIXCgdvcHVzX2lkGAEgASgDUgZvcHVzSWQSPgoJb3B1c190eXBlGAIgASgOMi'\n    'EuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuT3B1c1R5cGVSCG9wdXNUeXBlEhAKA29pZBgDIAEo'\n    'A1IDb2lkEjkKB21vZHVsZXMYBCADKAsyHy5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5Nb2R1bG'\n    'VSB21vZHVsZXMSNwoGZXh0ZW5kGAUgASgLMh8uYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuRXh0'\n    'ZW5kUgZleHRlbmQ=');\n\n@$core.Deprecated('Use opusSpaceFlowReqDescriptor instead')\nconst OpusSpaceFlowReq$json = {\n  '1': 'OpusSpaceFlowReq',\n  '2': [\n    {'1': 'host_mid', '3': 1, '4': 1, '5': 3, '10': 'hostMid'},\n    {'1': 'local_time', '3': 2, '4': 1, '5': 5, '10': 'localTime'},\n    {\n      '1': 'pagination',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.pagination.Pagination',\n      '10': 'pagination'\n    },\n    {'1': 'filter_type', '3': 4, '4': 1, '5': 9, '10': 'filterType'},\n  ],\n};\n\n/// Descriptor for `OpusSpaceFlowReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List opusSpaceFlowReqDescriptor = $convert.base64Decode(\n    'ChBPcHVzU3BhY2VGbG93UmVxEhkKCGhvc3RfbWlkGAEgASgDUgdob3N0TWlkEh0KCmxvY2FsX3'\n    'RpbWUYAiABKAVSCWxvY2FsVGltZRI/CgpwYWdpbmF0aW9uGAMgASgLMh8uYmlsaWJpbGkucGFn'\n    'aW5hdGlvbi5QYWdpbmF0aW9uUgpwYWdpbmF0aW9uEh8KC2ZpbHRlcl90eXBlGAQgASgJUgpmaW'\n    'x0ZXJUeXBl');\n\n@$core.Deprecated('Use opusSpaceFlowRespDescriptor instead')\nconst OpusSpaceFlowResp$json = {\n  '1': 'OpusSpaceFlowResp',\n  '2': [\n    {\n      '1': 'item_list',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OpusFlowItem',\n      '10': 'itemList'\n    },\n    {\n      '1': 'next_page',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.pagination.PaginationReply',\n      '10': 'nextPage'\n    },\n    {\n      '1': 'host_up_opus_collection',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.SectionOpusCollection',\n      '10': 'hostUpOpusCollection'\n    },\n    {\n      '1': 'host_up_note_nav_bar',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.SectionNoteNavigationBar',\n      '10': 'hostUpNoteNavBar'\n    },\n  ],\n};\n\n/// Descriptor for `OpusSpaceFlowResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List opusSpaceFlowRespDescriptor = $convert.base64Decode(\n    'ChFPcHVzU3BhY2VGbG93UmVzcBJCCglpdGVtX2xpc3QYASADKAsyJS5iaWxpYmlsaS5hcHAuZH'\n    'luYW1pYy52Mi5PcHVzRmxvd0l0ZW1SCGl0ZW1MaXN0EkEKCW5leHRfcGFnZRgCIAEoCzIkLmJp'\n    'bGliaWxpLnBhZ2luYXRpb24uUGFnaW5hdGlvblJlcGx5UghuZXh0UGFnZRJlChdob3N0X3VwX2'\n    '9wdXNfY29sbGVjdGlvbhgDIAEoCzIuLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlNlY3Rpb25P'\n    'cHVzQ29sbGVjdGlvblIUaG9zdFVwT3B1c0NvbGxlY3Rpb24SYQoUaG9zdF91cF9ub3RlX25hdl'\n    '9iYXIYBCABKAsyMS5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5TZWN0aW9uTm90ZU5hdmlnYXRp'\n    'b25CYXJSEGhvc3RVcE5vdGVOYXZCYXI=');\n\n@$core.Deprecated('Use pGCSeasonDescriptor instead')\nconst PGCSeason$json = {\n  '1': 'PGCSeason',\n  '2': [\n    {'1': 'is_finish', '3': 1, '4': 1, '5': 5, '10': 'isFinish'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'type', '3': 3, '4': 1, '5': 5, '10': 'type'},\n  ],\n};\n\n/// Descriptor for `PGCSeason`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pGCSeasonDescriptor = $convert.base64Decode(\n    'CglQR0NTZWFzb24SGwoJaXNfZmluaXNoGAEgASgFUghpc0ZpbmlzaBIUCgV0aXRsZRgCIAEoCV'\n    'IFdGl0bGUSEgoEdHlwZRgDIAEoBVIEdHlwZQ==');\n\n@$core.Deprecated('Use paraSpacingDescriptor instead')\nconst ParaSpacing$json = {\n  '1': 'ParaSpacing',\n  '2': [\n    {\n      '1': 'spacing_before_para',\n      '3': 1,\n      '4': 1,\n      '5': 1,\n      '10': 'spacingBeforePara'\n    },\n    {\n      '1': 'spacing_after_para',\n      '3': 2,\n      '4': 1,\n      '5': 1,\n      '10': 'spacingAfterPara'\n    },\n    {'1': 'line_spacing', '3': 3, '4': 1, '5': 1, '10': 'lineSpacing'},\n  ],\n};\n\n/// Descriptor for `ParaSpacing`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List paraSpacingDescriptor = $convert.base64Decode(\n    'CgtQYXJhU3BhY2luZxIuChNzcGFjaW5nX2JlZm9yZV9wYXJhGAEgASgBUhFzcGFjaW5nQmVmb3'\n    'JlUGFyYRIsChJzcGFjaW5nX2FmdGVyX3BhcmEYAiABKAFSEHNwYWNpbmdBZnRlclBhcmESIQoM'\n    'bGluZV9zcGFjaW5nGAMgASgBUgtsaW5lU3BhY2luZw==');\n\n@$core.Deprecated('Use paragraphDescriptor instead')\nconst Paragraph$json = {\n  '1': 'Paragraph',\n  '2': [\n    {\n      '1': 'text',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.TextParagraph',\n      '9': 0,\n      '10': 'text'\n    },\n    {\n      '1': 'pic',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.PicParagraph',\n      '9': 0,\n      '10': 'pic'\n    },\n    {\n      '1': 'line',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.LineParagraph',\n      '9': 0,\n      '10': 'line'\n    },\n    {\n      '1': 'link_card',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CardParagraph',\n      '9': 0,\n      '10': 'linkCard'\n    },\n    {\n      '1': 'code',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CodeParagraph',\n      '9': 0,\n      '10': 'code'\n    },\n    {\n      '1': 'para_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.Paragraph.ParagraphType',\n      '10': 'paraType'\n    },\n    {\n      '1': 'para_format',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Paragraph.ParagraphFormat',\n      '10': 'paraFormat'\n    },\n  ],\n  '3': [Paragraph_ListFormat$json, Paragraph_ParagraphFormat$json],\n  '4': [Paragraph_ParagraphAlign$json, Paragraph_ParagraphType$json],\n  '8': [\n    {'1': 'content'},\n  ],\n};\n\n@$core.Deprecated('Use paragraphDescriptor instead')\nconst Paragraph_ListFormat$json = {\n  '1': 'ListFormat',\n  '2': [\n    {'1': 'level', '3': 1, '4': 1, '5': 5, '10': 'level'},\n    {'1': 'order', '3': 2, '4': 1, '5': 5, '10': 'order'},\n    {'1': 'theme', '3': 3, '4': 1, '5': 9, '10': 'theme'},\n  ],\n};\n\n@$core.Deprecated('Use paragraphDescriptor instead')\nconst Paragraph_ParagraphFormat$json = {\n  '1': 'ParagraphFormat',\n  '2': [\n    {\n      '1': 'align',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.Paragraph.ParagraphAlign',\n      '10': 'align'\n    },\n    {\n      '1': 'list_format',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Paragraph.ListFormat',\n      '10': 'listFormat'\n    },\n  ],\n};\n\n@$core.Deprecated('Use paragraphDescriptor instead')\nconst Paragraph_ParagraphAlign$json = {\n  '1': 'ParagraphAlign',\n  '2': [\n    {'1': 'LEFT', '2': 0},\n    {'1': 'MIDDLE', '2': 1},\n    {'1': 'RIGHT', '2': 2},\n  ],\n};\n\n@$core.Deprecated('Use paragraphDescriptor instead')\nconst Paragraph_ParagraphType$json = {\n  '1': 'ParagraphType',\n  '2': [\n    {'1': 'INVALID_ParagraphType', '2': 0},\n    {'1': 'TEXT', '2': 1},\n    {'1': 'PICTURES', '2': 2},\n    {'1': 'LINE', '2': 3},\n    {'1': 'REFERENCE', '2': 4},\n    {'1': 'SORTED_LIST', '2': 5},\n    {'1': 'UNSORTED_LIST', '2': 6},\n    {'1': 'LINK_CARD', '2': 7},\n    {'1': 'CODE', '2': 8},\n  ],\n};\n\n/// Descriptor for `Paragraph`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List paragraphDescriptor = $convert.base64Decode(\n    'CglQYXJhZ3JhcGgSPAoEdGV4dBgDIAEoCzImLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlRleH'\n    'RQYXJhZ3JhcGhIAFIEdGV4dBI5CgNwaWMYBCABKAsyJS5iaWxpYmlsaS5hcHAuZHluYW1pYy52'\n    'Mi5QaWNQYXJhZ3JhcGhIAFIDcGljEjwKBGxpbmUYBSABKAsyJi5iaWxpYmlsaS5hcHAuZHluYW'\n    '1pYy52Mi5MaW5lUGFyYWdyYXBoSABSBGxpbmUSRQoJbGlua19jYXJkGAYgASgLMiYuYmlsaWJp'\n    'bGkuYXBwLmR5bmFtaWMudjIuQ2FyZFBhcmFncmFwaEgAUghsaW5rQ2FyZBI8CgRjb2RlGAcgAS'\n    'gLMiYuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQ29kZVBhcmFncmFwaEgAUgRjb2RlEk0KCXBh'\n    'cmFfdHlwZRgBIAEoDjIwLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlBhcmFncmFwaC5QYXJhZ3'\n    'JhcGhUeXBlUghwYXJhVHlwZRJTCgtwYXJhX2Zvcm1hdBgCIAEoCzIyLmJpbGliaWxpLmFwcC5k'\n    'eW5hbWljLnYyLlBhcmFncmFwaC5QYXJhZ3JhcGhGb3JtYXRSCnBhcmFGb3JtYXQaTgoKTGlzdE'\n    'Zvcm1hdBIUCgVsZXZlbBgBIAEoBVIFbGV2ZWwSFAoFb3JkZXIYAiABKAVSBW9yZGVyEhQKBXRo'\n    'ZW1lGAMgASgJUgV0aGVtZRqqAQoPUGFyYWdyYXBoRm9ybWF0EkcKBWFsaWduGAEgASgOMjEuYm'\n    'lsaWJpbGkuYXBwLmR5bmFtaWMudjIuUGFyYWdyYXBoLlBhcmFncmFwaEFsaWduUgVhbGlnbhJO'\n    'CgtsaXN0X2Zvcm1hdBgCIAEoCzItLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlBhcmFncmFwaC'\n    '5MaXN0Rm9ybWF0UgpsaXN0Rm9ybWF0IjEKDlBhcmFncmFwaEFsaWduEggKBExFRlQQABIKCgZN'\n    'SURETEUQARIJCgVSSUdIVBACIpgBCg1QYXJhZ3JhcGhUeXBlEhkKFUlOVkFMSURfUGFyYWdyYX'\n    'BoVHlwZRAAEggKBFRFWFQQARIMCghQSUNUVVJFUxACEggKBExJTkUQAxINCglSRUZFUkVOQ0UQ'\n    'BBIPCgtTT1JURURfTElTVBAFEhEKDVVOU09SVEVEX0xJU1QQBhINCglMSU5LX0NBUkQQBxIICg'\n    'RDT0RFEAhCCQoHY29udGVudA==');\n\n@$core.Deprecated('Use picParagraphDescriptor instead')\nconst PicParagraph$json = {\n  '1': 'PicParagraph',\n  '2': [\n    {\n      '1': 'pics',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.MdlDynDraw',\n      '10': 'pics'\n    },\n    {\n      '1': 'style',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.PicParagraph.PicParagraphStyle',\n      '10': 'style'\n    },\n  ],\n  '4': [PicParagraph_PicParagraphStyle$json],\n};\n\n@$core.Deprecated('Use picParagraphDescriptor instead')\nconst PicParagraph_PicParagraphStyle$json = {\n  '1': 'PicParagraphStyle',\n  '2': [\n    {'1': 'INVALID_PicParagraphStyle', '2': 0},\n    {'1': 'NINE_CELL', '2': 1},\n    {'1': 'BIG_SCROLL', '2': 2},\n  ],\n};\n\n/// Descriptor for `PicParagraph`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List picParagraphDescriptor = $convert.base64Decode(\n    'CgxQaWNQYXJhZ3JhcGgSNwoEcGljcxgBIAEoCzIjLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLk'\n    '1kbER5bkRyYXdSBHBpY3MSTQoFc3R5bGUYAiABKA4yNy5iaWxpYmlsaS5hcHAuZHluYW1pYy52'\n    'Mi5QaWNQYXJhZ3JhcGguUGljUGFyYWdyYXBoU3R5bGVSBXN0eWxlIlEKEVBpY1BhcmFncmFwaF'\n    'N0eWxlEh0KGUlOVkFMSURfUGljUGFyYWdyYXBoU3R5bGUQABINCglOSU5FX0NFTEwQARIOCgpC'\n    'SUdfU0NST0xMEAI=');\n\n@$core.Deprecated('Use playurlParamDescriptor instead')\nconst PlayurlParam$json = {\n  '1': 'PlayurlParam',\n  '2': [\n    {'1': 'qn', '3': 1, '4': 1, '5': 5, '10': 'qn'},\n    {'1': 'fnver', '3': 2, '4': 1, '5': 5, '10': 'fnver'},\n    {'1': 'fnval', '3': 3, '4': 1, '5': 5, '10': 'fnval'},\n    {'1': 'force_host', '3': 4, '4': 1, '5': 5, '10': 'forceHost'},\n    {'1': 'fourk', '3': 5, '4': 1, '5': 5, '10': 'fourk'},\n  ],\n};\n\n/// Descriptor for `PlayurlParam`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playurlParamDescriptor = $convert.base64Decode(\n    'CgxQbGF5dXJsUGFyYW0SDgoCcW4YASABKAVSAnFuEhQKBWZudmVyGAIgASgFUgVmbnZlchIUCg'\n    'VmbnZhbBgDIAEoBVIFZm52YWwSHQoKZm9yY2VfaG9zdBgEIAEoBVIJZm9yY2VIb3N0EhQKBWZv'\n    'dXJrGAUgASgFUgVmb3Vyaw==');\n\n@$core.Deprecated('Use popupDescriptor instead')\nconst Popup$json = {\n  '1': 'Popup',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'desc', '3': 2, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n  ],\n};\n\n/// Descriptor for `Popup`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List popupDescriptor = $convert.base64Decode(\n    'CgVQb3B1cBIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSEgoEZGVzYxgCIAEoCVIEZGVzYxIQCgN1cm'\n    'kYAyABKAlSA3VyaQ==');\n\n@$core.Deprecated('Use protectedStaticResourceDescriptor instead')\nconst ProtectedStaticResource$json = {\n  '1': 'ProtectedStaticResource',\n  '2': [\n    {'1': 'res_url', '3': 1, '4': 1, '5': 9, '10': 'resUrl'},\n    {'1': 'is_already_signed', '3': 2, '4': 1, '5': 8, '10': 'isAlreadySigned'},\n    {'1': 'sign_param', '3': 3, '4': 1, '5': 9, '10': 'signParam'},\n  ],\n};\n\n/// Descriptor for `ProtectedStaticResource`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List protectedStaticResourceDescriptor = $convert.base64Decode(\n    'ChdQcm90ZWN0ZWRTdGF0aWNSZXNvdXJjZRIXCgdyZXNfdXJsGAEgASgJUgZyZXNVcmwSKgoRaX'\n    'NfYWxyZWFkeV9zaWduZWQYAiABKAhSD2lzQWxyZWFkeVNpZ25lZBIdCgpzaWduX3BhcmFtGAMg'\n    'ASgJUglzaWduUGFyYW0=');\n\n@$core.Deprecated('Use quickConsumeMoreAvatarListReplyDescriptor instead')\nconst QuickConsumeMoreAvatarListReply$json = {\n  '1': 'QuickConsumeMoreAvatarListReply',\n  '2': [\n    {'1': 'offset', '3': 1, '4': 1, '5': 9, '10': 'offset'},\n    {'1': 'has_more', '3': 2, '4': 1, '5': 8, '10': 'hasMore'},\n    {\n      '1': 'up_list',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.UpListItem',\n      '10': 'upList'\n    },\n  ],\n};\n\n/// Descriptor for `QuickConsumeMoreAvatarListReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List quickConsumeMoreAvatarListReplyDescriptor =\n    $convert.base64Decode(\n        'Ch9RdWlja0NvbnN1bWVNb3JlQXZhdGFyTGlzdFJlcGx5EhYKBm9mZnNldBgBIAEoCVIGb2Zmc2'\n        'V0EhkKCGhhc19tb3JlGAIgASgIUgdoYXNNb3JlEjwKB3VwX2xpc3QYAyADKAsyIy5iaWxpYmls'\n        'aS5hcHAuZHluYW1pYy52Mi5VcExpc3RJdGVtUgZ1cExpc3Q=');\n\n@$core.Deprecated('Use quickConsumeMoreAvatarListReqDescriptor instead')\nconst QuickConsumeMoreAvatarListReq$json = {\n  '1': 'QuickConsumeMoreAvatarListReq',\n  '2': [\n    {'1': 'offset', '3': 1, '4': 1, '5': 9, '10': 'offset'},\n  ],\n};\n\n/// Descriptor for `QuickConsumeMoreAvatarListReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List quickConsumeMoreAvatarListReqDescriptor =\n    $convert.base64Decode(\n        'Ch1RdWlja0NvbnN1bWVNb3JlQXZhdGFyTGlzdFJlcRIWCgZvZmZzZXQYASABKAlSBm9mZnNldA'\n        '==');\n\n@$core.Deprecated('Use rcmdArchiveDescriptor instead')\nconst RcmdArchive$json = {\n  '1': 'RcmdArchive',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 2, '4': 1, '5': 9, '10': 'cover'},\n    {\n      '1': 'cover_left_icon1',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CoverIcon',\n      '10': 'coverLeftIcon1'\n    },\n    {'1': 'cover_left_text1', '3': 4, '4': 1, '5': 9, '10': 'coverLeftText1'},\n    {'1': 'uri', '3': 5, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'is_pgc', '3': 6, '4': 1, '5': 8, '10': 'isPgc'},\n    {'1': 'aid', '3': 7, '4': 1, '5': 3, '10': 'aid'},\n    {\n      '1': 'badge',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.IconBadge',\n      '10': 'badge'\n    },\n    {\n      '1': 'cover_left_icon2',\n      '3': 9,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CoverIcon',\n      '10': 'coverLeftIcon2'\n    },\n    {'1': 'cover_left_text2', '3': 10, '4': 1, '5': 9, '10': 'coverLeftText2'},\n    {\n      '1': 'cover_left_icon3',\n      '3': 11,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CoverIcon',\n      '10': 'coverLeftIcon3'\n    },\n    {'1': 'cover_left_text3', '3': 12, '4': 1, '5': 9, '10': 'coverLeftText3'},\n    {'1': 'desc', '3': 13, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'track_id', '3': 14, '4': 1, '5': 9, '10': 'trackId'},\n    {\n      '1': 'rcmd_reason',\n      '3': 15,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.RcmdReason',\n      '10': 'rcmdReason'\n    },\n  ],\n};\n\n/// Descriptor for `RcmdArchive`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rcmdArchiveDescriptor = $convert.base64Decode(\n    'CgtSY21kQXJjaGl2ZRIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSFAoFY292ZXIYAiABKAlSBWNvdm'\n    'VyEkwKEGNvdmVyX2xlZnRfaWNvbjEYAyABKA4yIi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5D'\n    'b3Zlckljb25SDmNvdmVyTGVmdEljb24xEigKEGNvdmVyX2xlZnRfdGV4dDEYBCABKAlSDmNvdm'\n    'VyTGVmdFRleHQxEhAKA3VyaRgFIAEoCVIDdXJpEhUKBmlzX3BnYxgGIAEoCFIFaXNQZ2MSEAoD'\n    'YWlkGAcgASgDUgNhaWQSOAoFYmFkZ2UYCCABKAsyIi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi'\n    '5JY29uQmFkZ2VSBWJhZGdlEkwKEGNvdmVyX2xlZnRfaWNvbjIYCSABKA4yIi5iaWxpYmlsaS5h'\n    'cHAuZHluYW1pYy52Mi5Db3Zlckljb25SDmNvdmVyTGVmdEljb24yEigKEGNvdmVyX2xlZnRfdG'\n    'V4dDIYCiABKAlSDmNvdmVyTGVmdFRleHQyEkwKEGNvdmVyX2xlZnRfaWNvbjMYCyABKA4yIi5i'\n    'aWxpYmlsaS5hcHAuZHluYW1pYy52Mi5Db3Zlckljb25SDmNvdmVyTGVmdEljb24zEigKEGNvdm'\n    'VyX2xlZnRfdGV4dDMYDCABKAlSDmNvdmVyTGVmdFRleHQzEhIKBGRlc2MYDSABKAlSBGRlc2MS'\n    'GQoIdHJhY2tfaWQYDiABKAlSB3RyYWNrSWQSRAoLcmNtZF9yZWFzb24YDyABKAsyIy5iaWxpYm'\n    'lsaS5hcHAuZHluYW1pYy52Mi5SY21kUmVhc29uUgpyY21kUmVhc29u');\n\n@$core.Deprecated('Use rcmdAuthorDescriptor instead')\nconst RcmdAuthor$json = {\n  '1': 'RcmdAuthor',\n  '2': [\n    {\n      '1': 'author',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.UserInfo',\n      '10': 'author'\n    },\n    {'1': 'desc', '3': 2, '4': 1, '5': 9, '10': 'desc'},\n    {\n      '1': 'relation',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Relation',\n      '10': 'relation'\n    },\n  ],\n};\n\n/// Descriptor for `RcmdAuthor`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rcmdAuthorDescriptor = $convert.base64Decode(\n    'CgpSY21kQXV0aG9yEjkKBmF1dGhvchgBIAEoCzIhLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLl'\n    'VzZXJJbmZvUgZhdXRob3ISEgoEZGVzYxgCIAEoCVIEZGVzYxI9CghyZWxhdGlvbhgDIAEoCzIh'\n    'LmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlJlbGF0aW9uUghyZWxhdGlvbg==');\n\n@$core.Deprecated('Use rcmdCampusBriefDescriptor instead')\nconst RcmdCampusBrief$json = {\n  '1': 'RcmdCampusBrief',\n  '2': [\n    {'1': 'campus_id', '3': 1, '4': 1, '5': 3, '10': 'campusId'},\n    {'1': 'campus_name', '3': 2, '4': 1, '5': 9, '10': 'campusName'},\n    {'1': 'campus_badge', '3': 4, '4': 1, '5': 9, '10': 'campusBadge'},\n    {'1': 'url', '3': 5, '4': 1, '5': 9, '10': 'url'},\n  ],\n};\n\n/// Descriptor for `RcmdCampusBrief`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rcmdCampusBriefDescriptor = $convert.base64Decode(\n    'Cg9SY21kQ2FtcHVzQnJpZWYSGwoJY2FtcHVzX2lkGAEgASgDUghjYW1wdXNJZBIfCgtjYW1wdX'\n    'NfbmFtZRgCIAEoCVIKY2FtcHVzTmFtZRIhCgxjYW1wdXNfYmFkZ2UYBCABKAlSC2NhbXB1c0Jh'\n    'ZGdlEhAKA3VybBgFIAEoCVIDdXJs');\n\n@$core.Deprecated('Use rcmdItemDescriptor instead')\nconst RcmdItem$json = {\n  '1': 'RcmdItem',\n  '2': [\n    {\n      '1': 'rcmd_archive',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.RcmdArchive',\n      '9': 0,\n      '10': 'rcmdArchive'\n    },\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.RcmdType',\n      '10': 'type'\n    },\n  ],\n  '8': [\n    {'1': 'rcmd_item'},\n  ],\n};\n\n/// Descriptor for `RcmdItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rcmdItemDescriptor = $convert.base64Decode(\n    'CghSY21kSXRlbRJJCgxyY21kX2FyY2hpdmUYAiABKAsyJC5iaWxpYmlsaS5hcHAuZHluYW1pYy'\n    '52Mi5SY21kQXJjaGl2ZUgAUgtyY21kQXJjaGl2ZRI1CgR0eXBlGAEgASgOMiEuYmlsaWJpbGku'\n    'YXBwLmR5bmFtaWMudjIuUmNtZFR5cGVSBHR5cGVCCwoJcmNtZF9pdGVt');\n\n@$core.Deprecated('Use rcmdOptionDescriptor instead')\nconst RcmdOption$json = {\n  '1': 'RcmdOption',\n  '2': [\n    {'1': 'show_title', '3': 1, '4': 1, '5': 8, '10': 'showTitle'},\n  ],\n};\n\n/// Descriptor for `RcmdOption`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rcmdOptionDescriptor = $convert.base64Decode(\n    'CgpSY21kT3B0aW9uEh0KCnNob3dfdGl0bGUYASABKAhSCXNob3dUaXRsZQ==');\n\n@$core.Deprecated('Use rcmdReasonDescriptor instead')\nconst RcmdReason$json = {\n  '1': 'RcmdReason',\n  '2': [\n    {'1': 'campus_name', '3': 1, '4': 1, '5': 9, '10': 'campusName'},\n    {\n      '1': 'style',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.RcmdReasonStyle',\n      '10': 'style'\n    },\n    {'1': 'rcmd_reason', '3': 3, '4': 1, '5': 9, '10': 'rcmdReason'},\n    {'1': 'up_name', '3': 4, '4': 1, '5': 9, '10': 'upName'},\n  ],\n};\n\n/// Descriptor for `RcmdReason`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rcmdReasonDescriptor = $convert.base64Decode(\n    'CgpSY21kUmVhc29uEh8KC2NhbXB1c19uYW1lGAEgASgJUgpjYW1wdXNOYW1lEj4KBXN0eWxlGA'\n    'IgASgOMiguYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuUmNtZFJlYXNvblN0eWxlUgVzdHlsZRIf'\n    'CgtyY21kX3JlYXNvbhgDIAEoCVIKcmNtZFJlYXNvbhIXCgd1cF9uYW1lGAQgASgJUgZ1cE5hbW'\n    'U=');\n\n@$core.Deprecated('Use rcmdTopButtonDescriptor instead')\nconst RcmdTopButton$json = {\n  '1': 'RcmdTopButton',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'url', '3': 2, '4': 1, '5': 9, '10': 'url'},\n  ],\n};\n\n/// Descriptor for `RcmdTopButton`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rcmdTopButtonDescriptor = $convert.base64Decode(\n    'Cg1SY21kVG9wQnV0dG9uEhIKBHRleHQYASABKAlSBHRleHQSEAoDdXJsGAIgASgJUgN1cmw=');\n\n@$core.Deprecated('Use rcmdUPsParamDescriptor instead')\nconst RcmdUPsParam$json = {\n  '1': 'RcmdUPsParam',\n  '2': [\n    {'1': 'dislike_ts', '3': 1, '4': 1, '5': 3, '10': 'dislikeTs'},\n  ],\n};\n\n/// Descriptor for `RcmdUPsParam`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rcmdUPsParamDescriptor = $convert.base64Decode(\n    'CgxSY21kVVBzUGFyYW0SHQoKZGlzbGlrZV90cxgBIAEoA1IJZGlzbGlrZVRz');\n\n@$core.Deprecated('Use reactionListItemDescriptor instead')\nconst ReactionListItem$json = {\n  '1': 'ReactionListItem',\n  '2': [\n    {\n      '1': 'user',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.UserInfo',\n      '10': 'user'\n    },\n    {\n      '1': 'relation',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Relation',\n      '10': 'relation'\n    },\n    {'1': 'act_text', '3': 3, '4': 1, '5': 9, '10': 'actText'},\n    {'1': 'rcmd_reason', '3': 4, '4': 1, '5': 9, '10': 'rcmdReason'},\n  ],\n};\n\n/// Descriptor for `ReactionListItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reactionListItemDescriptor = $convert.base64Decode(\n    'ChBSZWFjdGlvbkxpc3RJdGVtEjUKBHVzZXIYASABKAsyIS5iaWxpYmlsaS5hcHAuZHluYW1pYy'\n    '52Mi5Vc2VySW5mb1IEdXNlchI9CghyZWxhdGlvbhgCIAEoCzIhLmJpbGliaWxpLmFwcC5keW5h'\n    'bWljLnYyLlJlbGF0aW9uUghyZWxhdGlvbhIZCghhY3RfdGV4dBgDIAEoCVIHYWN0VGV4dBIfCg'\n    'tyY21kX3JlYXNvbhgEIAEoCVIKcmNtZFJlYXNvbg==');\n\n@$core.Deprecated('Use reactionListReplyDescriptor instead')\nconst ReactionListReply$json = {\n  '1': 'ReactionListReply',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'reaction_list',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ReactionListItem',\n      '10': 'reactionList'\n    },\n    {'1': 'offset', '3': 3, '4': 1, '5': 9, '10': 'offset'},\n    {'1': 'has_more', '3': 4, '4': 1, '5': 8, '10': 'hasMore'},\n  ],\n};\n\n/// Descriptor for `ReactionListReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reactionListReplyDescriptor = $convert.base64Decode(\n    'ChFSZWFjdGlvbkxpc3RSZXBseRIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSTgoNcmVhY3Rpb25fbG'\n    'lzdBgCIAMoCzIpLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlJlYWN0aW9uTGlzdEl0ZW1SDHJl'\n    'YWN0aW9uTGlzdBIWCgZvZmZzZXQYAyABKAlSBm9mZnNldBIZCghoYXNfbW9yZRgEIAEoCFIHaG'\n    'FzTW9yZQ==');\n\n@$core.Deprecated('Use reactionListReqDescriptor instead')\nconst ReactionListReq$json = {\n  '1': 'ReactionListReq',\n  '2': [\n    {'1': 'dynamic_id', '3': 1, '4': 1, '5': 3, '10': 'dynamicId'},\n    {'1': 'dyn_type', '3': 2, '4': 1, '5': 3, '10': 'dynType'},\n    {'1': 'rid', '3': 3, '4': 1, '5': 3, '10': 'rid'},\n    {'1': 'offset', '3': 4, '4': 1, '5': 9, '10': 'offset'},\n  ],\n};\n\n/// Descriptor for `ReactionListReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reactionListReqDescriptor = $convert.base64Decode(\n    'Cg9SZWFjdGlvbkxpc3RSZXESHQoKZHluYW1pY19pZBgBIAEoA1IJZHluYW1pY0lkEhkKCGR5bl'\n    '90eXBlGAIgASgDUgdkeW5UeXBlEhAKA3JpZBgDIAEoA1IDcmlkEhYKBm9mZnNldBgEIAEoCVIG'\n    'b2Zmc2V0');\n\n@$core.Deprecated('Use relationDescriptor instead')\nconst Relation$json = {\n  '1': 'Relation',\n  '2': [\n    {\n      '1': 'status',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.RelationStatus',\n      '10': 'status'\n    },\n    {'1': 'is_follow', '3': 2, '4': 1, '5': 5, '10': 'isFollow'},\n    {'1': 'is_followed', '3': 3, '4': 1, '5': 5, '10': 'isFollowed'},\n    {'1': 'title', '3': 4, '4': 1, '5': 9, '10': 'title'},\n  ],\n};\n\n/// Descriptor for `Relation`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List relationDescriptor = $convert.base64Decode(\n    'CghSZWxhdGlvbhI/CgZzdGF0dXMYASABKA4yJy5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5SZW'\n    'xhdGlvblN0YXR1c1IGc3RhdHVzEhsKCWlzX2ZvbGxvdxgCIAEoBVIIaXNGb2xsb3cSHwoLaXNf'\n    'Zm9sbG93ZWQYAyABKAVSCmlzRm9sbG93ZWQSFAoFdGl0bGUYBCABKAlSBXRpdGxl');\n\n@$core.Deprecated('Use repostExtraInfoDescriptor instead')\nconst RepostExtraInfo$json = {\n  '1': 'RepostExtraInfo',\n  '2': [\n    {'1': 'adcm_id', '3': 1, '4': 1, '5': 9, '10': 'adcmId'},\n  ],\n};\n\n/// Descriptor for `RepostExtraInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List repostExtraInfoDescriptor = $convert\n    .base64Decode('Cg9SZXBvc3RFeHRyYUluZm8SFwoHYWRjbV9pZBgBIAEoCVIGYWRjbUlk');\n\n@$core.Deprecated('Use repostListReqDescriptor instead')\nconst RepostListReq$json = {\n  '1': 'RepostListReq',\n  '2': [\n    {'1': 'dynamic_id', '3': 1, '4': 1, '5': 9, '10': 'dynamicId'},\n    {'1': 'dyn_type', '3': 2, '4': 1, '5': 3, '10': 'dynType'},\n    {'1': 'rid', '3': 3, '4': 1, '5': 3, '10': 'rid'},\n    {'1': 'offset', '3': 4, '4': 1, '5': 9, '10': 'offset'},\n    {'1': 'from', '3': 5, '4': 1, '5': 9, '10': 'from'},\n    {\n      '1': 'repost_type',\n      '3': 6,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.RepostType',\n      '10': 'repostType'\n    },\n  ],\n};\n\n/// Descriptor for `RepostListReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List repostListReqDescriptor = $convert.base64Decode(\n    'Cg1SZXBvc3RMaXN0UmVxEh0KCmR5bmFtaWNfaWQYASABKAlSCWR5bmFtaWNJZBIZCghkeW5fdH'\n    'lwZRgCIAEoA1IHZHluVHlwZRIQCgNyaWQYAyABKANSA3JpZBIWCgZvZmZzZXQYBCABKAlSBm9m'\n    'ZnNldBISCgRmcm9tGAUgASgJUgRmcm9tEkQKC3JlcG9zdF90eXBlGAYgASgOMiMuYmlsaWJpbG'\n    'kuYXBwLmR5bmFtaWMudjIuUmVwb3N0VHlwZVIKcmVwb3N0VHlwZQ==');\n\n@$core.Deprecated('Use repostListRspDescriptor instead')\nconst RepostListRsp$json = {\n  '1': 'RepostListRsp',\n  '2': [\n    {\n      '1': 'list',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynamicItem',\n      '10': 'list'\n    },\n    {'1': 'offset', '3': 2, '4': 1, '5': 9, '10': 'offset'},\n    {'1': 'has_more', '3': 3, '4': 1, '5': 8, '10': 'hasMore'},\n    {'1': 'total_count', '3': 4, '4': 1, '5': 3, '10': 'totalCount'},\n    {\n      '1': 'repost_type',\n      '3': 5,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.RepostType',\n      '10': 'repostType'\n    },\n  ],\n};\n\n/// Descriptor for `RepostListRsp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List repostListRspDescriptor = $convert.base64Decode(\n    'Cg1SZXBvc3RMaXN0UnNwEjgKBGxpc3QYASADKAsyJC5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi'\n    '5EeW5hbWljSXRlbVIEbGlzdBIWCgZvZmZzZXQYAiABKAlSBm9mZnNldBIZCghoYXNfbW9yZRgD'\n    'IAEoCFIHaGFzTW9yZRIfCgt0b3RhbF9jb3VudBgEIAEoA1IKdG90YWxDb3VudBJECgtyZXBvc3'\n    'RfdHlwZRgFIAEoDjIjLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlJlcG9zdFR5cGVSCnJlcG9z'\n    'dFR5cGU=');\n\n@$core.Deprecated('Use schoolRecommendReplyDescriptor instead')\nconst SchoolRecommendReply$json = {\n  '1': 'SchoolRecommendReply',\n  '2': [\n    {\n      '1': 'items',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusInfo',\n      '10': 'items'\n    },\n  ],\n};\n\n/// Descriptor for `SchoolRecommendReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List schoolRecommendReplyDescriptor = $convert.base64Decode(\n    'ChRTY2hvb2xSZWNvbW1lbmRSZXBseRI5CgVpdGVtcxgBIAMoCzIjLmJpbGliaWxpLmFwcC5keW'\n    '5hbWljLnYyLkNhbXB1c0luZm9SBWl0ZW1z');\n\n@$core.Deprecated('Use schoolRecommendReqDescriptor instead')\nconst SchoolRecommendReq$json = {\n  '1': 'SchoolRecommendReq',\n  '2': [\n    {'1': 'lat', '3': 1, '4': 1, '5': 2, '10': 'lat'},\n    {'1': 'lng', '3': 2, '4': 1, '5': 2, '10': 'lng'},\n    {\n      '1': 'from_type',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CampusReqFromType',\n      '10': 'fromType'\n    },\n  ],\n};\n\n/// Descriptor for `SchoolRecommendReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List schoolRecommendReqDescriptor = $convert.base64Decode(\n    'ChJTY2hvb2xSZWNvbW1lbmRSZXESEAoDbGF0GAEgASgCUgNsYXQSEAoDbG5nGAIgASgCUgNsbm'\n    'cSRwoJZnJvbV90eXBlGAMgASgOMiouYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQ2FtcHVzUmVx'\n    'RnJvbVR5cGVSCGZyb21UeXBl');\n\n@$core.Deprecated('Use schoolSearchReplyDescriptor instead')\nconst SchoolSearchReply$json = {\n  '1': 'SchoolSearchReply',\n  '2': [\n    {\n      '1': 'items',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusInfo',\n      '10': 'items'\n    },\n    {\n      '1': 'toast',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.SearchToast',\n      '10': 'toast'\n    },\n  ],\n};\n\n/// Descriptor for `SchoolSearchReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List schoolSearchReplyDescriptor = $convert.base64Decode(\n    'ChFTY2hvb2xTZWFyY2hSZXBseRI5CgVpdGVtcxgBIAMoCzIjLmJpbGliaWxpLmFwcC5keW5hbW'\n    'ljLnYyLkNhbXB1c0luZm9SBWl0ZW1zEjoKBXRvYXN0GAIgASgLMiQuYmlsaWJpbGkuYXBwLmR5'\n    'bmFtaWMudjIuU2VhcmNoVG9hc3RSBXRvYXN0');\n\n@$core.Deprecated('Use schoolSearchReqDescriptor instead')\nconst SchoolSearchReq$json = {\n  '1': 'SchoolSearchReq',\n  '2': [\n    {'1': 'keyword', '3': 1, '4': 1, '5': 9, '10': 'keyword'},\n    {\n      '1': 'from_type',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CampusReqFromType',\n      '10': 'fromType'\n    },\n  ],\n};\n\n/// Descriptor for `SchoolSearchReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List schoolSearchReqDescriptor = $convert.base64Decode(\n    'Cg9TY2hvb2xTZWFyY2hSZXESGAoHa2V5d29yZBgBIAEoCVIHa2V5d29yZBJHCglmcm9tX3R5cG'\n    'UYAiABKA4yKi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5DYW1wdXNSZXFGcm9tVHlwZVIIZnJv'\n    'bVR5cGU=');\n\n@$core.Deprecated('Use searchChannelDescriptor instead')\nconst SearchChannel$json = {\n  '1': 'SearchChannel',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'more_button',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.SearchTopicButton',\n      '10': 'moreButton'\n    },\n    {\n      '1': 'channels',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ChannelInfo',\n      '10': 'channels'\n    },\n  ],\n};\n\n/// Descriptor for `SearchChannel`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List searchChannelDescriptor = $convert.base64Decode(\n    'Cg1TZWFyY2hDaGFubmVsEhQKBXRpdGxlGAEgASgJUgV0aXRsZRJLCgttb3JlX2J1dHRvbhgCIA'\n    'EoCzIqLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlNlYXJjaFRvcGljQnV0dG9uUgptb3JlQnV0'\n    'dG9uEkAKCGNoYW5uZWxzGAMgAygLMiQuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQ2hhbm5lbE'\n    'luZm9SCGNoYW5uZWxz');\n\n@$core.Deprecated('Use searchInfoDescriptor instead')\nconst SearchInfo$json = {\n  '1': 'SearchInfo',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'list',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynamicItem',\n      '10': 'list'\n    },\n    {'1': 'track_id', '3': 3, '4': 1, '5': 9, '10': 'trackId'},\n    {'1': 'total', '3': 4, '4': 1, '5': 3, '10': 'total'},\n    {'1': 'has_more', '3': 5, '4': 1, '5': 8, '10': 'hasMore'},\n    {'1': 'version', '3': 6, '4': 1, '5': 9, '10': 'version'},\n  ],\n};\n\n/// Descriptor for `SearchInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List searchInfoDescriptor = $convert.base64Decode(\n    'CgpTZWFyY2hJbmZvEhQKBXRpdGxlGAEgASgJUgV0aXRsZRI4CgRsaXN0GAIgAygLMiQuYmlsaW'\n    'JpbGkuYXBwLmR5bmFtaWMudjIuRHluYW1pY0l0ZW1SBGxpc3QSGQoIdHJhY2tfaWQYAyABKAlS'\n    'B3RyYWNrSWQSFAoFdG90YWwYBCABKANSBXRvdGFsEhkKCGhhc19tb3JlGAUgASgIUgdoYXNNb3'\n    'JlEhgKB3ZlcnNpb24YBiABKAlSB3ZlcnNpb24=');\n\n@$core.Deprecated('Use searchToastDescriptor instead')\nconst SearchToast$json = {\n  '1': 'SearchToast',\n  '2': [\n    {'1': 'desc_text1', '3': 1, '4': 1, '5': 9, '10': 'descText1'},\n    {'1': 'desc_text2', '3': 2, '4': 1, '5': 9, '10': 'descText2'},\n  ],\n};\n\n/// Descriptor for `SearchToast`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List searchToastDescriptor = $convert.base64Decode(\n    'CgtTZWFyY2hUb2FzdBIdCgpkZXNjX3RleHQxGAEgASgJUglkZXNjVGV4dDESHQoKZGVzY190ZX'\n    'h0MhgCIAEoCVIJZGVzY1RleHQy');\n\n@$core.Deprecated('Use searchTopicDescriptor instead')\nconst SearchTopic$json = {\n  '1': 'SearchTopic',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'more_button',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.SearchTopicButton',\n      '10': 'moreButton'\n    },\n    {\n      '1': 'items',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.SearchTopicItem',\n      '10': 'items'\n    },\n  ],\n};\n\n/// Descriptor for `SearchTopic`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List searchTopicDescriptor = $convert.base64Decode(\n    'CgtTZWFyY2hUb3BpYxIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSSwoLbW9yZV9idXR0b24YAiABKA'\n    'syKi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5TZWFyY2hUb3BpY0J1dHRvblIKbW9yZUJ1dHRv'\n    'bhI+CgVpdGVtcxgDIAMoCzIoLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlNlYXJjaFRvcGljSX'\n    'RlbVIFaXRlbXM=');\n\n@$core.Deprecated('Use searchTopicButtonDescriptor instead')\nconst SearchTopicButton$json = {\n  '1': 'SearchTopicButton',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'jump_uri', '3': 2, '4': 1, '5': 9, '10': 'jumpUri'},\n  ],\n};\n\n/// Descriptor for `SearchTopicButton`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List searchTopicButtonDescriptor = $convert.base64Decode(\n    'ChFTZWFyY2hUb3BpY0J1dHRvbhIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSGQoIanVtcF91cmkYAi'\n    'ABKAlSB2p1bXBVcmk=');\n\n@$core.Deprecated('Use searchTopicItemDescriptor instead')\nconst SearchTopicItem$json = {\n  '1': 'SearchTopicItem',\n  '2': [\n    {'1': 'topic_id', '3': 1, '4': 1, '5': 3, '10': 'topicId'},\n    {'1': 'topic_name', '3': 2, '4': 1, '5': 9, '10': 'topicName'},\n    {'1': 'desc', '3': 3, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'url', '3': 4, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'is_activity', '3': 5, '4': 1, '5': 8, '10': 'isActivity'},\n    {'1': 'tag_icon', '3': 6, '4': 1, '5': 9, '10': 'tagIcon'},\n    {'1': 'desc_long', '3': 7, '4': 1, '5': 9, '10': 'descLong'},\n    {'1': 'cover', '3': 8, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'tag_text', '3': 9, '4': 1, '5': 9, '10': 'tagText'},\n  ],\n};\n\n/// Descriptor for `SearchTopicItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List searchTopicItemDescriptor = $convert.base64Decode(\n    'Cg9TZWFyY2hUb3BpY0l0ZW0SGQoIdG9waWNfaWQYASABKANSB3RvcGljSWQSHQoKdG9waWNfbm'\n    'FtZRgCIAEoCVIJdG9waWNOYW1lEhIKBGRlc2MYAyABKAlSBGRlc2MSEAoDdXJsGAQgASgJUgN1'\n    'cmwSHwoLaXNfYWN0aXZpdHkYBSABKAhSCmlzQWN0aXZpdHkSGQoIdGFnX2ljb24YBiABKAlSB3'\n    'RhZ0ljb24SGwoJZGVzY19sb25nGAcgASgJUghkZXNjTG9uZxIUCgVjb3ZlchgIIAEoCVIFY292'\n    'ZXISGQoIdGFnX3RleHQYCSABKAlSB3RhZ1RleHQ=');\n\n@$core.Deprecated('Use sectionNoteNavigationBarDescriptor instead')\nconst SectionNoteNavigationBar$json = {\n  '1': 'SectionNoteNavigationBar',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'right_icon', '3': 2, '4': 1, '5': 9, '10': 'rightIcon'},\n    {'1': 'jump_url', '3': 3, '4': 1, '5': 9, '10': 'jumpUrl'},\n  ],\n};\n\n/// Descriptor for `SectionNoteNavigationBar`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sectionNoteNavigationBarDescriptor =\n    $convert.base64Decode(\n        'ChhTZWN0aW9uTm90ZU5hdmlnYXRpb25CYXISFAoFdGl0bGUYASABKAlSBXRpdGxlEh0KCnJpZ2'\n        'h0X2ljb24YAiABKAlSCXJpZ2h0SWNvbhIZCghqdW1wX3VybBgDIAEoCVIHanVtcFVybA==');\n\n@$core.Deprecated('Use sectionOpusCollectionDescriptor instead')\nconst SectionOpusCollection$json = {\n  '1': 'SectionOpusCollection',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'all_collections',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OpusCollectionWithCover',\n      '10': 'allCollections'\n    },\n  ],\n};\n\n/// Descriptor for `SectionOpusCollection`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sectionOpusCollectionDescriptor = $convert.base64Decode(\n    'ChVTZWN0aW9uT3B1c0NvbGxlY3Rpb24SFAoFdGl0bGUYASABKAlSBXRpdGxlElkKD2FsbF9jb2'\n    'xsZWN0aW9ucxgCIAMoCzIwLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLk9wdXNDb2xsZWN0aW9u'\n    'V2l0aENvdmVyUg5hbGxDb2xsZWN0aW9ucw==');\n\n@$core.Deprecated('Use selectedClassificationAndSortTypeDescriptor instead')\nconst SelectedClassificationAndSortType$json = {\n  '1': 'SelectedClassificationAndSortType',\n  '2': [\n    {\n      '1': 'chosen_classification_type',\n      '3': 1,\n      '4': 1,\n      '5': 9,\n      '10': 'chosenClassificationType'\n    },\n    {'1': 'chosen_sort_type', '3': 2, '4': 1, '5': 9, '10': 'chosenSortType'},\n  ],\n};\n\n/// Descriptor for `SelectedClassificationAndSortType`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List selectedClassificationAndSortTypeDescriptor =\n    $convert.base64Decode(\n        'CiFTZWxlY3RlZENsYXNzaWZpY2F0aW9uQW5kU29ydFR5cGUSPAoaY2hvc2VuX2NsYXNzaWZpY2'\n        'F0aW9uX3R5cGUYASABKAlSGGNob3NlbkNsYXNzaWZpY2F0aW9uVHlwZRIoChBjaG9zZW5fc29y'\n        'dF90eXBlGAIgASgJUg5jaG9zZW5Tb3J0VHlwZQ==');\n\n@$core.Deprecated('Use setDecisionReqDescriptor instead')\nconst SetDecisionReq$json = {\n  '1': 'SetDecisionReq',\n  '2': [\n    {'1': 'result', '3': 1, '4': 1, '5': 5, '10': 'result'},\n    {\n      '1': 'from_type',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CampusReqFromType',\n      '10': 'fromType'\n    },\n  ],\n};\n\n/// Descriptor for `SetDecisionReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List setDecisionReqDescriptor = $convert.base64Decode(\n    'Cg5TZXREZWNpc2lvblJlcRIWCgZyZXN1bHQYASABKAVSBnJlc3VsdBJHCglmcm9tX3R5cGUYAi'\n    'ABKA4yKi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5DYW1wdXNSZXFGcm9tVHlwZVIIZnJvbVR5'\n    'cGU=');\n\n@$core.Deprecated('Use setRecentCampusReqDescriptor instead')\nconst SetRecentCampusReq$json = {\n  '1': 'SetRecentCampusReq',\n  '2': [\n    {'1': 'campus_id', '3': 1, '4': 1, '5': 3, '10': 'campusId'},\n    {'1': 'campus_name', '3': 2, '4': 1, '5': 9, '10': 'campusName'},\n    {\n      '1': 'from_type',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CampusReqFromType',\n      '10': 'fromType'\n    },\n  ],\n};\n\n/// Descriptor for `SetRecentCampusReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List setRecentCampusReqDescriptor = $convert.base64Decode(\n    'ChJTZXRSZWNlbnRDYW1wdXNSZXESGwoJY2FtcHVzX2lkGAEgASgDUghjYW1wdXNJZBIfCgtjYW'\n    '1wdXNfbmFtZRgCIAEoCVIKY2FtcHVzTmFtZRJHCglmcm9tX3R5cGUYAyABKA4yKi5iaWxpYmls'\n    'aS5hcHAuZHluYW1pYy52Mi5DYW1wdXNSZXFGcm9tVHlwZVIIZnJvbVR5cGU=');\n\n@$core.Deprecated('Use shareChannelDescriptor instead')\nconst ShareChannel$json = {\n  '1': 'ShareChannel',\n  '2': [\n    {'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'image', '3': 2, '4': 1, '5': 9, '10': 'image'},\n    {'1': 'channel', '3': 3, '4': 1, '5': 9, '10': 'channel'},\n    {\n      '1': 'reserve',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ShareReserve',\n      '10': 'reserve'\n    },\n  ],\n};\n\n/// Descriptor for `ShareChannel`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List shareChannelDescriptor = $convert.base64Decode(\n    'CgxTaGFyZUNoYW5uZWwSEgoEbmFtZRgBIAEoCVIEbmFtZRIUCgVpbWFnZRgCIAEoCVIFaW1hZ2'\n    'USGAoHY2hhbm5lbBgDIAEoCVIHY2hhbm5lbBI/CgdyZXNlcnZlGAQgASgLMiUuYmlsaWJpbGku'\n    'YXBwLmR5bmFtaWMudjIuU2hhcmVSZXNlcnZlUgdyZXNlcnZl');\n\n@$core.Deprecated('Use shareReserveDescriptor instead')\nconst ShareReserve$json = {\n  '1': 'ShareReserve',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'desc', '3': 2, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'qr_code_icon', '3': 3, '4': 1, '5': 9, '10': 'qrCodeIcon'},\n    {'1': 'qr_code_text', '3': 4, '4': 1, '5': 9, '10': 'qrCodeText'},\n    {'1': 'qr_code_url', '3': 5, '4': 1, '5': 9, '10': 'qrCodeUrl'},\n    {\n      '1': 'user_info',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionUserInfo',\n      '10': 'userInfo'\n    },\n  ],\n};\n\n/// Descriptor for `ShareReserve`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List shareReserveDescriptor = $convert.base64Decode(\n    'CgxTaGFyZVJlc2VydmUSFAoFdGl0bGUYASABKAlSBXRpdGxlEhIKBGRlc2MYAiABKAlSBGRlc2'\n    'MSIAoMcXJfY29kZV9pY29uGAMgASgJUgpxckNvZGVJY29uEiAKDHFyX2NvZGVfdGV4dBgEIAEo'\n    'CVIKcXJDb2RlVGV4dBIeCgtxcl9jb2RlX3VybBgFIAEoCVIJcXJDb2RlVXJsEkYKCXVzZXJfaW'\n    '5mbxgGIAEoCzIpLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkFkZGl0aW9uVXNlckluZm9SCHVz'\n    'ZXJJbmZv');\n\n@$core.Deprecated('Use signResourcesReqDescriptor instead')\nconst SignResourcesReq$json = {\n  '1': 'SignResourcesReq',\n  '2': [\n    {\n      '1': 'to_be_signed_res',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ProtectedStaticResource',\n      '10': 'toBeSignedRes'\n    },\n  ],\n};\n\n/// Descriptor for `SignResourcesReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List signResourcesReqDescriptor = $convert.base64Decode(\n    'ChBTaWduUmVzb3VyY2VzUmVxElkKEHRvX2JlX3NpZ25lZF9yZXMYASADKAsyMC5iaWxpYmlsaS'\n    '5hcHAuZHluYW1pYy52Mi5Qcm90ZWN0ZWRTdGF0aWNSZXNvdXJjZVINdG9CZVNpZ25lZFJlcw==');\n\n@$core.Deprecated('Use signResourcesRespDescriptor instead')\nconst SignResourcesResp$json = {\n  '1': 'SignResourcesResp',\n  '2': [\n    {\n      '1': 'signed_res',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.SignedStaticResource',\n      '10': 'signedRes'\n    },\n  ],\n};\n\n/// Descriptor for `SignResourcesResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List signResourcesRespDescriptor = $convert.base64Decode(\n    'ChFTaWduUmVzb3VyY2VzUmVzcBJMCgpzaWduZWRfcmVzGAEgAygLMi0uYmlsaWJpbGkuYXBwLm'\n    'R5bmFtaWMudjIuU2lnbmVkU3RhdGljUmVzb3VyY2VSCXNpZ25lZFJlcw==');\n\n@$core.Deprecated('Use signedStaticResourceDescriptor instead')\nconst SignedStaticResource$json = {\n  '1': 'SignedStaticResource',\n  '2': [\n    {'1': 'signed_res_url', '3': 1, '4': 1, '5': 9, '10': 'signedResUrl'},\n    {'1': 'is_succeed', '3': 2, '4': 1, '5': 8, '10': 'isSucceed'},\n  ],\n};\n\n/// Descriptor for `SignedStaticResource`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List signedStaticResourceDescriptor = $convert.base64Decode(\n    'ChRTaWduZWRTdGF0aWNSZXNvdXJjZRIkCg5zaWduZWRfcmVzX3VybBgBIAEoCVIMc2lnbmVkUm'\n    'VzVXJsEh0KCmlzX3N1Y2NlZWQYAiABKAhSCWlzU3VjY2VlZA==');\n\n@$core.Deprecated('Use sortTypeDescriptor instead')\nconst SortType$json = {\n  '1': 'SortType',\n  '2': [\n    {'1': 'sort_type', '3': 1, '4': 1, '5': 5, '10': 'sortType'},\n    {'1': 'sort_type_name', '3': 2, '4': 1, '5': 9, '10': 'sortTypeName'},\n  ],\n};\n\n/// Descriptor for `SortType`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sortTypeDescriptor = $convert.base64Decode(\n    'CghTb3J0VHlwZRIbCglzb3J0X3R5cGUYASABKAVSCHNvcnRUeXBlEiQKDnNvcnRfdHlwZV9uYW'\n    '1lGAIgASgJUgxzb3J0VHlwZU5hbWU=');\n\n@$core.Deprecated('Use storyArchiveDescriptor instead')\nconst StoryArchive$json = {\n  '1': 'StoryArchive',\n  '2': [\n    {'1': 'cover', '3': 1, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'aid', '3': 2, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n    {\n      '1': 'dimension',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Dimension',\n      '10': 'dimension'\n    },\n  ],\n};\n\n/// Descriptor for `StoryArchive`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List storyArchiveDescriptor = $convert.base64Decode(\n    'CgxTdG9yeUFyY2hpdmUSFAoFY292ZXIYASABKAlSBWNvdmVyEhAKA2FpZBgCIAEoA1IDYWlkEh'\n    'AKA3VyaRgDIAEoCVIDdXJpEkAKCWRpbWVuc2lvbhgEIAEoCzIiLmJpbGliaWxpLmFwcC5keW5h'\n    'bWljLnYyLkRpbWVuc2lvblIJZGltZW5zaW9u');\n\n@$core.Deprecated('Use storyItemDescriptor instead')\nconst StoryItem$json = {\n  '1': 'StoryItem',\n  '2': [\n    {\n      '1': 'story_archive',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.StoryArchive',\n      '9': 0,\n      '10': 'storyArchive'\n    },\n    {\n      '1': 'author',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.UserInfo',\n      '10': 'author'\n    },\n    {'1': 'desc', '3': 2, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'status', '3': 3, '4': 1, '5': 3, '10': 'status'},\n    {\n      '1': 'type',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.RcmdType',\n      '10': 'type'\n    },\n  ],\n  '8': [\n    {'1': 'rcmd_item'},\n  ],\n};\n\n/// Descriptor for `StoryItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List storyItemDescriptor = $convert.base64Decode(\n    'CglTdG9yeUl0ZW0STAoNc3RvcnlfYXJjaGl2ZRgFIAEoCzIlLmJpbGliaWxpLmFwcC5keW5hbW'\n    'ljLnYyLlN0b3J5QXJjaGl2ZUgAUgxzdG9yeUFyY2hpdmUSOQoGYXV0aG9yGAEgASgLMiEuYmls'\n    'aWJpbGkuYXBwLmR5bmFtaWMudjIuVXNlckluZm9SBmF1dGhvchISCgRkZXNjGAIgASgJUgRkZX'\n    'NjEhYKBnN0YXR1cxgDIAEoA1IGc3RhdHVzEjUKBHR5cGUYBCABKA4yIS5iaWxpYmlsaS5hcHAu'\n    'ZHluYW1pYy52Mi5SY21kVHlwZVIEdHlwZUILCglyY21kX2l0ZW0=');\n\n@$core.Deprecated('Use subscribeButtonDescriptor instead')\nconst SubscribeButton$json = {\n  '1': 'SubscribeButton',\n  '2': [\n    {\n      '1': 'subscription_identifier',\n      '3': 1,\n      '4': 1,\n      '5': 9,\n      '10': 'subscriptionIdentifier'\n    },\n    {'1': 'is_subscribed', '3': 2, '4': 1, '5': 8, '10': 'isSubscribed'},\n    {\n      '1': 'subscribed_style',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ButtonWithSubscribeParam',\n      '10': 'subscribedStyle'\n    },\n    {\n      '1': 'not_subscribed_style',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ButtonWithSubscribeParam',\n      '10': 'notSubscribedStyle'\n    },\n  ],\n};\n\n/// Descriptor for `SubscribeButton`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List subscribeButtonDescriptor = $convert.base64Decode(\n    'Cg9TdWJzY3JpYmVCdXR0b24SNwoXc3Vic2NyaXB0aW9uX2lkZW50aWZpZXIYASABKAlSFnN1Yn'\n    'NjcmlwdGlvbklkZW50aWZpZXISIwoNaXNfc3Vic2NyaWJlZBgCIAEoCFIMaXNTdWJzY3JpYmVk'\n    'ElwKEHN1YnNjcmliZWRfc3R5bGUYAyABKAsyMS5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5CdX'\n    'R0b25XaXRoU3Vic2NyaWJlUGFyYW1SD3N1YnNjcmliZWRTdHlsZRJjChRub3Rfc3Vic2NyaWJl'\n    'ZF9zdHlsZRgEIAEoCzIxLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkJ1dHRvbldpdGhTdWJzY3'\n    'JpYmVQYXJhbVISbm90U3Vic2NyaWJlZFN0eWxl');\n\n@$core.Deprecated('Use subscribeCampusReqDescriptor instead')\nconst SubscribeCampusReq$json = {\n  '1': 'SubscribeCampusReq',\n  '2': [\n    {'1': 'campus_id', '3': 1, '4': 1, '5': 3, '10': 'campusId'},\n    {'1': 'campus_name', '3': 2, '4': 1, '5': 9, '10': 'campusName'},\n    {\n      '1': 'from_type',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CampusReqFromType',\n      '10': 'fromType'\n    },\n  ],\n};\n\n/// Descriptor for `SubscribeCampusReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List subscribeCampusReqDescriptor = $convert.base64Decode(\n    'ChJTdWJzY3JpYmVDYW1wdXNSZXESGwoJY2FtcHVzX2lkGAEgASgDUghjYW1wdXNJZBIfCgtjYW'\n    '1wdXNfbmFtZRgCIAEoCVIKY2FtcHVzTmFtZRJHCglmcm9tX3R5cGUYAyABKA4yKi5iaWxpYmls'\n    'aS5hcHAuZHluYW1pYy52Mi5DYW1wdXNSZXFGcm9tVHlwZVIIZnJvbVR5cGU=');\n\n@$core.Deprecated('Use subscriptionClickReqDescriptor instead')\nconst SubscriptionClickReq$json = {\n  '1': 'SubscriptionClickReq',\n  '2': [\n    {'1': 'subscribe_param', '3': 1, '4': 1, '5': 9, '10': 'subscribeParam'},\n  ],\n};\n\n/// Descriptor for `SubscriptionClickReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List subscriptionClickReqDescriptor = $convert.base64Decode(\n    'ChRTdWJzY3JpcHRpb25DbGlja1JlcRInCg9zdWJzY3JpYmVfcGFyYW0YASABKAlSDnN1YnNjcm'\n    'liZVBhcmFt');\n\n@$core.Deprecated('Use subscriptionClickRespDescriptor instead')\nconst SubscriptionClickResp$json = {\n  '1': 'SubscriptionClickResp',\n  '2': [\n    {'1': 'toast', '3': 1, '4': 1, '5': 9, '10': 'toast'},\n  ],\n};\n\n/// Descriptor for `SubscriptionClickResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List subscriptionClickRespDescriptor =\n    $convert.base64Decode(\n        'ChVTdWJzY3JpcHRpb25DbGlja1Jlc3ASFAoFdG9hc3QYASABKAlSBXRvYXN0');\n\n@$core.Deprecated('Use textNodeDescriptor instead')\nconst TextNode$json = {\n  '1': 'TextNode',\n  '2': [\n    {\n      '1': 'word',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.WordNode',\n      '9': 0,\n      '10': 'word'\n    },\n    {\n      '1': 'emote',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.EmoteNode',\n      '9': 0,\n      '10': 'emote'\n    },\n    {\n      '1': 'link',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.LinkNode',\n      '9': 0,\n      '10': 'link'\n    },\n    {\n      '1': 'formula',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.FormulaNode',\n      '9': 0,\n      '10': 'formula'\n    },\n    {\n      '1': 'node_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.TextNode.TextNodeType',\n      '10': 'nodeType'\n    },\n    {'1': 'raw_text', '3': 2, '4': 1, '5': 9, '10': 'rawText'},\n  ],\n  '4': [TextNode_TextNodeType$json],\n  '8': [\n    {'1': 'text'},\n  ],\n};\n\n@$core.Deprecated('Use textNodeDescriptor instead')\nconst TextNode_TextNodeType$json = {\n  '1': 'TextNodeType',\n  '2': [\n    {'1': 'INVALID_TextNodeType', '2': 0},\n    {'1': 'WORDS', '2': 1},\n    {'1': 'EMOTE', '2': 2},\n    {'1': 'AT_TextNodeType', '2': 3},\n    {'1': 'BIZ_LINK', '2': 4},\n    {'1': 'FORMULA', '2': 5},\n  ],\n};\n\n/// Descriptor for `TextNode`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List textNodeDescriptor = $convert.base64Decode(\n    'CghUZXh0Tm9kZRI3CgR3b3JkGAMgASgLMiEuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuV29yZE'\n    '5vZGVIAFIEd29yZBI6CgVlbW90ZRgEIAEoCzIiLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkVt'\n    'b3RlTm9kZUgAUgVlbW90ZRI3CgRsaW5rGAUgASgLMiEuYmlsaWJpbGkuYXBwLmR5bmFtaWMudj'\n    'IuTGlua05vZGVIAFIEbGluaxJACgdmb3JtdWxhGAYgASgLMiQuYmlsaWJpbGkuYXBwLmR5bmFt'\n    'aWMudjIuRm9ybXVsYU5vZGVIAFIHZm9ybXVsYRJLCglub2RlX3R5cGUYASABKA4yLi5iaWxpYm'\n    'lsaS5hcHAuZHluYW1pYy52Mi5UZXh0Tm9kZS5UZXh0Tm9kZVR5cGVSCG5vZGVUeXBlEhkKCHJh'\n    'd190ZXh0GAIgASgJUgdyYXdUZXh0Im4KDFRleHROb2RlVHlwZRIYChRJTlZBTElEX1RleHROb2'\n    'RlVHlwZRAAEgkKBVdPUkRTEAESCQoFRU1PVEUQAhITCg9BVF9UZXh0Tm9kZVR5cGUQAxIMCghC'\n    'SVpfTElOSxAEEgsKB0ZPUk1VTEEQBUIGCgR0ZXh0');\n\n@$core.Deprecated('Use textParagraphDescriptor instead')\nconst TextParagraph$json = {\n  '1': 'TextParagraph',\n  '2': [\n    {\n      '1': 'nodes',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.TextNode',\n      '10': 'nodes'\n    },\n  ],\n};\n\n/// Descriptor for `TextParagraph`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List textParagraphDescriptor = $convert.base64Decode(\n    'Cg1UZXh0UGFyYWdyYXBoEjcKBW5vZGVzGAEgAygLMiEuYmlsaWJpbGkuYXBwLmR5bmFtaWMudj'\n    'IuVGV4dE5vZGVSBW5vZGVz');\n\n@$core.Deprecated('Use textWithPriorityDescriptor instead')\nconst TextWithPriority$json = {\n  '1': 'TextWithPriority',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'priority', '3': 2, '4': 1, '5': 3, '10': 'priority'},\n  ],\n};\n\n/// Descriptor for `TextWithPriority`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List textWithPriorityDescriptor = $convert.base64Decode(\n    'ChBUZXh0V2l0aFByaW9yaXR5EhIKBHRleHQYASABKAlSBHRleHQSGgoIcHJpb3JpdHkYAiABKA'\n    'NSCHByaW9yaXR5');\n\n@$core.Deprecated('Use threePointAttentionDescriptor instead')\nconst ThreePointAttention$json = {\n  '1': 'ThreePointAttention',\n  '2': [\n    {'1': 'attention_icon', '3': 1, '4': 1, '5': 9, '10': 'attentionIcon'},\n    {'1': 'attention_text', '3': 2, '4': 1, '5': 9, '10': 'attentionText'},\n    {\n      '1': 'not_attention_icon',\n      '3': 3,\n      '4': 1,\n      '5': 9,\n      '10': 'notAttentionIcon'\n    },\n    {\n      '1': 'not_attention_text',\n      '3': 4,\n      '4': 1,\n      '5': 9,\n      '10': 'notAttentionText'\n    },\n    {\n      '1': 'status',\n      '3': 5,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.ThreePointAttentionStatus',\n      '10': 'status'\n    },\n    {'1': 'subscribe_oid', '3': 6, '4': 1, '5': 9, '10': 'subscribeOid'},\n  ],\n};\n\n/// Descriptor for `ThreePointAttention`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threePointAttentionDescriptor = $convert.base64Decode(\n    'ChNUaHJlZVBvaW50QXR0ZW50aW9uEiUKDmF0dGVudGlvbl9pY29uGAEgASgJUg1hdHRlbnRpb2'\n    '5JY29uEiUKDmF0dGVudGlvbl90ZXh0GAIgASgJUg1hdHRlbnRpb25UZXh0EiwKEm5vdF9hdHRl'\n    'bnRpb25faWNvbhgDIAEoCVIQbm90QXR0ZW50aW9uSWNvbhIsChJub3RfYXR0ZW50aW9uX3RleH'\n    'QYBCABKAlSEG5vdEF0dGVudGlvblRleHQSSgoGc3RhdHVzGAUgASgOMjIuYmlsaWJpbGkuYXBw'\n    'LmR5bmFtaWMudjIuVGhyZWVQb2ludEF0dGVudGlvblN0YXR1c1IGc3RhdHVzEiMKDXN1YnNjcm'\n    'liZV9vaWQYBiABKAlSDHN1YnNjcmliZU9pZA==');\n\n@$core.Deprecated('Use threePointAutoPlayDescriptor instead')\nconst ThreePointAutoPlay$json = {\n  '1': 'ThreePointAutoPlay',\n  '2': [\n    {'1': 'open_icon', '3': 1, '4': 1, '5': 9, '10': 'openIcon'},\n    {'1': 'open_text', '3': 2, '4': 1, '5': 9, '10': 'openText'},\n    {'1': 'close_icon', '3': 3, '4': 1, '5': 9, '10': 'closeIcon'},\n    {'1': 'close_text', '3': 4, '4': 1, '5': 9, '10': 'closeText'},\n    {'1': 'open_text_v2', '3': 5, '4': 1, '5': 9, '10': 'openTextV2'},\n    {'1': 'close_text_v2', '3': 6, '4': 1, '5': 9, '10': 'closeTextV2'},\n    {'1': 'only_icon', '3': 7, '4': 1, '5': 9, '10': 'onlyIcon'},\n    {'1': 'only_text', '3': 8, '4': 1, '5': 9, '10': 'onlyText'},\n    {'1': 'open_icon_v2', '3': 9, '4': 1, '5': 9, '10': 'openIconV2'},\n    {'1': 'close_icon_v2', '3': 10, '4': 1, '5': 9, '10': 'closeIconV2'},\n  ],\n};\n\n/// Descriptor for `ThreePointAutoPlay`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threePointAutoPlayDescriptor = $convert.base64Decode(\n    'ChJUaHJlZVBvaW50QXV0b1BsYXkSGwoJb3Blbl9pY29uGAEgASgJUghvcGVuSWNvbhIbCglvcG'\n    'VuX3RleHQYAiABKAlSCG9wZW5UZXh0Eh0KCmNsb3NlX2ljb24YAyABKAlSCWNsb3NlSWNvbhId'\n    'CgpjbG9zZV90ZXh0GAQgASgJUgljbG9zZVRleHQSIAoMb3Blbl90ZXh0X3YyGAUgASgJUgpvcG'\n    'VuVGV4dFYyEiIKDWNsb3NlX3RleHRfdjIYBiABKAlSC2Nsb3NlVGV4dFYyEhsKCW9ubHlfaWNv'\n    'bhgHIAEoCVIIb25seUljb24SGwoJb25seV90ZXh0GAggASgJUghvbmx5VGV4dBIgCgxvcGVuX2'\n    'ljb25fdjIYCSABKAlSCm9wZW5JY29uVjISIgoNY2xvc2VfaWNvbl92MhgKIAEoCVILY2xvc2VJ'\n    'Y29uVjI=');\n\n@$core.Deprecated('Use threePointCommentDescriptor instead')\nconst ThreePointComment$json = {\n  '1': 'ThreePointComment',\n  '2': [\n    {\n      '1': 'up_selection',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CommentDetail',\n      '10': 'upSelection'\n    },\n    {\n      '1': 'up_close',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CommentDetail',\n      '10': 'upClose'\n    },\n    {'1': 'icon', '3': 3, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'title', '3': 4, '4': 1, '5': 9, '10': 'title'},\n  ],\n};\n\n/// Descriptor for `ThreePointComment`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threePointCommentDescriptor = $convert.base64Decode(\n    'ChFUaHJlZVBvaW50Q29tbWVudBJJCgx1cF9zZWxlY3Rpb24YASABKAsyJi5iaWxpYmlsaS5hcH'\n    'AuZHluYW1pYy52Mi5Db21tZW50RGV0YWlsUgt1cFNlbGVjdGlvbhJBCgh1cF9jbG9zZRgCIAEo'\n    'CzImLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkNvbW1lbnREZXRhaWxSB3VwQ2xvc2USEgoEaW'\n    'NvbhgDIAEoCVIEaWNvbhIUCgV0aXRsZRgEIAEoCVIFdGl0bGU=');\n\n@$core.Deprecated('Use threePointDefaultDescriptor instead')\nconst ThreePointDefault$json = {\n  '1': 'ThreePointDefault',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'id', '3': 4, '4': 1, '5': 9, '10': 'id'},\n    {\n      '1': 'toast',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ThreePointDefaultToast',\n      '10': 'toast'\n    },\n  ],\n};\n\n/// Descriptor for `ThreePointDefault`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threePointDefaultDescriptor = $convert.base64Decode(\n    'ChFUaHJlZVBvaW50RGVmYXVsdBISCgRpY29uGAEgASgJUgRpY29uEhQKBXRpdGxlGAIgASgJUg'\n    'V0aXRsZRIQCgN1cmkYAyABKAlSA3VyaRIOCgJpZBgEIAEoCVICaWQSRQoFdG9hc3QYBSABKAsy'\n    'Ly5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5UaHJlZVBvaW50RGVmYXVsdFRvYXN0UgV0b2FzdA'\n    '==');\n\n@$core.Deprecated('Use threePointDefaultToastDescriptor instead')\nconst ThreePointDefaultToast$json = {\n  '1': 'ThreePointDefaultToast',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'desc', '3': 2, '4': 1, '5': 9, '10': 'desc'},\n  ],\n};\n\n/// Descriptor for `ThreePointDefaultToast`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threePointDefaultToastDescriptor =\n    $convert.base64Decode(\n        'ChZUaHJlZVBvaW50RGVmYXVsdFRvYXN0EhQKBXRpdGxlGAEgASgJUgV0aXRsZRISCgRkZXNjGA'\n        'IgASgJUgRkZXNj');\n\n@$core.Deprecated('Use threePointDislikeDescriptor instead')\nconst ThreePointDislike$json = {\n  '1': 'ThreePointDislike',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'feedback_biz_value',\n      '3': 3,\n      '4': 1,\n      '5': 9,\n      '10': 'feedbackBizValue'\n    },\n  ],\n};\n\n/// Descriptor for `ThreePointDislike`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threePointDislikeDescriptor = $convert.base64Decode(\n    'ChFUaHJlZVBvaW50RGlzbGlrZRISCgRpY29uGAEgASgJUgRpY29uEhQKBXRpdGxlGAIgASgJUg'\n    'V0aXRsZRIsChJmZWVkYmFja19iaXpfdmFsdWUYAyABKAlSEGZlZWRiYWNrQml6VmFsdWU=');\n\n@$core.Deprecated('Use threePointDynCoinDescriptor instead')\nconst ThreePointDynCoin$json = {\n  '1': 'ThreePointDynCoin',\n  '2': [\n    {'1': 'had_coin', '3': 1, '4': 1, '5': 8, '10': 'hadCoin'},\n    {'1': 'coin_num', '3': 2, '4': 1, '5': 3, '10': 'coinNum'},\n    {'1': 'coin_business', '3': 3, '4': 1, '5': 9, '10': 'coinBusiness'},\n    {'1': 'oid', '3': 4, '4': 1, '5': 3, '10': 'oid'},\n  ],\n};\n\n/// Descriptor for `ThreePointDynCoin`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threePointDynCoinDescriptor = $convert.base64Decode(\n    'ChFUaHJlZVBvaW50RHluQ29pbhIZCghoYWRfY29pbhgBIAEoCFIHaGFkQ29pbhIZCghjb2luX2'\n    '51bRgCIAEoA1IHY29pbk51bRIjCg1jb2luX2J1c2luZXNzGAMgASgJUgxjb2luQnVzaW5lc3MS'\n    'EAoDb2lkGAQgASgDUgNvaWQ=');\n\n@$core.Deprecated('Use threePointDynEditDescriptor instead')\nconst ThreePointDynEdit$json = {\n  '1': 'ThreePointDynEdit',\n  '2': [\n    {'1': 'dyn_id', '3': 1, '4': 1, '5': 3, '10': 'dynId'},\n    {'1': 'origin_id', '3': 2, '4': 1, '5': 3, '10': 'originId'},\n    {'1': 'is_origin_deleted', '3': 3, '4': 1, '5': 8, '10': 'isOriginDeleted'},\n    {'1': 'url', '3': 4, '4': 1, '5': 9, '10': 'url'},\n  ],\n};\n\n/// Descriptor for `ThreePointDynEdit`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threePointDynEditDescriptor = $convert.base64Decode(\n    'ChFUaHJlZVBvaW50RHluRWRpdBIVCgZkeW5faWQYASABKANSBWR5bklkEhsKCW9yaWdpbl9pZB'\n    'gCIAEoA1IIb3JpZ2luSWQSKgoRaXNfb3JpZ2luX2RlbGV0ZWQYAyABKAhSD2lzT3JpZ2luRGVs'\n    'ZXRlZBIQCgN1cmwYBCABKAlSA3VybA==');\n\n@$core.Deprecated('Use threePointFavoriteDescriptor instead')\nconst ThreePointFavorite$json = {\n  '1': 'ThreePointFavorite',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'id', '3': 3, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'is_favourite', '3': 4, '4': 1, '5': 8, '10': 'isFavourite'},\n    {'1': 'cancel_icon', '3': 5, '4': 1, '5': 9, '10': 'cancelIcon'},\n    {'1': 'cancel_title', '3': 6, '4': 1, '5': 9, '10': 'cancelTitle'},\n  ],\n};\n\n/// Descriptor for `ThreePointFavorite`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threePointFavoriteDescriptor = $convert.base64Decode(\n    'ChJUaHJlZVBvaW50RmF2b3JpdGUSEgoEaWNvbhgBIAEoCVIEaWNvbhIUCgV0aXRsZRgCIAEoCV'\n    'IFdGl0bGUSDgoCaWQYAyABKANSAmlkEiEKDGlzX2Zhdm91cml0ZRgEIAEoCFILaXNGYXZvdXJp'\n    'dGUSHwoLY2FuY2VsX2ljb24YBSABKAlSCmNhbmNlbEljb24SIQoMY2FuY2VsX3RpdGxlGAYgAS'\n    'gJUgtjYW5jZWxUaXRsZQ==');\n\n@$core.Deprecated('Use threePointHideDescriptor instead')\nconst ThreePointHide$json = {\n  '1': 'ThreePointHide',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'interactive',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ThreePointHideInteractive',\n      '10': 'interactive'\n    },\n    {'1': 'blook_fid', '3': 4, '4': 1, '5': 3, '10': 'blookFid'},\n    {'1': 'blook_type', '3': 5, '4': 1, '5': 9, '10': 'blookType'},\n  ],\n};\n\n/// Descriptor for `ThreePointHide`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threePointHideDescriptor = $convert.base64Decode(\n    'Cg5UaHJlZVBvaW50SGlkZRISCgRpY29uGAEgASgJUgRpY29uEhQKBXRpdGxlGAIgASgJUgV0aX'\n    'RsZRJUCgtpbnRlcmFjdGl2ZRgDIAEoCzIyLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlRocmVl'\n    'UG9pbnRIaWRlSW50ZXJhY3RpdmVSC2ludGVyYWN0aXZlEhsKCWJsb29rX2ZpZBgEIAEoA1IIYm'\n    'xvb2tGaWQSHQoKYmxvb2tfdHlwZRgFIAEoCVIJYmxvb2tUeXBl');\n\n@$core.Deprecated('Use threePointHideInteractiveDescriptor instead')\nconst ThreePointHideInteractive$json = {\n  '1': 'ThreePointHideInteractive',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'confirm', '3': 2, '4': 1, '5': 9, '10': 'confirm'},\n    {'1': 'cancel', '3': 3, '4': 1, '5': 9, '10': 'cancel'},\n    {'1': 'toast', '3': 4, '4': 1, '5': 9, '10': 'toast'},\n  ],\n};\n\n/// Descriptor for `ThreePointHideInteractive`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threePointHideInteractiveDescriptor = $convert.base64Decode(\n    'ChlUaHJlZVBvaW50SGlkZUludGVyYWN0aXZlEhQKBXRpdGxlGAEgASgJUgV0aXRsZRIYCgdjb2'\n    '5maXJtGAIgASgJUgdjb25maXJtEhYKBmNhbmNlbBgDIAEoCVIGY2FuY2VsEhQKBXRvYXN0GAQg'\n    'ASgJUgV0b2FzdA==');\n\n@$core.Deprecated('Use threePointItemDescriptor instead')\nconst ThreePointItem$json = {\n  '1': 'ThreePointItem',\n  '2': [\n    {\n      '1': 'default',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ThreePointDefault',\n      '9': 0,\n      '10': 'default'\n    },\n    {\n      '1': 'auto_player',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ThreePointAutoPlay',\n      '9': 0,\n      '10': 'autoPlayer'\n    },\n    {\n      '1': 'share',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ThreePointShare',\n      '9': 0,\n      '10': 'share'\n    },\n    {\n      '1': 'attention',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ThreePointAttention',\n      '9': 0,\n      '10': 'attention'\n    },\n    {\n      '1': 'wait',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ThreePointWait',\n      '9': 0,\n      '10': 'wait'\n    },\n    {\n      '1': 'dislike',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ThreePointDislike',\n      '9': 0,\n      '10': 'dislike'\n    },\n    {\n      '1': 'favorite',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ThreePointFavorite',\n      '9': 0,\n      '10': 'favorite'\n    },\n    {\n      '1': 'top',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ThreePointTop',\n      '9': 0,\n      '10': 'top'\n    },\n    {\n      '1': 'comment',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ThreePointComment',\n      '9': 0,\n      '10': 'comment'\n    },\n    {\n      '1': 'hide',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ThreePointHide',\n      '9': 0,\n      '10': 'hide'\n    },\n    {\n      '1': 'topic_irrelevant',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ThreePointTopicIrrelevant',\n      '9': 0,\n      '10': 'topicIrrelevant'\n    },\n    {\n      '1': 'dyn_edit',\n      '3': 13,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ThreePointDynEdit',\n      '9': 0,\n      '10': 'dynEdit'\n    },\n    {\n      '1': 'coin',\n      '3': 14,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ThreePointDynCoin',\n      '9': 0,\n      '10': 'coin'\n    },\n    {\n      '1': 'visibility_change',\n      '3': 15,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ThreePointVisibilityChange',\n      '9': 0,\n      '10': 'visibilityChange'\n    },\n    {\n      '1': 'topic_top',\n      '3': 16,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ThreePointTopicTop',\n      '9': 0,\n      '10': 'topicTop'\n    },\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.ThreePointType',\n      '10': 'type'\n    },\n  ],\n  '8': [\n    {'1': 'item'},\n  ],\n};\n\n/// Descriptor for `ThreePointItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threePointItemDescriptor = $convert.base64Decode(\n    'Cg5UaHJlZVBvaW50SXRlbRJGCgdkZWZhdWx0GAIgASgLMiouYmlsaWJpbGkuYXBwLmR5bmFtaW'\n    'MudjIuVGhyZWVQb2ludERlZmF1bHRIAFIHZGVmYXVsdBJOCgthdXRvX3BsYXllchgDIAEoCzIr'\n    'LmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlRocmVlUG9pbnRBdXRvUGxheUgAUgphdXRvUGxheW'\n    'VyEkAKBXNoYXJlGAQgASgLMiguYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuVGhyZWVQb2ludFNo'\n    'YXJlSABSBXNoYXJlEkwKCWF0dGVudGlvbhgFIAEoCzIsLmJpbGliaWxpLmFwcC5keW5hbWljLn'\n    'YyLlRocmVlUG9pbnRBdHRlbnRpb25IAFIJYXR0ZW50aW9uEj0KBHdhaXQYBiABKAsyJy5iaWxp'\n    'YmlsaS5hcHAuZHluYW1pYy52Mi5UaHJlZVBvaW50V2FpdEgAUgR3YWl0EkYKB2Rpc2xpa2UYBy'\n    'ABKAsyKi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5UaHJlZVBvaW50RGlzbGlrZUgAUgdkaXNs'\n    'aWtlEkkKCGZhdm9yaXRlGAggASgLMisuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuVGhyZWVQb2'\n    'ludEZhdm9yaXRlSABSCGZhdm9yaXRlEjoKA3RvcBgJIAEoCzImLmJpbGliaWxpLmFwcC5keW5h'\n    'bWljLnYyLlRocmVlUG9pbnRUb3BIAFIDdG9wEkYKB2NvbW1lbnQYCiABKAsyKi5iaWxpYmlsaS'\n    '5hcHAuZHluYW1pYy52Mi5UaHJlZVBvaW50Q29tbWVudEgAUgdjb21tZW50Ej0KBGhpZGUYCyAB'\n    'KAsyJy5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5UaHJlZVBvaW50SGlkZUgAUgRoaWRlEl8KEH'\n    'RvcGljX2lycmVsZXZhbnQYDCABKAsyMi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5UaHJlZVBv'\n    'aW50VG9waWNJcnJlbGV2YW50SABSD3RvcGljSXJyZWxldmFudBJHCghkeW5fZWRpdBgNIAEoCz'\n    'IqLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlRocmVlUG9pbnREeW5FZGl0SABSB2R5bkVkaXQS'\n    'QAoEY29pbhgOIAEoCzIqLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlRocmVlUG9pbnREeW5Db2'\n    'luSABSBGNvaW4SYgoRdmlzaWJpbGl0eV9jaGFuZ2UYDyABKAsyMy5iaWxpYmlsaS5hcHAuZHlu'\n    'YW1pYy52Mi5UaHJlZVBvaW50VmlzaWJpbGl0eUNoYW5nZUgAUhB2aXNpYmlsaXR5Q2hhbmdlEk'\n    'oKCXRvcGljX3RvcBgQIAEoCzIrLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlRocmVlUG9pbnRU'\n    'b3BpY1RvcEgAUgh0b3BpY1RvcBI7CgR0eXBlGAEgASgOMicuYmlsaWJpbGkuYXBwLmR5bmFtaW'\n    'MudjIuVGhyZWVQb2ludFR5cGVSBHR5cGVCBgoEaXRlbQ==');\n\n@$core.Deprecated('Use threePointShareDescriptor instead')\nconst ThreePointShare$json = {\n  '1': 'ThreePointShare',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'channel',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ThreePointShareChannel',\n      '10': 'channel'\n    },\n    {'1': 'channel_name', '3': 4, '4': 1, '5': 9, '10': 'channelName'},\n    {\n      '1': 'reserve',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ShareReserve',\n      '10': 'reserve'\n    },\n  ],\n};\n\n/// Descriptor for `ThreePointShare`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threePointShareDescriptor = $convert.base64Decode(\n    'Cg9UaHJlZVBvaW50U2hhcmUSEgoEaWNvbhgBIAEoCVIEaWNvbhIUCgV0aXRsZRgCIAEoCVIFdG'\n    'l0bGUSSQoHY2hhbm5lbBgDIAMoCzIvLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlRocmVlUG9p'\n    'bnRTaGFyZUNoYW5uZWxSB2NoYW5uZWwSIQoMY2hhbm5lbF9uYW1lGAQgASgJUgtjaGFubmVsTm'\n    'FtZRI/CgdyZXNlcnZlGAUgASgLMiUuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuU2hhcmVSZXNl'\n    'cnZlUgdyZXNlcnZl');\n\n@$core.Deprecated('Use threePointShareChannelDescriptor instead')\nconst ThreePointShareChannel$json = {\n  '1': 'ThreePointShareChannel',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n  ],\n};\n\n/// Descriptor for `ThreePointShareChannel`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threePointShareChannelDescriptor =\n    $convert.base64Decode(\n        'ChZUaHJlZVBvaW50U2hhcmVDaGFubmVsEhIKBGljb24YASABKAlSBGljb24SFAoFdGl0bGUYAi'\n        'ABKAlSBXRpdGxl');\n\n@$core.Deprecated('Use threePointTopDescriptor instead')\nconst ThreePointTop$json = {\n  '1': 'ThreePointTop',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'type',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.TopType',\n      '10': 'type'\n    },\n  ],\n};\n\n/// Descriptor for `ThreePointTop`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threePointTopDescriptor = $convert.base64Decode(\n    'Cg1UaHJlZVBvaW50VG9wEhIKBGljb24YASABKAlSBGljb24SFAoFdGl0bGUYAiABKAlSBXRpdG'\n    'xlEjQKBHR5cGUYAyABKA4yIC5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5Ub3BUeXBlUgR0eXBl');\n\n@$core.Deprecated('Use threePointTopicIrrelevantDescriptor instead')\nconst ThreePointTopicIrrelevant$json = {\n  '1': 'ThreePointTopicIrrelevant',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'toast', '3': 3, '4': 1, '5': 9, '10': 'toast'},\n    {'1': 'topic_id', '3': 4, '4': 1, '5': 3, '10': 'topicId'},\n    {'1': 'res_id', '3': 5, '4': 1, '5': 3, '10': 'resId'},\n    {'1': 'res_type', '3': 6, '4': 1, '5': 3, '10': 'resType'},\n    {'1': 'reason', '3': 7, '4': 1, '5': 9, '10': 'reason'},\n  ],\n};\n\n/// Descriptor for `ThreePointTopicIrrelevant`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threePointTopicIrrelevantDescriptor = $convert.base64Decode(\n    'ChlUaHJlZVBvaW50VG9waWNJcnJlbGV2YW50EhIKBGljb24YASABKAlSBGljb24SFAoFdGl0bG'\n    'UYAiABKAlSBXRpdGxlEhQKBXRvYXN0GAMgASgJUgV0b2FzdBIZCgh0b3BpY19pZBgEIAEoA1IH'\n    'dG9waWNJZBIVCgZyZXNfaWQYBSABKANSBXJlc0lkEhkKCHJlc190eXBlGAYgASgDUgdyZXNUeX'\n    'BlEhYKBnJlYXNvbhgHIAEoCVIGcmVhc29u');\n\n@$core.Deprecated('Use threePointTopicTopDescriptor instead')\nconst ThreePointTopicTop$json = {\n  '1': 'ThreePointTopicTop',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'type',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.TopType',\n      '10': 'type'\n    },\n    {'1': 'topic_id', '3': 4, '4': 1, '5': 3, '10': 'topicId'},\n  ],\n};\n\n/// Descriptor for `ThreePointTopicTop`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threePointTopicTopDescriptor = $convert.base64Decode(\n    'ChJUaHJlZVBvaW50VG9waWNUb3ASEgoEaWNvbhgBIAEoCVIEaWNvbhIUCgV0aXRsZRgCIAEoCV'\n    'IFdGl0bGUSNAoEdHlwZRgDIAEoDjIgLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlRvcFR5cGVS'\n    'BHR5cGUSGQoIdG9waWNfaWQYBCABKANSB3RvcGljSWQ=');\n\n@$core.Deprecated('Use threePointVisibilityChangeDescriptor instead')\nconst ThreePointVisibilityChange$json = {\n  '1': 'ThreePointVisibilityChange',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'item_list',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.ThreePointVisibilityChangeItem',\n      '10': 'itemList'\n    },\n    {'1': 'obj_id', '3': 4, '4': 1, '5': 9, '10': 'objId'},\n  ],\n};\n\n/// Descriptor for `ThreePointVisibilityChange`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threePointVisibilityChangeDescriptor = $convert.base64Decode(\n    'ChpUaHJlZVBvaW50VmlzaWJpbGl0eUNoYW5nZRISCgRpY29uGAEgASgJUgRpY29uEhQKBXRpdG'\n    'xlGAIgASgJUgV0aXRsZRJUCglpdGVtX2xpc3QYAyADKAsyNy5iaWxpYmlsaS5hcHAuZHluYW1p'\n    'Yy52Mi5UaHJlZVBvaW50VmlzaWJpbGl0eUNoYW5nZUl0ZW1SCGl0ZW1MaXN0EhUKBm9ial9pZB'\n    'gEIAEoCVIFb2JqSWQ=');\n\n@$core.Deprecated('Use threePointVisibilityChangeItemDescriptor instead')\nconst ThreePointVisibilityChangeItem$json = {\n  '1': 'ThreePointVisibilityChangeItem',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'sub_title', '3': 3, '4': 1, '5': 9, '10': 'subTitle'},\n    {'1': 'is_selected', '3': 4, '4': 1, '5': 8, '10': 'isSelected'},\n    {\n      '1': 'visibility_change_action_unselected',\n      '3': 5,\n      '4': 1,\n      '5': 9,\n      '10': 'visibilityChangeActionUnselected'\n    },\n  ],\n};\n\n/// Descriptor for `ThreePointVisibilityChangeItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threePointVisibilityChangeItemDescriptor =\n    $convert.base64Decode(\n        'Ch5UaHJlZVBvaW50VmlzaWJpbGl0eUNoYW5nZUl0ZW0SEgoEaWNvbhgBIAEoCVIEaWNvbhIUCg'\n        'V0aXRsZRgCIAEoCVIFdGl0bGUSGwoJc3ViX3RpdGxlGAMgASgJUghzdWJUaXRsZRIfCgtpc19z'\n        'ZWxlY3RlZBgEIAEoCFIKaXNTZWxlY3RlZBJNCiN2aXNpYmlsaXR5X2NoYW5nZV9hY3Rpb25fdW'\n        '5zZWxlY3RlZBgFIAEoCVIgdmlzaWJpbGl0eUNoYW5nZUFjdGlvblVuc2VsZWN0ZWQ=');\n\n@$core.Deprecated('Use threePointWaitDescriptor instead')\nconst ThreePointWait$json = {\n  '1': 'ThreePointWait',\n  '2': [\n    {'1': 'addition_icon', '3': 1, '4': 1, '5': 9, '10': 'additionIcon'},\n    {'1': 'addition_text', '3': 2, '4': 1, '5': 9, '10': 'additionText'},\n    {'1': 'no_addition_icon', '3': 3, '4': 1, '5': 9, '10': 'noAdditionIcon'},\n    {'1': 'no_addition_text', '3': 4, '4': 1, '5': 9, '10': 'noAdditionText'},\n    {'1': 'id', '3': 5, '4': 1, '5': 3, '10': 'id'},\n  ],\n};\n\n/// Descriptor for `ThreePointWait`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threePointWaitDescriptor = $convert.base64Decode(\n    'Cg5UaHJlZVBvaW50V2FpdBIjCg1hZGRpdGlvbl9pY29uGAEgASgJUgxhZGRpdGlvbkljb24SIw'\n    'oNYWRkaXRpb25fdGV4dBgCIAEoCVIMYWRkaXRpb25UZXh0EigKEG5vX2FkZGl0aW9uX2ljb24Y'\n    'AyABKAlSDm5vQWRkaXRpb25JY29uEigKEG5vX2FkZGl0aW9uX3RleHQYBCABKAlSDm5vQWRkaX'\n    'Rpb25UZXh0Eg4KAmlkGAUgASgDUgJpZA==');\n\n@$core.Deprecated('Use topAdditionUPDescriptor instead')\nconst TopAdditionUP$json = {\n  '1': 'TopAdditionUP',\n  '2': [\n    {\n      '1': 'up',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionUP',\n      '10': 'up'\n    },\n    {'1': 'has_fold', '3': 2, '4': 1, '5': 5, '10': 'hasFold'},\n  ],\n};\n\n/// Descriptor for `TopAdditionUP`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List topAdditionUPDescriptor = $convert.base64Decode(\n    'Cg1Ub3BBZGRpdGlvblVQEjMKAnVwGAEgAygLMiMuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQW'\n    'RkaXRpb25VUFICdXASGQoIaGFzX2ZvbGQYAiABKAVSB2hhc0ZvbGQ=');\n\n@$core.Deprecated('Use topicButtonDescriptor instead')\nconst TopicButton$json = {\n  '1': 'TopicButton',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'jump_uri', '3': 3, '4': 1, '5': 9, '10': 'jumpUri'},\n    {'1': 'red_dot', '3': 4, '4': 1, '5': 8, '10': 'redDot'},\n  ],\n};\n\n/// Descriptor for `TopicButton`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List topicButtonDescriptor = $convert.base64Decode(\n    'CgtUb3BpY0J1dHRvbhISCgRpY29uGAEgASgJUgRpY29uEhQKBXRpdGxlGAIgASgJUgV0aXRsZR'\n    'IZCghqdW1wX3VyaRgDIAEoCVIHanVtcFVyaRIXCgdyZWRfZG90GAQgASgIUgZyZWREb3Q=');\n\n@$core.Deprecated('Use topicItemDescriptor instead')\nconst TopicItem$json = {\n  '1': 'TopicItem',\n  '2': [\n    {'1': 'topic_id', '3': 1, '4': 1, '5': 3, '10': 'topicId'},\n    {'1': 'topic_name', '3': 2, '4': 1, '5': 9, '10': 'topicName'},\n    {'1': 'url', '3': 3, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'desc', '3': 4, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'desc2', '3': 5, '4': 1, '5': 9, '10': 'desc2'},\n    {'1': 'rcmd_desc', '3': 6, '4': 1, '5': 9, '10': 'rcmdDesc'},\n    {\n      '1': 'button',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.IconButton',\n      '10': 'button'\n    },\n  ],\n};\n\n/// Descriptor for `TopicItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List topicItemDescriptor = $convert.base64Decode(\n    'CglUb3BpY0l0ZW0SGQoIdG9waWNfaWQYASABKANSB3RvcGljSWQSHQoKdG9waWNfbmFtZRgCIA'\n    'EoCVIJdG9waWNOYW1lEhAKA3VybBgDIAEoCVIDdXJsEhIKBGRlc2MYBCABKAlSBGRlc2MSFAoF'\n    'ZGVzYzIYBSABKAlSBWRlc2MyEhsKCXJjbWRfZGVzYxgGIAEoCVIIcmNtZERlc2MSOwoGYnV0dG'\n    '9uGAcgASgLMiMuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuSWNvbkJ1dHRvblIGYnV0dG9u');\n\n@$core.Deprecated('Use topicListDescriptor instead')\nconst TopicList$json = {\n  '1': 'TopicList',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'topic_list_item',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.TopicListItem',\n      '10': 'topicListItem'\n    },\n    {\n      '1': 'act_button',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.TopicButton',\n      '10': 'actButton'\n    },\n    {\n      '1': 'more_button',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.TopicButton',\n      '10': 'moreButton'\n    },\n    {'1': 'server_info', '3': 5, '4': 1, '5': 9, '10': 'serverInfo'},\n    {'1': 'sub_title', '3': 6, '4': 1, '5': 9, '10': 'subTitle'},\n    {'1': 'exp_style', '3': 7, '4': 1, '5': 5, '10': 'expStyle'},\n    {'1': 'title_icon', '3': 8, '4': 1, '5': 9, '10': 'titleIcon'},\n    {\n      '1': 'hint_message',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynamicItem',\n      '10': 'hintMessage'\n    },\n  ],\n};\n\n/// Descriptor for `TopicList`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List topicListDescriptor = $convert.base64Decode(\n    'CglUb3BpY0xpc3QSFAoFdGl0bGUYASABKAlSBXRpdGxlEk4KD3RvcGljX2xpc3RfaXRlbRgCIA'\n    'MoCzImLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlRvcGljTGlzdEl0ZW1SDXRvcGljTGlzdEl0'\n    'ZW0SQwoKYWN0X2J1dHRvbhgDIAEoCzIkLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlRvcGljQn'\n    'V0dG9uUglhY3RCdXR0b24SRQoLbW9yZV9idXR0b24YBCABKAsyJC5iaWxpYmlsaS5hcHAuZHlu'\n    'YW1pYy52Mi5Ub3BpY0J1dHRvblIKbW9yZUJ1dHRvbhIfCgtzZXJ2ZXJfaW5mbxgFIAEoCVIKc2'\n    'VydmVySW5mbxIbCglzdWJfdGl0bGUYBiABKAlSCHN1YlRpdGxlEhsKCWV4cF9zdHlsZRgHIAEo'\n    'BVIIZXhwU3R5bGUSHQoKdGl0bGVfaWNvbhgIIAEoCVIJdGl0bGVJY29uEkcKDGhpbnRfbWVzc2'\n    'FnZRgJIAEoCzIkLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkR5bmFtaWNJdGVtUgtoaW50TWVz'\n    'c2FnZQ==');\n\n@$core.Deprecated('Use topicListItemDescriptor instead')\nconst TopicListItem$json = {\n  '1': 'TopicListItem',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'icon_title', '3': 2, '4': 1, '5': 9, '10': 'iconTitle'},\n    {'1': 'topic_id', '3': 3, '4': 1, '5': 3, '10': 'topicId'},\n    {'1': 'topic_name', '3': 4, '4': 1, '5': 9, '10': 'topicName'},\n    {'1': 'url', '3': 5, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'pos', '3': 6, '4': 1, '5': 3, '10': 'pos'},\n    {'1': 'server_info', '3': 7, '4': 1, '5': 9, '10': 'serverInfo'},\n    {'1': 'head_icon_url', '3': 8, '4': 1, '5': 9, '10': 'headIconUrl'},\n    {'1': 'up_mid', '3': 9, '4': 1, '5': 3, '10': 'upMid'},\n    {'1': 'tail_icon_url', '3': 10, '4': 1, '5': 9, '10': 'tailIconUrl'},\n    {'1': 'extension', '3': 11, '4': 1, '5': 9, '10': 'extension'},\n    {'1': 'position', '3': 12, '4': 1, '5': 3, '10': 'position'},\n  ],\n};\n\n/// Descriptor for `TopicListItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List topicListItemDescriptor = $convert.base64Decode(\n    'Cg1Ub3BpY0xpc3RJdGVtEhIKBGljb24YASABKAlSBGljb24SHQoKaWNvbl90aXRsZRgCIAEoCV'\n    'IJaWNvblRpdGxlEhkKCHRvcGljX2lkGAMgASgDUgd0b3BpY0lkEh0KCnRvcGljX25hbWUYBCAB'\n    'KAlSCXRvcGljTmFtZRIQCgN1cmwYBSABKAlSA3VybBIQCgNwb3MYBiABKANSA3BvcxIfCgtzZX'\n    'J2ZXJfaW5mbxgHIAEoCVIKc2VydmVySW5mbxIiCg1oZWFkX2ljb25fdXJsGAggASgJUgtoZWFk'\n    'SWNvblVybBIVCgZ1cF9taWQYCSABKANSBXVwTWlkEiIKDXRhaWxfaWNvbl91cmwYCiABKAlSC3'\n    'RhaWxJY29uVXJsEhwKCWV4dGVuc2lvbhgLIAEoCVIJZXh0ZW5zaW9uEhoKCHBvc2l0aW9uGAwg'\n    'ASgDUghwb3NpdGlvbg==');\n\n@$core.Deprecated('Use topicListReplyDescriptor instead')\nconst TopicListReply$json = {\n  '1': 'TopicListReply',\n  '2': [\n    {\n      '1': 'items',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.TopicItem',\n      '10': 'items'\n    },\n    {'1': 'has_more', '3': 2, '4': 1, '5': 8, '10': 'hasMore'},\n    {'1': 'offset', '3': 3, '4': 1, '5': 9, '10': 'offset'},\n    {\n      '1': 'create_topic_btn',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.IconButton',\n      '10': 'createTopicBtn'\n    },\n  ],\n};\n\n/// Descriptor for `TopicListReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List topicListReplyDescriptor = $convert.base64Decode(\n    'Cg5Ub3BpY0xpc3RSZXBseRI4CgVpdGVtcxgBIAMoCzIiLmJpbGliaWxpLmFwcC5keW5hbWljLn'\n    'YyLlRvcGljSXRlbVIFaXRlbXMSGQoIaGFzX21vcmUYAiABKAhSB2hhc01vcmUSFgoGb2Zmc2V0'\n    'GAMgASgJUgZvZmZzZXQSTQoQY3JlYXRlX3RvcGljX2J0bhgEIAEoCzIjLmJpbGliaWxpLmFwcC'\n    '5keW5hbWljLnYyLkljb25CdXR0b25SDmNyZWF0ZVRvcGljQnRu');\n\n@$core.Deprecated('Use topicListReqDescriptor instead')\nconst TopicListReq$json = {\n  '1': 'TopicListReq',\n  '2': [\n    {'1': 'campus_id', '3': 1, '4': 1, '5': 3, '10': 'campusId'},\n    {'1': 'offset', '3': 2, '4': 1, '5': 9, '10': 'offset'},\n    {\n      '1': 'from_type',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CampusReqFromType',\n      '10': 'fromType'\n    },\n  ],\n};\n\n/// Descriptor for `TopicListReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List topicListReqDescriptor = $convert.base64Decode(\n    'CgxUb3BpY0xpc3RSZXESGwoJY2FtcHVzX2lkGAEgASgDUghjYW1wdXNJZBIWCgZvZmZzZXQYAi'\n    'ABKAlSBm9mZnNldBJHCglmcm9tX3R5cGUYAyABKA4yKi5iaWxpYmlsaS5hcHAuZHluYW1pYy52'\n    'Mi5DYW1wdXNSZXFGcm9tVHlwZVIIZnJvbVR5cGU=');\n\n@$core.Deprecated('Use topicMergedResourceDescriptor instead')\nconst TopicMergedResource$json = {\n  '1': 'TopicMergedResource',\n  '2': [\n    {'1': 'merge_type', '3': 1, '4': 1, '5': 5, '10': 'mergeType'},\n    {'1': 'merged_res_cnt', '3': 2, '4': 1, '5': 5, '10': 'mergedResCnt'},\n  ],\n};\n\n/// Descriptor for `TopicMergedResource`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List topicMergedResourceDescriptor = $convert.base64Decode(\n    'ChNUb3BpY01lcmdlZFJlc291cmNlEh0KCm1lcmdlX3R5cGUYASABKAVSCW1lcmdlVHlwZRIkCg'\n    '5tZXJnZWRfcmVzX2NudBgCIAEoBVIMbWVyZ2VkUmVzQ250');\n\n@$core.Deprecated('Use topicRcmdCardDescriptor instead')\nconst TopicRcmdCard$json = {\n  '1': 'TopicRcmdCard',\n  '2': [\n    {'1': 'topic_id', '3': 1, '4': 1, '5': 3, '10': 'topicId'},\n    {'1': 'topic_name', '3': 2, '4': 1, '5': 9, '10': 'topicName'},\n    {'1': 'url', '3': 3, '4': 1, '5': 9, '10': 'url'},\n    {\n      '1': 'button',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusLabel',\n      '10': 'button'\n    },\n    {'1': 'desc1', '3': 5, '4': 1, '5': 9, '10': 'desc1'},\n    {'1': 'desc2', '3': 6, '4': 1, '5': 9, '10': 'desc2'},\n    {'1': 'update_desc', '3': 7, '4': 1, '5': 9, '10': 'updateDesc'},\n  ],\n};\n\n/// Descriptor for `TopicRcmdCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List topicRcmdCardDescriptor = $convert.base64Decode(\n    'Cg1Ub3BpY1JjbWRDYXJkEhkKCHRvcGljX2lkGAEgASgDUgd0b3BpY0lkEh0KCnRvcGljX25hbW'\n    'UYAiABKAlSCXRvcGljTmFtZRIQCgN1cmwYAyABKAlSA3VybBI8CgZidXR0b24YBCABKAsyJC5i'\n    'aWxpYmlsaS5hcHAuZHluYW1pYy52Mi5DYW1wdXNMYWJlbFIGYnV0dG9uEhQKBWRlc2MxGAUgAS'\n    'gJUgVkZXNjMRIUCgVkZXNjMhgGIAEoCVIFZGVzYzISHwoLdXBkYXRlX2Rlc2MYByABKAlSCnVw'\n    'ZGF0ZURlc2M=');\n\n@$core.Deprecated('Use topicSquareInfoDescriptor instead')\nconst TopicSquareInfo$json = {\n  '1': 'TopicSquareInfo',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'button',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusLabel',\n      '10': 'button'\n    },\n    {\n      '1': 'rcmd',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.TopicRcmdCard',\n      '10': 'rcmd'\n    },\n  ],\n};\n\n/// Descriptor for `TopicSquareInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List topicSquareInfoDescriptor = $convert.base64Decode(\n    'Cg9Ub3BpY1NxdWFyZUluZm8SFAoFdGl0bGUYASABKAlSBXRpdGxlEjwKBmJ1dHRvbhgCIAEoCz'\n    'IkLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkNhbXB1c0xhYmVsUgZidXR0b24SOgoEcmNtZBgD'\n    'IAEoCzImLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlRvcGljUmNtZENhcmRSBHJjbWQ=');\n\n@$core.Deprecated('Use topicSquareReplyDescriptor instead')\nconst TopicSquareReply$json = {\n  '1': 'TopicSquareReply',\n  '2': [\n    {\n      '1': 'info',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.TopicSquareInfo',\n      '10': 'info'\n    },\n  ],\n};\n\n/// Descriptor for `TopicSquareReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List topicSquareReplyDescriptor = $convert.base64Decode(\n    'ChBUb3BpY1NxdWFyZVJlcGx5EjwKBGluZm8YASABKAsyKC5iaWxpYmlsaS5hcHAuZHluYW1pYy'\n    '52Mi5Ub3BpY1NxdWFyZUluZm9SBGluZm8=');\n\n@$core.Deprecated('Use topicSquareReqDescriptor instead')\nconst TopicSquareReq$json = {\n  '1': 'TopicSquareReq',\n  '2': [\n    {'1': 'campus_id', '3': 1, '4': 1, '5': 3, '10': 'campusId'},\n    {\n      '1': 'from_type',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CampusReqFromType',\n      '10': 'fromType'\n    },\n  ],\n};\n\n/// Descriptor for `TopicSquareReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List topicSquareReqDescriptor = $convert.base64Decode(\n    'Cg5Ub3BpY1NxdWFyZVJlcRIbCgljYW1wdXNfaWQYASABKANSCGNhbXB1c0lkEkcKCWZyb21fdH'\n    'lwZRgCIAEoDjIqLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkNhbXB1c1JlcUZyb21UeXBlUghm'\n    'cm9tVHlwZQ==');\n\n@$core.Deprecated('Use unfollowDescriptor instead')\nconst Unfollow$json = {\n  '1': 'Unfollow',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'list',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.UnfollowUserItem',\n      '10': 'list'\n    },\n    {'1': 'track_id', '3': 3, '4': 1, '5': 9, '10': 'trackId'},\n  ],\n};\n\n/// Descriptor for `Unfollow`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List unfollowDescriptor = $convert.base64Decode(\n    'CghVbmZvbGxvdxIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSPQoEbGlzdBgCIAMoCzIpLmJpbGliaW'\n    'xpLmFwcC5keW5hbWljLnYyLlVuZm9sbG93VXNlckl0ZW1SBGxpc3QSGQoIdHJhY2tfaWQYAyAB'\n    'KAlSB3RyYWNrSWQ=');\n\n@$core.Deprecated('Use unfollowMatchReqDescriptor instead')\nconst UnfollowMatchReq$json = {\n  '1': 'UnfollowMatchReq',\n  '2': [\n    {'1': 'cid', '3': 1, '4': 1, '5': 3, '10': 'cid'},\n  ],\n};\n\n/// Descriptor for `UnfollowMatchReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List unfollowMatchReqDescriptor =\n    $convert.base64Decode('ChBVbmZvbGxvd01hdGNoUmVxEhAKA2NpZBgBIAEoA1IDY2lk');\n\n@$core.Deprecated('Use unfollowUserItemDescriptor instead')\nconst UnfollowUserItem$json = {\n  '1': 'UnfollowUserItem',\n  '2': [\n    {'1': 'has_update', '3': 1, '4': 1, '5': 8, '10': 'hasUpdate'},\n    {'1': 'face', '3': 2, '4': 1, '5': 9, '10': 'face'},\n    {'1': 'name', '3': 3, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'uid', '3': 4, '4': 1, '5': 3, '10': 'uid'},\n    {'1': 'pos', '3': 5, '4': 1, '5': 5, '10': 'pos'},\n    {\n      '1': 'live_state',\n      '3': 6,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.LiveState',\n      '10': 'liveState'\n    },\n    {\n      '1': 'official',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OfficialVerify',\n      '10': 'official'\n    },\n    {\n      '1': 'vip',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.VipInfo',\n      '10': 'vip'\n    },\n    {'1': 'sign', '3': 9, '4': 1, '5': 9, '10': 'sign'},\n    {'1': 'label', '3': 10, '4': 1, '5': 9, '10': 'label'},\n    {\n      '1': 'button',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.AdditionalButton',\n      '10': 'button'\n    },\n    {'1': 'uri', '3': 12, '4': 1, '5': 9, '10': 'uri'},\n  ],\n};\n\n/// Descriptor for `UnfollowUserItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List unfollowUserItemDescriptor = $convert.base64Decode(\n    'ChBVbmZvbGxvd1VzZXJJdGVtEh0KCmhhc191cGRhdGUYASABKAhSCWhhc1VwZGF0ZRISCgRmYW'\n    'NlGAIgASgJUgRmYWNlEhIKBG5hbWUYAyABKAlSBG5hbWUSEAoDdWlkGAQgASgDUgN1aWQSEAoD'\n    'cG9zGAUgASgFUgNwb3MSQQoKbGl2ZV9zdGF0ZRgGIAEoDjIiLmJpbGliaWxpLmFwcC5keW5hbW'\n    'ljLnYyLkxpdmVTdGF0ZVIJbGl2ZVN0YXRlEkMKCG9mZmljaWFsGAcgASgLMicuYmlsaWJpbGku'\n    'YXBwLmR5bmFtaWMudjIuT2ZmaWNpYWxWZXJpZnlSCG9mZmljaWFsEjIKA3ZpcBgIIAEoCzIgLm'\n    'JpbGliaWxpLmFwcC5keW5hbWljLnYyLlZpcEluZm9SA3ZpcBISCgRzaWduGAkgASgJUgRzaWdu'\n    'EhQKBWxhYmVsGAogASgJUgVsYWJlbBJBCgZidXR0b24YCyABKAsyKS5iaWxpYmlsaS5hcHAuZH'\n    'luYW1pYy52Mi5BZGRpdGlvbmFsQnV0dG9uUgZidXR0b24SEAoDdXJpGAwgASgJUgN1cmk=');\n\n@$core.Deprecated('Use upListItemDescriptor instead')\nconst UpListItem$json = {\n  '1': 'UpListItem',\n  '2': [\n    {'1': 'has_update', '3': 1, '4': 1, '5': 8, '10': 'hasUpdate'},\n    {'1': 'face', '3': 2, '4': 1, '5': 9, '10': 'face'},\n    {'1': 'name', '3': 3, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'uid', '3': 4, '4': 1, '5': 3, '10': 'uid'},\n    {'1': 'pos', '3': 5, '4': 1, '5': 3, '10': 'pos'},\n    {\n      '1': 'user_item_type',\n      '3': 6,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.UserItemType',\n      '10': 'userItemType'\n    },\n    {\n      '1': 'display_style_day',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.UserItemStyle',\n      '10': 'displayStyleDay'\n    },\n    {\n      '1': 'display_style_night',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.UserItemStyle',\n      '10': 'displayStyleNight'\n    },\n    {'1': 'style_id', '3': 9, '4': 1, '5': 3, '10': 'styleId'},\n    {\n      '1': 'live_state',\n      '3': 10,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.LiveState',\n      '10': 'liveState'\n    },\n    {'1': 'separator', '3': 11, '4': 1, '5': 8, '10': 'separator'},\n    {'1': 'uri', '3': 12, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'is_recall', '3': 13, '4': 1, '5': 8, '10': 'isRecall'},\n    {\n      '1': 'update_icon',\n      '3': 14,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.IconBadge',\n      '10': 'updateIcon'\n    },\n    {'1': 'live_rcmd_reason', '3': 15, '4': 1, '5': 9, '10': 'liveRcmdReason'},\n    {'1': 'live_cover', '3': 16, '4': 1, '5': 9, '10': 'liveCover'},\n    {'1': 'personal_extra', '3': 17, '4': 1, '5': 9, '10': 'personalExtra'},\n    {'1': 'update_icon_type', '3': 18, '4': 1, '5': 9, '10': 'updateIconType'},\n    {'1': 'track_id', '3': 19, '4': 1, '5': 9, '10': 'trackId'},\n    {\n      '1': 'text_badge',\n      '3': 20,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.UpListTextBadge',\n      '10': 'textBadge'\n    },\n  ],\n};\n\n/// Descriptor for `UpListItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List upListItemDescriptor = $convert.base64Decode(\n    'CgpVcExpc3RJdGVtEh0KCmhhc191cGRhdGUYASABKAhSCWhhc1VwZGF0ZRISCgRmYWNlGAIgAS'\n    'gJUgRmYWNlEhIKBG5hbWUYAyABKAlSBG5hbWUSEAoDdWlkGAQgASgDUgN1aWQSEAoDcG9zGAUg'\n    'ASgDUgNwb3MSSwoOdXNlcl9pdGVtX3R5cGUYBiABKA4yJS5iaWxpYmlsaS5hcHAuZHluYW1pYy'\n    '52Mi5Vc2VySXRlbVR5cGVSDHVzZXJJdGVtVHlwZRJSChFkaXNwbGF5X3N0eWxlX2RheRgHIAEo'\n    'CzImLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlVzZXJJdGVtU3R5bGVSD2Rpc3BsYXlTdHlsZU'\n    'RheRJWChNkaXNwbGF5X3N0eWxlX25pZ2h0GAggASgLMiYuYmlsaWJpbGkuYXBwLmR5bmFtaWMu'\n    'djIuVXNlckl0ZW1TdHlsZVIRZGlzcGxheVN0eWxlTmlnaHQSGQoIc3R5bGVfaWQYCSABKANSB3'\n    'N0eWxlSWQSQQoKbGl2ZV9zdGF0ZRgKIAEoDjIiLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkxp'\n    'dmVTdGF0ZVIJbGl2ZVN0YXRlEhwKCXNlcGFyYXRvchgLIAEoCFIJc2VwYXJhdG9yEhAKA3VyaR'\n    'gMIAEoCVIDdXJpEhsKCWlzX3JlY2FsbBgNIAEoCFIIaXNSZWNhbGwSQwoLdXBkYXRlX2ljb24Y'\n    'DiABKAsyIi5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5JY29uQmFkZ2VSCnVwZGF0ZUljb24SKA'\n    'oQbGl2ZV9yY21kX3JlYXNvbhgPIAEoCVIObGl2ZVJjbWRSZWFzb24SHQoKbGl2ZV9jb3ZlchgQ'\n    'IAEoCVIJbGl2ZUNvdmVyEiUKDnBlcnNvbmFsX2V4dHJhGBEgASgJUg1wZXJzb25hbEV4dHJhEi'\n    'gKEHVwZGF0ZV9pY29uX3R5cGUYEiABKAlSDnVwZGF0ZUljb25UeXBlEhkKCHRyYWNrX2lkGBMg'\n    'ASgJUgd0cmFja0lkEkcKCnRleHRfYmFkZ2UYFCABKAsyKC5iaWxpYmlsaS5hcHAuZHluYW1pYy'\n    '52Mi5VcExpc3RUZXh0QmFkZ2VSCXRleHRCYWRnZQ==');\n\n@$core.Deprecated('Use upListMoreLabelDescriptor instead')\nconst UpListMoreLabel$json = {\n  '1': 'UpListMoreLabel',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n  ],\n};\n\n/// Descriptor for `UpListMoreLabel`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List upListMoreLabelDescriptor = $convert.base64Decode(\n    'Cg9VcExpc3RNb3JlTGFiZWwSFAoFdGl0bGUYASABKAlSBXRpdGxlEhAKA3VyaRgCIAEoCVIDdX'\n    'Jp');\n\n@$core.Deprecated('Use upListTextBadgeDescriptor instead')\nconst UpListTextBadge$json = {\n  '1': 'UpListTextBadge',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n  ],\n};\n\n/// Descriptor for `UpListTextBadge`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List upListTextBadgeDescriptor = $convert\n    .base64Decode('Cg9VcExpc3RUZXh0QmFkZ2USEgoEdGV4dBgBIAEoCVIEdGV4dA==');\n\n@$core.Deprecated('Use updateTabSettingReqDescriptor instead')\nconst UpdateTabSettingReq$json = {\n  '1': 'UpdateTabSettingReq',\n  '2': [\n    {\n      '1': 'status',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.HomePageTabSttingStatus',\n      '10': 'status'\n    },\n  ],\n};\n\n/// Descriptor for `UpdateTabSettingReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List updateTabSettingReqDescriptor = $convert.base64Decode(\n    'ChNVcGRhdGVUYWJTZXR0aW5nUmVxEkgKBnN0YXR1cxgBIAEoDjIwLmJpbGliaWxpLmFwcC5keW'\n    '5hbWljLnYyLkhvbWVQYWdlVGFiU3R0aW5nU3RhdHVzUgZzdGF0dXM=');\n\n@$core.Deprecated('Use userInfoDescriptor instead')\nconst UserInfo$json = {\n  '1': 'UserInfo',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'face', '3': 3, '4': 1, '5': 9, '10': 'face'},\n    {\n      '1': 'official',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OfficialVerify',\n      '10': 'official'\n    },\n    {\n      '1': 'vip',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.VipInfo',\n      '10': 'vip'\n    },\n    {\n      '1': 'live',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.LiveInfo',\n      '10': 'live'\n    },\n    {'1': 'uri', '3': 7, '4': 1, '5': 9, '10': 'uri'},\n    {\n      '1': 'pendant',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.UserPendant',\n      '10': 'pendant'\n    },\n    {\n      '1': 'nameplate',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Nameplate',\n      '10': 'nameplate'\n    },\n    {'1': 'level', '3': 10, '4': 1, '5': 5, '10': 'level'},\n    {'1': 'sign', '3': 11, '4': 1, '5': 9, '10': 'sign'},\n    {'1': 'face_nft', '3': 12, '4': 1, '5': 5, '10': 'faceNft'},\n    {'1': 'face_nft_new', '3': 13, '4': 1, '5': 5, '10': 'faceNftNew'},\n    {\n      '1': 'nft_info',\n      '3': 14,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.NFTInfo',\n      '10': 'nftInfo'\n    },\n    {'1': 'is_senior_member', '3': 15, '4': 1, '5': 5, '10': 'isSeniorMember'},\n    {\n      '1': 'avatar',\n      '3': 16,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.AvatarItem',\n      '10': 'avatar'\n    },\n    {\n      '1': 'name_render',\n      '3': 17,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.account.service.v1.NameRender',\n      '10': 'nameRender'\n    },\n  ],\n};\n\n/// Descriptor for `UserInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List userInfoDescriptor = $convert.base64Decode(\n    'CghVc2VySW5mbxIQCgNtaWQYASABKANSA21pZBISCgRuYW1lGAIgASgJUgRuYW1lEhIKBGZhY2'\n    'UYAyABKAlSBGZhY2USQwoIb2ZmaWNpYWwYBCABKAsyJy5iaWxpYmlsaS5hcHAuZHluYW1pYy52'\n    'Mi5PZmZpY2lhbFZlcmlmeVIIb2ZmaWNpYWwSMgoDdmlwGAUgASgLMiAuYmlsaWJpbGkuYXBwLm'\n    'R5bmFtaWMudjIuVmlwSW5mb1IDdmlwEjUKBGxpdmUYBiABKAsyIS5iaWxpYmlsaS5hcHAuZHlu'\n    'YW1pYy52Mi5MaXZlSW5mb1IEbGl2ZRIQCgN1cmkYByABKAlSA3VyaRI+CgdwZW5kYW50GAggAS'\n    'gLMiQuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuVXNlclBlbmRhbnRSB3BlbmRhbnQSQAoJbmFt'\n    'ZXBsYXRlGAkgASgLMiIuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuTmFtZXBsYXRlUgluYW1lcG'\n    'xhdGUSFAoFbGV2ZWwYCiABKAVSBWxldmVsEhIKBHNpZ24YCyABKAlSBHNpZ24SGQoIZmFjZV9u'\n    'ZnQYDCABKAVSB2ZhY2VOZnQSIAoMZmFjZV9uZnRfbmV3GA0gASgFUgpmYWNlTmZ0TmV3EjsKCG'\n    '5mdF9pbmZvGA4gASgLMiAuYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuTkZUSW5mb1IHbmZ0SW5m'\n    'bxIoChBpc19zZW5pb3JfbWVtYmVyGA8gASgFUg5pc1Nlbmlvck1lbWJlchJFCgZhdmF0YXIYEC'\n    'ABKAsyLS5iaWxpYmlsaS5kYWd3LmNvbXBvbmVudC5hdmF0YXIudjEuQXZhdGFySXRlbVIGYXZh'\n    'dGFyEkgKC25hbWVfcmVuZGVyGBEgASgLMicuYmlsaWJpbGkuYWNjb3VudC5zZXJ2aWNlLnYxLk'\n    '5hbWVSZW5kZXJSCm5hbWVSZW5kZXI=');\n\n@$core.Deprecated('Use userItemStyleDescriptor instead')\nconst UserItemStyle$json = {\n  '1': 'UserItemStyle',\n  '2': [\n    {'1': 'rect_text', '3': 1, '4': 1, '5': 9, '10': 'rectText'},\n    {'1': 'rect_text_color', '3': 2, '4': 1, '5': 9, '10': 'rectTextColor'},\n    {'1': 'rect_icon', '3': 3, '4': 1, '5': 9, '10': 'rectIcon'},\n    {'1': 'rect_bg_color', '3': 4, '4': 1, '5': 9, '10': 'rectBgColor'},\n    {'1': 'outer_animation', '3': 5, '4': 1, '5': 9, '10': 'outerAnimation'},\n  ],\n};\n\n/// Descriptor for `UserItemStyle`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List userItemStyleDescriptor = $convert.base64Decode(\n    'Cg1Vc2VySXRlbVN0eWxlEhsKCXJlY3RfdGV4dBgBIAEoCVIIcmVjdFRleHQSJgoPcmVjdF90ZX'\n    'h0X2NvbG9yGAIgASgJUg1yZWN0VGV4dENvbG9yEhsKCXJlY3RfaWNvbhgDIAEoCVIIcmVjdElj'\n    'b24SIgoNcmVjdF9iZ19jb2xvchgEIAEoCVILcmVjdEJnQ29sb3ISJwoPb3V0ZXJfYW5pbWF0aW'\n    '9uGAUgASgJUg5vdXRlckFuaW1hdGlvbg==');\n\n@$core.Deprecated('Use userPendantDescriptor instead')\nconst UserPendant$json = {\n  '1': 'UserPendant',\n  '2': [\n    {'1': 'pid', '3': 1, '4': 1, '5': 3, '10': 'pid'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'image', '3': 3, '4': 1, '5': 9, '10': 'image'},\n    {'1': 'expire', '3': 4, '4': 1, '5': 3, '10': 'expire'},\n  ],\n};\n\n/// Descriptor for `UserPendant`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List userPendantDescriptor = $convert.base64Decode(\n    'CgtVc2VyUGVuZGFudBIQCgNwaWQYASABKANSA3BpZBISCgRuYW1lGAIgASgJUgRuYW1lEhQKBW'\n    'ltYWdlGAMgASgJUgVpbWFnZRIWCgZleHBpcmUYBCABKANSBmV4cGlyZQ==');\n\n@$core.Deprecated('Use videoBadgeDescriptor instead')\nconst VideoBadge$json = {\n  '1': 'VideoBadge',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'text_color', '3': 2, '4': 1, '5': 9, '10': 'textColor'},\n    {'1': 'text_color_night', '3': 3, '4': 1, '5': 9, '10': 'textColorNight'},\n    {'1': 'bg_color', '3': 4, '4': 1, '5': 9, '10': 'bgColor'},\n    {'1': 'bg_color_night', '3': 5, '4': 1, '5': 9, '10': 'bgColorNight'},\n    {'1': 'border_color', '3': 6, '4': 1, '5': 9, '10': 'borderColor'},\n    {\n      '1': 'border_color_night',\n      '3': 7,\n      '4': 1,\n      '5': 9,\n      '10': 'borderColorNight'\n    },\n    {'1': 'bg_style', '3': 8, '4': 1, '5': 5, '10': 'bgStyle'},\n    {'1': 'bg_alpha', '3': 9, '4': 1, '5': 5, '10': 'bgAlpha'},\n    {'1': 'bg_alpha_night', '3': 10, '4': 1, '5': 5, '10': 'bgAlphaNight'},\n    {'1': 'head_icon', '3': 11, '4': 1, '5': 9, '10': 'headIcon'},\n    {\n      '1': 'head_icon_local',\n      '3': 12,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.IconResLocal',\n      '10': 'headIconLocal'\n    },\n  ],\n};\n\n/// Descriptor for `VideoBadge`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List videoBadgeDescriptor = $convert.base64Decode(\n    'CgpWaWRlb0JhZGdlEhIKBHRleHQYASABKAlSBHRleHQSHQoKdGV4dF9jb2xvchgCIAEoCVIJdG'\n    'V4dENvbG9yEigKEHRleHRfY29sb3JfbmlnaHQYAyABKAlSDnRleHRDb2xvck5pZ2h0EhkKCGJn'\n    'X2NvbG9yGAQgASgJUgdiZ0NvbG9yEiQKDmJnX2NvbG9yX25pZ2h0GAUgASgJUgxiZ0NvbG9yTm'\n    'lnaHQSIQoMYm9yZGVyX2NvbG9yGAYgASgJUgtib3JkZXJDb2xvchIsChJib3JkZXJfY29sb3Jf'\n    'bmlnaHQYByABKAlSEGJvcmRlckNvbG9yTmlnaHQSGQoIYmdfc3R5bGUYCCABKAVSB2JnU3R5bG'\n    'USGQoIYmdfYWxwaGEYCSABKAVSB2JnQWxwaGESJAoOYmdfYWxwaGFfbmlnaHQYCiABKAVSDGJn'\n    'QWxwaGFOaWdodBIbCgloZWFkX2ljb24YCyABKAlSCGhlYWRJY29uEk0KD2hlYWRfaWNvbl9sb2'\n    'NhbBgMIAEoDjIlLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkljb25SZXNMb2NhbFINaGVhZElj'\n    'b25Mb2NhbA==');\n\n@$core.Deprecated('Use vipInfoDescriptor instead')\nconst VipInfo$json = {\n  '1': 'VipInfo',\n  '2': [\n    {'1': 'type', '3': 1, '4': 1, '5': 5, '10': 'type'},\n    {'1': 'status', '3': 2, '4': 1, '5': 5, '10': 'status'},\n    {'1': 'due_date', '3': 3, '4': 1, '5': 3, '10': 'dueDate'},\n    {\n      '1': 'label',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.VipLabel',\n      '10': 'label'\n    },\n    {'1': 'theme_type', '3': 5, '4': 1, '5': 5, '10': 'themeType'},\n    {'1': 'avatar_subscript', '3': 6, '4': 1, '5': 5, '10': 'avatarSubscript'},\n    {'1': 'nickname_color', '3': 7, '4': 1, '5': 9, '10': 'nicknameColor'},\n  ],\n};\n\n/// Descriptor for `VipInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List vipInfoDescriptor = $convert.base64Decode(\n    'CgdWaXBJbmZvEhIKBHR5cGUYASABKAVSBHR5cGUSFgoGc3RhdHVzGAIgASgFUgZzdGF0dXMSGQ'\n    'oIZHVlX2RhdGUYAyABKANSB2R1ZURhdGUSNwoFbGFiZWwYBCABKAsyIS5iaWxpYmlsaS5hcHAu'\n    'ZHluYW1pYy52Mi5WaXBMYWJlbFIFbGFiZWwSHQoKdGhlbWVfdHlwZRgFIAEoBVIJdGhlbWVUeX'\n    'BlEikKEGF2YXRhcl9zdWJzY3JpcHQYBiABKAVSD2F2YXRhclN1YnNjcmlwdBIlCg5uaWNrbmFt'\n    'ZV9jb2xvchgHIAEoCVINbmlja25hbWVDb2xvcg==');\n\n@$core.Deprecated('Use vipLabelDescriptor instead')\nconst VipLabel$json = {\n  '1': 'VipLabel',\n  '2': [\n    {'1': 'path', '3': 1, '4': 1, '5': 9, '10': 'path'},\n    {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'label_theme', '3': 3, '4': 1, '5': 9, '10': 'labelTheme'},\n  ],\n};\n\n/// Descriptor for `VipLabel`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List vipLabelDescriptor = $convert.base64Decode(\n    'CghWaXBMYWJlbBISCgRwYXRoGAEgASgJUgRwYXRoEhIKBHRleHQYAiABKAlSBHRleHQSHwoLbG'\n    'FiZWxfdGhlbWUYAyABKAlSCmxhYmVsVGhlbWU=');\n\n@$core.Deprecated('Use wFItemDefaultDescriptor instead')\nconst WFItemDefault$json = {\n  '1': 'WFItemDefault',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 2, '4': 1, '5': 9, '10': 'cover'},\n    {\n      '1': 'bottom_left1',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CoverIconWithText',\n      '10': 'bottomLeft1'\n    },\n    {\n      '1': 'bottom_left2',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CoverIconWithText',\n      '10': 'bottomLeft2'\n    },\n    {\n      '1': 'bottom_right1',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CoverIconWithText',\n      '10': 'bottomRight1'\n    },\n    {'1': 'uri', '3': 6, '4': 1, '5': 9, '10': 'uri'},\n    {\n      '1': 'rcmd_reason',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.RcmdReason',\n      '10': 'rcmdReason'\n    },\n    {\n      '1': 'annotations',\n      '3': 8,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.WFItemDefault.AnnotationsEntry',\n      '10': 'annotations'\n    },\n  ],\n  '3': [WFItemDefault_AnnotationsEntry$json],\n};\n\n@$core.Deprecated('Use wFItemDefaultDescriptor instead')\nconst WFItemDefault_AnnotationsEntry$json = {\n  '1': 'AnnotationsEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `WFItemDefault`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List wFItemDefaultDescriptor = $convert.base64Decode(\n    'Cg1XRkl0ZW1EZWZhdWx0EhQKBXRpdGxlGAEgASgJUgV0aXRsZRIUCgVjb3ZlchgCIAEoCVIFY2'\n    '92ZXISTQoMYm90dG9tX2xlZnQxGAMgASgLMiouYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQ292'\n    'ZXJJY29uV2l0aFRleHRSC2JvdHRvbUxlZnQxEk0KDGJvdHRvbV9sZWZ0MhgEIAEoCzIqLmJpbG'\n    'liaWxpLmFwcC5keW5hbWljLnYyLkNvdmVySWNvbldpdGhUZXh0Ugtib3R0b21MZWZ0MhJPCg1i'\n    'b3R0b21fcmlnaHQxGAUgASgLMiouYmlsaWJpbGkuYXBwLmR5bmFtaWMudjIuQ292ZXJJY29uV2'\n    'l0aFRleHRSDGJvdHRvbVJpZ2h0MRIQCgN1cmkYBiABKAlSA3VyaRJECgtyY21kX3JlYXNvbhgH'\n    'IAEoCzIjLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLlJjbWRSZWFzb25SCnJjbWRSZWFzb24SWQ'\n    'oLYW5ub3RhdGlvbnMYCCADKAsyNy5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5XRkl0ZW1EZWZh'\n    'dWx0LkFubm90YXRpb25zRW50cnlSC2Fubm90YXRpb25zGj4KEEFubm90YXRpb25zRW50cnkSEA'\n    'oDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4AQ==');\n\n@$core.Deprecated('Use waterFlowRcmdReqDescriptor instead')\nconst WaterFlowRcmdReq$json = {\n  '1': 'WaterFlowRcmdReq',\n  '2': [\n    {'1': 'campus_id', '3': 1, '4': 1, '5': 3, '10': 'campusId'},\n    {\n      '1': 'page',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.pagination.FeedPagination',\n      '10': 'page'\n    },\n    {\n      '1': 'player_args',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n    {\n      '1': 'from',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.CampusRcmdReqFrom',\n      '10': 'from'\n    },\n  ],\n};\n\n/// Descriptor for `WaterFlowRcmdReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List waterFlowRcmdReqDescriptor = $convert.base64Decode(\n    'ChBXYXRlckZsb3dSY21kUmVxEhsKCWNhbXB1c19pZBgBIAEoA1IIY2FtcHVzSWQSNwoEcGFnZR'\n    'gCIAEoCzIjLmJpbGliaWxpLnBhZ2luYXRpb24uRmVlZFBhZ2luYXRpb25SBHBhZ2USTwoLcGxh'\n    'eWVyX2FyZ3MYAyABKAsyLi5iaWxpYmlsaS5hcHAuYXJjaGl2ZS5taWRkbGV3YXJlLnYxLlBsYX'\n    'llckFyZ3NSCnBsYXllckFyZ3MSPgoEZnJvbRgEIAEoDjIqLmJpbGliaWxpLmFwcC5keW5hbWlj'\n    'LnYyLkNhbXB1c1JjbWRSZXFGcm9tUgRmcm9t');\n\n@$core.Deprecated('Use waterFlowRcmdRespDescriptor instead')\nconst WaterFlowRcmdResp$json = {\n  '1': 'WaterFlowRcmdResp',\n  '2': [\n    {\n      '1': 'items',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.CampusWaterFlowItem',\n      '10': 'items'\n    },\n    {\n      '1': 'offset',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.pagination.FeedPaginationReply',\n      '10': 'offset'\n    },\n  ],\n};\n\n/// Descriptor for `WaterFlowRcmdResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List waterFlowRcmdRespDescriptor = $convert.base64Decode(\n    'ChFXYXRlckZsb3dSY21kUmVzcBJCCgVpdGVtcxgBIAMoCzIsLmJpbGliaWxpLmFwcC5keW5hbW'\n    'ljLnYyLkNhbXB1c1dhdGVyRmxvd0l0ZW1SBWl0ZW1zEkAKBm9mZnNldBgCIAEoCzIoLmJpbGli'\n    'aWxpLnBhZ2luYXRpb24uRmVlZFBhZ2luYXRpb25SZXBseVIGb2Zmc2V0');\n\n@$core.Deprecated('Use weightDescriptor instead')\nconst Weight$json = {\n  '1': 'Weight',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'items',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.WeightItem',\n      '10': 'items'\n    },\n    {'1': 'icon', '3': 3, '4': 1, '5': 9, '10': 'icon'},\n  ],\n};\n\n/// Descriptor for `Weight`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List weightDescriptor = $convert.base64Decode(\n    'CgZXZWlnaHQSFAoFdGl0bGUYASABKAlSBXRpdGxlEjkKBWl0ZW1zGAIgAygLMiMuYmlsaWJpbG'\n    'kuYXBwLmR5bmFtaWMudjIuV2VpZ2h0SXRlbVIFaXRlbXMSEgoEaWNvbhgDIAEoCVIEaWNvbg==');\n\n@$core.Deprecated('Use weightButtonDescriptor instead')\nconst WeightButton$json = {\n  '1': 'WeightButton',\n  '2': [\n    {'1': 'jump_url', '3': 1, '4': 1, '5': 9, '10': 'jumpUrl'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n  ],\n};\n\n/// Descriptor for `WeightButton`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List weightButtonDescriptor = $convert.base64Decode(\n    'CgxXZWlnaHRCdXR0b24SGQoIanVtcF91cmwYASABKAlSB2p1bXBVcmwSFAoFdGl0bGUYAiABKA'\n    'lSBXRpdGxl');\n\n@$core.Deprecated('Use weightDislikeDescriptor instead')\nconst WeightDislike$json = {\n  '1': 'WeightDislike',\n  '2': [\n    {'1': 'feed_back_type', '3': 1, '4': 1, '5': 9, '10': 'feedBackType'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'feed_back_biz_value',\n      '3': 3,\n      '4': 1,\n      '5': 9,\n      '10': 'feedBackBizValue'\n    },\n  ],\n};\n\n/// Descriptor for `WeightDislike`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List weightDislikeDescriptor = $convert.base64Decode(\n    'Cg1XZWlnaHREaXNsaWtlEiQKDmZlZWRfYmFja190eXBlGAEgASgJUgxmZWVkQmFja1R5cGUSFA'\n    'oFdGl0bGUYAiABKAlSBXRpdGxlEi0KE2ZlZWRfYmFja19iaXpfdmFsdWUYAyABKAlSEGZlZWRC'\n    'YWNrQml6VmFsdWU=');\n\n@$core.Deprecated('Use weightItemDescriptor instead')\nconst WeightItem$json = {\n  '1': 'WeightItem',\n  '2': [\n    {\n      '1': 'button',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.WeightButton',\n      '9': 0,\n      '10': 'button'\n    },\n    {\n      '1': 'dislike',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.WeightDislike',\n      '9': 0,\n      '10': 'dislike'\n    },\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.dynamic.v2.WeightType',\n      '10': 'type'\n    },\n  ],\n  '8': [\n    {'1': 'item'},\n  ],\n};\n\n/// Descriptor for `WeightItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List weightItemDescriptor = $convert.base64Decode(\n    'CgpXZWlnaHRJdGVtEj8KBmJ1dHRvbhgCIAEoCzIlLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLl'\n    'dlaWdodEJ1dHRvbkgAUgZidXR0b24SQgoHZGlzbGlrZRgDIAEoCzImLmJpbGliaWxpLmFwcC5k'\n    'eW5hbWljLnYyLldlaWdodERpc2xpa2VIAFIHZGlzbGlrZRI3CgR0eXBlGAEgASgOMiMuYmlsaW'\n    'JpbGkuYXBwLmR5bmFtaWMudjIuV2VpZ2h0VHlwZVIEdHlwZUIGCgRpdGVt');\n\n@$core.Deprecated('Use wordNodeDescriptor instead')\nconst WordNode$json = {\n  '1': 'WordNode',\n  '2': [\n    {'1': 'words', '3': 1, '4': 1, '5': 9, '10': 'words'},\n    {'1': 'font_size', '3': 2, '4': 1, '5': 1, '10': 'fontSize'},\n    {\n      '1': 'color',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Colors',\n      '10': 'color'\n    },\n    {\n      '1': 'style',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.WordNode.WordNodeStyle',\n      '10': 'style'\n    },\n    {\n      '1': 'underline_style',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.WordNode.UnderlineStyle',\n      '10': 'underlineStyle'\n    },\n    {'1': 'font_level', '3': 7, '4': 1, '5': 9, '10': 'fontLevel'},\n  ],\n  '3': [WordNode_UnderlineStyle$json, WordNode_WordNodeStyle$json],\n};\n\n@$core.Deprecated('Use wordNodeDescriptor instead')\nconst WordNode_UnderlineStyle$json = {\n  '1': 'UnderlineStyle',\n  '2': [\n    {'1': 'underline_width', '3': 1, '4': 1, '5': 1, '10': 'underlineWidth'},\n    {\n      '1': 'underline_color',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Colors',\n      '10': 'underlineColor'\n    },\n  ],\n};\n\n@$core.Deprecated('Use wordNodeDescriptor instead')\nconst WordNode_WordNodeStyle$json = {\n  '1': 'WordNodeStyle',\n  '2': [\n    {'1': 'bold', '3': 1, '4': 1, '5': 8, '10': 'bold'},\n    {'1': 'italic', '3': 2, '4': 1, '5': 8, '10': 'italic'},\n    {'1': 'strikethrough', '3': 3, '4': 1, '5': 8, '10': 'strikethrough'},\n    {'1': 'underline', '3': 4, '4': 1, '5': 8, '10': 'underline'},\n  ],\n};\n\n/// Descriptor for `WordNode`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List wordNodeDescriptor = $convert.base64Decode(\n    'CghXb3JkTm9kZRIUCgV3b3JkcxgBIAEoCVIFd29yZHMSGwoJZm9udF9zaXplGAIgASgBUghmb2'\n    '50U2l6ZRI1CgVjb2xvchgDIAEoCzIfLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkNvbG9yc1IF'\n    'Y29sb3ISRQoFc3R5bGUYBCABKAsyLy5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5Xb3JkTm9kZS'\n    '5Xb3JkTm9kZVN0eWxlUgVzdHlsZRJZCg91bmRlcmxpbmVfc3R5bGUYBSABKAsyMC5iaWxpYmls'\n    'aS5hcHAuZHluYW1pYy52Mi5Xb3JkTm9kZS5VbmRlcmxpbmVTdHlsZVIOdW5kZXJsaW5lU3R5bG'\n    'USHQoKZm9udF9sZXZlbBgHIAEoCVIJZm9udExldmVsGoMBCg5VbmRlcmxpbmVTdHlsZRInCg91'\n    'bmRlcmxpbmVfd2lkdGgYASABKAFSDnVuZGVybGluZVdpZHRoEkgKD3VuZGVybGluZV9jb2xvch'\n    'gCIAEoCzIfLmJpbGliaWxpLmFwcC5keW5hbWljLnYyLkNvbG9yc1IOdW5kZXJsaW5lQ29sb3Ia'\n    'fwoNV29yZE5vZGVTdHlsZRISCgRib2xkGAEgASgIUgRib2xkEhYKBml0YWxpYxgCIAEoCFIGaX'\n    'RhbGljEiQKDXN0cmlrZXRocm91Z2gYAyABKAhSDXN0cmlrZXRocm91Z2gSHAoJdW5kZXJsaW5l'\n    'GAQgASgIUgl1bmRlcmxpbmU=');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/im/v1.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/im/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:fixnum/fixnum.dart' as $fixnum;\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nimport '../../account/service/v1.pb.dart' as $1;\nimport '../../dagw/component/avatar/v1.pb.dart' as $0;\nimport 'v1.pbenum.dart';\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nexport 'v1.pbenum.dart';\n\nclass AirDropShareUserInfo extends $pb.GeneratedMessage {\n  factory AirDropShareUserInfo({\n    $fixnum.Int64? mid,\n    $core.String? face,\n    $core.String? url,\n    $core.String? name,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (face != null) result.face = face;\n    if (url != null) result.url = url;\n    if (name != null) result.name = name;\n    return result;\n  }\n\n  AirDropShareUserInfo._();\n\n  factory AirDropShareUserInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AirDropShareUserInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AirDropShareUserInfo',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aOS(2, _omitFieldNames ? '' : 'face')\n    ..aOS(3, _omitFieldNames ? '' : 'url')\n    ..aOS(4, _omitFieldNames ? '' : 'name')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AirDropShareUserInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AirDropShareUserInfo copyWith(void Function(AirDropShareUserInfo) updates) =>\n      super.copyWith((message) => updates(message as AirDropShareUserInfo))\n          as AirDropShareUserInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AirDropShareUserInfo create() => AirDropShareUserInfo._();\n  @$core.override\n  AirDropShareUserInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AirDropShareUserInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AirDropShareUserInfo>(create);\n  static AirDropShareUserInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get face => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set face($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFace() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFace() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get url => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set url($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUrl() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUrl() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get name => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set name($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasName() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearName() => $_clearField(4);\n}\n\nclass AirDropToImReply extends $pb.GeneratedMessage {\n  factory AirDropToImReply({\n    $core.Iterable<AirDropShareUserInfo>? userInfos,\n  }) {\n    final result = create();\n    if (userInfos != null) result.userInfos.addAll(userInfos);\n    return result;\n  }\n\n  AirDropToImReply._();\n\n  factory AirDropToImReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AirDropToImReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AirDropToImReply',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..pPM<AirDropShareUserInfo>(1, _omitFieldNames ? '' : 'userInfos',\n        subBuilder: AirDropShareUserInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AirDropToImReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AirDropToImReply copyWith(void Function(AirDropToImReply) updates) =>\n      super.copyWith((message) => updates(message as AirDropToImReply))\n          as AirDropToImReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AirDropToImReply create() => AirDropToImReply._();\n  @$core.override\n  AirDropToImReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AirDropToImReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AirDropToImReply>(create);\n  static AirDropToImReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<AirDropShareUserInfo> get userInfos => $_getList(0);\n}\n\nclass AirDropToImReq extends $pb.GeneratedMessage {\n  factory AirDropToImReq({\n    AirDropFrom? adf,\n  }) {\n    final result = create();\n    if (adf != null) result.adf = adf;\n    return result;\n  }\n\n  AirDropToImReq._();\n\n  factory AirDropToImReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AirDropToImReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AirDropToImReq',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aE<AirDropFrom>(1, _omitFieldNames ? '' : 'adf',\n        enumValues: AirDropFrom.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AirDropToImReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AirDropToImReq copyWith(void Function(AirDropToImReq) updates) =>\n      super.copyWith((message) => updates(message as AirDropToImReq))\n          as AirDropToImReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AirDropToImReq create() => AirDropToImReq._();\n  @$core.override\n  AirDropToImReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AirDropToImReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AirDropToImReq>(create);\n  static AirDropToImReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  AirDropFrom get adf => $_getN(0);\n  @$pb.TagNumber(1)\n  set adf(AirDropFrom value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAdf() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAdf() => $_clearField(1);\n}\n\nclass AutoReplyToast extends $pb.GeneratedMessage {\n  factory AutoReplyToast({\n    $core.String? title,\n    $core.String? url,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (url != null) result.url = url;\n    return result;\n  }\n\n  AutoReplyToast._();\n\n  factory AutoReplyToast.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AutoReplyToast.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AutoReplyToast',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'url')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AutoReplyToast clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AutoReplyToast copyWith(void Function(AutoReplyToast) updates) =>\n      super.copyWith((message) => updates(message as AutoReplyToast))\n          as AutoReplyToast;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AutoReplyToast create() => AutoReplyToast._();\n  @$core.override\n  AutoReplyToast createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AutoReplyToast getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AutoReplyToast>(create);\n  static AutoReplyToast? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get url => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set url($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUrl() => $_clearField(2);\n}\n\nclass BehaviorAlertToast extends $pb.GeneratedMessage {\n  factory BehaviorAlertToast({\n    $core.String? title,\n    $core.String? content,\n    $core.String? typeStr,\n    AlertToastType? type,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (content != null) result.content = content;\n    if (typeStr != null) result.typeStr = typeStr;\n    if (type != null) result.type = type;\n    return result;\n  }\n\n  BehaviorAlertToast._();\n\n  factory BehaviorAlertToast.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BehaviorAlertToast.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BehaviorAlertToast',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'content')\n    ..aOS(3, _omitFieldNames ? '' : 'typeStr')\n    ..aE<AlertToastType>(4, _omitFieldNames ? '' : 'type',\n        enumValues: AlertToastType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BehaviorAlertToast clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BehaviorAlertToast copyWith(void Function(BehaviorAlertToast) updates) =>\n      super.copyWith((message) => updates(message as BehaviorAlertToast))\n          as BehaviorAlertToast;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BehaviorAlertToast create() => BehaviorAlertToast._();\n  @$core.override\n  BehaviorAlertToast createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BehaviorAlertToast getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<BehaviorAlertToast>(create);\n  static BehaviorAlertToast? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get content => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set content($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasContent() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearContent() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get typeStr => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set typeStr($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTypeStr() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTypeStr() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  AlertToastType get type => $_getN(3);\n  @$pb.TagNumber(4)\n  set type(AlertToastType value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearType() => $_clearField(4);\n}\n\nclass BorderedLabel extends $pb.GeneratedMessage {\n  factory BorderedLabel({\n    $core.String? icon,\n    $core.String? text,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (text != null) result.text = text;\n    return result;\n  }\n\n  BorderedLabel._();\n\n  factory BorderedLabel.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BorderedLabel.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BorderedLabel',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'text')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BorderedLabel clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BorderedLabel copyWith(void Function(BorderedLabel) updates) =>\n      super.copyWith((message) => updates(message as BorderedLabel))\n          as BorderedLabel;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BorderedLabel create() => BorderedLabel._();\n  @$core.override\n  BorderedLabel createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BorderedLabel getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<BorderedLabel>(create);\n  static BorderedLabel? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n}\n\nclass CancelInterceptInDustbinReply extends $pb.GeneratedMessage {\n  factory CancelInterceptInDustbinReply() => create();\n\n  CancelInterceptInDustbinReply._();\n\n  factory CancelInterceptInDustbinReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CancelInterceptInDustbinReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CancelInterceptInDustbinReply',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CancelInterceptInDustbinReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CancelInterceptInDustbinReply copyWith(\n          void Function(CancelInterceptInDustbinReply) updates) =>\n      super.copyWith(\n              (message) => updates(message as CancelInterceptInDustbinReply))\n          as CancelInterceptInDustbinReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CancelInterceptInDustbinReply create() =>\n      CancelInterceptInDustbinReply._();\n  @$core.override\n  CancelInterceptInDustbinReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CancelInterceptInDustbinReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CancelInterceptInDustbinReply>(create);\n  static CancelInterceptInDustbinReply? _defaultInstance;\n}\n\nclass CancelInterceptInDustbinReq extends $pb.GeneratedMessage {\n  factory CancelInterceptInDustbinReq({\n    SessionId? sessionId,\n  }) {\n    final result = create();\n    if (sessionId != null) result.sessionId = sessionId;\n    return result;\n  }\n\n  CancelInterceptInDustbinReq._();\n\n  factory CancelInterceptInDustbinReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CancelInterceptInDustbinReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CancelInterceptInDustbinReq',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOM<SessionId>(1, _omitFieldNames ? '' : 'sessionId',\n        subBuilder: SessionId.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CancelInterceptInDustbinReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CancelInterceptInDustbinReq copyWith(\n          void Function(CancelInterceptInDustbinReq) updates) =>\n      super.copyWith(\n              (message) => updates(message as CancelInterceptInDustbinReq))\n          as CancelInterceptInDustbinReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CancelInterceptInDustbinReq create() =>\n      CancelInterceptInDustbinReq._();\n  @$core.override\n  CancelInterceptInDustbinReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CancelInterceptInDustbinReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CancelInterceptInDustbinReq>(create);\n  static CancelInterceptInDustbinReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  SessionId get sessionId => $_getN(0);\n  @$pb.TagNumber(1)\n  set sessionId(SessionId value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSessionId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSessionId() => $_clearField(1);\n  @$pb.TagNumber(1)\n  SessionId ensureSessionId() => $_ensure(0);\n}\n\nclass ClearAlertReply extends $pb.GeneratedMessage {\n  factory ClearAlertReply() => create();\n\n  ClearAlertReply._();\n\n  factory ClearAlertReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ClearAlertReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ClearAlertReply',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ClearAlertReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ClearAlertReply copyWith(void Function(ClearAlertReply) updates) =>\n      super.copyWith((message) => updates(message as ClearAlertReply))\n          as ClearAlertReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ClearAlertReply create() => ClearAlertReply._();\n  @$core.override\n  ClearAlertReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ClearAlertReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ClearAlertReply>(create);\n  static ClearAlertReply? _defaultInstance;\n}\n\nclass ClearAlertReq extends $pb.GeneratedMessage {\n  factory ClearAlertReq({\n    AlertToastType? type,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    return result;\n  }\n\n  ClearAlertReq._();\n\n  factory ClearAlertReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ClearAlertReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ClearAlertReq',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aE<AlertToastType>(1, _omitFieldNames ? '' : 'type',\n        enumValues: AlertToastType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ClearAlertReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ClearAlertReq copyWith(void Function(ClearAlertReq) updates) =>\n      super.copyWith((message) => updates(message as ClearAlertReq))\n          as ClearAlertReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ClearAlertReq create() => ClearAlertReq._();\n  @$core.override\n  ClearAlertReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ClearAlertReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ClearAlertReq>(create);\n  static ClearAlertReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  AlertToastType get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(AlertToastType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n}\n\nclass ClearUnreadReply extends $pb.GeneratedMessage {\n  factory ClearUnreadReply() => create();\n\n  ClearUnreadReply._();\n\n  factory ClearUnreadReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ClearUnreadReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ClearUnreadReply',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ClearUnreadReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ClearUnreadReply copyWith(void Function(ClearUnreadReply) updates) =>\n      super.copyWith((message) => updates(message as ClearUnreadReply))\n          as ClearUnreadReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ClearUnreadReply create() => ClearUnreadReply._();\n  @$core.override\n  ClearUnreadReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ClearUnreadReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ClearUnreadReply>(create);\n  static ClearUnreadReply? _defaultInstance;\n}\n\nclass ClearUnreadReq extends $pb.GeneratedMessage {\n  factory ClearUnreadReq({\n    SessionPageType? pageType,\n    SessionId? sessionId,\n  }) {\n    final result = create();\n    if (pageType != null) result.pageType = pageType;\n    if (sessionId != null) result.sessionId = sessionId;\n    return result;\n  }\n\n  ClearUnreadReq._();\n\n  factory ClearUnreadReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ClearUnreadReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ClearUnreadReq',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aE<SessionPageType>(1, _omitFieldNames ? '' : 'pageType',\n        enumValues: SessionPageType.values)\n    ..aOM<SessionId>(2, _omitFieldNames ? '' : 'sessionId',\n        subBuilder: SessionId.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ClearUnreadReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ClearUnreadReq copyWith(void Function(ClearUnreadReq) updates) =>\n      super.copyWith((message) => updates(message as ClearUnreadReq))\n          as ClearUnreadReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ClearUnreadReq create() => ClearUnreadReq._();\n  @$core.override\n  ClearUnreadReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ClearUnreadReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ClearUnreadReq>(create);\n  static ClearUnreadReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  SessionPageType get pageType => $_getN(0);\n  @$pb.TagNumber(1)\n  set pageType(SessionPageType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPageType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPageType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  SessionId get sessionId => $_getN(1);\n  @$pb.TagNumber(2)\n  set sessionId(SessionId value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSessionId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSessionId() => $_clearField(2);\n  @$pb.TagNumber(2)\n  SessionId ensureSessionId() => $_ensure(1);\n}\n\nclass Contact extends $pb.GeneratedMessage {\n  factory Contact({\n    $fixnum.Int64? id,\n    $core.String? name,\n    $0.AvatarItem? avatar,\n    $core.String? vipInfo,\n    $core.String? url,\n    $1.NameRender? nameRender,\n    $core.bool? isSpecialFollow,\n    $core.String? face,\n    $core.int? officialType,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (name != null) result.name = name;\n    if (avatar != null) result.avatar = avatar;\n    if (vipInfo != null) result.vipInfo = vipInfo;\n    if (url != null) result.url = url;\n    if (nameRender != null) result.nameRender = nameRender;\n    if (isSpecialFollow != null) result.isSpecialFollow = isSpecialFollow;\n    if (face != null) result.face = face;\n    if (officialType != null) result.officialType = officialType;\n    return result;\n  }\n\n  Contact._();\n\n  factory Contact.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Contact.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Contact',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOM<$0.AvatarItem>(3, _omitFieldNames ? '' : 'avatar',\n        subBuilder: $0.AvatarItem.create)\n    ..aOS(4, _omitFieldNames ? '' : 'vipInfo')\n    ..aOS(5, _omitFieldNames ? '' : 'url')\n    ..aOM<$1.NameRender>(6, _omitFieldNames ? '' : 'nameRender',\n        subBuilder: $1.NameRender.create)\n    ..aOB(7, _omitFieldNames ? '' : 'isSpecialFollow')\n    ..aOS(8, _omitFieldNames ? '' : 'face')\n    ..aI(9, _omitFieldNames ? '' : 'officialType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Contact clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Contact copyWith(void Function(Contact) updates) =>\n      super.copyWith((message) => updates(message as Contact)) as Contact;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Contact create() => Contact._();\n  @$core.override\n  Contact createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Contact getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Contact>(create);\n  static Contact? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $0.AvatarItem get avatar => $_getN(2);\n  @$pb.TagNumber(3)\n  set avatar($0.AvatarItem value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAvatar() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAvatar() => $_clearField(3);\n  @$pb.TagNumber(3)\n  $0.AvatarItem ensureAvatar() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.String get vipInfo => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set vipInfo($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasVipInfo() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearVipInfo() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get url => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set url($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasUrl() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearUrl() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $1.NameRender get nameRender => $_getN(5);\n  @$pb.TagNumber(6)\n  set nameRender($1.NameRender value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasNameRender() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearNameRender() => $_clearField(6);\n  @$pb.TagNumber(6)\n  $1.NameRender ensureNameRender() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $core.bool get isSpecialFollow => $_getBF(6);\n  @$pb.TagNumber(7)\n  set isSpecialFollow($core.bool value) => $_setBool(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasIsSpecialFollow() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearIsSpecialFollow() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get face => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set face($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasFace() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearFace() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.int get officialType => $_getIZ(8);\n  @$pb.TagNumber(9)\n  set officialType($core.int value) => $_setSignedInt32(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasOfficialType() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearOfficialType() => $_clearField(9);\n}\n\nclass ContactTab extends $pb.GeneratedMessage {\n  factory ContactTab({\n    ContactTabType? tab,\n    $core.String? name,\n  }) {\n    final result = create();\n    if (tab != null) result.tab = tab;\n    if (name != null) result.name = name;\n    return result;\n  }\n\n  ContactTab._();\n\n  factory ContactTab.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ContactTab.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ContactTab',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aE<ContactTabType>(1, _omitFieldNames ? '' : 'tab',\n        enumValues: ContactTabType.values)\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ContactTab clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ContactTab copyWith(void Function(ContactTab) updates) =>\n      super.copyWith((message) => updates(message as ContactTab)) as ContactTab;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ContactTab create() => ContactTab._();\n  @$core.override\n  ContactTab createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ContactTab getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ContactTab>(create);\n  static ContactTab? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  ContactTabType get tab => $_getN(0);\n  @$pb.TagNumber(1)\n  set tab(ContactTabType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTab() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTab() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n}\n\nclass ContactsReply extends $pb.GeneratedMessage {\n  factory ContactsReply({\n    $core.Iterable<Contact>? contacts,\n    $core.Iterable<ContactTab>? tab,\n    ContactTabType? currentTab,\n    PaginationParams? paginationParams,\n  }) {\n    final result = create();\n    if (contacts != null) result.contacts.addAll(contacts);\n    if (tab != null) result.tab.addAll(tab);\n    if (currentTab != null) result.currentTab = currentTab;\n    if (paginationParams != null) result.paginationParams = paginationParams;\n    return result;\n  }\n\n  ContactsReply._();\n\n  factory ContactsReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ContactsReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ContactsReply',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..pPM<Contact>(1, _omitFieldNames ? '' : 'contacts',\n        subBuilder: Contact.create)\n    ..pPM<ContactTab>(2, _omitFieldNames ? '' : 'tab',\n        subBuilder: ContactTab.create)\n    ..aE<ContactTabType>(3, _omitFieldNames ? '' : 'currentTab',\n        enumValues: ContactTabType.values)\n    ..aOM<PaginationParams>(4, _omitFieldNames ? '' : 'paginationParams',\n        subBuilder: PaginationParams.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ContactsReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ContactsReply copyWith(void Function(ContactsReply) updates) =>\n      super.copyWith((message) => updates(message as ContactsReply))\n          as ContactsReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ContactsReply create() => ContactsReply._();\n  @$core.override\n  ContactsReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ContactsReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ContactsReply>(create);\n  static ContactsReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<Contact> get contacts => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<ContactTab> get tab => $_getList(1);\n\n  @$pb.TagNumber(3)\n  ContactTabType get currentTab => $_getN(2);\n  @$pb.TagNumber(3)\n  set currentTab(ContactTabType value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCurrentTab() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCurrentTab() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  PaginationParams get paginationParams => $_getN(3);\n  @$pb.TagNumber(4)\n  set paginationParams(PaginationParams value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPaginationParams() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPaginationParams() => $_clearField(4);\n  @$pb.TagNumber(4)\n  PaginationParams ensurePaginationParams() => $_ensure(3);\n}\n\nclass ContactsReq extends $pb.GeneratedMessage {\n  factory ContactsReq({\n    ContactTabType? tab,\n    PaginationParams? paginationParams,\n  }) {\n    final result = create();\n    if (tab != null) result.tab = tab;\n    if (paginationParams != null) result.paginationParams = paginationParams;\n    return result;\n  }\n\n  ContactsReq._();\n\n  factory ContactsReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ContactsReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ContactsReq',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aE<ContactTabType>(1, _omitFieldNames ? '' : 'tab',\n        enumValues: ContactTabType.values)\n    ..aOM<PaginationParams>(2, _omitFieldNames ? '' : 'paginationParams',\n        subBuilder: PaginationParams.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ContactsReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ContactsReq copyWith(void Function(ContactsReq) updates) =>\n      super.copyWith((message) => updates(message as ContactsReq))\n          as ContactsReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ContactsReq create() => ContactsReq._();\n  @$core.override\n  ContactsReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ContactsReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ContactsReq>(create);\n  static ContactsReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  ContactTabType get tab => $_getN(0);\n  @$pb.TagNumber(1)\n  set tab(ContactTabType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTab() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTab() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  PaginationParams get paginationParams => $_getN(1);\n  @$pb.TagNumber(2)\n  set paginationParams(PaginationParams value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPaginationParams() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPaginationParams() => $_clearField(2);\n  @$pb.TagNumber(2)\n  PaginationParams ensurePaginationParams() => $_ensure(1);\n}\n\nclass ContactsSearchReply extends $pb.GeneratedMessage {\n  factory ContactsSearchReply({\n    $core.Iterable<Contact>? contacts,\n    PaginationParams? paginationParams,\n  }) {\n    final result = create();\n    if (contacts != null) result.contacts.addAll(contacts);\n    if (paginationParams != null) result.paginationParams = paginationParams;\n    return result;\n  }\n\n  ContactsSearchReply._();\n\n  factory ContactsSearchReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ContactsSearchReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ContactsSearchReply',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..pPM<Contact>(1, _omitFieldNames ? '' : 'contacts',\n        subBuilder: Contact.create)\n    ..aOM<PaginationParams>(2, _omitFieldNames ? '' : 'paginationParams',\n        subBuilder: PaginationParams.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ContactsSearchReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ContactsSearchReply copyWith(void Function(ContactsSearchReply) updates) =>\n      super.copyWith((message) => updates(message as ContactsSearchReply))\n          as ContactsSearchReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ContactsSearchReply create() => ContactsSearchReply._();\n  @$core.override\n  ContactsSearchReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ContactsSearchReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ContactsSearchReply>(create);\n  static ContactsSearchReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<Contact> get contacts => $_getList(0);\n\n  @$pb.TagNumber(2)\n  PaginationParams get paginationParams => $_getN(1);\n  @$pb.TagNumber(2)\n  set paginationParams(PaginationParams value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPaginationParams() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPaginationParams() => $_clearField(2);\n  @$pb.TagNumber(2)\n  PaginationParams ensurePaginationParams() => $_ensure(1);\n}\n\nclass ContactsSearchReq extends $pb.GeneratedMessage {\n  factory ContactsSearchReq({\n    $core.String? keyword,\n    ContactTabType? tab,\n    PaginationParams? paginationParams,\n  }) {\n    final result = create();\n    if (keyword != null) result.keyword = keyword;\n    if (tab != null) result.tab = tab;\n    if (paginationParams != null) result.paginationParams = paginationParams;\n    return result;\n  }\n\n  ContactsSearchReq._();\n\n  factory ContactsSearchReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ContactsSearchReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ContactsSearchReq',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'keyword')\n    ..aE<ContactTabType>(2, _omitFieldNames ? '' : 'tab',\n        enumValues: ContactTabType.values)\n    ..aOM<PaginationParams>(3, _omitFieldNames ? '' : 'paginationParams',\n        subBuilder: PaginationParams.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ContactsSearchReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ContactsSearchReq copyWith(void Function(ContactsSearchReq) updates) =>\n      super.copyWith((message) => updates(message as ContactsSearchReq))\n          as ContactsSearchReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ContactsSearchReq create() => ContactsSearchReq._();\n  @$core.override\n  ContactsSearchReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ContactsSearchReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ContactsSearchReq>(create);\n  static ContactsSearchReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get keyword => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set keyword($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasKeyword() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearKeyword() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  ContactTabType get tab => $_getN(1);\n  @$pb.TagNumber(2)\n  set tab(ContactTabType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTab() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTab() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  PaginationParams get paginationParams => $_getN(2);\n  @$pb.TagNumber(3)\n  set paginationParams(PaginationParams value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPaginationParams() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPaginationParams() => $_clearField(3);\n  @$pb.TagNumber(3)\n  PaginationParams ensurePaginationParams() => $_ensure(2);\n}\n\nclass CustomerId extends $pb.GeneratedMessage {\n  factory CustomerId({\n    $fixnum.Int64? shopId,\n    $fixnum.Int64? shopType,\n  }) {\n    final result = create();\n    if (shopId != null) result.shopId = shopId;\n    if (shopType != null) result.shopType = shopType;\n    return result;\n  }\n\n  CustomerId._();\n\n  factory CustomerId.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CustomerId.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CustomerId',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'shopId')\n    ..aInt64(2, _omitFieldNames ? '' : 'shopType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CustomerId clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CustomerId copyWith(void Function(CustomerId) updates) =>\n      super.copyWith((message) => updates(message as CustomerId)) as CustomerId;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CustomerId create() => CustomerId._();\n  @$core.override\n  CustomerId createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CustomerId getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CustomerId>(create);\n  static CustomerId? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get shopId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set shopId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasShopId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearShopId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get shopType => $_getI64(1);\n  @$pb.TagNumber(2)\n  set shopType($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasShopType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearShopType() => $_clearField(2);\n}\n\nclass DeleteSessionListReply extends $pb.GeneratedMessage {\n  factory DeleteSessionListReply() => create();\n\n  DeleteSessionListReply._();\n\n  factory DeleteSessionListReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DeleteSessionListReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DeleteSessionListReply',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DeleteSessionListReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DeleteSessionListReply copyWith(\n          void Function(DeleteSessionListReply) updates) =>\n      super.copyWith((message) => updates(message as DeleteSessionListReply))\n          as DeleteSessionListReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DeleteSessionListReply create() => DeleteSessionListReply._();\n  @$core.override\n  DeleteSessionListReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DeleteSessionListReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DeleteSessionListReply>(create);\n  static DeleteSessionListReply? _defaultInstance;\n}\n\nclass DeleteSessionListReq extends $pb.GeneratedMessage {\n  factory DeleteSessionListReq({\n    SessionPageType? pageType,\n  }) {\n    final result = create();\n    if (pageType != null) result.pageType = pageType;\n    return result;\n  }\n\n  DeleteSessionListReq._();\n\n  factory DeleteSessionListReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DeleteSessionListReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DeleteSessionListReq',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aE<SessionPageType>(1, _omitFieldNames ? '' : 'pageType',\n        enumValues: SessionPageType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DeleteSessionListReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DeleteSessionListReq copyWith(void Function(DeleteSessionListReq) updates) =>\n      super.copyWith((message) => updates(message as DeleteSessionListReq))\n          as DeleteSessionListReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DeleteSessionListReq create() => DeleteSessionListReq._();\n  @$core.override\n  DeleteSessionListReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DeleteSessionListReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DeleteSessionListReq>(create);\n  static DeleteSessionListReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  SessionPageType get pageType => $_getN(0);\n  @$pb.TagNumber(1)\n  set pageType(SessionPageType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPageType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPageType() => $_clearField(1);\n}\n\nclass DeleteSessionReply extends $pb.GeneratedMessage {\n  factory DeleteSessionReply() => create();\n\n  DeleteSessionReply._();\n\n  factory DeleteSessionReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DeleteSessionReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DeleteSessionReply',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DeleteSessionReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DeleteSessionReply copyWith(void Function(DeleteSessionReply) updates) =>\n      super.copyWith((message) => updates(message as DeleteSessionReply))\n          as DeleteSessionReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DeleteSessionReply create() => DeleteSessionReply._();\n  @$core.override\n  DeleteSessionReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DeleteSessionReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DeleteSessionReply>(create);\n  static DeleteSessionReply? _defaultInstance;\n}\n\nclass DeleteSessionReq extends $pb.GeneratedMessage {\n  factory DeleteSessionReq({\n    SessionId? sessionId,\n  }) {\n    final result = create();\n    if (sessionId != null) result.sessionId = sessionId;\n    return result;\n  }\n\n  DeleteSessionReq._();\n\n  factory DeleteSessionReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DeleteSessionReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DeleteSessionReq',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOM<SessionId>(1, _omitFieldNames ? '' : 'sessionId',\n        subBuilder: SessionId.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DeleteSessionReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DeleteSessionReq copyWith(void Function(DeleteSessionReq) updates) =>\n      super.copyWith((message) => updates(message as DeleteSessionReq))\n          as DeleteSessionReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DeleteSessionReq create() => DeleteSessionReq._();\n  @$core.override\n  DeleteSessionReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DeleteSessionReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DeleteSessionReq>(create);\n  static DeleteSessionReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  SessionId get sessionId => $_getN(0);\n  @$pb.TagNumber(1)\n  set sessionId(SessionId value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSessionId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSessionId() => $_clearField(1);\n  @$pb.TagNumber(1)\n  SessionId ensureSessionId() => $_ensure(0);\n}\n\nclass FilledLabel extends $pb.GeneratedMessage {\n  factory FilledLabel({\n    $core.String? text,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    return result;\n  }\n\n  FilledLabel._();\n\n  factory FilledLabel.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FilledLabel.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FilledLabel',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FilledLabel clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FilledLabel copyWith(void Function(FilledLabel) updates) =>\n      super.copyWith((message) => updates(message as FilledLabel))\n          as FilledLabel;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FilledLabel create() => FilledLabel._();\n  @$core.override\n  FilledLabel createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FilledLabel getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FilledLabel>(create);\n  static FilledLabel? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n}\n\nclass FilterConfig extends $pb.GeneratedMessage {\n  factory FilterConfig({\n    $core.Iterable<SessionsFilter>? filters,\n    SessionFilterType? currentFilter,\n  }) {\n    final result = create();\n    if (filters != null) result.filters.addAll(filters);\n    if (currentFilter != null) result.currentFilter = currentFilter;\n    return result;\n  }\n\n  FilterConfig._();\n\n  factory FilterConfig.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FilterConfig.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FilterConfig',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..pPM<SessionsFilter>(1, _omitFieldNames ? '' : 'filters',\n        subBuilder: SessionsFilter.create)\n    ..aE<SessionFilterType>(2, _omitFieldNames ? '' : 'currentFilter',\n        enumValues: SessionFilterType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FilterConfig clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FilterConfig copyWith(void Function(FilterConfig) updates) =>\n      super.copyWith((message) => updates(message as FilterConfig))\n          as FilterConfig;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FilterConfig create() => FilterConfig._();\n  @$core.override\n  FilterConfig createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FilterConfig getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FilterConfig>(create);\n  static FilterConfig? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<SessionsFilter> get filters => $_getList(0);\n\n  @$pb.TagNumber(2)\n  SessionFilterType get currentFilter => $_getN(1);\n  @$pb.TagNumber(2)\n  set currentFilter(SessionFilterType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCurrentFilter() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCurrentFilter() => $_clearField(2);\n}\n\nclass FoldId extends $pb.GeneratedMessage {\n  factory FoldId({\n    SessionType? type,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    return result;\n  }\n\n  FoldId._();\n\n  factory FoldId.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FoldId.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FoldId',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aE<SessionType>(1, _omitFieldNames ? '' : 'type',\n        enumValues: SessionType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FoldId clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FoldId copyWith(void Function(FoldId) updates) =>\n      super.copyWith((message) => updates(message as FoldId)) as FoldId;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FoldId create() => FoldId._();\n  @$core.override\n  FoldId createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FoldId getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<FoldId>(create);\n  static FoldId? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  SessionType get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(SessionType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n}\n\nclass GetImSettingsReply extends $pb.GeneratedMessage {\n  factory GetImSettingsReply({\n    $core.String? pageTitle,\n    $core.Iterable<$core.MapEntry<$core.int, Setting>>? settings,\n  }) {\n    final result = create();\n    if (pageTitle != null) result.pageTitle = pageTitle;\n    if (settings != null) result.settings.addEntries(settings);\n    return result;\n  }\n\n  GetImSettingsReply._();\n\n  factory GetImSettingsReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory GetImSettingsReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'GetImSettingsReply',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'pageTitle')\n    ..m<$core.int, Setting>(2, _omitFieldNames ? '' : 'settings',\n        entryClassName: 'GetImSettingsReply.SettingsEntry',\n        keyFieldType: $pb.PbFieldType.O3,\n        valueFieldType: $pb.PbFieldType.OM,\n        valueCreator: Setting.create,\n        valueDefaultOrMaker: Setting.getDefault,\n        packageName: const $pb.PackageName('bilibili.app.im.v1'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GetImSettingsReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GetImSettingsReply copyWith(void Function(GetImSettingsReply) updates) =>\n      super.copyWith((message) => updates(message as GetImSettingsReply))\n          as GetImSettingsReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static GetImSettingsReply create() => GetImSettingsReply._();\n  @$core.override\n  GetImSettingsReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static GetImSettingsReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<GetImSettingsReply>(create);\n  static GetImSettingsReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get pageTitle => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set pageTitle($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPageTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPageTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbMap<$core.int, Setting> get settings => $_getMap(1);\n}\n\nclass GetImSettingsReq extends $pb.GeneratedMessage {\n  factory GetImSettingsReq({\n    IMSettingType? type,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    return result;\n  }\n\n  GetImSettingsReq._();\n\n  factory GetImSettingsReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory GetImSettingsReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'GetImSettingsReq',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aE<IMSettingType>(1, _omitFieldNames ? '' : 'type',\n        enumValues: IMSettingType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GetImSettingsReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GetImSettingsReq copyWith(void Function(GetImSettingsReq) updates) =>\n      super.copyWith((message) => updates(message as GetImSettingsReq))\n          as GetImSettingsReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static GetImSettingsReq create() => GetImSettingsReq._();\n  @$core.override\n  GetImSettingsReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static GetImSettingsReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<GetImSettingsReq>(create);\n  static GetImSettingsReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  IMSettingType get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(IMSettingType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n}\n\nclass GetQuickLinkUnreadReply extends $pb.GeneratedMessage {\n  factory GetQuickLinkUnreadReply({\n    $core.Iterable<QuickLinkUnreadItem>? items,\n  }) {\n    final result = create();\n    if (items != null) result.items.addAll(items);\n    return result;\n  }\n\n  GetQuickLinkUnreadReply._();\n\n  factory GetQuickLinkUnreadReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory GetQuickLinkUnreadReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'GetQuickLinkUnreadReply',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..pPM<QuickLinkUnreadItem>(1, _omitFieldNames ? '' : 'items',\n        subBuilder: QuickLinkUnreadItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GetQuickLinkUnreadReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GetQuickLinkUnreadReply copyWith(\n          void Function(GetQuickLinkUnreadReply) updates) =>\n      super.copyWith((message) => updates(message as GetQuickLinkUnreadReply))\n          as GetQuickLinkUnreadReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static GetQuickLinkUnreadReply create() => GetQuickLinkUnreadReply._();\n  @$core.override\n  GetQuickLinkUnreadReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static GetQuickLinkUnreadReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<GetQuickLinkUnreadReply>(create);\n  static GetQuickLinkUnreadReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<QuickLinkUnreadItem> get items => $_getList(0);\n}\n\nclass GetQuickLinkUnreadReq extends $pb.GeneratedMessage {\n  factory GetQuickLinkUnreadReq() => create();\n\n  GetQuickLinkUnreadReq._();\n\n  factory GetQuickLinkUnreadReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory GetQuickLinkUnreadReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'GetQuickLinkUnreadReq',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GetQuickLinkUnreadReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GetQuickLinkUnreadReq copyWith(\n          void Function(GetQuickLinkUnreadReq) updates) =>\n      super.copyWith((message) => updates(message as GetQuickLinkUnreadReq))\n          as GetQuickLinkUnreadReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static GetQuickLinkUnreadReq create() => GetQuickLinkUnreadReq._();\n  @$core.override\n  GetQuickLinkUnreadReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static GetQuickLinkUnreadReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<GetQuickLinkUnreadReq>(create);\n  static GetQuickLinkUnreadReq? _defaultInstance;\n}\n\nclass GetTotalUnreadReply extends $pb.GeneratedMessage {\n  factory GetTotalUnreadReply({\n    Unread? total,\n  }) {\n    final result = create();\n    if (total != null) result.total = total;\n    return result;\n  }\n\n  GetTotalUnreadReply._();\n\n  factory GetTotalUnreadReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory GetTotalUnreadReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'GetTotalUnreadReply',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOM<Unread>(1, _omitFieldNames ? '' : 'total', subBuilder: Unread.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GetTotalUnreadReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GetTotalUnreadReply copyWith(void Function(GetTotalUnreadReply) updates) =>\n      super.copyWith((message) => updates(message as GetTotalUnreadReply))\n          as GetTotalUnreadReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static GetTotalUnreadReply create() => GetTotalUnreadReply._();\n  @$core.override\n  GetTotalUnreadReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static GetTotalUnreadReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<GetTotalUnreadReply>(create);\n  static GetTotalUnreadReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Unread get total => $_getN(0);\n  @$pb.TagNumber(1)\n  set total(Unread value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTotal() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTotal() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Unread ensureTotal() => $_ensure(0);\n}\n\nclass GetTotalUnreadReq extends $pb.GeneratedMessage {\n  factory GetTotalUnreadReq() => create();\n\n  GetTotalUnreadReq._();\n\n  factory GetTotalUnreadReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory GetTotalUnreadReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'GetTotalUnreadReq',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GetTotalUnreadReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GetTotalUnreadReq copyWith(void Function(GetTotalUnreadReq) updates) =>\n      super.copyWith((message) => updates(message as GetTotalUnreadReq))\n          as GetTotalUnreadReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static GetTotalUnreadReq create() => GetTotalUnreadReq._();\n  @$core.override\n  GetTotalUnreadReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static GetTotalUnreadReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<GetTotalUnreadReq>(create);\n  static GetTotalUnreadReq? _defaultInstance;\n}\n\nclass GroupId extends $pb.GeneratedMessage {\n  factory GroupId({\n    $fixnum.Int64? groupId,\n  }) {\n    final result = create();\n    if (groupId != null) result.groupId = groupId;\n    return result;\n  }\n\n  GroupId._();\n\n  factory GroupId.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory GroupId.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'GroupId',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'groupId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GroupId clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GroupId copyWith(void Function(GroupId) updates) =>\n      super.copyWith((message) => updates(message as GroupId)) as GroupId;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static GroupId create() => GroupId._();\n  @$core.override\n  GroupId createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static GroupId getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<GroupId>(create);\n  static GroupId? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get groupId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set groupId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasGroupId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearGroupId() => $_clearField(1);\n}\n\nclass ImageLabel extends $pb.GeneratedMessage {\n  factory ImageLabel({\n    $core.String? url,\n    $core.int? width,\n    $core.int? height,\n  }) {\n    final result = create();\n    if (url != null) result.url = url;\n    if (width != null) result.width = width;\n    if (height != null) result.height = height;\n    return result;\n  }\n\n  ImageLabel._();\n\n  factory ImageLabel.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ImageLabel.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ImageLabel',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'url')\n    ..aI(2, _omitFieldNames ? '' : 'width')\n    ..aI(3, _omitFieldNames ? '' : 'height')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ImageLabel clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ImageLabel copyWith(void Function(ImageLabel) updates) =>\n      super.copyWith((message) => updates(message as ImageLabel)) as ImageLabel;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ImageLabel create() => ImageLabel._();\n  @$core.override\n  ImageLabel createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ImageLabel getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ImageLabel>(create);\n  static ImageLabel? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get url => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set url($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUrl() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get width => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set width($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasWidth() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearWidth() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get height => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set height($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasHeight() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearHeight() => $_clearField(3);\n}\n\nclass KeywordBlockingAddReply extends $pb.GeneratedMessage {\n  factory KeywordBlockingAddReply({\n    $core.String? toast,\n    KeywordBlockingItem? item,\n  }) {\n    final result = create();\n    if (toast != null) result.toast = toast;\n    if (item != null) result.item = item;\n    return result;\n  }\n\n  KeywordBlockingAddReply._();\n\n  factory KeywordBlockingAddReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory KeywordBlockingAddReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'KeywordBlockingAddReply',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'toast')\n    ..aOM<KeywordBlockingItem>(2, _omitFieldNames ? '' : 'item',\n        subBuilder: KeywordBlockingItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  KeywordBlockingAddReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  KeywordBlockingAddReply copyWith(\n          void Function(KeywordBlockingAddReply) updates) =>\n      super.copyWith((message) => updates(message as KeywordBlockingAddReply))\n          as KeywordBlockingAddReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static KeywordBlockingAddReply create() => KeywordBlockingAddReply._();\n  @$core.override\n  KeywordBlockingAddReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static KeywordBlockingAddReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<KeywordBlockingAddReply>(create);\n  static KeywordBlockingAddReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get toast => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set toast($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasToast() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearToast() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  KeywordBlockingItem get item => $_getN(1);\n  @$pb.TagNumber(2)\n  set item(KeywordBlockingItem value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasItem() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearItem() => $_clearField(2);\n  @$pb.TagNumber(2)\n  KeywordBlockingItem ensureItem() => $_ensure(1);\n}\n\nclass KeywordBlockingAddReq extends $pb.GeneratedMessage {\n  factory KeywordBlockingAddReq({\n    $core.String? keyword,\n  }) {\n    final result = create();\n    if (keyword != null) result.keyword = keyword;\n    return result;\n  }\n\n  KeywordBlockingAddReq._();\n\n  factory KeywordBlockingAddReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory KeywordBlockingAddReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'KeywordBlockingAddReq',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'keyword')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  KeywordBlockingAddReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  KeywordBlockingAddReq copyWith(\n          void Function(KeywordBlockingAddReq) updates) =>\n      super.copyWith((message) => updates(message as KeywordBlockingAddReq))\n          as KeywordBlockingAddReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static KeywordBlockingAddReq create() => KeywordBlockingAddReq._();\n  @$core.override\n  KeywordBlockingAddReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static KeywordBlockingAddReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<KeywordBlockingAddReq>(create);\n  static KeywordBlockingAddReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get keyword => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set keyword($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasKeyword() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearKeyword() => $_clearField(1);\n}\n\nclass KeywordBlockingDeleteReply extends $pb.GeneratedMessage {\n  factory KeywordBlockingDeleteReply({\n    $core.String? toast,\n  }) {\n    final result = create();\n    if (toast != null) result.toast = toast;\n    return result;\n  }\n\n  KeywordBlockingDeleteReply._();\n\n  factory KeywordBlockingDeleteReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory KeywordBlockingDeleteReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'KeywordBlockingDeleteReply',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'toast')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  KeywordBlockingDeleteReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  KeywordBlockingDeleteReply copyWith(\n          void Function(KeywordBlockingDeleteReply) updates) =>\n      super.copyWith(\n              (message) => updates(message as KeywordBlockingDeleteReply))\n          as KeywordBlockingDeleteReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static KeywordBlockingDeleteReply create() => KeywordBlockingDeleteReply._();\n  @$core.override\n  KeywordBlockingDeleteReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static KeywordBlockingDeleteReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<KeywordBlockingDeleteReply>(create);\n  static KeywordBlockingDeleteReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get toast => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set toast($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasToast() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearToast() => $_clearField(1);\n}\n\nclass KeywordBlockingDeleteReq extends $pb.GeneratedMessage {\n  factory KeywordBlockingDeleteReq({\n    $core.String? keyword,\n  }) {\n    final result = create();\n    if (keyword != null) result.keyword = keyword;\n    return result;\n  }\n\n  KeywordBlockingDeleteReq._();\n\n  factory KeywordBlockingDeleteReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory KeywordBlockingDeleteReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'KeywordBlockingDeleteReq',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'keyword')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  KeywordBlockingDeleteReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  KeywordBlockingDeleteReq copyWith(\n          void Function(KeywordBlockingDeleteReq) updates) =>\n      super.copyWith((message) => updates(message as KeywordBlockingDeleteReq))\n          as KeywordBlockingDeleteReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static KeywordBlockingDeleteReq create() => KeywordBlockingDeleteReq._();\n  @$core.override\n  KeywordBlockingDeleteReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static KeywordBlockingDeleteReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<KeywordBlockingDeleteReq>(create);\n  static KeywordBlockingDeleteReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get keyword => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set keyword($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasKeyword() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearKeyword() => $_clearField(1);\n}\n\nclass KeywordBlockingItem extends $pb.GeneratedMessage {\n  factory KeywordBlockingItem({\n    $core.String? keyword,\n  }) {\n    final result = create();\n    if (keyword != null) result.keyword = keyword;\n    return result;\n  }\n\n  KeywordBlockingItem._();\n\n  factory KeywordBlockingItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory KeywordBlockingItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'KeywordBlockingItem',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'keyword')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  KeywordBlockingItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  KeywordBlockingItem copyWith(void Function(KeywordBlockingItem) updates) =>\n      super.copyWith((message) => updates(message as KeywordBlockingItem))\n          as KeywordBlockingItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static KeywordBlockingItem create() => KeywordBlockingItem._();\n  @$core.override\n  KeywordBlockingItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static KeywordBlockingItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<KeywordBlockingItem>(create);\n  static KeywordBlockingItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get keyword => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set keyword($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasKeyword() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearKeyword() => $_clearField(1);\n}\n\nclass KeywordBlockingListReply extends $pb.GeneratedMessage {\n  factory KeywordBlockingListReply({\n    $core.Iterable<KeywordBlockingItem>? items,\n    $core.int? listLimit,\n    $core.int? charLimit,\n    $core.String? listLimitText,\n  }) {\n    final result = create();\n    if (items != null) result.items.addAll(items);\n    if (listLimit != null) result.listLimit = listLimit;\n    if (charLimit != null) result.charLimit = charLimit;\n    if (listLimitText != null) result.listLimitText = listLimitText;\n    return result;\n  }\n\n  KeywordBlockingListReply._();\n\n  factory KeywordBlockingListReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory KeywordBlockingListReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'KeywordBlockingListReply',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..pPM<KeywordBlockingItem>(1, _omitFieldNames ? '' : 'items',\n        subBuilder: KeywordBlockingItem.create)\n    ..aI(2, _omitFieldNames ? '' : 'listLimit')\n    ..aI(3, _omitFieldNames ? '' : 'charLimit')\n    ..aOS(4, _omitFieldNames ? '' : 'listLimitText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  KeywordBlockingListReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  KeywordBlockingListReply copyWith(\n          void Function(KeywordBlockingListReply) updates) =>\n      super.copyWith((message) => updates(message as KeywordBlockingListReply))\n          as KeywordBlockingListReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static KeywordBlockingListReply create() => KeywordBlockingListReply._();\n  @$core.override\n  KeywordBlockingListReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static KeywordBlockingListReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<KeywordBlockingListReply>(create);\n  static KeywordBlockingListReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<KeywordBlockingItem> get items => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.int get listLimit => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set listLimit($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasListLimit() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearListLimit() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get charLimit => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set charLimit($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCharLimit() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCharLimit() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get listLimitText => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set listLimitText($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasListLimitText() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearListLimitText() => $_clearField(4);\n}\n\nclass KeywordBlockingListReq extends $pb.GeneratedMessage {\n  factory KeywordBlockingListReq() => create();\n\n  KeywordBlockingListReq._();\n\n  factory KeywordBlockingListReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory KeywordBlockingListReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'KeywordBlockingListReq',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  KeywordBlockingListReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  KeywordBlockingListReq copyWith(\n          void Function(KeywordBlockingListReq) updates) =>\n      super.copyWith((message) => updates(message as KeywordBlockingListReq))\n          as KeywordBlockingListReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static KeywordBlockingListReq create() => KeywordBlockingListReq._();\n  @$core.override\n  KeywordBlockingListReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static KeywordBlockingListReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<KeywordBlockingListReq>(create);\n  static KeywordBlockingListReq? _defaultInstance;\n}\n\nclass Medal extends $pb.GeneratedMessage {\n  factory Medal({\n    $fixnum.Int64? uid,\n    $core.int? medalId,\n    $core.int? level,\n    $core.String? medalName,\n    $core.int? score,\n    $core.int? intimacy,\n    $core.int? masterStatus,\n    $core.int? isReceive,\n    $core.String? medalColorStart,\n    $core.String? medalColorEnd,\n    $core.String? medalColorBorder,\n    $core.String? medalColorName,\n    $core.String? medalColorLevel,\n    $fixnum.Int64? guardLevel,\n  }) {\n    final result = create();\n    if (uid != null) result.uid = uid;\n    if (medalId != null) result.medalId = medalId;\n    if (level != null) result.level = level;\n    if (medalName != null) result.medalName = medalName;\n    if (score != null) result.score = score;\n    if (intimacy != null) result.intimacy = intimacy;\n    if (masterStatus != null) result.masterStatus = masterStatus;\n    if (isReceive != null) result.isReceive = isReceive;\n    if (medalColorStart != null) result.medalColorStart = medalColorStart;\n    if (medalColorEnd != null) result.medalColorEnd = medalColorEnd;\n    if (medalColorBorder != null) result.medalColorBorder = medalColorBorder;\n    if (medalColorName != null) result.medalColorName = medalColorName;\n    if (medalColorLevel != null) result.medalColorLevel = medalColorLevel;\n    if (guardLevel != null) result.guardLevel = guardLevel;\n    return result;\n  }\n\n  Medal._();\n\n  factory Medal.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Medal.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Medal',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'uid')\n    ..aI(2, _omitFieldNames ? '' : 'medalId')\n    ..aI(3, _omitFieldNames ? '' : 'level')\n    ..aOS(4, _omitFieldNames ? '' : 'medalName')\n    ..aI(5, _omitFieldNames ? '' : 'score')\n    ..aI(6, _omitFieldNames ? '' : 'intimacy')\n    ..aI(7, _omitFieldNames ? '' : 'masterStatus')\n    ..aI(8, _omitFieldNames ? '' : 'isReceive')\n    ..aOS(9, _omitFieldNames ? '' : 'medalColorStart')\n    ..aOS(10, _omitFieldNames ? '' : 'medalColorEnd')\n    ..aOS(11, _omitFieldNames ? '' : 'medalColorBorder')\n    ..aOS(12, _omitFieldNames ? '' : 'medalColorName')\n    ..aOS(13, _omitFieldNames ? '' : 'medalColorLevel')\n    ..aInt64(14, _omitFieldNames ? '' : 'guardLevel')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Medal clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Medal copyWith(void Function(Medal) updates) =>\n      super.copyWith((message) => updates(message as Medal)) as Medal;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Medal create() => Medal._();\n  @$core.override\n  Medal createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Medal getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Medal>(create);\n  static Medal? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get uid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set uid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get medalId => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set medalId($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMedalId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMedalId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get level => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set level($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLevel() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLevel() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get medalName => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set medalName($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasMedalName() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearMedalName() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get score => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set score($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasScore() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearScore() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get intimacy => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set intimacy($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasIntimacy() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearIntimacy() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get masterStatus => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set masterStatus($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasMasterStatus() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearMasterStatus() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get isReceive => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set isReceive($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasIsReceive() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearIsReceive() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get medalColorStart => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set medalColorStart($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasMedalColorStart() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearMedalColorStart() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get medalColorEnd => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set medalColorEnd($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasMedalColorEnd() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearMedalColorEnd() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get medalColorBorder => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set medalColorBorder($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasMedalColorBorder() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearMedalColorBorder() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get medalColorName => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set medalColorName($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasMedalColorName() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearMedalColorName() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.String get medalColorLevel => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set medalColorLevel($core.String value) => $_setString(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasMedalColorLevel() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearMedalColorLevel() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $fixnum.Int64 get guardLevel => $_getI64(13);\n  @$pb.TagNumber(14)\n  set guardLevel($fixnum.Int64 value) => $_setInt64(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasGuardLevel() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearGuardLevel() => $_clearField(14);\n}\n\nclass MsgSummary extends $pb.GeneratedMessage {\n  factory MsgSummary({\n    $core.String? rawMsg,\n    MsgSummaryPrefixType? prefixType,\n    $core.String? prefixText,\n    $core.bool? isGroupOwner,\n  }) {\n    final result = create();\n    if (rawMsg != null) result.rawMsg = rawMsg;\n    if (prefixType != null) result.prefixType = prefixType;\n    if (prefixText != null) result.prefixText = prefixText;\n    if (isGroupOwner != null) result.isGroupOwner = isGroupOwner;\n    return result;\n  }\n\n  MsgSummary._();\n\n  factory MsgSummary.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MsgSummary.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MsgSummary',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'rawMsg')\n    ..aE<MsgSummaryPrefixType>(2, _omitFieldNames ? '' : 'prefixType',\n        enumValues: MsgSummaryPrefixType.values)\n    ..aOS(3, _omitFieldNames ? '' : 'prefixText')\n    ..aOB(4, _omitFieldNames ? '' : 'isGroupOwner')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MsgSummary clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MsgSummary copyWith(void Function(MsgSummary) updates) =>\n      super.copyWith((message) => updates(message as MsgSummary)) as MsgSummary;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MsgSummary create() => MsgSummary._();\n  @$core.override\n  MsgSummary createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MsgSummary getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MsgSummary>(create);\n  static MsgSummary? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get rawMsg => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set rawMsg($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasRawMsg() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRawMsg() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  MsgSummaryPrefixType get prefixType => $_getN(1);\n  @$pb.TagNumber(2)\n  set prefixType(MsgSummaryPrefixType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPrefixType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPrefixType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get prefixText => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set prefixText($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPrefixText() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPrefixText() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get isGroupOwner => $_getBF(3);\n  @$pb.TagNumber(4)\n  set isGroupOwner($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIsGroupOwner() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIsGroupOwner() => $_clearField(4);\n}\n\nclass Offset extends $pb.GeneratedMessage {\n  factory Offset({\n    $fixnum.Int64? normalOffset,\n    $fixnum.Int64? topOffset,\n  }) {\n    final result = create();\n    if (normalOffset != null) result.normalOffset = normalOffset;\n    if (topOffset != null) result.topOffset = topOffset;\n    return result;\n  }\n\n  Offset._();\n\n  factory Offset.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Offset.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Offset',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'normalOffset')\n    ..aInt64(2, _omitFieldNames ? '' : 'topOffset')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Offset clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Offset copyWith(void Function(Offset) updates) =>\n      super.copyWith((message) => updates(message as Offset)) as Offset;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Offset create() => Offset._();\n  @$core.override\n  Offset createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Offset getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Offset>(create);\n  static Offset? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get normalOffset => $_getI64(0);\n  @$pb.TagNumber(1)\n  set normalOffset($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasNormalOffset() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearNormalOffset() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get topOffset => $_getI64(1);\n  @$pb.TagNumber(2)\n  set topOffset($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTopOffset() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTopOffset() => $_clearField(2);\n}\n\nclass OperationContent extends $pb.GeneratedMessage {\n  factory OperationContent({\n    $core.bool? show,\n    $core.String? text,\n  }) {\n    final result = create();\n    if (show != null) result.show = show;\n    if (text != null) result.text = text;\n    return result;\n  }\n\n  OperationContent._();\n\n  factory OperationContent.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OperationContent.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OperationContent',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'show')\n    ..aOS(2, _omitFieldNames ? '' : 'text')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OperationContent clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OperationContent copyWith(void Function(OperationContent) updates) =>\n      super.copyWith((message) => updates(message as OperationContent))\n          as OperationContent;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OperationContent create() => OperationContent._();\n  @$core.override\n  OperationContent createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OperationContent getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OperationContent>(create);\n  static OperationContent? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get show => $_getBF(0);\n  @$pb.TagNumber(1)\n  set show($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasShow() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearShow() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n}\n\nclass PaginationParams extends $pb.GeneratedMessage {\n  factory PaginationParams({\n    $core.Iterable<$core.MapEntry<$core.int, Offset>>? offsets,\n    $core.bool? hasMore,\n  }) {\n    final result = create();\n    if (offsets != null) result.offsets.addEntries(offsets);\n    if (hasMore != null) result.hasMore = hasMore;\n    return result;\n  }\n\n  PaginationParams._();\n\n  factory PaginationParams.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PaginationParams.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PaginationParams',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..m<$core.int, Offset>(1, _omitFieldNames ? '' : 'offsets',\n        entryClassName: 'PaginationParams.OffsetsEntry',\n        keyFieldType: $pb.PbFieldType.O3,\n        valueFieldType: $pb.PbFieldType.OM,\n        valueCreator: Offset.create,\n        valueDefaultOrMaker: Offset.getDefault,\n        packageName: const $pb.PackageName('bilibili.app.im.v1'))\n    ..aOB(2, _omitFieldNames ? '' : 'hasMore')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PaginationParams clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PaginationParams copyWith(void Function(PaginationParams) updates) =>\n      super.copyWith((message) => updates(message as PaginationParams))\n          as PaginationParams;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PaginationParams create() => PaginationParams._();\n  @$core.override\n  PaginationParams createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PaginationParams getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PaginationParams>(create);\n  static PaginationParams? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbMap<$core.int, Offset> get offsets => $_getMap(0);\n\n  @$pb.TagNumber(2)\n  $core.bool get hasMore => $_getBF(1);\n  @$pb.TagNumber(2)\n  set hasMore($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHasMore() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHasMore() => $_clearField(2);\n}\n\nclass PinSessionReply extends $pb.GeneratedMessage {\n  factory PinSessionReply({\n    $fixnum.Int64? sequenceNumber,\n    $fixnum.Int64? code,\n    $core.String? message,\n  }) {\n    final result = create();\n    if (sequenceNumber != null) result.sequenceNumber = sequenceNumber;\n    if (code != null) result.code = code;\n    if (message != null) result.message = message;\n    return result;\n  }\n\n  PinSessionReply._();\n\n  factory PinSessionReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PinSessionReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PinSessionReply',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'sequenceNumber')\n    ..aInt64(2, _omitFieldNames ? '' : 'code')\n    ..aOS(3, _omitFieldNames ? '' : 'message')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PinSessionReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PinSessionReply copyWith(void Function(PinSessionReply) updates) =>\n      super.copyWith((message) => updates(message as PinSessionReply))\n          as PinSessionReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PinSessionReply create() => PinSessionReply._();\n  @$core.override\n  PinSessionReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PinSessionReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PinSessionReply>(create);\n  static PinSessionReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get sequenceNumber => $_getI64(0);\n  @$pb.TagNumber(1)\n  set sequenceNumber($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSequenceNumber() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSequenceNumber() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get code => $_getI64(1);\n  @$pb.TagNumber(2)\n  set code($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCode() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCode() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get message => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set message($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasMessage() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearMessage() => $_clearField(3);\n}\n\nclass PinSessionReq extends $pb.GeneratedMessage {\n  factory PinSessionReq({\n    SessionId? sessionId,\n    $fixnum.Int64? topTimeMicros,\n  }) {\n    final result = create();\n    if (sessionId != null) result.sessionId = sessionId;\n    if (topTimeMicros != null) result.topTimeMicros = topTimeMicros;\n    return result;\n  }\n\n  PinSessionReq._();\n\n  factory PinSessionReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PinSessionReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PinSessionReq',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOM<SessionId>(1, _omitFieldNames ? '' : 'sessionId',\n        subBuilder: SessionId.create)\n    ..aInt64(2, _omitFieldNames ? '' : 'topTimeMicros')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PinSessionReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PinSessionReq copyWith(void Function(PinSessionReq) updates) =>\n      super.copyWith((message) => updates(message as PinSessionReq))\n          as PinSessionReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PinSessionReq create() => PinSessionReq._();\n  @$core.override\n  PinSessionReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PinSessionReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PinSessionReq>(create);\n  static PinSessionReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  SessionId get sessionId => $_getN(0);\n  @$pb.TagNumber(1)\n  set sessionId(SessionId value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSessionId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSessionId() => $_clearField(1);\n  @$pb.TagNumber(1)\n  SessionId ensureSessionId() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get topTimeMicros => $_getI64(1);\n  @$pb.TagNumber(2)\n  set topTimeMicros($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTopTimeMicros() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTopTimeMicros() => $_clearField(2);\n}\n\nclass PrivateId extends $pb.GeneratedMessage {\n  factory PrivateId({\n    $fixnum.Int64? talkerUid,\n  }) {\n    final result = create();\n    if (talkerUid != null) result.talkerUid = talkerUid;\n    return result;\n  }\n\n  PrivateId._();\n\n  factory PrivateId.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PrivateId.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PrivateId',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'talkerUid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PrivateId clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PrivateId copyWith(void Function(PrivateId) updates) =>\n      super.copyWith((message) => updates(message as PrivateId)) as PrivateId;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PrivateId create() => PrivateId._();\n  @$core.override\n  PrivateId createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PrivateId getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PrivateId>(create);\n  static PrivateId? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get talkerUid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set talkerUid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTalkerUid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTalkerUid() => $_clearField(1);\n}\n\nclass QuickLinkBubble extends $pb.GeneratedMessage {\n  factory QuickLinkBubble({\n    $fixnum.Int64? mid,\n    $core.String? avatar,\n    $core.String? nickName,\n    $core.String? content,\n    QuickLinkItemType? quickLinkItem,\n    QuickLinkMsgType? msgType,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (avatar != null) result.avatar = avatar;\n    if (nickName != null) result.nickName = nickName;\n    if (content != null) result.content = content;\n    if (quickLinkItem != null) result.quickLinkItem = quickLinkItem;\n    if (msgType != null) result.msgType = msgType;\n    return result;\n  }\n\n  QuickLinkBubble._();\n\n  factory QuickLinkBubble.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory QuickLinkBubble.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'QuickLinkBubble',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aOS(2, _omitFieldNames ? '' : 'avatar')\n    ..aOS(3, _omitFieldNames ? '' : 'nickName')\n    ..aOS(4, _omitFieldNames ? '' : 'content')\n    ..aE<QuickLinkItemType>(5, _omitFieldNames ? '' : 'quickLinkItem',\n        enumValues: QuickLinkItemType.values)\n    ..aE<QuickLinkMsgType>(6, _omitFieldNames ? '' : 'msgType',\n        enumValues: QuickLinkMsgType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QuickLinkBubble clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QuickLinkBubble copyWith(void Function(QuickLinkBubble) updates) =>\n      super.copyWith((message) => updates(message as QuickLinkBubble))\n          as QuickLinkBubble;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static QuickLinkBubble create() => QuickLinkBubble._();\n  @$core.override\n  QuickLinkBubble createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static QuickLinkBubble getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<QuickLinkBubble>(create);\n  static QuickLinkBubble? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get avatar => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set avatar($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAvatar() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAvatar() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get nickName => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set nickName($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasNickName() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearNickName() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get content => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set content($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasContent() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearContent() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  QuickLinkItemType get quickLinkItem => $_getN(4);\n  @$pb.TagNumber(5)\n  set quickLinkItem(QuickLinkItemType value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasQuickLinkItem() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearQuickLinkItem() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  QuickLinkMsgType get msgType => $_getN(5);\n  @$pb.TagNumber(6)\n  set msgType(QuickLinkMsgType value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasMsgType() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearMsgType() => $_clearField(6);\n}\n\nclass QuickLinkConfig extends $pb.GeneratedMessage {\n  factory QuickLinkConfig({\n    $core.Iterable<QuickLinkItem>? items,\n    QuickLinkBubble? bubble,\n    $core.bool? isLegacyStyle,\n  }) {\n    final result = create();\n    if (items != null) result.items.addAll(items);\n    if (bubble != null) result.bubble = bubble;\n    if (isLegacyStyle != null) result.isLegacyStyle = isLegacyStyle;\n    return result;\n  }\n\n  QuickLinkConfig._();\n\n  factory QuickLinkConfig.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory QuickLinkConfig.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'QuickLinkConfig',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..pPM<QuickLinkItem>(1, _omitFieldNames ? '' : 'items',\n        subBuilder: QuickLinkItem.create)\n    ..aOM<QuickLinkBubble>(2, _omitFieldNames ? '' : 'bubble',\n        subBuilder: QuickLinkBubble.create)\n    ..aOB(3, _omitFieldNames ? '' : 'isLegacyStyle')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QuickLinkConfig clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QuickLinkConfig copyWith(void Function(QuickLinkConfig) updates) =>\n      super.copyWith((message) => updates(message as QuickLinkConfig))\n          as QuickLinkConfig;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static QuickLinkConfig create() => QuickLinkConfig._();\n  @$core.override\n  QuickLinkConfig createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static QuickLinkConfig getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<QuickLinkConfig>(create);\n  static QuickLinkConfig? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<QuickLinkItem> get items => $_getList(0);\n\n  @$pb.TagNumber(2)\n  QuickLinkBubble get bubble => $_getN(1);\n  @$pb.TagNumber(2)\n  set bubble(QuickLinkBubble value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBubble() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBubble() => $_clearField(2);\n  @$pb.TagNumber(2)\n  QuickLinkBubble ensureBubble() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.bool get isLegacyStyle => $_getBF(2);\n  @$pb.TagNumber(3)\n  set isLegacyStyle($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIsLegacyStyle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIsLegacyStyle() => $_clearField(3);\n}\n\nclass QuickLinkItem extends $pb.GeneratedMessage {\n  factory QuickLinkItem({\n    $core.String? title,\n    $core.String? icon,\n    $core.String? iconDark,\n    $core.String? url,\n    Unread? unread,\n    QuickLinkItemType? itemType,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (icon != null) result.icon = icon;\n    if (iconDark != null) result.iconDark = iconDark;\n    if (url != null) result.url = url;\n    if (unread != null) result.unread = unread;\n    if (itemType != null) result.itemType = itemType;\n    return result;\n  }\n\n  QuickLinkItem._();\n\n  factory QuickLinkItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory QuickLinkItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'QuickLinkItem',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'icon')\n    ..aOS(3, _omitFieldNames ? '' : 'iconDark')\n    ..aOS(4, _omitFieldNames ? '' : 'url')\n    ..aOM<Unread>(5, _omitFieldNames ? '' : 'unread', subBuilder: Unread.create)\n    ..aE<QuickLinkItemType>(6, _omitFieldNames ? '' : 'itemType',\n        enumValues: QuickLinkItemType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QuickLinkItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QuickLinkItem copyWith(void Function(QuickLinkItem) updates) =>\n      super.copyWith((message) => updates(message as QuickLinkItem))\n          as QuickLinkItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static QuickLinkItem create() => QuickLinkItem._();\n  @$core.override\n  QuickLinkItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static QuickLinkItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<QuickLinkItem>(create);\n  static QuickLinkItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get icon => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set icon($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIcon() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIcon() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get iconDark => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set iconDark($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIconDark() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIconDark() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get url => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set url($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUrl() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUrl() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  Unread get unread => $_getN(4);\n  @$pb.TagNumber(5)\n  set unread(Unread value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasUnread() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearUnread() => $_clearField(5);\n  @$pb.TagNumber(5)\n  Unread ensureUnread() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  QuickLinkItemType get itemType => $_getN(5);\n  @$pb.TagNumber(6)\n  set itemType(QuickLinkItemType value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasItemType() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearItemType() => $_clearField(6);\n}\n\nclass QuickLinkUnreadItem extends $pb.GeneratedMessage {\n  factory QuickLinkUnreadItem({\n    QuickLinkItemType? itemType,\n    Unread? unread,\n  }) {\n    final result = create();\n    if (itemType != null) result.itemType = itemType;\n    if (unread != null) result.unread = unread;\n    return result;\n  }\n\n  QuickLinkUnreadItem._();\n\n  factory QuickLinkUnreadItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory QuickLinkUnreadItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'QuickLinkUnreadItem',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aE<QuickLinkItemType>(1, _omitFieldNames ? '' : 'itemType',\n        enumValues: QuickLinkItemType.values)\n    ..aOM<Unread>(2, _omitFieldNames ? '' : 'unread', subBuilder: Unread.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QuickLinkUnreadItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QuickLinkUnreadItem copyWith(void Function(QuickLinkUnreadItem) updates) =>\n      super.copyWith((message) => updates(message as QuickLinkUnreadItem))\n          as QuickLinkUnreadItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static QuickLinkUnreadItem create() => QuickLinkUnreadItem._();\n  @$core.override\n  QuickLinkUnreadItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static QuickLinkUnreadItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<QuickLinkUnreadItem>(create);\n  static QuickLinkUnreadItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  QuickLinkItemType get itemType => $_getN(0);\n  @$pb.TagNumber(1)\n  set itemType(QuickLinkItemType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasItemType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearItemType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  Unread get unread => $_getN(1);\n  @$pb.TagNumber(2)\n  set unread(Unread value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUnread() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUnread() => $_clearField(2);\n  @$pb.TagNumber(2)\n  Unread ensureUnread() => $_ensure(1);\n}\n\nclass RestrictedMode extends $pb.GeneratedMessage {\n  factory RestrictedMode({\n    $core.bool? teenagers,\n    $core.bool? lessons,\n  }) {\n    final result = create();\n    if (teenagers != null) result.teenagers = teenagers;\n    if (lessons != null) result.lessons = lessons;\n    return result;\n  }\n\n  RestrictedMode._();\n\n  factory RestrictedMode.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RestrictedMode.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RestrictedMode',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'teenagers')\n    ..aOB(2, _omitFieldNames ? '' : 'lessons')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RestrictedMode clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RestrictedMode copyWith(void Function(RestrictedMode) updates) =>\n      super.copyWith((message) => updates(message as RestrictedMode))\n          as RestrictedMode;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RestrictedMode create() => RestrictedMode._();\n  @$core.override\n  RestrictedMode createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RestrictedMode getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RestrictedMode>(create);\n  static RestrictedMode? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get teenagers => $_getBF(0);\n  @$pb.TagNumber(1)\n  set teenagers($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTeenagers() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTeenagers() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get lessons => $_getBF(1);\n  @$pb.TagNumber(2)\n  set lessons($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLessons() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLessons() => $_clearField(2);\n}\n\nclass SelectItem extends $pb.GeneratedMessage {\n  factory SelectItem({\n    $core.int? itemType,\n    $core.String? text,\n    $core.bool? selected,\n  }) {\n    final result = create();\n    if (itemType != null) result.itemType = itemType;\n    if (text != null) result.text = text;\n    if (selected != null) result.selected = selected;\n    return result;\n  }\n\n  SelectItem._();\n\n  factory SelectItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SelectItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SelectItem',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'itemType')\n    ..aOS(2, _omitFieldNames ? '' : 'text')\n    ..aOB(3, _omitFieldNames ? '' : 'selected')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SelectItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SelectItem copyWith(void Function(SelectItem) updates) =>\n      super.copyWith((message) => updates(message as SelectItem)) as SelectItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SelectItem create() => SelectItem._();\n  @$core.override\n  SelectItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SelectItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SelectItem>(create);\n  static SelectItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get itemType => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set itemType($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasItemType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearItemType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get selected => $_getBF(2);\n  @$pb.TagNumber(3)\n  set selected($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSelected() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSelected() => $_clearField(3);\n}\n\nclass Session extends $pb.GeneratedMessage {\n  factory Session({\n    SessionId? id,\n    SessionInfo? sessionInfo,\n    Unread? unread,\n    MsgSummary? msgSummary,\n    $fixnum.Int64? timestamp,\n    $core.bool? isPinned,\n    $fixnum.Int64? sequenceNumber,\n    $core.bool? isMuted,\n    $core.String? chatUrl,\n    SessionOperation? operation,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? traceParams,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (sessionInfo != null) result.sessionInfo = sessionInfo;\n    if (unread != null) result.unread = unread;\n    if (msgSummary != null) result.msgSummary = msgSummary;\n    if (timestamp != null) result.timestamp = timestamp;\n    if (isPinned != null) result.isPinned = isPinned;\n    if (sequenceNumber != null) result.sequenceNumber = sequenceNumber;\n    if (isMuted != null) result.isMuted = isMuted;\n    if (chatUrl != null) result.chatUrl = chatUrl;\n    if (operation != null) result.operation = operation;\n    if (traceParams != null) result.traceParams.addEntries(traceParams);\n    return result;\n  }\n\n  Session._();\n\n  factory Session.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Session.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Session',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOM<SessionId>(1, _omitFieldNames ? '' : 'id',\n        subBuilder: SessionId.create)\n    ..aOM<SessionInfo>(2, _omitFieldNames ? '' : 'sessionInfo',\n        subBuilder: SessionInfo.create)\n    ..aOM<Unread>(3, _omitFieldNames ? '' : 'unread', subBuilder: Unread.create)\n    ..aOM<MsgSummary>(4, _omitFieldNames ? '' : 'msgSummary',\n        subBuilder: MsgSummary.create)\n    ..aInt64(5, _omitFieldNames ? '' : 'timestamp')\n    ..aOB(6, _omitFieldNames ? '' : 'isPinned')\n    ..aInt64(7, _omitFieldNames ? '' : 'sequenceNumber')\n    ..aOB(8, _omitFieldNames ? '' : 'isMuted')\n    ..aOS(9, _omitFieldNames ? '' : 'chatUrl')\n    ..aOM<SessionOperation>(10, _omitFieldNames ? '' : 'operation',\n        subBuilder: SessionOperation.create)\n    ..m<$core.String, $core.String>(11, _omitFieldNames ? '' : 'traceParams',\n        entryClassName: 'Session.TraceParamsEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.im.v1'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Session clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Session copyWith(void Function(Session) updates) =>\n      super.copyWith((message) => updates(message as Session)) as Session;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Session create() => Session._();\n  @$core.override\n  Session createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Session getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Session>(create);\n  static Session? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  SessionId get id => $_getN(0);\n  @$pb.TagNumber(1)\n  set id(SessionId value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n  @$pb.TagNumber(1)\n  SessionId ensureId() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  SessionInfo get sessionInfo => $_getN(1);\n  @$pb.TagNumber(2)\n  set sessionInfo(SessionInfo value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSessionInfo() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSessionInfo() => $_clearField(2);\n  @$pb.TagNumber(2)\n  SessionInfo ensureSessionInfo() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  Unread get unread => $_getN(2);\n  @$pb.TagNumber(3)\n  set unread(Unread value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUnread() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUnread() => $_clearField(3);\n  @$pb.TagNumber(3)\n  Unread ensureUnread() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  MsgSummary get msgSummary => $_getN(3);\n  @$pb.TagNumber(4)\n  set msgSummary(MsgSummary value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasMsgSummary() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearMsgSummary() => $_clearField(4);\n  @$pb.TagNumber(4)\n  MsgSummary ensureMsgSummary() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get timestamp => $_getI64(4);\n  @$pb.TagNumber(5)\n  set timestamp($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasTimestamp() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearTimestamp() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.bool get isPinned => $_getBF(5);\n  @$pb.TagNumber(6)\n  set isPinned($core.bool value) => $_setBool(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasIsPinned() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearIsPinned() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get sequenceNumber => $_getI64(6);\n  @$pb.TagNumber(7)\n  set sequenceNumber($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasSequenceNumber() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearSequenceNumber() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.bool get isMuted => $_getBF(7);\n  @$pb.TagNumber(8)\n  set isMuted($core.bool value) => $_setBool(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasIsMuted() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearIsMuted() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get chatUrl => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set chatUrl($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasChatUrl() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearChatUrl() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  SessionOperation get operation => $_getN(9);\n  @$pb.TagNumber(10)\n  set operation(SessionOperation value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasOperation() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearOperation() => $_clearField(10);\n  @$pb.TagNumber(10)\n  SessionOperation ensureOperation() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  $pb.PbMap<$core.String, $core.String> get traceParams => $_getMap(10);\n}\n\nenum SessionId_Id { privateId, groupId, foldId, systemId, customerId, notSet }\n\nclass SessionId extends $pb.GeneratedMessage {\n  factory SessionId({\n    PrivateId? privateId,\n    GroupId? groupId,\n    FoldId? foldId,\n    SystemId? systemId,\n    CustomerId? customerId,\n  }) {\n    final result = create();\n    if (privateId != null) result.privateId = privateId;\n    if (groupId != null) result.groupId = groupId;\n    if (foldId != null) result.foldId = foldId;\n    if (systemId != null) result.systemId = systemId;\n    if (customerId != null) result.customerId = customerId;\n    return result;\n  }\n\n  SessionId._();\n\n  factory SessionId.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SessionId.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, SessionId_Id> _SessionId_IdByTag = {\n    1: SessionId_Id.privateId,\n    2: SessionId_Id.groupId,\n    3: SessionId_Id.foldId,\n    4: SessionId_Id.systemId,\n    5: SessionId_Id.customerId,\n    0: SessionId_Id.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SessionId',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [1, 2, 3, 4, 5])\n    ..aOM<PrivateId>(1, _omitFieldNames ? '' : 'privateId',\n        subBuilder: PrivateId.create)\n    ..aOM<GroupId>(2, _omitFieldNames ? '' : 'groupId',\n        subBuilder: GroupId.create)\n    ..aOM<FoldId>(3, _omitFieldNames ? '' : 'foldId', subBuilder: FoldId.create)\n    ..aOM<SystemId>(4, _omitFieldNames ? '' : 'systemId',\n        subBuilder: SystemId.create)\n    ..aOM<CustomerId>(5, _omitFieldNames ? '' : 'customerId',\n        subBuilder: CustomerId.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionId clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionId copyWith(void Function(SessionId) updates) =>\n      super.copyWith((message) => updates(message as SessionId)) as SessionId;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SessionId create() => SessionId._();\n  @$core.override\n  SessionId createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SessionId getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<SessionId>(create);\n  static SessionId? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  SessionId_Id whichId() => _SessionId_IdByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(1)\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  void clearId() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  PrivateId get privateId => $_getN(0);\n  @$pb.TagNumber(1)\n  set privateId(PrivateId value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPrivateId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPrivateId() => $_clearField(1);\n  @$pb.TagNumber(1)\n  PrivateId ensurePrivateId() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  GroupId get groupId => $_getN(1);\n  @$pb.TagNumber(2)\n  set groupId(GroupId value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasGroupId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearGroupId() => $_clearField(2);\n  @$pb.TagNumber(2)\n  GroupId ensureGroupId() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  FoldId get foldId => $_getN(2);\n  @$pb.TagNumber(3)\n  set foldId(FoldId value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFoldId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFoldId() => $_clearField(3);\n  @$pb.TagNumber(3)\n  FoldId ensureFoldId() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  SystemId get systemId => $_getN(3);\n  @$pb.TagNumber(4)\n  set systemId(SystemId value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSystemId() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSystemId() => $_clearField(4);\n  @$pb.TagNumber(4)\n  SystemId ensureSystemId() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  CustomerId get customerId => $_getN(4);\n  @$pb.TagNumber(5)\n  set customerId(CustomerId value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCustomerId() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCustomerId() => $_clearField(5);\n  @$pb.TagNumber(5)\n  CustomerId ensureCustomerId() => $_ensure(4);\n}\n\nclass SessionInfo extends $pb.GeneratedMessage {\n  factory SessionInfo({\n    $core.String? sessionName,\n    $1.NameRender? nameRender,\n    $0.AvatarItem? avatar,\n    $core.String? vipInfo,\n    UserLabel? userLabel,\n    $core.bool? isLive,\n  }) {\n    final result = create();\n    if (sessionName != null) result.sessionName = sessionName;\n    if (nameRender != null) result.nameRender = nameRender;\n    if (avatar != null) result.avatar = avatar;\n    if (vipInfo != null) result.vipInfo = vipInfo;\n    if (userLabel != null) result.userLabel = userLabel;\n    if (isLive != null) result.isLive = isLive;\n    return result;\n  }\n\n  SessionInfo._();\n\n  factory SessionInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SessionInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SessionInfo',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'sessionName')\n    ..aOM<$1.NameRender>(2, _omitFieldNames ? '' : 'nameRender',\n        subBuilder: $1.NameRender.create)\n    ..aOM<$0.AvatarItem>(3, _omitFieldNames ? '' : 'avatar',\n        subBuilder: $0.AvatarItem.create)\n    ..aOS(4, _omitFieldNames ? '' : 'vipInfo')\n    ..aOM<UserLabel>(5, _omitFieldNames ? '' : 'userLabel',\n        subBuilder: UserLabel.create)\n    ..aOB(6, _omitFieldNames ? '' : 'isLive')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionInfo copyWith(void Function(SessionInfo) updates) =>\n      super.copyWith((message) => updates(message as SessionInfo))\n          as SessionInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SessionInfo create() => SessionInfo._();\n  @$core.override\n  SessionInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SessionInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SessionInfo>(create);\n  static SessionInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get sessionName => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set sessionName($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSessionName() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSessionName() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $1.NameRender get nameRender => $_getN(1);\n  @$pb.TagNumber(2)\n  set nameRender($1.NameRender value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasNameRender() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearNameRender() => $_clearField(2);\n  @$pb.TagNumber(2)\n  $1.NameRender ensureNameRender() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $0.AvatarItem get avatar => $_getN(2);\n  @$pb.TagNumber(3)\n  set avatar($0.AvatarItem value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAvatar() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAvatar() => $_clearField(3);\n  @$pb.TagNumber(3)\n  $0.AvatarItem ensureAvatar() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.String get vipInfo => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set vipInfo($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasVipInfo() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearVipInfo() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  UserLabel get userLabel => $_getN(4);\n  @$pb.TagNumber(5)\n  set userLabel(UserLabel value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasUserLabel() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearUserLabel() => $_clearField(5);\n  @$pb.TagNumber(5)\n  UserLabel ensureUserLabel() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.bool get isLive => $_getBF(5);\n  @$pb.TagNumber(6)\n  set isLive($core.bool value) => $_setBool(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasIsLive() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearIsLive() => $_clearField(6);\n}\n\nclass SessionListExtraInfo extends $pb.GeneratedMessage {\n  factory SessionListExtraInfo({\n    AutoReplyToast? autoReplyToast,\n    $core.bool? showAntiHarassmentPopup,\n    $core.String? customerHintTitle,\n    BehaviorAlertToast? behaviorAlertToast,\n  }) {\n    final result = create();\n    if (autoReplyToast != null) result.autoReplyToast = autoReplyToast;\n    if (showAntiHarassmentPopup != null)\n      result.showAntiHarassmentPopup = showAntiHarassmentPopup;\n    if (customerHintTitle != null) result.customerHintTitle = customerHintTitle;\n    if (behaviorAlertToast != null)\n      result.behaviorAlertToast = behaviorAlertToast;\n    return result;\n  }\n\n  SessionListExtraInfo._();\n\n  factory SessionListExtraInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SessionListExtraInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SessionListExtraInfo',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOM<AutoReplyToast>(1, _omitFieldNames ? '' : 'autoReplyToast',\n        subBuilder: AutoReplyToast.create)\n    ..aOB(2, _omitFieldNames ? '' : 'showAntiHarassmentPopup')\n    ..aOS(3, _omitFieldNames ? '' : 'customerHintTitle')\n    ..aOM<BehaviorAlertToast>(4, _omitFieldNames ? '' : 'behaviorAlertToast',\n        subBuilder: BehaviorAlertToast.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionListExtraInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionListExtraInfo copyWith(void Function(SessionListExtraInfo) updates) =>\n      super.copyWith((message) => updates(message as SessionListExtraInfo))\n          as SessionListExtraInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SessionListExtraInfo create() => SessionListExtraInfo._();\n  @$core.override\n  SessionListExtraInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SessionListExtraInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SessionListExtraInfo>(create);\n  static SessionListExtraInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  AutoReplyToast get autoReplyToast => $_getN(0);\n  @$pb.TagNumber(1)\n  set autoReplyToast(AutoReplyToast value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAutoReplyToast() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAutoReplyToast() => $_clearField(1);\n  @$pb.TagNumber(1)\n  AutoReplyToast ensureAutoReplyToast() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.bool get showAntiHarassmentPopup => $_getBF(1);\n  @$pb.TagNumber(2)\n  set showAntiHarassmentPopup($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasShowAntiHarassmentPopup() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearShowAntiHarassmentPopup() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get customerHintTitle => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set customerHintTitle($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCustomerHintTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCustomerHintTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  BehaviorAlertToast get behaviorAlertToast => $_getN(3);\n  @$pb.TagNumber(4)\n  set behaviorAlertToast(BehaviorAlertToast value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBehaviorAlertToast() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBehaviorAlertToast() => $_clearField(4);\n  @$pb.TagNumber(4)\n  BehaviorAlertToast ensureBehaviorAlertToast() => $_ensure(3);\n}\n\nclass SessionListUpdateReply extends $pb.GeneratedMessage {\n  factory SessionListUpdateReply({\n    $core.Iterable<Session>? sessions,\n    UpdateSessionParams? updateSessionParams,\n  }) {\n    final result = create();\n    if (sessions != null) result.sessions.addAll(sessions);\n    if (updateSessionParams != null)\n      result.updateSessionParams = updateSessionParams;\n    return result;\n  }\n\n  SessionListUpdateReply._();\n\n  factory SessionListUpdateReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SessionListUpdateReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SessionListUpdateReply',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..pPM<Session>(1, _omitFieldNames ? '' : 'sessions',\n        subBuilder: Session.create)\n    ..aOM<UpdateSessionParams>(2, _omitFieldNames ? '' : 'updateSessionParams',\n        subBuilder: UpdateSessionParams.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionListUpdateReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionListUpdateReply copyWith(\n          void Function(SessionListUpdateReply) updates) =>\n      super.copyWith((message) => updates(message as SessionListUpdateReply))\n          as SessionListUpdateReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SessionListUpdateReply create() => SessionListUpdateReply._();\n  @$core.override\n  SessionListUpdateReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SessionListUpdateReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SessionListUpdateReply>(create);\n  static SessionListUpdateReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<Session> get sessions => $_getList(0);\n\n  @$pb.TagNumber(2)\n  UpdateSessionParams get updateSessionParams => $_getN(1);\n  @$pb.TagNumber(2)\n  set updateSessionParams(UpdateSessionParams value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUpdateSessionParams() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUpdateSessionParams() => $_clearField(2);\n  @$pb.TagNumber(2)\n  UpdateSessionParams ensureUpdateSessionParams() => $_ensure(1);\n}\n\nclass SessionListUpdateReq extends $pb.GeneratedMessage {\n  factory SessionListUpdateReq({\n    RestrictedMode? restrictedMode,\n    UpdateSessionParams? updateParams,\n    SessionPageType? pageType,\n    SessionFilterType? filterType,\n  }) {\n    final result = create();\n    if (restrictedMode != null) result.restrictedMode = restrictedMode;\n    if (updateParams != null) result.updateParams = updateParams;\n    if (pageType != null) result.pageType = pageType;\n    if (filterType != null) result.filterType = filterType;\n    return result;\n  }\n\n  SessionListUpdateReq._();\n\n  factory SessionListUpdateReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SessionListUpdateReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SessionListUpdateReq',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOM<RestrictedMode>(1, _omitFieldNames ? '' : 'restrictedMode',\n        subBuilder: RestrictedMode.create)\n    ..aOM<UpdateSessionParams>(2, _omitFieldNames ? '' : 'updateParams',\n        subBuilder: UpdateSessionParams.create)\n    ..aE<SessionPageType>(3, _omitFieldNames ? '' : 'pageType',\n        enumValues: SessionPageType.values)\n    ..aE<SessionFilterType>(4, _omitFieldNames ? '' : 'filterType',\n        enumValues: SessionFilterType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionListUpdateReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionListUpdateReq copyWith(void Function(SessionListUpdateReq) updates) =>\n      super.copyWith((message) => updates(message as SessionListUpdateReq))\n          as SessionListUpdateReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SessionListUpdateReq create() => SessionListUpdateReq._();\n  @$core.override\n  SessionListUpdateReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SessionListUpdateReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SessionListUpdateReq>(create);\n  static SessionListUpdateReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  RestrictedMode get restrictedMode => $_getN(0);\n  @$pb.TagNumber(1)\n  set restrictedMode(RestrictedMode value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasRestrictedMode() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRestrictedMode() => $_clearField(1);\n  @$pb.TagNumber(1)\n  RestrictedMode ensureRestrictedMode() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  UpdateSessionParams get updateParams => $_getN(1);\n  @$pb.TagNumber(2)\n  set updateParams(UpdateSessionParams value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUpdateParams() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUpdateParams() => $_clearField(2);\n  @$pb.TagNumber(2)\n  UpdateSessionParams ensureUpdateParams() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  SessionPageType get pageType => $_getN(2);\n  @$pb.TagNumber(3)\n  set pageType(SessionPageType value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPageType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPageType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  SessionFilterType get filterType => $_getN(3);\n  @$pb.TagNumber(4)\n  set filterType(SessionFilterType value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFilterType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFilterType() => $_clearField(4);\n}\n\nclass SessionMainReply extends $pb.GeneratedMessage {\n  factory SessionMainReply({\n    PaginationParams? paginationParams,\n    UpdateSessionParams? updateSessionParams,\n    QuickLinkConfig? quickLinkConfig,\n    FilterConfig? filterConfig,\n    $core.Iterable<Session>? sessions,\n    $core.Iterable<ThreeDotItem>? threeDotItems,\n    $core.Iterable<ThreeDotItem>? outsideItem,\n    SessionListExtraInfo? extraInfo,\n  }) {\n    final result = create();\n    if (paginationParams != null) result.paginationParams = paginationParams;\n    if (updateSessionParams != null)\n      result.updateSessionParams = updateSessionParams;\n    if (quickLinkConfig != null) result.quickLinkConfig = quickLinkConfig;\n    if (filterConfig != null) result.filterConfig = filterConfig;\n    if (sessions != null) result.sessions.addAll(sessions);\n    if (threeDotItems != null) result.threeDotItems.addAll(threeDotItems);\n    if (outsideItem != null) result.outsideItem.addAll(outsideItem);\n    if (extraInfo != null) result.extraInfo = extraInfo;\n    return result;\n  }\n\n  SessionMainReply._();\n\n  factory SessionMainReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SessionMainReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SessionMainReply',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOM<PaginationParams>(1, _omitFieldNames ? '' : 'paginationParams',\n        subBuilder: PaginationParams.create)\n    ..aOM<UpdateSessionParams>(2, _omitFieldNames ? '' : 'updateSessionParams',\n        subBuilder: UpdateSessionParams.create)\n    ..aOM<QuickLinkConfig>(3, _omitFieldNames ? '' : 'quickLinkConfig',\n        subBuilder: QuickLinkConfig.create)\n    ..aOM<FilterConfig>(4, _omitFieldNames ? '' : 'filterConfig',\n        subBuilder: FilterConfig.create)\n    ..pPM<Session>(5, _omitFieldNames ? '' : 'sessions',\n        subBuilder: Session.create)\n    ..pPM<ThreeDotItem>(6, _omitFieldNames ? '' : 'threeDotItems',\n        subBuilder: ThreeDotItem.create)\n    ..pPM<ThreeDotItem>(7, _omitFieldNames ? '' : 'outsideItem',\n        subBuilder: ThreeDotItem.create)\n    ..aOM<SessionListExtraInfo>(8, _omitFieldNames ? '' : 'extraInfo',\n        subBuilder: SessionListExtraInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionMainReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionMainReply copyWith(void Function(SessionMainReply) updates) =>\n      super.copyWith((message) => updates(message as SessionMainReply))\n          as SessionMainReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SessionMainReply create() => SessionMainReply._();\n  @$core.override\n  SessionMainReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SessionMainReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SessionMainReply>(create);\n  static SessionMainReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PaginationParams get paginationParams => $_getN(0);\n  @$pb.TagNumber(1)\n  set paginationParams(PaginationParams value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPaginationParams() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPaginationParams() => $_clearField(1);\n  @$pb.TagNumber(1)\n  PaginationParams ensurePaginationParams() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  UpdateSessionParams get updateSessionParams => $_getN(1);\n  @$pb.TagNumber(2)\n  set updateSessionParams(UpdateSessionParams value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUpdateSessionParams() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUpdateSessionParams() => $_clearField(2);\n  @$pb.TagNumber(2)\n  UpdateSessionParams ensureUpdateSessionParams() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  QuickLinkConfig get quickLinkConfig => $_getN(2);\n  @$pb.TagNumber(3)\n  set quickLinkConfig(QuickLinkConfig value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasQuickLinkConfig() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearQuickLinkConfig() => $_clearField(3);\n  @$pb.TagNumber(3)\n  QuickLinkConfig ensureQuickLinkConfig() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  FilterConfig get filterConfig => $_getN(3);\n  @$pb.TagNumber(4)\n  set filterConfig(FilterConfig value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFilterConfig() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFilterConfig() => $_clearField(4);\n  @$pb.TagNumber(4)\n  FilterConfig ensureFilterConfig() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $pb.PbList<Session> get sessions => $_getList(4);\n\n  @$pb.TagNumber(6)\n  $pb.PbList<ThreeDotItem> get threeDotItems => $_getList(5);\n\n  @$pb.TagNumber(7)\n  $pb.PbList<ThreeDotItem> get outsideItem => $_getList(6);\n\n  @$pb.TagNumber(8)\n  SessionListExtraInfo get extraInfo => $_getN(7);\n  @$pb.TagNumber(8)\n  set extraInfo(SessionListExtraInfo value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasExtraInfo() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearExtraInfo() => $_clearField(8);\n  @$pb.TagNumber(8)\n  SessionListExtraInfo ensureExtraInfo() => $_ensure(7);\n}\n\nclass SessionMainReq extends $pb.GeneratedMessage {\n  factory SessionMainReq({\n    RestrictedMode? restrictedMode,\n    PaginationParams? paginationParams,\n    SessionFilterType? filterType,\n  }) {\n    final result = create();\n    if (restrictedMode != null) result.restrictedMode = restrictedMode;\n    if (paginationParams != null) result.paginationParams = paginationParams;\n    if (filterType != null) result.filterType = filterType;\n    return result;\n  }\n\n  SessionMainReq._();\n\n  factory SessionMainReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SessionMainReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SessionMainReq',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOM<RestrictedMode>(1, _omitFieldNames ? '' : 'restrictedMode',\n        subBuilder: RestrictedMode.create)\n    ..aOM<PaginationParams>(2, _omitFieldNames ? '' : 'paginationParams',\n        subBuilder: PaginationParams.create)\n    ..aE<SessionFilterType>(3, _omitFieldNames ? '' : 'filterType',\n        enumValues: SessionFilterType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionMainReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionMainReq copyWith(void Function(SessionMainReq) updates) =>\n      super.copyWith((message) => updates(message as SessionMainReq))\n          as SessionMainReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SessionMainReq create() => SessionMainReq._();\n  @$core.override\n  SessionMainReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SessionMainReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SessionMainReq>(create);\n  static SessionMainReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  RestrictedMode get restrictedMode => $_getN(0);\n  @$pb.TagNumber(1)\n  set restrictedMode(RestrictedMode value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasRestrictedMode() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRestrictedMode() => $_clearField(1);\n  @$pb.TagNumber(1)\n  RestrictedMode ensureRestrictedMode() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  PaginationParams get paginationParams => $_getN(1);\n  @$pb.TagNumber(2)\n  set paginationParams(PaginationParams value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPaginationParams() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPaginationParams() => $_clearField(2);\n  @$pb.TagNumber(2)\n  PaginationParams ensurePaginationParams() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  SessionFilterType get filterType => $_getN(2);\n  @$pb.TagNumber(3)\n  set filterType(SessionFilterType value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFilterType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFilterType() => $_clearField(3);\n}\n\nclass SessionOperation extends $pb.GeneratedMessage {\n  factory SessionOperation({\n    OperationContent? pin,\n    OperationContent? unpin,\n    OperationContent? delete,\n    OperationContent? clearUnread,\n    OperationContent? unblock,\n  }) {\n    final result = create();\n    if (pin != null) result.pin = pin;\n    if (unpin != null) result.unpin = unpin;\n    if (delete != null) result.delete = delete;\n    if (clearUnread != null) result.clearUnread = clearUnread;\n    if (unblock != null) result.unblock = unblock;\n    return result;\n  }\n\n  SessionOperation._();\n\n  factory SessionOperation.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SessionOperation.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SessionOperation',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOM<OperationContent>(1, _omitFieldNames ? '' : 'pin',\n        subBuilder: OperationContent.create)\n    ..aOM<OperationContent>(2, _omitFieldNames ? '' : 'unpin',\n        subBuilder: OperationContent.create)\n    ..aOM<OperationContent>(3, _omitFieldNames ? '' : 'delete',\n        subBuilder: OperationContent.create)\n    ..aOM<OperationContent>(4, _omitFieldNames ? '' : 'clearUnread',\n        subBuilder: OperationContent.create)\n    ..aOM<OperationContent>(5, _omitFieldNames ? '' : 'unblock',\n        subBuilder: OperationContent.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionOperation clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionOperation copyWith(void Function(SessionOperation) updates) =>\n      super.copyWith((message) => updates(message as SessionOperation))\n          as SessionOperation;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SessionOperation create() => SessionOperation._();\n  @$core.override\n  SessionOperation createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SessionOperation getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SessionOperation>(create);\n  static SessionOperation? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  OperationContent get pin => $_getN(0);\n  @$pb.TagNumber(1)\n  set pin(OperationContent value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPin() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPin() => $_clearField(1);\n  @$pb.TagNumber(1)\n  OperationContent ensurePin() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  OperationContent get unpin => $_getN(1);\n  @$pb.TagNumber(2)\n  set unpin(OperationContent value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUnpin() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUnpin() => $_clearField(2);\n  @$pb.TagNumber(2)\n  OperationContent ensureUnpin() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  OperationContent get delete => $_getN(2);\n  @$pb.TagNumber(3)\n  set delete(OperationContent value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDelete() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDelete() => $_clearField(3);\n  @$pb.TagNumber(3)\n  OperationContent ensureDelete() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  OperationContent get clearUnread => $_getN(3);\n  @$pb.TagNumber(4)\n  set clearUnread(OperationContent value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasClearUnread() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearClearUnread() => $_clearField(4);\n  @$pb.TagNumber(4)\n  OperationContent ensureClearUnread() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  OperationContent get unblock => $_getN(4);\n  @$pb.TagNumber(5)\n  set unblock(OperationContent value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasUnblock() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearUnblock() => $_clearField(5);\n  @$pb.TagNumber(5)\n  OperationContent ensureUnblock() => $_ensure(4);\n}\n\nclass SessionSecondaryReply extends $pb.GeneratedMessage {\n  factory SessionSecondaryReply({\n    PaginationParams? paginationParams,\n    UpdateSessionParams? updateSessionParams,\n    $core.Iterable<Session>? sessions,\n    $core.Iterable<ThreeDotItem>? threeDotItems,\n    $core.Iterable<ThreeDotItem>? outsideItem,\n  }) {\n    final result = create();\n    if (paginationParams != null) result.paginationParams = paginationParams;\n    if (updateSessionParams != null)\n      result.updateSessionParams = updateSessionParams;\n    if (sessions != null) result.sessions.addAll(sessions);\n    if (threeDotItems != null) result.threeDotItems.addAll(threeDotItems);\n    if (outsideItem != null) result.outsideItem.addAll(outsideItem);\n    return result;\n  }\n\n  SessionSecondaryReply._();\n\n  factory SessionSecondaryReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SessionSecondaryReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SessionSecondaryReply',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOM<PaginationParams>(1, _omitFieldNames ? '' : 'paginationParams',\n        subBuilder: PaginationParams.create)\n    ..aOM<UpdateSessionParams>(2, _omitFieldNames ? '' : 'updateSessionParams',\n        subBuilder: UpdateSessionParams.create)\n    ..pPM<Session>(3, _omitFieldNames ? '' : 'sessions',\n        subBuilder: Session.create)\n    ..pPM<ThreeDotItem>(4, _omitFieldNames ? '' : 'threeDotItems',\n        subBuilder: ThreeDotItem.create)\n    ..pPM<ThreeDotItem>(5, _omitFieldNames ? '' : 'outsideItem',\n        subBuilder: ThreeDotItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionSecondaryReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionSecondaryReply copyWith(\n          void Function(SessionSecondaryReply) updates) =>\n      super.copyWith((message) => updates(message as SessionSecondaryReply))\n          as SessionSecondaryReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SessionSecondaryReply create() => SessionSecondaryReply._();\n  @$core.override\n  SessionSecondaryReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SessionSecondaryReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SessionSecondaryReply>(create);\n  static SessionSecondaryReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PaginationParams get paginationParams => $_getN(0);\n  @$pb.TagNumber(1)\n  set paginationParams(PaginationParams value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPaginationParams() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPaginationParams() => $_clearField(1);\n  @$pb.TagNumber(1)\n  PaginationParams ensurePaginationParams() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  UpdateSessionParams get updateSessionParams => $_getN(1);\n  @$pb.TagNumber(2)\n  set updateSessionParams(UpdateSessionParams value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUpdateSessionParams() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUpdateSessionParams() => $_clearField(2);\n  @$pb.TagNumber(2)\n  UpdateSessionParams ensureUpdateSessionParams() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<Session> get sessions => $_getList(2);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<ThreeDotItem> get threeDotItems => $_getList(3);\n\n  @$pb.TagNumber(5)\n  $pb.PbList<ThreeDotItem> get outsideItem => $_getList(4);\n}\n\nclass SessionSecondaryReq extends $pb.GeneratedMessage {\n  factory SessionSecondaryReq({\n    RestrictedMode? restrictedMode,\n    PaginationParams? paginationParams,\n    SessionPageType? pageType,\n  }) {\n    final result = create();\n    if (restrictedMode != null) result.restrictedMode = restrictedMode;\n    if (paginationParams != null) result.paginationParams = paginationParams;\n    if (pageType != null) result.pageType = pageType;\n    return result;\n  }\n\n  SessionSecondaryReq._();\n\n  factory SessionSecondaryReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SessionSecondaryReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SessionSecondaryReq',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOM<RestrictedMode>(1, _omitFieldNames ? '' : 'restrictedMode',\n        subBuilder: RestrictedMode.create)\n    ..aOM<PaginationParams>(2, _omitFieldNames ? '' : 'paginationParams',\n        subBuilder: PaginationParams.create)\n    ..aE<SessionPageType>(3, _omitFieldNames ? '' : 'pageType',\n        enumValues: SessionPageType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionSecondaryReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionSecondaryReq copyWith(void Function(SessionSecondaryReq) updates) =>\n      super.copyWith((message) => updates(message as SessionSecondaryReq))\n          as SessionSecondaryReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SessionSecondaryReq create() => SessionSecondaryReq._();\n  @$core.override\n  SessionSecondaryReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SessionSecondaryReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SessionSecondaryReq>(create);\n  static SessionSecondaryReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  RestrictedMode get restrictedMode => $_getN(0);\n  @$pb.TagNumber(1)\n  set restrictedMode(RestrictedMode value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasRestrictedMode() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRestrictedMode() => $_clearField(1);\n  @$pb.TagNumber(1)\n  RestrictedMode ensureRestrictedMode() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  PaginationParams get paginationParams => $_getN(1);\n  @$pb.TagNumber(2)\n  set paginationParams(PaginationParams value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPaginationParams() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPaginationParams() => $_clearField(2);\n  @$pb.TagNumber(2)\n  PaginationParams ensurePaginationParams() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  SessionPageType get pageType => $_getN(2);\n  @$pb.TagNumber(3)\n  set pageType(SessionPageType value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPageType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPageType() => $_clearField(3);\n}\n\nclass SessionUpdateReply extends $pb.GeneratedMessage {\n  factory SessionUpdateReply({\n    Session? session,\n  }) {\n    final result = create();\n    if (session != null) result.session = session;\n    return result;\n  }\n\n  SessionUpdateReply._();\n\n  factory SessionUpdateReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SessionUpdateReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SessionUpdateReply',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOM<Session>(1, _omitFieldNames ? '' : 'session',\n        subBuilder: Session.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionUpdateReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionUpdateReply copyWith(void Function(SessionUpdateReply) updates) =>\n      super.copyWith((message) => updates(message as SessionUpdateReply))\n          as SessionUpdateReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SessionUpdateReply create() => SessionUpdateReply._();\n  @$core.override\n  SessionUpdateReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SessionUpdateReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SessionUpdateReply>(create);\n  static SessionUpdateReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Session get session => $_getN(0);\n  @$pb.TagNumber(1)\n  set session(Session value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSession() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSession() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Session ensureSession() => $_ensure(0);\n}\n\nclass SessionUpdateReq extends $pb.GeneratedMessage {\n  factory SessionUpdateReq({\n    SessionId? sessionId,\n    SessionPageType? pageType,\n  }) {\n    final result = create();\n    if (sessionId != null) result.sessionId = sessionId;\n    if (pageType != null) result.pageType = pageType;\n    return result;\n  }\n\n  SessionUpdateReq._();\n\n  factory SessionUpdateReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SessionUpdateReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SessionUpdateReq',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOM<SessionId>(1, _omitFieldNames ? '' : 'sessionId',\n        subBuilder: SessionId.create)\n    ..aE<SessionPageType>(2, _omitFieldNames ? '' : 'pageType',\n        enumValues: SessionPageType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionUpdateReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionUpdateReq copyWith(void Function(SessionUpdateReq) updates) =>\n      super.copyWith((message) => updates(message as SessionUpdateReq))\n          as SessionUpdateReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SessionUpdateReq create() => SessionUpdateReq._();\n  @$core.override\n  SessionUpdateReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SessionUpdateReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SessionUpdateReq>(create);\n  static SessionUpdateReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  SessionId get sessionId => $_getN(0);\n  @$pb.TagNumber(1)\n  set sessionId(SessionId value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSessionId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSessionId() => $_clearField(1);\n  @$pb.TagNumber(1)\n  SessionId ensureSessionId() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  SessionPageType get pageType => $_getN(1);\n  @$pb.TagNumber(2)\n  set pageType(SessionPageType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPageType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPageType() => $_clearField(2);\n}\n\nclass SessionsFilter extends $pb.GeneratedMessage {\n  factory SessionsFilter({\n    SessionFilterType? stype,\n    $core.String? title,\n  }) {\n    final result = create();\n    if (stype != null) result.stype = stype;\n    if (title != null) result.title = title;\n    return result;\n  }\n\n  SessionsFilter._();\n\n  factory SessionsFilter.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SessionsFilter.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SessionsFilter',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aE<SessionFilterType>(1, _omitFieldNames ? '' : 'stype',\n        enumValues: SessionFilterType.values)\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionsFilter clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionsFilter copyWith(void Function(SessionsFilter) updates) =>\n      super.copyWith((message) => updates(message as SessionsFilter))\n          as SessionsFilter;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SessionsFilter create() => SessionsFilter._();\n  @$core.override\n  SessionsFilter createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SessionsFilter getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SessionsFilter>(create);\n  static SessionsFilter? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  SessionFilterType get stype => $_getN(0);\n  @$pb.TagNumber(1)\n  set stype(SessionFilterType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStype() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStype() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n}\n\nclass SetImSettingsReply extends $pb.GeneratedMessage {\n  factory SetImSettingsReply({\n    $core.String? toast,\n  }) {\n    final result = create();\n    if (toast != null) result.toast = toast;\n    return result;\n  }\n\n  SetImSettingsReply._();\n\n  factory SetImSettingsReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SetImSettingsReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SetImSettingsReply',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'toast')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SetImSettingsReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SetImSettingsReply copyWith(void Function(SetImSettingsReply) updates) =>\n      super.copyWith((message) => updates(message as SetImSettingsReply))\n          as SetImSettingsReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SetImSettingsReply create() => SetImSettingsReply._();\n  @$core.override\n  SetImSettingsReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SetImSettingsReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SetImSettingsReply>(create);\n  static SetImSettingsReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get toast => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set toast($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasToast() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearToast() => $_clearField(1);\n}\n\nclass SetImSettingsReq extends $pb.GeneratedMessage {\n  factory SetImSettingsReq({\n    $core.Iterable<$core.MapEntry<$core.int, Setting>>? settings,\n  }) {\n    final result = create();\n    if (settings != null) result.settings.addEntries(settings);\n    return result;\n  }\n\n  SetImSettingsReq._();\n\n  factory SetImSettingsReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SetImSettingsReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SetImSettingsReq',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..m<$core.int, Setting>(1, _omitFieldNames ? '' : 'settings',\n        entryClassName: 'SetImSettingsReq.SettingsEntry',\n        keyFieldType: $pb.PbFieldType.O3,\n        valueFieldType: $pb.PbFieldType.OM,\n        valueCreator: Setting.create,\n        valueDefaultOrMaker: Setting.getDefault,\n        packageName: const $pb.PackageName('bilibili.app.im.v1'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SetImSettingsReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SetImSettingsReq copyWith(void Function(SetImSettingsReq) updates) =>\n      super.copyWith((message) => updates(message as SetImSettingsReq))\n          as SetImSettingsReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SetImSettingsReq create() => SetImSettingsReq._();\n  @$core.override\n  SetImSettingsReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SetImSettingsReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SetImSettingsReq>(create);\n  static SetImSettingsReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbMap<$core.int, Setting> get settings => $_getMap(0);\n}\n\nenum Setting_Content { switch_1, select, redirect, text, notSet }\n\nclass Setting extends $pb.GeneratedMessage {\n  factory Setting({\n    SettingSwitch? switch_1,\n    SettingSelect? select,\n    SettingRedirect? redirect,\n    SettingText? text,\n  }) {\n    final result = create();\n    if (switch_1 != null) result.switch_1 = switch_1;\n    if (select != null) result.select = select;\n    if (redirect != null) result.redirect = redirect;\n    if (text != null) result.text = text;\n    return result;\n  }\n\n  Setting._();\n\n  factory Setting.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Setting.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, Setting_Content> _Setting_ContentByTag = {\n    1: Setting_Content.switch_1,\n    2: Setting_Content.select,\n    3: Setting_Content.redirect,\n    4: Setting_Content.text,\n    0: Setting_Content.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Setting',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [1, 2, 3, 4])\n    ..aOM<SettingSwitch>(1, _omitFieldNames ? '' : 'switch',\n        subBuilder: SettingSwitch.create)\n    ..aOM<SettingSelect>(2, _omitFieldNames ? '' : 'select',\n        subBuilder: SettingSelect.create)\n    ..aOM<SettingRedirect>(3, _omitFieldNames ? '' : 'redirect',\n        subBuilder: SettingRedirect.create)\n    ..aOM<SettingText>(4, _omitFieldNames ? '' : 'text',\n        subBuilder: SettingText.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Setting clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Setting copyWith(void Function(Setting) updates) =>\n      super.copyWith((message) => updates(message as Setting)) as Setting;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Setting create() => Setting._();\n  @$core.override\n  Setting createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Setting getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Setting>(create);\n  static Setting? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  Setting_Content whichContent() => _Setting_ContentByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(1)\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  void clearContent() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  SettingSwitch get switch_1 => $_getN(0);\n  @$pb.TagNumber(1)\n  set switch_1(SettingSwitch value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSwitch_1() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSwitch_1() => $_clearField(1);\n  @$pb.TagNumber(1)\n  SettingSwitch ensureSwitch_1() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  SettingSelect get select => $_getN(1);\n  @$pb.TagNumber(2)\n  set select(SettingSelect value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSelect() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSelect() => $_clearField(2);\n  @$pb.TagNumber(2)\n  SettingSelect ensureSelect() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  SettingRedirect get redirect => $_getN(2);\n  @$pb.TagNumber(3)\n  set redirect(SettingRedirect value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRedirect() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRedirect() => $_clearField(3);\n  @$pb.TagNumber(3)\n  SettingRedirect ensureRedirect() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  SettingText get text => $_getN(3);\n  @$pb.TagNumber(4)\n  set text(SettingText value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasText() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearText() => $_clearField(4);\n  @$pb.TagNumber(4)\n  SettingText ensureText() => $_ensure(3);\n}\n\nenum SettingRedirect_Content {\n  settingPage,\n  otherPage,\n  popup,\n  windowSelect,\n  notSet\n}\n\nclass SettingRedirect extends $pb.GeneratedMessage {\n  factory SettingRedirect({\n    redirect2SettingPage? settingPage,\n    redirect2OtherPage? otherPage,\n    $core.String? title,\n    $core.String? subtitle,\n    $core.String? selectedSummary,\n    redirect2Popup? popup,\n    redirectWindowSelect? windowSelect,\n  }) {\n    final result = create();\n    if (settingPage != null) result.settingPage = settingPage;\n    if (otherPage != null) result.otherPage = otherPage;\n    if (title != null) result.title = title;\n    if (subtitle != null) result.subtitle = subtitle;\n    if (selectedSummary != null) result.selectedSummary = selectedSummary;\n    if (popup != null) result.popup = popup;\n    if (windowSelect != null) result.windowSelect = windowSelect;\n    return result;\n  }\n\n  SettingRedirect._();\n\n  factory SettingRedirect.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SettingRedirect.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, SettingRedirect_Content>\n      _SettingRedirect_ContentByTag = {\n    1: SettingRedirect_Content.settingPage,\n    2: SettingRedirect_Content.otherPage,\n    6: SettingRedirect_Content.popup,\n    7: SettingRedirect_Content.windowSelect,\n    0: SettingRedirect_Content.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SettingRedirect',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [1, 2, 6, 7])\n    ..aOM<redirect2SettingPage>(1, _omitFieldNames ? '' : 'settingPage',\n        subBuilder: redirect2SettingPage.create)\n    ..aOM<redirect2OtherPage>(2, _omitFieldNames ? '' : 'otherPage',\n        subBuilder: redirect2OtherPage.create)\n    ..aOS(3, _omitFieldNames ? '' : 'title')\n    ..aOS(4, _omitFieldNames ? '' : 'subtitle')\n    ..aOS(5, _omitFieldNames ? '' : 'selectedSummary')\n    ..aOM<redirect2Popup>(6, _omitFieldNames ? '' : 'popup',\n        subBuilder: redirect2Popup.create)\n    ..aOM<redirectWindowSelect>(7, _omitFieldNames ? '' : 'windowSelect',\n        subBuilder: redirectWindowSelect.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SettingRedirect clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SettingRedirect copyWith(void Function(SettingRedirect) updates) =>\n      super.copyWith((message) => updates(message as SettingRedirect))\n          as SettingRedirect;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SettingRedirect create() => SettingRedirect._();\n  @$core.override\n  SettingRedirect createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SettingRedirect getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SettingRedirect>(create);\n  static SettingRedirect? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(7)\n  SettingRedirect_Content whichContent() =>\n      _SettingRedirect_ContentByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(1)\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(7)\n  void clearContent() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  redirect2SettingPage get settingPage => $_getN(0);\n  @$pb.TagNumber(1)\n  set settingPage(redirect2SettingPage value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSettingPage() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSettingPage() => $_clearField(1);\n  @$pb.TagNumber(1)\n  redirect2SettingPage ensureSettingPage() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  redirect2OtherPage get otherPage => $_getN(1);\n  @$pb.TagNumber(2)\n  set otherPage(redirect2OtherPage value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOtherPage() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOtherPage() => $_clearField(2);\n  @$pb.TagNumber(2)\n  redirect2OtherPage ensureOtherPage() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.String get title => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set title($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get subtitle => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set subtitle($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSubtitle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSubtitle() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get selectedSummary => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set selectedSummary($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasSelectedSummary() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearSelectedSummary() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  redirect2Popup get popup => $_getN(5);\n  @$pb.TagNumber(6)\n  set popup(redirect2Popup value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasPopup() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearPopup() => $_clearField(6);\n  @$pb.TagNumber(6)\n  redirect2Popup ensurePopup() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  redirectWindowSelect get windowSelect => $_getN(6);\n  @$pb.TagNumber(7)\n  set windowSelect(redirectWindowSelect value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasWindowSelect() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearWindowSelect() => $_clearField(7);\n  @$pb.TagNumber(7)\n  redirectWindowSelect ensureWindowSelect() => $_ensure(6);\n}\n\nclass SettingSelect extends $pb.GeneratedMessage {\n  factory SettingSelect({\n    $core.Iterable<SelectItem>? item,\n  }) {\n    final result = create();\n    if (item != null) result.item.addAll(item);\n    return result;\n  }\n\n  SettingSelect._();\n\n  factory SettingSelect.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SettingSelect.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SettingSelect',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..pPM<SelectItem>(1, _omitFieldNames ? '' : 'item',\n        subBuilder: SelectItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SettingSelect clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SettingSelect copyWith(void Function(SettingSelect) updates) =>\n      super.copyWith((message) => updates(message as SettingSelect))\n          as SettingSelect;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SettingSelect create() => SettingSelect._();\n  @$core.override\n  SettingSelect createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SettingSelect getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SettingSelect>(create);\n  static SettingSelect? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<SelectItem> get item => $_getList(0);\n}\n\nclass SettingSwitch extends $pb.GeneratedMessage {\n  factory SettingSwitch({\n    $core.bool? switchOn,\n    $core.String? title,\n    $core.String? subtitle,\n  }) {\n    final result = create();\n    if (switchOn != null) result.switchOn = switchOn;\n    if (title != null) result.title = title;\n    if (subtitle != null) result.subtitle = subtitle;\n    return result;\n  }\n\n  SettingSwitch._();\n\n  factory SettingSwitch.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SettingSwitch.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SettingSwitch',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'switchOn')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'subtitle')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SettingSwitch clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SettingSwitch copyWith(void Function(SettingSwitch) updates) =>\n      super.copyWith((message) => updates(message as SettingSwitch))\n          as SettingSwitch;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SettingSwitch create() => SettingSwitch._();\n  @$core.override\n  SettingSwitch createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SettingSwitch getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SettingSwitch>(create);\n  static SettingSwitch? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get switchOn => $_getBF(0);\n  @$pb.TagNumber(1)\n  set switchOn($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSwitchOn() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSwitchOn() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get subtitle => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set subtitle($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSubtitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSubtitle() => $_clearField(3);\n}\n\nclass SettingText extends $pb.GeneratedMessage {\n  factory SettingText({\n    $core.String? text,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    return result;\n  }\n\n  SettingText._();\n\n  factory SettingText.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SettingText.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SettingText',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SettingText clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SettingText copyWith(void Function(SettingText) updates) =>\n      super.copyWith((message) => updates(message as SettingText))\n          as SettingText;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SettingText create() => SettingText._();\n  @$core.override\n  SettingText createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SettingText getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SettingText>(create);\n  static SettingText? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n}\n\nclass SystemId extends $pb.GeneratedMessage {\n  factory SystemId({\n    SessionType? type,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    return result;\n  }\n\n  SystemId._();\n\n  factory SystemId.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SystemId.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SystemId',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aE<SessionType>(1, _omitFieldNames ? '' : 'type',\n        enumValues: SessionType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SystemId clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SystemId copyWith(void Function(SystemId) updates) =>\n      super.copyWith((message) => updates(message as SystemId)) as SystemId;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SystemId create() => SystemId._();\n  @$core.override\n  SystemId createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SystemId getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<SystemId>(create);\n  static SystemId? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  SessionType get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(SessionType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n}\n\nclass ThreeDotItem extends $pb.GeneratedMessage {\n  factory ThreeDotItem({\n    $core.String? title,\n    $core.String? icon,\n    $core.String? url,\n    ThreeDotItemType? type,\n    $core.bool? hasRedDot,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (icon != null) result.icon = icon;\n    if (url != null) result.url = url;\n    if (type != null) result.type = type;\n    if (hasRedDot != null) result.hasRedDot = hasRedDot;\n    return result;\n  }\n\n  ThreeDotItem._();\n\n  factory ThreeDotItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThreeDotItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThreeDotItem',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'icon')\n    ..aOS(3, _omitFieldNames ? '' : 'url')\n    ..aE<ThreeDotItemType>(4, _omitFieldNames ? '' : 'type',\n        enumValues: ThreeDotItemType.values)\n    ..aOB(5, _omitFieldNames ? '' : 'hasRedDot')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreeDotItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThreeDotItem copyWith(void Function(ThreeDotItem) updates) =>\n      super.copyWith((message) => updates(message as ThreeDotItem))\n          as ThreeDotItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThreeDotItem create() => ThreeDotItem._();\n  @$core.override\n  ThreeDotItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThreeDotItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThreeDotItem>(create);\n  static ThreeDotItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get icon => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set icon($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIcon() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIcon() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get url => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set url($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUrl() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUrl() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  ThreeDotItemType get type => $_getN(3);\n  @$pb.TagNumber(4)\n  set type(ThreeDotItemType value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearType() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.bool get hasRedDot => $_getBF(4);\n  @$pb.TagNumber(5)\n  set hasRedDot($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasHasRedDot() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearHasRedDot() => $_clearField(5);\n}\n\nclass UnPinSessionReply extends $pb.GeneratedMessage {\n  factory UnPinSessionReply({\n    $fixnum.Int64? sequenceNumber,\n  }) {\n    final result = create();\n    if (sequenceNumber != null) result.sequenceNumber = sequenceNumber;\n    return result;\n  }\n\n  UnPinSessionReply._();\n\n  factory UnPinSessionReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UnPinSessionReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UnPinSessionReply',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'sequenceNumber')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UnPinSessionReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UnPinSessionReply copyWith(void Function(UnPinSessionReply) updates) =>\n      super.copyWith((message) => updates(message as UnPinSessionReply))\n          as UnPinSessionReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UnPinSessionReply create() => UnPinSessionReply._();\n  @$core.override\n  UnPinSessionReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UnPinSessionReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UnPinSessionReply>(create);\n  static UnPinSessionReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get sequenceNumber => $_getI64(0);\n  @$pb.TagNumber(1)\n  set sequenceNumber($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSequenceNumber() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSequenceNumber() => $_clearField(1);\n}\n\nclass UnPinSessionReq extends $pb.GeneratedMessage {\n  factory UnPinSessionReq({\n    SessionId? sessionId,\n  }) {\n    final result = create();\n    if (sessionId != null) result.sessionId = sessionId;\n    return result;\n  }\n\n  UnPinSessionReq._();\n\n  factory UnPinSessionReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UnPinSessionReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UnPinSessionReq',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOM<SessionId>(1, _omitFieldNames ? '' : 'sessionId',\n        subBuilder: SessionId.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UnPinSessionReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UnPinSessionReq copyWith(void Function(UnPinSessionReq) updates) =>\n      super.copyWith((message) => updates(message as UnPinSessionReq))\n          as UnPinSessionReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UnPinSessionReq create() => UnPinSessionReq._();\n  @$core.override\n  UnPinSessionReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UnPinSessionReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UnPinSessionReq>(create);\n  static UnPinSessionReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  SessionId get sessionId => $_getN(0);\n  @$pb.TagNumber(1)\n  set sessionId(SessionId value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSessionId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSessionId() => $_clearField(1);\n  @$pb.TagNumber(1)\n  SessionId ensureSessionId() => $_ensure(0);\n}\n\nclass Unread extends $pb.GeneratedMessage {\n  factory Unread({\n    UnreadStyle? style,\n    $fixnum.Int64? number,\n    $core.String? numberShow,\n  }) {\n    final result = create();\n    if (style != null) result.style = style;\n    if (number != null) result.number = number;\n    if (numberShow != null) result.numberShow = numberShow;\n    return result;\n  }\n\n  Unread._();\n\n  factory Unread.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Unread.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Unread',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aE<UnreadStyle>(1, _omitFieldNames ? '' : 'style',\n        enumValues: UnreadStyle.values)\n    ..aInt64(2, _omitFieldNames ? '' : 'number')\n    ..aOS(3, _omitFieldNames ? '' : 'numberShow')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Unread clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Unread copyWith(void Function(Unread) updates) =>\n      super.copyWith((message) => updates(message as Unread)) as Unread;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Unread create() => Unread._();\n  @$core.override\n  Unread createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Unread getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Unread>(create);\n  static Unread? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  UnreadStyle get style => $_getN(0);\n  @$pb.TagNumber(1)\n  set style(UnreadStyle value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStyle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStyle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get number => $_getI64(1);\n  @$pb.TagNumber(2)\n  set number($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasNumber() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearNumber() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get numberShow => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set numberShow($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasNumberShow() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearNumberShow() => $_clearField(3);\n}\n\nclass UpdateSessionParams extends $pb.GeneratedMessage {\n  factory UpdateSessionParams({\n    $core.Iterable<$core.MapEntry<$core.int, Offset>>? maxSessionTs,\n  }) {\n    final result = create();\n    if (maxSessionTs != null) result.maxSessionTs.addEntries(maxSessionTs);\n    return result;\n  }\n\n  UpdateSessionParams._();\n\n  factory UpdateSessionParams.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UpdateSessionParams.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UpdateSessionParams',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..m<$core.int, Offset>(1, _omitFieldNames ? '' : 'maxSessionTs',\n        entryClassName: 'UpdateSessionParams.MaxSessionTsEntry',\n        keyFieldType: $pb.PbFieldType.O3,\n        valueFieldType: $pb.PbFieldType.OM,\n        valueCreator: Offset.create,\n        valueDefaultOrMaker: Offset.getDefault,\n        packageName: const $pb.PackageName('bilibili.app.im.v1'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpdateSessionParams clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpdateSessionParams copyWith(void Function(UpdateSessionParams) updates) =>\n      super.copyWith((message) => updates(message as UpdateSessionParams))\n          as UpdateSessionParams;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UpdateSessionParams create() => UpdateSessionParams._();\n  @$core.override\n  UpdateSessionParams createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UpdateSessionParams getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UpdateSessionParams>(create);\n  static UpdateSessionParams? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbMap<$core.int, Offset> get maxSessionTs => $_getMap(0);\n}\n\nclass UserLabel extends $pb.GeneratedMessage {\n  factory UserLabel({\n    LabelType? type,\n    UserLabelStyle? style,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (style != null) result.style = style;\n    return result;\n  }\n\n  UserLabel._();\n\n  factory UserLabel.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UserLabel.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UserLabel',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aE<LabelType>(1, _omitFieldNames ? '' : 'type',\n        enumValues: LabelType.values)\n    ..aOM<UserLabelStyle>(2, _omitFieldNames ? '' : 'style',\n        subBuilder: UserLabelStyle.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserLabel clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserLabel copyWith(void Function(UserLabel) updates) =>\n      super.copyWith((message) => updates(message as UserLabel)) as UserLabel;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UserLabel create() => UserLabel._();\n  @$core.override\n  UserLabel createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UserLabel getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<UserLabel>(create);\n  static UserLabel? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  LabelType get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(LabelType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  UserLabelStyle get style => $_getN(1);\n  @$pb.TagNumber(2)\n  set style(UserLabelStyle value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasStyle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearStyle() => $_clearField(2);\n  @$pb.TagNumber(2)\n  UserLabelStyle ensureStyle() => $_ensure(1);\n}\n\nenum UserLabelStyle_Style {\n  borderedLabel,\n  filledLabel,\n  imageLabel,\n  medalLabel,\n  notSet\n}\n\nclass UserLabelStyle extends $pb.GeneratedMessage {\n  factory UserLabelStyle({\n    BorderedLabel? borderedLabel,\n    FilledLabel? filledLabel,\n    ImageLabel? imageLabel,\n    Medal? medalLabel,\n  }) {\n    final result = create();\n    if (borderedLabel != null) result.borderedLabel = borderedLabel;\n    if (filledLabel != null) result.filledLabel = filledLabel;\n    if (imageLabel != null) result.imageLabel = imageLabel;\n    if (medalLabel != null) result.medalLabel = medalLabel;\n    return result;\n  }\n\n  UserLabelStyle._();\n\n  factory UserLabelStyle.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UserLabelStyle.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, UserLabelStyle_Style>\n      _UserLabelStyle_StyleByTag = {\n    2: UserLabelStyle_Style.borderedLabel,\n    3: UserLabelStyle_Style.filledLabel,\n    4: UserLabelStyle_Style.imageLabel,\n    5: UserLabelStyle_Style.medalLabel,\n    0: UserLabelStyle_Style.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UserLabelStyle',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [2, 3, 4, 5])\n    ..aOM<BorderedLabel>(2, _omitFieldNames ? '' : 'borderedLabel',\n        subBuilder: BorderedLabel.create)\n    ..aOM<FilledLabel>(3, _omitFieldNames ? '' : 'filledLabel',\n        subBuilder: FilledLabel.create)\n    ..aOM<ImageLabel>(4, _omitFieldNames ? '' : 'imageLabel',\n        subBuilder: ImageLabel.create)\n    ..aOM<Medal>(5, _omitFieldNames ? '' : 'medalLabel',\n        subBuilder: Medal.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserLabelStyle clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserLabelStyle copyWith(void Function(UserLabelStyle) updates) =>\n      super.copyWith((message) => updates(message as UserLabelStyle))\n          as UserLabelStyle;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UserLabelStyle create() => UserLabelStyle._();\n  @$core.override\n  UserLabelStyle createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UserLabelStyle getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UserLabelStyle>(create);\n  static UserLabelStyle? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  UserLabelStyle_Style whichStyle() =>\n      _UserLabelStyle_StyleByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  void clearStyle() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(2)\n  BorderedLabel get borderedLabel => $_getN(0);\n  @$pb.TagNumber(2)\n  set borderedLabel(BorderedLabel value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBorderedLabel() => $_has(0);\n  @$pb.TagNumber(2)\n  void clearBorderedLabel() => $_clearField(2);\n  @$pb.TagNumber(2)\n  BorderedLabel ensureBorderedLabel() => $_ensure(0);\n\n  @$pb.TagNumber(3)\n  FilledLabel get filledLabel => $_getN(1);\n  @$pb.TagNumber(3)\n  set filledLabel(FilledLabel value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFilledLabel() => $_has(1);\n  @$pb.TagNumber(3)\n  void clearFilledLabel() => $_clearField(3);\n  @$pb.TagNumber(3)\n  FilledLabel ensureFilledLabel() => $_ensure(1);\n\n  @$pb.TagNumber(4)\n  ImageLabel get imageLabel => $_getN(2);\n  @$pb.TagNumber(4)\n  set imageLabel(ImageLabel value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasImageLabel() => $_has(2);\n  @$pb.TagNumber(4)\n  void clearImageLabel() => $_clearField(4);\n  @$pb.TagNumber(4)\n  ImageLabel ensureImageLabel() => $_ensure(2);\n\n  @$pb.TagNumber(5)\n  Medal get medalLabel => $_getN(3);\n  @$pb.TagNumber(5)\n  set medalLabel(Medal value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasMedalLabel() => $_has(3);\n  @$pb.TagNumber(5)\n  void clearMedalLabel() => $_clearField(5);\n  @$pb.TagNumber(5)\n  Medal ensureMedalLabel() => $_ensure(3);\n}\n\nclass redirect2OtherPage extends $pb.GeneratedMessage {\n  factory redirect2OtherPage({\n    $core.String? url,\n  }) {\n    final result = create();\n    if (url != null) result.url = url;\n    return result;\n  }\n\n  redirect2OtherPage._();\n\n  factory redirect2OtherPage.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory redirect2OtherPage.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'redirect2OtherPage',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'url')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  redirect2OtherPage clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  redirect2OtherPage copyWith(void Function(redirect2OtherPage) updates) =>\n      super.copyWith((message) => updates(message as redirect2OtherPage))\n          as redirect2OtherPage;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static redirect2OtherPage create() => redirect2OtherPage._();\n  @$core.override\n  redirect2OtherPage createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static redirect2OtherPage getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<redirect2OtherPage>(create);\n  static redirect2OtherPage? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get url => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set url($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUrl() => $_clearField(1);\n}\n\nclass redirect2Popup extends $pb.GeneratedMessage {\n  factory redirect2Popup({\n    $core.String? title,\n    $core.String? subtitle,\n    $core.String? url,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (subtitle != null) result.subtitle = subtitle;\n    if (url != null) result.url = url;\n    return result;\n  }\n\n  redirect2Popup._();\n\n  factory redirect2Popup.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory redirect2Popup.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'redirect2Popup',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'subtitle')\n    ..aOS(3, _omitFieldNames ? '' : 'url')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  redirect2Popup clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  redirect2Popup copyWith(void Function(redirect2Popup) updates) =>\n      super.copyWith((message) => updates(message as redirect2Popup))\n          as redirect2Popup;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static redirect2Popup create() => redirect2Popup._();\n  @$core.override\n  redirect2Popup createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static redirect2Popup getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<redirect2Popup>(create);\n  static redirect2Popup? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get subtitle => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set subtitle($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSubtitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSubtitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get url => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set url($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUrl() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUrl() => $_clearField(3);\n}\n\nclass redirect2SettingPage extends $pb.GeneratedMessage {\n  factory redirect2SettingPage({\n    $core.Iterable<$core.MapEntry<$core.int, Setting>>? subSettings,\n    $core.String? pageTitle,\n    $core.String? url,\n    IMSettingType? parentSettingType,\n  }) {\n    final result = create();\n    if (subSettings != null) result.subSettings.addEntries(subSettings);\n    if (pageTitle != null) result.pageTitle = pageTitle;\n    if (url != null) result.url = url;\n    if (parentSettingType != null) result.parentSettingType = parentSettingType;\n    return result;\n  }\n\n  redirect2SettingPage._();\n\n  factory redirect2SettingPage.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory redirect2SettingPage.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'redirect2SettingPage',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..m<$core.int, Setting>(1, _omitFieldNames ? '' : 'subSettings',\n        entryClassName: 'redirect2SettingPage.SubSettingsEntry',\n        keyFieldType: $pb.PbFieldType.O3,\n        valueFieldType: $pb.PbFieldType.OM,\n        valueCreator: Setting.create,\n        valueDefaultOrMaker: Setting.getDefault,\n        packageName: const $pb.PackageName('bilibili.app.im.v1'))\n    ..aOS(2, _omitFieldNames ? '' : 'pageTitle')\n    ..aOS(3, _omitFieldNames ? '' : 'url')\n    ..aE<IMSettingType>(4, _omitFieldNames ? '' : 'parentSettingType',\n        enumValues: IMSettingType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  redirect2SettingPage clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  redirect2SettingPage copyWith(void Function(redirect2SettingPage) updates) =>\n      super.copyWith((message) => updates(message as redirect2SettingPage))\n          as redirect2SettingPage;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static redirect2SettingPage create() => redirect2SettingPage._();\n  @$core.override\n  redirect2SettingPage createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static redirect2SettingPage getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<redirect2SettingPage>(create);\n  static redirect2SettingPage? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbMap<$core.int, Setting> get subSettings => $_getMap(0);\n\n  @$pb.TagNumber(2)\n  $core.String get pageTitle => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set pageTitle($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPageTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPageTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get url => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set url($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUrl() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUrl() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  IMSettingType get parentSettingType => $_getN(3);\n  @$pb.TagNumber(4)\n  set parentSettingType(IMSettingType value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasParentSettingType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearParentSettingType() => $_clearField(4);\n}\n\nclass redirectWindowSelect extends $pb.GeneratedMessage {\n  factory redirectWindowSelect({\n    $core.String? title,\n    $core.Iterable<SelectItem>? item,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (item != null) result.item.addAll(item);\n    return result;\n  }\n\n  redirectWindowSelect._();\n\n  factory redirectWindowSelect.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory redirectWindowSelect.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'redirectWindowSelect',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.app.im.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..pPM<SelectItem>(2, _omitFieldNames ? '' : 'item',\n        subBuilder: SelectItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  redirectWindowSelect clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  redirectWindowSelect copyWith(void Function(redirectWindowSelect) updates) =>\n      super.copyWith((message) => updates(message as redirectWindowSelect))\n          as redirectWindowSelect;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static redirectWindowSelect create() => redirectWindowSelect._();\n  @$core.override\n  redirectWindowSelect createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static redirectWindowSelect getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<redirectWindowSelect>(create);\n  static redirectWindowSelect? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<SelectItem> get item => $_getList(1);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/im/v1.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/im/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nclass AirDropFrom extends $pb.ProtobufEnum {\n  static const AirDropFrom ADF_UNKNOWN =\n      AirDropFrom._(0, _omitEnumNames ? '' : 'ADF_UNKNOWN');\n  static const AirDropFrom ADF_INSIDE_APP =\n      AirDropFrom._(1, _omitEnumNames ? '' : 'ADF_INSIDE_APP');\n  static const AirDropFrom ADF_OUTSIDE_APP =\n      AirDropFrom._(2, _omitEnumNames ? '' : 'ADF_OUTSIDE_APP');\n\n  static const $core.List<AirDropFrom> values = <AirDropFrom>[\n    ADF_UNKNOWN,\n    ADF_INSIDE_APP,\n    ADF_OUTSIDE_APP,\n  ];\n\n  static final $core.List<AirDropFrom?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static AirDropFrom? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const AirDropFrom._(super.value, super.name);\n}\n\nclass AlertToastType extends $pb.ProtobufEnum {\n  static const AlertToastType ALERT_TOAST_TYPE_UNSPECIFIED =\n      AlertToastType._(0, _omitEnumNames ? '' : 'ALERT_TOAST_TYPE_UNSPECIFIED');\n  static const AlertToastType ALERT_TOAST_TYPE_BANNED =\n      AlertToastType._(1, _omitEnumNames ? '' : 'ALERT_TOAST_TYPE_BANNED');\n  static const AlertToastType ALERT_TOAST_TYPE_REPORT =\n      AlertToastType._(2, _omitEnumNames ? '' : 'ALERT_TOAST_TYPE_REPORT');\n\n  static const $core.List<AlertToastType> values = <AlertToastType>[\n    ALERT_TOAST_TYPE_UNSPECIFIED,\n    ALERT_TOAST_TYPE_BANNED,\n    ALERT_TOAST_TYPE_REPORT,\n  ];\n\n  static final $core.List<AlertToastType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static AlertToastType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const AlertToastType._(super.value, super.name);\n}\n\nclass ContactTabType extends $pb.ProtobufEnum {\n  static const ContactTabType TAB_UNKNOWN =\n      ContactTabType._(0, _omitEnumNames ? '' : 'TAB_UNKNOWN');\n  static const ContactTabType TAB_GROUP =\n      ContactTabType._(1, _omitEnumNames ? '' : 'TAB_GROUP');\n  static const ContactTabType TAB_FOLLOW =\n      ContactTabType._(2, _omitEnumNames ? '' : 'TAB_FOLLOW');\n  static const ContactTabType TAB_FANS =\n      ContactTabType._(3, _omitEnumNames ? '' : 'TAB_FANS');\n\n  static const $core.List<ContactTabType> values = <ContactTabType>[\n    TAB_UNKNOWN,\n    TAB_GROUP,\n    TAB_FOLLOW,\n    TAB_FANS,\n  ];\n\n  static final $core.List<ContactTabType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static ContactTabType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ContactTabType._(super.value, super.name);\n}\n\nclass IMSettingType extends $pb.ProtobufEnum {\n  static const IMSettingType SETTING_TYPE_NEED_ALL =\n      IMSettingType._(0, _omitEnumNames ? '' : 'SETTING_TYPE_NEED_ALL');\n  static const IMSettingType SETTING_TYPE_REPLY_ME =\n      IMSettingType._(1, _omitEnumNames ? '' : 'SETTING_TYPE_REPLY_ME');\n  static const IMSettingType SETTING_TYPE_NEW_FANS =\n      IMSettingType._(2, _omitEnumNames ? '' : 'SETTING_TYPE_NEW_FANS');\n  static const IMSettingType SETTING_TYPE_RECEIVE_LIKE =\n      IMSettingType._(3, _omitEnumNames ? '' : 'SETTING_TYPE_RECEIVE_LIKE');\n  static const IMSettingType SETTING_TYPE_MSG_REMIND =\n      IMSettingType._(4, _omitEnumNames ? '' : 'SETTING_TYPE_MSG_REMIND');\n  static const IMSettingType SETTING_TYPE_MSG_INTERCEPTION =\n      IMSettingType._(5, _omitEnumNames ? '' : 'SETTING_TYPE_MSG_INTERCEPTION');\n  static const IMSettingType SETTING_TYPE_FANS_GROUP_MSG =\n      IMSettingType._(6, _omitEnumNames ? '' : 'SETTING_TYPE_FANS_GROUP_MSG');\n  static const IMSettingType SETTING_TYPE_FANS_GROUP_MSG_RECEIVE =\n      IMSettingType._(\n          7, _omitEnumNames ? '' : 'SETTING_TYPE_FANS_GROUP_MSG_RECEIVE');\n  static const IMSettingType SETTING_TYPE_FANS_GROUP_MSG_FOLD = IMSettingType._(\n      8, _omitEnumNames ? '' : 'SETTING_TYPE_FANS_GROUP_MSG_FOLD');\n  static const IMSettingType SETTING_TYPE_FANS_GROUP_MSG_JOIN_GUIDE =\n      IMSettingType._(\n          9, _omitEnumNames ? '' : 'SETTING_TYPE_FANS_GROUP_MSG_JOIN_GUIDE');\n  static const IMSettingType SETTING_TYPE_UNFOLLOWED_MSG =\n      IMSettingType._(10, _omitEnumNames ? '' : 'SETTING_TYPE_UNFOLLOWED_MSG');\n  static const IMSettingType SETTING_TYPE_UNFOLLOWED_MSG_FOLD = IMSettingType._(\n      11, _omitEnumNames ? '' : 'SETTING_TYPE_UNFOLLOWED_MSG_FOLD');\n  static const IMSettingType SETTING_TYPE_BLACK_LIST =\n      IMSettingType._(12, _omitEnumNames ? '' : 'SETTING_TYPE_BLACK_LIST');\n  static const IMSettingType SETTING_TYPE_ANTI_HARASSMENT =\n      IMSettingType._(13, _omitEnumNames ? '' : 'SETTING_TYPE_ANTI_HARASSMENT');\n  static const IMSettingType SETTING_TYPE_ANTI_HARASSMENT_SWITCH =\n      IMSettingType._(\n          14, _omitEnumNames ? '' : 'SETTING_TYPE_ANTI_HARASSMENT_SWITCH');\n  static const IMSettingType SETTING_TYPE_ANTI_HARASSMENT_OPEN_TIP_TEXT =\n      IMSettingType._(15,\n          _omitEnumNames ? '' : 'SETTING_TYPE_ANTI_HARASSMENT_OPEN_TIP_TEXT');\n  static const IMSettingType SETTING_TYPE_CLOSE_FANS_GROUP = IMSettingType._(\n      16, _omitEnumNames ? '' : 'SETTING_TYPE_CLOSE_FANS_GROUP');\n  static const IMSettingType SETTING_TYPE_OLD_REPLY_ME =\n      IMSettingType._(17, _omitEnumNames ? '' : 'SETTING_TYPE_OLD_REPLY_ME');\n  static const IMSettingType SETTING_TYPE_OLD_AT_ME =\n      IMSettingType._(18, _omitEnumNames ? '' : 'SETTING_TYPE_OLD_AT_ME');\n  static const IMSettingType SETTING_TYPE_OLD_RECEIVE_LIKE = IMSettingType._(\n      19, _omitEnumNames ? '' : 'SETTING_TYPE_OLD_RECEIVE_LIKE');\n  static const IMSettingType SETTING_TYPE_ANTI_HARASSMENT_INTERACT_LIMITS =\n      IMSettingType._(20,\n          _omitEnumNames ? '' : 'SETTING_TYPE_ANTI_HARASSMENT_INTERACT_LIMITS');\n  static const IMSettingType SETTING_TYPE_ANTI_HARASSMENT_DURATION =\n      IMSettingType._(\n          21, _omitEnumNames ? '' : 'SETTING_TYPE_ANTI_HARASSMENT_DURATION');\n  static const IMSettingType SETTING_TYPE_ANTI_HARASSMENT_COMMENT_LIMITS =\n      IMSettingType._(22,\n          _omitEnumNames ? '' : 'SETTING_TYPE_ANTI_HARASSMENT_COMMENT_LIMITS');\n  static const IMSettingType SETTING_TYPE_ANTI_HARASSMENT_DANMU_LIMITS =\n      IMSettingType._(23,\n          _omitEnumNames ? '' : 'SETTING_TYPE_ANTI_HARASSMENT_DANMU_LIMITS');\n  static const IMSettingType SETTING_TYPE_UNFOLLOWED_MSG_RECEIVE =\n      IMSettingType._(\n          24, _omitEnumNames ? '' : 'SETTING_TYPE_UNFOLLOWED_MSG_RECEIVE');\n  static const IMSettingType SETTING_TYPE_ANTI_HARASSMENT_IM_LIMITS =\n      IMSettingType._(\n          25, _omitEnumNames ? '' : 'SETTING_TYPE_ANTI_HARASSMENT_IM_LIMITS');\n  static const IMSettingType SETTING_TYPE_KEYWORD_BLOCKING = IMSettingType._(\n      26, _omitEnumNames ? '' : 'SETTING_TYPE_KEYWORD_BLOCKING');\n\n  static const $core.List<IMSettingType> values = <IMSettingType>[\n    SETTING_TYPE_NEED_ALL,\n    SETTING_TYPE_REPLY_ME,\n    SETTING_TYPE_NEW_FANS,\n    SETTING_TYPE_RECEIVE_LIKE,\n    SETTING_TYPE_MSG_REMIND,\n    SETTING_TYPE_MSG_INTERCEPTION,\n    SETTING_TYPE_FANS_GROUP_MSG,\n    SETTING_TYPE_FANS_GROUP_MSG_RECEIVE,\n    SETTING_TYPE_FANS_GROUP_MSG_FOLD,\n    SETTING_TYPE_FANS_GROUP_MSG_JOIN_GUIDE,\n    SETTING_TYPE_UNFOLLOWED_MSG,\n    SETTING_TYPE_UNFOLLOWED_MSG_FOLD,\n    SETTING_TYPE_BLACK_LIST,\n    SETTING_TYPE_ANTI_HARASSMENT,\n    SETTING_TYPE_ANTI_HARASSMENT_SWITCH,\n    SETTING_TYPE_ANTI_HARASSMENT_OPEN_TIP_TEXT,\n    SETTING_TYPE_CLOSE_FANS_GROUP,\n    SETTING_TYPE_OLD_REPLY_ME,\n    SETTING_TYPE_OLD_AT_ME,\n    SETTING_TYPE_OLD_RECEIVE_LIKE,\n    SETTING_TYPE_ANTI_HARASSMENT_INTERACT_LIMITS,\n    SETTING_TYPE_ANTI_HARASSMENT_DURATION,\n    SETTING_TYPE_ANTI_HARASSMENT_COMMENT_LIMITS,\n    SETTING_TYPE_ANTI_HARASSMENT_DANMU_LIMITS,\n    SETTING_TYPE_UNFOLLOWED_MSG_RECEIVE,\n    SETTING_TYPE_ANTI_HARASSMENT_IM_LIMITS,\n    SETTING_TYPE_KEYWORD_BLOCKING,\n  ];\n\n  static final $core.List<IMSettingType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 26);\n  static IMSettingType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const IMSettingType._(super.value, super.name);\n}\n\nclass LabelType extends $pb.ProtobufEnum {\n  static const LabelType LABEL_TYPE_DEFAULT =\n      LabelType._(0, _omitEnumNames ? '' : 'LABEL_TYPE_DEFAULT');\n  static const LabelType LABEL_TYPE_HUA_HUO =\n      LabelType._(1, _omitEnumNames ? '' : 'LABEL_TYPE_HUA_HUO');\n  static const LabelType LABEL_TYPE_ORIGINAL_FANS =\n      LabelType._(2, _omitEnumNames ? '' : 'LABEL_TYPE_ORIGINAL_FANS');\n  static const LabelType LABEL_TYPE_SPECIAL_ATTENTION =\n      LabelType._(3, _omitEnumNames ? '' : 'LABEL_TYPE_SPECIAL_ATTENTION');\n  static const LabelType LABEL_TYPE_CONTRACT_UP =\n      LabelType._(4, _omitEnumNames ? '' : 'LABEL_TYPE_CONTRACT_UP');\n  static const LabelType LABEL_TYPE_OLD_FANS =\n      LabelType._(5, _omitEnumNames ? '' : 'LABEL_TYPE_OLD_FANS');\n  static const LabelType LABEL_TYPE_SPECIAL_ATTENTION_2 =\n      LabelType._(6, _omitEnumNames ? '' : 'LABEL_TYPE_SPECIAL_ATTENTION_2');\n  static const LabelType LABEL_TYPE_FANS_MEDAL =\n      LabelType._(7, _omitEnumNames ? '' : 'LABEL_TYPE_FANS_MEDAL');\n  static const LabelType LABEL_TYPE_GUARD_MEDAL =\n      LabelType._(8, _omitEnumNames ? '' : 'LABEL_TYPE_GUARD_MEDAL');\n\n  static const $core.List<LabelType> values = <LabelType>[\n    LABEL_TYPE_DEFAULT,\n    LABEL_TYPE_HUA_HUO,\n    LABEL_TYPE_ORIGINAL_FANS,\n    LABEL_TYPE_SPECIAL_ATTENTION,\n    LABEL_TYPE_CONTRACT_UP,\n    LABEL_TYPE_OLD_FANS,\n    LABEL_TYPE_SPECIAL_ATTENTION_2,\n    LABEL_TYPE_FANS_MEDAL,\n    LABEL_TYPE_GUARD_MEDAL,\n  ];\n\n  static final $core.List<LabelType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 8);\n  static LabelType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const LabelType._(super.value, super.name);\n}\n\nclass MsgSummaryPrefixType extends $pb.ProtobufEnum {\n  static const MsgSummaryPrefixType MSG_SUMMARY_PREFIX_TYPE_NONE =\n      MsgSummaryPrefixType._(\n          0, _omitEnumNames ? '' : 'MSG_SUMMARY_PREFIX_TYPE_NONE');\n  static const MsgSummaryPrefixType MSG_SUMMARY_PREFIX_TYPE_NOTIFICATION =\n      MsgSummaryPrefixType._(\n          1, _omitEnumNames ? '' : 'MSG_SUMMARY_PREFIX_TYPE_NOTIFICATION');\n  static const MsgSummaryPrefixType MSG_SUMMARY_PREFIX_TYPE_GROUP_BLOCKED =\n      MsgSummaryPrefixType._(\n          2, _omitEnumNames ? '' : 'MSG_SUMMARY_PREFIX_TYPE_GROUP_BLOCKED');\n  static const MsgSummaryPrefixType MSG_SUMMARY_PREFIX_TYPE_MENTIONED =\n      MsgSummaryPrefixType._(\n          3, _omitEnumNames ? '' : 'MSG_SUMMARY_PREFIX_TYPE_MENTIONED');\n  static const MsgSummaryPrefixType MSG_SUMMARY_PREFIX_TYPE_UNREAD =\n      MsgSummaryPrefixType._(\n          4, _omitEnumNames ? '' : 'MSG_SUMMARY_PREFIX_TYPE_UNREAD');\n\n  static const $core.List<MsgSummaryPrefixType> values = <MsgSummaryPrefixType>[\n    MSG_SUMMARY_PREFIX_TYPE_NONE,\n    MSG_SUMMARY_PREFIX_TYPE_NOTIFICATION,\n    MSG_SUMMARY_PREFIX_TYPE_GROUP_BLOCKED,\n    MSG_SUMMARY_PREFIX_TYPE_MENTIONED,\n    MSG_SUMMARY_PREFIX_TYPE_UNREAD,\n  ];\n\n  static final $core.List<MsgSummaryPrefixType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 4);\n  static MsgSummaryPrefixType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const MsgSummaryPrefixType._(super.value, super.name);\n}\n\nclass QuickLinkItemType extends $pb.ProtobufEnum {\n  static const QuickLinkItemType QUICK_LINK_ITEM_TYPE_UNKNOWN =\n      QuickLinkItemType._(\n          0, _omitEnumNames ? '' : 'QUICK_LINK_ITEM_TYPE_UNKNOWN');\n  static const QuickLinkItemType QUICK_LINK_ITEM_TYPE_OLD_LIKE =\n      QuickLinkItemType._(\n          1, _omitEnumNames ? '' : 'QUICK_LINK_ITEM_TYPE_OLD_LIKE');\n  static const QuickLinkItemType QUICK_LINK_ITEM_TYPE_OLD_REPLY =\n      QuickLinkItemType._(\n          2, _omitEnumNames ? '' : 'QUICK_LINK_ITEM_TYPE_OLD_REPLY');\n  static const QuickLinkItemType QUICK_LINK_ITEM_TYPE_AT =\n      QuickLinkItemType._(3, _omitEnumNames ? '' : 'QUICK_LINK_ITEM_TYPE_AT');\n  static const QuickLinkItemType QUICK_LINK_ITEM_TYPE_SYSTEM =\n      QuickLinkItemType._(\n          4, _omitEnumNames ? '' : 'QUICK_LINK_ITEM_TYPE_SYSTEM');\n  static const QuickLinkItemType QUICK_LINK_ITEM_TYPE_HUA_HUO =\n      QuickLinkItemType._(\n          5, _omitEnumNames ? '' : 'QUICK_LINK_ITEM_TYPE_HUA_HUO');\n  static const QuickLinkItemType QUICK_LINK_ITEM_TYPE_FOLLOW =\n      QuickLinkItemType._(\n          6, _omitEnumNames ? '' : 'QUICK_LINK_ITEM_TYPE_FOLLOW');\n  static const QuickLinkItemType QUICK_LINK_ITEM_TYPE_REPLY =\n      QuickLinkItemType._(\n          100, _omitEnumNames ? '' : 'QUICK_LINK_ITEM_TYPE_REPLY');\n  static const QuickLinkItemType QUICK_LINK_ITEM_TYPE_LIKE =\n      QuickLinkItemType._(\n          101, _omitEnumNames ? '' : 'QUICK_LINK_ITEM_TYPE_LIKE');\n\n  static const $core.List<QuickLinkItemType> values = <QuickLinkItemType>[\n    QUICK_LINK_ITEM_TYPE_UNKNOWN,\n    QUICK_LINK_ITEM_TYPE_OLD_LIKE,\n    QUICK_LINK_ITEM_TYPE_OLD_REPLY,\n    QUICK_LINK_ITEM_TYPE_AT,\n    QUICK_LINK_ITEM_TYPE_SYSTEM,\n    QUICK_LINK_ITEM_TYPE_HUA_HUO,\n    QUICK_LINK_ITEM_TYPE_FOLLOW,\n    QUICK_LINK_ITEM_TYPE_REPLY,\n    QUICK_LINK_ITEM_TYPE_LIKE,\n  ];\n\n  static final $core.Map<$core.int, QuickLinkItemType> _byValue =\n      $pb.ProtobufEnum.initByValue(values);\n  static QuickLinkItemType? valueOf($core.int value) => _byValue[value];\n\n  const QuickLinkItemType._(super.value, super.name);\n}\n\nclass QuickLinkMsgType extends $pb.ProtobufEnum {\n  static const QuickLinkMsgType LikeMsg =\n      QuickLinkMsgType._(0, _omitEnumNames ? '' : 'LikeMsg');\n  static const QuickLinkMsgType ReplyMsg =\n      QuickLinkMsgType._(1, _omitEnumNames ? '' : 'ReplyMsg');\n  static const QuickLinkMsgType AtMsg =\n      QuickLinkMsgType._(2, _omitEnumNames ? '' : 'AtMsg');\n  static const QuickLinkMsgType DanmuMsg =\n      QuickLinkMsgType._(3, _omitEnumNames ? '' : 'DanmuMsg');\n  static const QuickLinkMsgType CoinMsg =\n      QuickLinkMsgType._(4, _omitEnumNames ? '' : 'CoinMsg');\n  static const QuickLinkMsgType FavoriteMsg =\n      QuickLinkMsgType._(5, _omitEnumNames ? '' : 'FavoriteMsg');\n\n  static const $core.List<QuickLinkMsgType> values = <QuickLinkMsgType>[\n    LikeMsg,\n    ReplyMsg,\n    AtMsg,\n    DanmuMsg,\n    CoinMsg,\n    FavoriteMsg,\n  ];\n\n  static final $core.List<QuickLinkMsgType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 5);\n  static QuickLinkMsgType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const QuickLinkMsgType._(super.value, super.name);\n}\n\nclass SessionFilterType extends $pb.ProtobufEnum {\n  static const SessionFilterType FILTER_DEFAULT =\n      SessionFilterType._(0, _omitEnumNames ? '' : 'FILTER_DEFAULT');\n  static const SessionFilterType FILTER_FOLLOW =\n      SessionFilterType._(1, _omitEnumNames ? '' : 'FILTER_FOLLOW');\n\n  static const $core.List<SessionFilterType> values = <SessionFilterType>[\n    FILTER_DEFAULT,\n    FILTER_FOLLOW,\n  ];\n\n  static final $core.List<SessionFilterType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static SessionFilterType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const SessionFilterType._(super.value, super.name);\n}\n\nclass SessionPageType extends $pb.ProtobufEnum {\n  static const SessionPageType SESSION_PAGE_TYPE_UNKNOWN =\n      SessionPageType._(0, _omitEnumNames ? '' : 'SESSION_PAGE_TYPE_UNKNOWN');\n  static const SessionPageType SESSION_PAGE_TYPE_HOME =\n      SessionPageType._(1, _omitEnumNames ? '' : 'SESSION_PAGE_TYPE_HOME');\n  static const SessionPageType SESSION_PAGE_TYPE_UNFOLLOWED = SessionPageType._(\n      2, _omitEnumNames ? '' : 'SESSION_PAGE_TYPE_UNFOLLOWED');\n  static const SessionPageType SESSION_PAGE_TYPE_STRANGER =\n      SessionPageType._(3, _omitEnumNames ? '' : 'SESSION_PAGE_TYPE_STRANGER');\n  static const SessionPageType SESSION_PAGE_TYPE_DUSTBIN =\n      SessionPageType._(4, _omitEnumNames ? '' : 'SESSION_PAGE_TYPE_DUSTBIN');\n  static const SessionPageType SESSION_PAGE_TYPE_GROUP =\n      SessionPageType._(5, _omitEnumNames ? '' : 'SESSION_PAGE_TYPE_GROUP');\n  static const SessionPageType SESSION_PAGE_TYPE_HUA_HUO =\n      SessionPageType._(6, _omitEnumNames ? '' : 'SESSION_PAGE_TYPE_HUA_HUO');\n  static const SessionPageType SESSION_PAGE_TYPE_AI =\n      SessionPageType._(7, _omitEnumNames ? '' : 'SESSION_PAGE_TYPE_AI');\n  static const SessionPageType SESSION_PAGE_TYPE_CUSTOMER =\n      SessionPageType._(8, _omitEnumNames ? '' : 'SESSION_PAGE_TYPE_CUSTOMER');\n\n  static const $core.List<SessionPageType> values = <SessionPageType>[\n    SESSION_PAGE_TYPE_UNKNOWN,\n    SESSION_PAGE_TYPE_HOME,\n    SESSION_PAGE_TYPE_UNFOLLOWED,\n    SESSION_PAGE_TYPE_STRANGER,\n    SESSION_PAGE_TYPE_DUSTBIN,\n    SESSION_PAGE_TYPE_GROUP,\n    SESSION_PAGE_TYPE_HUA_HUO,\n    SESSION_PAGE_TYPE_AI,\n    SESSION_PAGE_TYPE_CUSTOMER,\n  ];\n\n  static final $core.List<SessionPageType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 8);\n  static SessionPageType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const SessionPageType._(super.value, super.name);\n}\n\nclass SessionType extends $pb.ProtobufEnum {\n  static const SessionType SESSION_TYPE_UNKNOWN =\n      SessionType._(0, _omitEnumNames ? '' : 'SESSION_TYPE_UNKNOWN');\n  static const SessionType SESSION_TYPE_PRIVATE =\n      SessionType._(1, _omitEnumNames ? '' : 'SESSION_TYPE_PRIVATE');\n  static const SessionType SESSION_TYPE_GROUP =\n      SessionType._(2, _omitEnumNames ? '' : 'SESSION_TYPE_GROUP');\n  static const SessionType SESSION_TYPE_GROUP_FOLD =\n      SessionType._(3, _omitEnumNames ? '' : 'SESSION_TYPE_GROUP_FOLD');\n  static const SessionType SESSION_TYPE_UNFOLLOWED =\n      SessionType._(4, _omitEnumNames ? '' : 'SESSION_TYPE_UNFOLLOWED');\n  static const SessionType SESSION_TYPE_STRANGER =\n      SessionType._(5, _omitEnumNames ? '' : 'SESSION_TYPE_STRANGER');\n  static const SessionType SESSION_TYPE_DUSTBIN =\n      SessionType._(6, _omitEnumNames ? '' : 'SESSION_TYPE_DUSTBIN');\n  static const SessionType SESSION_TYPE_CUSTOMER_FOLD =\n      SessionType._(7, _omitEnumNames ? '' : 'SESSION_TYPE_CUSTOMER_FOLD');\n  static const SessionType SESSION_TYPE_SYSTEM =\n      SessionType._(8, _omitEnumNames ? '' : 'SESSION_TYPE_SYSTEM');\n  static const SessionType SESSION_TYPE_AI_FOLD =\n      SessionType._(9, _omitEnumNames ? '' : 'SESSION_TYPE_AI_FOLD');\n  static const SessionType SESSION_TYPE_CUSTOMER_ACCOUNT =\n      SessionType._(10, _omitEnumNames ? '' : 'SESSION_TYPE_CUSTOMER_ACCOUNT');\n\n  static const $core.List<SessionType> values = <SessionType>[\n    SESSION_TYPE_UNKNOWN,\n    SESSION_TYPE_PRIVATE,\n    SESSION_TYPE_GROUP,\n    SESSION_TYPE_GROUP_FOLD,\n    SESSION_TYPE_UNFOLLOWED,\n    SESSION_TYPE_STRANGER,\n    SESSION_TYPE_DUSTBIN,\n    SESSION_TYPE_CUSTOMER_FOLD,\n    SESSION_TYPE_SYSTEM,\n    SESSION_TYPE_AI_FOLD,\n    SESSION_TYPE_CUSTOMER_ACCOUNT,\n  ];\n\n  static final $core.List<SessionType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 10);\n  static SessionType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const SessionType._(super.value, super.name);\n}\n\nclass ThreeDotItemType extends $pb.ProtobufEnum {\n  static const ThreeDotItemType THREE_DOT_ITEM_TYPE_UNKNOWN =\n      ThreeDotItemType._(\n          0, _omitEnumNames ? '' : 'THREE_DOT_ITEM_TYPE_UNKNOWN');\n  static const ThreeDotItemType THREE_DOT_ITEM_TYPE_READ_ALL =\n      ThreeDotItemType._(\n          1, _omitEnumNames ? '' : 'THREE_DOT_ITEM_TYPE_READ_ALL');\n  static const ThreeDotItemType THREE_DOT_ITEM_TYPE_MSG_SETTING =\n      ThreeDotItemType._(\n          2, _omitEnumNames ? '' : 'THREE_DOT_ITEM_TYPE_MSG_SETTING');\n  static const ThreeDotItemType THREE_DOT_ITEM_TYPE_AUTO_REPLY =\n      ThreeDotItemType._(\n          3, _omitEnumNames ? '' : 'THREE_DOT_ITEM_TYPE_AUTO_REPLY');\n  static const ThreeDotItemType THREE_DOT_ITEM_TYPE_UP_HELPER =\n      ThreeDotItemType._(\n          4, _omitEnumNames ? '' : 'THREE_DOT_ITEM_TYPE_UP_HELPER');\n  static const ThreeDotItemType THREE_DOT_ITEM_TYPE_LIVE_HELPER =\n      ThreeDotItemType._(\n          5, _omitEnumNames ? '' : 'THREE_DOT_ITEM_TYPE_LIVE_HELPER');\n  static const ThreeDotItemType THREE_DOT_ITEM_TYPE_FANS_GROUP_HELPER =\n      ThreeDotItemType._(\n          6, _omitEnumNames ? '' : 'THREE_DOT_ITEM_TYPE_FANS_GROUP_HELPER');\n  static const ThreeDotItemType THREE_DOT_ITEM_TYPE_CONTRIBUTION_PUSH =\n      ThreeDotItemType._(\n          7, _omitEnumNames ? '' : 'THREE_DOT_ITEM_TYPE_CONTRIBUTION_PUSH');\n  static const ThreeDotItemType THREE_DOT_ITEM_TYPE_CONTACTS =\n      ThreeDotItemType._(\n          8, _omitEnumNames ? '' : 'THREE_DOT_ITEM_TYPE_CONTACTS');\n  static const ThreeDotItemType THREE_DOT_ITEM_TYPE_CLEAR_LIST =\n      ThreeDotItemType._(\n          9, _omitEnumNames ? '' : 'THREE_DOT_ITEM_TYPE_CLEAR_LIST');\n\n  static const $core.List<ThreeDotItemType> values = <ThreeDotItemType>[\n    THREE_DOT_ITEM_TYPE_UNKNOWN,\n    THREE_DOT_ITEM_TYPE_READ_ALL,\n    THREE_DOT_ITEM_TYPE_MSG_SETTING,\n    THREE_DOT_ITEM_TYPE_AUTO_REPLY,\n    THREE_DOT_ITEM_TYPE_UP_HELPER,\n    THREE_DOT_ITEM_TYPE_LIVE_HELPER,\n    THREE_DOT_ITEM_TYPE_FANS_GROUP_HELPER,\n    THREE_DOT_ITEM_TYPE_CONTRIBUTION_PUSH,\n    THREE_DOT_ITEM_TYPE_CONTACTS,\n    THREE_DOT_ITEM_TYPE_CLEAR_LIST,\n  ];\n\n  static final $core.List<ThreeDotItemType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 9);\n  static ThreeDotItemType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ThreeDotItemType._(super.value, super.name);\n}\n\nclass UnreadStyle extends $pb.ProtobufEnum {\n  static const UnreadStyle UNREAD_STYLE_NONE =\n      UnreadStyle._(0, _omitEnumNames ? '' : 'UNREAD_STYLE_NONE');\n  static const UnreadStyle UNREAD_STYLE_DOT =\n      UnreadStyle._(1, _omitEnumNames ? '' : 'UNREAD_STYLE_DOT');\n  static const UnreadStyle UNREAD_STYLE_NUMBER =\n      UnreadStyle._(2, _omitEnumNames ? '' : 'UNREAD_STYLE_NUMBER');\n\n  static const $core.List<UnreadStyle> values = <UnreadStyle>[\n    UNREAD_STYLE_NONE,\n    UNREAD_STYLE_DOT,\n    UNREAD_STYLE_NUMBER,\n  ];\n\n  static final $core.List<UnreadStyle?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static UnreadStyle? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const UnreadStyle._(super.value, super.name);\n}\n\nconst $core.bool _omitEnumNames =\n    $core.bool.fromEnvironment('protobuf.omit_enum_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/im/v1.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/im/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use airDropFromDescriptor instead')\nconst AirDropFrom$json = {\n  '1': 'AirDropFrom',\n  '2': [\n    {'1': 'ADF_UNKNOWN', '2': 0},\n    {'1': 'ADF_INSIDE_APP', '2': 1},\n    {'1': 'ADF_OUTSIDE_APP', '2': 2},\n  ],\n};\n\n/// Descriptor for `AirDropFrom`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List airDropFromDescriptor = $convert.base64Decode(\n    'CgtBaXJEcm9wRnJvbRIPCgtBREZfVU5LTk9XThAAEhIKDkFERl9JTlNJREVfQVBQEAESEwoPQU'\n    'RGX09VVFNJREVfQVBQEAI=');\n\n@$core.Deprecated('Use alertToastTypeDescriptor instead')\nconst AlertToastType$json = {\n  '1': 'AlertToastType',\n  '2': [\n    {'1': 'ALERT_TOAST_TYPE_UNSPECIFIED', '2': 0},\n    {'1': 'ALERT_TOAST_TYPE_BANNED', '2': 1},\n    {'1': 'ALERT_TOAST_TYPE_REPORT', '2': 2},\n  ],\n};\n\n/// Descriptor for `AlertToastType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List alertToastTypeDescriptor = $convert.base64Decode(\n    'Cg5BbGVydFRvYXN0VHlwZRIgChxBTEVSVF9UT0FTVF9UWVBFX1VOU1BFQ0lGSUVEEAASGwoXQU'\n    'xFUlRfVE9BU1RfVFlQRV9CQU5ORUQQARIbChdBTEVSVF9UT0FTVF9UWVBFX1JFUE9SVBAC');\n\n@$core.Deprecated('Use contactTabTypeDescriptor instead')\nconst ContactTabType$json = {\n  '1': 'ContactTabType',\n  '2': [\n    {'1': 'TAB_UNKNOWN', '2': 0},\n    {'1': 'TAB_GROUP', '2': 1},\n    {'1': 'TAB_FOLLOW', '2': 2},\n    {'1': 'TAB_FANS', '2': 3},\n  ],\n};\n\n/// Descriptor for `ContactTabType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List contactTabTypeDescriptor = $convert.base64Decode(\n    'Cg5Db250YWN0VGFiVHlwZRIPCgtUQUJfVU5LTk9XThAAEg0KCVRBQl9HUk9VUBABEg4KClRBQl'\n    '9GT0xMT1cQAhIMCghUQUJfRkFOUxAD');\n\n@$core.Deprecated('Use iMSettingTypeDescriptor instead')\nconst IMSettingType$json = {\n  '1': 'IMSettingType',\n  '2': [\n    {'1': 'SETTING_TYPE_NEED_ALL', '2': 0},\n    {'1': 'SETTING_TYPE_REPLY_ME', '2': 1},\n    {'1': 'SETTING_TYPE_NEW_FANS', '2': 2},\n    {'1': 'SETTING_TYPE_RECEIVE_LIKE', '2': 3},\n    {'1': 'SETTING_TYPE_MSG_REMIND', '2': 4},\n    {'1': 'SETTING_TYPE_MSG_INTERCEPTION', '2': 5},\n    {'1': 'SETTING_TYPE_FANS_GROUP_MSG', '2': 6},\n    {'1': 'SETTING_TYPE_FANS_GROUP_MSG_RECEIVE', '2': 7},\n    {'1': 'SETTING_TYPE_FANS_GROUP_MSG_FOLD', '2': 8},\n    {'1': 'SETTING_TYPE_FANS_GROUP_MSG_JOIN_GUIDE', '2': 9},\n    {'1': 'SETTING_TYPE_UNFOLLOWED_MSG', '2': 10},\n    {'1': 'SETTING_TYPE_UNFOLLOWED_MSG_FOLD', '2': 11},\n    {'1': 'SETTING_TYPE_BLACK_LIST', '2': 12},\n    {'1': 'SETTING_TYPE_ANTI_HARASSMENT', '2': 13},\n    {'1': 'SETTING_TYPE_ANTI_HARASSMENT_SWITCH', '2': 14},\n    {'1': 'SETTING_TYPE_ANTI_HARASSMENT_OPEN_TIP_TEXT', '2': 15},\n    {'1': 'SETTING_TYPE_CLOSE_FANS_GROUP', '2': 16},\n    {'1': 'SETTING_TYPE_OLD_REPLY_ME', '2': 17},\n    {'1': 'SETTING_TYPE_OLD_AT_ME', '2': 18},\n    {'1': 'SETTING_TYPE_OLD_RECEIVE_LIKE', '2': 19},\n    {'1': 'SETTING_TYPE_ANTI_HARASSMENT_INTERACT_LIMITS', '2': 20},\n    {'1': 'SETTING_TYPE_ANTI_HARASSMENT_DURATION', '2': 21},\n    {'1': 'SETTING_TYPE_ANTI_HARASSMENT_COMMENT_LIMITS', '2': 22},\n    {'1': 'SETTING_TYPE_ANTI_HARASSMENT_DANMU_LIMITS', '2': 23},\n    {'1': 'SETTING_TYPE_UNFOLLOWED_MSG_RECEIVE', '2': 24},\n    {'1': 'SETTING_TYPE_ANTI_HARASSMENT_IM_LIMITS', '2': 25},\n    {'1': 'SETTING_TYPE_KEYWORD_BLOCKING', '2': 26},\n  ],\n};\n\n/// Descriptor for `IMSettingType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List iMSettingTypeDescriptor = $convert.base64Decode(\n    'Cg1JTVNldHRpbmdUeXBlEhkKFVNFVFRJTkdfVFlQRV9ORUVEX0FMTBAAEhkKFVNFVFRJTkdfVF'\n    'lQRV9SRVBMWV9NRRABEhkKFVNFVFRJTkdfVFlQRV9ORVdfRkFOUxACEh0KGVNFVFRJTkdfVFlQ'\n    'RV9SRUNFSVZFX0xJS0UQAxIbChdTRVRUSU5HX1RZUEVfTVNHX1JFTUlORBAEEiEKHVNFVFRJTk'\n    'dfVFlQRV9NU0dfSU5URVJDRVBUSU9OEAUSHwobU0VUVElOR19UWVBFX0ZBTlNfR1JPVVBfTVNH'\n    'EAYSJwojU0VUVElOR19UWVBFX0ZBTlNfR1JPVVBfTVNHX1JFQ0VJVkUQBxIkCiBTRVRUSU5HX1'\n    'RZUEVfRkFOU19HUk9VUF9NU0dfRk9MRBAIEioKJlNFVFRJTkdfVFlQRV9GQU5TX0dST1VQX01T'\n    'R19KT0lOX0dVSURFEAkSHwobU0VUVElOR19UWVBFX1VORk9MTE9XRURfTVNHEAoSJAogU0VUVE'\n    'lOR19UWVBFX1VORk9MTE9XRURfTVNHX0ZPTEQQCxIbChdTRVRUSU5HX1RZUEVfQkxBQ0tfTElT'\n    'VBAMEiAKHFNFVFRJTkdfVFlQRV9BTlRJX0hBUkFTU01FTlQQDRInCiNTRVRUSU5HX1RZUEVfQU'\n    '5USV9IQVJBU1NNRU5UX1NXSVRDSBAOEi4KKlNFVFRJTkdfVFlQRV9BTlRJX0hBUkFTU01FTlRf'\n    'T1BFTl9USVBfVEVYVBAPEiEKHVNFVFRJTkdfVFlQRV9DTE9TRV9GQU5TX0dST1VQEBASHQoZU0'\n    'VUVElOR19UWVBFX09MRF9SRVBMWV9NRRAREhoKFlNFVFRJTkdfVFlQRV9PTERfQVRfTUUQEhIh'\n    'Ch1TRVRUSU5HX1RZUEVfT0xEX1JFQ0VJVkVfTElLRRATEjAKLFNFVFRJTkdfVFlQRV9BTlRJX0'\n    'hBUkFTU01FTlRfSU5URVJBQ1RfTElNSVRTEBQSKQolU0VUVElOR19UWVBFX0FOVElfSEFSQVNT'\n    'TUVOVF9EVVJBVElPThAVEi8KK1NFVFRJTkdfVFlQRV9BTlRJX0hBUkFTU01FTlRfQ09NTUVOVF'\n    '9MSU1JVFMQFhItCilTRVRUSU5HX1RZUEVfQU5USV9IQVJBU1NNRU5UX0RBTk1VX0xJTUlUUxAX'\n    'EicKI1NFVFRJTkdfVFlQRV9VTkZPTExPV0VEX01TR19SRUNFSVZFEBgSKgomU0VUVElOR19UWV'\n    'BFX0FOVElfSEFSQVNTTUVOVF9JTV9MSU1JVFMQGRIhCh1TRVRUSU5HX1RZUEVfS0VZV09SRF9C'\n    'TE9DS0lORxAa');\n\n@$core.Deprecated('Use labelTypeDescriptor instead')\nconst LabelType$json = {\n  '1': 'LabelType',\n  '2': [\n    {'1': 'LABEL_TYPE_DEFAULT', '2': 0},\n    {'1': 'LABEL_TYPE_HUA_HUO', '2': 1},\n    {'1': 'LABEL_TYPE_ORIGINAL_FANS', '2': 2},\n    {'1': 'LABEL_TYPE_SPECIAL_ATTENTION', '2': 3},\n    {'1': 'LABEL_TYPE_CONTRACT_UP', '2': 4},\n    {'1': 'LABEL_TYPE_OLD_FANS', '2': 5},\n    {'1': 'LABEL_TYPE_SPECIAL_ATTENTION_2', '2': 6},\n    {'1': 'LABEL_TYPE_FANS_MEDAL', '2': 7},\n    {'1': 'LABEL_TYPE_GUARD_MEDAL', '2': 8},\n  ],\n};\n\n/// Descriptor for `LabelType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List labelTypeDescriptor = $convert.base64Decode(\n    'CglMYWJlbFR5cGUSFgoSTEFCRUxfVFlQRV9ERUZBVUxUEAASFgoSTEFCRUxfVFlQRV9IVUFfSF'\n    'VPEAESHAoYTEFCRUxfVFlQRV9PUklHSU5BTF9GQU5TEAISIAocTEFCRUxfVFlQRV9TUEVDSUFM'\n    'X0FUVEVOVElPThADEhoKFkxBQkVMX1RZUEVfQ09OVFJBQ1RfVVAQBBIXChNMQUJFTF9UWVBFX0'\n    '9MRF9GQU5TEAUSIgoeTEFCRUxfVFlQRV9TUEVDSUFMX0FUVEVOVElPTl8yEAYSGQoVTEFCRUxf'\n    'VFlQRV9GQU5TX01FREFMEAcSGgoWTEFCRUxfVFlQRV9HVUFSRF9NRURBTBAI');\n\n@$core.Deprecated('Use msgSummaryPrefixTypeDescriptor instead')\nconst MsgSummaryPrefixType$json = {\n  '1': 'MsgSummaryPrefixType',\n  '2': [\n    {'1': 'MSG_SUMMARY_PREFIX_TYPE_NONE', '2': 0},\n    {'1': 'MSG_SUMMARY_PREFIX_TYPE_NOTIFICATION', '2': 1},\n    {'1': 'MSG_SUMMARY_PREFIX_TYPE_GROUP_BLOCKED', '2': 2},\n    {'1': 'MSG_SUMMARY_PREFIX_TYPE_MENTIONED', '2': 3},\n    {'1': 'MSG_SUMMARY_PREFIX_TYPE_UNREAD', '2': 4},\n  ],\n};\n\n/// Descriptor for `MsgSummaryPrefixType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List msgSummaryPrefixTypeDescriptor = $convert.base64Decode(\n    'ChRNc2dTdW1tYXJ5UHJlZml4VHlwZRIgChxNU0dfU1VNTUFSWV9QUkVGSVhfVFlQRV9OT05FEA'\n    'ASKAokTVNHX1NVTU1BUllfUFJFRklYX1RZUEVfTk9USUZJQ0FUSU9OEAESKQolTVNHX1NVTU1B'\n    'UllfUFJFRklYX1RZUEVfR1JPVVBfQkxPQ0tFRBACEiUKIU1TR19TVU1NQVJZX1BSRUZJWF9UWV'\n    'BFX01FTlRJT05FRBADEiIKHk1TR19TVU1NQVJZX1BSRUZJWF9UWVBFX1VOUkVBRBAE');\n\n@$core.Deprecated('Use quickLinkItemTypeDescriptor instead')\nconst QuickLinkItemType$json = {\n  '1': 'QuickLinkItemType',\n  '2': [\n    {'1': 'QUICK_LINK_ITEM_TYPE_UNKNOWN', '2': 0},\n    {'1': 'QUICK_LINK_ITEM_TYPE_OLD_LIKE', '2': 1},\n    {'1': 'QUICK_LINK_ITEM_TYPE_OLD_REPLY', '2': 2},\n    {'1': 'QUICK_LINK_ITEM_TYPE_AT', '2': 3},\n    {'1': 'QUICK_LINK_ITEM_TYPE_SYSTEM', '2': 4},\n    {'1': 'QUICK_LINK_ITEM_TYPE_HUA_HUO', '2': 5},\n    {'1': 'QUICK_LINK_ITEM_TYPE_FOLLOW', '2': 6},\n    {'1': 'QUICK_LINK_ITEM_TYPE_REPLY', '2': 100},\n    {'1': 'QUICK_LINK_ITEM_TYPE_LIKE', '2': 101},\n  ],\n};\n\n/// Descriptor for `QuickLinkItemType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List quickLinkItemTypeDescriptor = $convert.base64Decode(\n    'ChFRdWlja0xpbmtJdGVtVHlwZRIgChxRVUlDS19MSU5LX0lURU1fVFlQRV9VTktOT1dOEAASIQ'\n    'odUVVJQ0tfTElOS19JVEVNX1RZUEVfT0xEX0xJS0UQARIiCh5RVUlDS19MSU5LX0lURU1fVFlQ'\n    'RV9PTERfUkVQTFkQAhIbChdRVUlDS19MSU5LX0lURU1fVFlQRV9BVBADEh8KG1FVSUNLX0xJTk'\n    'tfSVRFTV9UWVBFX1NZU1RFTRAEEiAKHFFVSUNLX0xJTktfSVRFTV9UWVBFX0hVQV9IVU8QBRIf'\n    'ChtRVUlDS19MSU5LX0lURU1fVFlQRV9GT0xMT1cQBhIeChpRVUlDS19MSU5LX0lURU1fVFlQRV'\n    '9SRVBMWRBkEh0KGVFVSUNLX0xJTktfSVRFTV9UWVBFX0xJS0UQZQ==');\n\n@$core.Deprecated('Use quickLinkMsgTypeDescriptor instead')\nconst QuickLinkMsgType$json = {\n  '1': 'QuickLinkMsgType',\n  '2': [\n    {'1': 'LikeMsg', '2': 0},\n    {'1': 'ReplyMsg', '2': 1},\n    {'1': 'AtMsg', '2': 2},\n    {'1': 'DanmuMsg', '2': 3},\n    {'1': 'CoinMsg', '2': 4},\n    {'1': 'FavoriteMsg', '2': 5},\n  ],\n};\n\n/// Descriptor for `QuickLinkMsgType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List quickLinkMsgTypeDescriptor = $convert.base64Decode(\n    'ChBRdWlja0xpbmtNc2dUeXBlEgsKB0xpa2VNc2cQABIMCghSZXBseU1zZxABEgkKBUF0TXNnEA'\n    'ISDAoIRGFubXVNc2cQAxILCgdDb2luTXNnEAQSDwoLRmF2b3JpdGVNc2cQBQ==');\n\n@$core.Deprecated('Use sessionFilterTypeDescriptor instead')\nconst SessionFilterType$json = {\n  '1': 'SessionFilterType',\n  '2': [\n    {'1': 'FILTER_DEFAULT', '2': 0},\n    {'1': 'FILTER_FOLLOW', '2': 1},\n  ],\n};\n\n/// Descriptor for `SessionFilterType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List sessionFilterTypeDescriptor = $convert.base64Decode(\n    'ChFTZXNzaW9uRmlsdGVyVHlwZRISCg5GSUxURVJfREVGQVVMVBAAEhEKDUZJTFRFUl9GT0xMT1'\n    'cQAQ==');\n\n@$core.Deprecated('Use sessionPageTypeDescriptor instead')\nconst SessionPageType$json = {\n  '1': 'SessionPageType',\n  '2': [\n    {'1': 'SESSION_PAGE_TYPE_UNKNOWN', '2': 0},\n    {'1': 'SESSION_PAGE_TYPE_HOME', '2': 1},\n    {'1': 'SESSION_PAGE_TYPE_UNFOLLOWED', '2': 2},\n    {'1': 'SESSION_PAGE_TYPE_STRANGER', '2': 3},\n    {'1': 'SESSION_PAGE_TYPE_DUSTBIN', '2': 4},\n    {'1': 'SESSION_PAGE_TYPE_GROUP', '2': 5},\n    {'1': 'SESSION_PAGE_TYPE_HUA_HUO', '2': 6},\n    {'1': 'SESSION_PAGE_TYPE_AI', '2': 7},\n    {'1': 'SESSION_PAGE_TYPE_CUSTOMER', '2': 8},\n  ],\n};\n\n/// Descriptor for `SessionPageType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List sessionPageTypeDescriptor = $convert.base64Decode(\n    'Cg9TZXNzaW9uUGFnZVR5cGUSHQoZU0VTU0lPTl9QQUdFX1RZUEVfVU5LTk9XThAAEhoKFlNFU1'\n    'NJT05fUEFHRV9UWVBFX0hPTUUQARIgChxTRVNTSU9OX1BBR0VfVFlQRV9VTkZPTExPV0VEEAIS'\n    'HgoaU0VTU0lPTl9QQUdFX1RZUEVfU1RSQU5HRVIQAxIdChlTRVNTSU9OX1BBR0VfVFlQRV9EVV'\n    'NUQklOEAQSGwoXU0VTU0lPTl9QQUdFX1RZUEVfR1JPVVAQBRIdChlTRVNTSU9OX1BBR0VfVFlQ'\n    'RV9IVUFfSFVPEAYSGAoUU0VTU0lPTl9QQUdFX1RZUEVfQUkQBxIeChpTRVNTSU9OX1BBR0VfVF'\n    'lQRV9DVVNUT01FUhAI');\n\n@$core.Deprecated('Use sessionTypeDescriptor instead')\nconst SessionType$json = {\n  '1': 'SessionType',\n  '2': [\n    {'1': 'SESSION_TYPE_UNKNOWN', '2': 0},\n    {'1': 'SESSION_TYPE_PRIVATE', '2': 1},\n    {'1': 'SESSION_TYPE_GROUP', '2': 2},\n    {'1': 'SESSION_TYPE_GROUP_FOLD', '2': 3},\n    {'1': 'SESSION_TYPE_UNFOLLOWED', '2': 4},\n    {'1': 'SESSION_TYPE_STRANGER', '2': 5},\n    {'1': 'SESSION_TYPE_DUSTBIN', '2': 6},\n    {'1': 'SESSION_TYPE_CUSTOMER_FOLD', '2': 7},\n    {'1': 'SESSION_TYPE_SYSTEM', '2': 8},\n    {'1': 'SESSION_TYPE_AI_FOLD', '2': 9},\n    {'1': 'SESSION_TYPE_CUSTOMER_ACCOUNT', '2': 10},\n  ],\n};\n\n/// Descriptor for `SessionType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List sessionTypeDescriptor = $convert.base64Decode(\n    'CgtTZXNzaW9uVHlwZRIYChRTRVNTSU9OX1RZUEVfVU5LTk9XThAAEhgKFFNFU1NJT05fVFlQRV'\n    '9QUklWQVRFEAESFgoSU0VTU0lPTl9UWVBFX0dST1VQEAISGwoXU0VTU0lPTl9UWVBFX0dST1VQ'\n    'X0ZPTEQQAxIbChdTRVNTSU9OX1RZUEVfVU5GT0xMT1dFRBAEEhkKFVNFU1NJT05fVFlQRV9TVF'\n    'JBTkdFUhAFEhgKFFNFU1NJT05fVFlQRV9EVVNUQklOEAYSHgoaU0VTU0lPTl9UWVBFX0NVU1RP'\n    'TUVSX0ZPTEQQBxIXChNTRVNTSU9OX1RZUEVfU1lTVEVNEAgSGAoUU0VTU0lPTl9UWVBFX0FJX0'\n    'ZPTEQQCRIhCh1TRVNTSU9OX1RZUEVfQ1VTVE9NRVJfQUNDT1VOVBAK');\n\n@$core.Deprecated('Use threeDotItemTypeDescriptor instead')\nconst ThreeDotItemType$json = {\n  '1': 'ThreeDotItemType',\n  '2': [\n    {'1': 'THREE_DOT_ITEM_TYPE_UNKNOWN', '2': 0},\n    {'1': 'THREE_DOT_ITEM_TYPE_READ_ALL', '2': 1},\n    {'1': 'THREE_DOT_ITEM_TYPE_MSG_SETTING', '2': 2},\n    {'1': 'THREE_DOT_ITEM_TYPE_AUTO_REPLY', '2': 3},\n    {'1': 'THREE_DOT_ITEM_TYPE_UP_HELPER', '2': 4},\n    {'1': 'THREE_DOT_ITEM_TYPE_LIVE_HELPER', '2': 5},\n    {'1': 'THREE_DOT_ITEM_TYPE_FANS_GROUP_HELPER', '2': 6},\n    {'1': 'THREE_DOT_ITEM_TYPE_CONTRIBUTION_PUSH', '2': 7},\n    {'1': 'THREE_DOT_ITEM_TYPE_CONTACTS', '2': 8},\n    {'1': 'THREE_DOT_ITEM_TYPE_CLEAR_LIST', '2': 9},\n  ],\n};\n\n/// Descriptor for `ThreeDotItemType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List threeDotItemTypeDescriptor = $convert.base64Decode(\n    'ChBUaHJlZURvdEl0ZW1UeXBlEh8KG1RIUkVFX0RPVF9JVEVNX1RZUEVfVU5LTk9XThAAEiAKHF'\n    'RIUkVFX0RPVF9JVEVNX1RZUEVfUkVBRF9BTEwQARIjCh9USFJFRV9ET1RfSVRFTV9UWVBFX01T'\n    'R19TRVRUSU5HEAISIgoeVEhSRUVfRE9UX0lURU1fVFlQRV9BVVRPX1JFUExZEAMSIQodVEhSRU'\n    'VfRE9UX0lURU1fVFlQRV9VUF9IRUxQRVIQBBIjCh9USFJFRV9ET1RfSVRFTV9UWVBFX0xJVkVf'\n    'SEVMUEVSEAUSKQolVEhSRUVfRE9UX0lURU1fVFlQRV9GQU5TX0dST1VQX0hFTFBFUhAGEikKJV'\n    'RIUkVFX0RPVF9JVEVNX1RZUEVfQ09OVFJJQlVUSU9OX1BVU0gQBxIgChxUSFJFRV9ET1RfSVRF'\n    'TV9UWVBFX0NPTlRBQ1RTEAgSIgoeVEhSRUVfRE9UX0lURU1fVFlQRV9DTEVBUl9MSVNUEAk=');\n\n@$core.Deprecated('Use unreadStyleDescriptor instead')\nconst UnreadStyle$json = {\n  '1': 'UnreadStyle',\n  '2': [\n    {'1': 'UNREAD_STYLE_NONE', '2': 0},\n    {'1': 'UNREAD_STYLE_DOT', '2': 1},\n    {'1': 'UNREAD_STYLE_NUMBER', '2': 2},\n  ],\n};\n\n/// Descriptor for `UnreadStyle`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List unreadStyleDescriptor = $convert.base64Decode(\n    'CgtVbnJlYWRTdHlsZRIVChFVTlJFQURfU1RZTEVfTk9ORRAAEhQKEFVOUkVBRF9TVFlMRV9ET1'\n    'QQARIXChNVTlJFQURfU1RZTEVfTlVNQkVSEAI=');\n\n@$core.Deprecated('Use airDropShareUserInfoDescriptor instead')\nconst AirDropShareUserInfo$json = {\n  '1': 'AirDropShareUserInfo',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'face', '3': 2, '4': 1, '5': 9, '10': 'face'},\n    {'1': 'url', '3': 3, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'name', '3': 4, '4': 1, '5': 9, '10': 'name'},\n  ],\n};\n\n/// Descriptor for `AirDropShareUserInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List airDropShareUserInfoDescriptor = $convert.base64Decode(\n    'ChRBaXJEcm9wU2hhcmVVc2VySW5mbxIQCgNtaWQYASABKANSA21pZBISCgRmYWNlGAIgASgJUg'\n    'RmYWNlEhAKA3VybBgDIAEoCVIDdXJsEhIKBG5hbWUYBCABKAlSBG5hbWU=');\n\n@$core.Deprecated('Use airDropToImReplyDescriptor instead')\nconst AirDropToImReply$json = {\n  '1': 'AirDropToImReply',\n  '2': [\n    {\n      '1': 'user_infos',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.AirDropShareUserInfo',\n      '10': 'userInfos'\n    },\n  ],\n};\n\n/// Descriptor for `AirDropToImReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List airDropToImReplyDescriptor = $convert.base64Decode(\n    'ChBBaXJEcm9wVG9JbVJlcGx5EkcKCnVzZXJfaW5mb3MYASADKAsyKC5iaWxpYmlsaS5hcHAuaW'\n    '0udjEuQWlyRHJvcFNoYXJlVXNlckluZm9SCXVzZXJJbmZvcw==');\n\n@$core.Deprecated('Use airDropToImReqDescriptor instead')\nconst AirDropToImReq$json = {\n  '1': 'AirDropToImReq',\n  '2': [\n    {\n      '1': 'adf',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.im.v1.AirDropFrom',\n      '10': 'adf'\n    },\n  ],\n};\n\n/// Descriptor for `AirDropToImReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List airDropToImReqDescriptor = $convert.base64Decode(\n    'Cg5BaXJEcm9wVG9JbVJlcRIxCgNhZGYYASABKA4yHy5iaWxpYmlsaS5hcHAuaW0udjEuQWlyRH'\n    'JvcEZyb21SA2FkZg==');\n\n@$core.Deprecated('Use autoReplyToastDescriptor instead')\nconst AutoReplyToast$json = {\n  '1': 'AutoReplyToast',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'url', '3': 2, '4': 1, '5': 9, '10': 'url'},\n  ],\n};\n\n/// Descriptor for `AutoReplyToast`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List autoReplyToastDescriptor = $convert.base64Decode(\n    'Cg5BdXRvUmVwbHlUb2FzdBIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSEAoDdXJsGAIgASgJUgN1cm'\n    'w=');\n\n@$core.Deprecated('Use behaviorAlertToastDescriptor instead')\nconst BehaviorAlertToast$json = {\n  '1': 'BehaviorAlertToast',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'content', '3': 2, '4': 1, '5': 9, '10': 'content'},\n    {'1': 'type_str', '3': 3, '4': 1, '5': 9, '10': 'typeStr'},\n    {\n      '1': 'type',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.im.v1.AlertToastType',\n      '10': 'type'\n    },\n  ],\n};\n\n/// Descriptor for `BehaviorAlertToast`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List behaviorAlertToastDescriptor = $convert.base64Decode(\n    'ChJCZWhhdmlvckFsZXJ0VG9hc3QSFAoFdGl0bGUYASABKAlSBXRpdGxlEhgKB2NvbnRlbnQYAi'\n    'ABKAlSB2NvbnRlbnQSGQoIdHlwZV9zdHIYAyABKAlSB3R5cGVTdHISNgoEdHlwZRgEIAEoDjIi'\n    'LmJpbGliaWxpLmFwcC5pbS52MS5BbGVydFRvYXN0VHlwZVIEdHlwZQ==');\n\n@$core.Deprecated('Use borderedLabelDescriptor instead')\nconst BorderedLabel$json = {\n  '1': 'BorderedLabel',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},\n  ],\n};\n\n/// Descriptor for `BorderedLabel`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List borderedLabelDescriptor = $convert.base64Decode(\n    'Cg1Cb3JkZXJlZExhYmVsEhIKBGljb24YASABKAlSBGljb24SEgoEdGV4dBgCIAEoCVIEdGV4dA'\n    '==');\n\n@$core.Deprecated('Use cancelInterceptInDustbinReplyDescriptor instead')\nconst CancelInterceptInDustbinReply$json = {\n  '1': 'CancelInterceptInDustbinReply',\n};\n\n/// Descriptor for `CancelInterceptInDustbinReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cancelInterceptInDustbinReplyDescriptor =\n    $convert.base64Decode('Ch1DYW5jZWxJbnRlcmNlcHRJbkR1c3RiaW5SZXBseQ==');\n\n@$core.Deprecated('Use cancelInterceptInDustbinReqDescriptor instead')\nconst CancelInterceptInDustbinReq$json = {\n  '1': 'CancelInterceptInDustbinReq',\n  '2': [\n    {\n      '1': 'session_id',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.SessionId',\n      '10': 'sessionId'\n    },\n  ],\n};\n\n/// Descriptor for `CancelInterceptInDustbinReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cancelInterceptInDustbinReqDescriptor =\n    $convert.base64Decode(\n        'ChtDYW5jZWxJbnRlcmNlcHRJbkR1c3RiaW5SZXESPAoKc2Vzc2lvbl9pZBgBIAEoCzIdLmJpbG'\n        'liaWxpLmFwcC5pbS52MS5TZXNzaW9uSWRSCXNlc3Npb25JZA==');\n\n@$core.Deprecated('Use clearAlertReplyDescriptor instead')\nconst ClearAlertReply$json = {\n  '1': 'ClearAlertReply',\n};\n\n/// Descriptor for `ClearAlertReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List clearAlertReplyDescriptor =\n    $convert.base64Decode('Cg9DbGVhckFsZXJ0UmVwbHk=');\n\n@$core.Deprecated('Use clearAlertReqDescriptor instead')\nconst ClearAlertReq$json = {\n  '1': 'ClearAlertReq',\n  '2': [\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.im.v1.AlertToastType',\n      '10': 'type'\n    },\n  ],\n};\n\n/// Descriptor for `ClearAlertReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List clearAlertReqDescriptor = $convert.base64Decode(\n    'Cg1DbGVhckFsZXJ0UmVxEjYKBHR5cGUYASABKA4yIi5iaWxpYmlsaS5hcHAuaW0udjEuQWxlcn'\n    'RUb2FzdFR5cGVSBHR5cGU=');\n\n@$core.Deprecated('Use clearUnreadReplyDescriptor instead')\nconst ClearUnreadReply$json = {\n  '1': 'ClearUnreadReply',\n};\n\n/// Descriptor for `ClearUnreadReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List clearUnreadReplyDescriptor =\n    $convert.base64Decode('ChBDbGVhclVucmVhZFJlcGx5');\n\n@$core.Deprecated('Use clearUnreadReqDescriptor instead')\nconst ClearUnreadReq$json = {\n  '1': 'ClearUnreadReq',\n  '2': [\n    {\n      '1': 'page_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.im.v1.SessionPageType',\n      '10': 'pageType'\n    },\n    {\n      '1': 'session_id',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.SessionId',\n      '10': 'sessionId'\n    },\n  ],\n};\n\n/// Descriptor for `ClearUnreadReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List clearUnreadReqDescriptor = $convert.base64Decode(\n    'Cg5DbGVhclVucmVhZFJlcRJACglwYWdlX3R5cGUYASABKA4yIy5iaWxpYmlsaS5hcHAuaW0udj'\n    'EuU2Vzc2lvblBhZ2VUeXBlUghwYWdlVHlwZRI8CgpzZXNzaW9uX2lkGAIgASgLMh0uYmlsaWJp'\n    'bGkuYXBwLmltLnYxLlNlc3Npb25JZFIJc2Vzc2lvbklk');\n\n@$core.Deprecated('Use contactDescriptor instead')\nconst Contact$json = {\n  '1': 'Contact',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {\n      '1': 'avatar',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.AvatarItem',\n      '10': 'avatar'\n    },\n    {'1': 'vip_info', '3': 4, '4': 1, '5': 9, '10': 'vipInfo'},\n    {'1': 'url', '3': 5, '4': 1, '5': 9, '10': 'url'},\n    {\n      '1': 'name_render',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.account.service.v1.NameRender',\n      '10': 'nameRender'\n    },\n    {'1': 'is_special_follow', '3': 7, '4': 1, '5': 8, '10': 'isSpecialFollow'},\n    {'1': 'face', '3': 8, '4': 1, '5': 9, '10': 'face'},\n    {'1': 'official_type', '3': 9, '4': 1, '5': 5, '10': 'officialType'},\n  ],\n};\n\n/// Descriptor for `Contact`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List contactDescriptor = $convert.base64Decode(\n    'CgdDb250YWN0Eg4KAmlkGAEgASgDUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEkUKBmF2YXRhch'\n    'gDIAEoCzItLmJpbGliaWxpLmRhZ3cuY29tcG9uZW50LmF2YXRhci52MS5BdmF0YXJJdGVtUgZh'\n    'dmF0YXISGQoIdmlwX2luZm8YBCABKAlSB3ZpcEluZm8SEAoDdXJsGAUgASgJUgN1cmwSSAoLbm'\n    'FtZV9yZW5kZXIYBiABKAsyJy5iaWxpYmlsaS5hY2NvdW50LnNlcnZpY2UudjEuTmFtZVJlbmRl'\n    'clIKbmFtZVJlbmRlchIqChFpc19zcGVjaWFsX2ZvbGxvdxgHIAEoCFIPaXNTcGVjaWFsRm9sbG'\n    '93EhIKBGZhY2UYCCABKAlSBGZhY2USIwoNb2ZmaWNpYWxfdHlwZRgJIAEoBVIMb2ZmaWNpYWxU'\n    'eXBl');\n\n@$core.Deprecated('Use contactTabDescriptor instead')\nconst ContactTab$json = {\n  '1': 'ContactTab',\n  '2': [\n    {\n      '1': 'tab',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.im.v1.ContactTabType',\n      '10': 'tab'\n    },\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n  ],\n};\n\n/// Descriptor for `ContactTab`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List contactTabDescriptor = $convert.base64Decode(\n    'CgpDb250YWN0VGFiEjQKA3RhYhgBIAEoDjIiLmJpbGliaWxpLmFwcC5pbS52MS5Db250YWN0VG'\n    'FiVHlwZVIDdGFiEhIKBG5hbWUYAiABKAlSBG5hbWU=');\n\n@$core.Deprecated('Use contactsReplyDescriptor instead')\nconst ContactsReply$json = {\n  '1': 'ContactsReply',\n  '2': [\n    {\n      '1': 'contacts',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.Contact',\n      '10': 'contacts'\n    },\n    {\n      '1': 'tab',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.ContactTab',\n      '10': 'tab'\n    },\n    {\n      '1': 'current_tab',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.im.v1.ContactTabType',\n      '10': 'currentTab'\n    },\n    {\n      '1': 'pagination_params',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.PaginationParams',\n      '10': 'paginationParams'\n    },\n  ],\n};\n\n/// Descriptor for `ContactsReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List contactsReplyDescriptor = $convert.base64Decode(\n    'Cg1Db250YWN0c1JlcGx5EjcKCGNvbnRhY3RzGAEgAygLMhsuYmlsaWJpbGkuYXBwLmltLnYxLk'\n    'NvbnRhY3RSCGNvbnRhY3RzEjAKA3RhYhgCIAMoCzIeLmJpbGliaWxpLmFwcC5pbS52MS5Db250'\n    'YWN0VGFiUgN0YWISQwoLY3VycmVudF90YWIYAyABKA4yIi5iaWxpYmlsaS5hcHAuaW0udjEuQ2'\n    '9udGFjdFRhYlR5cGVSCmN1cnJlbnRUYWISUQoRcGFnaW5hdGlvbl9wYXJhbXMYBCABKAsyJC5i'\n    'aWxpYmlsaS5hcHAuaW0udjEuUGFnaW5hdGlvblBhcmFtc1IQcGFnaW5hdGlvblBhcmFtcw==');\n\n@$core.Deprecated('Use contactsReqDescriptor instead')\nconst ContactsReq$json = {\n  '1': 'ContactsReq',\n  '2': [\n    {\n      '1': 'tab',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.im.v1.ContactTabType',\n      '10': 'tab'\n    },\n    {\n      '1': 'pagination_params',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.PaginationParams',\n      '10': 'paginationParams'\n    },\n  ],\n};\n\n/// Descriptor for `ContactsReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List contactsReqDescriptor = $convert.base64Decode(\n    'CgtDb250YWN0c1JlcRI0CgN0YWIYASABKA4yIi5iaWxpYmlsaS5hcHAuaW0udjEuQ29udGFjdF'\n    'RhYlR5cGVSA3RhYhJRChFwYWdpbmF0aW9uX3BhcmFtcxgCIAEoCzIkLmJpbGliaWxpLmFwcC5p'\n    'bS52MS5QYWdpbmF0aW9uUGFyYW1zUhBwYWdpbmF0aW9uUGFyYW1z');\n\n@$core.Deprecated('Use contactsSearchReplyDescriptor instead')\nconst ContactsSearchReply$json = {\n  '1': 'ContactsSearchReply',\n  '2': [\n    {\n      '1': 'contacts',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.Contact',\n      '10': 'contacts'\n    },\n    {\n      '1': 'pagination_params',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.PaginationParams',\n      '10': 'paginationParams'\n    },\n  ],\n};\n\n/// Descriptor for `ContactsSearchReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List contactsSearchReplyDescriptor = $convert.base64Decode(\n    'ChNDb250YWN0c1NlYXJjaFJlcGx5EjcKCGNvbnRhY3RzGAEgAygLMhsuYmlsaWJpbGkuYXBwLm'\n    'ltLnYxLkNvbnRhY3RSCGNvbnRhY3RzElEKEXBhZ2luYXRpb25fcGFyYW1zGAIgASgLMiQuYmls'\n    'aWJpbGkuYXBwLmltLnYxLlBhZ2luYXRpb25QYXJhbXNSEHBhZ2luYXRpb25QYXJhbXM=');\n\n@$core.Deprecated('Use contactsSearchReqDescriptor instead')\nconst ContactsSearchReq$json = {\n  '1': 'ContactsSearchReq',\n  '2': [\n    {'1': 'keyword', '3': 1, '4': 1, '5': 9, '10': 'keyword'},\n    {\n      '1': 'tab',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.im.v1.ContactTabType',\n      '10': 'tab'\n    },\n    {\n      '1': 'pagination_params',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.PaginationParams',\n      '10': 'paginationParams'\n    },\n  ],\n};\n\n/// Descriptor for `ContactsSearchReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List contactsSearchReqDescriptor = $convert.base64Decode(\n    'ChFDb250YWN0c1NlYXJjaFJlcRIYCgdrZXl3b3JkGAEgASgJUgdrZXl3b3JkEjQKA3RhYhgCIA'\n    'EoDjIiLmJpbGliaWxpLmFwcC5pbS52MS5Db250YWN0VGFiVHlwZVIDdGFiElEKEXBhZ2luYXRp'\n    'b25fcGFyYW1zGAMgASgLMiQuYmlsaWJpbGkuYXBwLmltLnYxLlBhZ2luYXRpb25QYXJhbXNSEH'\n    'BhZ2luYXRpb25QYXJhbXM=');\n\n@$core.Deprecated('Use customerIdDescriptor instead')\nconst CustomerId$json = {\n  '1': 'CustomerId',\n  '2': [\n    {'1': 'shop_id', '3': 1, '4': 1, '5': 3, '10': 'shopId'},\n    {'1': 'shop_type', '3': 2, '4': 1, '5': 3, '10': 'shopType'},\n  ],\n};\n\n/// Descriptor for `CustomerId`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List customerIdDescriptor = $convert.base64Decode(\n    'CgpDdXN0b21lcklkEhcKB3Nob3BfaWQYASABKANSBnNob3BJZBIbCglzaG9wX3R5cGUYAiABKA'\n    'NSCHNob3BUeXBl');\n\n@$core.Deprecated('Use deleteSessionListReplyDescriptor instead')\nconst DeleteSessionListReply$json = {\n  '1': 'DeleteSessionListReply',\n};\n\n/// Descriptor for `DeleteSessionListReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List deleteSessionListReplyDescriptor =\n    $convert.base64Decode('ChZEZWxldGVTZXNzaW9uTGlzdFJlcGx5');\n\n@$core.Deprecated('Use deleteSessionListReqDescriptor instead')\nconst DeleteSessionListReq$json = {\n  '1': 'DeleteSessionListReq',\n  '2': [\n    {\n      '1': 'page_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.im.v1.SessionPageType',\n      '10': 'pageType'\n    },\n  ],\n};\n\n/// Descriptor for `DeleteSessionListReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List deleteSessionListReqDescriptor = $convert.base64Decode(\n    'ChREZWxldGVTZXNzaW9uTGlzdFJlcRJACglwYWdlX3R5cGUYASABKA4yIy5iaWxpYmlsaS5hcH'\n    'AuaW0udjEuU2Vzc2lvblBhZ2VUeXBlUghwYWdlVHlwZQ==');\n\n@$core.Deprecated('Use deleteSessionReplyDescriptor instead')\nconst DeleteSessionReply$json = {\n  '1': 'DeleteSessionReply',\n};\n\n/// Descriptor for `DeleteSessionReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List deleteSessionReplyDescriptor =\n    $convert.base64Decode('ChJEZWxldGVTZXNzaW9uUmVwbHk=');\n\n@$core.Deprecated('Use deleteSessionReqDescriptor instead')\nconst DeleteSessionReq$json = {\n  '1': 'DeleteSessionReq',\n  '2': [\n    {\n      '1': 'session_id',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.SessionId',\n      '10': 'sessionId'\n    },\n  ],\n};\n\n/// Descriptor for `DeleteSessionReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List deleteSessionReqDescriptor = $convert.base64Decode(\n    'ChBEZWxldGVTZXNzaW9uUmVxEjwKCnNlc3Npb25faWQYASABKAsyHS5iaWxpYmlsaS5hcHAuaW'\n    '0udjEuU2Vzc2lvbklkUglzZXNzaW9uSWQ=');\n\n@$core.Deprecated('Use filledLabelDescriptor instead')\nconst FilledLabel$json = {\n  '1': 'FilledLabel',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n  ],\n};\n\n/// Descriptor for `FilledLabel`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List filledLabelDescriptor =\n    $convert.base64Decode('CgtGaWxsZWRMYWJlbBISCgR0ZXh0GAEgASgJUgR0ZXh0');\n\n@$core.Deprecated('Use filterConfigDescriptor instead')\nconst FilterConfig$json = {\n  '1': 'FilterConfig',\n  '2': [\n    {\n      '1': 'filters',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.SessionsFilter',\n      '10': 'filters'\n    },\n    {\n      '1': 'current_filter',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.im.v1.SessionFilterType',\n      '10': 'currentFilter'\n    },\n  ],\n};\n\n/// Descriptor for `FilterConfig`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List filterConfigDescriptor = $convert.base64Decode(\n    'CgxGaWx0ZXJDb25maWcSPAoHZmlsdGVycxgBIAMoCzIiLmJpbGliaWxpLmFwcC5pbS52MS5TZX'\n    'NzaW9uc0ZpbHRlclIHZmlsdGVycxJMCg5jdXJyZW50X2ZpbHRlchgCIAEoDjIlLmJpbGliaWxp'\n    'LmFwcC5pbS52MS5TZXNzaW9uRmlsdGVyVHlwZVINY3VycmVudEZpbHRlcg==');\n\n@$core.Deprecated('Use foldIdDescriptor instead')\nconst FoldId$json = {\n  '1': 'FoldId',\n  '2': [\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.im.v1.SessionType',\n      '10': 'type'\n    },\n  ],\n};\n\n/// Descriptor for `FoldId`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List foldIdDescriptor = $convert.base64Decode(\n    'CgZGb2xkSWQSMwoEdHlwZRgBIAEoDjIfLmJpbGliaWxpLmFwcC5pbS52MS5TZXNzaW9uVHlwZV'\n    'IEdHlwZQ==');\n\n@$core.Deprecated('Use getImSettingsReplyDescriptor instead')\nconst GetImSettingsReply$json = {\n  '1': 'GetImSettingsReply',\n  '2': [\n    {'1': 'page_title', '3': 1, '4': 1, '5': 9, '10': 'pageTitle'},\n    {\n      '1': 'settings',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.GetImSettingsReply.SettingsEntry',\n      '10': 'settings'\n    },\n  ],\n  '3': [GetImSettingsReply_SettingsEntry$json],\n};\n\n@$core.Deprecated('Use getImSettingsReplyDescriptor instead')\nconst GetImSettingsReply_SettingsEntry$json = {\n  '1': 'SettingsEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 5, '10': 'key'},\n    {\n      '1': 'value',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.Setting',\n      '10': 'value'\n    },\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `GetImSettingsReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List getImSettingsReplyDescriptor = $convert.base64Decode(\n    'ChJHZXRJbVNldHRpbmdzUmVwbHkSHQoKcGFnZV90aXRsZRgBIAEoCVIJcGFnZVRpdGxlElAKCH'\n    'NldHRpbmdzGAIgAygLMjQuYmlsaWJpbGkuYXBwLmltLnYxLkdldEltU2V0dGluZ3NSZXBseS5T'\n    'ZXR0aW5nc0VudHJ5UghzZXR0aW5ncxpYCg1TZXR0aW5nc0VudHJ5EhAKA2tleRgBIAEoBVIDa2'\n    'V5EjEKBXZhbHVlGAIgASgLMhsuYmlsaWJpbGkuYXBwLmltLnYxLlNldHRpbmdSBXZhbHVlOgI4'\n    'AQ==');\n\n@$core.Deprecated('Use getImSettingsReqDescriptor instead')\nconst GetImSettingsReq$json = {\n  '1': 'GetImSettingsReq',\n  '2': [\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.im.v1.IMSettingType',\n      '10': 'type'\n    },\n  ],\n};\n\n/// Descriptor for `GetImSettingsReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List getImSettingsReqDescriptor = $convert.base64Decode(\n    'ChBHZXRJbVNldHRpbmdzUmVxEjUKBHR5cGUYASABKA4yIS5iaWxpYmlsaS5hcHAuaW0udjEuSU'\n    '1TZXR0aW5nVHlwZVIEdHlwZQ==');\n\n@$core.Deprecated('Use getQuickLinkUnreadReplyDescriptor instead')\nconst GetQuickLinkUnreadReply$json = {\n  '1': 'GetQuickLinkUnreadReply',\n  '2': [\n    {\n      '1': 'items',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.QuickLinkUnreadItem',\n      '10': 'items'\n    },\n  ],\n};\n\n/// Descriptor for `GetQuickLinkUnreadReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List getQuickLinkUnreadReplyDescriptor =\n    $convert.base64Decode(\n        'ChdHZXRRdWlja0xpbmtVbnJlYWRSZXBseRI9CgVpdGVtcxgBIAMoCzInLmJpbGliaWxpLmFwcC'\n        '5pbS52MS5RdWlja0xpbmtVbnJlYWRJdGVtUgVpdGVtcw==');\n\n@$core.Deprecated('Use getQuickLinkUnreadReqDescriptor instead')\nconst GetQuickLinkUnreadReq$json = {\n  '1': 'GetQuickLinkUnreadReq',\n};\n\n/// Descriptor for `GetQuickLinkUnreadReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List getQuickLinkUnreadReqDescriptor =\n    $convert.base64Decode('ChVHZXRRdWlja0xpbmtVbnJlYWRSZXE=');\n\n@$core.Deprecated('Use getTotalUnreadReplyDescriptor instead')\nconst GetTotalUnreadReply$json = {\n  '1': 'GetTotalUnreadReply',\n  '2': [\n    {\n      '1': 'total',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.Unread',\n      '10': 'total'\n    },\n  ],\n};\n\n/// Descriptor for `GetTotalUnreadReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List getTotalUnreadReplyDescriptor = $convert.base64Decode(\n    'ChNHZXRUb3RhbFVucmVhZFJlcGx5EjAKBXRvdGFsGAEgASgLMhouYmlsaWJpbGkuYXBwLmltLn'\n    'YxLlVucmVhZFIFdG90YWw=');\n\n@$core.Deprecated('Use getTotalUnreadReqDescriptor instead')\nconst GetTotalUnreadReq$json = {\n  '1': 'GetTotalUnreadReq',\n};\n\n/// Descriptor for `GetTotalUnreadReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List getTotalUnreadReqDescriptor =\n    $convert.base64Decode('ChFHZXRUb3RhbFVucmVhZFJlcQ==');\n\n@$core.Deprecated('Use groupIdDescriptor instead')\nconst GroupId$json = {\n  '1': 'GroupId',\n  '2': [\n    {'1': 'group_id', '3': 1, '4': 1, '5': 3, '10': 'groupId'},\n  ],\n};\n\n/// Descriptor for `GroupId`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List groupIdDescriptor =\n    $convert.base64Decode('CgdHcm91cElkEhkKCGdyb3VwX2lkGAEgASgDUgdncm91cElk');\n\n@$core.Deprecated('Use imageLabelDescriptor instead')\nconst ImageLabel$json = {\n  '1': 'ImageLabel',\n  '2': [\n    {'1': 'url', '3': 1, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'width', '3': 2, '4': 1, '5': 5, '10': 'width'},\n    {'1': 'height', '3': 3, '4': 1, '5': 5, '10': 'height'},\n  ],\n};\n\n/// Descriptor for `ImageLabel`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List imageLabelDescriptor = $convert.base64Decode(\n    'CgpJbWFnZUxhYmVsEhAKA3VybBgBIAEoCVIDdXJsEhQKBXdpZHRoGAIgASgFUgV3aWR0aBIWCg'\n    'ZoZWlnaHQYAyABKAVSBmhlaWdodA==');\n\n@$core.Deprecated('Use keywordBlockingAddReplyDescriptor instead')\nconst KeywordBlockingAddReply$json = {\n  '1': 'KeywordBlockingAddReply',\n  '2': [\n    {'1': 'toast', '3': 1, '4': 1, '5': 9, '10': 'toast'},\n    {\n      '1': 'item',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.KeywordBlockingItem',\n      '10': 'item'\n    },\n  ],\n};\n\n/// Descriptor for `KeywordBlockingAddReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List keywordBlockingAddReplyDescriptor = $convert.base64Decode(\n    'ChdLZXl3b3JkQmxvY2tpbmdBZGRSZXBseRIUCgV0b2FzdBgBIAEoCVIFdG9hc3QSOwoEaXRlbR'\n    'gCIAEoCzInLmJpbGliaWxpLmFwcC5pbS52MS5LZXl3b3JkQmxvY2tpbmdJdGVtUgRpdGVt');\n\n@$core.Deprecated('Use keywordBlockingAddReqDescriptor instead')\nconst KeywordBlockingAddReq$json = {\n  '1': 'KeywordBlockingAddReq',\n  '2': [\n    {'1': 'keyword', '3': 1, '4': 1, '5': 9, '10': 'keyword'},\n  ],\n};\n\n/// Descriptor for `KeywordBlockingAddReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List keywordBlockingAddReqDescriptor =\n    $convert.base64Decode(\n        'ChVLZXl3b3JkQmxvY2tpbmdBZGRSZXESGAoHa2V5d29yZBgBIAEoCVIHa2V5d29yZA==');\n\n@$core.Deprecated('Use keywordBlockingDeleteReplyDescriptor instead')\nconst KeywordBlockingDeleteReply$json = {\n  '1': 'KeywordBlockingDeleteReply',\n  '2': [\n    {'1': 'toast', '3': 1, '4': 1, '5': 9, '10': 'toast'},\n  ],\n};\n\n/// Descriptor for `KeywordBlockingDeleteReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List keywordBlockingDeleteReplyDescriptor =\n    $convert.base64Decode(\n        'ChpLZXl3b3JkQmxvY2tpbmdEZWxldGVSZXBseRIUCgV0b2FzdBgBIAEoCVIFdG9hc3Q=');\n\n@$core.Deprecated('Use keywordBlockingDeleteReqDescriptor instead')\nconst KeywordBlockingDeleteReq$json = {\n  '1': 'KeywordBlockingDeleteReq',\n  '2': [\n    {'1': 'keyword', '3': 1, '4': 1, '5': 9, '10': 'keyword'},\n  ],\n};\n\n/// Descriptor for `KeywordBlockingDeleteReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List keywordBlockingDeleteReqDescriptor =\n    $convert.base64Decode(\n        'ChhLZXl3b3JkQmxvY2tpbmdEZWxldGVSZXESGAoHa2V5d29yZBgBIAEoCVIHa2V5d29yZA==');\n\n@$core.Deprecated('Use keywordBlockingItemDescriptor instead')\nconst KeywordBlockingItem$json = {\n  '1': 'KeywordBlockingItem',\n  '2': [\n    {'1': 'keyword', '3': 1, '4': 1, '5': 9, '10': 'keyword'},\n  ],\n};\n\n/// Descriptor for `KeywordBlockingItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List keywordBlockingItemDescriptor =\n    $convert.base64Decode(\n        'ChNLZXl3b3JkQmxvY2tpbmdJdGVtEhgKB2tleXdvcmQYASABKAlSB2tleXdvcmQ=');\n\n@$core.Deprecated('Use keywordBlockingListReplyDescriptor instead')\nconst KeywordBlockingListReply$json = {\n  '1': 'KeywordBlockingListReply',\n  '2': [\n    {\n      '1': 'items',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.KeywordBlockingItem',\n      '10': 'items'\n    },\n    {'1': 'list_limit', '3': 2, '4': 1, '5': 5, '10': 'listLimit'},\n    {'1': 'char_limit', '3': 3, '4': 1, '5': 5, '10': 'charLimit'},\n    {'1': 'list_limit_text', '3': 4, '4': 1, '5': 9, '10': 'listLimitText'},\n  ],\n};\n\n/// Descriptor for `KeywordBlockingListReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List keywordBlockingListReplyDescriptor = $convert.base64Decode(\n    'ChhLZXl3b3JkQmxvY2tpbmdMaXN0UmVwbHkSPQoFaXRlbXMYASADKAsyJy5iaWxpYmlsaS5hcH'\n    'AuaW0udjEuS2V5d29yZEJsb2NraW5nSXRlbVIFaXRlbXMSHQoKbGlzdF9saW1pdBgCIAEoBVIJ'\n    'bGlzdExpbWl0Eh0KCmNoYXJfbGltaXQYAyABKAVSCWNoYXJMaW1pdBImCg9saXN0X2xpbWl0X3'\n    'RleHQYBCABKAlSDWxpc3RMaW1pdFRleHQ=');\n\n@$core.Deprecated('Use keywordBlockingListReqDescriptor instead')\nconst KeywordBlockingListReq$json = {\n  '1': 'KeywordBlockingListReq',\n};\n\n/// Descriptor for `KeywordBlockingListReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List keywordBlockingListReqDescriptor =\n    $convert.base64Decode('ChZLZXl3b3JkQmxvY2tpbmdMaXN0UmVx');\n\n@$core.Deprecated('Use medalDescriptor instead')\nconst Medal$json = {\n  '1': 'Medal',\n  '2': [\n    {'1': 'uid', '3': 1, '4': 1, '5': 3, '10': 'uid'},\n    {'1': 'medal_id', '3': 2, '4': 1, '5': 5, '10': 'medalId'},\n    {'1': 'level', '3': 3, '4': 1, '5': 5, '10': 'level'},\n    {'1': 'medal_name', '3': 4, '4': 1, '5': 9, '10': 'medalName'},\n    {'1': 'score', '3': 5, '4': 1, '5': 5, '10': 'score'},\n    {'1': 'intimacy', '3': 6, '4': 1, '5': 5, '10': 'intimacy'},\n    {'1': 'master_status', '3': 7, '4': 1, '5': 5, '10': 'masterStatus'},\n    {'1': 'is_receive', '3': 8, '4': 1, '5': 5, '10': 'isReceive'},\n    {'1': 'medal_color_start', '3': 9, '4': 1, '5': 9, '10': 'medalColorStart'},\n    {'1': 'medal_color_end', '3': 10, '4': 1, '5': 9, '10': 'medalColorEnd'},\n    {\n      '1': 'medal_color_border',\n      '3': 11,\n      '4': 1,\n      '5': 9,\n      '10': 'medalColorBorder'\n    },\n    {'1': 'medal_color_name', '3': 12, '4': 1, '5': 9, '10': 'medalColorName'},\n    {\n      '1': 'medal_color_level',\n      '3': 13,\n      '4': 1,\n      '5': 9,\n      '10': 'medalColorLevel'\n    },\n    {'1': 'guard_level', '3': 14, '4': 1, '5': 3, '10': 'guardLevel'},\n  ],\n};\n\n/// Descriptor for `Medal`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List medalDescriptor = $convert.base64Decode(\n    'CgVNZWRhbBIQCgN1aWQYASABKANSA3VpZBIZCghtZWRhbF9pZBgCIAEoBVIHbWVkYWxJZBIUCg'\n    'VsZXZlbBgDIAEoBVIFbGV2ZWwSHQoKbWVkYWxfbmFtZRgEIAEoCVIJbWVkYWxOYW1lEhQKBXNj'\n    'b3JlGAUgASgFUgVzY29yZRIaCghpbnRpbWFjeRgGIAEoBVIIaW50aW1hY3kSIwoNbWFzdGVyX3'\n    'N0YXR1cxgHIAEoBVIMbWFzdGVyU3RhdHVzEh0KCmlzX3JlY2VpdmUYCCABKAVSCWlzUmVjZWl2'\n    'ZRIqChFtZWRhbF9jb2xvcl9zdGFydBgJIAEoCVIPbWVkYWxDb2xvclN0YXJ0EiYKD21lZGFsX2'\n    'NvbG9yX2VuZBgKIAEoCVINbWVkYWxDb2xvckVuZBIsChJtZWRhbF9jb2xvcl9ib3JkZXIYCyAB'\n    'KAlSEG1lZGFsQ29sb3JCb3JkZXISKAoQbWVkYWxfY29sb3JfbmFtZRgMIAEoCVIObWVkYWxDb2'\n    'xvck5hbWUSKgoRbWVkYWxfY29sb3JfbGV2ZWwYDSABKAlSD21lZGFsQ29sb3JMZXZlbBIfCgtn'\n    'dWFyZF9sZXZlbBgOIAEoA1IKZ3VhcmRMZXZlbA==');\n\n@$core.Deprecated('Use msgSummaryDescriptor instead')\nconst MsgSummary$json = {\n  '1': 'MsgSummary',\n  '2': [\n    {'1': 'raw_msg', '3': 1, '4': 1, '5': 9, '10': 'rawMsg'},\n    {\n      '1': 'prefix_type',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.im.v1.MsgSummaryPrefixType',\n      '10': 'prefixType'\n    },\n    {'1': 'prefix_text', '3': 3, '4': 1, '5': 9, '10': 'prefixText'},\n    {'1': 'is_group_owner', '3': 4, '4': 1, '5': 8, '10': 'isGroupOwner'},\n  ],\n};\n\n/// Descriptor for `MsgSummary`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List msgSummaryDescriptor = $convert.base64Decode(\n    'CgpNc2dTdW1tYXJ5EhcKB3Jhd19tc2cYASABKAlSBnJhd01zZxJJCgtwcmVmaXhfdHlwZRgCIA'\n    'EoDjIoLmJpbGliaWxpLmFwcC5pbS52MS5Nc2dTdW1tYXJ5UHJlZml4VHlwZVIKcHJlZml4VHlw'\n    'ZRIfCgtwcmVmaXhfdGV4dBgDIAEoCVIKcHJlZml4VGV4dBIkCg5pc19ncm91cF9vd25lchgEIA'\n    'EoCFIMaXNHcm91cE93bmVy');\n\n@$core.Deprecated('Use offsetDescriptor instead')\nconst Offset$json = {\n  '1': 'Offset',\n  '2': [\n    {'1': 'normal_offset', '3': 1, '4': 1, '5': 3, '10': 'normalOffset'},\n    {'1': 'top_offset', '3': 2, '4': 1, '5': 3, '10': 'topOffset'},\n  ],\n};\n\n/// Descriptor for `Offset`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List offsetDescriptor = $convert.base64Decode(\n    'CgZPZmZzZXQSIwoNbm9ybWFsX29mZnNldBgBIAEoA1IMbm9ybWFsT2Zmc2V0Eh0KCnRvcF9vZm'\n    'ZzZXQYAiABKANSCXRvcE9mZnNldA==');\n\n@$core.Deprecated('Use operationContentDescriptor instead')\nconst OperationContent$json = {\n  '1': 'OperationContent',\n  '2': [\n    {'1': 'show', '3': 1, '4': 1, '5': 8, '10': 'show'},\n    {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},\n  ],\n};\n\n/// Descriptor for `OperationContent`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List operationContentDescriptor = $convert.base64Decode(\n    'ChBPcGVyYXRpb25Db250ZW50EhIKBHNob3cYASABKAhSBHNob3cSEgoEdGV4dBgCIAEoCVIEdG'\n    'V4dA==');\n\n@$core.Deprecated('Use paginationParamsDescriptor instead')\nconst PaginationParams$json = {\n  '1': 'PaginationParams',\n  '2': [\n    {\n      '1': 'offsets',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.PaginationParams.OffsetsEntry',\n      '10': 'offsets'\n    },\n    {'1': 'has_more', '3': 2, '4': 1, '5': 8, '10': 'hasMore'},\n  ],\n  '3': [PaginationParams_OffsetsEntry$json],\n};\n\n@$core.Deprecated('Use paginationParamsDescriptor instead')\nconst PaginationParams_OffsetsEntry$json = {\n  '1': 'OffsetsEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 5, '10': 'key'},\n    {\n      '1': 'value',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.Offset',\n      '10': 'value'\n    },\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `PaginationParams`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List paginationParamsDescriptor = $convert.base64Decode(\n    'ChBQYWdpbmF0aW9uUGFyYW1zEksKB29mZnNldHMYASADKAsyMS5iaWxpYmlsaS5hcHAuaW0udj'\n    'EuUGFnaW5hdGlvblBhcmFtcy5PZmZzZXRzRW50cnlSB29mZnNldHMSGQoIaGFzX21vcmUYAiAB'\n    'KAhSB2hhc01vcmUaVgoMT2Zmc2V0c0VudHJ5EhAKA2tleRgBIAEoBVIDa2V5EjAKBXZhbHVlGA'\n    'IgASgLMhouYmlsaWJpbGkuYXBwLmltLnYxLk9mZnNldFIFdmFsdWU6AjgB');\n\n@$core.Deprecated('Use pinSessionReplyDescriptor instead')\nconst PinSessionReply$json = {\n  '1': 'PinSessionReply',\n  '2': [\n    {'1': 'sequence_number', '3': 1, '4': 1, '5': 3, '10': 'sequenceNumber'},\n    {'1': 'code', '3': 2, '4': 1, '5': 3, '10': 'code'},\n    {'1': 'message', '3': 3, '4': 1, '5': 9, '10': 'message'},\n  ],\n};\n\n/// Descriptor for `PinSessionReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pinSessionReplyDescriptor = $convert.base64Decode(\n    'Cg9QaW5TZXNzaW9uUmVwbHkSJwoPc2VxdWVuY2VfbnVtYmVyGAEgASgDUg5zZXF1ZW5jZU51bW'\n    'JlchISCgRjb2RlGAIgASgDUgRjb2RlEhgKB21lc3NhZ2UYAyABKAlSB21lc3NhZ2U=');\n\n@$core.Deprecated('Use pinSessionReqDescriptor instead')\nconst PinSessionReq$json = {\n  '1': 'PinSessionReq',\n  '2': [\n    {\n      '1': 'session_id',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.SessionId',\n      '10': 'sessionId'\n    },\n    {'1': 'top_time_micros', '3': 2, '4': 1, '5': 3, '10': 'topTimeMicros'},\n  ],\n};\n\n/// Descriptor for `PinSessionReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pinSessionReqDescriptor = $convert.base64Decode(\n    'Cg1QaW5TZXNzaW9uUmVxEjwKCnNlc3Npb25faWQYASABKAsyHS5iaWxpYmlsaS5hcHAuaW0udj'\n    'EuU2Vzc2lvbklkUglzZXNzaW9uSWQSJgoPdG9wX3RpbWVfbWljcm9zGAIgASgDUg10b3BUaW1l'\n    'TWljcm9z');\n\n@$core.Deprecated('Use privateIdDescriptor instead')\nconst PrivateId$json = {\n  '1': 'PrivateId',\n  '2': [\n    {'1': 'talker_uid', '3': 1, '4': 1, '5': 3, '10': 'talkerUid'},\n  ],\n};\n\n/// Descriptor for `PrivateId`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List privateIdDescriptor = $convert\n    .base64Decode('CglQcml2YXRlSWQSHQoKdGFsa2VyX3VpZBgBIAEoA1IJdGFsa2VyVWlk');\n\n@$core.Deprecated('Use quickLinkBubbleDescriptor instead')\nconst QuickLinkBubble$json = {\n  '1': 'QuickLinkBubble',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'avatar', '3': 2, '4': 1, '5': 9, '10': 'avatar'},\n    {'1': 'nick_name', '3': 3, '4': 1, '5': 9, '10': 'nickName'},\n    {'1': 'content', '3': 4, '4': 1, '5': 9, '10': 'content'},\n    {\n      '1': 'quick_link_item',\n      '3': 5,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.im.v1.QuickLinkItemType',\n      '10': 'quickLinkItem'\n    },\n    {\n      '1': 'msg_type',\n      '3': 6,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.im.v1.QuickLinkMsgType',\n      '10': 'msgType'\n    },\n  ],\n};\n\n/// Descriptor for `QuickLinkBubble`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List quickLinkBubbleDescriptor = $convert.base64Decode(\n    'Cg9RdWlja0xpbmtCdWJibGUSEAoDbWlkGAEgASgDUgNtaWQSFgoGYXZhdGFyGAIgASgJUgZhdm'\n    'F0YXISGwoJbmlja19uYW1lGAMgASgJUghuaWNrTmFtZRIYCgdjb250ZW50GAQgASgJUgdjb250'\n    'ZW50Ek0KD3F1aWNrX2xpbmtfaXRlbRgFIAEoDjIlLmJpbGliaWxpLmFwcC5pbS52MS5RdWlja0'\n    'xpbmtJdGVtVHlwZVINcXVpY2tMaW5rSXRlbRI/Cghtc2dfdHlwZRgGIAEoDjIkLmJpbGliaWxp'\n    'LmFwcC5pbS52MS5RdWlja0xpbmtNc2dUeXBlUgdtc2dUeXBl');\n\n@$core.Deprecated('Use quickLinkConfigDescriptor instead')\nconst QuickLinkConfig$json = {\n  '1': 'QuickLinkConfig',\n  '2': [\n    {\n      '1': 'items',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.QuickLinkItem',\n      '10': 'items'\n    },\n    {\n      '1': 'bubble',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.QuickLinkBubble',\n      '10': 'bubble'\n    },\n    {'1': 'is_legacy_style', '3': 3, '4': 1, '5': 8, '10': 'isLegacyStyle'},\n  ],\n};\n\n/// Descriptor for `QuickLinkConfig`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List quickLinkConfigDescriptor = $convert.base64Decode(\n    'Cg9RdWlja0xpbmtDb25maWcSNwoFaXRlbXMYASADKAsyIS5iaWxpYmlsaS5hcHAuaW0udjEuUX'\n    'VpY2tMaW5rSXRlbVIFaXRlbXMSOwoGYnViYmxlGAIgASgLMiMuYmlsaWJpbGkuYXBwLmltLnYx'\n    'LlF1aWNrTGlua0J1YmJsZVIGYnViYmxlEiYKD2lzX2xlZ2FjeV9zdHlsZRgDIAEoCFINaXNMZW'\n    'dhY3lTdHlsZQ==');\n\n@$core.Deprecated('Use quickLinkItemDescriptor instead')\nconst QuickLinkItem$json = {\n  '1': 'QuickLinkItem',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'icon', '3': 2, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'icon_dark', '3': 3, '4': 1, '5': 9, '10': 'iconDark'},\n    {'1': 'url', '3': 4, '4': 1, '5': 9, '10': 'url'},\n    {\n      '1': 'unread',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.Unread',\n      '10': 'unread'\n    },\n    {\n      '1': 'item_type',\n      '3': 6,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.im.v1.QuickLinkItemType',\n      '10': 'itemType'\n    },\n  ],\n};\n\n/// Descriptor for `QuickLinkItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List quickLinkItemDescriptor = $convert.base64Decode(\n    'Cg1RdWlja0xpbmtJdGVtEhQKBXRpdGxlGAEgASgJUgV0aXRsZRISCgRpY29uGAIgASgJUgRpY2'\n    '9uEhsKCWljb25fZGFyaxgDIAEoCVIIaWNvbkRhcmsSEAoDdXJsGAQgASgJUgN1cmwSMgoGdW5y'\n    'ZWFkGAUgASgLMhouYmlsaWJpbGkuYXBwLmltLnYxLlVucmVhZFIGdW5yZWFkEkIKCWl0ZW1fdH'\n    'lwZRgGIAEoDjIlLmJpbGliaWxpLmFwcC5pbS52MS5RdWlja0xpbmtJdGVtVHlwZVIIaXRlbVR5'\n    'cGU=');\n\n@$core.Deprecated('Use quickLinkUnreadItemDescriptor instead')\nconst QuickLinkUnreadItem$json = {\n  '1': 'QuickLinkUnreadItem',\n  '2': [\n    {\n      '1': 'item_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.im.v1.QuickLinkItemType',\n      '10': 'itemType'\n    },\n    {\n      '1': 'unread',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.Unread',\n      '10': 'unread'\n    },\n  ],\n};\n\n/// Descriptor for `QuickLinkUnreadItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List quickLinkUnreadItemDescriptor = $convert.base64Decode(\n    'ChNRdWlja0xpbmtVbnJlYWRJdGVtEkIKCWl0ZW1fdHlwZRgBIAEoDjIlLmJpbGliaWxpLmFwcC'\n    '5pbS52MS5RdWlja0xpbmtJdGVtVHlwZVIIaXRlbVR5cGUSMgoGdW5yZWFkGAIgASgLMhouYmls'\n    'aWJpbGkuYXBwLmltLnYxLlVucmVhZFIGdW5yZWFk');\n\n@$core.Deprecated('Use restrictedModeDescriptor instead')\nconst RestrictedMode$json = {\n  '1': 'RestrictedMode',\n  '2': [\n    {'1': 'teenagers', '3': 1, '4': 1, '5': 8, '10': 'teenagers'},\n    {'1': 'lessons', '3': 2, '4': 1, '5': 8, '10': 'lessons'},\n  ],\n};\n\n/// Descriptor for `RestrictedMode`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List restrictedModeDescriptor = $convert.base64Decode(\n    'Cg5SZXN0cmljdGVkTW9kZRIcCgl0ZWVuYWdlcnMYASABKAhSCXRlZW5hZ2VycxIYCgdsZXNzb2'\n    '5zGAIgASgIUgdsZXNzb25z');\n\n@$core.Deprecated('Use selectItemDescriptor instead')\nconst SelectItem$json = {\n  '1': 'SelectItem',\n  '2': [\n    {'1': 'item_type', '3': 1, '4': 1, '5': 5, '10': 'itemType'},\n    {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'selected', '3': 3, '4': 1, '5': 8, '10': 'selected'},\n  ],\n};\n\n/// Descriptor for `SelectItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List selectItemDescriptor = $convert.base64Decode(\n    'CgpTZWxlY3RJdGVtEhsKCWl0ZW1fdHlwZRgBIAEoBVIIaXRlbVR5cGUSEgoEdGV4dBgCIAEoCV'\n    'IEdGV4dBIaCghzZWxlY3RlZBgDIAEoCFIIc2VsZWN0ZWQ=');\n\n@$core.Deprecated('Use sessionDescriptor instead')\nconst Session$json = {\n  '1': 'Session',\n  '2': [\n    {\n      '1': 'id',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.SessionId',\n      '10': 'id'\n    },\n    {\n      '1': 'session_info',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.SessionInfo',\n      '10': 'sessionInfo'\n    },\n    {\n      '1': 'unread',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.Unread',\n      '10': 'unread'\n    },\n    {\n      '1': 'msg_summary',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.MsgSummary',\n      '10': 'msgSummary'\n    },\n    {'1': 'timestamp', '3': 5, '4': 1, '5': 3, '10': 'timestamp'},\n    {'1': 'is_pinned', '3': 6, '4': 1, '5': 8, '10': 'isPinned'},\n    {'1': 'sequence_number', '3': 7, '4': 1, '5': 3, '10': 'sequenceNumber'},\n    {'1': 'is_muted', '3': 8, '4': 1, '5': 8, '10': 'isMuted'},\n    {'1': 'chat_url', '3': 9, '4': 1, '5': 9, '10': 'chatUrl'},\n    {\n      '1': 'operation',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.SessionOperation',\n      '10': 'operation'\n    },\n    {\n      '1': 'trace_params',\n      '3': 11,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.Session.TraceParamsEntry',\n      '10': 'traceParams'\n    },\n  ],\n  '3': [Session_TraceParamsEntry$json],\n};\n\n@$core.Deprecated('Use sessionDescriptor instead')\nconst Session_TraceParamsEntry$json = {\n  '1': 'TraceParamsEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `Session`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sessionDescriptor = $convert.base64Decode(\n    'CgdTZXNzaW9uEi0KAmlkGAEgASgLMh0uYmlsaWJpbGkuYXBwLmltLnYxLlNlc3Npb25JZFICaW'\n    'QSQgoMc2Vzc2lvbl9pbmZvGAIgASgLMh8uYmlsaWJpbGkuYXBwLmltLnYxLlNlc3Npb25JbmZv'\n    'UgtzZXNzaW9uSW5mbxIyCgZ1bnJlYWQYAyABKAsyGi5iaWxpYmlsaS5hcHAuaW0udjEuVW5yZW'\n    'FkUgZ1bnJlYWQSPwoLbXNnX3N1bW1hcnkYBCABKAsyHi5iaWxpYmlsaS5hcHAuaW0udjEuTXNn'\n    'U3VtbWFyeVIKbXNnU3VtbWFyeRIcCgl0aW1lc3RhbXAYBSABKANSCXRpbWVzdGFtcBIbCglpc1'\n    '9waW5uZWQYBiABKAhSCGlzUGlubmVkEicKD3NlcXVlbmNlX251bWJlchgHIAEoA1IOc2VxdWVu'\n    'Y2VOdW1iZXISGQoIaXNfbXV0ZWQYCCABKAhSB2lzTXV0ZWQSGQoIY2hhdF91cmwYCSABKAlSB2'\n    'NoYXRVcmwSQgoJb3BlcmF0aW9uGAogASgLMiQuYmlsaWJpbGkuYXBwLmltLnYxLlNlc3Npb25P'\n    'cGVyYXRpb25SCW9wZXJhdGlvbhJPCgx0cmFjZV9wYXJhbXMYCyADKAsyLC5iaWxpYmlsaS5hcH'\n    'AuaW0udjEuU2Vzc2lvbi5UcmFjZVBhcmFtc0VudHJ5Ugt0cmFjZVBhcmFtcxo+ChBUcmFjZVBh'\n    'cmFtc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAE=');\n\n@$core.Deprecated('Use sessionIdDescriptor instead')\nconst SessionId$json = {\n  '1': 'SessionId',\n  '2': [\n    {\n      '1': 'private_id',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.PrivateId',\n      '9': 0,\n      '10': 'privateId'\n    },\n    {\n      '1': 'group_id',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.GroupId',\n      '9': 0,\n      '10': 'groupId'\n    },\n    {\n      '1': 'fold_id',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.FoldId',\n      '9': 0,\n      '10': 'foldId'\n    },\n    {\n      '1': 'system_id',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.SystemId',\n      '9': 0,\n      '10': 'systemId'\n    },\n    {\n      '1': 'customer_id',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.CustomerId',\n      '9': 0,\n      '10': 'customerId'\n    },\n  ],\n  '8': [\n    {'1': 'id'},\n  ],\n};\n\n/// Descriptor for `SessionId`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sessionIdDescriptor = $convert.base64Decode(\n    'CglTZXNzaW9uSWQSPgoKcHJpdmF0ZV9pZBgBIAEoCzIdLmJpbGliaWxpLmFwcC5pbS52MS5Qcm'\n    'l2YXRlSWRIAFIJcHJpdmF0ZUlkEjgKCGdyb3VwX2lkGAIgASgLMhsuYmlsaWJpbGkuYXBwLmlt'\n    'LnYxLkdyb3VwSWRIAFIHZ3JvdXBJZBI1Cgdmb2xkX2lkGAMgASgLMhouYmlsaWJpbGkuYXBwLm'\n    'ltLnYxLkZvbGRJZEgAUgZmb2xkSWQSOwoJc3lzdGVtX2lkGAQgASgLMhwuYmlsaWJpbGkuYXBw'\n    'LmltLnYxLlN5c3RlbUlkSABSCHN5c3RlbUlkEkEKC2N1c3RvbWVyX2lkGAUgASgLMh4uYmlsaW'\n    'JpbGkuYXBwLmltLnYxLkN1c3RvbWVySWRIAFIKY3VzdG9tZXJJZEIECgJpZA==');\n\n@$core.Deprecated('Use sessionInfoDescriptor instead')\nconst SessionInfo$json = {\n  '1': 'SessionInfo',\n  '2': [\n    {'1': 'session_name', '3': 1, '4': 1, '5': 9, '10': 'sessionName'},\n    {\n      '1': 'name_render',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.account.service.v1.NameRender',\n      '10': 'nameRender'\n    },\n    {\n      '1': 'avatar',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.AvatarItem',\n      '10': 'avatar'\n    },\n    {'1': 'vip_info', '3': 4, '4': 1, '5': 9, '10': 'vipInfo'},\n    {\n      '1': 'user_label',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.UserLabel',\n      '10': 'userLabel'\n    },\n    {'1': 'is_live', '3': 6, '4': 1, '5': 8, '10': 'isLive'},\n  ],\n};\n\n/// Descriptor for `SessionInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sessionInfoDescriptor = $convert.base64Decode(\n    'CgtTZXNzaW9uSW5mbxIhCgxzZXNzaW9uX25hbWUYASABKAlSC3Nlc3Npb25OYW1lEkgKC25hbW'\n    'VfcmVuZGVyGAIgASgLMicuYmlsaWJpbGkuYWNjb3VudC5zZXJ2aWNlLnYxLk5hbWVSZW5kZXJS'\n    'Cm5hbWVSZW5kZXISRQoGYXZhdGFyGAMgASgLMi0uYmlsaWJpbGkuZGFndy5jb21wb25lbnQuYX'\n    'ZhdGFyLnYxLkF2YXRhckl0ZW1SBmF2YXRhchIZCgh2aXBfaW5mbxgEIAEoCVIHdmlwSW5mbxI8'\n    'Cgp1c2VyX2xhYmVsGAUgASgLMh0uYmlsaWJpbGkuYXBwLmltLnYxLlVzZXJMYWJlbFIJdXNlck'\n    'xhYmVsEhcKB2lzX2xpdmUYBiABKAhSBmlzTGl2ZQ==');\n\n@$core.Deprecated('Use sessionListExtraInfoDescriptor instead')\nconst SessionListExtraInfo$json = {\n  '1': 'SessionListExtraInfo',\n  '2': [\n    {\n      '1': 'auto_reply_toast',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.AutoReplyToast',\n      '10': 'autoReplyToast'\n    },\n    {\n      '1': 'show_anti_harassment_popup',\n      '3': 2,\n      '4': 1,\n      '5': 8,\n      '10': 'showAntiHarassmentPopup'\n    },\n    {\n      '1': 'customer_hint_title',\n      '3': 3,\n      '4': 1,\n      '5': 9,\n      '10': 'customerHintTitle'\n    },\n    {\n      '1': 'behavior_alert_toast',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.BehaviorAlertToast',\n      '10': 'behaviorAlertToast'\n    },\n  ],\n};\n\n/// Descriptor for `SessionListExtraInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sessionListExtraInfoDescriptor = $convert.base64Decode(\n    'ChRTZXNzaW9uTGlzdEV4dHJhSW5mbxJMChBhdXRvX3JlcGx5X3RvYXN0GAEgASgLMiIuYmlsaW'\n    'JpbGkuYXBwLmltLnYxLkF1dG9SZXBseVRvYXN0Ug5hdXRvUmVwbHlUb2FzdBI7ChpzaG93X2Fu'\n    'dGlfaGFyYXNzbWVudF9wb3B1cBgCIAEoCFIXc2hvd0FudGlIYXJhc3NtZW50UG9wdXASLgoTY3'\n    'VzdG9tZXJfaGludF90aXRsZRgDIAEoCVIRY3VzdG9tZXJIaW50VGl0bGUSWAoUYmVoYXZpb3Jf'\n    'YWxlcnRfdG9hc3QYBCABKAsyJi5iaWxpYmlsaS5hcHAuaW0udjEuQmVoYXZpb3JBbGVydFRvYX'\n    'N0UhJiZWhhdmlvckFsZXJ0VG9hc3Q=');\n\n@$core.Deprecated('Use sessionListUpdateReplyDescriptor instead')\nconst SessionListUpdateReply$json = {\n  '1': 'SessionListUpdateReply',\n  '2': [\n    {\n      '1': 'sessions',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.Session',\n      '10': 'sessions'\n    },\n    {\n      '1': 'update_session_params',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.UpdateSessionParams',\n      '10': 'updateSessionParams'\n    },\n  ],\n};\n\n/// Descriptor for `SessionListUpdateReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sessionListUpdateReplyDescriptor = $convert.base64Decode(\n    'ChZTZXNzaW9uTGlzdFVwZGF0ZVJlcGx5EjcKCHNlc3Npb25zGAEgAygLMhsuYmlsaWJpbGkuYX'\n    'BwLmltLnYxLlNlc3Npb25SCHNlc3Npb25zElsKFXVwZGF0ZV9zZXNzaW9uX3BhcmFtcxgCIAEo'\n    'CzInLmJpbGliaWxpLmFwcC5pbS52MS5VcGRhdGVTZXNzaW9uUGFyYW1zUhN1cGRhdGVTZXNzaW'\n    '9uUGFyYW1z');\n\n@$core.Deprecated('Use sessionListUpdateReqDescriptor instead')\nconst SessionListUpdateReq$json = {\n  '1': 'SessionListUpdateReq',\n  '2': [\n    {\n      '1': 'restricted_mode',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.RestrictedMode',\n      '10': 'restrictedMode'\n    },\n    {\n      '1': 'update_params',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.UpdateSessionParams',\n      '10': 'updateParams'\n    },\n    {\n      '1': 'page_type',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.im.v1.SessionPageType',\n      '10': 'pageType'\n    },\n    {\n      '1': 'filter_type',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.im.v1.SessionFilterType',\n      '10': 'filterType'\n    },\n  ],\n};\n\n/// Descriptor for `SessionListUpdateReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sessionListUpdateReqDescriptor = $convert.base64Decode(\n    'ChRTZXNzaW9uTGlzdFVwZGF0ZVJlcRJLCg9yZXN0cmljdGVkX21vZGUYASABKAsyIi5iaWxpYm'\n    'lsaS5hcHAuaW0udjEuUmVzdHJpY3RlZE1vZGVSDnJlc3RyaWN0ZWRNb2RlEkwKDXVwZGF0ZV9w'\n    'YXJhbXMYAiABKAsyJy5iaWxpYmlsaS5hcHAuaW0udjEuVXBkYXRlU2Vzc2lvblBhcmFtc1IMdX'\n    'BkYXRlUGFyYW1zEkAKCXBhZ2VfdHlwZRgDIAEoDjIjLmJpbGliaWxpLmFwcC5pbS52MS5TZXNz'\n    'aW9uUGFnZVR5cGVSCHBhZ2VUeXBlEkYKC2ZpbHRlcl90eXBlGAQgASgOMiUuYmlsaWJpbGkuYX'\n    'BwLmltLnYxLlNlc3Npb25GaWx0ZXJUeXBlUgpmaWx0ZXJUeXBl');\n\n@$core.Deprecated('Use sessionMainReplyDescriptor instead')\nconst SessionMainReply$json = {\n  '1': 'SessionMainReply',\n  '2': [\n    {\n      '1': 'pagination_params',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.PaginationParams',\n      '10': 'paginationParams'\n    },\n    {\n      '1': 'update_session_params',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.UpdateSessionParams',\n      '10': 'updateSessionParams'\n    },\n    {\n      '1': 'quick_link_config',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.QuickLinkConfig',\n      '10': 'quickLinkConfig'\n    },\n    {\n      '1': 'filter_config',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.FilterConfig',\n      '10': 'filterConfig'\n    },\n    {\n      '1': 'sessions',\n      '3': 5,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.Session',\n      '10': 'sessions'\n    },\n    {\n      '1': 'three_dot_items',\n      '3': 6,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.ThreeDotItem',\n      '10': 'threeDotItems'\n    },\n    {\n      '1': 'outside_item',\n      '3': 7,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.ThreeDotItem',\n      '10': 'outsideItem'\n    },\n    {\n      '1': 'extra_info',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.SessionListExtraInfo',\n      '10': 'extraInfo'\n    },\n  ],\n};\n\n/// Descriptor for `SessionMainReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sessionMainReplyDescriptor = $convert.base64Decode(\n    'ChBTZXNzaW9uTWFpblJlcGx5ElEKEXBhZ2luYXRpb25fcGFyYW1zGAEgASgLMiQuYmlsaWJpbG'\n    'kuYXBwLmltLnYxLlBhZ2luYXRpb25QYXJhbXNSEHBhZ2luYXRpb25QYXJhbXMSWwoVdXBkYXRl'\n    'X3Nlc3Npb25fcGFyYW1zGAIgASgLMicuYmlsaWJpbGkuYXBwLmltLnYxLlVwZGF0ZVNlc3Npb2'\n    '5QYXJhbXNSE3VwZGF0ZVNlc3Npb25QYXJhbXMSTwoRcXVpY2tfbGlua19jb25maWcYAyABKAsy'\n    'Iy5iaWxpYmlsaS5hcHAuaW0udjEuUXVpY2tMaW5rQ29uZmlnUg9xdWlja0xpbmtDb25maWcSRQ'\n    'oNZmlsdGVyX2NvbmZpZxgEIAEoCzIgLmJpbGliaWxpLmFwcC5pbS52MS5GaWx0ZXJDb25maWdS'\n    'DGZpbHRlckNvbmZpZxI3CghzZXNzaW9ucxgFIAMoCzIbLmJpbGliaWxpLmFwcC5pbS52MS5TZX'\n    'NzaW9uUghzZXNzaW9ucxJICg90aHJlZV9kb3RfaXRlbXMYBiADKAsyIC5iaWxpYmlsaS5hcHAu'\n    'aW0udjEuVGhyZWVEb3RJdGVtUg10aHJlZURvdEl0ZW1zEkMKDG91dHNpZGVfaXRlbRgHIAMoCz'\n    'IgLmJpbGliaWxpLmFwcC5pbS52MS5UaHJlZURvdEl0ZW1SC291dHNpZGVJdGVtEkcKCmV4dHJh'\n    'X2luZm8YCCABKAsyKC5iaWxpYmlsaS5hcHAuaW0udjEuU2Vzc2lvbkxpc3RFeHRyYUluZm9SCW'\n    'V4dHJhSW5mbw==');\n\n@$core.Deprecated('Use sessionMainReqDescriptor instead')\nconst SessionMainReq$json = {\n  '1': 'SessionMainReq',\n  '2': [\n    {\n      '1': 'restricted_mode',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.RestrictedMode',\n      '10': 'restrictedMode'\n    },\n    {\n      '1': 'pagination_params',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.PaginationParams',\n      '10': 'paginationParams'\n    },\n    {\n      '1': 'filter_type',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.im.v1.SessionFilterType',\n      '10': 'filterType'\n    },\n  ],\n};\n\n/// Descriptor for `SessionMainReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sessionMainReqDescriptor = $convert.base64Decode(\n    'Cg5TZXNzaW9uTWFpblJlcRJLCg9yZXN0cmljdGVkX21vZGUYASABKAsyIi5iaWxpYmlsaS5hcH'\n    'AuaW0udjEuUmVzdHJpY3RlZE1vZGVSDnJlc3RyaWN0ZWRNb2RlElEKEXBhZ2luYXRpb25fcGFy'\n    'YW1zGAIgASgLMiQuYmlsaWJpbGkuYXBwLmltLnYxLlBhZ2luYXRpb25QYXJhbXNSEHBhZ2luYX'\n    'Rpb25QYXJhbXMSRgoLZmlsdGVyX3R5cGUYAyABKA4yJS5iaWxpYmlsaS5hcHAuaW0udjEuU2Vz'\n    'c2lvbkZpbHRlclR5cGVSCmZpbHRlclR5cGU=');\n\n@$core.Deprecated('Use sessionOperationDescriptor instead')\nconst SessionOperation$json = {\n  '1': 'SessionOperation',\n  '2': [\n    {\n      '1': 'pin',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.OperationContent',\n      '10': 'pin'\n    },\n    {\n      '1': 'unpin',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.OperationContent',\n      '10': 'unpin'\n    },\n    {\n      '1': 'delete',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.OperationContent',\n      '10': 'delete'\n    },\n    {\n      '1': 'clear_unread',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.OperationContent',\n      '10': 'clearUnread'\n    },\n    {\n      '1': 'unblock',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.OperationContent',\n      '10': 'unblock'\n    },\n  ],\n};\n\n/// Descriptor for `SessionOperation`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sessionOperationDescriptor = $convert.base64Decode(\n    'ChBTZXNzaW9uT3BlcmF0aW9uEjYKA3BpbhgBIAEoCzIkLmJpbGliaWxpLmFwcC5pbS52MS5PcG'\n    'VyYXRpb25Db250ZW50UgNwaW4SOgoFdW5waW4YAiABKAsyJC5iaWxpYmlsaS5hcHAuaW0udjEu'\n    'T3BlcmF0aW9uQ29udGVudFIFdW5waW4SPAoGZGVsZXRlGAMgASgLMiQuYmlsaWJpbGkuYXBwLm'\n    'ltLnYxLk9wZXJhdGlvbkNvbnRlbnRSBmRlbGV0ZRJHCgxjbGVhcl91bnJlYWQYBCABKAsyJC5i'\n    'aWxpYmlsaS5hcHAuaW0udjEuT3BlcmF0aW9uQ29udGVudFILY2xlYXJVbnJlYWQSPgoHdW5ibG'\n    '9jaxgFIAEoCzIkLmJpbGliaWxpLmFwcC5pbS52MS5PcGVyYXRpb25Db250ZW50Ugd1bmJsb2Nr');\n\n@$core.Deprecated('Use sessionSecondaryReplyDescriptor instead')\nconst SessionSecondaryReply$json = {\n  '1': 'SessionSecondaryReply',\n  '2': [\n    {\n      '1': 'pagination_params',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.PaginationParams',\n      '10': 'paginationParams'\n    },\n    {\n      '1': 'update_session_params',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.UpdateSessionParams',\n      '10': 'updateSessionParams'\n    },\n    {\n      '1': 'sessions',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.Session',\n      '10': 'sessions'\n    },\n    {\n      '1': 'three_dot_items',\n      '3': 4,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.ThreeDotItem',\n      '10': 'threeDotItems'\n    },\n    {\n      '1': 'outside_item',\n      '3': 5,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.ThreeDotItem',\n      '10': 'outsideItem'\n    },\n  ],\n};\n\n/// Descriptor for `SessionSecondaryReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sessionSecondaryReplyDescriptor = $convert.base64Decode(\n    'ChVTZXNzaW9uU2Vjb25kYXJ5UmVwbHkSUQoRcGFnaW5hdGlvbl9wYXJhbXMYASABKAsyJC5iaW'\n    'xpYmlsaS5hcHAuaW0udjEuUGFnaW5hdGlvblBhcmFtc1IQcGFnaW5hdGlvblBhcmFtcxJbChV1'\n    'cGRhdGVfc2Vzc2lvbl9wYXJhbXMYAiABKAsyJy5iaWxpYmlsaS5hcHAuaW0udjEuVXBkYXRlU2'\n    'Vzc2lvblBhcmFtc1ITdXBkYXRlU2Vzc2lvblBhcmFtcxI3CghzZXNzaW9ucxgDIAMoCzIbLmJp'\n    'bGliaWxpLmFwcC5pbS52MS5TZXNzaW9uUghzZXNzaW9ucxJICg90aHJlZV9kb3RfaXRlbXMYBC'\n    'ADKAsyIC5iaWxpYmlsaS5hcHAuaW0udjEuVGhyZWVEb3RJdGVtUg10aHJlZURvdEl0ZW1zEkMK'\n    'DG91dHNpZGVfaXRlbRgFIAMoCzIgLmJpbGliaWxpLmFwcC5pbS52MS5UaHJlZURvdEl0ZW1SC2'\n    '91dHNpZGVJdGVt');\n\n@$core.Deprecated('Use sessionSecondaryReqDescriptor instead')\nconst SessionSecondaryReq$json = {\n  '1': 'SessionSecondaryReq',\n  '2': [\n    {\n      '1': 'restricted_mode',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.RestrictedMode',\n      '10': 'restrictedMode'\n    },\n    {\n      '1': 'pagination_params',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.PaginationParams',\n      '10': 'paginationParams'\n    },\n    {\n      '1': 'page_type',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.im.v1.SessionPageType',\n      '10': 'pageType'\n    },\n  ],\n};\n\n/// Descriptor for `SessionSecondaryReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sessionSecondaryReqDescriptor = $convert.base64Decode(\n    'ChNTZXNzaW9uU2Vjb25kYXJ5UmVxEksKD3Jlc3RyaWN0ZWRfbW9kZRgBIAEoCzIiLmJpbGliaW'\n    'xpLmFwcC5pbS52MS5SZXN0cmljdGVkTW9kZVIOcmVzdHJpY3RlZE1vZGUSUQoRcGFnaW5hdGlv'\n    'bl9wYXJhbXMYAiABKAsyJC5iaWxpYmlsaS5hcHAuaW0udjEuUGFnaW5hdGlvblBhcmFtc1IQcG'\n    'FnaW5hdGlvblBhcmFtcxJACglwYWdlX3R5cGUYAyABKA4yIy5iaWxpYmlsaS5hcHAuaW0udjEu'\n    'U2Vzc2lvblBhZ2VUeXBlUghwYWdlVHlwZQ==');\n\n@$core.Deprecated('Use sessionUpdateReplyDescriptor instead')\nconst SessionUpdateReply$json = {\n  '1': 'SessionUpdateReply',\n  '2': [\n    {\n      '1': 'session',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.Session',\n      '10': 'session'\n    },\n  ],\n};\n\n/// Descriptor for `SessionUpdateReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sessionUpdateReplyDescriptor = $convert.base64Decode(\n    'ChJTZXNzaW9uVXBkYXRlUmVwbHkSNQoHc2Vzc2lvbhgBIAEoCzIbLmJpbGliaWxpLmFwcC5pbS'\n    '52MS5TZXNzaW9uUgdzZXNzaW9u');\n\n@$core.Deprecated('Use sessionUpdateReqDescriptor instead')\nconst SessionUpdateReq$json = {\n  '1': 'SessionUpdateReq',\n  '2': [\n    {\n      '1': 'session_id',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.SessionId',\n      '10': 'sessionId'\n    },\n    {\n      '1': 'page_type',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.im.v1.SessionPageType',\n      '10': 'pageType'\n    },\n  ],\n};\n\n/// Descriptor for `SessionUpdateReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sessionUpdateReqDescriptor = $convert.base64Decode(\n    'ChBTZXNzaW9uVXBkYXRlUmVxEjwKCnNlc3Npb25faWQYASABKAsyHS5iaWxpYmlsaS5hcHAuaW'\n    '0udjEuU2Vzc2lvbklkUglzZXNzaW9uSWQSQAoJcGFnZV90eXBlGAIgASgOMiMuYmlsaWJpbGku'\n    'YXBwLmltLnYxLlNlc3Npb25QYWdlVHlwZVIIcGFnZVR5cGU=');\n\n@$core.Deprecated('Use sessionsFilterDescriptor instead')\nconst SessionsFilter$json = {\n  '1': 'SessionsFilter',\n  '2': [\n    {\n      '1': 'stype',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.im.v1.SessionFilterType',\n      '10': 'stype'\n    },\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n  ],\n};\n\n/// Descriptor for `SessionsFilter`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sessionsFilterDescriptor = $convert.base64Decode(\n    'Cg5TZXNzaW9uc0ZpbHRlchI7CgVzdHlwZRgBIAEoDjIlLmJpbGliaWxpLmFwcC5pbS52MS5TZX'\n    'NzaW9uRmlsdGVyVHlwZVIFc3R5cGUSFAoFdGl0bGUYAiABKAlSBXRpdGxl');\n\n@$core.Deprecated('Use setImSettingsReplyDescriptor instead')\nconst SetImSettingsReply$json = {\n  '1': 'SetImSettingsReply',\n  '2': [\n    {'1': 'toast', '3': 1, '4': 1, '5': 9, '10': 'toast'},\n  ],\n};\n\n/// Descriptor for `SetImSettingsReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List setImSettingsReplyDescriptor = $convert\n    .base64Decode('ChJTZXRJbVNldHRpbmdzUmVwbHkSFAoFdG9hc3QYASABKAlSBXRvYXN0');\n\n@$core.Deprecated('Use setImSettingsReqDescriptor instead')\nconst SetImSettingsReq$json = {\n  '1': 'SetImSettingsReq',\n  '2': [\n    {\n      '1': 'settings',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.SetImSettingsReq.SettingsEntry',\n      '10': 'settings'\n    },\n  ],\n  '3': [SetImSettingsReq_SettingsEntry$json],\n};\n\n@$core.Deprecated('Use setImSettingsReqDescriptor instead')\nconst SetImSettingsReq_SettingsEntry$json = {\n  '1': 'SettingsEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 5, '10': 'key'},\n    {\n      '1': 'value',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.Setting',\n      '10': 'value'\n    },\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `SetImSettingsReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List setImSettingsReqDescriptor = $convert.base64Decode(\n    'ChBTZXRJbVNldHRpbmdzUmVxEk4KCHNldHRpbmdzGAEgAygLMjIuYmlsaWJpbGkuYXBwLmltLn'\n    'YxLlNldEltU2V0dGluZ3NSZXEuU2V0dGluZ3NFbnRyeVIIc2V0dGluZ3MaWAoNU2V0dGluZ3NF'\n    'bnRyeRIQCgNrZXkYASABKAVSA2tleRIxCgV2YWx1ZRgCIAEoCzIbLmJpbGliaWxpLmFwcC5pbS'\n    '52MS5TZXR0aW5nUgV2YWx1ZToCOAE=');\n\n@$core.Deprecated('Use settingDescriptor instead')\nconst Setting$json = {\n  '1': 'Setting',\n  '2': [\n    {\n      '1': 'switch',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.SettingSwitch',\n      '9': 0,\n      '10': 'switch'\n    },\n    {\n      '1': 'select',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.SettingSelect',\n      '9': 0,\n      '10': 'select'\n    },\n    {\n      '1': 'redirect',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.SettingRedirect',\n      '9': 0,\n      '10': 'redirect'\n    },\n    {\n      '1': 'text',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.SettingText',\n      '9': 0,\n      '10': 'text'\n    },\n  ],\n  '8': [\n    {'1': 'content'},\n  ],\n};\n\n/// Descriptor for `Setting`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List settingDescriptor = $convert.base64Decode(\n    'CgdTZXR0aW5nEjsKBnN3aXRjaBgBIAEoCzIhLmJpbGliaWxpLmFwcC5pbS52MS5TZXR0aW5nU3'\n    'dpdGNoSABSBnN3aXRjaBI7CgZzZWxlY3QYAiABKAsyIS5iaWxpYmlsaS5hcHAuaW0udjEuU2V0'\n    'dGluZ1NlbGVjdEgAUgZzZWxlY3QSQQoIcmVkaXJlY3QYAyABKAsyIy5iaWxpYmlsaS5hcHAuaW'\n    '0udjEuU2V0dGluZ1JlZGlyZWN0SABSCHJlZGlyZWN0EjUKBHRleHQYBCABKAsyHy5iaWxpYmls'\n    'aS5hcHAuaW0udjEuU2V0dGluZ1RleHRIAFIEdGV4dEIJCgdjb250ZW50');\n\n@$core.Deprecated('Use settingRedirectDescriptor instead')\nconst SettingRedirect$json = {\n  '1': 'SettingRedirect',\n  '2': [\n    {\n      '1': 'setting_page',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.redirect2SettingPage',\n      '9': 0,\n      '10': 'settingPage'\n    },\n    {\n      '1': 'other_page',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.redirect2OtherPage',\n      '9': 0,\n      '10': 'otherPage'\n    },\n    {\n      '1': 'popup',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.redirect2Popup',\n      '9': 0,\n      '10': 'popup'\n    },\n    {\n      '1': 'window_select',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.redirectWindowSelect',\n      '9': 0,\n      '10': 'windowSelect'\n    },\n    {'1': 'title', '3': 3, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'subtitle', '3': 4, '4': 1, '5': 9, '10': 'subtitle'},\n    {'1': 'selected_summary', '3': 5, '4': 1, '5': 9, '10': 'selectedSummary'},\n  ],\n  '8': [\n    {'1': 'content'},\n  ],\n};\n\n/// Descriptor for `SettingRedirect`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List settingRedirectDescriptor = $convert.base64Decode(\n    'Cg9TZXR0aW5nUmVkaXJlY3QSTQoMc2V0dGluZ19wYWdlGAEgASgLMiguYmlsaWJpbGkuYXBwLm'\n    'ltLnYxLnJlZGlyZWN0MlNldHRpbmdQYWdlSABSC3NldHRpbmdQYWdlEkcKCm90aGVyX3BhZ2UY'\n    'AiABKAsyJi5iaWxpYmlsaS5hcHAuaW0udjEucmVkaXJlY3QyT3RoZXJQYWdlSABSCW90aGVyUG'\n    'FnZRI6CgVwb3B1cBgGIAEoCzIiLmJpbGliaWxpLmFwcC5pbS52MS5yZWRpcmVjdDJQb3B1cEgA'\n    'UgVwb3B1cBJPCg13aW5kb3dfc2VsZWN0GAcgASgLMiguYmlsaWJpbGkuYXBwLmltLnYxLnJlZG'\n    'lyZWN0V2luZG93U2VsZWN0SABSDHdpbmRvd1NlbGVjdBIUCgV0aXRsZRgDIAEoCVIFdGl0bGUS'\n    'GgoIc3VidGl0bGUYBCABKAlSCHN1YnRpdGxlEikKEHNlbGVjdGVkX3N1bW1hcnkYBSABKAlSD3'\n    'NlbGVjdGVkU3VtbWFyeUIJCgdjb250ZW50');\n\n@$core.Deprecated('Use settingSelectDescriptor instead')\nconst SettingSelect$json = {\n  '1': 'SettingSelect',\n  '2': [\n    {\n      '1': 'item',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.SelectItem',\n      '10': 'item'\n    },\n  ],\n};\n\n/// Descriptor for `SettingSelect`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List settingSelectDescriptor = $convert.base64Decode(\n    'Cg1TZXR0aW5nU2VsZWN0EjIKBGl0ZW0YASADKAsyHi5iaWxpYmlsaS5hcHAuaW0udjEuU2VsZW'\n    'N0SXRlbVIEaXRlbQ==');\n\n@$core.Deprecated('Use settingSwitchDescriptor instead')\nconst SettingSwitch$json = {\n  '1': 'SettingSwitch',\n  '2': [\n    {'1': 'switch_on', '3': 1, '4': 1, '5': 8, '10': 'switchOn'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'subtitle', '3': 3, '4': 1, '5': 9, '10': 'subtitle'},\n  ],\n};\n\n/// Descriptor for `SettingSwitch`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List settingSwitchDescriptor = $convert.base64Decode(\n    'Cg1TZXR0aW5nU3dpdGNoEhsKCXN3aXRjaF9vbhgBIAEoCFIIc3dpdGNoT24SFAoFdGl0bGUYAi'\n    'ABKAlSBXRpdGxlEhoKCHN1YnRpdGxlGAMgASgJUghzdWJ0aXRsZQ==');\n\n@$core.Deprecated('Use settingTextDescriptor instead')\nconst SettingText$json = {\n  '1': 'SettingText',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n  ],\n};\n\n/// Descriptor for `SettingText`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List settingTextDescriptor =\n    $convert.base64Decode('CgtTZXR0aW5nVGV4dBISCgR0ZXh0GAEgASgJUgR0ZXh0');\n\n@$core.Deprecated('Use systemIdDescriptor instead')\nconst SystemId$json = {\n  '1': 'SystemId',\n  '2': [\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.im.v1.SessionType',\n      '10': 'type'\n    },\n  ],\n};\n\n/// Descriptor for `SystemId`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List systemIdDescriptor = $convert.base64Decode(\n    'CghTeXN0ZW1JZBIzCgR0eXBlGAEgASgOMh8uYmlsaWJpbGkuYXBwLmltLnYxLlNlc3Npb25UeX'\n    'BlUgR0eXBl');\n\n@$core.Deprecated('Use threeDotItemDescriptor instead')\nconst ThreeDotItem$json = {\n  '1': 'ThreeDotItem',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'icon', '3': 2, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'url', '3': 3, '4': 1, '5': 9, '10': 'url'},\n    {\n      '1': 'type',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.im.v1.ThreeDotItemType',\n      '10': 'type'\n    },\n    {'1': 'has_red_dot', '3': 5, '4': 1, '5': 8, '10': 'hasRedDot'},\n  ],\n};\n\n/// Descriptor for `ThreeDotItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List threeDotItemDescriptor = $convert.base64Decode(\n    'CgxUaHJlZURvdEl0ZW0SFAoFdGl0bGUYASABKAlSBXRpdGxlEhIKBGljb24YAiABKAlSBGljb2'\n    '4SEAoDdXJsGAMgASgJUgN1cmwSOAoEdHlwZRgEIAEoDjIkLmJpbGliaWxpLmFwcC5pbS52MS5U'\n    'aHJlZURvdEl0ZW1UeXBlUgR0eXBlEh4KC2hhc19yZWRfZG90GAUgASgIUgloYXNSZWREb3Q=');\n\n@$core.Deprecated('Use unPinSessionReplyDescriptor instead')\nconst UnPinSessionReply$json = {\n  '1': 'UnPinSessionReply',\n  '2': [\n    {'1': 'sequence_number', '3': 1, '4': 1, '5': 3, '10': 'sequenceNumber'},\n  ],\n};\n\n/// Descriptor for `UnPinSessionReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List unPinSessionReplyDescriptor = $convert.base64Decode(\n    'ChFVblBpblNlc3Npb25SZXBseRInCg9zZXF1ZW5jZV9udW1iZXIYASABKANSDnNlcXVlbmNlTn'\n    'VtYmVy');\n\n@$core.Deprecated('Use unPinSessionReqDescriptor instead')\nconst UnPinSessionReq$json = {\n  '1': 'UnPinSessionReq',\n  '2': [\n    {\n      '1': 'session_id',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.SessionId',\n      '10': 'sessionId'\n    },\n  ],\n};\n\n/// Descriptor for `UnPinSessionReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List unPinSessionReqDescriptor = $convert.base64Decode(\n    'Cg9VblBpblNlc3Npb25SZXESPAoKc2Vzc2lvbl9pZBgBIAEoCzIdLmJpbGliaWxpLmFwcC5pbS'\n    '52MS5TZXNzaW9uSWRSCXNlc3Npb25JZA==');\n\n@$core.Deprecated('Use unreadDescriptor instead')\nconst Unread$json = {\n  '1': 'Unread',\n  '2': [\n    {\n      '1': 'style',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.im.v1.UnreadStyle',\n      '10': 'style'\n    },\n    {'1': 'number', '3': 2, '4': 1, '5': 3, '10': 'number'},\n    {'1': 'number_show', '3': 3, '4': 1, '5': 9, '10': 'numberShow'},\n  ],\n};\n\n/// Descriptor for `Unread`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List unreadDescriptor = $convert.base64Decode(\n    'CgZVbnJlYWQSNQoFc3R5bGUYASABKA4yHy5iaWxpYmlsaS5hcHAuaW0udjEuVW5yZWFkU3R5bG'\n    'VSBXN0eWxlEhYKBm51bWJlchgCIAEoA1IGbnVtYmVyEh8KC251bWJlcl9zaG93GAMgASgJUgpu'\n    'dW1iZXJTaG93');\n\n@$core.Deprecated('Use updateSessionParamsDescriptor instead')\nconst UpdateSessionParams$json = {\n  '1': 'UpdateSessionParams',\n  '2': [\n    {\n      '1': 'max_session_ts',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.UpdateSessionParams.MaxSessionTsEntry',\n      '10': 'maxSessionTs'\n    },\n  ],\n  '3': [UpdateSessionParams_MaxSessionTsEntry$json],\n};\n\n@$core.Deprecated('Use updateSessionParamsDescriptor instead')\nconst UpdateSessionParams_MaxSessionTsEntry$json = {\n  '1': 'MaxSessionTsEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 5, '10': 'key'},\n    {\n      '1': 'value',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.Offset',\n      '10': 'value'\n    },\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `UpdateSessionParams`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List updateSessionParamsDescriptor = $convert.base64Decode(\n    'ChNVcGRhdGVTZXNzaW9uUGFyYW1zEl8KDm1heF9zZXNzaW9uX3RzGAEgAygLMjkuYmlsaWJpbG'\n    'kuYXBwLmltLnYxLlVwZGF0ZVNlc3Npb25QYXJhbXMuTWF4U2Vzc2lvblRzRW50cnlSDG1heFNl'\n    'c3Npb25UcxpbChFNYXhTZXNzaW9uVHNFbnRyeRIQCgNrZXkYASABKAVSA2tleRIwCgV2YWx1ZR'\n    'gCIAEoCzIaLmJpbGliaWxpLmFwcC5pbS52MS5PZmZzZXRSBXZhbHVlOgI4AQ==');\n\n@$core.Deprecated('Use userLabelDescriptor instead')\nconst UserLabel$json = {\n  '1': 'UserLabel',\n  '2': [\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.im.v1.LabelType',\n      '10': 'type'\n    },\n    {\n      '1': 'style',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.UserLabelStyle',\n      '10': 'style'\n    },\n  ],\n};\n\n/// Descriptor for `UserLabel`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List userLabelDescriptor = $convert.base64Decode(\n    'CglVc2VyTGFiZWwSMQoEdHlwZRgBIAEoDjIdLmJpbGliaWxpLmFwcC5pbS52MS5MYWJlbFR5cG'\n    'VSBHR5cGUSOAoFc3R5bGUYAiABKAsyIi5iaWxpYmlsaS5hcHAuaW0udjEuVXNlckxhYmVsU3R5'\n    'bGVSBXN0eWxl');\n\n@$core.Deprecated('Use userLabelStyleDescriptor instead')\nconst UserLabelStyle$json = {\n  '1': 'UserLabelStyle',\n  '2': [\n    {\n      '1': 'bordered_label',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.BorderedLabel',\n      '9': 0,\n      '10': 'borderedLabel'\n    },\n    {\n      '1': 'filled_label',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.FilledLabel',\n      '9': 0,\n      '10': 'filledLabel'\n    },\n    {\n      '1': 'image_label',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.ImageLabel',\n      '9': 0,\n      '10': 'imageLabel'\n    },\n    {\n      '1': 'medal_label',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.Medal',\n      '9': 0,\n      '10': 'medalLabel'\n    },\n  ],\n  '8': [\n    {'1': 'style'},\n  ],\n};\n\n/// Descriptor for `UserLabelStyle`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List userLabelStyleDescriptor = $convert.base64Decode(\n    'Cg5Vc2VyTGFiZWxTdHlsZRJKCg5ib3JkZXJlZF9sYWJlbBgCIAEoCzIhLmJpbGliaWxpLmFwcC'\n    '5pbS52MS5Cb3JkZXJlZExhYmVsSABSDWJvcmRlcmVkTGFiZWwSRAoMZmlsbGVkX2xhYmVsGAMg'\n    'ASgLMh8uYmlsaWJpbGkuYXBwLmltLnYxLkZpbGxlZExhYmVsSABSC2ZpbGxlZExhYmVsEkEKC2'\n    'ltYWdlX2xhYmVsGAQgASgLMh4uYmlsaWJpbGkuYXBwLmltLnYxLkltYWdlTGFiZWxIAFIKaW1h'\n    'Z2VMYWJlbBI8CgttZWRhbF9sYWJlbBgFIAEoCzIZLmJpbGliaWxpLmFwcC5pbS52MS5NZWRhbE'\n    'gAUgptZWRhbExhYmVsQgcKBXN0eWxl');\n\n@$core.Deprecated('Use redirect2OtherPageDescriptor instead')\nconst redirect2OtherPage$json = {\n  '1': 'redirect2OtherPage',\n  '2': [\n    {'1': 'url', '3': 1, '4': 1, '5': 9, '10': 'url'},\n  ],\n};\n\n/// Descriptor for `redirect2OtherPage`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List redirect2OtherPageDescriptor = $convert\n    .base64Decode('ChJyZWRpcmVjdDJPdGhlclBhZ2USEAoDdXJsGAEgASgJUgN1cmw=');\n\n@$core.Deprecated('Use redirect2PopupDescriptor instead')\nconst redirect2Popup$json = {\n  '1': 'redirect2Popup',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'subtitle', '3': 2, '4': 1, '5': 9, '10': 'subtitle'},\n    {'1': 'url', '3': 3, '4': 1, '5': 9, '10': 'url'},\n  ],\n};\n\n/// Descriptor for `redirect2Popup`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List redirect2PopupDescriptor = $convert.base64Decode(\n    'Cg5yZWRpcmVjdDJQb3B1cBIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSGgoIc3VidGl0bGUYAiABKA'\n    'lSCHN1YnRpdGxlEhAKA3VybBgDIAEoCVIDdXJs');\n\n@$core.Deprecated('Use redirect2SettingPageDescriptor instead')\nconst redirect2SettingPage$json = {\n  '1': 'redirect2SettingPage',\n  '2': [\n    {\n      '1': 'sub_settings',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.redirect2SettingPage.SubSettingsEntry',\n      '10': 'subSettings'\n    },\n    {'1': 'page_title', '3': 2, '4': 1, '5': 9, '10': 'pageTitle'},\n    {'1': 'url', '3': 3, '4': 1, '5': 9, '10': 'url'},\n    {\n      '1': 'parent_setting_type',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.im.v1.IMSettingType',\n      '10': 'parentSettingType'\n    },\n  ],\n  '3': [redirect2SettingPage_SubSettingsEntry$json],\n};\n\n@$core.Deprecated('Use redirect2SettingPageDescriptor instead')\nconst redirect2SettingPage_SubSettingsEntry$json = {\n  '1': 'SubSettingsEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 5, '10': 'key'},\n    {\n      '1': 'value',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.Setting',\n      '10': 'value'\n    },\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `redirect2SettingPage`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List redirect2SettingPageDescriptor = $convert.base64Decode(\n    'ChRyZWRpcmVjdDJTZXR0aW5nUGFnZRJcCgxzdWJfc2V0dGluZ3MYASADKAsyOS5iaWxpYmlsaS'\n    '5hcHAuaW0udjEucmVkaXJlY3QyU2V0dGluZ1BhZ2UuU3ViU2V0dGluZ3NFbnRyeVILc3ViU2V0'\n    'dGluZ3MSHQoKcGFnZV90aXRsZRgCIAEoCVIJcGFnZVRpdGxlEhAKA3VybBgDIAEoCVIDdXJsEl'\n    'EKE3BhcmVudF9zZXR0aW5nX3R5cGUYBCABKA4yIS5iaWxpYmlsaS5hcHAuaW0udjEuSU1TZXR0'\n    'aW5nVHlwZVIRcGFyZW50U2V0dGluZ1R5cGUaWwoQU3ViU2V0dGluZ3NFbnRyeRIQCgNrZXkYAS'\n    'ABKAVSA2tleRIxCgV2YWx1ZRgCIAEoCzIbLmJpbGliaWxpLmFwcC5pbS52MS5TZXR0aW5nUgV2'\n    'YWx1ZToCOAE=');\n\n@$core.Deprecated('Use redirectWindowSelectDescriptor instead')\nconst redirectWindowSelect$json = {\n  '1': 'redirectWindowSelect',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'item',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.im.v1.SelectItem',\n      '10': 'item'\n    },\n  ],\n};\n\n/// Descriptor for `redirectWindowSelect`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List redirectWindowSelectDescriptor = $convert.base64Decode(\n    'ChRyZWRpcmVjdFdpbmRvd1NlbGVjdBIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSMgoEaXRlbRgCIA'\n    'MoCzIeLmJpbGliaWxpLmFwcC5pbS52MS5TZWxlY3RJdGVtUgRpdGVt');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/interfaces/v1.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/interfaces/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:fixnum/fixnum.dart' as $fixnum;\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nimport '../archive/middleware/v1.pb.dart' as $3;\nimport '../archive/v1.pb.dart' as $1;\nimport '../card/v1.pb.dart' as $2;\nimport '../dynamic/v2.pb.dart' as $4;\nimport 'v1.pbenum.dart';\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nexport 'v1.pbenum.dart';\n\nclass Arc extends $pb.GeneratedMessage {\n  factory Arc({\n    $1.Arc? archive,\n    $core.String? uri,\n    $core.String? viewContent,\n    $fixnum.Int64? iconType,\n    $core.String? coverIcon,\n    $core.bool? isFold,\n    $core.bool? isPugv,\n    $core.String? publishTimeText,\n    $core.Iterable<$core.String>? badges,\n    $core.bool? isOneself,\n  }) {\n    final result = create();\n    if (archive != null) result.archive = archive;\n    if (uri != null) result.uri = uri;\n    if (viewContent != null) result.viewContent = viewContent;\n    if (iconType != null) result.iconType = iconType;\n    if (coverIcon != null) result.coverIcon = coverIcon;\n    if (isFold != null) result.isFold = isFold;\n    if (isPugv != null) result.isPugv = isPugv;\n    if (publishTimeText != null) result.publishTimeText = publishTimeText;\n    if (badges != null) result.badges.addAll(badges);\n    if (isOneself != null) result.isOneself = isOneself;\n    return result;\n  }\n\n  Arc._();\n\n  factory Arc.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Arc.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Arc',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOM<$1.Arc>(1, _omitFieldNames ? '' : 'archive',\n        subBuilder: $1.Arc.create)\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..aOS(3, _omitFieldNames ? '' : 'viewContent')\n    ..aInt64(4, _omitFieldNames ? '' : 'iconType')\n    ..aOS(5, _omitFieldNames ? '' : 'coverIcon')\n    ..aOB(6, _omitFieldNames ? '' : 'isFold')\n    ..aOB(7, _omitFieldNames ? '' : 'isPugv')\n    ..aOS(8, _omitFieldNames ? '' : 'publishTimeText')\n    ..pPS(9, _omitFieldNames ? '' : 'badges')\n    ..aOB(10, _omitFieldNames ? '' : 'isOneself')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Arc clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Arc copyWith(void Function(Arc) updates) =>\n      super.copyWith((message) => updates(message as Arc)) as Arc;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Arc create() => Arc._();\n  @$core.override\n  Arc createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Arc getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Arc>(create);\n  static Arc? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $1.Arc get archive => $_getN(0);\n  @$pb.TagNumber(1)\n  set archive($1.Arc value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasArchive() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearArchive() => $_clearField(1);\n  @$pb.TagNumber(1)\n  $1.Arc ensureArchive() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get viewContent => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set viewContent($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasViewContent() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearViewContent() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get iconType => $_getI64(3);\n  @$pb.TagNumber(4)\n  set iconType($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIconType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIconType() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get coverIcon => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set coverIcon($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCoverIcon() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCoverIcon() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.bool get isFold => $_getBF(5);\n  @$pb.TagNumber(6)\n  set isFold($core.bool value) => $_setBool(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasIsFold() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearIsFold() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.bool get isPugv => $_getBF(6);\n  @$pb.TagNumber(7)\n  set isPugv($core.bool value) => $_setBool(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasIsPugv() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearIsPugv() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get publishTimeText => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set publishTimeText($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasPublishTimeText() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearPublishTimeText() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $pb.PbList<$core.String> get badges => $_getList(8);\n\n  @$pb.TagNumber(10)\n  $core.bool get isOneself => $_getBF(9);\n  @$pb.TagNumber(10)\n  set isOneself($core.bool value) => $_setBool(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasIsOneself() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearIsOneself() => $_clearField(10);\n}\n\nclass Badge extends $pb.GeneratedMessage {\n  factory Badge({\n    $core.String? text,\n    $core.String? icon,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (icon != null) result.icon = icon;\n    return result;\n  }\n\n  Badge._();\n\n  factory Badge.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Badge.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Badge',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aOS(2, _omitFieldNames ? '' : 'icon')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Badge clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Badge copyWith(void Function(Badge) updates) =>\n      super.copyWith((message) => updates(message as Badge)) as Badge;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Badge create() => Badge._();\n  @$core.override\n  Badge createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Badge getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Badge>(create);\n  static Badge? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get icon => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set icon($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIcon() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIcon() => $_clearField(2);\n}\n\nclass BigItem extends $pb.GeneratedMessage {\n  factory BigItem({\n    $core.String? title,\n    $core.String? coverImageUri,\n    $core.String? uri,\n    $core.String? coverRightText,\n    $core.String? coverLeftText1,\n    $fixnum.Int64? coverLeftIcon1,\n    $core.String? coverLeftText2,\n    $fixnum.Int64? coverLeftIcon2,\n    UserCard? userCard,\n    LikeButton? likeButton,\n    $fixnum.Int64? param,\n    $2.SharePlane? sharePlane,\n    $2.PanelMeta? threePointMeta,\n    $2.InlineProgressBar? inlineProgressBar,\n    $core.int? canPlay,\n    $3.PlayerArgs? playerArgs,\n    $core.bool? isFav,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (coverImageUri != null) result.coverImageUri = coverImageUri;\n    if (uri != null) result.uri = uri;\n    if (coverRightText != null) result.coverRightText = coverRightText;\n    if (coverLeftText1 != null) result.coverLeftText1 = coverLeftText1;\n    if (coverLeftIcon1 != null) result.coverLeftIcon1 = coverLeftIcon1;\n    if (coverLeftText2 != null) result.coverLeftText2 = coverLeftText2;\n    if (coverLeftIcon2 != null) result.coverLeftIcon2 = coverLeftIcon2;\n    if (userCard != null) result.userCard = userCard;\n    if (likeButton != null) result.likeButton = likeButton;\n    if (param != null) result.param = param;\n    if (sharePlane != null) result.sharePlane = sharePlane;\n    if (threePointMeta != null) result.threePointMeta = threePointMeta;\n    if (inlineProgressBar != null) result.inlineProgressBar = inlineProgressBar;\n    if (canPlay != null) result.canPlay = canPlay;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    if (isFav != null) result.isFav = isFav;\n    return result;\n  }\n\n  BigItem._();\n\n  factory BigItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BigItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BigItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'coverImageUri')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..aOS(4, _omitFieldNames ? '' : 'coverRightText')\n    ..aOS(5, _omitFieldNames ? '' : 'coverLeftText1')\n    ..aInt64(6, _omitFieldNames ? '' : 'coverLeftIcon1')\n    ..aOS(7, _omitFieldNames ? '' : 'coverLeftText2')\n    ..aInt64(8, _omitFieldNames ? '' : 'coverLeftIcon2')\n    ..aOM<UserCard>(9, _omitFieldNames ? '' : 'userCard',\n        subBuilder: UserCard.create)\n    ..aOM<LikeButton>(10, _omitFieldNames ? '' : 'likeButton',\n        subBuilder: LikeButton.create)\n    ..aInt64(11, _omitFieldNames ? '' : 'param')\n    ..aOM<$2.SharePlane>(12, _omitFieldNames ? '' : 'sharePlane',\n        subBuilder: $2.SharePlane.create)\n    ..aOM<$2.PanelMeta>(13, _omitFieldNames ? '' : 'threePointMeta',\n        subBuilder: $2.PanelMeta.create)\n    ..aOM<$2.InlineProgressBar>(14, _omitFieldNames ? '' : 'inlineProgressBar',\n        subBuilder: $2.InlineProgressBar.create)\n    ..aI(15, _omitFieldNames ? '' : 'canPlay')\n    ..aOM<$3.PlayerArgs>(16, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $3.PlayerArgs.create)\n    ..aOB(17, _omitFieldNames ? '' : 'isFav')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BigItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BigItem copyWith(void Function(BigItem) updates) =>\n      super.copyWith((message) => updates(message as BigItem)) as BigItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BigItem create() => BigItem._();\n  @$core.override\n  BigItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BigItem getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BigItem>(create);\n  static BigItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get coverImageUri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set coverImageUri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCoverImageUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCoverImageUri() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get coverRightText => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set coverRightText($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCoverRightText() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCoverRightText() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get coverLeftText1 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set coverLeftText1($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCoverLeftText1() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCoverLeftText1() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get coverLeftIcon1 => $_getI64(5);\n  @$pb.TagNumber(6)\n  set coverLeftIcon1($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCoverLeftIcon1() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCoverLeftIcon1() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get coverLeftText2 => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set coverLeftText2($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCoverLeftText2() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCoverLeftText2() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get coverLeftIcon2 => $_getI64(7);\n  @$pb.TagNumber(8)\n  set coverLeftIcon2($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasCoverLeftIcon2() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearCoverLeftIcon2() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  UserCard get userCard => $_getN(8);\n  @$pb.TagNumber(9)\n  set userCard(UserCard value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasUserCard() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearUserCard() => $_clearField(9);\n  @$pb.TagNumber(9)\n  UserCard ensureUserCard() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  LikeButton get likeButton => $_getN(9);\n  @$pb.TagNumber(10)\n  set likeButton(LikeButton value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasLikeButton() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearLikeButton() => $_clearField(10);\n  @$pb.TagNumber(10)\n  LikeButton ensureLikeButton() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  $fixnum.Int64 get param => $_getI64(10);\n  @$pb.TagNumber(11)\n  set param($fixnum.Int64 value) => $_setInt64(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasParam() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearParam() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $2.SharePlane get sharePlane => $_getN(11);\n  @$pb.TagNumber(12)\n  set sharePlane($2.SharePlane value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasSharePlane() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearSharePlane() => $_clearField(12);\n  @$pb.TagNumber(12)\n  $2.SharePlane ensureSharePlane() => $_ensure(11);\n\n  @$pb.TagNumber(13)\n  $2.PanelMeta get threePointMeta => $_getN(12);\n  @$pb.TagNumber(13)\n  set threePointMeta($2.PanelMeta value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasThreePointMeta() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearThreePointMeta() => $_clearField(13);\n  @$pb.TagNumber(13)\n  $2.PanelMeta ensureThreePointMeta() => $_ensure(12);\n\n  @$pb.TagNumber(14)\n  $2.InlineProgressBar get inlineProgressBar => $_getN(13);\n  @$pb.TagNumber(14)\n  set inlineProgressBar($2.InlineProgressBar value) => $_setField(14, value);\n  @$pb.TagNumber(14)\n  $core.bool hasInlineProgressBar() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearInlineProgressBar() => $_clearField(14);\n  @$pb.TagNumber(14)\n  $2.InlineProgressBar ensureInlineProgressBar() => $_ensure(13);\n\n  @$pb.TagNumber(15)\n  $core.int get canPlay => $_getIZ(14);\n  @$pb.TagNumber(15)\n  set canPlay($core.int value) => $_setSignedInt32(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasCanPlay() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearCanPlay() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $3.PlayerArgs get playerArgs => $_getN(15);\n  @$pb.TagNumber(16)\n  set playerArgs($3.PlayerArgs value) => $_setField(16, value);\n  @$pb.TagNumber(16)\n  $core.bool hasPlayerArgs() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearPlayerArgs() => $_clearField(16);\n  @$pb.TagNumber(16)\n  $3.PlayerArgs ensurePlayerArgs() => $_ensure(15);\n\n  @$pb.TagNumber(17)\n  $core.bool get isFav => $_getBF(16);\n  @$pb.TagNumber(17)\n  set isFav($core.bool value) => $_setBool(16, value);\n  @$pb.TagNumber(17)\n  $core.bool hasIsFav() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearIsFav() => $_clearField(17);\n}\n\nclass Button extends $pb.GeneratedMessage {\n  factory Button({\n    $core.String? title,\n    $core.String? link,\n    $core.String? id,\n    $fixnum.Int64? icon,\n    ButType? butType,\n    $core.int? followState,\n    $core.String? hasTitle_7,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (link != null) result.link = link;\n    if (id != null) result.id = id;\n    if (icon != null) result.icon = icon;\n    if (butType != null) result.butType = butType;\n    if (followState != null) result.followState = followState;\n    if (hasTitle_7 != null) result.hasTitle_7 = hasTitle_7;\n    return result;\n  }\n\n  Button._();\n\n  factory Button.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Button.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Button',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'link')\n    ..aOS(3, _omitFieldNames ? '' : 'id')\n    ..aInt64(4, _omitFieldNames ? '' : 'icon')\n    ..aE<ButType>(5, _omitFieldNames ? '' : 'butType',\n        enumValues: ButType.values)\n    ..aI(6, _omitFieldNames ? '' : 'followState')\n    ..aOS(7, _omitFieldNames ? '' : 'hasTitle')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Button clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Button copyWith(void Function(Button) updates) =>\n      super.copyWith((message) => updates(message as Button)) as Button;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Button create() => Button._();\n  @$core.override\n  Button createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Button getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Button>(create);\n  static Button? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get link => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set link($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLink() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLink() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get id => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set id($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearId() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get icon => $_getI64(3);\n  @$pb.TagNumber(4)\n  set icon($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIcon() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIcon() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  ButType get butType => $_getN(4);\n  @$pb.TagNumber(5)\n  set butType(ButType value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasButType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearButType() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get followState => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set followState($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasFollowState() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearFollowState() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get hasTitle_7 => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set hasTitle_7($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasHasTitle_7() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearHasTitle_7() => $_clearField(7);\n}\n\n/// 专栏卡片\nclass CardArticle extends $pb.GeneratedMessage {\n  factory CardArticle({\n    $core.Iterable<$core.String>? covers,\n    $core.String? name,\n    $fixnum.Int64? mid,\n    $core.bool? displayAttention,\n    $core.String? badge,\n    Relation? relation,\n  }) {\n    final result = create();\n    if (covers != null) result.covers.addAll(covers);\n    if (name != null) result.name = name;\n    if (mid != null) result.mid = mid;\n    if (displayAttention != null) result.displayAttention = displayAttention;\n    if (badge != null) result.badge = badge;\n    if (relation != null) result.relation = relation;\n    return result;\n  }\n\n  CardArticle._();\n\n  factory CardArticle.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CardArticle.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CardArticle',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..pPS(1, _omitFieldNames ? '' : 'covers')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aInt64(3, _omitFieldNames ? '' : 'mid')\n    ..aOB(4, _omitFieldNames ? '' : 'displayAttention')\n    ..aOS(5, _omitFieldNames ? '' : 'badge')\n    ..aOM<Relation>(6, _omitFieldNames ? '' : 'relation',\n        subBuilder: Relation.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardArticle clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardArticle copyWith(void Function(CardArticle) updates) =>\n      super.copyWith((message) => updates(message as CardArticle))\n          as CardArticle;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CardArticle create() => CardArticle._();\n  @$core.override\n  CardArticle createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CardArticle getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CardArticle>(create);\n  static CardArticle? _defaultInstance;\n\n  /// 封面\n  @$pb.TagNumber(1)\n  $pb.PbList<$core.String> get covers => $_getList(0);\n\n  /// 标题\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  /// UP 主 mid\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get mid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set mid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasMid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearMid() => $_clearField(3);\n\n  /// 是否展示 \"关注\" 按钮\n  @$pb.TagNumber(4)\n  $core.bool get displayAttention => $_getBF(3);\n  @$pb.TagNumber(4)\n  set displayAttention($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDisplayAttention() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDisplayAttention() => $_clearField(4);\n\n  /// 角标\n  @$pb.TagNumber(5)\n  $core.String get badge => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set badge($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBadge() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBadge() => $_clearField(5);\n\n  /// 新关注组件\n  @$pb.TagNumber(6)\n  Relation get relation => $_getN(5);\n  @$pb.TagNumber(6)\n  set relation(Relation value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasRelation() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearRelation() => $_clearField(6);\n  @$pb.TagNumber(6)\n  Relation ensureRelation() => $_ensure(5);\n}\n\n/// 付费课程卡片\nclass CardCheese extends $pb.GeneratedMessage {\n  factory CardCheese({\n    $core.String? cover,\n    $fixnum.Int64? progress,\n    $fixnum.Int64? duration,\n    $core.String? subtitle,\n    $fixnum.Int64? state,\n  }) {\n    final result = create();\n    if (cover != null) result.cover = cover;\n    if (progress != null) result.progress = progress;\n    if (duration != null) result.duration = duration;\n    if (subtitle != null) result.subtitle = subtitle;\n    if (state != null) result.state = state;\n    return result;\n  }\n\n  CardCheese._();\n\n  factory CardCheese.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CardCheese.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CardCheese',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'cover')\n    ..aInt64(2, _omitFieldNames ? '' : 'progress')\n    ..aInt64(3, _omitFieldNames ? '' : 'duration')\n    ..aOS(4, _omitFieldNames ? '' : 'subtitle')\n    ..aInt64(5, _omitFieldNames ? '' : 'state')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardCheese clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardCheese copyWith(void Function(CardCheese) updates) =>\n      super.copyWith((message) => updates(message as CardCheese)) as CardCheese;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CardCheese create() => CardCheese._();\n  @$core.override\n  CardCheese createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CardCheese getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CardCheese>(create);\n  static CardCheese? _defaultInstance;\n\n  /// 封面\n  @$pb.TagNumber(1)\n  $core.String get cover => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set cover($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCover() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCover() => $_clearField(1);\n\n  /// 观看进度\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get progress => $_getI64(1);\n  @$pb.TagNumber(2)\n  set progress($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasProgress() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearProgress() => $_clearField(2);\n\n  /// 时长\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get duration => $_getI64(2);\n  @$pb.TagNumber(3)\n  set duration($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDuration() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDuration() => $_clearField(3);\n\n  /// 分集标题\n  @$pb.TagNumber(4)\n  $core.String get subtitle => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set subtitle($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSubtitle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSubtitle() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get state => $_getI64(4);\n  @$pb.TagNumber(5)\n  set state($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasState() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearState() => $_clearField(5);\n}\n\n/// 直播卡片\nclass CardLive extends $pb.GeneratedMessage {\n  factory CardLive({\n    $core.String? cover,\n    $core.String? name,\n    $fixnum.Int64? mid,\n    $core.String? tag,\n    $core.int? status,\n    $core.bool? displayAttention,\n    Relation? relation,\n  }) {\n    final result = create();\n    if (cover != null) result.cover = cover;\n    if (name != null) result.name = name;\n    if (mid != null) result.mid = mid;\n    if (tag != null) result.tag = tag;\n    if (status != null) result.status = status;\n    if (displayAttention != null) result.displayAttention = displayAttention;\n    if (relation != null) result.relation = relation;\n    return result;\n  }\n\n  CardLive._();\n\n  factory CardLive.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CardLive.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CardLive',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'cover')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aInt64(3, _omitFieldNames ? '' : 'mid')\n    ..aOS(4, _omitFieldNames ? '' : 'tag')\n    ..aI(5, _omitFieldNames ? '' : 'status')\n    ..aOB(6, _omitFieldNames ? '' : 'displayAttention')\n    ..aOM<Relation>(7, _omitFieldNames ? '' : 'relation',\n        subBuilder: Relation.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardLive clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardLive copyWith(void Function(CardLive) updates) =>\n      super.copyWith((message) => updates(message as CardLive)) as CardLive;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CardLive create() => CardLive._();\n  @$core.override\n  CardLive createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CardLive getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CardLive>(create);\n  static CardLive? _defaultInstance;\n\n  /// 封面\n  @$pb.TagNumber(1)\n  $core.String get cover => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set cover($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCover() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCover() => $_clearField(1);\n\n  /// UP 主昵称\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  /// UP 主 mid\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get mid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set mid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasMid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearMid() => $_clearField(3);\n\n  /// tag 名称\n  @$pb.TagNumber(4)\n  $core.String get tag => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set tag($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTag() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTag() => $_clearField(4);\n\n  /// 直播状态\n  @$pb.TagNumber(5)\n  $core.int get status => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set status($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasStatus() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearStatus() => $_clearField(5);\n\n  /// 是否展示 \"关注\" 按钮\n  @$pb.TagNumber(6)\n  $core.bool get displayAttention => $_getBF(5);\n  @$pb.TagNumber(6)\n  set displayAttention($core.bool value) => $_setBool(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasDisplayAttention() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearDisplayAttention() => $_clearField(6);\n\n  /// 新关注组件\n  @$pb.TagNumber(7)\n  Relation get relation => $_getN(6);\n  @$pb.TagNumber(7)\n  set relation(Relation value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasRelation() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearRelation() => $_clearField(7);\n  @$pb.TagNumber(7)\n  Relation ensureRelation() => $_ensure(6);\n}\n\n/// OGV 稿件卡片\nclass CardOGV extends $pb.GeneratedMessage {\n  factory CardOGV({\n    $core.String? cover,\n    $fixnum.Int64? progress,\n    $fixnum.Int64? duration,\n    $core.String? subtitle,\n    $core.String? badge,\n    $fixnum.Int64? state,\n  }) {\n    final result = create();\n    if (cover != null) result.cover = cover;\n    if (progress != null) result.progress = progress;\n    if (duration != null) result.duration = duration;\n    if (subtitle != null) result.subtitle = subtitle;\n    if (badge != null) result.badge = badge;\n    if (state != null) result.state = state;\n    return result;\n  }\n\n  CardOGV._();\n\n  factory CardOGV.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CardOGV.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CardOGV',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'cover')\n    ..aInt64(2, _omitFieldNames ? '' : 'progress')\n    ..aInt64(3, _omitFieldNames ? '' : 'duration')\n    ..aOS(4, _omitFieldNames ? '' : 'subtitle')\n    ..aOS(5, _omitFieldNames ? '' : 'badge')\n    ..aInt64(6, _omitFieldNames ? '' : 'state')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardOGV clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardOGV copyWith(void Function(CardOGV) updates) =>\n      super.copyWith((message) => updates(message as CardOGV)) as CardOGV;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CardOGV create() => CardOGV._();\n  @$core.override\n  CardOGV createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CardOGV getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CardOGV>(create);\n  static CardOGV? _defaultInstance;\n\n  /// 封面\n  @$pb.TagNumber(1)\n  $core.String get cover => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set cover($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCover() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCover() => $_clearField(1);\n\n  /// 观看进度\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get progress => $_getI64(1);\n  @$pb.TagNumber(2)\n  set progress($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasProgress() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearProgress() => $_clearField(2);\n\n  /// 总时长\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get duration => $_getI64(2);\n  @$pb.TagNumber(3)\n  set duration($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDuration() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDuration() => $_clearField(3);\n\n  /// 番剧卡分集标题\n  @$pb.TagNumber(4)\n  $core.String get subtitle => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set subtitle($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSubtitle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSubtitle() => $_clearField(4);\n\n  /// 角标\n  @$pb.TagNumber(5)\n  $core.String get badge => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set badge($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBadge() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBadge() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get state => $_getI64(5);\n  @$pb.TagNumber(6)\n  set state($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasState() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearState() => $_clearField(6);\n}\n\n/// UGC 稿件卡片\nclass CardUGC extends $pb.GeneratedMessage {\n  factory CardUGC({\n    $core.String? cover,\n    $fixnum.Int64? progress,\n    $fixnum.Int64? duration,\n    $core.String? name,\n    $fixnum.Int64? mid,\n    $core.bool? displayAttention,\n    $fixnum.Int64? cid,\n    $core.int? page,\n    $core.String? subtitle,\n    Relation? relation,\n    $core.String? bvid,\n    $fixnum.Int64? videos,\n    $core.String? shortLink,\n    $core.String? shareSubtitle,\n    $fixnum.Int64? view,\n    $fixnum.Int64? state,\n    $core.String? badge,\n    Badge? badgeV2,\n  }) {\n    final result = create();\n    if (cover != null) result.cover = cover;\n    if (progress != null) result.progress = progress;\n    if (duration != null) result.duration = duration;\n    if (name != null) result.name = name;\n    if (mid != null) result.mid = mid;\n    if (displayAttention != null) result.displayAttention = displayAttention;\n    if (cid != null) result.cid = cid;\n    if (page != null) result.page = page;\n    if (subtitle != null) result.subtitle = subtitle;\n    if (relation != null) result.relation = relation;\n    if (bvid != null) result.bvid = bvid;\n    if (videos != null) result.videos = videos;\n    if (shortLink != null) result.shortLink = shortLink;\n    if (shareSubtitle != null) result.shareSubtitle = shareSubtitle;\n    if (view != null) result.view = view;\n    if (state != null) result.state = state;\n    if (badge != null) result.badge = badge;\n    if (badgeV2 != null) result.badgeV2 = badgeV2;\n    return result;\n  }\n\n  CardUGC._();\n\n  factory CardUGC.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CardUGC.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CardUGC',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'cover')\n    ..aInt64(2, _omitFieldNames ? '' : 'progress')\n    ..aInt64(3, _omitFieldNames ? '' : 'duration')\n    ..aOS(4, _omitFieldNames ? '' : 'name')\n    ..aInt64(5, _omitFieldNames ? '' : 'mid')\n    ..aOB(6, _omitFieldNames ? '' : 'displayAttention')\n    ..aInt64(7, _omitFieldNames ? '' : 'cid')\n    ..aI(8, _omitFieldNames ? '' : 'page')\n    ..aOS(9, _omitFieldNames ? '' : 'subtitle')\n    ..aOM<Relation>(10, _omitFieldNames ? '' : 'relation',\n        subBuilder: Relation.create)\n    ..aOS(11, _omitFieldNames ? '' : 'bvid')\n    ..aInt64(12, _omitFieldNames ? '' : 'videos')\n    ..aOS(13, _omitFieldNames ? '' : 'shortLink')\n    ..aOS(14, _omitFieldNames ? '' : 'shareSubtitle')\n    ..aInt64(15, _omitFieldNames ? '' : 'view')\n    ..aInt64(16, _omitFieldNames ? '' : 'state')\n    ..aOS(17, _omitFieldNames ? '' : 'badge')\n    ..aOM<Badge>(18, _omitFieldNames ? '' : 'badgeV2', subBuilder: Badge.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardUGC clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardUGC copyWith(void Function(CardUGC) updates) =>\n      super.copyWith((message) => updates(message as CardUGC)) as CardUGC;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CardUGC create() => CardUGC._();\n  @$core.override\n  CardUGC createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CardUGC getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CardUGC>(create);\n  static CardUGC? _defaultInstance;\n\n  /// 封面\n  @$pb.TagNumber(1)\n  $core.String get cover => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set cover($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCover() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCover() => $_clearField(1);\n\n  /// 观看进度\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get progress => $_getI64(1);\n  @$pb.TagNumber(2)\n  set progress($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasProgress() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearProgress() => $_clearField(2);\n\n  /// 时长\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get duration => $_getI64(2);\n  @$pb.TagNumber(3)\n  set duration($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDuration() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDuration() => $_clearField(3);\n\n  /// UP 昵称\n  @$pb.TagNumber(4)\n  $core.String get name => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set name($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasName() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearName() => $_clearField(4);\n\n  /// UP mid\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get mid => $_getI64(4);\n  @$pb.TagNumber(5)\n  set mid($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasMid() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearMid() => $_clearField(5);\n\n  /// 是否展示 \"关注\" 按钮\n  @$pb.TagNumber(6)\n  $core.bool get displayAttention => $_getBF(5);\n  @$pb.TagNumber(6)\n  set displayAttention($core.bool value) => $_setBool(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasDisplayAttention() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearDisplayAttention() => $_clearField(6);\n\n  /// 分 P 的 cid\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get cid => $_getI64(6);\n  @$pb.TagNumber(7)\n  set cid($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCid() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCid() => $_clearField(7);\n\n  /// 分 P\n  @$pb.TagNumber(8)\n  $core.int get page => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set page($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasPage() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearPage() => $_clearField(8);\n\n  /// 分 P 的标题\n  @$pb.TagNumber(9)\n  $core.String get subtitle => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set subtitle($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasSubtitle() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearSubtitle() => $_clearField(9);\n\n  /// 新关注组件\n  @$pb.TagNumber(10)\n  Relation get relation => $_getN(9);\n  @$pb.TagNumber(10)\n  set relation(Relation value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasRelation() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearRelation() => $_clearField(10);\n  @$pb.TagNumber(10)\n  Relation ensureRelation() => $_ensure(9);\n\n  /// 稿件 bvid\n  @$pb.TagNumber(11)\n  $core.String get bvid => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set bvid($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasBvid() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearBvid() => $_clearField(11);\n\n  /// ? 分 P 总数\n  @$pb.TagNumber(12)\n  $fixnum.Int64 get videos => $_getI64(11);\n  @$pb.TagNumber(12)\n  set videos($fixnum.Int64 value) => $_setInt64(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasVideos() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearVideos() => $_clearField(12);\n\n  /// ? 短链接\n  @$pb.TagNumber(13)\n  $core.String get shortLink => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set shortLink($core.String value) => $_setString(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasShortLink() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearShortLink() => $_clearField(13);\n\n  /// ? 分享标题\n  @$pb.TagNumber(14)\n  $core.String get shareSubtitle => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set shareSubtitle($core.String value) => $_setString(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasShareSubtitle() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearShareSubtitle() => $_clearField(14);\n\n  /// ? 播放量\n  @$pb.TagNumber(15)\n  $fixnum.Int64 get view => $_getI64(14);\n  @$pb.TagNumber(15)\n  set view($fixnum.Int64 value) => $_setInt64(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasView() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearView() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $fixnum.Int64 get state => $_getI64(15);\n  @$pb.TagNumber(16)\n  set state($fixnum.Int64 value) => $_setInt64(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasState() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearState() => $_clearField(16);\n\n  /// ? 角标\n  @$pb.TagNumber(17)\n  $core.String get badge => $_getSZ(16);\n  @$pb.TagNumber(17)\n  set badge($core.String value) => $_setString(16, value);\n  @$pb.TagNumber(17)\n  $core.bool hasBadge() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearBadge() => $_clearField(17);\n\n  /// ? 角标\n  @$pb.TagNumber(18)\n  Badge get badgeV2 => $_getN(17);\n  @$pb.TagNumber(18)\n  set badgeV2(Badge value) => $_setField(18, value);\n  @$pb.TagNumber(18)\n  $core.bool hasBadgeV2() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearBadgeV2() => $_clearField(18);\n  @$pb.TagNumber(18)\n  Badge ensureBadgeV2() => $_ensure(17);\n}\n\nclass Cast extends $pb.GeneratedMessage {\n  factory Cast({\n    $core.Iterable<MediaPerson>? person,\n    $core.String? title,\n  }) {\n    final result = create();\n    if (person != null) result.person.addAll(person);\n    if (title != null) result.title = title;\n    return result;\n  }\n\n  Cast._();\n\n  factory Cast.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Cast.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Cast',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..pPM<MediaPerson>(1, _omitFieldNames ? '' : 'person',\n        subBuilder: MediaPerson.create)\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Cast clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Cast copyWith(void Function(Cast) updates) =>\n      super.copyWith((message) => updates(message as Cast)) as Cast;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Cast create() => Cast._();\n  @$core.override\n  Cast createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Cast getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Cast>(create);\n  static Cast? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<MediaPerson> get person => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n}\n\nclass ChannelInfo extends $pb.GeneratedMessage {\n  factory ChannelInfo({\n    $fixnum.Int64? channelId,\n    $core.bool? subscribed,\n  }) {\n    final result = create();\n    if (channelId != null) result.channelId = channelId;\n    if (subscribed != null) result.subscribed = subscribed;\n    return result;\n  }\n\n  ChannelInfo._();\n\n  factory ChannelInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ChannelInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ChannelInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'channelId')\n    ..aOB(2, _omitFieldNames ? '' : 'subscribed')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ChannelInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ChannelInfo copyWith(void Function(ChannelInfo) updates) =>\n      super.copyWith((message) => updates(message as ChannelInfo))\n          as ChannelInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ChannelInfo create() => ChannelInfo._();\n  @$core.override\n  ChannelInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ChannelInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ChannelInfo>(create);\n  static ChannelInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get channelId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set channelId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasChannelId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearChannelId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get subscribed => $_getBF(1);\n  @$pb.TagNumber(2)\n  set subscribed($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSubscribed() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSubscribed() => $_clearField(2);\n}\n\nclass ClearReq extends $pb.GeneratedMessage {\n  factory ClearReq({\n    $core.String? business,\n  }) {\n    final result = create();\n    if (business != null) result.business = business;\n    return result;\n  }\n\n  ClearReq._();\n\n  factory ClearReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ClearReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ClearReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'business')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ClearReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ClearReq copyWith(void Function(ClearReq) updates) =>\n      super.copyWith((message) => updates(message as ClearReq)) as ClearReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ClearReq create() => ClearReq._();\n  @$core.override\n  ClearReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ClearReq getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ClearReq>(create);\n  static ClearReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get business => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set business($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBusiness() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBusiness() => $_clearField(1);\n}\n\nclass CommentItem extends $pb.GeneratedMessage {\n  factory CommentItem({\n    $core.String? icon,\n    $core.String? url,\n    $core.String? title,\n    CommentType? type,\n    $core.String? actionType,\n    $core.String? id,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (url != null) result.url = url;\n    if (title != null) result.title = title;\n    if (type != null) result.type = type;\n    if (actionType != null) result.actionType = actionType;\n    if (id != null) result.id = id;\n    return result;\n  }\n\n  CommentItem._();\n\n  factory CommentItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CommentItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CommentItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'url')\n    ..aOS(3, _omitFieldNames ? '' : 'title')\n    ..aE<CommentType>(4, _omitFieldNames ? '' : 'type',\n        enumValues: CommentType.values)\n    ..aOS(5, _omitFieldNames ? '' : 'actionType')\n    ..aOS(6, _omitFieldNames ? '' : 'id')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CommentItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CommentItem copyWith(void Function(CommentItem) updates) =>\n      super.copyWith((message) => updates(message as CommentItem))\n          as CommentItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CommentItem create() => CommentItem._();\n  @$core.override\n  CommentItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CommentItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CommentItem>(create);\n  static CommentItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get url => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set url($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUrl() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get title => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set title($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  CommentType get type => $_getN(3);\n  @$pb.TagNumber(4)\n  set type(CommentType value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearType() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get actionType => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set actionType($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasActionType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearActionType() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get id => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set id($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasId() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearId() => $_clearField(6);\n}\n\n/// 历史记录游标\nclass Cursor extends $pb.GeneratedMessage {\n  factory Cursor({\n    $fixnum.Int64? max,\n    $core.int? maxTp,\n  }) {\n    final result = create();\n    if (max != null) result.max = max;\n    if (maxTp != null) result.maxTp = maxTp;\n    return result;\n  }\n\n  Cursor._();\n\n  factory Cursor.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Cursor.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Cursor',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'max')\n    ..aI(2, _omitFieldNames ? '' : 'maxTp')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Cursor clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Cursor copyWith(void Function(Cursor) updates) =>\n      super.copyWith((message) => updates(message as Cursor)) as Cursor;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Cursor create() => Cursor._();\n  @$core.override\n  Cursor createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Cursor getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Cursor>(create);\n  static Cursor? _defaultInstance;\n\n  /// 本页最大值游标值\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get max => $_getI64(0);\n  @$pb.TagNumber(1)\n  set max($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMax() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMax() => $_clearField(1);\n\n  /// 本页最大值游标类型\n  @$pb.TagNumber(2)\n  $core.int get maxTp => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set maxTp($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMaxTp() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMaxTp() => $_clearField(2);\n}\n\nenum CursorItem_CardItem {\n  cardUgc,\n  cardOgv,\n  cardArticle,\n  cardLive,\n  cardCheese,\n  notSet\n}\n\n/// 历史记录卡片内容\nclass CursorItem extends $pb.GeneratedMessage {\n  factory CursorItem({\n    CardUGC? cardUgc,\n    CardOGV? cardOgv,\n    CardArticle? cardArticle,\n    CardLive? cardLive,\n    CardCheese? cardCheese,\n    $core.String? title,\n    $core.String? uri,\n    $fixnum.Int64? viewAt,\n    $fixnum.Int64? kid,\n    $fixnum.Int64? oid,\n    $core.String? business,\n    $core.int? tp,\n    DeviceType? dt,\n    $core.bool? hasShare,\n    $core.String? report,\n  }) {\n    final result = create();\n    if (cardUgc != null) result.cardUgc = cardUgc;\n    if (cardOgv != null) result.cardOgv = cardOgv;\n    if (cardArticle != null) result.cardArticle = cardArticle;\n    if (cardLive != null) result.cardLive = cardLive;\n    if (cardCheese != null) result.cardCheese = cardCheese;\n    if (title != null) result.title = title;\n    if (uri != null) result.uri = uri;\n    if (viewAt != null) result.viewAt = viewAt;\n    if (kid != null) result.kid = kid;\n    if (oid != null) result.oid = oid;\n    if (business != null) result.business = business;\n    if (tp != null) result.tp = tp;\n    if (dt != null) result.dt = dt;\n    if (hasShare != null) result.hasShare = hasShare;\n    if (report != null) result.report = report;\n    return result;\n  }\n\n  CursorItem._();\n\n  factory CursorItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CursorItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, CursorItem_CardItem>\n      _CursorItem_CardItemByTag = {\n    1: CursorItem_CardItem.cardUgc,\n    2: CursorItem_CardItem.cardOgv,\n    3: CursorItem_CardItem.cardArticle,\n    4: CursorItem_CardItem.cardLive,\n    5: CursorItem_CardItem.cardCheese,\n    0: CursorItem_CardItem.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CursorItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [1, 2, 3, 4, 5])\n    ..aOM<CardUGC>(1, _omitFieldNames ? '' : 'cardUgc',\n        subBuilder: CardUGC.create)\n    ..aOM<CardOGV>(2, _omitFieldNames ? '' : 'cardOgv',\n        subBuilder: CardOGV.create)\n    ..aOM<CardArticle>(3, _omitFieldNames ? '' : 'cardArticle',\n        subBuilder: CardArticle.create)\n    ..aOM<CardLive>(4, _omitFieldNames ? '' : 'cardLive',\n        subBuilder: CardLive.create)\n    ..aOM<CardCheese>(5, _omitFieldNames ? '' : 'cardCheese',\n        subBuilder: CardCheese.create)\n    ..aOS(6, _omitFieldNames ? '' : 'title')\n    ..aOS(7, _omitFieldNames ? '' : 'uri')\n    ..aInt64(8, _omitFieldNames ? '' : 'viewAt')\n    ..aInt64(9, _omitFieldNames ? '' : 'kid')\n    ..aInt64(10, _omitFieldNames ? '' : 'oid')\n    ..aOS(11, _omitFieldNames ? '' : 'business')\n    ..aI(12, _omitFieldNames ? '' : 'tp')\n    ..aOM<DeviceType>(13, _omitFieldNames ? '' : 'dt',\n        subBuilder: DeviceType.create)\n    ..aOB(14, _omitFieldNames ? '' : 'hasShare')\n    ..aOS(15, _omitFieldNames ? '' : 'report')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CursorItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CursorItem copyWith(void Function(CursorItem) updates) =>\n      super.copyWith((message) => updates(message as CursorItem)) as CursorItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CursorItem create() => CursorItem._();\n  @$core.override\n  CursorItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CursorItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CursorItem>(create);\n  static CursorItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  CursorItem_CardItem whichCardItem() =>\n      _CursorItem_CardItemByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(1)\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  void clearCardItem() => $_clearField($_whichOneof(0));\n\n  /// 参见 [`CardUGC`]\n  @$pb.TagNumber(1)\n  CardUGC get cardUgc => $_getN(0);\n  @$pb.TagNumber(1)\n  set cardUgc(CardUGC value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCardUgc() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCardUgc() => $_clearField(1);\n  @$pb.TagNumber(1)\n  CardUGC ensureCardUgc() => $_ensure(0);\n\n  /// 参见 [`CardOGV`]\n  @$pb.TagNumber(2)\n  CardOGV get cardOgv => $_getN(1);\n  @$pb.TagNumber(2)\n  set cardOgv(CardOGV value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCardOgv() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCardOgv() => $_clearField(2);\n  @$pb.TagNumber(2)\n  CardOGV ensureCardOgv() => $_ensure(1);\n\n  /// 参见 [`CardArticle`]\n  @$pb.TagNumber(3)\n  CardArticle get cardArticle => $_getN(2);\n  @$pb.TagNumber(3)\n  set cardArticle(CardArticle value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCardArticle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCardArticle() => $_clearField(3);\n  @$pb.TagNumber(3)\n  CardArticle ensureCardArticle() => $_ensure(2);\n\n  /// 参见 [`CardLive`]\n  @$pb.TagNumber(4)\n  CardLive get cardLive => $_getN(3);\n  @$pb.TagNumber(4)\n  set cardLive(CardLive value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCardLive() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCardLive() => $_clearField(4);\n  @$pb.TagNumber(4)\n  CardLive ensureCardLive() => $_ensure(3);\n\n  /// 参见 [`CardCheese`]\n  @$pb.TagNumber(5)\n  CardCheese get cardCheese => $_getN(4);\n  @$pb.TagNumber(5)\n  set cardCheese(CardCheese value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCardCheese() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCardCheese() => $_clearField(5);\n  @$pb.TagNumber(5)\n  CardCheese ensureCardCheese() => $_ensure(4);\n\n  /// 标题\n  @$pb.TagNumber(6)\n  $core.String get title => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set title($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasTitle() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearTitle() => $_clearField(6);\n\n  /// 跳转链接\n  @$pb.TagNumber(7)\n  $core.String get uri => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set uri($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasUri() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearUri() => $_clearField(7);\n\n  /// 观看时间\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get viewAt => $_getI64(7);\n  @$pb.TagNumber(8)\n  set viewAt($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasViewAt() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearViewAt() => $_clearField(8);\n\n  /// 历史记录主键\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get kid => $_getI64(8);\n  @$pb.TagNumber(9)\n  set kid($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasKid() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearKid() => $_clearField(9);\n\n  /// 业务 ID (如稿件 avid 或直播间 room_id 等)\n  @$pb.TagNumber(10)\n  $fixnum.Int64 get oid => $_getI64(9);\n  @$pb.TagNumber(10)\n  set oid($fixnum.Int64 value) => $_setInt64(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasOid() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearOid() => $_clearField(10);\n\n  /// 业务类型\n  @$pb.TagNumber(11)\n  $core.String get business => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set business($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasBusiness() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearBusiness() => $_clearField(11);\n\n  /// 业务类型\n  @$pb.TagNumber(12)\n  $core.int get tp => $_getIZ(11);\n  @$pb.TagNumber(12)\n  set tp($core.int value) => $_setSignedInt32(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasTp() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearTp() => $_clearField(12);\n\n  /// 播放设备\n  @$pb.TagNumber(13)\n  DeviceType get dt => $_getN(12);\n  @$pb.TagNumber(13)\n  set dt(DeviceType value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasDt() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearDt() => $_clearField(13);\n  @$pb.TagNumber(13)\n  DeviceType ensureDt() => $_ensure(12);\n\n  /// ? 是否带分享按钮\n  @$pb.TagNumber(14)\n  $core.bool get hasShare => $_getBF(13);\n  @$pb.TagNumber(14)\n  set hasShare($core.bool value) => $_setBool(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasHasShare() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearHasShare() => $_clearField(14);\n\n  /// ? 埋点上报参数\n  @$pb.TagNumber(15)\n  $core.String get report => $_getSZ(14);\n  @$pb.TagNumber(15)\n  set report($core.String value) => $_setString(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasReport() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearReport() => $_clearField(15);\n}\n\n/// 历史记录列表请求返回值\nclass CursorReply extends $pb.GeneratedMessage {\n  factory CursorReply({\n    $core.Iterable<CursorItem>? items,\n    $core.Iterable<CursorTab>? tab,\n    Cursor? cursor,\n    $core.bool? hasMore,\n  }) {\n    final result = create();\n    if (items != null) result.items.addAll(items);\n    if (tab != null) result.tab.addAll(tab);\n    if (cursor != null) result.cursor = cursor;\n    if (hasMore != null) result.hasMore = hasMore;\n    return result;\n  }\n\n  CursorReply._();\n\n  factory CursorReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CursorReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CursorReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..pPM<CursorItem>(1, _omitFieldNames ? '' : 'items',\n        subBuilder: CursorItem.create)\n    ..pPM<CursorTab>(2, _omitFieldNames ? '' : 'tab',\n        subBuilder: CursorTab.create)\n    ..aOM<Cursor>(3, _omitFieldNames ? '' : 'cursor', subBuilder: Cursor.create)\n    ..aOB(4, _omitFieldNames ? '' : 'hasMore')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CursorReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CursorReply copyWith(void Function(CursorReply) updates) =>\n      super.copyWith((message) => updates(message as CursorReply))\n          as CursorReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CursorReply create() => CursorReply._();\n  @$core.override\n  CursorReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CursorReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CursorReply>(create);\n  static CursorReply? _defaultInstance;\n\n  /// 参见 [`CursorItem`]\n  @$pb.TagNumber(1)\n  $pb.PbList<CursorItem> get items => $_getList(0);\n\n  /// 参见 [`CursorTab`]\n  @$pb.TagNumber(2)\n  $pb.PbList<CursorTab> get tab => $_getList(1);\n\n  /// 当前偏移\n  @$pb.TagNumber(3)\n  Cursor get cursor => $_getN(2);\n  @$pb.TagNumber(3)\n  set cursor(Cursor value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCursor() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCursor() => $_clearField(3);\n  @$pb.TagNumber(3)\n  Cursor ensureCursor() => $_ensure(2);\n\n  /// 是否还有更多数据\n  @$pb.TagNumber(4)\n  $core.bool get hasMore => $_getBF(3);\n  @$pb.TagNumber(4)\n  set hasMore($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasHasMore() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearHasMore() => $_clearField(4);\n}\n\n/// 历史记录列表请求参数\nclass CursorReq extends $pb.GeneratedMessage {\n  factory CursorReq({\n    Cursor? cursor,\n    $core.String? business,\n    PlayerPreloadParams? playerPreload,\n    $3.PlayerArgs? playerArgs,\n  }) {\n    final result = create();\n    if (cursor != null) result.cursor = cursor;\n    if (business != null) result.business = business;\n    if (playerPreload != null) result.playerPreload = playerPreload;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    return result;\n  }\n\n  CursorReq._();\n\n  factory CursorReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CursorReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CursorReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOM<Cursor>(1, _omitFieldNames ? '' : 'cursor', subBuilder: Cursor.create)\n    ..aOS(2, _omitFieldNames ? '' : 'business')\n    ..aOM<PlayerPreloadParams>(3, _omitFieldNames ? '' : 'playerPreload',\n        subBuilder: PlayerPreloadParams.create)\n    ..aOM<$3.PlayerArgs>(4, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $3.PlayerArgs.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CursorReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CursorReq copyWith(void Function(CursorReq) updates) =>\n      super.copyWith((message) => updates(message as CursorReq)) as CursorReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CursorReq create() => CursorReq._();\n  @$core.override\n  CursorReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CursorReq getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CursorReq>(create);\n  static CursorReq? _defaultInstance;\n\n  /// 翻页游标 (透传上一页的游标)\n  @$pb.TagNumber(1)\n  Cursor get cursor => $_getN(0);\n  @$pb.TagNumber(1)\n  set cursor(Cursor value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCursor() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCursor() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Cursor ensureCursor() => $_ensure(0);\n\n  /// 业务类型\n  ///\n  /// - 全部: `all`\n  /// - 视频: `archive`\n  /// - 直播: `live`\n  /// - 专栏: `article`\n  @$pb.TagNumber(2)\n  $core.String get business => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set business($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBusiness() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBusiness() => $_clearField(2);\n\n  /// 秒开参数\n  @$pb.TagNumber(3)\n  PlayerPreloadParams get playerPreload => $_getN(2);\n  @$pb.TagNumber(3)\n  set playerPreload(PlayerPreloadParams value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPlayerPreload() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPlayerPreload() => $_clearField(3);\n  @$pb.TagNumber(3)\n  PlayerPreloadParams ensurePlayerPreload() => $_ensure(2);\n\n  /// 秒开参数\n  @$pb.TagNumber(4)\n  $3.PlayerArgs get playerArgs => $_getN(3);\n  @$pb.TagNumber(4)\n  set playerArgs($3.PlayerArgs value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPlayerArgs() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPlayerArgs() => $_clearField(4);\n  @$pb.TagNumber(4)\n  $3.PlayerArgs ensurePlayerArgs() => $_ensure(3);\n}\n\n/// 历史记录顶部 tab\nclass CursorTab extends $pb.GeneratedMessage {\n  factory CursorTab({\n    $core.String? business,\n    $core.String? name,\n    $core.String? router,\n    $core.bool? focus,\n  }) {\n    final result = create();\n    if (business != null) result.business = business;\n    if (name != null) result.name = name;\n    if (router != null) result.router = router;\n    if (focus != null) result.focus = focus;\n    return result;\n  }\n\n  CursorTab._();\n\n  factory CursorTab.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CursorTab.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CursorTab',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'business')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'router')\n    ..aOB(4, _omitFieldNames ? '' : 'focus')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CursorTab clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CursorTab copyWith(void Function(CursorTab) updates) =>\n      super.copyWith((message) => updates(message as CursorTab)) as CursorTab;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CursorTab create() => CursorTab._();\n  @$core.override\n  CursorTab createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CursorTab getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CursorTab>(create);\n  static CursorTab? _defaultInstance;\n\n  /// 业务类型\n  @$pb.TagNumber(1)\n  $core.String get business => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set business($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBusiness() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBusiness() => $_clearField(1);\n\n  /// 业务名称\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  /// ? app 内部跳转路由\n  @$pb.TagNumber(3)\n  $core.String get router => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set router($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRouter() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRouter() => $_clearField(3);\n\n  /// ? 是否选中\n  @$pb.TagNumber(4)\n  $core.bool get focus => $_getBF(3);\n  @$pb.TagNumber(4)\n  set focus($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFocus() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFocus() => $_clearField(4);\n}\n\n/// 参见 [`CursorReply`]\nclass CursorV2Reply extends $pb.GeneratedMessage {\n  factory CursorV2Reply({\n    $core.Iterable<CursorItem>? items,\n    Cursor? cursor,\n    $core.bool? hasMore,\n    $core.String? emptyLink,\n  }) {\n    final result = create();\n    if (items != null) result.items.addAll(items);\n    if (cursor != null) result.cursor = cursor;\n    if (hasMore != null) result.hasMore = hasMore;\n    if (emptyLink != null) result.emptyLink = emptyLink;\n    return result;\n  }\n\n  CursorV2Reply._();\n\n  factory CursorV2Reply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CursorV2Reply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CursorV2Reply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..pPM<CursorItem>(1, _omitFieldNames ? '' : 'items',\n        subBuilder: CursorItem.create)\n    ..aOM<Cursor>(2, _omitFieldNames ? '' : 'cursor', subBuilder: Cursor.create)\n    ..aOB(3, _omitFieldNames ? '' : 'hasMore')\n    ..aOS(4, _omitFieldNames ? '' : 'emptyLink')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CursorV2Reply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CursorV2Reply copyWith(void Function(CursorV2Reply) updates) =>\n      super.copyWith((message) => updates(message as CursorV2Reply))\n          as CursorV2Reply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CursorV2Reply create() => CursorV2Reply._();\n  @$core.override\n  CursorV2Reply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CursorV2Reply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CursorV2Reply>(create);\n  static CursorV2Reply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<CursorItem> get items => $_getList(0);\n\n  @$pb.TagNumber(2)\n  Cursor get cursor => $_getN(1);\n  @$pb.TagNumber(2)\n  set cursor(Cursor value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCursor() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCursor() => $_clearField(2);\n  @$pb.TagNumber(2)\n  Cursor ensureCursor() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.bool get hasMore => $_getBF(2);\n  @$pb.TagNumber(3)\n  set hasMore($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasHasMore() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearHasMore() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get emptyLink => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set emptyLink($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasEmptyLink() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearEmptyLink() => $_clearField(4);\n}\n\n/// 参见 [`CursorReq`]\nclass CursorV2Req extends $pb.GeneratedMessage {\n  factory CursorV2Req({\n    Cursor? cursor,\n    $core.String? business,\n    PlayerPreloadParams? playerPreload,\n    $3.PlayerArgs? playerArgs,\n    $core.bool? isLocal,\n  }) {\n    final result = create();\n    if (cursor != null) result.cursor = cursor;\n    if (business != null) result.business = business;\n    if (playerPreload != null) result.playerPreload = playerPreload;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    if (isLocal != null) result.isLocal = isLocal;\n    return result;\n  }\n\n  CursorV2Req._();\n\n  factory CursorV2Req.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CursorV2Req.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CursorV2Req',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOM<Cursor>(1, _omitFieldNames ? '' : 'cursor', subBuilder: Cursor.create)\n    ..aOS(2, _omitFieldNames ? '' : 'business')\n    ..aOM<PlayerPreloadParams>(3, _omitFieldNames ? '' : 'playerPreload',\n        subBuilder: PlayerPreloadParams.create)\n    ..aOM<$3.PlayerArgs>(4, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $3.PlayerArgs.create)\n    ..aOB(5, _omitFieldNames ? '' : 'isLocal')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CursorV2Req clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CursorV2Req copyWith(void Function(CursorV2Req) updates) =>\n      super.copyWith((message) => updates(message as CursorV2Req))\n          as CursorV2Req;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CursorV2Req create() => CursorV2Req._();\n  @$core.override\n  CursorV2Req createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CursorV2Req getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CursorV2Req>(create);\n  static CursorV2Req? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Cursor get cursor => $_getN(0);\n  @$pb.TagNumber(1)\n  set cursor(Cursor value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCursor() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCursor() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Cursor ensureCursor() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get business => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set business($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBusiness() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBusiness() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  PlayerPreloadParams get playerPreload => $_getN(2);\n  @$pb.TagNumber(3)\n  set playerPreload(PlayerPreloadParams value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPlayerPreload() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPlayerPreload() => $_clearField(3);\n  @$pb.TagNumber(3)\n  PlayerPreloadParams ensurePlayerPreload() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $3.PlayerArgs get playerArgs => $_getN(3);\n  @$pb.TagNumber(4)\n  set playerArgs($3.PlayerArgs value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPlayerArgs() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPlayerArgs() => $_clearField(4);\n  @$pb.TagNumber(4)\n  $3.PlayerArgs ensurePlayerArgs() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.bool get isLocal => $_getBF(4);\n  @$pb.TagNumber(5)\n  set isLocal($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasIsLocal() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearIsLocal() => $_clearField(5);\n}\n\nclass DefaultWordsReply extends $pb.GeneratedMessage {\n  factory DefaultWordsReply({\n    $core.String? trackid,\n    $core.String? param,\n    $core.String? show,\n    $core.String? word,\n    $fixnum.Int64? showFront,\n    $core.String? expStr,\n    $core.String? goto,\n    $core.String? value,\n    $core.String? uri,\n    $fixnum.Int64? enableRefresh,\n    $fixnum.Int64? refreshIntervalMilli,\n    $fixnum.Int64? enableAnimation,\n    $fixnum.Int64? animationTimeMilli,\n  }) {\n    final result = create();\n    if (trackid != null) result.trackid = trackid;\n    if (param != null) result.param = param;\n    if (show != null) result.show = show;\n    if (word != null) result.word = word;\n    if (showFront != null) result.showFront = showFront;\n    if (expStr != null) result.expStr = expStr;\n    if (goto != null) result.goto = goto;\n    if (value != null) result.value = value;\n    if (uri != null) result.uri = uri;\n    if (enableRefresh != null) result.enableRefresh = enableRefresh;\n    if (refreshIntervalMilli != null)\n      result.refreshIntervalMilli = refreshIntervalMilli;\n    if (enableAnimation != null) result.enableAnimation = enableAnimation;\n    if (animationTimeMilli != null)\n      result.animationTimeMilli = animationTimeMilli;\n    return result;\n  }\n\n  DefaultWordsReply._();\n\n  factory DefaultWordsReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DefaultWordsReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DefaultWordsReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'trackid')\n    ..aOS(2, _omitFieldNames ? '' : 'param')\n    ..aOS(3, _omitFieldNames ? '' : 'show')\n    ..aOS(4, _omitFieldNames ? '' : 'word')\n    ..aInt64(5, _omitFieldNames ? '' : 'showFront')\n    ..aOS(6, _omitFieldNames ? '' : 'expStr')\n    ..aOS(7, _omitFieldNames ? '' : 'goto')\n    ..aOS(8, _omitFieldNames ? '' : 'value')\n    ..aOS(9, _omitFieldNames ? '' : 'uri')\n    ..aInt64(10, _omitFieldNames ? '' : 'enableRefresh')\n    ..aInt64(11, _omitFieldNames ? '' : 'refreshIntervalMilli')\n    ..aInt64(12, _omitFieldNames ? '' : 'enableAnimation')\n    ..aInt64(13, _omitFieldNames ? '' : 'animationTimeMilli')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DefaultWordsReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DefaultWordsReply copyWith(void Function(DefaultWordsReply) updates) =>\n      super.copyWith((message) => updates(message as DefaultWordsReply))\n          as DefaultWordsReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DefaultWordsReply create() => DefaultWordsReply._();\n  @$core.override\n  DefaultWordsReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DefaultWordsReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DefaultWordsReply>(create);\n  static DefaultWordsReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get trackid => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set trackid($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTrackid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTrackid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get param => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set param($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasParam() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearParam() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get show => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set show($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasShow() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearShow() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get word => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set word($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasWord() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearWord() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get showFront => $_getI64(4);\n  @$pb.TagNumber(5)\n  set showFront($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasShowFront() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearShowFront() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get expStr => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set expStr($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasExpStr() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearExpStr() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get goto => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set goto($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasGoto() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearGoto() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get value => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set value($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasValue() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearValue() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get uri => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set uri($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasUri() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearUri() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $fixnum.Int64 get enableRefresh => $_getI64(9);\n  @$pb.TagNumber(10)\n  set enableRefresh($fixnum.Int64 value) => $_setInt64(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasEnableRefresh() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearEnableRefresh() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $fixnum.Int64 get refreshIntervalMilli => $_getI64(10);\n  @$pb.TagNumber(11)\n  set refreshIntervalMilli($fixnum.Int64 value) => $_setInt64(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasRefreshIntervalMilli() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearRefreshIntervalMilli() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $fixnum.Int64 get enableAnimation => $_getI64(11);\n  @$pb.TagNumber(12)\n  set enableAnimation($fixnum.Int64 value) => $_setInt64(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasEnableAnimation() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearEnableAnimation() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $fixnum.Int64 get animationTimeMilli => $_getI64(12);\n  @$pb.TagNumber(13)\n  set animationTimeMilli($fixnum.Int64 value) => $_setInt64(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasAnimationTimeMilli() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearAnimationTimeMilli() => $_clearField(13);\n}\n\nclass DefaultWordsReq extends $pb.GeneratedMessage {\n  factory DefaultWordsReq({\n    $fixnum.Int64? from,\n    $fixnum.Int64? loginEvent,\n    $core.int? teenagersMode,\n    $core.int? lessonsMode,\n    $core.String? tab,\n    $core.String? eventId,\n    $core.String? avid,\n    $core.String? query,\n    $fixnum.Int64? an,\n    $fixnum.Int64? isFresh,\n    $core.String? splashGuide,\n    $fixnum.Int64? splashId,\n    $fixnum.Int64? refreshType,\n    $core.String? userAct,\n    $core.int? searchPageReturn,\n  }) {\n    final result = create();\n    if (from != null) result.from = from;\n    if (loginEvent != null) result.loginEvent = loginEvent;\n    if (teenagersMode != null) result.teenagersMode = teenagersMode;\n    if (lessonsMode != null) result.lessonsMode = lessonsMode;\n    if (tab != null) result.tab = tab;\n    if (eventId != null) result.eventId = eventId;\n    if (avid != null) result.avid = avid;\n    if (query != null) result.query = query;\n    if (an != null) result.an = an;\n    if (isFresh != null) result.isFresh = isFresh;\n    if (splashGuide != null) result.splashGuide = splashGuide;\n    if (splashId != null) result.splashId = splashId;\n    if (refreshType != null) result.refreshType = refreshType;\n    if (userAct != null) result.userAct = userAct;\n    if (searchPageReturn != null) result.searchPageReturn = searchPageReturn;\n    return result;\n  }\n\n  DefaultWordsReq._();\n\n  factory DefaultWordsReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DefaultWordsReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DefaultWordsReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'from')\n    ..aInt64(2, _omitFieldNames ? '' : 'loginEvent')\n    ..aI(3, _omitFieldNames ? '' : 'teenagersMode')\n    ..aI(4, _omitFieldNames ? '' : 'lessonsMode')\n    ..aOS(5, _omitFieldNames ? '' : 'tab')\n    ..aOS(6, _omitFieldNames ? '' : 'eventId')\n    ..aOS(7, _omitFieldNames ? '' : 'avid')\n    ..aOS(8, _omitFieldNames ? '' : 'query')\n    ..aInt64(9, _omitFieldNames ? '' : 'an')\n    ..aInt64(10, _omitFieldNames ? '' : 'isFresh')\n    ..aOS(11, _omitFieldNames ? '' : 'splashGuide')\n    ..aInt64(12, _omitFieldNames ? '' : 'splashId')\n    ..aInt64(13, _omitFieldNames ? '' : 'refreshType')\n    ..aOS(14, _omitFieldNames ? '' : 'userAct')\n    ..aI(15, _omitFieldNames ? '' : 'searchPageReturn')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DefaultWordsReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DefaultWordsReq copyWith(void Function(DefaultWordsReq) updates) =>\n      super.copyWith((message) => updates(message as DefaultWordsReq))\n          as DefaultWordsReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DefaultWordsReq create() => DefaultWordsReq._();\n  @$core.override\n  DefaultWordsReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DefaultWordsReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DefaultWordsReq>(create);\n  static DefaultWordsReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get from => $_getI64(0);\n  @$pb.TagNumber(1)\n  set from($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFrom() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFrom() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get loginEvent => $_getI64(1);\n  @$pb.TagNumber(2)\n  set loginEvent($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLoginEvent() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLoginEvent() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get teenagersMode => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set teenagersMode($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTeenagersMode() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTeenagersMode() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get lessonsMode => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set lessonsMode($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLessonsMode() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLessonsMode() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get tab => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set tab($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasTab() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearTab() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get eventId => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set eventId($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasEventId() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearEventId() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get avid => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set avid($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasAvid() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearAvid() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get query => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set query($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasQuery() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearQuery() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get an => $_getI64(8);\n  @$pb.TagNumber(9)\n  set an($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasAn() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearAn() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $fixnum.Int64 get isFresh => $_getI64(9);\n  @$pb.TagNumber(10)\n  set isFresh($fixnum.Int64 value) => $_setInt64(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasIsFresh() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearIsFresh() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get splashGuide => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set splashGuide($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasSplashGuide() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearSplashGuide() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $fixnum.Int64 get splashId => $_getI64(11);\n  @$pb.TagNumber(12)\n  set splashId($fixnum.Int64 value) => $_setInt64(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasSplashId() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearSplashId() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $fixnum.Int64 get refreshType => $_getI64(12);\n  @$pb.TagNumber(13)\n  set refreshType($fixnum.Int64 value) => $_setInt64(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasRefreshType() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearRefreshType() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.String get userAct => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set userAct($core.String value) => $_setString(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasUserAct() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearUserAct() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $core.int get searchPageReturn => $_getIZ(14);\n  @$pb.TagNumber(15)\n  set searchPageReturn($core.int value) => $_setSignedInt32(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasSearchPageReturn() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearSearchPageReturn() => $_clearField(15);\n}\n\n/// 历史记录删除请求参数\nclass DeleteReq extends $pb.GeneratedMessage {\n  factory DeleteReq({\n    $core.Iterable<HisInfo>? hisInfo,\n    $core.String? tab,\n  }) {\n    final result = create();\n    if (hisInfo != null) result.hisInfo.addAll(hisInfo);\n    if (tab != null) result.tab = tab;\n    return result;\n  }\n\n  DeleteReq._();\n\n  factory DeleteReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DeleteReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DeleteReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..pPM<HisInfo>(1, _omitFieldNames ? '' : 'hisInfo',\n        subBuilder: HisInfo.create)\n    ..aOS(2, _omitFieldNames ? '' : 'tab')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DeleteReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DeleteReq copyWith(void Function(DeleteReq) updates) =>\n      super.copyWith((message) => updates(message as DeleteReq)) as DeleteReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DeleteReq create() => DeleteReq._();\n  @$core.override\n  DeleteReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DeleteReq getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DeleteReq>(create);\n  static DeleteReq? _defaultInstance;\n\n  /// 要删除的历史信息\n  @$pb.TagNumber(1)\n  $pb.PbList<HisInfo> get hisInfo => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.String get tab => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set tab($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTab() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTab() => $_clearField(2);\n}\n\n/// 设备类型\nclass DeviceType extends $pb.GeneratedMessage {\n  factory DeviceType({\n    DT? type,\n    $core.String? icon,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (icon != null) result.icon = icon;\n    return result;\n  }\n\n  DeviceType._();\n\n  factory DeviceType.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DeviceType.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DeviceType',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aE<DT>(1, _omitFieldNames ? '' : 'type', enumValues: DT.values)\n    ..aOS(2, _omitFieldNames ? '' : 'icon')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DeviceType clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DeviceType copyWith(void Function(DeviceType) updates) =>\n      super.copyWith((message) => updates(message as DeviceType)) as DeviceType;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DeviceType create() => DeviceType._();\n  @$core.override\n  DeviceType createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DeviceType getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DeviceType>(create);\n  static DeviceType? _defaultInstance;\n\n  /// 设备类型\n  @$pb.TagNumber(1)\n  DT get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(DT value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  /// 图标\n  @$pb.TagNumber(2)\n  $core.String get icon => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set icon($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIcon() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIcon() => $_clearField(2);\n}\n\nclass Dynamic extends $pb.GeneratedMessage {\n  factory Dynamic({\n    $4.DynamicItem? dynamic,\n  }) {\n    final result = create();\n    if (dynamic != null) result.dynamic = dynamic;\n    return result;\n  }\n\n  Dynamic._();\n\n  factory Dynamic.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Dynamic.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Dynamic',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOM<$4.DynamicItem>(1, _omitFieldNames ? '' : 'dynamic',\n        subBuilder: $4.DynamicItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Dynamic clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Dynamic copyWith(void Function(Dynamic) updates) =>\n      super.copyWith((message) => updates(message as Dynamic)) as Dynamic;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Dynamic create() => Dynamic._();\n  @$core.override\n  Dynamic createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Dynamic getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Dynamic>(create);\n  static Dynamic? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $4.DynamicItem get dynamic => $_getN(0);\n  @$pb.TagNumber(1)\n  set dynamic($4.DynamicItem value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDynamic() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDynamic() => $_clearField(1);\n  @$pb.TagNumber(1)\n  $4.DynamicItem ensureDynamic() => $_ensure(0);\n}\n\nclass FacialRecognitionVerifyReply extends $pb.GeneratedMessage {\n  factory FacialRecognitionVerifyReply() => create();\n\n  FacialRecognitionVerifyReply._();\n\n  factory FacialRecognitionVerifyReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FacialRecognitionVerifyReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FacialRecognitionVerifyReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FacialRecognitionVerifyReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FacialRecognitionVerifyReply copyWith(\n          void Function(FacialRecognitionVerifyReply) updates) =>\n      super.copyWith(\n              (message) => updates(message as FacialRecognitionVerifyReply))\n          as FacialRecognitionVerifyReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FacialRecognitionVerifyReply create() =>\n      FacialRecognitionVerifyReply._();\n  @$core.override\n  FacialRecognitionVerifyReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FacialRecognitionVerifyReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FacialRecognitionVerifyReply>(create);\n  static FacialRecognitionVerifyReply? _defaultInstance;\n}\n\nclass FacialRecognitionVerifyReq extends $pb.GeneratedMessage {\n  factory FacialRecognitionVerifyReq({\n    FacialRecognitionVerifyFrom? from,\n    $core.String? deviceToken,\n  }) {\n    final result = create();\n    if (from != null) result.from = from;\n    if (deviceToken != null) result.deviceToken = deviceToken;\n    return result;\n  }\n\n  FacialRecognitionVerifyReq._();\n\n  factory FacialRecognitionVerifyReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FacialRecognitionVerifyReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FacialRecognitionVerifyReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aE<FacialRecognitionVerifyFrom>(1, _omitFieldNames ? '' : 'from',\n        enumValues: FacialRecognitionVerifyFrom.values)\n    ..aOS(2, _omitFieldNames ? '' : 'deviceToken')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FacialRecognitionVerifyReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FacialRecognitionVerifyReq copyWith(\n          void Function(FacialRecognitionVerifyReq) updates) =>\n      super.copyWith(\n              (message) => updates(message as FacialRecognitionVerifyReq))\n          as FacialRecognitionVerifyReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FacialRecognitionVerifyReq create() => FacialRecognitionVerifyReq._();\n  @$core.override\n  FacialRecognitionVerifyReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FacialRecognitionVerifyReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FacialRecognitionVerifyReq>(create);\n  static FacialRecognitionVerifyReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  FacialRecognitionVerifyFrom get from => $_getN(0);\n  @$pb.TagNumber(1)\n  set from(FacialRecognitionVerifyFrom value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFrom() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFrom() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get deviceToken => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set deviceToken($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDeviceToken() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDeviceToken() => $_clearField(2);\n}\n\nclass HisInfo extends $pb.GeneratedMessage {\n  factory HisInfo({\n    $core.String? business,\n    $fixnum.Int64? kid,\n  }) {\n    final result = create();\n    if (business != null) result.business = business;\n    if (kid != null) result.kid = kid;\n    return result;\n  }\n\n  HisInfo._();\n\n  factory HisInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory HisInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'HisInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'business')\n    ..aInt64(2, _omitFieldNames ? '' : 'kid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  HisInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  HisInfo copyWith(void Function(HisInfo) updates) =>\n      super.copyWith((message) => updates(message as HisInfo)) as HisInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static HisInfo create() => HisInfo._();\n  @$core.override\n  HisInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static HisInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<HisInfo>(create);\n  static HisInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get business => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set business($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBusiness() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBusiness() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get kid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set kid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasKid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearKid() => $_clearField(2);\n}\n\nclass HistoryTabReply extends $pb.GeneratedMessage {\n  factory HistoryTabReply({\n    $core.Iterable<CursorTab>? tab,\n  }) {\n    final result = create();\n    if (tab != null) result.tab.addAll(tab);\n    return result;\n  }\n\n  HistoryTabReply._();\n\n  factory HistoryTabReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory HistoryTabReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'HistoryTabReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..pPM<CursorTab>(1, _omitFieldNames ? '' : 'tab',\n        subBuilder: CursorTab.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  HistoryTabReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  HistoryTabReply copyWith(void Function(HistoryTabReply) updates) =>\n      super.copyWith((message) => updates(message as HistoryTabReply))\n          as HistoryTabReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static HistoryTabReply create() => HistoryTabReply._();\n  @$core.override\n  HistoryTabReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static HistoryTabReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<HistoryTabReply>(create);\n  static HistoryTabReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<CursorTab> get tab => $_getList(0);\n}\n\nclass HistoryTabReq extends $pb.GeneratedMessage {\n  factory HistoryTabReq({\n    $core.String? business,\n    HistorySource? source,\n    $core.String? keyword,\n  }) {\n    final result = create();\n    if (business != null) result.business = business;\n    if (source != null) result.source = source;\n    if (keyword != null) result.keyword = keyword;\n    return result;\n  }\n\n  HistoryTabReq._();\n\n  factory HistoryTabReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory HistoryTabReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'HistoryTabReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'business')\n    ..aE<HistorySource>(2, _omitFieldNames ? '' : 'source',\n        enumValues: HistorySource.values)\n    ..aOS(3, _omitFieldNames ? '' : 'keyword')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  HistoryTabReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  HistoryTabReq copyWith(void Function(HistoryTabReq) updates) =>\n      super.copyWith((message) => updates(message as HistoryTabReq))\n          as HistoryTabReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static HistoryTabReq create() => HistoryTabReq._();\n  @$core.override\n  HistoryTabReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static HistoryTabReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<HistoryTabReq>(create);\n  static HistoryTabReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get business => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set business($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBusiness() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBusiness() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  HistorySource get source => $_getN(1);\n  @$pb.TagNumber(2)\n  set source(HistorySource value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSource() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSource() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get keyword => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set keyword($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasKeyword() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearKeyword() => $_clearField(3);\n}\n\nclass LatestHistoryReply extends $pb.GeneratedMessage {\n  factory LatestHistoryReply({\n    CursorItem? items,\n    $core.String? scene,\n    $fixnum.Int64? rtime,\n    $core.String? flag,\n  }) {\n    final result = create();\n    if (items != null) result.items = items;\n    if (scene != null) result.scene = scene;\n    if (rtime != null) result.rtime = rtime;\n    if (flag != null) result.flag = flag;\n    return result;\n  }\n\n  LatestHistoryReply._();\n\n  factory LatestHistoryReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LatestHistoryReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LatestHistoryReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOM<CursorItem>(1, _omitFieldNames ? '' : 'items',\n        subBuilder: CursorItem.create)\n    ..aOS(2, _omitFieldNames ? '' : 'scene')\n    ..aInt64(3, _omitFieldNames ? '' : 'rtime')\n    ..aOS(4, _omitFieldNames ? '' : 'flag')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LatestHistoryReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LatestHistoryReply copyWith(void Function(LatestHistoryReply) updates) =>\n      super.copyWith((message) => updates(message as LatestHistoryReply))\n          as LatestHistoryReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LatestHistoryReply create() => LatestHistoryReply._();\n  @$core.override\n  LatestHistoryReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LatestHistoryReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LatestHistoryReply>(create);\n  static LatestHistoryReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  CursorItem get items => $_getN(0);\n  @$pb.TagNumber(1)\n  set items(CursorItem value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasItems() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearItems() => $_clearField(1);\n  @$pb.TagNumber(1)\n  CursorItem ensureItems() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get scene => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set scene($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasScene() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearScene() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get rtime => $_getI64(2);\n  @$pb.TagNumber(3)\n  set rtime($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRtime() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRtime() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get flag => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set flag($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFlag() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFlag() => $_clearField(4);\n}\n\nclass LatestHistoryReq extends $pb.GeneratedMessage {\n  factory LatestHistoryReq({\n    $core.String? business,\n    PlayerPreloadParams? playerPreload,\n  }) {\n    final result = create();\n    if (business != null) result.business = business;\n    if (playerPreload != null) result.playerPreload = playerPreload;\n    return result;\n  }\n\n  LatestHistoryReq._();\n\n  factory LatestHistoryReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LatestHistoryReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LatestHistoryReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'business')\n    ..aOM<PlayerPreloadParams>(2, _omitFieldNames ? '' : 'playerPreload',\n        subBuilder: PlayerPreloadParams.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LatestHistoryReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LatestHistoryReq copyWith(void Function(LatestHistoryReq) updates) =>\n      super.copyWith((message) => updates(message as LatestHistoryReq))\n          as LatestHistoryReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LatestHistoryReq create() => LatestHistoryReq._();\n  @$core.override\n  LatestHistoryReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LatestHistoryReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LatestHistoryReq>(create);\n  static LatestHistoryReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get business => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set business($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBusiness() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBusiness() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  PlayerPreloadParams get playerPreload => $_getN(1);\n  @$pb.TagNumber(2)\n  set playerPreload(PlayerPreloadParams value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPlayerPreload() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPlayerPreload() => $_clearField(2);\n  @$pb.TagNumber(2)\n  PlayerPreloadParams ensurePlayerPreload() => $_ensure(1);\n}\n\nclass LikeButton extends $pb.GeneratedMessage {\n  factory LikeButton({\n    $fixnum.Int64? aid,\n    $core.int? count,\n    $core.bool? showCount,\n    $core.String? event,\n    $core.int? selected,\n    $core.String? eventV2,\n    LikeButtonResource? likeResource,\n    LikeButtonResource? disLikeResource,\n    LikeButtonResource? likeNightResource,\n    LikeButtonResource? disLikeNightResource,\n  }) {\n    final result = create();\n    if (aid != null) result.aid = aid;\n    if (count != null) result.count = count;\n    if (showCount != null) result.showCount = showCount;\n    if (event != null) result.event = event;\n    if (selected != null) result.selected = selected;\n    if (eventV2 != null) result.eventV2 = eventV2;\n    if (likeResource != null) result.likeResource = likeResource;\n    if (disLikeResource != null) result.disLikeResource = disLikeResource;\n    if (likeNightResource != null) result.likeNightResource = likeNightResource;\n    if (disLikeNightResource != null)\n      result.disLikeNightResource = disLikeNightResource;\n    return result;\n  }\n\n  LikeButton._();\n\n  factory LikeButton.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LikeButton.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LikeButton',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'aid')\n    ..aI(2, _omitFieldNames ? '' : 'count')\n    ..aOB(3, _omitFieldNames ? '' : 'showCount')\n    ..aOS(4, _omitFieldNames ? '' : 'event')\n    ..aI(5, _omitFieldNames ? '' : 'selected')\n    ..aOS(6, _omitFieldNames ? '' : 'eventV2')\n    ..aOM<LikeButtonResource>(7, _omitFieldNames ? '' : 'likeResource',\n        subBuilder: LikeButtonResource.create)\n    ..aOM<LikeButtonResource>(8, _omitFieldNames ? '' : 'disLikeResource',\n        subBuilder: LikeButtonResource.create)\n    ..aOM<LikeButtonResource>(9, _omitFieldNames ? '' : 'likeNightResource',\n        subBuilder: LikeButtonResource.create)\n    ..aOM<LikeButtonResource>(10, _omitFieldNames ? '' : 'disLikeNightResource',\n        subBuilder: LikeButtonResource.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeButton clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeButton copyWith(void Function(LikeButton) updates) =>\n      super.copyWith((message) => updates(message as LikeButton)) as LikeButton;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LikeButton create() => LikeButton._();\n  @$core.override\n  LikeButton createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LikeButton getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LikeButton>(create);\n  static LikeButton? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get aid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set aid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get count => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set count($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCount() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCount() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get showCount => $_getBF(2);\n  @$pb.TagNumber(3)\n  set showCount($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasShowCount() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearShowCount() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get event => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set event($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasEvent() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearEvent() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get selected => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set selected($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasSelected() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearSelected() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get eventV2 => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set eventV2($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasEventV2() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearEventV2() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  LikeButtonResource get likeResource => $_getN(6);\n  @$pb.TagNumber(7)\n  set likeResource(LikeButtonResource value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasLikeResource() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearLikeResource() => $_clearField(7);\n  @$pb.TagNumber(7)\n  LikeButtonResource ensureLikeResource() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  LikeButtonResource get disLikeResource => $_getN(7);\n  @$pb.TagNumber(8)\n  set disLikeResource(LikeButtonResource value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasDisLikeResource() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearDisLikeResource() => $_clearField(8);\n  @$pb.TagNumber(8)\n  LikeButtonResource ensureDisLikeResource() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  LikeButtonResource get likeNightResource => $_getN(8);\n  @$pb.TagNumber(9)\n  set likeNightResource(LikeButtonResource value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasLikeNightResource() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearLikeNightResource() => $_clearField(9);\n  @$pb.TagNumber(9)\n  LikeButtonResource ensureLikeNightResource() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  LikeButtonResource get disLikeNightResource => $_getN(9);\n  @$pb.TagNumber(10)\n  set disLikeNightResource(LikeButtonResource value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasDisLikeNightResource() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearDisLikeNightResource() => $_clearField(10);\n  @$pb.TagNumber(10)\n  LikeButtonResource ensureDisLikeNightResource() => $_ensure(9);\n}\n\nclass LikeButtonResource extends $pb.GeneratedMessage {\n  factory LikeButtonResource({\n    $core.String? url,\n    $core.String? hash,\n  }) {\n    final result = create();\n    if (url != null) result.url = url;\n    if (hash != null) result.hash = hash;\n    return result;\n  }\n\n  LikeButtonResource._();\n\n  factory LikeButtonResource.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LikeButtonResource.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LikeButtonResource',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'url')\n    ..aOS(2, _omitFieldNames ? '' : 'hash')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeButtonResource clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeButtonResource copyWith(void Function(LikeButtonResource) updates) =>\n      super.copyWith((message) => updates(message as LikeButtonResource))\n          as LikeButtonResource;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LikeButtonResource create() => LikeButtonResource._();\n  @$core.override\n  LikeButtonResource createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LikeButtonResource getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LikeButtonResource>(create);\n  static LikeButtonResource? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get url => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set url($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUrl() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get hash => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set hash($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHash() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHash() => $_clearField(2);\n}\n\nclass LikeCard extends $pb.GeneratedMessage {\n  factory LikeCard({\n    $fixnum.Int64? like,\n    $core.bool? isFollow,\n  }) {\n    final result = create();\n    if (like != null) result.like = like;\n    if (isFollow != null) result.isFollow = isFollow;\n    return result;\n  }\n\n  LikeCard._();\n\n  factory LikeCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LikeCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LikeCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'like')\n    ..aOB(2, _omitFieldNames ? '' : 'isFollow')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeCard copyWith(void Function(LikeCard) updates) =>\n      super.copyWith((message) => updates(message as LikeCard)) as LikeCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LikeCard create() => LikeCard._();\n  @$core.override\n  LikeCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LikeCard getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<LikeCard>(create);\n  static LikeCard? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get like => $_getI64(0);\n  @$pb.TagNumber(1)\n  set like($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLike() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLike() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get isFollow => $_getBF(1);\n  @$pb.TagNumber(2)\n  set isFollow($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIsFollow() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIsFollow() => $_clearField(2);\n}\n\nclass MediaCard extends $pb.GeneratedMessage {\n  factory MediaCard({\n    $core.String? cover,\n    $core.String? curTitle,\n    $core.String? style,\n    $core.String? label,\n    Button? butFirst,\n    Supernatant? butSecond,\n    Scores? scores,\n  }) {\n    final result = create();\n    if (cover != null) result.cover = cover;\n    if (curTitle != null) result.curTitle = curTitle;\n    if (style != null) result.style = style;\n    if (label != null) result.label = label;\n    if (butFirst != null) result.butFirst = butFirst;\n    if (butSecond != null) result.butSecond = butSecond;\n    if (scores != null) result.scores = scores;\n    return result;\n  }\n\n  MediaCard._();\n\n  factory MediaCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MediaCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MediaCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'cover')\n    ..aOS(2, _omitFieldNames ? '' : 'curTitle')\n    ..aOS(3, _omitFieldNames ? '' : 'style')\n    ..aOS(4, _omitFieldNames ? '' : 'label')\n    ..aOM<Button>(5, _omitFieldNames ? '' : 'butFirst',\n        subBuilder: Button.create)\n    ..aOM<Supernatant>(6, _omitFieldNames ? '' : 'butSecond',\n        subBuilder: Supernatant.create)\n    ..aOM<Scores>(7, _omitFieldNames ? '' : 'scores', subBuilder: Scores.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MediaCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MediaCard copyWith(void Function(MediaCard) updates) =>\n      super.copyWith((message) => updates(message as MediaCard)) as MediaCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MediaCard create() => MediaCard._();\n  @$core.override\n  MediaCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MediaCard getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<MediaCard>(create);\n  static MediaCard? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get cover => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set cover($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCover() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCover() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get curTitle => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set curTitle($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCurTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCurTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get style => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set style($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasStyle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearStyle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get label => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set label($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLabel() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLabel() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  Button get butFirst => $_getN(4);\n  @$pb.TagNumber(5)\n  set butFirst(Button value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasButFirst() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearButFirst() => $_clearField(5);\n  @$pb.TagNumber(5)\n  Button ensureButFirst() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  Supernatant get butSecond => $_getN(5);\n  @$pb.TagNumber(6)\n  set butSecond(Supernatant value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasButSecond() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearButSecond() => $_clearField(6);\n  @$pb.TagNumber(6)\n  Supernatant ensureButSecond() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  Scores get scores => $_getN(6);\n  @$pb.TagNumber(7)\n  set scores(Scores value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasScores() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearScores() => $_clearField(7);\n  @$pb.TagNumber(7)\n  Scores ensureScores() => $_ensure(6);\n}\n\nclass MediaCommentReply extends $pb.GeneratedMessage {\n  factory MediaCommentReply({\n    $core.String? errMsg,\n  }) {\n    final result = create();\n    if (errMsg != null) result.errMsg = errMsg;\n    return result;\n  }\n\n  MediaCommentReply._();\n\n  factory MediaCommentReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MediaCommentReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MediaCommentReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'errMsg')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MediaCommentReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MediaCommentReply copyWith(void Function(MediaCommentReply) updates) =>\n      super.copyWith((message) => updates(message as MediaCommentReply))\n          as MediaCommentReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MediaCommentReply create() => MediaCommentReply._();\n  @$core.override\n  MediaCommentReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MediaCommentReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MediaCommentReply>(create);\n  static MediaCommentReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get errMsg => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set errMsg($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasErrMsg() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearErrMsg() => $_clearField(1);\n}\n\nclass MediaCommentReq extends $pb.GeneratedMessage {\n  factory MediaCommentReq({\n    $core.String? id,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    return result;\n  }\n\n  MediaCommentReq._();\n\n  factory MediaCommentReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MediaCommentReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MediaCommentReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'id')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MediaCommentReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MediaCommentReq copyWith(void Function(MediaCommentReq) updates) =>\n      super.copyWith((message) => updates(message as MediaCommentReq))\n          as MediaCommentReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MediaCommentReq create() => MediaCommentReq._();\n  @$core.override\n  MediaCommentReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MediaCommentReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MediaCommentReq>(create);\n  static MediaCommentReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get id => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set id($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n}\n\nclass MediaDetailReply extends $pb.GeneratedMessage {\n  factory MediaDetailReply({\n    Cast? cast,\n    Staff? staff,\n    Overview? overview,\n  }) {\n    final result = create();\n    if (cast != null) result.cast = cast;\n    if (staff != null) result.staff = staff;\n    if (overview != null) result.overview = overview;\n    return result;\n  }\n\n  MediaDetailReply._();\n\n  factory MediaDetailReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MediaDetailReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MediaDetailReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOM<Cast>(1, _omitFieldNames ? '' : 'cast', subBuilder: Cast.create)\n    ..aOM<Staff>(2, _omitFieldNames ? '' : 'staff', subBuilder: Staff.create)\n    ..aOM<Overview>(3, _omitFieldNames ? '' : 'overview',\n        subBuilder: Overview.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MediaDetailReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MediaDetailReply copyWith(void Function(MediaDetailReply) updates) =>\n      super.copyWith((message) => updates(message as MediaDetailReply))\n          as MediaDetailReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MediaDetailReply create() => MediaDetailReply._();\n  @$core.override\n  MediaDetailReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MediaDetailReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MediaDetailReply>(create);\n  static MediaDetailReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Cast get cast => $_getN(0);\n  @$pb.TagNumber(1)\n  set cast(Cast value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCast() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCast() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Cast ensureCast() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  Staff get staff => $_getN(1);\n  @$pb.TagNumber(2)\n  set staff(Staff value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasStaff() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearStaff() => $_clearField(2);\n  @$pb.TagNumber(2)\n  Staff ensureStaff() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  Overview get overview => $_getN(2);\n  @$pb.TagNumber(3)\n  set overview(Overview value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasOverview() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearOverview() => $_clearField(3);\n  @$pb.TagNumber(3)\n  Overview ensureOverview() => $_ensure(2);\n}\n\nclass MediaDetailReq extends $pb.GeneratedMessage {\n  factory MediaDetailReq({\n    $fixnum.Int64? bizId,\n    $fixnum.Int64? bizType,\n  }) {\n    final result = create();\n    if (bizId != null) result.bizId = bizId;\n    if (bizType != null) result.bizType = bizType;\n    return result;\n  }\n\n  MediaDetailReq._();\n\n  factory MediaDetailReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MediaDetailReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MediaDetailReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'bizId')\n    ..aInt64(2, _omitFieldNames ? '' : 'bizType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MediaDetailReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MediaDetailReq copyWith(void Function(MediaDetailReq) updates) =>\n      super.copyWith((message) => updates(message as MediaDetailReq))\n          as MediaDetailReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MediaDetailReq create() => MediaDetailReq._();\n  @$core.override\n  MediaDetailReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MediaDetailReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MediaDetailReq>(create);\n  static MediaDetailReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get bizId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set bizId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBizId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBizId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get bizType => $_getI64(1);\n  @$pb.TagNumber(2)\n  set bizType($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBizType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBizType() => $_clearField(2);\n}\n\nclass MediaFollowReply extends $pb.GeneratedMessage {\n  factory MediaFollowReply() => create();\n\n  MediaFollowReply._();\n\n  factory MediaFollowReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MediaFollowReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MediaFollowReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MediaFollowReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MediaFollowReply copyWith(void Function(MediaFollowReply) updates) =>\n      super.copyWith((message) => updates(message as MediaFollowReply))\n          as MediaFollowReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MediaFollowReply create() => MediaFollowReply._();\n  @$core.override\n  MediaFollowReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MediaFollowReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MediaFollowReply>(create);\n  static MediaFollowReply? _defaultInstance;\n}\n\nclass MediaFollowReq extends $pb.GeneratedMessage {\n  factory MediaFollowReq({\n    $core.String? id,\n    ButType? type,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (type != null) result.type = type;\n    return result;\n  }\n\n  MediaFollowReq._();\n\n  factory MediaFollowReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MediaFollowReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MediaFollowReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'id')\n    ..aE<ButType>(2, _omitFieldNames ? '' : 'type', enumValues: ButType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MediaFollowReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MediaFollowReq copyWith(void Function(MediaFollowReq) updates) =>\n      super.copyWith((message) => updates(message as MediaFollowReq))\n          as MediaFollowReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MediaFollowReq create() => MediaFollowReq._();\n  @$core.override\n  MediaFollowReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MediaFollowReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MediaFollowReq>(create);\n  static MediaFollowReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get id => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set id($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  ButType get type => $_getN(1);\n  @$pb.TagNumber(2)\n  set type(ButType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearType() => $_clearField(2);\n}\n\nclass MediaPerson extends $pb.GeneratedMessage {\n  factory MediaPerson({\n    $core.String? realName,\n    $core.String? squareUrl,\n    $core.String? character,\n    $fixnum.Int64? personId,\n    $core.String? type,\n  }) {\n    final result = create();\n    if (realName != null) result.realName = realName;\n    if (squareUrl != null) result.squareUrl = squareUrl;\n    if (character != null) result.character = character;\n    if (personId != null) result.personId = personId;\n    if (type != null) result.type = type;\n    return result;\n  }\n\n  MediaPerson._();\n\n  factory MediaPerson.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MediaPerson.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MediaPerson',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'realName')\n    ..aOS(2, _omitFieldNames ? '' : 'squareUrl')\n    ..aOS(3, _omitFieldNames ? '' : 'character')\n    ..aInt64(4, _omitFieldNames ? '' : 'personId')\n    ..aOS(5, _omitFieldNames ? '' : 'type')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MediaPerson clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MediaPerson copyWith(void Function(MediaPerson) updates) =>\n      super.copyWith((message) => updates(message as MediaPerson))\n          as MediaPerson;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MediaPerson create() => MediaPerson._();\n  @$core.override\n  MediaPerson createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MediaPerson getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MediaPerson>(create);\n  static MediaPerson? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get realName => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set realName($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasRealName() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRealName() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get squareUrl => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set squareUrl($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSquareUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSquareUrl() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get character => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set character($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCharacter() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCharacter() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get personId => $_getI64(3);\n  @$pb.TagNumber(4)\n  set personId($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPersonId() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPersonId() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get type => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set type($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearType() => $_clearField(5);\n}\n\nclass MediaRelationReply extends $pb.GeneratedMessage {\n  factory MediaRelationReply({\n    $core.String? offset,\n    $core.bool? hasMore,\n    $core.Iterable<SmallItem>? list,\n  }) {\n    final result = create();\n    if (offset != null) result.offset = offset;\n    if (hasMore != null) result.hasMore = hasMore;\n    if (list != null) result.list.addAll(list);\n    return result;\n  }\n\n  MediaRelationReply._();\n\n  factory MediaRelationReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MediaRelationReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MediaRelationReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'offset')\n    ..aOB(2, _omitFieldNames ? '' : 'hasMore')\n    ..pPM<SmallItem>(3, _omitFieldNames ? '' : 'list',\n        subBuilder: SmallItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MediaRelationReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MediaRelationReply copyWith(void Function(MediaRelationReply) updates) =>\n      super.copyWith((message) => updates(message as MediaRelationReply))\n          as MediaRelationReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MediaRelationReply create() => MediaRelationReply._();\n  @$core.override\n  MediaRelationReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MediaRelationReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MediaRelationReply>(create);\n  static MediaRelationReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get offset => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set offset($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOffset() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOffset() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get hasMore => $_getBF(1);\n  @$pb.TagNumber(2)\n  set hasMore($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHasMore() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHasMore() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<SmallItem> get list => $_getList(2);\n}\n\nclass MediaRelationReq extends $pb.GeneratedMessage {\n  factory MediaRelationReq({\n    $fixnum.Int64? bizId,\n    $fixnum.Int64? bizType,\n    $fixnum.Int64? feedId,\n    $core.String? offset,\n    $core.int? ps,\n  }) {\n    final result = create();\n    if (bizId != null) result.bizId = bizId;\n    if (bizType != null) result.bizType = bizType;\n    if (feedId != null) result.feedId = feedId;\n    if (offset != null) result.offset = offset;\n    if (ps != null) result.ps = ps;\n    return result;\n  }\n\n  MediaRelationReq._();\n\n  factory MediaRelationReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MediaRelationReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MediaRelationReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'bizId')\n    ..aInt64(2, _omitFieldNames ? '' : 'bizType')\n    ..aInt64(3, _omitFieldNames ? '' : 'feedId')\n    ..aOS(5, _omitFieldNames ? '' : 'offset')\n    ..aI(6, _omitFieldNames ? '' : 'ps')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MediaRelationReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MediaRelationReq copyWith(void Function(MediaRelationReq) updates) =>\n      super.copyWith((message) => updates(message as MediaRelationReq))\n          as MediaRelationReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MediaRelationReq create() => MediaRelationReq._();\n  @$core.override\n  MediaRelationReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MediaRelationReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MediaRelationReq>(create);\n  static MediaRelationReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get bizId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set bizId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBizId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBizId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get bizType => $_getI64(1);\n  @$pb.TagNumber(2)\n  set bizType($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBizType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBizType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get feedId => $_getI64(2);\n  @$pb.TagNumber(3)\n  set feedId($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFeedId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFeedId() => $_clearField(3);\n\n  @$pb.TagNumber(5)\n  $core.String get offset => $_getSZ(3);\n  @$pb.TagNumber(5)\n  set offset($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(5)\n  $core.bool hasOffset() => $_has(3);\n  @$pb.TagNumber(5)\n  void clearOffset() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get ps => $_getIZ(4);\n  @$pb.TagNumber(6)\n  set ps($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(6)\n  $core.bool hasPs() => $_has(4);\n  @$pb.TagNumber(6)\n  void clearPs() => $_clearField(6);\n}\n\nclass MediaTabReply extends $pb.GeneratedMessage {\n  factory MediaTabReply({\n    MediaCard? mediaCard,\n    $core.Iterable<ShowTab>? tab,\n    $fixnum.Int64? defaultTabIndex,\n    ChannelInfo? channelInfo,\n  }) {\n    final result = create();\n    if (mediaCard != null) result.mediaCard = mediaCard;\n    if (tab != null) result.tab.addAll(tab);\n    if (defaultTabIndex != null) result.defaultTabIndex = defaultTabIndex;\n    if (channelInfo != null) result.channelInfo = channelInfo;\n    return result;\n  }\n\n  MediaTabReply._();\n\n  factory MediaTabReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MediaTabReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MediaTabReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOM<MediaCard>(1, _omitFieldNames ? '' : 'mediaCard',\n        subBuilder: MediaCard.create)\n    ..pPM<ShowTab>(2, _omitFieldNames ? '' : 'tab', subBuilder: ShowTab.create)\n    ..aInt64(3, _omitFieldNames ? '' : 'defaultTabIndex')\n    ..aOM<ChannelInfo>(4, _omitFieldNames ? '' : 'channelInfo',\n        subBuilder: ChannelInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MediaTabReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MediaTabReply copyWith(void Function(MediaTabReply) updates) =>\n      super.copyWith((message) => updates(message as MediaTabReply))\n          as MediaTabReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MediaTabReply create() => MediaTabReply._();\n  @$core.override\n  MediaTabReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MediaTabReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MediaTabReply>(create);\n  static MediaTabReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  MediaCard get mediaCard => $_getN(0);\n  @$pb.TagNumber(1)\n  set mediaCard(MediaCard value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMediaCard() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMediaCard() => $_clearField(1);\n  @$pb.TagNumber(1)\n  MediaCard ensureMediaCard() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<ShowTab> get tab => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get defaultTabIndex => $_getI64(2);\n  @$pb.TagNumber(3)\n  set defaultTabIndex($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDefaultTabIndex() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDefaultTabIndex() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  ChannelInfo get channelInfo => $_getN(3);\n  @$pb.TagNumber(4)\n  set channelInfo(ChannelInfo value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasChannelInfo() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearChannelInfo() => $_clearField(4);\n  @$pb.TagNumber(4)\n  ChannelInfo ensureChannelInfo() => $_ensure(3);\n}\n\nclass MediaTabReq extends $pb.GeneratedMessage {\n  factory MediaTabReq({\n    $fixnum.Int64? bizId,\n    $fixnum.Int64? bizType,\n    $core.String? source,\n    $core.String? spmid,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? args,\n  }) {\n    final result = create();\n    if (bizId != null) result.bizId = bizId;\n    if (bizType != null) result.bizType = bizType;\n    if (source != null) result.source = source;\n    if (spmid != null) result.spmid = spmid;\n    if (args != null) result.args.addEntries(args);\n    return result;\n  }\n\n  MediaTabReq._();\n\n  factory MediaTabReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MediaTabReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MediaTabReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'bizId')\n    ..aInt64(2, _omitFieldNames ? '' : 'bizType')\n    ..aOS(3, _omitFieldNames ? '' : 'source')\n    ..aOS(4, _omitFieldNames ? '' : 'spmid')\n    ..m<$core.String, $core.String>(5, _omitFieldNames ? '' : 'args',\n        entryClassName: 'MediaTabReq.ArgsEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.interfaces.v1'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MediaTabReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MediaTabReq copyWith(void Function(MediaTabReq) updates) =>\n      super.copyWith((message) => updates(message as MediaTabReq))\n          as MediaTabReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MediaTabReq create() => MediaTabReq._();\n  @$core.override\n  MediaTabReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MediaTabReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MediaTabReq>(create);\n  static MediaTabReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get bizId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set bizId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBizId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBizId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get bizType => $_getI64(1);\n  @$pb.TagNumber(2)\n  set bizType($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBizType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBizType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get source => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set source($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSource() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSource() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get spmid => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set spmid($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSpmid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSpmid() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $pb.PbMap<$core.String, $core.String> get args => $_getMap(4);\n}\n\nclass MediaVideoReply extends $pb.GeneratedMessage {\n  factory MediaVideoReply({\n    $core.String? offset,\n    $core.bool? hasMore,\n    $core.Iterable<BigItem>? list,\n  }) {\n    final result = create();\n    if (offset != null) result.offset = offset;\n    if (hasMore != null) result.hasMore = hasMore;\n    if (list != null) result.list.addAll(list);\n    return result;\n  }\n\n  MediaVideoReply._();\n\n  factory MediaVideoReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MediaVideoReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MediaVideoReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'offset')\n    ..aOB(2, _omitFieldNames ? '' : 'hasMore')\n    ..pPM<BigItem>(3, _omitFieldNames ? '' : 'list', subBuilder: BigItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MediaVideoReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MediaVideoReply copyWith(void Function(MediaVideoReply) updates) =>\n      super.copyWith((message) => updates(message as MediaVideoReply))\n          as MediaVideoReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MediaVideoReply create() => MediaVideoReply._();\n  @$core.override\n  MediaVideoReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MediaVideoReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MediaVideoReply>(create);\n  static MediaVideoReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get offset => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set offset($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOffset() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOffset() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get hasMore => $_getBF(1);\n  @$pb.TagNumber(2)\n  set hasMore($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHasMore() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHasMore() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<BigItem> get list => $_getList(2);\n}\n\nclass MediaVideoReq extends $pb.GeneratedMessage {\n  factory MediaVideoReq({\n    $fixnum.Int64? bizId,\n    $fixnum.Int64? bizType,\n    $fixnum.Int64? feedId,\n    $core.String? offset,\n    $core.int? ps,\n    $3.PlayerArgs? playerArgs,\n  }) {\n    final result = create();\n    if (bizId != null) result.bizId = bizId;\n    if (bizType != null) result.bizType = bizType;\n    if (feedId != null) result.feedId = feedId;\n    if (offset != null) result.offset = offset;\n    if (ps != null) result.ps = ps;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    return result;\n  }\n\n  MediaVideoReq._();\n\n  factory MediaVideoReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MediaVideoReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MediaVideoReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'bizId')\n    ..aInt64(2, _omitFieldNames ? '' : 'bizType')\n    ..aInt64(3, _omitFieldNames ? '' : 'feedId')\n    ..aOS(5, _omitFieldNames ? '' : 'offset')\n    ..aI(6, _omitFieldNames ? '' : 'ps')\n    ..aOM<$3.PlayerArgs>(7, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $3.PlayerArgs.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MediaVideoReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MediaVideoReq copyWith(void Function(MediaVideoReq) updates) =>\n      super.copyWith((message) => updates(message as MediaVideoReq))\n          as MediaVideoReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MediaVideoReq create() => MediaVideoReq._();\n  @$core.override\n  MediaVideoReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MediaVideoReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MediaVideoReq>(create);\n  static MediaVideoReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get bizId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set bizId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBizId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBizId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get bizType => $_getI64(1);\n  @$pb.TagNumber(2)\n  set bizType($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBizType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBizType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get feedId => $_getI64(2);\n  @$pb.TagNumber(3)\n  set feedId($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFeedId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFeedId() => $_clearField(3);\n\n  @$pb.TagNumber(5)\n  $core.String get offset => $_getSZ(3);\n  @$pb.TagNumber(5)\n  set offset($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(5)\n  $core.bool hasOffset() => $_has(3);\n  @$pb.TagNumber(5)\n  void clearOffset() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get ps => $_getIZ(4);\n  @$pb.TagNumber(6)\n  set ps($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(6)\n  $core.bool hasPs() => $_has(4);\n  @$pb.TagNumber(6)\n  void clearPs() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $3.PlayerArgs get playerArgs => $_getN(5);\n  @$pb.TagNumber(7)\n  set playerArgs($3.PlayerArgs value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasPlayerArgs() => $_has(5);\n  @$pb.TagNumber(7)\n  void clearPlayerArgs() => $_clearField(7);\n  @$pb.TagNumber(7)\n  $3.PlayerArgs ensurePlayerArgs() => $_ensure(5);\n}\n\nclass ModeStatusReply extends $pb.GeneratedMessage {\n  factory ModeStatusReply({\n    $core.Iterable<UserModel>? userModels,\n  }) {\n    final result = create();\n    if (userModels != null) result.userModels.addAll(userModels);\n    return result;\n  }\n\n  ModeStatusReply._();\n\n  factory ModeStatusReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModeStatusReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModeStatusReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..pPM<UserModel>(1, _omitFieldNames ? '' : 'userModels',\n        subBuilder: UserModel.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModeStatusReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModeStatusReply copyWith(void Function(ModeStatusReply) updates) =>\n      super.copyWith((message) => updates(message as ModeStatusReply))\n          as ModeStatusReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModeStatusReply create() => ModeStatusReply._();\n  @$core.override\n  ModeStatusReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModeStatusReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModeStatusReply>(create);\n  static ModeStatusReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<UserModel> get userModels => $_getList(0);\n}\n\nclass ModeStatusReq extends $pb.GeneratedMessage {\n  factory ModeStatusReq({\n    $core.String? deviceToken,\n  }) {\n    final result = create();\n    if (deviceToken != null) result.deviceToken = deviceToken;\n    return result;\n  }\n\n  ModeStatusReq._();\n\n  factory ModeStatusReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModeStatusReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModeStatusReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'deviceToken')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModeStatusReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModeStatusReq copyWith(void Function(ModeStatusReq) updates) =>\n      super.copyWith((message) => updates(message as ModeStatusReq))\n          as ModeStatusReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModeStatusReq create() => ModeStatusReq._();\n  @$core.override\n  ModeStatusReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModeStatusReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModeStatusReq>(create);\n  static ModeStatusReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get deviceToken => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set deviceToken($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDeviceToken() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDeviceToken() => $_clearField(1);\n}\n\nclass ModifyPwdReply extends $pb.GeneratedMessage {\n  factory ModifyPwdReply() => create();\n\n  ModifyPwdReply._();\n\n  factory ModifyPwdReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModifyPwdReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModifyPwdReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModifyPwdReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModifyPwdReply copyWith(void Function(ModifyPwdReply) updates) =>\n      super.copyWith((message) => updates(message as ModifyPwdReply))\n          as ModifyPwdReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModifyPwdReply create() => ModifyPwdReply._();\n  @$core.override\n  ModifyPwdReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModifyPwdReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModifyPwdReply>(create);\n  static ModifyPwdReply? _defaultInstance;\n}\n\nclass ModifyPwdReq extends $pb.GeneratedMessage {\n  factory ModifyPwdReq({\n    $core.String? oldPwd,\n    $core.String? newPwd,\n    $core.String? deviceToken,\n  }) {\n    final result = create();\n    if (oldPwd != null) result.oldPwd = oldPwd;\n    if (newPwd != null) result.newPwd = newPwd;\n    if (deviceToken != null) result.deviceToken = deviceToken;\n    return result;\n  }\n\n  ModifyPwdReq._();\n\n  factory ModifyPwdReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ModifyPwdReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ModifyPwdReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'oldPwd')\n    ..aOS(2, _omitFieldNames ? '' : 'newPwd')\n    ..aOS(3, _omitFieldNames ? '' : 'deviceToken')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModifyPwdReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ModifyPwdReq copyWith(void Function(ModifyPwdReq) updates) =>\n      super.copyWith((message) => updates(message as ModifyPwdReq))\n          as ModifyPwdReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ModifyPwdReq create() => ModifyPwdReq._();\n  @$core.override\n  ModifyPwdReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ModifyPwdReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ModifyPwdReq>(create);\n  static ModifyPwdReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get oldPwd => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set oldPwd($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOldPwd() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOldPwd() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get newPwd => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set newPwd($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasNewPwd() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearNewPwd() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get deviceToken => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set deviceToken($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDeviceToken() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDeviceToken() => $_clearField(3);\n}\n\nclass NftFaceIcon extends $pb.GeneratedMessage {\n  factory NftFaceIcon({\n    $core.int? regionType,\n    $core.String? icon,\n    $core.int? showStatus,\n  }) {\n    final result = create();\n    if (regionType != null) result.regionType = regionType;\n    if (icon != null) result.icon = icon;\n    if (showStatus != null) result.showStatus = showStatus;\n    return result;\n  }\n\n  NftFaceIcon._();\n\n  factory NftFaceIcon.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory NftFaceIcon.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'NftFaceIcon',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'regionType')\n    ..aOS(2, _omitFieldNames ? '' : 'icon')\n    ..aI(3, _omitFieldNames ? '' : 'showStatus')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NftFaceIcon clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NftFaceIcon copyWith(void Function(NftFaceIcon) updates) =>\n      super.copyWith((message) => updates(message as NftFaceIcon))\n          as NftFaceIcon;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static NftFaceIcon create() => NftFaceIcon._();\n  @$core.override\n  NftFaceIcon createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static NftFaceIcon getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<NftFaceIcon>(create);\n  static NftFaceIcon? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get regionType => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set regionType($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasRegionType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRegionType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get icon => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set icon($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIcon() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIcon() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get showStatus => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set showStatus($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasShowStatus() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearShowStatus() => $_clearField(3);\n}\n\nclass NoReply extends $pb.GeneratedMessage {\n  factory NoReply() => create();\n\n  NoReply._();\n\n  factory NoReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory NoReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'NoReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NoReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NoReply copyWith(void Function(NoReply) updates) =>\n      super.copyWith((message) => updates(message as NoReply)) as NoReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static NoReply create() => NoReply._();\n  @$core.override\n  NoReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static NoReply getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<NoReply>(create);\n  static NoReply? _defaultInstance;\n}\n\nclass OfficialVerify extends $pb.GeneratedMessage {\n  factory OfficialVerify({\n    $core.int? type,\n    $core.String? desc,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (desc != null) result.desc = desc;\n    return result;\n  }\n\n  OfficialVerify._();\n\n  factory OfficialVerify.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OfficialVerify.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OfficialVerify',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'type')\n    ..aOS(2, _omitFieldNames ? '' : 'desc')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OfficialVerify clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OfficialVerify copyWith(void Function(OfficialVerify) updates) =>\n      super.copyWith((message) => updates(message as OfficialVerify))\n          as OfficialVerify;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OfficialVerify create() => OfficialVerify._();\n  @$core.override\n  OfficialVerify createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OfficialVerify getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OfficialVerify>(create);\n  static OfficialVerify? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get type => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set type($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get desc => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set desc($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDesc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDesc() => $_clearField(2);\n}\n\nclass Overview extends $pb.GeneratedMessage {\n  factory Overview({\n    $core.String? title,\n    $core.String? text,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (text != null) result.text = text;\n    return result;\n  }\n\n  Overview._();\n\n  factory Overview.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Overview.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Overview',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'text')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Overview clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Overview copyWith(void Function(Overview) updates) =>\n      super.copyWith((message) => updates(message as Overview)) as Overview;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Overview create() => Overview._();\n  @$core.override\n  Overview createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Overview getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Overview>(create);\n  static Overview? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n}\n\nclass Page extends $pb.GeneratedMessage {\n  factory Page({\n    $fixnum.Int64? pn,\n    $fixnum.Int64? total,\n  }) {\n    final result = create();\n    if (pn != null) result.pn = pn;\n    if (total != null) result.total = total;\n    return result;\n  }\n\n  Page._();\n\n  factory Page.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Page.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Page',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'pn')\n    ..aInt64(2, _omitFieldNames ? '' : 'total')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Page clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Page copyWith(void Function(Page) updates) =>\n      super.copyWith((message) => updates(message as Page)) as Page;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Page create() => Page._();\n  @$core.override\n  Page createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Page getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Page>(create);\n  static Page? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get pn => $_getI64(0);\n  @$pb.TagNumber(1)\n  set pn($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPn() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPn() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get total => $_getI64(1);\n  @$pb.TagNumber(2)\n  set total($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTotal() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTotal() => $_clearField(2);\n}\n\nclass PlayerPreloadParams extends $pb.GeneratedMessage {\n  factory PlayerPreloadParams({\n    $fixnum.Int64? qn,\n    $fixnum.Int64? fnver,\n    $fixnum.Int64? fnval,\n    $fixnum.Int64? forceHost,\n    $fixnum.Int64? fourk,\n  }) {\n    final result = create();\n    if (qn != null) result.qn = qn;\n    if (fnver != null) result.fnver = fnver;\n    if (fnval != null) result.fnval = fnval;\n    if (forceHost != null) result.forceHost = forceHost;\n    if (fourk != null) result.fourk = fourk;\n    return result;\n  }\n\n  PlayerPreloadParams._();\n\n  factory PlayerPreloadParams.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayerPreloadParams.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayerPreloadParams',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'qn')\n    ..aInt64(2, _omitFieldNames ? '' : 'fnver')\n    ..aInt64(3, _omitFieldNames ? '' : 'fnval')\n    ..aInt64(4, _omitFieldNames ? '' : 'forceHost')\n    ..aInt64(5, _omitFieldNames ? '' : 'fourk')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerPreloadParams clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerPreloadParams copyWith(void Function(PlayerPreloadParams) updates) =>\n      super.copyWith((message) => updates(message as PlayerPreloadParams))\n          as PlayerPreloadParams;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayerPreloadParams create() => PlayerPreloadParams._();\n  @$core.override\n  PlayerPreloadParams createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayerPreloadParams getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayerPreloadParams>(create);\n  static PlayerPreloadParams? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get qn => $_getI64(0);\n  @$pb.TagNumber(1)\n  set qn($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasQn() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearQn() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get fnver => $_getI64(1);\n  @$pb.TagNumber(2)\n  set fnver($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFnver() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFnver() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get fnval => $_getI64(2);\n  @$pb.TagNumber(3)\n  set fnval($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFnval() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFnval() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get forceHost => $_getI64(3);\n  @$pb.TagNumber(4)\n  set forceHost($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasForceHost() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearForceHost() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get fourk => $_getI64(4);\n  @$pb.TagNumber(5)\n  set fourk($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasFourk() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearFourk() => $_clearField(5);\n}\n\nclass Policy extends $pb.GeneratedMessage {\n  factory Policy({\n    $fixnum.Int64? interval,\n    $core.bool? useLocalTime,\n  }) {\n    final result = create();\n    if (interval != null) result.interval = interval;\n    if (useLocalTime != null) result.useLocalTime = useLocalTime;\n    return result;\n  }\n\n  Policy._();\n\n  factory Policy.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Policy.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Policy',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'interval')\n    ..aOB(2, _omitFieldNames ? '' : 'useLocalTime')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Policy clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Policy copyWith(void Function(Policy) updates) =>\n      super.copyWith((message) => updates(message as Policy)) as Policy;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Policy create() => Policy._();\n  @$core.override\n  Policy createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Policy getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Policy>(create);\n  static Policy? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get interval => $_getI64(0);\n  @$pb.TagNumber(1)\n  set interval($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasInterval() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearInterval() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get useLocalTime => $_getBF(1);\n  @$pb.TagNumber(2)\n  set useLocalTime($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUseLocalTime() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUseLocalTime() => $_clearField(2);\n}\n\nclass ReasonStyle extends $pb.GeneratedMessage {\n  factory ReasonStyle({\n    $core.String? text,\n    $core.String? textColor,\n    $core.String? textColorNight,\n    $core.String? bgColor,\n    $core.String? bgColorNight,\n    $core.String? borderColor,\n    $core.String? borderColorNight,\n    $core.int? bgStyle,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (textColor != null) result.textColor = textColor;\n    if (textColorNight != null) result.textColorNight = textColorNight;\n    if (bgColor != null) result.bgColor = bgColor;\n    if (bgColorNight != null) result.bgColorNight = bgColorNight;\n    if (borderColor != null) result.borderColor = borderColor;\n    if (borderColorNight != null) result.borderColorNight = borderColorNight;\n    if (bgStyle != null) result.bgStyle = bgStyle;\n    return result;\n  }\n\n  ReasonStyle._();\n\n  factory ReasonStyle.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReasonStyle.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReasonStyle',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aOS(2, _omitFieldNames ? '' : 'textColor')\n    ..aOS(3, _omitFieldNames ? '' : 'textColorNight')\n    ..aOS(4, _omitFieldNames ? '' : 'bgColor')\n    ..aOS(5, _omitFieldNames ? '' : 'bgColorNight')\n    ..aOS(6, _omitFieldNames ? '' : 'borderColor')\n    ..aOS(7, _omitFieldNames ? '' : 'borderColorNight')\n    ..aI(8, _omitFieldNames ? '' : 'bgStyle')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReasonStyle clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReasonStyle copyWith(void Function(ReasonStyle) updates) =>\n      super.copyWith((message) => updates(message as ReasonStyle))\n          as ReasonStyle;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReasonStyle create() => ReasonStyle._();\n  @$core.override\n  ReasonStyle createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReasonStyle getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReasonStyle>(create);\n  static ReasonStyle? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get textColor => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set textColor($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTextColor() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTextColor() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get textColorNight => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set textColorNight($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTextColorNight() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTextColorNight() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get bgColor => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set bgColor($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBgColor() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBgColor() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get bgColorNight => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set bgColorNight($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBgColorNight() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBgColorNight() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get borderColor => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set borderColor($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasBorderColor() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearBorderColor() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get borderColorNight => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set borderColorNight($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBorderColorNight() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBorderColorNight() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get bgStyle => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set bgStyle($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasBgStyle() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearBgStyle() => $_clearField(8);\n}\n\n/// 新关注组件\nclass Relation extends $pb.GeneratedMessage {\n  factory Relation({\n    $core.int? status,\n    $core.int? isFollow,\n    $core.int? isFollowed,\n  }) {\n    final result = create();\n    if (status != null) result.status = status;\n    if (isFollow != null) result.isFollow = isFollow;\n    if (isFollowed != null) result.isFollowed = isFollowed;\n    return result;\n  }\n\n  Relation._();\n\n  factory Relation.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Relation.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Relation',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'status')\n    ..aI(2, _omitFieldNames ? '' : 'isFollow')\n    ..aI(3, _omitFieldNames ? '' : 'isFollowed')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Relation clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Relation copyWith(void Function(Relation) updates) =>\n      super.copyWith((message) => updates(message as Relation)) as Relation;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Relation create() => Relation._();\n  @$core.override\n  Relation createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Relation getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Relation>(create);\n  static Relation? _defaultInstance;\n\n  /// 按钮展示文案\n  ///\n  /// - 1: 未关注\n  /// - 2: 已关注\n  /// - 3: 被关注\n  /// - 4: 互相关注\n  @$pb.TagNumber(1)\n  $core.int get status => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set status($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStatus() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStatus() => $_clearField(1);\n\n  /// 用户关注 UP 主\n  ///\n  /// - 0: 未关注\n  /// - 1: 已关注\n  @$pb.TagNumber(2)\n  $core.int get isFollow => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set isFollow($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIsFollow() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIsFollow() => $_clearField(2);\n\n  /// UP 主关注用户\n  ///\n  /// - 0: 未被关注\n  /// - 1: 已被关注\n  @$pb.TagNumber(3)\n  $core.int get isFollowed => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set isFollowed($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIsFollowed() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIsFollowed() => $_clearField(3);\n}\n\nclass ResultItem extends $pb.GeneratedMessage {\n  factory ResultItem({\n    $core.String? from,\n    $core.String? title,\n    $core.String? keyword,\n    $core.int? position,\n    $core.String? cover,\n    $core.double? coverSize,\n    $core.String? sugType,\n    $core.int? termType,\n    $core.String? goto,\n    $core.String? uri,\n    OfficialVerify? officialVerify,\n    $core.String? param,\n    $fixnum.Int64? mid,\n    $core.int? fans,\n    $core.int? level,\n    $core.int? archives,\n    $fixnum.Int64? ptime,\n    $core.String? seasonTypeName,\n    $core.String? area,\n    $core.String? style,\n    $core.String? label,\n    $core.double? rating,\n    $core.int? vote,\n    $core.Iterable<ReasonStyle>? badges,\n    $core.String? styles,\n    $fixnum.Int64? moduleId,\n    $core.String? liveLink,\n    $core.int? faceNftNew,\n    NftFaceIcon? nftFaceIcon,\n    $core.int? isSeniorMember,\n    $core.int? isSugStyleExp,\n  }) {\n    final result = create();\n    if (from != null) result.from = from;\n    if (title != null) result.title = title;\n    if (keyword != null) result.keyword = keyword;\n    if (position != null) result.position = position;\n    if (cover != null) result.cover = cover;\n    if (coverSize != null) result.coverSize = coverSize;\n    if (sugType != null) result.sugType = sugType;\n    if (termType != null) result.termType = termType;\n    if (goto != null) result.goto = goto;\n    if (uri != null) result.uri = uri;\n    if (officialVerify != null) result.officialVerify = officialVerify;\n    if (param != null) result.param = param;\n    if (mid != null) result.mid = mid;\n    if (fans != null) result.fans = fans;\n    if (level != null) result.level = level;\n    if (archives != null) result.archives = archives;\n    if (ptime != null) result.ptime = ptime;\n    if (seasonTypeName != null) result.seasonTypeName = seasonTypeName;\n    if (area != null) result.area = area;\n    if (style != null) result.style = style;\n    if (label != null) result.label = label;\n    if (rating != null) result.rating = rating;\n    if (vote != null) result.vote = vote;\n    if (badges != null) result.badges.addAll(badges);\n    if (styles != null) result.styles = styles;\n    if (moduleId != null) result.moduleId = moduleId;\n    if (liveLink != null) result.liveLink = liveLink;\n    if (faceNftNew != null) result.faceNftNew = faceNftNew;\n    if (nftFaceIcon != null) result.nftFaceIcon = nftFaceIcon;\n    if (isSeniorMember != null) result.isSeniorMember = isSeniorMember;\n    if (isSugStyleExp != null) result.isSugStyleExp = isSugStyleExp;\n    return result;\n  }\n\n  ResultItem._();\n\n  factory ResultItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ResultItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ResultItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'from')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'keyword')\n    ..aI(4, _omitFieldNames ? '' : 'position')\n    ..aOS(5, _omitFieldNames ? '' : 'cover')\n    ..aD(6, _omitFieldNames ? '' : 'coverSize')\n    ..aOS(7, _omitFieldNames ? '' : 'sugType')\n    ..aI(8, _omitFieldNames ? '' : 'termType')\n    ..aOS(9, _omitFieldNames ? '' : 'goto')\n    ..aOS(10, _omitFieldNames ? '' : 'uri')\n    ..aOM<OfficialVerify>(11, _omitFieldNames ? '' : 'officialVerify',\n        subBuilder: OfficialVerify.create)\n    ..aOS(12, _omitFieldNames ? '' : 'param')\n    ..aInt64(13, _omitFieldNames ? '' : 'mid')\n    ..aI(14, _omitFieldNames ? '' : 'fans')\n    ..aI(15, _omitFieldNames ? '' : 'level')\n    ..aI(16, _omitFieldNames ? '' : 'archives')\n    ..aInt64(17, _omitFieldNames ? '' : 'ptime')\n    ..aOS(18, _omitFieldNames ? '' : 'seasonTypeName')\n    ..aOS(19, _omitFieldNames ? '' : 'area')\n    ..aOS(20, _omitFieldNames ? '' : 'style')\n    ..aOS(21, _omitFieldNames ? '' : 'label')\n    ..aD(22, _omitFieldNames ? '' : 'rating')\n    ..aI(23, _omitFieldNames ? '' : 'vote')\n    ..pPM<ReasonStyle>(24, _omitFieldNames ? '' : 'badges',\n        subBuilder: ReasonStyle.create)\n    ..aOS(25, _omitFieldNames ? '' : 'styles')\n    ..aInt64(26, _omitFieldNames ? '' : 'moduleId')\n    ..aOS(27, _omitFieldNames ? '' : 'liveLink')\n    ..aI(28, _omitFieldNames ? '' : 'faceNftNew')\n    ..aOM<NftFaceIcon>(29, _omitFieldNames ? '' : 'nftFaceIcon',\n        subBuilder: NftFaceIcon.create)\n    ..aI(30, _omitFieldNames ? '' : 'isSeniorMember')\n    ..aI(31, _omitFieldNames ? '' : 'isSugStyleExp')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ResultItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ResultItem copyWith(void Function(ResultItem) updates) =>\n      super.copyWith((message) => updates(message as ResultItem)) as ResultItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ResultItem create() => ResultItem._();\n  @$core.override\n  ResultItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ResultItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ResultItem>(create);\n  static ResultItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get from => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set from($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFrom() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFrom() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get keyword => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set keyword($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasKeyword() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearKeyword() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get position => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set position($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPosition() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPosition() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get cover => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set cover($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCover() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCover() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.double get coverSize => $_getN(5);\n  @$pb.TagNumber(6)\n  set coverSize($core.double value) => $_setDouble(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCoverSize() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCoverSize() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get sugType => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set sugType($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasSugType() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearSugType() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get termType => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set termType($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasTermType() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearTermType() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get goto => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set goto($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasGoto() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearGoto() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get uri => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set uri($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasUri() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearUri() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  OfficialVerify get officialVerify => $_getN(10);\n  @$pb.TagNumber(11)\n  set officialVerify(OfficialVerify value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasOfficialVerify() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearOfficialVerify() => $_clearField(11);\n  @$pb.TagNumber(11)\n  OfficialVerify ensureOfficialVerify() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  $core.String get param => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set param($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasParam() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearParam() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $fixnum.Int64 get mid => $_getI64(12);\n  @$pb.TagNumber(13)\n  set mid($fixnum.Int64 value) => $_setInt64(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasMid() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearMid() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.int get fans => $_getIZ(13);\n  @$pb.TagNumber(14)\n  set fans($core.int value) => $_setSignedInt32(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasFans() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearFans() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $core.int get level => $_getIZ(14);\n  @$pb.TagNumber(15)\n  set level($core.int value) => $_setSignedInt32(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasLevel() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearLevel() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $core.int get archives => $_getIZ(15);\n  @$pb.TagNumber(16)\n  set archives($core.int value) => $_setSignedInt32(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasArchives() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearArchives() => $_clearField(16);\n\n  @$pb.TagNumber(17)\n  $fixnum.Int64 get ptime => $_getI64(16);\n  @$pb.TagNumber(17)\n  set ptime($fixnum.Int64 value) => $_setInt64(16, value);\n  @$pb.TagNumber(17)\n  $core.bool hasPtime() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearPtime() => $_clearField(17);\n\n  @$pb.TagNumber(18)\n  $core.String get seasonTypeName => $_getSZ(17);\n  @$pb.TagNumber(18)\n  set seasonTypeName($core.String value) => $_setString(17, value);\n  @$pb.TagNumber(18)\n  $core.bool hasSeasonTypeName() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearSeasonTypeName() => $_clearField(18);\n\n  @$pb.TagNumber(19)\n  $core.String get area => $_getSZ(18);\n  @$pb.TagNumber(19)\n  set area($core.String value) => $_setString(18, value);\n  @$pb.TagNumber(19)\n  $core.bool hasArea() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearArea() => $_clearField(19);\n\n  @$pb.TagNumber(20)\n  $core.String get style => $_getSZ(19);\n  @$pb.TagNumber(20)\n  set style($core.String value) => $_setString(19, value);\n  @$pb.TagNumber(20)\n  $core.bool hasStyle() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearStyle() => $_clearField(20);\n\n  @$pb.TagNumber(21)\n  $core.String get label => $_getSZ(20);\n  @$pb.TagNumber(21)\n  set label($core.String value) => $_setString(20, value);\n  @$pb.TagNumber(21)\n  $core.bool hasLabel() => $_has(20);\n  @$pb.TagNumber(21)\n  void clearLabel() => $_clearField(21);\n\n  @$pb.TagNumber(22)\n  $core.double get rating => $_getN(21);\n  @$pb.TagNumber(22)\n  set rating($core.double value) => $_setDouble(21, value);\n  @$pb.TagNumber(22)\n  $core.bool hasRating() => $_has(21);\n  @$pb.TagNumber(22)\n  void clearRating() => $_clearField(22);\n\n  @$pb.TagNumber(23)\n  $core.int get vote => $_getIZ(22);\n  @$pb.TagNumber(23)\n  set vote($core.int value) => $_setSignedInt32(22, value);\n  @$pb.TagNumber(23)\n  $core.bool hasVote() => $_has(22);\n  @$pb.TagNumber(23)\n  void clearVote() => $_clearField(23);\n\n  @$pb.TagNumber(24)\n  $pb.PbList<ReasonStyle> get badges => $_getList(23);\n\n  @$pb.TagNumber(25)\n  $core.String get styles => $_getSZ(24);\n  @$pb.TagNumber(25)\n  set styles($core.String value) => $_setString(24, value);\n  @$pb.TagNumber(25)\n  $core.bool hasStyles() => $_has(24);\n  @$pb.TagNumber(25)\n  void clearStyles() => $_clearField(25);\n\n  @$pb.TagNumber(26)\n  $fixnum.Int64 get moduleId => $_getI64(25);\n  @$pb.TagNumber(26)\n  set moduleId($fixnum.Int64 value) => $_setInt64(25, value);\n  @$pb.TagNumber(26)\n  $core.bool hasModuleId() => $_has(25);\n  @$pb.TagNumber(26)\n  void clearModuleId() => $_clearField(26);\n\n  @$pb.TagNumber(27)\n  $core.String get liveLink => $_getSZ(26);\n  @$pb.TagNumber(27)\n  set liveLink($core.String value) => $_setString(26, value);\n  @$pb.TagNumber(27)\n  $core.bool hasLiveLink() => $_has(26);\n  @$pb.TagNumber(27)\n  void clearLiveLink() => $_clearField(27);\n\n  @$pb.TagNumber(28)\n  $core.int get faceNftNew => $_getIZ(27);\n  @$pb.TagNumber(28)\n  set faceNftNew($core.int value) => $_setSignedInt32(27, value);\n  @$pb.TagNumber(28)\n  $core.bool hasFaceNftNew() => $_has(27);\n  @$pb.TagNumber(28)\n  void clearFaceNftNew() => $_clearField(28);\n\n  @$pb.TagNumber(29)\n  NftFaceIcon get nftFaceIcon => $_getN(28);\n  @$pb.TagNumber(29)\n  set nftFaceIcon(NftFaceIcon value) => $_setField(29, value);\n  @$pb.TagNumber(29)\n  $core.bool hasNftFaceIcon() => $_has(28);\n  @$pb.TagNumber(29)\n  void clearNftFaceIcon() => $_clearField(29);\n  @$pb.TagNumber(29)\n  NftFaceIcon ensureNftFaceIcon() => $_ensure(28);\n\n  @$pb.TagNumber(30)\n  $core.int get isSeniorMember => $_getIZ(29);\n  @$pb.TagNumber(30)\n  set isSeniorMember($core.int value) => $_setSignedInt32(29, value);\n  @$pb.TagNumber(30)\n  $core.bool hasIsSeniorMember() => $_has(29);\n  @$pb.TagNumber(30)\n  void clearIsSeniorMember() => $_clearField(30);\n\n  @$pb.TagNumber(31)\n  $core.int get isSugStyleExp => $_getIZ(30);\n  @$pb.TagNumber(31)\n  set isSugStyleExp($core.int value) => $_setSignedInt32(30, value);\n  @$pb.TagNumber(31)\n  $core.bool hasIsSugStyleExp() => $_has(30);\n  @$pb.TagNumber(31)\n  void clearIsSugStyleExp() => $_clearField(31);\n}\n\nclass Scores extends $pb.GeneratedMessage {\n  factory Scores({\n    $core.double? score,\n  }) {\n    final result = create();\n    if (score != null) result.score = score;\n    return result;\n  }\n\n  Scores._();\n\n  factory Scores.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Scores.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Scores',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aD(1, _omitFieldNames ? '' : 'score', fieldType: $pb.PbFieldType.OF)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Scores clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Scores copyWith(void Function(Scores) updates) =>\n      super.copyWith((message) => updates(message as Scores)) as Scores;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Scores create() => Scores._();\n  @$core.override\n  Scores createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Scores getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Scores>(create);\n  static Scores? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.double get score => $_getN(0);\n  @$pb.TagNumber(1)\n  set score($core.double value) => $_setFloat(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasScore() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearScore() => $_clearField(1);\n}\n\nclass SearchArchiveReply extends $pb.GeneratedMessage {\n  factory SearchArchiveReply({\n    $core.Iterable<Arc>? archives,\n    $fixnum.Int64? total,\n  }) {\n    final result = create();\n    if (archives != null) result.archives.addAll(archives);\n    if (total != null) result.total = total;\n    return result;\n  }\n\n  SearchArchiveReply._();\n\n  factory SearchArchiveReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SearchArchiveReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SearchArchiveReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..pPM<Arc>(1, _omitFieldNames ? '' : 'archives', subBuilder: Arc.create)\n    ..aInt64(2, _omitFieldNames ? '' : 'total')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchArchiveReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchArchiveReply copyWith(void Function(SearchArchiveReply) updates) =>\n      super.copyWith((message) => updates(message as SearchArchiveReply))\n          as SearchArchiveReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SearchArchiveReply create() => SearchArchiveReply._();\n  @$core.override\n  SearchArchiveReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SearchArchiveReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SearchArchiveReply>(create);\n  static SearchArchiveReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<Arc> get archives => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get total => $_getI64(1);\n  @$pb.TagNumber(2)\n  set total($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTotal() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTotal() => $_clearField(2);\n}\n\nclass SearchArchiveReq extends $pb.GeneratedMessage {\n  factory SearchArchiveReq({\n    $core.String? keyword,\n    $fixnum.Int64? mid,\n    $fixnum.Int64? pn,\n    $fixnum.Int64? ps,\n    $3.PlayerArgs? playerArgs,\n  }) {\n    final result = create();\n    if (keyword != null) result.keyword = keyword;\n    if (mid != null) result.mid = mid;\n    if (pn != null) result.pn = pn;\n    if (ps != null) result.ps = ps;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    return result;\n  }\n\n  SearchArchiveReq._();\n\n  factory SearchArchiveReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SearchArchiveReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SearchArchiveReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'keyword')\n    ..aInt64(2, _omitFieldNames ? '' : 'mid')\n    ..aInt64(3, _omitFieldNames ? '' : 'pn')\n    ..aInt64(4, _omitFieldNames ? '' : 'ps')\n    ..aOM<$3.PlayerArgs>(5, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $3.PlayerArgs.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchArchiveReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchArchiveReq copyWith(void Function(SearchArchiveReq) updates) =>\n      super.copyWith((message) => updates(message as SearchArchiveReq))\n          as SearchArchiveReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SearchArchiveReq create() => SearchArchiveReq._();\n  @$core.override\n  SearchArchiveReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SearchArchiveReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SearchArchiveReq>(create);\n  static SearchArchiveReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get keyword => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set keyword($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasKeyword() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearKeyword() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get mid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set mid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get pn => $_getI64(2);\n  @$pb.TagNumber(3)\n  set pn($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPn() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPn() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get ps => $_getI64(3);\n  @$pb.TagNumber(4)\n  set ps($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPs() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPs() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $3.PlayerArgs get playerArgs => $_getN(4);\n  @$pb.TagNumber(5)\n  set playerArgs($3.PlayerArgs value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPlayerArgs() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPlayerArgs() => $_clearField(5);\n  @$pb.TagNumber(5)\n  $3.PlayerArgs ensurePlayerArgs() => $_ensure(4);\n}\n\nclass SearchDynamicReply extends $pb.GeneratedMessage {\n  factory SearchDynamicReply({\n    $core.Iterable<Dynamic>? dynamics,\n    $fixnum.Int64? total,\n  }) {\n    final result = create();\n    if (dynamics != null) result.dynamics.addAll(dynamics);\n    if (total != null) result.total = total;\n    return result;\n  }\n\n  SearchDynamicReply._();\n\n  factory SearchDynamicReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SearchDynamicReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SearchDynamicReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..pPM<Dynamic>(1, _omitFieldNames ? '' : 'dynamics',\n        subBuilder: Dynamic.create)\n    ..aInt64(2, _omitFieldNames ? '' : 'total')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchDynamicReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchDynamicReply copyWith(void Function(SearchDynamicReply) updates) =>\n      super.copyWith((message) => updates(message as SearchDynamicReply))\n          as SearchDynamicReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SearchDynamicReply create() => SearchDynamicReply._();\n  @$core.override\n  SearchDynamicReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SearchDynamicReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SearchDynamicReply>(create);\n  static SearchDynamicReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<Dynamic> get dynamics => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get total => $_getI64(1);\n  @$pb.TagNumber(2)\n  set total($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTotal() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTotal() => $_clearField(2);\n}\n\nclass SearchDynamicReq extends $pb.GeneratedMessage {\n  factory SearchDynamicReq({\n    $core.String? keyword,\n    $fixnum.Int64? mid,\n    $fixnum.Int64? pn,\n    $fixnum.Int64? ps,\n    $3.PlayerArgs? playerArgs,\n  }) {\n    final result = create();\n    if (keyword != null) result.keyword = keyword;\n    if (mid != null) result.mid = mid;\n    if (pn != null) result.pn = pn;\n    if (ps != null) result.ps = ps;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    return result;\n  }\n\n  SearchDynamicReq._();\n\n  factory SearchDynamicReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SearchDynamicReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SearchDynamicReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'keyword')\n    ..aInt64(2, _omitFieldNames ? '' : 'mid')\n    ..aInt64(3, _omitFieldNames ? '' : 'pn')\n    ..aInt64(4, _omitFieldNames ? '' : 'ps')\n    ..aOM<$3.PlayerArgs>(5, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $3.PlayerArgs.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchDynamicReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchDynamicReq copyWith(void Function(SearchDynamicReq) updates) =>\n      super.copyWith((message) => updates(message as SearchDynamicReq))\n          as SearchDynamicReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SearchDynamicReq create() => SearchDynamicReq._();\n  @$core.override\n  SearchDynamicReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SearchDynamicReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SearchDynamicReq>(create);\n  static SearchDynamicReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get keyword => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set keyword($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasKeyword() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearKeyword() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get mid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set mid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get pn => $_getI64(2);\n  @$pb.TagNumber(3)\n  set pn($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPn() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPn() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get ps => $_getI64(3);\n  @$pb.TagNumber(4)\n  set ps($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPs() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPs() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $3.PlayerArgs get playerArgs => $_getN(4);\n  @$pb.TagNumber(5)\n  set playerArgs($3.PlayerArgs value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPlayerArgs() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPlayerArgs() => $_clearField(5);\n  @$pb.TagNumber(5)\n  $3.PlayerArgs ensurePlayerArgs() => $_ensure(4);\n}\n\nclass SearchReply extends $pb.GeneratedMessage {\n  factory SearchReply({\n    $core.Iterable<CursorItem>? items,\n    $core.bool? hasMore,\n    Page? page,\n  }) {\n    final result = create();\n    if (items != null) result.items.addAll(items);\n    if (hasMore != null) result.hasMore = hasMore;\n    if (page != null) result.page = page;\n    return result;\n  }\n\n  SearchReply._();\n\n  factory SearchReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SearchReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SearchReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..pPM<CursorItem>(1, _omitFieldNames ? '' : 'items',\n        subBuilder: CursorItem.create)\n    ..aOB(2, _omitFieldNames ? '' : 'hasMore')\n    ..aOM<Page>(3, _omitFieldNames ? '' : 'page', subBuilder: Page.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchReply copyWith(void Function(SearchReply) updates) =>\n      super.copyWith((message) => updates(message as SearchReply))\n          as SearchReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SearchReply create() => SearchReply._();\n  @$core.override\n  SearchReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SearchReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SearchReply>(create);\n  static SearchReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<CursorItem> get items => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.bool get hasMore => $_getBF(1);\n  @$pb.TagNumber(2)\n  set hasMore($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHasMore() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHasMore() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  Page get page => $_getN(2);\n  @$pb.TagNumber(3)\n  set page(Page value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPage() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPage() => $_clearField(3);\n  @$pb.TagNumber(3)\n  Page ensurePage() => $_ensure(2);\n}\n\nclass SearchReq extends $pb.GeneratedMessage {\n  factory SearchReq({\n    $core.String? keyword,\n    $fixnum.Int64? pn,\n    $core.String? business,\n  }) {\n    final result = create();\n    if (keyword != null) result.keyword = keyword;\n    if (pn != null) result.pn = pn;\n    if (business != null) result.business = business;\n    return result;\n  }\n\n  SearchReq._();\n\n  factory SearchReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SearchReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SearchReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'keyword')\n    ..aInt64(2, _omitFieldNames ? '' : 'pn')\n    ..aOS(3, _omitFieldNames ? '' : 'business')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchReq copyWith(void Function(SearchReq) updates) =>\n      super.copyWith((message) => updates(message as SearchReq)) as SearchReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SearchReq create() => SearchReq._();\n  @$core.override\n  SearchReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SearchReq getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<SearchReq>(create);\n  static SearchReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get keyword => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set keyword($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasKeyword() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearKeyword() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get pn => $_getI64(1);\n  @$pb.TagNumber(2)\n  set pn($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPn() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPn() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get business => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set business($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBusiness() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBusiness() => $_clearField(3);\n}\n\nclass SearchTabReply extends $pb.GeneratedMessage {\n  factory SearchTabReply({\n    $fixnum.Int64? focus,\n    $core.Iterable<Tab>? tabs,\n  }) {\n    final result = create();\n    if (focus != null) result.focus = focus;\n    if (tabs != null) result.tabs.addAll(tabs);\n    return result;\n  }\n\n  SearchTabReply._();\n\n  factory SearchTabReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SearchTabReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SearchTabReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'focus')\n    ..pPM<Tab>(2, _omitFieldNames ? '' : 'tabs', subBuilder: Tab.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchTabReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchTabReply copyWith(void Function(SearchTabReply) updates) =>\n      super.copyWith((message) => updates(message as SearchTabReply))\n          as SearchTabReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SearchTabReply create() => SearchTabReply._();\n  @$core.override\n  SearchTabReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SearchTabReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SearchTabReply>(create);\n  static SearchTabReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get focus => $_getI64(0);\n  @$pb.TagNumber(1)\n  set focus($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFocus() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFocus() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<Tab> get tabs => $_getList(1);\n}\n\nclass SearchTabReq extends $pb.GeneratedMessage {\n  factory SearchTabReq({\n    $core.String? keyword,\n    $fixnum.Int64? mid,\n    From? from,\n  }) {\n    final result = create();\n    if (keyword != null) result.keyword = keyword;\n    if (mid != null) result.mid = mid;\n    if (from != null) result.from = from;\n    return result;\n  }\n\n  SearchTabReq._();\n\n  factory SearchTabReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SearchTabReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SearchTabReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'keyword')\n    ..aInt64(2, _omitFieldNames ? '' : 'mid')\n    ..aE<From>(3, _omitFieldNames ? '' : 'from', enumValues: From.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchTabReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchTabReq copyWith(void Function(SearchTabReq) updates) =>\n      super.copyWith((message) => updates(message as SearchTabReq))\n          as SearchTabReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SearchTabReq create() => SearchTabReq._();\n  @$core.override\n  SearchTabReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SearchTabReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SearchTabReq>(create);\n  static SearchTabReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get keyword => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set keyword($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasKeyword() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearKeyword() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get mid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set mid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  From get from => $_getN(2);\n  @$pb.TagNumber(3)\n  set from(From value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFrom() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFrom() => $_clearField(3);\n}\n\nclass SetTeenagersModelAgeReply extends $pb.GeneratedMessage {\n  factory SetTeenagersModelAgeReply() => create();\n\n  SetTeenagersModelAgeReply._();\n\n  factory SetTeenagersModelAgeReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SetTeenagersModelAgeReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SetTeenagersModelAgeReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SetTeenagersModelAgeReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SetTeenagersModelAgeReply copyWith(\n          void Function(SetTeenagersModelAgeReply) updates) =>\n      super.copyWith((message) => updates(message as SetTeenagersModelAgeReply))\n          as SetTeenagersModelAgeReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SetTeenagersModelAgeReply create() => SetTeenagersModelAgeReply._();\n  @$core.override\n  SetTeenagersModelAgeReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SetTeenagersModelAgeReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SetTeenagersModelAgeReply>(create);\n  static SetTeenagersModelAgeReply? _defaultInstance;\n}\n\nclass SetTeenagersModelAgeReq extends $pb.GeneratedMessage {\n  factory SetTeenagersModelAgeReq({\n    $core.String? pwd,\n    PwdFrom? pwdFrom,\n    $core.String? deviceToken,\n    $core.int? age,\n    $core.bool? isDynamic,\n  }) {\n    final result = create();\n    if (pwd != null) result.pwd = pwd;\n    if (pwdFrom != null) result.pwdFrom = pwdFrom;\n    if (deviceToken != null) result.deviceToken = deviceToken;\n    if (age != null) result.age = age;\n    if (isDynamic != null) result.isDynamic = isDynamic;\n    return result;\n  }\n\n  SetTeenagersModelAgeReq._();\n\n  factory SetTeenagersModelAgeReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SetTeenagersModelAgeReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SetTeenagersModelAgeReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'pwd')\n    ..aE<PwdFrom>(2, _omitFieldNames ? '' : 'pwdFrom',\n        enumValues: PwdFrom.values)\n    ..aOS(3, _omitFieldNames ? '' : 'deviceToken')\n    ..aI(4, _omitFieldNames ? '' : 'age')\n    ..aOB(5, _omitFieldNames ? '' : 'isDynamic')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SetTeenagersModelAgeReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SetTeenagersModelAgeReq copyWith(\n          void Function(SetTeenagersModelAgeReq) updates) =>\n      super.copyWith((message) => updates(message as SetTeenagersModelAgeReq))\n          as SetTeenagersModelAgeReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SetTeenagersModelAgeReq create() => SetTeenagersModelAgeReq._();\n  @$core.override\n  SetTeenagersModelAgeReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SetTeenagersModelAgeReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SetTeenagersModelAgeReq>(create);\n  static SetTeenagersModelAgeReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get pwd => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set pwd($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPwd() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPwd() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  PwdFrom get pwdFrom => $_getN(1);\n  @$pb.TagNumber(2)\n  set pwdFrom(PwdFrom value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPwdFrom() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPwdFrom() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get deviceToken => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set deviceToken($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDeviceToken() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDeviceToken() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get age => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set age($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasAge() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearAge() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.bool get isDynamic => $_getBF(4);\n  @$pb.TagNumber(5)\n  set isDynamic($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasIsDynamic() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearIsDynamic() => $_clearField(5);\n}\n\nclass ShowTab extends $pb.GeneratedMessage {\n  factory ShowTab({\n    TabType? tabType,\n    $core.String? title,\n    $core.String? url,\n  }) {\n    final result = create();\n    if (tabType != null) result.tabType = tabType;\n    if (title != null) result.title = title;\n    if (url != null) result.url = url;\n    return result;\n  }\n\n  ShowTab._();\n\n  factory ShowTab.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ShowTab.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ShowTab',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aE<TabType>(1, _omitFieldNames ? '' : 'tabType',\n        enumValues: TabType.values)\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'url')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShowTab clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShowTab copyWith(void Function(ShowTab) updates) =>\n      super.copyWith((message) => updates(message as ShowTab)) as ShowTab;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ShowTab create() => ShowTab._();\n  @$core.override\n  ShowTab createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ShowTab getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ShowTab>(create);\n  static ShowTab? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  TabType get tabType => $_getN(0);\n  @$pb.TagNumber(1)\n  set tabType(TabType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTabType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTabType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get url => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set url($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUrl() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUrl() => $_clearField(3);\n}\n\nclass SmallItem extends $pb.GeneratedMessage {\n  factory SmallItem({\n    $core.String? title,\n    $core.String? coverImageUri,\n    $core.String? uri,\n    $core.String? coverRightText,\n    $core.String? coverLeftText1,\n    $fixnum.Int64? coverLeftIcon1,\n    $core.String? coverLeftText2,\n    $fixnum.Int64? coverLeftIcon2,\n    $fixnum.Int64? param,\n    $fixnum.Int64? mid,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (coverImageUri != null) result.coverImageUri = coverImageUri;\n    if (uri != null) result.uri = uri;\n    if (coverRightText != null) result.coverRightText = coverRightText;\n    if (coverLeftText1 != null) result.coverLeftText1 = coverLeftText1;\n    if (coverLeftIcon1 != null) result.coverLeftIcon1 = coverLeftIcon1;\n    if (coverLeftText2 != null) result.coverLeftText2 = coverLeftText2;\n    if (coverLeftIcon2 != null) result.coverLeftIcon2 = coverLeftIcon2;\n    if (param != null) result.param = param;\n    if (mid != null) result.mid = mid;\n    return result;\n  }\n\n  SmallItem._();\n\n  factory SmallItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SmallItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SmallItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'coverImageUri')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..aOS(4, _omitFieldNames ? '' : 'coverRightText')\n    ..aOS(5, _omitFieldNames ? '' : 'coverLeftText1')\n    ..aInt64(6, _omitFieldNames ? '' : 'coverLeftIcon1')\n    ..aOS(7, _omitFieldNames ? '' : 'coverLeftText2')\n    ..aInt64(8, _omitFieldNames ? '' : 'coverLeftIcon2')\n    ..aInt64(9, _omitFieldNames ? '' : 'param')\n    ..aInt64(10, _omitFieldNames ? '' : 'mid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SmallItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SmallItem copyWith(void Function(SmallItem) updates) =>\n      super.copyWith((message) => updates(message as SmallItem)) as SmallItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SmallItem create() => SmallItem._();\n  @$core.override\n  SmallItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SmallItem getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<SmallItem>(create);\n  static SmallItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get coverImageUri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set coverImageUri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCoverImageUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCoverImageUri() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get coverRightText => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set coverRightText($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCoverRightText() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCoverRightText() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get coverLeftText1 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set coverLeftText1($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCoverLeftText1() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCoverLeftText1() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get coverLeftIcon1 => $_getI64(5);\n  @$pb.TagNumber(6)\n  set coverLeftIcon1($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCoverLeftIcon1() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCoverLeftIcon1() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get coverLeftText2 => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set coverLeftText2($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCoverLeftText2() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCoverLeftText2() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get coverLeftIcon2 => $_getI64(7);\n  @$pb.TagNumber(8)\n  set coverLeftIcon2($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasCoverLeftIcon2() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearCoverLeftIcon2() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get param => $_getI64(8);\n  @$pb.TagNumber(9)\n  set param($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasParam() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearParam() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $fixnum.Int64 get mid => $_getI64(9);\n  @$pb.TagNumber(10)\n  set mid($fixnum.Int64 value) => $_setInt64(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasMid() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearMid() => $_clearField(10);\n}\n\nclass Staff extends $pb.GeneratedMessage {\n  factory Staff({\n    $core.String? title,\n    $core.String? text,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (text != null) result.text = text;\n    return result;\n  }\n\n  Staff._();\n\n  factory Staff.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Staff.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Staff',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'text')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Staff clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Staff copyWith(void Function(Staff) updates) =>\n      super.copyWith((message) => updates(message as Staff)) as Staff;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Staff create() => Staff._();\n  @$core.override\n  Staff createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Staff getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Staff>(create);\n  static Staff? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n}\n\nclass SuggestionResult3Reply extends $pb.GeneratedMessage {\n  factory SuggestionResult3Reply({\n    $core.String? trackid,\n    $core.Iterable<ResultItem>? list,\n    $core.String? expStr,\n  }) {\n    final result = create();\n    if (trackid != null) result.trackid = trackid;\n    if (list != null) result.list.addAll(list);\n    if (expStr != null) result.expStr = expStr;\n    return result;\n  }\n\n  SuggestionResult3Reply._();\n\n  factory SuggestionResult3Reply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SuggestionResult3Reply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SuggestionResult3Reply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'trackid')\n    ..pPM<ResultItem>(2, _omitFieldNames ? '' : 'list',\n        subBuilder: ResultItem.create)\n    ..aOS(3, _omitFieldNames ? '' : 'expStr')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SuggestionResult3Reply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SuggestionResult3Reply copyWith(\n          void Function(SuggestionResult3Reply) updates) =>\n      super.copyWith((message) => updates(message as SuggestionResult3Reply))\n          as SuggestionResult3Reply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SuggestionResult3Reply create() => SuggestionResult3Reply._();\n  @$core.override\n  SuggestionResult3Reply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SuggestionResult3Reply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SuggestionResult3Reply>(create);\n  static SuggestionResult3Reply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get trackid => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set trackid($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTrackid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTrackid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<ResultItem> get list => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $core.String get expStr => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set expStr($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasExpStr() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearExpStr() => $_clearField(3);\n}\n\nclass SuggestionResult3Req extends $pb.GeneratedMessage {\n  factory SuggestionResult3Req({\n    $core.String? keyword,\n    $core.int? highlight,\n    $core.int? teenagersMode,\n    $core.String? userAct,\n  }) {\n    final result = create();\n    if (keyword != null) result.keyword = keyword;\n    if (highlight != null) result.highlight = highlight;\n    if (teenagersMode != null) result.teenagersMode = teenagersMode;\n    if (userAct != null) result.userAct = userAct;\n    return result;\n  }\n\n  SuggestionResult3Req._();\n\n  factory SuggestionResult3Req.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SuggestionResult3Req.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SuggestionResult3Req',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'keyword')\n    ..aI(2, _omitFieldNames ? '' : 'highlight')\n    ..aI(3, _omitFieldNames ? '' : 'teenagersMode')\n    ..aOS(4, _omitFieldNames ? '' : 'userAct')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SuggestionResult3Req clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SuggestionResult3Req copyWith(void Function(SuggestionResult3Req) updates) =>\n      super.copyWith((message) => updates(message as SuggestionResult3Req))\n          as SuggestionResult3Req;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SuggestionResult3Req create() => SuggestionResult3Req._();\n  @$core.override\n  SuggestionResult3Req createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SuggestionResult3Req getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SuggestionResult3Req>(create);\n  static SuggestionResult3Req? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get keyword => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set keyword($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasKeyword() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearKeyword() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get highlight => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set highlight($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHighlight() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHighlight() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get teenagersMode => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set teenagersMode($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTeenagersMode() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTeenagersMode() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get userAct => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set userAct($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUserAct() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUserAct() => $_clearField(4);\n}\n\nclass Supernatant extends $pb.GeneratedMessage {\n  factory Supernatant({\n    $core.String? title,\n    $core.Iterable<CommentItem>? item,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (item != null) result.item.addAll(item);\n    return result;\n  }\n\n  Supernatant._();\n\n  factory Supernatant.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Supernatant.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Supernatant',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..pPM<CommentItem>(2, _omitFieldNames ? '' : 'item',\n        subBuilder: CommentItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Supernatant clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Supernatant copyWith(void Function(Supernatant) updates) =>\n      super.copyWith((message) => updates(message as Supernatant))\n          as Supernatant;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Supernatant create() => Supernatant._();\n  @$core.override\n  Supernatant createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Supernatant getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<Supernatant>(create);\n  static Supernatant? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<CommentItem> get item => $_getList(1);\n}\n\nclass Tab extends $pb.GeneratedMessage {\n  factory Tab({\n    $core.String? title,\n    $core.String? uri,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (uri != null) result.uri = uri;\n    return result;\n  }\n\n  Tab._();\n\n  factory Tab.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Tab.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Tab',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Tab clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Tab copyWith(void Function(Tab) updates) =>\n      super.copyWith((message) => updates(message as Tab)) as Tab;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Tab create() => Tab._();\n  @$core.override\n  Tab createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Tab getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Tab>(create);\n  static Tab? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n}\n\nclass UpdateReserveStartTimeReply extends $pb.GeneratedMessage {\n  factory UpdateReserveStartTimeReply({\n    $core.String? descText,\n  }) {\n    final result = create();\n    if (descText != null) result.descText = descText;\n    return result;\n  }\n\n  UpdateReserveStartTimeReply._();\n\n  factory UpdateReserveStartTimeReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UpdateReserveStartTimeReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UpdateReserveStartTimeReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'descText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpdateReserveStartTimeReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpdateReserveStartTimeReply copyWith(\n          void Function(UpdateReserveStartTimeReply) updates) =>\n      super.copyWith(\n              (message) => updates(message as UpdateReserveStartTimeReply))\n          as UpdateReserveStartTimeReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UpdateReserveStartTimeReply create() =>\n      UpdateReserveStartTimeReply._();\n  @$core.override\n  UpdateReserveStartTimeReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UpdateReserveStartTimeReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UpdateReserveStartTimeReply>(create);\n  static UpdateReserveStartTimeReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get descText => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set descText($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDescText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDescText() => $_clearField(1);\n}\n\nclass UpdateReserveStartTimeReq extends $pb.GeneratedMessage {\n  factory UpdateReserveStartTimeReq({\n    $fixnum.Int64? sid,\n    $fixnum.Int64? newLivePlanStartTime,\n  }) {\n    final result = create();\n    if (sid != null) result.sid = sid;\n    if (newLivePlanStartTime != null)\n      result.newLivePlanStartTime = newLivePlanStartTime;\n    return result;\n  }\n\n  UpdateReserveStartTimeReq._();\n\n  factory UpdateReserveStartTimeReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UpdateReserveStartTimeReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UpdateReserveStartTimeReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'sid')\n    ..aInt64(2, _omitFieldNames ? '' : 'newLivePlanStartTime')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpdateReserveStartTimeReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpdateReserveStartTimeReq copyWith(\n          void Function(UpdateReserveStartTimeReq) updates) =>\n      super.copyWith((message) => updates(message as UpdateReserveStartTimeReq))\n          as UpdateReserveStartTimeReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UpdateReserveStartTimeReq create() => UpdateReserveStartTimeReq._();\n  @$core.override\n  UpdateReserveStartTimeReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UpdateReserveStartTimeReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UpdateReserveStartTimeReq>(create);\n  static UpdateReserveStartTimeReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get sid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set sid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get newLivePlanStartTime => $_getI64(1);\n  @$pb.TagNumber(2)\n  set newLivePlanStartTime($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasNewLivePlanStartTime() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearNewLivePlanStartTime() => $_clearField(2);\n}\n\nclass UpdateStatusReply extends $pb.GeneratedMessage {\n  factory UpdateStatusReply() => create();\n\n  UpdateStatusReply._();\n\n  factory UpdateStatusReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UpdateStatusReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UpdateStatusReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpdateStatusReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpdateStatusReply copyWith(void Function(UpdateStatusReply) updates) =>\n      super.copyWith((message) => updates(message as UpdateStatusReply))\n          as UpdateStatusReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UpdateStatusReply create() => UpdateStatusReply._();\n  @$core.override\n  UpdateStatusReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UpdateStatusReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UpdateStatusReply>(create);\n  static UpdateStatusReply? _defaultInstance;\n}\n\nclass UpdateStatusReq extends $pb.GeneratedMessage {\n  factory UpdateStatusReq({\n    $core.String? pwd,\n    $core.bool? switch_2,\n    PwdFrom? pwdFrom,\n    $core.String? deviceToken,\n  }) {\n    final result = create();\n    if (pwd != null) result.pwd = pwd;\n    if (switch_2 != null) result.switch_2 = switch_2;\n    if (pwdFrom != null) result.pwdFrom = pwdFrom;\n    if (deviceToken != null) result.deviceToken = deviceToken;\n    return result;\n  }\n\n  UpdateStatusReq._();\n\n  factory UpdateStatusReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UpdateStatusReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UpdateStatusReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'pwd')\n    ..aOB(2, _omitFieldNames ? '' : 'switch')\n    ..aE<PwdFrom>(3, _omitFieldNames ? '' : 'pwdFrom',\n        enumValues: PwdFrom.values)\n    ..aOS(4, _omitFieldNames ? '' : 'deviceToken')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpdateStatusReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpdateStatusReq copyWith(void Function(UpdateStatusReq) updates) =>\n      super.copyWith((message) => updates(message as UpdateStatusReq))\n          as UpdateStatusReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UpdateStatusReq create() => UpdateStatusReq._();\n  @$core.override\n  UpdateStatusReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UpdateStatusReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UpdateStatusReq>(create);\n  static UpdateStatusReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get pwd => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set pwd($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPwd() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPwd() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get switch_2 => $_getBF(1);\n  @$pb.TagNumber(2)\n  set switch_2($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSwitch_2() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSwitch_2() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  PwdFrom get pwdFrom => $_getN(2);\n  @$pb.TagNumber(3)\n  set pwdFrom(PwdFrom value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPwdFrom() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPwdFrom() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get deviceToken => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set deviceToken($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDeviceToken() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDeviceToken() => $_clearField(4);\n}\n\nclass UserCard extends $pb.GeneratedMessage {\n  factory UserCard({\n    $core.String? userName,\n    $core.String? userFace,\n    $core.String? userUrl,\n    $fixnum.Int64? mid,\n  }) {\n    final result = create();\n    if (userName != null) result.userName = userName;\n    if (userFace != null) result.userFace = userFace;\n    if (userUrl != null) result.userUrl = userUrl;\n    if (mid != null) result.mid = mid;\n    return result;\n  }\n\n  UserCard._();\n\n  factory UserCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UserCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UserCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'userName')\n    ..aOS(2, _omitFieldNames ? '' : 'userFace')\n    ..aOS(3, _omitFieldNames ? '' : 'userUrl')\n    ..aInt64(4, _omitFieldNames ? '' : 'mid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserCard copyWith(void Function(UserCard) updates) =>\n      super.copyWith((message) => updates(message as UserCard)) as UserCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UserCard create() => UserCard._();\n  @$core.override\n  UserCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UserCard getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<UserCard>(create);\n  static UserCard? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get userName => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set userName($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUserName() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUserName() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get userFace => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set userFace($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUserFace() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUserFace() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get userUrl => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set userUrl($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUserUrl() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUserUrl() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get mid => $_getI64(3);\n  @$pb.TagNumber(4)\n  set mid($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasMid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearMid() => $_clearField(4);\n}\n\nclass UserModel extends $pb.GeneratedMessage {\n  factory UserModel({\n    $fixnum.Int64? mid,\n    $core.String? mode,\n    $core.String? wsxcde,\n    ModelStatus? status,\n    Policy? policy,\n    $core.bool? isForced,\n    $core.bool? mustTeen,\n    $core.bool? mustRealName,\n    $core.bool? isParentControl,\n    $core.int? age,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (mode != null) result.mode = mode;\n    if (wsxcde != null) result.wsxcde = wsxcde;\n    if (status != null) result.status = status;\n    if (policy != null) result.policy = policy;\n    if (isForced != null) result.isForced = isForced;\n    if (mustTeen != null) result.mustTeen = mustTeen;\n    if (mustRealName != null) result.mustRealName = mustRealName;\n    if (isParentControl != null) result.isParentControl = isParentControl;\n    if (age != null) result.age = age;\n    return result;\n  }\n\n  UserModel._();\n\n  factory UserModel.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UserModel.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UserModel',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aOS(2, _omitFieldNames ? '' : 'mode')\n    ..aOS(3, _omitFieldNames ? '' : 'wsxcde')\n    ..aE<ModelStatus>(4, _omitFieldNames ? '' : 'status',\n        enumValues: ModelStatus.values)\n    ..aOM<Policy>(5, _omitFieldNames ? '' : 'policy', subBuilder: Policy.create)\n    ..aOB(6, _omitFieldNames ? '' : 'isForced')\n    ..aOB(7, _omitFieldNames ? '' : 'mustTeen')\n    ..aOB(8, _omitFieldNames ? '' : 'mustRealName')\n    ..aOB(9, _omitFieldNames ? '' : 'isParentControl')\n    ..aI(10, _omitFieldNames ? '' : 'age')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserModel clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserModel copyWith(void Function(UserModel) updates) =>\n      super.copyWith((message) => updates(message as UserModel)) as UserModel;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UserModel create() => UserModel._();\n  @$core.override\n  UserModel createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UserModel getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<UserModel>(create);\n  static UserModel? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get mode => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set mode($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMode() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMode() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get wsxcde => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set wsxcde($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasWsxcde() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearWsxcde() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  ModelStatus get status => $_getN(3);\n  @$pb.TagNumber(4)\n  set status(ModelStatus value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasStatus() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearStatus() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  Policy get policy => $_getN(4);\n  @$pb.TagNumber(5)\n  set policy(Policy value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPolicy() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPolicy() => $_clearField(5);\n  @$pb.TagNumber(5)\n  Policy ensurePolicy() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.bool get isForced => $_getBF(5);\n  @$pb.TagNumber(6)\n  set isForced($core.bool value) => $_setBool(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasIsForced() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearIsForced() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.bool get mustTeen => $_getBF(6);\n  @$pb.TagNumber(7)\n  set mustTeen($core.bool value) => $_setBool(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasMustTeen() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearMustTeen() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.bool get mustRealName => $_getBF(7);\n  @$pb.TagNumber(8)\n  set mustRealName($core.bool value) => $_setBool(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasMustRealName() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearMustRealName() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.bool get isParentControl => $_getBF(8);\n  @$pb.TagNumber(9)\n  set isParentControl($core.bool value) => $_setBool(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasIsParentControl() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearIsParentControl() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.int get age => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set age($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasAge() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearAge() => $_clearField(10);\n}\n\nclass VerifyPwdReply extends $pb.GeneratedMessage {\n  factory VerifyPwdReply() => create();\n\n  VerifyPwdReply._();\n\n  factory VerifyPwdReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory VerifyPwdReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'VerifyPwdReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VerifyPwdReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VerifyPwdReply copyWith(void Function(VerifyPwdReply) updates) =>\n      super.copyWith((message) => updates(message as VerifyPwdReply))\n          as VerifyPwdReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static VerifyPwdReply create() => VerifyPwdReply._();\n  @$core.override\n  VerifyPwdReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static VerifyPwdReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<VerifyPwdReply>(create);\n  static VerifyPwdReply? _defaultInstance;\n}\n\nclass VerifyPwdReq extends $pb.GeneratedMessage {\n  factory VerifyPwdReq({\n    $core.String? pwd,\n    PwdFrom? pwdFrom,\n    $core.bool? isDynamic,\n    $core.bool? closeDevice,\n    $core.String? deviceToken,\n  }) {\n    final result = create();\n    if (pwd != null) result.pwd = pwd;\n    if (pwdFrom != null) result.pwdFrom = pwdFrom;\n    if (isDynamic != null) result.isDynamic = isDynamic;\n    if (closeDevice != null) result.closeDevice = closeDevice;\n    if (deviceToken != null) result.deviceToken = deviceToken;\n    return result;\n  }\n\n  VerifyPwdReq._();\n\n  factory VerifyPwdReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory VerifyPwdReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'VerifyPwdReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'pwd')\n    ..aE<PwdFrom>(2, _omitFieldNames ? '' : 'pwdFrom',\n        enumValues: PwdFrom.values)\n    ..aOB(3, _omitFieldNames ? '' : 'isDynamic')\n    ..aOB(4, _omitFieldNames ? '' : 'closeDevice')\n    ..aOS(5, _omitFieldNames ? '' : 'deviceToken')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VerifyPwdReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VerifyPwdReq copyWith(void Function(VerifyPwdReq) updates) =>\n      super.copyWith((message) => updates(message as VerifyPwdReq))\n          as VerifyPwdReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static VerifyPwdReq create() => VerifyPwdReq._();\n  @$core.override\n  VerifyPwdReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static VerifyPwdReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<VerifyPwdReq>(create);\n  static VerifyPwdReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get pwd => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set pwd($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPwd() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPwd() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  PwdFrom get pwdFrom => $_getN(1);\n  @$pb.TagNumber(2)\n  set pwdFrom(PwdFrom value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPwdFrom() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPwdFrom() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get isDynamic => $_getBF(2);\n  @$pb.TagNumber(3)\n  set isDynamic($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIsDynamic() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIsDynamic() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get closeDevice => $_getBF(3);\n  @$pb.TagNumber(4)\n  set closeDevice($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCloseDevice() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCloseDevice() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get deviceToken => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set deviceToken($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDeviceToken() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDeviceToken() => $_clearField(5);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/interfaces/v1.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/interfaces/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nclass ButType extends $pb.ProtobufEnum {\n  static const ButType BUT_INVALID =\n      ButType._(0, _omitEnumNames ? '' : 'BUT_INVALID');\n  static const ButType BUT_REDIRECT =\n      ButType._(1, _omitEnumNames ? '' : 'BUT_REDIRECT');\n  static const ButType BUT_LIKE =\n      ButType._(2, _omitEnumNames ? '' : 'BUT_LIKE');\n\n  static const $core.List<ButType> values = <ButType>[\n    BUT_INVALID,\n    BUT_REDIRECT,\n    BUT_LIKE,\n  ];\n\n  static final $core.List<ButType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static ButType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ButType._(super.value, super.name);\n}\n\nclass CommentType extends $pb.ProtobufEnum {\n  static const CommentType comment_type_none =\n      CommentType._(0, _omitEnumNames ? '' : 'comment_type_none');\n  static const CommentType comment_type_redirect =\n      CommentType._(1, _omitEnumNames ? '' : 'comment_type_redirect');\n  static const CommentType comment_type_judge =\n      CommentType._(2, _omitEnumNames ? '' : 'comment_type_judge');\n\n  static const $core.List<CommentType> values = <CommentType>[\n    comment_type_none,\n    comment_type_redirect,\n    comment_type_judge,\n  ];\n\n  static final $core.List<CommentType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static CommentType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const CommentType._(super.value, super.name);\n}\n\n/// 设备类型\nclass DT extends $pb.ProtobufEnum {\n  static const DT Unknown = DT._(0, _omitEnumNames ? '' : 'Unknown');\n  static const DT Phone = DT._(1, _omitEnumNames ? '' : 'Phone');\n  static const DT Pad = DT._(2, _omitEnumNames ? '' : 'Pad');\n  static const DT PC = DT._(3, _omitEnumNames ? '' : 'PC');\n  static const DT TV = DT._(4, _omitEnumNames ? '' : 'TV');\n  static const DT Car = DT._(5, _omitEnumNames ? '' : 'Car');\n  static const DT Iot = DT._(6, _omitEnumNames ? '' : 'Iot');\n  static const DT AndPad = DT._(7, _omitEnumNames ? '' : 'AndPad');\n\n  static const $core.List<DT> values = <DT>[\n    Unknown,\n    Phone,\n    Pad,\n    PC,\n    TV,\n    Car,\n    Iot,\n    AndPad,\n  ];\n\n  static final $core.List<DT?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 7);\n  static DT? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const DT._(super.value, super.name);\n}\n\nclass FacialRecognitionVerifyFrom extends $pb.ProtobufEnum {\n  static const FacialRecognitionVerifyFrom VerifyUnknownFrom =\n      FacialRecognitionVerifyFrom._(\n          0, _omitEnumNames ? '' : 'VerifyUnknownFrom');\n  static const FacialRecognitionVerifyFrom VerifyFromGuardian =\n      FacialRecognitionVerifyFrom._(\n          1, _omitEnumNames ? '' : 'VerifyFromGuardian');\n  static const FacialRecognitionVerifyFrom VerifyFromAppeal =\n      FacialRecognitionVerifyFrom._(\n          2, _omitEnumNames ? '' : 'VerifyFromAppeal');\n\n  static const $core.List<FacialRecognitionVerifyFrom> values =\n      <FacialRecognitionVerifyFrom>[\n    VerifyUnknownFrom,\n    VerifyFromGuardian,\n    VerifyFromAppeal,\n  ];\n\n  static final $core.List<FacialRecognitionVerifyFrom?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static FacialRecognitionVerifyFrom? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const FacialRecognitionVerifyFrom._(super.value, super.name);\n}\n\nclass From extends $pb.ProtobufEnum {\n  static const From ArchiveTab = From._(0, _omitEnumNames ? '' : 'ArchiveTab');\n  static const From DynamicTab = From._(1, _omitEnumNames ? '' : 'DynamicTab');\n\n  static const $core.List<From> values = <From>[\n    ArchiveTab,\n    DynamicTab,\n  ];\n\n  static final $core.List<From?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static From? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const From._(super.value, super.name);\n}\n\nclass HistorySource extends $pb.ProtobufEnum {\n  static const HistorySource history =\n      HistorySource._(0, _omitEnumNames ? '' : 'history');\n  static const HistorySource shopping =\n      HistorySource._(1, _omitEnumNames ? '' : 'shopping');\n\n  static const $core.List<HistorySource> values = <HistorySource>[\n    history,\n    shopping,\n  ];\n\n  static final $core.List<HistorySource?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static HistorySource? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const HistorySource._(super.value, super.name);\n}\n\nclass ModelStatus extends $pb.ProtobufEnum {\n  static const ModelStatus CloseStatus =\n      ModelStatus._(0, _omitEnumNames ? '' : 'CloseStatus');\n  static const ModelStatus OpenStatus =\n      ModelStatus._(1, _omitEnumNames ? '' : 'OpenStatus');\n  static const ModelStatus NotSetStatus =\n      ModelStatus._(2, _omitEnumNames ? '' : 'NotSetStatus');\n\n  static const $core.List<ModelStatus> values = <ModelStatus>[\n    CloseStatus,\n    OpenStatus,\n    NotSetStatus,\n  ];\n\n  static final $core.List<ModelStatus?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static ModelStatus? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ModelStatus._(super.value, super.name);\n}\n\nclass PwdFrom extends $pb.ProtobufEnum {\n  static const PwdFrom UnknownFrom =\n      PwdFrom._(0, _omitEnumNames ? '' : 'UnknownFrom');\n  static const PwdFrom TeenagersAntiAddictionFrom =\n      PwdFrom._(1, _omitEnumNames ? '' : 'TeenagersAntiAddictionFrom');\n  static const PwdFrom TeenagersCurfewFrom =\n      PwdFrom._(2, _omitEnumNames ? '' : 'TeenagersCurfewFrom');\n  static const PwdFrom TeenagersLoginFrom =\n      PwdFrom._(3, _omitEnumNames ? '' : 'TeenagersLoginFrom');\n  static const PwdFrom TeenagersLogOutFrom =\n      PwdFrom._(4, _omitEnumNames ? '' : 'TeenagersLogOutFrom');\n  static const PwdFrom FamilyAntiAddictionFrom =\n      PwdFrom._(5, _omitEnumNames ? '' : 'FamilyAntiAddictionFrom');\n  static const PwdFrom FamilyCurfewFrom =\n      PwdFrom._(6, _omitEnumNames ? '' : 'FamilyCurfewFrom');\n  static const PwdFrom FamilyLogOutFrom =\n      PwdFrom._(7, _omitEnumNames ? '' : 'FamilyLogOutFrom');\n  static const PwdFrom FamilyTimeLockFrom =\n      PwdFrom._(8, _omitEnumNames ? '' : 'FamilyTimeLockFrom');\n  static const PwdFrom TeenagersQuitPwdFrom =\n      PwdFrom._(9, _omitEnumNames ? '' : 'TeenagersQuitPwdFrom');\n  static const PwdFrom TeenagersModifyPwdFrom =\n      PwdFrom._(10, _omitEnumNames ? '' : 'TeenagersModifyPwdFrom');\n  static const PwdFrom FamilyQuitFrom =\n      PwdFrom._(11, _omitEnumNames ? '' : 'FamilyQuitFrom');\n  static const PwdFrom OSTeenagersLogin =\n      PwdFrom._(12, _omitEnumNames ? '' : 'OSTeenagersLogin');\n  static const PwdFrom OSTeenagersLogout =\n      PwdFrom._(13, _omitEnumNames ? '' : 'OSTeenagersLogout');\n  static const PwdFrom TeenagersSetAge =\n      PwdFrom._(14, _omitEnumNames ? '' : 'TeenagersSetAge');\n  static const PwdFrom OSTeenagersSetAge =\n      PwdFrom._(15, _omitEnumNames ? '' : 'OSTeenagersSetAge');\n\n  static const $core.List<PwdFrom> values = <PwdFrom>[\n    UnknownFrom,\n    TeenagersAntiAddictionFrom,\n    TeenagersCurfewFrom,\n    TeenagersLoginFrom,\n    TeenagersLogOutFrom,\n    FamilyAntiAddictionFrom,\n    FamilyCurfewFrom,\n    FamilyLogOutFrom,\n    FamilyTimeLockFrom,\n    TeenagersQuitPwdFrom,\n    TeenagersModifyPwdFrom,\n    FamilyQuitFrom,\n    OSTeenagersLogin,\n    OSTeenagersLogout,\n    TeenagersSetAge,\n    OSTeenagersSetAge,\n  ];\n\n  static final $core.List<PwdFrom?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 15);\n  static PwdFrom? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const PwdFrom._(super.value, super.name);\n}\n\nclass TabType extends $pb.ProtobufEnum {\n  static const TabType TAB_INVALID =\n      TabType._(0, _omitEnumNames ? '' : 'TAB_INVALID');\n  static const TabType TAB_OGV_DETAIL =\n      TabType._(6, _omitEnumNames ? '' : 'TAB_OGV_DETAIL');\n  static const TabType TAB_OGV_REPLY =\n      TabType._(7, _omitEnumNames ? '' : 'TAB_OGV_REPLY');\n  static const TabType TAB_FEED_BID =\n      TabType._(8, _omitEnumNames ? '' : 'TAB_FEED_BID');\n  static const TabType TAB_FEED_SMALL =\n      TabType._(9, _omitEnumNames ? '' : 'TAB_FEED_SMALL');\n\n  static const $core.List<TabType> values = <TabType>[\n    TAB_INVALID,\n    TAB_OGV_DETAIL,\n    TAB_OGV_REPLY,\n    TAB_FEED_BID,\n    TAB_FEED_SMALL,\n  ];\n\n  static final $core.Map<$core.int, TabType> _byValue =\n      $pb.ProtobufEnum.initByValue(values);\n  static TabType? valueOf($core.int value) => _byValue[value];\n\n  const TabType._(super.value, super.name);\n}\n\nconst $core.bool _omitEnumNames =\n    $core.bool.fromEnvironment('protobuf.omit_enum_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/interfaces/v1.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/interfaces/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use butTypeDescriptor instead')\nconst ButType$json = {\n  '1': 'ButType',\n  '2': [\n    {'1': 'BUT_INVALID', '2': 0},\n    {'1': 'BUT_REDIRECT', '2': 1},\n    {'1': 'BUT_LIKE', '2': 2},\n  ],\n};\n\n/// Descriptor for `ButType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List butTypeDescriptor = $convert.base64Decode(\n    'CgdCdXRUeXBlEg8KC0JVVF9JTlZBTElEEAASEAoMQlVUX1JFRElSRUNUEAESDAoIQlVUX0xJS0'\n    'UQAg==');\n\n@$core.Deprecated('Use commentTypeDescriptor instead')\nconst CommentType$json = {\n  '1': 'CommentType',\n  '2': [\n    {'1': 'comment_type_none', '2': 0},\n    {'1': 'comment_type_redirect', '2': 1},\n    {'1': 'comment_type_judge', '2': 2},\n  ],\n};\n\n/// Descriptor for `CommentType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List commentTypeDescriptor = $convert.base64Decode(\n    'CgtDb21tZW50VHlwZRIVChFjb21tZW50X3R5cGVfbm9uZRAAEhkKFWNvbW1lbnRfdHlwZV9yZW'\n    'RpcmVjdBABEhYKEmNvbW1lbnRfdHlwZV9qdWRnZRAC');\n\n@$core.Deprecated('Use dTDescriptor instead')\nconst DT$json = {\n  '1': 'DT',\n  '2': [\n    {'1': 'Unknown', '2': 0},\n    {'1': 'Phone', '2': 1},\n    {'1': 'Pad', '2': 2},\n    {'1': 'PC', '2': 3},\n    {'1': 'TV', '2': 4},\n    {'1': 'Car', '2': 5},\n    {'1': 'Iot', '2': 6},\n    {'1': 'AndPad', '2': 7},\n  ],\n};\n\n/// Descriptor for `DT`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List dTDescriptor = $convert.base64Decode(\n    'CgJEVBILCgdVbmtub3duEAASCQoFUGhvbmUQARIHCgNQYWQQAhIGCgJQQxADEgYKAlRWEAQSBw'\n    'oDQ2FyEAUSBwoDSW90EAYSCgoGQW5kUGFkEAc=');\n\n@$core.Deprecated('Use facialRecognitionVerifyFromDescriptor instead')\nconst FacialRecognitionVerifyFrom$json = {\n  '1': 'FacialRecognitionVerifyFrom',\n  '2': [\n    {'1': 'VerifyUnknownFrom', '2': 0},\n    {'1': 'VerifyFromGuardian', '2': 1},\n    {'1': 'VerifyFromAppeal', '2': 2},\n  ],\n};\n\n/// Descriptor for `FacialRecognitionVerifyFrom`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List facialRecognitionVerifyFromDescriptor =\n    $convert.base64Decode(\n        'ChtGYWNpYWxSZWNvZ25pdGlvblZlcmlmeUZyb20SFQoRVmVyaWZ5VW5rbm93bkZyb20QABIWCh'\n        'JWZXJpZnlGcm9tR3VhcmRpYW4QARIUChBWZXJpZnlGcm9tQXBwZWFsEAI=');\n\n@$core.Deprecated('Use fromDescriptor instead')\nconst From$json = {\n  '1': 'From',\n  '2': [\n    {'1': 'ArchiveTab', '2': 0},\n    {'1': 'DynamicTab', '2': 1},\n  ],\n};\n\n/// Descriptor for `From`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List fromDescriptor = $convert\n    .base64Decode('CgRGcm9tEg4KCkFyY2hpdmVUYWIQABIOCgpEeW5hbWljVGFiEAE=');\n\n@$core.Deprecated('Use historySourceDescriptor instead')\nconst HistorySource$json = {\n  '1': 'HistorySource',\n  '2': [\n    {'1': 'history', '2': 0},\n    {'1': 'shopping', '2': 1},\n  ],\n};\n\n/// Descriptor for `HistorySource`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List historySourceDescriptor = $convert\n    .base64Decode('Cg1IaXN0b3J5U291cmNlEgsKB2hpc3RvcnkQABIMCghzaG9wcGluZxAB');\n\n@$core.Deprecated('Use modelStatusDescriptor instead')\nconst ModelStatus$json = {\n  '1': 'ModelStatus',\n  '2': [\n    {'1': 'CloseStatus', '2': 0},\n    {'1': 'OpenStatus', '2': 1},\n    {'1': 'NotSetStatus', '2': 2},\n  ],\n};\n\n/// Descriptor for `ModelStatus`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List modelStatusDescriptor = $convert.base64Decode(\n    'CgtNb2RlbFN0YXR1cxIPCgtDbG9zZVN0YXR1cxAAEg4KCk9wZW5TdGF0dXMQARIQCgxOb3RTZX'\n    'RTdGF0dXMQAg==');\n\n@$core.Deprecated('Use pwdFromDescriptor instead')\nconst PwdFrom$json = {\n  '1': 'PwdFrom',\n  '2': [\n    {'1': 'UnknownFrom', '2': 0},\n    {'1': 'TeenagersAntiAddictionFrom', '2': 1},\n    {'1': 'TeenagersCurfewFrom', '2': 2},\n    {'1': 'TeenagersLoginFrom', '2': 3},\n    {'1': 'TeenagersLogOutFrom', '2': 4},\n    {'1': 'FamilyAntiAddictionFrom', '2': 5},\n    {'1': 'FamilyCurfewFrom', '2': 6},\n    {'1': 'FamilyLogOutFrom', '2': 7},\n    {'1': 'FamilyTimeLockFrom', '2': 8},\n    {'1': 'TeenagersQuitPwdFrom', '2': 9},\n    {'1': 'TeenagersModifyPwdFrom', '2': 10},\n    {'1': 'FamilyQuitFrom', '2': 11},\n    {'1': 'OSTeenagersLogin', '2': 12},\n    {'1': 'OSTeenagersLogout', '2': 13},\n    {'1': 'TeenagersSetAge', '2': 14},\n    {'1': 'OSTeenagersSetAge', '2': 15},\n  ],\n};\n\n/// Descriptor for `PwdFrom`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List pwdFromDescriptor = $convert.base64Decode(\n    'CgdQd2RGcm9tEg8KC1Vua25vd25Gcm9tEAASHgoaVGVlbmFnZXJzQW50aUFkZGljdGlvbkZyb2'\n    '0QARIXChNUZWVuYWdlcnNDdXJmZXdGcm9tEAISFgoSVGVlbmFnZXJzTG9naW5Gcm9tEAMSFwoT'\n    'VGVlbmFnZXJzTG9nT3V0RnJvbRAEEhsKF0ZhbWlseUFudGlBZGRpY3Rpb25Gcm9tEAUSFAoQRm'\n    'FtaWx5Q3VyZmV3RnJvbRAGEhQKEEZhbWlseUxvZ091dEZyb20QBxIWChJGYW1pbHlUaW1lTG9j'\n    'a0Zyb20QCBIYChRUZWVuYWdlcnNRdWl0UHdkRnJvbRAJEhoKFlRlZW5hZ2Vyc01vZGlmeVB3ZE'\n    'Zyb20QChISCg5GYW1pbHlRdWl0RnJvbRALEhQKEE9TVGVlbmFnZXJzTG9naW4QDBIVChFPU1Rl'\n    'ZW5hZ2Vyc0xvZ291dBANEhMKD1RlZW5hZ2Vyc1NldEFnZRAOEhUKEU9TVGVlbmFnZXJzU2V0QW'\n    'dlEA8=');\n\n@$core.Deprecated('Use tabTypeDescriptor instead')\nconst TabType$json = {\n  '1': 'TabType',\n  '2': [\n    {'1': 'TAB_INVALID', '2': 0},\n    {'1': 'TAB_OGV_DETAIL', '2': 6},\n    {'1': 'TAB_OGV_REPLY', '2': 7},\n    {'1': 'TAB_FEED_BID', '2': 8},\n    {'1': 'TAB_FEED_SMALL', '2': 9},\n  ],\n};\n\n/// Descriptor for `TabType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List tabTypeDescriptor = $convert.base64Decode(\n    'CgdUYWJUeXBlEg8KC1RBQl9JTlZBTElEEAASEgoOVEFCX09HVl9ERVRBSUwQBhIRCg1UQUJfT0'\n    'dWX1JFUExZEAcSEAoMVEFCX0ZFRURfQklEEAgSEgoOVEFCX0ZFRURfU01BTEwQCQ==');\n\n@$core.Deprecated('Use arcDescriptor instead')\nconst Arc$json = {\n  '1': 'Arc',\n  '2': [\n    {\n      '1': 'archive',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.v1.Arc',\n      '10': 'archive'\n    },\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'view_content', '3': 3, '4': 1, '5': 9, '10': 'viewContent'},\n    {'1': 'icon_type', '3': 4, '4': 1, '5': 3, '10': 'iconType'},\n    {'1': 'cover_icon', '3': 5, '4': 1, '5': 9, '10': 'coverIcon'},\n    {'1': 'is_fold', '3': 6, '4': 1, '5': 8, '10': 'isFold'},\n    {'1': 'is_pugv', '3': 7, '4': 1, '5': 8, '10': 'isPugv'},\n    {'1': 'publish_time_text', '3': 8, '4': 1, '5': 9, '10': 'publishTimeText'},\n    {'1': 'badges', '3': 9, '4': 3, '5': 9, '10': 'badges'},\n    {'1': 'is_oneself', '3': 10, '4': 1, '5': 8, '10': 'isOneself'},\n  ],\n};\n\n/// Descriptor for `Arc`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List arcDescriptor = $convert.base64Decode(\n    'CgNBcmMSNgoHYXJjaGl2ZRgBIAEoCzIcLmJpbGliaWxpLmFwcC5hcmNoaXZlLnYxLkFyY1IHYX'\n    'JjaGl2ZRIQCgN1cmkYAiABKAlSA3VyaRIhCgx2aWV3X2NvbnRlbnQYAyABKAlSC3ZpZXdDb250'\n    'ZW50EhsKCWljb25fdHlwZRgEIAEoA1IIaWNvblR5cGUSHQoKY292ZXJfaWNvbhgFIAEoCVIJY2'\n    '92ZXJJY29uEhcKB2lzX2ZvbGQYBiABKAhSBmlzRm9sZBIXCgdpc19wdWd2GAcgASgIUgZpc1B1'\n    'Z3YSKgoRcHVibGlzaF90aW1lX3RleHQYCCABKAlSD3B1Ymxpc2hUaW1lVGV4dBIWCgZiYWRnZX'\n    'MYCSADKAlSBmJhZGdlcxIdCgppc19vbmVzZWxmGAogASgIUglpc09uZXNlbGY=');\n\n@$core.Deprecated('Use badgeDescriptor instead')\nconst Badge$json = {\n  '1': 'Badge',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'icon', '3': 2, '4': 1, '5': 9, '10': 'icon'},\n  ],\n};\n\n/// Descriptor for `Badge`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List badgeDescriptor = $convert.base64Decode(\n    'CgVCYWRnZRISCgR0ZXh0GAEgASgJUgR0ZXh0EhIKBGljb24YAiABKAlSBGljb24=');\n\n@$core.Deprecated('Use bigItemDescriptor instead')\nconst BigItem$json = {\n  '1': 'BigItem',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover_image_uri', '3': 2, '4': 1, '5': 9, '10': 'coverImageUri'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'cover_right_text', '3': 4, '4': 1, '5': 9, '10': 'coverRightText'},\n    {'1': 'cover_left_text1', '3': 5, '4': 1, '5': 9, '10': 'coverLeftText1'},\n    {'1': 'cover_left_icon1', '3': 6, '4': 1, '5': 3, '10': 'coverLeftIcon1'},\n    {'1': 'cover_left_text2', '3': 7, '4': 1, '5': 9, '10': 'coverLeftText2'},\n    {'1': 'cover_left_icon2', '3': 8, '4': 1, '5': 3, '10': 'coverLeftIcon2'},\n    {\n      '1': 'user_card',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.UserCard',\n      '10': 'userCard'\n    },\n    {\n      '1': 'like_button',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.LikeButton',\n      '10': 'likeButton'\n    },\n    {'1': 'param', '3': 11, '4': 1, '5': 3, '10': 'param'},\n    {\n      '1': 'share_plane',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.SharePlane',\n      '10': 'sharePlane'\n    },\n    {\n      '1': 'three_point_meta',\n      '3': 13,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.PanelMeta',\n      '10': 'threePointMeta'\n    },\n    {\n      '1': 'inline_progress_bar',\n      '3': 14,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.card.v1.InlineProgressBar',\n      '10': 'inlineProgressBar'\n    },\n    {'1': 'can_play', '3': 15, '4': 1, '5': 5, '10': 'canPlay'},\n    {\n      '1': 'player_args',\n      '3': 16,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n    {'1': 'is_fav', '3': 17, '4': 1, '5': 8, '10': 'isFav'},\n  ],\n};\n\n/// Descriptor for `BigItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bigItemDescriptor = $convert.base64Decode(\n    'CgdCaWdJdGVtEhQKBXRpdGxlGAEgASgJUgV0aXRsZRImCg9jb3Zlcl9pbWFnZV91cmkYAiABKA'\n    'lSDWNvdmVySW1hZ2VVcmkSEAoDdXJpGAMgASgJUgN1cmkSKAoQY292ZXJfcmlnaHRfdGV4dBgE'\n    'IAEoCVIOY292ZXJSaWdodFRleHQSKAoQY292ZXJfbGVmdF90ZXh0MRgFIAEoCVIOY292ZXJMZW'\n    'Z0VGV4dDESKAoQY292ZXJfbGVmdF9pY29uMRgGIAEoA1IOY292ZXJMZWZ0SWNvbjESKAoQY292'\n    'ZXJfbGVmdF90ZXh0MhgHIAEoCVIOY292ZXJMZWZ0VGV4dDISKAoQY292ZXJfbGVmdF9pY29uMh'\n    'gIIAEoA1IOY292ZXJMZWZ0SWNvbjISQQoJdXNlcl9jYXJkGAkgASgLMiQuYmlsaWJpbGkuYXBw'\n    'LmludGVyZmFjZXMudjEuVXNlckNhcmRSCHVzZXJDYXJkEkcKC2xpa2VfYnV0dG9uGAogASgLMi'\n    'YuYmlsaWJpbGkuYXBwLmludGVyZmFjZXMudjEuTGlrZUJ1dHRvblIKbGlrZUJ1dHRvbhIUCgVw'\n    'YXJhbRgLIAEoA1IFcGFyYW0SQQoLc2hhcmVfcGxhbmUYDCABKAsyIC5iaWxpYmlsaS5hcHAuY2'\n    'FyZC52MS5TaGFyZVBsYW5lUgpzaGFyZVBsYW5lEkkKEHRocmVlX3BvaW50X21ldGEYDSABKAsy'\n    'Hy5iaWxpYmlsaS5hcHAuY2FyZC52MS5QYW5lbE1ldGFSDnRocmVlUG9pbnRNZXRhElcKE2lubG'\n    'luZV9wcm9ncmVzc19iYXIYDiABKAsyJy5iaWxpYmlsaS5hcHAuY2FyZC52MS5JbmxpbmVQcm9n'\n    'cmVzc0JhclIRaW5saW5lUHJvZ3Jlc3NCYXISGQoIY2FuX3BsYXkYDyABKAVSB2NhblBsYXkSTw'\n    'oLcGxheWVyX2FyZ3MYECABKAsyLi5iaWxpYmlsaS5hcHAuYXJjaGl2ZS5taWRkbGV3YXJlLnYx'\n    'LlBsYXllckFyZ3NSCnBsYXllckFyZ3MSFQoGaXNfZmF2GBEgASgIUgVpc0Zhdg==');\n\n@$core.Deprecated('Use buttonDescriptor instead')\nconst Button$json = {\n  '1': 'Button',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'link', '3': 2, '4': 1, '5': 9, '10': 'link'},\n    {'1': 'id', '3': 3, '4': 1, '5': 9, '10': 'id'},\n    {'1': 'icon', '3': 4, '4': 1, '5': 3, '10': 'icon'},\n    {\n      '1': 'but_type',\n      '3': 5,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.interfaces.v1.ButType',\n      '10': 'butType'\n    },\n    {'1': 'follow_state', '3': 6, '4': 1, '5': 5, '10': 'followState'},\n    {'1': 'has_title', '3': 7, '4': 1, '5': 9, '10': 'hasTitle'},\n  ],\n};\n\n/// Descriptor for `Button`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List buttonDescriptor = $convert.base64Decode(\n    'CgZCdXR0b24SFAoFdGl0bGUYASABKAlSBXRpdGxlEhIKBGxpbmsYAiABKAlSBGxpbmsSDgoCaW'\n    'QYAyABKAlSAmlkEhIKBGljb24YBCABKANSBGljb24SPgoIYnV0X3R5cGUYBSABKA4yIy5iaWxp'\n    'YmlsaS5hcHAuaW50ZXJmYWNlcy52MS5CdXRUeXBlUgdidXRUeXBlEiEKDGZvbGxvd19zdGF0ZR'\n    'gGIAEoBVILZm9sbG93U3RhdGUSGwoJaGFzX3RpdGxlGAcgASgJUghoYXNUaXRsZQ==');\n\n@$core.Deprecated('Use cardArticleDescriptor instead')\nconst CardArticle$json = {\n  '1': 'CardArticle',\n  '2': [\n    {'1': 'covers', '3': 1, '4': 3, '5': 9, '10': 'covers'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'mid', '3': 3, '4': 1, '5': 3, '10': 'mid'},\n    {\n      '1': 'display_attention',\n      '3': 4,\n      '4': 1,\n      '5': 8,\n      '10': 'displayAttention'\n    },\n    {'1': 'badge', '3': 5, '4': 1, '5': 9, '10': 'badge'},\n    {\n      '1': 'relation',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.Relation',\n      '10': 'relation'\n    },\n  ],\n};\n\n/// Descriptor for `CardArticle`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cardArticleDescriptor = $convert.base64Decode(\n    'CgtDYXJkQXJ0aWNsZRIWCgZjb3ZlcnMYASADKAlSBmNvdmVycxISCgRuYW1lGAIgASgJUgRuYW'\n    '1lEhAKA21pZBgDIAEoA1IDbWlkEisKEWRpc3BsYXlfYXR0ZW50aW9uGAQgASgIUhBkaXNwbGF5'\n    'QXR0ZW50aW9uEhQKBWJhZGdlGAUgASgJUgViYWRnZRJACghyZWxhdGlvbhgGIAEoCzIkLmJpbG'\n    'liaWxpLmFwcC5pbnRlcmZhY2VzLnYxLlJlbGF0aW9uUghyZWxhdGlvbg==');\n\n@$core.Deprecated('Use cardCheeseDescriptor instead')\nconst CardCheese$json = {\n  '1': 'CardCheese',\n  '2': [\n    {'1': 'cover', '3': 1, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'progress', '3': 2, '4': 1, '5': 3, '10': 'progress'},\n    {'1': 'duration', '3': 3, '4': 1, '5': 3, '10': 'duration'},\n    {'1': 'subtitle', '3': 4, '4': 1, '5': 9, '10': 'subtitle'},\n    {'1': 'state', '3': 5, '4': 1, '5': 3, '10': 'state'},\n  ],\n};\n\n/// Descriptor for `CardCheese`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cardCheeseDescriptor = $convert.base64Decode(\n    'CgpDYXJkQ2hlZXNlEhQKBWNvdmVyGAEgASgJUgVjb3ZlchIaCghwcm9ncmVzcxgCIAEoA1IIcH'\n    'JvZ3Jlc3MSGgoIZHVyYXRpb24YAyABKANSCGR1cmF0aW9uEhoKCHN1YnRpdGxlGAQgASgJUghz'\n    'dWJ0aXRsZRIUCgVzdGF0ZRgFIAEoA1IFc3RhdGU=');\n\n@$core.Deprecated('Use cardLiveDescriptor instead')\nconst CardLive$json = {\n  '1': 'CardLive',\n  '2': [\n    {'1': 'cover', '3': 1, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'mid', '3': 3, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'tag', '3': 4, '4': 1, '5': 9, '10': 'tag'},\n    {'1': 'status', '3': 5, '4': 1, '5': 5, '10': 'status'},\n    {\n      '1': 'display_attention',\n      '3': 6,\n      '4': 1,\n      '5': 8,\n      '10': 'displayAttention'\n    },\n    {\n      '1': 'relation',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.Relation',\n      '10': 'relation'\n    },\n  ],\n};\n\n/// Descriptor for `CardLive`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cardLiveDescriptor = $convert.base64Decode(\n    'CghDYXJkTGl2ZRIUCgVjb3ZlchgBIAEoCVIFY292ZXISEgoEbmFtZRgCIAEoCVIEbmFtZRIQCg'\n    'NtaWQYAyABKANSA21pZBIQCgN0YWcYBCABKAlSA3RhZxIWCgZzdGF0dXMYBSABKAVSBnN0YXR1'\n    'cxIrChFkaXNwbGF5X2F0dGVudGlvbhgGIAEoCFIQZGlzcGxheUF0dGVudGlvbhJACghyZWxhdG'\n    'lvbhgHIAEoCzIkLmJpbGliaWxpLmFwcC5pbnRlcmZhY2VzLnYxLlJlbGF0aW9uUghyZWxhdGlv'\n    'bg==');\n\n@$core.Deprecated('Use cardOGVDescriptor instead')\nconst CardOGV$json = {\n  '1': 'CardOGV',\n  '2': [\n    {'1': 'cover', '3': 1, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'progress', '3': 2, '4': 1, '5': 3, '10': 'progress'},\n    {'1': 'duration', '3': 3, '4': 1, '5': 3, '10': 'duration'},\n    {'1': 'subtitle', '3': 4, '4': 1, '5': 9, '10': 'subtitle'},\n    {'1': 'badge', '3': 5, '4': 1, '5': 9, '10': 'badge'},\n    {'1': 'state', '3': 6, '4': 1, '5': 3, '10': 'state'},\n  ],\n};\n\n/// Descriptor for `CardOGV`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cardOGVDescriptor = $convert.base64Decode(\n    'CgdDYXJkT0dWEhQKBWNvdmVyGAEgASgJUgVjb3ZlchIaCghwcm9ncmVzcxgCIAEoA1IIcHJvZ3'\n    'Jlc3MSGgoIZHVyYXRpb24YAyABKANSCGR1cmF0aW9uEhoKCHN1YnRpdGxlGAQgASgJUghzdWJ0'\n    'aXRsZRIUCgViYWRnZRgFIAEoCVIFYmFkZ2USFAoFc3RhdGUYBiABKANSBXN0YXRl');\n\n@$core.Deprecated('Use cardUGCDescriptor instead')\nconst CardUGC$json = {\n  '1': 'CardUGC',\n  '2': [\n    {'1': 'cover', '3': 1, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'progress', '3': 2, '4': 1, '5': 3, '10': 'progress'},\n    {'1': 'duration', '3': 3, '4': 1, '5': 3, '10': 'duration'},\n    {'1': 'name', '3': 4, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'mid', '3': 5, '4': 1, '5': 3, '10': 'mid'},\n    {\n      '1': 'display_attention',\n      '3': 6,\n      '4': 1,\n      '5': 8,\n      '10': 'displayAttention'\n    },\n    {'1': 'cid', '3': 7, '4': 1, '5': 3, '10': 'cid'},\n    {'1': 'page', '3': 8, '4': 1, '5': 5, '10': 'page'},\n    {'1': 'subtitle', '3': 9, '4': 1, '5': 9, '10': 'subtitle'},\n    {\n      '1': 'relation',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.Relation',\n      '10': 'relation'\n    },\n    {'1': 'bvid', '3': 11, '4': 1, '5': 9, '10': 'bvid'},\n    {'1': 'videos', '3': 12, '4': 1, '5': 3, '10': 'videos'},\n    {'1': 'short_link', '3': 13, '4': 1, '5': 9, '10': 'shortLink'},\n    {'1': 'share_subtitle', '3': 14, '4': 1, '5': 9, '10': 'shareSubtitle'},\n    {'1': 'view', '3': 15, '4': 1, '5': 3, '10': 'view'},\n    {'1': 'state', '3': 16, '4': 1, '5': 3, '10': 'state'},\n    {'1': 'badge', '3': 17, '4': 1, '5': 9, '10': 'badge'},\n    {\n      '1': 'badge_v2',\n      '3': 18,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.Badge',\n      '10': 'badgeV2'\n    },\n  ],\n};\n\n/// Descriptor for `CardUGC`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cardUGCDescriptor = $convert.base64Decode(\n    'CgdDYXJkVUdDEhQKBWNvdmVyGAEgASgJUgVjb3ZlchIaCghwcm9ncmVzcxgCIAEoA1IIcHJvZ3'\n    'Jlc3MSGgoIZHVyYXRpb24YAyABKANSCGR1cmF0aW9uEhIKBG5hbWUYBCABKAlSBG5hbWUSEAoD'\n    'bWlkGAUgASgDUgNtaWQSKwoRZGlzcGxheV9hdHRlbnRpb24YBiABKAhSEGRpc3BsYXlBdHRlbn'\n    'Rpb24SEAoDY2lkGAcgASgDUgNjaWQSEgoEcGFnZRgIIAEoBVIEcGFnZRIaCghzdWJ0aXRsZRgJ'\n    'IAEoCVIIc3VidGl0bGUSQAoIcmVsYXRpb24YCiABKAsyJC5iaWxpYmlsaS5hcHAuaW50ZXJmYW'\n    'Nlcy52MS5SZWxhdGlvblIIcmVsYXRpb24SEgoEYnZpZBgLIAEoCVIEYnZpZBIWCgZ2aWRlb3MY'\n    'DCABKANSBnZpZGVvcxIdCgpzaG9ydF9saW5rGA0gASgJUglzaG9ydExpbmsSJQoOc2hhcmVfc3'\n    'VidGl0bGUYDiABKAlSDXNoYXJlU3VidGl0bGUSEgoEdmlldxgPIAEoA1IEdmlldxIUCgVzdGF0'\n    'ZRgQIAEoA1IFc3RhdGUSFAoFYmFkZ2UYESABKAlSBWJhZGdlEjwKCGJhZGdlX3YyGBIgASgLMi'\n    'EuYmlsaWJpbGkuYXBwLmludGVyZmFjZXMudjEuQmFkZ2VSB2JhZGdlVjI=');\n\n@$core.Deprecated('Use castDescriptor instead')\nconst Cast$json = {\n  '1': 'Cast',\n  '2': [\n    {\n      '1': 'person',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.MediaPerson',\n      '10': 'person'\n    },\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n  ],\n};\n\n/// Descriptor for `Cast`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List castDescriptor = $convert.base64Decode(\n    'CgRDYXN0Ej8KBnBlcnNvbhgBIAMoCzInLmJpbGliaWxpLmFwcC5pbnRlcmZhY2VzLnYxLk1lZG'\n    'lhUGVyc29uUgZwZXJzb24SFAoFdGl0bGUYAiABKAlSBXRpdGxl');\n\n@$core.Deprecated('Use channelInfoDescriptor instead')\nconst ChannelInfo$json = {\n  '1': 'ChannelInfo',\n  '2': [\n    {'1': 'channel_id', '3': 1, '4': 1, '5': 3, '10': 'channelId'},\n    {'1': 'subscribed', '3': 2, '4': 1, '5': 8, '10': 'subscribed'},\n  ],\n};\n\n/// Descriptor for `ChannelInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List channelInfoDescriptor = $convert.base64Decode(\n    'CgtDaGFubmVsSW5mbxIdCgpjaGFubmVsX2lkGAEgASgDUgljaGFubmVsSWQSHgoKc3Vic2NyaW'\n    'JlZBgCIAEoCFIKc3Vic2NyaWJlZA==');\n\n@$core.Deprecated('Use clearReqDescriptor instead')\nconst ClearReq$json = {\n  '1': 'ClearReq',\n  '2': [\n    {'1': 'business', '3': 1, '4': 1, '5': 9, '10': 'business'},\n  ],\n};\n\n/// Descriptor for `ClearReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List clearReqDescriptor = $convert\n    .base64Decode('CghDbGVhclJlcRIaCghidXNpbmVzcxgBIAEoCVIIYnVzaW5lc3M=');\n\n@$core.Deprecated('Use commentItemDescriptor instead')\nconst CommentItem$json = {\n  '1': 'CommentItem',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'url', '3': 2, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'title', '3': 3, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'type',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.interfaces.v1.CommentType',\n      '10': 'type'\n    },\n    {'1': 'action_type', '3': 5, '4': 1, '5': 9, '10': 'actionType'},\n    {'1': 'id', '3': 6, '4': 1, '5': 9, '10': 'id'},\n  ],\n};\n\n/// Descriptor for `CommentItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List commentItemDescriptor = $convert.base64Decode(\n    'CgtDb21tZW50SXRlbRISCgRpY29uGAEgASgJUgRpY29uEhAKA3VybBgCIAEoCVIDdXJsEhQKBX'\n    'RpdGxlGAMgASgJUgV0aXRsZRI7CgR0eXBlGAQgASgOMicuYmlsaWJpbGkuYXBwLmludGVyZmFj'\n    'ZXMudjEuQ29tbWVudFR5cGVSBHR5cGUSHwoLYWN0aW9uX3R5cGUYBSABKAlSCmFjdGlvblR5cG'\n    'USDgoCaWQYBiABKAlSAmlk');\n\n@$core.Deprecated('Use cursorDescriptor instead')\nconst Cursor$json = {\n  '1': 'Cursor',\n  '2': [\n    {'1': 'max', '3': 1, '4': 1, '5': 3, '10': 'max'},\n    {'1': 'max_tp', '3': 2, '4': 1, '5': 5, '10': 'maxTp'},\n  ],\n};\n\n/// Descriptor for `Cursor`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cursorDescriptor = $convert.base64Decode(\n    'CgZDdXJzb3ISEAoDbWF4GAEgASgDUgNtYXgSFQoGbWF4X3RwGAIgASgFUgVtYXhUcA==');\n\n@$core.Deprecated('Use cursorItemDescriptor instead')\nconst CursorItem$json = {\n  '1': 'CursorItem',\n  '2': [\n    {\n      '1': 'card_ugc',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.CardUGC',\n      '9': 0,\n      '10': 'cardUgc'\n    },\n    {\n      '1': 'card_ogv',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.CardOGV',\n      '9': 0,\n      '10': 'cardOgv'\n    },\n    {\n      '1': 'card_article',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.CardArticle',\n      '9': 0,\n      '10': 'cardArticle'\n    },\n    {\n      '1': 'card_live',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.CardLive',\n      '9': 0,\n      '10': 'cardLive'\n    },\n    {\n      '1': 'card_cheese',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.CardCheese',\n      '9': 0,\n      '10': 'cardCheese'\n    },\n    {'1': 'title', '3': 6, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'uri', '3': 7, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'view_at', '3': 8, '4': 1, '5': 3, '10': 'viewAt'},\n    {'1': 'kid', '3': 9, '4': 1, '5': 3, '10': 'kid'},\n    {'1': 'oid', '3': 10, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'business', '3': 11, '4': 1, '5': 9, '10': 'business'},\n    {'1': 'tp', '3': 12, '4': 1, '5': 5, '10': 'tp'},\n    {\n      '1': 'dt',\n      '3': 13,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.DeviceType',\n      '10': 'dt'\n    },\n    {'1': 'has_share', '3': 14, '4': 1, '5': 8, '10': 'hasShare'},\n    {'1': 'report', '3': 15, '4': 1, '5': 9, '10': 'report'},\n  ],\n  '8': [\n    {'1': 'card_item'},\n  ],\n};\n\n/// Descriptor for `CursorItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cursorItemDescriptor = $convert.base64Decode(\n    'CgpDdXJzb3JJdGVtEkAKCGNhcmRfdWdjGAEgASgLMiMuYmlsaWJpbGkuYXBwLmludGVyZmFjZX'\n    'MudjEuQ2FyZFVHQ0gAUgdjYXJkVWdjEkAKCGNhcmRfb2d2GAIgASgLMiMuYmlsaWJpbGkuYXBw'\n    'LmludGVyZmFjZXMudjEuQ2FyZE9HVkgAUgdjYXJkT2d2EkwKDGNhcmRfYXJ0aWNsZRgDIAEoCz'\n    'InLmJpbGliaWxpLmFwcC5pbnRlcmZhY2VzLnYxLkNhcmRBcnRpY2xlSABSC2NhcmRBcnRpY2xl'\n    'EkMKCWNhcmRfbGl2ZRgEIAEoCzIkLmJpbGliaWxpLmFwcC5pbnRlcmZhY2VzLnYxLkNhcmRMaX'\n    'ZlSABSCGNhcmRMaXZlEkkKC2NhcmRfY2hlZXNlGAUgASgLMiYuYmlsaWJpbGkuYXBwLmludGVy'\n    'ZmFjZXMudjEuQ2FyZENoZWVzZUgAUgpjYXJkQ2hlZXNlEhQKBXRpdGxlGAYgASgJUgV0aXRsZR'\n    'IQCgN1cmkYByABKAlSA3VyaRIXCgd2aWV3X2F0GAggASgDUgZ2aWV3QXQSEAoDa2lkGAkgASgD'\n    'UgNraWQSEAoDb2lkGAogASgDUgNvaWQSGgoIYnVzaW5lc3MYCyABKAlSCGJ1c2luZXNzEg4KAn'\n    'RwGAwgASgFUgJ0cBI2CgJkdBgNIAEoCzImLmJpbGliaWxpLmFwcC5pbnRlcmZhY2VzLnYxLkRl'\n    'dmljZVR5cGVSAmR0EhsKCWhhc19zaGFyZRgOIAEoCFIIaGFzU2hhcmUSFgoGcmVwb3J0GA8gAS'\n    'gJUgZyZXBvcnRCCwoJY2FyZF9pdGVt');\n\n@$core.Deprecated('Use cursorReplyDescriptor instead')\nconst CursorReply$json = {\n  '1': 'CursorReply',\n  '2': [\n    {\n      '1': 'items',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.CursorItem',\n      '10': 'items'\n    },\n    {\n      '1': 'tab',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.CursorTab',\n      '10': 'tab'\n    },\n    {\n      '1': 'cursor',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.Cursor',\n      '10': 'cursor'\n    },\n    {'1': 'has_more', '3': 4, '4': 1, '5': 8, '10': 'hasMore'},\n  ],\n};\n\n/// Descriptor for `CursorReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cursorReplyDescriptor = $convert.base64Decode(\n    'CgtDdXJzb3JSZXBseRI8CgVpdGVtcxgBIAMoCzImLmJpbGliaWxpLmFwcC5pbnRlcmZhY2VzLn'\n    'YxLkN1cnNvckl0ZW1SBWl0ZW1zEjcKA3RhYhgCIAMoCzIlLmJpbGliaWxpLmFwcC5pbnRlcmZh'\n    'Y2VzLnYxLkN1cnNvclRhYlIDdGFiEjoKBmN1cnNvchgDIAEoCzIiLmJpbGliaWxpLmFwcC5pbn'\n    'RlcmZhY2VzLnYxLkN1cnNvclIGY3Vyc29yEhkKCGhhc19tb3JlGAQgASgIUgdoYXNNb3Jl');\n\n@$core.Deprecated('Use cursorReqDescriptor instead')\nconst CursorReq$json = {\n  '1': 'CursorReq',\n  '2': [\n    {\n      '1': 'cursor',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.Cursor',\n      '10': 'cursor'\n    },\n    {'1': 'business', '3': 2, '4': 1, '5': 9, '10': 'business'},\n    {\n      '1': 'player_preload',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.PlayerPreloadParams',\n      '10': 'playerPreload'\n    },\n    {\n      '1': 'player_args',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n  ],\n};\n\n/// Descriptor for `CursorReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cursorReqDescriptor = $convert.base64Decode(\n    'CglDdXJzb3JSZXESOgoGY3Vyc29yGAEgASgLMiIuYmlsaWJpbGkuYXBwLmludGVyZmFjZXMudj'\n    'EuQ3Vyc29yUgZjdXJzb3ISGgoIYnVzaW5lc3MYAiABKAlSCGJ1c2luZXNzElYKDnBsYXllcl9w'\n    'cmVsb2FkGAMgASgLMi8uYmlsaWJpbGkuYXBwLmludGVyZmFjZXMudjEuUGxheWVyUHJlbG9hZF'\n    'BhcmFtc1INcGxheWVyUHJlbG9hZBJPCgtwbGF5ZXJfYXJncxgEIAEoCzIuLmJpbGliaWxpLmFw'\n    'cC5hcmNoaXZlLm1pZGRsZXdhcmUudjEuUGxheWVyQXJnc1IKcGxheWVyQXJncw==');\n\n@$core.Deprecated('Use cursorTabDescriptor instead')\nconst CursorTab$json = {\n  '1': 'CursorTab',\n  '2': [\n    {'1': 'business', '3': 1, '4': 1, '5': 9, '10': 'business'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'router', '3': 3, '4': 1, '5': 9, '10': 'router'},\n    {'1': 'focus', '3': 4, '4': 1, '5': 8, '10': 'focus'},\n  ],\n};\n\n/// Descriptor for `CursorTab`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cursorTabDescriptor = $convert.base64Decode(\n    'CglDdXJzb3JUYWISGgoIYnVzaW5lc3MYASABKAlSCGJ1c2luZXNzEhIKBG5hbWUYAiABKAlSBG'\n    '5hbWUSFgoGcm91dGVyGAMgASgJUgZyb3V0ZXISFAoFZm9jdXMYBCABKAhSBWZvY3Vz');\n\n@$core.Deprecated('Use cursorV2ReplyDescriptor instead')\nconst CursorV2Reply$json = {\n  '1': 'CursorV2Reply',\n  '2': [\n    {\n      '1': 'items',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.CursorItem',\n      '10': 'items'\n    },\n    {\n      '1': 'cursor',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.Cursor',\n      '10': 'cursor'\n    },\n    {'1': 'has_more', '3': 3, '4': 1, '5': 8, '10': 'hasMore'},\n    {'1': 'empty_link', '3': 4, '4': 1, '5': 9, '10': 'emptyLink'},\n  ],\n};\n\n/// Descriptor for `CursorV2Reply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cursorV2ReplyDescriptor = $convert.base64Decode(\n    'Cg1DdXJzb3JWMlJlcGx5EjwKBWl0ZW1zGAEgAygLMiYuYmlsaWJpbGkuYXBwLmludGVyZmFjZX'\n    'MudjEuQ3Vyc29ySXRlbVIFaXRlbXMSOgoGY3Vyc29yGAIgASgLMiIuYmlsaWJpbGkuYXBwLmlu'\n    'dGVyZmFjZXMudjEuQ3Vyc29yUgZjdXJzb3ISGQoIaGFzX21vcmUYAyABKAhSB2hhc01vcmUSHQ'\n    'oKZW1wdHlfbGluaxgEIAEoCVIJZW1wdHlMaW5r');\n\n@$core.Deprecated('Use cursorV2ReqDescriptor instead')\nconst CursorV2Req$json = {\n  '1': 'CursorV2Req',\n  '2': [\n    {\n      '1': 'cursor',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.Cursor',\n      '10': 'cursor'\n    },\n    {'1': 'business', '3': 2, '4': 1, '5': 9, '10': 'business'},\n    {\n      '1': 'player_preload',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.PlayerPreloadParams',\n      '10': 'playerPreload'\n    },\n    {\n      '1': 'player_args',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n    {'1': 'is_local', '3': 5, '4': 1, '5': 8, '10': 'isLocal'},\n  ],\n};\n\n/// Descriptor for `CursorV2Req`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cursorV2ReqDescriptor = $convert.base64Decode(\n    'CgtDdXJzb3JWMlJlcRI6CgZjdXJzb3IYASABKAsyIi5iaWxpYmlsaS5hcHAuaW50ZXJmYWNlcy'\n    '52MS5DdXJzb3JSBmN1cnNvchIaCghidXNpbmVzcxgCIAEoCVIIYnVzaW5lc3MSVgoOcGxheWVy'\n    'X3ByZWxvYWQYAyABKAsyLy5iaWxpYmlsaS5hcHAuaW50ZXJmYWNlcy52MS5QbGF5ZXJQcmVsb2'\n    'FkUGFyYW1zUg1wbGF5ZXJQcmVsb2FkEk8KC3BsYXllcl9hcmdzGAQgASgLMi4uYmlsaWJpbGku'\n    'YXBwLmFyY2hpdmUubWlkZGxld2FyZS52MS5QbGF5ZXJBcmdzUgpwbGF5ZXJBcmdzEhkKCGlzX2'\n    'xvY2FsGAUgASgIUgdpc0xvY2Fs');\n\n@$core.Deprecated('Use defaultWordsReplyDescriptor instead')\nconst DefaultWordsReply$json = {\n  '1': 'DefaultWordsReply',\n  '2': [\n    {'1': 'trackid', '3': 1, '4': 1, '5': 9, '10': 'trackid'},\n    {'1': 'param', '3': 2, '4': 1, '5': 9, '10': 'param'},\n    {'1': 'show', '3': 3, '4': 1, '5': 9, '10': 'show'},\n    {'1': 'word', '3': 4, '4': 1, '5': 9, '10': 'word'},\n    {'1': 'show_front', '3': 5, '4': 1, '5': 3, '10': 'showFront'},\n    {'1': 'exp_str', '3': 6, '4': 1, '5': 9, '10': 'expStr'},\n    {'1': 'goto', '3': 7, '4': 1, '5': 9, '10': 'goto'},\n    {'1': 'value', '3': 8, '4': 1, '5': 9, '10': 'value'},\n    {'1': 'uri', '3': 9, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'enable_refresh', '3': 10, '4': 1, '5': 3, '10': 'enableRefresh'},\n    {\n      '1': 'refresh_interval_milli',\n      '3': 11,\n      '4': 1,\n      '5': 3,\n      '10': 'refreshIntervalMilli'\n    },\n    {'1': 'enable_animation', '3': 12, '4': 1, '5': 3, '10': 'enableAnimation'},\n    {\n      '1': 'animation_time_milli',\n      '3': 13,\n      '4': 1,\n      '5': 3,\n      '10': 'animationTimeMilli'\n    },\n  ],\n};\n\n/// Descriptor for `DefaultWordsReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List defaultWordsReplyDescriptor = $convert.base64Decode(\n    'ChFEZWZhdWx0V29yZHNSZXBseRIYCgd0cmFja2lkGAEgASgJUgd0cmFja2lkEhQKBXBhcmFtGA'\n    'IgASgJUgVwYXJhbRISCgRzaG93GAMgASgJUgRzaG93EhIKBHdvcmQYBCABKAlSBHdvcmQSHQoK'\n    'c2hvd19mcm9udBgFIAEoA1IJc2hvd0Zyb250EhcKB2V4cF9zdHIYBiABKAlSBmV4cFN0chISCg'\n    'Rnb3RvGAcgASgJUgRnb3RvEhQKBXZhbHVlGAggASgJUgV2YWx1ZRIQCgN1cmkYCSABKAlSA3Vy'\n    'aRIlCg5lbmFibGVfcmVmcmVzaBgKIAEoA1INZW5hYmxlUmVmcmVzaBI0ChZyZWZyZXNoX2ludG'\n    'VydmFsX21pbGxpGAsgASgDUhRyZWZyZXNoSW50ZXJ2YWxNaWxsaRIpChBlbmFibGVfYW5pbWF0'\n    'aW9uGAwgASgDUg9lbmFibGVBbmltYXRpb24SMAoUYW5pbWF0aW9uX3RpbWVfbWlsbGkYDSABKA'\n    'NSEmFuaW1hdGlvblRpbWVNaWxsaQ==');\n\n@$core.Deprecated('Use defaultWordsReqDescriptor instead')\nconst DefaultWordsReq$json = {\n  '1': 'DefaultWordsReq',\n  '2': [\n    {'1': 'from', '3': 1, '4': 1, '5': 3, '10': 'from'},\n    {'1': 'login_event', '3': 2, '4': 1, '5': 3, '10': 'loginEvent'},\n    {'1': 'teenagers_mode', '3': 3, '4': 1, '5': 5, '10': 'teenagersMode'},\n    {'1': 'lessons_mode', '3': 4, '4': 1, '5': 5, '10': 'lessonsMode'},\n    {'1': 'tab', '3': 5, '4': 1, '5': 9, '10': 'tab'},\n    {'1': 'event_id', '3': 6, '4': 1, '5': 9, '10': 'eventId'},\n    {'1': 'avid', '3': 7, '4': 1, '5': 9, '10': 'avid'},\n    {'1': 'query', '3': 8, '4': 1, '5': 9, '10': 'query'},\n    {'1': 'an', '3': 9, '4': 1, '5': 3, '10': 'an'},\n    {'1': 'is_fresh', '3': 10, '4': 1, '5': 3, '10': 'isFresh'},\n    {'1': 'splash_guide', '3': 11, '4': 1, '5': 9, '10': 'splashGuide'},\n    {'1': 'splash_id', '3': 12, '4': 1, '5': 3, '10': 'splashId'},\n    {'1': 'refresh_type', '3': 13, '4': 1, '5': 3, '10': 'refreshType'},\n    {'1': 'user_act', '3': 14, '4': 1, '5': 9, '10': 'userAct'},\n    {\n      '1': 'search_page_return',\n      '3': 15,\n      '4': 1,\n      '5': 5,\n      '10': 'searchPageReturn'\n    },\n  ],\n};\n\n/// Descriptor for `DefaultWordsReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List defaultWordsReqDescriptor = $convert.base64Decode(\n    'Cg9EZWZhdWx0V29yZHNSZXESEgoEZnJvbRgBIAEoA1IEZnJvbRIfCgtsb2dpbl9ldmVudBgCIA'\n    'EoA1IKbG9naW5FdmVudBIlCg50ZWVuYWdlcnNfbW9kZRgDIAEoBVINdGVlbmFnZXJzTW9kZRIh'\n    'CgxsZXNzb25zX21vZGUYBCABKAVSC2xlc3NvbnNNb2RlEhAKA3RhYhgFIAEoCVIDdGFiEhkKCG'\n    'V2ZW50X2lkGAYgASgJUgdldmVudElkEhIKBGF2aWQYByABKAlSBGF2aWQSFAoFcXVlcnkYCCAB'\n    'KAlSBXF1ZXJ5Eg4KAmFuGAkgASgDUgJhbhIZCghpc19mcmVzaBgKIAEoA1IHaXNGcmVzaBIhCg'\n    'xzcGxhc2hfZ3VpZGUYCyABKAlSC3NwbGFzaEd1aWRlEhsKCXNwbGFzaF9pZBgMIAEoA1IIc3Bs'\n    'YXNoSWQSIQoMcmVmcmVzaF90eXBlGA0gASgDUgtyZWZyZXNoVHlwZRIZCgh1c2VyX2FjdBgOIA'\n    'EoCVIHdXNlckFjdBIsChJzZWFyY2hfcGFnZV9yZXR1cm4YDyABKAVSEHNlYXJjaFBhZ2VSZXR1'\n    'cm4=');\n\n@$core.Deprecated('Use deleteReqDescriptor instead')\nconst DeleteReq$json = {\n  '1': 'DeleteReq',\n  '2': [\n    {\n      '1': 'his_info',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.HisInfo',\n      '10': 'hisInfo'\n    },\n    {'1': 'tab', '3': 2, '4': 1, '5': 9, '10': 'tab'},\n  ],\n};\n\n/// Descriptor for `DeleteReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List deleteReqDescriptor = $convert.base64Decode(\n    'CglEZWxldGVSZXESPgoIaGlzX2luZm8YASADKAsyIy5iaWxpYmlsaS5hcHAuaW50ZXJmYWNlcy'\n    '52MS5IaXNJbmZvUgdoaXNJbmZvEhAKA3RhYhgCIAEoCVIDdGFi');\n\n@$core.Deprecated('Use deviceTypeDescriptor instead')\nconst DeviceType$json = {\n  '1': 'DeviceType',\n  '2': [\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.interfaces.v1.DT',\n      '10': 'type'\n    },\n    {'1': 'icon', '3': 2, '4': 1, '5': 9, '10': 'icon'},\n  ],\n};\n\n/// Descriptor for `DeviceType`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List deviceTypeDescriptor = $convert.base64Decode(\n    'CgpEZXZpY2VUeXBlEjIKBHR5cGUYASABKA4yHi5iaWxpYmlsaS5hcHAuaW50ZXJmYWNlcy52MS'\n    '5EVFIEdHlwZRISCgRpY29uGAIgASgJUgRpY29u');\n\n@$core.Deprecated('Use dynamicDescriptor instead')\nconst Dynamic$json = {\n  '1': 'Dynamic',\n  '2': [\n    {\n      '1': 'dynamic',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.DynamicItem',\n      '10': 'dynamic'\n    },\n  ],\n};\n\n/// Descriptor for `Dynamic`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dynamicDescriptor = $convert.base64Decode(\n    'CgdEeW5hbWljEj4KB2R5bmFtaWMYASABKAsyJC5iaWxpYmlsaS5hcHAuZHluYW1pYy52Mi5EeW'\n    '5hbWljSXRlbVIHZHluYW1pYw==');\n\n@$core.Deprecated('Use facialRecognitionVerifyReplyDescriptor instead')\nconst FacialRecognitionVerifyReply$json = {\n  '1': 'FacialRecognitionVerifyReply',\n};\n\n/// Descriptor for `FacialRecognitionVerifyReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List facialRecognitionVerifyReplyDescriptor =\n    $convert.base64Decode('ChxGYWNpYWxSZWNvZ25pdGlvblZlcmlmeVJlcGx5');\n\n@$core.Deprecated('Use facialRecognitionVerifyReqDescriptor instead')\nconst FacialRecognitionVerifyReq$json = {\n  '1': 'FacialRecognitionVerifyReq',\n  '2': [\n    {\n      '1': 'from',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.interfaces.v1.FacialRecognitionVerifyFrom',\n      '10': 'from'\n    },\n    {'1': 'device_token', '3': 2, '4': 1, '5': 9, '10': 'deviceToken'},\n  ],\n};\n\n/// Descriptor for `FacialRecognitionVerifyReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List facialRecognitionVerifyReqDescriptor =\n    $convert.base64Decode(\n        'ChpGYWNpYWxSZWNvZ25pdGlvblZlcmlmeVJlcRJLCgRmcm9tGAEgASgOMjcuYmlsaWJpbGkuYX'\n        'BwLmludGVyZmFjZXMudjEuRmFjaWFsUmVjb2duaXRpb25WZXJpZnlGcm9tUgRmcm9tEiEKDGRl'\n        'dmljZV90b2tlbhgCIAEoCVILZGV2aWNlVG9rZW4=');\n\n@$core.Deprecated('Use hisInfoDescriptor instead')\nconst HisInfo$json = {\n  '1': 'HisInfo',\n  '2': [\n    {'1': 'business', '3': 1, '4': 1, '5': 9, '10': 'business'},\n    {'1': 'kid', '3': 2, '4': 1, '5': 3, '10': 'kid'},\n  ],\n};\n\n/// Descriptor for `HisInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List hisInfoDescriptor = $convert.base64Decode(\n    'CgdIaXNJbmZvEhoKCGJ1c2luZXNzGAEgASgJUghidXNpbmVzcxIQCgNraWQYAiABKANSA2tpZA'\n    '==');\n\n@$core.Deprecated('Use historyTabReplyDescriptor instead')\nconst HistoryTabReply$json = {\n  '1': 'HistoryTabReply',\n  '2': [\n    {\n      '1': 'tab',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.CursorTab',\n      '10': 'tab'\n    },\n  ],\n};\n\n/// Descriptor for `HistoryTabReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List historyTabReplyDescriptor = $convert.base64Decode(\n    'Cg9IaXN0b3J5VGFiUmVwbHkSNwoDdGFiGAEgAygLMiUuYmlsaWJpbGkuYXBwLmludGVyZmFjZX'\n    'MudjEuQ3Vyc29yVGFiUgN0YWI=');\n\n@$core.Deprecated('Use historyTabReqDescriptor instead')\nconst HistoryTabReq$json = {\n  '1': 'HistoryTabReq',\n  '2': [\n    {'1': 'business', '3': 1, '4': 1, '5': 9, '10': 'business'},\n    {\n      '1': 'source',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.interfaces.v1.HistorySource',\n      '10': 'source'\n    },\n    {'1': 'keyword', '3': 3, '4': 1, '5': 9, '10': 'keyword'},\n  ],\n};\n\n/// Descriptor for `HistoryTabReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List historyTabReqDescriptor = $convert.base64Decode(\n    'Cg1IaXN0b3J5VGFiUmVxEhoKCGJ1c2luZXNzGAEgASgJUghidXNpbmVzcxJBCgZzb3VyY2UYAi'\n    'ABKA4yKS5iaWxpYmlsaS5hcHAuaW50ZXJmYWNlcy52MS5IaXN0b3J5U291cmNlUgZzb3VyY2US'\n    'GAoHa2V5d29yZBgDIAEoCVIHa2V5d29yZA==');\n\n@$core.Deprecated('Use latestHistoryReplyDescriptor instead')\nconst LatestHistoryReply$json = {\n  '1': 'LatestHistoryReply',\n  '2': [\n    {\n      '1': 'items',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.CursorItem',\n      '10': 'items'\n    },\n    {'1': 'scene', '3': 2, '4': 1, '5': 9, '10': 'scene'},\n    {'1': 'rtime', '3': 3, '4': 1, '5': 3, '10': 'rtime'},\n    {'1': 'flag', '3': 4, '4': 1, '5': 9, '10': 'flag'},\n  ],\n};\n\n/// Descriptor for `LatestHistoryReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List latestHistoryReplyDescriptor = $convert.base64Decode(\n    'ChJMYXRlc3RIaXN0b3J5UmVwbHkSPAoFaXRlbXMYASABKAsyJi5iaWxpYmlsaS5hcHAuaW50ZX'\n    'JmYWNlcy52MS5DdXJzb3JJdGVtUgVpdGVtcxIUCgVzY2VuZRgCIAEoCVIFc2NlbmUSFAoFcnRp'\n    'bWUYAyABKANSBXJ0aW1lEhIKBGZsYWcYBCABKAlSBGZsYWc=');\n\n@$core.Deprecated('Use latestHistoryReqDescriptor instead')\nconst LatestHistoryReq$json = {\n  '1': 'LatestHistoryReq',\n  '2': [\n    {'1': 'business', '3': 1, '4': 1, '5': 9, '10': 'business'},\n    {\n      '1': 'player_preload',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.PlayerPreloadParams',\n      '10': 'playerPreload'\n    },\n  ],\n};\n\n/// Descriptor for `LatestHistoryReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List latestHistoryReqDescriptor = $convert.base64Decode(\n    'ChBMYXRlc3RIaXN0b3J5UmVxEhoKCGJ1c2luZXNzGAEgASgJUghidXNpbmVzcxJWCg5wbGF5ZX'\n    'JfcHJlbG9hZBgCIAEoCzIvLmJpbGliaWxpLmFwcC5pbnRlcmZhY2VzLnYxLlBsYXllclByZWxv'\n    'YWRQYXJhbXNSDXBsYXllclByZWxvYWQ=');\n\n@$core.Deprecated('Use likeButtonDescriptor instead')\nconst LikeButton$json = {\n  '1': 'LikeButton',\n  '2': [\n    {'1': 'aid', '3': 1, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'count', '3': 2, '4': 1, '5': 5, '10': 'count'},\n    {'1': 'show_count', '3': 3, '4': 1, '5': 8, '10': 'showCount'},\n    {'1': 'event', '3': 4, '4': 1, '5': 9, '10': 'event'},\n    {'1': 'selected', '3': 5, '4': 1, '5': 5, '10': 'selected'},\n    {'1': 'event_v2', '3': 6, '4': 1, '5': 9, '10': 'eventV2'},\n    {\n      '1': 'like_resource',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.LikeButtonResource',\n      '10': 'likeResource'\n    },\n    {\n      '1': 'dis_like_resource',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.LikeButtonResource',\n      '10': 'disLikeResource'\n    },\n    {\n      '1': 'like_night_resource',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.LikeButtonResource',\n      '10': 'likeNightResource'\n    },\n    {\n      '1': 'dis_like_night_resource',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.LikeButtonResource',\n      '10': 'disLikeNightResource'\n    },\n  ],\n};\n\n/// Descriptor for `LikeButton`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List likeButtonDescriptor = $convert.base64Decode(\n    'CgpMaWtlQnV0dG9uEhAKA2FpZBgBIAEoA1IDYWlkEhQKBWNvdW50GAIgASgFUgVjb3VudBIdCg'\n    'pzaG93X2NvdW50GAMgASgIUglzaG93Q291bnQSFAoFZXZlbnQYBCABKAlSBWV2ZW50EhoKCHNl'\n    'bGVjdGVkGAUgASgFUghzZWxlY3RlZBIZCghldmVudF92MhgGIAEoCVIHZXZlbnRWMhJTCg1saW'\n    'tlX3Jlc291cmNlGAcgASgLMi4uYmlsaWJpbGkuYXBwLmludGVyZmFjZXMudjEuTGlrZUJ1dHRv'\n    'blJlc291cmNlUgxsaWtlUmVzb3VyY2USWgoRZGlzX2xpa2VfcmVzb3VyY2UYCCABKAsyLi5iaW'\n    'xpYmlsaS5hcHAuaW50ZXJmYWNlcy52MS5MaWtlQnV0dG9uUmVzb3VyY2VSD2Rpc0xpa2VSZXNv'\n    'dXJjZRJeChNsaWtlX25pZ2h0X3Jlc291cmNlGAkgASgLMi4uYmlsaWJpbGkuYXBwLmludGVyZm'\n    'FjZXMudjEuTGlrZUJ1dHRvblJlc291cmNlUhFsaWtlTmlnaHRSZXNvdXJjZRJlChdkaXNfbGlr'\n    'ZV9uaWdodF9yZXNvdXJjZRgKIAEoCzIuLmJpbGliaWxpLmFwcC5pbnRlcmZhY2VzLnYxLkxpa2'\n    'VCdXR0b25SZXNvdXJjZVIUZGlzTGlrZU5pZ2h0UmVzb3VyY2U=');\n\n@$core.Deprecated('Use likeButtonResourceDescriptor instead')\nconst LikeButtonResource$json = {\n  '1': 'LikeButtonResource',\n  '2': [\n    {'1': 'url', '3': 1, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'hash', '3': 2, '4': 1, '5': 9, '10': 'hash'},\n  ],\n};\n\n/// Descriptor for `LikeButtonResource`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List likeButtonResourceDescriptor = $convert.base64Decode(\n    'ChJMaWtlQnV0dG9uUmVzb3VyY2USEAoDdXJsGAEgASgJUgN1cmwSEgoEaGFzaBgCIAEoCVIEaG'\n    'FzaA==');\n\n@$core.Deprecated('Use likeCardDescriptor instead')\nconst LikeCard$json = {\n  '1': 'LikeCard',\n  '2': [\n    {'1': 'like', '3': 1, '4': 1, '5': 3, '10': 'like'},\n    {'1': 'is_follow', '3': 2, '4': 1, '5': 8, '10': 'isFollow'},\n  ],\n};\n\n/// Descriptor for `LikeCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List likeCardDescriptor = $convert.base64Decode(\n    'CghMaWtlQ2FyZBISCgRsaWtlGAEgASgDUgRsaWtlEhsKCWlzX2ZvbGxvdxgCIAEoCFIIaXNGb2'\n    'xsb3c=');\n\n@$core.Deprecated('Use mediaCardDescriptor instead')\nconst MediaCard$json = {\n  '1': 'MediaCard',\n  '2': [\n    {'1': 'cover', '3': 1, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'cur_title', '3': 2, '4': 1, '5': 9, '10': 'curTitle'},\n    {'1': 'style', '3': 3, '4': 1, '5': 9, '10': 'style'},\n    {'1': 'label', '3': 4, '4': 1, '5': 9, '10': 'label'},\n    {\n      '1': 'but_first',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.Button',\n      '10': 'butFirst'\n    },\n    {\n      '1': 'but_second',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.Supernatant',\n      '10': 'butSecond'\n    },\n    {\n      '1': 'scores',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.Scores',\n      '10': 'scores'\n    },\n  ],\n};\n\n/// Descriptor for `MediaCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mediaCardDescriptor = $convert.base64Decode(\n    'CglNZWRpYUNhcmQSFAoFY292ZXIYASABKAlSBWNvdmVyEhsKCWN1cl90aXRsZRgCIAEoCVIIY3'\n    'VyVGl0bGUSFAoFc3R5bGUYAyABKAlSBXN0eWxlEhQKBWxhYmVsGAQgASgJUgVsYWJlbBI/Cgli'\n    'dXRfZmlyc3QYBSABKAsyIi5iaWxpYmlsaS5hcHAuaW50ZXJmYWNlcy52MS5CdXR0b25SCGJ1dE'\n    'ZpcnN0EkYKCmJ1dF9zZWNvbmQYBiABKAsyJy5iaWxpYmlsaS5hcHAuaW50ZXJmYWNlcy52MS5T'\n    'dXBlcm5hdGFudFIJYnV0U2Vjb25kEjoKBnNjb3JlcxgHIAEoCzIiLmJpbGliaWxpLmFwcC5pbn'\n    'RlcmZhY2VzLnYxLlNjb3Jlc1IGc2NvcmVz');\n\n@$core.Deprecated('Use mediaCommentReplyDescriptor instead')\nconst MediaCommentReply$json = {\n  '1': 'MediaCommentReply',\n  '2': [\n    {'1': 'err_msg', '3': 1, '4': 1, '5': 9, '10': 'errMsg'},\n  ],\n};\n\n/// Descriptor for `MediaCommentReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mediaCommentReplyDescriptor = $convert.base64Decode(\n    'ChFNZWRpYUNvbW1lbnRSZXBseRIXCgdlcnJfbXNnGAEgASgJUgZlcnJNc2c=');\n\n@$core.Deprecated('Use mediaCommentReqDescriptor instead')\nconst MediaCommentReq$json = {\n  '1': 'MediaCommentReq',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'},\n  ],\n};\n\n/// Descriptor for `MediaCommentReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mediaCommentReqDescriptor =\n    $convert.base64Decode('Cg9NZWRpYUNvbW1lbnRSZXESDgoCaWQYASABKAlSAmlk');\n\n@$core.Deprecated('Use mediaDetailReplyDescriptor instead')\nconst MediaDetailReply$json = {\n  '1': 'MediaDetailReply',\n  '2': [\n    {\n      '1': 'cast',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.Cast',\n      '10': 'cast'\n    },\n    {\n      '1': 'staff',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.Staff',\n      '10': 'staff'\n    },\n    {\n      '1': 'overview',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.Overview',\n      '10': 'overview'\n    },\n  ],\n};\n\n/// Descriptor for `MediaDetailReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mediaDetailReplyDescriptor = $convert.base64Decode(\n    'ChBNZWRpYURldGFpbFJlcGx5EjQKBGNhc3QYASABKAsyIC5iaWxpYmlsaS5hcHAuaW50ZXJmYW'\n    'Nlcy52MS5DYXN0UgRjYXN0EjcKBXN0YWZmGAIgASgLMiEuYmlsaWJpbGkuYXBwLmludGVyZmFj'\n    'ZXMudjEuU3RhZmZSBXN0YWZmEkAKCG92ZXJ2aWV3GAMgASgLMiQuYmlsaWJpbGkuYXBwLmludG'\n    'VyZmFjZXMudjEuT3ZlcnZpZXdSCG92ZXJ2aWV3');\n\n@$core.Deprecated('Use mediaDetailReqDescriptor instead')\nconst MediaDetailReq$json = {\n  '1': 'MediaDetailReq',\n  '2': [\n    {'1': 'biz_id', '3': 1, '4': 1, '5': 3, '10': 'bizId'},\n    {'1': 'biz_type', '3': 2, '4': 1, '5': 3, '10': 'bizType'},\n  ],\n};\n\n/// Descriptor for `MediaDetailReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mediaDetailReqDescriptor = $convert.base64Decode(\n    'Cg5NZWRpYURldGFpbFJlcRIVCgZiaXpfaWQYASABKANSBWJpeklkEhkKCGJpel90eXBlGAIgAS'\n    'gDUgdiaXpUeXBl');\n\n@$core.Deprecated('Use mediaFollowReplyDescriptor instead')\nconst MediaFollowReply$json = {\n  '1': 'MediaFollowReply',\n};\n\n/// Descriptor for `MediaFollowReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mediaFollowReplyDescriptor =\n    $convert.base64Decode('ChBNZWRpYUZvbGxvd1JlcGx5');\n\n@$core.Deprecated('Use mediaFollowReqDescriptor instead')\nconst MediaFollowReq$json = {\n  '1': 'MediaFollowReq',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'},\n    {\n      '1': 'type',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.interfaces.v1.ButType',\n      '10': 'type'\n    },\n  ],\n};\n\n/// Descriptor for `MediaFollowReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mediaFollowReqDescriptor = $convert.base64Decode(\n    'Cg5NZWRpYUZvbGxvd1JlcRIOCgJpZBgBIAEoCVICaWQSNwoEdHlwZRgCIAEoDjIjLmJpbGliaW'\n    'xpLmFwcC5pbnRlcmZhY2VzLnYxLkJ1dFR5cGVSBHR5cGU=');\n\n@$core.Deprecated('Use mediaPersonDescriptor instead')\nconst MediaPerson$json = {\n  '1': 'MediaPerson',\n  '2': [\n    {'1': 'real_name', '3': 1, '4': 1, '5': 9, '10': 'realName'},\n    {'1': 'square_url', '3': 2, '4': 1, '5': 9, '10': 'squareUrl'},\n    {'1': 'character', '3': 3, '4': 1, '5': 9, '10': 'character'},\n    {'1': 'person_id', '3': 4, '4': 1, '5': 3, '10': 'personId'},\n    {'1': 'type', '3': 5, '4': 1, '5': 9, '10': 'type'},\n  ],\n};\n\n/// Descriptor for `MediaPerson`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mediaPersonDescriptor = $convert.base64Decode(\n    'CgtNZWRpYVBlcnNvbhIbCglyZWFsX25hbWUYASABKAlSCHJlYWxOYW1lEh0KCnNxdWFyZV91cm'\n    'wYAiABKAlSCXNxdWFyZVVybBIcCgljaGFyYWN0ZXIYAyABKAlSCWNoYXJhY3RlchIbCglwZXJz'\n    'b25faWQYBCABKANSCHBlcnNvbklkEhIKBHR5cGUYBSABKAlSBHR5cGU=');\n\n@$core.Deprecated('Use mediaRelationReplyDescriptor instead')\nconst MediaRelationReply$json = {\n  '1': 'MediaRelationReply',\n  '2': [\n    {'1': 'offset', '3': 1, '4': 1, '5': 9, '10': 'offset'},\n    {'1': 'has_more', '3': 2, '4': 1, '5': 8, '10': 'hasMore'},\n    {\n      '1': 'list',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.SmallItem',\n      '10': 'list'\n    },\n  ],\n};\n\n/// Descriptor for `MediaRelationReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mediaRelationReplyDescriptor = $convert.base64Decode(\n    'ChJNZWRpYVJlbGF0aW9uUmVwbHkSFgoGb2Zmc2V0GAEgASgJUgZvZmZzZXQSGQoIaGFzX21vcm'\n    'UYAiABKAhSB2hhc01vcmUSOQoEbGlzdBgDIAMoCzIlLmJpbGliaWxpLmFwcC5pbnRlcmZhY2Vz'\n    'LnYxLlNtYWxsSXRlbVIEbGlzdA==');\n\n@$core.Deprecated('Use mediaRelationReqDescriptor instead')\nconst MediaRelationReq$json = {\n  '1': 'MediaRelationReq',\n  '2': [\n    {'1': 'biz_id', '3': 1, '4': 1, '5': 3, '10': 'bizId'},\n    {'1': 'biz_type', '3': 2, '4': 1, '5': 3, '10': 'bizType'},\n    {'1': 'feed_id', '3': 3, '4': 1, '5': 3, '10': 'feedId'},\n    {'1': 'offset', '3': 5, '4': 1, '5': 9, '10': 'offset'},\n    {'1': 'ps', '3': 6, '4': 1, '5': 5, '10': 'ps'},\n  ],\n};\n\n/// Descriptor for `MediaRelationReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mediaRelationReqDescriptor = $convert.base64Decode(\n    'ChBNZWRpYVJlbGF0aW9uUmVxEhUKBmJpel9pZBgBIAEoA1IFYml6SWQSGQoIYml6X3R5cGUYAi'\n    'ABKANSB2JpelR5cGUSFwoHZmVlZF9pZBgDIAEoA1IGZmVlZElkEhYKBm9mZnNldBgFIAEoCVIG'\n    'b2Zmc2V0Eg4KAnBzGAYgASgFUgJwcw==');\n\n@$core.Deprecated('Use mediaTabReplyDescriptor instead')\nconst MediaTabReply$json = {\n  '1': 'MediaTabReply',\n  '2': [\n    {\n      '1': 'media_card',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.MediaCard',\n      '10': 'mediaCard'\n    },\n    {\n      '1': 'tab',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.ShowTab',\n      '10': 'tab'\n    },\n    {'1': 'default_tab_index', '3': 3, '4': 1, '5': 3, '10': 'defaultTabIndex'},\n    {\n      '1': 'channel_info',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.ChannelInfo',\n      '10': 'channelInfo'\n    },\n  ],\n};\n\n/// Descriptor for `MediaTabReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mediaTabReplyDescriptor = $convert.base64Decode(\n    'Cg1NZWRpYVRhYlJlcGx5EkQKCm1lZGlhX2NhcmQYASABKAsyJS5iaWxpYmlsaS5hcHAuaW50ZX'\n    'JmYWNlcy52MS5NZWRpYUNhcmRSCW1lZGlhQ2FyZBI1CgN0YWIYAiADKAsyIy5iaWxpYmlsaS5h'\n    'cHAuaW50ZXJmYWNlcy52MS5TaG93VGFiUgN0YWISKgoRZGVmYXVsdF90YWJfaW5kZXgYAyABKA'\n    'NSD2RlZmF1bHRUYWJJbmRleBJKCgxjaGFubmVsX2luZm8YBCABKAsyJy5iaWxpYmlsaS5hcHAu'\n    'aW50ZXJmYWNlcy52MS5DaGFubmVsSW5mb1ILY2hhbm5lbEluZm8=');\n\n@$core.Deprecated('Use mediaTabReqDescriptor instead')\nconst MediaTabReq$json = {\n  '1': 'MediaTabReq',\n  '2': [\n    {'1': 'biz_id', '3': 1, '4': 1, '5': 3, '10': 'bizId'},\n    {'1': 'biz_type', '3': 2, '4': 1, '5': 3, '10': 'bizType'},\n    {'1': 'source', '3': 3, '4': 1, '5': 9, '10': 'source'},\n    {'1': 'spmid', '3': 4, '4': 1, '5': 9, '10': 'spmid'},\n    {\n      '1': 'args',\n      '3': 5,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.MediaTabReq.ArgsEntry',\n      '10': 'args'\n    },\n  ],\n  '3': [MediaTabReq_ArgsEntry$json],\n};\n\n@$core.Deprecated('Use mediaTabReqDescriptor instead')\nconst MediaTabReq_ArgsEntry$json = {\n  '1': 'ArgsEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `MediaTabReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mediaTabReqDescriptor = $convert.base64Decode(\n    'CgtNZWRpYVRhYlJlcRIVCgZiaXpfaWQYASABKANSBWJpeklkEhkKCGJpel90eXBlGAIgASgDUg'\n    'diaXpUeXBlEhYKBnNvdXJjZRgDIAEoCVIGc291cmNlEhQKBXNwbWlkGAQgASgJUgVzcG1pZBJF'\n    'CgRhcmdzGAUgAygLMjEuYmlsaWJpbGkuYXBwLmludGVyZmFjZXMudjEuTWVkaWFUYWJSZXEuQX'\n    'Jnc0VudHJ5UgRhcmdzGjcKCUFyZ3NFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgC'\n    'IAEoCVIFdmFsdWU6AjgB');\n\n@$core.Deprecated('Use mediaVideoReplyDescriptor instead')\nconst MediaVideoReply$json = {\n  '1': 'MediaVideoReply',\n  '2': [\n    {'1': 'offset', '3': 1, '4': 1, '5': 9, '10': 'offset'},\n    {'1': 'has_more', '3': 2, '4': 1, '5': 8, '10': 'hasMore'},\n    {\n      '1': 'list',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.BigItem',\n      '10': 'list'\n    },\n  ],\n};\n\n/// Descriptor for `MediaVideoReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mediaVideoReplyDescriptor = $convert.base64Decode(\n    'Cg9NZWRpYVZpZGVvUmVwbHkSFgoGb2Zmc2V0GAEgASgJUgZvZmZzZXQSGQoIaGFzX21vcmUYAi'\n    'ABKAhSB2hhc01vcmUSNwoEbGlzdBgDIAMoCzIjLmJpbGliaWxpLmFwcC5pbnRlcmZhY2VzLnYx'\n    'LkJpZ0l0ZW1SBGxpc3Q=');\n\n@$core.Deprecated('Use mediaVideoReqDescriptor instead')\nconst MediaVideoReq$json = {\n  '1': 'MediaVideoReq',\n  '2': [\n    {'1': 'biz_id', '3': 1, '4': 1, '5': 3, '10': 'bizId'},\n    {'1': 'biz_type', '3': 2, '4': 1, '5': 3, '10': 'bizType'},\n    {'1': 'feed_id', '3': 3, '4': 1, '5': 3, '10': 'feedId'},\n    {'1': 'offset', '3': 5, '4': 1, '5': 9, '10': 'offset'},\n    {'1': 'ps', '3': 6, '4': 1, '5': 5, '10': 'ps'},\n    {\n      '1': 'player_args',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n  ],\n};\n\n/// Descriptor for `MediaVideoReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mediaVideoReqDescriptor = $convert.base64Decode(\n    'Cg1NZWRpYVZpZGVvUmVxEhUKBmJpel9pZBgBIAEoA1IFYml6SWQSGQoIYml6X3R5cGUYAiABKA'\n    'NSB2JpelR5cGUSFwoHZmVlZF9pZBgDIAEoA1IGZmVlZElkEhYKBm9mZnNldBgFIAEoCVIGb2Zm'\n    'c2V0Eg4KAnBzGAYgASgFUgJwcxJPCgtwbGF5ZXJfYXJncxgHIAEoCzIuLmJpbGliaWxpLmFwcC'\n    '5hcmNoaXZlLm1pZGRsZXdhcmUudjEuUGxheWVyQXJnc1IKcGxheWVyQXJncw==');\n\n@$core.Deprecated('Use modeStatusReplyDescriptor instead')\nconst ModeStatusReply$json = {\n  '1': 'ModeStatusReply',\n  '2': [\n    {\n      '1': 'user_models',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.UserModel',\n      '10': 'userModels'\n    },\n  ],\n};\n\n/// Descriptor for `ModeStatusReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List modeStatusReplyDescriptor = $convert.base64Decode(\n    'Cg9Nb2RlU3RhdHVzUmVwbHkSRgoLdXNlcl9tb2RlbHMYASADKAsyJS5iaWxpYmlsaS5hcHAuaW'\n    '50ZXJmYWNlcy52MS5Vc2VyTW9kZWxSCnVzZXJNb2RlbHM=');\n\n@$core.Deprecated('Use modeStatusReqDescriptor instead')\nconst ModeStatusReq$json = {\n  '1': 'ModeStatusReq',\n  '2': [\n    {'1': 'device_token', '3': 1, '4': 1, '5': 9, '10': 'deviceToken'},\n  ],\n};\n\n/// Descriptor for `ModeStatusReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List modeStatusReqDescriptor = $convert.base64Decode(\n    'Cg1Nb2RlU3RhdHVzUmVxEiEKDGRldmljZV90b2tlbhgBIAEoCVILZGV2aWNlVG9rZW4=');\n\n@$core.Deprecated('Use modifyPwdReplyDescriptor instead')\nconst ModifyPwdReply$json = {\n  '1': 'ModifyPwdReply',\n};\n\n/// Descriptor for `ModifyPwdReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List modifyPwdReplyDescriptor =\n    $convert.base64Decode('Cg5Nb2RpZnlQd2RSZXBseQ==');\n\n@$core.Deprecated('Use modifyPwdReqDescriptor instead')\nconst ModifyPwdReq$json = {\n  '1': 'ModifyPwdReq',\n  '2': [\n    {'1': 'old_pwd', '3': 1, '4': 1, '5': 9, '10': 'oldPwd'},\n    {'1': 'new_pwd', '3': 2, '4': 1, '5': 9, '10': 'newPwd'},\n    {'1': 'device_token', '3': 3, '4': 1, '5': 9, '10': 'deviceToken'},\n  ],\n};\n\n/// Descriptor for `ModifyPwdReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List modifyPwdReqDescriptor = $convert.base64Decode(\n    'CgxNb2RpZnlQd2RSZXESFwoHb2xkX3B3ZBgBIAEoCVIGb2xkUHdkEhcKB25ld19wd2QYAiABKA'\n    'lSBm5ld1B3ZBIhCgxkZXZpY2VfdG9rZW4YAyABKAlSC2RldmljZVRva2Vu');\n\n@$core.Deprecated('Use nftFaceIconDescriptor instead')\nconst NftFaceIcon$json = {\n  '1': 'NftFaceIcon',\n  '2': [\n    {'1': 'region_type', '3': 1, '4': 1, '5': 5, '10': 'regionType'},\n    {'1': 'icon', '3': 2, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'show_status', '3': 3, '4': 1, '5': 5, '10': 'showStatus'},\n  ],\n};\n\n/// Descriptor for `NftFaceIcon`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List nftFaceIconDescriptor = $convert.base64Decode(\n    'CgtOZnRGYWNlSWNvbhIfCgtyZWdpb25fdHlwZRgBIAEoBVIKcmVnaW9uVHlwZRISCgRpY29uGA'\n    'IgASgJUgRpY29uEh8KC3Nob3dfc3RhdHVzGAMgASgFUgpzaG93U3RhdHVz');\n\n@$core.Deprecated('Use noReplyDescriptor instead')\nconst NoReply$json = {\n  '1': 'NoReply',\n};\n\n/// Descriptor for `NoReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List noReplyDescriptor =\n    $convert.base64Decode('CgdOb1JlcGx5');\n\n@$core.Deprecated('Use officialVerifyDescriptor instead')\nconst OfficialVerify$json = {\n  '1': 'OfficialVerify',\n  '2': [\n    {'1': 'type', '3': 1, '4': 1, '5': 5, '10': 'type'},\n    {'1': 'desc', '3': 2, '4': 1, '5': 9, '10': 'desc'},\n  ],\n};\n\n/// Descriptor for `OfficialVerify`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List officialVerifyDescriptor = $convert.base64Decode(\n    'Cg5PZmZpY2lhbFZlcmlmeRISCgR0eXBlGAEgASgFUgR0eXBlEhIKBGRlc2MYAiABKAlSBGRlc2'\n    'M=');\n\n@$core.Deprecated('Use overviewDescriptor instead')\nconst Overview$json = {\n  '1': 'Overview',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},\n  ],\n};\n\n/// Descriptor for `Overview`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List overviewDescriptor = $convert.base64Decode(\n    'CghPdmVydmlldxIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSEgoEdGV4dBgCIAEoCVIEdGV4dA==');\n\n@$core.Deprecated('Use pageDescriptor instead')\nconst Page$json = {\n  '1': 'Page',\n  '2': [\n    {'1': 'pn', '3': 1, '4': 1, '5': 3, '10': 'pn'},\n    {'1': 'total', '3': 2, '4': 1, '5': 3, '10': 'total'},\n  ],\n};\n\n/// Descriptor for `Page`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pageDescriptor = $convert.base64Decode(\n    'CgRQYWdlEg4KAnBuGAEgASgDUgJwbhIUCgV0b3RhbBgCIAEoA1IFdG90YWw=');\n\n@$core.Deprecated('Use playerPreloadParamsDescriptor instead')\nconst PlayerPreloadParams$json = {\n  '1': 'PlayerPreloadParams',\n  '2': [\n    {'1': 'qn', '3': 1, '4': 1, '5': 3, '10': 'qn'},\n    {'1': 'fnver', '3': 2, '4': 1, '5': 3, '10': 'fnver'},\n    {'1': 'fnval', '3': 3, '4': 1, '5': 3, '10': 'fnval'},\n    {'1': 'force_host', '3': 4, '4': 1, '5': 3, '10': 'forceHost'},\n    {'1': 'fourk', '3': 5, '4': 1, '5': 3, '10': 'fourk'},\n  ],\n};\n\n/// Descriptor for `PlayerPreloadParams`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playerPreloadParamsDescriptor = $convert.base64Decode(\n    'ChNQbGF5ZXJQcmVsb2FkUGFyYW1zEg4KAnFuGAEgASgDUgJxbhIUCgVmbnZlchgCIAEoA1IFZm'\n    '52ZXISFAoFZm52YWwYAyABKANSBWZudmFsEh0KCmZvcmNlX2hvc3QYBCABKANSCWZvcmNlSG9z'\n    'dBIUCgVmb3VyaxgFIAEoA1IFZm91cms=');\n\n@$core.Deprecated('Use policyDescriptor instead')\nconst Policy$json = {\n  '1': 'Policy',\n  '2': [\n    {'1': 'interval', '3': 1, '4': 1, '5': 3, '10': 'interval'},\n    {'1': 'use_local_time', '3': 2, '4': 1, '5': 8, '10': 'useLocalTime'},\n  ],\n};\n\n/// Descriptor for `Policy`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List policyDescriptor = $convert.base64Decode(\n    'CgZQb2xpY3kSGgoIaW50ZXJ2YWwYASABKANSCGludGVydmFsEiQKDnVzZV9sb2NhbF90aW1lGA'\n    'IgASgIUgx1c2VMb2NhbFRpbWU=');\n\n@$core.Deprecated('Use reasonStyleDescriptor instead')\nconst ReasonStyle$json = {\n  '1': 'ReasonStyle',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'text_color', '3': 2, '4': 1, '5': 9, '10': 'textColor'},\n    {'1': 'text_color_night', '3': 3, '4': 1, '5': 9, '10': 'textColorNight'},\n    {'1': 'bg_color', '3': 4, '4': 1, '5': 9, '10': 'bgColor'},\n    {'1': 'bg_color_night', '3': 5, '4': 1, '5': 9, '10': 'bgColorNight'},\n    {'1': 'border_color', '3': 6, '4': 1, '5': 9, '10': 'borderColor'},\n    {\n      '1': 'border_color_night',\n      '3': 7,\n      '4': 1,\n      '5': 9,\n      '10': 'borderColorNight'\n    },\n    {'1': 'bg_style', '3': 8, '4': 1, '5': 5, '10': 'bgStyle'},\n  ],\n};\n\n/// Descriptor for `ReasonStyle`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reasonStyleDescriptor = $convert.base64Decode(\n    'CgtSZWFzb25TdHlsZRISCgR0ZXh0GAEgASgJUgR0ZXh0Eh0KCnRleHRfY29sb3IYAiABKAlSCX'\n    'RleHRDb2xvchIoChB0ZXh0X2NvbG9yX25pZ2h0GAMgASgJUg50ZXh0Q29sb3JOaWdodBIZCghi'\n    'Z19jb2xvchgEIAEoCVIHYmdDb2xvchIkCg5iZ19jb2xvcl9uaWdodBgFIAEoCVIMYmdDb2xvck'\n    '5pZ2h0EiEKDGJvcmRlcl9jb2xvchgGIAEoCVILYm9yZGVyQ29sb3ISLAoSYm9yZGVyX2NvbG9y'\n    'X25pZ2h0GAcgASgJUhBib3JkZXJDb2xvck5pZ2h0EhkKCGJnX3N0eWxlGAggASgFUgdiZ1N0eW'\n    'xl');\n\n@$core.Deprecated('Use relationDescriptor instead')\nconst Relation$json = {\n  '1': 'Relation',\n  '2': [\n    {'1': 'status', '3': 1, '4': 1, '5': 5, '10': 'status'},\n    {'1': 'is_follow', '3': 2, '4': 1, '5': 5, '10': 'isFollow'},\n    {'1': 'is_followed', '3': 3, '4': 1, '5': 5, '10': 'isFollowed'},\n  ],\n};\n\n/// Descriptor for `Relation`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List relationDescriptor = $convert.base64Decode(\n    'CghSZWxhdGlvbhIWCgZzdGF0dXMYASABKAVSBnN0YXR1cxIbCglpc19mb2xsb3cYAiABKAVSCG'\n    'lzRm9sbG93Eh8KC2lzX2ZvbGxvd2VkGAMgASgFUgppc0ZvbGxvd2Vk');\n\n@$core.Deprecated('Use resultItemDescriptor instead')\nconst ResultItem$json = {\n  '1': 'ResultItem',\n  '2': [\n    {'1': 'from', '3': 1, '4': 1, '5': 9, '10': 'from'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'keyword', '3': 3, '4': 1, '5': 9, '10': 'keyword'},\n    {'1': 'position', '3': 4, '4': 1, '5': 5, '10': 'position'},\n    {'1': 'cover', '3': 5, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'cover_size', '3': 6, '4': 1, '5': 1, '10': 'coverSize'},\n    {'1': 'sug_type', '3': 7, '4': 1, '5': 9, '10': 'sugType'},\n    {'1': 'term_type', '3': 8, '4': 1, '5': 5, '10': 'termType'},\n    {'1': 'goto', '3': 9, '4': 1, '5': 9, '10': 'goto'},\n    {'1': 'uri', '3': 10, '4': 1, '5': 9, '10': 'uri'},\n    {\n      '1': 'official_verify',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.OfficialVerify',\n      '10': 'officialVerify'\n    },\n    {'1': 'param', '3': 12, '4': 1, '5': 9, '10': 'param'},\n    {'1': 'mid', '3': 13, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'fans', '3': 14, '4': 1, '5': 5, '10': 'fans'},\n    {'1': 'level', '3': 15, '4': 1, '5': 5, '10': 'level'},\n    {'1': 'archives', '3': 16, '4': 1, '5': 5, '10': 'archives'},\n    {'1': 'ptime', '3': 17, '4': 1, '5': 3, '10': 'ptime'},\n    {'1': 'season_type_name', '3': 18, '4': 1, '5': 9, '10': 'seasonTypeName'},\n    {'1': 'area', '3': 19, '4': 1, '5': 9, '10': 'area'},\n    {'1': 'style', '3': 20, '4': 1, '5': 9, '10': 'style'},\n    {'1': 'label', '3': 21, '4': 1, '5': 9, '10': 'label'},\n    {'1': 'rating', '3': 22, '4': 1, '5': 1, '10': 'rating'},\n    {'1': 'vote', '3': 23, '4': 1, '5': 5, '10': 'vote'},\n    {\n      '1': 'badges',\n      '3': 24,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.ReasonStyle',\n      '10': 'badges'\n    },\n    {'1': 'styles', '3': 25, '4': 1, '5': 9, '10': 'styles'},\n    {'1': 'module_id', '3': 26, '4': 1, '5': 3, '10': 'moduleId'},\n    {'1': 'live_link', '3': 27, '4': 1, '5': 9, '10': 'liveLink'},\n    {'1': 'face_nft_new', '3': 28, '4': 1, '5': 5, '10': 'faceNftNew'},\n    {\n      '1': 'nft_face_icon',\n      '3': 29,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.NftFaceIcon',\n      '10': 'nftFaceIcon'\n    },\n    {'1': 'is_senior_member', '3': 30, '4': 1, '5': 5, '10': 'isSeniorMember'},\n    {'1': 'is_sug_style_exp', '3': 31, '4': 1, '5': 5, '10': 'isSugStyleExp'},\n  ],\n};\n\n/// Descriptor for `ResultItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List resultItemDescriptor = $convert.base64Decode(\n    'CgpSZXN1bHRJdGVtEhIKBGZyb20YASABKAlSBGZyb20SFAoFdGl0bGUYAiABKAlSBXRpdGxlEh'\n    'gKB2tleXdvcmQYAyABKAlSB2tleXdvcmQSGgoIcG9zaXRpb24YBCABKAVSCHBvc2l0aW9uEhQK'\n    'BWNvdmVyGAUgASgJUgVjb3ZlchIdCgpjb3Zlcl9zaXplGAYgASgBUgljb3ZlclNpemUSGQoIc3'\n    'VnX3R5cGUYByABKAlSB3N1Z1R5cGUSGwoJdGVybV90eXBlGAggASgFUgh0ZXJtVHlwZRISCgRn'\n    'b3RvGAkgASgJUgRnb3RvEhAKA3VyaRgKIAEoCVIDdXJpElMKD29mZmljaWFsX3ZlcmlmeRgLIA'\n    'EoCzIqLmJpbGliaWxpLmFwcC5pbnRlcmZhY2VzLnYxLk9mZmljaWFsVmVyaWZ5Ug5vZmZpY2lh'\n    'bFZlcmlmeRIUCgVwYXJhbRgMIAEoCVIFcGFyYW0SEAoDbWlkGA0gASgDUgNtaWQSEgoEZmFucx'\n    'gOIAEoBVIEZmFucxIUCgVsZXZlbBgPIAEoBVIFbGV2ZWwSGgoIYXJjaGl2ZXMYECABKAVSCGFy'\n    'Y2hpdmVzEhQKBXB0aW1lGBEgASgDUgVwdGltZRIoChBzZWFzb25fdHlwZV9uYW1lGBIgASgJUg'\n    '5zZWFzb25UeXBlTmFtZRISCgRhcmVhGBMgASgJUgRhcmVhEhQKBXN0eWxlGBQgASgJUgVzdHls'\n    'ZRIUCgVsYWJlbBgVIAEoCVIFbGFiZWwSFgoGcmF0aW5nGBYgASgBUgZyYXRpbmcSEgoEdm90ZR'\n    'gXIAEoBVIEdm90ZRI/CgZiYWRnZXMYGCADKAsyJy5iaWxpYmlsaS5hcHAuaW50ZXJmYWNlcy52'\n    'MS5SZWFzb25TdHlsZVIGYmFkZ2VzEhYKBnN0eWxlcxgZIAEoCVIGc3R5bGVzEhsKCW1vZHVsZV'\n    '9pZBgaIAEoA1IIbW9kdWxlSWQSGwoJbGl2ZV9saW5rGBsgASgJUghsaXZlTGluaxIgCgxmYWNl'\n    'X25mdF9uZXcYHCABKAVSCmZhY2VOZnROZXcSSwoNbmZ0X2ZhY2VfaWNvbhgdIAEoCzInLmJpbG'\n    'liaWxpLmFwcC5pbnRlcmZhY2VzLnYxLk5mdEZhY2VJY29uUgtuZnRGYWNlSWNvbhIoChBpc19z'\n    'ZW5pb3JfbWVtYmVyGB4gASgFUg5pc1Nlbmlvck1lbWJlchInChBpc19zdWdfc3R5bGVfZXhwGB'\n    '8gASgFUg1pc1N1Z1N0eWxlRXhw');\n\n@$core.Deprecated('Use scoresDescriptor instead')\nconst Scores$json = {\n  '1': 'Scores',\n  '2': [\n    {'1': 'score', '3': 1, '4': 1, '5': 2, '10': 'score'},\n  ],\n};\n\n/// Descriptor for `Scores`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List scoresDescriptor =\n    $convert.base64Decode('CgZTY29yZXMSFAoFc2NvcmUYASABKAJSBXNjb3Jl');\n\n@$core.Deprecated('Use searchArchiveReplyDescriptor instead')\nconst SearchArchiveReply$json = {\n  '1': 'SearchArchiveReply',\n  '2': [\n    {\n      '1': 'archives',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.Arc',\n      '10': 'archives'\n    },\n    {'1': 'total', '3': 2, '4': 1, '5': 3, '10': 'total'},\n  ],\n};\n\n/// Descriptor for `SearchArchiveReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List searchArchiveReplyDescriptor = $convert.base64Decode(\n    'ChJTZWFyY2hBcmNoaXZlUmVwbHkSOwoIYXJjaGl2ZXMYASADKAsyHy5iaWxpYmlsaS5hcHAuaW'\n    '50ZXJmYWNlcy52MS5BcmNSCGFyY2hpdmVzEhQKBXRvdGFsGAIgASgDUgV0b3RhbA==');\n\n@$core.Deprecated('Use searchArchiveReqDescriptor instead')\nconst SearchArchiveReq$json = {\n  '1': 'SearchArchiveReq',\n  '2': [\n    {'1': 'keyword', '3': 1, '4': 1, '5': 9, '10': 'keyword'},\n    {'1': 'mid', '3': 2, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'pn', '3': 3, '4': 1, '5': 3, '10': 'pn'},\n    {'1': 'ps', '3': 4, '4': 1, '5': 3, '10': 'ps'},\n    {\n      '1': 'player_args',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n  ],\n};\n\n/// Descriptor for `SearchArchiveReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List searchArchiveReqDescriptor = $convert.base64Decode(\n    'ChBTZWFyY2hBcmNoaXZlUmVxEhgKB2tleXdvcmQYASABKAlSB2tleXdvcmQSEAoDbWlkGAIgAS'\n    'gDUgNtaWQSDgoCcG4YAyABKANSAnBuEg4KAnBzGAQgASgDUgJwcxJPCgtwbGF5ZXJfYXJncxgF'\n    'IAEoCzIuLmJpbGliaWxpLmFwcC5hcmNoaXZlLm1pZGRsZXdhcmUudjEuUGxheWVyQXJnc1IKcG'\n    'xheWVyQXJncw==');\n\n@$core.Deprecated('Use searchDynamicReplyDescriptor instead')\nconst SearchDynamicReply$json = {\n  '1': 'SearchDynamicReply',\n  '2': [\n    {\n      '1': 'dynamics',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.Dynamic',\n      '10': 'dynamics'\n    },\n    {'1': 'total', '3': 2, '4': 1, '5': 3, '10': 'total'},\n  ],\n};\n\n/// Descriptor for `SearchDynamicReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List searchDynamicReplyDescriptor = $convert.base64Decode(\n    'ChJTZWFyY2hEeW5hbWljUmVwbHkSPwoIZHluYW1pY3MYASADKAsyIy5iaWxpYmlsaS5hcHAuaW'\n    '50ZXJmYWNlcy52MS5EeW5hbWljUghkeW5hbWljcxIUCgV0b3RhbBgCIAEoA1IFdG90YWw=');\n\n@$core.Deprecated('Use searchDynamicReqDescriptor instead')\nconst SearchDynamicReq$json = {\n  '1': 'SearchDynamicReq',\n  '2': [\n    {'1': 'keyword', '3': 1, '4': 1, '5': 9, '10': 'keyword'},\n    {'1': 'mid', '3': 2, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'pn', '3': 3, '4': 1, '5': 3, '10': 'pn'},\n    {'1': 'ps', '3': 4, '4': 1, '5': 3, '10': 'ps'},\n    {\n      '1': 'player_args',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n  ],\n};\n\n/// Descriptor for `SearchDynamicReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List searchDynamicReqDescriptor = $convert.base64Decode(\n    'ChBTZWFyY2hEeW5hbWljUmVxEhgKB2tleXdvcmQYASABKAlSB2tleXdvcmQSEAoDbWlkGAIgAS'\n    'gDUgNtaWQSDgoCcG4YAyABKANSAnBuEg4KAnBzGAQgASgDUgJwcxJPCgtwbGF5ZXJfYXJncxgF'\n    'IAEoCzIuLmJpbGliaWxpLmFwcC5hcmNoaXZlLm1pZGRsZXdhcmUudjEuUGxheWVyQXJnc1IKcG'\n    'xheWVyQXJncw==');\n\n@$core.Deprecated('Use searchReplyDescriptor instead')\nconst SearchReply$json = {\n  '1': 'SearchReply',\n  '2': [\n    {\n      '1': 'items',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.CursorItem',\n      '10': 'items'\n    },\n    {'1': 'has_more', '3': 2, '4': 1, '5': 8, '10': 'hasMore'},\n    {\n      '1': 'page',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.Page',\n      '10': 'page'\n    },\n  ],\n};\n\n/// Descriptor for `SearchReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List searchReplyDescriptor = $convert.base64Decode(\n    'CgtTZWFyY2hSZXBseRI8CgVpdGVtcxgBIAMoCzImLmJpbGliaWxpLmFwcC5pbnRlcmZhY2VzLn'\n    'YxLkN1cnNvckl0ZW1SBWl0ZW1zEhkKCGhhc19tb3JlGAIgASgIUgdoYXNNb3JlEjQKBHBhZ2UY'\n    'AyABKAsyIC5iaWxpYmlsaS5hcHAuaW50ZXJmYWNlcy52MS5QYWdlUgRwYWdl');\n\n@$core.Deprecated('Use searchReqDescriptor instead')\nconst SearchReq$json = {\n  '1': 'SearchReq',\n  '2': [\n    {'1': 'keyword', '3': 1, '4': 1, '5': 9, '10': 'keyword'},\n    {'1': 'pn', '3': 2, '4': 1, '5': 3, '10': 'pn'},\n    {'1': 'business', '3': 3, '4': 1, '5': 9, '10': 'business'},\n  ],\n};\n\n/// Descriptor for `SearchReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List searchReqDescriptor = $convert.base64Decode(\n    'CglTZWFyY2hSZXESGAoHa2V5d29yZBgBIAEoCVIHa2V5d29yZBIOCgJwbhgCIAEoA1ICcG4SGg'\n    'oIYnVzaW5lc3MYAyABKAlSCGJ1c2luZXNz');\n\n@$core.Deprecated('Use searchTabReplyDescriptor instead')\nconst SearchTabReply$json = {\n  '1': 'SearchTabReply',\n  '2': [\n    {'1': 'focus', '3': 1, '4': 1, '5': 3, '10': 'focus'},\n    {\n      '1': 'tabs',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.Tab',\n      '10': 'tabs'\n    },\n  ],\n};\n\n/// Descriptor for `SearchTabReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List searchTabReplyDescriptor = $convert.base64Decode(\n    'Cg5TZWFyY2hUYWJSZXBseRIUCgVmb2N1cxgBIAEoA1IFZm9jdXMSMwoEdGFicxgCIAMoCzIfLm'\n    'JpbGliaWxpLmFwcC5pbnRlcmZhY2VzLnYxLlRhYlIEdGFicw==');\n\n@$core.Deprecated('Use searchTabReqDescriptor instead')\nconst SearchTabReq$json = {\n  '1': 'SearchTabReq',\n  '2': [\n    {'1': 'keyword', '3': 1, '4': 1, '5': 9, '10': 'keyword'},\n    {'1': 'mid', '3': 2, '4': 1, '5': 3, '10': 'mid'},\n    {\n      '1': 'from',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.interfaces.v1.From',\n      '10': 'from'\n    },\n  ],\n};\n\n/// Descriptor for `SearchTabReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List searchTabReqDescriptor = $convert.base64Decode(\n    'CgxTZWFyY2hUYWJSZXESGAoHa2V5d29yZBgBIAEoCVIHa2V5d29yZBIQCgNtaWQYAiABKANSA2'\n    '1pZBI0CgRmcm9tGAMgASgOMiAuYmlsaWJpbGkuYXBwLmludGVyZmFjZXMudjEuRnJvbVIEZnJv'\n    'bQ==');\n\n@$core.Deprecated('Use setTeenagersModelAgeReplyDescriptor instead')\nconst SetTeenagersModelAgeReply$json = {\n  '1': 'SetTeenagersModelAgeReply',\n};\n\n/// Descriptor for `SetTeenagersModelAgeReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List setTeenagersModelAgeReplyDescriptor =\n    $convert.base64Decode('ChlTZXRUZWVuYWdlcnNNb2RlbEFnZVJlcGx5');\n\n@$core.Deprecated('Use setTeenagersModelAgeReqDescriptor instead')\nconst SetTeenagersModelAgeReq$json = {\n  '1': 'SetTeenagersModelAgeReq',\n  '2': [\n    {'1': 'pwd', '3': 1, '4': 1, '5': 9, '10': 'pwd'},\n    {\n      '1': 'pwd_from',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.interfaces.v1.PwdFrom',\n      '10': 'pwdFrom'\n    },\n    {'1': 'device_token', '3': 3, '4': 1, '5': 9, '10': 'deviceToken'},\n    {'1': 'age', '3': 4, '4': 1, '5': 5, '10': 'age'},\n    {'1': 'is_dynamic', '3': 5, '4': 1, '5': 8, '10': 'isDynamic'},\n  ],\n};\n\n/// Descriptor for `SetTeenagersModelAgeReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List setTeenagersModelAgeReqDescriptor = $convert.base64Decode(\n    'ChdTZXRUZWVuYWdlcnNNb2RlbEFnZVJlcRIQCgNwd2QYASABKAlSA3B3ZBI+Cghwd2RfZnJvbR'\n    'gCIAEoDjIjLmJpbGliaWxpLmFwcC5pbnRlcmZhY2VzLnYxLlB3ZEZyb21SB3B3ZEZyb20SIQoM'\n    'ZGV2aWNlX3Rva2VuGAMgASgJUgtkZXZpY2VUb2tlbhIQCgNhZ2UYBCABKAVSA2FnZRIdCgppc1'\n    '9keW5hbWljGAUgASgIUglpc0R5bmFtaWM=');\n\n@$core.Deprecated('Use showTabDescriptor instead')\nconst ShowTab$json = {\n  '1': 'ShowTab',\n  '2': [\n    {\n      '1': 'tab_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.interfaces.v1.TabType',\n      '10': 'tabType'\n    },\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'url', '3': 3, '4': 1, '5': 9, '10': 'url'},\n  ],\n};\n\n/// Descriptor for `ShowTab`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List showTabDescriptor = $convert.base64Decode(\n    'CgdTaG93VGFiEj4KCHRhYl90eXBlGAEgASgOMiMuYmlsaWJpbGkuYXBwLmludGVyZmFjZXMudj'\n    'EuVGFiVHlwZVIHdGFiVHlwZRIUCgV0aXRsZRgCIAEoCVIFdGl0bGUSEAoDdXJsGAMgASgJUgN1'\n    'cmw=');\n\n@$core.Deprecated('Use smallItemDescriptor instead')\nconst SmallItem$json = {\n  '1': 'SmallItem',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover_image_uri', '3': 2, '4': 1, '5': 9, '10': 'coverImageUri'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'cover_right_text', '3': 4, '4': 1, '5': 9, '10': 'coverRightText'},\n    {'1': 'cover_left_text1', '3': 5, '4': 1, '5': 9, '10': 'coverLeftText1'},\n    {'1': 'cover_left_icon1', '3': 6, '4': 1, '5': 3, '10': 'coverLeftIcon1'},\n    {'1': 'cover_left_text2', '3': 7, '4': 1, '5': 9, '10': 'coverLeftText2'},\n    {'1': 'cover_left_icon2', '3': 8, '4': 1, '5': 3, '10': 'coverLeftIcon2'},\n    {'1': 'param', '3': 9, '4': 1, '5': 3, '10': 'param'},\n    {'1': 'mid', '3': 10, '4': 1, '5': 3, '10': 'mid'},\n  ],\n};\n\n/// Descriptor for `SmallItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List smallItemDescriptor = $convert.base64Decode(\n    'CglTbWFsbEl0ZW0SFAoFdGl0bGUYASABKAlSBXRpdGxlEiYKD2NvdmVyX2ltYWdlX3VyaRgCIA'\n    'EoCVINY292ZXJJbWFnZVVyaRIQCgN1cmkYAyABKAlSA3VyaRIoChBjb3Zlcl9yaWdodF90ZXh0'\n    'GAQgASgJUg5jb3ZlclJpZ2h0VGV4dBIoChBjb3Zlcl9sZWZ0X3RleHQxGAUgASgJUg5jb3Zlck'\n    'xlZnRUZXh0MRIoChBjb3Zlcl9sZWZ0X2ljb24xGAYgASgDUg5jb3ZlckxlZnRJY29uMRIoChBj'\n    'b3Zlcl9sZWZ0X3RleHQyGAcgASgJUg5jb3ZlckxlZnRUZXh0MhIoChBjb3Zlcl9sZWZ0X2ljb2'\n    '4yGAggASgDUg5jb3ZlckxlZnRJY29uMhIUCgVwYXJhbRgJIAEoA1IFcGFyYW0SEAoDbWlkGAog'\n    'ASgDUgNtaWQ=');\n\n@$core.Deprecated('Use staffDescriptor instead')\nconst Staff$json = {\n  '1': 'Staff',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},\n  ],\n};\n\n/// Descriptor for `Staff`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List staffDescriptor = $convert.base64Decode(\n    'CgVTdGFmZhIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSEgoEdGV4dBgCIAEoCVIEdGV4dA==');\n\n@$core.Deprecated('Use suggestionResult3ReplyDescriptor instead')\nconst SuggestionResult3Reply$json = {\n  '1': 'SuggestionResult3Reply',\n  '2': [\n    {'1': 'trackid', '3': 1, '4': 1, '5': 9, '10': 'trackid'},\n    {\n      '1': 'list',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.ResultItem',\n      '10': 'list'\n    },\n    {'1': 'exp_str', '3': 3, '4': 1, '5': 9, '10': 'expStr'},\n  ],\n};\n\n/// Descriptor for `SuggestionResult3Reply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List suggestionResult3ReplyDescriptor = $convert.base64Decode(\n    'ChZTdWdnZXN0aW9uUmVzdWx0M1JlcGx5EhgKB3RyYWNraWQYASABKAlSB3RyYWNraWQSOgoEbG'\n    'lzdBgCIAMoCzImLmJpbGliaWxpLmFwcC5pbnRlcmZhY2VzLnYxLlJlc3VsdEl0ZW1SBGxpc3QS'\n    'FwoHZXhwX3N0chgDIAEoCVIGZXhwU3Ry');\n\n@$core.Deprecated('Use suggestionResult3ReqDescriptor instead')\nconst SuggestionResult3Req$json = {\n  '1': 'SuggestionResult3Req',\n  '2': [\n    {'1': 'keyword', '3': 1, '4': 1, '5': 9, '10': 'keyword'},\n    {'1': 'highlight', '3': 2, '4': 1, '5': 5, '10': 'highlight'},\n    {'1': 'teenagers_mode', '3': 3, '4': 1, '5': 5, '10': 'teenagersMode'},\n    {'1': 'user_act', '3': 4, '4': 1, '5': 9, '10': 'userAct'},\n  ],\n};\n\n/// Descriptor for `SuggestionResult3Req`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List suggestionResult3ReqDescriptor = $convert.base64Decode(\n    'ChRTdWdnZXN0aW9uUmVzdWx0M1JlcRIYCgdrZXl3b3JkGAEgASgJUgdrZXl3b3JkEhwKCWhpZ2'\n    'hsaWdodBgCIAEoBVIJaGlnaGxpZ2h0EiUKDnRlZW5hZ2Vyc19tb2RlGAMgASgFUg10ZWVuYWdl'\n    'cnNNb2RlEhkKCHVzZXJfYWN0GAQgASgJUgd1c2VyQWN0');\n\n@$core.Deprecated('Use supernatantDescriptor instead')\nconst Supernatant$json = {\n  '1': 'Supernatant',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'item',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.CommentItem',\n      '10': 'item'\n    },\n  ],\n};\n\n/// Descriptor for `Supernatant`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List supernatantDescriptor = $convert.base64Decode(\n    'CgtTdXBlcm5hdGFudBIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSOwoEaXRlbRgCIAMoCzInLmJpbG'\n    'liaWxpLmFwcC5pbnRlcmZhY2VzLnYxLkNvbW1lbnRJdGVtUgRpdGVt');\n\n@$core.Deprecated('Use tabDescriptor instead')\nconst Tab$json = {\n  '1': 'Tab',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n  ],\n};\n\n/// Descriptor for `Tab`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List tabDescriptor = $convert.base64Decode(\n    'CgNUYWISFAoFdGl0bGUYASABKAlSBXRpdGxlEhAKA3VyaRgCIAEoCVIDdXJp');\n\n@$core.Deprecated('Use updateReserveStartTimeReplyDescriptor instead')\nconst UpdateReserveStartTimeReply$json = {\n  '1': 'UpdateReserveStartTimeReply',\n  '2': [\n    {'1': 'desc_text', '3': 1, '4': 1, '5': 9, '10': 'descText'},\n  ],\n};\n\n/// Descriptor for `UpdateReserveStartTimeReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List updateReserveStartTimeReplyDescriptor =\n    $convert.base64Decode(\n        'ChtVcGRhdGVSZXNlcnZlU3RhcnRUaW1lUmVwbHkSGwoJZGVzY190ZXh0GAEgASgJUghkZXNjVG'\n        'V4dA==');\n\n@$core.Deprecated('Use updateReserveStartTimeReqDescriptor instead')\nconst UpdateReserveStartTimeReq$json = {\n  '1': 'UpdateReserveStartTimeReq',\n  '2': [\n    {'1': 'sid', '3': 1, '4': 1, '5': 3, '10': 'sid'},\n    {\n      '1': 'new_live_plan_start_time',\n      '3': 2,\n      '4': 1,\n      '5': 3,\n      '10': 'newLivePlanStartTime'\n    },\n  ],\n};\n\n/// Descriptor for `UpdateReserveStartTimeReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List updateReserveStartTimeReqDescriptor =\n    $convert.base64Decode(\n        'ChlVcGRhdGVSZXNlcnZlU3RhcnRUaW1lUmVxEhAKA3NpZBgBIAEoA1IDc2lkEjYKGG5ld19saX'\n        'ZlX3BsYW5fc3RhcnRfdGltZRgCIAEoA1IUbmV3TGl2ZVBsYW5TdGFydFRpbWU=');\n\n@$core.Deprecated('Use updateStatusReplyDescriptor instead')\nconst UpdateStatusReply$json = {\n  '1': 'UpdateStatusReply',\n};\n\n/// Descriptor for `UpdateStatusReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List updateStatusReplyDescriptor =\n    $convert.base64Decode('ChFVcGRhdGVTdGF0dXNSZXBseQ==');\n\n@$core.Deprecated('Use updateStatusReqDescriptor instead')\nconst UpdateStatusReq$json = {\n  '1': 'UpdateStatusReq',\n  '2': [\n    {'1': 'pwd', '3': 1, '4': 1, '5': 9, '10': 'pwd'},\n    {'1': 'switch', '3': 2, '4': 1, '5': 8, '10': 'switch'},\n    {\n      '1': 'pwd_from',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.interfaces.v1.PwdFrom',\n      '10': 'pwdFrom'\n    },\n    {'1': 'device_token', '3': 4, '4': 1, '5': 9, '10': 'deviceToken'},\n  ],\n};\n\n/// Descriptor for `UpdateStatusReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List updateStatusReqDescriptor = $convert.base64Decode(\n    'Cg9VcGRhdGVTdGF0dXNSZXESEAoDcHdkGAEgASgJUgNwd2QSFgoGc3dpdGNoGAIgASgIUgZzd2'\n    'l0Y2gSPgoIcHdkX2Zyb20YAyABKA4yIy5iaWxpYmlsaS5hcHAuaW50ZXJmYWNlcy52MS5Qd2RG'\n    'cm9tUgdwd2RGcm9tEiEKDGRldmljZV90b2tlbhgEIAEoCVILZGV2aWNlVG9rZW4=');\n\n@$core.Deprecated('Use userCardDescriptor instead')\nconst UserCard$json = {\n  '1': 'UserCard',\n  '2': [\n    {'1': 'user_name', '3': 1, '4': 1, '5': 9, '10': 'userName'},\n    {'1': 'user_face', '3': 2, '4': 1, '5': 9, '10': 'userFace'},\n    {'1': 'user_url', '3': 3, '4': 1, '5': 9, '10': 'userUrl'},\n    {'1': 'mid', '3': 4, '4': 1, '5': 3, '10': 'mid'},\n  ],\n};\n\n/// Descriptor for `UserCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List userCardDescriptor = $convert.base64Decode(\n    'CghVc2VyQ2FyZBIbCgl1c2VyX25hbWUYASABKAlSCHVzZXJOYW1lEhsKCXVzZXJfZmFjZRgCIA'\n    'EoCVIIdXNlckZhY2USGQoIdXNlcl91cmwYAyABKAlSB3VzZXJVcmwSEAoDbWlkGAQgASgDUgNt'\n    'aWQ=');\n\n@$core.Deprecated('Use userModelDescriptor instead')\nconst UserModel$json = {\n  '1': 'UserModel',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'mode', '3': 2, '4': 1, '5': 9, '10': 'mode'},\n    {'1': 'wsxcde', '3': 3, '4': 1, '5': 9, '10': 'wsxcde'},\n    {\n      '1': 'status',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.interfaces.v1.ModelStatus',\n      '10': 'status'\n    },\n    {\n      '1': 'policy',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.Policy',\n      '10': 'policy'\n    },\n    {'1': 'is_forced', '3': 6, '4': 1, '5': 8, '10': 'isForced'},\n    {'1': 'must_teen', '3': 7, '4': 1, '5': 8, '10': 'mustTeen'},\n    {'1': 'must_real_name', '3': 8, '4': 1, '5': 8, '10': 'mustRealName'},\n    {'1': 'is_parent_control', '3': 9, '4': 1, '5': 8, '10': 'isParentControl'},\n    {'1': 'age', '3': 10, '4': 1, '5': 5, '10': 'age'},\n  ],\n};\n\n/// Descriptor for `UserModel`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List userModelDescriptor = $convert.base64Decode(\n    'CglVc2VyTW9kZWwSEAoDbWlkGAEgASgDUgNtaWQSEgoEbW9kZRgCIAEoCVIEbW9kZRIWCgZ3c3'\n    'hjZGUYAyABKAlSBndzeGNkZRI/CgZzdGF0dXMYBCABKA4yJy5iaWxpYmlsaS5hcHAuaW50ZXJm'\n    'YWNlcy52MS5Nb2RlbFN0YXR1c1IGc3RhdHVzEjoKBnBvbGljeRgFIAEoCzIiLmJpbGliaWxpLm'\n    'FwcC5pbnRlcmZhY2VzLnYxLlBvbGljeVIGcG9saWN5EhsKCWlzX2ZvcmNlZBgGIAEoCFIIaXNG'\n    'b3JjZWQSGwoJbXVzdF90ZWVuGAcgASgIUghtdXN0VGVlbhIkCg5tdXN0X3JlYWxfbmFtZRgIIA'\n    'EoCFIMbXVzdFJlYWxOYW1lEioKEWlzX3BhcmVudF9jb250cm9sGAkgASgIUg9pc1BhcmVudENv'\n    'bnRyb2wSEAoDYWdlGAogASgFUgNhZ2U=');\n\n@$core.Deprecated('Use verifyPwdReplyDescriptor instead')\nconst VerifyPwdReply$json = {\n  '1': 'VerifyPwdReply',\n};\n\n/// Descriptor for `VerifyPwdReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List verifyPwdReplyDescriptor =\n    $convert.base64Decode('Cg5WZXJpZnlQd2RSZXBseQ==');\n\n@$core.Deprecated('Use verifyPwdReqDescriptor instead')\nconst VerifyPwdReq$json = {\n  '1': 'VerifyPwdReq',\n  '2': [\n    {'1': 'pwd', '3': 1, '4': 1, '5': 9, '10': 'pwd'},\n    {\n      '1': 'pwd_from',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.interfaces.v1.PwdFrom',\n      '10': 'pwdFrom'\n    },\n    {'1': 'is_dynamic', '3': 3, '4': 1, '5': 8, '10': 'isDynamic'},\n    {'1': 'close_device', '3': 4, '4': 1, '5': 8, '10': 'closeDevice'},\n    {'1': 'device_token', '3': 5, '4': 1, '5': 9, '10': 'deviceToken'},\n  ],\n};\n\n/// Descriptor for `VerifyPwdReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List verifyPwdReqDescriptor = $convert.base64Decode(\n    'CgxWZXJpZnlQd2RSZXESEAoDcHdkGAEgASgJUgNwd2QSPgoIcHdkX2Zyb20YAiABKA4yIy5iaW'\n    'xpYmlsaS5hcHAuaW50ZXJmYWNlcy52MS5Qd2RGcm9tUgdwd2RGcm9tEh0KCmlzX2R5bmFtaWMY'\n    'AyABKAhSCWlzRHluYW1pYxIhCgxjbG9zZV9kZXZpY2UYBCABKAhSC2Nsb3NlRGV2aWNlEiEKDG'\n    'RldmljZV90b2tlbhgFIAEoCVILZGV2aWNlVG9rZW4=');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/listener/v1.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/listener/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:fixnum/fixnum.dart' as $fixnum;\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nimport '../../pagination.pb.dart' as $4;\nimport '../archive/middleware/v1.pb.dart' as $2;\nimport '../interfaces/v1.pb.dart' as $3;\nimport '../playurl/v1.pb.dart' as $5;\nimport 'v1.pbenum.dart';\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nexport 'v1.pbenum.dart';\n\nclass Author extends $pb.GeneratedMessage {\n  factory Author({\n    $fixnum.Int64? mid,\n    $core.String? name,\n    $core.String? avatar,\n    FollowRelation? relation,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (name != null) result.name = name;\n    if (avatar != null) result.avatar = avatar;\n    if (relation != null) result.relation = relation;\n    return result;\n  }\n\n  Author._();\n\n  factory Author.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Author.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Author',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'avatar')\n    ..aOM<FollowRelation>(4, _omitFieldNames ? '' : 'relation',\n        subBuilder: FollowRelation.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Author clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Author copyWith(void Function(Author) updates) =>\n      super.copyWith((message) => updates(message as Author)) as Author;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Author create() => Author._();\n  @$core.override\n  Author createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Author getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Author>(create);\n  static Author? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get avatar => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set avatar($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAvatar() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAvatar() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  FollowRelation get relation => $_getN(3);\n  @$pb.TagNumber(4)\n  set relation(FollowRelation value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasRelation() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearRelation() => $_clearField(4);\n  @$pb.TagNumber(4)\n  FollowRelation ensureRelation() => $_ensure(3);\n}\n\nclass BKArcDetailsReq extends $pb.GeneratedMessage {\n  factory BKArcDetailsReq({\n    $core.Iterable<PlayItem>? items,\n    $2.PlayerArgs? playerArgs,\n  }) {\n    final result = create();\n    if (items != null) result.items.addAll(items);\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    return result;\n  }\n\n  BKArcDetailsReq._();\n\n  factory BKArcDetailsReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BKArcDetailsReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BKArcDetailsReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..pPM<PlayItem>(1, _omitFieldNames ? '' : 'items',\n        subBuilder: PlayItem.create)\n    ..aOM<$2.PlayerArgs>(2, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $2.PlayerArgs.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BKArcDetailsReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BKArcDetailsReq copyWith(void Function(BKArcDetailsReq) updates) =>\n      super.copyWith((message) => updates(message as BKArcDetailsReq))\n          as BKArcDetailsReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BKArcDetailsReq create() => BKArcDetailsReq._();\n  @$core.override\n  BKArcDetailsReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BKArcDetailsReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<BKArcDetailsReq>(create);\n  static BKArcDetailsReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<PlayItem> get items => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $2.PlayerArgs get playerArgs => $_getN(1);\n  @$pb.TagNumber(2)\n  set playerArgs($2.PlayerArgs value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPlayerArgs() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPlayerArgs() => $_clearField(2);\n  @$pb.TagNumber(2)\n  $2.PlayerArgs ensurePlayerArgs() => $_ensure(1);\n}\n\nclass BKArcDetailsResp extends $pb.GeneratedMessage {\n  factory BKArcDetailsResp({\n    $core.Iterable<DetailItem>? list,\n  }) {\n    final result = create();\n    if (list != null) result.list.addAll(list);\n    return result;\n  }\n\n  BKArcDetailsResp._();\n\n  factory BKArcDetailsResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BKArcDetailsResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BKArcDetailsResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..pPM<DetailItem>(1, _omitFieldNames ? '' : 'list',\n        subBuilder: DetailItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BKArcDetailsResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BKArcDetailsResp copyWith(void Function(BKArcDetailsResp) updates) =>\n      super.copyWith((message) => updates(message as BKArcDetailsResp))\n          as BKArcDetailsResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BKArcDetailsResp create() => BKArcDetailsResp._();\n  @$core.override\n  BKArcDetailsResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BKArcDetailsResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<BKArcDetailsResp>(create);\n  static BKArcDetailsResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<DetailItem> get list => $_getList(0);\n}\n\nclass BKArcPart extends $pb.GeneratedMessage {\n  factory BKArcPart({\n    $fixnum.Int64? oid,\n    $fixnum.Int64? subId,\n    $core.String? title,\n    $fixnum.Int64? duration,\n    $core.int? page,\n  }) {\n    final result = create();\n    if (oid != null) result.oid = oid;\n    if (subId != null) result.subId = subId;\n    if (title != null) result.title = title;\n    if (duration != null) result.duration = duration;\n    if (page != null) result.page = page;\n    return result;\n  }\n\n  BKArcPart._();\n\n  factory BKArcPart.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BKArcPart.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BKArcPart',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'oid')\n    ..aInt64(2, _omitFieldNames ? '' : 'subId')\n    ..aOS(3, _omitFieldNames ? '' : 'title')\n    ..aInt64(4, _omitFieldNames ? '' : 'duration')\n    ..aI(5, _omitFieldNames ? '' : 'page')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BKArcPart clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BKArcPart copyWith(void Function(BKArcPart) updates) =>\n      super.copyWith((message) => updates(message as BKArcPart)) as BKArcPart;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BKArcPart create() => BKArcPart._();\n  @$core.override\n  BKArcPart createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BKArcPart getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BKArcPart>(create);\n  static BKArcPart? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get oid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set oid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get subId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set subId($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSubId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSubId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get title => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set title($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get duration => $_getI64(3);\n  @$pb.TagNumber(4)\n  set duration($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDuration() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDuration() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get page => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set page($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPage() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPage() => $_clearField(5);\n}\n\nclass BKArcRights extends $pb.GeneratedMessage {\n  factory BKArcRights({\n    $core.int? noReprint,\n  }) {\n    final result = create();\n    if (noReprint != null) result.noReprint = noReprint;\n    return result;\n  }\n\n  BKArcRights._();\n\n  factory BKArcRights.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BKArcRights.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BKArcRights',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'noReprint')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BKArcRights clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BKArcRights copyWith(void Function(BKArcRights) updates) =>\n      super.copyWith((message) => updates(message as BKArcRights))\n          as BKArcRights;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BKArcRights create() => BKArcRights._();\n  @$core.override\n  BKArcRights createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BKArcRights getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<BKArcRights>(create);\n  static BKArcRights? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get noReprint => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set noReprint($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasNoReprint() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearNoReprint() => $_clearField(1);\n}\n\nclass BKArchive extends $pb.GeneratedMessage {\n  factory BKArchive({\n    $fixnum.Int64? oid,\n    $core.String? title,\n    $core.String? cover,\n    $core.String? desc,\n    $fixnum.Int64? duration,\n    $core.int? rid,\n    $core.String? rname,\n    $fixnum.Int64? publish,\n    $core.String? displayedOid,\n    $core.int? copyright,\n    BKArcRights? rights,\n  }) {\n    final result = create();\n    if (oid != null) result.oid = oid;\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (desc != null) result.desc = desc;\n    if (duration != null) result.duration = duration;\n    if (rid != null) result.rid = rid;\n    if (rname != null) result.rname = rname;\n    if (publish != null) result.publish = publish;\n    if (displayedOid != null) result.displayedOid = displayedOid;\n    if (copyright != null) result.copyright = copyright;\n    if (rights != null) result.rights = rights;\n    return result;\n  }\n\n  BKArchive._();\n\n  factory BKArchive.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BKArchive.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BKArchive',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'oid')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'cover')\n    ..aOS(4, _omitFieldNames ? '' : 'desc')\n    ..aInt64(5, _omitFieldNames ? '' : 'duration')\n    ..aI(6, _omitFieldNames ? '' : 'rid')\n    ..aOS(7, _omitFieldNames ? '' : 'rname')\n    ..aInt64(8, _omitFieldNames ? '' : 'publish')\n    ..aOS(9, _omitFieldNames ? '' : 'displayedOid')\n    ..aI(10, _omitFieldNames ? '' : 'copyright')\n    ..aOM<BKArcRights>(11, _omitFieldNames ? '' : 'rights',\n        subBuilder: BKArcRights.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BKArchive clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BKArchive copyWith(void Function(BKArchive) updates) =>\n      super.copyWith((message) => updates(message as BKArchive)) as BKArchive;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BKArchive create() => BKArchive._();\n  @$core.override\n  BKArchive createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BKArchive getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BKArchive>(create);\n  static BKArchive? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get oid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set oid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get cover => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set cover($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCover() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCover() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get desc => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set desc($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDesc() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDesc() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get duration => $_getI64(4);\n  @$pb.TagNumber(5)\n  set duration($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDuration() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDuration() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get rid => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set rid($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasRid() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearRid() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get rname => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set rname($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasRname() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearRname() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get publish => $_getI64(7);\n  @$pb.TagNumber(8)\n  set publish($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasPublish() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearPublish() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get displayedOid => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set displayedOid($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasDisplayedOid() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearDisplayedOid() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.int get copyright => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set copyright($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasCopyright() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearCopyright() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  BKArcRights get rights => $_getN(10);\n  @$pb.TagNumber(11)\n  set rights(BKArcRights value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasRights() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearRights() => $_clearField(11);\n  @$pb.TagNumber(11)\n  BKArcRights ensureRights() => $_ensure(10);\n}\n\nclass BKStat extends $pb.GeneratedMessage {\n  factory BKStat({\n    $core.int? like,\n    $core.int? coin,\n    $core.int? favourite,\n    $core.int? reply,\n    $core.int? share,\n    $core.int? view,\n    $core.bool? hasLike_7,\n    $core.bool? hasCoin_8,\n    $core.bool? hasFav,\n    $core.bool? useViewVt,\n    $core.String? viewVtText,\n  }) {\n    final result = create();\n    if (like != null) result.like = like;\n    if (coin != null) result.coin = coin;\n    if (favourite != null) result.favourite = favourite;\n    if (reply != null) result.reply = reply;\n    if (share != null) result.share = share;\n    if (view != null) result.view = view;\n    if (hasLike_7 != null) result.hasLike_7 = hasLike_7;\n    if (hasCoin_8 != null) result.hasCoin_8 = hasCoin_8;\n    if (hasFav != null) result.hasFav = hasFav;\n    if (useViewVt != null) result.useViewVt = useViewVt;\n    if (viewVtText != null) result.viewVtText = viewVtText;\n    return result;\n  }\n\n  BKStat._();\n\n  factory BKStat.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BKStat.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BKStat',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'like')\n    ..aI(2, _omitFieldNames ? '' : 'coin')\n    ..aI(3, _omitFieldNames ? '' : 'favourite')\n    ..aI(4, _omitFieldNames ? '' : 'reply')\n    ..aI(5, _omitFieldNames ? '' : 'share')\n    ..aI(6, _omitFieldNames ? '' : 'view')\n    ..aOB(7, _omitFieldNames ? '' : 'hasLike')\n    ..aOB(8, _omitFieldNames ? '' : 'hasCoin')\n    ..aOB(9, _omitFieldNames ? '' : 'hasFav')\n    ..aOB(10, _omitFieldNames ? '' : 'useViewVt')\n    ..aOS(11, _omitFieldNames ? '' : 'viewVtText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BKStat clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BKStat copyWith(void Function(BKStat) updates) =>\n      super.copyWith((message) => updates(message as BKStat)) as BKStat;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BKStat create() => BKStat._();\n  @$core.override\n  BKStat createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BKStat getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BKStat>(create);\n  static BKStat? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get like => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set like($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLike() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLike() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get coin => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set coin($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCoin() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCoin() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get favourite => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set favourite($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFavourite() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFavourite() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get reply => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set reply($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasReply() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearReply() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get share => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set share($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasShare() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearShare() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get view => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set view($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasView() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearView() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.bool get hasLike_7 => $_getBF(6);\n  @$pb.TagNumber(7)\n  set hasLike_7($core.bool value) => $_setBool(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasHasLike_7() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearHasLike_7() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.bool get hasCoin_8 => $_getBF(7);\n  @$pb.TagNumber(8)\n  set hasCoin_8($core.bool value) => $_setBool(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasHasCoin_8() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearHasCoin_8() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.bool get hasFav => $_getBF(8);\n  @$pb.TagNumber(9)\n  set hasFav($core.bool value) => $_setBool(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasHasFav() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearHasFav() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.bool get useViewVt => $_getBF(9);\n  @$pb.TagNumber(10)\n  set useViewVt($core.bool value) => $_setBool(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasUseViewVt() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearUseViewVt() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get viewVtText => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set viewVtText($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasViewVtText() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearViewVtText() => $_clearField(11);\n}\n\nenum CardModule_Module { moduleHeader, moduleArchive, moduleCbtn, notSet }\n\nclass CardModule extends $pb.GeneratedMessage {\n  factory CardModule({\n    CardModuleType? moduleType,\n    PkcmHeader? moduleHeader,\n    PkcmArchive? moduleArchive,\n    PkcmCenterButton? moduleCbtn,\n  }) {\n    final result = create();\n    if (moduleType != null) result.moduleType = moduleType;\n    if (moduleHeader != null) result.moduleHeader = moduleHeader;\n    if (moduleArchive != null) result.moduleArchive = moduleArchive;\n    if (moduleCbtn != null) result.moduleCbtn = moduleCbtn;\n    return result;\n  }\n\n  CardModule._();\n\n  factory CardModule.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CardModule.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, CardModule_Module> _CardModule_ModuleByTag =\n      {\n    2: CardModule_Module.moduleHeader,\n    3: CardModule_Module.moduleArchive,\n    4: CardModule_Module.moduleCbtn,\n    0: CardModule_Module.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CardModule',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [2, 3, 4])\n    ..aE<CardModuleType>(1, _omitFieldNames ? '' : 'moduleType',\n        enumValues: CardModuleType.values)\n    ..aOM<PkcmHeader>(2, _omitFieldNames ? '' : 'moduleHeader',\n        subBuilder: PkcmHeader.create)\n    ..aOM<PkcmArchive>(3, _omitFieldNames ? '' : 'moduleArchive',\n        subBuilder: PkcmArchive.create)\n    ..aOM<PkcmCenterButton>(4, _omitFieldNames ? '' : 'moduleCbtn',\n        subBuilder: PkcmCenterButton.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardModule clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardModule copyWith(void Function(CardModule) updates) =>\n      super.copyWith((message) => updates(message as CardModule)) as CardModule;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CardModule create() => CardModule._();\n  @$core.override\n  CardModule createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CardModule getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CardModule>(create);\n  static CardModule? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  CardModule_Module whichModule() => _CardModule_ModuleByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  void clearModule() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  CardModuleType get moduleType => $_getN(0);\n  @$pb.TagNumber(1)\n  set moduleType(CardModuleType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasModuleType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearModuleType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  PkcmHeader get moduleHeader => $_getN(1);\n  @$pb.TagNumber(2)\n  set moduleHeader(PkcmHeader value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasModuleHeader() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearModuleHeader() => $_clearField(2);\n  @$pb.TagNumber(2)\n  PkcmHeader ensureModuleHeader() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  PkcmArchive get moduleArchive => $_getN(2);\n  @$pb.TagNumber(3)\n  set moduleArchive(PkcmArchive value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasModuleArchive() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearModuleArchive() => $_clearField(3);\n  @$pb.TagNumber(3)\n  PkcmArchive ensureModuleArchive() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  PkcmCenterButton get moduleCbtn => $_getN(3);\n  @$pb.TagNumber(4)\n  set moduleCbtn(PkcmCenterButton value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasModuleCbtn() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearModuleCbtn() => $_clearField(4);\n  @$pb.TagNumber(4)\n  PkcmCenterButton ensureModuleCbtn() => $_ensure(3);\n}\n\nclass ClickReq extends $pb.GeneratedMessage {\n  factory ClickReq({\n    $fixnum.Int64? sid,\n    ClickReq_ClickAction? action,\n  }) {\n    final result = create();\n    if (sid != null) result.sid = sid;\n    if (action != null) result.action = action;\n    return result;\n  }\n\n  ClickReq._();\n\n  factory ClickReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ClickReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ClickReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'sid')\n    ..aE<ClickReq_ClickAction>(2, _omitFieldNames ? '' : 'action',\n        enumValues: ClickReq_ClickAction.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ClickReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ClickReq copyWith(void Function(ClickReq) updates) =>\n      super.copyWith((message) => updates(message as ClickReq)) as ClickReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ClickReq create() => ClickReq._();\n  @$core.override\n  ClickReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ClickReq getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ClickReq>(create);\n  static ClickReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get sid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set sid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  ClickReq_ClickAction get action => $_getN(1);\n  @$pb.TagNumber(2)\n  set action(ClickReq_ClickAction value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAction() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAction() => $_clearField(2);\n}\n\nclass ClickResp extends $pb.GeneratedMessage {\n  factory ClickResp() => create();\n\n  ClickResp._();\n\n  factory ClickResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ClickResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ClickResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ClickResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ClickResp copyWith(void Function(ClickResp) updates) =>\n      super.copyWith((message) => updates(message as ClickResp)) as ClickResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ClickResp create() => ClickResp._();\n  @$core.override\n  ClickResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ClickResp getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ClickResp>(create);\n  static ClickResp? _defaultInstance;\n}\n\nclass CoinAddReq extends $pb.GeneratedMessage {\n  factory CoinAddReq({\n    PlayItem? item,\n    $core.int? num,\n    $core.bool? thumbUp,\n  }) {\n    final result = create();\n    if (item != null) result.item = item;\n    if (num != null) result.num = num;\n    if (thumbUp != null) result.thumbUp = thumbUp;\n    return result;\n  }\n\n  CoinAddReq._();\n\n  factory CoinAddReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CoinAddReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CoinAddReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOM<PlayItem>(1, _omitFieldNames ? '' : 'item',\n        subBuilder: PlayItem.create)\n    ..aI(2, _omitFieldNames ? '' : 'num')\n    ..aOB(3, _omitFieldNames ? '' : 'thumbUp')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CoinAddReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CoinAddReq copyWith(void Function(CoinAddReq) updates) =>\n      super.copyWith((message) => updates(message as CoinAddReq)) as CoinAddReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CoinAddReq create() => CoinAddReq._();\n  @$core.override\n  CoinAddReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CoinAddReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CoinAddReq>(create);\n  static CoinAddReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PlayItem get item => $_getN(0);\n  @$pb.TagNumber(1)\n  set item(PlayItem value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasItem() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearItem() => $_clearField(1);\n  @$pb.TagNumber(1)\n  PlayItem ensureItem() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.int get num => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set num($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasNum() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearNum() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get thumbUp => $_getBF(2);\n  @$pb.TagNumber(3)\n  set thumbUp($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasThumbUp() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearThumbUp() => $_clearField(3);\n}\n\nclass CoinAddResp extends $pb.GeneratedMessage {\n  factory CoinAddResp({\n    $core.String? message,\n  }) {\n    final result = create();\n    if (message != null) result.message = message;\n    return result;\n  }\n\n  CoinAddResp._();\n\n  factory CoinAddResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CoinAddResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CoinAddResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'message')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CoinAddResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CoinAddResp copyWith(void Function(CoinAddResp) updates) =>\n      super.copyWith((message) => updates(message as CoinAddResp))\n          as CoinAddResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CoinAddResp create() => CoinAddResp._();\n  @$core.override\n  CoinAddResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CoinAddResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CoinAddResp>(create);\n  static CoinAddResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get message => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set message($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMessage() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMessage() => $_clearField(1);\n}\n\nclass DashItem extends $pb.GeneratedMessage {\n  factory DashItem({\n    $core.int? id,\n    $core.String? baseUrl,\n    $core.Iterable<$core.String>? backupUrl,\n    $core.int? bandwidth,\n    $core.String? mimeType,\n    $core.String? codecs,\n    DashSegmentBase? segmentBase,\n    $core.int? codecid,\n    $core.String? md5,\n    $fixnum.Int64? size,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (baseUrl != null) result.baseUrl = baseUrl;\n    if (backupUrl != null) result.backupUrl.addAll(backupUrl);\n    if (bandwidth != null) result.bandwidth = bandwidth;\n    if (mimeType != null) result.mimeType = mimeType;\n    if (codecs != null) result.codecs = codecs;\n    if (segmentBase != null) result.segmentBase = segmentBase;\n    if (codecid != null) result.codecid = codecid;\n    if (md5 != null) result.md5 = md5;\n    if (size != null) result.size = size;\n    return result;\n  }\n\n  DashItem._();\n\n  factory DashItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DashItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DashItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'baseUrl')\n    ..pPS(3, _omitFieldNames ? '' : 'backupUrl')\n    ..aI(4, _omitFieldNames ? '' : 'bandwidth')\n    ..aOS(5, _omitFieldNames ? '' : 'mimeType')\n    ..aOS(6, _omitFieldNames ? '' : 'codecs')\n    ..aOM<DashSegmentBase>(12, _omitFieldNames ? '' : 'segmentBase',\n        subBuilder: DashSegmentBase.create)\n    ..aI(13, _omitFieldNames ? '' : 'codecid')\n    ..aOS(14, _omitFieldNames ? '' : 'md5')\n    ..aInt64(15, _omitFieldNames ? '' : 'size')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DashItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DashItem copyWith(void Function(DashItem) updates) =>\n      super.copyWith((message) => updates(message as DashItem)) as DashItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DashItem create() => DashItem._();\n  @$core.override\n  DashItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DashItem getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DashItem>(create);\n  static DashItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get id => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set id($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get baseUrl => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set baseUrl($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBaseUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBaseUrl() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<$core.String> get backupUrl => $_getList(2);\n\n  @$pb.TagNumber(4)\n  $core.int get bandwidth => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set bandwidth($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBandwidth() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBandwidth() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get mimeType => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set mimeType($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasMimeType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearMimeType() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get codecs => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set codecs($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCodecs() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCodecs() => $_clearField(6);\n\n  @$pb.TagNumber(12)\n  DashSegmentBase get segmentBase => $_getN(6);\n  @$pb.TagNumber(12)\n  set segmentBase(DashSegmentBase value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasSegmentBase() => $_has(6);\n  @$pb.TagNumber(12)\n  void clearSegmentBase() => $_clearField(12);\n  @$pb.TagNumber(12)\n  DashSegmentBase ensureSegmentBase() => $_ensure(6);\n\n  @$pb.TagNumber(13)\n  $core.int get codecid => $_getIZ(7);\n  @$pb.TagNumber(13)\n  set codecid($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(13)\n  $core.bool hasCodecid() => $_has(7);\n  @$pb.TagNumber(13)\n  void clearCodecid() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.String get md5 => $_getSZ(8);\n  @$pb.TagNumber(14)\n  set md5($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(14)\n  $core.bool hasMd5() => $_has(8);\n  @$pb.TagNumber(14)\n  void clearMd5() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $fixnum.Int64 get size => $_getI64(9);\n  @$pb.TagNumber(15)\n  set size($fixnum.Int64 value) => $_setInt64(9, value);\n  @$pb.TagNumber(15)\n  $core.bool hasSize() => $_has(9);\n  @$pb.TagNumber(15)\n  void clearSize() => $_clearField(15);\n}\n\nclass DashSegmentBase extends $pb.GeneratedMessage {\n  factory DashSegmentBase({\n    $core.String? initialization,\n    $core.String? indexRange,\n  }) {\n    final result = create();\n    if (initialization != null) result.initialization = initialization;\n    if (indexRange != null) result.indexRange = indexRange;\n    return result;\n  }\n\n  DashSegmentBase._();\n\n  factory DashSegmentBase.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DashSegmentBase.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DashSegmentBase',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'initialization')\n    ..aOS(2, _omitFieldNames ? '' : 'indexRange')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DashSegmentBase clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DashSegmentBase copyWith(void Function(DashSegmentBase) updates) =>\n      super.copyWith((message) => updates(message as DashSegmentBase))\n          as DashSegmentBase;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DashSegmentBase create() => DashSegmentBase._();\n  @$core.override\n  DashSegmentBase createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DashSegmentBase getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DashSegmentBase>(create);\n  static DashSegmentBase? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get initialization => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set initialization($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasInitialization() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearInitialization() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get indexRange => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set indexRange($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIndexRange() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIndexRange() => $_clearField(2);\n}\n\nclass DetailItem extends $pb.GeneratedMessage {\n  factory DetailItem({\n    PlayItem? item,\n    BKArchive? arc,\n    $core.Iterable<BKArcPart>? parts,\n    Author? owner,\n    BKStat? stat,\n    $fixnum.Int64? lastPart,\n    $fixnum.Int64? progress,\n    $core.int? playable,\n    $core.String? message,\n    $core.Iterable<$core.MapEntry<$fixnum.Int64, PlayInfo>>? playerInfo,\n    PlayItem? associatedItem,\n    $fixnum.Int64? lastPlayTime,\n    $core.String? historyTag,\n    $3.DeviceType? deviceType,\n    FavFolder? ugcSeasonInfo,\n  }) {\n    final result = create();\n    if (item != null) result.item = item;\n    if (arc != null) result.arc = arc;\n    if (parts != null) result.parts.addAll(parts);\n    if (owner != null) result.owner = owner;\n    if (stat != null) result.stat = stat;\n    if (lastPart != null) result.lastPart = lastPart;\n    if (progress != null) result.progress = progress;\n    if (playable != null) result.playable = playable;\n    if (message != null) result.message = message;\n    if (playerInfo != null) result.playerInfo.addEntries(playerInfo);\n    if (associatedItem != null) result.associatedItem = associatedItem;\n    if (lastPlayTime != null) result.lastPlayTime = lastPlayTime;\n    if (historyTag != null) result.historyTag = historyTag;\n    if (deviceType != null) result.deviceType = deviceType;\n    if (ugcSeasonInfo != null) result.ugcSeasonInfo = ugcSeasonInfo;\n    return result;\n  }\n\n  DetailItem._();\n\n  factory DetailItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DetailItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DetailItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOM<PlayItem>(1, _omitFieldNames ? '' : 'item',\n        subBuilder: PlayItem.create)\n    ..aOM<BKArchive>(2, _omitFieldNames ? '' : 'arc',\n        subBuilder: BKArchive.create)\n    ..pPM<BKArcPart>(3, _omitFieldNames ? '' : 'parts',\n        subBuilder: BKArcPart.create)\n    ..aOM<Author>(4, _omitFieldNames ? '' : 'owner', subBuilder: Author.create)\n    ..aOM<BKStat>(5, _omitFieldNames ? '' : 'stat', subBuilder: BKStat.create)\n    ..aInt64(6, _omitFieldNames ? '' : 'lastPart')\n    ..aInt64(7, _omitFieldNames ? '' : 'progress')\n    ..aI(8, _omitFieldNames ? '' : 'playable')\n    ..aOS(9, _omitFieldNames ? '' : 'message')\n    ..m<$fixnum.Int64, PlayInfo>(10, _omitFieldNames ? '' : 'playerInfo',\n        entryClassName: 'DetailItem.PlayerInfoEntry',\n        keyFieldType: $pb.PbFieldType.O6,\n        valueFieldType: $pb.PbFieldType.OM,\n        valueCreator: PlayInfo.create,\n        valueDefaultOrMaker: PlayInfo.getDefault,\n        packageName: const $pb.PackageName('bilibili.app.listener.v1'))\n    ..aOM<PlayItem>(11, _omitFieldNames ? '' : 'associatedItem',\n        subBuilder: PlayItem.create)\n    ..aInt64(12, _omitFieldNames ? '' : 'lastPlayTime')\n    ..aOS(13, _omitFieldNames ? '' : 'historyTag')\n    ..aOM<$3.DeviceType>(14, _omitFieldNames ? '' : 'deviceType',\n        subBuilder: $3.DeviceType.create)\n    ..aOM<FavFolder>(15, _omitFieldNames ? '' : 'ugcSeasonInfo',\n        subBuilder: FavFolder.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DetailItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DetailItem copyWith(void Function(DetailItem) updates) =>\n      super.copyWith((message) => updates(message as DetailItem)) as DetailItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DetailItem create() => DetailItem._();\n  @$core.override\n  DetailItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DetailItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DetailItem>(create);\n  static DetailItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PlayItem get item => $_getN(0);\n  @$pb.TagNumber(1)\n  set item(PlayItem value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasItem() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearItem() => $_clearField(1);\n  @$pb.TagNumber(1)\n  PlayItem ensureItem() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  BKArchive get arc => $_getN(1);\n  @$pb.TagNumber(2)\n  set arc(BKArchive value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasArc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearArc() => $_clearField(2);\n  @$pb.TagNumber(2)\n  BKArchive ensureArc() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<BKArcPart> get parts => $_getList(2);\n\n  @$pb.TagNumber(4)\n  Author get owner => $_getN(3);\n  @$pb.TagNumber(4)\n  set owner(Author value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasOwner() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearOwner() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Author ensureOwner() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  BKStat get stat => $_getN(4);\n  @$pb.TagNumber(5)\n  set stat(BKStat value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasStat() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearStat() => $_clearField(5);\n  @$pb.TagNumber(5)\n  BKStat ensureStat() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get lastPart => $_getI64(5);\n  @$pb.TagNumber(6)\n  set lastPart($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasLastPart() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearLastPart() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get progress => $_getI64(6);\n  @$pb.TagNumber(7)\n  set progress($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasProgress() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearProgress() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get playable => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set playable($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasPlayable() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearPlayable() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get message => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set message($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasMessage() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearMessage() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $pb.PbMap<$fixnum.Int64, PlayInfo> get playerInfo => $_getMap(9);\n\n  @$pb.TagNumber(11)\n  PlayItem get associatedItem => $_getN(10);\n  @$pb.TagNumber(11)\n  set associatedItem(PlayItem value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasAssociatedItem() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearAssociatedItem() => $_clearField(11);\n  @$pb.TagNumber(11)\n  PlayItem ensureAssociatedItem() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  $fixnum.Int64 get lastPlayTime => $_getI64(11);\n  @$pb.TagNumber(12)\n  set lastPlayTime($fixnum.Int64 value) => $_setInt64(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasLastPlayTime() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearLastPlayTime() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.String get historyTag => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set historyTag($core.String value) => $_setString(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasHistoryTag() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearHistoryTag() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $3.DeviceType get deviceType => $_getN(13);\n  @$pb.TagNumber(14)\n  set deviceType($3.DeviceType value) => $_setField(14, value);\n  @$pb.TagNumber(14)\n  $core.bool hasDeviceType() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearDeviceType() => $_clearField(14);\n  @$pb.TagNumber(14)\n  $3.DeviceType ensureDeviceType() => $_ensure(13);\n\n  @$pb.TagNumber(15)\n  FavFolder get ugcSeasonInfo => $_getN(14);\n  @$pb.TagNumber(15)\n  set ugcSeasonInfo(FavFolder value) => $_setField(15, value);\n  @$pb.TagNumber(15)\n  $core.bool hasUgcSeasonInfo() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearUgcSeasonInfo() => $_clearField(15);\n  @$pb.TagNumber(15)\n  FavFolder ensureUgcSeasonInfo() => $_ensure(14);\n}\n\nclass EventReq extends $pb.GeneratedMessage {\n  factory EventReq({\n    EventReq_EventType? eventType,\n    PlayItem? item,\n  }) {\n    final result = create();\n    if (eventType != null) result.eventType = eventType;\n    if (item != null) result.item = item;\n    return result;\n  }\n\n  EventReq._();\n\n  factory EventReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory EventReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'EventReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aE<EventReq_EventType>(1, _omitFieldNames ? '' : 'eventType',\n        enumValues: EventReq_EventType.values)\n    ..aOM<PlayItem>(2, _omitFieldNames ? '' : 'item',\n        subBuilder: PlayItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  EventReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  EventReq copyWith(void Function(EventReq) updates) =>\n      super.copyWith((message) => updates(message as EventReq)) as EventReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static EventReq create() => EventReq._();\n  @$core.override\n  EventReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static EventReq getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<EventReq>(create);\n  static EventReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  EventReq_EventType get eventType => $_getN(0);\n  @$pb.TagNumber(1)\n  set eventType(EventReq_EventType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasEventType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearEventType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  PlayItem get item => $_getN(1);\n  @$pb.TagNumber(2)\n  set item(PlayItem value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasItem() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearItem() => $_clearField(2);\n  @$pb.TagNumber(2)\n  PlayItem ensureItem() => $_ensure(1);\n}\n\nclass EventResp extends $pb.GeneratedMessage {\n  factory EventResp() => create();\n\n  EventResp._();\n\n  factory EventResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory EventResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'EventResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  EventResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  EventResp copyWith(void Function(EventResp) updates) =>\n      super.copyWith((message) => updates(message as EventResp)) as EventResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static EventResp create() => EventResp._();\n  @$core.override\n  EventResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static EventResp getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<EventResp>(create);\n  static EventResp? _defaultInstance;\n}\n\nclass EventTracking extends $pb.GeneratedMessage {\n  factory EventTracking({\n    $core.String? operator,\n    $core.String? batch,\n    $core.String? trackId,\n    $core.String? entityType,\n    $core.String? entityId,\n    $core.String? trackJson,\n  }) {\n    final result = create();\n    if (operator != null) result.operator = operator;\n    if (batch != null) result.batch = batch;\n    if (trackId != null) result.trackId = trackId;\n    if (entityType != null) result.entityType = entityType;\n    if (entityId != null) result.entityId = entityId;\n    if (trackJson != null) result.trackJson = trackJson;\n    return result;\n  }\n\n  EventTracking._();\n\n  factory EventTracking.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory EventTracking.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'EventTracking',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'operator')\n    ..aOS(2, _omitFieldNames ? '' : 'batch')\n    ..aOS(3, _omitFieldNames ? '' : 'trackId')\n    ..aOS(4, _omitFieldNames ? '' : 'entityType')\n    ..aOS(5, _omitFieldNames ? '' : 'entityId')\n    ..aOS(6, _omitFieldNames ? '' : 'trackJson')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  EventTracking clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  EventTracking copyWith(void Function(EventTracking) updates) =>\n      super.copyWith((message) => updates(message as EventTracking))\n          as EventTracking;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static EventTracking create() => EventTracking._();\n  @$core.override\n  EventTracking createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static EventTracking getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<EventTracking>(create);\n  static EventTracking? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get operator => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set operator($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOperator() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOperator() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get batch => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set batch($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBatch() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBatch() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get trackId => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set trackId($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTrackId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTrackId() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get entityType => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set entityType($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasEntityType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearEntityType() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get entityId => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set entityId($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasEntityId() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearEntityId() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get trackJson => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set trackJson($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasTrackJson() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearTrackJson() => $_clearField(6);\n}\n\nclass FavFolder extends $pb.GeneratedMessage {\n  factory FavFolder({\n    $fixnum.Int64? fid,\n    $core.int? folderType,\n    FavFolderAuthor? owner,\n    $core.String? name,\n    $core.String? cover,\n    $core.String? desc,\n    $core.int? count,\n    $core.int? attr,\n    $core.int? state,\n    $core.int? favored,\n    $fixnum.Int64? ctime,\n    $fixnum.Int64? mtime,\n    $core.int? statFavCnt,\n    $core.int? statShareCnt,\n    $core.int? statLikeCnt,\n    $core.int? statPlayCnt,\n    $core.int? statReplyCnt,\n    $core.int? favState,\n    $core.bool? useViewVt,\n    $core.String? viewVtText,\n  }) {\n    final result = create();\n    if (fid != null) result.fid = fid;\n    if (folderType != null) result.folderType = folderType;\n    if (owner != null) result.owner = owner;\n    if (name != null) result.name = name;\n    if (cover != null) result.cover = cover;\n    if (desc != null) result.desc = desc;\n    if (count != null) result.count = count;\n    if (attr != null) result.attr = attr;\n    if (state != null) result.state = state;\n    if (favored != null) result.favored = favored;\n    if (ctime != null) result.ctime = ctime;\n    if (mtime != null) result.mtime = mtime;\n    if (statFavCnt != null) result.statFavCnt = statFavCnt;\n    if (statShareCnt != null) result.statShareCnt = statShareCnt;\n    if (statLikeCnt != null) result.statLikeCnt = statLikeCnt;\n    if (statPlayCnt != null) result.statPlayCnt = statPlayCnt;\n    if (statReplyCnt != null) result.statReplyCnt = statReplyCnt;\n    if (favState != null) result.favState = favState;\n    if (useViewVt != null) result.useViewVt = useViewVt;\n    if (viewVtText != null) result.viewVtText = viewVtText;\n    return result;\n  }\n\n  FavFolder._();\n\n  factory FavFolder.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FavFolder.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FavFolder',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'fid')\n    ..aI(2, _omitFieldNames ? '' : 'folderType')\n    ..aOM<FavFolderAuthor>(3, _omitFieldNames ? '' : 'owner',\n        subBuilder: FavFolderAuthor.create)\n    ..aOS(4, _omitFieldNames ? '' : 'name')\n    ..aOS(5, _omitFieldNames ? '' : 'cover')\n    ..aOS(6, _omitFieldNames ? '' : 'desc')\n    ..aI(7, _omitFieldNames ? '' : 'count')\n    ..aI(8, _omitFieldNames ? '' : 'attr')\n    ..aI(9, _omitFieldNames ? '' : 'state')\n    ..aI(10, _omitFieldNames ? '' : 'favored')\n    ..aInt64(11, _omitFieldNames ? '' : 'ctime')\n    ..aInt64(12, _omitFieldNames ? '' : 'mtime')\n    ..aI(13, _omitFieldNames ? '' : 'statFavCnt')\n    ..aI(14, _omitFieldNames ? '' : 'statShareCnt')\n    ..aI(15, _omitFieldNames ? '' : 'statLikeCnt')\n    ..aI(16, _omitFieldNames ? '' : 'statPlayCnt')\n    ..aI(17, _omitFieldNames ? '' : 'statReplyCnt')\n    ..aI(18, _omitFieldNames ? '' : 'favState')\n    ..aOB(19, _omitFieldNames ? '' : 'useViewVt')\n    ..aOS(20, _omitFieldNames ? '' : 'viewVtText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavFolder clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavFolder copyWith(void Function(FavFolder) updates) =>\n      super.copyWith((message) => updates(message as FavFolder)) as FavFolder;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FavFolder create() => FavFolder._();\n  @$core.override\n  FavFolder createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FavFolder getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<FavFolder>(create);\n  static FavFolder? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get fid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set fid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get folderType => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set folderType($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFolderType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFolderType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  FavFolderAuthor get owner => $_getN(2);\n  @$pb.TagNumber(3)\n  set owner(FavFolderAuthor value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasOwner() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearOwner() => $_clearField(3);\n  @$pb.TagNumber(3)\n  FavFolderAuthor ensureOwner() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.String get name => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set name($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasName() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearName() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get cover => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set cover($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCover() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCover() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get desc => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set desc($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasDesc() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearDesc() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get count => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set count($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCount() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCount() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get attr => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set attr($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasAttr() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearAttr() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.int get state => $_getIZ(8);\n  @$pb.TagNumber(9)\n  set state($core.int value) => $_setSignedInt32(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasState() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearState() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.int get favored => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set favored($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasFavored() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearFavored() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $fixnum.Int64 get ctime => $_getI64(10);\n  @$pb.TagNumber(11)\n  set ctime($fixnum.Int64 value) => $_setInt64(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasCtime() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearCtime() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $fixnum.Int64 get mtime => $_getI64(11);\n  @$pb.TagNumber(12)\n  set mtime($fixnum.Int64 value) => $_setInt64(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasMtime() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearMtime() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.int get statFavCnt => $_getIZ(12);\n  @$pb.TagNumber(13)\n  set statFavCnt($core.int value) => $_setSignedInt32(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasStatFavCnt() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearStatFavCnt() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.int get statShareCnt => $_getIZ(13);\n  @$pb.TagNumber(14)\n  set statShareCnt($core.int value) => $_setSignedInt32(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasStatShareCnt() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearStatShareCnt() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $core.int get statLikeCnt => $_getIZ(14);\n  @$pb.TagNumber(15)\n  set statLikeCnt($core.int value) => $_setSignedInt32(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasStatLikeCnt() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearStatLikeCnt() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $core.int get statPlayCnt => $_getIZ(15);\n  @$pb.TagNumber(16)\n  set statPlayCnt($core.int value) => $_setSignedInt32(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasStatPlayCnt() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearStatPlayCnt() => $_clearField(16);\n\n  @$pb.TagNumber(17)\n  $core.int get statReplyCnt => $_getIZ(16);\n  @$pb.TagNumber(17)\n  set statReplyCnt($core.int value) => $_setSignedInt32(16, value);\n  @$pb.TagNumber(17)\n  $core.bool hasStatReplyCnt() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearStatReplyCnt() => $_clearField(17);\n\n  @$pb.TagNumber(18)\n  $core.int get favState => $_getIZ(17);\n  @$pb.TagNumber(18)\n  set favState($core.int value) => $_setSignedInt32(17, value);\n  @$pb.TagNumber(18)\n  $core.bool hasFavState() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearFavState() => $_clearField(18);\n\n  @$pb.TagNumber(19)\n  $core.bool get useViewVt => $_getBF(18);\n  @$pb.TagNumber(19)\n  set useViewVt($core.bool value) => $_setBool(18, value);\n  @$pb.TagNumber(19)\n  $core.bool hasUseViewVt() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearUseViewVt() => $_clearField(19);\n\n  @$pb.TagNumber(20)\n  $core.String get viewVtText => $_getSZ(19);\n  @$pb.TagNumber(20)\n  set viewVtText($core.String value) => $_setString(19, value);\n  @$pb.TagNumber(20)\n  $core.bool hasViewVtText() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearViewVtText() => $_clearField(20);\n}\n\nclass FavFolderAction extends $pb.GeneratedMessage {\n  factory FavFolderAction({\n    $fixnum.Int64? fid,\n    $core.int? folderType,\n    FavFolderAction_Action? action,\n  }) {\n    final result = create();\n    if (fid != null) result.fid = fid;\n    if (folderType != null) result.folderType = folderType;\n    if (action != null) result.action = action;\n    return result;\n  }\n\n  FavFolderAction._();\n\n  factory FavFolderAction.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FavFolderAction.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FavFolderAction',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'fid')\n    ..aI(2, _omitFieldNames ? '' : 'folderType')\n    ..aE<FavFolderAction_Action>(3, _omitFieldNames ? '' : 'action',\n        enumValues: FavFolderAction_Action.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavFolderAction clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavFolderAction copyWith(void Function(FavFolderAction) updates) =>\n      super.copyWith((message) => updates(message as FavFolderAction))\n          as FavFolderAction;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FavFolderAction create() => FavFolderAction._();\n  @$core.override\n  FavFolderAction createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FavFolderAction getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FavFolderAction>(create);\n  static FavFolderAction? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get fid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set fid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get folderType => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set folderType($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFolderType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFolderType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  FavFolderAction_Action get action => $_getN(2);\n  @$pb.TagNumber(3)\n  set action(FavFolderAction_Action value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAction() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAction() => $_clearField(3);\n}\n\nclass FavFolderAuthor extends $pb.GeneratedMessage {\n  factory FavFolderAuthor({\n    $fixnum.Int64? mid,\n    $core.String? name,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (name != null) result.name = name;\n    return result;\n  }\n\n  FavFolderAuthor._();\n\n  factory FavFolderAuthor.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FavFolderAuthor.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FavFolderAuthor',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavFolderAuthor clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavFolderAuthor copyWith(void Function(FavFolderAuthor) updates) =>\n      super.copyWith((message) => updates(message as FavFolderAuthor))\n          as FavFolderAuthor;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FavFolderAuthor create() => FavFolderAuthor._();\n  @$core.override\n  FavFolderAuthor createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FavFolderAuthor getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FavFolderAuthor>(create);\n  static FavFolderAuthor? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n}\n\nclass FavFolderCreateReq extends $pb.GeneratedMessage {\n  factory FavFolderCreateReq({\n    $core.String? name,\n    $core.String? desc,\n    $core.int? public,\n    $core.int? folderType,\n  }) {\n    final result = create();\n    if (name != null) result.name = name;\n    if (desc != null) result.desc = desc;\n    if (public != null) result.public = public;\n    if (folderType != null) result.folderType = folderType;\n    return result;\n  }\n\n  FavFolderCreateReq._();\n\n  factory FavFolderCreateReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FavFolderCreateReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FavFolderCreateReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'name')\n    ..aOS(2, _omitFieldNames ? '' : 'desc')\n    ..aI(3, _omitFieldNames ? '' : 'public')\n    ..aI(4, _omitFieldNames ? '' : 'folderType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavFolderCreateReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavFolderCreateReq copyWith(void Function(FavFolderCreateReq) updates) =>\n      super.copyWith((message) => updates(message as FavFolderCreateReq))\n          as FavFolderCreateReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FavFolderCreateReq create() => FavFolderCreateReq._();\n  @$core.override\n  FavFolderCreateReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FavFolderCreateReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FavFolderCreateReq>(create);\n  static FavFolderCreateReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get name => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set name($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasName() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearName() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get desc => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set desc($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDesc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDesc() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get public => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set public($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPublic() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPublic() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get folderType => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set folderType($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFolderType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFolderType() => $_clearField(4);\n}\n\nclass FavFolderCreateResp extends $pb.GeneratedMessage {\n  factory FavFolderCreateResp({\n    $fixnum.Int64? fid,\n    $core.int? folderType,\n    $core.String? message,\n  }) {\n    final result = create();\n    if (fid != null) result.fid = fid;\n    if (folderType != null) result.folderType = folderType;\n    if (message != null) result.message = message;\n    return result;\n  }\n\n  FavFolderCreateResp._();\n\n  factory FavFolderCreateResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FavFolderCreateResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FavFolderCreateResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'fid')\n    ..aI(2, _omitFieldNames ? '' : 'folderType')\n    ..aOS(3, _omitFieldNames ? '' : 'message')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavFolderCreateResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavFolderCreateResp copyWith(void Function(FavFolderCreateResp) updates) =>\n      super.copyWith((message) => updates(message as FavFolderCreateResp))\n          as FavFolderCreateResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FavFolderCreateResp create() => FavFolderCreateResp._();\n  @$core.override\n  FavFolderCreateResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FavFolderCreateResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FavFolderCreateResp>(create);\n  static FavFolderCreateResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get fid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set fid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get folderType => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set folderType($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFolderType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFolderType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get message => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set message($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasMessage() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearMessage() => $_clearField(3);\n}\n\nclass FavFolderDeleteReq extends $pb.GeneratedMessage {\n  factory FavFolderDeleteReq({\n    $fixnum.Int64? fid,\n    $core.int? folderType,\n  }) {\n    final result = create();\n    if (fid != null) result.fid = fid;\n    if (folderType != null) result.folderType = folderType;\n    return result;\n  }\n\n  FavFolderDeleteReq._();\n\n  factory FavFolderDeleteReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FavFolderDeleteReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FavFolderDeleteReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'fid')\n    ..aI(2, _omitFieldNames ? '' : 'folderType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavFolderDeleteReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavFolderDeleteReq copyWith(void Function(FavFolderDeleteReq) updates) =>\n      super.copyWith((message) => updates(message as FavFolderDeleteReq))\n          as FavFolderDeleteReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FavFolderDeleteReq create() => FavFolderDeleteReq._();\n  @$core.override\n  FavFolderDeleteReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FavFolderDeleteReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FavFolderDeleteReq>(create);\n  static FavFolderDeleteReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get fid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set fid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get folderType => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set folderType($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFolderType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFolderType() => $_clearField(2);\n}\n\nclass FavFolderDeleteResp extends $pb.GeneratedMessage {\n  factory FavFolderDeleteResp({\n    $core.String? message,\n  }) {\n    final result = create();\n    if (message != null) result.message = message;\n    return result;\n  }\n\n  FavFolderDeleteResp._();\n\n  factory FavFolderDeleteResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FavFolderDeleteResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FavFolderDeleteResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'message')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavFolderDeleteResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavFolderDeleteResp copyWith(void Function(FavFolderDeleteResp) updates) =>\n      super.copyWith((message) => updates(message as FavFolderDeleteResp))\n          as FavFolderDeleteResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FavFolderDeleteResp create() => FavFolderDeleteResp._();\n  @$core.override\n  FavFolderDeleteResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FavFolderDeleteResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FavFolderDeleteResp>(create);\n  static FavFolderDeleteResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get message => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set message($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMessage() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMessage() => $_clearField(1);\n}\n\nclass FavFolderDetailReq extends $pb.GeneratedMessage {\n  factory FavFolderDetailReq({\n    $fixnum.Int64? fid,\n    $core.int? folderType,\n    $fixnum.Int64? favMid,\n    FavItem? lastItem,\n    $core.int? pageSize,\n    $core.bool? needFolderInfo,\n  }) {\n    final result = create();\n    if (fid != null) result.fid = fid;\n    if (folderType != null) result.folderType = folderType;\n    if (favMid != null) result.favMid = favMid;\n    if (lastItem != null) result.lastItem = lastItem;\n    if (pageSize != null) result.pageSize = pageSize;\n    if (needFolderInfo != null) result.needFolderInfo = needFolderInfo;\n    return result;\n  }\n\n  FavFolderDetailReq._();\n\n  factory FavFolderDetailReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FavFolderDetailReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FavFolderDetailReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'fid')\n    ..aI(2, _omitFieldNames ? '' : 'folderType')\n    ..aInt64(3, _omitFieldNames ? '' : 'favMid')\n    ..aOM<FavItem>(4, _omitFieldNames ? '' : 'lastItem',\n        subBuilder: FavItem.create)\n    ..aI(5, _omitFieldNames ? '' : 'pageSize')\n    ..aOB(6, _omitFieldNames ? '' : 'needFolderInfo')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavFolderDetailReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavFolderDetailReq copyWith(void Function(FavFolderDetailReq) updates) =>\n      super.copyWith((message) => updates(message as FavFolderDetailReq))\n          as FavFolderDetailReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FavFolderDetailReq create() => FavFolderDetailReq._();\n  @$core.override\n  FavFolderDetailReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FavFolderDetailReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FavFolderDetailReq>(create);\n  static FavFolderDetailReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get fid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set fid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get folderType => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set folderType($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFolderType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFolderType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get favMid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set favMid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFavMid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFavMid() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  FavItem get lastItem => $_getN(3);\n  @$pb.TagNumber(4)\n  set lastItem(FavItem value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLastItem() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLastItem() => $_clearField(4);\n  @$pb.TagNumber(4)\n  FavItem ensureLastItem() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.int get pageSize => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set pageSize($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPageSize() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPageSize() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.bool get needFolderInfo => $_getBF(5);\n  @$pb.TagNumber(6)\n  set needFolderInfo($core.bool value) => $_setBool(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasNeedFolderInfo() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearNeedFolderInfo() => $_clearField(6);\n}\n\nclass FavFolderDetailResp extends $pb.GeneratedMessage {\n  factory FavFolderDetailResp({\n    $core.int? total,\n    $core.bool? reachEnd,\n    $core.Iterable<FavItemDetail>? list,\n    FavFolder? folderInfo,\n  }) {\n    final result = create();\n    if (total != null) result.total = total;\n    if (reachEnd != null) result.reachEnd = reachEnd;\n    if (list != null) result.list.addAll(list);\n    if (folderInfo != null) result.folderInfo = folderInfo;\n    return result;\n  }\n\n  FavFolderDetailResp._();\n\n  factory FavFolderDetailResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FavFolderDetailResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FavFolderDetailResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'total')\n    ..aOB(2, _omitFieldNames ? '' : 'reachEnd')\n    ..pPM<FavItemDetail>(3, _omitFieldNames ? '' : 'list',\n        subBuilder: FavItemDetail.create)\n    ..aOM<FavFolder>(4, _omitFieldNames ? '' : 'folderInfo',\n        subBuilder: FavFolder.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavFolderDetailResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavFolderDetailResp copyWith(void Function(FavFolderDetailResp) updates) =>\n      super.copyWith((message) => updates(message as FavFolderDetailResp))\n          as FavFolderDetailResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FavFolderDetailResp create() => FavFolderDetailResp._();\n  @$core.override\n  FavFolderDetailResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FavFolderDetailResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FavFolderDetailResp>(create);\n  static FavFolderDetailResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get total => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set total($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTotal() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTotal() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get reachEnd => $_getBF(1);\n  @$pb.TagNumber(2)\n  set reachEnd($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasReachEnd() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearReachEnd() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<FavItemDetail> get list => $_getList(2);\n\n  @$pb.TagNumber(4)\n  FavFolder get folderInfo => $_getN(3);\n  @$pb.TagNumber(4)\n  set folderInfo(FavFolder value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFolderInfo() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFolderInfo() => $_clearField(4);\n  @$pb.TagNumber(4)\n  FavFolder ensureFolderInfo() => $_ensure(3);\n}\n\nclass FavFolderListReq extends $pb.GeneratedMessage {\n  factory FavFolderListReq({\n    $core.Iterable<$core.int>? folderTypes,\n    PlayItem? item,\n  }) {\n    final result = create();\n    if (folderTypes != null) result.folderTypes.addAll(folderTypes);\n    if (item != null) result.item = item;\n    return result;\n  }\n\n  FavFolderListReq._();\n\n  factory FavFolderListReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FavFolderListReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FavFolderListReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..p<$core.int>(1, _omitFieldNames ? '' : 'folderTypes', $pb.PbFieldType.K3)\n    ..aOM<PlayItem>(2, _omitFieldNames ? '' : 'item',\n        subBuilder: PlayItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavFolderListReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavFolderListReq copyWith(void Function(FavFolderListReq) updates) =>\n      super.copyWith((message) => updates(message as FavFolderListReq))\n          as FavFolderListReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FavFolderListReq create() => FavFolderListReq._();\n  @$core.override\n  FavFolderListReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FavFolderListReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FavFolderListReq>(create);\n  static FavFolderListReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<$core.int> get folderTypes => $_getList(0);\n\n  @$pb.TagNumber(2)\n  PlayItem get item => $_getN(1);\n  @$pb.TagNumber(2)\n  set item(PlayItem value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasItem() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearItem() => $_clearField(2);\n  @$pb.TagNumber(2)\n  PlayItem ensureItem() => $_ensure(1);\n}\n\nclass FavFolderListResp extends $pb.GeneratedMessage {\n  factory FavFolderListResp({\n    $core.Iterable<FavFolder>? list,\n  }) {\n    final result = create();\n    if (list != null) result.list.addAll(list);\n    return result;\n  }\n\n  FavFolderListResp._();\n\n  factory FavFolderListResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FavFolderListResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FavFolderListResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..pPM<FavFolder>(1, _omitFieldNames ? '' : 'list',\n        subBuilder: FavFolder.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavFolderListResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavFolderListResp copyWith(void Function(FavFolderListResp) updates) =>\n      super.copyWith((message) => updates(message as FavFolderListResp))\n          as FavFolderListResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FavFolderListResp create() => FavFolderListResp._();\n  @$core.override\n  FavFolderListResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FavFolderListResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FavFolderListResp>(create);\n  static FavFolderListResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<FavFolder> get list => $_getList(0);\n}\n\nclass FavFolderMeta extends $pb.GeneratedMessage {\n  factory FavFolderMeta({\n    $fixnum.Int64? fid,\n    $core.int? folderType,\n  }) {\n    final result = create();\n    if (fid != null) result.fid = fid;\n    if (folderType != null) result.folderType = folderType;\n    return result;\n  }\n\n  FavFolderMeta._();\n\n  factory FavFolderMeta.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FavFolderMeta.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FavFolderMeta',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'fid')\n    ..aI(2, _omitFieldNames ? '' : 'folderType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavFolderMeta clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavFolderMeta copyWith(void Function(FavFolderMeta) updates) =>\n      super.copyWith((message) => updates(message as FavFolderMeta))\n          as FavFolderMeta;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FavFolderMeta create() => FavFolderMeta._();\n  @$core.override\n  FavFolderMeta createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FavFolderMeta getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FavFolderMeta>(create);\n  static FavFolderMeta? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get fid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set fid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get folderType => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set folderType($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFolderType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFolderType() => $_clearField(2);\n}\n\nclass FavItem extends $pb.GeneratedMessage {\n  factory FavItem({\n    $core.int? itemType,\n    $fixnum.Int64? oid,\n    $fixnum.Int64? fid,\n    $fixnum.Int64? mid,\n    $fixnum.Int64? mtime,\n    $fixnum.Int64? ctime,\n    EventTracking? et,\n  }) {\n    final result = create();\n    if (itemType != null) result.itemType = itemType;\n    if (oid != null) result.oid = oid;\n    if (fid != null) result.fid = fid;\n    if (mid != null) result.mid = mid;\n    if (mtime != null) result.mtime = mtime;\n    if (ctime != null) result.ctime = ctime;\n    if (et != null) result.et = et;\n    return result;\n  }\n\n  FavItem._();\n\n  factory FavItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FavItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FavItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'itemType')\n    ..aInt64(2, _omitFieldNames ? '' : 'oid')\n    ..aInt64(3, _omitFieldNames ? '' : 'fid')\n    ..aInt64(4, _omitFieldNames ? '' : 'mid')\n    ..aInt64(5, _omitFieldNames ? '' : 'mtime')\n    ..aInt64(6, _omitFieldNames ? '' : 'ctime')\n    ..aOM<EventTracking>(7, _omitFieldNames ? '' : 'et',\n        subBuilder: EventTracking.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavItem copyWith(void Function(FavItem) updates) =>\n      super.copyWith((message) => updates(message as FavItem)) as FavItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FavItem create() => FavItem._();\n  @$core.override\n  FavItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FavItem getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<FavItem>(create);\n  static FavItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get itemType => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set itemType($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasItemType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearItemType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get oid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set oid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get fid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set fid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFid() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get mid => $_getI64(3);\n  @$pb.TagNumber(4)\n  set mid($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasMid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearMid() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get mtime => $_getI64(4);\n  @$pb.TagNumber(5)\n  set mtime($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasMtime() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearMtime() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get ctime => $_getI64(5);\n  @$pb.TagNumber(6)\n  set ctime($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCtime() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCtime() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  EventTracking get et => $_getN(6);\n  @$pb.TagNumber(7)\n  set et(EventTracking value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasEt() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearEt() => $_clearField(7);\n  @$pb.TagNumber(7)\n  EventTracking ensureEt() => $_ensure(6);\n}\n\nenum FavItemAddReq_Item { play, fav, notSet }\n\nclass FavItemAddReq extends $pb.GeneratedMessage {\n  factory FavItemAddReq({\n    $fixnum.Int64? fid,\n    $core.int? folderType,\n    PlayItem? play,\n    FavItem? fav,\n    $core.bool? isFastAddFav,\n  }) {\n    final result = create();\n    if (fid != null) result.fid = fid;\n    if (folderType != null) result.folderType = folderType;\n    if (play != null) result.play = play;\n    if (fav != null) result.fav = fav;\n    if (isFastAddFav != null) result.isFastAddFav = isFastAddFav;\n    return result;\n  }\n\n  FavItemAddReq._();\n\n  factory FavItemAddReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FavItemAddReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, FavItemAddReq_Item>\n      _FavItemAddReq_ItemByTag = {\n    3: FavItemAddReq_Item.play,\n    4: FavItemAddReq_Item.fav,\n    0: FavItemAddReq_Item.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FavItemAddReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [3, 4])\n    ..aInt64(1, _omitFieldNames ? '' : 'fid')\n    ..aI(2, _omitFieldNames ? '' : 'folderType')\n    ..aOM<PlayItem>(3, _omitFieldNames ? '' : 'play',\n        subBuilder: PlayItem.create)\n    ..aOM<FavItem>(4, _omitFieldNames ? '' : 'fav', subBuilder: FavItem.create)\n    ..aOB(5, _omitFieldNames ? '' : 'isFastAddFav')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavItemAddReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavItemAddReq copyWith(void Function(FavItemAddReq) updates) =>\n      super.copyWith((message) => updates(message as FavItemAddReq))\n          as FavItemAddReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FavItemAddReq create() => FavItemAddReq._();\n  @$core.override\n  FavItemAddReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FavItemAddReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FavItemAddReq>(create);\n  static FavItemAddReq? _defaultInstance;\n\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  FavItemAddReq_Item whichItem() => _FavItemAddReq_ItemByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  void clearItem() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get fid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set fid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get folderType => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set folderType($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFolderType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFolderType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  PlayItem get play => $_getN(2);\n  @$pb.TagNumber(3)\n  set play(PlayItem value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPlay() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPlay() => $_clearField(3);\n  @$pb.TagNumber(3)\n  PlayItem ensurePlay() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  FavItem get fav => $_getN(3);\n  @$pb.TagNumber(4)\n  set fav(FavItem value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFav() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFav() => $_clearField(4);\n  @$pb.TagNumber(4)\n  FavItem ensureFav() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.bool get isFastAddFav => $_getBF(4);\n  @$pb.TagNumber(5)\n  set isFastAddFav($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasIsFastAddFav() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearIsFastAddFav() => $_clearField(5);\n}\n\nclass FavItemAddResp extends $pb.GeneratedMessage {\n  factory FavItemAddResp({\n    $core.String? message,\n  }) {\n    final result = create();\n    if (message != null) result.message = message;\n    return result;\n  }\n\n  FavItemAddResp._();\n\n  factory FavItemAddResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FavItemAddResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FavItemAddResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'message')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavItemAddResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavItemAddResp copyWith(void Function(FavItemAddResp) updates) =>\n      super.copyWith((message) => updates(message as FavItemAddResp))\n          as FavItemAddResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FavItemAddResp create() => FavItemAddResp._();\n  @$core.override\n  FavItemAddResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FavItemAddResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FavItemAddResp>(create);\n  static FavItemAddResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get message => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set message($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMessage() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMessage() => $_clearField(1);\n}\n\nclass FavItemAuthor extends $pb.GeneratedMessage {\n  factory FavItemAuthor({\n    $fixnum.Int64? mid,\n    $core.String? name,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (name != null) result.name = name;\n    return result;\n  }\n\n  FavItemAuthor._();\n\n  factory FavItemAuthor.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FavItemAuthor.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FavItemAuthor',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavItemAuthor clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavItemAuthor copyWith(void Function(FavItemAuthor) updates) =>\n      super.copyWith((message) => updates(message as FavItemAuthor))\n          as FavItemAuthor;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FavItemAuthor create() => FavItemAuthor._();\n  @$core.override\n  FavItemAuthor createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FavItemAuthor getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FavItemAuthor>(create);\n  static FavItemAuthor? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n}\n\nenum FavItemBatchReq_Item { play, fav, notSet }\n\nclass FavItemBatchReq extends $pb.GeneratedMessage {\n  factory FavItemBatchReq({\n    $core.Iterable<FavFolderAction>? actions,\n    PlayItem? play,\n    FavItem? fav,\n  }) {\n    final result = create();\n    if (actions != null) result.actions.addAll(actions);\n    if (play != null) result.play = play;\n    if (fav != null) result.fav = fav;\n    return result;\n  }\n\n  FavItemBatchReq._();\n\n  factory FavItemBatchReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FavItemBatchReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, FavItemBatchReq_Item>\n      _FavItemBatchReq_ItemByTag = {\n    2: FavItemBatchReq_Item.play,\n    3: FavItemBatchReq_Item.fav,\n    0: FavItemBatchReq_Item.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FavItemBatchReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [2, 3])\n    ..pPM<FavFolderAction>(1, _omitFieldNames ? '' : 'actions',\n        subBuilder: FavFolderAction.create)\n    ..aOM<PlayItem>(2, _omitFieldNames ? '' : 'play',\n        subBuilder: PlayItem.create)\n    ..aOM<FavItem>(3, _omitFieldNames ? '' : 'fav', subBuilder: FavItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavItemBatchReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavItemBatchReq copyWith(void Function(FavItemBatchReq) updates) =>\n      super.copyWith((message) => updates(message as FavItemBatchReq))\n          as FavItemBatchReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FavItemBatchReq create() => FavItemBatchReq._();\n  @$core.override\n  FavItemBatchReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FavItemBatchReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FavItemBatchReq>(create);\n  static FavItemBatchReq? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  FavItemBatchReq_Item whichItem() =>\n      _FavItemBatchReq_ItemByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  void clearItem() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  $pb.PbList<FavFolderAction> get actions => $_getList(0);\n\n  @$pb.TagNumber(2)\n  PlayItem get play => $_getN(1);\n  @$pb.TagNumber(2)\n  set play(PlayItem value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPlay() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPlay() => $_clearField(2);\n  @$pb.TagNumber(2)\n  PlayItem ensurePlay() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  FavItem get fav => $_getN(2);\n  @$pb.TagNumber(3)\n  set fav(FavItem value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFav() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFav() => $_clearField(3);\n  @$pb.TagNumber(3)\n  FavItem ensureFav() => $_ensure(2);\n}\n\nclass FavItemBatchResp extends $pb.GeneratedMessage {\n  factory FavItemBatchResp({\n    $core.String? message,\n  }) {\n    final result = create();\n    if (message != null) result.message = message;\n    return result;\n  }\n\n  FavItemBatchResp._();\n\n  factory FavItemBatchResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FavItemBatchResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FavItemBatchResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'message')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavItemBatchResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavItemBatchResp copyWith(void Function(FavItemBatchResp) updates) =>\n      super.copyWith((message) => updates(message as FavItemBatchResp))\n          as FavItemBatchResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FavItemBatchResp create() => FavItemBatchResp._();\n  @$core.override\n  FavItemBatchResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FavItemBatchResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FavItemBatchResp>(create);\n  static FavItemBatchResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get message => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set message($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMessage() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMessage() => $_clearField(1);\n}\n\nenum FavItemDelReq_Item { play, fav, notSet }\n\nclass FavItemDelReq extends $pb.GeneratedMessage {\n  factory FavItemDelReq({\n    $fixnum.Int64? fid,\n    $core.int? folderType,\n    PlayItem? play,\n    FavItem? fav,\n    $core.bool? isFastDelFav,\n  }) {\n    final result = create();\n    if (fid != null) result.fid = fid;\n    if (folderType != null) result.folderType = folderType;\n    if (play != null) result.play = play;\n    if (fav != null) result.fav = fav;\n    if (isFastDelFav != null) result.isFastDelFav = isFastDelFav;\n    return result;\n  }\n\n  FavItemDelReq._();\n\n  factory FavItemDelReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FavItemDelReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, FavItemDelReq_Item>\n      _FavItemDelReq_ItemByTag = {\n    3: FavItemDelReq_Item.play,\n    4: FavItemDelReq_Item.fav,\n    0: FavItemDelReq_Item.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FavItemDelReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [3, 4])\n    ..aInt64(1, _omitFieldNames ? '' : 'fid')\n    ..aI(2, _omitFieldNames ? '' : 'folderType')\n    ..aOM<PlayItem>(3, _omitFieldNames ? '' : 'play',\n        subBuilder: PlayItem.create)\n    ..aOM<FavItem>(4, _omitFieldNames ? '' : 'fav', subBuilder: FavItem.create)\n    ..aOB(5, _omitFieldNames ? '' : 'isFastDelFav')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavItemDelReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavItemDelReq copyWith(void Function(FavItemDelReq) updates) =>\n      super.copyWith((message) => updates(message as FavItemDelReq))\n          as FavItemDelReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FavItemDelReq create() => FavItemDelReq._();\n  @$core.override\n  FavItemDelReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FavItemDelReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FavItemDelReq>(create);\n  static FavItemDelReq? _defaultInstance;\n\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  FavItemDelReq_Item whichItem() => _FavItemDelReq_ItemByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  void clearItem() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get fid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set fid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get folderType => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set folderType($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFolderType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFolderType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  PlayItem get play => $_getN(2);\n  @$pb.TagNumber(3)\n  set play(PlayItem value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPlay() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPlay() => $_clearField(3);\n  @$pb.TagNumber(3)\n  PlayItem ensurePlay() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  FavItem get fav => $_getN(3);\n  @$pb.TagNumber(4)\n  set fav(FavItem value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFav() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFav() => $_clearField(4);\n  @$pb.TagNumber(4)\n  FavItem ensureFav() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.bool get isFastDelFav => $_getBF(4);\n  @$pb.TagNumber(5)\n  set isFastDelFav($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasIsFastDelFav() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearIsFastDelFav() => $_clearField(5);\n}\n\nclass FavItemDelResp extends $pb.GeneratedMessage {\n  factory FavItemDelResp({\n    $core.String? message,\n  }) {\n    final result = create();\n    if (message != null) result.message = message;\n    return result;\n  }\n\n  FavItemDelResp._();\n\n  factory FavItemDelResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FavItemDelResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FavItemDelResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'message')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavItemDelResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavItemDelResp copyWith(void Function(FavItemDelResp) updates) =>\n      super.copyWith((message) => updates(message as FavItemDelResp))\n          as FavItemDelResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FavItemDelResp create() => FavItemDelResp._();\n  @$core.override\n  FavItemDelResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FavItemDelResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FavItemDelResp>(create);\n  static FavItemDelResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get message => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set message($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMessage() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMessage() => $_clearField(1);\n}\n\nclass FavItemDetail extends $pb.GeneratedMessage {\n  factory FavItemDetail({\n    FavItem? item,\n    FavItemAuthor? owner,\n    FavItemStat? stat,\n    $core.String? cover,\n    $core.String? name,\n    $fixnum.Int64? duration,\n    $core.int? state,\n    $core.String? message,\n    $core.int? parts,\n  }) {\n    final result = create();\n    if (item != null) result.item = item;\n    if (owner != null) result.owner = owner;\n    if (stat != null) result.stat = stat;\n    if (cover != null) result.cover = cover;\n    if (name != null) result.name = name;\n    if (duration != null) result.duration = duration;\n    if (state != null) result.state = state;\n    if (message != null) result.message = message;\n    if (parts != null) result.parts = parts;\n    return result;\n  }\n\n  FavItemDetail._();\n\n  factory FavItemDetail.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FavItemDetail.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FavItemDetail',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOM<FavItem>(1, _omitFieldNames ? '' : 'item', subBuilder: FavItem.create)\n    ..aOM<FavItemAuthor>(2, _omitFieldNames ? '' : 'owner',\n        subBuilder: FavItemAuthor.create)\n    ..aOM<FavItemStat>(3, _omitFieldNames ? '' : 'stat',\n        subBuilder: FavItemStat.create)\n    ..aOS(4, _omitFieldNames ? '' : 'cover')\n    ..aOS(5, _omitFieldNames ? '' : 'name')\n    ..aInt64(6, _omitFieldNames ? '' : 'duration')\n    ..aI(7, _omitFieldNames ? '' : 'state')\n    ..aOS(8, _omitFieldNames ? '' : 'message')\n    ..aI(9, _omitFieldNames ? '' : 'parts')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavItemDetail clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavItemDetail copyWith(void Function(FavItemDetail) updates) =>\n      super.copyWith((message) => updates(message as FavItemDetail))\n          as FavItemDetail;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FavItemDetail create() => FavItemDetail._();\n  @$core.override\n  FavItemDetail createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FavItemDetail getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FavItemDetail>(create);\n  static FavItemDetail? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  FavItem get item => $_getN(0);\n  @$pb.TagNumber(1)\n  set item(FavItem value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasItem() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearItem() => $_clearField(1);\n  @$pb.TagNumber(1)\n  FavItem ensureItem() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  FavItemAuthor get owner => $_getN(1);\n  @$pb.TagNumber(2)\n  set owner(FavItemAuthor value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOwner() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOwner() => $_clearField(2);\n  @$pb.TagNumber(2)\n  FavItemAuthor ensureOwner() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  FavItemStat get stat => $_getN(2);\n  @$pb.TagNumber(3)\n  set stat(FavItemStat value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasStat() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearStat() => $_clearField(3);\n  @$pb.TagNumber(3)\n  FavItemStat ensureStat() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.String get cover => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set cover($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCover() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCover() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get name => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set name($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasName() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearName() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get duration => $_getI64(5);\n  @$pb.TagNumber(6)\n  set duration($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasDuration() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearDuration() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get state => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set state($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasState() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearState() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get message => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set message($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasMessage() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearMessage() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.int get parts => $_getIZ(8);\n  @$pb.TagNumber(9)\n  set parts($core.int value) => $_setSignedInt32(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasParts() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearParts() => $_clearField(9);\n}\n\nclass FavItemStat extends $pb.GeneratedMessage {\n  factory FavItemStat({\n    $core.int? view,\n    $core.int? reply,\n    $core.bool? useViewVt,\n    $core.String? viewVtText,\n  }) {\n    final result = create();\n    if (view != null) result.view = view;\n    if (reply != null) result.reply = reply;\n    if (useViewVt != null) result.useViewVt = useViewVt;\n    if (viewVtText != null) result.viewVtText = viewVtText;\n    return result;\n  }\n\n  FavItemStat._();\n\n  factory FavItemStat.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FavItemStat.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FavItemStat',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'view')\n    ..aI(2, _omitFieldNames ? '' : 'reply')\n    ..aOB(3, _omitFieldNames ? '' : 'useViewVt')\n    ..aOS(4, _omitFieldNames ? '' : 'viewVtText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavItemStat clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavItemStat copyWith(void Function(FavItemStat) updates) =>\n      super.copyWith((message) => updates(message as FavItemStat))\n          as FavItemStat;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FavItemStat create() => FavItemStat._();\n  @$core.override\n  FavItemStat createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FavItemStat getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FavItemStat>(create);\n  static FavItemStat? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get view => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set view($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasView() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearView() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get reply => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set reply($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasReply() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearReply() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get useViewVt => $_getBF(2);\n  @$pb.TagNumber(3)\n  set useViewVt($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUseViewVt() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUseViewVt() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get viewVtText => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set viewVtText($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasViewVtText() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearViewVtText() => $_clearField(4);\n}\n\nclass FavTabShowReq extends $pb.GeneratedMessage {\n  factory FavTabShowReq({\n    $fixnum.Int64? mid,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    return result;\n  }\n\n  FavTabShowReq._();\n\n  factory FavTabShowReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FavTabShowReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FavTabShowReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavTabShowReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavTabShowReq copyWith(void Function(FavTabShowReq) updates) =>\n      super.copyWith((message) => updates(message as FavTabShowReq))\n          as FavTabShowReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FavTabShowReq create() => FavTabShowReq._();\n  @$core.override\n  FavTabShowReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FavTabShowReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FavTabShowReq>(create);\n  static FavTabShowReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n}\n\nclass FavTabShowResp extends $pb.GeneratedMessage {\n  factory FavTabShowResp({\n    $core.bool? showMenu,\n  }) {\n    final result = create();\n    if (showMenu != null) result.showMenu = showMenu;\n    return result;\n  }\n\n  FavTabShowResp._();\n\n  factory FavTabShowResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FavTabShowResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FavTabShowResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'showMenu')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavTabShowResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavTabShowResp copyWith(void Function(FavTabShowResp) updates) =>\n      super.copyWith((message) => updates(message as FavTabShowResp))\n          as FavTabShowResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FavTabShowResp create() => FavTabShowResp._();\n  @$core.override\n  FavTabShowResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FavTabShowResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FavTabShowResp>(create);\n  static FavTabShowResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get showMenu => $_getBF(0);\n  @$pb.TagNumber(1)\n  set showMenu($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasShowMenu() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearShowMenu() => $_clearField(1);\n}\n\nclass FavoredInAnyFoldersReq extends $pb.GeneratedMessage {\n  factory FavoredInAnyFoldersReq({\n    $core.Iterable<$core.int>? folderTypes,\n    PlayItem? item,\n  }) {\n    final result = create();\n    if (folderTypes != null) result.folderTypes.addAll(folderTypes);\n    if (item != null) result.item = item;\n    return result;\n  }\n\n  FavoredInAnyFoldersReq._();\n\n  factory FavoredInAnyFoldersReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FavoredInAnyFoldersReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FavoredInAnyFoldersReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..p<$core.int>(1, _omitFieldNames ? '' : 'folderTypes', $pb.PbFieldType.K3)\n    ..aOM<PlayItem>(2, _omitFieldNames ? '' : 'item',\n        subBuilder: PlayItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavoredInAnyFoldersReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavoredInAnyFoldersReq copyWith(\n          void Function(FavoredInAnyFoldersReq) updates) =>\n      super.copyWith((message) => updates(message as FavoredInAnyFoldersReq))\n          as FavoredInAnyFoldersReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FavoredInAnyFoldersReq create() => FavoredInAnyFoldersReq._();\n  @$core.override\n  FavoredInAnyFoldersReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FavoredInAnyFoldersReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FavoredInAnyFoldersReq>(create);\n  static FavoredInAnyFoldersReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<$core.int> get folderTypes => $_getList(0);\n\n  @$pb.TagNumber(2)\n  PlayItem get item => $_getN(1);\n  @$pb.TagNumber(2)\n  set item(PlayItem value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasItem() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearItem() => $_clearField(2);\n  @$pb.TagNumber(2)\n  PlayItem ensureItem() => $_ensure(1);\n}\n\nclass FavoredInAnyFoldersResp extends $pb.GeneratedMessage {\n  factory FavoredInAnyFoldersResp({\n    $core.Iterable<FavFolderMeta>? folders,\n    PlayItem? item,\n  }) {\n    final result = create();\n    if (folders != null) result.folders.addAll(folders);\n    if (item != null) result.item = item;\n    return result;\n  }\n\n  FavoredInAnyFoldersResp._();\n\n  factory FavoredInAnyFoldersResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FavoredInAnyFoldersResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FavoredInAnyFoldersResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..pPM<FavFolderMeta>(1, _omitFieldNames ? '' : 'folders',\n        subBuilder: FavFolderMeta.create)\n    ..aOM<PlayItem>(2, _omitFieldNames ? '' : 'item',\n        subBuilder: PlayItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavoredInAnyFoldersResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FavoredInAnyFoldersResp copyWith(\n          void Function(FavoredInAnyFoldersResp) updates) =>\n      super.copyWith((message) => updates(message as FavoredInAnyFoldersResp))\n          as FavoredInAnyFoldersResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FavoredInAnyFoldersResp create() => FavoredInAnyFoldersResp._();\n  @$core.override\n  FavoredInAnyFoldersResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FavoredInAnyFoldersResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FavoredInAnyFoldersResp>(create);\n  static FavoredInAnyFoldersResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<FavFolderMeta> get folders => $_getList(0);\n\n  @$pb.TagNumber(2)\n  PlayItem get item => $_getN(1);\n  @$pb.TagNumber(2)\n  set item(PlayItem value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasItem() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearItem() => $_clearField(2);\n  @$pb.TagNumber(2)\n  PlayItem ensureItem() => $_ensure(1);\n}\n\nclass FollowRelation extends $pb.GeneratedMessage {\n  factory FollowRelation({\n    FollowRelation_RelationStatus? status,\n  }) {\n    final result = create();\n    if (status != null) result.status = status;\n    return result;\n  }\n\n  FollowRelation._();\n\n  factory FollowRelation.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FollowRelation.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FollowRelation',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aE<FollowRelation_RelationStatus>(1, _omitFieldNames ? '' : 'status',\n        enumValues: FollowRelation_RelationStatus.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FollowRelation clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FollowRelation copyWith(void Function(FollowRelation) updates) =>\n      super.copyWith((message) => updates(message as FollowRelation))\n          as FollowRelation;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FollowRelation create() => FollowRelation._();\n  @$core.override\n  FollowRelation createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FollowRelation getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FollowRelation>(create);\n  static FollowRelation? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  FollowRelation_RelationStatus get status => $_getN(0);\n  @$pb.TagNumber(1)\n  set status(FollowRelation_RelationStatus value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStatus() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStatus() => $_clearField(1);\n}\n\nclass FormatDescription extends $pb.GeneratedMessage {\n  factory FormatDescription({\n    $core.int? quality,\n    $core.String? format,\n    $core.String? description,\n    $core.String? displayDesc,\n    $core.String? superscript,\n  }) {\n    final result = create();\n    if (quality != null) result.quality = quality;\n    if (format != null) result.format = format;\n    if (description != null) result.description = description;\n    if (displayDesc != null) result.displayDesc = displayDesc;\n    if (superscript != null) result.superscript = superscript;\n    return result;\n  }\n\n  FormatDescription._();\n\n  factory FormatDescription.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FormatDescription.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FormatDescription',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'quality')\n    ..aOS(2, _omitFieldNames ? '' : 'format')\n    ..aOS(3, _omitFieldNames ? '' : 'description')\n    ..aOS(4, _omitFieldNames ? '' : 'displayDesc')\n    ..aOS(5, _omitFieldNames ? '' : 'superscript')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FormatDescription clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FormatDescription copyWith(void Function(FormatDescription) updates) =>\n      super.copyWith((message) => updates(message as FormatDescription))\n          as FormatDescription;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FormatDescription create() => FormatDescription._();\n  @$core.override\n  FormatDescription createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FormatDescription getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FormatDescription>(create);\n  static FormatDescription? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get quality => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set quality($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasQuality() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearQuality() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get format => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set format($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFormat() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFormat() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get description => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set description($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDescription() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDescription() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get displayDesc => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set displayDesc($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDisplayDesc() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDisplayDesc() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get superscript => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set superscript($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasSuperscript() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearSuperscript() => $_clearField(5);\n}\n\nclass MainFavMusicMenuListReq extends $pb.GeneratedMessage {\n  factory MainFavMusicMenuListReq({\n    $core.int? tabType,\n    $core.String? offset,\n  }) {\n    final result = create();\n    if (tabType != null) result.tabType = tabType;\n    if (offset != null) result.offset = offset;\n    return result;\n  }\n\n  MainFavMusicMenuListReq._();\n\n  factory MainFavMusicMenuListReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MainFavMusicMenuListReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MainFavMusicMenuListReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'tabType')\n    ..aOS(2, _omitFieldNames ? '' : 'offset')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MainFavMusicMenuListReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MainFavMusicMenuListReq copyWith(\n          void Function(MainFavMusicMenuListReq) updates) =>\n      super.copyWith((message) => updates(message as MainFavMusicMenuListReq))\n          as MainFavMusicMenuListReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MainFavMusicMenuListReq create() => MainFavMusicMenuListReq._();\n  @$core.override\n  MainFavMusicMenuListReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MainFavMusicMenuListReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MainFavMusicMenuListReq>(create);\n  static MainFavMusicMenuListReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get tabType => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set tabType($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTabType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTabType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get offset => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set offset($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOffset() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOffset() => $_clearField(2);\n}\n\nclass MainFavMusicMenuListResp extends $pb.GeneratedMessage {\n  factory MainFavMusicMenuListResp({\n    $core.int? tabType,\n    $core.Iterable<MusicMenu>? menuList,\n    $core.bool? hasMore,\n    $core.String? offset,\n  }) {\n    final result = create();\n    if (tabType != null) result.tabType = tabType;\n    if (menuList != null) result.menuList.addAll(menuList);\n    if (hasMore != null) result.hasMore = hasMore;\n    if (offset != null) result.offset = offset;\n    return result;\n  }\n\n  MainFavMusicMenuListResp._();\n\n  factory MainFavMusicMenuListResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MainFavMusicMenuListResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MainFavMusicMenuListResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'tabType')\n    ..pPM<MusicMenu>(2, _omitFieldNames ? '' : 'menuList',\n        subBuilder: MusicMenu.create)\n    ..aOB(3, _omitFieldNames ? '' : 'hasMore')\n    ..aOS(4, _omitFieldNames ? '' : 'offset')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MainFavMusicMenuListResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MainFavMusicMenuListResp copyWith(\n          void Function(MainFavMusicMenuListResp) updates) =>\n      super.copyWith((message) => updates(message as MainFavMusicMenuListResp))\n          as MainFavMusicMenuListResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MainFavMusicMenuListResp create() => MainFavMusicMenuListResp._();\n  @$core.override\n  MainFavMusicMenuListResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MainFavMusicMenuListResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MainFavMusicMenuListResp>(create);\n  static MainFavMusicMenuListResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get tabType => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set tabType($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTabType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTabType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<MusicMenu> get menuList => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $core.bool get hasMore => $_getBF(2);\n  @$pb.TagNumber(3)\n  set hasMore($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasHasMore() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearHasMore() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get offset => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set offset($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasOffset() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearOffset() => $_clearField(4);\n}\n\nclass MainFavMusicSubTabListReq extends $pb.GeneratedMessage {\n  factory MainFavMusicSubTabListReq() => create();\n\n  MainFavMusicSubTabListReq._();\n\n  factory MainFavMusicSubTabListReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MainFavMusicSubTabListReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MainFavMusicSubTabListReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MainFavMusicSubTabListReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MainFavMusicSubTabListReq copyWith(\n          void Function(MainFavMusicSubTabListReq) updates) =>\n      super.copyWith((message) => updates(message as MainFavMusicSubTabListReq))\n          as MainFavMusicSubTabListReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MainFavMusicSubTabListReq create() => MainFavMusicSubTabListReq._();\n  @$core.override\n  MainFavMusicSubTabListReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MainFavMusicSubTabListReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MainFavMusicSubTabListReq>(create);\n  static MainFavMusicSubTabListReq? _defaultInstance;\n}\n\nclass MainFavMusicSubTabListResp extends $pb.GeneratedMessage {\n  factory MainFavMusicSubTabListResp({\n    $core.Iterable<MusicSubTab>? tabs,\n    MainFavMusicMenuListResp? defaultTabRes,\n    $core.Iterable<$core.MapEntry<$core.int, MainFavMusicMenuListResp>>?\n        firstPageRes,\n  }) {\n    final result = create();\n    if (tabs != null) result.tabs.addAll(tabs);\n    if (defaultTabRes != null) result.defaultTabRes = defaultTabRes;\n    if (firstPageRes != null) result.firstPageRes.addEntries(firstPageRes);\n    return result;\n  }\n\n  MainFavMusicSubTabListResp._();\n\n  factory MainFavMusicSubTabListResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MainFavMusicSubTabListResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MainFavMusicSubTabListResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..pPM<MusicSubTab>(1, _omitFieldNames ? '' : 'tabs',\n        subBuilder: MusicSubTab.create)\n    ..aOM<MainFavMusicMenuListResp>(2, _omitFieldNames ? '' : 'defaultTabRes',\n        subBuilder: MainFavMusicMenuListResp.create)\n    ..m<$core.int, MainFavMusicMenuListResp>(\n        3, _omitFieldNames ? '' : 'firstPageRes',\n        entryClassName: 'MainFavMusicSubTabListResp.FirstPageResEntry',\n        keyFieldType: $pb.PbFieldType.O3,\n        valueFieldType: $pb.PbFieldType.OM,\n        valueCreator: MainFavMusicMenuListResp.create,\n        valueDefaultOrMaker: MainFavMusicMenuListResp.getDefault,\n        packageName: const $pb.PackageName('bilibili.app.listener.v1'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MainFavMusicSubTabListResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MainFavMusicSubTabListResp copyWith(\n          void Function(MainFavMusicSubTabListResp) updates) =>\n      super.copyWith(\n              (message) => updates(message as MainFavMusicSubTabListResp))\n          as MainFavMusicSubTabListResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MainFavMusicSubTabListResp create() => MainFavMusicSubTabListResp._();\n  @$core.override\n  MainFavMusicSubTabListResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MainFavMusicSubTabListResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MainFavMusicSubTabListResp>(create);\n  static MainFavMusicSubTabListResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<MusicSubTab> get tabs => $_getList(0);\n\n  @$pb.TagNumber(2)\n  MainFavMusicMenuListResp get defaultTabRes => $_getN(1);\n  @$pb.TagNumber(2)\n  set defaultTabRes(MainFavMusicMenuListResp value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDefaultTabRes() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDefaultTabRes() => $_clearField(2);\n  @$pb.TagNumber(2)\n  MainFavMusicMenuListResp ensureDefaultTabRes() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $pb.PbMap<$core.int, MainFavMusicMenuListResp> get firstPageRes =>\n      $_getMap(2);\n}\n\nclass MedialistItem extends $pb.GeneratedMessage {\n  factory MedialistItem({\n    PlayItem? item,\n    $core.String? title,\n    $core.String? cover,\n    $fixnum.Int64? duration,\n    $core.int? parts,\n    $fixnum.Int64? upMid,\n    $core.String? upName,\n    $core.int? state,\n    $core.String? message,\n    $fixnum.Int64? statView,\n    $fixnum.Int64? statReply,\n    $core.bool? useStatViewVt,\n    $core.String? statViewVtText,\n  }) {\n    final result = create();\n    if (item != null) result.item = item;\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (duration != null) result.duration = duration;\n    if (parts != null) result.parts = parts;\n    if (upMid != null) result.upMid = upMid;\n    if (upName != null) result.upName = upName;\n    if (state != null) result.state = state;\n    if (message != null) result.message = message;\n    if (statView != null) result.statView = statView;\n    if (statReply != null) result.statReply = statReply;\n    if (useStatViewVt != null) result.useStatViewVt = useStatViewVt;\n    if (statViewVtText != null) result.statViewVtText = statViewVtText;\n    return result;\n  }\n\n  MedialistItem._();\n\n  factory MedialistItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MedialistItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MedialistItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOM<PlayItem>(1, _omitFieldNames ? '' : 'item',\n        subBuilder: PlayItem.create)\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'cover')\n    ..aInt64(4, _omitFieldNames ? '' : 'duration')\n    ..aI(5, _omitFieldNames ? '' : 'parts')\n    ..aInt64(6, _omitFieldNames ? '' : 'upMid')\n    ..aOS(7, _omitFieldNames ? '' : 'upName')\n    ..aI(8, _omitFieldNames ? '' : 'state')\n    ..aOS(9, _omitFieldNames ? '' : 'message')\n    ..aInt64(10, _omitFieldNames ? '' : 'statView')\n    ..aInt64(11, _omitFieldNames ? '' : 'statReply')\n    ..aOB(12, _omitFieldNames ? '' : 'useStatViewVt')\n    ..aOS(13, _omitFieldNames ? '' : 'statViewVtText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MedialistItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MedialistItem copyWith(void Function(MedialistItem) updates) =>\n      super.copyWith((message) => updates(message as MedialistItem))\n          as MedialistItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MedialistItem create() => MedialistItem._();\n  @$core.override\n  MedialistItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MedialistItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MedialistItem>(create);\n  static MedialistItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PlayItem get item => $_getN(0);\n  @$pb.TagNumber(1)\n  set item(PlayItem value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasItem() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearItem() => $_clearField(1);\n  @$pb.TagNumber(1)\n  PlayItem ensureItem() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get cover => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set cover($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCover() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCover() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get duration => $_getI64(3);\n  @$pb.TagNumber(4)\n  set duration($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDuration() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDuration() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get parts => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set parts($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasParts() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearParts() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get upMid => $_getI64(5);\n  @$pb.TagNumber(6)\n  set upMid($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasUpMid() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearUpMid() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get upName => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set upName($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasUpName() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearUpName() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get state => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set state($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasState() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearState() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get message => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set message($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasMessage() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearMessage() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $fixnum.Int64 get statView => $_getI64(9);\n  @$pb.TagNumber(10)\n  set statView($fixnum.Int64 value) => $_setInt64(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasStatView() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearStatView() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $fixnum.Int64 get statReply => $_getI64(10);\n  @$pb.TagNumber(11)\n  set statReply($fixnum.Int64 value) => $_setInt64(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasStatReply() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearStatReply() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.bool get useStatViewVt => $_getBF(11);\n  @$pb.TagNumber(12)\n  set useStatViewVt($core.bool value) => $_setBool(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasUseStatViewVt() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearUseStatViewVt() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.String get statViewVtText => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set statViewVtText($core.String value) => $_setString(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasStatViewVtText() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearStatViewVtText() => $_clearField(13);\n}\n\nclass MedialistReq extends $pb.GeneratedMessage {\n  factory MedialistReq({\n    $fixnum.Int64? listType,\n    $fixnum.Int64? bizId,\n    $core.String? offset,\n  }) {\n    final result = create();\n    if (listType != null) result.listType = listType;\n    if (bizId != null) result.bizId = bizId;\n    if (offset != null) result.offset = offset;\n    return result;\n  }\n\n  MedialistReq._();\n\n  factory MedialistReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MedialistReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MedialistReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'listType')\n    ..aInt64(2, _omitFieldNames ? '' : 'bizId')\n    ..aOS(3, _omitFieldNames ? '' : 'offset')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MedialistReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MedialistReq copyWith(void Function(MedialistReq) updates) =>\n      super.copyWith((message) => updates(message as MedialistReq))\n          as MedialistReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MedialistReq create() => MedialistReq._();\n  @$core.override\n  MedialistReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MedialistReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MedialistReq>(create);\n  static MedialistReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get listType => $_getI64(0);\n  @$pb.TagNumber(1)\n  set listType($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasListType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearListType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get bizId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set bizId($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBizId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBizId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get offset => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set offset($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasOffset() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearOffset() => $_clearField(3);\n}\n\nclass MedialistResp extends $pb.GeneratedMessage {\n  factory MedialistResp({\n    $fixnum.Int64? total,\n    $core.bool? hasMore,\n    $core.String? offset,\n    $core.Iterable<MedialistItem>? items,\n    MedialistUpInfo? upInfo,\n  }) {\n    final result = create();\n    if (total != null) result.total = total;\n    if (hasMore != null) result.hasMore = hasMore;\n    if (offset != null) result.offset = offset;\n    if (items != null) result.items.addAll(items);\n    if (upInfo != null) result.upInfo = upInfo;\n    return result;\n  }\n\n  MedialistResp._();\n\n  factory MedialistResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MedialistResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MedialistResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'total')\n    ..aOB(2, _omitFieldNames ? '' : 'hasMore')\n    ..aOS(3, _omitFieldNames ? '' : 'offset')\n    ..pPM<MedialistItem>(4, _omitFieldNames ? '' : 'items',\n        subBuilder: MedialistItem.create)\n    ..aOM<MedialistUpInfo>(5, _omitFieldNames ? '' : 'upInfo',\n        subBuilder: MedialistUpInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MedialistResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MedialistResp copyWith(void Function(MedialistResp) updates) =>\n      super.copyWith((message) => updates(message as MedialistResp))\n          as MedialistResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MedialistResp create() => MedialistResp._();\n  @$core.override\n  MedialistResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MedialistResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MedialistResp>(create);\n  static MedialistResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get total => $_getI64(0);\n  @$pb.TagNumber(1)\n  set total($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTotal() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTotal() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get hasMore => $_getBF(1);\n  @$pb.TagNumber(2)\n  set hasMore($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHasMore() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHasMore() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get offset => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set offset($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasOffset() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearOffset() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<MedialistItem> get items => $_getList(3);\n\n  @$pb.TagNumber(5)\n  MedialistUpInfo get upInfo => $_getN(4);\n  @$pb.TagNumber(5)\n  set upInfo(MedialistUpInfo value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasUpInfo() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearUpInfo() => $_clearField(5);\n  @$pb.TagNumber(5)\n  MedialistUpInfo ensureUpInfo() => $_ensure(4);\n}\n\nclass MedialistUpInfo extends $pb.GeneratedMessage {\n  factory MedialistUpInfo({\n    $fixnum.Int64? mid,\n    $core.String? avatar,\n    $fixnum.Int64? fans,\n    $core.String? name,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (avatar != null) result.avatar = avatar;\n    if (fans != null) result.fans = fans;\n    if (name != null) result.name = name;\n    return result;\n  }\n\n  MedialistUpInfo._();\n\n  factory MedialistUpInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MedialistUpInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MedialistUpInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aOS(2, _omitFieldNames ? '' : 'avatar')\n    ..aInt64(3, _omitFieldNames ? '' : 'fans')\n    ..aOS(4, _omitFieldNames ? '' : 'name')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MedialistUpInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MedialistUpInfo copyWith(void Function(MedialistUpInfo) updates) =>\n      super.copyWith((message) => updates(message as MedialistUpInfo))\n          as MedialistUpInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MedialistUpInfo create() => MedialistUpInfo._();\n  @$core.override\n  MedialistUpInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MedialistUpInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MedialistUpInfo>(create);\n  static MedialistUpInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get avatar => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set avatar($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAvatar() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAvatar() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get fans => $_getI64(2);\n  @$pb.TagNumber(3)\n  set fans($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFans() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFans() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get name => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set name($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasName() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearName() => $_clearField(4);\n}\n\nclass MenuDeleteReq extends $pb.GeneratedMessage {\n  factory MenuDeleteReq({\n    $fixnum.Int64? id,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    return result;\n  }\n\n  MenuDeleteReq._();\n\n  factory MenuDeleteReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MenuDeleteReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MenuDeleteReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MenuDeleteReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MenuDeleteReq copyWith(void Function(MenuDeleteReq) updates) =>\n      super.copyWith((message) => updates(message as MenuDeleteReq))\n          as MenuDeleteReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MenuDeleteReq create() => MenuDeleteReq._();\n  @$core.override\n  MenuDeleteReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MenuDeleteReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MenuDeleteReq>(create);\n  static MenuDeleteReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n}\n\nclass MenuDeleteResp extends $pb.GeneratedMessage {\n  factory MenuDeleteResp({\n    $core.String? message,\n  }) {\n    final result = create();\n    if (message != null) result.message = message;\n    return result;\n  }\n\n  MenuDeleteResp._();\n\n  factory MenuDeleteResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MenuDeleteResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MenuDeleteResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'message')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MenuDeleteResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MenuDeleteResp copyWith(void Function(MenuDeleteResp) updates) =>\n      super.copyWith((message) => updates(message as MenuDeleteResp))\n          as MenuDeleteResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MenuDeleteResp create() => MenuDeleteResp._();\n  @$core.override\n  MenuDeleteResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MenuDeleteResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MenuDeleteResp>(create);\n  static MenuDeleteResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get message => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set message($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMessage() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMessage() => $_clearField(1);\n}\n\nclass MenuEditReq extends $pb.GeneratedMessage {\n  factory MenuEditReq({\n    $fixnum.Int64? id,\n    $core.String? title,\n    $core.String? desc,\n    $core.int? isPublic,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (title != null) result.title = title;\n    if (desc != null) result.desc = desc;\n    if (isPublic != null) result.isPublic = isPublic;\n    return result;\n  }\n\n  MenuEditReq._();\n\n  factory MenuEditReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MenuEditReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MenuEditReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'desc')\n    ..aI(4, _omitFieldNames ? '' : 'isPublic')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MenuEditReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MenuEditReq copyWith(void Function(MenuEditReq) updates) =>\n      super.copyWith((message) => updates(message as MenuEditReq))\n          as MenuEditReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MenuEditReq create() => MenuEditReq._();\n  @$core.override\n  MenuEditReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MenuEditReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MenuEditReq>(create);\n  static MenuEditReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get desc => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set desc($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDesc() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDesc() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get isPublic => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set isPublic($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIsPublic() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIsPublic() => $_clearField(4);\n}\n\nclass MenuEditResp extends $pb.GeneratedMessage {\n  factory MenuEditResp({\n    $core.String? message,\n  }) {\n    final result = create();\n    if (message != null) result.message = message;\n    return result;\n  }\n\n  MenuEditResp._();\n\n  factory MenuEditResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MenuEditResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MenuEditResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'message')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MenuEditResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MenuEditResp copyWith(void Function(MenuEditResp) updates) =>\n      super.copyWith((message) => updates(message as MenuEditResp))\n          as MenuEditResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MenuEditResp create() => MenuEditResp._();\n  @$core.override\n  MenuEditResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MenuEditResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MenuEditResp>(create);\n  static MenuEditResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get message => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set message($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMessage() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMessage() => $_clearField(1);\n}\n\nclass MenuSubscribeReq extends $pb.GeneratedMessage {\n  factory MenuSubscribeReq({\n    MenuSubscribeReq_SubscribeAction? action,\n    $fixnum.Int64? targetId,\n  }) {\n    final result = create();\n    if (action != null) result.action = action;\n    if (targetId != null) result.targetId = targetId;\n    return result;\n  }\n\n  MenuSubscribeReq._();\n\n  factory MenuSubscribeReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MenuSubscribeReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MenuSubscribeReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aE<MenuSubscribeReq_SubscribeAction>(1, _omitFieldNames ? '' : 'action',\n        enumValues: MenuSubscribeReq_SubscribeAction.values)\n    ..aInt64(2, _omitFieldNames ? '' : 'targetId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MenuSubscribeReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MenuSubscribeReq copyWith(void Function(MenuSubscribeReq) updates) =>\n      super.copyWith((message) => updates(message as MenuSubscribeReq))\n          as MenuSubscribeReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MenuSubscribeReq create() => MenuSubscribeReq._();\n  @$core.override\n  MenuSubscribeReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MenuSubscribeReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MenuSubscribeReq>(create);\n  static MenuSubscribeReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  MenuSubscribeReq_SubscribeAction get action => $_getN(0);\n  @$pb.TagNumber(1)\n  set action(MenuSubscribeReq_SubscribeAction value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAction() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAction() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get targetId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set targetId($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTargetId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTargetId() => $_clearField(2);\n}\n\nclass MenuSubscribeResp extends $pb.GeneratedMessage {\n  factory MenuSubscribeResp({\n    $core.String? message,\n  }) {\n    final result = create();\n    if (message != null) result.message = message;\n    return result;\n  }\n\n  MenuSubscribeResp._();\n\n  factory MenuSubscribeResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MenuSubscribeResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MenuSubscribeResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'message')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MenuSubscribeResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MenuSubscribeResp copyWith(void Function(MenuSubscribeResp) updates) =>\n      super.copyWith((message) => updates(message as MenuSubscribeResp))\n          as MenuSubscribeResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MenuSubscribeResp create() => MenuSubscribeResp._();\n  @$core.override\n  MenuSubscribeResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MenuSubscribeResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MenuSubscribeResp>(create);\n  static MenuSubscribeResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get message => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set message($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMessage() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMessage() => $_clearField(1);\n}\n\nclass MusicMenu extends $pb.GeneratedMessage {\n  factory MusicMenu({\n    $fixnum.Int64? id,\n    $core.int? menuType,\n    $core.String? title,\n    $core.String? desc,\n    $core.String? cover,\n    MusicMenuAuthor? owner,\n    $core.int? state,\n    $fixnum.Int64? attr,\n    MusicMenuStat? stat,\n    $fixnum.Int64? total,\n    $fixnum.Int64? ctime,\n    $core.String? uri,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (menuType != null) result.menuType = menuType;\n    if (title != null) result.title = title;\n    if (desc != null) result.desc = desc;\n    if (cover != null) result.cover = cover;\n    if (owner != null) result.owner = owner;\n    if (state != null) result.state = state;\n    if (attr != null) result.attr = attr;\n    if (stat != null) result.stat = stat;\n    if (total != null) result.total = total;\n    if (ctime != null) result.ctime = ctime;\n    if (uri != null) result.uri = uri;\n    return result;\n  }\n\n  MusicMenu._();\n\n  factory MusicMenu.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MusicMenu.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MusicMenu',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aI(2, _omitFieldNames ? '' : 'menuType')\n    ..aOS(3, _omitFieldNames ? '' : 'title')\n    ..aOS(4, _omitFieldNames ? '' : 'desc')\n    ..aOS(5, _omitFieldNames ? '' : 'cover')\n    ..aOM<MusicMenuAuthor>(6, _omitFieldNames ? '' : 'owner',\n        subBuilder: MusicMenuAuthor.create)\n    ..aI(7, _omitFieldNames ? '' : 'state')\n    ..aInt64(8, _omitFieldNames ? '' : 'attr')\n    ..aOM<MusicMenuStat>(9, _omitFieldNames ? '' : 'stat',\n        subBuilder: MusicMenuStat.create)\n    ..aInt64(10, _omitFieldNames ? '' : 'total')\n    ..aInt64(11, _omitFieldNames ? '' : 'ctime')\n    ..aOS(12, _omitFieldNames ? '' : 'uri')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MusicMenu clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MusicMenu copyWith(void Function(MusicMenu) updates) =>\n      super.copyWith((message) => updates(message as MusicMenu)) as MusicMenu;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MusicMenu create() => MusicMenu._();\n  @$core.override\n  MusicMenu createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MusicMenu getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<MusicMenu>(create);\n  static MusicMenu? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get menuType => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set menuType($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMenuType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMenuType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get title => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set title($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get desc => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set desc($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDesc() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDesc() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get cover => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set cover($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCover() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCover() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  MusicMenuAuthor get owner => $_getN(5);\n  @$pb.TagNumber(6)\n  set owner(MusicMenuAuthor value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasOwner() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearOwner() => $_clearField(6);\n  @$pb.TagNumber(6)\n  MusicMenuAuthor ensureOwner() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $core.int get state => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set state($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasState() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearState() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get attr => $_getI64(7);\n  @$pb.TagNumber(8)\n  set attr($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasAttr() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearAttr() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  MusicMenuStat get stat => $_getN(8);\n  @$pb.TagNumber(9)\n  set stat(MusicMenuStat value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasStat() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearStat() => $_clearField(9);\n  @$pb.TagNumber(9)\n  MusicMenuStat ensureStat() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  $fixnum.Int64 get total => $_getI64(9);\n  @$pb.TagNumber(10)\n  set total($fixnum.Int64 value) => $_setInt64(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasTotal() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearTotal() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $fixnum.Int64 get ctime => $_getI64(10);\n  @$pb.TagNumber(11)\n  set ctime($fixnum.Int64 value) => $_setInt64(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasCtime() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearCtime() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get uri => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set uri($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasUri() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearUri() => $_clearField(12);\n}\n\nclass MusicMenuAuthor extends $pb.GeneratedMessage {\n  factory MusicMenuAuthor({\n    $fixnum.Int64? mid,\n    $core.String? name,\n    $core.String? avatar,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (name != null) result.name = name;\n    if (avatar != null) result.avatar = avatar;\n    return result;\n  }\n\n  MusicMenuAuthor._();\n\n  factory MusicMenuAuthor.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MusicMenuAuthor.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MusicMenuAuthor',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'avatar')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MusicMenuAuthor clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MusicMenuAuthor copyWith(void Function(MusicMenuAuthor) updates) =>\n      super.copyWith((message) => updates(message as MusicMenuAuthor))\n          as MusicMenuAuthor;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MusicMenuAuthor create() => MusicMenuAuthor._();\n  @$core.override\n  MusicMenuAuthor createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MusicMenuAuthor getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MusicMenuAuthor>(create);\n  static MusicMenuAuthor? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get avatar => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set avatar($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAvatar() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAvatar() => $_clearField(3);\n}\n\nclass MusicMenuStat extends $pb.GeneratedMessage {\n  factory MusicMenuStat({\n    $fixnum.Int64? play,\n    $fixnum.Int64? reply,\n  }) {\n    final result = create();\n    if (play != null) result.play = play;\n    if (reply != null) result.reply = reply;\n    return result;\n  }\n\n  MusicMenuStat._();\n\n  factory MusicMenuStat.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MusicMenuStat.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MusicMenuStat',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'play')\n    ..aInt64(2, _omitFieldNames ? '' : 'reply')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MusicMenuStat clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MusicMenuStat copyWith(void Function(MusicMenuStat) updates) =>\n      super.copyWith((message) => updates(message as MusicMenuStat))\n          as MusicMenuStat;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MusicMenuStat create() => MusicMenuStat._();\n  @$core.override\n  MusicMenuStat createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MusicMenuStat getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MusicMenuStat>(create);\n  static MusicMenuStat? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get play => $_getI64(0);\n  @$pb.TagNumber(1)\n  set play($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPlay() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPlay() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get reply => $_getI64(1);\n  @$pb.TagNumber(2)\n  set reply($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasReply() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearReply() => $_clearField(2);\n}\n\nclass MusicSubTab extends $pb.GeneratedMessage {\n  factory MusicSubTab({\n    $core.String? name,\n    $core.int? tabType,\n    $fixnum.Int64? total,\n  }) {\n    final result = create();\n    if (name != null) result.name = name;\n    if (tabType != null) result.tabType = tabType;\n    if (total != null) result.total = total;\n    return result;\n  }\n\n  MusicSubTab._();\n\n  factory MusicSubTab.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MusicSubTab.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MusicSubTab',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'name')\n    ..aI(2, _omitFieldNames ? '' : 'tabType')\n    ..aInt64(3, _omitFieldNames ? '' : 'total')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MusicSubTab clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MusicSubTab copyWith(void Function(MusicSubTab) updates) =>\n      super.copyWith((message) => updates(message as MusicSubTab))\n          as MusicSubTab;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MusicSubTab create() => MusicSubTab._();\n  @$core.override\n  MusicSubTab createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MusicSubTab getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MusicSubTab>(create);\n  static MusicSubTab? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get name => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set name($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasName() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearName() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get tabType => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set tabType($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTabType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTabType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get total => $_getI64(2);\n  @$pb.TagNumber(3)\n  set total($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTotal() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTotal() => $_clearField(3);\n}\n\nclass PageOption extends $pb.GeneratedMessage {\n  factory PageOption({\n    $core.int? pageSize,\n    PageOption_Direction? direction,\n    PlayItem? lastItem,\n  }) {\n    final result = create();\n    if (pageSize != null) result.pageSize = pageSize;\n    if (direction != null) result.direction = direction;\n    if (lastItem != null) result.lastItem = lastItem;\n    return result;\n  }\n\n  PageOption._();\n\n  factory PageOption.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PageOption.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PageOption',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'pageSize')\n    ..aE<PageOption_Direction>(2, _omitFieldNames ? '' : 'direction',\n        enumValues: PageOption_Direction.values)\n    ..aOM<PlayItem>(3, _omitFieldNames ? '' : 'lastItem',\n        subBuilder: PlayItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PageOption clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PageOption copyWith(void Function(PageOption) updates) =>\n      super.copyWith((message) => updates(message as PageOption)) as PageOption;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PageOption create() => PageOption._();\n  @$core.override\n  PageOption createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PageOption getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PageOption>(create);\n  static PageOption? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get pageSize => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set pageSize($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPageSize() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPageSize() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  PageOption_Direction get direction => $_getN(1);\n  @$pb.TagNumber(2)\n  set direction(PageOption_Direction value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDirection() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDirection() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  PlayItem get lastItem => $_getN(2);\n  @$pb.TagNumber(3)\n  set lastItem(PlayItem value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLastItem() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLastItem() => $_clearField(3);\n  @$pb.TagNumber(3)\n  PlayItem ensureLastItem() => $_ensure(2);\n}\n\nclass PickArchive extends $pb.GeneratedMessage {\n  factory PickArchive({\n    PlayItem? item,\n    $core.String? title,\n    PickArchiveAuthor? owner,\n    $core.String? cover,\n    $fixnum.Int64? duration,\n    $core.int? parts,\n    $core.int? statView,\n    $core.int? statReply,\n    $core.int? state,\n    $core.String? message,\n    $core.bool? useStatViewVt,\n    $core.String? statViewVtText,\n  }) {\n    final result = create();\n    if (item != null) result.item = item;\n    if (title != null) result.title = title;\n    if (owner != null) result.owner = owner;\n    if (cover != null) result.cover = cover;\n    if (duration != null) result.duration = duration;\n    if (parts != null) result.parts = parts;\n    if (statView != null) result.statView = statView;\n    if (statReply != null) result.statReply = statReply;\n    if (state != null) result.state = state;\n    if (message != null) result.message = message;\n    if (useStatViewVt != null) result.useStatViewVt = useStatViewVt;\n    if (statViewVtText != null) result.statViewVtText = statViewVtText;\n    return result;\n  }\n\n  PickArchive._();\n\n  factory PickArchive.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PickArchive.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PickArchive',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOM<PlayItem>(1, _omitFieldNames ? '' : 'item',\n        subBuilder: PlayItem.create)\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOM<PickArchiveAuthor>(3, _omitFieldNames ? '' : 'owner',\n        subBuilder: PickArchiveAuthor.create)\n    ..aOS(4, _omitFieldNames ? '' : 'cover')\n    ..aInt64(5, _omitFieldNames ? '' : 'duration')\n    ..aI(6, _omitFieldNames ? '' : 'parts')\n    ..aI(7, _omitFieldNames ? '' : 'statView')\n    ..aI(8, _omitFieldNames ? '' : 'statReply')\n    ..aI(9, _omitFieldNames ? '' : 'state')\n    ..aOS(10, _omitFieldNames ? '' : 'message')\n    ..aOB(11, _omitFieldNames ? '' : 'useStatViewVt')\n    ..aOS(12, _omitFieldNames ? '' : 'statViewVtText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PickArchive clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PickArchive copyWith(void Function(PickArchive) updates) =>\n      super.copyWith((message) => updates(message as PickArchive))\n          as PickArchive;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PickArchive create() => PickArchive._();\n  @$core.override\n  PickArchive createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PickArchive getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PickArchive>(create);\n  static PickArchive? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PlayItem get item => $_getN(0);\n  @$pb.TagNumber(1)\n  set item(PlayItem value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasItem() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearItem() => $_clearField(1);\n  @$pb.TagNumber(1)\n  PlayItem ensureItem() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  PickArchiveAuthor get owner => $_getN(2);\n  @$pb.TagNumber(3)\n  set owner(PickArchiveAuthor value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasOwner() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearOwner() => $_clearField(3);\n  @$pb.TagNumber(3)\n  PickArchiveAuthor ensureOwner() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.String get cover => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set cover($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCover() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCover() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get duration => $_getI64(4);\n  @$pb.TagNumber(5)\n  set duration($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDuration() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDuration() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get parts => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set parts($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasParts() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearParts() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get statView => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set statView($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasStatView() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearStatView() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get statReply => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set statReply($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasStatReply() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearStatReply() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.int get state => $_getIZ(8);\n  @$pb.TagNumber(9)\n  set state($core.int value) => $_setSignedInt32(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasState() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearState() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get message => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set message($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasMessage() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearMessage() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.bool get useStatViewVt => $_getBF(10);\n  @$pb.TagNumber(11)\n  set useStatViewVt($core.bool value) => $_setBool(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasUseStatViewVt() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearUseStatViewVt() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get statViewVtText => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set statViewVtText($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasStatViewVtText() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearStatViewVtText() => $_clearField(12);\n}\n\nclass PickArchiveAuthor extends $pb.GeneratedMessage {\n  factory PickArchiveAuthor({\n    $fixnum.Int64? mid,\n    $core.String? name,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (name != null) result.name = name;\n    return result;\n  }\n\n  PickArchiveAuthor._();\n\n  factory PickArchiveAuthor.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PickArchiveAuthor.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PickArchiveAuthor',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PickArchiveAuthor clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PickArchiveAuthor copyWith(void Function(PickArchiveAuthor) updates) =>\n      super.copyWith((message) => updates(message as PickArchiveAuthor))\n          as PickArchiveAuthor;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PickArchiveAuthor create() => PickArchiveAuthor._();\n  @$core.override\n  PickArchiveAuthor createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PickArchiveAuthor getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PickArchiveAuthor>(create);\n  static PickArchiveAuthor? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n}\n\nclass PickCard extends $pb.GeneratedMessage {\n  factory PickCard({\n    $fixnum.Int64? pickId,\n    $fixnum.Int64? cardId,\n    $core.String? cardName,\n    $core.Iterable<CardModule>? modules,\n  }) {\n    final result = create();\n    if (pickId != null) result.pickId = pickId;\n    if (cardId != null) result.cardId = cardId;\n    if (cardName != null) result.cardName = cardName;\n    if (modules != null) result.modules.addAll(modules);\n    return result;\n  }\n\n  PickCard._();\n\n  factory PickCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PickCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PickCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'pickId')\n    ..aInt64(2, _omitFieldNames ? '' : 'cardId')\n    ..aOS(3, _omitFieldNames ? '' : 'cardName')\n    ..pPM<CardModule>(4, _omitFieldNames ? '' : 'modules',\n        subBuilder: CardModule.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PickCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PickCard copyWith(void Function(PickCard) updates) =>\n      super.copyWith((message) => updates(message as PickCard)) as PickCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PickCard create() => PickCard._();\n  @$core.override\n  PickCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PickCard getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PickCard>(create);\n  static PickCard? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get pickId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set pickId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPickId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPickId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get cardId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set cardId($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCardId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCardId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get cardName => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set cardName($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCardName() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCardName() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<CardModule> get modules => $_getList(3);\n}\n\nclass PickCardDetailReq extends $pb.GeneratedMessage {\n  factory PickCardDetailReq({\n    $fixnum.Int64? cardId,\n    $fixnum.Int64? pickId,\n  }) {\n    final result = create();\n    if (cardId != null) result.cardId = cardId;\n    if (pickId != null) result.pickId = pickId;\n    return result;\n  }\n\n  PickCardDetailReq._();\n\n  factory PickCardDetailReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PickCardDetailReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PickCardDetailReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'cardId')\n    ..aInt64(2, _omitFieldNames ? '' : 'pickId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PickCardDetailReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PickCardDetailReq copyWith(void Function(PickCardDetailReq) updates) =>\n      super.copyWith((message) => updates(message as PickCardDetailReq))\n          as PickCardDetailReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PickCardDetailReq create() => PickCardDetailReq._();\n  @$core.override\n  PickCardDetailReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PickCardDetailReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PickCardDetailReq>(create);\n  static PickCardDetailReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get cardId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set cardId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCardId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCardId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get pickId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set pickId($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPickId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPickId() => $_clearField(2);\n}\n\nclass PickCardDetailResp extends $pb.GeneratedMessage {\n  factory PickCardDetailResp({\n    $fixnum.Int64? cardId,\n    $fixnum.Int64? pickId,\n    $core.Iterable<CardModule>? modules,\n  }) {\n    final result = create();\n    if (cardId != null) result.cardId = cardId;\n    if (pickId != null) result.pickId = pickId;\n    if (modules != null) result.modules.addAll(modules);\n    return result;\n  }\n\n  PickCardDetailResp._();\n\n  factory PickCardDetailResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PickCardDetailResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PickCardDetailResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'cardId')\n    ..aInt64(2, _omitFieldNames ? '' : 'pickId')\n    ..pPM<CardModule>(3, _omitFieldNames ? '' : 'modules',\n        subBuilder: CardModule.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PickCardDetailResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PickCardDetailResp copyWith(void Function(PickCardDetailResp) updates) =>\n      super.copyWith((message) => updates(message as PickCardDetailResp))\n          as PickCardDetailResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PickCardDetailResp create() => PickCardDetailResp._();\n  @$core.override\n  PickCardDetailResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PickCardDetailResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PickCardDetailResp>(create);\n  static PickCardDetailResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get cardId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set cardId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCardId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCardId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get pickId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set pickId($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPickId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPickId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<CardModule> get modules => $_getList(2);\n}\n\nclass PickFeedReq extends $pb.GeneratedMessage {\n  factory PickFeedReq({\n    $fixnum.Int64? offset,\n  }) {\n    final result = create();\n    if (offset != null) result.offset = offset;\n    return result;\n  }\n\n  PickFeedReq._();\n\n  factory PickFeedReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PickFeedReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PickFeedReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'offset')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PickFeedReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PickFeedReq copyWith(void Function(PickFeedReq) updates) =>\n      super.copyWith((message) => updates(message as PickFeedReq))\n          as PickFeedReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PickFeedReq create() => PickFeedReq._();\n  @$core.override\n  PickFeedReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PickFeedReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PickFeedReq>(create);\n  static PickFeedReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get offset => $_getI64(0);\n  @$pb.TagNumber(1)\n  set offset($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOffset() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOffset() => $_clearField(1);\n}\n\nclass PickFeedResp extends $pb.GeneratedMessage {\n  factory PickFeedResp({\n    $fixnum.Int64? offset,\n    $core.Iterable<PickCard>? cards,\n  }) {\n    final result = create();\n    if (offset != null) result.offset = offset;\n    if (cards != null) result.cards.addAll(cards);\n    return result;\n  }\n\n  PickFeedResp._();\n\n  factory PickFeedResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PickFeedResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PickFeedResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'offset')\n    ..pPM<PickCard>(2, _omitFieldNames ? '' : 'cards',\n        subBuilder: PickCard.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PickFeedResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PickFeedResp copyWith(void Function(PickFeedResp) updates) =>\n      super.copyWith((message) => updates(message as PickFeedResp))\n          as PickFeedResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PickFeedResp create() => PickFeedResp._();\n  @$core.override\n  PickFeedResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PickFeedResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PickFeedResp>(create);\n  static PickFeedResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get offset => $_getI64(0);\n  @$pb.TagNumber(1)\n  set offset($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOffset() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOffset() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<PickCard> get cards => $_getList(1);\n}\n\nclass PkcmArchive extends $pb.GeneratedMessage {\n  factory PkcmArchive({\n    PickArchive? arc,\n    $core.String? pickReason,\n  }) {\n    final result = create();\n    if (arc != null) result.arc = arc;\n    if (pickReason != null) result.pickReason = pickReason;\n    return result;\n  }\n\n  PkcmArchive._();\n\n  factory PkcmArchive.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PkcmArchive.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PkcmArchive',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOM<PickArchive>(1, _omitFieldNames ? '' : 'arc',\n        subBuilder: PickArchive.create)\n    ..aOS(2, _omitFieldNames ? '' : 'pickReason')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PkcmArchive clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PkcmArchive copyWith(void Function(PkcmArchive) updates) =>\n      super.copyWith((message) => updates(message as PkcmArchive))\n          as PkcmArchive;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PkcmArchive create() => PkcmArchive._();\n  @$core.override\n  PkcmArchive createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PkcmArchive getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PkcmArchive>(create);\n  static PkcmArchive? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PickArchive get arc => $_getN(0);\n  @$pb.TagNumber(1)\n  set arc(PickArchive value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasArc() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearArc() => $_clearField(1);\n  @$pb.TagNumber(1)\n  PickArchive ensureArc() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get pickReason => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set pickReason($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPickReason() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPickReason() => $_clearField(2);\n}\n\nclass PkcmCenterButton extends $pb.GeneratedMessage {\n  factory PkcmCenterButton({\n    $core.String? iconHead,\n    $core.String? iconTail,\n    $core.String? title,\n    $core.String? uri,\n  }) {\n    final result = create();\n    if (iconHead != null) result.iconHead = iconHead;\n    if (iconTail != null) result.iconTail = iconTail;\n    if (title != null) result.title = title;\n    if (uri != null) result.uri = uri;\n    return result;\n  }\n\n  PkcmCenterButton._();\n\n  factory PkcmCenterButton.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PkcmCenterButton.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PkcmCenterButton',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'iconHead')\n    ..aOS(2, _omitFieldNames ? '' : 'iconTail')\n    ..aOS(3, _omitFieldNames ? '' : 'title')\n    ..aOS(4, _omitFieldNames ? '' : 'uri')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PkcmCenterButton clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PkcmCenterButton copyWith(void Function(PkcmCenterButton) updates) =>\n      super.copyWith((message) => updates(message as PkcmCenterButton))\n          as PkcmCenterButton;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PkcmCenterButton create() => PkcmCenterButton._();\n  @$core.override\n  PkcmCenterButton createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PkcmCenterButton getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PkcmCenterButton>(create);\n  static PkcmCenterButton? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get iconHead => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set iconHead($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIconHead() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIconHead() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get iconTail => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set iconTail($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIconTail() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIconTail() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get title => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set title($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get uri => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set uri($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUri() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUri() => $_clearField(4);\n}\n\nclass PkcmHeader extends $pb.GeneratedMessage {\n  factory PkcmHeader({\n    $core.String? title,\n    $core.String? desc,\n    $core.String? btnIcon,\n    $core.String? btnText,\n    $core.String? btnUri,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (desc != null) result.desc = desc;\n    if (btnIcon != null) result.btnIcon = btnIcon;\n    if (btnText != null) result.btnText = btnText;\n    if (btnUri != null) result.btnUri = btnUri;\n    return result;\n  }\n\n  PkcmHeader._();\n\n  factory PkcmHeader.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PkcmHeader.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PkcmHeader',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'desc')\n    ..aOS(3, _omitFieldNames ? '' : 'btnIcon')\n    ..aOS(4, _omitFieldNames ? '' : 'btnText')\n    ..aOS(5, _omitFieldNames ? '' : 'btnUri')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PkcmHeader clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PkcmHeader copyWith(void Function(PkcmHeader) updates) =>\n      super.copyWith((message) => updates(message as PkcmHeader)) as PkcmHeader;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PkcmHeader create() => PkcmHeader._();\n  @$core.override\n  PkcmHeader createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PkcmHeader getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PkcmHeader>(create);\n  static PkcmHeader? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get desc => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set desc($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDesc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDesc() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get btnIcon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set btnIcon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBtnIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBtnIcon() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get btnText => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set btnText($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBtnText() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBtnText() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get btnUri => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set btnUri($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBtnUri() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBtnUri() => $_clearField(5);\n}\n\nclass PlayActionReportReq extends $pb.GeneratedMessage {\n  factory PlayActionReportReq({\n    PlayItem? item,\n    $core.String? fromSpmid,\n  }) {\n    final result = create();\n    if (item != null) result.item = item;\n    if (fromSpmid != null) result.fromSpmid = fromSpmid;\n    return result;\n  }\n\n  PlayActionReportReq._();\n\n  factory PlayActionReportReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayActionReportReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayActionReportReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOM<PlayItem>(1, _omitFieldNames ? '' : 'item',\n        subBuilder: PlayItem.create)\n    ..aOS(2, _omitFieldNames ? '' : 'fromSpmid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayActionReportReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayActionReportReq copyWith(void Function(PlayActionReportReq) updates) =>\n      super.copyWith((message) => updates(message as PlayActionReportReq))\n          as PlayActionReportReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayActionReportReq create() => PlayActionReportReq._();\n  @$core.override\n  PlayActionReportReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayActionReportReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayActionReportReq>(create);\n  static PlayActionReportReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PlayItem get item => $_getN(0);\n  @$pb.TagNumber(1)\n  set item(PlayItem value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasItem() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearItem() => $_clearField(1);\n  @$pb.TagNumber(1)\n  PlayItem ensureItem() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get fromSpmid => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set fromSpmid($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFromSpmid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFromSpmid() => $_clearField(2);\n}\n\nclass PlayDASH extends $pb.GeneratedMessage {\n  factory PlayDASH({\n    $core.int? duration,\n    $core.double? minBufferTime,\n    $core.Iterable<DashItem>? audio,\n  }) {\n    final result = create();\n    if (duration != null) result.duration = duration;\n    if (minBufferTime != null) result.minBufferTime = minBufferTime;\n    if (audio != null) result.audio.addAll(audio);\n    return result;\n  }\n\n  PlayDASH._();\n\n  factory PlayDASH.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayDASH.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayDASH',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'duration')\n    ..aD(2, _omitFieldNames ? '' : 'minBufferTime',\n        fieldType: $pb.PbFieldType.OF)\n    ..pPM<DashItem>(3, _omitFieldNames ? '' : 'audio',\n        subBuilder: DashItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayDASH clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayDASH copyWith(void Function(PlayDASH) updates) =>\n      super.copyWith((message) => updates(message as PlayDASH)) as PlayDASH;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayDASH create() => PlayDASH._();\n  @$core.override\n  PlayDASH createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayDASH getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PlayDASH>(create);\n  static PlayDASH? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get duration => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set duration($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDuration() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDuration() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.double get minBufferTime => $_getN(1);\n  @$pb.TagNumber(2)\n  set minBufferTime($core.double value) => $_setFloat(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMinBufferTime() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMinBufferTime() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<DashItem> get audio => $_getList(2);\n}\n\nclass PlayHistoryAddReq extends $pb.GeneratedMessage {\n  factory PlayHistoryAddReq({\n    PlayItem? item,\n    $fixnum.Int64? progress,\n    $fixnum.Int64? duration,\n    $core.int? playStyle,\n  }) {\n    final result = create();\n    if (item != null) result.item = item;\n    if (progress != null) result.progress = progress;\n    if (duration != null) result.duration = duration;\n    if (playStyle != null) result.playStyle = playStyle;\n    return result;\n  }\n\n  PlayHistoryAddReq._();\n\n  factory PlayHistoryAddReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayHistoryAddReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayHistoryAddReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOM<PlayItem>(1, _omitFieldNames ? '' : 'item',\n        subBuilder: PlayItem.create)\n    ..aInt64(2, _omitFieldNames ? '' : 'progress')\n    ..aInt64(3, _omitFieldNames ? '' : 'duration')\n    ..aI(4, _omitFieldNames ? '' : 'playStyle')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayHistoryAddReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayHistoryAddReq copyWith(void Function(PlayHistoryAddReq) updates) =>\n      super.copyWith((message) => updates(message as PlayHistoryAddReq))\n          as PlayHistoryAddReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayHistoryAddReq create() => PlayHistoryAddReq._();\n  @$core.override\n  PlayHistoryAddReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayHistoryAddReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayHistoryAddReq>(create);\n  static PlayHistoryAddReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PlayItem get item => $_getN(0);\n  @$pb.TagNumber(1)\n  set item(PlayItem value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasItem() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearItem() => $_clearField(1);\n  @$pb.TagNumber(1)\n  PlayItem ensureItem() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get progress => $_getI64(1);\n  @$pb.TagNumber(2)\n  set progress($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasProgress() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearProgress() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get duration => $_getI64(2);\n  @$pb.TagNumber(3)\n  set duration($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDuration() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDuration() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get playStyle => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set playStyle($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPlayStyle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPlayStyle() => $_clearField(4);\n}\n\nclass PlayHistoryDelReq extends $pb.GeneratedMessage {\n  factory PlayHistoryDelReq({\n    $core.Iterable<PlayItem>? items,\n    $core.bool? truncate,\n  }) {\n    final result = create();\n    if (items != null) result.items.addAll(items);\n    if (truncate != null) result.truncate = truncate;\n    return result;\n  }\n\n  PlayHistoryDelReq._();\n\n  factory PlayHistoryDelReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayHistoryDelReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayHistoryDelReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..pPM<PlayItem>(1, _omitFieldNames ? '' : 'items',\n        subBuilder: PlayItem.create)\n    ..aOB(2, _omitFieldNames ? '' : 'truncate')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayHistoryDelReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayHistoryDelReq copyWith(void Function(PlayHistoryDelReq) updates) =>\n      super.copyWith((message) => updates(message as PlayHistoryDelReq))\n          as PlayHistoryDelReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayHistoryDelReq create() => PlayHistoryDelReq._();\n  @$core.override\n  PlayHistoryDelReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayHistoryDelReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayHistoryDelReq>(create);\n  static PlayHistoryDelReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<PlayItem> get items => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.bool get truncate => $_getBF(1);\n  @$pb.TagNumber(2)\n  set truncate($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTruncate() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTruncate() => $_clearField(2);\n}\n\nclass PlayHistoryReq extends $pb.GeneratedMessage {\n  factory PlayHistoryReq({\n    PageOption? pageOpt,\n    $fixnum.Int64? localTodayZero,\n    $4.Pagination? pagination,\n  }) {\n    final result = create();\n    if (pageOpt != null) result.pageOpt = pageOpt;\n    if (localTodayZero != null) result.localTodayZero = localTodayZero;\n    if (pagination != null) result.pagination = pagination;\n    return result;\n  }\n\n  PlayHistoryReq._();\n\n  factory PlayHistoryReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayHistoryReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayHistoryReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOM<PageOption>(1, _omitFieldNames ? '' : 'pageOpt',\n        subBuilder: PageOption.create)\n    ..aInt64(2, _omitFieldNames ? '' : 'localTodayZero')\n    ..aOM<$4.Pagination>(3, _omitFieldNames ? '' : 'pagination',\n        subBuilder: $4.Pagination.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayHistoryReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayHistoryReq copyWith(void Function(PlayHistoryReq) updates) =>\n      super.copyWith((message) => updates(message as PlayHistoryReq))\n          as PlayHistoryReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayHistoryReq create() => PlayHistoryReq._();\n  @$core.override\n  PlayHistoryReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayHistoryReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayHistoryReq>(create);\n  static PlayHistoryReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PageOption get pageOpt => $_getN(0);\n  @$pb.TagNumber(1)\n  set pageOpt(PageOption value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPageOpt() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPageOpt() => $_clearField(1);\n  @$pb.TagNumber(1)\n  PageOption ensurePageOpt() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get localTodayZero => $_getI64(1);\n  @$pb.TagNumber(2)\n  set localTodayZero($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLocalTodayZero() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLocalTodayZero() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $4.Pagination get pagination => $_getN(2);\n  @$pb.TagNumber(3)\n  set pagination($4.Pagination value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPagination() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPagination() => $_clearField(3);\n  @$pb.TagNumber(3)\n  $4.Pagination ensurePagination() => $_ensure(2);\n}\n\nclass PlayHistoryResp extends $pb.GeneratedMessage {\n  factory PlayHistoryResp({\n    $core.int? total,\n    $core.bool? reachEnd,\n    $core.Iterable<DetailItem>? list,\n    $4.PaginationReply? paginationReply,\n  }) {\n    final result = create();\n    if (total != null) result.total = total;\n    if (reachEnd != null) result.reachEnd = reachEnd;\n    if (list != null) result.list.addAll(list);\n    if (paginationReply != null) result.paginationReply = paginationReply;\n    return result;\n  }\n\n  PlayHistoryResp._();\n\n  factory PlayHistoryResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayHistoryResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayHistoryResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'total')\n    ..aOB(2, _omitFieldNames ? '' : 'reachEnd')\n    ..pPM<DetailItem>(3, _omitFieldNames ? '' : 'list',\n        subBuilder: DetailItem.create)\n    ..aOM<$4.PaginationReply>(4, _omitFieldNames ? '' : 'paginationReply',\n        subBuilder: $4.PaginationReply.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayHistoryResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayHistoryResp copyWith(void Function(PlayHistoryResp) updates) =>\n      super.copyWith((message) => updates(message as PlayHistoryResp))\n          as PlayHistoryResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayHistoryResp create() => PlayHistoryResp._();\n  @$core.override\n  PlayHistoryResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayHistoryResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayHistoryResp>(create);\n  static PlayHistoryResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get total => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set total($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTotal() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTotal() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get reachEnd => $_getBF(1);\n  @$pb.TagNumber(2)\n  set reachEnd($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasReachEnd() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearReachEnd() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<DetailItem> get list => $_getList(2);\n\n  @$pb.TagNumber(4)\n  $4.PaginationReply get paginationReply => $_getN(3);\n  @$pb.TagNumber(4)\n  set paginationReply($4.PaginationReply value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPaginationReply() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPaginationReply() => $_clearField(4);\n  @$pb.TagNumber(4)\n  $4.PaginationReply ensurePaginationReply() => $_ensure(3);\n}\n\nenum PlayInfo_Info { playUrl, playDash, notSet }\n\nclass PlayInfo extends $pb.GeneratedMessage {\n  factory PlayInfo({\n    $core.int? qn,\n    $core.String? format,\n    $core.int? qnType,\n    PlayURL? playUrl,\n    PlayDASH? playDash,\n    $core.int? fnver,\n    $core.int? fnval,\n    $core.Iterable<FormatDescription>? formats,\n    $core.int? videoCodecid,\n    $fixnum.Int64? length,\n    $core.int? code,\n    $core.String? message,\n    $fixnum.Int64? expireTime,\n    $5.VolumeInfo? volume,\n  }) {\n    final result = create();\n    if (qn != null) result.qn = qn;\n    if (format != null) result.format = format;\n    if (qnType != null) result.qnType = qnType;\n    if (playUrl != null) result.playUrl = playUrl;\n    if (playDash != null) result.playDash = playDash;\n    if (fnver != null) result.fnver = fnver;\n    if (fnval != null) result.fnval = fnval;\n    if (formats != null) result.formats.addAll(formats);\n    if (videoCodecid != null) result.videoCodecid = videoCodecid;\n    if (length != null) result.length = length;\n    if (code != null) result.code = code;\n    if (message != null) result.message = message;\n    if (expireTime != null) result.expireTime = expireTime;\n    if (volume != null) result.volume = volume;\n    return result;\n  }\n\n  PlayInfo._();\n\n  factory PlayInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, PlayInfo_Info> _PlayInfo_InfoByTag = {\n    4: PlayInfo_Info.playUrl,\n    5: PlayInfo_Info.playDash,\n    0: PlayInfo_Info.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [4, 5])\n    ..aI(1, _omitFieldNames ? '' : 'qn')\n    ..aOS(2, _omitFieldNames ? '' : 'format')\n    ..aI(3, _omitFieldNames ? '' : 'qnType')\n    ..aOM<PlayURL>(4, _omitFieldNames ? '' : 'playUrl',\n        subBuilder: PlayURL.create)\n    ..aOM<PlayDASH>(5, _omitFieldNames ? '' : 'playDash',\n        subBuilder: PlayDASH.create)\n    ..aI(6, _omitFieldNames ? '' : 'fnver')\n    ..aI(7, _omitFieldNames ? '' : 'fnval')\n    ..pPM<FormatDescription>(8, _omitFieldNames ? '' : 'formats',\n        subBuilder: FormatDescription.create)\n    ..aI(9, _omitFieldNames ? '' : 'videoCodecid')\n    ..aInt64(10, _omitFieldNames ? '' : 'length')\n    ..aI(11, _omitFieldNames ? '' : 'code')\n    ..aOS(12, _omitFieldNames ? '' : 'message')\n    ..aInt64(13, _omitFieldNames ? '' : 'expireTime')\n    ..aOM<$5.VolumeInfo>(14, _omitFieldNames ? '' : 'volume',\n        subBuilder: $5.VolumeInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayInfo copyWith(void Function(PlayInfo) updates) =>\n      super.copyWith((message) => updates(message as PlayInfo)) as PlayInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayInfo create() => PlayInfo._();\n  @$core.override\n  PlayInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PlayInfo>(create);\n  static PlayInfo? _defaultInstance;\n\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  PlayInfo_Info whichInfo() => _PlayInfo_InfoByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  void clearInfo() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  $core.int get qn => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set qn($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasQn() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearQn() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get format => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set format($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFormat() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFormat() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get qnType => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set qnType($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasQnType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearQnType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  PlayURL get playUrl => $_getN(3);\n  @$pb.TagNumber(4)\n  set playUrl(PlayURL value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPlayUrl() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPlayUrl() => $_clearField(4);\n  @$pb.TagNumber(4)\n  PlayURL ensurePlayUrl() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  PlayDASH get playDash => $_getN(4);\n  @$pb.TagNumber(5)\n  set playDash(PlayDASH value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPlayDash() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPlayDash() => $_clearField(5);\n  @$pb.TagNumber(5)\n  PlayDASH ensurePlayDash() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.int get fnver => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set fnver($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasFnver() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearFnver() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get fnval => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set fnval($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasFnval() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearFnval() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $pb.PbList<FormatDescription> get formats => $_getList(7);\n\n  @$pb.TagNumber(9)\n  $core.int get videoCodecid => $_getIZ(8);\n  @$pb.TagNumber(9)\n  set videoCodecid($core.int value) => $_setSignedInt32(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasVideoCodecid() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearVideoCodecid() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $fixnum.Int64 get length => $_getI64(9);\n  @$pb.TagNumber(10)\n  set length($fixnum.Int64 value) => $_setInt64(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasLength() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearLength() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.int get code => $_getIZ(10);\n  @$pb.TagNumber(11)\n  set code($core.int value) => $_setSignedInt32(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasCode() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearCode() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get message => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set message($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasMessage() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearMessage() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $fixnum.Int64 get expireTime => $_getI64(12);\n  @$pb.TagNumber(13)\n  set expireTime($fixnum.Int64 value) => $_setInt64(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasExpireTime() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearExpireTime() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $5.VolumeInfo get volume => $_getN(13);\n  @$pb.TagNumber(14)\n  set volume($5.VolumeInfo value) => $_setField(14, value);\n  @$pb.TagNumber(14)\n  $core.bool hasVolume() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearVolume() => $_clearField(14);\n  @$pb.TagNumber(14)\n  $5.VolumeInfo ensureVolume() => $_ensure(13);\n}\n\nclass PlayItem extends $pb.GeneratedMessage {\n  factory PlayItem({\n    $core.int? itemType,\n    $fixnum.Int64? oid,\n    $core.Iterable<$fixnum.Int64>? subId,\n    EventTracking? et,\n    $fixnum.Int64? pos,\n  }) {\n    final result = create();\n    if (itemType != null) result.itemType = itemType;\n    if (oid != null) result.oid = oid;\n    if (subId != null) result.subId.addAll(subId);\n    if (et != null) result.et = et;\n    if (pos != null) result.pos = pos;\n    return result;\n  }\n\n  PlayItem._();\n\n  factory PlayItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'itemType')\n    ..aInt64(3, _omitFieldNames ? '' : 'oid')\n    ..p<$fixnum.Int64>(4, _omitFieldNames ? '' : 'subId', $pb.PbFieldType.K6)\n    ..aOM<EventTracking>(5, _omitFieldNames ? '' : 'et',\n        subBuilder: EventTracking.create)\n    ..aInt64(6, _omitFieldNames ? '' : 'pos')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayItem copyWith(void Function(PlayItem) updates) =>\n      super.copyWith((message) => updates(message as PlayItem)) as PlayItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayItem create() => PlayItem._();\n  @$core.override\n  PlayItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayItem getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PlayItem>(create);\n  static PlayItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get itemType => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set itemType($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasItemType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearItemType() => $_clearField(1);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get oid => $_getI64(1);\n  @$pb.TagNumber(3)\n  set oid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(3)\n  $core.bool hasOid() => $_has(1);\n  @$pb.TagNumber(3)\n  void clearOid() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<$fixnum.Int64> get subId => $_getList(2);\n\n  @$pb.TagNumber(5)\n  EventTracking get et => $_getN(3);\n  @$pb.TagNumber(5)\n  set et(EventTracking value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasEt() => $_has(3);\n  @$pb.TagNumber(5)\n  void clearEt() => $_clearField(5);\n  @$pb.TagNumber(5)\n  EventTracking ensureEt() => $_ensure(3);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get pos => $_getI64(4);\n  @$pb.TagNumber(6)\n  set pos($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(6)\n  $core.bool hasPos() => $_has(4);\n  @$pb.TagNumber(6)\n  void clearPos() => $_clearField(6);\n}\n\nclass PlayURL extends $pb.GeneratedMessage {\n  factory PlayURL({\n    $core.Iterable<ResponseUrl>? durl,\n  }) {\n    final result = create();\n    if (durl != null) result.durl.addAll(durl);\n    return result;\n  }\n\n  PlayURL._();\n\n  factory PlayURL.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayURL.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayURL',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..pPM<ResponseUrl>(1, _omitFieldNames ? '' : 'durl',\n        subBuilder: ResponseUrl.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayURL clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayURL copyWith(void Function(PlayURL) updates) =>\n      super.copyWith((message) => updates(message as PlayURL)) as PlayURL;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayURL create() => PlayURL._();\n  @$core.override\n  PlayURL createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayURL getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PlayURL>(create);\n  static PlayURL? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<ResponseUrl> get durl => $_getList(0);\n}\n\nclass PlayURLReq extends $pb.GeneratedMessage {\n  factory PlayURLReq({\n    PlayItem? item,\n    $2.PlayerArgs? playerArgs,\n  }) {\n    final result = create();\n    if (item != null) result.item = item;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    return result;\n  }\n\n  PlayURLReq._();\n\n  factory PlayURLReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayURLReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayURLReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOM<PlayItem>(1, _omitFieldNames ? '' : 'item',\n        subBuilder: PlayItem.create)\n    ..aOM<$2.PlayerArgs>(2, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $2.PlayerArgs.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayURLReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayURLReq copyWith(void Function(PlayURLReq) updates) =>\n      super.copyWith((message) => updates(message as PlayURLReq)) as PlayURLReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayURLReq create() => PlayURLReq._();\n  @$core.override\n  PlayURLReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayURLReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayURLReq>(create);\n  static PlayURLReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PlayItem get item => $_getN(0);\n  @$pb.TagNumber(1)\n  set item(PlayItem value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasItem() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearItem() => $_clearField(1);\n  @$pb.TagNumber(1)\n  PlayItem ensureItem() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $2.PlayerArgs get playerArgs => $_getN(1);\n  @$pb.TagNumber(2)\n  set playerArgs($2.PlayerArgs value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPlayerArgs() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPlayerArgs() => $_clearField(2);\n  @$pb.TagNumber(2)\n  $2.PlayerArgs ensurePlayerArgs() => $_ensure(1);\n}\n\nclass PlayURLResp extends $pb.GeneratedMessage {\n  factory PlayURLResp({\n    PlayItem? item,\n    $core.int? playable,\n    $core.String? message,\n    $core.Iterable<$core.MapEntry<$fixnum.Int64, PlayInfo>>? playerInfo,\n  }) {\n    final result = create();\n    if (item != null) result.item = item;\n    if (playable != null) result.playable = playable;\n    if (message != null) result.message = message;\n    if (playerInfo != null) result.playerInfo.addEntries(playerInfo);\n    return result;\n  }\n\n  PlayURLResp._();\n\n  factory PlayURLResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayURLResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayURLResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOM<PlayItem>(1, _omitFieldNames ? '' : 'item',\n        subBuilder: PlayItem.create)\n    ..aI(2, _omitFieldNames ? '' : 'playable')\n    ..aOS(3, _omitFieldNames ? '' : 'message')\n    ..m<$fixnum.Int64, PlayInfo>(4, _omitFieldNames ? '' : 'playerInfo',\n        entryClassName: 'PlayURLResp.PlayerInfoEntry',\n        keyFieldType: $pb.PbFieldType.O6,\n        valueFieldType: $pb.PbFieldType.OM,\n        valueCreator: PlayInfo.create,\n        valueDefaultOrMaker: PlayInfo.getDefault,\n        packageName: const $pb.PackageName('bilibili.app.listener.v1'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayURLResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayURLResp copyWith(void Function(PlayURLResp) updates) =>\n      super.copyWith((message) => updates(message as PlayURLResp))\n          as PlayURLResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayURLResp create() => PlayURLResp._();\n  @$core.override\n  PlayURLResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayURLResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayURLResp>(create);\n  static PlayURLResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PlayItem get item => $_getN(0);\n  @$pb.TagNumber(1)\n  set item(PlayItem value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasItem() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearItem() => $_clearField(1);\n  @$pb.TagNumber(1)\n  PlayItem ensureItem() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.int get playable => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set playable($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPlayable() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPlayable() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get message => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set message($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasMessage() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearMessage() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $pb.PbMap<$fixnum.Int64, PlayInfo> get playerInfo => $_getMap(3);\n}\n\nenum PlaylistAddReq_Pos { after, head, tail, notSet }\n\nclass PlaylistAddReq extends $pb.GeneratedMessage {\n  factory PlaylistAddReq({\n    $core.Iterable<PlayItem>? items,\n    PlayItem? after,\n    $core.bool? head,\n    $core.bool? tail,\n  }) {\n    final result = create();\n    if (items != null) result.items.addAll(items);\n    if (after != null) result.after = after;\n    if (head != null) result.head = head;\n    if (tail != null) result.tail = tail;\n    return result;\n  }\n\n  PlaylistAddReq._();\n\n  factory PlaylistAddReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlaylistAddReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, PlaylistAddReq_Pos>\n      _PlaylistAddReq_PosByTag = {\n    2: PlaylistAddReq_Pos.after,\n    3: PlaylistAddReq_Pos.head,\n    4: PlaylistAddReq_Pos.tail,\n    0: PlaylistAddReq_Pos.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlaylistAddReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [2, 3, 4])\n    ..pPM<PlayItem>(1, _omitFieldNames ? '' : 'items',\n        subBuilder: PlayItem.create)\n    ..aOM<PlayItem>(2, _omitFieldNames ? '' : 'after',\n        subBuilder: PlayItem.create)\n    ..aOB(3, _omitFieldNames ? '' : 'head')\n    ..aOB(4, _omitFieldNames ? '' : 'tail')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlaylistAddReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlaylistAddReq copyWith(void Function(PlaylistAddReq) updates) =>\n      super.copyWith((message) => updates(message as PlaylistAddReq))\n          as PlaylistAddReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlaylistAddReq create() => PlaylistAddReq._();\n  @$core.override\n  PlaylistAddReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlaylistAddReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlaylistAddReq>(create);\n  static PlaylistAddReq? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  PlaylistAddReq_Pos whichPos() => _PlaylistAddReq_PosByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  void clearPos() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  $pb.PbList<PlayItem> get items => $_getList(0);\n\n  @$pb.TagNumber(2)\n  PlayItem get after => $_getN(1);\n  @$pb.TagNumber(2)\n  set after(PlayItem value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAfter() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAfter() => $_clearField(2);\n  @$pb.TagNumber(2)\n  PlayItem ensureAfter() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.bool get head => $_getBF(2);\n  @$pb.TagNumber(3)\n  set head($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasHead() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearHead() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get tail => $_getBF(3);\n  @$pb.TagNumber(4)\n  set tail($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTail() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTail() => $_clearField(4);\n}\n\nclass PlaylistDelReq extends $pb.GeneratedMessage {\n  factory PlaylistDelReq({\n    $core.Iterable<PlayItem>? items,\n    $core.bool? truncate,\n  }) {\n    final result = create();\n    if (items != null) result.items.addAll(items);\n    if (truncate != null) result.truncate = truncate;\n    return result;\n  }\n\n  PlaylistDelReq._();\n\n  factory PlaylistDelReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlaylistDelReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlaylistDelReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..pPM<PlayItem>(1, _omitFieldNames ? '' : 'items',\n        subBuilder: PlayItem.create)\n    ..aOB(2, _omitFieldNames ? '' : 'truncate')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlaylistDelReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlaylistDelReq copyWith(void Function(PlaylistDelReq) updates) =>\n      super.copyWith((message) => updates(message as PlaylistDelReq))\n          as PlaylistDelReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlaylistDelReq create() => PlaylistDelReq._();\n  @$core.override\n  PlaylistDelReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlaylistDelReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlaylistDelReq>(create);\n  static PlaylistDelReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<PlayItem> get items => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.bool get truncate => $_getBF(1);\n  @$pb.TagNumber(2)\n  set truncate($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTruncate() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTruncate() => $_clearField(2);\n}\n\nclass PlaylistOffset extends $pb.GeneratedMessage {\n  factory PlaylistOffset({\n    PlaylistOffset_PlaylistScrollDirection? direction,\n    PlayItem? lastItem,\n    RandomOrderStatus? randomState,\n    SortOption? sortOpt,\n  }) {\n    final result = create();\n    if (direction != null) result.direction = direction;\n    if (lastItem != null) result.lastItem = lastItem;\n    if (randomState != null) result.randomState = randomState;\n    if (sortOpt != null) result.sortOpt = sortOpt;\n    return result;\n  }\n\n  PlaylistOffset._();\n\n  factory PlaylistOffset.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlaylistOffset.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlaylistOffset',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aE<PlaylistOffset_PlaylistScrollDirection>(\n        1, _omitFieldNames ? '' : 'direction',\n        enumValues: PlaylistOffset_PlaylistScrollDirection.values)\n    ..aOM<PlayItem>(2, _omitFieldNames ? '' : 'lastItem',\n        subBuilder: PlayItem.create)\n    ..aOM<RandomOrderStatus>(3, _omitFieldNames ? '' : 'randomState',\n        subBuilder: RandomOrderStatus.create)\n    ..aOM<SortOption>(4, _omitFieldNames ? '' : 'sortOpt',\n        subBuilder: SortOption.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlaylistOffset clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlaylistOffset copyWith(void Function(PlaylistOffset) updates) =>\n      super.copyWith((message) => updates(message as PlaylistOffset))\n          as PlaylistOffset;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlaylistOffset create() => PlaylistOffset._();\n  @$core.override\n  PlaylistOffset createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlaylistOffset getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlaylistOffset>(create);\n  static PlaylistOffset? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PlaylistOffset_PlaylistScrollDirection get direction => $_getN(0);\n  @$pb.TagNumber(1)\n  set direction(PlaylistOffset_PlaylistScrollDirection value) =>\n      $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDirection() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDirection() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  PlayItem get lastItem => $_getN(1);\n  @$pb.TagNumber(2)\n  set lastItem(PlayItem value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLastItem() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLastItem() => $_clearField(2);\n  @$pb.TagNumber(2)\n  PlayItem ensureLastItem() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  RandomOrderStatus get randomState => $_getN(2);\n  @$pb.TagNumber(3)\n  set randomState(RandomOrderStatus value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRandomState() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRandomState() => $_clearField(3);\n  @$pb.TagNumber(3)\n  RandomOrderStatus ensureRandomState() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  SortOption get sortOpt => $_getN(3);\n  @$pb.TagNumber(4)\n  set sortOpt(SortOption value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSortOpt() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSortOpt() => $_clearField(4);\n  @$pb.TagNumber(4)\n  SortOption ensureSortOpt() => $_ensure(3);\n}\n\nclass PlaylistReq extends $pb.GeneratedMessage {\n  factory PlaylistReq({\n    PlaylistSource? from,\n    $fixnum.Int64? id,\n    PlayItem? anchor,\n    PageOption? pageOpt,\n    $2.PlayerArgs? playerArgs,\n    $fixnum.Int64? extraId,\n    SortOption? sortOpt,\n    $4.Pagination? pagination,\n  }) {\n    final result = create();\n    if (from != null) result.from = from;\n    if (id != null) result.id = id;\n    if (anchor != null) result.anchor = anchor;\n    if (pageOpt != null) result.pageOpt = pageOpt;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    if (extraId != null) result.extraId = extraId;\n    if (sortOpt != null) result.sortOpt = sortOpt;\n    if (pagination != null) result.pagination = pagination;\n    return result;\n  }\n\n  PlaylistReq._();\n\n  factory PlaylistReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlaylistReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlaylistReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aE<PlaylistSource>(1, _omitFieldNames ? '' : 'from',\n        enumValues: PlaylistSource.values)\n    ..aInt64(2, _omitFieldNames ? '' : 'id')\n    ..aOM<PlayItem>(3, _omitFieldNames ? '' : 'anchor',\n        subBuilder: PlayItem.create)\n    ..aOM<PageOption>(4, _omitFieldNames ? '' : 'pageOpt',\n        subBuilder: PageOption.create)\n    ..aOM<$2.PlayerArgs>(5, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $2.PlayerArgs.create)\n    ..aInt64(6, _omitFieldNames ? '' : 'extraId')\n    ..aOM<SortOption>(7, _omitFieldNames ? '' : 'sortOpt',\n        subBuilder: SortOption.create)\n    ..aOM<$4.Pagination>(8, _omitFieldNames ? '' : 'pagination',\n        subBuilder: $4.Pagination.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlaylistReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlaylistReq copyWith(void Function(PlaylistReq) updates) =>\n      super.copyWith((message) => updates(message as PlaylistReq))\n          as PlaylistReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlaylistReq create() => PlaylistReq._();\n  @$core.override\n  PlaylistReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlaylistReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlaylistReq>(create);\n  static PlaylistReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PlaylistSource get from => $_getN(0);\n  @$pb.TagNumber(1)\n  set from(PlaylistSource value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFrom() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFrom() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get id => $_getI64(1);\n  @$pb.TagNumber(2)\n  set id($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  PlayItem get anchor => $_getN(2);\n  @$pb.TagNumber(3)\n  set anchor(PlayItem value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAnchor() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAnchor() => $_clearField(3);\n  @$pb.TagNumber(3)\n  PlayItem ensureAnchor() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  PageOption get pageOpt => $_getN(3);\n  @$pb.TagNumber(4)\n  set pageOpt(PageOption value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPageOpt() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPageOpt() => $_clearField(4);\n  @$pb.TagNumber(4)\n  PageOption ensurePageOpt() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $2.PlayerArgs get playerArgs => $_getN(4);\n  @$pb.TagNumber(5)\n  set playerArgs($2.PlayerArgs value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPlayerArgs() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPlayerArgs() => $_clearField(5);\n  @$pb.TagNumber(5)\n  $2.PlayerArgs ensurePlayerArgs() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get extraId => $_getI64(5);\n  @$pb.TagNumber(6)\n  set extraId($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasExtraId() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearExtraId() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  SortOption get sortOpt => $_getN(6);\n  @$pb.TagNumber(7)\n  set sortOpt(SortOption value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasSortOpt() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearSortOpt() => $_clearField(7);\n  @$pb.TagNumber(7)\n  SortOption ensureSortOpt() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  $4.Pagination get pagination => $_getN(7);\n  @$pb.TagNumber(8)\n  set pagination($4.Pagination value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasPagination() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearPagination() => $_clearField(8);\n  @$pb.TagNumber(8)\n  $4.Pagination ensurePagination() => $_ensure(7);\n}\n\nclass PlaylistResp extends $pb.GeneratedMessage {\n  factory PlaylistResp({\n    $core.int? total,\n    $core.bool? reachStart,\n    $core.bool? reachEnd,\n    $core.Iterable<DetailItem>? list,\n    PlayItem? lastPlay,\n    $fixnum.Int64? lastProgress,\n    $4.PaginationReply? paginationReply,\n  }) {\n    final result = create();\n    if (total != null) result.total = total;\n    if (reachStart != null) result.reachStart = reachStart;\n    if (reachEnd != null) result.reachEnd = reachEnd;\n    if (list != null) result.list.addAll(list);\n    if (lastPlay != null) result.lastPlay = lastPlay;\n    if (lastProgress != null) result.lastProgress = lastProgress;\n    if (paginationReply != null) result.paginationReply = paginationReply;\n    return result;\n  }\n\n  PlaylistResp._();\n\n  factory PlaylistResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlaylistResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlaylistResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'total')\n    ..aOB(2, _omitFieldNames ? '' : 'reachStart')\n    ..aOB(3, _omitFieldNames ? '' : 'reachEnd')\n    ..pPM<DetailItem>(4, _omitFieldNames ? '' : 'list',\n        subBuilder: DetailItem.create)\n    ..aOM<PlayItem>(5, _omitFieldNames ? '' : 'lastPlay',\n        subBuilder: PlayItem.create)\n    ..aInt64(6, _omitFieldNames ? '' : 'lastProgress')\n    ..aOM<$4.PaginationReply>(7, _omitFieldNames ? '' : 'paginationReply',\n        subBuilder: $4.PaginationReply.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlaylistResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlaylistResp copyWith(void Function(PlaylistResp) updates) =>\n      super.copyWith((message) => updates(message as PlaylistResp))\n          as PlaylistResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlaylistResp create() => PlaylistResp._();\n  @$core.override\n  PlaylistResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlaylistResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlaylistResp>(create);\n  static PlaylistResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get total => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set total($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTotal() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTotal() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get reachStart => $_getBF(1);\n  @$pb.TagNumber(2)\n  set reachStart($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasReachStart() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearReachStart() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get reachEnd => $_getBF(2);\n  @$pb.TagNumber(3)\n  set reachEnd($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasReachEnd() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearReachEnd() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<DetailItem> get list => $_getList(3);\n\n  @$pb.TagNumber(5)\n  PlayItem get lastPlay => $_getN(4);\n  @$pb.TagNumber(5)\n  set lastPlay(PlayItem value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasLastPlay() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearLastPlay() => $_clearField(5);\n  @$pb.TagNumber(5)\n  PlayItem ensureLastPlay() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get lastProgress => $_getI64(5);\n  @$pb.TagNumber(6)\n  set lastProgress($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasLastProgress() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearLastProgress() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $4.PaginationReply get paginationReply => $_getN(6);\n  @$pb.TagNumber(7)\n  set paginationReply($4.PaginationReply value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasPaginationReply() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearPaginationReply() => $_clearField(7);\n  @$pb.TagNumber(7)\n  $4.PaginationReply ensurePaginationReply() => $_ensure(6);\n}\n\nclass RandomOrderStatus extends $pb.GeneratedMessage {\n  factory RandomOrderStatus({\n    $core.Iterable<$fixnum.Int64>? exposedPos,\n  }) {\n    final result = create();\n    if (exposedPos != null) result.exposedPos.addAll(exposedPos);\n    return result;\n  }\n\n  RandomOrderStatus._();\n\n  factory RandomOrderStatus.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RandomOrderStatus.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RandomOrderStatus',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..p<$fixnum.Int64>(\n        1, _omitFieldNames ? '' : 'exposedPos', $pb.PbFieldType.K6)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RandomOrderStatus clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RandomOrderStatus copyWith(void Function(RandomOrderStatus) updates) =>\n      super.copyWith((message) => updates(message as RandomOrderStatus))\n          as RandomOrderStatus;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RandomOrderStatus create() => RandomOrderStatus._();\n  @$core.override\n  RandomOrderStatus createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RandomOrderStatus getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RandomOrderStatus>(create);\n  static RandomOrderStatus? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<$fixnum.Int64> get exposedPos => $_getList(0);\n}\n\nclass RcmdOffset extends $pb.GeneratedMessage {\n  factory RcmdOffset({\n    $fixnum.Int64? rcmdFrom,\n    $fixnum.Int64? id,\n    $core.int? page,\n    $core.String? sessionId,\n    $core.String? fromTrackid,\n  }) {\n    final result = create();\n    if (rcmdFrom != null) result.rcmdFrom = rcmdFrom;\n    if (id != null) result.id = id;\n    if (page != null) result.page = page;\n    if (sessionId != null) result.sessionId = sessionId;\n    if (fromTrackid != null) result.fromTrackid = fromTrackid;\n    return result;\n  }\n\n  RcmdOffset._();\n\n  factory RcmdOffset.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RcmdOffset.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RcmdOffset',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'rcmdFrom')\n    ..aInt64(2, _omitFieldNames ? '' : 'id')\n    ..aI(3, _omitFieldNames ? '' : 'page')\n    ..aOS(4, _omitFieldNames ? '' : 'sessionId')\n    ..aOS(5, _omitFieldNames ? '' : 'fromTrackid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RcmdOffset clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RcmdOffset copyWith(void Function(RcmdOffset) updates) =>\n      super.copyWith((message) => updates(message as RcmdOffset)) as RcmdOffset;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RcmdOffset create() => RcmdOffset._();\n  @$core.override\n  RcmdOffset createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RcmdOffset getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RcmdOffset>(create);\n  static RcmdOffset? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get rcmdFrom => $_getI64(0);\n  @$pb.TagNumber(1)\n  set rcmdFrom($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasRcmdFrom() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRcmdFrom() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get id => $_getI64(1);\n  @$pb.TagNumber(2)\n  set id($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get page => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set page($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPage() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPage() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get sessionId => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set sessionId($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSessionId() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSessionId() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get fromTrackid => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set fromTrackid($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasFromTrackid() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearFromTrackid() => $_clearField(5);\n}\n\nclass RcmdPlaylistReq extends $pb.GeneratedMessage {\n  factory RcmdPlaylistReq({\n    RcmdPlaylistReq_RcmdFrom? from,\n    $fixnum.Int64? id,\n    $core.bool? needHistory,\n    $core.bool? needTopCards,\n    $2.PlayerArgs? playerArgs,\n    $4.Pagination? page,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? annotations,\n  }) {\n    final result = create();\n    if (from != null) result.from = from;\n    if (id != null) result.id = id;\n    if (needHistory != null) result.needHistory = needHistory;\n    if (needTopCards != null) result.needTopCards = needTopCards;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    if (page != null) result.page = page;\n    if (annotations != null) result.annotations.addEntries(annotations);\n    return result;\n  }\n\n  RcmdPlaylistReq._();\n\n  factory RcmdPlaylistReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RcmdPlaylistReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RcmdPlaylistReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aE<RcmdPlaylistReq_RcmdFrom>(1, _omitFieldNames ? '' : 'from',\n        enumValues: RcmdPlaylistReq_RcmdFrom.values)\n    ..aInt64(2, _omitFieldNames ? '' : 'id')\n    ..aOB(3, _omitFieldNames ? '' : 'needHistory')\n    ..aOB(4, _omitFieldNames ? '' : 'needTopCards')\n    ..aOM<$2.PlayerArgs>(5, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $2.PlayerArgs.create)\n    ..aOM<$4.Pagination>(6, _omitFieldNames ? '' : 'page',\n        subBuilder: $4.Pagination.create)\n    ..m<$core.String, $core.String>(7, _omitFieldNames ? '' : 'annotations',\n        entryClassName: 'RcmdPlaylistReq.AnnotationsEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.listener.v1'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RcmdPlaylistReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RcmdPlaylistReq copyWith(void Function(RcmdPlaylistReq) updates) =>\n      super.copyWith((message) => updates(message as RcmdPlaylistReq))\n          as RcmdPlaylistReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RcmdPlaylistReq create() => RcmdPlaylistReq._();\n  @$core.override\n  RcmdPlaylistReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RcmdPlaylistReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RcmdPlaylistReq>(create);\n  static RcmdPlaylistReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  RcmdPlaylistReq_RcmdFrom get from => $_getN(0);\n  @$pb.TagNumber(1)\n  set from(RcmdPlaylistReq_RcmdFrom value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFrom() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFrom() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get id => $_getI64(1);\n  @$pb.TagNumber(2)\n  set id($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get needHistory => $_getBF(2);\n  @$pb.TagNumber(3)\n  set needHistory($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasNeedHistory() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearNeedHistory() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get needTopCards => $_getBF(3);\n  @$pb.TagNumber(4)\n  set needTopCards($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasNeedTopCards() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearNeedTopCards() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $2.PlayerArgs get playerArgs => $_getN(4);\n  @$pb.TagNumber(5)\n  set playerArgs($2.PlayerArgs value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPlayerArgs() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPlayerArgs() => $_clearField(5);\n  @$pb.TagNumber(5)\n  $2.PlayerArgs ensurePlayerArgs() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $4.Pagination get page => $_getN(5);\n  @$pb.TagNumber(6)\n  set page($4.Pagination value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasPage() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearPage() => $_clearField(6);\n  @$pb.TagNumber(6)\n  $4.Pagination ensurePage() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $pb.PbMap<$core.String, $core.String> get annotations => $_getMap(6);\n}\n\nclass RcmdPlaylistResp extends $pb.GeneratedMessage {\n  factory RcmdPlaylistResp({\n    $core.Iterable<DetailItem>? list,\n    $fixnum.Int64? historyLen,\n    $core.Iterable<TopCard>? topCards,\n    $4.PaginationReply? nextPage,\n  }) {\n    final result = create();\n    if (list != null) result.list.addAll(list);\n    if (historyLen != null) result.historyLen = historyLen;\n    if (topCards != null) result.topCards.addAll(topCards);\n    if (nextPage != null) result.nextPage = nextPage;\n    return result;\n  }\n\n  RcmdPlaylistResp._();\n\n  factory RcmdPlaylistResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RcmdPlaylistResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RcmdPlaylistResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..pPM<DetailItem>(1, _omitFieldNames ? '' : 'list',\n        subBuilder: DetailItem.create)\n    ..aInt64(2, _omitFieldNames ? '' : 'historyLen')\n    ..pPM<TopCard>(3, _omitFieldNames ? '' : 'topCards',\n        subBuilder: TopCard.create)\n    ..aOM<$4.PaginationReply>(4, _omitFieldNames ? '' : 'nextPage',\n        subBuilder: $4.PaginationReply.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RcmdPlaylistResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RcmdPlaylistResp copyWith(void Function(RcmdPlaylistResp) updates) =>\n      super.copyWith((message) => updates(message as RcmdPlaylistResp))\n          as RcmdPlaylistResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RcmdPlaylistResp create() => RcmdPlaylistResp._();\n  @$core.override\n  RcmdPlaylistResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RcmdPlaylistResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RcmdPlaylistResp>(create);\n  static RcmdPlaylistResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<DetailItem> get list => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get historyLen => $_getI64(1);\n  @$pb.TagNumber(2)\n  set historyLen($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHistoryLen() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHistoryLen() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<TopCard> get topCards => $_getList(2);\n\n  @$pb.TagNumber(4)\n  $4.PaginationReply get nextPage => $_getN(3);\n  @$pb.TagNumber(4)\n  set nextPage($4.PaginationReply value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasNextPage() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearNextPage() => $_clearField(4);\n  @$pb.TagNumber(4)\n  $4.PaginationReply ensureNextPage() => $_ensure(3);\n}\n\nclass ResponseUrl extends $pb.GeneratedMessage {\n  factory ResponseUrl({\n    $core.int? order,\n    $fixnum.Int64? length,\n    $fixnum.Int64? size,\n    $core.String? ahead,\n    $core.String? vhead,\n    $core.String? url,\n    $core.Iterable<$core.String>? backupUrl,\n    $core.String? md5,\n  }) {\n    final result = create();\n    if (order != null) result.order = order;\n    if (length != null) result.length = length;\n    if (size != null) result.size = size;\n    if (ahead != null) result.ahead = ahead;\n    if (vhead != null) result.vhead = vhead;\n    if (url != null) result.url = url;\n    if (backupUrl != null) result.backupUrl.addAll(backupUrl);\n    if (md5 != null) result.md5 = md5;\n    return result;\n  }\n\n  ResponseUrl._();\n\n  factory ResponseUrl.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ResponseUrl.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ResponseUrl',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'order')\n    ..aInt64(2, _omitFieldNames ? '' : 'length')\n    ..aInt64(3, _omitFieldNames ? '' : 'size')\n    ..aOS(4, _omitFieldNames ? '' : 'ahead')\n    ..aOS(5, _omitFieldNames ? '' : 'vhead')\n    ..aOS(6, _omitFieldNames ? '' : 'url')\n    ..pPS(7, _omitFieldNames ? '' : 'backupUrl')\n    ..aOS(8, _omitFieldNames ? '' : 'md5')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ResponseUrl clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ResponseUrl copyWith(void Function(ResponseUrl) updates) =>\n      super.copyWith((message) => updates(message as ResponseUrl))\n          as ResponseUrl;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ResponseUrl create() => ResponseUrl._();\n  @$core.override\n  ResponseUrl createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ResponseUrl getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ResponseUrl>(create);\n  static ResponseUrl? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get order => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set order($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOrder() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOrder() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get length => $_getI64(1);\n  @$pb.TagNumber(2)\n  set length($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLength() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLength() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get size => $_getI64(2);\n  @$pb.TagNumber(3)\n  set size($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSize() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSize() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get ahead => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set ahead($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasAhead() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearAhead() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get vhead => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set vhead($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasVhead() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearVhead() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get url => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set url($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasUrl() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearUrl() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $pb.PbList<$core.String> get backupUrl => $_getList(6);\n\n  @$pb.TagNumber(8)\n  $core.String get md5 => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set md5($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasMd5() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearMd5() => $_clearField(8);\n}\n\nclass SortOption extends $pb.GeneratedMessage {\n  factory SortOption({\n    ListOrder? order,\n    ListSortField? sortField,\n    $core.bool? isSwitching,\n  }) {\n    final result = create();\n    if (order != null) result.order = order;\n    if (sortField != null) result.sortField = sortField;\n    if (isSwitching != null) result.isSwitching = isSwitching;\n    return result;\n  }\n\n  SortOption._();\n\n  factory SortOption.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SortOption.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SortOption',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aE<ListOrder>(1, _omitFieldNames ? '' : 'order',\n        enumValues: ListOrder.values)\n    ..aE<ListSortField>(2, _omitFieldNames ? '' : 'sortField',\n        enumValues: ListSortField.values)\n    ..aOB(3, _omitFieldNames ? '' : 'isSwitching')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SortOption clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SortOption copyWith(void Function(SortOption) updates) =>\n      super.copyWith((message) => updates(message as SortOption)) as SortOption;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SortOption create() => SortOption._();\n  @$core.override\n  SortOption createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SortOption getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SortOption>(create);\n  static SortOption? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  ListOrder get order => $_getN(0);\n  @$pb.TagNumber(1)\n  set order(ListOrder value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOrder() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOrder() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  ListSortField get sortField => $_getN(1);\n  @$pb.TagNumber(2)\n  set sortField(ListSortField value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSortField() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSortField() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get isSwitching => $_getBF(2);\n  @$pb.TagNumber(3)\n  set isSwitching($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIsSwitching() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIsSwitching() => $_clearField(3);\n}\n\nclass ThumbUpReq extends $pb.GeneratedMessage {\n  factory ThumbUpReq({\n    PlayItem? item,\n    ThumbUpReq_ThumbType? action,\n  }) {\n    final result = create();\n    if (item != null) result.item = item;\n    if (action != null) result.action = action;\n    return result;\n  }\n\n  ThumbUpReq._();\n\n  factory ThumbUpReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThumbUpReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThumbUpReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOM<PlayItem>(1, _omitFieldNames ? '' : 'item',\n        subBuilder: PlayItem.create)\n    ..aE<ThumbUpReq_ThumbType>(2, _omitFieldNames ? '' : 'action',\n        enumValues: ThumbUpReq_ThumbType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThumbUpReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThumbUpReq copyWith(void Function(ThumbUpReq) updates) =>\n      super.copyWith((message) => updates(message as ThumbUpReq)) as ThumbUpReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThumbUpReq create() => ThumbUpReq._();\n  @$core.override\n  ThumbUpReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThumbUpReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThumbUpReq>(create);\n  static ThumbUpReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PlayItem get item => $_getN(0);\n  @$pb.TagNumber(1)\n  set item(PlayItem value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasItem() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearItem() => $_clearField(1);\n  @$pb.TagNumber(1)\n  PlayItem ensureItem() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  ThumbUpReq_ThumbType get action => $_getN(1);\n  @$pb.TagNumber(2)\n  set action(ThumbUpReq_ThumbType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAction() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAction() => $_clearField(2);\n}\n\nclass ThumbUpResp extends $pb.GeneratedMessage {\n  factory ThumbUpResp({\n    $core.String? message,\n  }) {\n    final result = create();\n    if (message != null) result.message = message;\n    return result;\n  }\n\n  ThumbUpResp._();\n\n  factory ThumbUpResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ThumbUpResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ThumbUpResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'message')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThumbUpResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ThumbUpResp copyWith(void Function(ThumbUpResp) updates) =>\n      super.copyWith((message) => updates(message as ThumbUpResp))\n          as ThumbUpResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ThumbUpResp create() => ThumbUpResp._();\n  @$core.override\n  ThumbUpResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ThumbUpResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ThumbUpResp>(create);\n  static ThumbUpResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get message => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set message($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMessage() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMessage() => $_clearField(1);\n}\n\nenum TopCard_Card { listenHistory, favFolder, upRecall, pickToday, notSet }\n\nclass TopCard extends $pb.GeneratedMessage {\n  factory TopCard({\n    $core.String? title,\n    TopCard_PlayStrategy? playStyle,\n    TopCardType? cardType,\n    TpcdHistory? listenHistory,\n    TpcdFavFolder? favFolder,\n    TpcdUpRecall? upRecall,\n    TpcdPickToday? pickToday,\n    $fixnum.Int64? pos,\n    $core.String? titleIcon,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (playStyle != null) result.playStyle = playStyle;\n    if (cardType != null) result.cardType = cardType;\n    if (listenHistory != null) result.listenHistory = listenHistory;\n    if (favFolder != null) result.favFolder = favFolder;\n    if (upRecall != null) result.upRecall = upRecall;\n    if (pickToday != null) result.pickToday = pickToday;\n    if (pos != null) result.pos = pos;\n    if (titleIcon != null) result.titleIcon = titleIcon;\n    return result;\n  }\n\n  TopCard._();\n\n  factory TopCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TopCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, TopCard_Card> _TopCard_CardByTag = {\n    4: TopCard_Card.listenHistory,\n    5: TopCard_Card.favFolder,\n    6: TopCard_Card.upRecall,\n    7: TopCard_Card.pickToday,\n    0: TopCard_Card.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TopCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [4, 5, 6, 7])\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aE<TopCard_PlayStrategy>(2, _omitFieldNames ? '' : 'playStyle',\n        enumValues: TopCard_PlayStrategy.values)\n    ..aE<TopCardType>(3, _omitFieldNames ? '' : 'cardType',\n        enumValues: TopCardType.values)\n    ..aOM<TpcdHistory>(4, _omitFieldNames ? '' : 'listenHistory',\n        subBuilder: TpcdHistory.create)\n    ..aOM<TpcdFavFolder>(5, _omitFieldNames ? '' : 'favFolder',\n        subBuilder: TpcdFavFolder.create)\n    ..aOM<TpcdUpRecall>(6, _omitFieldNames ? '' : 'upRecall',\n        subBuilder: TpcdUpRecall.create)\n    ..aOM<TpcdPickToday>(7, _omitFieldNames ? '' : 'pickToday',\n        subBuilder: TpcdPickToday.create)\n    ..aInt64(8, _omitFieldNames ? '' : 'pos')\n    ..aOS(9, _omitFieldNames ? '' : 'titleIcon')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TopCard copyWith(void Function(TopCard) updates) =>\n      super.copyWith((message) => updates(message as TopCard)) as TopCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TopCard create() => TopCard._();\n  @$core.override\n  TopCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TopCard getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TopCard>(create);\n  static TopCard? _defaultInstance;\n\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(7)\n  TopCard_Card whichCard() => _TopCard_CardByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(7)\n  void clearCard() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  TopCard_PlayStrategy get playStyle => $_getN(1);\n  @$pb.TagNumber(2)\n  set playStyle(TopCard_PlayStrategy value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPlayStyle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPlayStyle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  TopCardType get cardType => $_getN(2);\n  @$pb.TagNumber(3)\n  set cardType(TopCardType value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCardType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCardType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  TpcdHistory get listenHistory => $_getN(3);\n  @$pb.TagNumber(4)\n  set listenHistory(TpcdHistory value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasListenHistory() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearListenHistory() => $_clearField(4);\n  @$pb.TagNumber(4)\n  TpcdHistory ensureListenHistory() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  TpcdFavFolder get favFolder => $_getN(4);\n  @$pb.TagNumber(5)\n  set favFolder(TpcdFavFolder value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasFavFolder() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearFavFolder() => $_clearField(5);\n  @$pb.TagNumber(5)\n  TpcdFavFolder ensureFavFolder() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  TpcdUpRecall get upRecall => $_getN(5);\n  @$pb.TagNumber(6)\n  set upRecall(TpcdUpRecall value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasUpRecall() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearUpRecall() => $_clearField(6);\n  @$pb.TagNumber(6)\n  TpcdUpRecall ensureUpRecall() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  TpcdPickToday get pickToday => $_getN(6);\n  @$pb.TagNumber(7)\n  set pickToday(TpcdPickToday value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasPickToday() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearPickToday() => $_clearField(7);\n  @$pb.TagNumber(7)\n  TpcdPickToday ensurePickToday() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get pos => $_getI64(7);\n  @$pb.TagNumber(8)\n  set pos($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasPos() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearPos() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get titleIcon => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set titleIcon($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasTitleIcon() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearTitleIcon() => $_clearField(9);\n}\n\nclass TpcdFavFolder extends $pb.GeneratedMessage {\n  factory TpcdFavFolder({\n    DetailItem? item,\n    $core.String? text,\n    $core.String? pic,\n    $fixnum.Int64? fid,\n    $core.int? folderType,\n  }) {\n    final result = create();\n    if (item != null) result.item = item;\n    if (text != null) result.text = text;\n    if (pic != null) result.pic = pic;\n    if (fid != null) result.fid = fid;\n    if (folderType != null) result.folderType = folderType;\n    return result;\n  }\n\n  TpcdFavFolder._();\n\n  factory TpcdFavFolder.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TpcdFavFolder.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TpcdFavFolder',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOM<DetailItem>(1, _omitFieldNames ? '' : 'item',\n        subBuilder: DetailItem.create)\n    ..aOS(2, _omitFieldNames ? '' : 'text')\n    ..aOS(3, _omitFieldNames ? '' : 'pic')\n    ..aInt64(4, _omitFieldNames ? '' : 'fid')\n    ..aI(5, _omitFieldNames ? '' : 'folderType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TpcdFavFolder clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TpcdFavFolder copyWith(void Function(TpcdFavFolder) updates) =>\n      super.copyWith((message) => updates(message as TpcdFavFolder))\n          as TpcdFavFolder;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TpcdFavFolder create() => TpcdFavFolder._();\n  @$core.override\n  TpcdFavFolder createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TpcdFavFolder getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<TpcdFavFolder>(create);\n  static TpcdFavFolder? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  DetailItem get item => $_getN(0);\n  @$pb.TagNumber(1)\n  set item(DetailItem value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasItem() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearItem() => $_clearField(1);\n  @$pb.TagNumber(1)\n  DetailItem ensureItem() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get pic => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set pic($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPic() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPic() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get fid => $_getI64(3);\n  @$pb.TagNumber(4)\n  set fid($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFid() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get folderType => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set folderType($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasFolderType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearFolderType() => $_clearField(5);\n}\n\nclass TpcdHistory extends $pb.GeneratedMessage {\n  factory TpcdHistory({\n    DetailItem? item,\n    $core.String? text,\n    $core.String? pic,\n  }) {\n    final result = create();\n    if (item != null) result.item = item;\n    if (text != null) result.text = text;\n    if (pic != null) result.pic = pic;\n    return result;\n  }\n\n  TpcdHistory._();\n\n  factory TpcdHistory.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TpcdHistory.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TpcdHistory',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOM<DetailItem>(1, _omitFieldNames ? '' : 'item',\n        subBuilder: DetailItem.create)\n    ..aOS(2, _omitFieldNames ? '' : 'text')\n    ..aOS(3, _omitFieldNames ? '' : 'pic')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TpcdHistory clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TpcdHistory copyWith(void Function(TpcdHistory) updates) =>\n      super.copyWith((message) => updates(message as TpcdHistory))\n          as TpcdHistory;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TpcdHistory create() => TpcdHistory._();\n  @$core.override\n  TpcdHistory createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TpcdHistory getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<TpcdHistory>(create);\n  static TpcdHistory? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  DetailItem get item => $_getN(0);\n  @$pb.TagNumber(1)\n  set item(DetailItem value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasItem() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearItem() => $_clearField(1);\n  @$pb.TagNumber(1)\n  DetailItem ensureItem() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get pic => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set pic($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPic() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPic() => $_clearField(3);\n}\n\nclass TpcdPickToday extends $pb.GeneratedMessage {\n  factory TpcdPickToday({\n    DetailItem? item,\n    $core.String? text,\n    $core.String? pic,\n    $fixnum.Int64? pickId,\n    $fixnum.Int64? pickCardId,\n  }) {\n    final result = create();\n    if (item != null) result.item = item;\n    if (text != null) result.text = text;\n    if (pic != null) result.pic = pic;\n    if (pickId != null) result.pickId = pickId;\n    if (pickCardId != null) result.pickCardId = pickCardId;\n    return result;\n  }\n\n  TpcdPickToday._();\n\n  factory TpcdPickToday.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TpcdPickToday.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TpcdPickToday',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOM<DetailItem>(1, _omitFieldNames ? '' : 'item',\n        subBuilder: DetailItem.create)\n    ..aOS(2, _omitFieldNames ? '' : 'text')\n    ..aOS(3, _omitFieldNames ? '' : 'pic')\n    ..aInt64(4, _omitFieldNames ? '' : 'pickId')\n    ..aInt64(5, _omitFieldNames ? '' : 'pickCardId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TpcdPickToday clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TpcdPickToday copyWith(void Function(TpcdPickToday) updates) =>\n      super.copyWith((message) => updates(message as TpcdPickToday))\n          as TpcdPickToday;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TpcdPickToday create() => TpcdPickToday._();\n  @$core.override\n  TpcdPickToday createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TpcdPickToday getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<TpcdPickToday>(create);\n  static TpcdPickToday? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  DetailItem get item => $_getN(0);\n  @$pb.TagNumber(1)\n  set item(DetailItem value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasItem() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearItem() => $_clearField(1);\n  @$pb.TagNumber(1)\n  DetailItem ensureItem() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get pic => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set pic($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPic() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPic() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get pickId => $_getI64(3);\n  @$pb.TagNumber(4)\n  set pickId($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPickId() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPickId() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get pickCardId => $_getI64(4);\n  @$pb.TagNumber(5)\n  set pickCardId($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPickCardId() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPickCardId() => $_clearField(5);\n}\n\nclass TpcdUpRecall extends $pb.GeneratedMessage {\n  factory TpcdUpRecall({\n    $fixnum.Int64? upMid,\n    $core.String? text,\n    $core.String? avatar,\n    $fixnum.Int64? medialistType,\n    $fixnum.Int64? medialistBizId,\n    DetailItem? item,\n  }) {\n    final result = create();\n    if (upMid != null) result.upMid = upMid;\n    if (text != null) result.text = text;\n    if (avatar != null) result.avatar = avatar;\n    if (medialistType != null) result.medialistType = medialistType;\n    if (medialistBizId != null) result.medialistBizId = medialistBizId;\n    if (item != null) result.item = item;\n    return result;\n  }\n\n  TpcdUpRecall._();\n\n  factory TpcdUpRecall.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TpcdUpRecall.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TpcdUpRecall',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'upMid')\n    ..aOS(2, _omitFieldNames ? '' : 'text')\n    ..aOS(3, _omitFieldNames ? '' : 'avatar')\n    ..aInt64(4, _omitFieldNames ? '' : 'medialistType')\n    ..aInt64(5, _omitFieldNames ? '' : 'medialistBizId')\n    ..aOM<DetailItem>(6, _omitFieldNames ? '' : 'item',\n        subBuilder: DetailItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TpcdUpRecall clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TpcdUpRecall copyWith(void Function(TpcdUpRecall) updates) =>\n      super.copyWith((message) => updates(message as TpcdUpRecall))\n          as TpcdUpRecall;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TpcdUpRecall create() => TpcdUpRecall._();\n  @$core.override\n  TpcdUpRecall createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TpcdUpRecall getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<TpcdUpRecall>(create);\n  static TpcdUpRecall? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get upMid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set upMid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUpMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUpMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get avatar => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set avatar($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAvatar() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAvatar() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get medialistType => $_getI64(3);\n  @$pb.TagNumber(4)\n  set medialistType($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasMedialistType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearMedialistType() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get medialistBizId => $_getI64(4);\n  @$pb.TagNumber(5)\n  set medialistBizId($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasMedialistBizId() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearMedialistBizId() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  DetailItem get item => $_getN(5);\n  @$pb.TagNumber(6)\n  set item(DetailItem value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasItem() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearItem() => $_clearField(6);\n  @$pb.TagNumber(6)\n  DetailItem ensureItem() => $_ensure(5);\n}\n\nclass TripleLikeReq extends $pb.GeneratedMessage {\n  factory TripleLikeReq({\n    PlayItem? item,\n  }) {\n    final result = create();\n    if (item != null) result.item = item;\n    return result;\n  }\n\n  TripleLikeReq._();\n\n  factory TripleLikeReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TripleLikeReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TripleLikeReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOM<PlayItem>(1, _omitFieldNames ? '' : 'item',\n        subBuilder: PlayItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TripleLikeReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TripleLikeReq copyWith(void Function(TripleLikeReq) updates) =>\n      super.copyWith((message) => updates(message as TripleLikeReq))\n          as TripleLikeReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TripleLikeReq create() => TripleLikeReq._();\n  @$core.override\n  TripleLikeReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TripleLikeReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<TripleLikeReq>(create);\n  static TripleLikeReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PlayItem get item => $_getN(0);\n  @$pb.TagNumber(1)\n  set item(PlayItem value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasItem() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearItem() => $_clearField(1);\n  @$pb.TagNumber(1)\n  PlayItem ensureItem() => $_ensure(0);\n}\n\nclass TripleLikeResp extends $pb.GeneratedMessage {\n  factory TripleLikeResp({\n    $core.String? message,\n    $core.bool? thumbOk,\n    $core.bool? coinOk,\n    $core.bool? favOk,\n  }) {\n    final result = create();\n    if (message != null) result.message = message;\n    if (thumbOk != null) result.thumbOk = thumbOk;\n    if (coinOk != null) result.coinOk = coinOk;\n    if (favOk != null) result.favOk = favOk;\n    return result;\n  }\n\n  TripleLikeResp._();\n\n  factory TripleLikeResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TripleLikeResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TripleLikeResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.listener.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'message')\n    ..aOB(2, _omitFieldNames ? '' : 'thumbOk')\n    ..aOB(3, _omitFieldNames ? '' : 'coinOk')\n    ..aOB(4, _omitFieldNames ? '' : 'favOk')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TripleLikeResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TripleLikeResp copyWith(void Function(TripleLikeResp) updates) =>\n      super.copyWith((message) => updates(message as TripleLikeResp))\n          as TripleLikeResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TripleLikeResp create() => TripleLikeResp._();\n  @$core.override\n  TripleLikeResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TripleLikeResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<TripleLikeResp>(create);\n  static TripleLikeResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get message => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set message($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMessage() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMessage() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get thumbOk => $_getBF(1);\n  @$pb.TagNumber(2)\n  set thumbOk($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasThumbOk() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearThumbOk() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get coinOk => $_getBF(2);\n  @$pb.TagNumber(3)\n  set coinOk($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCoinOk() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCoinOk() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get favOk => $_getBF(3);\n  @$pb.TagNumber(4)\n  set favOk($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFavOk() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFavOk() => $_clearField(4);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/listener/v1.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/listener/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nclass CardModuleType extends $pb.ProtobufEnum {\n  static const CardModuleType Module_invalid =\n      CardModuleType._(0, _omitEnumNames ? '' : 'Module_invalid');\n  static const CardModuleType Module_header =\n      CardModuleType._(1, _omitEnumNames ? '' : 'Module_header');\n  static const CardModuleType Module_archive =\n      CardModuleType._(2, _omitEnumNames ? '' : 'Module_archive');\n  static const CardModuleType Module_cbtn =\n      CardModuleType._(3, _omitEnumNames ? '' : 'Module_cbtn');\n\n  static const $core.List<CardModuleType> values = <CardModuleType>[\n    Module_invalid,\n    Module_header,\n    Module_archive,\n    Module_cbtn,\n  ];\n\n  static final $core.List<CardModuleType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static CardModuleType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const CardModuleType._(super.value, super.name);\n}\n\nclass ListOrder extends $pb.ProtobufEnum {\n  static const ListOrder NO_ORDER =\n      ListOrder._(0, _omitEnumNames ? '' : 'NO_ORDER');\n  static const ListOrder ORDER_NORMAL =\n      ListOrder._(1, _omitEnumNames ? '' : 'ORDER_NORMAL');\n  static const ListOrder ORDER_REVERSE =\n      ListOrder._(2, _omitEnumNames ? '' : 'ORDER_REVERSE');\n  static const ListOrder ORDER_RANDOM =\n      ListOrder._(3, _omitEnumNames ? '' : 'ORDER_RANDOM');\n\n  static const $core.List<ListOrder> values = <ListOrder>[\n    NO_ORDER,\n    ORDER_NORMAL,\n    ORDER_REVERSE,\n    ORDER_RANDOM,\n  ];\n\n  static final $core.List<ListOrder?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static ListOrder? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ListOrder._(super.value, super.name);\n}\n\nclass ListSortField extends $pb.ProtobufEnum {\n  static const ListSortField NO_SORT =\n      ListSortField._(0, _omitEnumNames ? '' : 'NO_SORT');\n  static const ListSortField SORT_CTIME =\n      ListSortField._(1, _omitEnumNames ? '' : 'SORT_CTIME');\n  static const ListSortField SORT_VIEWCNT =\n      ListSortField._(2, _omitEnumNames ? '' : 'SORT_VIEWCNT');\n  static const ListSortField SORT_FAVCNT =\n      ListSortField._(3, _omitEnumNames ? '' : 'SORT_FAVCNT');\n\n  static const $core.List<ListSortField> values = <ListSortField>[\n    NO_SORT,\n    SORT_CTIME,\n    SORT_VIEWCNT,\n    SORT_FAVCNT,\n  ];\n\n  static final $core.List<ListSortField?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static ListSortField? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ListSortField._(super.value, super.name);\n}\n\nclass PlaylistSource extends $pb.ProtobufEnum {\n  static const PlaylistSource DEFAULT =\n      PlaylistSource._(0, _omitEnumNames ? '' : 'DEFAULT');\n  static const PlaylistSource MEM_SPACE =\n      PlaylistSource._(1, _omitEnumNames ? '' : 'MEM_SPACE');\n  static const PlaylistSource AUDIO_COLLECTION =\n      PlaylistSource._(2, _omitEnumNames ? '' : 'AUDIO_COLLECTION');\n  static const PlaylistSource AUDIO_CARD =\n      PlaylistSource._(3, _omitEnumNames ? '' : 'AUDIO_CARD');\n  static const PlaylistSource USER_FAVOURITE =\n      PlaylistSource._(4, _omitEnumNames ? '' : 'USER_FAVOURITE');\n  static const PlaylistSource UP_ARCHIVE =\n      PlaylistSource._(5, _omitEnumNames ? '' : 'UP_ARCHIVE');\n  static const PlaylistSource AUDIO_CACHE =\n      PlaylistSource._(6, _omitEnumNames ? '' : 'AUDIO_CACHE');\n  static const PlaylistSource PICK_CARD =\n      PlaylistSource._(7, _omitEnumNames ? '' : 'PICK_CARD');\n  static const PlaylistSource MEDIA_LIST =\n      PlaylistSource._(8, _omitEnumNames ? '' : 'MEDIA_LIST');\n\n  static const $core.List<PlaylistSource> values = <PlaylistSource>[\n    DEFAULT,\n    MEM_SPACE,\n    AUDIO_COLLECTION,\n    AUDIO_CARD,\n    USER_FAVOURITE,\n    UP_ARCHIVE,\n    AUDIO_CACHE,\n    PICK_CARD,\n    MEDIA_LIST,\n  ];\n\n  static final $core.List<PlaylistSource?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 8);\n  static PlaylistSource? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const PlaylistSource._(super.value, super.name);\n}\n\nclass TopCardType extends $pb.ProtobufEnum {\n  static const TopCardType UNSPECIFIED_TopCardType =\n      TopCardType._(0, _omitEnumNames ? '' : 'UNSPECIFIED_TopCardType');\n  static const TopCardType LISTEN_HISTORY =\n      TopCardType._(1, _omitEnumNames ? '' : 'LISTEN_HISTORY');\n  static const TopCardType FAVORITE_FOLDER =\n      TopCardType._(2, _omitEnumNames ? '' : 'FAVORITE_FOLDER');\n  static const TopCardType UP_RECALL =\n      TopCardType._(3, _omitEnumNames ? '' : 'UP_RECALL');\n  static const TopCardType PICK_TODAY =\n      TopCardType._(4, _omitEnumNames ? '' : 'PICK_TODAY');\n\n  static const $core.List<TopCardType> values = <TopCardType>[\n    UNSPECIFIED_TopCardType,\n    LISTEN_HISTORY,\n    FAVORITE_FOLDER,\n    UP_RECALL,\n    PICK_TODAY,\n  ];\n\n  static final $core.List<TopCardType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 4);\n  static TopCardType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const TopCardType._(super.value, super.name);\n}\n\nclass ClickReq_ClickAction extends $pb.ProtobufEnum {\n  static const ClickReq_ClickAction INVALID =\n      ClickReq_ClickAction._(0, _omitEnumNames ? '' : 'INVALID');\n  static const ClickReq_ClickAction SHARE =\n      ClickReq_ClickAction._(1, _omitEnumNames ? '' : 'SHARE');\n\n  static const $core.List<ClickReq_ClickAction> values = <ClickReq_ClickAction>[\n    INVALID,\n    SHARE,\n  ];\n\n  static final $core.List<ClickReq_ClickAction?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static ClickReq_ClickAction? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ClickReq_ClickAction._(super.value, super.name);\n}\n\nclass EventReq_EventType extends $pb.ProtobufEnum {\n  static const EventReq_EventType INVALID_EventType =\n      EventReq_EventType._(0, _omitEnumNames ? '' : 'INVALID_EventType');\n  static const EventReq_EventType GUIDE_BAR_SHOW =\n      EventReq_EventType._(1, _omitEnumNames ? '' : 'GUIDE_BAR_SHOW');\n\n  static const $core.List<EventReq_EventType> values = <EventReq_EventType>[\n    INVALID_EventType,\n    GUIDE_BAR_SHOW,\n  ];\n\n  static final $core.List<EventReq_EventType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static EventReq_EventType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const EventReq_EventType._(super.value, super.name);\n}\n\nclass FavFolderAction_Action extends $pb.ProtobufEnum {\n  static const FavFolderAction_Action UNSPECIFIED =\n      FavFolderAction_Action._(0, _omitEnumNames ? '' : 'UNSPECIFIED');\n  static const FavFolderAction_Action ADD =\n      FavFolderAction_Action._(1, _omitEnumNames ? '' : 'ADD');\n  static const FavFolderAction_Action DEL =\n      FavFolderAction_Action._(2, _omitEnumNames ? '' : 'DEL');\n\n  static const $core.List<FavFolderAction_Action> values =\n      <FavFolderAction_Action>[\n    UNSPECIFIED,\n    ADD,\n    DEL,\n  ];\n\n  static final $core.List<FavFolderAction_Action?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static FavFolderAction_Action? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const FavFolderAction_Action._(super.value, super.name);\n}\n\nclass FollowRelation_RelationStatus extends $pb.ProtobufEnum {\n  static const FollowRelation_RelationStatus UNSPECIFIED_RelationStatus =\n      FollowRelation_RelationStatus._(\n          0, _omitEnumNames ? '' : 'UNSPECIFIED_RelationStatus');\n  static const FollowRelation_RelationStatus NO_FOLLOW =\n      FollowRelation_RelationStatus._(1, _omitEnumNames ? '' : 'NO_FOLLOW');\n  static const FollowRelation_RelationStatus FOLLOWING =\n      FollowRelation_RelationStatus._(2, _omitEnumNames ? '' : 'FOLLOWING');\n  static const FollowRelation_RelationStatus FOLLOWED =\n      FollowRelation_RelationStatus._(3, _omitEnumNames ? '' : 'FOLLOWED');\n  static const FollowRelation_RelationStatus MUTUAL_FOLLOWING =\n      FollowRelation_RelationStatus._(\n          4, _omitEnumNames ? '' : 'MUTUAL_FOLLOWING');\n  static const FollowRelation_RelationStatus SPECIAL_FOLLOWING =\n      FollowRelation_RelationStatus._(\n          5, _omitEnumNames ? '' : 'SPECIAL_FOLLOWING');\n\n  static const $core.List<FollowRelation_RelationStatus> values =\n      <FollowRelation_RelationStatus>[\n    UNSPECIFIED_RelationStatus,\n    NO_FOLLOW,\n    FOLLOWING,\n    FOLLOWED,\n    MUTUAL_FOLLOWING,\n    SPECIAL_FOLLOWING,\n  ];\n\n  static final $core.List<FollowRelation_RelationStatus?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 5);\n  static FollowRelation_RelationStatus? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const FollowRelation_RelationStatus._(super.value, super.name);\n}\n\nclass MenuSubscribeReq_SubscribeAction extends $pb.ProtobufEnum {\n  static const MenuSubscribeReq_SubscribeAction INVALID_SubscribeAction =\n      MenuSubscribeReq_SubscribeAction._(\n          0, _omitEnumNames ? '' : 'INVALID_SubscribeAction');\n  static const MenuSubscribeReq_SubscribeAction ADD_SubscribeAction =\n      MenuSubscribeReq_SubscribeAction._(\n          1, _omitEnumNames ? '' : 'ADD_SubscribeAction');\n  static const MenuSubscribeReq_SubscribeAction DEL_SubscribeAction =\n      MenuSubscribeReq_SubscribeAction._(\n          2, _omitEnumNames ? '' : 'DEL_SubscribeAction');\n\n  static const $core.List<MenuSubscribeReq_SubscribeAction> values =\n      <MenuSubscribeReq_SubscribeAction>[\n    INVALID_SubscribeAction,\n    ADD_SubscribeAction,\n    DEL_SubscribeAction,\n  ];\n\n  static final $core.List<MenuSubscribeReq_SubscribeAction?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static MenuSubscribeReq_SubscribeAction? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const MenuSubscribeReq_SubscribeAction._(super.value, super.name);\n}\n\nclass PageOption_Direction extends $pb.ProtobufEnum {\n  static const PageOption_Direction SCROLL_DOWN =\n      PageOption_Direction._(0, _omitEnumNames ? '' : 'SCROLL_DOWN');\n  static const PageOption_Direction SCROLL_UP =\n      PageOption_Direction._(1, _omitEnumNames ? '' : 'SCROLL_UP');\n\n  static const $core.List<PageOption_Direction> values = <PageOption_Direction>[\n    SCROLL_DOWN,\n    SCROLL_UP,\n  ];\n\n  static final $core.List<PageOption_Direction?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static PageOption_Direction? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const PageOption_Direction._(super.value, super.name);\n}\n\nclass PlaylistOffset_PlaylistScrollDirection extends $pb.ProtobufEnum {\n  static const PlaylistOffset_PlaylistScrollDirection DOWN =\n      PlaylistOffset_PlaylistScrollDirection._(0, _omitEnumNames ? '' : 'DOWN');\n  static const PlaylistOffset_PlaylistScrollDirection UP =\n      PlaylistOffset_PlaylistScrollDirection._(1, _omitEnumNames ? '' : 'UP');\n\n  static const $core.List<PlaylistOffset_PlaylistScrollDirection> values =\n      <PlaylistOffset_PlaylistScrollDirection>[\n    DOWN,\n    UP,\n  ];\n\n  static final $core.List<PlaylistOffset_PlaylistScrollDirection?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static PlaylistOffset_PlaylistScrollDirection? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const PlaylistOffset_PlaylistScrollDirection._(super.value, super.name);\n}\n\nclass RcmdPlaylistReq_RcmdFrom extends $pb.ProtobufEnum {\n  static const RcmdPlaylistReq_RcmdFrom UNSPECIFIED_RcmdFrom =\n      RcmdPlaylistReq_RcmdFrom._(\n          0, _omitEnumNames ? '' : 'UNSPECIFIED_RcmdFrom');\n  static const RcmdPlaylistReq_RcmdFrom UP_ARCHIVE_RcmdFrom =\n      RcmdPlaylistReq_RcmdFrom._(\n          1, _omitEnumNames ? '' : 'UP_ARCHIVE_RcmdFrom');\n  static const RcmdPlaylistReq_RcmdFrom INDEX_ENTRY =\n      RcmdPlaylistReq_RcmdFrom._(2, _omitEnumNames ? '' : 'INDEX_ENTRY');\n  static const RcmdPlaylistReq_RcmdFrom ARCHIVE_VIEW =\n      RcmdPlaylistReq_RcmdFrom._(3, _omitEnumNames ? '' : 'ARCHIVE_VIEW');\n\n  static const $core.List<RcmdPlaylistReq_RcmdFrom> values =\n      <RcmdPlaylistReq_RcmdFrom>[\n    UNSPECIFIED_RcmdFrom,\n    UP_ARCHIVE_RcmdFrom,\n    INDEX_ENTRY,\n    ARCHIVE_VIEW,\n  ];\n\n  static final $core.List<RcmdPlaylistReq_RcmdFrom?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static RcmdPlaylistReq_RcmdFrom? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const RcmdPlaylistReq_RcmdFrom._(super.value, super.name);\n}\n\nclass ThumbUpReq_ThumbType extends $pb.ProtobufEnum {\n  static const ThumbUpReq_ThumbType LIKE =\n      ThumbUpReq_ThumbType._(0, _omitEnumNames ? '' : 'LIKE');\n  static const ThumbUpReq_ThumbType CANCEL_LIKE =\n      ThumbUpReq_ThumbType._(1, _omitEnumNames ? '' : 'CANCEL_LIKE');\n  static const ThumbUpReq_ThumbType DISLIKE =\n      ThumbUpReq_ThumbType._(2, _omitEnumNames ? '' : 'DISLIKE');\n  static const ThumbUpReq_ThumbType CANCEL_DISLIKE =\n      ThumbUpReq_ThumbType._(3, _omitEnumNames ? '' : 'CANCEL_DISLIKE');\n\n  static const $core.List<ThumbUpReq_ThumbType> values = <ThumbUpReq_ThumbType>[\n    LIKE,\n    CANCEL_LIKE,\n    DISLIKE,\n    CANCEL_DISLIKE,\n  ];\n\n  static final $core.List<ThumbUpReq_ThumbType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static ThumbUpReq_ThumbType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ThumbUpReq_ThumbType._(super.value, super.name);\n}\n\nclass TopCard_PlayStrategy extends $pb.ProtobufEnum {\n  static const TopCard_PlayStrategy NO_INTERRUPT =\n      TopCard_PlayStrategy._(0, _omitEnumNames ? '' : 'NO_INTERRUPT');\n  static const TopCard_PlayStrategy PLAY_TARGET =\n      TopCard_PlayStrategy._(1, _omitEnumNames ? '' : 'PLAY_TARGET');\n  static const TopCard_PlayStrategy PLAY_FIRST =\n      TopCard_PlayStrategy._(2, _omitEnumNames ? '' : 'PLAY_FIRST');\n\n  static const $core.List<TopCard_PlayStrategy> values = <TopCard_PlayStrategy>[\n    NO_INTERRUPT,\n    PLAY_TARGET,\n    PLAY_FIRST,\n  ];\n\n  static final $core.List<TopCard_PlayStrategy?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static TopCard_PlayStrategy? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const TopCard_PlayStrategy._(super.value, super.name);\n}\n\nconst $core.bool _omitEnumNames =\n    $core.bool.fromEnvironment('protobuf.omit_enum_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/listener/v1.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/listener/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use cardModuleTypeDescriptor instead')\nconst CardModuleType$json = {\n  '1': 'CardModuleType',\n  '2': [\n    {'1': 'Module_invalid', '2': 0},\n    {'1': 'Module_header', '2': 1},\n    {'1': 'Module_archive', '2': 2},\n    {'1': 'Module_cbtn', '2': 3},\n  ],\n};\n\n/// Descriptor for `CardModuleType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List cardModuleTypeDescriptor = $convert.base64Decode(\n    'Cg5DYXJkTW9kdWxlVHlwZRISCg5Nb2R1bGVfaW52YWxpZBAAEhEKDU1vZHVsZV9oZWFkZXIQAR'\n    'ISCg5Nb2R1bGVfYXJjaGl2ZRACEg8KC01vZHVsZV9jYnRuEAM=');\n\n@$core.Deprecated('Use listOrderDescriptor instead')\nconst ListOrder$json = {\n  '1': 'ListOrder',\n  '2': [\n    {'1': 'NO_ORDER', '2': 0},\n    {'1': 'ORDER_NORMAL', '2': 1},\n    {'1': 'ORDER_REVERSE', '2': 2},\n    {'1': 'ORDER_RANDOM', '2': 3},\n  ],\n};\n\n/// Descriptor for `ListOrder`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List listOrderDescriptor = $convert.base64Decode(\n    'CglMaXN0T3JkZXISDAoITk9fT1JERVIQABIQCgxPUkRFUl9OT1JNQUwQARIRCg1PUkRFUl9SRV'\n    'ZFUlNFEAISEAoMT1JERVJfUkFORE9NEAM=');\n\n@$core.Deprecated('Use listSortFieldDescriptor instead')\nconst ListSortField$json = {\n  '1': 'ListSortField',\n  '2': [\n    {'1': 'NO_SORT', '2': 0},\n    {'1': 'SORT_CTIME', '2': 1},\n    {'1': 'SORT_VIEWCNT', '2': 2},\n    {'1': 'SORT_FAVCNT', '2': 3},\n  ],\n};\n\n/// Descriptor for `ListSortField`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List listSortFieldDescriptor = $convert.base64Decode(\n    'Cg1MaXN0U29ydEZpZWxkEgsKB05PX1NPUlQQABIOCgpTT1JUX0NUSU1FEAESEAoMU09SVF9WSU'\n    'VXQ05UEAISDwoLU09SVF9GQVZDTlQQAw==');\n\n@$core.Deprecated('Use playlistSourceDescriptor instead')\nconst PlaylistSource$json = {\n  '1': 'PlaylistSource',\n  '2': [\n    {'1': 'DEFAULT', '2': 0},\n    {'1': 'MEM_SPACE', '2': 1},\n    {'1': 'AUDIO_COLLECTION', '2': 2},\n    {'1': 'AUDIO_CARD', '2': 3},\n    {'1': 'USER_FAVOURITE', '2': 4},\n    {'1': 'UP_ARCHIVE', '2': 5},\n    {'1': 'AUDIO_CACHE', '2': 6},\n    {'1': 'PICK_CARD', '2': 7},\n    {'1': 'MEDIA_LIST', '2': 8},\n  ],\n};\n\n/// Descriptor for `PlaylistSource`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List playlistSourceDescriptor = $convert.base64Decode(\n    'Cg5QbGF5bGlzdFNvdXJjZRILCgdERUZBVUxUEAASDQoJTUVNX1NQQUNFEAESFAoQQVVESU9fQ0'\n    '9MTEVDVElPThACEg4KCkFVRElPX0NBUkQQAxISCg5VU0VSX0ZBVk9VUklURRAEEg4KClVQX0FS'\n    'Q0hJVkUQBRIPCgtBVURJT19DQUNIRRAGEg0KCVBJQ0tfQ0FSRBAHEg4KCk1FRElBX0xJU1QQCA'\n    '==');\n\n@$core.Deprecated('Use topCardTypeDescriptor instead')\nconst TopCardType$json = {\n  '1': 'TopCardType',\n  '2': [\n    {'1': 'UNSPECIFIED_TopCardType', '2': 0},\n    {'1': 'LISTEN_HISTORY', '2': 1},\n    {'1': 'FAVORITE_FOLDER', '2': 2},\n    {'1': 'UP_RECALL', '2': 3},\n    {'1': 'PICK_TODAY', '2': 4},\n  ],\n};\n\n/// Descriptor for `TopCardType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List topCardTypeDescriptor = $convert.base64Decode(\n    'CgtUb3BDYXJkVHlwZRIbChdVTlNQRUNJRklFRF9Ub3BDYXJkVHlwZRAAEhIKDkxJU1RFTl9ISV'\n    'NUT1JZEAESEwoPRkFWT1JJVEVfRk9MREVSEAISDQoJVVBfUkVDQUxMEAMSDgoKUElDS19UT0RB'\n    'WRAE');\n\n@$core.Deprecated('Use authorDescriptor instead')\nconst Author$json = {\n  '1': 'Author',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'avatar', '3': 3, '4': 1, '5': 9, '10': 'avatar'},\n    {\n      '1': 'relation',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.FollowRelation',\n      '10': 'relation'\n    },\n  ],\n};\n\n/// Descriptor for `Author`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List authorDescriptor = $convert.base64Decode(\n    'CgZBdXRob3ISEAoDbWlkGAEgASgDUgNtaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIWCgZhdmF0YX'\n    'IYAyABKAlSBmF2YXRhchJECghyZWxhdGlvbhgEIAEoCzIoLmJpbGliaWxpLmFwcC5saXN0ZW5l'\n    'ci52MS5Gb2xsb3dSZWxhdGlvblIIcmVsYXRpb24=');\n\n@$core.Deprecated('Use bKArcDetailsReqDescriptor instead')\nconst BKArcDetailsReq$json = {\n  '1': 'BKArcDetailsReq',\n  '2': [\n    {\n      '1': 'items',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayItem',\n      '10': 'items'\n    },\n    {\n      '1': 'player_args',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n  ],\n};\n\n/// Descriptor for `BKArcDetailsReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bKArcDetailsReqDescriptor = $convert.base64Decode(\n    'Cg9CS0FyY0RldGFpbHNSZXESOAoFaXRlbXMYASADKAsyIi5iaWxpYmlsaS5hcHAubGlzdGVuZX'\n    'IudjEuUGxheUl0ZW1SBWl0ZW1zEk8KC3BsYXllcl9hcmdzGAIgASgLMi4uYmlsaWJpbGkuYXBw'\n    'LmFyY2hpdmUubWlkZGxld2FyZS52MS5QbGF5ZXJBcmdzUgpwbGF5ZXJBcmdz');\n\n@$core.Deprecated('Use bKArcDetailsRespDescriptor instead')\nconst BKArcDetailsResp$json = {\n  '1': 'BKArcDetailsResp',\n  '2': [\n    {\n      '1': 'list',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.DetailItem',\n      '10': 'list'\n    },\n  ],\n};\n\n/// Descriptor for `BKArcDetailsResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bKArcDetailsRespDescriptor = $convert.base64Decode(\n    'ChBCS0FyY0RldGFpbHNSZXNwEjgKBGxpc3QYASADKAsyJC5iaWxpYmlsaS5hcHAubGlzdGVuZX'\n    'IudjEuRGV0YWlsSXRlbVIEbGlzdA==');\n\n@$core.Deprecated('Use bKArcPartDescriptor instead')\nconst BKArcPart$json = {\n  '1': 'BKArcPart',\n  '2': [\n    {'1': 'oid', '3': 1, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'sub_id', '3': 2, '4': 1, '5': 3, '10': 'subId'},\n    {'1': 'title', '3': 3, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'duration', '3': 4, '4': 1, '5': 3, '10': 'duration'},\n    {'1': 'page', '3': 5, '4': 1, '5': 5, '10': 'page'},\n  ],\n};\n\n/// Descriptor for `BKArcPart`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bKArcPartDescriptor = $convert.base64Decode(\n    'CglCS0FyY1BhcnQSEAoDb2lkGAEgASgDUgNvaWQSFQoGc3ViX2lkGAIgASgDUgVzdWJJZBIUCg'\n    'V0aXRsZRgDIAEoCVIFdGl0bGUSGgoIZHVyYXRpb24YBCABKANSCGR1cmF0aW9uEhIKBHBhZ2UY'\n    'BSABKAVSBHBhZ2U=');\n\n@$core.Deprecated('Use bKArcRightsDescriptor instead')\nconst BKArcRights$json = {\n  '1': 'BKArcRights',\n  '2': [\n    {'1': 'no_reprint', '3': 1, '4': 1, '5': 5, '10': 'noReprint'},\n  ],\n};\n\n/// Descriptor for `BKArcRights`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bKArcRightsDescriptor = $convert.base64Decode(\n    'CgtCS0FyY1JpZ2h0cxIdCgpub19yZXByaW50GAEgASgFUglub1JlcHJpbnQ=');\n\n@$core.Deprecated('Use bKArchiveDescriptor instead')\nconst BKArchive$json = {\n  '1': 'BKArchive',\n  '2': [\n    {'1': 'oid', '3': 1, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 3, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'desc', '3': 4, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'duration', '3': 5, '4': 1, '5': 3, '10': 'duration'},\n    {'1': 'rid', '3': 6, '4': 1, '5': 5, '10': 'rid'},\n    {'1': 'rname', '3': 7, '4': 1, '5': 9, '10': 'rname'},\n    {'1': 'publish', '3': 8, '4': 1, '5': 3, '10': 'publish'},\n    {'1': 'displayed_oid', '3': 9, '4': 1, '5': 9, '10': 'displayedOid'},\n    {'1': 'copyright', '3': 10, '4': 1, '5': 5, '10': 'copyright'},\n    {\n      '1': 'rights',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.BKArcRights',\n      '10': 'rights'\n    },\n  ],\n};\n\n/// Descriptor for `BKArchive`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bKArchiveDescriptor = $convert.base64Decode(\n    'CglCS0FyY2hpdmUSEAoDb2lkGAEgASgDUgNvaWQSFAoFdGl0bGUYAiABKAlSBXRpdGxlEhQKBW'\n    'NvdmVyGAMgASgJUgVjb3ZlchISCgRkZXNjGAQgASgJUgRkZXNjEhoKCGR1cmF0aW9uGAUgASgD'\n    'UghkdXJhdGlvbhIQCgNyaWQYBiABKAVSA3JpZBIUCgVybmFtZRgHIAEoCVIFcm5hbWUSGAoHcH'\n    'VibGlzaBgIIAEoA1IHcHVibGlzaBIjCg1kaXNwbGF5ZWRfb2lkGAkgASgJUgxkaXNwbGF5ZWRP'\n    'aWQSHAoJY29weXJpZ2h0GAogASgFUgljb3B5cmlnaHQSPQoGcmlnaHRzGAsgASgLMiUuYmlsaW'\n    'JpbGkuYXBwLmxpc3RlbmVyLnYxLkJLQXJjUmlnaHRzUgZyaWdodHM=');\n\n@$core.Deprecated('Use bKStatDescriptor instead')\nconst BKStat$json = {\n  '1': 'BKStat',\n  '2': [\n    {'1': 'like', '3': 1, '4': 1, '5': 5, '10': 'like'},\n    {'1': 'coin', '3': 2, '4': 1, '5': 5, '10': 'coin'},\n    {'1': 'favourite', '3': 3, '4': 1, '5': 5, '10': 'favourite'},\n    {'1': 'reply', '3': 4, '4': 1, '5': 5, '10': 'reply'},\n    {'1': 'share', '3': 5, '4': 1, '5': 5, '10': 'share'},\n    {'1': 'view', '3': 6, '4': 1, '5': 5, '10': 'view'},\n    {'1': 'has_like', '3': 7, '4': 1, '5': 8, '10': 'hasLike'},\n    {'1': 'has_coin', '3': 8, '4': 1, '5': 8, '10': 'hasCoin'},\n    {'1': 'has_fav', '3': 9, '4': 1, '5': 8, '10': 'hasFav'},\n    {'1': 'use_view_vt', '3': 10, '4': 1, '5': 8, '10': 'useViewVt'},\n    {'1': 'view_vt_text', '3': 11, '4': 1, '5': 9, '10': 'viewVtText'},\n  ],\n};\n\n/// Descriptor for `BKStat`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bKStatDescriptor = $convert.base64Decode(\n    'CgZCS1N0YXQSEgoEbGlrZRgBIAEoBVIEbGlrZRISCgRjb2luGAIgASgFUgRjb2luEhwKCWZhdm'\n    '91cml0ZRgDIAEoBVIJZmF2b3VyaXRlEhQKBXJlcGx5GAQgASgFUgVyZXBseRIUCgVzaGFyZRgF'\n    'IAEoBVIFc2hhcmUSEgoEdmlldxgGIAEoBVIEdmlldxIZCghoYXNfbGlrZRgHIAEoCFIHaGFzTG'\n    'lrZRIZCghoYXNfY29pbhgIIAEoCFIHaGFzQ29pbhIXCgdoYXNfZmF2GAkgASgIUgZoYXNGYXYS'\n    'HgoLdXNlX3ZpZXdfdnQYCiABKAhSCXVzZVZpZXdWdBIgCgx2aWV3X3Z0X3RleHQYCyABKAlSCn'\n    'ZpZXdWdFRleHQ=');\n\n@$core.Deprecated('Use cardModuleDescriptor instead')\nconst CardModule$json = {\n  '1': 'CardModule',\n  '2': [\n    {\n      '1': 'module_header',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PkcmHeader',\n      '9': 0,\n      '10': 'moduleHeader'\n    },\n    {\n      '1': 'module_archive',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PkcmArchive',\n      '9': 0,\n      '10': 'moduleArchive'\n    },\n    {\n      '1': 'module_cbtn',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PkcmCenterButton',\n      '9': 0,\n      '10': 'moduleCbtn'\n    },\n    {\n      '1': 'module_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.listener.v1.CardModuleType',\n      '10': 'moduleType'\n    },\n  ],\n  '8': [\n    {'1': 'module'},\n  ],\n};\n\n/// Descriptor for `CardModule`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cardModuleDescriptor = $convert.base64Decode(\n    'CgpDYXJkTW9kdWxlEksKDW1vZHVsZV9oZWFkZXIYAiABKAsyJC5iaWxpYmlsaS5hcHAubGlzdG'\n    'VuZXIudjEuUGtjbUhlYWRlckgAUgxtb2R1bGVIZWFkZXISTgoObW9kdWxlX2FyY2hpdmUYAyAB'\n    'KAsyJS5iaWxpYmlsaS5hcHAubGlzdGVuZXIudjEuUGtjbUFyY2hpdmVIAFINbW9kdWxlQXJjaG'\n    'l2ZRJNCgttb2R1bGVfY2J0bhgEIAEoCzIqLmJpbGliaWxpLmFwcC5saXN0ZW5lci52MS5Qa2Nt'\n    'Q2VudGVyQnV0dG9uSABSCm1vZHVsZUNidG4SSQoLbW9kdWxlX3R5cGUYASABKA4yKC5iaWxpYm'\n    'lsaS5hcHAubGlzdGVuZXIudjEuQ2FyZE1vZHVsZVR5cGVSCm1vZHVsZVR5cGVCCAoGbW9kdWxl');\n\n@$core.Deprecated('Use clickReqDescriptor instead')\nconst ClickReq$json = {\n  '1': 'ClickReq',\n  '2': [\n    {'1': 'sid', '3': 1, '4': 1, '5': 3, '10': 'sid'},\n    {\n      '1': 'action',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.listener.v1.ClickReq.ClickAction',\n      '10': 'action'\n    },\n  ],\n  '4': [ClickReq_ClickAction$json],\n};\n\n@$core.Deprecated('Use clickReqDescriptor instead')\nconst ClickReq_ClickAction$json = {\n  '1': 'ClickAction',\n  '2': [\n    {'1': 'INVALID', '2': 0},\n    {'1': 'SHARE', '2': 1},\n  ],\n};\n\n/// Descriptor for `ClickReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List clickReqDescriptor = $convert.base64Decode(\n    'CghDbGlja1JlcRIQCgNzaWQYASABKANSA3NpZBJGCgZhY3Rpb24YAiABKA4yLi5iaWxpYmlsaS'\n    '5hcHAubGlzdGVuZXIudjEuQ2xpY2tSZXEuQ2xpY2tBY3Rpb25SBmFjdGlvbiIlCgtDbGlja0Fj'\n    'dGlvbhILCgdJTlZBTElEEAASCQoFU0hBUkUQAQ==');\n\n@$core.Deprecated('Use clickRespDescriptor instead')\nconst ClickResp$json = {\n  '1': 'ClickResp',\n};\n\n/// Descriptor for `ClickResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List clickRespDescriptor =\n    $convert.base64Decode('CglDbGlja1Jlc3A=');\n\n@$core.Deprecated('Use coinAddReqDescriptor instead')\nconst CoinAddReq$json = {\n  '1': 'CoinAddReq',\n  '2': [\n    {\n      '1': 'item',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayItem',\n      '10': 'item'\n    },\n    {'1': 'num', '3': 2, '4': 1, '5': 5, '10': 'num'},\n    {'1': 'thumb_up', '3': 3, '4': 1, '5': 8, '10': 'thumbUp'},\n  ],\n};\n\n/// Descriptor for `CoinAddReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List coinAddReqDescriptor = $convert.base64Decode(\n    'CgpDb2luQWRkUmVxEjYKBGl0ZW0YASABKAsyIi5iaWxpYmlsaS5hcHAubGlzdGVuZXIudjEuUG'\n    'xheUl0ZW1SBGl0ZW0SEAoDbnVtGAIgASgFUgNudW0SGQoIdGh1bWJfdXAYAyABKAhSB3RodW1i'\n    'VXA=');\n\n@$core.Deprecated('Use coinAddRespDescriptor instead')\nconst CoinAddResp$json = {\n  '1': 'CoinAddResp',\n  '2': [\n    {'1': 'message', '3': 1, '4': 1, '5': 9, '10': 'message'},\n  ],\n};\n\n/// Descriptor for `CoinAddResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List coinAddRespDescriptor = $convert\n    .base64Decode('CgtDb2luQWRkUmVzcBIYCgdtZXNzYWdlGAEgASgJUgdtZXNzYWdl');\n\n@$core.Deprecated('Use dashItemDescriptor instead')\nconst DashItem$json = {\n  '1': 'DashItem',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 5, '10': 'id'},\n    {'1': 'base_url', '3': 2, '4': 1, '5': 9, '10': 'baseUrl'},\n    {'1': 'backup_url', '3': 3, '4': 3, '5': 9, '10': 'backupUrl'},\n    {'1': 'bandwidth', '3': 4, '4': 1, '5': 5, '10': 'bandwidth'},\n    {'1': 'mime_type', '3': 5, '4': 1, '5': 9, '10': 'mimeType'},\n    {'1': 'codecs', '3': 6, '4': 1, '5': 9, '10': 'codecs'},\n    {\n      '1': 'segment_base',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.DashSegmentBase',\n      '10': 'segmentBase'\n    },\n    {'1': 'codecid', '3': 13, '4': 1, '5': 5, '10': 'codecid'},\n    {'1': 'md5', '3': 14, '4': 1, '5': 9, '10': 'md5'},\n    {'1': 'size', '3': 15, '4': 1, '5': 3, '10': 'size'},\n  ],\n};\n\n/// Descriptor for `DashItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dashItemDescriptor = $convert.base64Decode(\n    'CghEYXNoSXRlbRIOCgJpZBgBIAEoBVICaWQSGQoIYmFzZV91cmwYAiABKAlSB2Jhc2VVcmwSHQ'\n    'oKYmFja3VwX3VybBgDIAMoCVIJYmFja3VwVXJsEhwKCWJhbmR3aWR0aBgEIAEoBVIJYmFuZHdp'\n    'ZHRoEhsKCW1pbWVfdHlwZRgFIAEoCVIIbWltZVR5cGUSFgoGY29kZWNzGAYgASgJUgZjb2RlY3'\n    'MSTAoMc2VnbWVudF9iYXNlGAwgASgLMikuYmlsaWJpbGkuYXBwLmxpc3RlbmVyLnYxLkRhc2hT'\n    'ZWdtZW50QmFzZVILc2VnbWVudEJhc2USGAoHY29kZWNpZBgNIAEoBVIHY29kZWNpZBIQCgNtZD'\n    'UYDiABKAlSA21kNRISCgRzaXplGA8gASgDUgRzaXpl');\n\n@$core.Deprecated('Use dashSegmentBaseDescriptor instead')\nconst DashSegmentBase$json = {\n  '1': 'DashSegmentBase',\n  '2': [\n    {'1': 'initialization', '3': 1, '4': 1, '5': 9, '10': 'initialization'},\n    {'1': 'index_range', '3': 2, '4': 1, '5': 9, '10': 'indexRange'},\n  ],\n};\n\n/// Descriptor for `DashSegmentBase`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dashSegmentBaseDescriptor = $convert.base64Decode(\n    'Cg9EYXNoU2VnbWVudEJhc2USJgoOaW5pdGlhbGl6YXRpb24YASABKAlSDmluaXRpYWxpemF0aW'\n    '9uEh8KC2luZGV4X3JhbmdlGAIgASgJUgppbmRleFJhbmdl');\n\n@$core.Deprecated('Use detailItemDescriptor instead')\nconst DetailItem$json = {\n  '1': 'DetailItem',\n  '2': [\n    {\n      '1': 'item',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayItem',\n      '10': 'item'\n    },\n    {\n      '1': 'arc',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.BKArchive',\n      '10': 'arc'\n    },\n    {\n      '1': 'parts',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.BKArcPart',\n      '10': 'parts'\n    },\n    {\n      '1': 'owner',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.Author',\n      '10': 'owner'\n    },\n    {\n      '1': 'stat',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.BKStat',\n      '10': 'stat'\n    },\n    {'1': 'last_part', '3': 6, '4': 1, '5': 3, '10': 'lastPart'},\n    {'1': 'progress', '3': 7, '4': 1, '5': 3, '10': 'progress'},\n    {'1': 'playable', '3': 8, '4': 1, '5': 5, '10': 'playable'},\n    {'1': 'message', '3': 9, '4': 1, '5': 9, '10': 'message'},\n    {\n      '1': 'player_info',\n      '3': 10,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.DetailItem.PlayerInfoEntry',\n      '10': 'playerInfo'\n    },\n    {\n      '1': 'associated_item',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayItem',\n      '10': 'associatedItem'\n    },\n    {'1': 'last_play_time', '3': 12, '4': 1, '5': 3, '10': 'lastPlayTime'},\n    {'1': 'history_tag', '3': 13, '4': 1, '5': 9, '10': 'historyTag'},\n    {\n      '1': 'device_type',\n      '3': 14,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.interfaces.v1.DeviceType',\n      '10': 'deviceType'\n    },\n    {\n      '1': 'ugc_season_info',\n      '3': 15,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.FavFolder',\n      '10': 'ugcSeasonInfo'\n    },\n  ],\n  '3': [DetailItem_PlayerInfoEntry$json],\n};\n\n@$core.Deprecated('Use detailItemDescriptor instead')\nconst DetailItem_PlayerInfoEntry$json = {\n  '1': 'PlayerInfoEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 3, '10': 'key'},\n    {\n      '1': 'value',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayInfo',\n      '10': 'value'\n    },\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `DetailItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List detailItemDescriptor = $convert.base64Decode(\n    'CgpEZXRhaWxJdGVtEjYKBGl0ZW0YASABKAsyIi5iaWxpYmlsaS5hcHAubGlzdGVuZXIudjEuUG'\n    'xheUl0ZW1SBGl0ZW0SNQoDYXJjGAIgASgLMiMuYmlsaWJpbGkuYXBwLmxpc3RlbmVyLnYxLkJL'\n    'QXJjaGl2ZVIDYXJjEjkKBXBhcnRzGAMgAygLMiMuYmlsaWJpbGkuYXBwLmxpc3RlbmVyLnYxLk'\n    'JLQXJjUGFydFIFcGFydHMSNgoFb3duZXIYBCABKAsyIC5iaWxpYmlsaS5hcHAubGlzdGVuZXIu'\n    'djEuQXV0aG9yUgVvd25lchI0CgRzdGF0GAUgASgLMiAuYmlsaWJpbGkuYXBwLmxpc3RlbmVyLn'\n    'YxLkJLU3RhdFIEc3RhdBIbCglsYXN0X3BhcnQYBiABKANSCGxhc3RQYXJ0EhoKCHByb2dyZXNz'\n    'GAcgASgDUghwcm9ncmVzcxIaCghwbGF5YWJsZRgIIAEoBVIIcGxheWFibGUSGAoHbWVzc2FnZR'\n    'gJIAEoCVIHbWVzc2FnZRJVCgtwbGF5ZXJfaW5mbxgKIAMoCzI0LmJpbGliaWxpLmFwcC5saXN0'\n    'ZW5lci52MS5EZXRhaWxJdGVtLlBsYXllckluZm9FbnRyeVIKcGxheWVySW5mbxJLCg9hc3NvY2'\n    'lhdGVkX2l0ZW0YCyABKAsyIi5iaWxpYmlsaS5hcHAubGlzdGVuZXIudjEuUGxheUl0ZW1SDmFz'\n    'c29jaWF0ZWRJdGVtEiQKDmxhc3RfcGxheV90aW1lGAwgASgDUgxsYXN0UGxheVRpbWUSHwoLaG'\n    'lzdG9yeV90YWcYDSABKAlSCmhpc3RvcnlUYWcSRwoLZGV2aWNlX3R5cGUYDiABKAsyJi5iaWxp'\n    'YmlsaS5hcHAuaW50ZXJmYWNlcy52MS5EZXZpY2VUeXBlUgpkZXZpY2VUeXBlEksKD3VnY19zZW'\n    'Fzb25faW5mbxgPIAEoCzIjLmJpbGliaWxpLmFwcC5saXN0ZW5lci52MS5GYXZGb2xkZXJSDXVn'\n    'Y1NlYXNvbkluZm8aYQoPUGxheWVySW5mb0VudHJ5EhAKA2tleRgBIAEoA1IDa2V5EjgKBXZhbH'\n    'VlGAIgASgLMiIuYmlsaWJpbGkuYXBwLmxpc3RlbmVyLnYxLlBsYXlJbmZvUgV2YWx1ZToCOAE=');\n\n@$core.Deprecated('Use eventReqDescriptor instead')\nconst EventReq$json = {\n  '1': 'EventReq',\n  '2': [\n    {\n      '1': 'event_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.listener.v1.EventReq.EventType',\n      '10': 'eventType'\n    },\n    {\n      '1': 'item',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayItem',\n      '10': 'item'\n    },\n  ],\n  '4': [EventReq_EventType$json],\n};\n\n@$core.Deprecated('Use eventReqDescriptor instead')\nconst EventReq_EventType$json = {\n  '1': 'EventType',\n  '2': [\n    {'1': 'INVALID_EventType', '2': 0},\n    {'1': 'GUIDE_BAR_SHOW', '2': 1},\n  ],\n};\n\n/// Descriptor for `EventReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List eventReqDescriptor = $convert.base64Decode(\n    'CghFdmVudFJlcRJLCgpldmVudF90eXBlGAEgASgOMiwuYmlsaWJpbGkuYXBwLmxpc3RlbmVyLn'\n    'YxLkV2ZW50UmVxLkV2ZW50VHlwZVIJZXZlbnRUeXBlEjYKBGl0ZW0YAiABKAsyIi5iaWxpYmls'\n    'aS5hcHAubGlzdGVuZXIudjEuUGxheUl0ZW1SBGl0ZW0iNgoJRXZlbnRUeXBlEhUKEUlOVkFMSU'\n    'RfRXZlbnRUeXBlEAASEgoOR1VJREVfQkFSX1NIT1cQAQ==');\n\n@$core.Deprecated('Use eventRespDescriptor instead')\nconst EventResp$json = {\n  '1': 'EventResp',\n};\n\n/// Descriptor for `EventResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List eventRespDescriptor =\n    $convert.base64Decode('CglFdmVudFJlc3A=');\n\n@$core.Deprecated('Use eventTrackingDescriptor instead')\nconst EventTracking$json = {\n  '1': 'EventTracking',\n  '2': [\n    {'1': 'operator', '3': 1, '4': 1, '5': 9, '10': 'operator'},\n    {'1': 'batch', '3': 2, '4': 1, '5': 9, '10': 'batch'},\n    {'1': 'track_id', '3': 3, '4': 1, '5': 9, '10': 'trackId'},\n    {'1': 'entity_type', '3': 4, '4': 1, '5': 9, '10': 'entityType'},\n    {'1': 'entity_id', '3': 5, '4': 1, '5': 9, '10': 'entityId'},\n    {'1': 'track_json', '3': 6, '4': 1, '5': 9, '10': 'trackJson'},\n  ],\n};\n\n/// Descriptor for `EventTracking`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List eventTrackingDescriptor = $convert.base64Decode(\n    'Cg1FdmVudFRyYWNraW5nEhoKCG9wZXJhdG9yGAEgASgJUghvcGVyYXRvchIUCgViYXRjaBgCIA'\n    'EoCVIFYmF0Y2gSGQoIdHJhY2tfaWQYAyABKAlSB3RyYWNrSWQSHwoLZW50aXR5X3R5cGUYBCAB'\n    'KAlSCmVudGl0eVR5cGUSGwoJZW50aXR5X2lkGAUgASgJUghlbnRpdHlJZBIdCgp0cmFja19qc2'\n    '9uGAYgASgJUgl0cmFja0pzb24=');\n\n@$core.Deprecated('Use favFolderDescriptor instead')\nconst FavFolder$json = {\n  '1': 'FavFolder',\n  '2': [\n    {'1': 'fid', '3': 1, '4': 1, '5': 3, '10': 'fid'},\n    {'1': 'folder_type', '3': 2, '4': 1, '5': 5, '10': 'folderType'},\n    {\n      '1': 'owner',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.FavFolderAuthor',\n      '10': 'owner'\n    },\n    {'1': 'name', '3': 4, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'cover', '3': 5, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'desc', '3': 6, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'count', '3': 7, '4': 1, '5': 5, '10': 'count'},\n    {'1': 'attr', '3': 8, '4': 1, '5': 5, '10': 'attr'},\n    {'1': 'state', '3': 9, '4': 1, '5': 5, '10': 'state'},\n    {'1': 'favored', '3': 10, '4': 1, '5': 5, '10': 'favored'},\n    {'1': 'ctime', '3': 11, '4': 1, '5': 3, '10': 'ctime'},\n    {'1': 'mtime', '3': 12, '4': 1, '5': 3, '10': 'mtime'},\n    {'1': 'stat_fav_cnt', '3': 13, '4': 1, '5': 5, '10': 'statFavCnt'},\n    {'1': 'stat_share_cnt', '3': 14, '4': 1, '5': 5, '10': 'statShareCnt'},\n    {'1': 'stat_like_cnt', '3': 15, '4': 1, '5': 5, '10': 'statLikeCnt'},\n    {'1': 'stat_play_cnt', '3': 16, '4': 1, '5': 5, '10': 'statPlayCnt'},\n    {'1': 'stat_reply_cnt', '3': 17, '4': 1, '5': 5, '10': 'statReplyCnt'},\n    {'1': 'fav_state', '3': 18, '4': 1, '5': 5, '10': 'favState'},\n    {'1': 'use_view_vt', '3': 19, '4': 1, '5': 8, '10': 'useViewVt'},\n    {'1': 'view_vt_text', '3': 20, '4': 1, '5': 9, '10': 'viewVtText'},\n  ],\n};\n\n/// Descriptor for `FavFolder`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List favFolderDescriptor = $convert.base64Decode(\n    'CglGYXZGb2xkZXISEAoDZmlkGAEgASgDUgNmaWQSHwoLZm9sZGVyX3R5cGUYAiABKAVSCmZvbG'\n    'RlclR5cGUSPwoFb3duZXIYAyABKAsyKS5iaWxpYmlsaS5hcHAubGlzdGVuZXIudjEuRmF2Rm9s'\n    'ZGVyQXV0aG9yUgVvd25lchISCgRuYW1lGAQgASgJUgRuYW1lEhQKBWNvdmVyGAUgASgJUgVjb3'\n    'ZlchISCgRkZXNjGAYgASgJUgRkZXNjEhQKBWNvdW50GAcgASgFUgVjb3VudBISCgRhdHRyGAgg'\n    'ASgFUgRhdHRyEhQKBXN0YXRlGAkgASgFUgVzdGF0ZRIYCgdmYXZvcmVkGAogASgFUgdmYXZvcm'\n    'VkEhQKBWN0aW1lGAsgASgDUgVjdGltZRIUCgVtdGltZRgMIAEoA1IFbXRpbWUSIAoMc3RhdF9m'\n    'YXZfY250GA0gASgFUgpzdGF0RmF2Q250EiQKDnN0YXRfc2hhcmVfY250GA4gASgFUgxzdGF0U2'\n    'hhcmVDbnQSIgoNc3RhdF9saWtlX2NudBgPIAEoBVILc3RhdExpa2VDbnQSIgoNc3RhdF9wbGF5'\n    'X2NudBgQIAEoBVILc3RhdFBsYXlDbnQSJAoOc3RhdF9yZXBseV9jbnQYESABKAVSDHN0YXRSZX'\n    'BseUNudBIbCglmYXZfc3RhdGUYEiABKAVSCGZhdlN0YXRlEh4KC3VzZV92aWV3X3Z0GBMgASgI'\n    'Ugl1c2VWaWV3VnQSIAoMdmlld192dF90ZXh0GBQgASgJUgp2aWV3VnRUZXh0');\n\n@$core.Deprecated('Use favFolderActionDescriptor instead')\nconst FavFolderAction$json = {\n  '1': 'FavFolderAction',\n  '2': [\n    {'1': 'fid', '3': 1, '4': 1, '5': 3, '10': 'fid'},\n    {'1': 'folder_type', '3': 2, '4': 1, '5': 5, '10': 'folderType'},\n    {\n      '1': 'action',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.listener.v1.FavFolderAction.Action',\n      '10': 'action'\n    },\n  ],\n  '4': [FavFolderAction_Action$json],\n};\n\n@$core.Deprecated('Use favFolderActionDescriptor instead')\nconst FavFolderAction_Action$json = {\n  '1': 'Action',\n  '2': [\n    {'1': 'UNSPECIFIED', '2': 0},\n    {'1': 'ADD', '2': 1},\n    {'1': 'DEL', '2': 2},\n  ],\n};\n\n/// Descriptor for `FavFolderAction`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List favFolderActionDescriptor = $convert.base64Decode(\n    'Cg9GYXZGb2xkZXJBY3Rpb24SEAoDZmlkGAEgASgDUgNmaWQSHwoLZm9sZGVyX3R5cGUYAiABKA'\n    'VSCmZvbGRlclR5cGUSSAoGYWN0aW9uGAMgASgOMjAuYmlsaWJpbGkuYXBwLmxpc3RlbmVyLnYx'\n    'LkZhdkZvbGRlckFjdGlvbi5BY3Rpb25SBmFjdGlvbiIrCgZBY3Rpb24SDwoLVU5TUEVDSUZJRU'\n    'QQABIHCgNBREQQARIHCgNERUwQAg==');\n\n@$core.Deprecated('Use favFolderAuthorDescriptor instead')\nconst FavFolderAuthor$json = {\n  '1': 'FavFolderAuthor',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n  ],\n};\n\n/// Descriptor for `FavFolderAuthor`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List favFolderAuthorDescriptor = $convert.base64Decode(\n    'Cg9GYXZGb2xkZXJBdXRob3ISEAoDbWlkGAEgASgDUgNtaWQSEgoEbmFtZRgCIAEoCVIEbmFtZQ'\n    '==');\n\n@$core.Deprecated('Use favFolderCreateReqDescriptor instead')\nconst FavFolderCreateReq$json = {\n  '1': 'FavFolderCreateReq',\n  '2': [\n    {'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'desc', '3': 2, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'public', '3': 3, '4': 1, '5': 5, '10': 'public'},\n    {'1': 'folder_type', '3': 4, '4': 1, '5': 5, '10': 'folderType'},\n  ],\n};\n\n/// Descriptor for `FavFolderCreateReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List favFolderCreateReqDescriptor = $convert.base64Decode(\n    'ChJGYXZGb2xkZXJDcmVhdGVSZXESEgoEbmFtZRgBIAEoCVIEbmFtZRISCgRkZXNjGAIgASgJUg'\n    'RkZXNjEhYKBnB1YmxpYxgDIAEoBVIGcHVibGljEh8KC2ZvbGRlcl90eXBlGAQgASgFUgpmb2xk'\n    'ZXJUeXBl');\n\n@$core.Deprecated('Use favFolderCreateRespDescriptor instead')\nconst FavFolderCreateResp$json = {\n  '1': 'FavFolderCreateResp',\n  '2': [\n    {'1': 'fid', '3': 1, '4': 1, '5': 3, '10': 'fid'},\n    {'1': 'folder_type', '3': 2, '4': 1, '5': 5, '10': 'folderType'},\n    {'1': 'message', '3': 3, '4': 1, '5': 9, '10': 'message'},\n  ],\n};\n\n/// Descriptor for `FavFolderCreateResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List favFolderCreateRespDescriptor = $convert.base64Decode(\n    'ChNGYXZGb2xkZXJDcmVhdGVSZXNwEhAKA2ZpZBgBIAEoA1IDZmlkEh8KC2ZvbGRlcl90eXBlGA'\n    'IgASgFUgpmb2xkZXJUeXBlEhgKB21lc3NhZ2UYAyABKAlSB21lc3NhZ2U=');\n\n@$core.Deprecated('Use favFolderDeleteReqDescriptor instead')\nconst FavFolderDeleteReq$json = {\n  '1': 'FavFolderDeleteReq',\n  '2': [\n    {'1': 'fid', '3': 1, '4': 1, '5': 3, '10': 'fid'},\n    {'1': 'folder_type', '3': 2, '4': 1, '5': 5, '10': 'folderType'},\n  ],\n};\n\n/// Descriptor for `FavFolderDeleteReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List favFolderDeleteReqDescriptor = $convert.base64Decode(\n    'ChJGYXZGb2xkZXJEZWxldGVSZXESEAoDZmlkGAEgASgDUgNmaWQSHwoLZm9sZGVyX3R5cGUYAi'\n    'ABKAVSCmZvbGRlclR5cGU=');\n\n@$core.Deprecated('Use favFolderDeleteRespDescriptor instead')\nconst FavFolderDeleteResp$json = {\n  '1': 'FavFolderDeleteResp',\n  '2': [\n    {'1': 'message', '3': 1, '4': 1, '5': 9, '10': 'message'},\n  ],\n};\n\n/// Descriptor for `FavFolderDeleteResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List favFolderDeleteRespDescriptor =\n    $convert.base64Decode(\n        'ChNGYXZGb2xkZXJEZWxldGVSZXNwEhgKB21lc3NhZ2UYASABKAlSB21lc3NhZ2U=');\n\n@$core.Deprecated('Use favFolderDetailReqDescriptor instead')\nconst FavFolderDetailReq$json = {\n  '1': 'FavFolderDetailReq',\n  '2': [\n    {'1': 'fid', '3': 1, '4': 1, '5': 3, '10': 'fid'},\n    {'1': 'folder_type', '3': 2, '4': 1, '5': 5, '10': 'folderType'},\n    {'1': 'fav_mid', '3': 3, '4': 1, '5': 3, '10': 'favMid'},\n    {\n      '1': 'last_item',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.FavItem',\n      '10': 'lastItem'\n    },\n    {'1': 'page_size', '3': 5, '4': 1, '5': 5, '10': 'pageSize'},\n    {'1': 'need_folder_info', '3': 6, '4': 1, '5': 8, '10': 'needFolderInfo'},\n  ],\n};\n\n/// Descriptor for `FavFolderDetailReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List favFolderDetailReqDescriptor = $convert.base64Decode(\n    'ChJGYXZGb2xkZXJEZXRhaWxSZXESEAoDZmlkGAEgASgDUgNmaWQSHwoLZm9sZGVyX3R5cGUYAi'\n    'ABKAVSCmZvbGRlclR5cGUSFwoHZmF2X21pZBgDIAEoA1IGZmF2TWlkEj4KCWxhc3RfaXRlbRgE'\n    'IAEoCzIhLmJpbGliaWxpLmFwcC5saXN0ZW5lci52MS5GYXZJdGVtUghsYXN0SXRlbRIbCglwYW'\n    'dlX3NpemUYBSABKAVSCHBhZ2VTaXplEigKEG5lZWRfZm9sZGVyX2luZm8YBiABKAhSDm5lZWRG'\n    'b2xkZXJJbmZv');\n\n@$core.Deprecated('Use favFolderDetailRespDescriptor instead')\nconst FavFolderDetailResp$json = {\n  '1': 'FavFolderDetailResp',\n  '2': [\n    {'1': 'total', '3': 1, '4': 1, '5': 5, '10': 'total'},\n    {'1': 'reach_end', '3': 2, '4': 1, '5': 8, '10': 'reachEnd'},\n    {\n      '1': 'list',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.FavItemDetail',\n      '10': 'list'\n    },\n    {\n      '1': 'folder_info',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.FavFolder',\n      '10': 'folderInfo'\n    },\n  ],\n};\n\n/// Descriptor for `FavFolderDetailResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List favFolderDetailRespDescriptor = $convert.base64Decode(\n    'ChNGYXZGb2xkZXJEZXRhaWxSZXNwEhQKBXRvdGFsGAEgASgFUgV0b3RhbBIbCglyZWFjaF9lbm'\n    'QYAiABKAhSCHJlYWNoRW5kEjsKBGxpc3QYAyADKAsyJy5iaWxpYmlsaS5hcHAubGlzdGVuZXIu'\n    'djEuRmF2SXRlbURldGFpbFIEbGlzdBJECgtmb2xkZXJfaW5mbxgEIAEoCzIjLmJpbGliaWxpLm'\n    'FwcC5saXN0ZW5lci52MS5GYXZGb2xkZXJSCmZvbGRlckluZm8=');\n\n@$core.Deprecated('Use favFolderListReqDescriptor instead')\nconst FavFolderListReq$json = {\n  '1': 'FavFolderListReq',\n  '2': [\n    {'1': 'folder_types', '3': 1, '4': 3, '5': 5, '10': 'folderTypes'},\n    {\n      '1': 'item',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayItem',\n      '10': 'item'\n    },\n  ],\n};\n\n/// Descriptor for `FavFolderListReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List favFolderListReqDescriptor = $convert.base64Decode(\n    'ChBGYXZGb2xkZXJMaXN0UmVxEiEKDGZvbGRlcl90eXBlcxgBIAMoBVILZm9sZGVyVHlwZXMSNg'\n    'oEaXRlbRgCIAEoCzIiLmJpbGliaWxpLmFwcC5saXN0ZW5lci52MS5QbGF5SXRlbVIEaXRlbQ==');\n\n@$core.Deprecated('Use favFolderListRespDescriptor instead')\nconst FavFolderListResp$json = {\n  '1': 'FavFolderListResp',\n  '2': [\n    {\n      '1': 'list',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.FavFolder',\n      '10': 'list'\n    },\n  ],\n};\n\n/// Descriptor for `FavFolderListResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List favFolderListRespDescriptor = $convert.base64Decode(\n    'ChFGYXZGb2xkZXJMaXN0UmVzcBI3CgRsaXN0GAEgAygLMiMuYmlsaWJpbGkuYXBwLmxpc3Rlbm'\n    'VyLnYxLkZhdkZvbGRlclIEbGlzdA==');\n\n@$core.Deprecated('Use favFolderMetaDescriptor instead')\nconst FavFolderMeta$json = {\n  '1': 'FavFolderMeta',\n  '2': [\n    {'1': 'fid', '3': 1, '4': 1, '5': 3, '10': 'fid'},\n    {'1': 'folder_type', '3': 2, '4': 1, '5': 5, '10': 'folderType'},\n  ],\n};\n\n/// Descriptor for `FavFolderMeta`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List favFolderMetaDescriptor = $convert.base64Decode(\n    'Cg1GYXZGb2xkZXJNZXRhEhAKA2ZpZBgBIAEoA1IDZmlkEh8KC2ZvbGRlcl90eXBlGAIgASgFUg'\n    'pmb2xkZXJUeXBl');\n\n@$core.Deprecated('Use favItemDescriptor instead')\nconst FavItem$json = {\n  '1': 'FavItem',\n  '2': [\n    {'1': 'item_type', '3': 1, '4': 1, '5': 5, '10': 'itemType'},\n    {'1': 'oid', '3': 2, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'fid', '3': 3, '4': 1, '5': 3, '10': 'fid'},\n    {'1': 'mid', '3': 4, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'mtime', '3': 5, '4': 1, '5': 3, '10': 'mtime'},\n    {'1': 'ctime', '3': 6, '4': 1, '5': 3, '10': 'ctime'},\n    {\n      '1': 'et',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.EventTracking',\n      '10': 'et'\n    },\n  ],\n};\n\n/// Descriptor for `FavItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List favItemDescriptor = $convert.base64Decode(\n    'CgdGYXZJdGVtEhsKCWl0ZW1fdHlwZRgBIAEoBVIIaXRlbVR5cGUSEAoDb2lkGAIgASgDUgNvaW'\n    'QSEAoDZmlkGAMgASgDUgNmaWQSEAoDbWlkGAQgASgDUgNtaWQSFAoFbXRpbWUYBSABKANSBW10'\n    'aW1lEhQKBWN0aW1lGAYgASgDUgVjdGltZRI3CgJldBgHIAEoCzInLmJpbGliaWxpLmFwcC5saX'\n    'N0ZW5lci52MS5FdmVudFRyYWNraW5nUgJldA==');\n\n@$core.Deprecated('Use favItemAddReqDescriptor instead')\nconst FavItemAddReq$json = {\n  '1': 'FavItemAddReq',\n  '2': [\n    {\n      '1': 'play',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayItem',\n      '9': 0,\n      '10': 'play'\n    },\n    {\n      '1': 'fav',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.FavItem',\n      '9': 0,\n      '10': 'fav'\n    },\n    {'1': 'fid', '3': 1, '4': 1, '5': 3, '10': 'fid'},\n    {'1': 'folder_type', '3': 2, '4': 1, '5': 5, '10': 'folderType'},\n    {'1': 'is_fast_add_fav', '3': 5, '4': 1, '5': 8, '10': 'isFastAddFav'},\n  ],\n  '8': [\n    {'1': 'item'},\n  ],\n};\n\n/// Descriptor for `FavItemAddReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List favItemAddReqDescriptor = $convert.base64Decode(\n    'Cg1GYXZJdGVtQWRkUmVxEjgKBHBsYXkYAyABKAsyIi5iaWxpYmlsaS5hcHAubGlzdGVuZXIudj'\n    'EuUGxheUl0ZW1IAFIEcGxheRI1CgNmYXYYBCABKAsyIS5iaWxpYmlsaS5hcHAubGlzdGVuZXIu'\n    'djEuRmF2SXRlbUgAUgNmYXYSEAoDZmlkGAEgASgDUgNmaWQSHwoLZm9sZGVyX3R5cGUYAiABKA'\n    'VSCmZvbGRlclR5cGUSJQoPaXNfZmFzdF9hZGRfZmF2GAUgASgIUgxpc0Zhc3RBZGRGYXZCBgoE'\n    'aXRlbQ==');\n\n@$core.Deprecated('Use favItemAddRespDescriptor instead')\nconst FavItemAddResp$json = {\n  '1': 'FavItemAddResp',\n  '2': [\n    {'1': 'message', '3': 1, '4': 1, '5': 9, '10': 'message'},\n  ],\n};\n\n/// Descriptor for `FavItemAddResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List favItemAddRespDescriptor = $convert\n    .base64Decode('Cg5GYXZJdGVtQWRkUmVzcBIYCgdtZXNzYWdlGAEgASgJUgdtZXNzYWdl');\n\n@$core.Deprecated('Use favItemAuthorDescriptor instead')\nconst FavItemAuthor$json = {\n  '1': 'FavItemAuthor',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n  ],\n};\n\n/// Descriptor for `FavItemAuthor`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List favItemAuthorDescriptor = $convert.base64Decode(\n    'Cg1GYXZJdGVtQXV0aG9yEhAKA21pZBgBIAEoA1IDbWlkEhIKBG5hbWUYAiABKAlSBG5hbWU=');\n\n@$core.Deprecated('Use favItemBatchReqDescriptor instead')\nconst FavItemBatchReq$json = {\n  '1': 'FavItemBatchReq',\n  '2': [\n    {\n      '1': 'play',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayItem',\n      '9': 0,\n      '10': 'play'\n    },\n    {\n      '1': 'fav',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.FavItem',\n      '9': 0,\n      '10': 'fav'\n    },\n    {\n      '1': 'actions',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.FavFolderAction',\n      '10': 'actions'\n    },\n  ],\n  '8': [\n    {'1': 'item'},\n  ],\n};\n\n/// Descriptor for `FavItemBatchReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List favItemBatchReqDescriptor = $convert.base64Decode(\n    'Cg9GYXZJdGVtQmF0Y2hSZXESOAoEcGxheRgCIAEoCzIiLmJpbGliaWxpLmFwcC5saXN0ZW5lci'\n    '52MS5QbGF5SXRlbUgAUgRwbGF5EjUKA2ZhdhgDIAEoCzIhLmJpbGliaWxpLmFwcC5saXN0ZW5l'\n    'ci52MS5GYXZJdGVtSABSA2ZhdhJDCgdhY3Rpb25zGAEgAygLMikuYmlsaWJpbGkuYXBwLmxpc3'\n    'RlbmVyLnYxLkZhdkZvbGRlckFjdGlvblIHYWN0aW9uc0IGCgRpdGVt');\n\n@$core.Deprecated('Use favItemBatchRespDescriptor instead')\nconst FavItemBatchResp$json = {\n  '1': 'FavItemBatchResp',\n  '2': [\n    {'1': 'message', '3': 1, '4': 1, '5': 9, '10': 'message'},\n  ],\n};\n\n/// Descriptor for `FavItemBatchResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List favItemBatchRespDescriptor = $convert.base64Decode(\n    'ChBGYXZJdGVtQmF0Y2hSZXNwEhgKB21lc3NhZ2UYASABKAlSB21lc3NhZ2U=');\n\n@$core.Deprecated('Use favItemDelReqDescriptor instead')\nconst FavItemDelReq$json = {\n  '1': 'FavItemDelReq',\n  '2': [\n    {\n      '1': 'play',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayItem',\n      '9': 0,\n      '10': 'play'\n    },\n    {\n      '1': 'fav',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.FavItem',\n      '9': 0,\n      '10': 'fav'\n    },\n    {'1': 'fid', '3': 1, '4': 1, '5': 3, '10': 'fid'},\n    {'1': 'folder_type', '3': 2, '4': 1, '5': 5, '10': 'folderType'},\n    {'1': 'is_fast_del_fav', '3': 5, '4': 1, '5': 8, '10': 'isFastDelFav'},\n  ],\n  '8': [\n    {'1': 'item'},\n  ],\n};\n\n/// Descriptor for `FavItemDelReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List favItemDelReqDescriptor = $convert.base64Decode(\n    'Cg1GYXZJdGVtRGVsUmVxEjgKBHBsYXkYAyABKAsyIi5iaWxpYmlsaS5hcHAubGlzdGVuZXIudj'\n    'EuUGxheUl0ZW1IAFIEcGxheRI1CgNmYXYYBCABKAsyIS5iaWxpYmlsaS5hcHAubGlzdGVuZXIu'\n    'djEuRmF2SXRlbUgAUgNmYXYSEAoDZmlkGAEgASgDUgNmaWQSHwoLZm9sZGVyX3R5cGUYAiABKA'\n    'VSCmZvbGRlclR5cGUSJQoPaXNfZmFzdF9kZWxfZmF2GAUgASgIUgxpc0Zhc3REZWxGYXZCBgoE'\n    'aXRlbQ==');\n\n@$core.Deprecated('Use favItemDelRespDescriptor instead')\nconst FavItemDelResp$json = {\n  '1': 'FavItemDelResp',\n  '2': [\n    {'1': 'message', '3': 1, '4': 1, '5': 9, '10': 'message'},\n  ],\n};\n\n/// Descriptor for `FavItemDelResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List favItemDelRespDescriptor = $convert\n    .base64Decode('Cg5GYXZJdGVtRGVsUmVzcBIYCgdtZXNzYWdlGAEgASgJUgdtZXNzYWdl');\n\n@$core.Deprecated('Use favItemDetailDescriptor instead')\nconst FavItemDetail$json = {\n  '1': 'FavItemDetail',\n  '2': [\n    {\n      '1': 'item',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.FavItem',\n      '10': 'item'\n    },\n    {\n      '1': 'owner',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.FavItemAuthor',\n      '10': 'owner'\n    },\n    {\n      '1': 'stat',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.FavItemStat',\n      '10': 'stat'\n    },\n    {'1': 'cover', '3': 4, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'name', '3': 5, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'duration', '3': 6, '4': 1, '5': 3, '10': 'duration'},\n    {'1': 'state', '3': 7, '4': 1, '5': 5, '10': 'state'},\n    {'1': 'message', '3': 8, '4': 1, '5': 9, '10': 'message'},\n    {'1': 'parts', '3': 9, '4': 1, '5': 5, '10': 'parts'},\n  ],\n};\n\n/// Descriptor for `FavItemDetail`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List favItemDetailDescriptor = $convert.base64Decode(\n    'Cg1GYXZJdGVtRGV0YWlsEjUKBGl0ZW0YASABKAsyIS5iaWxpYmlsaS5hcHAubGlzdGVuZXIudj'\n    'EuRmF2SXRlbVIEaXRlbRI9CgVvd25lchgCIAEoCzInLmJpbGliaWxpLmFwcC5saXN0ZW5lci52'\n    'MS5GYXZJdGVtQXV0aG9yUgVvd25lchI5CgRzdGF0GAMgASgLMiUuYmlsaWJpbGkuYXBwLmxpc3'\n    'RlbmVyLnYxLkZhdkl0ZW1TdGF0UgRzdGF0EhQKBWNvdmVyGAQgASgJUgVjb3ZlchISCgRuYW1l'\n    'GAUgASgJUgRuYW1lEhoKCGR1cmF0aW9uGAYgASgDUghkdXJhdGlvbhIUCgVzdGF0ZRgHIAEoBV'\n    'IFc3RhdGUSGAoHbWVzc2FnZRgIIAEoCVIHbWVzc2FnZRIUCgVwYXJ0cxgJIAEoBVIFcGFydHM=');\n\n@$core.Deprecated('Use favItemStatDescriptor instead')\nconst FavItemStat$json = {\n  '1': 'FavItemStat',\n  '2': [\n    {'1': 'view', '3': 1, '4': 1, '5': 5, '10': 'view'},\n    {'1': 'reply', '3': 2, '4': 1, '5': 5, '10': 'reply'},\n    {'1': 'use_view_vt', '3': 3, '4': 1, '5': 8, '10': 'useViewVt'},\n    {'1': 'view_vt_text', '3': 4, '4': 1, '5': 9, '10': 'viewVtText'},\n  ],\n};\n\n/// Descriptor for `FavItemStat`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List favItemStatDescriptor = $convert.base64Decode(\n    'CgtGYXZJdGVtU3RhdBISCgR2aWV3GAEgASgFUgR2aWV3EhQKBXJlcGx5GAIgASgFUgVyZXBseR'\n    'IeCgt1c2Vfdmlld192dBgDIAEoCFIJdXNlVmlld1Z0EiAKDHZpZXdfdnRfdGV4dBgEIAEoCVIK'\n    'dmlld1Z0VGV4dA==');\n\n@$core.Deprecated('Use favTabShowReqDescriptor instead')\nconst FavTabShowReq$json = {\n  '1': 'FavTabShowReq',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n  ],\n};\n\n/// Descriptor for `FavTabShowReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List favTabShowReqDescriptor =\n    $convert.base64Decode('Cg1GYXZUYWJTaG93UmVxEhAKA21pZBgBIAEoA1IDbWlk');\n\n@$core.Deprecated('Use favTabShowRespDescriptor instead')\nconst FavTabShowResp$json = {\n  '1': 'FavTabShowResp',\n  '2': [\n    {'1': 'show_menu', '3': 1, '4': 1, '5': 8, '10': 'showMenu'},\n  ],\n};\n\n/// Descriptor for `FavTabShowResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List favTabShowRespDescriptor = $convert.base64Decode(\n    'Cg5GYXZUYWJTaG93UmVzcBIbCglzaG93X21lbnUYASABKAhSCHNob3dNZW51');\n\n@$core.Deprecated('Use favoredInAnyFoldersReqDescriptor instead')\nconst FavoredInAnyFoldersReq$json = {\n  '1': 'FavoredInAnyFoldersReq',\n  '2': [\n    {'1': 'folder_types', '3': 1, '4': 3, '5': 5, '10': 'folderTypes'},\n    {\n      '1': 'item',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayItem',\n      '10': 'item'\n    },\n  ],\n};\n\n/// Descriptor for `FavoredInAnyFoldersReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List favoredInAnyFoldersReqDescriptor = $convert.base64Decode(\n    'ChZGYXZvcmVkSW5BbnlGb2xkZXJzUmVxEiEKDGZvbGRlcl90eXBlcxgBIAMoBVILZm9sZGVyVH'\n    'lwZXMSNgoEaXRlbRgCIAEoCzIiLmJpbGliaWxpLmFwcC5saXN0ZW5lci52MS5QbGF5SXRlbVIE'\n    'aXRlbQ==');\n\n@$core.Deprecated('Use favoredInAnyFoldersRespDescriptor instead')\nconst FavoredInAnyFoldersResp$json = {\n  '1': 'FavoredInAnyFoldersResp',\n  '2': [\n    {\n      '1': 'folders',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.FavFolderMeta',\n      '10': 'folders'\n    },\n    {\n      '1': 'item',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayItem',\n      '10': 'item'\n    },\n  ],\n};\n\n/// Descriptor for `FavoredInAnyFoldersResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List favoredInAnyFoldersRespDescriptor = $convert.base64Decode(\n    'ChdGYXZvcmVkSW5BbnlGb2xkZXJzUmVzcBJBCgdmb2xkZXJzGAEgAygLMicuYmlsaWJpbGkuYX'\n    'BwLmxpc3RlbmVyLnYxLkZhdkZvbGRlck1ldGFSB2ZvbGRlcnMSNgoEaXRlbRgCIAEoCzIiLmJp'\n    'bGliaWxpLmFwcC5saXN0ZW5lci52MS5QbGF5SXRlbVIEaXRlbQ==');\n\n@$core.Deprecated('Use followRelationDescriptor instead')\nconst FollowRelation$json = {\n  '1': 'FollowRelation',\n  '2': [\n    {\n      '1': 'status',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.listener.v1.FollowRelation.RelationStatus',\n      '10': 'status'\n    },\n  ],\n  '4': [FollowRelation_RelationStatus$json],\n};\n\n@$core.Deprecated('Use followRelationDescriptor instead')\nconst FollowRelation_RelationStatus$json = {\n  '1': 'RelationStatus',\n  '2': [\n    {'1': 'UNSPECIFIED_RelationStatus', '2': 0},\n    {'1': 'NO_FOLLOW', '2': 1},\n    {'1': 'FOLLOWING', '2': 2},\n    {'1': 'FOLLOWED', '2': 3},\n    {'1': 'MUTUAL_FOLLOWING', '2': 4},\n    {'1': 'SPECIAL_FOLLOWING', '2': 5},\n  ],\n};\n\n/// Descriptor for `FollowRelation`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List followRelationDescriptor = $convert.base64Decode(\n    'Cg5Gb2xsb3dSZWxhdGlvbhJPCgZzdGF0dXMYASABKA4yNy5iaWxpYmlsaS5hcHAubGlzdGVuZX'\n    'IudjEuRm9sbG93UmVsYXRpb24uUmVsYXRpb25TdGF0dXNSBnN0YXR1cyKJAQoOUmVsYXRpb25T'\n    'dGF0dXMSHgoaVU5TUEVDSUZJRURfUmVsYXRpb25TdGF0dXMQABINCglOT19GT0xMT1cQARINCg'\n    'lGT0xMT1dJTkcQAhIMCghGT0xMT1dFRBADEhQKEE1VVFVBTF9GT0xMT1dJTkcQBBIVChFTUEVD'\n    'SUFMX0ZPTExPV0lORxAF');\n\n@$core.Deprecated('Use formatDescriptionDescriptor instead')\nconst FormatDescription$json = {\n  '1': 'FormatDescription',\n  '2': [\n    {'1': 'quality', '3': 1, '4': 1, '5': 5, '10': 'quality'},\n    {'1': 'format', '3': 2, '4': 1, '5': 9, '10': 'format'},\n    {'1': 'description', '3': 3, '4': 1, '5': 9, '10': 'description'},\n    {'1': 'display_desc', '3': 4, '4': 1, '5': 9, '10': 'displayDesc'},\n    {'1': 'superscript', '3': 5, '4': 1, '5': 9, '10': 'superscript'},\n  ],\n};\n\n/// Descriptor for `FormatDescription`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List formatDescriptionDescriptor = $convert.base64Decode(\n    'ChFGb3JtYXREZXNjcmlwdGlvbhIYCgdxdWFsaXR5GAEgASgFUgdxdWFsaXR5EhYKBmZvcm1hdB'\n    'gCIAEoCVIGZm9ybWF0EiAKC2Rlc2NyaXB0aW9uGAMgASgJUgtkZXNjcmlwdGlvbhIhCgxkaXNw'\n    'bGF5X2Rlc2MYBCABKAlSC2Rpc3BsYXlEZXNjEiAKC3N1cGVyc2NyaXB0GAUgASgJUgtzdXBlcn'\n    'NjcmlwdA==');\n\n@$core.Deprecated('Use mainFavMusicMenuListReqDescriptor instead')\nconst MainFavMusicMenuListReq$json = {\n  '1': 'MainFavMusicMenuListReq',\n  '2': [\n    {'1': 'tab_type', '3': 1, '4': 1, '5': 5, '10': 'tabType'},\n    {'1': 'offset', '3': 2, '4': 1, '5': 9, '10': 'offset'},\n  ],\n};\n\n/// Descriptor for `MainFavMusicMenuListReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mainFavMusicMenuListReqDescriptor =\n    $convert.base64Decode(\n        'ChdNYWluRmF2TXVzaWNNZW51TGlzdFJlcRIZCgh0YWJfdHlwZRgBIAEoBVIHdGFiVHlwZRIWCg'\n        'ZvZmZzZXQYAiABKAlSBm9mZnNldA==');\n\n@$core.Deprecated('Use mainFavMusicMenuListRespDescriptor instead')\nconst MainFavMusicMenuListResp$json = {\n  '1': 'MainFavMusicMenuListResp',\n  '2': [\n    {'1': 'tab_type', '3': 1, '4': 1, '5': 5, '10': 'tabType'},\n    {\n      '1': 'menu_list',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.MusicMenu',\n      '10': 'menuList'\n    },\n    {'1': 'has_more', '3': 3, '4': 1, '5': 8, '10': 'hasMore'},\n    {'1': 'offset', '3': 4, '4': 1, '5': 9, '10': 'offset'},\n  ],\n};\n\n/// Descriptor for `MainFavMusicMenuListResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mainFavMusicMenuListRespDescriptor = $convert.base64Decode(\n    'ChhNYWluRmF2TXVzaWNNZW51TGlzdFJlc3ASGQoIdGFiX3R5cGUYASABKAVSB3RhYlR5cGUSQA'\n    'oJbWVudV9saXN0GAIgAygLMiMuYmlsaWJpbGkuYXBwLmxpc3RlbmVyLnYxLk11c2ljTWVudVII'\n    'bWVudUxpc3QSGQoIaGFzX21vcmUYAyABKAhSB2hhc01vcmUSFgoGb2Zmc2V0GAQgASgJUgZvZm'\n    'ZzZXQ=');\n\n@$core.Deprecated('Use mainFavMusicSubTabListReqDescriptor instead')\nconst MainFavMusicSubTabListReq$json = {\n  '1': 'MainFavMusicSubTabListReq',\n};\n\n/// Descriptor for `MainFavMusicSubTabListReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mainFavMusicSubTabListReqDescriptor =\n    $convert.base64Decode('ChlNYWluRmF2TXVzaWNTdWJUYWJMaXN0UmVx');\n\n@$core.Deprecated('Use mainFavMusicSubTabListRespDescriptor instead')\nconst MainFavMusicSubTabListResp$json = {\n  '1': 'MainFavMusicSubTabListResp',\n  '2': [\n    {\n      '1': 'tabs',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.MusicSubTab',\n      '10': 'tabs'\n    },\n    {\n      '1': 'default_tab_res',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.MainFavMusicMenuListResp',\n      '10': 'defaultTabRes'\n    },\n    {\n      '1': 'first_page_res',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6':\n          '.bilibili.app.listener.v1.MainFavMusicSubTabListResp.FirstPageResEntry',\n      '10': 'firstPageRes'\n    },\n  ],\n  '3': [MainFavMusicSubTabListResp_FirstPageResEntry$json],\n};\n\n@$core.Deprecated('Use mainFavMusicSubTabListRespDescriptor instead')\nconst MainFavMusicSubTabListResp_FirstPageResEntry$json = {\n  '1': 'FirstPageResEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 5, '10': 'key'},\n    {\n      '1': 'value',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.MainFavMusicMenuListResp',\n      '10': 'value'\n    },\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `MainFavMusicSubTabListResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mainFavMusicSubTabListRespDescriptor = $convert.base64Decode(\n    'ChpNYWluRmF2TXVzaWNTdWJUYWJMaXN0UmVzcBI5CgR0YWJzGAEgAygLMiUuYmlsaWJpbGkuYX'\n    'BwLmxpc3RlbmVyLnYxLk11c2ljU3ViVGFiUgR0YWJzEloKD2RlZmF1bHRfdGFiX3JlcxgCIAEo'\n    'CzIyLmJpbGliaWxpLmFwcC5saXN0ZW5lci52MS5NYWluRmF2TXVzaWNNZW51TGlzdFJlc3BSDW'\n    'RlZmF1bHRUYWJSZXMSbAoOZmlyc3RfcGFnZV9yZXMYAyADKAsyRi5iaWxpYmlsaS5hcHAubGlz'\n    'dGVuZXIudjEuTWFpbkZhdk11c2ljU3ViVGFiTGlzdFJlc3AuRmlyc3RQYWdlUmVzRW50cnlSDG'\n    'ZpcnN0UGFnZVJlcxpzChFGaXJzdFBhZ2VSZXNFbnRyeRIQCgNrZXkYASABKAVSA2tleRJICgV2'\n    'YWx1ZRgCIAEoCzIyLmJpbGliaWxpLmFwcC5saXN0ZW5lci52MS5NYWluRmF2TXVzaWNNZW51TG'\n    'lzdFJlc3BSBXZhbHVlOgI4AQ==');\n\n@$core.Deprecated('Use medialistItemDescriptor instead')\nconst MedialistItem$json = {\n  '1': 'MedialistItem',\n  '2': [\n    {\n      '1': 'item',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayItem',\n      '10': 'item'\n    },\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 3, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'duration', '3': 4, '4': 1, '5': 3, '10': 'duration'},\n    {'1': 'parts', '3': 5, '4': 1, '5': 5, '10': 'parts'},\n    {'1': 'up_mid', '3': 6, '4': 1, '5': 3, '10': 'upMid'},\n    {'1': 'up_name', '3': 7, '4': 1, '5': 9, '10': 'upName'},\n    {'1': 'state', '3': 8, '4': 1, '5': 5, '10': 'state'},\n    {'1': 'message', '3': 9, '4': 1, '5': 9, '10': 'message'},\n    {'1': 'stat_view', '3': 10, '4': 1, '5': 3, '10': 'statView'},\n    {'1': 'stat_reply', '3': 11, '4': 1, '5': 3, '10': 'statReply'},\n    {'1': 'use_stat_view_vt', '3': 12, '4': 1, '5': 8, '10': 'useStatViewVt'},\n    {'1': 'stat_view_vt_text', '3': 13, '4': 1, '5': 9, '10': 'statViewVtText'},\n  ],\n};\n\n/// Descriptor for `MedialistItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List medialistItemDescriptor = $convert.base64Decode(\n    'Cg1NZWRpYWxpc3RJdGVtEjYKBGl0ZW0YASABKAsyIi5iaWxpYmlsaS5hcHAubGlzdGVuZXIudj'\n    'EuUGxheUl0ZW1SBGl0ZW0SFAoFdGl0bGUYAiABKAlSBXRpdGxlEhQKBWNvdmVyGAMgASgJUgVj'\n    'b3ZlchIaCghkdXJhdGlvbhgEIAEoA1IIZHVyYXRpb24SFAoFcGFydHMYBSABKAVSBXBhcnRzEh'\n    'UKBnVwX21pZBgGIAEoA1IFdXBNaWQSFwoHdXBfbmFtZRgHIAEoCVIGdXBOYW1lEhQKBXN0YXRl'\n    'GAggASgFUgVzdGF0ZRIYCgdtZXNzYWdlGAkgASgJUgdtZXNzYWdlEhsKCXN0YXRfdmlldxgKIA'\n    'EoA1IIc3RhdFZpZXcSHQoKc3RhdF9yZXBseRgLIAEoA1IJc3RhdFJlcGx5EicKEHVzZV9zdGF0'\n    'X3ZpZXdfdnQYDCABKAhSDXVzZVN0YXRWaWV3VnQSKQoRc3RhdF92aWV3X3Z0X3RleHQYDSABKA'\n    'lSDnN0YXRWaWV3VnRUZXh0');\n\n@$core.Deprecated('Use medialistReqDescriptor instead')\nconst MedialistReq$json = {\n  '1': 'MedialistReq',\n  '2': [\n    {'1': 'list_type', '3': 1, '4': 1, '5': 3, '10': 'listType'},\n    {'1': 'biz_id', '3': 2, '4': 1, '5': 3, '10': 'bizId'},\n    {'1': 'offset', '3': 3, '4': 1, '5': 9, '10': 'offset'},\n  ],\n};\n\n/// Descriptor for `MedialistReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List medialistReqDescriptor = $convert.base64Decode(\n    'CgxNZWRpYWxpc3RSZXESGwoJbGlzdF90eXBlGAEgASgDUghsaXN0VHlwZRIVCgZiaXpfaWQYAi'\n    'ABKANSBWJpeklkEhYKBm9mZnNldBgDIAEoCVIGb2Zmc2V0');\n\n@$core.Deprecated('Use medialistRespDescriptor instead')\nconst MedialistResp$json = {\n  '1': 'MedialistResp',\n  '2': [\n    {'1': 'total', '3': 1, '4': 1, '5': 3, '10': 'total'},\n    {'1': 'has_more', '3': 2, '4': 1, '5': 8, '10': 'hasMore'},\n    {'1': 'offset', '3': 3, '4': 1, '5': 9, '10': 'offset'},\n    {\n      '1': 'items',\n      '3': 4,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.MedialistItem',\n      '10': 'items'\n    },\n    {\n      '1': 'up_info',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.MedialistUpInfo',\n      '10': 'upInfo'\n    },\n  ],\n};\n\n/// Descriptor for `MedialistResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List medialistRespDescriptor = $convert.base64Decode(\n    'Cg1NZWRpYWxpc3RSZXNwEhQKBXRvdGFsGAEgASgDUgV0b3RhbBIZCghoYXNfbW9yZRgCIAEoCF'\n    'IHaGFzTW9yZRIWCgZvZmZzZXQYAyABKAlSBm9mZnNldBI9CgVpdGVtcxgEIAMoCzInLmJpbGli'\n    'aWxpLmFwcC5saXN0ZW5lci52MS5NZWRpYWxpc3RJdGVtUgVpdGVtcxJCCgd1cF9pbmZvGAUgAS'\n    'gLMikuYmlsaWJpbGkuYXBwLmxpc3RlbmVyLnYxLk1lZGlhbGlzdFVwSW5mb1IGdXBJbmZv');\n\n@$core.Deprecated('Use medialistUpInfoDescriptor instead')\nconst MedialistUpInfo$json = {\n  '1': 'MedialistUpInfo',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'avatar', '3': 2, '4': 1, '5': 9, '10': 'avatar'},\n    {'1': 'fans', '3': 3, '4': 1, '5': 3, '10': 'fans'},\n    {'1': 'name', '3': 4, '4': 1, '5': 9, '10': 'name'},\n  ],\n};\n\n/// Descriptor for `MedialistUpInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List medialistUpInfoDescriptor = $convert.base64Decode(\n    'Cg9NZWRpYWxpc3RVcEluZm8SEAoDbWlkGAEgASgDUgNtaWQSFgoGYXZhdGFyGAIgASgJUgZhdm'\n    'F0YXISEgoEZmFucxgDIAEoA1IEZmFucxISCgRuYW1lGAQgASgJUgRuYW1l');\n\n@$core.Deprecated('Use menuDeleteReqDescriptor instead')\nconst MenuDeleteReq$json = {\n  '1': 'MenuDeleteReq',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n  ],\n};\n\n/// Descriptor for `MenuDeleteReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List menuDeleteReqDescriptor =\n    $convert.base64Decode('Cg1NZW51RGVsZXRlUmVxEg4KAmlkGAEgASgDUgJpZA==');\n\n@$core.Deprecated('Use menuDeleteRespDescriptor instead')\nconst MenuDeleteResp$json = {\n  '1': 'MenuDeleteResp',\n  '2': [\n    {'1': 'message', '3': 1, '4': 1, '5': 9, '10': 'message'},\n  ],\n};\n\n/// Descriptor for `MenuDeleteResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List menuDeleteRespDescriptor = $convert\n    .base64Decode('Cg5NZW51RGVsZXRlUmVzcBIYCgdtZXNzYWdlGAEgASgJUgdtZXNzYWdl');\n\n@$core.Deprecated('Use menuEditReqDescriptor instead')\nconst MenuEditReq$json = {\n  '1': 'MenuEditReq',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'desc', '3': 3, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'is_public', '3': 4, '4': 1, '5': 5, '10': 'isPublic'},\n  ],\n};\n\n/// Descriptor for `MenuEditReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List menuEditReqDescriptor = $convert.base64Decode(\n    'CgtNZW51RWRpdFJlcRIOCgJpZBgBIAEoA1ICaWQSFAoFdGl0bGUYAiABKAlSBXRpdGxlEhIKBG'\n    'Rlc2MYAyABKAlSBGRlc2MSGwoJaXNfcHVibGljGAQgASgFUghpc1B1YmxpYw==');\n\n@$core.Deprecated('Use menuEditRespDescriptor instead')\nconst MenuEditResp$json = {\n  '1': 'MenuEditResp',\n  '2': [\n    {'1': 'message', '3': 1, '4': 1, '5': 9, '10': 'message'},\n  ],\n};\n\n/// Descriptor for `MenuEditResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List menuEditRespDescriptor = $convert\n    .base64Decode('CgxNZW51RWRpdFJlc3ASGAoHbWVzc2FnZRgBIAEoCVIHbWVzc2FnZQ==');\n\n@$core.Deprecated('Use menuSubscribeReqDescriptor instead')\nconst MenuSubscribeReq$json = {\n  '1': 'MenuSubscribeReq',\n  '2': [\n    {\n      '1': 'action',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.listener.v1.MenuSubscribeReq.SubscribeAction',\n      '10': 'action'\n    },\n    {'1': 'target_id', '3': 2, '4': 1, '5': 3, '10': 'targetId'},\n  ],\n  '4': [MenuSubscribeReq_SubscribeAction$json],\n};\n\n@$core.Deprecated('Use menuSubscribeReqDescriptor instead')\nconst MenuSubscribeReq_SubscribeAction$json = {\n  '1': 'SubscribeAction',\n  '2': [\n    {'1': 'INVALID_SubscribeAction', '2': 0},\n    {'1': 'ADD_SubscribeAction', '2': 1},\n    {'1': 'DEL_SubscribeAction', '2': 2},\n  ],\n};\n\n/// Descriptor for `MenuSubscribeReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List menuSubscribeReqDescriptor = $convert.base64Decode(\n    'ChBNZW51U3Vic2NyaWJlUmVxElIKBmFjdGlvbhgBIAEoDjI6LmJpbGliaWxpLmFwcC5saXN0ZW'\n    '5lci52MS5NZW51U3Vic2NyaWJlUmVxLlN1YnNjcmliZUFjdGlvblIGYWN0aW9uEhsKCXRhcmdl'\n    'dF9pZBgCIAEoA1IIdGFyZ2V0SWQiYAoPU3Vic2NyaWJlQWN0aW9uEhsKF0lOVkFMSURfU3Vic2'\n    'NyaWJlQWN0aW9uEAASFwoTQUREX1N1YnNjcmliZUFjdGlvbhABEhcKE0RFTF9TdWJzY3JpYmVB'\n    'Y3Rpb24QAg==');\n\n@$core.Deprecated('Use menuSubscribeRespDescriptor instead')\nconst MenuSubscribeResp$json = {\n  '1': 'MenuSubscribeResp',\n  '2': [\n    {'1': 'message', '3': 1, '4': 1, '5': 9, '10': 'message'},\n  ],\n};\n\n/// Descriptor for `MenuSubscribeResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List menuSubscribeRespDescriptor = $convert.base64Decode(\n    'ChFNZW51U3Vic2NyaWJlUmVzcBIYCgdtZXNzYWdlGAEgASgJUgdtZXNzYWdl');\n\n@$core.Deprecated('Use musicMenuDescriptor instead')\nconst MusicMenu$json = {\n  '1': 'MusicMenu',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'menu_type', '3': 2, '4': 1, '5': 5, '10': 'menuType'},\n    {'1': 'title', '3': 3, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'desc', '3': 4, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'cover', '3': 5, '4': 1, '5': 9, '10': 'cover'},\n    {\n      '1': 'owner',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.MusicMenuAuthor',\n      '10': 'owner'\n    },\n    {'1': 'state', '3': 7, '4': 1, '5': 5, '10': 'state'},\n    {'1': 'attr', '3': 8, '4': 1, '5': 3, '10': 'attr'},\n    {\n      '1': 'stat',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.MusicMenuStat',\n      '10': 'stat'\n    },\n    {'1': 'total', '3': 10, '4': 1, '5': 3, '10': 'total'},\n    {'1': 'ctime', '3': 11, '4': 1, '5': 3, '10': 'ctime'},\n    {'1': 'uri', '3': 12, '4': 1, '5': 9, '10': 'uri'},\n  ],\n};\n\n/// Descriptor for `MusicMenu`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List musicMenuDescriptor = $convert.base64Decode(\n    'CglNdXNpY01lbnUSDgoCaWQYASABKANSAmlkEhsKCW1lbnVfdHlwZRgCIAEoBVIIbWVudVR5cG'\n    'USFAoFdGl0bGUYAyABKAlSBXRpdGxlEhIKBGRlc2MYBCABKAlSBGRlc2MSFAoFY292ZXIYBSAB'\n    'KAlSBWNvdmVyEj8KBW93bmVyGAYgASgLMikuYmlsaWJpbGkuYXBwLmxpc3RlbmVyLnYxLk11c2'\n    'ljTWVudUF1dGhvclIFb3duZXISFAoFc3RhdGUYByABKAVSBXN0YXRlEhIKBGF0dHIYCCABKANS'\n    'BGF0dHISOwoEc3RhdBgJIAEoCzInLmJpbGliaWxpLmFwcC5saXN0ZW5lci52MS5NdXNpY01lbn'\n    'VTdGF0UgRzdGF0EhQKBXRvdGFsGAogASgDUgV0b3RhbBIUCgVjdGltZRgLIAEoA1IFY3RpbWUS'\n    'EAoDdXJpGAwgASgJUgN1cmk=');\n\n@$core.Deprecated('Use musicMenuAuthorDescriptor instead')\nconst MusicMenuAuthor$json = {\n  '1': 'MusicMenuAuthor',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'avatar', '3': 3, '4': 1, '5': 9, '10': 'avatar'},\n  ],\n};\n\n/// Descriptor for `MusicMenuAuthor`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List musicMenuAuthorDescriptor = $convert.base64Decode(\n    'Cg9NdXNpY01lbnVBdXRob3ISEAoDbWlkGAEgASgDUgNtaWQSEgoEbmFtZRgCIAEoCVIEbmFtZR'\n    'IWCgZhdmF0YXIYAyABKAlSBmF2YXRhcg==');\n\n@$core.Deprecated('Use musicMenuStatDescriptor instead')\nconst MusicMenuStat$json = {\n  '1': 'MusicMenuStat',\n  '2': [\n    {'1': 'play', '3': 1, '4': 1, '5': 3, '10': 'play'},\n    {'1': 'reply', '3': 2, '4': 1, '5': 3, '10': 'reply'},\n  ],\n};\n\n/// Descriptor for `MusicMenuStat`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List musicMenuStatDescriptor = $convert.base64Decode(\n    'Cg1NdXNpY01lbnVTdGF0EhIKBHBsYXkYASABKANSBHBsYXkSFAoFcmVwbHkYAiABKANSBXJlcG'\n    'x5');\n\n@$core.Deprecated('Use musicSubTabDescriptor instead')\nconst MusicSubTab$json = {\n  '1': 'MusicSubTab',\n  '2': [\n    {'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'tab_type', '3': 2, '4': 1, '5': 5, '10': 'tabType'},\n    {'1': 'total', '3': 3, '4': 1, '5': 3, '10': 'total'},\n  ],\n};\n\n/// Descriptor for `MusicSubTab`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List musicSubTabDescriptor = $convert.base64Decode(\n    'CgtNdXNpY1N1YlRhYhISCgRuYW1lGAEgASgJUgRuYW1lEhkKCHRhYl90eXBlGAIgASgFUgd0YW'\n    'JUeXBlEhQKBXRvdGFsGAMgASgDUgV0b3RhbA==');\n\n@$core.Deprecated('Use pageOptionDescriptor instead')\nconst PageOption$json = {\n  '1': 'PageOption',\n  '2': [\n    {'1': 'page_size', '3': 1, '4': 1, '5': 5, '10': 'pageSize'},\n    {\n      '1': 'direction',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.listener.v1.PageOption.Direction',\n      '10': 'direction'\n    },\n    {\n      '1': 'last_item',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayItem',\n      '10': 'lastItem'\n    },\n  ],\n  '4': [PageOption_Direction$json],\n};\n\n@$core.Deprecated('Use pageOptionDescriptor instead')\nconst PageOption_Direction$json = {\n  '1': 'Direction',\n  '2': [\n    {'1': 'SCROLL_DOWN', '2': 0},\n    {'1': 'SCROLL_UP', '2': 1},\n  ],\n};\n\n/// Descriptor for `PageOption`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pageOptionDescriptor = $convert.base64Decode(\n    'CgpQYWdlT3B0aW9uEhsKCXBhZ2Vfc2l6ZRgBIAEoBVIIcGFnZVNpemUSTAoJZGlyZWN0aW9uGA'\n    'IgASgOMi4uYmlsaWJpbGkuYXBwLmxpc3RlbmVyLnYxLlBhZ2VPcHRpb24uRGlyZWN0aW9uUglk'\n    'aXJlY3Rpb24SPwoJbGFzdF9pdGVtGAMgASgLMiIuYmlsaWJpbGkuYXBwLmxpc3RlbmVyLnYxLl'\n    'BsYXlJdGVtUghsYXN0SXRlbSIrCglEaXJlY3Rpb24SDwoLU0NST0xMX0RPV04QABINCglTQ1JP'\n    'TExfVVAQAQ==');\n\n@$core.Deprecated('Use pickArchiveDescriptor instead')\nconst PickArchive$json = {\n  '1': 'PickArchive',\n  '2': [\n    {\n      '1': 'item',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayItem',\n      '10': 'item'\n    },\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'owner',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PickArchiveAuthor',\n      '10': 'owner'\n    },\n    {'1': 'cover', '3': 4, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'duration', '3': 5, '4': 1, '5': 3, '10': 'duration'},\n    {'1': 'parts', '3': 6, '4': 1, '5': 5, '10': 'parts'},\n    {'1': 'stat_view', '3': 7, '4': 1, '5': 5, '10': 'statView'},\n    {'1': 'stat_reply', '3': 8, '4': 1, '5': 5, '10': 'statReply'},\n    {'1': 'state', '3': 9, '4': 1, '5': 5, '10': 'state'},\n    {'1': 'message', '3': 10, '4': 1, '5': 9, '10': 'message'},\n    {'1': 'use_stat_view_vt', '3': 11, '4': 1, '5': 8, '10': 'useStatViewVt'},\n    {'1': 'stat_view_vt_text', '3': 12, '4': 1, '5': 9, '10': 'statViewVtText'},\n  ],\n};\n\n/// Descriptor for `PickArchive`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pickArchiveDescriptor = $convert.base64Decode(\n    'CgtQaWNrQXJjaGl2ZRI2CgRpdGVtGAEgASgLMiIuYmlsaWJpbGkuYXBwLmxpc3RlbmVyLnYxLl'\n    'BsYXlJdGVtUgRpdGVtEhQKBXRpdGxlGAIgASgJUgV0aXRsZRJBCgVvd25lchgDIAEoCzIrLmJp'\n    'bGliaWxpLmFwcC5saXN0ZW5lci52MS5QaWNrQXJjaGl2ZUF1dGhvclIFb3duZXISFAoFY292ZX'\n    'IYBCABKAlSBWNvdmVyEhoKCGR1cmF0aW9uGAUgASgDUghkdXJhdGlvbhIUCgVwYXJ0cxgGIAEo'\n    'BVIFcGFydHMSGwoJc3RhdF92aWV3GAcgASgFUghzdGF0VmlldxIdCgpzdGF0X3JlcGx5GAggAS'\n    'gFUglzdGF0UmVwbHkSFAoFc3RhdGUYCSABKAVSBXN0YXRlEhgKB21lc3NhZ2UYCiABKAlSB21l'\n    'c3NhZ2USJwoQdXNlX3N0YXRfdmlld192dBgLIAEoCFINdXNlU3RhdFZpZXdWdBIpChFzdGF0X3'\n    'ZpZXdfdnRfdGV4dBgMIAEoCVIOc3RhdFZpZXdWdFRleHQ=');\n\n@$core.Deprecated('Use pickArchiveAuthorDescriptor instead')\nconst PickArchiveAuthor$json = {\n  '1': 'PickArchiveAuthor',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n  ],\n};\n\n/// Descriptor for `PickArchiveAuthor`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pickArchiveAuthorDescriptor = $convert.base64Decode(\n    'ChFQaWNrQXJjaGl2ZUF1dGhvchIQCgNtaWQYASABKANSA21pZBISCgRuYW1lGAIgASgJUgRuYW'\n    '1l');\n\n@$core.Deprecated('Use pickCardDescriptor instead')\nconst PickCard$json = {\n  '1': 'PickCard',\n  '2': [\n    {'1': 'pick_id', '3': 1, '4': 1, '5': 3, '10': 'pickId'},\n    {'1': 'card_id', '3': 2, '4': 1, '5': 3, '10': 'cardId'},\n    {'1': 'card_name', '3': 3, '4': 1, '5': 9, '10': 'cardName'},\n    {\n      '1': 'modules',\n      '3': 4,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.CardModule',\n      '10': 'modules'\n    },\n  ],\n};\n\n/// Descriptor for `PickCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pickCardDescriptor = $convert.base64Decode(\n    'CghQaWNrQ2FyZBIXCgdwaWNrX2lkGAEgASgDUgZwaWNrSWQSFwoHY2FyZF9pZBgCIAEoA1IGY2'\n    'FyZElkEhsKCWNhcmRfbmFtZRgDIAEoCVIIY2FyZE5hbWUSPgoHbW9kdWxlcxgEIAMoCzIkLmJp'\n    'bGliaWxpLmFwcC5saXN0ZW5lci52MS5DYXJkTW9kdWxlUgdtb2R1bGVz');\n\n@$core.Deprecated('Use pickCardDetailReqDescriptor instead')\nconst PickCardDetailReq$json = {\n  '1': 'PickCardDetailReq',\n  '2': [\n    {'1': 'card_id', '3': 1, '4': 1, '5': 3, '10': 'cardId'},\n    {'1': 'pick_id', '3': 2, '4': 1, '5': 3, '10': 'pickId'},\n  ],\n};\n\n/// Descriptor for `PickCardDetailReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pickCardDetailReqDescriptor = $convert.base64Decode(\n    'ChFQaWNrQ2FyZERldGFpbFJlcRIXCgdjYXJkX2lkGAEgASgDUgZjYXJkSWQSFwoHcGlja19pZB'\n    'gCIAEoA1IGcGlja0lk');\n\n@$core.Deprecated('Use pickCardDetailRespDescriptor instead')\nconst PickCardDetailResp$json = {\n  '1': 'PickCardDetailResp',\n  '2': [\n    {'1': 'card_id', '3': 1, '4': 1, '5': 3, '10': 'cardId'},\n    {'1': 'pick_id', '3': 2, '4': 1, '5': 3, '10': 'pickId'},\n    {\n      '1': 'modules',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.CardModule',\n      '10': 'modules'\n    },\n  ],\n};\n\n/// Descriptor for `PickCardDetailResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pickCardDetailRespDescriptor = $convert.base64Decode(\n    'ChJQaWNrQ2FyZERldGFpbFJlc3ASFwoHY2FyZF9pZBgBIAEoA1IGY2FyZElkEhcKB3BpY2tfaW'\n    'QYAiABKANSBnBpY2tJZBI+Cgdtb2R1bGVzGAMgAygLMiQuYmlsaWJpbGkuYXBwLmxpc3RlbmVy'\n    'LnYxLkNhcmRNb2R1bGVSB21vZHVsZXM=');\n\n@$core.Deprecated('Use pickFeedReqDescriptor instead')\nconst PickFeedReq$json = {\n  '1': 'PickFeedReq',\n  '2': [\n    {'1': 'offset', '3': 1, '4': 1, '5': 3, '10': 'offset'},\n  ],\n};\n\n/// Descriptor for `PickFeedReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pickFeedReqDescriptor = $convert\n    .base64Decode('CgtQaWNrRmVlZFJlcRIWCgZvZmZzZXQYASABKANSBm9mZnNldA==');\n\n@$core.Deprecated('Use pickFeedRespDescriptor instead')\nconst PickFeedResp$json = {\n  '1': 'PickFeedResp',\n  '2': [\n    {'1': 'offset', '3': 1, '4': 1, '5': 3, '10': 'offset'},\n    {\n      '1': 'cards',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PickCard',\n      '10': 'cards'\n    },\n  ],\n};\n\n/// Descriptor for `PickFeedResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pickFeedRespDescriptor = $convert.base64Decode(\n    'CgxQaWNrRmVlZFJlc3ASFgoGb2Zmc2V0GAEgASgDUgZvZmZzZXQSOAoFY2FyZHMYAiADKAsyIi'\n    '5iaWxpYmlsaS5hcHAubGlzdGVuZXIudjEuUGlja0NhcmRSBWNhcmRz');\n\n@$core.Deprecated('Use pkcmArchiveDescriptor instead')\nconst PkcmArchive$json = {\n  '1': 'PkcmArchive',\n  '2': [\n    {\n      '1': 'arc',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PickArchive',\n      '10': 'arc'\n    },\n    {'1': 'pick_reason', '3': 2, '4': 1, '5': 9, '10': 'pickReason'},\n  ],\n};\n\n/// Descriptor for `PkcmArchive`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pkcmArchiveDescriptor = $convert.base64Decode(\n    'CgtQa2NtQXJjaGl2ZRI3CgNhcmMYASABKAsyJS5iaWxpYmlsaS5hcHAubGlzdGVuZXIudjEuUG'\n    'lja0FyY2hpdmVSA2FyYxIfCgtwaWNrX3JlYXNvbhgCIAEoCVIKcGlja1JlYXNvbg==');\n\n@$core.Deprecated('Use pkcmCenterButtonDescriptor instead')\nconst PkcmCenterButton$json = {\n  '1': 'PkcmCenterButton',\n  '2': [\n    {'1': 'icon_head', '3': 1, '4': 1, '5': 9, '10': 'iconHead'},\n    {'1': 'icon_tail', '3': 2, '4': 1, '5': 9, '10': 'iconTail'},\n    {'1': 'title', '3': 3, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'uri', '3': 4, '4': 1, '5': 9, '10': 'uri'},\n  ],\n};\n\n/// Descriptor for `PkcmCenterButton`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pkcmCenterButtonDescriptor = $convert.base64Decode(\n    'ChBQa2NtQ2VudGVyQnV0dG9uEhsKCWljb25faGVhZBgBIAEoCVIIaWNvbkhlYWQSGwoJaWNvbl'\n    '90YWlsGAIgASgJUghpY29uVGFpbBIUCgV0aXRsZRgDIAEoCVIFdGl0bGUSEAoDdXJpGAQgASgJ'\n    'UgN1cmk=');\n\n@$core.Deprecated('Use pkcmHeaderDescriptor instead')\nconst PkcmHeader$json = {\n  '1': 'PkcmHeader',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'desc', '3': 2, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'btn_icon', '3': 3, '4': 1, '5': 9, '10': 'btnIcon'},\n    {'1': 'btn_text', '3': 4, '4': 1, '5': 9, '10': 'btnText'},\n    {'1': 'btn_uri', '3': 5, '4': 1, '5': 9, '10': 'btnUri'},\n  ],\n};\n\n/// Descriptor for `PkcmHeader`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pkcmHeaderDescriptor = $convert.base64Decode(\n    'CgpQa2NtSGVhZGVyEhQKBXRpdGxlGAEgASgJUgV0aXRsZRISCgRkZXNjGAIgASgJUgRkZXNjEh'\n    'kKCGJ0bl9pY29uGAMgASgJUgdidG5JY29uEhkKCGJ0bl90ZXh0GAQgASgJUgdidG5UZXh0EhcK'\n    'B2J0bl91cmkYBSABKAlSBmJ0blVyaQ==');\n\n@$core.Deprecated('Use playActionReportReqDescriptor instead')\nconst PlayActionReportReq$json = {\n  '1': 'PlayActionReportReq',\n  '2': [\n    {\n      '1': 'item',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayItem',\n      '10': 'item'\n    },\n    {'1': 'from_spmid', '3': 2, '4': 1, '5': 9, '10': 'fromSpmid'},\n  ],\n};\n\n/// Descriptor for `PlayActionReportReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playActionReportReqDescriptor = $convert.base64Decode(\n    'ChNQbGF5QWN0aW9uUmVwb3J0UmVxEjYKBGl0ZW0YASABKAsyIi5iaWxpYmlsaS5hcHAubGlzdG'\n    'VuZXIudjEuUGxheUl0ZW1SBGl0ZW0SHQoKZnJvbV9zcG1pZBgCIAEoCVIJZnJvbVNwbWlk');\n\n@$core.Deprecated('Use playDASHDescriptor instead')\nconst PlayDASH$json = {\n  '1': 'PlayDASH',\n  '2': [\n    {'1': 'duration', '3': 1, '4': 1, '5': 5, '10': 'duration'},\n    {'1': 'min_buffer_time', '3': 2, '4': 1, '5': 2, '10': 'minBufferTime'},\n    {\n      '1': 'audio',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.DashItem',\n      '10': 'audio'\n    },\n  ],\n};\n\n/// Descriptor for `PlayDASH`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playDASHDescriptor = $convert.base64Decode(\n    'CghQbGF5REFTSBIaCghkdXJhdGlvbhgBIAEoBVIIZHVyYXRpb24SJgoPbWluX2J1ZmZlcl90aW'\n    '1lGAIgASgCUg1taW5CdWZmZXJUaW1lEjgKBWF1ZGlvGAMgAygLMiIuYmlsaWJpbGkuYXBwLmxp'\n    'c3RlbmVyLnYxLkRhc2hJdGVtUgVhdWRpbw==');\n\n@$core.Deprecated('Use playHistoryAddReqDescriptor instead')\nconst PlayHistoryAddReq$json = {\n  '1': 'PlayHistoryAddReq',\n  '2': [\n    {\n      '1': 'item',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayItem',\n      '10': 'item'\n    },\n    {'1': 'progress', '3': 2, '4': 1, '5': 3, '10': 'progress'},\n    {'1': 'duration', '3': 3, '4': 1, '5': 3, '10': 'duration'},\n    {'1': 'play_style', '3': 4, '4': 1, '5': 5, '10': 'playStyle'},\n  ],\n};\n\n/// Descriptor for `PlayHistoryAddReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playHistoryAddReqDescriptor = $convert.base64Decode(\n    'ChFQbGF5SGlzdG9yeUFkZFJlcRI2CgRpdGVtGAEgASgLMiIuYmlsaWJpbGkuYXBwLmxpc3Rlbm'\n    'VyLnYxLlBsYXlJdGVtUgRpdGVtEhoKCHByb2dyZXNzGAIgASgDUghwcm9ncmVzcxIaCghkdXJh'\n    'dGlvbhgDIAEoA1IIZHVyYXRpb24SHQoKcGxheV9zdHlsZRgEIAEoBVIJcGxheVN0eWxl');\n\n@$core.Deprecated('Use playHistoryDelReqDescriptor instead')\nconst PlayHistoryDelReq$json = {\n  '1': 'PlayHistoryDelReq',\n  '2': [\n    {\n      '1': 'items',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayItem',\n      '10': 'items'\n    },\n    {'1': 'truncate', '3': 2, '4': 1, '5': 8, '10': 'truncate'},\n  ],\n};\n\n/// Descriptor for `PlayHistoryDelReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playHistoryDelReqDescriptor = $convert.base64Decode(\n    'ChFQbGF5SGlzdG9yeURlbFJlcRI4CgVpdGVtcxgBIAMoCzIiLmJpbGliaWxpLmFwcC5saXN0ZW'\n    '5lci52MS5QbGF5SXRlbVIFaXRlbXMSGgoIdHJ1bmNhdGUYAiABKAhSCHRydW5jYXRl');\n\n@$core.Deprecated('Use playHistoryReqDescriptor instead')\nconst PlayHistoryReq$json = {\n  '1': 'PlayHistoryReq',\n  '2': [\n    {\n      '1': 'page_opt',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PageOption',\n      '10': 'pageOpt'\n    },\n    {'1': 'local_today_zero', '3': 2, '4': 1, '5': 3, '10': 'localTodayZero'},\n    {\n      '1': 'pagination',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.pagination.Pagination',\n      '10': 'pagination'\n    },\n  ],\n};\n\n/// Descriptor for `PlayHistoryReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playHistoryReqDescriptor = $convert.base64Decode(\n    'Cg5QbGF5SGlzdG9yeVJlcRI/CghwYWdlX29wdBgBIAEoCzIkLmJpbGliaWxpLmFwcC5saXN0ZW'\n    '5lci52MS5QYWdlT3B0aW9uUgdwYWdlT3B0EigKEGxvY2FsX3RvZGF5X3plcm8YAiABKANSDmxv'\n    'Y2FsVG9kYXlaZXJvEj8KCnBhZ2luYXRpb24YAyABKAsyHy5iaWxpYmlsaS5wYWdpbmF0aW9uLl'\n    'BhZ2luYXRpb25SCnBhZ2luYXRpb24=');\n\n@$core.Deprecated('Use playHistoryRespDescriptor instead')\nconst PlayHistoryResp$json = {\n  '1': 'PlayHistoryResp',\n  '2': [\n    {'1': 'total', '3': 1, '4': 1, '5': 5, '10': 'total'},\n    {'1': 'reach_end', '3': 2, '4': 1, '5': 8, '10': 'reachEnd'},\n    {\n      '1': 'list',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.DetailItem',\n      '10': 'list'\n    },\n    {\n      '1': 'pagination_reply',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.pagination.PaginationReply',\n      '10': 'paginationReply'\n    },\n  ],\n};\n\n/// Descriptor for `PlayHistoryResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playHistoryRespDescriptor = $convert.base64Decode(\n    'Cg9QbGF5SGlzdG9yeVJlc3ASFAoFdG90YWwYASABKAVSBXRvdGFsEhsKCXJlYWNoX2VuZBgCIA'\n    'EoCFIIcmVhY2hFbmQSOAoEbGlzdBgDIAMoCzIkLmJpbGliaWxpLmFwcC5saXN0ZW5lci52MS5E'\n    'ZXRhaWxJdGVtUgRsaXN0Ek8KEHBhZ2luYXRpb25fcmVwbHkYBCABKAsyJC5iaWxpYmlsaS5wYW'\n    'dpbmF0aW9uLlBhZ2luYXRpb25SZXBseVIPcGFnaW5hdGlvblJlcGx5');\n\n@$core.Deprecated('Use playInfoDescriptor instead')\nconst PlayInfo$json = {\n  '1': 'PlayInfo',\n  '2': [\n    {\n      '1': 'play_url',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayURL',\n      '9': 0,\n      '10': 'playUrl'\n    },\n    {\n      '1': 'play_dash',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayDASH',\n      '9': 0,\n      '10': 'playDash'\n    },\n    {'1': 'qn', '3': 1, '4': 1, '5': 5, '10': 'qn'},\n    {'1': 'format', '3': 2, '4': 1, '5': 9, '10': 'format'},\n    {'1': 'qn_type', '3': 3, '4': 1, '5': 5, '10': 'qnType'},\n    {'1': 'fnver', '3': 6, '4': 1, '5': 5, '10': 'fnver'},\n    {'1': 'fnval', '3': 7, '4': 1, '5': 5, '10': 'fnval'},\n    {\n      '1': 'formats',\n      '3': 8,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.FormatDescription',\n      '10': 'formats'\n    },\n    {'1': 'video_codecid', '3': 9, '4': 1, '5': 5, '10': 'videoCodecid'},\n    {'1': 'length', '3': 10, '4': 1, '5': 3, '10': 'length'},\n    {'1': 'code', '3': 11, '4': 1, '5': 5, '10': 'code'},\n    {'1': 'message', '3': 12, '4': 1, '5': 9, '10': 'message'},\n    {'1': 'expire_time', '3': 13, '4': 1, '5': 3, '10': 'expireTime'},\n    {\n      '1': 'volume',\n      '3': 14,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.VolumeInfo',\n      '10': 'volume'\n    },\n  ],\n  '8': [\n    {'1': 'info'},\n  ],\n};\n\n/// Descriptor for `PlayInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playInfoDescriptor = $convert.base64Decode(\n    'CghQbGF5SW5mbxI+CghwbGF5X3VybBgEIAEoCzIhLmJpbGliaWxpLmFwcC5saXN0ZW5lci52MS'\n    '5QbGF5VVJMSABSB3BsYXlVcmwSQQoJcGxheV9kYXNoGAUgASgLMiIuYmlsaWJpbGkuYXBwLmxp'\n    'c3RlbmVyLnYxLlBsYXlEQVNISABSCHBsYXlEYXNoEg4KAnFuGAEgASgFUgJxbhIWCgZmb3JtYX'\n    'QYAiABKAlSBmZvcm1hdBIXCgdxbl90eXBlGAMgASgFUgZxblR5cGUSFAoFZm52ZXIYBiABKAVS'\n    'BWZudmVyEhQKBWZudmFsGAcgASgFUgVmbnZhbBJFCgdmb3JtYXRzGAggAygLMisuYmlsaWJpbG'\n    'kuYXBwLmxpc3RlbmVyLnYxLkZvcm1hdERlc2NyaXB0aW9uUgdmb3JtYXRzEiMKDXZpZGVvX2Nv'\n    'ZGVjaWQYCSABKAVSDHZpZGVvQ29kZWNpZBIWCgZsZW5ndGgYCiABKANSBmxlbmd0aBISCgRjb2'\n    'RlGAsgASgFUgRjb2RlEhgKB21lc3NhZ2UYDCABKAlSB21lc3NhZ2USHwoLZXhwaXJlX3RpbWUY'\n    'DSABKANSCmV4cGlyZVRpbWUSOwoGdm9sdW1lGA4gASgLMiMuYmlsaWJpbGkuYXBwLnBsYXl1cm'\n    'wudjEuVm9sdW1lSW5mb1IGdm9sdW1lQgYKBGluZm8=');\n\n@$core.Deprecated('Use playItemDescriptor instead')\nconst PlayItem$json = {\n  '1': 'PlayItem',\n  '2': [\n    {'1': 'item_type', '3': 1, '4': 1, '5': 5, '10': 'itemType'},\n    {'1': 'oid', '3': 3, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'sub_id', '3': 4, '4': 3, '5': 3, '10': 'subId'},\n    {\n      '1': 'et',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.EventTracking',\n      '10': 'et'\n    },\n    {'1': 'pos', '3': 6, '4': 1, '5': 3, '10': 'pos'},\n  ],\n};\n\n/// Descriptor for `PlayItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playItemDescriptor = $convert.base64Decode(\n    'CghQbGF5SXRlbRIbCglpdGVtX3R5cGUYASABKAVSCGl0ZW1UeXBlEhAKA29pZBgDIAEoA1IDb2'\n    'lkEhUKBnN1Yl9pZBgEIAMoA1IFc3ViSWQSNwoCZXQYBSABKAsyJy5iaWxpYmlsaS5hcHAubGlz'\n    'dGVuZXIudjEuRXZlbnRUcmFja2luZ1ICZXQSEAoDcG9zGAYgASgDUgNwb3M=');\n\n@$core.Deprecated('Use playURLDescriptor instead')\nconst PlayURL$json = {\n  '1': 'PlayURL',\n  '2': [\n    {\n      '1': 'durl',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.ResponseUrl',\n      '10': 'durl'\n    },\n  ],\n};\n\n/// Descriptor for `PlayURL`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playURLDescriptor = $convert.base64Decode(\n    'CgdQbGF5VVJMEjkKBGR1cmwYASADKAsyJS5iaWxpYmlsaS5hcHAubGlzdGVuZXIudjEuUmVzcG'\n    '9uc2VVcmxSBGR1cmw=');\n\n@$core.Deprecated('Use playURLReqDescriptor instead')\nconst PlayURLReq$json = {\n  '1': 'PlayURLReq',\n  '2': [\n    {\n      '1': 'item',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayItem',\n      '10': 'item'\n    },\n    {\n      '1': 'player_args',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n  ],\n};\n\n/// Descriptor for `PlayURLReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playURLReqDescriptor = $convert.base64Decode(\n    'CgpQbGF5VVJMUmVxEjYKBGl0ZW0YASABKAsyIi5iaWxpYmlsaS5hcHAubGlzdGVuZXIudjEuUG'\n    'xheUl0ZW1SBGl0ZW0STwoLcGxheWVyX2FyZ3MYAiABKAsyLi5iaWxpYmlsaS5hcHAuYXJjaGl2'\n    'ZS5taWRkbGV3YXJlLnYxLlBsYXllckFyZ3NSCnBsYXllckFyZ3M=');\n\n@$core.Deprecated('Use playURLRespDescriptor instead')\nconst PlayURLResp$json = {\n  '1': 'PlayURLResp',\n  '2': [\n    {\n      '1': 'item',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayItem',\n      '10': 'item'\n    },\n    {'1': 'playable', '3': 2, '4': 1, '5': 5, '10': 'playable'},\n    {'1': 'message', '3': 3, '4': 1, '5': 9, '10': 'message'},\n    {\n      '1': 'player_info',\n      '3': 4,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayURLResp.PlayerInfoEntry',\n      '10': 'playerInfo'\n    },\n  ],\n  '3': [PlayURLResp_PlayerInfoEntry$json],\n};\n\n@$core.Deprecated('Use playURLRespDescriptor instead')\nconst PlayURLResp_PlayerInfoEntry$json = {\n  '1': 'PlayerInfoEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 3, '10': 'key'},\n    {\n      '1': 'value',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayInfo',\n      '10': 'value'\n    },\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `PlayURLResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playURLRespDescriptor = $convert.base64Decode(\n    'CgtQbGF5VVJMUmVzcBI2CgRpdGVtGAEgASgLMiIuYmlsaWJpbGkuYXBwLmxpc3RlbmVyLnYxLl'\n    'BsYXlJdGVtUgRpdGVtEhoKCHBsYXlhYmxlGAIgASgFUghwbGF5YWJsZRIYCgdtZXNzYWdlGAMg'\n    'ASgJUgdtZXNzYWdlElYKC3BsYXllcl9pbmZvGAQgAygLMjUuYmlsaWJpbGkuYXBwLmxpc3Rlbm'\n    'VyLnYxLlBsYXlVUkxSZXNwLlBsYXllckluZm9FbnRyeVIKcGxheWVySW5mbxphCg9QbGF5ZXJJ'\n    'bmZvRW50cnkSEAoDa2V5GAEgASgDUgNrZXkSOAoFdmFsdWUYAiABKAsyIi5iaWxpYmlsaS5hcH'\n    'AubGlzdGVuZXIudjEuUGxheUluZm9SBXZhbHVlOgI4AQ==');\n\n@$core.Deprecated('Use playlistAddReqDescriptor instead')\nconst PlaylistAddReq$json = {\n  '1': 'PlaylistAddReq',\n  '2': [\n    {\n      '1': 'after',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayItem',\n      '9': 0,\n      '10': 'after'\n    },\n    {'1': 'head', '3': 3, '4': 1, '5': 8, '9': 0, '10': 'head'},\n    {'1': 'tail', '3': 4, '4': 1, '5': 8, '9': 0, '10': 'tail'},\n    {\n      '1': 'items',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayItem',\n      '10': 'items'\n    },\n  ],\n  '8': [\n    {'1': 'pos'},\n  ],\n};\n\n/// Descriptor for `PlaylistAddReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playlistAddReqDescriptor = $convert.base64Decode(\n    'Cg5QbGF5bGlzdEFkZFJlcRI6CgVhZnRlchgCIAEoCzIiLmJpbGliaWxpLmFwcC5saXN0ZW5lci'\n    '52MS5QbGF5SXRlbUgAUgVhZnRlchIUCgRoZWFkGAMgASgISABSBGhlYWQSFAoEdGFpbBgEIAEo'\n    'CEgAUgR0YWlsEjgKBWl0ZW1zGAEgAygLMiIuYmlsaWJpbGkuYXBwLmxpc3RlbmVyLnYxLlBsYX'\n    'lJdGVtUgVpdGVtc0IFCgNwb3M=');\n\n@$core.Deprecated('Use playlistDelReqDescriptor instead')\nconst PlaylistDelReq$json = {\n  '1': 'PlaylistDelReq',\n  '2': [\n    {\n      '1': 'items',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayItem',\n      '10': 'items'\n    },\n    {'1': 'truncate', '3': 2, '4': 1, '5': 8, '10': 'truncate'},\n  ],\n};\n\n/// Descriptor for `PlaylistDelReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playlistDelReqDescriptor = $convert.base64Decode(\n    'Cg5QbGF5bGlzdERlbFJlcRI4CgVpdGVtcxgBIAMoCzIiLmJpbGliaWxpLmFwcC5saXN0ZW5lci'\n    '52MS5QbGF5SXRlbVIFaXRlbXMSGgoIdHJ1bmNhdGUYAiABKAhSCHRydW5jYXRl');\n\n@$core.Deprecated('Use playlistOffsetDescriptor instead')\nconst PlaylistOffset$json = {\n  '1': 'PlaylistOffset',\n  '2': [\n    {\n      '1': 'direction',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.listener.v1.PlaylistOffset.PlaylistScrollDirection',\n      '10': 'direction'\n    },\n    {\n      '1': 'last_item',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayItem',\n      '10': 'lastItem'\n    },\n    {\n      '1': 'random_state',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.RandomOrderStatus',\n      '10': 'randomState'\n    },\n    {\n      '1': 'sort_opt',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.SortOption',\n      '10': 'sortOpt'\n    },\n  ],\n  '4': [PlaylistOffset_PlaylistScrollDirection$json],\n};\n\n@$core.Deprecated('Use playlistOffsetDescriptor instead')\nconst PlaylistOffset_PlaylistScrollDirection$json = {\n  '1': 'PlaylistScrollDirection',\n  '2': [\n    {'1': 'DOWN', '2': 0},\n    {'1': 'UP', '2': 1},\n  ],\n};\n\n/// Descriptor for `PlaylistOffset`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playlistOffsetDescriptor = $convert.base64Decode(\n    'Cg5QbGF5bGlzdE9mZnNldBJeCglkaXJlY3Rpb24YASABKA4yQC5iaWxpYmlsaS5hcHAubGlzdG'\n    'VuZXIudjEuUGxheWxpc3RPZmZzZXQuUGxheWxpc3RTY3JvbGxEaXJlY3Rpb25SCWRpcmVjdGlv'\n    'bhI/CglsYXN0X2l0ZW0YAiABKAsyIi5iaWxpYmlsaS5hcHAubGlzdGVuZXIudjEuUGxheUl0ZW'\n    '1SCGxhc3RJdGVtEk4KDHJhbmRvbV9zdGF0ZRgDIAEoCzIrLmJpbGliaWxpLmFwcC5saXN0ZW5l'\n    'ci52MS5SYW5kb21PcmRlclN0YXR1c1ILcmFuZG9tU3RhdGUSPwoIc29ydF9vcHQYBCABKAsyJC'\n    '5iaWxpYmlsaS5hcHAubGlzdGVuZXIudjEuU29ydE9wdGlvblIHc29ydE9wdCIrChdQbGF5bGlz'\n    'dFNjcm9sbERpcmVjdGlvbhIICgRET1dOEAASBgoCVVAQAQ==');\n\n@$core.Deprecated('Use playlistReqDescriptor instead')\nconst PlaylistReq$json = {\n  '1': 'PlaylistReq',\n  '2': [\n    {\n      '1': 'from',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.listener.v1.PlaylistSource',\n      '10': 'from'\n    },\n    {'1': 'id', '3': 2, '4': 1, '5': 3, '10': 'id'},\n    {\n      '1': 'anchor',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayItem',\n      '10': 'anchor'\n    },\n    {\n      '1': 'page_opt',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PageOption',\n      '10': 'pageOpt'\n    },\n    {\n      '1': 'player_args',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n    {'1': 'extra_id', '3': 6, '4': 1, '5': 3, '10': 'extraId'},\n    {\n      '1': 'sort_opt',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.SortOption',\n      '10': 'sortOpt'\n    },\n    {\n      '1': 'pagination',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.pagination.Pagination',\n      '10': 'pagination'\n    },\n  ],\n};\n\n/// Descriptor for `PlaylistReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playlistReqDescriptor = $convert.base64Decode(\n    'CgtQbGF5bGlzdFJlcRI8CgRmcm9tGAEgASgOMiguYmlsaWJpbGkuYXBwLmxpc3RlbmVyLnYxLl'\n    'BsYXlsaXN0U291cmNlUgRmcm9tEg4KAmlkGAIgASgDUgJpZBI6CgZhbmNob3IYAyABKAsyIi5i'\n    'aWxpYmlsaS5hcHAubGlzdGVuZXIudjEuUGxheUl0ZW1SBmFuY2hvchI/CghwYWdlX29wdBgEIA'\n    'EoCzIkLmJpbGliaWxpLmFwcC5saXN0ZW5lci52MS5QYWdlT3B0aW9uUgdwYWdlT3B0Ek8KC3Bs'\n    'YXllcl9hcmdzGAUgASgLMi4uYmlsaWJpbGkuYXBwLmFyY2hpdmUubWlkZGxld2FyZS52MS5QbG'\n    'F5ZXJBcmdzUgpwbGF5ZXJBcmdzEhkKCGV4dHJhX2lkGAYgASgDUgdleHRyYUlkEj8KCHNvcnRf'\n    'b3B0GAcgASgLMiQuYmlsaWJpbGkuYXBwLmxpc3RlbmVyLnYxLlNvcnRPcHRpb25SB3NvcnRPcH'\n    'QSPwoKcGFnaW5hdGlvbhgIIAEoCzIfLmJpbGliaWxpLnBhZ2luYXRpb24uUGFnaW5hdGlvblIK'\n    'cGFnaW5hdGlvbg==');\n\n@$core.Deprecated('Use playlistRespDescriptor instead')\nconst PlaylistResp$json = {\n  '1': 'PlaylistResp',\n  '2': [\n    {'1': 'total', '3': 1, '4': 1, '5': 5, '10': 'total'},\n    {'1': 'reach_start', '3': 2, '4': 1, '5': 8, '10': 'reachStart'},\n    {'1': 'reach_end', '3': 3, '4': 1, '5': 8, '10': 'reachEnd'},\n    {\n      '1': 'list',\n      '3': 4,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.DetailItem',\n      '10': 'list'\n    },\n    {\n      '1': 'last_play',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayItem',\n      '10': 'lastPlay'\n    },\n    {'1': 'last_progress', '3': 6, '4': 1, '5': 3, '10': 'lastProgress'},\n    {\n      '1': 'pagination_reply',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.pagination.PaginationReply',\n      '10': 'paginationReply'\n    },\n  ],\n};\n\n/// Descriptor for `PlaylistResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playlistRespDescriptor = $convert.base64Decode(\n    'CgxQbGF5bGlzdFJlc3ASFAoFdG90YWwYASABKAVSBXRvdGFsEh8KC3JlYWNoX3N0YXJ0GAIgAS'\n    'gIUgpyZWFjaFN0YXJ0EhsKCXJlYWNoX2VuZBgDIAEoCFIIcmVhY2hFbmQSOAoEbGlzdBgEIAMo'\n    'CzIkLmJpbGliaWxpLmFwcC5saXN0ZW5lci52MS5EZXRhaWxJdGVtUgRsaXN0Ej8KCWxhc3RfcG'\n    'xheRgFIAEoCzIiLmJpbGliaWxpLmFwcC5saXN0ZW5lci52MS5QbGF5SXRlbVIIbGFzdFBsYXkS'\n    'IwoNbGFzdF9wcm9ncmVzcxgGIAEoA1IMbGFzdFByb2dyZXNzEk8KEHBhZ2luYXRpb25fcmVwbH'\n    'kYByABKAsyJC5iaWxpYmlsaS5wYWdpbmF0aW9uLlBhZ2luYXRpb25SZXBseVIPcGFnaW5hdGlv'\n    'blJlcGx5');\n\n@$core.Deprecated('Use randomOrderStatusDescriptor instead')\nconst RandomOrderStatus$json = {\n  '1': 'RandomOrderStatus',\n  '2': [\n    {'1': 'exposed_pos', '3': 1, '4': 3, '5': 3, '10': 'exposedPos'},\n  ],\n};\n\n/// Descriptor for `RandomOrderStatus`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List randomOrderStatusDescriptor = $convert.base64Decode(\n    'ChFSYW5kb21PcmRlclN0YXR1cxIfCgtleHBvc2VkX3BvcxgBIAMoA1IKZXhwb3NlZFBvcw==');\n\n@$core.Deprecated('Use rcmdOffsetDescriptor instead')\nconst RcmdOffset$json = {\n  '1': 'RcmdOffset',\n  '2': [\n    {'1': 'rcmd_from', '3': 1, '4': 1, '5': 3, '10': 'rcmdFrom'},\n    {'1': 'id', '3': 2, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'page', '3': 3, '4': 1, '5': 5, '10': 'page'},\n    {'1': 'session_id', '3': 4, '4': 1, '5': 9, '10': 'sessionId'},\n    {'1': 'from_trackid', '3': 5, '4': 1, '5': 9, '10': 'fromTrackid'},\n  ],\n};\n\n/// Descriptor for `RcmdOffset`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rcmdOffsetDescriptor = $convert.base64Decode(\n    'CgpSY21kT2Zmc2V0EhsKCXJjbWRfZnJvbRgBIAEoA1IIcmNtZEZyb20SDgoCaWQYAiABKANSAm'\n    'lkEhIKBHBhZ2UYAyABKAVSBHBhZ2USHQoKc2Vzc2lvbl9pZBgEIAEoCVIJc2Vzc2lvbklkEiEK'\n    'DGZyb21fdHJhY2tpZBgFIAEoCVILZnJvbVRyYWNraWQ=');\n\n@$core.Deprecated('Use rcmdPlaylistReqDescriptor instead')\nconst RcmdPlaylistReq$json = {\n  '1': 'RcmdPlaylistReq',\n  '2': [\n    {\n      '1': 'from',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.listener.v1.RcmdPlaylistReq.RcmdFrom',\n      '10': 'from'\n    },\n    {'1': 'id', '3': 2, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'need_history', '3': 3, '4': 1, '5': 8, '10': 'needHistory'},\n    {'1': 'need_top_cards', '3': 4, '4': 1, '5': 8, '10': 'needTopCards'},\n    {\n      '1': 'player_args',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n    {\n      '1': 'page',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.pagination.Pagination',\n      '10': 'page'\n    },\n    {\n      '1': 'annotations',\n      '3': 7,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.RcmdPlaylistReq.AnnotationsEntry',\n      '10': 'annotations'\n    },\n  ],\n  '3': [RcmdPlaylistReq_AnnotationsEntry$json],\n  '4': [RcmdPlaylistReq_RcmdFrom$json],\n};\n\n@$core.Deprecated('Use rcmdPlaylistReqDescriptor instead')\nconst RcmdPlaylistReq_AnnotationsEntry$json = {\n  '1': 'AnnotationsEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n@$core.Deprecated('Use rcmdPlaylistReqDescriptor instead')\nconst RcmdPlaylistReq_RcmdFrom$json = {\n  '1': 'RcmdFrom',\n  '2': [\n    {'1': 'UNSPECIFIED_RcmdFrom', '2': 0},\n    {'1': 'UP_ARCHIVE_RcmdFrom', '2': 1},\n    {'1': 'INDEX_ENTRY', '2': 2},\n    {'1': 'ARCHIVE_VIEW', '2': 3},\n  ],\n};\n\n/// Descriptor for `RcmdPlaylistReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rcmdPlaylistReqDescriptor = $convert.base64Decode(\n    'Cg9SY21kUGxheWxpc3RSZXESRgoEZnJvbRgBIAEoDjIyLmJpbGliaWxpLmFwcC5saXN0ZW5lci'\n    '52MS5SY21kUGxheWxpc3RSZXEuUmNtZEZyb21SBGZyb20SDgoCaWQYAiABKANSAmlkEiEKDG5l'\n    'ZWRfaGlzdG9yeRgDIAEoCFILbmVlZEhpc3RvcnkSJAoObmVlZF90b3BfY2FyZHMYBCABKAhSDG'\n    '5lZWRUb3BDYXJkcxJPCgtwbGF5ZXJfYXJncxgFIAEoCzIuLmJpbGliaWxpLmFwcC5hcmNoaXZl'\n    'Lm1pZGRsZXdhcmUudjEuUGxheWVyQXJnc1IKcGxheWVyQXJncxIzCgRwYWdlGAYgASgLMh8uYm'\n    'lsaWJpbGkucGFnaW5hdGlvbi5QYWdpbmF0aW9uUgRwYWdlElwKC2Fubm90YXRpb25zGAcgAygL'\n    'MjouYmlsaWJpbGkuYXBwLmxpc3RlbmVyLnYxLlJjbWRQbGF5bGlzdFJlcS5Bbm5vdGF0aW9uc0'\n    'VudHJ5Ugthbm5vdGF0aW9ucxo+ChBBbm5vdGF0aW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5'\n    'EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEiYAoIUmNtZEZyb20SGAoUVU5TUEVDSUZJRURfUm'\n    'NtZEZyb20QABIXChNVUF9BUkNISVZFX1JjbWRGcm9tEAESDwoLSU5ERVhfRU5UUlkQAhIQCgxB'\n    'UkNISVZFX1ZJRVcQAw==');\n\n@$core.Deprecated('Use rcmdPlaylistRespDescriptor instead')\nconst RcmdPlaylistResp$json = {\n  '1': 'RcmdPlaylistResp',\n  '2': [\n    {\n      '1': 'list',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.DetailItem',\n      '10': 'list'\n    },\n    {'1': 'history_len', '3': 2, '4': 1, '5': 3, '10': 'historyLen'},\n    {\n      '1': 'top_cards',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.TopCard',\n      '10': 'topCards'\n    },\n    {\n      '1': 'next_page',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.pagination.PaginationReply',\n      '10': 'nextPage'\n    },\n  ],\n};\n\n/// Descriptor for `RcmdPlaylistResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rcmdPlaylistRespDescriptor = $convert.base64Decode(\n    'ChBSY21kUGxheWxpc3RSZXNwEjgKBGxpc3QYASADKAsyJC5iaWxpYmlsaS5hcHAubGlzdGVuZX'\n    'IudjEuRGV0YWlsSXRlbVIEbGlzdBIfCgtoaXN0b3J5X2xlbhgCIAEoA1IKaGlzdG9yeUxlbhI+'\n    'Cgl0b3BfY2FyZHMYAyADKAsyIS5iaWxpYmlsaS5hcHAubGlzdGVuZXIudjEuVG9wQ2FyZFIIdG'\n    '9wQ2FyZHMSQQoJbmV4dF9wYWdlGAQgASgLMiQuYmlsaWJpbGkucGFnaW5hdGlvbi5QYWdpbmF0'\n    'aW9uUmVwbHlSCG5leHRQYWdl');\n\n@$core.Deprecated('Use responseUrlDescriptor instead')\nconst ResponseUrl$json = {\n  '1': 'ResponseUrl',\n  '2': [\n    {'1': 'order', '3': 1, '4': 1, '5': 5, '10': 'order'},\n    {'1': 'length', '3': 2, '4': 1, '5': 3, '10': 'length'},\n    {'1': 'size', '3': 3, '4': 1, '5': 3, '10': 'size'},\n    {'1': 'ahead', '3': 4, '4': 1, '5': 9, '10': 'ahead'},\n    {'1': 'vhead', '3': 5, '4': 1, '5': 9, '10': 'vhead'},\n    {'1': 'url', '3': 6, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'backup_url', '3': 7, '4': 3, '5': 9, '10': 'backupUrl'},\n    {'1': 'md5', '3': 8, '4': 1, '5': 9, '10': 'md5'},\n  ],\n};\n\n/// Descriptor for `ResponseUrl`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List responseUrlDescriptor = $convert.base64Decode(\n    'CgtSZXNwb25zZVVybBIUCgVvcmRlchgBIAEoBVIFb3JkZXISFgoGbGVuZ3RoGAIgASgDUgZsZW'\n    '5ndGgSEgoEc2l6ZRgDIAEoA1IEc2l6ZRIUCgVhaGVhZBgEIAEoCVIFYWhlYWQSFAoFdmhlYWQY'\n    'BSABKAlSBXZoZWFkEhAKA3VybBgGIAEoCVIDdXJsEh0KCmJhY2t1cF91cmwYByADKAlSCWJhY2'\n    't1cFVybBIQCgNtZDUYCCABKAlSA21kNQ==');\n\n@$core.Deprecated('Use sortOptionDescriptor instead')\nconst SortOption$json = {\n  '1': 'SortOption',\n  '2': [\n    {\n      '1': 'order',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.listener.v1.ListOrder',\n      '10': 'order'\n    },\n    {\n      '1': 'sort_field',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.listener.v1.ListSortField',\n      '10': 'sortField'\n    },\n    {'1': 'is_switching', '3': 3, '4': 1, '5': 8, '10': 'isSwitching'},\n  ],\n};\n\n/// Descriptor for `SortOption`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sortOptionDescriptor = $convert.base64Decode(\n    'CgpTb3J0T3B0aW9uEjkKBW9yZGVyGAEgASgOMiMuYmlsaWJpbGkuYXBwLmxpc3RlbmVyLnYxLk'\n    'xpc3RPcmRlclIFb3JkZXISRgoKc29ydF9maWVsZBgCIAEoDjInLmJpbGliaWxpLmFwcC5saXN0'\n    'ZW5lci52MS5MaXN0U29ydEZpZWxkUglzb3J0RmllbGQSIQoMaXNfc3dpdGNoaW5nGAMgASgIUg'\n    'tpc1N3aXRjaGluZw==');\n\n@$core.Deprecated('Use thumbUpReqDescriptor instead')\nconst ThumbUpReq$json = {\n  '1': 'ThumbUpReq',\n  '2': [\n    {\n      '1': 'item',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayItem',\n      '10': 'item'\n    },\n    {\n      '1': 'action',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.listener.v1.ThumbUpReq.ThumbType',\n      '10': 'action'\n    },\n  ],\n  '4': [ThumbUpReq_ThumbType$json],\n};\n\n@$core.Deprecated('Use thumbUpReqDescriptor instead')\nconst ThumbUpReq_ThumbType$json = {\n  '1': 'ThumbType',\n  '2': [\n    {'1': 'LIKE', '2': 0},\n    {'1': 'CANCEL_LIKE', '2': 1},\n    {'1': 'DISLIKE', '2': 2},\n    {'1': 'CANCEL_DISLIKE', '2': 3},\n  ],\n};\n\n/// Descriptor for `ThumbUpReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List thumbUpReqDescriptor = $convert.base64Decode(\n    'CgpUaHVtYlVwUmVxEjYKBGl0ZW0YASABKAsyIi5iaWxpYmlsaS5hcHAubGlzdGVuZXIudjEuUG'\n    'xheUl0ZW1SBGl0ZW0SRgoGYWN0aW9uGAIgASgOMi4uYmlsaWJpbGkuYXBwLmxpc3RlbmVyLnYx'\n    'LlRodW1iVXBSZXEuVGh1bWJUeXBlUgZhY3Rpb24iRwoJVGh1bWJUeXBlEggKBExJS0UQABIPCg'\n    'tDQU5DRUxfTElLRRABEgsKB0RJU0xJS0UQAhISCg5DQU5DRUxfRElTTElLRRAD');\n\n@$core.Deprecated('Use thumbUpRespDescriptor instead')\nconst ThumbUpResp$json = {\n  '1': 'ThumbUpResp',\n  '2': [\n    {'1': 'message', '3': 1, '4': 1, '5': 9, '10': 'message'},\n  ],\n};\n\n/// Descriptor for `ThumbUpResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List thumbUpRespDescriptor = $convert\n    .base64Decode('CgtUaHVtYlVwUmVzcBIYCgdtZXNzYWdlGAEgASgJUgdtZXNzYWdl');\n\n@$core.Deprecated('Use topCardDescriptor instead')\nconst TopCard$json = {\n  '1': 'TopCard',\n  '2': [\n    {\n      '1': 'listen_history',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.TpcdHistory',\n      '9': 0,\n      '10': 'listenHistory'\n    },\n    {\n      '1': 'fav_folder',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.TpcdFavFolder',\n      '9': 0,\n      '10': 'favFolder'\n    },\n    {\n      '1': 'up_recall',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.TpcdUpRecall',\n      '9': 0,\n      '10': 'upRecall'\n    },\n    {\n      '1': 'pick_today',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.TpcdPickToday',\n      '9': 0,\n      '10': 'pickToday'\n    },\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'play_style',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.listener.v1.TopCard.PlayStrategy',\n      '10': 'playStyle'\n    },\n    {\n      '1': 'card_type',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.listener.v1.TopCardType',\n      '10': 'cardType'\n    },\n    {'1': 'pos', '3': 8, '4': 1, '5': 3, '10': 'pos'},\n    {'1': 'title_icon', '3': 9, '4': 1, '5': 9, '10': 'titleIcon'},\n  ],\n  '4': [TopCard_PlayStrategy$json],\n  '8': [\n    {'1': 'card'},\n  ],\n};\n\n@$core.Deprecated('Use topCardDescriptor instead')\nconst TopCard_PlayStrategy$json = {\n  '1': 'PlayStrategy',\n  '2': [\n    {'1': 'NO_INTERRUPT', '2': 0},\n    {'1': 'PLAY_TARGET', '2': 1},\n    {'1': 'PLAY_FIRST', '2': 2},\n  ],\n};\n\n/// Descriptor for `TopCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List topCardDescriptor = $convert.base64Decode(\n    'CgdUb3BDYXJkEk4KDmxpc3Rlbl9oaXN0b3J5GAQgASgLMiUuYmlsaWJpbGkuYXBwLmxpc3Rlbm'\n    'VyLnYxLlRwY2RIaXN0b3J5SABSDWxpc3Rlbkhpc3RvcnkSSAoKZmF2X2ZvbGRlchgFIAEoCzIn'\n    'LmJpbGliaWxpLmFwcC5saXN0ZW5lci52MS5UcGNkRmF2Rm9sZGVySABSCWZhdkZvbGRlchJFCg'\n    'l1cF9yZWNhbGwYBiABKAsyJi5iaWxpYmlsaS5hcHAubGlzdGVuZXIudjEuVHBjZFVwUmVjYWxs'\n    'SABSCHVwUmVjYWxsEkgKCnBpY2tfdG9kYXkYByABKAsyJy5iaWxpYmlsaS5hcHAubGlzdGVuZX'\n    'IudjEuVHBjZFBpY2tUb2RheUgAUglwaWNrVG9kYXkSFAoFdGl0bGUYASABKAlSBXRpdGxlEk0K'\n    'CnBsYXlfc3R5bGUYAiABKA4yLi5iaWxpYmlsaS5hcHAubGlzdGVuZXIudjEuVG9wQ2FyZC5QbG'\n    'F5U3RyYXRlZ3lSCXBsYXlTdHlsZRJCCgljYXJkX3R5cGUYAyABKA4yJS5iaWxpYmlsaS5hcHAu'\n    'bGlzdGVuZXIudjEuVG9wQ2FyZFR5cGVSCGNhcmRUeXBlEhAKA3BvcxgIIAEoA1IDcG9zEh0KCn'\n    'RpdGxlX2ljb24YCSABKAlSCXRpdGxlSWNvbiJBCgxQbGF5U3RyYXRlZ3kSEAoMTk9fSU5URVJS'\n    'VVBUEAASDwoLUExBWV9UQVJHRVQQARIOCgpQTEFZX0ZJUlNUEAJCBgoEY2FyZA==');\n\n@$core.Deprecated('Use tpcdFavFolderDescriptor instead')\nconst TpcdFavFolder$json = {\n  '1': 'TpcdFavFolder',\n  '2': [\n    {\n      '1': 'item',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.DetailItem',\n      '10': 'item'\n    },\n    {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'pic', '3': 3, '4': 1, '5': 9, '10': 'pic'},\n    {'1': 'fid', '3': 4, '4': 1, '5': 3, '10': 'fid'},\n    {'1': 'folder_type', '3': 5, '4': 1, '5': 5, '10': 'folderType'},\n  ],\n};\n\n/// Descriptor for `TpcdFavFolder`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List tpcdFavFolderDescriptor = $convert.base64Decode(\n    'Cg1UcGNkRmF2Rm9sZGVyEjgKBGl0ZW0YASABKAsyJC5iaWxpYmlsaS5hcHAubGlzdGVuZXIudj'\n    'EuRGV0YWlsSXRlbVIEaXRlbRISCgR0ZXh0GAIgASgJUgR0ZXh0EhAKA3BpYxgDIAEoCVIDcGlj'\n    'EhAKA2ZpZBgEIAEoA1IDZmlkEh8KC2ZvbGRlcl90eXBlGAUgASgFUgpmb2xkZXJUeXBl');\n\n@$core.Deprecated('Use tpcdHistoryDescriptor instead')\nconst TpcdHistory$json = {\n  '1': 'TpcdHistory',\n  '2': [\n    {\n      '1': 'item',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.DetailItem',\n      '10': 'item'\n    },\n    {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'pic', '3': 3, '4': 1, '5': 9, '10': 'pic'},\n  ],\n};\n\n/// Descriptor for `TpcdHistory`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List tpcdHistoryDescriptor = $convert.base64Decode(\n    'CgtUcGNkSGlzdG9yeRI4CgRpdGVtGAEgASgLMiQuYmlsaWJpbGkuYXBwLmxpc3RlbmVyLnYxLk'\n    'RldGFpbEl0ZW1SBGl0ZW0SEgoEdGV4dBgCIAEoCVIEdGV4dBIQCgNwaWMYAyABKAlSA3BpYw==');\n\n@$core.Deprecated('Use tpcdPickTodayDescriptor instead')\nconst TpcdPickToday$json = {\n  '1': 'TpcdPickToday',\n  '2': [\n    {\n      '1': 'item',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.DetailItem',\n      '10': 'item'\n    },\n    {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'pic', '3': 3, '4': 1, '5': 9, '10': 'pic'},\n    {'1': 'pick_id', '3': 4, '4': 1, '5': 3, '10': 'pickId'},\n    {'1': 'pick_card_id', '3': 5, '4': 1, '5': 3, '10': 'pickCardId'},\n  ],\n};\n\n/// Descriptor for `TpcdPickToday`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List tpcdPickTodayDescriptor = $convert.base64Decode(\n    'Cg1UcGNkUGlja1RvZGF5EjgKBGl0ZW0YASABKAsyJC5iaWxpYmlsaS5hcHAubGlzdGVuZXIudj'\n    'EuRGV0YWlsSXRlbVIEaXRlbRISCgR0ZXh0GAIgASgJUgR0ZXh0EhAKA3BpYxgDIAEoCVIDcGlj'\n    'EhcKB3BpY2tfaWQYBCABKANSBnBpY2tJZBIgCgxwaWNrX2NhcmRfaWQYBSABKANSCnBpY2tDYX'\n    'JkSWQ=');\n\n@$core.Deprecated('Use tpcdUpRecallDescriptor instead')\nconst TpcdUpRecall$json = {\n  '1': 'TpcdUpRecall',\n  '2': [\n    {'1': 'up_mid', '3': 1, '4': 1, '5': 3, '10': 'upMid'},\n    {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'avatar', '3': 3, '4': 1, '5': 9, '10': 'avatar'},\n    {'1': 'medialist_type', '3': 4, '4': 1, '5': 3, '10': 'medialistType'},\n    {'1': 'medialist_biz_id', '3': 5, '4': 1, '5': 3, '10': 'medialistBizId'},\n    {\n      '1': 'item',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.DetailItem',\n      '10': 'item'\n    },\n  ],\n};\n\n/// Descriptor for `TpcdUpRecall`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List tpcdUpRecallDescriptor = $convert.base64Decode(\n    'CgxUcGNkVXBSZWNhbGwSFQoGdXBfbWlkGAEgASgDUgV1cE1pZBISCgR0ZXh0GAIgASgJUgR0ZX'\n    'h0EhYKBmF2YXRhchgDIAEoCVIGYXZhdGFyEiUKDm1lZGlhbGlzdF90eXBlGAQgASgDUg1tZWRp'\n    'YWxpc3RUeXBlEigKEG1lZGlhbGlzdF9iaXpfaWQYBSABKANSDm1lZGlhbGlzdEJpeklkEjgKBG'\n    'l0ZW0YBiABKAsyJC5iaWxpYmlsaS5hcHAubGlzdGVuZXIudjEuRGV0YWlsSXRlbVIEaXRlbQ==');\n\n@$core.Deprecated('Use tripleLikeReqDescriptor instead')\nconst TripleLikeReq$json = {\n  '1': 'TripleLikeReq',\n  '2': [\n    {\n      '1': 'item',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.listener.v1.PlayItem',\n      '10': 'item'\n    },\n  ],\n};\n\n/// Descriptor for `TripleLikeReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List tripleLikeReqDescriptor = $convert.base64Decode(\n    'Cg1UcmlwbGVMaWtlUmVxEjYKBGl0ZW0YASABKAsyIi5iaWxpYmlsaS5hcHAubGlzdGVuZXIudj'\n    'EuUGxheUl0ZW1SBGl0ZW0=');\n\n@$core.Deprecated('Use tripleLikeRespDescriptor instead')\nconst TripleLikeResp$json = {\n  '1': 'TripleLikeResp',\n  '2': [\n    {'1': 'message', '3': 1, '4': 1, '5': 9, '10': 'message'},\n    {'1': 'thumb_ok', '3': 2, '4': 1, '5': 8, '10': 'thumbOk'},\n    {'1': 'coin_ok', '3': 3, '4': 1, '5': 8, '10': 'coinOk'},\n    {'1': 'fav_ok', '3': 4, '4': 1, '5': 8, '10': 'favOk'},\n  ],\n};\n\n/// Descriptor for `TripleLikeResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List tripleLikeRespDescriptor = $convert.base64Decode(\n    'Cg5UcmlwbGVMaWtlUmVzcBIYCgdtZXNzYWdlGAEgASgJUgdtZXNzYWdlEhkKCHRodW1iX29rGA'\n    'IgASgIUgd0aHVtYk9rEhcKB2NvaW5fb2sYAyABKAhSBmNvaW5PaxIVCgZmYXZfb2sYBCABKAhS'\n    'BWZhdk9r');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/playurl/v1.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/playurl/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:fixnum/fixnum.dart' as $fixnum;\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nimport 'v1.pbenum.dart';\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nexport 'v1.pbenum.dart';\n\nclass AB extends $pb.GeneratedMessage {\n  factory AB({\n    Glance? glance,\n    Group? group,\n  }) {\n    final result = create();\n    if (glance != null) result.glance = glance;\n    if (group != null) result.group = group;\n    return result;\n  }\n\n  AB._();\n\n  factory AB.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AB.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AB',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aOM<Glance>(1, _omitFieldNames ? '' : 'glance', subBuilder: Glance.create)\n    ..aE<Group>(2, _omitFieldNames ? '' : 'group', enumValues: Group.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AB clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AB copyWith(void Function(AB) updates) =>\n      super.copyWith((message) => updates(message as AB)) as AB;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AB create() => AB._();\n  @$core.override\n  AB createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AB getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<AB>(create);\n  static AB? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Glance get glance => $_getN(0);\n  @$pb.TagNumber(1)\n  set glance(Glance value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasGlance() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearGlance() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Glance ensureGlance() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  Group get group => $_getN(1);\n  @$pb.TagNumber(2)\n  set group(Group value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasGroup() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearGroup() => $_clearField(2);\n}\n\nclass ArcConf extends $pb.GeneratedMessage {\n  factory ArcConf({\n    $core.bool? isSupport,\n    $core.bool? disabled,\n    ExtraContent? extraContent,\n    $core.Iterable<$fixnum.Int64>? unsupportScene,\n  }) {\n    final result = create();\n    if (isSupport != null) result.isSupport = isSupport;\n    if (disabled != null) result.disabled = disabled;\n    if (extraContent != null) result.extraContent = extraContent;\n    if (unsupportScene != null) result.unsupportScene.addAll(unsupportScene);\n    return result;\n  }\n\n  ArcConf._();\n\n  factory ArcConf.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ArcConf.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ArcConf',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'isSupport')\n    ..aOB(2, _omitFieldNames ? '' : 'disabled')\n    ..aOM<ExtraContent>(3, _omitFieldNames ? '' : 'extraContent',\n        subBuilder: ExtraContent.create)\n    ..p<$fixnum.Int64>(\n        4, _omitFieldNames ? '' : 'unsupportScene', $pb.PbFieldType.K6)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ArcConf clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ArcConf copyWith(void Function(ArcConf) updates) =>\n      super.copyWith((message) => updates(message as ArcConf)) as ArcConf;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ArcConf create() => ArcConf._();\n  @$core.override\n  ArcConf createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ArcConf getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ArcConf>(create);\n  static ArcConf? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get isSupport => $_getBF(0);\n  @$pb.TagNumber(1)\n  set isSupport($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIsSupport() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIsSupport() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get disabled => $_getBF(1);\n  @$pb.TagNumber(2)\n  set disabled($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDisabled() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDisabled() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  ExtraContent get extraContent => $_getN(2);\n  @$pb.TagNumber(3)\n  set extraContent(ExtraContent value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasExtraContent() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearExtraContent() => $_clearField(3);\n  @$pb.TagNumber(3)\n  ExtraContent ensureExtraContent() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<$fixnum.Int64> get unsupportScene => $_getList(3);\n}\n\nclass ButtonInfo extends $pb.GeneratedMessage {\n  factory ButtonInfo({\n    $core.String? text,\n    $core.String? textColor,\n    $core.String? textColorNight,\n    $core.String? bgColor,\n    $core.String? bgColorNight,\n    $core.String? link,\n    ButtonAction? actionType,\n    Report? report,\n    $core.String? frameColor,\n    $core.String? icon,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (textColor != null) result.textColor = textColor;\n    if (textColorNight != null) result.textColorNight = textColorNight;\n    if (bgColor != null) result.bgColor = bgColor;\n    if (bgColorNight != null) result.bgColorNight = bgColorNight;\n    if (link != null) result.link = link;\n    if (actionType != null) result.actionType = actionType;\n    if (report != null) result.report = report;\n    if (frameColor != null) result.frameColor = frameColor;\n    if (icon != null) result.icon = icon;\n    return result;\n  }\n\n  ButtonInfo._();\n\n  factory ButtonInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ButtonInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ButtonInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aOS(2, _omitFieldNames ? '' : 'textColor')\n    ..aOS(3, _omitFieldNames ? '' : 'textColorNight')\n    ..aOS(4, _omitFieldNames ? '' : 'bgColor')\n    ..aOS(5, _omitFieldNames ? '' : 'bgColorNight')\n    ..aOS(6, _omitFieldNames ? '' : 'link')\n    ..aE<ButtonAction>(7, _omitFieldNames ? '' : 'actionType',\n        enumValues: ButtonAction.values)\n    ..aOM<Report>(8, _omitFieldNames ? '' : 'report', subBuilder: Report.create)\n    ..aOS(9, _omitFieldNames ? '' : 'frameColor')\n    ..aOS(10, _omitFieldNames ? '' : 'icon')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ButtonInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ButtonInfo copyWith(void Function(ButtonInfo) updates) =>\n      super.copyWith((message) => updates(message as ButtonInfo)) as ButtonInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ButtonInfo create() => ButtonInfo._();\n  @$core.override\n  ButtonInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ButtonInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ButtonInfo>(create);\n  static ButtonInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get textColor => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set textColor($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTextColor() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTextColor() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get textColorNight => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set textColorNight($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTextColorNight() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTextColorNight() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get bgColor => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set bgColor($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBgColor() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBgColor() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get bgColorNight => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set bgColorNight($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBgColorNight() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBgColorNight() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get link => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set link($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasLink() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearLink() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  ButtonAction get actionType => $_getN(6);\n  @$pb.TagNumber(7)\n  set actionType(ButtonAction value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasActionType() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearActionType() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  Report get report => $_getN(7);\n  @$pb.TagNumber(8)\n  set report(Report value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasReport() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearReport() => $_clearField(8);\n  @$pb.TagNumber(8)\n  Report ensureReport() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  $core.String get frameColor => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set frameColor($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasFrameColor() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearFrameColor() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get icon => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set icon($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasIcon() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearIcon() => $_clearField(10);\n}\n\nclass ButtonStyle extends $pb.GeneratedMessage {\n  factory ButtonStyle({\n    $core.String? text,\n    $core.String? textColor,\n    $core.String? bgColor,\n    $core.String? jumpLink,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (textColor != null) result.textColor = textColor;\n    if (bgColor != null) result.bgColor = bgColor;\n    if (jumpLink != null) result.jumpLink = jumpLink;\n    return result;\n  }\n\n  ButtonStyle._();\n\n  factory ButtonStyle.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ButtonStyle.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ButtonStyle',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aOS(2, _omitFieldNames ? '' : 'textColor')\n    ..aOS(3, _omitFieldNames ? '' : 'bgColor')\n    ..aOS(4, _omitFieldNames ? '' : 'jumpLink')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ButtonStyle clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ButtonStyle copyWith(void Function(ButtonStyle) updates) =>\n      super.copyWith((message) => updates(message as ButtonStyle))\n          as ButtonStyle;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ButtonStyle create() => ButtonStyle._();\n  @$core.override\n  ButtonStyle createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ButtonStyle getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ButtonStyle>(create);\n  static ButtonStyle? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get textColor => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set textColor($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTextColor() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTextColor() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get bgColor => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set bgColor($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBgColor() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBgColor() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get jumpLink => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set jumpLink($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasJumpLink() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearJumpLink() => $_clearField(4);\n}\n\nclass Chronos extends $pb.GeneratedMessage {\n  factory Chronos({\n    $core.String? md5,\n    $core.String? file,\n  }) {\n    final result = create();\n    if (md5 != null) result.md5 = md5;\n    if (file != null) result.file = file;\n    return result;\n  }\n\n  Chronos._();\n\n  factory Chronos.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Chronos.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Chronos',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'md5')\n    ..aOS(2, _omitFieldNames ? '' : 'file')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Chronos clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Chronos copyWith(void Function(Chronos) updates) =>\n      super.copyWith((message) => updates(message as Chronos)) as Chronos;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Chronos create() => Chronos._();\n  @$core.override\n  Chronos createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Chronos getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Chronos>(create);\n  static Chronos? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get md5 => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set md5($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMd5() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMd5() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get file => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set file($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFile() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFile() => $_clearField(2);\n}\n\nclass CloudConf extends $pb.GeneratedMessage {\n  factory CloudConf({\n    $core.bool? show,\n    ConfType? confType,\n    FieldValue? fieldValue,\n    ConfValue? confValue,\n  }) {\n    final result = create();\n    if (show != null) result.show = show;\n    if (confType != null) result.confType = confType;\n    if (fieldValue != null) result.fieldValue = fieldValue;\n    if (confValue != null) result.confValue = confValue;\n    return result;\n  }\n\n  CloudConf._();\n\n  factory CloudConf.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CloudConf.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CloudConf',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'show')\n    ..aE<ConfType>(2, _omitFieldNames ? '' : 'confType',\n        enumValues: ConfType.values)\n    ..aOM<FieldValue>(3, _omitFieldNames ? '' : 'fieldValue',\n        subBuilder: FieldValue.create)\n    ..aOM<ConfValue>(4, _omitFieldNames ? '' : 'confValue',\n        subBuilder: ConfValue.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CloudConf clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CloudConf copyWith(void Function(CloudConf) updates) =>\n      super.copyWith((message) => updates(message as CloudConf)) as CloudConf;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CloudConf create() => CloudConf._();\n  @$core.override\n  CloudConf createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CloudConf getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CloudConf>(create);\n  static CloudConf? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get show => $_getBF(0);\n  @$pb.TagNumber(1)\n  set show($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasShow() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearShow() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  ConfType get confType => $_getN(1);\n  @$pb.TagNumber(2)\n  set confType(ConfType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasConfType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearConfType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  FieldValue get fieldValue => $_getN(2);\n  @$pb.TagNumber(3)\n  set fieldValue(FieldValue value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFieldValue() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFieldValue() => $_clearField(3);\n  @$pb.TagNumber(3)\n  FieldValue ensureFieldValue() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  ConfValue get confValue => $_getN(3);\n  @$pb.TagNumber(4)\n  set confValue(ConfValue value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasConfValue() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearConfValue() => $_clearField(4);\n  @$pb.TagNumber(4)\n  ConfValue ensureConfValue() => $_ensure(3);\n}\n\nclass ComprehensiveToast extends $pb.GeneratedMessage {\n  factory ComprehensiveToast({\n    ToastType? type,\n    ButtonInfo? button,\n    $core.String? icon,\n    TextInfo? toastText,\n    Report? report,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (button != null) result.button = button;\n    if (icon != null) result.icon = icon;\n    if (toastText != null) result.toastText = toastText;\n    if (report != null) result.report = report;\n    return result;\n  }\n\n  ComprehensiveToast._();\n\n  factory ComprehensiveToast.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ComprehensiveToast.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ComprehensiveToast',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aE<ToastType>(1, _omitFieldNames ? '' : 'type',\n        enumValues: ToastType.values)\n    ..aOM<ButtonInfo>(2, _omitFieldNames ? '' : 'button',\n        subBuilder: ButtonInfo.create)\n    ..aOS(3, _omitFieldNames ? '' : 'icon')\n    ..aOM<TextInfo>(4, _omitFieldNames ? '' : 'toastText',\n        subBuilder: TextInfo.create)\n    ..aOM<Report>(5, _omitFieldNames ? '' : 'report', subBuilder: Report.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ComprehensiveToast clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ComprehensiveToast copyWith(void Function(ComprehensiveToast) updates) =>\n      super.copyWith((message) => updates(message as ComprehensiveToast))\n          as ComprehensiveToast;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ComprehensiveToast create() => ComprehensiveToast._();\n  @$core.override\n  ComprehensiveToast createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ComprehensiveToast getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ComprehensiveToast>(create);\n  static ComprehensiveToast? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  ToastType get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(ToastType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  ButtonInfo get button => $_getN(1);\n  @$pb.TagNumber(2)\n  set button(ButtonInfo value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasButton() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearButton() => $_clearField(2);\n  @$pb.TagNumber(2)\n  ButtonInfo ensureButton() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.String get icon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set icon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIcon() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  TextInfo get toastText => $_getN(3);\n  @$pb.TagNumber(4)\n  set toastText(TextInfo value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasToastText() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearToastText() => $_clearField(4);\n  @$pb.TagNumber(4)\n  TextInfo ensureToastText() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  Report get report => $_getN(4);\n  @$pb.TagNumber(5)\n  set report(Report value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasReport() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearReport() => $_clearField(5);\n  @$pb.TagNumber(5)\n  Report ensureReport() => $_ensure(4);\n}\n\nenum ConfValue_Value { switchVal, selectedVal, notSet }\n\nclass ConfValue extends $pb.GeneratedMessage {\n  factory ConfValue({\n    $core.bool? switchVal,\n    $fixnum.Int64? selectedVal,\n  }) {\n    final result = create();\n    if (switchVal != null) result.switchVal = switchVal;\n    if (selectedVal != null) result.selectedVal = selectedVal;\n    return result;\n  }\n\n  ConfValue._();\n\n  factory ConfValue.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ConfValue.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, ConfValue_Value> _ConfValue_ValueByTag = {\n    1: ConfValue_Value.switchVal,\n    2: ConfValue_Value.selectedVal,\n    0: ConfValue_Value.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ConfValue',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [1, 2])\n    ..aOB(1, _omitFieldNames ? '' : 'switchVal')\n    ..aInt64(2, _omitFieldNames ? '' : 'selectedVal')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ConfValue clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ConfValue copyWith(void Function(ConfValue) updates) =>\n      super.copyWith((message) => updates(message as ConfValue)) as ConfValue;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ConfValue create() => ConfValue._();\n  @$core.override\n  ConfValue createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ConfValue getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ConfValue>(create);\n  static ConfValue? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  @$pb.TagNumber(2)\n  ConfValue_Value whichValue() => _ConfValue_ValueByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(1)\n  @$pb.TagNumber(2)\n  void clearValue() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  $core.bool get switchVal => $_getBF(0);\n  @$pb.TagNumber(1)\n  set switchVal($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSwitchVal() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSwitchVal() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get selectedVal => $_getI64(1);\n  @$pb.TagNumber(2)\n  set selectedVal($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSelectedVal() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSelectedVal() => $_clearField(2);\n}\n\nclass DashItem extends $pb.GeneratedMessage {\n  factory DashItem({\n    $core.int? id,\n    $core.String? baseUrl,\n    $core.Iterable<$core.String>? backupUrl,\n    $core.int? bandwidth,\n    $core.int? codecid,\n    $core.String? md5,\n    $fixnum.Int64? size,\n    $core.String? frameRate,\n    $core.String? widevinePssh,\n    $core.String? bilidrmUri,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (baseUrl != null) result.baseUrl = baseUrl;\n    if (backupUrl != null) result.backupUrl.addAll(backupUrl);\n    if (bandwidth != null) result.bandwidth = bandwidth;\n    if (codecid != null) result.codecid = codecid;\n    if (md5 != null) result.md5 = md5;\n    if (size != null) result.size = size;\n    if (frameRate != null) result.frameRate = frameRate;\n    if (widevinePssh != null) result.widevinePssh = widevinePssh;\n    if (bilidrmUri != null) result.bilidrmUri = bilidrmUri;\n    return result;\n  }\n\n  DashItem._();\n\n  factory DashItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DashItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DashItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'baseUrl')\n    ..pPS(3, _omitFieldNames ? '' : 'backupUrl')\n    ..aI(4, _omitFieldNames ? '' : 'bandwidth')\n    ..aI(5, _omitFieldNames ? '' : 'codecid')\n    ..aOS(6, _omitFieldNames ? '' : 'md5')\n    ..aInt64(7, _omitFieldNames ? '' : 'size')\n    ..aOS(8, _omitFieldNames ? '' : 'frameRate')\n    ..aOS(9, _omitFieldNames ? '' : 'widevinePssh')\n    ..aOS(10, _omitFieldNames ? '' : 'bilidrmUri')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DashItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DashItem copyWith(void Function(DashItem) updates) =>\n      super.copyWith((message) => updates(message as DashItem)) as DashItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DashItem create() => DashItem._();\n  @$core.override\n  DashItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DashItem getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DashItem>(create);\n  static DashItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get id => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set id($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get baseUrl => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set baseUrl($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBaseUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBaseUrl() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<$core.String> get backupUrl => $_getList(2);\n\n  @$pb.TagNumber(4)\n  $core.int get bandwidth => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set bandwidth($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBandwidth() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBandwidth() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get codecid => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set codecid($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCodecid() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCodecid() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get md5 => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set md5($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasMd5() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearMd5() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get size => $_getI64(6);\n  @$pb.TagNumber(7)\n  set size($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasSize() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearSize() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get frameRate => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set frameRate($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasFrameRate() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearFrameRate() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get widevinePssh => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set widevinePssh($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasWidevinePssh() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearWidevinePssh() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get bilidrmUri => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set bilidrmUri($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasBilidrmUri() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearBilidrmUri() => $_clearField(10);\n}\n\nclass DashVideo extends $pb.GeneratedMessage {\n  factory DashVideo({\n    $core.String? baseUrl,\n    $core.Iterable<$core.String>? backupUrl,\n    $core.int? bandwidth,\n    $core.int? codecid,\n    $core.String? md5,\n    $fixnum.Int64? size,\n    $core.int? audioId,\n    $core.bool? noRexcode,\n    $core.String? frameRate,\n    $core.int? width,\n    $core.int? height,\n    $core.String? widevinePssh,\n    $core.String? bilidrmUri,\n  }) {\n    final result = create();\n    if (baseUrl != null) result.baseUrl = baseUrl;\n    if (backupUrl != null) result.backupUrl.addAll(backupUrl);\n    if (bandwidth != null) result.bandwidth = bandwidth;\n    if (codecid != null) result.codecid = codecid;\n    if (md5 != null) result.md5 = md5;\n    if (size != null) result.size = size;\n    if (audioId != null) result.audioId = audioId;\n    if (noRexcode != null) result.noRexcode = noRexcode;\n    if (frameRate != null) result.frameRate = frameRate;\n    if (width != null) result.width = width;\n    if (height != null) result.height = height;\n    if (widevinePssh != null) result.widevinePssh = widevinePssh;\n    if (bilidrmUri != null) result.bilidrmUri = bilidrmUri;\n    return result;\n  }\n\n  DashVideo._();\n\n  factory DashVideo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DashVideo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DashVideo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'baseUrl')\n    ..pPS(2, _omitFieldNames ? '' : 'backupUrl')\n    ..aI(3, _omitFieldNames ? '' : 'bandwidth')\n    ..aI(4, _omitFieldNames ? '' : 'codecid')\n    ..aOS(5, _omitFieldNames ? '' : 'md5')\n    ..aInt64(6, _omitFieldNames ? '' : 'size')\n    ..aI(7, _omitFieldNames ? '' : 'audioId')\n    ..aOB(8, _omitFieldNames ? '' : 'noRexcode')\n    ..aOS(9, _omitFieldNames ? '' : 'frameRate')\n    ..aI(10, _omitFieldNames ? '' : 'width')\n    ..aI(11, _omitFieldNames ? '' : 'height')\n    ..aOS(12, _omitFieldNames ? '' : 'widevinePssh')\n    ..aOS(13, _omitFieldNames ? '' : 'bilidrmUri')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DashVideo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DashVideo copyWith(void Function(DashVideo) updates) =>\n      super.copyWith((message) => updates(message as DashVideo)) as DashVideo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DashVideo create() => DashVideo._();\n  @$core.override\n  DashVideo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DashVideo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DashVideo>(create);\n  static DashVideo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get baseUrl => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set baseUrl($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBaseUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBaseUrl() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<$core.String> get backupUrl => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $core.int get bandwidth => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set bandwidth($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBandwidth() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBandwidth() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get codecid => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set codecid($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCodecid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCodecid() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get md5 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set md5($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasMd5() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearMd5() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get size => $_getI64(5);\n  @$pb.TagNumber(6)\n  set size($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasSize() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearSize() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get audioId => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set audioId($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasAudioId() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearAudioId() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.bool get noRexcode => $_getBF(7);\n  @$pb.TagNumber(8)\n  set noRexcode($core.bool value) => $_setBool(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasNoRexcode() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearNoRexcode() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get frameRate => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set frameRate($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasFrameRate() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearFrameRate() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.int get width => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set width($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasWidth() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearWidth() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.int get height => $_getIZ(10);\n  @$pb.TagNumber(11)\n  set height($core.int value) => $_setSignedInt32(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasHeight() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearHeight() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get widevinePssh => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set widevinePssh($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasWidevinePssh() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearWidevinePssh() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.String get bilidrmUri => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set bilidrmUri($core.String value) => $_setString(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasBilidrmUri() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearBilidrmUri() => $_clearField(13);\n}\n\nclass Dialog extends $pb.GeneratedMessage {\n  factory Dialog({\n    GuideStyle? styleType,\n    Report? report,\n    TextInfo? title,\n    TextInfo? subtitle,\n    $core.Iterable<ButtonInfo>? button,\n  }) {\n    final result = create();\n    if (styleType != null) result.styleType = styleType;\n    if (report != null) result.report = report;\n    if (title != null) result.title = title;\n    if (subtitle != null) result.subtitle = subtitle;\n    if (button != null) result.button.addAll(button);\n    return result;\n  }\n\n  Dialog._();\n\n  factory Dialog.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Dialog.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Dialog',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aE<GuideStyle>(1, _omitFieldNames ? '' : 'styleType',\n        enumValues: GuideStyle.values)\n    ..aOM<Report>(2, _omitFieldNames ? '' : 'report', subBuilder: Report.create)\n    ..aOM<TextInfo>(3, _omitFieldNames ? '' : 'title',\n        subBuilder: TextInfo.create)\n    ..aOM<TextInfo>(4, _omitFieldNames ? '' : 'subtitle',\n        subBuilder: TextInfo.create)\n    ..pPM<ButtonInfo>(5, _omitFieldNames ? '' : 'button',\n        subBuilder: ButtonInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Dialog clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Dialog copyWith(void Function(Dialog) updates) =>\n      super.copyWith((message) => updates(message as Dialog)) as Dialog;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Dialog create() => Dialog._();\n  @$core.override\n  Dialog createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Dialog getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Dialog>(create);\n  static Dialog? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  GuideStyle get styleType => $_getN(0);\n  @$pb.TagNumber(1)\n  set styleType(GuideStyle value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStyleType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStyleType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  Report get report => $_getN(1);\n  @$pb.TagNumber(2)\n  set report(Report value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasReport() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearReport() => $_clearField(2);\n  @$pb.TagNumber(2)\n  Report ensureReport() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  TextInfo get title => $_getN(2);\n  @$pb.TagNumber(3)\n  set title(TextInfo value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTitle() => $_clearField(3);\n  @$pb.TagNumber(3)\n  TextInfo ensureTitle() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  TextInfo get subtitle => $_getN(3);\n  @$pb.TagNumber(4)\n  set subtitle(TextInfo value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSubtitle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSubtitle() => $_clearField(4);\n  @$pb.TagNumber(4)\n  TextInfo ensureSubtitle() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $pb.PbList<ButtonInfo> get button => $_getList(4);\n}\n\nclass DolbyItem extends $pb.GeneratedMessage {\n  factory DolbyItem({\n    DolbyItem_Type? type,\n    $core.Iterable<DashItem>? audio,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (audio != null) result.audio.addAll(audio);\n    return result;\n  }\n\n  DolbyItem._();\n\n  factory DolbyItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DolbyItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DolbyItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aE<DolbyItem_Type>(1, _omitFieldNames ? '' : 'type',\n        enumValues: DolbyItem_Type.values)\n    ..pPM<DashItem>(2, _omitFieldNames ? '' : 'audio',\n        subBuilder: DashItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DolbyItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DolbyItem copyWith(void Function(DolbyItem) updates) =>\n      super.copyWith((message) => updates(message as DolbyItem)) as DolbyItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DolbyItem create() => DolbyItem._();\n  @$core.override\n  DolbyItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DolbyItem getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DolbyItem>(create);\n  static DolbyItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  DolbyItem_Type get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(DolbyItem_Type value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<DashItem> get audio => $_getList(1);\n}\n\nclass Event extends $pb.GeneratedMessage {\n  factory Event({\n    Shake? shake,\n  }) {\n    final result = create();\n    if (shake != null) result.shake = shake;\n    return result;\n  }\n\n  Event._();\n\n  factory Event.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Event.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Event',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aOM<Shake>(1, _omitFieldNames ? '' : 'shake', subBuilder: Shake.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Event clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Event copyWith(void Function(Event) updates) =>\n      super.copyWith((message) => updates(message as Event)) as Event;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Event create() => Event._();\n  @$core.override\n  Event createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Event getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Event>(create);\n  static Event? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Shake get shake => $_getN(0);\n  @$pb.TagNumber(1)\n  set shake(Shake value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasShake() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearShake() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Shake ensureShake() => $_ensure(0);\n}\n\nclass ExtraContent extends $pb.GeneratedMessage {\n  factory ExtraContent({\n    $core.String? disabledReason,\n    $fixnum.Int64? disabledCode,\n  }) {\n    final result = create();\n    if (disabledReason != null) result.disabledReason = disabledReason;\n    if (disabledCode != null) result.disabledCode = disabledCode;\n    return result;\n  }\n\n  ExtraContent._();\n\n  factory ExtraContent.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ExtraContent.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ExtraContent',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'disabledReason')\n    ..aInt64(2, _omitFieldNames ? '' : 'disabledCode')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtraContent clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtraContent copyWith(void Function(ExtraContent) updates) =>\n      super.copyWith((message) => updates(message as ExtraContent))\n          as ExtraContent;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ExtraContent create() => ExtraContent._();\n  @$core.override\n  ExtraContent createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ExtraContent getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ExtraContent>(create);\n  static ExtraContent? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get disabledReason => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set disabledReason($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDisabledReason() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDisabledReason() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get disabledCode => $_getI64(1);\n  @$pb.TagNumber(2)\n  set disabledCode($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDisabledCode() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDisabledCode() => $_clearField(2);\n}\n\nenum FieldValue_Value { switch_1, notSet }\n\nclass FieldValue extends $pb.GeneratedMessage {\n  factory FieldValue({\n    $core.bool? switch_1,\n  }) {\n    final result = create();\n    if (switch_1 != null) result.switch_1 = switch_1;\n    return result;\n  }\n\n  FieldValue._();\n\n  factory FieldValue.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FieldValue.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, FieldValue_Value> _FieldValue_ValueByTag = {\n    1: FieldValue_Value.switch_1,\n    0: FieldValue_Value.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FieldValue',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [1])\n    ..aOB(1, _omitFieldNames ? '' : 'switch')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FieldValue clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FieldValue copyWith(void Function(FieldValue) updates) =>\n      super.copyWith((message) => updates(message as FieldValue)) as FieldValue;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FieldValue create() => FieldValue._();\n  @$core.override\n  FieldValue createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FieldValue getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FieldValue>(create);\n  static FieldValue? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  FieldValue_Value whichValue() => _FieldValue_ValueByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(1)\n  void clearValue() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  $core.bool get switch_1 => $_getBF(0);\n  @$pb.TagNumber(1)\n  set switch_1($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSwitch_1() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSwitch_1() => $_clearField(1);\n}\n\nclass FormatDescription extends $pb.GeneratedMessage {\n  factory FormatDescription({\n    $core.int? quality,\n    $core.String? format,\n    $core.String? description,\n    $core.String? newDescription,\n    $core.String? displayDesc,\n    $core.String? superscript,\n  }) {\n    final result = create();\n    if (quality != null) result.quality = quality;\n    if (format != null) result.format = format;\n    if (description != null) result.description = description;\n    if (newDescription != null) result.newDescription = newDescription;\n    if (displayDesc != null) result.displayDesc = displayDesc;\n    if (superscript != null) result.superscript = superscript;\n    return result;\n  }\n\n  FormatDescription._();\n\n  factory FormatDescription.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FormatDescription.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FormatDescription',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'quality')\n    ..aOS(2, _omitFieldNames ? '' : 'format')\n    ..aOS(3, _omitFieldNames ? '' : 'description')\n    ..aOS(4, _omitFieldNames ? '' : 'newDescription')\n    ..aOS(5, _omitFieldNames ? '' : 'displayDesc')\n    ..aOS(6, _omitFieldNames ? '' : 'superscript')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FormatDescription clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FormatDescription copyWith(void Function(FormatDescription) updates) =>\n      super.copyWith((message) => updates(message as FormatDescription))\n          as FormatDescription;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FormatDescription create() => FormatDescription._();\n  @$core.override\n  FormatDescription createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FormatDescription getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FormatDescription>(create);\n  static FormatDescription? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get quality => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set quality($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasQuality() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearQuality() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get format => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set format($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFormat() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFormat() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get description => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set description($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDescription() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDescription() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get newDescription => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set newDescription($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasNewDescription() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearNewDescription() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get displayDesc => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set displayDesc($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDisplayDesc() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDisplayDesc() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get superscript => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set superscript($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasSuperscript() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearSuperscript() => $_clearField(6);\n}\n\nclass Glance extends $pb.GeneratedMessage {\n  factory Glance({\n    $core.bool? canWatch,\n    $fixnum.Int64? times,\n    $fixnum.Int64? duration,\n  }) {\n    final result = create();\n    if (canWatch != null) result.canWatch = canWatch;\n    if (times != null) result.times = times;\n    if (duration != null) result.duration = duration;\n    return result;\n  }\n\n  Glance._();\n\n  factory Glance.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Glance.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Glance',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'canWatch')\n    ..aInt64(2, _omitFieldNames ? '' : 'times')\n    ..aInt64(3, _omitFieldNames ? '' : 'duration')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Glance clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Glance copyWith(void Function(Glance) updates) =>\n      super.copyWith((message) => updates(message as Glance)) as Glance;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Glance create() => Glance._();\n  @$core.override\n  Glance createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Glance getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Glance>(create);\n  static Glance? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get canWatch => $_getBF(0);\n  @$pb.TagNumber(1)\n  set canWatch($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCanWatch() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCanWatch() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get times => $_getI64(1);\n  @$pb.TagNumber(2)\n  set times($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTimes() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTimes() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get duration => $_getI64(2);\n  @$pb.TagNumber(3)\n  set duration($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDuration() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDuration() => $_clearField(3);\n}\n\nclass LossLessItem extends $pb.GeneratedMessage {\n  factory LossLessItem({\n    $core.bool? isLosslessAudio,\n    DashItem? audio,\n    $core.bool? needVip,\n  }) {\n    final result = create();\n    if (isLosslessAudio != null) result.isLosslessAudio = isLosslessAudio;\n    if (audio != null) result.audio = audio;\n    if (needVip != null) result.needVip = needVip;\n    return result;\n  }\n\n  LossLessItem._();\n\n  factory LossLessItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LossLessItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LossLessItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'isLosslessAudio')\n    ..aOM<DashItem>(2, _omitFieldNames ? '' : 'audio',\n        subBuilder: DashItem.create)\n    ..aOB(3, _omitFieldNames ? '' : 'needVip')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LossLessItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LossLessItem copyWith(void Function(LossLessItem) updates) =>\n      super.copyWith((message) => updates(message as LossLessItem))\n          as LossLessItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LossLessItem create() => LossLessItem._();\n  @$core.override\n  LossLessItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LossLessItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LossLessItem>(create);\n  static LossLessItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get isLosslessAudio => $_getBF(0);\n  @$pb.TagNumber(1)\n  set isLosslessAudio($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIsLosslessAudio() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIsLosslessAudio() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  DashItem get audio => $_getN(1);\n  @$pb.TagNumber(2)\n  set audio(DashItem value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAudio() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAudio() => $_clearField(2);\n  @$pb.TagNumber(2)\n  DashItem ensureAudio() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.bool get needVip => $_getBF(2);\n  @$pb.TagNumber(3)\n  set needVip($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasNeedVip() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearNeedVip() => $_clearField(3);\n}\n\nclass MultiDashVideo extends $pb.GeneratedMessage {\n  factory MultiDashVideo({\n    $core.Iterable<DashVideo>? dashVideos,\n  }) {\n    final result = create();\n    if (dashVideos != null) result.dashVideos.addAll(dashVideos);\n    return result;\n  }\n\n  MultiDashVideo._();\n\n  factory MultiDashVideo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MultiDashVideo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MultiDashVideo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..pPM<DashVideo>(1, _omitFieldNames ? '' : 'dashVideos',\n        subBuilder: DashVideo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MultiDashVideo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MultiDashVideo copyWith(void Function(MultiDashVideo) updates) =>\n      super.copyWith((message) => updates(message as MultiDashVideo))\n          as MultiDashVideo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MultiDashVideo create() => MultiDashVideo._();\n  @$core.override\n  MultiDashVideo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MultiDashVideo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MultiDashVideo>(create);\n  static MultiDashVideo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<DashVideo> get dashVideos => $_getList(0);\n}\n\nclass PlayAbilityConf extends $pb.GeneratedMessage {\n  factory PlayAbilityConf({\n    CloudConf? backgroundPlayConf,\n    CloudConf? flipConf,\n    CloudConf? castConf,\n    CloudConf? feedbackConf,\n    CloudConf? subtitleConf,\n    CloudConf? playbackRateConf,\n    CloudConf? timeUpConf,\n    CloudConf? playbackModeConf,\n    CloudConf? scaleModeConf,\n    CloudConf? likeConf,\n    CloudConf? dislikeConf,\n    CloudConf? coinConf,\n    CloudConf? elecConf,\n    CloudConf? shareConf,\n    CloudConf? screenShotConf,\n    CloudConf? lockScreenConf,\n    CloudConf? recommendConf,\n    CloudConf? playbackSpeedConf,\n    CloudConf? definitionConf,\n    CloudConf? selectionsConf,\n    CloudConf? nextConf,\n    CloudConf? editDmConf,\n    CloudConf? smallWindowConf,\n    CloudConf? shakeConf,\n    CloudConf? outerDmConf,\n    CloudConf? innerDmConf,\n    CloudConf? panoramaConf,\n    CloudConf? dolbyConf,\n    CloudConf? colorFilterConf,\n    CloudConf? lossLessConf,\n  }) {\n    final result = create();\n    if (backgroundPlayConf != null)\n      result.backgroundPlayConf = backgroundPlayConf;\n    if (flipConf != null) result.flipConf = flipConf;\n    if (castConf != null) result.castConf = castConf;\n    if (feedbackConf != null) result.feedbackConf = feedbackConf;\n    if (subtitleConf != null) result.subtitleConf = subtitleConf;\n    if (playbackRateConf != null) result.playbackRateConf = playbackRateConf;\n    if (timeUpConf != null) result.timeUpConf = timeUpConf;\n    if (playbackModeConf != null) result.playbackModeConf = playbackModeConf;\n    if (scaleModeConf != null) result.scaleModeConf = scaleModeConf;\n    if (likeConf != null) result.likeConf = likeConf;\n    if (dislikeConf != null) result.dislikeConf = dislikeConf;\n    if (coinConf != null) result.coinConf = coinConf;\n    if (elecConf != null) result.elecConf = elecConf;\n    if (shareConf != null) result.shareConf = shareConf;\n    if (screenShotConf != null) result.screenShotConf = screenShotConf;\n    if (lockScreenConf != null) result.lockScreenConf = lockScreenConf;\n    if (recommendConf != null) result.recommendConf = recommendConf;\n    if (playbackSpeedConf != null) result.playbackSpeedConf = playbackSpeedConf;\n    if (definitionConf != null) result.definitionConf = definitionConf;\n    if (selectionsConf != null) result.selectionsConf = selectionsConf;\n    if (nextConf != null) result.nextConf = nextConf;\n    if (editDmConf != null) result.editDmConf = editDmConf;\n    if (smallWindowConf != null) result.smallWindowConf = smallWindowConf;\n    if (shakeConf != null) result.shakeConf = shakeConf;\n    if (outerDmConf != null) result.outerDmConf = outerDmConf;\n    if (innerDmConf != null) result.innerDmConf = innerDmConf;\n    if (panoramaConf != null) result.panoramaConf = panoramaConf;\n    if (dolbyConf != null) result.dolbyConf = dolbyConf;\n    if (colorFilterConf != null) result.colorFilterConf = colorFilterConf;\n    if (lossLessConf != null) result.lossLessConf = lossLessConf;\n    return result;\n  }\n\n  PlayAbilityConf._();\n\n  factory PlayAbilityConf.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayAbilityConf.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayAbilityConf',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aOM<CloudConf>(1, _omitFieldNames ? '' : 'backgroundPlayConf',\n        subBuilder: CloudConf.create)\n    ..aOM<CloudConf>(2, _omitFieldNames ? '' : 'flipConf',\n        subBuilder: CloudConf.create)\n    ..aOM<CloudConf>(3, _omitFieldNames ? '' : 'castConf',\n        subBuilder: CloudConf.create)\n    ..aOM<CloudConf>(4, _omitFieldNames ? '' : 'feedbackConf',\n        subBuilder: CloudConf.create)\n    ..aOM<CloudConf>(5, _omitFieldNames ? '' : 'subtitleConf',\n        subBuilder: CloudConf.create)\n    ..aOM<CloudConf>(6, _omitFieldNames ? '' : 'playbackRateConf',\n        subBuilder: CloudConf.create)\n    ..aOM<CloudConf>(7, _omitFieldNames ? '' : 'timeUpConf',\n        subBuilder: CloudConf.create)\n    ..aOM<CloudConf>(8, _omitFieldNames ? '' : 'playbackModeConf',\n        subBuilder: CloudConf.create)\n    ..aOM<CloudConf>(9, _omitFieldNames ? '' : 'scaleModeConf',\n        subBuilder: CloudConf.create)\n    ..aOM<CloudConf>(10, _omitFieldNames ? '' : 'likeConf',\n        subBuilder: CloudConf.create)\n    ..aOM<CloudConf>(11, _omitFieldNames ? '' : 'dislikeConf',\n        subBuilder: CloudConf.create)\n    ..aOM<CloudConf>(12, _omitFieldNames ? '' : 'coinConf',\n        subBuilder: CloudConf.create)\n    ..aOM<CloudConf>(13, _omitFieldNames ? '' : 'elecConf',\n        subBuilder: CloudConf.create)\n    ..aOM<CloudConf>(14, _omitFieldNames ? '' : 'shareConf',\n        subBuilder: CloudConf.create)\n    ..aOM<CloudConf>(15, _omitFieldNames ? '' : 'screenShotConf',\n        subBuilder: CloudConf.create)\n    ..aOM<CloudConf>(16, _omitFieldNames ? '' : 'lockScreenConf',\n        subBuilder: CloudConf.create)\n    ..aOM<CloudConf>(17, _omitFieldNames ? '' : 'recommendConf',\n        subBuilder: CloudConf.create)\n    ..aOM<CloudConf>(18, _omitFieldNames ? '' : 'playbackSpeedConf',\n        subBuilder: CloudConf.create)\n    ..aOM<CloudConf>(19, _omitFieldNames ? '' : 'definitionConf',\n        subBuilder: CloudConf.create)\n    ..aOM<CloudConf>(20, _omitFieldNames ? '' : 'selectionsConf',\n        subBuilder: CloudConf.create)\n    ..aOM<CloudConf>(21, _omitFieldNames ? '' : 'nextConf',\n        subBuilder: CloudConf.create)\n    ..aOM<CloudConf>(22, _omitFieldNames ? '' : 'editDmConf',\n        subBuilder: CloudConf.create)\n    ..aOM<CloudConf>(23, _omitFieldNames ? '' : 'smallWindowConf',\n        subBuilder: CloudConf.create)\n    ..aOM<CloudConf>(24, _omitFieldNames ? '' : 'shakeConf',\n        subBuilder: CloudConf.create)\n    ..aOM<CloudConf>(25, _omitFieldNames ? '' : 'outerDmConf',\n        subBuilder: CloudConf.create)\n    ..aOM<CloudConf>(26, _omitFieldNames ? '' : 'innerDmConf',\n        subBuilder: CloudConf.create)\n    ..aOM<CloudConf>(27, _omitFieldNames ? '' : 'panoramaConf',\n        subBuilder: CloudConf.create)\n    ..aOM<CloudConf>(28, _omitFieldNames ? '' : 'dolbyConf',\n        subBuilder: CloudConf.create)\n    ..aOM<CloudConf>(29, _omitFieldNames ? '' : 'colorFilterConf',\n        subBuilder: CloudConf.create)\n    ..aOM<CloudConf>(30, _omitFieldNames ? '' : 'lossLessConf',\n        subBuilder: CloudConf.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayAbilityConf clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayAbilityConf copyWith(void Function(PlayAbilityConf) updates) =>\n      super.copyWith((message) => updates(message as PlayAbilityConf))\n          as PlayAbilityConf;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayAbilityConf create() => PlayAbilityConf._();\n  @$core.override\n  PlayAbilityConf createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayAbilityConf getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayAbilityConf>(create);\n  static PlayAbilityConf? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  CloudConf get backgroundPlayConf => $_getN(0);\n  @$pb.TagNumber(1)\n  set backgroundPlayConf(CloudConf value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBackgroundPlayConf() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBackgroundPlayConf() => $_clearField(1);\n  @$pb.TagNumber(1)\n  CloudConf ensureBackgroundPlayConf() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  CloudConf get flipConf => $_getN(1);\n  @$pb.TagNumber(2)\n  set flipConf(CloudConf value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFlipConf() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFlipConf() => $_clearField(2);\n  @$pb.TagNumber(2)\n  CloudConf ensureFlipConf() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  CloudConf get castConf => $_getN(2);\n  @$pb.TagNumber(3)\n  set castConf(CloudConf value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCastConf() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCastConf() => $_clearField(3);\n  @$pb.TagNumber(3)\n  CloudConf ensureCastConf() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  CloudConf get feedbackConf => $_getN(3);\n  @$pb.TagNumber(4)\n  set feedbackConf(CloudConf value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFeedbackConf() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFeedbackConf() => $_clearField(4);\n  @$pb.TagNumber(4)\n  CloudConf ensureFeedbackConf() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  CloudConf get subtitleConf => $_getN(4);\n  @$pb.TagNumber(5)\n  set subtitleConf(CloudConf value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasSubtitleConf() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearSubtitleConf() => $_clearField(5);\n  @$pb.TagNumber(5)\n  CloudConf ensureSubtitleConf() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  CloudConf get playbackRateConf => $_getN(5);\n  @$pb.TagNumber(6)\n  set playbackRateConf(CloudConf value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasPlaybackRateConf() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearPlaybackRateConf() => $_clearField(6);\n  @$pb.TagNumber(6)\n  CloudConf ensurePlaybackRateConf() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  CloudConf get timeUpConf => $_getN(6);\n  @$pb.TagNumber(7)\n  set timeUpConf(CloudConf value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasTimeUpConf() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearTimeUpConf() => $_clearField(7);\n  @$pb.TagNumber(7)\n  CloudConf ensureTimeUpConf() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  CloudConf get playbackModeConf => $_getN(7);\n  @$pb.TagNumber(8)\n  set playbackModeConf(CloudConf value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasPlaybackModeConf() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearPlaybackModeConf() => $_clearField(8);\n  @$pb.TagNumber(8)\n  CloudConf ensurePlaybackModeConf() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  CloudConf get scaleModeConf => $_getN(8);\n  @$pb.TagNumber(9)\n  set scaleModeConf(CloudConf value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasScaleModeConf() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearScaleModeConf() => $_clearField(9);\n  @$pb.TagNumber(9)\n  CloudConf ensureScaleModeConf() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  CloudConf get likeConf => $_getN(9);\n  @$pb.TagNumber(10)\n  set likeConf(CloudConf value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasLikeConf() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearLikeConf() => $_clearField(10);\n  @$pb.TagNumber(10)\n  CloudConf ensureLikeConf() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  CloudConf get dislikeConf => $_getN(10);\n  @$pb.TagNumber(11)\n  set dislikeConf(CloudConf value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasDislikeConf() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearDislikeConf() => $_clearField(11);\n  @$pb.TagNumber(11)\n  CloudConf ensureDislikeConf() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  CloudConf get coinConf => $_getN(11);\n  @$pb.TagNumber(12)\n  set coinConf(CloudConf value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasCoinConf() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearCoinConf() => $_clearField(12);\n  @$pb.TagNumber(12)\n  CloudConf ensureCoinConf() => $_ensure(11);\n\n  @$pb.TagNumber(13)\n  CloudConf get elecConf => $_getN(12);\n  @$pb.TagNumber(13)\n  set elecConf(CloudConf value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasElecConf() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearElecConf() => $_clearField(13);\n  @$pb.TagNumber(13)\n  CloudConf ensureElecConf() => $_ensure(12);\n\n  @$pb.TagNumber(14)\n  CloudConf get shareConf => $_getN(13);\n  @$pb.TagNumber(14)\n  set shareConf(CloudConf value) => $_setField(14, value);\n  @$pb.TagNumber(14)\n  $core.bool hasShareConf() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearShareConf() => $_clearField(14);\n  @$pb.TagNumber(14)\n  CloudConf ensureShareConf() => $_ensure(13);\n\n  @$pb.TagNumber(15)\n  CloudConf get screenShotConf => $_getN(14);\n  @$pb.TagNumber(15)\n  set screenShotConf(CloudConf value) => $_setField(15, value);\n  @$pb.TagNumber(15)\n  $core.bool hasScreenShotConf() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearScreenShotConf() => $_clearField(15);\n  @$pb.TagNumber(15)\n  CloudConf ensureScreenShotConf() => $_ensure(14);\n\n  @$pb.TagNumber(16)\n  CloudConf get lockScreenConf => $_getN(15);\n  @$pb.TagNumber(16)\n  set lockScreenConf(CloudConf value) => $_setField(16, value);\n  @$pb.TagNumber(16)\n  $core.bool hasLockScreenConf() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearLockScreenConf() => $_clearField(16);\n  @$pb.TagNumber(16)\n  CloudConf ensureLockScreenConf() => $_ensure(15);\n\n  @$pb.TagNumber(17)\n  CloudConf get recommendConf => $_getN(16);\n  @$pb.TagNumber(17)\n  set recommendConf(CloudConf value) => $_setField(17, value);\n  @$pb.TagNumber(17)\n  $core.bool hasRecommendConf() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearRecommendConf() => $_clearField(17);\n  @$pb.TagNumber(17)\n  CloudConf ensureRecommendConf() => $_ensure(16);\n\n  @$pb.TagNumber(18)\n  CloudConf get playbackSpeedConf => $_getN(17);\n  @$pb.TagNumber(18)\n  set playbackSpeedConf(CloudConf value) => $_setField(18, value);\n  @$pb.TagNumber(18)\n  $core.bool hasPlaybackSpeedConf() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearPlaybackSpeedConf() => $_clearField(18);\n  @$pb.TagNumber(18)\n  CloudConf ensurePlaybackSpeedConf() => $_ensure(17);\n\n  @$pb.TagNumber(19)\n  CloudConf get definitionConf => $_getN(18);\n  @$pb.TagNumber(19)\n  set definitionConf(CloudConf value) => $_setField(19, value);\n  @$pb.TagNumber(19)\n  $core.bool hasDefinitionConf() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearDefinitionConf() => $_clearField(19);\n  @$pb.TagNumber(19)\n  CloudConf ensureDefinitionConf() => $_ensure(18);\n\n  @$pb.TagNumber(20)\n  CloudConf get selectionsConf => $_getN(19);\n  @$pb.TagNumber(20)\n  set selectionsConf(CloudConf value) => $_setField(20, value);\n  @$pb.TagNumber(20)\n  $core.bool hasSelectionsConf() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearSelectionsConf() => $_clearField(20);\n  @$pb.TagNumber(20)\n  CloudConf ensureSelectionsConf() => $_ensure(19);\n\n  @$pb.TagNumber(21)\n  CloudConf get nextConf => $_getN(20);\n  @$pb.TagNumber(21)\n  set nextConf(CloudConf value) => $_setField(21, value);\n  @$pb.TagNumber(21)\n  $core.bool hasNextConf() => $_has(20);\n  @$pb.TagNumber(21)\n  void clearNextConf() => $_clearField(21);\n  @$pb.TagNumber(21)\n  CloudConf ensureNextConf() => $_ensure(20);\n\n  @$pb.TagNumber(22)\n  CloudConf get editDmConf => $_getN(21);\n  @$pb.TagNumber(22)\n  set editDmConf(CloudConf value) => $_setField(22, value);\n  @$pb.TagNumber(22)\n  $core.bool hasEditDmConf() => $_has(21);\n  @$pb.TagNumber(22)\n  void clearEditDmConf() => $_clearField(22);\n  @$pb.TagNumber(22)\n  CloudConf ensureEditDmConf() => $_ensure(21);\n\n  @$pb.TagNumber(23)\n  CloudConf get smallWindowConf => $_getN(22);\n  @$pb.TagNumber(23)\n  set smallWindowConf(CloudConf value) => $_setField(23, value);\n  @$pb.TagNumber(23)\n  $core.bool hasSmallWindowConf() => $_has(22);\n  @$pb.TagNumber(23)\n  void clearSmallWindowConf() => $_clearField(23);\n  @$pb.TagNumber(23)\n  CloudConf ensureSmallWindowConf() => $_ensure(22);\n\n  @$pb.TagNumber(24)\n  CloudConf get shakeConf => $_getN(23);\n  @$pb.TagNumber(24)\n  set shakeConf(CloudConf value) => $_setField(24, value);\n  @$pb.TagNumber(24)\n  $core.bool hasShakeConf() => $_has(23);\n  @$pb.TagNumber(24)\n  void clearShakeConf() => $_clearField(24);\n  @$pb.TagNumber(24)\n  CloudConf ensureShakeConf() => $_ensure(23);\n\n  @$pb.TagNumber(25)\n  CloudConf get outerDmConf => $_getN(24);\n  @$pb.TagNumber(25)\n  set outerDmConf(CloudConf value) => $_setField(25, value);\n  @$pb.TagNumber(25)\n  $core.bool hasOuterDmConf() => $_has(24);\n  @$pb.TagNumber(25)\n  void clearOuterDmConf() => $_clearField(25);\n  @$pb.TagNumber(25)\n  CloudConf ensureOuterDmConf() => $_ensure(24);\n\n  @$pb.TagNumber(26)\n  CloudConf get innerDmConf => $_getN(25);\n  @$pb.TagNumber(26)\n  set innerDmConf(CloudConf value) => $_setField(26, value);\n  @$pb.TagNumber(26)\n  $core.bool hasInnerDmConf() => $_has(25);\n  @$pb.TagNumber(26)\n  void clearInnerDmConf() => $_clearField(26);\n  @$pb.TagNumber(26)\n  CloudConf ensureInnerDmConf() => $_ensure(25);\n\n  @$pb.TagNumber(27)\n  CloudConf get panoramaConf => $_getN(26);\n  @$pb.TagNumber(27)\n  set panoramaConf(CloudConf value) => $_setField(27, value);\n  @$pb.TagNumber(27)\n  $core.bool hasPanoramaConf() => $_has(26);\n  @$pb.TagNumber(27)\n  void clearPanoramaConf() => $_clearField(27);\n  @$pb.TagNumber(27)\n  CloudConf ensurePanoramaConf() => $_ensure(26);\n\n  @$pb.TagNumber(28)\n  CloudConf get dolbyConf => $_getN(27);\n  @$pb.TagNumber(28)\n  set dolbyConf(CloudConf value) => $_setField(28, value);\n  @$pb.TagNumber(28)\n  $core.bool hasDolbyConf() => $_has(27);\n  @$pb.TagNumber(28)\n  void clearDolbyConf() => $_clearField(28);\n  @$pb.TagNumber(28)\n  CloudConf ensureDolbyConf() => $_ensure(27);\n\n  @$pb.TagNumber(29)\n  CloudConf get colorFilterConf => $_getN(28);\n  @$pb.TagNumber(29)\n  set colorFilterConf(CloudConf value) => $_setField(29, value);\n  @$pb.TagNumber(29)\n  $core.bool hasColorFilterConf() => $_has(28);\n  @$pb.TagNumber(29)\n  void clearColorFilterConf() => $_clearField(29);\n  @$pb.TagNumber(29)\n  CloudConf ensureColorFilterConf() => $_ensure(28);\n\n  @$pb.TagNumber(30)\n  CloudConf get lossLessConf => $_getN(29);\n  @$pb.TagNumber(30)\n  set lossLessConf(CloudConf value) => $_setField(30, value);\n  @$pb.TagNumber(30)\n  $core.bool hasLossLessConf() => $_has(29);\n  @$pb.TagNumber(30)\n  void clearLossLessConf() => $_clearField(30);\n  @$pb.TagNumber(30)\n  CloudConf ensureLossLessConf() => $_ensure(29);\n}\n\nclass PlayArc extends $pb.GeneratedMessage {\n  factory PlayArc({\n    $core.bool? isPreview,\n  }) {\n    final result = create();\n    if (isPreview != null) result.isPreview = isPreview;\n    return result;\n  }\n\n  PlayArc._();\n\n  factory PlayArc.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayArc.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayArc',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'isPreview')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayArc clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayArc copyWith(void Function(PlayArc) updates) =>\n      super.copyWith((message) => updates(message as PlayArc)) as PlayArc;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayArc create() => PlayArc._();\n  @$core.override\n  PlayArc createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayArc getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PlayArc>(create);\n  static PlayArc? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get isPreview => $_getBF(0);\n  @$pb.TagNumber(1)\n  set isPreview($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIsPreview() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIsPreview() => $_clearField(1);\n}\n\nclass PlayArcConf extends $pb.GeneratedMessage {\n  factory PlayArcConf({\n    ArcConf? backgroundPlayConf,\n    ArcConf? flipConf,\n    ArcConf? castConf,\n    ArcConf? feedbackConf,\n    ArcConf? subtitleConf,\n    ArcConf? playbackRateConf,\n    ArcConf? timeUpConf,\n    ArcConf? playbackModeConf,\n    ArcConf? scaleModeConf,\n    ArcConf? likeConf,\n    ArcConf? dislikeConf,\n    ArcConf? coinConf,\n    ArcConf? elecConf,\n    ArcConf? shareConf,\n    ArcConf? screenShotConf,\n    ArcConf? lockScreenConf,\n    ArcConf? recommendConf,\n    ArcConf? playbackSpeedConf,\n    ArcConf? definitionConf,\n    ArcConf? selectionsConf,\n    ArcConf? nextConf,\n    ArcConf? editDmConf,\n    ArcConf? smallWindowConf,\n    ArcConf? shakeConf,\n    ArcConf? outerDmConf,\n    ArcConf? innerDmConf,\n    ArcConf? panoramaConf,\n    ArcConf? dolbyConf,\n    ArcConf? screenRecordingConf,\n    ArcConf? colorFilterConf,\n    ArcConf? lossLessConf,\n    ArcConf? systemRecordConf,\n  }) {\n    final result = create();\n    if (backgroundPlayConf != null)\n      result.backgroundPlayConf = backgroundPlayConf;\n    if (flipConf != null) result.flipConf = flipConf;\n    if (castConf != null) result.castConf = castConf;\n    if (feedbackConf != null) result.feedbackConf = feedbackConf;\n    if (subtitleConf != null) result.subtitleConf = subtitleConf;\n    if (playbackRateConf != null) result.playbackRateConf = playbackRateConf;\n    if (timeUpConf != null) result.timeUpConf = timeUpConf;\n    if (playbackModeConf != null) result.playbackModeConf = playbackModeConf;\n    if (scaleModeConf != null) result.scaleModeConf = scaleModeConf;\n    if (likeConf != null) result.likeConf = likeConf;\n    if (dislikeConf != null) result.dislikeConf = dislikeConf;\n    if (coinConf != null) result.coinConf = coinConf;\n    if (elecConf != null) result.elecConf = elecConf;\n    if (shareConf != null) result.shareConf = shareConf;\n    if (screenShotConf != null) result.screenShotConf = screenShotConf;\n    if (lockScreenConf != null) result.lockScreenConf = lockScreenConf;\n    if (recommendConf != null) result.recommendConf = recommendConf;\n    if (playbackSpeedConf != null) result.playbackSpeedConf = playbackSpeedConf;\n    if (definitionConf != null) result.definitionConf = definitionConf;\n    if (selectionsConf != null) result.selectionsConf = selectionsConf;\n    if (nextConf != null) result.nextConf = nextConf;\n    if (editDmConf != null) result.editDmConf = editDmConf;\n    if (smallWindowConf != null) result.smallWindowConf = smallWindowConf;\n    if (shakeConf != null) result.shakeConf = shakeConf;\n    if (outerDmConf != null) result.outerDmConf = outerDmConf;\n    if (innerDmConf != null) result.innerDmConf = innerDmConf;\n    if (panoramaConf != null) result.panoramaConf = panoramaConf;\n    if (dolbyConf != null) result.dolbyConf = dolbyConf;\n    if (screenRecordingConf != null)\n      result.screenRecordingConf = screenRecordingConf;\n    if (colorFilterConf != null) result.colorFilterConf = colorFilterConf;\n    if (lossLessConf != null) result.lossLessConf = lossLessConf;\n    if (systemRecordConf != null) result.systemRecordConf = systemRecordConf;\n    return result;\n  }\n\n  PlayArcConf._();\n\n  factory PlayArcConf.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayArcConf.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayArcConf',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aOM<ArcConf>(1, _omitFieldNames ? '' : 'backgroundPlayConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(2, _omitFieldNames ? '' : 'flipConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(3, _omitFieldNames ? '' : 'castConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(4, _omitFieldNames ? '' : 'feedbackConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(5, _omitFieldNames ? '' : 'subtitleConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(6, _omitFieldNames ? '' : 'playbackRateConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(7, _omitFieldNames ? '' : 'timeUpConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(8, _omitFieldNames ? '' : 'playbackModeConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(9, _omitFieldNames ? '' : 'scaleModeConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(10, _omitFieldNames ? '' : 'likeConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(11, _omitFieldNames ? '' : 'dislikeConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(12, _omitFieldNames ? '' : 'coinConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(13, _omitFieldNames ? '' : 'elecConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(14, _omitFieldNames ? '' : 'shareConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(15, _omitFieldNames ? '' : 'screenShotConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(16, _omitFieldNames ? '' : 'lockScreenConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(17, _omitFieldNames ? '' : 'recommendConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(18, _omitFieldNames ? '' : 'playbackSpeedConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(19, _omitFieldNames ? '' : 'definitionConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(20, _omitFieldNames ? '' : 'selectionsConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(21, _omitFieldNames ? '' : 'nextConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(22, _omitFieldNames ? '' : 'editDmConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(23, _omitFieldNames ? '' : 'smallWindowConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(24, _omitFieldNames ? '' : 'shakeConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(25, _omitFieldNames ? '' : 'outerDmConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(26, _omitFieldNames ? '' : 'innerDmConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(27, _omitFieldNames ? '' : 'panoramaConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(28, _omitFieldNames ? '' : 'dolbyConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(29, _omitFieldNames ? '' : 'screenRecordingConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(30, _omitFieldNames ? '' : 'colorFilterConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(31, _omitFieldNames ? '' : 'lossLessConf',\n        subBuilder: ArcConf.create)\n    ..aOM<ArcConf>(32, _omitFieldNames ? '' : 'systemRecordConf',\n        subBuilder: ArcConf.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayArcConf clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayArcConf copyWith(void Function(PlayArcConf) updates) =>\n      super.copyWith((message) => updates(message as PlayArcConf))\n          as PlayArcConf;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayArcConf create() => PlayArcConf._();\n  @$core.override\n  PlayArcConf createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayArcConf getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayArcConf>(create);\n  static PlayArcConf? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  ArcConf get backgroundPlayConf => $_getN(0);\n  @$pb.TagNumber(1)\n  set backgroundPlayConf(ArcConf value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBackgroundPlayConf() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBackgroundPlayConf() => $_clearField(1);\n  @$pb.TagNumber(1)\n  ArcConf ensureBackgroundPlayConf() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  ArcConf get flipConf => $_getN(1);\n  @$pb.TagNumber(2)\n  set flipConf(ArcConf value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFlipConf() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFlipConf() => $_clearField(2);\n  @$pb.TagNumber(2)\n  ArcConf ensureFlipConf() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  ArcConf get castConf => $_getN(2);\n  @$pb.TagNumber(3)\n  set castConf(ArcConf value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCastConf() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCastConf() => $_clearField(3);\n  @$pb.TagNumber(3)\n  ArcConf ensureCastConf() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  ArcConf get feedbackConf => $_getN(3);\n  @$pb.TagNumber(4)\n  set feedbackConf(ArcConf value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFeedbackConf() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFeedbackConf() => $_clearField(4);\n  @$pb.TagNumber(4)\n  ArcConf ensureFeedbackConf() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  ArcConf get subtitleConf => $_getN(4);\n  @$pb.TagNumber(5)\n  set subtitleConf(ArcConf value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasSubtitleConf() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearSubtitleConf() => $_clearField(5);\n  @$pb.TagNumber(5)\n  ArcConf ensureSubtitleConf() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  ArcConf get playbackRateConf => $_getN(5);\n  @$pb.TagNumber(6)\n  set playbackRateConf(ArcConf value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasPlaybackRateConf() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearPlaybackRateConf() => $_clearField(6);\n  @$pb.TagNumber(6)\n  ArcConf ensurePlaybackRateConf() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  ArcConf get timeUpConf => $_getN(6);\n  @$pb.TagNumber(7)\n  set timeUpConf(ArcConf value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasTimeUpConf() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearTimeUpConf() => $_clearField(7);\n  @$pb.TagNumber(7)\n  ArcConf ensureTimeUpConf() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  ArcConf get playbackModeConf => $_getN(7);\n  @$pb.TagNumber(8)\n  set playbackModeConf(ArcConf value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasPlaybackModeConf() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearPlaybackModeConf() => $_clearField(8);\n  @$pb.TagNumber(8)\n  ArcConf ensurePlaybackModeConf() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  ArcConf get scaleModeConf => $_getN(8);\n  @$pb.TagNumber(9)\n  set scaleModeConf(ArcConf value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasScaleModeConf() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearScaleModeConf() => $_clearField(9);\n  @$pb.TagNumber(9)\n  ArcConf ensureScaleModeConf() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  ArcConf get likeConf => $_getN(9);\n  @$pb.TagNumber(10)\n  set likeConf(ArcConf value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasLikeConf() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearLikeConf() => $_clearField(10);\n  @$pb.TagNumber(10)\n  ArcConf ensureLikeConf() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  ArcConf get dislikeConf => $_getN(10);\n  @$pb.TagNumber(11)\n  set dislikeConf(ArcConf value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasDislikeConf() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearDislikeConf() => $_clearField(11);\n  @$pb.TagNumber(11)\n  ArcConf ensureDislikeConf() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  ArcConf get coinConf => $_getN(11);\n  @$pb.TagNumber(12)\n  set coinConf(ArcConf value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasCoinConf() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearCoinConf() => $_clearField(12);\n  @$pb.TagNumber(12)\n  ArcConf ensureCoinConf() => $_ensure(11);\n\n  @$pb.TagNumber(13)\n  ArcConf get elecConf => $_getN(12);\n  @$pb.TagNumber(13)\n  set elecConf(ArcConf value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasElecConf() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearElecConf() => $_clearField(13);\n  @$pb.TagNumber(13)\n  ArcConf ensureElecConf() => $_ensure(12);\n\n  @$pb.TagNumber(14)\n  ArcConf get shareConf => $_getN(13);\n  @$pb.TagNumber(14)\n  set shareConf(ArcConf value) => $_setField(14, value);\n  @$pb.TagNumber(14)\n  $core.bool hasShareConf() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearShareConf() => $_clearField(14);\n  @$pb.TagNumber(14)\n  ArcConf ensureShareConf() => $_ensure(13);\n\n  @$pb.TagNumber(15)\n  ArcConf get screenShotConf => $_getN(14);\n  @$pb.TagNumber(15)\n  set screenShotConf(ArcConf value) => $_setField(15, value);\n  @$pb.TagNumber(15)\n  $core.bool hasScreenShotConf() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearScreenShotConf() => $_clearField(15);\n  @$pb.TagNumber(15)\n  ArcConf ensureScreenShotConf() => $_ensure(14);\n\n  @$pb.TagNumber(16)\n  ArcConf get lockScreenConf => $_getN(15);\n  @$pb.TagNumber(16)\n  set lockScreenConf(ArcConf value) => $_setField(16, value);\n  @$pb.TagNumber(16)\n  $core.bool hasLockScreenConf() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearLockScreenConf() => $_clearField(16);\n  @$pb.TagNumber(16)\n  ArcConf ensureLockScreenConf() => $_ensure(15);\n\n  @$pb.TagNumber(17)\n  ArcConf get recommendConf => $_getN(16);\n  @$pb.TagNumber(17)\n  set recommendConf(ArcConf value) => $_setField(17, value);\n  @$pb.TagNumber(17)\n  $core.bool hasRecommendConf() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearRecommendConf() => $_clearField(17);\n  @$pb.TagNumber(17)\n  ArcConf ensureRecommendConf() => $_ensure(16);\n\n  @$pb.TagNumber(18)\n  ArcConf get playbackSpeedConf => $_getN(17);\n  @$pb.TagNumber(18)\n  set playbackSpeedConf(ArcConf value) => $_setField(18, value);\n  @$pb.TagNumber(18)\n  $core.bool hasPlaybackSpeedConf() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearPlaybackSpeedConf() => $_clearField(18);\n  @$pb.TagNumber(18)\n  ArcConf ensurePlaybackSpeedConf() => $_ensure(17);\n\n  @$pb.TagNumber(19)\n  ArcConf get definitionConf => $_getN(18);\n  @$pb.TagNumber(19)\n  set definitionConf(ArcConf value) => $_setField(19, value);\n  @$pb.TagNumber(19)\n  $core.bool hasDefinitionConf() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearDefinitionConf() => $_clearField(19);\n  @$pb.TagNumber(19)\n  ArcConf ensureDefinitionConf() => $_ensure(18);\n\n  @$pb.TagNumber(20)\n  ArcConf get selectionsConf => $_getN(19);\n  @$pb.TagNumber(20)\n  set selectionsConf(ArcConf value) => $_setField(20, value);\n  @$pb.TagNumber(20)\n  $core.bool hasSelectionsConf() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearSelectionsConf() => $_clearField(20);\n  @$pb.TagNumber(20)\n  ArcConf ensureSelectionsConf() => $_ensure(19);\n\n  @$pb.TagNumber(21)\n  ArcConf get nextConf => $_getN(20);\n  @$pb.TagNumber(21)\n  set nextConf(ArcConf value) => $_setField(21, value);\n  @$pb.TagNumber(21)\n  $core.bool hasNextConf() => $_has(20);\n  @$pb.TagNumber(21)\n  void clearNextConf() => $_clearField(21);\n  @$pb.TagNumber(21)\n  ArcConf ensureNextConf() => $_ensure(20);\n\n  @$pb.TagNumber(22)\n  ArcConf get editDmConf => $_getN(21);\n  @$pb.TagNumber(22)\n  set editDmConf(ArcConf value) => $_setField(22, value);\n  @$pb.TagNumber(22)\n  $core.bool hasEditDmConf() => $_has(21);\n  @$pb.TagNumber(22)\n  void clearEditDmConf() => $_clearField(22);\n  @$pb.TagNumber(22)\n  ArcConf ensureEditDmConf() => $_ensure(21);\n\n  @$pb.TagNumber(23)\n  ArcConf get smallWindowConf => $_getN(22);\n  @$pb.TagNumber(23)\n  set smallWindowConf(ArcConf value) => $_setField(23, value);\n  @$pb.TagNumber(23)\n  $core.bool hasSmallWindowConf() => $_has(22);\n  @$pb.TagNumber(23)\n  void clearSmallWindowConf() => $_clearField(23);\n  @$pb.TagNumber(23)\n  ArcConf ensureSmallWindowConf() => $_ensure(22);\n\n  @$pb.TagNumber(24)\n  ArcConf get shakeConf => $_getN(23);\n  @$pb.TagNumber(24)\n  set shakeConf(ArcConf value) => $_setField(24, value);\n  @$pb.TagNumber(24)\n  $core.bool hasShakeConf() => $_has(23);\n  @$pb.TagNumber(24)\n  void clearShakeConf() => $_clearField(24);\n  @$pb.TagNumber(24)\n  ArcConf ensureShakeConf() => $_ensure(23);\n\n  @$pb.TagNumber(25)\n  ArcConf get outerDmConf => $_getN(24);\n  @$pb.TagNumber(25)\n  set outerDmConf(ArcConf value) => $_setField(25, value);\n  @$pb.TagNumber(25)\n  $core.bool hasOuterDmConf() => $_has(24);\n  @$pb.TagNumber(25)\n  void clearOuterDmConf() => $_clearField(25);\n  @$pb.TagNumber(25)\n  ArcConf ensureOuterDmConf() => $_ensure(24);\n\n  @$pb.TagNumber(26)\n  ArcConf get innerDmConf => $_getN(25);\n  @$pb.TagNumber(26)\n  set innerDmConf(ArcConf value) => $_setField(26, value);\n  @$pb.TagNumber(26)\n  $core.bool hasInnerDmConf() => $_has(25);\n  @$pb.TagNumber(26)\n  void clearInnerDmConf() => $_clearField(26);\n  @$pb.TagNumber(26)\n  ArcConf ensureInnerDmConf() => $_ensure(25);\n\n  @$pb.TagNumber(27)\n  ArcConf get panoramaConf => $_getN(26);\n  @$pb.TagNumber(27)\n  set panoramaConf(ArcConf value) => $_setField(27, value);\n  @$pb.TagNumber(27)\n  $core.bool hasPanoramaConf() => $_has(26);\n  @$pb.TagNumber(27)\n  void clearPanoramaConf() => $_clearField(27);\n  @$pb.TagNumber(27)\n  ArcConf ensurePanoramaConf() => $_ensure(26);\n\n  @$pb.TagNumber(28)\n  ArcConf get dolbyConf => $_getN(27);\n  @$pb.TagNumber(28)\n  set dolbyConf(ArcConf value) => $_setField(28, value);\n  @$pb.TagNumber(28)\n  $core.bool hasDolbyConf() => $_has(27);\n  @$pb.TagNumber(28)\n  void clearDolbyConf() => $_clearField(28);\n  @$pb.TagNumber(28)\n  ArcConf ensureDolbyConf() => $_ensure(27);\n\n  @$pb.TagNumber(29)\n  ArcConf get screenRecordingConf => $_getN(28);\n  @$pb.TagNumber(29)\n  set screenRecordingConf(ArcConf value) => $_setField(29, value);\n  @$pb.TagNumber(29)\n  $core.bool hasScreenRecordingConf() => $_has(28);\n  @$pb.TagNumber(29)\n  void clearScreenRecordingConf() => $_clearField(29);\n  @$pb.TagNumber(29)\n  ArcConf ensureScreenRecordingConf() => $_ensure(28);\n\n  @$pb.TagNumber(30)\n  ArcConf get colorFilterConf => $_getN(29);\n  @$pb.TagNumber(30)\n  set colorFilterConf(ArcConf value) => $_setField(30, value);\n  @$pb.TagNumber(30)\n  $core.bool hasColorFilterConf() => $_has(29);\n  @$pb.TagNumber(30)\n  void clearColorFilterConf() => $_clearField(30);\n  @$pb.TagNumber(30)\n  ArcConf ensureColorFilterConf() => $_ensure(29);\n\n  @$pb.TagNumber(31)\n  ArcConf get lossLessConf => $_getN(30);\n  @$pb.TagNumber(31)\n  set lossLessConf(ArcConf value) => $_setField(31, value);\n  @$pb.TagNumber(31)\n  $core.bool hasLossLessConf() => $_has(30);\n  @$pb.TagNumber(31)\n  void clearLossLessConf() => $_clearField(31);\n  @$pb.TagNumber(31)\n  ArcConf ensureLossLessConf() => $_ensure(30);\n\n  @$pb.TagNumber(32)\n  ArcConf get systemRecordConf => $_getN(31);\n  @$pb.TagNumber(32)\n  set systemRecordConf(ArcConf value) => $_setField(32, value);\n  @$pb.TagNumber(32)\n  $core.bool hasSystemRecordConf() => $_has(31);\n  @$pb.TagNumber(32)\n  void clearSystemRecordConf() => $_clearField(32);\n  @$pb.TagNumber(32)\n  ArcConf ensureSystemRecordConf() => $_ensure(31);\n}\n\nclass PlayConfEditReply extends $pb.GeneratedMessage {\n  factory PlayConfEditReply() => create();\n\n  PlayConfEditReply._();\n\n  factory PlayConfEditReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayConfEditReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayConfEditReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayConfEditReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayConfEditReply copyWith(void Function(PlayConfEditReply) updates) =>\n      super.copyWith((message) => updates(message as PlayConfEditReply))\n          as PlayConfEditReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayConfEditReply create() => PlayConfEditReply._();\n  @$core.override\n  PlayConfEditReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayConfEditReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayConfEditReply>(create);\n  static PlayConfEditReply? _defaultInstance;\n}\n\nclass PlayConfEditReq extends $pb.GeneratedMessage {\n  factory PlayConfEditReq({\n    $core.Iterable<PlayConfState>? playConf,\n  }) {\n    final result = create();\n    if (playConf != null) result.playConf.addAll(playConf);\n    return result;\n  }\n\n  PlayConfEditReq._();\n\n  factory PlayConfEditReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayConfEditReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayConfEditReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..pPM<PlayConfState>(1, _omitFieldNames ? '' : 'playConf',\n        subBuilder: PlayConfState.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayConfEditReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayConfEditReq copyWith(void Function(PlayConfEditReq) updates) =>\n      super.copyWith((message) => updates(message as PlayConfEditReq))\n          as PlayConfEditReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayConfEditReq create() => PlayConfEditReq._();\n  @$core.override\n  PlayConfEditReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayConfEditReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayConfEditReq>(create);\n  static PlayConfEditReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<PlayConfState> get playConf => $_getList(0);\n}\n\nclass PlayConfReply extends $pb.GeneratedMessage {\n  factory PlayConfReply({\n    PlayAbilityConf? playConf,\n  }) {\n    final result = create();\n    if (playConf != null) result.playConf = playConf;\n    return result;\n  }\n\n  PlayConfReply._();\n\n  factory PlayConfReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayConfReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayConfReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aOM<PlayAbilityConf>(1, _omitFieldNames ? '' : 'playConf',\n        subBuilder: PlayAbilityConf.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayConfReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayConfReply copyWith(void Function(PlayConfReply) updates) =>\n      super.copyWith((message) => updates(message as PlayConfReply))\n          as PlayConfReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayConfReply create() => PlayConfReply._();\n  @$core.override\n  PlayConfReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayConfReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayConfReply>(create);\n  static PlayConfReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PlayAbilityConf get playConf => $_getN(0);\n  @$pb.TagNumber(1)\n  set playConf(PlayAbilityConf value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPlayConf() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPlayConf() => $_clearField(1);\n  @$pb.TagNumber(1)\n  PlayAbilityConf ensurePlayConf() => $_ensure(0);\n}\n\nclass PlayConfReq extends $pb.GeneratedMessage {\n  factory PlayConfReq() => create();\n\n  PlayConfReq._();\n\n  factory PlayConfReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayConfReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayConfReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayConfReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayConfReq copyWith(void Function(PlayConfReq) updates) =>\n      super.copyWith((message) => updates(message as PlayConfReq))\n          as PlayConfReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayConfReq create() => PlayConfReq._();\n  @$core.override\n  PlayConfReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayConfReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayConfReq>(create);\n  static PlayConfReq? _defaultInstance;\n}\n\nclass PlayConfState extends $pb.GeneratedMessage {\n  factory PlayConfState({\n    ConfType? confType,\n    $core.bool? show,\n    FieldValue? fieldValue,\n    ConfValue? confValue,\n  }) {\n    final result = create();\n    if (confType != null) result.confType = confType;\n    if (show != null) result.show = show;\n    if (fieldValue != null) result.fieldValue = fieldValue;\n    if (confValue != null) result.confValue = confValue;\n    return result;\n  }\n\n  PlayConfState._();\n\n  factory PlayConfState.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayConfState.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayConfState',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aE<ConfType>(1, _omitFieldNames ? '' : 'confType',\n        enumValues: ConfType.values)\n    ..aOB(2, _omitFieldNames ? '' : 'show')\n    ..aOM<FieldValue>(3, _omitFieldNames ? '' : 'fieldValue',\n        subBuilder: FieldValue.create)\n    ..aOM<ConfValue>(4, _omitFieldNames ? '' : 'confValue',\n        subBuilder: ConfValue.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayConfState clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayConfState copyWith(void Function(PlayConfState) updates) =>\n      super.copyWith((message) => updates(message as PlayConfState))\n          as PlayConfState;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayConfState create() => PlayConfState._();\n  @$core.override\n  PlayConfState createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayConfState getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayConfState>(create);\n  static PlayConfState? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  ConfType get confType => $_getN(0);\n  @$pb.TagNumber(1)\n  set confType(ConfType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasConfType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearConfType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get show => $_getBF(1);\n  @$pb.TagNumber(2)\n  set show($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasShow() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearShow() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  FieldValue get fieldValue => $_getN(2);\n  @$pb.TagNumber(3)\n  set fieldValue(FieldValue value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFieldValue() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFieldValue() => $_clearField(3);\n  @$pb.TagNumber(3)\n  FieldValue ensureFieldValue() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  ConfValue get confValue => $_getN(3);\n  @$pb.TagNumber(4)\n  set confValue(ConfValue value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasConfValue() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearConfValue() => $_clearField(4);\n  @$pb.TagNumber(4)\n  ConfValue ensureConfValue() => $_ensure(3);\n}\n\nclass PlayLimit extends $pb.GeneratedMessage {\n  factory PlayLimit({\n    PlayLimitCode? code,\n    $core.String? message,\n    $core.String? subMessage,\n    ButtonStyle? button,\n  }) {\n    final result = create();\n    if (code != null) result.code = code;\n    if (message != null) result.message = message;\n    if (subMessage != null) result.subMessage = subMessage;\n    if (button != null) result.button = button;\n    return result;\n  }\n\n  PlayLimit._();\n\n  factory PlayLimit.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayLimit.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayLimit',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aE<PlayLimitCode>(1, _omitFieldNames ? '' : 'code',\n        enumValues: PlayLimitCode.values)\n    ..aOS(2, _omitFieldNames ? '' : 'message')\n    ..aOS(3, _omitFieldNames ? '' : 'subMessage')\n    ..aOM<ButtonStyle>(4, _omitFieldNames ? '' : 'button',\n        subBuilder: ButtonStyle.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayLimit clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayLimit copyWith(void Function(PlayLimit) updates) =>\n      super.copyWith((message) => updates(message as PlayLimit)) as PlayLimit;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayLimit create() => PlayLimit._();\n  @$core.override\n  PlayLimit createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayLimit getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PlayLimit>(create);\n  static PlayLimit? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PlayLimitCode get code => $_getN(0);\n  @$pb.TagNumber(1)\n  set code(PlayLimitCode value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCode() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCode() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get message => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set message($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMessage() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMessage() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get subMessage => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set subMessage($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSubMessage() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSubMessage() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  ButtonStyle get button => $_getN(3);\n  @$pb.TagNumber(4)\n  set button(ButtonStyle value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasButton() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearButton() => $_clearField(4);\n  @$pb.TagNumber(4)\n  ButtonStyle ensureButton() => $_ensure(3);\n}\n\nclass PlayURLReply extends $pb.GeneratedMessage {\n  factory PlayURLReply({\n    $core.int? quality,\n    $core.String? format,\n    $fixnum.Int64? timelength,\n    $core.int? videoCodecid,\n    $core.int? fnver,\n    $core.int? fnval,\n    $core.bool? videoProject,\n    $core.Iterable<ResponseUrl>? durl,\n    ResponseDash? dash,\n    $core.int? noRexcode,\n    UpgradeLimit? upgradeLimit,\n    $core.Iterable<FormatDescription>? supportFormats,\n    VideoType? type,\n    VipRisk? vipRisk,\n  }) {\n    final result = create();\n    if (quality != null) result.quality = quality;\n    if (format != null) result.format = format;\n    if (timelength != null) result.timelength = timelength;\n    if (videoCodecid != null) result.videoCodecid = videoCodecid;\n    if (fnver != null) result.fnver = fnver;\n    if (fnval != null) result.fnval = fnval;\n    if (videoProject != null) result.videoProject = videoProject;\n    if (durl != null) result.durl.addAll(durl);\n    if (dash != null) result.dash = dash;\n    if (noRexcode != null) result.noRexcode = noRexcode;\n    if (upgradeLimit != null) result.upgradeLimit = upgradeLimit;\n    if (supportFormats != null) result.supportFormats.addAll(supportFormats);\n    if (type != null) result.type = type;\n    if (vipRisk != null) result.vipRisk = vipRisk;\n    return result;\n  }\n\n  PlayURLReply._();\n\n  factory PlayURLReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayURLReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayURLReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'quality')\n    ..aOS(2, _omitFieldNames ? '' : 'format')\n    ..aInt64(3, _omitFieldNames ? '' : 'timelength')\n    ..aI(4, _omitFieldNames ? '' : 'videoCodecid')\n    ..aI(5, _omitFieldNames ? '' : 'fnver')\n    ..aI(6, _omitFieldNames ? '' : 'fnval')\n    ..aOB(7, _omitFieldNames ? '' : 'videoProject')\n    ..pPM<ResponseUrl>(8, _omitFieldNames ? '' : 'durl',\n        subBuilder: ResponseUrl.create)\n    ..aOM<ResponseDash>(9, _omitFieldNames ? '' : 'dash',\n        subBuilder: ResponseDash.create)\n    ..aI(10, _omitFieldNames ? '' : 'noRexcode')\n    ..aOM<UpgradeLimit>(11, _omitFieldNames ? '' : 'upgradeLimit',\n        subBuilder: UpgradeLimit.create)\n    ..pPM<FormatDescription>(12, _omitFieldNames ? '' : 'supportFormats',\n        subBuilder: FormatDescription.create)\n    ..aE<VideoType>(13, _omitFieldNames ? '' : 'type',\n        enumValues: VideoType.values)\n    ..aOM<VipRisk>(14, _omitFieldNames ? '' : 'vipRisk',\n        subBuilder: VipRisk.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayURLReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayURLReply copyWith(void Function(PlayURLReply) updates) =>\n      super.copyWith((message) => updates(message as PlayURLReply))\n          as PlayURLReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayURLReply create() => PlayURLReply._();\n  @$core.override\n  PlayURLReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayURLReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayURLReply>(create);\n  static PlayURLReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get quality => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set quality($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasQuality() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearQuality() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get format => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set format($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFormat() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFormat() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get timelength => $_getI64(2);\n  @$pb.TagNumber(3)\n  set timelength($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTimelength() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTimelength() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get videoCodecid => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set videoCodecid($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasVideoCodecid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearVideoCodecid() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get fnver => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set fnver($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasFnver() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearFnver() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get fnval => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set fnval($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasFnval() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearFnval() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.bool get videoProject => $_getBF(6);\n  @$pb.TagNumber(7)\n  set videoProject($core.bool value) => $_setBool(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasVideoProject() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearVideoProject() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $pb.PbList<ResponseUrl> get durl => $_getList(7);\n\n  @$pb.TagNumber(9)\n  ResponseDash get dash => $_getN(8);\n  @$pb.TagNumber(9)\n  set dash(ResponseDash value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasDash() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearDash() => $_clearField(9);\n  @$pb.TagNumber(9)\n  ResponseDash ensureDash() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  $core.int get noRexcode => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set noRexcode($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasNoRexcode() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearNoRexcode() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  UpgradeLimit get upgradeLimit => $_getN(10);\n  @$pb.TagNumber(11)\n  set upgradeLimit(UpgradeLimit value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasUpgradeLimit() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearUpgradeLimit() => $_clearField(11);\n  @$pb.TagNumber(11)\n  UpgradeLimit ensureUpgradeLimit() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  $pb.PbList<FormatDescription> get supportFormats => $_getList(11);\n\n  @$pb.TagNumber(13)\n  VideoType get type => $_getN(12);\n  @$pb.TagNumber(13)\n  set type(VideoType value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasType() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearType() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  VipRisk get vipRisk => $_getN(13);\n  @$pb.TagNumber(14)\n  set vipRisk(VipRisk value) => $_setField(14, value);\n  @$pb.TagNumber(14)\n  $core.bool hasVipRisk() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearVipRisk() => $_clearField(14);\n  @$pb.TagNumber(14)\n  VipRisk ensureVipRisk() => $_ensure(13);\n}\n\nclass PlayURLReq extends $pb.GeneratedMessage {\n  factory PlayURLReq({\n    $fixnum.Int64? aid,\n    $fixnum.Int64? cid,\n    $fixnum.Int64? qn,\n    $core.int? fnver,\n    $core.int? fnval,\n    $core.int? download,\n    $core.int? forceHost,\n    $core.bool? fourk,\n    $core.String? spmid,\n    $core.String? fromSpmid,\n  }) {\n    final result = create();\n    if (aid != null) result.aid = aid;\n    if (cid != null) result.cid = cid;\n    if (qn != null) result.qn = qn;\n    if (fnver != null) result.fnver = fnver;\n    if (fnval != null) result.fnval = fnval;\n    if (download != null) result.download = download;\n    if (forceHost != null) result.forceHost = forceHost;\n    if (fourk != null) result.fourk = fourk;\n    if (spmid != null) result.spmid = spmid;\n    if (fromSpmid != null) result.fromSpmid = fromSpmid;\n    return result;\n  }\n\n  PlayURLReq._();\n\n  factory PlayURLReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayURLReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayURLReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'aid')\n    ..aInt64(2, _omitFieldNames ? '' : 'cid')\n    ..aInt64(3, _omitFieldNames ? '' : 'qn')\n    ..aI(4, _omitFieldNames ? '' : 'fnver')\n    ..aI(5, _omitFieldNames ? '' : 'fnval')\n    ..aI(6, _omitFieldNames ? '' : 'download')\n    ..aI(7, _omitFieldNames ? '' : 'forceHost')\n    ..aOB(8, _omitFieldNames ? '' : 'fourk')\n    ..aOS(9, _omitFieldNames ? '' : 'spmid')\n    ..aOS(10, _omitFieldNames ? '' : 'fromSpmid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayURLReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayURLReq copyWith(void Function(PlayURLReq) updates) =>\n      super.copyWith((message) => updates(message as PlayURLReq)) as PlayURLReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayURLReq create() => PlayURLReq._();\n  @$core.override\n  PlayURLReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayURLReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayURLReq>(create);\n  static PlayURLReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get aid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set aid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get cid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set cid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get qn => $_getI64(2);\n  @$pb.TagNumber(3)\n  set qn($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasQn() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearQn() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get fnver => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set fnver($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFnver() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFnver() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get fnval => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set fnval($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasFnval() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearFnval() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get download => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set download($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasDownload() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearDownload() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get forceHost => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set forceHost($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasForceHost() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearForceHost() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.bool get fourk => $_getBF(7);\n  @$pb.TagNumber(8)\n  set fourk($core.bool value) => $_setBool(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasFourk() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearFourk() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get spmid => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set spmid($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasSpmid() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearSpmid() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get fromSpmid => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set fromSpmid($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasFromSpmid() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearFromSpmid() => $_clearField(10);\n}\n\nclass PlayViewReply extends $pb.GeneratedMessage {\n  factory PlayViewReply({\n    VideoInfo? videoInfo,\n    PlayAbilityConf? playConf,\n    UpgradeLimit? upgradeLimit,\n    Chronos? chronos,\n    PlayArcConf? playArc,\n    Event? event,\n    AB? ab,\n    PlayLimit? playLimit,\n    ViewInfo? viewInfo,\n    PlayArc? arc,\n  }) {\n    final result = create();\n    if (videoInfo != null) result.videoInfo = videoInfo;\n    if (playConf != null) result.playConf = playConf;\n    if (upgradeLimit != null) result.upgradeLimit = upgradeLimit;\n    if (chronos != null) result.chronos = chronos;\n    if (playArc != null) result.playArc = playArc;\n    if (event != null) result.event = event;\n    if (ab != null) result.ab = ab;\n    if (playLimit != null) result.playLimit = playLimit;\n    if (viewInfo != null) result.viewInfo = viewInfo;\n    if (arc != null) result.arc = arc;\n    return result;\n  }\n\n  PlayViewReply._();\n\n  factory PlayViewReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayViewReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayViewReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aOM<VideoInfo>(1, _omitFieldNames ? '' : 'videoInfo',\n        subBuilder: VideoInfo.create)\n    ..aOM<PlayAbilityConf>(2, _omitFieldNames ? '' : 'playConf',\n        subBuilder: PlayAbilityConf.create)\n    ..aOM<UpgradeLimit>(3, _omitFieldNames ? '' : 'upgradeLimit',\n        subBuilder: UpgradeLimit.create)\n    ..aOM<Chronos>(4, _omitFieldNames ? '' : 'chronos',\n        subBuilder: Chronos.create)\n    ..aOM<PlayArcConf>(5, _omitFieldNames ? '' : 'playArc',\n        subBuilder: PlayArcConf.create)\n    ..aOM<Event>(6, _omitFieldNames ? '' : 'event', subBuilder: Event.create)\n    ..aOM<AB>(7, _omitFieldNames ? '' : 'ab', subBuilder: AB.create)\n    ..aOM<PlayLimit>(8, _omitFieldNames ? '' : 'playLimit',\n        subBuilder: PlayLimit.create)\n    ..aOM<ViewInfo>(9, _omitFieldNames ? '' : 'viewInfo',\n        subBuilder: ViewInfo.create)\n    ..aOM<PlayArc>(10, _omitFieldNames ? '' : 'arc', subBuilder: PlayArc.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayViewReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayViewReply copyWith(void Function(PlayViewReply) updates) =>\n      super.copyWith((message) => updates(message as PlayViewReply))\n          as PlayViewReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayViewReply create() => PlayViewReply._();\n  @$core.override\n  PlayViewReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayViewReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayViewReply>(create);\n  static PlayViewReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  VideoInfo get videoInfo => $_getN(0);\n  @$pb.TagNumber(1)\n  set videoInfo(VideoInfo value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasVideoInfo() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearVideoInfo() => $_clearField(1);\n  @$pb.TagNumber(1)\n  VideoInfo ensureVideoInfo() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  PlayAbilityConf get playConf => $_getN(1);\n  @$pb.TagNumber(2)\n  set playConf(PlayAbilityConf value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPlayConf() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPlayConf() => $_clearField(2);\n  @$pb.TagNumber(2)\n  PlayAbilityConf ensurePlayConf() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  UpgradeLimit get upgradeLimit => $_getN(2);\n  @$pb.TagNumber(3)\n  set upgradeLimit(UpgradeLimit value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUpgradeLimit() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUpgradeLimit() => $_clearField(3);\n  @$pb.TagNumber(3)\n  UpgradeLimit ensureUpgradeLimit() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  Chronos get chronos => $_getN(3);\n  @$pb.TagNumber(4)\n  set chronos(Chronos value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasChronos() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearChronos() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Chronos ensureChronos() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  PlayArcConf get playArc => $_getN(4);\n  @$pb.TagNumber(5)\n  set playArc(PlayArcConf value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPlayArc() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPlayArc() => $_clearField(5);\n  @$pb.TagNumber(5)\n  PlayArcConf ensurePlayArc() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  Event get event => $_getN(5);\n  @$pb.TagNumber(6)\n  set event(Event value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasEvent() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearEvent() => $_clearField(6);\n  @$pb.TagNumber(6)\n  Event ensureEvent() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  AB get ab => $_getN(6);\n  @$pb.TagNumber(7)\n  set ab(AB value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasAb() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearAb() => $_clearField(7);\n  @$pb.TagNumber(7)\n  AB ensureAb() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  PlayLimit get playLimit => $_getN(7);\n  @$pb.TagNumber(8)\n  set playLimit(PlayLimit value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasPlayLimit() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearPlayLimit() => $_clearField(8);\n  @$pb.TagNumber(8)\n  PlayLimit ensurePlayLimit() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  ViewInfo get viewInfo => $_getN(8);\n  @$pb.TagNumber(9)\n  set viewInfo(ViewInfo value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasViewInfo() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearViewInfo() => $_clearField(9);\n  @$pb.TagNumber(9)\n  ViewInfo ensureViewInfo() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  PlayArc get arc => $_getN(9);\n  @$pb.TagNumber(10)\n  set arc(PlayArc value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasArc() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearArc() => $_clearField(10);\n  @$pb.TagNumber(10)\n  PlayArc ensureArc() => $_ensure(9);\n}\n\nclass PlayViewReq extends $pb.GeneratedMessage {\n  factory PlayViewReq({\n    $fixnum.Int64? aid,\n    $fixnum.Int64? cid,\n    $fixnum.Int64? qn,\n    $core.int? fnver,\n    $core.int? fnval,\n    $core.int? download,\n    $core.int? forceHost,\n    $core.bool? fourk,\n    $core.String? spmid,\n    $core.String? fromSpmid,\n    $core.int? teenagersMode,\n    CodeType? preferCodecType,\n    Business? business,\n    $fixnum.Int64? voiceBalance,\n  }) {\n    final result = create();\n    if (aid != null) result.aid = aid;\n    if (cid != null) result.cid = cid;\n    if (qn != null) result.qn = qn;\n    if (fnver != null) result.fnver = fnver;\n    if (fnval != null) result.fnval = fnval;\n    if (download != null) result.download = download;\n    if (forceHost != null) result.forceHost = forceHost;\n    if (fourk != null) result.fourk = fourk;\n    if (spmid != null) result.spmid = spmid;\n    if (fromSpmid != null) result.fromSpmid = fromSpmid;\n    if (teenagersMode != null) result.teenagersMode = teenagersMode;\n    if (preferCodecType != null) result.preferCodecType = preferCodecType;\n    if (business != null) result.business = business;\n    if (voiceBalance != null) result.voiceBalance = voiceBalance;\n    return result;\n  }\n\n  PlayViewReq._();\n\n  factory PlayViewReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayViewReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayViewReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'aid')\n    ..aInt64(2, _omitFieldNames ? '' : 'cid')\n    ..aInt64(3, _omitFieldNames ? '' : 'qn')\n    ..aI(4, _omitFieldNames ? '' : 'fnver')\n    ..aI(5, _omitFieldNames ? '' : 'fnval')\n    ..aI(6, _omitFieldNames ? '' : 'download')\n    ..aI(7, _omitFieldNames ? '' : 'forceHost')\n    ..aOB(8, _omitFieldNames ? '' : 'fourk')\n    ..aOS(9, _omitFieldNames ? '' : 'spmid')\n    ..aOS(10, _omitFieldNames ? '' : 'fromSpmid')\n    ..aI(11, _omitFieldNames ? '' : 'teenagersMode')\n    ..aE<CodeType>(12, _omitFieldNames ? '' : 'preferCodecType',\n        enumValues: CodeType.values)\n    ..aE<Business>(13, _omitFieldNames ? '' : 'business',\n        enumValues: Business.values)\n    ..aInt64(14, _omitFieldNames ? '' : 'voiceBalance')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayViewReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayViewReq copyWith(void Function(PlayViewReq) updates) =>\n      super.copyWith((message) => updates(message as PlayViewReq))\n          as PlayViewReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayViewReq create() => PlayViewReq._();\n  @$core.override\n  PlayViewReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayViewReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayViewReq>(create);\n  static PlayViewReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get aid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set aid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get cid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set cid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get qn => $_getI64(2);\n  @$pb.TagNumber(3)\n  set qn($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasQn() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearQn() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get fnver => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set fnver($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFnver() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFnver() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get fnval => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set fnval($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasFnval() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearFnval() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get download => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set download($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasDownload() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearDownload() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get forceHost => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set forceHost($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasForceHost() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearForceHost() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.bool get fourk => $_getBF(7);\n  @$pb.TagNumber(8)\n  set fourk($core.bool value) => $_setBool(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasFourk() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearFourk() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get spmid => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set spmid($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasSpmid() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearSpmid() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get fromSpmid => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set fromSpmid($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasFromSpmid() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearFromSpmid() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.int get teenagersMode => $_getIZ(10);\n  @$pb.TagNumber(11)\n  set teenagersMode($core.int value) => $_setSignedInt32(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasTeenagersMode() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearTeenagersMode() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  CodeType get preferCodecType => $_getN(11);\n  @$pb.TagNumber(12)\n  set preferCodecType(CodeType value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasPreferCodecType() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearPreferCodecType() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  Business get business => $_getN(12);\n  @$pb.TagNumber(13)\n  set business(Business value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasBusiness() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearBusiness() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $fixnum.Int64 get voiceBalance => $_getI64(13);\n  @$pb.TagNumber(14)\n  set voiceBalance($fixnum.Int64 value) => $_setInt64(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasVoiceBalance() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearVoiceBalance() => $_clearField(14);\n}\n\nclass ProjectReply extends $pb.GeneratedMessage {\n  factory ProjectReply({\n    PlayURLReply? project,\n  }) {\n    final result = create();\n    if (project != null) result.project = project;\n    return result;\n  }\n\n  ProjectReply._();\n\n  factory ProjectReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ProjectReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ProjectReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aOM<PlayURLReply>(1, _omitFieldNames ? '' : 'project',\n        subBuilder: PlayURLReply.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ProjectReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ProjectReply copyWith(void Function(ProjectReply) updates) =>\n      super.copyWith((message) => updates(message as ProjectReply))\n          as ProjectReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ProjectReply create() => ProjectReply._();\n  @$core.override\n  ProjectReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ProjectReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ProjectReply>(create);\n  static ProjectReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PlayURLReply get project => $_getN(0);\n  @$pb.TagNumber(1)\n  set project(PlayURLReply value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasProject() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearProject() => $_clearField(1);\n  @$pb.TagNumber(1)\n  PlayURLReply ensureProject() => $_ensure(0);\n}\n\nclass ProjectReq extends $pb.GeneratedMessage {\n  factory ProjectReq({\n    $fixnum.Int64? aid,\n    $fixnum.Int64? cid,\n    $fixnum.Int64? qn,\n    $core.int? fnver,\n    $core.int? fnval,\n    $core.int? download,\n    $core.int? forceHost,\n    $core.bool? fourk,\n    $core.String? spmid,\n    $core.String? fromSpmid,\n    $core.int? protocol,\n    $core.int? deviceType,\n  }) {\n    final result = create();\n    if (aid != null) result.aid = aid;\n    if (cid != null) result.cid = cid;\n    if (qn != null) result.qn = qn;\n    if (fnver != null) result.fnver = fnver;\n    if (fnval != null) result.fnval = fnval;\n    if (download != null) result.download = download;\n    if (forceHost != null) result.forceHost = forceHost;\n    if (fourk != null) result.fourk = fourk;\n    if (spmid != null) result.spmid = spmid;\n    if (fromSpmid != null) result.fromSpmid = fromSpmid;\n    if (protocol != null) result.protocol = protocol;\n    if (deviceType != null) result.deviceType = deviceType;\n    return result;\n  }\n\n  ProjectReq._();\n\n  factory ProjectReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ProjectReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ProjectReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'aid')\n    ..aInt64(2, _omitFieldNames ? '' : 'cid')\n    ..aInt64(3, _omitFieldNames ? '' : 'qn')\n    ..aI(4, _omitFieldNames ? '' : 'fnver')\n    ..aI(5, _omitFieldNames ? '' : 'fnval')\n    ..aI(6, _omitFieldNames ? '' : 'download')\n    ..aI(7, _omitFieldNames ? '' : 'forceHost')\n    ..aOB(8, _omitFieldNames ? '' : 'fourk')\n    ..aOS(9, _omitFieldNames ? '' : 'spmid')\n    ..aOS(10, _omitFieldNames ? '' : 'fromSpmid')\n    ..aI(11, _omitFieldNames ? '' : 'protocol')\n    ..aI(12, _omitFieldNames ? '' : 'deviceType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ProjectReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ProjectReq copyWith(void Function(ProjectReq) updates) =>\n      super.copyWith((message) => updates(message as ProjectReq)) as ProjectReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ProjectReq create() => ProjectReq._();\n  @$core.override\n  ProjectReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ProjectReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ProjectReq>(create);\n  static ProjectReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get aid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set aid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get cid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set cid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get qn => $_getI64(2);\n  @$pb.TagNumber(3)\n  set qn($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasQn() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearQn() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get fnver => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set fnver($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFnver() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFnver() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get fnval => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set fnval($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasFnval() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearFnval() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get download => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set download($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasDownload() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearDownload() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get forceHost => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set forceHost($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasForceHost() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearForceHost() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.bool get fourk => $_getBF(7);\n  @$pb.TagNumber(8)\n  set fourk($core.bool value) => $_setBool(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasFourk() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearFourk() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get spmid => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set spmid($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasSpmid() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearSpmid() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get fromSpmid => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set fromSpmid($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasFromSpmid() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearFromSpmid() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.int get protocol => $_getIZ(10);\n  @$pb.TagNumber(11)\n  set protocol($core.int value) => $_setSignedInt32(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasProtocol() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearProtocol() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.int get deviceType => $_getIZ(11);\n  @$pb.TagNumber(12)\n  set deviceType($core.int value) => $_setSignedInt32(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasDeviceType() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearDeviceType() => $_clearField(12);\n}\n\nclass PromptBar extends $pb.GeneratedMessage {\n  factory PromptBar({\n    TextInfo? title,\n    TextInfo? subTitle,\n    $core.String? subTitleIcon,\n    $core.String? bgImage,\n    $core.Iterable<ButtonInfo>? button,\n    Report? report,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (subTitle != null) result.subTitle = subTitle;\n    if (subTitleIcon != null) result.subTitleIcon = subTitleIcon;\n    if (bgImage != null) result.bgImage = bgImage;\n    if (button != null) result.button.addAll(button);\n    if (report != null) result.report = report;\n    return result;\n  }\n\n  PromptBar._();\n\n  factory PromptBar.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PromptBar.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PromptBar',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aOM<TextInfo>(1, _omitFieldNames ? '' : 'title',\n        subBuilder: TextInfo.create)\n    ..aOM<TextInfo>(2, _omitFieldNames ? '' : 'subTitle',\n        subBuilder: TextInfo.create)\n    ..aOS(3, _omitFieldNames ? '' : 'subTitleIcon')\n    ..aOS(4, _omitFieldNames ? '' : 'bgImage')\n    ..pPM<ButtonInfo>(5, _omitFieldNames ? '' : 'button',\n        subBuilder: ButtonInfo.create)\n    ..aOM<Report>(6, _omitFieldNames ? '' : 'report', subBuilder: Report.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PromptBar clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PromptBar copyWith(void Function(PromptBar) updates) =>\n      super.copyWith((message) => updates(message as PromptBar)) as PromptBar;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PromptBar create() => PromptBar._();\n  @$core.override\n  PromptBar createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PromptBar getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PromptBar>(create);\n  static PromptBar? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  TextInfo get title => $_getN(0);\n  @$pb.TagNumber(1)\n  set title(TextInfo value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n  @$pb.TagNumber(1)\n  TextInfo ensureTitle() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  TextInfo get subTitle => $_getN(1);\n  @$pb.TagNumber(2)\n  set subTitle(TextInfo value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSubTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSubTitle() => $_clearField(2);\n  @$pb.TagNumber(2)\n  TextInfo ensureSubTitle() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.String get subTitleIcon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set subTitleIcon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSubTitleIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSubTitleIcon() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get bgImage => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set bgImage($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBgImage() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBgImage() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $pb.PbList<ButtonInfo> get button => $_getList(4);\n\n  @$pb.TagNumber(6)\n  Report get report => $_getN(5);\n  @$pb.TagNumber(6)\n  set report(Report value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasReport() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearReport() => $_clearField(6);\n  @$pb.TagNumber(6)\n  Report ensureReport() => $_ensure(5);\n}\n\nclass Report extends $pb.GeneratedMessage {\n  factory Report({\n    $core.String? showEventId,\n    $core.String? clickEventId,\n    $core.String? extends_3,\n  }) {\n    final result = create();\n    if (showEventId != null) result.showEventId = showEventId;\n    if (clickEventId != null) result.clickEventId = clickEventId;\n    if (extends_3 != null) result.extends_3 = extends_3;\n    return result;\n  }\n\n  Report._();\n\n  factory Report.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Report.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Report',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'showEventId')\n    ..aOS(2, _omitFieldNames ? '' : 'clickEventId')\n    ..aOS(3, _omitFieldNames ? '' : 'extends')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Report clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Report copyWith(void Function(Report) updates) =>\n      super.copyWith((message) => updates(message as Report)) as Report;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Report create() => Report._();\n  @$core.override\n  Report createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Report getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Report>(create);\n  static Report? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get showEventId => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set showEventId($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasShowEventId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearShowEventId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get clickEventId => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set clickEventId($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasClickEventId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearClickEventId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get extends_3 => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set extends_3($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasExtends_3() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearExtends_3() => $_clearField(3);\n}\n\nclass ResponseDash extends $pb.GeneratedMessage {\n  factory ResponseDash({\n    $core.Iterable<DashItem>? video,\n    $core.Iterable<DashItem>? audio,\n  }) {\n    final result = create();\n    if (video != null) result.video.addAll(video);\n    if (audio != null) result.audio.addAll(audio);\n    return result;\n  }\n\n  ResponseDash._();\n\n  factory ResponseDash.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ResponseDash.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ResponseDash',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..pPM<DashItem>(1, _omitFieldNames ? '' : 'video',\n        subBuilder: DashItem.create)\n    ..pPM<DashItem>(2, _omitFieldNames ? '' : 'audio',\n        subBuilder: DashItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ResponseDash clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ResponseDash copyWith(void Function(ResponseDash) updates) =>\n      super.copyWith((message) => updates(message as ResponseDash))\n          as ResponseDash;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ResponseDash create() => ResponseDash._();\n  @$core.override\n  ResponseDash createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ResponseDash getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ResponseDash>(create);\n  static ResponseDash? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<DashItem> get video => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<DashItem> get audio => $_getList(1);\n}\n\nclass ResponseUrl extends $pb.GeneratedMessage {\n  factory ResponseUrl({\n    $core.int? order,\n    $fixnum.Int64? length,\n    $fixnum.Int64? size,\n    $core.String? url,\n    $core.Iterable<$core.String>? backupUrl,\n    $core.String? md5,\n    $core.int? quality,\n  }) {\n    final result = create();\n    if (order != null) result.order = order;\n    if (length != null) result.length = length;\n    if (size != null) result.size = size;\n    if (url != null) result.url = url;\n    if (backupUrl != null) result.backupUrl.addAll(backupUrl);\n    if (md5 != null) result.md5 = md5;\n    if (quality != null) result.quality = quality;\n    return result;\n  }\n\n  ResponseUrl._();\n\n  factory ResponseUrl.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ResponseUrl.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ResponseUrl',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'order')\n    ..aInt64(2, _omitFieldNames ? '' : 'length')\n    ..aInt64(3, _omitFieldNames ? '' : 'size')\n    ..aOS(4, _omitFieldNames ? '' : 'url')\n    ..pPS(5, _omitFieldNames ? '' : 'backupUrl')\n    ..aOS(6, _omitFieldNames ? '' : 'md5')\n    ..aI(7, _omitFieldNames ? '' : 'quality')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ResponseUrl clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ResponseUrl copyWith(void Function(ResponseUrl) updates) =>\n      super.copyWith((message) => updates(message as ResponseUrl))\n          as ResponseUrl;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ResponseUrl create() => ResponseUrl._();\n  @$core.override\n  ResponseUrl createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ResponseUrl getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ResponseUrl>(create);\n  static ResponseUrl? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get order => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set order($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOrder() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOrder() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get length => $_getI64(1);\n  @$pb.TagNumber(2)\n  set length($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLength() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLength() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get size => $_getI64(2);\n  @$pb.TagNumber(3)\n  set size($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSize() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSize() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get url => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set url($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUrl() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUrl() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $pb.PbList<$core.String> get backupUrl => $_getList(4);\n\n  @$pb.TagNumber(6)\n  $core.String get md5 => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set md5($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasMd5() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearMd5() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get quality => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set quality($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasQuality() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearQuality() => $_clearField(7);\n}\n\nclass Scheme extends $pb.GeneratedMessage {\n  factory Scheme({\n    Scheme_ActionType? actionType,\n    $core.String? toast,\n  }) {\n    final result = create();\n    if (actionType != null) result.actionType = actionType;\n    if (toast != null) result.toast = toast;\n    return result;\n  }\n\n  Scheme._();\n\n  factory Scheme.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Scheme.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Scheme',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aE<Scheme_ActionType>(1, _omitFieldNames ? '' : 'actionType',\n        enumValues: Scheme_ActionType.values)\n    ..aOS(2, _omitFieldNames ? '' : 'toast')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Scheme clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Scheme copyWith(void Function(Scheme) updates) =>\n      super.copyWith((message) => updates(message as Scheme)) as Scheme;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Scheme create() => Scheme._();\n  @$core.override\n  Scheme createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Scheme getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Scheme>(create);\n  static Scheme? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Scheme_ActionType get actionType => $_getN(0);\n  @$pb.TagNumber(1)\n  set actionType(Scheme_ActionType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasActionType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearActionType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get toast => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set toast($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasToast() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearToast() => $_clearField(2);\n}\n\nclass SegmentVideo extends $pb.GeneratedMessage {\n  factory SegmentVideo({\n    $core.Iterable<ResponseUrl>? segment,\n  }) {\n    final result = create();\n    if (segment != null) result.segment.addAll(segment);\n    return result;\n  }\n\n  SegmentVideo._();\n\n  factory SegmentVideo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SegmentVideo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SegmentVideo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..pPM<ResponseUrl>(1, _omitFieldNames ? '' : 'segment',\n        subBuilder: ResponseUrl.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SegmentVideo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SegmentVideo copyWith(void Function(SegmentVideo) updates) =>\n      super.copyWith((message) => updates(message as SegmentVideo))\n          as SegmentVideo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SegmentVideo create() => SegmentVideo._();\n  @$core.override\n  SegmentVideo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SegmentVideo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SegmentVideo>(create);\n  static SegmentVideo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<ResponseUrl> get segment => $_getList(0);\n}\n\nclass Shake extends $pb.GeneratedMessage {\n  factory Shake({\n    $core.String? file,\n  }) {\n    final result = create();\n    if (file != null) result.file = file;\n    return result;\n  }\n\n  Shake._();\n\n  factory Shake.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Shake.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Shake',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'file')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Shake clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Shake copyWith(void Function(Shake) updates) =>\n      super.copyWith((message) => updates(message as Shake)) as Shake;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Shake create() => Shake._();\n  @$core.override\n  Shake createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Shake getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Shake>(create);\n  static Shake? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get file => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set file($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFile() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFile() => $_clearField(1);\n}\n\nenum Stream_Content { dashVideo, segmentVideo, multiDashVideo, notSet }\n\nclass Stream extends $pb.GeneratedMessage {\n  factory Stream({\n    StreamInfo? streamInfo,\n    DashVideo? dashVideo,\n    SegmentVideo? segmentVideo,\n    MultiDashVideo? multiDashVideo,\n  }) {\n    final result = create();\n    if (streamInfo != null) result.streamInfo = streamInfo;\n    if (dashVideo != null) result.dashVideo = dashVideo;\n    if (segmentVideo != null) result.segmentVideo = segmentVideo;\n    if (multiDashVideo != null) result.multiDashVideo = multiDashVideo;\n    return result;\n  }\n\n  Stream._();\n\n  factory Stream.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Stream.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, Stream_Content> _Stream_ContentByTag = {\n    2: Stream_Content.dashVideo,\n    3: Stream_Content.segmentVideo,\n    4: Stream_Content.multiDashVideo,\n    0: Stream_Content.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Stream',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [2, 3, 4])\n    ..aOM<StreamInfo>(1, _omitFieldNames ? '' : 'streamInfo',\n        subBuilder: StreamInfo.create)\n    ..aOM<DashVideo>(2, _omitFieldNames ? '' : 'dashVideo',\n        subBuilder: DashVideo.create)\n    ..aOM<SegmentVideo>(3, _omitFieldNames ? '' : 'segmentVideo',\n        subBuilder: SegmentVideo.create)\n    ..aOM<MultiDashVideo>(4, _omitFieldNames ? '' : 'multiDashVideo',\n        subBuilder: MultiDashVideo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Stream clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Stream copyWith(void Function(Stream) updates) =>\n      super.copyWith((message) => updates(message as Stream)) as Stream;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Stream create() => Stream._();\n  @$core.override\n  Stream createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Stream getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Stream>(create);\n  static Stream? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  Stream_Content whichContent() => _Stream_ContentByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  void clearContent() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  StreamInfo get streamInfo => $_getN(0);\n  @$pb.TagNumber(1)\n  set streamInfo(StreamInfo value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStreamInfo() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStreamInfo() => $_clearField(1);\n  @$pb.TagNumber(1)\n  StreamInfo ensureStreamInfo() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  DashVideo get dashVideo => $_getN(1);\n  @$pb.TagNumber(2)\n  set dashVideo(DashVideo value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDashVideo() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDashVideo() => $_clearField(2);\n  @$pb.TagNumber(2)\n  DashVideo ensureDashVideo() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  SegmentVideo get segmentVideo => $_getN(2);\n  @$pb.TagNumber(3)\n  set segmentVideo(SegmentVideo value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSegmentVideo() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSegmentVideo() => $_clearField(3);\n  @$pb.TagNumber(3)\n  SegmentVideo ensureSegmentVideo() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  MultiDashVideo get multiDashVideo => $_getN(3);\n  @$pb.TagNumber(4)\n  set multiDashVideo(MultiDashVideo value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasMultiDashVideo() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearMultiDashVideo() => $_clearField(4);\n  @$pb.TagNumber(4)\n  MultiDashVideo ensureMultiDashVideo() => $_ensure(3);\n}\n\nclass StreamInfo extends $pb.GeneratedMessage {\n  factory StreamInfo({\n    $core.int? quality,\n    $core.String? format,\n    $core.String? description,\n    PlayErr? errCode,\n    StreamLimit? limit,\n    $core.bool? needVip,\n    $core.bool? needLogin,\n    $core.bool? intact,\n    $core.bool? noRexcode,\n    $fixnum.Int64? attribute,\n    $core.String? newDescription,\n    $core.String? displayDesc,\n    $core.String? superscript,\n    $core.bool? vipFree,\n    $core.String? subtitle,\n    Scheme? scheme,\n    $core.bool? supportDrm,\n    $core.bool? hasPreview,\n  }) {\n    final result = create();\n    if (quality != null) result.quality = quality;\n    if (format != null) result.format = format;\n    if (description != null) result.description = description;\n    if (errCode != null) result.errCode = errCode;\n    if (limit != null) result.limit = limit;\n    if (needVip != null) result.needVip = needVip;\n    if (needLogin != null) result.needLogin = needLogin;\n    if (intact != null) result.intact = intact;\n    if (noRexcode != null) result.noRexcode = noRexcode;\n    if (attribute != null) result.attribute = attribute;\n    if (newDescription != null) result.newDescription = newDescription;\n    if (displayDesc != null) result.displayDesc = displayDesc;\n    if (superscript != null) result.superscript = superscript;\n    if (vipFree != null) result.vipFree = vipFree;\n    if (subtitle != null) result.subtitle = subtitle;\n    if (scheme != null) result.scheme = scheme;\n    if (supportDrm != null) result.supportDrm = supportDrm;\n    if (hasPreview != null) result.hasPreview = hasPreview;\n    return result;\n  }\n\n  StreamInfo._();\n\n  factory StreamInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory StreamInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'StreamInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'quality')\n    ..aOS(2, _omitFieldNames ? '' : 'format')\n    ..aOS(3, _omitFieldNames ? '' : 'description')\n    ..aE<PlayErr>(4, _omitFieldNames ? '' : 'errCode',\n        enumValues: PlayErr.values)\n    ..aOM<StreamLimit>(5, _omitFieldNames ? '' : 'limit',\n        subBuilder: StreamLimit.create)\n    ..aOB(6, _omitFieldNames ? '' : 'needVip')\n    ..aOB(7, _omitFieldNames ? '' : 'needLogin')\n    ..aOB(8, _omitFieldNames ? '' : 'intact')\n    ..aOB(9, _omitFieldNames ? '' : 'noRexcode')\n    ..aInt64(10, _omitFieldNames ? '' : 'attribute')\n    ..aOS(11, _omitFieldNames ? '' : 'newDescription')\n    ..aOS(12, _omitFieldNames ? '' : 'displayDesc')\n    ..aOS(13, _omitFieldNames ? '' : 'superscript')\n    ..aOB(14, _omitFieldNames ? '' : 'vipFree')\n    ..aOS(15, _omitFieldNames ? '' : 'subtitle')\n    ..aOM<Scheme>(16, _omitFieldNames ? '' : 'scheme',\n        subBuilder: Scheme.create)\n    ..aOB(17, _omitFieldNames ? '' : 'supportDrm')\n    ..aOB(18, _omitFieldNames ? '' : 'hasPreview')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StreamInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StreamInfo copyWith(void Function(StreamInfo) updates) =>\n      super.copyWith((message) => updates(message as StreamInfo)) as StreamInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static StreamInfo create() => StreamInfo._();\n  @$core.override\n  StreamInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static StreamInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<StreamInfo>(create);\n  static StreamInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get quality => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set quality($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasQuality() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearQuality() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get format => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set format($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFormat() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFormat() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get description => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set description($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDescription() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDescription() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  PlayErr get errCode => $_getN(3);\n  @$pb.TagNumber(4)\n  set errCode(PlayErr value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasErrCode() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearErrCode() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  StreamLimit get limit => $_getN(4);\n  @$pb.TagNumber(5)\n  set limit(StreamLimit value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasLimit() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearLimit() => $_clearField(5);\n  @$pb.TagNumber(5)\n  StreamLimit ensureLimit() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.bool get needVip => $_getBF(5);\n  @$pb.TagNumber(6)\n  set needVip($core.bool value) => $_setBool(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasNeedVip() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearNeedVip() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.bool get needLogin => $_getBF(6);\n  @$pb.TagNumber(7)\n  set needLogin($core.bool value) => $_setBool(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasNeedLogin() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearNeedLogin() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.bool get intact => $_getBF(7);\n  @$pb.TagNumber(8)\n  set intact($core.bool value) => $_setBool(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasIntact() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearIntact() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.bool get noRexcode => $_getBF(8);\n  @$pb.TagNumber(9)\n  set noRexcode($core.bool value) => $_setBool(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasNoRexcode() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearNoRexcode() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $fixnum.Int64 get attribute => $_getI64(9);\n  @$pb.TagNumber(10)\n  set attribute($fixnum.Int64 value) => $_setInt64(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasAttribute() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearAttribute() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get newDescription => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set newDescription($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasNewDescription() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearNewDescription() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get displayDesc => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set displayDesc($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasDisplayDesc() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearDisplayDesc() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.String get superscript => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set superscript($core.String value) => $_setString(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasSuperscript() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearSuperscript() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.bool get vipFree => $_getBF(13);\n  @$pb.TagNumber(14)\n  set vipFree($core.bool value) => $_setBool(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasVipFree() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearVipFree() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $core.String get subtitle => $_getSZ(14);\n  @$pb.TagNumber(15)\n  set subtitle($core.String value) => $_setString(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasSubtitle() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearSubtitle() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  Scheme get scheme => $_getN(15);\n  @$pb.TagNumber(16)\n  set scheme(Scheme value) => $_setField(16, value);\n  @$pb.TagNumber(16)\n  $core.bool hasScheme() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearScheme() => $_clearField(16);\n  @$pb.TagNumber(16)\n  Scheme ensureScheme() => $_ensure(15);\n\n  @$pb.TagNumber(17)\n  $core.bool get supportDrm => $_getBF(16);\n  @$pb.TagNumber(17)\n  set supportDrm($core.bool value) => $_setBool(16, value);\n  @$pb.TagNumber(17)\n  $core.bool hasSupportDrm() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearSupportDrm() => $_clearField(17);\n\n  @$pb.TagNumber(18)\n  $core.bool get hasPreview => $_getBF(17);\n  @$pb.TagNumber(18)\n  set hasPreview($core.bool value) => $_setBool(17, value);\n  @$pb.TagNumber(18)\n  $core.bool hasHasPreview() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearHasPreview() => $_clearField(18);\n}\n\nclass StreamLimit extends $pb.GeneratedMessage {\n  factory StreamLimit({\n    $core.String? title,\n    $core.String? uri,\n    $core.String? msg,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (uri != null) result.uri = uri;\n    if (msg != null) result.msg = msg;\n    return result;\n  }\n\n  StreamLimit._();\n\n  factory StreamLimit.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory StreamLimit.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'StreamLimit',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..aOS(3, _omitFieldNames ? '' : 'msg')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StreamLimit clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StreamLimit copyWith(void Function(StreamLimit) updates) =>\n      super.copyWith((message) => updates(message as StreamLimit))\n          as StreamLimit;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static StreamLimit create() => StreamLimit._();\n  @$core.override\n  StreamLimit createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static StreamLimit getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<StreamLimit>(create);\n  static StreamLimit? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get msg => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set msg($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasMsg() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearMsg() => $_clearField(3);\n}\n\nclass TextInfo extends $pb.GeneratedMessage {\n  factory TextInfo({\n    $core.String? text,\n    $core.String? textColor,\n    $core.String? textColorNight,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (textColor != null) result.textColor = textColor;\n    if (textColorNight != null) result.textColorNight = textColorNight;\n    return result;\n  }\n\n  TextInfo._();\n\n  factory TextInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TextInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TextInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aOS(2, _omitFieldNames ? '' : 'textColor')\n    ..aOS(3, _omitFieldNames ? '' : 'textColorNight')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TextInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TextInfo copyWith(void Function(TextInfo) updates) =>\n      super.copyWith((message) => updates(message as TextInfo)) as TextInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TextInfo create() => TextInfo._();\n  @$core.override\n  TextInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TextInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TextInfo>(create);\n  static TextInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get textColor => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set textColor($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTextColor() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTextColor() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get textColorNight => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set textColorNight($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTextColorNight() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTextColorNight() => $_clearField(3);\n}\n\nclass UpgradeButton extends $pb.GeneratedMessage {\n  factory UpgradeButton({\n    $core.String? title,\n    $core.String? link,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (link != null) result.link = link;\n    return result;\n  }\n\n  UpgradeButton._();\n\n  factory UpgradeButton.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UpgradeButton.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UpgradeButton',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'link')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpgradeButton clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpgradeButton copyWith(void Function(UpgradeButton) updates) =>\n      super.copyWith((message) => updates(message as UpgradeButton))\n          as UpgradeButton;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UpgradeButton create() => UpgradeButton._();\n  @$core.override\n  UpgradeButton createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UpgradeButton getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UpgradeButton>(create);\n  static UpgradeButton? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get link => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set link($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLink() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLink() => $_clearField(2);\n}\n\nclass UpgradeLimit extends $pb.GeneratedMessage {\n  factory UpgradeLimit({\n    $core.int? code,\n    $core.String? message,\n    $core.String? image,\n    UpgradeButton? button,\n  }) {\n    final result = create();\n    if (code != null) result.code = code;\n    if (message != null) result.message = message;\n    if (image != null) result.image = image;\n    if (button != null) result.button = button;\n    return result;\n  }\n\n  UpgradeLimit._();\n\n  factory UpgradeLimit.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UpgradeLimit.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UpgradeLimit',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'code')\n    ..aOS(2, _omitFieldNames ? '' : 'message')\n    ..aOS(3, _omitFieldNames ? '' : 'image')\n    ..aOM<UpgradeButton>(4, _omitFieldNames ? '' : 'button',\n        subBuilder: UpgradeButton.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpgradeLimit clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpgradeLimit copyWith(void Function(UpgradeLimit) updates) =>\n      super.copyWith((message) => updates(message as UpgradeLimit))\n          as UpgradeLimit;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UpgradeLimit create() => UpgradeLimit._();\n  @$core.override\n  UpgradeLimit createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UpgradeLimit getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UpgradeLimit>(create);\n  static UpgradeLimit? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get code => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set code($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCode() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCode() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get message => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set message($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMessage() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMessage() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get image => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set image($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasImage() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearImage() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  UpgradeButton get button => $_getN(3);\n  @$pb.TagNumber(4)\n  set button(UpgradeButton value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasButton() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearButton() => $_clearField(4);\n  @$pb.TagNumber(4)\n  UpgradeButton ensureButton() => $_ensure(3);\n}\n\nclass VideoInfo extends $pb.GeneratedMessage {\n  factory VideoInfo({\n    $core.int? quality,\n    $core.String? format,\n    $fixnum.Int64? timelength,\n    $core.int? videoCodecid,\n    $core.Iterable<Stream>? streamList,\n    $core.Iterable<DashItem>? dashAudio,\n    DolbyItem? dolby,\n    VolumeInfo? volume,\n    LossLessItem? lossLessItem,\n    $fixnum.Int64? mainTimelength,\n  }) {\n    final result = create();\n    if (quality != null) result.quality = quality;\n    if (format != null) result.format = format;\n    if (timelength != null) result.timelength = timelength;\n    if (videoCodecid != null) result.videoCodecid = videoCodecid;\n    if (streamList != null) result.streamList.addAll(streamList);\n    if (dashAudio != null) result.dashAudio.addAll(dashAudio);\n    if (dolby != null) result.dolby = dolby;\n    if (volume != null) result.volume = volume;\n    if (lossLessItem != null) result.lossLessItem = lossLessItem;\n    if (mainTimelength != null) result.mainTimelength = mainTimelength;\n    return result;\n  }\n\n  VideoInfo._();\n\n  factory VideoInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory VideoInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'VideoInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'quality')\n    ..aOS(2, _omitFieldNames ? '' : 'format')\n    ..aInt64(3, _omitFieldNames ? '' : 'timelength')\n    ..aI(4, _omitFieldNames ? '' : 'videoCodecid')\n    ..pPM<Stream>(5, _omitFieldNames ? '' : 'streamList',\n        subBuilder: Stream.create)\n    ..pPM<DashItem>(6, _omitFieldNames ? '' : 'dashAudio',\n        subBuilder: DashItem.create)\n    ..aOM<DolbyItem>(7, _omitFieldNames ? '' : 'dolby',\n        subBuilder: DolbyItem.create)\n    ..aOM<VolumeInfo>(8, _omitFieldNames ? '' : 'volume',\n        subBuilder: VolumeInfo.create)\n    ..aOM<LossLessItem>(9, _omitFieldNames ? '' : 'lossLessItem',\n        subBuilder: LossLessItem.create)\n    ..aInt64(10, _omitFieldNames ? '' : 'mainTimelength')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VideoInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VideoInfo copyWith(void Function(VideoInfo) updates) =>\n      super.copyWith((message) => updates(message as VideoInfo)) as VideoInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static VideoInfo create() => VideoInfo._();\n  @$core.override\n  VideoInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static VideoInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<VideoInfo>(create);\n  static VideoInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get quality => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set quality($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasQuality() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearQuality() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get format => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set format($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFormat() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFormat() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get timelength => $_getI64(2);\n  @$pb.TagNumber(3)\n  set timelength($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTimelength() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTimelength() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get videoCodecid => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set videoCodecid($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasVideoCodecid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearVideoCodecid() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $pb.PbList<Stream> get streamList => $_getList(4);\n\n  @$pb.TagNumber(6)\n  $pb.PbList<DashItem> get dashAudio => $_getList(5);\n\n  @$pb.TagNumber(7)\n  DolbyItem get dolby => $_getN(6);\n  @$pb.TagNumber(7)\n  set dolby(DolbyItem value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasDolby() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearDolby() => $_clearField(7);\n  @$pb.TagNumber(7)\n  DolbyItem ensureDolby() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  VolumeInfo get volume => $_getN(7);\n  @$pb.TagNumber(8)\n  set volume(VolumeInfo value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasVolume() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearVolume() => $_clearField(8);\n  @$pb.TagNumber(8)\n  VolumeInfo ensureVolume() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  LossLessItem get lossLessItem => $_getN(8);\n  @$pb.TagNumber(9)\n  set lossLessItem(LossLessItem value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasLossLessItem() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearLossLessItem() => $_clearField(9);\n  @$pb.TagNumber(9)\n  LossLessItem ensureLossLessItem() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  $fixnum.Int64 get mainTimelength => $_getI64(9);\n  @$pb.TagNumber(10)\n  set mainTimelength($fixnum.Int64 value) => $_setInt64(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasMainTimelength() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearMainTimelength() => $_clearField(10);\n}\n\nclass ViewInfo extends $pb.GeneratedMessage {\n  factory ViewInfo({\n    $core.Iterable<$core.MapEntry<$core.String, Dialog>>? dialogMap,\n    PromptBar? promptBar,\n    $core.Iterable<ComprehensiveToast>? toasts,\n  }) {\n    final result = create();\n    if (dialogMap != null) result.dialogMap.addEntries(dialogMap);\n    if (promptBar != null) result.promptBar = promptBar;\n    if (toasts != null) result.toasts.addAll(toasts);\n    return result;\n  }\n\n  ViewInfo._();\n\n  factory ViewInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ViewInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ViewInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..m<$core.String, Dialog>(1, _omitFieldNames ? '' : 'dialogMap',\n        entryClassName: 'ViewInfo.DialogMapEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OM,\n        valueCreator: Dialog.create,\n        valueDefaultOrMaker: Dialog.getDefault,\n        packageName: const $pb.PackageName('bilibili.app.playurl.v1'))\n    ..aOM<PromptBar>(2, _omitFieldNames ? '' : 'promptBar',\n        subBuilder: PromptBar.create)\n    ..pPM<ComprehensiveToast>(3, _omitFieldNames ? '' : 'toasts',\n        subBuilder: ComprehensiveToast.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ViewInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ViewInfo copyWith(void Function(ViewInfo) updates) =>\n      super.copyWith((message) => updates(message as ViewInfo)) as ViewInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ViewInfo create() => ViewInfo._();\n  @$core.override\n  ViewInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ViewInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ViewInfo>(create);\n  static ViewInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbMap<$core.String, Dialog> get dialogMap => $_getMap(0);\n\n  @$pb.TagNumber(2)\n  PromptBar get promptBar => $_getN(1);\n  @$pb.TagNumber(2)\n  set promptBar(PromptBar value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPromptBar() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPromptBar() => $_clearField(2);\n  @$pb.TagNumber(2)\n  PromptBar ensurePromptBar() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<ComprehensiveToast> get toasts => $_getList(2);\n}\n\nclass VipRisk extends $pb.GeneratedMessage {\n  factory VipRisk({\n    $core.bool? allow,\n    $fixnum.Int64? type,\n    $fixnum.Int64? reason,\n    $fixnum.Int64? deviceStatus,\n  }) {\n    final result = create();\n    if (allow != null) result.allow = allow;\n    if (type != null) result.type = type;\n    if (reason != null) result.reason = reason;\n    if (deviceStatus != null) result.deviceStatus = deviceStatus;\n    return result;\n  }\n\n  VipRisk._();\n\n  factory VipRisk.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory VipRisk.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'VipRisk',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'allow')\n    ..aInt64(2, _omitFieldNames ? '' : 'type')\n    ..aInt64(3, _omitFieldNames ? '' : 'reason')\n    ..aInt64(4, _omitFieldNames ? '' : 'deviceStatus')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VipRisk clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VipRisk copyWith(void Function(VipRisk) updates) =>\n      super.copyWith((message) => updates(message as VipRisk)) as VipRisk;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static VipRisk create() => VipRisk._();\n  @$core.override\n  VipRisk createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static VipRisk getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<VipRisk>(create);\n  static VipRisk? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get allow => $_getBF(0);\n  @$pb.TagNumber(1)\n  set allow($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAllow() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAllow() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get type => $_getI64(1);\n  @$pb.TagNumber(2)\n  set type($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get reason => $_getI64(2);\n  @$pb.TagNumber(3)\n  set reason($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasReason() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearReason() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get deviceStatus => $_getI64(3);\n  @$pb.TagNumber(4)\n  set deviceStatus($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDeviceStatus() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDeviceStatus() => $_clearField(4);\n}\n\nclass VolumeInfo extends $pb.GeneratedMessage {\n  factory VolumeInfo({\n    $core.double? measuredI,\n    $core.double? measuredLra,\n    $core.double? measuredTp,\n    $core.double? measuredThreshold,\n    $core.double? targetOffset,\n    $core.double? targetI,\n    $core.double? targetTp,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? multiSceneArgs,\n  }) {\n    final result = create();\n    if (measuredI != null) result.measuredI = measuredI;\n    if (measuredLra != null) result.measuredLra = measuredLra;\n    if (measuredTp != null) result.measuredTp = measuredTp;\n    if (measuredThreshold != null) result.measuredThreshold = measuredThreshold;\n    if (targetOffset != null) result.targetOffset = targetOffset;\n    if (targetI != null) result.targetI = targetI;\n    if (targetTp != null) result.targetTp = targetTp;\n    if (multiSceneArgs != null)\n      result.multiSceneArgs.addEntries(multiSceneArgs);\n    return result;\n  }\n\n  VolumeInfo._();\n\n  factory VolumeInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory VolumeInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'VolumeInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.playurl.v1'),\n      createEmptyInstance: create)\n    ..aD(1, _omitFieldNames ? '' : 'measuredI')\n    ..aD(2, _omitFieldNames ? '' : 'measuredLra')\n    ..aD(3, _omitFieldNames ? '' : 'measuredTp')\n    ..aD(4, _omitFieldNames ? '' : 'measuredThreshold')\n    ..aD(5, _omitFieldNames ? '' : 'targetOffset')\n    ..aD(6, _omitFieldNames ? '' : 'targetI')\n    ..aD(7, _omitFieldNames ? '' : 'targetTp')\n    ..m<$core.String, $core.String>(8, _omitFieldNames ? '' : 'multiSceneArgs',\n        entryClassName: 'VolumeInfo.MultiSceneArgsEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.playurl.v1'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VolumeInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VolumeInfo copyWith(void Function(VolumeInfo) updates) =>\n      super.copyWith((message) => updates(message as VolumeInfo)) as VolumeInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static VolumeInfo create() => VolumeInfo._();\n  @$core.override\n  VolumeInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static VolumeInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<VolumeInfo>(create);\n  static VolumeInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.double get measuredI => $_getN(0);\n  @$pb.TagNumber(1)\n  set measuredI($core.double value) => $_setDouble(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMeasuredI() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMeasuredI() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.double get measuredLra => $_getN(1);\n  @$pb.TagNumber(2)\n  set measuredLra($core.double value) => $_setDouble(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMeasuredLra() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMeasuredLra() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.double get measuredTp => $_getN(2);\n  @$pb.TagNumber(3)\n  set measuredTp($core.double value) => $_setDouble(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasMeasuredTp() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearMeasuredTp() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.double get measuredThreshold => $_getN(3);\n  @$pb.TagNumber(4)\n  set measuredThreshold($core.double value) => $_setDouble(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasMeasuredThreshold() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearMeasuredThreshold() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.double get targetOffset => $_getN(4);\n  @$pb.TagNumber(5)\n  set targetOffset($core.double value) => $_setDouble(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasTargetOffset() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearTargetOffset() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.double get targetI => $_getN(5);\n  @$pb.TagNumber(6)\n  set targetI($core.double value) => $_setDouble(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasTargetI() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearTargetI() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.double get targetTp => $_getN(6);\n  @$pb.TagNumber(7)\n  set targetTp($core.double value) => $_setDouble(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasTargetTp() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearTargetTp() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $pb.PbMap<$core.String, $core.String> get multiSceneArgs => $_getMap(7);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/playurl/v1.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/playurl/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nclass Business extends $pb.ProtobufEnum {\n  static const Business UNKNOWN =\n      Business._(0, _omitEnumNames ? '' : 'UNKNOWN');\n  static const Business STORY = Business._(1, _omitEnumNames ? '' : 'STORY');\n\n  static const $core.List<Business> values = <Business>[\n    UNKNOWN,\n    STORY,\n  ];\n\n  static final $core.List<Business?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static Business? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const Business._(super.value, super.name);\n}\n\nclass ButtonAction extends $pb.ProtobufEnum {\n  static const ButtonAction BUTTON_UNKNOWN =\n      ButtonAction._(0, _omitEnumNames ? '' : 'BUTTON_UNKNOWN');\n  static const ButtonAction CHARGINGPLUS =\n      ButtonAction._(1, _omitEnumNames ? '' : 'CHARGINGPLUS');\n\n  static const $core.List<ButtonAction> values = <ButtonAction>[\n    BUTTON_UNKNOWN,\n    CHARGINGPLUS,\n  ];\n\n  static final $core.List<ButtonAction?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static ButtonAction? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ButtonAction._(super.value, super.name);\n}\n\nclass CodeType extends $pb.ProtobufEnum {\n  static const CodeType NOCODE = CodeType._(0, _omitEnumNames ? '' : 'NOCODE');\n  static const CodeType CODE264 =\n      CodeType._(1, _omitEnumNames ? '' : 'CODE264');\n  static const CodeType CODE265 =\n      CodeType._(2, _omitEnumNames ? '' : 'CODE265');\n  static const CodeType CODEAV1 =\n      CodeType._(3, _omitEnumNames ? '' : 'CODEAV1');\n\n  static const $core.List<CodeType> values = <CodeType>[\n    NOCODE,\n    CODE264,\n    CODE265,\n    CODEAV1,\n  ];\n\n  static final $core.List<CodeType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static CodeType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const CodeType._(super.value, super.name);\n}\n\nclass ConfType extends $pb.ProtobufEnum {\n  static const ConfType NoType = ConfType._(0, _omitEnumNames ? '' : 'NoType');\n  static const ConfType FLIPCONF =\n      ConfType._(1, _omitEnumNames ? '' : 'FLIPCONF');\n  static const ConfType CASTCONF =\n      ConfType._(2, _omitEnumNames ? '' : 'CASTCONF');\n  static const ConfType FEEDBACK =\n      ConfType._(3, _omitEnumNames ? '' : 'FEEDBACK');\n  static const ConfType SUBTITLE =\n      ConfType._(4, _omitEnumNames ? '' : 'SUBTITLE');\n  static const ConfType PLAYBACKRATE =\n      ConfType._(5, _omitEnumNames ? '' : 'PLAYBACKRATE');\n  static const ConfType TIMEUP = ConfType._(6, _omitEnumNames ? '' : 'TIMEUP');\n  static const ConfType PLAYBACKMODE =\n      ConfType._(7, _omitEnumNames ? '' : 'PLAYBACKMODE');\n  static const ConfType SCALEMODE =\n      ConfType._(8, _omitEnumNames ? '' : 'SCALEMODE');\n  static const ConfType BACKGROUNDPLAY =\n      ConfType._(9, _omitEnumNames ? '' : 'BACKGROUNDPLAY');\n  static const ConfType LIKE = ConfType._(10, _omitEnumNames ? '' : 'LIKE');\n  static const ConfType DISLIKE =\n      ConfType._(11, _omitEnumNames ? '' : 'DISLIKE');\n  static const ConfType COIN = ConfType._(12, _omitEnumNames ? '' : 'COIN');\n  static const ConfType ELEC = ConfType._(13, _omitEnumNames ? '' : 'ELEC');\n  static const ConfType SHARE = ConfType._(14, _omitEnumNames ? '' : 'SHARE');\n  static const ConfType SCREENSHOT =\n      ConfType._(15, _omitEnumNames ? '' : 'SCREENSHOT');\n  static const ConfType LOCKSCREEN =\n      ConfType._(16, _omitEnumNames ? '' : 'LOCKSCREEN');\n  static const ConfType RECOMMEND =\n      ConfType._(17, _omitEnumNames ? '' : 'RECOMMEND');\n  static const ConfType PLAYBACKSPEED =\n      ConfType._(18, _omitEnumNames ? '' : 'PLAYBACKSPEED');\n  static const ConfType DEFINITION =\n      ConfType._(19, _omitEnumNames ? '' : 'DEFINITION');\n  static const ConfType SELECTIONS =\n      ConfType._(20, _omitEnumNames ? '' : 'SELECTIONS');\n  static const ConfType NEXT = ConfType._(21, _omitEnumNames ? '' : 'NEXT');\n  static const ConfType EDITDM = ConfType._(22, _omitEnumNames ? '' : 'EDITDM');\n  static const ConfType SMALLWINDOW =\n      ConfType._(23, _omitEnumNames ? '' : 'SMALLWINDOW');\n  static const ConfType SHAKE = ConfType._(24, _omitEnumNames ? '' : 'SHAKE');\n  static const ConfType OUTERDM =\n      ConfType._(25, _omitEnumNames ? '' : 'OUTERDM');\n  static const ConfType INNERDM =\n      ConfType._(26, _omitEnumNames ? '' : 'INNERDM');\n  static const ConfType PANORAMA =\n      ConfType._(27, _omitEnumNames ? '' : 'PANORAMA');\n  static const ConfType DOLBY = ConfType._(28, _omitEnumNames ? '' : 'DOLBY');\n  static const ConfType COLORFILTER =\n      ConfType._(29, _omitEnumNames ? '' : 'COLORFILTER');\n  static const ConfType LOSSLESS =\n      ConfType._(30, _omitEnumNames ? '' : 'LOSSLESS');\n\n  static const $core.List<ConfType> values = <ConfType>[\n    NoType,\n    FLIPCONF,\n    CASTCONF,\n    FEEDBACK,\n    SUBTITLE,\n    PLAYBACKRATE,\n    TIMEUP,\n    PLAYBACKMODE,\n    SCALEMODE,\n    BACKGROUNDPLAY,\n    LIKE,\n    DISLIKE,\n    COIN,\n    ELEC,\n    SHARE,\n    SCREENSHOT,\n    LOCKSCREEN,\n    RECOMMEND,\n    PLAYBACKSPEED,\n    DEFINITION,\n    SELECTIONS,\n    NEXT,\n    EDITDM,\n    SMALLWINDOW,\n    SHAKE,\n    OUTERDM,\n    INNERDM,\n    PANORAMA,\n    DOLBY,\n    COLORFILTER,\n    LOSSLESS,\n  ];\n\n  static final $core.List<ConfType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 30);\n  static ConfType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ConfType._(super.value, super.name);\n}\n\nclass Group extends $pb.ProtobufEnum {\n  static const Group UnknownGroup =\n      Group._(0, _omitEnumNames ? '' : 'UnknownGroup');\n  static const Group A = Group._(1, _omitEnumNames ? '' : 'A');\n  static const Group B = Group._(2, _omitEnumNames ? '' : 'B');\n  static const Group C = Group._(3, _omitEnumNames ? '' : 'C');\n\n  static const $core.List<Group> values = <Group>[\n    UnknownGroup,\n    A,\n    B,\n    C,\n  ];\n\n  static final $core.List<Group?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static Group? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const Group._(super.value, super.name);\n}\n\nclass GuideStyle extends $pb.ProtobufEnum {\n  static const GuideStyle STYLE_UNKNOWN =\n      GuideStyle._(0, _omitEnumNames ? '' : 'STYLE_UNKNOWN');\n  static const GuideStyle CHARGING_TEXT =\n      GuideStyle._(1, _omitEnumNames ? '' : 'CHARGING_TEXT');\n\n  static const $core.List<GuideStyle> values = <GuideStyle>[\n    STYLE_UNKNOWN,\n    CHARGING_TEXT,\n  ];\n\n  static final $core.List<GuideStyle?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static GuideStyle? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const GuideStyle._(super.value, super.name);\n}\n\nclass PlayErr extends $pb.ProtobufEnum {\n  static const PlayErr NoErr = PlayErr._(0, _omitEnumNames ? '' : 'NoErr');\n  static const PlayErr WithMultiDeviceLoginErr =\n      PlayErr._(1, _omitEnumNames ? '' : 'WithMultiDeviceLoginErr');\n\n  static const $core.List<PlayErr> values = <PlayErr>[\n    NoErr,\n    WithMultiDeviceLoginErr,\n  ];\n\n  static final $core.List<PlayErr?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static PlayErr? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const PlayErr._(super.value, super.name);\n}\n\nclass PlayLimitCode extends $pb.ProtobufEnum {\n  static const PlayLimitCode PLCUnkown =\n      PlayLimitCode._(0, _omitEnumNames ? '' : 'PLCUnkown');\n  static const PlayLimitCode PLCUgcNotPayed =\n      PlayLimitCode._(1, _omitEnumNames ? '' : 'PLCUgcNotPayed');\n  static const PlayLimitCode PLCChargingPlusNotPass =\n      PlayLimitCode._(2, _omitEnumNames ? '' : 'PLCChargingPlusNotPass');\n  static const PlayLimitCode PLCChargingPlusUpgrade =\n      PlayLimitCode._(3, _omitEnumNames ? '' : 'PLCChargingPlusUpgrade');\n\n  static const $core.List<PlayLimitCode> values = <PlayLimitCode>[\n    PLCUnkown,\n    PLCUgcNotPayed,\n    PLCChargingPlusNotPass,\n    PLCChargingPlusUpgrade,\n  ];\n\n  static final $core.List<PlayLimitCode?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static PlayLimitCode? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const PlayLimitCode._(super.value, super.name);\n}\n\nclass ToastType extends $pb.ProtobufEnum {\n  static const ToastType TOAST_TYPE_UNKNOWN =\n      ToastType._(0, _omitEnumNames ? '' : 'TOAST_TYPE_UNKNOWN');\n  static const ToastType CHARGING_TOAST =\n      ToastType._(1, _omitEnumNames ? '' : 'CHARGING_TOAST');\n\n  static const $core.List<ToastType> values = <ToastType>[\n    TOAST_TYPE_UNKNOWN,\n    CHARGING_TOAST,\n  ];\n\n  static final $core.List<ToastType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static ToastType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ToastType._(super.value, super.name);\n}\n\nclass VideoType extends $pb.ProtobufEnum {\n  static const VideoType Unknown =\n      VideoType._(0, _omitEnumNames ? '' : 'Unknown');\n  static const VideoType FLV = VideoType._(1, _omitEnumNames ? '' : 'FLV');\n  static const VideoType DASH = VideoType._(2, _omitEnumNames ? '' : 'DASH');\n  static const VideoType MP4 = VideoType._(3, _omitEnumNames ? '' : 'MP4');\n\n  static const $core.List<VideoType> values = <VideoType>[\n    Unknown,\n    FLV,\n    DASH,\n    MP4,\n  ];\n\n  static final $core.List<VideoType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static VideoType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const VideoType._(super.value, super.name);\n}\n\nclass DolbyItem_Type extends $pb.ProtobufEnum {\n  static const DolbyItem_Type NONE =\n      DolbyItem_Type._(0, _omitEnumNames ? '' : 'NONE');\n  static const DolbyItem_Type COMMON =\n      DolbyItem_Type._(1, _omitEnumNames ? '' : 'COMMON');\n  static const DolbyItem_Type ATMOS =\n      DolbyItem_Type._(2, _omitEnumNames ? '' : 'ATMOS');\n\n  static const $core.List<DolbyItem_Type> values = <DolbyItem_Type>[\n    NONE,\n    COMMON,\n    ATMOS,\n  ];\n\n  static final $core.List<DolbyItem_Type?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static DolbyItem_Type? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const DolbyItem_Type._(super.value, super.name);\n}\n\nclass Scheme_ActionType extends $pb.ProtobufEnum {\n  static const Scheme_ActionType UNKNOWN_ActionType =\n      Scheme_ActionType._(0, _omitEnumNames ? '' : 'UNKNOWN_ActionType');\n  static const Scheme_ActionType SHOW_TOAST =\n      Scheme_ActionType._(1, _omitEnumNames ? '' : 'SHOW_TOAST');\n\n  static const $core.List<Scheme_ActionType> values = <Scheme_ActionType>[\n    UNKNOWN_ActionType,\n    SHOW_TOAST,\n  ];\n\n  static final $core.List<Scheme_ActionType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static Scheme_ActionType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const Scheme_ActionType._(super.value, super.name);\n}\n\nconst $core.bool _omitEnumNames =\n    $core.bool.fromEnvironment('protobuf.omit_enum_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/playurl/v1.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/playurl/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use businessDescriptor instead')\nconst Business$json = {\n  '1': 'Business',\n  '2': [\n    {'1': 'UNKNOWN', '2': 0},\n    {'1': 'STORY', '2': 1},\n  ],\n};\n\n/// Descriptor for `Business`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List businessDescriptor =\n    $convert.base64Decode('CghCdXNpbmVzcxILCgdVTktOT1dOEAASCQoFU1RPUlkQAQ==');\n\n@$core.Deprecated('Use buttonActionDescriptor instead')\nconst ButtonAction$json = {\n  '1': 'ButtonAction',\n  '2': [\n    {'1': 'BUTTON_UNKNOWN', '2': 0},\n    {'1': 'CHARGINGPLUS', '2': 1},\n  ],\n};\n\n/// Descriptor for `ButtonAction`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List buttonActionDescriptor = $convert.base64Decode(\n    'CgxCdXR0b25BY3Rpb24SEgoOQlVUVE9OX1VOS05PV04QABIQCgxDSEFSR0lOR1BMVVMQAQ==');\n\n@$core.Deprecated('Use codeTypeDescriptor instead')\nconst CodeType$json = {\n  '1': 'CodeType',\n  '2': [\n    {'1': 'NOCODE', '2': 0},\n    {'1': 'CODE264', '2': 1},\n    {'1': 'CODE265', '2': 2},\n    {'1': 'CODEAV1', '2': 3},\n  ],\n};\n\n/// Descriptor for `CodeType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List codeTypeDescriptor = $convert.base64Decode(\n    'CghDb2RlVHlwZRIKCgZOT0NPREUQABILCgdDT0RFMjY0EAESCwoHQ09ERTI2NRACEgsKB0NPRE'\n    'VBVjEQAw==');\n\n@$core.Deprecated('Use confTypeDescriptor instead')\nconst ConfType$json = {\n  '1': 'ConfType',\n  '2': [\n    {'1': 'NoType', '2': 0},\n    {'1': 'FLIPCONF', '2': 1},\n    {'1': 'CASTCONF', '2': 2},\n    {'1': 'FEEDBACK', '2': 3},\n    {'1': 'SUBTITLE', '2': 4},\n    {'1': 'PLAYBACKRATE', '2': 5},\n    {'1': 'TIMEUP', '2': 6},\n    {'1': 'PLAYBACKMODE', '2': 7},\n    {'1': 'SCALEMODE', '2': 8},\n    {'1': 'BACKGROUNDPLAY', '2': 9},\n    {'1': 'LIKE', '2': 10},\n    {'1': 'DISLIKE', '2': 11},\n    {'1': 'COIN', '2': 12},\n    {'1': 'ELEC', '2': 13},\n    {'1': 'SHARE', '2': 14},\n    {'1': 'SCREENSHOT', '2': 15},\n    {'1': 'LOCKSCREEN', '2': 16},\n    {'1': 'RECOMMEND', '2': 17},\n    {'1': 'PLAYBACKSPEED', '2': 18},\n    {'1': 'DEFINITION', '2': 19},\n    {'1': 'SELECTIONS', '2': 20},\n    {'1': 'NEXT', '2': 21},\n    {'1': 'EDITDM', '2': 22},\n    {'1': 'SMALLWINDOW', '2': 23},\n    {'1': 'SHAKE', '2': 24},\n    {'1': 'OUTERDM', '2': 25},\n    {'1': 'INNERDM', '2': 26},\n    {'1': 'PANORAMA', '2': 27},\n    {'1': 'DOLBY', '2': 28},\n    {'1': 'COLORFILTER', '2': 29},\n    {'1': 'LOSSLESS', '2': 30},\n  ],\n};\n\n/// Descriptor for `ConfType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List confTypeDescriptor = $convert.base64Decode(\n    'CghDb25mVHlwZRIKCgZOb1R5cGUQABIMCghGTElQQ09ORhABEgwKCENBU1RDT05GEAISDAoIRk'\n    'VFREJBQ0sQAxIMCghTVUJUSVRMRRAEEhAKDFBMQVlCQUNLUkFURRAFEgoKBlRJTUVVUBAGEhAK'\n    'DFBMQVlCQUNLTU9ERRAHEg0KCVNDQUxFTU9ERRAIEhIKDkJBQ0tHUk9VTkRQTEFZEAkSCAoETE'\n    'lLRRAKEgsKB0RJU0xJS0UQCxIICgRDT0lOEAwSCAoERUxFQxANEgkKBVNIQVJFEA4SDgoKU0NS'\n    'RUVOU0hPVBAPEg4KCkxPQ0tTQ1JFRU4QEBINCglSRUNPTU1FTkQQERIRCg1QTEFZQkFDS1NQRU'\n    'VEEBISDgoKREVGSU5JVElPThATEg4KClNFTEVDVElPTlMQFBIICgRORVhUEBUSCgoGRURJVERN'\n    'EBYSDwoLU01BTExXSU5ET1cQFxIJCgVTSEFLRRAYEgsKB09VVEVSRE0QGRILCgdJTk5FUkRNEB'\n    'oSDAoIUEFOT1JBTUEQGxIJCgVET0xCWRAcEg8KC0NPTE9SRklMVEVSEB0SDAoITE9TU0xFU1MQ'\n    'Hg==');\n\n@$core.Deprecated('Use groupDescriptor instead')\nconst Group$json = {\n  '1': 'Group',\n  '2': [\n    {'1': 'UnknownGroup', '2': 0},\n    {'1': 'A', '2': 1},\n    {'1': 'B', '2': 2},\n    {'1': 'C', '2': 3},\n  ],\n};\n\n/// Descriptor for `Group`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List groupDescriptor = $convert.base64Decode(\n    'CgVHcm91cBIQCgxVbmtub3duR3JvdXAQABIFCgFBEAESBQoBQhACEgUKAUMQAw==');\n\n@$core.Deprecated('Use guideStyleDescriptor instead')\nconst GuideStyle$json = {\n  '1': 'GuideStyle',\n  '2': [\n    {'1': 'STYLE_UNKNOWN', '2': 0},\n    {'1': 'CHARGING_TEXT', '2': 1},\n  ],\n};\n\n/// Descriptor for `GuideStyle`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List guideStyleDescriptor = $convert.base64Decode(\n    'CgpHdWlkZVN0eWxlEhEKDVNUWUxFX1VOS05PV04QABIRCg1DSEFSR0lOR19URVhUEAE=');\n\n@$core.Deprecated('Use playErrDescriptor instead')\nconst PlayErr$json = {\n  '1': 'PlayErr',\n  '2': [\n    {'1': 'NoErr', '2': 0},\n    {'1': 'WithMultiDeviceLoginErr', '2': 1},\n  ],\n};\n\n/// Descriptor for `PlayErr`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List playErrDescriptor = $convert.base64Decode(\n    'CgdQbGF5RXJyEgkKBU5vRXJyEAASGwoXV2l0aE11bHRpRGV2aWNlTG9naW5FcnIQAQ==');\n\n@$core.Deprecated('Use playLimitCodeDescriptor instead')\nconst PlayLimitCode$json = {\n  '1': 'PlayLimitCode',\n  '2': [\n    {'1': 'PLCUnkown', '2': 0},\n    {'1': 'PLCUgcNotPayed', '2': 1},\n    {'1': 'PLCChargingPlusNotPass', '2': 2},\n    {'1': 'PLCChargingPlusUpgrade', '2': 3},\n  ],\n};\n\n/// Descriptor for `PlayLimitCode`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List playLimitCodeDescriptor = $convert.base64Decode(\n    'Cg1QbGF5TGltaXRDb2RlEg0KCVBMQ1Vua293bhAAEhIKDlBMQ1VnY05vdFBheWVkEAESGgoWUE'\n    'xDQ2hhcmdpbmdQbHVzTm90UGFzcxACEhoKFlBMQ0NoYXJnaW5nUGx1c1VwZ3JhZGUQAw==');\n\n@$core.Deprecated('Use toastTypeDescriptor instead')\nconst ToastType$json = {\n  '1': 'ToastType',\n  '2': [\n    {'1': 'TOAST_TYPE_UNKNOWN', '2': 0},\n    {'1': 'CHARGING_TOAST', '2': 1},\n  ],\n};\n\n/// Descriptor for `ToastType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List toastTypeDescriptor = $convert.base64Decode(\n    'CglUb2FzdFR5cGUSFgoSVE9BU1RfVFlQRV9VTktOT1dOEAASEgoOQ0hBUkdJTkdfVE9BU1QQAQ'\n    '==');\n\n@$core.Deprecated('Use videoTypeDescriptor instead')\nconst VideoType$json = {\n  '1': 'VideoType',\n  '2': [\n    {'1': 'Unknown', '2': 0},\n    {'1': 'FLV', '2': 1},\n    {'1': 'DASH', '2': 2},\n    {'1': 'MP4', '2': 3},\n  ],\n};\n\n/// Descriptor for `VideoType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List videoTypeDescriptor = $convert.base64Decode(\n    'CglWaWRlb1R5cGUSCwoHVW5rbm93bhAAEgcKA0ZMVhABEggKBERBU0gQAhIHCgNNUDQQAw==');\n\n@$core.Deprecated('Use aBDescriptor instead')\nconst AB$json = {\n  '1': 'AB',\n  '2': [\n    {\n      '1': 'glance',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.Glance',\n      '10': 'glance'\n    },\n    {\n      '1': 'group',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.playurl.v1.Group',\n      '10': 'group'\n    },\n  ],\n};\n\n/// Descriptor for `AB`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List aBDescriptor = $convert.base64Decode(\n    'CgJBQhI3CgZnbGFuY2UYASABKAsyHy5iaWxpYmlsaS5hcHAucGxheXVybC52MS5HbGFuY2VSBm'\n    'dsYW5jZRI0CgVncm91cBgCIAEoDjIeLmJpbGliaWxpLmFwcC5wbGF5dXJsLnYxLkdyb3VwUgVn'\n    'cm91cA==');\n\n@$core.Deprecated('Use arcConfDescriptor instead')\nconst ArcConf$json = {\n  '1': 'ArcConf',\n  '2': [\n    {'1': 'is_support', '3': 1, '4': 1, '5': 8, '10': 'isSupport'},\n    {'1': 'disabled', '3': 2, '4': 1, '5': 8, '10': 'disabled'},\n    {\n      '1': 'extra_content',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ExtraContent',\n      '10': 'extraContent'\n    },\n    {'1': 'unsupport_scene', '3': 4, '4': 3, '5': 3, '10': 'unsupportScene'},\n  ],\n};\n\n/// Descriptor for `ArcConf`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List arcConfDescriptor = $convert.base64Decode(\n    'CgdBcmNDb25mEh0KCmlzX3N1cHBvcnQYASABKAhSCWlzU3VwcG9ydBIaCghkaXNhYmxlZBgCIA'\n    'EoCFIIZGlzYWJsZWQSSgoNZXh0cmFfY29udGVudBgDIAEoCzIlLmJpbGliaWxpLmFwcC5wbGF5'\n    'dXJsLnYxLkV4dHJhQ29udGVudFIMZXh0cmFDb250ZW50EicKD3Vuc3VwcG9ydF9zY2VuZRgEIA'\n    'MoA1IOdW5zdXBwb3J0U2NlbmU=');\n\n@$core.Deprecated('Use buttonInfoDescriptor instead')\nconst ButtonInfo$json = {\n  '1': 'ButtonInfo',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'text_color', '3': 2, '4': 1, '5': 9, '10': 'textColor'},\n    {'1': 'text_color_night', '3': 3, '4': 1, '5': 9, '10': 'textColorNight'},\n    {'1': 'bg_color', '3': 4, '4': 1, '5': 9, '10': 'bgColor'},\n    {'1': 'bg_color_night', '3': 5, '4': 1, '5': 9, '10': 'bgColorNight'},\n    {'1': 'link', '3': 6, '4': 1, '5': 9, '10': 'link'},\n    {\n      '1': 'action_type',\n      '3': 7,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.playurl.v1.ButtonAction',\n      '10': 'actionType'\n    },\n    {\n      '1': 'report',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.Report',\n      '10': 'report'\n    },\n    {'1': 'frame_color', '3': 9, '4': 1, '5': 9, '10': 'frameColor'},\n    {'1': 'icon', '3': 10, '4': 1, '5': 9, '10': 'icon'},\n  ],\n};\n\n/// Descriptor for `ButtonInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List buttonInfoDescriptor = $convert.base64Decode(\n    'CgpCdXR0b25JbmZvEhIKBHRleHQYASABKAlSBHRleHQSHQoKdGV4dF9jb2xvchgCIAEoCVIJdG'\n    'V4dENvbG9yEigKEHRleHRfY29sb3JfbmlnaHQYAyABKAlSDnRleHRDb2xvck5pZ2h0EhkKCGJn'\n    'X2NvbG9yGAQgASgJUgdiZ0NvbG9yEiQKDmJnX2NvbG9yX25pZ2h0GAUgASgJUgxiZ0NvbG9yTm'\n    'lnaHQSEgoEbGluaxgGIAEoCVIEbGluaxJGCgthY3Rpb25fdHlwZRgHIAEoDjIlLmJpbGliaWxp'\n    'LmFwcC5wbGF5dXJsLnYxLkJ1dHRvbkFjdGlvblIKYWN0aW9uVHlwZRI3CgZyZXBvcnQYCCABKA'\n    'syHy5iaWxpYmlsaS5hcHAucGxheXVybC52MS5SZXBvcnRSBnJlcG9ydBIfCgtmcmFtZV9jb2xv'\n    'chgJIAEoCVIKZnJhbWVDb2xvchISCgRpY29uGAogASgJUgRpY29u');\n\n@$core.Deprecated('Use buttonStyleDescriptor instead')\nconst ButtonStyle$json = {\n  '1': 'ButtonStyle',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'text_color', '3': 2, '4': 1, '5': 9, '10': 'textColor'},\n    {'1': 'bg_color', '3': 3, '4': 1, '5': 9, '10': 'bgColor'},\n    {'1': 'jump_link', '3': 4, '4': 1, '5': 9, '10': 'jumpLink'},\n  ],\n};\n\n/// Descriptor for `ButtonStyle`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List buttonStyleDescriptor = $convert.base64Decode(\n    'CgtCdXR0b25TdHlsZRISCgR0ZXh0GAEgASgJUgR0ZXh0Eh0KCnRleHRfY29sb3IYAiABKAlSCX'\n    'RleHRDb2xvchIZCghiZ19jb2xvchgDIAEoCVIHYmdDb2xvchIbCglqdW1wX2xpbmsYBCABKAlS'\n    'CGp1bXBMaW5r');\n\n@$core.Deprecated('Use chronosDescriptor instead')\nconst Chronos$json = {\n  '1': 'Chronos',\n  '2': [\n    {'1': 'md5', '3': 1, '4': 1, '5': 9, '10': 'md5'},\n    {'1': 'file', '3': 2, '4': 1, '5': 9, '10': 'file'},\n  ],\n};\n\n/// Descriptor for `Chronos`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List chronosDescriptor = $convert.base64Decode(\n    'CgdDaHJvbm9zEhAKA21kNRgBIAEoCVIDbWQ1EhIKBGZpbGUYAiABKAlSBGZpbGU=');\n\n@$core.Deprecated('Use cloudConfDescriptor instead')\nconst CloudConf$json = {\n  '1': 'CloudConf',\n  '2': [\n    {'1': 'show', '3': 1, '4': 1, '5': 8, '10': 'show'},\n    {\n      '1': 'conf_type',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.playurl.v1.ConfType',\n      '10': 'confType'\n    },\n    {\n      '1': 'field_value',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.FieldValue',\n      '10': 'fieldValue'\n    },\n    {\n      '1': 'conf_value',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ConfValue',\n      '10': 'confValue'\n    },\n  ],\n};\n\n/// Descriptor for `CloudConf`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cloudConfDescriptor = $convert.base64Decode(\n    'CglDbG91ZENvbmYSEgoEc2hvdxgBIAEoCFIEc2hvdxI+Cgljb25mX3R5cGUYAiABKA4yIS5iaW'\n    'xpYmlsaS5hcHAucGxheXVybC52MS5Db25mVHlwZVIIY29uZlR5cGUSRAoLZmllbGRfdmFsdWUY'\n    'AyABKAsyIy5iaWxpYmlsaS5hcHAucGxheXVybC52MS5GaWVsZFZhbHVlUgpmaWVsZFZhbHVlEk'\n    'EKCmNvbmZfdmFsdWUYBCABKAsyIi5iaWxpYmlsaS5hcHAucGxheXVybC52MS5Db25mVmFsdWVS'\n    'CWNvbmZWYWx1ZQ==');\n\n@$core.Deprecated('Use comprehensiveToastDescriptor instead')\nconst ComprehensiveToast$json = {\n  '1': 'ComprehensiveToast',\n  '2': [\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.playurl.v1.ToastType',\n      '10': 'type'\n    },\n    {\n      '1': 'button',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ButtonInfo',\n      '10': 'button'\n    },\n    {'1': 'icon', '3': 3, '4': 1, '5': 9, '10': 'icon'},\n    {\n      '1': 'toast_text',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.TextInfo',\n      '10': 'toastText'\n    },\n    {\n      '1': 'report',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.Report',\n      '10': 'report'\n    },\n  ],\n};\n\n/// Descriptor for `ComprehensiveToast`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List comprehensiveToastDescriptor = $convert.base64Decode(\n    'ChJDb21wcmVoZW5zaXZlVG9hc3QSNgoEdHlwZRgBIAEoDjIiLmJpbGliaWxpLmFwcC5wbGF5dX'\n    'JsLnYxLlRvYXN0VHlwZVIEdHlwZRI7CgZidXR0b24YAiABKAsyIy5iaWxpYmlsaS5hcHAucGxh'\n    'eXVybC52MS5CdXR0b25JbmZvUgZidXR0b24SEgoEaWNvbhgDIAEoCVIEaWNvbhJACgp0b2FzdF'\n    '90ZXh0GAQgASgLMiEuYmlsaWJpbGkuYXBwLnBsYXl1cmwudjEuVGV4dEluZm9SCXRvYXN0VGV4'\n    'dBI3CgZyZXBvcnQYBSABKAsyHy5iaWxpYmlsaS5hcHAucGxheXVybC52MS5SZXBvcnRSBnJlcG'\n    '9ydA==');\n\n@$core.Deprecated('Use confValueDescriptor instead')\nconst ConfValue$json = {\n  '1': 'ConfValue',\n  '2': [\n    {'1': 'switch_val', '3': 1, '4': 1, '5': 8, '9': 0, '10': 'switchVal'},\n    {'1': 'selected_val', '3': 2, '4': 1, '5': 3, '9': 0, '10': 'selectedVal'},\n  ],\n  '8': [\n    {'1': 'value'},\n  ],\n};\n\n/// Descriptor for `ConfValue`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List confValueDescriptor = $convert.base64Decode(\n    'CglDb25mVmFsdWUSHwoKc3dpdGNoX3ZhbBgBIAEoCEgAUglzd2l0Y2hWYWwSIwoMc2VsZWN0ZW'\n    'RfdmFsGAIgASgDSABSC3NlbGVjdGVkVmFsQgcKBXZhbHVl');\n\n@$core.Deprecated('Use dashItemDescriptor instead')\nconst DashItem$json = {\n  '1': 'DashItem',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 5, '10': 'id'},\n    {'1': 'base_url', '3': 2, '4': 1, '5': 9, '10': 'baseUrl'},\n    {'1': 'backup_url', '3': 3, '4': 3, '5': 9, '10': 'backupUrl'},\n    {'1': 'bandwidth', '3': 4, '4': 1, '5': 5, '10': 'bandwidth'},\n    {'1': 'codecid', '3': 5, '4': 1, '5': 5, '10': 'codecid'},\n    {'1': 'md5', '3': 6, '4': 1, '5': 9, '10': 'md5'},\n    {'1': 'size', '3': 7, '4': 1, '5': 3, '10': 'size'},\n    {'1': 'frame_rate', '3': 8, '4': 1, '5': 9, '10': 'frameRate'},\n    {'1': 'widevine_pssh', '3': 9, '4': 1, '5': 9, '10': 'widevinePssh'},\n    {'1': 'bilidrm_uri', '3': 10, '4': 1, '5': 9, '10': 'bilidrmUri'},\n  ],\n};\n\n/// Descriptor for `DashItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dashItemDescriptor = $convert.base64Decode(\n    'CghEYXNoSXRlbRIOCgJpZBgBIAEoBVICaWQSGQoIYmFzZV91cmwYAiABKAlSB2Jhc2VVcmwSHQ'\n    'oKYmFja3VwX3VybBgDIAMoCVIJYmFja3VwVXJsEhwKCWJhbmR3aWR0aBgEIAEoBVIJYmFuZHdp'\n    'ZHRoEhgKB2NvZGVjaWQYBSABKAVSB2NvZGVjaWQSEAoDbWQ1GAYgASgJUgNtZDUSEgoEc2l6ZR'\n    'gHIAEoA1IEc2l6ZRIdCgpmcmFtZV9yYXRlGAggASgJUglmcmFtZVJhdGUSIwoNd2lkZXZpbmVf'\n    'cHNzaBgJIAEoCVIMd2lkZXZpbmVQc3NoEh8KC2JpbGlkcm1fdXJpGAogASgJUgpiaWxpZHJtVX'\n    'Jp');\n\n@$core.Deprecated('Use dashVideoDescriptor instead')\nconst DashVideo$json = {\n  '1': 'DashVideo',\n  '2': [\n    {'1': 'base_url', '3': 1, '4': 1, '5': 9, '10': 'baseUrl'},\n    {'1': 'backup_url', '3': 2, '4': 3, '5': 9, '10': 'backupUrl'},\n    {'1': 'bandwidth', '3': 3, '4': 1, '5': 5, '10': 'bandwidth'},\n    {'1': 'codecid', '3': 4, '4': 1, '5': 5, '10': 'codecid'},\n    {'1': 'md5', '3': 5, '4': 1, '5': 9, '10': 'md5'},\n    {'1': 'size', '3': 6, '4': 1, '5': 3, '10': 'size'},\n    {'1': 'audio_id', '3': 7, '4': 1, '5': 5, '10': 'audioId'},\n    {'1': 'no_rexcode', '3': 8, '4': 1, '5': 8, '10': 'noRexcode'},\n    {'1': 'frame_rate', '3': 9, '4': 1, '5': 9, '10': 'frameRate'},\n    {'1': 'width', '3': 10, '4': 1, '5': 5, '10': 'width'},\n    {'1': 'height', '3': 11, '4': 1, '5': 5, '10': 'height'},\n    {'1': 'widevine_pssh', '3': 12, '4': 1, '5': 9, '10': 'widevinePssh'},\n    {'1': 'bilidrm_uri', '3': 13, '4': 1, '5': 9, '10': 'bilidrmUri'},\n  ],\n};\n\n/// Descriptor for `DashVideo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dashVideoDescriptor = $convert.base64Decode(\n    'CglEYXNoVmlkZW8SGQoIYmFzZV91cmwYASABKAlSB2Jhc2VVcmwSHQoKYmFja3VwX3VybBgCIA'\n    'MoCVIJYmFja3VwVXJsEhwKCWJhbmR3aWR0aBgDIAEoBVIJYmFuZHdpZHRoEhgKB2NvZGVjaWQY'\n    'BCABKAVSB2NvZGVjaWQSEAoDbWQ1GAUgASgJUgNtZDUSEgoEc2l6ZRgGIAEoA1IEc2l6ZRIZCg'\n    'hhdWRpb19pZBgHIAEoBVIHYXVkaW9JZBIdCgpub19yZXhjb2RlGAggASgIUglub1JleGNvZGUS'\n    'HQoKZnJhbWVfcmF0ZRgJIAEoCVIJZnJhbWVSYXRlEhQKBXdpZHRoGAogASgFUgV3aWR0aBIWCg'\n    'ZoZWlnaHQYCyABKAVSBmhlaWdodBIjCg13aWRldmluZV9wc3NoGAwgASgJUgx3aWRldmluZVBz'\n    'c2gSHwoLYmlsaWRybV91cmkYDSABKAlSCmJpbGlkcm1Vcmk=');\n\n@$core.Deprecated('Use dialogDescriptor instead')\nconst Dialog$json = {\n  '1': 'Dialog',\n  '2': [\n    {\n      '1': 'style_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.playurl.v1.GuideStyle',\n      '10': 'styleType'\n    },\n    {\n      '1': 'report',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.Report',\n      '10': 'report'\n    },\n    {\n      '1': 'title',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.TextInfo',\n      '10': 'title'\n    },\n    {\n      '1': 'subtitle',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.TextInfo',\n      '10': 'subtitle'\n    },\n    {\n      '1': 'button',\n      '3': 5,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ButtonInfo',\n      '10': 'button'\n    },\n  ],\n};\n\n/// Descriptor for `Dialog`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dialogDescriptor = $convert.base64Decode(\n    'CgZEaWFsb2cSQgoKc3R5bGVfdHlwZRgBIAEoDjIjLmJpbGliaWxpLmFwcC5wbGF5dXJsLnYxLk'\n    'd1aWRlU3R5bGVSCXN0eWxlVHlwZRI3CgZyZXBvcnQYAiABKAsyHy5iaWxpYmlsaS5hcHAucGxh'\n    'eXVybC52MS5SZXBvcnRSBnJlcG9ydBI3CgV0aXRsZRgDIAEoCzIhLmJpbGliaWxpLmFwcC5wbG'\n    'F5dXJsLnYxLlRleHRJbmZvUgV0aXRsZRI9CghzdWJ0aXRsZRgEIAEoCzIhLmJpbGliaWxpLmFw'\n    'cC5wbGF5dXJsLnYxLlRleHRJbmZvUghzdWJ0aXRsZRI7CgZidXR0b24YBSADKAsyIy5iaWxpYm'\n    'lsaS5hcHAucGxheXVybC52MS5CdXR0b25JbmZvUgZidXR0b24=');\n\n@$core.Deprecated('Use dolbyItemDescriptor instead')\nconst DolbyItem$json = {\n  '1': 'DolbyItem',\n  '2': [\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.playurl.v1.DolbyItem.Type',\n      '10': 'type'\n    },\n    {\n      '1': 'audio',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.DashItem',\n      '10': 'audio'\n    },\n  ],\n  '4': [DolbyItem_Type$json],\n};\n\n@$core.Deprecated('Use dolbyItemDescriptor instead')\nconst DolbyItem_Type$json = {\n  '1': 'Type',\n  '2': [\n    {'1': 'NONE', '2': 0},\n    {'1': 'COMMON', '2': 1},\n    {'1': 'ATMOS', '2': 2},\n  ],\n};\n\n/// Descriptor for `DolbyItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dolbyItemDescriptor = $convert.base64Decode(\n    'CglEb2xieUl0ZW0SOwoEdHlwZRgBIAEoDjInLmJpbGliaWxpLmFwcC5wbGF5dXJsLnYxLkRvbG'\n    'J5SXRlbS5UeXBlUgR0eXBlEjcKBWF1ZGlvGAIgAygLMiEuYmlsaWJpbGkuYXBwLnBsYXl1cmwu'\n    'djEuRGFzaEl0ZW1SBWF1ZGlvIicKBFR5cGUSCAoETk9ORRAAEgoKBkNPTU1PThABEgkKBUFUTU'\n    '9TEAI=');\n\n@$core.Deprecated('Use eventDescriptor instead')\nconst Event$json = {\n  '1': 'Event',\n  '2': [\n    {\n      '1': 'shake',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.Shake',\n      '10': 'shake'\n    },\n  ],\n};\n\n/// Descriptor for `Event`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List eventDescriptor = $convert.base64Decode(\n    'CgVFdmVudBI0CgVzaGFrZRgBIAEoCzIeLmJpbGliaWxpLmFwcC5wbGF5dXJsLnYxLlNoYWtlUg'\n    'VzaGFrZQ==');\n\n@$core.Deprecated('Use extraContentDescriptor instead')\nconst ExtraContent$json = {\n  '1': 'ExtraContent',\n  '2': [\n    {'1': 'disabled_reason', '3': 1, '4': 1, '5': 9, '10': 'disabledReason'},\n    {'1': 'disabled_code', '3': 2, '4': 1, '5': 3, '10': 'disabledCode'},\n  ],\n};\n\n/// Descriptor for `ExtraContent`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List extraContentDescriptor = $convert.base64Decode(\n    'CgxFeHRyYUNvbnRlbnQSJwoPZGlzYWJsZWRfcmVhc29uGAEgASgJUg5kaXNhYmxlZFJlYXNvbh'\n    'IjCg1kaXNhYmxlZF9jb2RlGAIgASgDUgxkaXNhYmxlZENvZGU=');\n\n@$core.Deprecated('Use fieldValueDescriptor instead')\nconst FieldValue$json = {\n  '1': 'FieldValue',\n  '2': [\n    {'1': 'switch', '3': 1, '4': 1, '5': 8, '9': 0, '10': 'switch'},\n  ],\n  '8': [\n    {'1': 'value'},\n  ],\n};\n\n/// Descriptor for `FieldValue`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List fieldValueDescriptor = $convert.base64Decode(\n    'CgpGaWVsZFZhbHVlEhgKBnN3aXRjaBgBIAEoCEgAUgZzd2l0Y2hCBwoFdmFsdWU=');\n\n@$core.Deprecated('Use formatDescriptionDescriptor instead')\nconst FormatDescription$json = {\n  '1': 'FormatDescription',\n  '2': [\n    {'1': 'quality', '3': 1, '4': 1, '5': 5, '10': 'quality'},\n    {'1': 'format', '3': 2, '4': 1, '5': 9, '10': 'format'},\n    {'1': 'description', '3': 3, '4': 1, '5': 9, '10': 'description'},\n    {'1': 'new_description', '3': 4, '4': 1, '5': 9, '10': 'newDescription'},\n    {'1': 'display_desc', '3': 5, '4': 1, '5': 9, '10': 'displayDesc'},\n    {'1': 'superscript', '3': 6, '4': 1, '5': 9, '10': 'superscript'},\n  ],\n};\n\n/// Descriptor for `FormatDescription`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List formatDescriptionDescriptor = $convert.base64Decode(\n    'ChFGb3JtYXREZXNjcmlwdGlvbhIYCgdxdWFsaXR5GAEgASgFUgdxdWFsaXR5EhYKBmZvcm1hdB'\n    'gCIAEoCVIGZm9ybWF0EiAKC2Rlc2NyaXB0aW9uGAMgASgJUgtkZXNjcmlwdGlvbhInCg9uZXdf'\n    'ZGVzY3JpcHRpb24YBCABKAlSDm5ld0Rlc2NyaXB0aW9uEiEKDGRpc3BsYXlfZGVzYxgFIAEoCV'\n    'ILZGlzcGxheURlc2MSIAoLc3VwZXJzY3JpcHQYBiABKAlSC3N1cGVyc2NyaXB0');\n\n@$core.Deprecated('Use glanceDescriptor instead')\nconst Glance$json = {\n  '1': 'Glance',\n  '2': [\n    {'1': 'can_watch', '3': 1, '4': 1, '5': 8, '10': 'canWatch'},\n    {'1': 'times', '3': 2, '4': 1, '5': 3, '10': 'times'},\n    {'1': 'duration', '3': 3, '4': 1, '5': 3, '10': 'duration'},\n  ],\n};\n\n/// Descriptor for `Glance`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List glanceDescriptor = $convert.base64Decode(\n    'CgZHbGFuY2USGwoJY2FuX3dhdGNoGAEgASgIUghjYW5XYXRjaBIUCgV0aW1lcxgCIAEoA1IFdG'\n    'ltZXMSGgoIZHVyYXRpb24YAyABKANSCGR1cmF0aW9u');\n\n@$core.Deprecated('Use lossLessItemDescriptor instead')\nconst LossLessItem$json = {\n  '1': 'LossLessItem',\n  '2': [\n    {'1': 'is_lossless_audio', '3': 1, '4': 1, '5': 8, '10': 'isLosslessAudio'},\n    {\n      '1': 'audio',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.DashItem',\n      '10': 'audio'\n    },\n    {'1': 'need_vip', '3': 3, '4': 1, '5': 8, '10': 'needVip'},\n  ],\n};\n\n/// Descriptor for `LossLessItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List lossLessItemDescriptor = $convert.base64Decode(\n    'CgxMb3NzTGVzc0l0ZW0SKgoRaXNfbG9zc2xlc3NfYXVkaW8YASABKAhSD2lzTG9zc2xlc3NBdW'\n    'RpbxI3CgVhdWRpbxgCIAEoCzIhLmJpbGliaWxpLmFwcC5wbGF5dXJsLnYxLkRhc2hJdGVtUgVh'\n    'dWRpbxIZCghuZWVkX3ZpcBgDIAEoCFIHbmVlZFZpcA==');\n\n@$core.Deprecated('Use multiDashVideoDescriptor instead')\nconst MultiDashVideo$json = {\n  '1': 'MultiDashVideo',\n  '2': [\n    {\n      '1': 'dash_videos',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.DashVideo',\n      '10': 'dashVideos'\n    },\n  ],\n};\n\n/// Descriptor for `MultiDashVideo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List multiDashVideoDescriptor = $convert.base64Decode(\n    'Cg5NdWx0aURhc2hWaWRlbxJDCgtkYXNoX3ZpZGVvcxgBIAMoCzIiLmJpbGliaWxpLmFwcC5wbG'\n    'F5dXJsLnYxLkRhc2hWaWRlb1IKZGFzaFZpZGVvcw==');\n\n@$core.Deprecated('Use playAbilityConfDescriptor instead')\nconst PlayAbilityConf$json = {\n  '1': 'PlayAbilityConf',\n  '2': [\n    {\n      '1': 'background_play_conf',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.CloudConf',\n      '10': 'backgroundPlayConf'\n    },\n    {\n      '1': 'flip_conf',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.CloudConf',\n      '10': 'flipConf'\n    },\n    {\n      '1': 'cast_conf',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.CloudConf',\n      '10': 'castConf'\n    },\n    {\n      '1': 'feedback_conf',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.CloudConf',\n      '10': 'feedbackConf'\n    },\n    {\n      '1': 'subtitle_conf',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.CloudConf',\n      '10': 'subtitleConf'\n    },\n    {\n      '1': 'playback_rate_conf',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.CloudConf',\n      '10': 'playbackRateConf'\n    },\n    {\n      '1': 'time_up_conf',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.CloudConf',\n      '10': 'timeUpConf'\n    },\n    {\n      '1': 'playback_mode_conf',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.CloudConf',\n      '10': 'playbackModeConf'\n    },\n    {\n      '1': 'scale_mode_conf',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.CloudConf',\n      '10': 'scaleModeConf'\n    },\n    {\n      '1': 'like_conf',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.CloudConf',\n      '10': 'likeConf'\n    },\n    {\n      '1': 'dislike_conf',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.CloudConf',\n      '10': 'dislikeConf'\n    },\n    {\n      '1': 'coin_conf',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.CloudConf',\n      '10': 'coinConf'\n    },\n    {\n      '1': 'elec_conf',\n      '3': 13,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.CloudConf',\n      '10': 'elecConf'\n    },\n    {\n      '1': 'share_conf',\n      '3': 14,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.CloudConf',\n      '10': 'shareConf'\n    },\n    {\n      '1': 'screen_shot_conf',\n      '3': 15,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.CloudConf',\n      '10': 'screenShotConf'\n    },\n    {\n      '1': 'lock_screen_conf',\n      '3': 16,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.CloudConf',\n      '10': 'lockScreenConf'\n    },\n    {\n      '1': 'recommend_conf',\n      '3': 17,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.CloudConf',\n      '10': 'recommendConf'\n    },\n    {\n      '1': 'playback_speed_conf',\n      '3': 18,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.CloudConf',\n      '10': 'playbackSpeedConf'\n    },\n    {\n      '1': 'definition_conf',\n      '3': 19,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.CloudConf',\n      '10': 'definitionConf'\n    },\n    {\n      '1': 'selections_conf',\n      '3': 20,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.CloudConf',\n      '10': 'selectionsConf'\n    },\n    {\n      '1': 'next_conf',\n      '3': 21,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.CloudConf',\n      '10': 'nextConf'\n    },\n    {\n      '1': 'edit_dm_conf',\n      '3': 22,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.CloudConf',\n      '10': 'editDmConf'\n    },\n    {\n      '1': 'small_window_conf',\n      '3': 23,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.CloudConf',\n      '10': 'smallWindowConf'\n    },\n    {\n      '1': 'shake_conf',\n      '3': 24,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.CloudConf',\n      '10': 'shakeConf'\n    },\n    {\n      '1': 'outer_dm_conf',\n      '3': 25,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.CloudConf',\n      '10': 'outerDmConf'\n    },\n    {\n      '1': 'inner_dm_conf',\n      '3': 26,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.CloudConf',\n      '10': 'innerDmConf'\n    },\n    {\n      '1': 'panorama_conf',\n      '3': 27,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.CloudConf',\n      '10': 'panoramaConf'\n    },\n    {\n      '1': 'dolby_conf',\n      '3': 28,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.CloudConf',\n      '10': 'dolbyConf'\n    },\n    {\n      '1': 'color_filter_conf',\n      '3': 29,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.CloudConf',\n      '10': 'colorFilterConf'\n    },\n    {\n      '1': 'loss_less_conf',\n      '3': 30,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.CloudConf',\n      '10': 'lossLessConf'\n    },\n  ],\n};\n\n/// Descriptor for `PlayAbilityConf`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playAbilityConfDescriptor = $convert.base64Decode(\n    'Cg9QbGF5QWJpbGl0eUNvbmYSVAoUYmFja2dyb3VuZF9wbGF5X2NvbmYYASABKAsyIi5iaWxpYm'\n    'lsaS5hcHAucGxheXVybC52MS5DbG91ZENvbmZSEmJhY2tncm91bmRQbGF5Q29uZhI/CglmbGlw'\n    'X2NvbmYYAiABKAsyIi5iaWxpYmlsaS5hcHAucGxheXVybC52MS5DbG91ZENvbmZSCGZsaXBDb2'\n    '5mEj8KCWNhc3RfY29uZhgDIAEoCzIiLmJpbGliaWxpLmFwcC5wbGF5dXJsLnYxLkNsb3VkQ29u'\n    'ZlIIY2FzdENvbmYSRwoNZmVlZGJhY2tfY29uZhgEIAEoCzIiLmJpbGliaWxpLmFwcC5wbGF5dX'\n    'JsLnYxLkNsb3VkQ29uZlIMZmVlZGJhY2tDb25mEkcKDXN1YnRpdGxlX2NvbmYYBSABKAsyIi5i'\n    'aWxpYmlsaS5hcHAucGxheXVybC52MS5DbG91ZENvbmZSDHN1YnRpdGxlQ29uZhJQChJwbGF5Ym'\n    'Fja19yYXRlX2NvbmYYBiABKAsyIi5iaWxpYmlsaS5hcHAucGxheXVybC52MS5DbG91ZENvbmZS'\n    'EHBsYXliYWNrUmF0ZUNvbmYSRAoMdGltZV91cF9jb25mGAcgASgLMiIuYmlsaWJpbGkuYXBwLn'\n    'BsYXl1cmwudjEuQ2xvdWRDb25mUgp0aW1lVXBDb25mElAKEnBsYXliYWNrX21vZGVfY29uZhgI'\n    'IAEoCzIiLmJpbGliaWxpLmFwcC5wbGF5dXJsLnYxLkNsb3VkQ29uZlIQcGxheWJhY2tNb2RlQ2'\n    '9uZhJKCg9zY2FsZV9tb2RlX2NvbmYYCSABKAsyIi5iaWxpYmlsaS5hcHAucGxheXVybC52MS5D'\n    'bG91ZENvbmZSDXNjYWxlTW9kZUNvbmYSPwoJbGlrZV9jb25mGAogASgLMiIuYmlsaWJpbGkuYX'\n    'BwLnBsYXl1cmwudjEuQ2xvdWRDb25mUghsaWtlQ29uZhJFCgxkaXNsaWtlX2NvbmYYCyABKAsy'\n    'Ii5iaWxpYmlsaS5hcHAucGxheXVybC52MS5DbG91ZENvbmZSC2Rpc2xpa2VDb25mEj8KCWNvaW'\n    '5fY29uZhgMIAEoCzIiLmJpbGliaWxpLmFwcC5wbGF5dXJsLnYxLkNsb3VkQ29uZlIIY29pbkNv'\n    'bmYSPwoJZWxlY19jb25mGA0gASgLMiIuYmlsaWJpbGkuYXBwLnBsYXl1cmwudjEuQ2xvdWRDb2'\n    '5mUghlbGVjQ29uZhJBCgpzaGFyZV9jb25mGA4gASgLMiIuYmlsaWJpbGkuYXBwLnBsYXl1cmwu'\n    'djEuQ2xvdWRDb25mUglzaGFyZUNvbmYSTAoQc2NyZWVuX3Nob3RfY29uZhgPIAEoCzIiLmJpbG'\n    'liaWxpLmFwcC5wbGF5dXJsLnYxLkNsb3VkQ29uZlIOc2NyZWVuU2hvdENvbmYSTAoQbG9ja19z'\n    'Y3JlZW5fY29uZhgQIAEoCzIiLmJpbGliaWxpLmFwcC5wbGF5dXJsLnYxLkNsb3VkQ29uZlIObG'\n    '9ja1NjcmVlbkNvbmYSSQoOcmVjb21tZW5kX2NvbmYYESABKAsyIi5iaWxpYmlsaS5hcHAucGxh'\n    'eXVybC52MS5DbG91ZENvbmZSDXJlY29tbWVuZENvbmYSUgoTcGxheWJhY2tfc3BlZWRfY29uZh'\n    'gSIAEoCzIiLmJpbGliaWxpLmFwcC5wbGF5dXJsLnYxLkNsb3VkQ29uZlIRcGxheWJhY2tTcGVl'\n    'ZENvbmYSSwoPZGVmaW5pdGlvbl9jb25mGBMgASgLMiIuYmlsaWJpbGkuYXBwLnBsYXl1cmwudj'\n    'EuQ2xvdWRDb25mUg5kZWZpbml0aW9uQ29uZhJLCg9zZWxlY3Rpb25zX2NvbmYYFCABKAsyIi5i'\n    'aWxpYmlsaS5hcHAucGxheXVybC52MS5DbG91ZENvbmZSDnNlbGVjdGlvbnNDb25mEj8KCW5leH'\n    'RfY29uZhgVIAEoCzIiLmJpbGliaWxpLmFwcC5wbGF5dXJsLnYxLkNsb3VkQ29uZlIIbmV4dENv'\n    'bmYSRAoMZWRpdF9kbV9jb25mGBYgASgLMiIuYmlsaWJpbGkuYXBwLnBsYXl1cmwudjEuQ2xvdW'\n    'RDb25mUgplZGl0RG1Db25mEk4KEXNtYWxsX3dpbmRvd19jb25mGBcgASgLMiIuYmlsaWJpbGku'\n    'YXBwLnBsYXl1cmwudjEuQ2xvdWRDb25mUg9zbWFsbFdpbmRvd0NvbmYSQQoKc2hha2VfY29uZh'\n    'gYIAEoCzIiLmJpbGliaWxpLmFwcC5wbGF5dXJsLnYxLkNsb3VkQ29uZlIJc2hha2VDb25mEkYK'\n    'DW91dGVyX2RtX2NvbmYYGSABKAsyIi5iaWxpYmlsaS5hcHAucGxheXVybC52MS5DbG91ZENvbm'\n    'ZSC291dGVyRG1Db25mEkYKDWlubmVyX2RtX2NvbmYYGiABKAsyIi5iaWxpYmlsaS5hcHAucGxh'\n    'eXVybC52MS5DbG91ZENvbmZSC2lubmVyRG1Db25mEkcKDXBhbm9yYW1hX2NvbmYYGyABKAsyIi'\n    '5iaWxpYmlsaS5hcHAucGxheXVybC52MS5DbG91ZENvbmZSDHBhbm9yYW1hQ29uZhJBCgpkb2xi'\n    'eV9jb25mGBwgASgLMiIuYmlsaWJpbGkuYXBwLnBsYXl1cmwudjEuQ2xvdWRDb25mUglkb2xieU'\n    'NvbmYSTgoRY29sb3JfZmlsdGVyX2NvbmYYHSABKAsyIi5iaWxpYmlsaS5hcHAucGxheXVybC52'\n    'MS5DbG91ZENvbmZSD2NvbG9yRmlsdGVyQ29uZhJICg5sb3NzX2xlc3NfY29uZhgeIAEoCzIiLm'\n    'JpbGliaWxpLmFwcC5wbGF5dXJsLnYxLkNsb3VkQ29uZlIMbG9zc0xlc3NDb25m');\n\n@$core.Deprecated('Use playArcDescriptor instead')\nconst PlayArc$json = {\n  '1': 'PlayArc',\n  '2': [\n    {'1': 'is_preview', '3': 1, '4': 1, '5': 8, '10': 'isPreview'},\n  ],\n};\n\n/// Descriptor for `PlayArc`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playArcDescriptor = $convert\n    .base64Decode('CgdQbGF5QXJjEh0KCmlzX3ByZXZpZXcYASABKAhSCWlzUHJldmlldw==');\n\n@$core.Deprecated('Use playArcConfDescriptor instead')\nconst PlayArcConf$json = {\n  '1': 'PlayArcConf',\n  '2': [\n    {\n      '1': 'background_play_conf',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'backgroundPlayConf'\n    },\n    {\n      '1': 'flip_conf',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'flipConf'\n    },\n    {\n      '1': 'cast_conf',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'castConf'\n    },\n    {\n      '1': 'feedback_conf',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'feedbackConf'\n    },\n    {\n      '1': 'subtitle_conf',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'subtitleConf'\n    },\n    {\n      '1': 'playback_rate_conf',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'playbackRateConf'\n    },\n    {\n      '1': 'time_up_conf',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'timeUpConf'\n    },\n    {\n      '1': 'playback_mode_conf',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'playbackModeConf'\n    },\n    {\n      '1': 'scale_mode_conf',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'scaleModeConf'\n    },\n    {\n      '1': 'like_conf',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'likeConf'\n    },\n    {\n      '1': 'dislike_conf',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'dislikeConf'\n    },\n    {\n      '1': 'coin_conf',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'coinConf'\n    },\n    {\n      '1': 'elec_conf',\n      '3': 13,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'elecConf'\n    },\n    {\n      '1': 'share_conf',\n      '3': 14,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'shareConf'\n    },\n    {\n      '1': 'screen_shot_conf',\n      '3': 15,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'screenShotConf'\n    },\n    {\n      '1': 'lock_screen_conf',\n      '3': 16,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'lockScreenConf'\n    },\n    {\n      '1': 'recommend_conf',\n      '3': 17,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'recommendConf'\n    },\n    {\n      '1': 'playback_speed_conf',\n      '3': 18,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'playbackSpeedConf'\n    },\n    {\n      '1': 'definition_conf',\n      '3': 19,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'definitionConf'\n    },\n    {\n      '1': 'selections_conf',\n      '3': 20,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'selectionsConf'\n    },\n    {\n      '1': 'next_conf',\n      '3': 21,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'nextConf'\n    },\n    {\n      '1': 'edit_dm_conf',\n      '3': 22,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'editDmConf'\n    },\n    {\n      '1': 'small_window_conf',\n      '3': 23,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'smallWindowConf'\n    },\n    {\n      '1': 'shake_conf',\n      '3': 24,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'shakeConf'\n    },\n    {\n      '1': 'outer_dm_conf',\n      '3': 25,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'outerDmConf'\n    },\n    {\n      '1': 'inner_dm_conf',\n      '3': 26,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'innerDmConf'\n    },\n    {\n      '1': 'panorama_conf',\n      '3': 27,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'panoramaConf'\n    },\n    {\n      '1': 'dolby_conf',\n      '3': 28,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'dolbyConf'\n    },\n    {\n      '1': 'screen_recording_conf',\n      '3': 29,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'screenRecordingConf'\n    },\n    {\n      '1': 'color_filter_conf',\n      '3': 30,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'colorFilterConf'\n    },\n    {\n      '1': 'loss_less_conf',\n      '3': 31,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'lossLessConf'\n    },\n    {\n      '1': 'system_record_conf',\n      '3': 32,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ArcConf',\n      '10': 'systemRecordConf'\n    },\n  ],\n};\n\n/// Descriptor for `PlayArcConf`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playArcConfDescriptor = $convert.base64Decode(\n    'CgtQbGF5QXJjQ29uZhJSChRiYWNrZ3JvdW5kX3BsYXlfY29uZhgBIAEoCzIgLmJpbGliaWxpLm'\n    'FwcC5wbGF5dXJsLnYxLkFyY0NvbmZSEmJhY2tncm91bmRQbGF5Q29uZhI9CglmbGlwX2NvbmYY'\n    'AiABKAsyIC5iaWxpYmlsaS5hcHAucGxheXVybC52MS5BcmNDb25mUghmbGlwQ29uZhI9CgljYX'\n    'N0X2NvbmYYAyABKAsyIC5iaWxpYmlsaS5hcHAucGxheXVybC52MS5BcmNDb25mUghjYXN0Q29u'\n    'ZhJFCg1mZWVkYmFja19jb25mGAQgASgLMiAuYmlsaWJpbGkuYXBwLnBsYXl1cmwudjEuQXJjQ2'\n    '9uZlIMZmVlZGJhY2tDb25mEkUKDXN1YnRpdGxlX2NvbmYYBSABKAsyIC5iaWxpYmlsaS5hcHAu'\n    'cGxheXVybC52MS5BcmNDb25mUgxzdWJ0aXRsZUNvbmYSTgoScGxheWJhY2tfcmF0ZV9jb25mGA'\n    'YgASgLMiAuYmlsaWJpbGkuYXBwLnBsYXl1cmwudjEuQXJjQ29uZlIQcGxheWJhY2tSYXRlQ29u'\n    'ZhJCCgx0aW1lX3VwX2NvbmYYByABKAsyIC5iaWxpYmlsaS5hcHAucGxheXVybC52MS5BcmNDb2'\n    '5mUgp0aW1lVXBDb25mEk4KEnBsYXliYWNrX21vZGVfY29uZhgIIAEoCzIgLmJpbGliaWxpLmFw'\n    'cC5wbGF5dXJsLnYxLkFyY0NvbmZSEHBsYXliYWNrTW9kZUNvbmYSSAoPc2NhbGVfbW9kZV9jb2'\n    '5mGAkgASgLMiAuYmlsaWJpbGkuYXBwLnBsYXl1cmwudjEuQXJjQ29uZlINc2NhbGVNb2RlQ29u'\n    'ZhI9CglsaWtlX2NvbmYYCiABKAsyIC5iaWxpYmlsaS5hcHAucGxheXVybC52MS5BcmNDb25mUg'\n    'hsaWtlQ29uZhJDCgxkaXNsaWtlX2NvbmYYCyABKAsyIC5iaWxpYmlsaS5hcHAucGxheXVybC52'\n    'MS5BcmNDb25mUgtkaXNsaWtlQ29uZhI9Cgljb2luX2NvbmYYDCABKAsyIC5iaWxpYmlsaS5hcH'\n    'AucGxheXVybC52MS5BcmNDb25mUghjb2luQ29uZhI9CgllbGVjX2NvbmYYDSABKAsyIC5iaWxp'\n    'YmlsaS5hcHAucGxheXVybC52MS5BcmNDb25mUghlbGVjQ29uZhI/CgpzaGFyZV9jb25mGA4gAS'\n    'gLMiAuYmlsaWJpbGkuYXBwLnBsYXl1cmwudjEuQXJjQ29uZlIJc2hhcmVDb25mEkoKEHNjcmVl'\n    'bl9zaG90X2NvbmYYDyABKAsyIC5iaWxpYmlsaS5hcHAucGxheXVybC52MS5BcmNDb25mUg5zY3'\n    'JlZW5TaG90Q29uZhJKChBsb2NrX3NjcmVlbl9jb25mGBAgASgLMiAuYmlsaWJpbGkuYXBwLnBs'\n    'YXl1cmwudjEuQXJjQ29uZlIObG9ja1NjcmVlbkNvbmYSRwoOcmVjb21tZW5kX2NvbmYYESABKA'\n    'syIC5iaWxpYmlsaS5hcHAucGxheXVybC52MS5BcmNDb25mUg1yZWNvbW1lbmRDb25mElAKE3Bs'\n    'YXliYWNrX3NwZWVkX2NvbmYYEiABKAsyIC5iaWxpYmlsaS5hcHAucGxheXVybC52MS5BcmNDb2'\n    '5mUhFwbGF5YmFja1NwZWVkQ29uZhJJCg9kZWZpbml0aW9uX2NvbmYYEyABKAsyIC5iaWxpYmls'\n    'aS5hcHAucGxheXVybC52MS5BcmNDb25mUg5kZWZpbml0aW9uQ29uZhJJCg9zZWxlY3Rpb25zX2'\n    'NvbmYYFCABKAsyIC5iaWxpYmlsaS5hcHAucGxheXVybC52MS5BcmNDb25mUg5zZWxlY3Rpb25z'\n    'Q29uZhI9CgluZXh0X2NvbmYYFSABKAsyIC5iaWxpYmlsaS5hcHAucGxheXVybC52MS5BcmNDb2'\n    '5mUghuZXh0Q29uZhJCCgxlZGl0X2RtX2NvbmYYFiABKAsyIC5iaWxpYmlsaS5hcHAucGxheXVy'\n    'bC52MS5BcmNDb25mUgplZGl0RG1Db25mEkwKEXNtYWxsX3dpbmRvd19jb25mGBcgASgLMiAuYm'\n    'lsaWJpbGkuYXBwLnBsYXl1cmwudjEuQXJjQ29uZlIPc21hbGxXaW5kb3dDb25mEj8KCnNoYWtl'\n    'X2NvbmYYGCABKAsyIC5iaWxpYmlsaS5hcHAucGxheXVybC52MS5BcmNDb25mUglzaGFrZUNvbm'\n    'YSRAoNb3V0ZXJfZG1fY29uZhgZIAEoCzIgLmJpbGliaWxpLmFwcC5wbGF5dXJsLnYxLkFyY0Nv'\n    'bmZSC291dGVyRG1Db25mEkQKDWlubmVyX2RtX2NvbmYYGiABKAsyIC5iaWxpYmlsaS5hcHAucG'\n    'xheXVybC52MS5BcmNDb25mUgtpbm5lckRtQ29uZhJFCg1wYW5vcmFtYV9jb25mGBsgASgLMiAu'\n    'YmlsaWJpbGkuYXBwLnBsYXl1cmwudjEuQXJjQ29uZlIMcGFub3JhbWFDb25mEj8KCmRvbGJ5X2'\n    'NvbmYYHCABKAsyIC5iaWxpYmlsaS5hcHAucGxheXVybC52MS5BcmNDb25mUglkb2xieUNvbmYS'\n    'VAoVc2NyZWVuX3JlY29yZGluZ19jb25mGB0gASgLMiAuYmlsaWJpbGkuYXBwLnBsYXl1cmwudj'\n    'EuQXJjQ29uZlITc2NyZWVuUmVjb3JkaW5nQ29uZhJMChFjb2xvcl9maWx0ZXJfY29uZhgeIAEo'\n    'CzIgLmJpbGliaWxpLmFwcC5wbGF5dXJsLnYxLkFyY0NvbmZSD2NvbG9yRmlsdGVyQ29uZhJGCg'\n    '5sb3NzX2xlc3NfY29uZhgfIAEoCzIgLmJpbGliaWxpLmFwcC5wbGF5dXJsLnYxLkFyY0NvbmZS'\n    'DGxvc3NMZXNzQ29uZhJOChJzeXN0ZW1fcmVjb3JkX2NvbmYYICABKAsyIC5iaWxpYmlsaS5hcH'\n    'AucGxheXVybC52MS5BcmNDb25mUhBzeXN0ZW1SZWNvcmRDb25m');\n\n@$core.Deprecated('Use playConfEditReplyDescriptor instead')\nconst PlayConfEditReply$json = {\n  '1': 'PlayConfEditReply',\n};\n\n/// Descriptor for `PlayConfEditReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playConfEditReplyDescriptor =\n    $convert.base64Decode('ChFQbGF5Q29uZkVkaXRSZXBseQ==');\n\n@$core.Deprecated('Use playConfEditReqDescriptor instead')\nconst PlayConfEditReq$json = {\n  '1': 'PlayConfEditReq',\n  '2': [\n    {\n      '1': 'play_conf',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.PlayConfState',\n      '10': 'playConf'\n    },\n  ],\n};\n\n/// Descriptor for `PlayConfEditReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playConfEditReqDescriptor = $convert.base64Decode(\n    'Cg9QbGF5Q29uZkVkaXRSZXESQwoJcGxheV9jb25mGAEgAygLMiYuYmlsaWJpbGkuYXBwLnBsYX'\n    'l1cmwudjEuUGxheUNvbmZTdGF0ZVIIcGxheUNvbmY=');\n\n@$core.Deprecated('Use playConfReplyDescriptor instead')\nconst PlayConfReply$json = {\n  '1': 'PlayConfReply',\n  '2': [\n    {\n      '1': 'play_conf',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.PlayAbilityConf',\n      '10': 'playConf'\n    },\n  ],\n};\n\n/// Descriptor for `PlayConfReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playConfReplyDescriptor = $convert.base64Decode(\n    'Cg1QbGF5Q29uZlJlcGx5EkUKCXBsYXlfY29uZhgBIAEoCzIoLmJpbGliaWxpLmFwcC5wbGF5dX'\n    'JsLnYxLlBsYXlBYmlsaXR5Q29uZlIIcGxheUNvbmY=');\n\n@$core.Deprecated('Use playConfReqDescriptor instead')\nconst PlayConfReq$json = {\n  '1': 'PlayConfReq',\n};\n\n/// Descriptor for `PlayConfReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playConfReqDescriptor =\n    $convert.base64Decode('CgtQbGF5Q29uZlJlcQ==');\n\n@$core.Deprecated('Use playConfStateDescriptor instead')\nconst PlayConfState$json = {\n  '1': 'PlayConfState',\n  '2': [\n    {\n      '1': 'conf_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.playurl.v1.ConfType',\n      '10': 'confType'\n    },\n    {'1': 'show', '3': 2, '4': 1, '5': 8, '10': 'show'},\n    {\n      '1': 'field_value',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.FieldValue',\n      '10': 'fieldValue'\n    },\n    {\n      '1': 'conf_value',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ConfValue',\n      '10': 'confValue'\n    },\n  ],\n};\n\n/// Descriptor for `PlayConfState`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playConfStateDescriptor = $convert.base64Decode(\n    'Cg1QbGF5Q29uZlN0YXRlEj4KCWNvbmZfdHlwZRgBIAEoDjIhLmJpbGliaWxpLmFwcC5wbGF5dX'\n    'JsLnYxLkNvbmZUeXBlUghjb25mVHlwZRISCgRzaG93GAIgASgIUgRzaG93EkQKC2ZpZWxkX3Zh'\n    'bHVlGAMgASgLMiMuYmlsaWJpbGkuYXBwLnBsYXl1cmwudjEuRmllbGRWYWx1ZVIKZmllbGRWYW'\n    'x1ZRJBCgpjb25mX3ZhbHVlGAQgASgLMiIuYmlsaWJpbGkuYXBwLnBsYXl1cmwudjEuQ29uZlZh'\n    'bHVlUgljb25mVmFsdWU=');\n\n@$core.Deprecated('Use playLimitDescriptor instead')\nconst PlayLimit$json = {\n  '1': 'PlayLimit',\n  '2': [\n    {\n      '1': 'code',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.playurl.v1.PlayLimitCode',\n      '10': 'code'\n    },\n    {'1': 'message', '3': 2, '4': 1, '5': 9, '10': 'message'},\n    {'1': 'sub_message', '3': 3, '4': 1, '5': 9, '10': 'subMessage'},\n    {\n      '1': 'button',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ButtonStyle',\n      '10': 'button'\n    },\n  ],\n};\n\n/// Descriptor for `PlayLimit`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playLimitDescriptor = $convert.base64Decode(\n    'CglQbGF5TGltaXQSOgoEY29kZRgBIAEoDjImLmJpbGliaWxpLmFwcC5wbGF5dXJsLnYxLlBsYX'\n    'lMaW1pdENvZGVSBGNvZGUSGAoHbWVzc2FnZRgCIAEoCVIHbWVzc2FnZRIfCgtzdWJfbWVzc2Fn'\n    'ZRgDIAEoCVIKc3ViTWVzc2FnZRI8CgZidXR0b24YBCABKAsyJC5iaWxpYmlsaS5hcHAucGxheX'\n    'VybC52MS5CdXR0b25TdHlsZVIGYnV0dG9u');\n\n@$core.Deprecated('Use playURLReplyDescriptor instead')\nconst PlayURLReply$json = {\n  '1': 'PlayURLReply',\n  '2': [\n    {'1': 'quality', '3': 1, '4': 1, '5': 5, '10': 'quality'},\n    {'1': 'format', '3': 2, '4': 1, '5': 9, '10': 'format'},\n    {'1': 'timelength', '3': 3, '4': 1, '5': 3, '10': 'timelength'},\n    {'1': 'video_codecid', '3': 4, '4': 1, '5': 5, '10': 'videoCodecid'},\n    {'1': 'fnver', '3': 5, '4': 1, '5': 5, '10': 'fnver'},\n    {'1': 'fnval', '3': 6, '4': 1, '5': 5, '10': 'fnval'},\n    {'1': 'video_project', '3': 7, '4': 1, '5': 8, '10': 'videoProject'},\n    {\n      '1': 'durl',\n      '3': 8,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ResponseUrl',\n      '10': 'durl'\n    },\n    {\n      '1': 'dash',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ResponseDash',\n      '10': 'dash'\n    },\n    {'1': 'no_rexcode', '3': 10, '4': 1, '5': 5, '10': 'noRexcode'},\n    {\n      '1': 'upgrade_limit',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.UpgradeLimit',\n      '10': 'upgradeLimit'\n    },\n    {\n      '1': 'support_formats',\n      '3': 12,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.FormatDescription',\n      '10': 'supportFormats'\n    },\n    {\n      '1': 'type',\n      '3': 13,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.playurl.v1.VideoType',\n      '10': 'type'\n    },\n    {\n      '1': 'vip_risk',\n      '3': 14,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.VipRisk',\n      '10': 'vipRisk'\n    },\n  ],\n};\n\n/// Descriptor for `PlayURLReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playURLReplyDescriptor = $convert.base64Decode(\n    'CgxQbGF5VVJMUmVwbHkSGAoHcXVhbGl0eRgBIAEoBVIHcXVhbGl0eRIWCgZmb3JtYXQYAiABKA'\n    'lSBmZvcm1hdBIeCgp0aW1lbGVuZ3RoGAMgASgDUgp0aW1lbGVuZ3RoEiMKDXZpZGVvX2NvZGVj'\n    'aWQYBCABKAVSDHZpZGVvQ29kZWNpZBIUCgVmbnZlchgFIAEoBVIFZm52ZXISFAoFZm52YWwYBi'\n    'ABKAVSBWZudmFsEiMKDXZpZGVvX3Byb2plY3QYByABKAhSDHZpZGVvUHJvamVjdBI4CgRkdXJs'\n    'GAggAygLMiQuYmlsaWJpbGkuYXBwLnBsYXl1cmwudjEuUmVzcG9uc2VVcmxSBGR1cmwSOQoEZG'\n    'FzaBgJIAEoCzIlLmJpbGliaWxpLmFwcC5wbGF5dXJsLnYxLlJlc3BvbnNlRGFzaFIEZGFzaBId'\n    'Cgpub19yZXhjb2RlGAogASgFUglub1JleGNvZGUSSgoNdXBncmFkZV9saW1pdBgLIAEoCzIlLm'\n    'JpbGliaWxpLmFwcC5wbGF5dXJsLnYxLlVwZ3JhZGVMaW1pdFIMdXBncmFkZUxpbWl0ElMKD3N1'\n    'cHBvcnRfZm9ybWF0cxgMIAMoCzIqLmJpbGliaWxpLmFwcC5wbGF5dXJsLnYxLkZvcm1hdERlc2'\n    'NyaXB0aW9uUg5zdXBwb3J0Rm9ybWF0cxI2CgR0eXBlGA0gASgOMiIuYmlsaWJpbGkuYXBwLnBs'\n    'YXl1cmwudjEuVmlkZW9UeXBlUgR0eXBlEjsKCHZpcF9yaXNrGA4gASgLMiAuYmlsaWJpbGkuYX'\n    'BwLnBsYXl1cmwudjEuVmlwUmlza1IHdmlwUmlzaw==');\n\n@$core.Deprecated('Use playURLReqDescriptor instead')\nconst PlayURLReq$json = {\n  '1': 'PlayURLReq',\n  '2': [\n    {'1': 'aid', '3': 1, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'cid', '3': 2, '4': 1, '5': 3, '10': 'cid'},\n    {'1': 'qn', '3': 3, '4': 1, '5': 3, '10': 'qn'},\n    {'1': 'fnver', '3': 4, '4': 1, '5': 5, '10': 'fnver'},\n    {'1': 'fnval', '3': 5, '4': 1, '5': 5, '10': 'fnval'},\n    {'1': 'download', '3': 6, '4': 1, '5': 5, '10': 'download'},\n    {'1': 'force_host', '3': 7, '4': 1, '5': 5, '10': 'forceHost'},\n    {'1': 'fourk', '3': 8, '4': 1, '5': 8, '10': 'fourk'},\n    {'1': 'spmid', '3': 9, '4': 1, '5': 9, '10': 'spmid'},\n    {'1': 'from_spmid', '3': 10, '4': 1, '5': 9, '10': 'fromSpmid'},\n  ],\n};\n\n/// Descriptor for `PlayURLReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playURLReqDescriptor = $convert.base64Decode(\n    'CgpQbGF5VVJMUmVxEhAKA2FpZBgBIAEoA1IDYWlkEhAKA2NpZBgCIAEoA1IDY2lkEg4KAnFuGA'\n    'MgASgDUgJxbhIUCgVmbnZlchgEIAEoBVIFZm52ZXISFAoFZm52YWwYBSABKAVSBWZudmFsEhoK'\n    'CGRvd25sb2FkGAYgASgFUghkb3dubG9hZBIdCgpmb3JjZV9ob3N0GAcgASgFUglmb3JjZUhvc3'\n    'QSFAoFZm91cmsYCCABKAhSBWZvdXJrEhQKBXNwbWlkGAkgASgJUgVzcG1pZBIdCgpmcm9tX3Nw'\n    'bWlkGAogASgJUglmcm9tU3BtaWQ=');\n\n@$core.Deprecated('Use playViewReplyDescriptor instead')\nconst PlayViewReply$json = {\n  '1': 'PlayViewReply',\n  '2': [\n    {\n      '1': 'video_info',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.VideoInfo',\n      '10': 'videoInfo'\n    },\n    {\n      '1': 'play_conf',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.PlayAbilityConf',\n      '10': 'playConf'\n    },\n    {\n      '1': 'upgrade_limit',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.UpgradeLimit',\n      '10': 'upgradeLimit'\n    },\n    {\n      '1': 'chronos',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.Chronos',\n      '10': 'chronos'\n    },\n    {\n      '1': 'play_arc',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.PlayArcConf',\n      '10': 'playArc'\n    },\n    {\n      '1': 'event',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.Event',\n      '10': 'event'\n    },\n    {\n      '1': 'ab',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.AB',\n      '10': 'ab'\n    },\n    {\n      '1': 'play_limit',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.PlayLimit',\n      '10': 'playLimit'\n    },\n    {\n      '1': 'view_info',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ViewInfo',\n      '10': 'viewInfo'\n    },\n    {\n      '1': 'arc',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.PlayArc',\n      '10': 'arc'\n    },\n  ],\n};\n\n/// Descriptor for `PlayViewReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playViewReplyDescriptor = $convert.base64Decode(\n    'Cg1QbGF5Vmlld1JlcGx5EkEKCnZpZGVvX2luZm8YASABKAsyIi5iaWxpYmlsaS5hcHAucGxheX'\n    'VybC52MS5WaWRlb0luZm9SCXZpZGVvSW5mbxJFCglwbGF5X2NvbmYYAiABKAsyKC5iaWxpYmls'\n    'aS5hcHAucGxheXVybC52MS5QbGF5QWJpbGl0eUNvbmZSCHBsYXlDb25mEkoKDXVwZ3JhZGVfbG'\n    'ltaXQYAyABKAsyJS5iaWxpYmlsaS5hcHAucGxheXVybC52MS5VcGdyYWRlTGltaXRSDHVwZ3Jh'\n    'ZGVMaW1pdBI6CgdjaHJvbm9zGAQgASgLMiAuYmlsaWJpbGkuYXBwLnBsYXl1cmwudjEuQ2hyb2'\n    '5vc1IHY2hyb25vcxI/CghwbGF5X2FyYxgFIAEoCzIkLmJpbGliaWxpLmFwcC5wbGF5dXJsLnYx'\n    'LlBsYXlBcmNDb25mUgdwbGF5QXJjEjQKBWV2ZW50GAYgASgLMh4uYmlsaWJpbGkuYXBwLnBsYX'\n    'l1cmwudjEuRXZlbnRSBWV2ZW50EisKAmFiGAcgASgLMhsuYmlsaWJpbGkuYXBwLnBsYXl1cmwu'\n    'djEuQUJSAmFiEkEKCnBsYXlfbGltaXQYCCABKAsyIi5iaWxpYmlsaS5hcHAucGxheXVybC52MS'\n    '5QbGF5TGltaXRSCXBsYXlMaW1pdBI+Cgl2aWV3X2luZm8YCSABKAsyIS5iaWxpYmlsaS5hcHAu'\n    'cGxheXVybC52MS5WaWV3SW5mb1IIdmlld0luZm8SMgoDYXJjGAogASgLMiAuYmlsaWJpbGkuYX'\n    'BwLnBsYXl1cmwudjEuUGxheUFyY1IDYXJj');\n\n@$core.Deprecated('Use playViewReqDescriptor instead')\nconst PlayViewReq$json = {\n  '1': 'PlayViewReq',\n  '2': [\n    {'1': 'aid', '3': 1, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'cid', '3': 2, '4': 1, '5': 3, '10': 'cid'},\n    {'1': 'qn', '3': 3, '4': 1, '5': 3, '10': 'qn'},\n    {'1': 'fnver', '3': 4, '4': 1, '5': 5, '10': 'fnver'},\n    {'1': 'fnval', '3': 5, '4': 1, '5': 5, '10': 'fnval'},\n    {'1': 'download', '3': 6, '4': 1, '5': 5, '10': 'download'},\n    {'1': 'force_host', '3': 7, '4': 1, '5': 5, '10': 'forceHost'},\n    {'1': 'fourk', '3': 8, '4': 1, '5': 8, '10': 'fourk'},\n    {'1': 'spmid', '3': 9, '4': 1, '5': 9, '10': 'spmid'},\n    {'1': 'from_spmid', '3': 10, '4': 1, '5': 9, '10': 'fromSpmid'},\n    {'1': 'teenagers_mode', '3': 11, '4': 1, '5': 5, '10': 'teenagersMode'},\n    {\n      '1': 'prefer_codec_type',\n      '3': 12,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.playurl.v1.CodeType',\n      '10': 'preferCodecType'\n    },\n    {\n      '1': 'business',\n      '3': 13,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.playurl.v1.Business',\n      '10': 'business'\n    },\n    {'1': 'voice_balance', '3': 14, '4': 1, '5': 3, '10': 'voiceBalance'},\n  ],\n};\n\n/// Descriptor for `PlayViewReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playViewReqDescriptor = $convert.base64Decode(\n    'CgtQbGF5Vmlld1JlcRIQCgNhaWQYASABKANSA2FpZBIQCgNjaWQYAiABKANSA2NpZBIOCgJxbh'\n    'gDIAEoA1ICcW4SFAoFZm52ZXIYBCABKAVSBWZudmVyEhQKBWZudmFsGAUgASgFUgVmbnZhbBIa'\n    'Cghkb3dubG9hZBgGIAEoBVIIZG93bmxvYWQSHQoKZm9yY2VfaG9zdBgHIAEoBVIJZm9yY2VIb3'\n    'N0EhQKBWZvdXJrGAggASgIUgVmb3VyaxIUCgVzcG1pZBgJIAEoCVIFc3BtaWQSHQoKZnJvbV9z'\n    'cG1pZBgKIAEoCVIJZnJvbVNwbWlkEiUKDnRlZW5hZ2Vyc19tb2RlGAsgASgFUg10ZWVuYWdlcn'\n    'NNb2RlEk0KEXByZWZlcl9jb2RlY190eXBlGAwgASgOMiEuYmlsaWJpbGkuYXBwLnBsYXl1cmwu'\n    'djEuQ29kZVR5cGVSD3ByZWZlckNvZGVjVHlwZRI9CghidXNpbmVzcxgNIAEoDjIhLmJpbGliaW'\n    'xpLmFwcC5wbGF5dXJsLnYxLkJ1c2luZXNzUghidXNpbmVzcxIjCg12b2ljZV9iYWxhbmNlGA4g'\n    'ASgDUgx2b2ljZUJhbGFuY2U=');\n\n@$core.Deprecated('Use projectReplyDescriptor instead')\nconst ProjectReply$json = {\n  '1': 'ProjectReply',\n  '2': [\n    {\n      '1': 'project',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.PlayURLReply',\n      '10': 'project'\n    },\n  ],\n};\n\n/// Descriptor for `ProjectReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List projectReplyDescriptor = $convert.base64Decode(\n    'CgxQcm9qZWN0UmVwbHkSPwoHcHJvamVjdBgBIAEoCzIlLmJpbGliaWxpLmFwcC5wbGF5dXJsLn'\n    'YxLlBsYXlVUkxSZXBseVIHcHJvamVjdA==');\n\n@$core.Deprecated('Use projectReqDescriptor instead')\nconst ProjectReq$json = {\n  '1': 'ProjectReq',\n  '2': [\n    {'1': 'aid', '3': 1, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'cid', '3': 2, '4': 1, '5': 3, '10': 'cid'},\n    {'1': 'qn', '3': 3, '4': 1, '5': 3, '10': 'qn'},\n    {'1': 'fnver', '3': 4, '4': 1, '5': 5, '10': 'fnver'},\n    {'1': 'fnval', '3': 5, '4': 1, '5': 5, '10': 'fnval'},\n    {'1': 'download', '3': 6, '4': 1, '5': 5, '10': 'download'},\n    {'1': 'force_host', '3': 7, '4': 1, '5': 5, '10': 'forceHost'},\n    {'1': 'fourk', '3': 8, '4': 1, '5': 8, '10': 'fourk'},\n    {'1': 'spmid', '3': 9, '4': 1, '5': 9, '10': 'spmid'},\n    {'1': 'from_spmid', '3': 10, '4': 1, '5': 9, '10': 'fromSpmid'},\n    {'1': 'protocol', '3': 11, '4': 1, '5': 5, '10': 'protocol'},\n    {'1': 'device_type', '3': 12, '4': 1, '5': 5, '10': 'deviceType'},\n  ],\n};\n\n/// Descriptor for `ProjectReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List projectReqDescriptor = $convert.base64Decode(\n    'CgpQcm9qZWN0UmVxEhAKA2FpZBgBIAEoA1IDYWlkEhAKA2NpZBgCIAEoA1IDY2lkEg4KAnFuGA'\n    'MgASgDUgJxbhIUCgVmbnZlchgEIAEoBVIFZm52ZXISFAoFZm52YWwYBSABKAVSBWZudmFsEhoK'\n    'CGRvd25sb2FkGAYgASgFUghkb3dubG9hZBIdCgpmb3JjZV9ob3N0GAcgASgFUglmb3JjZUhvc3'\n    'QSFAoFZm91cmsYCCABKAhSBWZvdXJrEhQKBXNwbWlkGAkgASgJUgVzcG1pZBIdCgpmcm9tX3Nw'\n    'bWlkGAogASgJUglmcm9tU3BtaWQSGgoIcHJvdG9jb2wYCyABKAVSCHByb3RvY29sEh8KC2Rldm'\n    'ljZV90eXBlGAwgASgFUgpkZXZpY2VUeXBl');\n\n@$core.Deprecated('Use promptBarDescriptor instead')\nconst PromptBar$json = {\n  '1': 'PromptBar',\n  '2': [\n    {\n      '1': 'title',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.TextInfo',\n      '10': 'title'\n    },\n    {\n      '1': 'sub_title',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.TextInfo',\n      '10': 'subTitle'\n    },\n    {'1': 'sub_title_icon', '3': 3, '4': 1, '5': 9, '10': 'subTitleIcon'},\n    {'1': 'bg_image', '3': 4, '4': 1, '5': 9, '10': 'bgImage'},\n    {\n      '1': 'button',\n      '3': 5,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ButtonInfo',\n      '10': 'button'\n    },\n    {\n      '1': 'report',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.Report',\n      '10': 'report'\n    },\n  ],\n};\n\n/// Descriptor for `PromptBar`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List promptBarDescriptor = $convert.base64Decode(\n    'CglQcm9tcHRCYXISNwoFdGl0bGUYASABKAsyIS5iaWxpYmlsaS5hcHAucGxheXVybC52MS5UZX'\n    'h0SW5mb1IFdGl0bGUSPgoJc3ViX3RpdGxlGAIgASgLMiEuYmlsaWJpbGkuYXBwLnBsYXl1cmwu'\n    'djEuVGV4dEluZm9SCHN1YlRpdGxlEiQKDnN1Yl90aXRsZV9pY29uGAMgASgJUgxzdWJUaXRsZU'\n    'ljb24SGQoIYmdfaW1hZ2UYBCABKAlSB2JnSW1hZ2USOwoGYnV0dG9uGAUgAygLMiMuYmlsaWJp'\n    'bGkuYXBwLnBsYXl1cmwudjEuQnV0dG9uSW5mb1IGYnV0dG9uEjcKBnJlcG9ydBgGIAEoCzIfLm'\n    'JpbGliaWxpLmFwcC5wbGF5dXJsLnYxLlJlcG9ydFIGcmVwb3J0');\n\n@$core.Deprecated('Use reportDescriptor instead')\nconst Report$json = {\n  '1': 'Report',\n  '2': [\n    {'1': 'show_event_id', '3': 1, '4': 1, '5': 9, '10': 'showEventId'},\n    {'1': 'click_event_id', '3': 2, '4': 1, '5': 9, '10': 'clickEventId'},\n    {'1': 'extends', '3': 3, '4': 1, '5': 9, '10': 'extends'},\n  ],\n};\n\n/// Descriptor for `Report`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reportDescriptor = $convert.base64Decode(\n    'CgZSZXBvcnQSIgoNc2hvd19ldmVudF9pZBgBIAEoCVILc2hvd0V2ZW50SWQSJAoOY2xpY2tfZX'\n    'ZlbnRfaWQYAiABKAlSDGNsaWNrRXZlbnRJZBIYCgdleHRlbmRzGAMgASgJUgdleHRlbmRz');\n\n@$core.Deprecated('Use responseDashDescriptor instead')\nconst ResponseDash$json = {\n  '1': 'ResponseDash',\n  '2': [\n    {\n      '1': 'video',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.DashItem',\n      '10': 'video'\n    },\n    {\n      '1': 'audio',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.DashItem',\n      '10': 'audio'\n    },\n  ],\n};\n\n/// Descriptor for `ResponseDash`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List responseDashDescriptor = $convert.base64Decode(\n    'CgxSZXNwb25zZURhc2gSNwoFdmlkZW8YASADKAsyIS5iaWxpYmlsaS5hcHAucGxheXVybC52MS'\n    '5EYXNoSXRlbVIFdmlkZW8SNwoFYXVkaW8YAiADKAsyIS5iaWxpYmlsaS5hcHAucGxheXVybC52'\n    'MS5EYXNoSXRlbVIFYXVkaW8=');\n\n@$core.Deprecated('Use responseUrlDescriptor instead')\nconst ResponseUrl$json = {\n  '1': 'ResponseUrl',\n  '2': [\n    {'1': 'order', '3': 1, '4': 1, '5': 5, '10': 'order'},\n    {'1': 'length', '3': 2, '4': 1, '5': 3, '10': 'length'},\n    {'1': 'size', '3': 3, '4': 1, '5': 3, '10': 'size'},\n    {'1': 'url', '3': 4, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'backup_url', '3': 5, '4': 3, '5': 9, '10': 'backupUrl'},\n    {'1': 'md5', '3': 6, '4': 1, '5': 9, '10': 'md5'},\n    {'1': 'quality', '3': 7, '4': 1, '5': 5, '10': 'quality'},\n  ],\n};\n\n/// Descriptor for `ResponseUrl`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List responseUrlDescriptor = $convert.base64Decode(\n    'CgtSZXNwb25zZVVybBIUCgVvcmRlchgBIAEoBVIFb3JkZXISFgoGbGVuZ3RoGAIgASgDUgZsZW'\n    '5ndGgSEgoEc2l6ZRgDIAEoA1IEc2l6ZRIQCgN1cmwYBCABKAlSA3VybBIdCgpiYWNrdXBfdXJs'\n    'GAUgAygJUgliYWNrdXBVcmwSEAoDbWQ1GAYgASgJUgNtZDUSGAoHcXVhbGl0eRgHIAEoBVIHcX'\n    'VhbGl0eQ==');\n\n@$core.Deprecated('Use schemeDescriptor instead')\nconst Scheme$json = {\n  '1': 'Scheme',\n  '2': [\n    {\n      '1': 'action_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.playurl.v1.Scheme.ActionType',\n      '10': 'actionType'\n    },\n    {'1': 'toast', '3': 2, '4': 1, '5': 9, '10': 'toast'},\n  ],\n  '4': [Scheme_ActionType$json],\n};\n\n@$core.Deprecated('Use schemeDescriptor instead')\nconst Scheme_ActionType$json = {\n  '1': 'ActionType',\n  '2': [\n    {'1': 'UNKNOWN_ActionType', '2': 0},\n    {'1': 'SHOW_TOAST', '2': 1},\n  ],\n};\n\n/// Descriptor for `Scheme`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List schemeDescriptor = $convert.base64Decode(\n    'CgZTY2hlbWUSSwoLYWN0aW9uX3R5cGUYASABKA4yKi5iaWxpYmlsaS5hcHAucGxheXVybC52MS'\n    '5TY2hlbWUuQWN0aW9uVHlwZVIKYWN0aW9uVHlwZRIUCgV0b2FzdBgCIAEoCVIFdG9hc3QiNAoK'\n    'QWN0aW9uVHlwZRIWChJVTktOT1dOX0FjdGlvblR5cGUQABIOCgpTSE9XX1RPQVNUEAE=');\n\n@$core.Deprecated('Use segmentVideoDescriptor instead')\nconst SegmentVideo$json = {\n  '1': 'SegmentVideo',\n  '2': [\n    {\n      '1': 'segment',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ResponseUrl',\n      '10': 'segment'\n    },\n  ],\n};\n\n/// Descriptor for `SegmentVideo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List segmentVideoDescriptor = $convert.base64Decode(\n    'CgxTZWdtZW50VmlkZW8SPgoHc2VnbWVudBgBIAMoCzIkLmJpbGliaWxpLmFwcC5wbGF5dXJsLn'\n    'YxLlJlc3BvbnNlVXJsUgdzZWdtZW50');\n\n@$core.Deprecated('Use shakeDescriptor instead')\nconst Shake$json = {\n  '1': 'Shake',\n  '2': [\n    {'1': 'file', '3': 1, '4': 1, '5': 9, '10': 'file'},\n  ],\n};\n\n/// Descriptor for `Shake`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List shakeDescriptor =\n    $convert.base64Decode('CgVTaGFrZRISCgRmaWxlGAEgASgJUgRmaWxl');\n\n@$core.Deprecated('Use streamDescriptor instead')\nconst Stream$json = {\n  '1': 'Stream',\n  '2': [\n    {\n      '1': 'dash_video',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.DashVideo',\n      '9': 0,\n      '10': 'dashVideo'\n    },\n    {\n      '1': 'segment_video',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.SegmentVideo',\n      '9': 0,\n      '10': 'segmentVideo'\n    },\n    {\n      '1': 'multi_dash_video',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.MultiDashVideo',\n      '9': 0,\n      '10': 'multiDashVideo'\n    },\n    {\n      '1': 'stream_info',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.StreamInfo',\n      '10': 'streamInfo'\n    },\n  ],\n  '8': [\n    {'1': 'content'},\n  ],\n};\n\n/// Descriptor for `Stream`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List streamDescriptor = $convert.base64Decode(\n    'CgZTdHJlYW0SQwoKZGFzaF92aWRlbxgCIAEoCzIiLmJpbGliaWxpLmFwcC5wbGF5dXJsLnYxLk'\n    'Rhc2hWaWRlb0gAUglkYXNoVmlkZW8STAoNc2VnbWVudF92aWRlbxgDIAEoCzIlLmJpbGliaWxp'\n    'LmFwcC5wbGF5dXJsLnYxLlNlZ21lbnRWaWRlb0gAUgxzZWdtZW50VmlkZW8SUwoQbXVsdGlfZG'\n    'FzaF92aWRlbxgEIAEoCzInLmJpbGliaWxpLmFwcC5wbGF5dXJsLnYxLk11bHRpRGFzaFZpZGVv'\n    'SABSDm11bHRpRGFzaFZpZGVvEkQKC3N0cmVhbV9pbmZvGAEgASgLMiMuYmlsaWJpbGkuYXBwLn'\n    'BsYXl1cmwudjEuU3RyZWFtSW5mb1IKc3RyZWFtSW5mb0IJCgdjb250ZW50');\n\n@$core.Deprecated('Use streamInfoDescriptor instead')\nconst StreamInfo$json = {\n  '1': 'StreamInfo',\n  '2': [\n    {'1': 'quality', '3': 1, '4': 1, '5': 5, '10': 'quality'},\n    {'1': 'format', '3': 2, '4': 1, '5': 9, '10': 'format'},\n    {'1': 'description', '3': 3, '4': 1, '5': 9, '10': 'description'},\n    {\n      '1': 'err_code',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.playurl.v1.PlayErr',\n      '10': 'errCode'\n    },\n    {\n      '1': 'limit',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.StreamLimit',\n      '10': 'limit'\n    },\n    {'1': 'need_vip', '3': 6, '4': 1, '5': 8, '10': 'needVip'},\n    {'1': 'need_login', '3': 7, '4': 1, '5': 8, '10': 'needLogin'},\n    {'1': 'intact', '3': 8, '4': 1, '5': 8, '10': 'intact'},\n    {'1': 'no_rexcode', '3': 9, '4': 1, '5': 8, '10': 'noRexcode'},\n    {'1': 'attribute', '3': 10, '4': 1, '5': 3, '10': 'attribute'},\n    {'1': 'new_description', '3': 11, '4': 1, '5': 9, '10': 'newDescription'},\n    {'1': 'display_desc', '3': 12, '4': 1, '5': 9, '10': 'displayDesc'},\n    {'1': 'superscript', '3': 13, '4': 1, '5': 9, '10': 'superscript'},\n    {'1': 'vip_free', '3': 14, '4': 1, '5': 8, '10': 'vipFree'},\n    {'1': 'subtitle', '3': 15, '4': 1, '5': 9, '10': 'subtitle'},\n    {\n      '1': 'scheme',\n      '3': 16,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.Scheme',\n      '10': 'scheme'\n    },\n    {'1': 'support_drm', '3': 17, '4': 1, '5': 8, '10': 'supportDrm'},\n    {'1': 'has_preview', '3': 18, '4': 1, '5': 8, '10': 'hasPreview'},\n  ],\n};\n\n/// Descriptor for `StreamInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List streamInfoDescriptor = $convert.base64Decode(\n    'CgpTdHJlYW1JbmZvEhgKB3F1YWxpdHkYASABKAVSB3F1YWxpdHkSFgoGZm9ybWF0GAIgASgJUg'\n    'Zmb3JtYXQSIAoLZGVzY3JpcHRpb24YAyABKAlSC2Rlc2NyaXB0aW9uEjsKCGVycl9jb2RlGAQg'\n    'ASgOMiAuYmlsaWJpbGkuYXBwLnBsYXl1cmwudjEuUGxheUVyclIHZXJyQ29kZRI6CgVsaW1pdB'\n    'gFIAEoCzIkLmJpbGliaWxpLmFwcC5wbGF5dXJsLnYxLlN0cmVhbUxpbWl0UgVsaW1pdBIZCghu'\n    'ZWVkX3ZpcBgGIAEoCFIHbmVlZFZpcBIdCgpuZWVkX2xvZ2luGAcgASgIUgluZWVkTG9naW4SFg'\n    'oGaW50YWN0GAggASgIUgZpbnRhY3QSHQoKbm9fcmV4Y29kZRgJIAEoCFIJbm9SZXhjb2RlEhwK'\n    'CWF0dHJpYnV0ZRgKIAEoA1IJYXR0cmlidXRlEicKD25ld19kZXNjcmlwdGlvbhgLIAEoCVIObm'\n    'V3RGVzY3JpcHRpb24SIQoMZGlzcGxheV9kZXNjGAwgASgJUgtkaXNwbGF5RGVzYxIgCgtzdXBl'\n    'cnNjcmlwdBgNIAEoCVILc3VwZXJzY3JpcHQSGQoIdmlwX2ZyZWUYDiABKAhSB3ZpcEZyZWUSGg'\n    'oIc3VidGl0bGUYDyABKAlSCHN1YnRpdGxlEjcKBnNjaGVtZRgQIAEoCzIfLmJpbGliaWxpLmFw'\n    'cC5wbGF5dXJsLnYxLlNjaGVtZVIGc2NoZW1lEh8KC3N1cHBvcnRfZHJtGBEgASgIUgpzdXBwb3'\n    'J0RHJtEh8KC2hhc19wcmV2aWV3GBIgASgIUgpoYXNQcmV2aWV3');\n\n@$core.Deprecated('Use streamLimitDescriptor instead')\nconst StreamLimit$json = {\n  '1': 'StreamLimit',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'msg', '3': 3, '4': 1, '5': 9, '10': 'msg'},\n  ],\n};\n\n/// Descriptor for `StreamLimit`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List streamLimitDescriptor = $convert.base64Decode(\n    'CgtTdHJlYW1MaW1pdBIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSEAoDdXJpGAIgASgJUgN1cmkSEA'\n    'oDbXNnGAMgASgJUgNtc2c=');\n\n@$core.Deprecated('Use textInfoDescriptor instead')\nconst TextInfo$json = {\n  '1': 'TextInfo',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'text_color', '3': 2, '4': 1, '5': 9, '10': 'textColor'},\n    {'1': 'text_color_night', '3': 3, '4': 1, '5': 9, '10': 'textColorNight'},\n  ],\n};\n\n/// Descriptor for `TextInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List textInfoDescriptor = $convert.base64Decode(\n    'CghUZXh0SW5mbxISCgR0ZXh0GAEgASgJUgR0ZXh0Eh0KCnRleHRfY29sb3IYAiABKAlSCXRleH'\n    'RDb2xvchIoChB0ZXh0X2NvbG9yX25pZ2h0GAMgASgJUg50ZXh0Q29sb3JOaWdodA==');\n\n@$core.Deprecated('Use upgradeButtonDescriptor instead')\nconst UpgradeButton$json = {\n  '1': 'UpgradeButton',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'link', '3': 2, '4': 1, '5': 9, '10': 'link'},\n  ],\n};\n\n/// Descriptor for `UpgradeButton`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List upgradeButtonDescriptor = $convert.base64Decode(\n    'Cg1VcGdyYWRlQnV0dG9uEhQKBXRpdGxlGAEgASgJUgV0aXRsZRISCgRsaW5rGAIgASgJUgRsaW'\n    '5r');\n\n@$core.Deprecated('Use upgradeLimitDescriptor instead')\nconst UpgradeLimit$json = {\n  '1': 'UpgradeLimit',\n  '2': [\n    {'1': 'code', '3': 1, '4': 1, '5': 5, '10': 'code'},\n    {'1': 'message', '3': 2, '4': 1, '5': 9, '10': 'message'},\n    {'1': 'image', '3': 3, '4': 1, '5': 9, '10': 'image'},\n    {\n      '1': 'button',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.UpgradeButton',\n      '10': 'button'\n    },\n  ],\n};\n\n/// Descriptor for `UpgradeLimit`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List upgradeLimitDescriptor = $convert.base64Decode(\n    'CgxVcGdyYWRlTGltaXQSEgoEY29kZRgBIAEoBVIEY29kZRIYCgdtZXNzYWdlGAIgASgJUgdtZX'\n    'NzYWdlEhQKBWltYWdlGAMgASgJUgVpbWFnZRI+CgZidXR0b24YBCABKAsyJi5iaWxpYmlsaS5h'\n    'cHAucGxheXVybC52MS5VcGdyYWRlQnV0dG9uUgZidXR0b24=');\n\n@$core.Deprecated('Use videoInfoDescriptor instead')\nconst VideoInfo$json = {\n  '1': 'VideoInfo',\n  '2': [\n    {'1': 'quality', '3': 1, '4': 1, '5': 5, '10': 'quality'},\n    {'1': 'format', '3': 2, '4': 1, '5': 9, '10': 'format'},\n    {'1': 'timelength', '3': 3, '4': 1, '5': 3, '10': 'timelength'},\n    {'1': 'video_codecid', '3': 4, '4': 1, '5': 5, '10': 'videoCodecid'},\n    {\n      '1': 'stream_list',\n      '3': 5,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.Stream',\n      '10': 'streamList'\n    },\n    {\n      '1': 'dash_audio',\n      '3': 6,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.DashItem',\n      '10': 'dashAudio'\n    },\n    {\n      '1': 'dolby',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.DolbyItem',\n      '10': 'dolby'\n    },\n    {\n      '1': 'volume',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.VolumeInfo',\n      '10': 'volume'\n    },\n    {\n      '1': 'loss_less_item',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.LossLessItem',\n      '10': 'lossLessItem'\n    },\n    {'1': 'main_timelength', '3': 10, '4': 1, '5': 3, '10': 'mainTimelength'},\n  ],\n};\n\n/// Descriptor for `VideoInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List videoInfoDescriptor = $convert.base64Decode(\n    'CglWaWRlb0luZm8SGAoHcXVhbGl0eRgBIAEoBVIHcXVhbGl0eRIWCgZmb3JtYXQYAiABKAlSBm'\n    'Zvcm1hdBIeCgp0aW1lbGVuZ3RoGAMgASgDUgp0aW1lbGVuZ3RoEiMKDXZpZGVvX2NvZGVjaWQY'\n    'BCABKAVSDHZpZGVvQ29kZWNpZBJACgtzdHJlYW1fbGlzdBgFIAMoCzIfLmJpbGliaWxpLmFwcC'\n    '5wbGF5dXJsLnYxLlN0cmVhbVIKc3RyZWFtTGlzdBJACgpkYXNoX2F1ZGlvGAYgAygLMiEuYmls'\n    'aWJpbGkuYXBwLnBsYXl1cmwudjEuRGFzaEl0ZW1SCWRhc2hBdWRpbxI4CgVkb2xieRgHIAEoCz'\n    'IiLmJpbGliaWxpLmFwcC5wbGF5dXJsLnYxLkRvbGJ5SXRlbVIFZG9sYnkSOwoGdm9sdW1lGAgg'\n    'ASgLMiMuYmlsaWJpbGkuYXBwLnBsYXl1cmwudjEuVm9sdW1lSW5mb1IGdm9sdW1lEksKDmxvc3'\n    'NfbGVzc19pdGVtGAkgASgLMiUuYmlsaWJpbGkuYXBwLnBsYXl1cmwudjEuTG9zc0xlc3NJdGVt'\n    'Ugxsb3NzTGVzc0l0ZW0SJwoPbWFpbl90aW1lbGVuZ3RoGAogASgDUg5tYWluVGltZWxlbmd0aA'\n    '==');\n\n@$core.Deprecated('Use viewInfoDescriptor instead')\nconst ViewInfo$json = {\n  '1': 'ViewInfo',\n  '2': [\n    {\n      '1': 'dialog_map',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ViewInfo.DialogMapEntry',\n      '10': 'dialogMap'\n    },\n    {\n      '1': 'prompt_bar',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.PromptBar',\n      '10': 'promptBar'\n    },\n    {\n      '1': 'toasts',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.ComprehensiveToast',\n      '10': 'toasts'\n    },\n  ],\n  '3': [ViewInfo_DialogMapEntry$json],\n};\n\n@$core.Deprecated('Use viewInfoDescriptor instead')\nconst ViewInfo_DialogMapEntry$json = {\n  '1': 'DialogMapEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {\n      '1': 'value',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.Dialog',\n      '10': 'value'\n    },\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `ViewInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List viewInfoDescriptor = $convert.base64Decode(\n    'CghWaWV3SW5mbxJPCgpkaWFsb2dfbWFwGAEgAygLMjAuYmlsaWJpbGkuYXBwLnBsYXl1cmwudj'\n    'EuVmlld0luZm8uRGlhbG9nTWFwRW50cnlSCWRpYWxvZ01hcBJBCgpwcm9tcHRfYmFyGAIgASgL'\n    'MiIuYmlsaWJpbGkuYXBwLnBsYXl1cmwudjEuUHJvbXB0QmFyUglwcm9tcHRCYXISQwoGdG9hc3'\n    'RzGAMgAygLMisuYmlsaWJpbGkuYXBwLnBsYXl1cmwudjEuQ29tcHJlaGVuc2l2ZVRvYXN0UgZ0'\n    'b2FzdHMaXQoORGlhbG9nTWFwRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSNQoFdmFsdWUYAiABKA'\n    'syHy5iaWxpYmlsaS5hcHAucGxheXVybC52MS5EaWFsb2dSBXZhbHVlOgI4AQ==');\n\n@$core.Deprecated('Use vipRiskDescriptor instead')\nconst VipRisk$json = {\n  '1': 'VipRisk',\n  '2': [\n    {'1': 'allow', '3': 1, '4': 1, '5': 8, '10': 'allow'},\n    {'1': 'type', '3': 2, '4': 1, '5': 3, '10': 'type'},\n    {'1': 'reason', '3': 3, '4': 1, '5': 3, '10': 'reason'},\n    {'1': 'device_status', '3': 4, '4': 1, '5': 3, '10': 'deviceStatus'},\n  ],\n};\n\n/// Descriptor for `VipRisk`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List vipRiskDescriptor = $convert.base64Decode(\n    'CgdWaXBSaXNrEhQKBWFsbG93GAEgASgIUgVhbGxvdxISCgR0eXBlGAIgASgDUgR0eXBlEhYKBn'\n    'JlYXNvbhgDIAEoA1IGcmVhc29uEiMKDWRldmljZV9zdGF0dXMYBCABKANSDGRldmljZVN0YXR1'\n    'cw==');\n\n@$core.Deprecated('Use volumeInfoDescriptor instead')\nconst VolumeInfo$json = {\n  '1': 'VolumeInfo',\n  '2': [\n    {'1': 'measured_i', '3': 1, '4': 1, '5': 1, '10': 'measuredI'},\n    {'1': 'measured_lra', '3': 2, '4': 1, '5': 1, '10': 'measuredLra'},\n    {'1': 'measured_tp', '3': 3, '4': 1, '5': 1, '10': 'measuredTp'},\n    {\n      '1': 'measured_threshold',\n      '3': 4,\n      '4': 1,\n      '5': 1,\n      '10': 'measuredThreshold'\n    },\n    {'1': 'target_offset', '3': 5, '4': 1, '5': 1, '10': 'targetOffset'},\n    {'1': 'target_i', '3': 6, '4': 1, '5': 1, '10': 'targetI'},\n    {'1': 'target_tp', '3': 7, '4': 1, '5': 1, '10': 'targetTp'},\n    {\n      '1': 'multi_scene_args',\n      '3': 8,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.playurl.v1.VolumeInfo.MultiSceneArgsEntry',\n      '10': 'multiSceneArgs'\n    },\n  ],\n  '3': [VolumeInfo_MultiSceneArgsEntry$json],\n};\n\n@$core.Deprecated('Use volumeInfoDescriptor instead')\nconst VolumeInfo_MultiSceneArgsEntry$json = {\n  '1': 'MultiSceneArgsEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `VolumeInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List volumeInfoDescriptor = $convert.base64Decode(\n    'CgpWb2x1bWVJbmZvEh0KCm1lYXN1cmVkX2kYASABKAFSCW1lYXN1cmVkSRIhCgxtZWFzdXJlZF'\n    '9scmEYAiABKAFSC21lYXN1cmVkTHJhEh8KC21lYXN1cmVkX3RwGAMgASgBUgptZWFzdXJlZFRw'\n    'Ei0KEm1lYXN1cmVkX3RocmVzaG9sZBgEIAEoAVIRbWVhc3VyZWRUaHJlc2hvbGQSIwoNdGFyZ2'\n    'V0X29mZnNldBgFIAEoAVIMdGFyZ2V0T2Zmc2V0EhkKCHRhcmdldF9pGAYgASgBUgd0YXJnZXRJ'\n    'EhsKCXRhcmdldF90cBgHIAEoAVIIdGFyZ2V0VHASYQoQbXVsdGlfc2NlbmVfYXJncxgIIAMoCz'\n    'I3LmJpbGliaWxpLmFwcC5wbGF5dXJsLnYxLlZvbHVtZUluZm8uTXVsdGlTY2VuZUFyZ3NFbnRy'\n    'eVIObXVsdGlTY2VuZUFyZ3MaQQoTTXVsdGlTY2VuZUFyZ3NFbnRyeRIQCgNrZXkYASABKAlSA2'\n    'tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgB');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/viewunite/common.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/viewunite/common.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:fixnum/fixnum.dart' as $fixnum;\nimport 'package:protobuf/protobuf.dart' as $pb;\nimport 'package:protobuf/well_known_types/google/protobuf/any.pb.dart' as $0;\n\nimport '../../account/service/v1.pb.dart' as $2;\nimport '../../dagw/component/avatar/v1.pb.dart' as $1;\nimport '../../pagination.pb.dart' as $3;\nimport '../../playershared.pbenum.dart' as $4;\nimport 'common.pbenum.dart';\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nexport 'common.pbenum.dart';\n\nclass ActBannerItem extends $pb.GeneratedMessage {\n  factory ActBannerItem({\n    $core.String? url,\n    $core.String? cover,\n    JumpType? jumpType,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? report,\n  }) {\n    final result = create();\n    if (url != null) result.url = url;\n    if (cover != null) result.cover = cover;\n    if (jumpType != null) result.jumpType = jumpType;\n    if (report != null) result.report.addEntries(report);\n    return result;\n  }\n\n  ActBannerItem._();\n\n  factory ActBannerItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ActBannerItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ActBannerItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'url')\n    ..aOS(2, _omitFieldNames ? '' : 'cover')\n    ..aE<JumpType>(3, _omitFieldNames ? '' : 'jumpType',\n        enumValues: JumpType.values)\n    ..m<$core.String, $core.String>(4, _omitFieldNames ? '' : 'report',\n        entryClassName: 'ActBannerItem.ReportEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.viewunite.common'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ActBannerItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ActBannerItem copyWith(void Function(ActBannerItem) updates) =>\n      super.copyWith((message) => updates(message as ActBannerItem))\n          as ActBannerItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ActBannerItem create() => ActBannerItem._();\n  @$core.override\n  ActBannerItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ActBannerItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ActBannerItem>(create);\n  static ActBannerItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get url => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set url($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUrl() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get cover => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cover($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCover() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCover() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  JumpType get jumpType => $_getN(2);\n  @$pb.TagNumber(3)\n  set jumpType(JumpType value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasJumpType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearJumpType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $pb.PbMap<$core.String, $core.String> get report => $_getMap(3);\n}\n\nclass ActPageItems extends $pb.GeneratedMessage {\n  factory ActPageItems({\n    $core.Iterable<ActBannerItem>? item,\n    ShowStyle? showStyle,\n    $core.String? title,\n  }) {\n    final result = create();\n    if (item != null) result.item.addAll(item);\n    if (showStyle != null) result.showStyle = showStyle;\n    if (title != null) result.title = title;\n    return result;\n  }\n\n  ActPageItems._();\n\n  factory ActPageItems.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ActPageItems.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ActPageItems',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..pPM<ActBannerItem>(1, _omitFieldNames ? '' : 'item',\n        subBuilder: ActBannerItem.create)\n    ..aE<ShowStyle>(2, _omitFieldNames ? '' : 'showStyle',\n        enumValues: ShowStyle.values)\n    ..aOS(3, _omitFieldNames ? '' : 'title')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ActPageItems clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ActPageItems copyWith(void Function(ActPageItems) updates) =>\n      super.copyWith((message) => updates(message as ActPageItems))\n          as ActPageItems;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ActPageItems create() => ActPageItems._();\n  @$core.override\n  ActPageItems createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ActPageItems getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ActPageItems>(create);\n  static ActPageItems? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<ActBannerItem> get item => $_getList(0);\n\n  @$pb.TagNumber(2)\n  ShowStyle get showStyle => $_getN(1);\n  @$pb.TagNumber(2)\n  set showStyle(ShowStyle value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasShowStyle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearShowStyle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get title => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set title($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTitle() => $_clearField(3);\n}\n\nclass Activity extends $pb.GeneratedMessage {\n  factory Activity({\n    $core.int? id,\n    $core.String? title,\n    $core.String? link,\n    $core.String? cover,\n    $core.int? type,\n    $core.String? ab,\n    $core.String? showName,\n    $core.String? picurl,\n    $core.String? picurlSelected,\n    $core.String? h5Link,\n    $core.String? jumpMode,\n    $core.Iterable<Item>? items,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (title != null) result.title = title;\n    if (link != null) result.link = link;\n    if (cover != null) result.cover = cover;\n    if (type != null) result.type = type;\n    if (ab != null) result.ab = ab;\n    if (showName != null) result.showName = showName;\n    if (picurl != null) result.picurl = picurl;\n    if (picurlSelected != null) result.picurlSelected = picurlSelected;\n    if (h5Link != null) result.h5Link = h5Link;\n    if (jumpMode != null) result.jumpMode = jumpMode;\n    if (items != null) result.items.addAll(items);\n    return result;\n  }\n\n  Activity._();\n\n  factory Activity.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Activity.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Activity',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'link')\n    ..aOS(4, _omitFieldNames ? '' : 'cover')\n    ..aI(5, _omitFieldNames ? '' : 'type')\n    ..aOS(6, _omitFieldNames ? '' : 'ab')\n    ..aOS(7, _omitFieldNames ? '' : 'showName')\n    ..aOS(8, _omitFieldNames ? '' : 'picurl')\n    ..aOS(9, _omitFieldNames ? '' : 'picurlSelected')\n    ..aOS(10, _omitFieldNames ? '' : 'h5Link')\n    ..aOS(11, _omitFieldNames ? '' : 'jumpMode')\n    ..pPM<Item>(12, _omitFieldNames ? '' : 'items', subBuilder: Item.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Activity clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Activity copyWith(void Function(Activity) updates) =>\n      super.copyWith((message) => updates(message as Activity)) as Activity;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Activity create() => Activity._();\n  @$core.override\n  Activity createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Activity getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Activity>(create);\n  static Activity? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get id => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set id($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get link => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set link($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLink() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLink() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get cover => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set cover($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCover() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCover() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get type => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set type($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearType() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get ab => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set ab($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasAb() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearAb() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get showName => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set showName($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasShowName() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearShowName() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get picurl => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set picurl($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasPicurl() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearPicurl() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get picurlSelected => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set picurlSelected($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasPicurlSelected() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearPicurlSelected() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get h5Link => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set h5Link($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasH5Link() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearH5Link() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get jumpMode => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set jumpMode($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasJumpMode() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearJumpMode() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $pb.PbList<Item> get items => $_getList(11);\n}\n\nclass ActivityEntrance extends $pb.GeneratedMessage {\n  factory ActivityEntrance({\n    $core.String? activityCover,\n    $core.String? activityTitle,\n    $core.String? wordTag,\n    $core.String? activitySubtitle,\n    $core.String? activityLink,\n    $core.int? activityType,\n    $core.int? reserveId,\n    $core.int? status,\n    $core.Iterable<User>? upperList,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? report,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>?\n        orderReportParams,\n  }) {\n    final result = create();\n    if (activityCover != null) result.activityCover = activityCover;\n    if (activityTitle != null) result.activityTitle = activityTitle;\n    if (wordTag != null) result.wordTag = wordTag;\n    if (activitySubtitle != null) result.activitySubtitle = activitySubtitle;\n    if (activityLink != null) result.activityLink = activityLink;\n    if (activityType != null) result.activityType = activityType;\n    if (reserveId != null) result.reserveId = reserveId;\n    if (status != null) result.status = status;\n    if (upperList != null) result.upperList.addAll(upperList);\n    if (report != null) result.report.addEntries(report);\n    if (orderReportParams != null)\n      result.orderReportParams.addEntries(orderReportParams);\n    return result;\n  }\n\n  ActivityEntrance._();\n\n  factory ActivityEntrance.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ActivityEntrance.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ActivityEntrance',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'activityCover')\n    ..aOS(2, _omitFieldNames ? '' : 'activityTitle')\n    ..aOS(3, _omitFieldNames ? '' : 'wordTag')\n    ..aOS(4, _omitFieldNames ? '' : 'activitySubtitle')\n    ..aOS(5, _omitFieldNames ? '' : 'activityLink')\n    ..aI(6, _omitFieldNames ? '' : 'activityType')\n    ..aI(7, _omitFieldNames ? '' : 'reserveId')\n    ..aI(8, _omitFieldNames ? '' : 'status')\n    ..pPM<User>(9, _omitFieldNames ? '' : 'upperList', subBuilder: User.create)\n    ..m<$core.String, $core.String>(10, _omitFieldNames ? '' : 'report',\n        entryClassName: 'ActivityEntrance.ReportEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.viewunite.common'))\n    ..m<$core.String, $core.String>(\n        11, _omitFieldNames ? '' : 'orderReportParams',\n        entryClassName: 'ActivityEntrance.OrderReportParamsEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.viewunite.common'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ActivityEntrance clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ActivityEntrance copyWith(void Function(ActivityEntrance) updates) =>\n      super.copyWith((message) => updates(message as ActivityEntrance))\n          as ActivityEntrance;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ActivityEntrance create() => ActivityEntrance._();\n  @$core.override\n  ActivityEntrance createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ActivityEntrance getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ActivityEntrance>(create);\n  static ActivityEntrance? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get activityCover => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set activityCover($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasActivityCover() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearActivityCover() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get activityTitle => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set activityTitle($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasActivityTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearActivityTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get wordTag => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set wordTag($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasWordTag() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearWordTag() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get activitySubtitle => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set activitySubtitle($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasActivitySubtitle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearActivitySubtitle() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get activityLink => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set activityLink($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasActivityLink() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearActivityLink() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get activityType => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set activityType($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasActivityType() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearActivityType() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get reserveId => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set reserveId($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasReserveId() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearReserveId() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get status => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set status($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasStatus() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearStatus() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $pb.PbList<User> get upperList => $_getList(8);\n\n  @$pb.TagNumber(10)\n  $pb.PbMap<$core.String, $core.String> get report => $_getMap(9);\n\n  @$pb.TagNumber(11)\n  $pb.PbMap<$core.String, $core.String> get orderReportParams => $_getMap(10);\n}\n\nclass ActivityEntranceModule extends $pb.GeneratedMessage {\n  factory ActivityEntranceModule({\n    $core.Iterable<ActivityEntrance>? activityEntrance,\n  }) {\n    final result = create();\n    if (activityEntrance != null)\n      result.activityEntrance.addAll(activityEntrance);\n    return result;\n  }\n\n  ActivityEntranceModule._();\n\n  factory ActivityEntranceModule.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ActivityEntranceModule.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ActivityEntranceModule',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..pPM<ActivityEntrance>(1, _omitFieldNames ? '' : 'activityEntrance',\n        subBuilder: ActivityEntrance.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ActivityEntranceModule clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ActivityEntranceModule copyWith(\n          void Function(ActivityEntranceModule) updates) =>\n      super.copyWith((message) => updates(message as ActivityEntranceModule))\n          as ActivityEntranceModule;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ActivityEntranceModule create() => ActivityEntranceModule._();\n  @$core.override\n  ActivityEntranceModule createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ActivityEntranceModule getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ActivityEntranceModule>(create);\n  static ActivityEntranceModule? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<ActivityEntrance> get activityEntrance => $_getList(0);\n}\n\nclass ActivityGuidanceBar extends $pb.GeneratedMessage {\n  factory ActivityGuidanceBar({\n    $core.String? winId,\n    $core.bool? login,\n    $core.String? showTime,\n    $core.String? action,\n    $core.String? url,\n    $core.String? closeType,\n    ImagesWidget? images,\n    TextWidget? title,\n    TextWidget? subTitle,\n    ButtonWidget? button,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? report,\n  }) {\n    final result = create();\n    if (winId != null) result.winId = winId;\n    if (login != null) result.login = login;\n    if (showTime != null) result.showTime = showTime;\n    if (action != null) result.action = action;\n    if (url != null) result.url = url;\n    if (closeType != null) result.closeType = closeType;\n    if (images != null) result.images = images;\n    if (title != null) result.title = title;\n    if (subTitle != null) result.subTitle = subTitle;\n    if (button != null) result.button = button;\n    if (report != null) result.report.addEntries(report);\n    return result;\n  }\n\n  ActivityGuidanceBar._();\n\n  factory ActivityGuidanceBar.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ActivityGuidanceBar.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ActivityGuidanceBar',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'winId')\n    ..aOB(2, _omitFieldNames ? '' : 'login')\n    ..aOS(3, _omitFieldNames ? '' : 'showTime')\n    ..aOS(4, _omitFieldNames ? '' : 'action')\n    ..aOS(5, _omitFieldNames ? '' : 'url')\n    ..aOS(6, _omitFieldNames ? '' : 'closeType')\n    ..aOM<ImagesWidget>(7, _omitFieldNames ? '' : 'images',\n        subBuilder: ImagesWidget.create)\n    ..aOM<TextWidget>(8, _omitFieldNames ? '' : 'title',\n        subBuilder: TextWidget.create)\n    ..aOM<TextWidget>(9, _omitFieldNames ? '' : 'subTitle',\n        subBuilder: TextWidget.create)\n    ..aOM<ButtonWidget>(10, _omitFieldNames ? '' : 'button',\n        subBuilder: ButtonWidget.create)\n    ..m<$core.String, $core.String>(11, _omitFieldNames ? '' : 'report',\n        entryClassName: 'ActivityGuidanceBar.ReportEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.viewunite.common'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ActivityGuidanceBar clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ActivityGuidanceBar copyWith(void Function(ActivityGuidanceBar) updates) =>\n      super.copyWith((message) => updates(message as ActivityGuidanceBar))\n          as ActivityGuidanceBar;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ActivityGuidanceBar create() => ActivityGuidanceBar._();\n  @$core.override\n  ActivityGuidanceBar createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ActivityGuidanceBar getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ActivityGuidanceBar>(create);\n  static ActivityGuidanceBar? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get winId => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set winId($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasWinId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearWinId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get login => $_getBF(1);\n  @$pb.TagNumber(2)\n  set login($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLogin() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLogin() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get showTime => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set showTime($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasShowTime() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearShowTime() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get action => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set action($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasAction() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearAction() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get url => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set url($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasUrl() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearUrl() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get closeType => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set closeType($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCloseType() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCloseType() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  ImagesWidget get images => $_getN(6);\n  @$pb.TagNumber(7)\n  set images(ImagesWidget value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasImages() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearImages() => $_clearField(7);\n  @$pb.TagNumber(7)\n  ImagesWidget ensureImages() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  TextWidget get title => $_getN(7);\n  @$pb.TagNumber(8)\n  set title(TextWidget value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasTitle() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearTitle() => $_clearField(8);\n  @$pb.TagNumber(8)\n  TextWidget ensureTitle() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  TextWidget get subTitle => $_getN(8);\n  @$pb.TagNumber(9)\n  set subTitle(TextWidget value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasSubTitle() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearSubTitle() => $_clearField(9);\n  @$pb.TagNumber(9)\n  TextWidget ensureSubTitle() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  ButtonWidget get button => $_getN(9);\n  @$pb.TagNumber(10)\n  set button(ButtonWidget value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasButton() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearButton() => $_clearField(10);\n  @$pb.TagNumber(10)\n  ButtonWidget ensureButton() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  $pb.PbMap<$core.String, $core.String> get report => $_getMap(10);\n}\n\nclass ActivityIFrame extends $pb.GeneratedMessage {\n  factory ActivityIFrame({\n    $core.String? url,\n    $core.double? aspectRatio,\n  }) {\n    final result = create();\n    if (url != null) result.url = url;\n    if (aspectRatio != null) result.aspectRatio = aspectRatio;\n    return result;\n  }\n\n  ActivityIFrame._();\n\n  factory ActivityIFrame.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ActivityIFrame.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ActivityIFrame',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'url')\n    ..aD(2, _omitFieldNames ? '' : 'aspectRatio')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ActivityIFrame clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ActivityIFrame copyWith(void Function(ActivityIFrame) updates) =>\n      super.copyWith((message) => updates(message as ActivityIFrame))\n          as ActivityIFrame;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ActivityIFrame create() => ActivityIFrame._();\n  @$core.override\n  ActivityIFrame createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ActivityIFrame getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ActivityIFrame>(create);\n  static ActivityIFrame? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get url => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set url($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUrl() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.double get aspectRatio => $_getN(1);\n  @$pb.TagNumber(2)\n  set aspectRatio($core.double value) => $_setDouble(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAspectRatio() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAspectRatio() => $_clearField(2);\n}\n\nclass ActivityReserve extends $pb.GeneratedMessage {\n  factory ActivityReserve({\n    $core.String? title,\n    StatInfo? vt,\n    StatInfo? danmaku,\n    ReserveButton? button,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (vt != null) result.vt = vt;\n    if (danmaku != null) result.danmaku = danmaku;\n    if (button != null) result.button = button;\n    return result;\n  }\n\n  ActivityReserve._();\n\n  factory ActivityReserve.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ActivityReserve.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ActivityReserve',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOM<StatInfo>(2, _omitFieldNames ? '' : 'vt', subBuilder: StatInfo.create)\n    ..aOM<StatInfo>(3, _omitFieldNames ? '' : 'danmaku',\n        subBuilder: StatInfo.create)\n    ..aOM<ReserveButton>(4, _omitFieldNames ? '' : 'button',\n        subBuilder: ReserveButton.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ActivityReserve clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ActivityReserve copyWith(void Function(ActivityReserve) updates) =>\n      super.copyWith((message) => updates(message as ActivityReserve))\n          as ActivityReserve;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ActivityReserve create() => ActivityReserve._();\n  @$core.override\n  ActivityReserve createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ActivityReserve getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ActivityReserve>(create);\n  static ActivityReserve? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  StatInfo get vt => $_getN(1);\n  @$pb.TagNumber(2)\n  set vt(StatInfo value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasVt() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearVt() => $_clearField(2);\n  @$pb.TagNumber(2)\n  StatInfo ensureVt() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  StatInfo get danmaku => $_getN(2);\n  @$pb.TagNumber(3)\n  set danmaku(StatInfo value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDanmaku() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDanmaku() => $_clearField(3);\n  @$pb.TagNumber(3)\n  StatInfo ensureDanmaku() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  ReserveButton get button => $_getN(3);\n  @$pb.TagNumber(4)\n  set button(ReserveButton value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasButton() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearButton() => $_clearField(4);\n  @$pb.TagNumber(4)\n  ReserveButton ensureButton() => $_ensure(3);\n}\n\nclass ActivityResource extends $pb.GeneratedMessage {\n  factory ActivityResource({\n    $core.String? modPoolName,\n    $core.String? modResourceName,\n  }) {\n    final result = create();\n    if (modPoolName != null) result.modPoolName = modPoolName;\n    if (modResourceName != null) result.modResourceName = modResourceName;\n    return result;\n  }\n\n  ActivityResource._();\n\n  factory ActivityResource.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ActivityResource.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ActivityResource',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'modPoolName')\n    ..aOS(2, _omitFieldNames ? '' : 'modResourceName')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ActivityResource clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ActivityResource copyWith(void Function(ActivityResource) updates) =>\n      super.copyWith((message) => updates(message as ActivityResource))\n          as ActivityResource;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ActivityResource create() => ActivityResource._();\n  @$core.override\n  ActivityResource createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ActivityResource getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ActivityResource>(create);\n  static ActivityResource? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get modPoolName => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set modPoolName($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasModPoolName() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearModPoolName() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get modResourceName => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set modResourceName($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasModResourceName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearModResourceName() => $_clearField(2);\n}\n\nclass ActivityStarRail extends $pb.GeneratedMessage {\n  factory ActivityStarRail({\n    $core.String? pic,\n    $core.Iterable<StarRail>? picGallery,\n  }) {\n    final result = create();\n    if (pic != null) result.pic = pic;\n    if (picGallery != null) result.picGallery.addAll(picGallery);\n    return result;\n  }\n\n  ActivityStarRail._();\n\n  factory ActivityStarRail.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ActivityStarRail.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ActivityStarRail',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'pic')\n    ..pPM<StarRail>(2, _omitFieldNames ? '' : 'picGallery',\n        subBuilder: StarRail.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ActivityStarRail clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ActivityStarRail copyWith(void Function(ActivityStarRail) updates) =>\n      super.copyWith((message) => updates(message as ActivityStarRail))\n          as ActivityStarRail;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ActivityStarRail create() => ActivityStarRail._();\n  @$core.override\n  ActivityStarRail createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ActivityStarRail getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ActivityStarRail>(create);\n  static ActivityStarRail? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get pic => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set pic($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPic() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPic() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<StarRail> get picGallery => $_getList(1);\n}\n\nclass ActivityTab extends $pb.GeneratedMessage {\n  factory ActivityTab({\n    $core.int? id,\n    $core.String? title,\n    $core.int? type,\n    $core.String? showName,\n    $core.String? picurl,\n    $core.String? picurlSelected,\n    $core.String? h5Link,\n    $core.String? link,\n    $core.int? linkType,\n    $fixnum.Int64? bizKey,\n    $core.String? desc,\n    $core.String? actExt,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? report,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (title != null) result.title = title;\n    if (type != null) result.type = type;\n    if (showName != null) result.showName = showName;\n    if (picurl != null) result.picurl = picurl;\n    if (picurlSelected != null) result.picurlSelected = picurlSelected;\n    if (h5Link != null) result.h5Link = h5Link;\n    if (link != null) result.link = link;\n    if (linkType != null) result.linkType = linkType;\n    if (bizKey != null) result.bizKey = bizKey;\n    if (desc != null) result.desc = desc;\n    if (actExt != null) result.actExt = actExt;\n    if (report != null) result.report.addEntries(report);\n    return result;\n  }\n\n  ActivityTab._();\n\n  factory ActivityTab.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ActivityTab.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ActivityTab',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aI(3, _omitFieldNames ? '' : 'type')\n    ..aOS(4, _omitFieldNames ? '' : 'showName')\n    ..aOS(5, _omitFieldNames ? '' : 'picurl')\n    ..aOS(6, _omitFieldNames ? '' : 'picurlSelected')\n    ..aOS(7, _omitFieldNames ? '' : 'h5Link')\n    ..aOS(8, _omitFieldNames ? '' : 'link')\n    ..aI(9, _omitFieldNames ? '' : 'linkType')\n    ..aInt64(10, _omitFieldNames ? '' : 'bizKey')\n    ..aOS(11, _omitFieldNames ? '' : 'desc')\n    ..aOS(12, _omitFieldNames ? '' : 'actExt')\n    ..m<$core.String, $core.String>(13, _omitFieldNames ? '' : 'report',\n        entryClassName: 'ActivityTab.ReportEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.viewunite.common'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ActivityTab clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ActivityTab copyWith(void Function(ActivityTab) updates) =>\n      super.copyWith((message) => updates(message as ActivityTab))\n          as ActivityTab;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ActivityTab create() => ActivityTab._();\n  @$core.override\n  ActivityTab createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ActivityTab getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ActivityTab>(create);\n  static ActivityTab? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get id => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set id($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get type => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set type($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get showName => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set showName($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasShowName() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearShowName() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get picurl => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set picurl($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPicurl() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPicurl() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get picurlSelected => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set picurlSelected($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasPicurlSelected() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearPicurlSelected() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get h5Link => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set h5Link($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasH5Link() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearH5Link() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get link => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set link($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasLink() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearLink() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.int get linkType => $_getIZ(8);\n  @$pb.TagNumber(9)\n  set linkType($core.int value) => $_setSignedInt32(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasLinkType() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearLinkType() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $fixnum.Int64 get bizKey => $_getI64(9);\n  @$pb.TagNumber(10)\n  set bizKey($fixnum.Int64 value) => $_setInt64(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasBizKey() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearBizKey() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get desc => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set desc($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasDesc() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearDesc() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get actExt => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set actExt($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasActExt() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearActExt() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $pb.PbMap<$core.String, $core.String> get report => $_getMap(12);\n}\n\nclass AggEpCard extends $pb.GeneratedMessage {\n  factory AggEpCard({\n    $core.String? title,\n    $core.String? cover,\n    $core.String? icon,\n    $core.int? num,\n    $core.String? jumpUrl,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (icon != null) result.icon = icon;\n    if (num != null) result.num = num;\n    if (jumpUrl != null) result.jumpUrl = jumpUrl;\n    return result;\n  }\n\n  AggEpCard._();\n\n  factory AggEpCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AggEpCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AggEpCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'cover')\n    ..aOS(3, _omitFieldNames ? '' : 'icon')\n    ..aI(4, _omitFieldNames ? '' : 'num')\n    ..aOS(5, _omitFieldNames ? '' : 'jumpUrl')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AggEpCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AggEpCard copyWith(void Function(AggEpCard) updates) =>\n      super.copyWith((message) => updates(message as AggEpCard)) as AggEpCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AggEpCard create() => AggEpCard._();\n  @$core.override\n  AggEpCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AggEpCard getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<AggEpCard>(create);\n  static AggEpCard? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get cover => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cover($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCover() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCover() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get icon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set icon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIcon() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get num => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set num($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasNum() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearNum() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get jumpUrl => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set jumpUrl($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasJumpUrl() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearJumpUrl() => $_clearField(5);\n}\n\nclass AggEps extends $pb.GeneratedMessage {\n  factory AggEps({\n    $core.Iterable<AggEpCard>? aggEpCards,\n    $core.int? placeIndex,\n  }) {\n    final result = create();\n    if (aggEpCards != null) result.aggEpCards.addAll(aggEpCards);\n    if (placeIndex != null) result.placeIndex = placeIndex;\n    return result;\n  }\n\n  AggEps._();\n\n  factory AggEps.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AggEps.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AggEps',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..pPM<AggEpCard>(1, _omitFieldNames ? '' : 'aggEpCards',\n        subBuilder: AggEpCard.create)\n    ..aI(2, _omitFieldNames ? '' : 'placeIndex')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AggEps clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AggEps copyWith(void Function(AggEps) updates) =>\n      super.copyWith((message) => updates(message as AggEps)) as AggEps;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AggEps create() => AggEps._();\n  @$core.override\n  AggEps createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AggEps getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<AggEps>(create);\n  static AggEps? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<AggEpCard> get aggEpCards => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.int get placeIndex => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set placeIndex($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPlaceIndex() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPlaceIndex() => $_clearField(2);\n}\n\nclass ArcRights extends $pb.GeneratedMessage {\n  factory ArcRights({\n    $core.bool? isChargingPay,\n  }) {\n    final result = create();\n    if (isChargingPay != null) result.isChargingPay = isChargingPay;\n    return result;\n  }\n\n  ArcRights._();\n\n  factory ArcRights.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ArcRights.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ArcRights',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'isChargingPay')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ArcRights clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ArcRights copyWith(void Function(ArcRights) updates) =>\n      super.copyWith((message) => updates(message as ArcRights)) as ArcRights;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ArcRights create() => ArcRights._();\n  @$core.override\n  ArcRights createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ArcRights getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ArcRights>(create);\n  static ArcRights? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get isChargingPay => $_getBF(0);\n  @$pb.TagNumber(1)\n  set isChargingPay($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIsChargingPay() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIsChargingPay() => $_clearField(1);\n}\n\nclass AttentionRecommend extends $pb.GeneratedMessage {\n  factory AttentionRecommend() => create();\n\n  AttentionRecommend._();\n\n  factory AttentionRecommend.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AttentionRecommend.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AttentionRecommend',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AttentionRecommend clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AttentionRecommend copyWith(void Function(AttentionRecommend) updates) =>\n      super.copyWith((message) => updates(message as AttentionRecommend))\n          as AttentionRecommend;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AttentionRecommend create() => AttentionRecommend._();\n  @$core.override\n  AttentionRecommend createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AttentionRecommend getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AttentionRecommend>(create);\n  static AttentionRecommend? _defaultInstance;\n}\n\nclass Audio extends $pb.GeneratedMessage {\n  factory Audio({\n    $core.Iterable<$core.MapEntry<$fixnum.Int64, AudioInfo>>? audioInfo,\n  }) {\n    final result = create();\n    if (audioInfo != null) result.audioInfo.addEntries(audioInfo);\n    return result;\n  }\n\n  Audio._();\n\n  factory Audio.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Audio.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Audio',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..m<$fixnum.Int64, AudioInfo>(1, _omitFieldNames ? '' : 'audioInfo',\n        entryClassName: 'Audio.AudioInfoEntry',\n        keyFieldType: $pb.PbFieldType.O6,\n        valueFieldType: $pb.PbFieldType.OM,\n        valueCreator: AudioInfo.create,\n        valueDefaultOrMaker: AudioInfo.getDefault,\n        packageName: const $pb.PackageName('bilibili.app.viewunite.common'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Audio clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Audio copyWith(void Function(Audio) updates) =>\n      super.copyWith((message) => updates(message as Audio)) as Audio;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Audio create() => Audio._();\n  @$core.override\n  Audio createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Audio getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Audio>(create);\n  static Audio? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbMap<$fixnum.Int64, AudioInfo> get audioInfo => $_getMap(0);\n}\n\nclass AudioInfo extends $pb.GeneratedMessage {\n  factory AudioInfo({\n    $core.String? title,\n    $core.String? coverUrl,\n    $fixnum.Int64? songId,\n    $fixnum.Int64? playCount,\n    $fixnum.Int64? replyCount,\n    $fixnum.Int64? upperId,\n    $core.String? entrance,\n    $fixnum.Int64? songAttr,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (coverUrl != null) result.coverUrl = coverUrl;\n    if (songId != null) result.songId = songId;\n    if (playCount != null) result.playCount = playCount;\n    if (replyCount != null) result.replyCount = replyCount;\n    if (upperId != null) result.upperId = upperId;\n    if (entrance != null) result.entrance = entrance;\n    if (songAttr != null) result.songAttr = songAttr;\n    return result;\n  }\n\n  AudioInfo._();\n\n  factory AudioInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AudioInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AudioInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'coverUrl')\n    ..aInt64(3, _omitFieldNames ? '' : 'songId')\n    ..aInt64(4, _omitFieldNames ? '' : 'playCount')\n    ..aInt64(5, _omitFieldNames ? '' : 'replyCount')\n    ..aInt64(6, _omitFieldNames ? '' : 'upperId')\n    ..aOS(7, _omitFieldNames ? '' : 'entrance')\n    ..aInt64(8, _omitFieldNames ? '' : 'songAttr')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AudioInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AudioInfo copyWith(void Function(AudioInfo) updates) =>\n      super.copyWith((message) => updates(message as AudioInfo)) as AudioInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AudioInfo create() => AudioInfo._();\n  @$core.override\n  AudioInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AudioInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<AudioInfo>(create);\n  static AudioInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get coverUrl => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set coverUrl($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCoverUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCoverUrl() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get songId => $_getI64(2);\n  @$pb.TagNumber(3)\n  set songId($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSongId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSongId() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get playCount => $_getI64(3);\n  @$pb.TagNumber(4)\n  set playCount($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPlayCount() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPlayCount() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get replyCount => $_getI64(4);\n  @$pb.TagNumber(5)\n  set replyCount($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasReplyCount() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearReplyCount() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get upperId => $_getI64(5);\n  @$pb.TagNumber(6)\n  set upperId($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasUpperId() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearUpperId() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get entrance => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set entrance($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasEntrance() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearEntrance() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get songAttr => $_getI64(7);\n  @$pb.TagNumber(8)\n  set songAttr($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasSongAttr() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearSongAttr() => $_clearField(8);\n}\n\nclass Author extends $pb.GeneratedMessage {\n  factory Author({\n    $fixnum.Int64? mid,\n    $core.String? name,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (name != null) result.name = name;\n    return result;\n  }\n\n  Author._();\n\n  factory Author.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Author.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Author',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Author clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Author copyWith(void Function(Author) updates) =>\n      super.copyWith((message) => updates(message as Author)) as Author;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Author create() => Author._();\n  @$core.override\n  Author createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Author getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Author>(create);\n  static Author? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n}\n\nclass BadgeInfo extends $pb.GeneratedMessage {\n  factory BadgeInfo({\n    $core.String? text,\n    $core.String? textColor,\n    $core.String? textColorNight,\n    $core.String? bgColor,\n    $core.String? bgColorNight,\n    $core.String? borderColor,\n    $core.String? borderColorNight,\n    $core.int? bgStyle,\n    $core.String? img,\n    $core.int? type,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (textColor != null) result.textColor = textColor;\n    if (textColorNight != null) result.textColorNight = textColorNight;\n    if (bgColor != null) result.bgColor = bgColor;\n    if (bgColorNight != null) result.bgColorNight = bgColorNight;\n    if (borderColor != null) result.borderColor = borderColor;\n    if (borderColorNight != null) result.borderColorNight = borderColorNight;\n    if (bgStyle != null) result.bgStyle = bgStyle;\n    if (img != null) result.img = img;\n    if (type != null) result.type = type;\n    return result;\n  }\n\n  BadgeInfo._();\n\n  factory BadgeInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BadgeInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BadgeInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aOS(2, _omitFieldNames ? '' : 'textColor')\n    ..aOS(3, _omitFieldNames ? '' : 'textColorNight')\n    ..aOS(4, _omitFieldNames ? '' : 'bgColor')\n    ..aOS(5, _omitFieldNames ? '' : 'bgColorNight')\n    ..aOS(6, _omitFieldNames ? '' : 'borderColor')\n    ..aOS(7, _omitFieldNames ? '' : 'borderColorNight')\n    ..aI(8, _omitFieldNames ? '' : 'bgStyle')\n    ..aOS(9, _omitFieldNames ? '' : 'img')\n    ..aI(10, _omitFieldNames ? '' : 'type')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BadgeInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BadgeInfo copyWith(void Function(BadgeInfo) updates) =>\n      super.copyWith((message) => updates(message as BadgeInfo)) as BadgeInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BadgeInfo create() => BadgeInfo._();\n  @$core.override\n  BadgeInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BadgeInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BadgeInfo>(create);\n  static BadgeInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get textColor => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set textColor($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTextColor() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTextColor() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get textColorNight => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set textColorNight($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTextColorNight() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTextColorNight() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get bgColor => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set bgColor($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBgColor() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBgColor() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get bgColorNight => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set bgColorNight($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBgColorNight() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBgColorNight() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get borderColor => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set borderColor($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasBorderColor() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearBorderColor() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get borderColorNight => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set borderColorNight($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBorderColorNight() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBorderColorNight() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get bgStyle => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set bgStyle($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasBgStyle() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearBgStyle() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get img => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set img($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasImg() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearImg() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.int get type => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set type($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasType() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearType() => $_clearField(10);\n}\n\nclass Banner extends $pb.GeneratedMessage {\n  factory Banner({\n    $core.String? title,\n    $core.Iterable<RelateItem>? relateItem,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (relateItem != null) result.relateItem.addAll(relateItem);\n    return result;\n  }\n\n  Banner._();\n\n  factory Banner.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Banner.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Banner',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..pPM<RelateItem>(2, _omitFieldNames ? '' : 'relateItem',\n        subBuilder: RelateItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Banner clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Banner copyWith(void Function(Banner) updates) =>\n      super.copyWith((message) => updates(message as Banner)) as Banner;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Banner create() => Banner._();\n  @$core.override\n  Banner createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Banner getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Banner>(create);\n  static Banner? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<RelateItem> get relateItem => $_getList(1);\n}\n\nclass BgInfo extends $pb.GeneratedMessage {\n  factory BgInfo({\n    $core.String? lightShortBg,\n    $core.String? darkShortBg,\n    $core.String? lightLongBg,\n    $core.String? darkLongBg,\n  }) {\n    final result = create();\n    if (lightShortBg != null) result.lightShortBg = lightShortBg;\n    if (darkShortBg != null) result.darkShortBg = darkShortBg;\n    if (lightLongBg != null) result.lightLongBg = lightLongBg;\n    if (darkLongBg != null) result.darkLongBg = darkLongBg;\n    return result;\n  }\n\n  BgInfo._();\n\n  factory BgInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BgInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BgInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'lightShortBg')\n    ..aOS(2, _omitFieldNames ? '' : 'darkShortBg')\n    ..aOS(3, _omitFieldNames ? '' : 'lightLongBg')\n    ..aOS(4, _omitFieldNames ? '' : 'darkLongBg')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BgInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BgInfo copyWith(void Function(BgInfo) updates) =>\n      super.copyWith((message) => updates(message as BgInfo)) as BgInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BgInfo create() => BgInfo._();\n  @$core.override\n  BgInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BgInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BgInfo>(create);\n  static BgInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get lightShortBg => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set lightShortBg($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLightShortBg() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLightShortBg() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get darkShortBg => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set darkShortBg($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDarkShortBg() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDarkShortBg() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get lightLongBg => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set lightLongBg($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLightLongBg() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLightLongBg() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get darkLongBg => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set darkLongBg($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDarkLongBg() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDarkLongBg() => $_clearField(4);\n}\n\nclass BizFavParam extends $pb.GeneratedMessage {\n  factory BizFavParam({\n    $fixnum.Int64? seasonId,\n  }) {\n    final result = create();\n    if (seasonId != null) result.seasonId = seasonId;\n    return result;\n  }\n\n  BizFavParam._();\n\n  factory BizFavParam.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BizFavParam.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BizFavParam',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'seasonId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BizFavParam clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BizFavParam copyWith(void Function(BizFavParam) updates) =>\n      super.copyWith((message) => updates(message as BizFavParam))\n          as BizFavParam;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BizFavParam create() => BizFavParam._();\n  @$core.override\n  BizFavParam createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BizFavParam getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<BizFavParam>(create);\n  static BizFavParam? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get seasonId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set seasonId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSeasonId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSeasonId() => $_clearField(1);\n}\n\nclass BizReserveActivityParam extends $pb.GeneratedMessage {\n  factory BizReserveActivityParam({\n    $fixnum.Int64? activityId,\n    $core.String? from,\n    $core.String? type,\n    $fixnum.Int64? oid,\n    $fixnum.Int64? reserveId,\n  }) {\n    final result = create();\n    if (activityId != null) result.activityId = activityId;\n    if (from != null) result.from = from;\n    if (type != null) result.type = type;\n    if (oid != null) result.oid = oid;\n    if (reserveId != null) result.reserveId = reserveId;\n    return result;\n  }\n\n  BizReserveActivityParam._();\n\n  factory BizReserveActivityParam.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BizReserveActivityParam.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BizReserveActivityParam',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'activityId')\n    ..aOS(2, _omitFieldNames ? '' : 'from')\n    ..aOS(3, _omitFieldNames ? '' : 'type')\n    ..aInt64(4, _omitFieldNames ? '' : 'oid')\n    ..aInt64(5, _omitFieldNames ? '' : 'reserveId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BizReserveActivityParam clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BizReserveActivityParam copyWith(\n          void Function(BizReserveActivityParam) updates) =>\n      super.copyWith((message) => updates(message as BizReserveActivityParam))\n          as BizReserveActivityParam;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BizReserveActivityParam create() => BizReserveActivityParam._();\n  @$core.override\n  BizReserveActivityParam createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BizReserveActivityParam getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<BizReserveActivityParam>(create);\n  static BizReserveActivityParam? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get activityId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set activityId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasActivityId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearActivityId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get from => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set from($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFrom() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFrom() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get type => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set type($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get oid => $_getI64(3);\n  @$pb.TagNumber(4)\n  set oid($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasOid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearOid() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get reserveId => $_getI64(4);\n  @$pb.TagNumber(5)\n  set reserveId($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasReserveId() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearReserveId() => $_clearField(5);\n}\n\nclass Button extends $pb.GeneratedMessage {\n  factory Button({\n    $core.String? title,\n    $core.String? leftStrikethroughText,\n    $core.String? type,\n    $core.String? link,\n    BadgeInfo? badgeInfo,\n    $core.String? subTitle,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (leftStrikethroughText != null)\n      result.leftStrikethroughText = leftStrikethroughText;\n    if (type != null) result.type = type;\n    if (link != null) result.link = link;\n    if (badgeInfo != null) result.badgeInfo = badgeInfo;\n    if (subTitle != null) result.subTitle = subTitle;\n    return result;\n  }\n\n  Button._();\n\n  factory Button.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Button.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Button',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'leftStrikethroughText')\n    ..aOS(3, _omitFieldNames ? '' : 'type')\n    ..aOS(4, _omitFieldNames ? '' : 'link')\n    ..aOM<BadgeInfo>(5, _omitFieldNames ? '' : 'badgeInfo',\n        subBuilder: BadgeInfo.create)\n    ..aOS(6, _omitFieldNames ? '' : 'subTitle')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Button clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Button copyWith(void Function(Button) updates) =>\n      super.copyWith((message) => updates(message as Button)) as Button;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Button create() => Button._();\n  @$core.override\n  Button createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Button getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Button>(create);\n  static Button? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get leftStrikethroughText => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set leftStrikethroughText($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLeftStrikethroughText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLeftStrikethroughText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get type => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set type($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get link => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set link($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLink() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLink() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  BadgeInfo get badgeInfo => $_getN(4);\n  @$pb.TagNumber(5)\n  set badgeInfo(BadgeInfo value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBadgeInfo() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBadgeInfo() => $_clearField(5);\n  @$pb.TagNumber(5)\n  BadgeInfo ensureBadgeInfo() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.String get subTitle => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set subTitle($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasSubTitle() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearSubTitle() => $_clearField(6);\n}\n\nclass ButtonWidget extends $pb.GeneratedMessage {\n  factory ButtonWidget({\n    $core.String? code,\n    TextWidget? text,\n    $core.String? bgColor,\n    $core.String? action,\n    $core.String? link,\n  }) {\n    final result = create();\n    if (code != null) result.code = code;\n    if (text != null) result.text = text;\n    if (bgColor != null) result.bgColor = bgColor;\n    if (action != null) result.action = action;\n    if (link != null) result.link = link;\n    return result;\n  }\n\n  ButtonWidget._();\n\n  factory ButtonWidget.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ButtonWidget.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ButtonWidget',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'code')\n    ..aOM<TextWidget>(2, _omitFieldNames ? '' : 'text',\n        subBuilder: TextWidget.create)\n    ..aOS(3, _omitFieldNames ? '' : 'bgColor')\n    ..aOS(4, _omitFieldNames ? '' : 'action')\n    ..aOS(5, _omitFieldNames ? '' : 'link')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ButtonWidget clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ButtonWidget copyWith(void Function(ButtonWidget) updates) =>\n      super.copyWith((message) => updates(message as ButtonWidget))\n          as ButtonWidget;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ButtonWidget create() => ButtonWidget._();\n  @$core.override\n  ButtonWidget createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ButtonWidget getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ButtonWidget>(create);\n  static ButtonWidget? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get code => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set code($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCode() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCode() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  TextWidget get text => $_getN(1);\n  @$pb.TagNumber(2)\n  set text(TextWidget value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n  @$pb.TagNumber(2)\n  TextWidget ensureText() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.String get bgColor => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set bgColor($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBgColor() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBgColor() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get action => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set action($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasAction() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearAction() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get link => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set link($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasLink() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearLink() => $_clearField(5);\n}\n\nclass CardBasicInfo extends $pb.GeneratedMessage {\n  factory CardBasicInfo({\n    $core.String? title,\n    $core.String? desc,\n    $core.String? cover,\n    $core.String? uri,\n    $core.String? trackId,\n    $core.String? uniqueId,\n    $fixnum.Int64? fromSourceType,\n    $core.String? fromSourceId,\n    $fixnum.Int64? materialId,\n    $core.String? coverGif,\n    Owner? author,\n    $fixnum.Int64? id,\n    $core.String? from,\n    $core.String? fromSpmidSuffix,\n    $core.String? reportFlowData,\n    $core.String? coverRightText,\n    CoverDimension? dimension,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (desc != null) result.desc = desc;\n    if (cover != null) result.cover = cover;\n    if (uri != null) result.uri = uri;\n    if (trackId != null) result.trackId = trackId;\n    if (uniqueId != null) result.uniqueId = uniqueId;\n    if (fromSourceType != null) result.fromSourceType = fromSourceType;\n    if (fromSourceId != null) result.fromSourceId = fromSourceId;\n    if (materialId != null) result.materialId = materialId;\n    if (coverGif != null) result.coverGif = coverGif;\n    if (author != null) result.author = author;\n    if (id != null) result.id = id;\n    if (from != null) result.from = from;\n    if (fromSpmidSuffix != null) result.fromSpmidSuffix = fromSpmidSuffix;\n    if (reportFlowData != null) result.reportFlowData = reportFlowData;\n    if (coverRightText != null) result.coverRightText = coverRightText;\n    if (dimension != null) result.dimension = dimension;\n    return result;\n  }\n\n  CardBasicInfo._();\n\n  factory CardBasicInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CardBasicInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CardBasicInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'desc')\n    ..aOS(3, _omitFieldNames ? '' : 'cover')\n    ..aOS(4, _omitFieldNames ? '' : 'uri')\n    ..aOS(5, _omitFieldNames ? '' : 'trackId')\n    ..aOS(6, _omitFieldNames ? '' : 'uniqueId')\n    ..aInt64(7, _omitFieldNames ? '' : 'fromSourceType')\n    ..aOS(8, _omitFieldNames ? '' : 'fromSourceId')\n    ..aInt64(9, _omitFieldNames ? '' : 'materialId')\n    ..aOS(10, _omitFieldNames ? '' : 'coverGif')\n    ..aOM<Owner>(11, _omitFieldNames ? '' : 'author', subBuilder: Owner.create)\n    ..aInt64(12, _omitFieldNames ? '' : 'id')\n    ..aOS(13, _omitFieldNames ? '' : 'from')\n    ..aOS(14, _omitFieldNames ? '' : 'fromSpmidSuffix')\n    ..aOS(15, _omitFieldNames ? '' : 'reportFlowData')\n    ..aOS(16, _omitFieldNames ? '' : 'coverRightText')\n    ..aOM<CoverDimension>(17, _omitFieldNames ? '' : 'dimension',\n        subBuilder: CoverDimension.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardBasicInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardBasicInfo copyWith(void Function(CardBasicInfo) updates) =>\n      super.copyWith((message) => updates(message as CardBasicInfo))\n          as CardBasicInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CardBasicInfo create() => CardBasicInfo._();\n  @$core.override\n  CardBasicInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CardBasicInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CardBasicInfo>(create);\n  static CardBasicInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get desc => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set desc($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDesc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDesc() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get cover => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set cover($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCover() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCover() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get uri => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set uri($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUri() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUri() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get trackId => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set trackId($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasTrackId() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearTrackId() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get uniqueId => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set uniqueId($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasUniqueId() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearUniqueId() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get fromSourceType => $_getI64(6);\n  @$pb.TagNumber(7)\n  set fromSourceType($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasFromSourceType() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearFromSourceType() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get fromSourceId => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set fromSourceId($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasFromSourceId() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearFromSourceId() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get materialId => $_getI64(8);\n  @$pb.TagNumber(9)\n  set materialId($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasMaterialId() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearMaterialId() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get coverGif => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set coverGif($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasCoverGif() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearCoverGif() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  Owner get author => $_getN(10);\n  @$pb.TagNumber(11)\n  set author(Owner value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasAuthor() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearAuthor() => $_clearField(11);\n  @$pb.TagNumber(11)\n  Owner ensureAuthor() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  $fixnum.Int64 get id => $_getI64(11);\n  @$pb.TagNumber(12)\n  set id($fixnum.Int64 value) => $_setInt64(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasId() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearId() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.String get from => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set from($core.String value) => $_setString(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasFrom() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearFrom() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.String get fromSpmidSuffix => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set fromSpmidSuffix($core.String value) => $_setString(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasFromSpmidSuffix() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearFromSpmidSuffix() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $core.String get reportFlowData => $_getSZ(14);\n  @$pb.TagNumber(15)\n  set reportFlowData($core.String value) => $_setString(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasReportFlowData() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearReportFlowData() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $core.String get coverRightText => $_getSZ(15);\n  @$pb.TagNumber(16)\n  set coverRightText($core.String value) => $_setString(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasCoverRightText() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearCoverRightText() => $_clearField(16);\n\n  @$pb.TagNumber(17)\n  CoverDimension get dimension => $_getN(16);\n  @$pb.TagNumber(17)\n  set dimension(CoverDimension value) => $_setField(17, value);\n  @$pb.TagNumber(17)\n  $core.bool hasDimension() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearDimension() => $_clearField(17);\n  @$pb.TagNumber(17)\n  CoverDimension ensureDimension() => $_ensure(16);\n}\n\nclass CardStyle extends $pb.GeneratedMessage {\n  factory CardStyle({\n    $core.int? id,\n    $core.String? name,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (name != null) result.name = name;\n    return result;\n  }\n\n  CardStyle._();\n\n  factory CardStyle.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CardStyle.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CardStyle',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardStyle clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CardStyle copyWith(void Function(CardStyle) updates) =>\n      super.copyWith((message) => updates(message as CardStyle)) as CardStyle;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CardStyle create() => CardStyle._();\n  @$core.override\n  CardStyle createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CardStyle getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CardStyle>(create);\n  static CardStyle? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get id => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set id($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n}\n\nclass CatalogTab extends $pb.GeneratedMessage {\n  factory CatalogTab({\n    $core.String? title,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    return result;\n  }\n\n  CatalogTab._();\n\n  factory CatalogTab.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CatalogTab.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CatalogTab',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CatalogTab clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CatalogTab copyWith(void Function(CatalogTab) updates) =>\n      super.copyWith((message) => updates(message as CatalogTab)) as CatalogTab;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CatalogTab create() => CatalogTab._();\n  @$core.override\n  CatalogTab createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CatalogTab getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CatalogTab>(create);\n  static CatalogTab? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n}\n\nclass Celebrity extends $pb.GeneratedMessage {\n  factory Celebrity({\n    $core.int? id,\n    $core.String? name,\n    $core.String? role,\n    $core.String? avatar,\n    $core.String? shortDesc,\n    $core.String? desc,\n    $core.String? characterAvatar,\n    $core.String? link,\n    $fixnum.Int64? mid,\n    $core.int? isFollow,\n    $core.String? occupationName,\n    OccupationType? occupationType,\n    $core.int? relateAttr,\n    $core.String? smallAvatar,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? report,\n    OfficialVerify? official,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (name != null) result.name = name;\n    if (role != null) result.role = role;\n    if (avatar != null) result.avatar = avatar;\n    if (shortDesc != null) result.shortDesc = shortDesc;\n    if (desc != null) result.desc = desc;\n    if (characterAvatar != null) result.characterAvatar = characterAvatar;\n    if (link != null) result.link = link;\n    if (mid != null) result.mid = mid;\n    if (isFollow != null) result.isFollow = isFollow;\n    if (occupationName != null) result.occupationName = occupationName;\n    if (occupationType != null) result.occupationType = occupationType;\n    if (relateAttr != null) result.relateAttr = relateAttr;\n    if (smallAvatar != null) result.smallAvatar = smallAvatar;\n    if (report != null) result.report.addEntries(report);\n    if (official != null) result.official = official;\n    return result;\n  }\n\n  Celebrity._();\n\n  factory Celebrity.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Celebrity.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Celebrity',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'role')\n    ..aOS(4, _omitFieldNames ? '' : 'avatar')\n    ..aOS(5, _omitFieldNames ? '' : 'shortDesc')\n    ..aOS(6, _omitFieldNames ? '' : 'desc')\n    ..aOS(7, _omitFieldNames ? '' : 'characterAvatar')\n    ..aOS(8, _omitFieldNames ? '' : 'link')\n    ..aInt64(9, _omitFieldNames ? '' : 'mid')\n    ..aI(10, _omitFieldNames ? '' : 'isFollow')\n    ..aOS(11, _omitFieldNames ? '' : 'occupationName')\n    ..aE<OccupationType>(12, _omitFieldNames ? '' : 'occupationType',\n        enumValues: OccupationType.values)\n    ..aI(13, _omitFieldNames ? '' : 'relateAttr')\n    ..aOS(14, _omitFieldNames ? '' : 'smallAvatar')\n    ..m<$core.String, $core.String>(15, _omitFieldNames ? '' : 'report',\n        entryClassName: 'Celebrity.ReportEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.viewunite.common'))\n    ..aOM<OfficialVerify>(16, _omitFieldNames ? '' : 'official',\n        subBuilder: OfficialVerify.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Celebrity clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Celebrity copyWith(void Function(Celebrity) updates) =>\n      super.copyWith((message) => updates(message as Celebrity)) as Celebrity;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Celebrity create() => Celebrity._();\n  @$core.override\n  Celebrity createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Celebrity getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Celebrity>(create);\n  static Celebrity? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get id => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set id($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get role => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set role($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRole() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRole() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get avatar => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set avatar($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasAvatar() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearAvatar() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get shortDesc => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set shortDesc($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasShortDesc() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearShortDesc() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get desc => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set desc($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasDesc() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearDesc() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get characterAvatar => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set characterAvatar($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCharacterAvatar() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCharacterAvatar() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get link => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set link($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasLink() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearLink() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get mid => $_getI64(8);\n  @$pb.TagNumber(9)\n  set mid($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasMid() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearMid() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.int get isFollow => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set isFollow($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasIsFollow() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearIsFollow() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get occupationName => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set occupationName($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasOccupationName() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearOccupationName() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  OccupationType get occupationType => $_getN(11);\n  @$pb.TagNumber(12)\n  set occupationType(OccupationType value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasOccupationType() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearOccupationType() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.int get relateAttr => $_getIZ(12);\n  @$pb.TagNumber(13)\n  set relateAttr($core.int value) => $_setSignedInt32(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasRelateAttr() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearRelateAttr() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.String get smallAvatar => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set smallAvatar($core.String value) => $_setString(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasSmallAvatar() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearSmallAvatar() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $pb.PbMap<$core.String, $core.String> get report => $_getMap(14);\n\n  @$pb.TagNumber(16)\n  OfficialVerify get official => $_getN(15);\n  @$pb.TagNumber(16)\n  set official(OfficialVerify value) => $_setField(16, value);\n  @$pb.TagNumber(16)\n  $core.bool hasOfficial() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearOfficial() => $_clearField(16);\n  @$pb.TagNumber(16)\n  OfficialVerify ensureOfficial() => $_ensure(15);\n}\n\nclass CellFluid extends $pb.GeneratedMessage {\n  factory CellFluid({\n    $core.String? topBaseColor,\n    $core.String? topSplitColor,\n    $core.String? topTextColor,\n  }) {\n    final result = create();\n    if (topBaseColor != null) result.topBaseColor = topBaseColor;\n    if (topSplitColor != null) result.topSplitColor = topSplitColor;\n    if (topTextColor != null) result.topTextColor = topTextColor;\n    return result;\n  }\n\n  CellFluid._();\n\n  factory CellFluid.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CellFluid.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CellFluid',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'topBaseColor')\n    ..aOS(2, _omitFieldNames ? '' : 'topSplitColor')\n    ..aOS(3, _omitFieldNames ? '' : 'topTextColor')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CellFluid clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CellFluid copyWith(void Function(CellFluid) updates) =>\n      super.copyWith((message) => updates(message as CellFluid)) as CellFluid;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CellFluid create() => CellFluid._();\n  @$core.override\n  CellFluid createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CellFluid getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CellFluid>(create);\n  static CellFluid? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get topBaseColor => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set topBaseColor($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTopBaseColor() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTopBaseColor() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get topSplitColor => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set topSplitColor($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTopSplitColor() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTopSplitColor() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get topTextColor => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set topTextColor($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTopTextColor() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTopTextColor() => $_clearField(3);\n}\n\nclass CharacterGroup extends $pb.GeneratedMessage {\n  factory CharacterGroup({\n    $core.String? title,\n    $core.Iterable<Celebrity>? characters,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (characters != null) result.characters.addAll(characters);\n    return result;\n  }\n\n  CharacterGroup._();\n\n  factory CharacterGroup.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CharacterGroup.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CharacterGroup',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..pPM<Celebrity>(2, _omitFieldNames ? '' : 'characters',\n        subBuilder: Celebrity.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CharacterGroup clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CharacterGroup copyWith(void Function(CharacterGroup) updates) =>\n      super.copyWith((message) => updates(message as CharacterGroup))\n          as CharacterGroup;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CharacterGroup create() => CharacterGroup._();\n  @$core.override\n  CharacterGroup createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CharacterGroup getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CharacterGroup>(create);\n  static CharacterGroup? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<Celebrity> get characters => $_getList(1);\n}\n\nclass Characters extends $pb.GeneratedMessage {\n  factory Characters({\n    $core.Iterable<CharacterGroup>? groups,\n  }) {\n    final result = create();\n    if (groups != null) result.groups.addAll(groups);\n    return result;\n  }\n\n  Characters._();\n\n  factory Characters.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Characters.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Characters',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..pPM<CharacterGroup>(1, _omitFieldNames ? '' : 'groups',\n        subBuilder: CharacterGroup.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Characters clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Characters copyWith(void Function(Characters) updates) =>\n      super.copyWith((message) => updates(message as Characters)) as Characters;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Characters create() => Characters._();\n  @$core.override\n  Characters createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Characters getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<Characters>(create);\n  static Characters? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<CharacterGroup> get groups => $_getList(0);\n}\n\nclass CoinExtend extends $pb.GeneratedMessage {\n  factory CoinExtend({\n    $core.String? coinAppZipIcon,\n    $core.String? coinAppIcon1,\n    $core.String? coinAppIcon2,\n    $core.String? coinAppIcon3,\n    $core.String? coinAppIcon4,\n  }) {\n    final result = create();\n    if (coinAppZipIcon != null) result.coinAppZipIcon = coinAppZipIcon;\n    if (coinAppIcon1 != null) result.coinAppIcon1 = coinAppIcon1;\n    if (coinAppIcon2 != null) result.coinAppIcon2 = coinAppIcon2;\n    if (coinAppIcon3 != null) result.coinAppIcon3 = coinAppIcon3;\n    if (coinAppIcon4 != null) result.coinAppIcon4 = coinAppIcon4;\n    return result;\n  }\n\n  CoinExtend._();\n\n  factory CoinExtend.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CoinExtend.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CoinExtend',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'coinAppZipIcon')\n    ..aOS(2, _omitFieldNames ? '' : 'coinAppIcon1')\n    ..aOS(3, _omitFieldNames ? '' : 'coinAppIcon2')\n    ..aOS(4, _omitFieldNames ? '' : 'coinAppIcon3')\n    ..aOS(5, _omitFieldNames ? '' : 'coinAppIcon4')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CoinExtend clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CoinExtend copyWith(void Function(CoinExtend) updates) =>\n      super.copyWith((message) => updates(message as CoinExtend)) as CoinExtend;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CoinExtend create() => CoinExtend._();\n  @$core.override\n  CoinExtend createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CoinExtend getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CoinExtend>(create);\n  static CoinExtend? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get coinAppZipIcon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set coinAppZipIcon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCoinAppZipIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCoinAppZipIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get coinAppIcon1 => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set coinAppIcon1($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCoinAppIcon1() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCoinAppIcon1() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get coinAppIcon2 => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set coinAppIcon2($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCoinAppIcon2() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCoinAppIcon2() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get coinAppIcon3 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set coinAppIcon3($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCoinAppIcon3() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCoinAppIcon3() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get coinAppIcon4 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set coinAppIcon4($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCoinAppIcon4() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCoinAppIcon4() => $_clearField(5);\n}\n\nclass CombinationEp extends $pb.GeneratedMessage {\n  factory CombinationEp({\n    $core.int? id,\n    $core.int? sectionId,\n    $core.String? title,\n    $core.int? canOrdDesc,\n    $core.String? more,\n    $core.Iterable<$core.int>? episodeIds,\n    $core.Iterable<ViewEpisode>? episodes,\n    $core.String? splitText,\n    Style? moduleStyle,\n    $core.Iterable<SerialSeason>? serialSeason,\n    SectionData? sectionData,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (sectionId != null) result.sectionId = sectionId;\n    if (title != null) result.title = title;\n    if (canOrdDesc != null) result.canOrdDesc = canOrdDesc;\n    if (more != null) result.more = more;\n    if (episodeIds != null) result.episodeIds.addAll(episodeIds);\n    if (episodes != null) result.episodes.addAll(episodes);\n    if (splitText != null) result.splitText = splitText;\n    if (moduleStyle != null) result.moduleStyle = moduleStyle;\n    if (serialSeason != null) result.serialSeason.addAll(serialSeason);\n    if (sectionData != null) result.sectionData = sectionData;\n    return result;\n  }\n\n  CombinationEp._();\n\n  factory CombinationEp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CombinationEp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CombinationEp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'id')\n    ..aI(2, _omitFieldNames ? '' : 'sectionId')\n    ..aOS(3, _omitFieldNames ? '' : 'title')\n    ..aI(4, _omitFieldNames ? '' : 'canOrdDesc')\n    ..aOS(5, _omitFieldNames ? '' : 'more')\n    ..p<$core.int>(6, _omitFieldNames ? '' : 'episodeIds', $pb.PbFieldType.K3)\n    ..pPM<ViewEpisode>(7, _omitFieldNames ? '' : 'episodes',\n        subBuilder: ViewEpisode.create)\n    ..aOS(8, _omitFieldNames ? '' : 'splitText')\n    ..aOM<Style>(9, _omitFieldNames ? '' : 'moduleStyle',\n        subBuilder: Style.create)\n    ..pPM<SerialSeason>(10, _omitFieldNames ? '' : 'serialSeason',\n        subBuilder: SerialSeason.create)\n    ..aOM<SectionData>(11, _omitFieldNames ? '' : 'sectionData',\n        subBuilder: SectionData.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CombinationEp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CombinationEp copyWith(void Function(CombinationEp) updates) =>\n      super.copyWith((message) => updates(message as CombinationEp))\n          as CombinationEp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CombinationEp create() => CombinationEp._();\n  @$core.override\n  CombinationEp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CombinationEp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CombinationEp>(create);\n  static CombinationEp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get id => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set id($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get sectionId => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set sectionId($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSectionId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSectionId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get title => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set title($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get canOrdDesc => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set canOrdDesc($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCanOrdDesc() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCanOrdDesc() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get more => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set more($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasMore() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearMore() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $pb.PbList<$core.int> get episodeIds => $_getList(5);\n\n  @$pb.TagNumber(7)\n  $pb.PbList<ViewEpisode> get episodes => $_getList(6);\n\n  @$pb.TagNumber(8)\n  $core.String get splitText => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set splitText($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasSplitText() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearSplitText() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  Style get moduleStyle => $_getN(8);\n  @$pb.TagNumber(9)\n  set moduleStyle(Style value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasModuleStyle() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearModuleStyle() => $_clearField(9);\n  @$pb.TagNumber(9)\n  Style ensureModuleStyle() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  $pb.PbList<SerialSeason> get serialSeason => $_getList(9);\n\n  @$pb.TagNumber(11)\n  SectionData get sectionData => $_getN(10);\n  @$pb.TagNumber(11)\n  set sectionData(SectionData value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasSectionData() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearSectionData() => $_clearField(11);\n  @$pb.TagNumber(11)\n  SectionData ensureSectionData() => $_ensure(10);\n}\n\nclass ContractText extends $pb.GeneratedMessage {\n  factory ContractText({\n    $core.String? title,\n    $core.String? subtitle,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (subtitle != null) result.subtitle = subtitle;\n    return result;\n  }\n\n  ContractText._();\n\n  factory ContractText.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ContractText.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ContractText',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'subtitle')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ContractText clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ContractText copyWith(void Function(ContractText) updates) =>\n      super.copyWith((message) => updates(message as ContractText))\n          as ContractText;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ContractText create() => ContractText._();\n  @$core.override\n  ContractText createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ContractText getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ContractText>(create);\n  static ContractText? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get subtitle => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set subtitle($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSubtitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSubtitle() => $_clearField(2);\n}\n\nclass Covenanter extends $pb.GeneratedMessage {\n  factory Covenanter({\n    $core.int? isFollowDisplay,\n    ContractText? text,\n    $core.int? isInteractDisplay,\n  }) {\n    final result = create();\n    if (isFollowDisplay != null) result.isFollowDisplay = isFollowDisplay;\n    if (text != null) result.text = text;\n    if (isInteractDisplay != null) result.isInteractDisplay = isInteractDisplay;\n    return result;\n  }\n\n  Covenanter._();\n\n  factory Covenanter.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Covenanter.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Covenanter',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'isFollowDisplay')\n    ..aOM<ContractText>(2, _omitFieldNames ? '' : 'text',\n        subBuilder: ContractText.create)\n    ..aI(3, _omitFieldNames ? '' : 'isInteractDisplay')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Covenanter clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Covenanter copyWith(void Function(Covenanter) updates) =>\n      super.copyWith((message) => updates(message as Covenanter)) as Covenanter;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Covenanter create() => Covenanter._();\n  @$core.override\n  Covenanter createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Covenanter getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<Covenanter>(create);\n  static Covenanter? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get isFollowDisplay => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set isFollowDisplay($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIsFollowDisplay() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIsFollowDisplay() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  ContractText get text => $_getN(1);\n  @$pb.TagNumber(2)\n  set text(ContractText value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n  @$pb.TagNumber(2)\n  ContractText ensureText() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.int get isInteractDisplay => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set isInteractDisplay($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIsInteractDisplay() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIsInteractDisplay() => $_clearField(3);\n}\n\nclass CoverDimension extends $pb.GeneratedMessage {\n  factory CoverDimension({\n    $core.double? width,\n    $core.double? height,\n  }) {\n    final result = create();\n    if (width != null) result.width = width;\n    if (height != null) result.height = height;\n    return result;\n  }\n\n  CoverDimension._();\n\n  factory CoverDimension.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CoverDimension.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CoverDimension',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aD(1, _omitFieldNames ? '' : 'width', fieldType: $pb.PbFieldType.OF)\n    ..aD(2, _omitFieldNames ? '' : 'height', fieldType: $pb.PbFieldType.OF)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CoverDimension clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CoverDimension copyWith(void Function(CoverDimension) updates) =>\n      super.copyWith((message) => updates(message as CoverDimension))\n          as CoverDimension;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CoverDimension create() => CoverDimension._();\n  @$core.override\n  CoverDimension createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CoverDimension getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CoverDimension>(create);\n  static CoverDimension? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.double get width => $_getN(0);\n  @$pb.TagNumber(1)\n  set width($core.double value) => $_setFloat(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasWidth() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearWidth() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.double get height => $_getN(1);\n  @$pb.TagNumber(2)\n  set height($core.double value) => $_setFloat(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHeight() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHeight() => $_clearField(2);\n}\n\nenum DeliveryData_Data {\n  activity,\n  characters,\n  theatreHotTopic,\n  aggEps,\n  actPageItems,\n  notSet\n}\n\nclass DeliveryData extends $pb.GeneratedMessage {\n  factory DeliveryData({\n    $core.String? title,\n    Style? moduleStyle,\n    $core.String? more,\n    Activity? activity,\n    Characters? characters,\n    TheatreHotTopic? theatreHotTopic,\n    AggEps? aggEps,\n    $core.int? id,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? report,\n    ActPageItems? actPageItems,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (moduleStyle != null) result.moduleStyle = moduleStyle;\n    if (more != null) result.more = more;\n    if (activity != null) result.activity = activity;\n    if (characters != null) result.characters = characters;\n    if (theatreHotTopic != null) result.theatreHotTopic = theatreHotTopic;\n    if (aggEps != null) result.aggEps = aggEps;\n    if (id != null) result.id = id;\n    if (report != null) result.report.addEntries(report);\n    if (actPageItems != null) result.actPageItems = actPageItems;\n    return result;\n  }\n\n  DeliveryData._();\n\n  factory DeliveryData.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DeliveryData.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, DeliveryData_Data> _DeliveryData_DataByTag =\n      {\n    4: DeliveryData_Data.activity,\n    5: DeliveryData_Data.characters,\n    6: DeliveryData_Data.theatreHotTopic,\n    7: DeliveryData_Data.aggEps,\n    10: DeliveryData_Data.actPageItems,\n    0: DeliveryData_Data.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DeliveryData',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..oo(0, [4, 5, 6, 7, 10])\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOM<Style>(2, _omitFieldNames ? '' : 'moduleStyle',\n        subBuilder: Style.create)\n    ..aOS(3, _omitFieldNames ? '' : 'more')\n    ..aOM<Activity>(4, _omitFieldNames ? '' : 'activity',\n        subBuilder: Activity.create)\n    ..aOM<Characters>(5, _omitFieldNames ? '' : 'characters',\n        subBuilder: Characters.create)\n    ..aOM<TheatreHotTopic>(6, _omitFieldNames ? '' : 'theatreHotTopic',\n        subBuilder: TheatreHotTopic.create)\n    ..aOM<AggEps>(7, _omitFieldNames ? '' : 'aggEps', subBuilder: AggEps.create)\n    ..aI(8, _omitFieldNames ? '' : 'id')\n    ..m<$core.String, $core.String>(9, _omitFieldNames ? '' : 'report',\n        entryClassName: 'DeliveryData.ReportEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.viewunite.common'))\n    ..aOM<ActPageItems>(10, _omitFieldNames ? '' : 'actPageItems',\n        subBuilder: ActPageItems.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DeliveryData clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DeliveryData copyWith(void Function(DeliveryData) updates) =>\n      super.copyWith((message) => updates(message as DeliveryData))\n          as DeliveryData;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DeliveryData create() => DeliveryData._();\n  @$core.override\n  DeliveryData createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DeliveryData getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DeliveryData>(create);\n  static DeliveryData? _defaultInstance;\n\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(7)\n  @$pb.TagNumber(10)\n  DeliveryData_Data whichData() => _DeliveryData_DataByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(7)\n  @$pb.TagNumber(10)\n  void clearData() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  Style get moduleStyle => $_getN(1);\n  @$pb.TagNumber(2)\n  set moduleStyle(Style value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasModuleStyle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearModuleStyle() => $_clearField(2);\n  @$pb.TagNumber(2)\n  Style ensureModuleStyle() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.String get more => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set more($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasMore() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearMore() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  Activity get activity => $_getN(3);\n  @$pb.TagNumber(4)\n  set activity(Activity value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasActivity() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearActivity() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Activity ensureActivity() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  Characters get characters => $_getN(4);\n  @$pb.TagNumber(5)\n  set characters(Characters value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCharacters() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCharacters() => $_clearField(5);\n  @$pb.TagNumber(5)\n  Characters ensureCharacters() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  TheatreHotTopic get theatreHotTopic => $_getN(5);\n  @$pb.TagNumber(6)\n  set theatreHotTopic(TheatreHotTopic value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasTheatreHotTopic() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearTheatreHotTopic() => $_clearField(6);\n  @$pb.TagNumber(6)\n  TheatreHotTopic ensureTheatreHotTopic() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  AggEps get aggEps => $_getN(6);\n  @$pb.TagNumber(7)\n  set aggEps(AggEps value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasAggEps() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearAggEps() => $_clearField(7);\n  @$pb.TagNumber(7)\n  AggEps ensureAggEps() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  $core.int get id => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set id($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasId() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearId() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $pb.PbMap<$core.String, $core.String> get report => $_getMap(8);\n\n  @$pb.TagNumber(10)\n  ActPageItems get actPageItems => $_getN(9);\n  @$pb.TagNumber(10)\n  set actPageItems(ActPageItems value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasActPageItems() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearActPageItems() => $_clearField(10);\n  @$pb.TagNumber(10)\n  ActPageItems ensureActPageItems() => $_ensure(9);\n}\n\nclass Desc extends $pb.GeneratedMessage {\n  factory Desc({\n    $core.String? info,\n    $core.String? title,\n  }) {\n    final result = create();\n    if (info != null) result.info = info;\n    if (title != null) result.title = title;\n    return result;\n  }\n\n  Desc._();\n\n  factory Desc.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Desc.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Desc',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'info')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Desc clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Desc copyWith(void Function(Desc) updates) =>\n      super.copyWith((message) => updates(message as Desc)) as Desc;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Desc create() => Desc._();\n  @$core.override\n  Desc createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Desc getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Desc>(create);\n  static Desc? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get info => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set info($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasInfo() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearInfo() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n}\n\nclass DescV2 extends $pb.GeneratedMessage {\n  factory DescV2({\n    $core.String? text,\n    DescType? type,\n    $core.String? uri,\n    $fixnum.Int64? rid,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (type != null) result.type = type;\n    if (uri != null) result.uri = uri;\n    if (rid != null) result.rid = rid;\n    return result;\n  }\n\n  DescV2._();\n\n  factory DescV2.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DescV2.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DescV2',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aE<DescType>(2, _omitFieldNames ? '' : 'type',\n        enumValues: DescType.values)\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..aInt64(4, _omitFieldNames ? '' : 'rid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DescV2 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DescV2 copyWith(void Function(DescV2) updates) =>\n      super.copyWith((message) => updates(message as DescV2)) as DescV2;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DescV2 create() => DescV2._();\n  @$core.override\n  DescV2 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DescV2 getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DescV2>(create);\n  static DescV2? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  DescType get type => $_getN(1);\n  @$pb.TagNumber(2)\n  set type(DescType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get rid => $_getI64(3);\n  @$pb.TagNumber(4)\n  set rid($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasRid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearRid() => $_clearField(4);\n}\n\nclass Dimension extends $pb.GeneratedMessage {\n  factory Dimension({\n    $fixnum.Int64? width,\n    $fixnum.Int64? height,\n    $fixnum.Int64? rotate,\n  }) {\n    final result = create();\n    if (width != null) result.width = width;\n    if (height != null) result.height = height;\n    if (rotate != null) result.rotate = rotate;\n    return result;\n  }\n\n  Dimension._();\n\n  factory Dimension.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Dimension.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Dimension',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'width')\n    ..aInt64(2, _omitFieldNames ? '' : 'height')\n    ..aInt64(3, _omitFieldNames ? '' : 'rotate')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Dimension clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Dimension copyWith(void Function(Dimension) updates) =>\n      super.copyWith((message) => updates(message as Dimension)) as Dimension;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Dimension create() => Dimension._();\n  @$core.override\n  Dimension createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Dimension getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Dimension>(create);\n  static Dimension? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get width => $_getI64(0);\n  @$pb.TagNumber(1)\n  set width($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasWidth() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearWidth() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get height => $_getI64(1);\n  @$pb.TagNumber(2)\n  set height($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHeight() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHeight() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get rotate => $_getI64(2);\n  @$pb.TagNumber(3)\n  set rotate($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRotate() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRotate() => $_clearField(3);\n}\n\nclass DislikeReasons extends $pb.GeneratedMessage {\n  factory DislikeReasons({\n    $fixnum.Int64? id,\n    $fixnum.Int64? mid,\n    $core.int? rid,\n    $fixnum.Int64? tagId,\n    $core.String? name,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (mid != null) result.mid = mid;\n    if (rid != null) result.rid = rid;\n    if (tagId != null) result.tagId = tagId;\n    if (name != null) result.name = name;\n    return result;\n  }\n\n  DislikeReasons._();\n\n  factory DislikeReasons.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DislikeReasons.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DislikeReasons',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aInt64(2, _omitFieldNames ? '' : 'mid')\n    ..aI(3, _omitFieldNames ? '' : 'rid')\n    ..aInt64(4, _omitFieldNames ? '' : 'tagId')\n    ..aOS(5, _omitFieldNames ? '' : 'name')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DislikeReasons clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DislikeReasons copyWith(void Function(DislikeReasons) updates) =>\n      super.copyWith((message) => updates(message as DislikeReasons))\n          as DislikeReasons;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DislikeReasons create() => DislikeReasons._();\n  @$core.override\n  DislikeReasons createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DislikeReasons getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DislikeReasons>(create);\n  static DislikeReasons? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get mid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set mid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get rid => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set rid($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRid() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get tagId => $_getI64(3);\n  @$pb.TagNumber(4)\n  set tagId($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTagId() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTagId() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get name => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set name($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasName() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearName() => $_clearField(5);\n}\n\nclass EpBgInfo extends $pb.GeneratedMessage {\n  factory EpBgInfo({\n    BgInfo? floatLayer,\n    BgInfo? noFloatLayer,\n  }) {\n    final result = create();\n    if (floatLayer != null) result.floatLayer = floatLayer;\n    if (noFloatLayer != null) result.noFloatLayer = noFloatLayer;\n    return result;\n  }\n\n  EpBgInfo._();\n\n  factory EpBgInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory EpBgInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'EpBgInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOM<BgInfo>(1, _omitFieldNames ? '' : 'floatLayer',\n        subBuilder: BgInfo.create)\n    ..aOM<BgInfo>(2, _omitFieldNames ? '' : 'noFloatLayer',\n        subBuilder: BgInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  EpBgInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  EpBgInfo copyWith(void Function(EpBgInfo) updates) =>\n      super.copyWith((message) => updates(message as EpBgInfo)) as EpBgInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static EpBgInfo create() => EpBgInfo._();\n  @$core.override\n  EpBgInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static EpBgInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<EpBgInfo>(create);\n  static EpBgInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  BgInfo get floatLayer => $_getN(0);\n  @$pb.TagNumber(1)\n  set floatLayer(BgInfo value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFloatLayer() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFloatLayer() => $_clearField(1);\n  @$pb.TagNumber(1)\n  BgInfo ensureFloatLayer() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  BgInfo get noFloatLayer => $_getN(1);\n  @$pb.TagNumber(2)\n  set noFloatLayer(BgInfo value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasNoFloatLayer() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearNoFloatLayer() => $_clearField(2);\n  @$pb.TagNumber(2)\n  BgInfo ensureNoFloatLayer() => $_ensure(1);\n}\n\nclass ExtTab extends $pb.GeneratedMessage {\n  factory ExtTab({\n    ExtType? extType,\n    $core.String? data,\n  }) {\n    final result = create();\n    if (extType != null) result.extType = extType;\n    if (data != null) result.data = data;\n    return result;\n  }\n\n  ExtTab._();\n\n  factory ExtTab.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ExtTab.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ExtTab',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aE<ExtType>(1, _omitFieldNames ? '' : 'extType',\n        enumValues: ExtType.values)\n    ..aOS(2, _omitFieldNames ? '' : 'data')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtTab clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtTab copyWith(void Function(ExtTab) updates) =>\n      super.copyWith((message) => updates(message as ExtTab)) as ExtTab;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ExtTab create() => ExtTab._();\n  @$core.override\n  ExtTab createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ExtTab getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ExtTab>(create);\n  static ExtTab? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  ExtType get extType => $_getN(0);\n  @$pb.TagNumber(1)\n  set extType(ExtType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasExtType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearExtType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get data => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set data($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasData() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearData() => $_clearField(2);\n}\n\nclass FollowLayer extends $pb.GeneratedMessage {\n  factory FollowLayer({\n    Staff? staff,\n    Desc? desc,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? report,\n  }) {\n    final result = create();\n    if (staff != null) result.staff = staff;\n    if (desc != null) result.desc = desc;\n    if (report != null) result.report.addEntries(report);\n    return result;\n  }\n\n  FollowLayer._();\n\n  factory FollowLayer.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FollowLayer.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FollowLayer',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOM<Staff>(1, _omitFieldNames ? '' : 'staff', subBuilder: Staff.create)\n    ..aOM<Desc>(2, _omitFieldNames ? '' : 'desc', subBuilder: Desc.create)\n    ..m<$core.String, $core.String>(3, _omitFieldNames ? '' : 'report',\n        entryClassName: 'FollowLayer.ReportEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.viewunite.common'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FollowLayer clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FollowLayer copyWith(void Function(FollowLayer) updates) =>\n      super.copyWith((message) => updates(message as FollowLayer))\n          as FollowLayer;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FollowLayer create() => FollowLayer._();\n  @$core.override\n  FollowLayer createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FollowLayer getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FollowLayer>(create);\n  static FollowLayer? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Staff get staff => $_getN(0);\n  @$pb.TagNumber(1)\n  set staff(Staff value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStaff() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStaff() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Staff ensureStaff() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  Desc get desc => $_getN(1);\n  @$pb.TagNumber(2)\n  set desc(Desc value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDesc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDesc() => $_clearField(2);\n  @$pb.TagNumber(2)\n  Desc ensureDesc() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $pb.PbMap<$core.String, $core.String> get report => $_getMap(2);\n}\n\nclass Headline extends $pb.GeneratedMessage {\n  factory Headline({\n    Label? label,\n    $core.String? content,\n  }) {\n    final result = create();\n    if (label != null) result.label = label;\n    if (content != null) result.content = content;\n    return result;\n  }\n\n  Headline._();\n\n  factory Headline.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Headline.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Headline',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOM<Label>(1, _omitFieldNames ? '' : 'label', subBuilder: Label.create)\n    ..aOS(2, _omitFieldNames ? '' : 'content')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Headline clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Headline copyWith(void Function(Headline) updates) =>\n      super.copyWith((message) => updates(message as Headline)) as Headline;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Headline create() => Headline._();\n  @$core.override\n  Headline createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Headline getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Headline>(create);\n  static Headline? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Label get label => $_getN(0);\n  @$pb.TagNumber(1)\n  set label(Label value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLabel() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLabel() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Label ensureLabel() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get content => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set content($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasContent() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearContent() => $_clearField(2);\n}\n\nclass HistoryNode extends $pb.GeneratedMessage {\n  factory HistoryNode({\n    $fixnum.Int64? nodeId,\n    $core.String? title,\n    $fixnum.Int64? cid,\n  }) {\n    final result = create();\n    if (nodeId != null) result.nodeId = nodeId;\n    if (title != null) result.title = title;\n    if (cid != null) result.cid = cid;\n    return result;\n  }\n\n  HistoryNode._();\n\n  factory HistoryNode.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory HistoryNode.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'HistoryNode',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'nodeId')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aInt64(3, _omitFieldNames ? '' : 'cid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  HistoryNode clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  HistoryNode copyWith(void Function(HistoryNode) updates) =>\n      super.copyWith((message) => updates(message as HistoryNode))\n          as HistoryNode;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static HistoryNode create() => HistoryNode._();\n  @$core.override\n  HistoryNode createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static HistoryNode getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<HistoryNode>(create);\n  static HistoryNode? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get nodeId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set nodeId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasNodeId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearNodeId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get cid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set cid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCid() => $_clearField(3);\n}\n\nenum Honor_Extend { professionExt, notSet }\n\nclass Honor extends $pb.GeneratedMessage {\n  factory Honor({\n    $core.String? icon,\n    $core.String? iconNight,\n    $core.String? text,\n    $core.String? textExtra,\n    $core.String? textColor,\n    $core.String? textColorNight,\n    $core.String? bgColor,\n    $core.String? bgColorNight,\n    $core.String? url,\n    $core.String? urlText,\n    HonorType? type,\n    HonorJumpType? honorJumpType,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? report,\n    $core.String? endIcon,\n    ProfessionHonorExtend? professionExt,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (iconNight != null) result.iconNight = iconNight;\n    if (text != null) result.text = text;\n    if (textExtra != null) result.textExtra = textExtra;\n    if (textColor != null) result.textColor = textColor;\n    if (textColorNight != null) result.textColorNight = textColorNight;\n    if (bgColor != null) result.bgColor = bgColor;\n    if (bgColorNight != null) result.bgColorNight = bgColorNight;\n    if (url != null) result.url = url;\n    if (urlText != null) result.urlText = urlText;\n    if (type != null) result.type = type;\n    if (honorJumpType != null) result.honorJumpType = honorJumpType;\n    if (report != null) result.report.addEntries(report);\n    if (endIcon != null) result.endIcon = endIcon;\n    if (professionExt != null) result.professionExt = professionExt;\n    return result;\n  }\n\n  Honor._();\n\n  factory Honor.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Honor.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, Honor_Extend> _Honor_ExtendByTag = {\n    15: Honor_Extend.professionExt,\n    0: Honor_Extend.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Honor',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..oo(0, [15])\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'iconNight')\n    ..aOS(3, _omitFieldNames ? '' : 'text')\n    ..aOS(4, _omitFieldNames ? '' : 'textExtra')\n    ..aOS(5, _omitFieldNames ? '' : 'textColor')\n    ..aOS(6, _omitFieldNames ? '' : 'textColorNight')\n    ..aOS(7, _omitFieldNames ? '' : 'bgColor')\n    ..aOS(8, _omitFieldNames ? '' : 'bgColorNight')\n    ..aOS(9, _omitFieldNames ? '' : 'url')\n    ..aOS(10, _omitFieldNames ? '' : 'urlText')\n    ..aE<HonorType>(11, _omitFieldNames ? '' : 'type',\n        enumValues: HonorType.values)\n    ..aE<HonorJumpType>(12, _omitFieldNames ? '' : 'honorJumpType',\n        enumValues: HonorJumpType.values)\n    ..m<$core.String, $core.String>(13, _omitFieldNames ? '' : 'report',\n        entryClassName: 'Honor.ReportEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.viewunite.common'))\n    ..aOS(14, _omitFieldNames ? '' : 'endIcon')\n    ..aOM<ProfessionHonorExtend>(15, _omitFieldNames ? '' : 'professionExt',\n        subBuilder: ProfessionHonorExtend.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Honor clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Honor copyWith(void Function(Honor) updates) =>\n      super.copyWith((message) => updates(message as Honor)) as Honor;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Honor create() => Honor._();\n  @$core.override\n  Honor createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Honor getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Honor>(create);\n  static Honor? _defaultInstance;\n\n  @$pb.TagNumber(15)\n  Honor_Extend whichExtend() => _Honor_ExtendByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(15)\n  void clearExtend() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get iconNight => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set iconNight($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIconNight() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIconNight() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get text => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set text($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasText() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearText() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get textExtra => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set textExtra($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTextExtra() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTextExtra() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get textColor => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set textColor($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasTextColor() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearTextColor() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get textColorNight => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set textColorNight($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasTextColorNight() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearTextColorNight() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get bgColor => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set bgColor($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBgColor() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBgColor() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get bgColorNight => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set bgColorNight($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasBgColorNight() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearBgColorNight() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get url => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set url($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasUrl() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearUrl() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get urlText => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set urlText($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasUrlText() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearUrlText() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  HonorType get type => $_getN(10);\n  @$pb.TagNumber(11)\n  set type(HonorType value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasType() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearType() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  HonorJumpType get honorJumpType => $_getN(11);\n  @$pb.TagNumber(12)\n  set honorJumpType(HonorJumpType value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasHonorJumpType() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearHonorJumpType() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $pb.PbMap<$core.String, $core.String> get report => $_getMap(12);\n\n  @$pb.TagNumber(14)\n  $core.String get endIcon => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set endIcon($core.String value) => $_setString(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasEndIcon() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearEndIcon() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  ProfessionHonorExtend get professionExt => $_getN(14);\n  @$pb.TagNumber(15)\n  set professionExt(ProfessionHonorExtend value) => $_setField(15, value);\n  @$pb.TagNumber(15)\n  $core.bool hasProfessionExt() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearProfessionExt() => $_clearField(15);\n  @$pb.TagNumber(15)\n  ProfessionHonorExtend ensureProfessionExt() => $_ensure(14);\n}\n\nclass IconFont extends $pb.GeneratedMessage {\n  factory IconFont({\n    $core.String? name,\n    $core.String? text,\n  }) {\n    final result = create();\n    if (name != null) result.name = name;\n    if (text != null) result.text = text;\n    return result;\n  }\n\n  IconFont._();\n\n  factory IconFont.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory IconFont.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'IconFont',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'name')\n    ..aOS(2, _omitFieldNames ? '' : 'text')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  IconFont clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  IconFont copyWith(void Function(IconFont) updates) =>\n      super.copyWith((message) => updates(message as IconFont)) as IconFont;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static IconFont create() => IconFont._();\n  @$core.override\n  IconFont createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static IconFont getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<IconFont>(create);\n  static IconFont? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get name => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set name($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasName() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearName() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n}\n\nclass ImagesWidget extends $pb.GeneratedMessage {\n  factory ImagesWidget({\n    $core.String? code,\n    $core.Iterable<$core.String>? url,\n  }) {\n    final result = create();\n    if (code != null) result.code = code;\n    if (url != null) result.url.addAll(url);\n    return result;\n  }\n\n  ImagesWidget._();\n\n  factory ImagesWidget.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ImagesWidget.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ImagesWidget',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'code')\n    ..pPS(2, _omitFieldNames ? '' : 'url')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ImagesWidget clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ImagesWidget copyWith(void Function(ImagesWidget) updates) =>\n      super.copyWith((message) => updates(message as ImagesWidget))\n          as ImagesWidget;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ImagesWidget create() => ImagesWidget._();\n  @$core.override\n  ImagesWidget createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ImagesWidget getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ImagesWidget>(create);\n  static ImagesWidget? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get code => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set code($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCode() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCode() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<$core.String> get url => $_getList(1);\n}\n\nclass Interaction extends $pb.GeneratedMessage {\n  factory Interaction({\n    $fixnum.Int64? epId,\n    HistoryNode? historyNode,\n    $fixnum.Int64? graphVersion,\n    $core.String? msg,\n    $core.bool? isInteraction,\n  }) {\n    final result = create();\n    if (epId != null) result.epId = epId;\n    if (historyNode != null) result.historyNode = historyNode;\n    if (graphVersion != null) result.graphVersion = graphVersion;\n    if (msg != null) result.msg = msg;\n    if (isInteraction != null) result.isInteraction = isInteraction;\n    return result;\n  }\n\n  Interaction._();\n\n  factory Interaction.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Interaction.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Interaction',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'epId')\n    ..aOM<HistoryNode>(2, _omitFieldNames ? '' : 'historyNode',\n        subBuilder: HistoryNode.create)\n    ..aInt64(3, _omitFieldNames ? '' : 'graphVersion')\n    ..aOS(4, _omitFieldNames ? '' : 'msg')\n    ..aOB(5, _omitFieldNames ? '' : 'isInteraction')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Interaction clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Interaction copyWith(void Function(Interaction) updates) =>\n      super.copyWith((message) => updates(message as Interaction))\n          as Interaction;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Interaction create() => Interaction._();\n  @$core.override\n  Interaction createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Interaction getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<Interaction>(create);\n  static Interaction? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get epId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set epId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasEpId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearEpId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  HistoryNode get historyNode => $_getN(1);\n  @$pb.TagNumber(2)\n  set historyNode(HistoryNode value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHistoryNode() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHistoryNode() => $_clearField(2);\n  @$pb.TagNumber(2)\n  HistoryNode ensureHistoryNode() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get graphVersion => $_getI64(2);\n  @$pb.TagNumber(3)\n  set graphVersion($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasGraphVersion() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearGraphVersion() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get msg => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set msg($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasMsg() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearMsg() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.bool get isInteraction => $_getBF(4);\n  @$pb.TagNumber(5)\n  set isInteraction($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasIsInteraction() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearIsInteraction() => $_clearField(5);\n}\n\nclass Item extends $pb.GeneratedMessage {\n  factory Item({\n    $core.String? link,\n    $core.String? cover,\n  }) {\n    final result = create();\n    if (link != null) result.link = link;\n    if (cover != null) result.cover = cover;\n    return result;\n  }\n\n  Item._();\n\n  factory Item.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Item.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Item',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'link')\n    ..aOS(2, _omitFieldNames ? '' : 'cover')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Item clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Item copyWith(void Function(Item) updates) =>\n      super.copyWith((message) => updates(message as Item)) as Item;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Item create() => Item._();\n  @$core.override\n  Item createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Item getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Item>(create);\n  static Item? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get link => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set link($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLink() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLink() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get cover => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cover($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCover() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCover() => $_clearField(2);\n}\n\nenum KingPos_Extend { like, coin, notSet }\n\nclass KingPos extends $pb.GeneratedMessage {\n  factory KingPos({\n    $core.bool? disable,\n    $core.String? icon,\n    KingPositionType? type,\n    $core.String? disableToast,\n    $core.String? checkedToast,\n    LikeExtend? like,\n    CoinExtend? coin,\n  }) {\n    final result = create();\n    if (disable != null) result.disable = disable;\n    if (icon != null) result.icon = icon;\n    if (type != null) result.type = type;\n    if (disableToast != null) result.disableToast = disableToast;\n    if (checkedToast != null) result.checkedToast = checkedToast;\n    if (like != null) result.like = like;\n    if (coin != null) result.coin = coin;\n    return result;\n  }\n\n  KingPos._();\n\n  factory KingPos.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory KingPos.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, KingPos_Extend> _KingPos_ExtendByTag = {\n    6: KingPos_Extend.like,\n    7: KingPos_Extend.coin,\n    0: KingPos_Extend.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'KingPos',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..oo(0, [6, 7])\n    ..aOB(1, _omitFieldNames ? '' : 'disable')\n    ..aOS(2, _omitFieldNames ? '' : 'icon')\n    ..aE<KingPositionType>(3, _omitFieldNames ? '' : 'type',\n        enumValues: KingPositionType.values)\n    ..aOS(4, _omitFieldNames ? '' : 'disableToast')\n    ..aOS(5, _omitFieldNames ? '' : 'checkedToast')\n    ..aOM<LikeExtend>(6, _omitFieldNames ? '' : 'like',\n        subBuilder: LikeExtend.create)\n    ..aOM<CoinExtend>(7, _omitFieldNames ? '' : 'coin',\n        subBuilder: CoinExtend.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  KingPos clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  KingPos copyWith(void Function(KingPos) updates) =>\n      super.copyWith((message) => updates(message as KingPos)) as KingPos;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static KingPos create() => KingPos._();\n  @$core.override\n  KingPos createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static KingPos getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<KingPos>(create);\n  static KingPos? _defaultInstance;\n\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(7)\n  KingPos_Extend whichExtend() => _KingPos_ExtendByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(7)\n  void clearExtend() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  $core.bool get disable => $_getBF(0);\n  @$pb.TagNumber(1)\n  set disable($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDisable() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDisable() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get icon => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set icon($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIcon() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIcon() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  KingPositionType get type => $_getN(2);\n  @$pb.TagNumber(3)\n  set type(KingPositionType value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get disableToast => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set disableToast($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDisableToast() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDisableToast() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get checkedToast => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set checkedToast($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCheckedToast() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCheckedToast() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  LikeExtend get like => $_getN(5);\n  @$pb.TagNumber(6)\n  set like(LikeExtend value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasLike() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearLike() => $_clearField(6);\n  @$pb.TagNumber(6)\n  LikeExtend ensureLike() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  CoinExtend get coin => $_getN(6);\n  @$pb.TagNumber(7)\n  set coin(CoinExtend value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCoin() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCoin() => $_clearField(7);\n  @$pb.TagNumber(7)\n  CoinExtend ensureCoin() => $_ensure(6);\n}\n\nclass KingPosition extends $pb.GeneratedMessage {\n  factory KingPosition({\n    $core.Iterable<KingPos>? kingPos,\n    $core.Iterable<KingPos>? extend,\n  }) {\n    final result = create();\n    if (kingPos != null) result.kingPos.addAll(kingPos);\n    if (extend != null) result.extend.addAll(extend);\n    return result;\n  }\n\n  KingPosition._();\n\n  factory KingPosition.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory KingPosition.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'KingPosition',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..pPM<KingPos>(1, _omitFieldNames ? '' : 'kingPos',\n        subBuilder: KingPos.create)\n    ..pPM<KingPos>(2, _omitFieldNames ? '' : 'extend',\n        subBuilder: KingPos.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  KingPosition clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  KingPosition copyWith(void Function(KingPosition) updates) =>\n      super.copyWith((message) => updates(message as KingPosition))\n          as KingPosition;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static KingPosition create() => KingPosition._();\n  @$core.override\n  KingPosition createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static KingPosition getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<KingPosition>(create);\n  static KingPosition? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<KingPos> get kingPos => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<KingPos> get extend => $_getList(1);\n}\n\nclass Label extends $pb.GeneratedMessage {\n  factory Label({\n    $core.int? type,\n    $core.String? uri,\n    $core.String? icon,\n    $core.String? iconNight,\n    $fixnum.Int64? iconWidth,\n    $fixnum.Int64? iconHeight,\n    $core.String? lottie,\n    $core.String? lottieNight,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? report,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (uri != null) result.uri = uri;\n    if (icon != null) result.icon = icon;\n    if (iconNight != null) result.iconNight = iconNight;\n    if (iconWidth != null) result.iconWidth = iconWidth;\n    if (iconHeight != null) result.iconHeight = iconHeight;\n    if (lottie != null) result.lottie = lottie;\n    if (lottieNight != null) result.lottieNight = lottieNight;\n    if (report != null) result.report.addEntries(report);\n    return result;\n  }\n\n  Label._();\n\n  factory Label.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Label.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Label',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'type')\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..aOS(3, _omitFieldNames ? '' : 'icon')\n    ..aOS(4, _omitFieldNames ? '' : 'iconNight')\n    ..aInt64(5, _omitFieldNames ? '' : 'iconWidth')\n    ..aInt64(6, _omitFieldNames ? '' : 'iconHeight')\n    ..aOS(7, _omitFieldNames ? '' : 'lottie')\n    ..aOS(8, _omitFieldNames ? '' : 'lottieNight')\n    ..m<$core.String, $core.String>(9, _omitFieldNames ? '' : 'report',\n        entryClassName: 'Label.ReportEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.viewunite.common'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Label clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Label copyWith(void Function(Label) updates) =>\n      super.copyWith((message) => updates(message as Label)) as Label;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Label create() => Label._();\n  @$core.override\n  Label createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Label getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Label>(create);\n  static Label? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get type => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set type($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get icon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set icon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIcon() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get iconNight => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set iconNight($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIconNight() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIconNight() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get iconWidth => $_getI64(4);\n  @$pb.TagNumber(5)\n  set iconWidth($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasIconWidth() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearIconWidth() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get iconHeight => $_getI64(5);\n  @$pb.TagNumber(6)\n  set iconHeight($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasIconHeight() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearIconHeight() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get lottie => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set lottie($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasLottie() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearLottie() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get lottieNight => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set lottieNight($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasLottieNight() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearLottieNight() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $pb.PbMap<$core.String, $core.String> get report => $_getMap(8);\n}\n\nclass LikeComment extends $pb.GeneratedMessage {\n  factory LikeComment({\n    $core.String? reply,\n    $core.String? title,\n  }) {\n    final result = create();\n    if (reply != null) result.reply = reply;\n    if (title != null) result.title = title;\n    return result;\n  }\n\n  LikeComment._();\n\n  factory LikeComment.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LikeComment.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LikeComment',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'reply')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeComment clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeComment copyWith(void Function(LikeComment) updates) =>\n      super.copyWith((message) => updates(message as LikeComment))\n          as LikeComment;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LikeComment create() => LikeComment._();\n  @$core.override\n  LikeComment createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LikeComment getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LikeComment>(create);\n  static LikeComment? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get reply => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set reply($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasReply() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearReply() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n}\n\nclass LikeExtend extends $pb.GeneratedMessage {\n  factory LikeExtend({\n    UpLikeImg? tripleLike,\n    $core.String? likeAnimation,\n    PlayerAnimation? playerAnimation,\n    ActivityResource? resource,\n  }) {\n    final result = create();\n    if (tripleLike != null) result.tripleLike = tripleLike;\n    if (likeAnimation != null) result.likeAnimation = likeAnimation;\n    if (playerAnimation != null) result.playerAnimation = playerAnimation;\n    if (resource != null) result.resource = resource;\n    return result;\n  }\n\n  LikeExtend._();\n\n  factory LikeExtend.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LikeExtend.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LikeExtend',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOM<UpLikeImg>(1, _omitFieldNames ? '' : 'tripleLike',\n        subBuilder: UpLikeImg.create)\n    ..aOS(2, _omitFieldNames ? '' : 'likeAnimation')\n    ..aOM<PlayerAnimation>(3, _omitFieldNames ? '' : 'playerAnimation',\n        subBuilder: PlayerAnimation.create)\n    ..aOM<ActivityResource>(4, _omitFieldNames ? '' : 'resource',\n        subBuilder: ActivityResource.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeExtend clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeExtend copyWith(void Function(LikeExtend) updates) =>\n      super.copyWith((message) => updates(message as LikeExtend)) as LikeExtend;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LikeExtend create() => LikeExtend._();\n  @$core.override\n  LikeExtend createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LikeExtend getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LikeExtend>(create);\n  static LikeExtend? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  UpLikeImg get tripleLike => $_getN(0);\n  @$pb.TagNumber(1)\n  set tripleLike(UpLikeImg value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTripleLike() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTripleLike() => $_clearField(1);\n  @$pb.TagNumber(1)\n  UpLikeImg ensureTripleLike() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get likeAnimation => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set likeAnimation($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLikeAnimation() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLikeAnimation() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  PlayerAnimation get playerAnimation => $_getN(2);\n  @$pb.TagNumber(3)\n  set playerAnimation(PlayerAnimation value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPlayerAnimation() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPlayerAnimation() => $_clearField(3);\n  @$pb.TagNumber(3)\n  PlayerAnimation ensurePlayerAnimation() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  ActivityResource get resource => $_getN(3);\n  @$pb.TagNumber(4)\n  set resource(ActivityResource value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasResource() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearResource() => $_clearField(4);\n  @$pb.TagNumber(4)\n  ActivityResource ensureResource() => $_ensure(3);\n}\n\nclass Live extends $pb.GeneratedMessage {\n  factory Live({\n    $fixnum.Int64? mid,\n    $fixnum.Int64? roomId,\n    $core.String? uri,\n    $core.String? endpageUri,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (roomId != null) result.roomId = roomId;\n    if (uri != null) result.uri = uri;\n    if (endpageUri != null) result.endpageUri = endpageUri;\n    return result;\n  }\n\n  Live._();\n\n  factory Live.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Live.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Live',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aInt64(2, _omitFieldNames ? '' : 'roomId')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..aOS(4, _omitFieldNames ? '' : 'endpageUri')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Live clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Live copyWith(void Function(Live) updates) =>\n      super.copyWith((message) => updates(message as Live)) as Live;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Live create() => Live._();\n  @$core.override\n  Live createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Live getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Live>(create);\n  static Live? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get roomId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set roomId($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasRoomId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRoomId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get endpageUri => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set endpageUri($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasEndpageUri() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearEndpageUri() => $_clearField(4);\n}\n\nclass LiveOrder extends $pb.GeneratedMessage {\n  factory LiveOrder({\n    $fixnum.Int64? sid,\n    $core.String? text,\n    $fixnum.Int64? livePlanStartTime,\n    $core.bool? isFollow,\n    $fixnum.Int64? followCount,\n    ReserveCalendarInfo? reserveCalendarInfo,\n  }) {\n    final result = create();\n    if (sid != null) result.sid = sid;\n    if (text != null) result.text = text;\n    if (livePlanStartTime != null) result.livePlanStartTime = livePlanStartTime;\n    if (isFollow != null) result.isFollow = isFollow;\n    if (followCount != null) result.followCount = followCount;\n    if (reserveCalendarInfo != null)\n      result.reserveCalendarInfo = reserveCalendarInfo;\n    return result;\n  }\n\n  LiveOrder._();\n\n  factory LiveOrder.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LiveOrder.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LiveOrder',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'sid')\n    ..aOS(2, _omitFieldNames ? '' : 'text')\n    ..aInt64(3, _omitFieldNames ? '' : 'livePlanStartTime')\n    ..aOB(4, _omitFieldNames ? '' : 'isFollow')\n    ..aInt64(5, _omitFieldNames ? '' : 'followCount')\n    ..aOM<ReserveCalendarInfo>(6, _omitFieldNames ? '' : 'reserveCalendarInfo',\n        subBuilder: ReserveCalendarInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LiveOrder clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LiveOrder copyWith(void Function(LiveOrder) updates) =>\n      super.copyWith((message) => updates(message as LiveOrder)) as LiveOrder;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LiveOrder create() => LiveOrder._();\n  @$core.override\n  LiveOrder createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LiveOrder getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<LiveOrder>(create);\n  static LiveOrder? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get sid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set sid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get livePlanStartTime => $_getI64(2);\n  @$pb.TagNumber(3)\n  set livePlanStartTime($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLivePlanStartTime() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLivePlanStartTime() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get isFollow => $_getBF(3);\n  @$pb.TagNumber(4)\n  set isFollow($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIsFollow() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIsFollow() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get followCount => $_getI64(4);\n  @$pb.TagNumber(5)\n  set followCount($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasFollowCount() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearFollowCount() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  ReserveCalendarInfo get reserveCalendarInfo => $_getN(5);\n  @$pb.TagNumber(6)\n  set reserveCalendarInfo(ReserveCalendarInfo value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasReserveCalendarInfo() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearReserveCalendarInfo() => $_clearField(6);\n  @$pb.TagNumber(6)\n  ReserveCalendarInfo ensureReserveCalendarInfo() => $_ensure(5);\n}\n\nclass Merchandise extends $pb.GeneratedMessage {\n  factory Merchandise({\n    $core.String? title,\n    MerchandiseButton? button,\n    $core.Iterable<MerchandiseCard>? card,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (button != null) result.button = button;\n    if (card != null) result.card.addAll(card);\n    return result;\n  }\n\n  Merchandise._();\n\n  factory Merchandise.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Merchandise.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Merchandise',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOM<MerchandiseButton>(2, _omitFieldNames ? '' : 'button',\n        subBuilder: MerchandiseButton.create)\n    ..pPM<MerchandiseCard>(3, _omitFieldNames ? '' : 'card',\n        subBuilder: MerchandiseCard.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Merchandise clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Merchandise copyWith(void Function(Merchandise) updates) =>\n      super.copyWith((message) => updates(message as Merchandise))\n          as Merchandise;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Merchandise create() => Merchandise._();\n  @$core.override\n  Merchandise createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Merchandise getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<Merchandise>(create);\n  static Merchandise? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  MerchandiseButton get button => $_getN(1);\n  @$pb.TagNumber(2)\n  set button(MerchandiseButton value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasButton() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearButton() => $_clearField(2);\n  @$pb.TagNumber(2)\n  MerchandiseButton ensureButton() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<MerchandiseCard> get card => $_getList(2);\n}\n\nclass MerchandiseButton extends $pb.GeneratedMessage {\n  factory MerchandiseButton({\n    $core.String? butTitle,\n    $core.String? butDayColor,\n    $core.String? butNightColor,\n  }) {\n    final result = create();\n    if (butTitle != null) result.butTitle = butTitle;\n    if (butDayColor != null) result.butDayColor = butDayColor;\n    if (butNightColor != null) result.butNightColor = butNightColor;\n    return result;\n  }\n\n  MerchandiseButton._();\n\n  factory MerchandiseButton.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MerchandiseButton.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MerchandiseButton',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'butTitle')\n    ..aOS(2, _omitFieldNames ? '' : 'butDayColor')\n    ..aOS(3, _omitFieldNames ? '' : 'butNightColor')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MerchandiseButton clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MerchandiseButton copyWith(void Function(MerchandiseButton) updates) =>\n      super.copyWith((message) => updates(message as MerchandiseButton))\n          as MerchandiseButton;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MerchandiseButton create() => MerchandiseButton._();\n  @$core.override\n  MerchandiseButton createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MerchandiseButton getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MerchandiseButton>(create);\n  static MerchandiseButton? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get butTitle => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set butTitle($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasButTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearButTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get butDayColor => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set butDayColor($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasButDayColor() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearButDayColor() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get butNightColor => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set butNightColor($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasButNightColor() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearButNightColor() => $_clearField(3);\n}\n\nclass MerchandiseCard extends $pb.GeneratedMessage {\n  factory MerchandiseCard({\n    $core.String? cover,\n    $core.String? title,\n    $core.Iterable<MerchandiseTitle>? subTitle,\n    MerchandiseButton? button,\n    $0.Any? sourceContent,\n  }) {\n    final result = create();\n    if (cover != null) result.cover = cover;\n    if (title != null) result.title = title;\n    if (subTitle != null) result.subTitle.addAll(subTitle);\n    if (button != null) result.button = button;\n    if (sourceContent != null) result.sourceContent = sourceContent;\n    return result;\n  }\n\n  MerchandiseCard._();\n\n  factory MerchandiseCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MerchandiseCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MerchandiseCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'cover')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..pPM<MerchandiseTitle>(3, _omitFieldNames ? '' : 'subTitle',\n        subBuilder: MerchandiseTitle.create)\n    ..aOM<MerchandiseButton>(4, _omitFieldNames ? '' : 'button',\n        subBuilder: MerchandiseButton.create)\n    ..aOM<$0.Any>(5, _omitFieldNames ? '' : 'sourceContent',\n        subBuilder: $0.Any.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MerchandiseCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MerchandiseCard copyWith(void Function(MerchandiseCard) updates) =>\n      super.copyWith((message) => updates(message as MerchandiseCard))\n          as MerchandiseCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MerchandiseCard create() => MerchandiseCard._();\n  @$core.override\n  MerchandiseCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MerchandiseCard getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MerchandiseCard>(create);\n  static MerchandiseCard? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get cover => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set cover($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCover() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCover() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<MerchandiseTitle> get subTitle => $_getList(2);\n\n  @$pb.TagNumber(4)\n  MerchandiseButton get button => $_getN(3);\n  @$pb.TagNumber(4)\n  set button(MerchandiseButton value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasButton() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearButton() => $_clearField(4);\n  @$pb.TagNumber(4)\n  MerchandiseButton ensureButton() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $0.Any get sourceContent => $_getN(4);\n  @$pb.TagNumber(5)\n  set sourceContent($0.Any value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasSourceContent() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearSourceContent() => $_clearField(5);\n  @$pb.TagNumber(5)\n  $0.Any ensureSourceContent() => $_ensure(4);\n}\n\nclass MerchandiseTitle extends $pb.GeneratedMessage {\n  factory MerchandiseTitle({\n    $core.String? title,\n    $core.String? dayColor,\n    $core.String? nightColor,\n    $fixnum.Int64? fontSize,\n    $core.int? textDecoration,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (dayColor != null) result.dayColor = dayColor;\n    if (nightColor != null) result.nightColor = nightColor;\n    if (fontSize != null) result.fontSize = fontSize;\n    if (textDecoration != null) result.textDecoration = textDecoration;\n    return result;\n  }\n\n  MerchandiseTitle._();\n\n  factory MerchandiseTitle.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MerchandiseTitle.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MerchandiseTitle',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'dayColor')\n    ..aOS(3, _omitFieldNames ? '' : 'nightColor')\n    ..aInt64(4, _omitFieldNames ? '' : 'fontSize')\n    ..aI(5, _omitFieldNames ? '' : 'textDecoration')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MerchandiseTitle clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MerchandiseTitle copyWith(void Function(MerchandiseTitle) updates) =>\n      super.copyWith((message) => updates(message as MerchandiseTitle))\n          as MerchandiseTitle;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MerchandiseTitle create() => MerchandiseTitle._();\n  @$core.override\n  MerchandiseTitle createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MerchandiseTitle getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MerchandiseTitle>(create);\n  static MerchandiseTitle? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get dayColor => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set dayColor($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDayColor() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDayColor() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get nightColor => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set nightColor($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasNightColor() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearNightColor() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get fontSize => $_getI64(3);\n  @$pb.TagNumber(4)\n  set fontSize($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFontSize() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFontSize() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get textDecoration => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set textDecoration($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasTextDecoration() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearTextDecoration() => $_clearField(5);\n}\n\nclass Mine extends $pb.GeneratedMessage {\n  factory Mine({\n    $core.double? amount,\n    $core.int? rank,\n    $core.String? msg,\n  }) {\n    final result = create();\n    if (amount != null) result.amount = amount;\n    if (rank != null) result.rank = rank;\n    if (msg != null) result.msg = msg;\n    return result;\n  }\n\n  Mine._();\n\n  factory Mine.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Mine.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Mine',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aD(1, _omitFieldNames ? '' : 'amount')\n    ..aI(2, _omitFieldNames ? '' : 'rank')\n    ..aOS(3, _omitFieldNames ? '' : 'msg')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Mine clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Mine copyWith(void Function(Mine) updates) =>\n      super.copyWith((message) => updates(message as Mine)) as Mine;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Mine create() => Mine._();\n  @$core.override\n  Mine createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Mine getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Mine>(create);\n  static Mine? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.double get amount => $_getN(0);\n  @$pb.TagNumber(1)\n  set amount($core.double value) => $_setDouble(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAmount() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAmount() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get rank => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set rank($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasRank() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRank() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get msg => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set msg($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasMsg() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearMsg() => $_clearField(3);\n}\n\nenum Module_Data {\n  ogvIntroduction,\n  ugcIntroduction,\n  kingPosition,\n  headLine,\n  ogvTitle,\n  honor,\n  list,\n  staffs,\n  activityReserve,\n  liveOrder,\n  sectionData,\n  deliveryData,\n  followLayer,\n  ogvSeasons,\n  ugcSeason,\n  ogvLiveReserve,\n  combinationEp,\n  sponsor,\n  activityEntranceModule,\n  serialSeason,\n  relates,\n  banner,\n  audio,\n  likeComment,\n  attentionRecommend,\n  covenanter,\n  specialTag,\n  upDataModule,\n  professionApproval,\n  pugvShoppingNotice,\n  pugvFaq,\n  pugvSeasonDescription,\n  pugvSeasonRecommend,\n  pugvSeasonPublisher,\n  pugvSeasonSelection,\n  pugvSeasonPrimaryInfo,\n  pugvCooperationApplication,\n  upVideoTool,\n  pugvZone,\n  pugvSeries,\n  pugvPackage,\n  activityStarRail,\n  activityIframe,\n  playList,\n  merchandise,\n  activityGuidanceBar,\n  notSet\n}\n\nclass Module extends $pb.GeneratedMessage {\n  factory Module({\n    ModuleType? type,\n    OgvIntroduction? ogvIntroduction,\n    UgcIntroduction? ugcIntroduction,\n    KingPosition? kingPosition,\n    Headline? headLine,\n    OgvTitle? ogvTitle,\n    Honor? honor,\n    UserList? list,\n    Staffs? staffs,\n    ActivityReserve? activityReserve,\n    LiveOrder? liveOrder,\n    SectionData? sectionData,\n    DeliveryData? deliveryData,\n    FollowLayer? followLayer,\n    OgvSeasons? ogvSeasons,\n    UgcSeasons? ugcSeason,\n    OgvLiveReserve? ogvLiveReserve,\n    CombinationEp? combinationEp,\n    Sponsor? sponsor,\n    ActivityEntranceModule? activityEntranceModule,\n    SerialSeason? serialSeason,\n    Relates? relates,\n    Banner? banner,\n    Audio? audio,\n    LikeComment? likeComment,\n    AttentionRecommend? attentionRecommend,\n    Covenanter? covenanter,\n    SpecialTag? specialTag,\n    UpDataModule? upDataModule,\n    ProfessionApproval? professionApproval,\n    PugvShoppingNotice? pugvShoppingNotice,\n    PugvFaq? pugvFaq,\n    PugvSeasonDescription? pugvSeasonDescription,\n    PugvSeasonRecommend? pugvSeasonRecommend,\n    PugvSeasonPublisher? pugvSeasonPublisher,\n    PugvSeasonSelection? pugvSeasonSelection,\n    PugvSeasonPrimaryInfo? pugvSeasonPrimaryInfo,\n    PugvCooperationApplication? pugvCooperationApplication,\n    UpVideoTool? upVideoTool,\n    PugvZone? pugvZone,\n    PugvSeries? pugvSeries,\n    PugvPackage? pugvPackage,\n    ActivityStarRail? activityStarRail,\n    ActivityIFrame? activityIframe,\n    PlayList? playList,\n    Merchandise? merchandise,\n    ActivityGuidanceBar? activityGuidanceBar,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (ogvIntroduction != null) result.ogvIntroduction = ogvIntroduction;\n    if (ugcIntroduction != null) result.ugcIntroduction = ugcIntroduction;\n    if (kingPosition != null) result.kingPosition = kingPosition;\n    if (headLine != null) result.headLine = headLine;\n    if (ogvTitle != null) result.ogvTitle = ogvTitle;\n    if (honor != null) result.honor = honor;\n    if (list != null) result.list = list;\n    if (staffs != null) result.staffs = staffs;\n    if (activityReserve != null) result.activityReserve = activityReserve;\n    if (liveOrder != null) result.liveOrder = liveOrder;\n    if (sectionData != null) result.sectionData = sectionData;\n    if (deliveryData != null) result.deliveryData = deliveryData;\n    if (followLayer != null) result.followLayer = followLayer;\n    if (ogvSeasons != null) result.ogvSeasons = ogvSeasons;\n    if (ugcSeason != null) result.ugcSeason = ugcSeason;\n    if (ogvLiveReserve != null) result.ogvLiveReserve = ogvLiveReserve;\n    if (combinationEp != null) result.combinationEp = combinationEp;\n    if (sponsor != null) result.sponsor = sponsor;\n    if (activityEntranceModule != null)\n      result.activityEntranceModule = activityEntranceModule;\n    if (serialSeason != null) result.serialSeason = serialSeason;\n    if (relates != null) result.relates = relates;\n    if (banner != null) result.banner = banner;\n    if (audio != null) result.audio = audio;\n    if (likeComment != null) result.likeComment = likeComment;\n    if (attentionRecommend != null)\n      result.attentionRecommend = attentionRecommend;\n    if (covenanter != null) result.covenanter = covenanter;\n    if (specialTag != null) result.specialTag = specialTag;\n    if (upDataModule != null) result.upDataModule = upDataModule;\n    if (professionApproval != null)\n      result.professionApproval = professionApproval;\n    if (pugvShoppingNotice != null)\n      result.pugvShoppingNotice = pugvShoppingNotice;\n    if (pugvFaq != null) result.pugvFaq = pugvFaq;\n    if (pugvSeasonDescription != null)\n      result.pugvSeasonDescription = pugvSeasonDescription;\n    if (pugvSeasonRecommend != null)\n      result.pugvSeasonRecommend = pugvSeasonRecommend;\n    if (pugvSeasonPublisher != null)\n      result.pugvSeasonPublisher = pugvSeasonPublisher;\n    if (pugvSeasonSelection != null)\n      result.pugvSeasonSelection = pugvSeasonSelection;\n    if (pugvSeasonPrimaryInfo != null)\n      result.pugvSeasonPrimaryInfo = pugvSeasonPrimaryInfo;\n    if (pugvCooperationApplication != null)\n      result.pugvCooperationApplication = pugvCooperationApplication;\n    if (upVideoTool != null) result.upVideoTool = upVideoTool;\n    if (pugvZone != null) result.pugvZone = pugvZone;\n    if (pugvSeries != null) result.pugvSeries = pugvSeries;\n    if (pugvPackage != null) result.pugvPackage = pugvPackage;\n    if (activityStarRail != null) result.activityStarRail = activityStarRail;\n    if (activityIframe != null) result.activityIframe = activityIframe;\n    if (playList != null) result.playList = playList;\n    if (merchandise != null) result.merchandise = merchandise;\n    if (activityGuidanceBar != null)\n      result.activityGuidanceBar = activityGuidanceBar;\n    return result;\n  }\n\n  Module._();\n\n  factory Module.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Module.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, Module_Data> _Module_DataByTag = {\n    2: Module_Data.ogvIntroduction,\n    3: Module_Data.ugcIntroduction,\n    4: Module_Data.kingPosition,\n    5: Module_Data.headLine,\n    6: Module_Data.ogvTitle,\n    7: Module_Data.honor,\n    8: Module_Data.list,\n    9: Module_Data.staffs,\n    10: Module_Data.activityReserve,\n    11: Module_Data.liveOrder,\n    12: Module_Data.sectionData,\n    13: Module_Data.deliveryData,\n    14: Module_Data.followLayer,\n    15: Module_Data.ogvSeasons,\n    16: Module_Data.ugcSeason,\n    17: Module_Data.ogvLiveReserve,\n    18: Module_Data.combinationEp,\n    19: Module_Data.sponsor,\n    20: Module_Data.activityEntranceModule,\n    21: Module_Data.serialSeason,\n    22: Module_Data.relates,\n    23: Module_Data.banner,\n    24: Module_Data.audio,\n    25: Module_Data.likeComment,\n    26: Module_Data.attentionRecommend,\n    27: Module_Data.covenanter,\n    28: Module_Data.specialTag,\n    29: Module_Data.upDataModule,\n    30: Module_Data.professionApproval,\n    31: Module_Data.pugvShoppingNotice,\n    32: Module_Data.pugvFaq,\n    33: Module_Data.pugvSeasonDescription,\n    34: Module_Data.pugvSeasonRecommend,\n    35: Module_Data.pugvSeasonPublisher,\n    36: Module_Data.pugvSeasonSelection,\n    37: Module_Data.pugvSeasonPrimaryInfo,\n    38: Module_Data.pugvCooperationApplication,\n    39: Module_Data.upVideoTool,\n    40: Module_Data.pugvZone,\n    41: Module_Data.pugvSeries,\n    42: Module_Data.pugvPackage,\n    43: Module_Data.activityStarRail,\n    44: Module_Data.activityIframe,\n    45: Module_Data.playList,\n    46: Module_Data.merchandise,\n    47: Module_Data.activityGuidanceBar,\n    0: Module_Data.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Module',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..oo(0, [\n      2,\n      3,\n      4,\n      5,\n      6,\n      7,\n      8,\n      9,\n      10,\n      11,\n      12,\n      13,\n      14,\n      15,\n      16,\n      17,\n      18,\n      19,\n      20,\n      21,\n      22,\n      23,\n      24,\n      25,\n      26,\n      27,\n      28,\n      29,\n      30,\n      31,\n      32,\n      33,\n      34,\n      35,\n      36,\n      37,\n      38,\n      39,\n      40,\n      41,\n      42,\n      43,\n      44,\n      45,\n      46,\n      47\n    ])\n    ..aE<ModuleType>(1, _omitFieldNames ? '' : 'type',\n        enumValues: ModuleType.values)\n    ..aOM<OgvIntroduction>(2, _omitFieldNames ? '' : 'ogvIntroduction',\n        subBuilder: OgvIntroduction.create)\n    ..aOM<UgcIntroduction>(3, _omitFieldNames ? '' : 'ugcIntroduction',\n        subBuilder: UgcIntroduction.create)\n    ..aOM<KingPosition>(4, _omitFieldNames ? '' : 'kingPosition',\n        subBuilder: KingPosition.create)\n    ..aOM<Headline>(5, _omitFieldNames ? '' : 'headLine',\n        subBuilder: Headline.create)\n    ..aOM<OgvTitle>(6, _omitFieldNames ? '' : 'ogvTitle',\n        subBuilder: OgvTitle.create)\n    ..aOM<Honor>(7, _omitFieldNames ? '' : 'honor', subBuilder: Honor.create)\n    ..aOM<UserList>(8, _omitFieldNames ? '' : 'list',\n        subBuilder: UserList.create)\n    ..aOM<Staffs>(9, _omitFieldNames ? '' : 'staffs', subBuilder: Staffs.create)\n    ..aOM<ActivityReserve>(10, _omitFieldNames ? '' : 'activityReserve',\n        subBuilder: ActivityReserve.create)\n    ..aOM<LiveOrder>(11, _omitFieldNames ? '' : 'liveOrder',\n        subBuilder: LiveOrder.create)\n    ..aOM<SectionData>(12, _omitFieldNames ? '' : 'sectionData',\n        subBuilder: SectionData.create)\n    ..aOM<DeliveryData>(13, _omitFieldNames ? '' : 'deliveryData',\n        subBuilder: DeliveryData.create)\n    ..aOM<FollowLayer>(14, _omitFieldNames ? '' : 'followLayer',\n        subBuilder: FollowLayer.create)\n    ..aOM<OgvSeasons>(15, _omitFieldNames ? '' : 'ogvSeasons',\n        subBuilder: OgvSeasons.create)\n    ..aOM<UgcSeasons>(16, _omitFieldNames ? '' : 'ugcSeason',\n        subBuilder: UgcSeasons.create)\n    ..aOM<OgvLiveReserve>(17, _omitFieldNames ? '' : 'ogvLiveReserve',\n        subBuilder: OgvLiveReserve.create)\n    ..aOM<CombinationEp>(18, _omitFieldNames ? '' : 'combinationEp',\n        subBuilder: CombinationEp.create)\n    ..aOM<Sponsor>(19, _omitFieldNames ? '' : 'sponsor',\n        subBuilder: Sponsor.create)\n    ..aOM<ActivityEntranceModule>(\n        20, _omitFieldNames ? '' : 'activityEntranceModule',\n        subBuilder: ActivityEntranceModule.create)\n    ..aOM<SerialSeason>(21, _omitFieldNames ? '' : 'serialSeason',\n        subBuilder: SerialSeason.create)\n    ..aOM<Relates>(22, _omitFieldNames ? '' : 'relates',\n        subBuilder: Relates.create)\n    ..aOM<Banner>(23, _omitFieldNames ? '' : 'banner',\n        subBuilder: Banner.create)\n    ..aOM<Audio>(24, _omitFieldNames ? '' : 'audio', subBuilder: Audio.create)\n    ..aOM<LikeComment>(25, _omitFieldNames ? '' : 'likeComment',\n        subBuilder: LikeComment.create)\n    ..aOM<AttentionRecommend>(26, _omitFieldNames ? '' : 'attentionRecommend',\n        subBuilder: AttentionRecommend.create)\n    ..aOM<Covenanter>(27, _omitFieldNames ? '' : 'covenanter',\n        subBuilder: Covenanter.create)\n    ..aOM<SpecialTag>(28, _omitFieldNames ? '' : 'specialTag',\n        subBuilder: SpecialTag.create)\n    ..aOM<UpDataModule>(29, _omitFieldNames ? '' : 'upDataModule',\n        subBuilder: UpDataModule.create)\n    ..aOM<ProfessionApproval>(30, _omitFieldNames ? '' : 'professionApproval',\n        subBuilder: ProfessionApproval.create)\n    ..aOM<PugvShoppingNotice>(31, _omitFieldNames ? '' : 'pugvShoppingNotice',\n        subBuilder: PugvShoppingNotice.create)\n    ..aOM<PugvFaq>(32, _omitFieldNames ? '' : 'pugvFaq',\n        subBuilder: PugvFaq.create)\n    ..aOM<PugvSeasonDescription>(\n        33, _omitFieldNames ? '' : 'pugvSeasonDescription',\n        subBuilder: PugvSeasonDescription.create)\n    ..aOM<PugvSeasonRecommend>(34, _omitFieldNames ? '' : 'pugvSeasonRecommend',\n        subBuilder: PugvSeasonRecommend.create)\n    ..aOM<PugvSeasonPublisher>(35, _omitFieldNames ? '' : 'pugvSeasonPublisher',\n        subBuilder: PugvSeasonPublisher.create)\n    ..aOM<PugvSeasonSelection>(36, _omitFieldNames ? '' : 'pugvSeasonSelection',\n        subBuilder: PugvSeasonSelection.create)\n    ..aOM<PugvSeasonPrimaryInfo>(\n        37, _omitFieldNames ? '' : 'pugvSeasonPrimaryInfo',\n        subBuilder: PugvSeasonPrimaryInfo.create)\n    ..aOM<PugvCooperationApplication>(\n        38, _omitFieldNames ? '' : 'pugvCooperationApplication',\n        subBuilder: PugvCooperationApplication.create)\n    ..aOM<UpVideoTool>(39, _omitFieldNames ? '' : 'upVideoTool',\n        subBuilder: UpVideoTool.create)\n    ..aOM<PugvZone>(40, _omitFieldNames ? '' : 'pugvZone',\n        subBuilder: PugvZone.create)\n    ..aOM<PugvSeries>(41, _omitFieldNames ? '' : 'pugvSeries',\n        subBuilder: PugvSeries.create)\n    ..aOM<PugvPackage>(42, _omitFieldNames ? '' : 'pugvPackage',\n        subBuilder: PugvPackage.create)\n    ..aOM<ActivityStarRail>(43, _omitFieldNames ? '' : 'activityStarRail',\n        subBuilder: ActivityStarRail.create)\n    ..aOM<ActivityIFrame>(44, _omitFieldNames ? '' : 'activityIframe',\n        subBuilder: ActivityIFrame.create)\n    ..aOM<PlayList>(45, _omitFieldNames ? '' : 'playList',\n        subBuilder: PlayList.create)\n    ..aOM<Merchandise>(46, _omitFieldNames ? '' : 'merchandise',\n        subBuilder: Merchandise.create)\n    ..aOM<ActivityGuidanceBar>(47, _omitFieldNames ? '' : 'activityGuidanceBar',\n        subBuilder: ActivityGuidanceBar.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Module clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Module copyWith(void Function(Module) updates) =>\n      super.copyWith((message) => updates(message as Module)) as Module;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Module create() => Module._();\n  @$core.override\n  Module createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Module getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Module>(create);\n  static Module? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(7)\n  @$pb.TagNumber(8)\n  @$pb.TagNumber(9)\n  @$pb.TagNumber(10)\n  @$pb.TagNumber(11)\n  @$pb.TagNumber(12)\n  @$pb.TagNumber(13)\n  @$pb.TagNumber(14)\n  @$pb.TagNumber(15)\n  @$pb.TagNumber(16)\n  @$pb.TagNumber(17)\n  @$pb.TagNumber(18)\n  @$pb.TagNumber(19)\n  @$pb.TagNumber(20)\n  @$pb.TagNumber(21)\n  @$pb.TagNumber(22)\n  @$pb.TagNumber(23)\n  @$pb.TagNumber(24)\n  @$pb.TagNumber(25)\n  @$pb.TagNumber(26)\n  @$pb.TagNumber(27)\n  @$pb.TagNumber(28)\n  @$pb.TagNumber(29)\n  @$pb.TagNumber(30)\n  @$pb.TagNumber(31)\n  @$pb.TagNumber(32)\n  @$pb.TagNumber(33)\n  @$pb.TagNumber(34)\n  @$pb.TagNumber(35)\n  @$pb.TagNumber(36)\n  @$pb.TagNumber(37)\n  @$pb.TagNumber(38)\n  @$pb.TagNumber(39)\n  @$pb.TagNumber(40)\n  @$pb.TagNumber(41)\n  @$pb.TagNumber(42)\n  @$pb.TagNumber(43)\n  @$pb.TagNumber(44)\n  @$pb.TagNumber(45)\n  @$pb.TagNumber(46)\n  @$pb.TagNumber(47)\n  Module_Data whichData() => _Module_DataByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(7)\n  @$pb.TagNumber(8)\n  @$pb.TagNumber(9)\n  @$pb.TagNumber(10)\n  @$pb.TagNumber(11)\n  @$pb.TagNumber(12)\n  @$pb.TagNumber(13)\n  @$pb.TagNumber(14)\n  @$pb.TagNumber(15)\n  @$pb.TagNumber(16)\n  @$pb.TagNumber(17)\n  @$pb.TagNumber(18)\n  @$pb.TagNumber(19)\n  @$pb.TagNumber(20)\n  @$pb.TagNumber(21)\n  @$pb.TagNumber(22)\n  @$pb.TagNumber(23)\n  @$pb.TagNumber(24)\n  @$pb.TagNumber(25)\n  @$pb.TagNumber(26)\n  @$pb.TagNumber(27)\n  @$pb.TagNumber(28)\n  @$pb.TagNumber(29)\n  @$pb.TagNumber(30)\n  @$pb.TagNumber(31)\n  @$pb.TagNumber(32)\n  @$pb.TagNumber(33)\n  @$pb.TagNumber(34)\n  @$pb.TagNumber(35)\n  @$pb.TagNumber(36)\n  @$pb.TagNumber(37)\n  @$pb.TagNumber(38)\n  @$pb.TagNumber(39)\n  @$pb.TagNumber(40)\n  @$pb.TagNumber(41)\n  @$pb.TagNumber(42)\n  @$pb.TagNumber(43)\n  @$pb.TagNumber(44)\n  @$pb.TagNumber(45)\n  @$pb.TagNumber(46)\n  @$pb.TagNumber(47)\n  void clearData() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  ModuleType get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(ModuleType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  OgvIntroduction get ogvIntroduction => $_getN(1);\n  @$pb.TagNumber(2)\n  set ogvIntroduction(OgvIntroduction value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOgvIntroduction() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOgvIntroduction() => $_clearField(2);\n  @$pb.TagNumber(2)\n  OgvIntroduction ensureOgvIntroduction() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  UgcIntroduction get ugcIntroduction => $_getN(2);\n  @$pb.TagNumber(3)\n  set ugcIntroduction(UgcIntroduction value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUgcIntroduction() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUgcIntroduction() => $_clearField(3);\n  @$pb.TagNumber(3)\n  UgcIntroduction ensureUgcIntroduction() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  KingPosition get kingPosition => $_getN(3);\n  @$pb.TagNumber(4)\n  set kingPosition(KingPosition value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasKingPosition() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearKingPosition() => $_clearField(4);\n  @$pb.TagNumber(4)\n  KingPosition ensureKingPosition() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  Headline get headLine => $_getN(4);\n  @$pb.TagNumber(5)\n  set headLine(Headline value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasHeadLine() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearHeadLine() => $_clearField(5);\n  @$pb.TagNumber(5)\n  Headline ensureHeadLine() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  OgvTitle get ogvTitle => $_getN(5);\n  @$pb.TagNumber(6)\n  set ogvTitle(OgvTitle value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasOgvTitle() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearOgvTitle() => $_clearField(6);\n  @$pb.TagNumber(6)\n  OgvTitle ensureOgvTitle() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  Honor get honor => $_getN(6);\n  @$pb.TagNumber(7)\n  set honor(Honor value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasHonor() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearHonor() => $_clearField(7);\n  @$pb.TagNumber(7)\n  Honor ensureHonor() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  UserList get list => $_getN(7);\n  @$pb.TagNumber(8)\n  set list(UserList value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasList() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearList() => $_clearField(8);\n  @$pb.TagNumber(8)\n  UserList ensureList() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  Staffs get staffs => $_getN(8);\n  @$pb.TagNumber(9)\n  set staffs(Staffs value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasStaffs() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearStaffs() => $_clearField(9);\n  @$pb.TagNumber(9)\n  Staffs ensureStaffs() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  ActivityReserve get activityReserve => $_getN(9);\n  @$pb.TagNumber(10)\n  set activityReserve(ActivityReserve value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasActivityReserve() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearActivityReserve() => $_clearField(10);\n  @$pb.TagNumber(10)\n  ActivityReserve ensureActivityReserve() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  LiveOrder get liveOrder => $_getN(10);\n  @$pb.TagNumber(11)\n  set liveOrder(LiveOrder value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasLiveOrder() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearLiveOrder() => $_clearField(11);\n  @$pb.TagNumber(11)\n  LiveOrder ensureLiveOrder() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  SectionData get sectionData => $_getN(11);\n  @$pb.TagNumber(12)\n  set sectionData(SectionData value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasSectionData() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearSectionData() => $_clearField(12);\n  @$pb.TagNumber(12)\n  SectionData ensureSectionData() => $_ensure(11);\n\n  @$pb.TagNumber(13)\n  DeliveryData get deliveryData => $_getN(12);\n  @$pb.TagNumber(13)\n  set deliveryData(DeliveryData value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasDeliveryData() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearDeliveryData() => $_clearField(13);\n  @$pb.TagNumber(13)\n  DeliveryData ensureDeliveryData() => $_ensure(12);\n\n  @$pb.TagNumber(14)\n  FollowLayer get followLayer => $_getN(13);\n  @$pb.TagNumber(14)\n  set followLayer(FollowLayer value) => $_setField(14, value);\n  @$pb.TagNumber(14)\n  $core.bool hasFollowLayer() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearFollowLayer() => $_clearField(14);\n  @$pb.TagNumber(14)\n  FollowLayer ensureFollowLayer() => $_ensure(13);\n\n  @$pb.TagNumber(15)\n  OgvSeasons get ogvSeasons => $_getN(14);\n  @$pb.TagNumber(15)\n  set ogvSeasons(OgvSeasons value) => $_setField(15, value);\n  @$pb.TagNumber(15)\n  $core.bool hasOgvSeasons() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearOgvSeasons() => $_clearField(15);\n  @$pb.TagNumber(15)\n  OgvSeasons ensureOgvSeasons() => $_ensure(14);\n\n  @$pb.TagNumber(16)\n  UgcSeasons get ugcSeason => $_getN(15);\n  @$pb.TagNumber(16)\n  set ugcSeason(UgcSeasons value) => $_setField(16, value);\n  @$pb.TagNumber(16)\n  $core.bool hasUgcSeason() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearUgcSeason() => $_clearField(16);\n  @$pb.TagNumber(16)\n  UgcSeasons ensureUgcSeason() => $_ensure(15);\n\n  @$pb.TagNumber(17)\n  OgvLiveReserve get ogvLiveReserve => $_getN(16);\n  @$pb.TagNumber(17)\n  set ogvLiveReserve(OgvLiveReserve value) => $_setField(17, value);\n  @$pb.TagNumber(17)\n  $core.bool hasOgvLiveReserve() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearOgvLiveReserve() => $_clearField(17);\n  @$pb.TagNumber(17)\n  OgvLiveReserve ensureOgvLiveReserve() => $_ensure(16);\n\n  @$pb.TagNumber(18)\n  CombinationEp get combinationEp => $_getN(17);\n  @$pb.TagNumber(18)\n  set combinationEp(CombinationEp value) => $_setField(18, value);\n  @$pb.TagNumber(18)\n  $core.bool hasCombinationEp() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearCombinationEp() => $_clearField(18);\n  @$pb.TagNumber(18)\n  CombinationEp ensureCombinationEp() => $_ensure(17);\n\n  @$pb.TagNumber(19)\n  Sponsor get sponsor => $_getN(18);\n  @$pb.TagNumber(19)\n  set sponsor(Sponsor value) => $_setField(19, value);\n  @$pb.TagNumber(19)\n  $core.bool hasSponsor() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearSponsor() => $_clearField(19);\n  @$pb.TagNumber(19)\n  Sponsor ensureSponsor() => $_ensure(18);\n\n  @$pb.TagNumber(20)\n  ActivityEntranceModule get activityEntranceModule => $_getN(19);\n  @$pb.TagNumber(20)\n  set activityEntranceModule(ActivityEntranceModule value) =>\n      $_setField(20, value);\n  @$pb.TagNumber(20)\n  $core.bool hasActivityEntranceModule() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearActivityEntranceModule() => $_clearField(20);\n  @$pb.TagNumber(20)\n  ActivityEntranceModule ensureActivityEntranceModule() => $_ensure(19);\n\n  @$pb.TagNumber(21)\n  SerialSeason get serialSeason => $_getN(20);\n  @$pb.TagNumber(21)\n  set serialSeason(SerialSeason value) => $_setField(21, value);\n  @$pb.TagNumber(21)\n  $core.bool hasSerialSeason() => $_has(20);\n  @$pb.TagNumber(21)\n  void clearSerialSeason() => $_clearField(21);\n  @$pb.TagNumber(21)\n  SerialSeason ensureSerialSeason() => $_ensure(20);\n\n  @$pb.TagNumber(22)\n  Relates get relates => $_getN(21);\n  @$pb.TagNumber(22)\n  set relates(Relates value) => $_setField(22, value);\n  @$pb.TagNumber(22)\n  $core.bool hasRelates() => $_has(21);\n  @$pb.TagNumber(22)\n  void clearRelates() => $_clearField(22);\n  @$pb.TagNumber(22)\n  Relates ensureRelates() => $_ensure(21);\n\n  @$pb.TagNumber(23)\n  Banner get banner => $_getN(22);\n  @$pb.TagNumber(23)\n  set banner(Banner value) => $_setField(23, value);\n  @$pb.TagNumber(23)\n  $core.bool hasBanner() => $_has(22);\n  @$pb.TagNumber(23)\n  void clearBanner() => $_clearField(23);\n  @$pb.TagNumber(23)\n  Banner ensureBanner() => $_ensure(22);\n\n  @$pb.TagNumber(24)\n  Audio get audio => $_getN(23);\n  @$pb.TagNumber(24)\n  set audio(Audio value) => $_setField(24, value);\n  @$pb.TagNumber(24)\n  $core.bool hasAudio() => $_has(23);\n  @$pb.TagNumber(24)\n  void clearAudio() => $_clearField(24);\n  @$pb.TagNumber(24)\n  Audio ensureAudio() => $_ensure(23);\n\n  @$pb.TagNumber(25)\n  LikeComment get likeComment => $_getN(24);\n  @$pb.TagNumber(25)\n  set likeComment(LikeComment value) => $_setField(25, value);\n  @$pb.TagNumber(25)\n  $core.bool hasLikeComment() => $_has(24);\n  @$pb.TagNumber(25)\n  void clearLikeComment() => $_clearField(25);\n  @$pb.TagNumber(25)\n  LikeComment ensureLikeComment() => $_ensure(24);\n\n  @$pb.TagNumber(26)\n  AttentionRecommend get attentionRecommend => $_getN(25);\n  @$pb.TagNumber(26)\n  set attentionRecommend(AttentionRecommend value) => $_setField(26, value);\n  @$pb.TagNumber(26)\n  $core.bool hasAttentionRecommend() => $_has(25);\n  @$pb.TagNumber(26)\n  void clearAttentionRecommend() => $_clearField(26);\n  @$pb.TagNumber(26)\n  AttentionRecommend ensureAttentionRecommend() => $_ensure(25);\n\n  @$pb.TagNumber(27)\n  Covenanter get covenanter => $_getN(26);\n  @$pb.TagNumber(27)\n  set covenanter(Covenanter value) => $_setField(27, value);\n  @$pb.TagNumber(27)\n  $core.bool hasCovenanter() => $_has(26);\n  @$pb.TagNumber(27)\n  void clearCovenanter() => $_clearField(27);\n  @$pb.TagNumber(27)\n  Covenanter ensureCovenanter() => $_ensure(26);\n\n  @$pb.TagNumber(28)\n  SpecialTag get specialTag => $_getN(27);\n  @$pb.TagNumber(28)\n  set specialTag(SpecialTag value) => $_setField(28, value);\n  @$pb.TagNumber(28)\n  $core.bool hasSpecialTag() => $_has(27);\n  @$pb.TagNumber(28)\n  void clearSpecialTag() => $_clearField(28);\n  @$pb.TagNumber(28)\n  SpecialTag ensureSpecialTag() => $_ensure(27);\n\n  @$pb.TagNumber(29)\n  UpDataModule get upDataModule => $_getN(28);\n  @$pb.TagNumber(29)\n  set upDataModule(UpDataModule value) => $_setField(29, value);\n  @$pb.TagNumber(29)\n  $core.bool hasUpDataModule() => $_has(28);\n  @$pb.TagNumber(29)\n  void clearUpDataModule() => $_clearField(29);\n  @$pb.TagNumber(29)\n  UpDataModule ensureUpDataModule() => $_ensure(28);\n\n  @$pb.TagNumber(30)\n  ProfessionApproval get professionApproval => $_getN(29);\n  @$pb.TagNumber(30)\n  set professionApproval(ProfessionApproval value) => $_setField(30, value);\n  @$pb.TagNumber(30)\n  $core.bool hasProfessionApproval() => $_has(29);\n  @$pb.TagNumber(30)\n  void clearProfessionApproval() => $_clearField(30);\n  @$pb.TagNumber(30)\n  ProfessionApproval ensureProfessionApproval() => $_ensure(29);\n\n  @$pb.TagNumber(31)\n  PugvShoppingNotice get pugvShoppingNotice => $_getN(30);\n  @$pb.TagNumber(31)\n  set pugvShoppingNotice(PugvShoppingNotice value) => $_setField(31, value);\n  @$pb.TagNumber(31)\n  $core.bool hasPugvShoppingNotice() => $_has(30);\n  @$pb.TagNumber(31)\n  void clearPugvShoppingNotice() => $_clearField(31);\n  @$pb.TagNumber(31)\n  PugvShoppingNotice ensurePugvShoppingNotice() => $_ensure(30);\n\n  @$pb.TagNumber(32)\n  PugvFaq get pugvFaq => $_getN(31);\n  @$pb.TagNumber(32)\n  set pugvFaq(PugvFaq value) => $_setField(32, value);\n  @$pb.TagNumber(32)\n  $core.bool hasPugvFaq() => $_has(31);\n  @$pb.TagNumber(32)\n  void clearPugvFaq() => $_clearField(32);\n  @$pb.TagNumber(32)\n  PugvFaq ensurePugvFaq() => $_ensure(31);\n\n  @$pb.TagNumber(33)\n  PugvSeasonDescription get pugvSeasonDescription => $_getN(32);\n  @$pb.TagNumber(33)\n  set pugvSeasonDescription(PugvSeasonDescription value) =>\n      $_setField(33, value);\n  @$pb.TagNumber(33)\n  $core.bool hasPugvSeasonDescription() => $_has(32);\n  @$pb.TagNumber(33)\n  void clearPugvSeasonDescription() => $_clearField(33);\n  @$pb.TagNumber(33)\n  PugvSeasonDescription ensurePugvSeasonDescription() => $_ensure(32);\n\n  @$pb.TagNumber(34)\n  PugvSeasonRecommend get pugvSeasonRecommend => $_getN(33);\n  @$pb.TagNumber(34)\n  set pugvSeasonRecommend(PugvSeasonRecommend value) => $_setField(34, value);\n  @$pb.TagNumber(34)\n  $core.bool hasPugvSeasonRecommend() => $_has(33);\n  @$pb.TagNumber(34)\n  void clearPugvSeasonRecommend() => $_clearField(34);\n  @$pb.TagNumber(34)\n  PugvSeasonRecommend ensurePugvSeasonRecommend() => $_ensure(33);\n\n  @$pb.TagNumber(35)\n  PugvSeasonPublisher get pugvSeasonPublisher => $_getN(34);\n  @$pb.TagNumber(35)\n  set pugvSeasonPublisher(PugvSeasonPublisher value) => $_setField(35, value);\n  @$pb.TagNumber(35)\n  $core.bool hasPugvSeasonPublisher() => $_has(34);\n  @$pb.TagNumber(35)\n  void clearPugvSeasonPublisher() => $_clearField(35);\n  @$pb.TagNumber(35)\n  PugvSeasonPublisher ensurePugvSeasonPublisher() => $_ensure(34);\n\n  @$pb.TagNumber(36)\n  PugvSeasonSelection get pugvSeasonSelection => $_getN(35);\n  @$pb.TagNumber(36)\n  set pugvSeasonSelection(PugvSeasonSelection value) => $_setField(36, value);\n  @$pb.TagNumber(36)\n  $core.bool hasPugvSeasonSelection() => $_has(35);\n  @$pb.TagNumber(36)\n  void clearPugvSeasonSelection() => $_clearField(36);\n  @$pb.TagNumber(36)\n  PugvSeasonSelection ensurePugvSeasonSelection() => $_ensure(35);\n\n  @$pb.TagNumber(37)\n  PugvSeasonPrimaryInfo get pugvSeasonPrimaryInfo => $_getN(36);\n  @$pb.TagNumber(37)\n  set pugvSeasonPrimaryInfo(PugvSeasonPrimaryInfo value) =>\n      $_setField(37, value);\n  @$pb.TagNumber(37)\n  $core.bool hasPugvSeasonPrimaryInfo() => $_has(36);\n  @$pb.TagNumber(37)\n  void clearPugvSeasonPrimaryInfo() => $_clearField(37);\n  @$pb.TagNumber(37)\n  PugvSeasonPrimaryInfo ensurePugvSeasonPrimaryInfo() => $_ensure(36);\n\n  @$pb.TagNumber(38)\n  PugvCooperationApplication get pugvCooperationApplication => $_getN(37);\n  @$pb.TagNumber(38)\n  set pugvCooperationApplication(PugvCooperationApplication value) =>\n      $_setField(38, value);\n  @$pb.TagNumber(38)\n  $core.bool hasPugvCooperationApplication() => $_has(37);\n  @$pb.TagNumber(38)\n  void clearPugvCooperationApplication() => $_clearField(38);\n  @$pb.TagNumber(38)\n  PugvCooperationApplication ensurePugvCooperationApplication() => $_ensure(37);\n\n  @$pb.TagNumber(39)\n  UpVideoTool get upVideoTool => $_getN(38);\n  @$pb.TagNumber(39)\n  set upVideoTool(UpVideoTool value) => $_setField(39, value);\n  @$pb.TagNumber(39)\n  $core.bool hasUpVideoTool() => $_has(38);\n  @$pb.TagNumber(39)\n  void clearUpVideoTool() => $_clearField(39);\n  @$pb.TagNumber(39)\n  UpVideoTool ensureUpVideoTool() => $_ensure(38);\n\n  @$pb.TagNumber(40)\n  PugvZone get pugvZone => $_getN(39);\n  @$pb.TagNumber(40)\n  set pugvZone(PugvZone value) => $_setField(40, value);\n  @$pb.TagNumber(40)\n  $core.bool hasPugvZone() => $_has(39);\n  @$pb.TagNumber(40)\n  void clearPugvZone() => $_clearField(40);\n  @$pb.TagNumber(40)\n  PugvZone ensurePugvZone() => $_ensure(39);\n\n  @$pb.TagNumber(41)\n  PugvSeries get pugvSeries => $_getN(40);\n  @$pb.TagNumber(41)\n  set pugvSeries(PugvSeries value) => $_setField(41, value);\n  @$pb.TagNumber(41)\n  $core.bool hasPugvSeries() => $_has(40);\n  @$pb.TagNumber(41)\n  void clearPugvSeries() => $_clearField(41);\n  @$pb.TagNumber(41)\n  PugvSeries ensurePugvSeries() => $_ensure(40);\n\n  @$pb.TagNumber(42)\n  PugvPackage get pugvPackage => $_getN(41);\n  @$pb.TagNumber(42)\n  set pugvPackage(PugvPackage value) => $_setField(42, value);\n  @$pb.TagNumber(42)\n  $core.bool hasPugvPackage() => $_has(41);\n  @$pb.TagNumber(42)\n  void clearPugvPackage() => $_clearField(42);\n  @$pb.TagNumber(42)\n  PugvPackage ensurePugvPackage() => $_ensure(41);\n\n  @$pb.TagNumber(43)\n  ActivityStarRail get activityStarRail => $_getN(42);\n  @$pb.TagNumber(43)\n  set activityStarRail(ActivityStarRail value) => $_setField(43, value);\n  @$pb.TagNumber(43)\n  $core.bool hasActivityStarRail() => $_has(42);\n  @$pb.TagNumber(43)\n  void clearActivityStarRail() => $_clearField(43);\n  @$pb.TagNumber(43)\n  ActivityStarRail ensureActivityStarRail() => $_ensure(42);\n\n  @$pb.TagNumber(44)\n  ActivityIFrame get activityIframe => $_getN(43);\n  @$pb.TagNumber(44)\n  set activityIframe(ActivityIFrame value) => $_setField(44, value);\n  @$pb.TagNumber(44)\n  $core.bool hasActivityIframe() => $_has(43);\n  @$pb.TagNumber(44)\n  void clearActivityIframe() => $_clearField(44);\n  @$pb.TagNumber(44)\n  ActivityIFrame ensureActivityIframe() => $_ensure(43);\n\n  @$pb.TagNumber(45)\n  PlayList get playList => $_getN(44);\n  @$pb.TagNumber(45)\n  set playList(PlayList value) => $_setField(45, value);\n  @$pb.TagNumber(45)\n  $core.bool hasPlayList() => $_has(44);\n  @$pb.TagNumber(45)\n  void clearPlayList() => $_clearField(45);\n  @$pb.TagNumber(45)\n  PlayList ensurePlayList() => $_ensure(44);\n\n  @$pb.TagNumber(46)\n  Merchandise get merchandise => $_getN(45);\n  @$pb.TagNumber(46)\n  set merchandise(Merchandise value) => $_setField(46, value);\n  @$pb.TagNumber(46)\n  $core.bool hasMerchandise() => $_has(45);\n  @$pb.TagNumber(46)\n  void clearMerchandise() => $_clearField(46);\n  @$pb.TagNumber(46)\n  Merchandise ensureMerchandise() => $_ensure(45);\n\n  @$pb.TagNumber(47)\n  ActivityGuidanceBar get activityGuidanceBar => $_getN(46);\n  @$pb.TagNumber(47)\n  set activityGuidanceBar(ActivityGuidanceBar value) => $_setField(47, value);\n  @$pb.TagNumber(47)\n  $core.bool hasActivityGuidanceBar() => $_has(46);\n  @$pb.TagNumber(47)\n  void clearActivityGuidanceBar() => $_clearField(47);\n  @$pb.TagNumber(47)\n  ActivityGuidanceBar ensureActivityGuidanceBar() => $_ensure(46);\n}\n\nclass MultiViewEp extends $pb.GeneratedMessage {\n  factory MultiViewEp({\n    $fixnum.Int64? epId,\n  }) {\n    final result = create();\n    if (epId != null) result.epId = epId;\n    return result;\n  }\n\n  MultiViewEp._();\n\n  factory MultiViewEp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MultiViewEp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MultiViewEp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'epId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MultiViewEp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MultiViewEp copyWith(void Function(MultiViewEp) updates) =>\n      super.copyWith((message) => updates(message as MultiViewEp))\n          as MultiViewEp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MultiViewEp create() => MultiViewEp._();\n  @$core.override\n  MultiViewEp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MultiViewEp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MultiViewEp>(create);\n  static MultiViewEp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get epId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set epId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasEpId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearEpId() => $_clearField(1);\n}\n\nclass Neutral extends $pb.GeneratedMessage {\n  factory Neutral({\n    $core.String? icon,\n    $core.String? title,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (title != null) result.title = title;\n    return result;\n  }\n\n  Neutral._();\n\n  factory Neutral.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Neutral.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Neutral',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Neutral clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Neutral copyWith(void Function(Neutral) updates) =>\n      super.copyWith((message) => updates(message as Neutral)) as Neutral;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Neutral create() => Neutral._();\n  @$core.override\n  Neutral createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Neutral getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Neutral>(create);\n  static Neutral? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n}\n\nclass NewEp extends $pb.GeneratedMessage {\n  factory NewEp({\n    $core.int? id,\n    $core.String? title,\n    $core.String? desc,\n    $core.int? isNew,\n    $core.String? more,\n    $core.String? cover,\n    $core.String? indexShow,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (title != null) result.title = title;\n    if (desc != null) result.desc = desc;\n    if (isNew != null) result.isNew = isNew;\n    if (more != null) result.more = more;\n    if (cover != null) result.cover = cover;\n    if (indexShow != null) result.indexShow = indexShow;\n    return result;\n  }\n\n  NewEp._();\n\n  factory NewEp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory NewEp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'NewEp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'desc')\n    ..aI(4, _omitFieldNames ? '' : 'isNew')\n    ..aOS(5, _omitFieldNames ? '' : 'more')\n    ..aOS(6, _omitFieldNames ? '' : 'cover')\n    ..aOS(7, _omitFieldNames ? '' : 'indexShow')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NewEp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NewEp copyWith(void Function(NewEp) updates) =>\n      super.copyWith((message) => updates(message as NewEp)) as NewEp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static NewEp create() => NewEp._();\n  @$core.override\n  NewEp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static NewEp getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<NewEp>(create);\n  static NewEp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get id => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set id($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get desc => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set desc($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDesc() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDesc() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get isNew => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set isNew($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIsNew() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIsNew() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get more => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set more($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasMore() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearMore() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get cover => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set cover($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCover() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCover() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get indexShow => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set indexShow($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasIndexShow() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearIndexShow() => $_clearField(7);\n}\n\nclass OfficialVerify extends $pb.GeneratedMessage {\n  factory OfficialVerify({\n    $core.int? type,\n    $core.String? desc,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (desc != null) result.desc = desc;\n    return result;\n  }\n\n  OfficialVerify._();\n\n  factory OfficialVerify.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OfficialVerify.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OfficialVerify',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'type')\n    ..aOS(2, _omitFieldNames ? '' : 'desc')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OfficialVerify clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OfficialVerify copyWith(void Function(OfficialVerify) updates) =>\n      super.copyWith((message) => updates(message as OfficialVerify))\n          as OfficialVerify;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OfficialVerify create() => OfficialVerify._();\n  @$core.override\n  OfficialVerify createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OfficialVerify getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OfficialVerify>(create);\n  static OfficialVerify? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get type => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set type($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get desc => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set desc($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDesc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDesc() => $_clearField(2);\n}\n\nclass OgvIntroduction extends $pb.GeneratedMessage {\n  factory OgvIntroduction({\n    $core.String? followers,\n    $core.String? score,\n    StatInfo? playData,\n    $core.String? scoreColor,\n    $core.String? scoreNightColor,\n    $core.String? textColor,\n    $core.String? textNightColor,\n  }) {\n    final result = create();\n    if (followers != null) result.followers = followers;\n    if (score != null) result.score = score;\n    if (playData != null) result.playData = playData;\n    if (scoreColor != null) result.scoreColor = scoreColor;\n    if (scoreNightColor != null) result.scoreNightColor = scoreNightColor;\n    if (textColor != null) result.textColor = textColor;\n    if (textNightColor != null) result.textNightColor = textNightColor;\n    return result;\n  }\n\n  OgvIntroduction._();\n\n  factory OgvIntroduction.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OgvIntroduction.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OgvIntroduction',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'followers')\n    ..aOS(2, _omitFieldNames ? '' : 'score')\n    ..aOM<StatInfo>(3, _omitFieldNames ? '' : 'playData',\n        subBuilder: StatInfo.create)\n    ..aOS(4, _omitFieldNames ? '' : 'scoreColor')\n    ..aOS(5, _omitFieldNames ? '' : 'scoreNightColor')\n    ..aOS(6, _omitFieldNames ? '' : 'textColor')\n    ..aOS(7, _omitFieldNames ? '' : 'textNightColor')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OgvIntroduction clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OgvIntroduction copyWith(void Function(OgvIntroduction) updates) =>\n      super.copyWith((message) => updates(message as OgvIntroduction))\n          as OgvIntroduction;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OgvIntroduction create() => OgvIntroduction._();\n  @$core.override\n  OgvIntroduction createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OgvIntroduction getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OgvIntroduction>(create);\n  static OgvIntroduction? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get followers => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set followers($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFollowers() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFollowers() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get score => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set score($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasScore() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearScore() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  StatInfo get playData => $_getN(2);\n  @$pb.TagNumber(3)\n  set playData(StatInfo value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPlayData() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPlayData() => $_clearField(3);\n  @$pb.TagNumber(3)\n  StatInfo ensurePlayData() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.String get scoreColor => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set scoreColor($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasScoreColor() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearScoreColor() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get scoreNightColor => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set scoreNightColor($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasScoreNightColor() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearScoreNightColor() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get textColor => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set textColor($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasTextColor() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearTextColor() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get textNightColor => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set textNightColor($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasTextNightColor() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearTextNightColor() => $_clearField(7);\n}\n\nclass OgvLiveReserve extends $pb.GeneratedMessage {\n  factory OgvLiveReserve({\n    $fixnum.Int64? reserveId,\n    $core.String? title,\n    $core.String? icon,\n    $core.String? nightIcon,\n    $core.String? clickButton,\n    $core.String? link,\n    $core.int? followVideoIsReserveLive,\n    $core.String? bgColor,\n    $core.String? nightBgColor,\n    $core.String? textColor,\n    $core.String? nightTextColor,\n    $core.String? btBgColor,\n    $core.String? btFrameColor,\n    $core.String? nightBtBgColor,\n    $core.String? nightBtFrameColor,\n    $core.int? activeType,\n    $core.int? reserveStatus,\n    $core.String? btTextColor,\n    $core.String? nightBtTextColor,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? report,\n    $core.int? liveStatus,\n  }) {\n    final result = create();\n    if (reserveId != null) result.reserveId = reserveId;\n    if (title != null) result.title = title;\n    if (icon != null) result.icon = icon;\n    if (nightIcon != null) result.nightIcon = nightIcon;\n    if (clickButton != null) result.clickButton = clickButton;\n    if (link != null) result.link = link;\n    if (followVideoIsReserveLive != null)\n      result.followVideoIsReserveLive = followVideoIsReserveLive;\n    if (bgColor != null) result.bgColor = bgColor;\n    if (nightBgColor != null) result.nightBgColor = nightBgColor;\n    if (textColor != null) result.textColor = textColor;\n    if (nightTextColor != null) result.nightTextColor = nightTextColor;\n    if (btBgColor != null) result.btBgColor = btBgColor;\n    if (btFrameColor != null) result.btFrameColor = btFrameColor;\n    if (nightBtBgColor != null) result.nightBtBgColor = nightBtBgColor;\n    if (nightBtFrameColor != null) result.nightBtFrameColor = nightBtFrameColor;\n    if (activeType != null) result.activeType = activeType;\n    if (reserveStatus != null) result.reserveStatus = reserveStatus;\n    if (btTextColor != null) result.btTextColor = btTextColor;\n    if (nightBtTextColor != null) result.nightBtTextColor = nightBtTextColor;\n    if (report != null) result.report.addEntries(report);\n    if (liveStatus != null) result.liveStatus = liveStatus;\n    return result;\n  }\n\n  OgvLiveReserve._();\n\n  factory OgvLiveReserve.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OgvLiveReserve.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OgvLiveReserve',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'reserveId')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'icon')\n    ..aOS(4, _omitFieldNames ? '' : 'nightIcon')\n    ..aOS(5, _omitFieldNames ? '' : 'clickButton')\n    ..aOS(6, _omitFieldNames ? '' : 'link')\n    ..aI(7, _omitFieldNames ? '' : 'followVideoIsReserveLive')\n    ..aOS(8, _omitFieldNames ? '' : 'bgColor')\n    ..aOS(9, _omitFieldNames ? '' : 'nightBgColor')\n    ..aOS(10, _omitFieldNames ? '' : 'textColor')\n    ..aOS(11, _omitFieldNames ? '' : 'nightTextColor')\n    ..aOS(12, _omitFieldNames ? '' : 'btBgColor')\n    ..aOS(13, _omitFieldNames ? '' : 'btFrameColor')\n    ..aOS(14, _omitFieldNames ? '' : 'nightBtBgColor')\n    ..aOS(15, _omitFieldNames ? '' : 'nightBtFrameColor')\n    ..aI(16, _omitFieldNames ? '' : 'activeType')\n    ..aI(17, _omitFieldNames ? '' : 'reserveStatus')\n    ..aOS(18, _omitFieldNames ? '' : 'btTextColor')\n    ..aOS(19, _omitFieldNames ? '' : 'nightBtTextColor')\n    ..m<$core.String, $core.String>(20, _omitFieldNames ? '' : 'report',\n        entryClassName: 'OgvLiveReserve.ReportEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.viewunite.common'))\n    ..aI(21, _omitFieldNames ? '' : 'liveStatus')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OgvLiveReserve clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OgvLiveReserve copyWith(void Function(OgvLiveReserve) updates) =>\n      super.copyWith((message) => updates(message as OgvLiveReserve))\n          as OgvLiveReserve;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OgvLiveReserve create() => OgvLiveReserve._();\n  @$core.override\n  OgvLiveReserve createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OgvLiveReserve getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OgvLiveReserve>(create);\n  static OgvLiveReserve? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get reserveId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set reserveId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasReserveId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearReserveId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get icon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set icon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIcon() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get nightIcon => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set nightIcon($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasNightIcon() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearNightIcon() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get clickButton => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set clickButton($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasClickButton() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearClickButton() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get link => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set link($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasLink() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearLink() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get followVideoIsReserveLive => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set followVideoIsReserveLive($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasFollowVideoIsReserveLive() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearFollowVideoIsReserveLive() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get bgColor => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set bgColor($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasBgColor() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearBgColor() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get nightBgColor => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set nightBgColor($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasNightBgColor() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearNightBgColor() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get textColor => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set textColor($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasTextColor() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearTextColor() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get nightTextColor => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set nightTextColor($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasNightTextColor() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearNightTextColor() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get btBgColor => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set btBgColor($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasBtBgColor() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearBtBgColor() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.String get btFrameColor => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set btFrameColor($core.String value) => $_setString(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasBtFrameColor() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearBtFrameColor() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.String get nightBtBgColor => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set nightBtBgColor($core.String value) => $_setString(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasNightBtBgColor() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearNightBtBgColor() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $core.String get nightBtFrameColor => $_getSZ(14);\n  @$pb.TagNumber(15)\n  set nightBtFrameColor($core.String value) => $_setString(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasNightBtFrameColor() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearNightBtFrameColor() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $core.int get activeType => $_getIZ(15);\n  @$pb.TagNumber(16)\n  set activeType($core.int value) => $_setSignedInt32(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasActiveType() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearActiveType() => $_clearField(16);\n\n  @$pb.TagNumber(17)\n  $core.int get reserveStatus => $_getIZ(16);\n  @$pb.TagNumber(17)\n  set reserveStatus($core.int value) => $_setSignedInt32(16, value);\n  @$pb.TagNumber(17)\n  $core.bool hasReserveStatus() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearReserveStatus() => $_clearField(17);\n\n  @$pb.TagNumber(18)\n  $core.String get btTextColor => $_getSZ(17);\n  @$pb.TagNumber(18)\n  set btTextColor($core.String value) => $_setString(17, value);\n  @$pb.TagNumber(18)\n  $core.bool hasBtTextColor() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearBtTextColor() => $_clearField(18);\n\n  @$pb.TagNumber(19)\n  $core.String get nightBtTextColor => $_getSZ(18);\n  @$pb.TagNumber(19)\n  set nightBtTextColor($core.String value) => $_setString(18, value);\n  @$pb.TagNumber(19)\n  $core.bool hasNightBtTextColor() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearNightBtTextColor() => $_clearField(19);\n\n  @$pb.TagNumber(20)\n  $pb.PbMap<$core.String, $core.String> get report => $_getMap(19);\n\n  @$pb.TagNumber(21)\n  $core.int get liveStatus => $_getIZ(20);\n  @$pb.TagNumber(21)\n  set liveStatus($core.int value) => $_setSignedInt32(20, value);\n  @$pb.TagNumber(21)\n  $core.bool hasLiveStatus() => $_has(20);\n  @$pb.TagNumber(21)\n  void clearLiveStatus() => $_clearField(21);\n}\n\nclass OgvSeasons extends $pb.GeneratedMessage {\n  factory OgvSeasons({\n    $core.String? title,\n    $core.Iterable<SerialSeason>? serialSeason,\n    SerialSeasonCoverStyle? style,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (serialSeason != null) result.serialSeason.addAll(serialSeason);\n    if (style != null) result.style = style;\n    return result;\n  }\n\n  OgvSeasons._();\n\n  factory OgvSeasons.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OgvSeasons.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OgvSeasons',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..pPM<SerialSeason>(2, _omitFieldNames ? '' : 'serialSeason',\n        subBuilder: SerialSeason.create)\n    ..aE<SerialSeasonCoverStyle>(3, _omitFieldNames ? '' : 'style',\n        enumValues: SerialSeasonCoverStyle.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OgvSeasons clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OgvSeasons copyWith(void Function(OgvSeasons) updates) =>\n      super.copyWith((message) => updates(message as OgvSeasons)) as OgvSeasons;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OgvSeasons create() => OgvSeasons._();\n  @$core.override\n  OgvSeasons createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OgvSeasons getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OgvSeasons>(create);\n  static OgvSeasons? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<SerialSeason> get serialSeason => $_getList(1);\n\n  @$pb.TagNumber(3)\n  SerialSeasonCoverStyle get style => $_getN(2);\n  @$pb.TagNumber(3)\n  set style(SerialSeasonCoverStyle value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasStyle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearStyle() => $_clearField(3);\n}\n\nclass OgvTitle extends $pb.GeneratedMessage {\n  factory OgvTitle({\n    $core.String? title,\n    BadgeInfo? badgeInfo,\n    $core.int? isShowBtnAnimation,\n    $core.int? followVideoIsReserveLive,\n    $fixnum.Int64? reserveId,\n    TitleDeliveryButton? titleDeliveryButton,\n    TitleDeliveryButton? channelRedirectEntryButton,\n    $core.String? titleImg,\n    $core.String? titleImgNight,\n    $core.int? webpDynamicPicTitleCycleNum,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (badgeInfo != null) result.badgeInfo = badgeInfo;\n    if (isShowBtnAnimation != null)\n      result.isShowBtnAnimation = isShowBtnAnimation;\n    if (followVideoIsReserveLive != null)\n      result.followVideoIsReserveLive = followVideoIsReserveLive;\n    if (reserveId != null) result.reserveId = reserveId;\n    if (titleDeliveryButton != null)\n      result.titleDeliveryButton = titleDeliveryButton;\n    if (channelRedirectEntryButton != null)\n      result.channelRedirectEntryButton = channelRedirectEntryButton;\n    if (titleImg != null) result.titleImg = titleImg;\n    if (titleImgNight != null) result.titleImgNight = titleImgNight;\n    if (webpDynamicPicTitleCycleNum != null)\n      result.webpDynamicPicTitleCycleNum = webpDynamicPicTitleCycleNum;\n    return result;\n  }\n\n  OgvTitle._();\n\n  factory OgvTitle.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OgvTitle.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OgvTitle',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOM<BadgeInfo>(2, _omitFieldNames ? '' : 'badgeInfo',\n        subBuilder: BadgeInfo.create)\n    ..aI(3, _omitFieldNames ? '' : 'isShowBtnAnimation')\n    ..aI(4, _omitFieldNames ? '' : 'followVideoIsReserveLive')\n    ..aInt64(5, _omitFieldNames ? '' : 'reserveId')\n    ..aOM<TitleDeliveryButton>(6, _omitFieldNames ? '' : 'titleDeliveryButton',\n        subBuilder: TitleDeliveryButton.create)\n    ..aOM<TitleDeliveryButton>(\n        7, _omitFieldNames ? '' : 'channelRedirectEntryButton',\n        subBuilder: TitleDeliveryButton.create)\n    ..aOS(8, _omitFieldNames ? '' : 'titleImg')\n    ..aOS(9, _omitFieldNames ? '' : 'titleImgNight')\n    ..aI(10, _omitFieldNames ? '' : 'webpDynamicPicTitleCycleNum')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OgvTitle clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OgvTitle copyWith(void Function(OgvTitle) updates) =>\n      super.copyWith((message) => updates(message as OgvTitle)) as OgvTitle;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OgvTitle create() => OgvTitle._();\n  @$core.override\n  OgvTitle createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OgvTitle getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<OgvTitle>(create);\n  static OgvTitle? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  BadgeInfo get badgeInfo => $_getN(1);\n  @$pb.TagNumber(2)\n  set badgeInfo(BadgeInfo value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBadgeInfo() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBadgeInfo() => $_clearField(2);\n  @$pb.TagNumber(2)\n  BadgeInfo ensureBadgeInfo() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.int get isShowBtnAnimation => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set isShowBtnAnimation($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIsShowBtnAnimation() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIsShowBtnAnimation() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get followVideoIsReserveLive => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set followVideoIsReserveLive($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFollowVideoIsReserveLive() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFollowVideoIsReserveLive() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get reserveId => $_getI64(4);\n  @$pb.TagNumber(5)\n  set reserveId($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasReserveId() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearReserveId() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  TitleDeliveryButton get titleDeliveryButton => $_getN(5);\n  @$pb.TagNumber(6)\n  set titleDeliveryButton(TitleDeliveryButton value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasTitleDeliveryButton() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearTitleDeliveryButton() => $_clearField(6);\n  @$pb.TagNumber(6)\n  TitleDeliveryButton ensureTitleDeliveryButton() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  TitleDeliveryButton get channelRedirectEntryButton => $_getN(6);\n  @$pb.TagNumber(7)\n  set channelRedirectEntryButton(TitleDeliveryButton value) =>\n      $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasChannelRedirectEntryButton() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearChannelRedirectEntryButton() => $_clearField(7);\n  @$pb.TagNumber(7)\n  TitleDeliveryButton ensureChannelRedirectEntryButton() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  $core.String get titleImg => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set titleImg($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasTitleImg() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearTitleImg() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get titleImgNight => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set titleImgNight($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasTitleImgNight() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearTitleImgNight() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.int get webpDynamicPicTitleCycleNum => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set webpDynamicPicTitleCycleNum($core.int value) =>\n      $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasWebpDynamicPicTitleCycleNum() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearWebpDynamicPicTitleCycleNum() => $_clearField(10);\n}\n\nclass OperateAction extends $pb.GeneratedMessage {\n  factory OperateAction({\n    $core.String? action,\n    $core.String? link,\n  }) {\n    final result = create();\n    if (action != null) result.action = action;\n    if (link != null) result.link = link;\n    return result;\n  }\n\n  OperateAction._();\n\n  factory OperateAction.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OperateAction.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OperateAction',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'action')\n    ..aOS(2, _omitFieldNames ? '' : 'link')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OperateAction clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OperateAction copyWith(void Function(OperateAction) updates) =>\n      super.copyWith((message) => updates(message as OperateAction))\n          as OperateAction;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OperateAction create() => OperateAction._();\n  @$core.override\n  OperateAction createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OperateAction getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OperateAction>(create);\n  static OperateAction? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get action => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set action($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAction() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAction() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get link => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set link($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLink() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLink() => $_clearField(2);\n}\n\nclass Owner extends $pb.GeneratedMessage {\n  factory Owner({\n    $1.AvatarItem? avatar,\n    $core.String? url,\n    $core.String? title,\n    $core.String? fans,\n    $core.String? arcCount,\n    AttentionRelationStatus? attention,\n    AttentionRelationStatus? attentionRelation,\n    $core.String? pubLocation,\n    Vip? vip,\n    $core.String? titleUrl,\n    $core.String? face,\n    $fixnum.Int64? mid,\n    OfficialVerify? officialVerify,\n    Live? live,\n    $fixnum.Int64? fansNum,\n    $core.Iterable<$fixnum.Int64>? assists,\n    $core.String? seasonCount,\n    $2.NameRender? nameRender,\n  }) {\n    final result = create();\n    if (avatar != null) result.avatar = avatar;\n    if (url != null) result.url = url;\n    if (title != null) result.title = title;\n    if (fans != null) result.fans = fans;\n    if (arcCount != null) result.arcCount = arcCount;\n    if (attention != null) result.attention = attention;\n    if (attentionRelation != null) result.attentionRelation = attentionRelation;\n    if (pubLocation != null) result.pubLocation = pubLocation;\n    if (vip != null) result.vip = vip;\n    if (titleUrl != null) result.titleUrl = titleUrl;\n    if (face != null) result.face = face;\n    if (mid != null) result.mid = mid;\n    if (officialVerify != null) result.officialVerify = officialVerify;\n    if (live != null) result.live = live;\n    if (fansNum != null) result.fansNum = fansNum;\n    if (assists != null) result.assists.addAll(assists);\n    if (seasonCount != null) result.seasonCount = seasonCount;\n    if (nameRender != null) result.nameRender = nameRender;\n    return result;\n  }\n\n  Owner._();\n\n  factory Owner.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Owner.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Owner',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOM<$1.AvatarItem>(1, _omitFieldNames ? '' : 'avatar',\n        subBuilder: $1.AvatarItem.create)\n    ..aOS(2, _omitFieldNames ? '' : 'url')\n    ..aOS(3, _omitFieldNames ? '' : 'title')\n    ..aOS(4, _omitFieldNames ? '' : 'fans')\n    ..aOS(5, _omitFieldNames ? '' : 'arcCount')\n    ..aE<AttentionRelationStatus>(6, _omitFieldNames ? '' : 'attention',\n        enumValues: AttentionRelationStatus.values)\n    ..aE<AttentionRelationStatus>(7, _omitFieldNames ? '' : 'attentionRelation',\n        enumValues: AttentionRelationStatus.values)\n    ..aOS(8, _omitFieldNames ? '' : 'pubLocation')\n    ..aOM<Vip>(9, _omitFieldNames ? '' : 'vip', subBuilder: Vip.create)\n    ..aOS(10, _omitFieldNames ? '' : 'titleUrl')\n    ..aOS(11, _omitFieldNames ? '' : 'face')\n    ..aInt64(12, _omitFieldNames ? '' : 'mid')\n    ..aOM<OfficialVerify>(13, _omitFieldNames ? '' : 'officialVerify',\n        subBuilder: OfficialVerify.create)\n    ..aOM<Live>(14, _omitFieldNames ? '' : 'live', subBuilder: Live.create)\n    ..aInt64(15, _omitFieldNames ? '' : 'fansNum')\n    ..p<$fixnum.Int64>(16, _omitFieldNames ? '' : 'assists', $pb.PbFieldType.K6)\n    ..aOS(17, _omitFieldNames ? '' : 'seasonCount')\n    ..aOM<$2.NameRender>(18, _omitFieldNames ? '' : 'nameRender',\n        subBuilder: $2.NameRender.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Owner clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Owner copyWith(void Function(Owner) updates) =>\n      super.copyWith((message) => updates(message as Owner)) as Owner;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Owner create() => Owner._();\n  @$core.override\n  Owner createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Owner getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Owner>(create);\n  static Owner? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $1.AvatarItem get avatar => $_getN(0);\n  @$pb.TagNumber(1)\n  set avatar($1.AvatarItem value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAvatar() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAvatar() => $_clearField(1);\n  @$pb.TagNumber(1)\n  $1.AvatarItem ensureAvatar() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get url => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set url($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUrl() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get title => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set title($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get fans => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set fans($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFans() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFans() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get arcCount => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set arcCount($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasArcCount() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearArcCount() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  AttentionRelationStatus get attention => $_getN(5);\n  @$pb.TagNumber(6)\n  set attention(AttentionRelationStatus value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasAttention() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearAttention() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  AttentionRelationStatus get attentionRelation => $_getN(6);\n  @$pb.TagNumber(7)\n  set attentionRelation(AttentionRelationStatus value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasAttentionRelation() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearAttentionRelation() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get pubLocation => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set pubLocation($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasPubLocation() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearPubLocation() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  Vip get vip => $_getN(8);\n  @$pb.TagNumber(9)\n  set vip(Vip value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasVip() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearVip() => $_clearField(9);\n  @$pb.TagNumber(9)\n  Vip ensureVip() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  $core.String get titleUrl => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set titleUrl($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasTitleUrl() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearTitleUrl() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get face => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set face($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasFace() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearFace() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $fixnum.Int64 get mid => $_getI64(11);\n  @$pb.TagNumber(12)\n  set mid($fixnum.Int64 value) => $_setInt64(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasMid() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearMid() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  OfficialVerify get officialVerify => $_getN(12);\n  @$pb.TagNumber(13)\n  set officialVerify(OfficialVerify value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasOfficialVerify() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearOfficialVerify() => $_clearField(13);\n  @$pb.TagNumber(13)\n  OfficialVerify ensureOfficialVerify() => $_ensure(12);\n\n  @$pb.TagNumber(14)\n  Live get live => $_getN(13);\n  @$pb.TagNumber(14)\n  set live(Live value) => $_setField(14, value);\n  @$pb.TagNumber(14)\n  $core.bool hasLive() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearLive() => $_clearField(14);\n  @$pb.TagNumber(14)\n  Live ensureLive() => $_ensure(13);\n\n  @$pb.TagNumber(15)\n  $fixnum.Int64 get fansNum => $_getI64(14);\n  @$pb.TagNumber(15)\n  set fansNum($fixnum.Int64 value) => $_setInt64(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasFansNum() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearFansNum() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $pb.PbList<$fixnum.Int64> get assists => $_getList(15);\n\n  @$pb.TagNumber(17)\n  $core.String get seasonCount => $_getSZ(16);\n  @$pb.TagNumber(17)\n  set seasonCount($core.String value) => $_setString(16, value);\n  @$pb.TagNumber(17)\n  $core.bool hasSeasonCount() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearSeasonCount() => $_clearField(17);\n\n  @$pb.TagNumber(18)\n  $2.NameRender get nameRender => $_getN(17);\n  @$pb.TagNumber(18)\n  set nameRender($2.NameRender value) => $_setField(18, value);\n  @$pb.TagNumber(18)\n  $core.bool hasNameRender() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearNameRender() => $_clearField(18);\n  @$pb.TagNumber(18)\n  $2.NameRender ensureNameRender() => $_ensure(17);\n}\n\nclass Page extends $pb.GeneratedMessage {\n  factory Page({\n    $fixnum.Int64? cid,\n    $core.String? part,\n    $fixnum.Int64? duration,\n    $core.String? desc,\n    Dimension? dimension,\n    $core.String? dlTitle,\n    $core.String? dlSubtitle,\n  }) {\n    final result = create();\n    if (cid != null) result.cid = cid;\n    if (part != null) result.part = part;\n    if (duration != null) result.duration = duration;\n    if (desc != null) result.desc = desc;\n    if (dimension != null) result.dimension = dimension;\n    if (dlTitle != null) result.dlTitle = dlTitle;\n    if (dlSubtitle != null) result.dlSubtitle = dlSubtitle;\n    return result;\n  }\n\n  Page._();\n\n  factory Page.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Page.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Page',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'cid')\n    ..aOS(2, _omitFieldNames ? '' : 'part')\n    ..aInt64(3, _omitFieldNames ? '' : 'duration')\n    ..aOS(4, _omitFieldNames ? '' : 'desc')\n    ..aOM<Dimension>(5, _omitFieldNames ? '' : 'dimension',\n        subBuilder: Dimension.create)\n    ..aOS(6, _omitFieldNames ? '' : 'dlTitle')\n    ..aOS(7, _omitFieldNames ? '' : 'dlSubtitle')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Page clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Page copyWith(void Function(Page) updates) =>\n      super.copyWith((message) => updates(message as Page)) as Page;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Page create() => Page._();\n  @$core.override\n  Page createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Page getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Page>(create);\n  static Page? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get cid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set cid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get part => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set part($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPart() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPart() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get duration => $_getI64(2);\n  @$pb.TagNumber(3)\n  set duration($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDuration() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDuration() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get desc => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set desc($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDesc() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDesc() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  Dimension get dimension => $_getN(4);\n  @$pb.TagNumber(5)\n  set dimension(Dimension value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDimension() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDimension() => $_clearField(5);\n  @$pb.TagNumber(5)\n  Dimension ensureDimension() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.String get dlTitle => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set dlTitle($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasDlTitle() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearDlTitle() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get dlSubtitle => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set dlSubtitle($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasDlSubtitle() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearDlSubtitle() => $_clearField(7);\n}\n\nclass Pendant extends $pb.GeneratedMessage {\n  factory Pendant({\n    $core.int? pid,\n    $core.String? name,\n    $core.String? image,\n  }) {\n    final result = create();\n    if (pid != null) result.pid = pid;\n    if (name != null) result.name = name;\n    if (image != null) result.image = image;\n    return result;\n  }\n\n  Pendant._();\n\n  factory Pendant.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Pendant.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Pendant',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'pid')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'image')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Pendant clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Pendant copyWith(void Function(Pendant) updates) =>\n      super.copyWith((message) => updates(message as Pendant)) as Pendant;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Pendant create() => Pendant._();\n  @$core.override\n  Pendant createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Pendant getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Pendant>(create);\n  static Pendant? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get pid => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set pid($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get image => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set image($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasImage() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearImage() => $_clearField(3);\n}\n\nclass PlayList extends $pb.GeneratedMessage {\n  factory PlayList({\n    $core.int? id,\n    $core.String? title,\n    Owner? upper,\n    $core.String? desc,\n    $core.String? moreTitle,\n    $core.Iterable<PlayListSeason>? seasons,\n    $core.bool? morePlaylist,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? report,\n    $core.String? morePlaylistUrl,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (title != null) result.title = title;\n    if (upper != null) result.upper = upper;\n    if (desc != null) result.desc = desc;\n    if (moreTitle != null) result.moreTitle = moreTitle;\n    if (seasons != null) result.seasons.addAll(seasons);\n    if (morePlaylist != null) result.morePlaylist = morePlaylist;\n    if (report != null) result.report.addEntries(report);\n    if (morePlaylistUrl != null) result.morePlaylistUrl = morePlaylistUrl;\n    return result;\n  }\n\n  PlayList._();\n\n  factory PlayList.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayList.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayList',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOM<Owner>(3, _omitFieldNames ? '' : 'upper', subBuilder: Owner.create)\n    ..aOS(4, _omitFieldNames ? '' : 'desc')\n    ..aOS(5, _omitFieldNames ? '' : 'moreTitle')\n    ..pPM<PlayListSeason>(6, _omitFieldNames ? '' : 'seasons',\n        subBuilder: PlayListSeason.create)\n    ..aOB(7, _omitFieldNames ? '' : 'morePlaylist')\n    ..m<$core.String, $core.String>(8, _omitFieldNames ? '' : 'report',\n        entryClassName: 'PlayList.ReportEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.viewunite.common'))\n    ..aOS(9, _omitFieldNames ? '' : 'morePlaylistUrl')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayList clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayList copyWith(void Function(PlayList) updates) =>\n      super.copyWith((message) => updates(message as PlayList)) as PlayList;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayList create() => PlayList._();\n  @$core.override\n  PlayList createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayList getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PlayList>(create);\n  static PlayList? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get id => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set id($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  Owner get upper => $_getN(2);\n  @$pb.TagNumber(3)\n  set upper(Owner value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUpper() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUpper() => $_clearField(3);\n  @$pb.TagNumber(3)\n  Owner ensureUpper() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.String get desc => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set desc($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDesc() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDesc() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get moreTitle => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set moreTitle($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasMoreTitle() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearMoreTitle() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $pb.PbList<PlayListSeason> get seasons => $_getList(5);\n\n  @$pb.TagNumber(7)\n  $core.bool get morePlaylist => $_getBF(6);\n  @$pb.TagNumber(7)\n  set morePlaylist($core.bool value) => $_setBool(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasMorePlaylist() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearMorePlaylist() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $pb.PbMap<$core.String, $core.String> get report => $_getMap(7);\n\n  @$pb.TagNumber(9)\n  $core.String get morePlaylistUrl => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set morePlaylistUrl($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasMorePlaylistUrl() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearMorePlaylistUrl() => $_clearField(9);\n}\n\nclass PlayListSeason extends $pb.GeneratedMessage {\n  factory PlayListSeason({\n    $core.int? seasonId,\n    $core.String? title,\n    $core.String? subtitle,\n    $core.String? cover,\n    $core.String? link,\n    $core.String? score,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? report,\n  }) {\n    final result = create();\n    if (seasonId != null) result.seasonId = seasonId;\n    if (title != null) result.title = title;\n    if (subtitle != null) result.subtitle = subtitle;\n    if (cover != null) result.cover = cover;\n    if (link != null) result.link = link;\n    if (score != null) result.score = score;\n    if (report != null) result.report.addEntries(report);\n    return result;\n  }\n\n  PlayListSeason._();\n\n  factory PlayListSeason.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayListSeason.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayListSeason',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'seasonId')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'subtitle')\n    ..aOS(4, _omitFieldNames ? '' : 'cover')\n    ..aOS(5, _omitFieldNames ? '' : 'link')\n    ..aOS(6, _omitFieldNames ? '' : 'score')\n    ..m<$core.String, $core.String>(7, _omitFieldNames ? '' : 'report',\n        entryClassName: 'PlayListSeason.ReportEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.viewunite.common'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayListSeason clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayListSeason copyWith(void Function(PlayListSeason) updates) =>\n      super.copyWith((message) => updates(message as PlayListSeason))\n          as PlayListSeason;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayListSeason create() => PlayListSeason._();\n  @$core.override\n  PlayListSeason createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayListSeason getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayListSeason>(create);\n  static PlayListSeason? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get seasonId => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set seasonId($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSeasonId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSeasonId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get subtitle => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set subtitle($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSubtitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSubtitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get cover => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set cover($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCover() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCover() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get link => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set link($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasLink() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearLink() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get score => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set score($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasScore() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearScore() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $pb.PbMap<$core.String, $core.String> get report => $_getMap(6);\n}\n\nclass PlayerAnimation extends $pb.GeneratedMessage {\n  factory PlayerAnimation({\n    $core.String? playerIcon,\n    $core.String? playerTripleIcon,\n  }) {\n    final result = create();\n    if (playerIcon != null) result.playerIcon = playerIcon;\n    if (playerTripleIcon != null) result.playerTripleIcon = playerTripleIcon;\n    return result;\n  }\n\n  PlayerAnimation._();\n\n  factory PlayerAnimation.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayerAnimation.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayerAnimation',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'playerIcon')\n    ..aOS(2, _omitFieldNames ? '' : 'playerTripleIcon')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerAnimation clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerAnimation copyWith(void Function(PlayerAnimation) updates) =>\n      super.copyWith((message) => updates(message as PlayerAnimation))\n          as PlayerAnimation;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayerAnimation create() => PlayerAnimation._();\n  @$core.override\n  PlayerAnimation createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayerAnimation getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayerAnimation>(create);\n  static PlayerAnimation? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get playerIcon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set playerIcon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPlayerIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPlayerIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get playerTripleIcon => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set playerTripleIcon($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPlayerTripleIcon() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPlayerTripleIcon() => $_clearField(2);\n}\n\nclass PointActivity extends $pb.GeneratedMessage {\n  factory PointActivity({\n    $core.String? tip,\n    $core.String? content,\n    $core.String? link,\n  }) {\n    final result = create();\n    if (tip != null) result.tip = tip;\n    if (content != null) result.content = content;\n    if (link != null) result.link = link;\n    return result;\n  }\n\n  PointActivity._();\n\n  factory PointActivity.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PointActivity.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PointActivity',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'tip')\n    ..aOS(2, _omitFieldNames ? '' : 'content')\n    ..aOS(3, _omitFieldNames ? '' : 'link')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PointActivity clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PointActivity copyWith(void Function(PointActivity) updates) =>\n      super.copyWith((message) => updates(message as PointActivity))\n          as PointActivity;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PointActivity create() => PointActivity._();\n  @$core.override\n  PointActivity createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PointActivity getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PointActivity>(create);\n  static PointActivity? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get tip => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set tip($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTip() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTip() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get content => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set content($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasContent() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearContent() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get link => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set link($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLink() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLink() => $_clearField(3);\n}\n\nclass PowerIconStyle extends $pb.GeneratedMessage {\n  factory PowerIconStyle({\n    $core.String? iconUrl,\n    $core.String? iconNightUrl,\n    $fixnum.Int64? iconWidth,\n    $fixnum.Int64? iconHeight,\n  }) {\n    final result = create();\n    if (iconUrl != null) result.iconUrl = iconUrl;\n    if (iconNightUrl != null) result.iconNightUrl = iconNightUrl;\n    if (iconWidth != null) result.iconWidth = iconWidth;\n    if (iconHeight != null) result.iconHeight = iconHeight;\n    return result;\n  }\n\n  PowerIconStyle._();\n\n  factory PowerIconStyle.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PowerIconStyle.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PowerIconStyle',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'iconUrl')\n    ..aOS(2, _omitFieldNames ? '' : 'iconNightUrl')\n    ..aInt64(3, _omitFieldNames ? '' : 'iconWidth')\n    ..aInt64(4, _omitFieldNames ? '' : 'iconHeight')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PowerIconStyle clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PowerIconStyle copyWith(void Function(PowerIconStyle) updates) =>\n      super.copyWith((message) => updates(message as PowerIconStyle))\n          as PowerIconStyle;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PowerIconStyle create() => PowerIconStyle._();\n  @$core.override\n  PowerIconStyle createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PowerIconStyle getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PowerIconStyle>(create);\n  static PowerIconStyle? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get iconUrl => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set iconUrl($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIconUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIconUrl() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get iconNightUrl => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set iconNightUrl($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIconNightUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIconNightUrl() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get iconWidth => $_getI64(2);\n  @$pb.TagNumber(3)\n  set iconWidth($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIconWidth() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIconWidth() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get iconHeight => $_getI64(3);\n  @$pb.TagNumber(4)\n  set iconHeight($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIconHeight() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIconHeight() => $_clearField(4);\n}\n\nclass ProfessionApproval extends $pb.GeneratedMessage {\n  factory ProfessionApproval({\n    $core.String? title,\n    $core.String? subtitle,\n    $core.int? type,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (subtitle != null) result.subtitle = subtitle;\n    if (type != null) result.type = type;\n    return result;\n  }\n\n  ProfessionApproval._();\n\n  factory ProfessionApproval.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ProfessionApproval.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ProfessionApproval',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'subtitle')\n    ..aI(3, _omitFieldNames ? '' : 'type')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ProfessionApproval clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ProfessionApproval copyWith(void Function(ProfessionApproval) updates) =>\n      super.copyWith((message) => updates(message as ProfessionApproval))\n          as ProfessionApproval;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ProfessionApproval create() => ProfessionApproval._();\n  @$core.override\n  ProfessionApproval createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ProfessionApproval getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ProfessionApproval>(create);\n  static ProfessionApproval? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get subtitle => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set subtitle($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSubtitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSubtitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get type => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set type($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearType() => $_clearField(3);\n}\n\nclass ProfessionHonorExtend extends $pb.GeneratedMessage {\n  factory ProfessionHonorExtend({\n    $fixnum.Int64? count,\n    $core.bool? selfGrant,\n    ProfessionPopup? popup,\n  }) {\n    final result = create();\n    if (count != null) result.count = count;\n    if (selfGrant != null) result.selfGrant = selfGrant;\n    if (popup != null) result.popup = popup;\n    return result;\n  }\n\n  ProfessionHonorExtend._();\n\n  factory ProfessionHonorExtend.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ProfessionHonorExtend.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ProfessionHonorExtend',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'count')\n    ..aOB(2, _omitFieldNames ? '' : 'selfGrant')\n    ..aOM<ProfessionPopup>(3, _omitFieldNames ? '' : 'popup',\n        subBuilder: ProfessionPopup.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ProfessionHonorExtend clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ProfessionHonorExtend copyWith(\n          void Function(ProfessionHonorExtend) updates) =>\n      super.copyWith((message) => updates(message as ProfessionHonorExtend))\n          as ProfessionHonorExtend;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ProfessionHonorExtend create() => ProfessionHonorExtend._();\n  @$core.override\n  ProfessionHonorExtend createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ProfessionHonorExtend getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ProfessionHonorExtend>(create);\n  static ProfessionHonorExtend? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get count => $_getI64(0);\n  @$pb.TagNumber(1)\n  set count($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCount() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCount() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get selfGrant => $_getBF(1);\n  @$pb.TagNumber(2)\n  set selfGrant($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSelfGrant() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSelfGrant() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  ProfessionPopup get popup => $_getN(2);\n  @$pb.TagNumber(3)\n  set popup(ProfessionPopup value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPopup() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPopup() => $_clearField(3);\n  @$pb.TagNumber(3)\n  ProfessionPopup ensurePopup() => $_ensure(2);\n}\n\nclass ProfessionPopup extends $pb.GeneratedMessage {\n  factory ProfessionPopup({\n    $core.String? title,\n    $core.String? subtitle,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (subtitle != null) result.subtitle = subtitle;\n    return result;\n  }\n\n  ProfessionPopup._();\n\n  factory ProfessionPopup.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ProfessionPopup.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ProfessionPopup',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'subtitle')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ProfessionPopup clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ProfessionPopup copyWith(void Function(ProfessionPopup) updates) =>\n      super.copyWith((message) => updates(message as ProfessionPopup))\n          as ProfessionPopup;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ProfessionPopup create() => ProfessionPopup._();\n  @$core.override\n  ProfessionPopup createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ProfessionPopup getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ProfessionPopup>(create);\n  static ProfessionPopup? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get subtitle => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set subtitle($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSubtitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSubtitle() => $_clearField(2);\n}\n\nclass PugvCooperationApplication extends $pb.GeneratedMessage {\n  factory PugvCooperationApplication({\n    $core.String? link,\n    $core.String? title,\n    $core.String? subtitle,\n    $core.String? buttonText,\n    $core.String? icon,\n  }) {\n    final result = create();\n    if (link != null) result.link = link;\n    if (title != null) result.title = title;\n    if (subtitle != null) result.subtitle = subtitle;\n    if (buttonText != null) result.buttonText = buttonText;\n    if (icon != null) result.icon = icon;\n    return result;\n  }\n\n  PugvCooperationApplication._();\n\n  factory PugvCooperationApplication.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvCooperationApplication.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvCooperationApplication',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'link')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'subtitle')\n    ..aOS(4, _omitFieldNames ? '' : 'buttonText')\n    ..aOS(5, _omitFieldNames ? '' : 'icon')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvCooperationApplication clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvCooperationApplication copyWith(\n          void Function(PugvCooperationApplication) updates) =>\n      super.copyWith(\n              (message) => updates(message as PugvCooperationApplication))\n          as PugvCooperationApplication;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvCooperationApplication create() => PugvCooperationApplication._();\n  @$core.override\n  PugvCooperationApplication createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvCooperationApplication getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PugvCooperationApplication>(create);\n  static PugvCooperationApplication? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get link => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set link($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLink() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLink() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get subtitle => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set subtitle($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSubtitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSubtitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get buttonText => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set buttonText($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasButtonText() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearButtonText() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get icon => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set icon($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasIcon() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearIcon() => $_clearField(5);\n}\n\nclass PugvFaq extends $pb.GeneratedMessage {\n  factory PugvFaq({\n    PugvSeasonNav? nav,\n    $core.Iterable<PugvFaqContent>? contents,\n  }) {\n    final result = create();\n    if (nav != null) result.nav = nav;\n    if (contents != null) result.contents.addAll(contents);\n    return result;\n  }\n\n  PugvFaq._();\n\n  factory PugvFaq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvFaq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvFaq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOM<PugvSeasonNav>(1, _omitFieldNames ? '' : 'nav',\n        subBuilder: PugvSeasonNav.create)\n    ..pPM<PugvFaqContent>(2, _omitFieldNames ? '' : 'contents',\n        subBuilder: PugvFaqContent.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvFaq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvFaq copyWith(void Function(PugvFaq) updates) =>\n      super.copyWith((message) => updates(message as PugvFaq)) as PugvFaq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvFaq create() => PugvFaq._();\n  @$core.override\n  PugvFaq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvFaq getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PugvFaq>(create);\n  static PugvFaq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PugvSeasonNav get nav => $_getN(0);\n  @$pb.TagNumber(1)\n  set nav(PugvSeasonNav value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasNav() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearNav() => $_clearField(1);\n  @$pb.TagNumber(1)\n  PugvSeasonNav ensureNav() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<PugvFaqContent> get contents => $_getList(1);\n}\n\nclass PugvFaqContent extends $pb.GeneratedMessage {\n  factory PugvFaqContent({\n    $core.String? question,\n    $core.String? answer,\n    $core.String? link,\n  }) {\n    final result = create();\n    if (question != null) result.question = question;\n    if (answer != null) result.answer = answer;\n    if (link != null) result.link = link;\n    return result;\n  }\n\n  PugvFaqContent._();\n\n  factory PugvFaqContent.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvFaqContent.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvFaqContent',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'question')\n    ..aOS(2, _omitFieldNames ? '' : 'answer')\n    ..aOS(3, _omitFieldNames ? '' : 'link')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvFaqContent clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvFaqContent copyWith(void Function(PugvFaqContent) updates) =>\n      super.copyWith((message) => updates(message as PugvFaqContent))\n          as PugvFaqContent;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvFaqContent create() => PugvFaqContent._();\n  @$core.override\n  PugvFaqContent createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvFaqContent getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PugvFaqContent>(create);\n  static PugvFaqContent? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get question => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set question($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasQuestion() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearQuestion() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get answer => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set answer($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAnswer() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAnswer() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get link => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set link($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLink() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLink() => $_clearField(3);\n}\n\nclass PugvPackage extends $pb.GeneratedMessage {\n  factory PugvPackage({\n    PugvSeasonNav? nav,\n    $core.Iterable<PugvPackageItem>? contents,\n  }) {\n    final result = create();\n    if (nav != null) result.nav = nav;\n    if (contents != null) result.contents.addAll(contents);\n    return result;\n  }\n\n  PugvPackage._();\n\n  factory PugvPackage.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvPackage.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvPackage',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOM<PugvSeasonNav>(1, _omitFieldNames ? '' : 'nav',\n        subBuilder: PugvSeasonNav.create)\n    ..pPM<PugvPackageItem>(2, _omitFieldNames ? '' : 'contents',\n        subBuilder: PugvPackageItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvPackage clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvPackage copyWith(void Function(PugvPackage) updates) =>\n      super.copyWith((message) => updates(message as PugvPackage))\n          as PugvPackage;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvPackage create() => PugvPackage._();\n  @$core.override\n  PugvPackage createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvPackage getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PugvPackage>(create);\n  static PugvPackage? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PugvSeasonNav get nav => $_getN(0);\n  @$pb.TagNumber(1)\n  set nav(PugvSeasonNav value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasNav() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearNav() => $_clearField(1);\n  @$pb.TagNumber(1)\n  PugvSeasonNav ensureNav() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<PugvPackageItem> get contents => $_getList(1);\n}\n\nclass PugvPackageItem extends $pb.GeneratedMessage {\n  factory PugvPackageItem({\n    $fixnum.Int64? productId,\n    $core.String? cover,\n    $core.String? title,\n    $core.String? discountPriceDesc,\n    $core.String? originalPriceDesc,\n    $core.String? desc,\n    $core.String? link,\n    $fixnum.Int64? seasonCount,\n    PugvPackageSaleInfo? saleInfo,\n  }) {\n    final result = create();\n    if (productId != null) result.productId = productId;\n    if (cover != null) result.cover = cover;\n    if (title != null) result.title = title;\n    if (discountPriceDesc != null) result.discountPriceDesc = discountPriceDesc;\n    if (originalPriceDesc != null) result.originalPriceDesc = originalPriceDesc;\n    if (desc != null) result.desc = desc;\n    if (link != null) result.link = link;\n    if (seasonCount != null) result.seasonCount = seasonCount;\n    if (saleInfo != null) result.saleInfo = saleInfo;\n    return result;\n  }\n\n  PugvPackageItem._();\n\n  factory PugvPackageItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvPackageItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvPackageItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'productId')\n    ..aOS(2, _omitFieldNames ? '' : 'cover')\n    ..aOS(3, _omitFieldNames ? '' : 'title')\n    ..aOS(4, _omitFieldNames ? '' : 'discountPriceDesc')\n    ..aOS(5, _omitFieldNames ? '' : 'originalPriceDesc')\n    ..aOS(6, _omitFieldNames ? '' : 'desc')\n    ..aOS(7, _omitFieldNames ? '' : 'link')\n    ..aInt64(8, _omitFieldNames ? '' : 'seasonCount')\n    ..aOM<PugvPackageSaleInfo>(9, _omitFieldNames ? '' : 'saleInfo',\n        subBuilder: PugvPackageSaleInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvPackageItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvPackageItem copyWith(void Function(PugvPackageItem) updates) =>\n      super.copyWith((message) => updates(message as PugvPackageItem))\n          as PugvPackageItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvPackageItem create() => PugvPackageItem._();\n  @$core.override\n  PugvPackageItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvPackageItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PugvPackageItem>(create);\n  static PugvPackageItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get productId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set productId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasProductId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearProductId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get cover => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cover($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCover() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCover() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get title => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set title($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get discountPriceDesc => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set discountPriceDesc($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDiscountPriceDesc() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDiscountPriceDesc() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get originalPriceDesc => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set originalPriceDesc($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasOriginalPriceDesc() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearOriginalPriceDesc() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get desc => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set desc($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasDesc() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearDesc() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get link => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set link($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasLink() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearLink() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get seasonCount => $_getI64(7);\n  @$pb.TagNumber(8)\n  set seasonCount($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasSeasonCount() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearSeasonCount() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  PugvPackageSaleInfo get saleInfo => $_getN(8);\n  @$pb.TagNumber(9)\n  set saleInfo(PugvPackageSaleInfo value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasSaleInfo() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearSaleInfo() => $_clearField(9);\n  @$pb.TagNumber(9)\n  PugvPackageSaleInfo ensureSaleInfo() => $_ensure(8);\n}\n\nclass PugvPackageSaleInfo extends $pb.GeneratedMessage {\n  factory PugvPackageSaleInfo({\n    $core.String? icon,\n    $core.String? iconDark,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (iconDark != null) result.iconDark = iconDark;\n    return result;\n  }\n\n  PugvPackageSaleInfo._();\n\n  factory PugvPackageSaleInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvPackageSaleInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvPackageSaleInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'iconDark')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvPackageSaleInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvPackageSaleInfo copyWith(void Function(PugvPackageSaleInfo) updates) =>\n      super.copyWith((message) => updates(message as PugvPackageSaleInfo))\n          as PugvPackageSaleInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvPackageSaleInfo create() => PugvPackageSaleInfo._();\n  @$core.override\n  PugvPackageSaleInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvPackageSaleInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PugvPackageSaleInfo>(create);\n  static PugvPackageSaleInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get iconDark => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set iconDark($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIconDark() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIconDark() => $_clearField(2);\n}\n\nclass PugvSeasonCooperator extends $pb.GeneratedMessage {\n  factory PugvSeasonCooperator({\n    $fixnum.Int64? mid,\n    $core.String? avatar,\n    $core.String? nickname,\n    $core.bool? isOwner,\n    $core.String? role,\n    $core.String? userLink,\n    $core.bool? followed,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (avatar != null) result.avatar = avatar;\n    if (nickname != null) result.nickname = nickname;\n    if (isOwner != null) result.isOwner = isOwner;\n    if (role != null) result.role = role;\n    if (userLink != null) result.userLink = userLink;\n    if (followed != null) result.followed = followed;\n    return result;\n  }\n\n  PugvSeasonCooperator._();\n\n  factory PugvSeasonCooperator.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvSeasonCooperator.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvSeasonCooperator',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aOS(2, _omitFieldNames ? '' : 'avatar')\n    ..aOS(3, _omitFieldNames ? '' : 'nickname')\n    ..aOB(4, _omitFieldNames ? '' : 'isOwner')\n    ..aOS(5, _omitFieldNames ? '' : 'role')\n    ..aOS(6, _omitFieldNames ? '' : 'userLink')\n    ..aOB(7, _omitFieldNames ? '' : 'followed')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonCooperator clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonCooperator copyWith(void Function(PugvSeasonCooperator) updates) =>\n      super.copyWith((message) => updates(message as PugvSeasonCooperator))\n          as PugvSeasonCooperator;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonCooperator create() => PugvSeasonCooperator._();\n  @$core.override\n  PugvSeasonCooperator createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonCooperator getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PugvSeasonCooperator>(create);\n  static PugvSeasonCooperator? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get avatar => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set avatar($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAvatar() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAvatar() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get nickname => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set nickname($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasNickname() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearNickname() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get isOwner => $_getBF(3);\n  @$pb.TagNumber(4)\n  set isOwner($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIsOwner() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIsOwner() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get role => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set role($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasRole() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearRole() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get userLink => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set userLink($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasUserLink() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearUserLink() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.bool get followed => $_getBF(6);\n  @$pb.TagNumber(7)\n  set followed($core.bool value) => $_setBool(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasFollowed() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearFollowed() => $_clearField(7);\n}\n\nenum PugvSeasonDescription_Content { text, image, notSet }\n\nclass PugvSeasonDescription extends $pb.GeneratedMessage {\n  factory PugvSeasonDescription({\n    PugvSeasonNav? nav,\n    PugvSeasonDescriptionType? type,\n    PugvSeasonDescriptionText? text,\n    PugvSeasonDescriptionImage? image,\n  }) {\n    final result = create();\n    if (nav != null) result.nav = nav;\n    if (type != null) result.type = type;\n    if (text != null) result.text = text;\n    if (image != null) result.image = image;\n    return result;\n  }\n\n  PugvSeasonDescription._();\n\n  factory PugvSeasonDescription.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvSeasonDescription.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, PugvSeasonDescription_Content>\n      _PugvSeasonDescription_ContentByTag = {\n    3: PugvSeasonDescription_Content.text,\n    4: PugvSeasonDescription_Content.image,\n    0: PugvSeasonDescription_Content.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvSeasonDescription',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..oo(0, [3, 4])\n    ..aOM<PugvSeasonNav>(1, _omitFieldNames ? '' : 'nav',\n        subBuilder: PugvSeasonNav.create)\n    ..aE<PugvSeasonDescriptionType>(2, _omitFieldNames ? '' : 'type',\n        enumValues: PugvSeasonDescriptionType.values)\n    ..aOM<PugvSeasonDescriptionText>(3, _omitFieldNames ? '' : 'text',\n        subBuilder: PugvSeasonDescriptionText.create)\n    ..aOM<PugvSeasonDescriptionImage>(4, _omitFieldNames ? '' : 'image',\n        subBuilder: PugvSeasonDescriptionImage.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonDescription clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonDescription copyWith(\n          void Function(PugvSeasonDescription) updates) =>\n      super.copyWith((message) => updates(message as PugvSeasonDescription))\n          as PugvSeasonDescription;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonDescription create() => PugvSeasonDescription._();\n  @$core.override\n  PugvSeasonDescription createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonDescription getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PugvSeasonDescription>(create);\n  static PugvSeasonDescription? _defaultInstance;\n\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  PugvSeasonDescription_Content whichContent() =>\n      _PugvSeasonDescription_ContentByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  void clearContent() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  PugvSeasonNav get nav => $_getN(0);\n  @$pb.TagNumber(1)\n  set nav(PugvSeasonNav value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasNav() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearNav() => $_clearField(1);\n  @$pb.TagNumber(1)\n  PugvSeasonNav ensureNav() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  PugvSeasonDescriptionType get type => $_getN(1);\n  @$pb.TagNumber(2)\n  set type(PugvSeasonDescriptionType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  PugvSeasonDescriptionText get text => $_getN(2);\n  @$pb.TagNumber(3)\n  set text(PugvSeasonDescriptionText value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasText() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearText() => $_clearField(3);\n  @$pb.TagNumber(3)\n  PugvSeasonDescriptionText ensureText() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  PugvSeasonDescriptionImage get image => $_getN(3);\n  @$pb.TagNumber(4)\n  set image(PugvSeasonDescriptionImage value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasImage() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearImage() => $_clearField(4);\n  @$pb.TagNumber(4)\n  PugvSeasonDescriptionImage ensureImage() => $_ensure(3);\n}\n\nclass PugvSeasonDescriptionImage extends $pb.GeneratedMessage {\n  factory PugvSeasonDescriptionImage({\n    $core.Iterable<PugvSeasonDescriptionImageItem>? images,\n    $core.bool? folded,\n    $core.double? foldRatio,\n  }) {\n    final result = create();\n    if (images != null) result.images.addAll(images);\n    if (folded != null) result.folded = folded;\n    if (foldRatio != null) result.foldRatio = foldRatio;\n    return result;\n  }\n\n  PugvSeasonDescriptionImage._();\n\n  factory PugvSeasonDescriptionImage.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvSeasonDescriptionImage.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvSeasonDescriptionImage',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..pPM<PugvSeasonDescriptionImageItem>(1, _omitFieldNames ? '' : 'images',\n        subBuilder: PugvSeasonDescriptionImageItem.create)\n    ..aOB(2, _omitFieldNames ? '' : 'folded')\n    ..aD(3, _omitFieldNames ? '' : 'foldRatio')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonDescriptionImage clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonDescriptionImage copyWith(\n          void Function(PugvSeasonDescriptionImage) updates) =>\n      super.copyWith(\n              (message) => updates(message as PugvSeasonDescriptionImage))\n          as PugvSeasonDescriptionImage;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonDescriptionImage create() => PugvSeasonDescriptionImage._();\n  @$core.override\n  PugvSeasonDescriptionImage createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonDescriptionImage getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PugvSeasonDescriptionImage>(create);\n  static PugvSeasonDescriptionImage? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<PugvSeasonDescriptionImageItem> get images => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.bool get folded => $_getBF(1);\n  @$pb.TagNumber(2)\n  set folded($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFolded() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFolded() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.double get foldRatio => $_getN(2);\n  @$pb.TagNumber(3)\n  set foldRatio($core.double value) => $_setDouble(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFoldRatio() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFoldRatio() => $_clearField(3);\n}\n\nclass PugvSeasonDescriptionImageItem extends $pb.GeneratedMessage {\n  factory PugvSeasonDescriptionImageItem({\n    $core.String? imageUrl,\n    $core.double? aspectRatio,\n  }) {\n    final result = create();\n    if (imageUrl != null) result.imageUrl = imageUrl;\n    if (aspectRatio != null) result.aspectRatio = aspectRatio;\n    return result;\n  }\n\n  PugvSeasonDescriptionImageItem._();\n\n  factory PugvSeasonDescriptionImageItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvSeasonDescriptionImageItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvSeasonDescriptionImageItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'imageUrl')\n    ..aD(2, _omitFieldNames ? '' : 'aspectRatio')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonDescriptionImageItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonDescriptionImageItem copyWith(\n          void Function(PugvSeasonDescriptionImageItem) updates) =>\n      super.copyWith(\n              (message) => updates(message as PugvSeasonDescriptionImageItem))\n          as PugvSeasonDescriptionImageItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonDescriptionImageItem create() =>\n      PugvSeasonDescriptionImageItem._();\n  @$core.override\n  PugvSeasonDescriptionImageItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonDescriptionImageItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PugvSeasonDescriptionImageItem>(create);\n  static PugvSeasonDescriptionImageItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get imageUrl => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set imageUrl($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasImageUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearImageUrl() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.double get aspectRatio => $_getN(1);\n  @$pb.TagNumber(2)\n  set aspectRatio($core.double value) => $_setDouble(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAspectRatio() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAspectRatio() => $_clearField(2);\n}\n\nclass PugvSeasonDescriptionText extends $pb.GeneratedMessage {\n  factory PugvSeasonDescriptionText({\n    $core.String? text,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    return result;\n  }\n\n  PugvSeasonDescriptionText._();\n\n  factory PugvSeasonDescriptionText.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvSeasonDescriptionText.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvSeasonDescriptionText',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonDescriptionText clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonDescriptionText copyWith(\n          void Function(PugvSeasonDescriptionText) updates) =>\n      super.copyWith((message) => updates(message as PugvSeasonDescriptionText))\n          as PugvSeasonDescriptionText;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonDescriptionText create() => PugvSeasonDescriptionText._();\n  @$core.override\n  PugvSeasonDescriptionText createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonDescriptionText getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PugvSeasonDescriptionText>(create);\n  static PugvSeasonDescriptionText? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n}\n\nclass PugvSeasonNav extends $pb.GeneratedMessage {\n  factory PugvSeasonNav({\n    $core.String? title,\n    $core.String? moreText,\n    $core.String? desc,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (moreText != null) result.moreText = moreText;\n    if (desc != null) result.desc = desc;\n    return result;\n  }\n\n  PugvSeasonNav._();\n\n  factory PugvSeasonNav.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvSeasonNav.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvSeasonNav',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'moreText')\n    ..aOS(3, _omitFieldNames ? '' : 'desc')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonNav clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonNav copyWith(void Function(PugvSeasonNav) updates) =>\n      super.copyWith((message) => updates(message as PugvSeasonNav))\n          as PugvSeasonNav;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonNav create() => PugvSeasonNav._();\n  @$core.override\n  PugvSeasonNav createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonNav getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PugvSeasonNav>(create);\n  static PugvSeasonNav? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get moreText => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set moreText($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMoreText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMoreText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get desc => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set desc($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDesc() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDesc() => $_clearField(3);\n}\n\nclass PugvSeasonPrimaryBadge extends $pb.GeneratedMessage {\n  factory PugvSeasonPrimaryBadge({\n    $core.String? icon,\n    $core.String? link,\n    $core.String? nightIcon,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (link != null) result.link = link;\n    if (nightIcon != null) result.nightIcon = nightIcon;\n    return result;\n  }\n\n  PugvSeasonPrimaryBadge._();\n\n  factory PugvSeasonPrimaryBadge.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvSeasonPrimaryBadge.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvSeasonPrimaryBadge',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'link')\n    ..aOS(3, _omitFieldNames ? '' : 'nightIcon')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonPrimaryBadge clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonPrimaryBadge copyWith(\n          void Function(PugvSeasonPrimaryBadge) updates) =>\n      super.copyWith((message) => updates(message as PugvSeasonPrimaryBadge))\n          as PugvSeasonPrimaryBadge;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonPrimaryBadge create() => PugvSeasonPrimaryBadge._();\n  @$core.override\n  PugvSeasonPrimaryBadge createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonPrimaryBadge getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PugvSeasonPrimaryBadge>(create);\n  static PugvSeasonPrimaryBadge? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get link => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set link($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLink() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLink() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get nightIcon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set nightIcon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasNightIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearNightIcon() => $_clearField(3);\n}\n\nclass PugvSeasonPrimaryCustomInfo extends $pb.GeneratedMessage {\n  factory PugvSeasonPrimaryCustomInfo({\n    $core.String? expiryInfo,\n  }) {\n    final result = create();\n    if (expiryInfo != null) result.expiryInfo = expiryInfo;\n    return result;\n  }\n\n  PugvSeasonPrimaryCustomInfo._();\n\n  factory PugvSeasonPrimaryCustomInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvSeasonPrimaryCustomInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvSeasonPrimaryCustomInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'expiryInfo')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonPrimaryCustomInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonPrimaryCustomInfo copyWith(\n          void Function(PugvSeasonPrimaryCustomInfo) updates) =>\n      super.copyWith(\n              (message) => updates(message as PugvSeasonPrimaryCustomInfo))\n          as PugvSeasonPrimaryCustomInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonPrimaryCustomInfo create() =>\n      PugvSeasonPrimaryCustomInfo._();\n  @$core.override\n  PugvSeasonPrimaryCustomInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonPrimaryCustomInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PugvSeasonPrimaryCustomInfo>(create);\n  static PugvSeasonPrimaryCustomInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get expiryInfo => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set expiryInfo($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasExpiryInfo() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearExpiryInfo() => $_clearField(1);\n}\n\nclass PugvSeasonPrimaryHotRank extends $pb.GeneratedMessage {\n  factory PugvSeasonPrimaryHotRank({\n    $core.String? text,\n    $core.String? link,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (link != null) result.link = link;\n    return result;\n  }\n\n  PugvSeasonPrimaryHotRank._();\n\n  factory PugvSeasonPrimaryHotRank.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvSeasonPrimaryHotRank.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvSeasonPrimaryHotRank',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aOS(2, _omitFieldNames ? '' : 'link')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonPrimaryHotRank clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonPrimaryHotRank copyWith(\n          void Function(PugvSeasonPrimaryHotRank) updates) =>\n      super.copyWith((message) => updates(message as PugvSeasonPrimaryHotRank))\n          as PugvSeasonPrimaryHotRank;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonPrimaryHotRank create() => PugvSeasonPrimaryHotRank._();\n  @$core.override\n  PugvSeasonPrimaryHotRank createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonPrimaryHotRank getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PugvSeasonPrimaryHotRank>(create);\n  static PugvSeasonPrimaryHotRank? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get link => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set link($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLink() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLink() => $_clearField(2);\n}\n\nclass PugvSeasonPrimaryInfo extends $pb.GeneratedMessage {\n  factory PugvSeasonPrimaryInfo({\n    $core.String? title,\n    $core.String? subtitle,\n    StatInfo? statInfo,\n    PugvSeasonPrimaryRankInfo? rankInfo,\n    PugvSeasonPrimarySellPointInfo? sellPointInfo,\n    PugvSeasonPrimaryCustomInfo? customInfo,\n    $core.bool? showPayment,\n    PugvSeasonPrimaryBadge? badge,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (subtitle != null) result.subtitle = subtitle;\n    if (statInfo != null) result.statInfo = statInfo;\n    if (rankInfo != null) result.rankInfo = rankInfo;\n    if (sellPointInfo != null) result.sellPointInfo = sellPointInfo;\n    if (customInfo != null) result.customInfo = customInfo;\n    if (showPayment != null) result.showPayment = showPayment;\n    if (badge != null) result.badge = badge;\n    return result;\n  }\n\n  PugvSeasonPrimaryInfo._();\n\n  factory PugvSeasonPrimaryInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvSeasonPrimaryInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvSeasonPrimaryInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'subtitle')\n    ..aOM<StatInfo>(3, _omitFieldNames ? '' : 'statInfo',\n        subBuilder: StatInfo.create)\n    ..aOM<PugvSeasonPrimaryRankInfo>(4, _omitFieldNames ? '' : 'rankInfo',\n        subBuilder: PugvSeasonPrimaryRankInfo.create)\n    ..aOM<PugvSeasonPrimarySellPointInfo>(\n        5, _omitFieldNames ? '' : 'sellPointInfo',\n        subBuilder: PugvSeasonPrimarySellPointInfo.create)\n    ..aOM<PugvSeasonPrimaryCustomInfo>(6, _omitFieldNames ? '' : 'customInfo',\n        subBuilder: PugvSeasonPrimaryCustomInfo.create)\n    ..aOB(7, _omitFieldNames ? '' : 'showPayment')\n    ..aOM<PugvSeasonPrimaryBadge>(8, _omitFieldNames ? '' : 'badge',\n        subBuilder: PugvSeasonPrimaryBadge.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonPrimaryInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonPrimaryInfo copyWith(\n          void Function(PugvSeasonPrimaryInfo) updates) =>\n      super.copyWith((message) => updates(message as PugvSeasonPrimaryInfo))\n          as PugvSeasonPrimaryInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonPrimaryInfo create() => PugvSeasonPrimaryInfo._();\n  @$core.override\n  PugvSeasonPrimaryInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonPrimaryInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PugvSeasonPrimaryInfo>(create);\n  static PugvSeasonPrimaryInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get subtitle => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set subtitle($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSubtitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSubtitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  StatInfo get statInfo => $_getN(2);\n  @$pb.TagNumber(3)\n  set statInfo(StatInfo value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasStatInfo() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearStatInfo() => $_clearField(3);\n  @$pb.TagNumber(3)\n  StatInfo ensureStatInfo() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  PugvSeasonPrimaryRankInfo get rankInfo => $_getN(3);\n  @$pb.TagNumber(4)\n  set rankInfo(PugvSeasonPrimaryRankInfo value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasRankInfo() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearRankInfo() => $_clearField(4);\n  @$pb.TagNumber(4)\n  PugvSeasonPrimaryRankInfo ensureRankInfo() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  PugvSeasonPrimarySellPointInfo get sellPointInfo => $_getN(4);\n  @$pb.TagNumber(5)\n  set sellPointInfo(PugvSeasonPrimarySellPointInfo value) =>\n      $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasSellPointInfo() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearSellPointInfo() => $_clearField(5);\n  @$pb.TagNumber(5)\n  PugvSeasonPrimarySellPointInfo ensureSellPointInfo() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  PugvSeasonPrimaryCustomInfo get customInfo => $_getN(5);\n  @$pb.TagNumber(6)\n  set customInfo(PugvSeasonPrimaryCustomInfo value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCustomInfo() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCustomInfo() => $_clearField(6);\n  @$pb.TagNumber(6)\n  PugvSeasonPrimaryCustomInfo ensureCustomInfo() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $core.bool get showPayment => $_getBF(6);\n  @$pb.TagNumber(7)\n  set showPayment($core.bool value) => $_setBool(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasShowPayment() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearShowPayment() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  PugvSeasonPrimaryBadge get badge => $_getN(7);\n  @$pb.TagNumber(8)\n  set badge(PugvSeasonPrimaryBadge value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasBadge() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearBadge() => $_clearField(8);\n  @$pb.TagNumber(8)\n  PugvSeasonPrimaryBadge ensureBadge() => $_ensure(7);\n}\n\nclass PugvSeasonPrimaryRankInfo extends $pb.GeneratedMessage {\n  factory PugvSeasonPrimaryRankInfo({\n    PugvSeasonPrimaryHotRank? hotRank,\n  }) {\n    final result = create();\n    if (hotRank != null) result.hotRank = hotRank;\n    return result;\n  }\n\n  PugvSeasonPrimaryRankInfo._();\n\n  factory PugvSeasonPrimaryRankInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvSeasonPrimaryRankInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvSeasonPrimaryRankInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOM<PugvSeasonPrimaryHotRank>(1, _omitFieldNames ? '' : 'hotRank',\n        subBuilder: PugvSeasonPrimaryHotRank.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonPrimaryRankInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonPrimaryRankInfo copyWith(\n          void Function(PugvSeasonPrimaryRankInfo) updates) =>\n      super.copyWith((message) => updates(message as PugvSeasonPrimaryRankInfo))\n          as PugvSeasonPrimaryRankInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonPrimaryRankInfo create() => PugvSeasonPrimaryRankInfo._();\n  @$core.override\n  PugvSeasonPrimaryRankInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonPrimaryRankInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PugvSeasonPrimaryRankInfo>(create);\n  static PugvSeasonPrimaryRankInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PugvSeasonPrimaryHotRank get hotRank => $_getN(0);\n  @$pb.TagNumber(1)\n  set hotRank(PugvSeasonPrimaryHotRank value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasHotRank() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearHotRank() => $_clearField(1);\n  @$pb.TagNumber(1)\n  PugvSeasonPrimaryHotRank ensureHotRank() => $_ensure(0);\n}\n\nclass PugvSeasonPrimarySellPoint extends $pb.GeneratedMessage {\n  factory PugvSeasonPrimarySellPoint({\n    $core.String? title,\n    $core.String? detail,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (detail != null) result.detail = detail;\n    return result;\n  }\n\n  PugvSeasonPrimarySellPoint._();\n\n  factory PugvSeasonPrimarySellPoint.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvSeasonPrimarySellPoint.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvSeasonPrimarySellPoint',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'detail')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonPrimarySellPoint clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonPrimarySellPoint copyWith(\n          void Function(PugvSeasonPrimarySellPoint) updates) =>\n      super.copyWith(\n              (message) => updates(message as PugvSeasonPrimarySellPoint))\n          as PugvSeasonPrimarySellPoint;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonPrimarySellPoint create() => PugvSeasonPrimarySellPoint._();\n  @$core.override\n  PugvSeasonPrimarySellPoint createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonPrimarySellPoint getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PugvSeasonPrimarySellPoint>(create);\n  static PugvSeasonPrimarySellPoint? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get detail => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set detail($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDetail() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDetail() => $_clearField(2);\n}\n\nclass PugvSeasonPrimarySellPointInfo extends $pb.GeneratedMessage {\n  factory PugvSeasonPrimarySellPointInfo({\n    PugvSeasonPrimarySellPointType? type,\n    $core.Iterable<PugvSeasonPrimarySellPoint>? sellPoints,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (sellPoints != null) result.sellPoints.addAll(sellPoints);\n    return result;\n  }\n\n  PugvSeasonPrimarySellPointInfo._();\n\n  factory PugvSeasonPrimarySellPointInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvSeasonPrimarySellPointInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvSeasonPrimarySellPointInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aE<PugvSeasonPrimarySellPointType>(1, _omitFieldNames ? '' : 'type',\n        enumValues: PugvSeasonPrimarySellPointType.values)\n    ..pPM<PugvSeasonPrimarySellPoint>(2, _omitFieldNames ? '' : 'sellPoints',\n        subBuilder: PugvSeasonPrimarySellPoint.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonPrimarySellPointInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonPrimarySellPointInfo copyWith(\n          void Function(PugvSeasonPrimarySellPointInfo) updates) =>\n      super.copyWith(\n              (message) => updates(message as PugvSeasonPrimarySellPointInfo))\n          as PugvSeasonPrimarySellPointInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonPrimarySellPointInfo create() =>\n      PugvSeasonPrimarySellPointInfo._();\n  @$core.override\n  PugvSeasonPrimarySellPointInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonPrimarySellPointInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PugvSeasonPrimarySellPointInfo>(create);\n  static PugvSeasonPrimarySellPointInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PugvSeasonPrimarySellPointType get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(PugvSeasonPrimarySellPointType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<PugvSeasonPrimarySellPoint> get sellPoints => $_getList(1);\n}\n\nclass PugvSeasonPublisher extends $pb.GeneratedMessage {\n  factory PugvSeasonPublisher({\n    PugvSeasonNav? nav,\n    $core.String? publisherDesc,\n    $core.Iterable<PugvSeasonCooperator>? cooperators,\n    PugvSeasonPublisherSkuContent? skuContent,\n  }) {\n    final result = create();\n    if (nav != null) result.nav = nav;\n    if (publisherDesc != null) result.publisherDesc = publisherDesc;\n    if (cooperators != null) result.cooperators.addAll(cooperators);\n    if (skuContent != null) result.skuContent = skuContent;\n    return result;\n  }\n\n  PugvSeasonPublisher._();\n\n  factory PugvSeasonPublisher.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvSeasonPublisher.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvSeasonPublisher',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOM<PugvSeasonNav>(1, _omitFieldNames ? '' : 'nav',\n        subBuilder: PugvSeasonNav.create)\n    ..aOS(2, _omitFieldNames ? '' : 'publisherDesc')\n    ..pPM<PugvSeasonCooperator>(3, _omitFieldNames ? '' : 'cooperators',\n        subBuilder: PugvSeasonCooperator.create)\n    ..aOM<PugvSeasonPublisherSkuContent>(4, _omitFieldNames ? '' : 'skuContent',\n        subBuilder: PugvSeasonPublisherSkuContent.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonPublisher clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonPublisher copyWith(void Function(PugvSeasonPublisher) updates) =>\n      super.copyWith((message) => updates(message as PugvSeasonPublisher))\n          as PugvSeasonPublisher;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonPublisher create() => PugvSeasonPublisher._();\n  @$core.override\n  PugvSeasonPublisher createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonPublisher getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PugvSeasonPublisher>(create);\n  static PugvSeasonPublisher? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PugvSeasonNav get nav => $_getN(0);\n  @$pb.TagNumber(1)\n  set nav(PugvSeasonNav value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasNav() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearNav() => $_clearField(1);\n  @$pb.TagNumber(1)\n  PugvSeasonNav ensureNav() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get publisherDesc => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set publisherDesc($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPublisherDesc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPublisherDesc() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<PugvSeasonCooperator> get cooperators => $_getList(2);\n\n  @$pb.TagNumber(4)\n  PugvSeasonPublisherSkuContent get skuContent => $_getN(3);\n  @$pb.TagNumber(4)\n  set skuContent(PugvSeasonPublisherSkuContent value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSkuContent() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSkuContent() => $_clearField(4);\n  @$pb.TagNumber(4)\n  PugvSeasonPublisherSkuContent ensureSkuContent() => $_ensure(3);\n}\n\nclass PugvSeasonPublisherSkuContent extends $pb.GeneratedMessage {\n  factory PugvSeasonPublisherSkuContent({\n    $core.String? title,\n    $core.Iterable<PugvSeasonPublisherSkuContentItem>? items,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (items != null) result.items.addAll(items);\n    return result;\n  }\n\n  PugvSeasonPublisherSkuContent._();\n\n  factory PugvSeasonPublisherSkuContent.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvSeasonPublisherSkuContent.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvSeasonPublisherSkuContent',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..pPM<PugvSeasonPublisherSkuContentItem>(2, _omitFieldNames ? '' : 'items',\n        subBuilder: PugvSeasonPublisherSkuContentItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonPublisherSkuContent clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonPublisherSkuContent copyWith(\n          void Function(PugvSeasonPublisherSkuContent) updates) =>\n      super.copyWith(\n              (message) => updates(message as PugvSeasonPublisherSkuContent))\n          as PugvSeasonPublisherSkuContent;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonPublisherSkuContent create() =>\n      PugvSeasonPublisherSkuContent._();\n  @$core.override\n  PugvSeasonPublisherSkuContent createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonPublisherSkuContent getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PugvSeasonPublisherSkuContent>(create);\n  static PugvSeasonPublisherSkuContent? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<PugvSeasonPublisherSkuContentItem> get items => $_getList(1);\n}\n\nclass PugvSeasonPublisherSkuContentItem extends $pb.GeneratedMessage {\n  factory PugvSeasonPublisherSkuContentItem({\n    $core.String? title,\n    $fixnum.Int64? seasonId,\n    $core.bool? selected,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (seasonId != null) result.seasonId = seasonId;\n    if (selected != null) result.selected = selected;\n    return result;\n  }\n\n  PugvSeasonPublisherSkuContentItem._();\n\n  factory PugvSeasonPublisherSkuContentItem.fromBuffer(\n          $core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvSeasonPublisherSkuContentItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvSeasonPublisherSkuContentItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aInt64(2, _omitFieldNames ? '' : 'seasonId')\n    ..aOB(3, _omitFieldNames ? '' : 'selected')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonPublisherSkuContentItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonPublisherSkuContentItem copyWith(\n          void Function(PugvSeasonPublisherSkuContentItem) updates) =>\n      super.copyWith((message) =>\n              updates(message as PugvSeasonPublisherSkuContentItem))\n          as PugvSeasonPublisherSkuContentItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonPublisherSkuContentItem create() =>\n      PugvSeasonPublisherSkuContentItem._();\n  @$core.override\n  PugvSeasonPublisherSkuContentItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonPublisherSkuContentItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PugvSeasonPublisherSkuContentItem>(\n          create);\n  static PugvSeasonPublisherSkuContentItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get seasonId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set seasonId($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSeasonId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSeasonId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get selected => $_getBF(2);\n  @$pb.TagNumber(3)\n  set selected($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSelected() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSelected() => $_clearField(3);\n}\n\nclass PugvSeasonRecommend extends $pb.GeneratedMessage {\n  factory PugvSeasonRecommend({\n    PugvSeasonNav? nav,\n    $core.Iterable<PugvSeasonRecommendContent>? contents,\n    PugvSeasonRecommendMore? moreInfo,\n    PugvSeasonRecommendShowStyle? showStyle,\n  }) {\n    final result = create();\n    if (nav != null) result.nav = nav;\n    if (contents != null) result.contents.addAll(contents);\n    if (moreInfo != null) result.moreInfo = moreInfo;\n    if (showStyle != null) result.showStyle = showStyle;\n    return result;\n  }\n\n  PugvSeasonRecommend._();\n\n  factory PugvSeasonRecommend.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvSeasonRecommend.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvSeasonRecommend',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOM<PugvSeasonNav>(1, _omitFieldNames ? '' : 'nav',\n        subBuilder: PugvSeasonNav.create)\n    ..pPM<PugvSeasonRecommendContent>(2, _omitFieldNames ? '' : 'contents',\n        subBuilder: PugvSeasonRecommendContent.create)\n    ..aOM<PugvSeasonRecommendMore>(3, _omitFieldNames ? '' : 'moreInfo',\n        subBuilder: PugvSeasonRecommendMore.create)\n    ..aE<PugvSeasonRecommendShowStyle>(4, _omitFieldNames ? '' : 'showStyle',\n        enumValues: PugvSeasonRecommendShowStyle.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonRecommend clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonRecommend copyWith(void Function(PugvSeasonRecommend) updates) =>\n      super.copyWith((message) => updates(message as PugvSeasonRecommend))\n          as PugvSeasonRecommend;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonRecommend create() => PugvSeasonRecommend._();\n  @$core.override\n  PugvSeasonRecommend createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonRecommend getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PugvSeasonRecommend>(create);\n  static PugvSeasonRecommend? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PugvSeasonNav get nav => $_getN(0);\n  @$pb.TagNumber(1)\n  set nav(PugvSeasonNav value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasNav() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearNav() => $_clearField(1);\n  @$pb.TagNumber(1)\n  PugvSeasonNav ensureNav() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<PugvSeasonRecommendContent> get contents => $_getList(1);\n\n  @$pb.TagNumber(3)\n  PugvSeasonRecommendMore get moreInfo => $_getN(2);\n  @$pb.TagNumber(3)\n  set moreInfo(PugvSeasonRecommendMore value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasMoreInfo() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearMoreInfo() => $_clearField(3);\n  @$pb.TagNumber(3)\n  PugvSeasonRecommendMore ensureMoreInfo() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  PugvSeasonRecommendShowStyle get showStyle => $_getN(3);\n  @$pb.TagNumber(4)\n  set showStyle(PugvSeasonRecommendShowStyle value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasShowStyle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearShowStyle() => $_clearField(4);\n}\n\nclass PugvSeasonRecommendContent extends $pb.GeneratedMessage {\n  factory PugvSeasonRecommendContent({\n    $core.String? coverUrl,\n    $core.String? title,\n    $core.String? subtitle,\n    $core.String? link,\n    $core.String? desc,\n    $fixnum.Int64? seasonId,\n    $core.String? author,\n    StatInfo? view,\n    BadgeInfo? rcmdReason,\n  }) {\n    final result = create();\n    if (coverUrl != null) result.coverUrl = coverUrl;\n    if (title != null) result.title = title;\n    if (subtitle != null) result.subtitle = subtitle;\n    if (link != null) result.link = link;\n    if (desc != null) result.desc = desc;\n    if (seasonId != null) result.seasonId = seasonId;\n    if (author != null) result.author = author;\n    if (view != null) result.view = view;\n    if (rcmdReason != null) result.rcmdReason = rcmdReason;\n    return result;\n  }\n\n  PugvSeasonRecommendContent._();\n\n  factory PugvSeasonRecommendContent.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvSeasonRecommendContent.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvSeasonRecommendContent',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'coverUrl')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'subtitle')\n    ..aOS(4, _omitFieldNames ? '' : 'link')\n    ..aOS(5, _omitFieldNames ? '' : 'desc')\n    ..aInt64(6, _omitFieldNames ? '' : 'seasonId')\n    ..aOS(7, _omitFieldNames ? '' : 'author')\n    ..aOM<StatInfo>(8, _omitFieldNames ? '' : 'view',\n        subBuilder: StatInfo.create)\n    ..aOM<BadgeInfo>(9, _omitFieldNames ? '' : 'rcmdReason',\n        subBuilder: BadgeInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonRecommendContent clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonRecommendContent copyWith(\n          void Function(PugvSeasonRecommendContent) updates) =>\n      super.copyWith(\n              (message) => updates(message as PugvSeasonRecommendContent))\n          as PugvSeasonRecommendContent;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonRecommendContent create() => PugvSeasonRecommendContent._();\n  @$core.override\n  PugvSeasonRecommendContent createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonRecommendContent getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PugvSeasonRecommendContent>(create);\n  static PugvSeasonRecommendContent? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get coverUrl => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set coverUrl($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCoverUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCoverUrl() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get subtitle => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set subtitle($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSubtitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSubtitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get link => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set link($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLink() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLink() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get desc => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set desc($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDesc() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDesc() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get seasonId => $_getI64(5);\n  @$pb.TagNumber(6)\n  set seasonId($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasSeasonId() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearSeasonId() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get author => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set author($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasAuthor() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearAuthor() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  StatInfo get view => $_getN(7);\n  @$pb.TagNumber(8)\n  set view(StatInfo value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasView() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearView() => $_clearField(8);\n  @$pb.TagNumber(8)\n  StatInfo ensureView() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  BadgeInfo get rcmdReason => $_getN(8);\n  @$pb.TagNumber(9)\n  set rcmdReason(BadgeInfo value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasRcmdReason() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearRcmdReason() => $_clearField(9);\n  @$pb.TagNumber(9)\n  BadgeInfo ensureRcmdReason() => $_ensure(8);\n}\n\nclass PugvSeasonRecommendMore extends $pb.GeneratedMessage {\n  factory PugvSeasonRecommendMore({\n    $core.String? title,\n    $core.String? link,\n    $core.String? linkText,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (link != null) result.link = link;\n    if (linkText != null) result.linkText = linkText;\n    return result;\n  }\n\n  PugvSeasonRecommendMore._();\n\n  factory PugvSeasonRecommendMore.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvSeasonRecommendMore.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvSeasonRecommendMore',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'link')\n    ..aOS(3, _omitFieldNames ? '' : 'linkText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonRecommendMore clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonRecommendMore copyWith(\n          void Function(PugvSeasonRecommendMore) updates) =>\n      super.copyWith((message) => updates(message as PugvSeasonRecommendMore))\n          as PugvSeasonRecommendMore;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonRecommendMore create() => PugvSeasonRecommendMore._();\n  @$core.override\n  PugvSeasonRecommendMore createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonRecommendMore getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PugvSeasonRecommendMore>(create);\n  static PugvSeasonRecommendMore? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get link => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set link($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLink() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLink() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get linkText => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set linkText($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLinkText() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLinkText() => $_clearField(3);\n}\n\nclass PugvSeasonSelection extends $pb.GeneratedMessage {\n  factory PugvSeasonSelection({\n    PugvSeasonNav? nav,\n  }) {\n    final result = create();\n    if (nav != null) result.nav = nav;\n    return result;\n  }\n\n  PugvSeasonSelection._();\n\n  factory PugvSeasonSelection.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvSeasonSelection.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvSeasonSelection',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOM<PugvSeasonNav>(1, _omitFieldNames ? '' : 'nav',\n        subBuilder: PugvSeasonNav.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonSelection clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeasonSelection copyWith(void Function(PugvSeasonSelection) updates) =>\n      super.copyWith((message) => updates(message as PugvSeasonSelection))\n          as PugvSeasonSelection;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonSelection create() => PugvSeasonSelection._();\n  @$core.override\n  PugvSeasonSelection createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvSeasonSelection getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PugvSeasonSelection>(create);\n  static PugvSeasonSelection? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PugvSeasonNav get nav => $_getN(0);\n  @$pb.TagNumber(1)\n  set nav(PugvSeasonNav value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasNav() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearNav() => $_clearField(1);\n  @$pb.TagNumber(1)\n  PugvSeasonNav ensureNav() => $_ensure(0);\n}\n\nclass PugvSeries extends $pb.GeneratedMessage {\n  factory PugvSeries({\n    PugvSeasonNav? nav,\n    $core.Iterable<PugvSeriesItem>? contents,\n  }) {\n    final result = create();\n    if (nav != null) result.nav = nav;\n    if (contents != null) result.contents.addAll(contents);\n    return result;\n  }\n\n  PugvSeries._();\n\n  factory PugvSeries.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvSeries.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvSeries',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOM<PugvSeasonNav>(1, _omitFieldNames ? '' : 'nav',\n        subBuilder: PugvSeasonNav.create)\n    ..pPM<PugvSeriesItem>(2, _omitFieldNames ? '' : 'contents',\n        subBuilder: PugvSeriesItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeries clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeries copyWith(void Function(PugvSeries) updates) =>\n      super.copyWith((message) => updates(message as PugvSeries)) as PugvSeries;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvSeries create() => PugvSeries._();\n  @$core.override\n  PugvSeries createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvSeries getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PugvSeries>(create);\n  static PugvSeries? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PugvSeasonNav get nav => $_getN(0);\n  @$pb.TagNumber(1)\n  set nav(PugvSeasonNav value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasNav() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearNav() => $_clearField(1);\n  @$pb.TagNumber(1)\n  PugvSeasonNav ensureNav() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<PugvSeriesItem> get contents => $_getList(1);\n}\n\nclass PugvSeriesItem extends $pb.GeneratedMessage {\n  factory PugvSeriesItem({\n    $fixnum.Int64? seasonId,\n    $core.bool? selected,\n    $core.bool? gray,\n    $core.String? content,\n    $core.String? label,\n    PugvSeriesItemState? state,\n  }) {\n    final result = create();\n    if (seasonId != null) result.seasonId = seasonId;\n    if (selected != null) result.selected = selected;\n    if (gray != null) result.gray = gray;\n    if (content != null) result.content = content;\n    if (label != null) result.label = label;\n    if (state != null) result.state = state;\n    return result;\n  }\n\n  PugvSeriesItem._();\n\n  factory PugvSeriesItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvSeriesItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvSeriesItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'seasonId')\n    ..aOB(2, _omitFieldNames ? '' : 'selected')\n    ..aOB(3, _omitFieldNames ? '' : 'gray')\n    ..aOS(4, _omitFieldNames ? '' : 'content')\n    ..aOS(5, _omitFieldNames ? '' : 'label')\n    ..aE<PugvSeriesItemState>(6, _omitFieldNames ? '' : 'state',\n        enumValues: PugvSeriesItemState.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeriesItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvSeriesItem copyWith(void Function(PugvSeriesItem) updates) =>\n      super.copyWith((message) => updates(message as PugvSeriesItem))\n          as PugvSeriesItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvSeriesItem create() => PugvSeriesItem._();\n  @$core.override\n  PugvSeriesItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvSeriesItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PugvSeriesItem>(create);\n  static PugvSeriesItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get seasonId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set seasonId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSeasonId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSeasonId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get selected => $_getBF(1);\n  @$pb.TagNumber(2)\n  set selected($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSelected() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSelected() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get gray => $_getBF(2);\n  @$pb.TagNumber(3)\n  set gray($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasGray() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearGray() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get content => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set content($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasContent() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearContent() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get label => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set label($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasLabel() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearLabel() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  PugvSeriesItemState get state => $_getN(5);\n  @$pb.TagNumber(6)\n  set state(PugvSeriesItemState value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasState() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearState() => $_clearField(6);\n}\n\nclass PugvShoppingNotice extends $pb.GeneratedMessage {\n  factory PugvShoppingNotice({\n    PugvSeasonNav? nav,\n    $core.Iterable<PugvShoppingNoticeContent>? contents,\n    $core.String? link,\n  }) {\n    final result = create();\n    if (nav != null) result.nav = nav;\n    if (contents != null) result.contents.addAll(contents);\n    if (link != null) result.link = link;\n    return result;\n  }\n\n  PugvShoppingNotice._();\n\n  factory PugvShoppingNotice.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvShoppingNotice.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvShoppingNotice',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOM<PugvSeasonNav>(1, _omitFieldNames ? '' : 'nav',\n        subBuilder: PugvSeasonNav.create)\n    ..pPM<PugvShoppingNoticeContent>(2, _omitFieldNames ? '' : 'contents',\n        subBuilder: PugvShoppingNoticeContent.create)\n    ..aOS(3, _omitFieldNames ? '' : 'link')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvShoppingNotice clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvShoppingNotice copyWith(void Function(PugvShoppingNotice) updates) =>\n      super.copyWith((message) => updates(message as PugvShoppingNotice))\n          as PugvShoppingNotice;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvShoppingNotice create() => PugvShoppingNotice._();\n  @$core.override\n  PugvShoppingNotice createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvShoppingNotice getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PugvShoppingNotice>(create);\n  static PugvShoppingNotice? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PugvSeasonNav get nav => $_getN(0);\n  @$pb.TagNumber(1)\n  set nav(PugvSeasonNav value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasNav() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearNav() => $_clearField(1);\n  @$pb.TagNumber(1)\n  PugvSeasonNav ensureNav() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<PugvShoppingNoticeContent> get contents => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $core.String get link => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set link($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLink() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLink() => $_clearField(3);\n}\n\nclass PugvShoppingNoticeContent extends $pb.GeneratedMessage {\n  factory PugvShoppingNoticeContent({\n    $core.String? number,\n    $core.String? content,\n    $core.bool? isBold,\n  }) {\n    final result = create();\n    if (number != null) result.number = number;\n    if (content != null) result.content = content;\n    if (isBold != null) result.isBold = isBold;\n    return result;\n  }\n\n  PugvShoppingNoticeContent._();\n\n  factory PugvShoppingNoticeContent.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvShoppingNoticeContent.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvShoppingNoticeContent',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'number')\n    ..aOS(2, _omitFieldNames ? '' : 'content')\n    ..aOB(3, _omitFieldNames ? '' : 'isBold')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvShoppingNoticeContent clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvShoppingNoticeContent copyWith(\n          void Function(PugvShoppingNoticeContent) updates) =>\n      super.copyWith((message) => updates(message as PugvShoppingNoticeContent))\n          as PugvShoppingNoticeContent;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvShoppingNoticeContent create() => PugvShoppingNoticeContent._();\n  @$core.override\n  PugvShoppingNoticeContent createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvShoppingNoticeContent getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PugvShoppingNoticeContent>(create);\n  static PugvShoppingNoticeContent? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get number => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set number($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasNumber() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearNumber() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get content => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set content($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasContent() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearContent() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get isBold => $_getBF(2);\n  @$pb.TagNumber(3)\n  set isBold($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIsBold() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIsBold() => $_clearField(3);\n}\n\nclass PugvZone extends $pb.GeneratedMessage {\n  factory PugvZone({\n    $core.Iterable<PugvZoneItem>? contents,\n  }) {\n    final result = create();\n    if (contents != null) result.contents.addAll(contents);\n    return result;\n  }\n\n  PugvZone._();\n\n  factory PugvZone.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvZone.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvZone',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..pPM<PugvZoneItem>(1, _omitFieldNames ? '' : 'contents',\n        subBuilder: PugvZoneItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvZone clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvZone copyWith(void Function(PugvZone) updates) =>\n      super.copyWith((message) => updates(message as PugvZone)) as PugvZone;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvZone create() => PugvZone._();\n  @$core.override\n  PugvZone createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvZone getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PugvZone>(create);\n  static PugvZone? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<PugvZoneItem> get contents => $_getList(0);\n}\n\nclass PugvZoneItem extends $pb.GeneratedMessage {\n  factory PugvZoneItem({\n    $core.String? icon,\n    $core.String? link,\n    $core.String? title,\n    $core.String? subtitle,\n    PugvZoneItemType? type,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (link != null) result.link = link;\n    if (title != null) result.title = title;\n    if (subtitle != null) result.subtitle = subtitle;\n    if (type != null) result.type = type;\n    return result;\n  }\n\n  PugvZoneItem._();\n\n  factory PugvZoneItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PugvZoneItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PugvZoneItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'link')\n    ..aOS(3, _omitFieldNames ? '' : 'title')\n    ..aOS(4, _omitFieldNames ? '' : 'subtitle')\n    ..aE<PugvZoneItemType>(5, _omitFieldNames ? '' : 'type',\n        enumValues: PugvZoneItemType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvZoneItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PugvZoneItem copyWith(void Function(PugvZoneItem) updates) =>\n      super.copyWith((message) => updates(message as PugvZoneItem))\n          as PugvZoneItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PugvZoneItem create() => PugvZoneItem._();\n  @$core.override\n  PugvZoneItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PugvZoneItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PugvZoneItem>(create);\n  static PugvZoneItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get link => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set link($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLink() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLink() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get title => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set title($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get subtitle => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set subtitle($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSubtitle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSubtitle() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  PugvZoneItemType get type => $_getN(4);\n  @$pb.TagNumber(5)\n  set type(PugvZoneItemType value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearType() => $_clearField(5);\n}\n\nclass Rank extends $pb.GeneratedMessage {\n  factory Rank({\n    $core.String? icon,\n    $core.String? iconNight,\n    $core.String? text,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (iconNight != null) result.iconNight = iconNight;\n    if (text != null) result.text = text;\n    return result;\n  }\n\n  Rank._();\n\n  factory Rank.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Rank.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Rank',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'iconNight')\n    ..aOS(3, _omitFieldNames ? '' : 'text')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Rank clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Rank copyWith(void Function(Rank) updates) =>\n      super.copyWith((message) => updates(message as Rank)) as Rank;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Rank create() => Rank._();\n  @$core.override\n  Rank createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Rank getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Rank>(create);\n  static Rank? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get iconNight => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set iconNight($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIconNight() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIconNight() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get text => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set text($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasText() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearText() => $_clearField(3);\n}\n\nclass RankInfo extends $pb.GeneratedMessage {\n  factory RankInfo({\n    $core.String? iconUrlNight,\n    $core.String? iconUrlDay,\n    $core.String? bkgNightColor,\n    $core.String? bkgDayColor,\n    $core.String? fontNightColor,\n    $core.String? fontDayColor,\n    $core.String? rankContent,\n    $core.String? rankLink,\n  }) {\n    final result = create();\n    if (iconUrlNight != null) result.iconUrlNight = iconUrlNight;\n    if (iconUrlDay != null) result.iconUrlDay = iconUrlDay;\n    if (bkgNightColor != null) result.bkgNightColor = bkgNightColor;\n    if (bkgDayColor != null) result.bkgDayColor = bkgDayColor;\n    if (fontNightColor != null) result.fontNightColor = fontNightColor;\n    if (fontDayColor != null) result.fontDayColor = fontDayColor;\n    if (rankContent != null) result.rankContent = rankContent;\n    if (rankLink != null) result.rankLink = rankLink;\n    return result;\n  }\n\n  RankInfo._();\n\n  factory RankInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RankInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RankInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'iconUrlNight')\n    ..aOS(2, _omitFieldNames ? '' : 'iconUrlDay')\n    ..aOS(3, _omitFieldNames ? '' : 'bkgNightColor')\n    ..aOS(4, _omitFieldNames ? '' : 'bkgDayColor')\n    ..aOS(5, _omitFieldNames ? '' : 'fontNightColor')\n    ..aOS(6, _omitFieldNames ? '' : 'fontDayColor')\n    ..aOS(7, _omitFieldNames ? '' : 'rankContent')\n    ..aOS(8, _omitFieldNames ? '' : 'rankLink')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RankInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RankInfo copyWith(void Function(RankInfo) updates) =>\n      super.copyWith((message) => updates(message as RankInfo)) as RankInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RankInfo create() => RankInfo._();\n  @$core.override\n  RankInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RankInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<RankInfo>(create);\n  static RankInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get iconUrlNight => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set iconUrlNight($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIconUrlNight() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIconUrlNight() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get iconUrlDay => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set iconUrlDay($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIconUrlDay() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIconUrlDay() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get bkgNightColor => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set bkgNightColor($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBkgNightColor() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBkgNightColor() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get bkgDayColor => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set bkgDayColor($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBkgDayColor() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBkgDayColor() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get fontNightColor => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set fontNightColor($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasFontNightColor() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearFontNightColor() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get fontDayColor => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set fontDayColor($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasFontDayColor() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearFontDayColor() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get rankContent => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set rankContent($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasRankContent() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearRankContent() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get rankLink => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set rankLink($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasRankLink() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearRankLink() => $_clearField(8);\n}\n\nclass Rating extends $pb.GeneratedMessage {\n  factory Rating({\n    $core.String? score,\n    $core.int? count,\n  }) {\n    final result = create();\n    if (score != null) result.score = score;\n    if (count != null) result.count = count;\n    return result;\n  }\n\n  Rating._();\n\n  factory Rating.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Rating.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Rating',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'score')\n    ..aI(2, _omitFieldNames ? '' : 'count')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Rating clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Rating copyWith(void Function(Rating) updates) =>\n      super.copyWith((message) => updates(message as Rating)) as Rating;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Rating create() => Rating._();\n  @$core.override\n  Rating createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Rating getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Rating>(create);\n  static Rating? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get score => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set score($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasScore() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearScore() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get count => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set count($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCount() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCount() => $_clearField(2);\n}\n\nclass RelateAVCard extends $pb.GeneratedMessage {\n  factory RelateAVCard({\n    $fixnum.Int64? duration,\n    $fixnum.Int64? cid,\n    Dimension? dimension,\n    Stat? stat,\n    $core.String? jumpUrl,\n    $core.bool? showUpName,\n    BadgeInfo? rcmdReason,\n    $core.String? durationText,\n    $core.bool? showRcmdStyle,\n  }) {\n    final result = create();\n    if (duration != null) result.duration = duration;\n    if (cid != null) result.cid = cid;\n    if (dimension != null) result.dimension = dimension;\n    if (stat != null) result.stat = stat;\n    if (jumpUrl != null) result.jumpUrl = jumpUrl;\n    if (showUpName != null) result.showUpName = showUpName;\n    if (rcmdReason != null) result.rcmdReason = rcmdReason;\n    if (durationText != null) result.durationText = durationText;\n    if (showRcmdStyle != null) result.showRcmdStyle = showRcmdStyle;\n    return result;\n  }\n\n  RelateAVCard._();\n\n  factory RelateAVCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RelateAVCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RelateAVCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'duration')\n    ..aInt64(2, _omitFieldNames ? '' : 'cid')\n    ..aOM<Dimension>(3, _omitFieldNames ? '' : 'dimension',\n        subBuilder: Dimension.create)\n    ..aOM<Stat>(4, _omitFieldNames ? '' : 'stat', subBuilder: Stat.create)\n    ..aOS(5, _omitFieldNames ? '' : 'jumpUrl')\n    ..aOB(6, _omitFieldNames ? '' : 'showUpName')\n    ..aOM<BadgeInfo>(7, _omitFieldNames ? '' : 'rcmdReason',\n        subBuilder: BadgeInfo.create)\n    ..aOS(8, _omitFieldNames ? '' : 'durationText')\n    ..aOB(9, _omitFieldNames ? '' : 'showRcmdStyle')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateAVCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateAVCard copyWith(void Function(RelateAVCard) updates) =>\n      super.copyWith((message) => updates(message as RelateAVCard))\n          as RelateAVCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RelateAVCard create() => RelateAVCard._();\n  @$core.override\n  RelateAVCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RelateAVCard getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RelateAVCard>(create);\n  static RelateAVCard? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get duration => $_getI64(0);\n  @$pb.TagNumber(1)\n  set duration($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDuration() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDuration() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get cid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set cid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  Dimension get dimension => $_getN(2);\n  @$pb.TagNumber(3)\n  set dimension(Dimension value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDimension() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDimension() => $_clearField(3);\n  @$pb.TagNumber(3)\n  Dimension ensureDimension() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  Stat get stat => $_getN(3);\n  @$pb.TagNumber(4)\n  set stat(Stat value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasStat() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearStat() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Stat ensureStat() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.String get jumpUrl => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set jumpUrl($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasJumpUrl() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearJumpUrl() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.bool get showUpName => $_getBF(5);\n  @$pb.TagNumber(6)\n  set showUpName($core.bool value) => $_setBool(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasShowUpName() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearShowUpName() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  BadgeInfo get rcmdReason => $_getN(6);\n  @$pb.TagNumber(7)\n  set rcmdReason(BadgeInfo value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasRcmdReason() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearRcmdReason() => $_clearField(7);\n  @$pb.TagNumber(7)\n  BadgeInfo ensureRcmdReason() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  $core.String get durationText => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set durationText($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasDurationText() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearDurationText() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.bool get showRcmdStyle => $_getBF(8);\n  @$pb.TagNumber(9)\n  set showRcmdStyle($core.bool value) => $_setBool(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasShowRcmdStyle() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearShowRcmdStyle() => $_clearField(9);\n}\n\nclass RelateBangumiAvCard extends $pb.GeneratedMessage {\n  factory RelateBangumiAvCard({\n    BadgeInfo? badge,\n    Stat? stat,\n    Rating? rating,\n    $core.String? coverRightText,\n    $core.bool? showRcmdStyle,\n  }) {\n    final result = create();\n    if (badge != null) result.badge = badge;\n    if (stat != null) result.stat = stat;\n    if (rating != null) result.rating = rating;\n    if (coverRightText != null) result.coverRightText = coverRightText;\n    if (showRcmdStyle != null) result.showRcmdStyle = showRcmdStyle;\n    return result;\n  }\n\n  RelateBangumiAvCard._();\n\n  factory RelateBangumiAvCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RelateBangumiAvCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RelateBangumiAvCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOM<BadgeInfo>(1, _omitFieldNames ? '' : 'badge',\n        subBuilder: BadgeInfo.create)\n    ..aOM<Stat>(2, _omitFieldNames ? '' : 'stat', subBuilder: Stat.create)\n    ..aOM<Rating>(3, _omitFieldNames ? '' : 'rating', subBuilder: Rating.create)\n    ..aOS(4, _omitFieldNames ? '' : 'coverRightText')\n    ..aOB(5, _omitFieldNames ? '' : 'showRcmdStyle')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateBangumiAvCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateBangumiAvCard copyWith(void Function(RelateBangumiAvCard) updates) =>\n      super.copyWith((message) => updates(message as RelateBangumiAvCard))\n          as RelateBangumiAvCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RelateBangumiAvCard create() => RelateBangumiAvCard._();\n  @$core.override\n  RelateBangumiAvCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RelateBangumiAvCard getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RelateBangumiAvCard>(create);\n  static RelateBangumiAvCard? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  BadgeInfo get badge => $_getN(0);\n  @$pb.TagNumber(1)\n  set badge(BadgeInfo value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBadge() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBadge() => $_clearField(1);\n  @$pb.TagNumber(1)\n  BadgeInfo ensureBadge() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  Stat get stat => $_getN(1);\n  @$pb.TagNumber(2)\n  set stat(Stat value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasStat() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearStat() => $_clearField(2);\n  @$pb.TagNumber(2)\n  Stat ensureStat() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  Rating get rating => $_getN(2);\n  @$pb.TagNumber(3)\n  set rating(Rating value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRating() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRating() => $_clearField(3);\n  @$pb.TagNumber(3)\n  Rating ensureRating() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.String get coverRightText => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set coverRightText($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCoverRightText() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCoverRightText() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.bool get showRcmdStyle => $_getBF(4);\n  @$pb.TagNumber(5)\n  set showRcmdStyle($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasShowRcmdStyle() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearShowRcmdStyle() => $_clearField(5);\n}\n\nclass RelateBangumiCard extends $pb.GeneratedMessage {\n  factory RelateBangumiCard({\n    $core.int? seasonId,\n    $core.int? seasonType,\n    NewEp? newEp,\n    Stat? stat,\n    Rating? rating,\n    $core.String? rcmdReason,\n    BadgeInfo? badgeInfo,\n    $core.String? gotoType,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? report,\n  }) {\n    final result = create();\n    if (seasonId != null) result.seasonId = seasonId;\n    if (seasonType != null) result.seasonType = seasonType;\n    if (newEp != null) result.newEp = newEp;\n    if (stat != null) result.stat = stat;\n    if (rating != null) result.rating = rating;\n    if (rcmdReason != null) result.rcmdReason = rcmdReason;\n    if (badgeInfo != null) result.badgeInfo = badgeInfo;\n    if (gotoType != null) result.gotoType = gotoType;\n    if (report != null) result.report.addEntries(report);\n    return result;\n  }\n\n  RelateBangumiCard._();\n\n  factory RelateBangumiCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RelateBangumiCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RelateBangumiCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'seasonId')\n    ..aI(2, _omitFieldNames ? '' : 'seasonType')\n    ..aOM<NewEp>(3, _omitFieldNames ? '' : 'newEp', subBuilder: NewEp.create)\n    ..aOM<Stat>(4, _omitFieldNames ? '' : 'stat', subBuilder: Stat.create)\n    ..aOM<Rating>(5, _omitFieldNames ? '' : 'rating', subBuilder: Rating.create)\n    ..aOS(6, _omitFieldNames ? '' : 'rcmdReason')\n    ..aOM<BadgeInfo>(7, _omitFieldNames ? '' : 'badgeInfo',\n        subBuilder: BadgeInfo.create)\n    ..aOS(8, _omitFieldNames ? '' : 'gotoType')\n    ..m<$core.String, $core.String>(9, _omitFieldNames ? '' : 'report',\n        entryClassName: 'RelateBangumiCard.ReportEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.viewunite.common'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateBangumiCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateBangumiCard copyWith(void Function(RelateBangumiCard) updates) =>\n      super.copyWith((message) => updates(message as RelateBangumiCard))\n          as RelateBangumiCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RelateBangumiCard create() => RelateBangumiCard._();\n  @$core.override\n  RelateBangumiCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RelateBangumiCard getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RelateBangumiCard>(create);\n  static RelateBangumiCard? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get seasonId => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set seasonId($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSeasonId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSeasonId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get seasonType => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set seasonType($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSeasonType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSeasonType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  NewEp get newEp => $_getN(2);\n  @$pb.TagNumber(3)\n  set newEp(NewEp value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasNewEp() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearNewEp() => $_clearField(3);\n  @$pb.TagNumber(3)\n  NewEp ensureNewEp() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  Stat get stat => $_getN(3);\n  @$pb.TagNumber(4)\n  set stat(Stat value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasStat() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearStat() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Stat ensureStat() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  Rating get rating => $_getN(4);\n  @$pb.TagNumber(5)\n  set rating(Rating value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasRating() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearRating() => $_clearField(5);\n  @$pb.TagNumber(5)\n  Rating ensureRating() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.String get rcmdReason => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set rcmdReason($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasRcmdReason() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearRcmdReason() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  BadgeInfo get badgeInfo => $_getN(6);\n  @$pb.TagNumber(7)\n  set badgeInfo(BadgeInfo value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBadgeInfo() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBadgeInfo() => $_clearField(7);\n  @$pb.TagNumber(7)\n  BadgeInfo ensureBadgeInfo() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  $core.String get gotoType => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set gotoType($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasGotoType() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearGotoType() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $pb.PbMap<$core.String, $core.String> get report => $_getMap(8);\n}\n\nclass RelateBangumiResourceCard extends $pb.GeneratedMessage {\n  factory RelateBangumiResourceCard({\n    $core.int? type,\n    $core.String? scover,\n    $core.int? reType,\n    $core.String? reValue,\n    $core.String? corner,\n    $core.int? card,\n    $core.String? siz,\n    $core.int? position,\n    $core.String? rcmdReason,\n    $core.String? label,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? report,\n    $core.String? gotoType,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (scover != null) result.scover = scover;\n    if (reType != null) result.reType = reType;\n    if (reValue != null) result.reValue = reValue;\n    if (corner != null) result.corner = corner;\n    if (card != null) result.card = card;\n    if (siz != null) result.siz = siz;\n    if (position != null) result.position = position;\n    if (rcmdReason != null) result.rcmdReason = rcmdReason;\n    if (label != null) result.label = label;\n    if (report != null) result.report.addEntries(report);\n    if (gotoType != null) result.gotoType = gotoType;\n    return result;\n  }\n\n  RelateBangumiResourceCard._();\n\n  factory RelateBangumiResourceCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RelateBangumiResourceCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RelateBangumiResourceCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'type')\n    ..aOS(2, _omitFieldNames ? '' : 'scover')\n    ..aI(3, _omitFieldNames ? '' : 'reType')\n    ..aOS(4, _omitFieldNames ? '' : 'reValue')\n    ..aOS(5, _omitFieldNames ? '' : 'corner')\n    ..aI(6, _omitFieldNames ? '' : 'card')\n    ..aOS(7, _omitFieldNames ? '' : 'siz')\n    ..aI(8, _omitFieldNames ? '' : 'position')\n    ..aOS(9, _omitFieldNames ? '' : 'rcmdReason')\n    ..aOS(10, _omitFieldNames ? '' : 'label')\n    ..m<$core.String, $core.String>(11, _omitFieldNames ? '' : 'report',\n        entryClassName: 'RelateBangumiResourceCard.ReportEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.viewunite.common'))\n    ..aOS(12, _omitFieldNames ? '' : 'gotoType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateBangumiResourceCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateBangumiResourceCard copyWith(\n          void Function(RelateBangumiResourceCard) updates) =>\n      super.copyWith((message) => updates(message as RelateBangumiResourceCard))\n          as RelateBangumiResourceCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RelateBangumiResourceCard create() => RelateBangumiResourceCard._();\n  @$core.override\n  RelateBangumiResourceCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RelateBangumiResourceCard getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RelateBangumiResourceCard>(create);\n  static RelateBangumiResourceCard? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get type => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set type($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get scover => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set scover($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasScover() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearScover() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get reType => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set reType($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasReType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearReType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get reValue => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set reValue($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasReValue() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearReValue() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get corner => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set corner($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCorner() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCorner() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get card => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set card($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCard() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCard() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get siz => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set siz($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasSiz() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearSiz() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get position => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set position($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasPosition() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearPosition() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get rcmdReason => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set rcmdReason($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasRcmdReason() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearRcmdReason() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get label => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set label($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasLabel() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearLabel() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $pb.PbMap<$core.String, $core.String> get report => $_getMap(10);\n\n  @$pb.TagNumber(12)\n  $core.String get gotoType => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set gotoType($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasGotoType() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearGotoType() => $_clearField(12);\n}\n\nclass RelateBangumiUGCCard extends $pb.GeneratedMessage {\n  factory RelateBangumiUGCCard({\n    BadgeInfo? badge,\n    Stat? stat,\n    Rating? rating,\n  }) {\n    final result = create();\n    if (badge != null) result.badge = badge;\n    if (stat != null) result.stat = stat;\n    if (rating != null) result.rating = rating;\n    return result;\n  }\n\n  RelateBangumiUGCCard._();\n\n  factory RelateBangumiUGCCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RelateBangumiUGCCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RelateBangumiUGCCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOM<BadgeInfo>(1, _omitFieldNames ? '' : 'badge',\n        subBuilder: BadgeInfo.create)\n    ..aOM<Stat>(2, _omitFieldNames ? '' : 'stat', subBuilder: Stat.create)\n    ..aOM<Rating>(3, _omitFieldNames ? '' : 'rating', subBuilder: Rating.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateBangumiUGCCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateBangumiUGCCard copyWith(void Function(RelateBangumiUGCCard) updates) =>\n      super.copyWith((message) => updates(message as RelateBangumiUGCCard))\n          as RelateBangumiUGCCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RelateBangumiUGCCard create() => RelateBangumiUGCCard._();\n  @$core.override\n  RelateBangumiUGCCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RelateBangumiUGCCard getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RelateBangumiUGCCard>(create);\n  static RelateBangumiUGCCard? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  BadgeInfo get badge => $_getN(0);\n  @$pb.TagNumber(1)\n  set badge(BadgeInfo value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBadge() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBadge() => $_clearField(1);\n  @$pb.TagNumber(1)\n  BadgeInfo ensureBadge() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  Stat get stat => $_getN(1);\n  @$pb.TagNumber(2)\n  set stat(Stat value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasStat() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearStat() => $_clearField(2);\n  @$pb.TagNumber(2)\n  Stat ensureStat() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  Rating get rating => $_getN(2);\n  @$pb.TagNumber(3)\n  set rating(Rating value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRating() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRating() => $_clearField(3);\n  @$pb.TagNumber(3)\n  Rating ensureRating() => $_ensure(2);\n}\n\nclass RelateCMCard extends $pb.GeneratedMessage {\n  factory RelateCMCard({\n    $fixnum.Int64? aid,\n    $0.Any? sourceContent,\n    $fixnum.Int64? duration,\n    Stat? stat,\n    $core.int? natureAd,\n  }) {\n    final result = create();\n    if (aid != null) result.aid = aid;\n    if (sourceContent != null) result.sourceContent = sourceContent;\n    if (duration != null) result.duration = duration;\n    if (stat != null) result.stat = stat;\n    if (natureAd != null) result.natureAd = natureAd;\n    return result;\n  }\n\n  RelateCMCard._();\n\n  factory RelateCMCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RelateCMCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RelateCMCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'aid')\n    ..aOM<$0.Any>(2, _omitFieldNames ? '' : 'sourceContent',\n        subBuilder: $0.Any.create)\n    ..aInt64(3, _omitFieldNames ? '' : 'duration')\n    ..aOM<Stat>(4, _omitFieldNames ? '' : 'stat', subBuilder: Stat.create)\n    ..aI(5, _omitFieldNames ? '' : 'natureAd')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateCMCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateCMCard copyWith(void Function(RelateCMCard) updates) =>\n      super.copyWith((message) => updates(message as RelateCMCard))\n          as RelateCMCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RelateCMCard create() => RelateCMCard._();\n  @$core.override\n  RelateCMCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RelateCMCard getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RelateCMCard>(create);\n  static RelateCMCard? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get aid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set aid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $0.Any get sourceContent => $_getN(1);\n  @$pb.TagNumber(2)\n  set sourceContent($0.Any value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSourceContent() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSourceContent() => $_clearField(2);\n  @$pb.TagNumber(2)\n  $0.Any ensureSourceContent() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get duration => $_getI64(2);\n  @$pb.TagNumber(3)\n  set duration($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDuration() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDuration() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  Stat get stat => $_getN(3);\n  @$pb.TagNumber(4)\n  set stat(Stat value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasStat() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearStat() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Stat ensureStat() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.int get natureAd => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set natureAd($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasNatureAd() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearNatureAd() => $_clearField(5);\n}\n\nenum RelateCard_Card {\n  av,\n  bangumi,\n  resource,\n  game,\n  cm,\n  live,\n  bangumiAv,\n  aiCard,\n  bangumiUgc,\n  special,\n  course,\n  miniProgram,\n  historyAv,\n  notSet\n}\n\nclass RelateCard extends $pb.GeneratedMessage {\n  factory RelateCard({\n    RelateCardType? relateCardType,\n    RelateAVCard? av,\n    RelateBangumiCard? bangumi,\n    RelateBangumiResourceCard? resource,\n    RelateGameCard? game,\n    RelateCMCard? cm,\n    RelateLiveCard? live,\n    RelateBangumiAvCard? bangumiAv,\n    RelatedAICard? aiCard,\n    RelateThreePoint? threePoint,\n    $0.Any? cmStock,\n    CardBasicInfo? basicInfo,\n    RelateBangumiUGCCard? bangumiUgc,\n    RelateSpecial? special,\n    RelateCourseCard? course,\n    RelateMiniProgramCard? miniProgram,\n    RelateHistoryAVCard? historyAv,\n  }) {\n    final result = create();\n    if (relateCardType != null) result.relateCardType = relateCardType;\n    if (av != null) result.av = av;\n    if (bangumi != null) result.bangumi = bangumi;\n    if (resource != null) result.resource = resource;\n    if (game != null) result.game = game;\n    if (cm != null) result.cm = cm;\n    if (live != null) result.live = live;\n    if (bangumiAv != null) result.bangumiAv = bangumiAv;\n    if (aiCard != null) result.aiCard = aiCard;\n    if (threePoint != null) result.threePoint = threePoint;\n    if (cmStock != null) result.cmStock = cmStock;\n    if (basicInfo != null) result.basicInfo = basicInfo;\n    if (bangumiUgc != null) result.bangumiUgc = bangumiUgc;\n    if (special != null) result.special = special;\n    if (course != null) result.course = course;\n    if (miniProgram != null) result.miniProgram = miniProgram;\n    if (historyAv != null) result.historyAv = historyAv;\n    return result;\n  }\n\n  RelateCard._();\n\n  factory RelateCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RelateCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, RelateCard_Card> _RelateCard_CardByTag = {\n    2: RelateCard_Card.av,\n    3: RelateCard_Card.bangumi,\n    4: RelateCard_Card.resource,\n    5: RelateCard_Card.game,\n    6: RelateCard_Card.cm,\n    7: RelateCard_Card.live,\n    8: RelateCard_Card.bangumiAv,\n    9: RelateCard_Card.aiCard,\n    13: RelateCard_Card.bangumiUgc,\n    14: RelateCard_Card.special,\n    15: RelateCard_Card.course,\n    16: RelateCard_Card.miniProgram,\n    17: RelateCard_Card.historyAv,\n    0: RelateCard_Card.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RelateCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..oo(0, [2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 17])\n    ..aE<RelateCardType>(1, _omitFieldNames ? '' : 'relateCardType',\n        enumValues: RelateCardType.values)\n    ..aOM<RelateAVCard>(2, _omitFieldNames ? '' : 'av',\n        subBuilder: RelateAVCard.create)\n    ..aOM<RelateBangumiCard>(3, _omitFieldNames ? '' : 'bangumi',\n        subBuilder: RelateBangumiCard.create)\n    ..aOM<RelateBangumiResourceCard>(4, _omitFieldNames ? '' : 'resource',\n        subBuilder: RelateBangumiResourceCard.create)\n    ..aOM<RelateGameCard>(5, _omitFieldNames ? '' : 'game',\n        subBuilder: RelateGameCard.create)\n    ..aOM<RelateCMCard>(6, _omitFieldNames ? '' : 'cm',\n        subBuilder: RelateCMCard.create)\n    ..aOM<RelateLiveCard>(7, _omitFieldNames ? '' : 'live',\n        subBuilder: RelateLiveCard.create)\n    ..aOM<RelateBangumiAvCard>(8, _omitFieldNames ? '' : 'bangumiAv',\n        subBuilder: RelateBangumiAvCard.create)\n    ..aOM<RelatedAICard>(9, _omitFieldNames ? '' : 'aiCard',\n        subBuilder: RelatedAICard.create)\n    ..aOM<RelateThreePoint>(10, _omitFieldNames ? '' : 'threePoint',\n        subBuilder: RelateThreePoint.create)\n    ..aOM<$0.Any>(11, _omitFieldNames ? '' : 'cmStock',\n        subBuilder: $0.Any.create)\n    ..aOM<CardBasicInfo>(12, _omitFieldNames ? '' : 'basicInfo',\n        subBuilder: CardBasicInfo.create)\n    ..aOM<RelateBangumiUGCCard>(13, _omitFieldNames ? '' : 'bangumiUgc',\n        subBuilder: RelateBangumiUGCCard.create)\n    ..aOM<RelateSpecial>(14, _omitFieldNames ? '' : 'special',\n        subBuilder: RelateSpecial.create)\n    ..aOM<RelateCourseCard>(15, _omitFieldNames ? '' : 'course',\n        subBuilder: RelateCourseCard.create)\n    ..aOM<RelateMiniProgramCard>(16, _omitFieldNames ? '' : 'miniProgram',\n        subBuilder: RelateMiniProgramCard.create)\n    ..aOM<RelateHistoryAVCard>(17, _omitFieldNames ? '' : 'historyAv',\n        subBuilder: RelateHistoryAVCard.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateCard copyWith(void Function(RelateCard) updates) =>\n      super.copyWith((message) => updates(message as RelateCard)) as RelateCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RelateCard create() => RelateCard._();\n  @$core.override\n  RelateCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RelateCard getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RelateCard>(create);\n  static RelateCard? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(7)\n  @$pb.TagNumber(8)\n  @$pb.TagNumber(9)\n  @$pb.TagNumber(13)\n  @$pb.TagNumber(14)\n  @$pb.TagNumber(15)\n  @$pb.TagNumber(16)\n  @$pb.TagNumber(17)\n  RelateCard_Card whichCard() => _RelateCard_CardByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(7)\n  @$pb.TagNumber(8)\n  @$pb.TagNumber(9)\n  @$pb.TagNumber(13)\n  @$pb.TagNumber(14)\n  @$pb.TagNumber(15)\n  @$pb.TagNumber(16)\n  @$pb.TagNumber(17)\n  void clearCard() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  RelateCardType get relateCardType => $_getN(0);\n  @$pb.TagNumber(1)\n  set relateCardType(RelateCardType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasRelateCardType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRelateCardType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  RelateAVCard get av => $_getN(1);\n  @$pb.TagNumber(2)\n  set av(RelateAVCard value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAv() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAv() => $_clearField(2);\n  @$pb.TagNumber(2)\n  RelateAVCard ensureAv() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  RelateBangumiCard get bangumi => $_getN(2);\n  @$pb.TagNumber(3)\n  set bangumi(RelateBangumiCard value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBangumi() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBangumi() => $_clearField(3);\n  @$pb.TagNumber(3)\n  RelateBangumiCard ensureBangumi() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  RelateBangumiResourceCard get resource => $_getN(3);\n  @$pb.TagNumber(4)\n  set resource(RelateBangumiResourceCard value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasResource() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearResource() => $_clearField(4);\n  @$pb.TagNumber(4)\n  RelateBangumiResourceCard ensureResource() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  RelateGameCard get game => $_getN(4);\n  @$pb.TagNumber(5)\n  set game(RelateGameCard value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasGame() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearGame() => $_clearField(5);\n  @$pb.TagNumber(5)\n  RelateGameCard ensureGame() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  RelateCMCard get cm => $_getN(5);\n  @$pb.TagNumber(6)\n  set cm(RelateCMCard value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCm() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCm() => $_clearField(6);\n  @$pb.TagNumber(6)\n  RelateCMCard ensureCm() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  RelateLiveCard get live => $_getN(6);\n  @$pb.TagNumber(7)\n  set live(RelateLiveCard value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasLive() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearLive() => $_clearField(7);\n  @$pb.TagNumber(7)\n  RelateLiveCard ensureLive() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  RelateBangumiAvCard get bangumiAv => $_getN(7);\n  @$pb.TagNumber(8)\n  set bangumiAv(RelateBangumiAvCard value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasBangumiAv() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearBangumiAv() => $_clearField(8);\n  @$pb.TagNumber(8)\n  RelateBangumiAvCard ensureBangumiAv() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  RelatedAICard get aiCard => $_getN(8);\n  @$pb.TagNumber(9)\n  set aiCard(RelatedAICard value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasAiCard() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearAiCard() => $_clearField(9);\n  @$pb.TagNumber(9)\n  RelatedAICard ensureAiCard() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  RelateThreePoint get threePoint => $_getN(9);\n  @$pb.TagNumber(10)\n  set threePoint(RelateThreePoint value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasThreePoint() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearThreePoint() => $_clearField(10);\n  @$pb.TagNumber(10)\n  RelateThreePoint ensureThreePoint() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  $0.Any get cmStock => $_getN(10);\n  @$pb.TagNumber(11)\n  set cmStock($0.Any value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasCmStock() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearCmStock() => $_clearField(11);\n  @$pb.TagNumber(11)\n  $0.Any ensureCmStock() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  CardBasicInfo get basicInfo => $_getN(11);\n  @$pb.TagNumber(12)\n  set basicInfo(CardBasicInfo value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasBasicInfo() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearBasicInfo() => $_clearField(12);\n  @$pb.TagNumber(12)\n  CardBasicInfo ensureBasicInfo() => $_ensure(11);\n\n  @$pb.TagNumber(13)\n  RelateBangumiUGCCard get bangumiUgc => $_getN(12);\n  @$pb.TagNumber(13)\n  set bangumiUgc(RelateBangumiUGCCard value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasBangumiUgc() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearBangumiUgc() => $_clearField(13);\n  @$pb.TagNumber(13)\n  RelateBangumiUGCCard ensureBangumiUgc() => $_ensure(12);\n\n  @$pb.TagNumber(14)\n  RelateSpecial get special => $_getN(13);\n  @$pb.TagNumber(14)\n  set special(RelateSpecial value) => $_setField(14, value);\n  @$pb.TagNumber(14)\n  $core.bool hasSpecial() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearSpecial() => $_clearField(14);\n  @$pb.TagNumber(14)\n  RelateSpecial ensureSpecial() => $_ensure(13);\n\n  @$pb.TagNumber(15)\n  RelateCourseCard get course => $_getN(14);\n  @$pb.TagNumber(15)\n  set course(RelateCourseCard value) => $_setField(15, value);\n  @$pb.TagNumber(15)\n  $core.bool hasCourse() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearCourse() => $_clearField(15);\n  @$pb.TagNumber(15)\n  RelateCourseCard ensureCourse() => $_ensure(14);\n\n  @$pb.TagNumber(16)\n  RelateMiniProgramCard get miniProgram => $_getN(15);\n  @$pb.TagNumber(16)\n  set miniProgram(RelateMiniProgramCard value) => $_setField(16, value);\n  @$pb.TagNumber(16)\n  $core.bool hasMiniProgram() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearMiniProgram() => $_clearField(16);\n  @$pb.TagNumber(16)\n  RelateMiniProgramCard ensureMiniProgram() => $_ensure(15);\n\n  @$pb.TagNumber(17)\n  RelateHistoryAVCard get historyAv => $_getN(16);\n  @$pb.TagNumber(17)\n  set historyAv(RelateHistoryAVCard value) => $_setField(17, value);\n  @$pb.TagNumber(17)\n  $core.bool hasHistoryAv() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearHistoryAv() => $_clearField(17);\n  @$pb.TagNumber(17)\n  RelateHistoryAVCard ensureHistoryAv() => $_ensure(16);\n}\n\nclass RelateConfig extends $pb.GeneratedMessage {\n  factory RelateConfig({\n    $fixnum.Int64? validShowM,\n    $fixnum.Int64? validShowN,\n    $3.Pagination? pagination,\n    $core.bool? canLoadMore,\n    CoverDimension? dimension,\n  }) {\n    final result = create();\n    if (validShowM != null) result.validShowM = validShowM;\n    if (validShowN != null) result.validShowN = validShowN;\n    if (pagination != null) result.pagination = pagination;\n    if (canLoadMore != null) result.canLoadMore = canLoadMore;\n    if (dimension != null) result.dimension = dimension;\n    return result;\n  }\n\n  RelateConfig._();\n\n  factory RelateConfig.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RelateConfig.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RelateConfig',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'validShowM')\n    ..aInt64(2, _omitFieldNames ? '' : 'validShowN')\n    ..aOM<$3.Pagination>(3, _omitFieldNames ? '' : 'pagination',\n        subBuilder: $3.Pagination.create)\n    ..aOB(4, _omitFieldNames ? '' : 'canLoadMore')\n    ..aOM<CoverDimension>(5, _omitFieldNames ? '' : 'dimension',\n        subBuilder: CoverDimension.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateConfig clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateConfig copyWith(void Function(RelateConfig) updates) =>\n      super.copyWith((message) => updates(message as RelateConfig))\n          as RelateConfig;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RelateConfig create() => RelateConfig._();\n  @$core.override\n  RelateConfig createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RelateConfig getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RelateConfig>(create);\n  static RelateConfig? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get validShowM => $_getI64(0);\n  @$pb.TagNumber(1)\n  set validShowM($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasValidShowM() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearValidShowM() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get validShowN => $_getI64(1);\n  @$pb.TagNumber(2)\n  set validShowN($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasValidShowN() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearValidShowN() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $3.Pagination get pagination => $_getN(2);\n  @$pb.TagNumber(3)\n  set pagination($3.Pagination value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPagination() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPagination() => $_clearField(3);\n  @$pb.TagNumber(3)\n  $3.Pagination ensurePagination() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.bool get canLoadMore => $_getBF(3);\n  @$pb.TagNumber(4)\n  set canLoadMore($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCanLoadMore() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCanLoadMore() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  CoverDimension get dimension => $_getN(4);\n  @$pb.TagNumber(5)\n  set dimension(CoverDimension value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDimension() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDimension() => $_clearField(5);\n  @$pb.TagNumber(5)\n  CoverDimension ensureDimension() => $_ensure(4);\n}\n\nclass RelateCourseCard extends $pb.GeneratedMessage {\n  factory RelateCourseCard({\n    $fixnum.Int64? duration,\n    Stat? stat,\n    BadgeInfo? rcmdReason,\n    BadgeInfo? badgeInfo,\n    $core.int? style,\n    $core.bool? showRcmdStyle,\n  }) {\n    final result = create();\n    if (duration != null) result.duration = duration;\n    if (stat != null) result.stat = stat;\n    if (rcmdReason != null) result.rcmdReason = rcmdReason;\n    if (badgeInfo != null) result.badgeInfo = badgeInfo;\n    if (style != null) result.style = style;\n    if (showRcmdStyle != null) result.showRcmdStyle = showRcmdStyle;\n    return result;\n  }\n\n  RelateCourseCard._();\n\n  factory RelateCourseCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RelateCourseCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RelateCourseCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'duration')\n    ..aOM<Stat>(2, _omitFieldNames ? '' : 'stat', subBuilder: Stat.create)\n    ..aOM<BadgeInfo>(3, _omitFieldNames ? '' : 'rcmdReason',\n        subBuilder: BadgeInfo.create)\n    ..aOM<BadgeInfo>(4, _omitFieldNames ? '' : 'badgeInfo',\n        subBuilder: BadgeInfo.create)\n    ..aI(5, _omitFieldNames ? '' : 'style')\n    ..aOB(6, _omitFieldNames ? '' : 'showRcmdStyle')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateCourseCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateCourseCard copyWith(void Function(RelateCourseCard) updates) =>\n      super.copyWith((message) => updates(message as RelateCourseCard))\n          as RelateCourseCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RelateCourseCard create() => RelateCourseCard._();\n  @$core.override\n  RelateCourseCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RelateCourseCard getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RelateCourseCard>(create);\n  static RelateCourseCard? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get duration => $_getI64(0);\n  @$pb.TagNumber(1)\n  set duration($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDuration() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDuration() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  Stat get stat => $_getN(1);\n  @$pb.TagNumber(2)\n  set stat(Stat value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasStat() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearStat() => $_clearField(2);\n  @$pb.TagNumber(2)\n  Stat ensureStat() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  BadgeInfo get rcmdReason => $_getN(2);\n  @$pb.TagNumber(3)\n  set rcmdReason(BadgeInfo value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRcmdReason() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRcmdReason() => $_clearField(3);\n  @$pb.TagNumber(3)\n  BadgeInfo ensureRcmdReason() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  BadgeInfo get badgeInfo => $_getN(3);\n  @$pb.TagNumber(4)\n  set badgeInfo(BadgeInfo value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBadgeInfo() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBadgeInfo() => $_clearField(4);\n  @$pb.TagNumber(4)\n  BadgeInfo ensureBadgeInfo() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.int get style => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set style($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasStyle() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearStyle() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.bool get showRcmdStyle => $_getBF(5);\n  @$pb.TagNumber(6)\n  set showRcmdStyle($core.bool value) => $_setBool(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasShowRcmdStyle() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearShowRcmdStyle() => $_clearField(6);\n}\n\nclass RelateDislike extends $pb.GeneratedMessage {\n  factory RelateDislike({\n    $core.String? title,\n    $core.String? subTitle,\n    $core.String? closedSubTitle,\n    $core.String? pasteText,\n    $core.String? closedPasteText,\n    $core.Iterable<DislikeReasons>? dislikeReason,\n    $core.String? toast,\n    $core.String? closedToast,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (subTitle != null) result.subTitle = subTitle;\n    if (closedSubTitle != null) result.closedSubTitle = closedSubTitle;\n    if (pasteText != null) result.pasteText = pasteText;\n    if (closedPasteText != null) result.closedPasteText = closedPasteText;\n    if (dislikeReason != null) result.dislikeReason.addAll(dislikeReason);\n    if (toast != null) result.toast = toast;\n    if (closedToast != null) result.closedToast = closedToast;\n    return result;\n  }\n\n  RelateDislike._();\n\n  factory RelateDislike.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RelateDislike.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RelateDislike',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'subTitle')\n    ..aOS(3, _omitFieldNames ? '' : 'closedSubTitle')\n    ..aOS(4, _omitFieldNames ? '' : 'pasteText')\n    ..aOS(5, _omitFieldNames ? '' : 'closedPasteText')\n    ..pPM<DislikeReasons>(6, _omitFieldNames ? '' : 'dislikeReason',\n        subBuilder: DislikeReasons.create)\n    ..aOS(7, _omitFieldNames ? '' : 'toast')\n    ..aOS(8, _omitFieldNames ? '' : 'closedToast')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateDislike clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateDislike copyWith(void Function(RelateDislike) updates) =>\n      super.copyWith((message) => updates(message as RelateDislike))\n          as RelateDislike;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RelateDislike create() => RelateDislike._();\n  @$core.override\n  RelateDislike createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RelateDislike getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RelateDislike>(create);\n  static RelateDislike? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get subTitle => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set subTitle($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSubTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSubTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get closedSubTitle => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set closedSubTitle($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasClosedSubTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearClosedSubTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get pasteText => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set pasteText($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPasteText() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPasteText() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get closedPasteText => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set closedPasteText($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasClosedPasteText() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearClosedPasteText() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $pb.PbList<DislikeReasons> get dislikeReason => $_getList(5);\n\n  @$pb.TagNumber(7)\n  $core.String get toast => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set toast($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasToast() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearToast() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get closedToast => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set closedToast($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasClosedToast() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearClosedToast() => $_clearField(8);\n}\n\nclass RelateGameCard extends $pb.GeneratedMessage {\n  factory RelateGameCard({\n    $fixnum.Int64? reserveStatus,\n    $core.String? reserveStatusText,\n    $core.String? reserve,\n    $core.double? rating,\n    $core.String? tagName,\n    RankInfo? rankInfo,\n    Button? packInfo,\n    Button? notice,\n    PowerIconStyle? powerIconStyle,\n    $core.String? gameRcmdReason,\n    WikiInfo? wikiInfo,\n    BadgeInfo? badge,\n  }) {\n    final result = create();\n    if (reserveStatus != null) result.reserveStatus = reserveStatus;\n    if (reserveStatusText != null) result.reserveStatusText = reserveStatusText;\n    if (reserve != null) result.reserve = reserve;\n    if (rating != null) result.rating = rating;\n    if (tagName != null) result.tagName = tagName;\n    if (rankInfo != null) result.rankInfo = rankInfo;\n    if (packInfo != null) result.packInfo = packInfo;\n    if (notice != null) result.notice = notice;\n    if (powerIconStyle != null) result.powerIconStyle = powerIconStyle;\n    if (gameRcmdReason != null) result.gameRcmdReason = gameRcmdReason;\n    if (wikiInfo != null) result.wikiInfo = wikiInfo;\n    if (badge != null) result.badge = badge;\n    return result;\n  }\n\n  RelateGameCard._();\n\n  factory RelateGameCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RelateGameCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RelateGameCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'reserveStatus')\n    ..aOS(2, _omitFieldNames ? '' : 'reserveStatusText')\n    ..aOS(3, _omitFieldNames ? '' : 'reserve')\n    ..aD(4, _omitFieldNames ? '' : 'rating', fieldType: $pb.PbFieldType.OF)\n    ..aOS(5, _omitFieldNames ? '' : 'tagName')\n    ..aOM<RankInfo>(6, _omitFieldNames ? '' : 'rankInfo',\n        subBuilder: RankInfo.create)\n    ..aOM<Button>(7, _omitFieldNames ? '' : 'packInfo',\n        subBuilder: Button.create)\n    ..aOM<Button>(8, _omitFieldNames ? '' : 'notice', subBuilder: Button.create)\n    ..aOM<PowerIconStyle>(9, _omitFieldNames ? '' : 'powerIconStyle',\n        subBuilder: PowerIconStyle.create)\n    ..aOS(10, _omitFieldNames ? '' : 'gameRcmdReason')\n    ..aOM<WikiInfo>(11, _omitFieldNames ? '' : 'wikiInfo',\n        subBuilder: WikiInfo.create)\n    ..aOM<BadgeInfo>(12, _omitFieldNames ? '' : 'badge',\n        subBuilder: BadgeInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateGameCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateGameCard copyWith(void Function(RelateGameCard) updates) =>\n      super.copyWith((message) => updates(message as RelateGameCard))\n          as RelateGameCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RelateGameCard create() => RelateGameCard._();\n  @$core.override\n  RelateGameCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RelateGameCard getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RelateGameCard>(create);\n  static RelateGameCard? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get reserveStatus => $_getI64(0);\n  @$pb.TagNumber(1)\n  set reserveStatus($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasReserveStatus() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearReserveStatus() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get reserveStatusText => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set reserveStatusText($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasReserveStatusText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearReserveStatusText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get reserve => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set reserve($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasReserve() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearReserve() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.double get rating => $_getN(3);\n  @$pb.TagNumber(4)\n  set rating($core.double value) => $_setFloat(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasRating() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearRating() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get tagName => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set tagName($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasTagName() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearTagName() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  RankInfo get rankInfo => $_getN(5);\n  @$pb.TagNumber(6)\n  set rankInfo(RankInfo value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasRankInfo() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearRankInfo() => $_clearField(6);\n  @$pb.TagNumber(6)\n  RankInfo ensureRankInfo() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  Button get packInfo => $_getN(6);\n  @$pb.TagNumber(7)\n  set packInfo(Button value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasPackInfo() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearPackInfo() => $_clearField(7);\n  @$pb.TagNumber(7)\n  Button ensurePackInfo() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  Button get notice => $_getN(7);\n  @$pb.TagNumber(8)\n  set notice(Button value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasNotice() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearNotice() => $_clearField(8);\n  @$pb.TagNumber(8)\n  Button ensureNotice() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  PowerIconStyle get powerIconStyle => $_getN(8);\n  @$pb.TagNumber(9)\n  set powerIconStyle(PowerIconStyle value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasPowerIconStyle() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearPowerIconStyle() => $_clearField(9);\n  @$pb.TagNumber(9)\n  PowerIconStyle ensurePowerIconStyle() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  $core.String get gameRcmdReason => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set gameRcmdReason($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasGameRcmdReason() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearGameRcmdReason() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  WikiInfo get wikiInfo => $_getN(10);\n  @$pb.TagNumber(11)\n  set wikiInfo(WikiInfo value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasWikiInfo() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearWikiInfo() => $_clearField(11);\n  @$pb.TagNumber(11)\n  WikiInfo ensureWikiInfo() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  BadgeInfo get badge => $_getN(11);\n  @$pb.TagNumber(12)\n  set badge(BadgeInfo value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasBadge() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearBadge() => $_clearField(12);\n  @$pb.TagNumber(12)\n  BadgeInfo ensureBadge() => $_ensure(11);\n}\n\nclass RelateHistoryAVCard extends $pb.GeneratedMessage {\n  factory RelateHistoryAVCard({\n    $fixnum.Int64? duration,\n    $fixnum.Int64? progress,\n    $fixnum.Int64? unix,\n    $core.String? icon,\n  }) {\n    final result = create();\n    if (duration != null) result.duration = duration;\n    if (progress != null) result.progress = progress;\n    if (unix != null) result.unix = unix;\n    if (icon != null) result.icon = icon;\n    return result;\n  }\n\n  RelateHistoryAVCard._();\n\n  factory RelateHistoryAVCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RelateHistoryAVCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RelateHistoryAVCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'duration')\n    ..aInt64(2, _omitFieldNames ? '' : 'progress')\n    ..aInt64(3, _omitFieldNames ? '' : 'unix')\n    ..aOS(4, _omitFieldNames ? '' : 'icon')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateHistoryAVCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateHistoryAVCard copyWith(void Function(RelateHistoryAVCard) updates) =>\n      super.copyWith((message) => updates(message as RelateHistoryAVCard))\n          as RelateHistoryAVCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RelateHistoryAVCard create() => RelateHistoryAVCard._();\n  @$core.override\n  RelateHistoryAVCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RelateHistoryAVCard getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RelateHistoryAVCard>(create);\n  static RelateHistoryAVCard? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get duration => $_getI64(0);\n  @$pb.TagNumber(1)\n  set duration($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDuration() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDuration() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get progress => $_getI64(1);\n  @$pb.TagNumber(2)\n  set progress($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasProgress() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearProgress() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get unix => $_getI64(2);\n  @$pb.TagNumber(3)\n  set unix($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUnix() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUnix() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get icon => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set icon($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIcon() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIcon() => $_clearField(4);\n}\n\nclass RelateItem extends $pb.GeneratedMessage {\n  factory RelateItem({\n    $core.String? url,\n    $core.String? cover,\n    $core.bool? useDefaultBrowser,\n  }) {\n    final result = create();\n    if (url != null) result.url = url;\n    if (cover != null) result.cover = cover;\n    if (useDefaultBrowser != null) result.useDefaultBrowser = useDefaultBrowser;\n    return result;\n  }\n\n  RelateItem._();\n\n  factory RelateItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RelateItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RelateItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'url')\n    ..aOS(2, _omitFieldNames ? '' : 'cover')\n    ..aOB(3, _omitFieldNames ? '' : 'useDefaultBrowser')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateItem copyWith(void Function(RelateItem) updates) =>\n      super.copyWith((message) => updates(message as RelateItem)) as RelateItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RelateItem create() => RelateItem._();\n  @$core.override\n  RelateItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RelateItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RelateItem>(create);\n  static RelateItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get url => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set url($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUrl() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get cover => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cover($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCover() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCover() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get useDefaultBrowser => $_getBF(2);\n  @$pb.TagNumber(3)\n  set useDefaultBrowser($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUseDefaultBrowser() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUseDefaultBrowser() => $_clearField(3);\n}\n\nclass RelateLiveCard extends $pb.GeneratedMessage {\n  factory RelateLiveCard({\n    $fixnum.Int64? iconType,\n    $core.String? areaName,\n    $fixnum.Int64? watchedShow,\n    $fixnum.Int64? liveStatus,\n    BadgeInfo? rcmdReason,\n    $core.String? liveNewStyle,\n    StatInfo? statInfo,\n    $core.bool? showRcmdStyle,\n  }) {\n    final result = create();\n    if (iconType != null) result.iconType = iconType;\n    if (areaName != null) result.areaName = areaName;\n    if (watchedShow != null) result.watchedShow = watchedShow;\n    if (liveStatus != null) result.liveStatus = liveStatus;\n    if (rcmdReason != null) result.rcmdReason = rcmdReason;\n    if (liveNewStyle != null) result.liveNewStyle = liveNewStyle;\n    if (statInfo != null) result.statInfo = statInfo;\n    if (showRcmdStyle != null) result.showRcmdStyle = showRcmdStyle;\n    return result;\n  }\n\n  RelateLiveCard._();\n\n  factory RelateLiveCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RelateLiveCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RelateLiveCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'iconType')\n    ..aOS(2, _omitFieldNames ? '' : 'areaName')\n    ..aInt64(3, _omitFieldNames ? '' : 'watchedShow')\n    ..aInt64(4, _omitFieldNames ? '' : 'liveStatus')\n    ..aOM<BadgeInfo>(5, _omitFieldNames ? '' : 'rcmdReason',\n        subBuilder: BadgeInfo.create)\n    ..aOS(6, _omitFieldNames ? '' : 'liveNewStyle')\n    ..aOM<StatInfo>(7, _omitFieldNames ? '' : 'statInfo',\n        subBuilder: StatInfo.create)\n    ..aOB(8, _omitFieldNames ? '' : 'showRcmdStyle')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateLiveCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateLiveCard copyWith(void Function(RelateLiveCard) updates) =>\n      super.copyWith((message) => updates(message as RelateLiveCard))\n          as RelateLiveCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RelateLiveCard create() => RelateLiveCard._();\n  @$core.override\n  RelateLiveCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RelateLiveCard getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RelateLiveCard>(create);\n  static RelateLiveCard? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get iconType => $_getI64(0);\n  @$pb.TagNumber(1)\n  set iconType($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIconType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIconType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get areaName => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set areaName($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAreaName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAreaName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get watchedShow => $_getI64(2);\n  @$pb.TagNumber(3)\n  set watchedShow($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasWatchedShow() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearWatchedShow() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get liveStatus => $_getI64(3);\n  @$pb.TagNumber(4)\n  set liveStatus($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLiveStatus() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLiveStatus() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  BadgeInfo get rcmdReason => $_getN(4);\n  @$pb.TagNumber(5)\n  set rcmdReason(BadgeInfo value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasRcmdReason() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearRcmdReason() => $_clearField(5);\n  @$pb.TagNumber(5)\n  BadgeInfo ensureRcmdReason() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.String get liveNewStyle => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set liveNewStyle($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasLiveNewStyle() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearLiveNewStyle() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  StatInfo get statInfo => $_getN(6);\n  @$pb.TagNumber(7)\n  set statInfo(StatInfo value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasStatInfo() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearStatInfo() => $_clearField(7);\n  @$pb.TagNumber(7)\n  StatInfo ensureStatInfo() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  $core.bool get showRcmdStyle => $_getBF(7);\n  @$pb.TagNumber(8)\n  set showRcmdStyle($core.bool value) => $_setBool(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasShowRcmdStyle() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearShowRcmdStyle() => $_clearField(8);\n}\n\nclass RelateMiniProgramCard extends $pb.GeneratedMessage {\n  factory RelateMiniProgramCard({\n    Stat? stat,\n  }) {\n    final result = create();\n    if (stat != null) result.stat = stat;\n    return result;\n  }\n\n  RelateMiniProgramCard._();\n\n  factory RelateMiniProgramCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RelateMiniProgramCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RelateMiniProgramCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOM<Stat>(1, _omitFieldNames ? '' : 'stat', subBuilder: Stat.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateMiniProgramCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateMiniProgramCard copyWith(\n          void Function(RelateMiniProgramCard) updates) =>\n      super.copyWith((message) => updates(message as RelateMiniProgramCard))\n          as RelateMiniProgramCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RelateMiniProgramCard create() => RelateMiniProgramCard._();\n  @$core.override\n  RelateMiniProgramCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RelateMiniProgramCard getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RelateMiniProgramCard>(create);\n  static RelateMiniProgramCard? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Stat get stat => $_getN(0);\n  @$pb.TagNumber(1)\n  set stat(Stat value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStat() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStat() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Stat ensureStat() => $_ensure(0);\n}\n\nclass RelateSpecial extends $pb.GeneratedMessage {\n  factory RelateSpecial({\n    BadgeInfo? badge,\n    BadgeInfo? rcmdReason,\n    $core.bool? showRcmdStyle,\n  }) {\n    final result = create();\n    if (badge != null) result.badge = badge;\n    if (rcmdReason != null) result.rcmdReason = rcmdReason;\n    if (showRcmdStyle != null) result.showRcmdStyle = showRcmdStyle;\n    return result;\n  }\n\n  RelateSpecial._();\n\n  factory RelateSpecial.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RelateSpecial.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RelateSpecial',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOM<BadgeInfo>(1, _omitFieldNames ? '' : 'badge',\n        subBuilder: BadgeInfo.create)\n    ..aOM<BadgeInfo>(2, _omitFieldNames ? '' : 'rcmdReason',\n        subBuilder: BadgeInfo.create)\n    ..aOB(3, _omitFieldNames ? '' : 'showRcmdStyle')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateSpecial clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateSpecial copyWith(void Function(RelateSpecial) updates) =>\n      super.copyWith((message) => updates(message as RelateSpecial))\n          as RelateSpecial;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RelateSpecial create() => RelateSpecial._();\n  @$core.override\n  RelateSpecial createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RelateSpecial getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RelateSpecial>(create);\n  static RelateSpecial? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  BadgeInfo get badge => $_getN(0);\n  @$pb.TagNumber(1)\n  set badge(BadgeInfo value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBadge() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBadge() => $_clearField(1);\n  @$pb.TagNumber(1)\n  BadgeInfo ensureBadge() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  BadgeInfo get rcmdReason => $_getN(1);\n  @$pb.TagNumber(2)\n  set rcmdReason(BadgeInfo value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasRcmdReason() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRcmdReason() => $_clearField(2);\n  @$pb.TagNumber(2)\n  BadgeInfo ensureRcmdReason() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.bool get showRcmdStyle => $_getBF(2);\n  @$pb.TagNumber(3)\n  set showRcmdStyle($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasShowRcmdStyle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearShowRcmdStyle() => $_clearField(3);\n}\n\nclass RelateTab extends $pb.GeneratedMessage {\n  factory RelateTab({\n    $fixnum.Int64? tabCategory,\n    $core.String? title,\n  }) {\n    final result = create();\n    if (tabCategory != null) result.tabCategory = tabCategory;\n    if (title != null) result.title = title;\n    return result;\n  }\n\n  RelateTab._();\n\n  factory RelateTab.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RelateTab.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RelateTab',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'tabCategory')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateTab clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateTab copyWith(void Function(RelateTab) updates) =>\n      super.copyWith((message) => updates(message as RelateTab)) as RelateTab;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RelateTab create() => RelateTab._();\n  @$core.override\n  RelateTab createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RelateTab getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<RelateTab>(create);\n  static RelateTab? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get tabCategory => $_getI64(0);\n  @$pb.TagNumber(1)\n  set tabCategory($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTabCategory() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTabCategory() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n}\n\nclass RelateThreePoint extends $pb.GeneratedMessage {\n  factory RelateThreePoint({\n    RelateDislike? dislike,\n    RelateDislike? feedback,\n    $core.bool? watchLater,\n    $core.String? dislikeReportData,\n  }) {\n    final result = create();\n    if (dislike != null) result.dislike = dislike;\n    if (feedback != null) result.feedback = feedback;\n    if (watchLater != null) result.watchLater = watchLater;\n    if (dislikeReportData != null) result.dislikeReportData = dislikeReportData;\n    return result;\n  }\n\n  RelateThreePoint._();\n\n  factory RelateThreePoint.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RelateThreePoint.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RelateThreePoint',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOM<RelateDislike>(1, _omitFieldNames ? '' : 'dislike',\n        subBuilder: RelateDislike.create)\n    ..aOM<RelateDislike>(2, _omitFieldNames ? '' : 'feedback',\n        subBuilder: RelateDislike.create)\n    ..aOB(3, _omitFieldNames ? '' : 'watchLater')\n    ..aOS(4, _omitFieldNames ? '' : 'dislikeReportData')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateThreePoint clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateThreePoint copyWith(void Function(RelateThreePoint) updates) =>\n      super.copyWith((message) => updates(message as RelateThreePoint))\n          as RelateThreePoint;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RelateThreePoint create() => RelateThreePoint._();\n  @$core.override\n  RelateThreePoint createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RelateThreePoint getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RelateThreePoint>(create);\n  static RelateThreePoint? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  RelateDislike get dislike => $_getN(0);\n  @$pb.TagNumber(1)\n  set dislike(RelateDislike value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDislike() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDislike() => $_clearField(1);\n  @$pb.TagNumber(1)\n  RelateDislike ensureDislike() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  RelateDislike get feedback => $_getN(1);\n  @$pb.TagNumber(2)\n  set feedback(RelateDislike value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFeedback() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFeedback() => $_clearField(2);\n  @$pb.TagNumber(2)\n  RelateDislike ensureFeedback() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.bool get watchLater => $_getBF(2);\n  @$pb.TagNumber(3)\n  set watchLater($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasWatchLater() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearWatchLater() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get dislikeReportData => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set dislikeReportData($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDislikeReportData() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDislikeReportData() => $_clearField(4);\n}\n\nclass RelatedAICard extends $pb.GeneratedMessage {\n  factory RelatedAICard({\n    $fixnum.Int64? aid,\n    $fixnum.Int64? duration,\n    Staff? upInfo,\n    Stat? stat,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? report,\n    $core.String? gotoType,\n  }) {\n    final result = create();\n    if (aid != null) result.aid = aid;\n    if (duration != null) result.duration = duration;\n    if (upInfo != null) result.upInfo = upInfo;\n    if (stat != null) result.stat = stat;\n    if (report != null) result.report.addEntries(report);\n    if (gotoType != null) result.gotoType = gotoType;\n    return result;\n  }\n\n  RelatedAICard._();\n\n  factory RelatedAICard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RelatedAICard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RelatedAICard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'aid')\n    ..aInt64(2, _omitFieldNames ? '' : 'duration')\n    ..aOM<Staff>(3, _omitFieldNames ? '' : 'upInfo', subBuilder: Staff.create)\n    ..aOM<Stat>(4, _omitFieldNames ? '' : 'stat', subBuilder: Stat.create)\n    ..m<$core.String, $core.String>(5, _omitFieldNames ? '' : 'report',\n        entryClassName: 'RelatedAICard.ReportEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.viewunite.common'))\n    ..aOS(6, _omitFieldNames ? '' : 'gotoType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelatedAICard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelatedAICard copyWith(void Function(RelatedAICard) updates) =>\n      super.copyWith((message) => updates(message as RelatedAICard))\n          as RelatedAICard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RelatedAICard create() => RelatedAICard._();\n  @$core.override\n  RelatedAICard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RelatedAICard getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RelatedAICard>(create);\n  static RelatedAICard? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get aid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set aid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get duration => $_getI64(1);\n  @$pb.TagNumber(2)\n  set duration($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDuration() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDuration() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  Staff get upInfo => $_getN(2);\n  @$pb.TagNumber(3)\n  set upInfo(Staff value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUpInfo() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUpInfo() => $_clearField(3);\n  @$pb.TagNumber(3)\n  Staff ensureUpInfo() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  Stat get stat => $_getN(3);\n  @$pb.TagNumber(4)\n  set stat(Stat value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasStat() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearStat() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Stat ensureStat() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $pb.PbMap<$core.String, $core.String> get report => $_getMap(4);\n\n  @$pb.TagNumber(6)\n  $core.String get gotoType => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set gotoType($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasGotoType() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearGotoType() => $_clearField(6);\n}\n\nclass Relates extends $pb.GeneratedMessage {\n  factory Relates({\n    $core.Iterable<RelateCard>? cards,\n    RelateConfig? config,\n    $core.Iterable<RelateTab>? tab,\n  }) {\n    final result = create();\n    if (cards != null) result.cards.addAll(cards);\n    if (config != null) result.config = config;\n    if (tab != null) result.tab.addAll(tab);\n    return result;\n  }\n\n  Relates._();\n\n  factory Relates.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Relates.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Relates',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..pPM<RelateCard>(1, _omitFieldNames ? '' : 'cards',\n        subBuilder: RelateCard.create)\n    ..aOM<RelateConfig>(2, _omitFieldNames ? '' : 'config',\n        subBuilder: RelateConfig.create)\n    ..pPM<RelateTab>(3, _omitFieldNames ? '' : 'tab',\n        subBuilder: RelateTab.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Relates clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Relates copyWith(void Function(Relates) updates) =>\n      super.copyWith((message) => updates(message as Relates)) as Relates;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Relates create() => Relates._();\n  @$core.override\n  Relates createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Relates getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Relates>(create);\n  static Relates? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<RelateCard> get cards => $_getList(0);\n\n  @$pb.TagNumber(2)\n  RelateConfig get config => $_getN(1);\n  @$pb.TagNumber(2)\n  set config(RelateConfig value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasConfig() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearConfig() => $_clearField(2);\n  @$pb.TagNumber(2)\n  RelateConfig ensureConfig() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<RelateTab> get tab => $_getList(2);\n}\n\nenum ReserveButton_OrderParam { reserve, fav, notSet }\n\nclass ReserveButton extends $pb.GeneratedMessage {\n  factory ReserveButton({\n    $core.bool? status,\n    $core.String? text,\n    $core.String? selectedText,\n    ReserveBizType? orderType,\n    BizReserveActivityParam? reserve,\n    BizFavParam? fav,\n  }) {\n    final result = create();\n    if (status != null) result.status = status;\n    if (text != null) result.text = text;\n    if (selectedText != null) result.selectedText = selectedText;\n    if (orderType != null) result.orderType = orderType;\n    if (reserve != null) result.reserve = reserve;\n    if (fav != null) result.fav = fav;\n    return result;\n  }\n\n  ReserveButton._();\n\n  factory ReserveButton.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReserveButton.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, ReserveButton_OrderParam>\n      _ReserveButton_OrderParamByTag = {\n    8: ReserveButton_OrderParam.reserve,\n    9: ReserveButton_OrderParam.fav,\n    0: ReserveButton_OrderParam.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReserveButton',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..oo(0, [8, 9])\n    ..aOB(1, _omitFieldNames ? '' : 'status')\n    ..aOS(3, _omitFieldNames ? '' : 'text')\n    ..aOS(4, _omitFieldNames ? '' : 'selectedText')\n    ..aE<ReserveBizType>(7, _omitFieldNames ? '' : 'orderType',\n        enumValues: ReserveBizType.values)\n    ..aOM<BizReserveActivityParam>(8, _omitFieldNames ? '' : 'reserve',\n        subBuilder: BizReserveActivityParam.create)\n    ..aOM<BizFavParam>(9, _omitFieldNames ? '' : 'fav',\n        subBuilder: BizFavParam.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReserveButton clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReserveButton copyWith(void Function(ReserveButton) updates) =>\n      super.copyWith((message) => updates(message as ReserveButton))\n          as ReserveButton;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReserveButton create() => ReserveButton._();\n  @$core.override\n  ReserveButton createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReserveButton getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReserveButton>(create);\n  static ReserveButton? _defaultInstance;\n\n  @$pb.TagNumber(8)\n  @$pb.TagNumber(9)\n  ReserveButton_OrderParam whichOrderParam() =>\n      _ReserveButton_OrderParamByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(8)\n  @$pb.TagNumber(9)\n  void clearOrderParam() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  $core.bool get status => $_getBF(0);\n  @$pb.TagNumber(1)\n  set status($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStatus() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStatus() => $_clearField(1);\n\n  @$pb.TagNumber(3)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(3)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(3)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(3)\n  void clearText() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get selectedText => $_getSZ(2);\n  @$pb.TagNumber(4)\n  set selectedText($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSelectedText() => $_has(2);\n  @$pb.TagNumber(4)\n  void clearSelectedText() => $_clearField(4);\n\n  @$pb.TagNumber(7)\n  ReserveBizType get orderType => $_getN(3);\n  @$pb.TagNumber(7)\n  set orderType(ReserveBizType value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasOrderType() => $_has(3);\n  @$pb.TagNumber(7)\n  void clearOrderType() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  BizReserveActivityParam get reserve => $_getN(4);\n  @$pb.TagNumber(8)\n  set reserve(BizReserveActivityParam value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasReserve() => $_has(4);\n  @$pb.TagNumber(8)\n  void clearReserve() => $_clearField(8);\n  @$pb.TagNumber(8)\n  BizReserveActivityParam ensureReserve() => $_ensure(4);\n\n  @$pb.TagNumber(9)\n  BizFavParam get fav => $_getN(5);\n  @$pb.TagNumber(9)\n  set fav(BizFavParam value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasFav() => $_has(5);\n  @$pb.TagNumber(9)\n  void clearFav() => $_clearField(9);\n  @$pb.TagNumber(9)\n  BizFavParam ensureFav() => $_ensure(5);\n}\n\nclass ReserveCalendarInfo extends $pb.GeneratedMessage {\n  factory ReserveCalendarInfo({\n    $core.String? title,\n    $fixnum.Int64? startTs,\n    $fixnum.Int64? endTs,\n    $core.String? description,\n    $core.String? businessId,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (startTs != null) result.startTs = startTs;\n    if (endTs != null) result.endTs = endTs;\n    if (description != null) result.description = description;\n    if (businessId != null) result.businessId = businessId;\n    return result;\n  }\n\n  ReserveCalendarInfo._();\n\n  factory ReserveCalendarInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReserveCalendarInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReserveCalendarInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aInt64(2, _omitFieldNames ? '' : 'startTs')\n    ..aInt64(3, _omitFieldNames ? '' : 'endTs')\n    ..aOS(4, _omitFieldNames ? '' : 'description')\n    ..aOS(5, _omitFieldNames ? '' : 'businessId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReserveCalendarInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReserveCalendarInfo copyWith(void Function(ReserveCalendarInfo) updates) =>\n      super.copyWith((message) => updates(message as ReserveCalendarInfo))\n          as ReserveCalendarInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReserveCalendarInfo create() => ReserveCalendarInfo._();\n  @$core.override\n  ReserveCalendarInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReserveCalendarInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReserveCalendarInfo>(create);\n  static ReserveCalendarInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get startTs => $_getI64(1);\n  @$pb.TagNumber(2)\n  set startTs($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasStartTs() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearStartTs() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get endTs => $_getI64(2);\n  @$pb.TagNumber(3)\n  set endTs($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasEndTs() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearEndTs() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get description => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set description($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDescription() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDescription() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get businessId => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set businessId($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBusinessId() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBusinessId() => $_clearField(5);\n}\n\nclass Rights extends $pb.GeneratedMessage {\n  factory Rights({\n    $core.int? allowDownload,\n    $core.int? allowReview,\n    $core.int? canWatch,\n    $core.String? resource,\n    $core.int? allowDm,\n    $core.int? allowDemand,\n    $core.int? areaLimit,\n  }) {\n    final result = create();\n    if (allowDownload != null) result.allowDownload = allowDownload;\n    if (allowReview != null) result.allowReview = allowReview;\n    if (canWatch != null) result.canWatch = canWatch;\n    if (resource != null) result.resource = resource;\n    if (allowDm != null) result.allowDm = allowDm;\n    if (allowDemand != null) result.allowDemand = allowDemand;\n    if (areaLimit != null) result.areaLimit = areaLimit;\n    return result;\n  }\n\n  Rights._();\n\n  factory Rights.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Rights.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Rights',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'allowDownload')\n    ..aI(2, _omitFieldNames ? '' : 'allowReview')\n    ..aI(3, _omitFieldNames ? '' : 'canWatch')\n    ..aOS(4, _omitFieldNames ? '' : 'resource')\n    ..aI(5, _omitFieldNames ? '' : 'allowDm')\n    ..aI(6, _omitFieldNames ? '' : 'allowDemand')\n    ..aI(7, _omitFieldNames ? '' : 'areaLimit')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Rights clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Rights copyWith(void Function(Rights) updates) =>\n      super.copyWith((message) => updates(message as Rights)) as Rights;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Rights create() => Rights._();\n  @$core.override\n  Rights createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Rights getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Rights>(create);\n  static Rights? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get allowDownload => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set allowDownload($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAllowDownload() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAllowDownload() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get allowReview => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set allowReview($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAllowReview() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAllowReview() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get canWatch => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set canWatch($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCanWatch() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCanWatch() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get resource => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set resource($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasResource() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearResource() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get allowDm => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set allowDm($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasAllowDm() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearAllowDm() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get allowDemand => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set allowDemand($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasAllowDemand() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearAllowDemand() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get areaLimit => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set areaLimit($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasAreaLimit() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearAreaLimit() => $_clearField(7);\n}\n\nclass SeasonHead extends $pb.GeneratedMessage {\n  factory SeasonHead({\n    $core.String? title,\n    $core.String? intro,\n    StatInfo? vt,\n    StatInfo? danmaku,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (intro != null) result.intro = intro;\n    if (vt != null) result.vt = vt;\n    if (danmaku != null) result.danmaku = danmaku;\n    return result;\n  }\n\n  SeasonHead._();\n\n  factory SeasonHead.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SeasonHead.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SeasonHead',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'intro')\n    ..aOM<StatInfo>(3, _omitFieldNames ? '' : 'vt', subBuilder: StatInfo.create)\n    ..aOM<StatInfo>(4, _omitFieldNames ? '' : 'danmaku',\n        subBuilder: StatInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SeasonHead clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SeasonHead copyWith(void Function(SeasonHead) updates) =>\n      super.copyWith((message) => updates(message as SeasonHead)) as SeasonHead;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SeasonHead create() => SeasonHead._();\n  @$core.override\n  SeasonHead createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SeasonHead getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SeasonHead>(create);\n  static SeasonHead? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get intro => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set intro($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIntro() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIntro() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  StatInfo get vt => $_getN(2);\n  @$pb.TagNumber(3)\n  set vt(StatInfo value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasVt() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearVt() => $_clearField(3);\n  @$pb.TagNumber(3)\n  StatInfo ensureVt() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  StatInfo get danmaku => $_getN(3);\n  @$pb.TagNumber(4)\n  set danmaku(StatInfo value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDanmaku() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDanmaku() => $_clearField(4);\n  @$pb.TagNumber(4)\n  StatInfo ensureDanmaku() => $_ensure(3);\n}\n\nclass SeasonShow extends $pb.GeneratedMessage {\n  factory SeasonShow({\n    $core.String? buttonText,\n    $core.String? joinText,\n    $core.String? ruleText,\n    $core.String? checkinText,\n    $core.String? checkinPrompt,\n  }) {\n    final result = create();\n    if (buttonText != null) result.buttonText = buttonText;\n    if (joinText != null) result.joinText = joinText;\n    if (ruleText != null) result.ruleText = ruleText;\n    if (checkinText != null) result.checkinText = checkinText;\n    if (checkinPrompt != null) result.checkinPrompt = checkinPrompt;\n    return result;\n  }\n\n  SeasonShow._();\n\n  factory SeasonShow.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SeasonShow.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SeasonShow',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'buttonText')\n    ..aOS(2, _omitFieldNames ? '' : 'joinText')\n    ..aOS(3, _omitFieldNames ? '' : 'ruleText')\n    ..aOS(4, _omitFieldNames ? '' : 'checkinText')\n    ..aOS(5, _omitFieldNames ? '' : 'checkinPrompt')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SeasonShow clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SeasonShow copyWith(void Function(SeasonShow) updates) =>\n      super.copyWith((message) => updates(message as SeasonShow)) as SeasonShow;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SeasonShow create() => SeasonShow._();\n  @$core.override\n  SeasonShow createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SeasonShow getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SeasonShow>(create);\n  static SeasonShow? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get buttonText => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set buttonText($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasButtonText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearButtonText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get joinText => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set joinText($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasJoinText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearJoinText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get ruleText => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set ruleText($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRuleText() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRuleText() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get checkinText => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set checkinText($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCheckinText() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCheckinText() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get checkinPrompt => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set checkinPrompt($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCheckinPrompt() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCheckinPrompt() => $_clearField(5);\n}\n\nclass SectionData extends $pb.GeneratedMessage {\n  factory SectionData({\n    $core.int? id,\n    $core.int? sectionId,\n    $core.String? title,\n    $core.int? canOrdDesc,\n    $core.String? more,\n    $core.Iterable<$core.int>? episodeIds,\n    $core.Iterable<ViewEpisode>? episodes,\n    $core.String? splitText,\n    Style? moduleStyle,\n    $core.String? moreBottomDesc,\n    $core.Iterable<SerialSeason>? seasons,\n    Button? moreLeft,\n    $core.int? type,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? report,\n    EpBgInfo? bgInfo,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (sectionId != null) result.sectionId = sectionId;\n    if (title != null) result.title = title;\n    if (canOrdDesc != null) result.canOrdDesc = canOrdDesc;\n    if (more != null) result.more = more;\n    if (episodeIds != null) result.episodeIds.addAll(episodeIds);\n    if (episodes != null) result.episodes.addAll(episodes);\n    if (splitText != null) result.splitText = splitText;\n    if (moduleStyle != null) result.moduleStyle = moduleStyle;\n    if (moreBottomDesc != null) result.moreBottomDesc = moreBottomDesc;\n    if (seasons != null) result.seasons.addAll(seasons);\n    if (moreLeft != null) result.moreLeft = moreLeft;\n    if (type != null) result.type = type;\n    if (report != null) result.report.addEntries(report);\n    if (bgInfo != null) result.bgInfo = bgInfo;\n    return result;\n  }\n\n  SectionData._();\n\n  factory SectionData.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SectionData.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SectionData',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'id')\n    ..aI(2, _omitFieldNames ? '' : 'sectionId')\n    ..aOS(3, _omitFieldNames ? '' : 'title')\n    ..aI(4, _omitFieldNames ? '' : 'canOrdDesc')\n    ..aOS(5, _omitFieldNames ? '' : 'more')\n    ..p<$core.int>(6, _omitFieldNames ? '' : 'episodeIds', $pb.PbFieldType.K3)\n    ..pPM<ViewEpisode>(7, _omitFieldNames ? '' : 'episodes',\n        subBuilder: ViewEpisode.create)\n    ..aOS(8, _omitFieldNames ? '' : 'splitText')\n    ..aOM<Style>(9, _omitFieldNames ? '' : 'moduleStyle',\n        subBuilder: Style.create)\n    ..aOS(10, _omitFieldNames ? '' : 'moreBottomDesc')\n    ..pPM<SerialSeason>(11, _omitFieldNames ? '' : 'seasons',\n        subBuilder: SerialSeason.create)\n    ..aOM<Button>(12, _omitFieldNames ? '' : 'moreLeft',\n        subBuilder: Button.create)\n    ..aI(13, _omitFieldNames ? '' : 'type')\n    ..m<$core.String, $core.String>(14, _omitFieldNames ? '' : 'report',\n        entryClassName: 'SectionData.ReportEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.viewunite.common'))\n    ..aOM<EpBgInfo>(15, _omitFieldNames ? '' : 'bgInfo',\n        subBuilder: EpBgInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SectionData clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SectionData copyWith(void Function(SectionData) updates) =>\n      super.copyWith((message) => updates(message as SectionData))\n          as SectionData;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SectionData create() => SectionData._();\n  @$core.override\n  SectionData createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SectionData getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SectionData>(create);\n  static SectionData? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get id => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set id($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get sectionId => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set sectionId($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSectionId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSectionId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get title => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set title($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get canOrdDesc => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set canOrdDesc($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCanOrdDesc() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCanOrdDesc() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get more => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set more($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasMore() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearMore() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $pb.PbList<$core.int> get episodeIds => $_getList(5);\n\n  @$pb.TagNumber(7)\n  $pb.PbList<ViewEpisode> get episodes => $_getList(6);\n\n  @$pb.TagNumber(8)\n  $core.String get splitText => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set splitText($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasSplitText() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearSplitText() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  Style get moduleStyle => $_getN(8);\n  @$pb.TagNumber(9)\n  set moduleStyle(Style value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasModuleStyle() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearModuleStyle() => $_clearField(9);\n  @$pb.TagNumber(9)\n  Style ensureModuleStyle() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  $core.String get moreBottomDesc => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set moreBottomDesc($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasMoreBottomDesc() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearMoreBottomDesc() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $pb.PbList<SerialSeason> get seasons => $_getList(10);\n\n  @$pb.TagNumber(12)\n  Button get moreLeft => $_getN(11);\n  @$pb.TagNumber(12)\n  set moreLeft(Button value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasMoreLeft() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearMoreLeft() => $_clearField(12);\n  @$pb.TagNumber(12)\n  Button ensureMoreLeft() => $_ensure(11);\n\n  @$pb.TagNumber(13)\n  $core.int get type => $_getIZ(12);\n  @$pb.TagNumber(13)\n  set type($core.int value) => $_setSignedInt32(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasType() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearType() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $pb.PbMap<$core.String, $core.String> get report => $_getMap(13);\n\n  @$pb.TagNumber(15)\n  EpBgInfo get bgInfo => $_getN(14);\n  @$pb.TagNumber(15)\n  set bgInfo(EpBgInfo value) => $_setField(15, value);\n  @$pb.TagNumber(15)\n  $core.bool hasBgInfo() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearBgInfo() => $_clearField(15);\n  @$pb.TagNumber(15)\n  EpBgInfo ensureBgInfo() => $_ensure(14);\n}\n\nclass SerialSeason extends $pb.GeneratedMessage {\n  factory SerialSeason({\n    $core.int? seasonId,\n    $core.String? title,\n    $core.String? seasonTitle,\n    $core.int? isNew,\n    $core.String? cover,\n    $core.String? badge,\n    $core.int? badgeType,\n    BadgeInfo? badgeInfo,\n    $core.String? link,\n    $core.String? resource,\n    NewEp? newEp,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? report,\n  }) {\n    final result = create();\n    if (seasonId != null) result.seasonId = seasonId;\n    if (title != null) result.title = title;\n    if (seasonTitle != null) result.seasonTitle = seasonTitle;\n    if (isNew != null) result.isNew = isNew;\n    if (cover != null) result.cover = cover;\n    if (badge != null) result.badge = badge;\n    if (badgeType != null) result.badgeType = badgeType;\n    if (badgeInfo != null) result.badgeInfo = badgeInfo;\n    if (link != null) result.link = link;\n    if (resource != null) result.resource = resource;\n    if (newEp != null) result.newEp = newEp;\n    if (report != null) result.report.addEntries(report);\n    return result;\n  }\n\n  SerialSeason._();\n\n  factory SerialSeason.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SerialSeason.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SerialSeason',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'seasonId')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'seasonTitle')\n    ..aI(4, _omitFieldNames ? '' : 'isNew')\n    ..aOS(5, _omitFieldNames ? '' : 'cover')\n    ..aOS(6, _omitFieldNames ? '' : 'badge')\n    ..aI(7, _omitFieldNames ? '' : 'badgeType')\n    ..aOM<BadgeInfo>(8, _omitFieldNames ? '' : 'badgeInfo',\n        subBuilder: BadgeInfo.create)\n    ..aOS(9, _omitFieldNames ? '' : 'link')\n    ..aOS(10, _omitFieldNames ? '' : 'resource')\n    ..aOM<NewEp>(11, _omitFieldNames ? '' : 'newEp', subBuilder: NewEp.create)\n    ..m<$core.String, $core.String>(12, _omitFieldNames ? '' : 'report',\n        entryClassName: 'SerialSeason.ReportEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.viewunite.common'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SerialSeason clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SerialSeason copyWith(void Function(SerialSeason) updates) =>\n      super.copyWith((message) => updates(message as SerialSeason))\n          as SerialSeason;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SerialSeason create() => SerialSeason._();\n  @$core.override\n  SerialSeason createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SerialSeason getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SerialSeason>(create);\n  static SerialSeason? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get seasonId => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set seasonId($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSeasonId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSeasonId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get seasonTitle => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set seasonTitle($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSeasonTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSeasonTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get isNew => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set isNew($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIsNew() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIsNew() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get cover => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set cover($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCover() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCover() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get badge => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set badge($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasBadge() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearBadge() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get badgeType => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set badgeType($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBadgeType() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBadgeType() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  BadgeInfo get badgeInfo => $_getN(7);\n  @$pb.TagNumber(8)\n  set badgeInfo(BadgeInfo value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasBadgeInfo() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearBadgeInfo() => $_clearField(8);\n  @$pb.TagNumber(8)\n  BadgeInfo ensureBadgeInfo() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  $core.String get link => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set link($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasLink() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearLink() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get resource => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set resource($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasResource() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearResource() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  NewEp get newEp => $_getN(10);\n  @$pb.TagNumber(11)\n  set newEp(NewEp value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasNewEp() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearNewEp() => $_clearField(11);\n  @$pb.TagNumber(11)\n  NewEp ensureNewEp() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  $pb.PbMap<$core.String, $core.String> get report => $_getMap(11);\n}\n\nclass SkipRange extends $pb.GeneratedMessage {\n  factory SkipRange({\n    $core.int? start,\n    $core.int? end,\n  }) {\n    final result = create();\n    if (start != null) result.start = start;\n    if (end != null) result.end = end;\n    return result;\n  }\n\n  SkipRange._();\n\n  factory SkipRange.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SkipRange.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SkipRange',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'start')\n    ..aI(2, _omitFieldNames ? '' : 'end')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SkipRange clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SkipRange copyWith(void Function(SkipRange) updates) =>\n      super.copyWith((message) => updates(message as SkipRange)) as SkipRange;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SkipRange create() => SkipRange._();\n  @$core.override\n  SkipRange createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SkipRange getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<SkipRange>(create);\n  static SkipRange? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get start => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set start($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStart() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStart() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get end => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set end($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasEnd() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearEnd() => $_clearField(2);\n}\n\nclass SpecialCell extends $pb.GeneratedMessage {\n  factory SpecialCell({\n    $core.String? icon,\n    $core.String? iconNight,\n    $core.String? text,\n    $core.String? textColor,\n    $core.String? textColorNight,\n    $core.String? jumpUrl,\n    $core.String? cellType,\n    $core.String? cellBgcolor,\n    $core.String? cellBgcolorNight,\n    $core.String? param,\n    $core.String? pageTitle,\n    $core.String? jumpType,\n    $core.String? endIcon,\n    $core.String? endIconNight,\n    CellFluid? cellFluid,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? report,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (iconNight != null) result.iconNight = iconNight;\n    if (text != null) result.text = text;\n    if (textColor != null) result.textColor = textColor;\n    if (textColorNight != null) result.textColorNight = textColorNight;\n    if (jumpUrl != null) result.jumpUrl = jumpUrl;\n    if (cellType != null) result.cellType = cellType;\n    if (cellBgcolor != null) result.cellBgcolor = cellBgcolor;\n    if (cellBgcolorNight != null) result.cellBgcolorNight = cellBgcolorNight;\n    if (param != null) result.param = param;\n    if (pageTitle != null) result.pageTitle = pageTitle;\n    if (jumpType != null) result.jumpType = jumpType;\n    if (endIcon != null) result.endIcon = endIcon;\n    if (endIconNight != null) result.endIconNight = endIconNight;\n    if (cellFluid != null) result.cellFluid = cellFluid;\n    if (report != null) result.report.addEntries(report);\n    return result;\n  }\n\n  SpecialCell._();\n\n  factory SpecialCell.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SpecialCell.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SpecialCell',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'iconNight')\n    ..aOS(3, _omitFieldNames ? '' : 'text')\n    ..aOS(4, _omitFieldNames ? '' : 'textColor')\n    ..aOS(5, _omitFieldNames ? '' : 'textColorNight')\n    ..aOS(6, _omitFieldNames ? '' : 'jumpUrl')\n    ..aOS(7, _omitFieldNames ? '' : 'cellType')\n    ..aOS(8, _omitFieldNames ? '' : 'cellBgcolor')\n    ..aOS(9, _omitFieldNames ? '' : 'cellBgcolorNight')\n    ..aOS(10, _omitFieldNames ? '' : 'param')\n    ..aOS(11, _omitFieldNames ? '' : 'pageTitle')\n    ..aOS(12, _omitFieldNames ? '' : 'jumpType')\n    ..aOS(13, _omitFieldNames ? '' : 'endIcon')\n    ..aOS(14, _omitFieldNames ? '' : 'endIconNight')\n    ..aOM<CellFluid>(15, _omitFieldNames ? '' : 'cellFluid',\n        subBuilder: CellFluid.create)\n    ..m<$core.String, $core.String>(16, _omitFieldNames ? '' : 'report',\n        entryClassName: 'SpecialCell.ReportEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.viewunite.common'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SpecialCell clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SpecialCell copyWith(void Function(SpecialCell) updates) =>\n      super.copyWith((message) => updates(message as SpecialCell))\n          as SpecialCell;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SpecialCell create() => SpecialCell._();\n  @$core.override\n  SpecialCell createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SpecialCell getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SpecialCell>(create);\n  static SpecialCell? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get iconNight => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set iconNight($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIconNight() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIconNight() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get text => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set text($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasText() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearText() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get textColor => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set textColor($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTextColor() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTextColor() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get textColorNight => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set textColorNight($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasTextColorNight() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearTextColorNight() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get jumpUrl => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set jumpUrl($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasJumpUrl() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearJumpUrl() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get cellType => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set cellType($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCellType() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCellType() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get cellBgcolor => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set cellBgcolor($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasCellBgcolor() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearCellBgcolor() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get cellBgcolorNight => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set cellBgcolorNight($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasCellBgcolorNight() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearCellBgcolorNight() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get param => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set param($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasParam() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearParam() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get pageTitle => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set pageTitle($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasPageTitle() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearPageTitle() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get jumpType => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set jumpType($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasJumpType() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearJumpType() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.String get endIcon => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set endIcon($core.String value) => $_setString(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasEndIcon() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearEndIcon() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.String get endIconNight => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set endIconNight($core.String value) => $_setString(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasEndIconNight() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearEndIconNight() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  CellFluid get cellFluid => $_getN(14);\n  @$pb.TagNumber(15)\n  set cellFluid(CellFluid value) => $_setField(15, value);\n  @$pb.TagNumber(15)\n  $core.bool hasCellFluid() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearCellFluid() => $_clearField(15);\n  @$pb.TagNumber(15)\n  CellFluid ensureCellFluid() => $_ensure(14);\n\n  @$pb.TagNumber(16)\n  $pb.PbMap<$core.String, $core.String> get report => $_getMap(15);\n}\n\nclass SpecialTag extends $pb.GeneratedMessage {\n  factory SpecialTag({\n    $core.Iterable<SpecialCell>? specialCell,\n    $core.bool? refresh,\n  }) {\n    final result = create();\n    if (specialCell != null) result.specialCell.addAll(specialCell);\n    if (refresh != null) result.refresh = refresh;\n    return result;\n  }\n\n  SpecialTag._();\n\n  factory SpecialTag.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SpecialTag.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SpecialTag',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..pPM<SpecialCell>(1, _omitFieldNames ? '' : 'specialCell',\n        subBuilder: SpecialCell.create)\n    ..aOB(2, _omitFieldNames ? '' : 'refresh')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SpecialTag clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SpecialTag copyWith(void Function(SpecialTag) updates) =>\n      super.copyWith((message) => updates(message as SpecialTag)) as SpecialTag;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SpecialTag create() => SpecialTag._();\n  @$core.override\n  SpecialTag createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SpecialTag getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SpecialTag>(create);\n  static SpecialTag? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<SpecialCell> get specialCell => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.bool get refresh => $_getBF(1);\n  @$pb.TagNumber(2)\n  set refresh($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasRefresh() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRefresh() => $_clearField(2);\n}\n\nclass Sponsor extends $pb.GeneratedMessage {\n  factory Sponsor({\n    $fixnum.Int64? total,\n    $fixnum.Int64? week,\n    $core.Iterable<SponsorRank>? rankList,\n    Mine? mine,\n    PointActivity? pointActivity,\n    $core.Iterable<Pendant>? pendants,\n    $core.Iterable<Threshold>? threshold,\n  }) {\n    final result = create();\n    if (total != null) result.total = total;\n    if (week != null) result.week = week;\n    if (rankList != null) result.rankList.addAll(rankList);\n    if (mine != null) result.mine = mine;\n    if (pointActivity != null) result.pointActivity = pointActivity;\n    if (pendants != null) result.pendants.addAll(pendants);\n    if (threshold != null) result.threshold.addAll(threshold);\n    return result;\n  }\n\n  Sponsor._();\n\n  factory Sponsor.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Sponsor.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Sponsor',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'total')\n    ..aInt64(2, _omitFieldNames ? '' : 'week')\n    ..pPM<SponsorRank>(3, _omitFieldNames ? '' : 'rankList',\n        subBuilder: SponsorRank.create)\n    ..aOM<Mine>(4, _omitFieldNames ? '' : 'mine', subBuilder: Mine.create)\n    ..aOM<PointActivity>(5, _omitFieldNames ? '' : 'pointActivity',\n        subBuilder: PointActivity.create)\n    ..pPM<Pendant>(6, _omitFieldNames ? '' : 'pendants',\n        subBuilder: Pendant.create)\n    ..pPM<Threshold>(7, _omitFieldNames ? '' : 'threshold',\n        subBuilder: Threshold.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Sponsor clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Sponsor copyWith(void Function(Sponsor) updates) =>\n      super.copyWith((message) => updates(message as Sponsor)) as Sponsor;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Sponsor create() => Sponsor._();\n  @$core.override\n  Sponsor createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Sponsor getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Sponsor>(create);\n  static Sponsor? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get total => $_getI64(0);\n  @$pb.TagNumber(1)\n  set total($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTotal() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTotal() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get week => $_getI64(1);\n  @$pb.TagNumber(2)\n  set week($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasWeek() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearWeek() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<SponsorRank> get rankList => $_getList(2);\n\n  @$pb.TagNumber(4)\n  Mine get mine => $_getN(3);\n  @$pb.TagNumber(4)\n  set mine(Mine value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasMine() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearMine() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Mine ensureMine() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  PointActivity get pointActivity => $_getN(4);\n  @$pb.TagNumber(5)\n  set pointActivity(PointActivity value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPointActivity() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPointActivity() => $_clearField(5);\n  @$pb.TagNumber(5)\n  PointActivity ensurePointActivity() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $pb.PbList<Pendant> get pendants => $_getList(5);\n\n  @$pb.TagNumber(7)\n  $pb.PbList<Threshold> get threshold => $_getList(6);\n}\n\nclass SponsorRank extends $pb.GeneratedMessage {\n  factory SponsorRank({\n    $fixnum.Int64? uid,\n    $core.String? msg,\n    $core.String? uname,\n    $core.String? face,\n    Vip? vip,\n  }) {\n    final result = create();\n    if (uid != null) result.uid = uid;\n    if (msg != null) result.msg = msg;\n    if (uname != null) result.uname = uname;\n    if (face != null) result.face = face;\n    if (vip != null) result.vip = vip;\n    return result;\n  }\n\n  SponsorRank._();\n\n  factory SponsorRank.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SponsorRank.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SponsorRank',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'uid')\n    ..aOS(2, _omitFieldNames ? '' : 'msg')\n    ..aOS(3, _omitFieldNames ? '' : 'uname')\n    ..aOS(4, _omitFieldNames ? '' : 'face')\n    ..aOM<Vip>(5, _omitFieldNames ? '' : 'vip', subBuilder: Vip.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SponsorRank clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SponsorRank copyWith(void Function(SponsorRank) updates) =>\n      super.copyWith((message) => updates(message as SponsorRank))\n          as SponsorRank;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SponsorRank create() => SponsorRank._();\n  @$core.override\n  SponsorRank createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SponsorRank getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SponsorRank>(create);\n  static SponsorRank? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get uid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set uid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get msg => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set msg($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMsg() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMsg() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get uname => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uname($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUname() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUname() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get face => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set face($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFace() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFace() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  Vip get vip => $_getN(4);\n  @$pb.TagNumber(5)\n  set vip(Vip value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasVip() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearVip() => $_clearField(5);\n  @$pb.TagNumber(5)\n  Vip ensureVip() => $_ensure(4);\n}\n\nclass Staff extends $pb.GeneratedMessage {\n  factory Staff({\n    $fixnum.Int64? mid,\n    $core.int? attention,\n    $core.String? title,\n    $core.String? name,\n    $core.String? face,\n    OfficialVerify? official,\n    Vip? vip,\n    $core.int? labelStyle,\n    $core.String? fans,\n    $2.NameRender? nameRender,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (attention != null) result.attention = attention;\n    if (title != null) result.title = title;\n    if (name != null) result.name = name;\n    if (face != null) result.face = face;\n    if (official != null) result.official = official;\n    if (vip != null) result.vip = vip;\n    if (labelStyle != null) result.labelStyle = labelStyle;\n    if (fans != null) result.fans = fans;\n    if (nameRender != null) result.nameRender = nameRender;\n    return result;\n  }\n\n  Staff._();\n\n  factory Staff.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Staff.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Staff',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aI(2, _omitFieldNames ? '' : 'attention')\n    ..aOS(3, _omitFieldNames ? '' : 'title')\n    ..aOS(4, _omitFieldNames ? '' : 'name')\n    ..aOS(5, _omitFieldNames ? '' : 'face')\n    ..aOM<OfficialVerify>(6, _omitFieldNames ? '' : 'official',\n        subBuilder: OfficialVerify.create)\n    ..aOM<Vip>(7, _omitFieldNames ? '' : 'vip', subBuilder: Vip.create)\n    ..aI(8, _omitFieldNames ? '' : 'labelStyle')\n    ..aOS(9, _omitFieldNames ? '' : 'fans')\n    ..aOM<$2.NameRender>(10, _omitFieldNames ? '' : 'nameRender',\n        subBuilder: $2.NameRender.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Staff clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Staff copyWith(void Function(Staff) updates) =>\n      super.copyWith((message) => updates(message as Staff)) as Staff;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Staff create() => Staff._();\n  @$core.override\n  Staff createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Staff getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Staff>(create);\n  static Staff? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get attention => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set attention($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAttention() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAttention() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get title => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set title($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get name => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set name($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasName() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearName() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get face => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set face($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasFace() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearFace() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  OfficialVerify get official => $_getN(5);\n  @$pb.TagNumber(6)\n  set official(OfficialVerify value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasOfficial() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearOfficial() => $_clearField(6);\n  @$pb.TagNumber(6)\n  OfficialVerify ensureOfficial() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  Vip get vip => $_getN(6);\n  @$pb.TagNumber(7)\n  set vip(Vip value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasVip() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearVip() => $_clearField(7);\n  @$pb.TagNumber(7)\n  Vip ensureVip() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  $core.int get labelStyle => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set labelStyle($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasLabelStyle() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearLabelStyle() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get fans => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set fans($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasFans() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearFans() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $2.NameRender get nameRender => $_getN(9);\n  @$pb.TagNumber(10)\n  set nameRender($2.NameRender value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasNameRender() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearNameRender() => $_clearField(10);\n  @$pb.TagNumber(10)\n  $2.NameRender ensureNameRender() => $_ensure(9);\n}\n\nclass Staffs extends $pb.GeneratedMessage {\n  factory Staffs({\n    $core.Iterable<Staff>? staff,\n    $core.String? title,\n  }) {\n    final result = create();\n    if (staff != null) result.staff.addAll(staff);\n    if (title != null) result.title = title;\n    return result;\n  }\n\n  Staffs._();\n\n  factory Staffs.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Staffs.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Staffs',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..pPM<Staff>(1, _omitFieldNames ? '' : 'staff', subBuilder: Staff.create)\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Staffs clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Staffs copyWith(void Function(Staffs) updates) =>\n      super.copyWith((message) => updates(message as Staffs)) as Staffs;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Staffs create() => Staffs._();\n  @$core.override\n  Staffs createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Staffs getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Staffs>(create);\n  static Staffs? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<Staff> get staff => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n}\n\nclass StarRail extends $pb.GeneratedMessage {\n  factory StarRail({\n    $fixnum.Int64? seasonId,\n    $fixnum.Int64? aid,\n    $fixnum.Int64? cid,\n    $fixnum.Int64? openTime,\n    $core.int? status,\n    $core.String? pic1,\n    $core.String? pic2,\n    $core.String? pic3,\n    $core.String? pic4,\n    $core.String? pic5,\n  }) {\n    final result = create();\n    if (seasonId != null) result.seasonId = seasonId;\n    if (aid != null) result.aid = aid;\n    if (cid != null) result.cid = cid;\n    if (openTime != null) result.openTime = openTime;\n    if (status != null) result.status = status;\n    if (pic1 != null) result.pic1 = pic1;\n    if (pic2 != null) result.pic2 = pic2;\n    if (pic3 != null) result.pic3 = pic3;\n    if (pic4 != null) result.pic4 = pic4;\n    if (pic5 != null) result.pic5 = pic5;\n    return result;\n  }\n\n  StarRail._();\n\n  factory StarRail.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory StarRail.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'StarRail',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'seasonId')\n    ..aInt64(2, _omitFieldNames ? '' : 'aid')\n    ..aInt64(3, _omitFieldNames ? '' : 'cid')\n    ..aInt64(4, _omitFieldNames ? '' : 'openTime')\n    ..aI(5, _omitFieldNames ? '' : 'status')\n    ..aOS(6, _omitFieldNames ? '' : 'pic1')\n    ..aOS(7, _omitFieldNames ? '' : 'pic2')\n    ..aOS(8, _omitFieldNames ? '' : 'pic3')\n    ..aOS(9, _omitFieldNames ? '' : 'pic4')\n    ..aOS(10, _omitFieldNames ? '' : 'pic5')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StarRail clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StarRail copyWith(void Function(StarRail) updates) =>\n      super.copyWith((message) => updates(message as StarRail)) as StarRail;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static StarRail create() => StarRail._();\n  @$core.override\n  StarRail createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static StarRail getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<StarRail>(create);\n  static StarRail? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get seasonId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set seasonId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSeasonId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSeasonId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get aid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set aid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get cid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set cid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCid() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get openTime => $_getI64(3);\n  @$pb.TagNumber(4)\n  set openTime($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasOpenTime() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearOpenTime() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get status => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set status($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasStatus() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearStatus() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get pic1 => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set pic1($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasPic1() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearPic1() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get pic2 => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set pic2($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasPic2() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearPic2() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get pic3 => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set pic3($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasPic3() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearPic3() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get pic4 => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set pic4($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasPic4() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearPic4() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get pic5 => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set pic5($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasPic5() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearPic5() => $_clearField(10);\n}\n\nclass Stat extends $pb.GeneratedMessage {\n  factory Stat({\n    StatInfo? vt,\n    StatInfo? danmaku,\n    $fixnum.Int64? reply,\n    $fixnum.Int64? fav,\n    $fixnum.Int64? coin,\n    $fixnum.Int64? share,\n    $fixnum.Int64? like,\n    $fixnum.Int64? follow,\n  }) {\n    final result = create();\n    if (vt != null) result.vt = vt;\n    if (danmaku != null) result.danmaku = danmaku;\n    if (reply != null) result.reply = reply;\n    if (fav != null) result.fav = fav;\n    if (coin != null) result.coin = coin;\n    if (share != null) result.share = share;\n    if (like != null) result.like = like;\n    if (follow != null) result.follow = follow;\n    return result;\n  }\n\n  Stat._();\n\n  factory Stat.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Stat.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Stat',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOM<StatInfo>(1, _omitFieldNames ? '' : 'vt', subBuilder: StatInfo.create)\n    ..aOM<StatInfo>(2, _omitFieldNames ? '' : 'danmaku',\n        subBuilder: StatInfo.create)\n    ..aInt64(3, _omitFieldNames ? '' : 'reply')\n    ..aInt64(4, _omitFieldNames ? '' : 'fav')\n    ..aInt64(5, _omitFieldNames ? '' : 'coin')\n    ..aInt64(6, _omitFieldNames ? '' : 'share')\n    ..aInt64(7, _omitFieldNames ? '' : 'like')\n    ..aInt64(8, _omitFieldNames ? '' : 'follow')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Stat clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Stat copyWith(void Function(Stat) updates) =>\n      super.copyWith((message) => updates(message as Stat)) as Stat;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Stat create() => Stat._();\n  @$core.override\n  Stat createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Stat getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Stat>(create);\n  static Stat? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  StatInfo get vt => $_getN(0);\n  @$pb.TagNumber(1)\n  set vt(StatInfo value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasVt() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearVt() => $_clearField(1);\n  @$pb.TagNumber(1)\n  StatInfo ensureVt() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  StatInfo get danmaku => $_getN(1);\n  @$pb.TagNumber(2)\n  set danmaku(StatInfo value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDanmaku() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDanmaku() => $_clearField(2);\n  @$pb.TagNumber(2)\n  StatInfo ensureDanmaku() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get reply => $_getI64(2);\n  @$pb.TagNumber(3)\n  set reply($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasReply() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearReply() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get fav => $_getI64(3);\n  @$pb.TagNumber(4)\n  set fav($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFav() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFav() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get coin => $_getI64(4);\n  @$pb.TagNumber(5)\n  set coin($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCoin() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCoin() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get share => $_getI64(5);\n  @$pb.TagNumber(6)\n  set share($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasShare() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearShare() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get like => $_getI64(6);\n  @$pb.TagNumber(7)\n  set like($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasLike() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearLike() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get follow => $_getI64(7);\n  @$pb.TagNumber(8)\n  set follow($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasFollow() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearFollow() => $_clearField(8);\n}\n\nclass StatInfo extends $pb.GeneratedMessage {\n  factory StatInfo({\n    $fixnum.Int64? value,\n    $core.String? text,\n    $core.String? pureText,\n    $core.String? icon,\n  }) {\n    final result = create();\n    if (value != null) result.value = value;\n    if (text != null) result.text = text;\n    if (pureText != null) result.pureText = pureText;\n    if (icon != null) result.icon = icon;\n    return result;\n  }\n\n  StatInfo._();\n\n  factory StatInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory StatInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'StatInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'value')\n    ..aOS(2, _omitFieldNames ? '' : 'text')\n    ..aOS(3, _omitFieldNames ? '' : 'pureText')\n    ..aOS(4, _omitFieldNames ? '' : 'icon')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StatInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StatInfo copyWith(void Function(StatInfo) updates) =>\n      super.copyWith((message) => updates(message as StatInfo)) as StatInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static StatInfo create() => StatInfo._();\n  @$core.override\n  StatInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static StatInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<StatInfo>(create);\n  static StatInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get value => $_getI64(0);\n  @$pb.TagNumber(1)\n  set value($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasValue() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearValue() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get pureText => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set pureText($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPureText() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPureText() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get icon => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set icon($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIcon() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIcon() => $_clearField(4);\n}\n\nclass Style extends $pb.GeneratedMessage {\n  factory Style({\n    $core.int? line,\n    $core.int? hidden,\n    $core.Iterable<$core.String>? showPages,\n  }) {\n    final result = create();\n    if (line != null) result.line = line;\n    if (hidden != null) result.hidden = hidden;\n    if (showPages != null) result.showPages.addAll(showPages);\n    return result;\n  }\n\n  Style._();\n\n  factory Style.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Style.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Style',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'line')\n    ..aI(2, _omitFieldNames ? '' : 'hidden')\n    ..pPS(3, _omitFieldNames ? '' : 'showPages')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Style clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Style copyWith(void Function(Style) updates) =>\n      super.copyWith((message) => updates(message as Style)) as Style;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Style create() => Style._();\n  @$core.override\n  Style createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Style getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Style>(create);\n  static Style? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get line => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set line($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLine() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLine() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get hidden => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set hidden($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHidden() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHidden() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<$core.String> get showPages => $_getList(2);\n}\n\nclass Tag extends $pb.GeneratedMessage {\n  factory Tag({\n    $fixnum.Int64? tagId,\n    $core.String? name,\n    $core.String? uri,\n    $core.String? tagType,\n  }) {\n    final result = create();\n    if (tagId != null) result.tagId = tagId;\n    if (name != null) result.name = name;\n    if (uri != null) result.uri = uri;\n    if (tagType != null) result.tagType = tagType;\n    return result;\n  }\n\n  Tag._();\n\n  factory Tag.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Tag.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Tag',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'tagId')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'uri')\n    ..aOS(4, _omitFieldNames ? '' : 'tagType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Tag clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Tag copyWith(void Function(Tag) updates) =>\n      super.copyWith((message) => updates(message as Tag)) as Tag;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Tag create() => Tag._();\n  @$core.override\n  Tag createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Tag getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Tag>(create);\n  static Tag? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get tagId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set tagId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTagId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTagId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get uri => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set uri($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUri() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUri() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get tagType => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set tagType($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTagType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTagType() => $_clearField(4);\n}\n\nclass TextWidget extends $pb.GeneratedMessage {\n  factory TextWidget({\n    $core.String? code,\n    $core.String? text,\n    $core.String? textColor,\n    $core.String? bgColor,\n  }) {\n    final result = create();\n    if (code != null) result.code = code;\n    if (text != null) result.text = text;\n    if (textColor != null) result.textColor = textColor;\n    if (bgColor != null) result.bgColor = bgColor;\n    return result;\n  }\n\n  TextWidget._();\n\n  factory TextWidget.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TextWidget.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TextWidget',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'code')\n    ..aOS(2, _omitFieldNames ? '' : 'text')\n    ..aOS(3, _omitFieldNames ? '' : 'textColor')\n    ..aOS(4, _omitFieldNames ? '' : 'bgColor')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TextWidget clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TextWidget copyWith(void Function(TextWidget) updates) =>\n      super.copyWith((message) => updates(message as TextWidget)) as TextWidget;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TextWidget create() => TextWidget._();\n  @$core.override\n  TextWidget createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TextWidget getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<TextWidget>(create);\n  static TextWidget? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get code => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set code($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCode() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCode() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get textColor => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set textColor($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTextColor() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTextColor() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get bgColor => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set bgColor($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBgColor() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBgColor() => $_clearField(4);\n}\n\nclass TheatreHotTopic extends $pb.GeneratedMessage {\n  factory TheatreHotTopic({\n    $fixnum.Int64? theatreId,\n    $fixnum.Int64? theatreSetId,\n    $core.String? theatreTitle,\n    $core.String? backgroundImageUrl,\n    $core.String? theatreUrl,\n    $fixnum.Int64? hotTopicId,\n    $fixnum.Int64? hotTopicSetId,\n    $core.String? hotTopicTitle,\n    $core.String? hotTopicUrl,\n    $core.int? isSubscribe,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? report,\n  }) {\n    final result = create();\n    if (theatreId != null) result.theatreId = theatreId;\n    if (theatreSetId != null) result.theatreSetId = theatreSetId;\n    if (theatreTitle != null) result.theatreTitle = theatreTitle;\n    if (backgroundImageUrl != null)\n      result.backgroundImageUrl = backgroundImageUrl;\n    if (theatreUrl != null) result.theatreUrl = theatreUrl;\n    if (hotTopicId != null) result.hotTopicId = hotTopicId;\n    if (hotTopicSetId != null) result.hotTopicSetId = hotTopicSetId;\n    if (hotTopicTitle != null) result.hotTopicTitle = hotTopicTitle;\n    if (hotTopicUrl != null) result.hotTopicUrl = hotTopicUrl;\n    if (isSubscribe != null) result.isSubscribe = isSubscribe;\n    if (report != null) result.report.addEntries(report);\n    return result;\n  }\n\n  TheatreHotTopic._();\n\n  factory TheatreHotTopic.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TheatreHotTopic.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TheatreHotTopic',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'theatreId')\n    ..aInt64(2, _omitFieldNames ? '' : 'theatreSetId')\n    ..aOS(3, _omitFieldNames ? '' : 'theatreTitle')\n    ..aOS(4, _omitFieldNames ? '' : 'backgroundImageUrl')\n    ..aOS(5, _omitFieldNames ? '' : 'theatreUrl')\n    ..aInt64(6, _omitFieldNames ? '' : 'hotTopicId')\n    ..aInt64(7, _omitFieldNames ? '' : 'hotTopicSetId')\n    ..aOS(8, _omitFieldNames ? '' : 'hotTopicTitle')\n    ..aOS(9, _omitFieldNames ? '' : 'hotTopicUrl')\n    ..aI(10, _omitFieldNames ? '' : 'isSubscribe')\n    ..m<$core.String, $core.String>(11, _omitFieldNames ? '' : 'report',\n        entryClassName: 'TheatreHotTopic.ReportEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.viewunite.common'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TheatreHotTopic clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TheatreHotTopic copyWith(void Function(TheatreHotTopic) updates) =>\n      super.copyWith((message) => updates(message as TheatreHotTopic))\n          as TheatreHotTopic;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TheatreHotTopic create() => TheatreHotTopic._();\n  @$core.override\n  TheatreHotTopic createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TheatreHotTopic getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<TheatreHotTopic>(create);\n  static TheatreHotTopic? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get theatreId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set theatreId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTheatreId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTheatreId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get theatreSetId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set theatreSetId($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTheatreSetId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTheatreSetId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get theatreTitle => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set theatreTitle($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTheatreTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTheatreTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get backgroundImageUrl => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set backgroundImageUrl($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBackgroundImageUrl() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBackgroundImageUrl() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get theatreUrl => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set theatreUrl($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasTheatreUrl() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearTheatreUrl() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get hotTopicId => $_getI64(5);\n  @$pb.TagNumber(6)\n  set hotTopicId($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasHotTopicId() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearHotTopicId() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get hotTopicSetId => $_getI64(6);\n  @$pb.TagNumber(7)\n  set hotTopicSetId($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasHotTopicSetId() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearHotTopicSetId() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get hotTopicTitle => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set hotTopicTitle($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasHotTopicTitle() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearHotTopicTitle() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get hotTopicUrl => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set hotTopicUrl($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasHotTopicUrl() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearHotTopicUrl() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.int get isSubscribe => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set isSubscribe($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasIsSubscribe() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearIsSubscribe() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $pb.PbMap<$core.String, $core.String> get report => $_getMap(10);\n}\n\nclass Threshold extends $pb.GeneratedMessage {\n  factory Threshold({\n    $core.int? bp,\n    $core.int? days,\n    $core.String? daysText,\n  }) {\n    final result = create();\n    if (bp != null) result.bp = bp;\n    if (days != null) result.days = days;\n    if (daysText != null) result.daysText = daysText;\n    return result;\n  }\n\n  Threshold._();\n\n  factory Threshold.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Threshold.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Threshold',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'bp')\n    ..aI(2, _omitFieldNames ? '' : 'days')\n    ..aOS(3, _omitFieldNames ? '' : 'daysText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Threshold clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Threshold copyWith(void Function(Threshold) updates) =>\n      super.copyWith((message) => updates(message as Threshold)) as Threshold;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Threshold create() => Threshold._();\n  @$core.override\n  Threshold createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Threshold getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Threshold>(create);\n  static Threshold? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get bp => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set bp($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBp() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBp() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get days => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set days($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDays() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDays() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get daysText => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set daysText($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDaysText() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDaysText() => $_clearField(3);\n}\n\nclass TitleDeliveryButton extends $pb.GeneratedMessage {\n  factory TitleDeliveryButton({\n    $core.String? icon,\n    $core.String? title,\n    $core.String? link,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? report,\n    $core.String? bubble,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (title != null) result.title = title;\n    if (link != null) result.link = link;\n    if (report != null) result.report.addEntries(report);\n    if (bubble != null) result.bubble = bubble;\n    return result;\n  }\n\n  TitleDeliveryButton._();\n\n  factory TitleDeliveryButton.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TitleDeliveryButton.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TitleDeliveryButton',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'link')\n    ..m<$core.String, $core.String>(4, _omitFieldNames ? '' : 'report',\n        entryClassName: 'TitleDeliveryButton.ReportEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.viewunite.common'))\n    ..aOS(5, _omitFieldNames ? '' : 'bubble')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TitleDeliveryButton clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TitleDeliveryButton copyWith(void Function(TitleDeliveryButton) updates) =>\n      super.copyWith((message) => updates(message as TitleDeliveryButton))\n          as TitleDeliveryButton;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TitleDeliveryButton create() => TitleDeliveryButton._();\n  @$core.override\n  TitleDeliveryButton createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TitleDeliveryButton getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<TitleDeliveryButton>(create);\n  static TitleDeliveryButton? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get link => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set link($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLink() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLink() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $pb.PbMap<$core.String, $core.String> get report => $_getMap(3);\n\n  @$pb.TagNumber(5)\n  $core.String get bubble => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set bubble($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBubble() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBubble() => $_clearField(5);\n}\n\nclass UgcEpisode extends $pb.GeneratedMessage {\n  factory UgcEpisode({\n    $fixnum.Int64? id,\n    $fixnum.Int64? aid,\n    $fixnum.Int64? cid,\n    $core.String? title,\n    $core.String? cover,\n    $core.String? coverRightText,\n    Page? page,\n    StatInfo? vt,\n    StatInfo? danmaku,\n    BadgeInfo? badge,\n    $core.Iterable<Page>? pages,\n    $core.double? progressPercent,\n    $fixnum.Int64? duration,\n    Author? author,\n    $4.BizType? bizType,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (aid != null) result.aid = aid;\n    if (cid != null) result.cid = cid;\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (coverRightText != null) result.coverRightText = coverRightText;\n    if (page != null) result.page = page;\n    if (vt != null) result.vt = vt;\n    if (danmaku != null) result.danmaku = danmaku;\n    if (badge != null) result.badge = badge;\n    if (pages != null) result.pages.addAll(pages);\n    if (progressPercent != null) result.progressPercent = progressPercent;\n    if (duration != null) result.duration = duration;\n    if (author != null) result.author = author;\n    if (bizType != null) result.bizType = bizType;\n    return result;\n  }\n\n  UgcEpisode._();\n\n  factory UgcEpisode.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UgcEpisode.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UgcEpisode',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aInt64(2, _omitFieldNames ? '' : 'aid')\n    ..aInt64(3, _omitFieldNames ? '' : 'cid')\n    ..aOS(4, _omitFieldNames ? '' : 'title')\n    ..aOS(5, _omitFieldNames ? '' : 'cover')\n    ..aOS(6, _omitFieldNames ? '' : 'coverRightText')\n    ..aOM<Page>(7, _omitFieldNames ? '' : 'page', subBuilder: Page.create)\n    ..aOM<StatInfo>(8, _omitFieldNames ? '' : 'vt', subBuilder: StatInfo.create)\n    ..aOM<StatInfo>(9, _omitFieldNames ? '' : 'danmaku',\n        subBuilder: StatInfo.create)\n    ..aOM<BadgeInfo>(10, _omitFieldNames ? '' : 'badge',\n        subBuilder: BadgeInfo.create)\n    ..pPM<Page>(11, _omitFieldNames ? '' : 'pages', subBuilder: Page.create)\n    ..aD(12, _omitFieldNames ? '' : 'progressPercent')\n    ..aInt64(13, _omitFieldNames ? '' : 'duration')\n    ..aOM<Author>(14, _omitFieldNames ? '' : 'author',\n        subBuilder: Author.create)\n    ..aE<$4.BizType>(15, _omitFieldNames ? '' : 'bizType',\n        enumValues: $4.BizType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UgcEpisode clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UgcEpisode copyWith(void Function(UgcEpisode) updates) =>\n      super.copyWith((message) => updates(message as UgcEpisode)) as UgcEpisode;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UgcEpisode create() => UgcEpisode._();\n  @$core.override\n  UgcEpisode createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UgcEpisode getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UgcEpisode>(create);\n  static UgcEpisode? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get aid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set aid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get cid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set cid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCid() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get title => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set title($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTitle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTitle() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get cover => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set cover($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCover() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCover() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get coverRightText => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set coverRightText($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCoverRightText() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCoverRightText() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  Page get page => $_getN(6);\n  @$pb.TagNumber(7)\n  set page(Page value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasPage() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearPage() => $_clearField(7);\n  @$pb.TagNumber(7)\n  Page ensurePage() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  StatInfo get vt => $_getN(7);\n  @$pb.TagNumber(8)\n  set vt(StatInfo value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasVt() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearVt() => $_clearField(8);\n  @$pb.TagNumber(8)\n  StatInfo ensureVt() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  StatInfo get danmaku => $_getN(8);\n  @$pb.TagNumber(9)\n  set danmaku(StatInfo value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasDanmaku() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearDanmaku() => $_clearField(9);\n  @$pb.TagNumber(9)\n  StatInfo ensureDanmaku() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  BadgeInfo get badge => $_getN(9);\n  @$pb.TagNumber(10)\n  set badge(BadgeInfo value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasBadge() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearBadge() => $_clearField(10);\n  @$pb.TagNumber(10)\n  BadgeInfo ensureBadge() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  $pb.PbList<Page> get pages => $_getList(10);\n\n  @$pb.TagNumber(12)\n  $core.double get progressPercent => $_getN(11);\n  @$pb.TagNumber(12)\n  set progressPercent($core.double value) => $_setDouble(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasProgressPercent() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearProgressPercent() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $fixnum.Int64 get duration => $_getI64(12);\n  @$pb.TagNumber(13)\n  set duration($fixnum.Int64 value) => $_setInt64(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasDuration() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearDuration() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  Author get author => $_getN(13);\n  @$pb.TagNumber(14)\n  set author(Author value) => $_setField(14, value);\n  @$pb.TagNumber(14)\n  $core.bool hasAuthor() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearAuthor() => $_clearField(14);\n  @$pb.TagNumber(14)\n  Author ensureAuthor() => $_ensure(13);\n\n  @$pb.TagNumber(15)\n  $4.BizType get bizType => $_getN(14);\n  @$pb.TagNumber(15)\n  set bizType($4.BizType value) => $_setField(15, value);\n  @$pb.TagNumber(15)\n  $core.bool hasBizType() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearBizType() => $_clearField(15);\n}\n\nclass UgcIntroduction extends $pb.GeneratedMessage {\n  factory UgcIntroduction({\n    $core.Iterable<Tag>? tags,\n    Rating? rating,\n    Rank? rank,\n    $core.Iterable<ViewMaterial>? bgm,\n    $core.Iterable<ViewMaterial>? sticker,\n    $core.Iterable<ViewMaterial>? videoSource,\n    $fixnum.Int64? pubdate,\n    $core.Iterable<DescV2>? desc,\n    Neutral? neutral,\n  }) {\n    final result = create();\n    if (tags != null) result.tags.addAll(tags);\n    if (rating != null) result.rating = rating;\n    if (rank != null) result.rank = rank;\n    if (bgm != null) result.bgm.addAll(bgm);\n    if (sticker != null) result.sticker.addAll(sticker);\n    if (videoSource != null) result.videoSource.addAll(videoSource);\n    if (pubdate != null) result.pubdate = pubdate;\n    if (desc != null) result.desc.addAll(desc);\n    if (neutral != null) result.neutral = neutral;\n    return result;\n  }\n\n  UgcIntroduction._();\n\n  factory UgcIntroduction.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UgcIntroduction.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UgcIntroduction',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..pPM<Tag>(1, _omitFieldNames ? '' : 'tags', subBuilder: Tag.create)\n    ..aOM<Rating>(2, _omitFieldNames ? '' : 'rating', subBuilder: Rating.create)\n    ..aOM<Rank>(3, _omitFieldNames ? '' : 'rank', subBuilder: Rank.create)\n    ..pPM<ViewMaterial>(4, _omitFieldNames ? '' : 'bgm',\n        subBuilder: ViewMaterial.create)\n    ..pPM<ViewMaterial>(5, _omitFieldNames ? '' : 'sticker',\n        subBuilder: ViewMaterial.create)\n    ..pPM<ViewMaterial>(6, _omitFieldNames ? '' : 'videoSource',\n        subBuilder: ViewMaterial.create)\n    ..aInt64(7, _omitFieldNames ? '' : 'pubdate')\n    ..pPM<DescV2>(8, _omitFieldNames ? '' : 'desc', subBuilder: DescV2.create)\n    ..aOM<Neutral>(9, _omitFieldNames ? '' : 'neutral',\n        subBuilder: Neutral.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UgcIntroduction clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UgcIntroduction copyWith(void Function(UgcIntroduction) updates) =>\n      super.copyWith((message) => updates(message as UgcIntroduction))\n          as UgcIntroduction;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UgcIntroduction create() => UgcIntroduction._();\n  @$core.override\n  UgcIntroduction createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UgcIntroduction getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UgcIntroduction>(create);\n  static UgcIntroduction? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<Tag> get tags => $_getList(0);\n\n  @$pb.TagNumber(2)\n  Rating get rating => $_getN(1);\n  @$pb.TagNumber(2)\n  set rating(Rating value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasRating() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRating() => $_clearField(2);\n  @$pb.TagNumber(2)\n  Rating ensureRating() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  Rank get rank => $_getN(2);\n  @$pb.TagNumber(3)\n  set rank(Rank value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRank() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRank() => $_clearField(3);\n  @$pb.TagNumber(3)\n  Rank ensureRank() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<ViewMaterial> get bgm => $_getList(3);\n\n  @$pb.TagNumber(5)\n  $pb.PbList<ViewMaterial> get sticker => $_getList(4);\n\n  @$pb.TagNumber(6)\n  $pb.PbList<ViewMaterial> get videoSource => $_getList(5);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get pubdate => $_getI64(6);\n  @$pb.TagNumber(7)\n  set pubdate($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasPubdate() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearPubdate() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $pb.PbList<DescV2> get desc => $_getList(7);\n\n  @$pb.TagNumber(9)\n  Neutral get neutral => $_getN(8);\n  @$pb.TagNumber(9)\n  set neutral(Neutral value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasNeutral() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearNeutral() => $_clearField(9);\n  @$pb.TagNumber(9)\n  Neutral ensureNeutral() => $_ensure(8);\n}\n\nclass UgcSeasonActivity extends $pb.GeneratedMessage {\n  factory UgcSeasonActivity({\n    $core.int? type,\n    $fixnum.Int64? oid,\n    $fixnum.Int64? activityId,\n    $core.String? title,\n    $core.String? intro,\n    $core.int? dayCount,\n    $core.int? userCount,\n    $fixnum.Int64? joinDeadline,\n    $fixnum.Int64? activityDeadline,\n    $core.int? checkinViewTime,\n    $core.bool? newActivity,\n    UserActivity? userActivity,\n    SeasonShow? seasonShow,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (oid != null) result.oid = oid;\n    if (activityId != null) result.activityId = activityId;\n    if (title != null) result.title = title;\n    if (intro != null) result.intro = intro;\n    if (dayCount != null) result.dayCount = dayCount;\n    if (userCount != null) result.userCount = userCount;\n    if (joinDeadline != null) result.joinDeadline = joinDeadline;\n    if (activityDeadline != null) result.activityDeadline = activityDeadline;\n    if (checkinViewTime != null) result.checkinViewTime = checkinViewTime;\n    if (newActivity != null) result.newActivity = newActivity;\n    if (userActivity != null) result.userActivity = userActivity;\n    if (seasonShow != null) result.seasonShow = seasonShow;\n    return result;\n  }\n\n  UgcSeasonActivity._();\n\n  factory UgcSeasonActivity.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UgcSeasonActivity.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UgcSeasonActivity',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'type')\n    ..aInt64(2, _omitFieldNames ? '' : 'oid')\n    ..aInt64(3, _omitFieldNames ? '' : 'activityId')\n    ..aOS(4, _omitFieldNames ? '' : 'title')\n    ..aOS(5, _omitFieldNames ? '' : 'intro')\n    ..aI(6, _omitFieldNames ? '' : 'dayCount')\n    ..aI(7, _omitFieldNames ? '' : 'userCount')\n    ..aInt64(8, _omitFieldNames ? '' : 'joinDeadline')\n    ..aInt64(9, _omitFieldNames ? '' : 'activityDeadline')\n    ..aI(10, _omitFieldNames ? '' : 'checkinViewTime')\n    ..aOB(11, _omitFieldNames ? '' : 'newActivity')\n    ..aOM<UserActivity>(12, _omitFieldNames ? '' : 'userActivity',\n        subBuilder: UserActivity.create)\n    ..aOM<SeasonShow>(13, _omitFieldNames ? '' : 'seasonShow',\n        subBuilder: SeasonShow.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UgcSeasonActivity clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UgcSeasonActivity copyWith(void Function(UgcSeasonActivity) updates) =>\n      super.copyWith((message) => updates(message as UgcSeasonActivity))\n          as UgcSeasonActivity;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UgcSeasonActivity create() => UgcSeasonActivity._();\n  @$core.override\n  UgcSeasonActivity createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UgcSeasonActivity getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UgcSeasonActivity>(create);\n  static UgcSeasonActivity? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get type => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set type($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get oid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set oid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get activityId => $_getI64(2);\n  @$pb.TagNumber(3)\n  set activityId($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasActivityId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearActivityId() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get title => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set title($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTitle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTitle() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get intro => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set intro($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasIntro() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearIntro() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get dayCount => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set dayCount($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasDayCount() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearDayCount() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get userCount => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set userCount($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasUserCount() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearUserCount() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get joinDeadline => $_getI64(7);\n  @$pb.TagNumber(8)\n  set joinDeadline($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasJoinDeadline() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearJoinDeadline() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get activityDeadline => $_getI64(8);\n  @$pb.TagNumber(9)\n  set activityDeadline($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasActivityDeadline() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearActivityDeadline() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.int get checkinViewTime => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set checkinViewTime($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasCheckinViewTime() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearCheckinViewTime() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.bool get newActivity => $_getBF(10);\n  @$pb.TagNumber(11)\n  set newActivity($core.bool value) => $_setBool(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasNewActivity() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearNewActivity() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  UserActivity get userActivity => $_getN(11);\n  @$pb.TagNumber(12)\n  set userActivity(UserActivity value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasUserActivity() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearUserActivity() => $_clearField(12);\n  @$pb.TagNumber(12)\n  UserActivity ensureUserActivity() => $_ensure(11);\n\n  @$pb.TagNumber(13)\n  SeasonShow get seasonShow => $_getN(12);\n  @$pb.TagNumber(13)\n  set seasonShow(SeasonShow value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasSeasonShow() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearSeasonShow() => $_clearField(13);\n  @$pb.TagNumber(13)\n  SeasonShow ensureSeasonShow() => $_ensure(12);\n}\n\nclass UgcSeasons extends $pb.GeneratedMessage {\n  factory UgcSeasons({\n    $fixnum.Int64? id,\n    $core.String? title,\n    $core.String? cover,\n    $core.String? supernatantTitle,\n    $core.Iterable<UgcSection>? section,\n    $core.String? unionTitle,\n    SeasonHead? head,\n    $fixnum.Int64? epCount,\n    SeasonType? seasonType,\n    UgcSeasonActivity? activity,\n    $core.Iterable<$core.String>? seasonAbility,\n    $core.String? seasonTitle,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (supernatantTitle != null) result.supernatantTitle = supernatantTitle;\n    if (section != null) result.section.addAll(section);\n    if (unionTitle != null) result.unionTitle = unionTitle;\n    if (head != null) result.head = head;\n    if (epCount != null) result.epCount = epCount;\n    if (seasonType != null) result.seasonType = seasonType;\n    if (activity != null) result.activity = activity;\n    if (seasonAbility != null) result.seasonAbility.addAll(seasonAbility);\n    if (seasonTitle != null) result.seasonTitle = seasonTitle;\n    return result;\n  }\n\n  UgcSeasons._();\n\n  factory UgcSeasons.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UgcSeasons.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UgcSeasons',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'cover')\n    ..aOS(4, _omitFieldNames ? '' : 'supernatantTitle')\n    ..pPM<UgcSection>(5, _omitFieldNames ? '' : 'section',\n        subBuilder: UgcSection.create)\n    ..aOS(6, _omitFieldNames ? '' : 'unionTitle')\n    ..aOM<SeasonHead>(7, _omitFieldNames ? '' : 'head',\n        subBuilder: SeasonHead.create)\n    ..aInt64(8, _omitFieldNames ? '' : 'epCount')\n    ..aE<SeasonType>(9, _omitFieldNames ? '' : 'seasonType',\n        enumValues: SeasonType.values)\n    ..aOM<UgcSeasonActivity>(10, _omitFieldNames ? '' : 'activity',\n        subBuilder: UgcSeasonActivity.create)\n    ..pPS(11, _omitFieldNames ? '' : 'seasonAbility')\n    ..aOS(12, _omitFieldNames ? '' : 'seasonTitle')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UgcSeasons clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UgcSeasons copyWith(void Function(UgcSeasons) updates) =>\n      super.copyWith((message) => updates(message as UgcSeasons)) as UgcSeasons;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UgcSeasons create() => UgcSeasons._();\n  @$core.override\n  UgcSeasons createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UgcSeasons getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UgcSeasons>(create);\n  static UgcSeasons? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get cover => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set cover($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCover() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCover() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get supernatantTitle => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set supernatantTitle($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSupernatantTitle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSupernatantTitle() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $pb.PbList<UgcSection> get section => $_getList(4);\n\n  @$pb.TagNumber(6)\n  $core.String get unionTitle => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set unionTitle($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasUnionTitle() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearUnionTitle() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  SeasonHead get head => $_getN(6);\n  @$pb.TagNumber(7)\n  set head(SeasonHead value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasHead() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearHead() => $_clearField(7);\n  @$pb.TagNumber(7)\n  SeasonHead ensureHead() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get epCount => $_getI64(7);\n  @$pb.TagNumber(8)\n  set epCount($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasEpCount() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearEpCount() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  SeasonType get seasonType => $_getN(8);\n  @$pb.TagNumber(9)\n  set seasonType(SeasonType value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasSeasonType() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearSeasonType() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  UgcSeasonActivity get activity => $_getN(9);\n  @$pb.TagNumber(10)\n  set activity(UgcSeasonActivity value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasActivity() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearActivity() => $_clearField(10);\n  @$pb.TagNumber(10)\n  UgcSeasonActivity ensureActivity() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  $pb.PbList<$core.String> get seasonAbility => $_getList(10);\n\n  @$pb.TagNumber(12)\n  $core.String get seasonTitle => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set seasonTitle($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasSeasonTitle() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearSeasonTitle() => $_clearField(12);\n}\n\nclass UgcSection extends $pb.GeneratedMessage {\n  factory UgcSection({\n    $fixnum.Int64? id,\n    $core.String? title,\n    $fixnum.Int64? type,\n    $core.Iterable<UgcEpisode>? episodes,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (title != null) result.title = title;\n    if (type != null) result.type = type;\n    if (episodes != null) result.episodes.addAll(episodes);\n    return result;\n  }\n\n  UgcSection._();\n\n  factory UgcSection.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UgcSection.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UgcSection',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aInt64(3, _omitFieldNames ? '' : 'type')\n    ..pPM<UgcEpisode>(4, _omitFieldNames ? '' : 'episodes',\n        subBuilder: UgcEpisode.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UgcSection clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UgcSection copyWith(void Function(UgcSection) updates) =>\n      super.copyWith((message) => updates(message as UgcSection)) as UgcSection;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UgcSection create() => UgcSection._();\n  @$core.override\n  UgcSection createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UgcSection getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UgcSection>(create);\n  static UgcSection? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get type => $_getI64(2);\n  @$pb.TagNumber(3)\n  set type($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<UgcEpisode> get episodes => $_getList(3);\n}\n\nclass UpDataModule extends $pb.GeneratedMessage {\n  factory UpDataModule({\n    $core.Iterable<ExtTab>? extTabs,\n    $core.int? idx,\n    $core.String? protocolUrl,\n    $core.int? height,\n  }) {\n    final result = create();\n    if (extTabs != null) result.extTabs.addAll(extTabs);\n    if (idx != null) result.idx = idx;\n    if (protocolUrl != null) result.protocolUrl = protocolUrl;\n    if (height != null) result.height = height;\n    return result;\n  }\n\n  UpDataModule._();\n\n  factory UpDataModule.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UpDataModule.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UpDataModule',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..pPM<ExtTab>(1, _omitFieldNames ? '' : 'extTabs',\n        subBuilder: ExtTab.create)\n    ..aI(2, _omitFieldNames ? '' : 'idx')\n    ..aOS(3, _omitFieldNames ? '' : 'protocolUrl')\n    ..aI(4, _omitFieldNames ? '' : 'height')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpDataModule clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpDataModule copyWith(void Function(UpDataModule) updates) =>\n      super.copyWith((message) => updates(message as UpDataModule))\n          as UpDataModule;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UpDataModule create() => UpDataModule._();\n  @$core.override\n  UpDataModule createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UpDataModule getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UpDataModule>(create);\n  static UpDataModule? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<ExtTab> get extTabs => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.int get idx => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set idx($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIdx() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIdx() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get protocolUrl => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set protocolUrl($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasProtocolUrl() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearProtocolUrl() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get height => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set height($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasHeight() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearHeight() => $_clearField(4);\n}\n\nclass UpLikeImg extends $pb.GeneratedMessage {\n  factory UpLikeImg({\n    $core.String? preImg,\n    $core.String? sucImg,\n    $core.String? content,\n    $fixnum.Int64? type,\n  }) {\n    final result = create();\n    if (preImg != null) result.preImg = preImg;\n    if (sucImg != null) result.sucImg = sucImg;\n    if (content != null) result.content = content;\n    if (type != null) result.type = type;\n    return result;\n  }\n\n  UpLikeImg._();\n\n  factory UpLikeImg.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UpLikeImg.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UpLikeImg',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'preImg')\n    ..aOS(2, _omitFieldNames ? '' : 'sucImg')\n    ..aOS(3, _omitFieldNames ? '' : 'content')\n    ..aInt64(4, _omitFieldNames ? '' : 'type')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpLikeImg clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpLikeImg copyWith(void Function(UpLikeImg) updates) =>\n      super.copyWith((message) => updates(message as UpLikeImg)) as UpLikeImg;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UpLikeImg create() => UpLikeImg._();\n  @$core.override\n  UpLikeImg createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UpLikeImg getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<UpLikeImg>(create);\n  static UpLikeImg? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get preImg => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set preImg($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPreImg() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPreImg() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get sucImg => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set sucImg($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSucImg() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSucImg() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get content => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set content($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasContent() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearContent() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get type => $_getI64(3);\n  @$pb.TagNumber(4)\n  set type($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearType() => $_clearField(4);\n}\n\nclass UpTool extends $pb.GeneratedMessage {\n  factory UpTool({\n    ToolType? type,\n    $core.String? text,\n    $core.String? icon,\n    $core.String? url,\n    BadgeInfo? badge,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (text != null) result.text = text;\n    if (icon != null) result.icon = icon;\n    if (url != null) result.url = url;\n    if (badge != null) result.badge = badge;\n    return result;\n  }\n\n  UpTool._();\n\n  factory UpTool.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UpTool.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UpTool',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aE<ToolType>(1, _omitFieldNames ? '' : 'type',\n        enumValues: ToolType.values)\n    ..aOS(2, _omitFieldNames ? '' : 'text')\n    ..aOS(3, _omitFieldNames ? '' : 'icon')\n    ..aOS(4, _omitFieldNames ? '' : 'url')\n    ..aOM<BadgeInfo>(5, _omitFieldNames ? '' : 'badge',\n        subBuilder: BadgeInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpTool clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpTool copyWith(void Function(UpTool) updates) =>\n      super.copyWith((message) => updates(message as UpTool)) as UpTool;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UpTool create() => UpTool._();\n  @$core.override\n  UpTool createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UpTool getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<UpTool>(create);\n  static UpTool? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  ToolType get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(ToolType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get icon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set icon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIcon() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get url => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set url($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUrl() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUrl() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  BadgeInfo get badge => $_getN(4);\n  @$pb.TagNumber(5)\n  set badge(BadgeInfo value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBadge() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBadge() => $_clearField(5);\n  @$pb.TagNumber(5)\n  BadgeInfo ensureBadge() => $_ensure(4);\n}\n\nclass UpVideoTool extends $pb.GeneratedMessage {\n  factory UpVideoTool({\n    $core.String? title,\n    $core.Iterable<UpTool>? tools,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (tools != null) result.tools.addAll(tools);\n    return result;\n  }\n\n  UpVideoTool._();\n\n  factory UpVideoTool.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UpVideoTool.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UpVideoTool',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..pPM<UpTool>(2, _omitFieldNames ? '' : 'tools', subBuilder: UpTool.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpVideoTool clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpVideoTool copyWith(void Function(UpVideoTool) updates) =>\n      super.copyWith((message) => updates(message as UpVideoTool))\n          as UpVideoTool;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UpVideoTool create() => UpVideoTool._();\n  @$core.override\n  UpVideoTool createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UpVideoTool getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UpVideoTool>(create);\n  static UpVideoTool? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<UpTool> get tools => $_getList(1);\n}\n\nclass User extends $pb.GeneratedMessage {\n  factory User({\n    $fixnum.Int64? mid,\n    $core.String? name,\n    $core.String? face,\n    $fixnum.Int64? follower,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (name != null) result.name = name;\n    if (face != null) result.face = face;\n    if (follower != null) result.follower = follower;\n    return result;\n  }\n\n  User._();\n\n  factory User.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory User.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'User',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'face')\n    ..aInt64(4, _omitFieldNames ? '' : 'follower')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  User clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  User copyWith(void Function(User) updates) =>\n      super.copyWith((message) => updates(message as User)) as User;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static User create() => User._();\n  @$core.override\n  User createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static User getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<User>(create);\n  static User? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get face => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set face($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFace() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFace() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get follower => $_getI64(3);\n  @$pb.TagNumber(4)\n  set follower($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFollower() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFollower() => $_clearField(4);\n}\n\nclass UserActivity extends $pb.GeneratedMessage {\n  factory UserActivity({\n    $core.int? userState,\n    $fixnum.Int64? lastCheckinDate,\n    $core.int? checkinToday,\n    $core.int? userDayCount,\n    $core.int? userViewTime,\n    $core.String? portrait,\n  }) {\n    final result = create();\n    if (userState != null) result.userState = userState;\n    if (lastCheckinDate != null) result.lastCheckinDate = lastCheckinDate;\n    if (checkinToday != null) result.checkinToday = checkinToday;\n    if (userDayCount != null) result.userDayCount = userDayCount;\n    if (userViewTime != null) result.userViewTime = userViewTime;\n    if (portrait != null) result.portrait = portrait;\n    return result;\n  }\n\n  UserActivity._();\n\n  factory UserActivity.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UserActivity.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UserActivity',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'userState')\n    ..aInt64(2, _omitFieldNames ? '' : 'lastCheckinDate')\n    ..aI(3, _omitFieldNames ? '' : 'checkinToday')\n    ..aI(4, _omitFieldNames ? '' : 'userDayCount')\n    ..aI(5, _omitFieldNames ? '' : 'userViewTime')\n    ..aOS(6, _omitFieldNames ? '' : 'portrait')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserActivity clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserActivity copyWith(void Function(UserActivity) updates) =>\n      super.copyWith((message) => updates(message as UserActivity))\n          as UserActivity;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UserActivity create() => UserActivity._();\n  @$core.override\n  UserActivity createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UserActivity getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UserActivity>(create);\n  static UserActivity? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get userState => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set userState($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUserState() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUserState() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get lastCheckinDate => $_getI64(1);\n  @$pb.TagNumber(2)\n  set lastCheckinDate($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLastCheckinDate() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLastCheckinDate() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get checkinToday => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set checkinToday($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCheckinToday() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCheckinToday() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get userDayCount => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set userDayCount($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUserDayCount() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUserDayCount() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get userViewTime => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set userViewTime($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasUserViewTime() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearUserViewTime() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get portrait => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set portrait($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasPortrait() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearPortrait() => $_clearField(6);\n}\n\nclass UserList extends $pb.GeneratedMessage {\n  factory UserList({\n    $core.Iterable<User>? list,\n    $core.String? title,\n  }) {\n    final result = create();\n    if (list != null) result.list.addAll(list);\n    if (title != null) result.title = title;\n    return result;\n  }\n\n  UserList._();\n\n  factory UserList.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UserList.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UserList',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..pPM<User>(1, _omitFieldNames ? '' : 'list', subBuilder: User.create)\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserList clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserList copyWith(void Function(UserList) updates) =>\n      super.copyWith((message) => updates(message as UserList)) as UserList;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UserList create() => UserList._();\n  @$core.override\n  UserList createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UserList getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<UserList>(create);\n  static UserList? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<User> get list => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n}\n\nclass UserStatus extends $pb.GeneratedMessage {\n  factory UserStatus({\n    $core.int? show,\n    $core.int? follow,\n  }) {\n    final result = create();\n    if (show != null) result.show = show;\n    if (follow != null) result.follow = follow;\n    return result;\n  }\n\n  UserStatus._();\n\n  factory UserStatus.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UserStatus.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UserStatus',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'show')\n    ..aI(2, _omitFieldNames ? '' : 'follow')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserStatus clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserStatus copyWith(void Function(UserStatus) updates) =>\n      super.copyWith((message) => updates(message as UserStatus)) as UserStatus;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UserStatus create() => UserStatus._();\n  @$core.override\n  UserStatus createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UserStatus getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UserStatus>(create);\n  static UserStatus? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get show => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set show($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasShow() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearShow() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get follow => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set follow($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFollow() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFollow() => $_clearField(2);\n}\n\nclass ViewEpisode extends $pb.GeneratedMessage {\n  factory ViewEpisode({\n    $fixnum.Int64? epId,\n    $core.String? badge,\n    $core.int? badgeType,\n    BadgeInfo? badgeInfo,\n    $core.int? duration,\n    $core.int? status,\n    $core.String? cover,\n    $fixnum.Int64? aid,\n    $core.String? title,\n    $core.String? movieTitle,\n    $core.String? subtitle,\n    $core.String? longTitle,\n    $core.String? toastTitle,\n    $fixnum.Int64? cid,\n    $core.String? from,\n    $core.String? shareUrl,\n    $core.String? shareCopy,\n    $core.String? shortLink,\n    $core.String? vid,\n    $core.String? releaseDate,\n    Dimension? dimension,\n    Rights? rights,\n    Interaction? interaction,\n    $core.String? bvid,\n    $core.int? archiveAttr,\n    $core.String? link,\n    $core.String? linkType,\n    $core.String? bmid,\n    $fixnum.Int64? pubTime,\n    $core.int? pv,\n    $core.int? epIndex,\n    $core.int? sectionIndex,\n    $core.Iterable<Staff>? upInfos,\n    Staff? upInfo,\n    $core.String? dialogType,\n    $core.String? toastType,\n    $core.Iterable<MultiViewEp>? multiViewEps,\n    $core.bool? isSubView,\n    $core.bool? isViewHide,\n    $core.String? jumpLink,\n    Stat? statForUnity,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? report,\n    $core.int? sectionType,\n    $core.String? showTitle,\n  }) {\n    final result = create();\n    if (epId != null) result.epId = epId;\n    if (badge != null) result.badge = badge;\n    if (badgeType != null) result.badgeType = badgeType;\n    if (badgeInfo != null) result.badgeInfo = badgeInfo;\n    if (duration != null) result.duration = duration;\n    if (status != null) result.status = status;\n    if (cover != null) result.cover = cover;\n    if (aid != null) result.aid = aid;\n    if (title != null) result.title = title;\n    if (movieTitle != null) result.movieTitle = movieTitle;\n    if (subtitle != null) result.subtitle = subtitle;\n    if (longTitle != null) result.longTitle = longTitle;\n    if (toastTitle != null) result.toastTitle = toastTitle;\n    if (cid != null) result.cid = cid;\n    if (from != null) result.from = from;\n    if (shareUrl != null) result.shareUrl = shareUrl;\n    if (shareCopy != null) result.shareCopy = shareCopy;\n    if (shortLink != null) result.shortLink = shortLink;\n    if (vid != null) result.vid = vid;\n    if (releaseDate != null) result.releaseDate = releaseDate;\n    if (dimension != null) result.dimension = dimension;\n    if (rights != null) result.rights = rights;\n    if (interaction != null) result.interaction = interaction;\n    if (bvid != null) result.bvid = bvid;\n    if (archiveAttr != null) result.archiveAttr = archiveAttr;\n    if (link != null) result.link = link;\n    if (linkType != null) result.linkType = linkType;\n    if (bmid != null) result.bmid = bmid;\n    if (pubTime != null) result.pubTime = pubTime;\n    if (pv != null) result.pv = pv;\n    if (epIndex != null) result.epIndex = epIndex;\n    if (sectionIndex != null) result.sectionIndex = sectionIndex;\n    if (upInfos != null) result.upInfos.addAll(upInfos);\n    if (upInfo != null) result.upInfo = upInfo;\n    if (dialogType != null) result.dialogType = dialogType;\n    if (toastType != null) result.toastType = toastType;\n    if (multiViewEps != null) result.multiViewEps.addAll(multiViewEps);\n    if (isSubView != null) result.isSubView = isSubView;\n    if (isViewHide != null) result.isViewHide = isViewHide;\n    if (jumpLink != null) result.jumpLink = jumpLink;\n    if (statForUnity != null) result.statForUnity = statForUnity;\n    if (report != null) result.report.addEntries(report);\n    if (sectionType != null) result.sectionType = sectionType;\n    if (showTitle != null) result.showTitle = showTitle;\n    return result;\n  }\n\n  ViewEpisode._();\n\n  factory ViewEpisode.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ViewEpisode.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ViewEpisode',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'epId')\n    ..aOS(2, _omitFieldNames ? '' : 'badge')\n    ..aI(3, _omitFieldNames ? '' : 'badgeType')\n    ..aOM<BadgeInfo>(4, _omitFieldNames ? '' : 'badgeInfo',\n        subBuilder: BadgeInfo.create)\n    ..aI(5, _omitFieldNames ? '' : 'duration')\n    ..aI(6, _omitFieldNames ? '' : 'status')\n    ..aOS(7, _omitFieldNames ? '' : 'cover')\n    ..aInt64(8, _omitFieldNames ? '' : 'aid')\n    ..aOS(9, _omitFieldNames ? '' : 'title')\n    ..aOS(10, _omitFieldNames ? '' : 'movieTitle')\n    ..aOS(11, _omitFieldNames ? '' : 'subtitle')\n    ..aOS(12, _omitFieldNames ? '' : 'longTitle')\n    ..aOS(13, _omitFieldNames ? '' : 'toastTitle')\n    ..aInt64(14, _omitFieldNames ? '' : 'cid')\n    ..aOS(15, _omitFieldNames ? '' : 'from')\n    ..aOS(16, _omitFieldNames ? '' : 'shareUrl')\n    ..aOS(17, _omitFieldNames ? '' : 'shareCopy')\n    ..aOS(18, _omitFieldNames ? '' : 'shortLink')\n    ..aOS(19, _omitFieldNames ? '' : 'vid')\n    ..aOS(20, _omitFieldNames ? '' : 'releaseDate')\n    ..aOM<Dimension>(21, _omitFieldNames ? '' : 'dimension',\n        subBuilder: Dimension.create)\n    ..aOM<Rights>(22, _omitFieldNames ? '' : 'rights',\n        subBuilder: Rights.create)\n    ..aOM<Interaction>(23, _omitFieldNames ? '' : 'interaction',\n        subBuilder: Interaction.create)\n    ..aOS(24, _omitFieldNames ? '' : 'bvid')\n    ..aI(25, _omitFieldNames ? '' : 'archiveAttr')\n    ..aOS(26, _omitFieldNames ? '' : 'link')\n    ..aOS(27, _omitFieldNames ? '' : 'linkType')\n    ..aOS(28, _omitFieldNames ? '' : 'bmid')\n    ..aInt64(29, _omitFieldNames ? '' : 'pubTime')\n    ..aI(30, _omitFieldNames ? '' : 'pv')\n    ..aI(31, _omitFieldNames ? '' : 'epIndex')\n    ..aI(32, _omitFieldNames ? '' : 'sectionIndex')\n    ..pPM<Staff>(33, _omitFieldNames ? '' : 'upInfos', subBuilder: Staff.create)\n    ..aOM<Staff>(34, _omitFieldNames ? '' : 'upInfo', subBuilder: Staff.create)\n    ..aOS(35, _omitFieldNames ? '' : 'dialogType')\n    ..aOS(36, _omitFieldNames ? '' : 'toastType')\n    ..pPM<MultiViewEp>(37, _omitFieldNames ? '' : 'multiViewEps',\n        subBuilder: MultiViewEp.create)\n    ..aOB(38, _omitFieldNames ? '' : 'isSubView')\n    ..aOB(39, _omitFieldNames ? '' : 'isViewHide')\n    ..aOS(40, _omitFieldNames ? '' : 'jumpLink')\n    ..aOM<Stat>(41, _omitFieldNames ? '' : 'statForUnity',\n        subBuilder: Stat.create)\n    ..m<$core.String, $core.String>(42, _omitFieldNames ? '' : 'report',\n        entryClassName: 'ViewEpisode.ReportEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.viewunite.common'))\n    ..aI(43, _omitFieldNames ? '' : 'sectionType')\n    ..aOS(44, _omitFieldNames ? '' : 'showTitle')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ViewEpisode clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ViewEpisode copyWith(void Function(ViewEpisode) updates) =>\n      super.copyWith((message) => updates(message as ViewEpisode))\n          as ViewEpisode;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ViewEpisode create() => ViewEpisode._();\n  @$core.override\n  ViewEpisode createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ViewEpisode getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ViewEpisode>(create);\n  static ViewEpisode? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get epId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set epId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasEpId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearEpId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get badge => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set badge($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBadge() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBadge() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get badgeType => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set badgeType($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBadgeType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBadgeType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  BadgeInfo get badgeInfo => $_getN(3);\n  @$pb.TagNumber(4)\n  set badgeInfo(BadgeInfo value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBadgeInfo() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBadgeInfo() => $_clearField(4);\n  @$pb.TagNumber(4)\n  BadgeInfo ensureBadgeInfo() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.int get duration => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set duration($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDuration() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDuration() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get status => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set status($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasStatus() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearStatus() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get cover => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set cover($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCover() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCover() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get aid => $_getI64(7);\n  @$pb.TagNumber(8)\n  set aid($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasAid() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearAid() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get title => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set title($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasTitle() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearTitle() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get movieTitle => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set movieTitle($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasMovieTitle() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearMovieTitle() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get subtitle => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set subtitle($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasSubtitle() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearSubtitle() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get longTitle => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set longTitle($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasLongTitle() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearLongTitle() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.String get toastTitle => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set toastTitle($core.String value) => $_setString(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasToastTitle() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearToastTitle() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $fixnum.Int64 get cid => $_getI64(13);\n  @$pb.TagNumber(14)\n  set cid($fixnum.Int64 value) => $_setInt64(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasCid() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearCid() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $core.String get from => $_getSZ(14);\n  @$pb.TagNumber(15)\n  set from($core.String value) => $_setString(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasFrom() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearFrom() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $core.String get shareUrl => $_getSZ(15);\n  @$pb.TagNumber(16)\n  set shareUrl($core.String value) => $_setString(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasShareUrl() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearShareUrl() => $_clearField(16);\n\n  @$pb.TagNumber(17)\n  $core.String get shareCopy => $_getSZ(16);\n  @$pb.TagNumber(17)\n  set shareCopy($core.String value) => $_setString(16, value);\n  @$pb.TagNumber(17)\n  $core.bool hasShareCopy() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearShareCopy() => $_clearField(17);\n\n  @$pb.TagNumber(18)\n  $core.String get shortLink => $_getSZ(17);\n  @$pb.TagNumber(18)\n  set shortLink($core.String value) => $_setString(17, value);\n  @$pb.TagNumber(18)\n  $core.bool hasShortLink() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearShortLink() => $_clearField(18);\n\n  @$pb.TagNumber(19)\n  $core.String get vid => $_getSZ(18);\n  @$pb.TagNumber(19)\n  set vid($core.String value) => $_setString(18, value);\n  @$pb.TagNumber(19)\n  $core.bool hasVid() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearVid() => $_clearField(19);\n\n  @$pb.TagNumber(20)\n  $core.String get releaseDate => $_getSZ(19);\n  @$pb.TagNumber(20)\n  set releaseDate($core.String value) => $_setString(19, value);\n  @$pb.TagNumber(20)\n  $core.bool hasReleaseDate() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearReleaseDate() => $_clearField(20);\n\n  @$pb.TagNumber(21)\n  Dimension get dimension => $_getN(20);\n  @$pb.TagNumber(21)\n  set dimension(Dimension value) => $_setField(21, value);\n  @$pb.TagNumber(21)\n  $core.bool hasDimension() => $_has(20);\n  @$pb.TagNumber(21)\n  void clearDimension() => $_clearField(21);\n  @$pb.TagNumber(21)\n  Dimension ensureDimension() => $_ensure(20);\n\n  @$pb.TagNumber(22)\n  Rights get rights => $_getN(21);\n  @$pb.TagNumber(22)\n  set rights(Rights value) => $_setField(22, value);\n  @$pb.TagNumber(22)\n  $core.bool hasRights() => $_has(21);\n  @$pb.TagNumber(22)\n  void clearRights() => $_clearField(22);\n  @$pb.TagNumber(22)\n  Rights ensureRights() => $_ensure(21);\n\n  @$pb.TagNumber(23)\n  Interaction get interaction => $_getN(22);\n  @$pb.TagNumber(23)\n  set interaction(Interaction value) => $_setField(23, value);\n  @$pb.TagNumber(23)\n  $core.bool hasInteraction() => $_has(22);\n  @$pb.TagNumber(23)\n  void clearInteraction() => $_clearField(23);\n  @$pb.TagNumber(23)\n  Interaction ensureInteraction() => $_ensure(22);\n\n  @$pb.TagNumber(24)\n  $core.String get bvid => $_getSZ(23);\n  @$pb.TagNumber(24)\n  set bvid($core.String value) => $_setString(23, value);\n  @$pb.TagNumber(24)\n  $core.bool hasBvid() => $_has(23);\n  @$pb.TagNumber(24)\n  void clearBvid() => $_clearField(24);\n\n  @$pb.TagNumber(25)\n  $core.int get archiveAttr => $_getIZ(24);\n  @$pb.TagNumber(25)\n  set archiveAttr($core.int value) => $_setSignedInt32(24, value);\n  @$pb.TagNumber(25)\n  $core.bool hasArchiveAttr() => $_has(24);\n  @$pb.TagNumber(25)\n  void clearArchiveAttr() => $_clearField(25);\n\n  @$pb.TagNumber(26)\n  $core.String get link => $_getSZ(25);\n  @$pb.TagNumber(26)\n  set link($core.String value) => $_setString(25, value);\n  @$pb.TagNumber(26)\n  $core.bool hasLink() => $_has(25);\n  @$pb.TagNumber(26)\n  void clearLink() => $_clearField(26);\n\n  @$pb.TagNumber(27)\n  $core.String get linkType => $_getSZ(26);\n  @$pb.TagNumber(27)\n  set linkType($core.String value) => $_setString(26, value);\n  @$pb.TagNumber(27)\n  $core.bool hasLinkType() => $_has(26);\n  @$pb.TagNumber(27)\n  void clearLinkType() => $_clearField(27);\n\n  @$pb.TagNumber(28)\n  $core.String get bmid => $_getSZ(27);\n  @$pb.TagNumber(28)\n  set bmid($core.String value) => $_setString(27, value);\n  @$pb.TagNumber(28)\n  $core.bool hasBmid() => $_has(27);\n  @$pb.TagNumber(28)\n  void clearBmid() => $_clearField(28);\n\n  @$pb.TagNumber(29)\n  $fixnum.Int64 get pubTime => $_getI64(28);\n  @$pb.TagNumber(29)\n  set pubTime($fixnum.Int64 value) => $_setInt64(28, value);\n  @$pb.TagNumber(29)\n  $core.bool hasPubTime() => $_has(28);\n  @$pb.TagNumber(29)\n  void clearPubTime() => $_clearField(29);\n\n  @$pb.TagNumber(30)\n  $core.int get pv => $_getIZ(29);\n  @$pb.TagNumber(30)\n  set pv($core.int value) => $_setSignedInt32(29, value);\n  @$pb.TagNumber(30)\n  $core.bool hasPv() => $_has(29);\n  @$pb.TagNumber(30)\n  void clearPv() => $_clearField(30);\n\n  @$pb.TagNumber(31)\n  $core.int get epIndex => $_getIZ(30);\n  @$pb.TagNumber(31)\n  set epIndex($core.int value) => $_setSignedInt32(30, value);\n  @$pb.TagNumber(31)\n  $core.bool hasEpIndex() => $_has(30);\n  @$pb.TagNumber(31)\n  void clearEpIndex() => $_clearField(31);\n\n  @$pb.TagNumber(32)\n  $core.int get sectionIndex => $_getIZ(31);\n  @$pb.TagNumber(32)\n  set sectionIndex($core.int value) => $_setSignedInt32(31, value);\n  @$pb.TagNumber(32)\n  $core.bool hasSectionIndex() => $_has(31);\n  @$pb.TagNumber(32)\n  void clearSectionIndex() => $_clearField(32);\n\n  @$pb.TagNumber(33)\n  $pb.PbList<Staff> get upInfos => $_getList(32);\n\n  @$pb.TagNumber(34)\n  Staff get upInfo => $_getN(33);\n  @$pb.TagNumber(34)\n  set upInfo(Staff value) => $_setField(34, value);\n  @$pb.TagNumber(34)\n  $core.bool hasUpInfo() => $_has(33);\n  @$pb.TagNumber(34)\n  void clearUpInfo() => $_clearField(34);\n  @$pb.TagNumber(34)\n  Staff ensureUpInfo() => $_ensure(33);\n\n  @$pb.TagNumber(35)\n  $core.String get dialogType => $_getSZ(34);\n  @$pb.TagNumber(35)\n  set dialogType($core.String value) => $_setString(34, value);\n  @$pb.TagNumber(35)\n  $core.bool hasDialogType() => $_has(34);\n  @$pb.TagNumber(35)\n  void clearDialogType() => $_clearField(35);\n\n  @$pb.TagNumber(36)\n  $core.String get toastType => $_getSZ(35);\n  @$pb.TagNumber(36)\n  set toastType($core.String value) => $_setString(35, value);\n  @$pb.TagNumber(36)\n  $core.bool hasToastType() => $_has(35);\n  @$pb.TagNumber(36)\n  void clearToastType() => $_clearField(36);\n\n  @$pb.TagNumber(37)\n  $pb.PbList<MultiViewEp> get multiViewEps => $_getList(36);\n\n  @$pb.TagNumber(38)\n  $core.bool get isSubView => $_getBF(37);\n  @$pb.TagNumber(38)\n  set isSubView($core.bool value) => $_setBool(37, value);\n  @$pb.TagNumber(38)\n  $core.bool hasIsSubView() => $_has(37);\n  @$pb.TagNumber(38)\n  void clearIsSubView() => $_clearField(38);\n\n  @$pb.TagNumber(39)\n  $core.bool get isViewHide => $_getBF(38);\n  @$pb.TagNumber(39)\n  set isViewHide($core.bool value) => $_setBool(38, value);\n  @$pb.TagNumber(39)\n  $core.bool hasIsViewHide() => $_has(38);\n  @$pb.TagNumber(39)\n  void clearIsViewHide() => $_clearField(39);\n\n  @$pb.TagNumber(40)\n  $core.String get jumpLink => $_getSZ(39);\n  @$pb.TagNumber(40)\n  set jumpLink($core.String value) => $_setString(39, value);\n  @$pb.TagNumber(40)\n  $core.bool hasJumpLink() => $_has(39);\n  @$pb.TagNumber(40)\n  void clearJumpLink() => $_clearField(40);\n\n  @$pb.TagNumber(41)\n  Stat get statForUnity => $_getN(40);\n  @$pb.TagNumber(41)\n  set statForUnity(Stat value) => $_setField(41, value);\n  @$pb.TagNumber(41)\n  $core.bool hasStatForUnity() => $_has(40);\n  @$pb.TagNumber(41)\n  void clearStatForUnity() => $_clearField(41);\n  @$pb.TagNumber(41)\n  Stat ensureStatForUnity() => $_ensure(40);\n\n  @$pb.TagNumber(42)\n  $pb.PbMap<$core.String, $core.String> get report => $_getMap(41);\n\n  @$pb.TagNumber(43)\n  $core.int get sectionType => $_getIZ(42);\n  @$pb.TagNumber(43)\n  set sectionType($core.int value) => $_setSignedInt32(42, value);\n  @$pb.TagNumber(43)\n  $core.bool hasSectionType() => $_has(42);\n  @$pb.TagNumber(43)\n  void clearSectionType() => $_clearField(43);\n\n  @$pb.TagNumber(44)\n  $core.String get showTitle => $_getSZ(43);\n  @$pb.TagNumber(44)\n  set showTitle($core.String value) => $_setString(43, value);\n  @$pb.TagNumber(44)\n  $core.bool hasShowTitle() => $_has(43);\n  @$pb.TagNumber(44)\n  void clearShowTitle() => $_clearField(44);\n}\n\nclass ViewMaterial extends $pb.GeneratedMessage {\n  factory ViewMaterial({\n    $fixnum.Int64? oid,\n    $fixnum.Int64? mid,\n    $core.String? title,\n    $core.String? author,\n    $core.String? jumpUrl,\n  }) {\n    final result = create();\n    if (oid != null) result.oid = oid;\n    if (mid != null) result.mid = mid;\n    if (title != null) result.title = title;\n    if (author != null) result.author = author;\n    if (jumpUrl != null) result.jumpUrl = jumpUrl;\n    return result;\n  }\n\n  ViewMaterial._();\n\n  factory ViewMaterial.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ViewMaterial.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ViewMaterial',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'oid')\n    ..aInt64(2, _omitFieldNames ? '' : 'mid')\n    ..aOS(3, _omitFieldNames ? '' : 'title')\n    ..aOS(4, _omitFieldNames ? '' : 'author')\n    ..aOS(5, _omitFieldNames ? '' : 'jumpUrl')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ViewMaterial clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ViewMaterial copyWith(void Function(ViewMaterial) updates) =>\n      super.copyWith((message) => updates(message as ViewMaterial))\n          as ViewMaterial;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ViewMaterial create() => ViewMaterial._();\n  @$core.override\n  ViewMaterial createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ViewMaterial getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ViewMaterial>(create);\n  static ViewMaterial? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get oid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set oid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get mid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set mid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get title => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set title($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get author => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set author($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasAuthor() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearAuthor() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get jumpUrl => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set jumpUrl($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasJumpUrl() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearJumpUrl() => $_clearField(5);\n}\n\nclass Vip extends $pb.GeneratedMessage {\n  factory Vip({\n    $core.int? type,\n    $core.int? vipStatus,\n    $core.int? themeType,\n    VipLabel? label,\n    $core.int? isVip,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (vipStatus != null) result.vipStatus = vipStatus;\n    if (themeType != null) result.themeType = themeType;\n    if (label != null) result.label = label;\n    if (isVip != null) result.isVip = isVip;\n    return result;\n  }\n\n  Vip._();\n\n  factory Vip.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Vip.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Vip',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'type')\n    ..aI(2, _omitFieldNames ? '' : 'vipStatus')\n    ..aI(3, _omitFieldNames ? '' : 'themeType')\n    ..aOM<VipLabel>(4, _omitFieldNames ? '' : 'label',\n        subBuilder: VipLabel.create)\n    ..aI(5, _omitFieldNames ? '' : 'isVip')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Vip clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Vip copyWith(void Function(Vip) updates) =>\n      super.copyWith((message) => updates(message as Vip)) as Vip;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Vip create() => Vip._();\n  @$core.override\n  Vip createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Vip getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Vip>(create);\n  static Vip? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get type => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set type($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get vipStatus => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set vipStatus($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasVipStatus() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearVipStatus() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get themeType => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set themeType($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasThemeType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearThemeType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  VipLabel get label => $_getN(3);\n  @$pb.TagNumber(4)\n  set label(VipLabel value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLabel() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLabel() => $_clearField(4);\n  @$pb.TagNumber(4)\n  VipLabel ensureLabel() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.int get isVip => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set isVip($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasIsVip() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearIsVip() => $_clearField(5);\n}\n\nclass VipLabel extends $pb.GeneratedMessage {\n  factory VipLabel({\n    $core.String? path,\n    $core.String? text,\n    $core.String? labelTheme,\n  }) {\n    final result = create();\n    if (path != null) result.path = path;\n    if (text != null) result.text = text;\n    if (labelTheme != null) result.labelTheme = labelTheme;\n    return result;\n  }\n\n  VipLabel._();\n\n  factory VipLabel.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory VipLabel.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'VipLabel',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'path')\n    ..aOS(2, _omitFieldNames ? '' : 'text')\n    ..aOS(3, _omitFieldNames ? '' : 'labelTheme')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VipLabel clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VipLabel copyWith(void Function(VipLabel) updates) =>\n      super.copyWith((message) => updates(message as VipLabel)) as VipLabel;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static VipLabel create() => VipLabel._();\n  @$core.override\n  VipLabel createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static VipLabel getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<VipLabel>(create);\n  static VipLabel? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get path => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set path($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPath() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPath() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get labelTheme => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set labelTheme($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLabelTheme() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLabelTheme() => $_clearField(3);\n}\n\nclass WikiInfo extends $pb.GeneratedMessage {\n  factory WikiInfo({\n    $core.String? wikiLabel,\n    $core.String? wikiUrl,\n  }) {\n    final result = create();\n    if (wikiLabel != null) result.wikiLabel = wikiLabel;\n    if (wikiUrl != null) result.wikiUrl = wikiUrl;\n    return result;\n  }\n\n  WikiInfo._();\n\n  factory WikiInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory WikiInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'WikiInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'wikiLabel')\n    ..aOS(2, _omitFieldNames ? '' : 'wikiUrl')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  WikiInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  WikiInfo copyWith(void Function(WikiInfo) updates) =>\n      super.copyWith((message) => updates(message as WikiInfo)) as WikiInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static WikiInfo create() => WikiInfo._();\n  @$core.override\n  WikiInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static WikiInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<WikiInfo>(create);\n  static WikiInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get wikiLabel => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set wikiLabel($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasWikiLabel() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearWikiLabel() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get wikiUrl => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set wikiUrl($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasWikiUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearWikiUrl() => $_clearField(2);\n}\n\nclass WinShowCondition extends $pb.GeneratedMessage {\n  factory WinShowCondition({\n    $core.String? type,\n    $core.String? value,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (value != null) result.value = value;\n    return result;\n  }\n\n  WinShowCondition._();\n\n  factory WinShowCondition.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory WinShowCondition.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'WinShowCondition',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'type')\n    ..aOS(2, _omitFieldNames ? '' : 'value')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  WinShowCondition clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  WinShowCondition copyWith(void Function(WinShowCondition) updates) =>\n      super.copyWith((message) => updates(message as WinShowCondition))\n          as WinShowCondition;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static WinShowCondition create() => WinShowCondition._();\n  @$core.override\n  WinShowCondition createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static WinShowCondition getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<WinShowCondition>(create);\n  static WinShowCondition? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get type => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set type($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get value => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set value($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasValue() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearValue() => $_clearField(2);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/viewunite/common.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/viewunite/common.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nclass AttentionRelationStatus extends $pb.ProtobufEnum {\n  static const AttentionRelationStatus ARS_NONE =\n      AttentionRelationStatus._(0, _omitEnumNames ? '' : 'ARS_NONE');\n  static const AttentionRelationStatus ARS_N0RELATION =\n      AttentionRelationStatus._(1, _omitEnumNames ? '' : 'ARS_N0RELATION');\n  static const AttentionRelationStatus ARS_FOLLOWHIM =\n      AttentionRelationStatus._(2, _omitEnumNames ? '' : 'ARS_FOLLOWHIM');\n  static const AttentionRelationStatus ARS_FOLLOWME =\n      AttentionRelationStatus._(3, _omitEnumNames ? '' : 'ARS_FOLLOWME');\n  static const AttentionRelationStatus ARS_BUDDY =\n      AttentionRelationStatus._(4, _omitEnumNames ? '' : 'ARS_BUDDY');\n  static const AttentionRelationStatus ARS_SPECIAL =\n      AttentionRelationStatus._(5, _omitEnumNames ? '' : 'ARS_SPECIAL');\n  static const AttentionRelationStatus ARS_CANCELBLOCK =\n      AttentionRelationStatus._(6, _omitEnumNames ? '' : 'ARS_CANCELBLOCK');\n\n  static const $core.List<AttentionRelationStatus> values =\n      <AttentionRelationStatus>[\n    ARS_NONE,\n    ARS_N0RELATION,\n    ARS_FOLLOWHIM,\n    ARS_FOLLOWME,\n    ARS_BUDDY,\n    ARS_SPECIAL,\n    ARS_CANCELBLOCK,\n  ];\n\n  static final $core.List<AttentionRelationStatus?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 6);\n  static AttentionRelationStatus? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const AttentionRelationStatus._(super.value, super.name);\n}\n\nclass DescType extends $pb.ProtobufEnum {\n  static const DescType DescTypeUnknown =\n      DescType._(0, _omitEnumNames ? '' : 'DescTypeUnknown');\n  static const DescType DescTypeText =\n      DescType._(1, _omitEnumNames ? '' : 'DescTypeText');\n  static const DescType DescTypeAt =\n      DescType._(2, _omitEnumNames ? '' : 'DescTypeAt');\n\n  static const $core.List<DescType> values = <DescType>[\n    DescTypeUnknown,\n    DescTypeText,\n    DescTypeAt,\n  ];\n\n  static final $core.List<DescType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static DescType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const DescType._(super.value, super.name);\n}\n\nclass ExtType extends $pb.ProtobufEnum {\n  static const ExtType ExtNone = ExtType._(0, _omitEnumNames ? '' : 'ExtNone');\n  static const ExtType ExtDataCenter =\n      ExtType._(1, _omitEnumNames ? '' : 'ExtDataCenter');\n  static const ExtType ExtDataEarnings =\n      ExtType._(2, _omitEnumNames ? '' : 'ExtDataEarnings');\n\n  static const $core.List<ExtType> values = <ExtType>[\n    ExtNone,\n    ExtDataCenter,\n    ExtDataEarnings,\n  ];\n\n  static final $core.List<ExtType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static ExtType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ExtType._(super.value, super.name);\n}\n\nclass HonorJumpType extends $pb.ProtobufEnum {\n  static const HonorJumpType HONOR_JUMP_TYPE_UNKNOWN =\n      HonorJumpType._(0, _omitEnumNames ? '' : 'HONOR_JUMP_TYPE_UNKNOWN');\n  static const HonorJumpType HONOR_OPEN_URL =\n      HonorJumpType._(1, _omitEnumNames ? '' : 'HONOR_OPEN_URL');\n  static const HonorJumpType HONOR_HALF_SCREEN =\n      HonorJumpType._(2, _omitEnumNames ? '' : 'HONOR_HALF_SCREEN');\n  static const HonorJumpType HONOR_POPUP =\n      HonorJumpType._(3, _omitEnumNames ? '' : 'HONOR_POPUP');\n\n  static const $core.List<HonorJumpType> values = <HonorJumpType>[\n    HONOR_JUMP_TYPE_UNKNOWN,\n    HONOR_OPEN_URL,\n    HONOR_HALF_SCREEN,\n    HONOR_POPUP,\n  ];\n\n  static final $core.List<HonorJumpType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static HonorJumpType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const HonorJumpType._(super.value, super.name);\n}\n\nclass HonorType extends $pb.ProtobufEnum {\n  static const HonorType HONOR_NONE =\n      HonorType._(0, _omitEnumNames ? '' : 'HONOR_NONE');\n  static const HonorType PLAYLET =\n      HonorType._(1, _omitEnumNames ? '' : 'PLAYLET');\n  static const HonorType ARGUE = HonorType._(2, _omitEnumNames ? '' : 'ARGUE');\n  static const HonorType NOTICE =\n      HonorType._(3, _omitEnumNames ? '' : 'NOTICE');\n  static const HonorType GUIDANCE =\n      HonorType._(4, _omitEnumNames ? '' : 'GUIDANCE');\n  static const HonorType HONOR_BILI_RANK =\n      HonorType._(5, _omitEnumNames ? '' : 'HONOR_BILI_RANK');\n  static const HonorType HONOR_WEEKLY_RANK =\n      HonorType._(6, _omitEnumNames ? '' : 'HONOR_WEEKLY_RANK');\n  static const HonorType HONOR_DAILY_RANK =\n      HonorType._(7, _omitEnumNames ? '' : 'HONOR_DAILY_RANK');\n  static const HonorType HONOR_CHANNEL =\n      HonorType._(8, _omitEnumNames ? '' : 'HONOR_CHANNEL');\n  static const HonorType HONOR_MUSIC =\n      HonorType._(9, _omitEnumNames ? '' : 'HONOR_MUSIC');\n  static const HonorType HONOR_REPLY =\n      HonorType._(10, _omitEnumNames ? '' : 'HONOR_REPLY');\n  static const HonorType HONOR_PROFESSION =\n      HonorType._(11, _omitEnumNames ? '' : 'HONOR_PROFESSION');\n  static const HonorType HONOR_HOT_WORD =\n      HonorType._(12, _omitEnumNames ? '' : 'HONOR_HOT_WORD');\n\n  static const $core.List<HonorType> values = <HonorType>[\n    HONOR_NONE,\n    PLAYLET,\n    ARGUE,\n    NOTICE,\n    GUIDANCE,\n    HONOR_BILI_RANK,\n    HONOR_WEEKLY_RANK,\n    HONOR_DAILY_RANK,\n    HONOR_CHANNEL,\n    HONOR_MUSIC,\n    HONOR_REPLY,\n    HONOR_PROFESSION,\n    HONOR_HOT_WORD,\n  ];\n\n  static final $core.List<HonorType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 12);\n  static HonorType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const HonorType._(super.value, super.name);\n}\n\nclass JumpType extends $pb.ProtobufEnum {\n  static const JumpType JUMP_TYPE_UNKNOWN =\n      JumpType._(0, _omitEnumNames ? '' : 'JUMP_TYPE_UNKNOWN');\n  static const JumpType OPEN_URL =\n      JumpType._(1, _omitEnumNames ? '' : 'OPEN_URL');\n  static const JumpType REFRESH =\n      JumpType._(2, _omitEnumNames ? '' : 'REFRESH');\n  static const JumpType HALF_SCREEN =\n      JumpType._(3, _omitEnumNames ? '' : 'HALF_SCREEN');\n  static const JumpType OPEN_URL_BY_OUTER_BROWSER =\n      JumpType._(4, _omitEnumNames ? '' : 'OPEN_URL_BY_OUTER_BROWSER');\n\n  static const $core.List<JumpType> values = <JumpType>[\n    JUMP_TYPE_UNKNOWN,\n    OPEN_URL,\n    REFRESH,\n    HALF_SCREEN,\n    OPEN_URL_BY_OUTER_BROWSER,\n  ];\n\n  static final $core.List<JumpType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 4);\n  static JumpType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const JumpType._(super.value, super.name);\n}\n\nclass KingPositionType extends $pb.ProtobufEnum {\n  static const KingPositionType KING_POS_UNSPECIFIED =\n      KingPositionType._(0, _omitEnumNames ? '' : 'KING_POS_UNSPECIFIED');\n  static const KingPositionType LIKE =\n      KingPositionType._(1, _omitEnumNames ? '' : 'LIKE');\n  static const KingPositionType DISLIKE =\n      KingPositionType._(2, _omitEnumNames ? '' : 'DISLIKE');\n  static const KingPositionType COIN =\n      KingPositionType._(3, _omitEnumNames ? '' : 'COIN');\n  static const KingPositionType FAV =\n      KingPositionType._(4, _omitEnumNames ? '' : 'FAV');\n  static const KingPositionType SHARE =\n      KingPositionType._(5, _omitEnumNames ? '' : 'SHARE');\n  static const KingPositionType CACHE =\n      KingPositionType._(6, _omitEnumNames ? '' : 'CACHE');\n  static const KingPositionType DANMAKU =\n      KingPositionType._(7, _omitEnumNames ? '' : 'DANMAKU');\n\n  static const $core.List<KingPositionType> values = <KingPositionType>[\n    KING_POS_UNSPECIFIED,\n    LIKE,\n    DISLIKE,\n    COIN,\n    FAV,\n    SHARE,\n    CACHE,\n    DANMAKU,\n  ];\n\n  static final $core.List<KingPositionType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 7);\n  static KingPositionType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const KingPositionType._(super.value, super.name);\n}\n\nclass ModuleType extends $pb.ProtobufEnum {\n  static const ModuleType UNKNOWN =\n      ModuleType._(0, _omitEnumNames ? '' : 'UNKNOWN');\n  static const ModuleType OGV_INTRODUCTION =\n      ModuleType._(1, _omitEnumNames ? '' : 'OGV_INTRODUCTION');\n  static const ModuleType OGV_TITLE =\n      ModuleType._(2, _omitEnumNames ? '' : 'OGV_TITLE');\n  static const ModuleType UGC_HEADLINE =\n      ModuleType._(3, _omitEnumNames ? '' : 'UGC_HEADLINE');\n  static const ModuleType UGC_INTRODUCTION =\n      ModuleType._(4, _omitEnumNames ? '' : 'UGC_INTRODUCTION');\n  static const ModuleType KING_POSITION =\n      ModuleType._(5, _omitEnumNames ? '' : 'KING_POSITION');\n  static const ModuleType MASTER_USER_LIST =\n      ModuleType._(6, _omitEnumNames ? '' : 'MASTER_USER_LIST');\n  static const ModuleType STAFFS =\n      ModuleType._(7, _omitEnumNames ? '' : 'STAFFS');\n  static const ModuleType HONOR =\n      ModuleType._(8, _omitEnumNames ? '' : 'HONOR');\n  static const ModuleType OWNER =\n      ModuleType._(9, _omitEnumNames ? '' : 'OWNER');\n  static const ModuleType PAGE = ModuleType._(10, _omitEnumNames ? '' : 'PAGE');\n  static const ModuleType ACTIVITY_RESERVE =\n      ModuleType._(11, _omitEnumNames ? '' : 'ACTIVITY_RESERVE');\n  static const ModuleType LIVE_ORDER =\n      ModuleType._(12, _omitEnumNames ? '' : 'LIVE_ORDER');\n  static const ModuleType POSITIVE =\n      ModuleType._(13, _omitEnumNames ? '' : 'POSITIVE');\n  static const ModuleType SECTION =\n      ModuleType._(14, _omitEnumNames ? '' : 'SECTION');\n  static const ModuleType RELATE =\n      ModuleType._(15, _omitEnumNames ? '' : 'RELATE');\n  static const ModuleType PUGV = ModuleType._(16, _omitEnumNames ? '' : 'PUGV');\n  static const ModuleType COLLECTION_CARD =\n      ModuleType._(17, _omitEnumNames ? '' : 'COLLECTION_CARD');\n  static const ModuleType ACTIVITY =\n      ModuleType._(18, _omitEnumNames ? '' : 'ACTIVITY');\n  static const ModuleType CHARACTER =\n      ModuleType._(19, _omitEnumNames ? '' : 'CHARACTER');\n  static const ModuleType FOLLOW_LAYER =\n      ModuleType._(20, _omitEnumNames ? '' : 'FOLLOW_LAYER');\n  static const ModuleType OGV_SEASONS =\n      ModuleType._(21, _omitEnumNames ? '' : 'OGV_SEASONS');\n  static const ModuleType UGC_SEASON =\n      ModuleType._(22, _omitEnumNames ? '' : 'UGC_SEASON');\n  static const ModuleType OGV_LIVE_RESERVE =\n      ModuleType._(23, _omitEnumNames ? '' : 'OGV_LIVE_RESERVE');\n  static const ModuleType COMBINATION_EPISODE =\n      ModuleType._(24, _omitEnumNames ? '' : 'COMBINATION_EPISODE');\n  static const ModuleType SPONSOR =\n      ModuleType._(25, _omitEnumNames ? '' : 'SPONSOR');\n  static const ModuleType ACTIVITY_ENTRANCE =\n      ModuleType._(26, _omitEnumNames ? '' : 'ACTIVITY_ENTRANCE');\n  static const ModuleType THEATRE_HOT_TOPIC =\n      ModuleType._(27, _omitEnumNames ? '' : 'THEATRE_HOT_TOPIC');\n  static const ModuleType RELATED_RECOMMEND =\n      ModuleType._(28, _omitEnumNames ? '' : 'RELATED_RECOMMEND');\n  static const ModuleType PAY_BAR =\n      ModuleType._(29, _omitEnumNames ? '' : 'PAY_BAR');\n  static const ModuleType BANNER =\n      ModuleType._(30, _omitEnumNames ? '' : 'BANNER');\n  static const ModuleType AUDIO =\n      ModuleType._(31, _omitEnumNames ? '' : 'AUDIO');\n  static const ModuleType AGG_CARD =\n      ModuleType._(32, _omitEnumNames ? '' : 'AGG_CARD');\n  static const ModuleType SINGLE_EP =\n      ModuleType._(33, _omitEnumNames ? '' : 'SINGLE_EP');\n  static const ModuleType LIKE_COMMENT =\n      ModuleType._(34, _omitEnumNames ? '' : 'LIKE_COMMENT');\n  static const ModuleType ATTENTION_RECOMMEND =\n      ModuleType._(35, _omitEnumNames ? '' : 'ATTENTION_RECOMMEND');\n  static const ModuleType COVENANTER =\n      ModuleType._(36, _omitEnumNames ? '' : 'COVENANTER');\n  static const ModuleType SPECIALTAG =\n      ModuleType._(37, _omitEnumNames ? '' : 'SPECIALTAG');\n  static const ModuleType UPDATA =\n      ModuleType._(38, _omitEnumNames ? '' : 'UPDATA');\n  static const ModuleType PROFESSION_APPROVAL =\n      ModuleType._(39, _omitEnumNames ? '' : 'PROFESSION_APPROVAL');\n  static const ModuleType PUGV_SHOPPING_NOTICE =\n      ModuleType._(40, _omitEnumNames ? '' : 'PUGV_SHOPPING_NOTICE');\n  static const ModuleType PUGV_FAQ =\n      ModuleType._(41, _omitEnumNames ? '' : 'PUGV_FAQ');\n  static const ModuleType PUGV_SEASON_DESCRIPTION =\n      ModuleType._(42, _omitEnumNames ? '' : 'PUGV_SEASON_DESCRIPTION');\n  static const ModuleType PUGV_SEASON_RECOMMEND =\n      ModuleType._(43, _omitEnumNames ? '' : 'PUGV_SEASON_RECOMMEND');\n  static const ModuleType PUGV_SEASON_PUBLISHER =\n      ModuleType._(44, _omitEnumNames ? '' : 'PUGV_SEASON_PUBLISHER');\n  static const ModuleType PUGV_SEASON_SELECTION =\n      ModuleType._(45, _omitEnumNames ? '' : 'PUGV_SEASON_SELECTION');\n  static const ModuleType PUGV_SEASON_PRIMARY_INFO =\n      ModuleType._(46, _omitEnumNames ? '' : 'PUGV_SEASON_PRIMARY_INFO');\n  static const ModuleType PUGV_COOPERATION_APPLICATION =\n      ModuleType._(47, _omitEnumNames ? '' : 'PUGV_COOPERATION_APPLICATION');\n  static const ModuleType UP_VIDEO_TOOL =\n      ModuleType._(48, _omitEnumNames ? '' : 'UP_VIDEO_TOOL');\n  static const ModuleType PUGV_ZONE =\n      ModuleType._(49, _omitEnumNames ? '' : 'PUGV_ZONE');\n  static const ModuleType PUGV_SERIES =\n      ModuleType._(50, _omitEnumNames ? '' : 'PUGV_SERIES');\n  static const ModuleType PUGV_PACKAGE =\n      ModuleType._(51, _omitEnumNames ? '' : 'PUGV_PACKAGE');\n  static const ModuleType ACTIVITY_STAR_RAIL =\n      ModuleType._(52, _omitEnumNames ? '' : 'ACTIVITY_STAR_RAIL');\n  static const ModuleType ACTIVITY_IFRAME =\n      ModuleType._(53, _omitEnumNames ? '' : 'ACTIVITY_IFRAME');\n  static const ModuleType PLAY_LIST =\n      ModuleType._(54, _omitEnumNames ? '' : 'PLAY_LIST');\n  static const ModuleType MERCHANDISE =\n      ModuleType._(55, _omitEnumNames ? '' : 'MERCHANDISE');\n  static const ModuleType ACTIVITY_GUIDANCE_BAR =\n      ModuleType._(56, _omitEnumNames ? '' : 'ACTIVITY_GUIDANCE_BAR');\n\n  static const $core.List<ModuleType> values = <ModuleType>[\n    UNKNOWN,\n    OGV_INTRODUCTION,\n    OGV_TITLE,\n    UGC_HEADLINE,\n    UGC_INTRODUCTION,\n    KING_POSITION,\n    MASTER_USER_LIST,\n    STAFFS,\n    HONOR,\n    OWNER,\n    PAGE,\n    ACTIVITY_RESERVE,\n    LIVE_ORDER,\n    POSITIVE,\n    SECTION,\n    RELATE,\n    PUGV,\n    COLLECTION_CARD,\n    ACTIVITY,\n    CHARACTER,\n    FOLLOW_LAYER,\n    OGV_SEASONS,\n    UGC_SEASON,\n    OGV_LIVE_RESERVE,\n    COMBINATION_EPISODE,\n    SPONSOR,\n    ACTIVITY_ENTRANCE,\n    THEATRE_HOT_TOPIC,\n    RELATED_RECOMMEND,\n    PAY_BAR,\n    BANNER,\n    AUDIO,\n    AGG_CARD,\n    SINGLE_EP,\n    LIKE_COMMENT,\n    ATTENTION_RECOMMEND,\n    COVENANTER,\n    SPECIALTAG,\n    UPDATA,\n    PROFESSION_APPROVAL,\n    PUGV_SHOPPING_NOTICE,\n    PUGV_FAQ,\n    PUGV_SEASON_DESCRIPTION,\n    PUGV_SEASON_RECOMMEND,\n    PUGV_SEASON_PUBLISHER,\n    PUGV_SEASON_SELECTION,\n    PUGV_SEASON_PRIMARY_INFO,\n    PUGV_COOPERATION_APPLICATION,\n    UP_VIDEO_TOOL,\n    PUGV_ZONE,\n    PUGV_SERIES,\n    PUGV_PACKAGE,\n    ACTIVITY_STAR_RAIL,\n    ACTIVITY_IFRAME,\n    PLAY_LIST,\n    MERCHANDISE,\n    ACTIVITY_GUIDANCE_BAR,\n  ];\n\n  static final $core.List<ModuleType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 56);\n  static ModuleType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ModuleType._(super.value, super.name);\n}\n\nclass OccupationType extends $pb.ProtobufEnum {\n  static const OccupationType STAFF =\n      OccupationType._(0, _omitEnumNames ? '' : 'STAFF');\n  static const OccupationType CAST =\n      OccupationType._(1, _omitEnumNames ? '' : 'CAST');\n  static const OccupationType UNKNOWN_TYPE =\n      OccupationType._(-1, _omitEnumNames ? '' : 'UNKNOWN_TYPE');\n\n  static const $core.List<OccupationType> values = <OccupationType>[\n    STAFF,\n    CAST,\n    UNKNOWN_TYPE,\n  ];\n\n  static final $core.Map<$core.int, OccupationType> _byValue =\n      $pb.ProtobufEnum.initByValue(values);\n  static OccupationType? valueOf($core.int value) => _byValue[value];\n\n  const OccupationType._(super.value, super.name);\n}\n\nclass PugvSeasonDescriptionType extends $pb.ProtobufEnum {\n  static const PugvSeasonDescriptionType\n      PUGV_SEASON_DESCRIPTION_TYPE_UNSPECIFIED = PugvSeasonDescriptionType._(\n          0, _omitEnumNames ? '' : 'PUGV_SEASON_DESCRIPTION_TYPE_UNSPECIFIED');\n  static const PugvSeasonDescriptionType PUGV_SEASON_DESCRIPTION_TYPE_TEXT =\n      PugvSeasonDescriptionType._(\n          1, _omitEnumNames ? '' : 'PUGV_SEASON_DESCRIPTION_TYPE_TEXT');\n  static const PugvSeasonDescriptionType PUGV_SEASON_DESCRIPTION_TYPE_IMAGE =\n      PugvSeasonDescriptionType._(\n          2, _omitEnumNames ? '' : 'PUGV_SEASON_DESCRIPTION_TYPE_IMAGE');\n\n  static const $core.List<PugvSeasonDescriptionType> values =\n      <PugvSeasonDescriptionType>[\n    PUGV_SEASON_DESCRIPTION_TYPE_UNSPECIFIED,\n    PUGV_SEASON_DESCRIPTION_TYPE_TEXT,\n    PUGV_SEASON_DESCRIPTION_TYPE_IMAGE,\n  ];\n\n  static final $core.List<PugvSeasonDescriptionType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static PugvSeasonDescriptionType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const PugvSeasonDescriptionType._(super.value, super.name);\n}\n\nclass PugvSeasonPrimarySellPointType extends $pb.ProtobufEnum {\n  static const PugvSeasonPrimarySellPointType\n      PUGV_SEASON_PRIMARY_SELL_POINT_TYPE_UNSPECIFIED =\n      PugvSeasonPrimarySellPointType._(\n          0,\n          _omitEnumNames\n              ? ''\n              : 'PUGV_SEASON_PRIMARY_SELL_POINT_TYPE_UNSPECIFIED');\n  static const PugvSeasonPrimarySellPointType\n      PUGV_SEASON_PRIMARY_SELL_POINT_TYPE_MANUAL =\n      PugvSeasonPrimarySellPointType._(1,\n          _omitEnumNames ? '' : 'PUGV_SEASON_PRIMARY_SELL_POINT_TYPE_MANUAL');\n  static const PugvSeasonPrimarySellPointType\n      PUGV_SEASON_PRIMARY_SELL_POINT_TYPE_AUTO =\n      PugvSeasonPrimarySellPointType._(\n          2, _omitEnumNames ? '' : 'PUGV_SEASON_PRIMARY_SELL_POINT_TYPE_AUTO');\n\n  static const $core.List<PugvSeasonPrimarySellPointType> values =\n      <PugvSeasonPrimarySellPointType>[\n    PUGV_SEASON_PRIMARY_SELL_POINT_TYPE_UNSPECIFIED,\n    PUGV_SEASON_PRIMARY_SELL_POINT_TYPE_MANUAL,\n    PUGV_SEASON_PRIMARY_SELL_POINT_TYPE_AUTO,\n  ];\n\n  static final $core.List<PugvSeasonPrimarySellPointType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static PugvSeasonPrimarySellPointType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const PugvSeasonPrimarySellPointType._(super.value, super.name);\n}\n\nclass PugvSeasonRecommendShowStyle extends $pb.ProtobufEnum {\n  static const PugvSeasonRecommendShowStyle\n      PUGV_SEASON_RECOMMEND_SHOW_STYLE_UNSPECIFIED =\n      PugvSeasonRecommendShowStyle._(0,\n          _omitEnumNames ? '' : 'PUGV_SEASON_RECOMMEND_SHOW_STYLE_UNSPECIFIED');\n  static const PugvSeasonRecommendShowStyle\n      PUGV_SEASON_RECOMMEND_SHOW_STYLE_MORE = PugvSeasonRecommendShowStyle._(\n          1, _omitEnumNames ? '' : 'PUGV_SEASON_RECOMMEND_SHOW_STYLE_MORE');\n  static const PugvSeasonRecommendShowStyle\n      PUGV_SEASON_RECOMMEND_SHOW_STYLE_FEED = PugvSeasonRecommendShowStyle._(\n          2, _omitEnumNames ? '' : 'PUGV_SEASON_RECOMMEND_SHOW_STYLE_FEED');\n\n  static const $core.List<PugvSeasonRecommendShowStyle> values =\n      <PugvSeasonRecommendShowStyle>[\n    PUGV_SEASON_RECOMMEND_SHOW_STYLE_UNSPECIFIED,\n    PUGV_SEASON_RECOMMEND_SHOW_STYLE_MORE,\n    PUGV_SEASON_RECOMMEND_SHOW_STYLE_FEED,\n  ];\n\n  static final $core.List<PugvSeasonRecommendShowStyle?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static PugvSeasonRecommendShowStyle? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const PugvSeasonRecommendShowStyle._(super.value, super.name);\n}\n\nclass PugvSeriesItemState extends $pb.ProtobufEnum {\n  static const PugvSeriesItemState PUGV_SERIRES_ITEM_STATE_UNSPECIAL =\n      PugvSeriesItemState._(\n          0, _omitEnumNames ? '' : 'PUGV_SERIRES_ITEM_STATE_UNSPECIAL');\n  static const PugvSeriesItemState PUGV_SERIRES_ITEM_STATE_NOT_START =\n      PugvSeriesItemState._(\n          1, _omitEnumNames ? '' : 'PUGV_SERIRES_ITEM_STATE_NOT_START');\n  static const PugvSeriesItemState PUGV_SERIRES_ITEM_STATE_START =\n      PugvSeriesItemState._(\n          2, _omitEnumNames ? '' : 'PUGV_SERIRES_ITEM_STATE_START');\n  static const PugvSeriesItemState PUGV_SERIRES_ITEM_STATE_END =\n      PugvSeriesItemState._(\n          3, _omitEnumNames ? '' : 'PUGV_SERIRES_ITEM_STATE_END');\n\n  static const $core.List<PugvSeriesItemState> values = <PugvSeriesItemState>[\n    PUGV_SERIRES_ITEM_STATE_UNSPECIAL,\n    PUGV_SERIRES_ITEM_STATE_NOT_START,\n    PUGV_SERIRES_ITEM_STATE_START,\n    PUGV_SERIRES_ITEM_STATE_END,\n  ];\n\n  static final $core.List<PugvSeriesItemState?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static PugvSeriesItemState? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const PugvSeriesItemState._(super.value, super.name);\n}\n\nclass PugvZoneItemType extends $pb.ProtobufEnum {\n  static const PugvZoneItemType PUGV_ZONE_ITEM_TYPE_UNSPECIFIED =\n      PugvZoneItemType._(\n          0, _omitEnumNames ? '' : 'PUGV_ZONE_ITEM_TYPE_UNSPECIFIED');\n  static const PugvZoneItemType PUGV_ZONE_ITEM_TYPE_SEASON =\n      PugvZoneItemType._(1, _omitEnumNames ? '' : 'PUGV_ZONE_ITEM_TYPE_SEASON');\n  static const PugvZoneItemType PUGV_ZONE_ITEM_TYPE_POSTGRADUATE =\n      PugvZoneItemType._(\n          2, _omitEnumNames ? '' : 'PUGV_ZONE_ITEM_TYPE_POSTGRADUATE');\n\n  static const $core.List<PugvZoneItemType> values = <PugvZoneItemType>[\n    PUGV_ZONE_ITEM_TYPE_UNSPECIFIED,\n    PUGV_ZONE_ITEM_TYPE_SEASON,\n    PUGV_ZONE_ITEM_TYPE_POSTGRADUATE,\n  ];\n\n  static final $core.List<PugvZoneItemType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static PugvZoneItemType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const PugvZoneItemType._(super.value, super.name);\n}\n\nclass RelateCardType extends $pb.ProtobufEnum {\n  static const RelateCardType CARD_TYPE_UNKNOWN =\n      RelateCardType._(0, _omitEnumNames ? '' : 'CARD_TYPE_UNKNOWN');\n  static const RelateCardType AV =\n      RelateCardType._(1, _omitEnumNames ? '' : 'AV');\n  static const RelateCardType BANGUMI =\n      RelateCardType._(2, _omitEnumNames ? '' : 'BANGUMI');\n  static const RelateCardType RESOURCE =\n      RelateCardType._(3, _omitEnumNames ? '' : 'RESOURCE');\n  static const RelateCardType GAME =\n      RelateCardType._(4, _omitEnumNames ? '' : 'GAME');\n  static const RelateCardType CM =\n      RelateCardType._(5, _omitEnumNames ? '' : 'CM');\n  static const RelateCardType LIVE =\n      RelateCardType._(6, _omitEnumNames ? '' : 'LIVE');\n  static const RelateCardType AI_RECOMMEND =\n      RelateCardType._(7, _omitEnumNames ? '' : 'AI_RECOMMEND');\n  static const RelateCardType BANGUMI_AV =\n      RelateCardType._(8, _omitEnumNames ? '' : 'BANGUMI_AV');\n  static const RelateCardType BANGUMI_UGC =\n      RelateCardType._(9, _omitEnumNames ? '' : 'BANGUMI_UGC');\n  static const RelateCardType SPECIAL =\n      RelateCardType._(10, _omitEnumNames ? '' : 'SPECIAL');\n  static const RelateCardType COURSE =\n      RelateCardType._(11, _omitEnumNames ? '' : 'COURSE');\n  static const RelateCardType MINI_PROGRAM =\n      RelateCardType._(12, _omitEnumNames ? '' : 'MINI_PROGRAM');\n  static const RelateCardType HISTORY_AV =\n      RelateCardType._(13, _omitEnumNames ? '' : 'HISTORY_AV');\n\n  static const $core.List<RelateCardType> values = <RelateCardType>[\n    CARD_TYPE_UNKNOWN,\n    AV,\n    BANGUMI,\n    RESOURCE,\n    GAME,\n    CM,\n    LIVE,\n    AI_RECOMMEND,\n    BANGUMI_AV,\n    BANGUMI_UGC,\n    SPECIAL,\n    COURSE,\n    MINI_PROGRAM,\n    HISTORY_AV,\n  ];\n\n  static final $core.List<RelateCardType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 13);\n  static RelateCardType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const RelateCardType._(super.value, super.name);\n}\n\nclass ReserveBizType extends $pb.ProtobufEnum {\n  static const ReserveBizType BizTypeNone =\n      ReserveBizType._(0, _omitEnumNames ? '' : 'BizTypeNone');\n  static const ReserveBizType BizTypeReserveActivity =\n      ReserveBizType._(1, _omitEnumNames ? '' : 'BizTypeReserveActivity');\n  static const ReserveBizType BizTypeFavSeason =\n      ReserveBizType._(2, _omitEnumNames ? '' : 'BizTypeFavSeason');\n\n  static const $core.List<ReserveBizType> values = <ReserveBizType>[\n    BizTypeNone,\n    BizTypeReserveActivity,\n    BizTypeFavSeason,\n  ];\n\n  static final $core.List<ReserveBizType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static ReserveBizType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ReserveBizType._(super.value, super.name);\n}\n\nclass SeasonType extends $pb.ProtobufEnum {\n  static const SeasonType Unknown =\n      SeasonType._(0, _omitEnumNames ? '' : 'Unknown');\n  static const SeasonType Base = SeasonType._(1, _omitEnumNames ? '' : 'Base');\n  static const SeasonType Good = SeasonType._(2, _omitEnumNames ? '' : 'Good');\n\n  static const $core.List<SeasonType> values = <SeasonType>[\n    Unknown,\n    Base,\n    Good,\n  ];\n\n  static final $core.List<SeasonType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static SeasonType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const SeasonType._(super.value, super.name);\n}\n\nclass SerialSeasonCoverStyle extends $pb.ProtobufEnum {\n  static const SerialSeasonCoverStyle TITLE =\n      SerialSeasonCoverStyle._(0, _omitEnumNames ? '' : 'TITLE');\n  static const SerialSeasonCoverStyle PICTURE =\n      SerialSeasonCoverStyle._(1, _omitEnumNames ? '' : 'PICTURE');\n  static const SerialSeasonCoverStyle SERIAL_SEASON_COVER_STYLE_UNKNOWN =\n      SerialSeasonCoverStyle._(\n          -1, _omitEnumNames ? '' : 'SERIAL_SEASON_COVER_STYLE_UNKNOWN');\n\n  static const $core.List<SerialSeasonCoverStyle> values =\n      <SerialSeasonCoverStyle>[\n    TITLE,\n    PICTURE,\n    SERIAL_SEASON_COVER_STYLE_UNKNOWN,\n  ];\n\n  static final $core.Map<$core.int, SerialSeasonCoverStyle> _byValue =\n      $pb.ProtobufEnum.initByValue(values);\n  static SerialSeasonCoverStyle? valueOf($core.int value) => _byValue[value];\n\n  const SerialSeasonCoverStyle._(super.value, super.name);\n}\n\nclass ShowStyle extends $pb.ProtobufEnum {\n  static const ShowStyle SHOW_STYLE_UNKNOWN =\n      ShowStyle._(0, _omitEnumNames ? '' : 'SHOW_STYLE_UNKNOWN');\n  static const ShowStyle ONE_ROW_ONE_COLUMN =\n      ShowStyle._(1, _omitEnumNames ? '' : 'ONE_ROW_ONE_COLUMN');\n  static const ShowStyle ONE_ROW_MULTI_COLUMN =\n      ShowStyle._(2, _omitEnumNames ? '' : 'ONE_ROW_MULTI_COLUMN');\n  static const ShowStyle ONE_COLUMN_MULTI_ROW =\n      ShowStyle._(3, _omitEnumNames ? '' : 'ONE_COLUMN_MULTI_ROW');\n\n  static const $core.List<ShowStyle> values = <ShowStyle>[\n    SHOW_STYLE_UNKNOWN,\n    ONE_ROW_ONE_COLUMN,\n    ONE_ROW_MULTI_COLUMN,\n    ONE_COLUMN_MULTI_ROW,\n  ];\n\n  static final $core.List<ShowStyle?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static ShowStyle? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ShowStyle._(super.value, super.name);\n}\n\nclass ToolType extends $pb.ProtobufEnum {\n  static const ToolType INTERACTIVE_DANMAKU =\n      ToolType._(0, _omitEnumNames ? '' : 'INTERACTIVE_DANMAKU');\n  static const ToolType INTERACTIVE_SETTINGS =\n      ToolType._(1, _omitEnumNames ? '' : 'INTERACTIVE_SETTINGS');\n  static const ToolType TAKE_OFF =\n      ToolType._(2, _omitEnumNames ? '' : 'TAKE_OFF');\n  static const ToolType UNIVERSAL =\n      ToolType._(3, _omitEnumNames ? '' : 'UNIVERSAL');\n\n  static const $core.List<ToolType> values = <ToolType>[\n    INTERACTIVE_DANMAKU,\n    INTERACTIVE_SETTINGS,\n    TAKE_OFF,\n    UNIVERSAL,\n  ];\n\n  static final $core.List<ToolType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static ToolType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ToolType._(super.value, super.name);\n}\n\nconst $core.bool _omitEnumNames =\n    $core.bool.fromEnvironment('protobuf.omit_enum_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/viewunite/common.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/viewunite/common.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use attentionRelationStatusDescriptor instead')\nconst AttentionRelationStatus$json = {\n  '1': 'AttentionRelationStatus',\n  '2': [\n    {'1': 'ARS_NONE', '2': 0},\n    {'1': 'ARS_N0RELATION', '2': 1},\n    {'1': 'ARS_FOLLOWHIM', '2': 2},\n    {'1': 'ARS_FOLLOWME', '2': 3},\n    {'1': 'ARS_BUDDY', '2': 4},\n    {'1': 'ARS_SPECIAL', '2': 5},\n    {'1': 'ARS_CANCELBLOCK', '2': 6},\n  ],\n};\n\n/// Descriptor for `AttentionRelationStatus`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List attentionRelationStatusDescriptor = $convert.base64Decode(\n    'ChdBdHRlbnRpb25SZWxhdGlvblN0YXR1cxIMCghBUlNfTk9ORRAAEhIKDkFSU19OMFJFTEFUSU'\n    '9OEAESEQoNQVJTX0ZPTExPV0hJTRACEhAKDEFSU19GT0xMT1dNRRADEg0KCUFSU19CVUREWRAE'\n    'Eg8KC0FSU19TUEVDSUFMEAUSEwoPQVJTX0NBTkNFTEJMT0NLEAY=');\n\n@$core.Deprecated('Use descTypeDescriptor instead')\nconst DescType$json = {\n  '1': 'DescType',\n  '2': [\n    {'1': 'DescTypeUnknown', '2': 0},\n    {'1': 'DescTypeText', '2': 1},\n    {'1': 'DescTypeAt', '2': 2},\n  ],\n};\n\n/// Descriptor for `DescType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List descTypeDescriptor = $convert.base64Decode(\n    'CghEZXNjVHlwZRITCg9EZXNjVHlwZVVua25vd24QABIQCgxEZXNjVHlwZVRleHQQARIOCgpEZX'\n    'NjVHlwZUF0EAI=');\n\n@$core.Deprecated('Use extTypeDescriptor instead')\nconst ExtType$json = {\n  '1': 'ExtType',\n  '2': [\n    {'1': 'ExtNone', '2': 0},\n    {'1': 'ExtDataCenter', '2': 1},\n    {'1': 'ExtDataEarnings', '2': 2},\n  ],\n};\n\n/// Descriptor for `ExtType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List extTypeDescriptor = $convert.base64Decode(\n    'CgdFeHRUeXBlEgsKB0V4dE5vbmUQABIRCg1FeHREYXRhQ2VudGVyEAESEwoPRXh0RGF0YUVhcm'\n    '5pbmdzEAI=');\n\n@$core.Deprecated('Use honorJumpTypeDescriptor instead')\nconst HonorJumpType$json = {\n  '1': 'HonorJumpType',\n  '2': [\n    {'1': 'HONOR_JUMP_TYPE_UNKNOWN', '2': 0},\n    {'1': 'HONOR_OPEN_URL', '2': 1},\n    {'1': 'HONOR_HALF_SCREEN', '2': 2},\n    {'1': 'HONOR_POPUP', '2': 3},\n  ],\n};\n\n/// Descriptor for `HonorJumpType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List honorJumpTypeDescriptor = $convert.base64Decode(\n    'Cg1Ib25vckp1bXBUeXBlEhsKF0hPTk9SX0pVTVBfVFlQRV9VTktOT1dOEAASEgoOSE9OT1JfT1'\n    'BFTl9VUkwQARIVChFIT05PUl9IQUxGX1NDUkVFThACEg8KC0hPTk9SX1BPUFVQEAM=');\n\n@$core.Deprecated('Use honorTypeDescriptor instead')\nconst HonorType$json = {\n  '1': 'HonorType',\n  '2': [\n    {'1': 'HONOR_NONE', '2': 0},\n    {'1': 'PLAYLET', '2': 1},\n    {'1': 'ARGUE', '2': 2},\n    {'1': 'NOTICE', '2': 3},\n    {'1': 'GUIDANCE', '2': 4},\n    {'1': 'HONOR_BILI_RANK', '2': 5},\n    {'1': 'HONOR_WEEKLY_RANK', '2': 6},\n    {'1': 'HONOR_DAILY_RANK', '2': 7},\n    {'1': 'HONOR_CHANNEL', '2': 8},\n    {'1': 'HONOR_MUSIC', '2': 9},\n    {'1': 'HONOR_REPLY', '2': 10},\n    {'1': 'HONOR_PROFESSION', '2': 11},\n    {'1': 'HONOR_HOT_WORD', '2': 12},\n  ],\n};\n\n/// Descriptor for `HonorType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List honorTypeDescriptor = $convert.base64Decode(\n    'CglIb25vclR5cGUSDgoKSE9OT1JfTk9ORRAAEgsKB1BMQVlMRVQQARIJCgVBUkdVRRACEgoKBk'\n    '5PVElDRRADEgwKCEdVSURBTkNFEAQSEwoPSE9OT1JfQklMSV9SQU5LEAUSFQoRSE9OT1JfV0VF'\n    'S0xZX1JBTksQBhIUChBIT05PUl9EQUlMWV9SQU5LEAcSEQoNSE9OT1JfQ0hBTk5FTBAIEg8KC0'\n    'hPTk9SX01VU0lDEAkSDwoLSE9OT1JfUkVQTFkQChIUChBIT05PUl9QUk9GRVNTSU9OEAsSEgoO'\n    'SE9OT1JfSE9UX1dPUkQQDA==');\n\n@$core.Deprecated('Use jumpTypeDescriptor instead')\nconst JumpType$json = {\n  '1': 'JumpType',\n  '2': [\n    {'1': 'JUMP_TYPE_UNKNOWN', '2': 0},\n    {'1': 'OPEN_URL', '2': 1},\n    {'1': 'REFRESH', '2': 2},\n    {'1': 'HALF_SCREEN', '2': 3},\n    {'1': 'OPEN_URL_BY_OUTER_BROWSER', '2': 4},\n  ],\n};\n\n/// Descriptor for `JumpType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List jumpTypeDescriptor = $convert.base64Decode(\n    'CghKdW1wVHlwZRIVChFKVU1QX1RZUEVfVU5LTk9XThAAEgwKCE9QRU5fVVJMEAESCwoHUkVGUk'\n    'VTSBACEg8KC0hBTEZfU0NSRUVOEAMSHQoZT1BFTl9VUkxfQllfT1VURVJfQlJPV1NFUhAE');\n\n@$core.Deprecated('Use kingPositionTypeDescriptor instead')\nconst KingPositionType$json = {\n  '1': 'KingPositionType',\n  '2': [\n    {'1': 'KING_POS_UNSPECIFIED', '2': 0},\n    {'1': 'LIKE', '2': 1},\n    {'1': 'DISLIKE', '2': 2},\n    {'1': 'COIN', '2': 3},\n    {'1': 'FAV', '2': 4},\n    {'1': 'SHARE', '2': 5},\n    {'1': 'CACHE', '2': 6},\n    {'1': 'DANMAKU', '2': 7},\n  ],\n};\n\n/// Descriptor for `KingPositionType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List kingPositionTypeDescriptor = $convert.base64Decode(\n    'ChBLaW5nUG9zaXRpb25UeXBlEhgKFEtJTkdfUE9TX1VOU1BFQ0lGSUVEEAASCAoETElLRRABEg'\n    'sKB0RJU0xJS0UQAhIICgRDT0lOEAMSBwoDRkFWEAQSCQoFU0hBUkUQBRIJCgVDQUNIRRAGEgsK'\n    'B0RBTk1BS1UQBw==');\n\n@$core.Deprecated('Use moduleTypeDescriptor instead')\nconst ModuleType$json = {\n  '1': 'ModuleType',\n  '2': [\n    {'1': 'UNKNOWN', '2': 0},\n    {'1': 'OGV_INTRODUCTION', '2': 1},\n    {'1': 'OGV_TITLE', '2': 2},\n    {'1': 'UGC_HEADLINE', '2': 3},\n    {'1': 'UGC_INTRODUCTION', '2': 4},\n    {'1': 'KING_POSITION', '2': 5},\n    {'1': 'MASTER_USER_LIST', '2': 6},\n    {'1': 'STAFFS', '2': 7},\n    {'1': 'HONOR', '2': 8},\n    {'1': 'OWNER', '2': 9},\n    {'1': 'PAGE', '2': 10},\n    {'1': 'ACTIVITY_RESERVE', '2': 11},\n    {'1': 'LIVE_ORDER', '2': 12},\n    {'1': 'POSITIVE', '2': 13},\n    {'1': 'SECTION', '2': 14},\n    {'1': 'RELATE', '2': 15},\n    {'1': 'PUGV', '2': 16},\n    {'1': 'COLLECTION_CARD', '2': 17},\n    {'1': 'ACTIVITY', '2': 18},\n    {'1': 'CHARACTER', '2': 19},\n    {'1': 'FOLLOW_LAYER', '2': 20},\n    {'1': 'OGV_SEASONS', '2': 21},\n    {'1': 'UGC_SEASON', '2': 22},\n    {'1': 'OGV_LIVE_RESERVE', '2': 23},\n    {'1': 'COMBINATION_EPISODE', '2': 24},\n    {'1': 'SPONSOR', '2': 25},\n    {'1': 'ACTIVITY_ENTRANCE', '2': 26},\n    {'1': 'THEATRE_HOT_TOPIC', '2': 27},\n    {'1': 'RELATED_RECOMMEND', '2': 28},\n    {'1': 'PAY_BAR', '2': 29},\n    {'1': 'BANNER', '2': 30},\n    {'1': 'AUDIO', '2': 31},\n    {'1': 'AGG_CARD', '2': 32},\n    {'1': 'SINGLE_EP', '2': 33},\n    {'1': 'LIKE_COMMENT', '2': 34},\n    {'1': 'ATTENTION_RECOMMEND', '2': 35},\n    {'1': 'COVENANTER', '2': 36},\n    {'1': 'SPECIALTAG', '2': 37},\n    {'1': 'UPDATA', '2': 38},\n    {'1': 'PROFESSION_APPROVAL', '2': 39},\n    {'1': 'PUGV_SHOPPING_NOTICE', '2': 40},\n    {'1': 'PUGV_FAQ', '2': 41},\n    {'1': 'PUGV_SEASON_DESCRIPTION', '2': 42},\n    {'1': 'PUGV_SEASON_RECOMMEND', '2': 43},\n    {'1': 'PUGV_SEASON_PUBLISHER', '2': 44},\n    {'1': 'PUGV_SEASON_SELECTION', '2': 45},\n    {'1': 'PUGV_SEASON_PRIMARY_INFO', '2': 46},\n    {'1': 'PUGV_COOPERATION_APPLICATION', '2': 47},\n    {'1': 'UP_VIDEO_TOOL', '2': 48},\n    {'1': 'PUGV_ZONE', '2': 49},\n    {'1': 'PUGV_SERIES', '2': 50},\n    {'1': 'PUGV_PACKAGE', '2': 51},\n    {'1': 'ACTIVITY_STAR_RAIL', '2': 52},\n    {'1': 'ACTIVITY_IFRAME', '2': 53},\n    {'1': 'PLAY_LIST', '2': 54},\n    {'1': 'MERCHANDISE', '2': 55},\n    {'1': 'ACTIVITY_GUIDANCE_BAR', '2': 56},\n  ],\n};\n\n/// Descriptor for `ModuleType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List moduleTypeDescriptor = $convert.base64Decode(\n    'CgpNb2R1bGVUeXBlEgsKB1VOS05PV04QABIUChBPR1ZfSU5UUk9EVUNUSU9OEAESDQoJT0dWX1'\n    'RJVExFEAISEAoMVUdDX0hFQURMSU5FEAMSFAoQVUdDX0lOVFJPRFVDVElPThAEEhEKDUtJTkdf'\n    'UE9TSVRJT04QBRIUChBNQVNURVJfVVNFUl9MSVNUEAYSCgoGU1RBRkZTEAcSCQoFSE9OT1IQCB'\n    'IJCgVPV05FUhAJEggKBFBBR0UQChIUChBBQ1RJVklUWV9SRVNFUlZFEAsSDgoKTElWRV9PUkRF'\n    'UhAMEgwKCFBPU0lUSVZFEA0SCwoHU0VDVElPThAOEgoKBlJFTEFURRAPEggKBFBVR1YQEBITCg'\n    '9DT0xMRUNUSU9OX0NBUkQQERIMCghBQ1RJVklUWRASEg0KCUNIQVJBQ1RFUhATEhAKDEZPTExP'\n    'V19MQVlFUhAUEg8KC09HVl9TRUFTT05TEBUSDgoKVUdDX1NFQVNPThAWEhQKEE9HVl9MSVZFX1'\n    'JFU0VSVkUQFxIXChNDT01CSU5BVElPTl9FUElTT0RFEBgSCwoHU1BPTlNPUhAZEhUKEUFDVElW'\n    'SVRZX0VOVFJBTkNFEBoSFQoRVEhFQVRSRV9IT1RfVE9QSUMQGxIVChFSRUxBVEVEX1JFQ09NTU'\n    'VORBAcEgsKB1BBWV9CQVIQHRIKCgZCQU5ORVIQHhIJCgVBVURJTxAfEgwKCEFHR19DQVJEECAS'\n    'DQoJU0lOR0xFX0VQECESEAoMTElLRV9DT01NRU5UECISFwoTQVRURU5USU9OX1JFQ09NTUVORB'\n    'AjEg4KCkNPVkVOQU5URVIQJBIOCgpTUEVDSUFMVEFHECUSCgoGVVBEQVRBECYSFwoTUFJPRkVT'\n    'U0lPTl9BUFBST1ZBTBAnEhgKFFBVR1ZfU0hPUFBJTkdfTk9USUNFECgSDAoIUFVHVl9GQVEQKR'\n    'IbChdQVUdWX1NFQVNPTl9ERVNDUklQVElPThAqEhkKFVBVR1ZfU0VBU09OX1JFQ09NTUVORBAr'\n    'EhkKFVBVR1ZfU0VBU09OX1BVQkxJU0hFUhAsEhkKFVBVR1ZfU0VBU09OX1NFTEVDVElPThAtEh'\n    'wKGFBVR1ZfU0VBU09OX1BSSU1BUllfSU5GTxAuEiAKHFBVR1ZfQ09PUEVSQVRJT05fQVBQTElD'\n    'QVRJT04QLxIRCg1VUF9WSURFT19UT09MEDASDQoJUFVHVl9aT05FEDESDwoLUFVHVl9TRVJJRV'\n    'MQMhIQCgxQVUdWX1BBQ0tBR0UQMxIWChJBQ1RJVklUWV9TVEFSX1JBSUwQNBITCg9BQ1RJVklU'\n    'WV9JRlJBTUUQNRINCglQTEFZX0xJU1QQNhIPCgtNRVJDSEFORElTRRA3EhkKFUFDVElWSVRZX0'\n    'dVSURBTkNFX0JBUhA4');\n\n@$core.Deprecated('Use occupationTypeDescriptor instead')\nconst OccupationType$json = {\n  '1': 'OccupationType',\n  '2': [\n    {'1': 'STAFF', '2': 0},\n    {'1': 'CAST', '2': 1},\n    {'1': 'UNKNOWN_TYPE', '2': -1},\n  ],\n};\n\n/// Descriptor for `OccupationType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List occupationTypeDescriptor = $convert.base64Decode(\n    'Cg5PY2N1cGF0aW9uVHlwZRIJCgVTVEFGRhAAEggKBENBU1QQARIZCgxVTktOT1dOX1RZUEUQ//'\n    '//////////AQ==');\n\n@$core.Deprecated('Use pugvSeasonDescriptionTypeDescriptor instead')\nconst PugvSeasonDescriptionType$json = {\n  '1': 'PugvSeasonDescriptionType',\n  '2': [\n    {'1': 'PUGV_SEASON_DESCRIPTION_TYPE_UNSPECIFIED', '2': 0},\n    {'1': 'PUGV_SEASON_DESCRIPTION_TYPE_TEXT', '2': 1},\n    {'1': 'PUGV_SEASON_DESCRIPTION_TYPE_IMAGE', '2': 2},\n  ],\n};\n\n/// Descriptor for `PugvSeasonDescriptionType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List pugvSeasonDescriptionTypeDescriptor = $convert.base64Decode(\n    'ChlQdWd2U2Vhc29uRGVzY3JpcHRpb25UeXBlEiwKKFBVR1ZfU0VBU09OX0RFU0NSSVBUSU9OX1'\n    'RZUEVfVU5TUEVDSUZJRUQQABIlCiFQVUdWX1NFQVNPTl9ERVNDUklQVElPTl9UWVBFX1RFWFQQ'\n    'ARImCiJQVUdWX1NFQVNPTl9ERVNDUklQVElPTl9UWVBFX0lNQUdFEAI=');\n\n@$core.Deprecated('Use pugvSeasonPrimarySellPointTypeDescriptor instead')\nconst PugvSeasonPrimarySellPointType$json = {\n  '1': 'PugvSeasonPrimarySellPointType',\n  '2': [\n    {'1': 'PUGV_SEASON_PRIMARY_SELL_POINT_TYPE_UNSPECIFIED', '2': 0},\n    {'1': 'PUGV_SEASON_PRIMARY_SELL_POINT_TYPE_MANUAL', '2': 1},\n    {'1': 'PUGV_SEASON_PRIMARY_SELL_POINT_TYPE_AUTO', '2': 2},\n  ],\n};\n\n/// Descriptor for `PugvSeasonPrimarySellPointType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List pugvSeasonPrimarySellPointTypeDescriptor =\n    $convert.base64Decode(\n        'Ch5QdWd2U2Vhc29uUHJpbWFyeVNlbGxQb2ludFR5cGUSMwovUFVHVl9TRUFTT05fUFJJTUFSWV'\n        '9TRUxMX1BPSU5UX1RZUEVfVU5TUEVDSUZJRUQQABIuCipQVUdWX1NFQVNPTl9QUklNQVJZX1NF'\n        'TExfUE9JTlRfVFlQRV9NQU5VQUwQARIsCihQVUdWX1NFQVNPTl9QUklNQVJZX1NFTExfUE9JTl'\n        'RfVFlQRV9BVVRPEAI=');\n\n@$core.Deprecated('Use pugvSeasonRecommendShowStyleDescriptor instead')\nconst PugvSeasonRecommendShowStyle$json = {\n  '1': 'PugvSeasonRecommendShowStyle',\n  '2': [\n    {'1': 'PUGV_SEASON_RECOMMEND_SHOW_STYLE_UNSPECIFIED', '2': 0},\n    {'1': 'PUGV_SEASON_RECOMMEND_SHOW_STYLE_MORE', '2': 1},\n    {'1': 'PUGV_SEASON_RECOMMEND_SHOW_STYLE_FEED', '2': 2},\n  ],\n};\n\n/// Descriptor for `PugvSeasonRecommendShowStyle`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List pugvSeasonRecommendShowStyleDescriptor = $convert.base64Decode(\n    'ChxQdWd2U2Vhc29uUmVjb21tZW5kU2hvd1N0eWxlEjAKLFBVR1ZfU0VBU09OX1JFQ09NTUVORF'\n    '9TSE9XX1NUWUxFX1VOU1BFQ0lGSUVEEAASKQolUFVHVl9TRUFTT05fUkVDT01NRU5EX1NIT1df'\n    'U1RZTEVfTU9SRRABEikKJVBVR1ZfU0VBU09OX1JFQ09NTUVORF9TSE9XX1NUWUxFX0ZFRUQQAg'\n    '==');\n\n@$core.Deprecated('Use pugvSeriesItemStateDescriptor instead')\nconst PugvSeriesItemState$json = {\n  '1': 'PugvSeriesItemState',\n  '2': [\n    {'1': 'PUGV_SERIRES_ITEM_STATE_UNSPECIAL', '2': 0},\n    {'1': 'PUGV_SERIRES_ITEM_STATE_NOT_START', '2': 1},\n    {'1': 'PUGV_SERIRES_ITEM_STATE_START', '2': 2},\n    {'1': 'PUGV_SERIRES_ITEM_STATE_END', '2': 3},\n  ],\n};\n\n/// Descriptor for `PugvSeriesItemState`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List pugvSeriesItemStateDescriptor = $convert.base64Decode(\n    'ChNQdWd2U2VyaWVzSXRlbVN0YXRlEiUKIVBVR1ZfU0VSSVJFU19JVEVNX1NUQVRFX1VOU1BFQ0'\n    'lBTBAAEiUKIVBVR1ZfU0VSSVJFU19JVEVNX1NUQVRFX05PVF9TVEFSVBABEiEKHVBVR1ZfU0VS'\n    'SVJFU19JVEVNX1NUQVRFX1NUQVJUEAISHwobUFVHVl9TRVJJUkVTX0lURU1fU1RBVEVfRU5EEA'\n    'M=');\n\n@$core.Deprecated('Use pugvZoneItemTypeDescriptor instead')\nconst PugvZoneItemType$json = {\n  '1': 'PugvZoneItemType',\n  '2': [\n    {'1': 'PUGV_ZONE_ITEM_TYPE_UNSPECIFIED', '2': 0},\n    {'1': 'PUGV_ZONE_ITEM_TYPE_SEASON', '2': 1},\n    {'1': 'PUGV_ZONE_ITEM_TYPE_POSTGRADUATE', '2': 2},\n  ],\n};\n\n/// Descriptor for `PugvZoneItemType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List pugvZoneItemTypeDescriptor = $convert.base64Decode(\n    'ChBQdWd2Wm9uZUl0ZW1UeXBlEiMKH1BVR1ZfWk9ORV9JVEVNX1RZUEVfVU5TUEVDSUZJRUQQAB'\n    'IeChpQVUdWX1pPTkVfSVRFTV9UWVBFX1NFQVNPThABEiQKIFBVR1ZfWk9ORV9JVEVNX1RZUEVf'\n    'UE9TVEdSQURVQVRFEAI=');\n\n@$core.Deprecated('Use relateCardTypeDescriptor instead')\nconst RelateCardType$json = {\n  '1': 'RelateCardType',\n  '2': [\n    {'1': 'CARD_TYPE_UNKNOWN', '2': 0},\n    {'1': 'AV', '2': 1},\n    {'1': 'BANGUMI', '2': 2},\n    {'1': 'RESOURCE', '2': 3},\n    {'1': 'GAME', '2': 4},\n    {'1': 'CM', '2': 5},\n    {'1': 'LIVE', '2': 6},\n    {'1': 'AI_RECOMMEND', '2': 7},\n    {'1': 'BANGUMI_AV', '2': 8},\n    {'1': 'BANGUMI_UGC', '2': 9},\n    {'1': 'SPECIAL', '2': 10},\n    {'1': 'COURSE', '2': 11},\n    {'1': 'MINI_PROGRAM', '2': 12},\n    {'1': 'HISTORY_AV', '2': 13},\n  ],\n};\n\n/// Descriptor for `RelateCardType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List relateCardTypeDescriptor = $convert.base64Decode(\n    'Cg5SZWxhdGVDYXJkVHlwZRIVChFDQVJEX1RZUEVfVU5LTk9XThAAEgYKAkFWEAESCwoHQkFOR1'\n    'VNSRACEgwKCFJFU09VUkNFEAMSCAoER0FNRRAEEgYKAkNNEAUSCAoETElWRRAGEhAKDEFJX1JF'\n    'Q09NTUVORBAHEg4KCkJBTkdVTUlfQVYQCBIPCgtCQU5HVU1JX1VHQxAJEgsKB1NQRUNJQUwQCh'\n    'IKCgZDT1VSU0UQCxIQCgxNSU5JX1BST0dSQU0QDBIOCgpISVNUT1JZX0FWEA0=');\n\n@$core.Deprecated('Use reserveBizTypeDescriptor instead')\nconst ReserveBizType$json = {\n  '1': 'ReserveBizType',\n  '2': [\n    {'1': 'BizTypeNone', '2': 0},\n    {'1': 'BizTypeReserveActivity', '2': 1},\n    {'1': 'BizTypeFavSeason', '2': 2},\n  ],\n};\n\n/// Descriptor for `ReserveBizType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List reserveBizTypeDescriptor = $convert.base64Decode(\n    'Cg5SZXNlcnZlQml6VHlwZRIPCgtCaXpUeXBlTm9uZRAAEhoKFkJpelR5cGVSZXNlcnZlQWN0aX'\n    'ZpdHkQARIUChBCaXpUeXBlRmF2U2Vhc29uEAI=');\n\n@$core.Deprecated('Use seasonTypeDescriptor instead')\nconst SeasonType$json = {\n  '1': 'SeasonType',\n  '2': [\n    {'1': 'Unknown', '2': 0},\n    {'1': 'Base', '2': 1},\n    {'1': 'Good', '2': 2},\n  ],\n};\n\n/// Descriptor for `SeasonType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List seasonTypeDescriptor = $convert.base64Decode(\n    'CgpTZWFzb25UeXBlEgsKB1Vua25vd24QABIICgRCYXNlEAESCAoER29vZBAC');\n\n@$core.Deprecated('Use serialSeasonCoverStyleDescriptor instead')\nconst SerialSeasonCoverStyle$json = {\n  '1': 'SerialSeasonCoverStyle',\n  '2': [\n    {'1': 'TITLE', '2': 0},\n    {'1': 'PICTURE', '2': 1},\n    {'1': 'SERIAL_SEASON_COVER_STYLE_UNKNOWN', '2': -1},\n  ],\n};\n\n/// Descriptor for `SerialSeasonCoverStyle`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List serialSeasonCoverStyleDescriptor =\n    $convert.base64Decode(\n        'ChZTZXJpYWxTZWFzb25Db3ZlclN0eWxlEgkKBVRJVExFEAASCwoHUElDVFVSRRABEi4KIVNFUk'\n        'lBTF9TRUFTT05fQ09WRVJfU1RZTEVfVU5LTk9XThD///////////8B');\n\n@$core.Deprecated('Use showStyleDescriptor instead')\nconst ShowStyle$json = {\n  '1': 'ShowStyle',\n  '2': [\n    {'1': 'SHOW_STYLE_UNKNOWN', '2': 0},\n    {'1': 'ONE_ROW_ONE_COLUMN', '2': 1},\n    {'1': 'ONE_ROW_MULTI_COLUMN', '2': 2},\n    {'1': 'ONE_COLUMN_MULTI_ROW', '2': 3},\n  ],\n};\n\n/// Descriptor for `ShowStyle`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List showStyleDescriptor = $convert.base64Decode(\n    'CglTaG93U3R5bGUSFgoSU0hPV19TVFlMRV9VTktOT1dOEAASFgoST05FX1JPV19PTkVfQ09MVU'\n    '1OEAESGAoUT05FX1JPV19NVUxUSV9DT0xVTU4QAhIYChRPTkVfQ09MVU1OX01VTFRJX1JPVxAD');\n\n@$core.Deprecated('Use toolTypeDescriptor instead')\nconst ToolType$json = {\n  '1': 'ToolType',\n  '2': [\n    {'1': 'INTERACTIVE_DANMAKU', '2': 0},\n    {'1': 'INTERACTIVE_SETTINGS', '2': 1},\n    {'1': 'TAKE_OFF', '2': 2},\n    {'1': 'UNIVERSAL', '2': 3},\n  ],\n};\n\n/// Descriptor for `ToolType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List toolTypeDescriptor = $convert.base64Decode(\n    'CghUb29sVHlwZRIXChNJTlRFUkFDVElWRV9EQU5NQUtVEAASGAoUSU5URVJBQ1RJVkVfU0VUVE'\n    'lOR1MQARIMCghUQUtFX09GRhACEg0KCVVOSVZFUlNBTBAD');\n\n@$core.Deprecated('Use actBannerItemDescriptor instead')\nconst ActBannerItem$json = {\n  '1': 'ActBannerItem',\n  '2': [\n    {'1': 'url', '3': 1, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'cover', '3': 2, '4': 1, '5': 9, '10': 'cover'},\n    {\n      '1': 'jump_type',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.common.JumpType',\n      '10': 'jumpType'\n    },\n    {\n      '1': 'report',\n      '3': 4,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.ActBannerItem.ReportEntry',\n      '10': 'report'\n    },\n  ],\n  '3': [ActBannerItem_ReportEntry$json],\n};\n\n@$core.Deprecated('Use actBannerItemDescriptor instead')\nconst ActBannerItem_ReportEntry$json = {\n  '1': 'ReportEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `ActBannerItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List actBannerItemDescriptor = $convert.base64Decode(\n    'Cg1BY3RCYW5uZXJJdGVtEhAKA3VybBgBIAEoCVIDdXJsEhQKBWNvdmVyGAIgASgJUgVjb3Zlch'\n    'JECglqdW1wX3R5cGUYAyABKA4yJy5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5KdW1w'\n    'VHlwZVIIanVtcFR5cGUSUAoGcmVwb3J0GAQgAygLMjguYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS'\n    '5jb21tb24uQWN0QmFubmVySXRlbS5SZXBvcnRFbnRyeVIGcmVwb3J0GjkKC1JlcG9ydEVudHJ5'\n    'EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAE=');\n\n@$core.Deprecated('Use actPageItemsDescriptor instead')\nconst ActPageItems$json = {\n  '1': 'ActPageItems',\n  '2': [\n    {\n      '1': 'item',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.ActBannerItem',\n      '10': 'item'\n    },\n    {\n      '1': 'show_style',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.common.ShowStyle',\n      '10': 'showStyle'\n    },\n    {'1': 'title', '3': 3, '4': 1, '5': 9, '10': 'title'},\n  ],\n};\n\n/// Descriptor for `ActPageItems`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List actPageItemsDescriptor = $convert.base64Decode(\n    'CgxBY3RQYWdlSXRlbXMSQAoEaXRlbRgBIAMoCzIsLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY2'\n    '9tbW9uLkFjdEJhbm5lckl0ZW1SBGl0ZW0SRwoKc2hvd19zdHlsZRgCIAEoDjIoLmJpbGliaWxp'\n    'LmFwcC52aWV3dW5pdGUuY29tbW9uLlNob3dTdHlsZVIJc2hvd1N0eWxlEhQKBXRpdGxlGAMgAS'\n    'gJUgV0aXRsZQ==');\n\n@$core.Deprecated('Use activityDescriptor instead')\nconst Activity$json = {\n  '1': 'Activity',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 5, '10': 'id'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'link', '3': 3, '4': 1, '5': 9, '10': 'link'},\n    {'1': 'cover', '3': 4, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'type', '3': 5, '4': 1, '5': 5, '10': 'type'},\n    {'1': 'ab', '3': 6, '4': 1, '5': 9, '10': 'ab'},\n    {'1': 'show_name', '3': 7, '4': 1, '5': 9, '10': 'showName'},\n    {'1': 'picurl', '3': 8, '4': 1, '5': 9, '10': 'picurl'},\n    {'1': 'picurl_selected', '3': 9, '4': 1, '5': 9, '10': 'picurlSelected'},\n    {'1': 'h5_link', '3': 10, '4': 1, '5': 9, '10': 'h5Link'},\n    {'1': 'jump_mode', '3': 11, '4': 1, '5': 9, '10': 'jumpMode'},\n    {\n      '1': 'items',\n      '3': 12,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Item',\n      '10': 'items'\n    },\n  ],\n};\n\n/// Descriptor for `Activity`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List activityDescriptor = $convert.base64Decode(\n    'CghBY3Rpdml0eRIOCgJpZBgBIAEoBVICaWQSFAoFdGl0bGUYAiABKAlSBXRpdGxlEhIKBGxpbm'\n    'sYAyABKAlSBGxpbmsSFAoFY292ZXIYBCABKAlSBWNvdmVyEhIKBHR5cGUYBSABKAVSBHR5cGUS'\n    'DgoCYWIYBiABKAlSAmFiEhsKCXNob3dfbmFtZRgHIAEoCVIIc2hvd05hbWUSFgoGcGljdXJsGA'\n    'ggASgJUgZwaWN1cmwSJwoPcGljdXJsX3NlbGVjdGVkGAkgASgJUg5waWN1cmxTZWxlY3RlZBIX'\n    'CgdoNV9saW5rGAogASgJUgZoNUxpbmsSGwoJanVtcF9tb2RlGAsgASgJUghqdW1wTW9kZRI5Cg'\n    'VpdGVtcxgMIAMoCzIjLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLkl0ZW1SBWl0ZW1z');\n\n@$core.Deprecated('Use activityEntranceDescriptor instead')\nconst ActivityEntrance$json = {\n  '1': 'ActivityEntrance',\n  '2': [\n    {'1': 'activity_cover', '3': 1, '4': 1, '5': 9, '10': 'activityCover'},\n    {'1': 'activity_title', '3': 2, '4': 1, '5': 9, '10': 'activityTitle'},\n    {'1': 'word_tag', '3': 3, '4': 1, '5': 9, '10': 'wordTag'},\n    {\n      '1': 'activity_subtitle',\n      '3': 4,\n      '4': 1,\n      '5': 9,\n      '10': 'activitySubtitle'\n    },\n    {'1': 'activity_link', '3': 5, '4': 1, '5': 9, '10': 'activityLink'},\n    {'1': 'activity_type', '3': 6, '4': 1, '5': 5, '10': 'activityType'},\n    {'1': 'reserve_id', '3': 7, '4': 1, '5': 5, '10': 'reserveId'},\n    {'1': 'status', '3': 8, '4': 1, '5': 5, '10': 'status'},\n    {\n      '1': 'upper_list',\n      '3': 9,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.User',\n      '10': 'upperList'\n    },\n    {\n      '1': 'report',\n      '3': 10,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.ActivityEntrance.ReportEntry',\n      '10': 'report'\n    },\n    {\n      '1': 'order_report_params',\n      '3': 11,\n      '4': 3,\n      '5': 11,\n      '6':\n          '.bilibili.app.viewunite.common.ActivityEntrance.OrderReportParamsEntry',\n      '10': 'orderReportParams'\n    },\n  ],\n  '3': [\n    ActivityEntrance_ReportEntry$json,\n    ActivityEntrance_OrderReportParamsEntry$json\n  ],\n};\n\n@$core.Deprecated('Use activityEntranceDescriptor instead')\nconst ActivityEntrance_ReportEntry$json = {\n  '1': 'ReportEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n@$core.Deprecated('Use activityEntranceDescriptor instead')\nconst ActivityEntrance_OrderReportParamsEntry$json = {\n  '1': 'OrderReportParamsEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `ActivityEntrance`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List activityEntranceDescriptor = $convert.base64Decode(\n    'ChBBY3Rpdml0eUVudHJhbmNlEiUKDmFjdGl2aXR5X2NvdmVyGAEgASgJUg1hY3Rpdml0eUNvdm'\n    'VyEiUKDmFjdGl2aXR5X3RpdGxlGAIgASgJUg1hY3Rpdml0eVRpdGxlEhkKCHdvcmRfdGFnGAMg'\n    'ASgJUgd3b3JkVGFnEisKEWFjdGl2aXR5X3N1YnRpdGxlGAQgASgJUhBhY3Rpdml0eVN1YnRpdG'\n    'xlEiMKDWFjdGl2aXR5X2xpbmsYBSABKAlSDGFjdGl2aXR5TGluaxIjCg1hY3Rpdml0eV90eXBl'\n    'GAYgASgFUgxhY3Rpdml0eVR5cGUSHQoKcmVzZXJ2ZV9pZBgHIAEoBVIJcmVzZXJ2ZUlkEhYKBn'\n    'N0YXR1cxgIIAEoBVIGc3RhdHVzEkIKCnVwcGVyX2xpc3QYCSADKAsyIy5iaWxpYmlsaS5hcHAu'\n    'dmlld3VuaXRlLmNvbW1vbi5Vc2VyUgl1cHBlckxpc3QSUwoGcmVwb3J0GAogAygLMjsuYmlsaW'\n    'JpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uQWN0aXZpdHlFbnRyYW5jZS5SZXBvcnRFbnRyeVIG'\n    'cmVwb3J0EnYKE29yZGVyX3JlcG9ydF9wYXJhbXMYCyADKAsyRi5iaWxpYmlsaS5hcHAudmlld3'\n    'VuaXRlLmNvbW1vbi5BY3Rpdml0eUVudHJhbmNlLk9yZGVyUmVwb3J0UGFyYW1zRW50cnlSEW9y'\n    'ZGVyUmVwb3J0UGFyYW1zGjkKC1JlcG9ydEVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbH'\n    'VlGAIgASgJUgV2YWx1ZToCOAEaRAoWT3JkZXJSZXBvcnRQYXJhbXNFbnRyeRIQCgNrZXkYASAB'\n    'KAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgB');\n\n@$core.Deprecated('Use activityEntranceModuleDescriptor instead')\nconst ActivityEntranceModule$json = {\n  '1': 'ActivityEntranceModule',\n  '2': [\n    {\n      '1': 'activity_entrance',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.ActivityEntrance',\n      '10': 'activityEntrance'\n    },\n  ],\n};\n\n/// Descriptor for `ActivityEntranceModule`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List activityEntranceModuleDescriptor = $convert.base64Decode(\n    'ChZBY3Rpdml0eUVudHJhbmNlTW9kdWxlElwKEWFjdGl2aXR5X2VudHJhbmNlGAEgAygLMi8uYm'\n    'lsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uQWN0aXZpdHlFbnRyYW5jZVIQYWN0aXZpdHlF'\n    'bnRyYW5jZQ==');\n\n@$core.Deprecated('Use activityGuidanceBarDescriptor instead')\nconst ActivityGuidanceBar$json = {\n  '1': 'ActivityGuidanceBar',\n  '2': [\n    {'1': 'win_id', '3': 1, '4': 1, '5': 9, '10': 'winId'},\n    {'1': 'login', '3': 2, '4': 1, '5': 8, '10': 'login'},\n    {'1': 'show_time', '3': 3, '4': 1, '5': 9, '10': 'showTime'},\n    {'1': 'action', '3': 4, '4': 1, '5': 9, '10': 'action'},\n    {'1': 'url', '3': 5, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'close_type', '3': 6, '4': 1, '5': 9, '10': 'closeType'},\n    {\n      '1': 'images',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.ImagesWidget',\n      '10': 'images'\n    },\n    {\n      '1': 'title',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.TextWidget',\n      '10': 'title'\n    },\n    {\n      '1': 'sub_title',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.TextWidget',\n      '10': 'subTitle'\n    },\n    {\n      '1': 'button',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.ButtonWidget',\n      '10': 'button'\n    },\n    {\n      '1': 'report',\n      '3': 11,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.ActivityGuidanceBar.ReportEntry',\n      '10': 'report'\n    },\n  ],\n  '3': [ActivityGuidanceBar_ReportEntry$json],\n};\n\n@$core.Deprecated('Use activityGuidanceBarDescriptor instead')\nconst ActivityGuidanceBar_ReportEntry$json = {\n  '1': 'ReportEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `ActivityGuidanceBar`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List activityGuidanceBarDescriptor = $convert.base64Decode(\n    'ChNBY3Rpdml0eUd1aWRhbmNlQmFyEhUKBndpbl9pZBgBIAEoCVIFd2luSWQSFAoFbG9naW4YAi'\n    'ABKAhSBWxvZ2luEhsKCXNob3dfdGltZRgDIAEoCVIIc2hvd1RpbWUSFgoGYWN0aW9uGAQgASgJ'\n    'UgZhY3Rpb24SEAoDdXJsGAUgASgJUgN1cmwSHQoKY2xvc2VfdHlwZRgGIAEoCVIJY2xvc2VUeX'\n    'BlEkMKBmltYWdlcxgHIAEoCzIrLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLkltYWdl'\n    'c1dpZGdldFIGaW1hZ2VzEj8KBXRpdGxlGAggASgLMikuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS'\n    '5jb21tb24uVGV4dFdpZGdldFIFdGl0bGUSRgoJc3ViX3RpdGxlGAkgASgLMikuYmlsaWJpbGku'\n    'YXBwLnZpZXd1bml0ZS5jb21tb24uVGV4dFdpZGdldFIIc3ViVGl0bGUSQwoGYnV0dG9uGAogAS'\n    'gLMisuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uQnV0dG9uV2lkZ2V0UgZidXR0b24S'\n    'VgoGcmVwb3J0GAsgAygLMj4uYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uQWN0aXZpdH'\n    'lHdWlkYW5jZUJhci5SZXBvcnRFbnRyeVIGcmVwb3J0GjkKC1JlcG9ydEVudHJ5EhAKA2tleRgB'\n    'IAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAE=');\n\n@$core.Deprecated('Use activityIFrameDescriptor instead')\nconst ActivityIFrame$json = {\n  '1': 'ActivityIFrame',\n  '2': [\n    {'1': 'url', '3': 1, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'aspect_ratio', '3': 2, '4': 1, '5': 1, '10': 'aspectRatio'},\n  ],\n};\n\n/// Descriptor for `ActivityIFrame`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List activityIFrameDescriptor = $convert.base64Decode(\n    'Cg5BY3Rpdml0eUlGcmFtZRIQCgN1cmwYASABKAlSA3VybBIhCgxhc3BlY3RfcmF0aW8YAiABKA'\n    'FSC2FzcGVjdFJhdGlv');\n\n@$core.Deprecated('Use activityReserveDescriptor instead')\nconst ActivityReserve$json = {\n  '1': 'ActivityReserve',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'vt',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.StatInfo',\n      '10': 'vt'\n    },\n    {\n      '1': 'danmaku',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.StatInfo',\n      '10': 'danmaku'\n    },\n    {\n      '1': 'button',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.ReserveButton',\n      '10': 'button'\n    },\n  ],\n};\n\n/// Descriptor for `ActivityReserve`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List activityReserveDescriptor = $convert.base64Decode(\n    'Cg9BY3Rpdml0eVJlc2VydmUSFAoFdGl0bGUYASABKAlSBXRpdGxlEjcKAnZ0GAIgASgLMicuYm'\n    'lsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uU3RhdEluZm9SAnZ0EkEKB2Rhbm1ha3UYAyAB'\n    'KAsyJy5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5TdGF0SW5mb1IHZGFubWFrdRJECg'\n    'ZidXR0b24YBCABKAsyLC5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5SZXNlcnZlQnV0'\n    'dG9uUgZidXR0b24=');\n\n@$core.Deprecated('Use activityResourceDescriptor instead')\nconst ActivityResource$json = {\n  '1': 'ActivityResource',\n  '2': [\n    {'1': 'mod_pool_name', '3': 1, '4': 1, '5': 9, '10': 'modPoolName'},\n    {'1': 'mod_resource_name', '3': 2, '4': 1, '5': 9, '10': 'modResourceName'},\n  ],\n};\n\n/// Descriptor for `ActivityResource`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List activityResourceDescriptor = $convert.base64Decode(\n    'ChBBY3Rpdml0eVJlc291cmNlEiIKDW1vZF9wb29sX25hbWUYASABKAlSC21vZFBvb2xOYW1lEi'\n    'oKEW1vZF9yZXNvdXJjZV9uYW1lGAIgASgJUg9tb2RSZXNvdXJjZU5hbWU=');\n\n@$core.Deprecated('Use activityStarRailDescriptor instead')\nconst ActivityStarRail$json = {\n  '1': 'ActivityStarRail',\n  '2': [\n    {'1': 'pic', '3': 1, '4': 1, '5': 9, '10': 'pic'},\n    {\n      '1': 'pic_gallery',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.StarRail',\n      '10': 'picGallery'\n    },\n  ],\n};\n\n/// Descriptor for `ActivityStarRail`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List activityStarRailDescriptor = $convert.base64Decode(\n    'ChBBY3Rpdml0eVN0YXJSYWlsEhAKA3BpYxgBIAEoCVIDcGljEkgKC3BpY19nYWxsZXJ5GAIgAy'\n    'gLMicuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uU3RhclJhaWxSCnBpY0dhbGxlcnk=');\n\n@$core.Deprecated('Use activityTabDescriptor instead')\nconst ActivityTab$json = {\n  '1': 'ActivityTab',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 5, '10': 'id'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'type', '3': 3, '4': 1, '5': 5, '10': 'type'},\n    {'1': 'show_name', '3': 4, '4': 1, '5': 9, '10': 'showName'},\n    {'1': 'picurl', '3': 5, '4': 1, '5': 9, '10': 'picurl'},\n    {'1': 'picurl_selected', '3': 6, '4': 1, '5': 9, '10': 'picurlSelected'},\n    {'1': 'h5_link', '3': 7, '4': 1, '5': 9, '10': 'h5Link'},\n    {'1': 'link', '3': 8, '4': 1, '5': 9, '10': 'link'},\n    {'1': 'link_type', '3': 9, '4': 1, '5': 5, '10': 'linkType'},\n    {'1': 'biz_key', '3': 10, '4': 1, '5': 3, '10': 'bizKey'},\n    {'1': 'desc', '3': 11, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'act_ext', '3': 12, '4': 1, '5': 9, '10': 'actExt'},\n    {\n      '1': 'report',\n      '3': 13,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.ActivityTab.ReportEntry',\n      '10': 'report'\n    },\n  ],\n  '3': [ActivityTab_ReportEntry$json],\n};\n\n@$core.Deprecated('Use activityTabDescriptor instead')\nconst ActivityTab_ReportEntry$json = {\n  '1': 'ReportEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `ActivityTab`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List activityTabDescriptor = $convert.base64Decode(\n    'CgtBY3Rpdml0eVRhYhIOCgJpZBgBIAEoBVICaWQSFAoFdGl0bGUYAiABKAlSBXRpdGxlEhIKBH'\n    'R5cGUYAyABKAVSBHR5cGUSGwoJc2hvd19uYW1lGAQgASgJUghzaG93TmFtZRIWCgZwaWN1cmwY'\n    'BSABKAlSBnBpY3VybBInCg9waWN1cmxfc2VsZWN0ZWQYBiABKAlSDnBpY3VybFNlbGVjdGVkEh'\n    'cKB2g1X2xpbmsYByABKAlSBmg1TGluaxISCgRsaW5rGAggASgJUgRsaW5rEhsKCWxpbmtfdHlw'\n    'ZRgJIAEoBVIIbGlua1R5cGUSFwoHYml6X2tleRgKIAEoA1IGYml6S2V5EhIKBGRlc2MYCyABKA'\n    'lSBGRlc2MSFwoHYWN0X2V4dBgMIAEoCVIGYWN0RXh0Ek4KBnJlcG9ydBgNIAMoCzI2LmJpbGli'\n    'aWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLkFjdGl2aXR5VGFiLlJlcG9ydEVudHJ5UgZyZXBvcn'\n    'QaOQoLUmVwb3J0RW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVl'\n    'OgI4AQ==');\n\n@$core.Deprecated('Use aggEpCardDescriptor instead')\nconst AggEpCard$json = {\n  '1': 'AggEpCard',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 2, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'icon', '3': 3, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'num', '3': 4, '4': 1, '5': 5, '10': 'num'},\n    {'1': 'jump_url', '3': 5, '4': 1, '5': 9, '10': 'jumpUrl'},\n  ],\n};\n\n/// Descriptor for `AggEpCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List aggEpCardDescriptor = $convert.base64Decode(\n    'CglBZ2dFcENhcmQSFAoFdGl0bGUYASABKAlSBXRpdGxlEhQKBWNvdmVyGAIgASgJUgVjb3Zlch'\n    'ISCgRpY29uGAMgASgJUgRpY29uEhAKA251bRgEIAEoBVIDbnVtEhkKCGp1bXBfdXJsGAUgASgJ'\n    'UgdqdW1wVXJs');\n\n@$core.Deprecated('Use aggEpsDescriptor instead')\nconst AggEps$json = {\n  '1': 'AggEps',\n  '2': [\n    {\n      '1': 'agg_ep_cards',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.AggEpCard',\n      '10': 'aggEpCards'\n    },\n    {'1': 'place_index', '3': 2, '4': 1, '5': 5, '10': 'placeIndex'},\n  ],\n};\n\n/// Descriptor for `AggEps`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List aggEpsDescriptor = $convert.base64Decode(\n    'CgZBZ2dFcHMSSgoMYWdnX2VwX2NhcmRzGAEgAygLMiguYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS'\n    '5jb21tb24uQWdnRXBDYXJkUgphZ2dFcENhcmRzEh8KC3BsYWNlX2luZGV4GAIgASgFUgpwbGFj'\n    'ZUluZGV4');\n\n@$core.Deprecated('Use arcRightsDescriptor instead')\nconst ArcRights$json = {\n  '1': 'ArcRights',\n  '2': [\n    {'1': 'is_charging_pay', '3': 1, '4': 1, '5': 8, '10': 'isChargingPay'},\n  ],\n};\n\n/// Descriptor for `ArcRights`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List arcRightsDescriptor = $convert.base64Decode(\n    'CglBcmNSaWdodHMSJgoPaXNfY2hhcmdpbmdfcGF5GAEgASgIUg1pc0NoYXJnaW5nUGF5');\n\n@$core.Deprecated('Use attentionRecommendDescriptor instead')\nconst AttentionRecommend$json = {\n  '1': 'AttentionRecommend',\n};\n\n/// Descriptor for `AttentionRecommend`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List attentionRecommendDescriptor =\n    $convert.base64Decode('ChJBdHRlbnRpb25SZWNvbW1lbmQ=');\n\n@$core.Deprecated('Use audioDescriptor instead')\nconst Audio$json = {\n  '1': 'Audio',\n  '2': [\n    {\n      '1': 'audio_info',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Audio.AudioInfoEntry',\n      '10': 'audioInfo'\n    },\n  ],\n  '3': [Audio_AudioInfoEntry$json],\n};\n\n@$core.Deprecated('Use audioDescriptor instead')\nconst Audio_AudioInfoEntry$json = {\n  '1': 'AudioInfoEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 3, '10': 'key'},\n    {\n      '1': 'value',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.AudioInfo',\n      '10': 'value'\n    },\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `Audio`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List audioDescriptor = $convert.base64Decode(\n    'CgVBdWRpbxJSCgphdWRpb19pbmZvGAEgAygLMjMuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb2'\n    '1tb24uQXVkaW8uQXVkaW9JbmZvRW50cnlSCWF1ZGlvSW5mbxpmCg5BdWRpb0luZm9FbnRyeRIQ'\n    'CgNrZXkYASABKANSA2tleRI+CgV2YWx1ZRgCIAEoCzIoLmJpbGliaWxpLmFwcC52aWV3dW5pdG'\n    'UuY29tbW9uLkF1ZGlvSW5mb1IFdmFsdWU6AjgB');\n\n@$core.Deprecated('Use audioInfoDescriptor instead')\nconst AudioInfo$json = {\n  '1': 'AudioInfo',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover_url', '3': 2, '4': 1, '5': 9, '10': 'coverUrl'},\n    {'1': 'song_id', '3': 3, '4': 1, '5': 3, '10': 'songId'},\n    {'1': 'play_count', '3': 4, '4': 1, '5': 3, '10': 'playCount'},\n    {'1': 'reply_count', '3': 5, '4': 1, '5': 3, '10': 'replyCount'},\n    {'1': 'upper_id', '3': 6, '4': 1, '5': 3, '10': 'upperId'},\n    {'1': 'entrance', '3': 7, '4': 1, '5': 9, '10': 'entrance'},\n    {'1': 'song_attr', '3': 8, '4': 1, '5': 3, '10': 'songAttr'},\n  ],\n};\n\n/// Descriptor for `AudioInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List audioInfoDescriptor = $convert.base64Decode(\n    'CglBdWRpb0luZm8SFAoFdGl0bGUYASABKAlSBXRpdGxlEhsKCWNvdmVyX3VybBgCIAEoCVIIY2'\n    '92ZXJVcmwSFwoHc29uZ19pZBgDIAEoA1IGc29uZ0lkEh0KCnBsYXlfY291bnQYBCABKANSCXBs'\n    'YXlDb3VudBIfCgtyZXBseV9jb3VudBgFIAEoA1IKcmVwbHlDb3VudBIZCgh1cHBlcl9pZBgGIA'\n    'EoA1IHdXBwZXJJZBIaCghlbnRyYW5jZRgHIAEoCVIIZW50cmFuY2USGwoJc29uZ19hdHRyGAgg'\n    'ASgDUghzb25nQXR0cg==');\n\n@$core.Deprecated('Use authorDescriptor instead')\nconst Author$json = {\n  '1': 'Author',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n  ],\n};\n\n/// Descriptor for `Author`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List authorDescriptor = $convert.base64Decode(\n    'CgZBdXRob3ISEAoDbWlkGAEgASgDUgNtaWQSEgoEbmFtZRgCIAEoCVIEbmFtZQ==');\n\n@$core.Deprecated('Use badgeInfoDescriptor instead')\nconst BadgeInfo$json = {\n  '1': 'BadgeInfo',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'text_color', '3': 2, '4': 1, '5': 9, '10': 'textColor'},\n    {'1': 'text_color_night', '3': 3, '4': 1, '5': 9, '10': 'textColorNight'},\n    {'1': 'bg_color', '3': 4, '4': 1, '5': 9, '10': 'bgColor'},\n    {'1': 'bg_color_night', '3': 5, '4': 1, '5': 9, '10': 'bgColorNight'},\n    {'1': 'border_color', '3': 6, '4': 1, '5': 9, '10': 'borderColor'},\n    {\n      '1': 'border_color_night',\n      '3': 7,\n      '4': 1,\n      '5': 9,\n      '10': 'borderColorNight'\n    },\n    {'1': 'bg_style', '3': 8, '4': 1, '5': 5, '10': 'bgStyle'},\n    {'1': 'img', '3': 9, '4': 1, '5': 9, '10': 'img'},\n    {'1': 'type', '3': 10, '4': 1, '5': 5, '10': 'type'},\n  ],\n};\n\n/// Descriptor for `BadgeInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List badgeInfoDescriptor = $convert.base64Decode(\n    'CglCYWRnZUluZm8SEgoEdGV4dBgBIAEoCVIEdGV4dBIdCgp0ZXh0X2NvbG9yGAIgASgJUgl0ZX'\n    'h0Q29sb3ISKAoQdGV4dF9jb2xvcl9uaWdodBgDIAEoCVIOdGV4dENvbG9yTmlnaHQSGQoIYmdf'\n    'Y29sb3IYBCABKAlSB2JnQ29sb3ISJAoOYmdfY29sb3JfbmlnaHQYBSABKAlSDGJnQ29sb3JOaW'\n    'dodBIhCgxib3JkZXJfY29sb3IYBiABKAlSC2JvcmRlckNvbG9yEiwKEmJvcmRlcl9jb2xvcl9u'\n    'aWdodBgHIAEoCVIQYm9yZGVyQ29sb3JOaWdodBIZCghiZ19zdHlsZRgIIAEoBVIHYmdTdHlsZR'\n    'IQCgNpbWcYCSABKAlSA2ltZxISCgR0eXBlGAogASgFUgR0eXBl');\n\n@$core.Deprecated('Use bannerDescriptor instead')\nconst Banner$json = {\n  '1': 'Banner',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'relate_item',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.RelateItem',\n      '10': 'relateItem'\n    },\n  ],\n};\n\n/// Descriptor for `Banner`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bannerDescriptor = $convert.base64Decode(\n    'CgZCYW5uZXISFAoFdGl0bGUYASABKAlSBXRpdGxlEkoKC3JlbGF0ZV9pdGVtGAIgAygLMikuYm'\n    'lsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uUmVsYXRlSXRlbVIKcmVsYXRlSXRlbQ==');\n\n@$core.Deprecated('Use bgInfoDescriptor instead')\nconst BgInfo$json = {\n  '1': 'BgInfo',\n  '2': [\n    {'1': 'light_short_bg', '3': 1, '4': 1, '5': 9, '10': 'lightShortBg'},\n    {'1': 'dark_short_bg', '3': 2, '4': 1, '5': 9, '10': 'darkShortBg'},\n    {'1': 'light_long_bg', '3': 3, '4': 1, '5': 9, '10': 'lightLongBg'},\n    {'1': 'dark_long_bg', '3': 4, '4': 1, '5': 9, '10': 'darkLongBg'},\n  ],\n};\n\n/// Descriptor for `BgInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bgInfoDescriptor = $convert.base64Decode(\n    'CgZCZ0luZm8SJAoObGlnaHRfc2hvcnRfYmcYASABKAlSDGxpZ2h0U2hvcnRCZxIiCg1kYXJrX3'\n    'Nob3J0X2JnGAIgASgJUgtkYXJrU2hvcnRCZxIiCg1saWdodF9sb25nX2JnGAMgASgJUgtsaWdo'\n    'dExvbmdCZxIgCgxkYXJrX2xvbmdfYmcYBCABKAlSCmRhcmtMb25nQmc=');\n\n@$core.Deprecated('Use bizFavParamDescriptor instead')\nconst BizFavParam$json = {\n  '1': 'BizFavParam',\n  '2': [\n    {'1': 'season_id', '3': 1, '4': 1, '5': 3, '10': 'seasonId'},\n  ],\n};\n\n/// Descriptor for `BizFavParam`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bizFavParamDescriptor = $convert\n    .base64Decode('CgtCaXpGYXZQYXJhbRIbCglzZWFzb25faWQYASABKANSCHNlYXNvbklk');\n\n@$core.Deprecated('Use bizReserveActivityParamDescriptor instead')\nconst BizReserveActivityParam$json = {\n  '1': 'BizReserveActivityParam',\n  '2': [\n    {'1': 'activity_id', '3': 1, '4': 1, '5': 3, '10': 'activityId'},\n    {'1': 'from', '3': 2, '4': 1, '5': 9, '10': 'from'},\n    {'1': 'type', '3': 3, '4': 1, '5': 9, '10': 'type'},\n    {'1': 'oid', '3': 4, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'reserve_id', '3': 5, '4': 1, '5': 3, '10': 'reserveId'},\n  ],\n};\n\n/// Descriptor for `BizReserveActivityParam`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bizReserveActivityParamDescriptor = $convert.base64Decode(\n    'ChdCaXpSZXNlcnZlQWN0aXZpdHlQYXJhbRIfCgthY3Rpdml0eV9pZBgBIAEoA1IKYWN0aXZpdH'\n    'lJZBISCgRmcm9tGAIgASgJUgRmcm9tEhIKBHR5cGUYAyABKAlSBHR5cGUSEAoDb2lkGAQgASgD'\n    'UgNvaWQSHQoKcmVzZXJ2ZV9pZBgFIAEoA1IJcmVzZXJ2ZUlk');\n\n@$core.Deprecated('Use buttonDescriptor instead')\nconst Button$json = {\n  '1': 'Button',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'left_strikethrough_text',\n      '3': 2,\n      '4': 1,\n      '5': 9,\n      '10': 'leftStrikethroughText'\n    },\n    {'1': 'type', '3': 3, '4': 1, '5': 9, '10': 'type'},\n    {'1': 'link', '3': 4, '4': 1, '5': 9, '10': 'link'},\n    {\n      '1': 'badge_info',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.BadgeInfo',\n      '10': 'badgeInfo'\n    },\n    {'1': 'sub_title', '3': 6, '4': 1, '5': 9, '10': 'subTitle'},\n  ],\n};\n\n/// Descriptor for `Button`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List buttonDescriptor = $convert.base64Decode(\n    'CgZCdXR0b24SFAoFdGl0bGUYASABKAlSBXRpdGxlEjYKF2xlZnRfc3RyaWtldGhyb3VnaF90ZX'\n    'h0GAIgASgJUhVsZWZ0U3RyaWtldGhyb3VnaFRleHQSEgoEdHlwZRgDIAEoCVIEdHlwZRISCgRs'\n    'aW5rGAQgASgJUgRsaW5rEkcKCmJhZGdlX2luZm8YBSABKAsyKC5iaWxpYmlsaS5hcHAudmlld3'\n    'VuaXRlLmNvbW1vbi5CYWRnZUluZm9SCWJhZGdlSW5mbxIbCglzdWJfdGl0bGUYBiABKAlSCHN1'\n    'YlRpdGxl');\n\n@$core.Deprecated('Use buttonWidgetDescriptor instead')\nconst ButtonWidget$json = {\n  '1': 'ButtonWidget',\n  '2': [\n    {'1': 'code', '3': 1, '4': 1, '5': 9, '10': 'code'},\n    {\n      '1': 'text',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.TextWidget',\n      '10': 'text'\n    },\n    {'1': 'bg_color', '3': 3, '4': 1, '5': 9, '10': 'bgColor'},\n    {'1': 'action', '3': 4, '4': 1, '5': 9, '10': 'action'},\n    {'1': 'link', '3': 5, '4': 1, '5': 9, '10': 'link'},\n  ],\n};\n\n/// Descriptor for `ButtonWidget`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List buttonWidgetDescriptor = $convert.base64Decode(\n    'CgxCdXR0b25XaWRnZXQSEgoEY29kZRgBIAEoCVIEY29kZRI9CgR0ZXh0GAIgASgLMikuYmlsaW'\n    'JpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uVGV4dFdpZGdldFIEdGV4dBIZCghiZ19jb2xvchgD'\n    'IAEoCVIHYmdDb2xvchIWCgZhY3Rpb24YBCABKAlSBmFjdGlvbhISCgRsaW5rGAUgASgJUgRsaW'\n    '5r');\n\n@$core.Deprecated('Use cardBasicInfoDescriptor instead')\nconst CardBasicInfo$json = {\n  '1': 'CardBasicInfo',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'desc', '3': 2, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'cover', '3': 3, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'uri', '3': 4, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'track_id', '3': 5, '4': 1, '5': 9, '10': 'trackId'},\n    {'1': 'unique_id', '3': 6, '4': 1, '5': 9, '10': 'uniqueId'},\n    {'1': 'from_source_type', '3': 7, '4': 1, '5': 3, '10': 'fromSourceType'},\n    {'1': 'from_source_id', '3': 8, '4': 1, '5': 9, '10': 'fromSourceId'},\n    {'1': 'material_id', '3': 9, '4': 1, '5': 3, '10': 'materialId'},\n    {'1': 'cover_gif', '3': 10, '4': 1, '5': 9, '10': 'coverGif'},\n    {\n      '1': 'author',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Owner',\n      '10': 'author'\n    },\n    {'1': 'id', '3': 12, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'from', '3': 13, '4': 1, '5': 9, '10': 'from'},\n    {\n      '1': 'from_spmid_suffix',\n      '3': 14,\n      '4': 1,\n      '5': 9,\n      '10': 'fromSpmidSuffix'\n    },\n    {'1': 'report_flow_data', '3': 15, '4': 1, '5': 9, '10': 'reportFlowData'},\n    {'1': 'cover_right_text', '3': 16, '4': 1, '5': 9, '10': 'coverRightText'},\n    {\n      '1': 'dimension',\n      '3': 17,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.CoverDimension',\n      '10': 'dimension'\n    },\n  ],\n};\n\n/// Descriptor for `CardBasicInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cardBasicInfoDescriptor = $convert.base64Decode(\n    'Cg1DYXJkQmFzaWNJbmZvEhQKBXRpdGxlGAEgASgJUgV0aXRsZRISCgRkZXNjGAIgASgJUgRkZX'\n    'NjEhQKBWNvdmVyGAMgASgJUgVjb3ZlchIQCgN1cmkYBCABKAlSA3VyaRIZCgh0cmFja19pZBgF'\n    'IAEoCVIHdHJhY2tJZBIbCgl1bmlxdWVfaWQYBiABKAlSCHVuaXF1ZUlkEigKEGZyb21fc291cm'\n    'NlX3R5cGUYByABKANSDmZyb21Tb3VyY2VUeXBlEiQKDmZyb21fc291cmNlX2lkGAggASgJUgxm'\n    'cm9tU291cmNlSWQSHwoLbWF0ZXJpYWxfaWQYCSABKANSCm1hdGVyaWFsSWQSGwoJY292ZXJfZ2'\n    'lmGAogASgJUghjb3ZlckdpZhI8CgZhdXRob3IYCyABKAsyJC5iaWxpYmlsaS5hcHAudmlld3Vu'\n    'aXRlLmNvbW1vbi5Pd25lclIGYXV0aG9yEg4KAmlkGAwgASgDUgJpZBISCgRmcm9tGA0gASgJUg'\n    'Rmcm9tEioKEWZyb21fc3BtaWRfc3VmZml4GA4gASgJUg9mcm9tU3BtaWRTdWZmaXgSKAoQcmVw'\n    'b3J0X2Zsb3dfZGF0YRgPIAEoCVIOcmVwb3J0Rmxvd0RhdGESKAoQY292ZXJfcmlnaHRfdGV4dB'\n    'gQIAEoCVIOY292ZXJSaWdodFRleHQSSwoJZGltZW5zaW9uGBEgASgLMi0uYmlsaWJpbGkuYXBw'\n    'LnZpZXd1bml0ZS5jb21tb24uQ292ZXJEaW1lbnNpb25SCWRpbWVuc2lvbg==');\n\n@$core.Deprecated('Use cardStyleDescriptor instead')\nconst CardStyle$json = {\n  '1': 'CardStyle',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 5, '10': 'id'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n  ],\n};\n\n/// Descriptor for `CardStyle`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cardStyleDescriptor = $convert.base64Decode(\n    'CglDYXJkU3R5bGUSDgoCaWQYASABKAVSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWU=');\n\n@$core.Deprecated('Use catalogTabDescriptor instead')\nconst CatalogTab$json = {\n  '1': 'CatalogTab',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n  ],\n};\n\n/// Descriptor for `CatalogTab`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List catalogTabDescriptor =\n    $convert.base64Decode('CgpDYXRhbG9nVGFiEhQKBXRpdGxlGAEgASgJUgV0aXRsZQ==');\n\n@$core.Deprecated('Use celebrityDescriptor instead')\nconst Celebrity$json = {\n  '1': 'Celebrity',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 5, '10': 'id'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'role', '3': 3, '4': 1, '5': 9, '10': 'role'},\n    {'1': 'avatar', '3': 4, '4': 1, '5': 9, '10': 'avatar'},\n    {'1': 'short_desc', '3': 5, '4': 1, '5': 9, '10': 'shortDesc'},\n    {'1': 'desc', '3': 6, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'character_avatar', '3': 7, '4': 1, '5': 9, '10': 'characterAvatar'},\n    {'1': 'link', '3': 8, '4': 1, '5': 9, '10': 'link'},\n    {'1': 'mid', '3': 9, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'is_follow', '3': 10, '4': 1, '5': 5, '10': 'isFollow'},\n    {'1': 'occupation_name', '3': 11, '4': 1, '5': 9, '10': 'occupationName'},\n    {\n      '1': 'occupation_type',\n      '3': 12,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.common.OccupationType',\n      '10': 'occupationType'\n    },\n    {'1': 'relate_attr', '3': 13, '4': 1, '5': 5, '10': 'relateAttr'},\n    {'1': 'small_avatar', '3': 14, '4': 1, '5': 9, '10': 'smallAvatar'},\n    {\n      '1': 'report',\n      '3': 15,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Celebrity.ReportEntry',\n      '10': 'report'\n    },\n    {\n      '1': 'official',\n      '3': 16,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.OfficialVerify',\n      '10': 'official'\n    },\n  ],\n  '3': [Celebrity_ReportEntry$json],\n};\n\n@$core.Deprecated('Use celebrityDescriptor instead')\nconst Celebrity_ReportEntry$json = {\n  '1': 'ReportEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `Celebrity`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List celebrityDescriptor = $convert.base64Decode(\n    'CglDZWxlYnJpdHkSDgoCaWQYASABKAVSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSEgoEcm9sZR'\n    'gDIAEoCVIEcm9sZRIWCgZhdmF0YXIYBCABKAlSBmF2YXRhchIdCgpzaG9ydF9kZXNjGAUgASgJ'\n    'UglzaG9ydERlc2MSEgoEZGVzYxgGIAEoCVIEZGVzYxIpChBjaGFyYWN0ZXJfYXZhdGFyGAcgAS'\n    'gJUg9jaGFyYWN0ZXJBdmF0YXISEgoEbGluaxgIIAEoCVIEbGluaxIQCgNtaWQYCSABKANSA21p'\n    'ZBIbCglpc19mb2xsb3cYCiABKAVSCGlzRm9sbG93EicKD29jY3VwYXRpb25fbmFtZRgLIAEoCV'\n    'IOb2NjdXBhdGlvbk5hbWUSVgoPb2NjdXBhdGlvbl90eXBlGAwgASgOMi0uYmlsaWJpbGkuYXBw'\n    'LnZpZXd1bml0ZS5jb21tb24uT2NjdXBhdGlvblR5cGVSDm9jY3VwYXRpb25UeXBlEh8KC3JlbG'\n    'F0ZV9hdHRyGA0gASgFUgpyZWxhdGVBdHRyEiEKDHNtYWxsX2F2YXRhchgOIAEoCVILc21hbGxB'\n    'dmF0YXISTAoGcmVwb3J0GA8gAygLMjQuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uQ2'\n    'VsZWJyaXR5LlJlcG9ydEVudHJ5UgZyZXBvcnQSSQoIb2ZmaWNpYWwYECABKAsyLS5iaWxpYmls'\n    'aS5hcHAudmlld3VuaXRlLmNvbW1vbi5PZmZpY2lhbFZlcmlmeVIIb2ZmaWNpYWwaOQoLUmVwb3'\n    'J0RW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4AQ==');\n\n@$core.Deprecated('Use cellFluidDescriptor instead')\nconst CellFluid$json = {\n  '1': 'CellFluid',\n  '2': [\n    {'1': 'top_base_color', '3': 1, '4': 1, '5': 9, '10': 'topBaseColor'},\n    {'1': 'top_split_color', '3': 2, '4': 1, '5': 9, '10': 'topSplitColor'},\n    {'1': 'top_text_color', '3': 3, '4': 1, '5': 9, '10': 'topTextColor'},\n  ],\n};\n\n/// Descriptor for `CellFluid`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cellFluidDescriptor = $convert.base64Decode(\n    'CglDZWxsRmx1aWQSJAoOdG9wX2Jhc2VfY29sb3IYASABKAlSDHRvcEJhc2VDb2xvchImCg90b3'\n    'Bfc3BsaXRfY29sb3IYAiABKAlSDXRvcFNwbGl0Q29sb3ISJAoOdG9wX3RleHRfY29sb3IYAyAB'\n    'KAlSDHRvcFRleHRDb2xvcg==');\n\n@$core.Deprecated('Use characterGroupDescriptor instead')\nconst CharacterGroup$json = {\n  '1': 'CharacterGroup',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'characters',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Celebrity',\n      '10': 'characters'\n    },\n  ],\n};\n\n/// Descriptor for `CharacterGroup`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List characterGroupDescriptor = $convert.base64Decode(\n    'Cg5DaGFyYWN0ZXJHcm91cBIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSSAoKY2hhcmFjdGVycxgCIA'\n    'MoCzIoLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLkNlbGVicml0eVIKY2hhcmFjdGVy'\n    'cw==');\n\n@$core.Deprecated('Use charactersDescriptor instead')\nconst Characters$json = {\n  '1': 'Characters',\n  '2': [\n    {\n      '1': 'groups',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.CharacterGroup',\n      '10': 'groups'\n    },\n  ],\n};\n\n/// Descriptor for `Characters`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List charactersDescriptor = $convert.base64Decode(\n    'CgpDaGFyYWN0ZXJzEkUKBmdyb3VwcxgBIAMoCzItLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY2'\n    '9tbW9uLkNoYXJhY3Rlckdyb3VwUgZncm91cHM=');\n\n@$core.Deprecated('Use coinExtendDescriptor instead')\nconst CoinExtend$json = {\n  '1': 'CoinExtend',\n  '2': [\n    {'1': 'coin_app_zip_icon', '3': 1, '4': 1, '5': 9, '10': 'coinAppZipIcon'},\n    {'1': 'coin_app_icon1', '3': 2, '4': 1, '5': 9, '10': 'coinAppIcon1'},\n    {'1': 'coin_app_icon2', '3': 3, '4': 1, '5': 9, '10': 'coinAppIcon2'},\n    {'1': 'coin_app_icon3', '3': 4, '4': 1, '5': 9, '10': 'coinAppIcon3'},\n    {'1': 'coin_app_icon4', '3': 5, '4': 1, '5': 9, '10': 'coinAppIcon4'},\n  ],\n};\n\n/// Descriptor for `CoinExtend`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List coinExtendDescriptor = $convert.base64Decode(\n    'CgpDb2luRXh0ZW5kEikKEWNvaW5fYXBwX3ppcF9pY29uGAEgASgJUg5jb2luQXBwWmlwSWNvbh'\n    'IkCg5jb2luX2FwcF9pY29uMRgCIAEoCVIMY29pbkFwcEljb24xEiQKDmNvaW5fYXBwX2ljb24y'\n    'GAMgASgJUgxjb2luQXBwSWNvbjISJAoOY29pbl9hcHBfaWNvbjMYBCABKAlSDGNvaW5BcHBJY2'\n    '9uMxIkCg5jb2luX2FwcF9pY29uNBgFIAEoCVIMY29pbkFwcEljb240');\n\n@$core.Deprecated('Use combinationEpDescriptor instead')\nconst CombinationEp$json = {\n  '1': 'CombinationEp',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 5, '10': 'id'},\n    {'1': 'section_id', '3': 2, '4': 1, '5': 5, '10': 'sectionId'},\n    {'1': 'title', '3': 3, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'can_ord_desc', '3': 4, '4': 1, '5': 5, '10': 'canOrdDesc'},\n    {'1': 'more', '3': 5, '4': 1, '5': 9, '10': 'more'},\n    {'1': 'episode_ids', '3': 6, '4': 3, '5': 5, '10': 'episodeIds'},\n    {\n      '1': 'episodes',\n      '3': 7,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.ViewEpisode',\n      '10': 'episodes'\n    },\n    {'1': 'split_text', '3': 8, '4': 1, '5': 9, '10': 'splitText'},\n    {\n      '1': 'module_style',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Style',\n      '10': 'moduleStyle'\n    },\n    {\n      '1': 'serial_season',\n      '3': 10,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.SerialSeason',\n      '10': 'serialSeason'\n    },\n    {\n      '1': 'section_data',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.SectionData',\n      '10': 'sectionData'\n    },\n  ],\n};\n\n/// Descriptor for `CombinationEp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List combinationEpDescriptor = $convert.base64Decode(\n    'Cg1Db21iaW5hdGlvbkVwEg4KAmlkGAEgASgFUgJpZBIdCgpzZWN0aW9uX2lkGAIgASgFUglzZW'\n    'N0aW9uSWQSFAoFdGl0bGUYAyABKAlSBXRpdGxlEiAKDGNhbl9vcmRfZGVzYxgEIAEoBVIKY2Fu'\n    'T3JkRGVzYxISCgRtb3JlGAUgASgJUgRtb3JlEh8KC2VwaXNvZGVfaWRzGAYgAygFUgplcGlzb2'\n    'RlSWRzEkYKCGVwaXNvZGVzGAcgAygLMiouYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24u'\n    'Vmlld0VwaXNvZGVSCGVwaXNvZGVzEh0KCnNwbGl0X3RleHQYCCABKAlSCXNwbGl0VGV4dBJHCg'\n    'xtb2R1bGVfc3R5bGUYCSABKAsyJC5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5TdHls'\n    'ZVILbW9kdWxlU3R5bGUSUAoNc2VyaWFsX3NlYXNvbhgKIAMoCzIrLmJpbGliaWxpLmFwcC52aW'\n    'V3dW5pdGUuY29tbW9uLlNlcmlhbFNlYXNvblIMc2VyaWFsU2Vhc29uEk0KDHNlY3Rpb25fZGF0'\n    'YRgLIAEoCzIqLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLlNlY3Rpb25EYXRhUgtzZW'\n    'N0aW9uRGF0YQ==');\n\n@$core.Deprecated('Use contractTextDescriptor instead')\nconst ContractText$json = {\n  '1': 'ContractText',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'subtitle', '3': 2, '4': 1, '5': 9, '10': 'subtitle'},\n  ],\n};\n\n/// Descriptor for `ContractText`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List contractTextDescriptor = $convert.base64Decode(\n    'CgxDb250cmFjdFRleHQSFAoFdGl0bGUYASABKAlSBXRpdGxlEhoKCHN1YnRpdGxlGAIgASgJUg'\n    'hzdWJ0aXRsZQ==');\n\n@$core.Deprecated('Use covenanterDescriptor instead')\nconst Covenanter$json = {\n  '1': 'Covenanter',\n  '2': [\n    {'1': 'is_follow_display', '3': 1, '4': 1, '5': 5, '10': 'isFollowDisplay'},\n    {\n      '1': 'text',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.ContractText',\n      '10': 'text'\n    },\n    {\n      '1': 'is_interact_display',\n      '3': 3,\n      '4': 1,\n      '5': 5,\n      '10': 'isInteractDisplay'\n    },\n  ],\n};\n\n/// Descriptor for `Covenanter`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List covenanterDescriptor = $convert.base64Decode(\n    'CgpDb3ZlbmFudGVyEioKEWlzX2ZvbGxvd19kaXNwbGF5GAEgASgFUg9pc0ZvbGxvd0Rpc3BsYX'\n    'kSPwoEdGV4dBgCIAEoCzIrLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLkNvbnRyYWN0'\n    'VGV4dFIEdGV4dBIuChNpc19pbnRlcmFjdF9kaXNwbGF5GAMgASgFUhFpc0ludGVyYWN0RGlzcG'\n    'xheQ==');\n\n@$core.Deprecated('Use coverDimensionDescriptor instead')\nconst CoverDimension$json = {\n  '1': 'CoverDimension',\n  '2': [\n    {'1': 'width', '3': 1, '4': 1, '5': 2, '10': 'width'},\n    {'1': 'height', '3': 2, '4': 1, '5': 2, '10': 'height'},\n  ],\n};\n\n/// Descriptor for `CoverDimension`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List coverDimensionDescriptor = $convert.base64Decode(\n    'Cg5Db3ZlckRpbWVuc2lvbhIUCgV3aWR0aBgBIAEoAlIFd2lkdGgSFgoGaGVpZ2h0GAIgASgCUg'\n    'ZoZWlnaHQ=');\n\n@$core.Deprecated('Use deliveryDataDescriptor instead')\nconst DeliveryData$json = {\n  '1': 'DeliveryData',\n  '2': [\n    {\n      '1': 'activity',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Activity',\n      '9': 0,\n      '10': 'activity'\n    },\n    {\n      '1': 'characters',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Characters',\n      '9': 0,\n      '10': 'characters'\n    },\n    {\n      '1': 'theatre_hot_topic',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.TheatreHotTopic',\n      '9': 0,\n      '10': 'theatreHotTopic'\n    },\n    {\n      '1': 'agg_eps',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.AggEps',\n      '9': 0,\n      '10': 'aggEps'\n    },\n    {\n      '1': 'act_page_items',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.ActPageItems',\n      '9': 0,\n      '10': 'actPageItems'\n    },\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'module_style',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Style',\n      '10': 'moduleStyle'\n    },\n    {'1': 'more', '3': 3, '4': 1, '5': 9, '10': 'more'},\n    {'1': 'id', '3': 8, '4': 1, '5': 5, '10': 'id'},\n    {\n      '1': 'report',\n      '3': 9,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.DeliveryData.ReportEntry',\n      '10': 'report'\n    },\n  ],\n  '3': [DeliveryData_ReportEntry$json],\n  '8': [\n    {'1': 'data'},\n  ],\n};\n\n@$core.Deprecated('Use deliveryDataDescriptor instead')\nconst DeliveryData_ReportEntry$json = {\n  '1': 'ReportEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `DeliveryData`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List deliveryDataDescriptor = $convert.base64Decode(\n    'CgxEZWxpdmVyeURhdGESRQoIYWN0aXZpdHkYBCABKAsyJy5iaWxpYmlsaS5hcHAudmlld3VuaX'\n    'RlLmNvbW1vbi5BY3Rpdml0eUgAUghhY3Rpdml0eRJLCgpjaGFyYWN0ZXJzGAUgASgLMikuYmls'\n    'aWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uQ2hhcmFjdGVyc0gAUgpjaGFyYWN0ZXJzElwKEX'\n    'RoZWF0cmVfaG90X3RvcGljGAYgASgLMi4uYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24u'\n    'VGhlYXRyZUhvdFRvcGljSABSD3RoZWF0cmVIb3RUb3BpYxJACgdhZ2dfZXBzGAcgASgLMiUuYm'\n    'lsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uQWdnRXBzSABSBmFnZ0VwcxJTCg5hY3RfcGFn'\n    'ZV9pdGVtcxgKIAEoCzIrLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLkFjdFBhZ2VJdG'\n    'Vtc0gAUgxhY3RQYWdlSXRlbXMSFAoFdGl0bGUYASABKAlSBXRpdGxlEkcKDG1vZHVsZV9zdHls'\n    'ZRgCIAEoCzIkLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLlN0eWxlUgttb2R1bGVTdH'\n    'lsZRISCgRtb3JlGAMgASgJUgRtb3JlEg4KAmlkGAggASgFUgJpZBJPCgZyZXBvcnQYCSADKAsy'\n    'Ny5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5EZWxpdmVyeURhdGEuUmVwb3J0RW50cn'\n    'lSBnJlcG9ydBo5CgtSZXBvcnRFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEo'\n    'CVIFdmFsdWU6AjgBQgYKBGRhdGE=');\n\n@$core.Deprecated('Use descDescriptor instead')\nconst Desc$json = {\n  '1': 'Desc',\n  '2': [\n    {'1': 'info', '3': 1, '4': 1, '5': 9, '10': 'info'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n  ],\n};\n\n/// Descriptor for `Desc`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List descDescriptor = $convert.base64Decode(\n    'CgREZXNjEhIKBGluZm8YASABKAlSBGluZm8SFAoFdGl0bGUYAiABKAlSBXRpdGxl');\n\n@$core.Deprecated('Use descV2Descriptor instead')\nconst DescV2$json = {\n  '1': 'DescV2',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {\n      '1': 'type',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.common.DescType',\n      '10': 'type'\n    },\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'rid', '3': 4, '4': 1, '5': 3, '10': 'rid'},\n  ],\n};\n\n/// Descriptor for `DescV2`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List descV2Descriptor = $convert.base64Decode(\n    'CgZEZXNjVjISEgoEdGV4dBgBIAEoCVIEdGV4dBI7CgR0eXBlGAIgASgOMicuYmlsaWJpbGkuYX'\n    'BwLnZpZXd1bml0ZS5jb21tb24uRGVzY1R5cGVSBHR5cGUSEAoDdXJpGAMgASgJUgN1cmkSEAoD'\n    'cmlkGAQgASgDUgNyaWQ=');\n\n@$core.Deprecated('Use dimensionDescriptor instead')\nconst Dimension$json = {\n  '1': 'Dimension',\n  '2': [\n    {'1': 'width', '3': 1, '4': 1, '5': 3, '10': 'width'},\n    {'1': 'height', '3': 2, '4': 1, '5': 3, '10': 'height'},\n    {'1': 'rotate', '3': 3, '4': 1, '5': 3, '10': 'rotate'},\n  ],\n};\n\n/// Descriptor for `Dimension`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dimensionDescriptor = $convert.base64Decode(\n    'CglEaW1lbnNpb24SFAoFd2lkdGgYASABKANSBXdpZHRoEhYKBmhlaWdodBgCIAEoA1IGaGVpZ2'\n    'h0EhYKBnJvdGF0ZRgDIAEoA1IGcm90YXRl');\n\n@$core.Deprecated('Use dislikeReasonsDescriptor instead')\nconst DislikeReasons$json = {\n  '1': 'DislikeReasons',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'mid', '3': 2, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'rid', '3': 3, '4': 1, '5': 5, '10': 'rid'},\n    {'1': 'tag_id', '3': 4, '4': 1, '5': 3, '10': 'tagId'},\n    {'1': 'name', '3': 5, '4': 1, '5': 9, '10': 'name'},\n  ],\n};\n\n/// Descriptor for `DislikeReasons`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dislikeReasonsDescriptor = $convert.base64Decode(\n    'Cg5EaXNsaWtlUmVhc29ucxIOCgJpZBgBIAEoA1ICaWQSEAoDbWlkGAIgASgDUgNtaWQSEAoDcm'\n    'lkGAMgASgFUgNyaWQSFQoGdGFnX2lkGAQgASgDUgV0YWdJZBISCgRuYW1lGAUgASgJUgRuYW1l');\n\n@$core.Deprecated('Use epBgInfoDescriptor instead')\nconst EpBgInfo$json = {\n  '1': 'EpBgInfo',\n  '2': [\n    {\n      '1': 'float_layer',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.BgInfo',\n      '10': 'floatLayer'\n    },\n    {\n      '1': 'no_float_layer',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.BgInfo',\n      '10': 'noFloatLayer'\n    },\n  ],\n};\n\n/// Descriptor for `EpBgInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List epBgInfoDescriptor = $convert.base64Decode(\n    'CghFcEJnSW5mbxJGCgtmbG9hdF9sYXllchgBIAEoCzIlLmJpbGliaWxpLmFwcC52aWV3dW5pdG'\n    'UuY29tbW9uLkJnSW5mb1IKZmxvYXRMYXllchJLCg5ub19mbG9hdF9sYXllchgCIAEoCzIlLmJp'\n    'bGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLkJnSW5mb1IMbm9GbG9hdExheWVy');\n\n@$core.Deprecated('Use extTabDescriptor instead')\nconst ExtTab$json = {\n  '1': 'ExtTab',\n  '2': [\n    {\n      '1': 'ext_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.common.ExtType',\n      '10': 'extType'\n    },\n    {'1': 'data', '3': 2, '4': 1, '5': 9, '10': 'data'},\n  ],\n};\n\n/// Descriptor for `ExtTab`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List extTabDescriptor = $convert.base64Decode(\n    'CgZFeHRUYWISQQoIZXh0X3R5cGUYASABKA4yJi5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW'\n    '1vbi5FeHRUeXBlUgdleHRUeXBlEhIKBGRhdGEYAiABKAlSBGRhdGE=');\n\n@$core.Deprecated('Use followLayerDescriptor instead')\nconst FollowLayer$json = {\n  '1': 'FollowLayer',\n  '2': [\n    {\n      '1': 'staff',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Staff',\n      '10': 'staff'\n    },\n    {\n      '1': 'desc',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Desc',\n      '10': 'desc'\n    },\n    {\n      '1': 'report',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.FollowLayer.ReportEntry',\n      '10': 'report'\n    },\n  ],\n  '3': [FollowLayer_ReportEntry$json],\n};\n\n@$core.Deprecated('Use followLayerDescriptor instead')\nconst FollowLayer_ReportEntry$json = {\n  '1': 'ReportEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `FollowLayer`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List followLayerDescriptor = $convert.base64Decode(\n    'CgtGb2xsb3dMYXllchI6CgVzdGFmZhgBIAEoCzIkLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY2'\n    '9tbW9uLlN0YWZmUgVzdGFmZhI3CgRkZXNjGAIgASgLMiMuYmlsaWJpbGkuYXBwLnZpZXd1bml0'\n    'ZS5jb21tb24uRGVzY1IEZGVzYxJOCgZyZXBvcnQYAyADKAsyNi5iaWxpYmlsaS5hcHAudmlld3'\n    'VuaXRlLmNvbW1vbi5Gb2xsb3dMYXllci5SZXBvcnRFbnRyeVIGcmVwb3J0GjkKC1JlcG9ydEVu'\n    'dHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAE=');\n\n@$core.Deprecated('Use headlineDescriptor instead')\nconst Headline$json = {\n  '1': 'Headline',\n  '2': [\n    {\n      '1': 'label',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Label',\n      '10': 'label'\n    },\n    {'1': 'content', '3': 2, '4': 1, '5': 9, '10': 'content'},\n  ],\n};\n\n/// Descriptor for `Headline`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List headlineDescriptor = $convert.base64Decode(\n    'CghIZWFkbGluZRI6CgVsYWJlbBgBIAEoCzIkLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW'\n    '9uLkxhYmVsUgVsYWJlbBIYCgdjb250ZW50GAIgASgJUgdjb250ZW50');\n\n@$core.Deprecated('Use historyNodeDescriptor instead')\nconst HistoryNode$json = {\n  '1': 'HistoryNode',\n  '2': [\n    {'1': 'node_id', '3': 1, '4': 1, '5': 3, '10': 'nodeId'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cid', '3': 3, '4': 1, '5': 3, '10': 'cid'},\n  ],\n};\n\n/// Descriptor for `HistoryNode`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List historyNodeDescriptor = $convert.base64Decode(\n    'CgtIaXN0b3J5Tm9kZRIXCgdub2RlX2lkGAEgASgDUgZub2RlSWQSFAoFdGl0bGUYAiABKAlSBX'\n    'RpdGxlEhAKA2NpZBgDIAEoA1IDY2lk');\n\n@$core.Deprecated('Use honorDescriptor instead')\nconst Honor$json = {\n  '1': 'Honor',\n  '2': [\n    {\n      '1': 'profession_ext',\n      '3': 15,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.ProfessionHonorExtend',\n      '9': 0,\n      '10': 'professionExt'\n    },\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'icon_night', '3': 2, '4': 1, '5': 9, '10': 'iconNight'},\n    {'1': 'text', '3': 3, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'text_extra', '3': 4, '4': 1, '5': 9, '10': 'textExtra'},\n    {'1': 'text_color', '3': 5, '4': 1, '5': 9, '10': 'textColor'},\n    {'1': 'text_color_night', '3': 6, '4': 1, '5': 9, '10': 'textColorNight'},\n    {'1': 'bg_color', '3': 7, '4': 1, '5': 9, '10': 'bgColor'},\n    {'1': 'bg_color_night', '3': 8, '4': 1, '5': 9, '10': 'bgColorNight'},\n    {'1': 'url', '3': 9, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'url_text', '3': 10, '4': 1, '5': 9, '10': 'urlText'},\n    {\n      '1': 'type',\n      '3': 11,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.common.HonorType',\n      '10': 'type'\n    },\n    {\n      '1': 'honor_jump_type',\n      '3': 12,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.common.HonorJumpType',\n      '10': 'honorJumpType'\n    },\n    {\n      '1': 'report',\n      '3': 13,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Honor.ReportEntry',\n      '10': 'report'\n    },\n    {'1': 'end_icon', '3': 14, '4': 1, '5': 9, '10': 'endIcon'},\n  ],\n  '3': [Honor_ReportEntry$json],\n  '8': [\n    {'1': 'extend'},\n  ],\n};\n\n@$core.Deprecated('Use honorDescriptor instead')\nconst Honor_ReportEntry$json = {\n  '1': 'ReportEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `Honor`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List honorDescriptor = $convert.base64Decode(\n    'CgVIb25vchJdCg5wcm9mZXNzaW9uX2V4dBgPIAEoCzI0LmJpbGliaWxpLmFwcC52aWV3dW5pdG'\n    'UuY29tbW9uLlByb2Zlc3Npb25Ib25vckV4dGVuZEgAUg1wcm9mZXNzaW9uRXh0EhIKBGljb24Y'\n    'ASABKAlSBGljb24SHQoKaWNvbl9uaWdodBgCIAEoCVIJaWNvbk5pZ2h0EhIKBHRleHQYAyABKA'\n    'lSBHRleHQSHQoKdGV4dF9leHRyYRgEIAEoCVIJdGV4dEV4dHJhEh0KCnRleHRfY29sb3IYBSAB'\n    'KAlSCXRleHRDb2xvchIoChB0ZXh0X2NvbG9yX25pZ2h0GAYgASgJUg50ZXh0Q29sb3JOaWdodB'\n    'IZCghiZ19jb2xvchgHIAEoCVIHYmdDb2xvchIkCg5iZ19jb2xvcl9uaWdodBgIIAEoCVIMYmdD'\n    'b2xvck5pZ2h0EhAKA3VybBgJIAEoCVIDdXJsEhkKCHVybF90ZXh0GAogASgJUgd1cmxUZXh0Ej'\n    'wKBHR5cGUYCyABKA4yKC5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5Ib25vclR5cGVS'\n    'BHR5cGUSVAoPaG9ub3JfanVtcF90eXBlGAwgASgOMiwuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS'\n    '5jb21tb24uSG9ub3JKdW1wVHlwZVINaG9ub3JKdW1wVHlwZRJICgZyZXBvcnQYDSADKAsyMC5i'\n    'aWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5Ib25vci5SZXBvcnRFbnRyeVIGcmVwb3J0Eh'\n    'kKCGVuZF9pY29uGA4gASgJUgdlbmRJY29uGjkKC1JlcG9ydEVudHJ5EhAKA2tleRgBIAEoCVID'\n    'a2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAFCCAoGZXh0ZW5k');\n\n@$core.Deprecated('Use iconFontDescriptor instead')\nconst IconFont$json = {\n  '1': 'IconFont',\n  '2': [\n    {'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},\n  ],\n};\n\n/// Descriptor for `IconFont`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List iconFontDescriptor = $convert.base64Decode(\n    'CghJY29uRm9udBISCgRuYW1lGAEgASgJUgRuYW1lEhIKBHRleHQYAiABKAlSBHRleHQ=');\n\n@$core.Deprecated('Use imagesWidgetDescriptor instead')\nconst ImagesWidget$json = {\n  '1': 'ImagesWidget',\n  '2': [\n    {'1': 'code', '3': 1, '4': 1, '5': 9, '10': 'code'},\n    {'1': 'url', '3': 2, '4': 3, '5': 9, '10': 'url'},\n  ],\n};\n\n/// Descriptor for `ImagesWidget`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List imagesWidgetDescriptor = $convert.base64Decode(\n    'CgxJbWFnZXNXaWRnZXQSEgoEY29kZRgBIAEoCVIEY29kZRIQCgN1cmwYAiADKAlSA3VybA==');\n\n@$core.Deprecated('Use interactionDescriptor instead')\nconst Interaction$json = {\n  '1': 'Interaction',\n  '2': [\n    {'1': 'ep_id', '3': 1, '4': 1, '5': 3, '10': 'epId'},\n    {\n      '1': 'history_node',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.HistoryNode',\n      '10': 'historyNode'\n    },\n    {'1': 'graph_version', '3': 3, '4': 1, '5': 3, '10': 'graphVersion'},\n    {'1': 'msg', '3': 4, '4': 1, '5': 9, '10': 'msg'},\n    {'1': 'is_interaction', '3': 5, '4': 1, '5': 8, '10': 'isInteraction'},\n  ],\n};\n\n/// Descriptor for `Interaction`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List interactionDescriptor = $convert.base64Decode(\n    'CgtJbnRlcmFjdGlvbhITCgVlcF9pZBgBIAEoA1IEZXBJZBJNCgxoaXN0b3J5X25vZGUYAiABKA'\n    'syKi5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5IaXN0b3J5Tm9kZVILaGlzdG9yeU5v'\n    'ZGUSIwoNZ3JhcGhfdmVyc2lvbhgDIAEoA1IMZ3JhcGhWZXJzaW9uEhAKA21zZxgEIAEoCVIDbX'\n    'NnEiUKDmlzX2ludGVyYWN0aW9uGAUgASgIUg1pc0ludGVyYWN0aW9u');\n\n@$core.Deprecated('Use itemDescriptor instead')\nconst Item$json = {\n  '1': 'Item',\n  '2': [\n    {'1': 'link', '3': 1, '4': 1, '5': 9, '10': 'link'},\n    {'1': 'cover', '3': 2, '4': 1, '5': 9, '10': 'cover'},\n  ],\n};\n\n/// Descriptor for `Item`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List itemDescriptor = $convert.base64Decode(\n    'CgRJdGVtEhIKBGxpbmsYASABKAlSBGxpbmsSFAoFY292ZXIYAiABKAlSBWNvdmVy');\n\n@$core.Deprecated('Use kingPosDescriptor instead')\nconst KingPos$json = {\n  '1': 'KingPos',\n  '2': [\n    {\n      '1': 'like',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.LikeExtend',\n      '9': 0,\n      '10': 'like'\n    },\n    {\n      '1': 'coin',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.CoinExtend',\n      '9': 0,\n      '10': 'coin'\n    },\n    {'1': 'disable', '3': 1, '4': 1, '5': 8, '10': 'disable'},\n    {'1': 'icon', '3': 2, '4': 1, '5': 9, '10': 'icon'},\n    {\n      '1': 'type',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.common.KingPositionType',\n      '10': 'type'\n    },\n    {'1': 'disable_toast', '3': 4, '4': 1, '5': 9, '10': 'disableToast'},\n    {'1': 'checked_toast', '3': 5, '4': 1, '5': 9, '10': 'checkedToast'},\n  ],\n  '8': [\n    {'1': 'extend'},\n  ],\n};\n\n/// Descriptor for `KingPos`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List kingPosDescriptor = $convert.base64Decode(\n    'CgdLaW5nUG9zEj8KBGxpa2UYBiABKAsyKS5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi'\n    '5MaWtlRXh0ZW5kSABSBGxpa2USPwoEY29pbhgHIAEoCzIpLmJpbGliaWxpLmFwcC52aWV3dW5p'\n    'dGUuY29tbW9uLkNvaW5FeHRlbmRIAFIEY29pbhIYCgdkaXNhYmxlGAEgASgIUgdkaXNhYmxlEh'\n    'IKBGljb24YAiABKAlSBGljb24SQwoEdHlwZRgDIAEoDjIvLmJpbGliaWxpLmFwcC52aWV3dW5p'\n    'dGUuY29tbW9uLktpbmdQb3NpdGlvblR5cGVSBHR5cGUSIwoNZGlzYWJsZV90b2FzdBgEIAEoCV'\n    'IMZGlzYWJsZVRvYXN0EiMKDWNoZWNrZWRfdG9hc3QYBSABKAlSDGNoZWNrZWRUb2FzdEIICgZl'\n    'eHRlbmQ=');\n\n@$core.Deprecated('Use kingPositionDescriptor instead')\nconst KingPosition$json = {\n  '1': 'KingPosition',\n  '2': [\n    {\n      '1': 'king_pos',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.KingPos',\n      '10': 'kingPos'\n    },\n    {\n      '1': 'extend',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.KingPos',\n      '10': 'extend'\n    },\n  ],\n};\n\n/// Descriptor for `KingPosition`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List kingPositionDescriptor = $convert.base64Decode(\n    'CgxLaW5nUG9zaXRpb24SQQoIa2luZ19wb3MYASADKAsyJi5iaWxpYmlsaS5hcHAudmlld3VuaX'\n    'RlLmNvbW1vbi5LaW5nUG9zUgdraW5nUG9zEj4KBmV4dGVuZBgCIAMoCzImLmJpbGliaWxpLmFw'\n    'cC52aWV3dW5pdGUuY29tbW9uLktpbmdQb3NSBmV4dGVuZA==');\n\n@$core.Deprecated('Use labelDescriptor instead')\nconst Label$json = {\n  '1': 'Label',\n  '2': [\n    {'1': 'type', '3': 1, '4': 1, '5': 5, '10': 'type'},\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'icon', '3': 3, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'icon_night', '3': 4, '4': 1, '5': 9, '10': 'iconNight'},\n    {'1': 'icon_width', '3': 5, '4': 1, '5': 3, '10': 'iconWidth'},\n    {'1': 'icon_height', '3': 6, '4': 1, '5': 3, '10': 'iconHeight'},\n    {'1': 'lottie', '3': 7, '4': 1, '5': 9, '10': 'lottie'},\n    {'1': 'lottie_night', '3': 8, '4': 1, '5': 9, '10': 'lottieNight'},\n    {\n      '1': 'report',\n      '3': 9,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Label.ReportEntry',\n      '10': 'report'\n    },\n  ],\n  '3': [Label_ReportEntry$json],\n};\n\n@$core.Deprecated('Use labelDescriptor instead')\nconst Label_ReportEntry$json = {\n  '1': 'ReportEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `Label`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List labelDescriptor = $convert.base64Decode(\n    'CgVMYWJlbBISCgR0eXBlGAEgASgFUgR0eXBlEhAKA3VyaRgCIAEoCVIDdXJpEhIKBGljb24YAy'\n    'ABKAlSBGljb24SHQoKaWNvbl9uaWdodBgEIAEoCVIJaWNvbk5pZ2h0Eh0KCmljb25fd2lkdGgY'\n    'BSABKANSCWljb25XaWR0aBIfCgtpY29uX2hlaWdodBgGIAEoA1IKaWNvbkhlaWdodBIWCgZsb3'\n    'R0aWUYByABKAlSBmxvdHRpZRIhCgxsb3R0aWVfbmlnaHQYCCABKAlSC2xvdHRpZU5pZ2h0EkgK'\n    'BnJlcG9ydBgJIAMoCzIwLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLkxhYmVsLlJlcG'\n    '9ydEVudHJ5UgZyZXBvcnQaOQoLUmVwb3J0RW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFs'\n    'dWUYAiABKAlSBXZhbHVlOgI4AQ==');\n\n@$core.Deprecated('Use likeCommentDescriptor instead')\nconst LikeComment$json = {\n  '1': 'LikeComment',\n  '2': [\n    {'1': 'reply', '3': 1, '4': 1, '5': 9, '10': 'reply'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n  ],\n};\n\n/// Descriptor for `LikeComment`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List likeCommentDescriptor = $convert.base64Decode(\n    'CgtMaWtlQ29tbWVudBIUCgVyZXBseRgBIAEoCVIFcmVwbHkSFAoFdGl0bGUYAiABKAlSBXRpdG'\n    'xl');\n\n@$core.Deprecated('Use likeExtendDescriptor instead')\nconst LikeExtend$json = {\n  '1': 'LikeExtend',\n  '2': [\n    {\n      '1': 'triple_like',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.UpLikeImg',\n      '10': 'tripleLike'\n    },\n    {'1': 'like_animation', '3': 2, '4': 1, '5': 9, '10': 'likeAnimation'},\n    {\n      '1': 'player_animation',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PlayerAnimation',\n      '10': 'playerAnimation'\n    },\n    {\n      '1': 'resource',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.ActivityResource',\n      '10': 'resource'\n    },\n  ],\n};\n\n/// Descriptor for `LikeExtend`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List likeExtendDescriptor = $convert.base64Decode(\n    'CgpMaWtlRXh0ZW5kEkkKC3RyaXBsZV9saWtlGAEgASgLMiguYmlsaWJpbGkuYXBwLnZpZXd1bm'\n    'l0ZS5jb21tb24uVXBMaWtlSW1nUgp0cmlwbGVMaWtlEiUKDmxpa2VfYW5pbWF0aW9uGAIgASgJ'\n    'Ug1saWtlQW5pbWF0aW9uElkKEHBsYXllcl9hbmltYXRpb24YAyABKAsyLi5iaWxpYmlsaS5hcH'\n    'Audmlld3VuaXRlLmNvbW1vbi5QbGF5ZXJBbmltYXRpb25SD3BsYXllckFuaW1hdGlvbhJLCghy'\n    'ZXNvdXJjZRgEIAEoCzIvLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLkFjdGl2aXR5Um'\n    'Vzb3VyY2VSCHJlc291cmNl');\n\n@$core.Deprecated('Use liveDescriptor instead')\nconst Live$json = {\n  '1': 'Live',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'room_id', '3': 2, '4': 1, '5': 3, '10': 'roomId'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'endpage_uri', '3': 4, '4': 1, '5': 9, '10': 'endpageUri'},\n  ],\n};\n\n/// Descriptor for `Live`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List liveDescriptor = $convert.base64Decode(\n    'CgRMaXZlEhAKA21pZBgBIAEoA1IDbWlkEhcKB3Jvb21faWQYAiABKANSBnJvb21JZBIQCgN1cm'\n    'kYAyABKAlSA3VyaRIfCgtlbmRwYWdlX3VyaRgEIAEoCVIKZW5kcGFnZVVyaQ==');\n\n@$core.Deprecated('Use liveOrderDescriptor instead')\nconst LiveOrder$json = {\n  '1': 'LiveOrder',\n  '2': [\n    {'1': 'sid', '3': 1, '4': 1, '5': 3, '10': 'sid'},\n    {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},\n    {\n      '1': 'live_plan_start_time',\n      '3': 3,\n      '4': 1,\n      '5': 3,\n      '10': 'livePlanStartTime'\n    },\n    {'1': 'is_follow', '3': 4, '4': 1, '5': 8, '10': 'isFollow'},\n    {'1': 'follow_count', '3': 5, '4': 1, '5': 3, '10': 'followCount'},\n    {\n      '1': 'reserve_calendar_info',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.ReserveCalendarInfo',\n      '10': 'reserveCalendarInfo'\n    },\n  ],\n};\n\n/// Descriptor for `LiveOrder`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List liveOrderDescriptor = $convert.base64Decode(\n    'CglMaXZlT3JkZXISEAoDc2lkGAEgASgDUgNzaWQSEgoEdGV4dBgCIAEoCVIEdGV4dBIvChRsaX'\n    'ZlX3BsYW5fc3RhcnRfdGltZRgDIAEoA1IRbGl2ZVBsYW5TdGFydFRpbWUSGwoJaXNfZm9sbG93'\n    'GAQgASgIUghpc0ZvbGxvdxIhCgxmb2xsb3dfY291bnQYBSABKANSC2ZvbGxvd0NvdW50EmYKFX'\n    'Jlc2VydmVfY2FsZW5kYXJfaW5mbxgGIAEoCzIyLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29t'\n    'bW9uLlJlc2VydmVDYWxlbmRhckluZm9SE3Jlc2VydmVDYWxlbmRhckluZm8=');\n\n@$core.Deprecated('Use merchandiseDescriptor instead')\nconst Merchandise$json = {\n  '1': 'Merchandise',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'button',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.MerchandiseButton',\n      '10': 'button'\n    },\n    {\n      '1': 'card',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.MerchandiseCard',\n      '10': 'card'\n    },\n  ],\n};\n\n/// Descriptor for `Merchandise`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List merchandiseDescriptor = $convert.base64Decode(\n    'CgtNZXJjaGFuZGlzZRIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSSAoGYnV0dG9uGAIgASgLMjAuYm'\n    'lsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uTWVyY2hhbmRpc2VCdXR0b25SBmJ1dHRvbhJC'\n    'CgRjYXJkGAMgAygLMi4uYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uTWVyY2hhbmRpc2'\n    'VDYXJkUgRjYXJk');\n\n@$core.Deprecated('Use merchandiseButtonDescriptor instead')\nconst MerchandiseButton$json = {\n  '1': 'MerchandiseButton',\n  '2': [\n    {'1': 'but_title', '3': 1, '4': 1, '5': 9, '10': 'butTitle'},\n    {'1': 'but_day_color', '3': 2, '4': 1, '5': 9, '10': 'butDayColor'},\n    {'1': 'but_night_color', '3': 3, '4': 1, '5': 9, '10': 'butNightColor'},\n  ],\n};\n\n/// Descriptor for `MerchandiseButton`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List merchandiseButtonDescriptor = $convert.base64Decode(\n    'ChFNZXJjaGFuZGlzZUJ1dHRvbhIbCglidXRfdGl0bGUYASABKAlSCGJ1dFRpdGxlEiIKDWJ1dF'\n    '9kYXlfY29sb3IYAiABKAlSC2J1dERheUNvbG9yEiYKD2J1dF9uaWdodF9jb2xvchgDIAEoCVIN'\n    'YnV0TmlnaHRDb2xvcg==');\n\n@$core.Deprecated('Use merchandiseCardDescriptor instead')\nconst MerchandiseCard$json = {\n  '1': 'MerchandiseCard',\n  '2': [\n    {'1': 'cover', '3': 1, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'sub_title',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.MerchandiseTitle',\n      '10': 'subTitle'\n    },\n    {\n      '1': 'button',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.MerchandiseButton',\n      '10': 'button'\n    },\n    {\n      '1': 'source_content',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.google.protobuf.Any',\n      '10': 'sourceContent'\n    },\n  ],\n};\n\n/// Descriptor for `MerchandiseCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List merchandiseCardDescriptor = $convert.base64Decode(\n    'Cg9NZXJjaGFuZGlzZUNhcmQSFAoFY292ZXIYASABKAlSBWNvdmVyEhQKBXRpdGxlGAIgASgJUg'\n    'V0aXRsZRJMCglzdWJfdGl0bGUYAyADKAsyLy5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1v'\n    'bi5NZXJjaGFuZGlzZVRpdGxlUghzdWJUaXRsZRJICgZidXR0b24YBCABKAsyMC5iaWxpYmlsaS'\n    '5hcHAudmlld3VuaXRlLmNvbW1vbi5NZXJjaGFuZGlzZUJ1dHRvblIGYnV0dG9uEjsKDnNvdXJj'\n    'ZV9jb250ZW50GAUgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueVINc291cmNlQ29udGVudA==');\n\n@$core.Deprecated('Use merchandiseTitleDescriptor instead')\nconst MerchandiseTitle$json = {\n  '1': 'MerchandiseTitle',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'day_color', '3': 2, '4': 1, '5': 9, '10': 'dayColor'},\n    {'1': 'night_color', '3': 3, '4': 1, '5': 9, '10': 'nightColor'},\n    {'1': 'font_size', '3': 4, '4': 1, '5': 3, '10': 'fontSize'},\n    {'1': 'text_decoration', '3': 5, '4': 1, '5': 5, '10': 'textDecoration'},\n  ],\n};\n\n/// Descriptor for `MerchandiseTitle`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List merchandiseTitleDescriptor = $convert.base64Decode(\n    'ChBNZXJjaGFuZGlzZVRpdGxlEhQKBXRpdGxlGAEgASgJUgV0aXRsZRIbCglkYXlfY29sb3IYAi'\n    'ABKAlSCGRheUNvbG9yEh8KC25pZ2h0X2NvbG9yGAMgASgJUgpuaWdodENvbG9yEhsKCWZvbnRf'\n    'c2l6ZRgEIAEoA1IIZm9udFNpemUSJwoPdGV4dF9kZWNvcmF0aW9uGAUgASgFUg50ZXh0RGVjb3'\n    'JhdGlvbg==');\n\n@$core.Deprecated('Use mineDescriptor instead')\nconst Mine$json = {\n  '1': 'Mine',\n  '2': [\n    {'1': 'amount', '3': 1, '4': 1, '5': 1, '10': 'amount'},\n    {'1': 'rank', '3': 2, '4': 1, '5': 5, '10': 'rank'},\n    {'1': 'msg', '3': 3, '4': 1, '5': 9, '10': 'msg'},\n  ],\n};\n\n/// Descriptor for `Mine`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mineDescriptor = $convert.base64Decode(\n    'CgRNaW5lEhYKBmFtb3VudBgBIAEoAVIGYW1vdW50EhIKBHJhbmsYAiABKAVSBHJhbmsSEAoDbX'\n    'NnGAMgASgJUgNtc2c=');\n\n@$core.Deprecated('Use moduleDescriptor instead')\nconst Module$json = {\n  '1': 'Module',\n  '2': [\n    {\n      '1': 'ogv_introduction',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.OgvIntroduction',\n      '9': 0,\n      '10': 'ogvIntroduction'\n    },\n    {\n      '1': 'ugc_introduction',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.UgcIntroduction',\n      '9': 0,\n      '10': 'ugcIntroduction'\n    },\n    {\n      '1': 'king_position',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.KingPosition',\n      '9': 0,\n      '10': 'kingPosition'\n    },\n    {\n      '1': 'head_line',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Headline',\n      '9': 0,\n      '10': 'headLine'\n    },\n    {\n      '1': 'ogv_title',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.OgvTitle',\n      '9': 0,\n      '10': 'ogvTitle'\n    },\n    {\n      '1': 'honor',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Honor',\n      '9': 0,\n      '10': 'honor'\n    },\n    {\n      '1': 'list',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.UserList',\n      '9': 0,\n      '10': 'list'\n    },\n    {\n      '1': 'staffs',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Staffs',\n      '9': 0,\n      '10': 'staffs'\n    },\n    {\n      '1': 'activity_reserve',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.ActivityReserve',\n      '9': 0,\n      '10': 'activityReserve'\n    },\n    {\n      '1': 'live_order',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.LiveOrder',\n      '9': 0,\n      '10': 'liveOrder'\n    },\n    {\n      '1': 'section_data',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.SectionData',\n      '9': 0,\n      '10': 'sectionData'\n    },\n    {\n      '1': 'delivery_data',\n      '3': 13,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.DeliveryData',\n      '9': 0,\n      '10': 'deliveryData'\n    },\n    {\n      '1': 'follow_layer',\n      '3': 14,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.FollowLayer',\n      '9': 0,\n      '10': 'followLayer'\n    },\n    {\n      '1': 'ogv_seasons',\n      '3': 15,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.OgvSeasons',\n      '9': 0,\n      '10': 'ogvSeasons'\n    },\n    {\n      '1': 'ugc_season',\n      '3': 16,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.UgcSeasons',\n      '9': 0,\n      '10': 'ugcSeason'\n    },\n    {\n      '1': 'ogv_live_reserve',\n      '3': 17,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.OgvLiveReserve',\n      '9': 0,\n      '10': 'ogvLiveReserve'\n    },\n    {\n      '1': 'combination_ep',\n      '3': 18,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.CombinationEp',\n      '9': 0,\n      '10': 'combinationEp'\n    },\n    {\n      '1': 'sponsor',\n      '3': 19,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Sponsor',\n      '9': 0,\n      '10': 'sponsor'\n    },\n    {\n      '1': 'activity_entrance_module',\n      '3': 20,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.ActivityEntranceModule',\n      '9': 0,\n      '10': 'activityEntranceModule'\n    },\n    {\n      '1': 'serial_season',\n      '3': 21,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.SerialSeason',\n      '9': 0,\n      '10': 'serialSeason'\n    },\n    {\n      '1': 'relates',\n      '3': 22,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Relates',\n      '9': 0,\n      '10': 'relates'\n    },\n    {\n      '1': 'banner',\n      '3': 23,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Banner',\n      '9': 0,\n      '10': 'banner'\n    },\n    {\n      '1': 'audio',\n      '3': 24,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Audio',\n      '9': 0,\n      '10': 'audio'\n    },\n    {\n      '1': 'like_comment',\n      '3': 25,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.LikeComment',\n      '9': 0,\n      '10': 'likeComment'\n    },\n    {\n      '1': 'attention_recommend',\n      '3': 26,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.AttentionRecommend',\n      '9': 0,\n      '10': 'attentionRecommend'\n    },\n    {\n      '1': 'covenanter',\n      '3': 27,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Covenanter',\n      '9': 0,\n      '10': 'covenanter'\n    },\n    {\n      '1': 'special_tag',\n      '3': 28,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.SpecialTag',\n      '9': 0,\n      '10': 'specialTag'\n    },\n    {\n      '1': 'up_data_module',\n      '3': 29,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.UpDataModule',\n      '9': 0,\n      '10': 'upDataModule'\n    },\n    {\n      '1': 'profession_approval',\n      '3': 30,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.ProfessionApproval',\n      '9': 0,\n      '10': 'professionApproval'\n    },\n    {\n      '1': 'pugv_shopping_notice',\n      '3': 31,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvShoppingNotice',\n      '9': 0,\n      '10': 'pugvShoppingNotice'\n    },\n    {\n      '1': 'pugv_faq',\n      '3': 32,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvFaq',\n      '9': 0,\n      '10': 'pugvFaq'\n    },\n    {\n      '1': 'pugv_season_description',\n      '3': 33,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvSeasonDescription',\n      '9': 0,\n      '10': 'pugvSeasonDescription'\n    },\n    {\n      '1': 'pugv_season_recommend',\n      '3': 34,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvSeasonRecommend',\n      '9': 0,\n      '10': 'pugvSeasonRecommend'\n    },\n    {\n      '1': 'pugv_season_publisher',\n      '3': 35,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvSeasonPublisher',\n      '9': 0,\n      '10': 'pugvSeasonPublisher'\n    },\n    {\n      '1': 'pugv_season_selection',\n      '3': 36,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvSeasonSelection',\n      '9': 0,\n      '10': 'pugvSeasonSelection'\n    },\n    {\n      '1': 'pugv_season_primary_info',\n      '3': 37,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvSeasonPrimaryInfo',\n      '9': 0,\n      '10': 'pugvSeasonPrimaryInfo'\n    },\n    {\n      '1': 'pugv_cooperation_application',\n      '3': 38,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvCooperationApplication',\n      '9': 0,\n      '10': 'pugvCooperationApplication'\n    },\n    {\n      '1': 'up_video_tool',\n      '3': 39,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.UpVideoTool',\n      '9': 0,\n      '10': 'upVideoTool'\n    },\n    {\n      '1': 'pugv_zone',\n      '3': 40,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvZone',\n      '9': 0,\n      '10': 'pugvZone'\n    },\n    {\n      '1': 'pugv_series',\n      '3': 41,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvSeries',\n      '9': 0,\n      '10': 'pugvSeries'\n    },\n    {\n      '1': 'pugv_package',\n      '3': 42,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvPackage',\n      '9': 0,\n      '10': 'pugvPackage'\n    },\n    {\n      '1': 'activity_star_rail',\n      '3': 43,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.ActivityStarRail',\n      '9': 0,\n      '10': 'activityStarRail'\n    },\n    {\n      '1': 'activity_iframe',\n      '3': 44,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.ActivityIFrame',\n      '9': 0,\n      '10': 'activityIframe'\n    },\n    {\n      '1': 'play_list',\n      '3': 45,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PlayList',\n      '9': 0,\n      '10': 'playList'\n    },\n    {\n      '1': 'merchandise',\n      '3': 46,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Merchandise',\n      '9': 0,\n      '10': 'merchandise'\n    },\n    {\n      '1': 'activity_guidance_bar',\n      '3': 47,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.ActivityGuidanceBar',\n      '9': 0,\n      '10': 'activityGuidanceBar'\n    },\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.common.ModuleType',\n      '10': 'type'\n    },\n  ],\n  '8': [\n    {'1': 'data'},\n  ],\n};\n\n/// Descriptor for `Module`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List moduleDescriptor = $convert.base64Decode(\n    'CgZNb2R1bGUSWwoQb2d2X2ludHJvZHVjdGlvbhgCIAEoCzIuLmJpbGliaWxpLmFwcC52aWV3dW'\n    '5pdGUuY29tbW9uLk9ndkludHJvZHVjdGlvbkgAUg9vZ3ZJbnRyb2R1Y3Rpb24SWwoQdWdjX2lu'\n    'dHJvZHVjdGlvbhgDIAEoCzIuLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLlVnY0ludH'\n    'JvZHVjdGlvbkgAUg91Z2NJbnRyb2R1Y3Rpb24SUgoNa2luZ19wb3NpdGlvbhgEIAEoCzIrLmJp'\n    'bGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLktpbmdQb3NpdGlvbkgAUgxraW5nUG9zaXRpb2'\n    '4SRgoJaGVhZF9saW5lGAUgASgLMicuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uSGVh'\n    'ZGxpbmVIAFIIaGVhZExpbmUSRgoJb2d2X3RpdGxlGAYgASgLMicuYmlsaWJpbGkuYXBwLnZpZX'\n    'd1bml0ZS5jb21tb24uT2d2VGl0bGVIAFIIb2d2VGl0bGUSPAoFaG9ub3IYByABKAsyJC5iaWxp'\n    'YmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5Ib25vckgAUgVob25vchI9CgRsaXN0GAggASgLMi'\n    'cuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uVXNlckxpc3RIAFIEbGlzdBI/CgZzdGFm'\n    'ZnMYCSABKAsyJS5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5TdGFmZnNIAFIGc3RhZm'\n    'ZzElsKEGFjdGl2aXR5X3Jlc2VydmUYCiABKAsyLi5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNv'\n    'bW1vbi5BY3Rpdml0eVJlc2VydmVIAFIPYWN0aXZpdHlSZXNlcnZlEkkKCmxpdmVfb3JkZXIYCy'\n    'ABKAsyKC5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5MaXZlT3JkZXJIAFIJbGl2ZU9y'\n    'ZGVyEk8KDHNlY3Rpb25fZGF0YRgMIAEoCzIqLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW'\n    '9uLlNlY3Rpb25EYXRhSABSC3NlY3Rpb25EYXRhElIKDWRlbGl2ZXJ5X2RhdGEYDSABKAsyKy5i'\n    'aWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5EZWxpdmVyeURhdGFIAFIMZGVsaXZlcnlEYX'\n    'RhEk8KDGZvbGxvd19sYXllchgOIAEoCzIqLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9u'\n    'LkZvbGxvd0xheWVySABSC2ZvbGxvd0xheWVyEkwKC29ndl9zZWFzb25zGA8gASgLMikuYmlsaW'\n    'JpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uT2d2U2Vhc29uc0gAUgpvZ3ZTZWFzb25zEkoKCnVn'\n    'Y19zZWFzb24YECABKAsyKS5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5VZ2NTZWFzb2'\n    '5zSABSCXVnY1NlYXNvbhJZChBvZ3ZfbGl2ZV9yZXNlcnZlGBEgASgLMi0uYmlsaWJpbGkuYXBw'\n    'LnZpZXd1bml0ZS5jb21tb24uT2d2TGl2ZVJlc2VydmVIAFIOb2d2TGl2ZVJlc2VydmUSVQoOY2'\n    '9tYmluYXRpb25fZXAYEiABKAsyLC5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5Db21i'\n    'aW5hdGlvbkVwSABSDWNvbWJpbmF0aW9uRXASQgoHc3BvbnNvchgTIAEoCzImLmJpbGliaWxpLm'\n    'FwcC52aWV3dW5pdGUuY29tbW9uLlNwb25zb3JIAFIHc3BvbnNvchJxChhhY3Rpdml0eV9lbnRy'\n    'YW5jZV9tb2R1bGUYFCABKAsyNS5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5BY3Rpdm'\n    'l0eUVudHJhbmNlTW9kdWxlSABSFmFjdGl2aXR5RW50cmFuY2VNb2R1bGUSUgoNc2VyaWFsX3Nl'\n    'YXNvbhgVIAEoCzIrLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLlNlcmlhbFNlYXNvbk'\n    'gAUgxzZXJpYWxTZWFzb24SQgoHcmVsYXRlcxgWIAEoCzImLmJpbGliaWxpLmFwcC52aWV3dW5p'\n    'dGUuY29tbW9uLlJlbGF0ZXNIAFIHcmVsYXRlcxI/CgZiYW5uZXIYFyABKAsyJS5iaWxpYmlsaS'\n    '5hcHAudmlld3VuaXRlLmNvbW1vbi5CYW5uZXJIAFIGYmFubmVyEjwKBWF1ZGlvGBggASgLMiQu'\n    'YmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uQXVkaW9IAFIFYXVkaW8STwoMbGlrZV9jb2'\n    '1tZW50GBkgASgLMiouYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uTGlrZUNvbW1lbnRI'\n    'AFILbGlrZUNvbW1lbnQSZAoTYXR0ZW50aW9uX3JlY29tbWVuZBgaIAEoCzIxLmJpbGliaWxpLm'\n    'FwcC52aWV3dW5pdGUuY29tbW9uLkF0dGVudGlvblJlY29tbWVuZEgAUhJhdHRlbnRpb25SZWNv'\n    'bW1lbmQSSwoKY292ZW5hbnRlchgbIAEoCzIpLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW'\n    '9uLkNvdmVuYW50ZXJIAFIKY292ZW5hbnRlchJMCgtzcGVjaWFsX3RhZxgcIAEoCzIpLmJpbGli'\n    'aWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLlNwZWNpYWxUYWdIAFIKc3BlY2lhbFRhZxJTCg51cF'\n    '9kYXRhX21vZHVsZRgdIAEoCzIrLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLlVwRGF0'\n    'YU1vZHVsZUgAUgx1cERhdGFNb2R1bGUSZAoTcHJvZmVzc2lvbl9hcHByb3ZhbBgeIAEoCzIxLm'\n    'JpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLlByb2Zlc3Npb25BcHByb3ZhbEgAUhJwcm9m'\n    'ZXNzaW9uQXBwcm92YWwSZQoUcHVndl9zaG9wcGluZ19ub3RpY2UYHyABKAsyMS5iaWxpYmlsaS'\n    '5hcHAudmlld3VuaXRlLmNvbW1vbi5QdWd2U2hvcHBpbmdOb3RpY2VIAFIScHVndlNob3BwaW5n'\n    'Tm90aWNlEkMKCHB1Z3ZfZmFxGCAgASgLMiYuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb2'\n    '4uUHVndkZhcUgAUgdwdWd2RmFxEm4KF3B1Z3Zfc2Vhc29uX2Rlc2NyaXB0aW9uGCEgASgLMjQu'\n    'YmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uUHVndlNlYXNvbkRlc2NyaXB0aW9uSABSFX'\n    'B1Z3ZTZWFzb25EZXNjcmlwdGlvbhJoChVwdWd2X3NlYXNvbl9yZWNvbW1lbmQYIiABKAsyMi5i'\n    'aWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5QdWd2U2Vhc29uUmVjb21tZW5kSABSE3B1Z3'\n    'ZTZWFzb25SZWNvbW1lbmQSaAoVcHVndl9zZWFzb25fcHVibGlzaGVyGCMgASgLMjIuYmlsaWJp'\n    'bGkuYXBwLnZpZXd1bml0ZS5jb21tb24uUHVndlNlYXNvblB1Ymxpc2hlckgAUhNwdWd2U2Vhc2'\n    '9uUHVibGlzaGVyEmgKFXB1Z3Zfc2Vhc29uX3NlbGVjdGlvbhgkIAEoCzIyLmJpbGliaWxpLmFw'\n    'cC52aWV3dW5pdGUuY29tbW9uLlB1Z3ZTZWFzb25TZWxlY3Rpb25IAFITcHVndlNlYXNvblNlbG'\n    'VjdGlvbhJvChhwdWd2X3NlYXNvbl9wcmltYXJ5X2luZm8YJSABKAsyNC5iaWxpYmlsaS5hcHAu'\n    'dmlld3VuaXRlLmNvbW1vbi5QdWd2U2Vhc29uUHJpbWFyeUluZm9IAFIVcHVndlNlYXNvblByaW'\n    '1hcnlJbmZvEn0KHHB1Z3ZfY29vcGVyYXRpb25fYXBwbGljYXRpb24YJiABKAsyOS5iaWxpYmls'\n    'aS5hcHAudmlld3VuaXRlLmNvbW1vbi5QdWd2Q29vcGVyYXRpb25BcHBsaWNhdGlvbkgAUhpwdW'\n    'd2Q29vcGVyYXRpb25BcHBsaWNhdGlvbhJQCg11cF92aWRlb190b29sGCcgASgLMiouYmlsaWJp'\n    'bGkuYXBwLnZpZXd1bml0ZS5jb21tb24uVXBWaWRlb1Rvb2xIAFILdXBWaWRlb1Rvb2wSRgoJcH'\n    'Vndl96b25lGCggASgLMicuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uUHVndlpvbmVI'\n    'AFIIcHVndlpvbmUSTAoLcHVndl9zZXJpZXMYKSABKAsyKS5iaWxpYmlsaS5hcHAudmlld3VuaX'\n    'RlLmNvbW1vbi5QdWd2U2VyaWVzSABSCnB1Z3ZTZXJpZXMSTwoMcHVndl9wYWNrYWdlGCogASgL'\n    'MiouYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uUHVndlBhY2thZ2VIAFILcHVndlBhY2'\n    'thZ2USXwoSYWN0aXZpdHlfc3Rhcl9yYWlsGCsgASgLMi8uYmlsaWJpbGkuYXBwLnZpZXd1bml0'\n    'ZS5jb21tb24uQWN0aXZpdHlTdGFyUmFpbEgAUhBhY3Rpdml0eVN0YXJSYWlsElgKD2FjdGl2aX'\n    'R5X2lmcmFtZRgsIAEoCzItLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLkFjdGl2aXR5'\n    'SUZyYW1lSABSDmFjdGl2aXR5SWZyYW1lEkYKCXBsYXlfbGlzdBgtIAEoCzInLmJpbGliaWxpLm'\n    'FwcC52aWV3dW5pdGUuY29tbW9uLlBsYXlMaXN0SABSCHBsYXlMaXN0Ek4KC21lcmNoYW5kaXNl'\n    'GC4gASgLMiouYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uTWVyY2hhbmRpc2VIAFILbW'\n    'VyY2hhbmRpc2USaAoVYWN0aXZpdHlfZ3VpZGFuY2VfYmFyGC8gASgLMjIuYmlsaWJpbGkuYXBw'\n    'LnZpZXd1bml0ZS5jb21tb24uQWN0aXZpdHlHdWlkYW5jZUJhckgAUhNhY3Rpdml0eUd1aWRhbm'\n    'NlQmFyEj0KBHR5cGUYASABKA4yKS5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5Nb2R1'\n    'bGVUeXBlUgR0eXBlQgYKBGRhdGE=');\n\n@$core.Deprecated('Use multiViewEpDescriptor instead')\nconst MultiViewEp$json = {\n  '1': 'MultiViewEp',\n  '2': [\n    {'1': 'ep_id', '3': 1, '4': 1, '5': 3, '10': 'epId'},\n  ],\n};\n\n/// Descriptor for `MultiViewEp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List multiViewEpDescriptor =\n    $convert.base64Decode('CgtNdWx0aVZpZXdFcBITCgVlcF9pZBgBIAEoA1IEZXBJZA==');\n\n@$core.Deprecated('Use neutralDescriptor instead')\nconst Neutral$json = {\n  '1': 'Neutral',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n  ],\n};\n\n/// Descriptor for `Neutral`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List neutralDescriptor = $convert.base64Decode(\n    'CgdOZXV0cmFsEhIKBGljb24YASABKAlSBGljb24SFAoFdGl0bGUYAiABKAlSBXRpdGxl');\n\n@$core.Deprecated('Use newEpDescriptor instead')\nconst NewEp$json = {\n  '1': 'NewEp',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 5, '10': 'id'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'desc', '3': 3, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'is_new', '3': 4, '4': 1, '5': 5, '10': 'isNew'},\n    {'1': 'more', '3': 5, '4': 1, '5': 9, '10': 'more'},\n    {'1': 'cover', '3': 6, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'index_show', '3': 7, '4': 1, '5': 9, '10': 'indexShow'},\n  ],\n};\n\n/// Descriptor for `NewEp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List newEpDescriptor = $convert.base64Decode(\n    'CgVOZXdFcBIOCgJpZBgBIAEoBVICaWQSFAoFdGl0bGUYAiABKAlSBXRpdGxlEhIKBGRlc2MYAy'\n    'ABKAlSBGRlc2MSFQoGaXNfbmV3GAQgASgFUgVpc05ldxISCgRtb3JlGAUgASgJUgRtb3JlEhQK'\n    'BWNvdmVyGAYgASgJUgVjb3ZlchIdCgppbmRleF9zaG93GAcgASgJUglpbmRleFNob3c=');\n\n@$core.Deprecated('Use officialVerifyDescriptor instead')\nconst OfficialVerify$json = {\n  '1': 'OfficialVerify',\n  '2': [\n    {'1': 'type', '3': 1, '4': 1, '5': 5, '10': 'type'},\n    {'1': 'desc', '3': 2, '4': 1, '5': 9, '10': 'desc'},\n  ],\n};\n\n/// Descriptor for `OfficialVerify`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List officialVerifyDescriptor = $convert.base64Decode(\n    'Cg5PZmZpY2lhbFZlcmlmeRISCgR0eXBlGAEgASgFUgR0eXBlEhIKBGRlc2MYAiABKAlSBGRlc2'\n    'M=');\n\n@$core.Deprecated('Use ogvIntroductionDescriptor instead')\nconst OgvIntroduction$json = {\n  '1': 'OgvIntroduction',\n  '2': [\n    {'1': 'followers', '3': 1, '4': 1, '5': 9, '10': 'followers'},\n    {'1': 'score', '3': 2, '4': 1, '5': 9, '10': 'score'},\n    {\n      '1': 'play_data',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.StatInfo',\n      '10': 'playData'\n    },\n    {'1': 'score_color', '3': 4, '4': 1, '5': 9, '10': 'scoreColor'},\n    {'1': 'score_night_color', '3': 5, '4': 1, '5': 9, '10': 'scoreNightColor'},\n    {'1': 'text_color', '3': 6, '4': 1, '5': 9, '10': 'textColor'},\n    {'1': 'text_night_color', '3': 7, '4': 1, '5': 9, '10': 'textNightColor'},\n  ],\n};\n\n/// Descriptor for `OgvIntroduction`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List ogvIntroductionDescriptor = $convert.base64Decode(\n    'Cg9PZ3ZJbnRyb2R1Y3Rpb24SHAoJZm9sbG93ZXJzGAEgASgJUglmb2xsb3dlcnMSFAoFc2Nvcm'\n    'UYAiABKAlSBXNjb3JlEkQKCXBsYXlfZGF0YRgDIAEoCzInLmJpbGliaWxpLmFwcC52aWV3dW5p'\n    'dGUuY29tbW9uLlN0YXRJbmZvUghwbGF5RGF0YRIfCgtzY29yZV9jb2xvchgEIAEoCVIKc2Nvcm'\n    'VDb2xvchIqChFzY29yZV9uaWdodF9jb2xvchgFIAEoCVIPc2NvcmVOaWdodENvbG9yEh0KCnRl'\n    'eHRfY29sb3IYBiABKAlSCXRleHRDb2xvchIoChB0ZXh0X25pZ2h0X2NvbG9yGAcgASgJUg50ZX'\n    'h0TmlnaHRDb2xvcg==');\n\n@$core.Deprecated('Use ogvLiveReserveDescriptor instead')\nconst OgvLiveReserve$json = {\n  '1': 'OgvLiveReserve',\n  '2': [\n    {'1': 'reserve_id', '3': 1, '4': 1, '5': 3, '10': 'reserveId'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'icon', '3': 3, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'night_icon', '3': 4, '4': 1, '5': 9, '10': 'nightIcon'},\n    {'1': 'click_button', '3': 5, '4': 1, '5': 9, '10': 'clickButton'},\n    {'1': 'link', '3': 6, '4': 1, '5': 9, '10': 'link'},\n    {\n      '1': 'follow_video_is_reserve_live',\n      '3': 7,\n      '4': 1,\n      '5': 5,\n      '10': 'followVideoIsReserveLive'\n    },\n    {'1': 'bg_color', '3': 8, '4': 1, '5': 9, '10': 'bgColor'},\n    {'1': 'night_bg_color', '3': 9, '4': 1, '5': 9, '10': 'nightBgColor'},\n    {'1': 'text_color', '3': 10, '4': 1, '5': 9, '10': 'textColor'},\n    {'1': 'night_text_color', '3': 11, '4': 1, '5': 9, '10': 'nightTextColor'},\n    {'1': 'bt_bg_color', '3': 12, '4': 1, '5': 9, '10': 'btBgColor'},\n    {'1': 'bt_frame_color', '3': 13, '4': 1, '5': 9, '10': 'btFrameColor'},\n    {'1': 'night_bt_bg_color', '3': 14, '4': 1, '5': 9, '10': 'nightBtBgColor'},\n    {\n      '1': 'night_bt_frame_color',\n      '3': 15,\n      '4': 1,\n      '5': 9,\n      '10': 'nightBtFrameColor'\n    },\n    {'1': 'active_type', '3': 16, '4': 1, '5': 5, '10': 'activeType'},\n    {'1': 'reserve_status', '3': 17, '4': 1, '5': 5, '10': 'reserveStatus'},\n    {'1': 'bt_text_color', '3': 18, '4': 1, '5': 9, '10': 'btTextColor'},\n    {\n      '1': 'night_bt_text_color',\n      '3': 19,\n      '4': 1,\n      '5': 9,\n      '10': 'nightBtTextColor'\n    },\n    {\n      '1': 'report',\n      '3': 20,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.OgvLiveReserve.ReportEntry',\n      '10': 'report'\n    },\n    {'1': 'live_status', '3': 21, '4': 1, '5': 5, '10': 'liveStatus'},\n  ],\n  '3': [OgvLiveReserve_ReportEntry$json],\n};\n\n@$core.Deprecated('Use ogvLiveReserveDescriptor instead')\nconst OgvLiveReserve_ReportEntry$json = {\n  '1': 'ReportEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `OgvLiveReserve`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List ogvLiveReserveDescriptor = $convert.base64Decode(\n    'Cg5PZ3ZMaXZlUmVzZXJ2ZRIdCgpyZXNlcnZlX2lkGAEgASgDUglyZXNlcnZlSWQSFAoFdGl0bG'\n    'UYAiABKAlSBXRpdGxlEhIKBGljb24YAyABKAlSBGljb24SHQoKbmlnaHRfaWNvbhgEIAEoCVIJ'\n    'bmlnaHRJY29uEiEKDGNsaWNrX2J1dHRvbhgFIAEoCVILY2xpY2tCdXR0b24SEgoEbGluaxgGIA'\n    'EoCVIEbGluaxI+Chxmb2xsb3dfdmlkZW9faXNfcmVzZXJ2ZV9saXZlGAcgASgFUhhmb2xsb3dW'\n    'aWRlb0lzUmVzZXJ2ZUxpdmUSGQoIYmdfY29sb3IYCCABKAlSB2JnQ29sb3ISJAoObmlnaHRfYm'\n    'dfY29sb3IYCSABKAlSDG5pZ2h0QmdDb2xvchIdCgp0ZXh0X2NvbG9yGAogASgJUgl0ZXh0Q29s'\n    'b3ISKAoQbmlnaHRfdGV4dF9jb2xvchgLIAEoCVIObmlnaHRUZXh0Q29sb3ISHgoLYnRfYmdfY2'\n    '9sb3IYDCABKAlSCWJ0QmdDb2xvchIkCg5idF9mcmFtZV9jb2xvchgNIAEoCVIMYnRGcmFtZUNv'\n    'bG9yEikKEW5pZ2h0X2J0X2JnX2NvbG9yGA4gASgJUg5uaWdodEJ0QmdDb2xvchIvChRuaWdodF'\n    '9idF9mcmFtZV9jb2xvchgPIAEoCVIRbmlnaHRCdEZyYW1lQ29sb3ISHwoLYWN0aXZlX3R5cGUY'\n    'ECABKAVSCmFjdGl2ZVR5cGUSJQoOcmVzZXJ2ZV9zdGF0dXMYESABKAVSDXJlc2VydmVTdGF0dX'\n    'MSIgoNYnRfdGV4dF9jb2xvchgSIAEoCVILYnRUZXh0Q29sb3ISLQoTbmlnaHRfYnRfdGV4dF9j'\n    'b2xvchgTIAEoCVIQbmlnaHRCdFRleHRDb2xvchJRCgZyZXBvcnQYFCADKAsyOS5iaWxpYmlsaS'\n    '5hcHAudmlld3VuaXRlLmNvbW1vbi5PZ3ZMaXZlUmVzZXJ2ZS5SZXBvcnRFbnRyeVIGcmVwb3J0'\n    'Eh8KC2xpdmVfc3RhdHVzGBUgASgFUgpsaXZlU3RhdHVzGjkKC1JlcG9ydEVudHJ5EhAKA2tleR'\n    'gBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAE=');\n\n@$core.Deprecated('Use ogvSeasonsDescriptor instead')\nconst OgvSeasons$json = {\n  '1': 'OgvSeasons',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'serial_season',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.SerialSeason',\n      '10': 'serialSeason'\n    },\n    {\n      '1': 'style',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.common.SerialSeasonCoverStyle',\n      '10': 'style'\n    },\n  ],\n};\n\n/// Descriptor for `OgvSeasons`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List ogvSeasonsDescriptor = $convert.base64Decode(\n    'CgpPZ3ZTZWFzb25zEhQKBXRpdGxlGAEgASgJUgV0aXRsZRJQCg1zZXJpYWxfc2Vhc29uGAIgAy'\n    'gLMisuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uU2VyaWFsU2Vhc29uUgxzZXJpYWxT'\n    'ZWFzb24SSwoFc3R5bGUYAyABKA4yNS5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5TZX'\n    'JpYWxTZWFzb25Db3ZlclN0eWxlUgVzdHlsZQ==');\n\n@$core.Deprecated('Use ogvTitleDescriptor instead')\nconst OgvTitle$json = {\n  '1': 'OgvTitle',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'badge_info',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.BadgeInfo',\n      '10': 'badgeInfo'\n    },\n    {\n      '1': 'is_show_btn_animation',\n      '3': 3,\n      '4': 1,\n      '5': 5,\n      '10': 'isShowBtnAnimation'\n    },\n    {\n      '1': 'follow_video_is_reserve_live',\n      '3': 4,\n      '4': 1,\n      '5': 5,\n      '10': 'followVideoIsReserveLive'\n    },\n    {'1': 'reserve_id', '3': 5, '4': 1, '5': 3, '10': 'reserveId'},\n    {\n      '1': 'title_delivery_button',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.TitleDeliveryButton',\n      '10': 'titleDeliveryButton'\n    },\n    {\n      '1': 'channel_redirect_entry_button',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.TitleDeliveryButton',\n      '10': 'channelRedirectEntryButton'\n    },\n    {'1': 'title_img', '3': 8, '4': 1, '5': 9, '10': 'titleImg'},\n    {'1': 'title_img_night', '3': 9, '4': 1, '5': 9, '10': 'titleImgNight'},\n    {\n      '1': 'webp_dynamic_pic_title_cycle_num',\n      '3': 10,\n      '4': 1,\n      '5': 5,\n      '10': 'webpDynamicPicTitleCycleNum'\n    },\n  ],\n};\n\n/// Descriptor for `OgvTitle`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List ogvTitleDescriptor = $convert.base64Decode(\n    'CghPZ3ZUaXRsZRIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSRwoKYmFkZ2VfaW5mbxgCIAEoCzIoLm'\n    'JpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLkJhZGdlSW5mb1IJYmFkZ2VJbmZvEjEKFWlz'\n    'X3Nob3dfYnRuX2FuaW1hdGlvbhgDIAEoBVISaXNTaG93QnRuQW5pbWF0aW9uEj4KHGZvbGxvd1'\n    '92aWRlb19pc19yZXNlcnZlX2xpdmUYBCABKAVSGGZvbGxvd1ZpZGVvSXNSZXNlcnZlTGl2ZRId'\n    'CgpyZXNlcnZlX2lkGAUgASgDUglyZXNlcnZlSWQSZgoVdGl0bGVfZGVsaXZlcnlfYnV0dG9uGA'\n    'YgASgLMjIuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uVGl0bGVEZWxpdmVyeUJ1dHRv'\n    'blITdGl0bGVEZWxpdmVyeUJ1dHRvbhJ1Ch1jaGFubmVsX3JlZGlyZWN0X2VudHJ5X2J1dHRvbh'\n    'gHIAEoCzIyLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLlRpdGxlRGVsaXZlcnlCdXR0'\n    'b25SGmNoYW5uZWxSZWRpcmVjdEVudHJ5QnV0dG9uEhsKCXRpdGxlX2ltZxgIIAEoCVIIdGl0bG'\n    'VJbWcSJgoPdGl0bGVfaW1nX25pZ2h0GAkgASgJUg10aXRsZUltZ05pZ2h0EkUKIHdlYnBfZHlu'\n    'YW1pY19waWNfdGl0bGVfY3ljbGVfbnVtGAogASgFUht3ZWJwRHluYW1pY1BpY1RpdGxlQ3ljbG'\n    'VOdW0=');\n\n@$core.Deprecated('Use operateActionDescriptor instead')\nconst OperateAction$json = {\n  '1': 'OperateAction',\n  '2': [\n    {'1': 'action', '3': 1, '4': 1, '5': 9, '10': 'action'},\n    {'1': 'link', '3': 2, '4': 1, '5': 9, '10': 'link'},\n  ],\n};\n\n/// Descriptor for `OperateAction`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List operateActionDescriptor = $convert.base64Decode(\n    'Cg1PcGVyYXRlQWN0aW9uEhYKBmFjdGlvbhgBIAEoCVIGYWN0aW9uEhIKBGxpbmsYAiABKAlSBG'\n    'xpbms=');\n\n@$core.Deprecated('Use ownerDescriptor instead')\nconst Owner$json = {\n  '1': 'Owner',\n  '2': [\n    {\n      '1': 'avatar',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.AvatarItem',\n      '10': 'avatar'\n    },\n    {'1': 'url', '3': 2, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'title', '3': 3, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'fans', '3': 4, '4': 1, '5': 9, '10': 'fans'},\n    {'1': 'arc_count', '3': 5, '4': 1, '5': 9, '10': 'arcCount'},\n    {\n      '1': 'attention',\n      '3': 6,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.common.AttentionRelationStatus',\n      '10': 'attention'\n    },\n    {\n      '1': 'attention_relation',\n      '3': 7,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.common.AttentionRelationStatus',\n      '10': 'attentionRelation'\n    },\n    {'1': 'pub_location', '3': 8, '4': 1, '5': 9, '10': 'pubLocation'},\n    {\n      '1': 'vip',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Vip',\n      '10': 'vip'\n    },\n    {'1': 'title_url', '3': 10, '4': 1, '5': 9, '10': 'titleUrl'},\n    {'1': 'face', '3': 11, '4': 1, '5': 9, '10': 'face'},\n    {'1': 'mid', '3': 12, '4': 1, '5': 3, '10': 'mid'},\n    {\n      '1': 'official_verify',\n      '3': 13,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.OfficialVerify',\n      '10': 'officialVerify'\n    },\n    {\n      '1': 'live',\n      '3': 14,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Live',\n      '10': 'live'\n    },\n    {'1': 'fans_num', '3': 15, '4': 1, '5': 3, '10': 'fansNum'},\n    {'1': 'assists', '3': 16, '4': 3, '5': 3, '10': 'assists'},\n    {'1': 'season_count', '3': 17, '4': 1, '5': 9, '10': 'seasonCount'},\n    {\n      '1': 'name_render',\n      '3': 18,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.account.service.v1.NameRender',\n      '10': 'nameRender'\n    },\n  ],\n};\n\n/// Descriptor for `Owner`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List ownerDescriptor = $convert.base64Decode(\n    'CgVPd25lchJFCgZhdmF0YXIYASABKAsyLS5iaWxpYmlsaS5kYWd3LmNvbXBvbmVudC5hdmF0YX'\n    'IudjEuQXZhdGFySXRlbVIGYXZhdGFyEhAKA3VybBgCIAEoCVIDdXJsEhQKBXRpdGxlGAMgASgJ'\n    'UgV0aXRsZRISCgRmYW5zGAQgASgJUgRmYW5zEhsKCWFyY19jb3VudBgFIAEoCVIIYXJjQ291bn'\n    'QSVAoJYXR0ZW50aW9uGAYgASgOMjYuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uQXR0'\n    'ZW50aW9uUmVsYXRpb25TdGF0dXNSCWF0dGVudGlvbhJlChJhdHRlbnRpb25fcmVsYXRpb24YBy'\n    'ABKA4yNi5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5BdHRlbnRpb25SZWxhdGlvblN0'\n    'YXR1c1IRYXR0ZW50aW9uUmVsYXRpb24SIQoMcHViX2xvY2F0aW9uGAggASgJUgtwdWJMb2NhdG'\n    'lvbhI0CgN2aXAYCSABKAsyIi5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5WaXBSA3Zp'\n    'cBIbCgl0aXRsZV91cmwYCiABKAlSCHRpdGxlVXJsEhIKBGZhY2UYCyABKAlSBGZhY2USEAoDbW'\n    'lkGAwgASgDUgNtaWQSVgoPb2ZmaWNpYWxfdmVyaWZ5GA0gASgLMi0uYmlsaWJpbGkuYXBwLnZp'\n    'ZXd1bml0ZS5jb21tb24uT2ZmaWNpYWxWZXJpZnlSDm9mZmljaWFsVmVyaWZ5EjcKBGxpdmUYDi'\n    'ABKAsyIy5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5MaXZlUgRsaXZlEhkKCGZhbnNf'\n    'bnVtGA8gASgDUgdmYW5zTnVtEhgKB2Fzc2lzdHMYECADKANSB2Fzc2lzdHMSIQoMc2Vhc29uX2'\n    'NvdW50GBEgASgJUgtzZWFzb25Db3VudBJICgtuYW1lX3JlbmRlchgSIAEoCzInLmJpbGliaWxp'\n    'LmFjY291bnQuc2VydmljZS52MS5OYW1lUmVuZGVyUgpuYW1lUmVuZGVy');\n\n@$core.Deprecated('Use pageDescriptor instead')\nconst Page$json = {\n  '1': 'Page',\n  '2': [\n    {'1': 'cid', '3': 1, '4': 1, '5': 3, '10': 'cid'},\n    {'1': 'part', '3': 2, '4': 1, '5': 9, '10': 'part'},\n    {'1': 'duration', '3': 3, '4': 1, '5': 3, '10': 'duration'},\n    {'1': 'desc', '3': 4, '4': 1, '5': 9, '10': 'desc'},\n    {\n      '1': 'dimension',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Dimension',\n      '10': 'dimension'\n    },\n    {'1': 'dl_title', '3': 6, '4': 1, '5': 9, '10': 'dlTitle'},\n    {'1': 'dl_subtitle', '3': 7, '4': 1, '5': 9, '10': 'dlSubtitle'},\n  ],\n};\n\n/// Descriptor for `Page`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pageDescriptor = $convert.base64Decode(\n    'CgRQYWdlEhAKA2NpZBgBIAEoA1IDY2lkEhIKBHBhcnQYAiABKAlSBHBhcnQSGgoIZHVyYXRpb2'\n    '4YAyABKANSCGR1cmF0aW9uEhIKBGRlc2MYBCABKAlSBGRlc2MSRgoJZGltZW5zaW9uGAUgASgL'\n    'MiguYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uRGltZW5zaW9uUglkaW1lbnNpb24SGQ'\n    'oIZGxfdGl0bGUYBiABKAlSB2RsVGl0bGUSHwoLZGxfc3VidGl0bGUYByABKAlSCmRsU3VidGl0'\n    'bGU=');\n\n@$core.Deprecated('Use pendantDescriptor instead')\nconst Pendant$json = {\n  '1': 'Pendant',\n  '2': [\n    {'1': 'pid', '3': 1, '4': 1, '5': 5, '10': 'pid'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'image', '3': 3, '4': 1, '5': 9, '10': 'image'},\n  ],\n};\n\n/// Descriptor for `Pendant`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pendantDescriptor = $convert.base64Decode(\n    'CgdQZW5kYW50EhAKA3BpZBgBIAEoBVIDcGlkEhIKBG5hbWUYAiABKAlSBG5hbWUSFAoFaW1hZ2'\n    'UYAyABKAlSBWltYWdl');\n\n@$core.Deprecated('Use playListDescriptor instead')\nconst PlayList$json = {\n  '1': 'PlayList',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 5, '10': 'id'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'upper',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Owner',\n      '10': 'upper'\n    },\n    {'1': 'desc', '3': 4, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'more_title', '3': 5, '4': 1, '5': 9, '10': 'moreTitle'},\n    {\n      '1': 'seasons',\n      '3': 6,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PlayListSeason',\n      '10': 'seasons'\n    },\n    {'1': 'more_playlist', '3': 7, '4': 1, '5': 8, '10': 'morePlaylist'},\n    {\n      '1': 'report',\n      '3': 8,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PlayList.ReportEntry',\n      '10': 'report'\n    },\n    {'1': 'more_playlist_url', '3': 9, '4': 1, '5': 9, '10': 'morePlaylistUrl'},\n  ],\n  '3': [PlayList_ReportEntry$json],\n};\n\n@$core.Deprecated('Use playListDescriptor instead')\nconst PlayList_ReportEntry$json = {\n  '1': 'ReportEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `PlayList`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playListDescriptor = $convert.base64Decode(\n    'CghQbGF5TGlzdBIOCgJpZBgBIAEoBVICaWQSFAoFdGl0bGUYAiABKAlSBXRpdGxlEjoKBXVwcG'\n    'VyGAMgASgLMiQuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uT3duZXJSBXVwcGVyEhIK'\n    'BGRlc2MYBCABKAlSBGRlc2MSHQoKbW9yZV90aXRsZRgFIAEoCVIJbW9yZVRpdGxlEkcKB3NlYX'\n    'NvbnMYBiADKAsyLS5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5QbGF5TGlzdFNlYXNv'\n    'blIHc2Vhc29ucxIjCg1tb3JlX3BsYXlsaXN0GAcgASgIUgxtb3JlUGxheWxpc3QSSwoGcmVwb3'\n    'J0GAggAygLMjMuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uUGxheUxpc3QuUmVwb3J0'\n    'RW50cnlSBnJlcG9ydBIqChFtb3JlX3BsYXlsaXN0X3VybBgJIAEoCVIPbW9yZVBsYXlsaXN0VX'\n    'JsGjkKC1JlcG9ydEVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1'\n    'ZToCOAE=');\n\n@$core.Deprecated('Use playListSeasonDescriptor instead')\nconst PlayListSeason$json = {\n  '1': 'PlayListSeason',\n  '2': [\n    {'1': 'season_id', '3': 1, '4': 1, '5': 5, '10': 'seasonId'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'subtitle', '3': 3, '4': 1, '5': 9, '10': 'subtitle'},\n    {'1': 'cover', '3': 4, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'link', '3': 5, '4': 1, '5': 9, '10': 'link'},\n    {'1': 'score', '3': 6, '4': 1, '5': 9, '10': 'score'},\n    {\n      '1': 'report',\n      '3': 7,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PlayListSeason.ReportEntry',\n      '10': 'report'\n    },\n  ],\n  '3': [PlayListSeason_ReportEntry$json],\n};\n\n@$core.Deprecated('Use playListSeasonDescriptor instead')\nconst PlayListSeason_ReportEntry$json = {\n  '1': 'ReportEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `PlayListSeason`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playListSeasonDescriptor = $convert.base64Decode(\n    'Cg5QbGF5TGlzdFNlYXNvbhIbCglzZWFzb25faWQYASABKAVSCHNlYXNvbklkEhQKBXRpdGxlGA'\n    'IgASgJUgV0aXRsZRIaCghzdWJ0aXRsZRgDIAEoCVIIc3VidGl0bGUSFAoFY292ZXIYBCABKAlS'\n    'BWNvdmVyEhIKBGxpbmsYBSABKAlSBGxpbmsSFAoFc2NvcmUYBiABKAlSBXNjb3JlElEKBnJlcG'\n    '9ydBgHIAMoCzI5LmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLlBsYXlMaXN0U2Vhc29u'\n    'LlJlcG9ydEVudHJ5UgZyZXBvcnQaOQoLUmVwb3J0RW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFA'\n    'oFdmFsdWUYAiABKAlSBXZhbHVlOgI4AQ==');\n\n@$core.Deprecated('Use playerAnimationDescriptor instead')\nconst PlayerAnimation$json = {\n  '1': 'PlayerAnimation',\n  '2': [\n    {'1': 'player_icon', '3': 1, '4': 1, '5': 9, '10': 'playerIcon'},\n    {\n      '1': 'player_triple_icon',\n      '3': 2,\n      '4': 1,\n      '5': 9,\n      '10': 'playerTripleIcon'\n    },\n  ],\n};\n\n/// Descriptor for `PlayerAnimation`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playerAnimationDescriptor = $convert.base64Decode(\n    'Cg9QbGF5ZXJBbmltYXRpb24SHwoLcGxheWVyX2ljb24YASABKAlSCnBsYXllckljb24SLAoScG'\n    'xheWVyX3RyaXBsZV9pY29uGAIgASgJUhBwbGF5ZXJUcmlwbGVJY29u');\n\n@$core.Deprecated('Use pointActivityDescriptor instead')\nconst PointActivity$json = {\n  '1': 'PointActivity',\n  '2': [\n    {'1': 'tip', '3': 1, '4': 1, '5': 9, '10': 'tip'},\n    {'1': 'content', '3': 2, '4': 1, '5': 9, '10': 'content'},\n    {'1': 'link', '3': 3, '4': 1, '5': 9, '10': 'link'},\n  ],\n};\n\n/// Descriptor for `PointActivity`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pointActivityDescriptor = $convert.base64Decode(\n    'Cg1Qb2ludEFjdGl2aXR5EhAKA3RpcBgBIAEoCVIDdGlwEhgKB2NvbnRlbnQYAiABKAlSB2Nvbn'\n    'RlbnQSEgoEbGluaxgDIAEoCVIEbGluaw==');\n\n@$core.Deprecated('Use powerIconStyleDescriptor instead')\nconst PowerIconStyle$json = {\n  '1': 'PowerIconStyle',\n  '2': [\n    {'1': 'icon_url', '3': 1, '4': 1, '5': 9, '10': 'iconUrl'},\n    {'1': 'icon_night_url', '3': 2, '4': 1, '5': 9, '10': 'iconNightUrl'},\n    {'1': 'icon_width', '3': 3, '4': 1, '5': 3, '10': 'iconWidth'},\n    {'1': 'icon_height', '3': 4, '4': 1, '5': 3, '10': 'iconHeight'},\n  ],\n};\n\n/// Descriptor for `PowerIconStyle`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List powerIconStyleDescriptor = $convert.base64Decode(\n    'Cg5Qb3dlckljb25TdHlsZRIZCghpY29uX3VybBgBIAEoCVIHaWNvblVybBIkCg5pY29uX25pZ2'\n    'h0X3VybBgCIAEoCVIMaWNvbk5pZ2h0VXJsEh0KCmljb25fd2lkdGgYAyABKANSCWljb25XaWR0'\n    'aBIfCgtpY29uX2hlaWdodBgEIAEoA1IKaWNvbkhlaWdodA==');\n\n@$core.Deprecated('Use professionApprovalDescriptor instead')\nconst ProfessionApproval$json = {\n  '1': 'ProfessionApproval',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'subtitle', '3': 2, '4': 1, '5': 9, '10': 'subtitle'},\n    {'1': 'type', '3': 3, '4': 1, '5': 5, '10': 'type'},\n  ],\n};\n\n/// Descriptor for `ProfessionApproval`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List professionApprovalDescriptor = $convert.base64Decode(\n    'ChJQcm9mZXNzaW9uQXBwcm92YWwSFAoFdGl0bGUYASABKAlSBXRpdGxlEhoKCHN1YnRpdGxlGA'\n    'IgASgJUghzdWJ0aXRsZRISCgR0eXBlGAMgASgFUgR0eXBl');\n\n@$core.Deprecated('Use professionHonorExtendDescriptor instead')\nconst ProfessionHonorExtend$json = {\n  '1': 'ProfessionHonorExtend',\n  '2': [\n    {'1': 'count', '3': 1, '4': 1, '5': 3, '10': 'count'},\n    {'1': 'self_grant', '3': 2, '4': 1, '5': 8, '10': 'selfGrant'},\n    {\n      '1': 'popup',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.ProfessionPopup',\n      '10': 'popup'\n    },\n  ],\n};\n\n/// Descriptor for `ProfessionHonorExtend`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List professionHonorExtendDescriptor = $convert.base64Decode(\n    'ChVQcm9mZXNzaW9uSG9ub3JFeHRlbmQSFAoFY291bnQYASABKANSBWNvdW50Eh0KCnNlbGZfZ3'\n    'JhbnQYAiABKAhSCXNlbGZHcmFudBJECgVwb3B1cBgDIAEoCzIuLmJpbGliaWxpLmFwcC52aWV3'\n    'dW5pdGUuY29tbW9uLlByb2Zlc3Npb25Qb3B1cFIFcG9wdXA=');\n\n@$core.Deprecated('Use professionPopupDescriptor instead')\nconst ProfessionPopup$json = {\n  '1': 'ProfessionPopup',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'subtitle', '3': 2, '4': 1, '5': 9, '10': 'subtitle'},\n  ],\n};\n\n/// Descriptor for `ProfessionPopup`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List professionPopupDescriptor = $convert.base64Decode(\n    'Cg9Qcm9mZXNzaW9uUG9wdXASFAoFdGl0bGUYASABKAlSBXRpdGxlEhoKCHN1YnRpdGxlGAIgAS'\n    'gJUghzdWJ0aXRsZQ==');\n\n@$core.Deprecated('Use pugvCooperationApplicationDescriptor instead')\nconst PugvCooperationApplication$json = {\n  '1': 'PugvCooperationApplication',\n  '2': [\n    {'1': 'link', '3': 1, '4': 1, '5': 9, '10': 'link'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'subtitle', '3': 3, '4': 1, '5': 9, '10': 'subtitle'},\n    {'1': 'button_text', '3': 4, '4': 1, '5': 9, '10': 'buttonText'},\n    {'1': 'icon', '3': 5, '4': 1, '5': 9, '10': 'icon'},\n  ],\n};\n\n/// Descriptor for `PugvCooperationApplication`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvCooperationApplicationDescriptor =\n    $convert.base64Decode(\n        'ChpQdWd2Q29vcGVyYXRpb25BcHBsaWNhdGlvbhISCgRsaW5rGAEgASgJUgRsaW5rEhQKBXRpdG'\n        'xlGAIgASgJUgV0aXRsZRIaCghzdWJ0aXRsZRgDIAEoCVIIc3VidGl0bGUSHwoLYnV0dG9uX3Rl'\n        'eHQYBCABKAlSCmJ1dHRvblRleHQSEgoEaWNvbhgFIAEoCVIEaWNvbg==');\n\n@$core.Deprecated('Use pugvFaqDescriptor instead')\nconst PugvFaq$json = {\n  '1': 'PugvFaq',\n  '2': [\n    {\n      '1': 'nav',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvSeasonNav',\n      '10': 'nav'\n    },\n    {\n      '1': 'contents',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvFaqContent',\n      '10': 'contents'\n    },\n  ],\n};\n\n/// Descriptor for `PugvFaq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvFaqDescriptor = $convert.base64Decode(\n    'CgdQdWd2RmFxEj4KA25hdhgBIAEoCzIsLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLl'\n    'B1Z3ZTZWFzb25OYXZSA25hdhJJCghjb250ZW50cxgCIAMoCzItLmJpbGliaWxpLmFwcC52aWV3'\n    'dW5pdGUuY29tbW9uLlB1Z3ZGYXFDb250ZW50Ughjb250ZW50cw==');\n\n@$core.Deprecated('Use pugvFaqContentDescriptor instead')\nconst PugvFaqContent$json = {\n  '1': 'PugvFaqContent',\n  '2': [\n    {'1': 'question', '3': 1, '4': 1, '5': 9, '10': 'question'},\n    {'1': 'answer', '3': 2, '4': 1, '5': 9, '10': 'answer'},\n    {'1': 'link', '3': 3, '4': 1, '5': 9, '10': 'link'},\n  ],\n};\n\n/// Descriptor for `PugvFaqContent`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvFaqContentDescriptor = $convert.base64Decode(\n    'Cg5QdWd2RmFxQ29udGVudBIaCghxdWVzdGlvbhgBIAEoCVIIcXVlc3Rpb24SFgoGYW5zd2VyGA'\n    'IgASgJUgZhbnN3ZXISEgoEbGluaxgDIAEoCVIEbGluaw==');\n\n@$core.Deprecated('Use pugvPackageDescriptor instead')\nconst PugvPackage$json = {\n  '1': 'PugvPackage',\n  '2': [\n    {\n      '1': 'nav',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvSeasonNav',\n      '10': 'nav'\n    },\n    {\n      '1': 'contents',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvPackageItem',\n      '10': 'contents'\n    },\n  ],\n};\n\n/// Descriptor for `PugvPackage`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvPackageDescriptor = $convert.base64Decode(\n    'CgtQdWd2UGFja2FnZRI+CgNuYXYYASABKAsyLC5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW'\n    '1vbi5QdWd2U2Vhc29uTmF2UgNuYXYSSgoIY29udGVudHMYAiADKAsyLi5iaWxpYmlsaS5hcHAu'\n    'dmlld3VuaXRlLmNvbW1vbi5QdWd2UGFja2FnZUl0ZW1SCGNvbnRlbnRz');\n\n@$core.Deprecated('Use pugvPackageItemDescriptor instead')\nconst PugvPackageItem$json = {\n  '1': 'PugvPackageItem',\n  '2': [\n    {'1': 'product_id', '3': 1, '4': 1, '5': 3, '10': 'productId'},\n    {'1': 'cover', '3': 2, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'title', '3': 3, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'discount_price_desc',\n      '3': 4,\n      '4': 1,\n      '5': 9,\n      '10': 'discountPriceDesc'\n    },\n    {\n      '1': 'original_price_desc',\n      '3': 5,\n      '4': 1,\n      '5': 9,\n      '10': 'originalPriceDesc'\n    },\n    {'1': 'desc', '3': 6, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'link', '3': 7, '4': 1, '5': 9, '10': 'link'},\n    {'1': 'season_count', '3': 8, '4': 1, '5': 3, '10': 'seasonCount'},\n    {\n      '1': 'sale_info',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvPackageSaleInfo',\n      '10': 'saleInfo'\n    },\n  ],\n};\n\n/// Descriptor for `PugvPackageItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvPackageItemDescriptor = $convert.base64Decode(\n    'Cg9QdWd2UGFja2FnZUl0ZW0SHQoKcHJvZHVjdF9pZBgBIAEoA1IJcHJvZHVjdElkEhQKBWNvdm'\n    'VyGAIgASgJUgVjb3ZlchIUCgV0aXRsZRgDIAEoCVIFdGl0bGUSLgoTZGlzY291bnRfcHJpY2Vf'\n    'ZGVzYxgEIAEoCVIRZGlzY291bnRQcmljZURlc2MSLgoTb3JpZ2luYWxfcHJpY2VfZGVzYxgFIA'\n    'EoCVIRb3JpZ2luYWxQcmljZURlc2MSEgoEZGVzYxgGIAEoCVIEZGVzYxISCgRsaW5rGAcgASgJ'\n    'UgRsaW5rEiEKDHNlYXNvbl9jb3VudBgIIAEoA1ILc2Vhc29uQ291bnQSTwoJc2FsZV9pbmZvGA'\n    'kgASgLMjIuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uUHVndlBhY2thZ2VTYWxlSW5m'\n    'b1IIc2FsZUluZm8=');\n\n@$core.Deprecated('Use pugvPackageSaleInfoDescriptor instead')\nconst PugvPackageSaleInfo$json = {\n  '1': 'PugvPackageSaleInfo',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'icon_dark', '3': 2, '4': 1, '5': 9, '10': 'iconDark'},\n  ],\n};\n\n/// Descriptor for `PugvPackageSaleInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvPackageSaleInfoDescriptor = $convert.base64Decode(\n    'ChNQdWd2UGFja2FnZVNhbGVJbmZvEhIKBGljb24YASABKAlSBGljb24SGwoJaWNvbl9kYXJrGA'\n    'IgASgJUghpY29uRGFyaw==');\n\n@$core.Deprecated('Use pugvSeasonCooperatorDescriptor instead')\nconst PugvSeasonCooperator$json = {\n  '1': 'PugvSeasonCooperator',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'avatar', '3': 2, '4': 1, '5': 9, '10': 'avatar'},\n    {'1': 'nickname', '3': 3, '4': 1, '5': 9, '10': 'nickname'},\n    {'1': 'is_owner', '3': 4, '4': 1, '5': 8, '10': 'isOwner'},\n    {'1': 'role', '3': 5, '4': 1, '5': 9, '10': 'role'},\n    {'1': 'user_link', '3': 6, '4': 1, '5': 9, '10': 'userLink'},\n    {'1': 'followed', '3': 7, '4': 1, '5': 8, '10': 'followed'},\n  ],\n};\n\n/// Descriptor for `PugvSeasonCooperator`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvSeasonCooperatorDescriptor = $convert.base64Decode(\n    'ChRQdWd2U2Vhc29uQ29vcGVyYXRvchIQCgNtaWQYASABKANSA21pZBIWCgZhdmF0YXIYAiABKA'\n    'lSBmF2YXRhchIaCghuaWNrbmFtZRgDIAEoCVIIbmlja25hbWUSGQoIaXNfb3duZXIYBCABKAhS'\n    'B2lzT3duZXISEgoEcm9sZRgFIAEoCVIEcm9sZRIbCgl1c2VyX2xpbmsYBiABKAlSCHVzZXJMaW'\n    '5rEhoKCGZvbGxvd2VkGAcgASgIUghmb2xsb3dlZA==');\n\n@$core.Deprecated('Use pugvSeasonDescriptionDescriptor instead')\nconst PugvSeasonDescription$json = {\n  '1': 'PugvSeasonDescription',\n  '2': [\n    {\n      '1': 'text',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvSeasonDescriptionText',\n      '9': 0,\n      '10': 'text'\n    },\n    {\n      '1': 'image',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvSeasonDescriptionImage',\n      '9': 0,\n      '10': 'image'\n    },\n    {\n      '1': 'nav',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvSeasonNav',\n      '10': 'nav'\n    },\n    {\n      '1': 'type',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.common.PugvSeasonDescriptionType',\n      '10': 'type'\n    },\n  ],\n  '8': [\n    {'1': 'content'},\n  ],\n};\n\n/// Descriptor for `PugvSeasonDescription`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvSeasonDescriptionDescriptor = $convert.base64Decode(\n    'ChVQdWd2U2Vhc29uRGVzY3JpcHRpb24STgoEdGV4dBgDIAEoCzI4LmJpbGliaWxpLmFwcC52aW'\n    'V3dW5pdGUuY29tbW9uLlB1Z3ZTZWFzb25EZXNjcmlwdGlvblRleHRIAFIEdGV4dBJRCgVpbWFn'\n    'ZRgEIAEoCzI5LmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLlB1Z3ZTZWFzb25EZXNjcm'\n    'lwdGlvbkltYWdlSABSBWltYWdlEj4KA25hdhgBIAEoCzIsLmJpbGliaWxpLmFwcC52aWV3dW5p'\n    'dGUuY29tbW9uLlB1Z3ZTZWFzb25OYXZSA25hdhJMCgR0eXBlGAIgASgOMjguYmlsaWJpbGkuYX'\n    'BwLnZpZXd1bml0ZS5jb21tb24uUHVndlNlYXNvbkRlc2NyaXB0aW9uVHlwZVIEdHlwZUIJCgdj'\n    'b250ZW50');\n\n@$core.Deprecated('Use pugvSeasonDescriptionImageDescriptor instead')\nconst PugvSeasonDescriptionImage$json = {\n  '1': 'PugvSeasonDescriptionImage',\n  '2': [\n    {\n      '1': 'images',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvSeasonDescriptionImageItem',\n      '10': 'images'\n    },\n    {'1': 'folded', '3': 2, '4': 1, '5': 8, '10': 'folded'},\n    {'1': 'fold_ratio', '3': 3, '4': 1, '5': 1, '10': 'foldRatio'},\n  ],\n};\n\n/// Descriptor for `PugvSeasonDescriptionImage`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvSeasonDescriptionImageDescriptor = $convert.base64Decode(\n    'ChpQdWd2U2Vhc29uRGVzY3JpcHRpb25JbWFnZRJVCgZpbWFnZXMYASADKAsyPS5iaWxpYmlsaS'\n    '5hcHAudmlld3VuaXRlLmNvbW1vbi5QdWd2U2Vhc29uRGVzY3JpcHRpb25JbWFnZUl0ZW1SBmlt'\n    'YWdlcxIWCgZmb2xkZWQYAiABKAhSBmZvbGRlZBIdCgpmb2xkX3JhdGlvGAMgASgBUglmb2xkUm'\n    'F0aW8=');\n\n@$core.Deprecated('Use pugvSeasonDescriptionImageItemDescriptor instead')\nconst PugvSeasonDescriptionImageItem$json = {\n  '1': 'PugvSeasonDescriptionImageItem',\n  '2': [\n    {'1': 'image_url', '3': 1, '4': 1, '5': 9, '10': 'imageUrl'},\n    {'1': 'aspect_ratio', '3': 2, '4': 1, '5': 1, '10': 'aspectRatio'},\n  ],\n};\n\n/// Descriptor for `PugvSeasonDescriptionImageItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvSeasonDescriptionImageItemDescriptor =\n    $convert.base64Decode(\n        'Ch5QdWd2U2Vhc29uRGVzY3JpcHRpb25JbWFnZUl0ZW0SGwoJaW1hZ2VfdXJsGAEgASgJUghpbW'\n        'FnZVVybBIhCgxhc3BlY3RfcmF0aW8YAiABKAFSC2FzcGVjdFJhdGlv');\n\n@$core.Deprecated('Use pugvSeasonDescriptionTextDescriptor instead')\nconst PugvSeasonDescriptionText$json = {\n  '1': 'PugvSeasonDescriptionText',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n  ],\n};\n\n/// Descriptor for `PugvSeasonDescriptionText`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvSeasonDescriptionTextDescriptor =\n    $convert.base64Decode(\n        'ChlQdWd2U2Vhc29uRGVzY3JpcHRpb25UZXh0EhIKBHRleHQYASABKAlSBHRleHQ=');\n\n@$core.Deprecated('Use pugvSeasonNavDescriptor instead')\nconst PugvSeasonNav$json = {\n  '1': 'PugvSeasonNav',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'more_text', '3': 2, '4': 1, '5': 9, '10': 'moreText'},\n    {'1': 'desc', '3': 3, '4': 1, '5': 9, '10': 'desc'},\n  ],\n};\n\n/// Descriptor for `PugvSeasonNav`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvSeasonNavDescriptor = $convert.base64Decode(\n    'Cg1QdWd2U2Vhc29uTmF2EhQKBXRpdGxlGAEgASgJUgV0aXRsZRIbCgltb3JlX3RleHQYAiABKA'\n    'lSCG1vcmVUZXh0EhIKBGRlc2MYAyABKAlSBGRlc2M=');\n\n@$core.Deprecated('Use pugvSeasonPrimaryBadgeDescriptor instead')\nconst PugvSeasonPrimaryBadge$json = {\n  '1': 'PugvSeasonPrimaryBadge',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'link', '3': 2, '4': 1, '5': 9, '10': 'link'},\n    {'1': 'night_icon', '3': 3, '4': 1, '5': 9, '10': 'nightIcon'},\n  ],\n};\n\n/// Descriptor for `PugvSeasonPrimaryBadge`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvSeasonPrimaryBadgeDescriptor =\n    $convert.base64Decode(\n        'ChZQdWd2U2Vhc29uUHJpbWFyeUJhZGdlEhIKBGljb24YASABKAlSBGljb24SEgoEbGluaxgCIA'\n        'EoCVIEbGluaxIdCgpuaWdodF9pY29uGAMgASgJUgluaWdodEljb24=');\n\n@$core.Deprecated('Use pugvSeasonPrimaryCustomInfoDescriptor instead')\nconst PugvSeasonPrimaryCustomInfo$json = {\n  '1': 'PugvSeasonPrimaryCustomInfo',\n  '2': [\n    {'1': 'expiry_info', '3': 1, '4': 1, '5': 9, '10': 'expiryInfo'},\n  ],\n};\n\n/// Descriptor for `PugvSeasonPrimaryCustomInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvSeasonPrimaryCustomInfoDescriptor =\n    $convert.base64Decode(\n        'ChtQdWd2U2Vhc29uUHJpbWFyeUN1c3RvbUluZm8SHwoLZXhwaXJ5X2luZm8YASABKAlSCmV4cG'\n        'lyeUluZm8=');\n\n@$core.Deprecated('Use pugvSeasonPrimaryHotRankDescriptor instead')\nconst PugvSeasonPrimaryHotRank$json = {\n  '1': 'PugvSeasonPrimaryHotRank',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'link', '3': 2, '4': 1, '5': 9, '10': 'link'},\n  ],\n};\n\n/// Descriptor for `PugvSeasonPrimaryHotRank`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvSeasonPrimaryHotRankDescriptor =\n    $convert.base64Decode(\n        'ChhQdWd2U2Vhc29uUHJpbWFyeUhvdFJhbmsSEgoEdGV4dBgBIAEoCVIEdGV4dBISCgRsaW5rGA'\n        'IgASgJUgRsaW5r');\n\n@$core.Deprecated('Use pugvSeasonPrimaryInfoDescriptor instead')\nconst PugvSeasonPrimaryInfo$json = {\n  '1': 'PugvSeasonPrimaryInfo',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'subtitle', '3': 2, '4': 1, '5': 9, '10': 'subtitle'},\n    {\n      '1': 'stat_info',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.StatInfo',\n      '10': 'statInfo'\n    },\n    {\n      '1': 'rank_info',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvSeasonPrimaryRankInfo',\n      '10': 'rankInfo'\n    },\n    {\n      '1': 'sell_point_info',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvSeasonPrimarySellPointInfo',\n      '10': 'sellPointInfo'\n    },\n    {\n      '1': 'custom_info',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvSeasonPrimaryCustomInfo',\n      '10': 'customInfo'\n    },\n    {'1': 'show_payment', '3': 7, '4': 1, '5': 8, '10': 'showPayment'},\n    {\n      '1': 'badge',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvSeasonPrimaryBadge',\n      '10': 'badge'\n    },\n  ],\n};\n\n/// Descriptor for `PugvSeasonPrimaryInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvSeasonPrimaryInfoDescriptor = $convert.base64Decode(\n    'ChVQdWd2U2Vhc29uUHJpbWFyeUluZm8SFAoFdGl0bGUYASABKAlSBXRpdGxlEhoKCHN1YnRpdG'\n    'xlGAIgASgJUghzdWJ0aXRsZRJECglzdGF0X2luZm8YAyABKAsyJy5iaWxpYmlsaS5hcHAudmll'\n    'd3VuaXRlLmNvbW1vbi5TdGF0SW5mb1IIc3RhdEluZm8SVQoJcmFua19pbmZvGAQgASgLMjguYm'\n    'lsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uUHVndlNlYXNvblByaW1hcnlSYW5rSW5mb1II'\n    'cmFua0luZm8SZQoPc2VsbF9wb2ludF9pbmZvGAUgASgLMj0uYmlsaWJpbGkuYXBwLnZpZXd1bm'\n    'l0ZS5jb21tb24uUHVndlNlYXNvblByaW1hcnlTZWxsUG9pbnRJbmZvUg1zZWxsUG9pbnRJbmZv'\n    'ElsKC2N1c3RvbV9pbmZvGAYgASgLMjouYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uUH'\n    'VndlNlYXNvblByaW1hcnlDdXN0b21JbmZvUgpjdXN0b21JbmZvEiEKDHNob3dfcGF5bWVudBgH'\n    'IAEoCFILc2hvd1BheW1lbnQSSwoFYmFkZ2UYCCABKAsyNS5iaWxpYmlsaS5hcHAudmlld3VuaX'\n    'RlLmNvbW1vbi5QdWd2U2Vhc29uUHJpbWFyeUJhZGdlUgViYWRnZQ==');\n\n@$core.Deprecated('Use pugvSeasonPrimaryRankInfoDescriptor instead')\nconst PugvSeasonPrimaryRankInfo$json = {\n  '1': 'PugvSeasonPrimaryRankInfo',\n  '2': [\n    {\n      '1': 'hot_rank',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvSeasonPrimaryHotRank',\n      '10': 'hotRank'\n    },\n  ],\n};\n\n/// Descriptor for `PugvSeasonPrimaryRankInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvSeasonPrimaryRankInfoDescriptor = $convert.base64Decode(\n    'ChlQdWd2U2Vhc29uUHJpbWFyeVJhbmtJbmZvElIKCGhvdF9yYW5rGAEgASgLMjcuYmlsaWJpbG'\n    'kuYXBwLnZpZXd1bml0ZS5jb21tb24uUHVndlNlYXNvblByaW1hcnlIb3RSYW5rUgdob3RSYW5r');\n\n@$core.Deprecated('Use pugvSeasonPrimarySellPointDescriptor instead')\nconst PugvSeasonPrimarySellPoint$json = {\n  '1': 'PugvSeasonPrimarySellPoint',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'detail', '3': 2, '4': 1, '5': 9, '10': 'detail'},\n  ],\n};\n\n/// Descriptor for `PugvSeasonPrimarySellPoint`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvSeasonPrimarySellPointDescriptor =\n    $convert.base64Decode(\n        'ChpQdWd2U2Vhc29uUHJpbWFyeVNlbGxQb2ludBIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSFgoGZG'\n        'V0YWlsGAIgASgJUgZkZXRhaWw=');\n\n@$core.Deprecated('Use pugvSeasonPrimarySellPointInfoDescriptor instead')\nconst PugvSeasonPrimarySellPointInfo$json = {\n  '1': 'PugvSeasonPrimarySellPointInfo',\n  '2': [\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.common.PugvSeasonPrimarySellPointType',\n      '10': 'type'\n    },\n    {\n      '1': 'sell_points',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvSeasonPrimarySellPoint',\n      '10': 'sellPoints'\n    },\n  ],\n};\n\n/// Descriptor for `PugvSeasonPrimarySellPointInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvSeasonPrimarySellPointInfoDescriptor =\n    $convert.base64Decode(\n        'Ch5QdWd2U2Vhc29uUHJpbWFyeVNlbGxQb2ludEluZm8SUQoEdHlwZRgBIAEoDjI9LmJpbGliaW'\n        'xpLmFwcC52aWV3dW5pdGUuY29tbW9uLlB1Z3ZTZWFzb25QcmltYXJ5U2VsbFBvaW50VHlwZVIE'\n        'dHlwZRJaCgtzZWxsX3BvaW50cxgCIAMoCzI5LmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW'\n        '9uLlB1Z3ZTZWFzb25QcmltYXJ5U2VsbFBvaW50UgpzZWxsUG9pbnRz');\n\n@$core.Deprecated('Use pugvSeasonPublisherDescriptor instead')\nconst PugvSeasonPublisher$json = {\n  '1': 'PugvSeasonPublisher',\n  '2': [\n    {\n      '1': 'nav',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvSeasonNav',\n      '10': 'nav'\n    },\n    {'1': 'publisher_desc', '3': 2, '4': 1, '5': 9, '10': 'publisherDesc'},\n    {\n      '1': 'cooperators',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvSeasonCooperator',\n      '10': 'cooperators'\n    },\n    {\n      '1': 'sku_content',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvSeasonPublisherSkuContent',\n      '10': 'skuContent'\n    },\n  ],\n};\n\n/// Descriptor for `PugvSeasonPublisher`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvSeasonPublisherDescriptor = $convert.base64Decode(\n    'ChNQdWd2U2Vhc29uUHVibGlzaGVyEj4KA25hdhgBIAEoCzIsLmJpbGliaWxpLmFwcC52aWV3dW'\n    '5pdGUuY29tbW9uLlB1Z3ZTZWFzb25OYXZSA25hdhIlCg5wdWJsaXNoZXJfZGVzYxgCIAEoCVIN'\n    'cHVibGlzaGVyRGVzYxJVCgtjb29wZXJhdG9ycxgDIAMoCzIzLmJpbGliaWxpLmFwcC52aWV3dW'\n    '5pdGUuY29tbW9uLlB1Z3ZTZWFzb25Db29wZXJhdG9yUgtjb29wZXJhdG9ycxJdCgtza3VfY29u'\n    'dGVudBgEIAEoCzI8LmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLlB1Z3ZTZWFzb25QdW'\n    'JsaXNoZXJTa3VDb250ZW50Ugpza3VDb250ZW50');\n\n@$core.Deprecated('Use pugvSeasonPublisherSkuContentDescriptor instead')\nconst PugvSeasonPublisherSkuContent$json = {\n  '1': 'PugvSeasonPublisherSkuContent',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'items',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvSeasonPublisherSkuContentItem',\n      '10': 'items'\n    },\n  ],\n};\n\n/// Descriptor for `PugvSeasonPublisherSkuContent`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvSeasonPublisherSkuContentDescriptor =\n    $convert.base64Decode(\n        'Ch1QdWd2U2Vhc29uUHVibGlzaGVyU2t1Q29udGVudBIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSVg'\n        'oFaXRlbXMYAiADKAsyQC5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5QdWd2U2Vhc29u'\n        'UHVibGlzaGVyU2t1Q29udGVudEl0ZW1SBWl0ZW1z');\n\n@$core.Deprecated('Use pugvSeasonPublisherSkuContentItemDescriptor instead')\nconst PugvSeasonPublisherSkuContentItem$json = {\n  '1': 'PugvSeasonPublisherSkuContentItem',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'season_id', '3': 2, '4': 1, '5': 3, '10': 'seasonId'},\n    {'1': 'selected', '3': 3, '4': 1, '5': 8, '10': 'selected'},\n  ],\n};\n\n/// Descriptor for `PugvSeasonPublisherSkuContentItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvSeasonPublisherSkuContentItemDescriptor =\n    $convert.base64Decode(\n        'CiFQdWd2U2Vhc29uUHVibGlzaGVyU2t1Q29udGVudEl0ZW0SFAoFdGl0bGUYASABKAlSBXRpdG'\n        'xlEhsKCXNlYXNvbl9pZBgCIAEoA1IIc2Vhc29uSWQSGgoIc2VsZWN0ZWQYAyABKAhSCHNlbGVj'\n        'dGVk');\n\n@$core.Deprecated('Use pugvSeasonRecommendDescriptor instead')\nconst PugvSeasonRecommend$json = {\n  '1': 'PugvSeasonRecommend',\n  '2': [\n    {\n      '1': 'nav',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvSeasonNav',\n      '10': 'nav'\n    },\n    {\n      '1': 'contents',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvSeasonRecommendContent',\n      '10': 'contents'\n    },\n    {\n      '1': 'more_info',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvSeasonRecommendMore',\n      '10': 'moreInfo'\n    },\n    {\n      '1': 'show_style',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.common.PugvSeasonRecommendShowStyle',\n      '10': 'showStyle'\n    },\n  ],\n};\n\n/// Descriptor for `PugvSeasonRecommend`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvSeasonRecommendDescriptor = $convert.base64Decode(\n    'ChNQdWd2U2Vhc29uUmVjb21tZW5kEj4KA25hdhgBIAEoCzIsLmJpbGliaWxpLmFwcC52aWV3dW'\n    '5pdGUuY29tbW9uLlB1Z3ZTZWFzb25OYXZSA25hdhJVCghjb250ZW50cxgCIAMoCzI5LmJpbGli'\n    'aWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLlB1Z3ZTZWFzb25SZWNvbW1lbmRDb250ZW50Ughjb2'\n    '50ZW50cxJTCgltb3JlX2luZm8YAyABKAsyNi5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1v'\n    'bi5QdWd2U2Vhc29uUmVjb21tZW5kTW9yZVIIbW9yZUluZm8SWgoKc2hvd19zdHlsZRgEIAEoDj'\n    'I7LmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLlB1Z3ZTZWFzb25SZWNvbW1lbmRTaG93'\n    'U3R5bGVSCXNob3dTdHlsZQ==');\n\n@$core.Deprecated('Use pugvSeasonRecommendContentDescriptor instead')\nconst PugvSeasonRecommendContent$json = {\n  '1': 'PugvSeasonRecommendContent',\n  '2': [\n    {'1': 'cover_url', '3': 1, '4': 1, '5': 9, '10': 'coverUrl'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'subtitle', '3': 3, '4': 1, '5': 9, '10': 'subtitle'},\n    {'1': 'link', '3': 4, '4': 1, '5': 9, '10': 'link'},\n    {'1': 'desc', '3': 5, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'season_id', '3': 6, '4': 1, '5': 3, '10': 'seasonId'},\n    {'1': 'author', '3': 7, '4': 1, '5': 9, '10': 'author'},\n    {\n      '1': 'view',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.StatInfo',\n      '10': 'view'\n    },\n    {\n      '1': 'rcmd_reason',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.BadgeInfo',\n      '10': 'rcmdReason'\n    },\n  ],\n};\n\n/// Descriptor for `PugvSeasonRecommendContent`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvSeasonRecommendContentDescriptor = $convert.base64Decode(\n    'ChpQdWd2U2Vhc29uUmVjb21tZW5kQ29udGVudBIbCgljb3Zlcl91cmwYASABKAlSCGNvdmVyVX'\n    'JsEhQKBXRpdGxlGAIgASgJUgV0aXRsZRIaCghzdWJ0aXRsZRgDIAEoCVIIc3VidGl0bGUSEgoE'\n    'bGluaxgEIAEoCVIEbGluaxISCgRkZXNjGAUgASgJUgRkZXNjEhsKCXNlYXNvbl9pZBgGIAEoA1'\n    'IIc2Vhc29uSWQSFgoGYXV0aG9yGAcgASgJUgZhdXRob3ISOwoEdmlldxgIIAEoCzInLmJpbGli'\n    'aWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLlN0YXRJbmZvUgR2aWV3EkkKC3JjbWRfcmVhc29uGA'\n    'kgASgLMiguYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uQmFkZ2VJbmZvUgpyY21kUmVh'\n    'c29u');\n\n@$core.Deprecated('Use pugvSeasonRecommendMoreDescriptor instead')\nconst PugvSeasonRecommendMore$json = {\n  '1': 'PugvSeasonRecommendMore',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'link', '3': 2, '4': 1, '5': 9, '10': 'link'},\n    {'1': 'link_text', '3': 3, '4': 1, '5': 9, '10': 'linkText'},\n  ],\n};\n\n/// Descriptor for `PugvSeasonRecommendMore`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvSeasonRecommendMoreDescriptor =\n    $convert.base64Decode(\n        'ChdQdWd2U2Vhc29uUmVjb21tZW5kTW9yZRIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSEgoEbGluax'\n        'gCIAEoCVIEbGluaxIbCglsaW5rX3RleHQYAyABKAlSCGxpbmtUZXh0');\n\n@$core.Deprecated('Use pugvSeasonSelectionDescriptor instead')\nconst PugvSeasonSelection$json = {\n  '1': 'PugvSeasonSelection',\n  '2': [\n    {\n      '1': 'nav',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvSeasonNav',\n      '10': 'nav'\n    },\n  ],\n};\n\n/// Descriptor for `PugvSeasonSelection`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvSeasonSelectionDescriptor = $convert.base64Decode(\n    'ChNQdWd2U2Vhc29uU2VsZWN0aW9uEj4KA25hdhgBIAEoCzIsLmJpbGliaWxpLmFwcC52aWV3dW'\n    '5pdGUuY29tbW9uLlB1Z3ZTZWFzb25OYXZSA25hdg==');\n\n@$core.Deprecated('Use pugvSeriesDescriptor instead')\nconst PugvSeries$json = {\n  '1': 'PugvSeries',\n  '2': [\n    {\n      '1': 'nav',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvSeasonNav',\n      '10': 'nav'\n    },\n    {\n      '1': 'contents',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvSeriesItem',\n      '10': 'contents'\n    },\n  ],\n};\n\n/// Descriptor for `PugvSeries`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvSeriesDescriptor = $convert.base64Decode(\n    'CgpQdWd2U2VyaWVzEj4KA25hdhgBIAEoCzIsLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW'\n    '9uLlB1Z3ZTZWFzb25OYXZSA25hdhJJCghjb250ZW50cxgCIAMoCzItLmJpbGliaWxpLmFwcC52'\n    'aWV3dW5pdGUuY29tbW9uLlB1Z3ZTZXJpZXNJdGVtUghjb250ZW50cw==');\n\n@$core.Deprecated('Use pugvSeriesItemDescriptor instead')\nconst PugvSeriesItem$json = {\n  '1': 'PugvSeriesItem',\n  '2': [\n    {'1': 'season_id', '3': 1, '4': 1, '5': 3, '10': 'seasonId'},\n    {'1': 'selected', '3': 2, '4': 1, '5': 8, '10': 'selected'},\n    {'1': 'gray', '3': 3, '4': 1, '5': 8, '10': 'gray'},\n    {'1': 'content', '3': 4, '4': 1, '5': 9, '10': 'content'},\n    {'1': 'label', '3': 5, '4': 1, '5': 9, '10': 'label'},\n    {\n      '1': 'state',\n      '3': 6,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.common.PugvSeriesItemState',\n      '10': 'state'\n    },\n  ],\n};\n\n/// Descriptor for `PugvSeriesItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvSeriesItemDescriptor = $convert.base64Decode(\n    'Cg5QdWd2U2VyaWVzSXRlbRIbCglzZWFzb25faWQYASABKANSCHNlYXNvbklkEhoKCHNlbGVjdG'\n    'VkGAIgASgIUghzZWxlY3RlZBISCgRncmF5GAMgASgIUgRncmF5EhgKB2NvbnRlbnQYBCABKAlS'\n    'B2NvbnRlbnQSFAoFbGFiZWwYBSABKAlSBWxhYmVsEkgKBXN0YXRlGAYgASgOMjIuYmlsaWJpbG'\n    'kuYXBwLnZpZXd1bml0ZS5jb21tb24uUHVndlNlcmllc0l0ZW1TdGF0ZVIFc3RhdGU=');\n\n@$core.Deprecated('Use pugvShoppingNoticeDescriptor instead')\nconst PugvShoppingNotice$json = {\n  '1': 'PugvShoppingNotice',\n  '2': [\n    {\n      '1': 'nav',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvSeasonNav',\n      '10': 'nav'\n    },\n    {\n      '1': 'contents',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvShoppingNoticeContent',\n      '10': 'contents'\n    },\n    {'1': 'link', '3': 3, '4': 1, '5': 9, '10': 'link'},\n  ],\n};\n\n/// Descriptor for `PugvShoppingNotice`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvShoppingNoticeDescriptor = $convert.base64Decode(\n    'ChJQdWd2U2hvcHBpbmdOb3RpY2USPgoDbmF2GAEgASgLMiwuYmlsaWJpbGkuYXBwLnZpZXd1bm'\n    'l0ZS5jb21tb24uUHVndlNlYXNvbk5hdlIDbmF2ElQKCGNvbnRlbnRzGAIgAygLMjguYmlsaWJp'\n    'bGkuYXBwLnZpZXd1bml0ZS5jb21tb24uUHVndlNob3BwaW5nTm90aWNlQ29udGVudFIIY29udG'\n    'VudHMSEgoEbGluaxgDIAEoCVIEbGluaw==');\n\n@$core.Deprecated('Use pugvShoppingNoticeContentDescriptor instead')\nconst PugvShoppingNoticeContent$json = {\n  '1': 'PugvShoppingNoticeContent',\n  '2': [\n    {'1': 'number', '3': 1, '4': 1, '5': 9, '10': 'number'},\n    {'1': 'content', '3': 2, '4': 1, '5': 9, '10': 'content'},\n    {'1': 'is_bold', '3': 3, '4': 1, '5': 8, '10': 'isBold'},\n  ],\n};\n\n/// Descriptor for `PugvShoppingNoticeContent`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvShoppingNoticeContentDescriptor =\n    $convert.base64Decode(\n        'ChlQdWd2U2hvcHBpbmdOb3RpY2VDb250ZW50EhYKBm51bWJlchgBIAEoCVIGbnVtYmVyEhgKB2'\n        'NvbnRlbnQYAiABKAlSB2NvbnRlbnQSFwoHaXNfYm9sZBgDIAEoCFIGaXNCb2xk');\n\n@$core.Deprecated('Use pugvZoneDescriptor instead')\nconst PugvZone$json = {\n  '1': 'PugvZone',\n  '2': [\n    {\n      '1': 'contents',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PugvZoneItem',\n      '10': 'contents'\n    },\n  ],\n};\n\n/// Descriptor for `PugvZone`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvZoneDescriptor = $convert.base64Decode(\n    'CghQdWd2Wm9uZRJHCghjb250ZW50cxgBIAMoCzIrLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY2'\n    '9tbW9uLlB1Z3Zab25lSXRlbVIIY29udGVudHM=');\n\n@$core.Deprecated('Use pugvZoneItemDescriptor instead')\nconst PugvZoneItem$json = {\n  '1': 'PugvZoneItem',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'link', '3': 2, '4': 1, '5': 9, '10': 'link'},\n    {'1': 'title', '3': 3, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'subtitle', '3': 4, '4': 1, '5': 9, '10': 'subtitle'},\n    {\n      '1': 'type',\n      '3': 5,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.common.PugvZoneItemType',\n      '10': 'type'\n    },\n  ],\n};\n\n/// Descriptor for `PugvZoneItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pugvZoneItemDescriptor = $convert.base64Decode(\n    'CgxQdWd2Wm9uZUl0ZW0SEgoEaWNvbhgBIAEoCVIEaWNvbhISCgRsaW5rGAIgASgJUgRsaW5rEh'\n    'QKBXRpdGxlGAMgASgJUgV0aXRsZRIaCghzdWJ0aXRsZRgEIAEoCVIIc3VidGl0bGUSQwoEdHlw'\n    'ZRgFIAEoDjIvLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLlB1Z3Zab25lSXRlbVR5cG'\n    'VSBHR5cGU=');\n\n@$core.Deprecated('Use rankDescriptor instead')\nconst Rank$json = {\n  '1': 'Rank',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'icon_night', '3': 2, '4': 1, '5': 9, '10': 'iconNight'},\n    {'1': 'text', '3': 3, '4': 1, '5': 9, '10': 'text'},\n  ],\n};\n\n/// Descriptor for `Rank`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rankDescriptor = $convert.base64Decode(\n    'CgRSYW5rEhIKBGljb24YASABKAlSBGljb24SHQoKaWNvbl9uaWdodBgCIAEoCVIJaWNvbk5pZ2'\n    'h0EhIKBHRleHQYAyABKAlSBHRleHQ=');\n\n@$core.Deprecated('Use rankInfoDescriptor instead')\nconst RankInfo$json = {\n  '1': 'RankInfo',\n  '2': [\n    {'1': 'icon_url_night', '3': 1, '4': 1, '5': 9, '10': 'iconUrlNight'},\n    {'1': 'icon_url_day', '3': 2, '4': 1, '5': 9, '10': 'iconUrlDay'},\n    {'1': 'bkg_night_color', '3': 3, '4': 1, '5': 9, '10': 'bkgNightColor'},\n    {'1': 'bkg_day_color', '3': 4, '4': 1, '5': 9, '10': 'bkgDayColor'},\n    {'1': 'font_night_color', '3': 5, '4': 1, '5': 9, '10': 'fontNightColor'},\n    {'1': 'font_day_color', '3': 6, '4': 1, '5': 9, '10': 'fontDayColor'},\n    {'1': 'rank_content', '3': 7, '4': 1, '5': 9, '10': 'rankContent'},\n    {'1': 'rank_link', '3': 8, '4': 1, '5': 9, '10': 'rankLink'},\n  ],\n};\n\n/// Descriptor for `RankInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rankInfoDescriptor = $convert.base64Decode(\n    'CghSYW5rSW5mbxIkCg5pY29uX3VybF9uaWdodBgBIAEoCVIMaWNvblVybE5pZ2h0EiAKDGljb2'\n    '5fdXJsX2RheRgCIAEoCVIKaWNvblVybERheRImCg9ia2dfbmlnaHRfY29sb3IYAyABKAlSDWJr'\n    'Z05pZ2h0Q29sb3ISIgoNYmtnX2RheV9jb2xvchgEIAEoCVILYmtnRGF5Q29sb3ISKAoQZm9udF'\n    '9uaWdodF9jb2xvchgFIAEoCVIOZm9udE5pZ2h0Q29sb3ISJAoOZm9udF9kYXlfY29sb3IYBiAB'\n    'KAlSDGZvbnREYXlDb2xvchIhCgxyYW5rX2NvbnRlbnQYByABKAlSC3JhbmtDb250ZW50EhsKCX'\n    'JhbmtfbGluaxgIIAEoCVIIcmFua0xpbms=');\n\n@$core.Deprecated('Use ratingDescriptor instead')\nconst Rating$json = {\n  '1': 'Rating',\n  '2': [\n    {'1': 'score', '3': 1, '4': 1, '5': 9, '10': 'score'},\n    {'1': 'count', '3': 2, '4': 1, '5': 5, '10': 'count'},\n  ],\n};\n\n/// Descriptor for `Rating`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List ratingDescriptor = $convert.base64Decode(\n    'CgZSYXRpbmcSFAoFc2NvcmUYASABKAlSBXNjb3JlEhQKBWNvdW50GAIgASgFUgVjb3VudA==');\n\n@$core.Deprecated('Use relateAVCardDescriptor instead')\nconst RelateAVCard$json = {\n  '1': 'RelateAVCard',\n  '2': [\n    {'1': 'duration', '3': 1, '4': 1, '5': 3, '10': 'duration'},\n    {'1': 'cid', '3': 2, '4': 1, '5': 3, '10': 'cid'},\n    {\n      '1': 'dimension',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Dimension',\n      '10': 'dimension'\n    },\n    {\n      '1': 'stat',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Stat',\n      '10': 'stat'\n    },\n    {'1': 'jump_url', '3': 5, '4': 1, '5': 9, '10': 'jumpUrl'},\n    {'1': 'show_up_name', '3': 6, '4': 1, '5': 8, '10': 'showUpName'},\n    {\n      '1': 'rcmd_reason',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.BadgeInfo',\n      '10': 'rcmdReason'\n    },\n    {'1': 'duration_text', '3': 8, '4': 1, '5': 9, '10': 'durationText'},\n    {'1': 'show_rcmd_style', '3': 9, '4': 1, '5': 8, '10': 'showRcmdStyle'},\n  ],\n};\n\n/// Descriptor for `RelateAVCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List relateAVCardDescriptor = $convert.base64Decode(\n    'CgxSZWxhdGVBVkNhcmQSGgoIZHVyYXRpb24YASABKANSCGR1cmF0aW9uEhAKA2NpZBgCIAEoA1'\n    'IDY2lkEkYKCWRpbWVuc2lvbhgDIAEoCzIoLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9u'\n    'LkRpbWVuc2lvblIJZGltZW5zaW9uEjcKBHN0YXQYBCABKAsyIy5iaWxpYmlsaS5hcHAudmlld3'\n    'VuaXRlLmNvbW1vbi5TdGF0UgRzdGF0EhkKCGp1bXBfdXJsGAUgASgJUgdqdW1wVXJsEiAKDHNo'\n    'b3dfdXBfbmFtZRgGIAEoCFIKc2hvd1VwTmFtZRJJCgtyY21kX3JlYXNvbhgHIAEoCzIoLmJpbG'\n    'liaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLkJhZGdlSW5mb1IKcmNtZFJlYXNvbhIjCg1kdXJh'\n    'dGlvbl90ZXh0GAggASgJUgxkdXJhdGlvblRleHQSJgoPc2hvd19yY21kX3N0eWxlGAkgASgIUg'\n    '1zaG93UmNtZFN0eWxl');\n\n@$core.Deprecated('Use relateBangumiAvCardDescriptor instead')\nconst RelateBangumiAvCard$json = {\n  '1': 'RelateBangumiAvCard',\n  '2': [\n    {\n      '1': 'badge',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.BadgeInfo',\n      '10': 'badge'\n    },\n    {\n      '1': 'stat',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Stat',\n      '10': 'stat'\n    },\n    {\n      '1': 'rating',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Rating',\n      '10': 'rating'\n    },\n    {'1': 'cover_right_text', '3': 4, '4': 1, '5': 9, '10': 'coverRightText'},\n    {'1': 'show_rcmd_style', '3': 5, '4': 1, '5': 8, '10': 'showRcmdStyle'},\n  ],\n};\n\n/// Descriptor for `RelateBangumiAvCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List relateBangumiAvCardDescriptor = $convert.base64Decode(\n    'ChNSZWxhdGVCYW5ndW1pQXZDYXJkEj4KBWJhZGdlGAEgASgLMiguYmlsaWJpbGkuYXBwLnZpZX'\n    'd1bml0ZS5jb21tb24uQmFkZ2VJbmZvUgViYWRnZRI3CgRzdGF0GAIgASgLMiMuYmlsaWJpbGku'\n    'YXBwLnZpZXd1bml0ZS5jb21tb24uU3RhdFIEc3RhdBI9CgZyYXRpbmcYAyABKAsyJS5iaWxpYm'\n    'lsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5SYXRpbmdSBnJhdGluZxIoChBjb3Zlcl9yaWdodF90'\n    'ZXh0GAQgASgJUg5jb3ZlclJpZ2h0VGV4dBImCg9zaG93X3JjbWRfc3R5bGUYBSABKAhSDXNob3'\n    'dSY21kU3R5bGU=');\n\n@$core.Deprecated('Use relateBangumiCardDescriptor instead')\nconst RelateBangumiCard$json = {\n  '1': 'RelateBangumiCard',\n  '2': [\n    {'1': 'season_id', '3': 1, '4': 1, '5': 5, '10': 'seasonId'},\n    {'1': 'season_type', '3': 2, '4': 1, '5': 5, '10': 'seasonType'},\n    {\n      '1': 'new_ep',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.NewEp',\n      '10': 'newEp'\n    },\n    {\n      '1': 'stat',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Stat',\n      '10': 'stat'\n    },\n    {\n      '1': 'rating',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Rating',\n      '10': 'rating'\n    },\n    {'1': 'rcmd_reason', '3': 6, '4': 1, '5': 9, '10': 'rcmdReason'},\n    {\n      '1': 'badge_info',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.BadgeInfo',\n      '10': 'badgeInfo'\n    },\n    {'1': 'goto_type', '3': 8, '4': 1, '5': 9, '10': 'gotoType'},\n    {\n      '1': 'report',\n      '3': 9,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.RelateBangumiCard.ReportEntry',\n      '10': 'report'\n    },\n  ],\n  '3': [RelateBangumiCard_ReportEntry$json],\n};\n\n@$core.Deprecated('Use relateBangumiCardDescriptor instead')\nconst RelateBangumiCard_ReportEntry$json = {\n  '1': 'ReportEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `RelateBangumiCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List relateBangumiCardDescriptor = $convert.base64Decode(\n    'ChFSZWxhdGVCYW5ndW1pQ2FyZBIbCglzZWFzb25faWQYASABKAVSCHNlYXNvbklkEh8KC3NlYX'\n    'Nvbl90eXBlGAIgASgFUgpzZWFzb25UeXBlEjsKBm5ld19lcBgDIAEoCzIkLmJpbGliaWxpLmFw'\n    'cC52aWV3dW5pdGUuY29tbW9uLk5ld0VwUgVuZXdFcBI3CgRzdGF0GAQgASgLMiMuYmlsaWJpbG'\n    'kuYXBwLnZpZXd1bml0ZS5jb21tb24uU3RhdFIEc3RhdBI9CgZyYXRpbmcYBSABKAsyJS5iaWxp'\n    'YmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5SYXRpbmdSBnJhdGluZxIfCgtyY21kX3JlYXNvbh'\n    'gGIAEoCVIKcmNtZFJlYXNvbhJHCgpiYWRnZV9pbmZvGAcgASgLMiguYmlsaWJpbGkuYXBwLnZp'\n    'ZXd1bml0ZS5jb21tb24uQmFkZ2VJbmZvUgliYWRnZUluZm8SGwoJZ290b190eXBlGAggASgJUg'\n    'hnb3RvVHlwZRJUCgZyZXBvcnQYCSADKAsyPC5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1v'\n    'bi5SZWxhdGVCYW5ndW1pQ2FyZC5SZXBvcnRFbnRyeVIGcmVwb3J0GjkKC1JlcG9ydEVudHJ5Eh'\n    'AKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAE=');\n\n@$core.Deprecated('Use relateBangumiResourceCardDescriptor instead')\nconst RelateBangumiResourceCard$json = {\n  '1': 'RelateBangumiResourceCard',\n  '2': [\n    {'1': 'type', '3': 1, '4': 1, '5': 5, '10': 'type'},\n    {'1': 'scover', '3': 2, '4': 1, '5': 9, '10': 'scover'},\n    {'1': 're_type', '3': 3, '4': 1, '5': 5, '10': 'reType'},\n    {'1': 're_value', '3': 4, '4': 1, '5': 9, '10': 'reValue'},\n    {'1': 'corner', '3': 5, '4': 1, '5': 9, '10': 'corner'},\n    {'1': 'card', '3': 6, '4': 1, '5': 5, '10': 'card'},\n    {'1': 'siz', '3': 7, '4': 1, '5': 9, '10': 'siz'},\n    {'1': 'position', '3': 8, '4': 1, '5': 5, '10': 'position'},\n    {'1': 'rcmd_reason', '3': 9, '4': 1, '5': 9, '10': 'rcmdReason'},\n    {'1': 'label', '3': 10, '4': 1, '5': 9, '10': 'label'},\n    {\n      '1': 'report',\n      '3': 11,\n      '4': 3,\n      '5': 11,\n      '6':\n          '.bilibili.app.viewunite.common.RelateBangumiResourceCard.ReportEntry',\n      '10': 'report'\n    },\n    {'1': 'goto_type', '3': 12, '4': 1, '5': 9, '10': 'gotoType'},\n  ],\n  '3': [RelateBangumiResourceCard_ReportEntry$json],\n};\n\n@$core.Deprecated('Use relateBangumiResourceCardDescriptor instead')\nconst RelateBangumiResourceCard_ReportEntry$json = {\n  '1': 'ReportEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `RelateBangumiResourceCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List relateBangumiResourceCardDescriptor = $convert.base64Decode(\n    'ChlSZWxhdGVCYW5ndW1pUmVzb3VyY2VDYXJkEhIKBHR5cGUYASABKAVSBHR5cGUSFgoGc2Nvdm'\n    'VyGAIgASgJUgZzY292ZXISFwoHcmVfdHlwZRgDIAEoBVIGcmVUeXBlEhkKCHJlX3ZhbHVlGAQg'\n    'ASgJUgdyZVZhbHVlEhYKBmNvcm5lchgFIAEoCVIGY29ybmVyEhIKBGNhcmQYBiABKAVSBGNhcm'\n    'QSEAoDc2l6GAcgASgJUgNzaXoSGgoIcG9zaXRpb24YCCABKAVSCHBvc2l0aW9uEh8KC3JjbWRf'\n    'cmVhc29uGAkgASgJUgpyY21kUmVhc29uEhQKBWxhYmVsGAogASgJUgVsYWJlbBJcCgZyZXBvcn'\n    'QYCyADKAsyRC5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5SZWxhdGVCYW5ndW1pUmVz'\n    'b3VyY2VDYXJkLlJlcG9ydEVudHJ5UgZyZXBvcnQSGwoJZ290b190eXBlGAwgASgJUghnb3RvVH'\n    'lwZRo5CgtSZXBvcnRFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFs'\n    'dWU6AjgB');\n\n@$core.Deprecated('Use relateBangumiUGCCardDescriptor instead')\nconst RelateBangumiUGCCard$json = {\n  '1': 'RelateBangumiUGCCard',\n  '2': [\n    {\n      '1': 'badge',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.BadgeInfo',\n      '10': 'badge'\n    },\n    {\n      '1': 'stat',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Stat',\n      '10': 'stat'\n    },\n    {\n      '1': 'rating',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Rating',\n      '10': 'rating'\n    },\n  ],\n};\n\n/// Descriptor for `RelateBangumiUGCCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List relateBangumiUGCCardDescriptor = $convert.base64Decode(\n    'ChRSZWxhdGVCYW5ndW1pVUdDQ2FyZBI+CgViYWRnZRgBIAEoCzIoLmJpbGliaWxpLmFwcC52aW'\n    'V3dW5pdGUuY29tbW9uLkJhZGdlSW5mb1IFYmFkZ2USNwoEc3RhdBgCIAEoCzIjLmJpbGliaWxp'\n    'LmFwcC52aWV3dW5pdGUuY29tbW9uLlN0YXRSBHN0YXQSPQoGcmF0aW5nGAMgASgLMiUuYmlsaW'\n    'JpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uUmF0aW5nUgZyYXRpbmc=');\n\n@$core.Deprecated('Use relateCMCardDescriptor instead')\nconst RelateCMCard$json = {\n  '1': 'RelateCMCard',\n  '2': [\n    {'1': 'aid', '3': 1, '4': 1, '5': 3, '10': 'aid'},\n    {\n      '1': 'source_content',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.google.protobuf.Any',\n      '10': 'sourceContent'\n    },\n    {'1': 'duration', '3': 3, '4': 1, '5': 3, '10': 'duration'},\n    {\n      '1': 'stat',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Stat',\n      '10': 'stat'\n    },\n    {'1': 'nature_ad', '3': 5, '4': 1, '5': 5, '10': 'natureAd'},\n  ],\n};\n\n/// Descriptor for `RelateCMCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List relateCMCardDescriptor = $convert.base64Decode(\n    'CgxSZWxhdGVDTUNhcmQSEAoDYWlkGAEgASgDUgNhaWQSOwoOc291cmNlX2NvbnRlbnQYAiABKA'\n    'syFC5nb29nbGUucHJvdG9idWYuQW55Ug1zb3VyY2VDb250ZW50EhoKCGR1cmF0aW9uGAMgASgD'\n    'UghkdXJhdGlvbhI3CgRzdGF0GAQgASgLMiMuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb2'\n    '4uU3RhdFIEc3RhdBIbCgluYXR1cmVfYWQYBSABKAVSCG5hdHVyZUFk');\n\n@$core.Deprecated('Use relateCardDescriptor instead')\nconst RelateCard$json = {\n  '1': 'RelateCard',\n  '2': [\n    {\n      '1': 'av',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.RelateAVCard',\n      '9': 0,\n      '10': 'av'\n    },\n    {\n      '1': 'bangumi',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.RelateBangumiCard',\n      '9': 0,\n      '10': 'bangumi'\n    },\n    {\n      '1': 'resource',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.RelateBangumiResourceCard',\n      '9': 0,\n      '10': 'resource'\n    },\n    {\n      '1': 'game',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.RelateGameCard',\n      '9': 0,\n      '10': 'game'\n    },\n    {\n      '1': 'cm',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.RelateCMCard',\n      '9': 0,\n      '10': 'cm'\n    },\n    {\n      '1': 'live',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.RelateLiveCard',\n      '9': 0,\n      '10': 'live'\n    },\n    {\n      '1': 'bangumi_av',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.RelateBangumiAvCard',\n      '9': 0,\n      '10': 'bangumiAv'\n    },\n    {\n      '1': 'ai_card',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.RelatedAICard',\n      '9': 0,\n      '10': 'aiCard'\n    },\n    {\n      '1': 'bangumi_ugc',\n      '3': 13,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.RelateBangumiUGCCard',\n      '9': 0,\n      '10': 'bangumiUgc'\n    },\n    {\n      '1': 'special',\n      '3': 14,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.RelateSpecial',\n      '9': 0,\n      '10': 'special'\n    },\n    {\n      '1': 'course',\n      '3': 15,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.RelateCourseCard',\n      '9': 0,\n      '10': 'course'\n    },\n    {\n      '1': 'mini_program',\n      '3': 16,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.RelateMiniProgramCard',\n      '9': 0,\n      '10': 'miniProgram'\n    },\n    {\n      '1': 'history_av',\n      '3': 17,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.RelateHistoryAVCard',\n      '9': 0,\n      '10': 'historyAv'\n    },\n    {\n      '1': 'relate_card_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.common.RelateCardType',\n      '10': 'relateCardType'\n    },\n    {\n      '1': 'three_point',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.RelateThreePoint',\n      '10': 'threePoint'\n    },\n    {\n      '1': 'cm_stock',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.google.protobuf.Any',\n      '10': 'cmStock'\n    },\n    {\n      '1': 'basic_info',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.CardBasicInfo',\n      '10': 'basicInfo'\n    },\n  ],\n  '8': [\n    {'1': 'card'},\n  ],\n};\n\n/// Descriptor for `RelateCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List relateCardDescriptor = $convert.base64Decode(\n    'CgpSZWxhdGVDYXJkEj0KAmF2GAIgASgLMisuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb2'\n    '4uUmVsYXRlQVZDYXJkSABSAmF2EkwKB2Jhbmd1bWkYAyABKAsyMC5iaWxpYmlsaS5hcHAudmll'\n    'd3VuaXRlLmNvbW1vbi5SZWxhdGVCYW5ndW1pQ2FyZEgAUgdiYW5ndW1pElYKCHJlc291cmNlGA'\n    'QgASgLMjguYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uUmVsYXRlQmFuZ3VtaVJlc291'\n    'cmNlQ2FyZEgAUghyZXNvdXJjZRJDCgRnYW1lGAUgASgLMi0uYmlsaWJpbGkuYXBwLnZpZXd1bm'\n    'l0ZS5jb21tb24uUmVsYXRlR2FtZUNhcmRIAFIEZ2FtZRI9CgJjbRgGIAEoCzIrLmJpbGliaWxp'\n    'LmFwcC52aWV3dW5pdGUuY29tbW9uLlJlbGF0ZUNNQ2FyZEgAUgJjbRJDCgRsaXZlGAcgASgLMi'\n    '0uYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uUmVsYXRlTGl2ZUNhcmRIAFIEbGl2ZRJT'\n    'CgpiYW5ndW1pX2F2GAggASgLMjIuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uUmVsYX'\n    'RlQmFuZ3VtaUF2Q2FyZEgAUgliYW5ndW1pQXYSRwoHYWlfY2FyZBgJIAEoCzIsLmJpbGliaWxp'\n    'LmFwcC52aWV3dW5pdGUuY29tbW9uLlJlbGF0ZWRBSUNhcmRIAFIGYWlDYXJkElYKC2Jhbmd1bW'\n    'lfdWdjGA0gASgLMjMuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uUmVsYXRlQmFuZ3Vt'\n    'aVVHQ0NhcmRIAFIKYmFuZ3VtaVVnYxJICgdzcGVjaWFsGA4gASgLMiwuYmlsaWJpbGkuYXBwLn'\n    'ZpZXd1bml0ZS5jb21tb24uUmVsYXRlU3BlY2lhbEgAUgdzcGVjaWFsEkkKBmNvdXJzZRgPIAEo'\n    'CzIvLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLlJlbGF0ZUNvdXJzZUNhcmRIAFIGY2'\n    '91cnNlElkKDG1pbmlfcHJvZ3JhbRgQIAEoCzI0LmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29t'\n    'bW9uLlJlbGF0ZU1pbmlQcm9ncmFtQ2FyZEgAUgttaW5pUHJvZ3JhbRJTCgpoaXN0b3J5X2F2GB'\n    'EgASgLMjIuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uUmVsYXRlSGlzdG9yeUFWQ2Fy'\n    'ZEgAUgloaXN0b3J5QXYSVwoQcmVsYXRlX2NhcmRfdHlwZRgBIAEoDjItLmJpbGliaWxpLmFwcC'\n    '52aWV3dW5pdGUuY29tbW9uLlJlbGF0ZUNhcmRUeXBlUg5yZWxhdGVDYXJkVHlwZRJQCgt0aHJl'\n    'ZV9wb2ludBgKIAEoCzIvLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLlJlbGF0ZVRocm'\n    'VlUG9pbnRSCnRocmVlUG9pbnQSLwoIY21fc3RvY2sYCyABKAsyFC5nb29nbGUucHJvdG9idWYu'\n    'QW55UgdjbVN0b2NrEksKCmJhc2ljX2luZm8YDCABKAsyLC5iaWxpYmlsaS5hcHAudmlld3VuaX'\n    'RlLmNvbW1vbi5DYXJkQmFzaWNJbmZvUgliYXNpY0luZm9CBgoEY2FyZA==');\n\n@$core.Deprecated('Use relateConfigDescriptor instead')\nconst RelateConfig$json = {\n  '1': 'RelateConfig',\n  '2': [\n    {'1': 'valid_show_m', '3': 1, '4': 1, '5': 3, '10': 'validShowM'},\n    {'1': 'valid_show_n', '3': 2, '4': 1, '5': 3, '10': 'validShowN'},\n    {\n      '1': 'pagination',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.pagination.Pagination',\n      '10': 'pagination'\n    },\n    {'1': 'can_load_more', '3': 4, '4': 1, '5': 8, '10': 'canLoadMore'},\n    {\n      '1': 'dimension',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.CoverDimension',\n      '10': 'dimension'\n    },\n  ],\n};\n\n/// Descriptor for `RelateConfig`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List relateConfigDescriptor = $convert.base64Decode(\n    'CgxSZWxhdGVDb25maWcSIAoMdmFsaWRfc2hvd19tGAEgASgDUgp2YWxpZFNob3dNEiAKDHZhbG'\n    'lkX3Nob3dfbhgCIAEoA1IKdmFsaWRTaG93ThI/CgpwYWdpbmF0aW9uGAMgASgLMh8uYmlsaWJp'\n    'bGkucGFnaW5hdGlvbi5QYWdpbmF0aW9uUgpwYWdpbmF0aW9uEiIKDWNhbl9sb2FkX21vcmUYBC'\n    'ABKAhSC2NhbkxvYWRNb3JlEksKCWRpbWVuc2lvbhgFIAEoCzItLmJpbGliaWxpLmFwcC52aWV3'\n    'dW5pdGUuY29tbW9uLkNvdmVyRGltZW5zaW9uUglkaW1lbnNpb24=');\n\n@$core.Deprecated('Use relateCourseCardDescriptor instead')\nconst RelateCourseCard$json = {\n  '1': 'RelateCourseCard',\n  '2': [\n    {'1': 'duration', '3': 1, '4': 1, '5': 3, '10': 'duration'},\n    {\n      '1': 'stat',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Stat',\n      '10': 'stat'\n    },\n    {\n      '1': 'rcmd_reason',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.BadgeInfo',\n      '10': 'rcmdReason'\n    },\n    {\n      '1': 'badge_info',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.BadgeInfo',\n      '10': 'badgeInfo'\n    },\n    {'1': 'style', '3': 5, '4': 1, '5': 5, '10': 'style'},\n    {'1': 'show_rcmd_style', '3': 6, '4': 1, '5': 8, '10': 'showRcmdStyle'},\n  ],\n};\n\n/// Descriptor for `RelateCourseCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List relateCourseCardDescriptor = $convert.base64Decode(\n    'ChBSZWxhdGVDb3Vyc2VDYXJkEhoKCGR1cmF0aW9uGAEgASgDUghkdXJhdGlvbhI3CgRzdGF0GA'\n    'IgASgLMiMuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uU3RhdFIEc3RhdBJJCgtyY21k'\n    'X3JlYXNvbhgDIAEoCzIoLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLkJhZGdlSW5mb1'\n    'IKcmNtZFJlYXNvbhJHCgpiYWRnZV9pbmZvGAQgASgLMiguYmlsaWJpbGkuYXBwLnZpZXd1bml0'\n    'ZS5jb21tb24uQmFkZ2VJbmZvUgliYWRnZUluZm8SFAoFc3R5bGUYBSABKAVSBXN0eWxlEiYKD3'\n    'Nob3dfcmNtZF9zdHlsZRgGIAEoCFINc2hvd1JjbWRTdHlsZQ==');\n\n@$core.Deprecated('Use relateDislikeDescriptor instead')\nconst RelateDislike$json = {\n  '1': 'RelateDislike',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'sub_title', '3': 2, '4': 1, '5': 9, '10': 'subTitle'},\n    {'1': 'closed_sub_title', '3': 3, '4': 1, '5': 9, '10': 'closedSubTitle'},\n    {'1': 'paste_text', '3': 4, '4': 1, '5': 9, '10': 'pasteText'},\n    {'1': 'closed_paste_text', '3': 5, '4': 1, '5': 9, '10': 'closedPasteText'},\n    {\n      '1': 'dislike_reason',\n      '3': 6,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.DislikeReasons',\n      '10': 'dislikeReason'\n    },\n    {'1': 'toast', '3': 7, '4': 1, '5': 9, '10': 'toast'},\n    {'1': 'closed_toast', '3': 8, '4': 1, '5': 9, '10': 'closedToast'},\n  ],\n};\n\n/// Descriptor for `RelateDislike`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List relateDislikeDescriptor = $convert.base64Decode(\n    'Cg1SZWxhdGVEaXNsaWtlEhQKBXRpdGxlGAEgASgJUgV0aXRsZRIbCglzdWJfdGl0bGUYAiABKA'\n    'lSCHN1YlRpdGxlEigKEGNsb3NlZF9zdWJfdGl0bGUYAyABKAlSDmNsb3NlZFN1YlRpdGxlEh0K'\n    'CnBhc3RlX3RleHQYBCABKAlSCXBhc3RlVGV4dBIqChFjbG9zZWRfcGFzdGVfdGV4dBgFIAEoCV'\n    'IPY2xvc2VkUGFzdGVUZXh0ElQKDmRpc2xpa2VfcmVhc29uGAYgAygLMi0uYmlsaWJpbGkuYXBw'\n    'LnZpZXd1bml0ZS5jb21tb24uRGlzbGlrZVJlYXNvbnNSDWRpc2xpa2VSZWFzb24SFAoFdG9hc3'\n    'QYByABKAlSBXRvYXN0EiEKDGNsb3NlZF90b2FzdBgIIAEoCVILY2xvc2VkVG9hc3Q=');\n\n@$core.Deprecated('Use relateGameCardDescriptor instead')\nconst RelateGameCard$json = {\n  '1': 'RelateGameCard',\n  '2': [\n    {'1': 'reserve_status', '3': 1, '4': 1, '5': 3, '10': 'reserveStatus'},\n    {\n      '1': 'reserve_status_text',\n      '3': 2,\n      '4': 1,\n      '5': 9,\n      '10': 'reserveStatusText'\n    },\n    {'1': 'reserve', '3': 3, '4': 1, '5': 9, '10': 'reserve'},\n    {'1': 'rating', '3': 4, '4': 1, '5': 2, '10': 'rating'},\n    {'1': 'tag_name', '3': 5, '4': 1, '5': 9, '10': 'tagName'},\n    {\n      '1': 'rank_info',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.RankInfo',\n      '10': 'rankInfo'\n    },\n    {\n      '1': 'pack_info',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Button',\n      '10': 'packInfo'\n    },\n    {\n      '1': 'notice',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Button',\n      '10': 'notice'\n    },\n    {\n      '1': 'power_icon_style',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PowerIconStyle',\n      '10': 'powerIconStyle'\n    },\n    {'1': 'game_rcmd_reason', '3': 10, '4': 1, '5': 9, '10': 'gameRcmdReason'},\n    {\n      '1': 'wiki_info',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.WikiInfo',\n      '10': 'wikiInfo'\n    },\n    {\n      '1': 'badge',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.BadgeInfo',\n      '10': 'badge'\n    },\n  ],\n};\n\n/// Descriptor for `RelateGameCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List relateGameCardDescriptor = $convert.base64Decode(\n    'Cg5SZWxhdGVHYW1lQ2FyZBIlCg5yZXNlcnZlX3N0YXR1cxgBIAEoA1INcmVzZXJ2ZVN0YXR1cx'\n    'IuChNyZXNlcnZlX3N0YXR1c190ZXh0GAIgASgJUhFyZXNlcnZlU3RhdHVzVGV4dBIYCgdyZXNl'\n    'cnZlGAMgASgJUgdyZXNlcnZlEhYKBnJhdGluZxgEIAEoAlIGcmF0aW5nEhkKCHRhZ19uYW1lGA'\n    'UgASgJUgd0YWdOYW1lEkQKCXJhbmtfaW5mbxgGIAEoCzInLmJpbGliaWxpLmFwcC52aWV3dW5p'\n    'dGUuY29tbW9uLlJhbmtJbmZvUghyYW5rSW5mbxJCCglwYWNrX2luZm8YByABKAsyJS5iaWxpYm'\n    'lsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5CdXR0b25SCHBhY2tJbmZvEj0KBm5vdGljZRgIIAEo'\n    'CzIlLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLkJ1dHRvblIGbm90aWNlElcKEHBvd2'\n    'VyX2ljb25fc3R5bGUYCSABKAsyLS5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5Qb3dl'\n    'ckljb25TdHlsZVIOcG93ZXJJY29uU3R5bGUSKAoQZ2FtZV9yY21kX3JlYXNvbhgKIAEoCVIOZ2'\n    'FtZVJjbWRSZWFzb24SRAoJd2lraV9pbmZvGAsgASgLMicuYmlsaWJpbGkuYXBwLnZpZXd1bml0'\n    'ZS5jb21tb24uV2lraUluZm9SCHdpa2lJbmZvEj4KBWJhZGdlGAwgASgLMiguYmlsaWJpbGkuYX'\n    'BwLnZpZXd1bml0ZS5jb21tb24uQmFkZ2VJbmZvUgViYWRnZQ==');\n\n@$core.Deprecated('Use relateHistoryAVCardDescriptor instead')\nconst RelateHistoryAVCard$json = {\n  '1': 'RelateHistoryAVCard',\n  '2': [\n    {'1': 'duration', '3': 1, '4': 1, '5': 3, '10': 'duration'},\n    {'1': 'progress', '3': 2, '4': 1, '5': 3, '10': 'progress'},\n    {'1': 'unix', '3': 3, '4': 1, '5': 3, '10': 'unix'},\n    {'1': 'icon', '3': 4, '4': 1, '5': 9, '10': 'icon'},\n  ],\n};\n\n/// Descriptor for `RelateHistoryAVCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List relateHistoryAVCardDescriptor = $convert.base64Decode(\n    'ChNSZWxhdGVIaXN0b3J5QVZDYXJkEhoKCGR1cmF0aW9uGAEgASgDUghkdXJhdGlvbhIaCghwcm'\n    '9ncmVzcxgCIAEoA1IIcHJvZ3Jlc3MSEgoEdW5peBgDIAEoA1IEdW5peBISCgRpY29uGAQgASgJ'\n    'UgRpY29u');\n\n@$core.Deprecated('Use relateItemDescriptor instead')\nconst RelateItem$json = {\n  '1': 'RelateItem',\n  '2': [\n    {'1': 'url', '3': 1, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'cover', '3': 2, '4': 1, '5': 9, '10': 'cover'},\n    {\n      '1': 'use_default_browser',\n      '3': 3,\n      '4': 1,\n      '5': 8,\n      '10': 'useDefaultBrowser'\n    },\n  ],\n};\n\n/// Descriptor for `RelateItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List relateItemDescriptor = $convert.base64Decode(\n    'CgpSZWxhdGVJdGVtEhAKA3VybBgBIAEoCVIDdXJsEhQKBWNvdmVyGAIgASgJUgVjb3ZlchIuCh'\n    'N1c2VfZGVmYXVsdF9icm93c2VyGAMgASgIUhF1c2VEZWZhdWx0QnJvd3Nlcg==');\n\n@$core.Deprecated('Use relateLiveCardDescriptor instead')\nconst RelateLiveCard$json = {\n  '1': 'RelateLiveCard',\n  '2': [\n    {'1': 'icon_type', '3': 1, '4': 1, '5': 3, '10': 'iconType'},\n    {'1': 'area_name', '3': 2, '4': 1, '5': 9, '10': 'areaName'},\n    {'1': 'watched_show', '3': 3, '4': 1, '5': 3, '10': 'watchedShow'},\n    {'1': 'live_status', '3': 4, '4': 1, '5': 3, '10': 'liveStatus'},\n    {\n      '1': 'rcmd_reason',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.BadgeInfo',\n      '10': 'rcmdReason'\n    },\n    {'1': 'live_new_style', '3': 6, '4': 1, '5': 9, '10': 'liveNewStyle'},\n    {\n      '1': 'stat_info',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.StatInfo',\n      '10': 'statInfo'\n    },\n    {'1': 'show_rcmd_style', '3': 8, '4': 1, '5': 8, '10': 'showRcmdStyle'},\n  ],\n};\n\n/// Descriptor for `RelateLiveCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List relateLiveCardDescriptor = $convert.base64Decode(\n    'Cg5SZWxhdGVMaXZlQ2FyZBIbCglpY29uX3R5cGUYASABKANSCGljb25UeXBlEhsKCWFyZWFfbm'\n    'FtZRgCIAEoCVIIYXJlYU5hbWUSIQoMd2F0Y2hlZF9zaG93GAMgASgDUgt3YXRjaGVkU2hvdxIf'\n    'CgtsaXZlX3N0YXR1cxgEIAEoA1IKbGl2ZVN0YXR1cxJJCgtyY21kX3JlYXNvbhgFIAEoCzIoLm'\n    'JpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLkJhZGdlSW5mb1IKcmNtZFJlYXNvbhIkCg5s'\n    'aXZlX25ld19zdHlsZRgGIAEoCVIMbGl2ZU5ld1N0eWxlEkQKCXN0YXRfaW5mbxgHIAEoCzInLm'\n    'JpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLlN0YXRJbmZvUghzdGF0SW5mbxImCg9zaG93'\n    'X3JjbWRfc3R5bGUYCCABKAhSDXNob3dSY21kU3R5bGU=');\n\n@$core.Deprecated('Use relateMiniProgramCardDescriptor instead')\nconst RelateMiniProgramCard$json = {\n  '1': 'RelateMiniProgramCard',\n  '2': [\n    {\n      '1': 'stat',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Stat',\n      '10': 'stat'\n    },\n  ],\n};\n\n/// Descriptor for `RelateMiniProgramCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List relateMiniProgramCardDescriptor = $convert.base64Decode(\n    'ChVSZWxhdGVNaW5pUHJvZ3JhbUNhcmQSNwoEc3RhdBgBIAEoCzIjLmJpbGliaWxpLmFwcC52aW'\n    'V3dW5pdGUuY29tbW9uLlN0YXRSBHN0YXQ=');\n\n@$core.Deprecated('Use relateSpecialDescriptor instead')\nconst RelateSpecial$json = {\n  '1': 'RelateSpecial',\n  '2': [\n    {\n      '1': 'badge',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.BadgeInfo',\n      '10': 'badge'\n    },\n    {\n      '1': 'rcmd_reason',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.BadgeInfo',\n      '10': 'rcmdReason'\n    },\n    {'1': 'show_rcmd_style', '3': 3, '4': 1, '5': 8, '10': 'showRcmdStyle'},\n  ],\n};\n\n/// Descriptor for `RelateSpecial`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List relateSpecialDescriptor = $convert.base64Decode(\n    'Cg1SZWxhdGVTcGVjaWFsEj4KBWJhZGdlGAEgASgLMiguYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS'\n    '5jb21tb24uQmFkZ2VJbmZvUgViYWRnZRJJCgtyY21kX3JlYXNvbhgCIAEoCzIoLmJpbGliaWxp'\n    'LmFwcC52aWV3dW5pdGUuY29tbW9uLkJhZGdlSW5mb1IKcmNtZFJlYXNvbhImCg9zaG93X3JjbW'\n    'Rfc3R5bGUYAyABKAhSDXNob3dSY21kU3R5bGU=');\n\n@$core.Deprecated('Use relateTabDescriptor instead')\nconst RelateTab$json = {\n  '1': 'RelateTab',\n  '2': [\n    {'1': 'tab_category', '3': 1, '4': 1, '5': 3, '10': 'tabCategory'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n  ],\n};\n\n/// Descriptor for `RelateTab`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List relateTabDescriptor = $convert.base64Decode(\n    'CglSZWxhdGVUYWISIQoMdGFiX2NhdGVnb3J5GAEgASgDUgt0YWJDYXRlZ29yeRIUCgV0aXRsZR'\n    'gCIAEoCVIFdGl0bGU=');\n\n@$core.Deprecated('Use relateThreePointDescriptor instead')\nconst RelateThreePoint$json = {\n  '1': 'RelateThreePoint',\n  '2': [\n    {\n      '1': 'dislike',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.RelateDislike',\n      '10': 'dislike'\n    },\n    {\n      '1': 'feedback',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.RelateDislike',\n      '10': 'feedback'\n    },\n    {'1': 'watch_later', '3': 3, '4': 1, '5': 8, '10': 'watchLater'},\n    {\n      '1': 'dislike_report_data',\n      '3': 4,\n      '4': 1,\n      '5': 9,\n      '10': 'dislikeReportData'\n    },\n  ],\n};\n\n/// Descriptor for `RelateThreePoint`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List relateThreePointDescriptor = $convert.base64Decode(\n    'ChBSZWxhdGVUaHJlZVBvaW50EkYKB2Rpc2xpa2UYASABKAsyLC5iaWxpYmlsaS5hcHAudmlld3'\n    'VuaXRlLmNvbW1vbi5SZWxhdGVEaXNsaWtlUgdkaXNsaWtlEkgKCGZlZWRiYWNrGAIgASgLMiwu'\n    'YmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uUmVsYXRlRGlzbGlrZVIIZmVlZGJhY2sSHw'\n    'oLd2F0Y2hfbGF0ZXIYAyABKAhSCndhdGNoTGF0ZXISLgoTZGlzbGlrZV9yZXBvcnRfZGF0YRgE'\n    'IAEoCVIRZGlzbGlrZVJlcG9ydERhdGE=');\n\n@$core.Deprecated('Use relatedAICardDescriptor instead')\nconst RelatedAICard$json = {\n  '1': 'RelatedAICard',\n  '2': [\n    {'1': 'aid', '3': 1, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'duration', '3': 2, '4': 1, '5': 3, '10': 'duration'},\n    {\n      '1': 'up_info',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Staff',\n      '10': 'upInfo'\n    },\n    {\n      '1': 'stat',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Stat',\n      '10': 'stat'\n    },\n    {\n      '1': 'report',\n      '3': 5,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.RelatedAICard.ReportEntry',\n      '10': 'report'\n    },\n    {'1': 'goto_type', '3': 6, '4': 1, '5': 9, '10': 'gotoType'},\n  ],\n  '3': [RelatedAICard_ReportEntry$json],\n};\n\n@$core.Deprecated('Use relatedAICardDescriptor instead')\nconst RelatedAICard_ReportEntry$json = {\n  '1': 'ReportEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `RelatedAICard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List relatedAICardDescriptor = $convert.base64Decode(\n    'Cg1SZWxhdGVkQUlDYXJkEhAKA2FpZBgBIAEoA1IDYWlkEhoKCGR1cmF0aW9uGAIgASgDUghkdX'\n    'JhdGlvbhI9Cgd1cF9pbmZvGAMgASgLMiQuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24u'\n    'U3RhZmZSBnVwSW5mbxI3CgRzdGF0GAQgASgLMiMuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb2'\n    '1tb24uU3RhdFIEc3RhdBJQCgZyZXBvcnQYBSADKAsyOC5iaWxpYmlsaS5hcHAudmlld3VuaXRl'\n    'LmNvbW1vbi5SZWxhdGVkQUlDYXJkLlJlcG9ydEVudHJ5UgZyZXBvcnQSGwoJZ290b190eXBlGA'\n    'YgASgJUghnb3RvVHlwZRo5CgtSZXBvcnRFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1'\n    'ZRgCIAEoCVIFdmFsdWU6AjgB');\n\n@$core.Deprecated('Use relatesDescriptor instead')\nconst Relates$json = {\n  '1': 'Relates',\n  '2': [\n    {\n      '1': 'cards',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.RelateCard',\n      '10': 'cards'\n    },\n    {\n      '1': 'config',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.RelateConfig',\n      '10': 'config'\n    },\n    {\n      '1': 'tab',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.RelateTab',\n      '10': 'tab'\n    },\n  ],\n};\n\n/// Descriptor for `Relates`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List relatesDescriptor = $convert.base64Decode(\n    'CgdSZWxhdGVzEj8KBWNhcmRzGAEgAygLMikuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb2'\n    '4uUmVsYXRlQ2FyZFIFY2FyZHMSQwoGY29uZmlnGAIgASgLMisuYmlsaWJpbGkuYXBwLnZpZXd1'\n    'bml0ZS5jb21tb24uUmVsYXRlQ29uZmlnUgZjb25maWcSOgoDdGFiGAMgAygLMiguYmlsaWJpbG'\n    'kuYXBwLnZpZXd1bml0ZS5jb21tb24uUmVsYXRlVGFiUgN0YWI=');\n\n@$core.Deprecated('Use reserveButtonDescriptor instead')\nconst ReserveButton$json = {\n  '1': 'ReserveButton',\n  '2': [\n    {\n      '1': 'reserve',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.BizReserveActivityParam',\n      '9': 0,\n      '10': 'reserve'\n    },\n    {\n      '1': 'fav',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.BizFavParam',\n      '9': 0,\n      '10': 'fav'\n    },\n    {'1': 'status', '3': 1, '4': 1, '5': 8, '10': 'status'},\n    {'1': 'text', '3': 3, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'selected_text', '3': 4, '4': 1, '5': 9, '10': 'selectedText'},\n    {\n      '1': 'order_type',\n      '3': 7,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.common.ReserveBizType',\n      '10': 'orderType'\n    },\n  ],\n  '8': [\n    {'1': 'order_param'},\n  ],\n};\n\n/// Descriptor for `ReserveButton`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reserveButtonDescriptor = $convert.base64Decode(\n    'Cg1SZXNlcnZlQnV0dG9uElIKB3Jlc2VydmUYCCABKAsyNi5iaWxpYmlsaS5hcHAudmlld3VuaX'\n    'RlLmNvbW1vbi5CaXpSZXNlcnZlQWN0aXZpdHlQYXJhbUgAUgdyZXNlcnZlEj4KA2ZhdhgJIAEo'\n    'CzIqLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLkJpekZhdlBhcmFtSABSA2ZhdhIWCg'\n    'ZzdGF0dXMYASABKAhSBnN0YXR1cxISCgR0ZXh0GAMgASgJUgR0ZXh0EiMKDXNlbGVjdGVkX3Rl'\n    'eHQYBCABKAlSDHNlbGVjdGVkVGV4dBJMCgpvcmRlcl90eXBlGAcgASgOMi0uYmlsaWJpbGkuYX'\n    'BwLnZpZXd1bml0ZS5jb21tb24uUmVzZXJ2ZUJpelR5cGVSCW9yZGVyVHlwZUINCgtvcmRlcl9w'\n    'YXJhbQ==');\n\n@$core.Deprecated('Use reserveCalendarInfoDescriptor instead')\nconst ReserveCalendarInfo$json = {\n  '1': 'ReserveCalendarInfo',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'start_ts', '3': 2, '4': 1, '5': 3, '10': 'startTs'},\n    {'1': 'end_ts', '3': 3, '4': 1, '5': 3, '10': 'endTs'},\n    {'1': 'description', '3': 4, '4': 1, '5': 9, '10': 'description'},\n    {'1': 'business_id', '3': 5, '4': 1, '5': 9, '10': 'businessId'},\n  ],\n};\n\n/// Descriptor for `ReserveCalendarInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reserveCalendarInfoDescriptor = $convert.base64Decode(\n    'ChNSZXNlcnZlQ2FsZW5kYXJJbmZvEhQKBXRpdGxlGAEgASgJUgV0aXRsZRIZCghzdGFydF90cx'\n    'gCIAEoA1IHc3RhcnRUcxIVCgZlbmRfdHMYAyABKANSBWVuZFRzEiAKC2Rlc2NyaXB0aW9uGAQg'\n    'ASgJUgtkZXNjcmlwdGlvbhIfCgtidXNpbmVzc19pZBgFIAEoCVIKYnVzaW5lc3NJZA==');\n\n@$core.Deprecated('Use rightsDescriptor instead')\nconst Rights$json = {\n  '1': 'Rights',\n  '2': [\n    {'1': 'allow_download', '3': 1, '4': 1, '5': 5, '10': 'allowDownload'},\n    {'1': 'allow_review', '3': 2, '4': 1, '5': 5, '10': 'allowReview'},\n    {'1': 'can_watch', '3': 3, '4': 1, '5': 5, '10': 'canWatch'},\n    {'1': 'resource', '3': 4, '4': 1, '5': 9, '10': 'resource'},\n    {'1': 'allow_dm', '3': 5, '4': 1, '5': 5, '10': 'allowDm'},\n    {'1': 'allow_demand', '3': 6, '4': 1, '5': 5, '10': 'allowDemand'},\n    {'1': 'area_limit', '3': 7, '4': 1, '5': 5, '10': 'areaLimit'},\n  ],\n};\n\n/// Descriptor for `Rights`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rightsDescriptor = $convert.base64Decode(\n    'CgZSaWdodHMSJQoOYWxsb3dfZG93bmxvYWQYASABKAVSDWFsbG93RG93bmxvYWQSIQoMYWxsb3'\n    'dfcmV2aWV3GAIgASgFUgthbGxvd1JldmlldxIbCgljYW5fd2F0Y2gYAyABKAVSCGNhbldhdGNo'\n    'EhoKCHJlc291cmNlGAQgASgJUghyZXNvdXJjZRIZCghhbGxvd19kbRgFIAEoBVIHYWxsb3dEbR'\n    'IhCgxhbGxvd19kZW1hbmQYBiABKAVSC2FsbG93RGVtYW5kEh0KCmFyZWFfbGltaXQYByABKAVS'\n    'CWFyZWFMaW1pdA==');\n\n@$core.Deprecated('Use seasonHeadDescriptor instead')\nconst SeasonHead$json = {\n  '1': 'SeasonHead',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'intro', '3': 2, '4': 1, '5': 9, '10': 'intro'},\n    {\n      '1': 'vt',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.StatInfo',\n      '10': 'vt'\n    },\n    {\n      '1': 'danmaku',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.StatInfo',\n      '10': 'danmaku'\n    },\n  ],\n};\n\n/// Descriptor for `SeasonHead`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List seasonHeadDescriptor = $convert.base64Decode(\n    'CgpTZWFzb25IZWFkEhQKBXRpdGxlGAEgASgJUgV0aXRsZRIUCgVpbnRybxgCIAEoCVIFaW50cm'\n    '8SNwoCdnQYAyABKAsyJy5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5TdGF0SW5mb1IC'\n    'dnQSQQoHZGFubWFrdRgEIAEoCzInLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLlN0YX'\n    'RJbmZvUgdkYW5tYWt1');\n\n@$core.Deprecated('Use seasonShowDescriptor instead')\nconst SeasonShow$json = {\n  '1': 'SeasonShow',\n  '2': [\n    {'1': 'button_text', '3': 1, '4': 1, '5': 9, '10': 'buttonText'},\n    {'1': 'join_text', '3': 2, '4': 1, '5': 9, '10': 'joinText'},\n    {'1': 'rule_text', '3': 3, '4': 1, '5': 9, '10': 'ruleText'},\n    {'1': 'checkin_text', '3': 4, '4': 1, '5': 9, '10': 'checkinText'},\n    {'1': 'checkin_prompt', '3': 5, '4': 1, '5': 9, '10': 'checkinPrompt'},\n  ],\n};\n\n/// Descriptor for `SeasonShow`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List seasonShowDescriptor = $convert.base64Decode(\n    'CgpTZWFzb25TaG93Eh8KC2J1dHRvbl90ZXh0GAEgASgJUgpidXR0b25UZXh0EhsKCWpvaW5fdG'\n    'V4dBgCIAEoCVIIam9pblRleHQSGwoJcnVsZV90ZXh0GAMgASgJUghydWxlVGV4dBIhCgxjaGVj'\n    'a2luX3RleHQYBCABKAlSC2NoZWNraW5UZXh0EiUKDmNoZWNraW5fcHJvbXB0GAUgASgJUg1jaG'\n    'Vja2luUHJvbXB0');\n\n@$core.Deprecated('Use sectionDataDescriptor instead')\nconst SectionData$json = {\n  '1': 'SectionData',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 5, '10': 'id'},\n    {'1': 'section_id', '3': 2, '4': 1, '5': 5, '10': 'sectionId'},\n    {'1': 'title', '3': 3, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'can_ord_desc', '3': 4, '4': 1, '5': 5, '10': 'canOrdDesc'},\n    {'1': 'more', '3': 5, '4': 1, '5': 9, '10': 'more'},\n    {'1': 'episode_ids', '3': 6, '4': 3, '5': 5, '10': 'episodeIds'},\n    {\n      '1': 'episodes',\n      '3': 7,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.ViewEpisode',\n      '10': 'episodes'\n    },\n    {'1': 'split_text', '3': 8, '4': 1, '5': 9, '10': 'splitText'},\n    {\n      '1': 'module_style',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Style',\n      '10': 'moduleStyle'\n    },\n    {'1': 'more_bottom_desc', '3': 10, '4': 1, '5': 9, '10': 'moreBottomDesc'},\n    {\n      '1': 'seasons',\n      '3': 11,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.SerialSeason',\n      '10': 'seasons'\n    },\n    {\n      '1': 'more_left',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Button',\n      '10': 'moreLeft'\n    },\n    {'1': 'type', '3': 13, '4': 1, '5': 5, '10': 'type'},\n    {\n      '1': 'report',\n      '3': 14,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.SectionData.ReportEntry',\n      '10': 'report'\n    },\n    {\n      '1': 'bg_info',\n      '3': 15,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.EpBgInfo',\n      '10': 'bgInfo'\n    },\n  ],\n  '3': [SectionData_ReportEntry$json],\n};\n\n@$core.Deprecated('Use sectionDataDescriptor instead')\nconst SectionData_ReportEntry$json = {\n  '1': 'ReportEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `SectionData`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sectionDataDescriptor = $convert.base64Decode(\n    'CgtTZWN0aW9uRGF0YRIOCgJpZBgBIAEoBVICaWQSHQoKc2VjdGlvbl9pZBgCIAEoBVIJc2VjdG'\n    'lvbklkEhQKBXRpdGxlGAMgASgJUgV0aXRsZRIgCgxjYW5fb3JkX2Rlc2MYBCABKAVSCmNhbk9y'\n    'ZERlc2MSEgoEbW9yZRgFIAEoCVIEbW9yZRIfCgtlcGlzb2RlX2lkcxgGIAMoBVIKZXBpc29kZU'\n    'lkcxJGCghlcGlzb2RlcxgHIAMoCzIqLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLlZp'\n    'ZXdFcGlzb2RlUghlcGlzb2RlcxIdCgpzcGxpdF90ZXh0GAggASgJUglzcGxpdFRleHQSRwoMbW'\n    '9kdWxlX3N0eWxlGAkgASgLMiQuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uU3R5bGVS'\n    'C21vZHVsZVN0eWxlEigKEG1vcmVfYm90dG9tX2Rlc2MYCiABKAlSDm1vcmVCb3R0b21EZXNjEk'\n    'UKB3NlYXNvbnMYCyADKAsyKy5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5TZXJpYWxT'\n    'ZWFzb25SB3NlYXNvbnMSQgoJbW9yZV9sZWZ0GAwgASgLMiUuYmlsaWJpbGkuYXBwLnZpZXd1bm'\n    'l0ZS5jb21tb24uQnV0dG9uUghtb3JlTGVmdBISCgR0eXBlGA0gASgFUgR0eXBlEk4KBnJlcG9y'\n    'dBgOIAMoCzI2LmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLlNlY3Rpb25EYXRhLlJlcG'\n    '9ydEVudHJ5UgZyZXBvcnQSQAoHYmdfaW5mbxgPIAEoCzInLmJpbGliaWxpLmFwcC52aWV3dW5p'\n    'dGUuY29tbW9uLkVwQmdJbmZvUgZiZ0luZm8aOQoLUmVwb3J0RW50cnkSEAoDa2V5GAEgASgJUg'\n    'NrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4AQ==');\n\n@$core.Deprecated('Use serialSeasonDescriptor instead')\nconst SerialSeason$json = {\n  '1': 'SerialSeason',\n  '2': [\n    {'1': 'season_id', '3': 1, '4': 1, '5': 5, '10': 'seasonId'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'season_title', '3': 3, '4': 1, '5': 9, '10': 'seasonTitle'},\n    {'1': 'is_new', '3': 4, '4': 1, '5': 5, '10': 'isNew'},\n    {'1': 'cover', '3': 5, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'badge', '3': 6, '4': 1, '5': 9, '10': 'badge'},\n    {'1': 'badge_type', '3': 7, '4': 1, '5': 5, '10': 'badgeType'},\n    {\n      '1': 'badge_info',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.BadgeInfo',\n      '10': 'badgeInfo'\n    },\n    {'1': 'link', '3': 9, '4': 1, '5': 9, '10': 'link'},\n    {'1': 'resource', '3': 10, '4': 1, '5': 9, '10': 'resource'},\n    {\n      '1': 'new_ep',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.NewEp',\n      '10': 'newEp'\n    },\n    {\n      '1': 'report',\n      '3': 12,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.SerialSeason.ReportEntry',\n      '10': 'report'\n    },\n  ],\n  '3': [SerialSeason_ReportEntry$json],\n};\n\n@$core.Deprecated('Use serialSeasonDescriptor instead')\nconst SerialSeason_ReportEntry$json = {\n  '1': 'ReportEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `SerialSeason`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List serialSeasonDescriptor = $convert.base64Decode(\n    'CgxTZXJpYWxTZWFzb24SGwoJc2Vhc29uX2lkGAEgASgFUghzZWFzb25JZBIUCgV0aXRsZRgCIA'\n    'EoCVIFdGl0bGUSIQoMc2Vhc29uX3RpdGxlGAMgASgJUgtzZWFzb25UaXRsZRIVCgZpc19uZXcY'\n    'BCABKAVSBWlzTmV3EhQKBWNvdmVyGAUgASgJUgVjb3ZlchIUCgViYWRnZRgGIAEoCVIFYmFkZ2'\n    'USHQoKYmFkZ2VfdHlwZRgHIAEoBVIJYmFkZ2VUeXBlEkcKCmJhZGdlX2luZm8YCCABKAsyKC5i'\n    'aWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5CYWRnZUluZm9SCWJhZGdlSW5mbxISCgRsaW'\n    '5rGAkgASgJUgRsaW5rEhoKCHJlc291cmNlGAogASgJUghyZXNvdXJjZRI7CgZuZXdfZXAYCyAB'\n    'KAsyJC5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5OZXdFcFIFbmV3RXASTwoGcmVwb3'\n    'J0GAwgAygLMjcuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uU2VyaWFsU2Vhc29uLlJl'\n    'cG9ydEVudHJ5UgZyZXBvcnQaOQoLUmVwb3J0RW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdm'\n    'FsdWUYAiABKAlSBXZhbHVlOgI4AQ==');\n\n@$core.Deprecated('Use skipRangeDescriptor instead')\nconst SkipRange$json = {\n  '1': 'SkipRange',\n  '2': [\n    {'1': 'start', '3': 1, '4': 1, '5': 5, '10': 'start'},\n    {'1': 'end', '3': 2, '4': 1, '5': 5, '10': 'end'},\n  ],\n};\n\n/// Descriptor for `SkipRange`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List skipRangeDescriptor = $convert.base64Decode(\n    'CglTa2lwUmFuZ2USFAoFc3RhcnQYASABKAVSBXN0YXJ0EhAKA2VuZBgCIAEoBVIDZW5k');\n\n@$core.Deprecated('Use specialCellDescriptor instead')\nconst SpecialCell$json = {\n  '1': 'SpecialCell',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'icon_night', '3': 2, '4': 1, '5': 9, '10': 'iconNight'},\n    {'1': 'text', '3': 3, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'text_color', '3': 4, '4': 1, '5': 9, '10': 'textColor'},\n    {'1': 'text_color_night', '3': 5, '4': 1, '5': 9, '10': 'textColorNight'},\n    {'1': 'jump_url', '3': 6, '4': 1, '5': 9, '10': 'jumpUrl'},\n    {'1': 'cell_type', '3': 7, '4': 1, '5': 9, '10': 'cellType'},\n    {'1': 'cell_bgcolor', '3': 8, '4': 1, '5': 9, '10': 'cellBgcolor'},\n    {\n      '1': 'cell_bgcolor_night',\n      '3': 9,\n      '4': 1,\n      '5': 9,\n      '10': 'cellBgcolorNight'\n    },\n    {'1': 'param', '3': 10, '4': 1, '5': 9, '10': 'param'},\n    {'1': 'page_title', '3': 11, '4': 1, '5': 9, '10': 'pageTitle'},\n    {'1': 'jump_type', '3': 12, '4': 1, '5': 9, '10': 'jumpType'},\n    {'1': 'end_icon', '3': 13, '4': 1, '5': 9, '10': 'endIcon'},\n    {'1': 'end_icon_night', '3': 14, '4': 1, '5': 9, '10': 'endIconNight'},\n    {\n      '1': 'cell_fluid',\n      '3': 15,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.CellFluid',\n      '10': 'cellFluid'\n    },\n    {\n      '1': 'report',\n      '3': 16,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.SpecialCell.ReportEntry',\n      '10': 'report'\n    },\n  ],\n  '3': [SpecialCell_ReportEntry$json],\n};\n\n@$core.Deprecated('Use specialCellDescriptor instead')\nconst SpecialCell_ReportEntry$json = {\n  '1': 'ReportEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `SpecialCell`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List specialCellDescriptor = $convert.base64Decode(\n    'CgtTcGVjaWFsQ2VsbBISCgRpY29uGAEgASgJUgRpY29uEh0KCmljb25fbmlnaHQYAiABKAlSCW'\n    'ljb25OaWdodBISCgR0ZXh0GAMgASgJUgR0ZXh0Eh0KCnRleHRfY29sb3IYBCABKAlSCXRleHRD'\n    'b2xvchIoChB0ZXh0X2NvbG9yX25pZ2h0GAUgASgJUg50ZXh0Q29sb3JOaWdodBIZCghqdW1wX3'\n    'VybBgGIAEoCVIHanVtcFVybBIbCgljZWxsX3R5cGUYByABKAlSCGNlbGxUeXBlEiEKDGNlbGxf'\n    'Ymdjb2xvchgIIAEoCVILY2VsbEJnY29sb3ISLAoSY2VsbF9iZ2NvbG9yX25pZ2h0GAkgASgJUh'\n    'BjZWxsQmdjb2xvck5pZ2h0EhQKBXBhcmFtGAogASgJUgVwYXJhbRIdCgpwYWdlX3RpdGxlGAsg'\n    'ASgJUglwYWdlVGl0bGUSGwoJanVtcF90eXBlGAwgASgJUghqdW1wVHlwZRIZCghlbmRfaWNvbh'\n    'gNIAEoCVIHZW5kSWNvbhIkCg5lbmRfaWNvbl9uaWdodBgOIAEoCVIMZW5kSWNvbk5pZ2h0EkcK'\n    'CmNlbGxfZmx1aWQYDyABKAsyKC5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5DZWxsRm'\n    'x1aWRSCWNlbGxGbHVpZBJOCgZyZXBvcnQYECADKAsyNi5iaWxpYmlsaS5hcHAudmlld3VuaXRl'\n    'LmNvbW1vbi5TcGVjaWFsQ2VsbC5SZXBvcnRFbnRyeVIGcmVwb3J0GjkKC1JlcG9ydEVudHJ5Eh'\n    'AKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAE=');\n\n@$core.Deprecated('Use specialTagDescriptor instead')\nconst SpecialTag$json = {\n  '1': 'SpecialTag',\n  '2': [\n    {\n      '1': 'special_cell',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.SpecialCell',\n      '10': 'specialCell'\n    },\n    {'1': 'refresh', '3': 2, '4': 1, '5': 8, '10': 'refresh'},\n  ],\n};\n\n/// Descriptor for `SpecialTag`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List specialTagDescriptor = $convert.base64Decode(\n    'CgpTcGVjaWFsVGFnEk0KDHNwZWNpYWxfY2VsbBgBIAMoCzIqLmJpbGliaWxpLmFwcC52aWV3dW'\n    '5pdGUuY29tbW9uLlNwZWNpYWxDZWxsUgtzcGVjaWFsQ2VsbBIYCgdyZWZyZXNoGAIgASgIUgdy'\n    'ZWZyZXNo');\n\n@$core.Deprecated('Use sponsorDescriptor instead')\nconst Sponsor$json = {\n  '1': 'Sponsor',\n  '2': [\n    {'1': 'total', '3': 1, '4': 1, '5': 3, '10': 'total'},\n    {'1': 'week', '3': 2, '4': 1, '5': 3, '10': 'week'},\n    {\n      '1': 'rank_list',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.SponsorRank',\n      '10': 'rankList'\n    },\n    {\n      '1': 'mine',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Mine',\n      '10': 'mine'\n    },\n    {\n      '1': 'point_activity',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.PointActivity',\n      '10': 'pointActivity'\n    },\n    {\n      '1': 'pendants',\n      '3': 6,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Pendant',\n      '10': 'pendants'\n    },\n    {\n      '1': 'threshold',\n      '3': 7,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Threshold',\n      '10': 'threshold'\n    },\n  ],\n};\n\n/// Descriptor for `Sponsor`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sponsorDescriptor = $convert.base64Decode(\n    'CgdTcG9uc29yEhQKBXRvdGFsGAEgASgDUgV0b3RhbBISCgR3ZWVrGAIgASgDUgR3ZWVrEkcKCX'\n    'JhbmtfbGlzdBgDIAMoCzIqLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLlNwb25zb3JS'\n    'YW5rUghyYW5rTGlzdBI3CgRtaW5lGAQgASgLMiMuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb2'\n    '1tb24uTWluZVIEbWluZRJTCg5wb2ludF9hY3Rpdml0eRgFIAEoCzIsLmJpbGliaWxpLmFwcC52'\n    'aWV3dW5pdGUuY29tbW9uLlBvaW50QWN0aXZpdHlSDXBvaW50QWN0aXZpdHkSQgoIcGVuZGFudH'\n    'MYBiADKAsyJi5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5QZW5kYW50UghwZW5kYW50'\n    'cxJGCgl0aHJlc2hvbGQYByADKAsyKC5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5UaH'\n    'Jlc2hvbGRSCXRocmVzaG9sZA==');\n\n@$core.Deprecated('Use sponsorRankDescriptor instead')\nconst SponsorRank$json = {\n  '1': 'SponsorRank',\n  '2': [\n    {'1': 'uid', '3': 1, '4': 1, '5': 3, '10': 'uid'},\n    {'1': 'msg', '3': 2, '4': 1, '5': 9, '10': 'msg'},\n    {'1': 'uname', '3': 3, '4': 1, '5': 9, '10': 'uname'},\n    {'1': 'face', '3': 4, '4': 1, '5': 9, '10': 'face'},\n    {\n      '1': 'vip',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Vip',\n      '10': 'vip'\n    },\n  ],\n};\n\n/// Descriptor for `SponsorRank`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sponsorRankDescriptor = $convert.base64Decode(\n    'CgtTcG9uc29yUmFuaxIQCgN1aWQYASABKANSA3VpZBIQCgNtc2cYAiABKAlSA21zZxIUCgV1bm'\n    'FtZRgDIAEoCVIFdW5hbWUSEgoEZmFjZRgEIAEoCVIEZmFjZRI0CgN2aXAYBSABKAsyIi5iaWxp'\n    'YmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5WaXBSA3ZpcA==');\n\n@$core.Deprecated('Use staffDescriptor instead')\nconst Staff$json = {\n  '1': 'Staff',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'attention', '3': 2, '4': 1, '5': 5, '10': 'attention'},\n    {'1': 'title', '3': 3, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'name', '3': 4, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'face', '3': 5, '4': 1, '5': 9, '10': 'face'},\n    {\n      '1': 'official',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.OfficialVerify',\n      '10': 'official'\n    },\n    {\n      '1': 'vip',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Vip',\n      '10': 'vip'\n    },\n    {'1': 'label_style', '3': 8, '4': 1, '5': 5, '10': 'labelStyle'},\n    {'1': 'fans', '3': 9, '4': 1, '5': 9, '10': 'fans'},\n    {\n      '1': 'name_render',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.account.service.v1.NameRender',\n      '10': 'nameRender'\n    },\n  ],\n};\n\n/// Descriptor for `Staff`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List staffDescriptor = $convert.base64Decode(\n    'CgVTdGFmZhIQCgNtaWQYASABKANSA21pZBIcCglhdHRlbnRpb24YAiABKAVSCWF0dGVudGlvbh'\n    'IUCgV0aXRsZRgDIAEoCVIFdGl0bGUSEgoEbmFtZRgEIAEoCVIEbmFtZRISCgRmYWNlGAUgASgJ'\n    'UgRmYWNlEkkKCG9mZmljaWFsGAYgASgLMi0uYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb2'\n    '4uT2ZmaWNpYWxWZXJpZnlSCG9mZmljaWFsEjQKA3ZpcBgHIAEoCzIiLmJpbGliaWxpLmFwcC52'\n    'aWV3dW5pdGUuY29tbW9uLlZpcFIDdmlwEh8KC2xhYmVsX3N0eWxlGAggASgFUgpsYWJlbFN0eW'\n    'xlEhIKBGZhbnMYCSABKAlSBGZhbnMSSAoLbmFtZV9yZW5kZXIYCiABKAsyJy5iaWxpYmlsaS5h'\n    'Y2NvdW50LnNlcnZpY2UudjEuTmFtZVJlbmRlclIKbmFtZVJlbmRlcg==');\n\n@$core.Deprecated('Use staffsDescriptor instead')\nconst Staffs$json = {\n  '1': 'Staffs',\n  '2': [\n    {\n      '1': 'staff',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Staff',\n      '10': 'staff'\n    },\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n  ],\n};\n\n/// Descriptor for `Staffs`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List staffsDescriptor = $convert.base64Decode(\n    'CgZTdGFmZnMSOgoFc3RhZmYYASADKAsyJC5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi'\n    '5TdGFmZlIFc3RhZmYSFAoFdGl0bGUYAiABKAlSBXRpdGxl');\n\n@$core.Deprecated('Use starRailDescriptor instead')\nconst StarRail$json = {\n  '1': 'StarRail',\n  '2': [\n    {'1': 'season_id', '3': 1, '4': 1, '5': 3, '10': 'seasonId'},\n    {'1': 'aid', '3': 2, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'cid', '3': 3, '4': 1, '5': 3, '10': 'cid'},\n    {'1': 'open_time', '3': 4, '4': 1, '5': 3, '10': 'openTime'},\n    {'1': 'status', '3': 5, '4': 1, '5': 5, '10': 'status'},\n    {'1': 'pic1', '3': 6, '4': 1, '5': 9, '10': 'pic1'},\n    {'1': 'pic2', '3': 7, '4': 1, '5': 9, '10': 'pic2'},\n    {'1': 'pic3', '3': 8, '4': 1, '5': 9, '10': 'pic3'},\n    {'1': 'pic4', '3': 9, '4': 1, '5': 9, '10': 'pic4'},\n    {'1': 'pic5', '3': 10, '4': 1, '5': 9, '10': 'pic5'},\n  ],\n};\n\n/// Descriptor for `StarRail`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List starRailDescriptor = $convert.base64Decode(\n    'CghTdGFyUmFpbBIbCglzZWFzb25faWQYASABKANSCHNlYXNvbklkEhAKA2FpZBgCIAEoA1IDYW'\n    'lkEhAKA2NpZBgDIAEoA1IDY2lkEhsKCW9wZW5fdGltZRgEIAEoA1IIb3BlblRpbWUSFgoGc3Rh'\n    'dHVzGAUgASgFUgZzdGF0dXMSEgoEcGljMRgGIAEoCVIEcGljMRISCgRwaWMyGAcgASgJUgRwaW'\n    'MyEhIKBHBpYzMYCCABKAlSBHBpYzMSEgoEcGljNBgJIAEoCVIEcGljNBISCgRwaWM1GAogASgJ'\n    'UgRwaWM1');\n\n@$core.Deprecated('Use statDescriptor instead')\nconst Stat$json = {\n  '1': 'Stat',\n  '2': [\n    {\n      '1': 'vt',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.StatInfo',\n      '10': 'vt'\n    },\n    {\n      '1': 'danmaku',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.StatInfo',\n      '10': 'danmaku'\n    },\n    {'1': 'reply', '3': 3, '4': 1, '5': 3, '10': 'reply'},\n    {'1': 'fav', '3': 4, '4': 1, '5': 3, '10': 'fav'},\n    {'1': 'coin', '3': 5, '4': 1, '5': 3, '10': 'coin'},\n    {'1': 'share', '3': 6, '4': 1, '5': 3, '10': 'share'},\n    {'1': 'like', '3': 7, '4': 1, '5': 3, '10': 'like'},\n    {'1': 'follow', '3': 8, '4': 1, '5': 3, '10': 'follow'},\n  ],\n};\n\n/// Descriptor for `Stat`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List statDescriptor = $convert.base64Decode(\n    'CgRTdGF0EjcKAnZ0GAEgASgLMicuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uU3RhdE'\n    'luZm9SAnZ0EkEKB2Rhbm1ha3UYAiABKAsyJy5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1v'\n    'bi5TdGF0SW5mb1IHZGFubWFrdRIUCgVyZXBseRgDIAEoA1IFcmVwbHkSEAoDZmF2GAQgASgDUg'\n    'NmYXYSEgoEY29pbhgFIAEoA1IEY29pbhIUCgVzaGFyZRgGIAEoA1IFc2hhcmUSEgoEbGlrZRgH'\n    'IAEoA1IEbGlrZRIWCgZmb2xsb3cYCCABKANSBmZvbGxvdw==');\n\n@$core.Deprecated('Use statInfoDescriptor instead')\nconst StatInfo$json = {\n  '1': 'StatInfo',\n  '2': [\n    {'1': 'value', '3': 1, '4': 1, '5': 3, '10': 'value'},\n    {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'pure_text', '3': 3, '4': 1, '5': 9, '10': 'pureText'},\n    {'1': 'icon', '3': 4, '4': 1, '5': 9, '10': 'icon'},\n  ],\n};\n\n/// Descriptor for `StatInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List statInfoDescriptor = $convert.base64Decode(\n    'CghTdGF0SW5mbxIUCgV2YWx1ZRgBIAEoA1IFdmFsdWUSEgoEdGV4dBgCIAEoCVIEdGV4dBIbCg'\n    'lwdXJlX3RleHQYAyABKAlSCHB1cmVUZXh0EhIKBGljb24YBCABKAlSBGljb24=');\n\n@$core.Deprecated('Use styleDescriptor instead')\nconst Style$json = {\n  '1': 'Style',\n  '2': [\n    {'1': 'line', '3': 1, '4': 1, '5': 5, '10': 'line'},\n    {'1': 'hidden', '3': 2, '4': 1, '5': 5, '10': 'hidden'},\n    {'1': 'show_pages', '3': 3, '4': 3, '5': 9, '10': 'showPages'},\n  ],\n};\n\n/// Descriptor for `Style`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List styleDescriptor = $convert.base64Decode(\n    'CgVTdHlsZRISCgRsaW5lGAEgASgFUgRsaW5lEhYKBmhpZGRlbhgCIAEoBVIGaGlkZGVuEh0KCn'\n    'Nob3dfcGFnZXMYAyADKAlSCXNob3dQYWdlcw==');\n\n@$core.Deprecated('Use tagDescriptor instead')\nconst Tag$json = {\n  '1': 'Tag',\n  '2': [\n    {'1': 'tag_id', '3': 1, '4': 1, '5': 3, '10': 'tagId'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'uri', '3': 3, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'tag_type', '3': 4, '4': 1, '5': 9, '10': 'tagType'},\n  ],\n};\n\n/// Descriptor for `Tag`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List tagDescriptor = $convert.base64Decode(\n    'CgNUYWcSFQoGdGFnX2lkGAEgASgDUgV0YWdJZBISCgRuYW1lGAIgASgJUgRuYW1lEhAKA3VyaR'\n    'gDIAEoCVIDdXJpEhkKCHRhZ190eXBlGAQgASgJUgd0YWdUeXBl');\n\n@$core.Deprecated('Use textWidgetDescriptor instead')\nconst TextWidget$json = {\n  '1': 'TextWidget',\n  '2': [\n    {'1': 'code', '3': 1, '4': 1, '5': 9, '10': 'code'},\n    {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'text_color', '3': 3, '4': 1, '5': 9, '10': 'textColor'},\n    {'1': 'bg_color', '3': 4, '4': 1, '5': 9, '10': 'bgColor'},\n  ],\n};\n\n/// Descriptor for `TextWidget`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List textWidgetDescriptor = $convert.base64Decode(\n    'CgpUZXh0V2lkZ2V0EhIKBGNvZGUYASABKAlSBGNvZGUSEgoEdGV4dBgCIAEoCVIEdGV4dBIdCg'\n    'p0ZXh0X2NvbG9yGAMgASgJUgl0ZXh0Q29sb3ISGQoIYmdfY29sb3IYBCABKAlSB2JnQ29sb3I=');\n\n@$core.Deprecated('Use theatreHotTopicDescriptor instead')\nconst TheatreHotTopic$json = {\n  '1': 'TheatreHotTopic',\n  '2': [\n    {'1': 'theatre_id', '3': 1, '4': 1, '5': 3, '10': 'theatreId'},\n    {'1': 'theatre_set_id', '3': 2, '4': 1, '5': 3, '10': 'theatreSetId'},\n    {'1': 'theatre_title', '3': 3, '4': 1, '5': 9, '10': 'theatreTitle'},\n    {\n      '1': 'background_image_url',\n      '3': 4,\n      '4': 1,\n      '5': 9,\n      '10': 'backgroundImageUrl'\n    },\n    {'1': 'theatre_url', '3': 5, '4': 1, '5': 9, '10': 'theatreUrl'},\n    {'1': 'hot_topic_id', '3': 6, '4': 1, '5': 3, '10': 'hotTopicId'},\n    {'1': 'hot_topic_set_id', '3': 7, '4': 1, '5': 3, '10': 'hotTopicSetId'},\n    {'1': 'hot_topic_title', '3': 8, '4': 1, '5': 9, '10': 'hotTopicTitle'},\n    {'1': 'hot_topic_url', '3': 9, '4': 1, '5': 9, '10': 'hotTopicUrl'},\n    {'1': 'is_subscribe', '3': 10, '4': 1, '5': 5, '10': 'isSubscribe'},\n    {\n      '1': 'report',\n      '3': 11,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.TheatreHotTopic.ReportEntry',\n      '10': 'report'\n    },\n  ],\n  '3': [TheatreHotTopic_ReportEntry$json],\n};\n\n@$core.Deprecated('Use theatreHotTopicDescriptor instead')\nconst TheatreHotTopic_ReportEntry$json = {\n  '1': 'ReportEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `TheatreHotTopic`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List theatreHotTopicDescriptor = $convert.base64Decode(\n    'Cg9UaGVhdHJlSG90VG9waWMSHQoKdGhlYXRyZV9pZBgBIAEoA1IJdGhlYXRyZUlkEiQKDnRoZW'\n    'F0cmVfc2V0X2lkGAIgASgDUgx0aGVhdHJlU2V0SWQSIwoNdGhlYXRyZV90aXRsZRgDIAEoCVIM'\n    'dGhlYXRyZVRpdGxlEjAKFGJhY2tncm91bmRfaW1hZ2VfdXJsGAQgASgJUhJiYWNrZ3JvdW5kSW'\n    '1hZ2VVcmwSHwoLdGhlYXRyZV91cmwYBSABKAlSCnRoZWF0cmVVcmwSIAoMaG90X3RvcGljX2lk'\n    'GAYgASgDUgpob3RUb3BpY0lkEicKEGhvdF90b3BpY19zZXRfaWQYByABKANSDWhvdFRvcGljU2'\n    'V0SWQSJgoPaG90X3RvcGljX3RpdGxlGAggASgJUg1ob3RUb3BpY1RpdGxlEiIKDWhvdF90b3Bp'\n    'Y191cmwYCSABKAlSC2hvdFRvcGljVXJsEiEKDGlzX3N1YnNjcmliZRgKIAEoBVILaXNTdWJzY3'\n    'JpYmUSUgoGcmVwb3J0GAsgAygLMjouYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uVGhl'\n    'YXRyZUhvdFRvcGljLlJlcG9ydEVudHJ5UgZyZXBvcnQaOQoLUmVwb3J0RW50cnkSEAoDa2V5GA'\n    'EgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4AQ==');\n\n@$core.Deprecated('Use thresholdDescriptor instead')\nconst Threshold$json = {\n  '1': 'Threshold',\n  '2': [\n    {'1': 'bp', '3': 1, '4': 1, '5': 5, '10': 'bp'},\n    {'1': 'days', '3': 2, '4': 1, '5': 5, '10': 'days'},\n    {'1': 'days_text', '3': 3, '4': 1, '5': 9, '10': 'daysText'},\n  ],\n};\n\n/// Descriptor for `Threshold`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List thresholdDescriptor = $convert.base64Decode(\n    'CglUaHJlc2hvbGQSDgoCYnAYASABKAVSAmJwEhIKBGRheXMYAiABKAVSBGRheXMSGwoJZGF5c1'\n    '90ZXh0GAMgASgJUghkYXlzVGV4dA==');\n\n@$core.Deprecated('Use titleDeliveryButtonDescriptor instead')\nconst TitleDeliveryButton$json = {\n  '1': 'TitleDeliveryButton',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'link', '3': 3, '4': 1, '5': 9, '10': 'link'},\n    {\n      '1': 'report',\n      '3': 4,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.TitleDeliveryButton.ReportEntry',\n      '10': 'report'\n    },\n    {'1': 'bubble', '3': 5, '4': 1, '5': 9, '10': 'bubble'},\n  ],\n  '3': [TitleDeliveryButton_ReportEntry$json],\n};\n\n@$core.Deprecated('Use titleDeliveryButtonDescriptor instead')\nconst TitleDeliveryButton_ReportEntry$json = {\n  '1': 'ReportEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `TitleDeliveryButton`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List titleDeliveryButtonDescriptor = $convert.base64Decode(\n    'ChNUaXRsZURlbGl2ZXJ5QnV0dG9uEhIKBGljb24YASABKAlSBGljb24SFAoFdGl0bGUYAiABKA'\n    'lSBXRpdGxlEhIKBGxpbmsYAyABKAlSBGxpbmsSVgoGcmVwb3J0GAQgAygLMj4uYmlsaWJpbGku'\n    'YXBwLnZpZXd1bml0ZS5jb21tb24uVGl0bGVEZWxpdmVyeUJ1dHRvbi5SZXBvcnRFbnRyeVIGcm'\n    'Vwb3J0EhYKBmJ1YmJsZRgFIAEoCVIGYnViYmxlGjkKC1JlcG9ydEVudHJ5EhAKA2tleRgBIAEo'\n    'CVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAE=');\n\n@$core.Deprecated('Use ugcEpisodeDescriptor instead')\nconst UgcEpisode$json = {\n  '1': 'UgcEpisode',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'aid', '3': 2, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'cid', '3': 3, '4': 1, '5': 3, '10': 'cid'},\n    {'1': 'title', '3': 4, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 5, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'cover_right_text', '3': 6, '4': 1, '5': 9, '10': 'coverRightText'},\n    {\n      '1': 'page',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Page',\n      '10': 'page'\n    },\n    {\n      '1': 'vt',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.StatInfo',\n      '10': 'vt'\n    },\n    {\n      '1': 'danmaku',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.StatInfo',\n      '10': 'danmaku'\n    },\n    {\n      '1': 'badge',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.BadgeInfo',\n      '10': 'badge'\n    },\n    {\n      '1': 'pages',\n      '3': 11,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Page',\n      '10': 'pages'\n    },\n    {'1': 'progress_percent', '3': 12, '4': 1, '5': 1, '10': 'progressPercent'},\n    {'1': 'duration', '3': 13, '4': 1, '5': 3, '10': 'duration'},\n    {\n      '1': 'author',\n      '3': 14,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Author',\n      '10': 'author'\n    },\n    {\n      '1': 'biz_type',\n      '3': 15,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.BizType',\n      '10': 'bizType'\n    },\n  ],\n};\n\n/// Descriptor for `UgcEpisode`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List ugcEpisodeDescriptor = $convert.base64Decode(\n    'CgpVZ2NFcGlzb2RlEg4KAmlkGAEgASgDUgJpZBIQCgNhaWQYAiABKANSA2FpZBIQCgNjaWQYAy'\n    'ABKANSA2NpZBIUCgV0aXRsZRgEIAEoCVIFdGl0bGUSFAoFY292ZXIYBSABKAlSBWNvdmVyEigK'\n    'EGNvdmVyX3JpZ2h0X3RleHQYBiABKAlSDmNvdmVyUmlnaHRUZXh0EjcKBHBhZ2UYByABKAsyIy'\n    '5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5QYWdlUgRwYWdlEjcKAnZ0GAggASgLMicu'\n    'YmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uU3RhdEluZm9SAnZ0EkEKB2Rhbm1ha3UYCS'\n    'ABKAsyJy5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5TdGF0SW5mb1IHZGFubWFrdRI+'\n    'CgViYWRnZRgKIAEoCzIoLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLkJhZGdlSW5mb1'\n    'IFYmFkZ2USOQoFcGFnZXMYCyADKAsyIy5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5Q'\n    'YWdlUgVwYWdlcxIpChBwcm9ncmVzc19wZXJjZW50GAwgASgBUg9wcm9ncmVzc1BlcmNlbnQSGg'\n    'oIZHVyYXRpb24YDSABKANSCGR1cmF0aW9uEj0KBmF1dGhvchgOIAEoCzIlLmJpbGliaWxpLmFw'\n    'cC52aWV3dW5pdGUuY29tbW9uLkF1dGhvclIGYXV0aG9yEjkKCGJpel90eXBlGA8gASgOMh4uYm'\n    'lsaWJpbGkucGxheWVyc2hhcmVkLkJpelR5cGVSB2JpelR5cGU=');\n\n@$core.Deprecated('Use ugcIntroductionDescriptor instead')\nconst UgcIntroduction$json = {\n  '1': 'UgcIntroduction',\n  '2': [\n    {\n      '1': 'tags',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Tag',\n      '10': 'tags'\n    },\n    {\n      '1': 'rating',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Rating',\n      '10': 'rating'\n    },\n    {\n      '1': 'rank',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Rank',\n      '10': 'rank'\n    },\n    {\n      '1': 'bgm',\n      '3': 4,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.ViewMaterial',\n      '10': 'bgm'\n    },\n    {\n      '1': 'sticker',\n      '3': 5,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.ViewMaterial',\n      '10': 'sticker'\n    },\n    {\n      '1': 'video_source',\n      '3': 6,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.ViewMaterial',\n      '10': 'videoSource'\n    },\n    {'1': 'pubdate', '3': 7, '4': 1, '5': 3, '10': 'pubdate'},\n    {\n      '1': 'desc',\n      '3': 8,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.DescV2',\n      '10': 'desc'\n    },\n    {\n      '1': 'neutral',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Neutral',\n      '10': 'neutral'\n    },\n  ],\n};\n\n/// Descriptor for `UgcIntroduction`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List ugcIntroductionDescriptor = $convert.base64Decode(\n    'Cg9VZ2NJbnRyb2R1Y3Rpb24SNgoEdGFncxgBIAMoCzIiLmJpbGliaWxpLmFwcC52aWV3dW5pdG'\n    'UuY29tbW9uLlRhZ1IEdGFncxI9CgZyYXRpbmcYAiABKAsyJS5iaWxpYmlsaS5hcHAudmlld3Vu'\n    'aXRlLmNvbW1vbi5SYXRpbmdSBnJhdGluZxI3CgRyYW5rGAMgASgLMiMuYmlsaWJpbGkuYXBwLn'\n    'ZpZXd1bml0ZS5jb21tb24uUmFua1IEcmFuaxI9CgNiZ20YBCADKAsyKy5iaWxpYmlsaS5hcHAu'\n    'dmlld3VuaXRlLmNvbW1vbi5WaWV3TWF0ZXJpYWxSA2JnbRJFCgdzdGlja2VyGAUgAygLMisuYm'\n    'lsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uVmlld01hdGVyaWFsUgdzdGlja2VyEk4KDHZp'\n    'ZGVvX3NvdXJjZRgGIAMoCzIrLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLlZpZXdNYX'\n    'RlcmlhbFILdmlkZW9Tb3VyY2USGAoHcHViZGF0ZRgHIAEoA1IHcHViZGF0ZRI5CgRkZXNjGAgg'\n    'AygLMiUuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uRGVzY1YyUgRkZXNjEkAKB25ldX'\n    'RyYWwYCSABKAsyJi5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5OZXV0cmFsUgduZXV0'\n    'cmFs');\n\n@$core.Deprecated('Use ugcSeasonActivityDescriptor instead')\nconst UgcSeasonActivity$json = {\n  '1': 'UgcSeasonActivity',\n  '2': [\n    {'1': 'type', '3': 1, '4': 1, '5': 5, '10': 'type'},\n    {'1': 'oid', '3': 2, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'activity_id', '3': 3, '4': 1, '5': 3, '10': 'activityId'},\n    {'1': 'title', '3': 4, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'intro', '3': 5, '4': 1, '5': 9, '10': 'intro'},\n    {'1': 'day_count', '3': 6, '4': 1, '5': 5, '10': 'dayCount'},\n    {'1': 'user_count', '3': 7, '4': 1, '5': 5, '10': 'userCount'},\n    {'1': 'join_deadline', '3': 8, '4': 1, '5': 3, '10': 'joinDeadline'},\n    {\n      '1': 'activity_deadline',\n      '3': 9,\n      '4': 1,\n      '5': 3,\n      '10': 'activityDeadline'\n    },\n    {\n      '1': 'checkin_view_time',\n      '3': 10,\n      '4': 1,\n      '5': 5,\n      '10': 'checkinViewTime'\n    },\n    {'1': 'new_activity', '3': 11, '4': 1, '5': 8, '10': 'newActivity'},\n    {\n      '1': 'user_activity',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.UserActivity',\n      '10': 'userActivity'\n    },\n    {\n      '1': 'season_show',\n      '3': 13,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.SeasonShow',\n      '10': 'seasonShow'\n    },\n  ],\n};\n\n/// Descriptor for `UgcSeasonActivity`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List ugcSeasonActivityDescriptor = $convert.base64Decode(\n    'ChFVZ2NTZWFzb25BY3Rpdml0eRISCgR0eXBlGAEgASgFUgR0eXBlEhAKA29pZBgCIAEoA1IDb2'\n    'lkEh8KC2FjdGl2aXR5X2lkGAMgASgDUgphY3Rpdml0eUlkEhQKBXRpdGxlGAQgASgJUgV0aXRs'\n    'ZRIUCgVpbnRybxgFIAEoCVIFaW50cm8SGwoJZGF5X2NvdW50GAYgASgFUghkYXlDb3VudBIdCg'\n    'p1c2VyX2NvdW50GAcgASgFUgl1c2VyQ291bnQSIwoNam9pbl9kZWFkbGluZRgIIAEoA1IMam9p'\n    'bkRlYWRsaW5lEisKEWFjdGl2aXR5X2RlYWRsaW5lGAkgASgDUhBhY3Rpdml0eURlYWRsaW5lEi'\n    'oKEWNoZWNraW5fdmlld190aW1lGAogASgFUg9jaGVja2luVmlld1RpbWUSIQoMbmV3X2FjdGl2'\n    'aXR5GAsgASgIUgtuZXdBY3Rpdml0eRJQCg11c2VyX2FjdGl2aXR5GAwgASgLMisuYmlsaWJpbG'\n    'kuYXBwLnZpZXd1bml0ZS5jb21tb24uVXNlckFjdGl2aXR5Ugx1c2VyQWN0aXZpdHkSSgoLc2Vh'\n    'c29uX3Nob3cYDSABKAsyKS5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5TZWFzb25TaG'\n    '93UgpzZWFzb25TaG93');\n\n@$core.Deprecated('Use ugcSeasonsDescriptor instead')\nconst UgcSeasons$json = {\n  '1': 'UgcSeasons',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 3, '4': 1, '5': 9, '10': 'cover'},\n    {\n      '1': 'supernatant_title',\n      '3': 4,\n      '4': 1,\n      '5': 9,\n      '10': 'supernatantTitle'\n    },\n    {\n      '1': 'section',\n      '3': 5,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.UgcSection',\n      '10': 'section'\n    },\n    {'1': 'union_title', '3': 6, '4': 1, '5': 9, '10': 'unionTitle'},\n    {\n      '1': 'head',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.SeasonHead',\n      '10': 'head'\n    },\n    {'1': 'ep_count', '3': 8, '4': 1, '5': 3, '10': 'epCount'},\n    {\n      '1': 'season_type',\n      '3': 9,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.common.SeasonType',\n      '10': 'seasonType'\n    },\n    {\n      '1': 'activity',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.UgcSeasonActivity',\n      '10': 'activity'\n    },\n    {'1': 'season_ability', '3': 11, '4': 3, '5': 9, '10': 'seasonAbility'},\n    {'1': 'season_title', '3': 12, '4': 1, '5': 9, '10': 'seasonTitle'},\n  ],\n};\n\n/// Descriptor for `UgcSeasons`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List ugcSeasonsDescriptor = $convert.base64Decode(\n    'CgpVZ2NTZWFzb25zEg4KAmlkGAEgASgDUgJpZBIUCgV0aXRsZRgCIAEoCVIFdGl0bGUSFAoFY2'\n    '92ZXIYAyABKAlSBWNvdmVyEisKEXN1cGVybmF0YW50X3RpdGxlGAQgASgJUhBzdXBlcm5hdGFu'\n    'dFRpdGxlEkMKB3NlY3Rpb24YBSADKAsyKS5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi'\n    '5VZ2NTZWN0aW9uUgdzZWN0aW9uEh8KC3VuaW9uX3RpdGxlGAYgASgJUgp1bmlvblRpdGxlEj0K'\n    'BGhlYWQYByABKAsyKS5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5TZWFzb25IZWFkUg'\n    'RoZWFkEhkKCGVwX2NvdW50GAggASgDUgdlcENvdW50EkoKC3NlYXNvbl90eXBlGAkgASgOMiku'\n    'YmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uU2Vhc29uVHlwZVIKc2Vhc29uVHlwZRJMCg'\n    'hhY3Rpdml0eRgKIAEoCzIwLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLlVnY1NlYXNv'\n    'bkFjdGl2aXR5UghhY3Rpdml0eRIlCg5zZWFzb25fYWJpbGl0eRgLIAMoCVINc2Vhc29uQWJpbG'\n    'l0eRIhCgxzZWFzb25fdGl0bGUYDCABKAlSC3NlYXNvblRpdGxl');\n\n@$core.Deprecated('Use ugcSectionDescriptor instead')\nconst UgcSection$json = {\n  '1': 'UgcSection',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'type', '3': 3, '4': 1, '5': 3, '10': 'type'},\n    {\n      '1': 'episodes',\n      '3': 4,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.UgcEpisode',\n      '10': 'episodes'\n    },\n  ],\n};\n\n/// Descriptor for `UgcSection`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List ugcSectionDescriptor = $convert.base64Decode(\n    'CgpVZ2NTZWN0aW9uEg4KAmlkGAEgASgDUgJpZBIUCgV0aXRsZRgCIAEoCVIFdGl0bGUSEgoEdH'\n    'lwZRgDIAEoA1IEdHlwZRJFCghlcGlzb2RlcxgEIAMoCzIpLmJpbGliaWxpLmFwcC52aWV3dW5p'\n    'dGUuY29tbW9uLlVnY0VwaXNvZGVSCGVwaXNvZGVz');\n\n@$core.Deprecated('Use upDataModuleDescriptor instead')\nconst UpDataModule$json = {\n  '1': 'UpDataModule',\n  '2': [\n    {\n      '1': 'ext_tabs',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.ExtTab',\n      '10': 'extTabs'\n    },\n    {'1': 'idx', '3': 2, '4': 1, '5': 5, '10': 'idx'},\n    {'1': 'protocol_url', '3': 3, '4': 1, '5': 9, '10': 'protocolUrl'},\n    {'1': 'height', '3': 4, '4': 1, '5': 5, '10': 'height'},\n  ],\n};\n\n/// Descriptor for `UpDataModule`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List upDataModuleDescriptor = $convert.base64Decode(\n    'CgxVcERhdGFNb2R1bGUSQAoIZXh0X3RhYnMYASADKAsyJS5iaWxpYmlsaS5hcHAudmlld3VuaX'\n    'RlLmNvbW1vbi5FeHRUYWJSB2V4dFRhYnMSEAoDaWR4GAIgASgFUgNpZHgSIQoMcHJvdG9jb2xf'\n    'dXJsGAMgASgJUgtwcm90b2NvbFVybBIWCgZoZWlnaHQYBCABKAVSBmhlaWdodA==');\n\n@$core.Deprecated('Use upLikeImgDescriptor instead')\nconst UpLikeImg$json = {\n  '1': 'UpLikeImg',\n  '2': [\n    {'1': 'pre_img', '3': 1, '4': 1, '5': 9, '10': 'preImg'},\n    {'1': 'suc_img', '3': 2, '4': 1, '5': 9, '10': 'sucImg'},\n    {'1': 'content', '3': 3, '4': 1, '5': 9, '10': 'content'},\n    {'1': 'type', '3': 4, '4': 1, '5': 3, '10': 'type'},\n  ],\n};\n\n/// Descriptor for `UpLikeImg`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List upLikeImgDescriptor = $convert.base64Decode(\n    'CglVcExpa2VJbWcSFwoHcHJlX2ltZxgBIAEoCVIGcHJlSW1nEhcKB3N1Y19pbWcYAiABKAlSBn'\n    'N1Y0ltZxIYCgdjb250ZW50GAMgASgJUgdjb250ZW50EhIKBHR5cGUYBCABKANSBHR5cGU=');\n\n@$core.Deprecated('Use upToolDescriptor instead')\nconst UpTool$json = {\n  '1': 'UpTool',\n  '2': [\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.common.ToolType',\n      '10': 'type'\n    },\n    {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'icon', '3': 3, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'url', '3': 4, '4': 1, '5': 9, '10': 'url'},\n    {\n      '1': 'badge',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.BadgeInfo',\n      '10': 'badge'\n    },\n  ],\n};\n\n/// Descriptor for `UpTool`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List upToolDescriptor = $convert.base64Decode(\n    'CgZVcFRvb2wSOwoEdHlwZRgBIAEoDjInLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLl'\n    'Rvb2xUeXBlUgR0eXBlEhIKBHRleHQYAiABKAlSBHRleHQSEgoEaWNvbhgDIAEoCVIEaWNvbhIQ'\n    'CgN1cmwYBCABKAlSA3VybBI+CgViYWRnZRgFIAEoCzIoLmJpbGliaWxpLmFwcC52aWV3dW5pdG'\n    'UuY29tbW9uLkJhZGdlSW5mb1IFYmFkZ2U=');\n\n@$core.Deprecated('Use upVideoToolDescriptor instead')\nconst UpVideoTool$json = {\n  '1': 'UpVideoTool',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'tools',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.UpTool',\n      '10': 'tools'\n    },\n  ],\n};\n\n/// Descriptor for `UpVideoTool`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List upVideoToolDescriptor = $convert.base64Decode(\n    'CgtVcFZpZGVvVG9vbBIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSOwoFdG9vbHMYAiADKAsyJS5iaW'\n    'xpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5VcFRvb2xSBXRvb2xz');\n\n@$core.Deprecated('Use userDescriptor instead')\nconst User$json = {\n  '1': 'User',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'face', '3': 3, '4': 1, '5': 9, '10': 'face'},\n    {'1': 'follower', '3': 4, '4': 1, '5': 3, '10': 'follower'},\n  ],\n};\n\n/// Descriptor for `User`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List userDescriptor = $convert.base64Decode(\n    'CgRVc2VyEhAKA21pZBgBIAEoA1IDbWlkEhIKBG5hbWUYAiABKAlSBG5hbWUSEgoEZmFjZRgDIA'\n    'EoCVIEZmFjZRIaCghmb2xsb3dlchgEIAEoA1IIZm9sbG93ZXI=');\n\n@$core.Deprecated('Use userActivityDescriptor instead')\nconst UserActivity$json = {\n  '1': 'UserActivity',\n  '2': [\n    {'1': 'user_state', '3': 1, '4': 1, '5': 5, '10': 'userState'},\n    {'1': 'last_checkin_date', '3': 2, '4': 1, '5': 3, '10': 'lastCheckinDate'},\n    {'1': 'checkin_today', '3': 3, '4': 1, '5': 5, '10': 'checkinToday'},\n    {'1': 'user_day_count', '3': 4, '4': 1, '5': 5, '10': 'userDayCount'},\n    {'1': 'user_view_time', '3': 5, '4': 1, '5': 5, '10': 'userViewTime'},\n    {'1': 'portrait', '3': 6, '4': 1, '5': 9, '10': 'portrait'},\n  ],\n};\n\n/// Descriptor for `UserActivity`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List userActivityDescriptor = $convert.base64Decode(\n    'CgxVc2VyQWN0aXZpdHkSHQoKdXNlcl9zdGF0ZRgBIAEoBVIJdXNlclN0YXRlEioKEWxhc3RfY2'\n    'hlY2tpbl9kYXRlGAIgASgDUg9sYXN0Q2hlY2tpbkRhdGUSIwoNY2hlY2tpbl90b2RheRgDIAEo'\n    'BVIMY2hlY2tpblRvZGF5EiQKDnVzZXJfZGF5X2NvdW50GAQgASgFUgx1c2VyRGF5Q291bnQSJA'\n    'oOdXNlcl92aWV3X3RpbWUYBSABKAVSDHVzZXJWaWV3VGltZRIaCghwb3J0cmFpdBgGIAEoCVII'\n    'cG9ydHJhaXQ=');\n\n@$core.Deprecated('Use userListDescriptor instead')\nconst UserList$json = {\n  '1': 'UserList',\n  '2': [\n    {\n      '1': 'list',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.User',\n      '10': 'list'\n    },\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n  ],\n};\n\n/// Descriptor for `UserList`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List userListDescriptor = $convert.base64Decode(\n    'CghVc2VyTGlzdBI3CgRsaXN0GAEgAygLMiMuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb2'\n    '4uVXNlclIEbGlzdBIUCgV0aXRsZRgCIAEoCVIFdGl0bGU=');\n\n@$core.Deprecated('Use userStatusDescriptor instead')\nconst UserStatus$json = {\n  '1': 'UserStatus',\n  '2': [\n    {'1': 'show', '3': 1, '4': 1, '5': 5, '10': 'show'},\n    {'1': 'follow', '3': 2, '4': 1, '5': 5, '10': 'follow'},\n  ],\n};\n\n/// Descriptor for `UserStatus`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List userStatusDescriptor = $convert.base64Decode(\n    'CgpVc2VyU3RhdHVzEhIKBHNob3cYASABKAVSBHNob3cSFgoGZm9sbG93GAIgASgFUgZmb2xsb3'\n    'c=');\n\n@$core.Deprecated('Use viewEpisodeDescriptor instead')\nconst ViewEpisode$json = {\n  '1': 'ViewEpisode',\n  '2': [\n    {'1': 'ep_id', '3': 1, '4': 1, '5': 3, '10': 'epId'},\n    {'1': 'badge', '3': 2, '4': 1, '5': 9, '10': 'badge'},\n    {'1': 'badge_type', '3': 3, '4': 1, '5': 5, '10': 'badgeType'},\n    {\n      '1': 'badge_info',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.BadgeInfo',\n      '10': 'badgeInfo'\n    },\n    {'1': 'duration', '3': 5, '4': 1, '5': 5, '10': 'duration'},\n    {'1': 'status', '3': 6, '4': 1, '5': 5, '10': 'status'},\n    {'1': 'cover', '3': 7, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'aid', '3': 8, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'title', '3': 9, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'movie_title', '3': 10, '4': 1, '5': 9, '10': 'movieTitle'},\n    {'1': 'subtitle', '3': 11, '4': 1, '5': 9, '10': 'subtitle'},\n    {'1': 'long_title', '3': 12, '4': 1, '5': 9, '10': 'longTitle'},\n    {'1': 'toast_title', '3': 13, '4': 1, '5': 9, '10': 'toastTitle'},\n    {'1': 'cid', '3': 14, '4': 1, '5': 3, '10': 'cid'},\n    {'1': 'from', '3': 15, '4': 1, '5': 9, '10': 'from'},\n    {'1': 'share_url', '3': 16, '4': 1, '5': 9, '10': 'shareUrl'},\n    {'1': 'share_copy', '3': 17, '4': 1, '5': 9, '10': 'shareCopy'},\n    {'1': 'short_link', '3': 18, '4': 1, '5': 9, '10': 'shortLink'},\n    {'1': 'vid', '3': 19, '4': 1, '5': 9, '10': 'vid'},\n    {'1': 'release_date', '3': 20, '4': 1, '5': 9, '10': 'releaseDate'},\n    {\n      '1': 'dimension',\n      '3': 21,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Dimension',\n      '10': 'dimension'\n    },\n    {\n      '1': 'rights',\n      '3': 22,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Rights',\n      '10': 'rights'\n    },\n    {\n      '1': 'interaction',\n      '3': 23,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Interaction',\n      '10': 'interaction'\n    },\n    {'1': 'bvid', '3': 24, '4': 1, '5': 9, '10': 'bvid'},\n    {'1': 'archive_attr', '3': 25, '4': 1, '5': 5, '10': 'archiveAttr'},\n    {'1': 'link', '3': 26, '4': 1, '5': 9, '10': 'link'},\n    {'1': 'link_type', '3': 27, '4': 1, '5': 9, '10': 'linkType'},\n    {'1': 'bmid', '3': 28, '4': 1, '5': 9, '10': 'bmid'},\n    {'1': 'pub_time', '3': 29, '4': 1, '5': 3, '10': 'pubTime'},\n    {'1': 'pv', '3': 30, '4': 1, '5': 5, '10': 'pv'},\n    {'1': 'ep_index', '3': 31, '4': 1, '5': 5, '10': 'epIndex'},\n    {'1': 'section_index', '3': 32, '4': 1, '5': 5, '10': 'sectionIndex'},\n    {\n      '1': 'up_infos',\n      '3': 33,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Staff',\n      '10': 'upInfos'\n    },\n    {\n      '1': 'up_info',\n      '3': 34,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Staff',\n      '10': 'upInfo'\n    },\n    {'1': 'dialog_type', '3': 35, '4': 1, '5': 9, '10': 'dialogType'},\n    {'1': 'toast_type', '3': 36, '4': 1, '5': 9, '10': 'toastType'},\n    {\n      '1': 'multi_view_eps',\n      '3': 37,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.MultiViewEp',\n      '10': 'multiViewEps'\n    },\n    {'1': 'is_sub_view', '3': 38, '4': 1, '5': 8, '10': 'isSubView'},\n    {'1': 'is_view_hide', '3': 39, '4': 1, '5': 8, '10': 'isViewHide'},\n    {'1': 'jump_link', '3': 40, '4': 1, '5': 9, '10': 'jumpLink'},\n    {\n      '1': 'stat_for_unity',\n      '3': 41,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Stat',\n      '10': 'statForUnity'\n    },\n    {\n      '1': 'report',\n      '3': 42,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.ViewEpisode.ReportEntry',\n      '10': 'report'\n    },\n    {'1': 'section_type', '3': 43, '4': 1, '5': 5, '10': 'sectionType'},\n    {'1': 'show_title', '3': 44, '4': 1, '5': 9, '10': 'showTitle'},\n  ],\n  '3': [ViewEpisode_ReportEntry$json],\n};\n\n@$core.Deprecated('Use viewEpisodeDescriptor instead')\nconst ViewEpisode_ReportEntry$json = {\n  '1': 'ReportEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `ViewEpisode`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List viewEpisodeDescriptor = $convert.base64Decode(\n    'CgtWaWV3RXBpc29kZRITCgVlcF9pZBgBIAEoA1IEZXBJZBIUCgViYWRnZRgCIAEoCVIFYmFkZ2'\n    'USHQoKYmFkZ2VfdHlwZRgDIAEoBVIJYmFkZ2VUeXBlEkcKCmJhZGdlX2luZm8YBCABKAsyKC5i'\n    'aWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5CYWRnZUluZm9SCWJhZGdlSW5mbxIaCghkdX'\n    'JhdGlvbhgFIAEoBVIIZHVyYXRpb24SFgoGc3RhdHVzGAYgASgFUgZzdGF0dXMSFAoFY292ZXIY'\n    'ByABKAlSBWNvdmVyEhAKA2FpZBgIIAEoA1IDYWlkEhQKBXRpdGxlGAkgASgJUgV0aXRsZRIfCg'\n    'ttb3ZpZV90aXRsZRgKIAEoCVIKbW92aWVUaXRsZRIaCghzdWJ0aXRsZRgLIAEoCVIIc3VidGl0'\n    'bGUSHQoKbG9uZ190aXRsZRgMIAEoCVIJbG9uZ1RpdGxlEh8KC3RvYXN0X3RpdGxlGA0gASgJUg'\n    'p0b2FzdFRpdGxlEhAKA2NpZBgOIAEoA1IDY2lkEhIKBGZyb20YDyABKAlSBGZyb20SGwoJc2hh'\n    'cmVfdXJsGBAgASgJUghzaGFyZVVybBIdCgpzaGFyZV9jb3B5GBEgASgJUglzaGFyZUNvcHkSHQ'\n    'oKc2hvcnRfbGluaxgSIAEoCVIJc2hvcnRMaW5rEhAKA3ZpZBgTIAEoCVIDdmlkEiEKDHJlbGVh'\n    'c2VfZGF0ZRgUIAEoCVILcmVsZWFzZURhdGUSRgoJZGltZW5zaW9uGBUgASgLMiguYmlsaWJpbG'\n    'kuYXBwLnZpZXd1bml0ZS5jb21tb24uRGltZW5zaW9uUglkaW1lbnNpb24SPQoGcmlnaHRzGBYg'\n    'ASgLMiUuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uUmlnaHRzUgZyaWdodHMSTAoLaW'\n    '50ZXJhY3Rpb24YFyABKAsyKi5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5JbnRlcmFj'\n    'dGlvblILaW50ZXJhY3Rpb24SEgoEYnZpZBgYIAEoCVIEYnZpZBIhCgxhcmNoaXZlX2F0dHIYGS'\n    'ABKAVSC2FyY2hpdmVBdHRyEhIKBGxpbmsYGiABKAlSBGxpbmsSGwoJbGlua190eXBlGBsgASgJ'\n    'UghsaW5rVHlwZRISCgRibWlkGBwgASgJUgRibWlkEhkKCHB1Yl90aW1lGB0gASgDUgdwdWJUaW'\n    '1lEg4KAnB2GB4gASgFUgJwdhIZCghlcF9pbmRleBgfIAEoBVIHZXBJbmRleBIjCg1zZWN0aW9u'\n    'X2luZGV4GCAgASgFUgxzZWN0aW9uSW5kZXgSPwoIdXBfaW5mb3MYISADKAsyJC5iaWxpYmlsaS'\n    '5hcHAudmlld3VuaXRlLmNvbW1vbi5TdGFmZlIHdXBJbmZvcxI9Cgd1cF9pbmZvGCIgASgLMiQu'\n    'YmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24uU3RhZmZSBnVwSW5mbxIfCgtkaWFsb2dfdH'\n    'lwZRgjIAEoCVIKZGlhbG9nVHlwZRIdCgp0b2FzdF90eXBlGCQgASgJUgl0b2FzdFR5cGUSUAoO'\n    'bXVsdGlfdmlld19lcHMYJSADKAsyKi5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5NdW'\n    'x0aVZpZXdFcFIMbXVsdGlWaWV3RXBzEh4KC2lzX3N1Yl92aWV3GCYgASgIUglpc1N1YlZpZXcS'\n    'IAoMaXNfdmlld19oaWRlGCcgASgIUgppc1ZpZXdIaWRlEhsKCWp1bXBfbGluaxgoIAEoCVIIan'\n    'VtcExpbmsSSQoOc3RhdF9mb3JfdW5pdHkYKSABKAsyIy5iaWxpYmlsaS5hcHAudmlld3VuaXRl'\n    'LmNvbW1vbi5TdGF0UgxzdGF0Rm9yVW5pdHkSTgoGcmVwb3J0GCogAygLMjYuYmlsaWJpbGkuYX'\n    'BwLnZpZXd1bml0ZS5jb21tb24uVmlld0VwaXNvZGUuUmVwb3J0RW50cnlSBnJlcG9ydBIhCgxz'\n    'ZWN0aW9uX3R5cGUYKyABKAVSC3NlY3Rpb25UeXBlEh0KCnNob3dfdGl0bGUYLCABKAlSCXNob3'\n    'dUaXRsZRo5CgtSZXBvcnRFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIF'\n    'dmFsdWU6AjgB');\n\n@$core.Deprecated('Use viewMaterialDescriptor instead')\nconst ViewMaterial$json = {\n  '1': 'ViewMaterial',\n  '2': [\n    {'1': 'oid', '3': 1, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'mid', '3': 2, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'title', '3': 3, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'author', '3': 4, '4': 1, '5': 9, '10': 'author'},\n    {'1': 'jump_url', '3': 5, '4': 1, '5': 9, '10': 'jumpUrl'},\n  ],\n};\n\n/// Descriptor for `ViewMaterial`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List viewMaterialDescriptor = $convert.base64Decode(\n    'CgxWaWV3TWF0ZXJpYWwSEAoDb2lkGAEgASgDUgNvaWQSEAoDbWlkGAIgASgDUgNtaWQSFAoFdG'\n    'l0bGUYAyABKAlSBXRpdGxlEhYKBmF1dGhvchgEIAEoCVIGYXV0aG9yEhkKCGp1bXBfdXJsGAUg'\n    'ASgJUgdqdW1wVXJs');\n\n@$core.Deprecated('Use vipDescriptor instead')\nconst Vip$json = {\n  '1': 'Vip',\n  '2': [\n    {'1': 'type', '3': 1, '4': 1, '5': 5, '10': 'type'},\n    {'1': 'vip_status', '3': 2, '4': 1, '5': 5, '10': 'vipStatus'},\n    {'1': 'theme_type', '3': 3, '4': 1, '5': 5, '10': 'themeType'},\n    {\n      '1': 'label',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.VipLabel',\n      '10': 'label'\n    },\n    {'1': 'is_vip', '3': 5, '4': 1, '5': 5, '10': 'isVip'},\n  ],\n};\n\n/// Descriptor for `Vip`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List vipDescriptor = $convert.base64Decode(\n    'CgNWaXASEgoEdHlwZRgBIAEoBVIEdHlwZRIdCgp2aXBfc3RhdHVzGAIgASgFUgl2aXBTdGF0dX'\n    'MSHQoKdGhlbWVfdHlwZRgDIAEoBVIJdGhlbWVUeXBlEj0KBWxhYmVsGAQgASgLMicuYmlsaWJp'\n    'bGkuYXBwLnZpZXd1bml0ZS5jb21tb24uVmlwTGFiZWxSBWxhYmVsEhUKBmlzX3ZpcBgFIAEoBV'\n    'IFaXNWaXA=');\n\n@$core.Deprecated('Use vipLabelDescriptor instead')\nconst VipLabel$json = {\n  '1': 'VipLabel',\n  '2': [\n    {'1': 'path', '3': 1, '4': 1, '5': 9, '10': 'path'},\n    {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'label_theme', '3': 3, '4': 1, '5': 9, '10': 'labelTheme'},\n  ],\n};\n\n/// Descriptor for `VipLabel`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List vipLabelDescriptor = $convert.base64Decode(\n    'CghWaXBMYWJlbBISCgRwYXRoGAEgASgJUgRwYXRoEhIKBHRleHQYAiABKAlSBHRleHQSHwoLbG'\n    'FiZWxfdGhlbWUYAyABKAlSCmxhYmVsVGhlbWU=');\n\n@$core.Deprecated('Use wikiInfoDescriptor instead')\nconst WikiInfo$json = {\n  '1': 'WikiInfo',\n  '2': [\n    {'1': 'wiki_label', '3': 1, '4': 1, '5': 9, '10': 'wikiLabel'},\n    {'1': 'wiki_url', '3': 2, '4': 1, '5': 9, '10': 'wikiUrl'},\n  ],\n};\n\n/// Descriptor for `WikiInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List wikiInfoDescriptor = $convert.base64Decode(\n    'CghXaWtpSW5mbxIdCgp3aWtpX2xhYmVsGAEgASgJUgl3aWtpTGFiZWwSGQoId2lraV91cmwYAi'\n    'ABKAlSB3dpa2lVcmw=');\n\n@$core.Deprecated('Use winShowConditionDescriptor instead')\nconst WinShowCondition$json = {\n  '1': 'WinShowCondition',\n  '2': [\n    {'1': 'type', '3': 1, '4': 1, '5': 9, '10': 'type'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `WinShowCondition`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List winShowConditionDescriptor = $convert.base64Decode(\n    'ChBXaW5TaG93Q29uZGl0aW9uEhIKBHR5cGUYASABKAlSBHR5cGUSFAoFdmFsdWUYAiABKAlSBX'\n    'ZhbHVl');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/viewunite/pgcanymodel.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/viewunite/pgcanymodel.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:fixnum/fixnum.dart' as $fixnum;\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nimport 'common.pb.dart' as $0;\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nclass Earphone extends $pb.GeneratedMessage {\n  factory Earphone({\n    $core.String? productModel,\n    $core.String? likeToastText,\n    $core.String? switchToastText,\n    $core.String? likeToastVoice,\n  }) {\n    final result = create();\n    if (productModel != null) result.productModel = productModel;\n    if (likeToastText != null) result.likeToastText = likeToastText;\n    if (switchToastText != null) result.switchToastText = switchToastText;\n    if (likeToastVoice != null) result.likeToastVoice = likeToastVoice;\n    return result;\n  }\n\n  Earphone._();\n\n  factory Earphone.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Earphone.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Earphone',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.pgcanymodel'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'productModel')\n    ..aOS(2, _omitFieldNames ? '' : 'likeToastText')\n    ..aOS(3, _omitFieldNames ? '' : 'switchToastText')\n    ..aOS(4, _omitFieldNames ? '' : 'likeToastVoice')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Earphone clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Earphone copyWith(void Function(Earphone) updates) =>\n      super.copyWith((message) => updates(message as Earphone)) as Earphone;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Earphone create() => Earphone._();\n  @$core.override\n  Earphone createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Earphone getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Earphone>(create);\n  static Earphone? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get productModel => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set productModel($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasProductModel() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearProductModel() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get likeToastText => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set likeToastText($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLikeToastText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLikeToastText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get switchToastText => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set switchToastText($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSwitchToastText() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSwitchToastText() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get likeToastVoice => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set likeToastVoice($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLikeToastVoice() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLikeToastVoice() => $_clearField(4);\n}\n\nclass EarphoneConf extends $pb.GeneratedMessage {\n  factory EarphoneConf({\n    $core.Iterable<Earphone>? spPhones,\n  }) {\n    final result = create();\n    if (spPhones != null) result.spPhones.addAll(spPhones);\n    return result;\n  }\n\n  EarphoneConf._();\n\n  factory EarphoneConf.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory EarphoneConf.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'EarphoneConf',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.pgcanymodel'),\n      createEmptyInstance: create)\n    ..pPM<Earphone>(1, _omitFieldNames ? '' : 'spPhones',\n        subBuilder: Earphone.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  EarphoneConf clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  EarphoneConf copyWith(void Function(EarphoneConf) updates) =>\n      super.copyWith((message) => updates(message as EarphoneConf))\n          as EarphoneConf;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static EarphoneConf create() => EarphoneConf._();\n  @$core.override\n  EarphoneConf createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static EarphoneConf getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<EarphoneConf>(create);\n  static EarphoneConf? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<Earphone> get spPhones => $_getList(0);\n}\n\nclass MultiViewInfo extends $pb.GeneratedMessage {\n  factory MultiViewInfo({\n    $core.bool? isMultiViewSeason,\n    $core.String? changingDance,\n  }) {\n    final result = create();\n    if (isMultiViewSeason != null) result.isMultiViewSeason = isMultiViewSeason;\n    if (changingDance != null) result.changingDance = changingDance;\n    return result;\n  }\n\n  MultiViewInfo._();\n\n  factory MultiViewInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MultiViewInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MultiViewInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.pgcanymodel'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'isMultiViewSeason')\n    ..aOS(2, _omitFieldNames ? '' : 'changingDance')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MultiViewInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MultiViewInfo copyWith(void Function(MultiViewInfo) updates) =>\n      super.copyWith((message) => updates(message as MultiViewInfo))\n          as MultiViewInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MultiViewInfo create() => MultiViewInfo._();\n  @$core.override\n  MultiViewInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MultiViewInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MultiViewInfo>(create);\n  static MultiViewInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get isMultiViewSeason => $_getBF(0);\n  @$pb.TagNumber(1)\n  set isMultiViewSeason($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIsMultiViewSeason() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIsMultiViewSeason() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get changingDance => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set changingDance($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasChangingDance() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearChangingDance() => $_clearField(2);\n}\n\nclass OgvData extends $pb.GeneratedMessage {\n  factory OgvData({\n    $core.int? mediaId,\n    $fixnum.Int64? seasonId,\n    $core.int? seasonType,\n    $core.int? showSeasonType,\n    Rights? rights,\n    UserStatus? userStatus,\n    $fixnum.Int64? aid,\n    Stat? stat,\n    $core.int? mode,\n    Publish? publish,\n    PlayStrategy? playStrategy,\n    MultiViewInfo? multiViewInfo,\n    OgvSwitch? ogvSwitch,\n    $core.int? totalEp,\n    $0.NewEp? newEp,\n    Reserve? reserve,\n    $core.int? status,\n    $core.Iterable<PlayFloatLayerActivity>? activityFloatLayer,\n    EarphoneConf? earphoneConf,\n    $core.String? cover,\n    $core.String? squareCover,\n    $core.String? shareUrl,\n    $core.String? shortLink,\n    $core.String? title,\n    $core.String? horizontalCover169,\n    $core.String? horizontalCover1610,\n    $core.int? hasCanPlayEp,\n    Skin? skin,\n  }) {\n    final result = create();\n    if (mediaId != null) result.mediaId = mediaId;\n    if (seasonId != null) result.seasonId = seasonId;\n    if (seasonType != null) result.seasonType = seasonType;\n    if (showSeasonType != null) result.showSeasonType = showSeasonType;\n    if (rights != null) result.rights = rights;\n    if (userStatus != null) result.userStatus = userStatus;\n    if (aid != null) result.aid = aid;\n    if (stat != null) result.stat = stat;\n    if (mode != null) result.mode = mode;\n    if (publish != null) result.publish = publish;\n    if (playStrategy != null) result.playStrategy = playStrategy;\n    if (multiViewInfo != null) result.multiViewInfo = multiViewInfo;\n    if (ogvSwitch != null) result.ogvSwitch = ogvSwitch;\n    if (totalEp != null) result.totalEp = totalEp;\n    if (newEp != null) result.newEp = newEp;\n    if (reserve != null) result.reserve = reserve;\n    if (status != null) result.status = status;\n    if (activityFloatLayer != null)\n      result.activityFloatLayer.addAll(activityFloatLayer);\n    if (earphoneConf != null) result.earphoneConf = earphoneConf;\n    if (cover != null) result.cover = cover;\n    if (squareCover != null) result.squareCover = squareCover;\n    if (shareUrl != null) result.shareUrl = shareUrl;\n    if (shortLink != null) result.shortLink = shortLink;\n    if (title != null) result.title = title;\n    if (horizontalCover169 != null)\n      result.horizontalCover169 = horizontalCover169;\n    if (horizontalCover1610 != null)\n      result.horizontalCover1610 = horizontalCover1610;\n    if (hasCanPlayEp != null) result.hasCanPlayEp = hasCanPlayEp;\n    if (skin != null) result.skin = skin;\n    return result;\n  }\n\n  OgvData._();\n\n  factory OgvData.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OgvData.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OgvData',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.pgcanymodel'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'mediaId')\n    ..aInt64(2, _omitFieldNames ? '' : 'seasonId')\n    ..aI(3, _omitFieldNames ? '' : 'seasonType')\n    ..aI(4, _omitFieldNames ? '' : 'showSeasonType')\n    ..aOM<Rights>(5, _omitFieldNames ? '' : 'rights', subBuilder: Rights.create)\n    ..aOM<UserStatus>(6, _omitFieldNames ? '' : 'userStatus',\n        subBuilder: UserStatus.create)\n    ..aInt64(7, _omitFieldNames ? '' : 'aid')\n    ..aOM<Stat>(8, _omitFieldNames ? '' : 'stat', subBuilder: Stat.create)\n    ..aI(9, _omitFieldNames ? '' : 'mode')\n    ..aOM<Publish>(10, _omitFieldNames ? '' : 'publish',\n        subBuilder: Publish.create)\n    ..aOM<PlayStrategy>(11, _omitFieldNames ? '' : 'playStrategy',\n        subBuilder: PlayStrategy.create)\n    ..aOM<MultiViewInfo>(12, _omitFieldNames ? '' : 'multiViewInfo',\n        subBuilder: MultiViewInfo.create)\n    ..aOM<OgvSwitch>(13, _omitFieldNames ? '' : 'ogvSwitch',\n        subBuilder: OgvSwitch.create)\n    ..aI(14, _omitFieldNames ? '' : 'totalEp')\n    ..aOM<$0.NewEp>(15, _omitFieldNames ? '' : 'newEp',\n        subBuilder: $0.NewEp.create)\n    ..aOM<Reserve>(16, _omitFieldNames ? '' : 'reserve',\n        subBuilder: Reserve.create)\n    ..aI(17, _omitFieldNames ? '' : 'status')\n    ..pPM<PlayFloatLayerActivity>(\n        18, _omitFieldNames ? '' : 'activityFloatLayer',\n        subBuilder: PlayFloatLayerActivity.create)\n    ..aOM<EarphoneConf>(19, _omitFieldNames ? '' : 'earphoneConf',\n        subBuilder: EarphoneConf.create)\n    ..aOS(20, _omitFieldNames ? '' : 'cover')\n    ..aOS(21, _omitFieldNames ? '' : 'squareCover')\n    ..aOS(22, _omitFieldNames ? '' : 'shareUrl')\n    ..aOS(23, _omitFieldNames ? '' : 'shortLink')\n    ..aOS(24, _omitFieldNames ? '' : 'title')\n    ..aOS(25, _omitFieldNames ? '' : 'horizontalCover169')\n    ..aOS(26, _omitFieldNames ? '' : 'horizontalCover1610')\n    ..aI(27, _omitFieldNames ? '' : 'hasCanPlayEp')\n    ..aOM<Skin>(28, _omitFieldNames ? '' : 'skin', subBuilder: Skin.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OgvData clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OgvData copyWith(void Function(OgvData) updates) =>\n      super.copyWith((message) => updates(message as OgvData)) as OgvData;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OgvData create() => OgvData._();\n  @$core.override\n  OgvData createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OgvData getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<OgvData>(create);\n  static OgvData? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get mediaId => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set mediaId($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMediaId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMediaId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get seasonId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set seasonId($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSeasonId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSeasonId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get seasonType => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set seasonType($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSeasonType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSeasonType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get showSeasonType => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set showSeasonType($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasShowSeasonType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearShowSeasonType() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  Rights get rights => $_getN(4);\n  @$pb.TagNumber(5)\n  set rights(Rights value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasRights() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearRights() => $_clearField(5);\n  @$pb.TagNumber(5)\n  Rights ensureRights() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  UserStatus get userStatus => $_getN(5);\n  @$pb.TagNumber(6)\n  set userStatus(UserStatus value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasUserStatus() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearUserStatus() => $_clearField(6);\n  @$pb.TagNumber(6)\n  UserStatus ensureUserStatus() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get aid => $_getI64(6);\n  @$pb.TagNumber(7)\n  set aid($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasAid() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearAid() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  Stat get stat => $_getN(7);\n  @$pb.TagNumber(8)\n  set stat(Stat value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasStat() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearStat() => $_clearField(8);\n  @$pb.TagNumber(8)\n  Stat ensureStat() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  $core.int get mode => $_getIZ(8);\n  @$pb.TagNumber(9)\n  set mode($core.int value) => $_setSignedInt32(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasMode() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearMode() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  Publish get publish => $_getN(9);\n  @$pb.TagNumber(10)\n  set publish(Publish value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasPublish() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearPublish() => $_clearField(10);\n  @$pb.TagNumber(10)\n  Publish ensurePublish() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  PlayStrategy get playStrategy => $_getN(10);\n  @$pb.TagNumber(11)\n  set playStrategy(PlayStrategy value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasPlayStrategy() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearPlayStrategy() => $_clearField(11);\n  @$pb.TagNumber(11)\n  PlayStrategy ensurePlayStrategy() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  MultiViewInfo get multiViewInfo => $_getN(11);\n  @$pb.TagNumber(12)\n  set multiViewInfo(MultiViewInfo value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasMultiViewInfo() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearMultiViewInfo() => $_clearField(12);\n  @$pb.TagNumber(12)\n  MultiViewInfo ensureMultiViewInfo() => $_ensure(11);\n\n  @$pb.TagNumber(13)\n  OgvSwitch get ogvSwitch => $_getN(12);\n  @$pb.TagNumber(13)\n  set ogvSwitch(OgvSwitch value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasOgvSwitch() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearOgvSwitch() => $_clearField(13);\n  @$pb.TagNumber(13)\n  OgvSwitch ensureOgvSwitch() => $_ensure(12);\n\n  @$pb.TagNumber(14)\n  $core.int get totalEp => $_getIZ(13);\n  @$pb.TagNumber(14)\n  set totalEp($core.int value) => $_setSignedInt32(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasTotalEp() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearTotalEp() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $0.NewEp get newEp => $_getN(14);\n  @$pb.TagNumber(15)\n  set newEp($0.NewEp value) => $_setField(15, value);\n  @$pb.TagNumber(15)\n  $core.bool hasNewEp() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearNewEp() => $_clearField(15);\n  @$pb.TagNumber(15)\n  $0.NewEp ensureNewEp() => $_ensure(14);\n\n  @$pb.TagNumber(16)\n  Reserve get reserve => $_getN(15);\n  @$pb.TagNumber(16)\n  set reserve(Reserve value) => $_setField(16, value);\n  @$pb.TagNumber(16)\n  $core.bool hasReserve() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearReserve() => $_clearField(16);\n  @$pb.TagNumber(16)\n  Reserve ensureReserve() => $_ensure(15);\n\n  @$pb.TagNumber(17)\n  $core.int get status => $_getIZ(16);\n  @$pb.TagNumber(17)\n  set status($core.int value) => $_setSignedInt32(16, value);\n  @$pb.TagNumber(17)\n  $core.bool hasStatus() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearStatus() => $_clearField(17);\n\n  @$pb.TagNumber(18)\n  $pb.PbList<PlayFloatLayerActivity> get activityFloatLayer => $_getList(17);\n\n  @$pb.TagNumber(19)\n  EarphoneConf get earphoneConf => $_getN(18);\n  @$pb.TagNumber(19)\n  set earphoneConf(EarphoneConf value) => $_setField(19, value);\n  @$pb.TagNumber(19)\n  $core.bool hasEarphoneConf() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearEarphoneConf() => $_clearField(19);\n  @$pb.TagNumber(19)\n  EarphoneConf ensureEarphoneConf() => $_ensure(18);\n\n  @$pb.TagNumber(20)\n  $core.String get cover => $_getSZ(19);\n  @$pb.TagNumber(20)\n  set cover($core.String value) => $_setString(19, value);\n  @$pb.TagNumber(20)\n  $core.bool hasCover() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearCover() => $_clearField(20);\n\n  @$pb.TagNumber(21)\n  $core.String get squareCover => $_getSZ(20);\n  @$pb.TagNumber(21)\n  set squareCover($core.String value) => $_setString(20, value);\n  @$pb.TagNumber(21)\n  $core.bool hasSquareCover() => $_has(20);\n  @$pb.TagNumber(21)\n  void clearSquareCover() => $_clearField(21);\n\n  @$pb.TagNumber(22)\n  $core.String get shareUrl => $_getSZ(21);\n  @$pb.TagNumber(22)\n  set shareUrl($core.String value) => $_setString(21, value);\n  @$pb.TagNumber(22)\n  $core.bool hasShareUrl() => $_has(21);\n  @$pb.TagNumber(22)\n  void clearShareUrl() => $_clearField(22);\n\n  @$pb.TagNumber(23)\n  $core.String get shortLink => $_getSZ(22);\n  @$pb.TagNumber(23)\n  set shortLink($core.String value) => $_setString(22, value);\n  @$pb.TagNumber(23)\n  $core.bool hasShortLink() => $_has(22);\n  @$pb.TagNumber(23)\n  void clearShortLink() => $_clearField(23);\n\n  @$pb.TagNumber(24)\n  $core.String get title => $_getSZ(23);\n  @$pb.TagNumber(24)\n  set title($core.String value) => $_setString(23, value);\n  @$pb.TagNumber(24)\n  $core.bool hasTitle() => $_has(23);\n  @$pb.TagNumber(24)\n  void clearTitle() => $_clearField(24);\n\n  @$pb.TagNumber(25)\n  $core.String get horizontalCover169 => $_getSZ(24);\n  @$pb.TagNumber(25)\n  set horizontalCover169($core.String value) => $_setString(24, value);\n  @$pb.TagNumber(25)\n  $core.bool hasHorizontalCover169() => $_has(24);\n  @$pb.TagNumber(25)\n  void clearHorizontalCover169() => $_clearField(25);\n\n  @$pb.TagNumber(26)\n  $core.String get horizontalCover1610 => $_getSZ(25);\n  @$pb.TagNumber(26)\n  set horizontalCover1610($core.String value) => $_setString(25, value);\n  @$pb.TagNumber(26)\n  $core.bool hasHorizontalCover1610() => $_has(25);\n  @$pb.TagNumber(26)\n  void clearHorizontalCover1610() => $_clearField(26);\n\n  @$pb.TagNumber(27)\n  $core.int get hasCanPlayEp => $_getIZ(26);\n  @$pb.TagNumber(27)\n  set hasCanPlayEp($core.int value) => $_setSignedInt32(26, value);\n  @$pb.TagNumber(27)\n  $core.bool hasHasCanPlayEp() => $_has(26);\n  @$pb.TagNumber(27)\n  void clearHasCanPlayEp() => $_clearField(27);\n\n  @$pb.TagNumber(28)\n  Skin get skin => $_getN(27);\n  @$pb.TagNumber(28)\n  set skin(Skin value) => $_setField(28, value);\n  @$pb.TagNumber(28)\n  $core.bool hasSkin() => $_has(27);\n  @$pb.TagNumber(28)\n  void clearSkin() => $_clearField(28);\n  @$pb.TagNumber(28)\n  Skin ensureSkin() => $_ensure(27);\n}\n\nclass OgvSwitch extends $pb.GeneratedMessage {\n  factory OgvSwitch({\n    $core.int? reduceShortTitleSpacing,\n    $core.int? mergePositionSectionForCinema,\n    $core.int? mergePreviewSection,\n    $core.int? enableShowVtInfo,\n    $core.int? hideEpVvVtDm,\n    $core.int? followGuide,\n  }) {\n    final result = create();\n    if (reduceShortTitleSpacing != null)\n      result.reduceShortTitleSpacing = reduceShortTitleSpacing;\n    if (mergePositionSectionForCinema != null)\n      result.mergePositionSectionForCinema = mergePositionSectionForCinema;\n    if (mergePreviewSection != null)\n      result.mergePreviewSection = mergePreviewSection;\n    if (enableShowVtInfo != null) result.enableShowVtInfo = enableShowVtInfo;\n    if (hideEpVvVtDm != null) result.hideEpVvVtDm = hideEpVvVtDm;\n    if (followGuide != null) result.followGuide = followGuide;\n    return result;\n  }\n\n  OgvSwitch._();\n\n  factory OgvSwitch.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OgvSwitch.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OgvSwitch',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.pgcanymodel'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'reduceShortTitleSpacing')\n    ..aI(2, _omitFieldNames ? '' : 'mergePositionSectionForCinema')\n    ..aI(3, _omitFieldNames ? '' : 'mergePreviewSection')\n    ..aI(4, _omitFieldNames ? '' : 'enableShowVtInfo')\n    ..aI(5, _omitFieldNames ? '' : 'hideEpVvVtDm')\n    ..aI(6, _omitFieldNames ? '' : 'followGuide')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OgvSwitch clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OgvSwitch copyWith(void Function(OgvSwitch) updates) =>\n      super.copyWith((message) => updates(message as OgvSwitch)) as OgvSwitch;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OgvSwitch create() => OgvSwitch._();\n  @$core.override\n  OgvSwitch createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OgvSwitch getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<OgvSwitch>(create);\n  static OgvSwitch? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get reduceShortTitleSpacing => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set reduceShortTitleSpacing($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasReduceShortTitleSpacing() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearReduceShortTitleSpacing() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get mergePositionSectionForCinema => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set mergePositionSectionForCinema($core.int value) =>\n      $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMergePositionSectionForCinema() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMergePositionSectionForCinema() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get mergePreviewSection => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set mergePreviewSection($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasMergePreviewSection() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearMergePreviewSection() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get enableShowVtInfo => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set enableShowVtInfo($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasEnableShowVtInfo() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearEnableShowVtInfo() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get hideEpVvVtDm => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set hideEpVvVtDm($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasHideEpVvVtDm() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearHideEpVvVtDm() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get followGuide => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set followGuide($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasFollowGuide() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearFollowGuide() => $_clearField(6);\n}\n\nclass PlayFloatLayerActivity extends $pb.GeneratedMessage {\n  factory PlayFloatLayerActivity({\n    $core.int? id,\n    $core.String? title,\n    $core.int? type,\n    $core.int? adBadgeType,\n    $core.String? link,\n    $core.String? picUrl,\n    $core.String? picAnimaUrl,\n    $0.BadgeInfo? badge,\n    $fixnum.Int64? showRateTime,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (title != null) result.title = title;\n    if (type != null) result.type = type;\n    if (adBadgeType != null) result.adBadgeType = adBadgeType;\n    if (link != null) result.link = link;\n    if (picUrl != null) result.picUrl = picUrl;\n    if (picAnimaUrl != null) result.picAnimaUrl = picAnimaUrl;\n    if (badge != null) result.badge = badge;\n    if (showRateTime != null) result.showRateTime = showRateTime;\n    return result;\n  }\n\n  PlayFloatLayerActivity._();\n\n  factory PlayFloatLayerActivity.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayFloatLayerActivity.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayFloatLayerActivity',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.pgcanymodel'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aI(3, _omitFieldNames ? '' : 'type')\n    ..aI(4, _omitFieldNames ? '' : 'adBadgeType')\n    ..aOS(5, _omitFieldNames ? '' : 'link')\n    ..aOS(6, _omitFieldNames ? '' : 'picUrl')\n    ..aOS(7, _omitFieldNames ? '' : 'picAnimaUrl')\n    ..aOM<$0.BadgeInfo>(8, _omitFieldNames ? '' : 'badge',\n        subBuilder: $0.BadgeInfo.create)\n    ..aInt64(9, _omitFieldNames ? '' : 'showRateTime')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayFloatLayerActivity clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayFloatLayerActivity copyWith(\n          void Function(PlayFloatLayerActivity) updates) =>\n      super.copyWith((message) => updates(message as PlayFloatLayerActivity))\n          as PlayFloatLayerActivity;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayFloatLayerActivity create() => PlayFloatLayerActivity._();\n  @$core.override\n  PlayFloatLayerActivity createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayFloatLayerActivity getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayFloatLayerActivity>(create);\n  static PlayFloatLayerActivity? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get id => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set id($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get type => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set type($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get adBadgeType => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set adBadgeType($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasAdBadgeType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearAdBadgeType() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get link => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set link($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasLink() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearLink() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get picUrl => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set picUrl($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasPicUrl() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearPicUrl() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get picAnimaUrl => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set picAnimaUrl($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasPicAnimaUrl() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearPicAnimaUrl() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $0.BadgeInfo get badge => $_getN(7);\n  @$pb.TagNumber(8)\n  set badge($0.BadgeInfo value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasBadge() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearBadge() => $_clearField(8);\n  @$pb.TagNumber(8)\n  $0.BadgeInfo ensureBadge() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get showRateTime => $_getI64(8);\n  @$pb.TagNumber(9)\n  set showRateTime($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasShowRateTime() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearShowRateTime() => $_clearField(9);\n}\n\nclass PlayStrategy extends $pb.GeneratedMessage {\n  factory PlayStrategy({\n    $core.Iterable<$core.String>? strategies,\n    $core.int? recommendShowStrategy,\n    $core.String? autoPlayToast,\n  }) {\n    final result = create();\n    if (strategies != null) result.strategies.addAll(strategies);\n    if (recommendShowStrategy != null)\n      result.recommendShowStrategy = recommendShowStrategy;\n    if (autoPlayToast != null) result.autoPlayToast = autoPlayToast;\n    return result;\n  }\n\n  PlayStrategy._();\n\n  factory PlayStrategy.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayStrategy.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayStrategy',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.pgcanymodel'),\n      createEmptyInstance: create)\n    ..pPS(1, _omitFieldNames ? '' : 'strategies')\n    ..aI(2, _omitFieldNames ? '' : 'recommendShowStrategy')\n    ..aOS(3, _omitFieldNames ? '' : 'autoPlayToast')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayStrategy clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayStrategy copyWith(void Function(PlayStrategy) updates) =>\n      super.copyWith((message) => updates(message as PlayStrategy))\n          as PlayStrategy;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayStrategy create() => PlayStrategy._();\n  @$core.override\n  PlayStrategy createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayStrategy getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayStrategy>(create);\n  static PlayStrategy? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<$core.String> get strategies => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.int get recommendShowStrategy => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set recommendShowStrategy($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasRecommendShowStrategy() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRecommendShowStrategy() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get autoPlayToast => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set autoPlayToast($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAutoPlayToast() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAutoPlayToast() => $_clearField(3);\n}\n\nclass Publish extends $pb.GeneratedMessage {\n  factory Publish({\n    $core.String? pubTime,\n    $core.String? pubTimeShow,\n    $core.int? isStarted,\n    $core.int? isFinish,\n    $core.int? weekday,\n    $core.String? releaseDateShow,\n    $core.String? timeLengthShow,\n    $core.int? unknowPubDate,\n    $core.String? updateInfoDesc,\n  }) {\n    final result = create();\n    if (pubTime != null) result.pubTime = pubTime;\n    if (pubTimeShow != null) result.pubTimeShow = pubTimeShow;\n    if (isStarted != null) result.isStarted = isStarted;\n    if (isFinish != null) result.isFinish = isFinish;\n    if (weekday != null) result.weekday = weekday;\n    if (releaseDateShow != null) result.releaseDateShow = releaseDateShow;\n    if (timeLengthShow != null) result.timeLengthShow = timeLengthShow;\n    if (unknowPubDate != null) result.unknowPubDate = unknowPubDate;\n    if (updateInfoDesc != null) result.updateInfoDesc = updateInfoDesc;\n    return result;\n  }\n\n  Publish._();\n\n  factory Publish.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Publish.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Publish',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.pgcanymodel'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'pubTime')\n    ..aOS(2, _omitFieldNames ? '' : 'pubTimeShow')\n    ..aI(3, _omitFieldNames ? '' : 'isStarted')\n    ..aI(4, _omitFieldNames ? '' : 'isFinish')\n    ..aI(5, _omitFieldNames ? '' : 'weekday')\n    ..aOS(6, _omitFieldNames ? '' : 'releaseDateShow')\n    ..aOS(7, _omitFieldNames ? '' : 'timeLengthShow')\n    ..aI(8, _omitFieldNames ? '' : 'unknowPubDate')\n    ..aOS(9, _omitFieldNames ? '' : 'updateInfoDesc')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Publish clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Publish copyWith(void Function(Publish) updates) =>\n      super.copyWith((message) => updates(message as Publish)) as Publish;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Publish create() => Publish._();\n  @$core.override\n  Publish createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Publish getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Publish>(create);\n  static Publish? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get pubTime => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set pubTime($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPubTime() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPubTime() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get pubTimeShow => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set pubTimeShow($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPubTimeShow() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPubTimeShow() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get isStarted => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set isStarted($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIsStarted() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIsStarted() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get isFinish => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set isFinish($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIsFinish() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIsFinish() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get weekday => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set weekday($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasWeekday() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearWeekday() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get releaseDateShow => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set releaseDateShow($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasReleaseDateShow() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearReleaseDateShow() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get timeLengthShow => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set timeLengthShow($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasTimeLengthShow() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearTimeLengthShow() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get unknowPubDate => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set unknowPubDate($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasUnknowPubDate() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearUnknowPubDate() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get updateInfoDesc => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set updateInfoDesc($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasUpdateInfoDesc() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearUpdateInfoDesc() => $_clearField(9);\n}\n\nclass Reserve extends $pb.GeneratedMessage {\n  factory Reserve({\n    $core.Iterable<$0.ViewEpisode>? episodes,\n    $core.String? tip,\n  }) {\n    final result = create();\n    if (episodes != null) result.episodes.addAll(episodes);\n    if (tip != null) result.tip = tip;\n    return result;\n  }\n\n  Reserve._();\n\n  factory Reserve.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Reserve.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Reserve',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.pgcanymodel'),\n      createEmptyInstance: create)\n    ..pPM<$0.ViewEpisode>(1, _omitFieldNames ? '' : 'episodes',\n        subBuilder: $0.ViewEpisode.create)\n    ..aOS(2, _omitFieldNames ? '' : 'tip')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Reserve clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Reserve copyWith(void Function(Reserve) updates) =>\n      super.copyWith((message) => updates(message as Reserve)) as Reserve;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Reserve create() => Reserve._();\n  @$core.override\n  Reserve createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Reserve getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Reserve>(create);\n  static Reserve? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<$0.ViewEpisode> get episodes => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.String get tip => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set tip($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTip() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTip() => $_clearField(2);\n}\n\nclass Rights extends $pb.GeneratedMessage {\n  factory Rights({\n    $core.int? allowDownload,\n    $core.int? allowReview,\n    $core.int? canWatch,\n    $core.int? isCoverShow,\n    $core.String? copyright,\n    $core.String? copyrightName,\n    $core.int? allowBp,\n    $core.int? areaLimit,\n    $core.int? isPreview,\n    $core.int? banAreaShow,\n    $core.int? watchPlatform,\n    $core.int? allowBpRank,\n    $core.String? resource,\n    $core.int? forbidPre,\n    $core.int? onlyVipDownload,\n    $core.int? newAllowDownload,\n  }) {\n    final result = create();\n    if (allowDownload != null) result.allowDownload = allowDownload;\n    if (allowReview != null) result.allowReview = allowReview;\n    if (canWatch != null) result.canWatch = canWatch;\n    if (isCoverShow != null) result.isCoverShow = isCoverShow;\n    if (copyright != null) result.copyright = copyright;\n    if (copyrightName != null) result.copyrightName = copyrightName;\n    if (allowBp != null) result.allowBp = allowBp;\n    if (areaLimit != null) result.areaLimit = areaLimit;\n    if (isPreview != null) result.isPreview = isPreview;\n    if (banAreaShow != null) result.banAreaShow = banAreaShow;\n    if (watchPlatform != null) result.watchPlatform = watchPlatform;\n    if (allowBpRank != null) result.allowBpRank = allowBpRank;\n    if (resource != null) result.resource = resource;\n    if (forbidPre != null) result.forbidPre = forbidPre;\n    if (onlyVipDownload != null) result.onlyVipDownload = onlyVipDownload;\n    if (newAllowDownload != null) result.newAllowDownload = newAllowDownload;\n    return result;\n  }\n\n  Rights._();\n\n  factory Rights.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Rights.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Rights',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.pgcanymodel'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'allowDownload')\n    ..aI(2, _omitFieldNames ? '' : 'allowReview')\n    ..aI(3, _omitFieldNames ? '' : 'canWatch')\n    ..aI(4, _omitFieldNames ? '' : 'isCoverShow')\n    ..aOS(5, _omitFieldNames ? '' : 'copyright')\n    ..aOS(6, _omitFieldNames ? '' : 'copyrightName')\n    ..aI(7, _omitFieldNames ? '' : 'allowBp')\n    ..aI(8, _omitFieldNames ? '' : 'areaLimit')\n    ..aI(9, _omitFieldNames ? '' : 'isPreview')\n    ..aI(10, _omitFieldNames ? '' : 'banAreaShow')\n    ..aI(11, _omitFieldNames ? '' : 'watchPlatform')\n    ..aI(12, _omitFieldNames ? '' : 'allowBpRank')\n    ..aOS(13, _omitFieldNames ? '' : 'resource')\n    ..aI(14, _omitFieldNames ? '' : 'forbidPre')\n    ..aI(15, _omitFieldNames ? '' : 'onlyVipDownload')\n    ..aI(16, _omitFieldNames ? '' : 'newAllowDownload')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Rights clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Rights copyWith(void Function(Rights) updates) =>\n      super.copyWith((message) => updates(message as Rights)) as Rights;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Rights create() => Rights._();\n  @$core.override\n  Rights createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Rights getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Rights>(create);\n  static Rights? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get allowDownload => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set allowDownload($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAllowDownload() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAllowDownload() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get allowReview => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set allowReview($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAllowReview() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAllowReview() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get canWatch => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set canWatch($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCanWatch() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCanWatch() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get isCoverShow => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set isCoverShow($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIsCoverShow() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIsCoverShow() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get copyright => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set copyright($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCopyright() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCopyright() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get copyrightName => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set copyrightName($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCopyrightName() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCopyrightName() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get allowBp => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set allowBp($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasAllowBp() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearAllowBp() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get areaLimit => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set areaLimit($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasAreaLimit() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearAreaLimit() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.int get isPreview => $_getIZ(8);\n  @$pb.TagNumber(9)\n  set isPreview($core.int value) => $_setSignedInt32(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasIsPreview() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearIsPreview() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.int get banAreaShow => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set banAreaShow($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasBanAreaShow() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearBanAreaShow() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.int get watchPlatform => $_getIZ(10);\n  @$pb.TagNumber(11)\n  set watchPlatform($core.int value) => $_setSignedInt32(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasWatchPlatform() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearWatchPlatform() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.int get allowBpRank => $_getIZ(11);\n  @$pb.TagNumber(12)\n  set allowBpRank($core.int value) => $_setSignedInt32(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasAllowBpRank() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearAllowBpRank() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.String get resource => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set resource($core.String value) => $_setString(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasResource() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearResource() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.int get forbidPre => $_getIZ(13);\n  @$pb.TagNumber(14)\n  set forbidPre($core.int value) => $_setSignedInt32(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasForbidPre() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearForbidPre() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $core.int get onlyVipDownload => $_getIZ(14);\n  @$pb.TagNumber(15)\n  set onlyVipDownload($core.int value) => $_setSignedInt32(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasOnlyVipDownload() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearOnlyVipDownload() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $core.int get newAllowDownload => $_getIZ(15);\n  @$pb.TagNumber(16)\n  set newAllowDownload($core.int value) => $_setSignedInt32(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasNewAllowDownload() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearNewAllowDownload() => $_clearField(16);\n}\n\nclass Skin extends $pb.GeneratedMessage {\n  factory Skin({\n    $core.String? tabTextColor,\n    $core.String? tabTextNightColor,\n    $core.String? bgImg,\n    $core.String? bgImgNight,\n    $core.String? dmInputFrameBgColor,\n    $core.String? dmInputFrameBgNightColor,\n    $core.String? dmInputFrameColor,\n    $core.String? dmInputFrameNightColor,\n    $core.String? dmBtnBgColor,\n    $core.String? dmBtnBgNightColor,\n    $core.String? dmBtnIconColor,\n    $core.String? dmBtnIconNightColor,\n    $core.String? dmInputTextColor,\n    $core.String? dmInputTextNightColor,\n  }) {\n    final result = create();\n    if (tabTextColor != null) result.tabTextColor = tabTextColor;\n    if (tabTextNightColor != null) result.tabTextNightColor = tabTextNightColor;\n    if (bgImg != null) result.bgImg = bgImg;\n    if (bgImgNight != null) result.bgImgNight = bgImgNight;\n    if (dmInputFrameBgColor != null)\n      result.dmInputFrameBgColor = dmInputFrameBgColor;\n    if (dmInputFrameBgNightColor != null)\n      result.dmInputFrameBgNightColor = dmInputFrameBgNightColor;\n    if (dmInputFrameColor != null) result.dmInputFrameColor = dmInputFrameColor;\n    if (dmInputFrameNightColor != null)\n      result.dmInputFrameNightColor = dmInputFrameNightColor;\n    if (dmBtnBgColor != null) result.dmBtnBgColor = dmBtnBgColor;\n    if (dmBtnBgNightColor != null) result.dmBtnBgNightColor = dmBtnBgNightColor;\n    if (dmBtnIconColor != null) result.dmBtnIconColor = dmBtnIconColor;\n    if (dmBtnIconNightColor != null)\n      result.dmBtnIconNightColor = dmBtnIconNightColor;\n    if (dmInputTextColor != null) result.dmInputTextColor = dmInputTextColor;\n    if (dmInputTextNightColor != null)\n      result.dmInputTextNightColor = dmInputTextNightColor;\n    return result;\n  }\n\n  Skin._();\n\n  factory Skin.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Skin.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Skin',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.pgcanymodel'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'tabTextColor')\n    ..aOS(2, _omitFieldNames ? '' : 'tabTextNightColor')\n    ..aOS(3, _omitFieldNames ? '' : 'bgImg')\n    ..aOS(4, _omitFieldNames ? '' : 'bgImgNight')\n    ..aOS(5, _omitFieldNames ? '' : 'dmInputFrameBgColor')\n    ..aOS(6, _omitFieldNames ? '' : 'dmInputFrameBgNightColor')\n    ..aOS(7, _omitFieldNames ? '' : 'dmInputFrameColor')\n    ..aOS(8, _omitFieldNames ? '' : 'dmInputFrameNightColor')\n    ..aOS(9, _omitFieldNames ? '' : 'dmBtnBgColor')\n    ..aOS(10, _omitFieldNames ? '' : 'dmBtnBgNightColor')\n    ..aOS(11, _omitFieldNames ? '' : 'dmBtnIconColor')\n    ..aOS(12, _omitFieldNames ? '' : 'dmBtnIconNightColor')\n    ..aOS(13, _omitFieldNames ? '' : 'dmInputTextColor')\n    ..aOS(14, _omitFieldNames ? '' : 'dmInputTextNightColor')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Skin clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Skin copyWith(void Function(Skin) updates) =>\n      super.copyWith((message) => updates(message as Skin)) as Skin;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Skin create() => Skin._();\n  @$core.override\n  Skin createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Skin getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Skin>(create);\n  static Skin? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get tabTextColor => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set tabTextColor($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTabTextColor() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTabTextColor() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get tabTextNightColor => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set tabTextNightColor($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTabTextNightColor() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTabTextNightColor() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get bgImg => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set bgImg($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBgImg() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBgImg() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get bgImgNight => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set bgImgNight($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBgImgNight() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBgImgNight() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get dmInputFrameBgColor => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set dmInputFrameBgColor($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDmInputFrameBgColor() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDmInputFrameBgColor() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get dmInputFrameBgNightColor => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set dmInputFrameBgNightColor($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasDmInputFrameBgNightColor() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearDmInputFrameBgNightColor() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get dmInputFrameColor => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set dmInputFrameColor($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasDmInputFrameColor() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearDmInputFrameColor() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get dmInputFrameNightColor => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set dmInputFrameNightColor($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasDmInputFrameNightColor() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearDmInputFrameNightColor() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get dmBtnBgColor => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set dmBtnBgColor($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasDmBtnBgColor() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearDmBtnBgColor() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get dmBtnBgNightColor => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set dmBtnBgNightColor($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasDmBtnBgNightColor() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearDmBtnBgNightColor() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get dmBtnIconColor => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set dmBtnIconColor($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasDmBtnIconColor() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearDmBtnIconColor() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get dmBtnIconNightColor => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set dmBtnIconNightColor($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasDmBtnIconNightColor() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearDmBtnIconNightColor() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.String get dmInputTextColor => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set dmInputTextColor($core.String value) => $_setString(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasDmInputTextColor() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearDmInputTextColor() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.String get dmInputTextNightColor => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set dmInputTextNightColor($core.String value) => $_setString(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasDmInputTextNightColor() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearDmInputTextNightColor() => $_clearField(14);\n}\n\nclass Stat extends $pb.GeneratedMessage {\n  factory Stat({\n    $core.String? followers,\n    $0.StatInfo? playData,\n  }) {\n    final result = create();\n    if (followers != null) result.followers = followers;\n    if (playData != null) result.playData = playData;\n    return result;\n  }\n\n  Stat._();\n\n  factory Stat.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Stat.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Stat',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.pgcanymodel'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'followers')\n    ..aOM<$0.StatInfo>(2, _omitFieldNames ? '' : 'playData',\n        subBuilder: $0.StatInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Stat clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Stat copyWith(void Function(Stat) updates) =>\n      super.copyWith((message) => updates(message as Stat)) as Stat;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Stat create() => Stat._();\n  @$core.override\n  Stat createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Stat getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Stat>(create);\n  static Stat? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get followers => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set followers($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFollowers() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFollowers() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $0.StatInfo get playData => $_getN(1);\n  @$pb.TagNumber(2)\n  set playData($0.StatInfo value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPlayData() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPlayData() => $_clearField(2);\n  @$pb.TagNumber(2)\n  $0.StatInfo ensurePlayData() => $_ensure(1);\n}\n\nclass UserStatus extends $pb.GeneratedMessage {\n  factory UserStatus({\n    $core.int? show,\n    $core.int? follow,\n    $core.int? followStatus,\n    $core.int? pay,\n    $core.int? sponsor,\n    $core.int? vip,\n    $core.int? vipFrozen,\n    WatchProgress? watchProgress,\n  }) {\n    final result = create();\n    if (show != null) result.show = show;\n    if (follow != null) result.follow = follow;\n    if (followStatus != null) result.followStatus = followStatus;\n    if (pay != null) result.pay = pay;\n    if (sponsor != null) result.sponsor = sponsor;\n    if (vip != null) result.vip = vip;\n    if (vipFrozen != null) result.vipFrozen = vipFrozen;\n    if (watchProgress != null) result.watchProgress = watchProgress;\n    return result;\n  }\n\n  UserStatus._();\n\n  factory UserStatus.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UserStatus.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UserStatus',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.pgcanymodel'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'show')\n    ..aI(2, _omitFieldNames ? '' : 'follow')\n    ..aI(3, _omitFieldNames ? '' : 'followStatus')\n    ..aI(4, _omitFieldNames ? '' : 'pay')\n    ..aI(5, _omitFieldNames ? '' : 'sponsor')\n    ..aI(6, _omitFieldNames ? '' : 'vip')\n    ..aI(7, _omitFieldNames ? '' : 'vipFrozen')\n    ..aOM<WatchProgress>(8, _omitFieldNames ? '' : 'watchProgress',\n        subBuilder: WatchProgress.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserStatus clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserStatus copyWith(void Function(UserStatus) updates) =>\n      super.copyWith((message) => updates(message as UserStatus)) as UserStatus;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UserStatus create() => UserStatus._();\n  @$core.override\n  UserStatus createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UserStatus getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UserStatus>(create);\n  static UserStatus? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get show => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set show($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasShow() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearShow() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get follow => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set follow($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFollow() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFollow() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get followStatus => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set followStatus($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFollowStatus() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFollowStatus() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get pay => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set pay($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPay() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPay() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get sponsor => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set sponsor($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasSponsor() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearSponsor() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get vip => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set vip($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasVip() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearVip() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get vipFrozen => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set vipFrozen($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasVipFrozen() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearVipFrozen() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  WatchProgress get watchProgress => $_getN(7);\n  @$pb.TagNumber(8)\n  set watchProgress(WatchProgress value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasWatchProgress() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearWatchProgress() => $_clearField(8);\n  @$pb.TagNumber(8)\n  WatchProgress ensureWatchProgress() => $_ensure(7);\n}\n\nclass ViewPgcAny extends $pb.GeneratedMessage {\n  factory ViewPgcAny({\n    OgvData? ogvData,\n    $core.Iterable<$core.MapEntry<$fixnum.Int64, $0.Staff>>? allUpInfo,\n  }) {\n    final result = create();\n    if (ogvData != null) result.ogvData = ogvData;\n    if (allUpInfo != null) result.allUpInfo.addEntries(allUpInfo);\n    return result;\n  }\n\n  ViewPgcAny._();\n\n  factory ViewPgcAny.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ViewPgcAny.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ViewPgcAny',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.pgcanymodel'),\n      createEmptyInstance: create)\n    ..aOM<OgvData>(1, _omitFieldNames ? '' : 'ogvData',\n        subBuilder: OgvData.create)\n    ..m<$fixnum.Int64, $0.Staff>(2, _omitFieldNames ? '' : 'allUpInfo',\n        entryClassName: 'ViewPgcAny.AllUpInfoEntry',\n        keyFieldType: $pb.PbFieldType.O6,\n        valueFieldType: $pb.PbFieldType.OM,\n        valueCreator: $0.Staff.create,\n        valueDefaultOrMaker: $0.Staff.getDefault,\n        packageName:\n            const $pb.PackageName('bilibili.app.viewunite.pgcanymodel'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ViewPgcAny clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ViewPgcAny copyWith(void Function(ViewPgcAny) updates) =>\n      super.copyWith((message) => updates(message as ViewPgcAny)) as ViewPgcAny;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ViewPgcAny create() => ViewPgcAny._();\n  @$core.override\n  ViewPgcAny createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ViewPgcAny getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ViewPgcAny>(create);\n  static ViewPgcAny? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  OgvData get ogvData => $_getN(0);\n  @$pb.TagNumber(1)\n  set ogvData(OgvData value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOgvData() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOgvData() => $_clearField(1);\n  @$pb.TagNumber(1)\n  OgvData ensureOgvData() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $pb.PbMap<$fixnum.Int64, $0.Staff> get allUpInfo => $_getMap(1);\n}\n\nclass WatchProgress extends $pb.GeneratedMessage {\n  factory WatchProgress({\n    $fixnum.Int64? lastEpId,\n    $core.String? lastEpIndex,\n    $fixnum.Int64? lastTime,\n  }) {\n    final result = create();\n    if (lastEpId != null) result.lastEpId = lastEpId;\n    if (lastEpIndex != null) result.lastEpIndex = lastEpIndex;\n    if (lastTime != null) result.lastTime = lastTime;\n    return result;\n  }\n\n  WatchProgress._();\n\n  factory WatchProgress.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory WatchProgress.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'WatchProgress',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.pgcanymodel'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'lastEpId')\n    ..aOS(2, _omitFieldNames ? '' : 'lastEpIndex')\n    ..aInt64(3, _omitFieldNames ? '' : 'lastTime')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  WatchProgress clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  WatchProgress copyWith(void Function(WatchProgress) updates) =>\n      super.copyWith((message) => updates(message as WatchProgress))\n          as WatchProgress;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static WatchProgress create() => WatchProgress._();\n  @$core.override\n  WatchProgress createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static WatchProgress getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<WatchProgress>(create);\n  static WatchProgress? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get lastEpId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set lastEpId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLastEpId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLastEpId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get lastEpIndex => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set lastEpIndex($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLastEpIndex() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLastEpIndex() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get lastTime => $_getI64(2);\n  @$pb.TagNumber(3)\n  set lastTime($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLastTime() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLastTime() => $_clearField(3);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/viewunite/pgcanymodel.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/viewunite/pgcanymodel.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n"
  },
  {
    "path": "lib/grpc/bilibili/app/viewunite/pgcanymodel.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/viewunite/pgcanymodel.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use earphoneDescriptor instead')\nconst Earphone$json = {\n  '1': 'Earphone',\n  '2': [\n    {'1': 'product_model', '3': 1, '4': 1, '5': 9, '10': 'productModel'},\n    {'1': 'like_toast_text', '3': 2, '4': 1, '5': 9, '10': 'likeToastText'},\n    {'1': 'switch_toast_text', '3': 3, '4': 1, '5': 9, '10': 'switchToastText'},\n    {'1': 'like_toast_voice', '3': 4, '4': 1, '5': 9, '10': 'likeToastVoice'},\n  ],\n};\n\n/// Descriptor for `Earphone`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List earphoneDescriptor = $convert.base64Decode(\n    'CghFYXJwaG9uZRIjCg1wcm9kdWN0X21vZGVsGAEgASgJUgxwcm9kdWN0TW9kZWwSJgoPbGlrZV'\n    '90b2FzdF90ZXh0GAIgASgJUg1saWtlVG9hc3RUZXh0EioKEXN3aXRjaF90b2FzdF90ZXh0GAMg'\n    'ASgJUg9zd2l0Y2hUb2FzdFRleHQSKAoQbGlrZV90b2FzdF92b2ljZRgEIAEoCVIObGlrZVRvYX'\n    'N0Vm9pY2U=');\n\n@$core.Deprecated('Use earphoneConfDescriptor instead')\nconst EarphoneConf$json = {\n  '1': 'EarphoneConf',\n  '2': [\n    {\n      '1': 'sp_phones',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.pgcanymodel.Earphone',\n      '10': 'spPhones'\n    },\n  ],\n};\n\n/// Descriptor for `EarphoneConf`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List earphoneConfDescriptor = $convert.base64Decode(\n    'CgxFYXJwaG9uZUNvbmYSSQoJc3BfcGhvbmVzGAEgAygLMiwuYmlsaWJpbGkuYXBwLnZpZXd1bm'\n    'l0ZS5wZ2Nhbnltb2RlbC5FYXJwaG9uZVIIc3BQaG9uZXM=');\n\n@$core.Deprecated('Use multiViewInfoDescriptor instead')\nconst MultiViewInfo$json = {\n  '1': 'MultiViewInfo',\n  '2': [\n    {\n      '1': 'is_multi_view_season',\n      '3': 1,\n      '4': 1,\n      '5': 8,\n      '10': 'isMultiViewSeason'\n    },\n    {'1': 'changing_dance', '3': 2, '4': 1, '5': 9, '10': 'changingDance'},\n  ],\n};\n\n/// Descriptor for `MultiViewInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List multiViewInfoDescriptor = $convert.base64Decode(\n    'Cg1NdWx0aVZpZXdJbmZvEi8KFGlzX211bHRpX3ZpZXdfc2Vhc29uGAEgASgIUhFpc011bHRpVm'\n    'lld1NlYXNvbhIlCg5jaGFuZ2luZ19kYW5jZRgCIAEoCVINY2hhbmdpbmdEYW5jZQ==');\n\n@$core.Deprecated('Use ogvDataDescriptor instead')\nconst OgvData$json = {\n  '1': 'OgvData',\n  '2': [\n    {'1': 'media_id', '3': 1, '4': 1, '5': 5, '10': 'mediaId'},\n    {'1': 'season_id', '3': 2, '4': 1, '5': 3, '10': 'seasonId'},\n    {'1': 'season_type', '3': 3, '4': 1, '5': 5, '10': 'seasonType'},\n    {'1': 'show_season_type', '3': 4, '4': 1, '5': 5, '10': 'showSeasonType'},\n    {\n      '1': 'rights',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.pgcanymodel.Rights',\n      '10': 'rights'\n    },\n    {\n      '1': 'user_status',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.pgcanymodel.UserStatus',\n      '10': 'userStatus'\n    },\n    {'1': 'aid', '3': 7, '4': 1, '5': 3, '10': 'aid'},\n    {\n      '1': 'stat',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.pgcanymodel.Stat',\n      '10': 'stat'\n    },\n    {'1': 'mode', '3': 9, '4': 1, '5': 5, '10': 'mode'},\n    {\n      '1': 'publish',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.pgcanymodel.Publish',\n      '10': 'publish'\n    },\n    {\n      '1': 'play_strategy',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.pgcanymodel.PlayStrategy',\n      '10': 'playStrategy'\n    },\n    {\n      '1': 'multi_view_info',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.pgcanymodel.MultiViewInfo',\n      '10': 'multiViewInfo'\n    },\n    {\n      '1': 'ogv_switch',\n      '3': 13,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.pgcanymodel.OgvSwitch',\n      '10': 'ogvSwitch'\n    },\n    {'1': 'total_ep', '3': 14, '4': 1, '5': 5, '10': 'totalEp'},\n    {\n      '1': 'new_ep',\n      '3': 15,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.NewEp',\n      '10': 'newEp'\n    },\n    {\n      '1': 'reserve',\n      '3': 16,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.pgcanymodel.Reserve',\n      '10': 'reserve'\n    },\n    {'1': 'status', '3': 17, '4': 1, '5': 5, '10': 'status'},\n    {\n      '1': 'activity_float_layer',\n      '3': 18,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.pgcanymodel.PlayFloatLayerActivity',\n      '10': 'activityFloatLayer'\n    },\n    {\n      '1': 'earphone_conf',\n      '3': 19,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.pgcanymodel.EarphoneConf',\n      '10': 'earphoneConf'\n    },\n    {'1': 'cover', '3': 20, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'square_cover', '3': 21, '4': 1, '5': 9, '10': 'squareCover'},\n    {'1': 'share_url', '3': 22, '4': 1, '5': 9, '10': 'shareUrl'},\n    {'1': 'short_link', '3': 23, '4': 1, '5': 9, '10': 'shortLink'},\n    {'1': 'title', '3': 24, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'horizontal_cover169',\n      '3': 25,\n      '4': 1,\n      '5': 9,\n      '10': 'horizontalCover169'\n    },\n    {\n      '1': 'horizontal_cover1610',\n      '3': 26,\n      '4': 1,\n      '5': 9,\n      '10': 'horizontalCover1610'\n    },\n    {'1': 'has_can_play_ep', '3': 27, '4': 1, '5': 5, '10': 'hasCanPlayEp'},\n    {\n      '1': 'skin',\n      '3': 28,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.pgcanymodel.Skin',\n      '10': 'skin'\n    },\n  ],\n};\n\n/// Descriptor for `OgvData`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List ogvDataDescriptor = $convert.base64Decode(\n    'CgdPZ3ZEYXRhEhkKCG1lZGlhX2lkGAEgASgFUgdtZWRpYUlkEhsKCXNlYXNvbl9pZBgCIAEoA1'\n    'IIc2Vhc29uSWQSHwoLc2Vhc29uX3R5cGUYAyABKAVSCnNlYXNvblR5cGUSKAoQc2hvd19zZWFz'\n    'b25fdHlwZRgEIAEoBVIOc2hvd1NlYXNvblR5cGUSQgoGcmlnaHRzGAUgASgLMiouYmlsaWJpbG'\n    'kuYXBwLnZpZXd1bml0ZS5wZ2Nhbnltb2RlbC5SaWdodHNSBnJpZ2h0cxJPCgt1c2VyX3N0YXR1'\n    'cxgGIAEoCzIuLmJpbGliaWxpLmFwcC52aWV3dW5pdGUucGdjYW55bW9kZWwuVXNlclN0YXR1c1'\n    'IKdXNlclN0YXR1cxIQCgNhaWQYByABKANSA2FpZBI8CgRzdGF0GAggASgLMiguYmlsaWJpbGku'\n    'YXBwLnZpZXd1bml0ZS5wZ2Nhbnltb2RlbC5TdGF0UgRzdGF0EhIKBG1vZGUYCSABKAVSBG1vZG'\n    'USRQoHcHVibGlzaBgKIAEoCzIrLmJpbGliaWxpLmFwcC52aWV3dW5pdGUucGdjYW55bW9kZWwu'\n    'UHVibGlzaFIHcHVibGlzaBJVCg1wbGF5X3N0cmF0ZWd5GAsgASgLMjAuYmlsaWJpbGkuYXBwLn'\n    'ZpZXd1bml0ZS5wZ2Nhbnltb2RlbC5QbGF5U3RyYXRlZ3lSDHBsYXlTdHJhdGVneRJZCg9tdWx0'\n    'aV92aWV3X2luZm8YDCABKAsyMS5iaWxpYmlsaS5hcHAudmlld3VuaXRlLnBnY2FueW1vZGVsLk'\n    '11bHRpVmlld0luZm9SDW11bHRpVmlld0luZm8STAoKb2d2X3N3aXRjaBgNIAEoCzItLmJpbGli'\n    'aWxpLmFwcC52aWV3dW5pdGUucGdjYW55bW9kZWwuT2d2U3dpdGNoUglvZ3ZTd2l0Y2gSGQoIdG'\n    '90YWxfZXAYDiABKAVSB3RvdGFsRXASOwoGbmV3X2VwGA8gASgLMiQuYmlsaWJpbGkuYXBwLnZp'\n    'ZXd1bml0ZS5jb21tb24uTmV3RXBSBW5ld0VwEkUKB3Jlc2VydmUYECABKAsyKy5iaWxpYmlsaS'\n    '5hcHAudmlld3VuaXRlLnBnY2FueW1vZGVsLlJlc2VydmVSB3Jlc2VydmUSFgoGc3RhdHVzGBEg'\n    'ASgFUgZzdGF0dXMSbAoUYWN0aXZpdHlfZmxvYXRfbGF5ZXIYEiADKAsyOi5iaWxpYmlsaS5hcH'\n    'Audmlld3VuaXRlLnBnY2FueW1vZGVsLlBsYXlGbG9hdExheWVyQWN0aXZpdHlSEmFjdGl2aXR5'\n    'RmxvYXRMYXllchJVCg1lYXJwaG9uZV9jb25mGBMgASgLMjAuYmlsaWJpbGkuYXBwLnZpZXd1bm'\n    'l0ZS5wZ2Nhbnltb2RlbC5FYXJwaG9uZUNvbmZSDGVhcnBob25lQ29uZhIUCgVjb3ZlchgUIAEo'\n    'CVIFY292ZXISIQoMc3F1YXJlX2NvdmVyGBUgASgJUgtzcXVhcmVDb3ZlchIbCglzaGFyZV91cm'\n    'wYFiABKAlSCHNoYXJlVXJsEh0KCnNob3J0X2xpbmsYFyABKAlSCXNob3J0TGluaxIUCgV0aXRs'\n    'ZRgYIAEoCVIFdGl0bGUSLwoTaG9yaXpvbnRhbF9jb3ZlcjE2ORgZIAEoCVISaG9yaXpvbnRhbE'\n    'NvdmVyMTY5EjEKFGhvcml6b250YWxfY292ZXIxNjEwGBogASgJUhNob3Jpem9udGFsQ292ZXIx'\n    'NjEwEiUKD2hhc19jYW5fcGxheV9lcBgbIAEoBVIMaGFzQ2FuUGxheUVwEjwKBHNraW4YHCABKA'\n    'syKC5iaWxpYmlsaS5hcHAudmlld3VuaXRlLnBnY2FueW1vZGVsLlNraW5SBHNraW4=');\n\n@$core.Deprecated('Use ogvSwitchDescriptor instead')\nconst OgvSwitch$json = {\n  '1': 'OgvSwitch',\n  '2': [\n    {\n      '1': 'reduce_short_title_spacing',\n      '3': 1,\n      '4': 1,\n      '5': 5,\n      '10': 'reduceShortTitleSpacing'\n    },\n    {\n      '1': 'merge_position_section_for_cinema',\n      '3': 2,\n      '4': 1,\n      '5': 5,\n      '10': 'mergePositionSectionForCinema'\n    },\n    {\n      '1': 'merge_preview_section',\n      '3': 3,\n      '4': 1,\n      '5': 5,\n      '10': 'mergePreviewSection'\n    },\n    {\n      '1': 'enable_show_vt_info',\n      '3': 4,\n      '4': 1,\n      '5': 5,\n      '10': 'enableShowVtInfo'\n    },\n    {'1': 'hide_ep_vv_vt_dm', '3': 5, '4': 1, '5': 5, '10': 'hideEpVvVtDm'},\n    {'1': 'follow_guide', '3': 6, '4': 1, '5': 5, '10': 'followGuide'},\n  ],\n};\n\n/// Descriptor for `OgvSwitch`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List ogvSwitchDescriptor = $convert.base64Decode(\n    'CglPZ3ZTd2l0Y2gSOwoacmVkdWNlX3Nob3J0X3RpdGxlX3NwYWNpbmcYASABKAVSF3JlZHVjZV'\n    'Nob3J0VGl0bGVTcGFjaW5nEkgKIW1lcmdlX3Bvc2l0aW9uX3NlY3Rpb25fZm9yX2NpbmVtYRgC'\n    'IAEoBVIdbWVyZ2VQb3NpdGlvblNlY3Rpb25Gb3JDaW5lbWESMgoVbWVyZ2VfcHJldmlld19zZW'\n    'N0aW9uGAMgASgFUhNtZXJnZVByZXZpZXdTZWN0aW9uEi0KE2VuYWJsZV9zaG93X3Z0X2luZm8Y'\n    'BCABKAVSEGVuYWJsZVNob3dWdEluZm8SJgoQaGlkZV9lcF92dl92dF9kbRgFIAEoBVIMaGlkZU'\n    'VwVnZWdERtEiEKDGZvbGxvd19ndWlkZRgGIAEoBVILZm9sbG93R3VpZGU=');\n\n@$core.Deprecated('Use playFloatLayerActivityDescriptor instead')\nconst PlayFloatLayerActivity$json = {\n  '1': 'PlayFloatLayerActivity',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 5, '10': 'id'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'type', '3': 3, '4': 1, '5': 5, '10': 'type'},\n    {'1': 'ad_badge_type', '3': 4, '4': 1, '5': 5, '10': 'adBadgeType'},\n    {'1': 'link', '3': 5, '4': 1, '5': 9, '10': 'link'},\n    {'1': 'pic_url', '3': 6, '4': 1, '5': 9, '10': 'picUrl'},\n    {'1': 'pic_anima_url', '3': 7, '4': 1, '5': 9, '10': 'picAnimaUrl'},\n    {\n      '1': 'badge',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.BadgeInfo',\n      '10': 'badge'\n    },\n    {'1': 'show_rate_time', '3': 9, '4': 1, '5': 3, '10': 'showRateTime'},\n  ],\n};\n\n/// Descriptor for `PlayFloatLayerActivity`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playFloatLayerActivityDescriptor = $convert.base64Decode(\n    'ChZQbGF5RmxvYXRMYXllckFjdGl2aXR5Eg4KAmlkGAEgASgFUgJpZBIUCgV0aXRsZRgCIAEoCV'\n    'IFdGl0bGUSEgoEdHlwZRgDIAEoBVIEdHlwZRIiCg1hZF9iYWRnZV90eXBlGAQgASgFUgthZEJh'\n    'ZGdlVHlwZRISCgRsaW5rGAUgASgJUgRsaW5rEhcKB3BpY191cmwYBiABKAlSBnBpY1VybBIiCg'\n    '1waWNfYW5pbWFfdXJsGAcgASgJUgtwaWNBbmltYVVybBI+CgViYWRnZRgIIAEoCzIoLmJpbGli'\n    'aWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLkJhZGdlSW5mb1IFYmFkZ2USJAoOc2hvd19yYXRlX3'\n    'RpbWUYCSABKANSDHNob3dSYXRlVGltZQ==');\n\n@$core.Deprecated('Use playStrategyDescriptor instead')\nconst PlayStrategy$json = {\n  '1': 'PlayStrategy',\n  '2': [\n    {'1': 'strategies', '3': 1, '4': 3, '5': 9, '10': 'strategies'},\n    {\n      '1': 'recommend_show_strategy',\n      '3': 2,\n      '4': 1,\n      '5': 5,\n      '10': 'recommendShowStrategy'\n    },\n    {'1': 'auto_play_toast', '3': 3, '4': 1, '5': 9, '10': 'autoPlayToast'},\n  ],\n};\n\n/// Descriptor for `PlayStrategy`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playStrategyDescriptor = $convert.base64Decode(\n    'CgxQbGF5U3RyYXRlZ3kSHgoKc3RyYXRlZ2llcxgBIAMoCVIKc3RyYXRlZ2llcxI2ChdyZWNvbW'\n    '1lbmRfc2hvd19zdHJhdGVneRgCIAEoBVIVcmVjb21tZW5kU2hvd1N0cmF0ZWd5EiYKD2F1dG9f'\n    'cGxheV90b2FzdBgDIAEoCVINYXV0b1BsYXlUb2FzdA==');\n\n@$core.Deprecated('Use publishDescriptor instead')\nconst Publish$json = {\n  '1': 'Publish',\n  '2': [\n    {'1': 'pub_time', '3': 1, '4': 1, '5': 9, '10': 'pubTime'},\n    {'1': 'pub_time_show', '3': 2, '4': 1, '5': 9, '10': 'pubTimeShow'},\n    {'1': 'is_started', '3': 3, '4': 1, '5': 5, '10': 'isStarted'},\n    {'1': 'is_finish', '3': 4, '4': 1, '5': 5, '10': 'isFinish'},\n    {'1': 'weekday', '3': 5, '4': 1, '5': 5, '10': 'weekday'},\n    {'1': 'release_date_show', '3': 6, '4': 1, '5': 9, '10': 'releaseDateShow'},\n    {'1': 'time_length_show', '3': 7, '4': 1, '5': 9, '10': 'timeLengthShow'},\n    {'1': 'unknow_pub_date', '3': 8, '4': 1, '5': 5, '10': 'unknowPubDate'},\n    {'1': 'update_info_desc', '3': 9, '4': 1, '5': 9, '10': 'updateInfoDesc'},\n  ],\n};\n\n/// Descriptor for `Publish`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List publishDescriptor = $convert.base64Decode(\n    'CgdQdWJsaXNoEhkKCHB1Yl90aW1lGAEgASgJUgdwdWJUaW1lEiIKDXB1Yl90aW1lX3Nob3cYAi'\n    'ABKAlSC3B1YlRpbWVTaG93Eh0KCmlzX3N0YXJ0ZWQYAyABKAVSCWlzU3RhcnRlZBIbCglpc19m'\n    'aW5pc2gYBCABKAVSCGlzRmluaXNoEhgKB3dlZWtkYXkYBSABKAVSB3dlZWtkYXkSKgoRcmVsZW'\n    'FzZV9kYXRlX3Nob3cYBiABKAlSD3JlbGVhc2VEYXRlU2hvdxIoChB0aW1lX2xlbmd0aF9zaG93'\n    'GAcgASgJUg50aW1lTGVuZ3RoU2hvdxImCg91bmtub3dfcHViX2RhdGUYCCABKAVSDXVua25vd1'\n    'B1YkRhdGUSKAoQdXBkYXRlX2luZm9fZGVzYxgJIAEoCVIOdXBkYXRlSW5mb0Rlc2M=');\n\n@$core.Deprecated('Use reserveDescriptor instead')\nconst Reserve$json = {\n  '1': 'Reserve',\n  '2': [\n    {\n      '1': 'episodes',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.ViewEpisode',\n      '10': 'episodes'\n    },\n    {'1': 'tip', '3': 2, '4': 1, '5': 9, '10': 'tip'},\n  ],\n};\n\n/// Descriptor for `Reserve`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reserveDescriptor = $convert.base64Decode(\n    'CgdSZXNlcnZlEkYKCGVwaXNvZGVzGAEgAygLMiouYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb2'\n    '1tb24uVmlld0VwaXNvZGVSCGVwaXNvZGVzEhAKA3RpcBgCIAEoCVIDdGlw');\n\n@$core.Deprecated('Use rightsDescriptor instead')\nconst Rights$json = {\n  '1': 'Rights',\n  '2': [\n    {'1': 'allow_download', '3': 1, '4': 1, '5': 5, '10': 'allowDownload'},\n    {'1': 'allow_review', '3': 2, '4': 1, '5': 5, '10': 'allowReview'},\n    {'1': 'can_watch', '3': 3, '4': 1, '5': 5, '10': 'canWatch'},\n    {'1': 'is_cover_show', '3': 4, '4': 1, '5': 5, '10': 'isCoverShow'},\n    {'1': 'copyright', '3': 5, '4': 1, '5': 9, '10': 'copyright'},\n    {'1': 'copyright_name', '3': 6, '4': 1, '5': 9, '10': 'copyrightName'},\n    {'1': 'allow_bp', '3': 7, '4': 1, '5': 5, '10': 'allowBp'},\n    {'1': 'area_limit', '3': 8, '4': 1, '5': 5, '10': 'areaLimit'},\n    {'1': 'is_preview', '3': 9, '4': 1, '5': 5, '10': 'isPreview'},\n    {'1': 'ban_area_show', '3': 10, '4': 1, '5': 5, '10': 'banAreaShow'},\n    {'1': 'watch_platform', '3': 11, '4': 1, '5': 5, '10': 'watchPlatform'},\n    {'1': 'allow_bp_rank', '3': 12, '4': 1, '5': 5, '10': 'allowBpRank'},\n    {'1': 'resource', '3': 13, '4': 1, '5': 9, '10': 'resource'},\n    {'1': 'forbid_pre', '3': 14, '4': 1, '5': 5, '10': 'forbidPre'},\n    {\n      '1': 'only_vip_download',\n      '3': 15,\n      '4': 1,\n      '5': 5,\n      '10': 'onlyVipDownload'\n    },\n    {\n      '1': 'new_allow_download',\n      '3': 16,\n      '4': 1,\n      '5': 5,\n      '10': 'newAllowDownload'\n    },\n  ],\n};\n\n/// Descriptor for `Rights`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rightsDescriptor = $convert.base64Decode(\n    'CgZSaWdodHMSJQoOYWxsb3dfZG93bmxvYWQYASABKAVSDWFsbG93RG93bmxvYWQSIQoMYWxsb3'\n    'dfcmV2aWV3GAIgASgFUgthbGxvd1JldmlldxIbCgljYW5fd2F0Y2gYAyABKAVSCGNhbldhdGNo'\n    'EiIKDWlzX2NvdmVyX3Nob3cYBCABKAVSC2lzQ292ZXJTaG93EhwKCWNvcHlyaWdodBgFIAEoCV'\n    'IJY29weXJpZ2h0EiUKDmNvcHlyaWdodF9uYW1lGAYgASgJUg1jb3B5cmlnaHROYW1lEhkKCGFs'\n    'bG93X2JwGAcgASgFUgdhbGxvd0JwEh0KCmFyZWFfbGltaXQYCCABKAVSCWFyZWFMaW1pdBIdCg'\n    'ppc19wcmV2aWV3GAkgASgFUglpc1ByZXZpZXcSIgoNYmFuX2FyZWFfc2hvdxgKIAEoBVILYmFu'\n    'QXJlYVNob3cSJQoOd2F0Y2hfcGxhdGZvcm0YCyABKAVSDXdhdGNoUGxhdGZvcm0SIgoNYWxsb3'\n    'dfYnBfcmFuaxgMIAEoBVILYWxsb3dCcFJhbmsSGgoIcmVzb3VyY2UYDSABKAlSCHJlc291cmNl'\n    'Eh0KCmZvcmJpZF9wcmUYDiABKAVSCWZvcmJpZFByZRIqChFvbmx5X3ZpcF9kb3dubG9hZBgPIA'\n    'EoBVIPb25seVZpcERvd25sb2FkEiwKEm5ld19hbGxvd19kb3dubG9hZBgQIAEoBVIQbmV3QWxs'\n    'b3dEb3dubG9hZA==');\n\n@$core.Deprecated('Use skinDescriptor instead')\nconst Skin$json = {\n  '1': 'Skin',\n  '2': [\n    {'1': 'tab_text_color', '3': 1, '4': 1, '5': 9, '10': 'tabTextColor'},\n    {\n      '1': 'tab_text_night_color',\n      '3': 2,\n      '4': 1,\n      '5': 9,\n      '10': 'tabTextNightColor'\n    },\n    {'1': 'bg_img', '3': 3, '4': 1, '5': 9, '10': 'bgImg'},\n    {'1': 'bg_img_night', '3': 4, '4': 1, '5': 9, '10': 'bgImgNight'},\n    {\n      '1': 'dm_input_frame_bg_color',\n      '3': 5,\n      '4': 1,\n      '5': 9,\n      '10': 'dmInputFrameBgColor'\n    },\n    {\n      '1': 'dm_input_frame_bg_night_color',\n      '3': 6,\n      '4': 1,\n      '5': 9,\n      '10': 'dmInputFrameBgNightColor'\n    },\n    {\n      '1': 'dm_input_frame_color',\n      '3': 7,\n      '4': 1,\n      '5': 9,\n      '10': 'dmInputFrameColor'\n    },\n    {\n      '1': 'dm_input_frame_night_color',\n      '3': 8,\n      '4': 1,\n      '5': 9,\n      '10': 'dmInputFrameNightColor'\n    },\n    {'1': 'dm_btn_bg_color', '3': 9, '4': 1, '5': 9, '10': 'dmBtnBgColor'},\n    {\n      '1': 'dm_btn_bg_night_color',\n      '3': 10,\n      '4': 1,\n      '5': 9,\n      '10': 'dmBtnBgNightColor'\n    },\n    {'1': 'dm_btn_icon_color', '3': 11, '4': 1, '5': 9, '10': 'dmBtnIconColor'},\n    {\n      '1': 'dm_btn_icon_night_color',\n      '3': 12,\n      '4': 1,\n      '5': 9,\n      '10': 'dmBtnIconNightColor'\n    },\n    {\n      '1': 'dm_input_text_color',\n      '3': 13,\n      '4': 1,\n      '5': 9,\n      '10': 'dmInputTextColor'\n    },\n    {\n      '1': 'dm_input_text_night_color',\n      '3': 14,\n      '4': 1,\n      '5': 9,\n      '10': 'dmInputTextNightColor'\n    },\n  ],\n};\n\n/// Descriptor for `Skin`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List skinDescriptor = $convert.base64Decode(\n    'CgRTa2luEiQKDnRhYl90ZXh0X2NvbG9yGAEgASgJUgx0YWJUZXh0Q29sb3ISLwoUdGFiX3RleH'\n    'RfbmlnaHRfY29sb3IYAiABKAlSEXRhYlRleHROaWdodENvbG9yEhUKBmJnX2ltZxgDIAEoCVIF'\n    'YmdJbWcSIAoMYmdfaW1nX25pZ2h0GAQgASgJUgpiZ0ltZ05pZ2h0EjQKF2RtX2lucHV0X2ZyYW'\n    '1lX2JnX2NvbG9yGAUgASgJUhNkbUlucHV0RnJhbWVCZ0NvbG9yEj8KHWRtX2lucHV0X2ZyYW1l'\n    'X2JnX25pZ2h0X2NvbG9yGAYgASgJUhhkbUlucHV0RnJhbWVCZ05pZ2h0Q29sb3ISLwoUZG1faW'\n    '5wdXRfZnJhbWVfY29sb3IYByABKAlSEWRtSW5wdXRGcmFtZUNvbG9yEjoKGmRtX2lucHV0X2Zy'\n    'YW1lX25pZ2h0X2NvbG9yGAggASgJUhZkbUlucHV0RnJhbWVOaWdodENvbG9yEiUKD2RtX2J0bl'\n    '9iZ19jb2xvchgJIAEoCVIMZG1CdG5CZ0NvbG9yEjAKFWRtX2J0bl9iZ19uaWdodF9jb2xvchgK'\n    'IAEoCVIRZG1CdG5CZ05pZ2h0Q29sb3ISKQoRZG1fYnRuX2ljb25fY29sb3IYCyABKAlSDmRtQn'\n    'RuSWNvbkNvbG9yEjQKF2RtX2J0bl9pY29uX25pZ2h0X2NvbG9yGAwgASgJUhNkbUJ0bkljb25O'\n    'aWdodENvbG9yEi0KE2RtX2lucHV0X3RleHRfY29sb3IYDSABKAlSEGRtSW5wdXRUZXh0Q29sb3'\n    'ISOAoZZG1faW5wdXRfdGV4dF9uaWdodF9jb2xvchgOIAEoCVIVZG1JbnB1dFRleHROaWdodENv'\n    'bG9y');\n\n@$core.Deprecated('Use statDescriptor instead')\nconst Stat$json = {\n  '1': 'Stat',\n  '2': [\n    {'1': 'followers', '3': 1, '4': 1, '5': 9, '10': 'followers'},\n    {\n      '1': 'play_data',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.StatInfo',\n      '10': 'playData'\n    },\n  ],\n};\n\n/// Descriptor for `Stat`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List statDescriptor = $convert.base64Decode(\n    'CgRTdGF0EhwKCWZvbGxvd2VycxgBIAEoCVIJZm9sbG93ZXJzEkQKCXBsYXlfZGF0YRgCIAEoCz'\n    'InLmJpbGliaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLlN0YXRJbmZvUghwbGF5RGF0YQ==');\n\n@$core.Deprecated('Use userStatusDescriptor instead')\nconst UserStatus$json = {\n  '1': 'UserStatus',\n  '2': [\n    {'1': 'show', '3': 1, '4': 1, '5': 5, '10': 'show'},\n    {'1': 'follow', '3': 2, '4': 1, '5': 5, '10': 'follow'},\n    {'1': 'follow_status', '3': 3, '4': 1, '5': 5, '10': 'followStatus'},\n    {'1': 'pay', '3': 4, '4': 1, '5': 5, '10': 'pay'},\n    {'1': 'sponsor', '3': 5, '4': 1, '5': 5, '10': 'sponsor'},\n    {'1': 'vip', '3': 6, '4': 1, '5': 5, '10': 'vip'},\n    {'1': 'vip_frozen', '3': 7, '4': 1, '5': 5, '10': 'vipFrozen'},\n    {\n      '1': 'watch_progress',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.pgcanymodel.WatchProgress',\n      '10': 'watchProgress'\n    },\n  ],\n};\n\n/// Descriptor for `UserStatus`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List userStatusDescriptor = $convert.base64Decode(\n    'CgpVc2VyU3RhdHVzEhIKBHNob3cYASABKAVSBHNob3cSFgoGZm9sbG93GAIgASgFUgZmb2xsb3'\n    'cSIwoNZm9sbG93X3N0YXR1cxgDIAEoBVIMZm9sbG93U3RhdHVzEhAKA3BheRgEIAEoBVIDcGF5'\n    'EhgKB3Nwb25zb3IYBSABKAVSB3Nwb25zb3ISEAoDdmlwGAYgASgFUgN2aXASHQoKdmlwX2Zyb3'\n    'plbhgHIAEoBVIJdmlwRnJvemVuElgKDndhdGNoX3Byb2dyZXNzGAggASgLMjEuYmlsaWJpbGku'\n    'YXBwLnZpZXd1bml0ZS5wZ2Nhbnltb2RlbC5XYXRjaFByb2dyZXNzUg13YXRjaFByb2dyZXNz');\n\n@$core.Deprecated('Use viewPgcAnyDescriptor instead')\nconst ViewPgcAny$json = {\n  '1': 'ViewPgcAny',\n  '2': [\n    {\n      '1': 'ogv_data',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.pgcanymodel.OgvData',\n      '10': 'ogvData'\n    },\n    {\n      '1': 'all_up_info',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.pgcanymodel.ViewPgcAny.AllUpInfoEntry',\n      '10': 'allUpInfo'\n    },\n  ],\n  '3': [ViewPgcAny_AllUpInfoEntry$json],\n};\n\n@$core.Deprecated('Use viewPgcAnyDescriptor instead')\nconst ViewPgcAny_AllUpInfoEntry$json = {\n  '1': 'AllUpInfoEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 3, '10': 'key'},\n    {\n      '1': 'value',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Staff',\n      '10': 'value'\n    },\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `ViewPgcAny`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List viewPgcAnyDescriptor = $convert.base64Decode(\n    'CgpWaWV3UGdjQW55EkYKCG9ndl9kYXRhGAEgASgLMisuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS'\n    '5wZ2Nhbnltb2RlbC5PZ3ZEYXRhUgdvZ3ZEYXRhEl0KC2FsbF91cF9pbmZvGAIgAygLMj0uYmls'\n    'aWJpbGkuYXBwLnZpZXd1bml0ZS5wZ2Nhbnltb2RlbC5WaWV3UGdjQW55LkFsbFVwSW5mb0VudH'\n    'J5UglhbGxVcEluZm8aYgoOQWxsVXBJbmZvRW50cnkSEAoDa2V5GAEgASgDUgNrZXkSOgoFdmFs'\n    'dWUYAiABKAsyJC5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5TdGFmZlIFdmFsdWU6Aj'\n    'gB');\n\n@$core.Deprecated('Use watchProgressDescriptor instead')\nconst WatchProgress$json = {\n  '1': 'WatchProgress',\n  '2': [\n    {'1': 'last_ep_id', '3': 1, '4': 1, '5': 3, '10': 'lastEpId'},\n    {'1': 'last_ep_index', '3': 2, '4': 1, '5': 9, '10': 'lastEpIndex'},\n    {'1': 'last_time', '3': 3, '4': 1, '5': 3, '10': 'lastTime'},\n  ],\n};\n\n/// Descriptor for `WatchProgress`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List watchProgressDescriptor = $convert.base64Decode(\n    'Cg1XYXRjaFByb2dyZXNzEhwKCmxhc3RfZXBfaWQYASABKANSCGxhc3RFcElkEiIKDWxhc3RfZX'\n    'BfaW5kZXgYAiABKAlSC2xhc3RFcEluZGV4EhsKCWxhc3RfdGltZRgDIAEoA1IIbGFzdFRpbWU=');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/viewunite/v1.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/viewunite/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:fixnum/fixnum.dart' as $fixnum;\nimport 'package:protobuf/protobuf.dart' as $pb;\nimport 'package:protobuf/well_known_types/google/protobuf/any.pb.dart' as $2;\n\nimport '../../pagination.pb.dart' as $3;\nimport '../../playershared.pb.dart' as $5;\nimport '../archive/middleware/v1.pb.dart' as $4;\nimport 'common.pb.dart' as $1;\nimport 'v1.pbenum.dart';\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nexport 'v1.pbenum.dart';\n\nclass ActivityResource extends $pb.GeneratedMessage {\n  factory ActivityResource({\n    $core.String? darkTextColor,\n    $core.String? dividerColor,\n    $core.String? bgColor,\n    $core.String? selectedBgColor,\n    $core.String? textColor,\n    $core.String? lightTextColor,\n  }) {\n    final result = create();\n    if (darkTextColor != null) result.darkTextColor = darkTextColor;\n    if (dividerColor != null) result.dividerColor = dividerColor;\n    if (bgColor != null) result.bgColor = bgColor;\n    if (selectedBgColor != null) result.selectedBgColor = selectedBgColor;\n    if (textColor != null) result.textColor = textColor;\n    if (lightTextColor != null) result.lightTextColor = lightTextColor;\n    return result;\n  }\n\n  ActivityResource._();\n\n  factory ActivityResource.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ActivityResource.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ActivityResource',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'darkTextColor')\n    ..aOS(2, _omitFieldNames ? '' : 'dividerColor')\n    ..aOS(3, _omitFieldNames ? '' : 'bgColor')\n    ..aOS(4, _omitFieldNames ? '' : 'selectedBgColor')\n    ..aOS(5, _omitFieldNames ? '' : 'textColor')\n    ..aOS(6, _omitFieldNames ? '' : 'lightTextColor')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ActivityResource clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ActivityResource copyWith(void Function(ActivityResource) updates) =>\n      super.copyWith((message) => updates(message as ActivityResource))\n          as ActivityResource;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ActivityResource create() => ActivityResource._();\n  @$core.override\n  ActivityResource createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ActivityResource getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ActivityResource>(create);\n  static ActivityResource? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get darkTextColor => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set darkTextColor($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDarkTextColor() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDarkTextColor() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get dividerColor => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set dividerColor($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDividerColor() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDividerColor() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get bgColor => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set bgColor($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBgColor() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBgColor() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get selectedBgColor => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set selectedBgColor($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSelectedBgColor() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSelectedBgColor() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get textColor => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set textColor($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasTextColor() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearTextColor() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get lightTextColor => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set lightTextColor($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasLightTextColor() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearLightTextColor() => $_clearField(6);\n}\n\nclass Arc extends $pb.GeneratedMessage {\n  factory Arc({\n    $fixnum.Int64? aid,\n    $fixnum.Int64? cid,\n    $fixnum.Int64? duration,\n    $1.Stat? stat,\n    $core.String? bvid,\n    $core.int? copyright,\n    Rights? right,\n    $core.String? cover,\n    $fixnum.Int64? typeId,\n    $core.String? title,\n  }) {\n    final result = create();\n    if (aid != null) result.aid = aid;\n    if (cid != null) result.cid = cid;\n    if (duration != null) result.duration = duration;\n    if (stat != null) result.stat = stat;\n    if (bvid != null) result.bvid = bvid;\n    if (copyright != null) result.copyright = copyright;\n    if (right != null) result.right = right;\n    if (cover != null) result.cover = cover;\n    if (typeId != null) result.typeId = typeId;\n    if (title != null) result.title = title;\n    return result;\n  }\n\n  Arc._();\n\n  factory Arc.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Arc.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Arc',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'aid')\n    ..aInt64(2, _omitFieldNames ? '' : 'cid')\n    ..aInt64(3, _omitFieldNames ? '' : 'duration')\n    ..aOM<$1.Stat>(4, _omitFieldNames ? '' : 'stat', subBuilder: $1.Stat.create)\n    ..aOS(5, _omitFieldNames ? '' : 'bvid')\n    ..aI(6, _omitFieldNames ? '' : 'copyright')\n    ..aOM<Rights>(7, _omitFieldNames ? '' : 'right', subBuilder: Rights.create)\n    ..aOS(8, _omitFieldNames ? '' : 'cover')\n    ..aInt64(9, _omitFieldNames ? '' : 'typeId')\n    ..aOS(10, _omitFieldNames ? '' : 'title')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Arc clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Arc copyWith(void Function(Arc) updates) =>\n      super.copyWith((message) => updates(message as Arc)) as Arc;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Arc create() => Arc._();\n  @$core.override\n  Arc createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Arc getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Arc>(create);\n  static Arc? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get aid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set aid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get cid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set cid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get duration => $_getI64(2);\n  @$pb.TagNumber(3)\n  set duration($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDuration() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDuration() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $1.Stat get stat => $_getN(3);\n  @$pb.TagNumber(4)\n  set stat($1.Stat value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasStat() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearStat() => $_clearField(4);\n  @$pb.TagNumber(4)\n  $1.Stat ensureStat() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.String get bvid => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set bvid($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBvid() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBvid() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get copyright => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set copyright($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCopyright() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCopyright() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  Rights get right => $_getN(6);\n  @$pb.TagNumber(7)\n  set right(Rights value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasRight() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearRight() => $_clearField(7);\n  @$pb.TagNumber(7)\n  Rights ensureRight() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  $core.String get cover => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set cover($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasCover() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearCover() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get typeId => $_getI64(8);\n  @$pb.TagNumber(9)\n  set typeId($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasTypeId() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearTypeId() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get title => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set title($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasTitle() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearTitle() => $_clearField(10);\n}\n\nclass ArcRefreshReply extends $pb.GeneratedMessage {\n  factory ArcRefreshReply({\n    $1.Stat? stat,\n    SimpleReqUser? reqUser,\n    SimpleArc? arc,\n    Online? online,\n    LikeConfig? likeConfig,\n    SimpleOwner? owner,\n    ReplyStyle? replyStyle,\n  }) {\n    final result = create();\n    if (stat != null) result.stat = stat;\n    if (reqUser != null) result.reqUser = reqUser;\n    if (arc != null) result.arc = arc;\n    if (online != null) result.online = online;\n    if (likeConfig != null) result.likeConfig = likeConfig;\n    if (owner != null) result.owner = owner;\n    if (replyStyle != null) result.replyStyle = replyStyle;\n    return result;\n  }\n\n  ArcRefreshReply._();\n\n  factory ArcRefreshReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ArcRefreshReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ArcRefreshReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOM<$1.Stat>(1, _omitFieldNames ? '' : 'stat', subBuilder: $1.Stat.create)\n    ..aOM<SimpleReqUser>(2, _omitFieldNames ? '' : 'reqUser',\n        subBuilder: SimpleReqUser.create)\n    ..aOM<SimpleArc>(3, _omitFieldNames ? '' : 'arc',\n        subBuilder: SimpleArc.create)\n    ..aOM<Online>(4, _omitFieldNames ? '' : 'online', subBuilder: Online.create)\n    ..aOM<LikeConfig>(5, _omitFieldNames ? '' : 'likeConfig',\n        subBuilder: LikeConfig.create)\n    ..aOM<SimpleOwner>(6, _omitFieldNames ? '' : 'owner',\n        subBuilder: SimpleOwner.create)\n    ..aOM<ReplyStyle>(7, _omitFieldNames ? '' : 'replyStyle',\n        subBuilder: ReplyStyle.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ArcRefreshReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ArcRefreshReply copyWith(void Function(ArcRefreshReply) updates) =>\n      super.copyWith((message) => updates(message as ArcRefreshReply))\n          as ArcRefreshReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ArcRefreshReply create() => ArcRefreshReply._();\n  @$core.override\n  ArcRefreshReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ArcRefreshReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ArcRefreshReply>(create);\n  static ArcRefreshReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $1.Stat get stat => $_getN(0);\n  @$pb.TagNumber(1)\n  set stat($1.Stat value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStat() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStat() => $_clearField(1);\n  @$pb.TagNumber(1)\n  $1.Stat ensureStat() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  SimpleReqUser get reqUser => $_getN(1);\n  @$pb.TagNumber(2)\n  set reqUser(SimpleReqUser value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasReqUser() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearReqUser() => $_clearField(2);\n  @$pb.TagNumber(2)\n  SimpleReqUser ensureReqUser() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  SimpleArc get arc => $_getN(2);\n  @$pb.TagNumber(3)\n  set arc(SimpleArc value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasArc() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearArc() => $_clearField(3);\n  @$pb.TagNumber(3)\n  SimpleArc ensureArc() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  Online get online => $_getN(3);\n  @$pb.TagNumber(4)\n  set online(Online value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasOnline() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearOnline() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Online ensureOnline() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  LikeConfig get likeConfig => $_getN(4);\n  @$pb.TagNumber(5)\n  set likeConfig(LikeConfig value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasLikeConfig() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearLikeConfig() => $_clearField(5);\n  @$pb.TagNumber(5)\n  LikeConfig ensureLikeConfig() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  SimpleOwner get owner => $_getN(5);\n  @$pb.TagNumber(6)\n  set owner(SimpleOwner value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasOwner() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearOwner() => $_clearField(6);\n  @$pb.TagNumber(6)\n  SimpleOwner ensureOwner() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  ReplyStyle get replyStyle => $_getN(6);\n  @$pb.TagNumber(7)\n  set replyStyle(ReplyStyle value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasReplyStyle() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearReplyStyle() => $_clearField(7);\n  @$pb.TagNumber(7)\n  ReplyStyle ensureReplyStyle() => $_ensure(6);\n}\n\nclass ArcRefreshReq extends $pb.GeneratedMessage {\n  factory ArcRefreshReq({\n    $fixnum.Int64? aid,\n    $core.String? bvid,\n    UnionType? type,\n  }) {\n    final result = create();\n    if (aid != null) result.aid = aid;\n    if (bvid != null) result.bvid = bvid;\n    if (type != null) result.type = type;\n    return result;\n  }\n\n  ArcRefreshReq._();\n\n  factory ArcRefreshReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ArcRefreshReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ArcRefreshReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'aid')\n    ..aOS(2, _omitFieldNames ? '' : 'bvid')\n    ..aE<UnionType>(3, _omitFieldNames ? '' : 'type',\n        enumValues: UnionType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ArcRefreshReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ArcRefreshReq copyWith(void Function(ArcRefreshReq) updates) =>\n      super.copyWith((message) => updates(message as ArcRefreshReq))\n          as ArcRefreshReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ArcRefreshReq create() => ArcRefreshReq._();\n  @$core.override\n  ArcRefreshReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ArcRefreshReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ArcRefreshReq>(create);\n  static ArcRefreshReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get aid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set aid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get bvid => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set bvid($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBvid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBvid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  UnionType get type => $_getN(2);\n  @$pb.TagNumber(3)\n  set type(UnionType value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearType() => $_clearField(3);\n}\n\nclass AttentionCard extends $pb.GeneratedMessage {\n  factory AttentionCard({\n    $core.Iterable<ShowTime>? showTime,\n  }) {\n    final result = create();\n    if (showTime != null) result.showTime.addAll(showTime);\n    return result;\n  }\n\n  AttentionCard._();\n\n  factory AttentionCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AttentionCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AttentionCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..pPM<ShowTime>(1, _omitFieldNames ? '' : 'showTime',\n        subBuilder: ShowTime.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AttentionCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AttentionCard copyWith(void Function(AttentionCard) updates) =>\n      super.copyWith((message) => updates(message as AttentionCard))\n          as AttentionCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AttentionCard create() => AttentionCard._();\n  @$core.override\n  AttentionCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AttentionCard getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AttentionCard>(create);\n  static AttentionCard? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<ShowTime> get showTime => $_getList(0);\n}\n\nclass BgPlayNotice extends $pb.GeneratedMessage {\n  factory BgPlayNotice({\n    $core.bool? allowShow,\n    $core.String? text,\n    $core.String? btnText1,\n    $core.String? btnText2,\n  }) {\n    final result = create();\n    if (allowShow != null) result.allowShow = allowShow;\n    if (text != null) result.text = text;\n    if (btnText1 != null) result.btnText1 = btnText1;\n    if (btnText2 != null) result.btnText2 = btnText2;\n    return result;\n  }\n\n  BgPlayNotice._();\n\n  factory BgPlayNotice.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BgPlayNotice.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BgPlayNotice',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'allowShow')\n    ..aOS(2, _omitFieldNames ? '' : 'text')\n    ..aOS(3, _omitFieldNames ? '' : 'btnText1')\n    ..aOS(4, _omitFieldNames ? '' : 'btnText2')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BgPlayNotice clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BgPlayNotice copyWith(void Function(BgPlayNotice) updates) =>\n      super.copyWith((message) => updates(message as BgPlayNotice))\n          as BgPlayNotice;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BgPlayNotice create() => BgPlayNotice._();\n  @$core.override\n  BgPlayNotice createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BgPlayNotice getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<BgPlayNotice>(create);\n  static BgPlayNotice? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get allowShow => $_getBF(0);\n  @$pb.TagNumber(1)\n  set allowShow($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAllowShow() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAllowShow() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get btnText1 => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set btnText1($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBtnText1() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBtnText1() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get btnText2 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set btnText2($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBtnText2() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBtnText2() => $_clearField(4);\n}\n\nclass BizFollowVideoParam extends $pb.GeneratedMessage {\n  factory BizFollowVideoParam({\n    $fixnum.Int64? seasonId,\n  }) {\n    final result = create();\n    if (seasonId != null) result.seasonId = seasonId;\n    return result;\n  }\n\n  BizFollowVideoParam._();\n\n  factory BizFollowVideoParam.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BizFollowVideoParam.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BizFollowVideoParam',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'seasonId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BizFollowVideoParam clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BizFollowVideoParam copyWith(void Function(BizFollowVideoParam) updates) =>\n      super.copyWith((message) => updates(message as BizFollowVideoParam))\n          as BizFollowVideoParam;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BizFollowVideoParam create() => BizFollowVideoParam._();\n  @$core.override\n  BizFollowVideoParam createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BizFollowVideoParam getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<BizFollowVideoParam>(create);\n  static BizFollowVideoParam? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get seasonId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set seasonId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSeasonId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSeasonId() => $_clearField(1);\n}\n\nclass BizGameBackflowParam extends $pb.GeneratedMessage {\n  factory BizGameBackflowParam({\n    $core.String? extra,\n  }) {\n    final result = create();\n    if (extra != null) result.extra = extra;\n    return result;\n  }\n\n  BizGameBackflowParam._();\n\n  factory BizGameBackflowParam.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BizGameBackflowParam.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BizGameBackflowParam',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'extra')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BizGameBackflowParam clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BizGameBackflowParam copyWith(void Function(BizGameBackflowParam) updates) =>\n      super.copyWith((message) => updates(message as BizGameBackflowParam))\n          as BizGameBackflowParam;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BizGameBackflowParam create() => BizGameBackflowParam._();\n  @$core.override\n  BizGameBackflowParam createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BizGameBackflowParam getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<BizGameBackflowParam>(create);\n  static BizGameBackflowParam? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get extra => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set extra($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasExtra() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearExtra() => $_clearField(1);\n}\n\nclass BizJumpLinkParam extends $pb.GeneratedMessage {\n  factory BizJumpLinkParam({\n    $core.String? url,\n  }) {\n    final result = create();\n    if (url != null) result.url = url;\n    return result;\n  }\n\n  BizJumpLinkParam._();\n\n  factory BizJumpLinkParam.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BizJumpLinkParam.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BizJumpLinkParam',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'url')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BizJumpLinkParam clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BizJumpLinkParam copyWith(void Function(BizJumpLinkParam) updates) =>\n      super.copyWith((message) => updates(message as BizJumpLinkParam))\n          as BizJumpLinkParam;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BizJumpLinkParam create() => BizJumpLinkParam._();\n  @$core.override\n  BizJumpLinkParam createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BizJumpLinkParam getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<BizJumpLinkParam>(create);\n  static BizJumpLinkParam? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get url => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set url($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUrl() => $_clearField(1);\n}\n\nclass BizReserveActivityParam extends $pb.GeneratedMessage {\n  factory BizReserveActivityParam({\n    $fixnum.Int64? activityId,\n    $core.String? from,\n    $core.String? type,\n    $fixnum.Int64? oid,\n    $fixnum.Int64? reserveId,\n  }) {\n    final result = create();\n    if (activityId != null) result.activityId = activityId;\n    if (from != null) result.from = from;\n    if (type != null) result.type = type;\n    if (oid != null) result.oid = oid;\n    if (reserveId != null) result.reserveId = reserveId;\n    return result;\n  }\n\n  BizReserveActivityParam._();\n\n  factory BizReserveActivityParam.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BizReserveActivityParam.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BizReserveActivityParam',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'activityId')\n    ..aOS(2, _omitFieldNames ? '' : 'from')\n    ..aOS(3, _omitFieldNames ? '' : 'type')\n    ..aInt64(4, _omitFieldNames ? '' : 'oid')\n    ..aInt64(5, _omitFieldNames ? '' : 'reserveId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BizReserveActivityParam clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BizReserveActivityParam copyWith(\n          void Function(BizReserveActivityParam) updates) =>\n      super.copyWith((message) => updates(message as BizReserveActivityParam))\n          as BizReserveActivityParam;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BizReserveActivityParam create() => BizReserveActivityParam._();\n  @$core.override\n  BizReserveActivityParam createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BizReserveActivityParam getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<BizReserveActivityParam>(create);\n  static BizReserveActivityParam? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get activityId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set activityId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasActivityId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearActivityId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get from => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set from($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFrom() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFrom() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get type => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set type($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get oid => $_getI64(3);\n  @$pb.TagNumber(4)\n  set oid($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasOid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearOid() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get reserveId => $_getI64(4);\n  @$pb.TagNumber(5)\n  set reserveId($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasReserveId() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearReserveId() => $_clearField(5);\n}\n\nclass BizReserveGameParam extends $pb.GeneratedMessage {\n  factory BizReserveGameParam({\n    $fixnum.Int64? gameId,\n  }) {\n    final result = create();\n    if (gameId != null) result.gameId = gameId;\n    return result;\n  }\n\n  BizReserveGameParam._();\n\n  factory BizReserveGameParam.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BizReserveGameParam.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BizReserveGameParam',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'gameId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BizReserveGameParam clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BizReserveGameParam copyWith(void Function(BizReserveGameParam) updates) =>\n      super.copyWith((message) => updates(message as BizReserveGameParam))\n          as BizReserveGameParam;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BizReserveGameParam create() => BizReserveGameParam._();\n  @$core.override\n  BizReserveGameParam createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BizReserveGameParam getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<BizReserveGameParam>(create);\n  static BizReserveGameParam? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get gameId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set gameId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasGameId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearGameId() => $_clearField(1);\n}\n\nclass Button extends $pb.GeneratedMessage {\n  factory Button({\n    $core.String? title,\n    $core.String? uri,\n    $core.String? icon,\n    JumpShowType? jumpShowType,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (uri != null) result.uri = uri;\n    if (icon != null) result.icon = icon;\n    if (jumpShowType != null) result.jumpShowType = jumpShowType;\n    return result;\n  }\n\n  Button._();\n\n  factory Button.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Button.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Button',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..aOS(3, _omitFieldNames ? '' : 'icon')\n    ..aE<JumpShowType>(4, _omitFieldNames ? '' : 'jumpShowType',\n        enumValues: JumpShowType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Button clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Button copyWith(void Function(Button) updates) =>\n      super.copyWith((message) => updates(message as Button)) as Button;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Button create() => Button._();\n  @$core.override\n  Button createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Button getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Button>(create);\n  static Button? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get icon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set icon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIcon() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  JumpShowType get jumpShowType => $_getN(3);\n  @$pb.TagNumber(4)\n  set jumpShowType(JumpShowType value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasJumpShowType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearJumpShowType() => $_clearField(4);\n}\n\nclass CM extends $pb.GeneratedMessage {\n  factory CM({\n    $2.Any? cmUnderPlayer,\n    $2.Any? adsControl,\n    $core.Iterable<$2.Any>? sourceContent,\n    PadRelateCM? padRelateCm,\n    $core.Iterable<SourceContentItem>? sourceContentItem,\n  }) {\n    final result = create();\n    if (cmUnderPlayer != null) result.cmUnderPlayer = cmUnderPlayer;\n    if (adsControl != null) result.adsControl = adsControl;\n    if (sourceContent != null) result.sourceContent.addAll(sourceContent);\n    if (padRelateCm != null) result.padRelateCm = padRelateCm;\n    if (sourceContentItem != null)\n      result.sourceContentItem.addAll(sourceContentItem);\n    return result;\n  }\n\n  CM._();\n\n  factory CM.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CM.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CM',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOM<$2.Any>(1, _omitFieldNames ? '' : 'cmUnderPlayer',\n        subBuilder: $2.Any.create)\n    ..aOM<$2.Any>(2, _omitFieldNames ? '' : 'adsControl',\n        subBuilder: $2.Any.create)\n    ..pPM<$2.Any>(3, _omitFieldNames ? '' : 'sourceContent',\n        subBuilder: $2.Any.create)\n    ..aOM<PadRelateCM>(4, _omitFieldNames ? '' : 'padRelateCm',\n        subBuilder: PadRelateCM.create)\n    ..pPM<SourceContentItem>(5, _omitFieldNames ? '' : 'sourceContentItem',\n        subBuilder: SourceContentItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CM clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CM copyWith(void Function(CM) updates) =>\n      super.copyWith((message) => updates(message as CM)) as CM;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CM create() => CM._();\n  @$core.override\n  CM createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CM getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CM>(create);\n  static CM? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $2.Any get cmUnderPlayer => $_getN(0);\n  @$pb.TagNumber(1)\n  set cmUnderPlayer($2.Any value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCmUnderPlayer() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCmUnderPlayer() => $_clearField(1);\n  @$pb.TagNumber(1)\n  $2.Any ensureCmUnderPlayer() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $2.Any get adsControl => $_getN(1);\n  @$pb.TagNumber(2)\n  set adsControl($2.Any value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAdsControl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAdsControl() => $_clearField(2);\n  @$pb.TagNumber(2)\n  $2.Any ensureAdsControl() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<$2.Any> get sourceContent => $_getList(2);\n\n  @$pb.TagNumber(4)\n  PadRelateCM get padRelateCm => $_getN(3);\n  @$pb.TagNumber(4)\n  set padRelateCm(PadRelateCM value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPadRelateCm() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPadRelateCm() => $_clearField(4);\n  @$pb.TagNumber(4)\n  PadRelateCM ensurePadRelateCm() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $pb.PbList<SourceContentItem> get sourceContentItem => $_getList(4);\n}\n\nclass CacheAuthenticationReply extends $pb.GeneratedMessage {\n  factory CacheAuthenticationReply({\n    $core.Iterable<$core.MapEntry<$fixnum.Int64, CachePlayAvRly>>? item,\n  }) {\n    final result = create();\n    if (item != null) result.item.addEntries(item);\n    return result;\n  }\n\n  CacheAuthenticationReply._();\n\n  factory CacheAuthenticationReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CacheAuthenticationReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CacheAuthenticationReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..m<$fixnum.Int64, CachePlayAvRly>(1, _omitFieldNames ? '' : 'item',\n        entryClassName: 'CacheAuthenticationReply.ItemEntry',\n        keyFieldType: $pb.PbFieldType.O6,\n        valueFieldType: $pb.PbFieldType.OM,\n        valueCreator: CachePlayAvRly.create,\n        valueDefaultOrMaker: CachePlayAvRly.getDefault,\n        packageName: const $pb.PackageName('bilibili.app.viewunite.v1'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CacheAuthenticationReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CacheAuthenticationReply copyWith(\n          void Function(CacheAuthenticationReply) updates) =>\n      super.copyWith((message) => updates(message as CacheAuthenticationReply))\n          as CacheAuthenticationReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CacheAuthenticationReply create() => CacheAuthenticationReply._();\n  @$core.override\n  CacheAuthenticationReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CacheAuthenticationReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CacheAuthenticationReply>(create);\n  static CacheAuthenticationReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbMap<$fixnum.Int64, CachePlayAvRly> get item => $_getMap(0);\n}\n\nclass CacheAuthenticationReq extends $pb.GeneratedMessage {\n  factory CacheAuthenticationReq({\n    $core.Iterable<CachePlayAv>? av,\n  }) {\n    final result = create();\n    if (av != null) result.av.addAll(av);\n    return result;\n  }\n\n  CacheAuthenticationReq._();\n\n  factory CacheAuthenticationReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CacheAuthenticationReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CacheAuthenticationReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..pPM<CachePlayAv>(1, _omitFieldNames ? '' : 'av',\n        subBuilder: CachePlayAv.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CacheAuthenticationReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CacheAuthenticationReq copyWith(\n          void Function(CacheAuthenticationReq) updates) =>\n      super.copyWith((message) => updates(message as CacheAuthenticationReq))\n          as CacheAuthenticationReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CacheAuthenticationReq create() => CacheAuthenticationReq._();\n  @$core.override\n  CacheAuthenticationReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CacheAuthenticationReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CacheAuthenticationReq>(create);\n  static CacheAuthenticationReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<CachePlayAv> get av => $_getList(0);\n}\n\nclass CachePlayAv extends $pb.GeneratedMessage {\n  factory CachePlayAv({\n    $fixnum.Int64? aid,\n  }) {\n    final result = create();\n    if (aid != null) result.aid = aid;\n    return result;\n  }\n\n  CachePlayAv._();\n\n  factory CachePlayAv.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CachePlayAv.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CachePlayAv',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'aid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CachePlayAv clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CachePlayAv copyWith(void Function(CachePlayAv) updates) =>\n      super.copyWith((message) => updates(message as CachePlayAv))\n          as CachePlayAv;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CachePlayAv create() => CachePlayAv._();\n  @$core.override\n  CachePlayAv createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CachePlayAv getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CachePlayAv>(create);\n  static CachePlayAv? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get aid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set aid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAid() => $_clearField(1);\n}\n\nclass CachePlayAvRly extends $pb.GeneratedMessage {\n  factory CachePlayAvRly({\n    CacheCode? code,\n  }) {\n    final result = create();\n    if (code != null) result.code = code;\n    return result;\n  }\n\n  CachePlayAvRly._();\n\n  factory CachePlayAvRly.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CachePlayAvRly.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CachePlayAvRly',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aE<CacheCode>(1, _omitFieldNames ? '' : 'code',\n        enumValues: CacheCode.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CachePlayAvRly clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CachePlayAvRly copyWith(void Function(CachePlayAvRly) updates) =>\n      super.copyWith((message) => updates(message as CachePlayAvRly))\n          as CachePlayAvRly;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CachePlayAvRly create() => CachePlayAvRly._();\n  @$core.override\n  CachePlayAvRly createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CachePlayAvRly getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CachePlayAvRly>(create);\n  static CachePlayAvRly? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  CacheCode get code => $_getN(0);\n  @$pb.TagNumber(1)\n  set code(CacheCode value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCode() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCode() => $_clearField(1);\n}\n\nclass ChargingPlus extends $pb.GeneratedMessage {\n  factory ChargingPlus({\n    $core.bool? pass,\n    $core.Iterable<PlayToast>? playToast,\n  }) {\n    final result = create();\n    if (pass != null) result.pass = pass;\n    if (playToast != null) result.playToast.addAll(playToast);\n    return result;\n  }\n\n  ChargingPlus._();\n\n  factory ChargingPlus.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ChargingPlus.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ChargingPlus',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'pass')\n    ..pPM<PlayToast>(2, _omitFieldNames ? '' : 'playToast',\n        subBuilder: PlayToast.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ChargingPlus clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ChargingPlus copyWith(void Function(ChargingPlus) updates) =>\n      super.copyWith((message) => updates(message as ChargingPlus))\n          as ChargingPlus;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ChargingPlus create() => ChargingPlus._();\n  @$core.override\n  ChargingPlus createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ChargingPlus getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ChargingPlus>(create);\n  static ChargingPlus? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get pass => $_getBF(0);\n  @$pb.TagNumber(1)\n  set pass($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPass() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPass() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<PlayToast> get playToast => $_getList(1);\n}\n\nclass Chronos extends $pb.GeneratedMessage {\n  factory Chronos({\n    $core.String? md5,\n    $core.String? file,\n    $core.String? sign,\n  }) {\n    final result = create();\n    if (md5 != null) result.md5 = md5;\n    if (file != null) result.file = file;\n    if (sign != null) result.sign = sign;\n    return result;\n  }\n\n  Chronos._();\n\n  factory Chronos.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Chronos.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Chronos',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'md5')\n    ..aOS(2, _omitFieldNames ? '' : 'file')\n    ..aOS(3, _omitFieldNames ? '' : 'sign')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Chronos clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Chronos copyWith(void Function(Chronos) updates) =>\n      super.copyWith((message) => updates(message as Chronos)) as Chronos;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Chronos create() => Chronos._();\n  @$core.override\n  Chronos createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Chronos getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Chronos>(create);\n  static Chronos? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get md5 => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set md5($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMd5() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMd5() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get file => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set file($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFile() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFile() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get sign => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set sign($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSign() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSign() => $_clearField(3);\n}\n\nclass ChronosParam extends $pb.GeneratedMessage {\n  factory ChronosParam({\n    $core.String? engineVersion,\n    $core.String? messageProtocol,\n    $core.String? serviceKey,\n  }) {\n    final result = create();\n    if (engineVersion != null) result.engineVersion = engineVersion;\n    if (messageProtocol != null) result.messageProtocol = messageProtocol;\n    if (serviceKey != null) result.serviceKey = serviceKey;\n    return result;\n  }\n\n  ChronosParam._();\n\n  factory ChronosParam.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ChronosParam.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ChronosParam',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'engineVersion')\n    ..aOS(2, _omitFieldNames ? '' : 'messageProtocol')\n    ..aOS(3, _omitFieldNames ? '' : 'serviceKey')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ChronosParam clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ChronosParam copyWith(void Function(ChronosParam) updates) =>\n      super.copyWith((message) => updates(message as ChronosParam))\n          as ChronosParam;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ChronosParam create() => ChronosParam._();\n  @$core.override\n  ChronosParam createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ChronosParam getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ChronosParam>(create);\n  static ChronosParam? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get engineVersion => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set engineVersion($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasEngineVersion() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearEngineVersion() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get messageProtocol => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set messageProtocol($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMessageProtocol() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMessageProtocol() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get serviceKey => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set serviceKey($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasServiceKey() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearServiceKey() => $_clearField(3);\n}\n\nclass CommandDm extends $pb.GeneratedMessage {\n  factory CommandDm({\n    $fixnum.Int64? id,\n    $fixnum.Int64? oid,\n    $fixnum.Int64? mid,\n    $core.String? command,\n    $core.String? content,\n    $core.int? progress,\n    $core.String? ctime,\n    $core.String? mtime,\n    $core.String? extra,\n    $core.String? idStr,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (oid != null) result.oid = oid;\n    if (mid != null) result.mid = mid;\n    if (command != null) result.command = command;\n    if (content != null) result.content = content;\n    if (progress != null) result.progress = progress;\n    if (ctime != null) result.ctime = ctime;\n    if (mtime != null) result.mtime = mtime;\n    if (extra != null) result.extra = extra;\n    if (idStr != null) result.idStr = idStr;\n    return result;\n  }\n\n  CommandDm._();\n\n  factory CommandDm.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CommandDm.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CommandDm',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aInt64(2, _omitFieldNames ? '' : 'oid')\n    ..aInt64(3, _omitFieldNames ? '' : 'mid')\n    ..aOS(4, _omitFieldNames ? '' : 'command')\n    ..aOS(5, _omitFieldNames ? '' : 'content')\n    ..aI(6, _omitFieldNames ? '' : 'progress')\n    ..aOS(7, _omitFieldNames ? '' : 'ctime')\n    ..aOS(8, _omitFieldNames ? '' : 'mtime')\n    ..aOS(9, _omitFieldNames ? '' : 'extra')\n    ..aOS(10, _omitFieldNames ? '' : 'idStr')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CommandDm clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CommandDm copyWith(void Function(CommandDm) updates) =>\n      super.copyWith((message) => updates(message as CommandDm)) as CommandDm;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CommandDm create() => CommandDm._();\n  @$core.override\n  CommandDm createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CommandDm getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CommandDm>(create);\n  static CommandDm? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get oid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set oid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get mid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set mid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasMid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearMid() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get command => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set command($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCommand() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCommand() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get content => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set content($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasContent() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearContent() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get progress => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set progress($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasProgress() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearProgress() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get ctime => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set ctime($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCtime() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCtime() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get mtime => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set mtime($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasMtime() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearMtime() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get extra => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set extra($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasExtra() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearExtra() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get idStr => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set idStr($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasIdStr() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearIdStr() => $_clearField(10);\n}\n\nclass Config extends $pb.GeneratedMessage {\n  factory Config({\n    Online? online,\n    PlayerIcon? playerIcon,\n    StoryEntrance? storyEntrance,\n    BgPlayNotice? bgPlayNotice,\n  }) {\n    final result = create();\n    if (online != null) result.online = online;\n    if (playerIcon != null) result.playerIcon = playerIcon;\n    if (storyEntrance != null) result.storyEntrance = storyEntrance;\n    if (bgPlayNotice != null) result.bgPlayNotice = bgPlayNotice;\n    return result;\n  }\n\n  Config._();\n\n  factory Config.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Config.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Config',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOM<Online>(1, _omitFieldNames ? '' : 'online', subBuilder: Online.create)\n    ..aOM<PlayerIcon>(2, _omitFieldNames ? '' : 'playerIcon',\n        subBuilder: PlayerIcon.create)\n    ..aOM<StoryEntrance>(3, _omitFieldNames ? '' : 'storyEntrance',\n        subBuilder: StoryEntrance.create)\n    ..aOM<BgPlayNotice>(4, _omitFieldNames ? '' : 'bgPlayNotice',\n        subBuilder: BgPlayNotice.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Config clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Config copyWith(void Function(Config) updates) =>\n      super.copyWith((message) => updates(message as Config)) as Config;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Config create() => Config._();\n  @$core.override\n  Config createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Config getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Config>(create);\n  static Config? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Online get online => $_getN(0);\n  @$pb.TagNumber(1)\n  set online(Online value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOnline() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOnline() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Online ensureOnline() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  PlayerIcon get playerIcon => $_getN(1);\n  @$pb.TagNumber(2)\n  set playerIcon(PlayerIcon value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPlayerIcon() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPlayerIcon() => $_clearField(2);\n  @$pb.TagNumber(2)\n  PlayerIcon ensurePlayerIcon() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  StoryEntrance get storyEntrance => $_getN(2);\n  @$pb.TagNumber(3)\n  set storyEntrance(StoryEntrance value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasStoryEntrance() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearStoryEntrance() => $_clearField(3);\n  @$pb.TagNumber(3)\n  StoryEntrance ensureStoryEntrance() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  BgPlayNotice get bgPlayNotice => $_getN(3);\n  @$pb.TagNumber(4)\n  set bgPlayNotice(BgPlayNotice value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBgPlayNotice() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBgPlayNotice() => $_clearField(4);\n  @$pb.TagNumber(4)\n  BgPlayNotice ensureBgPlayNotice() => $_ensure(3);\n}\n\nclass ContractCard extends $pb.GeneratedMessage {\n  factory ContractCard({\n    $core.double? displayProgress,\n    $fixnum.Int64? displayAccuracy,\n    $fixnum.Int64? displayDuration,\n    $core.int? showMode,\n    $core.int? pageType,\n    UpperInfos? upper,\n    $core.int? isFollowDisplay,\n    ContractText? text,\n    $fixnum.Int64? followDisplayEndDuration,\n    $core.int? isPlayDisplay,\n    $core.int? isInteractDisplay,\n    $core.bool? playDisplaySwitch,\n  }) {\n    final result = create();\n    if (displayProgress != null) result.displayProgress = displayProgress;\n    if (displayAccuracy != null) result.displayAccuracy = displayAccuracy;\n    if (displayDuration != null) result.displayDuration = displayDuration;\n    if (showMode != null) result.showMode = showMode;\n    if (pageType != null) result.pageType = pageType;\n    if (upper != null) result.upper = upper;\n    if (isFollowDisplay != null) result.isFollowDisplay = isFollowDisplay;\n    if (text != null) result.text = text;\n    if (followDisplayEndDuration != null)\n      result.followDisplayEndDuration = followDisplayEndDuration;\n    if (isPlayDisplay != null) result.isPlayDisplay = isPlayDisplay;\n    if (isInteractDisplay != null) result.isInteractDisplay = isInteractDisplay;\n    if (playDisplaySwitch != null) result.playDisplaySwitch = playDisplaySwitch;\n    return result;\n  }\n\n  ContractCard._();\n\n  factory ContractCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ContractCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ContractCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aD(1, _omitFieldNames ? '' : 'displayProgress',\n        fieldType: $pb.PbFieldType.OF)\n    ..aInt64(2, _omitFieldNames ? '' : 'displayAccuracy')\n    ..aInt64(3, _omitFieldNames ? '' : 'displayDuration')\n    ..aI(4, _omitFieldNames ? '' : 'showMode')\n    ..aI(5, _omitFieldNames ? '' : 'pageType')\n    ..aOM<UpperInfos>(6, _omitFieldNames ? '' : 'upper',\n        subBuilder: UpperInfos.create)\n    ..aI(7, _omitFieldNames ? '' : 'isFollowDisplay')\n    ..aOM<ContractText>(8, _omitFieldNames ? '' : 'text',\n        subBuilder: ContractText.create)\n    ..aInt64(9, _omitFieldNames ? '' : 'followDisplayEndDuration')\n    ..aI(10, _omitFieldNames ? '' : 'isPlayDisplay')\n    ..aI(11, _omitFieldNames ? '' : 'isInteractDisplay')\n    ..aOB(12, _omitFieldNames ? '' : 'playDisplaySwitch')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ContractCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ContractCard copyWith(void Function(ContractCard) updates) =>\n      super.copyWith((message) => updates(message as ContractCard))\n          as ContractCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ContractCard create() => ContractCard._();\n  @$core.override\n  ContractCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ContractCard getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ContractCard>(create);\n  static ContractCard? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.double get displayProgress => $_getN(0);\n  @$pb.TagNumber(1)\n  set displayProgress($core.double value) => $_setFloat(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDisplayProgress() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDisplayProgress() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get displayAccuracy => $_getI64(1);\n  @$pb.TagNumber(2)\n  set displayAccuracy($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDisplayAccuracy() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDisplayAccuracy() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get displayDuration => $_getI64(2);\n  @$pb.TagNumber(3)\n  set displayDuration($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDisplayDuration() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDisplayDuration() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get showMode => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set showMode($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasShowMode() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearShowMode() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get pageType => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set pageType($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPageType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPageType() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  UpperInfos get upper => $_getN(5);\n  @$pb.TagNumber(6)\n  set upper(UpperInfos value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasUpper() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearUpper() => $_clearField(6);\n  @$pb.TagNumber(6)\n  UpperInfos ensureUpper() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $core.int get isFollowDisplay => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set isFollowDisplay($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasIsFollowDisplay() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearIsFollowDisplay() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  ContractText get text => $_getN(7);\n  @$pb.TagNumber(8)\n  set text(ContractText value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasText() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearText() => $_clearField(8);\n  @$pb.TagNumber(8)\n  ContractText ensureText() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get followDisplayEndDuration => $_getI64(8);\n  @$pb.TagNumber(9)\n  set followDisplayEndDuration($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasFollowDisplayEndDuration() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearFollowDisplayEndDuration() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.int get isPlayDisplay => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set isPlayDisplay($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasIsPlayDisplay() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearIsPlayDisplay() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.int get isInteractDisplay => $_getIZ(10);\n  @$pb.TagNumber(11)\n  set isInteractDisplay($core.int value) => $_setSignedInt32(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasIsInteractDisplay() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearIsInteractDisplay() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.bool get playDisplaySwitch => $_getBF(11);\n  @$pb.TagNumber(12)\n  set playDisplaySwitch($core.bool value) => $_setBool(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasPlayDisplaySwitch() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearPlayDisplaySwitch() => $_clearField(12);\n}\n\nclass ContractText extends $pb.GeneratedMessage {\n  factory ContractText({\n    $core.String? title,\n    $core.String? subtitle,\n    $core.String? inlineTitle,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (subtitle != null) result.subtitle = subtitle;\n    if (inlineTitle != null) result.inlineTitle = inlineTitle;\n    return result;\n  }\n\n  ContractText._();\n\n  factory ContractText.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ContractText.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ContractText',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'subtitle')\n    ..aOS(3, _omitFieldNames ? '' : 'inlineTitle')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ContractText clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ContractText copyWith(void Function(ContractText) updates) =>\n      super.copyWith((message) => updates(message as ContractText))\n          as ContractText;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ContractText create() => ContractText._();\n  @$core.override\n  ContractText createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ContractText getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ContractText>(create);\n  static ContractText? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get subtitle => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set subtitle($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSubtitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSubtitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get inlineTitle => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set inlineTitle($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasInlineTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearInlineTitle() => $_clearField(3);\n}\n\nclass Control extends $pb.GeneratedMessage {\n  factory Control({\n    $core.bool? limit,\n  }) {\n    final result = create();\n    if (limit != null) result.limit = limit;\n    return result;\n  }\n\n  Control._();\n\n  factory Control.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Control.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Control',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'limit')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Control clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Control copyWith(void Function(Control) updates) =>\n      super.copyWith((message) => updates(message as Control)) as Control;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Control create() => Control._();\n  @$core.override\n  Control createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Control getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Control>(create);\n  static Control? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get limit => $_getBF(0);\n  @$pb.TagNumber(1)\n  set limit($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLimit() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLimit() => $_clearField(1);\n}\n\nclass DmResource extends $pb.GeneratedMessage {\n  factory DmResource({\n    $core.Iterable<CommandDm>? commandDms,\n    AttentionCard? attention,\n    $core.Iterable<OperationCard>? cards,\n  }) {\n    final result = create();\n    if (commandDms != null) result.commandDms.addAll(commandDms);\n    if (attention != null) result.attention = attention;\n    if (cards != null) result.cards.addAll(cards);\n    return result;\n  }\n\n  DmResource._();\n\n  factory DmResource.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DmResource.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DmResource',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..pPM<CommandDm>(1, _omitFieldNames ? '' : 'commandDms',\n        subBuilder: CommandDm.create)\n    ..aOM<AttentionCard>(2, _omitFieldNames ? '' : 'attention',\n        subBuilder: AttentionCard.create)\n    ..pPM<OperationCard>(3, _omitFieldNames ? '' : 'cards',\n        subBuilder: OperationCard.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmResource clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmResource copyWith(void Function(DmResource) updates) =>\n      super.copyWith((message) => updates(message as DmResource)) as DmResource;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DmResource create() => DmResource._();\n  @$core.override\n  DmResource createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DmResource getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DmResource>(create);\n  static DmResource? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<CommandDm> get commandDms => $_getList(0);\n\n  @$pb.TagNumber(2)\n  AttentionCard get attention => $_getN(1);\n  @$pb.TagNumber(2)\n  set attention(AttentionCard value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAttention() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAttention() => $_clearField(2);\n  @$pb.TagNumber(2)\n  AttentionCard ensureAttention() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<OperationCard> get cards => $_getList(2);\n}\n\nclass ECodeConfig extends $pb.GeneratedMessage {\n  factory ECodeConfig({\n    $core.String? redirectUrl,\n    $core.String? msg,\n  }) {\n    final result = create();\n    if (redirectUrl != null) result.redirectUrl = redirectUrl;\n    if (msg != null) result.msg = msg;\n    return result;\n  }\n\n  ECodeConfig._();\n\n  factory ECodeConfig.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ECodeConfig.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ECodeConfig',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'redirectUrl')\n    ..aOS(2, _omitFieldNames ? '' : 'msg')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ECodeConfig clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ECodeConfig copyWith(void Function(ECodeConfig) updates) =>\n      super.copyWith((message) => updates(message as ECodeConfig))\n          as ECodeConfig;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ECodeConfig create() => ECodeConfig._();\n  @$core.override\n  ECodeConfig createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ECodeConfig getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ECodeConfig>(create);\n  static ECodeConfig? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get redirectUrl => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set redirectUrl($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasRedirectUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRedirectUrl() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get msg => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set msg($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMsg() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMsg() => $_clearField(2);\n}\n\nclass FloorAdSearchItem extends $pb.GeneratedMessage {\n  factory FloorAdSearchItem({\n    $2.Any? sourceContent,\n  }) {\n    final result = create();\n    if (sourceContent != null) result.sourceContent = sourceContent;\n    return result;\n  }\n\n  FloorAdSearchItem._();\n\n  factory FloorAdSearchItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FloorAdSearchItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FloorAdSearchItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOM<$2.Any>(1, _omitFieldNames ? '' : 'sourceContent',\n        subBuilder: $2.Any.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FloorAdSearchItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FloorAdSearchItem copyWith(void Function(FloorAdSearchItem) updates) =>\n      super.copyWith((message) => updates(message as FloorAdSearchItem))\n          as FloorAdSearchItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FloorAdSearchItem create() => FloorAdSearchItem._();\n  @$core.override\n  FloorAdSearchItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FloorAdSearchItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FloorAdSearchItem>(create);\n  static FloorAdSearchItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $2.Any get sourceContent => $_getN(0);\n  @$pb.TagNumber(1)\n  set sourceContent($2.Any value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSourceContent() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSourceContent() => $_clearField(1);\n  @$pb.TagNumber(1)\n  $2.Any ensureSourceContent() => $_ensure(0);\n}\n\nclass FloorAdSearchReply extends $pb.GeneratedMessage {\n  factory FloorAdSearchReply({\n    FloorAdSearchTab? tab,\n    $core.Iterable<FloorAdSearchItem>? item,\n  }) {\n    final result = create();\n    if (tab != null) result.tab = tab;\n    if (item != null) result.item.addAll(item);\n    return result;\n  }\n\n  FloorAdSearchReply._();\n\n  factory FloorAdSearchReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FloorAdSearchReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FloorAdSearchReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOM<FloorAdSearchTab>(1, _omitFieldNames ? '' : 'tab',\n        subBuilder: FloorAdSearchTab.create)\n    ..pPM<FloorAdSearchItem>(3, _omitFieldNames ? '' : 'item',\n        subBuilder: FloorAdSearchItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FloorAdSearchReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FloorAdSearchReply copyWith(void Function(FloorAdSearchReply) updates) =>\n      super.copyWith((message) => updates(message as FloorAdSearchReply))\n          as FloorAdSearchReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FloorAdSearchReply create() => FloorAdSearchReply._();\n  @$core.override\n  FloorAdSearchReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FloorAdSearchReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FloorAdSearchReply>(create);\n  static FloorAdSearchReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  FloorAdSearchTab get tab => $_getN(0);\n  @$pb.TagNumber(1)\n  set tab(FloorAdSearchTab value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTab() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTab() => $_clearField(1);\n  @$pb.TagNumber(1)\n  FloorAdSearchTab ensureTab() => $_ensure(0);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<FloorAdSearchItem> get item => $_getList(1);\n}\n\nclass FloorAdSearchReq extends $pb.GeneratedMessage {\n  factory FloorAdSearchReq({\n    $fixnum.Int64? aid,\n    $core.String? adExtra,\n    $core.String? spmid,\n    $core.String? fromSpmid,\n  }) {\n    final result = create();\n    if (aid != null) result.aid = aid;\n    if (adExtra != null) result.adExtra = adExtra;\n    if (spmid != null) result.spmid = spmid;\n    if (fromSpmid != null) result.fromSpmid = fromSpmid;\n    return result;\n  }\n\n  FloorAdSearchReq._();\n\n  factory FloorAdSearchReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FloorAdSearchReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FloorAdSearchReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'aid')\n    ..aOS(2, _omitFieldNames ? '' : 'adExtra')\n    ..aOS(3, _omitFieldNames ? '' : 'spmid')\n    ..aOS(4, _omitFieldNames ? '' : 'fromSpmid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FloorAdSearchReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FloorAdSearchReq copyWith(void Function(FloorAdSearchReq) updates) =>\n      super.copyWith((message) => updates(message as FloorAdSearchReq))\n          as FloorAdSearchReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FloorAdSearchReq create() => FloorAdSearchReq._();\n  @$core.override\n  FloorAdSearchReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FloorAdSearchReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FloorAdSearchReq>(create);\n  static FloorAdSearchReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get aid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set aid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get adExtra => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set adExtra($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAdExtra() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAdExtra() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get spmid => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set spmid($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSpmid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSpmid() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get fromSpmid => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set fromSpmid($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFromSpmid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFromSpmid() => $_clearField(4);\n}\n\nclass FloorAdSearchTab extends $pb.GeneratedMessage {\n  factory FloorAdSearchTab({\n    $core.String? title,\n    $core.String? butTitle,\n    $core.String? butUrl,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (butTitle != null) result.butTitle = butTitle;\n    if (butUrl != null) result.butUrl = butUrl;\n    return result;\n  }\n\n  FloorAdSearchTab._();\n\n  factory FloorAdSearchTab.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FloorAdSearchTab.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FloorAdSearchTab',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'butTitle')\n    ..aOS(3, _omitFieldNames ? '' : 'butUrl')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FloorAdSearchTab clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FloorAdSearchTab copyWith(void Function(FloorAdSearchTab) updates) =>\n      super.copyWith((message) => updates(message as FloorAdSearchTab))\n          as FloorAdSearchTab;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FloorAdSearchTab create() => FloorAdSearchTab._();\n  @$core.override\n  FloorAdSearchTab createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FloorAdSearchTab getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FloorAdSearchTab>(create);\n  static FloorAdSearchTab? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get butTitle => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set butTitle($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasButTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearButTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get butUrl => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set butUrl($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasButUrl() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearButUrl() => $_clearField(3);\n}\n\nclass FragmentArc extends $pb.GeneratedMessage {\n  factory FragmentArc({\n    $fixnum.Int64? aid,\n    $fixnum.Int64? cid,\n  }) {\n    final result = create();\n    if (aid != null) result.aid = aid;\n    if (cid != null) result.cid = cid;\n    return result;\n  }\n\n  FragmentArc._();\n\n  factory FragmentArc.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FragmentArc.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FragmentArc',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'aid')\n    ..aInt64(2, _omitFieldNames ? '' : 'cid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FragmentArc clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FragmentArc copyWith(void Function(FragmentArc) updates) =>\n      super.copyWith((message) => updates(message as FragmentArc))\n          as FragmentArc;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FragmentArc create() => FragmentArc._();\n  @$core.override\n  FragmentArc createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FragmentArc getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FragmentArc>(create);\n  static FragmentArc? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get aid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set aid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get cid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set cid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCid() => $_clearField(2);\n}\n\nclass FragmentParam extends $pb.GeneratedMessage {\n  factory FragmentParam({\n    $core.Iterable<FragmentArc>? fragmentArcs,\n  }) {\n    final result = create();\n    if (fragmentArcs != null) result.fragmentArcs.addAll(fragmentArcs);\n    return result;\n  }\n\n  FragmentParam._();\n\n  factory FragmentParam.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FragmentParam.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FragmentParam',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..pPM<FragmentArc>(1, _omitFieldNames ? '' : 'fragmentArcs',\n        subBuilder: FragmentArc.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FragmentParam clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FragmentParam copyWith(void Function(FragmentParam) updates) =>\n      super.copyWith((message) => updates(message as FragmentParam))\n          as FragmentParam;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FragmentParam create() => FragmentParam._();\n  @$core.override\n  FragmentParam createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FragmentParam getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FragmentParam>(create);\n  static FragmentParam? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<FragmentArc> get fragmentArcs => $_getList(0);\n}\n\nclass FragmentRes extends $pb.GeneratedMessage {\n  factory FragmentRes({\n    $core.Iterable<$core.MapEntry<$fixnum.Int64, VideoShot>>? videoShot,\n  }) {\n    final result = create();\n    if (videoShot != null) result.videoShot.addEntries(videoShot);\n    return result;\n  }\n\n  FragmentRes._();\n\n  factory FragmentRes.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FragmentRes.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FragmentRes',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..m<$fixnum.Int64, VideoShot>(1, _omitFieldNames ? '' : 'videoShot',\n        entryClassName: 'FragmentRes.VideoShotEntry',\n        keyFieldType: $pb.PbFieldType.O6,\n        valueFieldType: $pb.PbFieldType.OM,\n        valueCreator: VideoShot.create,\n        valueDefaultOrMaker: VideoShot.getDefault,\n        packageName: const $pb.PackageName('bilibili.app.viewunite.v1'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FragmentRes clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FragmentRes copyWith(void Function(FragmentRes) updates) =>\n      super.copyWith((message) => updates(message as FragmentRes))\n          as FragmentRes;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FragmentRes create() => FragmentRes._();\n  @$core.override\n  FragmentRes createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FragmentRes getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FragmentRes>(create);\n  static FragmentRes? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbMap<$fixnum.Int64, VideoShot> get videoShot => $_getMap(0);\n}\n\nclass IconData extends $pb.GeneratedMessage {\n  factory IconData({\n    $core.String? metaJson,\n    $core.String? spritsImg,\n  }) {\n    final result = create();\n    if (metaJson != null) result.metaJson = metaJson;\n    if (spritsImg != null) result.spritsImg = spritsImg;\n    return result;\n  }\n\n  IconData._();\n\n  factory IconData.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory IconData.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'IconData',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'metaJson')\n    ..aOS(2, _omitFieldNames ? '' : 'spritsImg')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  IconData clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  IconData copyWith(void Function(IconData) updates) =>\n      super.copyWith((message) => updates(message as IconData)) as IconData;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static IconData create() => IconData._();\n  @$core.override\n  IconData createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static IconData getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<IconData>(create);\n  static IconData? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get metaJson => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set metaJson($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMetaJson() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMetaJson() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get spritsImg => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set spritsImg($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSpritsImg() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSpritsImg() => $_clearField(2);\n}\n\nclass IntroductionTab extends $pb.GeneratedMessage {\n  factory IntroductionTab({\n    $core.String? title,\n    $core.Iterable<$1.Module>? modules,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (modules != null) result.modules.addAll(modules);\n    return result;\n  }\n\n  IntroductionTab._();\n\n  factory IntroductionTab.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory IntroductionTab.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'IntroductionTab',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..pPM<$1.Module>(2, _omitFieldNames ? '' : 'modules',\n        subBuilder: $1.Module.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  IntroductionTab clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  IntroductionTab copyWith(void Function(IntroductionTab) updates) =>\n      super.copyWith((message) => updates(message as IntroductionTab))\n          as IntroductionTab;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static IntroductionTab create() => IntroductionTab._();\n  @$core.override\n  IntroductionTab createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static IntroductionTab getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<IntroductionTab>(create);\n  static IntroductionTab? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<$1.Module> get modules => $_getList(1);\n}\n\nclass LikeConfig extends $pb.GeneratedMessage {\n  factory LikeConfig({\n    $1.UpLikeImg? tripleLike,\n    $core.String? likeAnimation,\n  }) {\n    final result = create();\n    if (tripleLike != null) result.tripleLike = tripleLike;\n    if (likeAnimation != null) result.likeAnimation = likeAnimation;\n    return result;\n  }\n\n  LikeConfig._();\n\n  factory LikeConfig.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LikeConfig.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LikeConfig',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOM<$1.UpLikeImg>(1, _omitFieldNames ? '' : 'tripleLike',\n        subBuilder: $1.UpLikeImg.create)\n    ..aOS(2, _omitFieldNames ? '' : 'likeAnimation')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeConfig clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeConfig copyWith(void Function(LikeConfig) updates) =>\n      super.copyWith((message) => updates(message as LikeConfig)) as LikeConfig;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LikeConfig create() => LikeConfig._();\n  @$core.override\n  LikeConfig createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LikeConfig getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LikeConfig>(create);\n  static LikeConfig? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $1.UpLikeImg get tripleLike => $_getN(0);\n  @$pb.TagNumber(1)\n  set tripleLike($1.UpLikeImg value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTripleLike() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTripleLike() => $_clearField(1);\n  @$pb.TagNumber(1)\n  $1.UpLikeImg ensureTripleLike() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get likeAnimation => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set likeAnimation($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLikeAnimation() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLikeAnimation() => $_clearField(2);\n}\n\nclass Material extends $pb.GeneratedMessage {\n  factory Material({\n    $core.String? icon,\n    $core.String? text,\n    $core.String? url,\n    MaterialBizType? type,\n    $core.String? param,\n    $core.String? staticIcon,\n    $core.String? bgColor,\n    $core.String? bgPic,\n    $core.int? jumpType,\n    PageType? pageType,\n    $core.bool? needLogin,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? report,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (text != null) result.text = text;\n    if (url != null) result.url = url;\n    if (type != null) result.type = type;\n    if (param != null) result.param = param;\n    if (staticIcon != null) result.staticIcon = staticIcon;\n    if (bgColor != null) result.bgColor = bgColor;\n    if (bgPic != null) result.bgPic = bgPic;\n    if (jumpType != null) result.jumpType = jumpType;\n    if (pageType != null) result.pageType = pageType;\n    if (needLogin != null) result.needLogin = needLogin;\n    if (report != null) result.report.addEntries(report);\n    return result;\n  }\n\n  Material._();\n\n  factory Material.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Material.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Material',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'text')\n    ..aOS(3, _omitFieldNames ? '' : 'url')\n    ..aE<MaterialBizType>(4, _omitFieldNames ? '' : 'type',\n        enumValues: MaterialBizType.values)\n    ..aOS(5, _omitFieldNames ? '' : 'param')\n    ..aOS(6, _omitFieldNames ? '' : 'staticIcon')\n    ..aOS(7, _omitFieldNames ? '' : 'bgColor')\n    ..aOS(8, _omitFieldNames ? '' : 'bgPic')\n    ..aI(9, _omitFieldNames ? '' : 'jumpType')\n    ..aE<PageType>(10, _omitFieldNames ? '' : 'pageType',\n        enumValues: PageType.values)\n    ..aOB(11, _omitFieldNames ? '' : 'needLogin')\n    ..m<$core.String, $core.String>(12, _omitFieldNames ? '' : 'report',\n        entryClassName: 'Material.ReportEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.viewunite.v1'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Material clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Material copyWith(void Function(Material) updates) =>\n      super.copyWith((message) => updates(message as Material)) as Material;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Material create() => Material._();\n  @$core.override\n  Material createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Material getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Material>(create);\n  static Material? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get url => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set url($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUrl() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUrl() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  MaterialBizType get type => $_getN(3);\n  @$pb.TagNumber(4)\n  set type(MaterialBizType value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearType() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get param => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set param($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasParam() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearParam() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get staticIcon => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set staticIcon($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasStaticIcon() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearStaticIcon() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get bgColor => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set bgColor($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBgColor() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBgColor() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get bgPic => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set bgPic($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasBgPic() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearBgPic() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.int get jumpType => $_getIZ(8);\n  @$pb.TagNumber(9)\n  set jumpType($core.int value) => $_setSignedInt32(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasJumpType() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearJumpType() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  PageType get pageType => $_getN(9);\n  @$pb.TagNumber(10)\n  set pageType(PageType value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasPageType() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearPageType() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.bool get needLogin => $_getBF(10);\n  @$pb.TagNumber(11)\n  set needLogin($core.bool value) => $_setBool(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasNeedLogin() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearNeedLogin() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $pb.PbMap<$core.String, $core.String> get report => $_getMap(11);\n}\n\nclass OldFan extends $pb.GeneratedMessage {\n  factory OldFan({\n    $core.int? isFollowDisplay,\n    $core.String? wingPic,\n  }) {\n    final result = create();\n    if (isFollowDisplay != null) result.isFollowDisplay = isFollowDisplay;\n    if (wingPic != null) result.wingPic = wingPic;\n    return result;\n  }\n\n  OldFan._();\n\n  factory OldFan.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OldFan.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OldFan',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'isFollowDisplay')\n    ..aOS(2, _omitFieldNames ? '' : 'wingPic')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OldFan clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OldFan copyWith(void Function(OldFan) updates) =>\n      super.copyWith((message) => updates(message as OldFan)) as OldFan;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OldFan create() => OldFan._();\n  @$core.override\n  OldFan createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OldFan getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<OldFan>(create);\n  static OldFan? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get isFollowDisplay => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set isFollowDisplay($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIsFollowDisplay() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIsFollowDisplay() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get wingPic => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set wingPic($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasWingPic() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearWingPic() => $_clearField(2);\n}\n\nclass Online extends $pb.GeneratedMessage {\n  factory Online({\n    $core.bool? onlineShow,\n  }) {\n    final result = create();\n    if (onlineShow != null) result.onlineShow = onlineShow;\n    return result;\n  }\n\n  Online._();\n\n  factory Online.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Online.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Online',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'onlineShow')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Online clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Online copyWith(void Function(Online) updates) =>\n      super.copyWith((message) => updates(message as Online)) as Online;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Online create() => Online._();\n  @$core.override\n  Online createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Online getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Online>(create);\n  static Online? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get onlineShow => $_getBF(0);\n  @$pb.TagNumber(1)\n  set onlineShow($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOnlineShow() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOnlineShow() => $_clearField(1);\n}\n\nenum OperationCard_Param { follow, reserve, jump, game, gameBackflow, notSet }\n\nclass OperationCard extends $pb.GeneratedMessage {\n  factory OperationCard({\n    $fixnum.Int64? id,\n    $core.int? from,\n    $core.int? to,\n    $core.bool? status,\n    BizType? bizType,\n    OperationCardContent? content,\n    BizFollowVideoParam? follow,\n    BizReserveActivityParam? reserve,\n    BizJumpLinkParam? jump,\n    BizReserveGameParam? game,\n    BizGameBackflowParam? gameBackflow,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (from != null) result.from = from;\n    if (to != null) result.to = to;\n    if (status != null) result.status = status;\n    if (bizType != null) result.bizType = bizType;\n    if (content != null) result.content = content;\n    if (follow != null) result.follow = follow;\n    if (reserve != null) result.reserve = reserve;\n    if (jump != null) result.jump = jump;\n    if (game != null) result.game = game;\n    if (gameBackflow != null) result.gameBackflow = gameBackflow;\n    return result;\n  }\n\n  OperationCard._();\n\n  factory OperationCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OperationCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, OperationCard_Param>\n      _OperationCard_ParamByTag = {\n    7: OperationCard_Param.follow,\n    8: OperationCard_Param.reserve,\n    9: OperationCard_Param.jump,\n    10: OperationCard_Param.game,\n    11: OperationCard_Param.gameBackflow,\n    0: OperationCard_Param.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OperationCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [7, 8, 9, 10, 11])\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aI(2, _omitFieldNames ? '' : 'from')\n    ..aI(3, _omitFieldNames ? '' : 'to')\n    ..aOB(4, _omitFieldNames ? '' : 'status')\n    ..aE<BizType>(5, _omitFieldNames ? '' : 'bizType',\n        enumValues: BizType.values)\n    ..aOM<OperationCardContent>(6, _omitFieldNames ? '' : 'content',\n        subBuilder: OperationCardContent.create)\n    ..aOM<BizFollowVideoParam>(7, _omitFieldNames ? '' : 'follow',\n        subBuilder: BizFollowVideoParam.create)\n    ..aOM<BizReserveActivityParam>(8, _omitFieldNames ? '' : 'reserve',\n        subBuilder: BizReserveActivityParam.create)\n    ..aOM<BizJumpLinkParam>(9, _omitFieldNames ? '' : 'jump',\n        subBuilder: BizJumpLinkParam.create)\n    ..aOM<BizReserveGameParam>(10, _omitFieldNames ? '' : 'game',\n        subBuilder: BizReserveGameParam.create)\n    ..aOM<BizGameBackflowParam>(11, _omitFieldNames ? '' : 'gameBackflow',\n        subBuilder: BizGameBackflowParam.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OperationCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OperationCard copyWith(void Function(OperationCard) updates) =>\n      super.copyWith((message) => updates(message as OperationCard))\n          as OperationCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OperationCard create() => OperationCard._();\n  @$core.override\n  OperationCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OperationCard getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OperationCard>(create);\n  static OperationCard? _defaultInstance;\n\n  @$pb.TagNumber(7)\n  @$pb.TagNumber(8)\n  @$pb.TagNumber(9)\n  @$pb.TagNumber(10)\n  @$pb.TagNumber(11)\n  OperationCard_Param whichParam() =>\n      _OperationCard_ParamByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(7)\n  @$pb.TagNumber(8)\n  @$pb.TagNumber(9)\n  @$pb.TagNumber(10)\n  @$pb.TagNumber(11)\n  void clearParam() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get from => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set from($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFrom() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFrom() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get to => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set to($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTo() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTo() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get status => $_getBF(3);\n  @$pb.TagNumber(4)\n  set status($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasStatus() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearStatus() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  BizType get bizType => $_getN(4);\n  @$pb.TagNumber(5)\n  set bizType(BizType value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBizType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBizType() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  OperationCardContent get content => $_getN(5);\n  @$pb.TagNumber(6)\n  set content(OperationCardContent value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasContent() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearContent() => $_clearField(6);\n  @$pb.TagNumber(6)\n  OperationCardContent ensureContent() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  BizFollowVideoParam get follow => $_getN(6);\n  @$pb.TagNumber(7)\n  set follow(BizFollowVideoParam value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasFollow() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearFollow() => $_clearField(7);\n  @$pb.TagNumber(7)\n  BizFollowVideoParam ensureFollow() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  BizReserveActivityParam get reserve => $_getN(7);\n  @$pb.TagNumber(8)\n  set reserve(BizReserveActivityParam value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasReserve() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearReserve() => $_clearField(8);\n  @$pb.TagNumber(8)\n  BizReserveActivityParam ensureReserve() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  BizJumpLinkParam get jump => $_getN(8);\n  @$pb.TagNumber(9)\n  set jump(BizJumpLinkParam value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasJump() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearJump() => $_clearField(9);\n  @$pb.TagNumber(9)\n  BizJumpLinkParam ensureJump() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  BizReserveGameParam get game => $_getN(9);\n  @$pb.TagNumber(10)\n  set game(BizReserveGameParam value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasGame() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearGame() => $_clearField(10);\n  @$pb.TagNumber(10)\n  BizReserveGameParam ensureGame() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  BizGameBackflowParam get gameBackflow => $_getN(10);\n  @$pb.TagNumber(11)\n  set gameBackflow(BizGameBackflowParam value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasGameBackflow() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearGameBackflow() => $_clearField(11);\n  @$pb.TagNumber(11)\n  BizGameBackflowParam ensureGameBackflow() => $_ensure(10);\n}\n\nclass OperationCardContent extends $pb.GeneratedMessage {\n  factory OperationCardContent({\n    $core.String? title,\n    $core.String? subtitle,\n    $core.String? icon,\n    $core.String? buttonTitle,\n    $core.String? buttonSelectedTitle,\n    $core.bool? showSelected,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (subtitle != null) result.subtitle = subtitle;\n    if (icon != null) result.icon = icon;\n    if (buttonTitle != null) result.buttonTitle = buttonTitle;\n    if (buttonSelectedTitle != null)\n      result.buttonSelectedTitle = buttonSelectedTitle;\n    if (showSelected != null) result.showSelected = showSelected;\n    return result;\n  }\n\n  OperationCardContent._();\n\n  factory OperationCardContent.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OperationCardContent.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OperationCardContent',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'subtitle')\n    ..aOS(3, _omitFieldNames ? '' : 'icon')\n    ..aOS(4, _omitFieldNames ? '' : 'buttonTitle')\n    ..aOS(5, _omitFieldNames ? '' : 'buttonSelectedTitle')\n    ..aOB(6, _omitFieldNames ? '' : 'showSelected')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OperationCardContent clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OperationCardContent copyWith(void Function(OperationCardContent) updates) =>\n      super.copyWith((message) => updates(message as OperationCardContent))\n          as OperationCardContent;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OperationCardContent create() => OperationCardContent._();\n  @$core.override\n  OperationCardContent createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OperationCardContent getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OperationCardContent>(create);\n  static OperationCardContent? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get subtitle => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set subtitle($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSubtitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSubtitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get icon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set icon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIcon() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get buttonTitle => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set buttonTitle($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasButtonTitle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearButtonTitle() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get buttonSelectedTitle => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set buttonSelectedTitle($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasButtonSelectedTitle() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearButtonSelectedTitle() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.bool get showSelected => $_getBF(5);\n  @$pb.TagNumber(6)\n  set showSelected($core.bool value) => $_setBool(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasShowSelected() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearShowSelected() => $_clearField(6);\n}\n\nclass PadRelateCM extends $pb.GeneratedMessage {\n  factory PadRelateCM({\n    RelateCM? cm,\n  }) {\n    final result = create();\n    if (cm != null) result.cm = cm;\n    return result;\n  }\n\n  PadRelateCM._();\n\n  factory PadRelateCM.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PadRelateCM.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PadRelateCM',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOM<RelateCM>(1, _omitFieldNames ? '' : 'cm', subBuilder: RelateCM.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PadRelateCM clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PadRelateCM copyWith(void Function(PadRelateCM) updates) =>\n      super.copyWith((message) => updates(message as PadRelateCM))\n          as PadRelateCM;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PadRelateCM create() => PadRelateCM._();\n  @$core.override\n  PadRelateCM createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PadRelateCM getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PadRelateCM>(create);\n  static PadRelateCM? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  RelateCM get cm => $_getN(0);\n  @$pb.TagNumber(1)\n  set cm(RelateCM value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCm() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCm() => $_clearField(1);\n  @$pb.TagNumber(1)\n  RelateCM ensureCm() => $_ensure(0);\n}\n\nclass PageControl extends $pb.GeneratedMessage {\n  factory PageControl({\n    Control? toastShow,\n    Control? materialShow,\n    Control? upShow,\n  }) {\n    final result = create();\n    if (toastShow != null) result.toastShow = toastShow;\n    if (materialShow != null) result.materialShow = materialShow;\n    if (upShow != null) result.upShow = upShow;\n    return result;\n  }\n\n  PageControl._();\n\n  factory PageControl.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PageControl.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PageControl',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOM<Control>(1, _omitFieldNames ? '' : 'toastShow',\n        subBuilder: Control.create)\n    ..aOM<Control>(2, _omitFieldNames ? '' : 'materialShow',\n        subBuilder: Control.create)\n    ..aOM<Control>(3, _omitFieldNames ? '' : 'upShow',\n        subBuilder: Control.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PageControl clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PageControl copyWith(void Function(PageControl) updates) =>\n      super.copyWith((message) => updates(message as PageControl))\n          as PageControl;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PageControl create() => PageControl._();\n  @$core.override\n  PageControl createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PageControl getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PageControl>(create);\n  static PageControl? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Control get toastShow => $_getN(0);\n  @$pb.TagNumber(1)\n  set toastShow(Control value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasToastShow() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearToastShow() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Control ensureToastShow() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  Control get materialShow => $_getN(1);\n  @$pb.TagNumber(2)\n  set materialShow(Control value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMaterialShow() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMaterialShow() => $_clearField(2);\n  @$pb.TagNumber(2)\n  Control ensureMaterialShow() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  Control get upShow => $_getN(2);\n  @$pb.TagNumber(3)\n  set upShow(Control value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUpShow() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUpShow() => $_clearField(3);\n  @$pb.TagNumber(3)\n  Control ensureUpShow() => $_ensure(2);\n}\n\nclass PlayListReqParam extends $pb.GeneratedMessage {\n  factory PlayListReqParam({\n    $fixnum.Int64? mediaId,\n    $fixnum.Int64? bizId,\n    $fixnum.Int64? type,\n    $core.bool? pageDirection,\n    $core.bool? firstPage,\n    $fixnum.Int64? offset,\n    $fixnum.Int64? sortDesc,\n    $fixnum.Int64? sortField,\n  }) {\n    final result = create();\n    if (mediaId != null) result.mediaId = mediaId;\n    if (bizId != null) result.bizId = bizId;\n    if (type != null) result.type = type;\n    if (pageDirection != null) result.pageDirection = pageDirection;\n    if (firstPage != null) result.firstPage = firstPage;\n    if (offset != null) result.offset = offset;\n    if (sortDesc != null) result.sortDesc = sortDesc;\n    if (sortField != null) result.sortField = sortField;\n    return result;\n  }\n\n  PlayListReqParam._();\n\n  factory PlayListReqParam.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayListReqParam.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayListReqParam',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mediaId')\n    ..aInt64(2, _omitFieldNames ? '' : 'bizId')\n    ..aInt64(3, _omitFieldNames ? '' : 'type')\n    ..aOB(4, _omitFieldNames ? '' : 'pageDirection')\n    ..aOB(5, _omitFieldNames ? '' : 'firstPage')\n    ..aInt64(6, _omitFieldNames ? '' : 'offset')\n    ..aInt64(7, _omitFieldNames ? '' : 'sortDesc')\n    ..aInt64(8, _omitFieldNames ? '' : 'sortField')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayListReqParam clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayListReqParam copyWith(void Function(PlayListReqParam) updates) =>\n      super.copyWith((message) => updates(message as PlayListReqParam))\n          as PlayListReqParam;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayListReqParam create() => PlayListReqParam._();\n  @$core.override\n  PlayListReqParam createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayListReqParam getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayListReqParam>(create);\n  static PlayListReqParam? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mediaId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mediaId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMediaId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMediaId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get bizId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set bizId($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBizId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBizId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get type => $_getI64(2);\n  @$pb.TagNumber(3)\n  set type($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get pageDirection => $_getBF(3);\n  @$pb.TagNumber(4)\n  set pageDirection($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPageDirection() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPageDirection() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.bool get firstPage => $_getBF(4);\n  @$pb.TagNumber(5)\n  set firstPage($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasFirstPage() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearFirstPage() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get offset => $_getI64(5);\n  @$pb.TagNumber(6)\n  set offset($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasOffset() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearOffset() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get sortDesc => $_getI64(6);\n  @$pb.TagNumber(7)\n  set sortDesc($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasSortDesc() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearSortDesc() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get sortField => $_getI64(7);\n  @$pb.TagNumber(8)\n  set sortField($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasSortField() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearSortField() => $_clearField(8);\n}\n\nclass PlayToast extends $pb.GeneratedMessage {\n  factory PlayToast({\n    PlayToastEnum? business,\n    $core.String? iconUrl,\n    $core.String? text,\n  }) {\n    final result = create();\n    if (business != null) result.business = business;\n    if (iconUrl != null) result.iconUrl = iconUrl;\n    if (text != null) result.text = text;\n    return result;\n  }\n\n  PlayToast._();\n\n  factory PlayToast.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayToast.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayToast',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aE<PlayToastEnum>(1, _omitFieldNames ? '' : 'business',\n        enumValues: PlayToastEnum.values)\n    ..aOS(2, _omitFieldNames ? '' : 'iconUrl')\n    ..aOS(3, _omitFieldNames ? '' : 'text')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayToast clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayToast copyWith(void Function(PlayToast) updates) =>\n      super.copyWith((message) => updates(message as PlayToast)) as PlayToast;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayToast create() => PlayToast._();\n  @$core.override\n  PlayToast createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayToast getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PlayToast>(create);\n  static PlayToast? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PlayToastEnum get business => $_getN(0);\n  @$pb.TagNumber(1)\n  set business(PlayToastEnum value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBusiness() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBusiness() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get iconUrl => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set iconUrl($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIconUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIconUrl() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get text => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set text($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasText() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearText() => $_clearField(3);\n}\n\nclass PlayerIcon extends $pb.GeneratedMessage {\n  factory PlayerIcon({\n    $core.String? url1,\n    $core.String? hash1,\n    $core.String? url2,\n    $core.String? hash2,\n    $core.String? dragLeftPng,\n    $core.String? middlePng,\n    $core.String? dragRightPng,\n    IconData? dragData,\n    IconData? nodragData,\n  }) {\n    final result = create();\n    if (url1 != null) result.url1 = url1;\n    if (hash1 != null) result.hash1 = hash1;\n    if (url2 != null) result.url2 = url2;\n    if (hash2 != null) result.hash2 = hash2;\n    if (dragLeftPng != null) result.dragLeftPng = dragLeftPng;\n    if (middlePng != null) result.middlePng = middlePng;\n    if (dragRightPng != null) result.dragRightPng = dragRightPng;\n    if (dragData != null) result.dragData = dragData;\n    if (nodragData != null) result.nodragData = nodragData;\n    return result;\n  }\n\n  PlayerIcon._();\n\n  factory PlayerIcon.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayerIcon.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayerIcon',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'url1')\n    ..aOS(2, _omitFieldNames ? '' : 'hash1')\n    ..aOS(3, _omitFieldNames ? '' : 'url2')\n    ..aOS(4, _omitFieldNames ? '' : 'hash2')\n    ..aOS(5, _omitFieldNames ? '' : 'dragLeftPng')\n    ..aOS(6, _omitFieldNames ? '' : 'middlePng')\n    ..aOS(7, _omitFieldNames ? '' : 'dragRightPng')\n    ..aOM<IconData>(8, _omitFieldNames ? '' : 'dragData',\n        subBuilder: IconData.create)\n    ..aOM<IconData>(9, _omitFieldNames ? '' : 'nodragData',\n        subBuilder: IconData.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerIcon clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerIcon copyWith(void Function(PlayerIcon) updates) =>\n      super.copyWith((message) => updates(message as PlayerIcon)) as PlayerIcon;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayerIcon create() => PlayerIcon._();\n  @$core.override\n  PlayerIcon createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayerIcon getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayerIcon>(create);\n  static PlayerIcon? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get url1 => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set url1($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUrl1() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUrl1() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get hash1 => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set hash1($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHash1() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHash1() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get url2 => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set url2($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUrl2() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUrl2() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get hash2 => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set hash2($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasHash2() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearHash2() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get dragLeftPng => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set dragLeftPng($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDragLeftPng() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDragLeftPng() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get middlePng => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set middlePng($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasMiddlePng() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearMiddlePng() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get dragRightPng => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set dragRightPng($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasDragRightPng() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearDragRightPng() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  IconData get dragData => $_getN(7);\n  @$pb.TagNumber(8)\n  set dragData(IconData value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasDragData() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearDragData() => $_clearField(8);\n  @$pb.TagNumber(8)\n  IconData ensureDragData() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  IconData get nodragData => $_getN(8);\n  @$pb.TagNumber(9)\n  set nodragData(IconData value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasNodragData() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearNodragData() => $_clearField(9);\n  @$pb.TagNumber(9)\n  IconData ensureNodragData() => $_ensure(8);\n}\n\nclass PointMaterial extends $pb.GeneratedMessage {\n  factory PointMaterial({\n    $core.String? url,\n    MaterialSource? materialSource,\n  }) {\n    final result = create();\n    if (url != null) result.url = url;\n    if (materialSource != null) result.materialSource = materialSource;\n    return result;\n  }\n\n  PointMaterial._();\n\n  factory PointMaterial.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PointMaterial.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PointMaterial',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'url')\n    ..aE<MaterialSource>(2, _omitFieldNames ? '' : 'materialSource',\n        enumValues: MaterialSource.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PointMaterial clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PointMaterial copyWith(void Function(PointMaterial) updates) =>\n      super.copyWith((message) => updates(message as PointMaterial))\n          as PointMaterial;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PointMaterial create() => PointMaterial._();\n  @$core.override\n  PointMaterial createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PointMaterial getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PointMaterial>(create);\n  static PointMaterial? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get url => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set url($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUrl() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  MaterialSource get materialSource => $_getN(1);\n  @$pb.TagNumber(2)\n  set materialSource(MaterialSource value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMaterialSource() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMaterialSource() => $_clearField(2);\n}\n\nclass Relate extends $pb.GeneratedMessage {\n  factory Relate({\n    $fixnum.Int64? deviceType,\n    $3.Pagination? pagination,\n  }) {\n    final result = create();\n    if (deviceType != null) result.deviceType = deviceType;\n    if (pagination != null) result.pagination = pagination;\n    return result;\n  }\n\n  Relate._();\n\n  factory Relate.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Relate.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Relate',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'deviceType')\n    ..aOM<$3.Pagination>(2, _omitFieldNames ? '' : 'pagination',\n        subBuilder: $3.Pagination.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Relate clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Relate copyWith(void Function(Relate) updates) =>\n      super.copyWith((message) => updates(message as Relate)) as Relate;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Relate create() => Relate._();\n  @$core.override\n  Relate createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Relate getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Relate>(create);\n  static Relate? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get deviceType => $_getI64(0);\n  @$pb.TagNumber(1)\n  set deviceType($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDeviceType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDeviceType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $3.Pagination get pagination => $_getN(1);\n  @$pb.TagNumber(2)\n  set pagination($3.Pagination value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPagination() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPagination() => $_clearField(2);\n  @$pb.TagNumber(2)\n  $3.Pagination ensurePagination() => $_ensure(1);\n}\n\nclass RelateCM extends $pb.GeneratedMessage {\n  factory RelateCM({\n    $fixnum.Int64? aid,\n    $2.Any? sourceContent,\n    $fixnum.Int64? duration,\n    $1.Stat? stat,\n    $1.Owner? owner,\n  }) {\n    final result = create();\n    if (aid != null) result.aid = aid;\n    if (sourceContent != null) result.sourceContent = sourceContent;\n    if (duration != null) result.duration = duration;\n    if (stat != null) result.stat = stat;\n    if (owner != null) result.owner = owner;\n    return result;\n  }\n\n  RelateCM._();\n\n  factory RelateCM.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RelateCM.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RelateCM',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'aid')\n    ..aOM<$2.Any>(2, _omitFieldNames ? '' : 'sourceContent',\n        subBuilder: $2.Any.create)\n    ..aInt64(3, _omitFieldNames ? '' : 'duration')\n    ..aOM<$1.Stat>(4, _omitFieldNames ? '' : 'stat', subBuilder: $1.Stat.create)\n    ..aOM<$1.Owner>(5, _omitFieldNames ? '' : 'owner',\n        subBuilder: $1.Owner.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateCM clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelateCM copyWith(void Function(RelateCM) updates) =>\n      super.copyWith((message) => updates(message as RelateCM)) as RelateCM;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RelateCM create() => RelateCM._();\n  @$core.override\n  RelateCM createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RelateCM getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<RelateCM>(create);\n  static RelateCM? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get aid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set aid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $2.Any get sourceContent => $_getN(1);\n  @$pb.TagNumber(2)\n  set sourceContent($2.Any value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSourceContent() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSourceContent() => $_clearField(2);\n  @$pb.TagNumber(2)\n  $2.Any ensureSourceContent() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get duration => $_getI64(2);\n  @$pb.TagNumber(3)\n  set duration($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDuration() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDuration() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $1.Stat get stat => $_getN(3);\n  @$pb.TagNumber(4)\n  set stat($1.Stat value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasStat() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearStat() => $_clearField(4);\n  @$pb.TagNumber(4)\n  $1.Stat ensureStat() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $1.Owner get owner => $_getN(4);\n  @$pb.TagNumber(5)\n  set owner($1.Owner value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasOwner() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearOwner() => $_clearField(5);\n  @$pb.TagNumber(5)\n  $1.Owner ensureOwner() => $_ensure(4);\n}\n\nclass RelatesFeedReply extends $pb.GeneratedMessage {\n  factory RelatesFeedReply({\n    $core.Iterable<$1.RelateCard>? relates,\n    $3.Pagination? pagination,\n  }) {\n    final result = create();\n    if (relates != null) result.relates.addAll(relates);\n    if (pagination != null) result.pagination = pagination;\n    return result;\n  }\n\n  RelatesFeedReply._();\n\n  factory RelatesFeedReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RelatesFeedReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RelatesFeedReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..pPM<$1.RelateCard>(1, _omitFieldNames ? '' : 'relates',\n        subBuilder: $1.RelateCard.create)\n    ..aOM<$3.Pagination>(2, _omitFieldNames ? '' : 'pagination',\n        subBuilder: $3.Pagination.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelatesFeedReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelatesFeedReply copyWith(void Function(RelatesFeedReply) updates) =>\n      super.copyWith((message) => updates(message as RelatesFeedReply))\n          as RelatesFeedReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RelatesFeedReply create() => RelatesFeedReply._();\n  @$core.override\n  RelatesFeedReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RelatesFeedReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RelatesFeedReply>(create);\n  static RelatesFeedReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<$1.RelateCard> get relates => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $3.Pagination get pagination => $_getN(1);\n  @$pb.TagNumber(2)\n  set pagination($3.Pagination value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPagination() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPagination() => $_clearField(2);\n  @$pb.TagNumber(2)\n  $3.Pagination ensurePagination() => $_ensure(1);\n}\n\nclass RelatesFeedReq extends $pb.GeneratedMessage {\n  factory RelatesFeedReq({\n    $fixnum.Int64? aid,\n    $core.String? bvid,\n    $core.String? from,\n    $core.String? spmid,\n    $core.String? fromSpmid,\n    $4.PlayerArgs? playerArgs,\n    $3.Pagination? pagination,\n    $core.String? sessionId,\n    $fixnum.Int64? autoPlay,\n    $core.String? fromTrackId,\n    $core.String? bizExtra,\n    $core.String? adExtra,\n    $fixnum.Int64? tabCategory,\n    $core.String? tabCategoryName,\n  }) {\n    final result = create();\n    if (aid != null) result.aid = aid;\n    if (bvid != null) result.bvid = bvid;\n    if (from != null) result.from = from;\n    if (spmid != null) result.spmid = spmid;\n    if (fromSpmid != null) result.fromSpmid = fromSpmid;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    if (pagination != null) result.pagination = pagination;\n    if (sessionId != null) result.sessionId = sessionId;\n    if (autoPlay != null) result.autoPlay = autoPlay;\n    if (fromTrackId != null) result.fromTrackId = fromTrackId;\n    if (bizExtra != null) result.bizExtra = bizExtra;\n    if (adExtra != null) result.adExtra = adExtra;\n    if (tabCategory != null) result.tabCategory = tabCategory;\n    if (tabCategoryName != null) result.tabCategoryName = tabCategoryName;\n    return result;\n  }\n\n  RelatesFeedReq._();\n\n  factory RelatesFeedReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RelatesFeedReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RelatesFeedReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'aid')\n    ..aOS(2, _omitFieldNames ? '' : 'bvid')\n    ..aOS(3, _omitFieldNames ? '' : 'from')\n    ..aOS(4, _omitFieldNames ? '' : 'spmid')\n    ..aOS(5, _omitFieldNames ? '' : 'fromSpmid')\n    ..aOM<$4.PlayerArgs>(6, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $4.PlayerArgs.create)\n    ..aOM<$3.Pagination>(7, _omitFieldNames ? '' : 'pagination',\n        subBuilder: $3.Pagination.create)\n    ..aOS(8, _omitFieldNames ? '' : 'sessionId')\n    ..aInt64(9, _omitFieldNames ? '' : 'autoPlay')\n    ..aOS(10, _omitFieldNames ? '' : 'fromTrackId')\n    ..aOS(11, _omitFieldNames ? '' : 'bizExtra')\n    ..aOS(12, _omitFieldNames ? '' : 'adExtra')\n    ..aInt64(13, _omitFieldNames ? '' : 'tabCategory')\n    ..aOS(14, _omitFieldNames ? '' : 'tabCategoryName')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelatesFeedReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelatesFeedReq copyWith(void Function(RelatesFeedReq) updates) =>\n      super.copyWith((message) => updates(message as RelatesFeedReq))\n          as RelatesFeedReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RelatesFeedReq create() => RelatesFeedReq._();\n  @$core.override\n  RelatesFeedReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RelatesFeedReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RelatesFeedReq>(create);\n  static RelatesFeedReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get aid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set aid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get bvid => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set bvid($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBvid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBvid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get from => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set from($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFrom() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFrom() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get spmid => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set spmid($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSpmid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSpmid() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get fromSpmid => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set fromSpmid($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasFromSpmid() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearFromSpmid() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $4.PlayerArgs get playerArgs => $_getN(5);\n  @$pb.TagNumber(6)\n  set playerArgs($4.PlayerArgs value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasPlayerArgs() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearPlayerArgs() => $_clearField(6);\n  @$pb.TagNumber(6)\n  $4.PlayerArgs ensurePlayerArgs() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $3.Pagination get pagination => $_getN(6);\n  @$pb.TagNumber(7)\n  set pagination($3.Pagination value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasPagination() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearPagination() => $_clearField(7);\n  @$pb.TagNumber(7)\n  $3.Pagination ensurePagination() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  $core.String get sessionId => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set sessionId($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasSessionId() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearSessionId() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get autoPlay => $_getI64(8);\n  @$pb.TagNumber(9)\n  set autoPlay($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasAutoPlay() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearAutoPlay() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get fromTrackId => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set fromTrackId($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasFromTrackId() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearFromTrackId() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get bizExtra => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set bizExtra($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasBizExtra() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearBizExtra() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get adExtra => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set adExtra($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasAdExtra() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearAdExtra() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $fixnum.Int64 get tabCategory => $_getI64(12);\n  @$pb.TagNumber(13)\n  set tabCategory($fixnum.Int64 value) => $_setInt64(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasTabCategory() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearTabCategory() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.String get tabCategoryName => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set tabCategoryName($core.String value) => $_setString(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasTabCategoryName() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearTabCategoryName() => $_clearField(14);\n}\n\nclass ReplyStyle extends $pb.GeneratedMessage {\n  factory ReplyStyle({\n    $core.String? badgeUrl,\n    $core.String? badgeText,\n    $fixnum.Int64? badgeType,\n  }) {\n    final result = create();\n    if (badgeUrl != null) result.badgeUrl = badgeUrl;\n    if (badgeText != null) result.badgeText = badgeText;\n    if (badgeType != null) result.badgeType = badgeType;\n    return result;\n  }\n\n  ReplyStyle._();\n\n  factory ReplyStyle.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReplyStyle.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReplyStyle',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'badgeUrl')\n    ..aOS(2, _omitFieldNames ? '' : 'badgeText')\n    ..aInt64(3, _omitFieldNames ? '' : 'badgeType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyStyle clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyStyle copyWith(void Function(ReplyStyle) updates) =>\n      super.copyWith((message) => updates(message as ReplyStyle)) as ReplyStyle;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReplyStyle create() => ReplyStyle._();\n  @$core.override\n  ReplyStyle createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReplyStyle getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReplyStyle>(create);\n  static ReplyStyle? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get badgeUrl => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set badgeUrl($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBadgeUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBadgeUrl() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get badgeText => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set badgeText($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBadgeText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBadgeText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get badgeType => $_getI64(2);\n  @$pb.TagNumber(3)\n  set badgeType($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBadgeType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBadgeType() => $_clearField(3);\n}\n\nclass ReplyTab extends $pb.GeneratedMessage {\n  factory ReplyTab({\n    ReplyStyle? replyStyle,\n    $core.String? title,\n    TabControl? control,\n  }) {\n    final result = create();\n    if (replyStyle != null) result.replyStyle = replyStyle;\n    if (title != null) result.title = title;\n    if (control != null) result.control = control;\n    return result;\n  }\n\n  ReplyTab._();\n\n  factory ReplyTab.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReplyTab.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReplyTab',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOM<ReplyStyle>(1, _omitFieldNames ? '' : 'replyStyle',\n        subBuilder: ReplyStyle.create)\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOM<TabControl>(3, _omitFieldNames ? '' : 'control',\n        subBuilder: TabControl.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyTab clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyTab copyWith(void Function(ReplyTab) updates) =>\n      super.copyWith((message) => updates(message as ReplyTab)) as ReplyTab;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReplyTab create() => ReplyTab._();\n  @$core.override\n  ReplyTab createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReplyTab getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ReplyTab>(create);\n  static ReplyTab? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  ReplyStyle get replyStyle => $_getN(0);\n  @$pb.TagNumber(1)\n  set replyStyle(ReplyStyle value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasReplyStyle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearReplyStyle() => $_clearField(1);\n  @$pb.TagNumber(1)\n  ReplyStyle ensureReplyStyle() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  TabControl get control => $_getN(2);\n  @$pb.TagNumber(3)\n  set control(TabControl value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasControl() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearControl() => $_clearField(3);\n  @$pb.TagNumber(3)\n  TabControl ensureControl() => $_ensure(2);\n}\n\nclass ReqUser extends $pb.GeneratedMessage {\n  factory ReqUser({\n    $core.int? favorite,\n    $core.int? like,\n    $core.int? coin,\n    $core.int? favSeason,\n    $core.int? follow,\n    $core.int? dislike,\n    Button? elecPlusBtn,\n    ChargingPlus? chargingPlus,\n    ReqUserExtra? extra,\n    $core.int? paid,\n    OldFan? oldFan,\n  }) {\n    final result = create();\n    if (favorite != null) result.favorite = favorite;\n    if (like != null) result.like = like;\n    if (coin != null) result.coin = coin;\n    if (favSeason != null) result.favSeason = favSeason;\n    if (follow != null) result.follow = follow;\n    if (dislike != null) result.dislike = dislike;\n    if (elecPlusBtn != null) result.elecPlusBtn = elecPlusBtn;\n    if (chargingPlus != null) result.chargingPlus = chargingPlus;\n    if (extra != null) result.extra = extra;\n    if (paid != null) result.paid = paid;\n    if (oldFan != null) result.oldFan = oldFan;\n    return result;\n  }\n\n  ReqUser._();\n\n  factory ReqUser.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqUser.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqUser',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'favorite')\n    ..aI(2, _omitFieldNames ? '' : 'like')\n    ..aI(3, _omitFieldNames ? '' : 'coin')\n    ..aI(4, _omitFieldNames ? '' : 'favSeason')\n    ..aI(5, _omitFieldNames ? '' : 'follow')\n    ..aI(6, _omitFieldNames ? '' : 'dislike')\n    ..aOM<Button>(7, _omitFieldNames ? '' : 'elecPlusBtn',\n        subBuilder: Button.create)\n    ..aOM<ChargingPlus>(8, _omitFieldNames ? '' : 'chargingPlus',\n        subBuilder: ChargingPlus.create)\n    ..aOM<ReqUserExtra>(9, _omitFieldNames ? '' : 'extra',\n        subBuilder: ReqUserExtra.create)\n    ..aI(10, _omitFieldNames ? '' : 'paid')\n    ..aOM<OldFan>(11, _omitFieldNames ? '' : 'oldFan',\n        subBuilder: OldFan.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqUser clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqUser copyWith(void Function(ReqUser) updates) =>\n      super.copyWith((message) => updates(message as ReqUser)) as ReqUser;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqUser create() => ReqUser._();\n  @$core.override\n  ReqUser createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqUser getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ReqUser>(create);\n  static ReqUser? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get favorite => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set favorite($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFavorite() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFavorite() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get like => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set like($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLike() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLike() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get coin => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set coin($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCoin() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCoin() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get favSeason => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set favSeason($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFavSeason() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFavSeason() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get follow => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set follow($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasFollow() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearFollow() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get dislike => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set dislike($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasDislike() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearDislike() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  Button get elecPlusBtn => $_getN(6);\n  @$pb.TagNumber(7)\n  set elecPlusBtn(Button value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasElecPlusBtn() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearElecPlusBtn() => $_clearField(7);\n  @$pb.TagNumber(7)\n  Button ensureElecPlusBtn() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  ChargingPlus get chargingPlus => $_getN(7);\n  @$pb.TagNumber(8)\n  set chargingPlus(ChargingPlus value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasChargingPlus() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearChargingPlus() => $_clearField(8);\n  @$pb.TagNumber(8)\n  ChargingPlus ensureChargingPlus() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  ReqUserExtra get extra => $_getN(8);\n  @$pb.TagNumber(9)\n  set extra(ReqUserExtra value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasExtra() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearExtra() => $_clearField(9);\n  @$pb.TagNumber(9)\n  ReqUserExtra ensureExtra() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  $core.int get paid => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set paid($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasPaid() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearPaid() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  OldFan get oldFan => $_getN(10);\n  @$pb.TagNumber(11)\n  set oldFan(OldFan value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasOldFan() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearOldFan() => $_clearField(11);\n  @$pb.TagNumber(11)\n  OldFan ensureOldFan() => $_ensure(10);\n}\n\nclass ReqUserExtra extends $pb.GeneratedMessage {\n  factory ReqUserExtra({\n    $core.bool? userFlagNew,\n  }) {\n    final result = create();\n    if (userFlagNew != null) result.userFlagNew = userFlagNew;\n    return result;\n  }\n\n  ReqUserExtra._();\n\n  factory ReqUserExtra.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqUserExtra.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqUserExtra',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'userFlagNew')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqUserExtra clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqUserExtra copyWith(void Function(ReqUserExtra) updates) =>\n      super.copyWith((message) => updates(message as ReqUserExtra))\n          as ReqUserExtra;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqUserExtra create() => ReqUserExtra._();\n  @$core.override\n  ReqUserExtra createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqUserExtra getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReqUserExtra>(create);\n  static ReqUserExtra? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get userFlagNew => $_getBF(0);\n  @$pb.TagNumber(1)\n  set userFlagNew($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUserFlagNew() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUserFlagNew() => $_clearField(1);\n}\n\nclass Rights extends $pb.GeneratedMessage {\n  factory Rights({\n    $core.bool? onlyVipDownload,\n    $core.bool? noReprint,\n    $core.bool? download,\n    $core.bool? isChargingPay,\n  }) {\n    final result = create();\n    if (onlyVipDownload != null) result.onlyVipDownload = onlyVipDownload;\n    if (noReprint != null) result.noReprint = noReprint;\n    if (download != null) result.download = download;\n    if (isChargingPay != null) result.isChargingPay = isChargingPay;\n    return result;\n  }\n\n  Rights._();\n\n  factory Rights.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Rights.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Rights',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'onlyVipDownload')\n    ..aOB(2, _omitFieldNames ? '' : 'noReprint')\n    ..aOB(3, _omitFieldNames ? '' : 'download')\n    ..aOB(4, _omitFieldNames ? '' : 'isChargingPay')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Rights clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Rights copyWith(void Function(Rights) updates) =>\n      super.copyWith((message) => updates(message as Rights)) as Rights;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Rights create() => Rights._();\n  @$core.override\n  Rights createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Rights getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Rights>(create);\n  static Rights? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get onlyVipDownload => $_getBF(0);\n  @$pb.TagNumber(1)\n  set onlyVipDownload($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOnlyVipDownload() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOnlyVipDownload() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get noReprint => $_getBF(1);\n  @$pb.TagNumber(2)\n  set noReprint($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasNoReprint() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearNoReprint() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get download => $_getBF(2);\n  @$pb.TagNumber(3)\n  set download($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDownload() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDownload() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get isChargingPay => $_getBF(3);\n  @$pb.TagNumber(4)\n  set isChargingPay($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIsChargingPay() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIsChargingPay() => $_clearField(4);\n}\n\nclass ShowTime extends $pb.GeneratedMessage {\n  factory ShowTime({\n    $core.int? startTime,\n    $core.int? endTime,\n    $core.double? posX,\n    $core.double? posY,\n  }) {\n    final result = create();\n    if (startTime != null) result.startTime = startTime;\n    if (endTime != null) result.endTime = endTime;\n    if (posX != null) result.posX = posX;\n    if (posY != null) result.posY = posY;\n    return result;\n  }\n\n  ShowTime._();\n\n  factory ShowTime.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ShowTime.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ShowTime',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'startTime')\n    ..aI(2, _omitFieldNames ? '' : 'endTime')\n    ..aD(3, _omitFieldNames ? '' : 'posX')\n    ..aD(4, _omitFieldNames ? '' : 'posY')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShowTime clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShowTime copyWith(void Function(ShowTime) updates) =>\n      super.copyWith((message) => updates(message as ShowTime)) as ShowTime;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ShowTime create() => ShowTime._();\n  @$core.override\n  ShowTime createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ShowTime getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ShowTime>(create);\n  static ShowTime? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get startTime => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set startTime($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStartTime() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStartTime() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get endTime => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set endTime($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasEndTime() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearEndTime() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.double get posX => $_getN(2);\n  @$pb.TagNumber(3)\n  set posX($core.double value) => $_setDouble(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPosX() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPosX() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.double get posY => $_getN(3);\n  @$pb.TagNumber(4)\n  set posY($core.double value) => $_setDouble(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPosY() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPosY() => $_clearField(4);\n}\n\nclass SimpleArc extends $pb.GeneratedMessage {\n  factory SimpleArc({\n    $core.int? copyright,\n  }) {\n    final result = create();\n    if (copyright != null) result.copyright = copyright;\n    return result;\n  }\n\n  SimpleArc._();\n\n  factory SimpleArc.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SimpleArc.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SimpleArc',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'copyright')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SimpleArc clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SimpleArc copyWith(void Function(SimpleArc) updates) =>\n      super.copyWith((message) => updates(message as SimpleArc)) as SimpleArc;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SimpleArc create() => SimpleArc._();\n  @$core.override\n  SimpleArc createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SimpleArc getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<SimpleArc>(create);\n  static SimpleArc? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get copyright => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set copyright($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCopyright() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCopyright() => $_clearField(1);\n}\n\nclass SimpleOwner extends $pb.GeneratedMessage {\n  factory SimpleOwner({\n    $1.AttentionRelationStatus? attentionRelation,\n  }) {\n    final result = create();\n    if (attentionRelation != null) result.attentionRelation = attentionRelation;\n    return result;\n  }\n\n  SimpleOwner._();\n\n  factory SimpleOwner.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SimpleOwner.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SimpleOwner',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aE<$1.AttentionRelationStatus>(\n        1, _omitFieldNames ? '' : 'attentionRelation',\n        enumValues: $1.AttentionRelationStatus.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SimpleOwner clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SimpleOwner copyWith(void Function(SimpleOwner) updates) =>\n      super.copyWith((message) => updates(message as SimpleOwner))\n          as SimpleOwner;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SimpleOwner create() => SimpleOwner._();\n  @$core.override\n  SimpleOwner createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SimpleOwner getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SimpleOwner>(create);\n  static SimpleOwner? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $1.AttentionRelationStatus get attentionRelation => $_getN(0);\n  @$pb.TagNumber(1)\n  set attentionRelation($1.AttentionRelationStatus value) =>\n      $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAttentionRelation() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAttentionRelation() => $_clearField(1);\n}\n\nclass SimpleReqUser extends $pb.GeneratedMessage {\n  factory SimpleReqUser({\n    $core.int? favorite,\n    $core.int? like,\n    $core.int? coin,\n  }) {\n    final result = create();\n    if (favorite != null) result.favorite = favorite;\n    if (like != null) result.like = like;\n    if (coin != null) result.coin = coin;\n    return result;\n  }\n\n  SimpleReqUser._();\n\n  factory SimpleReqUser.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SimpleReqUser.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SimpleReqUser',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'favorite')\n    ..aI(2, _omitFieldNames ? '' : 'like')\n    ..aI(3, _omitFieldNames ? '' : 'coin')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SimpleReqUser clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SimpleReqUser copyWith(void Function(SimpleReqUser) updates) =>\n      super.copyWith((message) => updates(message as SimpleReqUser))\n          as SimpleReqUser;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SimpleReqUser create() => SimpleReqUser._();\n  @$core.override\n  SimpleReqUser createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SimpleReqUser getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SimpleReqUser>(create);\n  static SimpleReqUser? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get favorite => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set favorite($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFavorite() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFavorite() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get like => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set like($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLike() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLike() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get coin => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set coin($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCoin() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCoin() => $_clearField(3);\n}\n\nclass SourceContentAV extends $pb.GeneratedMessage {\n  factory SourceContentAV({\n    $fixnum.Int64? aid,\n    $1.Stat? stat,\n  }) {\n    final result = create();\n    if (aid != null) result.aid = aid;\n    if (stat != null) result.stat = stat;\n    return result;\n  }\n\n  SourceContentAV._();\n\n  factory SourceContentAV.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SourceContentAV.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SourceContentAV',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'aid')\n    ..aOM<$1.Stat>(2, _omitFieldNames ? '' : 'stat', subBuilder: $1.Stat.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SourceContentAV clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SourceContentAV copyWith(void Function(SourceContentAV) updates) =>\n      super.copyWith((message) => updates(message as SourceContentAV))\n          as SourceContentAV;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SourceContentAV create() => SourceContentAV._();\n  @$core.override\n  SourceContentAV createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SourceContentAV getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SourceContentAV>(create);\n  static SourceContentAV? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get aid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set aid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $1.Stat get stat => $_getN(1);\n  @$pb.TagNumber(2)\n  set stat($1.Stat value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasStat() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearStat() => $_clearField(2);\n  @$pb.TagNumber(2)\n  $1.Stat ensureStat() => $_ensure(1);\n}\n\nenum SourceContentItem_Data { av, notSet }\n\nclass SourceContentItem extends $pb.GeneratedMessage {\n  factory SourceContentItem({\n    $2.Any? sourceContent,\n    SourceContentType? scType,\n    SourceContentAV? av,\n  }) {\n    final result = create();\n    if (sourceContent != null) result.sourceContent = sourceContent;\n    if (scType != null) result.scType = scType;\n    if (av != null) result.av = av;\n    return result;\n  }\n\n  SourceContentItem._();\n\n  factory SourceContentItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SourceContentItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, SourceContentItem_Data>\n      _SourceContentItem_DataByTag = {\n    3: SourceContentItem_Data.av,\n    0: SourceContentItem_Data.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SourceContentItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [3])\n    ..aOM<$2.Any>(1, _omitFieldNames ? '' : 'sourceContent',\n        subBuilder: $2.Any.create)\n    ..aE<SourceContentType>(2, _omitFieldNames ? '' : 'scType',\n        enumValues: SourceContentType.values)\n    ..aOM<SourceContentAV>(3, _omitFieldNames ? '' : 'av',\n        subBuilder: SourceContentAV.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SourceContentItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SourceContentItem copyWith(void Function(SourceContentItem) updates) =>\n      super.copyWith((message) => updates(message as SourceContentItem))\n          as SourceContentItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SourceContentItem create() => SourceContentItem._();\n  @$core.override\n  SourceContentItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SourceContentItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SourceContentItem>(create);\n  static SourceContentItem? _defaultInstance;\n\n  @$pb.TagNumber(3)\n  SourceContentItem_Data whichData() =>\n      _SourceContentItem_DataByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(3)\n  void clearData() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  $2.Any get sourceContent => $_getN(0);\n  @$pb.TagNumber(1)\n  set sourceContent($2.Any value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSourceContent() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSourceContent() => $_clearField(1);\n  @$pb.TagNumber(1)\n  $2.Any ensureSourceContent() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  SourceContentType get scType => $_getN(1);\n  @$pb.TagNumber(2)\n  set scType(SourceContentType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasScType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearScType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  SourceContentAV get av => $_getN(2);\n  @$pb.TagNumber(3)\n  set av(SourceContentAV value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAv() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAv() => $_clearField(3);\n  @$pb.TagNumber(3)\n  SourceContentAV ensureAv() => $_ensure(2);\n}\n\nenum StoryActualCardWrapper_ActualCard { videoCard, notSet }\n\nclass StoryActualCardWrapper extends $pb.GeneratedMessage {\n  factory StoryActualCardWrapper({\n    StoryVideoCard? videoCard,\n  }) {\n    final result = create();\n    if (videoCard != null) result.videoCard = videoCard;\n    return result;\n  }\n\n  StoryActualCardWrapper._();\n\n  factory StoryActualCardWrapper.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory StoryActualCardWrapper.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, StoryActualCardWrapper_ActualCard>\n      _StoryActualCardWrapper_ActualCardByTag = {\n    1: StoryActualCardWrapper_ActualCard.videoCard,\n    0: StoryActualCardWrapper_ActualCard.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'StoryActualCardWrapper',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [1])\n    ..aOM<StoryVideoCard>(1, _omitFieldNames ? '' : 'videoCard',\n        subBuilder: StoryVideoCard.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StoryActualCardWrapper clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StoryActualCardWrapper copyWith(\n          void Function(StoryActualCardWrapper) updates) =>\n      super.copyWith((message) => updates(message as StoryActualCardWrapper))\n          as StoryActualCardWrapper;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static StoryActualCardWrapper create() => StoryActualCardWrapper._();\n  @$core.override\n  StoryActualCardWrapper createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static StoryActualCardWrapper getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<StoryActualCardWrapper>(create);\n  static StoryActualCardWrapper? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  StoryActualCardWrapper_ActualCard whichActualCard() =>\n      _StoryActualCardWrapper_ActualCardByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(1)\n  void clearActualCard() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  StoryVideoCard get videoCard => $_getN(0);\n  @$pb.TagNumber(1)\n  set videoCard(StoryVideoCard value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasVideoCard() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearVideoCard() => $_clearField(1);\n  @$pb.TagNumber(1)\n  StoryVideoCard ensureVideoCard() => $_ensure(0);\n}\n\nclass StoryEntrance extends $pb.GeneratedMessage {\n  factory StoryEntrance({\n    $core.bool? arcPlayStory,\n    $core.String? storyIcon,\n    $core.bool? arcLandscapeStory,\n    $core.String? landscapeIcon,\n    $core.bool? playStory,\n  }) {\n    final result = create();\n    if (arcPlayStory != null) result.arcPlayStory = arcPlayStory;\n    if (storyIcon != null) result.storyIcon = storyIcon;\n    if (arcLandscapeStory != null) result.arcLandscapeStory = arcLandscapeStory;\n    if (landscapeIcon != null) result.landscapeIcon = landscapeIcon;\n    if (playStory != null) result.playStory = playStory;\n    return result;\n  }\n\n  StoryEntrance._();\n\n  factory StoryEntrance.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory StoryEntrance.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'StoryEntrance',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'arcPlayStory')\n    ..aOS(2, _omitFieldNames ? '' : 'storyIcon')\n    ..aOB(3, _omitFieldNames ? '' : 'arcLandscapeStory')\n    ..aOS(4, _omitFieldNames ? '' : 'landscapeIcon')\n    ..aOB(5, _omitFieldNames ? '' : 'playStory')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StoryEntrance clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StoryEntrance copyWith(void Function(StoryEntrance) updates) =>\n      super.copyWith((message) => updates(message as StoryEntrance))\n          as StoryEntrance;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static StoryEntrance create() => StoryEntrance._();\n  @$core.override\n  StoryEntrance createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static StoryEntrance getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<StoryEntrance>(create);\n  static StoryEntrance? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get arcPlayStory => $_getBF(0);\n  @$pb.TagNumber(1)\n  set arcPlayStory($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasArcPlayStory() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearArcPlayStory() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get storyIcon => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set storyIcon($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasStoryIcon() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearStoryIcon() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get arcLandscapeStory => $_getBF(2);\n  @$pb.TagNumber(3)\n  set arcLandscapeStory($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasArcLandscapeStory() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearArcLandscapeStory() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get landscapeIcon => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set landscapeIcon($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLandscapeIcon() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLandscapeIcon() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.bool get playStory => $_getBF(4);\n  @$pb.TagNumber(5)\n  set playStory($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPlayStory() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPlayStory() => $_clearField(5);\n}\n\nclass StoryReply extends $pb.GeneratedMessage {\n  factory StoryReply({\n    $core.Iterable<StoryActualCardWrapper>? storyCardWrappers,\n  }) {\n    final result = create();\n    if (storyCardWrappers != null)\n      result.storyCardWrappers.addAll(storyCardWrappers);\n    return result;\n  }\n\n  StoryReply._();\n\n  factory StoryReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory StoryReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'StoryReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..pPM<StoryActualCardWrapper>(1, _omitFieldNames ? '' : 'storyCardWrappers',\n        subBuilder: StoryActualCardWrapper.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StoryReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StoryReply copyWith(void Function(StoryReply) updates) =>\n      super.copyWith((message) => updates(message as StoryReply)) as StoryReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static StoryReply create() => StoryReply._();\n  @$core.override\n  StoryReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static StoryReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<StoryReply>(create);\n  static StoryReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<StoryActualCardWrapper> get storyCardWrappers => $_getList(0);\n}\n\nenum StoryReq_Param { storyReqParam, playListReqParam, notSet }\n\nclass StoryReq extends $pb.GeneratedMessage {\n  factory StoryReq({\n    $fixnum.Int64? aid,\n    $core.String? bvid,\n    $4.PlayerArgs? playerArgs,\n    StoryReqParam? storyReqParam,\n    PlayListReqParam? playListReqParam,\n    $fixnum.Int64? pull,\n    $core.String? from,\n    $core.String? spmid,\n    $core.String? fromSpmid,\n  }) {\n    final result = create();\n    if (aid != null) result.aid = aid;\n    if (bvid != null) result.bvid = bvid;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    if (storyReqParam != null) result.storyReqParam = storyReqParam;\n    if (playListReqParam != null) result.playListReqParam = playListReqParam;\n    if (pull != null) result.pull = pull;\n    if (from != null) result.from = from;\n    if (spmid != null) result.spmid = spmid;\n    if (fromSpmid != null) result.fromSpmid = fromSpmid;\n    return result;\n  }\n\n  StoryReq._();\n\n  factory StoryReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory StoryReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, StoryReq_Param> _StoryReq_ParamByTag = {\n    4: StoryReq_Param.storyReqParam,\n    5: StoryReq_Param.playListReqParam,\n    0: StoryReq_Param.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'StoryReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [4, 5])\n    ..aInt64(1, _omitFieldNames ? '' : 'aid')\n    ..aOS(2, _omitFieldNames ? '' : 'bvid')\n    ..aOM<$4.PlayerArgs>(3, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $4.PlayerArgs.create)\n    ..aOM<StoryReqParam>(4, _omitFieldNames ? '' : 'storyReqParam',\n        subBuilder: StoryReqParam.create)\n    ..aOM<PlayListReqParam>(5, _omitFieldNames ? '' : 'playListReqParam',\n        subBuilder: PlayListReqParam.create)\n    ..aInt64(6, _omitFieldNames ? '' : 'pull')\n    ..aOS(7, _omitFieldNames ? '' : 'from')\n    ..aOS(8, _omitFieldNames ? '' : 'spmid')\n    ..aOS(9, _omitFieldNames ? '' : 'fromSpmid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StoryReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StoryReq copyWith(void Function(StoryReq) updates) =>\n      super.copyWith((message) => updates(message as StoryReq)) as StoryReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static StoryReq create() => StoryReq._();\n  @$core.override\n  StoryReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static StoryReq getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<StoryReq>(create);\n  static StoryReq? _defaultInstance;\n\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  StoryReq_Param whichParam() => _StoryReq_ParamByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  void clearParam() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get aid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set aid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get bvid => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set bvid($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBvid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBvid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $4.PlayerArgs get playerArgs => $_getN(2);\n  @$pb.TagNumber(3)\n  set playerArgs($4.PlayerArgs value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPlayerArgs() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPlayerArgs() => $_clearField(3);\n  @$pb.TagNumber(3)\n  $4.PlayerArgs ensurePlayerArgs() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  StoryReqParam get storyReqParam => $_getN(3);\n  @$pb.TagNumber(4)\n  set storyReqParam(StoryReqParam value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasStoryReqParam() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearStoryReqParam() => $_clearField(4);\n  @$pb.TagNumber(4)\n  StoryReqParam ensureStoryReqParam() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  PlayListReqParam get playListReqParam => $_getN(4);\n  @$pb.TagNumber(5)\n  set playListReqParam(PlayListReqParam value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPlayListReqParam() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPlayListReqParam() => $_clearField(5);\n  @$pb.TagNumber(5)\n  PlayListReqParam ensurePlayListReqParam() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get pull => $_getI64(5);\n  @$pb.TagNumber(6)\n  set pull($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasPull() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearPull() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get from => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set from($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasFrom() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearFrom() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get spmid => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set spmid($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasSpmid() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearSpmid() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get fromSpmid => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set fromSpmid($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasFromSpmid() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearFromSpmid() => $_clearField(9);\n}\n\nclass StoryReqParam extends $pb.GeneratedMessage {\n  factory StoryReqParam({\n    $core.String? trackId,\n    $fixnum.Int64? displayId,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? extraContent,\n    $core.bool? refresh,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? businessInfo,\n  }) {\n    final result = create();\n    if (trackId != null) result.trackId = trackId;\n    if (displayId != null) result.displayId = displayId;\n    if (extraContent != null) result.extraContent.addEntries(extraContent);\n    if (refresh != null) result.refresh = refresh;\n    if (businessInfo != null) result.businessInfo.addEntries(businessInfo);\n    return result;\n  }\n\n  StoryReqParam._();\n\n  factory StoryReqParam.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory StoryReqParam.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'StoryReqParam',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'trackId')\n    ..aInt64(2, _omitFieldNames ? '' : 'displayId')\n    ..m<$core.String, $core.String>(3, _omitFieldNames ? '' : 'extraContent',\n        entryClassName: 'StoryReqParam.ExtraContentEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.viewunite.v1'))\n    ..aOB(4, _omitFieldNames ? '' : 'refresh')\n    ..m<$core.String, $core.String>(5, _omitFieldNames ? '' : 'businessInfo',\n        entryClassName: 'StoryReqParam.BusinessInfoEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.viewunite.v1'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StoryReqParam clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StoryReqParam copyWith(void Function(StoryReqParam) updates) =>\n      super.copyWith((message) => updates(message as StoryReqParam))\n          as StoryReqParam;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static StoryReqParam create() => StoryReqParam._();\n  @$core.override\n  StoryReqParam createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static StoryReqParam getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<StoryReqParam>(create);\n  static StoryReqParam? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get trackId => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set trackId($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTrackId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTrackId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get displayId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set displayId($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDisplayId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDisplayId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbMap<$core.String, $core.String> get extraContent => $_getMap(2);\n\n  @$pb.TagNumber(4)\n  $core.bool get refresh => $_getBF(3);\n  @$pb.TagNumber(4)\n  set refresh($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasRefresh() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearRefresh() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $pb.PbMap<$core.String, $core.String> get businessInfo => $_getMap(4);\n}\n\nclass StoryVideoCard extends $pb.GeneratedMessage {\n  factory StoryVideoCard({\n    VideoPlayData? playData,\n    ViewReply? viewContent,\n    $core.String? recommendSessionId,\n    $core.String? cover,\n    $core.String? trackId,\n    $core.String? goto,\n  }) {\n    final result = create();\n    if (playData != null) result.playData = playData;\n    if (viewContent != null) result.viewContent = viewContent;\n    if (recommendSessionId != null)\n      result.recommendSessionId = recommendSessionId;\n    if (cover != null) result.cover = cover;\n    if (trackId != null) result.trackId = trackId;\n    if (goto != null) result.goto = goto;\n    return result;\n  }\n\n  StoryVideoCard._();\n\n  factory StoryVideoCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory StoryVideoCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'StoryVideoCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOM<VideoPlayData>(1, _omitFieldNames ? '' : 'playData',\n        subBuilder: VideoPlayData.create)\n    ..aOM<ViewReply>(2, _omitFieldNames ? '' : 'viewContent',\n        subBuilder: ViewReply.create)\n    ..aOS(3, _omitFieldNames ? '' : 'recommendSessionId')\n    ..aOS(4, _omitFieldNames ? '' : 'cover')\n    ..aOS(5, _omitFieldNames ? '' : 'trackId')\n    ..aOS(6, _omitFieldNames ? '' : 'goto')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StoryVideoCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StoryVideoCard copyWith(void Function(StoryVideoCard) updates) =>\n      super.copyWith((message) => updates(message as StoryVideoCard))\n          as StoryVideoCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static StoryVideoCard create() => StoryVideoCard._();\n  @$core.override\n  StoryVideoCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static StoryVideoCard getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<StoryVideoCard>(create);\n  static StoryVideoCard? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  VideoPlayData get playData => $_getN(0);\n  @$pb.TagNumber(1)\n  set playData(VideoPlayData value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPlayData() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPlayData() => $_clearField(1);\n  @$pb.TagNumber(1)\n  VideoPlayData ensurePlayData() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  ViewReply get viewContent => $_getN(1);\n  @$pb.TagNumber(2)\n  set viewContent(ViewReply value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasViewContent() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearViewContent() => $_clearField(2);\n  @$pb.TagNumber(2)\n  ViewReply ensureViewContent() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.String get recommendSessionId => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set recommendSessionId($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRecommendSessionId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRecommendSessionId() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get cover => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set cover($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCover() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCover() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get trackId => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set trackId($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasTrackId() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearTrackId() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get goto => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set goto($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasGoto() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearGoto() => $_clearField(6);\n}\n\nclass Tab extends $pb.GeneratedMessage {\n  factory Tab({\n    $core.Iterable<TabModule>? tabModule,\n    $core.String? tabBg,\n    TabControl? danmakuEntrance,\n    $core.String? tabBgPad,\n  }) {\n    final result = create();\n    if (tabModule != null) result.tabModule.addAll(tabModule);\n    if (tabBg != null) result.tabBg = tabBg;\n    if (danmakuEntrance != null) result.danmakuEntrance = danmakuEntrance;\n    if (tabBgPad != null) result.tabBgPad = tabBgPad;\n    return result;\n  }\n\n  Tab._();\n\n  factory Tab.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Tab.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Tab',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..pPM<TabModule>(1, _omitFieldNames ? '' : 'tabModule',\n        subBuilder: TabModule.create)\n    ..aOS(2, _omitFieldNames ? '' : 'tabBg')\n    ..aOM<TabControl>(3, _omitFieldNames ? '' : 'danmakuEntrance',\n        subBuilder: TabControl.create)\n    ..aOS(4, _omitFieldNames ? '' : 'tabBgPad')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Tab clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Tab copyWith(void Function(Tab) updates) =>\n      super.copyWith((message) => updates(message as Tab)) as Tab;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Tab create() => Tab._();\n  @$core.override\n  Tab createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Tab getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Tab>(create);\n  static Tab? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<TabModule> get tabModule => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.String get tabBg => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set tabBg($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTabBg() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTabBg() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  TabControl get danmakuEntrance => $_getN(2);\n  @$pb.TagNumber(3)\n  set danmakuEntrance(TabControl value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDanmakuEntrance() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDanmakuEntrance() => $_clearField(3);\n  @$pb.TagNumber(3)\n  TabControl ensureDanmakuEntrance() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.String get tabBgPad => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set tabBgPad($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTabBgPad() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTabBgPad() => $_clearField(4);\n}\n\nclass TabControl extends $pb.GeneratedMessage {\n  factory TabControl({\n    $core.bool? limit,\n    $core.bool? disable,\n    $core.String? disableClickTip,\n  }) {\n    final result = create();\n    if (limit != null) result.limit = limit;\n    if (disable != null) result.disable = disable;\n    if (disableClickTip != null) result.disableClickTip = disableClickTip;\n    return result;\n  }\n\n  TabControl._();\n\n  factory TabControl.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TabControl.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TabControl',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'limit')\n    ..aOB(2, _omitFieldNames ? '' : 'disable')\n    ..aOS(3, _omitFieldNames ? '' : 'disableClickTip')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TabControl clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TabControl copyWith(void Function(TabControl) updates) =>\n      super.copyWith((message) => updates(message as TabControl)) as TabControl;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TabControl create() => TabControl._();\n  @$core.override\n  TabControl createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TabControl getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<TabControl>(create);\n  static TabControl? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get limit => $_getBF(0);\n  @$pb.TagNumber(1)\n  set limit($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLimit() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLimit() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get disable => $_getBF(1);\n  @$pb.TagNumber(2)\n  set disable($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDisable() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDisable() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get disableClickTip => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set disableClickTip($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDisableClickTip() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDisableClickTip() => $_clearField(3);\n}\n\nenum TabModule_Tab { introduction, reply, activityTab, catalog, notSet }\n\nclass TabModule extends $pb.GeneratedMessage {\n  factory TabModule({\n    TabType? tabType,\n    IntroductionTab? introduction,\n    ReplyTab? reply,\n    $1.ActivityTab? activityTab,\n    $1.CatalogTab? catalog,\n  }) {\n    final result = create();\n    if (tabType != null) result.tabType = tabType;\n    if (introduction != null) result.introduction = introduction;\n    if (reply != null) result.reply = reply;\n    if (activityTab != null) result.activityTab = activityTab;\n    if (catalog != null) result.catalog = catalog;\n    return result;\n  }\n\n  TabModule._();\n\n  factory TabModule.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TabModule.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, TabModule_Tab> _TabModule_TabByTag = {\n    2: TabModule_Tab.introduction,\n    3: TabModule_Tab.reply,\n    4: TabModule_Tab.activityTab,\n    5: TabModule_Tab.catalog,\n    0: TabModule_Tab.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TabModule',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [2, 3, 4, 5])\n    ..aE<TabType>(1, _omitFieldNames ? '' : 'tabType',\n        enumValues: TabType.values)\n    ..aOM<IntroductionTab>(2, _omitFieldNames ? '' : 'introduction',\n        subBuilder: IntroductionTab.create)\n    ..aOM<ReplyTab>(3, _omitFieldNames ? '' : 'reply',\n        subBuilder: ReplyTab.create)\n    ..aOM<$1.ActivityTab>(4, _omitFieldNames ? '' : 'activityTab',\n        subBuilder: $1.ActivityTab.create)\n    ..aOM<$1.CatalogTab>(5, _omitFieldNames ? '' : 'catalog',\n        subBuilder: $1.CatalogTab.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TabModule clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TabModule copyWith(void Function(TabModule) updates) =>\n      super.copyWith((message) => updates(message as TabModule)) as TabModule;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TabModule create() => TabModule._();\n  @$core.override\n  TabModule createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TabModule getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TabModule>(create);\n  static TabModule? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  TabModule_Tab whichTab() => _TabModule_TabByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  void clearTab() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  TabType get tabType => $_getN(0);\n  @$pb.TagNumber(1)\n  set tabType(TabType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTabType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTabType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  IntroductionTab get introduction => $_getN(1);\n  @$pb.TagNumber(2)\n  set introduction(IntroductionTab value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIntroduction() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIntroduction() => $_clearField(2);\n  @$pb.TagNumber(2)\n  IntroductionTab ensureIntroduction() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  ReplyTab get reply => $_getN(2);\n  @$pb.TagNumber(3)\n  set reply(ReplyTab value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasReply() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearReply() => $_clearField(3);\n  @$pb.TagNumber(3)\n  ReplyTab ensureReply() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $1.ActivityTab get activityTab => $_getN(3);\n  @$pb.TagNumber(4)\n  set activityTab($1.ActivityTab value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasActivityTab() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearActivityTab() => $_clearField(4);\n  @$pb.TagNumber(4)\n  $1.ActivityTab ensureActivityTab() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $1.CatalogTab get catalog => $_getN(4);\n  @$pb.TagNumber(5)\n  set catalog($1.CatalogTab value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCatalog() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCatalog() => $_clearField(5);\n  @$pb.TagNumber(5)\n  $1.CatalogTab ensureCatalog() => $_ensure(4);\n}\n\nclass UpperInfos extends $pb.GeneratedMessage {\n  factory UpperInfos({\n    $fixnum.Int64? fansCount,\n    $fixnum.Int64? arcCountLastHalfYear,\n    $fixnum.Int64? firstUpDates,\n    $fixnum.Int64? totalPlayCount,\n  }) {\n    final result = create();\n    if (fansCount != null) result.fansCount = fansCount;\n    if (arcCountLastHalfYear != null)\n      result.arcCountLastHalfYear = arcCountLastHalfYear;\n    if (firstUpDates != null) result.firstUpDates = firstUpDates;\n    if (totalPlayCount != null) result.totalPlayCount = totalPlayCount;\n    return result;\n  }\n\n  UpperInfos._();\n\n  factory UpperInfos.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UpperInfos.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UpperInfos',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'fansCount')\n    ..aInt64(2, _omitFieldNames ? '' : 'arcCountLastHalfYear')\n    ..aInt64(3, _omitFieldNames ? '' : 'firstUpDates')\n    ..aInt64(4, _omitFieldNames ? '' : 'totalPlayCount')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpperInfos clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpperInfos copyWith(void Function(UpperInfos) updates) =>\n      super.copyWith((message) => updates(message as UpperInfos)) as UpperInfos;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UpperInfos create() => UpperInfos._();\n  @$core.override\n  UpperInfos createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UpperInfos getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UpperInfos>(create);\n  static UpperInfos? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get fansCount => $_getI64(0);\n  @$pb.TagNumber(1)\n  set fansCount($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFansCount() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFansCount() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get arcCountLastHalfYear => $_getI64(1);\n  @$pb.TagNumber(2)\n  set arcCountLastHalfYear($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasArcCountLastHalfYear() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearArcCountLastHalfYear() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get firstUpDates => $_getI64(2);\n  @$pb.TagNumber(3)\n  set firstUpDates($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFirstUpDates() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFirstUpDates() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get totalPlayCount => $_getI64(3);\n  @$pb.TagNumber(4)\n  set totalPlayCount($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTotalPlayCount() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTotalPlayCount() => $_clearField(4);\n}\n\nclass VideoGuide extends $pb.GeneratedMessage {\n  factory VideoGuide({\n    $core.Iterable<Material>? material,\n    VideoViewPoint? videoPoint,\n    ContractCard? contractCard,\n    Material? rightMaterial,\n  }) {\n    final result = create();\n    if (material != null) result.material.addAll(material);\n    if (videoPoint != null) result.videoPoint = videoPoint;\n    if (contractCard != null) result.contractCard = contractCard;\n    if (rightMaterial != null) result.rightMaterial = rightMaterial;\n    return result;\n  }\n\n  VideoGuide._();\n\n  factory VideoGuide.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory VideoGuide.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'VideoGuide',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..pPM<Material>(1, _omitFieldNames ? '' : 'material',\n        subBuilder: Material.create)\n    ..aOM<VideoViewPoint>(2, _omitFieldNames ? '' : 'videoPoint',\n        subBuilder: VideoViewPoint.create)\n    ..aOM<ContractCard>(3, _omitFieldNames ? '' : 'contractCard',\n        subBuilder: ContractCard.create)\n    ..aOM<Material>(4, _omitFieldNames ? '' : 'rightMaterial',\n        subBuilder: Material.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VideoGuide clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VideoGuide copyWith(void Function(VideoGuide) updates) =>\n      super.copyWith((message) => updates(message as VideoGuide)) as VideoGuide;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static VideoGuide create() => VideoGuide._();\n  @$core.override\n  VideoGuide createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static VideoGuide getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<VideoGuide>(create);\n  static VideoGuide? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<Material> get material => $_getList(0);\n\n  @$pb.TagNumber(2)\n  VideoViewPoint get videoPoint => $_getN(1);\n  @$pb.TagNumber(2)\n  set videoPoint(VideoViewPoint value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasVideoPoint() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearVideoPoint() => $_clearField(2);\n  @$pb.TagNumber(2)\n  VideoViewPoint ensureVideoPoint() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  ContractCard get contractCard => $_getN(2);\n  @$pb.TagNumber(3)\n  set contractCard(ContractCard value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasContractCard() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearContractCard() => $_clearField(3);\n  @$pb.TagNumber(3)\n  ContractCard ensureContractCard() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  Material get rightMaterial => $_getN(3);\n  @$pb.TagNumber(4)\n  set rightMaterial(Material value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasRightMaterial() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearRightMaterial() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Material ensureRightMaterial() => $_ensure(3);\n}\n\nclass VideoPlayData extends $pb.GeneratedMessage {\n  factory VideoPlayData({\n    $core.String? url,\n    $5.Dimension? dimension,\n    $fixnum.Int64? aid,\n    $fixnum.Int64? epId,\n    $fixnum.Int64? cid,\n  }) {\n    final result = create();\n    if (url != null) result.url = url;\n    if (dimension != null) result.dimension = dimension;\n    if (aid != null) result.aid = aid;\n    if (epId != null) result.epId = epId;\n    if (cid != null) result.cid = cid;\n    return result;\n  }\n\n  VideoPlayData._();\n\n  factory VideoPlayData.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory VideoPlayData.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'VideoPlayData',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'url')\n    ..aOM<$5.Dimension>(2, _omitFieldNames ? '' : 'dimension',\n        subBuilder: $5.Dimension.create)\n    ..aInt64(3, _omitFieldNames ? '' : 'aid')\n    ..aInt64(4, _omitFieldNames ? '' : 'epId')\n    ..aInt64(5, _omitFieldNames ? '' : 'cid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VideoPlayData clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VideoPlayData copyWith(void Function(VideoPlayData) updates) =>\n      super.copyWith((message) => updates(message as VideoPlayData))\n          as VideoPlayData;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static VideoPlayData create() => VideoPlayData._();\n  @$core.override\n  VideoPlayData createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static VideoPlayData getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<VideoPlayData>(create);\n  static VideoPlayData? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get url => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set url($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUrl() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $5.Dimension get dimension => $_getN(1);\n  @$pb.TagNumber(2)\n  set dimension($5.Dimension value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDimension() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDimension() => $_clearField(2);\n  @$pb.TagNumber(2)\n  $5.Dimension ensureDimension() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get aid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set aid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAid() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get epId => $_getI64(3);\n  @$pb.TagNumber(4)\n  set epId($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasEpId() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearEpId() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get cid => $_getI64(4);\n  @$pb.TagNumber(5)\n  set cid($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCid() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCid() => $_clearField(5);\n}\n\nclass VideoPoint extends $pb.GeneratedMessage {\n  factory VideoPoint({\n    $core.int? type,\n    $fixnum.Int64? from,\n    $fixnum.Int64? to,\n    $core.String? content,\n    $core.String? cover,\n    $core.String? logoUrl,\n    $core.String? teamType,\n    $core.String? teamName,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (from != null) result.from = from;\n    if (to != null) result.to = to;\n    if (content != null) result.content = content;\n    if (cover != null) result.cover = cover;\n    if (logoUrl != null) result.logoUrl = logoUrl;\n    if (teamType != null) result.teamType = teamType;\n    if (teamName != null) result.teamName = teamName;\n    return result;\n  }\n\n  VideoPoint._();\n\n  factory VideoPoint.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory VideoPoint.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'VideoPoint',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'type')\n    ..aInt64(2, _omitFieldNames ? '' : 'from')\n    ..aInt64(3, _omitFieldNames ? '' : 'to')\n    ..aOS(4, _omitFieldNames ? '' : 'content')\n    ..aOS(5, _omitFieldNames ? '' : 'cover')\n    ..aOS(6, _omitFieldNames ? '' : 'logoUrl')\n    ..aOS(7, _omitFieldNames ? '' : 'teamType')\n    ..aOS(8, _omitFieldNames ? '' : 'teamName')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VideoPoint clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VideoPoint copyWith(void Function(VideoPoint) updates) =>\n      super.copyWith((message) => updates(message as VideoPoint)) as VideoPoint;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static VideoPoint create() => VideoPoint._();\n  @$core.override\n  VideoPoint createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static VideoPoint getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<VideoPoint>(create);\n  static VideoPoint? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get type => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set type($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get from => $_getI64(1);\n  @$pb.TagNumber(2)\n  set from($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFrom() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFrom() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get to => $_getI64(2);\n  @$pb.TagNumber(3)\n  set to($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTo() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTo() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get content => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set content($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasContent() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearContent() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get cover => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set cover($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCover() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCover() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get logoUrl => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set logoUrl($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasLogoUrl() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearLogoUrl() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get teamType => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set teamType($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasTeamType() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearTeamType() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get teamName => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set teamName($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasTeamName() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearTeamName() => $_clearField(8);\n}\n\nclass VideoShot extends $pb.GeneratedMessage {\n  factory VideoShot({\n    $core.String? pvData,\n    $core.int? imgXLen,\n    $core.int? imgYLen,\n    $core.int? imgXSize,\n    $core.int? imgYSize,\n    $core.Iterable<$core.String>? image,\n  }) {\n    final result = create();\n    if (pvData != null) result.pvData = pvData;\n    if (imgXLen != null) result.imgXLen = imgXLen;\n    if (imgYLen != null) result.imgYLen = imgYLen;\n    if (imgXSize != null) result.imgXSize = imgXSize;\n    if (imgYSize != null) result.imgYSize = imgYSize;\n    if (image != null) result.image.addAll(image);\n    return result;\n  }\n\n  VideoShot._();\n\n  factory VideoShot.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory VideoShot.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'VideoShot',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'pvData')\n    ..aI(2, _omitFieldNames ? '' : 'imgXLen')\n    ..aI(3, _omitFieldNames ? '' : 'imgYLen')\n    ..aI(4, _omitFieldNames ? '' : 'imgXSize')\n    ..aI(5, _omitFieldNames ? '' : 'imgYSize')\n    ..pPS(6, _omitFieldNames ? '' : 'image')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VideoShot clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VideoShot copyWith(void Function(VideoShot) updates) =>\n      super.copyWith((message) => updates(message as VideoShot)) as VideoShot;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static VideoShot create() => VideoShot._();\n  @$core.override\n  VideoShot createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static VideoShot getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<VideoShot>(create);\n  static VideoShot? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get pvData => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set pvData($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPvData() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPvData() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get imgXLen => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set imgXLen($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasImgXLen() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearImgXLen() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get imgYLen => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set imgYLen($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasImgYLen() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearImgYLen() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get imgXSize => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set imgXSize($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasImgXSize() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearImgXSize() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get imgYSize => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set imgYSize($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasImgYSize() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearImgYSize() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $pb.PbList<$core.String> get image => $_getList(5);\n}\n\nclass VideoViewPoint extends $pb.GeneratedMessage {\n  factory VideoViewPoint({\n    $core.Iterable<VideoPoint>? points,\n    PointMaterial? pointMaterial,\n    $core.bool? pointPermanent,\n  }) {\n    final result = create();\n    if (points != null) result.points.addAll(points);\n    if (pointMaterial != null) result.pointMaterial = pointMaterial;\n    if (pointPermanent != null) result.pointPermanent = pointPermanent;\n    return result;\n  }\n\n  VideoViewPoint._();\n\n  factory VideoViewPoint.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory VideoViewPoint.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'VideoViewPoint',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..pPM<VideoPoint>(1, _omitFieldNames ? '' : 'points',\n        subBuilder: VideoPoint.create)\n    ..aOM<PointMaterial>(2, _omitFieldNames ? '' : 'pointMaterial',\n        subBuilder: PointMaterial.create)\n    ..aOB(3, _omitFieldNames ? '' : 'pointPermanent')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VideoViewPoint clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VideoViewPoint copyWith(void Function(VideoViewPoint) updates) =>\n      super.copyWith((message) => updates(message as VideoViewPoint))\n          as VideoViewPoint;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static VideoViewPoint create() => VideoViewPoint._();\n  @$core.override\n  VideoViewPoint createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static VideoViewPoint getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<VideoViewPoint>(create);\n  static VideoViewPoint? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<VideoPoint> get points => $_getList(0);\n\n  @$pb.TagNumber(2)\n  PointMaterial get pointMaterial => $_getN(1);\n  @$pb.TagNumber(2)\n  set pointMaterial(PointMaterial value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPointMaterial() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPointMaterial() => $_clearField(2);\n  @$pb.TagNumber(2)\n  PointMaterial ensurePointMaterial() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.bool get pointPermanent => $_getBF(2);\n  @$pb.TagNumber(3)\n  set pointPermanent($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPointPermanent() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPointPermanent() => $_clearField(3);\n}\n\nclass ViewBase extends $pb.GeneratedMessage {\n  factory ViewBase({\n    $5.BizType? bizType,\n    PageCategory? pageType,\n    PageControl? control,\n    ActivityResource? activityResource,\n    Config? config,\n  }) {\n    final result = create();\n    if (bizType != null) result.bizType = bizType;\n    if (pageType != null) result.pageType = pageType;\n    if (control != null) result.control = control;\n    if (activityResource != null) result.activityResource = activityResource;\n    if (config != null) result.config = config;\n    return result;\n  }\n\n  ViewBase._();\n\n  factory ViewBase.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ViewBase.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ViewBase',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aE<$5.BizType>(1, _omitFieldNames ? '' : 'bizType',\n        enumValues: $5.BizType.values)\n    ..aE<PageCategory>(2, _omitFieldNames ? '' : 'pageType',\n        enumValues: PageCategory.values)\n    ..aOM<PageControl>(3, _omitFieldNames ? '' : 'control',\n        subBuilder: PageControl.create)\n    ..aOM<ActivityResource>(4, _omitFieldNames ? '' : 'activityResource',\n        subBuilder: ActivityResource.create)\n    ..aOM<Config>(5, _omitFieldNames ? '' : 'config', subBuilder: Config.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ViewBase clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ViewBase copyWith(void Function(ViewBase) updates) =>\n      super.copyWith((message) => updates(message as ViewBase)) as ViewBase;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ViewBase create() => ViewBase._();\n  @$core.override\n  ViewBase createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ViewBase getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ViewBase>(create);\n  static ViewBase? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $5.BizType get bizType => $_getN(0);\n  @$pb.TagNumber(1)\n  set bizType($5.BizType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBizType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBizType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  PageCategory get pageType => $_getN(1);\n  @$pb.TagNumber(2)\n  set pageType(PageCategory value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPageType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPageType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  PageControl get control => $_getN(2);\n  @$pb.TagNumber(3)\n  set control(PageControl value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasControl() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearControl() => $_clearField(3);\n  @$pb.TagNumber(3)\n  PageControl ensureControl() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  ActivityResource get activityResource => $_getN(3);\n  @$pb.TagNumber(4)\n  set activityResource(ActivityResource value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasActivityResource() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearActivityResource() => $_clearField(4);\n  @$pb.TagNumber(4)\n  ActivityResource ensureActivityResource() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  Config get config => $_getN(4);\n  @$pb.TagNumber(5)\n  set config(Config value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasConfig() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearConfig() => $_clearField(5);\n  @$pb.TagNumber(5)\n  Config ensureConfig() => $_ensure(4);\n}\n\nclass ViewProgressReply extends $pb.GeneratedMessage {\n  factory ViewProgressReply({\n    VideoGuide? videoGuide,\n    Chronos? chronos,\n    VideoShot? arcShot,\n    DmResource? dm,\n    FragmentRes? fragmentRes,\n  }) {\n    final result = create();\n    if (videoGuide != null) result.videoGuide = videoGuide;\n    if (chronos != null) result.chronos = chronos;\n    if (arcShot != null) result.arcShot = arcShot;\n    if (dm != null) result.dm = dm;\n    if (fragmentRes != null) result.fragmentRes = fragmentRes;\n    return result;\n  }\n\n  ViewProgressReply._();\n\n  factory ViewProgressReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ViewProgressReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ViewProgressReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOM<VideoGuide>(1, _omitFieldNames ? '' : 'videoGuide',\n        subBuilder: VideoGuide.create)\n    ..aOM<Chronos>(2, _omitFieldNames ? '' : 'chronos',\n        subBuilder: Chronos.create)\n    ..aOM<VideoShot>(3, _omitFieldNames ? '' : 'arcShot',\n        subBuilder: VideoShot.create)\n    ..aOM<DmResource>(4, _omitFieldNames ? '' : 'dm',\n        subBuilder: DmResource.create)\n    ..aOM<FragmentRes>(5, _omitFieldNames ? '' : 'fragmentRes',\n        subBuilder: FragmentRes.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ViewProgressReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ViewProgressReply copyWith(void Function(ViewProgressReply) updates) =>\n      super.copyWith((message) => updates(message as ViewProgressReply))\n          as ViewProgressReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ViewProgressReply create() => ViewProgressReply._();\n  @$core.override\n  ViewProgressReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ViewProgressReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ViewProgressReply>(create);\n  static ViewProgressReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  VideoGuide get videoGuide => $_getN(0);\n  @$pb.TagNumber(1)\n  set videoGuide(VideoGuide value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasVideoGuide() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearVideoGuide() => $_clearField(1);\n  @$pb.TagNumber(1)\n  VideoGuide ensureVideoGuide() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  Chronos get chronos => $_getN(1);\n  @$pb.TagNumber(2)\n  set chronos(Chronos value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasChronos() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearChronos() => $_clearField(2);\n  @$pb.TagNumber(2)\n  Chronos ensureChronos() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  VideoShot get arcShot => $_getN(2);\n  @$pb.TagNumber(3)\n  set arcShot(VideoShot value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasArcShot() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearArcShot() => $_clearField(3);\n  @$pb.TagNumber(3)\n  VideoShot ensureArcShot() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  DmResource get dm => $_getN(3);\n  @$pb.TagNumber(4)\n  set dm(DmResource value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDm() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDm() => $_clearField(4);\n  @$pb.TagNumber(4)\n  DmResource ensureDm() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  FragmentRes get fragmentRes => $_getN(4);\n  @$pb.TagNumber(5)\n  set fragmentRes(FragmentRes value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasFragmentRes() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearFragmentRes() => $_clearField(5);\n  @$pb.TagNumber(5)\n  FragmentRes ensureFragmentRes() => $_ensure(4);\n}\n\nclass ViewProgressReq extends $pb.GeneratedMessage {\n  factory ViewProgressReq({\n    $fixnum.Int64? aid,\n    $fixnum.Int64? cid,\n    $fixnum.Int64? upMid,\n    ChronosParam? chronosParam,\n    UnionType? type,\n    FragmentParam? fragmentParam,\n    $core.String? fromScene,\n    $5.PlayCtrl? playCtrl,\n  }) {\n    final result = create();\n    if (aid != null) result.aid = aid;\n    if (cid != null) result.cid = cid;\n    if (upMid != null) result.upMid = upMid;\n    if (chronosParam != null) result.chronosParam = chronosParam;\n    if (type != null) result.type = type;\n    if (fragmentParam != null) result.fragmentParam = fragmentParam;\n    if (fromScene != null) result.fromScene = fromScene;\n    if (playCtrl != null) result.playCtrl = playCtrl;\n    return result;\n  }\n\n  ViewProgressReq._();\n\n  factory ViewProgressReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ViewProgressReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ViewProgressReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'aid')\n    ..aInt64(2, _omitFieldNames ? '' : 'cid')\n    ..aInt64(3, _omitFieldNames ? '' : 'upMid')\n    ..aOM<ChronosParam>(4, _omitFieldNames ? '' : 'chronosParam',\n        subBuilder: ChronosParam.create)\n    ..aE<UnionType>(5, _omitFieldNames ? '' : 'type',\n        enumValues: UnionType.values)\n    ..aOM<FragmentParam>(6, _omitFieldNames ? '' : 'fragmentParam',\n        subBuilder: FragmentParam.create)\n    ..aOS(7, _omitFieldNames ? '' : 'fromScene')\n    ..aE<$5.PlayCtrl>(8, _omitFieldNames ? '' : 'playCtrl',\n        enumValues: $5.PlayCtrl.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ViewProgressReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ViewProgressReq copyWith(void Function(ViewProgressReq) updates) =>\n      super.copyWith((message) => updates(message as ViewProgressReq))\n          as ViewProgressReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ViewProgressReq create() => ViewProgressReq._();\n  @$core.override\n  ViewProgressReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ViewProgressReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ViewProgressReq>(create);\n  static ViewProgressReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get aid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set aid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get cid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set cid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get upMid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set upMid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUpMid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUpMid() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  ChronosParam get chronosParam => $_getN(3);\n  @$pb.TagNumber(4)\n  set chronosParam(ChronosParam value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasChronosParam() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearChronosParam() => $_clearField(4);\n  @$pb.TagNumber(4)\n  ChronosParam ensureChronosParam() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  UnionType get type => $_getN(4);\n  @$pb.TagNumber(5)\n  set type(UnionType value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearType() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  FragmentParam get fragmentParam => $_getN(5);\n  @$pb.TagNumber(6)\n  set fragmentParam(FragmentParam value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasFragmentParam() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearFragmentParam() => $_clearField(6);\n  @$pb.TagNumber(6)\n  FragmentParam ensureFragmentParam() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $core.String get fromScene => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set fromScene($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasFromScene() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearFromScene() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $5.PlayCtrl get playCtrl => $_getN(7);\n  @$pb.TagNumber(8)\n  set playCtrl($5.PlayCtrl value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasPlayCtrl() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearPlayCtrl() => $_clearField(8);\n}\n\nclass ViewReply extends $pb.GeneratedMessage {\n  factory ViewReply({\n    ViewBase? viewBase,\n    Arc? arc,\n    ReqUser? reqUser,\n    $1.Owner? owner,\n    Tab? tab,\n    $2.Any? supplement,\n    CM? cm,\n    ECode? ecode,\n    ECodeConfig? ecodeConfig,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? report,\n  }) {\n    final result = create();\n    if (viewBase != null) result.viewBase = viewBase;\n    if (arc != null) result.arc = arc;\n    if (reqUser != null) result.reqUser = reqUser;\n    if (owner != null) result.owner = owner;\n    if (tab != null) result.tab = tab;\n    if (supplement != null) result.supplement = supplement;\n    if (cm != null) result.cm = cm;\n    if (ecode != null) result.ecode = ecode;\n    if (ecodeConfig != null) result.ecodeConfig = ecodeConfig;\n    if (report != null) result.report.addEntries(report);\n    return result;\n  }\n\n  ViewReply._();\n\n  factory ViewReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ViewReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ViewReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aOM<ViewBase>(1, _omitFieldNames ? '' : 'viewBase',\n        subBuilder: ViewBase.create)\n    ..aOM<Arc>(2, _omitFieldNames ? '' : 'arc', subBuilder: Arc.create)\n    ..aOM<ReqUser>(3, _omitFieldNames ? '' : 'reqUser',\n        subBuilder: ReqUser.create)\n    ..aOM<$1.Owner>(4, _omitFieldNames ? '' : 'owner',\n        subBuilder: $1.Owner.create)\n    ..aOM<Tab>(5, _omitFieldNames ? '' : 'tab', subBuilder: Tab.create)\n    ..aOM<$2.Any>(6, _omitFieldNames ? '' : 'supplement',\n        subBuilder: $2.Any.create)\n    ..aOM<CM>(7, _omitFieldNames ? '' : 'cm', subBuilder: CM.create)\n    ..aE<ECode>(8, _omitFieldNames ? '' : 'ecode', enumValues: ECode.values)\n    ..aOM<ECodeConfig>(9, _omitFieldNames ? '' : 'ecodeConfig',\n        subBuilder: ECodeConfig.create)\n    ..m<$core.String, $core.String>(10, _omitFieldNames ? '' : 'report',\n        entryClassName: 'ViewReply.ReportEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.viewunite.v1'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ViewReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ViewReply copyWith(void Function(ViewReply) updates) =>\n      super.copyWith((message) => updates(message as ViewReply)) as ViewReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ViewReply create() => ViewReply._();\n  @$core.override\n  ViewReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ViewReply getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ViewReply>(create);\n  static ViewReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  ViewBase get viewBase => $_getN(0);\n  @$pb.TagNumber(1)\n  set viewBase(ViewBase value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasViewBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearViewBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  ViewBase ensureViewBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  Arc get arc => $_getN(1);\n  @$pb.TagNumber(2)\n  set arc(Arc value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasArc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearArc() => $_clearField(2);\n  @$pb.TagNumber(2)\n  Arc ensureArc() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  ReqUser get reqUser => $_getN(2);\n  @$pb.TagNumber(3)\n  set reqUser(ReqUser value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasReqUser() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearReqUser() => $_clearField(3);\n  @$pb.TagNumber(3)\n  ReqUser ensureReqUser() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $1.Owner get owner => $_getN(3);\n  @$pb.TagNumber(4)\n  set owner($1.Owner value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasOwner() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearOwner() => $_clearField(4);\n  @$pb.TagNumber(4)\n  $1.Owner ensureOwner() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  Tab get tab => $_getN(4);\n  @$pb.TagNumber(5)\n  set tab(Tab value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasTab() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearTab() => $_clearField(5);\n  @$pb.TagNumber(5)\n  Tab ensureTab() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $2.Any get supplement => $_getN(5);\n  @$pb.TagNumber(6)\n  set supplement($2.Any value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasSupplement() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearSupplement() => $_clearField(6);\n  @$pb.TagNumber(6)\n  $2.Any ensureSupplement() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  CM get cm => $_getN(6);\n  @$pb.TagNumber(7)\n  set cm(CM value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCm() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCm() => $_clearField(7);\n  @$pb.TagNumber(7)\n  CM ensureCm() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  ECode get ecode => $_getN(7);\n  @$pb.TagNumber(8)\n  set ecode(ECode value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasEcode() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearEcode() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  ECodeConfig get ecodeConfig => $_getN(8);\n  @$pb.TagNumber(9)\n  set ecodeConfig(ECodeConfig value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasEcodeConfig() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearEcodeConfig() => $_clearField(9);\n  @$pb.TagNumber(9)\n  ECodeConfig ensureEcodeConfig() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  $pb.PbMap<$core.String, $core.String> get report => $_getMap(9);\n}\n\nclass ViewReq extends $pb.GeneratedMessage {\n  factory ViewReq({\n    $fixnum.Int64? aid,\n    $core.String? bvid,\n    $core.String? from,\n    $core.String? spmid,\n    $core.String? fromSpmid,\n    $core.String? sessionId,\n    $4.PlayerArgs? playerArgs,\n    $core.String? trackId,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? extraContent,\n    $core.String? playMode,\n    Relate? relate,\n    $core.String? bizExtra,\n    $core.String? adExtra,\n    $core.String? fromScene,\n    $5.PlayCtrl? playCtrl,\n  }) {\n    final result = create();\n    if (aid != null) result.aid = aid;\n    if (bvid != null) result.bvid = bvid;\n    if (from != null) result.from = from;\n    if (spmid != null) result.spmid = spmid;\n    if (fromSpmid != null) result.fromSpmid = fromSpmid;\n    if (sessionId != null) result.sessionId = sessionId;\n    if (playerArgs != null) result.playerArgs = playerArgs;\n    if (trackId != null) result.trackId = trackId;\n    if (extraContent != null) result.extraContent.addEntries(extraContent);\n    if (playMode != null) result.playMode = playMode;\n    if (relate != null) result.relate = relate;\n    if (bizExtra != null) result.bizExtra = bizExtra;\n    if (adExtra != null) result.adExtra = adExtra;\n    if (fromScene != null) result.fromScene = fromScene;\n    if (playCtrl != null) result.playCtrl = playCtrl;\n    return result;\n  }\n\n  ViewReq._();\n\n  factory ViewReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ViewReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ViewReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.app.viewunite.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'aid')\n    ..aOS(2, _omitFieldNames ? '' : 'bvid')\n    ..aOS(3, _omitFieldNames ? '' : 'from')\n    ..aOS(4, _omitFieldNames ? '' : 'spmid')\n    ..aOS(5, _omitFieldNames ? '' : 'fromSpmid')\n    ..aOS(6, _omitFieldNames ? '' : 'sessionId')\n    ..aOM<$4.PlayerArgs>(7, _omitFieldNames ? '' : 'playerArgs',\n        subBuilder: $4.PlayerArgs.create)\n    ..aOS(8, _omitFieldNames ? '' : 'trackId')\n    ..m<$core.String, $core.String>(9, _omitFieldNames ? '' : 'extraContent',\n        entryClassName: 'ViewReq.ExtraContentEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.app.viewunite.v1'))\n    ..aOS(10, _omitFieldNames ? '' : 'playMode')\n    ..aOM<Relate>(11, _omitFieldNames ? '' : 'relate',\n        subBuilder: Relate.create)\n    ..aOS(12, _omitFieldNames ? '' : 'bizExtra')\n    ..aOS(13, _omitFieldNames ? '' : 'adExtra')\n    ..aOS(14, _omitFieldNames ? '' : 'fromScene')\n    ..aE<$5.PlayCtrl>(15, _omitFieldNames ? '' : 'playCtrl',\n        enumValues: $5.PlayCtrl.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ViewReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ViewReq copyWith(void Function(ViewReq) updates) =>\n      super.copyWith((message) => updates(message as ViewReq)) as ViewReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ViewReq create() => ViewReq._();\n  @$core.override\n  ViewReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ViewReq getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ViewReq>(create);\n  static ViewReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get aid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set aid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get bvid => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set bvid($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBvid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBvid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get from => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set from($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFrom() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFrom() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get spmid => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set spmid($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSpmid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSpmid() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get fromSpmid => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set fromSpmid($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasFromSpmid() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearFromSpmid() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get sessionId => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set sessionId($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasSessionId() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearSessionId() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $4.PlayerArgs get playerArgs => $_getN(6);\n  @$pb.TagNumber(7)\n  set playerArgs($4.PlayerArgs value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasPlayerArgs() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearPlayerArgs() => $_clearField(7);\n  @$pb.TagNumber(7)\n  $4.PlayerArgs ensurePlayerArgs() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  $core.String get trackId => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set trackId($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasTrackId() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearTrackId() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $pb.PbMap<$core.String, $core.String> get extraContent => $_getMap(8);\n\n  @$pb.TagNumber(10)\n  $core.String get playMode => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set playMode($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasPlayMode() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearPlayMode() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  Relate get relate => $_getN(10);\n  @$pb.TagNumber(11)\n  set relate(Relate value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasRelate() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearRelate() => $_clearField(11);\n  @$pb.TagNumber(11)\n  Relate ensureRelate() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  $core.String get bizExtra => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set bizExtra($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasBizExtra() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearBizExtra() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.String get adExtra => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set adExtra($core.String value) => $_setString(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasAdExtra() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearAdExtra() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.String get fromScene => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set fromScene($core.String value) => $_setString(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasFromScene() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearFromScene() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $5.PlayCtrl get playCtrl => $_getN(14);\n  @$pb.TagNumber(15)\n  set playCtrl($5.PlayCtrl value) => $_setField(15, value);\n  @$pb.TagNumber(15)\n  $core.bool hasPlayCtrl() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearPlayCtrl() => $_clearField(15);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/viewunite/v1.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/viewunite/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nclass BizType extends $pb.ProtobufEnum {\n  static const BizType BizTypeNone =\n      BizType._(0, _omitEnumNames ? '' : 'BizTypeNone');\n  static const BizType BizTypeFollowVideo =\n      BizType._(1, _omitEnumNames ? '' : 'BizTypeFollowVideo');\n  static const BizType BizTypeReserveActivity =\n      BizType._(2, _omitEnumNames ? '' : 'BizTypeReserveActivity');\n  static const BizType BizTypeJumpLink =\n      BizType._(3, _omitEnumNames ? '' : 'BizTypeJumpLink');\n  static const BizType BizTypeFavSeason =\n      BizType._(4, _omitEnumNames ? '' : 'BizTypeFavSeason');\n  static const BizType BizTypeReserveGame =\n      BizType._(5, _omitEnumNames ? '' : 'BizTypeReserveGame');\n  static const BizType BizTypeGiftGame =\n      BizType._(6, _omitEnumNames ? '' : 'BizTypeGiftGame');\n\n  static const $core.List<BizType> values = <BizType>[\n    BizTypeNone,\n    BizTypeFollowVideo,\n    BizTypeReserveActivity,\n    BizTypeJumpLink,\n    BizTypeFavSeason,\n    BizTypeReserveGame,\n    BizTypeGiftGame,\n  ];\n\n  static final $core.List<BizType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 6);\n  static BizType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const BizType._(super.value, super.name);\n}\n\nclass CacheCode extends $pb.ProtobufEnum {\n  static const CacheCode PLAY = CacheCode._(0, _omitEnumNames ? '' : 'PLAY');\n  static const CacheCode UPOWERSTATE_INACTIVE =\n      CacheCode._(100, _omitEnumNames ? '' : 'UPOWERSTATE_INACTIVE');\n  static const CacheCode REPEAT_LAST_OPERATION =\n      CacheCode._(101, _omitEnumNames ? '' : 'REPEAT_LAST_OPERATION');\n\n  static const $core.List<CacheCode> values = <CacheCode>[\n    PLAY,\n    UPOWERSTATE_INACTIVE,\n    REPEAT_LAST_OPERATION,\n  ];\n\n  static final $core.Map<$core.int, CacheCode> _byValue =\n      $pb.ProtobufEnum.initByValue(values);\n  static CacheCode? valueOf($core.int value) => _byValue[value];\n\n  const CacheCode._(super.value, super.name);\n}\n\nclass ECode extends $pb.ProtobufEnum {\n  static const ECode CODE_DEFAULT =\n      ECode._(0, _omitEnumNames ? '' : 'CODE_DEFAULT');\n  static const ECode CODE_404 = ECode._(1, _omitEnumNames ? '' : 'CODE_404');\n  static const ECode CODE_ARC_PRIVACY =\n      ECode._(2, _omitEnumNames ? '' : 'CODE_ARC_PRIVACY');\n  static const ECode CODE_TEENAGER =\n      ECode._(78301, _omitEnumNames ? '' : 'CODE_TEENAGER');\n\n  static const $core.List<ECode> values = <ECode>[\n    CODE_DEFAULT,\n    CODE_404,\n    CODE_ARC_PRIVACY,\n    CODE_TEENAGER,\n  ];\n\n  static final $core.Map<$core.int, ECode> _byValue =\n      $pb.ProtobufEnum.initByValue(values);\n  static ECode? valueOf($core.int value) => _byValue[value];\n\n  const ECode._(super.value, super.name);\n}\n\nclass JumpShowType extends $pb.ProtobufEnum {\n  static const JumpShowType JST_DEFAULT =\n      JumpShowType._(0, _omitEnumNames ? '' : 'JST_DEFAULT');\n  static const JumpShowType JST_FULLSCREEN =\n      JumpShowType._(1, _omitEnumNames ? '' : 'JST_FULLSCREEN');\n  static const JumpShowType JST_HALFSCREEN =\n      JumpShowType._(2, _omitEnumNames ? '' : 'JST_HALFSCREEN');\n\n  static const $core.List<JumpShowType> values = <JumpShowType>[\n    JST_DEFAULT,\n    JST_FULLSCREEN,\n    JST_HALFSCREEN,\n  ];\n\n  static final $core.List<JumpShowType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static JumpShowType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const JumpShowType._(super.value, super.name);\n}\n\nclass MaterialBizType extends $pb.ProtobufEnum {\n  static const MaterialBizType NONE =\n      MaterialBizType._(0, _omitEnumNames ? '' : 'NONE');\n  static const MaterialBizType ACTIVITY =\n      MaterialBizType._(1, _omitEnumNames ? '' : 'ACTIVITY');\n  static const MaterialBizType BGM =\n      MaterialBizType._(2, _omitEnumNames ? '' : 'BGM');\n  static const MaterialBizType EFFECT =\n      MaterialBizType._(3, _omitEnumNames ? '' : 'EFFECT');\n  static const MaterialBizType SHOOT_SAME =\n      MaterialBizType._(4, _omitEnumNames ? '' : 'SHOOT_SAME');\n  static const MaterialBizType SHOOT_TOGETHER =\n      MaterialBizType._(5, _omitEnumNames ? '' : 'SHOOT_TOGETHER');\n  static const MaterialBizType ACTIVITY_ICON =\n      MaterialBizType._(6, _omitEnumNames ? '' : 'ACTIVITY_ICON');\n  static const MaterialBizType NEW_BGM =\n      MaterialBizType._(7, _omitEnumNames ? '' : 'NEW_BGM');\n  static const MaterialBizType GENERAL_TYPE =\n      MaterialBizType._(8, _omitEnumNames ? '' : 'GENERAL_TYPE');\n\n  static const $core.List<MaterialBizType> values = <MaterialBizType>[\n    NONE,\n    ACTIVITY,\n    BGM,\n    EFFECT,\n    SHOOT_SAME,\n    SHOOT_TOGETHER,\n    ACTIVITY_ICON,\n    NEW_BGM,\n    GENERAL_TYPE,\n  ];\n\n  static final $core.List<MaterialBizType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 8);\n  static MaterialBizType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const MaterialBizType._(super.value, super.name);\n}\n\nclass MaterialSource extends $pb.ProtobufEnum {\n  static const MaterialSource DEFAULT =\n      MaterialSource._(0, _omitEnumNames ? '' : 'DEFAULT');\n  static const MaterialSource BIJIAN =\n      MaterialSource._(1, _omitEnumNames ? '' : 'BIJIAN');\n\n  static const $core.List<MaterialSource> values = <MaterialSource>[\n    DEFAULT,\n    BIJIAN,\n  ];\n\n  static final $core.List<MaterialSource?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static MaterialSource? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const MaterialSource._(super.value, super.name);\n}\n\nclass PageCategory extends $pb.ProtobufEnum {\n  static const PageCategory COMMON_PAGE =\n      PageCategory._(0, _omitEnumNames ? '' : 'COMMON_PAGE');\n  static const PageCategory ACTIVITY_PAGE =\n      PageCategory._(1, _omitEnumNames ? '' : 'ACTIVITY_PAGE');\n\n  static const $core.List<PageCategory> values = <PageCategory>[\n    COMMON_PAGE,\n    ACTIVITY_PAGE,\n  ];\n\n  static final $core.List<PageCategory?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static PageCategory? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const PageCategory._(super.value, super.name);\n}\n\nclass PageType extends $pb.ProtobufEnum {\n  static const PageType H5 = PageType._(0, _omitEnumNames ? '' : 'H5');\n  static const PageType NA = PageType._(1, _omitEnumNames ? '' : 'NA');\n\n  static const $core.List<PageType> values = <PageType>[\n    H5,\n    NA,\n  ];\n\n  static final $core.List<PageType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static PageType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const PageType._(super.value, super.name);\n}\n\nclass PlayToastEnum extends $pb.ProtobufEnum {\n  static const PlayToastEnum PLAYTOAST_UNKNOWN =\n      PlayToastEnum._(0, _omitEnumNames ? '' : 'PLAYTOAST_UNKNOWN');\n  static const PlayToastEnum PLAYTOAST_CHARGINGPLUS =\n      PlayToastEnum._(1, _omitEnumNames ? '' : 'PLAYTOAST_CHARGINGPLUS');\n\n  static const $core.List<PlayToastEnum> values = <PlayToastEnum>[\n    PLAYTOAST_UNKNOWN,\n    PLAYTOAST_CHARGINGPLUS,\n  ];\n\n  static final $core.List<PlayToastEnum?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static PlayToastEnum? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const PlayToastEnum._(super.value, super.name);\n}\n\nclass SourceContentType extends $pb.ProtobufEnum {\n  static const SourceContentType SC_DEFAULT =\n      SourceContentType._(0, _omitEnumNames ? '' : 'SC_DEFAULT');\n  static const SourceContentType SC_AV =\n      SourceContentType._(1, _omitEnumNames ? '' : 'SC_AV');\n\n  static const $core.List<SourceContentType> values = <SourceContentType>[\n    SC_DEFAULT,\n    SC_AV,\n  ];\n\n  static final $core.List<SourceContentType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static SourceContentType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const SourceContentType._(super.value, super.name);\n}\n\nclass TabType extends $pb.ProtobufEnum {\n  static const TabType TAB_NONE =\n      TabType._(0, _omitEnumNames ? '' : 'TAB_NONE');\n  static const TabType TAB_INTRODUCTION =\n      TabType._(1, _omitEnumNames ? '' : 'TAB_INTRODUCTION');\n  static const TabType TAB_REPLY =\n      TabType._(2, _omitEnumNames ? '' : 'TAB_REPLY');\n  static const TabType TAB_OGV_ACTIVITY =\n      TabType._(3, _omitEnumNames ? '' : 'TAB_OGV_ACTIVITY');\n  static const TabType TAB_CATALOG =\n      TabType._(4, _omitEnumNames ? '' : 'TAB_CATALOG');\n\n  static const $core.List<TabType> values = <TabType>[\n    TAB_NONE,\n    TAB_INTRODUCTION,\n    TAB_REPLY,\n    TAB_OGV_ACTIVITY,\n    TAB_CATALOG,\n  ];\n\n  static final $core.List<TabType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 4);\n  static TabType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const TabType._(super.value, super.name);\n}\n\nclass UnionType extends $pb.ProtobufEnum {\n  static const UnionType UGC = UnionType._(0, _omitEnumNames ? '' : 'UGC');\n  static const UnionType OGV = UnionType._(1, _omitEnumNames ? '' : 'OGV');\n  static const UnionType PUGV = UnionType._(2, _omitEnumNames ? '' : 'PUGV');\n\n  static const $core.List<UnionType> values = <UnionType>[\n    UGC,\n    OGV,\n    PUGV,\n  ];\n\n  static final $core.List<UnionType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static UnionType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const UnionType._(super.value, super.name);\n}\n\nconst $core.bool _omitEnumNames =\n    $core.bool.fromEnvironment('protobuf.omit_enum_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/app/viewunite/v1.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/app/viewunite/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use bizTypeDescriptor instead')\nconst BizType$json = {\n  '1': 'BizType',\n  '2': [\n    {'1': 'BizTypeNone', '2': 0},\n    {'1': 'BizTypeFollowVideo', '2': 1},\n    {'1': 'BizTypeReserveActivity', '2': 2},\n    {'1': 'BizTypeJumpLink', '2': 3},\n    {'1': 'BizTypeFavSeason', '2': 4},\n    {'1': 'BizTypeReserveGame', '2': 5},\n    {'1': 'BizTypeGiftGame', '2': 6},\n  ],\n};\n\n/// Descriptor for `BizType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List bizTypeDescriptor = $convert.base64Decode(\n    'CgdCaXpUeXBlEg8KC0JpelR5cGVOb25lEAASFgoSQml6VHlwZUZvbGxvd1ZpZGVvEAESGgoWQm'\n    'l6VHlwZVJlc2VydmVBY3Rpdml0eRACEhMKD0JpelR5cGVKdW1wTGluaxADEhQKEEJpelR5cGVG'\n    'YXZTZWFzb24QBBIWChJCaXpUeXBlUmVzZXJ2ZUdhbWUQBRITCg9CaXpUeXBlR2lmdEdhbWUQBg'\n    '==');\n\n@$core.Deprecated('Use cacheCodeDescriptor instead')\nconst CacheCode$json = {\n  '1': 'CacheCode',\n  '2': [\n    {'1': 'PLAY', '2': 0},\n    {'1': 'UPOWERSTATE_INACTIVE', '2': 100},\n    {'1': 'REPEAT_LAST_OPERATION', '2': 101},\n  ],\n};\n\n/// Descriptor for `CacheCode`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List cacheCodeDescriptor = $convert.base64Decode(\n    'CglDYWNoZUNvZGUSCAoEUExBWRAAEhgKFFVQT1dFUlNUQVRFX0lOQUNUSVZFEGQSGQoVUkVQRU'\n    'FUX0xBU1RfT1BFUkFUSU9OEGU=');\n\n@$core.Deprecated('Use eCodeDescriptor instead')\nconst ECode$json = {\n  '1': 'ECode',\n  '2': [\n    {'1': 'CODE_DEFAULT', '2': 0},\n    {'1': 'CODE_404', '2': 1},\n    {'1': 'CODE_ARC_PRIVACY', '2': 2},\n    {'1': 'CODE_TEENAGER', '2': 78301},\n  ],\n};\n\n/// Descriptor for `ECode`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List eCodeDescriptor = $convert.base64Decode(\n    'CgVFQ29kZRIQCgxDT0RFX0RFRkFVTFQQABIMCghDT0RFXzQwNBABEhQKEENPREVfQVJDX1BSSV'\n    'ZBQ1kQAhITCg1DT0RFX1RFRU5BR0VSEN3jBA==');\n\n@$core.Deprecated('Use jumpShowTypeDescriptor instead')\nconst JumpShowType$json = {\n  '1': 'JumpShowType',\n  '2': [\n    {'1': 'JST_DEFAULT', '2': 0},\n    {'1': 'JST_FULLSCREEN', '2': 1},\n    {'1': 'JST_HALFSCREEN', '2': 2},\n  ],\n};\n\n/// Descriptor for `JumpShowType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List jumpShowTypeDescriptor = $convert.base64Decode(\n    'CgxKdW1wU2hvd1R5cGUSDwoLSlNUX0RFRkFVTFQQABISCg5KU1RfRlVMTFNDUkVFThABEhIKDk'\n    'pTVF9IQUxGU0NSRUVOEAI=');\n\n@$core.Deprecated('Use materialBizTypeDescriptor instead')\nconst MaterialBizType$json = {\n  '1': 'MaterialBizType',\n  '2': [\n    {'1': 'NONE', '2': 0},\n    {'1': 'ACTIVITY', '2': 1},\n    {'1': 'BGM', '2': 2},\n    {'1': 'EFFECT', '2': 3},\n    {'1': 'SHOOT_SAME', '2': 4},\n    {'1': 'SHOOT_TOGETHER', '2': 5},\n    {'1': 'ACTIVITY_ICON', '2': 6},\n    {'1': 'NEW_BGM', '2': 7},\n    {'1': 'GENERAL_TYPE', '2': 8},\n  ],\n};\n\n/// Descriptor for `MaterialBizType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List materialBizTypeDescriptor = $convert.base64Decode(\n    'Cg9NYXRlcmlhbEJpelR5cGUSCAoETk9ORRAAEgwKCEFDVElWSVRZEAESBwoDQkdNEAISCgoGRU'\n    'ZGRUNUEAMSDgoKU0hPT1RfU0FNRRAEEhIKDlNIT09UX1RPR0VUSEVSEAUSEQoNQUNUSVZJVFlf'\n    'SUNPThAGEgsKB05FV19CR00QBxIQCgxHRU5FUkFMX1RZUEUQCA==');\n\n@$core.Deprecated('Use materialSourceDescriptor instead')\nconst MaterialSource$json = {\n  '1': 'MaterialSource',\n  '2': [\n    {'1': 'DEFAULT', '2': 0},\n    {'1': 'BIJIAN', '2': 1},\n  ],\n};\n\n/// Descriptor for `MaterialSource`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List materialSourceDescriptor = $convert\n    .base64Decode('Cg5NYXRlcmlhbFNvdXJjZRILCgdERUZBVUxUEAASCgoGQklKSUFOEAE=');\n\n@$core.Deprecated('Use pageCategoryDescriptor instead')\nconst PageCategory$json = {\n  '1': 'PageCategory',\n  '2': [\n    {'1': 'COMMON_PAGE', '2': 0},\n    {'1': 'ACTIVITY_PAGE', '2': 1},\n  ],\n};\n\n/// Descriptor for `PageCategory`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List pageCategoryDescriptor = $convert.base64Decode(\n    'CgxQYWdlQ2F0ZWdvcnkSDwoLQ09NTU9OX1BBR0UQABIRCg1BQ1RJVklUWV9QQUdFEAE=');\n\n@$core.Deprecated('Use pageTypeDescriptor instead')\nconst PageType$json = {\n  '1': 'PageType',\n  '2': [\n    {'1': 'H5', '2': 0},\n    {'1': 'NA', '2': 1},\n  ],\n};\n\n/// Descriptor for `PageType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List pageTypeDescriptor =\n    $convert.base64Decode('CghQYWdlVHlwZRIGCgJINRAAEgYKAk5BEAE=');\n\n@$core.Deprecated('Use playToastEnumDescriptor instead')\nconst PlayToastEnum$json = {\n  '1': 'PlayToastEnum',\n  '2': [\n    {'1': 'PLAYTOAST_UNKNOWN', '2': 0},\n    {'1': 'PLAYTOAST_CHARGINGPLUS', '2': 1},\n  ],\n};\n\n/// Descriptor for `PlayToastEnum`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List playToastEnumDescriptor = $convert.base64Decode(\n    'Cg1QbGF5VG9hc3RFbnVtEhUKEVBMQVlUT0FTVF9VTktOT1dOEAASGgoWUExBWVRPQVNUX0NIQV'\n    'JHSU5HUExVUxAB');\n\n@$core.Deprecated('Use sourceContentTypeDescriptor instead')\nconst SourceContentType$json = {\n  '1': 'SourceContentType',\n  '2': [\n    {'1': 'SC_DEFAULT', '2': 0},\n    {'1': 'SC_AV', '2': 1},\n  ],\n};\n\n/// Descriptor for `SourceContentType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List sourceContentTypeDescriptor = $convert.base64Decode(\n    'ChFTb3VyY2VDb250ZW50VHlwZRIOCgpTQ19ERUZBVUxUEAASCQoFU0NfQVYQAQ==');\n\n@$core.Deprecated('Use tabTypeDescriptor instead')\nconst TabType$json = {\n  '1': 'TabType',\n  '2': [\n    {'1': 'TAB_NONE', '2': 0},\n    {'1': 'TAB_INTRODUCTION', '2': 1},\n    {'1': 'TAB_REPLY', '2': 2},\n    {'1': 'TAB_OGV_ACTIVITY', '2': 3},\n    {'1': 'TAB_CATALOG', '2': 4},\n  ],\n};\n\n/// Descriptor for `TabType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List tabTypeDescriptor = $convert.base64Decode(\n    'CgdUYWJUeXBlEgwKCFRBQl9OT05FEAASFAoQVEFCX0lOVFJPRFVDVElPThABEg0KCVRBQl9SRV'\n    'BMWRACEhQKEFRBQl9PR1ZfQUNUSVZJVFkQAxIPCgtUQUJfQ0FUQUxPRxAE');\n\n@$core.Deprecated('Use unionTypeDescriptor instead')\nconst UnionType$json = {\n  '1': 'UnionType',\n  '2': [\n    {'1': 'UGC', '2': 0},\n    {'1': 'OGV', '2': 1},\n    {'1': 'PUGV', '2': 2},\n  ],\n};\n\n/// Descriptor for `UnionType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List unionTypeDescriptor = $convert\n    .base64Decode('CglVbmlvblR5cGUSBwoDVUdDEAASBwoDT0dWEAESCAoEUFVHVhAC');\n\n@$core.Deprecated('Use activityResourceDescriptor instead')\nconst ActivityResource$json = {\n  '1': 'ActivityResource',\n  '2': [\n    {'1': 'dark_text_color', '3': 1, '4': 1, '5': 9, '10': 'darkTextColor'},\n    {'1': 'divider_color', '3': 2, '4': 1, '5': 9, '10': 'dividerColor'},\n    {'1': 'bg_color', '3': 3, '4': 1, '5': 9, '10': 'bgColor'},\n    {'1': 'selected_bg_color', '3': 4, '4': 1, '5': 9, '10': 'selectedBgColor'},\n    {'1': 'text_color', '3': 5, '4': 1, '5': 9, '10': 'textColor'},\n    {'1': 'light_text_color', '3': 6, '4': 1, '5': 9, '10': 'lightTextColor'},\n  ],\n};\n\n/// Descriptor for `ActivityResource`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List activityResourceDescriptor = $convert.base64Decode(\n    'ChBBY3Rpdml0eVJlc291cmNlEiYKD2RhcmtfdGV4dF9jb2xvchgBIAEoCVINZGFya1RleHRDb2'\n    'xvchIjCg1kaXZpZGVyX2NvbG9yGAIgASgJUgxkaXZpZGVyQ29sb3ISGQoIYmdfY29sb3IYAyAB'\n    'KAlSB2JnQ29sb3ISKgoRc2VsZWN0ZWRfYmdfY29sb3IYBCABKAlSD3NlbGVjdGVkQmdDb2xvch'\n    'IdCgp0ZXh0X2NvbG9yGAUgASgJUgl0ZXh0Q29sb3ISKAoQbGlnaHRfdGV4dF9jb2xvchgGIAEo'\n    'CVIObGlnaHRUZXh0Q29sb3I=');\n\n@$core.Deprecated('Use arcDescriptor instead')\nconst Arc$json = {\n  '1': 'Arc',\n  '2': [\n    {'1': 'aid', '3': 1, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'cid', '3': 2, '4': 1, '5': 3, '10': 'cid'},\n    {'1': 'duration', '3': 3, '4': 1, '5': 3, '10': 'duration'},\n    {\n      '1': 'stat',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Stat',\n      '10': 'stat'\n    },\n    {'1': 'bvid', '3': 5, '4': 1, '5': 9, '10': 'bvid'},\n    {'1': 'copyright', '3': 6, '4': 1, '5': 5, '10': 'copyright'},\n    {\n      '1': 'right',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.Rights',\n      '10': 'right'\n    },\n    {'1': 'cover', '3': 8, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'type_id', '3': 9, '4': 1, '5': 3, '10': 'typeId'},\n    {'1': 'title', '3': 10, '4': 1, '5': 9, '10': 'title'},\n  ],\n};\n\n/// Descriptor for `Arc`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List arcDescriptor = $convert.base64Decode(\n    'CgNBcmMSEAoDYWlkGAEgASgDUgNhaWQSEAoDY2lkGAIgASgDUgNjaWQSGgoIZHVyYXRpb24YAy'\n    'ABKANSCGR1cmF0aW9uEjcKBHN0YXQYBCABKAsyIy5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNv'\n    'bW1vbi5TdGF0UgRzdGF0EhIKBGJ2aWQYBSABKAlSBGJ2aWQSHAoJY29weXJpZ2h0GAYgASgFUg'\n    'ljb3B5cmlnaHQSNwoFcmlnaHQYByABKAsyIS5iaWxpYmlsaS5hcHAudmlld3VuaXRlLnYxLlJp'\n    'Z2h0c1IFcmlnaHQSFAoFY292ZXIYCCABKAlSBWNvdmVyEhcKB3R5cGVfaWQYCSABKANSBnR5cG'\n    'VJZBIUCgV0aXRsZRgKIAEoCVIFdGl0bGU=');\n\n@$core.Deprecated('Use arcRefreshReplyDescriptor instead')\nconst ArcRefreshReply$json = {\n  '1': 'ArcRefreshReply',\n  '2': [\n    {\n      '1': 'stat',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Stat',\n      '10': 'stat'\n    },\n    {\n      '1': 'req_user',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.SimpleReqUser',\n      '10': 'reqUser'\n    },\n    {\n      '1': 'arc',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.SimpleArc',\n      '10': 'arc'\n    },\n    {\n      '1': 'online',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.Online',\n      '10': 'online'\n    },\n    {\n      '1': 'like_config',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.LikeConfig',\n      '10': 'likeConfig'\n    },\n    {\n      '1': 'owner',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.SimpleOwner',\n      '10': 'owner'\n    },\n    {\n      '1': 'reply_style',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.ReplyStyle',\n      '10': 'replyStyle'\n    },\n  ],\n};\n\n/// Descriptor for `ArcRefreshReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List arcRefreshReplyDescriptor = $convert.base64Decode(\n    'Cg9BcmNSZWZyZXNoUmVwbHkSNwoEc3RhdBgBIAEoCzIjLmJpbGliaWxpLmFwcC52aWV3dW5pdG'\n    'UuY29tbW9uLlN0YXRSBHN0YXQSQwoIcmVxX3VzZXIYAiABKAsyKC5iaWxpYmlsaS5hcHAudmll'\n    'd3VuaXRlLnYxLlNpbXBsZVJlcVVzZXJSB3JlcVVzZXISNgoDYXJjGAMgASgLMiQuYmlsaWJpbG'\n    'kuYXBwLnZpZXd1bml0ZS52MS5TaW1wbGVBcmNSA2FyYxI5CgZvbmxpbmUYBCABKAsyIS5iaWxp'\n    'YmlsaS5hcHAudmlld3VuaXRlLnYxLk9ubGluZVIGb25saW5lEkYKC2xpa2VfY29uZmlnGAUgAS'\n    'gLMiUuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS52MS5MaWtlQ29uZmlnUgpsaWtlQ29uZmlnEjwK'\n    'BW93bmVyGAYgASgLMiYuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS52MS5TaW1wbGVPd25lclIFb3'\n    'duZXISRgoLcmVwbHlfc3R5bGUYByABKAsyJS5iaWxpYmlsaS5hcHAudmlld3VuaXRlLnYxLlJl'\n    'cGx5U3R5bGVSCnJlcGx5U3R5bGU=');\n\n@$core.Deprecated('Use arcRefreshReqDescriptor instead')\nconst ArcRefreshReq$json = {\n  '1': 'ArcRefreshReq',\n  '2': [\n    {'1': 'aid', '3': 1, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'bvid', '3': 2, '4': 1, '5': 9, '10': 'bvid'},\n    {\n      '1': 'type',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.v1.UnionType',\n      '10': 'type'\n    },\n  ],\n};\n\n/// Descriptor for `ArcRefreshReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List arcRefreshReqDescriptor = $convert.base64Decode(\n    'Cg1BcmNSZWZyZXNoUmVxEhAKA2FpZBgBIAEoA1IDYWlkEhIKBGJ2aWQYAiABKAlSBGJ2aWQSOA'\n    'oEdHlwZRgDIAEoDjIkLmJpbGliaWxpLmFwcC52aWV3dW5pdGUudjEuVW5pb25UeXBlUgR0eXBl');\n\n@$core.Deprecated('Use attentionCardDescriptor instead')\nconst AttentionCard$json = {\n  '1': 'AttentionCard',\n  '2': [\n    {\n      '1': 'show_time',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.ShowTime',\n      '10': 'showTime'\n    },\n  ],\n};\n\n/// Descriptor for `AttentionCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List attentionCardDescriptor = $convert.base64Decode(\n    'Cg1BdHRlbnRpb25DYXJkEkAKCXNob3dfdGltZRgBIAMoCzIjLmJpbGliaWxpLmFwcC52aWV3dW'\n    '5pdGUudjEuU2hvd1RpbWVSCHNob3dUaW1l');\n\n@$core.Deprecated('Use bgPlayNoticeDescriptor instead')\nconst BgPlayNotice$json = {\n  '1': 'BgPlayNotice',\n  '2': [\n    {'1': 'allow_show', '3': 1, '4': 1, '5': 8, '10': 'allowShow'},\n    {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'btn_text1', '3': 3, '4': 1, '5': 9, '10': 'btnText1'},\n    {'1': 'btn_text2', '3': 4, '4': 1, '5': 9, '10': 'btnText2'},\n  ],\n};\n\n/// Descriptor for `BgPlayNotice`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bgPlayNoticeDescriptor = $convert.base64Decode(\n    'CgxCZ1BsYXlOb3RpY2USHQoKYWxsb3dfc2hvdxgBIAEoCFIJYWxsb3dTaG93EhIKBHRleHQYAi'\n    'ABKAlSBHRleHQSGwoJYnRuX3RleHQxGAMgASgJUghidG5UZXh0MRIbCglidG5fdGV4dDIYBCAB'\n    'KAlSCGJ0blRleHQy');\n\n@$core.Deprecated('Use bizFollowVideoParamDescriptor instead')\nconst BizFollowVideoParam$json = {\n  '1': 'BizFollowVideoParam',\n  '2': [\n    {'1': 'season_id', '3': 1, '4': 1, '5': 3, '10': 'seasonId'},\n  ],\n};\n\n/// Descriptor for `BizFollowVideoParam`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bizFollowVideoParamDescriptor =\n    $convert.base64Decode(\n        'ChNCaXpGb2xsb3dWaWRlb1BhcmFtEhsKCXNlYXNvbl9pZBgBIAEoA1IIc2Vhc29uSWQ=');\n\n@$core.Deprecated('Use bizGameBackflowParamDescriptor instead')\nconst BizGameBackflowParam$json = {\n  '1': 'BizGameBackflowParam',\n  '2': [\n    {'1': 'extra', '3': 1, '4': 1, '5': 9, '10': 'extra'},\n  ],\n};\n\n/// Descriptor for `BizGameBackflowParam`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bizGameBackflowParamDescriptor =\n    $convert.base64Decode(\n        'ChRCaXpHYW1lQmFja2Zsb3dQYXJhbRIUCgVleHRyYRgBIAEoCVIFZXh0cmE=');\n\n@$core.Deprecated('Use bizJumpLinkParamDescriptor instead')\nconst BizJumpLinkParam$json = {\n  '1': 'BizJumpLinkParam',\n  '2': [\n    {'1': 'url', '3': 1, '4': 1, '5': 9, '10': 'url'},\n  ],\n};\n\n/// Descriptor for `BizJumpLinkParam`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bizJumpLinkParamDescriptor =\n    $convert.base64Decode('ChBCaXpKdW1wTGlua1BhcmFtEhAKA3VybBgBIAEoCVIDdXJs');\n\n@$core.Deprecated('Use bizReserveActivityParamDescriptor instead')\nconst BizReserveActivityParam$json = {\n  '1': 'BizReserveActivityParam',\n  '2': [\n    {'1': 'activity_id', '3': 1, '4': 1, '5': 3, '10': 'activityId'},\n    {'1': 'from', '3': 2, '4': 1, '5': 9, '10': 'from'},\n    {'1': 'type', '3': 3, '4': 1, '5': 9, '10': 'type'},\n    {'1': 'oid', '3': 4, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'reserve_id', '3': 5, '4': 1, '5': 3, '10': 'reserveId'},\n  ],\n};\n\n/// Descriptor for `BizReserveActivityParam`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bizReserveActivityParamDescriptor = $convert.base64Decode(\n    'ChdCaXpSZXNlcnZlQWN0aXZpdHlQYXJhbRIfCgthY3Rpdml0eV9pZBgBIAEoA1IKYWN0aXZpdH'\n    'lJZBISCgRmcm9tGAIgASgJUgRmcm9tEhIKBHR5cGUYAyABKAlSBHR5cGUSEAoDb2lkGAQgASgD'\n    'UgNvaWQSHQoKcmVzZXJ2ZV9pZBgFIAEoA1IJcmVzZXJ2ZUlk');\n\n@$core.Deprecated('Use bizReserveGameParamDescriptor instead')\nconst BizReserveGameParam$json = {\n  '1': 'BizReserveGameParam',\n  '2': [\n    {'1': 'game_id', '3': 1, '4': 1, '5': 3, '10': 'gameId'},\n  ],\n};\n\n/// Descriptor for `BizReserveGameParam`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bizReserveGameParamDescriptor =\n    $convert.base64Decode(\n        'ChNCaXpSZXNlcnZlR2FtZVBhcmFtEhcKB2dhbWVfaWQYASABKANSBmdhbWVJZA==');\n\n@$core.Deprecated('Use buttonDescriptor instead')\nconst Button$json = {\n  '1': 'Button',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'icon', '3': 3, '4': 1, '5': 9, '10': 'icon'},\n    {\n      '1': 'jump_show_type',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.v1.JumpShowType',\n      '10': 'jumpShowType'\n    },\n  ],\n};\n\n/// Descriptor for `Button`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List buttonDescriptor = $convert.base64Decode(\n    'CgZCdXR0b24SFAoFdGl0bGUYASABKAlSBXRpdGxlEhAKA3VyaRgCIAEoCVIDdXJpEhIKBGljb2'\n    '4YAyABKAlSBGljb24STQoOanVtcF9zaG93X3R5cGUYBCABKA4yJy5iaWxpYmlsaS5hcHAudmll'\n    'd3VuaXRlLnYxLkp1bXBTaG93VHlwZVIManVtcFNob3dUeXBl');\n\n@$core.Deprecated('Use cMDescriptor instead')\nconst CM$json = {\n  '1': 'CM',\n  '2': [\n    {\n      '1': 'cm_under_player',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.google.protobuf.Any',\n      '10': 'cmUnderPlayer'\n    },\n    {\n      '1': 'ads_control',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.google.protobuf.Any',\n      '10': 'adsControl'\n    },\n    {\n      '1': 'source_content',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.google.protobuf.Any',\n      '10': 'sourceContent'\n    },\n    {\n      '1': 'pad_relate_cm',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.PadRelateCM',\n      '10': 'padRelateCm'\n    },\n    {\n      '1': 'source_content_item',\n      '3': 5,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.SourceContentItem',\n      '10': 'sourceContentItem'\n    },\n  ],\n};\n\n/// Descriptor for `CM`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cMDescriptor = $convert.base64Decode(\n    'CgJDTRI8Cg9jbV91bmRlcl9wbGF5ZXIYASABKAsyFC5nb29nbGUucHJvdG9idWYuQW55Ug1jbV'\n    'VuZGVyUGxheWVyEjUKC2Fkc19jb250cm9sGAIgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueVIK'\n    'YWRzQ29udHJvbBI7Cg5zb3VyY2VfY29udGVudBgDIAMoCzIULmdvb2dsZS5wcm90b2J1Zi5Bbn'\n    'lSDXNvdXJjZUNvbnRlbnQSSgoNcGFkX3JlbGF0ZV9jbRgEIAEoCzImLmJpbGliaWxpLmFwcC52'\n    'aWV3dW5pdGUudjEuUGFkUmVsYXRlQ01SC3BhZFJlbGF0ZUNtElwKE3NvdXJjZV9jb250ZW50X2'\n    'l0ZW0YBSADKAsyLC5iaWxpYmlsaS5hcHAudmlld3VuaXRlLnYxLlNvdXJjZUNvbnRlbnRJdGVt'\n    'UhFzb3VyY2VDb250ZW50SXRlbQ==');\n\n@$core.Deprecated('Use cacheAuthenticationReplyDescriptor instead')\nconst CacheAuthenticationReply$json = {\n  '1': 'CacheAuthenticationReply',\n  '2': [\n    {\n      '1': 'item',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.CacheAuthenticationReply.ItemEntry',\n      '10': 'item'\n    },\n  ],\n  '3': [CacheAuthenticationReply_ItemEntry$json],\n};\n\n@$core.Deprecated('Use cacheAuthenticationReplyDescriptor instead')\nconst CacheAuthenticationReply_ItemEntry$json = {\n  '1': 'ItemEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 3, '10': 'key'},\n    {\n      '1': 'value',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.CachePlayAvRly',\n      '10': 'value'\n    },\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `CacheAuthenticationReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cacheAuthenticationReplyDescriptor = $convert.base64Decode(\n    'ChhDYWNoZUF1dGhlbnRpY2F0aW9uUmVwbHkSUQoEaXRlbRgBIAMoCzI9LmJpbGliaWxpLmFwcC'\n    '52aWV3dW5pdGUudjEuQ2FjaGVBdXRoZW50aWNhdGlvblJlcGx5Lkl0ZW1FbnRyeVIEaXRlbRpi'\n    'CglJdGVtRW50cnkSEAoDa2V5GAEgASgDUgNrZXkSPwoFdmFsdWUYAiABKAsyKS5iaWxpYmlsaS'\n    '5hcHAudmlld3VuaXRlLnYxLkNhY2hlUGxheUF2Umx5UgV2YWx1ZToCOAE=');\n\n@$core.Deprecated('Use cacheAuthenticationReqDescriptor instead')\nconst CacheAuthenticationReq$json = {\n  '1': 'CacheAuthenticationReq',\n  '2': [\n    {\n      '1': 'av',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.CachePlayAv',\n      '10': 'av'\n    },\n  ],\n};\n\n/// Descriptor for `CacheAuthenticationReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cacheAuthenticationReqDescriptor =\n    $convert.base64Decode(\n        'ChZDYWNoZUF1dGhlbnRpY2F0aW9uUmVxEjYKAmF2GAEgAygLMiYuYmlsaWJpbGkuYXBwLnZpZX'\n        'd1bml0ZS52MS5DYWNoZVBsYXlBdlICYXY=');\n\n@$core.Deprecated('Use cachePlayAvDescriptor instead')\nconst CachePlayAv$json = {\n  '1': 'CachePlayAv',\n  '2': [\n    {'1': 'aid', '3': 1, '4': 1, '5': 3, '10': 'aid'},\n  ],\n};\n\n/// Descriptor for `CachePlayAv`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cachePlayAvDescriptor =\n    $convert.base64Decode('CgtDYWNoZVBsYXlBdhIQCgNhaWQYASABKANSA2FpZA==');\n\n@$core.Deprecated('Use cachePlayAvRlyDescriptor instead')\nconst CachePlayAvRly$json = {\n  '1': 'CachePlayAvRly',\n  '2': [\n    {\n      '1': 'code',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.v1.CacheCode',\n      '10': 'code'\n    },\n  ],\n};\n\n/// Descriptor for `CachePlayAvRly`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cachePlayAvRlyDescriptor = $convert.base64Decode(\n    'Cg5DYWNoZVBsYXlBdlJseRI4CgRjb2RlGAEgASgOMiQuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS'\n    '52MS5DYWNoZUNvZGVSBGNvZGU=');\n\n@$core.Deprecated('Use chargingPlusDescriptor instead')\nconst ChargingPlus$json = {\n  '1': 'ChargingPlus',\n  '2': [\n    {'1': 'pass', '3': 1, '4': 1, '5': 8, '10': 'pass'},\n    {\n      '1': 'play_toast',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.PlayToast',\n      '10': 'playToast'\n    },\n  ],\n};\n\n/// Descriptor for `ChargingPlus`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List chargingPlusDescriptor = $convert.base64Decode(\n    'CgxDaGFyZ2luZ1BsdXMSEgoEcGFzcxgBIAEoCFIEcGFzcxJDCgpwbGF5X3RvYXN0GAIgAygLMi'\n    'QuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS52MS5QbGF5VG9hc3RSCXBsYXlUb2FzdA==');\n\n@$core.Deprecated('Use chronosDescriptor instead')\nconst Chronos$json = {\n  '1': 'Chronos',\n  '2': [\n    {'1': 'md5', '3': 1, '4': 1, '5': 9, '10': 'md5'},\n    {'1': 'file', '3': 2, '4': 1, '5': 9, '10': 'file'},\n    {'1': 'sign', '3': 3, '4': 1, '5': 9, '10': 'sign'},\n  ],\n};\n\n/// Descriptor for `Chronos`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List chronosDescriptor = $convert.base64Decode(\n    'CgdDaHJvbm9zEhAKA21kNRgBIAEoCVIDbWQ1EhIKBGZpbGUYAiABKAlSBGZpbGUSEgoEc2lnbh'\n    'gDIAEoCVIEc2lnbg==');\n\n@$core.Deprecated('Use chronosParamDescriptor instead')\nconst ChronosParam$json = {\n  '1': 'ChronosParam',\n  '2': [\n    {'1': 'engine_version', '3': 1, '4': 1, '5': 9, '10': 'engineVersion'},\n    {'1': 'message_protocol', '3': 2, '4': 1, '5': 9, '10': 'messageProtocol'},\n    {'1': 'service_key', '3': 3, '4': 1, '5': 9, '10': 'serviceKey'},\n  ],\n};\n\n/// Descriptor for `ChronosParam`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List chronosParamDescriptor = $convert.base64Decode(\n    'CgxDaHJvbm9zUGFyYW0SJQoOZW5naW5lX3ZlcnNpb24YASABKAlSDWVuZ2luZVZlcnNpb24SKQ'\n    'oQbWVzc2FnZV9wcm90b2NvbBgCIAEoCVIPbWVzc2FnZVByb3RvY29sEh8KC3NlcnZpY2Vfa2V5'\n    'GAMgASgJUgpzZXJ2aWNlS2V5');\n\n@$core.Deprecated('Use commandDmDescriptor instead')\nconst CommandDm$json = {\n  '1': 'CommandDm',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'oid', '3': 2, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'mid', '3': 3, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'command', '3': 4, '4': 1, '5': 9, '10': 'command'},\n    {'1': 'content', '3': 5, '4': 1, '5': 9, '10': 'content'},\n    {'1': 'progress', '3': 6, '4': 1, '5': 5, '10': 'progress'},\n    {'1': 'ctime', '3': 7, '4': 1, '5': 9, '10': 'ctime'},\n    {'1': 'mtime', '3': 8, '4': 1, '5': 9, '10': 'mtime'},\n    {'1': 'extra', '3': 9, '4': 1, '5': 9, '10': 'extra'},\n    {'1': 'id_str', '3': 10, '4': 1, '5': 9, '10': 'idStr'},\n  ],\n};\n\n/// Descriptor for `CommandDm`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List commandDmDescriptor = $convert.base64Decode(\n    'CglDb21tYW5kRG0SDgoCaWQYASABKANSAmlkEhAKA29pZBgCIAEoA1IDb2lkEhAKA21pZBgDIA'\n    'EoA1IDbWlkEhgKB2NvbW1hbmQYBCABKAlSB2NvbW1hbmQSGAoHY29udGVudBgFIAEoCVIHY29u'\n    'dGVudBIaCghwcm9ncmVzcxgGIAEoBVIIcHJvZ3Jlc3MSFAoFY3RpbWUYByABKAlSBWN0aW1lEh'\n    'QKBW10aW1lGAggASgJUgVtdGltZRIUCgVleHRyYRgJIAEoCVIFZXh0cmESFQoGaWRfc3RyGAog'\n    'ASgJUgVpZFN0cg==');\n\n@$core.Deprecated('Use configDescriptor instead')\nconst Config$json = {\n  '1': 'Config',\n  '2': [\n    {\n      '1': 'online',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.Online',\n      '10': 'online'\n    },\n    {\n      '1': 'player_icon',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.PlayerIcon',\n      '10': 'playerIcon'\n    },\n    {\n      '1': 'story_entrance',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.StoryEntrance',\n      '10': 'storyEntrance'\n    },\n    {\n      '1': 'bg_play_notice',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.BgPlayNotice',\n      '10': 'bgPlayNotice'\n    },\n  ],\n};\n\n/// Descriptor for `Config`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List configDescriptor = $convert.base64Decode(\n    'CgZDb25maWcSOQoGb25saW5lGAEgASgLMiEuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS52MS5Pbm'\n    'xpbmVSBm9ubGluZRJGCgtwbGF5ZXJfaWNvbhgCIAEoCzIlLmJpbGliaWxpLmFwcC52aWV3dW5p'\n    'dGUudjEuUGxheWVySWNvblIKcGxheWVySWNvbhJPCg5zdG9yeV9lbnRyYW5jZRgDIAEoCzIoLm'\n    'JpbGliaWxpLmFwcC52aWV3dW5pdGUudjEuU3RvcnlFbnRyYW5jZVINc3RvcnlFbnRyYW5jZRJN'\n    'Cg5iZ19wbGF5X25vdGljZRgEIAEoCzInLmJpbGliaWxpLmFwcC52aWV3dW5pdGUudjEuQmdQbG'\n    'F5Tm90aWNlUgxiZ1BsYXlOb3RpY2U=');\n\n@$core.Deprecated('Use contractCardDescriptor instead')\nconst ContractCard$json = {\n  '1': 'ContractCard',\n  '2': [\n    {'1': 'display_progress', '3': 1, '4': 1, '5': 2, '10': 'displayProgress'},\n    {'1': 'display_accuracy', '3': 2, '4': 1, '5': 3, '10': 'displayAccuracy'},\n    {'1': 'display_duration', '3': 3, '4': 1, '5': 3, '10': 'displayDuration'},\n    {'1': 'show_mode', '3': 4, '4': 1, '5': 5, '10': 'showMode'},\n    {'1': 'page_type', '3': 5, '4': 1, '5': 5, '10': 'pageType'},\n    {\n      '1': 'upper',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.UpperInfos',\n      '10': 'upper'\n    },\n    {'1': 'is_follow_display', '3': 7, '4': 1, '5': 5, '10': 'isFollowDisplay'},\n    {\n      '1': 'text',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.ContractText',\n      '10': 'text'\n    },\n    {\n      '1': 'follow_display_end_duration',\n      '3': 9,\n      '4': 1,\n      '5': 3,\n      '10': 'followDisplayEndDuration'\n    },\n    {'1': 'is_play_display', '3': 10, '4': 1, '5': 5, '10': 'isPlayDisplay'},\n    {\n      '1': 'is_interact_display',\n      '3': 11,\n      '4': 1,\n      '5': 5,\n      '10': 'isInteractDisplay'\n    },\n    {\n      '1': 'play_display_switch',\n      '3': 12,\n      '4': 1,\n      '5': 8,\n      '10': 'playDisplaySwitch'\n    },\n  ],\n};\n\n/// Descriptor for `ContractCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List contractCardDescriptor = $convert.base64Decode(\n    'CgxDb250cmFjdENhcmQSKQoQZGlzcGxheV9wcm9ncmVzcxgBIAEoAlIPZGlzcGxheVByb2dyZX'\n    'NzEikKEGRpc3BsYXlfYWNjdXJhY3kYAiABKANSD2Rpc3BsYXlBY2N1cmFjeRIpChBkaXNwbGF5'\n    'X2R1cmF0aW9uGAMgASgDUg9kaXNwbGF5RHVyYXRpb24SGwoJc2hvd19tb2RlGAQgASgFUghzaG'\n    '93TW9kZRIbCglwYWdlX3R5cGUYBSABKAVSCHBhZ2VUeXBlEjsKBXVwcGVyGAYgASgLMiUuYmls'\n    'aWJpbGkuYXBwLnZpZXd1bml0ZS52MS5VcHBlckluZm9zUgV1cHBlchIqChFpc19mb2xsb3dfZG'\n    'lzcGxheRgHIAEoBVIPaXNGb2xsb3dEaXNwbGF5EjsKBHRleHQYCCABKAsyJy5iaWxpYmlsaS5h'\n    'cHAudmlld3VuaXRlLnYxLkNvbnRyYWN0VGV4dFIEdGV4dBI9Chtmb2xsb3dfZGlzcGxheV9lbm'\n    'RfZHVyYXRpb24YCSABKANSGGZvbGxvd0Rpc3BsYXlFbmREdXJhdGlvbhImCg9pc19wbGF5X2Rp'\n    'c3BsYXkYCiABKAVSDWlzUGxheURpc3BsYXkSLgoTaXNfaW50ZXJhY3RfZGlzcGxheRgLIAEoBV'\n    'IRaXNJbnRlcmFjdERpc3BsYXkSLgoTcGxheV9kaXNwbGF5X3N3aXRjaBgMIAEoCFIRcGxheURp'\n    'c3BsYXlTd2l0Y2g=');\n\n@$core.Deprecated('Use contractTextDescriptor instead')\nconst ContractText$json = {\n  '1': 'ContractText',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'subtitle', '3': 2, '4': 1, '5': 9, '10': 'subtitle'},\n    {'1': 'inline_title', '3': 3, '4': 1, '5': 9, '10': 'inlineTitle'},\n  ],\n};\n\n/// Descriptor for `ContractText`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List contractTextDescriptor = $convert.base64Decode(\n    'CgxDb250cmFjdFRleHQSFAoFdGl0bGUYASABKAlSBXRpdGxlEhoKCHN1YnRpdGxlGAIgASgJUg'\n    'hzdWJ0aXRsZRIhCgxpbmxpbmVfdGl0bGUYAyABKAlSC2lubGluZVRpdGxl');\n\n@$core.Deprecated('Use controlDescriptor instead')\nconst Control$json = {\n  '1': 'Control',\n  '2': [\n    {'1': 'limit', '3': 1, '4': 1, '5': 8, '10': 'limit'},\n  ],\n};\n\n/// Descriptor for `Control`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List controlDescriptor =\n    $convert.base64Decode('CgdDb250cm9sEhQKBWxpbWl0GAEgASgIUgVsaW1pdA==');\n\n@$core.Deprecated('Use dmResourceDescriptor instead')\nconst DmResource$json = {\n  '1': 'DmResource',\n  '2': [\n    {\n      '1': 'command_dms',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.CommandDm',\n      '10': 'commandDms'\n    },\n    {\n      '1': 'attention',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.AttentionCard',\n      '10': 'attention'\n    },\n    {\n      '1': 'cards',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.OperationCard',\n      '10': 'cards'\n    },\n  ],\n};\n\n/// Descriptor for `DmResource`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dmResourceDescriptor = $convert.base64Decode(\n    'CgpEbVJlc291cmNlEkUKC2NvbW1hbmRfZG1zGAEgAygLMiQuYmlsaWJpbGkuYXBwLnZpZXd1bm'\n    'l0ZS52MS5Db21tYW5kRG1SCmNvbW1hbmREbXMSRgoJYXR0ZW50aW9uGAIgASgLMiguYmlsaWJp'\n    'bGkuYXBwLnZpZXd1bml0ZS52MS5BdHRlbnRpb25DYXJkUglhdHRlbnRpb24SPgoFY2FyZHMYAy'\n    'ADKAsyKC5iaWxpYmlsaS5hcHAudmlld3VuaXRlLnYxLk9wZXJhdGlvbkNhcmRSBWNhcmRz');\n\n@$core.Deprecated('Use eCodeConfigDescriptor instead')\nconst ECodeConfig$json = {\n  '1': 'ECodeConfig',\n  '2': [\n    {'1': 'redirect_url', '3': 1, '4': 1, '5': 9, '10': 'redirectUrl'},\n    {'1': 'msg', '3': 2, '4': 1, '5': 9, '10': 'msg'},\n  ],\n};\n\n/// Descriptor for `ECodeConfig`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List eCodeConfigDescriptor = $convert.base64Decode(\n    'CgtFQ29kZUNvbmZpZxIhCgxyZWRpcmVjdF91cmwYASABKAlSC3JlZGlyZWN0VXJsEhAKA21zZx'\n    'gCIAEoCVIDbXNn');\n\n@$core.Deprecated('Use floorAdSearchItemDescriptor instead')\nconst FloorAdSearchItem$json = {\n  '1': 'FloorAdSearchItem',\n  '2': [\n    {\n      '1': 'source_content',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.google.protobuf.Any',\n      '10': 'sourceContent'\n    },\n  ],\n};\n\n/// Descriptor for `FloorAdSearchItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List floorAdSearchItemDescriptor = $convert.base64Decode(\n    'ChFGbG9vckFkU2VhcmNoSXRlbRI7Cg5zb3VyY2VfY29udGVudBgBIAEoCzIULmdvb2dsZS5wcm'\n    '90b2J1Zi5BbnlSDXNvdXJjZUNvbnRlbnQ=');\n\n@$core.Deprecated('Use floorAdSearchReplyDescriptor instead')\nconst FloorAdSearchReply$json = {\n  '1': 'FloorAdSearchReply',\n  '2': [\n    {\n      '1': 'tab',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.FloorAdSearchTab',\n      '10': 'tab'\n    },\n    {\n      '1': 'item',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.FloorAdSearchItem',\n      '10': 'item'\n    },\n  ],\n};\n\n/// Descriptor for `FloorAdSearchReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List floorAdSearchReplyDescriptor = $convert.base64Decode(\n    'ChJGbG9vckFkU2VhcmNoUmVwbHkSPQoDdGFiGAEgASgLMisuYmlsaWJpbGkuYXBwLnZpZXd1bm'\n    'l0ZS52MS5GbG9vckFkU2VhcmNoVGFiUgN0YWISQAoEaXRlbRgDIAMoCzIsLmJpbGliaWxpLmFw'\n    'cC52aWV3dW5pdGUudjEuRmxvb3JBZFNlYXJjaEl0ZW1SBGl0ZW0=');\n\n@$core.Deprecated('Use floorAdSearchReqDescriptor instead')\nconst FloorAdSearchReq$json = {\n  '1': 'FloorAdSearchReq',\n  '2': [\n    {'1': 'aid', '3': 1, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'ad_extra', '3': 2, '4': 1, '5': 9, '10': 'adExtra'},\n    {'1': 'spmid', '3': 3, '4': 1, '5': 9, '10': 'spmid'},\n    {'1': 'from_spmid', '3': 4, '4': 1, '5': 9, '10': 'fromSpmid'},\n  ],\n};\n\n/// Descriptor for `FloorAdSearchReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List floorAdSearchReqDescriptor = $convert.base64Decode(\n    'ChBGbG9vckFkU2VhcmNoUmVxEhAKA2FpZBgBIAEoA1IDYWlkEhkKCGFkX2V4dHJhGAIgASgJUg'\n    'dhZEV4dHJhEhQKBXNwbWlkGAMgASgJUgVzcG1pZBIdCgpmcm9tX3NwbWlkGAQgASgJUglmcm9t'\n    'U3BtaWQ=');\n\n@$core.Deprecated('Use floorAdSearchTabDescriptor instead')\nconst FloorAdSearchTab$json = {\n  '1': 'FloorAdSearchTab',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'but_title', '3': 2, '4': 1, '5': 9, '10': 'butTitle'},\n    {'1': 'but_url', '3': 3, '4': 1, '5': 9, '10': 'butUrl'},\n  ],\n};\n\n/// Descriptor for `FloorAdSearchTab`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List floorAdSearchTabDescriptor = $convert.base64Decode(\n    'ChBGbG9vckFkU2VhcmNoVGFiEhQKBXRpdGxlGAEgASgJUgV0aXRsZRIbCglidXRfdGl0bGUYAi'\n    'ABKAlSCGJ1dFRpdGxlEhcKB2J1dF91cmwYAyABKAlSBmJ1dFVybA==');\n\n@$core.Deprecated('Use fragmentArcDescriptor instead')\nconst FragmentArc$json = {\n  '1': 'FragmentArc',\n  '2': [\n    {'1': 'aid', '3': 1, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'cid', '3': 2, '4': 1, '5': 3, '10': 'cid'},\n  ],\n};\n\n/// Descriptor for `FragmentArc`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List fragmentArcDescriptor = $convert.base64Decode(\n    'CgtGcmFnbWVudEFyYxIQCgNhaWQYASABKANSA2FpZBIQCgNjaWQYAiABKANSA2NpZA==');\n\n@$core.Deprecated('Use fragmentParamDescriptor instead')\nconst FragmentParam$json = {\n  '1': 'FragmentParam',\n  '2': [\n    {\n      '1': 'fragment_arcs',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.FragmentArc',\n      '10': 'fragmentArcs'\n    },\n  ],\n};\n\n/// Descriptor for `FragmentParam`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List fragmentParamDescriptor = $convert.base64Decode(\n    'Cg1GcmFnbWVudFBhcmFtEksKDWZyYWdtZW50X2FyY3MYASADKAsyJi5iaWxpYmlsaS5hcHAudm'\n    'lld3VuaXRlLnYxLkZyYWdtZW50QXJjUgxmcmFnbWVudEFyY3M=');\n\n@$core.Deprecated('Use fragmentResDescriptor instead')\nconst FragmentRes$json = {\n  '1': 'FragmentRes',\n  '2': [\n    {\n      '1': 'video_shot',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.FragmentRes.VideoShotEntry',\n      '10': 'videoShot'\n    },\n  ],\n  '3': [FragmentRes_VideoShotEntry$json],\n};\n\n@$core.Deprecated('Use fragmentResDescriptor instead')\nconst FragmentRes_VideoShotEntry$json = {\n  '1': 'VideoShotEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 3, '10': 'key'},\n    {\n      '1': 'value',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.VideoShot',\n      '10': 'value'\n    },\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `FragmentRes`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List fragmentResDescriptor = $convert.base64Decode(\n    'CgtGcmFnbWVudFJlcxJUCgp2aWRlb19zaG90GAEgAygLMjUuYmlsaWJpbGkuYXBwLnZpZXd1bm'\n    'l0ZS52MS5GcmFnbWVudFJlcy5WaWRlb1Nob3RFbnRyeVIJdmlkZW9TaG90GmIKDlZpZGVvU2hv'\n    'dEVudHJ5EhAKA2tleRgBIAEoA1IDa2V5EjoKBXZhbHVlGAIgASgLMiQuYmlsaWJpbGkuYXBwLn'\n    'ZpZXd1bml0ZS52MS5WaWRlb1Nob3RSBXZhbHVlOgI4AQ==');\n\n@$core.Deprecated('Use iconDataDescriptor instead')\nconst IconData$json = {\n  '1': 'IconData',\n  '2': [\n    {'1': 'meta_json', '3': 1, '4': 1, '5': 9, '10': 'metaJson'},\n    {'1': 'sprits_img', '3': 2, '4': 1, '5': 9, '10': 'spritsImg'},\n  ],\n};\n\n/// Descriptor for `IconData`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List iconDataDescriptor = $convert.base64Decode(\n    'CghJY29uRGF0YRIbCgltZXRhX2pzb24YASABKAlSCG1ldGFKc29uEh0KCnNwcml0c19pbWcYAi'\n    'ABKAlSCXNwcml0c0ltZw==');\n\n@$core.Deprecated('Use introductionTabDescriptor instead')\nconst IntroductionTab$json = {\n  '1': 'IntroductionTab',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'modules',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Module',\n      '10': 'modules'\n    },\n  ],\n};\n\n/// Descriptor for `IntroductionTab`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List introductionTabDescriptor = $convert.base64Decode(\n    'Cg9JbnRyb2R1Y3Rpb25UYWISFAoFdGl0bGUYASABKAlSBXRpdGxlEj8KB21vZHVsZXMYAiADKA'\n    'syJS5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5Nb2R1bGVSB21vZHVsZXM=');\n\n@$core.Deprecated('Use likeConfigDescriptor instead')\nconst LikeConfig$json = {\n  '1': 'LikeConfig',\n  '2': [\n    {\n      '1': 'triple_like',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.UpLikeImg',\n      '10': 'tripleLike'\n    },\n    {'1': 'like_animation', '3': 2, '4': 1, '5': 9, '10': 'likeAnimation'},\n  ],\n};\n\n/// Descriptor for `LikeConfig`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List likeConfigDescriptor = $convert.base64Decode(\n    'CgpMaWtlQ29uZmlnEkkKC3RyaXBsZV9saWtlGAEgASgLMiguYmlsaWJpbGkuYXBwLnZpZXd1bm'\n    'l0ZS5jb21tb24uVXBMaWtlSW1nUgp0cmlwbGVMaWtlEiUKDmxpa2VfYW5pbWF0aW9uGAIgASgJ'\n    'Ug1saWtlQW5pbWF0aW9u');\n\n@$core.Deprecated('Use materialDescriptor instead')\nconst Material$json = {\n  '1': 'Material',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'url', '3': 3, '4': 1, '5': 9, '10': 'url'},\n    {\n      '1': 'type',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.v1.MaterialBizType',\n      '10': 'type'\n    },\n    {'1': 'param', '3': 5, '4': 1, '5': 9, '10': 'param'},\n    {'1': 'static_icon', '3': 6, '4': 1, '5': 9, '10': 'staticIcon'},\n    {'1': 'bg_color', '3': 7, '4': 1, '5': 9, '10': 'bgColor'},\n    {'1': 'bg_pic', '3': 8, '4': 1, '5': 9, '10': 'bgPic'},\n    {'1': 'jump_type', '3': 9, '4': 1, '5': 5, '10': 'jumpType'},\n    {\n      '1': 'page_type',\n      '3': 10,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.v1.PageType',\n      '10': 'pageType'\n    },\n    {'1': 'need_login', '3': 11, '4': 1, '5': 8, '10': 'needLogin'},\n    {\n      '1': 'report',\n      '3': 12,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.Material.ReportEntry',\n      '10': 'report'\n    },\n  ],\n  '3': [Material_ReportEntry$json],\n};\n\n@$core.Deprecated('Use materialDescriptor instead')\nconst Material_ReportEntry$json = {\n  '1': 'ReportEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `Material`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List materialDescriptor = $convert.base64Decode(\n    'CghNYXRlcmlhbBISCgRpY29uGAEgASgJUgRpY29uEhIKBHRleHQYAiABKAlSBHRleHQSEAoDdX'\n    'JsGAMgASgJUgN1cmwSPgoEdHlwZRgEIAEoDjIqLmJpbGliaWxpLmFwcC52aWV3dW5pdGUudjEu'\n    'TWF0ZXJpYWxCaXpUeXBlUgR0eXBlEhQKBXBhcmFtGAUgASgJUgVwYXJhbRIfCgtzdGF0aWNfaW'\n    'NvbhgGIAEoCVIKc3RhdGljSWNvbhIZCghiZ19jb2xvchgHIAEoCVIHYmdDb2xvchIVCgZiZ19w'\n    'aWMYCCABKAlSBWJnUGljEhsKCWp1bXBfdHlwZRgJIAEoBVIIanVtcFR5cGUSQAoJcGFnZV90eX'\n    'BlGAogASgOMiMuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS52MS5QYWdlVHlwZVIIcGFnZVR5cGUS'\n    'HQoKbmVlZF9sb2dpbhgLIAEoCFIJbmVlZExvZ2luEkcKBnJlcG9ydBgMIAMoCzIvLmJpbGliaW'\n    'xpLmFwcC52aWV3dW5pdGUudjEuTWF0ZXJpYWwuUmVwb3J0RW50cnlSBnJlcG9ydBo5CgtSZXBv'\n    'cnRFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgB');\n\n@$core.Deprecated('Use oldFanDescriptor instead')\nconst OldFan$json = {\n  '1': 'OldFan',\n  '2': [\n    {'1': 'is_follow_display', '3': 1, '4': 1, '5': 5, '10': 'isFollowDisplay'},\n    {'1': 'wing_pic', '3': 2, '4': 1, '5': 9, '10': 'wingPic'},\n  ],\n};\n\n/// Descriptor for `OldFan`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List oldFanDescriptor = $convert.base64Decode(\n    'CgZPbGRGYW4SKgoRaXNfZm9sbG93X2Rpc3BsYXkYASABKAVSD2lzRm9sbG93RGlzcGxheRIZCg'\n    'h3aW5nX3BpYxgCIAEoCVIHd2luZ1BpYw==');\n\n@$core.Deprecated('Use onlineDescriptor instead')\nconst Online$json = {\n  '1': 'Online',\n  '2': [\n    {'1': 'online_show', '3': 1, '4': 1, '5': 8, '10': 'onlineShow'},\n  ],\n};\n\n/// Descriptor for `Online`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List onlineDescriptor = $convert\n    .base64Decode('CgZPbmxpbmUSHwoLb25saW5lX3Nob3cYASABKAhSCm9ubGluZVNob3c=');\n\n@$core.Deprecated('Use operationCardDescriptor instead')\nconst OperationCard$json = {\n  '1': 'OperationCard',\n  '2': [\n    {\n      '1': 'follow',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.BizFollowVideoParam',\n      '9': 0,\n      '10': 'follow'\n    },\n    {\n      '1': 'reserve',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.BizReserveActivityParam',\n      '9': 0,\n      '10': 'reserve'\n    },\n    {\n      '1': 'jump',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.BizJumpLinkParam',\n      '9': 0,\n      '10': 'jump'\n    },\n    {\n      '1': 'game',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.BizReserveGameParam',\n      '9': 0,\n      '10': 'game'\n    },\n    {\n      '1': 'game_backflow',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.BizGameBackflowParam',\n      '9': 0,\n      '10': 'gameBackflow'\n    },\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'from', '3': 2, '4': 1, '5': 5, '10': 'from'},\n    {'1': 'to', '3': 3, '4': 1, '5': 5, '10': 'to'},\n    {'1': 'status', '3': 4, '4': 1, '5': 8, '10': 'status'},\n    {\n      '1': 'biz_type',\n      '3': 5,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.v1.BizType',\n      '10': 'bizType'\n    },\n    {\n      '1': 'content',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.OperationCardContent',\n      '10': 'content'\n    },\n  ],\n  '8': [\n    {'1': 'param'},\n  ],\n};\n\n/// Descriptor for `OperationCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List operationCardDescriptor = $convert.base64Decode(\n    'Cg1PcGVyYXRpb25DYXJkEkgKBmZvbGxvdxgHIAEoCzIuLmJpbGliaWxpLmFwcC52aWV3dW5pdG'\n    'UudjEuQml6Rm9sbG93VmlkZW9QYXJhbUgAUgZmb2xsb3cSTgoHcmVzZXJ2ZRgIIAEoCzIyLmJp'\n    'bGliaWxpLmFwcC52aWV3dW5pdGUudjEuQml6UmVzZXJ2ZUFjdGl2aXR5UGFyYW1IAFIHcmVzZX'\n    'J2ZRJBCgRqdW1wGAkgASgLMisuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS52MS5CaXpKdW1wTGlu'\n    'a1BhcmFtSABSBGp1bXASRAoEZ2FtZRgKIAEoCzIuLmJpbGliaWxpLmFwcC52aWV3dW5pdGUudj'\n    'EuQml6UmVzZXJ2ZUdhbWVQYXJhbUgAUgRnYW1lElYKDWdhbWVfYmFja2Zsb3cYCyABKAsyLy5i'\n    'aWxpYmlsaS5hcHAudmlld3VuaXRlLnYxLkJpekdhbWVCYWNrZmxvd1BhcmFtSABSDGdhbWVCYW'\n    'NrZmxvdxIOCgJpZBgBIAEoA1ICaWQSEgoEZnJvbRgCIAEoBVIEZnJvbRIOCgJ0bxgDIAEoBVIC'\n    'dG8SFgoGc3RhdHVzGAQgASgIUgZzdGF0dXMSPQoIYml6X3R5cGUYBSABKA4yIi5iaWxpYmlsaS'\n    '5hcHAudmlld3VuaXRlLnYxLkJpelR5cGVSB2JpelR5cGUSSQoHY29udGVudBgGIAEoCzIvLmJp'\n    'bGliaWxpLmFwcC52aWV3dW5pdGUudjEuT3BlcmF0aW9uQ2FyZENvbnRlbnRSB2NvbnRlbnRCBw'\n    'oFcGFyYW0=');\n\n@$core.Deprecated('Use operationCardContentDescriptor instead')\nconst OperationCardContent$json = {\n  '1': 'OperationCardContent',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'subtitle', '3': 2, '4': 1, '5': 9, '10': 'subtitle'},\n    {'1': 'icon', '3': 3, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'button_title', '3': 4, '4': 1, '5': 9, '10': 'buttonTitle'},\n    {\n      '1': 'button_selected_title',\n      '3': 5,\n      '4': 1,\n      '5': 9,\n      '10': 'buttonSelectedTitle'\n    },\n    {'1': 'show_selected', '3': 6, '4': 1, '5': 8, '10': 'showSelected'},\n  ],\n};\n\n/// Descriptor for `OperationCardContent`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List operationCardContentDescriptor = $convert.base64Decode(\n    'ChRPcGVyYXRpb25DYXJkQ29udGVudBIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSGgoIc3VidGl0bG'\n    'UYAiABKAlSCHN1YnRpdGxlEhIKBGljb24YAyABKAlSBGljb24SIQoMYnV0dG9uX3RpdGxlGAQg'\n    'ASgJUgtidXR0b25UaXRsZRIyChVidXR0b25fc2VsZWN0ZWRfdGl0bGUYBSABKAlSE2J1dHRvbl'\n    'NlbGVjdGVkVGl0bGUSIwoNc2hvd19zZWxlY3RlZBgGIAEoCFIMc2hvd1NlbGVjdGVk');\n\n@$core.Deprecated('Use padRelateCMDescriptor instead')\nconst PadRelateCM$json = {\n  '1': 'PadRelateCM',\n  '2': [\n    {\n      '1': 'cm',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.RelateCM',\n      '10': 'cm'\n    },\n  ],\n};\n\n/// Descriptor for `PadRelateCM`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List padRelateCMDescriptor = $convert.base64Decode(\n    'CgtQYWRSZWxhdGVDTRIzCgJjbRgBIAEoCzIjLmJpbGliaWxpLmFwcC52aWV3dW5pdGUudjEuUm'\n    'VsYXRlQ01SAmNt');\n\n@$core.Deprecated('Use pageControlDescriptor instead')\nconst PageControl$json = {\n  '1': 'PageControl',\n  '2': [\n    {\n      '1': 'toast_show',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.Control',\n      '10': 'toastShow'\n    },\n    {\n      '1': 'material_show',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.Control',\n      '10': 'materialShow'\n    },\n    {\n      '1': 'up_show',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.Control',\n      '10': 'upShow'\n    },\n  ],\n};\n\n/// Descriptor for `PageControl`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pageControlDescriptor = $convert.base64Decode(\n    'CgtQYWdlQ29udHJvbBJBCgp0b2FzdF9zaG93GAEgASgLMiIuYmlsaWJpbGkuYXBwLnZpZXd1bm'\n    'l0ZS52MS5Db250cm9sUgl0b2FzdFNob3cSRwoNbWF0ZXJpYWxfc2hvdxgCIAEoCzIiLmJpbGli'\n    'aWxpLmFwcC52aWV3dW5pdGUudjEuQ29udHJvbFIMbWF0ZXJpYWxTaG93EjsKB3VwX3Nob3cYAy'\n    'ABKAsyIi5iaWxpYmlsaS5hcHAudmlld3VuaXRlLnYxLkNvbnRyb2xSBnVwU2hvdw==');\n\n@$core.Deprecated('Use playListReqParamDescriptor instead')\nconst PlayListReqParam$json = {\n  '1': 'PlayListReqParam',\n  '2': [\n    {'1': 'media_id', '3': 1, '4': 1, '5': 3, '10': 'mediaId'},\n    {'1': 'biz_id', '3': 2, '4': 1, '5': 3, '10': 'bizId'},\n    {'1': 'type', '3': 3, '4': 1, '5': 3, '10': 'type'},\n    {'1': 'page_direction', '3': 4, '4': 1, '5': 8, '10': 'pageDirection'},\n    {'1': 'first_page', '3': 5, '4': 1, '5': 8, '10': 'firstPage'},\n    {'1': 'offset', '3': 6, '4': 1, '5': 3, '10': 'offset'},\n    {'1': 'sort_desc', '3': 7, '4': 1, '5': 3, '10': 'sortDesc'},\n    {'1': 'sort_field', '3': 8, '4': 1, '5': 3, '10': 'sortField'},\n  ],\n};\n\n/// Descriptor for `PlayListReqParam`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playListReqParamDescriptor = $convert.base64Decode(\n    'ChBQbGF5TGlzdFJlcVBhcmFtEhkKCG1lZGlhX2lkGAEgASgDUgdtZWRpYUlkEhUKBmJpel9pZB'\n    'gCIAEoA1IFYml6SWQSEgoEdHlwZRgDIAEoA1IEdHlwZRIlCg5wYWdlX2RpcmVjdGlvbhgEIAEo'\n    'CFINcGFnZURpcmVjdGlvbhIdCgpmaXJzdF9wYWdlGAUgASgIUglmaXJzdFBhZ2USFgoGb2Zmc2'\n    'V0GAYgASgDUgZvZmZzZXQSGwoJc29ydF9kZXNjGAcgASgDUghzb3J0RGVzYxIdCgpzb3J0X2Zp'\n    'ZWxkGAggASgDUglzb3J0RmllbGQ=');\n\n@$core.Deprecated('Use playToastDescriptor instead')\nconst PlayToast$json = {\n  '1': 'PlayToast',\n  '2': [\n    {\n      '1': 'business',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.v1.PlayToastEnum',\n      '10': 'business'\n    },\n    {'1': 'icon_url', '3': 2, '4': 1, '5': 9, '10': 'iconUrl'},\n    {'1': 'text', '3': 3, '4': 1, '5': 9, '10': 'text'},\n  ],\n};\n\n/// Descriptor for `PlayToast`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playToastDescriptor = $convert.base64Decode(\n    'CglQbGF5VG9hc3QSRAoIYnVzaW5lc3MYASABKA4yKC5iaWxpYmlsaS5hcHAudmlld3VuaXRlLn'\n    'YxLlBsYXlUb2FzdEVudW1SCGJ1c2luZXNzEhkKCGljb25fdXJsGAIgASgJUgdpY29uVXJsEhIK'\n    'BHRleHQYAyABKAlSBHRleHQ=');\n\n@$core.Deprecated('Use playerIconDescriptor instead')\nconst PlayerIcon$json = {\n  '1': 'PlayerIcon',\n  '2': [\n    {'1': 'url1', '3': 1, '4': 1, '5': 9, '10': 'url1'},\n    {'1': 'hash1', '3': 2, '4': 1, '5': 9, '10': 'hash1'},\n    {'1': 'url2', '3': 3, '4': 1, '5': 9, '10': 'url2'},\n    {'1': 'hash2', '3': 4, '4': 1, '5': 9, '10': 'hash2'},\n    {'1': 'drag_left_png', '3': 5, '4': 1, '5': 9, '10': 'dragLeftPng'},\n    {'1': 'middle_png', '3': 6, '4': 1, '5': 9, '10': 'middlePng'},\n    {'1': 'drag_right_png', '3': 7, '4': 1, '5': 9, '10': 'dragRightPng'},\n    {\n      '1': 'drag_data',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.IconData',\n      '10': 'dragData'\n    },\n    {\n      '1': 'nodrag_data',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.IconData',\n      '10': 'nodragData'\n    },\n  ],\n};\n\n/// Descriptor for `PlayerIcon`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playerIconDescriptor = $convert.base64Decode(\n    'CgpQbGF5ZXJJY29uEhIKBHVybDEYASABKAlSBHVybDESFAoFaGFzaDEYAiABKAlSBWhhc2gxEh'\n    'IKBHVybDIYAyABKAlSBHVybDISFAoFaGFzaDIYBCABKAlSBWhhc2gyEiIKDWRyYWdfbGVmdF9w'\n    'bmcYBSABKAlSC2RyYWdMZWZ0UG5nEh0KCm1pZGRsZV9wbmcYBiABKAlSCW1pZGRsZVBuZxIkCg'\n    '5kcmFnX3JpZ2h0X3BuZxgHIAEoCVIMZHJhZ1JpZ2h0UG5nEkAKCWRyYWdfZGF0YRgIIAEoCzIj'\n    'LmJpbGliaWxpLmFwcC52aWV3dW5pdGUudjEuSWNvbkRhdGFSCGRyYWdEYXRhEkQKC25vZHJhZ1'\n    '9kYXRhGAkgASgLMiMuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS52MS5JY29uRGF0YVIKbm9kcmFn'\n    'RGF0YQ==');\n\n@$core.Deprecated('Use pointMaterialDescriptor instead')\nconst PointMaterial$json = {\n  '1': 'PointMaterial',\n  '2': [\n    {'1': 'url', '3': 1, '4': 1, '5': 9, '10': 'url'},\n    {\n      '1': 'material_source',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.v1.MaterialSource',\n      '10': 'materialSource'\n    },\n  ],\n};\n\n/// Descriptor for `PointMaterial`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pointMaterialDescriptor = $convert.base64Decode(\n    'Cg1Qb2ludE1hdGVyaWFsEhAKA3VybBgBIAEoCVIDdXJsElIKD21hdGVyaWFsX3NvdXJjZRgCIA'\n    'EoDjIpLmJpbGliaWxpLmFwcC52aWV3dW5pdGUudjEuTWF0ZXJpYWxTb3VyY2VSDm1hdGVyaWFs'\n    'U291cmNl');\n\n@$core.Deprecated('Use relateDescriptor instead')\nconst Relate$json = {\n  '1': 'Relate',\n  '2': [\n    {'1': 'device_type', '3': 1, '4': 1, '5': 3, '10': 'deviceType'},\n    {\n      '1': 'pagination',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.pagination.Pagination',\n      '10': 'pagination'\n    },\n  ],\n};\n\n/// Descriptor for `Relate`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List relateDescriptor = $convert.base64Decode(\n    'CgZSZWxhdGUSHwoLZGV2aWNlX3R5cGUYASABKANSCmRldmljZVR5cGUSPwoKcGFnaW5hdGlvbh'\n    'gCIAEoCzIfLmJpbGliaWxpLnBhZ2luYXRpb24uUGFnaW5hdGlvblIKcGFnaW5hdGlvbg==');\n\n@$core.Deprecated('Use relateCMDescriptor instead')\nconst RelateCM$json = {\n  '1': 'RelateCM',\n  '2': [\n    {'1': 'aid', '3': 1, '4': 1, '5': 3, '10': 'aid'},\n    {\n      '1': 'source_content',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.google.protobuf.Any',\n      '10': 'sourceContent'\n    },\n    {'1': 'duration', '3': 3, '4': 1, '5': 3, '10': 'duration'},\n    {\n      '1': 'stat',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Stat',\n      '10': 'stat'\n    },\n    {\n      '1': 'owner',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Owner',\n      '10': 'owner'\n    },\n  ],\n};\n\n/// Descriptor for `RelateCM`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List relateCMDescriptor = $convert.base64Decode(\n    'CghSZWxhdGVDTRIQCgNhaWQYASABKANSA2FpZBI7Cg5zb3VyY2VfY29udGVudBgCIAEoCzIULm'\n    'dvb2dsZS5wcm90b2J1Zi5BbnlSDXNvdXJjZUNvbnRlbnQSGgoIZHVyYXRpb24YAyABKANSCGR1'\n    'cmF0aW9uEjcKBHN0YXQYBCABKAsyIy5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5TdG'\n    'F0UgRzdGF0EjoKBW93bmVyGAUgASgLMiQuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS5jb21tb24u'\n    'T3duZXJSBW93bmVy');\n\n@$core.Deprecated('Use relatesFeedReplyDescriptor instead')\nconst RelatesFeedReply$json = {\n  '1': 'RelatesFeedReply',\n  '2': [\n    {\n      '1': 'relates',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.RelateCard',\n      '10': 'relates'\n    },\n    {\n      '1': 'pagination',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.pagination.Pagination',\n      '10': 'pagination'\n    },\n  ],\n};\n\n/// Descriptor for `RelatesFeedReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List relatesFeedReplyDescriptor = $convert.base64Decode(\n    'ChBSZWxhdGVzRmVlZFJlcGx5EkMKB3JlbGF0ZXMYASADKAsyKS5iaWxpYmlsaS5hcHAudmlld3'\n    'VuaXRlLmNvbW1vbi5SZWxhdGVDYXJkUgdyZWxhdGVzEj8KCnBhZ2luYXRpb24YAiABKAsyHy5i'\n    'aWxpYmlsaS5wYWdpbmF0aW9uLlBhZ2luYXRpb25SCnBhZ2luYXRpb24=');\n\n@$core.Deprecated('Use relatesFeedReqDescriptor instead')\nconst RelatesFeedReq$json = {\n  '1': 'RelatesFeedReq',\n  '2': [\n    {'1': 'aid', '3': 1, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'bvid', '3': 2, '4': 1, '5': 9, '10': 'bvid'},\n    {'1': 'from', '3': 3, '4': 1, '5': 9, '10': 'from'},\n    {'1': 'spmid', '3': 4, '4': 1, '5': 9, '10': 'spmid'},\n    {'1': 'from_spmid', '3': 5, '4': 1, '5': 9, '10': 'fromSpmid'},\n    {\n      '1': 'player_args',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n    {\n      '1': 'pagination',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.pagination.Pagination',\n      '10': 'pagination'\n    },\n    {'1': 'session_id', '3': 8, '4': 1, '5': 9, '10': 'sessionId'},\n    {'1': 'auto_play', '3': 9, '4': 1, '5': 3, '10': 'autoPlay'},\n    {'1': 'from_track_id', '3': 10, '4': 1, '5': 9, '10': 'fromTrackId'},\n    {'1': 'biz_extra', '3': 11, '4': 1, '5': 9, '10': 'bizExtra'},\n    {'1': 'ad_extra', '3': 12, '4': 1, '5': 9, '10': 'adExtra'},\n    {'1': 'tab_category', '3': 13, '4': 1, '5': 3, '10': 'tabCategory'},\n    {\n      '1': 'tab_category_name',\n      '3': 14,\n      '4': 1,\n      '5': 9,\n      '10': 'tabCategoryName'\n    },\n  ],\n};\n\n/// Descriptor for `RelatesFeedReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List relatesFeedReqDescriptor = $convert.base64Decode(\n    'Cg5SZWxhdGVzRmVlZFJlcRIQCgNhaWQYASABKANSA2FpZBISCgRidmlkGAIgASgJUgRidmlkEh'\n    'IKBGZyb20YAyABKAlSBGZyb20SFAoFc3BtaWQYBCABKAlSBXNwbWlkEh0KCmZyb21fc3BtaWQY'\n    'BSABKAlSCWZyb21TcG1pZBJPCgtwbGF5ZXJfYXJncxgGIAEoCzIuLmJpbGliaWxpLmFwcC5hcm'\n    'NoaXZlLm1pZGRsZXdhcmUudjEuUGxheWVyQXJnc1IKcGxheWVyQXJncxI/CgpwYWdpbmF0aW9u'\n    'GAcgASgLMh8uYmlsaWJpbGkucGFnaW5hdGlvbi5QYWdpbmF0aW9uUgpwYWdpbmF0aW9uEh0KCn'\n    'Nlc3Npb25faWQYCCABKAlSCXNlc3Npb25JZBIbCglhdXRvX3BsYXkYCSABKANSCGF1dG9QbGF5'\n    'EiIKDWZyb21fdHJhY2tfaWQYCiABKAlSC2Zyb21UcmFja0lkEhsKCWJpel9leHRyYRgLIAEoCV'\n    'IIYml6RXh0cmESGQoIYWRfZXh0cmEYDCABKAlSB2FkRXh0cmESIQoMdGFiX2NhdGVnb3J5GA0g'\n    'ASgDUgt0YWJDYXRlZ29yeRIqChF0YWJfY2F0ZWdvcnlfbmFtZRgOIAEoCVIPdGFiQ2F0ZWdvcn'\n    'lOYW1l');\n\n@$core.Deprecated('Use replyStyleDescriptor instead')\nconst ReplyStyle$json = {\n  '1': 'ReplyStyle',\n  '2': [\n    {'1': 'badge_url', '3': 1, '4': 1, '5': 9, '10': 'badgeUrl'},\n    {'1': 'badge_text', '3': 2, '4': 1, '5': 9, '10': 'badgeText'},\n    {'1': 'badge_type', '3': 3, '4': 1, '5': 3, '10': 'badgeType'},\n  ],\n};\n\n/// Descriptor for `ReplyStyle`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List replyStyleDescriptor = $convert.base64Decode(\n    'CgpSZXBseVN0eWxlEhsKCWJhZGdlX3VybBgBIAEoCVIIYmFkZ2VVcmwSHQoKYmFkZ2VfdGV4dB'\n    'gCIAEoCVIJYmFkZ2VUZXh0Eh0KCmJhZGdlX3R5cGUYAyABKANSCWJhZGdlVHlwZQ==');\n\n@$core.Deprecated('Use replyTabDescriptor instead')\nconst ReplyTab$json = {\n  '1': 'ReplyTab',\n  '2': [\n    {\n      '1': 'reply_style',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.ReplyStyle',\n      '10': 'replyStyle'\n    },\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'control',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.TabControl',\n      '10': 'control'\n    },\n  ],\n};\n\n/// Descriptor for `ReplyTab`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List replyTabDescriptor = $convert.base64Decode(\n    'CghSZXBseVRhYhJGCgtyZXBseV9zdHlsZRgBIAEoCzIlLmJpbGliaWxpLmFwcC52aWV3dW5pdG'\n    'UudjEuUmVwbHlTdHlsZVIKcmVwbHlTdHlsZRIUCgV0aXRsZRgCIAEoCVIFdGl0bGUSPwoHY29u'\n    'dHJvbBgDIAEoCzIlLmJpbGliaWxpLmFwcC52aWV3dW5pdGUudjEuVGFiQ29udHJvbFIHY29udH'\n    'JvbA==');\n\n@$core.Deprecated('Use reqUserDescriptor instead')\nconst ReqUser$json = {\n  '1': 'ReqUser',\n  '2': [\n    {'1': 'favorite', '3': 1, '4': 1, '5': 5, '10': 'favorite'},\n    {'1': 'like', '3': 2, '4': 1, '5': 5, '10': 'like'},\n    {'1': 'coin', '3': 3, '4': 1, '5': 5, '10': 'coin'},\n    {'1': 'fav_season', '3': 4, '4': 1, '5': 5, '10': 'favSeason'},\n    {'1': 'follow', '3': 5, '4': 1, '5': 5, '10': 'follow'},\n    {'1': 'dislike', '3': 6, '4': 1, '5': 5, '10': 'dislike'},\n    {\n      '1': 'elec_plus_btn',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.Button',\n      '10': 'elecPlusBtn'\n    },\n    {\n      '1': 'charging_plus',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.ChargingPlus',\n      '10': 'chargingPlus'\n    },\n    {\n      '1': 'extra',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.ReqUserExtra',\n      '10': 'extra'\n    },\n    {'1': 'paid', '3': 10, '4': 1, '5': 5, '10': 'paid'},\n    {\n      '1': 'old_fan',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.OldFan',\n      '10': 'oldFan'\n    },\n  ],\n};\n\n/// Descriptor for `ReqUser`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqUserDescriptor = $convert.base64Decode(\n    'CgdSZXFVc2VyEhoKCGZhdm9yaXRlGAEgASgFUghmYXZvcml0ZRISCgRsaWtlGAIgASgFUgRsaW'\n    'tlEhIKBGNvaW4YAyABKAVSBGNvaW4SHQoKZmF2X3NlYXNvbhgEIAEoBVIJZmF2U2Vhc29uEhYK'\n    'BmZvbGxvdxgFIAEoBVIGZm9sbG93EhgKB2Rpc2xpa2UYBiABKAVSB2Rpc2xpa2USRQoNZWxlY1'\n    '9wbHVzX2J0bhgHIAEoCzIhLmJpbGliaWxpLmFwcC52aWV3dW5pdGUudjEuQnV0dG9uUgtlbGVj'\n    'UGx1c0J0bhJMCg1jaGFyZ2luZ19wbHVzGAggASgLMicuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS'\n    '52MS5DaGFyZ2luZ1BsdXNSDGNoYXJnaW5nUGx1cxI9CgVleHRyYRgJIAEoCzInLmJpbGliaWxp'\n    'LmFwcC52aWV3dW5pdGUudjEuUmVxVXNlckV4dHJhUgVleHRyYRISCgRwYWlkGAogASgFUgRwYW'\n    'lkEjoKB29sZF9mYW4YCyABKAsyIS5iaWxpYmlsaS5hcHAudmlld3VuaXRlLnYxLk9sZEZhblIG'\n    'b2xkRmFu');\n\n@$core.Deprecated('Use reqUserExtraDescriptor instead')\nconst ReqUserExtra$json = {\n  '1': 'ReqUserExtra',\n  '2': [\n    {'1': 'user_flag_new', '3': 1, '4': 1, '5': 8, '10': 'userFlagNew'},\n  ],\n};\n\n/// Descriptor for `ReqUserExtra`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqUserExtraDescriptor = $convert.base64Decode(\n    'CgxSZXFVc2VyRXh0cmESIgoNdXNlcl9mbGFnX25ldxgBIAEoCFILdXNlckZsYWdOZXc=');\n\n@$core.Deprecated('Use rightsDescriptor instead')\nconst Rights$json = {\n  '1': 'Rights',\n  '2': [\n    {'1': 'only_vip_download', '3': 1, '4': 1, '5': 8, '10': 'onlyVipDownload'},\n    {'1': 'no_reprint', '3': 2, '4': 1, '5': 8, '10': 'noReprint'},\n    {'1': 'download', '3': 3, '4': 1, '5': 8, '10': 'download'},\n    {'1': 'is_charging_pay', '3': 4, '4': 1, '5': 8, '10': 'isChargingPay'},\n  ],\n};\n\n/// Descriptor for `Rights`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rightsDescriptor = $convert.base64Decode(\n    'CgZSaWdodHMSKgoRb25seV92aXBfZG93bmxvYWQYASABKAhSD29ubHlWaXBEb3dubG9hZBIdCg'\n    'pub19yZXByaW50GAIgASgIUglub1JlcHJpbnQSGgoIZG93bmxvYWQYAyABKAhSCGRvd25sb2Fk'\n    'EiYKD2lzX2NoYXJnaW5nX3BheRgEIAEoCFINaXNDaGFyZ2luZ1BheQ==');\n\n@$core.Deprecated('Use showTimeDescriptor instead')\nconst ShowTime$json = {\n  '1': 'ShowTime',\n  '2': [\n    {'1': 'start_time', '3': 1, '4': 1, '5': 5, '10': 'startTime'},\n    {'1': 'end_time', '3': 2, '4': 1, '5': 5, '10': 'endTime'},\n    {'1': 'pos_x', '3': 3, '4': 1, '5': 1, '10': 'posX'},\n    {'1': 'pos_y', '3': 4, '4': 1, '5': 1, '10': 'posY'},\n  ],\n};\n\n/// Descriptor for `ShowTime`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List showTimeDescriptor = $convert.base64Decode(\n    'CghTaG93VGltZRIdCgpzdGFydF90aW1lGAEgASgFUglzdGFydFRpbWUSGQoIZW5kX3RpbWUYAi'\n    'ABKAVSB2VuZFRpbWUSEwoFcG9zX3gYAyABKAFSBHBvc1gSEwoFcG9zX3kYBCABKAFSBHBvc1k=');\n\n@$core.Deprecated('Use simpleArcDescriptor instead')\nconst SimpleArc$json = {\n  '1': 'SimpleArc',\n  '2': [\n    {'1': 'copyright', '3': 1, '4': 1, '5': 5, '10': 'copyright'},\n  ],\n};\n\n/// Descriptor for `SimpleArc`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List simpleArcDescriptor = $convert\n    .base64Decode('CglTaW1wbGVBcmMSHAoJY29weXJpZ2h0GAEgASgFUgljb3B5cmlnaHQ=');\n\n@$core.Deprecated('Use simpleOwnerDescriptor instead')\nconst SimpleOwner$json = {\n  '1': 'SimpleOwner',\n  '2': [\n    {\n      '1': 'attention_relation',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.common.AttentionRelationStatus',\n      '10': 'attentionRelation'\n    },\n  ],\n};\n\n/// Descriptor for `SimpleOwner`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List simpleOwnerDescriptor = $convert.base64Decode(\n    'CgtTaW1wbGVPd25lchJlChJhdHRlbnRpb25fcmVsYXRpb24YASABKA4yNi5iaWxpYmlsaS5hcH'\n    'Audmlld3VuaXRlLmNvbW1vbi5BdHRlbnRpb25SZWxhdGlvblN0YXR1c1IRYXR0ZW50aW9uUmVs'\n    'YXRpb24=');\n\n@$core.Deprecated('Use simpleReqUserDescriptor instead')\nconst SimpleReqUser$json = {\n  '1': 'SimpleReqUser',\n  '2': [\n    {'1': 'favorite', '3': 1, '4': 1, '5': 5, '10': 'favorite'},\n    {'1': 'like', '3': 2, '4': 1, '5': 5, '10': 'like'},\n    {'1': 'coin', '3': 3, '4': 1, '5': 5, '10': 'coin'},\n  ],\n};\n\n/// Descriptor for `SimpleReqUser`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List simpleReqUserDescriptor = $convert.base64Decode(\n    'Cg1TaW1wbGVSZXFVc2VyEhoKCGZhdm9yaXRlGAEgASgFUghmYXZvcml0ZRISCgRsaWtlGAIgAS'\n    'gFUgRsaWtlEhIKBGNvaW4YAyABKAVSBGNvaW4=');\n\n@$core.Deprecated('Use sourceContentAVDescriptor instead')\nconst SourceContentAV$json = {\n  '1': 'SourceContentAV',\n  '2': [\n    {'1': 'aid', '3': 1, '4': 1, '5': 3, '10': 'aid'},\n    {\n      '1': 'stat',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Stat',\n      '10': 'stat'\n    },\n  ],\n};\n\n/// Descriptor for `SourceContentAV`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sourceContentAVDescriptor = $convert.base64Decode(\n    'Cg9Tb3VyY2VDb250ZW50QVYSEAoDYWlkGAEgASgDUgNhaWQSNwoEc3RhdBgCIAEoCzIjLmJpbG'\n    'liaWxpLmFwcC52aWV3dW5pdGUuY29tbW9uLlN0YXRSBHN0YXQ=');\n\n@$core.Deprecated('Use sourceContentItemDescriptor instead')\nconst SourceContentItem$json = {\n  '1': 'SourceContentItem',\n  '2': [\n    {\n      '1': 'av',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.SourceContentAV',\n      '9': 0,\n      '10': 'av'\n    },\n    {\n      '1': 'source_content',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.google.protobuf.Any',\n      '10': 'sourceContent'\n    },\n    {\n      '1': 'sc_type',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.v1.SourceContentType',\n      '10': 'scType'\n    },\n  ],\n  '8': [\n    {'1': 'data'},\n  ],\n};\n\n/// Descriptor for `SourceContentItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sourceContentItemDescriptor = $convert.base64Decode(\n    'ChFTb3VyY2VDb250ZW50SXRlbRI8CgJhdhgDIAEoCzIqLmJpbGliaWxpLmFwcC52aWV3dW5pdG'\n    'UudjEuU291cmNlQ29udGVudEFWSABSAmF2EjsKDnNvdXJjZV9jb250ZW50GAEgASgLMhQuZ29v'\n    'Z2xlLnByb3RvYnVmLkFueVINc291cmNlQ29udGVudBJFCgdzY190eXBlGAIgASgOMiwuYmlsaW'\n    'JpbGkuYXBwLnZpZXd1bml0ZS52MS5Tb3VyY2VDb250ZW50VHlwZVIGc2NUeXBlQgYKBGRhdGE=');\n\n@$core.Deprecated('Use storyActualCardWrapperDescriptor instead')\nconst StoryActualCardWrapper$json = {\n  '1': 'StoryActualCardWrapper',\n  '2': [\n    {\n      '1': 'video_card',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.StoryVideoCard',\n      '9': 0,\n      '10': 'videoCard'\n    },\n  ],\n  '8': [\n    {'1': 'actual_card'},\n  ],\n};\n\n/// Descriptor for `StoryActualCardWrapper`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List storyActualCardWrapperDescriptor = $convert.base64Decode(\n    'ChZTdG9yeUFjdHVhbENhcmRXcmFwcGVyEkoKCnZpZGVvX2NhcmQYASABKAsyKS5iaWxpYmlsaS'\n    '5hcHAudmlld3VuaXRlLnYxLlN0b3J5VmlkZW9DYXJkSABSCXZpZGVvQ2FyZEINCgthY3R1YWxf'\n    'Y2FyZA==');\n\n@$core.Deprecated('Use storyEntranceDescriptor instead')\nconst StoryEntrance$json = {\n  '1': 'StoryEntrance',\n  '2': [\n    {'1': 'arc_play_story', '3': 1, '4': 1, '5': 8, '10': 'arcPlayStory'},\n    {'1': 'story_icon', '3': 2, '4': 1, '5': 9, '10': 'storyIcon'},\n    {\n      '1': 'arc_landscape_story',\n      '3': 3,\n      '4': 1,\n      '5': 8,\n      '10': 'arcLandscapeStory'\n    },\n    {'1': 'landscape_icon', '3': 4, '4': 1, '5': 9, '10': 'landscapeIcon'},\n    {'1': 'play_story', '3': 5, '4': 1, '5': 8, '10': 'playStory'},\n  ],\n};\n\n/// Descriptor for `StoryEntrance`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List storyEntranceDescriptor = $convert.base64Decode(\n    'Cg1TdG9yeUVudHJhbmNlEiQKDmFyY19wbGF5X3N0b3J5GAEgASgIUgxhcmNQbGF5U3RvcnkSHQ'\n    'oKc3RvcnlfaWNvbhgCIAEoCVIJc3RvcnlJY29uEi4KE2FyY19sYW5kc2NhcGVfc3RvcnkYAyAB'\n    'KAhSEWFyY0xhbmRzY2FwZVN0b3J5EiUKDmxhbmRzY2FwZV9pY29uGAQgASgJUg1sYW5kc2NhcG'\n    'VJY29uEh0KCnBsYXlfc3RvcnkYBSABKAhSCXBsYXlTdG9yeQ==');\n\n@$core.Deprecated('Use storyReplyDescriptor instead')\nconst StoryReply$json = {\n  '1': 'StoryReply',\n  '2': [\n    {\n      '1': 'story_card_wrappers',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.StoryActualCardWrapper',\n      '10': 'storyCardWrappers'\n    },\n  ],\n};\n\n/// Descriptor for `StoryReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List storyReplyDescriptor = $convert.base64Decode(\n    'CgpTdG9yeVJlcGx5EmEKE3N0b3J5X2NhcmRfd3JhcHBlcnMYASADKAsyMS5iaWxpYmlsaS5hcH'\n    'Audmlld3VuaXRlLnYxLlN0b3J5QWN0dWFsQ2FyZFdyYXBwZXJSEXN0b3J5Q2FyZFdyYXBwZXJz');\n\n@$core.Deprecated('Use storyReqDescriptor instead')\nconst StoryReq$json = {\n  '1': 'StoryReq',\n  '2': [\n    {\n      '1': 'story_req_param',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.StoryReqParam',\n      '9': 0,\n      '10': 'storyReqParam'\n    },\n    {\n      '1': 'play_list_req_param',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.PlayListReqParam',\n      '9': 0,\n      '10': 'playListReqParam'\n    },\n    {'1': 'aid', '3': 1, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'bvid', '3': 2, '4': 1, '5': 9, '10': 'bvid'},\n    {\n      '1': 'player_args',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n    {'1': 'pull', '3': 6, '4': 1, '5': 3, '10': 'pull'},\n    {'1': 'from', '3': 7, '4': 1, '5': 9, '10': 'from'},\n    {'1': 'spmid', '3': 8, '4': 1, '5': 9, '10': 'spmid'},\n    {'1': 'from_spmid', '3': 9, '4': 1, '5': 9, '10': 'fromSpmid'},\n  ],\n  '8': [\n    {'1': 'param'},\n  ],\n};\n\n/// Descriptor for `StoryReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List storyReqDescriptor = $convert.base64Decode(\n    'CghTdG9yeVJlcRJSCg9zdG9yeV9yZXFfcGFyYW0YBCABKAsyKC5iaWxpYmlsaS5hcHAudmlld3'\n    'VuaXRlLnYxLlN0b3J5UmVxUGFyYW1IAFINc3RvcnlSZXFQYXJhbRJcChNwbGF5X2xpc3RfcmVx'\n    'X3BhcmFtGAUgASgLMisuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS52MS5QbGF5TGlzdFJlcVBhcm'\n    'FtSABSEHBsYXlMaXN0UmVxUGFyYW0SEAoDYWlkGAEgASgDUgNhaWQSEgoEYnZpZBgCIAEoCVIE'\n    'YnZpZBJPCgtwbGF5ZXJfYXJncxgDIAEoCzIuLmJpbGliaWxpLmFwcC5hcmNoaXZlLm1pZGRsZX'\n    'dhcmUudjEuUGxheWVyQXJnc1IKcGxheWVyQXJncxISCgRwdWxsGAYgASgDUgRwdWxsEhIKBGZy'\n    'b20YByABKAlSBGZyb20SFAoFc3BtaWQYCCABKAlSBXNwbWlkEh0KCmZyb21fc3BtaWQYCSABKA'\n    'lSCWZyb21TcG1pZEIHCgVwYXJhbQ==');\n\n@$core.Deprecated('Use storyReqParamDescriptor instead')\nconst StoryReqParam$json = {\n  '1': 'StoryReqParam',\n  '2': [\n    {'1': 'track_id', '3': 1, '4': 1, '5': 9, '10': 'trackId'},\n    {'1': 'display_id', '3': 2, '4': 1, '5': 3, '10': 'displayId'},\n    {\n      '1': 'extra_content',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.StoryReqParam.ExtraContentEntry',\n      '10': 'extraContent'\n    },\n    {'1': 'refresh', '3': 4, '4': 1, '5': 8, '10': 'refresh'},\n    {\n      '1': 'business_info',\n      '3': 5,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.StoryReqParam.BusinessInfoEntry',\n      '10': 'businessInfo'\n    },\n  ],\n  '3': [\n    StoryReqParam_ExtraContentEntry$json,\n    StoryReqParam_BusinessInfoEntry$json\n  ],\n};\n\n@$core.Deprecated('Use storyReqParamDescriptor instead')\nconst StoryReqParam_ExtraContentEntry$json = {\n  '1': 'ExtraContentEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n@$core.Deprecated('Use storyReqParamDescriptor instead')\nconst StoryReqParam_BusinessInfoEntry$json = {\n  '1': 'BusinessInfoEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `StoryReqParam`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List storyReqParamDescriptor = $convert.base64Decode(\n    'Cg1TdG9yeVJlcVBhcmFtEhkKCHRyYWNrX2lkGAEgASgJUgd0cmFja0lkEh0KCmRpc3BsYXlfaW'\n    'QYAiABKANSCWRpc3BsYXlJZBJfCg1leHRyYV9jb250ZW50GAMgAygLMjouYmlsaWJpbGkuYXBw'\n    'LnZpZXd1bml0ZS52MS5TdG9yeVJlcVBhcmFtLkV4dHJhQ29udGVudEVudHJ5UgxleHRyYUNvbn'\n    'RlbnQSGAoHcmVmcmVzaBgEIAEoCFIHcmVmcmVzaBJfCg1idXNpbmVzc19pbmZvGAUgAygLMjou'\n    'YmlsaWJpbGkuYXBwLnZpZXd1bml0ZS52MS5TdG9yeVJlcVBhcmFtLkJ1c2luZXNzSW5mb0VudH'\n    'J5UgxidXNpbmVzc0luZm8aPwoRRXh0cmFDb250ZW50RW50cnkSEAoDa2V5GAEgASgJUgNrZXkS'\n    'FAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ARo/ChFCdXNpbmVzc0luZm9FbnRyeRIQCgNrZXkYAS'\n    'ABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgB');\n\n@$core.Deprecated('Use storyVideoCardDescriptor instead')\nconst StoryVideoCard$json = {\n  '1': 'StoryVideoCard',\n  '2': [\n    {\n      '1': 'play_data',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.VideoPlayData',\n      '10': 'playData'\n    },\n    {\n      '1': 'view_content',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.ViewReply',\n      '10': 'viewContent'\n    },\n    {\n      '1': 'recommend_session_id',\n      '3': 3,\n      '4': 1,\n      '5': 9,\n      '10': 'recommendSessionId'\n    },\n    {'1': 'cover', '3': 4, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'track_id', '3': 5, '4': 1, '5': 9, '10': 'trackId'},\n    {'1': 'goto', '3': 6, '4': 1, '5': 9, '10': 'goto'},\n  ],\n};\n\n/// Descriptor for `StoryVideoCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List storyVideoCardDescriptor = $convert.base64Decode(\n    'Cg5TdG9yeVZpZGVvQ2FyZBJFCglwbGF5X2RhdGEYASABKAsyKC5iaWxpYmlsaS5hcHAudmlld3'\n    'VuaXRlLnYxLlZpZGVvUGxheURhdGFSCHBsYXlEYXRhEkcKDHZpZXdfY29udGVudBgCIAEoCzIk'\n    'LmJpbGliaWxpLmFwcC52aWV3dW5pdGUudjEuVmlld1JlcGx5Ugt2aWV3Q29udGVudBIwChRyZW'\n    'NvbW1lbmRfc2Vzc2lvbl9pZBgDIAEoCVIScmVjb21tZW5kU2Vzc2lvbklkEhQKBWNvdmVyGAQg'\n    'ASgJUgVjb3ZlchIZCgh0cmFja19pZBgFIAEoCVIHdHJhY2tJZBISCgRnb3RvGAYgASgJUgRnb3'\n    'Rv');\n\n@$core.Deprecated('Use tabDescriptor instead')\nconst Tab$json = {\n  '1': 'Tab',\n  '2': [\n    {\n      '1': 'tab_module',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.TabModule',\n      '10': 'tabModule'\n    },\n    {'1': 'tab_bg', '3': 2, '4': 1, '5': 9, '10': 'tabBg'},\n    {\n      '1': 'danmaku_entrance',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.TabControl',\n      '10': 'danmakuEntrance'\n    },\n    {'1': 'tab_bg_pad', '3': 4, '4': 1, '5': 9, '10': 'tabBgPad'},\n  ],\n};\n\n/// Descriptor for `Tab`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List tabDescriptor = $convert.base64Decode(\n    'CgNUYWISQwoKdGFiX21vZHVsZRgBIAMoCzIkLmJpbGliaWxpLmFwcC52aWV3dW5pdGUudjEuVG'\n    'FiTW9kdWxlUgl0YWJNb2R1bGUSFQoGdGFiX2JnGAIgASgJUgV0YWJCZxJQChBkYW5tYWt1X2Vu'\n    'dHJhbmNlGAMgASgLMiUuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS52MS5UYWJDb250cm9sUg9kYW'\n    '5tYWt1RW50cmFuY2USHAoKdGFiX2JnX3BhZBgEIAEoCVIIdGFiQmdQYWQ=');\n\n@$core.Deprecated('Use tabControlDescriptor instead')\nconst TabControl$json = {\n  '1': 'TabControl',\n  '2': [\n    {'1': 'limit', '3': 1, '4': 1, '5': 8, '10': 'limit'},\n    {'1': 'disable', '3': 2, '4': 1, '5': 8, '10': 'disable'},\n    {'1': 'disable_click_tip', '3': 3, '4': 1, '5': 9, '10': 'disableClickTip'},\n  ],\n};\n\n/// Descriptor for `TabControl`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List tabControlDescriptor = $convert.base64Decode(\n    'CgpUYWJDb250cm9sEhQKBWxpbWl0GAEgASgIUgVsaW1pdBIYCgdkaXNhYmxlGAIgASgIUgdkaX'\n    'NhYmxlEioKEWRpc2FibGVfY2xpY2tfdGlwGAMgASgJUg9kaXNhYmxlQ2xpY2tUaXA=');\n\n@$core.Deprecated('Use tabModuleDescriptor instead')\nconst TabModule$json = {\n  '1': 'TabModule',\n  '2': [\n    {\n      '1': 'introduction',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.IntroductionTab',\n      '9': 0,\n      '10': 'introduction'\n    },\n    {\n      '1': 'reply',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.ReplyTab',\n      '9': 0,\n      '10': 'reply'\n    },\n    {\n      '1': 'activity_tab',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.ActivityTab',\n      '9': 0,\n      '10': 'activityTab'\n    },\n    {\n      '1': 'catalog',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.CatalogTab',\n      '9': 0,\n      '10': 'catalog'\n    },\n    {\n      '1': 'tab_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.v1.TabType',\n      '10': 'tabType'\n    },\n  ],\n  '8': [\n    {'1': 'tab'},\n  ],\n};\n\n/// Descriptor for `TabModule`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List tabModuleDescriptor = $convert.base64Decode(\n    'CglUYWJNb2R1bGUSUAoMaW50cm9kdWN0aW9uGAIgASgLMiouYmlsaWJpbGkuYXBwLnZpZXd1bm'\n    'l0ZS52MS5JbnRyb2R1Y3Rpb25UYWJIAFIMaW50cm9kdWN0aW9uEjsKBXJlcGx5GAMgASgLMiMu'\n    'YmlsaWJpbGkuYXBwLnZpZXd1bml0ZS52MS5SZXBseVRhYkgAUgVyZXBseRJPCgxhY3Rpdml0eV'\n    '90YWIYBCABKAsyKi5iaWxpYmlsaS5hcHAudmlld3VuaXRlLmNvbW1vbi5BY3Rpdml0eVRhYkgA'\n    'UgthY3Rpdml0eVRhYhJFCgdjYXRhbG9nGAUgASgLMikuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS'\n    '5jb21tb24uQ2F0YWxvZ1RhYkgAUgdjYXRhbG9nEj0KCHRhYl90eXBlGAEgASgOMiIuYmlsaWJp'\n    'bGkuYXBwLnZpZXd1bml0ZS52MS5UYWJUeXBlUgd0YWJUeXBlQgUKA3RhYg==');\n\n@$core.Deprecated('Use upperInfosDescriptor instead')\nconst UpperInfos$json = {\n  '1': 'UpperInfos',\n  '2': [\n    {'1': 'fans_count', '3': 1, '4': 1, '5': 3, '10': 'fansCount'},\n    {\n      '1': 'arc_count_last_half_year',\n      '3': 2,\n      '4': 1,\n      '5': 3,\n      '10': 'arcCountLastHalfYear'\n    },\n    {'1': 'first_up_dates', '3': 3, '4': 1, '5': 3, '10': 'firstUpDates'},\n    {'1': 'total_play_count', '3': 4, '4': 1, '5': 3, '10': 'totalPlayCount'},\n  ],\n};\n\n/// Descriptor for `UpperInfos`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List upperInfosDescriptor = $convert.base64Decode(\n    'CgpVcHBlckluZm9zEh0KCmZhbnNfY291bnQYASABKANSCWZhbnNDb3VudBI2ChhhcmNfY291bn'\n    'RfbGFzdF9oYWxmX3llYXIYAiABKANSFGFyY0NvdW50TGFzdEhhbGZZZWFyEiQKDmZpcnN0X3Vw'\n    'X2RhdGVzGAMgASgDUgxmaXJzdFVwRGF0ZXMSKAoQdG90YWxfcGxheV9jb3VudBgEIAEoA1IOdG'\n    '90YWxQbGF5Q291bnQ=');\n\n@$core.Deprecated('Use videoGuideDescriptor instead')\nconst VideoGuide$json = {\n  '1': 'VideoGuide',\n  '2': [\n    {\n      '1': 'material',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.Material',\n      '10': 'material'\n    },\n    {\n      '1': 'video_point',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.VideoViewPoint',\n      '10': 'videoPoint'\n    },\n    {\n      '1': 'contract_card',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.ContractCard',\n      '10': 'contractCard'\n    },\n    {\n      '1': 'right_material',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.Material',\n      '10': 'rightMaterial'\n    },\n  ],\n};\n\n/// Descriptor for `VideoGuide`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List videoGuideDescriptor = $convert.base64Decode(\n    'CgpWaWRlb0d1aWRlEj8KCG1hdGVyaWFsGAEgAygLMiMuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS'\n    '52MS5NYXRlcmlhbFIIbWF0ZXJpYWwSSgoLdmlkZW9fcG9pbnQYAiABKAsyKS5iaWxpYmlsaS5h'\n    'cHAudmlld3VuaXRlLnYxLlZpZGVvVmlld1BvaW50Ugp2aWRlb1BvaW50EkwKDWNvbnRyYWN0X2'\n    'NhcmQYAyABKAsyJy5iaWxpYmlsaS5hcHAudmlld3VuaXRlLnYxLkNvbnRyYWN0Q2FyZFIMY29u'\n    'dHJhY3RDYXJkEkoKDnJpZ2h0X21hdGVyaWFsGAQgASgLMiMuYmlsaWJpbGkuYXBwLnZpZXd1bm'\n    'l0ZS52MS5NYXRlcmlhbFINcmlnaHRNYXRlcmlhbA==');\n\n@$core.Deprecated('Use videoPlayDataDescriptor instead')\nconst VideoPlayData$json = {\n  '1': 'VideoPlayData',\n  '2': [\n    {'1': 'url', '3': 1, '4': 1, '5': 9, '10': 'url'},\n    {\n      '1': 'dimension',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.Dimension',\n      '10': 'dimension'\n    },\n    {'1': 'aid', '3': 3, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'ep_id', '3': 4, '4': 1, '5': 3, '10': 'epId'},\n    {'1': 'cid', '3': 5, '4': 1, '5': 3, '10': 'cid'},\n  ],\n};\n\n/// Descriptor for `VideoPlayData`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List videoPlayDataDescriptor = $convert.base64Decode(\n    'Cg1WaWRlb1BsYXlEYXRhEhAKA3VybBgBIAEoCVIDdXJsEj4KCWRpbWVuc2lvbhgCIAEoCzIgLm'\n    'JpbGliaWxpLnBsYXllcnNoYXJlZC5EaW1lbnNpb25SCWRpbWVuc2lvbhIQCgNhaWQYAyABKANS'\n    'A2FpZBITCgVlcF9pZBgEIAEoA1IEZXBJZBIQCgNjaWQYBSABKANSA2NpZA==');\n\n@$core.Deprecated('Use videoPointDescriptor instead')\nconst VideoPoint$json = {\n  '1': 'VideoPoint',\n  '2': [\n    {'1': 'type', '3': 1, '4': 1, '5': 5, '10': 'type'},\n    {'1': 'from', '3': 2, '4': 1, '5': 3, '10': 'from'},\n    {'1': 'to', '3': 3, '4': 1, '5': 3, '10': 'to'},\n    {'1': 'content', '3': 4, '4': 1, '5': 9, '10': 'content'},\n    {'1': 'cover', '3': 5, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'logo_url', '3': 6, '4': 1, '5': 9, '10': 'logoUrl'},\n    {'1': 'team_type', '3': 7, '4': 1, '5': 9, '10': 'teamType'},\n    {'1': 'team_name', '3': 8, '4': 1, '5': 9, '10': 'teamName'},\n  ],\n};\n\n/// Descriptor for `VideoPoint`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List videoPointDescriptor = $convert.base64Decode(\n    'CgpWaWRlb1BvaW50EhIKBHR5cGUYASABKAVSBHR5cGUSEgoEZnJvbRgCIAEoA1IEZnJvbRIOCg'\n    'J0bxgDIAEoA1ICdG8SGAoHY29udGVudBgEIAEoCVIHY29udGVudBIUCgVjb3ZlchgFIAEoCVIF'\n    'Y292ZXISGQoIbG9nb191cmwYBiABKAlSB2xvZ29VcmwSGwoJdGVhbV90eXBlGAcgASgJUgh0ZW'\n    'FtVHlwZRIbCgl0ZWFtX25hbWUYCCABKAlSCHRlYW1OYW1l');\n\n@$core.Deprecated('Use videoShotDescriptor instead')\nconst VideoShot$json = {\n  '1': 'VideoShot',\n  '2': [\n    {'1': 'pv_data', '3': 1, '4': 1, '5': 9, '10': 'pvData'},\n    {'1': 'img_x_len', '3': 2, '4': 1, '5': 5, '10': 'imgXLen'},\n    {'1': 'img_y_len', '3': 3, '4': 1, '5': 5, '10': 'imgYLen'},\n    {'1': 'img_x_size', '3': 4, '4': 1, '5': 5, '10': 'imgXSize'},\n    {'1': 'img_y_size', '3': 5, '4': 1, '5': 5, '10': 'imgYSize'},\n    {'1': 'image', '3': 6, '4': 3, '5': 9, '10': 'image'},\n  ],\n};\n\n/// Descriptor for `VideoShot`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List videoShotDescriptor = $convert.base64Decode(\n    'CglWaWRlb1Nob3QSFwoHcHZfZGF0YRgBIAEoCVIGcHZEYXRhEhoKCWltZ194X2xlbhgCIAEoBV'\n    'IHaW1nWExlbhIaCglpbWdfeV9sZW4YAyABKAVSB2ltZ1lMZW4SHAoKaW1nX3hfc2l6ZRgEIAEo'\n    'BVIIaW1nWFNpemUSHAoKaW1nX3lfc2l6ZRgFIAEoBVIIaW1nWVNpemUSFAoFaW1hZ2UYBiADKA'\n    'lSBWltYWdl');\n\n@$core.Deprecated('Use videoViewPointDescriptor instead')\nconst VideoViewPoint$json = {\n  '1': 'VideoViewPoint',\n  '2': [\n    {\n      '1': 'points',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.VideoPoint',\n      '10': 'points'\n    },\n    {\n      '1': 'point_material',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.PointMaterial',\n      '10': 'pointMaterial'\n    },\n    {'1': 'point_permanent', '3': 3, '4': 1, '5': 8, '10': 'pointPermanent'},\n  ],\n};\n\n/// Descriptor for `VideoViewPoint`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List videoViewPointDescriptor = $convert.base64Decode(\n    'Cg5WaWRlb1ZpZXdQb2ludBI9CgZwb2ludHMYASADKAsyJS5iaWxpYmlsaS5hcHAudmlld3VuaX'\n    'RlLnYxLlZpZGVvUG9pbnRSBnBvaW50cxJPCg5wb2ludF9tYXRlcmlhbBgCIAEoCzIoLmJpbGli'\n    'aWxpLmFwcC52aWV3dW5pdGUudjEuUG9pbnRNYXRlcmlhbFINcG9pbnRNYXRlcmlhbBInCg9wb2'\n    'ludF9wZXJtYW5lbnQYAyABKAhSDnBvaW50UGVybWFuZW50');\n\n@$core.Deprecated('Use viewBaseDescriptor instead')\nconst ViewBase$json = {\n  '1': 'ViewBase',\n  '2': [\n    {\n      '1': 'biz_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.BizType',\n      '10': 'bizType'\n    },\n    {\n      '1': 'page_type',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.v1.PageCategory',\n      '10': 'pageType'\n    },\n    {\n      '1': 'control',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.PageControl',\n      '10': 'control'\n    },\n    {\n      '1': 'activity_resource',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.ActivityResource',\n      '10': 'activityResource'\n    },\n    {\n      '1': 'config',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.Config',\n      '10': 'config'\n    },\n  ],\n};\n\n/// Descriptor for `ViewBase`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List viewBaseDescriptor = $convert.base64Decode(\n    'CghWaWV3QmFzZRI5CghiaXpfdHlwZRgBIAEoDjIeLmJpbGliaWxpLnBsYXllcnNoYXJlZC5CaX'\n    'pUeXBlUgdiaXpUeXBlEkQKCXBhZ2VfdHlwZRgCIAEoDjInLmJpbGliaWxpLmFwcC52aWV3dW5p'\n    'dGUudjEuUGFnZUNhdGVnb3J5UghwYWdlVHlwZRJACgdjb250cm9sGAMgASgLMiYuYmlsaWJpbG'\n    'kuYXBwLnZpZXd1bml0ZS52MS5QYWdlQ29udHJvbFIHY29udHJvbBJYChFhY3Rpdml0eV9yZXNv'\n    'dXJjZRgEIAEoCzIrLmJpbGliaWxpLmFwcC52aWV3dW5pdGUudjEuQWN0aXZpdHlSZXNvdXJjZV'\n    'IQYWN0aXZpdHlSZXNvdXJjZRI5CgZjb25maWcYBSABKAsyIS5iaWxpYmlsaS5hcHAudmlld3Vu'\n    'aXRlLnYxLkNvbmZpZ1IGY29uZmln');\n\n@$core.Deprecated('Use viewProgressReplyDescriptor instead')\nconst ViewProgressReply$json = {\n  '1': 'ViewProgressReply',\n  '2': [\n    {\n      '1': 'video_guide',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.VideoGuide',\n      '10': 'videoGuide'\n    },\n    {\n      '1': 'chronos',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.Chronos',\n      '10': 'chronos'\n    },\n    {\n      '1': 'arc_shot',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.VideoShot',\n      '10': 'arcShot'\n    },\n    {\n      '1': 'dm',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.DmResource',\n      '10': 'dm'\n    },\n    {\n      '1': 'fragment_res',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.FragmentRes',\n      '10': 'fragmentRes'\n    },\n  ],\n};\n\n/// Descriptor for `ViewProgressReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List viewProgressReplyDescriptor = $convert.base64Decode(\n    'ChFWaWV3UHJvZ3Jlc3NSZXBseRJGCgt2aWRlb19ndWlkZRgBIAEoCzIlLmJpbGliaWxpLmFwcC'\n    '52aWV3dW5pdGUudjEuVmlkZW9HdWlkZVIKdmlkZW9HdWlkZRI8CgdjaHJvbm9zGAIgASgLMiIu'\n    'YmlsaWJpbGkuYXBwLnZpZXd1bml0ZS52MS5DaHJvbm9zUgdjaHJvbm9zEj8KCGFyY19zaG90GA'\n    'MgASgLMiQuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS52MS5WaWRlb1Nob3RSB2FyY1Nob3QSNQoC'\n    'ZG0YBCABKAsyJS5iaWxpYmlsaS5hcHAudmlld3VuaXRlLnYxLkRtUmVzb3VyY2VSAmRtEkkKDG'\n    'ZyYWdtZW50X3JlcxgFIAEoCzImLmJpbGliaWxpLmFwcC52aWV3dW5pdGUudjEuRnJhZ21lbnRS'\n    'ZXNSC2ZyYWdtZW50UmVz');\n\n@$core.Deprecated('Use viewProgressReqDescriptor instead')\nconst ViewProgressReq$json = {\n  '1': 'ViewProgressReq',\n  '2': [\n    {'1': 'aid', '3': 1, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'cid', '3': 2, '4': 1, '5': 3, '10': 'cid'},\n    {'1': 'up_mid', '3': 3, '4': 1, '5': 3, '10': 'upMid'},\n    {\n      '1': 'chronos_param',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.ChronosParam',\n      '10': 'chronosParam'\n    },\n    {\n      '1': 'type',\n      '3': 5,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.v1.UnionType',\n      '10': 'type'\n    },\n    {\n      '1': 'fragment_param',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.FragmentParam',\n      '10': 'fragmentParam'\n    },\n    {'1': 'from_scene', '3': 7, '4': 1, '5': 9, '10': 'fromScene'},\n    {\n      '1': 'play_ctrl',\n      '3': 8,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.PlayCtrl',\n      '10': 'playCtrl'\n    },\n  ],\n};\n\n/// Descriptor for `ViewProgressReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List viewProgressReqDescriptor = $convert.base64Decode(\n    'Cg9WaWV3UHJvZ3Jlc3NSZXESEAoDYWlkGAEgASgDUgNhaWQSEAoDY2lkGAIgASgDUgNjaWQSFQ'\n    'oGdXBfbWlkGAMgASgDUgV1cE1pZBJMCg1jaHJvbm9zX3BhcmFtGAQgASgLMicuYmlsaWJpbGku'\n    'YXBwLnZpZXd1bml0ZS52MS5DaHJvbm9zUGFyYW1SDGNocm9ub3NQYXJhbRI4CgR0eXBlGAUgAS'\n    'gOMiQuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS52MS5VbmlvblR5cGVSBHR5cGUSTwoOZnJhZ21l'\n    'bnRfcGFyYW0YBiABKAsyKC5iaWxpYmlsaS5hcHAudmlld3VuaXRlLnYxLkZyYWdtZW50UGFyYW'\n    '1SDWZyYWdtZW50UGFyYW0SHQoKZnJvbV9zY2VuZRgHIAEoCVIJZnJvbVNjZW5lEjwKCXBsYXlf'\n    'Y3RybBgIIAEoDjIfLmJpbGliaWxpLnBsYXllcnNoYXJlZC5QbGF5Q3RybFIIcGxheUN0cmw=');\n\n@$core.Deprecated('Use viewReplyDescriptor instead')\nconst ViewReply$json = {\n  '1': 'ViewReply',\n  '2': [\n    {\n      '1': 'view_base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.ViewBase',\n      '10': 'viewBase'\n    },\n    {\n      '1': 'arc',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.Arc',\n      '10': 'arc'\n    },\n    {\n      '1': 'req_user',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.ReqUser',\n      '10': 'reqUser'\n    },\n    {\n      '1': 'owner',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.common.Owner',\n      '10': 'owner'\n    },\n    {\n      '1': 'tab',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.Tab',\n      '10': 'tab'\n    },\n    {\n      '1': 'supplement',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.google.protobuf.Any',\n      '10': 'supplement'\n    },\n    {\n      '1': 'cm',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.CM',\n      '10': 'cm'\n    },\n    {\n      '1': 'ecode',\n      '3': 8,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.app.viewunite.v1.ECode',\n      '10': 'ecode'\n    },\n    {\n      '1': 'ecode_config',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.ECodeConfig',\n      '10': 'ecodeConfig'\n    },\n    {\n      '1': 'report',\n      '3': 10,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.ViewReply.ReportEntry',\n      '10': 'report'\n    },\n  ],\n  '3': [ViewReply_ReportEntry$json],\n};\n\n@$core.Deprecated('Use viewReplyDescriptor instead')\nconst ViewReply_ReportEntry$json = {\n  '1': 'ReportEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `ViewReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List viewReplyDescriptor = $convert.base64Decode(\n    'CglWaWV3UmVwbHkSQAoJdmlld19iYXNlGAEgASgLMiMuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS'\n    '52MS5WaWV3QmFzZVIIdmlld0Jhc2USMAoDYXJjGAIgASgLMh4uYmlsaWJpbGkuYXBwLnZpZXd1'\n    'bml0ZS52MS5BcmNSA2FyYxI9CghyZXFfdXNlchgDIAEoCzIiLmJpbGliaWxpLmFwcC52aWV3dW'\n    '5pdGUudjEuUmVxVXNlclIHcmVxVXNlchI6CgVvd25lchgEIAEoCzIkLmJpbGliaWxpLmFwcC52'\n    'aWV3dW5pdGUuY29tbW9uLk93bmVyUgVvd25lchIwCgN0YWIYBSABKAsyHi5iaWxpYmlsaS5hcH'\n    'Audmlld3VuaXRlLnYxLlRhYlIDdGFiEjQKCnN1cHBsZW1lbnQYBiABKAsyFC5nb29nbGUucHJv'\n    'dG9idWYuQW55UgpzdXBwbGVtZW50Ei0KAmNtGAcgASgLMh0uYmlsaWJpbGkuYXBwLnZpZXd1bm'\n    'l0ZS52MS5DTVICY20SNgoFZWNvZGUYCCABKA4yIC5iaWxpYmlsaS5hcHAudmlld3VuaXRlLnYx'\n    'LkVDb2RlUgVlY29kZRJJCgxlY29kZV9jb25maWcYCSABKAsyJi5iaWxpYmlsaS5hcHAudmlld3'\n    'VuaXRlLnYxLkVDb2RlQ29uZmlnUgtlY29kZUNvbmZpZxJICgZyZXBvcnQYCiADKAsyMC5iaWxp'\n    'YmlsaS5hcHAudmlld3VuaXRlLnYxLlZpZXdSZXBseS5SZXBvcnRFbnRyeVIGcmVwb3J0GjkKC1'\n    'JlcG9ydEVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAE=');\n\n@$core.Deprecated('Use viewReqDescriptor instead')\nconst ViewReq$json = {\n  '1': 'ViewReq',\n  '2': [\n    {'1': 'aid', '3': 1, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'bvid', '3': 2, '4': 1, '5': 9, '10': 'bvid'},\n    {'1': 'from', '3': 3, '4': 1, '5': 9, '10': 'from'},\n    {'1': 'spmid', '3': 4, '4': 1, '5': 9, '10': 'spmid'},\n    {'1': 'from_spmid', '3': 5, '4': 1, '5': 9, '10': 'fromSpmid'},\n    {'1': 'session_id', '3': 6, '4': 1, '5': 9, '10': 'sessionId'},\n    {\n      '1': 'player_args',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.archive.middleware.v1.PlayerArgs',\n      '10': 'playerArgs'\n    },\n    {'1': 'track_id', '3': 8, '4': 1, '5': 9, '10': 'trackId'},\n    {\n      '1': 'extra_content',\n      '3': 9,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.ViewReq.ExtraContentEntry',\n      '10': 'extraContent'\n    },\n    {'1': 'play_mode', '3': 10, '4': 1, '5': 9, '10': 'playMode'},\n    {\n      '1': 'relate',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.viewunite.v1.Relate',\n      '10': 'relate'\n    },\n    {'1': 'biz_extra', '3': 12, '4': 1, '5': 9, '10': 'bizExtra'},\n    {'1': 'ad_extra', '3': 13, '4': 1, '5': 9, '10': 'adExtra'},\n    {'1': 'from_scene', '3': 14, '4': 1, '5': 9, '10': 'fromScene'},\n    {\n      '1': 'play_ctrl',\n      '3': 15,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.PlayCtrl',\n      '10': 'playCtrl'\n    },\n  ],\n  '3': [ViewReq_ExtraContentEntry$json],\n};\n\n@$core.Deprecated('Use viewReqDescriptor instead')\nconst ViewReq_ExtraContentEntry$json = {\n  '1': 'ExtraContentEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `ViewReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List viewReqDescriptor = $convert.base64Decode(\n    'CgdWaWV3UmVxEhAKA2FpZBgBIAEoA1IDYWlkEhIKBGJ2aWQYAiABKAlSBGJ2aWQSEgoEZnJvbR'\n    'gDIAEoCVIEZnJvbRIUCgVzcG1pZBgEIAEoCVIFc3BtaWQSHQoKZnJvbV9zcG1pZBgFIAEoCVIJ'\n    'ZnJvbVNwbWlkEh0KCnNlc3Npb25faWQYBiABKAlSCXNlc3Npb25JZBJPCgtwbGF5ZXJfYXJncx'\n    'gHIAEoCzIuLmJpbGliaWxpLmFwcC5hcmNoaXZlLm1pZGRsZXdhcmUudjEuUGxheWVyQXJnc1IK'\n    'cGxheWVyQXJncxIZCgh0cmFja19pZBgIIAEoCVIHdHJhY2tJZBJZCg1leHRyYV9jb250ZW50GA'\n    'kgAygLMjQuYmlsaWJpbGkuYXBwLnZpZXd1bml0ZS52MS5WaWV3UmVxLkV4dHJhQ29udGVudEVu'\n    'dHJ5UgxleHRyYUNvbnRlbnQSGwoJcGxheV9tb2RlGAogASgJUghwbGF5TW9kZRI5CgZyZWxhdG'\n    'UYCyABKAsyIS5iaWxpYmlsaS5hcHAudmlld3VuaXRlLnYxLlJlbGF0ZVIGcmVsYXRlEhsKCWJp'\n    'el9leHRyYRgMIAEoCVIIYml6RXh0cmESGQoIYWRfZXh0cmEYDSABKAlSB2FkRXh0cmESHQoKZn'\n    'JvbV9zY2VuZRgOIAEoCVIJZnJvbVNjZW5lEjwKCXBsYXlfY3RybBgPIAEoDjIfLmJpbGliaWxp'\n    'LnBsYXllcnNoYXJlZC5QbGF5Q3RybFIIcGxheUN0cmwaPwoRRXh0cmFDb250ZW50RW50cnkSEA'\n    'oDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4AQ==');\n"
  },
  {
    "path": "lib/grpc/bilibili/community/service/dm/v1.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/community/service/dm/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:fixnum/fixnum.dart' as $fixnum;\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nimport 'v1.pbenum.dart';\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nexport 'v1.pbenum.dart';\n\nclass Avatar extends $pb.GeneratedMessage {\n  factory Avatar({\n    $core.String? id,\n    $core.String? url,\n    AvatarType? avatarType,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (url != null) result.url = url;\n    if (avatarType != null) result.avatarType = avatarType;\n    return result;\n  }\n\n  Avatar._();\n\n  factory Avatar.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Avatar.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Avatar',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'url')\n    ..aE<AvatarType>(3, _omitFieldNames ? '' : 'avatarType',\n        enumValues: AvatarType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Avatar clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Avatar copyWith(void Function(Avatar) updates) =>\n      super.copyWith((message) => updates(message as Avatar)) as Avatar;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Avatar create() => Avatar._();\n  @$core.override\n  Avatar createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Avatar getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Avatar>(create);\n  static Avatar? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get id => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set id($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get url => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set url($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUrl() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  AvatarType get avatarType => $_getN(2);\n  @$pb.TagNumber(3)\n  set avatarType(AvatarType value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAvatarType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAvatarType() => $_clearField(3);\n}\n\nclass Bubble extends $pb.GeneratedMessage {\n  factory Bubble({\n    $core.String? text,\n    $core.String? url,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (url != null) result.url = url;\n    return result;\n  }\n\n  Bubble._();\n\n  factory Bubble.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Bubble.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Bubble',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aOS(2, _omitFieldNames ? '' : 'url')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Bubble clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Bubble copyWith(void Function(Bubble) updates) =>\n      super.copyWith((message) => updates(message as Bubble)) as Bubble;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Bubble create() => Bubble._();\n  @$core.override\n  Bubble createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Bubble getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Bubble>(create);\n  static Bubble? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get url => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set url($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUrl() => $_clearField(2);\n}\n\nclass BubbleV2 extends $pb.GeneratedMessage {\n  factory BubbleV2({\n    $core.String? text,\n    $core.String? url,\n    BubbleType? bubbleType,\n    $core.bool? exposureOnce,\n    ExposureType? exposureType,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (url != null) result.url = url;\n    if (bubbleType != null) result.bubbleType = bubbleType;\n    if (exposureOnce != null) result.exposureOnce = exposureOnce;\n    if (exposureType != null) result.exposureType = exposureType;\n    return result;\n  }\n\n  BubbleV2._();\n\n  factory BubbleV2.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BubbleV2.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BubbleV2',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aOS(2, _omitFieldNames ? '' : 'url')\n    ..aE<BubbleType>(3, _omitFieldNames ? '' : 'bubbleType',\n        enumValues: BubbleType.values)\n    ..aOB(4, _omitFieldNames ? '' : 'exposureOnce')\n    ..aE<ExposureType>(5, _omitFieldNames ? '' : 'exposureType',\n        enumValues: ExposureType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BubbleV2 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BubbleV2 copyWith(void Function(BubbleV2) updates) =>\n      super.copyWith((message) => updates(message as BubbleV2)) as BubbleV2;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BubbleV2 create() => BubbleV2._();\n  @$core.override\n  BubbleV2 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BubbleV2 getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BubbleV2>(create);\n  static BubbleV2? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get url => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set url($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUrl() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  BubbleType get bubbleType => $_getN(2);\n  @$pb.TagNumber(3)\n  set bubbleType(BubbleType value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBubbleType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBubbleType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get exposureOnce => $_getBF(3);\n  @$pb.TagNumber(4)\n  set exposureOnce($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasExposureOnce() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearExposureOnce() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  ExposureType get exposureType => $_getN(4);\n  @$pb.TagNumber(5)\n  set exposureType(ExposureType value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasExposureType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearExposureType() => $_clearField(5);\n}\n\nclass Button extends $pb.GeneratedMessage {\n  factory Button({\n    $core.String? text,\n    ToastFunctionType? action,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (action != null) result.action = action;\n    return result;\n  }\n\n  Button._();\n\n  factory Button.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Button.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Button',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aE<ToastFunctionType>(2, _omitFieldNames ? '' : 'action',\n        enumValues: ToastFunctionType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Button clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Button copyWith(void Function(Button) updates) =>\n      super.copyWith((message) => updates(message as Button)) as Button;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Button create() => Button._();\n  @$core.override\n  Button createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Button getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Button>(create);\n  static Button? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  ToastFunctionType get action => $_getN(1);\n  @$pb.TagNumber(2)\n  set action(ToastFunctionType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAction() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAction() => $_clearField(2);\n}\n\nclass BuzzwordConfig extends $pb.GeneratedMessage {\n  factory BuzzwordConfig({\n    $core.Iterable<BuzzwordShowConfig>? keywords,\n  }) {\n    final result = create();\n    if (keywords != null) result.keywords.addAll(keywords);\n    return result;\n  }\n\n  BuzzwordConfig._();\n\n  factory BuzzwordConfig.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BuzzwordConfig.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BuzzwordConfig',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..pPM<BuzzwordShowConfig>(1, _omitFieldNames ? '' : 'keywords',\n        subBuilder: BuzzwordShowConfig.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BuzzwordConfig clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BuzzwordConfig copyWith(void Function(BuzzwordConfig) updates) =>\n      super.copyWith((message) => updates(message as BuzzwordConfig))\n          as BuzzwordConfig;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BuzzwordConfig create() => BuzzwordConfig._();\n  @$core.override\n  BuzzwordConfig createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BuzzwordConfig getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<BuzzwordConfig>(create);\n  static BuzzwordConfig? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<BuzzwordShowConfig> get keywords => $_getList(0);\n}\n\nclass BuzzwordShowConfig extends $pb.GeneratedMessage {\n  factory BuzzwordShowConfig({\n    $core.String? name,\n    $core.String? schema,\n    $core.int? source,\n    $fixnum.Int64? id,\n    $fixnum.Int64? buzzwordId,\n    $core.int? schemaType,\n  }) {\n    final result = create();\n    if (name != null) result.name = name;\n    if (schema != null) result.schema = schema;\n    if (source != null) result.source = source;\n    if (id != null) result.id = id;\n    if (buzzwordId != null) result.buzzwordId = buzzwordId;\n    if (schemaType != null) result.schemaType = schemaType;\n    return result;\n  }\n\n  BuzzwordShowConfig._();\n\n  factory BuzzwordShowConfig.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BuzzwordShowConfig.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BuzzwordShowConfig',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'name')\n    ..aOS(2, _omitFieldNames ? '' : 'schema')\n    ..aI(3, _omitFieldNames ? '' : 'source')\n    ..aInt64(4, _omitFieldNames ? '' : 'id')\n    ..aInt64(5, _omitFieldNames ? '' : 'buzzwordId')\n    ..aI(6, _omitFieldNames ? '' : 'schemaType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BuzzwordShowConfig clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BuzzwordShowConfig copyWith(void Function(BuzzwordShowConfig) updates) =>\n      super.copyWith((message) => updates(message as BuzzwordShowConfig))\n          as BuzzwordShowConfig;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BuzzwordShowConfig create() => BuzzwordShowConfig._();\n  @$core.override\n  BuzzwordShowConfig createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BuzzwordShowConfig getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<BuzzwordShowConfig>(create);\n  static BuzzwordShowConfig? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get name => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set name($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasName() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearName() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get schema => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set schema($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSchema() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSchema() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get source => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set source($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSource() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSource() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get id => $_getI64(3);\n  @$pb.TagNumber(4)\n  set id($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasId() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearId() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get buzzwordId => $_getI64(4);\n  @$pb.TagNumber(5)\n  set buzzwordId($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBuzzwordId() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBuzzwordId() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get schemaType => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set schemaType($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasSchemaType() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearSchemaType() => $_clearField(6);\n}\n\nclass CheckBox extends $pb.GeneratedMessage {\n  factory CheckBox({\n    $core.String? text,\n    CheckboxType? type,\n    $core.bool? defaultValue,\n    $core.bool? show,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (type != null) result.type = type;\n    if (defaultValue != null) result.defaultValue = defaultValue;\n    if (show != null) result.show = show;\n    return result;\n  }\n\n  CheckBox._();\n\n  factory CheckBox.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CheckBox.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CheckBox',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aE<CheckboxType>(2, _omitFieldNames ? '' : 'type',\n        enumValues: CheckboxType.values)\n    ..aOB(3, _omitFieldNames ? '' : 'defaultValue')\n    ..aOB(4, _omitFieldNames ? '' : 'show')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CheckBox clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CheckBox copyWith(void Function(CheckBox) updates) =>\n      super.copyWith((message) => updates(message as CheckBox)) as CheckBox;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CheckBox create() => CheckBox._();\n  @$core.override\n  CheckBox createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CheckBox getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CheckBox>(create);\n  static CheckBox? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  CheckboxType get type => $_getN(1);\n  @$pb.TagNumber(2)\n  set type(CheckboxType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get defaultValue => $_getBF(2);\n  @$pb.TagNumber(3)\n  set defaultValue($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDefaultValue() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDefaultValue() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get show => $_getBF(3);\n  @$pb.TagNumber(4)\n  set show($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasShow() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearShow() => $_clearField(4);\n}\n\nclass CheckBoxV2 extends $pb.GeneratedMessage {\n  factory CheckBoxV2({\n    $core.String? text,\n    CheckboxType? type,\n    $core.bool? defaultValue,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (type != null) result.type = type;\n    if (defaultValue != null) result.defaultValue = defaultValue;\n    return result;\n  }\n\n  CheckBoxV2._();\n\n  factory CheckBoxV2.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CheckBoxV2.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CheckBoxV2',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aE<CheckboxType>(2, _omitFieldNames ? '' : 'type',\n        enumValues: CheckboxType.values)\n    ..aOB(3, _omitFieldNames ? '' : 'defaultValue')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CheckBoxV2 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CheckBoxV2 copyWith(void Function(CheckBoxV2) updates) =>\n      super.copyWith((message) => updates(message as CheckBoxV2)) as CheckBoxV2;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CheckBoxV2 create() => CheckBoxV2._();\n  @$core.override\n  CheckBoxV2 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CheckBoxV2 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CheckBoxV2>(create);\n  static CheckBoxV2? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  CheckboxType get type => $_getN(1);\n  @$pb.TagNumber(2)\n  set type(CheckboxType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get defaultValue => $_getBF(2);\n  @$pb.TagNumber(3)\n  set defaultValue($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDefaultValue() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDefaultValue() => $_clearField(3);\n}\n\nclass ClickButton extends $pb.GeneratedMessage {\n  factory ClickButton({\n    $core.Iterable<$core.String>? portraitText,\n    $core.Iterable<$core.String>? landscapeText,\n    $core.Iterable<$core.String>? portraitTextFocus,\n    $core.Iterable<$core.String>? landscapeTextFocus,\n    RenderType? renderType,\n    $core.bool? show,\n    Bubble? bubble,\n  }) {\n    final result = create();\n    if (portraitText != null) result.portraitText.addAll(portraitText);\n    if (landscapeText != null) result.landscapeText.addAll(landscapeText);\n    if (portraitTextFocus != null)\n      result.portraitTextFocus.addAll(portraitTextFocus);\n    if (landscapeTextFocus != null)\n      result.landscapeTextFocus.addAll(landscapeTextFocus);\n    if (renderType != null) result.renderType = renderType;\n    if (show != null) result.show = show;\n    if (bubble != null) result.bubble = bubble;\n    return result;\n  }\n\n  ClickButton._();\n\n  factory ClickButton.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ClickButton.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ClickButton',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..pPS(1, _omitFieldNames ? '' : 'portraitText')\n    ..pPS(2, _omitFieldNames ? '' : 'landscapeText')\n    ..pPS(3, _omitFieldNames ? '' : 'portraitTextFocus')\n    ..pPS(4, _omitFieldNames ? '' : 'landscapeTextFocus')\n    ..aE<RenderType>(5, _omitFieldNames ? '' : 'renderType',\n        enumValues: RenderType.values)\n    ..aOB(6, _omitFieldNames ? '' : 'show')\n    ..aOM<Bubble>(7, _omitFieldNames ? '' : 'bubble', subBuilder: Bubble.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ClickButton clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ClickButton copyWith(void Function(ClickButton) updates) =>\n      super.copyWith((message) => updates(message as ClickButton))\n          as ClickButton;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ClickButton create() => ClickButton._();\n  @$core.override\n  ClickButton createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ClickButton getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ClickButton>(create);\n  static ClickButton? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<$core.String> get portraitText => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<$core.String> get landscapeText => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<$core.String> get portraitTextFocus => $_getList(2);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<$core.String> get landscapeTextFocus => $_getList(3);\n\n  @$pb.TagNumber(5)\n  RenderType get renderType => $_getN(4);\n  @$pb.TagNumber(5)\n  set renderType(RenderType value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasRenderType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearRenderType() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.bool get show => $_getBF(5);\n  @$pb.TagNumber(6)\n  set show($core.bool value) => $_setBool(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasShow() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearShow() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  Bubble get bubble => $_getN(6);\n  @$pb.TagNumber(7)\n  set bubble(Bubble value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBubble() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBubble() => $_clearField(7);\n  @$pb.TagNumber(7)\n  Bubble ensureBubble() => $_ensure(6);\n}\n\nclass ClickButtonV2 extends $pb.GeneratedMessage {\n  factory ClickButtonV2({\n    $core.Iterable<$core.String>? portraitText,\n    $core.Iterable<$core.String>? landscapeText,\n    $core.Iterable<$core.String>? portraitTextFocus,\n    $core.Iterable<$core.String>? landscapeTextFocus,\n    RenderType? renderType,\n    $core.bool? textInputPost,\n    $core.bool? exposureOnce,\n    ExposureType? exposureType,\n  }) {\n    final result = create();\n    if (portraitText != null) result.portraitText.addAll(portraitText);\n    if (landscapeText != null) result.landscapeText.addAll(landscapeText);\n    if (portraitTextFocus != null)\n      result.portraitTextFocus.addAll(portraitTextFocus);\n    if (landscapeTextFocus != null)\n      result.landscapeTextFocus.addAll(landscapeTextFocus);\n    if (renderType != null) result.renderType = renderType;\n    if (textInputPost != null) result.textInputPost = textInputPost;\n    if (exposureOnce != null) result.exposureOnce = exposureOnce;\n    if (exposureType != null) result.exposureType = exposureType;\n    return result;\n  }\n\n  ClickButtonV2._();\n\n  factory ClickButtonV2.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ClickButtonV2.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ClickButtonV2',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..pPS(1, _omitFieldNames ? '' : 'portraitText')\n    ..pPS(2, _omitFieldNames ? '' : 'landscapeText')\n    ..pPS(3, _omitFieldNames ? '' : 'portraitTextFocus')\n    ..pPS(4, _omitFieldNames ? '' : 'landscapeTextFocus')\n    ..aE<RenderType>(5, _omitFieldNames ? '' : 'renderType',\n        enumValues: RenderType.values)\n    ..aOB(6, _omitFieldNames ? '' : 'textInputPost')\n    ..aOB(7, _omitFieldNames ? '' : 'exposureOnce')\n    ..aE<ExposureType>(8, _omitFieldNames ? '' : 'exposureType',\n        enumValues: ExposureType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ClickButtonV2 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ClickButtonV2 copyWith(void Function(ClickButtonV2) updates) =>\n      super.copyWith((message) => updates(message as ClickButtonV2))\n          as ClickButtonV2;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ClickButtonV2 create() => ClickButtonV2._();\n  @$core.override\n  ClickButtonV2 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ClickButtonV2 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ClickButtonV2>(create);\n  static ClickButtonV2? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<$core.String> get portraitText => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<$core.String> get landscapeText => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<$core.String> get portraitTextFocus => $_getList(2);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<$core.String> get landscapeTextFocus => $_getList(3);\n\n  @$pb.TagNumber(5)\n  RenderType get renderType => $_getN(4);\n  @$pb.TagNumber(5)\n  set renderType(RenderType value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasRenderType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearRenderType() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.bool get textInputPost => $_getBF(5);\n  @$pb.TagNumber(6)\n  set textInputPost($core.bool value) => $_setBool(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasTextInputPost() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearTextInputPost() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.bool get exposureOnce => $_getBF(6);\n  @$pb.TagNumber(7)\n  set exposureOnce($core.bool value) => $_setBool(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasExposureOnce() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearExposureOnce() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  ExposureType get exposureType => $_getN(7);\n  @$pb.TagNumber(8)\n  set exposureType(ExposureType value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasExposureType() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearExposureType() => $_clearField(8);\n}\n\nclass Command extends $pb.GeneratedMessage {\n  factory Command({\n    $core.Iterable<CommandDm>? commandDms,\n  }) {\n    final result = create();\n    if (commandDms != null) result.commandDms.addAll(commandDms);\n    return result;\n  }\n\n  Command._();\n\n  factory Command.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Command.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Command',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..pPM<CommandDm>(1, _omitFieldNames ? '' : 'commandDms',\n        subBuilder: CommandDm.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Command clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Command copyWith(void Function(Command) updates) =>\n      super.copyWith((message) => updates(message as Command)) as Command;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Command create() => Command._();\n  @$core.override\n  Command createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Command getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Command>(create);\n  static Command? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<CommandDm> get commandDms => $_getList(0);\n}\n\nclass CommandDm extends $pb.GeneratedMessage {\n  factory CommandDm({\n    $fixnum.Int64? id,\n    $fixnum.Int64? oid,\n    $fixnum.Int64? mid,\n    $core.String? command,\n    $core.String? content,\n    $core.int? progress,\n    $core.String? ctime,\n    $core.String? mtime,\n    $core.String? extra,\n    $core.String? idstr,\n    $core.int? type,\n    $core.bool? autoCreate,\n    $core.int? countDown,\n    $core.int? attr,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (oid != null) result.oid = oid;\n    if (mid != null) result.mid = mid;\n    if (command != null) result.command = command;\n    if (content != null) result.content = content;\n    if (progress != null) result.progress = progress;\n    if (ctime != null) result.ctime = ctime;\n    if (mtime != null) result.mtime = mtime;\n    if (extra != null) result.extra = extra;\n    if (idstr != null) result.idstr = idstr;\n    if (type != null) result.type = type;\n    if (autoCreate != null) result.autoCreate = autoCreate;\n    if (countDown != null) result.countDown = countDown;\n    if (attr != null) result.attr = attr;\n    return result;\n  }\n\n  CommandDm._();\n\n  factory CommandDm.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CommandDm.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CommandDm',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aInt64(2, _omitFieldNames ? '' : 'oid')\n    ..aInt64(3, _omitFieldNames ? '' : 'mid')\n    ..aOS(4, _omitFieldNames ? '' : 'command')\n    ..aOS(5, _omitFieldNames ? '' : 'content')\n    ..aI(6, _omitFieldNames ? '' : 'progress')\n    ..aOS(7, _omitFieldNames ? '' : 'ctime')\n    ..aOS(8, _omitFieldNames ? '' : 'mtime')\n    ..aOS(9, _omitFieldNames ? '' : 'extra')\n    ..aOS(10, _omitFieldNames ? '' : 'idstr')\n    ..aI(11, _omitFieldNames ? '' : 'type')\n    ..aOB(12, _omitFieldNames ? '' : 'autoCreate')\n    ..aI(13, _omitFieldNames ? '' : 'countDown')\n    ..aI(14, _omitFieldNames ? '' : 'attr')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CommandDm clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CommandDm copyWith(void Function(CommandDm) updates) =>\n      super.copyWith((message) => updates(message as CommandDm)) as CommandDm;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CommandDm create() => CommandDm._();\n  @$core.override\n  CommandDm createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CommandDm getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CommandDm>(create);\n  static CommandDm? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get oid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set oid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get mid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set mid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasMid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearMid() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get command => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set command($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCommand() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCommand() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get content => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set content($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasContent() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearContent() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get progress => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set progress($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasProgress() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearProgress() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get ctime => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set ctime($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCtime() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCtime() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get mtime => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set mtime($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasMtime() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearMtime() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get extra => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set extra($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasExtra() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearExtra() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get idstr => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set idstr($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasIdstr() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearIdstr() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.int get type => $_getIZ(10);\n  @$pb.TagNumber(11)\n  set type($core.int value) => $_setSignedInt32(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasType() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearType() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.bool get autoCreate => $_getBF(11);\n  @$pb.TagNumber(12)\n  set autoCreate($core.bool value) => $_setBool(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasAutoCreate() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearAutoCreate() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.int get countDown => $_getIZ(12);\n  @$pb.TagNumber(13)\n  set countDown($core.int value) => $_setSignedInt32(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasCountDown() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearCountDown() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.int get attr => $_getIZ(13);\n  @$pb.TagNumber(14)\n  set attr($core.int value) => $_setSignedInt32(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasAttr() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearAttr() => $_clearField(14);\n}\n\nclass DanmakuAIFlag extends $pb.GeneratedMessage {\n  factory DanmakuAIFlag({\n    $core.Iterable<DanmakuFlag>? dmFlags,\n  }) {\n    final result = create();\n    if (dmFlags != null) result.dmFlags.addAll(dmFlags);\n    return result;\n  }\n\n  DanmakuAIFlag._();\n\n  factory DanmakuAIFlag.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DanmakuAIFlag.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DanmakuAIFlag',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..pPM<DanmakuFlag>(1, _omitFieldNames ? '' : 'dmFlags',\n        subBuilder: DanmakuFlag.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DanmakuAIFlag clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DanmakuAIFlag copyWith(void Function(DanmakuAIFlag) updates) =>\n      super.copyWith((message) => updates(message as DanmakuAIFlag))\n          as DanmakuAIFlag;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DanmakuAIFlag create() => DanmakuAIFlag._();\n  @$core.override\n  DanmakuAIFlag createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DanmakuAIFlag getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DanmakuAIFlag>(create);\n  static DanmakuAIFlag? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<DanmakuFlag> get dmFlags => $_getList(0);\n}\n\nclass DanmakuElem extends $pb.GeneratedMessage {\n  factory DanmakuElem({\n    $fixnum.Int64? id,\n    $core.int? progress,\n    $core.int? mode,\n    $core.int? fontsize,\n    $core.int? color,\n    $core.String? midHash,\n    $core.String? content,\n    $fixnum.Int64? ctime,\n    $core.int? weight,\n    $core.String? action,\n    $core.int? pool,\n    $core.String? idStr,\n    $core.int? attr,\n    $fixnum.Int64? like,\n    $core.String? animation,\n    $core.String? extra,\n    DmColorfulType? colorful,\n    $core.int? type,\n    $fixnum.Int64? oid,\n    DmFromType? dmFrom,\n    $core.int? count,\n    $core.bool? isSelf,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (progress != null) result.progress = progress;\n    if (mode != null) result.mode = mode;\n    if (fontsize != null) result.fontsize = fontsize;\n    if (color != null) result.color = color;\n    if (midHash != null) result.midHash = midHash;\n    if (content != null) result.content = content;\n    if (ctime != null) result.ctime = ctime;\n    if (weight != null) result.weight = weight;\n    if (action != null) result.action = action;\n    if (pool != null) result.pool = pool;\n    if (idStr != null) result.idStr = idStr;\n    if (attr != null) result.attr = attr;\n    if (like != null) result.like = like;\n    if (animation != null) result.animation = animation;\n    if (extra != null) result.extra = extra;\n    if (colorful != null) result.colorful = colorful;\n    if (type != null) result.type = type;\n    if (oid != null) result.oid = oid;\n    if (dmFrom != null) result.dmFrom = dmFrom;\n    if (count != null) result.count = count;\n    if (isSelf != null) result.isSelf = isSelf;\n    return result;\n  }\n\n  DanmakuElem._();\n\n  factory DanmakuElem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DanmakuElem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DanmakuElem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aI(2, _omitFieldNames ? '' : 'progress')\n    ..aI(3, _omitFieldNames ? '' : 'mode')\n    ..aI(4, _omitFieldNames ? '' : 'fontsize')\n    ..aI(5, _omitFieldNames ? '' : 'color', fieldType: $pb.PbFieldType.OU3)\n    ..aOS(6, _omitFieldNames ? '' : 'midHash')\n    ..aOS(7, _omitFieldNames ? '' : 'content')\n    ..aInt64(8, _omitFieldNames ? '' : 'ctime')\n    ..aI(9, _omitFieldNames ? '' : 'weight')\n    ..aOS(10, _omitFieldNames ? '' : 'action')\n    ..aI(11, _omitFieldNames ? '' : 'pool')\n    ..aOS(12, _omitFieldNames ? '' : 'idStr')\n    ..aI(13, _omitFieldNames ? '' : 'attr')\n    ..aInt64(15, _omitFieldNames ? '' : 'like')\n    ..aOS(22, _omitFieldNames ? '' : 'animation')\n    ..aOS(23, _omitFieldNames ? '' : 'extra')\n    ..aE<DmColorfulType>(24, _omitFieldNames ? '' : 'colorful',\n        enumValues: DmColorfulType.values)\n    ..aI(25, _omitFieldNames ? '' : 'type')\n    ..aInt64(26, _omitFieldNames ? '' : 'oid')\n    ..aE<DmFromType>(27, _omitFieldNames ? '' : 'dmFrom',\n        enumValues: DmFromType.values)\n    ..aI(28, _omitFieldNames ? '' : 'count')\n    ..aOB(29, _omitFieldNames ? '' : 'isSelf')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DanmakuElem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DanmakuElem copyWith(void Function(DanmakuElem) updates) =>\n      super.copyWith((message) => updates(message as DanmakuElem))\n          as DanmakuElem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DanmakuElem create() => DanmakuElem._();\n  @$core.override\n  DanmakuElem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DanmakuElem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DanmakuElem>(create);\n  static DanmakuElem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get progress => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set progress($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasProgress() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearProgress() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get mode => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set mode($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasMode() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearMode() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get fontsize => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set fontsize($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFontsize() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFontsize() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get color => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set color($core.int value) => $_setUnsignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasColor() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearColor() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get midHash => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set midHash($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasMidHash() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearMidHash() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get content => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set content($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasContent() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearContent() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get ctime => $_getI64(7);\n  @$pb.TagNumber(8)\n  set ctime($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasCtime() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearCtime() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.int get weight => $_getIZ(8);\n  @$pb.TagNumber(9)\n  set weight($core.int value) => $_setSignedInt32(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasWeight() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearWeight() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get action => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set action($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasAction() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearAction() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.int get pool => $_getIZ(10);\n  @$pb.TagNumber(11)\n  set pool($core.int value) => $_setSignedInt32(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasPool() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearPool() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get idStr => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set idStr($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasIdStr() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearIdStr() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.int get attr => $_getIZ(12);\n  @$pb.TagNumber(13)\n  set attr($core.int value) => $_setSignedInt32(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasAttr() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearAttr() => $_clearField(13);\n\n  @$pb.TagNumber(15)\n  $fixnum.Int64 get like => $_getI64(13);\n  @$pb.TagNumber(15)\n  set like($fixnum.Int64 value) => $_setInt64(13, value);\n  @$pb.TagNumber(15)\n  $core.bool hasLike() => $_has(13);\n  @$pb.TagNumber(15)\n  void clearLike() => $_clearField(15);\n\n  @$pb.TagNumber(22)\n  $core.String get animation => $_getSZ(14);\n  @$pb.TagNumber(22)\n  set animation($core.String value) => $_setString(14, value);\n  @$pb.TagNumber(22)\n  $core.bool hasAnimation() => $_has(14);\n  @$pb.TagNumber(22)\n  void clearAnimation() => $_clearField(22);\n\n  @$pb.TagNumber(23)\n  $core.String get extra => $_getSZ(15);\n  @$pb.TagNumber(23)\n  set extra($core.String value) => $_setString(15, value);\n  @$pb.TagNumber(23)\n  $core.bool hasExtra() => $_has(15);\n  @$pb.TagNumber(23)\n  void clearExtra() => $_clearField(23);\n\n  @$pb.TagNumber(24)\n  DmColorfulType get colorful => $_getN(16);\n  @$pb.TagNumber(24)\n  set colorful(DmColorfulType value) => $_setField(24, value);\n  @$pb.TagNumber(24)\n  $core.bool hasColorful() => $_has(16);\n  @$pb.TagNumber(24)\n  void clearColorful() => $_clearField(24);\n\n  @$pb.TagNumber(25)\n  $core.int get type => $_getIZ(17);\n  @$pb.TagNumber(25)\n  set type($core.int value) => $_setSignedInt32(17, value);\n  @$pb.TagNumber(25)\n  $core.bool hasType() => $_has(17);\n  @$pb.TagNumber(25)\n  void clearType() => $_clearField(25);\n\n  @$pb.TagNumber(26)\n  $fixnum.Int64 get oid => $_getI64(18);\n  @$pb.TagNumber(26)\n  set oid($fixnum.Int64 value) => $_setInt64(18, value);\n  @$pb.TagNumber(26)\n  $core.bool hasOid() => $_has(18);\n  @$pb.TagNumber(26)\n  void clearOid() => $_clearField(26);\n\n  @$pb.TagNumber(27)\n  DmFromType get dmFrom => $_getN(19);\n  @$pb.TagNumber(27)\n  set dmFrom(DmFromType value) => $_setField(27, value);\n  @$pb.TagNumber(27)\n  $core.bool hasDmFrom() => $_has(19);\n  @$pb.TagNumber(27)\n  void clearDmFrom() => $_clearField(27);\n\n  @$pb.TagNumber(28)\n  $core.int get count => $_getIZ(20);\n  @$pb.TagNumber(28)\n  set count($core.int value) => $_setSignedInt32(20, value);\n  @$pb.TagNumber(28)\n  $core.bool hasCount() => $_has(20);\n  @$pb.TagNumber(28)\n  void clearCount() => $_clearField(28);\n\n  @$pb.TagNumber(29)\n  $core.bool get isSelf => $_getBF(21);\n  @$pb.TagNumber(29)\n  set isSelf($core.bool value) => $_setBool(21, value);\n  @$pb.TagNumber(29)\n  $core.bool hasIsSelf() => $_has(21);\n  @$pb.TagNumber(29)\n  void clearIsSelf() => $_clearField(29);\n}\n\nclass DanmakuFlag extends $pb.GeneratedMessage {\n  factory DanmakuFlag({\n    $fixnum.Int64? dmid,\n    $core.int? flag,\n  }) {\n    final result = create();\n    if (dmid != null) result.dmid = dmid;\n    if (flag != null) result.flag = flag;\n    return result;\n  }\n\n  DanmakuFlag._();\n\n  factory DanmakuFlag.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DanmakuFlag.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DanmakuFlag',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'dmid')\n    ..aI(2, _omitFieldNames ? '' : 'flag')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DanmakuFlag clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DanmakuFlag copyWith(void Function(DanmakuFlag) updates) =>\n      super.copyWith((message) => updates(message as DanmakuFlag))\n          as DanmakuFlag;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DanmakuFlag create() => DanmakuFlag._();\n  @$core.override\n  DanmakuFlag createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DanmakuFlag getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DanmakuFlag>(create);\n  static DanmakuFlag? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get dmid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set dmid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDmid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDmid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get flag => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set flag($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFlag() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFlag() => $_clearField(2);\n}\n\nclass DanmakuFlagConfig extends $pb.GeneratedMessage {\n  factory DanmakuFlagConfig({\n    $core.int? recFlag,\n    $core.String? recText,\n    $core.int? recSwitch,\n  }) {\n    final result = create();\n    if (recFlag != null) result.recFlag = recFlag;\n    if (recText != null) result.recText = recText;\n    if (recSwitch != null) result.recSwitch = recSwitch;\n    return result;\n  }\n\n  DanmakuFlagConfig._();\n\n  factory DanmakuFlagConfig.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DanmakuFlagConfig.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DanmakuFlagConfig',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'recFlag')\n    ..aOS(2, _omitFieldNames ? '' : 'recText')\n    ..aI(3, _omitFieldNames ? '' : 'recSwitch')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DanmakuFlagConfig clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DanmakuFlagConfig copyWith(void Function(DanmakuFlagConfig) updates) =>\n      super.copyWith((message) => updates(message as DanmakuFlagConfig))\n          as DanmakuFlagConfig;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DanmakuFlagConfig create() => DanmakuFlagConfig._();\n  @$core.override\n  DanmakuFlagConfig createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DanmakuFlagConfig getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DanmakuFlagConfig>(create);\n  static DanmakuFlagConfig? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get recFlag => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set recFlag($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasRecFlag() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRecFlag() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get recText => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set recText($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasRecText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRecText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get recSwitch => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set recSwitch($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRecSwitch() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRecSwitch() => $_clearField(3);\n}\n\nclass DanmuDefaultPlayerConfig extends $pb.GeneratedMessage {\n  factory DanmuDefaultPlayerConfig({\n    $core.bool? playerDanmakuUseDefaultConfig,\n    $core.bool? playerDanmakuAiRecommendedSwitch,\n    $core.int? playerDanmakuAiRecommendedLevel,\n    $core.bool? playerDanmakuBlocktop,\n    $core.bool? playerDanmakuBlockscroll,\n    $core.bool? playerDanmakuBlockbottom,\n    $core.bool? playerDanmakuBlockcolorful,\n    $core.bool? playerDanmakuBlockrepeat,\n    $core.bool? playerDanmakuBlockspecial,\n    $core.double? playerDanmakuOpacity,\n    $core.double? playerDanmakuScalingfactor,\n    $core.double? playerDanmakuDomain,\n    $core.int? playerDanmakuSpeed,\n    $core.bool? inlinePlayerDanmakuSwitch,\n    $core.int? playerDanmakuSeniorModeSwitch,\n    $core.int? playerDanmakuAiRecommendedLevelV2,\n    $core.Iterable<$core.MapEntry<$core.int, $core.int>>?\n        playerDanmakuAiRecommendedLevelV2Map,\n    $core.bool? playerDanmakuEnableHerdDm,\n  }) {\n    final result = create();\n    if (playerDanmakuUseDefaultConfig != null)\n      result.playerDanmakuUseDefaultConfig = playerDanmakuUseDefaultConfig;\n    if (playerDanmakuAiRecommendedSwitch != null)\n      result.playerDanmakuAiRecommendedSwitch =\n          playerDanmakuAiRecommendedSwitch;\n    if (playerDanmakuAiRecommendedLevel != null)\n      result.playerDanmakuAiRecommendedLevel = playerDanmakuAiRecommendedLevel;\n    if (playerDanmakuBlocktop != null)\n      result.playerDanmakuBlocktop = playerDanmakuBlocktop;\n    if (playerDanmakuBlockscroll != null)\n      result.playerDanmakuBlockscroll = playerDanmakuBlockscroll;\n    if (playerDanmakuBlockbottom != null)\n      result.playerDanmakuBlockbottom = playerDanmakuBlockbottom;\n    if (playerDanmakuBlockcolorful != null)\n      result.playerDanmakuBlockcolorful = playerDanmakuBlockcolorful;\n    if (playerDanmakuBlockrepeat != null)\n      result.playerDanmakuBlockrepeat = playerDanmakuBlockrepeat;\n    if (playerDanmakuBlockspecial != null)\n      result.playerDanmakuBlockspecial = playerDanmakuBlockspecial;\n    if (playerDanmakuOpacity != null)\n      result.playerDanmakuOpacity = playerDanmakuOpacity;\n    if (playerDanmakuScalingfactor != null)\n      result.playerDanmakuScalingfactor = playerDanmakuScalingfactor;\n    if (playerDanmakuDomain != null)\n      result.playerDanmakuDomain = playerDanmakuDomain;\n    if (playerDanmakuSpeed != null)\n      result.playerDanmakuSpeed = playerDanmakuSpeed;\n    if (inlinePlayerDanmakuSwitch != null)\n      result.inlinePlayerDanmakuSwitch = inlinePlayerDanmakuSwitch;\n    if (playerDanmakuSeniorModeSwitch != null)\n      result.playerDanmakuSeniorModeSwitch = playerDanmakuSeniorModeSwitch;\n    if (playerDanmakuAiRecommendedLevelV2 != null)\n      result.playerDanmakuAiRecommendedLevelV2 =\n          playerDanmakuAiRecommendedLevelV2;\n    if (playerDanmakuAiRecommendedLevelV2Map != null)\n      result.playerDanmakuAiRecommendedLevelV2Map\n          .addEntries(playerDanmakuAiRecommendedLevelV2Map);\n    if (playerDanmakuEnableHerdDm != null)\n      result.playerDanmakuEnableHerdDm = playerDanmakuEnableHerdDm;\n    return result;\n  }\n\n  DanmuDefaultPlayerConfig._();\n\n  factory DanmuDefaultPlayerConfig.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DanmuDefaultPlayerConfig.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DanmuDefaultPlayerConfig',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'playerDanmakuUseDefaultConfig')\n    ..aOB(4, _omitFieldNames ? '' : 'playerDanmakuAiRecommendedSwitch')\n    ..aI(5, _omitFieldNames ? '' : 'playerDanmakuAiRecommendedLevel')\n    ..aOB(6, _omitFieldNames ? '' : 'playerDanmakuBlocktop')\n    ..aOB(7, _omitFieldNames ? '' : 'playerDanmakuBlockscroll')\n    ..aOB(8, _omitFieldNames ? '' : 'playerDanmakuBlockbottom')\n    ..aOB(9, _omitFieldNames ? '' : 'playerDanmakuBlockcolorful')\n    ..aOB(10, _omitFieldNames ? '' : 'playerDanmakuBlockrepeat')\n    ..aOB(11, _omitFieldNames ? '' : 'playerDanmakuBlockspecial')\n    ..aD(12, _omitFieldNames ? '' : 'playerDanmakuOpacity',\n        fieldType: $pb.PbFieldType.OF)\n    ..aD(13, _omitFieldNames ? '' : 'playerDanmakuScalingfactor',\n        fieldType: $pb.PbFieldType.OF)\n    ..aD(14, _omitFieldNames ? '' : 'playerDanmakuDomain',\n        fieldType: $pb.PbFieldType.OF)\n    ..aI(15, _omitFieldNames ? '' : 'playerDanmakuSpeed')\n    ..aOB(16, _omitFieldNames ? '' : 'inlinePlayerDanmakuSwitch')\n    ..aI(17, _omitFieldNames ? '' : 'playerDanmakuSeniorModeSwitch')\n    ..aI(18, _omitFieldNames ? '' : 'playerDanmakuAiRecommendedLevelV2')\n    ..m<$core.int, $core.int>(\n        19, _omitFieldNames ? '' : 'playerDanmakuAiRecommendedLevelV2Map',\n        entryClassName:\n            'DanmuDefaultPlayerConfig.PlayerDanmakuAiRecommendedLevelV2MapEntry',\n        keyFieldType: $pb.PbFieldType.O3,\n        valueFieldType: $pb.PbFieldType.O3,\n        packageName: const $pb.PackageName('bilibili.community.service.dm.v1'))\n    ..aOB(20, _omitFieldNames ? '' : 'playerDanmakuEnableHerdDm')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DanmuDefaultPlayerConfig clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DanmuDefaultPlayerConfig copyWith(\n          void Function(DanmuDefaultPlayerConfig) updates) =>\n      super.copyWith((message) => updates(message as DanmuDefaultPlayerConfig))\n          as DanmuDefaultPlayerConfig;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DanmuDefaultPlayerConfig create() => DanmuDefaultPlayerConfig._();\n  @$core.override\n  DanmuDefaultPlayerConfig createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DanmuDefaultPlayerConfig getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DanmuDefaultPlayerConfig>(create);\n  static DanmuDefaultPlayerConfig? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get playerDanmakuUseDefaultConfig => $_getBF(0);\n  @$pb.TagNumber(1)\n  set playerDanmakuUseDefaultConfig($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPlayerDanmakuUseDefaultConfig() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPlayerDanmakuUseDefaultConfig() => $_clearField(1);\n\n  @$pb.TagNumber(4)\n  $core.bool get playerDanmakuAiRecommendedSwitch => $_getBF(1);\n  @$pb.TagNumber(4)\n  set playerDanmakuAiRecommendedSwitch($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPlayerDanmakuAiRecommendedSwitch() => $_has(1);\n  @$pb.TagNumber(4)\n  void clearPlayerDanmakuAiRecommendedSwitch() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get playerDanmakuAiRecommendedLevel => $_getIZ(2);\n  @$pb.TagNumber(5)\n  set playerDanmakuAiRecommendedLevel($core.int value) =>\n      $_setSignedInt32(2, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPlayerDanmakuAiRecommendedLevel() => $_has(2);\n  @$pb.TagNumber(5)\n  void clearPlayerDanmakuAiRecommendedLevel() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.bool get playerDanmakuBlocktop => $_getBF(3);\n  @$pb.TagNumber(6)\n  set playerDanmakuBlocktop($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(6)\n  $core.bool hasPlayerDanmakuBlocktop() => $_has(3);\n  @$pb.TagNumber(6)\n  void clearPlayerDanmakuBlocktop() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.bool get playerDanmakuBlockscroll => $_getBF(4);\n  @$pb.TagNumber(7)\n  set playerDanmakuBlockscroll($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(7)\n  $core.bool hasPlayerDanmakuBlockscroll() => $_has(4);\n  @$pb.TagNumber(7)\n  void clearPlayerDanmakuBlockscroll() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.bool get playerDanmakuBlockbottom => $_getBF(5);\n  @$pb.TagNumber(8)\n  set playerDanmakuBlockbottom($core.bool value) => $_setBool(5, value);\n  @$pb.TagNumber(8)\n  $core.bool hasPlayerDanmakuBlockbottom() => $_has(5);\n  @$pb.TagNumber(8)\n  void clearPlayerDanmakuBlockbottom() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.bool get playerDanmakuBlockcolorful => $_getBF(6);\n  @$pb.TagNumber(9)\n  set playerDanmakuBlockcolorful($core.bool value) => $_setBool(6, value);\n  @$pb.TagNumber(9)\n  $core.bool hasPlayerDanmakuBlockcolorful() => $_has(6);\n  @$pb.TagNumber(9)\n  void clearPlayerDanmakuBlockcolorful() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.bool get playerDanmakuBlockrepeat => $_getBF(7);\n  @$pb.TagNumber(10)\n  set playerDanmakuBlockrepeat($core.bool value) => $_setBool(7, value);\n  @$pb.TagNumber(10)\n  $core.bool hasPlayerDanmakuBlockrepeat() => $_has(7);\n  @$pb.TagNumber(10)\n  void clearPlayerDanmakuBlockrepeat() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.bool get playerDanmakuBlockspecial => $_getBF(8);\n  @$pb.TagNumber(11)\n  set playerDanmakuBlockspecial($core.bool value) => $_setBool(8, value);\n  @$pb.TagNumber(11)\n  $core.bool hasPlayerDanmakuBlockspecial() => $_has(8);\n  @$pb.TagNumber(11)\n  void clearPlayerDanmakuBlockspecial() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.double get playerDanmakuOpacity => $_getN(9);\n  @$pb.TagNumber(12)\n  set playerDanmakuOpacity($core.double value) => $_setFloat(9, value);\n  @$pb.TagNumber(12)\n  $core.bool hasPlayerDanmakuOpacity() => $_has(9);\n  @$pb.TagNumber(12)\n  void clearPlayerDanmakuOpacity() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.double get playerDanmakuScalingfactor => $_getN(10);\n  @$pb.TagNumber(13)\n  set playerDanmakuScalingfactor($core.double value) => $_setFloat(10, value);\n  @$pb.TagNumber(13)\n  $core.bool hasPlayerDanmakuScalingfactor() => $_has(10);\n  @$pb.TagNumber(13)\n  void clearPlayerDanmakuScalingfactor() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.double get playerDanmakuDomain => $_getN(11);\n  @$pb.TagNumber(14)\n  set playerDanmakuDomain($core.double value) => $_setFloat(11, value);\n  @$pb.TagNumber(14)\n  $core.bool hasPlayerDanmakuDomain() => $_has(11);\n  @$pb.TagNumber(14)\n  void clearPlayerDanmakuDomain() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $core.int get playerDanmakuSpeed => $_getIZ(12);\n  @$pb.TagNumber(15)\n  set playerDanmakuSpeed($core.int value) => $_setSignedInt32(12, value);\n  @$pb.TagNumber(15)\n  $core.bool hasPlayerDanmakuSpeed() => $_has(12);\n  @$pb.TagNumber(15)\n  void clearPlayerDanmakuSpeed() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $core.bool get inlinePlayerDanmakuSwitch => $_getBF(13);\n  @$pb.TagNumber(16)\n  set inlinePlayerDanmakuSwitch($core.bool value) => $_setBool(13, value);\n  @$pb.TagNumber(16)\n  $core.bool hasInlinePlayerDanmakuSwitch() => $_has(13);\n  @$pb.TagNumber(16)\n  void clearInlinePlayerDanmakuSwitch() => $_clearField(16);\n\n  @$pb.TagNumber(17)\n  $core.int get playerDanmakuSeniorModeSwitch => $_getIZ(14);\n  @$pb.TagNumber(17)\n  set playerDanmakuSeniorModeSwitch($core.int value) =>\n      $_setSignedInt32(14, value);\n  @$pb.TagNumber(17)\n  $core.bool hasPlayerDanmakuSeniorModeSwitch() => $_has(14);\n  @$pb.TagNumber(17)\n  void clearPlayerDanmakuSeniorModeSwitch() => $_clearField(17);\n\n  @$pb.TagNumber(18)\n  $core.int get playerDanmakuAiRecommendedLevelV2 => $_getIZ(15);\n  @$pb.TagNumber(18)\n  set playerDanmakuAiRecommendedLevelV2($core.int value) =>\n      $_setSignedInt32(15, value);\n  @$pb.TagNumber(18)\n  $core.bool hasPlayerDanmakuAiRecommendedLevelV2() => $_has(15);\n  @$pb.TagNumber(18)\n  void clearPlayerDanmakuAiRecommendedLevelV2() => $_clearField(18);\n\n  @$pb.TagNumber(19)\n  $pb.PbMap<$core.int, $core.int> get playerDanmakuAiRecommendedLevelV2Map =>\n      $_getMap(16);\n\n  @$pb.TagNumber(20)\n  $core.bool get playerDanmakuEnableHerdDm => $_getBF(17);\n  @$pb.TagNumber(20)\n  set playerDanmakuEnableHerdDm($core.bool value) => $_setBool(17, value);\n  @$pb.TagNumber(20)\n  $core.bool hasPlayerDanmakuEnableHerdDm() => $_has(17);\n  @$pb.TagNumber(20)\n  void clearPlayerDanmakuEnableHerdDm() => $_clearField(20);\n}\n\nclass DanmuPlayerConfig extends $pb.GeneratedMessage {\n  factory DanmuPlayerConfig({\n    $core.bool? playerDanmakuSwitch,\n    $core.bool? playerDanmakuSwitchSave,\n    $core.bool? playerDanmakuUseDefaultConfig,\n    $core.bool? playerDanmakuAiRecommendedSwitch,\n    $core.int? playerDanmakuAiRecommendedLevel,\n    $core.bool? playerDanmakuBlocktop,\n    $core.bool? playerDanmakuBlockscroll,\n    $core.bool? playerDanmakuBlockbottom,\n    $core.bool? playerDanmakuBlockcolorful,\n    $core.bool? playerDanmakuBlockrepeat,\n    $core.bool? playerDanmakuBlockspecial,\n    $core.double? playerDanmakuOpacity,\n    $core.double? playerDanmakuScalingfactor,\n    $core.double? playerDanmakuDomain,\n    $core.int? playerDanmakuSpeed,\n    $core.bool? playerDanmakuEnableblocklist,\n    $core.bool? inlinePlayerDanmakuSwitch,\n    $core.int? inlinePlayerDanmakuConfig,\n    $core.int? playerDanmakuIosSwitchSave,\n    $core.int? playerDanmakuSeniorModeSwitch,\n    $core.int? playerDanmakuAiRecommendedLevelV2,\n    $core.Iterable<$core.MapEntry<$core.int, $core.int>>?\n        playerDanmakuAiRecommendedLevelV2Map,\n    $core.bool? playerDanmakuEnableHerdDm,\n    $core.bool? playerDanmakuBlocktopBottom,\n    $core.int? playerDanmakuDomainV2,\n    $core.int? playerDanmakuDensity,\n    $core.bool? playerDanmakuSubtitleProof,\n    $core.bool? playerDanmakuPeopleProof,\n  }) {\n    final result = create();\n    if (playerDanmakuSwitch != null)\n      result.playerDanmakuSwitch = playerDanmakuSwitch;\n    if (playerDanmakuSwitchSave != null)\n      result.playerDanmakuSwitchSave = playerDanmakuSwitchSave;\n    if (playerDanmakuUseDefaultConfig != null)\n      result.playerDanmakuUseDefaultConfig = playerDanmakuUseDefaultConfig;\n    if (playerDanmakuAiRecommendedSwitch != null)\n      result.playerDanmakuAiRecommendedSwitch =\n          playerDanmakuAiRecommendedSwitch;\n    if (playerDanmakuAiRecommendedLevel != null)\n      result.playerDanmakuAiRecommendedLevel = playerDanmakuAiRecommendedLevel;\n    if (playerDanmakuBlocktop != null)\n      result.playerDanmakuBlocktop = playerDanmakuBlocktop;\n    if (playerDanmakuBlockscroll != null)\n      result.playerDanmakuBlockscroll = playerDanmakuBlockscroll;\n    if (playerDanmakuBlockbottom != null)\n      result.playerDanmakuBlockbottom = playerDanmakuBlockbottom;\n    if (playerDanmakuBlockcolorful != null)\n      result.playerDanmakuBlockcolorful = playerDanmakuBlockcolorful;\n    if (playerDanmakuBlockrepeat != null)\n      result.playerDanmakuBlockrepeat = playerDanmakuBlockrepeat;\n    if (playerDanmakuBlockspecial != null)\n      result.playerDanmakuBlockspecial = playerDanmakuBlockspecial;\n    if (playerDanmakuOpacity != null)\n      result.playerDanmakuOpacity = playerDanmakuOpacity;\n    if (playerDanmakuScalingfactor != null)\n      result.playerDanmakuScalingfactor = playerDanmakuScalingfactor;\n    if (playerDanmakuDomain != null)\n      result.playerDanmakuDomain = playerDanmakuDomain;\n    if (playerDanmakuSpeed != null)\n      result.playerDanmakuSpeed = playerDanmakuSpeed;\n    if (playerDanmakuEnableblocklist != null)\n      result.playerDanmakuEnableblocklist = playerDanmakuEnableblocklist;\n    if (inlinePlayerDanmakuSwitch != null)\n      result.inlinePlayerDanmakuSwitch = inlinePlayerDanmakuSwitch;\n    if (inlinePlayerDanmakuConfig != null)\n      result.inlinePlayerDanmakuConfig = inlinePlayerDanmakuConfig;\n    if (playerDanmakuIosSwitchSave != null)\n      result.playerDanmakuIosSwitchSave = playerDanmakuIosSwitchSave;\n    if (playerDanmakuSeniorModeSwitch != null)\n      result.playerDanmakuSeniorModeSwitch = playerDanmakuSeniorModeSwitch;\n    if (playerDanmakuAiRecommendedLevelV2 != null)\n      result.playerDanmakuAiRecommendedLevelV2 =\n          playerDanmakuAiRecommendedLevelV2;\n    if (playerDanmakuAiRecommendedLevelV2Map != null)\n      result.playerDanmakuAiRecommendedLevelV2Map\n          .addEntries(playerDanmakuAiRecommendedLevelV2Map);\n    if (playerDanmakuEnableHerdDm != null)\n      result.playerDanmakuEnableHerdDm = playerDanmakuEnableHerdDm;\n    if (playerDanmakuBlocktopBottom != null)\n      result.playerDanmakuBlocktopBottom = playerDanmakuBlocktopBottom;\n    if (playerDanmakuDomainV2 != null)\n      result.playerDanmakuDomainV2 = playerDanmakuDomainV2;\n    if (playerDanmakuDensity != null)\n      result.playerDanmakuDensity = playerDanmakuDensity;\n    if (playerDanmakuSubtitleProof != null)\n      result.playerDanmakuSubtitleProof = playerDanmakuSubtitleProof;\n    if (playerDanmakuPeopleProof != null)\n      result.playerDanmakuPeopleProof = playerDanmakuPeopleProof;\n    return result;\n  }\n\n  DanmuPlayerConfig._();\n\n  factory DanmuPlayerConfig.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DanmuPlayerConfig.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DanmuPlayerConfig',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'playerDanmakuSwitch')\n    ..aOB(2, _omitFieldNames ? '' : 'playerDanmakuSwitchSave')\n    ..aOB(3, _omitFieldNames ? '' : 'playerDanmakuUseDefaultConfig')\n    ..aOB(4, _omitFieldNames ? '' : 'playerDanmakuAiRecommendedSwitch')\n    ..aI(5, _omitFieldNames ? '' : 'playerDanmakuAiRecommendedLevel')\n    ..aOB(6, _omitFieldNames ? '' : 'playerDanmakuBlocktop')\n    ..aOB(7, _omitFieldNames ? '' : 'playerDanmakuBlockscroll')\n    ..aOB(8, _omitFieldNames ? '' : 'playerDanmakuBlockbottom')\n    ..aOB(9, _omitFieldNames ? '' : 'playerDanmakuBlockcolorful')\n    ..aOB(10, _omitFieldNames ? '' : 'playerDanmakuBlockrepeat')\n    ..aOB(11, _omitFieldNames ? '' : 'playerDanmakuBlockspecial')\n    ..aD(12, _omitFieldNames ? '' : 'playerDanmakuOpacity',\n        fieldType: $pb.PbFieldType.OF)\n    ..aD(13, _omitFieldNames ? '' : 'playerDanmakuScalingfactor',\n        fieldType: $pb.PbFieldType.OF)\n    ..aD(14, _omitFieldNames ? '' : 'playerDanmakuDomain',\n        fieldType: $pb.PbFieldType.OF)\n    ..aI(15, _omitFieldNames ? '' : 'playerDanmakuSpeed')\n    ..aOB(16, _omitFieldNames ? '' : 'playerDanmakuEnableblocklist')\n    ..aOB(17, _omitFieldNames ? '' : 'inlinePlayerDanmakuSwitch')\n    ..aI(18, _omitFieldNames ? '' : 'inlinePlayerDanmakuConfig')\n    ..aI(19, _omitFieldNames ? '' : 'playerDanmakuIosSwitchSave')\n    ..aI(20, _omitFieldNames ? '' : 'playerDanmakuSeniorModeSwitch')\n    ..aI(21, _omitFieldNames ? '' : 'playerDanmakuAiRecommendedLevelV2')\n    ..m<$core.int, $core.int>(\n        22, _omitFieldNames ? '' : 'playerDanmakuAiRecommendedLevelV2Map',\n        entryClassName:\n            'DanmuPlayerConfig.PlayerDanmakuAiRecommendedLevelV2MapEntry',\n        keyFieldType: $pb.PbFieldType.O3,\n        valueFieldType: $pb.PbFieldType.O3,\n        packageName: const $pb.PackageName('bilibili.community.service.dm.v1'))\n    ..aOB(23, _omitFieldNames ? '' : 'playerDanmakuEnableHerdDm')\n    ..aOB(24, _omitFieldNames ? '' : 'playerDanmakuBlocktopBottom')\n    ..aI(25, _omitFieldNames ? '' : 'playerDanmakuDomainV2')\n    ..aI(26, _omitFieldNames ? '' : 'playerDanmakuDensity')\n    ..aOB(27, _omitFieldNames ? '' : 'playerDanmakuSubtitleProof')\n    ..aOB(28, _omitFieldNames ? '' : 'playerDanmakuPeopleProof')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DanmuPlayerConfig clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DanmuPlayerConfig copyWith(void Function(DanmuPlayerConfig) updates) =>\n      super.copyWith((message) => updates(message as DanmuPlayerConfig))\n          as DanmuPlayerConfig;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DanmuPlayerConfig create() => DanmuPlayerConfig._();\n  @$core.override\n  DanmuPlayerConfig createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DanmuPlayerConfig getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DanmuPlayerConfig>(create);\n  static DanmuPlayerConfig? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get playerDanmakuSwitch => $_getBF(0);\n  @$pb.TagNumber(1)\n  set playerDanmakuSwitch($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPlayerDanmakuSwitch() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPlayerDanmakuSwitch() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get playerDanmakuSwitchSave => $_getBF(1);\n  @$pb.TagNumber(2)\n  set playerDanmakuSwitchSave($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPlayerDanmakuSwitchSave() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPlayerDanmakuSwitchSave() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get playerDanmakuUseDefaultConfig => $_getBF(2);\n  @$pb.TagNumber(3)\n  set playerDanmakuUseDefaultConfig($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPlayerDanmakuUseDefaultConfig() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPlayerDanmakuUseDefaultConfig() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get playerDanmakuAiRecommendedSwitch => $_getBF(3);\n  @$pb.TagNumber(4)\n  set playerDanmakuAiRecommendedSwitch($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPlayerDanmakuAiRecommendedSwitch() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPlayerDanmakuAiRecommendedSwitch() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get playerDanmakuAiRecommendedLevel => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set playerDanmakuAiRecommendedLevel($core.int value) =>\n      $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPlayerDanmakuAiRecommendedLevel() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPlayerDanmakuAiRecommendedLevel() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.bool get playerDanmakuBlocktop => $_getBF(5);\n  @$pb.TagNumber(6)\n  set playerDanmakuBlocktop($core.bool value) => $_setBool(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasPlayerDanmakuBlocktop() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearPlayerDanmakuBlocktop() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.bool get playerDanmakuBlockscroll => $_getBF(6);\n  @$pb.TagNumber(7)\n  set playerDanmakuBlockscroll($core.bool value) => $_setBool(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasPlayerDanmakuBlockscroll() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearPlayerDanmakuBlockscroll() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.bool get playerDanmakuBlockbottom => $_getBF(7);\n  @$pb.TagNumber(8)\n  set playerDanmakuBlockbottom($core.bool value) => $_setBool(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasPlayerDanmakuBlockbottom() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearPlayerDanmakuBlockbottom() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.bool get playerDanmakuBlockcolorful => $_getBF(8);\n  @$pb.TagNumber(9)\n  set playerDanmakuBlockcolorful($core.bool value) => $_setBool(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasPlayerDanmakuBlockcolorful() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearPlayerDanmakuBlockcolorful() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.bool get playerDanmakuBlockrepeat => $_getBF(9);\n  @$pb.TagNumber(10)\n  set playerDanmakuBlockrepeat($core.bool value) => $_setBool(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasPlayerDanmakuBlockrepeat() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearPlayerDanmakuBlockrepeat() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.bool get playerDanmakuBlockspecial => $_getBF(10);\n  @$pb.TagNumber(11)\n  set playerDanmakuBlockspecial($core.bool value) => $_setBool(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasPlayerDanmakuBlockspecial() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearPlayerDanmakuBlockspecial() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.double get playerDanmakuOpacity => $_getN(11);\n  @$pb.TagNumber(12)\n  set playerDanmakuOpacity($core.double value) => $_setFloat(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasPlayerDanmakuOpacity() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearPlayerDanmakuOpacity() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.double get playerDanmakuScalingfactor => $_getN(12);\n  @$pb.TagNumber(13)\n  set playerDanmakuScalingfactor($core.double value) => $_setFloat(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasPlayerDanmakuScalingfactor() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearPlayerDanmakuScalingfactor() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.double get playerDanmakuDomain => $_getN(13);\n  @$pb.TagNumber(14)\n  set playerDanmakuDomain($core.double value) => $_setFloat(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasPlayerDanmakuDomain() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearPlayerDanmakuDomain() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $core.int get playerDanmakuSpeed => $_getIZ(14);\n  @$pb.TagNumber(15)\n  set playerDanmakuSpeed($core.int value) => $_setSignedInt32(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasPlayerDanmakuSpeed() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearPlayerDanmakuSpeed() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $core.bool get playerDanmakuEnableblocklist => $_getBF(15);\n  @$pb.TagNumber(16)\n  set playerDanmakuEnableblocklist($core.bool value) => $_setBool(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasPlayerDanmakuEnableblocklist() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearPlayerDanmakuEnableblocklist() => $_clearField(16);\n\n  @$pb.TagNumber(17)\n  $core.bool get inlinePlayerDanmakuSwitch => $_getBF(16);\n  @$pb.TagNumber(17)\n  set inlinePlayerDanmakuSwitch($core.bool value) => $_setBool(16, value);\n  @$pb.TagNumber(17)\n  $core.bool hasInlinePlayerDanmakuSwitch() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearInlinePlayerDanmakuSwitch() => $_clearField(17);\n\n  @$pb.TagNumber(18)\n  $core.int get inlinePlayerDanmakuConfig => $_getIZ(17);\n  @$pb.TagNumber(18)\n  set inlinePlayerDanmakuConfig($core.int value) => $_setSignedInt32(17, value);\n  @$pb.TagNumber(18)\n  $core.bool hasInlinePlayerDanmakuConfig() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearInlinePlayerDanmakuConfig() => $_clearField(18);\n\n  @$pb.TagNumber(19)\n  $core.int get playerDanmakuIosSwitchSave => $_getIZ(18);\n  @$pb.TagNumber(19)\n  set playerDanmakuIosSwitchSave($core.int value) =>\n      $_setSignedInt32(18, value);\n  @$pb.TagNumber(19)\n  $core.bool hasPlayerDanmakuIosSwitchSave() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearPlayerDanmakuIosSwitchSave() => $_clearField(19);\n\n  @$pb.TagNumber(20)\n  $core.int get playerDanmakuSeniorModeSwitch => $_getIZ(19);\n  @$pb.TagNumber(20)\n  set playerDanmakuSeniorModeSwitch($core.int value) =>\n      $_setSignedInt32(19, value);\n  @$pb.TagNumber(20)\n  $core.bool hasPlayerDanmakuSeniorModeSwitch() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearPlayerDanmakuSeniorModeSwitch() => $_clearField(20);\n\n  @$pb.TagNumber(21)\n  $core.int get playerDanmakuAiRecommendedLevelV2 => $_getIZ(20);\n  @$pb.TagNumber(21)\n  set playerDanmakuAiRecommendedLevelV2($core.int value) =>\n      $_setSignedInt32(20, value);\n  @$pb.TagNumber(21)\n  $core.bool hasPlayerDanmakuAiRecommendedLevelV2() => $_has(20);\n  @$pb.TagNumber(21)\n  void clearPlayerDanmakuAiRecommendedLevelV2() => $_clearField(21);\n\n  @$pb.TagNumber(22)\n  $pb.PbMap<$core.int, $core.int> get playerDanmakuAiRecommendedLevelV2Map =>\n      $_getMap(21);\n\n  @$pb.TagNumber(23)\n  $core.bool get playerDanmakuEnableHerdDm => $_getBF(22);\n  @$pb.TagNumber(23)\n  set playerDanmakuEnableHerdDm($core.bool value) => $_setBool(22, value);\n  @$pb.TagNumber(23)\n  $core.bool hasPlayerDanmakuEnableHerdDm() => $_has(22);\n  @$pb.TagNumber(23)\n  void clearPlayerDanmakuEnableHerdDm() => $_clearField(23);\n\n  @$pb.TagNumber(24)\n  $core.bool get playerDanmakuBlocktopBottom => $_getBF(23);\n  @$pb.TagNumber(24)\n  set playerDanmakuBlocktopBottom($core.bool value) => $_setBool(23, value);\n  @$pb.TagNumber(24)\n  $core.bool hasPlayerDanmakuBlocktopBottom() => $_has(23);\n  @$pb.TagNumber(24)\n  void clearPlayerDanmakuBlocktopBottom() => $_clearField(24);\n\n  @$pb.TagNumber(25)\n  $core.int get playerDanmakuDomainV2 => $_getIZ(24);\n  @$pb.TagNumber(25)\n  set playerDanmakuDomainV2($core.int value) => $_setSignedInt32(24, value);\n  @$pb.TagNumber(25)\n  $core.bool hasPlayerDanmakuDomainV2() => $_has(24);\n  @$pb.TagNumber(25)\n  void clearPlayerDanmakuDomainV2() => $_clearField(25);\n\n  @$pb.TagNumber(26)\n  $core.int get playerDanmakuDensity => $_getIZ(25);\n  @$pb.TagNumber(26)\n  set playerDanmakuDensity($core.int value) => $_setSignedInt32(25, value);\n  @$pb.TagNumber(26)\n  $core.bool hasPlayerDanmakuDensity() => $_has(25);\n  @$pb.TagNumber(26)\n  void clearPlayerDanmakuDensity() => $_clearField(26);\n\n  @$pb.TagNumber(27)\n  $core.bool get playerDanmakuSubtitleProof => $_getBF(26);\n  @$pb.TagNumber(27)\n  set playerDanmakuSubtitleProof($core.bool value) => $_setBool(26, value);\n  @$pb.TagNumber(27)\n  $core.bool hasPlayerDanmakuSubtitleProof() => $_has(26);\n  @$pb.TagNumber(27)\n  void clearPlayerDanmakuSubtitleProof() => $_clearField(27);\n\n  @$pb.TagNumber(28)\n  $core.bool get playerDanmakuPeopleProof => $_getBF(27);\n  @$pb.TagNumber(28)\n  set playerDanmakuPeopleProof($core.bool value) => $_setBool(27, value);\n  @$pb.TagNumber(28)\n  $core.bool hasPlayerDanmakuPeopleProof() => $_has(27);\n  @$pb.TagNumber(28)\n  void clearPlayerDanmakuPeopleProof() => $_clearField(28);\n}\n\nclass DanmuPlayerConfigPanel extends $pb.GeneratedMessage {\n  factory DanmuPlayerConfigPanel({\n    $core.String? selectionText,\n  }) {\n    final result = create();\n    if (selectionText != null) result.selectionText = selectionText;\n    return result;\n  }\n\n  DanmuPlayerConfigPanel._();\n\n  factory DanmuPlayerConfigPanel.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DanmuPlayerConfigPanel.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DanmuPlayerConfigPanel',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'selectionText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DanmuPlayerConfigPanel clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DanmuPlayerConfigPanel copyWith(\n          void Function(DanmuPlayerConfigPanel) updates) =>\n      super.copyWith((message) => updates(message as DanmuPlayerConfigPanel))\n          as DanmuPlayerConfigPanel;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DanmuPlayerConfigPanel create() => DanmuPlayerConfigPanel._();\n  @$core.override\n  DanmuPlayerConfigPanel createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DanmuPlayerConfigPanel getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DanmuPlayerConfigPanel>(create);\n  static DanmuPlayerConfigPanel? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get selectionText => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set selectionText($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSelectionText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSelectionText() => $_clearField(1);\n}\n\nclass DanmuPlayerDynamicConfig extends $pb.GeneratedMessage {\n  factory DanmuPlayerDynamicConfig({\n    $core.int? progress,\n    $core.double? playerDanmakuDomain,\n  }) {\n    final result = create();\n    if (progress != null) result.progress = progress;\n    if (playerDanmakuDomain != null)\n      result.playerDanmakuDomain = playerDanmakuDomain;\n    return result;\n  }\n\n  DanmuPlayerDynamicConfig._();\n\n  factory DanmuPlayerDynamicConfig.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DanmuPlayerDynamicConfig.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DanmuPlayerDynamicConfig',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'progress')\n    ..aD(14, _omitFieldNames ? '' : 'playerDanmakuDomain',\n        fieldType: $pb.PbFieldType.OF)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DanmuPlayerDynamicConfig clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DanmuPlayerDynamicConfig copyWith(\n          void Function(DanmuPlayerDynamicConfig) updates) =>\n      super.copyWith((message) => updates(message as DanmuPlayerDynamicConfig))\n          as DanmuPlayerDynamicConfig;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DanmuPlayerDynamicConfig create() => DanmuPlayerDynamicConfig._();\n  @$core.override\n  DanmuPlayerDynamicConfig createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DanmuPlayerDynamicConfig getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DanmuPlayerDynamicConfig>(create);\n  static DanmuPlayerDynamicConfig? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get progress => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set progress($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasProgress() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearProgress() => $_clearField(1);\n\n  @$pb.TagNumber(14)\n  $core.double get playerDanmakuDomain => $_getN(1);\n  @$pb.TagNumber(14)\n  set playerDanmakuDomain($core.double value) => $_setFloat(1, value);\n  @$pb.TagNumber(14)\n  $core.bool hasPlayerDanmakuDomain() => $_has(1);\n  @$pb.TagNumber(14)\n  void clearPlayerDanmakuDomain() => $_clearField(14);\n}\n\nclass DanmuPlayerViewConfig extends $pb.GeneratedMessage {\n  factory DanmuPlayerViewConfig({\n    DanmuDefaultPlayerConfig? danmukuDefaultPlayerConfig,\n    DanmuPlayerConfig? danmukuPlayerConfig,\n    $core.Iterable<DanmuPlayerDynamicConfig>? danmukuPlayerDynamicConfig,\n    DanmuPlayerConfigPanel? danmukuPlayerConfigPanel,\n  }) {\n    final result = create();\n    if (danmukuDefaultPlayerConfig != null)\n      result.danmukuDefaultPlayerConfig = danmukuDefaultPlayerConfig;\n    if (danmukuPlayerConfig != null)\n      result.danmukuPlayerConfig = danmukuPlayerConfig;\n    if (danmukuPlayerDynamicConfig != null)\n      result.danmukuPlayerDynamicConfig.addAll(danmukuPlayerDynamicConfig);\n    if (danmukuPlayerConfigPanel != null)\n      result.danmukuPlayerConfigPanel = danmukuPlayerConfigPanel;\n    return result;\n  }\n\n  DanmuPlayerViewConfig._();\n\n  factory DanmuPlayerViewConfig.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DanmuPlayerViewConfig.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DanmuPlayerViewConfig',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOM<DanmuDefaultPlayerConfig>(\n        1, _omitFieldNames ? '' : 'danmukuDefaultPlayerConfig',\n        subBuilder: DanmuDefaultPlayerConfig.create)\n    ..aOM<DanmuPlayerConfig>(2, _omitFieldNames ? '' : 'danmukuPlayerConfig',\n        subBuilder: DanmuPlayerConfig.create)\n    ..pPM<DanmuPlayerDynamicConfig>(\n        3, _omitFieldNames ? '' : 'danmukuPlayerDynamicConfig',\n        subBuilder: DanmuPlayerDynamicConfig.create)\n    ..aOM<DanmuPlayerConfigPanel>(\n        4, _omitFieldNames ? '' : 'danmukuPlayerConfigPanel',\n        subBuilder: DanmuPlayerConfigPanel.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DanmuPlayerViewConfig clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DanmuPlayerViewConfig copyWith(\n          void Function(DanmuPlayerViewConfig) updates) =>\n      super.copyWith((message) => updates(message as DanmuPlayerViewConfig))\n          as DanmuPlayerViewConfig;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DanmuPlayerViewConfig create() => DanmuPlayerViewConfig._();\n  @$core.override\n  DanmuPlayerViewConfig createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DanmuPlayerViewConfig getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DanmuPlayerViewConfig>(create);\n  static DanmuPlayerViewConfig? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  DanmuDefaultPlayerConfig get danmukuDefaultPlayerConfig => $_getN(0);\n  @$pb.TagNumber(1)\n  set danmukuDefaultPlayerConfig(DanmuDefaultPlayerConfig value) =>\n      $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDanmukuDefaultPlayerConfig() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDanmukuDefaultPlayerConfig() => $_clearField(1);\n  @$pb.TagNumber(1)\n  DanmuDefaultPlayerConfig ensureDanmukuDefaultPlayerConfig() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  DanmuPlayerConfig get danmukuPlayerConfig => $_getN(1);\n  @$pb.TagNumber(2)\n  set danmukuPlayerConfig(DanmuPlayerConfig value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDanmukuPlayerConfig() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDanmukuPlayerConfig() => $_clearField(2);\n  @$pb.TagNumber(2)\n  DanmuPlayerConfig ensureDanmukuPlayerConfig() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<DanmuPlayerDynamicConfig> get danmukuPlayerDynamicConfig =>\n      $_getList(2);\n\n  @$pb.TagNumber(4)\n  DanmuPlayerConfigPanel get danmukuPlayerConfigPanel => $_getN(3);\n  @$pb.TagNumber(4)\n  set danmukuPlayerConfigPanel(DanmuPlayerConfigPanel value) =>\n      $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDanmukuPlayerConfigPanel() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDanmukuPlayerConfigPanel() => $_clearField(4);\n  @$pb.TagNumber(4)\n  DanmuPlayerConfigPanel ensureDanmukuPlayerConfigPanel() => $_ensure(3);\n}\n\nclass DanmuWebPlayerConfig extends $pb.GeneratedMessage {\n  factory DanmuWebPlayerConfig({\n    $core.bool? dmSwitch,\n    $core.bool? aiSwitch,\n    $core.int? aiLevel,\n    $core.bool? blocktop,\n    $core.bool? blockscroll,\n    $core.bool? blockbottom,\n    $core.bool? blockcolor,\n    $core.bool? blockspecial,\n    $core.bool? preventshade,\n    $core.bool? dmask,\n    $core.double? opacity,\n    $core.int? dmarea,\n    $core.double? speedplus,\n    $core.double? fontsize,\n    $core.bool? screensync,\n    $core.bool? speedsync,\n    $core.String? fontfamily,\n    $core.bool? bold,\n    $core.int? fontborder,\n    $core.String? drawType,\n    $core.int? seniorModeSwitch,\n    $core.int? aiLevelV2,\n    $core.Iterable<$core.MapEntry<$core.int, $core.int>>? aiLevelV2Map,\n    $core.bool? blocktopBottom,\n    $core.int? dmAreaV2,\n    $core.int? dmDensity,\n  }) {\n    final result = create();\n    if (dmSwitch != null) result.dmSwitch = dmSwitch;\n    if (aiSwitch != null) result.aiSwitch = aiSwitch;\n    if (aiLevel != null) result.aiLevel = aiLevel;\n    if (blocktop != null) result.blocktop = blocktop;\n    if (blockscroll != null) result.blockscroll = blockscroll;\n    if (blockbottom != null) result.blockbottom = blockbottom;\n    if (blockcolor != null) result.blockcolor = blockcolor;\n    if (blockspecial != null) result.blockspecial = blockspecial;\n    if (preventshade != null) result.preventshade = preventshade;\n    if (dmask != null) result.dmask = dmask;\n    if (opacity != null) result.opacity = opacity;\n    if (dmarea != null) result.dmarea = dmarea;\n    if (speedplus != null) result.speedplus = speedplus;\n    if (fontsize != null) result.fontsize = fontsize;\n    if (screensync != null) result.screensync = screensync;\n    if (speedsync != null) result.speedsync = speedsync;\n    if (fontfamily != null) result.fontfamily = fontfamily;\n    if (bold != null) result.bold = bold;\n    if (fontborder != null) result.fontborder = fontborder;\n    if (drawType != null) result.drawType = drawType;\n    if (seniorModeSwitch != null) result.seniorModeSwitch = seniorModeSwitch;\n    if (aiLevelV2 != null) result.aiLevelV2 = aiLevelV2;\n    if (aiLevelV2Map != null) result.aiLevelV2Map.addEntries(aiLevelV2Map);\n    if (blocktopBottom != null) result.blocktopBottom = blocktopBottom;\n    if (dmAreaV2 != null) result.dmAreaV2 = dmAreaV2;\n    if (dmDensity != null) result.dmDensity = dmDensity;\n    return result;\n  }\n\n  DanmuWebPlayerConfig._();\n\n  factory DanmuWebPlayerConfig.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DanmuWebPlayerConfig.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DanmuWebPlayerConfig',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'dmSwitch')\n    ..aOB(2, _omitFieldNames ? '' : 'aiSwitch')\n    ..aI(3, _omitFieldNames ? '' : 'aiLevel')\n    ..aOB(4, _omitFieldNames ? '' : 'blocktop')\n    ..aOB(5, _omitFieldNames ? '' : 'blockscroll')\n    ..aOB(6, _omitFieldNames ? '' : 'blockbottom')\n    ..aOB(7, _omitFieldNames ? '' : 'blockcolor')\n    ..aOB(8, _omitFieldNames ? '' : 'blockspecial')\n    ..aOB(9, _omitFieldNames ? '' : 'preventshade')\n    ..aOB(10, _omitFieldNames ? '' : 'dmask')\n    ..aD(11, _omitFieldNames ? '' : 'opacity', fieldType: $pb.PbFieldType.OF)\n    ..aI(12, _omitFieldNames ? '' : 'dmarea')\n    ..aD(13, _omitFieldNames ? '' : 'speedplus', fieldType: $pb.PbFieldType.OF)\n    ..aD(14, _omitFieldNames ? '' : 'fontsize', fieldType: $pb.PbFieldType.OF)\n    ..aOB(15, _omitFieldNames ? '' : 'screensync')\n    ..aOB(16, _omitFieldNames ? '' : 'speedsync')\n    ..aOS(17, _omitFieldNames ? '' : 'fontfamily')\n    ..aOB(18, _omitFieldNames ? '' : 'bold')\n    ..aI(19, _omitFieldNames ? '' : 'fontborder')\n    ..aOS(20, _omitFieldNames ? '' : 'drawType')\n    ..aI(21, _omitFieldNames ? '' : 'seniorModeSwitch')\n    ..aI(22, _omitFieldNames ? '' : 'aiLevelV2')\n    ..m<$core.int, $core.int>(23, _omitFieldNames ? '' : 'aiLevelV2Map',\n        entryClassName: 'DanmuWebPlayerConfig.AiLevelV2MapEntry',\n        keyFieldType: $pb.PbFieldType.O3,\n        valueFieldType: $pb.PbFieldType.O3,\n        packageName: const $pb.PackageName('bilibili.community.service.dm.v1'))\n    ..aOB(24, _omitFieldNames ? '' : 'blocktopBottom')\n    ..aI(25, _omitFieldNames ? '' : 'dmAreaV2')\n    ..aI(26, _omitFieldNames ? '' : 'dmDensity')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DanmuWebPlayerConfig clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DanmuWebPlayerConfig copyWith(void Function(DanmuWebPlayerConfig) updates) =>\n      super.copyWith((message) => updates(message as DanmuWebPlayerConfig))\n          as DanmuWebPlayerConfig;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DanmuWebPlayerConfig create() => DanmuWebPlayerConfig._();\n  @$core.override\n  DanmuWebPlayerConfig createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DanmuWebPlayerConfig getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DanmuWebPlayerConfig>(create);\n  static DanmuWebPlayerConfig? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get dmSwitch => $_getBF(0);\n  @$pb.TagNumber(1)\n  set dmSwitch($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDmSwitch() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDmSwitch() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get aiSwitch => $_getBF(1);\n  @$pb.TagNumber(2)\n  set aiSwitch($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAiSwitch() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAiSwitch() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get aiLevel => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set aiLevel($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAiLevel() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAiLevel() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get blocktop => $_getBF(3);\n  @$pb.TagNumber(4)\n  set blocktop($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBlocktop() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBlocktop() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.bool get blockscroll => $_getBF(4);\n  @$pb.TagNumber(5)\n  set blockscroll($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBlockscroll() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBlockscroll() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.bool get blockbottom => $_getBF(5);\n  @$pb.TagNumber(6)\n  set blockbottom($core.bool value) => $_setBool(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasBlockbottom() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearBlockbottom() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.bool get blockcolor => $_getBF(6);\n  @$pb.TagNumber(7)\n  set blockcolor($core.bool value) => $_setBool(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBlockcolor() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBlockcolor() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.bool get blockspecial => $_getBF(7);\n  @$pb.TagNumber(8)\n  set blockspecial($core.bool value) => $_setBool(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasBlockspecial() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearBlockspecial() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.bool get preventshade => $_getBF(8);\n  @$pb.TagNumber(9)\n  set preventshade($core.bool value) => $_setBool(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasPreventshade() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearPreventshade() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.bool get dmask => $_getBF(9);\n  @$pb.TagNumber(10)\n  set dmask($core.bool value) => $_setBool(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasDmask() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearDmask() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.double get opacity => $_getN(10);\n  @$pb.TagNumber(11)\n  set opacity($core.double value) => $_setFloat(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasOpacity() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearOpacity() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.int get dmarea => $_getIZ(11);\n  @$pb.TagNumber(12)\n  set dmarea($core.int value) => $_setSignedInt32(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasDmarea() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearDmarea() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.double get speedplus => $_getN(12);\n  @$pb.TagNumber(13)\n  set speedplus($core.double value) => $_setFloat(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasSpeedplus() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearSpeedplus() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.double get fontsize => $_getN(13);\n  @$pb.TagNumber(14)\n  set fontsize($core.double value) => $_setFloat(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasFontsize() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearFontsize() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $core.bool get screensync => $_getBF(14);\n  @$pb.TagNumber(15)\n  set screensync($core.bool value) => $_setBool(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasScreensync() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearScreensync() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $core.bool get speedsync => $_getBF(15);\n  @$pb.TagNumber(16)\n  set speedsync($core.bool value) => $_setBool(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasSpeedsync() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearSpeedsync() => $_clearField(16);\n\n  @$pb.TagNumber(17)\n  $core.String get fontfamily => $_getSZ(16);\n  @$pb.TagNumber(17)\n  set fontfamily($core.String value) => $_setString(16, value);\n  @$pb.TagNumber(17)\n  $core.bool hasFontfamily() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearFontfamily() => $_clearField(17);\n\n  @$pb.TagNumber(18)\n  $core.bool get bold => $_getBF(17);\n  @$pb.TagNumber(18)\n  set bold($core.bool value) => $_setBool(17, value);\n  @$pb.TagNumber(18)\n  $core.bool hasBold() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearBold() => $_clearField(18);\n\n  @$pb.TagNumber(19)\n  $core.int get fontborder => $_getIZ(18);\n  @$pb.TagNumber(19)\n  set fontborder($core.int value) => $_setSignedInt32(18, value);\n  @$pb.TagNumber(19)\n  $core.bool hasFontborder() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearFontborder() => $_clearField(19);\n\n  @$pb.TagNumber(20)\n  $core.String get drawType => $_getSZ(19);\n  @$pb.TagNumber(20)\n  set drawType($core.String value) => $_setString(19, value);\n  @$pb.TagNumber(20)\n  $core.bool hasDrawType() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearDrawType() => $_clearField(20);\n\n  @$pb.TagNumber(21)\n  $core.int get seniorModeSwitch => $_getIZ(20);\n  @$pb.TagNumber(21)\n  set seniorModeSwitch($core.int value) => $_setSignedInt32(20, value);\n  @$pb.TagNumber(21)\n  $core.bool hasSeniorModeSwitch() => $_has(20);\n  @$pb.TagNumber(21)\n  void clearSeniorModeSwitch() => $_clearField(21);\n\n  @$pb.TagNumber(22)\n  $core.int get aiLevelV2 => $_getIZ(21);\n  @$pb.TagNumber(22)\n  set aiLevelV2($core.int value) => $_setSignedInt32(21, value);\n  @$pb.TagNumber(22)\n  $core.bool hasAiLevelV2() => $_has(21);\n  @$pb.TagNumber(22)\n  void clearAiLevelV2() => $_clearField(22);\n\n  @$pb.TagNumber(23)\n  $pb.PbMap<$core.int, $core.int> get aiLevelV2Map => $_getMap(22);\n\n  @$pb.TagNumber(24)\n  $core.bool get blocktopBottom => $_getBF(23);\n  @$pb.TagNumber(24)\n  set blocktopBottom($core.bool value) => $_setBool(23, value);\n  @$pb.TagNumber(24)\n  $core.bool hasBlocktopBottom() => $_has(23);\n  @$pb.TagNumber(24)\n  void clearBlocktopBottom() => $_clearField(24);\n\n  @$pb.TagNumber(25)\n  $core.int get dmAreaV2 => $_getIZ(24);\n  @$pb.TagNumber(25)\n  set dmAreaV2($core.int value) => $_setSignedInt32(24, value);\n  @$pb.TagNumber(25)\n  $core.bool hasDmAreaV2() => $_has(24);\n  @$pb.TagNumber(25)\n  void clearDmAreaV2() => $_clearField(25);\n\n  @$pb.TagNumber(26)\n  $core.int get dmDensity => $_getIZ(25);\n  @$pb.TagNumber(26)\n  set dmDensity($core.int value) => $_setSignedInt32(25, value);\n  @$pb.TagNumber(26)\n  $core.bool hasDmDensity() => $_has(25);\n  @$pb.TagNumber(26)\n  void clearDmDensity() => $_clearField(26);\n}\n\nclass DmColorful extends $pb.GeneratedMessage {\n  factory DmColorful({\n    DmColorfulType? type,\n    $core.String? src,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (src != null) result.src = src;\n    return result;\n  }\n\n  DmColorful._();\n\n  factory DmColorful.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DmColorful.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DmColorful',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aE<DmColorfulType>(1, _omitFieldNames ? '' : 'type',\n        enumValues: DmColorfulType.values)\n    ..aOS(2, _omitFieldNames ? '' : 'src')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmColorful clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmColorful copyWith(void Function(DmColorful) updates) =>\n      super.copyWith((message) => updates(message as DmColorful)) as DmColorful;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DmColorful create() => DmColorful._();\n  @$core.override\n  DmColorful createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DmColorful getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DmColorful>(create);\n  static DmColorful? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  DmColorfulType get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(DmColorfulType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get src => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set src($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSrc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSrc() => $_clearField(2);\n}\n\nclass DmExpoReportReq extends $pb.GeneratedMessage {\n  factory DmExpoReportReq({\n    $core.String? sessionId,\n    $fixnum.Int64? oid,\n    $core.List<$core.int>? dmids,\n    $core.String? spmid,\n  }) {\n    final result = create();\n    if (sessionId != null) result.sessionId = sessionId;\n    if (oid != null) result.oid = oid;\n    if (dmids != null) result.dmids = dmids;\n    if (spmid != null) result.spmid = spmid;\n    return result;\n  }\n\n  DmExpoReportReq._();\n\n  factory DmExpoReportReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DmExpoReportReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DmExpoReportReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'sessionId')\n    ..aInt64(2, _omitFieldNames ? '' : 'oid')\n    ..a<$core.List<$core.int>>(\n        3, _omitFieldNames ? '' : 'dmids', $pb.PbFieldType.OY)\n    ..aOS(4, _omitFieldNames ? '' : 'spmid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmExpoReportReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmExpoReportReq copyWith(void Function(DmExpoReportReq) updates) =>\n      super.copyWith((message) => updates(message as DmExpoReportReq))\n          as DmExpoReportReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DmExpoReportReq create() => DmExpoReportReq._();\n  @$core.override\n  DmExpoReportReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DmExpoReportReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DmExpoReportReq>(create);\n  static DmExpoReportReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get sessionId => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set sessionId($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSessionId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSessionId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get oid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set oid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.List<$core.int> get dmids => $_getN(2);\n  @$pb.TagNumber(3)\n  set dmids($core.List<$core.int> value) => $_setBytes(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDmids() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDmids() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get spmid => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set spmid($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSpmid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSpmid() => $_clearField(4);\n}\n\nclass DmExpoReportRes extends $pb.GeneratedMessage {\n  factory DmExpoReportRes() => create();\n\n  DmExpoReportRes._();\n\n  factory DmExpoReportRes.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DmExpoReportRes.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DmExpoReportRes',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmExpoReportRes clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmExpoReportRes copyWith(void Function(DmExpoReportRes) updates) =>\n      super.copyWith((message) => updates(message as DmExpoReportRes))\n          as DmExpoReportRes;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DmExpoReportRes create() => DmExpoReportRes._();\n  @$core.override\n  DmExpoReportRes createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DmExpoReportRes getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DmExpoReportRes>(create);\n  static DmExpoReportRes? _defaultInstance;\n}\n\nclass DmHerdView extends $pb.GeneratedMessage {\n  factory DmHerdView({\n    $core.int? displayHerdDmNum,\n    $core.Iterable<ViewHerdDmElem>? herdDms,\n  }) {\n    final result = create();\n    if (displayHerdDmNum != null) result.displayHerdDmNum = displayHerdDmNum;\n    if (herdDms != null) result.herdDms.addAll(herdDms);\n    return result;\n  }\n\n  DmHerdView._();\n\n  factory DmHerdView.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DmHerdView.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DmHerdView',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'displayHerdDmNum')\n    ..pPM<ViewHerdDmElem>(2, _omitFieldNames ? '' : 'herdDms',\n        subBuilder: ViewHerdDmElem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmHerdView clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmHerdView copyWith(void Function(DmHerdView) updates) =>\n      super.copyWith((message) => updates(message as DmHerdView)) as DmHerdView;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DmHerdView create() => DmHerdView._();\n  @$core.override\n  DmHerdView createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DmHerdView getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DmHerdView>(create);\n  static DmHerdView? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get displayHerdDmNum => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set displayHerdDmNum($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDisplayHerdDmNum() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDisplayHerdDmNum() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<ViewHerdDmElem> get herdDms => $_getList(1);\n}\n\nclass DmMaskWall extends $pb.GeneratedMessage {\n  factory DmMaskWall({\n    $fixnum.Int64? start,\n    $fixnum.Int64? end,\n    $core.String? content,\n    DmMaskWallContentType? contentType,\n    DmMaskWallBizType? bizType,\n    $core.Iterable<DmMaskWallContent>? contents,\n  }) {\n    final result = create();\n    if (start != null) result.start = start;\n    if (end != null) result.end = end;\n    if (content != null) result.content = content;\n    if (contentType != null) result.contentType = contentType;\n    if (bizType != null) result.bizType = bizType;\n    if (contents != null) result.contents.addAll(contents);\n    return result;\n  }\n\n  DmMaskWall._();\n\n  factory DmMaskWall.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DmMaskWall.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DmMaskWall',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'start')\n    ..aInt64(2, _omitFieldNames ? '' : 'end')\n    ..aOS(3, _omitFieldNames ? '' : 'content')\n    ..aE<DmMaskWallContentType>(4, _omitFieldNames ? '' : 'contentType',\n        enumValues: DmMaskWallContentType.values)\n    ..aE<DmMaskWallBizType>(5, _omitFieldNames ? '' : 'bizType',\n        enumValues: DmMaskWallBizType.values)\n    ..pPM<DmMaskWallContent>(6, _omitFieldNames ? '' : 'contents',\n        subBuilder: DmMaskWallContent.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmMaskWall clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmMaskWall copyWith(void Function(DmMaskWall) updates) =>\n      super.copyWith((message) => updates(message as DmMaskWall)) as DmMaskWall;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DmMaskWall create() => DmMaskWall._();\n  @$core.override\n  DmMaskWall createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DmMaskWall getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DmMaskWall>(create);\n  static DmMaskWall? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get start => $_getI64(0);\n  @$pb.TagNumber(1)\n  set start($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStart() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStart() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get end => $_getI64(1);\n  @$pb.TagNumber(2)\n  set end($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasEnd() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearEnd() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get content => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set content($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasContent() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearContent() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  DmMaskWallContentType get contentType => $_getN(3);\n  @$pb.TagNumber(4)\n  set contentType(DmMaskWallContentType value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasContentType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearContentType() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  DmMaskWallBizType get bizType => $_getN(4);\n  @$pb.TagNumber(5)\n  set bizType(DmMaskWallBizType value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBizType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBizType() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $pb.PbList<DmMaskWallContent> get contents => $_getList(5);\n}\n\nclass DmMaskWallContent extends $pb.GeneratedMessage {\n  factory DmMaskWallContent({\n    DmMaskWallContentType? type,\n    $core.String? content,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (content != null) result.content = content;\n    return result;\n  }\n\n  DmMaskWallContent._();\n\n  factory DmMaskWallContent.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DmMaskWallContent.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DmMaskWallContent',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aE<DmMaskWallContentType>(1, _omitFieldNames ? '' : 'type',\n        enumValues: DmMaskWallContentType.values)\n    ..aOS(2, _omitFieldNames ? '' : 'content')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmMaskWallContent clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmMaskWallContent copyWith(void Function(DmMaskWallContent) updates) =>\n      super.copyWith((message) => updates(message as DmMaskWallContent))\n          as DmMaskWallContent;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DmMaskWallContent create() => DmMaskWallContent._();\n  @$core.override\n  DmMaskWallContent createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DmMaskWallContent getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DmMaskWallContent>(create);\n  static DmMaskWallContent? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  DmMaskWallContentType get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(DmMaskWallContentType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get content => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set content($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasContent() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearContent() => $_clearField(2);\n}\n\nclass DmPlayerConfigReq extends $pb.GeneratedMessage {\n  factory DmPlayerConfigReq({\n    $fixnum.Int64? ts,\n    PlayerDanmakuSwitch? switch_2,\n    PlayerDanmakuSwitchSave? switchSave,\n    PlayerDanmakuUseDefaultConfig? useDefaultConfig,\n    PlayerDanmakuAiRecommendedSwitch? aiRecommendedSwitch,\n    PlayerDanmakuAiRecommendedLevel? aiRecommendedLevel,\n    PlayerDanmakuBlocktop? blocktop,\n    PlayerDanmakuBlockscroll? blockscroll,\n    PlayerDanmakuBlockbottom? blockbottom,\n    PlayerDanmakuBlockcolorful? blockcolorful,\n    PlayerDanmakuBlockrepeat? blockrepeat,\n    PlayerDanmakuBlockspecial? blockspecial,\n    PlayerDanmakuOpacity? opacity,\n    PlayerDanmakuScalingfactor? scalingfactor,\n    PlayerDanmakuDomain? domain,\n    PlayerDanmakuSpeed? speed,\n    PlayerDanmakuEnableblocklist? enableblocklist,\n    InlinePlayerDanmakuSwitch? inlinePlayerDanmakuSwitch,\n    PlayerDanmakuSeniorModeSwitch? seniorModeSwitch,\n    PlayerDanmakuAiRecommendedLevelV2? aiRecommendedLevelV2,\n    PlayerDanmakuEnableHerdDm? enableHerdDm,\n    PlayerDanmakuBlocktopBottom? blocktopBottom,\n    PlayerDanmakuDomainV2? domainV2,\n    PlayerDanmakuDensity? density,\n    PlayerDanmakuSubtitleProof? subtitleProof,\n    PlayerDanmakuPeopleProof? peopleProof,\n  }) {\n    final result = create();\n    if (ts != null) result.ts = ts;\n    if (switch_2 != null) result.switch_2 = switch_2;\n    if (switchSave != null) result.switchSave = switchSave;\n    if (useDefaultConfig != null) result.useDefaultConfig = useDefaultConfig;\n    if (aiRecommendedSwitch != null)\n      result.aiRecommendedSwitch = aiRecommendedSwitch;\n    if (aiRecommendedLevel != null)\n      result.aiRecommendedLevel = aiRecommendedLevel;\n    if (blocktop != null) result.blocktop = blocktop;\n    if (blockscroll != null) result.blockscroll = blockscroll;\n    if (blockbottom != null) result.blockbottom = blockbottom;\n    if (blockcolorful != null) result.blockcolorful = blockcolorful;\n    if (blockrepeat != null) result.blockrepeat = blockrepeat;\n    if (blockspecial != null) result.blockspecial = blockspecial;\n    if (opacity != null) result.opacity = opacity;\n    if (scalingfactor != null) result.scalingfactor = scalingfactor;\n    if (domain != null) result.domain = domain;\n    if (speed != null) result.speed = speed;\n    if (enableblocklist != null) result.enableblocklist = enableblocklist;\n    if (inlinePlayerDanmakuSwitch != null)\n      result.inlinePlayerDanmakuSwitch = inlinePlayerDanmakuSwitch;\n    if (seniorModeSwitch != null) result.seniorModeSwitch = seniorModeSwitch;\n    if (aiRecommendedLevelV2 != null)\n      result.aiRecommendedLevelV2 = aiRecommendedLevelV2;\n    if (enableHerdDm != null) result.enableHerdDm = enableHerdDm;\n    if (blocktopBottom != null) result.blocktopBottom = blocktopBottom;\n    if (domainV2 != null) result.domainV2 = domainV2;\n    if (density != null) result.density = density;\n    if (subtitleProof != null) result.subtitleProof = subtitleProof;\n    if (peopleProof != null) result.peopleProof = peopleProof;\n    return result;\n  }\n\n  DmPlayerConfigReq._();\n\n  factory DmPlayerConfigReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DmPlayerConfigReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DmPlayerConfigReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'ts')\n    ..aOM<PlayerDanmakuSwitch>(2, _omitFieldNames ? '' : 'switch',\n        subBuilder: PlayerDanmakuSwitch.create)\n    ..aOM<PlayerDanmakuSwitchSave>(3, _omitFieldNames ? '' : 'switchSave',\n        subBuilder: PlayerDanmakuSwitchSave.create)\n    ..aOM<PlayerDanmakuUseDefaultConfig>(\n        4, _omitFieldNames ? '' : 'useDefaultConfig',\n        subBuilder: PlayerDanmakuUseDefaultConfig.create)\n    ..aOM<PlayerDanmakuAiRecommendedSwitch>(\n        5, _omitFieldNames ? '' : 'aiRecommendedSwitch',\n        subBuilder: PlayerDanmakuAiRecommendedSwitch.create)\n    ..aOM<PlayerDanmakuAiRecommendedLevel>(\n        6, _omitFieldNames ? '' : 'aiRecommendedLevel',\n        subBuilder: PlayerDanmakuAiRecommendedLevel.create)\n    ..aOM<PlayerDanmakuBlocktop>(7, _omitFieldNames ? '' : 'blocktop',\n        subBuilder: PlayerDanmakuBlocktop.create)\n    ..aOM<PlayerDanmakuBlockscroll>(8, _omitFieldNames ? '' : 'blockscroll',\n        subBuilder: PlayerDanmakuBlockscroll.create)\n    ..aOM<PlayerDanmakuBlockbottom>(9, _omitFieldNames ? '' : 'blockbottom',\n        subBuilder: PlayerDanmakuBlockbottom.create)\n    ..aOM<PlayerDanmakuBlockcolorful>(\n        10, _omitFieldNames ? '' : 'blockcolorful',\n        subBuilder: PlayerDanmakuBlockcolorful.create)\n    ..aOM<PlayerDanmakuBlockrepeat>(11, _omitFieldNames ? '' : 'blockrepeat',\n        subBuilder: PlayerDanmakuBlockrepeat.create)\n    ..aOM<PlayerDanmakuBlockspecial>(12, _omitFieldNames ? '' : 'blockspecial',\n        subBuilder: PlayerDanmakuBlockspecial.create)\n    ..aOM<PlayerDanmakuOpacity>(13, _omitFieldNames ? '' : 'opacity',\n        subBuilder: PlayerDanmakuOpacity.create)\n    ..aOM<PlayerDanmakuScalingfactor>(\n        14, _omitFieldNames ? '' : 'scalingfactor',\n        subBuilder: PlayerDanmakuScalingfactor.create)\n    ..aOM<PlayerDanmakuDomain>(15, _omitFieldNames ? '' : 'domain',\n        subBuilder: PlayerDanmakuDomain.create)\n    ..aOM<PlayerDanmakuSpeed>(16, _omitFieldNames ? '' : 'speed',\n        subBuilder: PlayerDanmakuSpeed.create)\n    ..aOM<PlayerDanmakuEnableblocklist>(\n        17, _omitFieldNames ? '' : 'enableblocklist',\n        subBuilder: PlayerDanmakuEnableblocklist.create)\n    ..aOM<InlinePlayerDanmakuSwitch>(\n        18, _omitFieldNames ? '' : 'inlinePlayerDanmakuSwitch',\n        subBuilder: InlinePlayerDanmakuSwitch.create)\n    ..aOM<PlayerDanmakuSeniorModeSwitch>(\n        19, _omitFieldNames ? '' : 'seniorModeSwitch',\n        subBuilder: PlayerDanmakuSeniorModeSwitch.create)\n    ..aOM<PlayerDanmakuAiRecommendedLevelV2>(\n        20, _omitFieldNames ? '' : 'aiRecommendedLevelV2',\n        subBuilder: PlayerDanmakuAiRecommendedLevelV2.create)\n    ..aOM<PlayerDanmakuEnableHerdDm>(21, _omitFieldNames ? '' : 'enableHerdDm',\n        subBuilder: PlayerDanmakuEnableHerdDm.create)\n    ..aOM<PlayerDanmakuBlocktopBottom>(\n        22, _omitFieldNames ? '' : 'blocktopBottom',\n        subBuilder: PlayerDanmakuBlocktopBottom.create)\n    ..aOM<PlayerDanmakuDomainV2>(23, _omitFieldNames ? '' : 'domainV2',\n        subBuilder: PlayerDanmakuDomainV2.create)\n    ..aOM<PlayerDanmakuDensity>(24, _omitFieldNames ? '' : 'density',\n        subBuilder: PlayerDanmakuDensity.create)\n    ..aOM<PlayerDanmakuSubtitleProof>(\n        25, _omitFieldNames ? '' : 'subtitleProof',\n        subBuilder: PlayerDanmakuSubtitleProof.create)\n    ..aOM<PlayerDanmakuPeopleProof>(26, _omitFieldNames ? '' : 'peopleProof',\n        subBuilder: PlayerDanmakuPeopleProof.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmPlayerConfigReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmPlayerConfigReq copyWith(void Function(DmPlayerConfigReq) updates) =>\n      super.copyWith((message) => updates(message as DmPlayerConfigReq))\n          as DmPlayerConfigReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DmPlayerConfigReq create() => DmPlayerConfigReq._();\n  @$core.override\n  DmPlayerConfigReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DmPlayerConfigReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DmPlayerConfigReq>(create);\n  static DmPlayerConfigReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get ts => $_getI64(0);\n  @$pb.TagNumber(1)\n  set ts($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTs() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTs() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  PlayerDanmakuSwitch get switch_2 => $_getN(1);\n  @$pb.TagNumber(2)\n  set switch_2(PlayerDanmakuSwitch value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSwitch_2() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSwitch_2() => $_clearField(2);\n  @$pb.TagNumber(2)\n  PlayerDanmakuSwitch ensureSwitch_2() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  PlayerDanmakuSwitchSave get switchSave => $_getN(2);\n  @$pb.TagNumber(3)\n  set switchSave(PlayerDanmakuSwitchSave value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSwitchSave() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSwitchSave() => $_clearField(3);\n  @$pb.TagNumber(3)\n  PlayerDanmakuSwitchSave ensureSwitchSave() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  PlayerDanmakuUseDefaultConfig get useDefaultConfig => $_getN(3);\n  @$pb.TagNumber(4)\n  set useDefaultConfig(PlayerDanmakuUseDefaultConfig value) =>\n      $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUseDefaultConfig() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUseDefaultConfig() => $_clearField(4);\n  @$pb.TagNumber(4)\n  PlayerDanmakuUseDefaultConfig ensureUseDefaultConfig() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  PlayerDanmakuAiRecommendedSwitch get aiRecommendedSwitch => $_getN(4);\n  @$pb.TagNumber(5)\n  set aiRecommendedSwitch(PlayerDanmakuAiRecommendedSwitch value) =>\n      $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasAiRecommendedSwitch() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearAiRecommendedSwitch() => $_clearField(5);\n  @$pb.TagNumber(5)\n  PlayerDanmakuAiRecommendedSwitch ensureAiRecommendedSwitch() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  PlayerDanmakuAiRecommendedLevel get aiRecommendedLevel => $_getN(5);\n  @$pb.TagNumber(6)\n  set aiRecommendedLevel(PlayerDanmakuAiRecommendedLevel value) =>\n      $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasAiRecommendedLevel() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearAiRecommendedLevel() => $_clearField(6);\n  @$pb.TagNumber(6)\n  PlayerDanmakuAiRecommendedLevel ensureAiRecommendedLevel() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  PlayerDanmakuBlocktop get blocktop => $_getN(6);\n  @$pb.TagNumber(7)\n  set blocktop(PlayerDanmakuBlocktop value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBlocktop() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBlocktop() => $_clearField(7);\n  @$pb.TagNumber(7)\n  PlayerDanmakuBlocktop ensureBlocktop() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  PlayerDanmakuBlockscroll get blockscroll => $_getN(7);\n  @$pb.TagNumber(8)\n  set blockscroll(PlayerDanmakuBlockscroll value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasBlockscroll() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearBlockscroll() => $_clearField(8);\n  @$pb.TagNumber(8)\n  PlayerDanmakuBlockscroll ensureBlockscroll() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  PlayerDanmakuBlockbottom get blockbottom => $_getN(8);\n  @$pb.TagNumber(9)\n  set blockbottom(PlayerDanmakuBlockbottom value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasBlockbottom() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearBlockbottom() => $_clearField(9);\n  @$pb.TagNumber(9)\n  PlayerDanmakuBlockbottom ensureBlockbottom() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  PlayerDanmakuBlockcolorful get blockcolorful => $_getN(9);\n  @$pb.TagNumber(10)\n  set blockcolorful(PlayerDanmakuBlockcolorful value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasBlockcolorful() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearBlockcolorful() => $_clearField(10);\n  @$pb.TagNumber(10)\n  PlayerDanmakuBlockcolorful ensureBlockcolorful() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  PlayerDanmakuBlockrepeat get blockrepeat => $_getN(10);\n  @$pb.TagNumber(11)\n  set blockrepeat(PlayerDanmakuBlockrepeat value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasBlockrepeat() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearBlockrepeat() => $_clearField(11);\n  @$pb.TagNumber(11)\n  PlayerDanmakuBlockrepeat ensureBlockrepeat() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  PlayerDanmakuBlockspecial get blockspecial => $_getN(11);\n  @$pb.TagNumber(12)\n  set blockspecial(PlayerDanmakuBlockspecial value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasBlockspecial() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearBlockspecial() => $_clearField(12);\n  @$pb.TagNumber(12)\n  PlayerDanmakuBlockspecial ensureBlockspecial() => $_ensure(11);\n\n  @$pb.TagNumber(13)\n  PlayerDanmakuOpacity get opacity => $_getN(12);\n  @$pb.TagNumber(13)\n  set opacity(PlayerDanmakuOpacity value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasOpacity() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearOpacity() => $_clearField(13);\n  @$pb.TagNumber(13)\n  PlayerDanmakuOpacity ensureOpacity() => $_ensure(12);\n\n  @$pb.TagNumber(14)\n  PlayerDanmakuScalingfactor get scalingfactor => $_getN(13);\n  @$pb.TagNumber(14)\n  set scalingfactor(PlayerDanmakuScalingfactor value) => $_setField(14, value);\n  @$pb.TagNumber(14)\n  $core.bool hasScalingfactor() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearScalingfactor() => $_clearField(14);\n  @$pb.TagNumber(14)\n  PlayerDanmakuScalingfactor ensureScalingfactor() => $_ensure(13);\n\n  @$pb.TagNumber(15)\n  PlayerDanmakuDomain get domain => $_getN(14);\n  @$pb.TagNumber(15)\n  set domain(PlayerDanmakuDomain value) => $_setField(15, value);\n  @$pb.TagNumber(15)\n  $core.bool hasDomain() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearDomain() => $_clearField(15);\n  @$pb.TagNumber(15)\n  PlayerDanmakuDomain ensureDomain() => $_ensure(14);\n\n  @$pb.TagNumber(16)\n  PlayerDanmakuSpeed get speed => $_getN(15);\n  @$pb.TagNumber(16)\n  set speed(PlayerDanmakuSpeed value) => $_setField(16, value);\n  @$pb.TagNumber(16)\n  $core.bool hasSpeed() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearSpeed() => $_clearField(16);\n  @$pb.TagNumber(16)\n  PlayerDanmakuSpeed ensureSpeed() => $_ensure(15);\n\n  @$pb.TagNumber(17)\n  PlayerDanmakuEnableblocklist get enableblocklist => $_getN(16);\n  @$pb.TagNumber(17)\n  set enableblocklist(PlayerDanmakuEnableblocklist value) =>\n      $_setField(17, value);\n  @$pb.TagNumber(17)\n  $core.bool hasEnableblocklist() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearEnableblocklist() => $_clearField(17);\n  @$pb.TagNumber(17)\n  PlayerDanmakuEnableblocklist ensureEnableblocklist() => $_ensure(16);\n\n  @$pb.TagNumber(18)\n  InlinePlayerDanmakuSwitch get inlinePlayerDanmakuSwitch => $_getN(17);\n  @$pb.TagNumber(18)\n  set inlinePlayerDanmakuSwitch(InlinePlayerDanmakuSwitch value) =>\n      $_setField(18, value);\n  @$pb.TagNumber(18)\n  $core.bool hasInlinePlayerDanmakuSwitch() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearInlinePlayerDanmakuSwitch() => $_clearField(18);\n  @$pb.TagNumber(18)\n  InlinePlayerDanmakuSwitch ensureInlinePlayerDanmakuSwitch() => $_ensure(17);\n\n  @$pb.TagNumber(19)\n  PlayerDanmakuSeniorModeSwitch get seniorModeSwitch => $_getN(18);\n  @$pb.TagNumber(19)\n  set seniorModeSwitch(PlayerDanmakuSeniorModeSwitch value) =>\n      $_setField(19, value);\n  @$pb.TagNumber(19)\n  $core.bool hasSeniorModeSwitch() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearSeniorModeSwitch() => $_clearField(19);\n  @$pb.TagNumber(19)\n  PlayerDanmakuSeniorModeSwitch ensureSeniorModeSwitch() => $_ensure(18);\n\n  @$pb.TagNumber(20)\n  PlayerDanmakuAiRecommendedLevelV2 get aiRecommendedLevelV2 => $_getN(19);\n  @$pb.TagNumber(20)\n  set aiRecommendedLevelV2(PlayerDanmakuAiRecommendedLevelV2 value) =>\n      $_setField(20, value);\n  @$pb.TagNumber(20)\n  $core.bool hasAiRecommendedLevelV2() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearAiRecommendedLevelV2() => $_clearField(20);\n  @$pb.TagNumber(20)\n  PlayerDanmakuAiRecommendedLevelV2 ensureAiRecommendedLevelV2() =>\n      $_ensure(19);\n\n  @$pb.TagNumber(21)\n  PlayerDanmakuEnableHerdDm get enableHerdDm => $_getN(20);\n  @$pb.TagNumber(21)\n  set enableHerdDm(PlayerDanmakuEnableHerdDm value) => $_setField(21, value);\n  @$pb.TagNumber(21)\n  $core.bool hasEnableHerdDm() => $_has(20);\n  @$pb.TagNumber(21)\n  void clearEnableHerdDm() => $_clearField(21);\n  @$pb.TagNumber(21)\n  PlayerDanmakuEnableHerdDm ensureEnableHerdDm() => $_ensure(20);\n\n  @$pb.TagNumber(22)\n  PlayerDanmakuBlocktopBottom get blocktopBottom => $_getN(21);\n  @$pb.TagNumber(22)\n  set blocktopBottom(PlayerDanmakuBlocktopBottom value) =>\n      $_setField(22, value);\n  @$pb.TagNumber(22)\n  $core.bool hasBlocktopBottom() => $_has(21);\n  @$pb.TagNumber(22)\n  void clearBlocktopBottom() => $_clearField(22);\n  @$pb.TagNumber(22)\n  PlayerDanmakuBlocktopBottom ensureBlocktopBottom() => $_ensure(21);\n\n  @$pb.TagNumber(23)\n  PlayerDanmakuDomainV2 get domainV2 => $_getN(22);\n  @$pb.TagNumber(23)\n  set domainV2(PlayerDanmakuDomainV2 value) => $_setField(23, value);\n  @$pb.TagNumber(23)\n  $core.bool hasDomainV2() => $_has(22);\n  @$pb.TagNumber(23)\n  void clearDomainV2() => $_clearField(23);\n  @$pb.TagNumber(23)\n  PlayerDanmakuDomainV2 ensureDomainV2() => $_ensure(22);\n\n  @$pb.TagNumber(24)\n  PlayerDanmakuDensity get density => $_getN(23);\n  @$pb.TagNumber(24)\n  set density(PlayerDanmakuDensity value) => $_setField(24, value);\n  @$pb.TagNumber(24)\n  $core.bool hasDensity() => $_has(23);\n  @$pb.TagNumber(24)\n  void clearDensity() => $_clearField(24);\n  @$pb.TagNumber(24)\n  PlayerDanmakuDensity ensureDensity() => $_ensure(23);\n\n  @$pb.TagNumber(25)\n  PlayerDanmakuSubtitleProof get subtitleProof => $_getN(24);\n  @$pb.TagNumber(25)\n  set subtitleProof(PlayerDanmakuSubtitleProof value) => $_setField(25, value);\n  @$pb.TagNumber(25)\n  $core.bool hasSubtitleProof() => $_has(24);\n  @$pb.TagNumber(25)\n  void clearSubtitleProof() => $_clearField(25);\n  @$pb.TagNumber(25)\n  PlayerDanmakuSubtitleProof ensureSubtitleProof() => $_ensure(24);\n\n  @$pb.TagNumber(26)\n  PlayerDanmakuPeopleProof get peopleProof => $_getN(25);\n  @$pb.TagNumber(26)\n  set peopleProof(PlayerDanmakuPeopleProof value) => $_setField(26, value);\n  @$pb.TagNumber(26)\n  $core.bool hasPeopleProof() => $_has(25);\n  @$pb.TagNumber(26)\n  void clearPeopleProof() => $_clearField(26);\n  @$pb.TagNumber(26)\n  PlayerDanmakuPeopleProof ensurePeopleProof() => $_ensure(25);\n}\n\nclass DmSegCacheReq extends $pb.GeneratedMessage {\n  factory DmSegCacheReq({\n    $core.int? type,\n    $fixnum.Int64? oid,\n    $fixnum.Int64? pid,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (oid != null) result.oid = oid;\n    if (pid != null) result.pid = pid;\n    return result;\n  }\n\n  DmSegCacheReq._();\n\n  factory DmSegCacheReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DmSegCacheReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DmSegCacheReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'type')\n    ..aInt64(2, _omitFieldNames ? '' : 'oid')\n    ..aInt64(3, _omitFieldNames ? '' : 'pid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmSegCacheReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmSegCacheReq copyWith(void Function(DmSegCacheReq) updates) =>\n      super.copyWith((message) => updates(message as DmSegCacheReq))\n          as DmSegCacheReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DmSegCacheReq create() => DmSegCacheReq._();\n  @$core.override\n  DmSegCacheReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DmSegCacheReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DmSegCacheReq>(create);\n  static DmSegCacheReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get type => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set type($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get oid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set oid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get pid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set pid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPid() => $_clearField(3);\n}\n\nclass DmSegConfig extends $pb.GeneratedMessage {\n  factory DmSegConfig({\n    $fixnum.Int64? pageSize,\n    $fixnum.Int64? total,\n  }) {\n    final result = create();\n    if (pageSize != null) result.pageSize = pageSize;\n    if (total != null) result.total = total;\n    return result;\n  }\n\n  DmSegConfig._();\n\n  factory DmSegConfig.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DmSegConfig.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DmSegConfig',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'pageSize')\n    ..aInt64(2, _omitFieldNames ? '' : 'total')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmSegConfig clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmSegConfig copyWith(void Function(DmSegConfig) updates) =>\n      super.copyWith((message) => updates(message as DmSegConfig))\n          as DmSegConfig;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DmSegConfig create() => DmSegConfig._();\n  @$core.override\n  DmSegConfig createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DmSegConfig getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DmSegConfig>(create);\n  static DmSegConfig? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get pageSize => $_getI64(0);\n  @$pb.TagNumber(1)\n  set pageSize($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPageSize() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPageSize() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get total => $_getI64(1);\n  @$pb.TagNumber(2)\n  set total($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTotal() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTotal() => $_clearField(2);\n}\n\nclass DmSegMobileReply extends $pb.GeneratedMessage {\n  factory DmSegMobileReply({\n    $core.Iterable<DanmakuElem>? elems,\n    $core.int? state,\n    DanmakuAIFlag? aiFlag,\n    $core.Iterable<$fixnum.Int64>? segmentRules,\n    $core.Iterable<DmColorful>? colorfulSrc,\n    $core.String? contextSrc,\n  }) {\n    final result = create();\n    if (elems != null) result.elems.addAll(elems);\n    if (state != null) result.state = state;\n    if (aiFlag != null) result.aiFlag = aiFlag;\n    if (segmentRules != null) result.segmentRules.addAll(segmentRules);\n    if (colorfulSrc != null) result.colorfulSrc.addAll(colorfulSrc);\n    if (contextSrc != null) result.contextSrc = contextSrc;\n    return result;\n  }\n\n  DmSegMobileReply._();\n\n  factory DmSegMobileReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DmSegMobileReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DmSegMobileReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..pPM<DanmakuElem>(1, _omitFieldNames ? '' : 'elems',\n        subBuilder: DanmakuElem.create)\n    ..aI(2, _omitFieldNames ? '' : 'state')\n    ..aOM<DanmakuAIFlag>(3, _omitFieldNames ? '' : 'aiFlag',\n        subBuilder: DanmakuAIFlag.create)\n    ..p<$fixnum.Int64>(\n        4, _omitFieldNames ? '' : 'segmentRules', $pb.PbFieldType.K6)\n    ..pPM<DmColorful>(5, _omitFieldNames ? '' : 'colorfulSrc',\n        subBuilder: DmColorful.create)\n    ..aOS(6, _omitFieldNames ? '' : 'contextSrc')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmSegMobileReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmSegMobileReply copyWith(void Function(DmSegMobileReply) updates) =>\n      super.copyWith((message) => updates(message as DmSegMobileReply))\n          as DmSegMobileReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DmSegMobileReply create() => DmSegMobileReply._();\n  @$core.override\n  DmSegMobileReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DmSegMobileReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DmSegMobileReply>(create);\n  static DmSegMobileReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<DanmakuElem> get elems => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.int get state => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set state($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasState() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearState() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  DanmakuAIFlag get aiFlag => $_getN(2);\n  @$pb.TagNumber(3)\n  set aiFlag(DanmakuAIFlag value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAiFlag() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAiFlag() => $_clearField(3);\n  @$pb.TagNumber(3)\n  DanmakuAIFlag ensureAiFlag() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<$fixnum.Int64> get segmentRules => $_getList(3);\n\n  @$pb.TagNumber(5)\n  $pb.PbList<DmColorful> get colorfulSrc => $_getList(4);\n\n  @$pb.TagNumber(6)\n  $core.String get contextSrc => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set contextSrc($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasContextSrc() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearContextSrc() => $_clearField(6);\n}\n\nclass DmSegMobileReq extends $pb.GeneratedMessage {\n  factory DmSegMobileReq({\n    $fixnum.Int64? pid,\n    $fixnum.Int64? oid,\n    $core.int? type,\n    $fixnum.Int64? segmentIndex,\n    $core.int? teenagersMode,\n    $fixnum.Int64? ps,\n    $fixnum.Int64? pe,\n    $core.int? pullMode,\n    $core.int? fromScene,\n    $core.String? spmid,\n    $core.String? contextExt,\n  }) {\n    final result = create();\n    if (pid != null) result.pid = pid;\n    if (oid != null) result.oid = oid;\n    if (type != null) result.type = type;\n    if (segmentIndex != null) result.segmentIndex = segmentIndex;\n    if (teenagersMode != null) result.teenagersMode = teenagersMode;\n    if (ps != null) result.ps = ps;\n    if (pe != null) result.pe = pe;\n    if (pullMode != null) result.pullMode = pullMode;\n    if (fromScene != null) result.fromScene = fromScene;\n    if (spmid != null) result.spmid = spmid;\n    if (contextExt != null) result.contextExt = contextExt;\n    return result;\n  }\n\n  DmSegMobileReq._();\n\n  factory DmSegMobileReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DmSegMobileReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DmSegMobileReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'pid')\n    ..aInt64(2, _omitFieldNames ? '' : 'oid')\n    ..aI(3, _omitFieldNames ? '' : 'type')\n    ..aInt64(4, _omitFieldNames ? '' : 'segmentIndex')\n    ..aI(5, _omitFieldNames ? '' : 'teenagersMode')\n    ..aInt64(6, _omitFieldNames ? '' : 'ps')\n    ..aInt64(7, _omitFieldNames ? '' : 'pe')\n    ..aI(8, _omitFieldNames ? '' : 'pullMode')\n    ..aI(9, _omitFieldNames ? '' : 'fromScene')\n    ..aOS(10, _omitFieldNames ? '' : 'spmid')\n    ..aOS(11, _omitFieldNames ? '' : 'contextExt')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmSegMobileReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmSegMobileReq copyWith(void Function(DmSegMobileReq) updates) =>\n      super.copyWith((message) => updates(message as DmSegMobileReq))\n          as DmSegMobileReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DmSegMobileReq create() => DmSegMobileReq._();\n  @$core.override\n  DmSegMobileReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DmSegMobileReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DmSegMobileReq>(create);\n  static DmSegMobileReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get pid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set pid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get oid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set oid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get type => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set type($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get segmentIndex => $_getI64(3);\n  @$pb.TagNumber(4)\n  set segmentIndex($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSegmentIndex() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSegmentIndex() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get teenagersMode => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set teenagersMode($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasTeenagersMode() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearTeenagersMode() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get ps => $_getI64(5);\n  @$pb.TagNumber(6)\n  set ps($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasPs() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearPs() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get pe => $_getI64(6);\n  @$pb.TagNumber(7)\n  set pe($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasPe() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearPe() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get pullMode => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set pullMode($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasPullMode() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearPullMode() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.int get fromScene => $_getIZ(8);\n  @$pb.TagNumber(9)\n  set fromScene($core.int value) => $_setSignedInt32(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasFromScene() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearFromScene() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get spmid => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set spmid($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasSpmid() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearSpmid() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get contextExt => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set contextExt($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasContextExt() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearContextExt() => $_clearField(11);\n}\n\nclass DmSegOttReply extends $pb.GeneratedMessage {\n  factory DmSegOttReply({\n    $core.Iterable<DanmakuElem>? elems,\n    $core.int? state,\n  }) {\n    final result = create();\n    if (elems != null) result.elems.addAll(elems);\n    if (state != null) result.state = state;\n    return result;\n  }\n\n  DmSegOttReply._();\n\n  factory DmSegOttReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DmSegOttReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DmSegOttReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..pPM<DanmakuElem>(1, _omitFieldNames ? '' : 'elems',\n        subBuilder: DanmakuElem.create)\n    ..aI(2, _omitFieldNames ? '' : 'state')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmSegOttReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmSegOttReply copyWith(void Function(DmSegOttReply) updates) =>\n      super.copyWith((message) => updates(message as DmSegOttReply))\n          as DmSegOttReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DmSegOttReply create() => DmSegOttReply._();\n  @$core.override\n  DmSegOttReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DmSegOttReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DmSegOttReply>(create);\n  static DmSegOttReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<DanmakuElem> get elems => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.int get state => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set state($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasState() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearState() => $_clearField(2);\n}\n\nclass DmSegOttReq extends $pb.GeneratedMessage {\n  factory DmSegOttReq({\n    $fixnum.Int64? pid,\n    $fixnum.Int64? oid,\n    $core.int? type,\n    $fixnum.Int64? segmentIndex,\n  }) {\n    final result = create();\n    if (pid != null) result.pid = pid;\n    if (oid != null) result.oid = oid;\n    if (type != null) result.type = type;\n    if (segmentIndex != null) result.segmentIndex = segmentIndex;\n    return result;\n  }\n\n  DmSegOttReq._();\n\n  factory DmSegOttReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DmSegOttReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DmSegOttReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'pid')\n    ..aInt64(2, _omitFieldNames ? '' : 'oid')\n    ..aI(3, _omitFieldNames ? '' : 'type')\n    ..aInt64(4, _omitFieldNames ? '' : 'segmentIndex')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmSegOttReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmSegOttReq copyWith(void Function(DmSegOttReq) updates) =>\n      super.copyWith((message) => updates(message as DmSegOttReq))\n          as DmSegOttReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DmSegOttReq create() => DmSegOttReq._();\n  @$core.override\n  DmSegOttReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DmSegOttReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DmSegOttReq>(create);\n  static DmSegOttReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get pid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set pid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get oid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set oid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get type => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set type($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get segmentIndex => $_getI64(3);\n  @$pb.TagNumber(4)\n  set segmentIndex($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSegmentIndex() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSegmentIndex() => $_clearField(4);\n}\n\nclass DmSegSDKReply extends $pb.GeneratedMessage {\n  factory DmSegSDKReply({\n    $core.bool? closed,\n    $core.Iterable<DanmakuElem>? elems,\n  }) {\n    final result = create();\n    if (closed != null) result.closed = closed;\n    if (elems != null) result.elems.addAll(elems);\n    return result;\n  }\n\n  DmSegSDKReply._();\n\n  factory DmSegSDKReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DmSegSDKReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DmSegSDKReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'closed')\n    ..pPM<DanmakuElem>(2, _omitFieldNames ? '' : 'elems',\n        subBuilder: DanmakuElem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmSegSDKReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmSegSDKReply copyWith(void Function(DmSegSDKReply) updates) =>\n      super.copyWith((message) => updates(message as DmSegSDKReply))\n          as DmSegSDKReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DmSegSDKReply create() => DmSegSDKReply._();\n  @$core.override\n  DmSegSDKReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DmSegSDKReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DmSegSDKReply>(create);\n  static DmSegSDKReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get closed => $_getBF(0);\n  @$pb.TagNumber(1)\n  set closed($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasClosed() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearClosed() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<DanmakuElem> get elems => $_getList(1);\n}\n\nclass DmSegSDKReq extends $pb.GeneratedMessage {\n  factory DmSegSDKReq({\n    $fixnum.Int64? pid,\n    $fixnum.Int64? oid,\n    $core.int? type,\n    $fixnum.Int64? segmentIndex,\n  }) {\n    final result = create();\n    if (pid != null) result.pid = pid;\n    if (oid != null) result.oid = oid;\n    if (type != null) result.type = type;\n    if (segmentIndex != null) result.segmentIndex = segmentIndex;\n    return result;\n  }\n\n  DmSegSDKReq._();\n\n  factory DmSegSDKReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DmSegSDKReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DmSegSDKReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'pid')\n    ..aInt64(2, _omitFieldNames ? '' : 'oid')\n    ..aI(3, _omitFieldNames ? '' : 'type')\n    ..aInt64(4, _omitFieldNames ? '' : 'segmentIndex')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmSegSDKReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmSegSDKReq copyWith(void Function(DmSegSDKReq) updates) =>\n      super.copyWith((message) => updates(message as DmSegSDKReq))\n          as DmSegSDKReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DmSegSDKReq create() => DmSegSDKReq._();\n  @$core.override\n  DmSegSDKReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DmSegSDKReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DmSegSDKReq>(create);\n  static DmSegSDKReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get pid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set pid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get oid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set oid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get type => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set type($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get segmentIndex => $_getI64(3);\n  @$pb.TagNumber(4)\n  set segmentIndex($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSegmentIndex() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSegmentIndex() => $_clearField(4);\n}\n\nclass DmSubView extends $pb.GeneratedMessage {\n  factory DmSubView({\n    $core.int? type,\n    $fixnum.Int64? oid,\n    $fixnum.Int64? pid,\n    $core.Iterable<PostPanelV2>? postPanel2,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (oid != null) result.oid = oid;\n    if (pid != null) result.pid = pid;\n    if (postPanel2 != null) result.postPanel2.addAll(postPanel2);\n    return result;\n  }\n\n  DmSubView._();\n\n  factory DmSubView.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DmSubView.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DmSubView',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'type')\n    ..aInt64(2, _omitFieldNames ? '' : 'oid')\n    ..aInt64(3, _omitFieldNames ? '' : 'pid')\n    ..pPM<PostPanelV2>(4, _omitFieldNames ? '' : 'postPanel2',\n        subBuilder: PostPanelV2.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmSubView clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmSubView copyWith(void Function(DmSubView) updates) =>\n      super.copyWith((message) => updates(message as DmSubView)) as DmSubView;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DmSubView create() => DmSubView._();\n  @$core.override\n  DmSubView createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DmSubView getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DmSubView>(create);\n  static DmSubView? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get type => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set type($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get oid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set oid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get pid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set pid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPid() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<PostPanelV2> get postPanel2 => $_getList(3);\n}\n\nclass DmViewReply extends $pb.GeneratedMessage {\n  factory DmViewReply({\n    $core.bool? closed,\n    VideoMask? mask,\n    VideoSubtitle? subtitle,\n    $core.Iterable<$core.String>? specialDms,\n    DanmakuFlagConfig? aiFlag,\n    DanmuPlayerViewConfig? playerConfig,\n    $core.int? sendBoxStyle,\n    $core.bool? allow,\n    $core.bool? checkBox,\n    $core.String? checkBoxShowMsg,\n    $core.String? textPlaceholder,\n    $core.String? inputPlaceholder,\n    $core.Iterable<$core.String>? reportFilterContent,\n    ExpoReport? expoReport,\n    BuzzwordConfig? buzzwordConfig,\n    $core.Iterable<Expressions>? expressions,\n    $core.Iterable<PostPanel>? postPanel,\n    $core.Iterable<$core.String>? activityMeta,\n    $core.Iterable<PostPanelV2>? postPanel2,\n    $core.Iterable<DmMaskWall>? dmMaskWall,\n    DmHerdView? dmHerd,\n    Command? command,\n    $core.String? kv,\n    $core.Iterable<DmSubView>? subViews,\n    QoeInfo? qoe,\n  }) {\n    final result = create();\n    if (closed != null) result.closed = closed;\n    if (mask != null) result.mask = mask;\n    if (subtitle != null) result.subtitle = subtitle;\n    if (specialDms != null) result.specialDms.addAll(specialDms);\n    if (aiFlag != null) result.aiFlag = aiFlag;\n    if (playerConfig != null) result.playerConfig = playerConfig;\n    if (sendBoxStyle != null) result.sendBoxStyle = sendBoxStyle;\n    if (allow != null) result.allow = allow;\n    if (checkBox != null) result.checkBox = checkBox;\n    if (checkBoxShowMsg != null) result.checkBoxShowMsg = checkBoxShowMsg;\n    if (textPlaceholder != null) result.textPlaceholder = textPlaceholder;\n    if (inputPlaceholder != null) result.inputPlaceholder = inputPlaceholder;\n    if (reportFilterContent != null)\n      result.reportFilterContent.addAll(reportFilterContent);\n    if (expoReport != null) result.expoReport = expoReport;\n    if (buzzwordConfig != null) result.buzzwordConfig = buzzwordConfig;\n    if (expressions != null) result.expressions.addAll(expressions);\n    if (postPanel != null) result.postPanel.addAll(postPanel);\n    if (activityMeta != null) result.activityMeta.addAll(activityMeta);\n    if (postPanel2 != null) result.postPanel2.addAll(postPanel2);\n    if (dmMaskWall != null) result.dmMaskWall.addAll(dmMaskWall);\n    if (dmHerd != null) result.dmHerd = dmHerd;\n    if (command != null) result.command = command;\n    if (kv != null) result.kv = kv;\n    if (subViews != null) result.subViews.addAll(subViews);\n    if (qoe != null) result.qoe = qoe;\n    return result;\n  }\n\n  DmViewReply._();\n\n  factory DmViewReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DmViewReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DmViewReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'closed')\n    ..aOM<VideoMask>(2, _omitFieldNames ? '' : 'mask',\n        subBuilder: VideoMask.create)\n    ..aOM<VideoSubtitle>(3, _omitFieldNames ? '' : 'subtitle',\n        subBuilder: VideoSubtitle.create)\n    ..pPS(4, _omitFieldNames ? '' : 'specialDms')\n    ..aOM<DanmakuFlagConfig>(5, _omitFieldNames ? '' : 'aiFlag',\n        subBuilder: DanmakuFlagConfig.create)\n    ..aOM<DanmuPlayerViewConfig>(6, _omitFieldNames ? '' : 'playerConfig',\n        subBuilder: DanmuPlayerViewConfig.create)\n    ..aI(7, _omitFieldNames ? '' : 'sendBoxStyle')\n    ..aOB(8, _omitFieldNames ? '' : 'allow')\n    ..aOB(9, _omitFieldNames ? '' : 'checkBox')\n    ..aOS(10, _omitFieldNames ? '' : 'checkBoxShowMsg')\n    ..aOS(11, _omitFieldNames ? '' : 'textPlaceholder')\n    ..aOS(12, _omitFieldNames ? '' : 'inputPlaceholder')\n    ..pPS(13, _omitFieldNames ? '' : 'reportFilterContent')\n    ..aOM<ExpoReport>(14, _omitFieldNames ? '' : 'expoReport',\n        subBuilder: ExpoReport.create)\n    ..aOM<BuzzwordConfig>(15, _omitFieldNames ? '' : 'buzzwordConfig',\n        subBuilder: BuzzwordConfig.create)\n    ..pPM<Expressions>(16, _omitFieldNames ? '' : 'expressions',\n        subBuilder: Expressions.create)\n    ..pPM<PostPanel>(17, _omitFieldNames ? '' : 'postPanel',\n        subBuilder: PostPanel.create)\n    ..pPS(18, _omitFieldNames ? '' : 'activityMeta')\n    ..pPM<PostPanelV2>(19, _omitFieldNames ? '' : 'postPanel2',\n        subBuilder: PostPanelV2.create)\n    ..pPM<DmMaskWall>(20, _omitFieldNames ? '' : 'dmMaskWall',\n        subBuilder: DmMaskWall.create)\n    ..aOM<DmHerdView>(21, _omitFieldNames ? '' : 'dmHerd',\n        subBuilder: DmHerdView.create)\n    ..aOM<Command>(22, _omitFieldNames ? '' : 'command',\n        subBuilder: Command.create)\n    ..aOS(23, _omitFieldNames ? '' : 'kv')\n    ..pPM<DmSubView>(24, _omitFieldNames ? '' : 'subViews',\n        subBuilder: DmSubView.create)\n    ..aOM<QoeInfo>(25, _omitFieldNames ? '' : 'qoe', subBuilder: QoeInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmViewReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmViewReply copyWith(void Function(DmViewReply) updates) =>\n      super.copyWith((message) => updates(message as DmViewReply))\n          as DmViewReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DmViewReply create() => DmViewReply._();\n  @$core.override\n  DmViewReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DmViewReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DmViewReply>(create);\n  static DmViewReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get closed => $_getBF(0);\n  @$pb.TagNumber(1)\n  set closed($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasClosed() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearClosed() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  VideoMask get mask => $_getN(1);\n  @$pb.TagNumber(2)\n  set mask(VideoMask value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMask() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMask() => $_clearField(2);\n  @$pb.TagNumber(2)\n  VideoMask ensureMask() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  VideoSubtitle get subtitle => $_getN(2);\n  @$pb.TagNumber(3)\n  set subtitle(VideoSubtitle value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSubtitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSubtitle() => $_clearField(3);\n  @$pb.TagNumber(3)\n  VideoSubtitle ensureSubtitle() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<$core.String> get specialDms => $_getList(3);\n\n  @$pb.TagNumber(5)\n  DanmakuFlagConfig get aiFlag => $_getN(4);\n  @$pb.TagNumber(5)\n  set aiFlag(DanmakuFlagConfig value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasAiFlag() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearAiFlag() => $_clearField(5);\n  @$pb.TagNumber(5)\n  DanmakuFlagConfig ensureAiFlag() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  DanmuPlayerViewConfig get playerConfig => $_getN(5);\n  @$pb.TagNumber(6)\n  set playerConfig(DanmuPlayerViewConfig value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasPlayerConfig() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearPlayerConfig() => $_clearField(6);\n  @$pb.TagNumber(6)\n  DanmuPlayerViewConfig ensurePlayerConfig() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $core.int get sendBoxStyle => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set sendBoxStyle($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasSendBoxStyle() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearSendBoxStyle() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.bool get allow => $_getBF(7);\n  @$pb.TagNumber(8)\n  set allow($core.bool value) => $_setBool(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasAllow() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearAllow() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.bool get checkBox => $_getBF(8);\n  @$pb.TagNumber(9)\n  set checkBox($core.bool value) => $_setBool(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasCheckBox() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearCheckBox() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get checkBoxShowMsg => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set checkBoxShowMsg($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasCheckBoxShowMsg() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearCheckBoxShowMsg() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get textPlaceholder => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set textPlaceholder($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasTextPlaceholder() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearTextPlaceholder() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get inputPlaceholder => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set inputPlaceholder($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasInputPlaceholder() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearInputPlaceholder() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $pb.PbList<$core.String> get reportFilterContent => $_getList(12);\n\n  @$pb.TagNumber(14)\n  ExpoReport get expoReport => $_getN(13);\n  @$pb.TagNumber(14)\n  set expoReport(ExpoReport value) => $_setField(14, value);\n  @$pb.TagNumber(14)\n  $core.bool hasExpoReport() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearExpoReport() => $_clearField(14);\n  @$pb.TagNumber(14)\n  ExpoReport ensureExpoReport() => $_ensure(13);\n\n  @$pb.TagNumber(15)\n  BuzzwordConfig get buzzwordConfig => $_getN(14);\n  @$pb.TagNumber(15)\n  set buzzwordConfig(BuzzwordConfig value) => $_setField(15, value);\n  @$pb.TagNumber(15)\n  $core.bool hasBuzzwordConfig() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearBuzzwordConfig() => $_clearField(15);\n  @$pb.TagNumber(15)\n  BuzzwordConfig ensureBuzzwordConfig() => $_ensure(14);\n\n  @$pb.TagNumber(16)\n  $pb.PbList<Expressions> get expressions => $_getList(15);\n\n  @$pb.TagNumber(17)\n  $pb.PbList<PostPanel> get postPanel => $_getList(16);\n\n  @$pb.TagNumber(18)\n  $pb.PbList<$core.String> get activityMeta => $_getList(17);\n\n  @$pb.TagNumber(19)\n  $pb.PbList<PostPanelV2> get postPanel2 => $_getList(18);\n\n  @$pb.TagNumber(20)\n  $pb.PbList<DmMaskWall> get dmMaskWall => $_getList(19);\n\n  @$pb.TagNumber(21)\n  DmHerdView get dmHerd => $_getN(20);\n  @$pb.TagNumber(21)\n  set dmHerd(DmHerdView value) => $_setField(21, value);\n  @$pb.TagNumber(21)\n  $core.bool hasDmHerd() => $_has(20);\n  @$pb.TagNumber(21)\n  void clearDmHerd() => $_clearField(21);\n  @$pb.TagNumber(21)\n  DmHerdView ensureDmHerd() => $_ensure(20);\n\n  @$pb.TagNumber(22)\n  Command get command => $_getN(21);\n  @$pb.TagNumber(22)\n  set command(Command value) => $_setField(22, value);\n  @$pb.TagNumber(22)\n  $core.bool hasCommand() => $_has(21);\n  @$pb.TagNumber(22)\n  void clearCommand() => $_clearField(22);\n  @$pb.TagNumber(22)\n  Command ensureCommand() => $_ensure(21);\n\n  @$pb.TagNumber(23)\n  $core.String get kv => $_getSZ(22);\n  @$pb.TagNumber(23)\n  set kv($core.String value) => $_setString(22, value);\n  @$pb.TagNumber(23)\n  $core.bool hasKv() => $_has(22);\n  @$pb.TagNumber(23)\n  void clearKv() => $_clearField(23);\n\n  @$pb.TagNumber(24)\n  $pb.PbList<DmSubView> get subViews => $_getList(23);\n\n  @$pb.TagNumber(25)\n  QoeInfo get qoe => $_getN(24);\n  @$pb.TagNumber(25)\n  set qoe(QoeInfo value) => $_setField(25, value);\n  @$pb.TagNumber(25)\n  $core.bool hasQoe() => $_has(24);\n  @$pb.TagNumber(25)\n  void clearQoe() => $_clearField(25);\n  @$pb.TagNumber(25)\n  QoeInfo ensureQoe() => $_ensure(24);\n}\n\nclass DmViewReq extends $pb.GeneratedMessage {\n  factory DmViewReq({\n    $fixnum.Int64? pid,\n    $fixnum.Int64? oid,\n    $core.int? type,\n    $core.String? spmid,\n    $core.int? isHardBoot,\n    $core.String? contextExt,\n  }) {\n    final result = create();\n    if (pid != null) result.pid = pid;\n    if (oid != null) result.oid = oid;\n    if (type != null) result.type = type;\n    if (spmid != null) result.spmid = spmid;\n    if (isHardBoot != null) result.isHardBoot = isHardBoot;\n    if (contextExt != null) result.contextExt = contextExt;\n    return result;\n  }\n\n  DmViewReq._();\n\n  factory DmViewReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DmViewReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DmViewReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'pid')\n    ..aInt64(2, _omitFieldNames ? '' : 'oid')\n    ..aI(3, _omitFieldNames ? '' : 'type')\n    ..aOS(4, _omitFieldNames ? '' : 'spmid')\n    ..aI(5, _omitFieldNames ? '' : 'isHardBoot')\n    ..aOS(6, _omitFieldNames ? '' : 'contextExt')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmViewReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmViewReq copyWith(void Function(DmViewReq) updates) =>\n      super.copyWith((message) => updates(message as DmViewReq)) as DmViewReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DmViewReq create() => DmViewReq._();\n  @$core.override\n  DmViewReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DmViewReq getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DmViewReq>(create);\n  static DmViewReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get pid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set pid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get oid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set oid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get type => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set type($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get spmid => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set spmid($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSpmid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSpmid() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get isHardBoot => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set isHardBoot($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasIsHardBoot() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearIsHardBoot() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get contextExt => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set contextExt($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasContextExt() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearContextExt() => $_clearField(6);\n}\n\nclass DmWebViewReply extends $pb.GeneratedMessage {\n  factory DmWebViewReply({\n    $core.int? state,\n    $core.String? text,\n    $core.String? textSide,\n    DmSegConfig? dmSge,\n    DanmakuFlagConfig? flag,\n    $core.Iterable<$core.String>? specialDms,\n    $core.bool? checkBox,\n    $fixnum.Int64? count,\n    $core.Iterable<CommandDm>? commandDms,\n    DanmuWebPlayerConfig? playerConfig,\n    $core.Iterable<$core.String>? reportFilterContent,\n    $core.Iterable<Expressions>? expressions,\n    $core.Iterable<PostPanel>? postPanel,\n    $core.Iterable<$core.String>? activityMeta,\n    $core.Iterable<PostPanelV2>? postPanel2,\n    $core.Iterable<DmSubView>? subViews,\n    QoeInfo? qoe,\n  }) {\n    final result = create();\n    if (state != null) result.state = state;\n    if (text != null) result.text = text;\n    if (textSide != null) result.textSide = textSide;\n    if (dmSge != null) result.dmSge = dmSge;\n    if (flag != null) result.flag = flag;\n    if (specialDms != null) result.specialDms.addAll(specialDms);\n    if (checkBox != null) result.checkBox = checkBox;\n    if (count != null) result.count = count;\n    if (commandDms != null) result.commandDms.addAll(commandDms);\n    if (playerConfig != null) result.playerConfig = playerConfig;\n    if (reportFilterContent != null)\n      result.reportFilterContent.addAll(reportFilterContent);\n    if (expressions != null) result.expressions.addAll(expressions);\n    if (postPanel != null) result.postPanel.addAll(postPanel);\n    if (activityMeta != null) result.activityMeta.addAll(activityMeta);\n    if (postPanel2 != null) result.postPanel2.addAll(postPanel2);\n    if (subViews != null) result.subViews.addAll(subViews);\n    if (qoe != null) result.qoe = qoe;\n    return result;\n  }\n\n  DmWebViewReply._();\n\n  factory DmWebViewReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DmWebViewReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DmWebViewReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'state')\n    ..aOS(2, _omitFieldNames ? '' : 'text')\n    ..aOS(3, _omitFieldNames ? '' : 'textSide')\n    ..aOM<DmSegConfig>(4, _omitFieldNames ? '' : 'dmSge',\n        subBuilder: DmSegConfig.create)\n    ..aOM<DanmakuFlagConfig>(5, _omitFieldNames ? '' : 'flag',\n        subBuilder: DanmakuFlagConfig.create)\n    ..pPS(6, _omitFieldNames ? '' : 'specialDms')\n    ..aOB(7, _omitFieldNames ? '' : 'checkBox')\n    ..aInt64(8, _omitFieldNames ? '' : 'count')\n    ..pPM<CommandDm>(9, _omitFieldNames ? '' : 'commandDms',\n        subBuilder: CommandDm.create)\n    ..aOM<DanmuWebPlayerConfig>(10, _omitFieldNames ? '' : 'playerConfig',\n        subBuilder: DanmuWebPlayerConfig.create)\n    ..pPS(11, _omitFieldNames ? '' : 'reportFilterContent')\n    ..pPM<Expressions>(12, _omitFieldNames ? '' : 'expressions',\n        subBuilder: Expressions.create)\n    ..pPM<PostPanel>(13, _omitFieldNames ? '' : 'postPanel',\n        subBuilder: PostPanel.create)\n    ..pPS(14, _omitFieldNames ? '' : 'activityMeta')\n    ..pPM<PostPanelV2>(15, _omitFieldNames ? '' : 'postPanel2',\n        subBuilder: PostPanelV2.create)\n    ..pPM<DmSubView>(16, _omitFieldNames ? '' : 'subViews',\n        subBuilder: DmSubView.create)\n    ..aOM<QoeInfo>(17, _omitFieldNames ? '' : 'qoe', subBuilder: QoeInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmWebViewReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DmWebViewReply copyWith(void Function(DmWebViewReply) updates) =>\n      super.copyWith((message) => updates(message as DmWebViewReply))\n          as DmWebViewReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DmWebViewReply create() => DmWebViewReply._();\n  @$core.override\n  DmWebViewReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DmWebViewReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DmWebViewReply>(create);\n  static DmWebViewReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get state => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set state($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasState() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearState() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get textSide => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set textSide($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTextSide() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTextSide() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  DmSegConfig get dmSge => $_getN(3);\n  @$pb.TagNumber(4)\n  set dmSge(DmSegConfig value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDmSge() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDmSge() => $_clearField(4);\n  @$pb.TagNumber(4)\n  DmSegConfig ensureDmSge() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  DanmakuFlagConfig get flag => $_getN(4);\n  @$pb.TagNumber(5)\n  set flag(DanmakuFlagConfig value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasFlag() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearFlag() => $_clearField(5);\n  @$pb.TagNumber(5)\n  DanmakuFlagConfig ensureFlag() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $pb.PbList<$core.String> get specialDms => $_getList(5);\n\n  @$pb.TagNumber(7)\n  $core.bool get checkBox => $_getBF(6);\n  @$pb.TagNumber(7)\n  set checkBox($core.bool value) => $_setBool(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCheckBox() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCheckBox() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get count => $_getI64(7);\n  @$pb.TagNumber(8)\n  set count($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasCount() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearCount() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $pb.PbList<CommandDm> get commandDms => $_getList(8);\n\n  @$pb.TagNumber(10)\n  DanmuWebPlayerConfig get playerConfig => $_getN(9);\n  @$pb.TagNumber(10)\n  set playerConfig(DanmuWebPlayerConfig value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasPlayerConfig() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearPlayerConfig() => $_clearField(10);\n  @$pb.TagNumber(10)\n  DanmuWebPlayerConfig ensurePlayerConfig() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  $pb.PbList<$core.String> get reportFilterContent => $_getList(10);\n\n  @$pb.TagNumber(12)\n  $pb.PbList<Expressions> get expressions => $_getList(11);\n\n  @$pb.TagNumber(13)\n  $pb.PbList<PostPanel> get postPanel => $_getList(12);\n\n  @$pb.TagNumber(14)\n  $pb.PbList<$core.String> get activityMeta => $_getList(13);\n\n  @$pb.TagNumber(15)\n  $pb.PbList<PostPanelV2> get postPanel2 => $_getList(14);\n\n  @$pb.TagNumber(16)\n  $pb.PbList<DmSubView> get subViews => $_getList(15);\n\n  @$pb.TagNumber(17)\n  QoeInfo get qoe => $_getN(16);\n  @$pb.TagNumber(17)\n  set qoe(QoeInfo value) => $_setField(17, value);\n  @$pb.TagNumber(17)\n  $core.bool hasQoe() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearQoe() => $_clearField(17);\n  @$pb.TagNumber(17)\n  QoeInfo ensureQoe() => $_ensure(16);\n}\n\nclass ExpoReport extends $pb.GeneratedMessage {\n  factory ExpoReport({\n    $core.bool? shouldReportAtEnd,\n    $core.double? playerSample,\n    $core.Iterable<ReportDuration>? durations,\n    $core.int? maxSize,\n  }) {\n    final result = create();\n    if (shouldReportAtEnd != null) result.shouldReportAtEnd = shouldReportAtEnd;\n    if (playerSample != null) result.playerSample = playerSample;\n    if (durations != null) result.durations.addAll(durations);\n    if (maxSize != null) result.maxSize = maxSize;\n    return result;\n  }\n\n  ExpoReport._();\n\n  factory ExpoReport.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ExpoReport.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ExpoReport',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'shouldReportAtEnd')\n    ..aD(2, _omitFieldNames ? '' : 'playerSample')\n    ..pPM<ReportDuration>(3, _omitFieldNames ? '' : 'durations',\n        subBuilder: ReportDuration.create)\n    ..aI(4, _omitFieldNames ? '' : 'maxSize')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExpoReport clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExpoReport copyWith(void Function(ExpoReport) updates) =>\n      super.copyWith((message) => updates(message as ExpoReport)) as ExpoReport;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ExpoReport create() => ExpoReport._();\n  @$core.override\n  ExpoReport createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ExpoReport getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ExpoReport>(create);\n  static ExpoReport? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get shouldReportAtEnd => $_getBF(0);\n  @$pb.TagNumber(1)\n  set shouldReportAtEnd($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasShouldReportAtEnd() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearShouldReportAtEnd() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.double get playerSample => $_getN(1);\n  @$pb.TagNumber(2)\n  set playerSample($core.double value) => $_setDouble(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPlayerSample() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPlayerSample() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<ReportDuration> get durations => $_getList(2);\n\n  @$pb.TagNumber(4)\n  $core.int get maxSize => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set maxSize($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasMaxSize() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearMaxSize() => $_clearField(4);\n}\n\nclass Expression extends $pb.GeneratedMessage {\n  factory Expression({\n    $core.Iterable<$core.String>? keyword,\n    $core.String? url,\n    $core.Iterable<Period>? period,\n  }) {\n    final result = create();\n    if (keyword != null) result.keyword.addAll(keyword);\n    if (url != null) result.url = url;\n    if (period != null) result.period.addAll(period);\n    return result;\n  }\n\n  Expression._();\n\n  factory Expression.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Expression.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Expression',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..pPS(1, _omitFieldNames ? '' : 'keyword')\n    ..aOS(2, _omitFieldNames ? '' : 'url')\n    ..pPM<Period>(3, _omitFieldNames ? '' : 'period', subBuilder: Period.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Expression clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Expression copyWith(void Function(Expression) updates) =>\n      super.copyWith((message) => updates(message as Expression)) as Expression;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Expression create() => Expression._();\n  @$core.override\n  Expression createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Expression getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<Expression>(create);\n  static Expression? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<$core.String> get keyword => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.String get url => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set url($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUrl() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<Period> get period => $_getList(2);\n}\n\nclass Expressions extends $pb.GeneratedMessage {\n  factory Expressions({\n    $core.Iterable<Expression>? data,\n  }) {\n    final result = create();\n    if (data != null) result.data.addAll(data);\n    return result;\n  }\n\n  Expressions._();\n\n  factory Expressions.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Expressions.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Expressions',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..pPM<Expression>(1, _omitFieldNames ? '' : 'data',\n        subBuilder: Expression.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Expressions clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Expressions copyWith(void Function(Expressions) updates) =>\n      super.copyWith((message) => updates(message as Expressions))\n          as Expressions;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Expressions create() => Expressions._();\n  @$core.override\n  Expressions createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Expressions getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<Expressions>(create);\n  static Expressions? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<Expression> get data => $_getList(0);\n}\n\nclass InlinePlayerDanmakuSwitch extends $pb.GeneratedMessage {\n  factory InlinePlayerDanmakuSwitch({\n    $core.bool? value,\n  }) {\n    final result = create();\n    if (value != null) result.value = value;\n    return result;\n  }\n\n  InlinePlayerDanmakuSwitch._();\n\n  factory InlinePlayerDanmakuSwitch.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory InlinePlayerDanmakuSwitch.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'InlinePlayerDanmakuSwitch',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'value')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  InlinePlayerDanmakuSwitch clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  InlinePlayerDanmakuSwitch copyWith(\n          void Function(InlinePlayerDanmakuSwitch) updates) =>\n      super.copyWith((message) => updates(message as InlinePlayerDanmakuSwitch))\n          as InlinePlayerDanmakuSwitch;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static InlinePlayerDanmakuSwitch create() => InlinePlayerDanmakuSwitch._();\n  @$core.override\n  InlinePlayerDanmakuSwitch createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static InlinePlayerDanmakuSwitch getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<InlinePlayerDanmakuSwitch>(create);\n  static InlinePlayerDanmakuSwitch? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get value => $_getBF(0);\n  @$pb.TagNumber(1)\n  set value($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasValue() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearValue() => $_clearField(1);\n}\n\nclass Label extends $pb.GeneratedMessage {\n  factory Label({\n    $core.String? title,\n    $core.Iterable<$core.String>? content,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (content != null) result.content.addAll(content);\n    return result;\n  }\n\n  Label._();\n\n  factory Label.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Label.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Label',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..pPS(2, _omitFieldNames ? '' : 'content')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Label clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Label copyWith(void Function(Label) updates) =>\n      super.copyWith((message) => updates(message as Label)) as Label;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Label create() => Label._();\n  @$core.override\n  Label createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Label getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Label>(create);\n  static Label? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<$core.String> get content => $_getList(1);\n}\n\nclass LabelV2 extends $pb.GeneratedMessage {\n  factory LabelV2({\n    $core.String? title,\n    $core.Iterable<$core.String>? content,\n    $core.bool? exposureOnce,\n    ExposureType? exposureType,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (content != null) result.content.addAll(content);\n    if (exposureOnce != null) result.exposureOnce = exposureOnce;\n    if (exposureType != null) result.exposureType = exposureType;\n    return result;\n  }\n\n  LabelV2._();\n\n  factory LabelV2.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LabelV2.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LabelV2',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..pPS(2, _omitFieldNames ? '' : 'content')\n    ..aOB(3, _omitFieldNames ? '' : 'exposureOnce')\n    ..aE<ExposureType>(4, _omitFieldNames ? '' : 'exposureType',\n        enumValues: ExposureType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LabelV2 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LabelV2 copyWith(void Function(LabelV2) updates) =>\n      super.copyWith((message) => updates(message as LabelV2)) as LabelV2;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LabelV2 create() => LabelV2._();\n  @$core.override\n  LabelV2 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LabelV2 getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<LabelV2>(create);\n  static LabelV2? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<$core.String> get content => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $core.bool get exposureOnce => $_getBF(2);\n  @$pb.TagNumber(3)\n  set exposureOnce($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasExposureOnce() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearExposureOnce() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  ExposureType get exposureType => $_getN(3);\n  @$pb.TagNumber(4)\n  set exposureType(ExposureType value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasExposureType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearExposureType() => $_clearField(4);\n}\n\nclass Period extends $pb.GeneratedMessage {\n  factory Period({\n    $fixnum.Int64? start,\n    $fixnum.Int64? end,\n  }) {\n    final result = create();\n    if (start != null) result.start = start;\n    if (end != null) result.end = end;\n    return result;\n  }\n\n  Period._();\n\n  factory Period.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Period.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Period',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'start')\n    ..aInt64(2, _omitFieldNames ? '' : 'end')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Period clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Period copyWith(void Function(Period) updates) =>\n      super.copyWith((message) => updates(message as Period)) as Period;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Period create() => Period._();\n  @$core.override\n  Period createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Period getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Period>(create);\n  static Period? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get start => $_getI64(0);\n  @$pb.TagNumber(1)\n  set start($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStart() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStart() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get end => $_getI64(1);\n  @$pb.TagNumber(2)\n  set end($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasEnd() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearEnd() => $_clearField(2);\n}\n\nclass PlayerDanmakuAiRecommendedLevel extends $pb.GeneratedMessage {\n  factory PlayerDanmakuAiRecommendedLevel({\n    $core.int? value,\n  }) {\n    final result = create();\n    if (value != null) result.value = value;\n    return result;\n  }\n\n  PlayerDanmakuAiRecommendedLevel._();\n\n  factory PlayerDanmakuAiRecommendedLevel.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayerDanmakuAiRecommendedLevel.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayerDanmakuAiRecommendedLevel',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'value')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuAiRecommendedLevel clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuAiRecommendedLevel copyWith(\n          void Function(PlayerDanmakuAiRecommendedLevel) updates) =>\n      super.copyWith(\n              (message) => updates(message as PlayerDanmakuAiRecommendedLevel))\n          as PlayerDanmakuAiRecommendedLevel;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuAiRecommendedLevel create() =>\n      PlayerDanmakuAiRecommendedLevel._();\n  @$core.override\n  PlayerDanmakuAiRecommendedLevel createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuAiRecommendedLevel getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayerDanmakuAiRecommendedLevel>(\n          create);\n  static PlayerDanmakuAiRecommendedLevel? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get value => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set value($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasValue() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearValue() => $_clearField(1);\n}\n\nclass PlayerDanmakuAiRecommendedLevelV2 extends $pb.GeneratedMessage {\n  factory PlayerDanmakuAiRecommendedLevelV2({\n    $core.int? value,\n  }) {\n    final result = create();\n    if (value != null) result.value = value;\n    return result;\n  }\n\n  PlayerDanmakuAiRecommendedLevelV2._();\n\n  factory PlayerDanmakuAiRecommendedLevelV2.fromBuffer(\n          $core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayerDanmakuAiRecommendedLevelV2.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayerDanmakuAiRecommendedLevelV2',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'value')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuAiRecommendedLevelV2 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuAiRecommendedLevelV2 copyWith(\n          void Function(PlayerDanmakuAiRecommendedLevelV2) updates) =>\n      super.copyWith((message) =>\n              updates(message as PlayerDanmakuAiRecommendedLevelV2))\n          as PlayerDanmakuAiRecommendedLevelV2;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuAiRecommendedLevelV2 create() =>\n      PlayerDanmakuAiRecommendedLevelV2._();\n  @$core.override\n  PlayerDanmakuAiRecommendedLevelV2 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuAiRecommendedLevelV2 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayerDanmakuAiRecommendedLevelV2>(\n          create);\n  static PlayerDanmakuAiRecommendedLevelV2? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get value => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set value($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasValue() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearValue() => $_clearField(1);\n}\n\nclass PlayerDanmakuAiRecommendedSwitch extends $pb.GeneratedMessage {\n  factory PlayerDanmakuAiRecommendedSwitch({\n    $core.bool? value,\n  }) {\n    final result = create();\n    if (value != null) result.value = value;\n    return result;\n  }\n\n  PlayerDanmakuAiRecommendedSwitch._();\n\n  factory PlayerDanmakuAiRecommendedSwitch.fromBuffer(\n          $core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayerDanmakuAiRecommendedSwitch.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayerDanmakuAiRecommendedSwitch',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'value')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuAiRecommendedSwitch clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuAiRecommendedSwitch copyWith(\n          void Function(PlayerDanmakuAiRecommendedSwitch) updates) =>\n      super.copyWith(\n              (message) => updates(message as PlayerDanmakuAiRecommendedSwitch))\n          as PlayerDanmakuAiRecommendedSwitch;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuAiRecommendedSwitch create() =>\n      PlayerDanmakuAiRecommendedSwitch._();\n  @$core.override\n  PlayerDanmakuAiRecommendedSwitch createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuAiRecommendedSwitch getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayerDanmakuAiRecommendedSwitch>(\n          create);\n  static PlayerDanmakuAiRecommendedSwitch? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get value => $_getBF(0);\n  @$pb.TagNumber(1)\n  set value($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasValue() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearValue() => $_clearField(1);\n}\n\nclass PlayerDanmakuBlockbottom extends $pb.GeneratedMessage {\n  factory PlayerDanmakuBlockbottom({\n    $core.bool? value,\n  }) {\n    final result = create();\n    if (value != null) result.value = value;\n    return result;\n  }\n\n  PlayerDanmakuBlockbottom._();\n\n  factory PlayerDanmakuBlockbottom.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayerDanmakuBlockbottom.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayerDanmakuBlockbottom',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'value')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuBlockbottom clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuBlockbottom copyWith(\n          void Function(PlayerDanmakuBlockbottom) updates) =>\n      super.copyWith((message) => updates(message as PlayerDanmakuBlockbottom))\n          as PlayerDanmakuBlockbottom;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuBlockbottom create() => PlayerDanmakuBlockbottom._();\n  @$core.override\n  PlayerDanmakuBlockbottom createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuBlockbottom getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayerDanmakuBlockbottom>(create);\n  static PlayerDanmakuBlockbottom? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get value => $_getBF(0);\n  @$pb.TagNumber(1)\n  set value($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasValue() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearValue() => $_clearField(1);\n}\n\nclass PlayerDanmakuBlockcolorful extends $pb.GeneratedMessage {\n  factory PlayerDanmakuBlockcolorful({\n    $core.bool? value,\n  }) {\n    final result = create();\n    if (value != null) result.value = value;\n    return result;\n  }\n\n  PlayerDanmakuBlockcolorful._();\n\n  factory PlayerDanmakuBlockcolorful.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayerDanmakuBlockcolorful.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayerDanmakuBlockcolorful',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'value')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuBlockcolorful clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuBlockcolorful copyWith(\n          void Function(PlayerDanmakuBlockcolorful) updates) =>\n      super.copyWith(\n              (message) => updates(message as PlayerDanmakuBlockcolorful))\n          as PlayerDanmakuBlockcolorful;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuBlockcolorful create() => PlayerDanmakuBlockcolorful._();\n  @$core.override\n  PlayerDanmakuBlockcolorful createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuBlockcolorful getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayerDanmakuBlockcolorful>(create);\n  static PlayerDanmakuBlockcolorful? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get value => $_getBF(0);\n  @$pb.TagNumber(1)\n  set value($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasValue() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearValue() => $_clearField(1);\n}\n\nclass PlayerDanmakuBlockrepeat extends $pb.GeneratedMessage {\n  factory PlayerDanmakuBlockrepeat({\n    $core.bool? value,\n  }) {\n    final result = create();\n    if (value != null) result.value = value;\n    return result;\n  }\n\n  PlayerDanmakuBlockrepeat._();\n\n  factory PlayerDanmakuBlockrepeat.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayerDanmakuBlockrepeat.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayerDanmakuBlockrepeat',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'value')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuBlockrepeat clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuBlockrepeat copyWith(\n          void Function(PlayerDanmakuBlockrepeat) updates) =>\n      super.copyWith((message) => updates(message as PlayerDanmakuBlockrepeat))\n          as PlayerDanmakuBlockrepeat;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuBlockrepeat create() => PlayerDanmakuBlockrepeat._();\n  @$core.override\n  PlayerDanmakuBlockrepeat createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuBlockrepeat getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayerDanmakuBlockrepeat>(create);\n  static PlayerDanmakuBlockrepeat? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get value => $_getBF(0);\n  @$pb.TagNumber(1)\n  set value($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasValue() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearValue() => $_clearField(1);\n}\n\nclass PlayerDanmakuBlockscroll extends $pb.GeneratedMessage {\n  factory PlayerDanmakuBlockscroll({\n    $core.bool? value,\n  }) {\n    final result = create();\n    if (value != null) result.value = value;\n    return result;\n  }\n\n  PlayerDanmakuBlockscroll._();\n\n  factory PlayerDanmakuBlockscroll.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayerDanmakuBlockscroll.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayerDanmakuBlockscroll',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'value')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuBlockscroll clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuBlockscroll copyWith(\n          void Function(PlayerDanmakuBlockscroll) updates) =>\n      super.copyWith((message) => updates(message as PlayerDanmakuBlockscroll))\n          as PlayerDanmakuBlockscroll;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuBlockscroll create() => PlayerDanmakuBlockscroll._();\n  @$core.override\n  PlayerDanmakuBlockscroll createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuBlockscroll getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayerDanmakuBlockscroll>(create);\n  static PlayerDanmakuBlockscroll? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get value => $_getBF(0);\n  @$pb.TagNumber(1)\n  set value($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasValue() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearValue() => $_clearField(1);\n}\n\nclass PlayerDanmakuBlockspecial extends $pb.GeneratedMessage {\n  factory PlayerDanmakuBlockspecial({\n    $core.bool? value,\n  }) {\n    final result = create();\n    if (value != null) result.value = value;\n    return result;\n  }\n\n  PlayerDanmakuBlockspecial._();\n\n  factory PlayerDanmakuBlockspecial.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayerDanmakuBlockspecial.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayerDanmakuBlockspecial',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'value')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuBlockspecial clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuBlockspecial copyWith(\n          void Function(PlayerDanmakuBlockspecial) updates) =>\n      super.copyWith((message) => updates(message as PlayerDanmakuBlockspecial))\n          as PlayerDanmakuBlockspecial;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuBlockspecial create() => PlayerDanmakuBlockspecial._();\n  @$core.override\n  PlayerDanmakuBlockspecial createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuBlockspecial getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayerDanmakuBlockspecial>(create);\n  static PlayerDanmakuBlockspecial? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get value => $_getBF(0);\n  @$pb.TagNumber(1)\n  set value($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasValue() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearValue() => $_clearField(1);\n}\n\nclass PlayerDanmakuBlocktop extends $pb.GeneratedMessage {\n  factory PlayerDanmakuBlocktop({\n    $core.bool? value,\n  }) {\n    final result = create();\n    if (value != null) result.value = value;\n    return result;\n  }\n\n  PlayerDanmakuBlocktop._();\n\n  factory PlayerDanmakuBlocktop.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayerDanmakuBlocktop.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayerDanmakuBlocktop',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'value')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuBlocktop clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuBlocktop copyWith(\n          void Function(PlayerDanmakuBlocktop) updates) =>\n      super.copyWith((message) => updates(message as PlayerDanmakuBlocktop))\n          as PlayerDanmakuBlocktop;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuBlocktop create() => PlayerDanmakuBlocktop._();\n  @$core.override\n  PlayerDanmakuBlocktop createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuBlocktop getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayerDanmakuBlocktop>(create);\n  static PlayerDanmakuBlocktop? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get value => $_getBF(0);\n  @$pb.TagNumber(1)\n  set value($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasValue() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearValue() => $_clearField(1);\n}\n\nclass PlayerDanmakuBlocktopBottom extends $pb.GeneratedMessage {\n  factory PlayerDanmakuBlocktopBottom({\n    $core.bool? value,\n  }) {\n    final result = create();\n    if (value != null) result.value = value;\n    return result;\n  }\n\n  PlayerDanmakuBlocktopBottom._();\n\n  factory PlayerDanmakuBlocktopBottom.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayerDanmakuBlocktopBottom.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayerDanmakuBlocktopBottom',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'value')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuBlocktopBottom clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuBlocktopBottom copyWith(\n          void Function(PlayerDanmakuBlocktopBottom) updates) =>\n      super.copyWith(\n              (message) => updates(message as PlayerDanmakuBlocktopBottom))\n          as PlayerDanmakuBlocktopBottom;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuBlocktopBottom create() =>\n      PlayerDanmakuBlocktopBottom._();\n  @$core.override\n  PlayerDanmakuBlocktopBottom createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuBlocktopBottom getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayerDanmakuBlocktopBottom>(create);\n  static PlayerDanmakuBlocktopBottom? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get value => $_getBF(0);\n  @$pb.TagNumber(1)\n  set value($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasValue() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearValue() => $_clearField(1);\n}\n\nclass PlayerDanmakuDensity extends $pb.GeneratedMessage {\n  factory PlayerDanmakuDensity({\n    $core.int? value,\n  }) {\n    final result = create();\n    if (value != null) result.value = value;\n    return result;\n  }\n\n  PlayerDanmakuDensity._();\n\n  factory PlayerDanmakuDensity.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayerDanmakuDensity.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayerDanmakuDensity',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'value')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuDensity clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuDensity copyWith(void Function(PlayerDanmakuDensity) updates) =>\n      super.copyWith((message) => updates(message as PlayerDanmakuDensity))\n          as PlayerDanmakuDensity;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuDensity create() => PlayerDanmakuDensity._();\n  @$core.override\n  PlayerDanmakuDensity createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuDensity getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayerDanmakuDensity>(create);\n  static PlayerDanmakuDensity? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get value => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set value($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasValue() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearValue() => $_clearField(1);\n}\n\nclass PlayerDanmakuDomain extends $pb.GeneratedMessage {\n  factory PlayerDanmakuDomain({\n    $core.double? value,\n  }) {\n    final result = create();\n    if (value != null) result.value = value;\n    return result;\n  }\n\n  PlayerDanmakuDomain._();\n\n  factory PlayerDanmakuDomain.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayerDanmakuDomain.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayerDanmakuDomain',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aD(1, _omitFieldNames ? '' : 'value', fieldType: $pb.PbFieldType.OF)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuDomain clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuDomain copyWith(void Function(PlayerDanmakuDomain) updates) =>\n      super.copyWith((message) => updates(message as PlayerDanmakuDomain))\n          as PlayerDanmakuDomain;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuDomain create() => PlayerDanmakuDomain._();\n  @$core.override\n  PlayerDanmakuDomain createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuDomain getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayerDanmakuDomain>(create);\n  static PlayerDanmakuDomain? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.double get value => $_getN(0);\n  @$pb.TagNumber(1)\n  set value($core.double value) => $_setFloat(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasValue() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearValue() => $_clearField(1);\n}\n\nclass PlayerDanmakuDomainV2 extends $pb.GeneratedMessage {\n  factory PlayerDanmakuDomainV2({\n    $core.int? value,\n  }) {\n    final result = create();\n    if (value != null) result.value = value;\n    return result;\n  }\n\n  PlayerDanmakuDomainV2._();\n\n  factory PlayerDanmakuDomainV2.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayerDanmakuDomainV2.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayerDanmakuDomainV2',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'value')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuDomainV2 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuDomainV2 copyWith(\n          void Function(PlayerDanmakuDomainV2) updates) =>\n      super.copyWith((message) => updates(message as PlayerDanmakuDomainV2))\n          as PlayerDanmakuDomainV2;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuDomainV2 create() => PlayerDanmakuDomainV2._();\n  @$core.override\n  PlayerDanmakuDomainV2 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuDomainV2 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayerDanmakuDomainV2>(create);\n  static PlayerDanmakuDomainV2? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get value => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set value($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasValue() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearValue() => $_clearField(1);\n}\n\nclass PlayerDanmakuEnableHerdDm extends $pb.GeneratedMessage {\n  factory PlayerDanmakuEnableHerdDm({\n    $core.bool? value,\n  }) {\n    final result = create();\n    if (value != null) result.value = value;\n    return result;\n  }\n\n  PlayerDanmakuEnableHerdDm._();\n\n  factory PlayerDanmakuEnableHerdDm.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayerDanmakuEnableHerdDm.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayerDanmakuEnableHerdDm',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'value')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuEnableHerdDm clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuEnableHerdDm copyWith(\n          void Function(PlayerDanmakuEnableHerdDm) updates) =>\n      super.copyWith((message) => updates(message as PlayerDanmakuEnableHerdDm))\n          as PlayerDanmakuEnableHerdDm;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuEnableHerdDm create() => PlayerDanmakuEnableHerdDm._();\n  @$core.override\n  PlayerDanmakuEnableHerdDm createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuEnableHerdDm getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayerDanmakuEnableHerdDm>(create);\n  static PlayerDanmakuEnableHerdDm? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get value => $_getBF(0);\n  @$pb.TagNumber(1)\n  set value($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasValue() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearValue() => $_clearField(1);\n}\n\nclass PlayerDanmakuEnableblocklist extends $pb.GeneratedMessage {\n  factory PlayerDanmakuEnableblocklist({\n    $core.bool? value,\n  }) {\n    final result = create();\n    if (value != null) result.value = value;\n    return result;\n  }\n\n  PlayerDanmakuEnableblocklist._();\n\n  factory PlayerDanmakuEnableblocklist.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayerDanmakuEnableblocklist.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayerDanmakuEnableblocklist',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'value')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuEnableblocklist clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuEnableblocklist copyWith(\n          void Function(PlayerDanmakuEnableblocklist) updates) =>\n      super.copyWith(\n              (message) => updates(message as PlayerDanmakuEnableblocklist))\n          as PlayerDanmakuEnableblocklist;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuEnableblocklist create() =>\n      PlayerDanmakuEnableblocklist._();\n  @$core.override\n  PlayerDanmakuEnableblocklist createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuEnableblocklist getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayerDanmakuEnableblocklist>(create);\n  static PlayerDanmakuEnableblocklist? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get value => $_getBF(0);\n  @$pb.TagNumber(1)\n  set value($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasValue() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearValue() => $_clearField(1);\n}\n\nclass PlayerDanmakuOpacity extends $pb.GeneratedMessage {\n  factory PlayerDanmakuOpacity({\n    $core.double? value,\n  }) {\n    final result = create();\n    if (value != null) result.value = value;\n    return result;\n  }\n\n  PlayerDanmakuOpacity._();\n\n  factory PlayerDanmakuOpacity.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayerDanmakuOpacity.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayerDanmakuOpacity',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aD(1, _omitFieldNames ? '' : 'value', fieldType: $pb.PbFieldType.OF)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuOpacity clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuOpacity copyWith(void Function(PlayerDanmakuOpacity) updates) =>\n      super.copyWith((message) => updates(message as PlayerDanmakuOpacity))\n          as PlayerDanmakuOpacity;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuOpacity create() => PlayerDanmakuOpacity._();\n  @$core.override\n  PlayerDanmakuOpacity createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuOpacity getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayerDanmakuOpacity>(create);\n  static PlayerDanmakuOpacity? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.double get value => $_getN(0);\n  @$pb.TagNumber(1)\n  set value($core.double value) => $_setFloat(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasValue() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearValue() => $_clearField(1);\n}\n\nclass PlayerDanmakuPeopleProof extends $pb.GeneratedMessage {\n  factory PlayerDanmakuPeopleProof({\n    $core.bool? value,\n  }) {\n    final result = create();\n    if (value != null) result.value = value;\n    return result;\n  }\n\n  PlayerDanmakuPeopleProof._();\n\n  factory PlayerDanmakuPeopleProof.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayerDanmakuPeopleProof.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayerDanmakuPeopleProof',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'value')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuPeopleProof clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuPeopleProof copyWith(\n          void Function(PlayerDanmakuPeopleProof) updates) =>\n      super.copyWith((message) => updates(message as PlayerDanmakuPeopleProof))\n          as PlayerDanmakuPeopleProof;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuPeopleProof create() => PlayerDanmakuPeopleProof._();\n  @$core.override\n  PlayerDanmakuPeopleProof createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuPeopleProof getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayerDanmakuPeopleProof>(create);\n  static PlayerDanmakuPeopleProof? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get value => $_getBF(0);\n  @$pb.TagNumber(1)\n  set value($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasValue() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearValue() => $_clearField(1);\n}\n\nclass PlayerDanmakuScalingfactor extends $pb.GeneratedMessage {\n  factory PlayerDanmakuScalingfactor({\n    $core.double? value,\n  }) {\n    final result = create();\n    if (value != null) result.value = value;\n    return result;\n  }\n\n  PlayerDanmakuScalingfactor._();\n\n  factory PlayerDanmakuScalingfactor.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayerDanmakuScalingfactor.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayerDanmakuScalingfactor',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aD(1, _omitFieldNames ? '' : 'value', fieldType: $pb.PbFieldType.OF)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuScalingfactor clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuScalingfactor copyWith(\n          void Function(PlayerDanmakuScalingfactor) updates) =>\n      super.copyWith(\n              (message) => updates(message as PlayerDanmakuScalingfactor))\n          as PlayerDanmakuScalingfactor;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuScalingfactor create() => PlayerDanmakuScalingfactor._();\n  @$core.override\n  PlayerDanmakuScalingfactor createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuScalingfactor getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayerDanmakuScalingfactor>(create);\n  static PlayerDanmakuScalingfactor? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.double get value => $_getN(0);\n  @$pb.TagNumber(1)\n  set value($core.double value) => $_setFloat(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasValue() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearValue() => $_clearField(1);\n}\n\nclass PlayerDanmakuSeniorModeSwitch extends $pb.GeneratedMessage {\n  factory PlayerDanmakuSeniorModeSwitch({\n    $core.int? value,\n  }) {\n    final result = create();\n    if (value != null) result.value = value;\n    return result;\n  }\n\n  PlayerDanmakuSeniorModeSwitch._();\n\n  factory PlayerDanmakuSeniorModeSwitch.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayerDanmakuSeniorModeSwitch.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayerDanmakuSeniorModeSwitch',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'value')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuSeniorModeSwitch clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuSeniorModeSwitch copyWith(\n          void Function(PlayerDanmakuSeniorModeSwitch) updates) =>\n      super.copyWith(\n              (message) => updates(message as PlayerDanmakuSeniorModeSwitch))\n          as PlayerDanmakuSeniorModeSwitch;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuSeniorModeSwitch create() =>\n      PlayerDanmakuSeniorModeSwitch._();\n  @$core.override\n  PlayerDanmakuSeniorModeSwitch createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuSeniorModeSwitch getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayerDanmakuSeniorModeSwitch>(create);\n  static PlayerDanmakuSeniorModeSwitch? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get value => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set value($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasValue() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearValue() => $_clearField(1);\n}\n\nclass PlayerDanmakuSpeed extends $pb.GeneratedMessage {\n  factory PlayerDanmakuSpeed({\n    $core.int? value,\n  }) {\n    final result = create();\n    if (value != null) result.value = value;\n    return result;\n  }\n\n  PlayerDanmakuSpeed._();\n\n  factory PlayerDanmakuSpeed.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayerDanmakuSpeed.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayerDanmakuSpeed',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'value')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuSpeed clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuSpeed copyWith(void Function(PlayerDanmakuSpeed) updates) =>\n      super.copyWith((message) => updates(message as PlayerDanmakuSpeed))\n          as PlayerDanmakuSpeed;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuSpeed create() => PlayerDanmakuSpeed._();\n  @$core.override\n  PlayerDanmakuSpeed createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuSpeed getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayerDanmakuSpeed>(create);\n  static PlayerDanmakuSpeed? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get value => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set value($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasValue() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearValue() => $_clearField(1);\n}\n\nclass PlayerDanmakuSubtitleProof extends $pb.GeneratedMessage {\n  factory PlayerDanmakuSubtitleProof({\n    $core.bool? value,\n  }) {\n    final result = create();\n    if (value != null) result.value = value;\n    return result;\n  }\n\n  PlayerDanmakuSubtitleProof._();\n\n  factory PlayerDanmakuSubtitleProof.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayerDanmakuSubtitleProof.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayerDanmakuSubtitleProof',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'value')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuSubtitleProof clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuSubtitleProof copyWith(\n          void Function(PlayerDanmakuSubtitleProof) updates) =>\n      super.copyWith(\n              (message) => updates(message as PlayerDanmakuSubtitleProof))\n          as PlayerDanmakuSubtitleProof;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuSubtitleProof create() => PlayerDanmakuSubtitleProof._();\n  @$core.override\n  PlayerDanmakuSubtitleProof createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuSubtitleProof getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayerDanmakuSubtitleProof>(create);\n  static PlayerDanmakuSubtitleProof? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get value => $_getBF(0);\n  @$pb.TagNumber(1)\n  set value($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasValue() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearValue() => $_clearField(1);\n}\n\nclass PlayerDanmakuSwitch extends $pb.GeneratedMessage {\n  factory PlayerDanmakuSwitch({\n    $core.bool? value,\n    $core.bool? canIgnore,\n  }) {\n    final result = create();\n    if (value != null) result.value = value;\n    if (canIgnore != null) result.canIgnore = canIgnore;\n    return result;\n  }\n\n  PlayerDanmakuSwitch._();\n\n  factory PlayerDanmakuSwitch.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayerDanmakuSwitch.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayerDanmakuSwitch',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'value')\n    ..aOB(2, _omitFieldNames ? '' : 'canIgnore')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuSwitch clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuSwitch copyWith(void Function(PlayerDanmakuSwitch) updates) =>\n      super.copyWith((message) => updates(message as PlayerDanmakuSwitch))\n          as PlayerDanmakuSwitch;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuSwitch create() => PlayerDanmakuSwitch._();\n  @$core.override\n  PlayerDanmakuSwitch createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuSwitch getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayerDanmakuSwitch>(create);\n  static PlayerDanmakuSwitch? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get value => $_getBF(0);\n  @$pb.TagNumber(1)\n  set value($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasValue() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearValue() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get canIgnore => $_getBF(1);\n  @$pb.TagNumber(2)\n  set canIgnore($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCanIgnore() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCanIgnore() => $_clearField(2);\n}\n\nclass PlayerDanmakuSwitchSave extends $pb.GeneratedMessage {\n  factory PlayerDanmakuSwitchSave({\n    $core.bool? value,\n  }) {\n    final result = create();\n    if (value != null) result.value = value;\n    return result;\n  }\n\n  PlayerDanmakuSwitchSave._();\n\n  factory PlayerDanmakuSwitchSave.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayerDanmakuSwitchSave.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayerDanmakuSwitchSave',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'value')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuSwitchSave clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuSwitchSave copyWith(\n          void Function(PlayerDanmakuSwitchSave) updates) =>\n      super.copyWith((message) => updates(message as PlayerDanmakuSwitchSave))\n          as PlayerDanmakuSwitchSave;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuSwitchSave create() => PlayerDanmakuSwitchSave._();\n  @$core.override\n  PlayerDanmakuSwitchSave createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuSwitchSave getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayerDanmakuSwitchSave>(create);\n  static PlayerDanmakuSwitchSave? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get value => $_getBF(0);\n  @$pb.TagNumber(1)\n  set value($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasValue() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearValue() => $_clearField(1);\n}\n\nclass PlayerDanmakuUseDefaultConfig extends $pb.GeneratedMessage {\n  factory PlayerDanmakuUseDefaultConfig({\n    $core.bool? value,\n  }) {\n    final result = create();\n    if (value != null) result.value = value;\n    return result;\n  }\n\n  PlayerDanmakuUseDefaultConfig._();\n\n  factory PlayerDanmakuUseDefaultConfig.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayerDanmakuUseDefaultConfig.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayerDanmakuUseDefaultConfig',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'value')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuUseDefaultConfig clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayerDanmakuUseDefaultConfig copyWith(\n          void Function(PlayerDanmakuUseDefaultConfig) updates) =>\n      super.copyWith(\n              (message) => updates(message as PlayerDanmakuUseDefaultConfig))\n          as PlayerDanmakuUseDefaultConfig;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuUseDefaultConfig create() =>\n      PlayerDanmakuUseDefaultConfig._();\n  @$core.override\n  PlayerDanmakuUseDefaultConfig createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayerDanmakuUseDefaultConfig getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayerDanmakuUseDefaultConfig>(create);\n  static PlayerDanmakuUseDefaultConfig? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get value => $_getBF(0);\n  @$pb.TagNumber(1)\n  set value($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasValue() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearValue() => $_clearField(1);\n}\n\nclass PostPanel extends $pb.GeneratedMessage {\n  factory PostPanel({\n    $fixnum.Int64? start,\n    $fixnum.Int64? end,\n    $fixnum.Int64? priority,\n    $fixnum.Int64? bizId,\n    PostPanelBizType? bizType,\n    ClickButton? clickButton,\n    TextInput? textInput,\n    CheckBox? checkBox,\n    Toast? toast,\n  }) {\n    final result = create();\n    if (start != null) result.start = start;\n    if (end != null) result.end = end;\n    if (priority != null) result.priority = priority;\n    if (bizId != null) result.bizId = bizId;\n    if (bizType != null) result.bizType = bizType;\n    if (clickButton != null) result.clickButton = clickButton;\n    if (textInput != null) result.textInput = textInput;\n    if (checkBox != null) result.checkBox = checkBox;\n    if (toast != null) result.toast = toast;\n    return result;\n  }\n\n  PostPanel._();\n\n  factory PostPanel.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PostPanel.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PostPanel',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'start')\n    ..aInt64(2, _omitFieldNames ? '' : 'end')\n    ..aInt64(3, _omitFieldNames ? '' : 'priority')\n    ..aInt64(4, _omitFieldNames ? '' : 'bizId')\n    ..aE<PostPanelBizType>(5, _omitFieldNames ? '' : 'bizType',\n        enumValues: PostPanelBizType.values)\n    ..aOM<ClickButton>(6, _omitFieldNames ? '' : 'clickButton',\n        subBuilder: ClickButton.create)\n    ..aOM<TextInput>(7, _omitFieldNames ? '' : 'textInput',\n        subBuilder: TextInput.create)\n    ..aOM<CheckBox>(8, _omitFieldNames ? '' : 'checkBox',\n        subBuilder: CheckBox.create)\n    ..aOM<Toast>(9, _omitFieldNames ? '' : 'toast', subBuilder: Toast.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PostPanel clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PostPanel copyWith(void Function(PostPanel) updates) =>\n      super.copyWith((message) => updates(message as PostPanel)) as PostPanel;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PostPanel create() => PostPanel._();\n  @$core.override\n  PostPanel createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PostPanel getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PostPanel>(create);\n  static PostPanel? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get start => $_getI64(0);\n  @$pb.TagNumber(1)\n  set start($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStart() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStart() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get end => $_getI64(1);\n  @$pb.TagNumber(2)\n  set end($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasEnd() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearEnd() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get priority => $_getI64(2);\n  @$pb.TagNumber(3)\n  set priority($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPriority() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPriority() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get bizId => $_getI64(3);\n  @$pb.TagNumber(4)\n  set bizId($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBizId() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBizId() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  PostPanelBizType get bizType => $_getN(4);\n  @$pb.TagNumber(5)\n  set bizType(PostPanelBizType value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBizType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBizType() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  ClickButton get clickButton => $_getN(5);\n  @$pb.TagNumber(6)\n  set clickButton(ClickButton value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasClickButton() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearClickButton() => $_clearField(6);\n  @$pb.TagNumber(6)\n  ClickButton ensureClickButton() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  TextInput get textInput => $_getN(6);\n  @$pb.TagNumber(7)\n  set textInput(TextInput value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasTextInput() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearTextInput() => $_clearField(7);\n  @$pb.TagNumber(7)\n  TextInput ensureTextInput() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  CheckBox get checkBox => $_getN(7);\n  @$pb.TagNumber(8)\n  set checkBox(CheckBox value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasCheckBox() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearCheckBox() => $_clearField(8);\n  @$pb.TagNumber(8)\n  CheckBox ensureCheckBox() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  Toast get toast => $_getN(8);\n  @$pb.TagNumber(9)\n  set toast(Toast value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasToast() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearToast() => $_clearField(9);\n  @$pb.TagNumber(9)\n  Toast ensureToast() => $_ensure(8);\n}\n\nclass PostPanelV2 extends $pb.GeneratedMessage {\n  factory PostPanelV2({\n    $fixnum.Int64? start,\n    $fixnum.Int64? end,\n    PostPanelBizType? bizType,\n    ClickButtonV2? clickButton,\n    TextInputV2? textInput,\n    CheckBoxV2? checkBox,\n    ToastV2? toast,\n    BubbleV2? bubble,\n    LabelV2? label,\n    PostStatus? postStatus,\n  }) {\n    final result = create();\n    if (start != null) result.start = start;\n    if (end != null) result.end = end;\n    if (bizType != null) result.bizType = bizType;\n    if (clickButton != null) result.clickButton = clickButton;\n    if (textInput != null) result.textInput = textInput;\n    if (checkBox != null) result.checkBox = checkBox;\n    if (toast != null) result.toast = toast;\n    if (bubble != null) result.bubble = bubble;\n    if (label != null) result.label = label;\n    if (postStatus != null) result.postStatus = postStatus;\n    return result;\n  }\n\n  PostPanelV2._();\n\n  factory PostPanelV2.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PostPanelV2.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PostPanelV2',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'start')\n    ..aInt64(2, _omitFieldNames ? '' : 'end')\n    ..aE<PostPanelBizType>(3, _omitFieldNames ? '' : 'bizType',\n        enumValues: PostPanelBizType.values)\n    ..aOM<ClickButtonV2>(4, _omitFieldNames ? '' : 'clickButton',\n        subBuilder: ClickButtonV2.create)\n    ..aOM<TextInputV2>(5, _omitFieldNames ? '' : 'textInput',\n        subBuilder: TextInputV2.create)\n    ..aOM<CheckBoxV2>(6, _omitFieldNames ? '' : 'checkBox',\n        subBuilder: CheckBoxV2.create)\n    ..aOM<ToastV2>(7, _omitFieldNames ? '' : 'toast',\n        subBuilder: ToastV2.create)\n    ..aOM<BubbleV2>(8, _omitFieldNames ? '' : 'bubble',\n        subBuilder: BubbleV2.create)\n    ..aOM<LabelV2>(9, _omitFieldNames ? '' : 'label',\n        subBuilder: LabelV2.create)\n    ..aE<PostStatus>(10, _omitFieldNames ? '' : 'postStatus',\n        enumValues: PostStatus.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PostPanelV2 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PostPanelV2 copyWith(void Function(PostPanelV2) updates) =>\n      super.copyWith((message) => updates(message as PostPanelV2))\n          as PostPanelV2;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PostPanelV2 create() => PostPanelV2._();\n  @$core.override\n  PostPanelV2 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PostPanelV2 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PostPanelV2>(create);\n  static PostPanelV2? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get start => $_getI64(0);\n  @$pb.TagNumber(1)\n  set start($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStart() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStart() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get end => $_getI64(1);\n  @$pb.TagNumber(2)\n  set end($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasEnd() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearEnd() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  PostPanelBizType get bizType => $_getN(2);\n  @$pb.TagNumber(3)\n  set bizType(PostPanelBizType value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBizType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBizType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  ClickButtonV2 get clickButton => $_getN(3);\n  @$pb.TagNumber(4)\n  set clickButton(ClickButtonV2 value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasClickButton() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearClickButton() => $_clearField(4);\n  @$pb.TagNumber(4)\n  ClickButtonV2 ensureClickButton() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  TextInputV2 get textInput => $_getN(4);\n  @$pb.TagNumber(5)\n  set textInput(TextInputV2 value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasTextInput() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearTextInput() => $_clearField(5);\n  @$pb.TagNumber(5)\n  TextInputV2 ensureTextInput() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  CheckBoxV2 get checkBox => $_getN(5);\n  @$pb.TagNumber(6)\n  set checkBox(CheckBoxV2 value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCheckBox() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCheckBox() => $_clearField(6);\n  @$pb.TagNumber(6)\n  CheckBoxV2 ensureCheckBox() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  ToastV2 get toast => $_getN(6);\n  @$pb.TagNumber(7)\n  set toast(ToastV2 value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasToast() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearToast() => $_clearField(7);\n  @$pb.TagNumber(7)\n  ToastV2 ensureToast() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  BubbleV2 get bubble => $_getN(7);\n  @$pb.TagNumber(8)\n  set bubble(BubbleV2 value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasBubble() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearBubble() => $_clearField(8);\n  @$pb.TagNumber(8)\n  BubbleV2 ensureBubble() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  LabelV2 get label => $_getN(8);\n  @$pb.TagNumber(9)\n  set label(LabelV2 value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasLabel() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearLabel() => $_clearField(9);\n  @$pb.TagNumber(9)\n  LabelV2 ensureLabel() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  PostStatus get postStatus => $_getN(9);\n  @$pb.TagNumber(10)\n  set postStatus(PostStatus value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasPostStatus() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearPostStatus() => $_clearField(10);\n}\n\nclass QoeInfo extends $pb.GeneratedMessage {\n  factory QoeInfo({\n    $core.String? info,\n  }) {\n    final result = create();\n    if (info != null) result.info = info;\n    return result;\n  }\n\n  QoeInfo._();\n\n  factory QoeInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory QoeInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'QoeInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'info')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QoeInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QoeInfo copyWith(void Function(QoeInfo) updates) =>\n      super.copyWith((message) => updates(message as QoeInfo)) as QoeInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static QoeInfo create() => QoeInfo._();\n  @$core.override\n  QoeInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static QoeInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<QoeInfo>(create);\n  static QoeInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get info => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set info($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasInfo() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearInfo() => $_clearField(1);\n}\n\nclass ReportDuration extends $pb.GeneratedMessage {\n  factory ReportDuration({\n    $fixnum.Int64? startSecond,\n    $fixnum.Int64? endSecond,\n  }) {\n    final result = create();\n    if (startSecond != null) result.startSecond = startSecond;\n    if (endSecond != null) result.endSecond = endSecond;\n    return result;\n  }\n\n  ReportDuration._();\n\n  factory ReportDuration.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReportDuration.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReportDuration',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'startSecond')\n    ..aInt64(2, _omitFieldNames ? '' : 'endSecond')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReportDuration clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReportDuration copyWith(void Function(ReportDuration) updates) =>\n      super.copyWith((message) => updates(message as ReportDuration))\n          as ReportDuration;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReportDuration create() => ReportDuration._();\n  @$core.override\n  ReportDuration createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReportDuration getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReportDuration>(create);\n  static ReportDuration? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get startSecond => $_getI64(0);\n  @$pb.TagNumber(1)\n  set startSecond($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStartSecond() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStartSecond() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get endSecond => $_getI64(1);\n  @$pb.TagNumber(2)\n  set endSecond($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasEndSecond() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearEndSecond() => $_clearField(2);\n}\n\nclass Response extends $pb.GeneratedMessage {\n  factory Response({\n    $core.int? code,\n    $core.String? message,\n  }) {\n    final result = create();\n    if (code != null) result.code = code;\n    if (message != null) result.message = message;\n    return result;\n  }\n\n  Response._();\n\n  factory Response.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Response.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Response',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'code')\n    ..aOS(2, _omitFieldNames ? '' : 'message')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Response clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Response copyWith(void Function(Response) updates) =>\n      super.copyWith((message) => updates(message as Response)) as Response;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Response create() => Response._();\n  @$core.override\n  Response createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Response getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Response>(create);\n  static Response? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get code => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set code($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCode() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCode() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get message => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set message($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMessage() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMessage() => $_clearField(2);\n}\n\nclass SubtitleItem extends $pb.GeneratedMessage {\n  factory SubtitleItem({\n    $fixnum.Int64? id,\n    $core.String? idStr,\n    $core.String? lan,\n    $core.String? lanDoc,\n    $core.String? subtitleUrl,\n    UserInfo? author,\n    SubtitleType? type,\n    $core.String? lanDocBrief,\n    SubtitleAiType? aiType,\n    SubtitleAiStatus? aiStatus,\n    SubtitleRole? role,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (idStr != null) result.idStr = idStr;\n    if (lan != null) result.lan = lan;\n    if (lanDoc != null) result.lanDoc = lanDoc;\n    if (subtitleUrl != null) result.subtitleUrl = subtitleUrl;\n    if (author != null) result.author = author;\n    if (type != null) result.type = type;\n    if (lanDocBrief != null) result.lanDocBrief = lanDocBrief;\n    if (aiType != null) result.aiType = aiType;\n    if (aiStatus != null) result.aiStatus = aiStatus;\n    if (role != null) result.role = role;\n    return result;\n  }\n\n  SubtitleItem._();\n\n  factory SubtitleItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SubtitleItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SubtitleItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'idStr')\n    ..aOS(3, _omitFieldNames ? '' : 'lan')\n    ..aOS(4, _omitFieldNames ? '' : 'lanDoc')\n    ..aOS(5, _omitFieldNames ? '' : 'subtitleUrl')\n    ..aOM<UserInfo>(6, _omitFieldNames ? '' : 'author',\n        subBuilder: UserInfo.create)\n    ..aE<SubtitleType>(7, _omitFieldNames ? '' : 'type',\n        enumValues: SubtitleType.values)\n    ..aOS(8, _omitFieldNames ? '' : 'lanDocBrief')\n    ..aE<SubtitleAiType>(9, _omitFieldNames ? '' : 'aiType',\n        enumValues: SubtitleAiType.values)\n    ..aE<SubtitleAiStatus>(10, _omitFieldNames ? '' : 'aiStatus',\n        enumValues: SubtitleAiStatus.values)\n    ..aE<SubtitleRole>(11, _omitFieldNames ? '' : 'role',\n        enumValues: SubtitleRole.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SubtitleItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SubtitleItem copyWith(void Function(SubtitleItem) updates) =>\n      super.copyWith((message) => updates(message as SubtitleItem))\n          as SubtitleItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SubtitleItem create() => SubtitleItem._();\n  @$core.override\n  SubtitleItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SubtitleItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SubtitleItem>(create);\n  static SubtitleItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get idStr => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set idStr($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIdStr() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIdStr() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get lan => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set lan($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLan() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLan() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get lanDoc => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set lanDoc($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLanDoc() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLanDoc() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get subtitleUrl => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set subtitleUrl($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasSubtitleUrl() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearSubtitleUrl() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  UserInfo get author => $_getN(5);\n  @$pb.TagNumber(6)\n  set author(UserInfo value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasAuthor() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearAuthor() => $_clearField(6);\n  @$pb.TagNumber(6)\n  UserInfo ensureAuthor() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  SubtitleType get type => $_getN(6);\n  @$pb.TagNumber(7)\n  set type(SubtitleType value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasType() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearType() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get lanDocBrief => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set lanDocBrief($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasLanDocBrief() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearLanDocBrief() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  SubtitleAiType get aiType => $_getN(8);\n  @$pb.TagNumber(9)\n  set aiType(SubtitleAiType value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasAiType() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearAiType() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  SubtitleAiStatus get aiStatus => $_getN(9);\n  @$pb.TagNumber(10)\n  set aiStatus(SubtitleAiStatus value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasAiStatus() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearAiStatus() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  SubtitleRole get role => $_getN(10);\n  @$pb.TagNumber(11)\n  set role(SubtitleRole value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasRole() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearRole() => $_clearField(11);\n}\n\nclass TextInput extends $pb.GeneratedMessage {\n  factory TextInput({\n    $core.Iterable<$core.String>? portraitPlaceholder,\n    $core.Iterable<$core.String>? landscapePlaceholder,\n    RenderType? renderType,\n    $core.bool? placeholderPost,\n    $core.bool? show,\n    $core.Iterable<Avatar>? avatar,\n    PostStatus? postStatus,\n    Label? label,\n  }) {\n    final result = create();\n    if (portraitPlaceholder != null)\n      result.portraitPlaceholder.addAll(portraitPlaceholder);\n    if (landscapePlaceholder != null)\n      result.landscapePlaceholder.addAll(landscapePlaceholder);\n    if (renderType != null) result.renderType = renderType;\n    if (placeholderPost != null) result.placeholderPost = placeholderPost;\n    if (show != null) result.show = show;\n    if (avatar != null) result.avatar.addAll(avatar);\n    if (postStatus != null) result.postStatus = postStatus;\n    if (label != null) result.label = label;\n    return result;\n  }\n\n  TextInput._();\n\n  factory TextInput.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TextInput.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TextInput',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..pPS(1, _omitFieldNames ? '' : 'portraitPlaceholder')\n    ..pPS(2, _omitFieldNames ? '' : 'landscapePlaceholder')\n    ..aE<RenderType>(3, _omitFieldNames ? '' : 'renderType',\n        enumValues: RenderType.values)\n    ..aOB(4, _omitFieldNames ? '' : 'placeholderPost')\n    ..aOB(5, _omitFieldNames ? '' : 'show')\n    ..pPM<Avatar>(6, _omitFieldNames ? '' : 'avatar', subBuilder: Avatar.create)\n    ..aE<PostStatus>(7, _omitFieldNames ? '' : 'postStatus',\n        enumValues: PostStatus.values)\n    ..aOM<Label>(8, _omitFieldNames ? '' : 'label', subBuilder: Label.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TextInput clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TextInput copyWith(void Function(TextInput) updates) =>\n      super.copyWith((message) => updates(message as TextInput)) as TextInput;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TextInput create() => TextInput._();\n  @$core.override\n  TextInput createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TextInput getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TextInput>(create);\n  static TextInput? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<$core.String> get portraitPlaceholder => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<$core.String> get landscapePlaceholder => $_getList(1);\n\n  @$pb.TagNumber(3)\n  RenderType get renderType => $_getN(2);\n  @$pb.TagNumber(3)\n  set renderType(RenderType value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRenderType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRenderType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get placeholderPost => $_getBF(3);\n  @$pb.TagNumber(4)\n  set placeholderPost($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPlaceholderPost() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPlaceholderPost() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.bool get show => $_getBF(4);\n  @$pb.TagNumber(5)\n  set show($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasShow() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearShow() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $pb.PbList<Avatar> get avatar => $_getList(5);\n\n  @$pb.TagNumber(7)\n  PostStatus get postStatus => $_getN(6);\n  @$pb.TagNumber(7)\n  set postStatus(PostStatus value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasPostStatus() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearPostStatus() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  Label get label => $_getN(7);\n  @$pb.TagNumber(8)\n  set label(Label value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasLabel() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearLabel() => $_clearField(8);\n  @$pb.TagNumber(8)\n  Label ensureLabel() => $_ensure(7);\n}\n\nclass TextInputV2 extends $pb.GeneratedMessage {\n  factory TextInputV2({\n    $core.Iterable<$core.String>? portraitPlaceholder,\n    $core.Iterable<$core.String>? landscapePlaceholder,\n    RenderType? renderType,\n    $core.bool? placeholderPost,\n    $core.Iterable<Avatar>? avatar,\n    $core.int? textInputLimit,\n  }) {\n    final result = create();\n    if (portraitPlaceholder != null)\n      result.portraitPlaceholder.addAll(portraitPlaceholder);\n    if (landscapePlaceholder != null)\n      result.landscapePlaceholder.addAll(landscapePlaceholder);\n    if (renderType != null) result.renderType = renderType;\n    if (placeholderPost != null) result.placeholderPost = placeholderPost;\n    if (avatar != null) result.avatar.addAll(avatar);\n    if (textInputLimit != null) result.textInputLimit = textInputLimit;\n    return result;\n  }\n\n  TextInputV2._();\n\n  factory TextInputV2.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TextInputV2.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TextInputV2',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..pPS(1, _omitFieldNames ? '' : 'portraitPlaceholder')\n    ..pPS(2, _omitFieldNames ? '' : 'landscapePlaceholder')\n    ..aE<RenderType>(3, _omitFieldNames ? '' : 'renderType',\n        enumValues: RenderType.values)\n    ..aOB(4, _omitFieldNames ? '' : 'placeholderPost')\n    ..pPM<Avatar>(5, _omitFieldNames ? '' : 'avatar', subBuilder: Avatar.create)\n    ..aI(6, _omitFieldNames ? '' : 'textInputLimit')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TextInputV2 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TextInputV2 copyWith(void Function(TextInputV2) updates) =>\n      super.copyWith((message) => updates(message as TextInputV2))\n          as TextInputV2;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TextInputV2 create() => TextInputV2._();\n  @$core.override\n  TextInputV2 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TextInputV2 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<TextInputV2>(create);\n  static TextInputV2? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<$core.String> get portraitPlaceholder => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<$core.String> get landscapePlaceholder => $_getList(1);\n\n  @$pb.TagNumber(3)\n  RenderType get renderType => $_getN(2);\n  @$pb.TagNumber(3)\n  set renderType(RenderType value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRenderType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRenderType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get placeholderPost => $_getBF(3);\n  @$pb.TagNumber(4)\n  set placeholderPost($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPlaceholderPost() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPlaceholderPost() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $pb.PbList<Avatar> get avatar => $_getList(4);\n\n  @$pb.TagNumber(6)\n  $core.int get textInputLimit => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set textInputLimit($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasTextInputLimit() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearTextInputLimit() => $_clearField(6);\n}\n\nclass Toast extends $pb.GeneratedMessage {\n  factory Toast({\n    $core.String? text,\n    $core.int? duration,\n    $core.bool? show,\n    Button? button,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (duration != null) result.duration = duration;\n    if (show != null) result.show = show;\n    if (button != null) result.button = button;\n    return result;\n  }\n\n  Toast._();\n\n  factory Toast.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Toast.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Toast',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aI(2, _omitFieldNames ? '' : 'duration')\n    ..aOB(3, _omitFieldNames ? '' : 'show')\n    ..aOM<Button>(4, _omitFieldNames ? '' : 'button', subBuilder: Button.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Toast clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Toast copyWith(void Function(Toast) updates) =>\n      super.copyWith((message) => updates(message as Toast)) as Toast;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Toast create() => Toast._();\n  @$core.override\n  Toast createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Toast getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Toast>(create);\n  static Toast? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get duration => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set duration($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDuration() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDuration() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get show => $_getBF(2);\n  @$pb.TagNumber(3)\n  set show($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasShow() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearShow() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  Button get button => $_getN(3);\n  @$pb.TagNumber(4)\n  set button(Button value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasButton() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearButton() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Button ensureButton() => $_ensure(3);\n}\n\nclass ToastButtonV2 extends $pb.GeneratedMessage {\n  factory ToastButtonV2({\n    $core.String? text,\n    ToastFunctionType? action,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (action != null) result.action = action;\n    return result;\n  }\n\n  ToastButtonV2._();\n\n  factory ToastButtonV2.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ToastButtonV2.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ToastButtonV2',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aE<ToastFunctionType>(2, _omitFieldNames ? '' : 'action',\n        enumValues: ToastFunctionType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ToastButtonV2 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ToastButtonV2 copyWith(void Function(ToastButtonV2) updates) =>\n      super.copyWith((message) => updates(message as ToastButtonV2))\n          as ToastButtonV2;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ToastButtonV2 create() => ToastButtonV2._();\n  @$core.override\n  ToastButtonV2 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ToastButtonV2 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ToastButtonV2>(create);\n  static ToastButtonV2? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  ToastFunctionType get action => $_getN(1);\n  @$pb.TagNumber(2)\n  set action(ToastFunctionType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAction() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAction() => $_clearField(2);\n}\n\nclass ToastV2 extends $pb.GeneratedMessage {\n  factory ToastV2({\n    $core.String? text,\n    $core.int? duration,\n    ToastButtonV2? toastButtonV2,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (duration != null) result.duration = duration;\n    if (toastButtonV2 != null) result.toastButtonV2 = toastButtonV2;\n    return result;\n  }\n\n  ToastV2._();\n\n  factory ToastV2.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ToastV2.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ToastV2',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aI(2, _omitFieldNames ? '' : 'duration')\n    ..aOM<ToastButtonV2>(3, _omitFieldNames ? '' : 'toastButtonV2',\n        subBuilder: ToastButtonV2.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ToastV2 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ToastV2 copyWith(void Function(ToastV2) updates) =>\n      super.copyWith((message) => updates(message as ToastV2)) as ToastV2;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ToastV2 create() => ToastV2._();\n  @$core.override\n  ToastV2 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ToastV2 getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ToastV2>(create);\n  static ToastV2? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get duration => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set duration($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDuration() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDuration() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  ToastButtonV2 get toastButtonV2 => $_getN(2);\n  @$pb.TagNumber(3)\n  set toastButtonV2(ToastButtonV2 value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasToastButtonV2() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearToastButtonV2() => $_clearField(3);\n  @$pb.TagNumber(3)\n  ToastButtonV2 ensureToastButtonV2() => $_ensure(2);\n}\n\nclass UserInfo extends $pb.GeneratedMessage {\n  factory UserInfo({\n    $fixnum.Int64? mid,\n    $core.String? name,\n    $core.String? sex,\n    $core.String? face,\n    $core.String? sign,\n    $core.int? rank,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (name != null) result.name = name;\n    if (sex != null) result.sex = sex;\n    if (face != null) result.face = face;\n    if (sign != null) result.sign = sign;\n    if (rank != null) result.rank = rank;\n    return result;\n  }\n\n  UserInfo._();\n\n  factory UserInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UserInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UserInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'sex')\n    ..aOS(4, _omitFieldNames ? '' : 'face')\n    ..aOS(5, _omitFieldNames ? '' : 'sign')\n    ..aI(6, _omitFieldNames ? '' : 'rank')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserInfo copyWith(void Function(UserInfo) updates) =>\n      super.copyWith((message) => updates(message as UserInfo)) as UserInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UserInfo create() => UserInfo._();\n  @$core.override\n  UserInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UserInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<UserInfo>(create);\n  static UserInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get sex => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set sex($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSex() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSex() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get face => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set face($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFace() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFace() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get sign => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set sign($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasSign() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearSign() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get rank => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set rank($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasRank() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearRank() => $_clearField(6);\n}\n\nclass VideoMask extends $pb.GeneratedMessage {\n  factory VideoMask({\n    $fixnum.Int64? cid,\n    $core.int? plat,\n    $core.int? fps,\n    $fixnum.Int64? time,\n    $core.String? maskUrl,\n  }) {\n    final result = create();\n    if (cid != null) result.cid = cid;\n    if (plat != null) result.plat = plat;\n    if (fps != null) result.fps = fps;\n    if (time != null) result.time = time;\n    if (maskUrl != null) result.maskUrl = maskUrl;\n    return result;\n  }\n\n  VideoMask._();\n\n  factory VideoMask.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory VideoMask.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'VideoMask',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'cid')\n    ..aI(2, _omitFieldNames ? '' : 'plat')\n    ..aI(3, _omitFieldNames ? '' : 'fps')\n    ..aInt64(4, _omitFieldNames ? '' : 'time')\n    ..aOS(5, _omitFieldNames ? '' : 'maskUrl')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VideoMask clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VideoMask copyWith(void Function(VideoMask) updates) =>\n      super.copyWith((message) => updates(message as VideoMask)) as VideoMask;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static VideoMask create() => VideoMask._();\n  @$core.override\n  VideoMask createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static VideoMask getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<VideoMask>(create);\n  static VideoMask? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get cid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set cid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get plat => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set plat($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPlat() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPlat() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get fps => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set fps($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFps() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFps() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get time => $_getI64(3);\n  @$pb.TagNumber(4)\n  set time($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTime() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTime() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get maskUrl => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set maskUrl($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasMaskUrl() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearMaskUrl() => $_clearField(5);\n}\n\nclass VideoSubtitle extends $pb.GeneratedMessage {\n  factory VideoSubtitle({\n    $core.String? lan,\n    $core.String? lanDoc,\n    $core.Iterable<SubtitleItem>? subtitles,\n  }) {\n    final result = create();\n    if (lan != null) result.lan = lan;\n    if (lanDoc != null) result.lanDoc = lanDoc;\n    if (subtitles != null) result.subtitles.addAll(subtitles);\n    return result;\n  }\n\n  VideoSubtitle._();\n\n  factory VideoSubtitle.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory VideoSubtitle.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'VideoSubtitle',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'lan')\n    ..aOS(2, _omitFieldNames ? '' : 'lanDoc')\n    ..pPM<SubtitleItem>(3, _omitFieldNames ? '' : 'subtitles',\n        subBuilder: SubtitleItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VideoSubtitle clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VideoSubtitle copyWith(void Function(VideoSubtitle) updates) =>\n      super.copyWith((message) => updates(message as VideoSubtitle))\n          as VideoSubtitle;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static VideoSubtitle create() => VideoSubtitle._();\n  @$core.override\n  VideoSubtitle createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static VideoSubtitle getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<VideoSubtitle>(create);\n  static VideoSubtitle? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get lan => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set lan($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLan() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLan() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get lanDoc => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set lanDoc($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLanDoc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLanDoc() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<SubtitleItem> get subtitles => $_getList(2);\n}\n\nclass ViewHerdDmElem extends $pb.GeneratedMessage {\n  factory ViewHerdDmElem({\n    $core.String? herdMsg,\n    $core.int? herdStartCnt,\n    $core.int? herdEndCnt,\n    $core.String? regexRule,\n    $core.int? startProgress,\n    $core.int? endProgress,\n  }) {\n    final result = create();\n    if (herdMsg != null) result.herdMsg = herdMsg;\n    if (herdStartCnt != null) result.herdStartCnt = herdStartCnt;\n    if (herdEndCnt != null) result.herdEndCnt = herdEndCnt;\n    if (regexRule != null) result.regexRule = regexRule;\n    if (startProgress != null) result.startProgress = startProgress;\n    if (endProgress != null) result.endProgress = endProgress;\n    return result;\n  }\n\n  ViewHerdDmElem._();\n\n  factory ViewHerdDmElem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ViewHerdDmElem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ViewHerdDmElem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.community.service.dm.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'herdMsg')\n    ..aI(2, _omitFieldNames ? '' : 'herdStartCnt')\n    ..aI(3, _omitFieldNames ? '' : 'herdEndCnt')\n    ..aOS(4, _omitFieldNames ? '' : 'regexRule')\n    ..aI(5, _omitFieldNames ? '' : 'startProgress')\n    ..aI(6, _omitFieldNames ? '' : 'endProgress')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ViewHerdDmElem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ViewHerdDmElem copyWith(void Function(ViewHerdDmElem) updates) =>\n      super.copyWith((message) => updates(message as ViewHerdDmElem))\n          as ViewHerdDmElem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ViewHerdDmElem create() => ViewHerdDmElem._();\n  @$core.override\n  ViewHerdDmElem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ViewHerdDmElem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ViewHerdDmElem>(create);\n  static ViewHerdDmElem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get herdMsg => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set herdMsg($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasHerdMsg() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearHerdMsg() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get herdStartCnt => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set herdStartCnt($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHerdStartCnt() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHerdStartCnt() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get herdEndCnt => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set herdEndCnt($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasHerdEndCnt() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearHerdEndCnt() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get regexRule => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set regexRule($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasRegexRule() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearRegexRule() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get startProgress => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set startProgress($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasStartProgress() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearStartProgress() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get endProgress => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set endProgress($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasEndProgress() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearEndProgress() => $_clearField(6);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/community/service/dm/v1.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/community/service/dm/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nclass AvatarType extends $pb.ProtobufEnum {\n  static const AvatarType AvatarTypeNone =\n      AvatarType._(0, _omitEnumNames ? '' : 'AvatarTypeNone');\n  static const AvatarType AvatarTypeNFT =\n      AvatarType._(1, _omitEnumNames ? '' : 'AvatarTypeNFT');\n\n  static const $core.List<AvatarType> values = <AvatarType>[\n    AvatarTypeNone,\n    AvatarTypeNFT,\n  ];\n\n  static final $core.List<AvatarType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static AvatarType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const AvatarType._(super.value, super.name);\n}\n\nclass BubbleType extends $pb.ProtobufEnum {\n  static const BubbleType BubbleTypeNone =\n      BubbleType._(0, _omitEnumNames ? '' : 'BubbleTypeNone');\n  static const BubbleType BubbleTypeClickButton =\n      BubbleType._(1, _omitEnumNames ? '' : 'BubbleTypeClickButton');\n  static const BubbleType BubbleTypeDmSettingPanel =\n      BubbleType._(2, _omitEnumNames ? '' : 'BubbleTypeDmSettingPanel');\n\n  static const $core.List<BubbleType> values = <BubbleType>[\n    BubbleTypeNone,\n    BubbleTypeClickButton,\n    BubbleTypeDmSettingPanel,\n  ];\n\n  static final $core.List<BubbleType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static BubbleType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const BubbleType._(super.value, super.name);\n}\n\nclass CheckboxType extends $pb.ProtobufEnum {\n  static const CheckboxType CheckboxTypeNone =\n      CheckboxType._(0, _omitEnumNames ? '' : 'CheckboxTypeNone');\n  static const CheckboxType CheckboxTypeEncourage =\n      CheckboxType._(1, _omitEnumNames ? '' : 'CheckboxTypeEncourage');\n  static const CheckboxType CheckboxTypeColorDM =\n      CheckboxType._(2, _omitEnumNames ? '' : 'CheckboxTypeColorDM');\n\n  static const $core.List<CheckboxType> values = <CheckboxType>[\n    CheckboxTypeNone,\n    CheckboxTypeEncourage,\n    CheckboxTypeColorDM,\n  ];\n\n  static final $core.List<CheckboxType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static CheckboxType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const CheckboxType._(super.value, super.name);\n}\n\nclass DmColorfulType extends $pb.ProtobufEnum {\n  static const DmColorfulType NoneType =\n      DmColorfulType._(0, _omitEnumNames ? '' : 'NoneType');\n  static const DmColorfulType VipGradualColor =\n      DmColorfulType._(60001, _omitEnumNames ? '' : 'VipGradualColor');\n\n  static const $core.List<DmColorfulType> values = <DmColorfulType>[\n    NoneType,\n    VipGradualColor,\n  ];\n\n  static final $core.Map<$core.int, DmColorfulType> _byValue =\n      $pb.ProtobufEnum.initByValue(values);\n  static DmColorfulType? valueOf($core.int value) => _byValue[value];\n\n  const DmColorfulType._(super.value, super.name);\n}\n\nclass DmFromType extends $pb.ProtobufEnum {\n  static const DmFromType DmFromUnknown =\n      DmFromType._(0, _omitEnumNames ? '' : 'DmFromUnknown');\n  static const DmFromType DmFromNormal =\n      DmFromType._(1, _omitEnumNames ? '' : 'DmFromNormal');\n  static const DmFromType DmFromCmd =\n      DmFromType._(2, _omitEnumNames ? '' : 'DmFromCmd');\n  static const DmFromType DmFromLive =\n      DmFromType._(3, _omitEnumNames ? '' : 'DmFromLive');\n\n  static const $core.List<DmFromType> values = <DmFromType>[\n    DmFromUnknown,\n    DmFromNormal,\n    DmFromCmd,\n    DmFromLive,\n  ];\n\n  static final $core.List<DmFromType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static DmFromType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const DmFromType._(super.value, super.name);\n}\n\nclass DmMaskWallBizType extends $pb.ProtobufEnum {\n  static const DmMaskWallBizType Unknown =\n      DmMaskWallBizType._(0, _omitEnumNames ? '' : 'Unknown');\n  static const DmMaskWallBizType OGV =\n      DmMaskWallBizType._(1, _omitEnumNames ? '' : 'OGV');\n  static const DmMaskWallBizType BizPic =\n      DmMaskWallBizType._(2, _omitEnumNames ? '' : 'BizPic');\n  static const DmMaskWallBizType Mute =\n      DmMaskWallBizType._(3, _omitEnumNames ? '' : 'Mute');\n  static const DmMaskWallBizType Record =\n      DmMaskWallBizType._(4, _omitEnumNames ? '' : 'Record');\n  static const DmMaskWallBizType Cloud =\n      DmMaskWallBizType._(5, _omitEnumNames ? '' : 'Cloud');\n  static const DmMaskWallBizType AIGC =\n      DmMaskWallBizType._(6, _omitEnumNames ? '' : 'AIGC');\n\n  static const $core.List<DmMaskWallBizType> values = <DmMaskWallBizType>[\n    Unknown,\n    OGV,\n    BizPic,\n    Mute,\n    Record,\n    Cloud,\n    AIGC,\n  ];\n\n  static final $core.List<DmMaskWallBizType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 6);\n  static DmMaskWallBizType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const DmMaskWallBizType._(super.value, super.name);\n}\n\nclass DmMaskWallContentType extends $pb.ProtobufEnum {\n  static const DmMaskWallContentType DmMaskWallContentTypeUnknown =\n      DmMaskWallContentType._(\n          0, _omitEnumNames ? '' : 'DmMaskWallContentTypeUnknown');\n  static const DmMaskWallContentType DmMaskWallContentTypeText =\n      DmMaskWallContentType._(\n          1, _omitEnumNames ? '' : 'DmMaskWallContentTypeText');\n  static const DmMaskWallContentType DmMaskWallContentTypePic =\n      DmMaskWallContentType._(\n          2, _omitEnumNames ? '' : 'DmMaskWallContentTypePic');\n\n  static const $core.List<DmMaskWallContentType> values =\n      <DmMaskWallContentType>[\n    DmMaskWallContentTypeUnknown,\n    DmMaskWallContentTypeText,\n    DmMaskWallContentTypePic,\n  ];\n\n  static final $core.List<DmMaskWallContentType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static DmMaskWallContentType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const DmMaskWallContentType._(super.value, super.name);\n}\n\nclass ExposureType extends $pb.ProtobufEnum {\n  static const ExposureType ExposureTypeNone =\n      ExposureType._(0, _omitEnumNames ? '' : 'ExposureTypeNone');\n  static const ExposureType ExposureTypeDMSend =\n      ExposureType._(1, _omitEnumNames ? '' : 'ExposureTypeDMSend');\n\n  static const $core.List<ExposureType> values = <ExposureType>[\n    ExposureTypeNone,\n    ExposureTypeDMSend,\n  ];\n\n  static final $core.List<ExposureType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static ExposureType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ExposureType._(super.value, super.name);\n}\n\nclass PostPanelBizType extends $pb.ProtobufEnum {\n  static const PostPanelBizType PostPanelBizTypeNone =\n      PostPanelBizType._(0, _omitEnumNames ? '' : 'PostPanelBizTypeNone');\n  static const PostPanelBizType PostPanelBizTypeEncourage =\n      PostPanelBizType._(1, _omitEnumNames ? '' : 'PostPanelBizTypeEncourage');\n  static const PostPanelBizType PostPanelBizTypeColorDM =\n      PostPanelBizType._(2, _omitEnumNames ? '' : 'PostPanelBizTypeColorDM');\n  static const PostPanelBizType PostPanelBizTypeNFTDM =\n      PostPanelBizType._(3, _omitEnumNames ? '' : 'PostPanelBizTypeNFTDM');\n  static const PostPanelBizType PostPanelBizTypeFragClose =\n      PostPanelBizType._(4, _omitEnumNames ? '' : 'PostPanelBizTypeFragClose');\n  static const PostPanelBizType PostPanelBizTypeRecommend =\n      PostPanelBizType._(5, _omitEnumNames ? '' : 'PostPanelBizTypeRecommend');\n  static const PostPanelBizType PostPanelBizTypePlotLeak =\n      PostPanelBizType._(6, _omitEnumNames ? '' : 'PostPanelBizTypePlotLeak');\n  static const PostPanelBizType PostPanelBizTypeAntiHarassment =\n      PostPanelBizType._(\n          7, _omitEnumNames ? '' : 'PostPanelBizTypeAntiHarassment');\n\n  static const $core.List<PostPanelBizType> values = <PostPanelBizType>[\n    PostPanelBizTypeNone,\n    PostPanelBizTypeEncourage,\n    PostPanelBizTypeColorDM,\n    PostPanelBizTypeNFTDM,\n    PostPanelBizTypeFragClose,\n    PostPanelBizTypeRecommend,\n    PostPanelBizTypePlotLeak,\n    PostPanelBizTypeAntiHarassment,\n  ];\n\n  static final $core.List<PostPanelBizType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 7);\n  static PostPanelBizType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const PostPanelBizType._(super.value, super.name);\n}\n\nclass PostStatus extends $pb.ProtobufEnum {\n  static const PostStatus PostStatusNormal =\n      PostStatus._(0, _omitEnumNames ? '' : 'PostStatusNormal');\n  static const PostStatus PostStatusClosed =\n      PostStatus._(1, _omitEnumNames ? '' : 'PostStatusClosed');\n\n  static const $core.List<PostStatus> values = <PostStatus>[\n    PostStatusNormal,\n    PostStatusClosed,\n  ];\n\n  static final $core.List<PostStatus?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static PostStatus? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const PostStatus._(super.value, super.name);\n}\n\nclass RenderType extends $pb.ProtobufEnum {\n  static const RenderType RenderTypeNone =\n      RenderType._(0, _omitEnumNames ? '' : 'RenderTypeNone');\n  static const RenderType RenderTypeSingle =\n      RenderType._(1, _omitEnumNames ? '' : 'RenderTypeSingle');\n  static const RenderType RenderTypeRotation =\n      RenderType._(2, _omitEnumNames ? '' : 'RenderTypeRotation');\n\n  static const $core.List<RenderType> values = <RenderType>[\n    RenderTypeNone,\n    RenderTypeSingle,\n    RenderTypeRotation,\n  ];\n\n  static final $core.List<RenderType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static RenderType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const RenderType._(super.value, super.name);\n}\n\nclass SubtitleAiStatus extends $pb.ProtobufEnum {\n  static const SubtitleAiStatus None =\n      SubtitleAiStatus._(0, _omitEnumNames ? '' : 'None');\n  static const SubtitleAiStatus Exposure =\n      SubtitleAiStatus._(1, _omitEnumNames ? '' : 'Exposure');\n  static const SubtitleAiStatus Assist =\n      SubtitleAiStatus._(2, _omitEnumNames ? '' : 'Assist');\n\n  static const $core.List<SubtitleAiStatus> values = <SubtitleAiStatus>[\n    None,\n    Exposure,\n    Assist,\n  ];\n\n  static final $core.List<SubtitleAiStatus?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static SubtitleAiStatus? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const SubtitleAiStatus._(super.value, super.name);\n}\n\nclass SubtitleAiType extends $pb.ProtobufEnum {\n  static const SubtitleAiType Normal =\n      SubtitleAiType._(0, _omitEnumNames ? '' : 'Normal');\n  static const SubtitleAiType Translate =\n      SubtitleAiType._(1, _omitEnumNames ? '' : 'Translate');\n\n  static const $core.List<SubtitleAiType> values = <SubtitleAiType>[\n    Normal,\n    Translate,\n  ];\n\n  static final $core.List<SubtitleAiType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static SubtitleAiType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const SubtitleAiType._(super.value, super.name);\n}\n\nclass SubtitleRole extends $pb.ProtobufEnum {\n  static const SubtitleRole Default =\n      SubtitleRole._(0, _omitEnumNames ? '' : 'Default');\n  static const SubtitleRole Main =\n      SubtitleRole._(1, _omitEnumNames ? '' : 'Main');\n  static const SubtitleRole Secondary =\n      SubtitleRole._(2, _omitEnumNames ? '' : 'Secondary');\n\n  static const $core.List<SubtitleRole> values = <SubtitleRole>[\n    Default,\n    Main,\n    Secondary,\n  ];\n\n  static final $core.List<SubtitleRole?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static SubtitleRole? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const SubtitleRole._(super.value, super.name);\n}\n\nclass SubtitleType extends $pb.ProtobufEnum {\n  static const SubtitleType CC = SubtitleType._(0, _omitEnumNames ? '' : 'CC');\n  static const SubtitleType AI = SubtitleType._(1, _omitEnumNames ? '' : 'AI');\n\n  static const $core.List<SubtitleType> values = <SubtitleType>[\n    CC,\n    AI,\n  ];\n\n  static final $core.List<SubtitleType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static SubtitleType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const SubtitleType._(super.value, super.name);\n}\n\nclass ToastFunctionType extends $pb.ProtobufEnum {\n  static const ToastFunctionType ToastFunctionTypeNone =\n      ToastFunctionType._(0, _omitEnumNames ? '' : 'ToastFunctionTypeNone');\n  static const ToastFunctionType ToastFunctionTypePostPanel =\n      ToastFunctionType._(\n          1, _omitEnumNames ? '' : 'ToastFunctionTypePostPanel');\n\n  static const $core.List<ToastFunctionType> values = <ToastFunctionType>[\n    ToastFunctionTypeNone,\n    ToastFunctionTypePostPanel,\n  ];\n\n  static final $core.List<ToastFunctionType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static ToastFunctionType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ToastFunctionType._(super.value, super.name);\n}\n\nconst $core.bool _omitEnumNames =\n    $core.bool.fromEnvironment('protobuf.omit_enum_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/community/service/dm/v1.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/community/service/dm/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use avatarTypeDescriptor instead')\nconst AvatarType$json = {\n  '1': 'AvatarType',\n  '2': [\n    {'1': 'AvatarTypeNone', '2': 0},\n    {'1': 'AvatarTypeNFT', '2': 1},\n  ],\n};\n\n/// Descriptor for `AvatarType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List avatarTypeDescriptor = $convert.base64Decode(\n    'CgpBdmF0YXJUeXBlEhIKDkF2YXRhclR5cGVOb25lEAASEQoNQXZhdGFyVHlwZU5GVBAB');\n\n@$core.Deprecated('Use bubbleTypeDescriptor instead')\nconst BubbleType$json = {\n  '1': 'BubbleType',\n  '2': [\n    {'1': 'BubbleTypeNone', '2': 0},\n    {'1': 'BubbleTypeClickButton', '2': 1},\n    {'1': 'BubbleTypeDmSettingPanel', '2': 2},\n  ],\n};\n\n/// Descriptor for `BubbleType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List bubbleTypeDescriptor = $convert.base64Decode(\n    'CgpCdWJibGVUeXBlEhIKDkJ1YmJsZVR5cGVOb25lEAASGQoVQnViYmxlVHlwZUNsaWNrQnV0dG'\n    '9uEAESHAoYQnViYmxlVHlwZURtU2V0dGluZ1BhbmVsEAI=');\n\n@$core.Deprecated('Use checkboxTypeDescriptor instead')\nconst CheckboxType$json = {\n  '1': 'CheckboxType',\n  '2': [\n    {'1': 'CheckboxTypeNone', '2': 0},\n    {'1': 'CheckboxTypeEncourage', '2': 1},\n    {'1': 'CheckboxTypeColorDM', '2': 2},\n  ],\n};\n\n/// Descriptor for `CheckboxType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List checkboxTypeDescriptor = $convert.base64Decode(\n    'CgxDaGVja2JveFR5cGUSFAoQQ2hlY2tib3hUeXBlTm9uZRAAEhkKFUNoZWNrYm94VHlwZUVuY2'\n    '91cmFnZRABEhcKE0NoZWNrYm94VHlwZUNvbG9yRE0QAg==');\n\n@$core.Deprecated('Use dmColorfulTypeDescriptor instead')\nconst DmColorfulType$json = {\n  '1': 'DmColorfulType',\n  '2': [\n    {'1': 'NoneType', '2': 0},\n    {'1': 'VipGradualColor', '2': 60001},\n  ],\n};\n\n/// Descriptor for `DmColorfulType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List dmColorfulTypeDescriptor = $convert.base64Decode(\n    'Cg5EbUNvbG9yZnVsVHlwZRIMCghOb25lVHlwZRAAEhUKD1ZpcEdyYWR1YWxDb2xvchDh1AM=');\n\n@$core.Deprecated('Use dmFromTypeDescriptor instead')\nconst DmFromType$json = {\n  '1': 'DmFromType',\n  '2': [\n    {'1': 'DmFromUnknown', '2': 0},\n    {'1': 'DmFromNormal', '2': 1},\n    {'1': 'DmFromCmd', '2': 2},\n    {'1': 'DmFromLive', '2': 3},\n  ],\n};\n\n/// Descriptor for `DmFromType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List dmFromTypeDescriptor = $convert.base64Decode(\n    'CgpEbUZyb21UeXBlEhEKDURtRnJvbVVua25vd24QABIQCgxEbUZyb21Ob3JtYWwQARINCglEbU'\n    'Zyb21DbWQQAhIOCgpEbUZyb21MaXZlEAM=');\n\n@$core.Deprecated('Use dmMaskWallBizTypeDescriptor instead')\nconst DmMaskWallBizType$json = {\n  '1': 'DmMaskWallBizType',\n  '2': [\n    {'1': 'Unknown', '2': 0},\n    {'1': 'OGV', '2': 1},\n    {'1': 'BizPic', '2': 2},\n    {'1': 'Mute', '2': 3},\n    {'1': 'Record', '2': 4},\n    {'1': 'Cloud', '2': 5},\n    {'1': 'AIGC', '2': 6},\n  ],\n};\n\n/// Descriptor for `DmMaskWallBizType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List dmMaskWallBizTypeDescriptor = $convert.base64Decode(\n    'ChFEbU1hc2tXYWxsQml6VHlwZRILCgdVbmtub3duEAASBwoDT0dWEAESCgoGQml6UGljEAISCA'\n    'oETXV0ZRADEgoKBlJlY29yZBAEEgkKBUNsb3VkEAUSCAoEQUlHQxAG');\n\n@$core.Deprecated('Use dmMaskWallContentTypeDescriptor instead')\nconst DmMaskWallContentType$json = {\n  '1': 'DmMaskWallContentType',\n  '2': [\n    {'1': 'DmMaskWallContentTypeUnknown', '2': 0},\n    {'1': 'DmMaskWallContentTypeText', '2': 1},\n    {'1': 'DmMaskWallContentTypePic', '2': 2},\n  ],\n};\n\n/// Descriptor for `DmMaskWallContentType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List dmMaskWallContentTypeDescriptor = $convert.base64Decode(\n    'ChVEbU1hc2tXYWxsQ29udGVudFR5cGUSIAocRG1NYXNrV2FsbENvbnRlbnRUeXBlVW5rbm93bh'\n    'AAEh0KGURtTWFza1dhbGxDb250ZW50VHlwZVRleHQQARIcChhEbU1hc2tXYWxsQ29udGVudFR5'\n    'cGVQaWMQAg==');\n\n@$core.Deprecated('Use exposureTypeDescriptor instead')\nconst ExposureType$json = {\n  '1': 'ExposureType',\n  '2': [\n    {'1': 'ExposureTypeNone', '2': 0},\n    {'1': 'ExposureTypeDMSend', '2': 1},\n  ],\n};\n\n/// Descriptor for `ExposureType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List exposureTypeDescriptor = $convert.base64Decode(\n    'CgxFeHBvc3VyZVR5cGUSFAoQRXhwb3N1cmVUeXBlTm9uZRAAEhYKEkV4cG9zdXJlVHlwZURNU2'\n    'VuZBAB');\n\n@$core.Deprecated('Use postPanelBizTypeDescriptor instead')\nconst PostPanelBizType$json = {\n  '1': 'PostPanelBizType',\n  '2': [\n    {'1': 'PostPanelBizTypeNone', '2': 0},\n    {'1': 'PostPanelBizTypeEncourage', '2': 1},\n    {'1': 'PostPanelBizTypeColorDM', '2': 2},\n    {'1': 'PostPanelBizTypeNFTDM', '2': 3},\n    {'1': 'PostPanelBizTypeFragClose', '2': 4},\n    {'1': 'PostPanelBizTypeRecommend', '2': 5},\n    {'1': 'PostPanelBizTypePlotLeak', '2': 6},\n    {'1': 'PostPanelBizTypeAntiHarassment', '2': 7},\n  ],\n};\n\n/// Descriptor for `PostPanelBizType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List postPanelBizTypeDescriptor = $convert.base64Decode(\n    'ChBQb3N0UGFuZWxCaXpUeXBlEhgKFFBvc3RQYW5lbEJpelR5cGVOb25lEAASHQoZUG9zdFBhbm'\n    'VsQml6VHlwZUVuY291cmFnZRABEhsKF1Bvc3RQYW5lbEJpelR5cGVDb2xvckRNEAISGQoVUG9z'\n    'dFBhbmVsQml6VHlwZU5GVERNEAMSHQoZUG9zdFBhbmVsQml6VHlwZUZyYWdDbG9zZRAEEh0KGV'\n    'Bvc3RQYW5lbEJpelR5cGVSZWNvbW1lbmQQBRIcChhQb3N0UGFuZWxCaXpUeXBlUGxvdExlYWsQ'\n    'BhIiCh5Qb3N0UGFuZWxCaXpUeXBlQW50aUhhcmFzc21lbnQQBw==');\n\n@$core.Deprecated('Use postStatusDescriptor instead')\nconst PostStatus$json = {\n  '1': 'PostStatus',\n  '2': [\n    {'1': 'PostStatusNormal', '2': 0},\n    {'1': 'PostStatusClosed', '2': 1},\n  ],\n};\n\n/// Descriptor for `PostStatus`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List postStatusDescriptor = $convert.base64Decode(\n    'CgpQb3N0U3RhdHVzEhQKEFBvc3RTdGF0dXNOb3JtYWwQABIUChBQb3N0U3RhdHVzQ2xvc2VkEA'\n    'E=');\n\n@$core.Deprecated('Use renderTypeDescriptor instead')\nconst RenderType$json = {\n  '1': 'RenderType',\n  '2': [\n    {'1': 'RenderTypeNone', '2': 0},\n    {'1': 'RenderTypeSingle', '2': 1},\n    {'1': 'RenderTypeRotation', '2': 2},\n  ],\n};\n\n/// Descriptor for `RenderType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List renderTypeDescriptor = $convert.base64Decode(\n    'CgpSZW5kZXJUeXBlEhIKDlJlbmRlclR5cGVOb25lEAASFAoQUmVuZGVyVHlwZVNpbmdsZRABEh'\n    'YKElJlbmRlclR5cGVSb3RhdGlvbhAC');\n\n@$core.Deprecated('Use subtitleAiStatusDescriptor instead')\nconst SubtitleAiStatus$json = {\n  '1': 'SubtitleAiStatus',\n  '2': [\n    {'1': 'None', '2': 0},\n    {'1': 'Exposure', '2': 1},\n    {'1': 'Assist', '2': 2},\n  ],\n};\n\n/// Descriptor for `SubtitleAiStatus`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List subtitleAiStatusDescriptor = $convert.base64Decode(\n    'ChBTdWJ0aXRsZUFpU3RhdHVzEggKBE5vbmUQABIMCghFeHBvc3VyZRABEgoKBkFzc2lzdBAC');\n\n@$core.Deprecated('Use subtitleAiTypeDescriptor instead')\nconst SubtitleAiType$json = {\n  '1': 'SubtitleAiType',\n  '2': [\n    {'1': 'Normal', '2': 0},\n    {'1': 'Translate', '2': 1},\n  ],\n};\n\n/// Descriptor for `SubtitleAiType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List subtitleAiTypeDescriptor = $convert.base64Decode(\n    'Cg5TdWJ0aXRsZUFpVHlwZRIKCgZOb3JtYWwQABINCglUcmFuc2xhdGUQAQ==');\n\n@$core.Deprecated('Use subtitleRoleDescriptor instead')\nconst SubtitleRole$json = {\n  '1': 'SubtitleRole',\n  '2': [\n    {'1': 'Default', '2': 0},\n    {'1': 'Main', '2': 1},\n    {'1': 'Secondary', '2': 2},\n  ],\n};\n\n/// Descriptor for `SubtitleRole`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List subtitleRoleDescriptor = $convert.base64Decode(\n    'CgxTdWJ0aXRsZVJvbGUSCwoHRGVmYXVsdBAAEggKBE1haW4QARINCglTZWNvbmRhcnkQAg==');\n\n@$core.Deprecated('Use subtitleTypeDescriptor instead')\nconst SubtitleType$json = {\n  '1': 'SubtitleType',\n  '2': [\n    {'1': 'CC', '2': 0},\n    {'1': 'AI', '2': 1},\n  ],\n};\n\n/// Descriptor for `SubtitleType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List subtitleTypeDescriptor =\n    $convert.base64Decode('CgxTdWJ0aXRsZVR5cGUSBgoCQ0MQABIGCgJBSRAB');\n\n@$core.Deprecated('Use toastFunctionTypeDescriptor instead')\nconst ToastFunctionType$json = {\n  '1': 'ToastFunctionType',\n  '2': [\n    {'1': 'ToastFunctionTypeNone', '2': 0},\n    {'1': 'ToastFunctionTypePostPanel', '2': 1},\n  ],\n};\n\n/// Descriptor for `ToastFunctionType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List toastFunctionTypeDescriptor = $convert.base64Decode(\n    'ChFUb2FzdEZ1bmN0aW9uVHlwZRIZChVUb2FzdEZ1bmN0aW9uVHlwZU5vbmUQABIeChpUb2FzdE'\n    'Z1bmN0aW9uVHlwZVBvc3RQYW5lbBAB');\n\n@$core.Deprecated('Use avatarDescriptor instead')\nconst Avatar$json = {\n  '1': 'Avatar',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'},\n    {'1': 'url', '3': 2, '4': 1, '5': 9, '10': 'url'},\n    {\n      '1': 'avatar_type',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.community.service.dm.v1.AvatarType',\n      '10': 'avatarType'\n    },\n  ],\n};\n\n/// Descriptor for `Avatar`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List avatarDescriptor = $convert.base64Decode(\n    'CgZBdmF0YXISDgoCaWQYASABKAlSAmlkEhAKA3VybBgCIAEoCVIDdXJsEk0KC2F2YXRhcl90eX'\n    'BlGAMgASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQXZhdGFyVHlwZVIK'\n    'YXZhdGFyVHlwZQ==');\n\n@$core.Deprecated('Use bubbleDescriptor instead')\nconst Bubble$json = {\n  '1': 'Bubble',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'url', '3': 2, '4': 1, '5': 9, '10': 'url'},\n  ],\n};\n\n/// Descriptor for `Bubble`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bubbleDescriptor = $convert.base64Decode(\n    'CgZCdWJibGUSEgoEdGV4dBgBIAEoCVIEdGV4dBIQCgN1cmwYAiABKAlSA3VybA==');\n\n@$core.Deprecated('Use bubbleV2Descriptor instead')\nconst BubbleV2$json = {\n  '1': 'BubbleV2',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'url', '3': 2, '4': 1, '5': 9, '10': 'url'},\n    {\n      '1': 'bubble_type',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.community.service.dm.v1.BubbleType',\n      '10': 'bubbleType'\n    },\n    {'1': 'exposure_once', '3': 4, '4': 1, '5': 8, '10': 'exposureOnce'},\n    {\n      '1': 'exposure_type',\n      '3': 5,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.community.service.dm.v1.ExposureType',\n      '10': 'exposureType'\n    },\n  ],\n};\n\n/// Descriptor for `BubbleV2`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bubbleV2Descriptor = $convert.base64Decode(\n    'CghCdWJibGVWMhISCgR0ZXh0GAEgASgJUgR0ZXh0EhAKA3VybBgCIAEoCVIDdXJsEk0KC2J1Ym'\n    'JsZV90eXBlGAMgASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQnViYmxl'\n    'VHlwZVIKYnViYmxlVHlwZRIjCg1leHBvc3VyZV9vbmNlGAQgASgIUgxleHBvc3VyZU9uY2USUw'\n    'oNZXhwb3N1cmVfdHlwZRgFIAEoDjIuLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYx'\n    'LkV4cG9zdXJlVHlwZVIMZXhwb3N1cmVUeXBl');\n\n@$core.Deprecated('Use buttonDescriptor instead')\nconst Button$json = {\n  '1': 'Button',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {\n      '1': 'action',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.community.service.dm.v1.ToastFunctionType',\n      '10': 'action'\n    },\n  ],\n};\n\n/// Descriptor for `Button`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List buttonDescriptor = $convert.base64Decode(\n    'CgZCdXR0b24SEgoEdGV4dBgBIAEoCVIEdGV4dBJLCgZhY3Rpb24YAiABKA4yMy5iaWxpYmlsaS'\n    '5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Ub2FzdEZ1bmN0aW9uVHlwZVIGYWN0aW9u');\n\n@$core.Deprecated('Use buzzwordConfigDescriptor instead')\nconst BuzzwordConfig$json = {\n  '1': 'BuzzwordConfig',\n  '2': [\n    {\n      '1': 'keywords',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.BuzzwordShowConfig',\n      '10': 'keywords'\n    },\n  ],\n};\n\n/// Descriptor for `BuzzwordConfig`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List buzzwordConfigDescriptor = $convert.base64Decode(\n    'Cg5CdXp6d29yZENvbmZpZxJQCghrZXl3b3JkcxgBIAMoCzI0LmJpbGliaWxpLmNvbW11bml0eS'\n    '5zZXJ2aWNlLmRtLnYxLkJ1enp3b3JkU2hvd0NvbmZpZ1IIa2V5d29yZHM=');\n\n@$core.Deprecated('Use buzzwordShowConfigDescriptor instead')\nconst BuzzwordShowConfig$json = {\n  '1': 'BuzzwordShowConfig',\n  '2': [\n    {'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'schema', '3': 2, '4': 1, '5': 9, '10': 'schema'},\n    {'1': 'source', '3': 3, '4': 1, '5': 5, '10': 'source'},\n    {'1': 'id', '3': 4, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'buzzword_id', '3': 5, '4': 1, '5': 3, '10': 'buzzwordId'},\n    {'1': 'schema_type', '3': 6, '4': 1, '5': 5, '10': 'schemaType'},\n  ],\n};\n\n/// Descriptor for `BuzzwordShowConfig`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List buzzwordShowConfigDescriptor = $convert.base64Decode(\n    'ChJCdXp6d29yZFNob3dDb25maWcSEgoEbmFtZRgBIAEoCVIEbmFtZRIWCgZzY2hlbWEYAiABKA'\n    'lSBnNjaGVtYRIWCgZzb3VyY2UYAyABKAVSBnNvdXJjZRIOCgJpZBgEIAEoA1ICaWQSHwoLYnV6'\n    'endvcmRfaWQYBSABKANSCmJ1enp3b3JkSWQSHwoLc2NoZW1hX3R5cGUYBiABKAVSCnNjaGVtYV'\n    'R5cGU=');\n\n@$core.Deprecated('Use checkBoxDescriptor instead')\nconst CheckBox$json = {\n  '1': 'CheckBox',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {\n      '1': 'type',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.community.service.dm.v1.CheckboxType',\n      '10': 'type'\n    },\n    {'1': 'default_value', '3': 3, '4': 1, '5': 8, '10': 'defaultValue'},\n    {'1': 'show', '3': 4, '4': 1, '5': 8, '10': 'show'},\n  ],\n};\n\n/// Descriptor for `CheckBox`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List checkBoxDescriptor = $convert.base64Decode(\n    'CghDaGVja0JveBISCgR0ZXh0GAEgASgJUgR0ZXh0EkIKBHR5cGUYAiABKA4yLi5iaWxpYmlsaS'\n    '5jb21tdW5pdHkuc2VydmljZS5kbS52MS5DaGVja2JveFR5cGVSBHR5cGUSIwoNZGVmYXVsdF92'\n    'YWx1ZRgDIAEoCFIMZGVmYXVsdFZhbHVlEhIKBHNob3cYBCABKAhSBHNob3c=');\n\n@$core.Deprecated('Use checkBoxV2Descriptor instead')\nconst CheckBoxV2$json = {\n  '1': 'CheckBoxV2',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {\n      '1': 'type',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.community.service.dm.v1.CheckboxType',\n      '10': 'type'\n    },\n    {'1': 'default_value', '3': 3, '4': 1, '5': 8, '10': 'defaultValue'},\n  ],\n};\n\n/// Descriptor for `CheckBoxV2`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List checkBoxV2Descriptor = $convert.base64Decode(\n    'CgpDaGVja0JveFYyEhIKBHRleHQYASABKAlSBHRleHQSQgoEdHlwZRgCIAEoDjIuLmJpbGliaW'\n    'xpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkNoZWNrYm94VHlwZVIEdHlwZRIjCg1kZWZhdWx0'\n    'X3ZhbHVlGAMgASgIUgxkZWZhdWx0VmFsdWU=');\n\n@$core.Deprecated('Use clickButtonDescriptor instead')\nconst ClickButton$json = {\n  '1': 'ClickButton',\n  '2': [\n    {'1': 'portrait_text', '3': 1, '4': 3, '5': 9, '10': 'portraitText'},\n    {'1': 'landscape_text', '3': 2, '4': 3, '5': 9, '10': 'landscapeText'},\n    {\n      '1': 'portrait_text_focus',\n      '3': 3,\n      '4': 3,\n      '5': 9,\n      '10': 'portraitTextFocus'\n    },\n    {\n      '1': 'landscape_text_focus',\n      '3': 4,\n      '4': 3,\n      '5': 9,\n      '10': 'landscapeTextFocus'\n    },\n    {\n      '1': 'render_type',\n      '3': 5,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.community.service.dm.v1.RenderType',\n      '10': 'renderType'\n    },\n    {'1': 'show', '3': 6, '4': 1, '5': 8, '10': 'show'},\n    {\n      '1': 'bubble',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.Bubble',\n      '10': 'bubble'\n    },\n  ],\n};\n\n/// Descriptor for `ClickButton`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List clickButtonDescriptor = $convert.base64Decode(\n    'CgtDbGlja0J1dHRvbhIjCg1wb3J0cmFpdF90ZXh0GAEgAygJUgxwb3J0cmFpdFRleHQSJQoObG'\n    'FuZHNjYXBlX3RleHQYAiADKAlSDWxhbmRzY2FwZVRleHQSLgoTcG9ydHJhaXRfdGV4dF9mb2N1'\n    'cxgDIAMoCVIRcG9ydHJhaXRUZXh0Rm9jdXMSMAoUbGFuZHNjYXBlX3RleHRfZm9jdXMYBCADKA'\n    'lSEmxhbmRzY2FwZVRleHRGb2N1cxJNCgtyZW5kZXJfdHlwZRgFIAEoDjIsLmJpbGliaWxpLmNv'\n    'bW11bml0eS5zZXJ2aWNlLmRtLnYxLlJlbmRlclR5cGVSCnJlbmRlclR5cGUSEgoEc2hvdxgGIA'\n    'EoCFIEc2hvdxJACgZidWJibGUYByABKAsyKC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5k'\n    'bS52MS5CdWJibGVSBmJ1YmJsZQ==');\n\n@$core.Deprecated('Use clickButtonV2Descriptor instead')\nconst ClickButtonV2$json = {\n  '1': 'ClickButtonV2',\n  '2': [\n    {'1': 'portrait_text', '3': 1, '4': 3, '5': 9, '10': 'portraitText'},\n    {'1': 'landscape_text', '3': 2, '4': 3, '5': 9, '10': 'landscapeText'},\n    {\n      '1': 'portrait_text_focus',\n      '3': 3,\n      '4': 3,\n      '5': 9,\n      '10': 'portraitTextFocus'\n    },\n    {\n      '1': 'landscape_text_focus',\n      '3': 4,\n      '4': 3,\n      '5': 9,\n      '10': 'landscapeTextFocus'\n    },\n    {\n      '1': 'render_type',\n      '3': 5,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.community.service.dm.v1.RenderType',\n      '10': 'renderType'\n    },\n    {'1': 'text_input_post', '3': 6, '4': 1, '5': 8, '10': 'textInputPost'},\n    {'1': 'exposure_once', '3': 7, '4': 1, '5': 8, '10': 'exposureOnce'},\n    {\n      '1': 'exposure_type',\n      '3': 8,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.community.service.dm.v1.ExposureType',\n      '10': 'exposureType'\n    },\n  ],\n};\n\n/// Descriptor for `ClickButtonV2`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List clickButtonV2Descriptor = $convert.base64Decode(\n    'Cg1DbGlja0J1dHRvblYyEiMKDXBvcnRyYWl0X3RleHQYASADKAlSDHBvcnRyYWl0VGV4dBIlCg'\n    '5sYW5kc2NhcGVfdGV4dBgCIAMoCVINbGFuZHNjYXBlVGV4dBIuChNwb3J0cmFpdF90ZXh0X2Zv'\n    'Y3VzGAMgAygJUhFwb3J0cmFpdFRleHRGb2N1cxIwChRsYW5kc2NhcGVfdGV4dF9mb2N1cxgEIA'\n    'MoCVISbGFuZHNjYXBlVGV4dEZvY3VzEk0KC3JlbmRlcl90eXBlGAUgASgOMiwuYmlsaWJpbGku'\n    'Y29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUmVuZGVyVHlwZVIKcmVuZGVyVHlwZRImCg90ZXh0X2'\n    'lucHV0X3Bvc3QYBiABKAhSDXRleHRJbnB1dFBvc3QSIwoNZXhwb3N1cmVfb25jZRgHIAEoCFIM'\n    'ZXhwb3N1cmVPbmNlElMKDWV4cG9zdXJlX3R5cGUYCCABKA4yLi5iaWxpYmlsaS5jb21tdW5pdH'\n    'kuc2VydmljZS5kbS52MS5FeHBvc3VyZVR5cGVSDGV4cG9zdXJlVHlwZQ==');\n\n@$core.Deprecated('Use commandDescriptor instead')\nconst Command$json = {\n  '1': 'Command',\n  '2': [\n    {\n      '1': 'command_dms',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.CommandDm',\n      '10': 'commandDms'\n    },\n  ],\n};\n\n/// Descriptor for `Command`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List commandDescriptor = $convert.base64Decode(\n    'CgdDb21tYW5kEkwKC2NvbW1hbmRfZG1zGAEgAygLMisuYmlsaWJpbGkuY29tbXVuaXR5LnNlcn'\n    'ZpY2UuZG0udjEuQ29tbWFuZERtUgpjb21tYW5kRG1z');\n\n@$core.Deprecated('Use commandDmDescriptor instead')\nconst CommandDm$json = {\n  '1': 'CommandDm',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'oid', '3': 2, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'mid', '3': 3, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'command', '3': 4, '4': 1, '5': 9, '10': 'command'},\n    {'1': 'content', '3': 5, '4': 1, '5': 9, '10': 'content'},\n    {'1': 'progress', '3': 6, '4': 1, '5': 5, '10': 'progress'},\n    {'1': 'ctime', '3': 7, '4': 1, '5': 9, '10': 'ctime'},\n    {'1': 'mtime', '3': 8, '4': 1, '5': 9, '10': 'mtime'},\n    {'1': 'extra', '3': 9, '4': 1, '5': 9, '10': 'extra'},\n    {'1': 'idstr', '3': 10, '4': 1, '5': 9, '10': 'idstr'},\n    {'1': 'type', '3': 11, '4': 1, '5': 5, '10': 'type'},\n    {'1': 'auto_create', '3': 12, '4': 1, '5': 8, '10': 'autoCreate'},\n    {'1': 'count_down', '3': 13, '4': 1, '5': 5, '10': 'countDown'},\n    {'1': 'attr', '3': 14, '4': 1, '5': 5, '10': 'attr'},\n  ],\n};\n\n/// Descriptor for `CommandDm`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List commandDmDescriptor = $convert.base64Decode(\n    'CglDb21tYW5kRG0SDgoCaWQYASABKANSAmlkEhAKA29pZBgCIAEoA1IDb2lkEhAKA21pZBgDIA'\n    'EoA1IDbWlkEhgKB2NvbW1hbmQYBCABKAlSB2NvbW1hbmQSGAoHY29udGVudBgFIAEoCVIHY29u'\n    'dGVudBIaCghwcm9ncmVzcxgGIAEoBVIIcHJvZ3Jlc3MSFAoFY3RpbWUYByABKAlSBWN0aW1lEh'\n    'QKBW10aW1lGAggASgJUgVtdGltZRIUCgVleHRyYRgJIAEoCVIFZXh0cmESFAoFaWRzdHIYCiAB'\n    'KAlSBWlkc3RyEhIKBHR5cGUYCyABKAVSBHR5cGUSHwoLYXV0b19jcmVhdGUYDCABKAhSCmF1dG'\n    '9DcmVhdGUSHQoKY291bnRfZG93bhgNIAEoBVIJY291bnREb3duEhIKBGF0dHIYDiABKAVSBGF0'\n    'dHI=');\n\n@$core.Deprecated('Use danmakuAIFlagDescriptor instead')\nconst DanmakuAIFlag$json = {\n  '1': 'DanmakuAIFlag',\n  '2': [\n    {\n      '1': 'dm_flags',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.DanmakuFlag',\n      '10': 'dmFlags'\n    },\n  ],\n};\n\n/// Descriptor for `DanmakuAIFlag`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List danmakuAIFlagDescriptor = $convert.base64Decode(\n    'Cg1EYW5tYWt1QUlGbGFnEkgKCGRtX2ZsYWdzGAEgAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5Ln'\n    'NlcnZpY2UuZG0udjEuRGFubWFrdUZsYWdSB2RtRmxhZ3M=');\n\n@$core.Deprecated('Use danmakuElemDescriptor instead')\nconst DanmakuElem$json = {\n  '1': 'DanmakuElem',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'progress', '3': 2, '4': 1, '5': 5, '10': 'progress'},\n    {'1': 'mode', '3': 3, '4': 1, '5': 5, '10': 'mode'},\n    {'1': 'fontsize', '3': 4, '4': 1, '5': 5, '10': 'fontsize'},\n    {'1': 'color', '3': 5, '4': 1, '5': 13, '10': 'color'},\n    {'1': 'mid_hash', '3': 6, '4': 1, '5': 9, '10': 'midHash'},\n    {'1': 'content', '3': 7, '4': 1, '5': 9, '10': 'content'},\n    {'1': 'ctime', '3': 8, '4': 1, '5': 3, '10': 'ctime'},\n    {'1': 'weight', '3': 9, '4': 1, '5': 5, '10': 'weight'},\n    {'1': 'action', '3': 10, '4': 1, '5': 9, '10': 'action'},\n    {'1': 'pool', '3': 11, '4': 1, '5': 5, '10': 'pool'},\n    {'1': 'id_str', '3': 12, '4': 1, '5': 9, '10': 'idStr'},\n    {'1': 'attr', '3': 13, '4': 1, '5': 5, '10': 'attr'},\n    {'1': 'like', '3': 15, '4': 1, '5': 3, '10': 'like'},\n    {'1': 'animation', '3': 22, '4': 1, '5': 9, '10': 'animation'},\n    {'1': 'extra', '3': 23, '4': 1, '5': 9, '10': 'extra'},\n    {\n      '1': 'colorful',\n      '3': 24,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.community.service.dm.v1.DmColorfulType',\n      '10': 'colorful'\n    },\n    {'1': 'type', '3': 25, '4': 1, '5': 5, '10': 'type'},\n    {'1': 'oid', '3': 26, '4': 1, '5': 3, '10': 'oid'},\n    {\n      '1': 'dm_from',\n      '3': 27,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.community.service.dm.v1.DmFromType',\n      '10': 'dmFrom'\n    },\n    {'1': 'count', '3': 28, '4': 1, '5': 5, '10': 'count'},\n    {'1': 'is_self', '3': 29, '4': 1, '5': 8, '10': 'isSelf'},\n  ],\n};\n\n/// Descriptor for `DanmakuElem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List danmakuElemDescriptor = $convert.base64Decode(\n    'CgtEYW5tYWt1RWxlbRIOCgJpZBgBIAEoA1ICaWQSGgoIcHJvZ3Jlc3MYAiABKAVSCHByb2dyZX'\n    'NzEhIKBG1vZGUYAyABKAVSBG1vZGUSGgoIZm9udHNpemUYBCABKAVSCGZvbnRzaXplEhQKBWNv'\n    'bG9yGAUgASgNUgVjb2xvchIZCghtaWRfaGFzaBgGIAEoCVIHbWlkSGFzaBIYCgdjb250ZW50GA'\n    'cgASgJUgdjb250ZW50EhQKBWN0aW1lGAggASgDUgVjdGltZRIWCgZ3ZWlnaHQYCSABKAVSBndl'\n    'aWdodBIWCgZhY3Rpb24YCiABKAlSBmFjdGlvbhISCgRwb29sGAsgASgFUgRwb29sEhUKBmlkX3'\n    'N0chgMIAEoCVIFaWRTdHISEgoEYXR0chgNIAEoBVIEYXR0chISCgRsaWtlGA8gASgDUgRsaWtl'\n    'EhwKCWFuaW1hdGlvbhgWIAEoCVIJYW5pbWF0aW9uEhQKBWV4dHJhGBcgASgJUgVleHRyYRJMCg'\n    'hjb2xvcmZ1bBgYIAEoDjIwLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtQ29s'\n    'b3JmdWxUeXBlUghjb2xvcmZ1bBISCgR0eXBlGBkgASgFUgR0eXBlEhAKA29pZBgaIAEoA1IDb2'\n    'lkEkUKB2RtX2Zyb20YGyABKA4yLC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5E'\n    'bUZyb21UeXBlUgZkbUZyb20SFAoFY291bnQYHCABKAVSBWNvdW50EhcKB2lzX3NlbGYYHSABKA'\n    'hSBmlzU2VsZg==');\n\n@$core.Deprecated('Use danmakuFlagDescriptor instead')\nconst DanmakuFlag$json = {\n  '1': 'DanmakuFlag',\n  '2': [\n    {'1': 'dmid', '3': 1, '4': 1, '5': 3, '10': 'dmid'},\n    {'1': 'flag', '3': 2, '4': 1, '5': 5, '10': 'flag'},\n  ],\n};\n\n/// Descriptor for `DanmakuFlag`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List danmakuFlagDescriptor = $convert.base64Decode(\n    'CgtEYW5tYWt1RmxhZxISCgRkbWlkGAEgASgDUgRkbWlkEhIKBGZsYWcYAiABKAVSBGZsYWc=');\n\n@$core.Deprecated('Use danmakuFlagConfigDescriptor instead')\nconst DanmakuFlagConfig$json = {\n  '1': 'DanmakuFlagConfig',\n  '2': [\n    {'1': 'rec_flag', '3': 1, '4': 1, '5': 5, '10': 'recFlag'},\n    {'1': 'rec_text', '3': 2, '4': 1, '5': 9, '10': 'recText'},\n    {'1': 'rec_switch', '3': 3, '4': 1, '5': 5, '10': 'recSwitch'},\n  ],\n};\n\n/// Descriptor for `DanmakuFlagConfig`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List danmakuFlagConfigDescriptor = $convert.base64Decode(\n    'ChFEYW5tYWt1RmxhZ0NvbmZpZxIZCghyZWNfZmxhZxgBIAEoBVIHcmVjRmxhZxIZCghyZWNfdG'\n    'V4dBgCIAEoCVIHcmVjVGV4dBIdCgpyZWNfc3dpdGNoGAMgASgFUglyZWNTd2l0Y2g=');\n\n@$core.Deprecated('Use danmuDefaultPlayerConfigDescriptor instead')\nconst DanmuDefaultPlayerConfig$json = {\n  '1': 'DanmuDefaultPlayerConfig',\n  '2': [\n    {\n      '1': 'player_danmaku_use_default_config',\n      '3': 1,\n      '4': 1,\n      '5': 8,\n      '10': 'playerDanmakuUseDefaultConfig'\n    },\n    {\n      '1': 'player_danmaku_ai_recommended_switch',\n      '3': 4,\n      '4': 1,\n      '5': 8,\n      '10': 'playerDanmakuAiRecommendedSwitch'\n    },\n    {\n      '1': 'player_danmaku_ai_recommended_level',\n      '3': 5,\n      '4': 1,\n      '5': 5,\n      '10': 'playerDanmakuAiRecommendedLevel'\n    },\n    {\n      '1': 'player_danmaku_blocktop',\n      '3': 6,\n      '4': 1,\n      '5': 8,\n      '10': 'playerDanmakuBlocktop'\n    },\n    {\n      '1': 'player_danmaku_blockscroll',\n      '3': 7,\n      '4': 1,\n      '5': 8,\n      '10': 'playerDanmakuBlockscroll'\n    },\n    {\n      '1': 'player_danmaku_blockbottom',\n      '3': 8,\n      '4': 1,\n      '5': 8,\n      '10': 'playerDanmakuBlockbottom'\n    },\n    {\n      '1': 'player_danmaku_blockcolorful',\n      '3': 9,\n      '4': 1,\n      '5': 8,\n      '10': 'playerDanmakuBlockcolorful'\n    },\n    {\n      '1': 'player_danmaku_blockrepeat',\n      '3': 10,\n      '4': 1,\n      '5': 8,\n      '10': 'playerDanmakuBlockrepeat'\n    },\n    {\n      '1': 'player_danmaku_blockspecial',\n      '3': 11,\n      '4': 1,\n      '5': 8,\n      '10': 'playerDanmakuBlockspecial'\n    },\n    {\n      '1': 'player_danmaku_opacity',\n      '3': 12,\n      '4': 1,\n      '5': 2,\n      '10': 'playerDanmakuOpacity'\n    },\n    {\n      '1': 'player_danmaku_scalingfactor',\n      '3': 13,\n      '4': 1,\n      '5': 2,\n      '10': 'playerDanmakuScalingfactor'\n    },\n    {\n      '1': 'player_danmaku_domain',\n      '3': 14,\n      '4': 1,\n      '5': 2,\n      '10': 'playerDanmakuDomain'\n    },\n    {\n      '1': 'player_danmaku_speed',\n      '3': 15,\n      '4': 1,\n      '5': 5,\n      '10': 'playerDanmakuSpeed'\n    },\n    {\n      '1': 'inline_player_danmaku_switch',\n      '3': 16,\n      '4': 1,\n      '5': 8,\n      '10': 'inlinePlayerDanmakuSwitch'\n    },\n    {\n      '1': 'player_danmaku_senior_mode_switch',\n      '3': 17,\n      '4': 1,\n      '5': 5,\n      '10': 'playerDanmakuSeniorModeSwitch'\n    },\n    {\n      '1': 'player_danmaku_ai_recommended_level_v2',\n      '3': 18,\n      '4': 1,\n      '5': 5,\n      '10': 'playerDanmakuAiRecommendedLevelV2'\n    },\n    {\n      '1': 'player_danmaku_ai_recommended_level_v2_map',\n      '3': 19,\n      '4': 3,\n      '5': 11,\n      '6':\n          '.bilibili.community.service.dm.v1.DanmuDefaultPlayerConfig.PlayerDanmakuAiRecommendedLevelV2MapEntry',\n      '10': 'playerDanmakuAiRecommendedLevelV2Map'\n    },\n    {\n      '1': 'player_danmaku_enable_herd_dm',\n      '3': 20,\n      '4': 1,\n      '5': 8,\n      '10': 'playerDanmakuEnableHerdDm'\n    },\n  ],\n  '3': [\n    DanmuDefaultPlayerConfig_PlayerDanmakuAiRecommendedLevelV2MapEntry$json\n  ],\n};\n\n@$core.Deprecated('Use danmuDefaultPlayerConfigDescriptor instead')\nconst DanmuDefaultPlayerConfig_PlayerDanmakuAiRecommendedLevelV2MapEntry$json =\n    {\n  '1': 'PlayerDanmakuAiRecommendedLevelV2MapEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 5, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 5, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `DanmuDefaultPlayerConfig`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List danmuDefaultPlayerConfigDescriptor = $convert.base64Decode(\n    'ChhEYW5tdURlZmF1bHRQbGF5ZXJDb25maWcSSAohcGxheWVyX2Rhbm1ha3VfdXNlX2RlZmF1bH'\n    'RfY29uZmlnGAEgASgIUh1wbGF5ZXJEYW5tYWt1VXNlRGVmYXVsdENvbmZpZxJOCiRwbGF5ZXJf'\n    'ZGFubWFrdV9haV9yZWNvbW1lbmRlZF9zd2l0Y2gYBCABKAhSIHBsYXllckRhbm1ha3VBaVJlY2'\n    '9tbWVuZGVkU3dpdGNoEkwKI3BsYXllcl9kYW5tYWt1X2FpX3JlY29tbWVuZGVkX2xldmVsGAUg'\n    'ASgFUh9wbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZExldmVsEjYKF3BsYXllcl9kYW5tYWt1X2'\n    'Jsb2NrdG9wGAYgASgIUhVwbGF5ZXJEYW5tYWt1QmxvY2t0b3ASPAoacGxheWVyX2Rhbm1ha3Vf'\n    'YmxvY2tzY3JvbGwYByABKAhSGHBsYXllckRhbm1ha3VCbG9ja3Njcm9sbBI8ChpwbGF5ZXJfZG'\n    'FubWFrdV9ibG9ja2JvdHRvbRgIIAEoCFIYcGxheWVyRGFubWFrdUJsb2NrYm90dG9tEkAKHHBs'\n    'YXllcl9kYW5tYWt1X2Jsb2NrY29sb3JmdWwYCSABKAhSGnBsYXllckRhbm1ha3VCbG9ja2NvbG'\n    '9yZnVsEjwKGnBsYXllcl9kYW5tYWt1X2Jsb2NrcmVwZWF0GAogASgIUhhwbGF5ZXJEYW5tYWt1'\n    'QmxvY2tyZXBlYXQSPgobcGxheWVyX2Rhbm1ha3VfYmxvY2tzcGVjaWFsGAsgASgIUhlwbGF5ZX'\n    'JEYW5tYWt1QmxvY2tzcGVjaWFsEjQKFnBsYXllcl9kYW5tYWt1X29wYWNpdHkYDCABKAJSFHBs'\n    'YXllckRhbm1ha3VPcGFjaXR5EkAKHHBsYXllcl9kYW5tYWt1X3NjYWxpbmdmYWN0b3IYDSABKA'\n    'JSGnBsYXllckRhbm1ha3VTY2FsaW5nZmFjdG9yEjIKFXBsYXllcl9kYW5tYWt1X2RvbWFpbhgO'\n    'IAEoAlITcGxheWVyRGFubWFrdURvbWFpbhIwChRwbGF5ZXJfZGFubWFrdV9zcGVlZBgPIAEoBV'\n    'IScGxheWVyRGFubWFrdVNwZWVkEj8KHGlubGluZV9wbGF5ZXJfZGFubWFrdV9zd2l0Y2gYECAB'\n    'KAhSGWlubGluZVBsYXllckRhbm1ha3VTd2l0Y2gSSAohcGxheWVyX2Rhbm1ha3Vfc2VuaW9yX2'\n    '1vZGVfc3dpdGNoGBEgASgFUh1wbGF5ZXJEYW5tYWt1U2VuaW9yTW9kZVN3aXRjaBJRCiZwbGF5'\n    'ZXJfZGFubWFrdV9haV9yZWNvbW1lbmRlZF9sZXZlbF92MhgSIAEoBVIhcGxheWVyRGFubWFrdU'\n    'FpUmVjb21tZW5kZWRMZXZlbFYyEr4BCipwbGF5ZXJfZGFubWFrdV9haV9yZWNvbW1lbmRlZF9s'\n    'ZXZlbF92Ml9tYXAYEyADKAsyZC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW'\n    '5tdURlZmF1bHRQbGF5ZXJDb25maWcuUGxheWVyRGFubWFrdUFpUmVjb21tZW5kZWRMZXZlbFYy'\n    'TWFwRW50cnlSJHBsYXllckRhbm1ha3VBaVJlY29tbWVuZGVkTGV2ZWxWMk1hcBJACh1wbGF5ZX'\n    'JfZGFubWFrdV9lbmFibGVfaGVyZF9kbRgUIAEoCFIZcGxheWVyRGFubWFrdUVuYWJsZUhlcmRE'\n    'bRpXCilQbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZExldmVsVjJNYXBFbnRyeRIQCgNrZXkYAS'\n    'ABKAVSA2tleRIUCgV2YWx1ZRgCIAEoBVIFdmFsdWU6AjgB');\n\n@$core.Deprecated('Use danmuPlayerConfigDescriptor instead')\nconst DanmuPlayerConfig$json = {\n  '1': 'DanmuPlayerConfig',\n  '2': [\n    {\n      '1': 'player_danmaku_switch',\n      '3': 1,\n      '4': 1,\n      '5': 8,\n      '10': 'playerDanmakuSwitch'\n    },\n    {\n      '1': 'player_danmaku_switch_save',\n      '3': 2,\n      '4': 1,\n      '5': 8,\n      '10': 'playerDanmakuSwitchSave'\n    },\n    {\n      '1': 'player_danmaku_use_default_config',\n      '3': 3,\n      '4': 1,\n      '5': 8,\n      '10': 'playerDanmakuUseDefaultConfig'\n    },\n    {\n      '1': 'player_danmaku_ai_recommended_switch',\n      '3': 4,\n      '4': 1,\n      '5': 8,\n      '10': 'playerDanmakuAiRecommendedSwitch'\n    },\n    {\n      '1': 'player_danmaku_ai_recommended_level',\n      '3': 5,\n      '4': 1,\n      '5': 5,\n      '10': 'playerDanmakuAiRecommendedLevel'\n    },\n    {\n      '1': 'player_danmaku_blocktop',\n      '3': 6,\n      '4': 1,\n      '5': 8,\n      '10': 'playerDanmakuBlocktop'\n    },\n    {\n      '1': 'player_danmaku_blockscroll',\n      '3': 7,\n      '4': 1,\n      '5': 8,\n      '10': 'playerDanmakuBlockscroll'\n    },\n    {\n      '1': 'player_danmaku_blockbottom',\n      '3': 8,\n      '4': 1,\n      '5': 8,\n      '10': 'playerDanmakuBlockbottom'\n    },\n    {\n      '1': 'player_danmaku_blockcolorful',\n      '3': 9,\n      '4': 1,\n      '5': 8,\n      '10': 'playerDanmakuBlockcolorful'\n    },\n    {\n      '1': 'player_danmaku_blockrepeat',\n      '3': 10,\n      '4': 1,\n      '5': 8,\n      '10': 'playerDanmakuBlockrepeat'\n    },\n    {\n      '1': 'player_danmaku_blockspecial',\n      '3': 11,\n      '4': 1,\n      '5': 8,\n      '10': 'playerDanmakuBlockspecial'\n    },\n    {\n      '1': 'player_danmaku_opacity',\n      '3': 12,\n      '4': 1,\n      '5': 2,\n      '10': 'playerDanmakuOpacity'\n    },\n    {\n      '1': 'player_danmaku_scalingfactor',\n      '3': 13,\n      '4': 1,\n      '5': 2,\n      '10': 'playerDanmakuScalingfactor'\n    },\n    {\n      '1': 'player_danmaku_domain',\n      '3': 14,\n      '4': 1,\n      '5': 2,\n      '10': 'playerDanmakuDomain'\n    },\n    {\n      '1': 'player_danmaku_speed',\n      '3': 15,\n      '4': 1,\n      '5': 5,\n      '10': 'playerDanmakuSpeed'\n    },\n    {\n      '1': 'player_danmaku_enableblocklist',\n      '3': 16,\n      '4': 1,\n      '5': 8,\n      '10': 'playerDanmakuEnableblocklist'\n    },\n    {\n      '1': 'inline_player_danmaku_switch',\n      '3': 17,\n      '4': 1,\n      '5': 8,\n      '10': 'inlinePlayerDanmakuSwitch'\n    },\n    {\n      '1': 'inline_player_danmaku_config',\n      '3': 18,\n      '4': 1,\n      '5': 5,\n      '10': 'inlinePlayerDanmakuConfig'\n    },\n    {\n      '1': 'player_danmaku_ios_switch_save',\n      '3': 19,\n      '4': 1,\n      '5': 5,\n      '10': 'playerDanmakuIosSwitchSave'\n    },\n    {\n      '1': 'player_danmaku_senior_mode_switch',\n      '3': 20,\n      '4': 1,\n      '5': 5,\n      '10': 'playerDanmakuSeniorModeSwitch'\n    },\n    {\n      '1': 'player_danmaku_ai_recommended_level_v2',\n      '3': 21,\n      '4': 1,\n      '5': 5,\n      '10': 'playerDanmakuAiRecommendedLevelV2'\n    },\n    {\n      '1': 'player_danmaku_ai_recommended_level_v2_map',\n      '3': 22,\n      '4': 3,\n      '5': 11,\n      '6':\n          '.bilibili.community.service.dm.v1.DanmuPlayerConfig.PlayerDanmakuAiRecommendedLevelV2MapEntry',\n      '10': 'playerDanmakuAiRecommendedLevelV2Map'\n    },\n    {\n      '1': 'player_danmaku_enable_herd_dm',\n      '3': 23,\n      '4': 1,\n      '5': 8,\n      '10': 'playerDanmakuEnableHerdDm'\n    },\n    {\n      '1': 'player_danmaku_blocktop_bottom',\n      '3': 24,\n      '4': 1,\n      '5': 8,\n      '10': 'playerDanmakuBlocktopBottom'\n    },\n    {\n      '1': 'player_danmaku_domain_v2',\n      '3': 25,\n      '4': 1,\n      '5': 5,\n      '10': 'playerDanmakuDomainV2'\n    },\n    {\n      '1': 'player_danmaku_density',\n      '3': 26,\n      '4': 1,\n      '5': 5,\n      '10': 'playerDanmakuDensity'\n    },\n    {\n      '1': 'player_danmaku_subtitle_proof',\n      '3': 27,\n      '4': 1,\n      '5': 8,\n      '10': 'playerDanmakuSubtitleProof'\n    },\n    {\n      '1': 'player_danmaku_people_proof',\n      '3': 28,\n      '4': 1,\n      '5': 8,\n      '10': 'playerDanmakuPeopleProof'\n    },\n  ],\n  '3': [DanmuPlayerConfig_PlayerDanmakuAiRecommendedLevelV2MapEntry$json],\n};\n\n@$core.Deprecated('Use danmuPlayerConfigDescriptor instead')\nconst DanmuPlayerConfig_PlayerDanmakuAiRecommendedLevelV2MapEntry$json = {\n  '1': 'PlayerDanmakuAiRecommendedLevelV2MapEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 5, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 5, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `DanmuPlayerConfig`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List danmuPlayerConfigDescriptor = $convert.base64Decode(\n    'ChFEYW5tdVBsYXllckNvbmZpZxIyChVwbGF5ZXJfZGFubWFrdV9zd2l0Y2gYASABKAhSE3BsYX'\n    'llckRhbm1ha3VTd2l0Y2gSOwoacGxheWVyX2Rhbm1ha3Vfc3dpdGNoX3NhdmUYAiABKAhSF3Bs'\n    'YXllckRhbm1ha3VTd2l0Y2hTYXZlEkgKIXBsYXllcl9kYW5tYWt1X3VzZV9kZWZhdWx0X2Nvbm'\n    'ZpZxgDIAEoCFIdcGxheWVyRGFubWFrdVVzZURlZmF1bHRDb25maWcSTgokcGxheWVyX2Rhbm1h'\n    'a3VfYWlfcmVjb21tZW5kZWRfc3dpdGNoGAQgASgIUiBwbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbm'\n    'RlZFN3aXRjaBJMCiNwbGF5ZXJfZGFubWFrdV9haV9yZWNvbW1lbmRlZF9sZXZlbBgFIAEoBVIf'\n    'cGxheWVyRGFubWFrdUFpUmVjb21tZW5kZWRMZXZlbBI2ChdwbGF5ZXJfZGFubWFrdV9ibG9ja3'\n    'RvcBgGIAEoCFIVcGxheWVyRGFubWFrdUJsb2NrdG9wEjwKGnBsYXllcl9kYW5tYWt1X2Jsb2Nr'\n    'c2Nyb2xsGAcgASgIUhhwbGF5ZXJEYW5tYWt1QmxvY2tzY3JvbGwSPAoacGxheWVyX2Rhbm1ha3'\n    'VfYmxvY2tib3R0b20YCCABKAhSGHBsYXllckRhbm1ha3VCbG9ja2JvdHRvbRJAChxwbGF5ZXJf'\n    'ZGFubWFrdV9ibG9ja2NvbG9yZnVsGAkgASgIUhpwbGF5ZXJEYW5tYWt1QmxvY2tjb2xvcmZ1bB'\n    'I8ChpwbGF5ZXJfZGFubWFrdV9ibG9ja3JlcGVhdBgKIAEoCFIYcGxheWVyRGFubWFrdUJsb2Nr'\n    'cmVwZWF0Ej4KG3BsYXllcl9kYW5tYWt1X2Jsb2Nrc3BlY2lhbBgLIAEoCFIZcGxheWVyRGFubW'\n    'FrdUJsb2Nrc3BlY2lhbBI0ChZwbGF5ZXJfZGFubWFrdV9vcGFjaXR5GAwgASgCUhRwbGF5ZXJE'\n    'YW5tYWt1T3BhY2l0eRJAChxwbGF5ZXJfZGFubWFrdV9zY2FsaW5nZmFjdG9yGA0gASgCUhpwbG'\n    'F5ZXJEYW5tYWt1U2NhbGluZ2ZhY3RvchIyChVwbGF5ZXJfZGFubWFrdV9kb21haW4YDiABKAJS'\n    'E3BsYXllckRhbm1ha3VEb21haW4SMAoUcGxheWVyX2Rhbm1ha3Vfc3BlZWQYDyABKAVSEnBsYX'\n    'llckRhbm1ha3VTcGVlZBJECh5wbGF5ZXJfZGFubWFrdV9lbmFibGVibG9ja2xpc3QYECABKAhS'\n    'HHBsYXllckRhbm1ha3VFbmFibGVibG9ja2xpc3QSPwocaW5saW5lX3BsYXllcl9kYW5tYWt1X3'\n    'N3aXRjaBgRIAEoCFIZaW5saW5lUGxheWVyRGFubWFrdVN3aXRjaBI/ChxpbmxpbmVfcGxheWVy'\n    'X2Rhbm1ha3VfY29uZmlnGBIgASgFUhlpbmxpbmVQbGF5ZXJEYW5tYWt1Q29uZmlnEkIKHnBsYX'\n    'llcl9kYW5tYWt1X2lvc19zd2l0Y2hfc2F2ZRgTIAEoBVIacGxheWVyRGFubWFrdUlvc1N3aXRj'\n    'aFNhdmUSSAohcGxheWVyX2Rhbm1ha3Vfc2VuaW9yX21vZGVfc3dpdGNoGBQgASgFUh1wbGF5ZX'\n    'JEYW5tYWt1U2VuaW9yTW9kZVN3aXRjaBJRCiZwbGF5ZXJfZGFubWFrdV9haV9yZWNvbW1lbmRl'\n    'ZF9sZXZlbF92MhgVIAEoBVIhcGxheWVyRGFubWFrdUFpUmVjb21tZW5kZWRMZXZlbFYyErcBCi'\n    'pwbGF5ZXJfZGFubWFrdV9haV9yZWNvbW1lbmRlZF9sZXZlbF92Ml9tYXAYFiADKAsyXS5iaWxp'\n    'YmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tdVBsYXllckNvbmZpZy5QbGF5ZXJEYW'\n    '5tYWt1QWlSZWNvbW1lbmRlZExldmVsVjJNYXBFbnRyeVIkcGxheWVyRGFubWFrdUFpUmVjb21t'\n    'ZW5kZWRMZXZlbFYyTWFwEkAKHXBsYXllcl9kYW5tYWt1X2VuYWJsZV9oZXJkX2RtGBcgASgIUh'\n    'lwbGF5ZXJEYW5tYWt1RW5hYmxlSGVyZERtEkMKHnBsYXllcl9kYW5tYWt1X2Jsb2NrdG9wX2Jv'\n    'dHRvbRgYIAEoCFIbcGxheWVyRGFubWFrdUJsb2NrdG9wQm90dG9tEjcKGHBsYXllcl9kYW5tYW'\n    't1X2RvbWFpbl92MhgZIAEoBVIVcGxheWVyRGFubWFrdURvbWFpblYyEjQKFnBsYXllcl9kYW5t'\n    'YWt1X2RlbnNpdHkYGiABKAVSFHBsYXllckRhbm1ha3VEZW5zaXR5EkEKHXBsYXllcl9kYW5tYW'\n    't1X3N1YnRpdGxlX3Byb29mGBsgASgIUhpwbGF5ZXJEYW5tYWt1U3VidGl0bGVQcm9vZhI9Chtw'\n    'bGF5ZXJfZGFubWFrdV9wZW9wbGVfcHJvb2YYHCABKAhSGHBsYXllckRhbm1ha3VQZW9wbGVQcm'\n    '9vZhpXCilQbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZExldmVsVjJNYXBFbnRyeRIQCgNrZXkY'\n    'ASABKAVSA2tleRIUCgV2YWx1ZRgCIAEoBVIFdmFsdWU6AjgB');\n\n@$core.Deprecated('Use danmuPlayerConfigPanelDescriptor instead')\nconst DanmuPlayerConfigPanel$json = {\n  '1': 'DanmuPlayerConfigPanel',\n  '2': [\n    {'1': 'selection_text', '3': 1, '4': 1, '5': 9, '10': 'selectionText'},\n  ],\n};\n\n/// Descriptor for `DanmuPlayerConfigPanel`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List danmuPlayerConfigPanelDescriptor =\n    $convert.base64Decode(\n        'ChZEYW5tdVBsYXllckNvbmZpZ1BhbmVsEiUKDnNlbGVjdGlvbl90ZXh0GAEgASgJUg1zZWxlY3'\n        'Rpb25UZXh0');\n\n@$core.Deprecated('Use danmuPlayerDynamicConfigDescriptor instead')\nconst DanmuPlayerDynamicConfig$json = {\n  '1': 'DanmuPlayerDynamicConfig',\n  '2': [\n    {'1': 'progress', '3': 1, '4': 1, '5': 5, '10': 'progress'},\n    {\n      '1': 'player_danmaku_domain',\n      '3': 14,\n      '4': 1,\n      '5': 2,\n      '10': 'playerDanmakuDomain'\n    },\n  ],\n};\n\n/// Descriptor for `DanmuPlayerDynamicConfig`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List danmuPlayerDynamicConfigDescriptor =\n    $convert.base64Decode(\n        'ChhEYW5tdVBsYXllckR5bmFtaWNDb25maWcSGgoIcHJvZ3Jlc3MYASABKAVSCHByb2dyZXNzEj'\n        'IKFXBsYXllcl9kYW5tYWt1X2RvbWFpbhgOIAEoAlITcGxheWVyRGFubWFrdURvbWFpbg==');\n\n@$core.Deprecated('Use danmuPlayerViewConfigDescriptor instead')\nconst DanmuPlayerViewConfig$json = {\n  '1': 'DanmuPlayerViewConfig',\n  '2': [\n    {\n      '1': 'danmuku_default_player_config',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.DanmuDefaultPlayerConfig',\n      '10': 'danmukuDefaultPlayerConfig'\n    },\n    {\n      '1': 'danmuku_player_config',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.DanmuPlayerConfig',\n      '10': 'danmukuPlayerConfig'\n    },\n    {\n      '1': 'danmuku_player_dynamic_config',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.DanmuPlayerDynamicConfig',\n      '10': 'danmukuPlayerDynamicConfig'\n    },\n    {\n      '1': 'danmuku_player_config_panel',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.DanmuPlayerConfigPanel',\n      '10': 'danmukuPlayerConfigPanel'\n    },\n  ],\n};\n\n/// Descriptor for `DanmuPlayerViewConfig`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List danmuPlayerViewConfigDescriptor = $convert.base64Decode(\n    'ChVEYW5tdVBsYXllclZpZXdDb25maWcSfQodZGFubXVrdV9kZWZhdWx0X3BsYXllcl9jb25maW'\n    'cYASABKAsyOi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tdURlZmF1bHRQ'\n    'bGF5ZXJDb25maWdSGmRhbm11a3VEZWZhdWx0UGxheWVyQ29uZmlnEmcKFWRhbm11a3VfcGxheW'\n    'VyX2NvbmZpZxgCIAEoCzIzLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRhbm11'\n    'UGxheWVyQ29uZmlnUhNkYW5tdWt1UGxheWVyQ29uZmlnEn0KHWRhbm11a3VfcGxheWVyX2R5bm'\n    'FtaWNfY29uZmlnGAMgAygLMjouYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFu'\n    'bXVQbGF5ZXJEeW5hbWljQ29uZmlnUhpkYW5tdWt1UGxheWVyRHluYW1pY0NvbmZpZxJ3ChtkYW'\n    '5tdWt1X3BsYXllcl9jb25maWdfcGFuZWwYBCABKAsyOC5iaWxpYmlsaS5jb21tdW5pdHkuc2Vy'\n    'dmljZS5kbS52MS5EYW5tdVBsYXllckNvbmZpZ1BhbmVsUhhkYW5tdWt1UGxheWVyQ29uZmlnUG'\n    'FuZWw=');\n\n@$core.Deprecated('Use danmuWebPlayerConfigDescriptor instead')\nconst DanmuWebPlayerConfig$json = {\n  '1': 'DanmuWebPlayerConfig',\n  '2': [\n    {'1': 'dm_switch', '3': 1, '4': 1, '5': 8, '10': 'dmSwitch'},\n    {'1': 'ai_switch', '3': 2, '4': 1, '5': 8, '10': 'aiSwitch'},\n    {'1': 'ai_level', '3': 3, '4': 1, '5': 5, '10': 'aiLevel'},\n    {'1': 'blocktop', '3': 4, '4': 1, '5': 8, '10': 'blocktop'},\n    {'1': 'blockscroll', '3': 5, '4': 1, '5': 8, '10': 'blockscroll'},\n    {'1': 'blockbottom', '3': 6, '4': 1, '5': 8, '10': 'blockbottom'},\n    {'1': 'blockcolor', '3': 7, '4': 1, '5': 8, '10': 'blockcolor'},\n    {'1': 'blockspecial', '3': 8, '4': 1, '5': 8, '10': 'blockspecial'},\n    {'1': 'preventshade', '3': 9, '4': 1, '5': 8, '10': 'preventshade'},\n    {'1': 'dmask', '3': 10, '4': 1, '5': 8, '10': 'dmask'},\n    {'1': 'opacity', '3': 11, '4': 1, '5': 2, '10': 'opacity'},\n    {'1': 'dmarea', '3': 12, '4': 1, '5': 5, '10': 'dmarea'},\n    {'1': 'speedplus', '3': 13, '4': 1, '5': 2, '10': 'speedplus'},\n    {'1': 'fontsize', '3': 14, '4': 1, '5': 2, '10': 'fontsize'},\n    {'1': 'screensync', '3': 15, '4': 1, '5': 8, '10': 'screensync'},\n    {'1': 'speedsync', '3': 16, '4': 1, '5': 8, '10': 'speedsync'},\n    {'1': 'fontfamily', '3': 17, '4': 1, '5': 9, '10': 'fontfamily'},\n    {'1': 'bold', '3': 18, '4': 1, '5': 8, '10': 'bold'},\n    {'1': 'fontborder', '3': 19, '4': 1, '5': 5, '10': 'fontborder'},\n    {'1': 'draw_type', '3': 20, '4': 1, '5': 9, '10': 'drawType'},\n    {\n      '1': 'senior_mode_switch',\n      '3': 21,\n      '4': 1,\n      '5': 5,\n      '10': 'seniorModeSwitch'\n    },\n    {'1': 'ai_level_v2', '3': 22, '4': 1, '5': 5, '10': 'aiLevelV2'},\n    {\n      '1': 'ai_level_v2_map',\n      '3': 23,\n      '4': 3,\n      '5': 11,\n      '6':\n          '.bilibili.community.service.dm.v1.DanmuWebPlayerConfig.AiLevelV2MapEntry',\n      '10': 'aiLevelV2Map'\n    },\n    {'1': 'blocktop_bottom', '3': 24, '4': 1, '5': 8, '10': 'blocktopBottom'},\n    {'1': 'dm_area_v2', '3': 25, '4': 1, '5': 5, '10': 'dmAreaV2'},\n    {'1': 'dm_density', '3': 26, '4': 1, '5': 5, '10': 'dmDensity'},\n  ],\n  '3': [DanmuWebPlayerConfig_AiLevelV2MapEntry$json],\n};\n\n@$core.Deprecated('Use danmuWebPlayerConfigDescriptor instead')\nconst DanmuWebPlayerConfig_AiLevelV2MapEntry$json = {\n  '1': 'AiLevelV2MapEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 5, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 5, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `DanmuWebPlayerConfig`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List danmuWebPlayerConfigDescriptor = $convert.base64Decode(\n    'ChREYW5tdVdlYlBsYXllckNvbmZpZxIbCglkbV9zd2l0Y2gYASABKAhSCGRtU3dpdGNoEhsKCW'\n    'FpX3N3aXRjaBgCIAEoCFIIYWlTd2l0Y2gSGQoIYWlfbGV2ZWwYAyABKAVSB2FpTGV2ZWwSGgoI'\n    'YmxvY2t0b3AYBCABKAhSCGJsb2NrdG9wEiAKC2Jsb2Nrc2Nyb2xsGAUgASgIUgtibG9ja3Njcm'\n    '9sbBIgCgtibG9ja2JvdHRvbRgGIAEoCFILYmxvY2tib3R0b20SHgoKYmxvY2tjb2xvchgHIAEo'\n    'CFIKYmxvY2tjb2xvchIiCgxibG9ja3NwZWNpYWwYCCABKAhSDGJsb2Nrc3BlY2lhbBIiCgxwcm'\n    'V2ZW50c2hhZGUYCSABKAhSDHByZXZlbnRzaGFkZRIUCgVkbWFzaxgKIAEoCFIFZG1hc2sSGAoH'\n    'b3BhY2l0eRgLIAEoAlIHb3BhY2l0eRIWCgZkbWFyZWEYDCABKAVSBmRtYXJlYRIcCglzcGVlZH'\n    'BsdXMYDSABKAJSCXNwZWVkcGx1cxIaCghmb250c2l6ZRgOIAEoAlIIZm9udHNpemUSHgoKc2Ny'\n    'ZWVuc3luYxgPIAEoCFIKc2NyZWVuc3luYxIcCglzcGVlZHN5bmMYECABKAhSCXNwZWVkc3luYx'\n    'IeCgpmb250ZmFtaWx5GBEgASgJUgpmb250ZmFtaWx5EhIKBGJvbGQYEiABKAhSBGJvbGQSHgoK'\n    'Zm9udGJvcmRlchgTIAEoBVIKZm9udGJvcmRlchIbCglkcmF3X3R5cGUYFCABKAlSCGRyYXdUeX'\n    'BlEiwKEnNlbmlvcl9tb2RlX3N3aXRjaBgVIAEoBVIQc2VuaW9yTW9kZVN3aXRjaBIeCgthaV9s'\n    'ZXZlbF92MhgWIAEoBVIJYWlMZXZlbFYyEm8KD2FpX2xldmVsX3YyX21hcBgXIAMoCzJILmJpbG'\n    'liaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRhbm11V2ViUGxheWVyQ29uZmlnLkFpTGV2'\n    'ZWxWMk1hcEVudHJ5UgxhaUxldmVsVjJNYXASJwoPYmxvY2t0b3BfYm90dG9tGBggASgIUg5ibG'\n    '9ja3RvcEJvdHRvbRIcCgpkbV9hcmVhX3YyGBkgASgFUghkbUFyZWFWMhIdCgpkbV9kZW5zaXR5'\n    'GBogASgFUglkbURlbnNpdHkaPwoRQWlMZXZlbFYyTWFwRW50cnkSEAoDa2V5GAEgASgFUgNrZX'\n    'kSFAoFdmFsdWUYAiABKAVSBXZhbHVlOgI4AQ==');\n\n@$core.Deprecated('Use dmColorfulDescriptor instead')\nconst DmColorful$json = {\n  '1': 'DmColorful',\n  '2': [\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.community.service.dm.v1.DmColorfulType',\n      '10': 'type'\n    },\n    {'1': 'src', '3': 2, '4': 1, '5': 9, '10': 'src'},\n  ],\n};\n\n/// Descriptor for `DmColorful`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dmColorfulDescriptor = $convert.base64Decode(\n    'CgpEbUNvbG9yZnVsEkQKBHR5cGUYASABKA4yMC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS'\n    '5kbS52MS5EbUNvbG9yZnVsVHlwZVIEdHlwZRIQCgNzcmMYAiABKAlSA3NyYw==');\n\n@$core.Deprecated('Use dmExpoReportReqDescriptor instead')\nconst DmExpoReportReq$json = {\n  '1': 'DmExpoReportReq',\n  '2': [\n    {'1': 'session_id', '3': 1, '4': 1, '5': 9, '10': 'sessionId'},\n    {'1': 'oid', '3': 2, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'dmids', '3': 3, '4': 1, '5': 12, '10': 'dmids'},\n    {'1': 'spmid', '3': 4, '4': 1, '5': 9, '10': 'spmid'},\n  ],\n};\n\n/// Descriptor for `DmExpoReportReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dmExpoReportReqDescriptor = $convert.base64Decode(\n    'Cg9EbUV4cG9SZXBvcnRSZXESHQoKc2Vzc2lvbl9pZBgBIAEoCVIJc2Vzc2lvbklkEhAKA29pZB'\n    'gCIAEoA1IDb2lkEhQKBWRtaWRzGAMgASgMUgVkbWlkcxIUCgVzcG1pZBgEIAEoCVIFc3BtaWQ=');\n\n@$core.Deprecated('Use dmExpoReportResDescriptor instead')\nconst DmExpoReportRes$json = {\n  '1': 'DmExpoReportRes',\n};\n\n/// Descriptor for `DmExpoReportRes`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dmExpoReportResDescriptor =\n    $convert.base64Decode('Cg9EbUV4cG9SZXBvcnRSZXM=');\n\n@$core.Deprecated('Use dmHerdViewDescriptor instead')\nconst DmHerdView$json = {\n  '1': 'DmHerdView',\n  '2': [\n    {\n      '1': 'display_herd_dm_num',\n      '3': 1,\n      '4': 1,\n      '5': 5,\n      '10': 'displayHerdDmNum'\n    },\n    {\n      '1': 'herd_dms',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.ViewHerdDmElem',\n      '10': 'herdDms'\n    },\n  ],\n};\n\n/// Descriptor for `DmHerdView`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dmHerdViewDescriptor = $convert.base64Decode(\n    'CgpEbUhlcmRWaWV3Ei0KE2Rpc3BsYXlfaGVyZF9kbV9udW0YASABKAVSEGRpc3BsYXlIZXJkRG'\n    '1OdW0SSwoIaGVyZF9kbXMYAiADKAsyMC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52'\n    'MS5WaWV3SGVyZERtRWxlbVIHaGVyZERtcw==');\n\n@$core.Deprecated('Use dmMaskWallDescriptor instead')\nconst DmMaskWall$json = {\n  '1': 'DmMaskWall',\n  '2': [\n    {'1': 'start', '3': 1, '4': 1, '5': 3, '10': 'start'},\n    {'1': 'end', '3': 2, '4': 1, '5': 3, '10': 'end'},\n    {'1': 'content', '3': 3, '4': 1, '5': 9, '10': 'content'},\n    {\n      '1': 'content_type',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.community.service.dm.v1.DmMaskWallContentType',\n      '10': 'contentType'\n    },\n    {\n      '1': 'biz_type',\n      '3': 5,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.community.service.dm.v1.DmMaskWallBizType',\n      '10': 'bizType'\n    },\n    {\n      '1': 'contents',\n      '3': 6,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.DmMaskWallContent',\n      '10': 'contents'\n    },\n  ],\n};\n\n/// Descriptor for `DmMaskWall`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dmMaskWallDescriptor = $convert.base64Decode(\n    'CgpEbU1hc2tXYWxsEhQKBXN0YXJ0GAEgASgDUgVzdGFydBIQCgNlbmQYAiABKANSA2VuZBIYCg'\n    'djb250ZW50GAMgASgJUgdjb250ZW50EloKDGNvbnRlbnRfdHlwZRgEIAEoDjI3LmJpbGliaWxp'\n    'LmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtTWFza1dhbGxDb250ZW50VHlwZVILY29udGVudF'\n    'R5cGUSTgoIYml6X3R5cGUYBSABKA4yMy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52'\n    'MS5EbU1hc2tXYWxsQml6VHlwZVIHYml6VHlwZRJPCghjb250ZW50cxgGIAMoCzIzLmJpbGliaW'\n    'xpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtTWFza1dhbGxDb250ZW50Ughjb250ZW50cw==');\n\n@$core.Deprecated('Use dmMaskWallContentDescriptor instead')\nconst DmMaskWallContent$json = {\n  '1': 'DmMaskWallContent',\n  '2': [\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.community.service.dm.v1.DmMaskWallContentType',\n      '10': 'type'\n    },\n    {'1': 'content', '3': 2, '4': 1, '5': 9, '10': 'content'},\n  ],\n};\n\n/// Descriptor for `DmMaskWallContent`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dmMaskWallContentDescriptor = $convert.base64Decode(\n    'ChFEbU1hc2tXYWxsQ29udGVudBJLCgR0eXBlGAEgASgOMjcuYmlsaWJpbGkuY29tbXVuaXR5Ln'\n    'NlcnZpY2UuZG0udjEuRG1NYXNrV2FsbENvbnRlbnRUeXBlUgR0eXBlEhgKB2NvbnRlbnQYAiAB'\n    'KAlSB2NvbnRlbnQ=');\n\n@$core.Deprecated('Use dmPlayerConfigReqDescriptor instead')\nconst DmPlayerConfigReq$json = {\n  '1': 'DmPlayerConfigReq',\n  '2': [\n    {'1': 'ts', '3': 1, '4': 1, '5': 3, '10': 'ts'},\n    {\n      '1': 'switch',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.PlayerDanmakuSwitch',\n      '10': 'switch'\n    },\n    {\n      '1': 'switch_save',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.PlayerDanmakuSwitchSave',\n      '10': 'switchSave'\n    },\n    {\n      '1': 'use_default_config',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.PlayerDanmakuUseDefaultConfig',\n      '10': 'useDefaultConfig'\n    },\n    {\n      '1': 'ai_recommended_switch',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedSwitch',\n      '10': 'aiRecommendedSwitch'\n    },\n    {\n      '1': 'ai_recommended_level',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedLevel',\n      '10': 'aiRecommendedLevel'\n    },\n    {\n      '1': 'blocktop',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.PlayerDanmakuBlocktop',\n      '10': 'blocktop'\n    },\n    {\n      '1': 'blockscroll',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.PlayerDanmakuBlockscroll',\n      '10': 'blockscroll'\n    },\n    {\n      '1': 'blockbottom',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.PlayerDanmakuBlockbottom',\n      '10': 'blockbottom'\n    },\n    {\n      '1': 'blockcolorful',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.PlayerDanmakuBlockcolorful',\n      '10': 'blockcolorful'\n    },\n    {\n      '1': 'blockrepeat',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.PlayerDanmakuBlockrepeat',\n      '10': 'blockrepeat'\n    },\n    {\n      '1': 'blockspecial',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.PlayerDanmakuBlockspecial',\n      '10': 'blockspecial'\n    },\n    {\n      '1': 'opacity',\n      '3': 13,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.PlayerDanmakuOpacity',\n      '10': 'opacity'\n    },\n    {\n      '1': 'scalingfactor',\n      '3': 14,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.PlayerDanmakuScalingfactor',\n      '10': 'scalingfactor'\n    },\n    {\n      '1': 'domain',\n      '3': 15,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.PlayerDanmakuDomain',\n      '10': 'domain'\n    },\n    {\n      '1': 'speed',\n      '3': 16,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.PlayerDanmakuSpeed',\n      '10': 'speed'\n    },\n    {\n      '1': 'enableblocklist',\n      '3': 17,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.PlayerDanmakuEnableblocklist',\n      '10': 'enableblocklist'\n    },\n    {\n      '1': 'inline_player_danmaku_switch',\n      '3': 18,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.InlinePlayerDanmakuSwitch',\n      '10': 'inlinePlayerDanmakuSwitch'\n    },\n    {\n      '1': 'senior_mode_switch',\n      '3': 19,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.PlayerDanmakuSeniorModeSwitch',\n      '10': 'seniorModeSwitch'\n    },\n    {\n      '1': 'ai_recommended_level_v2',\n      '3': 20,\n      '4': 1,\n      '5': 11,\n      '6':\n          '.bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedLevelV2',\n      '10': 'aiRecommendedLevelV2'\n    },\n    {\n      '1': 'enable_herd_dm',\n      '3': 21,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.PlayerDanmakuEnableHerdDm',\n      '10': 'enableHerdDm'\n    },\n    {\n      '1': 'blocktop_bottom',\n      '3': 22,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.PlayerDanmakuBlocktopBottom',\n      '10': 'blocktopBottom'\n    },\n    {\n      '1': 'domain_v2',\n      '3': 23,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.PlayerDanmakuDomainV2',\n      '10': 'domainV2'\n    },\n    {\n      '1': 'density',\n      '3': 24,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.PlayerDanmakuDensity',\n      '10': 'density'\n    },\n    {\n      '1': 'subtitle_proof',\n      '3': 25,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.PlayerDanmakuSubtitleProof',\n      '10': 'subtitleProof'\n    },\n    {\n      '1': 'people_proof',\n      '3': 26,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.PlayerDanmakuPeopleProof',\n      '10': 'peopleProof'\n    },\n  ],\n};\n\n/// Descriptor for `DmPlayerConfigReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dmPlayerConfigReqDescriptor = $convert.base64Decode(\n    'ChFEbVBsYXllckNvbmZpZ1JlcRIOCgJ0cxgBIAEoA1ICdHMSTQoGc3dpdGNoGAIgASgLMjUuYm'\n    'lsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdVN3aXRjaFIGc3dp'\n    'dGNoEloKC3N3aXRjaF9zYXZlGAMgASgLMjkuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG'\n    '0udjEuUGxheWVyRGFubWFrdVN3aXRjaFNhdmVSCnN3aXRjaFNhdmUSbQoSdXNlX2RlZmF1bHRf'\n    'Y29uZmlnGAQgASgLMj8uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRG'\n    'FubWFrdVVzZURlZmF1bHRDb25maWdSEHVzZURlZmF1bHRDb25maWcSdgoVYWlfcmVjb21tZW5k'\n    'ZWRfc3dpdGNoGAUgASgLMkIuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheW'\n    'VyRGFubWFrdUFpUmVjb21tZW5kZWRTd2l0Y2hSE2FpUmVjb21tZW5kZWRTd2l0Y2gScwoUYWlf'\n    'cmVjb21tZW5kZWRfbGV2ZWwYBiABKAsyQS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS'\n    '52MS5QbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZExldmVsUhJhaVJlY29tbWVuZGVkTGV2ZWwS'\n    'UwoIYmxvY2t0b3AYByABKAsyNy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbG'\n    'F5ZXJEYW5tYWt1QmxvY2t0b3BSCGJsb2NrdG9wElwKC2Jsb2Nrc2Nyb2xsGAggASgLMjouYmls'\n    'aWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUJsb2Nrc2Nyb2xsUg'\n    'tibG9ja3Njcm9sbBJcCgtibG9ja2JvdHRvbRgJIAEoCzI6LmJpbGliaWxpLmNvbW11bml0eS5z'\n    'ZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VCbG9ja2JvdHRvbVILYmxvY2tib3R0b20SYgoNYm'\n    'xvY2tjb2xvcmZ1bBgKIAEoCzI8LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBs'\n    'YXllckRhbm1ha3VCbG9ja2NvbG9yZnVsUg1ibG9ja2NvbG9yZnVsElwKC2Jsb2NrcmVwZWF0GA'\n    'sgASgLMjouYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUJs'\n    'b2NrcmVwZWF0UgtibG9ja3JlcGVhdBJfCgxibG9ja3NwZWNpYWwYDCABKAsyOy5iaWxpYmlsaS'\n    '5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1QmxvY2tzcGVjaWFsUgxibG9j'\n    'a3NwZWNpYWwSUAoHb3BhY2l0eRgNIAEoCzI2LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLm'\n    'RtLnYxLlBsYXllckRhbm1ha3VPcGFjaXR5UgdvcGFjaXR5EmIKDXNjYWxpbmdmYWN0b3IYDiAB'\n    'KAsyPC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1U2NhbG'\n    'luZ2ZhY3RvclINc2NhbGluZ2ZhY3RvchJNCgZkb21haW4YDyABKAsyNS5iaWxpYmlsaS5jb21t'\n    'dW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1RG9tYWluUgZkb21haW4SSgoFc3BlZW'\n    'QYECABKAsyNC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1'\n    'U3BlZWRSBXNwZWVkEmgKD2VuYWJsZWJsb2NrbGlzdBgRIAEoCzI+LmJpbGliaWxpLmNvbW11bm'\n    'l0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VFbmFibGVibG9ja2xpc3RSD2VuYWJsZWJs'\n    'b2NrbGlzdBJ8ChxpbmxpbmVfcGxheWVyX2Rhbm1ha3Vfc3dpdGNoGBIgASgLMjsuYmlsaWJpbG'\n    'kuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuSW5saW5lUGxheWVyRGFubWFrdVN3aXRjaFIZaW5s'\n    'aW5lUGxheWVyRGFubWFrdVN3aXRjaBJtChJzZW5pb3JfbW9kZV9zd2l0Y2gYEyABKAsyPy5iaW'\n    'xpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1U2VuaW9yTW9kZVN3'\n    'aXRjaFIQc2VuaW9yTW9kZVN3aXRjaBJ6ChdhaV9yZWNvbW1lbmRlZF9sZXZlbF92MhgUIAEoCz'\n    'JDLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VBaVJlY29t'\n    'bWVuZGVkTGV2ZWxWMlIUYWlSZWNvbW1lbmRlZExldmVsVjISYQoOZW5hYmxlX2hlcmRfZG0YFS'\n    'ABKAsyOy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1RW5h'\n    'YmxlSGVyZERtUgxlbmFibGVIZXJkRG0SZgoPYmxvY2t0b3BfYm90dG9tGBYgASgLMj0uYmlsaW'\n    'JpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUJsb2NrdG9wQm90dG9t'\n    'Ug5ibG9ja3RvcEJvdHRvbRJUCglkb21haW5fdjIYFyABKAsyNy5iaWxpYmlsaS5jb21tdW5pdH'\n    'kuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1RG9tYWluVjJSCGRvbWFpblYyElAKB2RlbnNp'\n    'dHkYGCABKAsyNi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYW'\n    't1RGVuc2l0eVIHZGVuc2l0eRJjCg5zdWJ0aXRsZV9wcm9vZhgZIAEoCzI8LmJpbGliaWxpLmNv'\n    'bW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VTdWJ0aXRsZVByb29mUg1zdWJ0aX'\n    'RsZVByb29mEl0KDHBlb3BsZV9wcm9vZhgaIAEoCzI6LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2'\n    'aWNlLmRtLnYxLlBsYXllckRhbm1ha3VQZW9wbGVQcm9vZlILcGVvcGxlUHJvb2Y=');\n\n@$core.Deprecated('Use dmSegCacheReqDescriptor instead')\nconst DmSegCacheReq$json = {\n  '1': 'DmSegCacheReq',\n  '2': [\n    {'1': 'type', '3': 1, '4': 1, '5': 5, '10': 'type'},\n    {'1': 'oid', '3': 2, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'pid', '3': 3, '4': 1, '5': 3, '10': 'pid'},\n  ],\n};\n\n/// Descriptor for `DmSegCacheReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dmSegCacheReqDescriptor = $convert.base64Decode(\n    'Cg1EbVNlZ0NhY2hlUmVxEhIKBHR5cGUYASABKAVSBHR5cGUSEAoDb2lkGAIgASgDUgNvaWQSEA'\n    'oDcGlkGAMgASgDUgNwaWQ=');\n\n@$core.Deprecated('Use dmSegConfigDescriptor instead')\nconst DmSegConfig$json = {\n  '1': 'DmSegConfig',\n  '2': [\n    {'1': 'page_size', '3': 1, '4': 1, '5': 3, '10': 'pageSize'},\n    {'1': 'total', '3': 2, '4': 1, '5': 3, '10': 'total'},\n  ],\n};\n\n/// Descriptor for `DmSegConfig`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dmSegConfigDescriptor = $convert.base64Decode(\n    'CgtEbVNlZ0NvbmZpZxIbCglwYWdlX3NpemUYASABKANSCHBhZ2VTaXplEhQKBXRvdGFsGAIgAS'\n    'gDUgV0b3RhbA==');\n\n@$core.Deprecated('Use dmSegMobileReplyDescriptor instead')\nconst DmSegMobileReply$json = {\n  '1': 'DmSegMobileReply',\n  '2': [\n    {\n      '1': 'elems',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.DanmakuElem',\n      '10': 'elems'\n    },\n    {'1': 'state', '3': 2, '4': 1, '5': 5, '10': 'state'},\n    {\n      '1': 'ai_flag',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.DanmakuAIFlag',\n      '10': 'aiFlag'\n    },\n    {'1': 'segment_rules', '3': 4, '4': 3, '5': 3, '10': 'segmentRules'},\n    {\n      '1': 'colorful_src',\n      '3': 5,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.DmColorful',\n      '10': 'colorfulSrc'\n    },\n    {'1': 'context_src', '3': 6, '4': 1, '5': 9, '10': 'contextSrc'},\n  ],\n};\n\n/// Descriptor for `DmSegMobileReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dmSegMobileReplyDescriptor = $convert.base64Decode(\n    'ChBEbVNlZ01vYmlsZVJlcGx5EkMKBWVsZW1zGAEgAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5Ln'\n    'NlcnZpY2UuZG0udjEuRGFubWFrdUVsZW1SBWVsZW1zEhQKBXN0YXRlGAIgASgFUgVzdGF0ZRJI'\n    'CgdhaV9mbGFnGAMgASgLMi8uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubW'\n    'FrdUFJRmxhZ1IGYWlGbGFnEiMKDXNlZ21lbnRfcnVsZXMYBCADKANSDHNlZ21lbnRSdWxlcxJP'\n    'Cgxjb2xvcmZ1bF9zcmMYBSADKAsyLC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS'\n    '5EbUNvbG9yZnVsUgtjb2xvcmZ1bFNyYxIfCgtjb250ZXh0X3NyYxgGIAEoCVIKY29udGV4dFNy'\n    'Yw==');\n\n@$core.Deprecated('Use dmSegMobileReqDescriptor instead')\nconst DmSegMobileReq$json = {\n  '1': 'DmSegMobileReq',\n  '2': [\n    {'1': 'pid', '3': 1, '4': 1, '5': 3, '10': 'pid'},\n    {'1': 'oid', '3': 2, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'type', '3': 3, '4': 1, '5': 5, '10': 'type'},\n    {'1': 'segment_index', '3': 4, '4': 1, '5': 3, '10': 'segmentIndex'},\n    {'1': 'teenagers_mode', '3': 5, '4': 1, '5': 5, '10': 'teenagersMode'},\n    {'1': 'ps', '3': 6, '4': 1, '5': 3, '10': 'ps'},\n    {'1': 'pe', '3': 7, '4': 1, '5': 3, '10': 'pe'},\n    {'1': 'pull_mode', '3': 8, '4': 1, '5': 5, '10': 'pullMode'},\n    {'1': 'from_scene', '3': 9, '4': 1, '5': 5, '10': 'fromScene'},\n    {'1': 'spmid', '3': 10, '4': 1, '5': 9, '10': 'spmid'},\n    {'1': 'context_ext', '3': 11, '4': 1, '5': 9, '10': 'contextExt'},\n  ],\n};\n\n/// Descriptor for `DmSegMobileReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dmSegMobileReqDescriptor = $convert.base64Decode(\n    'Cg5EbVNlZ01vYmlsZVJlcRIQCgNwaWQYASABKANSA3BpZBIQCgNvaWQYAiABKANSA29pZBISCg'\n    'R0eXBlGAMgASgFUgR0eXBlEiMKDXNlZ21lbnRfaW5kZXgYBCABKANSDHNlZ21lbnRJbmRleBIl'\n    'Cg50ZWVuYWdlcnNfbW9kZRgFIAEoBVINdGVlbmFnZXJzTW9kZRIOCgJwcxgGIAEoA1ICcHMSDg'\n    'oCcGUYByABKANSAnBlEhsKCXB1bGxfbW9kZRgIIAEoBVIIcHVsbE1vZGUSHQoKZnJvbV9zY2Vu'\n    'ZRgJIAEoBVIJZnJvbVNjZW5lEhQKBXNwbWlkGAogASgJUgVzcG1pZBIfCgtjb250ZXh0X2V4dB'\n    'gLIAEoCVIKY29udGV4dEV4dA==');\n\n@$core.Deprecated('Use dmSegOttReplyDescriptor instead')\nconst DmSegOttReply$json = {\n  '1': 'DmSegOttReply',\n  '2': [\n    {\n      '1': 'elems',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.DanmakuElem',\n      '10': 'elems'\n    },\n    {'1': 'state', '3': 2, '4': 1, '5': 5, '10': 'state'},\n  ],\n};\n\n/// Descriptor for `DmSegOttReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dmSegOttReplyDescriptor = $convert.base64Decode(\n    'Cg1EbVNlZ090dFJlcGx5EkMKBWVsZW1zGAEgAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcn'\n    'ZpY2UuZG0udjEuRGFubWFrdUVsZW1SBWVsZW1zEhQKBXN0YXRlGAIgASgFUgVzdGF0ZQ==');\n\n@$core.Deprecated('Use dmSegOttReqDescriptor instead')\nconst DmSegOttReq$json = {\n  '1': 'DmSegOttReq',\n  '2': [\n    {'1': 'pid', '3': 1, '4': 1, '5': 3, '10': 'pid'},\n    {'1': 'oid', '3': 2, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'type', '3': 3, '4': 1, '5': 5, '10': 'type'},\n    {'1': 'segment_index', '3': 4, '4': 1, '5': 3, '10': 'segmentIndex'},\n  ],\n};\n\n/// Descriptor for `DmSegOttReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dmSegOttReqDescriptor = $convert.base64Decode(\n    'CgtEbVNlZ090dFJlcRIQCgNwaWQYASABKANSA3BpZBIQCgNvaWQYAiABKANSA29pZBISCgR0eX'\n    'BlGAMgASgFUgR0eXBlEiMKDXNlZ21lbnRfaW5kZXgYBCABKANSDHNlZ21lbnRJbmRleA==');\n\n@$core.Deprecated('Use dmSegSDKReplyDescriptor instead')\nconst DmSegSDKReply$json = {\n  '1': 'DmSegSDKReply',\n  '2': [\n    {'1': 'closed', '3': 1, '4': 1, '5': 8, '10': 'closed'},\n    {\n      '1': 'elems',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.DanmakuElem',\n      '10': 'elems'\n    },\n  ],\n};\n\n/// Descriptor for `DmSegSDKReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dmSegSDKReplyDescriptor = $convert.base64Decode(\n    'Cg1EbVNlZ1NES1JlcGx5EhYKBmNsb3NlZBgBIAEoCFIGY2xvc2VkEkMKBWVsZW1zGAIgAygLMi'\n    '0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubWFrdUVsZW1SBWVsZW1z');\n\n@$core.Deprecated('Use dmSegSDKReqDescriptor instead')\nconst DmSegSDKReq$json = {\n  '1': 'DmSegSDKReq',\n  '2': [\n    {'1': 'pid', '3': 1, '4': 1, '5': 3, '10': 'pid'},\n    {'1': 'oid', '3': 2, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'type', '3': 3, '4': 1, '5': 5, '10': 'type'},\n    {'1': 'segment_index', '3': 4, '4': 1, '5': 3, '10': 'segmentIndex'},\n  ],\n};\n\n/// Descriptor for `DmSegSDKReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dmSegSDKReqDescriptor = $convert.base64Decode(\n    'CgtEbVNlZ1NES1JlcRIQCgNwaWQYASABKANSA3BpZBIQCgNvaWQYAiABKANSA29pZBISCgR0eX'\n    'BlGAMgASgFUgR0eXBlEiMKDXNlZ21lbnRfaW5kZXgYBCABKANSDHNlZ21lbnRJbmRleA==');\n\n@$core.Deprecated('Use dmSubViewDescriptor instead')\nconst DmSubView$json = {\n  '1': 'DmSubView',\n  '2': [\n    {'1': 'type', '3': 1, '4': 1, '5': 5, '10': 'type'},\n    {'1': 'oid', '3': 2, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'pid', '3': 3, '4': 1, '5': 3, '10': 'pid'},\n    {\n      '1': 'post_panel2',\n      '3': 4,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.PostPanelV2',\n      '10': 'postPanel2'\n    },\n  ],\n};\n\n/// Descriptor for `DmSubView`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dmSubViewDescriptor = $convert.base64Decode(\n    'CglEbVN1YlZpZXcSEgoEdHlwZRgBIAEoBVIEdHlwZRIQCgNvaWQYAiABKANSA29pZBIQCgNwaW'\n    'QYAyABKANSA3BpZBJOCgtwb3N0X3BhbmVsMhgEIAMoCzItLmJpbGliaWxpLmNvbW11bml0eS5z'\n    'ZXJ2aWNlLmRtLnYxLlBvc3RQYW5lbFYyUgpwb3N0UGFuZWwy');\n\n@$core.Deprecated('Use dmViewReplyDescriptor instead')\nconst DmViewReply$json = {\n  '1': 'DmViewReply',\n  '2': [\n    {'1': 'closed', '3': 1, '4': 1, '5': 8, '10': 'closed'},\n    {\n      '1': 'mask',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.VideoMask',\n      '10': 'mask'\n    },\n    {\n      '1': 'subtitle',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.VideoSubtitle',\n      '10': 'subtitle'\n    },\n    {'1': 'special_dms', '3': 4, '4': 3, '5': 9, '10': 'specialDms'},\n    {\n      '1': 'ai_flag',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.DanmakuFlagConfig',\n      '10': 'aiFlag'\n    },\n    {\n      '1': 'player_config',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.DanmuPlayerViewConfig',\n      '10': 'playerConfig'\n    },\n    {'1': 'send_box_style', '3': 7, '4': 1, '5': 5, '10': 'sendBoxStyle'},\n    {'1': 'allow', '3': 8, '4': 1, '5': 8, '10': 'allow'},\n    {'1': 'check_box', '3': 9, '4': 1, '5': 8, '10': 'checkBox'},\n    {\n      '1': 'check_box_show_msg',\n      '3': 10,\n      '4': 1,\n      '5': 9,\n      '10': 'checkBoxShowMsg'\n    },\n    {'1': 'text_placeholder', '3': 11, '4': 1, '5': 9, '10': 'textPlaceholder'},\n    {\n      '1': 'input_placeholder',\n      '3': 12,\n      '4': 1,\n      '5': 9,\n      '10': 'inputPlaceholder'\n    },\n    {\n      '1': 'report_filter_content',\n      '3': 13,\n      '4': 3,\n      '5': 9,\n      '10': 'reportFilterContent'\n    },\n    {\n      '1': 'expo_report',\n      '3': 14,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.ExpoReport',\n      '10': 'expoReport'\n    },\n    {\n      '1': 'buzzword_config',\n      '3': 15,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.BuzzwordConfig',\n      '10': 'buzzwordConfig'\n    },\n    {\n      '1': 'expressions',\n      '3': 16,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.Expressions',\n      '10': 'expressions'\n    },\n    {\n      '1': 'post_panel',\n      '3': 17,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.PostPanel',\n      '10': 'postPanel'\n    },\n    {'1': 'activity_meta', '3': 18, '4': 3, '5': 9, '10': 'activityMeta'},\n    {\n      '1': 'post_panel2',\n      '3': 19,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.PostPanelV2',\n      '10': 'postPanel2'\n    },\n    {\n      '1': 'dm_mask_wall',\n      '3': 20,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.DmMaskWall',\n      '10': 'dmMaskWall'\n    },\n    {\n      '1': 'dm_herd',\n      '3': 21,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.DmHerdView',\n      '10': 'dmHerd'\n    },\n    {\n      '1': 'command',\n      '3': 22,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.Command',\n      '10': 'command'\n    },\n    {'1': 'kv', '3': 23, '4': 1, '5': 9, '10': 'kv'},\n    {\n      '1': 'sub_views',\n      '3': 24,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.DmSubView',\n      '10': 'subViews'\n    },\n    {\n      '1': 'qoe',\n      '3': 25,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.QoeInfo',\n      '10': 'qoe'\n    },\n  ],\n};\n\n/// Descriptor for `DmViewReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dmViewReplyDescriptor = $convert.base64Decode(\n    'CgtEbVZpZXdSZXBseRIWCgZjbG9zZWQYASABKAhSBmNsb3NlZBI/CgRtYXNrGAIgASgLMisuYm'\n    'lsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuVmlkZW9NYXNrUgRtYXNrEksKCHN1YnRp'\n    'dGxlGAMgASgLMi8uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuVmlkZW9TdWJ0aX'\n    'RsZVIIc3VidGl0bGUSHwoLc3BlY2lhbF9kbXMYBCADKAlSCnNwZWNpYWxEbXMSTAoHYWlfZmxh'\n    'ZxgFIAEoCzIzLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRhbm1ha3VGbGFnQ2'\n    '9uZmlnUgZhaUZsYWcSXAoNcGxheWVyX2NvbmZpZxgGIAEoCzI3LmJpbGliaWxpLmNvbW11bml0'\n    'eS5zZXJ2aWNlLmRtLnYxLkRhbm11UGxheWVyVmlld0NvbmZpZ1IMcGxheWVyQ29uZmlnEiQKDn'\n    'NlbmRfYm94X3N0eWxlGAcgASgFUgxzZW5kQm94U3R5bGUSFAoFYWxsb3cYCCABKAhSBWFsbG93'\n    'EhsKCWNoZWNrX2JveBgJIAEoCFIIY2hlY2tCb3gSKwoSY2hlY2tfYm94X3Nob3dfbXNnGAogAS'\n    'gJUg9jaGVja0JveFNob3dNc2cSKQoQdGV4dF9wbGFjZWhvbGRlchgLIAEoCVIPdGV4dFBsYWNl'\n    'aG9sZGVyEisKEWlucHV0X3BsYWNlaG9sZGVyGAwgASgJUhBpbnB1dFBsYWNlaG9sZGVyEjIKFX'\n    'JlcG9ydF9maWx0ZXJfY29udGVudBgNIAMoCVITcmVwb3J0RmlsdGVyQ29udGVudBJNCgtleHBv'\n    'X3JlcG9ydBgOIAEoCzIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkV4cG9SZX'\n    'BvcnRSCmV4cG9SZXBvcnQSWQoPYnV6endvcmRfY29uZmlnGA8gASgLMjAuYmlsaWJpbGkuY29t'\n    'bXVuaXR5LnNlcnZpY2UuZG0udjEuQnV6endvcmRDb25maWdSDmJ1enp3b3JkQ29uZmlnEk8KC2'\n    'V4cHJlc3Npb25zGBAgAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRXhw'\n    'cmVzc2lvbnNSC2V4cHJlc3Npb25zEkoKCnBvc3RfcGFuZWwYESADKAsyKy5iaWxpYmlsaS5jb2'\n    '1tdW5pdHkuc2VydmljZS5kbS52MS5Qb3N0UGFuZWxSCXBvc3RQYW5lbBIjCg1hY3Rpdml0eV9t'\n    'ZXRhGBIgAygJUgxhY3Rpdml0eU1ldGESTgoLcG9zdF9wYW5lbDIYEyADKAsyLS5iaWxpYmlsaS'\n    '5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Qb3N0UGFuZWxWMlIKcG9zdFBhbmVsMhJOCgxkbV9t'\n    'YXNrX3dhbGwYFCADKAsyLC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbU1hc2'\n    'tXYWxsUgpkbU1hc2tXYWxsEkUKB2RtX2hlcmQYFSABKAsyLC5iaWxpYmlsaS5jb21tdW5pdHku'\n    'c2VydmljZS5kbS52MS5EbUhlcmRWaWV3UgZkbUhlcmQSQwoHY29tbWFuZBgWIAEoCzIpLmJpbG'\n    'liaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkNvbW1hbmRSB2NvbW1hbmQSDgoCa3YYFyAB'\n    'KAlSAmt2EkgKCXN1Yl92aWV3cxgYIAMoCzIrLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLm'\n    'RtLnYxLkRtU3ViVmlld1IIc3ViVmlld3MSOwoDcW9lGBkgASgLMikuYmlsaWJpbGkuY29tbXVu'\n    'aXR5LnNlcnZpY2UuZG0udjEuUW9lSW5mb1IDcW9l');\n\n@$core.Deprecated('Use dmViewReqDescriptor instead')\nconst DmViewReq$json = {\n  '1': 'DmViewReq',\n  '2': [\n    {'1': 'pid', '3': 1, '4': 1, '5': 3, '10': 'pid'},\n    {'1': 'oid', '3': 2, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'type', '3': 3, '4': 1, '5': 5, '10': 'type'},\n    {'1': 'spmid', '3': 4, '4': 1, '5': 9, '10': 'spmid'},\n    {'1': 'is_hard_boot', '3': 5, '4': 1, '5': 5, '10': 'isHardBoot'},\n    {'1': 'context_ext', '3': 6, '4': 1, '5': 9, '10': 'contextExt'},\n  ],\n};\n\n/// Descriptor for `DmViewReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dmViewReqDescriptor = $convert.base64Decode(\n    'CglEbVZpZXdSZXESEAoDcGlkGAEgASgDUgNwaWQSEAoDb2lkGAIgASgDUgNvaWQSEgoEdHlwZR'\n    'gDIAEoBVIEdHlwZRIUCgVzcG1pZBgEIAEoCVIFc3BtaWQSIAoMaXNfaGFyZF9ib290GAUgASgF'\n    'Ugppc0hhcmRCb290Eh8KC2NvbnRleHRfZXh0GAYgASgJUgpjb250ZXh0RXh0');\n\n@$core.Deprecated('Use dmWebViewReplyDescriptor instead')\nconst DmWebViewReply$json = {\n  '1': 'DmWebViewReply',\n  '2': [\n    {'1': 'state', '3': 1, '4': 1, '5': 5, '10': 'state'},\n    {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'text_side', '3': 3, '4': 1, '5': 9, '10': 'textSide'},\n    {\n      '1': 'dm_sge',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.DmSegConfig',\n      '10': 'dmSge'\n    },\n    {\n      '1': 'flag',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.DanmakuFlagConfig',\n      '10': 'flag'\n    },\n    {'1': 'special_dms', '3': 6, '4': 3, '5': 9, '10': 'specialDms'},\n    {'1': 'check_box', '3': 7, '4': 1, '5': 8, '10': 'checkBox'},\n    {'1': 'count', '3': 8, '4': 1, '5': 3, '10': 'count'},\n    {\n      '1': 'command_dms',\n      '3': 9,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.CommandDm',\n      '10': 'commandDms'\n    },\n    {\n      '1': 'player_config',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.DanmuWebPlayerConfig',\n      '10': 'playerConfig'\n    },\n    {\n      '1': 'report_filter_content',\n      '3': 11,\n      '4': 3,\n      '5': 9,\n      '10': 'reportFilterContent'\n    },\n    {\n      '1': 'expressions',\n      '3': 12,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.Expressions',\n      '10': 'expressions'\n    },\n    {\n      '1': 'post_panel',\n      '3': 13,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.PostPanel',\n      '10': 'postPanel'\n    },\n    {'1': 'activity_meta', '3': 14, '4': 3, '5': 9, '10': 'activityMeta'},\n    {\n      '1': 'post_panel2',\n      '3': 15,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.PostPanelV2',\n      '10': 'postPanel2'\n    },\n    {\n      '1': 'sub_views',\n      '3': 16,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.DmSubView',\n      '10': 'subViews'\n    },\n    {\n      '1': 'qoe',\n      '3': 17,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.QoeInfo',\n      '10': 'qoe'\n    },\n  ],\n};\n\n/// Descriptor for `DmWebViewReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dmWebViewReplyDescriptor = $convert.base64Decode(\n    'Cg5EbVdlYlZpZXdSZXBseRIUCgVzdGF0ZRgBIAEoBVIFc3RhdGUSEgoEdGV4dBgCIAEoCVIEdG'\n    'V4dBIbCgl0ZXh0X3NpZGUYAyABKAlSCHRleHRTaWRlEkQKBmRtX3NnZRgEIAEoCzItLmJpbGli'\n    'aWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtU2VnQ29uZmlnUgVkbVNnZRJHCgRmbGFnGA'\n    'UgASgLMjMuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubWFrdUZsYWdDb25m'\n    'aWdSBGZsYWcSHwoLc3BlY2lhbF9kbXMYBiADKAlSCnNwZWNpYWxEbXMSGwoJY2hlY2tfYm94GA'\n    'cgASgIUghjaGVja0JveBIUCgVjb3VudBgIIAEoA1IFY291bnQSTAoLY29tbWFuZF9kbXMYCSAD'\n    'KAsyKy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Db21tYW5kRG1SCmNvbW1hbm'\n    'REbXMSWwoNcGxheWVyX2NvbmZpZxgKIAEoCzI2LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNl'\n    'LmRtLnYxLkRhbm11V2ViUGxheWVyQ29uZmlnUgxwbGF5ZXJDb25maWcSMgoVcmVwb3J0X2ZpbH'\n    'Rlcl9jb250ZW50GAsgAygJUhNyZXBvcnRGaWx0ZXJDb250ZW50Ek8KC2V4cHJlc3Npb25zGAwg'\n    'AygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRXhwcmVzc2lvbnNSC2V4cH'\n    'Jlc3Npb25zEkoKCnBvc3RfcGFuZWwYDSADKAsyKy5iaWxpYmlsaS5jb21tdW5pdHkuc2Vydmlj'\n    'ZS5kbS52MS5Qb3N0UGFuZWxSCXBvc3RQYW5lbBIjCg1hY3Rpdml0eV9tZXRhGA4gAygJUgxhY3'\n    'Rpdml0eU1ldGESTgoLcG9zdF9wYW5lbDIYDyADKAsyLS5iaWxpYmlsaS5jb21tdW5pdHkuc2Vy'\n    'dmljZS5kbS52MS5Qb3N0UGFuZWxWMlIKcG9zdFBhbmVsMhJICglzdWJfdmlld3MYECADKAsyKy'\n    '5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVN1YlZpZXdSCHN1YlZpZXdzEjsK'\n    'A3FvZRgRIAEoCzIpLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlFvZUluZm9SA3'\n    'FvZQ==');\n\n@$core.Deprecated('Use expoReportDescriptor instead')\nconst ExpoReport$json = {\n  '1': 'ExpoReport',\n  '2': [\n    {\n      '1': 'should_report_at_end',\n      '3': 1,\n      '4': 1,\n      '5': 8,\n      '10': 'shouldReportAtEnd'\n    },\n    {'1': 'player_sample', '3': 2, '4': 1, '5': 1, '10': 'playerSample'},\n    {\n      '1': 'durations',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.ReportDuration',\n      '10': 'durations'\n    },\n    {'1': 'max_size', '3': 4, '4': 1, '5': 5, '10': 'maxSize'},\n  ],\n};\n\n/// Descriptor for `ExpoReport`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List expoReportDescriptor = $convert.base64Decode(\n    'CgpFeHBvUmVwb3J0Ei8KFHNob3VsZF9yZXBvcnRfYXRfZW5kGAEgASgIUhFzaG91bGRSZXBvcn'\n    'RBdEVuZBIjCg1wbGF5ZXJfc2FtcGxlGAIgASgBUgxwbGF5ZXJTYW1wbGUSTgoJZHVyYXRpb25z'\n    'GAMgAygLMjAuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUmVwb3J0RHVyYXRpb2'\n    '5SCWR1cmF0aW9ucxIZCghtYXhfc2l6ZRgEIAEoBVIHbWF4U2l6ZQ==');\n\n@$core.Deprecated('Use expressionDescriptor instead')\nconst Expression$json = {\n  '1': 'Expression',\n  '2': [\n    {'1': 'keyword', '3': 1, '4': 3, '5': 9, '10': 'keyword'},\n    {'1': 'url', '3': 2, '4': 1, '5': 9, '10': 'url'},\n    {\n      '1': 'period',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.Period',\n      '10': 'period'\n    },\n  ],\n};\n\n/// Descriptor for `Expression`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List expressionDescriptor = $convert.base64Decode(\n    'CgpFeHByZXNzaW9uEhgKB2tleXdvcmQYASADKAlSB2tleXdvcmQSEAoDdXJsGAIgASgJUgN1cm'\n    'wSQAoGcGVyaW9kGAMgAygLMiguYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGVy'\n    'aW9kUgZwZXJpb2Q=');\n\n@$core.Deprecated('Use expressionsDescriptor instead')\nconst Expressions$json = {\n  '1': 'Expressions',\n  '2': [\n    {\n      '1': 'data',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.Expression',\n      '10': 'data'\n    },\n  ],\n};\n\n/// Descriptor for `Expressions`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List expressionsDescriptor = $convert.base64Decode(\n    'CgtFeHByZXNzaW9ucxJACgRkYXRhGAEgAygLMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2'\n    'UuZG0udjEuRXhwcmVzc2lvblIEZGF0YQ==');\n\n@$core.Deprecated('Use inlinePlayerDanmakuSwitchDescriptor instead')\nconst InlinePlayerDanmakuSwitch$json = {\n  '1': 'InlinePlayerDanmakuSwitch',\n  '2': [\n    {'1': 'value', '3': 1, '4': 1, '5': 8, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `InlinePlayerDanmakuSwitch`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List inlinePlayerDanmakuSwitchDescriptor =\n    $convert.base64Decode(\n        'ChlJbmxpbmVQbGF5ZXJEYW5tYWt1U3dpdGNoEhQKBXZhbHVlGAEgASgIUgV2YWx1ZQ==');\n\n@$core.Deprecated('Use labelDescriptor instead')\nconst Label$json = {\n  '1': 'Label',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'content', '3': 2, '4': 3, '5': 9, '10': 'content'},\n  ],\n};\n\n/// Descriptor for `Label`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List labelDescriptor = $convert.base64Decode(\n    'CgVMYWJlbBIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSGAoHY29udGVudBgCIAMoCVIHY29udGVudA'\n    '==');\n\n@$core.Deprecated('Use labelV2Descriptor instead')\nconst LabelV2$json = {\n  '1': 'LabelV2',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'content', '3': 2, '4': 3, '5': 9, '10': 'content'},\n    {'1': 'exposure_once', '3': 3, '4': 1, '5': 8, '10': 'exposureOnce'},\n    {\n      '1': 'exposure_type',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.community.service.dm.v1.ExposureType',\n      '10': 'exposureType'\n    },\n  ],\n};\n\n/// Descriptor for `LabelV2`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List labelV2Descriptor = $convert.base64Decode(\n    'CgdMYWJlbFYyEhQKBXRpdGxlGAEgASgJUgV0aXRsZRIYCgdjb250ZW50GAIgAygJUgdjb250ZW'\n    '50EiMKDWV4cG9zdXJlX29uY2UYAyABKAhSDGV4cG9zdXJlT25jZRJTCg1leHBvc3VyZV90eXBl'\n    'GAQgASgOMi4uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRXhwb3N1cmVUeXBlUg'\n    'xleHBvc3VyZVR5cGU=');\n\n@$core.Deprecated('Use periodDescriptor instead')\nconst Period$json = {\n  '1': 'Period',\n  '2': [\n    {'1': 'start', '3': 1, '4': 1, '5': 3, '10': 'start'},\n    {'1': 'end', '3': 2, '4': 1, '5': 3, '10': 'end'},\n  ],\n};\n\n/// Descriptor for `Period`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List periodDescriptor = $convert.base64Decode(\n    'CgZQZXJpb2QSFAoFc3RhcnQYASABKANSBXN0YXJ0EhAKA2VuZBgCIAEoA1IDZW5k');\n\n@$core.Deprecated('Use playerDanmakuAiRecommendedLevelDescriptor instead')\nconst PlayerDanmakuAiRecommendedLevel$json = {\n  '1': 'PlayerDanmakuAiRecommendedLevel',\n  '2': [\n    {'1': 'value', '3': 1, '4': 1, '5': 5, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `PlayerDanmakuAiRecommendedLevel`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playerDanmakuAiRecommendedLevelDescriptor =\n    $convert.base64Decode(\n        'Ch9QbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZExldmVsEhQKBXZhbHVlGAEgASgFUgV2YWx1ZQ'\n        '==');\n\n@$core.Deprecated('Use playerDanmakuAiRecommendedLevelV2Descriptor instead')\nconst PlayerDanmakuAiRecommendedLevelV2$json = {\n  '1': 'PlayerDanmakuAiRecommendedLevelV2',\n  '2': [\n    {'1': 'value', '3': 1, '4': 1, '5': 5, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `PlayerDanmakuAiRecommendedLevelV2`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playerDanmakuAiRecommendedLevelV2Descriptor =\n    $convert.base64Decode(\n        'CiFQbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZExldmVsVjISFAoFdmFsdWUYASABKAVSBXZhbH'\n        'Vl');\n\n@$core.Deprecated('Use playerDanmakuAiRecommendedSwitchDescriptor instead')\nconst PlayerDanmakuAiRecommendedSwitch$json = {\n  '1': 'PlayerDanmakuAiRecommendedSwitch',\n  '2': [\n    {'1': 'value', '3': 1, '4': 1, '5': 8, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `PlayerDanmakuAiRecommendedSwitch`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playerDanmakuAiRecommendedSwitchDescriptor =\n    $convert.base64Decode(\n        'CiBQbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZFN3aXRjaBIUCgV2YWx1ZRgBIAEoCFIFdmFsdW'\n        'U=');\n\n@$core.Deprecated('Use playerDanmakuBlockbottomDescriptor instead')\nconst PlayerDanmakuBlockbottom$json = {\n  '1': 'PlayerDanmakuBlockbottom',\n  '2': [\n    {'1': 'value', '3': 1, '4': 1, '5': 8, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `PlayerDanmakuBlockbottom`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playerDanmakuBlockbottomDescriptor =\n    $convert.base64Decode(\n        'ChhQbGF5ZXJEYW5tYWt1QmxvY2tib3R0b20SFAoFdmFsdWUYASABKAhSBXZhbHVl');\n\n@$core.Deprecated('Use playerDanmakuBlockcolorfulDescriptor instead')\nconst PlayerDanmakuBlockcolorful$json = {\n  '1': 'PlayerDanmakuBlockcolorful',\n  '2': [\n    {'1': 'value', '3': 1, '4': 1, '5': 8, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `PlayerDanmakuBlockcolorful`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playerDanmakuBlockcolorfulDescriptor =\n    $convert.base64Decode(\n        'ChpQbGF5ZXJEYW5tYWt1QmxvY2tjb2xvcmZ1bBIUCgV2YWx1ZRgBIAEoCFIFdmFsdWU=');\n\n@$core.Deprecated('Use playerDanmakuBlockrepeatDescriptor instead')\nconst PlayerDanmakuBlockrepeat$json = {\n  '1': 'PlayerDanmakuBlockrepeat',\n  '2': [\n    {'1': 'value', '3': 1, '4': 1, '5': 8, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `PlayerDanmakuBlockrepeat`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playerDanmakuBlockrepeatDescriptor =\n    $convert.base64Decode(\n        'ChhQbGF5ZXJEYW5tYWt1QmxvY2tyZXBlYXQSFAoFdmFsdWUYASABKAhSBXZhbHVl');\n\n@$core.Deprecated('Use playerDanmakuBlockscrollDescriptor instead')\nconst PlayerDanmakuBlockscroll$json = {\n  '1': 'PlayerDanmakuBlockscroll',\n  '2': [\n    {'1': 'value', '3': 1, '4': 1, '5': 8, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `PlayerDanmakuBlockscroll`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playerDanmakuBlockscrollDescriptor =\n    $convert.base64Decode(\n        'ChhQbGF5ZXJEYW5tYWt1QmxvY2tzY3JvbGwSFAoFdmFsdWUYASABKAhSBXZhbHVl');\n\n@$core.Deprecated('Use playerDanmakuBlockspecialDescriptor instead')\nconst PlayerDanmakuBlockspecial$json = {\n  '1': 'PlayerDanmakuBlockspecial',\n  '2': [\n    {'1': 'value', '3': 1, '4': 1, '5': 8, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `PlayerDanmakuBlockspecial`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playerDanmakuBlockspecialDescriptor =\n    $convert.base64Decode(\n        'ChlQbGF5ZXJEYW5tYWt1QmxvY2tzcGVjaWFsEhQKBXZhbHVlGAEgASgIUgV2YWx1ZQ==');\n\n@$core.Deprecated('Use playerDanmakuBlocktopDescriptor instead')\nconst PlayerDanmakuBlocktop$json = {\n  '1': 'PlayerDanmakuBlocktop',\n  '2': [\n    {'1': 'value', '3': 1, '4': 1, '5': 8, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `PlayerDanmakuBlocktop`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playerDanmakuBlocktopDescriptor =\n    $convert.base64Decode(\n        'ChVQbGF5ZXJEYW5tYWt1QmxvY2t0b3ASFAoFdmFsdWUYASABKAhSBXZhbHVl');\n\n@$core.Deprecated('Use playerDanmakuBlocktopBottomDescriptor instead')\nconst PlayerDanmakuBlocktopBottom$json = {\n  '1': 'PlayerDanmakuBlocktopBottom',\n  '2': [\n    {'1': 'value', '3': 1, '4': 1, '5': 8, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `PlayerDanmakuBlocktopBottom`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playerDanmakuBlocktopBottomDescriptor =\n    $convert.base64Decode(\n        'ChtQbGF5ZXJEYW5tYWt1QmxvY2t0b3BCb3R0b20SFAoFdmFsdWUYASABKAhSBXZhbHVl');\n\n@$core.Deprecated('Use playerDanmakuDensityDescriptor instead')\nconst PlayerDanmakuDensity$json = {\n  '1': 'PlayerDanmakuDensity',\n  '2': [\n    {'1': 'value', '3': 1, '4': 1, '5': 5, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `PlayerDanmakuDensity`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playerDanmakuDensityDescriptor =\n    $convert.base64Decode(\n        'ChRQbGF5ZXJEYW5tYWt1RGVuc2l0eRIUCgV2YWx1ZRgBIAEoBVIFdmFsdWU=');\n\n@$core.Deprecated('Use playerDanmakuDomainDescriptor instead')\nconst PlayerDanmakuDomain$json = {\n  '1': 'PlayerDanmakuDomain',\n  '2': [\n    {'1': 'value', '3': 1, '4': 1, '5': 2, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `PlayerDanmakuDomain`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playerDanmakuDomainDescriptor =\n    $convert.base64Decode(\n        'ChNQbGF5ZXJEYW5tYWt1RG9tYWluEhQKBXZhbHVlGAEgASgCUgV2YWx1ZQ==');\n\n@$core.Deprecated('Use playerDanmakuDomainV2Descriptor instead')\nconst PlayerDanmakuDomainV2$json = {\n  '1': 'PlayerDanmakuDomainV2',\n  '2': [\n    {'1': 'value', '3': 1, '4': 1, '5': 5, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `PlayerDanmakuDomainV2`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playerDanmakuDomainV2Descriptor =\n    $convert.base64Decode(\n        'ChVQbGF5ZXJEYW5tYWt1RG9tYWluVjISFAoFdmFsdWUYASABKAVSBXZhbHVl');\n\n@$core.Deprecated('Use playerDanmakuEnableHerdDmDescriptor instead')\nconst PlayerDanmakuEnableHerdDm$json = {\n  '1': 'PlayerDanmakuEnableHerdDm',\n  '2': [\n    {'1': 'value', '3': 1, '4': 1, '5': 8, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `PlayerDanmakuEnableHerdDm`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playerDanmakuEnableHerdDmDescriptor =\n    $convert.base64Decode(\n        'ChlQbGF5ZXJEYW5tYWt1RW5hYmxlSGVyZERtEhQKBXZhbHVlGAEgASgIUgV2YWx1ZQ==');\n\n@$core.Deprecated('Use playerDanmakuEnableblocklistDescriptor instead')\nconst PlayerDanmakuEnableblocklist$json = {\n  '1': 'PlayerDanmakuEnableblocklist',\n  '2': [\n    {'1': 'value', '3': 1, '4': 1, '5': 8, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `PlayerDanmakuEnableblocklist`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playerDanmakuEnableblocklistDescriptor =\n    $convert.base64Decode(\n        'ChxQbGF5ZXJEYW5tYWt1RW5hYmxlYmxvY2tsaXN0EhQKBXZhbHVlGAEgASgIUgV2YWx1ZQ==');\n\n@$core.Deprecated('Use playerDanmakuOpacityDescriptor instead')\nconst PlayerDanmakuOpacity$json = {\n  '1': 'PlayerDanmakuOpacity',\n  '2': [\n    {'1': 'value', '3': 1, '4': 1, '5': 2, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `PlayerDanmakuOpacity`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playerDanmakuOpacityDescriptor =\n    $convert.base64Decode(\n        'ChRQbGF5ZXJEYW5tYWt1T3BhY2l0eRIUCgV2YWx1ZRgBIAEoAlIFdmFsdWU=');\n\n@$core.Deprecated('Use playerDanmakuPeopleProofDescriptor instead')\nconst PlayerDanmakuPeopleProof$json = {\n  '1': 'PlayerDanmakuPeopleProof',\n  '2': [\n    {'1': 'value', '3': 1, '4': 1, '5': 8, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `PlayerDanmakuPeopleProof`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playerDanmakuPeopleProofDescriptor =\n    $convert.base64Decode(\n        'ChhQbGF5ZXJEYW5tYWt1UGVvcGxlUHJvb2YSFAoFdmFsdWUYASABKAhSBXZhbHVl');\n\n@$core.Deprecated('Use playerDanmakuScalingfactorDescriptor instead')\nconst PlayerDanmakuScalingfactor$json = {\n  '1': 'PlayerDanmakuScalingfactor',\n  '2': [\n    {'1': 'value', '3': 1, '4': 1, '5': 2, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `PlayerDanmakuScalingfactor`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playerDanmakuScalingfactorDescriptor =\n    $convert.base64Decode(\n        'ChpQbGF5ZXJEYW5tYWt1U2NhbGluZ2ZhY3RvchIUCgV2YWx1ZRgBIAEoAlIFdmFsdWU=');\n\n@$core.Deprecated('Use playerDanmakuSeniorModeSwitchDescriptor instead')\nconst PlayerDanmakuSeniorModeSwitch$json = {\n  '1': 'PlayerDanmakuSeniorModeSwitch',\n  '2': [\n    {'1': 'value', '3': 1, '4': 1, '5': 5, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `PlayerDanmakuSeniorModeSwitch`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playerDanmakuSeniorModeSwitchDescriptor =\n    $convert.base64Decode(\n        'Ch1QbGF5ZXJEYW5tYWt1U2VuaW9yTW9kZVN3aXRjaBIUCgV2YWx1ZRgBIAEoBVIFdmFsdWU=');\n\n@$core.Deprecated('Use playerDanmakuSpeedDescriptor instead')\nconst PlayerDanmakuSpeed$json = {\n  '1': 'PlayerDanmakuSpeed',\n  '2': [\n    {'1': 'value', '3': 1, '4': 1, '5': 5, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `PlayerDanmakuSpeed`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playerDanmakuSpeedDescriptor = $convert\n    .base64Decode('ChJQbGF5ZXJEYW5tYWt1U3BlZWQSFAoFdmFsdWUYASABKAVSBXZhbHVl');\n\n@$core.Deprecated('Use playerDanmakuSubtitleProofDescriptor instead')\nconst PlayerDanmakuSubtitleProof$json = {\n  '1': 'PlayerDanmakuSubtitleProof',\n  '2': [\n    {'1': 'value', '3': 1, '4': 1, '5': 8, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `PlayerDanmakuSubtitleProof`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playerDanmakuSubtitleProofDescriptor =\n    $convert.base64Decode(\n        'ChpQbGF5ZXJEYW5tYWt1U3VidGl0bGVQcm9vZhIUCgV2YWx1ZRgBIAEoCFIFdmFsdWU=');\n\n@$core.Deprecated('Use playerDanmakuSwitchDescriptor instead')\nconst PlayerDanmakuSwitch$json = {\n  '1': 'PlayerDanmakuSwitch',\n  '2': [\n    {'1': 'value', '3': 1, '4': 1, '5': 8, '10': 'value'},\n    {'1': 'can_ignore', '3': 2, '4': 1, '5': 8, '10': 'canIgnore'},\n  ],\n};\n\n/// Descriptor for `PlayerDanmakuSwitch`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playerDanmakuSwitchDescriptor = $convert.base64Decode(\n    'ChNQbGF5ZXJEYW5tYWt1U3dpdGNoEhQKBXZhbHVlGAEgASgIUgV2YWx1ZRIdCgpjYW5faWdub3'\n    'JlGAIgASgIUgljYW5JZ25vcmU=');\n\n@$core.Deprecated('Use playerDanmakuSwitchSaveDescriptor instead')\nconst PlayerDanmakuSwitchSave$json = {\n  '1': 'PlayerDanmakuSwitchSave',\n  '2': [\n    {'1': 'value', '3': 1, '4': 1, '5': 8, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `PlayerDanmakuSwitchSave`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playerDanmakuSwitchSaveDescriptor =\n    $convert.base64Decode(\n        'ChdQbGF5ZXJEYW5tYWt1U3dpdGNoU2F2ZRIUCgV2YWx1ZRgBIAEoCFIFdmFsdWU=');\n\n@$core.Deprecated('Use playerDanmakuUseDefaultConfigDescriptor instead')\nconst PlayerDanmakuUseDefaultConfig$json = {\n  '1': 'PlayerDanmakuUseDefaultConfig',\n  '2': [\n    {'1': 'value', '3': 1, '4': 1, '5': 8, '10': 'value'},\n  ],\n};\n\n/// Descriptor for `PlayerDanmakuUseDefaultConfig`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playerDanmakuUseDefaultConfigDescriptor =\n    $convert.base64Decode(\n        'Ch1QbGF5ZXJEYW5tYWt1VXNlRGVmYXVsdENvbmZpZxIUCgV2YWx1ZRgBIAEoCFIFdmFsdWU=');\n\n@$core.Deprecated('Use postPanelDescriptor instead')\nconst PostPanel$json = {\n  '1': 'PostPanel',\n  '2': [\n    {'1': 'start', '3': 1, '4': 1, '5': 3, '10': 'start'},\n    {'1': 'end', '3': 2, '4': 1, '5': 3, '10': 'end'},\n    {'1': 'priority', '3': 3, '4': 1, '5': 3, '10': 'priority'},\n    {'1': 'biz_id', '3': 4, '4': 1, '5': 3, '10': 'bizId'},\n    {\n      '1': 'biz_type',\n      '3': 5,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.community.service.dm.v1.PostPanelBizType',\n      '10': 'bizType'\n    },\n    {\n      '1': 'click_button',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.ClickButton',\n      '10': 'clickButton'\n    },\n    {\n      '1': 'text_input',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.TextInput',\n      '10': 'textInput'\n    },\n    {\n      '1': 'check_box',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.CheckBox',\n      '10': 'checkBox'\n    },\n    {\n      '1': 'toast',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.Toast',\n      '10': 'toast'\n    },\n  ],\n};\n\n/// Descriptor for `PostPanel`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List postPanelDescriptor = $convert.base64Decode(\n    'CglQb3N0UGFuZWwSFAoFc3RhcnQYASABKANSBXN0YXJ0EhAKA2VuZBgCIAEoA1IDZW5kEhoKCH'\n    'ByaW9yaXR5GAMgASgDUghwcmlvcml0eRIVCgZiaXpfaWQYBCABKANSBWJpeklkEk0KCGJpel90'\n    'eXBlGAUgASgOMjIuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUG9zdFBhbmVsQm'\n    'l6VHlwZVIHYml6VHlwZRJQCgxjbGlja19idXR0b24YBiABKAsyLS5iaWxpYmlsaS5jb21tdW5p'\n    'dHkuc2VydmljZS5kbS52MS5DbGlja0J1dHRvblILY2xpY2tCdXR0b24SSgoKdGV4dF9pbnB1dB'\n    'gHIAEoCzIrLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlRleHRJbnB1dFIJdGV4'\n    'dElucHV0EkcKCWNoZWNrX2JveBgIIAEoCzIqLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLm'\n    'RtLnYxLkNoZWNrQm94UghjaGVja0JveBI9CgV0b2FzdBgJIAEoCzInLmJpbGliaWxpLmNvbW11'\n    'bml0eS5zZXJ2aWNlLmRtLnYxLlRvYXN0UgV0b2FzdA==');\n\n@$core.Deprecated('Use postPanelV2Descriptor instead')\nconst PostPanelV2$json = {\n  '1': 'PostPanelV2',\n  '2': [\n    {'1': 'start', '3': 1, '4': 1, '5': 3, '10': 'start'},\n    {'1': 'end', '3': 2, '4': 1, '5': 3, '10': 'end'},\n    {\n      '1': 'biz_type',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.community.service.dm.v1.PostPanelBizType',\n      '10': 'bizType'\n    },\n    {\n      '1': 'click_button',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.ClickButtonV2',\n      '10': 'clickButton'\n    },\n    {\n      '1': 'text_input',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.TextInputV2',\n      '10': 'textInput'\n    },\n    {\n      '1': 'check_box',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.CheckBoxV2',\n      '10': 'checkBox'\n    },\n    {\n      '1': 'toast',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.ToastV2',\n      '10': 'toast'\n    },\n    {\n      '1': 'bubble',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.BubbleV2',\n      '10': 'bubble'\n    },\n    {\n      '1': 'label',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.LabelV2',\n      '10': 'label'\n    },\n    {\n      '1': 'post_status',\n      '3': 10,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.community.service.dm.v1.PostStatus',\n      '10': 'postStatus'\n    },\n  ],\n};\n\n/// Descriptor for `PostPanelV2`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List postPanelV2Descriptor = $convert.base64Decode(\n    'CgtQb3N0UGFuZWxWMhIUCgVzdGFydBgBIAEoA1IFc3RhcnQSEAoDZW5kGAIgASgDUgNlbmQSTQ'\n    'oIYml6X3R5cGUYAyABKA4yMi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Qb3N0'\n    'UGFuZWxCaXpUeXBlUgdiaXpUeXBlElIKDGNsaWNrX2J1dHRvbhgEIAEoCzIvLmJpbGliaWxpLm'\n    'NvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkNsaWNrQnV0dG9uVjJSC2NsaWNrQnV0dG9uEkwKCnRl'\n    'eHRfaW5wdXQYBSABKAsyLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5UZXh0SW'\n    '5wdXRWMlIJdGV4dElucHV0EkkKCWNoZWNrX2JveBgGIAEoCzIsLmJpbGliaWxpLmNvbW11bml0'\n    'eS5zZXJ2aWNlLmRtLnYxLkNoZWNrQm94VjJSCGNoZWNrQm94Ej8KBXRvYXN0GAcgASgLMikuYm'\n    'lsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuVG9hc3RWMlIFdG9hc3QSQgoGYnViYmxl'\n    'GAggASgLMiouYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQnViYmxlVjJSBmJ1Ym'\n    'JsZRI/CgVsYWJlbBgJIAEoCzIpLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkxh'\n    'YmVsVjJSBWxhYmVsEk0KC3Bvc3Rfc3RhdHVzGAogASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5Ln'\n    'NlcnZpY2UuZG0udjEuUG9zdFN0YXR1c1IKcG9zdFN0YXR1cw==');\n\n@$core.Deprecated('Use qoeInfoDescriptor instead')\nconst QoeInfo$json = {\n  '1': 'QoeInfo',\n  '2': [\n    {'1': 'info', '3': 1, '4': 1, '5': 9, '10': 'info'},\n  ],\n};\n\n/// Descriptor for `QoeInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List qoeInfoDescriptor =\n    $convert.base64Decode('CgdRb2VJbmZvEhIKBGluZm8YASABKAlSBGluZm8=');\n\n@$core.Deprecated('Use reportDurationDescriptor instead')\nconst ReportDuration$json = {\n  '1': 'ReportDuration',\n  '2': [\n    {'1': 'start_second', '3': 1, '4': 1, '5': 3, '10': 'startSecond'},\n    {'1': 'end_second', '3': 2, '4': 1, '5': 3, '10': 'endSecond'},\n  ],\n};\n\n/// Descriptor for `ReportDuration`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reportDurationDescriptor = $convert.base64Decode(\n    'Cg5SZXBvcnREdXJhdGlvbhIhCgxzdGFydF9zZWNvbmQYASABKANSC3N0YXJ0U2Vjb25kEh0KCm'\n    'VuZF9zZWNvbmQYAiABKANSCWVuZFNlY29uZA==');\n\n@$core.Deprecated('Use responseDescriptor instead')\nconst Response$json = {\n  '1': 'Response',\n  '2': [\n    {'1': 'code', '3': 1, '4': 1, '5': 5, '10': 'code'},\n    {'1': 'message', '3': 2, '4': 1, '5': 9, '10': 'message'},\n  ],\n};\n\n/// Descriptor for `Response`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List responseDescriptor = $convert.base64Decode(\n    'CghSZXNwb25zZRISCgRjb2RlGAEgASgFUgRjb2RlEhgKB21lc3NhZ2UYAiABKAlSB21lc3NhZ2'\n    'U=');\n\n@$core.Deprecated('Use subtitleItemDescriptor instead')\nconst SubtitleItem$json = {\n  '1': 'SubtitleItem',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'id_str', '3': 2, '4': 1, '5': 9, '10': 'idStr'},\n    {'1': 'lan', '3': 3, '4': 1, '5': 9, '10': 'lan'},\n    {'1': 'lan_doc', '3': 4, '4': 1, '5': 9, '10': 'lanDoc'},\n    {'1': 'subtitle_url', '3': 5, '4': 1, '5': 9, '10': 'subtitleUrl'},\n    {\n      '1': 'author',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.UserInfo',\n      '10': 'author'\n    },\n    {\n      '1': 'type',\n      '3': 7,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.community.service.dm.v1.SubtitleType',\n      '10': 'type'\n    },\n    {'1': 'lan_doc_brief', '3': 8, '4': 1, '5': 9, '10': 'lanDocBrief'},\n    {\n      '1': 'ai_type',\n      '3': 9,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.community.service.dm.v1.SubtitleAiType',\n      '10': 'aiType'\n    },\n    {\n      '1': 'ai_status',\n      '3': 10,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.community.service.dm.v1.SubtitleAiStatus',\n      '10': 'aiStatus'\n    },\n    {\n      '1': 'role',\n      '3': 11,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.community.service.dm.v1.SubtitleRole',\n      '10': 'role'\n    },\n  ],\n};\n\n/// Descriptor for `SubtitleItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List subtitleItemDescriptor = $convert.base64Decode(\n    'CgxTdWJ0aXRsZUl0ZW0SDgoCaWQYASABKANSAmlkEhUKBmlkX3N0chgCIAEoCVIFaWRTdHISEA'\n    'oDbGFuGAMgASgJUgNsYW4SFwoHbGFuX2RvYxgEIAEoCVIGbGFuRG9jEiEKDHN1YnRpdGxlX3Vy'\n    'bBgFIAEoCVILc3VidGl0bGVVcmwSQgoGYXV0aG9yGAYgASgLMiouYmlsaWJpbGkuY29tbXVuaX'\n    'R5LnNlcnZpY2UuZG0udjEuVXNlckluZm9SBmF1dGhvchJCCgR0eXBlGAcgASgOMi4uYmlsaWJp'\n    'bGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuU3VidGl0bGVUeXBlUgR0eXBlEiIKDWxhbl9kb2'\n    'NfYnJpZWYYCCABKAlSC2xhbkRvY0JyaWVmEkkKB2FpX3R5cGUYCSABKA4yMC5iaWxpYmlsaS5j'\n    'b21tdW5pdHkuc2VydmljZS5kbS52MS5TdWJ0aXRsZUFpVHlwZVIGYWlUeXBlEk8KCWFpX3N0YX'\n    'R1cxgKIAEoDjIyLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlN1YnRpdGxlQWlT'\n    'dGF0dXNSCGFpU3RhdHVzEkIKBHJvbGUYCyABKA4yLi5iaWxpYmlsaS5jb21tdW5pdHkuc2Vydm'\n    'ljZS5kbS52MS5TdWJ0aXRsZVJvbGVSBHJvbGU=');\n\n@$core.Deprecated('Use textInputDescriptor instead')\nconst TextInput$json = {\n  '1': 'TextInput',\n  '2': [\n    {\n      '1': 'portrait_placeholder',\n      '3': 1,\n      '4': 3,\n      '5': 9,\n      '10': 'portraitPlaceholder'\n    },\n    {\n      '1': 'landscape_placeholder',\n      '3': 2,\n      '4': 3,\n      '5': 9,\n      '10': 'landscapePlaceholder'\n    },\n    {\n      '1': 'render_type',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.community.service.dm.v1.RenderType',\n      '10': 'renderType'\n    },\n    {'1': 'placeholder_post', '3': 4, '4': 1, '5': 8, '10': 'placeholderPost'},\n    {'1': 'show', '3': 5, '4': 1, '5': 8, '10': 'show'},\n    {\n      '1': 'avatar',\n      '3': 6,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.Avatar',\n      '10': 'avatar'\n    },\n    {\n      '1': 'post_status',\n      '3': 7,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.community.service.dm.v1.PostStatus',\n      '10': 'postStatus'\n    },\n    {\n      '1': 'label',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.Label',\n      '10': 'label'\n    },\n  ],\n};\n\n/// Descriptor for `TextInput`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List textInputDescriptor = $convert.base64Decode(\n    'CglUZXh0SW5wdXQSMQoUcG9ydHJhaXRfcGxhY2Vob2xkZXIYASADKAlSE3BvcnRyYWl0UGxhY2'\n    'Vob2xkZXISMwoVbGFuZHNjYXBlX3BsYWNlaG9sZGVyGAIgAygJUhRsYW5kc2NhcGVQbGFjZWhv'\n    'bGRlchJNCgtyZW5kZXJfdHlwZRgDIAEoDjIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLm'\n    'RtLnYxLlJlbmRlclR5cGVSCnJlbmRlclR5cGUSKQoQcGxhY2Vob2xkZXJfcG9zdBgEIAEoCFIP'\n    'cGxhY2Vob2xkZXJQb3N0EhIKBHNob3cYBSABKAhSBHNob3cSQAoGYXZhdGFyGAYgAygLMiguYm'\n    'lsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQXZhdGFyUgZhdmF0YXISTQoLcG9zdF9z'\n    'dGF0dXMYByABKA4yLC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Qb3N0U3RhdH'\n    'VzUgpwb3N0U3RhdHVzEj0KBWxhYmVsGAggASgLMicuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZp'\n    'Y2UuZG0udjEuTGFiZWxSBWxhYmVs');\n\n@$core.Deprecated('Use textInputV2Descriptor instead')\nconst TextInputV2$json = {\n  '1': 'TextInputV2',\n  '2': [\n    {\n      '1': 'portrait_placeholder',\n      '3': 1,\n      '4': 3,\n      '5': 9,\n      '10': 'portraitPlaceholder'\n    },\n    {\n      '1': 'landscape_placeholder',\n      '3': 2,\n      '4': 3,\n      '5': 9,\n      '10': 'landscapePlaceholder'\n    },\n    {\n      '1': 'render_type',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.community.service.dm.v1.RenderType',\n      '10': 'renderType'\n    },\n    {'1': 'placeholder_post', '3': 4, '4': 1, '5': 8, '10': 'placeholderPost'},\n    {\n      '1': 'avatar',\n      '3': 5,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.Avatar',\n      '10': 'avatar'\n    },\n    {'1': 'text_input_limit', '3': 6, '4': 1, '5': 5, '10': 'textInputLimit'},\n  ],\n};\n\n/// Descriptor for `TextInputV2`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List textInputV2Descriptor = $convert.base64Decode(\n    'CgtUZXh0SW5wdXRWMhIxChRwb3J0cmFpdF9wbGFjZWhvbGRlchgBIAMoCVITcG9ydHJhaXRQbG'\n    'FjZWhvbGRlchIzChVsYW5kc2NhcGVfcGxhY2Vob2xkZXIYAiADKAlSFGxhbmRzY2FwZVBsYWNl'\n    'aG9sZGVyEk0KC3JlbmRlcl90eXBlGAMgASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2'\n    'UuZG0udjEuUmVuZGVyVHlwZVIKcmVuZGVyVHlwZRIpChBwbGFjZWhvbGRlcl9wb3N0GAQgASgI'\n    'Ug9wbGFjZWhvbGRlclBvc3QSQAoGYXZhdGFyGAUgAygLMiguYmlsaWJpbGkuY29tbXVuaXR5Ln'\n    'NlcnZpY2UuZG0udjEuQXZhdGFyUgZhdmF0YXISKAoQdGV4dF9pbnB1dF9saW1pdBgGIAEoBVIO'\n    'dGV4dElucHV0TGltaXQ=');\n\n@$core.Deprecated('Use toastDescriptor instead')\nconst Toast$json = {\n  '1': 'Toast',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'duration', '3': 2, '4': 1, '5': 5, '10': 'duration'},\n    {'1': 'show', '3': 3, '4': 1, '5': 8, '10': 'show'},\n    {\n      '1': 'button',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.Button',\n      '10': 'button'\n    },\n  ],\n};\n\n/// Descriptor for `Toast`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List toastDescriptor = $convert.base64Decode(\n    'CgVUb2FzdBISCgR0ZXh0GAEgASgJUgR0ZXh0EhoKCGR1cmF0aW9uGAIgASgFUghkdXJhdGlvbh'\n    'ISCgRzaG93GAMgASgIUgRzaG93EkAKBmJ1dHRvbhgEIAEoCzIoLmJpbGliaWxpLmNvbW11bml0'\n    'eS5zZXJ2aWNlLmRtLnYxLkJ1dHRvblIGYnV0dG9u');\n\n@$core.Deprecated('Use toastButtonV2Descriptor instead')\nconst ToastButtonV2$json = {\n  '1': 'ToastButtonV2',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {\n      '1': 'action',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.community.service.dm.v1.ToastFunctionType',\n      '10': 'action'\n    },\n  ],\n};\n\n/// Descriptor for `ToastButtonV2`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List toastButtonV2Descriptor = $convert.base64Decode(\n    'Cg1Ub2FzdEJ1dHRvblYyEhIKBHRleHQYASABKAlSBHRleHQSSwoGYWN0aW9uGAIgASgOMjMuYm'\n    'lsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuVG9hc3RGdW5jdGlvblR5cGVSBmFjdGlv'\n    'bg==');\n\n@$core.Deprecated('Use toastV2Descriptor instead')\nconst ToastV2$json = {\n  '1': 'ToastV2',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'duration', '3': 2, '4': 1, '5': 5, '10': 'duration'},\n    {\n      '1': 'toast_button_v2',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.ToastButtonV2',\n      '10': 'toastButtonV2'\n    },\n  ],\n};\n\n/// Descriptor for `ToastV2`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List toastV2Descriptor = $convert.base64Decode(\n    'CgdUb2FzdFYyEhIKBHRleHQYASABKAlSBHRleHQSGgoIZHVyYXRpb24YAiABKAVSCGR1cmF0aW'\n    '9uElcKD3RvYXN0X2J1dHRvbl92MhgDIAEoCzIvLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNl'\n    'LmRtLnYxLlRvYXN0QnV0dG9uVjJSDXRvYXN0QnV0dG9uVjI=');\n\n@$core.Deprecated('Use userInfoDescriptor instead')\nconst UserInfo$json = {\n  '1': 'UserInfo',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'sex', '3': 3, '4': 1, '5': 9, '10': 'sex'},\n    {'1': 'face', '3': 4, '4': 1, '5': 9, '10': 'face'},\n    {'1': 'sign', '3': 5, '4': 1, '5': 9, '10': 'sign'},\n    {'1': 'rank', '3': 6, '4': 1, '5': 5, '10': 'rank'},\n  ],\n};\n\n/// Descriptor for `UserInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List userInfoDescriptor = $convert.base64Decode(\n    'CghVc2VySW5mbxIQCgNtaWQYASABKANSA21pZBISCgRuYW1lGAIgASgJUgRuYW1lEhAKA3NleB'\n    'gDIAEoCVIDc2V4EhIKBGZhY2UYBCABKAlSBGZhY2USEgoEc2lnbhgFIAEoCVIEc2lnbhISCgRy'\n    'YW5rGAYgASgFUgRyYW5r');\n\n@$core.Deprecated('Use videoMaskDescriptor instead')\nconst VideoMask$json = {\n  '1': 'VideoMask',\n  '2': [\n    {'1': 'cid', '3': 1, '4': 1, '5': 3, '10': 'cid'},\n    {'1': 'plat', '3': 2, '4': 1, '5': 5, '10': 'plat'},\n    {'1': 'fps', '3': 3, '4': 1, '5': 5, '10': 'fps'},\n    {'1': 'time', '3': 4, '4': 1, '5': 3, '10': 'time'},\n    {'1': 'mask_url', '3': 5, '4': 1, '5': 9, '10': 'maskUrl'},\n  ],\n};\n\n/// Descriptor for `VideoMask`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List videoMaskDescriptor = $convert.base64Decode(\n    'CglWaWRlb01hc2sSEAoDY2lkGAEgASgDUgNjaWQSEgoEcGxhdBgCIAEoBVIEcGxhdBIQCgNmcH'\n    'MYAyABKAVSA2ZwcxISCgR0aW1lGAQgASgDUgR0aW1lEhkKCG1hc2tfdXJsGAUgASgJUgdtYXNr'\n    'VXJs');\n\n@$core.Deprecated('Use videoSubtitleDescriptor instead')\nconst VideoSubtitle$json = {\n  '1': 'VideoSubtitle',\n  '2': [\n    {'1': 'lan', '3': 1, '4': 1, '5': 9, '10': 'lan'},\n    {'1': 'lan_doc', '3': 2, '4': 1, '5': 9, '10': 'lanDoc'},\n    {\n      '1': 'subtitles',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.community.service.dm.v1.SubtitleItem',\n      '10': 'subtitles'\n    },\n  ],\n};\n\n/// Descriptor for `VideoSubtitle`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List videoSubtitleDescriptor = $convert.base64Decode(\n    'Cg1WaWRlb1N1YnRpdGxlEhAKA2xhbhgBIAEoCVIDbGFuEhcKB2xhbl9kb2MYAiABKAlSBmxhbk'\n    'RvYxJMCglzdWJ0aXRsZXMYAyADKAsyLi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52'\n    'MS5TdWJ0aXRsZUl0ZW1SCXN1YnRpdGxlcw==');\n\n@$core.Deprecated('Use viewHerdDmElemDescriptor instead')\nconst ViewHerdDmElem$json = {\n  '1': 'ViewHerdDmElem',\n  '2': [\n    {'1': 'herd_msg', '3': 1, '4': 1, '5': 9, '10': 'herdMsg'},\n    {'1': 'herd_start_cnt', '3': 2, '4': 1, '5': 5, '10': 'herdStartCnt'},\n    {'1': 'herd_end_cnt', '3': 3, '4': 1, '5': 5, '10': 'herdEndCnt'},\n    {'1': 'regex_rule', '3': 4, '4': 1, '5': 9, '10': 'regexRule'},\n    {'1': 'start_progress', '3': 5, '4': 1, '5': 5, '10': 'startProgress'},\n    {'1': 'end_progress', '3': 6, '4': 1, '5': 5, '10': 'endProgress'},\n  ],\n};\n\n/// Descriptor for `ViewHerdDmElem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List viewHerdDmElemDescriptor = $convert.base64Decode(\n    'Cg5WaWV3SGVyZERtRWxlbRIZCghoZXJkX21zZxgBIAEoCVIHaGVyZE1zZxIkCg5oZXJkX3N0YX'\n    'J0X2NudBgCIAEoBVIMaGVyZFN0YXJ0Q250EiAKDGhlcmRfZW5kX2NudBgDIAEoBVIKaGVyZEVu'\n    'ZENudBIdCgpyZWdleF9ydWxlGAQgASgJUglyZWdleFJ1bGUSJQoOc3RhcnRfcHJvZ3Jlc3MYBS'\n    'ABKAVSDXN0YXJ0UHJvZ3Jlc3MSIQoMZW5kX3Byb2dyZXNzGAYgASgFUgtlbmRQcm9ncmVzcw==');\n"
  },
  {
    "path": "lib/grpc/bilibili/dagw/component/avatar/common.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/dagw/component/avatar/common.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nimport 'common.pbenum.dart';\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nexport 'common.pbenum.dart';\n\nclass BasicRenderSpec extends $pb.GeneratedMessage {\n  factory BasicRenderSpec({\n    $core.double? opacity,\n  }) {\n    final result = create();\n    if (opacity != null) result.opacity = opacity;\n    return result;\n  }\n\n  BasicRenderSpec._();\n\n  factory BasicRenderSpec.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BasicRenderSpec.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BasicRenderSpec',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.common'),\n      createEmptyInstance: create)\n    ..aD(1, _omitFieldNames ? '' : 'opacity')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BasicRenderSpec clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BasicRenderSpec copyWith(void Function(BasicRenderSpec) updates) =>\n      super.copyWith((message) => updates(message as BasicRenderSpec))\n          as BasicRenderSpec;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BasicRenderSpec create() => BasicRenderSpec._();\n  @$core.override\n  BasicRenderSpec createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BasicRenderSpec getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<BasicRenderSpec>(create);\n  static BasicRenderSpec? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.double get opacity => $_getN(0);\n  @$pb.TagNumber(1)\n  set opacity($core.double value) => $_setDouble(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOpacity() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOpacity() => $_clearField(1);\n}\n\nclass ColorConfig extends $pb.GeneratedMessage {\n  factory ColorConfig({\n    $core.bool? isDarkModeAware,\n    ColorSpec? day,\n    ColorSpec? night,\n  }) {\n    final result = create();\n    if (isDarkModeAware != null) result.isDarkModeAware = isDarkModeAware;\n    if (day != null) result.day = day;\n    if (night != null) result.night = night;\n    return result;\n  }\n\n  ColorConfig._();\n\n  factory ColorConfig.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ColorConfig.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ColorConfig',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.common'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'isDarkModeAware')\n    ..aOM<ColorSpec>(2, _omitFieldNames ? '' : 'day',\n        subBuilder: ColorSpec.create)\n    ..aOM<ColorSpec>(3, _omitFieldNames ? '' : 'night',\n        subBuilder: ColorSpec.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ColorConfig clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ColorConfig copyWith(void Function(ColorConfig) updates) =>\n      super.copyWith((message) => updates(message as ColorConfig))\n          as ColorConfig;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ColorConfig create() => ColorConfig._();\n  @$core.override\n  ColorConfig createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ColorConfig getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ColorConfig>(create);\n  static ColorConfig? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get isDarkModeAware => $_getBF(0);\n  @$pb.TagNumber(1)\n  set isDarkModeAware($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIsDarkModeAware() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIsDarkModeAware() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  ColorSpec get day => $_getN(1);\n  @$pb.TagNumber(2)\n  set day(ColorSpec value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDay() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDay() => $_clearField(2);\n  @$pb.TagNumber(2)\n  ColorSpec ensureDay() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  ColorSpec get night => $_getN(2);\n  @$pb.TagNumber(3)\n  set night(ColorSpec value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasNight() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearNight() => $_clearField(3);\n  @$pb.TagNumber(3)\n  ColorSpec ensureNight() => $_ensure(2);\n}\n\nclass ColorSpec extends $pb.GeneratedMessage {\n  factory ColorSpec({\n    $core.String? argb,\n  }) {\n    final result = create();\n    if (argb != null) result.argb = argb;\n    return result;\n  }\n\n  ColorSpec._();\n\n  factory ColorSpec.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ColorSpec.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ColorSpec',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'argb')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ColorSpec clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ColorSpec copyWith(void Function(ColorSpec) updates) =>\n      super.copyWith((message) => updates(message as ColorSpec)) as ColorSpec;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ColorSpec create() => ColorSpec._();\n  @$core.override\n  ColorSpec createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ColorSpec getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ColorSpec>(create);\n  static ColorSpec? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get argb => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set argb($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasArgb() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearArgb() => $_clearField(1);\n}\n\nclass LayerGeneralSpec extends $pb.GeneratedMessage {\n  factory LayerGeneralSpec({\n    PositionSpec? posSpec,\n    SizeSpec? sizeSpec,\n    BasicRenderSpec? renderSpec,\n  }) {\n    final result = create();\n    if (posSpec != null) result.posSpec = posSpec;\n    if (sizeSpec != null) result.sizeSpec = sizeSpec;\n    if (renderSpec != null) result.renderSpec = renderSpec;\n    return result;\n  }\n\n  LayerGeneralSpec._();\n\n  factory LayerGeneralSpec.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LayerGeneralSpec.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LayerGeneralSpec',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.common'),\n      createEmptyInstance: create)\n    ..aOM<PositionSpec>(1, _omitFieldNames ? '' : 'posSpec',\n        subBuilder: PositionSpec.create)\n    ..aOM<SizeSpec>(2, _omitFieldNames ? '' : 'sizeSpec',\n        subBuilder: SizeSpec.create)\n    ..aOM<BasicRenderSpec>(3, _omitFieldNames ? '' : 'renderSpec',\n        subBuilder: BasicRenderSpec.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LayerGeneralSpec clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LayerGeneralSpec copyWith(void Function(LayerGeneralSpec) updates) =>\n      super.copyWith((message) => updates(message as LayerGeneralSpec))\n          as LayerGeneralSpec;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LayerGeneralSpec create() => LayerGeneralSpec._();\n  @$core.override\n  LayerGeneralSpec createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LayerGeneralSpec getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LayerGeneralSpec>(create);\n  static LayerGeneralSpec? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PositionSpec get posSpec => $_getN(0);\n  @$pb.TagNumber(1)\n  set posSpec(PositionSpec value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPosSpec() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPosSpec() => $_clearField(1);\n  @$pb.TagNumber(1)\n  PositionSpec ensurePosSpec() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  SizeSpec get sizeSpec => $_getN(1);\n  @$pb.TagNumber(2)\n  set sizeSpec(SizeSpec value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSizeSpec() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSizeSpec() => $_clearField(2);\n  @$pb.TagNumber(2)\n  SizeSpec ensureSizeSpec() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  BasicRenderSpec get renderSpec => $_getN(2);\n  @$pb.TagNumber(3)\n  set renderSpec(BasicRenderSpec value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRenderSpec() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRenderSpec() => $_clearField(3);\n  @$pb.TagNumber(3)\n  BasicRenderSpec ensureRenderSpec() => $_ensure(2);\n}\n\nclass MaskProperty extends $pb.GeneratedMessage {\n  factory MaskProperty({\n    LayerGeneralSpec? generalSpec,\n    ResourceSource? maskSrc,\n  }) {\n    final result = create();\n    if (generalSpec != null) result.generalSpec = generalSpec;\n    if (maskSrc != null) result.maskSrc = maskSrc;\n    return result;\n  }\n\n  MaskProperty._();\n\n  factory MaskProperty.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MaskProperty.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MaskProperty',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.common'),\n      createEmptyInstance: create)\n    ..aOM<LayerGeneralSpec>(1, _omitFieldNames ? '' : 'generalSpec',\n        subBuilder: LayerGeneralSpec.create)\n    ..aOM<ResourceSource>(2, _omitFieldNames ? '' : 'maskSrc',\n        subBuilder: ResourceSource.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MaskProperty clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MaskProperty copyWith(void Function(MaskProperty) updates) =>\n      super.copyWith((message) => updates(message as MaskProperty))\n          as MaskProperty;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MaskProperty create() => MaskProperty._();\n  @$core.override\n  MaskProperty createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MaskProperty getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MaskProperty>(create);\n  static MaskProperty? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  LayerGeneralSpec get generalSpec => $_getN(0);\n  @$pb.TagNumber(1)\n  set generalSpec(LayerGeneralSpec value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasGeneralSpec() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearGeneralSpec() => $_clearField(1);\n  @$pb.TagNumber(1)\n  LayerGeneralSpec ensureGeneralSpec() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  ResourceSource get maskSrc => $_getN(1);\n  @$pb.TagNumber(2)\n  set maskSrc(ResourceSource value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMaskSrc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMaskSrc() => $_clearField(2);\n  @$pb.TagNumber(2)\n  ResourceSource ensureMaskSrc() => $_ensure(1);\n}\n\nclass NativeDrawRes extends $pb.GeneratedMessage {\n  factory NativeDrawRes({\n    NativeDrawRes_NativeDraw? drawType,\n    NativeDrawRes_FillMode? fillMode,\n    ColorConfig? colorConfig,\n    $core.double? edgeWeight,\n  }) {\n    final result = create();\n    if (drawType != null) result.drawType = drawType;\n    if (fillMode != null) result.fillMode = fillMode;\n    if (colorConfig != null) result.colorConfig = colorConfig;\n    if (edgeWeight != null) result.edgeWeight = edgeWeight;\n    return result;\n  }\n\n  NativeDrawRes._();\n\n  factory NativeDrawRes.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory NativeDrawRes.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'NativeDrawRes',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.common'),\n      createEmptyInstance: create)\n    ..aE<NativeDrawRes_NativeDraw>(1, _omitFieldNames ? '' : 'drawType',\n        enumValues: NativeDrawRes_NativeDraw.values)\n    ..aE<NativeDrawRes_FillMode>(2, _omitFieldNames ? '' : 'fillMode',\n        enumValues: NativeDrawRes_FillMode.values)\n    ..aOM<ColorConfig>(3, _omitFieldNames ? '' : 'colorConfig',\n        subBuilder: ColorConfig.create)\n    ..aD(4, _omitFieldNames ? '' : 'edgeWeight')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NativeDrawRes clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NativeDrawRes copyWith(void Function(NativeDrawRes) updates) =>\n      super.copyWith((message) => updates(message as NativeDrawRes))\n          as NativeDrawRes;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static NativeDrawRes create() => NativeDrawRes._();\n  @$core.override\n  NativeDrawRes createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static NativeDrawRes getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<NativeDrawRes>(create);\n  static NativeDrawRes? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  NativeDrawRes_NativeDraw get drawType => $_getN(0);\n  @$pb.TagNumber(1)\n  set drawType(NativeDrawRes_NativeDraw value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDrawType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDrawType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  NativeDrawRes_FillMode get fillMode => $_getN(1);\n  @$pb.TagNumber(2)\n  set fillMode(NativeDrawRes_FillMode value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFillMode() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFillMode() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  ColorConfig get colorConfig => $_getN(2);\n  @$pb.TagNumber(3)\n  set colorConfig(ColorConfig value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasColorConfig() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearColorConfig() => $_clearField(3);\n  @$pb.TagNumber(3)\n  ColorConfig ensureColorConfig() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.double get edgeWeight => $_getN(3);\n  @$pb.TagNumber(4)\n  set edgeWeight($core.double value) => $_setDouble(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasEdgeWeight() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearEdgeWeight() => $_clearField(4);\n}\n\nclass PositionSpec extends $pb.GeneratedMessage {\n  factory PositionSpec({\n    PositionSpec_CoordinatePos? coordinatePos,\n    $core.double? axisX,\n    $core.double? axisY,\n  }) {\n    final result = create();\n    if (coordinatePos != null) result.coordinatePos = coordinatePos;\n    if (axisX != null) result.axisX = axisX;\n    if (axisY != null) result.axisY = axisY;\n    return result;\n  }\n\n  PositionSpec._();\n\n  factory PositionSpec.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PositionSpec.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PositionSpec',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.common'),\n      createEmptyInstance: create)\n    ..aE<PositionSpec_CoordinatePos>(1, _omitFieldNames ? '' : 'coordinatePos',\n        enumValues: PositionSpec_CoordinatePos.values)\n    ..aD(2, _omitFieldNames ? '' : 'axisX')\n    ..aD(3, _omitFieldNames ? '' : 'axisY')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PositionSpec clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PositionSpec copyWith(void Function(PositionSpec) updates) =>\n      super.copyWith((message) => updates(message as PositionSpec))\n          as PositionSpec;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PositionSpec create() => PositionSpec._();\n  @$core.override\n  PositionSpec createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PositionSpec getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PositionSpec>(create);\n  static PositionSpec? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  PositionSpec_CoordinatePos get coordinatePos => $_getN(0);\n  @$pb.TagNumber(1)\n  set coordinatePos(PositionSpec_CoordinatePos value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCoordinatePos() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCoordinatePos() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.double get axisX => $_getN(1);\n  @$pb.TagNumber(2)\n  set axisX($core.double value) => $_setDouble(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAxisX() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAxisX() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.double get axisY => $_getN(2);\n  @$pb.TagNumber(3)\n  set axisY($core.double value) => $_setDouble(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAxisY() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAxisY() => $_clearField(3);\n}\n\nclass RemoteRes extends $pb.GeneratedMessage {\n  factory RemoteRes({\n    $core.String? url,\n    $core.String? bfsStyle,\n  }) {\n    final result = create();\n    if (url != null) result.url = url;\n    if (bfsStyle != null) result.bfsStyle = bfsStyle;\n    return result;\n  }\n\n  RemoteRes._();\n\n  factory RemoteRes.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RemoteRes.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RemoteRes',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.common'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'url')\n    ..aOS(2, _omitFieldNames ? '' : 'bfsStyle')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RemoteRes clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RemoteRes copyWith(void Function(RemoteRes) updates) =>\n      super.copyWith((message) => updates(message as RemoteRes)) as RemoteRes;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RemoteRes create() => RemoteRes._();\n  @$core.override\n  RemoteRes createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RemoteRes getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<RemoteRes>(create);\n  static RemoteRes? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get url => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set url($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUrl() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get bfsStyle => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set bfsStyle($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBfsStyle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBfsStyle() => $_clearField(2);\n}\n\nenum ResourceSource_Res { remote, localValue, draw, notSet }\n\nclass ResourceSource extends $pb.GeneratedMessage {\n  factory ResourceSource({\n    ResourceSource_SourceType? srcType,\n    ResourceSource_LocalRes? placeholder,\n    RemoteRes? remote,\n    $core.int? localValue,\n    NativeDrawRes? draw,\n  }) {\n    final result = create();\n    if (srcType != null) result.srcType = srcType;\n    if (placeholder != null) result.placeholder = placeholder;\n    if (remote != null) result.remote = remote;\n    if (localValue != null) result.localValue = localValue;\n    if (draw != null) result.draw = draw;\n    return result;\n  }\n\n  ResourceSource._();\n\n  factory ResourceSource.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ResourceSource.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, ResourceSource_Res>\n      _ResourceSource_ResByTag = {\n    3: ResourceSource_Res.remote,\n    4: ResourceSource_Res.localValue,\n    5: ResourceSource_Res.draw,\n    0: ResourceSource_Res.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ResourceSource',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.common'),\n      createEmptyInstance: create)\n    ..oo(0, [3, 4, 5])\n    ..aE<ResourceSource_SourceType>(1, _omitFieldNames ? '' : 'srcType',\n        enumValues: ResourceSource_SourceType.values)\n    ..aE<ResourceSource_LocalRes>(2, _omitFieldNames ? '' : 'placeholder',\n        enumValues: ResourceSource_LocalRes.values)\n    ..aOM<RemoteRes>(3, _omitFieldNames ? '' : 'remote',\n        subBuilder: RemoteRes.create)\n    ..aI(4, _omitFieldNames ? '' : 'localValue')\n    ..aOM<NativeDrawRes>(5, _omitFieldNames ? '' : 'draw',\n        subBuilder: NativeDrawRes.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ResourceSource clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ResourceSource copyWith(void Function(ResourceSource) updates) =>\n      super.copyWith((message) => updates(message as ResourceSource))\n          as ResourceSource;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ResourceSource create() => ResourceSource._();\n  @$core.override\n  ResourceSource createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ResourceSource getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ResourceSource>(create);\n  static ResourceSource? _defaultInstance;\n\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  ResourceSource_Res whichRes() => _ResourceSource_ResByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  void clearRes() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  ResourceSource_SourceType get srcType => $_getN(0);\n  @$pb.TagNumber(1)\n  set srcType(ResourceSource_SourceType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSrcType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSrcType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  ResourceSource_LocalRes get placeholder => $_getN(1);\n  @$pb.TagNumber(2)\n  set placeholder(ResourceSource_LocalRes value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPlaceholder() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPlaceholder() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  RemoteRes get remote => $_getN(2);\n  @$pb.TagNumber(3)\n  set remote(RemoteRes value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRemote() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRemote() => $_clearField(3);\n  @$pb.TagNumber(3)\n  RemoteRes ensureRemote() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.int get localValue => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set localValue($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLocalValue() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLocalValue() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  NativeDrawRes get draw => $_getN(4);\n  @$pb.TagNumber(5)\n  set draw(NativeDrawRes value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDraw() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDraw() => $_clearField(5);\n  @$pb.TagNumber(5)\n  NativeDrawRes ensureDraw() => $_ensure(4);\n}\n\nclass SizeSpec extends $pb.GeneratedMessage {\n  factory SizeSpec({\n    $core.double? width,\n    $core.double? height,\n  }) {\n    final result = create();\n    if (width != null) result.width = width;\n    if (height != null) result.height = height;\n    return result;\n  }\n\n  SizeSpec._();\n\n  factory SizeSpec.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SizeSpec.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SizeSpec',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.common'),\n      createEmptyInstance: create)\n    ..aD(1, _omitFieldNames ? '' : 'width')\n    ..aD(2, _omitFieldNames ? '' : 'height')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SizeSpec clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SizeSpec copyWith(void Function(SizeSpec) updates) =>\n      super.copyWith((message) => updates(message as SizeSpec)) as SizeSpec;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SizeSpec create() => SizeSpec._();\n  @$core.override\n  SizeSpec createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SizeSpec getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<SizeSpec>(create);\n  static SizeSpec? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.double get width => $_getN(0);\n  @$pb.TagNumber(1)\n  set width($core.double value) => $_setDouble(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasWidth() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearWidth() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.double get height => $_getN(1);\n  @$pb.TagNumber(2)\n  set height($core.double value) => $_setDouble(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHeight() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHeight() => $_clearField(2);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/dagw/component/avatar/common.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/dagw/component/avatar/common.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nclass NativeDrawRes_FillMode extends $pb.ProtobufEnum {\n  static const NativeDrawRes_FillMode FILL_MODE_INVALID =\n      NativeDrawRes_FillMode._(0, _omitEnumNames ? '' : 'FILL_MODE_INVALID');\n  static const NativeDrawRes_FillMode FILL_MODE_INTERNAL =\n      NativeDrawRes_FillMode._(1, _omitEnumNames ? '' : 'FILL_MODE_INTERNAL');\n  static const NativeDrawRes_FillMode FILL_MODE_EDGE =\n      NativeDrawRes_FillMode._(2, _omitEnumNames ? '' : 'FILL_MODE_EDGE');\n\n  static const $core.List<NativeDrawRes_FillMode> values =\n      <NativeDrawRes_FillMode>[\n    FILL_MODE_INVALID,\n    FILL_MODE_INTERNAL,\n    FILL_MODE_EDGE,\n  ];\n\n  static final $core.List<NativeDrawRes_FillMode?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static NativeDrawRes_FillMode? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const NativeDrawRes_FillMode._(super.value, super.name);\n}\n\nclass NativeDrawRes_NativeDraw extends $pb.ProtobufEnum {\n  static const NativeDrawRes_NativeDraw DRAW_INVALID =\n      NativeDrawRes_NativeDraw._(0, _omitEnumNames ? '' : 'DRAW_INVALID');\n  static const NativeDrawRes_NativeDraw DRAW_CIRCLE =\n      NativeDrawRes_NativeDraw._(1, _omitEnumNames ? '' : 'DRAW_CIRCLE');\n  static const NativeDrawRes_NativeDraw DRAW_RECTANGLE =\n      NativeDrawRes_NativeDraw._(2, _omitEnumNames ? '' : 'DRAW_RECTANGLE');\n\n  static const $core.List<NativeDrawRes_NativeDraw> values =\n      <NativeDrawRes_NativeDraw>[\n    DRAW_INVALID,\n    DRAW_CIRCLE,\n    DRAW_RECTANGLE,\n  ];\n\n  static final $core.List<NativeDrawRes_NativeDraw?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static NativeDrawRes_NativeDraw? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const NativeDrawRes_NativeDraw._(super.value, super.name);\n}\n\nclass PositionSpec_CoordinatePos extends $pb.ProtobufEnum {\n  static const PositionSpec_CoordinatePos INVALID_COORDINATE =\n      PositionSpec_CoordinatePos._(\n          0, _omitEnumNames ? '' : 'INVALID_COORDINATE');\n  static const PositionSpec_CoordinatePos DEFAULT_COORDINATE =\n      PositionSpec_CoordinatePos._(\n          1, _omitEnumNames ? '' : 'DEFAULT_COORDINATE');\n  static const PositionSpec_CoordinatePos CENTRAL_COORDINATE =\n      PositionSpec_CoordinatePos._(\n          2, _omitEnumNames ? '' : 'CENTRAL_COORDINATE');\n\n  static const $core.List<PositionSpec_CoordinatePos> values =\n      <PositionSpec_CoordinatePos>[\n    INVALID_COORDINATE,\n    DEFAULT_COORDINATE,\n    CENTRAL_COORDINATE,\n  ];\n\n  static final $core.List<PositionSpec_CoordinatePos?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static PositionSpec_CoordinatePos? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const PositionSpec_CoordinatePos._(super.value, super.name);\n}\n\nclass ResourceSource_LocalRes extends $pb.ProtobufEnum {\n  static const ResourceSource_LocalRes LOCAL_RES_INVALID =\n      ResourceSource_LocalRes._(0, _omitEnumNames ? '' : 'LOCAL_RES_INVALID');\n  static const ResourceSource_LocalRes LOCAL_RES_ICON_VIP =\n      ResourceSource_LocalRes._(1, _omitEnumNames ? '' : 'LOCAL_RES_ICON_VIP');\n  static const ResourceSource_LocalRes LOCAL_RES_ICON_SMALL_VIP =\n      ResourceSource_LocalRes._(\n          2, _omitEnumNames ? '' : 'LOCAL_RES_ICON_SMALL_VIP');\n  static const ResourceSource_LocalRes LOCAL_RES_ICON_PERSONAL_VERIFY =\n      ResourceSource_LocalRes._(\n          3, _omitEnumNames ? '' : 'LOCAL_RES_ICON_PERSONAL_VERIFY');\n  static const ResourceSource_LocalRes LOCAL_RES_ICON_ENTERPRISE_VERIFY =\n      ResourceSource_LocalRes._(\n          4, _omitEnumNames ? '' : 'LOCAL_RES_ICON_ENTERPRISE_VERIFY');\n  static const ResourceSource_LocalRes LOCAL_RES_ICON_NFT_MAINLAND =\n      ResourceSource_LocalRes._(\n          5, _omitEnumNames ? '' : 'LOCAL_RES_ICON_NFT_MAINLAND');\n  static const ResourceSource_LocalRes LOCAL_RES_DEFAULT_AVATAR =\n      ResourceSource_LocalRes._(\n          6, _omitEnumNames ? '' : 'LOCAL_RES_DEFAULT_AVATAR');\n  static const ResourceSource_LocalRes LOCAL_RES_FOLLOW_ICON =\n      ResourceSource_LocalRes._(\n          7, _omitEnumNames ? '' : 'LOCAL_RES_FOLLOW_ICON');\n  static const ResourceSource_LocalRes LOCAL_RES_FOLLOW_ACTION =\n      ResourceSource_LocalRes._(\n          8, _omitEnumNames ? '' : 'LOCAL_RES_FOLLOW_ACTION');\n\n  static const $core.List<ResourceSource_LocalRes> values =\n      <ResourceSource_LocalRes>[\n    LOCAL_RES_INVALID,\n    LOCAL_RES_ICON_VIP,\n    LOCAL_RES_ICON_SMALL_VIP,\n    LOCAL_RES_ICON_PERSONAL_VERIFY,\n    LOCAL_RES_ICON_ENTERPRISE_VERIFY,\n    LOCAL_RES_ICON_NFT_MAINLAND,\n    LOCAL_RES_DEFAULT_AVATAR,\n    LOCAL_RES_FOLLOW_ICON,\n    LOCAL_RES_FOLLOW_ACTION,\n  ];\n\n  static final $core.List<ResourceSource_LocalRes?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 8);\n  static ResourceSource_LocalRes? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ResourceSource_LocalRes._(super.value, super.name);\n}\n\nclass ResourceSource_SourceType extends $pb.ProtobufEnum {\n  static const ResourceSource_SourceType SRC_TYPE_INVALID =\n      ResourceSource_SourceType._(0, _omitEnumNames ? '' : 'SRC_TYPE_INVALID');\n  static const ResourceSource_SourceType SRC_TYPE_URL =\n      ResourceSource_SourceType._(1, _omitEnumNames ? '' : 'SRC_TYPE_URL');\n  static const ResourceSource_SourceType SRC_TYPE_LOCAL =\n      ResourceSource_SourceType._(2, _omitEnumNames ? '' : 'SRC_TYPE_LOCAL');\n  static const ResourceSource_SourceType SRC_TYPE_DRAW =\n      ResourceSource_SourceType._(3, _omitEnumNames ? '' : 'SRC_TYPE_DRAW');\n\n  static const $core.List<ResourceSource_SourceType> values =\n      <ResourceSource_SourceType>[\n    SRC_TYPE_INVALID,\n    SRC_TYPE_URL,\n    SRC_TYPE_LOCAL,\n    SRC_TYPE_DRAW,\n  ];\n\n  static final $core.List<ResourceSource_SourceType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static ResourceSource_SourceType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ResourceSource_SourceType._(super.value, super.name);\n}\n\nconst $core.bool _omitEnumNames =\n    $core.bool.fromEnvironment('protobuf.omit_enum_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/dagw/component/avatar/common.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/dagw/component/avatar/common.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use basicRenderSpecDescriptor instead')\nconst BasicRenderSpec$json = {\n  '1': 'BasicRenderSpec',\n  '2': [\n    {'1': 'opacity', '3': 1, '4': 1, '5': 1, '10': 'opacity'},\n  ],\n};\n\n/// Descriptor for `BasicRenderSpec`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List basicRenderSpecDescriptor = $convert.base64Decode(\n    'Cg9CYXNpY1JlbmRlclNwZWMSGAoHb3BhY2l0eRgBIAEoAVIHb3BhY2l0eQ==');\n\n@$core.Deprecated('Use colorConfigDescriptor instead')\nconst ColorConfig$json = {\n  '1': 'ColorConfig',\n  '2': [\n    {\n      '1': 'is_dark_mode_aware',\n      '3': 1,\n      '4': 1,\n      '5': 8,\n      '10': 'isDarkModeAware'\n    },\n    {\n      '1': 'day',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.common.ColorSpec',\n      '10': 'day'\n    },\n    {\n      '1': 'night',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.common.ColorSpec',\n      '10': 'night'\n    },\n  ],\n};\n\n/// Descriptor for `ColorConfig`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List colorConfigDescriptor = $convert.base64Decode(\n    'CgtDb2xvckNvbmZpZxIrChJpc19kYXJrX21vZGVfYXdhcmUYASABKAhSD2lzRGFya01vZGVBd2'\n    'FyZRJCCgNkYXkYAiABKAsyMC5iaWxpYmlsaS5kYWd3LmNvbXBvbmVudC5hdmF0YXIuY29tbW9u'\n    'LkNvbG9yU3BlY1IDZGF5EkYKBW5pZ2h0GAMgASgLMjAuYmlsaWJpbGkuZGFndy5jb21wb25lbn'\n    'QuYXZhdGFyLmNvbW1vbi5Db2xvclNwZWNSBW5pZ2h0');\n\n@$core.Deprecated('Use colorSpecDescriptor instead')\nconst ColorSpec$json = {\n  '1': 'ColorSpec',\n  '2': [\n    {'1': 'argb', '3': 1, '4': 1, '5': 9, '10': 'argb'},\n  ],\n};\n\n/// Descriptor for `ColorSpec`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List colorSpecDescriptor =\n    $convert.base64Decode('CglDb2xvclNwZWMSEgoEYXJnYhgBIAEoCVIEYXJnYg==');\n\n@$core.Deprecated('Use layerGeneralSpecDescriptor instead')\nconst LayerGeneralSpec$json = {\n  '1': 'LayerGeneralSpec',\n  '2': [\n    {\n      '1': 'pos_spec',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.common.PositionSpec',\n      '10': 'posSpec'\n    },\n    {\n      '1': 'size_spec',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.common.SizeSpec',\n      '10': 'sizeSpec'\n    },\n    {\n      '1': 'render_spec',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.common.BasicRenderSpec',\n      '10': 'renderSpec'\n    },\n  ],\n};\n\n/// Descriptor for `LayerGeneralSpec`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List layerGeneralSpecDescriptor = $convert.base64Decode(\n    'ChBMYXllckdlbmVyYWxTcGVjEk4KCHBvc19zcGVjGAEgASgLMjMuYmlsaWJpbGkuZGFndy5jb2'\n    '1wb25lbnQuYXZhdGFyLmNvbW1vbi5Qb3NpdGlvblNwZWNSB3Bvc1NwZWMSTAoJc2l6ZV9zcGVj'\n    'GAIgASgLMi8uYmlsaWJpbGkuZGFndy5jb21wb25lbnQuYXZhdGFyLmNvbW1vbi5TaXplU3BlY1'\n    'IIc2l6ZVNwZWMSVwoLcmVuZGVyX3NwZWMYAyABKAsyNi5iaWxpYmlsaS5kYWd3LmNvbXBvbmVu'\n    'dC5hdmF0YXIuY29tbW9uLkJhc2ljUmVuZGVyU3BlY1IKcmVuZGVyU3BlYw==');\n\n@$core.Deprecated('Use maskPropertyDescriptor instead')\nconst MaskProperty$json = {\n  '1': 'MaskProperty',\n  '2': [\n    {\n      '1': 'general_spec',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.common.LayerGeneralSpec',\n      '10': 'generalSpec'\n    },\n    {\n      '1': 'mask_src',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.common.ResourceSource',\n      '10': 'maskSrc'\n    },\n  ],\n};\n\n/// Descriptor for `MaskProperty`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List maskPropertyDescriptor = $convert.base64Decode(\n    'CgxNYXNrUHJvcGVydHkSWgoMZ2VuZXJhbF9zcGVjGAEgASgLMjcuYmlsaWJpbGkuZGFndy5jb2'\n    '1wb25lbnQuYXZhdGFyLmNvbW1vbi5MYXllckdlbmVyYWxTcGVjUgtnZW5lcmFsU3BlYxJQCght'\n    'YXNrX3NyYxgCIAEoCzI1LmJpbGliaWxpLmRhZ3cuY29tcG9uZW50LmF2YXRhci5jb21tb24uUm'\n    'Vzb3VyY2VTb3VyY2VSB21hc2tTcmM=');\n\n@$core.Deprecated('Use nativeDrawResDescriptor instead')\nconst NativeDrawRes$json = {\n  '1': 'NativeDrawRes',\n  '2': [\n    {\n      '1': 'draw_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.dagw.component.avatar.common.NativeDrawRes.NativeDraw',\n      '10': 'drawType'\n    },\n    {\n      '1': 'fill_mode',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.dagw.component.avatar.common.NativeDrawRes.FillMode',\n      '10': 'fillMode'\n    },\n    {\n      '1': 'color_config',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.common.ColorConfig',\n      '10': 'colorConfig'\n    },\n    {'1': 'edge_weight', '3': 4, '4': 1, '5': 1, '10': 'edgeWeight'},\n  ],\n  '4': [NativeDrawRes_FillMode$json, NativeDrawRes_NativeDraw$json],\n};\n\n@$core.Deprecated('Use nativeDrawResDescriptor instead')\nconst NativeDrawRes_FillMode$json = {\n  '1': 'FillMode',\n  '2': [\n    {'1': 'FILL_MODE_INVALID', '2': 0},\n    {'1': 'FILL_MODE_INTERNAL', '2': 1},\n    {'1': 'FILL_MODE_EDGE', '2': 2},\n  ],\n};\n\n@$core.Deprecated('Use nativeDrawResDescriptor instead')\nconst NativeDrawRes_NativeDraw$json = {\n  '1': 'NativeDraw',\n  '2': [\n    {'1': 'DRAW_INVALID', '2': 0},\n    {'1': 'DRAW_CIRCLE', '2': 1},\n    {'1': 'DRAW_RECTANGLE', '2': 2},\n  ],\n};\n\n/// Descriptor for `NativeDrawRes`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List nativeDrawResDescriptor = $convert.base64Decode(\n    'Cg1OYXRpdmVEcmF3UmVzElwKCWRyYXdfdHlwZRgBIAEoDjI/LmJpbGliaWxpLmRhZ3cuY29tcG'\n    '9uZW50LmF2YXRhci5jb21tb24uTmF0aXZlRHJhd1Jlcy5OYXRpdmVEcmF3UghkcmF3VHlwZRJa'\n    'CglmaWxsX21vZGUYAiABKA4yPS5iaWxpYmlsaS5kYWd3LmNvbXBvbmVudC5hdmF0YXIuY29tbW'\n    '9uLk5hdGl2ZURyYXdSZXMuRmlsbE1vZGVSCGZpbGxNb2RlElUKDGNvbG9yX2NvbmZpZxgDIAEo'\n    'CzIyLmJpbGliaWxpLmRhZ3cuY29tcG9uZW50LmF2YXRhci5jb21tb24uQ29sb3JDb25maWdSC2'\n    'NvbG9yQ29uZmlnEh8KC2VkZ2Vfd2VpZ2h0GAQgASgBUgplZGdlV2VpZ2h0Ik0KCEZpbGxNb2Rl'\n    'EhUKEUZJTExfTU9ERV9JTlZBTElEEAASFgoSRklMTF9NT0RFX0lOVEVSTkFMEAESEgoORklMTF'\n    '9NT0RFX0VER0UQAiJDCgpOYXRpdmVEcmF3EhAKDERSQVdfSU5WQUxJRBAAEg8KC0RSQVdfQ0lS'\n    'Q0xFEAESEgoORFJBV19SRUNUQU5HTEUQAg==');\n\n@$core.Deprecated('Use positionSpecDescriptor instead')\nconst PositionSpec$json = {\n  '1': 'PositionSpec',\n  '2': [\n    {\n      '1': 'coordinate_pos',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.dagw.component.avatar.common.PositionSpec.CoordinatePos',\n      '10': 'coordinatePos'\n    },\n    {'1': 'axis_x', '3': 2, '4': 1, '5': 1, '10': 'axisX'},\n    {'1': 'axis_y', '3': 3, '4': 1, '5': 1, '10': 'axisY'},\n  ],\n  '4': [PositionSpec_CoordinatePos$json],\n};\n\n@$core.Deprecated('Use positionSpecDescriptor instead')\nconst PositionSpec_CoordinatePos$json = {\n  '1': 'CoordinatePos',\n  '2': [\n    {'1': 'INVALID_COORDINATE', '2': 0},\n    {'1': 'DEFAULT_COORDINATE', '2': 1},\n    {'1': 'CENTRAL_COORDINATE', '2': 2},\n  ],\n};\n\n/// Descriptor for `PositionSpec`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List positionSpecDescriptor = $convert.base64Decode(\n    'CgxQb3NpdGlvblNwZWMSaAoOY29vcmRpbmF0ZV9wb3MYASABKA4yQS5iaWxpYmlsaS5kYWd3Lm'\n    'NvbXBvbmVudC5hdmF0YXIuY29tbW9uLlBvc2l0aW9uU3BlYy5Db29yZGluYXRlUG9zUg1jb29y'\n    'ZGluYXRlUG9zEhUKBmF4aXNfeBgCIAEoAVIFYXhpc1gSFQoGYXhpc195GAMgASgBUgVheGlzWS'\n    'JXCg1Db29yZGluYXRlUG9zEhYKEklOVkFMSURfQ09PUkRJTkFURRAAEhYKEkRFRkFVTFRfQ09P'\n    'UkRJTkFURRABEhYKEkNFTlRSQUxfQ09PUkRJTkFURRAC');\n\n@$core.Deprecated('Use remoteResDescriptor instead')\nconst RemoteRes$json = {\n  '1': 'RemoteRes',\n  '2': [\n    {'1': 'url', '3': 1, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'bfs_style', '3': 2, '4': 1, '5': 9, '10': 'bfsStyle'},\n  ],\n};\n\n/// Descriptor for `RemoteRes`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List remoteResDescriptor = $convert.base64Decode(\n    'CglSZW1vdGVSZXMSEAoDdXJsGAEgASgJUgN1cmwSGwoJYmZzX3N0eWxlGAIgASgJUghiZnNTdH'\n    'lsZQ==');\n\n@$core.Deprecated('Use resourceSourceDescriptor instead')\nconst ResourceSource$json = {\n  '1': 'ResourceSource',\n  '2': [\n    {\n      '1': 'remote',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.common.RemoteRes',\n      '9': 0,\n      '10': 'remote'\n    },\n    {'1': 'local_value', '3': 4, '4': 1, '5': 5, '9': 0, '10': 'localValue'},\n    {\n      '1': 'draw',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.common.NativeDrawRes',\n      '9': 0,\n      '10': 'draw'\n    },\n    {\n      '1': 'src_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.dagw.component.avatar.common.ResourceSource.SourceType',\n      '10': 'srcType'\n    },\n    {\n      '1': 'placeholder',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.dagw.component.avatar.common.ResourceSource.LocalRes',\n      '10': 'placeholder'\n    },\n  ],\n  '4': [ResourceSource_LocalRes$json, ResourceSource_SourceType$json],\n  '8': [\n    {'1': 'res'},\n  ],\n};\n\n@$core.Deprecated('Use resourceSourceDescriptor instead')\nconst ResourceSource_LocalRes$json = {\n  '1': 'LocalRes',\n  '2': [\n    {'1': 'LOCAL_RES_INVALID', '2': 0},\n    {'1': 'LOCAL_RES_ICON_VIP', '2': 1},\n    {'1': 'LOCAL_RES_ICON_SMALL_VIP', '2': 2},\n    {'1': 'LOCAL_RES_ICON_PERSONAL_VERIFY', '2': 3},\n    {'1': 'LOCAL_RES_ICON_ENTERPRISE_VERIFY', '2': 4},\n    {'1': 'LOCAL_RES_ICON_NFT_MAINLAND', '2': 5},\n    {'1': 'LOCAL_RES_DEFAULT_AVATAR', '2': 6},\n    {'1': 'LOCAL_RES_FOLLOW_ICON', '2': 7},\n    {'1': 'LOCAL_RES_FOLLOW_ACTION', '2': 8},\n  ],\n};\n\n@$core.Deprecated('Use resourceSourceDescriptor instead')\nconst ResourceSource_SourceType$json = {\n  '1': 'SourceType',\n  '2': [\n    {'1': 'SRC_TYPE_INVALID', '2': 0},\n    {'1': 'SRC_TYPE_URL', '2': 1},\n    {'1': 'SRC_TYPE_LOCAL', '2': 2},\n    {'1': 'SRC_TYPE_DRAW', '2': 3},\n  ],\n};\n\n/// Descriptor for `ResourceSource`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List resourceSourceDescriptor = $convert.base64Decode(\n    'Cg5SZXNvdXJjZVNvdXJjZRJKCgZyZW1vdGUYAyABKAsyMC5iaWxpYmlsaS5kYWd3LmNvbXBvbm'\n    'VudC5hdmF0YXIuY29tbW9uLlJlbW90ZVJlc0gAUgZyZW1vdGUSIQoLbG9jYWxfdmFsdWUYBCAB'\n    'KAVIAFIKbG9jYWxWYWx1ZRJKCgRkcmF3GAUgASgLMjQuYmlsaWJpbGkuZGFndy5jb21wb25lbn'\n    'QuYXZhdGFyLmNvbW1vbi5OYXRpdmVEcmF3UmVzSABSBGRyYXcSWwoIc3JjX3R5cGUYASABKA4y'\n    'QC5iaWxpYmlsaS5kYWd3LmNvbXBvbmVudC5hdmF0YXIuY29tbW9uLlJlc291cmNlU291cmNlLl'\n    'NvdXJjZVR5cGVSB3NyY1R5cGUSYAoLcGxhY2Vob2xkZXIYAiABKA4yPi5iaWxpYmlsaS5kYWd3'\n    'LmNvbXBvbmVudC5hdmF0YXIuY29tbW9uLlJlc291cmNlU291cmNlLkxvY2FsUmVzUgtwbGFjZW'\n    'hvbGRlciKYAgoITG9jYWxSZXMSFQoRTE9DQUxfUkVTX0lOVkFMSUQQABIWChJMT0NBTF9SRVNf'\n    'SUNPTl9WSVAQARIcChhMT0NBTF9SRVNfSUNPTl9TTUFMTF9WSVAQAhIiCh5MT0NBTF9SRVNfSU'\n    'NPTl9QRVJTT05BTF9WRVJJRlkQAxIkCiBMT0NBTF9SRVNfSUNPTl9FTlRFUlBSSVNFX1ZFUklG'\n    'WRAEEh8KG0xPQ0FMX1JFU19JQ09OX05GVF9NQUlOTEFORBAFEhwKGExPQ0FMX1JFU19ERUZBVU'\n    'xUX0FWQVRBUhAGEhkKFUxPQ0FMX1JFU19GT0xMT1dfSUNPThAHEhsKF0xPQ0FMX1JFU19GT0xM'\n    'T1dfQUNUSU9OEAgiWwoKU291cmNlVHlwZRIUChBTUkNfVFlQRV9JTlZBTElEEAASEAoMU1JDX1'\n    'RZUEVfVVJMEAESEgoOU1JDX1RZUEVfTE9DQUwQAhIRCg1TUkNfVFlQRV9EUkFXEANCBQoDcmVz');\n\n@$core.Deprecated('Use sizeSpecDescriptor instead')\nconst SizeSpec$json = {\n  '1': 'SizeSpec',\n  '2': [\n    {'1': 'width', '3': 1, '4': 1, '5': 1, '10': 'width'},\n    {'1': 'height', '3': 2, '4': 1, '5': 1, '10': 'height'},\n  ],\n};\n\n/// Descriptor for `SizeSpec`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sizeSpecDescriptor = $convert.base64Decode(\n    'CghTaXplU3BlYxIUCgV3aWR0aBgBIAEoAVIFd2lkdGgSFgoGaGVpZ2h0GAIgASgBUgZoZWlnaH'\n    'Q=');\n"
  },
  {
    "path": "lib/grpc/bilibili/dagw/component/avatar/v1/plugin.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/dagw/component/avatar/v1/plugin.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:fixnum/fixnum.dart' as $fixnum;\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nimport '../common.pb.dart' as $0;\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nclass BorderConfig extends $pb.GeneratedMessage {\n  factory BorderConfig({\n    $0.ColorConfig? color,\n    $core.double? borderWidth,\n    $core.double? ratio,\n  }) {\n    final result = create();\n    if (color != null) result.color = color;\n    if (borderWidth != null) result.borderWidth = borderWidth;\n    if (ratio != null) result.ratio = ratio;\n    return result;\n  }\n\n  BorderConfig._();\n\n  factory BorderConfig.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BorderConfig.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BorderConfig',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.v1.plugin'),\n      createEmptyInstance: create)\n    ..aOM<$0.ColorConfig>(1, _omitFieldNames ? '' : 'color',\n        subBuilder: $0.ColorConfig.create)\n    ..aD(2, _omitFieldNames ? '' : 'borderWidth')\n    ..aD(3, _omitFieldNames ? '' : 'ratio')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BorderConfig clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BorderConfig copyWith(void Function(BorderConfig) updates) =>\n      super.copyWith((message) => updates(message as BorderConfig))\n          as BorderConfig;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BorderConfig create() => BorderConfig._();\n  @$core.override\n  BorderConfig createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BorderConfig getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<BorderConfig>(create);\n  static BorderConfig? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $0.ColorConfig get color => $_getN(0);\n  @$pb.TagNumber(1)\n  set color($0.ColorConfig value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasColor() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearColor() => $_clearField(1);\n  @$pb.TagNumber(1)\n  $0.ColorConfig ensureColor() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.double get borderWidth => $_getN(1);\n  @$pb.TagNumber(2)\n  set borderWidth($core.double value) => $_setDouble(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBorderWidth() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBorderWidth() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.double get ratio => $_getN(2);\n  @$pb.TagNumber(3)\n  set ratio($core.double value) => $_setDouble(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRatio() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRatio() => $_clearField(3);\n}\n\nclass CommentDoubleClickConfig extends $pb.GeneratedMessage {\n  factory CommentDoubleClickConfig({\n    Interaction? interaction,\n    $core.double? animationScale,\n  }) {\n    final result = create();\n    if (interaction != null) result.interaction = interaction;\n    if (animationScale != null) result.animationScale = animationScale;\n    return result;\n  }\n\n  CommentDoubleClickConfig._();\n\n  factory CommentDoubleClickConfig.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CommentDoubleClickConfig.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CommentDoubleClickConfig',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.v1.plugin'),\n      createEmptyInstance: create)\n    ..aOM<Interaction>(1, _omitFieldNames ? '' : 'interaction',\n        subBuilder: Interaction.create)\n    ..aD(2, _omitFieldNames ? '' : 'animationScale')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CommentDoubleClickConfig clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CommentDoubleClickConfig copyWith(\n          void Function(CommentDoubleClickConfig) updates) =>\n      super.copyWith((message) => updates(message as CommentDoubleClickConfig))\n          as CommentDoubleClickConfig;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CommentDoubleClickConfig create() => CommentDoubleClickConfig._();\n  @$core.override\n  CommentDoubleClickConfig createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CommentDoubleClickConfig getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CommentDoubleClickConfig>(create);\n  static CommentDoubleClickConfig? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Interaction get interaction => $_getN(0);\n  @$pb.TagNumber(1)\n  set interaction(Interaction value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasInteraction() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearInteraction() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Interaction ensureInteraction() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.double get animationScale => $_getN(1);\n  @$pb.TagNumber(2)\n  set animationScale($core.double value) => $_setDouble(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAnimationScale() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAnimationScale() => $_clearField(2);\n}\n\nclass FollowActionConfig extends $pb.GeneratedMessage {\n  factory FollowActionConfig({\n    $core.bool? hasFollow,\n    $0.ResourceSource? iconRes,\n    $core.double? borderWidth,\n    $0.ColorConfig? borderColor,\n    $fixnum.Int64? mid,\n    $core.double? iconWidthRatio,\n    $core.double? iconSizeOffset,\n  }) {\n    final result = create();\n    if (hasFollow != null) result.hasFollow = hasFollow;\n    if (iconRes != null) result.iconRes = iconRes;\n    if (borderWidth != null) result.borderWidth = borderWidth;\n    if (borderColor != null) result.borderColor = borderColor;\n    if (mid != null) result.mid = mid;\n    if (iconWidthRatio != null) result.iconWidthRatio = iconWidthRatio;\n    if (iconSizeOffset != null) result.iconSizeOffset = iconSizeOffset;\n    return result;\n  }\n\n  FollowActionConfig._();\n\n  factory FollowActionConfig.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FollowActionConfig.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FollowActionConfig',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.v1.plugin'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'hasFollow')\n    ..aOM<$0.ResourceSource>(2, _omitFieldNames ? '' : 'iconRes',\n        subBuilder: $0.ResourceSource.create)\n    ..aD(3, _omitFieldNames ? '' : 'borderWidth')\n    ..aOM<$0.ColorConfig>(4, _omitFieldNames ? '' : 'borderColor',\n        subBuilder: $0.ColorConfig.create)\n    ..aInt64(5, _omitFieldNames ? '' : 'mid')\n    ..aD(6, _omitFieldNames ? '' : 'iconWidthRatio')\n    ..aD(7, _omitFieldNames ? '' : 'iconSizeOffset')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FollowActionConfig clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FollowActionConfig copyWith(void Function(FollowActionConfig) updates) =>\n      super.copyWith((message) => updates(message as FollowActionConfig))\n          as FollowActionConfig;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FollowActionConfig create() => FollowActionConfig._();\n  @$core.override\n  FollowActionConfig createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FollowActionConfig getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FollowActionConfig>(create);\n  static FollowActionConfig? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get hasFollow => $_getBF(0);\n  @$pb.TagNumber(1)\n  set hasFollow($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasHasFollow() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearHasFollow() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $0.ResourceSource get iconRes => $_getN(1);\n  @$pb.TagNumber(2)\n  set iconRes($0.ResourceSource value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIconRes() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIconRes() => $_clearField(2);\n  @$pb.TagNumber(2)\n  $0.ResourceSource ensureIconRes() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.double get borderWidth => $_getN(2);\n  @$pb.TagNumber(3)\n  set borderWidth($core.double value) => $_setDouble(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBorderWidth() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBorderWidth() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $0.ColorConfig get borderColor => $_getN(3);\n  @$pb.TagNumber(4)\n  set borderColor($0.ColorConfig value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBorderColor() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBorderColor() => $_clearField(4);\n  @$pb.TagNumber(4)\n  $0.ColorConfig ensureBorderColor() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get mid => $_getI64(4);\n  @$pb.TagNumber(5)\n  set mid($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasMid() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearMid() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.double get iconWidthRatio => $_getN(5);\n  @$pb.TagNumber(6)\n  set iconWidthRatio($core.double value) => $_setDouble(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasIconWidthRatio() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearIconWidthRatio() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.double get iconSizeOffset => $_getN(6);\n  @$pb.TagNumber(7)\n  set iconSizeOffset($core.double value) => $_setDouble(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasIconSizeOffset() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearIconSizeOffset() => $_clearField(7);\n}\n\nclass FollowIconConfig extends $pb.GeneratedMessage {\n  factory FollowIconConfig({\n    $core.bool? hasFollow,\n    $0.ResourceSource? iconRes,\n    $core.double? borderWidth,\n    $0.ColorConfig? borderColor,\n    $fixnum.Int64? mid,\n  }) {\n    final result = create();\n    if (hasFollow != null) result.hasFollow = hasFollow;\n    if (iconRes != null) result.iconRes = iconRes;\n    if (borderWidth != null) result.borderWidth = borderWidth;\n    if (borderColor != null) result.borderColor = borderColor;\n    if (mid != null) result.mid = mid;\n    return result;\n  }\n\n  FollowIconConfig._();\n\n  factory FollowIconConfig.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FollowIconConfig.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FollowIconConfig',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.v1.plugin'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'hasFollow')\n    ..aOM<$0.ResourceSource>(2, _omitFieldNames ? '' : 'iconRes',\n        subBuilder: $0.ResourceSource.create)\n    ..aD(3, _omitFieldNames ? '' : 'borderWidth')\n    ..aOM<$0.ColorConfig>(4, _omitFieldNames ? '' : 'borderColor',\n        subBuilder: $0.ColorConfig.create)\n    ..aInt64(5, _omitFieldNames ? '' : 'mid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FollowIconConfig clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FollowIconConfig copyWith(void Function(FollowIconConfig) updates) =>\n      super.copyWith((message) => updates(message as FollowIconConfig))\n          as FollowIconConfig;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FollowIconConfig create() => FollowIconConfig._();\n  @$core.override\n  FollowIconConfig createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FollowIconConfig getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FollowIconConfig>(create);\n  static FollowIconConfig? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get hasFollow => $_getBF(0);\n  @$pb.TagNumber(1)\n  set hasFollow($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasHasFollow() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearHasFollow() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $0.ResourceSource get iconRes => $_getN(1);\n  @$pb.TagNumber(2)\n  set iconRes($0.ResourceSource value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIconRes() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIconRes() => $_clearField(2);\n  @$pb.TagNumber(2)\n  $0.ResourceSource ensureIconRes() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.double get borderWidth => $_getN(2);\n  @$pb.TagNumber(3)\n  set borderWidth($core.double value) => $_setDouble(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBorderWidth() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBorderWidth() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $0.ColorConfig get borderColor => $_getN(3);\n  @$pb.TagNumber(4)\n  set borderColor($0.ColorConfig value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBorderColor() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBorderColor() => $_clearField(4);\n  @$pb.TagNumber(4)\n  $0.ColorConfig ensureBorderColor() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get mid => $_getI64(4);\n  @$pb.TagNumber(5)\n  set mid($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasMid() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearMid() => $_clearField(5);\n}\n\nclass GyroConfig extends $pb.GeneratedMessage {\n  factory GyroConfig({\n    NFTImageV2? gyroscope,\n  }) {\n    final result = create();\n    if (gyroscope != null) result.gyroscope = gyroscope;\n    return result;\n  }\n\n  GyroConfig._();\n\n  factory GyroConfig.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory GyroConfig.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'GyroConfig',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.v1.plugin'),\n      createEmptyInstance: create)\n    ..aOM<NFTImageV2>(1, _omitFieldNames ? '' : 'gyroscope',\n        subBuilder: NFTImageV2.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GyroConfig clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GyroConfig copyWith(void Function(GyroConfig) updates) =>\n      super.copyWith((message) => updates(message as GyroConfig)) as GyroConfig;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static GyroConfig create() => GyroConfig._();\n  @$core.override\n  GyroConfig createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static GyroConfig getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<GyroConfig>(create);\n  static GyroConfig? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  NFTImageV2 get gyroscope => $_getN(0);\n  @$pb.TagNumber(1)\n  set gyroscope(NFTImageV2 value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasGyroscope() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearGyroscope() => $_clearField(1);\n  @$pb.TagNumber(1)\n  NFTImageV2 ensureGyroscope() => $_ensure(0);\n}\n\nclass GyroscopeContentV2 extends $pb.GeneratedMessage {\n  factory GyroscopeContentV2({\n    $core.String? fileUrl,\n    $core.double? scale,\n    $core.Iterable<PhysicalOrientationV2>? physicalOrientation,\n  }) {\n    final result = create();\n    if (fileUrl != null) result.fileUrl = fileUrl;\n    if (scale != null) result.scale = scale;\n    if (physicalOrientation != null)\n      result.physicalOrientation.addAll(physicalOrientation);\n    return result;\n  }\n\n  GyroscopeContentV2._();\n\n  factory GyroscopeContentV2.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory GyroscopeContentV2.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'GyroscopeContentV2',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.v1.plugin'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'fileUrl')\n    ..aD(2, _omitFieldNames ? '' : 'scale', fieldType: $pb.PbFieldType.OF)\n    ..pPM<PhysicalOrientationV2>(\n        3, _omitFieldNames ? '' : 'physicalOrientation',\n        subBuilder: PhysicalOrientationV2.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GyroscopeContentV2 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GyroscopeContentV2 copyWith(void Function(GyroscopeContentV2) updates) =>\n      super.copyWith((message) => updates(message as GyroscopeContentV2))\n          as GyroscopeContentV2;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static GyroscopeContentV2 create() => GyroscopeContentV2._();\n  @$core.override\n  GyroscopeContentV2 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static GyroscopeContentV2 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<GyroscopeContentV2>(create);\n  static GyroscopeContentV2? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get fileUrl => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set fileUrl($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFileUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFileUrl() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.double get scale => $_getN(1);\n  @$pb.TagNumber(2)\n  set scale($core.double value) => $_setFloat(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasScale() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearScale() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<PhysicalOrientationV2> get physicalOrientation => $_getList(2);\n}\n\nclass GyroscopeEntityV2 extends $pb.GeneratedMessage {\n  factory GyroscopeEntityV2({\n    $core.String? displayType,\n    $core.Iterable<GyroscopeContentV2>? contents,\n  }) {\n    final result = create();\n    if (displayType != null) result.displayType = displayType;\n    if (contents != null) result.contents.addAll(contents);\n    return result;\n  }\n\n  GyroscopeEntityV2._();\n\n  factory GyroscopeEntityV2.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory GyroscopeEntityV2.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'GyroscopeEntityV2',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.v1.plugin'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'displayType')\n    ..pPM<GyroscopeContentV2>(2, _omitFieldNames ? '' : 'contents',\n        subBuilder: GyroscopeContentV2.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GyroscopeEntityV2 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GyroscopeEntityV2 copyWith(void Function(GyroscopeEntityV2) updates) =>\n      super.copyWith((message) => updates(message as GyroscopeEntityV2))\n          as GyroscopeEntityV2;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static GyroscopeEntityV2 create() => GyroscopeEntityV2._();\n  @$core.override\n  GyroscopeEntityV2 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static GyroscopeEntityV2 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<GyroscopeEntityV2>(create);\n  static GyroscopeEntityV2? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get displayType => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set displayType($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDisplayType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDisplayType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<GyroscopeContentV2> get contents => $_getList(1);\n}\n\nclass Interaction extends $pb.GeneratedMessage {\n  factory Interaction({\n    $core.String? nftId,\n    $core.bool? enabled,\n    $core.String? itype,\n    $core.String? metadataUrl,\n  }) {\n    final result = create();\n    if (nftId != null) result.nftId = nftId;\n    if (enabled != null) result.enabled = enabled;\n    if (itype != null) result.itype = itype;\n    if (metadataUrl != null) result.metadataUrl = metadataUrl;\n    return result;\n  }\n\n  Interaction._();\n\n  factory Interaction.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Interaction.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Interaction',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.v1.plugin'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'nftId')\n    ..aOB(2, _omitFieldNames ? '' : 'enabled')\n    ..aOS(3, _omitFieldNames ? '' : 'itype')\n    ..aOS(4, _omitFieldNames ? '' : 'metadataUrl')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Interaction clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Interaction copyWith(void Function(Interaction) updates) =>\n      super.copyWith((message) => updates(message as Interaction))\n          as Interaction;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Interaction create() => Interaction._();\n  @$core.override\n  Interaction createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Interaction getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<Interaction>(create);\n  static Interaction? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get nftId => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set nftId($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasNftId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearNftId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get enabled => $_getBF(1);\n  @$pb.TagNumber(2)\n  set enabled($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasEnabled() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearEnabled() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get itype => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set itype($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasItype() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearItype() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get metadataUrl => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set metadataUrl($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasMetadataUrl() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearMetadataUrl() => $_clearField(4);\n}\n\nclass LiveAnimeConfig extends $pb.GeneratedMessage {\n  factory LiveAnimeConfig({\n    $core.bool? isLive,\n    LiveTextConfig? config,\n    $core.Iterable<LiveAnimeItem>? items,\n    $core.Iterable<BorderConfig>? borderConfig,\n  }) {\n    final result = create();\n    if (isLive != null) result.isLive = isLive;\n    if (config != null) result.config = config;\n    if (items != null) result.items.addAll(items);\n    if (borderConfig != null) result.borderConfig.addAll(borderConfig);\n    return result;\n  }\n\n  LiveAnimeConfig._();\n\n  factory LiveAnimeConfig.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LiveAnimeConfig.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LiveAnimeConfig',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.v1.plugin'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'isLive')\n    ..aOM<LiveTextConfig>(2, _omitFieldNames ? '' : 'config',\n        subBuilder: LiveTextConfig.create)\n    ..pPM<LiveAnimeItem>(3, _omitFieldNames ? '' : 'items',\n        subBuilder: LiveAnimeItem.create)\n    ..pPM<BorderConfig>(4, _omitFieldNames ? '' : 'borderConfig',\n        subBuilder: BorderConfig.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LiveAnimeConfig clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LiveAnimeConfig copyWith(void Function(LiveAnimeConfig) updates) =>\n      super.copyWith((message) => updates(message as LiveAnimeConfig))\n          as LiveAnimeConfig;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LiveAnimeConfig create() => LiveAnimeConfig._();\n  @$core.override\n  LiveAnimeConfig createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LiveAnimeConfig getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LiveAnimeConfig>(create);\n  static LiveAnimeConfig? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get isLive => $_getBF(0);\n  @$pb.TagNumber(1)\n  set isLive($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIsLive() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIsLive() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  LiveTextConfig get config => $_getN(1);\n  @$pb.TagNumber(2)\n  set config(LiveTextConfig value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasConfig() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearConfig() => $_clearField(2);\n  @$pb.TagNumber(2)\n  LiveTextConfig ensureConfig() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<LiveAnimeItem> get items => $_getList(2);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<BorderConfig> get borderConfig => $_getList(3);\n}\n\nclass LiveAnimeItem extends $pb.GeneratedMessage {\n  factory LiveAnimeItem({\n    $0.ColorConfig? color,\n    $core.double? startRatio,\n    $core.double? endRatio,\n    $core.double? startStroke,\n    $core.double? startOpacity,\n    $fixnum.Int64? phase,\n  }) {\n    final result = create();\n    if (color != null) result.color = color;\n    if (startRatio != null) result.startRatio = startRatio;\n    if (endRatio != null) result.endRatio = endRatio;\n    if (startStroke != null) result.startStroke = startStroke;\n    if (startOpacity != null) result.startOpacity = startOpacity;\n    if (phase != null) result.phase = phase;\n    return result;\n  }\n\n  LiveAnimeItem._();\n\n  factory LiveAnimeItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LiveAnimeItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LiveAnimeItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.v1.plugin'),\n      createEmptyInstance: create)\n    ..aOM<$0.ColorConfig>(1, _omitFieldNames ? '' : 'color',\n        subBuilder: $0.ColorConfig.create)\n    ..aD(2, _omitFieldNames ? '' : 'startRatio')\n    ..aD(3, _omitFieldNames ? '' : 'endRatio')\n    ..aD(4, _omitFieldNames ? '' : 'startStroke')\n    ..aD(5, _omitFieldNames ? '' : 'startOpacity')\n    ..aInt64(6, _omitFieldNames ? '' : 'phase')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LiveAnimeItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LiveAnimeItem copyWith(void Function(LiveAnimeItem) updates) =>\n      super.copyWith((message) => updates(message as LiveAnimeItem))\n          as LiveAnimeItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LiveAnimeItem create() => LiveAnimeItem._();\n  @$core.override\n  LiveAnimeItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LiveAnimeItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LiveAnimeItem>(create);\n  static LiveAnimeItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $0.ColorConfig get color => $_getN(0);\n  @$pb.TagNumber(1)\n  set color($0.ColorConfig value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasColor() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearColor() => $_clearField(1);\n  @$pb.TagNumber(1)\n  $0.ColorConfig ensureColor() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.double get startRatio => $_getN(1);\n  @$pb.TagNumber(2)\n  set startRatio($core.double value) => $_setDouble(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasStartRatio() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearStartRatio() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.double get endRatio => $_getN(2);\n  @$pb.TagNumber(3)\n  set endRatio($core.double value) => $_setDouble(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasEndRatio() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearEndRatio() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.double get startStroke => $_getN(3);\n  @$pb.TagNumber(4)\n  set startStroke($core.double value) => $_setDouble(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasStartStroke() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearStartStroke() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.double get startOpacity => $_getN(4);\n  @$pb.TagNumber(5)\n  set startOpacity($core.double value) => $_setDouble(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasStartOpacity() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearStartOpacity() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get phase => $_getI64(5);\n  @$pb.TagNumber(6)\n  set phase($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasPhase() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearPhase() => $_clearField(6);\n}\n\nclass LiveTextConfig extends $pb.GeneratedMessage {\n  factory LiveTextConfig({\n    $core.double? width,\n    $core.double? height,\n    $core.double? offsetY,\n    $core.double? borderWidth,\n    $core.double? textSize,\n    $0.ColorConfig? borderColor,\n    $0.ColorConfig? background,\n  }) {\n    final result = create();\n    if (width != null) result.width = width;\n    if (height != null) result.height = height;\n    if (offsetY != null) result.offsetY = offsetY;\n    if (borderWidth != null) result.borderWidth = borderWidth;\n    if (textSize != null) result.textSize = textSize;\n    if (borderColor != null) result.borderColor = borderColor;\n    if (background != null) result.background = background;\n    return result;\n  }\n\n  LiveTextConfig._();\n\n  factory LiveTextConfig.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LiveTextConfig.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LiveTextConfig',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.v1.plugin'),\n      createEmptyInstance: create)\n    ..aD(1, _omitFieldNames ? '' : 'width')\n    ..aD(2, _omitFieldNames ? '' : 'height')\n    ..aD(3, _omitFieldNames ? '' : 'offsetY')\n    ..aD(4, _omitFieldNames ? '' : 'borderWidth')\n    ..aD(5, _omitFieldNames ? '' : 'textSize')\n    ..aOM<$0.ColorConfig>(7, _omitFieldNames ? '' : 'borderColor',\n        subBuilder: $0.ColorConfig.create)\n    ..aOM<$0.ColorConfig>(8, _omitFieldNames ? '' : 'background',\n        subBuilder: $0.ColorConfig.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LiveTextConfig clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LiveTextConfig copyWith(void Function(LiveTextConfig) updates) =>\n      super.copyWith((message) => updates(message as LiveTextConfig))\n          as LiveTextConfig;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LiveTextConfig create() => LiveTextConfig._();\n  @$core.override\n  LiveTextConfig createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LiveTextConfig getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LiveTextConfig>(create);\n  static LiveTextConfig? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.double get width => $_getN(0);\n  @$pb.TagNumber(1)\n  set width($core.double value) => $_setDouble(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasWidth() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearWidth() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.double get height => $_getN(1);\n  @$pb.TagNumber(2)\n  set height($core.double value) => $_setDouble(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHeight() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHeight() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.double get offsetY => $_getN(2);\n  @$pb.TagNumber(3)\n  set offsetY($core.double value) => $_setDouble(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasOffsetY() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearOffsetY() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.double get borderWidth => $_getN(3);\n  @$pb.TagNumber(4)\n  set borderWidth($core.double value) => $_setDouble(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBorderWidth() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBorderWidth() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.double get textSize => $_getN(4);\n  @$pb.TagNumber(5)\n  set textSize($core.double value) => $_setDouble(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasTextSize() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearTextSize() => $_clearField(5);\n\n  @$pb.TagNumber(7)\n  $0.ColorConfig get borderColor => $_getN(5);\n  @$pb.TagNumber(7)\n  set borderColor($0.ColorConfig value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBorderColor() => $_has(5);\n  @$pb.TagNumber(7)\n  void clearBorderColor() => $_clearField(7);\n  @$pb.TagNumber(7)\n  $0.ColorConfig ensureBorderColor() => $_ensure(5);\n\n  @$pb.TagNumber(8)\n  $0.ColorConfig get background => $_getN(6);\n  @$pb.TagNumber(8)\n  set background($0.ColorConfig value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasBackground() => $_has(6);\n  @$pb.TagNumber(8)\n  void clearBackground() => $_clearField(8);\n  @$pb.TagNumber(8)\n  $0.ColorConfig ensureBackground() => $_ensure(6);\n}\n\nclass NFTImageV2 extends $pb.GeneratedMessage {\n  factory NFTImageV2({\n    $core.Iterable<GyroscopeEntityV2>? gyroscope,\n  }) {\n    final result = create();\n    if (gyroscope != null) result.gyroscope.addAll(gyroscope);\n    return result;\n  }\n\n  NFTImageV2._();\n\n  factory NFTImageV2.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory NFTImageV2.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'NFTImageV2',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.v1.plugin'),\n      createEmptyInstance: create)\n    ..pPM<GyroscopeEntityV2>(1, _omitFieldNames ? '' : 'gyroscope',\n        subBuilder: GyroscopeEntityV2.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NFTImageV2 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NFTImageV2 copyWith(void Function(NFTImageV2) updates) =>\n      super.copyWith((message) => updates(message as NFTImageV2)) as NFTImageV2;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static NFTImageV2 create() => NFTImageV2._();\n  @$core.override\n  NFTImageV2 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static NFTImageV2 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<NFTImageV2>(create);\n  static NFTImageV2? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<GyroscopeEntityV2> get gyroscope => $_getList(0);\n}\n\nclass PhysicalOrientationAnimation extends $pb.GeneratedMessage {\n  factory PhysicalOrientationAnimation({\n    $core.String? type,\n    $core.Iterable<$core.double>? value,\n    $core.String? bezier,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (value != null) result.value.addAll(value);\n    if (bezier != null) result.bezier = bezier;\n    return result;\n  }\n\n  PhysicalOrientationAnimation._();\n\n  factory PhysicalOrientationAnimation.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PhysicalOrientationAnimation.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PhysicalOrientationAnimation',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.v1.plugin'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'type')\n    ..p<$core.double>(2, _omitFieldNames ? '' : 'value', $pb.PbFieldType.KF)\n    ..aOS(3, _omitFieldNames ? '' : 'bezier')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PhysicalOrientationAnimation clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PhysicalOrientationAnimation copyWith(\n          void Function(PhysicalOrientationAnimation) updates) =>\n      super.copyWith(\n              (message) => updates(message as PhysicalOrientationAnimation))\n          as PhysicalOrientationAnimation;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PhysicalOrientationAnimation create() =>\n      PhysicalOrientationAnimation._();\n  @$core.override\n  PhysicalOrientationAnimation createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PhysicalOrientationAnimation getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PhysicalOrientationAnimation>(create);\n  static PhysicalOrientationAnimation? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get type => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set type($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<$core.double> get value => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $core.String get bezier => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set bezier($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBezier() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBezier() => $_clearField(3);\n}\n\nclass PhysicalOrientationV2 extends $pb.GeneratedMessage {\n  factory PhysicalOrientationV2({\n    $core.String? type,\n    $core.Iterable<$core.double>? angle,\n    $core.Iterable<PhysicalOrientationAnimation>? animations,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (angle != null) result.angle.addAll(angle);\n    if (animations != null) result.animations.addAll(animations);\n    return result;\n  }\n\n  PhysicalOrientationV2._();\n\n  factory PhysicalOrientationV2.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PhysicalOrientationV2.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PhysicalOrientationV2',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.v1.plugin'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'type')\n    ..p<$core.double>(2, _omitFieldNames ? '' : 'angle', $pb.PbFieldType.KF)\n    ..pPM<PhysicalOrientationAnimation>(3, _omitFieldNames ? '' : 'animations',\n        subBuilder: PhysicalOrientationAnimation.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PhysicalOrientationV2 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PhysicalOrientationV2 copyWith(\n          void Function(PhysicalOrientationV2) updates) =>\n      super.copyWith((message) => updates(message as PhysicalOrientationV2))\n          as PhysicalOrientationV2;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PhysicalOrientationV2 create() => PhysicalOrientationV2._();\n  @$core.override\n  PhysicalOrientationV2 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PhysicalOrientationV2 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PhysicalOrientationV2>(create);\n  static PhysicalOrientationV2? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get type => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set type($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<$core.double> get angle => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<PhysicalOrientationAnimation> get animations => $_getList(2);\n}\n\nclass WebLiveAnimeConfig extends $pb.GeneratedMessage {\n  factory WebLiveAnimeConfig({\n    $core.double? circleGapWidth,\n    $core.double? pinkCircleWidth,\n    $core.double? liveLabelWidth,\n    $core.double? liveLabelHeight,\n    $core.double? liveLabelOffsetY,\n    $core.double? liveLabelBorderWidth,\n  }) {\n    final result = create();\n    if (circleGapWidth != null) result.circleGapWidth = circleGapWidth;\n    if (pinkCircleWidth != null) result.pinkCircleWidth = pinkCircleWidth;\n    if (liveLabelWidth != null) result.liveLabelWidth = liveLabelWidth;\n    if (liveLabelHeight != null) result.liveLabelHeight = liveLabelHeight;\n    if (liveLabelOffsetY != null) result.liveLabelOffsetY = liveLabelOffsetY;\n    if (liveLabelBorderWidth != null)\n      result.liveLabelBorderWidth = liveLabelBorderWidth;\n    return result;\n  }\n\n  WebLiveAnimeConfig._();\n\n  factory WebLiveAnimeConfig.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory WebLiveAnimeConfig.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'WebLiveAnimeConfig',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.v1.plugin'),\n      createEmptyInstance: create)\n    ..aD(1, _omitFieldNames ? '' : 'circleGapWidth')\n    ..aD(2, _omitFieldNames ? '' : 'pinkCircleWidth')\n    ..aD(3, _omitFieldNames ? '' : 'liveLabelWidth')\n    ..aD(4, _omitFieldNames ? '' : 'liveLabelHeight')\n    ..aD(5, _omitFieldNames ? '' : 'liveLabelOffsetY')\n    ..aD(6, _omitFieldNames ? '' : 'liveLabelBorderWidth')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  WebLiveAnimeConfig clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  WebLiveAnimeConfig copyWith(void Function(WebLiveAnimeConfig) updates) =>\n      super.copyWith((message) => updates(message as WebLiveAnimeConfig))\n          as WebLiveAnimeConfig;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static WebLiveAnimeConfig create() => WebLiveAnimeConfig._();\n  @$core.override\n  WebLiveAnimeConfig createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static WebLiveAnimeConfig getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<WebLiveAnimeConfig>(create);\n  static WebLiveAnimeConfig? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.double get circleGapWidth => $_getN(0);\n  @$pb.TagNumber(1)\n  set circleGapWidth($core.double value) => $_setDouble(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCircleGapWidth() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCircleGapWidth() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.double get pinkCircleWidth => $_getN(1);\n  @$pb.TagNumber(2)\n  set pinkCircleWidth($core.double value) => $_setDouble(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPinkCircleWidth() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPinkCircleWidth() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.double get liveLabelWidth => $_getN(2);\n  @$pb.TagNumber(3)\n  set liveLabelWidth($core.double value) => $_setDouble(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLiveLabelWidth() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLiveLabelWidth() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.double get liveLabelHeight => $_getN(3);\n  @$pb.TagNumber(4)\n  set liveLabelHeight($core.double value) => $_setDouble(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLiveLabelHeight() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLiveLabelHeight() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.double get liveLabelOffsetY => $_getN(4);\n  @$pb.TagNumber(5)\n  set liveLabelOffsetY($core.double value) => $_setDouble(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasLiveLabelOffsetY() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearLiveLabelOffsetY() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.double get liveLabelBorderWidth => $_getN(5);\n  @$pb.TagNumber(6)\n  set liveLabelBorderWidth($core.double value) => $_setDouble(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasLiveLabelBorderWidth() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearLiveLabelBorderWidth() => $_clearField(6);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/dagw/component/avatar/v1/plugin.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/dagw/component/avatar/v1/plugin.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n"
  },
  {
    "path": "lib/grpc/bilibili/dagw/component/avatar/v1/plugin.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/dagw/component/avatar/v1/plugin.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use borderConfigDescriptor instead')\nconst BorderConfig$json = {\n  '1': 'BorderConfig',\n  '2': [\n    {\n      '1': 'color',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.common.ColorConfig',\n      '10': 'color'\n    },\n    {'1': 'border_width', '3': 2, '4': 1, '5': 1, '10': 'borderWidth'},\n    {'1': 'ratio', '3': 3, '4': 1, '5': 1, '10': 'ratio'},\n  ],\n};\n\n/// Descriptor for `BorderConfig`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List borderConfigDescriptor = $convert.base64Decode(\n    'CgxCb3JkZXJDb25maWcSSAoFY29sb3IYASABKAsyMi5iaWxpYmlsaS5kYWd3LmNvbXBvbmVudC'\n    '5hdmF0YXIuY29tbW9uLkNvbG9yQ29uZmlnUgVjb2xvchIhCgxib3JkZXJfd2lkdGgYAiABKAFS'\n    'C2JvcmRlcldpZHRoEhQKBXJhdGlvGAMgASgBUgVyYXRpbw==');\n\n@$core.Deprecated('Use commentDoubleClickConfigDescriptor instead')\nconst CommentDoubleClickConfig$json = {\n  '1': 'CommentDoubleClickConfig',\n  '2': [\n    {\n      '1': 'interaction',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.plugin.Interaction',\n      '10': 'interaction'\n    },\n    {'1': 'animation_scale', '3': 2, '4': 1, '5': 1, '10': 'animationScale'},\n  ],\n};\n\n/// Descriptor for `CommentDoubleClickConfig`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List commentDoubleClickConfigDescriptor = $convert.base64Decode(\n    'ChhDb21tZW50RG91YmxlQ2xpY2tDb25maWcSVwoLaW50ZXJhY3Rpb24YASABKAsyNS5iaWxpYm'\n    'lsaS5kYWd3LmNvbXBvbmVudC5hdmF0YXIudjEucGx1Z2luLkludGVyYWN0aW9uUgtpbnRlcmFj'\n    'dGlvbhInCg9hbmltYXRpb25fc2NhbGUYAiABKAFSDmFuaW1hdGlvblNjYWxl');\n\n@$core.Deprecated('Use followActionConfigDescriptor instead')\nconst FollowActionConfig$json = {\n  '1': 'FollowActionConfig',\n  '2': [\n    {'1': 'has_follow', '3': 1, '4': 1, '5': 8, '10': 'hasFollow'},\n    {\n      '1': 'icon_res',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.common.ResourceSource',\n      '10': 'iconRes'\n    },\n    {'1': 'border_width', '3': 3, '4': 1, '5': 1, '10': 'borderWidth'},\n    {\n      '1': 'border_color',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.common.ColorConfig',\n      '10': 'borderColor'\n    },\n    {'1': 'mid', '3': 5, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'icon_width_ratio', '3': 6, '4': 1, '5': 1, '10': 'iconWidthRatio'},\n    {'1': 'icon_size_offset', '3': 7, '4': 1, '5': 1, '10': 'iconSizeOffset'},\n  ],\n};\n\n/// Descriptor for `FollowActionConfig`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List followActionConfigDescriptor = $convert.base64Decode(\n    'ChJGb2xsb3dBY3Rpb25Db25maWcSHQoKaGFzX2ZvbGxvdxgBIAEoCFIJaGFzRm9sbG93ElAKCG'\n    'ljb25fcmVzGAIgASgLMjUuYmlsaWJpbGkuZGFndy5jb21wb25lbnQuYXZhdGFyLmNvbW1vbi5S'\n    'ZXNvdXJjZVNvdXJjZVIHaWNvblJlcxIhCgxib3JkZXJfd2lkdGgYAyABKAFSC2JvcmRlcldpZH'\n    'RoElUKDGJvcmRlcl9jb2xvchgEIAEoCzIyLmJpbGliaWxpLmRhZ3cuY29tcG9uZW50LmF2YXRh'\n    'ci5jb21tb24uQ29sb3JDb25maWdSC2JvcmRlckNvbG9yEhAKA21pZBgFIAEoA1IDbWlkEigKEG'\n    'ljb25fd2lkdGhfcmF0aW8YBiABKAFSDmljb25XaWR0aFJhdGlvEigKEGljb25fc2l6ZV9vZmZz'\n    'ZXQYByABKAFSDmljb25TaXplT2Zmc2V0');\n\n@$core.Deprecated('Use followIconConfigDescriptor instead')\nconst FollowIconConfig$json = {\n  '1': 'FollowIconConfig',\n  '2': [\n    {'1': 'has_follow', '3': 1, '4': 1, '5': 8, '10': 'hasFollow'},\n    {\n      '1': 'icon_res',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.common.ResourceSource',\n      '10': 'iconRes'\n    },\n    {'1': 'border_width', '3': 3, '4': 1, '5': 1, '10': 'borderWidth'},\n    {\n      '1': 'border_color',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.common.ColorConfig',\n      '10': 'borderColor'\n    },\n    {'1': 'mid', '3': 5, '4': 1, '5': 3, '10': 'mid'},\n  ],\n};\n\n/// Descriptor for `FollowIconConfig`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List followIconConfigDescriptor = $convert.base64Decode(\n    'ChBGb2xsb3dJY29uQ29uZmlnEh0KCmhhc19mb2xsb3cYASABKAhSCWhhc0ZvbGxvdxJQCghpY2'\n    '9uX3JlcxgCIAEoCzI1LmJpbGliaWxpLmRhZ3cuY29tcG9uZW50LmF2YXRhci5jb21tb24uUmVz'\n    'b3VyY2VTb3VyY2VSB2ljb25SZXMSIQoMYm9yZGVyX3dpZHRoGAMgASgBUgtib3JkZXJXaWR0aB'\n    'JVCgxib3JkZXJfY29sb3IYBCABKAsyMi5iaWxpYmlsaS5kYWd3LmNvbXBvbmVudC5hdmF0YXIu'\n    'Y29tbW9uLkNvbG9yQ29uZmlnUgtib3JkZXJDb2xvchIQCgNtaWQYBSABKANSA21pZA==');\n\n@$core.Deprecated('Use gyroConfigDescriptor instead')\nconst GyroConfig$json = {\n  '1': 'GyroConfig',\n  '2': [\n    {\n      '1': 'gyroscope',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.plugin.NFTImageV2',\n      '10': 'gyroscope'\n    },\n  ],\n};\n\n/// Descriptor for `GyroConfig`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List gyroConfigDescriptor = $convert.base64Decode(\n    'CgpHeXJvQ29uZmlnElIKCWd5cm9zY29wZRgBIAEoCzI0LmJpbGliaWxpLmRhZ3cuY29tcG9uZW'\n    '50LmF2YXRhci52MS5wbHVnaW4uTkZUSW1hZ2VWMlIJZ3lyb3Njb3Bl');\n\n@$core.Deprecated('Use gyroscopeContentV2Descriptor instead')\nconst GyroscopeContentV2$json = {\n  '1': 'GyroscopeContentV2',\n  '2': [\n    {'1': 'file_url', '3': 1, '4': 1, '5': 9, '10': 'fileUrl'},\n    {'1': 'scale', '3': 2, '4': 1, '5': 2, '10': 'scale'},\n    {\n      '1': 'physical_orientation',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.plugin.PhysicalOrientationV2',\n      '10': 'physicalOrientation'\n    },\n  ],\n};\n\n/// Descriptor for `GyroscopeContentV2`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List gyroscopeContentV2Descriptor = $convert.base64Decode(\n    'ChJHeXJvc2NvcGVDb250ZW50VjISGQoIZmlsZV91cmwYASABKAlSB2ZpbGVVcmwSFAoFc2NhbG'\n    'UYAiABKAJSBXNjYWxlEnIKFHBoeXNpY2FsX29yaWVudGF0aW9uGAMgAygLMj8uYmlsaWJpbGku'\n    'ZGFndy5jb21wb25lbnQuYXZhdGFyLnYxLnBsdWdpbi5QaHlzaWNhbE9yaWVudGF0aW9uVjJSE3'\n    'BoeXNpY2FsT3JpZW50YXRpb24=');\n\n@$core.Deprecated('Use gyroscopeEntityV2Descriptor instead')\nconst GyroscopeEntityV2$json = {\n  '1': 'GyroscopeEntityV2',\n  '2': [\n    {'1': 'display_type', '3': 1, '4': 1, '5': 9, '10': 'displayType'},\n    {\n      '1': 'contents',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.plugin.GyroscopeContentV2',\n      '10': 'contents'\n    },\n  ],\n};\n\n/// Descriptor for `GyroscopeEntityV2`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List gyroscopeEntityV2Descriptor = $convert.base64Decode(\n    'ChFHeXJvc2NvcGVFbnRpdHlWMhIhCgxkaXNwbGF5X3R5cGUYASABKAlSC2Rpc3BsYXlUeXBlEl'\n    'gKCGNvbnRlbnRzGAIgAygLMjwuYmlsaWJpbGkuZGFndy5jb21wb25lbnQuYXZhdGFyLnYxLnBs'\n    'dWdpbi5HeXJvc2NvcGVDb250ZW50VjJSCGNvbnRlbnRz');\n\n@$core.Deprecated('Use interactionDescriptor instead')\nconst Interaction$json = {\n  '1': 'Interaction',\n  '2': [\n    {'1': 'nft_id', '3': 1, '4': 1, '5': 9, '10': 'nftId'},\n    {'1': 'enabled', '3': 2, '4': 1, '5': 8, '10': 'enabled'},\n    {'1': 'itype', '3': 3, '4': 1, '5': 9, '10': 'itype'},\n    {'1': 'metadata_url', '3': 4, '4': 1, '5': 9, '10': 'metadataUrl'},\n  ],\n};\n\n/// Descriptor for `Interaction`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List interactionDescriptor = $convert.base64Decode(\n    'CgtJbnRlcmFjdGlvbhIVCgZuZnRfaWQYASABKAlSBW5mdElkEhgKB2VuYWJsZWQYAiABKAhSB2'\n    'VuYWJsZWQSFAoFaXR5cGUYAyABKAlSBWl0eXBlEiEKDG1ldGFkYXRhX3VybBgEIAEoCVILbWV0'\n    'YWRhdGFVcmw=');\n\n@$core.Deprecated('Use liveAnimeConfigDescriptor instead')\nconst LiveAnimeConfig$json = {\n  '1': 'LiveAnimeConfig',\n  '2': [\n    {'1': 'is_live', '3': 1, '4': 1, '5': 8, '10': 'isLive'},\n    {\n      '1': 'config',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.plugin.LiveTextConfig',\n      '10': 'config'\n    },\n    {\n      '1': 'items',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.plugin.LiveAnimeItem',\n      '10': 'items'\n    },\n    {\n      '1': 'border_config',\n      '3': 4,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.plugin.BorderConfig',\n      '10': 'borderConfig'\n    },\n  ],\n};\n\n/// Descriptor for `LiveAnimeConfig`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List liveAnimeConfigDescriptor = $convert.base64Decode(\n    'Cg9MaXZlQW5pbWVDb25maWcSFwoHaXNfbGl2ZRgBIAEoCFIGaXNMaXZlElAKBmNvbmZpZxgCIA'\n    'EoCzI4LmJpbGliaWxpLmRhZ3cuY29tcG9uZW50LmF2YXRhci52MS5wbHVnaW4uTGl2ZVRleHRD'\n    'b25maWdSBmNvbmZpZxJNCgVpdGVtcxgDIAMoCzI3LmJpbGliaWxpLmRhZ3cuY29tcG9uZW50Lm'\n    'F2YXRhci52MS5wbHVnaW4uTGl2ZUFuaW1lSXRlbVIFaXRlbXMSWwoNYm9yZGVyX2NvbmZpZxgE'\n    'IAMoCzI2LmJpbGliaWxpLmRhZ3cuY29tcG9uZW50LmF2YXRhci52MS5wbHVnaW4uQm9yZGVyQ2'\n    '9uZmlnUgxib3JkZXJDb25maWc=');\n\n@$core.Deprecated('Use liveAnimeItemDescriptor instead')\nconst LiveAnimeItem$json = {\n  '1': 'LiveAnimeItem',\n  '2': [\n    {\n      '1': 'color',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.common.ColorConfig',\n      '10': 'color'\n    },\n    {'1': 'start_ratio', '3': 2, '4': 1, '5': 1, '10': 'startRatio'},\n    {'1': 'end_ratio', '3': 3, '4': 1, '5': 1, '10': 'endRatio'},\n    {'1': 'start_stroke', '3': 4, '4': 1, '5': 1, '10': 'startStroke'},\n    {'1': 'start_opacity', '3': 5, '4': 1, '5': 1, '10': 'startOpacity'},\n    {'1': 'phase', '3': 6, '4': 1, '5': 3, '10': 'phase'},\n  ],\n};\n\n/// Descriptor for `LiveAnimeItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List liveAnimeItemDescriptor = $convert.base64Decode(\n    'Cg1MaXZlQW5pbWVJdGVtEkgKBWNvbG9yGAEgASgLMjIuYmlsaWJpbGkuZGFndy5jb21wb25lbn'\n    'QuYXZhdGFyLmNvbW1vbi5Db2xvckNvbmZpZ1IFY29sb3ISHwoLc3RhcnRfcmF0aW8YAiABKAFS'\n    'CnN0YXJ0UmF0aW8SGwoJZW5kX3JhdGlvGAMgASgBUghlbmRSYXRpbxIhCgxzdGFydF9zdHJva2'\n    'UYBCABKAFSC3N0YXJ0U3Ryb2tlEiMKDXN0YXJ0X29wYWNpdHkYBSABKAFSDHN0YXJ0T3BhY2l0'\n    'eRIUCgVwaGFzZRgGIAEoA1IFcGhhc2U=');\n\n@$core.Deprecated('Use liveTextConfigDescriptor instead')\nconst LiveTextConfig$json = {\n  '1': 'LiveTextConfig',\n  '2': [\n    {'1': 'width', '3': 1, '4': 1, '5': 1, '10': 'width'},\n    {'1': 'height', '3': 2, '4': 1, '5': 1, '10': 'height'},\n    {'1': 'offset_y', '3': 3, '4': 1, '5': 1, '10': 'offsetY'},\n    {'1': 'border_width', '3': 4, '4': 1, '5': 1, '10': 'borderWidth'},\n    {'1': 'text_size', '3': 5, '4': 1, '5': 1, '10': 'textSize'},\n    {\n      '1': 'border_color',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.common.ColorConfig',\n      '10': 'borderColor'\n    },\n    {\n      '1': 'background',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.common.ColorConfig',\n      '10': 'background'\n    },\n  ],\n};\n\n/// Descriptor for `LiveTextConfig`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List liveTextConfigDescriptor = $convert.base64Decode(\n    'Cg5MaXZlVGV4dENvbmZpZxIUCgV3aWR0aBgBIAEoAVIFd2lkdGgSFgoGaGVpZ2h0GAIgASgBUg'\n    'ZoZWlnaHQSGQoIb2Zmc2V0X3kYAyABKAFSB29mZnNldFkSIQoMYm9yZGVyX3dpZHRoGAQgASgB'\n    'Ugtib3JkZXJXaWR0aBIbCgl0ZXh0X3NpemUYBSABKAFSCHRleHRTaXplElUKDGJvcmRlcl9jb2'\n    'xvchgHIAEoCzIyLmJpbGliaWxpLmRhZ3cuY29tcG9uZW50LmF2YXRhci5jb21tb24uQ29sb3JD'\n    'b25maWdSC2JvcmRlckNvbG9yElIKCmJhY2tncm91bmQYCCABKAsyMi5iaWxpYmlsaS5kYWd3Lm'\n    'NvbXBvbmVudC5hdmF0YXIuY29tbW9uLkNvbG9yQ29uZmlnUgpiYWNrZ3JvdW5k');\n\n@$core.Deprecated('Use nFTImageV2Descriptor instead')\nconst NFTImageV2$json = {\n  '1': 'NFTImageV2',\n  '2': [\n    {\n      '1': 'gyroscope',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.plugin.GyroscopeEntityV2',\n      '10': 'gyroscope'\n    },\n  ],\n};\n\n/// Descriptor for `NFTImageV2`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List nFTImageV2Descriptor = $convert.base64Decode(\n    'CgpORlRJbWFnZVYyElkKCWd5cm9zY29wZRgBIAMoCzI7LmJpbGliaWxpLmRhZ3cuY29tcG9uZW'\n    '50LmF2YXRhci52MS5wbHVnaW4uR3lyb3Njb3BlRW50aXR5VjJSCWd5cm9zY29wZQ==');\n\n@$core.Deprecated('Use physicalOrientationAnimationDescriptor instead')\nconst PhysicalOrientationAnimation$json = {\n  '1': 'PhysicalOrientationAnimation',\n  '2': [\n    {'1': 'type', '3': 1, '4': 1, '5': 9, '10': 'type'},\n    {'1': 'value', '3': 2, '4': 3, '5': 2, '10': 'value'},\n    {'1': 'bezier', '3': 3, '4': 1, '5': 9, '10': 'bezier'},\n  ],\n};\n\n/// Descriptor for `PhysicalOrientationAnimation`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List physicalOrientationAnimationDescriptor =\n    $convert.base64Decode(\n        'ChxQaHlzaWNhbE9yaWVudGF0aW9uQW5pbWF0aW9uEhIKBHR5cGUYASABKAlSBHR5cGUSFAoFdm'\n        'FsdWUYAiADKAJSBXZhbHVlEhYKBmJlemllchgDIAEoCVIGYmV6aWVy');\n\n@$core.Deprecated('Use physicalOrientationV2Descriptor instead')\nconst PhysicalOrientationV2$json = {\n  '1': 'PhysicalOrientationV2',\n  '2': [\n    {'1': 'type', '3': 1, '4': 1, '5': 9, '10': 'type'},\n    {'1': 'angle', '3': 2, '4': 3, '5': 2, '10': 'angle'},\n    {\n      '1': 'animations',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6':\n          '.bilibili.dagw.component.avatar.v1.plugin.PhysicalOrientationAnimation',\n      '10': 'animations'\n    },\n  ],\n};\n\n/// Descriptor for `PhysicalOrientationV2`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List physicalOrientationV2Descriptor = $convert.base64Decode(\n    'ChVQaHlzaWNhbE9yaWVudGF0aW9uVjISEgoEdHlwZRgBIAEoCVIEdHlwZRIUCgVhbmdsZRgCIA'\n    'MoAlIFYW5nbGUSZgoKYW5pbWF0aW9ucxgDIAMoCzJGLmJpbGliaWxpLmRhZ3cuY29tcG9uZW50'\n    'LmF2YXRhci52MS5wbHVnaW4uUGh5c2ljYWxPcmllbnRhdGlvbkFuaW1hdGlvblIKYW5pbWF0aW'\n    '9ucw==');\n\n@$core.Deprecated('Use webLiveAnimeConfigDescriptor instead')\nconst WebLiveAnimeConfig$json = {\n  '1': 'WebLiveAnimeConfig',\n  '2': [\n    {'1': 'circle_gap_width', '3': 1, '4': 1, '5': 1, '10': 'circleGapWidth'},\n    {'1': 'pink_circle_width', '3': 2, '4': 1, '5': 1, '10': 'pinkCircleWidth'},\n    {'1': 'live_label_width', '3': 3, '4': 1, '5': 1, '10': 'liveLabelWidth'},\n    {'1': 'live_label_height', '3': 4, '4': 1, '5': 1, '10': 'liveLabelHeight'},\n    {\n      '1': 'live_label_offset_y',\n      '3': 5,\n      '4': 1,\n      '5': 1,\n      '10': 'liveLabelOffsetY'\n    },\n    {\n      '1': 'live_label_border_width',\n      '3': 6,\n      '4': 1,\n      '5': 1,\n      '10': 'liveLabelBorderWidth'\n    },\n  ],\n};\n\n/// Descriptor for `WebLiveAnimeConfig`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List webLiveAnimeConfigDescriptor = $convert.base64Decode(\n    'ChJXZWJMaXZlQW5pbWVDb25maWcSKAoQY2lyY2xlX2dhcF93aWR0aBgBIAEoAVIOY2lyY2xlR2'\n    'FwV2lkdGgSKgoRcGlua19jaXJjbGVfd2lkdGgYAiABKAFSD3BpbmtDaXJjbGVXaWR0aBIoChBs'\n    'aXZlX2xhYmVsX3dpZHRoGAMgASgBUg5saXZlTGFiZWxXaWR0aBIqChFsaXZlX2xhYmVsX2hlaW'\n    'dodBgEIAEoAVIPbGl2ZUxhYmVsSGVpZ2h0Ei0KE2xpdmVfbGFiZWxfb2Zmc2V0X3kYBSABKAFS'\n    'EGxpdmVMYWJlbE9mZnNldFkSNQoXbGl2ZV9sYWJlbF9ib3JkZXJfd2lkdGgYBiABKAFSFGxpdm'\n    'VMYWJlbEJvcmRlcldpZHRo');\n"
  },
  {
    "path": "lib/grpc/bilibili/dagw/component/avatar/v1.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/dagw/component/avatar/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:fixnum/fixnum.dart' as $fixnum;\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nimport 'common.pb.dart' as $0;\nimport 'v1.pbenum.dart';\nimport 'v1/plugin.pb.dart' as $1;\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nexport 'v1.pbenum.dart';\n\nclass AvatarItem extends $pb.GeneratedMessage {\n  factory AvatarItem({\n    $0.SizeSpec? containerSize,\n    $core.Iterable<LayerGroup>? layers,\n    LayerGroup? fallbackLayers,\n    $fixnum.Int64? mid,\n  }) {\n    final result = create();\n    if (containerSize != null) result.containerSize = containerSize;\n    if (layers != null) result.layers.addAll(layers);\n    if (fallbackLayers != null) result.fallbackLayers = fallbackLayers;\n    if (mid != null) result.mid = mid;\n    return result;\n  }\n\n  AvatarItem._();\n\n  factory AvatarItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AvatarItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AvatarItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.v1'),\n      createEmptyInstance: create)\n    ..aOM<$0.SizeSpec>(1, _omitFieldNames ? '' : 'containerSize',\n        subBuilder: $0.SizeSpec.create)\n    ..pPM<LayerGroup>(2, _omitFieldNames ? '' : 'layers',\n        subBuilder: LayerGroup.create)\n    ..aOM<LayerGroup>(3, _omitFieldNames ? '' : 'fallbackLayers',\n        subBuilder: LayerGroup.create)\n    ..aInt64(4, _omitFieldNames ? '' : 'mid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AvatarItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AvatarItem copyWith(void Function(AvatarItem) updates) =>\n      super.copyWith((message) => updates(message as AvatarItem)) as AvatarItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AvatarItem create() => AvatarItem._();\n  @$core.override\n  AvatarItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AvatarItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AvatarItem>(create);\n  static AvatarItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $0.SizeSpec get containerSize => $_getN(0);\n  @$pb.TagNumber(1)\n  set containerSize($0.SizeSpec value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasContainerSize() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearContainerSize() => $_clearField(1);\n  @$pb.TagNumber(1)\n  $0.SizeSpec ensureContainerSize() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<LayerGroup> get layers => $_getList(1);\n\n  @$pb.TagNumber(3)\n  LayerGroup get fallbackLayers => $_getN(2);\n  @$pb.TagNumber(3)\n  set fallbackLayers(LayerGroup value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFallbackLayers() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFallbackLayers() => $_clearField(3);\n  @$pb.TagNumber(3)\n  LayerGroup ensureFallbackLayers() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get mid => $_getI64(3);\n  @$pb.TagNumber(4)\n  set mid($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasMid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearMid() => $_clearField(4);\n}\n\nenum BasicLayerResource_Payload {\n  resImage,\n  resAnimation,\n  resNativeDraw,\n  notSet\n}\n\nclass BasicLayerResource extends $pb.GeneratedMessage {\n  factory BasicLayerResource({\n    BasicLayerResource_ResType? resType,\n    ResImage? resImage,\n    ResAnimation? resAnimation,\n    ResNativeDraw? resNativeDraw,\n  }) {\n    final result = create();\n    if (resType != null) result.resType = resType;\n    if (resImage != null) result.resImage = resImage;\n    if (resAnimation != null) result.resAnimation = resAnimation;\n    if (resNativeDraw != null) result.resNativeDraw = resNativeDraw;\n    return result;\n  }\n\n  BasicLayerResource._();\n\n  factory BasicLayerResource.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BasicLayerResource.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, BasicLayerResource_Payload>\n      _BasicLayerResource_PayloadByTag = {\n    2: BasicLayerResource_Payload.resImage,\n    3: BasicLayerResource_Payload.resAnimation,\n    4: BasicLayerResource_Payload.resNativeDraw,\n    0: BasicLayerResource_Payload.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BasicLayerResource',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [2, 3, 4])\n    ..aE<BasicLayerResource_ResType>(1, _omitFieldNames ? '' : 'resType',\n        enumValues: BasicLayerResource_ResType.values)\n    ..aOM<ResImage>(2, _omitFieldNames ? '' : 'resImage',\n        subBuilder: ResImage.create)\n    ..aOM<ResAnimation>(3, _omitFieldNames ? '' : 'resAnimation',\n        subBuilder: ResAnimation.create)\n    ..aOM<ResNativeDraw>(4, _omitFieldNames ? '' : 'resNativeDraw',\n        subBuilder: ResNativeDraw.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BasicLayerResource clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BasicLayerResource copyWith(void Function(BasicLayerResource) updates) =>\n      super.copyWith((message) => updates(message as BasicLayerResource))\n          as BasicLayerResource;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BasicLayerResource create() => BasicLayerResource._();\n  @$core.override\n  BasicLayerResource createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BasicLayerResource getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<BasicLayerResource>(create);\n  static BasicLayerResource? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  BasicLayerResource_Payload whichPayload() =>\n      _BasicLayerResource_PayloadByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  void clearPayload() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  BasicLayerResource_ResType get resType => $_getN(0);\n  @$pb.TagNumber(1)\n  set resType(BasicLayerResource_ResType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasResType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearResType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  ResImage get resImage => $_getN(1);\n  @$pb.TagNumber(2)\n  set resImage(ResImage value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasResImage() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearResImage() => $_clearField(2);\n  @$pb.TagNumber(2)\n  ResImage ensureResImage() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  ResAnimation get resAnimation => $_getN(2);\n  @$pb.TagNumber(3)\n  set resAnimation(ResAnimation value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasResAnimation() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearResAnimation() => $_clearField(3);\n  @$pb.TagNumber(3)\n  ResAnimation ensureResAnimation() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  ResNativeDraw get resNativeDraw => $_getN(3);\n  @$pb.TagNumber(4)\n  set resNativeDraw(ResNativeDraw value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasResNativeDraw() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearResNativeDraw() => $_clearField(4);\n  @$pb.TagNumber(4)\n  ResNativeDraw ensureResNativeDraw() => $_ensure(3);\n}\n\nclass GeneralConfig extends $pb.GeneratedMessage {\n  factory GeneralConfig({\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? webCssStyle,\n  }) {\n    final result = create();\n    if (webCssStyle != null) result.webCssStyle.addEntries(webCssStyle);\n    return result;\n  }\n\n  GeneralConfig._();\n\n  factory GeneralConfig.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory GeneralConfig.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'GeneralConfig',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.v1'),\n      createEmptyInstance: create)\n    ..m<$core.String, $core.String>(1, _omitFieldNames ? '' : 'webCssStyle',\n        entryClassName: 'GeneralConfig.WebCssStyleEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.dagw.component.avatar.v1'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GeneralConfig clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GeneralConfig copyWith(void Function(GeneralConfig) updates) =>\n      super.copyWith((message) => updates(message as GeneralConfig))\n          as GeneralConfig;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static GeneralConfig create() => GeneralConfig._();\n  @$core.override\n  GeneralConfig createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static GeneralConfig getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<GeneralConfig>(create);\n  static GeneralConfig? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbMap<$core.String, $core.String> get webCssStyle => $_getMap(0);\n}\n\nclass Layer extends $pb.GeneratedMessage {\n  factory Layer({\n    $core.String? layerId,\n    $core.bool? visible,\n    $0.LayerGeneralSpec? generalSpec,\n    LayerConfig? layerConfig,\n    BasicLayerResource? resource,\n  }) {\n    final result = create();\n    if (layerId != null) result.layerId = layerId;\n    if (visible != null) result.visible = visible;\n    if (generalSpec != null) result.generalSpec = generalSpec;\n    if (layerConfig != null) result.layerConfig = layerConfig;\n    if (resource != null) result.resource = resource;\n    return result;\n  }\n\n  Layer._();\n\n  factory Layer.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Layer.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Layer',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'layerId')\n    ..aOB(2, _omitFieldNames ? '' : 'visible')\n    ..aOM<$0.LayerGeneralSpec>(3, _omitFieldNames ? '' : 'generalSpec',\n        subBuilder: $0.LayerGeneralSpec.create)\n    ..aOM<LayerConfig>(4, _omitFieldNames ? '' : 'layerConfig',\n        subBuilder: LayerConfig.create)\n    ..aOM<BasicLayerResource>(5, _omitFieldNames ? '' : 'resource',\n        subBuilder: BasicLayerResource.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Layer clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Layer copyWith(void Function(Layer) updates) =>\n      super.copyWith((message) => updates(message as Layer)) as Layer;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Layer create() => Layer._();\n  @$core.override\n  Layer createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Layer getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Layer>(create);\n  static Layer? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get layerId => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set layerId($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLayerId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLayerId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get visible => $_getBF(1);\n  @$pb.TagNumber(2)\n  set visible($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasVisible() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearVisible() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $0.LayerGeneralSpec get generalSpec => $_getN(2);\n  @$pb.TagNumber(3)\n  set generalSpec($0.LayerGeneralSpec value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasGeneralSpec() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearGeneralSpec() => $_clearField(3);\n  @$pb.TagNumber(3)\n  $0.LayerGeneralSpec ensureGeneralSpec() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  LayerConfig get layerConfig => $_getN(3);\n  @$pb.TagNumber(4)\n  set layerConfig(LayerConfig value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLayerConfig() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLayerConfig() => $_clearField(4);\n  @$pb.TagNumber(4)\n  LayerConfig ensureLayerConfig() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  BasicLayerResource get resource => $_getN(4);\n  @$pb.TagNumber(5)\n  set resource(BasicLayerResource value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasResource() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearResource() => $_clearField(5);\n  @$pb.TagNumber(5)\n  BasicLayerResource ensureResource() => $_ensure(4);\n}\n\nclass LayerConfig extends $pb.GeneratedMessage {\n  factory LayerConfig({\n    $core.Iterable<$core.MapEntry<$core.String, LayerTagConfig>>? tags,\n    $core.bool? isCritical,\n    $core.bool? allowOverPaint,\n    $0.MaskProperty? layerMask,\n  }) {\n    final result = create();\n    if (tags != null) result.tags.addEntries(tags);\n    if (isCritical != null) result.isCritical = isCritical;\n    if (allowOverPaint != null) result.allowOverPaint = allowOverPaint;\n    if (layerMask != null) result.layerMask = layerMask;\n    return result;\n  }\n\n  LayerConfig._();\n\n  factory LayerConfig.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LayerConfig.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LayerConfig',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.v1'),\n      createEmptyInstance: create)\n    ..m<$core.String, LayerTagConfig>(1, _omitFieldNames ? '' : 'tags',\n        entryClassName: 'LayerConfig.TagsEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OM,\n        valueCreator: LayerTagConfig.create,\n        valueDefaultOrMaker: LayerTagConfig.getDefault,\n        packageName: const $pb.PackageName('bilibili.dagw.component.avatar.v1'))\n    ..aOB(2, _omitFieldNames ? '' : 'isCritical')\n    ..aOB(3, _omitFieldNames ? '' : 'allowOverPaint')\n    ..aOM<$0.MaskProperty>(4, _omitFieldNames ? '' : 'layerMask',\n        subBuilder: $0.MaskProperty.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LayerConfig clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LayerConfig copyWith(void Function(LayerConfig) updates) =>\n      super.copyWith((message) => updates(message as LayerConfig))\n          as LayerConfig;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LayerConfig create() => LayerConfig._();\n  @$core.override\n  LayerConfig createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LayerConfig getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LayerConfig>(create);\n  static LayerConfig? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbMap<$core.String, LayerTagConfig> get tags => $_getMap(0);\n\n  @$pb.TagNumber(2)\n  $core.bool get isCritical => $_getBF(1);\n  @$pb.TagNumber(2)\n  set isCritical($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIsCritical() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIsCritical() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get allowOverPaint => $_getBF(2);\n  @$pb.TagNumber(3)\n  set allowOverPaint($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAllowOverPaint() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAllowOverPaint() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $0.MaskProperty get layerMask => $_getN(3);\n  @$pb.TagNumber(4)\n  set layerMask($0.MaskProperty value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLayerMask() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLayerMask() => $_clearField(4);\n  @$pb.TagNumber(4)\n  $0.MaskProperty ensureLayerMask() => $_ensure(3);\n}\n\nclass LayerGroup extends $pb.GeneratedMessage {\n  factory LayerGroup({\n    $core.String? groupId,\n    $core.Iterable<Layer>? layers,\n    $0.MaskProperty? groupMask,\n    $core.bool? isCriticalGroup,\n  }) {\n    final result = create();\n    if (groupId != null) result.groupId = groupId;\n    if (layers != null) result.layers.addAll(layers);\n    if (groupMask != null) result.groupMask = groupMask;\n    if (isCriticalGroup != null) result.isCriticalGroup = isCriticalGroup;\n    return result;\n  }\n\n  LayerGroup._();\n\n  factory LayerGroup.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LayerGroup.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LayerGroup',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'groupId')\n    ..pPM<Layer>(2, _omitFieldNames ? '' : 'layers', subBuilder: Layer.create)\n    ..aOM<$0.MaskProperty>(3, _omitFieldNames ? '' : 'groupMask',\n        subBuilder: $0.MaskProperty.create)\n    ..aOB(4, _omitFieldNames ? '' : 'isCriticalGroup')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LayerGroup clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LayerGroup copyWith(void Function(LayerGroup) updates) =>\n      super.copyWith((message) => updates(message as LayerGroup)) as LayerGroup;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LayerGroup create() => LayerGroup._();\n  @$core.override\n  LayerGroup createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LayerGroup getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LayerGroup>(create);\n  static LayerGroup? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get groupId => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set groupId($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasGroupId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearGroupId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<Layer> get layers => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $0.MaskProperty get groupMask => $_getN(2);\n  @$pb.TagNumber(3)\n  set groupMask($0.MaskProperty value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasGroupMask() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearGroupMask() => $_clearField(3);\n  @$pb.TagNumber(3)\n  $0.MaskProperty ensureGroupMask() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.bool get isCriticalGroup => $_getBF(3);\n  @$pb.TagNumber(4)\n  set isCriticalGroup($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIsCriticalGroup() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIsCriticalGroup() => $_clearField(4);\n}\n\nenum LayerTagConfig_Config {\n  generalConfig,\n  gyroConfig,\n  commentDoubleClickConfig,\n  liveAnimeConfig,\n  webLiveAnimeConfig,\n  followIconConfig,\n  followActionConfig,\n  notSet\n}\n\nclass LayerTagConfig extends $pb.GeneratedMessage {\n  factory LayerTagConfig({\n    LayerTagConfig_TagConfigType? configType,\n    GeneralConfig? generalConfig,\n    $1.GyroConfig? gyroConfig,\n    $1.CommentDoubleClickConfig? commentDoubleClickConfig,\n    $1.LiveAnimeConfig? liveAnimeConfig,\n    $1.WebLiveAnimeConfig? webLiveAnimeConfig,\n    $1.FollowIconConfig? followIconConfig,\n    $1.FollowActionConfig? followActionConfig,\n  }) {\n    final result = create();\n    if (configType != null) result.configType = configType;\n    if (generalConfig != null) result.generalConfig = generalConfig;\n    if (gyroConfig != null) result.gyroConfig = gyroConfig;\n    if (commentDoubleClickConfig != null)\n      result.commentDoubleClickConfig = commentDoubleClickConfig;\n    if (liveAnimeConfig != null) result.liveAnimeConfig = liveAnimeConfig;\n    if (webLiveAnimeConfig != null)\n      result.webLiveAnimeConfig = webLiveAnimeConfig;\n    if (followIconConfig != null) result.followIconConfig = followIconConfig;\n    if (followActionConfig != null)\n      result.followActionConfig = followActionConfig;\n    return result;\n  }\n\n  LayerTagConfig._();\n\n  factory LayerTagConfig.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LayerTagConfig.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, LayerTagConfig_Config>\n      _LayerTagConfig_ConfigByTag = {\n    2: LayerTagConfig_Config.generalConfig,\n    3: LayerTagConfig_Config.gyroConfig,\n    4: LayerTagConfig_Config.commentDoubleClickConfig,\n    5: LayerTagConfig_Config.liveAnimeConfig,\n    6: LayerTagConfig_Config.webLiveAnimeConfig,\n    7: LayerTagConfig_Config.followIconConfig,\n    8: LayerTagConfig_Config.followActionConfig,\n    0: LayerTagConfig_Config.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LayerTagConfig',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [2, 3, 4, 5, 6, 7, 8])\n    ..aE<LayerTagConfig_TagConfigType>(1, _omitFieldNames ? '' : 'configType',\n        enumValues: LayerTagConfig_TagConfigType.values)\n    ..aOM<GeneralConfig>(2, _omitFieldNames ? '' : 'generalConfig',\n        subBuilder: GeneralConfig.create)\n    ..aOM<$1.GyroConfig>(3, _omitFieldNames ? '' : 'gyroConfig',\n        subBuilder: $1.GyroConfig.create)\n    ..aOM<$1.CommentDoubleClickConfig>(\n        4, _omitFieldNames ? '' : 'commentDoubleClickConfig',\n        subBuilder: $1.CommentDoubleClickConfig.create)\n    ..aOM<$1.LiveAnimeConfig>(5, _omitFieldNames ? '' : 'liveAnimeConfig',\n        subBuilder: $1.LiveAnimeConfig.create)\n    ..aOM<$1.WebLiveAnimeConfig>(6, _omitFieldNames ? '' : 'webLiveAnimeConfig',\n        subBuilder: $1.WebLiveAnimeConfig.create)\n    ..aOM<$1.FollowIconConfig>(7, _omitFieldNames ? '' : 'followIconConfig',\n        subBuilder: $1.FollowIconConfig.create)\n    ..aOM<$1.FollowActionConfig>(8, _omitFieldNames ? '' : 'followActionConfig',\n        subBuilder: $1.FollowActionConfig.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LayerTagConfig clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LayerTagConfig copyWith(void Function(LayerTagConfig) updates) =>\n      super.copyWith((message) => updates(message as LayerTagConfig))\n          as LayerTagConfig;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LayerTagConfig create() => LayerTagConfig._();\n  @$core.override\n  LayerTagConfig createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LayerTagConfig getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LayerTagConfig>(create);\n  static LayerTagConfig? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(7)\n  @$pb.TagNumber(8)\n  LayerTagConfig_Config whichConfig() =>\n      _LayerTagConfig_ConfigByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  @$pb.TagNumber(6)\n  @$pb.TagNumber(7)\n  @$pb.TagNumber(8)\n  void clearConfig() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  LayerTagConfig_TagConfigType get configType => $_getN(0);\n  @$pb.TagNumber(1)\n  set configType(LayerTagConfig_TagConfigType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasConfigType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearConfigType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  GeneralConfig get generalConfig => $_getN(1);\n  @$pb.TagNumber(2)\n  set generalConfig(GeneralConfig value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasGeneralConfig() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearGeneralConfig() => $_clearField(2);\n  @$pb.TagNumber(2)\n  GeneralConfig ensureGeneralConfig() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $1.GyroConfig get gyroConfig => $_getN(2);\n  @$pb.TagNumber(3)\n  set gyroConfig($1.GyroConfig value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasGyroConfig() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearGyroConfig() => $_clearField(3);\n  @$pb.TagNumber(3)\n  $1.GyroConfig ensureGyroConfig() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $1.CommentDoubleClickConfig get commentDoubleClickConfig => $_getN(3);\n  @$pb.TagNumber(4)\n  set commentDoubleClickConfig($1.CommentDoubleClickConfig value) =>\n      $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCommentDoubleClickConfig() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCommentDoubleClickConfig() => $_clearField(4);\n  @$pb.TagNumber(4)\n  $1.CommentDoubleClickConfig ensureCommentDoubleClickConfig() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $1.LiveAnimeConfig get liveAnimeConfig => $_getN(4);\n  @$pb.TagNumber(5)\n  set liveAnimeConfig($1.LiveAnimeConfig value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasLiveAnimeConfig() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearLiveAnimeConfig() => $_clearField(5);\n  @$pb.TagNumber(5)\n  $1.LiveAnimeConfig ensureLiveAnimeConfig() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $1.WebLiveAnimeConfig get webLiveAnimeConfig => $_getN(5);\n  @$pb.TagNumber(6)\n  set webLiveAnimeConfig($1.WebLiveAnimeConfig value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasWebLiveAnimeConfig() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearWebLiveAnimeConfig() => $_clearField(6);\n  @$pb.TagNumber(6)\n  $1.WebLiveAnimeConfig ensureWebLiveAnimeConfig() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $1.FollowIconConfig get followIconConfig => $_getN(6);\n  @$pb.TagNumber(7)\n  set followIconConfig($1.FollowIconConfig value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasFollowIconConfig() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearFollowIconConfig() => $_clearField(7);\n  @$pb.TagNumber(7)\n  $1.FollowIconConfig ensureFollowIconConfig() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  $1.FollowActionConfig get followActionConfig => $_getN(7);\n  @$pb.TagNumber(8)\n  set followActionConfig($1.FollowActionConfig value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasFollowActionConfig() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearFollowActionConfig() => $_clearField(8);\n  @$pb.TagNumber(8)\n  $1.FollowActionConfig ensureFollowActionConfig() => $_ensure(7);\n}\n\nclass ResAnimation extends $pb.GeneratedMessage {\n  factory ResAnimation({\n    $0.ResourceSource? webpSrc,\n  }) {\n    final result = create();\n    if (webpSrc != null) result.webpSrc = webpSrc;\n    return result;\n  }\n\n  ResAnimation._();\n\n  factory ResAnimation.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ResAnimation.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ResAnimation',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.v1'),\n      createEmptyInstance: create)\n    ..aOM<$0.ResourceSource>(1, _omitFieldNames ? '' : 'webpSrc',\n        subBuilder: $0.ResourceSource.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ResAnimation clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ResAnimation copyWith(void Function(ResAnimation) updates) =>\n      super.copyWith((message) => updates(message as ResAnimation))\n          as ResAnimation;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ResAnimation create() => ResAnimation._();\n  @$core.override\n  ResAnimation createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ResAnimation getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ResAnimation>(create);\n  static ResAnimation? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $0.ResourceSource get webpSrc => $_getN(0);\n  @$pb.TagNumber(1)\n  set webpSrc($0.ResourceSource value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasWebpSrc() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearWebpSrc() => $_clearField(1);\n  @$pb.TagNumber(1)\n  $0.ResourceSource ensureWebpSrc() => $_ensure(0);\n}\n\nclass ResImage extends $pb.GeneratedMessage {\n  factory ResImage({\n    $0.ResourceSource? imageSrc,\n  }) {\n    final result = create();\n    if (imageSrc != null) result.imageSrc = imageSrc;\n    return result;\n  }\n\n  ResImage._();\n\n  factory ResImage.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ResImage.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ResImage',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.v1'),\n      createEmptyInstance: create)\n    ..aOM<$0.ResourceSource>(1, _omitFieldNames ? '' : 'imageSrc',\n        subBuilder: $0.ResourceSource.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ResImage clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ResImage copyWith(void Function(ResImage) updates) =>\n      super.copyWith((message) => updates(message as ResImage)) as ResImage;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ResImage create() => ResImage._();\n  @$core.override\n  ResImage createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ResImage getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ResImage>(create);\n  static ResImage? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $0.ResourceSource get imageSrc => $_getN(0);\n  @$pb.TagNumber(1)\n  set imageSrc($0.ResourceSource value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasImageSrc() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearImageSrc() => $_clearField(1);\n  @$pb.TagNumber(1)\n  $0.ResourceSource ensureImageSrc() => $_ensure(0);\n}\n\nclass ResNativeDraw extends $pb.GeneratedMessage {\n  factory ResNativeDraw({\n    $0.ResourceSource? drawSrc,\n  }) {\n    final result = create();\n    if (drawSrc != null) result.drawSrc = drawSrc;\n    return result;\n  }\n\n  ResNativeDraw._();\n\n  factory ResNativeDraw.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ResNativeDraw.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ResNativeDraw',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.dagw.component.avatar.v1'),\n      createEmptyInstance: create)\n    ..aOM<$0.ResourceSource>(1, _omitFieldNames ? '' : 'drawSrc',\n        subBuilder: $0.ResourceSource.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ResNativeDraw clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ResNativeDraw copyWith(void Function(ResNativeDraw) updates) =>\n      super.copyWith((message) => updates(message as ResNativeDraw))\n          as ResNativeDraw;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ResNativeDraw create() => ResNativeDraw._();\n  @$core.override\n  ResNativeDraw createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ResNativeDraw getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ResNativeDraw>(create);\n  static ResNativeDraw? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $0.ResourceSource get drawSrc => $_getN(0);\n  @$pb.TagNumber(1)\n  set drawSrc($0.ResourceSource value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDrawSrc() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDrawSrc() => $_clearField(1);\n  @$pb.TagNumber(1)\n  $0.ResourceSource ensureDrawSrc() => $_ensure(0);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/dagw/component/avatar/v1.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/dagw/component/avatar/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nclass BasicLayerResource_ResType extends $pb.ProtobufEnum {\n  static const BasicLayerResource_ResType RES_TYPE_INVALID =\n      BasicLayerResource_ResType._(0, _omitEnumNames ? '' : 'RES_TYPE_INVALID');\n  static const BasicLayerResource_ResType RES_TYPE_PLUGIN =\n      BasicLayerResource_ResType._(1, _omitEnumNames ? '' : 'RES_TYPE_PLUGIN');\n  static const BasicLayerResource_ResType RES_TYPE_EMPTY =\n      BasicLayerResource_ResType._(2, _omitEnumNames ? '' : 'RES_TYPE_EMPTY');\n  static const BasicLayerResource_ResType RES_TYPE_IMAGE =\n      BasicLayerResource_ResType._(3, _omitEnumNames ? '' : 'RES_TYPE_IMAGE');\n  static const BasicLayerResource_ResType RES_TYPE_ANIMATION =\n      BasicLayerResource_ResType._(\n          4, _omitEnumNames ? '' : 'RES_TYPE_ANIMATION');\n  static const BasicLayerResource_ResType RES_TYPE_NATIVE_DRAW =\n      BasicLayerResource_ResType._(\n          5, _omitEnumNames ? '' : 'RES_TYPE_NATIVE_DRAW');\n\n  static const $core.List<BasicLayerResource_ResType> values =\n      <BasicLayerResource_ResType>[\n    RES_TYPE_INVALID,\n    RES_TYPE_PLUGIN,\n    RES_TYPE_EMPTY,\n    RES_TYPE_IMAGE,\n    RES_TYPE_ANIMATION,\n    RES_TYPE_NATIVE_DRAW,\n  ];\n\n  static final $core.List<BasicLayerResource_ResType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 5);\n  static BasicLayerResource_ResType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const BasicLayerResource_ResType._(super.value, super.name);\n}\n\nclass LayerTagConfig_TagConfigType extends $pb.ProtobufEnum {\n  static const LayerTagConfig_TagConfigType TAG_CFG_INVALID =\n      LayerTagConfig_TagConfigType._(\n          0, _omitEnumNames ? '' : 'TAG_CFG_INVALID');\n  static const LayerTagConfig_TagConfigType TAG_CFG_GENERAL =\n      LayerTagConfig_TagConfigType._(\n          1, _omitEnumNames ? '' : 'TAG_CFG_GENERAL');\n  static const LayerTagConfig_TagConfigType TAG_CFG_GYRO =\n      LayerTagConfig_TagConfigType._(2, _omitEnumNames ? '' : 'TAG_CFG_GYRO');\n  static const LayerTagConfig_TagConfigType TAG_CFG_COMMENT_DOUBLE_CLICK =\n      LayerTagConfig_TagConfigType._(\n          3, _omitEnumNames ? '' : 'TAG_CFG_COMMENT_DOUBLE_CLICK');\n  static const LayerTagConfig_TagConfigType TAG_CFG_IN_LIVE =\n      LayerTagConfig_TagConfigType._(\n          4, _omitEnumNames ? '' : 'TAG_CFG_IN_LIVE');\n  static const LayerTagConfig_TagConfigType TAG_CFG_WEB_IN_LIVE =\n      LayerTagConfig_TagConfigType._(\n          5, _omitEnumNames ? '' : 'TAG_CFG_WEB_IN_LIVE');\n  static const LayerTagConfig_TagConfigType TAG_CFG_FOLLOW_ICON =\n      LayerTagConfig_TagConfigType._(\n          6, _omitEnumNames ? '' : 'TAG_CFG_FOLLOW_ICON');\n  static const LayerTagConfig_TagConfigType TAG_CFG_FOLLOW_ACTION =\n      LayerTagConfig_TagConfigType._(\n          7, _omitEnumNames ? '' : 'TAG_CFG_FOLLOW_ACTION');\n\n  static const $core.List<LayerTagConfig_TagConfigType> values =\n      <LayerTagConfig_TagConfigType>[\n    TAG_CFG_INVALID,\n    TAG_CFG_GENERAL,\n    TAG_CFG_GYRO,\n    TAG_CFG_COMMENT_DOUBLE_CLICK,\n    TAG_CFG_IN_LIVE,\n    TAG_CFG_WEB_IN_LIVE,\n    TAG_CFG_FOLLOW_ICON,\n    TAG_CFG_FOLLOW_ACTION,\n  ];\n\n  static final $core.List<LayerTagConfig_TagConfigType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 7);\n  static LayerTagConfig_TagConfigType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const LayerTagConfig_TagConfigType._(super.value, super.name);\n}\n\nconst $core.bool _omitEnumNames =\n    $core.bool.fromEnvironment('protobuf.omit_enum_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/dagw/component/avatar/v1.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/dagw/component/avatar/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use avatarItemDescriptor instead')\nconst AvatarItem$json = {\n  '1': 'AvatarItem',\n  '2': [\n    {\n      '1': 'container_size',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.common.SizeSpec',\n      '10': 'containerSize'\n    },\n    {\n      '1': 'layers',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.LayerGroup',\n      '10': 'layers'\n    },\n    {\n      '1': 'fallback_layers',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.LayerGroup',\n      '10': 'fallbackLayers'\n    },\n    {'1': 'mid', '3': 4, '4': 1, '5': 3, '10': 'mid'},\n  ],\n};\n\n/// Descriptor for `AvatarItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List avatarItemDescriptor = $convert.base64Decode(\n    'CgpBdmF0YXJJdGVtElYKDmNvbnRhaW5lcl9zaXplGAEgASgLMi8uYmlsaWJpbGkuZGFndy5jb2'\n    '1wb25lbnQuYXZhdGFyLmNvbW1vbi5TaXplU3BlY1INY29udGFpbmVyU2l6ZRJFCgZsYXllcnMY'\n    'AiADKAsyLS5iaWxpYmlsaS5kYWd3LmNvbXBvbmVudC5hdmF0YXIudjEuTGF5ZXJHcm91cFIGbG'\n    'F5ZXJzElYKD2ZhbGxiYWNrX2xheWVycxgDIAEoCzItLmJpbGliaWxpLmRhZ3cuY29tcG9uZW50'\n    'LmF2YXRhci52MS5MYXllckdyb3VwUg5mYWxsYmFja0xheWVycxIQCgNtaWQYBCABKANSA21pZA'\n    '==');\n\n@$core.Deprecated('Use basicLayerResourceDescriptor instead')\nconst BasicLayerResource$json = {\n  '1': 'BasicLayerResource',\n  '2': [\n    {\n      '1': 'res_image',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.ResImage',\n      '9': 0,\n      '10': 'resImage'\n    },\n    {\n      '1': 'res_animation',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.ResAnimation',\n      '9': 0,\n      '10': 'resAnimation'\n    },\n    {\n      '1': 'res_native_draw',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.ResNativeDraw',\n      '9': 0,\n      '10': 'resNativeDraw'\n    },\n    {\n      '1': 'res_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.dagw.component.avatar.v1.BasicLayerResource.ResType',\n      '10': 'resType'\n    },\n  ],\n  '4': [BasicLayerResource_ResType$json],\n  '8': [\n    {'1': 'payload'},\n  ],\n};\n\n@$core.Deprecated('Use basicLayerResourceDescriptor instead')\nconst BasicLayerResource_ResType$json = {\n  '1': 'ResType',\n  '2': [\n    {'1': 'RES_TYPE_INVALID', '2': 0},\n    {'1': 'RES_TYPE_PLUGIN', '2': 1},\n    {'1': 'RES_TYPE_EMPTY', '2': 2},\n    {'1': 'RES_TYPE_IMAGE', '2': 3},\n    {'1': 'RES_TYPE_ANIMATION', '2': 4},\n    {'1': 'RES_TYPE_NATIVE_DRAW', '2': 5},\n  ],\n};\n\n/// Descriptor for `BasicLayerResource`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List basicLayerResourceDescriptor = $convert.base64Decode(\n    'ChJCYXNpY0xheWVyUmVzb3VyY2USSgoJcmVzX2ltYWdlGAIgASgLMisuYmlsaWJpbGkuZGFndy'\n    '5jb21wb25lbnQuYXZhdGFyLnYxLlJlc0ltYWdlSABSCHJlc0ltYWdlElYKDXJlc19hbmltYXRp'\n    'b24YAyABKAsyLy5iaWxpYmlsaS5kYWd3LmNvbXBvbmVudC5hdmF0YXIudjEuUmVzQW5pbWF0aW'\n    '9uSABSDHJlc0FuaW1hdGlvbhJaCg9yZXNfbmF0aXZlX2RyYXcYBCABKAsyMC5iaWxpYmlsaS5k'\n    'YWd3LmNvbXBvbmVudC5hdmF0YXIudjEuUmVzTmF0aXZlRHJhd0gAUg1yZXNOYXRpdmVEcmF3El'\n    'gKCHJlc190eXBlGAEgASgOMj0uYmlsaWJpbGkuZGFndy5jb21wb25lbnQuYXZhdGFyLnYxLkJh'\n    'c2ljTGF5ZXJSZXNvdXJjZS5SZXNUeXBlUgdyZXNUeXBlIo4BCgdSZXNUeXBlEhQKEFJFU19UWV'\n    'BFX0lOVkFMSUQQABITCg9SRVNfVFlQRV9QTFVHSU4QARISCg5SRVNfVFlQRV9FTVBUWRACEhIK'\n    'DlJFU19UWVBFX0lNQUdFEAMSFgoSUkVTX1RZUEVfQU5JTUFUSU9OEAQSGAoUUkVTX1RZUEVfTk'\n    'FUSVZFX0RSQVcQBUIJCgdwYXlsb2Fk');\n\n@$core.Deprecated('Use generalConfigDescriptor instead')\nconst GeneralConfig$json = {\n  '1': 'GeneralConfig',\n  '2': [\n    {\n      '1': 'web_css_style',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.GeneralConfig.WebCssStyleEntry',\n      '10': 'webCssStyle'\n    },\n  ],\n  '3': [GeneralConfig_WebCssStyleEntry$json],\n};\n\n@$core.Deprecated('Use generalConfigDescriptor instead')\nconst GeneralConfig_WebCssStyleEntry$json = {\n  '1': 'WebCssStyleEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `GeneralConfig`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List generalConfigDescriptor = $convert.base64Decode(\n    'Cg1HZW5lcmFsQ29uZmlnEmUKDXdlYl9jc3Nfc3R5bGUYASADKAsyQS5iaWxpYmlsaS5kYWd3Lm'\n    'NvbXBvbmVudC5hdmF0YXIudjEuR2VuZXJhbENvbmZpZy5XZWJDc3NTdHlsZUVudHJ5Ugt3ZWJD'\n    'c3NTdHlsZRo+ChBXZWJDc3NTdHlsZUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGA'\n    'IgASgJUgV2YWx1ZToCOAE=');\n\n@$core.Deprecated('Use layerDescriptor instead')\nconst Layer$json = {\n  '1': 'Layer',\n  '2': [\n    {'1': 'layer_id', '3': 1, '4': 1, '5': 9, '10': 'layerId'},\n    {'1': 'visible', '3': 2, '4': 1, '5': 8, '10': 'visible'},\n    {\n      '1': 'general_spec',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.common.LayerGeneralSpec',\n      '10': 'generalSpec'\n    },\n    {\n      '1': 'layer_config',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.LayerConfig',\n      '10': 'layerConfig'\n    },\n    {\n      '1': 'resource',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.BasicLayerResource',\n      '10': 'resource'\n    },\n  ],\n};\n\n/// Descriptor for `Layer`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List layerDescriptor = $convert.base64Decode(\n    'CgVMYXllchIZCghsYXllcl9pZBgBIAEoCVIHbGF5ZXJJZBIYCgd2aXNpYmxlGAIgASgIUgd2aX'\n    'NpYmxlEloKDGdlbmVyYWxfc3BlYxgDIAEoCzI3LmJpbGliaWxpLmRhZ3cuY29tcG9uZW50LmF2'\n    'YXRhci5jb21tb24uTGF5ZXJHZW5lcmFsU3BlY1ILZ2VuZXJhbFNwZWMSUQoMbGF5ZXJfY29uZm'\n    'lnGAQgASgLMi4uYmlsaWJpbGkuZGFndy5jb21wb25lbnQuYXZhdGFyLnYxLkxheWVyQ29uZmln'\n    'UgtsYXllckNvbmZpZxJRCghyZXNvdXJjZRgFIAEoCzI1LmJpbGliaWxpLmRhZ3cuY29tcG9uZW'\n    '50LmF2YXRhci52MS5CYXNpY0xheWVyUmVzb3VyY2VSCHJlc291cmNl');\n\n@$core.Deprecated('Use layerConfigDescriptor instead')\nconst LayerConfig$json = {\n  '1': 'LayerConfig',\n  '2': [\n    {\n      '1': 'tags',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.LayerConfig.TagsEntry',\n      '10': 'tags'\n    },\n    {'1': 'is_critical', '3': 2, '4': 1, '5': 8, '10': 'isCritical'},\n    {'1': 'allow_over_paint', '3': 3, '4': 1, '5': 8, '10': 'allowOverPaint'},\n    {\n      '1': 'layer_mask',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.common.MaskProperty',\n      '10': 'layerMask'\n    },\n  ],\n  '3': [LayerConfig_TagsEntry$json],\n};\n\n@$core.Deprecated('Use layerConfigDescriptor instead')\nconst LayerConfig_TagsEntry$json = {\n  '1': 'TagsEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {\n      '1': 'value',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.LayerTagConfig',\n      '10': 'value'\n    },\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `LayerConfig`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List layerConfigDescriptor = $convert.base64Decode(\n    'CgtMYXllckNvbmZpZxJMCgR0YWdzGAEgAygLMjguYmlsaWJpbGkuZGFndy5jb21wb25lbnQuYX'\n    'ZhdGFyLnYxLkxheWVyQ29uZmlnLlRhZ3NFbnRyeVIEdGFncxIfCgtpc19jcml0aWNhbBgCIAEo'\n    'CFIKaXNDcml0aWNhbBIoChBhbGxvd19vdmVyX3BhaW50GAMgASgIUg5hbGxvd092ZXJQYWludB'\n    'JSCgpsYXllcl9tYXNrGAQgASgLMjMuYmlsaWJpbGkuZGFndy5jb21wb25lbnQuYXZhdGFyLmNv'\n    'bW1vbi5NYXNrUHJvcGVydHlSCWxheWVyTWFzaxpqCglUYWdzRW50cnkSEAoDa2V5GAEgASgJUg'\n    'NrZXkSRwoFdmFsdWUYAiABKAsyMS5iaWxpYmlsaS5kYWd3LmNvbXBvbmVudC5hdmF0YXIudjEu'\n    'TGF5ZXJUYWdDb25maWdSBXZhbHVlOgI4AQ==');\n\n@$core.Deprecated('Use layerGroupDescriptor instead')\nconst LayerGroup$json = {\n  '1': 'LayerGroup',\n  '2': [\n    {'1': 'group_id', '3': 1, '4': 1, '5': 9, '10': 'groupId'},\n    {\n      '1': 'layers',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.Layer',\n      '10': 'layers'\n    },\n    {\n      '1': 'group_mask',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.common.MaskProperty',\n      '10': 'groupMask'\n    },\n    {'1': 'is_critical_group', '3': 4, '4': 1, '5': 8, '10': 'isCriticalGroup'},\n  ],\n};\n\n/// Descriptor for `LayerGroup`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List layerGroupDescriptor = $convert.base64Decode(\n    'CgpMYXllckdyb3VwEhkKCGdyb3VwX2lkGAEgASgJUgdncm91cElkEkAKBmxheWVycxgCIAMoCz'\n    'IoLmJpbGliaWxpLmRhZ3cuY29tcG9uZW50LmF2YXRhci52MS5MYXllclIGbGF5ZXJzElIKCmdy'\n    'b3VwX21hc2sYAyABKAsyMy5iaWxpYmlsaS5kYWd3LmNvbXBvbmVudC5hdmF0YXIuY29tbW9uLk'\n    '1hc2tQcm9wZXJ0eVIJZ3JvdXBNYXNrEioKEWlzX2NyaXRpY2FsX2dyb3VwGAQgASgIUg9pc0Ny'\n    'aXRpY2FsR3JvdXA=');\n\n@$core.Deprecated('Use layerTagConfigDescriptor instead')\nconst LayerTagConfig$json = {\n  '1': 'LayerTagConfig',\n  '2': [\n    {\n      '1': 'general_config',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.GeneralConfig',\n      '9': 0,\n      '10': 'generalConfig'\n    },\n    {\n      '1': 'gyro_config',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.plugin.GyroConfig',\n      '9': 0,\n      '10': 'gyroConfig'\n    },\n    {\n      '1': 'comment_double_click_config',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.plugin.CommentDoubleClickConfig',\n      '9': 0,\n      '10': 'commentDoubleClickConfig'\n    },\n    {\n      '1': 'live_anime_config',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.plugin.LiveAnimeConfig',\n      '9': 0,\n      '10': 'liveAnimeConfig'\n    },\n    {\n      '1': 'web_live_anime_config',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.plugin.WebLiveAnimeConfig',\n      '9': 0,\n      '10': 'webLiveAnimeConfig'\n    },\n    {\n      '1': 'follow_icon_config',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.plugin.FollowIconConfig',\n      '9': 0,\n      '10': 'followIconConfig'\n    },\n    {\n      '1': 'follow_action_config',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.plugin.FollowActionConfig',\n      '9': 0,\n      '10': 'followActionConfig'\n    },\n    {\n      '1': 'config_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.dagw.component.avatar.v1.LayerTagConfig.TagConfigType',\n      '10': 'configType'\n    },\n  ],\n  '4': [LayerTagConfig_TagConfigType$json],\n  '8': [\n    {'1': 'config'},\n  ],\n};\n\n@$core.Deprecated('Use layerTagConfigDescriptor instead')\nconst LayerTagConfig_TagConfigType$json = {\n  '1': 'TagConfigType',\n  '2': [\n    {'1': 'TAG_CFG_INVALID', '2': 0},\n    {'1': 'TAG_CFG_GENERAL', '2': 1},\n    {'1': 'TAG_CFG_GYRO', '2': 2},\n    {'1': 'TAG_CFG_COMMENT_DOUBLE_CLICK', '2': 3},\n    {'1': 'TAG_CFG_IN_LIVE', '2': 4},\n    {'1': 'TAG_CFG_WEB_IN_LIVE', '2': 5},\n    {'1': 'TAG_CFG_FOLLOW_ICON', '2': 6},\n    {'1': 'TAG_CFG_FOLLOW_ACTION', '2': 7},\n  ],\n};\n\n/// Descriptor for `LayerTagConfig`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List layerTagConfigDescriptor = $convert.base64Decode(\n    'Cg5MYXllclRhZ0NvbmZpZxJZCg5nZW5lcmFsX2NvbmZpZxgCIAEoCzIwLmJpbGliaWxpLmRhZ3'\n    'cuY29tcG9uZW50LmF2YXRhci52MS5HZW5lcmFsQ29uZmlnSABSDWdlbmVyYWxDb25maWcSVwoL'\n    'Z3lyb19jb25maWcYAyABKAsyNC5iaWxpYmlsaS5kYWd3LmNvbXBvbmVudC5hdmF0YXIudjEucG'\n    'x1Z2luLkd5cm9Db25maWdIAFIKZ3lyb0NvbmZpZxKDAQobY29tbWVudF9kb3VibGVfY2xpY2tf'\n    'Y29uZmlnGAQgASgLMkIuYmlsaWJpbGkuZGFndy5jb21wb25lbnQuYXZhdGFyLnYxLnBsdWdpbi'\n    '5Db21tZW50RG91YmxlQ2xpY2tDb25maWdIAFIYY29tbWVudERvdWJsZUNsaWNrQ29uZmlnEmcK'\n    'EWxpdmVfYW5pbWVfY29uZmlnGAUgASgLMjkuYmlsaWJpbGkuZGFndy5jb21wb25lbnQuYXZhdG'\n    'FyLnYxLnBsdWdpbi5MaXZlQW5pbWVDb25maWdIAFIPbGl2ZUFuaW1lQ29uZmlnEnEKFXdlYl9s'\n    'aXZlX2FuaW1lX2NvbmZpZxgGIAEoCzI8LmJpbGliaWxpLmRhZ3cuY29tcG9uZW50LmF2YXRhci'\n    '52MS5wbHVnaW4uV2ViTGl2ZUFuaW1lQ29uZmlnSABSEndlYkxpdmVBbmltZUNvbmZpZxJqChJm'\n    'b2xsb3dfaWNvbl9jb25maWcYByABKAsyOi5iaWxpYmlsaS5kYWd3LmNvbXBvbmVudC5hdmF0YX'\n    'IudjEucGx1Z2luLkZvbGxvd0ljb25Db25maWdIAFIQZm9sbG93SWNvbkNvbmZpZxJwChRmb2xs'\n    'b3dfYWN0aW9uX2NvbmZpZxgIIAEoCzI8LmJpbGliaWxpLmRhZ3cuY29tcG9uZW50LmF2YXRhci'\n    '52MS5wbHVnaW4uRm9sbG93QWN0aW9uQ29uZmlnSABSEmZvbGxvd0FjdGlvbkNvbmZpZxJgCgtj'\n    'b25maWdfdHlwZRgBIAEoDjI/LmJpbGliaWxpLmRhZ3cuY29tcG9uZW50LmF2YXRhci52MS5MYX'\n    'llclRhZ0NvbmZpZy5UYWdDb25maWdUeXBlUgpjb25maWdUeXBlIs8BCg1UYWdDb25maWdUeXBl'\n    'EhMKD1RBR19DRkdfSU5WQUxJRBAAEhMKD1RBR19DRkdfR0VORVJBTBABEhAKDFRBR19DRkdfR1'\n    'lSTxACEiAKHFRBR19DRkdfQ09NTUVOVF9ET1VCTEVfQ0xJQ0sQAxITCg9UQUdfQ0ZHX0lOX0xJ'\n    'VkUQBBIXChNUQUdfQ0ZHX1dFQl9JTl9MSVZFEAUSFwoTVEFHX0NGR19GT0xMT1dfSUNPThAGEh'\n    'kKFVRBR19DRkdfRk9MTE9XX0FDVElPThAHQggKBmNvbmZpZw==');\n\n@$core.Deprecated('Use resAnimationDescriptor instead')\nconst ResAnimation$json = {\n  '1': 'ResAnimation',\n  '2': [\n    {\n      '1': 'webp_src',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.common.ResourceSource',\n      '10': 'webpSrc'\n    },\n  ],\n};\n\n/// Descriptor for `ResAnimation`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List resAnimationDescriptor = $convert.base64Decode(\n    'CgxSZXNBbmltYXRpb24SUAoId2VicF9zcmMYASABKAsyNS5iaWxpYmlsaS5kYWd3LmNvbXBvbm'\n    'VudC5hdmF0YXIuY29tbW9uLlJlc291cmNlU291cmNlUgd3ZWJwU3Jj');\n\n@$core.Deprecated('Use resImageDescriptor instead')\nconst ResImage$json = {\n  '1': 'ResImage',\n  '2': [\n    {\n      '1': 'image_src',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.common.ResourceSource',\n      '10': 'imageSrc'\n    },\n  ],\n};\n\n/// Descriptor for `ResImage`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List resImageDescriptor = $convert.base64Decode(\n    'CghSZXNJbWFnZRJSCglpbWFnZV9zcmMYASABKAsyNS5iaWxpYmlsaS5kYWd3LmNvbXBvbmVudC'\n    '5hdmF0YXIuY29tbW9uLlJlc291cmNlU291cmNlUghpbWFnZVNyYw==');\n\n@$core.Deprecated('Use resNativeDrawDescriptor instead')\nconst ResNativeDraw$json = {\n  '1': 'ResNativeDraw',\n  '2': [\n    {\n      '1': 'draw_src',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.common.ResourceSource',\n      '10': 'drawSrc'\n    },\n  ],\n};\n\n/// Descriptor for `ResNativeDraw`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List resNativeDrawDescriptor = $convert.base64Decode(\n    'Cg1SZXNOYXRpdmVEcmF3ElAKCGRyYXdfc3JjGAEgASgLMjUuYmlsaWJpbGkuZGFndy5jb21wb2'\n    '5lbnQuYXZhdGFyLmNvbW1vbi5SZXNvdXJjZVNvdXJjZVIHZHJhd1NyYw==');\n"
  },
  {
    "path": "lib/grpc/bilibili/im/interfaces/v1.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/im/interfaces/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:fixnum/fixnum.dart' as $fixnum;\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nimport '../type.pb.dart' as $1;\nimport 'v1.pbenum.dart';\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nexport 'v1.pbenum.dart';\n\nclass DummyReq extends $pb.GeneratedMessage {\n  factory DummyReq({\n    $core.int? idl,\n  }) {\n    final result = create();\n    if (idl != null) result.idl = idl;\n    return result;\n  }\n\n  DummyReq._();\n\n  factory DummyReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DummyReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DummyReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'idl')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DummyReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DummyReq copyWith(void Function(DummyReq) updates) =>\n      super.copyWith((message) => updates(message as DummyReq)) as DummyReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DummyReq create() => DummyReq._();\n  @$core.override\n  DummyReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DummyReq getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DummyReq>(create);\n  static DummyReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get idl => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set idl($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIdl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIdl() => $_clearField(1);\n}\n\nclass DummyRsp extends $pb.GeneratedMessage {\n  factory DummyRsp() => create();\n\n  DummyRsp._();\n\n  factory DummyRsp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DummyRsp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DummyRsp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DummyRsp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DummyRsp copyWith(void Function(DummyRsp) updates) =>\n      super.copyWith((message) => updates(message as DummyRsp)) as DummyRsp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DummyRsp create() => DummyRsp._();\n  @$core.override\n  DummyRsp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DummyRsp getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DummyRsp>(create);\n  static DummyRsp? _defaultInstance;\n}\n\nclass EmotionInfo extends $pb.GeneratedMessage {\n  factory EmotionInfo({\n    $core.String? text,\n    $core.String? url,\n    $core.int? size,\n    $core.String? gifUrl,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (url != null) result.url = url;\n    if (size != null) result.size = size;\n    if (gifUrl != null) result.gifUrl = gifUrl;\n    return result;\n  }\n\n  EmotionInfo._();\n\n  factory EmotionInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory EmotionInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'EmotionInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aOS(2, _omitFieldNames ? '' : 'url')\n    ..aI(3, _omitFieldNames ? '' : 'size')\n    ..aOS(4, _omitFieldNames ? '' : 'gifUrl')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  EmotionInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  EmotionInfo copyWith(void Function(EmotionInfo) updates) =>\n      super.copyWith((message) => updates(message as EmotionInfo))\n          as EmotionInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static EmotionInfo create() => EmotionInfo._();\n  @$core.override\n  EmotionInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static EmotionInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<EmotionInfo>(create);\n  static EmotionInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get url => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set url($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUrl() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get size => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set size($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSize() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSize() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get gifUrl => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set gifUrl($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasGifUrl() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearGifUrl() => $_clearField(4);\n}\n\nclass GetUserCosmoStateReq extends $pb.GeneratedMessage {\n  factory GetUserCosmoStateReq({\n    $core.String? business,\n    $fixnum.Int64? cardSendMid,\n  }) {\n    final result = create();\n    if (business != null) result.business = business;\n    if (cardSendMid != null) result.cardSendMid = cardSendMid;\n    return result;\n  }\n\n  GetUserCosmoStateReq._();\n\n  factory GetUserCosmoStateReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory GetUserCosmoStateReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'GetUserCosmoStateReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'business')\n    ..aInt64(2, _omitFieldNames ? '' : 'cardSendMid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GetUserCosmoStateReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GetUserCosmoStateReq copyWith(void Function(GetUserCosmoStateReq) updates) =>\n      super.copyWith((message) => updates(message as GetUserCosmoStateReq))\n          as GetUserCosmoStateReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static GetUserCosmoStateReq create() => GetUserCosmoStateReq._();\n  @$core.override\n  GetUserCosmoStateReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static GetUserCosmoStateReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<GetUserCosmoStateReq>(create);\n  static GetUserCosmoStateReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get business => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set business($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBusiness() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBusiness() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get cardSendMid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set cardSendMid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCardSendMid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCardSendMid() => $_clearField(2);\n}\n\nclass GetUserCosmoStateRsp extends $pb.GeneratedMessage {\n  factory GetUserCosmoStateRsp({\n    $core.String? business,\n    $fixnum.Int64? cardSendMid,\n    $core.int? cosmoState,\n    $core.int? opType,\n    $core.String? text,\n  }) {\n    final result = create();\n    if (business != null) result.business = business;\n    if (cardSendMid != null) result.cardSendMid = cardSendMid;\n    if (cosmoState != null) result.cosmoState = cosmoState;\n    if (opType != null) result.opType = opType;\n    if (text != null) result.text = text;\n    return result;\n  }\n\n  GetUserCosmoStateRsp._();\n\n  factory GetUserCosmoStateRsp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory GetUserCosmoStateRsp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'GetUserCosmoStateRsp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'business')\n    ..aInt64(2, _omitFieldNames ? '' : 'cardSendMid')\n    ..aI(3, _omitFieldNames ? '' : 'cosmoState')\n    ..aI(4, _omitFieldNames ? '' : 'opType')\n    ..aOS(5, _omitFieldNames ? '' : 'text')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GetUserCosmoStateRsp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GetUserCosmoStateRsp copyWith(void Function(GetUserCosmoStateRsp) updates) =>\n      super.copyWith((message) => updates(message as GetUserCosmoStateRsp))\n          as GetUserCosmoStateRsp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static GetUserCosmoStateRsp create() => GetUserCosmoStateRsp._();\n  @$core.override\n  GetUserCosmoStateRsp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static GetUserCosmoStateRsp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<GetUserCosmoStateRsp>(create);\n  static GetUserCosmoStateRsp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get business => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set business($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBusiness() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBusiness() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get cardSendMid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set cardSendMid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCardSendMid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCardSendMid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get cosmoState => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set cosmoState($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCosmoState() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCosmoState() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get opType => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set opType($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasOpType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearOpType() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get text => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set text($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasText() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearText() => $_clearField(5);\n}\n\nclass HasLikeState extends $pb.GeneratedMessage {\n  factory HasLikeState({\n    MSG_LIKE_STATE? state,\n  }) {\n    final result = create();\n    if (state != null) result.state = state;\n    return result;\n  }\n\n  HasLikeState._();\n\n  factory HasLikeState.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory HasLikeState.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'HasLikeState',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aE<MSG_LIKE_STATE>(1, _omitFieldNames ? '' : 'state',\n        enumValues: MSG_LIKE_STATE.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  HasLikeState clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  HasLikeState copyWith(void Function(HasLikeState) updates) =>\n      super.copyWith((message) => updates(message as HasLikeState))\n          as HasLikeState;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static HasLikeState create() => HasLikeState._();\n  @$core.override\n  HasLikeState createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static HasLikeState getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<HasLikeState>(create);\n  static HasLikeState? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  MSG_LIKE_STATE get state => $_getN(0);\n  @$pb.TagNumber(1)\n  set state(MSG_LIKE_STATE value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasState() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearState() => $_clearField(1);\n}\n\nclass MsgDetail extends $pb.GeneratedMessage {\n  factory MsgDetail({\n    $fixnum.Int64? msgKey,\n    $fixnum.Int64? seqno,\n  }) {\n    final result = create();\n    if (msgKey != null) result.msgKey = msgKey;\n    if (seqno != null) result.seqno = seqno;\n    return result;\n  }\n\n  MsgDetail._();\n\n  factory MsgDetail.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MsgDetail.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MsgDetail',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'msgKey')\n    ..aInt64(2, _omitFieldNames ? '' : 'seqno')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MsgDetail clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MsgDetail copyWith(void Function(MsgDetail) updates) =>\n      super.copyWith((message) => updates(message as MsgDetail)) as MsgDetail;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MsgDetail create() => MsgDetail._();\n  @$core.override\n  MsgDetail createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MsgDetail getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<MsgDetail>(create);\n  static MsgDetail? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get msgKey => $_getI64(0);\n  @$pb.TagNumber(1)\n  set msgKey($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMsgKey() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMsgKey() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get seqno => $_getI64(1);\n  @$pb.TagNumber(2)\n  set seqno($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSeqno() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSeqno() => $_clearField(2);\n}\n\nclass MsgFeedUnreadRsp extends $pb.GeneratedMessage {\n  factory MsgFeedUnreadRsp({\n    $core.Iterable<$core.MapEntry<$core.String, $fixnum.Int64>>? unread,\n  }) {\n    final result = create();\n    if (unread != null) result.unread.addEntries(unread);\n    return result;\n  }\n\n  MsgFeedUnreadRsp._();\n\n  factory MsgFeedUnreadRsp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MsgFeedUnreadRsp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MsgFeedUnreadRsp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..m<$core.String, $fixnum.Int64>(1, _omitFieldNames ? '' : 'unread',\n        entryClassName: 'MsgFeedUnreadRsp.UnreadEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.O6,\n        packageName: const $pb.PackageName('bilibili.im.interfaces.v1'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MsgFeedUnreadRsp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MsgFeedUnreadRsp copyWith(void Function(MsgFeedUnreadRsp) updates) =>\n      super.copyWith((message) => updates(message as MsgFeedUnreadRsp))\n          as MsgFeedUnreadRsp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MsgFeedUnreadRsp create() => MsgFeedUnreadRsp._();\n  @$core.override\n  MsgFeedUnreadRsp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MsgFeedUnreadRsp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MsgFeedUnreadRsp>(create);\n  static MsgFeedUnreadRsp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbMap<$core.String, $fixnum.Int64> get unread => $_getMap(0);\n}\n\nclass NewTotalUnread extends $pb.GeneratedMessage {\n  factory NewTotalUnread({\n    $core.int? unreadCount,\n    $core.int? unreadType,\n  }) {\n    final result = create();\n    if (unreadCount != null) result.unreadCount = unreadCount;\n    if (unreadType != null) result.unreadType = unreadType;\n    return result;\n  }\n\n  NewTotalUnread._();\n\n  factory NewTotalUnread.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory NewTotalUnread.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'NewTotalUnread',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'unreadCount')\n    ..aI(2, _omitFieldNames ? '' : 'unreadType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NewTotalUnread clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NewTotalUnread copyWith(void Function(NewTotalUnread) updates) =>\n      super.copyWith((message) => updates(message as NewTotalUnread))\n          as NewTotalUnread;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static NewTotalUnread create() => NewTotalUnread._();\n  @$core.override\n  NewTotalUnread createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static NewTotalUnread getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<NewTotalUnread>(create);\n  static NewTotalUnread? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get unreadCount => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set unreadCount($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUnreadCount() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUnreadCount() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get unreadType => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set unreadType($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUnreadType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUnreadType() => $_clearField(2);\n}\n\nclass ReqAckAssisMsg extends $pb.GeneratedMessage {\n  factory ReqAckAssisMsg({\n    $fixnum.Int64? ackSeqno,\n  }) {\n    final result = create();\n    if (ackSeqno != null) result.ackSeqno = ackSeqno;\n    return result;\n  }\n\n  ReqAckAssisMsg._();\n\n  factory ReqAckAssisMsg.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqAckAssisMsg.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqAckAssisMsg',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'ackSeqno')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqAckAssisMsg clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqAckAssisMsg copyWith(void Function(ReqAckAssisMsg) updates) =>\n      super.copyWith((message) => updates(message as ReqAckAssisMsg))\n          as ReqAckAssisMsg;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqAckAssisMsg create() => ReqAckAssisMsg._();\n  @$core.override\n  ReqAckAssisMsg createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqAckAssisMsg getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReqAckAssisMsg>(create);\n  static ReqAckAssisMsg? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get ackSeqno => $_getI64(0);\n  @$pb.TagNumber(1)\n  set ackSeqno($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAckSeqno() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAckSeqno() => $_clearField(1);\n}\n\nclass ReqAckSessions extends $pb.GeneratedMessage {\n  factory ReqAckSessions({\n    $fixnum.Int64? beginTs,\n    $core.int? endTs,\n    $core.int? size,\n  }) {\n    final result = create();\n    if (beginTs != null) result.beginTs = beginTs;\n    if (endTs != null) result.endTs = endTs;\n    if (size != null) result.size = size;\n    return result;\n  }\n\n  ReqAckSessions._();\n\n  factory ReqAckSessions.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqAckSessions.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqAckSessions',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'beginTs')\n    ..aI(2, _omitFieldNames ? '' : 'endTs')\n    ..aI(3, _omitFieldNames ? '' : 'size')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqAckSessions clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqAckSessions copyWith(void Function(ReqAckSessions) updates) =>\n      super.copyWith((message) => updates(message as ReqAckSessions))\n          as ReqAckSessions;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqAckSessions create() => ReqAckSessions._();\n  @$core.override\n  ReqAckSessions createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqAckSessions getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReqAckSessions>(create);\n  static ReqAckSessions? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get beginTs => $_getI64(0);\n  @$pb.TagNumber(1)\n  set beginTs($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBeginTs() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBeginTs() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get endTs => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set endTs($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasEndTs() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearEndTs() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get size => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set size($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSize() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSize() => $_clearField(3);\n}\n\nclass ReqBatRmSess extends $pb.GeneratedMessage {\n  factory ReqBatRmSess() => create();\n\n  ReqBatRmSess._();\n\n  factory ReqBatRmSess.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqBatRmSess.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqBatRmSess',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqBatRmSess clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqBatRmSess copyWith(void Function(ReqBatRmSess) updates) =>\n      super.copyWith((message) => updates(message as ReqBatRmSess))\n          as ReqBatRmSess;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqBatRmSess create() => ReqBatRmSess._();\n  @$core.override\n  ReqBatRmSess createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqBatRmSess getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReqBatRmSess>(create);\n  static ReqBatRmSess? _defaultInstance;\n}\n\nclass ReqCloseClearUnreadUI extends $pb.GeneratedMessage {\n  factory ReqCloseClearUnreadUI() => create();\n\n  ReqCloseClearUnreadUI._();\n\n  factory ReqCloseClearUnreadUI.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqCloseClearUnreadUI.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqCloseClearUnreadUI',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqCloseClearUnreadUI clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqCloseClearUnreadUI copyWith(\n          void Function(ReqCloseClearUnreadUI) updates) =>\n      super.copyWith((message) => updates(message as ReqCloseClearUnreadUI))\n          as ReqCloseClearUnreadUI;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqCloseClearUnreadUI create() => ReqCloseClearUnreadUI._();\n  @$core.override\n  ReqCloseClearUnreadUI createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqCloseClearUnreadUI getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReqCloseClearUnreadUI>(create);\n  static ReqCloseClearUnreadUI? _defaultInstance;\n}\n\nclass ReqGetDiscussListInImPage extends $pb.GeneratedMessage {\n  factory ReqGetDiscussListInImPage() => create();\n\n  ReqGetDiscussListInImPage._();\n\n  factory ReqGetDiscussListInImPage.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqGetDiscussListInImPage.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqGetDiscussListInImPage',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqGetDiscussListInImPage clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqGetDiscussListInImPage copyWith(\n          void Function(ReqGetDiscussListInImPage) updates) =>\n      super.copyWith((message) => updates(message as ReqGetDiscussListInImPage))\n          as ReqGetDiscussListInImPage;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqGetDiscussListInImPage create() => ReqGetDiscussListInImPage._();\n  @$core.override\n  ReqGetDiscussListInImPage createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqGetDiscussListInImPage getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReqGetDiscussListInImPage>(create);\n  static ReqGetDiscussListInImPage? _defaultInstance;\n}\n\nclass ReqGetMsg extends $pb.GeneratedMessage {\n  factory ReqGetMsg({\n    $fixnum.Int64? talkerId,\n    $core.int? sessionType,\n    $core.Iterable<MsgDetail>? msgDetail,\n  }) {\n    final result = create();\n    if (talkerId != null) result.talkerId = talkerId;\n    if (sessionType != null) result.sessionType = sessionType;\n    if (msgDetail != null) result.msgDetail.addAll(msgDetail);\n    return result;\n  }\n\n  ReqGetMsg._();\n\n  factory ReqGetMsg.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqGetMsg.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqGetMsg',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'talkerId')\n    ..aI(2, _omitFieldNames ? '' : 'sessionType')\n    ..pPM<MsgDetail>(3, _omitFieldNames ? '' : 'msgDetail',\n        subBuilder: MsgDetail.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqGetMsg clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqGetMsg copyWith(void Function(ReqGetMsg) updates) =>\n      super.copyWith((message) => updates(message as ReqGetMsg)) as ReqGetMsg;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqGetMsg create() => ReqGetMsg._();\n  @$core.override\n  ReqGetMsg createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqGetMsg getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ReqGetMsg>(create);\n  static ReqGetMsg? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get talkerId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set talkerId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTalkerId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTalkerId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get sessionType => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set sessionType($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSessionType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSessionType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<MsgDetail> get msgDetail => $_getList(2);\n}\n\nclass ReqGetSessions extends $pb.GeneratedMessage {\n  factory ReqGetSessions({\n    $fixnum.Int64? beginTs,\n    $fixnum.Int64? endTs,\n    $core.int? size,\n    $core.int? sessionType,\n    $core.int? unfollowFold,\n    $core.int? groupFold,\n    $core.int? sortRule,\n    $core.int? teenagerMode,\n    $core.int? lessonsMode,\n    $core.Iterable<$core.int>? sids,\n    $fixnum.Int64? aiUid,\n  }) {\n    final result = create();\n    if (beginTs != null) result.beginTs = beginTs;\n    if (endTs != null) result.endTs = endTs;\n    if (size != null) result.size = size;\n    if (sessionType != null) result.sessionType = sessionType;\n    if (unfollowFold != null) result.unfollowFold = unfollowFold;\n    if (groupFold != null) result.groupFold = groupFold;\n    if (sortRule != null) result.sortRule = sortRule;\n    if (teenagerMode != null) result.teenagerMode = teenagerMode;\n    if (lessonsMode != null) result.lessonsMode = lessonsMode;\n    if (sids != null) result.sids.addAll(sids);\n    if (aiUid != null) result.aiUid = aiUid;\n    return result;\n  }\n\n  ReqGetSessions._();\n\n  factory ReqGetSessions.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqGetSessions.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqGetSessions',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'beginTs')\n    ..aInt64(2, _omitFieldNames ? '' : 'endTs')\n    ..aI(3, _omitFieldNames ? '' : 'size')\n    ..aI(4, _omitFieldNames ? '' : 'sessionType')\n    ..aI(5, _omitFieldNames ? '' : 'unfollowFold')\n    ..aI(6, _omitFieldNames ? '' : 'groupFold')\n    ..aI(7, _omitFieldNames ? '' : 'sortRule')\n    ..aI(8, _omitFieldNames ? '' : 'teenagerMode')\n    ..aI(9, _omitFieldNames ? '' : 'lessonsMode')\n    ..p<$core.int>(10, _omitFieldNames ? '' : 'sids', $pb.PbFieldType.K3)\n    ..aInt64(11, _omitFieldNames ? '' : 'aiUid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqGetSessions clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqGetSessions copyWith(void Function(ReqGetSessions) updates) =>\n      super.copyWith((message) => updates(message as ReqGetSessions))\n          as ReqGetSessions;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqGetSessions create() => ReqGetSessions._();\n  @$core.override\n  ReqGetSessions createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqGetSessions getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReqGetSessions>(create);\n  static ReqGetSessions? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get beginTs => $_getI64(0);\n  @$pb.TagNumber(1)\n  set beginTs($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBeginTs() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBeginTs() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get endTs => $_getI64(1);\n  @$pb.TagNumber(2)\n  set endTs($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasEndTs() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearEndTs() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get size => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set size($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSize() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSize() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get sessionType => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set sessionType($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSessionType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSessionType() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get unfollowFold => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set unfollowFold($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasUnfollowFold() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearUnfollowFold() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get groupFold => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set groupFold($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasGroupFold() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearGroupFold() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get sortRule => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set sortRule($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasSortRule() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearSortRule() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get teenagerMode => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set teenagerMode($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasTeenagerMode() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearTeenagerMode() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.int get lessonsMode => $_getIZ(8);\n  @$pb.TagNumber(9)\n  set lessonsMode($core.int value) => $_setSignedInt32(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasLessonsMode() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearLessonsMode() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $pb.PbList<$core.int> get sids => $_getList(9);\n\n  @$pb.TagNumber(11)\n  $fixnum.Int64 get aiUid => $_getI64(10);\n  @$pb.TagNumber(11)\n  set aiUid($fixnum.Int64 value) => $_setInt64(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasAiUid() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearAiUid() => $_clearField(11);\n}\n\nclass ReqGetSpecificSessions extends $pb.GeneratedMessage {\n  factory ReqGetSpecificSessions({\n    $core.Iterable<SimpleSession>? talkerSessions,\n  }) {\n    final result = create();\n    if (talkerSessions != null) result.talkerSessions.addAll(talkerSessions);\n    return result;\n  }\n\n  ReqGetSpecificSessions._();\n\n  factory ReqGetSpecificSessions.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqGetSpecificSessions.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqGetSpecificSessions',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..pPM<SimpleSession>(1, _omitFieldNames ? '' : 'talkerSessions',\n        subBuilder: SimpleSession.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqGetSpecificSessions clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqGetSpecificSessions copyWith(\n          void Function(ReqGetSpecificSessions) updates) =>\n      super.copyWith((message) => updates(message as ReqGetSpecificSessions))\n          as ReqGetSpecificSessions;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqGetSpecificSessions create() => ReqGetSpecificSessions._();\n  @$core.override\n  ReqGetSpecificSessions createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqGetSpecificSessions getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReqGetSpecificSessions>(create);\n  static ReqGetSpecificSessions? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<SimpleSession> get talkerSessions => $_getList(0);\n}\n\nclass ReqGroupAssisMsg extends $pb.GeneratedMessage {\n  factory ReqGroupAssisMsg({\n    $fixnum.Int64? clientSeqno,\n    $core.int? size,\n  }) {\n    final result = create();\n    if (clientSeqno != null) result.clientSeqno = clientSeqno;\n    if (size != null) result.size = size;\n    return result;\n  }\n\n  ReqGroupAssisMsg._();\n\n  factory ReqGroupAssisMsg.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqGroupAssisMsg.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqGroupAssisMsg',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'clientSeqno')\n    ..aI(2, _omitFieldNames ? '' : 'size')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqGroupAssisMsg clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqGroupAssisMsg copyWith(void Function(ReqGroupAssisMsg) updates) =>\n      super.copyWith((message) => updates(message as ReqGroupAssisMsg))\n          as ReqGroupAssisMsg;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqGroupAssisMsg create() => ReqGroupAssisMsg._();\n  @$core.override\n  ReqGroupAssisMsg createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqGroupAssisMsg getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReqGroupAssisMsg>(create);\n  static ReqGroupAssisMsg? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get clientSeqno => $_getI64(0);\n  @$pb.TagNumber(1)\n  set clientSeqno($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasClientSeqno() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearClientSeqno() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get size => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set size($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSize() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSize() => $_clearField(2);\n}\n\nclass ReqLikeMsg extends $pb.GeneratedMessage {\n  factory ReqLikeMsg({\n    $fixnum.Int64? msgKey,\n    MSG_LIKE_ACTION? action,\n  }) {\n    final result = create();\n    if (msgKey != null) result.msgKey = msgKey;\n    if (action != null) result.action = action;\n    return result;\n  }\n\n  ReqLikeMsg._();\n\n  factory ReqLikeMsg.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqLikeMsg.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqLikeMsg',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'msgKey')\n    ..aE<MSG_LIKE_ACTION>(2, _omitFieldNames ? '' : 'action',\n        enumValues: MSG_LIKE_ACTION.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqLikeMsg clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqLikeMsg copyWith(void Function(ReqLikeMsg) updates) =>\n      super.copyWith((message) => updates(message as ReqLikeMsg)) as ReqLikeMsg;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqLikeMsg create() => ReqLikeMsg._();\n  @$core.override\n  ReqLikeMsg createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqLikeMsg getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReqLikeMsg>(create);\n  static ReqLikeMsg? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get msgKey => $_getI64(0);\n  @$pb.TagNumber(1)\n  set msgKey($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMsgKey() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMsgKey() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  MSG_LIKE_ACTION get action => $_getN(1);\n  @$pb.TagNumber(2)\n  set action(MSG_LIKE_ACTION value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAction() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAction() => $_clearField(2);\n}\n\nclass ReqLiveInfo extends $pb.GeneratedMessage {\n  factory ReqLiveInfo({\n    $fixnum.Int64? uid,\n    $fixnum.Int64? talkerId,\n  }) {\n    final result = create();\n    if (uid != null) result.uid = uid;\n    if (talkerId != null) result.talkerId = talkerId;\n    return result;\n  }\n\n  ReqLiveInfo._();\n\n  factory ReqLiveInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqLiveInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqLiveInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'uid')\n    ..aInt64(2, _omitFieldNames ? '' : 'talkerId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqLiveInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqLiveInfo copyWith(void Function(ReqLiveInfo) updates) =>\n      super.copyWith((message) => updates(message as ReqLiveInfo))\n          as ReqLiveInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqLiveInfo create() => ReqLiveInfo._();\n  @$core.override\n  ReqLiveInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqLiveInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReqLiveInfo>(create);\n  static ReqLiveInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get uid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set uid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get talkerId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set talkerId($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTalkerId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTalkerId() => $_clearField(2);\n}\n\nclass ReqMsgHasLike extends $pb.GeneratedMessage {\n  factory ReqMsgHasLike({\n    $core.Iterable<$fixnum.Int64>? msgKeys,\n  }) {\n    final result = create();\n    if (msgKeys != null) result.msgKeys.addAll(msgKeys);\n    return result;\n  }\n\n  ReqMsgHasLike._();\n\n  factory ReqMsgHasLike.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqMsgHasLike.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqMsgHasLike',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..p<$fixnum.Int64>(1, _omitFieldNames ? '' : 'msgKeys', $pb.PbFieldType.K6)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqMsgHasLike clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqMsgHasLike copyWith(void Function(ReqMsgHasLike) updates) =>\n      super.copyWith((message) => updates(message as ReqMsgHasLike))\n          as ReqMsgHasLike;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqMsgHasLike create() => ReqMsgHasLike._();\n  @$core.override\n  ReqMsgHasLike createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqMsgHasLike getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReqMsgHasLike>(create);\n  static ReqMsgHasLike? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<$fixnum.Int64> get msgKeys => $_getList(0);\n}\n\nclass ReqNewSessions extends $pb.GeneratedMessage {\n  factory ReqNewSessions({\n    $fixnum.Int64? beginTs,\n    $core.int? size,\n    $core.int? teenagerMode,\n    $core.int? lessonsMode,\n    $core.Iterable<$core.int>? sids,\n  }) {\n    final result = create();\n    if (beginTs != null) result.beginTs = beginTs;\n    if (size != null) result.size = size;\n    if (teenagerMode != null) result.teenagerMode = teenagerMode;\n    if (lessonsMode != null) result.lessonsMode = lessonsMode;\n    if (sids != null) result.sids.addAll(sids);\n    return result;\n  }\n\n  ReqNewSessions._();\n\n  factory ReqNewSessions.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqNewSessions.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqNewSessions',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'beginTs')\n    ..aI(2, _omitFieldNames ? '' : 'size')\n    ..aI(3, _omitFieldNames ? '' : 'teenagerMode')\n    ..aI(4, _omitFieldNames ? '' : 'lessonsMode')\n    ..p<$core.int>(5, _omitFieldNames ? '' : 'sids', $pb.PbFieldType.K3)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqNewSessions clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqNewSessions copyWith(void Function(ReqNewSessions) updates) =>\n      super.copyWith((message) => updates(message as ReqNewSessions))\n          as ReqNewSessions;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqNewSessions create() => ReqNewSessions._();\n  @$core.override\n  ReqNewSessions createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqNewSessions getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReqNewSessions>(create);\n  static ReqNewSessions? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get beginTs => $_getI64(0);\n  @$pb.TagNumber(1)\n  set beginTs($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBeginTs() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBeginTs() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get size => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set size($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSize() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSize() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get teenagerMode => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set teenagerMode($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTeenagerMode() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTeenagerMode() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get lessonsMode => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set lessonsMode($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLessonsMode() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLessonsMode() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $pb.PbList<$core.int> get sids => $_getList(4);\n}\n\nclass ReqRelationSync extends $pb.GeneratedMessage {\n  factory ReqRelationSync({\n    $fixnum.Int64? clientRelationOplogSeqno,\n  }) {\n    final result = create();\n    if (clientRelationOplogSeqno != null)\n      result.clientRelationOplogSeqno = clientRelationOplogSeqno;\n    return result;\n  }\n\n  ReqRelationSync._();\n\n  factory ReqRelationSync.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqRelationSync.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqRelationSync',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'clientRelationOplogSeqno')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqRelationSync clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqRelationSync copyWith(void Function(ReqRelationSync) updates) =>\n      super.copyWith((message) => updates(message as ReqRelationSync))\n          as ReqRelationSync;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqRelationSync create() => ReqRelationSync._();\n  @$core.override\n  ReqRelationSync createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqRelationSync getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReqRelationSync>(create);\n  static ReqRelationSync? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get clientRelationOplogSeqno => $_getI64(0);\n  @$pb.TagNumber(1)\n  set clientRelationOplogSeqno($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasClientRelationOplogSeqno() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearClientRelationOplogSeqno() => $_clearField(1);\n}\n\nclass ReqRemoveSession extends $pb.GeneratedMessage {\n  factory ReqRemoveSession({\n    $fixnum.Int64? talkerId,\n    $core.int? sessionType,\n    $fixnum.Int64? shopId,\n    $fixnum.Int64? shopFatherId,\n  }) {\n    final result = create();\n    if (talkerId != null) result.talkerId = talkerId;\n    if (sessionType != null) result.sessionType = sessionType;\n    if (shopId != null) result.shopId = shopId;\n    if (shopFatherId != null) result.shopFatherId = shopFatherId;\n    return result;\n  }\n\n  ReqRemoveSession._();\n\n  factory ReqRemoveSession.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqRemoveSession.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqRemoveSession',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'talkerId')\n    ..aI(2, _omitFieldNames ? '' : 'sessionType')\n    ..aInt64(3, _omitFieldNames ? '' : 'shopId')\n    ..aInt64(4, _omitFieldNames ? '' : 'shopFatherId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqRemoveSession clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqRemoveSession copyWith(void Function(ReqRemoveSession) updates) =>\n      super.copyWith((message) => updates(message as ReqRemoveSession))\n          as ReqRemoveSession;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqRemoveSession create() => ReqRemoveSession._();\n  @$core.override\n  ReqRemoveSession createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqRemoveSession getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReqRemoveSession>(create);\n  static ReqRemoveSession? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get talkerId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set talkerId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTalkerId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTalkerId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get sessionType => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set sessionType($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSessionType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSessionType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get shopId => $_getI64(2);\n  @$pb.TagNumber(3)\n  set shopId($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasShopId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearShopId() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get shopFatherId => $_getI64(3);\n  @$pb.TagNumber(4)\n  set shopFatherId($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasShopFatherId() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearShopFatherId() => $_clearField(4);\n}\n\nclass ReqSendMsg extends $pb.GeneratedMessage {\n  factory ReqSendMsg({\n    $1.Msg? msg,\n    $core.String? cookie,\n    $core.String? cookie2,\n    $core.int? errorCode,\n    $core.String? devId,\n  }) {\n    final result = create();\n    if (msg != null) result.msg = msg;\n    if (cookie != null) result.cookie = cookie;\n    if (cookie2 != null) result.cookie2 = cookie2;\n    if (errorCode != null) result.errorCode = errorCode;\n    if (devId != null) result.devId = devId;\n    return result;\n  }\n\n  ReqSendMsg._();\n\n  factory ReqSendMsg.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqSendMsg.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqSendMsg',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOM<$1.Msg>(1, _omitFieldNames ? '' : 'msg', subBuilder: $1.Msg.create)\n    ..aOS(2, _omitFieldNames ? '' : 'cookie')\n    ..aOS(3, _omitFieldNames ? '' : 'cookie2')\n    ..aI(4, _omitFieldNames ? '' : 'errorCode')\n    ..aOS(5, _omitFieldNames ? '' : 'devId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqSendMsg clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqSendMsg copyWith(void Function(ReqSendMsg) updates) =>\n      super.copyWith((message) => updates(message as ReqSendMsg)) as ReqSendMsg;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqSendMsg create() => ReqSendMsg._();\n  @$core.override\n  ReqSendMsg createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqSendMsg getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReqSendMsg>(create);\n  static ReqSendMsg? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $1.Msg get msg => $_getN(0);\n  @$pb.TagNumber(1)\n  set msg($1.Msg value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMsg() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMsg() => $_clearField(1);\n  @$pb.TagNumber(1)\n  $1.Msg ensureMsg() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get cookie => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cookie($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCookie() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCookie() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get cookie2 => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set cookie2($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCookie2() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCookie2() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get errorCode => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set errorCode($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasErrorCode() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearErrorCode() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get devId => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set devId($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDevId() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDevId() => $_clearField(5);\n}\n\nclass ReqSessionDetail extends $pb.GeneratedMessage {\n  factory ReqSessionDetail({\n    $fixnum.Int64? talkerId,\n    $core.int? sessionType,\n    $fixnum.Int64? uid,\n  }) {\n    final result = create();\n    if (talkerId != null) result.talkerId = talkerId;\n    if (sessionType != null) result.sessionType = sessionType;\n    if (uid != null) result.uid = uid;\n    return result;\n  }\n\n  ReqSessionDetail._();\n\n  factory ReqSessionDetail.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqSessionDetail.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqSessionDetail',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'talkerId')\n    ..aI(2, _omitFieldNames ? '' : 'sessionType')\n    ..aInt64(3, _omitFieldNames ? '' : 'uid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqSessionDetail clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqSessionDetail copyWith(void Function(ReqSessionDetail) updates) =>\n      super.copyWith((message) => updates(message as ReqSessionDetail))\n          as ReqSessionDetail;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqSessionDetail create() => ReqSessionDetail._();\n  @$core.override\n  ReqSessionDetail createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqSessionDetail getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReqSessionDetail>(create);\n  static ReqSessionDetail? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get talkerId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set talkerId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTalkerId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTalkerId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get sessionType => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set sessionType($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSessionType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSessionType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get uid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set uid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUid() => $_clearField(3);\n}\n\nclass ReqSessionDetails extends $pb.GeneratedMessage {\n  factory ReqSessionDetails({\n    $core.Iterable<ReqSessionDetail>? sessIds,\n  }) {\n    final result = create();\n    if (sessIds != null) result.sessIds.addAll(sessIds);\n    return result;\n  }\n\n  ReqSessionDetails._();\n\n  factory ReqSessionDetails.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqSessionDetails.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqSessionDetails',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..pPM<ReqSessionDetail>(1, _omitFieldNames ? '' : 'sessIds',\n        subBuilder: ReqSessionDetail.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqSessionDetails clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqSessionDetails copyWith(void Function(ReqSessionDetails) updates) =>\n      super.copyWith((message) => updates(message as ReqSessionDetails))\n          as ReqSessionDetails;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqSessionDetails create() => ReqSessionDetails._();\n  @$core.override\n  ReqSessionDetails createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqSessionDetails getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReqSessionDetails>(create);\n  static ReqSessionDetails? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<ReqSessionDetail> get sessIds => $_getList(0);\n}\n\nclass ReqSessionMsg extends $pb.GeneratedMessage {\n  factory ReqSessionMsg({\n    $fixnum.Int64? talkerId,\n    $core.int? sessionType,\n    $fixnum.Int64? endSeqno,\n    $fixnum.Int64? beginSeqno,\n    $core.int? size,\n    $core.int? order,\n    $core.String? devId,\n    $core.String? canalToken,\n    $fixnum.Int64? aiUid,\n    $core.bool? needAiMsg,\n  }) {\n    final result = create();\n    if (talkerId != null) result.talkerId = talkerId;\n    if (sessionType != null) result.sessionType = sessionType;\n    if (endSeqno != null) result.endSeqno = endSeqno;\n    if (beginSeqno != null) result.beginSeqno = beginSeqno;\n    if (size != null) result.size = size;\n    if (order != null) result.order = order;\n    if (devId != null) result.devId = devId;\n    if (canalToken != null) result.canalToken = canalToken;\n    if (aiUid != null) result.aiUid = aiUid;\n    if (needAiMsg != null) result.needAiMsg = needAiMsg;\n    return result;\n  }\n\n  ReqSessionMsg._();\n\n  factory ReqSessionMsg.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqSessionMsg.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqSessionMsg',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'talkerId')\n    ..aI(2, _omitFieldNames ? '' : 'sessionType')\n    ..aInt64(3, _omitFieldNames ? '' : 'endSeqno')\n    ..aInt64(4, _omitFieldNames ? '' : 'beginSeqno')\n    ..aI(5, _omitFieldNames ? '' : 'size')\n    ..aI(6, _omitFieldNames ? '' : 'order')\n    ..aOS(7, _omitFieldNames ? '' : 'devId')\n    ..aOS(8, _omitFieldNames ? '' : 'canalToken')\n    ..aInt64(9, _omitFieldNames ? '' : 'aiUid')\n    ..aOB(10, _omitFieldNames ? '' : 'needAiMsg')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqSessionMsg clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqSessionMsg copyWith(void Function(ReqSessionMsg) updates) =>\n      super.copyWith((message) => updates(message as ReqSessionMsg))\n          as ReqSessionMsg;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqSessionMsg create() => ReqSessionMsg._();\n  @$core.override\n  ReqSessionMsg createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqSessionMsg getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReqSessionMsg>(create);\n  static ReqSessionMsg? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get talkerId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set talkerId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTalkerId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTalkerId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get sessionType => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set sessionType($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSessionType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSessionType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get endSeqno => $_getI64(2);\n  @$pb.TagNumber(3)\n  set endSeqno($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasEndSeqno() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearEndSeqno() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get beginSeqno => $_getI64(3);\n  @$pb.TagNumber(4)\n  set beginSeqno($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBeginSeqno() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBeginSeqno() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get size => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set size($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasSize() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearSize() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get order => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set order($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasOrder() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearOrder() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get devId => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set devId($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasDevId() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearDevId() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get canalToken => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set canalToken($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasCanalToken() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearCanalToken() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get aiUid => $_getI64(8);\n  @$pb.TagNumber(9)\n  set aiUid($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasAiUid() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearAiUid() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.bool get needAiMsg => $_getBF(9);\n  @$pb.TagNumber(10)\n  set needAiMsg($core.bool value) => $_setBool(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasNeedAiMsg() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearNeedAiMsg() => $_clearField(10);\n}\n\nclass ReqSetTop extends $pb.GeneratedMessage {\n  factory ReqSetTop({\n    $fixnum.Int64? talkerId,\n    $core.int? sessionType,\n    $core.int? opType,\n    $fixnum.Int64? shopId,\n    $fixnum.Int64? shopFatherId,\n  }) {\n    final result = create();\n    if (talkerId != null) result.talkerId = talkerId;\n    if (sessionType != null) result.sessionType = sessionType;\n    if (opType != null) result.opType = opType;\n    if (shopId != null) result.shopId = shopId;\n    if (shopFatherId != null) result.shopFatherId = shopFatherId;\n    return result;\n  }\n\n  ReqSetTop._();\n\n  factory ReqSetTop.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqSetTop.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqSetTop',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'talkerId')\n    ..aI(2, _omitFieldNames ? '' : 'sessionType')\n    ..aI(3, _omitFieldNames ? '' : 'opType')\n    ..aInt64(4, _omitFieldNames ? '' : 'shopId')\n    ..aInt64(5, _omitFieldNames ? '' : 'shopFatherId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqSetTop clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqSetTop copyWith(void Function(ReqSetTop) updates) =>\n      super.copyWith((message) => updates(message as ReqSetTop)) as ReqSetTop;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqSetTop create() => ReqSetTop._();\n  @$core.override\n  ReqSetTop createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqSetTop getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ReqSetTop>(create);\n  static ReqSetTop? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get talkerId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set talkerId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTalkerId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTalkerId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get sessionType => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set sessionType($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSessionType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSessionType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get opType => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set opType($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasOpType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearOpType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get shopId => $_getI64(3);\n  @$pb.TagNumber(4)\n  set shopId($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasShopId() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearShopId() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get shopFatherId => $_getI64(4);\n  @$pb.TagNumber(5)\n  set shopFatherId($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasShopFatherId() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearShopFatherId() => $_clearField(5);\n}\n\nclass ReqShareList extends $pb.GeneratedMessage {\n  factory ReqShareList({\n    $core.int? size,\n    $core.int? source,\n  }) {\n    final result = create();\n    if (size != null) result.size = size;\n    if (source != null) result.source = source;\n    return result;\n  }\n\n  ReqShareList._();\n\n  factory ReqShareList.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqShareList.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqShareList',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'size')\n    ..aI(2, _omitFieldNames ? '' : 'source')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqShareList clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqShareList copyWith(void Function(ReqShareList) updates) =>\n      super.copyWith((message) => updates(message as ReqShareList))\n          as ReqShareList;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqShareList create() => ReqShareList._();\n  @$core.override\n  ReqShareList createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqShareList getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReqShareList>(create);\n  static ReqShareList? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get size => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set size($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSize() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSize() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get source => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set source($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSource() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSource() => $_clearField(2);\n}\n\nclass ReqShowClearUnreadUI extends $pb.GeneratedMessage {\n  factory ReqShowClearUnreadUI({\n    $core.int? unreadType,\n    $core.int? showUnfollowList,\n    $core.int? showDustbin,\n  }) {\n    final result = create();\n    if (unreadType != null) result.unreadType = unreadType;\n    if (showUnfollowList != null) result.showUnfollowList = showUnfollowList;\n    if (showDustbin != null) result.showDustbin = showDustbin;\n    return result;\n  }\n\n  ReqShowClearUnreadUI._();\n\n  factory ReqShowClearUnreadUI.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqShowClearUnreadUI.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqShowClearUnreadUI',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'unreadType')\n    ..aI(2, _omitFieldNames ? '' : 'showUnfollowList')\n    ..aI(4, _omitFieldNames ? '' : 'showDustbin')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqShowClearUnreadUI clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqShowClearUnreadUI copyWith(void Function(ReqShowClearUnreadUI) updates) =>\n      super.copyWith((message) => updates(message as ReqShowClearUnreadUI))\n          as ReqShowClearUnreadUI;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqShowClearUnreadUI create() => ReqShowClearUnreadUI._();\n  @$core.override\n  ReqShowClearUnreadUI createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqShowClearUnreadUI getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReqShowClearUnreadUI>(create);\n  static ReqShowClearUnreadUI? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get unreadType => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set unreadType($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUnreadType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUnreadType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get showUnfollowList => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set showUnfollowList($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasShowUnfollowList() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearShowUnfollowList() => $_clearField(2);\n\n  @$pb.TagNumber(4)\n  $core.int get showDustbin => $_getIZ(2);\n  @$pb.TagNumber(4)\n  set showDustbin($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(4)\n  $core.bool hasShowDustbin() => $_has(2);\n  @$pb.TagNumber(4)\n  void clearShowDustbin() => $_clearField(4);\n}\n\nclass ReqSingleUnread extends $pb.GeneratedMessage {\n  factory ReqSingleUnread({\n    $core.int? unreadType,\n    $core.int? showUnfollowList,\n    $fixnum.Int64? uid,\n    $core.int? showDustbin,\n  }) {\n    final result = create();\n    if (unreadType != null) result.unreadType = unreadType;\n    if (showUnfollowList != null) result.showUnfollowList = showUnfollowList;\n    if (uid != null) result.uid = uid;\n    if (showDustbin != null) result.showDustbin = showDustbin;\n    return result;\n  }\n\n  ReqSingleUnread._();\n\n  factory ReqSingleUnread.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqSingleUnread.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqSingleUnread',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'unreadType')\n    ..aI(2, _omitFieldNames ? '' : 'showUnfollowList')\n    ..aInt64(3, _omitFieldNames ? '' : 'uid')\n    ..aI(4, _omitFieldNames ? '' : 'showDustbin')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqSingleUnread clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqSingleUnread copyWith(void Function(ReqSingleUnread) updates) =>\n      super.copyWith((message) => updates(message as ReqSingleUnread))\n          as ReqSingleUnread;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqSingleUnread create() => ReqSingleUnread._();\n  @$core.override\n  ReqSingleUnread createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqSingleUnread getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReqSingleUnread>(create);\n  static ReqSingleUnread? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get unreadType => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set unreadType($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUnreadType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUnreadType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get showUnfollowList => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set showUnfollowList($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasShowUnfollowList() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearShowUnfollowList() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get uid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set uid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUid() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get showDustbin => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set showDustbin($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasShowDustbin() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearShowDustbin() => $_clearField(4);\n}\n\nclass ReqSpecificSingleUnread extends $pb.GeneratedMessage {\n  factory ReqSpecificSingleUnread({\n    $core.Iterable<SimpleSession>? talkerSessions,\n  }) {\n    final result = create();\n    if (talkerSessions != null) result.talkerSessions.addAll(talkerSessions);\n    return result;\n  }\n\n  ReqSpecificSingleUnread._();\n\n  factory ReqSpecificSingleUnread.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqSpecificSingleUnread.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqSpecificSingleUnread',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..pPM<SimpleSession>(1, _omitFieldNames ? '' : 'talkerSessions',\n        subBuilder: SimpleSession.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqSpecificSingleUnread clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqSpecificSingleUnread copyWith(\n          void Function(ReqSpecificSingleUnread) updates) =>\n      super.copyWith((message) => updates(message as ReqSpecificSingleUnread))\n          as ReqSpecificSingleUnread;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqSpecificSingleUnread create() => ReqSpecificSingleUnread._();\n  @$core.override\n  ReqSpecificSingleUnread createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqSpecificSingleUnread getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReqSpecificSingleUnread>(create);\n  static ReqSpecificSingleUnread? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<SimpleSession> get talkerSessions => $_getList(0);\n}\n\nclass ReqSyncAck extends $pb.GeneratedMessage {\n  factory ReqSyncAck({\n    $fixnum.Int64? clientSeqno,\n  }) {\n    final result = create();\n    if (clientSeqno != null) result.clientSeqno = clientSeqno;\n    return result;\n  }\n\n  ReqSyncAck._();\n\n  factory ReqSyncAck.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqSyncAck.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqSyncAck',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'clientSeqno')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqSyncAck clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqSyncAck copyWith(void Function(ReqSyncAck) updates) =>\n      super.copyWith((message) => updates(message as ReqSyncAck)) as ReqSyncAck;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqSyncAck create() => ReqSyncAck._();\n  @$core.override\n  ReqSyncAck createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqSyncAck getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReqSyncAck>(create);\n  static ReqSyncAck? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get clientSeqno => $_getI64(0);\n  @$pb.TagNumber(1)\n  set clientSeqno($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasClientSeqno() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearClientSeqno() => $_clearField(1);\n}\n\nclass ReqTotalUnread extends $pb.GeneratedMessage {\n  factory ReqTotalUnread({\n    $core.int? unreadType,\n    $core.int? showUnfollowList,\n    $fixnum.Int64? uid,\n    $core.int? showDustbin,\n    $core.int? singleunreadOn,\n    $core.int? msgfeedOn,\n    $core.int? sysupOn,\n  }) {\n    final result = create();\n    if (unreadType != null) result.unreadType = unreadType;\n    if (showUnfollowList != null) result.showUnfollowList = showUnfollowList;\n    if (uid != null) result.uid = uid;\n    if (showDustbin != null) result.showDustbin = showDustbin;\n    if (singleunreadOn != null) result.singleunreadOn = singleunreadOn;\n    if (msgfeedOn != null) result.msgfeedOn = msgfeedOn;\n    if (sysupOn != null) result.sysupOn = sysupOn;\n    return result;\n  }\n\n  ReqTotalUnread._();\n\n  factory ReqTotalUnread.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqTotalUnread.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqTotalUnread',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'unreadType')\n    ..aI(2, _omitFieldNames ? '' : 'showUnfollowList')\n    ..aInt64(3, _omitFieldNames ? '' : 'uid')\n    ..aI(4, _omitFieldNames ? '' : 'showDustbin')\n    ..aI(5, _omitFieldNames ? '' : 'singleunreadOn')\n    ..aI(6, _omitFieldNames ? '' : 'msgfeedOn')\n    ..aI(7, _omitFieldNames ? '' : 'sysupOn')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqTotalUnread clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqTotalUnread copyWith(void Function(ReqTotalUnread) updates) =>\n      super.copyWith((message) => updates(message as ReqTotalUnread))\n          as ReqTotalUnread;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqTotalUnread create() => ReqTotalUnread._();\n  @$core.override\n  ReqTotalUnread createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqTotalUnread getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReqTotalUnread>(create);\n  static ReqTotalUnread? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get unreadType => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set unreadType($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUnreadType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUnreadType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get showUnfollowList => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set showUnfollowList($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasShowUnfollowList() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearShowUnfollowList() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get uid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set uid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUid() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get showDustbin => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set showDustbin($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasShowDustbin() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearShowDustbin() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get singleunreadOn => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set singleunreadOn($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasSingleunreadOn() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearSingleunreadOn() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get msgfeedOn => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set msgfeedOn($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasMsgfeedOn() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearMsgfeedOn() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get sysupOn => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set sysupOn($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasSysupOn() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearSysupOn() => $_clearField(7);\n}\n\nclass ReqUpdateAck extends $pb.GeneratedMessage {\n  factory ReqUpdateAck({\n    $fixnum.Int64? talkerId,\n    $core.int? sessionType,\n    $fixnum.Int64? ackSeqno,\n  }) {\n    final result = create();\n    if (talkerId != null) result.talkerId = talkerId;\n    if (sessionType != null) result.sessionType = sessionType;\n    if (ackSeqno != null) result.ackSeqno = ackSeqno;\n    return result;\n  }\n\n  ReqUpdateAck._();\n\n  factory ReqUpdateAck.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqUpdateAck.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqUpdateAck',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'talkerId')\n    ..aI(2, _omitFieldNames ? '' : 'sessionType')\n    ..aInt64(3, _omitFieldNames ? '' : 'ackSeqno')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqUpdateAck clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqUpdateAck copyWith(void Function(ReqUpdateAck) updates) =>\n      super.copyWith((message) => updates(message as ReqUpdateAck))\n          as ReqUpdateAck;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqUpdateAck create() => ReqUpdateAck._();\n  @$core.override\n  ReqUpdateAck createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqUpdateAck getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReqUpdateAck>(create);\n  static ReqUpdateAck? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get talkerId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set talkerId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTalkerId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTalkerId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get sessionType => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set sessionType($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSessionType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSessionType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get ackSeqno => $_getI64(2);\n  @$pb.TagNumber(3)\n  set ackSeqno($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAckSeqno() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAckSeqno() => $_clearField(3);\n}\n\nclass ReqUpdateIntercept extends $pb.GeneratedMessage {\n  factory ReqUpdateIntercept({\n    $fixnum.Int64? uid,\n    $fixnum.Int64? talkerId,\n    $core.int? status,\n  }) {\n    final result = create();\n    if (uid != null) result.uid = uid;\n    if (talkerId != null) result.talkerId = talkerId;\n    if (status != null) result.status = status;\n    return result;\n  }\n\n  ReqUpdateIntercept._();\n\n  factory ReqUpdateIntercept.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqUpdateIntercept.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqUpdateIntercept',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'uid')\n    ..aInt64(2, _omitFieldNames ? '' : 'talkerId')\n    ..aI(3, _omitFieldNames ? '' : 'status')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqUpdateIntercept clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqUpdateIntercept copyWith(void Function(ReqUpdateIntercept) updates) =>\n      super.copyWith((message) => updates(message as ReqUpdateIntercept))\n          as ReqUpdateIntercept;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqUpdateIntercept create() => ReqUpdateIntercept._();\n  @$core.override\n  ReqUpdateIntercept createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqUpdateIntercept getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReqUpdateIntercept>(create);\n  static ReqUpdateIntercept? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get uid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set uid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get talkerId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set talkerId($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTalkerId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTalkerId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get status => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set status($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasStatus() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearStatus() => $_clearField(3);\n}\n\nclass ReqUpdateTotalUnread extends $pb.GeneratedMessage {\n  factory ReqUpdateTotalUnread({\n    UpdateUnreadScope? scope,\n  }) {\n    final result = create();\n    if (scope != null) result.scope = scope;\n    return result;\n  }\n\n  ReqUpdateTotalUnread._();\n\n  factory ReqUpdateTotalUnread.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReqUpdateTotalUnread.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReqUpdateTotalUnread',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aE<UpdateUnreadScope>(1, _omitFieldNames ? '' : 'scope',\n        enumValues: UpdateUnreadScope.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqUpdateTotalUnread clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReqUpdateTotalUnread copyWith(void Function(ReqUpdateTotalUnread) updates) =>\n      super.copyWith((message) => updates(message as ReqUpdateTotalUnread))\n          as ReqUpdateTotalUnread;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReqUpdateTotalUnread create() => ReqUpdateTotalUnread._();\n  @$core.override\n  ReqUpdateTotalUnread createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReqUpdateTotalUnread getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReqUpdateTotalUnread>(create);\n  static ReqUpdateTotalUnread? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  UpdateUnreadScope get scope => $_getN(0);\n  @$pb.TagNumber(1)\n  set scope(UpdateUnreadScope value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasScope() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearScope() => $_clearField(1);\n}\n\nclass RspCloseClearUnreadUI extends $pb.GeneratedMessage {\n  factory RspCloseClearUnreadUI() => create();\n\n  RspCloseClearUnreadUI._();\n\n  factory RspCloseClearUnreadUI.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RspCloseClearUnreadUI.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RspCloseClearUnreadUI',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspCloseClearUnreadUI clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspCloseClearUnreadUI copyWith(\n          void Function(RspCloseClearUnreadUI) updates) =>\n      super.copyWith((message) => updates(message as RspCloseClearUnreadUI))\n          as RspCloseClearUnreadUI;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RspCloseClearUnreadUI create() => RspCloseClearUnreadUI._();\n  @$core.override\n  RspCloseClearUnreadUI createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RspCloseClearUnreadUI getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RspCloseClearUnreadUI>(create);\n  static RspCloseClearUnreadUI? _defaultInstance;\n}\n\nclass RspGetDiscussListInImPage extends $pb.GeneratedMessage {\n  factory RspGetDiscussListInImPage({\n    $core.Iterable<SingleDiscussInImPage>? discussList,\n  }) {\n    final result = create();\n    if (discussList != null) result.discussList.addAll(discussList);\n    return result;\n  }\n\n  RspGetDiscussListInImPage._();\n\n  factory RspGetDiscussListInImPage.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RspGetDiscussListInImPage.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RspGetDiscussListInImPage',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..pPM<SingleDiscussInImPage>(1, _omitFieldNames ? '' : 'discussList',\n        subBuilder: SingleDiscussInImPage.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspGetDiscussListInImPage clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspGetDiscussListInImPage copyWith(\n          void Function(RspGetDiscussListInImPage) updates) =>\n      super.copyWith((message) => updates(message as RspGetDiscussListInImPage))\n          as RspGetDiscussListInImPage;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RspGetDiscussListInImPage create() => RspGetDiscussListInImPage._();\n  @$core.override\n  RspGetDiscussListInImPage createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RspGetDiscussListInImPage getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RspGetDiscussListInImPage>(create);\n  static RspGetDiscussListInImPage? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<SingleDiscussInImPage> get discussList => $_getList(0);\n}\n\nclass RspGetMsg extends $pb.GeneratedMessage {\n  factory RspGetMsg({\n    $core.Iterable<$1.Msg>? msg,\n  }) {\n    final result = create();\n    if (msg != null) result.msg.addAll(msg);\n    return result;\n  }\n\n  RspGetMsg._();\n\n  factory RspGetMsg.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RspGetMsg.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RspGetMsg',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..pPM<$1.Msg>(1, _omitFieldNames ? '' : 'msg', subBuilder: $1.Msg.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspGetMsg clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspGetMsg copyWith(void Function(RspGetMsg) updates) =>\n      super.copyWith((message) => updates(message as RspGetMsg)) as RspGetMsg;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RspGetMsg create() => RspGetMsg._();\n  @$core.override\n  RspGetMsg createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RspGetMsg getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<RspGetMsg>(create);\n  static RspGetMsg? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<$1.Msg> get msg => $_getList(0);\n}\n\nclass RspLiveInfo extends $pb.GeneratedMessage {\n  factory RspLiveInfo({\n    $fixnum.Int64? liveStatus,\n    $core.String? jumpUrl,\n  }) {\n    final result = create();\n    if (liveStatus != null) result.liveStatus = liveStatus;\n    if (jumpUrl != null) result.jumpUrl = jumpUrl;\n    return result;\n  }\n\n  RspLiveInfo._();\n\n  factory RspLiveInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RspLiveInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RspLiveInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'liveStatus')\n    ..aOS(2, _omitFieldNames ? '' : 'jumpUrl')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspLiveInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspLiveInfo copyWith(void Function(RspLiveInfo) updates) =>\n      super.copyWith((message) => updates(message as RspLiveInfo))\n          as RspLiveInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RspLiveInfo create() => RspLiveInfo._();\n  @$core.override\n  RspLiveInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RspLiveInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RspLiveInfo>(create);\n  static RspLiveInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get liveStatus => $_getI64(0);\n  @$pb.TagNumber(1)\n  set liveStatus($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLiveStatus() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLiveStatus() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get jumpUrl => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set jumpUrl($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasJumpUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearJumpUrl() => $_clearField(2);\n}\n\nclass RspMsgHasLike extends $pb.GeneratedMessage {\n  factory RspMsgHasLike({\n    $core.Iterable<$core.MapEntry<$fixnum.Int64, HasLikeState>>? states,\n  }) {\n    final result = create();\n    if (states != null) result.states.addEntries(states);\n    return result;\n  }\n\n  RspMsgHasLike._();\n\n  factory RspMsgHasLike.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RspMsgHasLike.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RspMsgHasLike',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..m<$fixnum.Int64, HasLikeState>(1, _omitFieldNames ? '' : 'states',\n        entryClassName: 'RspMsgHasLike.StatesEntry',\n        keyFieldType: $pb.PbFieldType.O6,\n        valueFieldType: $pb.PbFieldType.OM,\n        valueCreator: HasLikeState.create,\n        valueDefaultOrMaker: HasLikeState.getDefault,\n        packageName: const $pb.PackageName('bilibili.im.interfaces.v1'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspMsgHasLike clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspMsgHasLike copyWith(void Function(RspMsgHasLike) updates) =>\n      super.copyWith((message) => updates(message as RspMsgHasLike))\n          as RspMsgHasLike;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RspMsgHasLike create() => RspMsgHasLike._();\n  @$core.override\n  RspMsgHasLike createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RspMsgHasLike getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RspMsgHasLike>(create);\n  static RspMsgHasLike? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbMap<$fixnum.Int64, HasLikeState> get states => $_getMap(0);\n}\n\nclass RspMyGroupUnread extends $pb.GeneratedMessage {\n  factory RspMyGroupUnread({\n    $core.int? unreadCount,\n  }) {\n    final result = create();\n    if (unreadCount != null) result.unreadCount = unreadCount;\n    return result;\n  }\n\n  RspMyGroupUnread._();\n\n  factory RspMyGroupUnread.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RspMyGroupUnread.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RspMyGroupUnread',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'unreadCount')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspMyGroupUnread clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspMyGroupUnread copyWith(void Function(RspMyGroupUnread) updates) =>\n      super.copyWith((message) => updates(message as RspMyGroupUnread))\n          as RspMyGroupUnread;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RspMyGroupUnread create() => RspMyGroupUnread._();\n  @$core.override\n  RspMyGroupUnread createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RspMyGroupUnread getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RspMyGroupUnread>(create);\n  static RspMyGroupUnread? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get unreadCount => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set unreadCount($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUnreadCount() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUnreadCount() => $_clearField(1);\n}\n\nclass RspRelationSync extends $pb.GeneratedMessage {\n  factory RspRelationSync({\n    $core.int? full,\n    $core.Iterable<$1.RelationLog>? relationLogs,\n    $core.Iterable<$1.FriendRelation>? friendList,\n    $fixnum.Int64? serverRelationOplogSeqno,\n    $core.Iterable<$1.GroupRelation>? groupList,\n  }) {\n    final result = create();\n    if (full != null) result.full = full;\n    if (relationLogs != null) result.relationLogs.addAll(relationLogs);\n    if (friendList != null) result.friendList.addAll(friendList);\n    if (serverRelationOplogSeqno != null)\n      result.serverRelationOplogSeqno = serverRelationOplogSeqno;\n    if (groupList != null) result.groupList.addAll(groupList);\n    return result;\n  }\n\n  RspRelationSync._();\n\n  factory RspRelationSync.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RspRelationSync.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RspRelationSync',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'full')\n    ..pPM<$1.RelationLog>(2, _omitFieldNames ? '' : 'relationLogs',\n        subBuilder: $1.RelationLog.create)\n    ..pPM<$1.FriendRelation>(3, _omitFieldNames ? '' : 'friendList',\n        subBuilder: $1.FriendRelation.create)\n    ..aInt64(4, _omitFieldNames ? '' : 'serverRelationOplogSeqno')\n    ..pPM<$1.GroupRelation>(5, _omitFieldNames ? '' : 'groupList',\n        subBuilder: $1.GroupRelation.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspRelationSync clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspRelationSync copyWith(void Function(RspRelationSync) updates) =>\n      super.copyWith((message) => updates(message as RspRelationSync))\n          as RspRelationSync;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RspRelationSync create() => RspRelationSync._();\n  @$core.override\n  RspRelationSync createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RspRelationSync getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RspRelationSync>(create);\n  static RspRelationSync? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get full => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set full($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFull() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFull() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<$1.RelationLog> get relationLogs => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<$1.FriendRelation> get friendList => $_getList(2);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get serverRelationOplogSeqno => $_getI64(3);\n  @$pb.TagNumber(4)\n  set serverRelationOplogSeqno($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasServerRelationOplogSeqno() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearServerRelationOplogSeqno() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $pb.PbList<$1.GroupRelation> get groupList => $_getList(4);\n}\n\nclass RspSendMsg extends $pb.GeneratedMessage {\n  factory RspSendMsg({\n    $fixnum.Int64? msgKey,\n    $core.Iterable<EmotionInfo>? eInfos,\n    $core.String? msgContent,\n    $1.KeyHitInfos? keyHitInfos,\n    $1.RichTextMsgContent? richTextMsgContent,\n    $fixnum.Int64? seqno,\n  }) {\n    final result = create();\n    if (msgKey != null) result.msgKey = msgKey;\n    if (eInfos != null) result.eInfos.addAll(eInfos);\n    if (msgContent != null) result.msgContent = msgContent;\n    if (keyHitInfos != null) result.keyHitInfos = keyHitInfos;\n    if (richTextMsgContent != null)\n      result.richTextMsgContent = richTextMsgContent;\n    if (seqno != null) result.seqno = seqno;\n    return result;\n  }\n\n  RspSendMsg._();\n\n  factory RspSendMsg.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RspSendMsg.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RspSendMsg',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'msgKey')\n    ..pPM<EmotionInfo>(2, _omitFieldNames ? '' : 'eInfos',\n        subBuilder: EmotionInfo.create)\n    ..aOS(3, _omitFieldNames ? '' : 'msgContent')\n    ..aOM<$1.KeyHitInfos>(4, _omitFieldNames ? '' : 'keyHitInfos',\n        subBuilder: $1.KeyHitInfos.create)\n    ..aOM<$1.RichTextMsgContent>(5, _omitFieldNames ? '' : 'richTextMsgContent',\n        subBuilder: $1.RichTextMsgContent.create)\n    ..aInt64(6, _omitFieldNames ? '' : 'seqno')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspSendMsg clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspSendMsg copyWith(void Function(RspSendMsg) updates) =>\n      super.copyWith((message) => updates(message as RspSendMsg)) as RspSendMsg;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RspSendMsg create() => RspSendMsg._();\n  @$core.override\n  RspSendMsg createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RspSendMsg getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RspSendMsg>(create);\n  static RspSendMsg? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get msgKey => $_getI64(0);\n  @$pb.TagNumber(1)\n  set msgKey($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMsgKey() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMsgKey() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<EmotionInfo> get eInfos => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $core.String get msgContent => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set msgContent($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasMsgContent() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearMsgContent() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $1.KeyHitInfos get keyHitInfos => $_getN(3);\n  @$pb.TagNumber(4)\n  set keyHitInfos($1.KeyHitInfos value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasKeyHitInfos() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearKeyHitInfos() => $_clearField(4);\n  @$pb.TagNumber(4)\n  $1.KeyHitInfos ensureKeyHitInfos() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $1.RichTextMsgContent get richTextMsgContent => $_getN(4);\n  @$pb.TagNumber(5)\n  set richTextMsgContent($1.RichTextMsgContent value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasRichTextMsgContent() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearRichTextMsgContent() => $_clearField(5);\n  @$pb.TagNumber(5)\n  $1.RichTextMsgContent ensureRichTextMsgContent() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get seqno => $_getI64(5);\n  @$pb.TagNumber(6)\n  set seqno($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasSeqno() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearSeqno() => $_clearField(6);\n}\n\nclass RspSessionDetails extends $pb.GeneratedMessage {\n  factory RspSessionDetails({\n    $core.Iterable<$1.SessionInfo>? sessInfos,\n  }) {\n    final result = create();\n    if (sessInfos != null) result.sessInfos.addAll(sessInfos);\n    return result;\n  }\n\n  RspSessionDetails._();\n\n  factory RspSessionDetails.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RspSessionDetails.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RspSessionDetails',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..pPM<$1.SessionInfo>(1, _omitFieldNames ? '' : 'sessInfos',\n        subBuilder: $1.SessionInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspSessionDetails clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspSessionDetails copyWith(void Function(RspSessionDetails) updates) =>\n      super.copyWith((message) => updates(message as RspSessionDetails))\n          as RspSessionDetails;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RspSessionDetails create() => RspSessionDetails._();\n  @$core.override\n  RspSessionDetails createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RspSessionDetails getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RspSessionDetails>(create);\n  static RspSessionDetails? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<$1.SessionInfo> get sessInfos => $_getList(0);\n}\n\nclass RspSessionMsg extends $pb.GeneratedMessage {\n  factory RspSessionMsg({\n    $core.Iterable<$1.Msg>? messages,\n    $core.int? hasMore,\n    $fixnum.Int64? minSeqno,\n    $fixnum.Int64? maxSeqno,\n    $core.Iterable<EmotionInfo>? eInfos,\n  }) {\n    final result = create();\n    if (messages != null) result.messages.addAll(messages);\n    if (hasMore != null) result.hasMore = hasMore;\n    if (minSeqno != null) result.minSeqno = minSeqno;\n    if (maxSeqno != null) result.maxSeqno = maxSeqno;\n    if (eInfos != null) result.eInfos.addAll(eInfos);\n    return result;\n  }\n\n  RspSessionMsg._();\n\n  factory RspSessionMsg.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RspSessionMsg.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RspSessionMsg',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..pPM<$1.Msg>(1, _omitFieldNames ? '' : 'messages',\n        subBuilder: $1.Msg.create)\n    ..aI(2, _omitFieldNames ? '' : 'hasMore')\n    ..aInt64(3, _omitFieldNames ? '' : 'minSeqno')\n    ..aInt64(4, _omitFieldNames ? '' : 'maxSeqno')\n    ..pPM<EmotionInfo>(5, _omitFieldNames ? '' : 'eInfos',\n        subBuilder: EmotionInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspSessionMsg clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspSessionMsg copyWith(void Function(RspSessionMsg) updates) =>\n      super.copyWith((message) => updates(message as RspSessionMsg))\n          as RspSessionMsg;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RspSessionMsg create() => RspSessionMsg._();\n  @$core.override\n  RspSessionMsg createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RspSessionMsg getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RspSessionMsg>(create);\n  static RspSessionMsg? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<$1.Msg> get messages => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.int get hasMore => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set hasMore($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHasMore() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHasMore() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get minSeqno => $_getI64(2);\n  @$pb.TagNumber(3)\n  set minSeqno($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasMinSeqno() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearMinSeqno() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get maxSeqno => $_getI64(3);\n  @$pb.TagNumber(4)\n  set maxSeqno($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasMaxSeqno() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearMaxSeqno() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $pb.PbList<EmotionInfo> get eInfos => $_getList(4);\n}\n\nclass RspSessions extends $pb.GeneratedMessage {\n  factory RspSessions({\n    $core.Iterable<$1.SessionInfo>? sessionList,\n    $core.int? hasMore,\n    $core.bool? antiDisturbCleaning,\n    $core.int? isAddressListEmpty,\n    $core.Iterable<$core.MapEntry<$core.int, $fixnum.Int64>>? systemMsg,\n    $core.bool? showLevel,\n  }) {\n    final result = create();\n    if (sessionList != null) result.sessionList.addAll(sessionList);\n    if (hasMore != null) result.hasMore = hasMore;\n    if (antiDisturbCleaning != null)\n      result.antiDisturbCleaning = antiDisturbCleaning;\n    if (isAddressListEmpty != null)\n      result.isAddressListEmpty = isAddressListEmpty;\n    if (systemMsg != null) result.systemMsg.addEntries(systemMsg);\n    if (showLevel != null) result.showLevel = showLevel;\n    return result;\n  }\n\n  RspSessions._();\n\n  factory RspSessions.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RspSessions.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RspSessions',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..pPM<$1.SessionInfo>(1, _omitFieldNames ? '' : 'sessionList',\n        subBuilder: $1.SessionInfo.create)\n    ..aI(2, _omitFieldNames ? '' : 'hasMore')\n    ..aOB(3, _omitFieldNames ? '' : 'antiDisturbCleaning')\n    ..aI(4, _omitFieldNames ? '' : 'isAddressListEmpty')\n    ..m<$core.int, $fixnum.Int64>(5, _omitFieldNames ? '' : 'systemMsg',\n        entryClassName: 'RspSessions.SystemMsgEntry',\n        keyFieldType: $pb.PbFieldType.O3,\n        valueFieldType: $pb.PbFieldType.O6,\n        packageName: const $pb.PackageName('bilibili.im.interfaces.v1'))\n    ..aOB(6, _omitFieldNames ? '' : 'showLevel')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspSessions clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspSessions copyWith(void Function(RspSessions) updates) =>\n      super.copyWith((message) => updates(message as RspSessions))\n          as RspSessions;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RspSessions create() => RspSessions._();\n  @$core.override\n  RspSessions createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RspSessions getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RspSessions>(create);\n  static RspSessions? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<$1.SessionInfo> get sessionList => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.int get hasMore => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set hasMore($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHasMore() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHasMore() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get antiDisturbCleaning => $_getBF(2);\n  @$pb.TagNumber(3)\n  set antiDisturbCleaning($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAntiDisturbCleaning() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAntiDisturbCleaning() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get isAddressListEmpty => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set isAddressListEmpty($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIsAddressListEmpty() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIsAddressListEmpty() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $pb.PbMap<$core.int, $fixnum.Int64> get systemMsg => $_getMap(4);\n\n  @$pb.TagNumber(6)\n  $core.bool get showLevel => $_getBF(5);\n  @$pb.TagNumber(6)\n  set showLevel($core.bool value) => $_setBool(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasShowLevel() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearShowLevel() => $_clearField(6);\n}\n\nclass RspShareList extends $pb.GeneratedMessage {\n  factory RspShareList({\n    $core.Iterable<ShareSessionInfo>? sessionList,\n    $core.int? isAddressListEmpty,\n  }) {\n    final result = create();\n    if (sessionList != null) result.sessionList.addAll(sessionList);\n    if (isAddressListEmpty != null)\n      result.isAddressListEmpty = isAddressListEmpty;\n    return result;\n  }\n\n  RspShareList._();\n\n  factory RspShareList.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RspShareList.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RspShareList',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..pPM<ShareSessionInfo>(1, _omitFieldNames ? '' : 'sessionList',\n        subBuilder: ShareSessionInfo.create)\n    ..aI(2, _omitFieldNames ? '' : 'isAddressListEmpty')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspShareList clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspShareList copyWith(void Function(RspShareList) updates) =>\n      super.copyWith((message) => updates(message as RspShareList))\n          as RspShareList;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RspShareList create() => RspShareList._();\n  @$core.override\n  RspShareList createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RspShareList getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RspShareList>(create);\n  static RspShareList? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<ShareSessionInfo> get sessionList => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.int get isAddressListEmpty => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set isAddressListEmpty($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIsAddressListEmpty() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIsAddressListEmpty() => $_clearField(2);\n}\n\nclass RspShowClearUnreadUI extends $pb.GeneratedMessage {\n  factory RspShowClearUnreadUI({\n    $core.bool? display,\n    $core.String? text,\n  }) {\n    final result = create();\n    if (display != null) result.display = display;\n    if (text != null) result.text = text;\n    return result;\n  }\n\n  RspShowClearUnreadUI._();\n\n  factory RspShowClearUnreadUI.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RspShowClearUnreadUI.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RspShowClearUnreadUI',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'display')\n    ..aOS(2, _omitFieldNames ? '' : 'text')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspShowClearUnreadUI clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspShowClearUnreadUI copyWith(void Function(RspShowClearUnreadUI) updates) =>\n      super.copyWith((message) => updates(message as RspShowClearUnreadUI))\n          as RspShowClearUnreadUI;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RspShowClearUnreadUI create() => RspShowClearUnreadUI._();\n  @$core.override\n  RspShowClearUnreadUI createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RspShowClearUnreadUI getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RspShowClearUnreadUI>(create);\n  static RspShowClearUnreadUI? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get display => $_getBF(0);\n  @$pb.TagNumber(1)\n  set display($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDisplay() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDisplay() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearText() => $_clearField(2);\n}\n\nclass RspSingleUnread extends $pb.GeneratedMessage {\n  factory RspSingleUnread({\n    $fixnum.Int64? unfollowUnread,\n    $fixnum.Int64? followUnread,\n    $core.int? unfollowPushMsg,\n    $core.int? dustbinPushMsg,\n    $fixnum.Int64? dustbinUnread,\n    $fixnum.Int64? bizMsgUnfollowUnread,\n    $fixnum.Int64? bizMsgFollowUnread,\n  }) {\n    final result = create();\n    if (unfollowUnread != null) result.unfollowUnread = unfollowUnread;\n    if (followUnread != null) result.followUnread = followUnread;\n    if (unfollowPushMsg != null) result.unfollowPushMsg = unfollowPushMsg;\n    if (dustbinPushMsg != null) result.dustbinPushMsg = dustbinPushMsg;\n    if (dustbinUnread != null) result.dustbinUnread = dustbinUnread;\n    if (bizMsgUnfollowUnread != null)\n      result.bizMsgUnfollowUnread = bizMsgUnfollowUnread;\n    if (bizMsgFollowUnread != null)\n      result.bizMsgFollowUnread = bizMsgFollowUnread;\n    return result;\n  }\n\n  RspSingleUnread._();\n\n  factory RspSingleUnread.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RspSingleUnread.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RspSingleUnread',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'unfollowUnread')\n    ..aInt64(2, _omitFieldNames ? '' : 'followUnread')\n    ..aI(3, _omitFieldNames ? '' : 'unfollowPushMsg')\n    ..aI(4, _omitFieldNames ? '' : 'dustbinPushMsg')\n    ..aInt64(5, _omitFieldNames ? '' : 'dustbinUnread')\n    ..aInt64(6, _omitFieldNames ? '' : 'bizMsgUnfollowUnread')\n    ..aInt64(7, _omitFieldNames ? '' : 'bizMsgFollowUnread')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspSingleUnread clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspSingleUnread copyWith(void Function(RspSingleUnread) updates) =>\n      super.copyWith((message) => updates(message as RspSingleUnread))\n          as RspSingleUnread;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RspSingleUnread create() => RspSingleUnread._();\n  @$core.override\n  RspSingleUnread createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RspSingleUnread getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RspSingleUnread>(create);\n  static RspSingleUnread? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get unfollowUnread => $_getI64(0);\n  @$pb.TagNumber(1)\n  set unfollowUnread($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUnfollowUnread() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUnfollowUnread() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get followUnread => $_getI64(1);\n  @$pb.TagNumber(2)\n  set followUnread($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFollowUnread() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFollowUnread() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get unfollowPushMsg => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set unfollowPushMsg($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUnfollowPushMsg() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUnfollowPushMsg() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get dustbinPushMsg => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set dustbinPushMsg($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDustbinPushMsg() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDustbinPushMsg() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get dustbinUnread => $_getI64(4);\n  @$pb.TagNumber(5)\n  set dustbinUnread($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDustbinUnread() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDustbinUnread() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get bizMsgUnfollowUnread => $_getI64(5);\n  @$pb.TagNumber(6)\n  set bizMsgUnfollowUnread($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasBizMsgUnfollowUnread() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearBizMsgUnfollowUnread() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get bizMsgFollowUnread => $_getI64(6);\n  @$pb.TagNumber(7)\n  set bizMsgFollowUnread($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBizMsgFollowUnread() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBizMsgFollowUnread() => $_clearField(7);\n}\n\nclass RspSpecificSingleUnread extends $pb.GeneratedMessage {\n  factory RspSpecificSingleUnread({\n    $core.Iterable<$core.MapEntry<$fixnum.Int64, $fixnum.Int64>>?\n        talkerUnreadCnt,\n    $fixnum.Int64? allUnreadCnt,\n  }) {\n    final result = create();\n    if (talkerUnreadCnt != null)\n      result.talkerUnreadCnt.addEntries(talkerUnreadCnt);\n    if (allUnreadCnt != null) result.allUnreadCnt = allUnreadCnt;\n    return result;\n  }\n\n  RspSpecificSingleUnread._();\n\n  factory RspSpecificSingleUnread.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RspSpecificSingleUnread.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RspSpecificSingleUnread',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..m<$fixnum.Int64, $fixnum.Int64>(\n        1, _omitFieldNames ? '' : 'talkerUnreadCnt',\n        entryClassName: 'RspSpecificSingleUnread.TalkerUnreadCntEntry',\n        keyFieldType: $pb.PbFieldType.O6,\n        valueFieldType: $pb.PbFieldType.O6,\n        packageName: const $pb.PackageName('bilibili.im.interfaces.v1'))\n    ..aInt64(2, _omitFieldNames ? '' : 'allUnreadCnt')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspSpecificSingleUnread clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspSpecificSingleUnread copyWith(\n          void Function(RspSpecificSingleUnread) updates) =>\n      super.copyWith((message) => updates(message as RspSpecificSingleUnread))\n          as RspSpecificSingleUnread;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RspSpecificSingleUnread create() => RspSpecificSingleUnread._();\n  @$core.override\n  RspSpecificSingleUnread createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RspSpecificSingleUnread getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RspSpecificSingleUnread>(create);\n  static RspSpecificSingleUnread? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbMap<$fixnum.Int64, $fixnum.Int64> get talkerUnreadCnt => $_getMap(0);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get allUnreadCnt => $_getI64(1);\n  @$pb.TagNumber(2)\n  set allUnreadCnt($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAllUnreadCnt() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAllUnreadCnt() => $_clearField(2);\n}\n\nclass RspSyncAck extends $pb.GeneratedMessage {\n  factory RspSyncAck() => create();\n\n  RspSyncAck._();\n\n  factory RspSyncAck.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RspSyncAck.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RspSyncAck',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspSyncAck clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspSyncAck copyWith(void Function(RspSyncAck) updates) =>\n      super.copyWith((message) => updates(message as RspSyncAck)) as RspSyncAck;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RspSyncAck create() => RspSyncAck._();\n  @$core.override\n  RspSyncAck createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RspSyncAck getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RspSyncAck>(create);\n  static RspSyncAck? _defaultInstance;\n}\n\nclass RspTotalUnread extends $pb.GeneratedMessage {\n  factory RspTotalUnread({\n    SessionSingleUnreadRsp? sessionSingleUnread,\n    MsgFeedUnreadRsp? msgFeedUnread,\n    SysMsgInterfaceLastMsgRsp? sysMsgInterfaceLastMsg,\n    $core.int? totalUnread,\n    $fixnum.Int64? customUnread,\n    NewTotalUnread? newTotalUnread,\n  }) {\n    final result = create();\n    if (sessionSingleUnread != null)\n      result.sessionSingleUnread = sessionSingleUnread;\n    if (msgFeedUnread != null) result.msgFeedUnread = msgFeedUnread;\n    if (sysMsgInterfaceLastMsg != null)\n      result.sysMsgInterfaceLastMsg = sysMsgInterfaceLastMsg;\n    if (totalUnread != null) result.totalUnread = totalUnread;\n    if (customUnread != null) result.customUnread = customUnread;\n    if (newTotalUnread != null) result.newTotalUnread = newTotalUnread;\n    return result;\n  }\n\n  RspTotalUnread._();\n\n  factory RspTotalUnread.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RspTotalUnread.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RspTotalUnread',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOM<SessionSingleUnreadRsp>(\n        1, _omitFieldNames ? '' : 'sessionSingleUnread',\n        subBuilder: SessionSingleUnreadRsp.create)\n    ..aOM<MsgFeedUnreadRsp>(2, _omitFieldNames ? '' : 'msgFeedUnread',\n        subBuilder: MsgFeedUnreadRsp.create)\n    ..aOM<SysMsgInterfaceLastMsgRsp>(\n        3, _omitFieldNames ? '' : 'sysMsgInterfaceLastMsg',\n        subBuilder: SysMsgInterfaceLastMsgRsp.create)\n    ..aI(4, _omitFieldNames ? '' : 'totalUnread')\n    ..aInt64(5, _omitFieldNames ? '' : 'customUnread')\n    ..aOM<NewTotalUnread>(6, _omitFieldNames ? '' : 'newTotalUnread',\n        subBuilder: NewTotalUnread.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspTotalUnread clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspTotalUnread copyWith(void Function(RspTotalUnread) updates) =>\n      super.copyWith((message) => updates(message as RspTotalUnread))\n          as RspTotalUnread;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RspTotalUnread create() => RspTotalUnread._();\n  @$core.override\n  RspTotalUnread createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RspTotalUnread getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RspTotalUnread>(create);\n  static RspTotalUnread? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  SessionSingleUnreadRsp get sessionSingleUnread => $_getN(0);\n  @$pb.TagNumber(1)\n  set sessionSingleUnread(SessionSingleUnreadRsp value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSessionSingleUnread() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSessionSingleUnread() => $_clearField(1);\n  @$pb.TagNumber(1)\n  SessionSingleUnreadRsp ensureSessionSingleUnread() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  MsgFeedUnreadRsp get msgFeedUnread => $_getN(1);\n  @$pb.TagNumber(2)\n  set msgFeedUnread(MsgFeedUnreadRsp value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMsgFeedUnread() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMsgFeedUnread() => $_clearField(2);\n  @$pb.TagNumber(2)\n  MsgFeedUnreadRsp ensureMsgFeedUnread() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  SysMsgInterfaceLastMsgRsp get sysMsgInterfaceLastMsg => $_getN(2);\n  @$pb.TagNumber(3)\n  set sysMsgInterfaceLastMsg(SysMsgInterfaceLastMsgRsp value) =>\n      $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSysMsgInterfaceLastMsg() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSysMsgInterfaceLastMsg() => $_clearField(3);\n  @$pb.TagNumber(3)\n  SysMsgInterfaceLastMsgRsp ensureSysMsgInterfaceLastMsg() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.int get totalUnread => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set totalUnread($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTotalUnread() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTotalUnread() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get customUnread => $_getI64(4);\n  @$pb.TagNumber(5)\n  set customUnread($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCustomUnread() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCustomUnread() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  NewTotalUnread get newTotalUnread => $_getN(5);\n  @$pb.TagNumber(6)\n  set newTotalUnread(NewTotalUnread value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasNewTotalUnread() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearNewTotalUnread() => $_clearField(6);\n  @$pb.TagNumber(6)\n  NewTotalUnread ensureNewTotalUnread() => $_ensure(5);\n}\n\nclass RspUpdateTotalUnread extends $pb.GeneratedMessage {\n  factory RspUpdateTotalUnread() => create();\n\n  RspUpdateTotalUnread._();\n\n  factory RspUpdateTotalUnread.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RspUpdateTotalUnread.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RspUpdateTotalUnread',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspUpdateTotalUnread clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RspUpdateTotalUnread copyWith(void Function(RspUpdateTotalUnread) updates) =>\n      super.copyWith((message) => updates(message as RspUpdateTotalUnread))\n          as RspUpdateTotalUnread;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RspUpdateTotalUnread create() => RspUpdateTotalUnread._();\n  @$core.override\n  RspUpdateTotalUnread createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RspUpdateTotalUnread getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RspUpdateTotalUnread>(create);\n  static RspUpdateTotalUnread? _defaultInstance;\n}\n\nclass SessionSingleUnreadRsp extends $pb.GeneratedMessage {\n  factory SessionSingleUnreadRsp({\n    $fixnum.Int64? unfollowUnread,\n    $fixnum.Int64? followUnread,\n    $core.int? unfollowPushMsg,\n    $core.int? dustbinPushMsg,\n    $fixnum.Int64? dustbinUnread,\n    $fixnum.Int64? bizMsgUnfollowUnread,\n    $fixnum.Int64? bizMsgFollowUnread,\n    $fixnum.Int64? huahuoUnread,\n    $fixnum.Int64? customUnread,\n  }) {\n    final result = create();\n    if (unfollowUnread != null) result.unfollowUnread = unfollowUnread;\n    if (followUnread != null) result.followUnread = followUnread;\n    if (unfollowPushMsg != null) result.unfollowPushMsg = unfollowPushMsg;\n    if (dustbinPushMsg != null) result.dustbinPushMsg = dustbinPushMsg;\n    if (dustbinUnread != null) result.dustbinUnread = dustbinUnread;\n    if (bizMsgUnfollowUnread != null)\n      result.bizMsgUnfollowUnread = bizMsgUnfollowUnread;\n    if (bizMsgFollowUnread != null)\n      result.bizMsgFollowUnread = bizMsgFollowUnread;\n    if (huahuoUnread != null) result.huahuoUnread = huahuoUnread;\n    if (customUnread != null) result.customUnread = customUnread;\n    return result;\n  }\n\n  SessionSingleUnreadRsp._();\n\n  factory SessionSingleUnreadRsp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SessionSingleUnreadRsp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SessionSingleUnreadRsp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'unfollowUnread')\n    ..aInt64(2, _omitFieldNames ? '' : 'followUnread')\n    ..aI(3, _omitFieldNames ? '' : 'unfollowPushMsg')\n    ..aI(4, _omitFieldNames ? '' : 'dustbinPushMsg')\n    ..aInt64(5, _omitFieldNames ? '' : 'dustbinUnread')\n    ..aInt64(6, _omitFieldNames ? '' : 'bizMsgUnfollowUnread')\n    ..aInt64(7, _omitFieldNames ? '' : 'bizMsgFollowUnread')\n    ..aInt64(8, _omitFieldNames ? '' : 'huahuoUnread')\n    ..aInt64(9, _omitFieldNames ? '' : 'customUnread')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionSingleUnreadRsp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionSingleUnreadRsp copyWith(\n          void Function(SessionSingleUnreadRsp) updates) =>\n      super.copyWith((message) => updates(message as SessionSingleUnreadRsp))\n          as SessionSingleUnreadRsp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SessionSingleUnreadRsp create() => SessionSingleUnreadRsp._();\n  @$core.override\n  SessionSingleUnreadRsp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SessionSingleUnreadRsp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SessionSingleUnreadRsp>(create);\n  static SessionSingleUnreadRsp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get unfollowUnread => $_getI64(0);\n  @$pb.TagNumber(1)\n  set unfollowUnread($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUnfollowUnread() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUnfollowUnread() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get followUnread => $_getI64(1);\n  @$pb.TagNumber(2)\n  set followUnread($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFollowUnread() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFollowUnread() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get unfollowPushMsg => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set unfollowPushMsg($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUnfollowPushMsg() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUnfollowPushMsg() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get dustbinPushMsg => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set dustbinPushMsg($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDustbinPushMsg() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDustbinPushMsg() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get dustbinUnread => $_getI64(4);\n  @$pb.TagNumber(5)\n  set dustbinUnread($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDustbinUnread() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDustbinUnread() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get bizMsgUnfollowUnread => $_getI64(5);\n  @$pb.TagNumber(6)\n  set bizMsgUnfollowUnread($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasBizMsgUnfollowUnread() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearBizMsgUnfollowUnread() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get bizMsgFollowUnread => $_getI64(6);\n  @$pb.TagNumber(7)\n  set bizMsgFollowUnread($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBizMsgFollowUnread() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBizMsgFollowUnread() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get huahuoUnread => $_getI64(7);\n  @$pb.TagNumber(8)\n  set huahuoUnread($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasHuahuoUnread() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearHuahuoUnread() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get customUnread => $_getI64(8);\n  @$pb.TagNumber(9)\n  set customUnread($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasCustomUnread() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearCustomUnread() => $_clearField(9);\n}\n\nclass ShareSessionInfo extends $pb.GeneratedMessage {\n  factory ShareSessionInfo({\n    $fixnum.Int64? talkerId,\n    $core.String? talkerUname,\n    $core.String? talkerIcon,\n    $core.int? officialType,\n  }) {\n    final result = create();\n    if (talkerId != null) result.talkerId = talkerId;\n    if (talkerUname != null) result.talkerUname = talkerUname;\n    if (talkerIcon != null) result.talkerIcon = talkerIcon;\n    if (officialType != null) result.officialType = officialType;\n    return result;\n  }\n\n  ShareSessionInfo._();\n\n  factory ShareSessionInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ShareSessionInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ShareSessionInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'talkerId')\n    ..aOS(2, _omitFieldNames ? '' : 'talkerUname')\n    ..aOS(3, _omitFieldNames ? '' : 'talkerIcon')\n    ..aI(4, _omitFieldNames ? '' : 'officialType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareSessionInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareSessionInfo copyWith(void Function(ShareSessionInfo) updates) =>\n      super.copyWith((message) => updates(message as ShareSessionInfo))\n          as ShareSessionInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ShareSessionInfo create() => ShareSessionInfo._();\n  @$core.override\n  ShareSessionInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ShareSessionInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ShareSessionInfo>(create);\n  static ShareSessionInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get talkerId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set talkerId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTalkerId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTalkerId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get talkerUname => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set talkerUname($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTalkerUname() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTalkerUname() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get talkerIcon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set talkerIcon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTalkerIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTalkerIcon() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get officialType => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set officialType($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasOfficialType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearOfficialType() => $_clearField(4);\n}\n\nclass SimpleSession extends $pb.GeneratedMessage {\n  factory SimpleSession({\n    $fixnum.Int64? talkerId,\n    $core.int? sessionType,\n  }) {\n    final result = create();\n    if (talkerId != null) result.talkerId = talkerId;\n    if (sessionType != null) result.sessionType = sessionType;\n    return result;\n  }\n\n  SimpleSession._();\n\n  factory SimpleSession.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SimpleSession.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SimpleSession',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'talkerId')\n    ..aI(2, _omitFieldNames ? '' : 'sessionType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SimpleSession clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SimpleSession copyWith(void Function(SimpleSession) updates) =>\n      super.copyWith((message) => updates(message as SimpleSession))\n          as SimpleSession;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SimpleSession create() => SimpleSession._();\n  @$core.override\n  SimpleSession createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SimpleSession getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SimpleSession>(create);\n  static SimpleSession? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get talkerId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set talkerId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTalkerId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTalkerId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get sessionType => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set sessionType($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSessionType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSessionType() => $_clearField(2);\n}\n\nclass SingleDiscussInImPage extends $pb.GeneratedMessage {\n  factory SingleDiscussInImPage({\n    $fixnum.Int64? discussId,\n    $fixnum.Int64? mid,\n    $core.String? face,\n    $core.String? name,\n    $core.int? unreadCount,\n    $core.int? type,\n  }) {\n    final result = create();\n    if (discussId != null) result.discussId = discussId;\n    if (mid != null) result.mid = mid;\n    if (face != null) result.face = face;\n    if (name != null) result.name = name;\n    if (unreadCount != null) result.unreadCount = unreadCount;\n    if (type != null) result.type = type;\n    return result;\n  }\n\n  SingleDiscussInImPage._();\n\n  factory SingleDiscussInImPage.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SingleDiscussInImPage.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SingleDiscussInImPage',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'discussId')\n    ..aInt64(2, _omitFieldNames ? '' : 'mid')\n    ..aOS(3, _omitFieldNames ? '' : 'face')\n    ..aOS(4, _omitFieldNames ? '' : 'name')\n    ..aI(5, _omitFieldNames ? '' : 'unreadCount')\n    ..aI(6, _omitFieldNames ? '' : 'type')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SingleDiscussInImPage clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SingleDiscussInImPage copyWith(\n          void Function(SingleDiscussInImPage) updates) =>\n      super.copyWith((message) => updates(message as SingleDiscussInImPage))\n          as SingleDiscussInImPage;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SingleDiscussInImPage create() => SingleDiscussInImPage._();\n  @$core.override\n  SingleDiscussInImPage createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SingleDiscussInImPage getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SingleDiscussInImPage>(create);\n  static SingleDiscussInImPage? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get discussId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set discussId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDiscussId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDiscussId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get mid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set mid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get face => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set face($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFace() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFace() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get name => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set name($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasName() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearName() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get unreadCount => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set unreadCount($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasUnreadCount() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearUnreadCount() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get type => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set type($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasType() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearType() => $_clearField(6);\n}\n\nclass SysMsgInterfaceLastMsgRsp extends $pb.GeneratedMessage {\n  factory SysMsgInterfaceLastMsgRsp({\n    $core.int? unread,\n    $core.String? title,\n    $core.String? time,\n    $fixnum.Int64? id,\n  }) {\n    final result = create();\n    if (unread != null) result.unread = unread;\n    if (title != null) result.title = title;\n    if (time != null) result.time = time;\n    if (id != null) result.id = id;\n    return result;\n  }\n\n  SysMsgInterfaceLastMsgRsp._();\n\n  factory SysMsgInterfaceLastMsgRsp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SysMsgInterfaceLastMsgRsp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SysMsgInterfaceLastMsgRsp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'unread')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'time')\n    ..aInt64(4, _omitFieldNames ? '' : 'id')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SysMsgInterfaceLastMsgRsp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SysMsgInterfaceLastMsgRsp copyWith(\n          void Function(SysMsgInterfaceLastMsgRsp) updates) =>\n      super.copyWith((message) => updates(message as SysMsgInterfaceLastMsgRsp))\n          as SysMsgInterfaceLastMsgRsp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SysMsgInterfaceLastMsgRsp create() => SysMsgInterfaceLastMsgRsp._();\n  @$core.override\n  SysMsgInterfaceLastMsgRsp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SysMsgInterfaceLastMsgRsp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SysMsgInterfaceLastMsgRsp>(create);\n  static SysMsgInterfaceLastMsgRsp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get unread => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set unread($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUnread() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUnread() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get time => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set time($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTime() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTime() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get id => $_getI64(3);\n  @$pb.TagNumber(4)\n  set id($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasId() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearId() => $_clearField(4);\n}\n\nclass UpdateUserCosmoStateReq extends $pb.GeneratedMessage {\n  factory UpdateUserCosmoStateReq({\n    $core.String? business,\n    $fixnum.Int64? cardSendMid,\n    $core.int? cosmoState,\n    $core.int? opType,\n  }) {\n    final result = create();\n    if (business != null) result.business = business;\n    if (cardSendMid != null) result.cardSendMid = cardSendMid;\n    if (cosmoState != null) result.cosmoState = cosmoState;\n    if (opType != null) result.opType = opType;\n    return result;\n  }\n\n  UpdateUserCosmoStateReq._();\n\n  factory UpdateUserCosmoStateReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UpdateUserCosmoStateReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UpdateUserCosmoStateReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'business')\n    ..aInt64(2, _omitFieldNames ? '' : 'cardSendMid')\n    ..aI(3, _omitFieldNames ? '' : 'cosmoState')\n    ..aI(4, _omitFieldNames ? '' : 'opType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpdateUserCosmoStateReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpdateUserCosmoStateReq copyWith(\n          void Function(UpdateUserCosmoStateReq) updates) =>\n      super.copyWith((message) => updates(message as UpdateUserCosmoStateReq))\n          as UpdateUserCosmoStateReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UpdateUserCosmoStateReq create() => UpdateUserCosmoStateReq._();\n  @$core.override\n  UpdateUserCosmoStateReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UpdateUserCosmoStateReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UpdateUserCosmoStateReq>(create);\n  static UpdateUserCosmoStateReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get business => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set business($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBusiness() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBusiness() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get cardSendMid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set cardSendMid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCardSendMid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCardSendMid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get cosmoState => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set cosmoState($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCosmoState() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCosmoState() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get opType => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set opType($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasOpType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearOpType() => $_clearField(4);\n}\n\nclass UpdateUserCosmoStateRsp extends $pb.GeneratedMessage {\n  factory UpdateUserCosmoStateRsp({\n    $core.String? text,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    return result;\n  }\n\n  UpdateUserCosmoStateRsp._();\n\n  factory UpdateUserCosmoStateRsp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UpdateUserCosmoStateRsp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UpdateUserCosmoStateRsp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.im.interfaces.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpdateUserCosmoStateRsp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpdateUserCosmoStateRsp copyWith(\n          void Function(UpdateUserCosmoStateRsp) updates) =>\n      super.copyWith((message) => updates(message as UpdateUserCosmoStateRsp))\n          as UpdateUserCosmoStateRsp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UpdateUserCosmoStateRsp create() => UpdateUserCosmoStateRsp._();\n  @$core.override\n  UpdateUserCosmoStateRsp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UpdateUserCosmoStateRsp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UpdateUserCosmoStateRsp>(create);\n  static UpdateUserCosmoStateRsp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/im/interfaces/v1.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/im/interfaces/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nclass MSG_LIKE_ACTION extends $pb.ProtobufEnum {\n  static const MSG_LIKE_ACTION ACTION_UNSPECIFIED =\n      MSG_LIKE_ACTION._(0, _omitEnumNames ? '' : 'ACTION_UNSPECIFIED');\n  static const MSG_LIKE_ACTION ACTION_LIKE =\n      MSG_LIKE_ACTION._(1, _omitEnumNames ? '' : 'ACTION_LIKE');\n  static const MSG_LIKE_ACTION ACTION_CANCEL_LIKE =\n      MSG_LIKE_ACTION._(2, _omitEnumNames ? '' : 'ACTION_CANCEL_LIKE');\n  static const MSG_LIKE_ACTION ACTION_DISLIKE =\n      MSG_LIKE_ACTION._(3, _omitEnumNames ? '' : 'ACTION_DISLIKE');\n  static const MSG_LIKE_ACTION ACTION_CANCEL_DISLIKE =\n      MSG_LIKE_ACTION._(4, _omitEnumNames ? '' : 'ACTION_CANCEL_DISLIKE');\n\n  static const $core.List<MSG_LIKE_ACTION> values = <MSG_LIKE_ACTION>[\n    ACTION_UNSPECIFIED,\n    ACTION_LIKE,\n    ACTION_CANCEL_LIKE,\n    ACTION_DISLIKE,\n    ACTION_CANCEL_DISLIKE,\n  ];\n\n  static final $core.List<MSG_LIKE_ACTION?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 4);\n  static MSG_LIKE_ACTION? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const MSG_LIKE_ACTION._(super.value, super.name);\n}\n\nclass MSG_LIKE_STATE extends $pb.ProtobufEnum {\n  static const MSG_LIKE_STATE STATE_UNSPECIFIED =\n      MSG_LIKE_STATE._(0, _omitEnumNames ? '' : 'STATE_UNSPECIFIED');\n  static const MSG_LIKE_STATE STATE_LIKE =\n      MSG_LIKE_STATE._(1, _omitEnumNames ? '' : 'STATE_LIKE');\n  static const MSG_LIKE_STATE STATE_DISLIKE =\n      MSG_LIKE_STATE._(2, _omitEnumNames ? '' : 'STATE_DISLIKE');\n\n  static const $core.List<MSG_LIKE_STATE> values = <MSG_LIKE_STATE>[\n    STATE_UNSPECIFIED,\n    STATE_LIKE,\n    STATE_DISLIKE,\n  ];\n\n  static final $core.List<MSG_LIKE_STATE?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static MSG_LIKE_STATE? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const MSG_LIKE_STATE._(super.value, super.name);\n}\n\nclass UpdateUnreadScope extends $pb.ProtobufEnum {\n  static const UpdateUnreadScope All =\n      UpdateUnreadScope._(0, _omitEnumNames ? '' : 'All');\n  static const UpdateUnreadScope Dustbin =\n      UpdateUnreadScope._(1, _omitEnumNames ? '' : 'Dustbin');\n  static const UpdateUnreadScope Unfollowed =\n      UpdateUnreadScope._(2, _omitEnumNames ? '' : 'Unfollowed');\n  static const UpdateUnreadScope Stranger =\n      UpdateUnreadScope._(3, _omitEnumNames ? '' : 'Stranger');\n\n  static const $core.List<UpdateUnreadScope> values = <UpdateUnreadScope>[\n    All,\n    Dustbin,\n    Unfollowed,\n    Stranger,\n  ];\n\n  static final $core.List<UpdateUnreadScope?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static UpdateUnreadScope? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const UpdateUnreadScope._(super.value, super.name);\n}\n\nconst $core.bool _omitEnumNames =\n    $core.bool.fromEnvironment('protobuf.omit_enum_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/im/interfaces/v1.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/im/interfaces/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use mSG_LIKE_ACTIONDescriptor instead')\nconst MSG_LIKE_ACTION$json = {\n  '1': 'MSG_LIKE_ACTION',\n  '2': [\n    {'1': 'ACTION_UNSPECIFIED', '2': 0},\n    {'1': 'ACTION_LIKE', '2': 1},\n    {'1': 'ACTION_CANCEL_LIKE', '2': 2},\n    {'1': 'ACTION_DISLIKE', '2': 3},\n    {'1': 'ACTION_CANCEL_DISLIKE', '2': 4},\n  ],\n};\n\n/// Descriptor for `MSG_LIKE_ACTION`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List mSG_LIKE_ACTIONDescriptor = $convert.base64Decode(\n    'Cg9NU0dfTElLRV9BQ1RJT04SFgoSQUNUSU9OX1VOU1BFQ0lGSUVEEAASDwoLQUNUSU9OX0xJS0'\n    'UQARIWChJBQ1RJT05fQ0FOQ0VMX0xJS0UQAhISCg5BQ1RJT05fRElTTElLRRADEhkKFUFDVElP'\n    'Tl9DQU5DRUxfRElTTElLRRAE');\n\n@$core.Deprecated('Use mSG_LIKE_STATEDescriptor instead')\nconst MSG_LIKE_STATE$json = {\n  '1': 'MSG_LIKE_STATE',\n  '2': [\n    {'1': 'STATE_UNSPECIFIED', '2': 0},\n    {'1': 'STATE_LIKE', '2': 1},\n    {'1': 'STATE_DISLIKE', '2': 2},\n  ],\n};\n\n/// Descriptor for `MSG_LIKE_STATE`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List mSG_LIKE_STATEDescriptor = $convert.base64Decode(\n    'Cg5NU0dfTElLRV9TVEFURRIVChFTVEFURV9VTlNQRUNJRklFRBAAEg4KClNUQVRFX0xJS0UQAR'\n    'IRCg1TVEFURV9ESVNMSUtFEAI=');\n\n@$core.Deprecated('Use updateUnreadScopeDescriptor instead')\nconst UpdateUnreadScope$json = {\n  '1': 'UpdateUnreadScope',\n  '2': [\n    {'1': 'All', '2': 0},\n    {'1': 'Dustbin', '2': 1},\n    {'1': 'Unfollowed', '2': 2},\n    {'1': 'Stranger', '2': 3},\n  ],\n};\n\n/// Descriptor for `UpdateUnreadScope`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List updateUnreadScopeDescriptor = $convert.base64Decode(\n    'ChFVcGRhdGVVbnJlYWRTY29wZRIHCgNBbGwQABILCgdEdXN0YmluEAESDgoKVW5mb2xsb3dlZB'\n    'ACEgwKCFN0cmFuZ2VyEAM=');\n\n@$core.Deprecated('Use dummyReqDescriptor instead')\nconst DummyReq$json = {\n  '1': 'DummyReq',\n  '2': [\n    {'1': 'idl', '3': 1, '4': 1, '5': 5, '10': 'idl'},\n  ],\n};\n\n/// Descriptor for `DummyReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dummyReqDescriptor =\n    $convert.base64Decode('CghEdW1teVJlcRIQCgNpZGwYASABKAVSA2lkbA==');\n\n@$core.Deprecated('Use dummyRspDescriptor instead')\nconst DummyRsp$json = {\n  '1': 'DummyRsp',\n};\n\n/// Descriptor for `DummyRsp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dummyRspDescriptor =\n    $convert.base64Decode('CghEdW1teVJzcA==');\n\n@$core.Deprecated('Use emotionInfoDescriptor instead')\nconst EmotionInfo$json = {\n  '1': 'EmotionInfo',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'url', '3': 2, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'size', '3': 3, '4': 1, '5': 5, '10': 'size'},\n    {'1': 'gif_url', '3': 4, '4': 1, '5': 9, '10': 'gifUrl'},\n  ],\n};\n\n/// Descriptor for `EmotionInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List emotionInfoDescriptor = $convert.base64Decode(\n    'CgtFbW90aW9uSW5mbxISCgR0ZXh0GAEgASgJUgR0ZXh0EhAKA3VybBgCIAEoCVIDdXJsEhIKBH'\n    'NpemUYAyABKAVSBHNpemUSFwoHZ2lmX3VybBgEIAEoCVIGZ2lmVXJs');\n\n@$core.Deprecated('Use getUserCosmoStateReqDescriptor instead')\nconst GetUserCosmoStateReq$json = {\n  '1': 'GetUserCosmoStateReq',\n  '2': [\n    {'1': 'business', '3': 1, '4': 1, '5': 9, '10': 'business'},\n    {'1': 'card_send_mid', '3': 2, '4': 1, '5': 3, '10': 'cardSendMid'},\n  ],\n};\n\n/// Descriptor for `GetUserCosmoStateReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List getUserCosmoStateReqDescriptor = $convert.base64Decode(\n    'ChRHZXRVc2VyQ29zbW9TdGF0ZVJlcRIaCghidXNpbmVzcxgBIAEoCVIIYnVzaW5lc3MSIgoNY2'\n    'FyZF9zZW5kX21pZBgCIAEoA1ILY2FyZFNlbmRNaWQ=');\n\n@$core.Deprecated('Use getUserCosmoStateRspDescriptor instead')\nconst GetUserCosmoStateRsp$json = {\n  '1': 'GetUserCosmoStateRsp',\n  '2': [\n    {'1': 'business', '3': 1, '4': 1, '5': 9, '10': 'business'},\n    {'1': 'card_send_mid', '3': 2, '4': 1, '5': 3, '10': 'cardSendMid'},\n    {'1': 'cosmo_state', '3': 3, '4': 1, '5': 5, '10': 'cosmoState'},\n    {'1': 'op_type', '3': 4, '4': 1, '5': 5, '10': 'opType'},\n    {'1': 'text', '3': 5, '4': 1, '5': 9, '10': 'text'},\n  ],\n};\n\n/// Descriptor for `GetUserCosmoStateRsp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List getUserCosmoStateRspDescriptor = $convert.base64Decode(\n    'ChRHZXRVc2VyQ29zbW9TdGF0ZVJzcBIaCghidXNpbmVzcxgBIAEoCVIIYnVzaW5lc3MSIgoNY2'\n    'FyZF9zZW5kX21pZBgCIAEoA1ILY2FyZFNlbmRNaWQSHwoLY29zbW9fc3RhdGUYAyABKAVSCmNv'\n    'c21vU3RhdGUSFwoHb3BfdHlwZRgEIAEoBVIGb3BUeXBlEhIKBHRleHQYBSABKAlSBHRleHQ=');\n\n@$core.Deprecated('Use hasLikeStateDescriptor instead')\nconst HasLikeState$json = {\n  '1': 'HasLikeState',\n  '2': [\n    {\n      '1': 'state',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.im.interfaces.v1.MSG_LIKE_STATE',\n      '10': 'state'\n    },\n  ],\n};\n\n/// Descriptor for `HasLikeState`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List hasLikeStateDescriptor = $convert.base64Decode(\n    'CgxIYXNMaWtlU3RhdGUSPwoFc3RhdGUYASABKA4yKS5iaWxpYmlsaS5pbS5pbnRlcmZhY2VzLn'\n    'YxLk1TR19MSUtFX1NUQVRFUgVzdGF0ZQ==');\n\n@$core.Deprecated('Use msgDetailDescriptor instead')\nconst MsgDetail$json = {\n  '1': 'MsgDetail',\n  '2': [\n    {'1': 'msg_key', '3': 1, '4': 1, '5': 3, '10': 'msgKey'},\n    {'1': 'seqno', '3': 2, '4': 1, '5': 3, '10': 'seqno'},\n  ],\n};\n\n/// Descriptor for `MsgDetail`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List msgDetailDescriptor = $convert.base64Decode(\n    'CglNc2dEZXRhaWwSFwoHbXNnX2tleRgBIAEoA1IGbXNnS2V5EhQKBXNlcW5vGAIgASgDUgVzZX'\n    'Fubw==');\n\n@$core.Deprecated('Use msgFeedUnreadRspDescriptor instead')\nconst MsgFeedUnreadRsp$json = {\n  '1': 'MsgFeedUnreadRsp',\n  '2': [\n    {\n      '1': 'unread',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.im.interfaces.v1.MsgFeedUnreadRsp.UnreadEntry',\n      '10': 'unread'\n    },\n  ],\n  '3': [MsgFeedUnreadRsp_UnreadEntry$json],\n};\n\n@$core.Deprecated('Use msgFeedUnreadRspDescriptor instead')\nconst MsgFeedUnreadRsp_UnreadEntry$json = {\n  '1': 'UnreadEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 3, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `MsgFeedUnreadRsp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List msgFeedUnreadRspDescriptor = $convert.base64Decode(\n    'ChBNc2dGZWVkVW5yZWFkUnNwEk8KBnVucmVhZBgBIAMoCzI3LmJpbGliaWxpLmltLmludGVyZm'\n    'FjZXMudjEuTXNnRmVlZFVucmVhZFJzcC5VbnJlYWRFbnRyeVIGdW5yZWFkGjkKC1VucmVhZEVu'\n    'dHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgDUgV2YWx1ZToCOAE=');\n\n@$core.Deprecated('Use newTotalUnreadDescriptor instead')\nconst NewTotalUnread$json = {\n  '1': 'NewTotalUnread',\n  '2': [\n    {'1': 'unread_count', '3': 1, '4': 1, '5': 5, '10': 'unreadCount'},\n    {'1': 'unread_type', '3': 2, '4': 1, '5': 5, '10': 'unreadType'},\n  ],\n};\n\n/// Descriptor for `NewTotalUnread`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List newTotalUnreadDescriptor = $convert.base64Decode(\n    'Cg5OZXdUb3RhbFVucmVhZBIhCgx1bnJlYWRfY291bnQYASABKAVSC3VucmVhZENvdW50Eh8KC3'\n    'VucmVhZF90eXBlGAIgASgFUgp1bnJlYWRUeXBl');\n\n@$core.Deprecated('Use reqAckAssisMsgDescriptor instead')\nconst ReqAckAssisMsg$json = {\n  '1': 'ReqAckAssisMsg',\n  '2': [\n    {'1': 'ack_seqno', '3': 1, '4': 1, '5': 3, '10': 'ackSeqno'},\n  ],\n};\n\n/// Descriptor for `ReqAckAssisMsg`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqAckAssisMsgDescriptor = $convert.base64Decode(\n    'Cg5SZXFBY2tBc3Npc01zZxIbCglhY2tfc2Vxbm8YASABKANSCGFja1NlcW5v');\n\n@$core.Deprecated('Use reqAckSessionsDescriptor instead')\nconst ReqAckSessions$json = {\n  '1': 'ReqAckSessions',\n  '2': [\n    {'1': 'begin_ts', '3': 1, '4': 1, '5': 3, '10': 'beginTs'},\n    {'1': 'end_ts', '3': 2, '4': 1, '5': 5, '10': 'endTs'},\n    {'1': 'size', '3': 3, '4': 1, '5': 5, '10': 'size'},\n  ],\n};\n\n/// Descriptor for `ReqAckSessions`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqAckSessionsDescriptor = $convert.base64Decode(\n    'Cg5SZXFBY2tTZXNzaW9ucxIZCghiZWdpbl90cxgBIAEoA1IHYmVnaW5UcxIVCgZlbmRfdHMYAi'\n    'ABKAVSBWVuZFRzEhIKBHNpemUYAyABKAVSBHNpemU=');\n\n@$core.Deprecated('Use reqBatRmSessDescriptor instead')\nconst ReqBatRmSess$json = {\n  '1': 'ReqBatRmSess',\n};\n\n/// Descriptor for `ReqBatRmSess`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqBatRmSessDescriptor =\n    $convert.base64Decode('CgxSZXFCYXRSbVNlc3M=');\n\n@$core.Deprecated('Use reqCloseClearUnreadUIDescriptor instead')\nconst ReqCloseClearUnreadUI$json = {\n  '1': 'ReqCloseClearUnreadUI',\n};\n\n/// Descriptor for `ReqCloseClearUnreadUI`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqCloseClearUnreadUIDescriptor =\n    $convert.base64Decode('ChVSZXFDbG9zZUNsZWFyVW5yZWFkVUk=');\n\n@$core.Deprecated('Use reqGetDiscussListInImPageDescriptor instead')\nconst ReqGetDiscussListInImPage$json = {\n  '1': 'ReqGetDiscussListInImPage',\n};\n\n/// Descriptor for `ReqGetDiscussListInImPage`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqGetDiscussListInImPageDescriptor =\n    $convert.base64Decode('ChlSZXFHZXREaXNjdXNzTGlzdEluSW1QYWdl');\n\n@$core.Deprecated('Use reqGetMsgDescriptor instead')\nconst ReqGetMsg$json = {\n  '1': 'ReqGetMsg',\n  '2': [\n    {'1': 'talker_id', '3': 1, '4': 1, '5': 3, '10': 'talkerId'},\n    {'1': 'session_type', '3': 2, '4': 1, '5': 5, '10': 'sessionType'},\n    {\n      '1': 'msg_detail',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.im.interfaces.v1.MsgDetail',\n      '10': 'msgDetail'\n    },\n  ],\n};\n\n/// Descriptor for `ReqGetMsg`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqGetMsgDescriptor = $convert.base64Decode(\n    'CglSZXFHZXRNc2cSGwoJdGFsa2VyX2lkGAEgASgDUgh0YWxrZXJJZBIhCgxzZXNzaW9uX3R5cG'\n    'UYAiABKAVSC3Nlc3Npb25UeXBlEkMKCm1zZ19kZXRhaWwYAyADKAsyJC5iaWxpYmlsaS5pbS5p'\n    'bnRlcmZhY2VzLnYxLk1zZ0RldGFpbFIJbXNnRGV0YWls');\n\n@$core.Deprecated('Use reqGetSessionsDescriptor instead')\nconst ReqGetSessions$json = {\n  '1': 'ReqGetSessions',\n  '2': [\n    {'1': 'begin_ts', '3': 1, '4': 1, '5': 3, '10': 'beginTs'},\n    {'1': 'end_ts', '3': 2, '4': 1, '5': 3, '10': 'endTs'},\n    {'1': 'size', '3': 3, '4': 1, '5': 5, '10': 'size'},\n    {'1': 'session_type', '3': 4, '4': 1, '5': 5, '10': 'sessionType'},\n    {'1': 'unfollow_fold', '3': 5, '4': 1, '5': 5, '10': 'unfollowFold'},\n    {'1': 'group_fold', '3': 6, '4': 1, '5': 5, '10': 'groupFold'},\n    {'1': 'sort_rule', '3': 7, '4': 1, '5': 5, '10': 'sortRule'},\n    {'1': 'teenager_mode', '3': 8, '4': 1, '5': 5, '10': 'teenagerMode'},\n    {'1': 'lessons_mode', '3': 9, '4': 1, '5': 5, '10': 'lessonsMode'},\n    {'1': 'sids', '3': 10, '4': 3, '5': 5, '10': 'sids'},\n    {'1': 'ai_uid', '3': 11, '4': 1, '5': 3, '10': 'aiUid'},\n  ],\n};\n\n/// Descriptor for `ReqGetSessions`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqGetSessionsDescriptor = $convert.base64Decode(\n    'Cg5SZXFHZXRTZXNzaW9ucxIZCghiZWdpbl90cxgBIAEoA1IHYmVnaW5UcxIVCgZlbmRfdHMYAi'\n    'ABKANSBWVuZFRzEhIKBHNpemUYAyABKAVSBHNpemUSIQoMc2Vzc2lvbl90eXBlGAQgASgFUgtz'\n    'ZXNzaW9uVHlwZRIjCg11bmZvbGxvd19mb2xkGAUgASgFUgx1bmZvbGxvd0ZvbGQSHQoKZ3JvdX'\n    'BfZm9sZBgGIAEoBVIJZ3JvdXBGb2xkEhsKCXNvcnRfcnVsZRgHIAEoBVIIc29ydFJ1bGUSIwoN'\n    'dGVlbmFnZXJfbW9kZRgIIAEoBVIMdGVlbmFnZXJNb2RlEiEKDGxlc3NvbnNfbW9kZRgJIAEoBV'\n    'ILbGVzc29uc01vZGUSEgoEc2lkcxgKIAMoBVIEc2lkcxIVCgZhaV91aWQYCyABKANSBWFpVWlk');\n\n@$core.Deprecated('Use reqGetSpecificSessionsDescriptor instead')\nconst ReqGetSpecificSessions$json = {\n  '1': 'ReqGetSpecificSessions',\n  '2': [\n    {\n      '1': 'talker_sessions',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.im.interfaces.v1.SimpleSession',\n      '10': 'talkerSessions'\n    },\n  ],\n};\n\n/// Descriptor for `ReqGetSpecificSessions`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqGetSpecificSessionsDescriptor = $convert.base64Decode(\n    'ChZSZXFHZXRTcGVjaWZpY1Nlc3Npb25zElEKD3RhbGtlcl9zZXNzaW9ucxgBIAMoCzIoLmJpbG'\n    'liaWxpLmltLmludGVyZmFjZXMudjEuU2ltcGxlU2Vzc2lvblIOdGFsa2VyU2Vzc2lvbnM=');\n\n@$core.Deprecated('Use reqGroupAssisMsgDescriptor instead')\nconst ReqGroupAssisMsg$json = {\n  '1': 'ReqGroupAssisMsg',\n  '2': [\n    {'1': 'client_seqno', '3': 1, '4': 1, '5': 3, '10': 'clientSeqno'},\n    {'1': 'size', '3': 2, '4': 1, '5': 5, '10': 'size'},\n  ],\n};\n\n/// Descriptor for `ReqGroupAssisMsg`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqGroupAssisMsgDescriptor = $convert.base64Decode(\n    'ChBSZXFHcm91cEFzc2lzTXNnEiEKDGNsaWVudF9zZXFubxgBIAEoA1ILY2xpZW50U2Vxbm8SEg'\n    'oEc2l6ZRgCIAEoBVIEc2l6ZQ==');\n\n@$core.Deprecated('Use reqLikeMsgDescriptor instead')\nconst ReqLikeMsg$json = {\n  '1': 'ReqLikeMsg',\n  '2': [\n    {'1': 'msg_key', '3': 1, '4': 1, '5': 3, '10': 'msgKey'},\n    {\n      '1': 'action',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.im.interfaces.v1.MSG_LIKE_ACTION',\n      '10': 'action'\n    },\n  ],\n};\n\n/// Descriptor for `ReqLikeMsg`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqLikeMsgDescriptor = $convert.base64Decode(\n    'CgpSZXFMaWtlTXNnEhcKB21zZ19rZXkYASABKANSBm1zZ0tleRJCCgZhY3Rpb24YAiABKA4yKi'\n    '5iaWxpYmlsaS5pbS5pbnRlcmZhY2VzLnYxLk1TR19MSUtFX0FDVElPTlIGYWN0aW9u');\n\n@$core.Deprecated('Use reqLiveInfoDescriptor instead')\nconst ReqLiveInfo$json = {\n  '1': 'ReqLiveInfo',\n  '2': [\n    {'1': 'uid', '3': 1, '4': 1, '5': 3, '10': 'uid'},\n    {'1': 'talker_id', '3': 2, '4': 1, '5': 3, '10': 'talkerId'},\n  ],\n};\n\n/// Descriptor for `ReqLiveInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqLiveInfoDescriptor = $convert.base64Decode(\n    'CgtSZXFMaXZlSW5mbxIQCgN1aWQYASABKANSA3VpZBIbCgl0YWxrZXJfaWQYAiABKANSCHRhbG'\n    'tlcklk');\n\n@$core.Deprecated('Use reqMsgHasLikeDescriptor instead')\nconst ReqMsgHasLike$json = {\n  '1': 'ReqMsgHasLike',\n  '2': [\n    {'1': 'msg_keys', '3': 1, '4': 3, '5': 3, '10': 'msgKeys'},\n  ],\n};\n\n/// Descriptor for `ReqMsgHasLike`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqMsgHasLikeDescriptor = $convert\n    .base64Decode('Cg1SZXFNc2dIYXNMaWtlEhkKCG1zZ19rZXlzGAEgAygDUgdtc2dLZXlz');\n\n@$core.Deprecated('Use reqNewSessionsDescriptor instead')\nconst ReqNewSessions$json = {\n  '1': 'ReqNewSessions',\n  '2': [\n    {'1': 'begin_ts', '3': 1, '4': 1, '5': 3, '10': 'beginTs'},\n    {'1': 'size', '3': 2, '4': 1, '5': 5, '10': 'size'},\n    {'1': 'teenager_mode', '3': 3, '4': 1, '5': 5, '10': 'teenagerMode'},\n    {'1': 'lessons_mode', '3': 4, '4': 1, '5': 5, '10': 'lessonsMode'},\n    {'1': 'sids', '3': 5, '4': 3, '5': 5, '10': 'sids'},\n  ],\n};\n\n/// Descriptor for `ReqNewSessions`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqNewSessionsDescriptor = $convert.base64Decode(\n    'Cg5SZXFOZXdTZXNzaW9ucxIZCghiZWdpbl90cxgBIAEoA1IHYmVnaW5UcxISCgRzaXplGAIgAS'\n    'gFUgRzaXplEiMKDXRlZW5hZ2VyX21vZGUYAyABKAVSDHRlZW5hZ2VyTW9kZRIhCgxsZXNzb25z'\n    'X21vZGUYBCABKAVSC2xlc3NvbnNNb2RlEhIKBHNpZHMYBSADKAVSBHNpZHM=');\n\n@$core.Deprecated('Use reqRelationSyncDescriptor instead')\nconst ReqRelationSync$json = {\n  '1': 'ReqRelationSync',\n  '2': [\n    {\n      '1': 'client_relation_oplog_seqno',\n      '3': 1,\n      '4': 1,\n      '5': 3,\n      '10': 'clientRelationOplogSeqno'\n    },\n  ],\n};\n\n/// Descriptor for `ReqRelationSync`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqRelationSyncDescriptor = $convert.base64Decode(\n    'Cg9SZXFSZWxhdGlvblN5bmMSPQobY2xpZW50X3JlbGF0aW9uX29wbG9nX3NlcW5vGAEgASgDUh'\n    'hjbGllbnRSZWxhdGlvbk9wbG9nU2Vxbm8=');\n\n@$core.Deprecated('Use reqRemoveSessionDescriptor instead')\nconst ReqRemoveSession$json = {\n  '1': 'ReqRemoveSession',\n  '2': [\n    {'1': 'talker_id', '3': 1, '4': 1, '5': 3, '10': 'talkerId'},\n    {'1': 'session_type', '3': 2, '4': 1, '5': 5, '10': 'sessionType'},\n    {'1': 'shop_id', '3': 3, '4': 1, '5': 3, '10': 'shopId'},\n    {'1': 'shop_father_id', '3': 4, '4': 1, '5': 3, '10': 'shopFatherId'},\n  ],\n};\n\n/// Descriptor for `ReqRemoveSession`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqRemoveSessionDescriptor = $convert.base64Decode(\n    'ChBSZXFSZW1vdmVTZXNzaW9uEhsKCXRhbGtlcl9pZBgBIAEoA1IIdGFsa2VySWQSIQoMc2Vzc2'\n    'lvbl90eXBlGAIgASgFUgtzZXNzaW9uVHlwZRIXCgdzaG9wX2lkGAMgASgDUgZzaG9wSWQSJAoO'\n    'c2hvcF9mYXRoZXJfaWQYBCABKANSDHNob3BGYXRoZXJJZA==');\n\n@$core.Deprecated('Use reqSendMsgDescriptor instead')\nconst ReqSendMsg$json = {\n  '1': 'ReqSendMsg',\n  '2': [\n    {\n      '1': 'msg',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.Msg',\n      '10': 'msg'\n    },\n    {'1': 'cookie', '3': 2, '4': 1, '5': 9, '10': 'cookie'},\n    {'1': 'cookie2', '3': 3, '4': 1, '5': 9, '10': 'cookie2'},\n    {'1': 'error_code', '3': 4, '4': 1, '5': 5, '10': 'errorCode'},\n    {'1': 'dev_id', '3': 5, '4': 1, '5': 9, '10': 'devId'},\n  ],\n};\n\n/// Descriptor for `ReqSendMsg`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqSendMsgDescriptor = $convert.base64Decode(\n    'CgpSZXFTZW5kTXNnEicKA21zZxgBIAEoCzIVLmJpbGliaWxpLmltLnR5cGUuTXNnUgNtc2cSFg'\n    'oGY29va2llGAIgASgJUgZjb29raWUSGAoHY29va2llMhgDIAEoCVIHY29va2llMhIdCgplcnJv'\n    'cl9jb2RlGAQgASgFUgllcnJvckNvZGUSFQoGZGV2X2lkGAUgASgJUgVkZXZJZA==');\n\n@$core.Deprecated('Use reqSessionDetailDescriptor instead')\nconst ReqSessionDetail$json = {\n  '1': 'ReqSessionDetail',\n  '2': [\n    {'1': 'talker_id', '3': 1, '4': 1, '5': 3, '10': 'talkerId'},\n    {'1': 'session_type', '3': 2, '4': 1, '5': 5, '10': 'sessionType'},\n    {'1': 'uid', '3': 3, '4': 1, '5': 3, '10': 'uid'},\n  ],\n};\n\n/// Descriptor for `ReqSessionDetail`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqSessionDetailDescriptor = $convert.base64Decode(\n    'ChBSZXFTZXNzaW9uRGV0YWlsEhsKCXRhbGtlcl9pZBgBIAEoA1IIdGFsa2VySWQSIQoMc2Vzc2'\n    'lvbl90eXBlGAIgASgFUgtzZXNzaW9uVHlwZRIQCgN1aWQYAyABKANSA3VpZA==');\n\n@$core.Deprecated('Use reqSessionDetailsDescriptor instead')\nconst ReqSessionDetails$json = {\n  '1': 'ReqSessionDetails',\n  '2': [\n    {\n      '1': 'sess_ids',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.im.interfaces.v1.ReqSessionDetail',\n      '10': 'sessIds'\n    },\n  ],\n};\n\n/// Descriptor for `ReqSessionDetails`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqSessionDetailsDescriptor = $convert.base64Decode(\n    'ChFSZXFTZXNzaW9uRGV0YWlscxJGCghzZXNzX2lkcxgBIAMoCzIrLmJpbGliaWxpLmltLmludG'\n    'VyZmFjZXMudjEuUmVxU2Vzc2lvbkRldGFpbFIHc2Vzc0lkcw==');\n\n@$core.Deprecated('Use reqSessionMsgDescriptor instead')\nconst ReqSessionMsg$json = {\n  '1': 'ReqSessionMsg',\n  '2': [\n    {'1': 'talker_id', '3': 1, '4': 1, '5': 3, '10': 'talkerId'},\n    {'1': 'session_type', '3': 2, '4': 1, '5': 5, '10': 'sessionType'},\n    {'1': 'end_seqno', '3': 3, '4': 1, '5': 3, '10': 'endSeqno'},\n    {'1': 'begin_seqno', '3': 4, '4': 1, '5': 3, '10': 'beginSeqno'},\n    {'1': 'size', '3': 5, '4': 1, '5': 5, '10': 'size'},\n    {'1': 'order', '3': 6, '4': 1, '5': 5, '10': 'order'},\n    {'1': 'dev_id', '3': 7, '4': 1, '5': 9, '10': 'devId'},\n    {'1': 'canal_token', '3': 8, '4': 1, '5': 9, '10': 'canalToken'},\n    {'1': 'ai_uid', '3': 9, '4': 1, '5': 3, '10': 'aiUid'},\n    {'1': 'need_ai_msg', '3': 10, '4': 1, '5': 8, '10': 'needAiMsg'},\n  ],\n};\n\n/// Descriptor for `ReqSessionMsg`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqSessionMsgDescriptor = $convert.base64Decode(\n    'Cg1SZXFTZXNzaW9uTXNnEhsKCXRhbGtlcl9pZBgBIAEoA1IIdGFsa2VySWQSIQoMc2Vzc2lvbl'\n    '90eXBlGAIgASgFUgtzZXNzaW9uVHlwZRIbCgllbmRfc2Vxbm8YAyABKANSCGVuZFNlcW5vEh8K'\n    'C2JlZ2luX3NlcW5vGAQgASgDUgpiZWdpblNlcW5vEhIKBHNpemUYBSABKAVSBHNpemUSFAoFb3'\n    'JkZXIYBiABKAVSBW9yZGVyEhUKBmRldl9pZBgHIAEoCVIFZGV2SWQSHwoLY2FuYWxfdG9rZW4Y'\n    'CCABKAlSCmNhbmFsVG9rZW4SFQoGYWlfdWlkGAkgASgDUgVhaVVpZBIeCgtuZWVkX2FpX21zZx'\n    'gKIAEoCFIJbmVlZEFpTXNn');\n\n@$core.Deprecated('Use reqSetTopDescriptor instead')\nconst ReqSetTop$json = {\n  '1': 'ReqSetTop',\n  '2': [\n    {'1': 'talker_id', '3': 1, '4': 1, '5': 3, '10': 'talkerId'},\n    {'1': 'session_type', '3': 2, '4': 1, '5': 5, '10': 'sessionType'},\n    {'1': 'op_type', '3': 3, '4': 1, '5': 5, '10': 'opType'},\n    {'1': 'shop_id', '3': 4, '4': 1, '5': 3, '10': 'shopId'},\n    {'1': 'shop_father_id', '3': 5, '4': 1, '5': 3, '10': 'shopFatherId'},\n  ],\n};\n\n/// Descriptor for `ReqSetTop`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqSetTopDescriptor = $convert.base64Decode(\n    'CglSZXFTZXRUb3ASGwoJdGFsa2VyX2lkGAEgASgDUgh0YWxrZXJJZBIhCgxzZXNzaW9uX3R5cG'\n    'UYAiABKAVSC3Nlc3Npb25UeXBlEhcKB29wX3R5cGUYAyABKAVSBm9wVHlwZRIXCgdzaG9wX2lk'\n    'GAQgASgDUgZzaG9wSWQSJAoOc2hvcF9mYXRoZXJfaWQYBSABKANSDHNob3BGYXRoZXJJZA==');\n\n@$core.Deprecated('Use reqShareListDescriptor instead')\nconst ReqShareList$json = {\n  '1': 'ReqShareList',\n  '2': [\n    {'1': 'size', '3': 1, '4': 1, '5': 5, '10': 'size'},\n    {'1': 'source', '3': 2, '4': 1, '5': 5, '10': 'source'},\n  ],\n};\n\n/// Descriptor for `ReqShareList`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqShareListDescriptor = $convert.base64Decode(\n    'CgxSZXFTaGFyZUxpc3QSEgoEc2l6ZRgBIAEoBVIEc2l6ZRIWCgZzb3VyY2UYAiABKAVSBnNvdX'\n    'JjZQ==');\n\n@$core.Deprecated('Use reqShowClearUnreadUIDescriptor instead')\nconst ReqShowClearUnreadUI$json = {\n  '1': 'ReqShowClearUnreadUI',\n  '2': [\n    {'1': 'unread_type', '3': 1, '4': 1, '5': 5, '10': 'unreadType'},\n    {\n      '1': 'show_unfollow_list',\n      '3': 2,\n      '4': 1,\n      '5': 5,\n      '10': 'showUnfollowList'\n    },\n    {'1': 'show_dustbin', '3': 4, '4': 1, '5': 5, '10': 'showDustbin'},\n  ],\n};\n\n/// Descriptor for `ReqShowClearUnreadUI`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqShowClearUnreadUIDescriptor = $convert.base64Decode(\n    'ChRSZXFTaG93Q2xlYXJVbnJlYWRVSRIfCgt1bnJlYWRfdHlwZRgBIAEoBVIKdW5yZWFkVHlwZR'\n    'IsChJzaG93X3VuZm9sbG93X2xpc3QYAiABKAVSEHNob3dVbmZvbGxvd0xpc3QSIQoMc2hvd19k'\n    'dXN0YmluGAQgASgFUgtzaG93RHVzdGJpbg==');\n\n@$core.Deprecated('Use reqSingleUnreadDescriptor instead')\nconst ReqSingleUnread$json = {\n  '1': 'ReqSingleUnread',\n  '2': [\n    {'1': 'unread_type', '3': 1, '4': 1, '5': 5, '10': 'unreadType'},\n    {\n      '1': 'show_unfollow_list',\n      '3': 2,\n      '4': 1,\n      '5': 5,\n      '10': 'showUnfollowList'\n    },\n    {'1': 'uid', '3': 3, '4': 1, '5': 3, '10': 'uid'},\n    {'1': 'show_dustbin', '3': 4, '4': 1, '5': 5, '10': 'showDustbin'},\n  ],\n};\n\n/// Descriptor for `ReqSingleUnread`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqSingleUnreadDescriptor = $convert.base64Decode(\n    'Cg9SZXFTaW5nbGVVbnJlYWQSHwoLdW5yZWFkX3R5cGUYASABKAVSCnVucmVhZFR5cGUSLAoSc2'\n    'hvd191bmZvbGxvd19saXN0GAIgASgFUhBzaG93VW5mb2xsb3dMaXN0EhAKA3VpZBgDIAEoA1ID'\n    'dWlkEiEKDHNob3dfZHVzdGJpbhgEIAEoBVILc2hvd0R1c3RiaW4=');\n\n@$core.Deprecated('Use reqSpecificSingleUnreadDescriptor instead')\nconst ReqSpecificSingleUnread$json = {\n  '1': 'ReqSpecificSingleUnread',\n  '2': [\n    {\n      '1': 'talker_sessions',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.im.interfaces.v1.SimpleSession',\n      '10': 'talkerSessions'\n    },\n  ],\n};\n\n/// Descriptor for `ReqSpecificSingleUnread`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqSpecificSingleUnreadDescriptor = $convert.base64Decode(\n    'ChdSZXFTcGVjaWZpY1NpbmdsZVVucmVhZBJRCg90YWxrZXJfc2Vzc2lvbnMYASADKAsyKC5iaW'\n    'xpYmlsaS5pbS5pbnRlcmZhY2VzLnYxLlNpbXBsZVNlc3Npb25SDnRhbGtlclNlc3Npb25z');\n\n@$core.Deprecated('Use reqSyncAckDescriptor instead')\nconst ReqSyncAck$json = {\n  '1': 'ReqSyncAck',\n  '2': [\n    {'1': 'client_seqno', '3': 1, '4': 1, '5': 3, '10': 'clientSeqno'},\n  ],\n};\n\n/// Descriptor for `ReqSyncAck`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqSyncAckDescriptor = $convert.base64Decode(\n    'CgpSZXFTeW5jQWNrEiEKDGNsaWVudF9zZXFubxgBIAEoA1ILY2xpZW50U2Vxbm8=');\n\n@$core.Deprecated('Use reqTotalUnreadDescriptor instead')\nconst ReqTotalUnread$json = {\n  '1': 'ReqTotalUnread',\n  '2': [\n    {'1': 'unread_type', '3': 1, '4': 1, '5': 5, '10': 'unreadType'},\n    {\n      '1': 'show_unfollow_list',\n      '3': 2,\n      '4': 1,\n      '5': 5,\n      '10': 'showUnfollowList'\n    },\n    {'1': 'uid', '3': 3, '4': 1, '5': 3, '10': 'uid'},\n    {'1': 'show_dustbin', '3': 4, '4': 1, '5': 5, '10': 'showDustbin'},\n    {'1': 'singleunread_on', '3': 5, '4': 1, '5': 5, '10': 'singleunreadOn'},\n    {'1': 'msgfeed_on', '3': 6, '4': 1, '5': 5, '10': 'msgfeedOn'},\n    {'1': 'sysup_on', '3': 7, '4': 1, '5': 5, '10': 'sysupOn'},\n  ],\n};\n\n/// Descriptor for `ReqTotalUnread`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqTotalUnreadDescriptor = $convert.base64Decode(\n    'Cg5SZXFUb3RhbFVucmVhZBIfCgt1bnJlYWRfdHlwZRgBIAEoBVIKdW5yZWFkVHlwZRIsChJzaG'\n    '93X3VuZm9sbG93X2xpc3QYAiABKAVSEHNob3dVbmZvbGxvd0xpc3QSEAoDdWlkGAMgASgDUgN1'\n    'aWQSIQoMc2hvd19kdXN0YmluGAQgASgFUgtzaG93RHVzdGJpbhInCg9zaW5nbGV1bnJlYWRfb2'\n    '4YBSABKAVSDnNpbmdsZXVucmVhZE9uEh0KCm1zZ2ZlZWRfb24YBiABKAVSCW1zZ2ZlZWRPbhIZ'\n    'CghzeXN1cF9vbhgHIAEoBVIHc3lzdXBPbg==');\n\n@$core.Deprecated('Use reqUpdateAckDescriptor instead')\nconst ReqUpdateAck$json = {\n  '1': 'ReqUpdateAck',\n  '2': [\n    {'1': 'talker_id', '3': 1, '4': 1, '5': 3, '10': 'talkerId'},\n    {'1': 'session_type', '3': 2, '4': 1, '5': 5, '10': 'sessionType'},\n    {'1': 'ack_seqno', '3': 3, '4': 1, '5': 3, '10': 'ackSeqno'},\n  ],\n};\n\n/// Descriptor for `ReqUpdateAck`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqUpdateAckDescriptor = $convert.base64Decode(\n    'CgxSZXFVcGRhdGVBY2sSGwoJdGFsa2VyX2lkGAEgASgDUgh0YWxrZXJJZBIhCgxzZXNzaW9uX3'\n    'R5cGUYAiABKAVSC3Nlc3Npb25UeXBlEhsKCWFja19zZXFubxgDIAEoA1IIYWNrU2Vxbm8=');\n\n@$core.Deprecated('Use reqUpdateInterceptDescriptor instead')\nconst ReqUpdateIntercept$json = {\n  '1': 'ReqUpdateIntercept',\n  '2': [\n    {'1': 'uid', '3': 1, '4': 1, '5': 3, '10': 'uid'},\n    {'1': 'talker_id', '3': 2, '4': 1, '5': 3, '10': 'talkerId'},\n    {'1': 'status', '3': 3, '4': 1, '5': 5, '10': 'status'},\n  ],\n};\n\n/// Descriptor for `ReqUpdateIntercept`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqUpdateInterceptDescriptor = $convert.base64Decode(\n    'ChJSZXFVcGRhdGVJbnRlcmNlcHQSEAoDdWlkGAEgASgDUgN1aWQSGwoJdGFsa2VyX2lkGAIgAS'\n    'gDUgh0YWxrZXJJZBIWCgZzdGF0dXMYAyABKAVSBnN0YXR1cw==');\n\n@$core.Deprecated('Use reqUpdateTotalUnreadDescriptor instead')\nconst ReqUpdateTotalUnread$json = {\n  '1': 'ReqUpdateTotalUnread',\n  '2': [\n    {\n      '1': 'scope',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.im.interfaces.v1.UpdateUnreadScope',\n      '10': 'scope'\n    },\n  ],\n};\n\n/// Descriptor for `ReqUpdateTotalUnread`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reqUpdateTotalUnreadDescriptor = $convert.base64Decode(\n    'ChRSZXFVcGRhdGVUb3RhbFVucmVhZBJCCgVzY29wZRgBIAEoDjIsLmJpbGliaWxpLmltLmludG'\n    'VyZmFjZXMudjEuVXBkYXRlVW5yZWFkU2NvcGVSBXNjb3Bl');\n\n@$core.Deprecated('Use rspCloseClearUnreadUIDescriptor instead')\nconst RspCloseClearUnreadUI$json = {\n  '1': 'RspCloseClearUnreadUI',\n};\n\n/// Descriptor for `RspCloseClearUnreadUI`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rspCloseClearUnreadUIDescriptor =\n    $convert.base64Decode('ChVSc3BDbG9zZUNsZWFyVW5yZWFkVUk=');\n\n@$core.Deprecated('Use rspGetDiscussListInImPageDescriptor instead')\nconst RspGetDiscussListInImPage$json = {\n  '1': 'RspGetDiscussListInImPage',\n  '2': [\n    {\n      '1': 'discuss_list',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.im.interfaces.v1.SingleDiscussInImPage',\n      '10': 'discussList'\n    },\n  ],\n};\n\n/// Descriptor for `RspGetDiscussListInImPage`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rspGetDiscussListInImPageDescriptor = $convert.base64Decode(\n    'ChlSc3BHZXREaXNjdXNzTGlzdEluSW1QYWdlElMKDGRpc2N1c3NfbGlzdBgBIAMoCzIwLmJpbG'\n    'liaWxpLmltLmludGVyZmFjZXMudjEuU2luZ2xlRGlzY3Vzc0luSW1QYWdlUgtkaXNjdXNzTGlz'\n    'dA==');\n\n@$core.Deprecated('Use rspGetMsgDescriptor instead')\nconst RspGetMsg$json = {\n  '1': 'RspGetMsg',\n  '2': [\n    {\n      '1': 'msg',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.im.type.Msg',\n      '10': 'msg'\n    },\n  ],\n};\n\n/// Descriptor for `RspGetMsg`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rspGetMsgDescriptor = $convert.base64Decode(\n    'CglSc3BHZXRNc2cSJwoDbXNnGAEgAygLMhUuYmlsaWJpbGkuaW0udHlwZS5Nc2dSA21zZw==');\n\n@$core.Deprecated('Use rspLiveInfoDescriptor instead')\nconst RspLiveInfo$json = {\n  '1': 'RspLiveInfo',\n  '2': [\n    {'1': 'live_status', '3': 1, '4': 1, '5': 3, '10': 'liveStatus'},\n    {'1': 'jump_url', '3': 2, '4': 1, '5': 9, '10': 'jumpUrl'},\n  ],\n};\n\n/// Descriptor for `RspLiveInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rspLiveInfoDescriptor = $convert.base64Decode(\n    'CgtSc3BMaXZlSW5mbxIfCgtsaXZlX3N0YXR1cxgBIAEoA1IKbGl2ZVN0YXR1cxIZCghqdW1wX3'\n    'VybBgCIAEoCVIHanVtcFVybA==');\n\n@$core.Deprecated('Use rspMsgHasLikeDescriptor instead')\nconst RspMsgHasLike$json = {\n  '1': 'RspMsgHasLike',\n  '2': [\n    {\n      '1': 'states',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.im.interfaces.v1.RspMsgHasLike.StatesEntry',\n      '10': 'states'\n    },\n  ],\n  '3': [RspMsgHasLike_StatesEntry$json],\n};\n\n@$core.Deprecated('Use rspMsgHasLikeDescriptor instead')\nconst RspMsgHasLike_StatesEntry$json = {\n  '1': 'StatesEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 3, '10': 'key'},\n    {\n      '1': 'value',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.interfaces.v1.HasLikeState',\n      '10': 'value'\n    },\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `RspMsgHasLike`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rspMsgHasLikeDescriptor = $convert.base64Decode(\n    'Cg1Sc3BNc2dIYXNMaWtlEkwKBnN0YXRlcxgBIAMoCzI0LmJpbGliaWxpLmltLmludGVyZmFjZX'\n    'MudjEuUnNwTXNnSGFzTGlrZS5TdGF0ZXNFbnRyeVIGc3RhdGVzGmIKC1N0YXRlc0VudHJ5EhAK'\n    'A2tleRgBIAEoA1IDa2V5Ej0KBXZhbHVlGAIgASgLMicuYmlsaWJpbGkuaW0uaW50ZXJmYWNlcy'\n    '52MS5IYXNMaWtlU3RhdGVSBXZhbHVlOgI4AQ==');\n\n@$core.Deprecated('Use rspMyGroupUnreadDescriptor instead')\nconst RspMyGroupUnread$json = {\n  '1': 'RspMyGroupUnread',\n  '2': [\n    {'1': 'unread_count', '3': 1, '4': 1, '5': 5, '10': 'unreadCount'},\n  ],\n};\n\n/// Descriptor for `RspMyGroupUnread`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rspMyGroupUnreadDescriptor = $convert.base64Decode(\n    'ChBSc3BNeUdyb3VwVW5yZWFkEiEKDHVucmVhZF9jb3VudBgBIAEoBVILdW5yZWFkQ291bnQ=');\n\n@$core.Deprecated('Use rspRelationSyncDescriptor instead')\nconst RspRelationSync$json = {\n  '1': 'RspRelationSync',\n  '2': [\n    {'1': 'full', '3': 1, '4': 1, '5': 5, '10': 'full'},\n    {\n      '1': 'relation_logs',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.im.type.RelationLog',\n      '10': 'relationLogs'\n    },\n    {\n      '1': 'friend_list',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.im.type.FriendRelation',\n      '10': 'friendList'\n    },\n    {\n      '1': 'server_relation_oplog_seqno',\n      '3': 4,\n      '4': 1,\n      '5': 3,\n      '10': 'serverRelationOplogSeqno'\n    },\n    {\n      '1': 'group_list',\n      '3': 5,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.im.type.GroupRelation',\n      '10': 'groupList'\n    },\n  ],\n};\n\n/// Descriptor for `RspRelationSync`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rspRelationSyncDescriptor = $convert.base64Decode(\n    'Cg9Sc3BSZWxhdGlvblN5bmMSEgoEZnVsbBgBIAEoBVIEZnVsbBJCCg1yZWxhdGlvbl9sb2dzGA'\n    'IgAygLMh0uYmlsaWJpbGkuaW0udHlwZS5SZWxhdGlvbkxvZ1IMcmVsYXRpb25Mb2dzEkEKC2Zy'\n    'aWVuZF9saXN0GAMgAygLMiAuYmlsaWJpbGkuaW0udHlwZS5GcmllbmRSZWxhdGlvblIKZnJpZW'\n    '5kTGlzdBI9ChtzZXJ2ZXJfcmVsYXRpb25fb3Bsb2dfc2Vxbm8YBCABKANSGHNlcnZlclJlbGF0'\n    'aW9uT3Bsb2dTZXFubxI+Cgpncm91cF9saXN0GAUgAygLMh8uYmlsaWJpbGkuaW0udHlwZS5Hcm'\n    '91cFJlbGF0aW9uUglncm91cExpc3Q=');\n\n@$core.Deprecated('Use rspSendMsgDescriptor instead')\nconst RspSendMsg$json = {\n  '1': 'RspSendMsg',\n  '2': [\n    {'1': 'msg_key', '3': 1, '4': 1, '5': 3, '10': 'msgKey'},\n    {\n      '1': 'e_infos',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.im.interfaces.v1.EmotionInfo',\n      '10': 'eInfos'\n    },\n    {'1': 'msg_content', '3': 3, '4': 1, '5': 9, '10': 'msgContent'},\n    {\n      '1': 'key_hit_infos',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.KeyHitInfos',\n      '10': 'keyHitInfos'\n    },\n    {\n      '1': 'rich_text_msg_content',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.RichTextMsgContent',\n      '10': 'richTextMsgContent'\n    },\n    {'1': 'seqno', '3': 6, '4': 1, '5': 3, '10': 'seqno'},\n  ],\n};\n\n/// Descriptor for `RspSendMsg`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rspSendMsgDescriptor = $convert.base64Decode(\n    'CgpSc3BTZW5kTXNnEhcKB21zZ19rZXkYASABKANSBm1zZ0tleRI/CgdlX2luZm9zGAIgAygLMi'\n    'YuYmlsaWJpbGkuaW0uaW50ZXJmYWNlcy52MS5FbW90aW9uSW5mb1IGZUluZm9zEh8KC21zZ19j'\n    'b250ZW50GAMgASgJUgptc2dDb250ZW50EkEKDWtleV9oaXRfaW5mb3MYBCABKAsyHS5iaWxpYm'\n    'lsaS5pbS50eXBlLktleUhpdEluZm9zUgtrZXlIaXRJbmZvcxJXChVyaWNoX3RleHRfbXNnX2Nv'\n    'bnRlbnQYBSABKAsyJC5iaWxpYmlsaS5pbS50eXBlLlJpY2hUZXh0TXNnQ29udGVudFIScmljaF'\n    'RleHRNc2dDb250ZW50EhQKBXNlcW5vGAYgASgDUgVzZXFubw==');\n\n@$core.Deprecated('Use rspSessionDetailsDescriptor instead')\nconst RspSessionDetails$json = {\n  '1': 'RspSessionDetails',\n  '2': [\n    {\n      '1': 'sess_infos',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.im.type.SessionInfo',\n      '10': 'sessInfos'\n    },\n  ],\n};\n\n/// Descriptor for `RspSessionDetails`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rspSessionDetailsDescriptor = $convert.base64Decode(\n    'ChFSc3BTZXNzaW9uRGV0YWlscxI8CgpzZXNzX2luZm9zGAEgAygLMh0uYmlsaWJpbGkuaW0udH'\n    'lwZS5TZXNzaW9uSW5mb1IJc2Vzc0luZm9z');\n\n@$core.Deprecated('Use rspSessionMsgDescriptor instead')\nconst RspSessionMsg$json = {\n  '1': 'RspSessionMsg',\n  '2': [\n    {\n      '1': 'messages',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.im.type.Msg',\n      '10': 'messages'\n    },\n    {'1': 'has_more', '3': 2, '4': 1, '5': 5, '10': 'hasMore'},\n    {'1': 'min_seqno', '3': 3, '4': 1, '5': 3, '10': 'minSeqno'},\n    {'1': 'max_seqno', '3': 4, '4': 1, '5': 3, '10': 'maxSeqno'},\n    {\n      '1': 'e_infos',\n      '3': 5,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.im.interfaces.v1.EmotionInfo',\n      '10': 'eInfos'\n    },\n  ],\n};\n\n/// Descriptor for `RspSessionMsg`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rspSessionMsgDescriptor = $convert.base64Decode(\n    'Cg1Sc3BTZXNzaW9uTXNnEjEKCG1lc3NhZ2VzGAEgAygLMhUuYmlsaWJpbGkuaW0udHlwZS5Nc2'\n    'dSCG1lc3NhZ2VzEhkKCGhhc19tb3JlGAIgASgFUgdoYXNNb3JlEhsKCW1pbl9zZXFubxgDIAEo'\n    'A1IIbWluU2Vxbm8SGwoJbWF4X3NlcW5vGAQgASgDUghtYXhTZXFubxI/CgdlX2luZm9zGAUgAy'\n    'gLMiYuYmlsaWJpbGkuaW0uaW50ZXJmYWNlcy52MS5FbW90aW9uSW5mb1IGZUluZm9z');\n\n@$core.Deprecated('Use rspSessionsDescriptor instead')\nconst RspSessions$json = {\n  '1': 'RspSessions',\n  '2': [\n    {\n      '1': 'session_list',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.im.type.SessionInfo',\n      '10': 'sessionList'\n    },\n    {'1': 'has_more', '3': 2, '4': 1, '5': 5, '10': 'hasMore'},\n    {\n      '1': 'anti_disturb_cleaning',\n      '3': 3,\n      '4': 1,\n      '5': 8,\n      '10': 'antiDisturbCleaning'\n    },\n    {\n      '1': 'is_address_list_empty',\n      '3': 4,\n      '4': 1,\n      '5': 5,\n      '10': 'isAddressListEmpty'\n    },\n    {\n      '1': 'system_msg',\n      '3': 5,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.im.interfaces.v1.RspSessions.SystemMsgEntry',\n      '10': 'systemMsg'\n    },\n    {'1': 'show_level', '3': 6, '4': 1, '5': 8, '10': 'showLevel'},\n  ],\n  '3': [RspSessions_SystemMsgEntry$json],\n};\n\n@$core.Deprecated('Use rspSessionsDescriptor instead')\nconst RspSessions_SystemMsgEntry$json = {\n  '1': 'SystemMsgEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 5, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 3, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `RspSessions`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rspSessionsDescriptor = $convert.base64Decode(\n    'CgtSc3BTZXNzaW9ucxJACgxzZXNzaW9uX2xpc3QYASADKAsyHS5iaWxpYmlsaS5pbS50eXBlLl'\n    'Nlc3Npb25JbmZvUgtzZXNzaW9uTGlzdBIZCghoYXNfbW9yZRgCIAEoBVIHaGFzTW9yZRIyChVh'\n    'bnRpX2Rpc3R1cmJfY2xlYW5pbmcYAyABKAhSE2FudGlEaXN0dXJiQ2xlYW5pbmcSMQoVaXNfYW'\n    'RkcmVzc19saXN0X2VtcHR5GAQgASgFUhJpc0FkZHJlc3NMaXN0RW1wdHkSVAoKc3lzdGVtX21z'\n    'ZxgFIAMoCzI1LmJpbGliaWxpLmltLmludGVyZmFjZXMudjEuUnNwU2Vzc2lvbnMuU3lzdGVtTX'\n    'NnRW50cnlSCXN5c3RlbU1zZxIdCgpzaG93X2xldmVsGAYgASgIUglzaG93TGV2ZWwaPAoOU3lz'\n    'dGVtTXNnRW50cnkSEAoDa2V5GAEgASgFUgNrZXkSFAoFdmFsdWUYAiABKANSBXZhbHVlOgI4AQ'\n    '==');\n\n@$core.Deprecated('Use rspShareListDescriptor instead')\nconst RspShareList$json = {\n  '1': 'RspShareList',\n  '2': [\n    {\n      '1': 'session_list',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.im.interfaces.v1.ShareSessionInfo',\n      '10': 'sessionList'\n    },\n    {\n      '1': 'is_address_list_empty',\n      '3': 2,\n      '4': 1,\n      '5': 5,\n      '10': 'isAddressListEmpty'\n    },\n  ],\n};\n\n/// Descriptor for `RspShareList`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rspShareListDescriptor = $convert.base64Decode(\n    'CgxSc3BTaGFyZUxpc3QSTgoMc2Vzc2lvbl9saXN0GAEgAygLMisuYmlsaWJpbGkuaW0uaW50ZX'\n    'JmYWNlcy52MS5TaGFyZVNlc3Npb25JbmZvUgtzZXNzaW9uTGlzdBIxChVpc19hZGRyZXNzX2xp'\n    'c3RfZW1wdHkYAiABKAVSEmlzQWRkcmVzc0xpc3RFbXB0eQ==');\n\n@$core.Deprecated('Use rspShowClearUnreadUIDescriptor instead')\nconst RspShowClearUnreadUI$json = {\n  '1': 'RspShowClearUnreadUI',\n  '2': [\n    {'1': 'display', '3': 1, '4': 1, '5': 8, '10': 'display'},\n    {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},\n  ],\n};\n\n/// Descriptor for `RspShowClearUnreadUI`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rspShowClearUnreadUIDescriptor = $convert.base64Decode(\n    'ChRSc3BTaG93Q2xlYXJVbnJlYWRVSRIYCgdkaXNwbGF5GAEgASgIUgdkaXNwbGF5EhIKBHRleH'\n    'QYAiABKAlSBHRleHQ=');\n\n@$core.Deprecated('Use rspSingleUnreadDescriptor instead')\nconst RspSingleUnread$json = {\n  '1': 'RspSingleUnread',\n  '2': [\n    {'1': 'unfollow_unread', '3': 1, '4': 1, '5': 3, '10': 'unfollowUnread'},\n    {'1': 'follow_unread', '3': 2, '4': 1, '5': 3, '10': 'followUnread'},\n    {'1': 'unfollow_push_msg', '3': 3, '4': 1, '5': 5, '10': 'unfollowPushMsg'},\n    {'1': 'dustbin_push_msg', '3': 4, '4': 1, '5': 5, '10': 'dustbinPushMsg'},\n    {'1': 'dustbin_unread', '3': 5, '4': 1, '5': 3, '10': 'dustbinUnread'},\n    {\n      '1': 'biz_msg_unfollow_unread',\n      '3': 6,\n      '4': 1,\n      '5': 3,\n      '10': 'bizMsgUnfollowUnread'\n    },\n    {\n      '1': 'biz_msg_follow_unread',\n      '3': 7,\n      '4': 1,\n      '5': 3,\n      '10': 'bizMsgFollowUnread'\n    },\n  ],\n};\n\n/// Descriptor for `RspSingleUnread`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rspSingleUnreadDescriptor = $convert.base64Decode(\n    'Cg9Sc3BTaW5nbGVVbnJlYWQSJwoPdW5mb2xsb3dfdW5yZWFkGAEgASgDUg51bmZvbGxvd1Vucm'\n    'VhZBIjCg1mb2xsb3dfdW5yZWFkGAIgASgDUgxmb2xsb3dVbnJlYWQSKgoRdW5mb2xsb3dfcHVz'\n    'aF9tc2cYAyABKAVSD3VuZm9sbG93UHVzaE1zZxIoChBkdXN0YmluX3B1c2hfbXNnGAQgASgFUg'\n    '5kdXN0YmluUHVzaE1zZxIlCg5kdXN0YmluX3VucmVhZBgFIAEoA1INZHVzdGJpblVucmVhZBI1'\n    'ChdiaXpfbXNnX3VuZm9sbG93X3VucmVhZBgGIAEoA1IUYml6TXNnVW5mb2xsb3dVbnJlYWQSMQ'\n    'oVYml6X21zZ19mb2xsb3dfdW5yZWFkGAcgASgDUhJiaXpNc2dGb2xsb3dVbnJlYWQ=');\n\n@$core.Deprecated('Use rspSpecificSingleUnreadDescriptor instead')\nconst RspSpecificSingleUnread$json = {\n  '1': 'RspSpecificSingleUnread',\n  '2': [\n    {\n      '1': 'talker_unread_cnt',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6':\n          '.bilibili.im.interfaces.v1.RspSpecificSingleUnread.TalkerUnreadCntEntry',\n      '10': 'talkerUnreadCnt'\n    },\n    {'1': 'all_unread_cnt', '3': 2, '4': 1, '5': 3, '10': 'allUnreadCnt'},\n  ],\n  '3': [RspSpecificSingleUnread_TalkerUnreadCntEntry$json],\n};\n\n@$core.Deprecated('Use rspSpecificSingleUnreadDescriptor instead')\nconst RspSpecificSingleUnread_TalkerUnreadCntEntry$json = {\n  '1': 'TalkerUnreadCntEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 3, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 3, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `RspSpecificSingleUnread`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rspSpecificSingleUnreadDescriptor = $convert.base64Decode(\n    'ChdSc3BTcGVjaWZpY1NpbmdsZVVucmVhZBJzChF0YWxrZXJfdW5yZWFkX2NudBgBIAMoCzJHLm'\n    'JpbGliaWxpLmltLmludGVyZmFjZXMudjEuUnNwU3BlY2lmaWNTaW5nbGVVbnJlYWQuVGFsa2Vy'\n    'VW5yZWFkQ250RW50cnlSD3RhbGtlclVucmVhZENudBIkCg5hbGxfdW5yZWFkX2NudBgCIAEoA1'\n    'IMYWxsVW5yZWFkQ250GkIKFFRhbGtlclVucmVhZENudEVudHJ5EhAKA2tleRgBIAEoA1IDa2V5'\n    'EhQKBXZhbHVlGAIgASgDUgV2YWx1ZToCOAE=');\n\n@$core.Deprecated('Use rspSyncAckDescriptor instead')\nconst RspSyncAck$json = {\n  '1': 'RspSyncAck',\n};\n\n/// Descriptor for `RspSyncAck`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rspSyncAckDescriptor =\n    $convert.base64Decode('CgpSc3BTeW5jQWNr');\n\n@$core.Deprecated('Use rspTotalUnreadDescriptor instead')\nconst RspTotalUnread$json = {\n  '1': 'RspTotalUnread',\n  '2': [\n    {\n      '1': 'session_single_unread',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.interfaces.v1.SessionSingleUnreadRsp',\n      '10': 'sessionSingleUnread'\n    },\n    {\n      '1': 'msg_feed_unread',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.interfaces.v1.MsgFeedUnreadRsp',\n      '10': 'msgFeedUnread'\n    },\n    {\n      '1': 'sys_msg_interface_last_msg',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.interfaces.v1.SysMsgInterfaceLastMsgRsp',\n      '10': 'sysMsgInterfaceLastMsg'\n    },\n    {'1': 'total_unread', '3': 4, '4': 1, '5': 5, '10': 'totalUnread'},\n    {'1': 'custom_unread', '3': 5, '4': 1, '5': 3, '10': 'customUnread'},\n    {\n      '1': 'new_total_unread',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.interfaces.v1.NewTotalUnread',\n      '10': 'newTotalUnread'\n    },\n  ],\n};\n\n/// Descriptor for `RspTotalUnread`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rspTotalUnreadDescriptor = $convert.base64Decode(\n    'Cg5Sc3BUb3RhbFVucmVhZBJlChVzZXNzaW9uX3NpbmdsZV91bnJlYWQYASABKAsyMS5iaWxpYm'\n    'lsaS5pbS5pbnRlcmZhY2VzLnYxLlNlc3Npb25TaW5nbGVVbnJlYWRSc3BSE3Nlc3Npb25TaW5n'\n    'bGVVbnJlYWQSUwoPbXNnX2ZlZWRfdW5yZWFkGAIgASgLMisuYmlsaWJpbGkuaW0uaW50ZXJmYW'\n    'Nlcy52MS5Nc2dGZWVkVW5yZWFkUnNwUg1tc2dGZWVkVW5yZWFkEnAKGnN5c19tc2dfaW50ZXJm'\n    'YWNlX2xhc3RfbXNnGAMgASgLMjQuYmlsaWJpbGkuaW0uaW50ZXJmYWNlcy52MS5TeXNNc2dJbn'\n    'RlcmZhY2VMYXN0TXNnUnNwUhZzeXNNc2dJbnRlcmZhY2VMYXN0TXNnEiEKDHRvdGFsX3VucmVh'\n    'ZBgEIAEoBVILdG90YWxVbnJlYWQSIwoNY3VzdG9tX3VucmVhZBgFIAEoA1IMY3VzdG9tVW5yZW'\n    'FkElMKEG5ld190b3RhbF91bnJlYWQYBiABKAsyKS5iaWxpYmlsaS5pbS5pbnRlcmZhY2VzLnYx'\n    'Lk5ld1RvdGFsVW5yZWFkUg5uZXdUb3RhbFVucmVhZA==');\n\n@$core.Deprecated('Use rspUpdateTotalUnreadDescriptor instead')\nconst RspUpdateTotalUnread$json = {\n  '1': 'RspUpdateTotalUnread',\n};\n\n/// Descriptor for `RspUpdateTotalUnread`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List rspUpdateTotalUnreadDescriptor =\n    $convert.base64Decode('ChRSc3BVcGRhdGVUb3RhbFVucmVhZA==');\n\n@$core.Deprecated('Use sessionSingleUnreadRspDescriptor instead')\nconst SessionSingleUnreadRsp$json = {\n  '1': 'SessionSingleUnreadRsp',\n  '2': [\n    {'1': 'unfollow_unread', '3': 1, '4': 1, '5': 3, '10': 'unfollowUnread'},\n    {'1': 'follow_unread', '3': 2, '4': 1, '5': 3, '10': 'followUnread'},\n    {'1': 'unfollow_push_msg', '3': 3, '4': 1, '5': 5, '10': 'unfollowPushMsg'},\n    {'1': 'dustbin_push_msg', '3': 4, '4': 1, '5': 5, '10': 'dustbinPushMsg'},\n    {'1': 'dustbin_unread', '3': 5, '4': 1, '5': 3, '10': 'dustbinUnread'},\n    {\n      '1': 'biz_msg_unfollow_unread',\n      '3': 6,\n      '4': 1,\n      '5': 3,\n      '10': 'bizMsgUnfollowUnread'\n    },\n    {\n      '1': 'biz_msg_follow_unread',\n      '3': 7,\n      '4': 1,\n      '5': 3,\n      '10': 'bizMsgFollowUnread'\n    },\n    {'1': 'huahuo_unread', '3': 8, '4': 1, '5': 3, '10': 'huahuoUnread'},\n    {'1': 'custom_unread', '3': 9, '4': 1, '5': 3, '10': 'customUnread'},\n  ],\n};\n\n/// Descriptor for `SessionSingleUnreadRsp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sessionSingleUnreadRspDescriptor = $convert.base64Decode(\n    'ChZTZXNzaW9uU2luZ2xlVW5yZWFkUnNwEicKD3VuZm9sbG93X3VucmVhZBgBIAEoA1IOdW5mb2'\n    'xsb3dVbnJlYWQSIwoNZm9sbG93X3VucmVhZBgCIAEoA1IMZm9sbG93VW5yZWFkEioKEXVuZm9s'\n    'bG93X3B1c2hfbXNnGAMgASgFUg91bmZvbGxvd1B1c2hNc2cSKAoQZHVzdGJpbl9wdXNoX21zZx'\n    'gEIAEoBVIOZHVzdGJpblB1c2hNc2cSJQoOZHVzdGJpbl91bnJlYWQYBSABKANSDWR1c3RiaW5V'\n    'bnJlYWQSNQoXYml6X21zZ191bmZvbGxvd191bnJlYWQYBiABKANSFGJpek1zZ1VuZm9sbG93VW'\n    '5yZWFkEjEKFWJpel9tc2dfZm9sbG93X3VucmVhZBgHIAEoA1ISYml6TXNnRm9sbG93VW5yZWFk'\n    'EiMKDWh1YWh1b191bnJlYWQYCCABKANSDGh1YWh1b1VucmVhZBIjCg1jdXN0b21fdW5yZWFkGA'\n    'kgASgDUgxjdXN0b21VbnJlYWQ=');\n\n@$core.Deprecated('Use shareSessionInfoDescriptor instead')\nconst ShareSessionInfo$json = {\n  '1': 'ShareSessionInfo',\n  '2': [\n    {'1': 'talker_id', '3': 1, '4': 1, '5': 3, '10': 'talkerId'},\n    {'1': 'talker_uname', '3': 2, '4': 1, '5': 9, '10': 'talkerUname'},\n    {'1': 'talker_icon', '3': 3, '4': 1, '5': 9, '10': 'talkerIcon'},\n    {'1': 'official_type', '3': 4, '4': 1, '5': 5, '10': 'officialType'},\n  ],\n};\n\n/// Descriptor for `ShareSessionInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List shareSessionInfoDescriptor = $convert.base64Decode(\n    'ChBTaGFyZVNlc3Npb25JbmZvEhsKCXRhbGtlcl9pZBgBIAEoA1IIdGFsa2VySWQSIQoMdGFsa2'\n    'VyX3VuYW1lGAIgASgJUgt0YWxrZXJVbmFtZRIfCgt0YWxrZXJfaWNvbhgDIAEoCVIKdGFsa2Vy'\n    'SWNvbhIjCg1vZmZpY2lhbF90eXBlGAQgASgFUgxvZmZpY2lhbFR5cGU=');\n\n@$core.Deprecated('Use simpleSessionDescriptor instead')\nconst SimpleSession$json = {\n  '1': 'SimpleSession',\n  '2': [\n    {'1': 'talker_id', '3': 1, '4': 1, '5': 3, '10': 'talkerId'},\n    {'1': 'session_type', '3': 2, '4': 1, '5': 5, '10': 'sessionType'},\n  ],\n};\n\n/// Descriptor for `SimpleSession`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List simpleSessionDescriptor = $convert.base64Decode(\n    'Cg1TaW1wbGVTZXNzaW9uEhsKCXRhbGtlcl9pZBgBIAEoA1IIdGFsa2VySWQSIQoMc2Vzc2lvbl'\n    '90eXBlGAIgASgFUgtzZXNzaW9uVHlwZQ==');\n\n@$core.Deprecated('Use singleDiscussInImPageDescriptor instead')\nconst SingleDiscussInImPage$json = {\n  '1': 'SingleDiscussInImPage',\n  '2': [\n    {'1': 'discuss_id', '3': 1, '4': 1, '5': 3, '10': 'discussId'},\n    {'1': 'mid', '3': 2, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'face', '3': 3, '4': 1, '5': 9, '10': 'face'},\n    {'1': 'name', '3': 4, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'unread_count', '3': 5, '4': 1, '5': 5, '10': 'unreadCount'},\n    {'1': 'type', '3': 6, '4': 1, '5': 5, '10': 'type'},\n  ],\n};\n\n/// Descriptor for `SingleDiscussInImPage`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List singleDiscussInImPageDescriptor = $convert.base64Decode(\n    'ChVTaW5nbGVEaXNjdXNzSW5JbVBhZ2USHQoKZGlzY3Vzc19pZBgBIAEoA1IJZGlzY3Vzc0lkEh'\n    'AKA21pZBgCIAEoA1IDbWlkEhIKBGZhY2UYAyABKAlSBGZhY2USEgoEbmFtZRgEIAEoCVIEbmFt'\n    'ZRIhCgx1bnJlYWRfY291bnQYBSABKAVSC3VucmVhZENvdW50EhIKBHR5cGUYBiABKAVSBHR5cG'\n    'U=');\n\n@$core.Deprecated('Use sysMsgInterfaceLastMsgRspDescriptor instead')\nconst SysMsgInterfaceLastMsgRsp$json = {\n  '1': 'SysMsgInterfaceLastMsgRsp',\n  '2': [\n    {'1': 'unread', '3': 1, '4': 1, '5': 5, '10': 'unread'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'time', '3': 3, '4': 1, '5': 9, '10': 'time'},\n    {'1': 'id', '3': 4, '4': 1, '5': 3, '10': 'id'},\n  ],\n};\n\n/// Descriptor for `SysMsgInterfaceLastMsgRsp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sysMsgInterfaceLastMsgRspDescriptor = $convert.base64Decode(\n    'ChlTeXNNc2dJbnRlcmZhY2VMYXN0TXNnUnNwEhYKBnVucmVhZBgBIAEoBVIGdW5yZWFkEhQKBX'\n    'RpdGxlGAIgASgJUgV0aXRsZRISCgR0aW1lGAMgASgJUgR0aW1lEg4KAmlkGAQgASgDUgJpZA==');\n\n@$core.Deprecated('Use updateUserCosmoStateReqDescriptor instead')\nconst UpdateUserCosmoStateReq$json = {\n  '1': 'UpdateUserCosmoStateReq',\n  '2': [\n    {'1': 'business', '3': 1, '4': 1, '5': 9, '10': 'business'},\n    {'1': 'card_send_mid', '3': 2, '4': 1, '5': 3, '10': 'cardSendMid'},\n    {'1': 'cosmo_state', '3': 3, '4': 1, '5': 5, '10': 'cosmoState'},\n    {'1': 'op_type', '3': 4, '4': 1, '5': 5, '10': 'opType'},\n  ],\n};\n\n/// Descriptor for `UpdateUserCosmoStateReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List updateUserCosmoStateReqDescriptor = $convert.base64Decode(\n    'ChdVcGRhdGVVc2VyQ29zbW9TdGF0ZVJlcRIaCghidXNpbmVzcxgBIAEoCVIIYnVzaW5lc3MSIg'\n    'oNY2FyZF9zZW5kX21pZBgCIAEoA1ILY2FyZFNlbmRNaWQSHwoLY29zbW9fc3RhdGUYAyABKAVS'\n    'CmNvc21vU3RhdGUSFwoHb3BfdHlwZRgEIAEoBVIGb3BUeXBl');\n\n@$core.Deprecated('Use updateUserCosmoStateRspDescriptor instead')\nconst UpdateUserCosmoStateRsp$json = {\n  '1': 'UpdateUserCosmoStateRsp',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n  ],\n};\n\n/// Descriptor for `UpdateUserCosmoStateRsp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List updateUserCosmoStateRspDescriptor =\n    $convert.base64Decode(\n        'ChdVcGRhdGVVc2VyQ29zbW9TdGF0ZVJzcBISCgR0ZXh0GAEgASgJUgR0ZXh0');\n"
  },
  {
    "path": "lib/grpc/bilibili/im/type.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/im/type.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:fixnum/fixnum.dart' as $fixnum;\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nimport '../account/service/v1.pb.dart' as $0;\nimport '../app/dynamic/v2.pb.dart' as $1;\nimport '../dagw/component/avatar/v1.pb.dart' as $2;\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nexport 'type.pbenum.dart';\n\nclass AILogo extends $pb.GeneratedMessage {\n  factory AILogo({\n    $core.String? aiMark,\n    $core.String? limitText,\n  }) {\n    final result = create();\n    if (aiMark != null) result.aiMark = aiMark;\n    if (limitText != null) result.limitText = limitText;\n    return result;\n  }\n\n  AILogo._();\n\n  factory AILogo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AILogo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AILogo',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'aiMark')\n    ..aOS(2, _omitFieldNames ? '' : 'limitText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AILogo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AILogo copyWith(void Function(AILogo) updates) =>\n      super.copyWith((message) => updates(message as AILogo)) as AILogo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AILogo create() => AILogo._();\n  @$core.override\n  AILogo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AILogo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<AILogo>(create);\n  static AILogo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get aiMark => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set aiMark($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAiMark() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAiMark() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get limitText => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set limitText($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLimitText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLimitText() => $_clearField(2);\n}\n\nclass AccountInfo extends $pb.GeneratedMessage {\n  factory AccountInfo({\n    $core.String? name,\n    $core.String? picUrl,\n  }) {\n    final result = create();\n    if (name != null) result.name = name;\n    if (picUrl != null) result.picUrl = picUrl;\n    return result;\n  }\n\n  AccountInfo._();\n\n  factory AccountInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AccountInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AccountInfo',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'name')\n    ..aOS(2, _omitFieldNames ? '' : 'picUrl')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AccountInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AccountInfo copyWith(void Function(AccountInfo) updates) =>\n      super.copyWith((message) => updates(message as AccountInfo))\n          as AccountInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AccountInfo create() => AccountInfo._();\n  @$core.override\n  AccountInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AccountInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AccountInfo>(create);\n  static AccountInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get name => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set name($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasName() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearName() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get picUrl => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set picUrl($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPicUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPicUrl() => $_clearField(2);\n}\n\nclass AiCardInfo extends $pb.GeneratedMessage {\n  factory AiCardInfo({\n    $fixnum.Int64? aiUid,\n    $fixnum.Int64? aiStatus,\n    UInfo? uInfo,\n    $core.String? title,\n    $core.String? subtitle,\n    AILogo? aiLogo,\n    $fixnum.Int64? uid,\n  }) {\n    final result = create();\n    if (aiUid != null) result.aiUid = aiUid;\n    if (aiStatus != null) result.aiStatus = aiStatus;\n    if (uInfo != null) result.uInfo = uInfo;\n    if (title != null) result.title = title;\n    if (subtitle != null) result.subtitle = subtitle;\n    if (aiLogo != null) result.aiLogo = aiLogo;\n    if (uid != null) result.uid = uid;\n    return result;\n  }\n\n  AiCardInfo._();\n\n  factory AiCardInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AiCardInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AiCardInfo',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'aiUid')\n    ..aInt64(2, _omitFieldNames ? '' : 'aiStatus')\n    ..aOM<UInfo>(3, _omitFieldNames ? '' : 'uInfo', subBuilder: UInfo.create)\n    ..aOS(4, _omitFieldNames ? '' : 'title')\n    ..aOS(5, _omitFieldNames ? '' : 'subtitle')\n    ..aOM<AILogo>(6, _omitFieldNames ? '' : 'aiLogo', subBuilder: AILogo.create)\n    ..aInt64(7, _omitFieldNames ? '' : 'uid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AiCardInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AiCardInfo copyWith(void Function(AiCardInfo) updates) =>\n      super.copyWith((message) => updates(message as AiCardInfo)) as AiCardInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AiCardInfo create() => AiCardInfo._();\n  @$core.override\n  AiCardInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AiCardInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AiCardInfo>(create);\n  static AiCardInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get aiUid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set aiUid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAiUid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAiUid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get aiStatus => $_getI64(1);\n  @$pb.TagNumber(2)\n  set aiStatus($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAiStatus() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAiStatus() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  UInfo get uInfo => $_getN(2);\n  @$pb.TagNumber(3)\n  set uInfo(UInfo value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUInfo() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUInfo() => $_clearField(3);\n  @$pb.TagNumber(3)\n  UInfo ensureUInfo() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.String get title => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set title($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTitle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTitle() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get subtitle => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set subtitle($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasSubtitle() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearSubtitle() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  AILogo get aiLogo => $_getN(5);\n  @$pb.TagNumber(6)\n  set aiLogo(AILogo value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasAiLogo() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearAiLogo() => $_clearField(6);\n  @$pb.TagNumber(6)\n  AILogo ensureAiLogo() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get uid => $_getI64(6);\n  @$pb.TagNumber(7)\n  set uid($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasUid() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearUid() => $_clearField(7);\n}\n\nclass AiEntry extends $pb.GeneratedMessage {\n  factory AiEntry({\n    $core.String? icon,\n    $core.String? title,\n    $core.String? subtitle,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (title != null) result.title = title;\n    if (subtitle != null) result.subtitle = subtitle;\n    return result;\n  }\n\n  AiEntry._();\n\n  factory AiEntry.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AiEntry.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AiEntry',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'subtitle')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AiEntry clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AiEntry copyWith(void Function(AiEntry) updates) =>\n      super.copyWith((message) => updates(message as AiEntry)) as AiEntry;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AiEntry create() => AiEntry._();\n  @$core.override\n  AiEntry createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AiEntry getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<AiEntry>(create);\n  static AiEntry? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get subtitle => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set subtitle($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSubtitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSubtitle() => $_clearField(3);\n}\n\nclass AiInfo extends $pb.GeneratedMessage {\n  factory AiInfo({\n    AiCardInfo? cardInfo,\n    ImInfo? imInfo,\n    AiEntry? aiEntry,\n    Story? story,\n  }) {\n    final result = create();\n    if (cardInfo != null) result.cardInfo = cardInfo;\n    if (imInfo != null) result.imInfo = imInfo;\n    if (aiEntry != null) result.aiEntry = aiEntry;\n    if (story != null) result.story = story;\n    return result;\n  }\n\n  AiInfo._();\n\n  factory AiInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AiInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AiInfo',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aOM<AiCardInfo>(1, _omitFieldNames ? '' : 'cardInfo',\n        subBuilder: AiCardInfo.create)\n    ..aOM<ImInfo>(2, _omitFieldNames ? '' : 'imInfo', subBuilder: ImInfo.create)\n    ..aOM<AiEntry>(3, _omitFieldNames ? '' : 'aiEntry',\n        subBuilder: AiEntry.create)\n    ..aOM<Story>(4, _omitFieldNames ? '' : 'story', subBuilder: Story.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AiInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AiInfo copyWith(void Function(AiInfo) updates) =>\n      super.copyWith((message) => updates(message as AiInfo)) as AiInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AiInfo create() => AiInfo._();\n  @$core.override\n  AiInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AiInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<AiInfo>(create);\n  static AiInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  AiCardInfo get cardInfo => $_getN(0);\n  @$pb.TagNumber(1)\n  set cardInfo(AiCardInfo value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCardInfo() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCardInfo() => $_clearField(1);\n  @$pb.TagNumber(1)\n  AiCardInfo ensureCardInfo() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  ImInfo get imInfo => $_getN(1);\n  @$pb.TagNumber(2)\n  set imInfo(ImInfo value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasImInfo() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearImInfo() => $_clearField(2);\n  @$pb.TagNumber(2)\n  ImInfo ensureImInfo() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  AiEntry get aiEntry => $_getN(2);\n  @$pb.TagNumber(3)\n  set aiEntry(AiEntry value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAiEntry() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAiEntry() => $_clearField(3);\n  @$pb.TagNumber(3)\n  AiEntry ensureAiEntry() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  Story get story => $_getN(3);\n  @$pb.TagNumber(4)\n  set story(Story value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasStory() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearStory() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Story ensureStory() => $_ensure(3);\n}\n\nclass AttestationDisplay extends $pb.GeneratedMessage {\n  factory AttestationDisplay({\n    $core.int? type,\n    CommonInfo? commonInfo,\n    SpliceInfo? spliceInfo,\n    $core.String? icon,\n    $core.String? desc,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (commonInfo != null) result.commonInfo = commonInfo;\n    if (spliceInfo != null) result.spliceInfo = spliceInfo;\n    if (icon != null) result.icon = icon;\n    if (desc != null) result.desc = desc;\n    return result;\n  }\n\n  AttestationDisplay._();\n\n  factory AttestationDisplay.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AttestationDisplay.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AttestationDisplay',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'type')\n    ..aOM<CommonInfo>(2, _omitFieldNames ? '' : 'commonInfo',\n        subBuilder: CommonInfo.create)\n    ..aOM<SpliceInfo>(3, _omitFieldNames ? '' : 'spliceInfo',\n        subBuilder: SpliceInfo.create)\n    ..aOS(4, _omitFieldNames ? '' : 'icon')\n    ..aOS(5, _omitFieldNames ? '' : 'desc')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AttestationDisplay clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AttestationDisplay copyWith(void Function(AttestationDisplay) updates) =>\n      super.copyWith((message) => updates(message as AttestationDisplay))\n          as AttestationDisplay;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AttestationDisplay create() => AttestationDisplay._();\n  @$core.override\n  AttestationDisplay createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AttestationDisplay getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AttestationDisplay>(create);\n  static AttestationDisplay? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get type => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set type($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  CommonInfo get commonInfo => $_getN(1);\n  @$pb.TagNumber(2)\n  set commonInfo(CommonInfo value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCommonInfo() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCommonInfo() => $_clearField(2);\n  @$pb.TagNumber(2)\n  CommonInfo ensureCommonInfo() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  SpliceInfo get spliceInfo => $_getN(2);\n  @$pb.TagNumber(3)\n  set spliceInfo(SpliceInfo value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSpliceInfo() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSpliceInfo() => $_clearField(3);\n  @$pb.TagNumber(3)\n  SpliceInfo ensureSpliceInfo() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.String get icon => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set icon($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIcon() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIcon() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get desc => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set desc($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDesc() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDesc() => $_clearField(5);\n}\n\nclass Card extends $pb.GeneratedMessage {\n  factory Card({\n    $fixnum.Int64? mid,\n    $core.String? name,\n    $core.String? sex,\n    $core.String? face,\n    $core.String? sign,\n    $core.int? rank,\n    $core.int? level,\n    $core.int? silence,\n    VipInfo? vip,\n    PendantInfo? pendant,\n    NameplateInfo? nameplate,\n    OfficialInfo? official,\n    $fixnum.Int64? birthday,\n    $core.int? isFakeAccount,\n    $core.int? isDeleted,\n    $core.int? inRegAudit,\n    $core.int? faceNft,\n    $core.int? faceNftNew,\n    $core.int? isSeniorMember,\n    $core.String? digitalId,\n    $fixnum.Int64? digitalType,\n    AttestationDisplay? attestation,\n    ExpertInfo? expertInfo,\n    UserHonourInfo? honours,\n    $0.NameRender? nameRender,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (name != null) result.name = name;\n    if (sex != null) result.sex = sex;\n    if (face != null) result.face = face;\n    if (sign != null) result.sign = sign;\n    if (rank != null) result.rank = rank;\n    if (level != null) result.level = level;\n    if (silence != null) result.silence = silence;\n    if (vip != null) result.vip = vip;\n    if (pendant != null) result.pendant = pendant;\n    if (nameplate != null) result.nameplate = nameplate;\n    if (official != null) result.official = official;\n    if (birthday != null) result.birthday = birthday;\n    if (isFakeAccount != null) result.isFakeAccount = isFakeAccount;\n    if (isDeleted != null) result.isDeleted = isDeleted;\n    if (inRegAudit != null) result.inRegAudit = inRegAudit;\n    if (faceNft != null) result.faceNft = faceNft;\n    if (faceNftNew != null) result.faceNftNew = faceNftNew;\n    if (isSeniorMember != null) result.isSeniorMember = isSeniorMember;\n    if (digitalId != null) result.digitalId = digitalId;\n    if (digitalType != null) result.digitalType = digitalType;\n    if (attestation != null) result.attestation = attestation;\n    if (expertInfo != null) result.expertInfo = expertInfo;\n    if (honours != null) result.honours = honours;\n    if (nameRender != null) result.nameRender = nameRender;\n    return result;\n  }\n\n  Card._();\n\n  factory Card.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Card.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Card',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'sex')\n    ..aOS(4, _omitFieldNames ? '' : 'face')\n    ..aOS(5, _omitFieldNames ? '' : 'sign')\n    ..aI(6, _omitFieldNames ? '' : 'rank')\n    ..aI(7, _omitFieldNames ? '' : 'level')\n    ..aI(8, _omitFieldNames ? '' : 'silence')\n    ..aOM<VipInfo>(9, _omitFieldNames ? '' : 'vip', subBuilder: VipInfo.create)\n    ..aOM<PendantInfo>(10, _omitFieldNames ? '' : 'pendant',\n        subBuilder: PendantInfo.create)\n    ..aOM<NameplateInfo>(11, _omitFieldNames ? '' : 'nameplate',\n        subBuilder: NameplateInfo.create)\n    ..aOM<OfficialInfo>(12, _omitFieldNames ? '' : 'official',\n        subBuilder: OfficialInfo.create)\n    ..aInt64(13, _omitFieldNames ? '' : 'birthday')\n    ..aI(20, _omitFieldNames ? '' : 'isFakeAccount')\n    ..aI(21, _omitFieldNames ? '' : 'isDeleted')\n    ..aI(22, _omitFieldNames ? '' : 'inRegAudit')\n    ..aI(23, _omitFieldNames ? '' : 'faceNft')\n    ..aI(24, _omitFieldNames ? '' : 'faceNftNew')\n    ..aI(25, _omitFieldNames ? '' : 'isSeniorMember')\n    ..aOS(26, _omitFieldNames ? '' : 'digitalId')\n    ..aInt64(27, _omitFieldNames ? '' : 'digitalType')\n    ..aOM<AttestationDisplay>(28, _omitFieldNames ? '' : 'attestation',\n        subBuilder: AttestationDisplay.create)\n    ..aOM<ExpertInfo>(29, _omitFieldNames ? '' : 'expertInfo',\n        subBuilder: ExpertInfo.create)\n    ..aOM<UserHonourInfo>(30, _omitFieldNames ? '' : 'honours',\n        subBuilder: UserHonourInfo.create)\n    ..aOM<$0.NameRender>(31, _omitFieldNames ? '' : 'nameRender',\n        subBuilder: $0.NameRender.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Card clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Card copyWith(void Function(Card) updates) =>\n      super.copyWith((message) => updates(message as Card)) as Card;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Card create() => Card._();\n  @$core.override\n  Card createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Card getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Card>(create);\n  static Card? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get sex => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set sex($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSex() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSex() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get face => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set face($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFace() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFace() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get sign => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set sign($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasSign() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearSign() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get rank => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set rank($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasRank() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearRank() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get level => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set level($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasLevel() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearLevel() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get silence => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set silence($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasSilence() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearSilence() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  VipInfo get vip => $_getN(8);\n  @$pb.TagNumber(9)\n  set vip(VipInfo value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasVip() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearVip() => $_clearField(9);\n  @$pb.TagNumber(9)\n  VipInfo ensureVip() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  PendantInfo get pendant => $_getN(9);\n  @$pb.TagNumber(10)\n  set pendant(PendantInfo value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasPendant() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearPendant() => $_clearField(10);\n  @$pb.TagNumber(10)\n  PendantInfo ensurePendant() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  NameplateInfo get nameplate => $_getN(10);\n  @$pb.TagNumber(11)\n  set nameplate(NameplateInfo value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasNameplate() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearNameplate() => $_clearField(11);\n  @$pb.TagNumber(11)\n  NameplateInfo ensureNameplate() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  OfficialInfo get official => $_getN(11);\n  @$pb.TagNumber(12)\n  set official(OfficialInfo value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasOfficial() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearOfficial() => $_clearField(12);\n  @$pb.TagNumber(12)\n  OfficialInfo ensureOfficial() => $_ensure(11);\n\n  @$pb.TagNumber(13)\n  $fixnum.Int64 get birthday => $_getI64(12);\n  @$pb.TagNumber(13)\n  set birthday($fixnum.Int64 value) => $_setInt64(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasBirthday() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearBirthday() => $_clearField(13);\n\n  @$pb.TagNumber(20)\n  $core.int get isFakeAccount => $_getIZ(13);\n  @$pb.TagNumber(20)\n  set isFakeAccount($core.int value) => $_setSignedInt32(13, value);\n  @$pb.TagNumber(20)\n  $core.bool hasIsFakeAccount() => $_has(13);\n  @$pb.TagNumber(20)\n  void clearIsFakeAccount() => $_clearField(20);\n\n  @$pb.TagNumber(21)\n  $core.int get isDeleted => $_getIZ(14);\n  @$pb.TagNumber(21)\n  set isDeleted($core.int value) => $_setSignedInt32(14, value);\n  @$pb.TagNumber(21)\n  $core.bool hasIsDeleted() => $_has(14);\n  @$pb.TagNumber(21)\n  void clearIsDeleted() => $_clearField(21);\n\n  @$pb.TagNumber(22)\n  $core.int get inRegAudit => $_getIZ(15);\n  @$pb.TagNumber(22)\n  set inRegAudit($core.int value) => $_setSignedInt32(15, value);\n  @$pb.TagNumber(22)\n  $core.bool hasInRegAudit() => $_has(15);\n  @$pb.TagNumber(22)\n  void clearInRegAudit() => $_clearField(22);\n\n  @$pb.TagNumber(23)\n  $core.int get faceNft => $_getIZ(16);\n  @$pb.TagNumber(23)\n  set faceNft($core.int value) => $_setSignedInt32(16, value);\n  @$pb.TagNumber(23)\n  $core.bool hasFaceNft() => $_has(16);\n  @$pb.TagNumber(23)\n  void clearFaceNft() => $_clearField(23);\n\n  @$pb.TagNumber(24)\n  $core.int get faceNftNew => $_getIZ(17);\n  @$pb.TagNumber(24)\n  set faceNftNew($core.int value) => $_setSignedInt32(17, value);\n  @$pb.TagNumber(24)\n  $core.bool hasFaceNftNew() => $_has(17);\n  @$pb.TagNumber(24)\n  void clearFaceNftNew() => $_clearField(24);\n\n  @$pb.TagNumber(25)\n  $core.int get isSeniorMember => $_getIZ(18);\n  @$pb.TagNumber(25)\n  set isSeniorMember($core.int value) => $_setSignedInt32(18, value);\n  @$pb.TagNumber(25)\n  $core.bool hasIsSeniorMember() => $_has(18);\n  @$pb.TagNumber(25)\n  void clearIsSeniorMember() => $_clearField(25);\n\n  @$pb.TagNumber(26)\n  $core.String get digitalId => $_getSZ(19);\n  @$pb.TagNumber(26)\n  set digitalId($core.String value) => $_setString(19, value);\n  @$pb.TagNumber(26)\n  $core.bool hasDigitalId() => $_has(19);\n  @$pb.TagNumber(26)\n  void clearDigitalId() => $_clearField(26);\n\n  @$pb.TagNumber(27)\n  $fixnum.Int64 get digitalType => $_getI64(20);\n  @$pb.TagNumber(27)\n  set digitalType($fixnum.Int64 value) => $_setInt64(20, value);\n  @$pb.TagNumber(27)\n  $core.bool hasDigitalType() => $_has(20);\n  @$pb.TagNumber(27)\n  void clearDigitalType() => $_clearField(27);\n\n  @$pb.TagNumber(28)\n  AttestationDisplay get attestation => $_getN(21);\n  @$pb.TagNumber(28)\n  set attestation(AttestationDisplay value) => $_setField(28, value);\n  @$pb.TagNumber(28)\n  $core.bool hasAttestation() => $_has(21);\n  @$pb.TagNumber(28)\n  void clearAttestation() => $_clearField(28);\n  @$pb.TagNumber(28)\n  AttestationDisplay ensureAttestation() => $_ensure(21);\n\n  @$pb.TagNumber(29)\n  ExpertInfo get expertInfo => $_getN(22);\n  @$pb.TagNumber(29)\n  set expertInfo(ExpertInfo value) => $_setField(29, value);\n  @$pb.TagNumber(29)\n  $core.bool hasExpertInfo() => $_has(22);\n  @$pb.TagNumber(29)\n  void clearExpertInfo() => $_clearField(29);\n  @$pb.TagNumber(29)\n  ExpertInfo ensureExpertInfo() => $_ensure(22);\n\n  @$pb.TagNumber(30)\n  UserHonourInfo get honours => $_getN(23);\n  @$pb.TagNumber(30)\n  set honours(UserHonourInfo value) => $_setField(30, value);\n  @$pb.TagNumber(30)\n  $core.bool hasHonours() => $_has(23);\n  @$pb.TagNumber(30)\n  void clearHonours() => $_clearField(30);\n  @$pb.TagNumber(30)\n  UserHonourInfo ensureHonours() => $_ensure(23);\n\n  @$pb.TagNumber(31)\n  $0.NameRender get nameRender => $_getN(24);\n  @$pb.TagNumber(31)\n  set nameRender($0.NameRender value) => $_setField(31, value);\n  @$pb.TagNumber(31)\n  $core.bool hasNameRender() => $_has(24);\n  @$pb.TagNumber(31)\n  void clearNameRender() => $_clearField(31);\n  @$pb.TagNumber(31)\n  $0.NameRender ensureNameRender() => $_ensure(24);\n}\n\nclass CommonInfo extends $pb.GeneratedMessage {\n  factory CommonInfo({\n    $core.String? title,\n    $core.String? prefix,\n    $core.String? prefixTitle,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (prefix != null) result.prefix = prefix;\n    if (prefixTitle != null) result.prefixTitle = prefixTitle;\n    return result;\n  }\n\n  CommonInfo._();\n\n  factory CommonInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CommonInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CommonInfo',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'prefix')\n    ..aOS(3, _omitFieldNames ? '' : 'prefixTitle')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CommonInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CommonInfo copyWith(void Function(CommonInfo) updates) =>\n      super.copyWith((message) => updates(message as CommonInfo)) as CommonInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CommonInfo create() => CommonInfo._();\n  @$core.override\n  CommonInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CommonInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CommonInfo>(create);\n  static CommonInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get prefix => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set prefix($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPrefix() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPrefix() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get prefixTitle => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set prefixTitle($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPrefixTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPrefixTitle() => $_clearField(3);\n}\n\nclass ExpertInfo extends $pb.GeneratedMessage {\n  factory ExpertInfo({\n    $core.String? title,\n    $core.int? state,\n    $core.int? type,\n    $core.String? desc,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (state != null) result.state = state;\n    if (type != null) result.type = type;\n    if (desc != null) result.desc = desc;\n    return result;\n  }\n\n  ExpertInfo._();\n\n  factory ExpertInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ExpertInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ExpertInfo',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aI(2, _omitFieldNames ? '' : 'state')\n    ..aI(3, _omitFieldNames ? '' : 'type')\n    ..aOS(4, _omitFieldNames ? '' : 'desc')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExpertInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExpertInfo copyWith(void Function(ExpertInfo) updates) =>\n      super.copyWith((message) => updates(message as ExpertInfo)) as ExpertInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ExpertInfo create() => ExpertInfo._();\n  @$core.override\n  ExpertInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ExpertInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ExpertInfo>(create);\n  static ExpertInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get state => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set state($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasState() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearState() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get type => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set type($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get desc => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set desc($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDesc() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDesc() => $_clearField(4);\n}\n\nclass FriendRelation extends $pb.GeneratedMessage {\n  factory FriendRelation({\n    $fixnum.Int64? uid,\n    $core.String? userName,\n    $core.String? face,\n    $core.int? vipLevel,\n  }) {\n    final result = create();\n    if (uid != null) result.uid = uid;\n    if (userName != null) result.userName = userName;\n    if (face != null) result.face = face;\n    if (vipLevel != null) result.vipLevel = vipLevel;\n    return result;\n  }\n\n  FriendRelation._();\n\n  factory FriendRelation.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FriendRelation.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FriendRelation',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'uid')\n    ..aOS(2, _omitFieldNames ? '' : 'userName')\n    ..aOS(3, _omitFieldNames ? '' : 'face')\n    ..aI(4, _omitFieldNames ? '' : 'vipLevel')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FriendRelation clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FriendRelation copyWith(void Function(FriendRelation) updates) =>\n      super.copyWith((message) => updates(message as FriendRelation))\n          as FriendRelation;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FriendRelation create() => FriendRelation._();\n  @$core.override\n  FriendRelation createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FriendRelation getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FriendRelation>(create);\n  static FriendRelation? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get uid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set uid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get userName => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set userName($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUserName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUserName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get face => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set face($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFace() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFace() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get vipLevel => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set vipLevel($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasVipLevel() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearVipLevel() => $_clearField(4);\n}\n\nclass GptMsgContent extends $pb.GeneratedMessage {\n  factory GptMsgContent({\n    RichTextMsgContent? content,\n    $core.bool? showLike,\n    $core.bool? showChange,\n    $fixnum.Int64? gptSessionId,\n    $core.String? gptBindQuery,\n    $core.String? sessionClosedLine,\n    $core.String? voiceUrl,\n    $fixnum.Int64? subType,\n    $fixnum.Int64? voiceTime,\n  }) {\n    final result = create();\n    if (content != null) result.content = content;\n    if (showLike != null) result.showLike = showLike;\n    if (showChange != null) result.showChange = showChange;\n    if (gptSessionId != null) result.gptSessionId = gptSessionId;\n    if (gptBindQuery != null) result.gptBindQuery = gptBindQuery;\n    if (sessionClosedLine != null) result.sessionClosedLine = sessionClosedLine;\n    if (voiceUrl != null) result.voiceUrl = voiceUrl;\n    if (subType != null) result.subType = subType;\n    if (voiceTime != null) result.voiceTime = voiceTime;\n    return result;\n  }\n\n  GptMsgContent._();\n\n  factory GptMsgContent.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory GptMsgContent.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'GptMsgContent',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aOM<RichTextMsgContent>(1, _omitFieldNames ? '' : 'content',\n        subBuilder: RichTextMsgContent.create)\n    ..aOB(2, _omitFieldNames ? '' : 'showLike')\n    ..aOB(3, _omitFieldNames ? '' : 'showChange')\n    ..aInt64(4, _omitFieldNames ? '' : 'gptSessionId')\n    ..aOS(5, _omitFieldNames ? '' : 'gptBindQuery')\n    ..aOS(6, _omitFieldNames ? '' : 'sessionClosedLine')\n    ..aOS(7, _omitFieldNames ? '' : 'voiceUrl')\n    ..aInt64(8, _omitFieldNames ? '' : 'subType')\n    ..aInt64(9, _omitFieldNames ? '' : 'voiceTime')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GptMsgContent clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GptMsgContent copyWith(void Function(GptMsgContent) updates) =>\n      super.copyWith((message) => updates(message as GptMsgContent))\n          as GptMsgContent;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static GptMsgContent create() => GptMsgContent._();\n  @$core.override\n  GptMsgContent createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static GptMsgContent getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<GptMsgContent>(create);\n  static GptMsgContent? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  RichTextMsgContent get content => $_getN(0);\n  @$pb.TagNumber(1)\n  set content(RichTextMsgContent value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasContent() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearContent() => $_clearField(1);\n  @$pb.TagNumber(1)\n  RichTextMsgContent ensureContent() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.bool get showLike => $_getBF(1);\n  @$pb.TagNumber(2)\n  set showLike($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasShowLike() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearShowLike() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get showChange => $_getBF(2);\n  @$pb.TagNumber(3)\n  set showChange($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasShowChange() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearShowChange() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get gptSessionId => $_getI64(3);\n  @$pb.TagNumber(4)\n  set gptSessionId($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasGptSessionId() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearGptSessionId() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get gptBindQuery => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set gptBindQuery($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasGptBindQuery() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearGptBindQuery() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get sessionClosedLine => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set sessionClosedLine($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasSessionClosedLine() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearSessionClosedLine() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get voiceUrl => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set voiceUrl($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasVoiceUrl() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearVoiceUrl() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get subType => $_getI64(7);\n  @$pb.TagNumber(8)\n  set subType($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasSubType() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearSubType() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get voiceTime => $_getI64(8);\n  @$pb.TagNumber(9)\n  set voiceTime($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasVoiceTime() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearVoiceTime() => $_clearField(9);\n}\n\nclass GptRcmdQuestionBizInfo extends $pb.GeneratedMessage {\n  factory GptRcmdQuestionBizInfo({\n    $core.String? question,\n  }) {\n    final result = create();\n    if (question != null) result.question = question;\n    return result;\n  }\n\n  GptRcmdQuestionBizInfo._();\n\n  factory GptRcmdQuestionBizInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory GptRcmdQuestionBizInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'GptRcmdQuestionBizInfo',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'question')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GptRcmdQuestionBizInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GptRcmdQuestionBizInfo copyWith(\n          void Function(GptRcmdQuestionBizInfo) updates) =>\n      super.copyWith((message) => updates(message as GptRcmdQuestionBizInfo))\n          as GptRcmdQuestionBizInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static GptRcmdQuestionBizInfo create() => GptRcmdQuestionBizInfo._();\n  @$core.override\n  GptRcmdQuestionBizInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static GptRcmdQuestionBizInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<GptRcmdQuestionBizInfo>(create);\n  static GptRcmdQuestionBizInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get question => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set question($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasQuestion() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearQuestion() => $_clearField(1);\n}\n\nclass GroupRelation extends $pb.GeneratedMessage {\n  factory GroupRelation({\n    $fixnum.Int64? groupId,\n    $fixnum.Int64? ownerUid,\n    $core.int? groupType,\n    $core.int? groupLevel,\n    $core.String? groupCover,\n    $core.String? groupName,\n    $core.String? groupNotice,\n    $core.int? status,\n    $core.int? memberRole,\n    $core.String? fansMedalName,\n    $fixnum.Int64? roomId,\n  }) {\n    final result = create();\n    if (groupId != null) result.groupId = groupId;\n    if (ownerUid != null) result.ownerUid = ownerUid;\n    if (groupType != null) result.groupType = groupType;\n    if (groupLevel != null) result.groupLevel = groupLevel;\n    if (groupCover != null) result.groupCover = groupCover;\n    if (groupName != null) result.groupName = groupName;\n    if (groupNotice != null) result.groupNotice = groupNotice;\n    if (status != null) result.status = status;\n    if (memberRole != null) result.memberRole = memberRole;\n    if (fansMedalName != null) result.fansMedalName = fansMedalName;\n    if (roomId != null) result.roomId = roomId;\n    return result;\n  }\n\n  GroupRelation._();\n\n  factory GroupRelation.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory GroupRelation.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'GroupRelation',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'groupId')\n    ..aInt64(2, _omitFieldNames ? '' : 'ownerUid')\n    ..aI(3, _omitFieldNames ? '' : 'groupType')\n    ..aI(4, _omitFieldNames ? '' : 'groupLevel')\n    ..aOS(5, _omitFieldNames ? '' : 'groupCover')\n    ..aOS(6, _omitFieldNames ? '' : 'groupName')\n    ..aOS(7, _omitFieldNames ? '' : 'groupNotice')\n    ..aI(8, _omitFieldNames ? '' : 'status')\n    ..aI(9, _omitFieldNames ? '' : 'memberRole')\n    ..aOS(10, _omitFieldNames ? '' : 'fansMedalName')\n    ..aInt64(11, _omitFieldNames ? '' : 'roomId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GroupRelation clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GroupRelation copyWith(void Function(GroupRelation) updates) =>\n      super.copyWith((message) => updates(message as GroupRelation))\n          as GroupRelation;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static GroupRelation create() => GroupRelation._();\n  @$core.override\n  GroupRelation createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static GroupRelation getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<GroupRelation>(create);\n  static GroupRelation? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get groupId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set groupId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasGroupId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearGroupId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get ownerUid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set ownerUid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOwnerUid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOwnerUid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get groupType => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set groupType($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasGroupType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearGroupType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get groupLevel => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set groupLevel($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasGroupLevel() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearGroupLevel() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get groupCover => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set groupCover($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasGroupCover() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearGroupCover() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get groupName => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set groupName($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasGroupName() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearGroupName() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get groupNotice => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set groupNotice($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasGroupNotice() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearGroupNotice() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get status => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set status($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasStatus() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearStatus() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.int get memberRole => $_getIZ(8);\n  @$pb.TagNumber(9)\n  set memberRole($core.int value) => $_setSignedInt32(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasMemberRole() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearMemberRole() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get fansMedalName => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set fansMedalName($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasFansMedalName() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearFansMedalName() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $fixnum.Int64 get roomId => $_getI64(10);\n  @$pb.TagNumber(11)\n  set roomId($fixnum.Int64 value) => $_setInt64(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasRoomId() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearRoomId() => $_clearField(11);\n}\n\nclass HighText extends $pb.GeneratedMessage {\n  factory HighText({\n    $core.String? title,\n    $core.String? url,\n    $core.int? index,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (url != null) result.url = url;\n    if (index != null) result.index = index;\n    return result;\n  }\n\n  HighText._();\n\n  factory HighText.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory HighText.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'HighText',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'url')\n    ..aI(3, _omitFieldNames ? '' : 'index')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  HighText clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  HighText copyWith(void Function(HighText) updates) =>\n      super.copyWith((message) => updates(message as HighText)) as HighText;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static HighText create() => HighText._();\n  @$core.override\n  HighText createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static HighText getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<HighText>(create);\n  static HighText? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get url => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set url($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUrl() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get index => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set index($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIndex() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIndex() => $_clearField(3);\n}\n\nclass HonourTag extends $pb.GeneratedMessage {\n  factory HonourTag({\n    $core.String? name,\n    $core.String? link,\n    $core.String? webLink,\n    $core.int? type,\n    $core.Iterable<$core.String>? scene,\n    $core.int? priorityLevel,\n    $core.String? icon,\n    $core.int? year,\n  }) {\n    final result = create();\n    if (name != null) result.name = name;\n    if (link != null) result.link = link;\n    if (webLink != null) result.webLink = webLink;\n    if (type != null) result.type = type;\n    if (scene != null) result.scene.addAll(scene);\n    if (priorityLevel != null) result.priorityLevel = priorityLevel;\n    if (icon != null) result.icon = icon;\n    if (year != null) result.year = year;\n    return result;\n  }\n\n  HonourTag._();\n\n  factory HonourTag.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory HonourTag.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'HonourTag',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'name')\n    ..aOS(2, _omitFieldNames ? '' : 'link')\n    ..aOS(3, _omitFieldNames ? '' : 'webLink')\n    ..aI(4, _omitFieldNames ? '' : 'type')\n    ..pPS(5, _omitFieldNames ? '' : 'scene')\n    ..aI(6, _omitFieldNames ? '' : 'priorityLevel')\n    ..aOS(7, _omitFieldNames ? '' : 'icon')\n    ..aI(8, _omitFieldNames ? '' : 'year')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  HonourTag clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  HonourTag copyWith(void Function(HonourTag) updates) =>\n      super.copyWith((message) => updates(message as HonourTag)) as HonourTag;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static HonourTag create() => HonourTag._();\n  @$core.override\n  HonourTag createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static HonourTag getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<HonourTag>(create);\n  static HonourTag? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get name => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set name($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasName() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearName() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get link => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set link($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLink() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLink() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get webLink => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set webLink($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasWebLink() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearWebLink() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get type => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set type($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearType() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $pb.PbList<$core.String> get scene => $_getList(4);\n\n  @$pb.TagNumber(6)\n  $core.int get priorityLevel => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set priorityLevel($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasPriorityLevel() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearPriorityLevel() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get icon => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set icon($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasIcon() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearIcon() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get year => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set year($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasYear() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearYear() => $_clearField(8);\n}\n\nclass ImInfo extends $pb.GeneratedMessage {\n  factory ImInfo({\n    $core.String? backgroundUrl,\n    $core.Iterable<$core.String>? aiPrompt,\n    $core.String? aiLoading,\n    $core.int? aiLoadingMax,\n  }) {\n    final result = create();\n    if (backgroundUrl != null) result.backgroundUrl = backgroundUrl;\n    if (aiPrompt != null) result.aiPrompt.addAll(aiPrompt);\n    if (aiLoading != null) result.aiLoading = aiLoading;\n    if (aiLoadingMax != null) result.aiLoadingMax = aiLoadingMax;\n    return result;\n  }\n\n  ImInfo._();\n\n  factory ImInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ImInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ImInfo',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'backgroundUrl')\n    ..pPS(2, _omitFieldNames ? '' : 'aiPrompt')\n    ..aOS(3, _omitFieldNames ? '' : 'aiLoading')\n    ..aI(4, _omitFieldNames ? '' : 'aiLoadingMax')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ImInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ImInfo copyWith(void Function(ImInfo) updates) =>\n      super.copyWith((message) => updates(message as ImInfo)) as ImInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ImInfo create() => ImInfo._();\n  @$core.override\n  ImInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ImInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ImInfo>(create);\n  static ImInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get backgroundUrl => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set backgroundUrl($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBackgroundUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBackgroundUrl() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<$core.String> get aiPrompt => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $core.String get aiLoading => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set aiLoading($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAiLoading() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAiLoading() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get aiLoadingMax => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set aiLoadingMax($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasAiLoadingMax() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearAiLoadingMax() => $_clearField(4);\n}\n\nclass ImgInfo extends $pb.GeneratedMessage {\n  factory ImgInfo({\n    $core.String? url,\n    $core.int? width,\n    $core.int? height,\n    $core.String? imageType,\n  }) {\n    final result = create();\n    if (url != null) result.url = url;\n    if (width != null) result.width = width;\n    if (height != null) result.height = height;\n    if (imageType != null) result.imageType = imageType;\n    return result;\n  }\n\n  ImgInfo._();\n\n  factory ImgInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ImgInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ImgInfo',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'url')\n    ..aI(2, _omitFieldNames ? '' : 'width')\n    ..aI(3, _omitFieldNames ? '' : 'height')\n    ..aOS(4, _omitFieldNames ? '' : 'imageType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ImgInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ImgInfo copyWith(void Function(ImgInfo) updates) =>\n      super.copyWith((message) => updates(message as ImgInfo)) as ImgInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ImgInfo create() => ImgInfo._();\n  @$core.override\n  ImgInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ImgInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ImgInfo>(create);\n  static ImgInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get url => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set url($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUrl() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get width => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set width($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasWidth() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearWidth() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get height => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set height($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasHeight() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearHeight() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get imageType => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set imageType($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasImageType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearImageType() => $_clearField(4);\n}\n\nclass KeyHitInfos extends $pb.GeneratedMessage {\n  factory KeyHitInfos({\n    $core.String? toast,\n    $core.int? ruleId,\n    $core.Iterable<HighText>? highText,\n  }) {\n    final result = create();\n    if (toast != null) result.toast = toast;\n    if (ruleId != null) result.ruleId = ruleId;\n    if (highText != null) result.highText.addAll(highText);\n    return result;\n  }\n\n  KeyHitInfos._();\n\n  factory KeyHitInfos.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory KeyHitInfos.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'KeyHitInfos',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'toast')\n    ..aI(2, _omitFieldNames ? '' : 'ruleId')\n    ..pPM<HighText>(3, _omitFieldNames ? '' : 'highText',\n        subBuilder: HighText.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  KeyHitInfos clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  KeyHitInfos copyWith(void Function(KeyHitInfos) updates) =>\n      super.copyWith((message) => updates(message as KeyHitInfos))\n          as KeyHitInfos;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static KeyHitInfos create() => KeyHitInfos._();\n  @$core.override\n  KeyHitInfos createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static KeyHitInfos getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<KeyHitInfos>(create);\n  static KeyHitInfos? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get toast => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set toast($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasToast() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearToast() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get ruleId => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set ruleId($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasRuleId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRuleId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<HighText> get highText => $_getList(2);\n}\n\nclass Medal extends $pb.GeneratedMessage {\n  factory Medal({\n    $fixnum.Int64? uid,\n    $core.int? medalId,\n    $core.int? level,\n    $core.String? medalName,\n    $core.int? score,\n    $core.int? intimacy,\n    $core.int? masterStatus,\n    $core.int? isReceive,\n    $fixnum.Int64? medalColorStart,\n    $fixnum.Int64? medalColorEnd,\n    $fixnum.Int64? medalColorBorder,\n    $fixnum.Int64? medalColorName,\n    $fixnum.Int64? medalColorLevel,\n    $fixnum.Int64? guardLevel,\n  }) {\n    final result = create();\n    if (uid != null) result.uid = uid;\n    if (medalId != null) result.medalId = medalId;\n    if (level != null) result.level = level;\n    if (medalName != null) result.medalName = medalName;\n    if (score != null) result.score = score;\n    if (intimacy != null) result.intimacy = intimacy;\n    if (masterStatus != null) result.masterStatus = masterStatus;\n    if (isReceive != null) result.isReceive = isReceive;\n    if (medalColorStart != null) result.medalColorStart = medalColorStart;\n    if (medalColorEnd != null) result.medalColorEnd = medalColorEnd;\n    if (medalColorBorder != null) result.medalColorBorder = medalColorBorder;\n    if (medalColorName != null) result.medalColorName = medalColorName;\n    if (medalColorLevel != null) result.medalColorLevel = medalColorLevel;\n    if (guardLevel != null) result.guardLevel = guardLevel;\n    return result;\n  }\n\n  Medal._();\n\n  factory Medal.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Medal.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Medal',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'uid')\n    ..aI(2, _omitFieldNames ? '' : 'medalId')\n    ..aI(3, _omitFieldNames ? '' : 'level')\n    ..aOS(4, _omitFieldNames ? '' : 'medalName')\n    ..aI(5, _omitFieldNames ? '' : 'score')\n    ..aI(6, _omitFieldNames ? '' : 'intimacy')\n    ..aI(7, _omitFieldNames ? '' : 'masterStatus')\n    ..aI(8, _omitFieldNames ? '' : 'isReceive')\n    ..aInt64(9, _omitFieldNames ? '' : 'medalColorStart')\n    ..aInt64(10, _omitFieldNames ? '' : 'medalColorEnd')\n    ..aInt64(11, _omitFieldNames ? '' : 'medalColorBorder')\n    ..aInt64(12, _omitFieldNames ? '' : 'medalColorName')\n    ..aInt64(13, _omitFieldNames ? '' : 'medalColorLevel')\n    ..aInt64(14, _omitFieldNames ? '' : 'guardLevel')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Medal clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Medal copyWith(void Function(Medal) updates) =>\n      super.copyWith((message) => updates(message as Medal)) as Medal;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Medal create() => Medal._();\n  @$core.override\n  Medal createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Medal getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Medal>(create);\n  static Medal? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get uid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set uid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get medalId => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set medalId($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMedalId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMedalId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get level => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set level($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLevel() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLevel() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get medalName => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set medalName($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasMedalName() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearMedalName() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get score => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set score($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasScore() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearScore() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get intimacy => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set intimacy($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasIntimacy() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearIntimacy() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get masterStatus => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set masterStatus($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasMasterStatus() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearMasterStatus() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get isReceive => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set isReceive($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasIsReceive() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearIsReceive() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get medalColorStart => $_getI64(8);\n  @$pb.TagNumber(9)\n  set medalColorStart($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasMedalColorStart() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearMedalColorStart() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $fixnum.Int64 get medalColorEnd => $_getI64(9);\n  @$pb.TagNumber(10)\n  set medalColorEnd($fixnum.Int64 value) => $_setInt64(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasMedalColorEnd() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearMedalColorEnd() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $fixnum.Int64 get medalColorBorder => $_getI64(10);\n  @$pb.TagNumber(11)\n  set medalColorBorder($fixnum.Int64 value) => $_setInt64(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasMedalColorBorder() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearMedalColorBorder() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $fixnum.Int64 get medalColorName => $_getI64(11);\n  @$pb.TagNumber(12)\n  set medalColorName($fixnum.Int64 value) => $_setInt64(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasMedalColorName() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearMedalColorName() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $fixnum.Int64 get medalColorLevel => $_getI64(12);\n  @$pb.TagNumber(13)\n  set medalColorLevel($fixnum.Int64 value) => $_setInt64(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasMedalColorLevel() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearMedalColorLevel() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $fixnum.Int64 get guardLevel => $_getI64(13);\n  @$pb.TagNumber(14)\n  set guardLevel($fixnum.Int64 value) => $_setInt64(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasGuardLevel() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearGuardLevel() => $_clearField(14);\n}\n\nclass Msg extends $pb.GeneratedMessage {\n  factory Msg({\n    $fixnum.Int64? senderUid,\n    $core.int? receiverType,\n    $fixnum.Int64? receiverId,\n    $fixnum.Int64? cliMsgId,\n    $core.int? msgType,\n    $core.String? content,\n    $fixnum.Int64? msgSeqno,\n    $fixnum.Int64? timestamp,\n    $core.Iterable<$fixnum.Int64>? atUids,\n    $core.Iterable<$fixnum.Int64>? recverIds,\n    $fixnum.Int64? msgKey,\n    $core.int? msgStatus,\n    $core.bool? sysCancel,\n    $core.String? notifyCode,\n    $core.int? msgSource,\n    $core.int? newFaceVersion,\n    KeyHitInfos? keyHitInfos,\n    AccountInfo? accountInfo,\n    GptMsgContent? gptMsgContent,\n    $core.String? canalToken,\n  }) {\n    final result = create();\n    if (senderUid != null) result.senderUid = senderUid;\n    if (receiverType != null) result.receiverType = receiverType;\n    if (receiverId != null) result.receiverId = receiverId;\n    if (cliMsgId != null) result.cliMsgId = cliMsgId;\n    if (msgType != null) result.msgType = msgType;\n    if (content != null) result.content = content;\n    if (msgSeqno != null) result.msgSeqno = msgSeqno;\n    if (timestamp != null) result.timestamp = timestamp;\n    if (atUids != null) result.atUids.addAll(atUids);\n    if (recverIds != null) result.recverIds.addAll(recverIds);\n    if (msgKey != null) result.msgKey = msgKey;\n    if (msgStatus != null) result.msgStatus = msgStatus;\n    if (sysCancel != null) result.sysCancel = sysCancel;\n    if (notifyCode != null) result.notifyCode = notifyCode;\n    if (msgSource != null) result.msgSource = msgSource;\n    if (newFaceVersion != null) result.newFaceVersion = newFaceVersion;\n    if (keyHitInfos != null) result.keyHitInfos = keyHitInfos;\n    if (accountInfo != null) result.accountInfo = accountInfo;\n    if (gptMsgContent != null) result.gptMsgContent = gptMsgContent;\n    if (canalToken != null) result.canalToken = canalToken;\n    return result;\n  }\n\n  Msg._();\n\n  factory Msg.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Msg.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Msg',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'senderUid')\n    ..aI(2, _omitFieldNames ? '' : 'receiverType')\n    ..aInt64(3, _omitFieldNames ? '' : 'receiverId')\n    ..aInt64(4, _omitFieldNames ? '' : 'cliMsgId')\n    ..aI(5, _omitFieldNames ? '' : 'msgType')\n    ..aOS(6, _omitFieldNames ? '' : 'content')\n    ..aInt64(7, _omitFieldNames ? '' : 'msgSeqno')\n    ..aInt64(8, _omitFieldNames ? '' : 'timestamp')\n    ..p<$fixnum.Int64>(9, _omitFieldNames ? '' : 'atUids', $pb.PbFieldType.K6)\n    ..p<$fixnum.Int64>(\n        10, _omitFieldNames ? '' : 'recverIds', $pb.PbFieldType.K6)\n    ..aInt64(11, _omitFieldNames ? '' : 'msgKey')\n    ..aI(12, _omitFieldNames ? '' : 'msgStatus')\n    ..aOB(13, _omitFieldNames ? '' : 'sysCancel')\n    ..aOS(14, _omitFieldNames ? '' : 'notifyCode')\n    ..aI(15, _omitFieldNames ? '' : 'msgSource')\n    ..aI(16, _omitFieldNames ? '' : 'newFaceVersion')\n    ..aOM<KeyHitInfos>(17, _omitFieldNames ? '' : 'keyHitInfos',\n        subBuilder: KeyHitInfos.create)\n    ..aOM<AccountInfo>(18, _omitFieldNames ? '' : 'accountInfo',\n        subBuilder: AccountInfo.create)\n    ..aOM<GptMsgContent>(19, _omitFieldNames ? '' : 'gptMsgContent',\n        subBuilder: GptMsgContent.create)\n    ..aOS(20, _omitFieldNames ? '' : 'canalToken')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Msg clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Msg copyWith(void Function(Msg) updates) =>\n      super.copyWith((message) => updates(message as Msg)) as Msg;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Msg create() => Msg._();\n  @$core.override\n  Msg createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Msg getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Msg>(create);\n  static Msg? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get senderUid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set senderUid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSenderUid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSenderUid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get receiverType => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set receiverType($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasReceiverType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearReceiverType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get receiverId => $_getI64(2);\n  @$pb.TagNumber(3)\n  set receiverId($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasReceiverId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearReceiverId() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get cliMsgId => $_getI64(3);\n  @$pb.TagNumber(4)\n  set cliMsgId($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCliMsgId() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCliMsgId() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get msgType => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set msgType($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasMsgType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearMsgType() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get content => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set content($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasContent() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearContent() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get msgSeqno => $_getI64(6);\n  @$pb.TagNumber(7)\n  set msgSeqno($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasMsgSeqno() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearMsgSeqno() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get timestamp => $_getI64(7);\n  @$pb.TagNumber(8)\n  set timestamp($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasTimestamp() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearTimestamp() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $pb.PbList<$fixnum.Int64> get atUids => $_getList(8);\n\n  @$pb.TagNumber(10)\n  $pb.PbList<$fixnum.Int64> get recverIds => $_getList(9);\n\n  @$pb.TagNumber(11)\n  $fixnum.Int64 get msgKey => $_getI64(10);\n  @$pb.TagNumber(11)\n  set msgKey($fixnum.Int64 value) => $_setInt64(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasMsgKey() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearMsgKey() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.int get msgStatus => $_getIZ(11);\n  @$pb.TagNumber(12)\n  set msgStatus($core.int value) => $_setSignedInt32(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasMsgStatus() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearMsgStatus() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.bool get sysCancel => $_getBF(12);\n  @$pb.TagNumber(13)\n  set sysCancel($core.bool value) => $_setBool(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasSysCancel() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearSysCancel() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.String get notifyCode => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set notifyCode($core.String value) => $_setString(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasNotifyCode() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearNotifyCode() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $core.int get msgSource => $_getIZ(14);\n  @$pb.TagNumber(15)\n  set msgSource($core.int value) => $_setSignedInt32(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasMsgSource() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearMsgSource() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $core.int get newFaceVersion => $_getIZ(15);\n  @$pb.TagNumber(16)\n  set newFaceVersion($core.int value) => $_setSignedInt32(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasNewFaceVersion() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearNewFaceVersion() => $_clearField(16);\n\n  @$pb.TagNumber(17)\n  KeyHitInfos get keyHitInfos => $_getN(16);\n  @$pb.TagNumber(17)\n  set keyHitInfos(KeyHitInfos value) => $_setField(17, value);\n  @$pb.TagNumber(17)\n  $core.bool hasKeyHitInfos() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearKeyHitInfos() => $_clearField(17);\n  @$pb.TagNumber(17)\n  KeyHitInfos ensureKeyHitInfos() => $_ensure(16);\n\n  @$pb.TagNumber(18)\n  AccountInfo get accountInfo => $_getN(17);\n  @$pb.TagNumber(18)\n  set accountInfo(AccountInfo value) => $_setField(18, value);\n  @$pb.TagNumber(18)\n  $core.bool hasAccountInfo() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearAccountInfo() => $_clearField(18);\n  @$pb.TagNumber(18)\n  AccountInfo ensureAccountInfo() => $_ensure(17);\n\n  @$pb.TagNumber(19)\n  GptMsgContent get gptMsgContent => $_getN(18);\n  @$pb.TagNumber(19)\n  set gptMsgContent(GptMsgContent value) => $_setField(19, value);\n  @$pb.TagNumber(19)\n  $core.bool hasGptMsgContent() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearGptMsgContent() => $_clearField(19);\n  @$pb.TagNumber(19)\n  GptMsgContent ensureGptMsgContent() => $_ensure(18);\n\n  @$pb.TagNumber(20)\n  $core.String get canalToken => $_getSZ(19);\n  @$pb.TagNumber(20)\n  set canalToken($core.String value) => $_setString(19, value);\n  @$pb.TagNumber(20)\n  $core.bool hasCanalToken() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearCanalToken() => $_clearField(20);\n}\n\nclass NameplateInfo extends $pb.GeneratedMessage {\n  factory NameplateInfo({\n    $core.int? nid,\n    $core.String? name,\n    $core.String? image,\n    $core.String? imageSmall,\n    $core.String? level,\n    $core.String? condition,\n  }) {\n    final result = create();\n    if (nid != null) result.nid = nid;\n    if (name != null) result.name = name;\n    if (image != null) result.image = image;\n    if (imageSmall != null) result.imageSmall = imageSmall;\n    if (level != null) result.level = level;\n    if (condition != null) result.condition = condition;\n    return result;\n  }\n\n  NameplateInfo._();\n\n  factory NameplateInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory NameplateInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'NameplateInfo',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'nid')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'image')\n    ..aOS(4, _omitFieldNames ? '' : 'imageSmall')\n    ..aOS(5, _omitFieldNames ? '' : 'level')\n    ..aOS(6, _omitFieldNames ? '' : 'condition')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NameplateInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NameplateInfo copyWith(void Function(NameplateInfo) updates) =>\n      super.copyWith((message) => updates(message as NameplateInfo))\n          as NameplateInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static NameplateInfo create() => NameplateInfo._();\n  @$core.override\n  NameplateInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static NameplateInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<NameplateInfo>(create);\n  static NameplateInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get nid => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set nid($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasNid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearNid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get image => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set image($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasImage() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearImage() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get imageSmall => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set imageSmall($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasImageSmall() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearImageSmall() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get level => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set level($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasLevel() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearLevel() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get condition => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set condition($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCondition() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCondition() => $_clearField(6);\n}\n\nclass OfficialInfo extends $pb.GeneratedMessage {\n  factory OfficialInfo({\n    $core.int? role,\n    $core.String? title,\n    $core.String? desc,\n    $core.int? type,\n  }) {\n    final result = create();\n    if (role != null) result.role = role;\n    if (title != null) result.title = title;\n    if (desc != null) result.desc = desc;\n    if (type != null) result.type = type;\n    return result;\n  }\n\n  OfficialInfo._();\n\n  factory OfficialInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OfficialInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OfficialInfo',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'role')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'desc')\n    ..aI(4, _omitFieldNames ? '' : 'type')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OfficialInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OfficialInfo copyWith(void Function(OfficialInfo) updates) =>\n      super.copyWith((message) => updates(message as OfficialInfo))\n          as OfficialInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OfficialInfo create() => OfficialInfo._();\n  @$core.override\n  OfficialInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OfficialInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OfficialInfo>(create);\n  static OfficialInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get role => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set role($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasRole() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRole() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get desc => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set desc($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDesc() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDesc() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get type => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set type($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearType() => $_clearField(4);\n}\n\nclass PendantInfo extends $pb.GeneratedMessage {\n  factory PendantInfo({\n    $core.int? pid,\n    $core.String? name,\n    $core.String? image,\n    $fixnum.Int64? expire,\n    $core.String? imageEnhance,\n    $core.String? imageEnhanceFrame,\n  }) {\n    final result = create();\n    if (pid != null) result.pid = pid;\n    if (name != null) result.name = name;\n    if (image != null) result.image = image;\n    if (expire != null) result.expire = expire;\n    if (imageEnhance != null) result.imageEnhance = imageEnhance;\n    if (imageEnhanceFrame != null) result.imageEnhanceFrame = imageEnhanceFrame;\n    return result;\n  }\n\n  PendantInfo._();\n\n  factory PendantInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PendantInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PendantInfo',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'pid')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'image')\n    ..aInt64(4, _omitFieldNames ? '' : 'expire')\n    ..aOS(5, _omitFieldNames ? '' : 'imageEnhance')\n    ..aOS(6, _omitFieldNames ? '' : 'imageEnhanceFrame')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PendantInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PendantInfo copyWith(void Function(PendantInfo) updates) =>\n      super.copyWith((message) => updates(message as PendantInfo))\n          as PendantInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PendantInfo create() => PendantInfo._();\n  @$core.override\n  PendantInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PendantInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PendantInfo>(create);\n  static PendantInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get pid => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set pid($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get image => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set image($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasImage() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearImage() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get expire => $_getI64(3);\n  @$pb.TagNumber(4)\n  set expire($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasExpire() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearExpire() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get imageEnhance => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set imageEnhance($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasImageEnhance() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearImageEnhance() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get imageEnhanceFrame => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set imageEnhanceFrame($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasImageEnhanceFrame() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearImageEnhanceFrame() => $_clearField(6);\n}\n\nclass Prompt extends $pb.GeneratedMessage {\n  factory Prompt({\n    $core.String? msg,\n  }) {\n    final result = create();\n    if (msg != null) result.msg = msg;\n    return result;\n  }\n\n  Prompt._();\n\n  factory Prompt.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Prompt.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Prompt',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'msg')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Prompt clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Prompt copyWith(void Function(Prompt) updates) =>\n      super.copyWith((message) => updates(message as Prompt)) as Prompt;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Prompt create() => Prompt._();\n  @$core.override\n  Prompt createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Prompt getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Prompt>(create);\n  static Prompt? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get msg => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set msg($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMsg() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMsg() => $_clearField(1);\n}\n\nclass RelationLog extends $pb.GeneratedMessage {\n  factory RelationLog({\n    $core.int? logType,\n    $fixnum.Int64? oplogSeqno,\n    FriendRelation? friendRelation,\n    GroupRelation? groupRelation,\n  }) {\n    final result = create();\n    if (logType != null) result.logType = logType;\n    if (oplogSeqno != null) result.oplogSeqno = oplogSeqno;\n    if (friendRelation != null) result.friendRelation = friendRelation;\n    if (groupRelation != null) result.groupRelation = groupRelation;\n    return result;\n  }\n\n  RelationLog._();\n\n  factory RelationLog.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RelationLog.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RelationLog',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'logType')\n    ..aInt64(2, _omitFieldNames ? '' : 'oplogSeqno')\n    ..aOM<FriendRelation>(3, _omitFieldNames ? '' : 'friendRelation',\n        subBuilder: FriendRelation.create)\n    ..aOM<GroupRelation>(4, _omitFieldNames ? '' : 'groupRelation',\n        subBuilder: GroupRelation.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelationLog clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RelationLog copyWith(void Function(RelationLog) updates) =>\n      super.copyWith((message) => updates(message as RelationLog))\n          as RelationLog;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RelationLog create() => RelationLog._();\n  @$core.override\n  RelationLog createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RelationLog getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RelationLog>(create);\n  static RelationLog? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get logType => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set logType($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLogType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLogType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get oplogSeqno => $_getI64(1);\n  @$pb.TagNumber(2)\n  set oplogSeqno($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOplogSeqno() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOplogSeqno() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  FriendRelation get friendRelation => $_getN(2);\n  @$pb.TagNumber(3)\n  set friendRelation(FriendRelation value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFriendRelation() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFriendRelation() => $_clearField(3);\n  @$pb.TagNumber(3)\n  FriendRelation ensureFriendRelation() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  GroupRelation get groupRelation => $_getN(3);\n  @$pb.TagNumber(4)\n  set groupRelation(GroupRelation value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasGroupRelation() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearGroupRelation() => $_clearField(4);\n  @$pb.TagNumber(4)\n  GroupRelation ensureGroupRelation() => $_ensure(3);\n}\n\nclass RichTextMsgContent extends $pb.GeneratedMessage {\n  factory RichTextMsgContent({\n    $core.Iterable<$1.Paragraph>? paragraphs,\n  }) {\n    final result = create();\n    if (paragraphs != null) result.paragraphs.addAll(paragraphs);\n    return result;\n  }\n\n  RichTextMsgContent._();\n\n  factory RichTextMsgContent.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RichTextMsgContent.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RichTextMsgContent',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..pPM<$1.Paragraph>(1, _omitFieldNames ? '' : 'paragraphs',\n        subBuilder: $1.Paragraph.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RichTextMsgContent clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RichTextMsgContent copyWith(void Function(RichTextMsgContent) updates) =>\n      super.copyWith((message) => updates(message as RichTextMsgContent))\n          as RichTextMsgContent;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RichTextMsgContent create() => RichTextMsgContent._();\n  @$core.override\n  RichTextMsgContent createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RichTextMsgContent getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RichTextMsgContent>(create);\n  static RichTextMsgContent? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<$1.Paragraph> get paragraphs => $_getList(0);\n}\n\nclass SessionInfo extends $pb.GeneratedMessage {\n  factory SessionInfo({\n    $fixnum.Int64? talkerId,\n    $core.int? sessionType,\n    $fixnum.Int64? atSeqno,\n    $fixnum.Int64? topTs,\n    $core.String? groupName,\n    $core.String? groupCover,\n    $core.int? isFollow,\n    $core.int? isDnd,\n    $fixnum.Int64? ackSeqno,\n    $fixnum.Int64? ackTs,\n    $fixnum.Int64? sessionTs,\n    $core.int? unreadCount,\n    Msg? lastMsg,\n    $core.int? groupType,\n    $core.int? canFold,\n    $core.int? status,\n    $fixnum.Int64? maxSeqno,\n    $core.int? newPushMsg,\n    $core.int? setting,\n    $core.int? isGuardian,\n    $core.int? isIntercept,\n    $core.int? isTrust,\n    $core.int? systemMsgType,\n    AccountInfo? accountInfo,\n    $core.int? liveStatus,\n    $core.int? bizMsgUnreadCount,\n    UserLabel? userLabel,\n    $core.int? isHuahuo,\n    UInfo? uInfo,\n    $core.int? stranger,\n    AiInfo? aiInfo,\n    $core.bool? isHideEdit,\n    SessionInfoExt? ext,\n  }) {\n    final result = create();\n    if (talkerId != null) result.talkerId = talkerId;\n    if (sessionType != null) result.sessionType = sessionType;\n    if (atSeqno != null) result.atSeqno = atSeqno;\n    if (topTs != null) result.topTs = topTs;\n    if (groupName != null) result.groupName = groupName;\n    if (groupCover != null) result.groupCover = groupCover;\n    if (isFollow != null) result.isFollow = isFollow;\n    if (isDnd != null) result.isDnd = isDnd;\n    if (ackSeqno != null) result.ackSeqno = ackSeqno;\n    if (ackTs != null) result.ackTs = ackTs;\n    if (sessionTs != null) result.sessionTs = sessionTs;\n    if (unreadCount != null) result.unreadCount = unreadCount;\n    if (lastMsg != null) result.lastMsg = lastMsg;\n    if (groupType != null) result.groupType = groupType;\n    if (canFold != null) result.canFold = canFold;\n    if (status != null) result.status = status;\n    if (maxSeqno != null) result.maxSeqno = maxSeqno;\n    if (newPushMsg != null) result.newPushMsg = newPushMsg;\n    if (setting != null) result.setting = setting;\n    if (isGuardian != null) result.isGuardian = isGuardian;\n    if (isIntercept != null) result.isIntercept = isIntercept;\n    if (isTrust != null) result.isTrust = isTrust;\n    if (systemMsgType != null) result.systemMsgType = systemMsgType;\n    if (accountInfo != null) result.accountInfo = accountInfo;\n    if (liveStatus != null) result.liveStatus = liveStatus;\n    if (bizMsgUnreadCount != null) result.bizMsgUnreadCount = bizMsgUnreadCount;\n    if (userLabel != null) result.userLabel = userLabel;\n    if (isHuahuo != null) result.isHuahuo = isHuahuo;\n    if (uInfo != null) result.uInfo = uInfo;\n    if (stranger != null) result.stranger = stranger;\n    if (aiInfo != null) result.aiInfo = aiInfo;\n    if (isHideEdit != null) result.isHideEdit = isHideEdit;\n    if (ext != null) result.ext = ext;\n    return result;\n  }\n\n  SessionInfo._();\n\n  factory SessionInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SessionInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SessionInfo',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'talkerId')\n    ..aI(2, _omitFieldNames ? '' : 'sessionType')\n    ..aInt64(3, _omitFieldNames ? '' : 'atSeqno')\n    ..aInt64(4, _omitFieldNames ? '' : 'topTs')\n    ..aOS(5, _omitFieldNames ? '' : 'groupName')\n    ..aOS(6, _omitFieldNames ? '' : 'groupCover')\n    ..aI(7, _omitFieldNames ? '' : 'isFollow')\n    ..aI(8, _omitFieldNames ? '' : 'isDnd')\n    ..aInt64(9, _omitFieldNames ? '' : 'ackSeqno')\n    ..aInt64(10, _omitFieldNames ? '' : 'ackTs')\n    ..aInt64(11, _omitFieldNames ? '' : 'sessionTs')\n    ..aI(12, _omitFieldNames ? '' : 'unreadCount')\n    ..aOM<Msg>(13, _omitFieldNames ? '' : 'lastMsg', subBuilder: Msg.create)\n    ..aI(14, _omitFieldNames ? '' : 'groupType')\n    ..aI(15, _omitFieldNames ? '' : 'canFold')\n    ..aI(16, _omitFieldNames ? '' : 'status')\n    ..aInt64(17, _omitFieldNames ? '' : 'maxSeqno')\n    ..aI(18, _omitFieldNames ? '' : 'newPushMsg')\n    ..aI(19, _omitFieldNames ? '' : 'setting')\n    ..aI(20, _omitFieldNames ? '' : 'isGuardian')\n    ..aI(21, _omitFieldNames ? '' : 'isIntercept')\n    ..aI(22, _omitFieldNames ? '' : 'isTrust')\n    ..aI(23, _omitFieldNames ? '' : 'systemMsgType')\n    ..aOM<AccountInfo>(24, _omitFieldNames ? '' : 'accountInfo',\n        subBuilder: AccountInfo.create)\n    ..aI(25, _omitFieldNames ? '' : 'liveStatus')\n    ..aI(26, _omitFieldNames ? '' : 'bizMsgUnreadCount')\n    ..aOM<UserLabel>(27, _omitFieldNames ? '' : 'userLabel',\n        subBuilder: UserLabel.create)\n    ..aI(28, _omitFieldNames ? '' : 'isHuahuo')\n    ..aOM<UInfo>(29, _omitFieldNames ? '' : 'uInfo', subBuilder: UInfo.create)\n    ..aI(30, _omitFieldNames ? '' : 'stranger')\n    ..aOM<AiInfo>(31, _omitFieldNames ? '' : 'aiInfo',\n        subBuilder: AiInfo.create)\n    ..aOB(32, _omitFieldNames ? '' : 'isHideEdit')\n    ..aOM<SessionInfoExt>(33, _omitFieldNames ? '' : 'ext',\n        subBuilder: SessionInfoExt.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionInfo copyWith(void Function(SessionInfo) updates) =>\n      super.copyWith((message) => updates(message as SessionInfo))\n          as SessionInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SessionInfo create() => SessionInfo._();\n  @$core.override\n  SessionInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SessionInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SessionInfo>(create);\n  static SessionInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get talkerId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set talkerId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTalkerId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTalkerId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get sessionType => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set sessionType($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSessionType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSessionType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get atSeqno => $_getI64(2);\n  @$pb.TagNumber(3)\n  set atSeqno($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAtSeqno() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAtSeqno() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get topTs => $_getI64(3);\n  @$pb.TagNumber(4)\n  set topTs($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTopTs() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTopTs() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get groupName => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set groupName($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasGroupName() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearGroupName() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get groupCover => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set groupCover($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasGroupCover() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearGroupCover() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get isFollow => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set isFollow($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasIsFollow() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearIsFollow() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get isDnd => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set isDnd($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasIsDnd() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearIsDnd() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get ackSeqno => $_getI64(8);\n  @$pb.TagNumber(9)\n  set ackSeqno($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasAckSeqno() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearAckSeqno() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $fixnum.Int64 get ackTs => $_getI64(9);\n  @$pb.TagNumber(10)\n  set ackTs($fixnum.Int64 value) => $_setInt64(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasAckTs() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearAckTs() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $fixnum.Int64 get sessionTs => $_getI64(10);\n  @$pb.TagNumber(11)\n  set sessionTs($fixnum.Int64 value) => $_setInt64(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasSessionTs() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearSessionTs() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.int get unreadCount => $_getIZ(11);\n  @$pb.TagNumber(12)\n  set unreadCount($core.int value) => $_setSignedInt32(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasUnreadCount() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearUnreadCount() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  Msg get lastMsg => $_getN(12);\n  @$pb.TagNumber(13)\n  set lastMsg(Msg value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasLastMsg() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearLastMsg() => $_clearField(13);\n  @$pb.TagNumber(13)\n  Msg ensureLastMsg() => $_ensure(12);\n\n  @$pb.TagNumber(14)\n  $core.int get groupType => $_getIZ(13);\n  @$pb.TagNumber(14)\n  set groupType($core.int value) => $_setSignedInt32(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasGroupType() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearGroupType() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $core.int get canFold => $_getIZ(14);\n  @$pb.TagNumber(15)\n  set canFold($core.int value) => $_setSignedInt32(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasCanFold() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearCanFold() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $core.int get status => $_getIZ(15);\n  @$pb.TagNumber(16)\n  set status($core.int value) => $_setSignedInt32(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasStatus() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearStatus() => $_clearField(16);\n\n  @$pb.TagNumber(17)\n  $fixnum.Int64 get maxSeqno => $_getI64(16);\n  @$pb.TagNumber(17)\n  set maxSeqno($fixnum.Int64 value) => $_setInt64(16, value);\n  @$pb.TagNumber(17)\n  $core.bool hasMaxSeqno() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearMaxSeqno() => $_clearField(17);\n\n  @$pb.TagNumber(18)\n  $core.int get newPushMsg => $_getIZ(17);\n  @$pb.TagNumber(18)\n  set newPushMsg($core.int value) => $_setSignedInt32(17, value);\n  @$pb.TagNumber(18)\n  $core.bool hasNewPushMsg() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearNewPushMsg() => $_clearField(18);\n\n  @$pb.TagNumber(19)\n  $core.int get setting => $_getIZ(18);\n  @$pb.TagNumber(19)\n  set setting($core.int value) => $_setSignedInt32(18, value);\n  @$pb.TagNumber(19)\n  $core.bool hasSetting() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearSetting() => $_clearField(19);\n\n  @$pb.TagNumber(20)\n  $core.int get isGuardian => $_getIZ(19);\n  @$pb.TagNumber(20)\n  set isGuardian($core.int value) => $_setSignedInt32(19, value);\n  @$pb.TagNumber(20)\n  $core.bool hasIsGuardian() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearIsGuardian() => $_clearField(20);\n\n  @$pb.TagNumber(21)\n  $core.int get isIntercept => $_getIZ(20);\n  @$pb.TagNumber(21)\n  set isIntercept($core.int value) => $_setSignedInt32(20, value);\n  @$pb.TagNumber(21)\n  $core.bool hasIsIntercept() => $_has(20);\n  @$pb.TagNumber(21)\n  void clearIsIntercept() => $_clearField(21);\n\n  @$pb.TagNumber(22)\n  $core.int get isTrust => $_getIZ(21);\n  @$pb.TagNumber(22)\n  set isTrust($core.int value) => $_setSignedInt32(21, value);\n  @$pb.TagNumber(22)\n  $core.bool hasIsTrust() => $_has(21);\n  @$pb.TagNumber(22)\n  void clearIsTrust() => $_clearField(22);\n\n  @$pb.TagNumber(23)\n  $core.int get systemMsgType => $_getIZ(22);\n  @$pb.TagNumber(23)\n  set systemMsgType($core.int value) => $_setSignedInt32(22, value);\n  @$pb.TagNumber(23)\n  $core.bool hasSystemMsgType() => $_has(22);\n  @$pb.TagNumber(23)\n  void clearSystemMsgType() => $_clearField(23);\n\n  @$pb.TagNumber(24)\n  AccountInfo get accountInfo => $_getN(23);\n  @$pb.TagNumber(24)\n  set accountInfo(AccountInfo value) => $_setField(24, value);\n  @$pb.TagNumber(24)\n  $core.bool hasAccountInfo() => $_has(23);\n  @$pb.TagNumber(24)\n  void clearAccountInfo() => $_clearField(24);\n  @$pb.TagNumber(24)\n  AccountInfo ensureAccountInfo() => $_ensure(23);\n\n  @$pb.TagNumber(25)\n  $core.int get liveStatus => $_getIZ(24);\n  @$pb.TagNumber(25)\n  set liveStatus($core.int value) => $_setSignedInt32(24, value);\n  @$pb.TagNumber(25)\n  $core.bool hasLiveStatus() => $_has(24);\n  @$pb.TagNumber(25)\n  void clearLiveStatus() => $_clearField(25);\n\n  @$pb.TagNumber(26)\n  $core.int get bizMsgUnreadCount => $_getIZ(25);\n  @$pb.TagNumber(26)\n  set bizMsgUnreadCount($core.int value) => $_setSignedInt32(25, value);\n  @$pb.TagNumber(26)\n  $core.bool hasBizMsgUnreadCount() => $_has(25);\n  @$pb.TagNumber(26)\n  void clearBizMsgUnreadCount() => $_clearField(26);\n\n  @$pb.TagNumber(27)\n  UserLabel get userLabel => $_getN(26);\n  @$pb.TagNumber(27)\n  set userLabel(UserLabel value) => $_setField(27, value);\n  @$pb.TagNumber(27)\n  $core.bool hasUserLabel() => $_has(26);\n  @$pb.TagNumber(27)\n  void clearUserLabel() => $_clearField(27);\n  @$pb.TagNumber(27)\n  UserLabel ensureUserLabel() => $_ensure(26);\n\n  @$pb.TagNumber(28)\n  $core.int get isHuahuo => $_getIZ(27);\n  @$pb.TagNumber(28)\n  set isHuahuo($core.int value) => $_setSignedInt32(27, value);\n  @$pb.TagNumber(28)\n  $core.bool hasIsHuahuo() => $_has(27);\n  @$pb.TagNumber(28)\n  void clearIsHuahuo() => $_clearField(28);\n\n  @$pb.TagNumber(29)\n  UInfo get uInfo => $_getN(28);\n  @$pb.TagNumber(29)\n  set uInfo(UInfo value) => $_setField(29, value);\n  @$pb.TagNumber(29)\n  $core.bool hasUInfo() => $_has(28);\n  @$pb.TagNumber(29)\n  void clearUInfo() => $_clearField(29);\n  @$pb.TagNumber(29)\n  UInfo ensureUInfo() => $_ensure(28);\n\n  @$pb.TagNumber(30)\n  $core.int get stranger => $_getIZ(29);\n  @$pb.TagNumber(30)\n  set stranger($core.int value) => $_setSignedInt32(29, value);\n  @$pb.TagNumber(30)\n  $core.bool hasStranger() => $_has(29);\n  @$pb.TagNumber(30)\n  void clearStranger() => $_clearField(30);\n\n  @$pb.TagNumber(31)\n  AiInfo get aiInfo => $_getN(30);\n  @$pb.TagNumber(31)\n  set aiInfo(AiInfo value) => $_setField(31, value);\n  @$pb.TagNumber(31)\n  $core.bool hasAiInfo() => $_has(30);\n  @$pb.TagNumber(31)\n  void clearAiInfo() => $_clearField(31);\n  @$pb.TagNumber(31)\n  AiInfo ensureAiInfo() => $_ensure(30);\n\n  @$pb.TagNumber(32)\n  $core.bool get isHideEdit => $_getBF(31);\n  @$pb.TagNumber(32)\n  set isHideEdit($core.bool value) => $_setBool(31, value);\n  @$pb.TagNumber(32)\n  $core.bool hasIsHideEdit() => $_has(31);\n  @$pb.TagNumber(32)\n  void clearIsHideEdit() => $_clearField(32);\n\n  @$pb.TagNumber(33)\n  SessionInfoExt get ext => $_getN(32);\n  @$pb.TagNumber(33)\n  set ext(SessionInfoExt value) => $_setField(33, value);\n  @$pb.TagNumber(33)\n  $core.bool hasExt() => $_has(32);\n  @$pb.TagNumber(33)\n  void clearExt() => $_clearField(33);\n  @$pb.TagNumber(33)\n  SessionInfoExt ensureExt() => $_ensure(32);\n}\n\nclass SessionInfoExt extends $pb.GeneratedMessage {\n  factory SessionInfoExt({\n    $fixnum.Int64? shopId,\n    $fixnum.Int64? shopFatherId,\n  }) {\n    final result = create();\n    if (shopId != null) result.shopId = shopId;\n    if (shopFatherId != null) result.shopFatherId = shopFatherId;\n    return result;\n  }\n\n  SessionInfoExt._();\n\n  factory SessionInfoExt.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SessionInfoExt.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SessionInfoExt',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'shopId')\n    ..aInt64(2, _omitFieldNames ? '' : 'shopFatherId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionInfoExt clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SessionInfoExt copyWith(void Function(SessionInfoExt) updates) =>\n      super.copyWith((message) => updates(message as SessionInfoExt))\n          as SessionInfoExt;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SessionInfoExt create() => SessionInfoExt._();\n  @$core.override\n  SessionInfoExt createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SessionInfoExt getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SessionInfoExt>(create);\n  static SessionInfoExt? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get shopId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set shopId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasShopId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearShopId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get shopFatherId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set shopFatherId($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasShopFatherId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearShopFatherId() => $_clearField(2);\n}\n\nclass SpliceInfo extends $pb.GeneratedMessage {\n  factory SpliceInfo({\n    $core.String? title,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    return result;\n  }\n\n  SpliceInfo._();\n\n  factory SpliceInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SpliceInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SpliceInfo',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SpliceInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SpliceInfo copyWith(void Function(SpliceInfo) updates) =>\n      super.copyWith((message) => updates(message as SpliceInfo)) as SpliceInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SpliceInfo create() => SpliceInfo._();\n  @$core.override\n  SpliceInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SpliceInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SpliceInfo>(create);\n  static SpliceInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n}\n\nclass Story extends $pb.GeneratedMessage {\n  factory Story({\n    $core.String? tip,\n    $core.Iterable<StoryItem>? items,\n  }) {\n    final result = create();\n    if (tip != null) result.tip = tip;\n    if (items != null) result.items.addAll(items);\n    return result;\n  }\n\n  Story._();\n\n  factory Story.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Story.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Story',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'tip')\n    ..pPM<StoryItem>(2, _omitFieldNames ? '' : 'items',\n        subBuilder: StoryItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Story clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Story copyWith(void Function(Story) updates) =>\n      super.copyWith((message) => updates(message as Story)) as Story;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Story create() => Story._();\n  @$core.override\n  Story createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Story getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Story>(create);\n  static Story? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get tip => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set tip($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTip() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTip() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<StoryItem> get items => $_getList(1);\n}\n\nclass StoryItem extends $pb.GeneratedMessage {\n  factory StoryItem({\n    $fixnum.Int64? id,\n    $core.String? showName,\n    $core.String? aiMsg,\n    $core.bool? selected,\n    $core.Iterable<Prompt>? prompts,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (showName != null) result.showName = showName;\n    if (aiMsg != null) result.aiMsg = aiMsg;\n    if (selected != null) result.selected = selected;\n    if (prompts != null) result.prompts.addAll(prompts);\n    return result;\n  }\n\n  StoryItem._();\n\n  factory StoryItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory StoryItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'StoryItem',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'showName')\n    ..aOS(3, _omitFieldNames ? '' : 'aiMsg')\n    ..aOB(4, _omitFieldNames ? '' : 'selected')\n    ..pPM<Prompt>(5, _omitFieldNames ? '' : 'prompts',\n        subBuilder: Prompt.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StoryItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StoryItem copyWith(void Function(StoryItem) updates) =>\n      super.copyWith((message) => updates(message as StoryItem)) as StoryItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static StoryItem create() => StoryItem._();\n  @$core.override\n  StoryItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static StoryItem getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<StoryItem>(create);\n  static StoryItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get showName => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set showName($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasShowName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearShowName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get aiMsg => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set aiMsg($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAiMsg() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAiMsg() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get selected => $_getBF(3);\n  @$pb.TagNumber(4)\n  set selected($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSelected() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSelected() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $pb.PbList<Prompt> get prompts => $_getList(4);\n}\n\nclass UInfo extends $pb.GeneratedMessage {\n  factory UInfo({\n    $2.AvatarItem? ava,\n    Card? card,\n  }) {\n    final result = create();\n    if (ava != null) result.ava = ava;\n    if (card != null) result.card = card;\n    return result;\n  }\n\n  UInfo._();\n\n  factory UInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UInfo',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aOM<$2.AvatarItem>(1, _omitFieldNames ? '' : 'ava',\n        subBuilder: $2.AvatarItem.create)\n    ..aOM<Card>(2, _omitFieldNames ? '' : 'card', subBuilder: Card.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UInfo copyWith(void Function(UInfo) updates) =>\n      super.copyWith((message) => updates(message as UInfo)) as UInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UInfo create() => UInfo._();\n  @$core.override\n  UInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<UInfo>(create);\n  static UInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $2.AvatarItem get ava => $_getN(0);\n  @$pb.TagNumber(1)\n  set ava($2.AvatarItem value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAva() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAva() => $_clearField(1);\n  @$pb.TagNumber(1)\n  $2.AvatarItem ensureAva() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  Card get card => $_getN(1);\n  @$pb.TagNumber(2)\n  set card(Card value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCard() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCard() => $_clearField(2);\n  @$pb.TagNumber(2)\n  Card ensureCard() => $_ensure(1);\n}\n\nclass UserHonourInfo extends $pb.GeneratedMessage {\n  factory UserHonourInfo({\n    $fixnum.Int64? mid,\n    UserHonourStyle? colour,\n    $core.Iterable<HonourTag>? tags,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (colour != null) result.colour = colour;\n    if (tags != null) result.tags.addAll(tags);\n    return result;\n  }\n\n  UserHonourInfo._();\n\n  factory UserHonourInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UserHonourInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UserHonourInfo',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aOM<UserHonourStyle>(2, _omitFieldNames ? '' : 'colour',\n        subBuilder: UserHonourStyle.create)\n    ..pPM<HonourTag>(3, _omitFieldNames ? '' : 'tags',\n        subBuilder: HonourTag.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserHonourInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserHonourInfo copyWith(void Function(UserHonourInfo) updates) =>\n      super.copyWith((message) => updates(message as UserHonourInfo))\n          as UserHonourInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UserHonourInfo create() => UserHonourInfo._();\n  @$core.override\n  UserHonourInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UserHonourInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UserHonourInfo>(create);\n  static UserHonourInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  UserHonourStyle get colour => $_getN(1);\n  @$pb.TagNumber(2)\n  set colour(UserHonourStyle value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasColour() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearColour() => $_clearField(2);\n  @$pb.TagNumber(2)\n  UserHonourStyle ensureColour() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<HonourTag> get tags => $_getList(2);\n}\n\nclass UserHonourStyle extends $pb.GeneratedMessage {\n  factory UserHonourStyle({\n    $core.String? dark,\n    $core.String? normal,\n  }) {\n    final result = create();\n    if (dark != null) result.dark = dark;\n    if (normal != null) result.normal = normal;\n    return result;\n  }\n\n  UserHonourStyle._();\n\n  factory UserHonourStyle.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UserHonourStyle.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UserHonourStyle',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'dark')\n    ..aOS(2, _omitFieldNames ? '' : 'normal')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserHonourStyle clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserHonourStyle copyWith(void Function(UserHonourStyle) updates) =>\n      super.copyWith((message) => updates(message as UserHonourStyle))\n          as UserHonourStyle;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UserHonourStyle create() => UserHonourStyle._();\n  @$core.override\n  UserHonourStyle createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UserHonourStyle getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UserHonourStyle>(create);\n  static UserHonourStyle? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get dark => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set dark($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDark() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDark() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get normal => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set normal($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasNormal() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearNormal() => $_clearField(2);\n}\n\nclass UserLabel extends $pb.GeneratedMessage {\n  factory UserLabel({\n    $core.int? labelType,\n    Medal? medal,\n    $core.int? guardianRelation,\n  }) {\n    final result = create();\n    if (labelType != null) result.labelType = labelType;\n    if (medal != null) result.medal = medal;\n    if (guardianRelation != null) result.guardianRelation = guardianRelation;\n    return result;\n  }\n\n  UserLabel._();\n\n  factory UserLabel.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UserLabel.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UserLabel',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'labelType')\n    ..aOM<Medal>(2, _omitFieldNames ? '' : 'medal', subBuilder: Medal.create)\n    ..aI(3, _omitFieldNames ? '' : 'guardianRelation')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserLabel clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserLabel copyWith(void Function(UserLabel) updates) =>\n      super.copyWith((message) => updates(message as UserLabel)) as UserLabel;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UserLabel create() => UserLabel._();\n  @$core.override\n  UserLabel createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UserLabel getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<UserLabel>(create);\n  static UserLabel? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get labelType => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set labelType($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLabelType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLabelType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  Medal get medal => $_getN(1);\n  @$pb.TagNumber(2)\n  set medal(Medal value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMedal() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMedal() => $_clearField(2);\n  @$pb.TagNumber(2)\n  Medal ensureMedal() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.int get guardianRelation => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set guardianRelation($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasGuardianRelation() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearGuardianRelation() => $_clearField(3);\n}\n\nclass VipInfo extends $pb.GeneratedMessage {\n  factory VipInfo({\n    $core.int? type,\n    $core.int? status,\n    $fixnum.Int64? dueDate,\n    $core.int? vipPayType,\n    $core.int? themeType,\n    VipLabel? label,\n    $core.int? avatarSubscript,\n    $core.String? nicknameColor,\n    $fixnum.Int64? role,\n    $core.String? avatarSubscriptUrl,\n    $core.int? tvVipStatus,\n    $core.int? tvVipPayType,\n    $fixnum.Int64? tvDueDate,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (status != null) result.status = status;\n    if (dueDate != null) result.dueDate = dueDate;\n    if (vipPayType != null) result.vipPayType = vipPayType;\n    if (themeType != null) result.themeType = themeType;\n    if (label != null) result.label = label;\n    if (avatarSubscript != null) result.avatarSubscript = avatarSubscript;\n    if (nicknameColor != null) result.nicknameColor = nicknameColor;\n    if (role != null) result.role = role;\n    if (avatarSubscriptUrl != null)\n      result.avatarSubscriptUrl = avatarSubscriptUrl;\n    if (tvVipStatus != null) result.tvVipStatus = tvVipStatus;\n    if (tvVipPayType != null) result.tvVipPayType = tvVipPayType;\n    if (tvDueDate != null) result.tvDueDate = tvDueDate;\n    return result;\n  }\n\n  VipInfo._();\n\n  factory VipInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory VipInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'VipInfo',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'type')\n    ..aI(2, _omitFieldNames ? '' : 'status')\n    ..aInt64(3, _omitFieldNames ? '' : 'dueDate')\n    ..aI(4, _omitFieldNames ? '' : 'vipPayType')\n    ..aI(5, _omitFieldNames ? '' : 'themeType')\n    ..aOM<VipLabel>(6, _omitFieldNames ? '' : 'label',\n        subBuilder: VipLabel.create)\n    ..aI(7, _omitFieldNames ? '' : 'avatarSubscript')\n    ..aOS(8, _omitFieldNames ? '' : 'nicknameColor')\n    ..aInt64(9, _omitFieldNames ? '' : 'role')\n    ..aOS(10, _omitFieldNames ? '' : 'avatarSubscriptUrl')\n    ..aI(11, _omitFieldNames ? '' : 'tvVipStatus')\n    ..aI(12, _omitFieldNames ? '' : 'tvVipPayType')\n    ..aInt64(13, _omitFieldNames ? '' : 'tvDueDate')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VipInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VipInfo copyWith(void Function(VipInfo) updates) =>\n      super.copyWith((message) => updates(message as VipInfo)) as VipInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static VipInfo create() => VipInfo._();\n  @$core.override\n  VipInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static VipInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<VipInfo>(create);\n  static VipInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get type => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set type($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get status => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set status($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasStatus() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearStatus() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get dueDate => $_getI64(2);\n  @$pb.TagNumber(3)\n  set dueDate($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDueDate() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDueDate() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get vipPayType => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set vipPayType($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasVipPayType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearVipPayType() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get themeType => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set themeType($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasThemeType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearThemeType() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  VipLabel get label => $_getN(5);\n  @$pb.TagNumber(6)\n  set label(VipLabel value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasLabel() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearLabel() => $_clearField(6);\n  @$pb.TagNumber(6)\n  VipLabel ensureLabel() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $core.int get avatarSubscript => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set avatarSubscript($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasAvatarSubscript() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearAvatarSubscript() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get nicknameColor => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set nicknameColor($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasNicknameColor() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearNicknameColor() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get role => $_getI64(8);\n  @$pb.TagNumber(9)\n  set role($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasRole() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearRole() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get avatarSubscriptUrl => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set avatarSubscriptUrl($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasAvatarSubscriptUrl() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearAvatarSubscriptUrl() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.int get tvVipStatus => $_getIZ(10);\n  @$pb.TagNumber(11)\n  set tvVipStatus($core.int value) => $_setSignedInt32(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasTvVipStatus() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearTvVipStatus() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.int get tvVipPayType => $_getIZ(11);\n  @$pb.TagNumber(12)\n  set tvVipPayType($core.int value) => $_setSignedInt32(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasTvVipPayType() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearTvVipPayType() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $fixnum.Int64 get tvDueDate => $_getI64(12);\n  @$pb.TagNumber(13)\n  set tvDueDate($fixnum.Int64 value) => $_setInt64(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasTvDueDate() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearTvDueDate() => $_clearField(13);\n}\n\nclass VipLabel extends $pb.GeneratedMessage {\n  factory VipLabel({\n    $core.String? path,\n    $core.String? text,\n    $core.String? labelTheme,\n    $core.String? textColor,\n    $core.int? bgStyle,\n    $core.String? bgColor,\n    $core.String? borderColor,\n    $core.bool? useImgLabel,\n    $core.String? imgLabelUriHans,\n    $core.String? imgLabelUriHant,\n    $core.String? imgLabelUriHansStatic,\n    $core.String? imgLabelUriHantStatic,\n  }) {\n    final result = create();\n    if (path != null) result.path = path;\n    if (text != null) result.text = text;\n    if (labelTheme != null) result.labelTheme = labelTheme;\n    if (textColor != null) result.textColor = textColor;\n    if (bgStyle != null) result.bgStyle = bgStyle;\n    if (bgColor != null) result.bgColor = bgColor;\n    if (borderColor != null) result.borderColor = borderColor;\n    if (useImgLabel != null) result.useImgLabel = useImgLabel;\n    if (imgLabelUriHans != null) result.imgLabelUriHans = imgLabelUriHans;\n    if (imgLabelUriHant != null) result.imgLabelUriHant = imgLabelUriHant;\n    if (imgLabelUriHansStatic != null)\n      result.imgLabelUriHansStatic = imgLabelUriHansStatic;\n    if (imgLabelUriHantStatic != null)\n      result.imgLabelUriHantStatic = imgLabelUriHantStatic;\n    return result;\n  }\n\n  VipLabel._();\n\n  factory VipLabel.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory VipLabel.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'VipLabel',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.im.type'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'path')\n    ..aOS(3, _omitFieldNames ? '' : 'text')\n    ..aOS(4, _omitFieldNames ? '' : 'labelTheme')\n    ..aOS(5, _omitFieldNames ? '' : 'textColor')\n    ..aI(6, _omitFieldNames ? '' : 'bgStyle')\n    ..aOS(7, _omitFieldNames ? '' : 'bgColor')\n    ..aOS(8, _omitFieldNames ? '' : 'borderColor')\n    ..aOB(9, _omitFieldNames ? '' : 'useImgLabel')\n    ..aOS(10, _omitFieldNames ? '' : 'imgLabelUriHans')\n    ..aOS(11, _omitFieldNames ? '' : 'imgLabelUriHant')\n    ..aOS(12, _omitFieldNames ? '' : 'imgLabelUriHansStatic')\n    ..aOS(13, _omitFieldNames ? '' : 'imgLabelUriHantStatic')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VipLabel clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VipLabel copyWith(void Function(VipLabel) updates) =>\n      super.copyWith((message) => updates(message as VipLabel)) as VipLabel;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static VipLabel create() => VipLabel._();\n  @$core.override\n  VipLabel createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static VipLabel getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<VipLabel>(create);\n  static VipLabel? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get path => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set path($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPath() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPath() => $_clearField(1);\n\n  @$pb.TagNumber(3)\n  $core.String get text => $_getSZ(1);\n  @$pb.TagNumber(3)\n  set text($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(3)\n  $core.bool hasText() => $_has(1);\n  @$pb.TagNumber(3)\n  void clearText() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get labelTheme => $_getSZ(2);\n  @$pb.TagNumber(4)\n  set labelTheme($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLabelTheme() => $_has(2);\n  @$pb.TagNumber(4)\n  void clearLabelTheme() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get textColor => $_getSZ(3);\n  @$pb.TagNumber(5)\n  set textColor($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(5)\n  $core.bool hasTextColor() => $_has(3);\n  @$pb.TagNumber(5)\n  void clearTextColor() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get bgStyle => $_getIZ(4);\n  @$pb.TagNumber(6)\n  set bgStyle($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(6)\n  $core.bool hasBgStyle() => $_has(4);\n  @$pb.TagNumber(6)\n  void clearBgStyle() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get bgColor => $_getSZ(5);\n  @$pb.TagNumber(7)\n  set bgColor($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBgColor() => $_has(5);\n  @$pb.TagNumber(7)\n  void clearBgColor() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get borderColor => $_getSZ(6);\n  @$pb.TagNumber(8)\n  set borderColor($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(8)\n  $core.bool hasBorderColor() => $_has(6);\n  @$pb.TagNumber(8)\n  void clearBorderColor() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.bool get useImgLabel => $_getBF(7);\n  @$pb.TagNumber(9)\n  set useImgLabel($core.bool value) => $_setBool(7, value);\n  @$pb.TagNumber(9)\n  $core.bool hasUseImgLabel() => $_has(7);\n  @$pb.TagNumber(9)\n  void clearUseImgLabel() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get imgLabelUriHans => $_getSZ(8);\n  @$pb.TagNumber(10)\n  set imgLabelUriHans($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(10)\n  $core.bool hasImgLabelUriHans() => $_has(8);\n  @$pb.TagNumber(10)\n  void clearImgLabelUriHans() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get imgLabelUriHant => $_getSZ(9);\n  @$pb.TagNumber(11)\n  set imgLabelUriHant($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(11)\n  $core.bool hasImgLabelUriHant() => $_has(9);\n  @$pb.TagNumber(11)\n  void clearImgLabelUriHant() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get imgLabelUriHansStatic => $_getSZ(10);\n  @$pb.TagNumber(12)\n  set imgLabelUriHansStatic($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(12)\n  $core.bool hasImgLabelUriHansStatic() => $_has(10);\n  @$pb.TagNumber(12)\n  void clearImgLabelUriHansStatic() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.String get imgLabelUriHantStatic => $_getSZ(11);\n  @$pb.TagNumber(13)\n  set imgLabelUriHantStatic($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(13)\n  $core.bool hasImgLabelUriHantStatic() => $_has(11);\n  @$pb.TagNumber(13)\n  void clearImgLabelUriHantStatic() => $_clearField(13);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/im/type.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/im/type.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nclass Exp extends $pb.ProtobufEnum {\n  static const Exp Invalid = Exp._(0, _omitEnumNames ? '' : 'Invalid');\n  static const Exp New_Ava = Exp._(1, _omitEnumNames ? '' : 'New_Ava');\n\n  static const $core.List<Exp> values = <Exp>[\n    Invalid,\n    New_Ava,\n  ];\n\n  static final $core.List<Exp?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static Exp? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const Exp._(super.value, super.name);\n}\n\nclass MsgType extends $pb.ProtobufEnum {\n  static const MsgType EN_INVALID_MSG_TYPE =\n      MsgType._(0, _omitEnumNames ? '' : 'EN_INVALID_MSG_TYPE');\n  static const MsgType EN_MSG_TYPE_TEXT =\n      MsgType._(1, _omitEnumNames ? '' : 'EN_MSG_TYPE_TEXT');\n  static const MsgType EN_MSG_TYPE_PIC =\n      MsgType._(2, _omitEnumNames ? '' : 'EN_MSG_TYPE_PIC');\n  static const MsgType EN_MSG_TYPE_AUDIO =\n      MsgType._(3, _omitEnumNames ? '' : 'EN_MSG_TYPE_AUDIO');\n  static const MsgType EN_MSG_TYPE_SHARE =\n      MsgType._(4, _omitEnumNames ? '' : 'EN_MSG_TYPE_SHARE');\n  static const MsgType EN_MSG_TYPE_DRAW_BACK =\n      MsgType._(5, _omitEnumNames ? '' : 'EN_MSG_TYPE_DRAW_BACK');\n  static const MsgType EN_MSG_TYPE_CUSTOM_FACE =\n      MsgType._(6, _omitEnumNames ? '' : 'EN_MSG_TYPE_CUSTOM_FACE');\n  static const MsgType EN_MSG_TYPE_SHARE_V2 =\n      MsgType._(7, _omitEnumNames ? '' : 'EN_MSG_TYPE_SHARE_V2');\n  static const MsgType EN_MSG_TYPE_SYS_CANCEL =\n      MsgType._(8, _omitEnumNames ? '' : 'EN_MSG_TYPE_SYS_CANCEL');\n  static const MsgType EN_MSG_TYPE_MINI_PROGRAM =\n      MsgType._(9, _omitEnumNames ? '' : 'EN_MSG_TYPE_MINI_PROGRAM');\n  static const MsgType EN_MSG_TYPE_NOTIFY_MSG =\n      MsgType._(10, _omitEnumNames ? '' : 'EN_MSG_TYPE_NOTIFY_MSG');\n  static const MsgType EN_MSG_TYPE_VIDEO_CARD =\n      MsgType._(11, _omitEnumNames ? '' : 'EN_MSG_TYPE_VIDEO_CARD');\n  static const MsgType EN_MSG_TYPE_ARTICLE_CARD =\n      MsgType._(12, _omitEnumNames ? '' : 'EN_MSG_TYPE_ARTICLE_CARD');\n  static const MsgType EN_MSG_TYPE_PICTURE_CARD =\n      MsgType._(13, _omitEnumNames ? '' : 'EN_MSG_TYPE_PICTURE_CARD');\n  static const MsgType EN_MSG_TYPE_COMMON_SHARE_CARD =\n      MsgType._(14, _omitEnumNames ? '' : 'EN_MSG_TYPE_COMMON_SHARE_CARD');\n  static const MsgType EN_MSG_TYPE_TEXT_SHARE =\n      MsgType._(15, _omitEnumNames ? '' : 'EN_MSG_TYPE_TEXT_SHARE');\n  static const MsgType EN_MSG_TYPE_TIP_MESSAGE =\n      MsgType._(18, _omitEnumNames ? '' : 'EN_MSG_TYPE_TIP_MESSAGE');\n  static const MsgType EN_MSG_TYPE_GPT_MESSAGE =\n      MsgType._(19, _omitEnumNames ? '' : 'EN_MSG_TYPE_GPT_MESSAGE');\n  static const MsgType EN_MSG_TYPE_BIZ_MSG_TYPE =\n      MsgType._(50, _omitEnumNames ? '' : 'EN_MSG_TYPE_BIZ_MSG_TYPE');\n  static const MsgType EN_MSG_TYPE_MODIFY_MSG_TYPE =\n      MsgType._(51, _omitEnumNames ? '' : 'EN_MSG_TYPE_MODIFY_MSG_TYPE');\n  static const MsgType EN_MSG_TYPE_GROUP_MEMBER_CHANGED =\n      MsgType._(101, _omitEnumNames ? '' : 'EN_MSG_TYPE_GROUP_MEMBER_CHANGED');\n  static const MsgType EN_MSG_TYPE_GROUP_STATUS_CHANGED =\n      MsgType._(102, _omitEnumNames ? '' : 'EN_MSG_TYPE_GROUP_STATUS_CHANGED');\n  static const MsgType EN_MSG_TYPE_GROUP_DYNAMIC_CHANGED =\n      MsgType._(103, _omitEnumNames ? '' : 'EN_MSG_TYPE_GROUP_DYNAMIC_CHANGED');\n  static const MsgType EN_MSG_TYPE_GROUP_LIST_CHANGED =\n      MsgType._(104, _omitEnumNames ? '' : 'EN_MSG_TYPE_GROUP_LIST_CHANGED');\n  static const MsgType EM_MSG_TYPE_FRIEND_LIST_CHANGED =\n      MsgType._(105, _omitEnumNames ? '' : 'EM_MSG_TYPE_FRIEND_LIST_CHANGED');\n  static const MsgType EN_MSG_TYPE_GROUP_DETAIL_CHANGED =\n      MsgType._(106, _omitEnumNames ? '' : 'EN_MSG_TYPE_GROUP_DETAIL_CHANGED');\n  static const MsgType EN_MSG_TYPE_GROUP_MEMBER_ROLE_CHANGED = MsgType._(\n      107, _omitEnumNames ? '' : 'EN_MSG_TYPE_GROUP_MEMBER_ROLE_CHANGED');\n  static const MsgType EN_MSG_TYPE_NOTICE_WATCH_LIST =\n      MsgType._(108, _omitEnumNames ? '' : 'EN_MSG_TYPE_NOTICE_WATCH_LIST');\n  static const MsgType EN_MSG_TYPE_NOTIFY_NEW_REPLY_RECIEVED = MsgType._(\n      109, _omitEnumNames ? '' : 'EN_MSG_TYPE_NOTIFY_NEW_REPLY_RECIEVED');\n  static const MsgType EN_MSG_TYPE_NOTIFY_NEW_AT_RECIEVED = MsgType._(\n      110, _omitEnumNames ? '' : 'EN_MSG_TYPE_NOTIFY_NEW_AT_RECIEVED');\n  static const MsgType EN_MSG_TYPE_NOTIFY_NEW_PRAISE_RECIEVED = MsgType._(\n      111, _omitEnumNames ? '' : 'EN_MSG_TYPE_NOTIFY_NEW_PRAISE_RECIEVED');\n  static const MsgType EN_MSG_TYPE_NOTIFY_NEW_UP_RECIEVED = MsgType._(\n      112, _omitEnumNames ? '' : 'EN_MSG_TYPE_NOTIFY_NEW_UP_RECIEVED');\n  static const MsgType EN_MSG_TYPE_NOTIFY_NEW_REPLY_RECIEVED_V2 = MsgType._(\n      113, _omitEnumNames ? '' : 'EN_MSG_TYPE_NOTIFY_NEW_REPLY_RECIEVED_V2');\n  static const MsgType EN_MSG_TYPE_NOTIFY_NEW_AT_RECIEVED_V2 = MsgType._(\n      114, _omitEnumNames ? '' : 'EN_MSG_TYPE_NOTIFY_NEW_AT_RECIEVED_V2');\n  static const MsgType EN_MSG_TYPE_NOTIFY_NEW_PRAISE_RECIEVED_V2 = MsgType._(\n      115, _omitEnumNames ? '' : 'EN_MSG_TYPE_NOTIFY_NEW_PRAISE_RECIEVED_V2');\n  static const MsgType EN_MSG_TYPE_GROUP_DETAIL_CHANGED_MULTI = MsgType._(\n      116, _omitEnumNames ? '' : 'EN_MSG_TYPE_GROUP_DETAIL_CHANGED_MULTI');\n  static const MsgType EN_MSG_TYPE_GROUP_MEMBER_ROLE_CHANGED_MULTI = MsgType._(\n      117, _omitEnumNames ? '' : 'EN_MSG_TYPE_GROUP_MEMBER_ROLE_CHANGED_MULTI');\n  static const MsgType EN_MSG_TYPE_NOTIFY_ANTI_DISTURB =\n      MsgType._(118, _omitEnumNames ? '' : 'EN_MSG_TYPE_NOTIFY_ANTI_DISTURB');\n  static const MsgType EN_MSG_TYPE_SYS_GROUP_DISSOLVED =\n      MsgType._(201, _omitEnumNames ? '' : 'EN_MSG_TYPE_SYS_GROUP_DISSOLVED');\n  static const MsgType EN_MSG_TYPE_SYS_GROUP_JOINED =\n      MsgType._(202, _omitEnumNames ? '' : 'EN_MSG_TYPE_SYS_GROUP_JOINED');\n  static const MsgType EN_MSG_TYPE_SYS_GROUP_MEMBER_EXITED = MsgType._(\n      203, _omitEnumNames ? '' : 'EN_MSG_TYPE_SYS_GROUP_MEMBER_EXITED');\n  static const MsgType EN_MSG_TYPE_SYS_GROUP_ADMIN_FIRED =\n      MsgType._(204, _omitEnumNames ? '' : 'EN_MSG_TYPE_SYS_GROUP_ADMIN_FIRED');\n  static const MsgType EN_MSG_TYPE_SYS_GROUP_MEMBER_KICKED = MsgType._(\n      205, _omitEnumNames ? '' : 'EN_MSG_TYPE_SYS_GROUP_MEMBER_KICKED');\n  static const MsgType EN_MSG_TYPE_SYS_GROUP_ADMIN_KICK_OFF = MsgType._(\n      206, _omitEnumNames ? '' : 'EN_MSG_TYPE_SYS_GROUP_ADMIN_KICK_OFF');\n  static const MsgType EN_MSG_TYPE_SYS_GROUP_ADMIN_DUTY =\n      MsgType._(207, _omitEnumNames ? '' : 'EN_MSG_TYPE_SYS_GROUP_ADMIN_DUTY');\n  static const MsgType EN_MSG_TYPE_SYS_GROUP_AUTO_CREATED = MsgType._(\n      208, _omitEnumNames ? '' : 'EN_MSG_TYPE_SYS_GROUP_AUTO_CREATED');\n  static const MsgType EN_MSG_TYPE_SYS_FRIEND_APPLY =\n      MsgType._(210, _omitEnumNames ? '' : 'EN_MSG_TYPE_SYS_FRIEND_APPLY');\n  static const MsgType EN_MSG_TYPE_SYS_FRIEND_APPLY_ACK =\n      MsgType._(211, _omitEnumNames ? '' : 'EN_MSG_TYPE_SYS_FRIEND_APPLY_ACK');\n  static const MsgType EN_MSG_TYPE_SYS_GROUP_APPLY_FOR_JOINING = MsgType._(\n      212, _omitEnumNames ? '' : 'EN_MSG_TYPE_SYS_GROUP_APPLY_FOR_JOINING');\n  static const MsgType EN_MSG_TYPE_SYS_GROUP_ADMIN_ACCEPTED_USER_APPLY =\n      MsgType._(\n          213,\n          _omitEnumNames\n              ? ''\n              : 'EN_MSG_TYPE_SYS_GROUP_ADMIN_ACCEPTED_USER_APPLY');\n  static const MsgType EN_MSG_TYPE_CHAT_MEMBER_JOINED =\n      MsgType._(301, _omitEnumNames ? '' : 'EN_MSG_TYPE_CHAT_MEMBER_JOINED');\n  static const MsgType EN_MSG_TYPE_CHAT_MEMBER_EXITED =\n      MsgType._(302, _omitEnumNames ? '' : 'EN_MSG_TYPE_CHAT_MEMBER_EXITED');\n  static const MsgType EN_MSG_TYPE_CHAT_GROUP_FREEZED =\n      MsgType._(303, _omitEnumNames ? '' : 'EN_MSG_TYPE_CHAT_GROUP_FREEZED');\n  static const MsgType EN_MSG_TYPE_CHAT_GROUP_DISSOLVED =\n      MsgType._(304, _omitEnumNames ? '' : 'EN_MSG_TYPE_CHAT_GROUP_DISSOLVED');\n  static const MsgType EN_MSG_TYPE_CHAT_GROUP_CREATED =\n      MsgType._(305, _omitEnumNames ? '' : 'EN_MSG_TYPE_CHAT_GROUP_CREATED');\n  static const MsgType EN_MSG_TYPE_CHAT_POPUP_SESSION =\n      MsgType._(306, _omitEnumNames ? '' : 'EN_MSG_TYPE_CHAT_POPUP_SESSION');\n  static const MsgType EN_MSG_TYPE_CUSTOM_RANK_UPDATE =\n      MsgType._(400, _omitEnumNames ? '' : 'EN_MSG_TYPE_CUSTOM_RANK_UPDATE');\n  static const MsgType EN_MSG_TYPE_CUSTOM_MSG_NOTICE =\n      MsgType._(401, _omitEnumNames ? '' : 'EN_MSG_TYPE_CUSTOM_MSG_NOTICE');\n\n  static const $core.List<MsgType> values = <MsgType>[\n    EN_INVALID_MSG_TYPE,\n    EN_MSG_TYPE_TEXT,\n    EN_MSG_TYPE_PIC,\n    EN_MSG_TYPE_AUDIO,\n    EN_MSG_TYPE_SHARE,\n    EN_MSG_TYPE_DRAW_BACK,\n    EN_MSG_TYPE_CUSTOM_FACE,\n    EN_MSG_TYPE_SHARE_V2,\n    EN_MSG_TYPE_SYS_CANCEL,\n    EN_MSG_TYPE_MINI_PROGRAM,\n    EN_MSG_TYPE_NOTIFY_MSG,\n    EN_MSG_TYPE_VIDEO_CARD,\n    EN_MSG_TYPE_ARTICLE_CARD,\n    EN_MSG_TYPE_PICTURE_CARD,\n    EN_MSG_TYPE_COMMON_SHARE_CARD,\n    EN_MSG_TYPE_TEXT_SHARE,\n    EN_MSG_TYPE_TIP_MESSAGE,\n    EN_MSG_TYPE_GPT_MESSAGE,\n    EN_MSG_TYPE_BIZ_MSG_TYPE,\n    EN_MSG_TYPE_MODIFY_MSG_TYPE,\n    EN_MSG_TYPE_GROUP_MEMBER_CHANGED,\n    EN_MSG_TYPE_GROUP_STATUS_CHANGED,\n    EN_MSG_TYPE_GROUP_DYNAMIC_CHANGED,\n    EN_MSG_TYPE_GROUP_LIST_CHANGED,\n    EM_MSG_TYPE_FRIEND_LIST_CHANGED,\n    EN_MSG_TYPE_GROUP_DETAIL_CHANGED,\n    EN_MSG_TYPE_GROUP_MEMBER_ROLE_CHANGED,\n    EN_MSG_TYPE_NOTICE_WATCH_LIST,\n    EN_MSG_TYPE_NOTIFY_NEW_REPLY_RECIEVED,\n    EN_MSG_TYPE_NOTIFY_NEW_AT_RECIEVED,\n    EN_MSG_TYPE_NOTIFY_NEW_PRAISE_RECIEVED,\n    EN_MSG_TYPE_NOTIFY_NEW_UP_RECIEVED,\n    EN_MSG_TYPE_NOTIFY_NEW_REPLY_RECIEVED_V2,\n    EN_MSG_TYPE_NOTIFY_NEW_AT_RECIEVED_V2,\n    EN_MSG_TYPE_NOTIFY_NEW_PRAISE_RECIEVED_V2,\n    EN_MSG_TYPE_GROUP_DETAIL_CHANGED_MULTI,\n    EN_MSG_TYPE_GROUP_MEMBER_ROLE_CHANGED_MULTI,\n    EN_MSG_TYPE_NOTIFY_ANTI_DISTURB,\n    EN_MSG_TYPE_SYS_GROUP_DISSOLVED,\n    EN_MSG_TYPE_SYS_GROUP_JOINED,\n    EN_MSG_TYPE_SYS_GROUP_MEMBER_EXITED,\n    EN_MSG_TYPE_SYS_GROUP_ADMIN_FIRED,\n    EN_MSG_TYPE_SYS_GROUP_MEMBER_KICKED,\n    EN_MSG_TYPE_SYS_GROUP_ADMIN_KICK_OFF,\n    EN_MSG_TYPE_SYS_GROUP_ADMIN_DUTY,\n    EN_MSG_TYPE_SYS_GROUP_AUTO_CREATED,\n    EN_MSG_TYPE_SYS_FRIEND_APPLY,\n    EN_MSG_TYPE_SYS_FRIEND_APPLY_ACK,\n    EN_MSG_TYPE_SYS_GROUP_APPLY_FOR_JOINING,\n    EN_MSG_TYPE_SYS_GROUP_ADMIN_ACCEPTED_USER_APPLY,\n    EN_MSG_TYPE_CHAT_MEMBER_JOINED,\n    EN_MSG_TYPE_CHAT_MEMBER_EXITED,\n    EN_MSG_TYPE_CHAT_GROUP_FREEZED,\n    EN_MSG_TYPE_CHAT_GROUP_DISSOLVED,\n    EN_MSG_TYPE_CHAT_GROUP_CREATED,\n    EN_MSG_TYPE_CHAT_POPUP_SESSION,\n    EN_MSG_TYPE_CUSTOM_RANK_UPDATE,\n    EN_MSG_TYPE_CUSTOM_MSG_NOTICE,\n  ];\n\n  static final $core.Map<$core.int, MsgType> _byValue =\n      $pb.ProtobufEnum.initByValue(values);\n  static MsgType? valueOf($core.int value) => _byValue[value];\n\n  const MsgType._(super.value, super.name);\n}\n\nconst $core.bool _omitEnumNames =\n    $core.bool.fromEnvironment('protobuf.omit_enum_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/im/type.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/im/type.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use expDescriptor instead')\nconst Exp$json = {\n  '1': 'Exp',\n  '2': [\n    {'1': 'Invalid', '2': 0},\n    {'1': 'New_Ava', '2': 1},\n  ],\n};\n\n/// Descriptor for `Exp`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List expDescriptor =\n    $convert.base64Decode('CgNFeHASCwoHSW52YWxpZBAAEgsKB05ld19BdmEQAQ==');\n\n@$core.Deprecated('Use msgTypeDescriptor instead')\nconst MsgType$json = {\n  '1': 'MsgType',\n  '2': [\n    {'1': 'EN_INVALID_MSG_TYPE', '2': 0},\n    {'1': 'EN_MSG_TYPE_TEXT', '2': 1},\n    {'1': 'EN_MSG_TYPE_PIC', '2': 2},\n    {'1': 'EN_MSG_TYPE_AUDIO', '2': 3},\n    {'1': 'EN_MSG_TYPE_SHARE', '2': 4},\n    {'1': 'EN_MSG_TYPE_DRAW_BACK', '2': 5},\n    {'1': 'EN_MSG_TYPE_CUSTOM_FACE', '2': 6},\n    {'1': 'EN_MSG_TYPE_SHARE_V2', '2': 7},\n    {'1': 'EN_MSG_TYPE_SYS_CANCEL', '2': 8},\n    {'1': 'EN_MSG_TYPE_MINI_PROGRAM', '2': 9},\n    {'1': 'EN_MSG_TYPE_NOTIFY_MSG', '2': 10},\n    {'1': 'EN_MSG_TYPE_VIDEO_CARD', '2': 11},\n    {'1': 'EN_MSG_TYPE_ARTICLE_CARD', '2': 12},\n    {'1': 'EN_MSG_TYPE_PICTURE_CARD', '2': 13},\n    {'1': 'EN_MSG_TYPE_COMMON_SHARE_CARD', '2': 14},\n    {'1': 'EN_MSG_TYPE_TEXT_SHARE', '2': 15},\n    {'1': 'EN_MSG_TYPE_TIP_MESSAGE', '2': 18},\n    {'1': 'EN_MSG_TYPE_GPT_MESSAGE', '2': 19},\n    {'1': 'EN_MSG_TYPE_BIZ_MSG_TYPE', '2': 50},\n    {'1': 'EN_MSG_TYPE_MODIFY_MSG_TYPE', '2': 51},\n    {'1': 'EN_MSG_TYPE_GROUP_MEMBER_CHANGED', '2': 101},\n    {'1': 'EN_MSG_TYPE_GROUP_STATUS_CHANGED', '2': 102},\n    {'1': 'EN_MSG_TYPE_GROUP_DYNAMIC_CHANGED', '2': 103},\n    {'1': 'EN_MSG_TYPE_GROUP_LIST_CHANGED', '2': 104},\n    {'1': 'EM_MSG_TYPE_FRIEND_LIST_CHANGED', '2': 105},\n    {'1': 'EN_MSG_TYPE_GROUP_DETAIL_CHANGED', '2': 106},\n    {'1': 'EN_MSG_TYPE_GROUP_MEMBER_ROLE_CHANGED', '2': 107},\n    {'1': 'EN_MSG_TYPE_NOTICE_WATCH_LIST', '2': 108},\n    {'1': 'EN_MSG_TYPE_NOTIFY_NEW_REPLY_RECIEVED', '2': 109},\n    {'1': 'EN_MSG_TYPE_NOTIFY_NEW_AT_RECIEVED', '2': 110},\n    {'1': 'EN_MSG_TYPE_NOTIFY_NEW_PRAISE_RECIEVED', '2': 111},\n    {'1': 'EN_MSG_TYPE_NOTIFY_NEW_UP_RECIEVED', '2': 112},\n    {'1': 'EN_MSG_TYPE_NOTIFY_NEW_REPLY_RECIEVED_V2', '2': 113},\n    {'1': 'EN_MSG_TYPE_NOTIFY_NEW_AT_RECIEVED_V2', '2': 114},\n    {'1': 'EN_MSG_TYPE_NOTIFY_NEW_PRAISE_RECIEVED_V2', '2': 115},\n    {'1': 'EN_MSG_TYPE_GROUP_DETAIL_CHANGED_MULTI', '2': 116},\n    {'1': 'EN_MSG_TYPE_GROUP_MEMBER_ROLE_CHANGED_MULTI', '2': 117},\n    {'1': 'EN_MSG_TYPE_NOTIFY_ANTI_DISTURB', '2': 118},\n    {'1': 'EN_MSG_TYPE_SYS_GROUP_DISSOLVED', '2': 201},\n    {'1': 'EN_MSG_TYPE_SYS_GROUP_JOINED', '2': 202},\n    {'1': 'EN_MSG_TYPE_SYS_GROUP_MEMBER_EXITED', '2': 203},\n    {'1': 'EN_MSG_TYPE_SYS_GROUP_ADMIN_FIRED', '2': 204},\n    {'1': 'EN_MSG_TYPE_SYS_GROUP_MEMBER_KICKED', '2': 205},\n    {'1': 'EN_MSG_TYPE_SYS_GROUP_ADMIN_KICK_OFF', '2': 206},\n    {'1': 'EN_MSG_TYPE_SYS_GROUP_ADMIN_DUTY', '2': 207},\n    {'1': 'EN_MSG_TYPE_SYS_GROUP_AUTO_CREATED', '2': 208},\n    {'1': 'EN_MSG_TYPE_SYS_FRIEND_APPLY', '2': 210},\n    {'1': 'EN_MSG_TYPE_SYS_FRIEND_APPLY_ACK', '2': 211},\n    {'1': 'EN_MSG_TYPE_SYS_GROUP_APPLY_FOR_JOINING', '2': 212},\n    {'1': 'EN_MSG_TYPE_SYS_GROUP_ADMIN_ACCEPTED_USER_APPLY', '2': 213},\n    {'1': 'EN_MSG_TYPE_CHAT_MEMBER_JOINED', '2': 301},\n    {'1': 'EN_MSG_TYPE_CHAT_MEMBER_EXITED', '2': 302},\n    {'1': 'EN_MSG_TYPE_CHAT_GROUP_FREEZED', '2': 303},\n    {'1': 'EN_MSG_TYPE_CHAT_GROUP_DISSOLVED', '2': 304},\n    {'1': 'EN_MSG_TYPE_CHAT_GROUP_CREATED', '2': 305},\n    {'1': 'EN_MSG_TYPE_CHAT_POPUP_SESSION', '2': 306},\n    {'1': 'EN_MSG_TYPE_CUSTOM_RANK_UPDATE', '2': 400},\n    {'1': 'EN_MSG_TYPE_CUSTOM_MSG_NOTICE', '2': 401},\n  ],\n};\n\n/// Descriptor for `MsgType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List msgTypeDescriptor = $convert.base64Decode(\n    'CgdNc2dUeXBlEhcKE0VOX0lOVkFMSURfTVNHX1RZUEUQABIUChBFTl9NU0dfVFlQRV9URVhUEA'\n    'ESEwoPRU5fTVNHX1RZUEVfUElDEAISFQoRRU5fTVNHX1RZUEVfQVVESU8QAxIVChFFTl9NU0df'\n    'VFlQRV9TSEFSRRAEEhkKFUVOX01TR19UWVBFX0RSQVdfQkFDSxAFEhsKF0VOX01TR19UWVBFX0'\n    'NVU1RPTV9GQUNFEAYSGAoURU5fTVNHX1RZUEVfU0hBUkVfVjIQBxIaChZFTl9NU0dfVFlQRV9T'\n    'WVNfQ0FOQ0VMEAgSHAoYRU5fTVNHX1RZUEVfTUlOSV9QUk9HUkFNEAkSGgoWRU5fTVNHX1RZUE'\n    'VfTk9USUZZX01TRxAKEhoKFkVOX01TR19UWVBFX1ZJREVPX0NBUkQQCxIcChhFTl9NU0dfVFlQ'\n    'RV9BUlRJQ0xFX0NBUkQQDBIcChhFTl9NU0dfVFlQRV9QSUNUVVJFX0NBUkQQDRIhCh1FTl9NU0'\n    'dfVFlQRV9DT01NT05fU0hBUkVfQ0FSRBAOEhoKFkVOX01TR19UWVBFX1RFWFRfU0hBUkUQDxIb'\n    'ChdFTl9NU0dfVFlQRV9USVBfTUVTU0FHRRASEhsKF0VOX01TR19UWVBFX0dQVF9NRVNTQUdFEB'\n    'MSHAoYRU5fTVNHX1RZUEVfQklaX01TR19UWVBFEDISHwobRU5fTVNHX1RZUEVfTU9ESUZZX01T'\n    'R19UWVBFEDMSJAogRU5fTVNHX1RZUEVfR1JPVVBfTUVNQkVSX0NIQU5HRUQQZRIkCiBFTl9NU0'\n    'dfVFlQRV9HUk9VUF9TVEFUVVNfQ0hBTkdFRBBmEiUKIUVOX01TR19UWVBFX0dST1VQX0RZTkFN'\n    'SUNfQ0hBTkdFRBBnEiIKHkVOX01TR19UWVBFX0dST1VQX0xJU1RfQ0hBTkdFRBBoEiMKH0VNX0'\n    '1TR19UWVBFX0ZSSUVORF9MSVNUX0NIQU5HRUQQaRIkCiBFTl9NU0dfVFlQRV9HUk9VUF9ERVRB'\n    'SUxfQ0hBTkdFRBBqEikKJUVOX01TR19UWVBFX0dST1VQX01FTUJFUl9ST0xFX0NIQU5HRUQQax'\n    'IhCh1FTl9NU0dfVFlQRV9OT1RJQ0VfV0FUQ0hfTElTVBBsEikKJUVOX01TR19UWVBFX05PVElG'\n    'WV9ORVdfUkVQTFlfUkVDSUVWRUQQbRImCiJFTl9NU0dfVFlQRV9OT1RJRllfTkVXX0FUX1JFQ0'\n    'lFVkVEEG4SKgomRU5fTVNHX1RZUEVfTk9USUZZX05FV19QUkFJU0VfUkVDSUVWRUQQbxImCiJF'\n    'Tl9NU0dfVFlQRV9OT1RJRllfTkVXX1VQX1JFQ0lFVkVEEHASLAooRU5fTVNHX1RZUEVfTk9USU'\n    'ZZX05FV19SRVBMWV9SRUNJRVZFRF9WMhBxEikKJUVOX01TR19UWVBFX05PVElGWV9ORVdfQVRf'\n    'UkVDSUVWRURfVjIQchItCilFTl9NU0dfVFlQRV9OT1RJRllfTkVXX1BSQUlTRV9SRUNJRVZFRF'\n    '9WMhBzEioKJkVOX01TR19UWVBFX0dST1VQX0RFVEFJTF9DSEFOR0VEX01VTFRJEHQSLworRU5f'\n    'TVNHX1RZUEVfR1JPVVBfTUVNQkVSX1JPTEVfQ0hBTkdFRF9NVUxUSRB1EiMKH0VOX01TR19UWV'\n    'BFX05PVElGWV9BTlRJX0RJU1RVUkIQdhIkCh9FTl9NU0dfVFlQRV9TWVNfR1JPVVBfRElTU09M'\n    'VkVEEMkBEiEKHEVOX01TR19UWVBFX1NZU19HUk9VUF9KT0lORUQQygESKAojRU5fTVNHX1RZUE'\n    'VfU1lTX0dST1VQX01FTUJFUl9FWElURUQQywESJgohRU5fTVNHX1RZUEVfU1lTX0dST1VQX0FE'\n    'TUlOX0ZJUkVEEMwBEigKI0VOX01TR19UWVBFX1NZU19HUk9VUF9NRU1CRVJfS0lDS0VEEM0BEi'\n    'kKJEVOX01TR19UWVBFX1NZU19HUk9VUF9BRE1JTl9LSUNLX09GRhDOARIlCiBFTl9NU0dfVFlQ'\n    'RV9TWVNfR1JPVVBfQURNSU5fRFVUWRDPARInCiJFTl9NU0dfVFlQRV9TWVNfR1JPVVBfQVVUT1'\n    '9DUkVBVEVEENABEiEKHEVOX01TR19UWVBFX1NZU19GUklFTkRfQVBQTFkQ0gESJQogRU5fTVNH'\n    'X1RZUEVfU1lTX0ZSSUVORF9BUFBMWV9BQ0sQ0wESLAonRU5fTVNHX1RZUEVfU1lTX0dST1VQX0'\n    'FQUExZX0ZPUl9KT0lOSU5HENQBEjQKL0VOX01TR19UWVBFX1NZU19HUk9VUF9BRE1JTl9BQ0NF'\n    'UFRFRF9VU0VSX0FQUExZENUBEiMKHkVOX01TR19UWVBFX0NIQVRfTUVNQkVSX0pPSU5FRBCtAh'\n    'IjCh5FTl9NU0dfVFlQRV9DSEFUX01FTUJFUl9FWElURUQQrgISIwoeRU5fTVNHX1RZUEVfQ0hB'\n    'VF9HUk9VUF9GUkVFWkVEEK8CEiUKIEVOX01TR19UWVBFX0NIQVRfR1JPVVBfRElTU09MVkVEEL'\n    'ACEiMKHkVOX01TR19UWVBFX0NIQVRfR1JPVVBfQ1JFQVRFRBCxAhIjCh5FTl9NU0dfVFlQRV9D'\n    'SEFUX1BPUFVQX1NFU1NJT04QsgISIwoeRU5fTVNHX1RZUEVfQ1VTVE9NX1JBTktfVVBEQVRFEJ'\n    'ADEiIKHUVOX01TR19UWVBFX0NVU1RPTV9NU0dfTk9USUNFEJED');\n\n@$core.Deprecated('Use aILogoDescriptor instead')\nconst AILogo$json = {\n  '1': 'AILogo',\n  '2': [\n    {'1': 'ai_mark', '3': 1, '4': 1, '5': 9, '10': 'aiMark'},\n    {'1': 'limit_text', '3': 2, '4': 1, '5': 9, '10': 'limitText'},\n  ],\n};\n\n/// Descriptor for `AILogo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List aILogoDescriptor = $convert.base64Decode(\n    'CgZBSUxvZ28SFwoHYWlfbWFyaxgBIAEoCVIGYWlNYXJrEh0KCmxpbWl0X3RleHQYAiABKAlSCW'\n    'xpbWl0VGV4dA==');\n\n@$core.Deprecated('Use accountInfoDescriptor instead')\nconst AccountInfo$json = {\n  '1': 'AccountInfo',\n  '2': [\n    {'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'pic_url', '3': 2, '4': 1, '5': 9, '10': 'picUrl'},\n  ],\n};\n\n/// Descriptor for `AccountInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List accountInfoDescriptor = $convert.base64Decode(\n    'CgtBY2NvdW50SW5mbxISCgRuYW1lGAEgASgJUgRuYW1lEhcKB3BpY191cmwYAiABKAlSBnBpY1'\n    'VybA==');\n\n@$core.Deprecated('Use aiCardInfoDescriptor instead')\nconst AiCardInfo$json = {\n  '1': 'AiCardInfo',\n  '2': [\n    {'1': 'ai_uid', '3': 1, '4': 1, '5': 3, '10': 'aiUid'},\n    {'1': 'ai_status', '3': 2, '4': 1, '5': 3, '10': 'aiStatus'},\n    {\n      '1': 'u_info',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.UInfo',\n      '10': 'uInfo'\n    },\n    {'1': 'title', '3': 4, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'subtitle', '3': 5, '4': 1, '5': 9, '10': 'subtitle'},\n    {\n      '1': 'ai_logo',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.AILogo',\n      '10': 'aiLogo'\n    },\n    {'1': 'uid', '3': 7, '4': 1, '5': 3, '10': 'uid'},\n  ],\n};\n\n/// Descriptor for `AiCardInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List aiCardInfoDescriptor = $convert.base64Decode(\n    'CgpBaUNhcmRJbmZvEhUKBmFpX3VpZBgBIAEoA1IFYWlVaWQSGwoJYWlfc3RhdHVzGAIgASgDUg'\n    'hhaVN0YXR1cxIuCgZ1X2luZm8YAyABKAsyFy5iaWxpYmlsaS5pbS50eXBlLlVJbmZvUgV1SW5m'\n    'bxIUCgV0aXRsZRgEIAEoCVIFdGl0bGUSGgoIc3VidGl0bGUYBSABKAlSCHN1YnRpdGxlEjEKB2'\n    'FpX2xvZ28YBiABKAsyGC5iaWxpYmlsaS5pbS50eXBlLkFJTG9nb1IGYWlMb2dvEhAKA3VpZBgH'\n    'IAEoA1IDdWlk');\n\n@$core.Deprecated('Use aiEntryDescriptor instead')\nconst AiEntry$json = {\n  '1': 'AiEntry',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'subtitle', '3': 3, '4': 1, '5': 9, '10': 'subtitle'},\n  ],\n};\n\n/// Descriptor for `AiEntry`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List aiEntryDescriptor = $convert.base64Decode(\n    'CgdBaUVudHJ5EhIKBGljb24YASABKAlSBGljb24SFAoFdGl0bGUYAiABKAlSBXRpdGxlEhoKCH'\n    'N1YnRpdGxlGAMgASgJUghzdWJ0aXRsZQ==');\n\n@$core.Deprecated('Use aiInfoDescriptor instead')\nconst AiInfo$json = {\n  '1': 'AiInfo',\n  '2': [\n    {\n      '1': 'card_info',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.AiCardInfo',\n      '10': 'cardInfo'\n    },\n    {\n      '1': 'im_info',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.ImInfo',\n      '10': 'imInfo'\n    },\n    {\n      '1': 'ai_entry',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.AiEntry',\n      '10': 'aiEntry'\n    },\n    {\n      '1': 'story',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.Story',\n      '10': 'story'\n    },\n  ],\n};\n\n/// Descriptor for `AiInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List aiInfoDescriptor = $convert.base64Decode(\n    'CgZBaUluZm8SOQoJY2FyZF9pbmZvGAEgASgLMhwuYmlsaWJpbGkuaW0udHlwZS5BaUNhcmRJbm'\n    'ZvUghjYXJkSW5mbxIxCgdpbV9pbmZvGAIgASgLMhguYmlsaWJpbGkuaW0udHlwZS5JbUluZm9S'\n    'BmltSW5mbxI0CghhaV9lbnRyeRgDIAEoCzIZLmJpbGliaWxpLmltLnR5cGUuQWlFbnRyeVIHYW'\n    'lFbnRyeRItCgVzdG9yeRgEIAEoCzIXLmJpbGliaWxpLmltLnR5cGUuU3RvcnlSBXN0b3J5');\n\n@$core.Deprecated('Use attestationDisplayDescriptor instead')\nconst AttestationDisplay$json = {\n  '1': 'AttestationDisplay',\n  '2': [\n    {'1': 'type', '3': 1, '4': 1, '5': 5, '10': 'type'},\n    {\n      '1': 'common_info',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.CommonInfo',\n      '10': 'commonInfo'\n    },\n    {\n      '1': 'splice_info',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.SpliceInfo',\n      '10': 'spliceInfo'\n    },\n    {'1': 'icon', '3': 4, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'desc', '3': 5, '4': 1, '5': 9, '10': 'desc'},\n  ],\n};\n\n/// Descriptor for `AttestationDisplay`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List attestationDisplayDescriptor = $convert.base64Decode(\n    'ChJBdHRlc3RhdGlvbkRpc3BsYXkSEgoEdHlwZRgBIAEoBVIEdHlwZRI9Cgtjb21tb25faW5mbx'\n    'gCIAEoCzIcLmJpbGliaWxpLmltLnR5cGUuQ29tbW9uSW5mb1IKY29tbW9uSW5mbxI9CgtzcGxp'\n    'Y2VfaW5mbxgDIAEoCzIcLmJpbGliaWxpLmltLnR5cGUuU3BsaWNlSW5mb1IKc3BsaWNlSW5mbx'\n    'ISCgRpY29uGAQgASgJUgRpY29uEhIKBGRlc2MYBSABKAlSBGRlc2M=');\n\n@$core.Deprecated('Use cardDescriptor instead')\nconst Card$json = {\n  '1': 'Card',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'sex', '3': 3, '4': 1, '5': 9, '10': 'sex'},\n    {'1': 'face', '3': 4, '4': 1, '5': 9, '10': 'face'},\n    {'1': 'sign', '3': 5, '4': 1, '5': 9, '10': 'sign'},\n    {'1': 'rank', '3': 6, '4': 1, '5': 5, '10': 'rank'},\n    {'1': 'level', '3': 7, '4': 1, '5': 5, '10': 'level'},\n    {'1': 'silence', '3': 8, '4': 1, '5': 5, '10': 'silence'},\n    {\n      '1': 'vip',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.VipInfo',\n      '10': 'vip'\n    },\n    {\n      '1': 'pendant',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.PendantInfo',\n      '10': 'pendant'\n    },\n    {\n      '1': 'nameplate',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.NameplateInfo',\n      '10': 'nameplate'\n    },\n    {\n      '1': 'official',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.OfficialInfo',\n      '10': 'official'\n    },\n    {'1': 'birthday', '3': 13, '4': 1, '5': 3, '10': 'birthday'},\n    {'1': 'is_fake_account', '3': 20, '4': 1, '5': 5, '10': 'isFakeAccount'},\n    {'1': 'is_deleted', '3': 21, '4': 1, '5': 5, '10': 'isDeleted'},\n    {'1': 'in_reg_audit', '3': 22, '4': 1, '5': 5, '10': 'inRegAudit'},\n    {'1': 'face_nft', '3': 23, '4': 1, '5': 5, '10': 'faceNft'},\n    {'1': 'face_nft_new', '3': 24, '4': 1, '5': 5, '10': 'faceNftNew'},\n    {'1': 'is_senior_member', '3': 25, '4': 1, '5': 5, '10': 'isSeniorMember'},\n    {'1': 'digital_id', '3': 26, '4': 1, '5': 9, '10': 'digitalId'},\n    {'1': 'digital_type', '3': 27, '4': 1, '5': 3, '10': 'digitalType'},\n    {\n      '1': 'attestation',\n      '3': 28,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.AttestationDisplay',\n      '10': 'attestation'\n    },\n    {\n      '1': 'expert_info',\n      '3': 29,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.ExpertInfo',\n      '10': 'expertInfo'\n    },\n    {\n      '1': 'honours',\n      '3': 30,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.UserHonourInfo',\n      '10': 'honours'\n    },\n    {\n      '1': 'name_render',\n      '3': 31,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.account.service.v1.NameRender',\n      '10': 'nameRender'\n    },\n  ],\n};\n\n/// Descriptor for `Card`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cardDescriptor = $convert.base64Decode(\n    'CgRDYXJkEhAKA21pZBgBIAEoA1IDbWlkEhIKBG5hbWUYAiABKAlSBG5hbWUSEAoDc2V4GAMgAS'\n    'gJUgNzZXgSEgoEZmFjZRgEIAEoCVIEZmFjZRISCgRzaWduGAUgASgJUgRzaWduEhIKBHJhbmsY'\n    'BiABKAVSBHJhbmsSFAoFbGV2ZWwYByABKAVSBWxldmVsEhgKB3NpbGVuY2UYCCABKAVSB3NpbG'\n    'VuY2USKwoDdmlwGAkgASgLMhkuYmlsaWJpbGkuaW0udHlwZS5WaXBJbmZvUgN2aXASNwoHcGVu'\n    'ZGFudBgKIAEoCzIdLmJpbGliaWxpLmltLnR5cGUuUGVuZGFudEluZm9SB3BlbmRhbnQSPQoJbm'\n    'FtZXBsYXRlGAsgASgLMh8uYmlsaWJpbGkuaW0udHlwZS5OYW1lcGxhdGVJbmZvUgluYW1lcGxh'\n    'dGUSOgoIb2ZmaWNpYWwYDCABKAsyHi5iaWxpYmlsaS5pbS50eXBlLk9mZmljaWFsSW5mb1IIb2'\n    'ZmaWNpYWwSGgoIYmlydGhkYXkYDSABKANSCGJpcnRoZGF5EiYKD2lzX2Zha2VfYWNjb3VudBgU'\n    'IAEoBVINaXNGYWtlQWNjb3VudBIdCgppc19kZWxldGVkGBUgASgFUglpc0RlbGV0ZWQSIAoMaW'\n    '5fcmVnX2F1ZGl0GBYgASgFUgppblJlZ0F1ZGl0EhkKCGZhY2VfbmZ0GBcgASgFUgdmYWNlTmZ0'\n    'EiAKDGZhY2VfbmZ0X25ldxgYIAEoBVIKZmFjZU5mdE5ldxIoChBpc19zZW5pb3JfbWVtYmVyGB'\n    'kgASgFUg5pc1Nlbmlvck1lbWJlchIdCgpkaWdpdGFsX2lkGBogASgJUglkaWdpdGFsSWQSIQoM'\n    'ZGlnaXRhbF90eXBlGBsgASgDUgtkaWdpdGFsVHlwZRJGCgthdHRlc3RhdGlvbhgcIAEoCzIkLm'\n    'JpbGliaWxpLmltLnR5cGUuQXR0ZXN0YXRpb25EaXNwbGF5UgthdHRlc3RhdGlvbhI9CgtleHBl'\n    'cnRfaW5mbxgdIAEoCzIcLmJpbGliaWxpLmltLnR5cGUuRXhwZXJ0SW5mb1IKZXhwZXJ0SW5mbx'\n    'I6Cgdob25vdXJzGB4gASgLMiAuYmlsaWJpbGkuaW0udHlwZS5Vc2VySG9ub3VySW5mb1IHaG9u'\n    'b3VycxJICgtuYW1lX3JlbmRlchgfIAEoCzInLmJpbGliaWxpLmFjY291bnQuc2VydmljZS52MS'\n    '5OYW1lUmVuZGVyUgpuYW1lUmVuZGVy');\n\n@$core.Deprecated('Use commonInfoDescriptor instead')\nconst CommonInfo$json = {\n  '1': 'CommonInfo',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'prefix', '3': 2, '4': 1, '5': 9, '10': 'prefix'},\n    {'1': 'prefix_title', '3': 3, '4': 1, '5': 9, '10': 'prefixTitle'},\n  ],\n};\n\n/// Descriptor for `CommonInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List commonInfoDescriptor = $convert.base64Decode(\n    'CgpDb21tb25JbmZvEhQKBXRpdGxlGAEgASgJUgV0aXRsZRIWCgZwcmVmaXgYAiABKAlSBnByZW'\n    'ZpeBIhCgxwcmVmaXhfdGl0bGUYAyABKAlSC3ByZWZpeFRpdGxl');\n\n@$core.Deprecated('Use expertInfoDescriptor instead')\nconst ExpertInfo$json = {\n  '1': 'ExpertInfo',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'state', '3': 2, '4': 1, '5': 5, '10': 'state'},\n    {'1': 'type', '3': 3, '4': 1, '5': 5, '10': 'type'},\n    {'1': 'desc', '3': 4, '4': 1, '5': 9, '10': 'desc'},\n  ],\n};\n\n/// Descriptor for `ExpertInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List expertInfoDescriptor = $convert.base64Decode(\n    'CgpFeHBlcnRJbmZvEhQKBXRpdGxlGAEgASgJUgV0aXRsZRIUCgVzdGF0ZRgCIAEoBVIFc3RhdG'\n    'USEgoEdHlwZRgDIAEoBVIEdHlwZRISCgRkZXNjGAQgASgJUgRkZXNj');\n\n@$core.Deprecated('Use friendRelationDescriptor instead')\nconst FriendRelation$json = {\n  '1': 'FriendRelation',\n  '2': [\n    {'1': 'uid', '3': 1, '4': 1, '5': 3, '10': 'uid'},\n    {'1': 'user_name', '3': 2, '4': 1, '5': 9, '10': 'userName'},\n    {'1': 'face', '3': 3, '4': 1, '5': 9, '10': 'face'},\n    {'1': 'vip_level', '3': 4, '4': 1, '5': 5, '10': 'vipLevel'},\n  ],\n};\n\n/// Descriptor for `FriendRelation`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List friendRelationDescriptor = $convert.base64Decode(\n    'Cg5GcmllbmRSZWxhdGlvbhIQCgN1aWQYASABKANSA3VpZBIbCgl1c2VyX25hbWUYAiABKAlSCH'\n    'VzZXJOYW1lEhIKBGZhY2UYAyABKAlSBGZhY2USGwoJdmlwX2xldmVsGAQgASgFUgh2aXBMZXZl'\n    'bA==');\n\n@$core.Deprecated('Use gptMsgContentDescriptor instead')\nconst GptMsgContent$json = {\n  '1': 'GptMsgContent',\n  '2': [\n    {\n      '1': 'content',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.RichTextMsgContent',\n      '10': 'content'\n    },\n    {'1': 'show_like', '3': 2, '4': 1, '5': 8, '10': 'showLike'},\n    {'1': 'show_change', '3': 3, '4': 1, '5': 8, '10': 'showChange'},\n    {'1': 'gpt_session_id', '3': 4, '4': 1, '5': 3, '10': 'gptSessionId'},\n    {'1': 'gpt_bind_query', '3': 5, '4': 1, '5': 9, '10': 'gptBindQuery'},\n    {\n      '1': 'session_closed_line',\n      '3': 6,\n      '4': 1,\n      '5': 9,\n      '10': 'sessionClosedLine'\n    },\n    {'1': 'voice_url', '3': 7, '4': 1, '5': 9, '10': 'voiceUrl'},\n    {'1': 'sub_type', '3': 8, '4': 1, '5': 3, '10': 'subType'},\n    {'1': 'voice_time', '3': 9, '4': 1, '5': 3, '10': 'voiceTime'},\n  ],\n};\n\n/// Descriptor for `GptMsgContent`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List gptMsgContentDescriptor = $convert.base64Decode(\n    'Cg1HcHRNc2dDb250ZW50Ej4KB2NvbnRlbnQYASABKAsyJC5iaWxpYmlsaS5pbS50eXBlLlJpY2'\n    'hUZXh0TXNnQ29udGVudFIHY29udGVudBIbCglzaG93X2xpa2UYAiABKAhSCHNob3dMaWtlEh8K'\n    'C3Nob3dfY2hhbmdlGAMgASgIUgpzaG93Q2hhbmdlEiQKDmdwdF9zZXNzaW9uX2lkGAQgASgDUg'\n    'xncHRTZXNzaW9uSWQSJAoOZ3B0X2JpbmRfcXVlcnkYBSABKAlSDGdwdEJpbmRRdWVyeRIuChNz'\n    'ZXNzaW9uX2Nsb3NlZF9saW5lGAYgASgJUhFzZXNzaW9uQ2xvc2VkTGluZRIbCgl2b2ljZV91cm'\n    'wYByABKAlSCHZvaWNlVXJsEhkKCHN1Yl90eXBlGAggASgDUgdzdWJUeXBlEh0KCnZvaWNlX3Rp'\n    'bWUYCSABKANSCXZvaWNlVGltZQ==');\n\n@$core.Deprecated('Use gptRcmdQuestionBizInfoDescriptor instead')\nconst GptRcmdQuestionBizInfo$json = {\n  '1': 'GptRcmdQuestionBizInfo',\n  '2': [\n    {'1': 'question', '3': 1, '4': 1, '5': 9, '10': 'question'},\n  ],\n};\n\n/// Descriptor for `GptRcmdQuestionBizInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List gptRcmdQuestionBizInfoDescriptor =\n    $convert.base64Decode(\n        'ChZHcHRSY21kUXVlc3Rpb25CaXpJbmZvEhoKCHF1ZXN0aW9uGAEgASgJUghxdWVzdGlvbg==');\n\n@$core.Deprecated('Use groupRelationDescriptor instead')\nconst GroupRelation$json = {\n  '1': 'GroupRelation',\n  '2': [\n    {'1': 'group_id', '3': 1, '4': 1, '5': 3, '10': 'groupId'},\n    {'1': 'owner_uid', '3': 2, '4': 1, '5': 3, '10': 'ownerUid'},\n    {'1': 'group_type', '3': 3, '4': 1, '5': 5, '10': 'groupType'},\n    {'1': 'group_level', '3': 4, '4': 1, '5': 5, '10': 'groupLevel'},\n    {'1': 'group_cover', '3': 5, '4': 1, '5': 9, '10': 'groupCover'},\n    {'1': 'group_name', '3': 6, '4': 1, '5': 9, '10': 'groupName'},\n    {'1': 'group_notice', '3': 7, '4': 1, '5': 9, '10': 'groupNotice'},\n    {'1': 'status', '3': 8, '4': 1, '5': 5, '10': 'status'},\n    {'1': 'member_role', '3': 9, '4': 1, '5': 5, '10': 'memberRole'},\n    {'1': 'fans_medal_name', '3': 10, '4': 1, '5': 9, '10': 'fansMedalName'},\n    {'1': 'room_id', '3': 11, '4': 1, '5': 3, '10': 'roomId'},\n  ],\n};\n\n/// Descriptor for `GroupRelation`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List groupRelationDescriptor = $convert.base64Decode(\n    'Cg1Hcm91cFJlbGF0aW9uEhkKCGdyb3VwX2lkGAEgASgDUgdncm91cElkEhsKCW93bmVyX3VpZB'\n    'gCIAEoA1IIb3duZXJVaWQSHQoKZ3JvdXBfdHlwZRgDIAEoBVIJZ3JvdXBUeXBlEh8KC2dyb3Vw'\n    'X2xldmVsGAQgASgFUgpncm91cExldmVsEh8KC2dyb3VwX2NvdmVyGAUgASgJUgpncm91cENvdm'\n    'VyEh0KCmdyb3VwX25hbWUYBiABKAlSCWdyb3VwTmFtZRIhCgxncm91cF9ub3RpY2UYByABKAlS'\n    'C2dyb3VwTm90aWNlEhYKBnN0YXR1cxgIIAEoBVIGc3RhdHVzEh8KC21lbWJlcl9yb2xlGAkgAS'\n    'gFUgptZW1iZXJSb2xlEiYKD2ZhbnNfbWVkYWxfbmFtZRgKIAEoCVINZmFuc01lZGFsTmFtZRIX'\n    'Cgdyb29tX2lkGAsgASgDUgZyb29tSWQ=');\n\n@$core.Deprecated('Use highTextDescriptor instead')\nconst HighText$json = {\n  '1': 'HighText',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'url', '3': 2, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'index', '3': 3, '4': 1, '5': 5, '10': 'index'},\n  ],\n};\n\n/// Descriptor for `HighText`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List highTextDescriptor = $convert.base64Decode(\n    'CghIaWdoVGV4dBIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSEAoDdXJsGAIgASgJUgN1cmwSFAoFaW'\n    '5kZXgYAyABKAVSBWluZGV4');\n\n@$core.Deprecated('Use honourTagDescriptor instead')\nconst HonourTag$json = {\n  '1': 'HonourTag',\n  '2': [\n    {'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'link', '3': 2, '4': 1, '5': 9, '10': 'link'},\n    {'1': 'web_link', '3': 3, '4': 1, '5': 9, '10': 'webLink'},\n    {'1': 'type', '3': 4, '4': 1, '5': 5, '10': 'type'},\n    {'1': 'scene', '3': 5, '4': 3, '5': 9, '10': 'scene'},\n    {'1': 'priority_level', '3': 6, '4': 1, '5': 5, '10': 'priorityLevel'},\n    {'1': 'icon', '3': 7, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'year', '3': 8, '4': 1, '5': 5, '10': 'year'},\n  ],\n};\n\n/// Descriptor for `HonourTag`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List honourTagDescriptor = $convert.base64Decode(\n    'CglIb25vdXJUYWcSEgoEbmFtZRgBIAEoCVIEbmFtZRISCgRsaW5rGAIgASgJUgRsaW5rEhkKCH'\n    'dlYl9saW5rGAMgASgJUgd3ZWJMaW5rEhIKBHR5cGUYBCABKAVSBHR5cGUSFAoFc2NlbmUYBSAD'\n    'KAlSBXNjZW5lEiUKDnByaW9yaXR5X2xldmVsGAYgASgFUg1wcmlvcml0eUxldmVsEhIKBGljb2'\n    '4YByABKAlSBGljb24SEgoEeWVhchgIIAEoBVIEeWVhcg==');\n\n@$core.Deprecated('Use imInfoDescriptor instead')\nconst ImInfo$json = {\n  '1': 'ImInfo',\n  '2': [\n    {'1': 'background_url', '3': 1, '4': 1, '5': 9, '10': 'backgroundUrl'},\n    {'1': 'ai_prompt', '3': 2, '4': 3, '5': 9, '10': 'aiPrompt'},\n    {'1': 'ai_loading', '3': 3, '4': 1, '5': 9, '10': 'aiLoading'},\n    {'1': 'ai_loading_max', '3': 4, '4': 1, '5': 5, '10': 'aiLoadingMax'},\n  ],\n};\n\n/// Descriptor for `ImInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List imInfoDescriptor = $convert.base64Decode(\n    'CgZJbUluZm8SJQoOYmFja2dyb3VuZF91cmwYASABKAlSDWJhY2tncm91bmRVcmwSGwoJYWlfcH'\n    'JvbXB0GAIgAygJUghhaVByb21wdBIdCgphaV9sb2FkaW5nGAMgASgJUglhaUxvYWRpbmcSJAoO'\n    'YWlfbG9hZGluZ19tYXgYBCABKAVSDGFpTG9hZGluZ01heA==');\n\n@$core.Deprecated('Use imgInfoDescriptor instead')\nconst ImgInfo$json = {\n  '1': 'ImgInfo',\n  '2': [\n    {'1': 'url', '3': 1, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'width', '3': 2, '4': 1, '5': 5, '10': 'width'},\n    {'1': 'height', '3': 3, '4': 1, '5': 5, '10': 'height'},\n    {'1': 'image_type', '3': 4, '4': 1, '5': 9, '10': 'imageType'},\n  ],\n};\n\n/// Descriptor for `ImgInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List imgInfoDescriptor = $convert.base64Decode(\n    'CgdJbWdJbmZvEhAKA3VybBgBIAEoCVIDdXJsEhQKBXdpZHRoGAIgASgFUgV3aWR0aBIWCgZoZW'\n    'lnaHQYAyABKAVSBmhlaWdodBIdCgppbWFnZV90eXBlGAQgASgJUglpbWFnZVR5cGU=');\n\n@$core.Deprecated('Use keyHitInfosDescriptor instead')\nconst KeyHitInfos$json = {\n  '1': 'KeyHitInfos',\n  '2': [\n    {'1': 'toast', '3': 1, '4': 1, '5': 9, '10': 'toast'},\n    {'1': 'rule_id', '3': 2, '4': 1, '5': 5, '10': 'ruleId'},\n    {\n      '1': 'high_text',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.im.type.HighText',\n      '10': 'highText'\n    },\n  ],\n};\n\n/// Descriptor for `KeyHitInfos`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List keyHitInfosDescriptor = $convert.base64Decode(\n    'CgtLZXlIaXRJbmZvcxIUCgV0b2FzdBgBIAEoCVIFdG9hc3QSFwoHcnVsZV9pZBgCIAEoBVIGcn'\n    'VsZUlkEjcKCWhpZ2hfdGV4dBgDIAMoCzIaLmJpbGliaWxpLmltLnR5cGUuSGlnaFRleHRSCGhp'\n    'Z2hUZXh0');\n\n@$core.Deprecated('Use medalDescriptor instead')\nconst Medal$json = {\n  '1': 'Medal',\n  '2': [\n    {'1': 'uid', '3': 1, '4': 1, '5': 3, '10': 'uid'},\n    {'1': 'medal_id', '3': 2, '4': 1, '5': 5, '10': 'medalId'},\n    {'1': 'level', '3': 3, '4': 1, '5': 5, '10': 'level'},\n    {'1': 'medal_name', '3': 4, '4': 1, '5': 9, '10': 'medalName'},\n    {'1': 'score', '3': 5, '4': 1, '5': 5, '10': 'score'},\n    {'1': 'intimacy', '3': 6, '4': 1, '5': 5, '10': 'intimacy'},\n    {'1': 'master_status', '3': 7, '4': 1, '5': 5, '10': 'masterStatus'},\n    {'1': 'is_receive', '3': 8, '4': 1, '5': 5, '10': 'isReceive'},\n    {'1': 'medal_color_start', '3': 9, '4': 1, '5': 3, '10': 'medalColorStart'},\n    {'1': 'medal_color_end', '3': 10, '4': 1, '5': 3, '10': 'medalColorEnd'},\n    {\n      '1': 'medal_color_border',\n      '3': 11,\n      '4': 1,\n      '5': 3,\n      '10': 'medalColorBorder'\n    },\n    {'1': 'medal_color_name', '3': 12, '4': 1, '5': 3, '10': 'medalColorName'},\n    {\n      '1': 'medal_color_level',\n      '3': 13,\n      '4': 1,\n      '5': 3,\n      '10': 'medalColorLevel'\n    },\n    {'1': 'guard_level', '3': 14, '4': 1, '5': 3, '10': 'guardLevel'},\n  ],\n};\n\n/// Descriptor for `Medal`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List medalDescriptor = $convert.base64Decode(\n    'CgVNZWRhbBIQCgN1aWQYASABKANSA3VpZBIZCghtZWRhbF9pZBgCIAEoBVIHbWVkYWxJZBIUCg'\n    'VsZXZlbBgDIAEoBVIFbGV2ZWwSHQoKbWVkYWxfbmFtZRgEIAEoCVIJbWVkYWxOYW1lEhQKBXNj'\n    'b3JlGAUgASgFUgVzY29yZRIaCghpbnRpbWFjeRgGIAEoBVIIaW50aW1hY3kSIwoNbWFzdGVyX3'\n    'N0YXR1cxgHIAEoBVIMbWFzdGVyU3RhdHVzEh0KCmlzX3JlY2VpdmUYCCABKAVSCWlzUmVjZWl2'\n    'ZRIqChFtZWRhbF9jb2xvcl9zdGFydBgJIAEoA1IPbWVkYWxDb2xvclN0YXJ0EiYKD21lZGFsX2'\n    'NvbG9yX2VuZBgKIAEoA1INbWVkYWxDb2xvckVuZBIsChJtZWRhbF9jb2xvcl9ib3JkZXIYCyAB'\n    'KANSEG1lZGFsQ29sb3JCb3JkZXISKAoQbWVkYWxfY29sb3JfbmFtZRgMIAEoA1IObWVkYWxDb2'\n    'xvck5hbWUSKgoRbWVkYWxfY29sb3JfbGV2ZWwYDSABKANSD21lZGFsQ29sb3JMZXZlbBIfCgtn'\n    'dWFyZF9sZXZlbBgOIAEoA1IKZ3VhcmRMZXZlbA==');\n\n@$core.Deprecated('Use msgDescriptor instead')\nconst Msg$json = {\n  '1': 'Msg',\n  '2': [\n    {'1': 'sender_uid', '3': 1, '4': 1, '5': 3, '10': 'senderUid'},\n    {'1': 'receiver_type', '3': 2, '4': 1, '5': 5, '10': 'receiverType'},\n    {'1': 'receiver_id', '3': 3, '4': 1, '5': 3, '10': 'receiverId'},\n    {'1': 'cli_msg_id', '3': 4, '4': 1, '5': 3, '10': 'cliMsgId'},\n    {'1': 'msg_type', '3': 5, '4': 1, '5': 5, '10': 'msgType'},\n    {'1': 'content', '3': 6, '4': 1, '5': 9, '10': 'content'},\n    {'1': 'msg_seqno', '3': 7, '4': 1, '5': 3, '10': 'msgSeqno'},\n    {'1': 'timestamp', '3': 8, '4': 1, '5': 3, '10': 'timestamp'},\n    {'1': 'at_uids', '3': 9, '4': 3, '5': 3, '10': 'atUids'},\n    {'1': 'recver_ids', '3': 10, '4': 3, '5': 3, '10': 'recverIds'},\n    {'1': 'msg_key', '3': 11, '4': 1, '5': 3, '10': 'msgKey'},\n    {'1': 'msg_status', '3': 12, '4': 1, '5': 5, '10': 'msgStatus'},\n    {'1': 'sys_cancel', '3': 13, '4': 1, '5': 8, '10': 'sysCancel'},\n    {'1': 'notify_code', '3': 14, '4': 1, '5': 9, '10': 'notifyCode'},\n    {'1': 'msg_source', '3': 15, '4': 1, '5': 5, '10': 'msgSource'},\n    {'1': 'new_face_version', '3': 16, '4': 1, '5': 5, '10': 'newFaceVersion'},\n    {\n      '1': 'key_hit_infos',\n      '3': 17,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.KeyHitInfos',\n      '10': 'keyHitInfos'\n    },\n    {\n      '1': 'account_info',\n      '3': 18,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.AccountInfo',\n      '10': 'accountInfo'\n    },\n    {\n      '1': 'gpt_msg_content',\n      '3': 19,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.GptMsgContent',\n      '10': 'gptMsgContent'\n    },\n    {'1': 'canal_token', '3': 20, '4': 1, '5': 9, '10': 'canalToken'},\n  ],\n};\n\n/// Descriptor for `Msg`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List msgDescriptor = $convert.base64Decode(\n    'CgNNc2cSHQoKc2VuZGVyX3VpZBgBIAEoA1IJc2VuZGVyVWlkEiMKDXJlY2VpdmVyX3R5cGUYAi'\n    'ABKAVSDHJlY2VpdmVyVHlwZRIfCgtyZWNlaXZlcl9pZBgDIAEoA1IKcmVjZWl2ZXJJZBIcCgpj'\n    'bGlfbXNnX2lkGAQgASgDUghjbGlNc2dJZBIZCghtc2dfdHlwZRgFIAEoBVIHbXNnVHlwZRIYCg'\n    'djb250ZW50GAYgASgJUgdjb250ZW50EhsKCW1zZ19zZXFubxgHIAEoA1IIbXNnU2Vxbm8SHAoJ'\n    'dGltZXN0YW1wGAggASgDUgl0aW1lc3RhbXASFwoHYXRfdWlkcxgJIAMoA1IGYXRVaWRzEh0KCn'\n    'JlY3Zlcl9pZHMYCiADKANSCXJlY3ZlcklkcxIXCgdtc2dfa2V5GAsgASgDUgZtc2dLZXkSHQoK'\n    'bXNnX3N0YXR1cxgMIAEoBVIJbXNnU3RhdHVzEh0KCnN5c19jYW5jZWwYDSABKAhSCXN5c0Nhbm'\n    'NlbBIfCgtub3RpZnlfY29kZRgOIAEoCVIKbm90aWZ5Q29kZRIdCgptc2dfc291cmNlGA8gASgF'\n    'Ugltc2dTb3VyY2USKAoQbmV3X2ZhY2VfdmVyc2lvbhgQIAEoBVIObmV3RmFjZVZlcnNpb24SQQ'\n    'oNa2V5X2hpdF9pbmZvcxgRIAEoCzIdLmJpbGliaWxpLmltLnR5cGUuS2V5SGl0SW5mb3NSC2tl'\n    'eUhpdEluZm9zEkAKDGFjY291bnRfaW5mbxgSIAEoCzIdLmJpbGliaWxpLmltLnR5cGUuQWNjb3'\n    'VudEluZm9SC2FjY291bnRJbmZvEkcKD2dwdF9tc2dfY29udGVudBgTIAEoCzIfLmJpbGliaWxp'\n    'LmltLnR5cGUuR3B0TXNnQ29udGVudFINZ3B0TXNnQ29udGVudBIfCgtjYW5hbF90b2tlbhgUIA'\n    'EoCVIKY2FuYWxUb2tlbg==');\n\n@$core.Deprecated('Use nameplateInfoDescriptor instead')\nconst NameplateInfo$json = {\n  '1': 'NameplateInfo',\n  '2': [\n    {'1': 'nid', '3': 1, '4': 1, '5': 5, '10': 'nid'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'image', '3': 3, '4': 1, '5': 9, '10': 'image'},\n    {'1': 'image_small', '3': 4, '4': 1, '5': 9, '10': 'imageSmall'},\n    {'1': 'level', '3': 5, '4': 1, '5': 9, '10': 'level'},\n    {'1': 'condition', '3': 6, '4': 1, '5': 9, '10': 'condition'},\n  ],\n};\n\n/// Descriptor for `NameplateInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List nameplateInfoDescriptor = $convert.base64Decode(\n    'Cg1OYW1lcGxhdGVJbmZvEhAKA25pZBgBIAEoBVIDbmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSFA'\n    'oFaW1hZ2UYAyABKAlSBWltYWdlEh8KC2ltYWdlX3NtYWxsGAQgASgJUgppbWFnZVNtYWxsEhQK'\n    'BWxldmVsGAUgASgJUgVsZXZlbBIcCgljb25kaXRpb24YBiABKAlSCWNvbmRpdGlvbg==');\n\n@$core.Deprecated('Use officialInfoDescriptor instead')\nconst OfficialInfo$json = {\n  '1': 'OfficialInfo',\n  '2': [\n    {'1': 'role', '3': 1, '4': 1, '5': 5, '10': 'role'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'desc', '3': 3, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'type', '3': 4, '4': 1, '5': 5, '10': 'type'},\n  ],\n};\n\n/// Descriptor for `OfficialInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List officialInfoDescriptor = $convert.base64Decode(\n    'CgxPZmZpY2lhbEluZm8SEgoEcm9sZRgBIAEoBVIEcm9sZRIUCgV0aXRsZRgCIAEoCVIFdGl0bG'\n    'USEgoEZGVzYxgDIAEoCVIEZGVzYxISCgR0eXBlGAQgASgFUgR0eXBl');\n\n@$core.Deprecated('Use pendantInfoDescriptor instead')\nconst PendantInfo$json = {\n  '1': 'PendantInfo',\n  '2': [\n    {'1': 'pid', '3': 1, '4': 1, '5': 5, '10': 'pid'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'image', '3': 3, '4': 1, '5': 9, '10': 'image'},\n    {'1': 'expire', '3': 4, '4': 1, '5': 3, '10': 'expire'},\n    {'1': 'image_enhance', '3': 5, '4': 1, '5': 9, '10': 'imageEnhance'},\n    {\n      '1': 'image_enhance_frame',\n      '3': 6,\n      '4': 1,\n      '5': 9,\n      '10': 'imageEnhanceFrame'\n    },\n  ],\n};\n\n/// Descriptor for `PendantInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pendantInfoDescriptor = $convert.base64Decode(\n    'CgtQZW5kYW50SW5mbxIQCgNwaWQYASABKAVSA3BpZBISCgRuYW1lGAIgASgJUgRuYW1lEhQKBW'\n    'ltYWdlGAMgASgJUgVpbWFnZRIWCgZleHBpcmUYBCABKANSBmV4cGlyZRIjCg1pbWFnZV9lbmhh'\n    'bmNlGAUgASgJUgxpbWFnZUVuaGFuY2USLgoTaW1hZ2VfZW5oYW5jZV9mcmFtZRgGIAEoCVIRaW'\n    '1hZ2VFbmhhbmNlRnJhbWU=');\n\n@$core.Deprecated('Use promptDescriptor instead')\nconst Prompt$json = {\n  '1': 'Prompt',\n  '2': [\n    {'1': 'msg', '3': 1, '4': 1, '5': 9, '10': 'msg'},\n  ],\n};\n\n/// Descriptor for `Prompt`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List promptDescriptor =\n    $convert.base64Decode('CgZQcm9tcHQSEAoDbXNnGAEgASgJUgNtc2c=');\n\n@$core.Deprecated('Use relationLogDescriptor instead')\nconst RelationLog$json = {\n  '1': 'RelationLog',\n  '2': [\n    {'1': 'log_type', '3': 1, '4': 1, '5': 5, '10': 'logType'},\n    {'1': 'oplog_seqno', '3': 2, '4': 1, '5': 3, '10': 'oplogSeqno'},\n    {\n      '1': 'friend_relation',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.FriendRelation',\n      '10': 'friendRelation'\n    },\n    {\n      '1': 'group_relation',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.GroupRelation',\n      '10': 'groupRelation'\n    },\n  ],\n};\n\n/// Descriptor for `RelationLog`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List relationLogDescriptor = $convert.base64Decode(\n    'CgtSZWxhdGlvbkxvZxIZCghsb2dfdHlwZRgBIAEoBVIHbG9nVHlwZRIfCgtvcGxvZ19zZXFubx'\n    'gCIAEoA1IKb3Bsb2dTZXFubxJJCg9mcmllbmRfcmVsYXRpb24YAyABKAsyIC5iaWxpYmlsaS5p'\n    'bS50eXBlLkZyaWVuZFJlbGF0aW9uUg5mcmllbmRSZWxhdGlvbhJGCg5ncm91cF9yZWxhdGlvbh'\n    'gEIAEoCzIfLmJpbGliaWxpLmltLnR5cGUuR3JvdXBSZWxhdGlvblINZ3JvdXBSZWxhdGlvbg==');\n\n@$core.Deprecated('Use richTextMsgContentDescriptor instead')\nconst RichTextMsgContent$json = {\n  '1': 'RichTextMsgContent',\n  '2': [\n    {\n      '1': 'paragraphs',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.Paragraph',\n      '10': 'paragraphs'\n    },\n  ],\n};\n\n/// Descriptor for `RichTextMsgContent`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List richTextMsgContentDescriptor = $convert.base64Decode(\n    'ChJSaWNoVGV4dE1zZ0NvbnRlbnQSQgoKcGFyYWdyYXBocxgBIAMoCzIiLmJpbGliaWxpLmFwcC'\n    '5keW5hbWljLnYyLlBhcmFncmFwaFIKcGFyYWdyYXBocw==');\n\n@$core.Deprecated('Use sessionInfoDescriptor instead')\nconst SessionInfo$json = {\n  '1': 'SessionInfo',\n  '2': [\n    {'1': 'talker_id', '3': 1, '4': 1, '5': 3, '10': 'talkerId'},\n    {'1': 'session_type', '3': 2, '4': 1, '5': 5, '10': 'sessionType'},\n    {'1': 'at_seqno', '3': 3, '4': 1, '5': 3, '10': 'atSeqno'},\n    {'1': 'top_ts', '3': 4, '4': 1, '5': 3, '10': 'topTs'},\n    {'1': 'group_name', '3': 5, '4': 1, '5': 9, '10': 'groupName'},\n    {'1': 'group_cover', '3': 6, '4': 1, '5': 9, '10': 'groupCover'},\n    {'1': 'is_follow', '3': 7, '4': 1, '5': 5, '10': 'isFollow'},\n    {'1': 'is_dnd', '3': 8, '4': 1, '5': 5, '10': 'isDnd'},\n    {'1': 'ack_seqno', '3': 9, '4': 1, '5': 3, '10': 'ackSeqno'},\n    {'1': 'ack_ts', '3': 10, '4': 1, '5': 3, '10': 'ackTs'},\n    {'1': 'session_ts', '3': 11, '4': 1, '5': 3, '10': 'sessionTs'},\n    {'1': 'unread_count', '3': 12, '4': 1, '5': 5, '10': 'unreadCount'},\n    {\n      '1': 'last_msg',\n      '3': 13,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.Msg',\n      '10': 'lastMsg'\n    },\n    {'1': 'group_type', '3': 14, '4': 1, '5': 5, '10': 'groupType'},\n    {'1': 'can_fold', '3': 15, '4': 1, '5': 5, '10': 'canFold'},\n    {'1': 'status', '3': 16, '4': 1, '5': 5, '10': 'status'},\n    {'1': 'max_seqno', '3': 17, '4': 1, '5': 3, '10': 'maxSeqno'},\n    {'1': 'new_push_msg', '3': 18, '4': 1, '5': 5, '10': 'newPushMsg'},\n    {'1': 'setting', '3': 19, '4': 1, '5': 5, '10': 'setting'},\n    {'1': 'is_guardian', '3': 20, '4': 1, '5': 5, '10': 'isGuardian'},\n    {'1': 'is_intercept', '3': 21, '4': 1, '5': 5, '10': 'isIntercept'},\n    {'1': 'is_trust', '3': 22, '4': 1, '5': 5, '10': 'isTrust'},\n    {'1': 'system_msg_type', '3': 23, '4': 1, '5': 5, '10': 'systemMsgType'},\n    {\n      '1': 'account_info',\n      '3': 24,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.AccountInfo',\n      '10': 'accountInfo'\n    },\n    {'1': 'live_status', '3': 25, '4': 1, '5': 5, '10': 'liveStatus'},\n    {\n      '1': 'biz_msg_unread_count',\n      '3': 26,\n      '4': 1,\n      '5': 5,\n      '10': 'bizMsgUnreadCount'\n    },\n    {\n      '1': 'user_label',\n      '3': 27,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.UserLabel',\n      '10': 'userLabel'\n    },\n    {'1': 'is_huahuo', '3': 28, '4': 1, '5': 5, '10': 'isHuahuo'},\n    {\n      '1': 'u_info',\n      '3': 29,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.UInfo',\n      '10': 'uInfo'\n    },\n    {'1': 'stranger', '3': 30, '4': 1, '5': 5, '10': 'stranger'},\n    {\n      '1': 'ai_info',\n      '3': 31,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.AiInfo',\n      '10': 'aiInfo'\n    },\n    {'1': 'is_hide_edit', '3': 32, '4': 1, '5': 8, '10': 'isHideEdit'},\n    {\n      '1': 'ext',\n      '3': 33,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.SessionInfoExt',\n      '10': 'ext'\n    },\n  ],\n};\n\n/// Descriptor for `SessionInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sessionInfoDescriptor = $convert.base64Decode(\n    'CgtTZXNzaW9uSW5mbxIbCgl0YWxrZXJfaWQYASABKANSCHRhbGtlcklkEiEKDHNlc3Npb25fdH'\n    'lwZRgCIAEoBVILc2Vzc2lvblR5cGUSGQoIYXRfc2Vxbm8YAyABKANSB2F0U2Vxbm8SFQoGdG9w'\n    'X3RzGAQgASgDUgV0b3BUcxIdCgpncm91cF9uYW1lGAUgASgJUglncm91cE5hbWUSHwoLZ3JvdX'\n    'BfY292ZXIYBiABKAlSCmdyb3VwQ292ZXISGwoJaXNfZm9sbG93GAcgASgFUghpc0ZvbGxvdxIV'\n    'CgZpc19kbmQYCCABKAVSBWlzRG5kEhsKCWFja19zZXFubxgJIAEoA1IIYWNrU2Vxbm8SFQoGYW'\n    'NrX3RzGAogASgDUgVhY2tUcxIdCgpzZXNzaW9uX3RzGAsgASgDUglzZXNzaW9uVHMSIQoMdW5y'\n    'ZWFkX2NvdW50GAwgASgFUgt1bnJlYWRDb3VudBIwCghsYXN0X21zZxgNIAEoCzIVLmJpbGliaW'\n    'xpLmltLnR5cGUuTXNnUgdsYXN0TXNnEh0KCmdyb3VwX3R5cGUYDiABKAVSCWdyb3VwVHlwZRIZ'\n    'CghjYW5fZm9sZBgPIAEoBVIHY2FuRm9sZBIWCgZzdGF0dXMYECABKAVSBnN0YXR1cxIbCgltYX'\n    'hfc2Vxbm8YESABKANSCG1heFNlcW5vEiAKDG5ld19wdXNoX21zZxgSIAEoBVIKbmV3UHVzaE1z'\n    'ZxIYCgdzZXR0aW5nGBMgASgFUgdzZXR0aW5nEh8KC2lzX2d1YXJkaWFuGBQgASgFUgppc0d1YX'\n    'JkaWFuEiEKDGlzX2ludGVyY2VwdBgVIAEoBVILaXNJbnRlcmNlcHQSGQoIaXNfdHJ1c3QYFiAB'\n    'KAVSB2lzVHJ1c3QSJgoPc3lzdGVtX21zZ190eXBlGBcgASgFUg1zeXN0ZW1Nc2dUeXBlEkAKDG'\n    'FjY291bnRfaW5mbxgYIAEoCzIdLmJpbGliaWxpLmltLnR5cGUuQWNjb3VudEluZm9SC2FjY291'\n    'bnRJbmZvEh8KC2xpdmVfc3RhdHVzGBkgASgFUgpsaXZlU3RhdHVzEi8KFGJpel9tc2dfdW5yZW'\n    'FkX2NvdW50GBogASgFUhFiaXpNc2dVbnJlYWRDb3VudBI6Cgp1c2VyX2xhYmVsGBsgASgLMhsu'\n    'YmlsaWJpbGkuaW0udHlwZS5Vc2VyTGFiZWxSCXVzZXJMYWJlbBIbCglpc19odWFodW8YHCABKA'\n    'VSCGlzSHVhaHVvEi4KBnVfaW5mbxgdIAEoCzIXLmJpbGliaWxpLmltLnR5cGUuVUluZm9SBXVJ'\n    'bmZvEhoKCHN0cmFuZ2VyGB4gASgFUghzdHJhbmdlchIxCgdhaV9pbmZvGB8gASgLMhguYmlsaW'\n    'JpbGkuaW0udHlwZS5BaUluZm9SBmFpSW5mbxIgCgxpc19oaWRlX2VkaXQYICABKAhSCmlzSGlk'\n    'ZUVkaXQSMgoDZXh0GCEgASgLMiAuYmlsaWJpbGkuaW0udHlwZS5TZXNzaW9uSW5mb0V4dFIDZX'\n    'h0');\n\n@$core.Deprecated('Use sessionInfoExtDescriptor instead')\nconst SessionInfoExt$json = {\n  '1': 'SessionInfoExt',\n  '2': [\n    {'1': 'shop_id', '3': 1, '4': 1, '5': 3, '10': 'shopId'},\n    {'1': 'shop_father_id', '3': 2, '4': 1, '5': 3, '10': 'shopFatherId'},\n  ],\n};\n\n/// Descriptor for `SessionInfoExt`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sessionInfoExtDescriptor = $convert.base64Decode(\n    'Cg5TZXNzaW9uSW5mb0V4dBIXCgdzaG9wX2lkGAEgASgDUgZzaG9wSWQSJAoOc2hvcF9mYXRoZX'\n    'JfaWQYAiABKANSDHNob3BGYXRoZXJJZA==');\n\n@$core.Deprecated('Use spliceInfoDescriptor instead')\nconst SpliceInfo$json = {\n  '1': 'SpliceInfo',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n  ],\n};\n\n/// Descriptor for `SpliceInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List spliceInfoDescriptor =\n    $convert.base64Decode('CgpTcGxpY2VJbmZvEhQKBXRpdGxlGAEgASgJUgV0aXRsZQ==');\n\n@$core.Deprecated('Use storyDescriptor instead')\nconst Story$json = {\n  '1': 'Story',\n  '2': [\n    {'1': 'tip', '3': 1, '4': 1, '5': 9, '10': 'tip'},\n    {\n      '1': 'items',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.im.type.StoryItem',\n      '10': 'items'\n    },\n  ],\n};\n\n/// Descriptor for `Story`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List storyDescriptor = $convert.base64Decode(\n    'CgVTdG9yeRIQCgN0aXAYASABKAlSA3RpcBIxCgVpdGVtcxgCIAMoCzIbLmJpbGliaWxpLmltLn'\n    'R5cGUuU3RvcnlJdGVtUgVpdGVtcw==');\n\n@$core.Deprecated('Use storyItemDescriptor instead')\nconst StoryItem$json = {\n  '1': 'StoryItem',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'show_name', '3': 2, '4': 1, '5': 9, '10': 'showName'},\n    {'1': 'ai_msg', '3': 3, '4': 1, '5': 9, '10': 'aiMsg'},\n    {'1': 'selected', '3': 4, '4': 1, '5': 8, '10': 'selected'},\n    {\n      '1': 'prompts',\n      '3': 5,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.im.type.Prompt',\n      '10': 'prompts'\n    },\n  ],\n};\n\n/// Descriptor for `StoryItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List storyItemDescriptor = $convert.base64Decode(\n    'CglTdG9yeUl0ZW0SDgoCaWQYASABKANSAmlkEhsKCXNob3dfbmFtZRgCIAEoCVIIc2hvd05hbW'\n    'USFQoGYWlfbXNnGAMgASgJUgVhaU1zZxIaCghzZWxlY3RlZBgEIAEoCFIIc2VsZWN0ZWQSMgoH'\n    'cHJvbXB0cxgFIAMoCzIYLmJpbGliaWxpLmltLnR5cGUuUHJvbXB0Ugdwcm9tcHRz');\n\n@$core.Deprecated('Use uInfoDescriptor instead')\nconst UInfo$json = {\n  '1': 'UInfo',\n  '2': [\n    {\n      '1': 'ava',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.AvatarItem',\n      '10': 'ava'\n    },\n    {\n      '1': 'card',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.Card',\n      '10': 'card'\n    },\n  ],\n};\n\n/// Descriptor for `UInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List uInfoDescriptor = $convert.base64Decode(\n    'CgVVSW5mbxI/CgNhdmEYASABKAsyLS5iaWxpYmlsaS5kYWd3LmNvbXBvbmVudC5hdmF0YXIudj'\n    'EuQXZhdGFySXRlbVIDYXZhEioKBGNhcmQYAiABKAsyFi5iaWxpYmlsaS5pbS50eXBlLkNhcmRS'\n    'BGNhcmQ=');\n\n@$core.Deprecated('Use userHonourInfoDescriptor instead')\nconst UserHonourInfo$json = {\n  '1': 'UserHonourInfo',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {\n      '1': 'colour',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.UserHonourStyle',\n      '10': 'colour'\n    },\n    {\n      '1': 'tags',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.im.type.HonourTag',\n      '10': 'tags'\n    },\n  ],\n};\n\n/// Descriptor for `UserHonourInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List userHonourInfoDescriptor = $convert.base64Decode(\n    'Cg5Vc2VySG9ub3VySW5mbxIQCgNtaWQYASABKANSA21pZBI5CgZjb2xvdXIYAiABKAsyIS5iaW'\n    'xpYmlsaS5pbS50eXBlLlVzZXJIb25vdXJTdHlsZVIGY29sb3VyEi8KBHRhZ3MYAyADKAsyGy5i'\n    'aWxpYmlsaS5pbS50eXBlLkhvbm91clRhZ1IEdGFncw==');\n\n@$core.Deprecated('Use userHonourStyleDescriptor instead')\nconst UserHonourStyle$json = {\n  '1': 'UserHonourStyle',\n  '2': [\n    {'1': 'dark', '3': 1, '4': 1, '5': 9, '10': 'dark'},\n    {'1': 'normal', '3': 2, '4': 1, '5': 9, '10': 'normal'},\n  ],\n};\n\n/// Descriptor for `UserHonourStyle`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List userHonourStyleDescriptor = $convert.base64Decode(\n    'Cg9Vc2VySG9ub3VyU3R5bGUSEgoEZGFyaxgBIAEoCVIEZGFyaxIWCgZub3JtYWwYAiABKAlSBm'\n    '5vcm1hbA==');\n\n@$core.Deprecated('Use userLabelDescriptor instead')\nconst UserLabel$json = {\n  '1': 'UserLabel',\n  '2': [\n    {'1': 'label_type', '3': 1, '4': 1, '5': 5, '10': 'labelType'},\n    {\n      '1': 'medal',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.Medal',\n      '10': 'medal'\n    },\n    {\n      '1': 'guardian_relation',\n      '3': 3,\n      '4': 1,\n      '5': 5,\n      '10': 'guardianRelation'\n    },\n  ],\n};\n\n/// Descriptor for `UserLabel`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List userLabelDescriptor = $convert.base64Decode(\n    'CglVc2VyTGFiZWwSHQoKbGFiZWxfdHlwZRgBIAEoBVIJbGFiZWxUeXBlEi0KBW1lZGFsGAIgAS'\n    'gLMhcuYmlsaWJpbGkuaW0udHlwZS5NZWRhbFIFbWVkYWwSKwoRZ3VhcmRpYW5fcmVsYXRpb24Y'\n    'AyABKAVSEGd1YXJkaWFuUmVsYXRpb24=');\n\n@$core.Deprecated('Use vipInfoDescriptor instead')\nconst VipInfo$json = {\n  '1': 'VipInfo',\n  '2': [\n    {'1': 'type', '3': 1, '4': 1, '5': 5, '10': 'type'},\n    {'1': 'status', '3': 2, '4': 1, '5': 5, '10': 'status'},\n    {'1': 'due_date', '3': 3, '4': 1, '5': 3, '10': 'dueDate'},\n    {'1': 'vip_pay_type', '3': 4, '4': 1, '5': 5, '10': 'vipPayType'},\n    {'1': 'theme_type', '3': 5, '4': 1, '5': 5, '10': 'themeType'},\n    {\n      '1': 'label',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.im.type.VipLabel',\n      '10': 'label'\n    },\n    {'1': 'avatar_subscript', '3': 7, '4': 1, '5': 5, '10': 'avatarSubscript'},\n    {'1': 'nickname_color', '3': 8, '4': 1, '5': 9, '10': 'nicknameColor'},\n    {'1': 'role', '3': 9, '4': 1, '5': 3, '10': 'role'},\n    {\n      '1': 'avatar_subscript_url',\n      '3': 10,\n      '4': 1,\n      '5': 9,\n      '10': 'avatarSubscriptUrl'\n    },\n    {'1': 'tv_vip_status', '3': 11, '4': 1, '5': 5, '10': 'tvVipStatus'},\n    {'1': 'tv_vip_pay_type', '3': 12, '4': 1, '5': 5, '10': 'tvVipPayType'},\n    {'1': 'tv_due_date', '3': 13, '4': 1, '5': 3, '10': 'tvDueDate'},\n  ],\n};\n\n/// Descriptor for `VipInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List vipInfoDescriptor = $convert.base64Decode(\n    'CgdWaXBJbmZvEhIKBHR5cGUYASABKAVSBHR5cGUSFgoGc3RhdHVzGAIgASgFUgZzdGF0dXMSGQ'\n    'oIZHVlX2RhdGUYAyABKANSB2R1ZURhdGUSIAoMdmlwX3BheV90eXBlGAQgASgFUgp2aXBQYXlU'\n    'eXBlEh0KCnRoZW1lX3R5cGUYBSABKAVSCXRoZW1lVHlwZRIwCgVsYWJlbBgGIAEoCzIaLmJpbG'\n    'liaWxpLmltLnR5cGUuVmlwTGFiZWxSBWxhYmVsEikKEGF2YXRhcl9zdWJzY3JpcHQYByABKAVS'\n    'D2F2YXRhclN1YnNjcmlwdBIlCg5uaWNrbmFtZV9jb2xvchgIIAEoCVINbmlja25hbWVDb2xvch'\n    'ISCgRyb2xlGAkgASgDUgRyb2xlEjAKFGF2YXRhcl9zdWJzY3JpcHRfdXJsGAogASgJUhJhdmF0'\n    'YXJTdWJzY3JpcHRVcmwSIgoNdHZfdmlwX3N0YXR1cxgLIAEoBVILdHZWaXBTdGF0dXMSJQoPdH'\n    'ZfdmlwX3BheV90eXBlGAwgASgFUgx0dlZpcFBheVR5cGUSHgoLdHZfZHVlX2RhdGUYDSABKANS'\n    'CXR2RHVlRGF0ZQ==');\n\n@$core.Deprecated('Use vipLabelDescriptor instead')\nconst VipLabel$json = {\n  '1': 'VipLabel',\n  '2': [\n    {'1': 'path', '3': 1, '4': 1, '5': 9, '10': 'path'},\n    {'1': 'text', '3': 3, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'label_theme', '3': 4, '4': 1, '5': 9, '10': 'labelTheme'},\n    {'1': 'text_color', '3': 5, '4': 1, '5': 9, '10': 'textColor'},\n    {'1': 'bg_style', '3': 6, '4': 1, '5': 5, '10': 'bgStyle'},\n    {'1': 'bg_color', '3': 7, '4': 1, '5': 9, '10': 'bgColor'},\n    {'1': 'border_color', '3': 8, '4': 1, '5': 9, '10': 'borderColor'},\n    {'1': 'use_img_label', '3': 9, '4': 1, '5': 8, '10': 'useImgLabel'},\n    {\n      '1': 'img_label_uri_hans',\n      '3': 10,\n      '4': 1,\n      '5': 9,\n      '10': 'imgLabelUriHans'\n    },\n    {\n      '1': 'img_label_uri_hant',\n      '3': 11,\n      '4': 1,\n      '5': 9,\n      '10': 'imgLabelUriHant'\n    },\n    {\n      '1': 'img_label_uri_hans_static',\n      '3': 12,\n      '4': 1,\n      '5': 9,\n      '10': 'imgLabelUriHansStatic'\n    },\n    {\n      '1': 'img_label_uri_hant_static',\n      '3': 13,\n      '4': 1,\n      '5': 9,\n      '10': 'imgLabelUriHantStatic'\n    },\n  ],\n};\n\n/// Descriptor for `VipLabel`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List vipLabelDescriptor = $convert.base64Decode(\n    'CghWaXBMYWJlbBISCgRwYXRoGAEgASgJUgRwYXRoEhIKBHRleHQYAyABKAlSBHRleHQSHwoLbG'\n    'FiZWxfdGhlbWUYBCABKAlSCmxhYmVsVGhlbWUSHQoKdGV4dF9jb2xvchgFIAEoCVIJdGV4dENv'\n    'bG9yEhkKCGJnX3N0eWxlGAYgASgFUgdiZ1N0eWxlEhkKCGJnX2NvbG9yGAcgASgJUgdiZ0NvbG'\n    '9yEiEKDGJvcmRlcl9jb2xvchgIIAEoCVILYm9yZGVyQ29sb3ISIgoNdXNlX2ltZ19sYWJlbBgJ'\n    'IAEoCFILdXNlSW1nTGFiZWwSKwoSaW1nX2xhYmVsX3VyaV9oYW5zGAogASgJUg9pbWdMYWJlbF'\n    'VyaUhhbnMSKwoSaW1nX2xhYmVsX3VyaV9oYW50GAsgASgJUg9pbWdMYWJlbFVyaUhhbnQSOAoZ'\n    'aW1nX2xhYmVsX3VyaV9oYW5zX3N0YXRpYxgMIAEoCVIVaW1nTGFiZWxVcmlIYW5zU3RhdGljEj'\n    'gKGWltZ19sYWJlbF91cmlfaGFudF9zdGF0aWMYDSABKAlSFWltZ0xhYmVsVXJpSGFudFN0YXRp'\n    'Yw==');\n"
  },
  {
    "path": "lib/grpc/bilibili/main/community/reply/v1.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/main/community/reply/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:fixnum/fixnum.dart' as $fixnum;\nimport 'package:protobuf/protobuf.dart' as $pb;\nimport 'package:protobuf/well_known_types/google/protobuf/any.pb.dart' as $1;\n\nimport '../../../account/service/v1.pb.dart' as $5;\nimport '../../../app/dynamic/v2.pb.dart' as $6;\nimport '../../../dagw/component/avatar/v1.pb.dart' as $4;\nimport '../../../pagination.pb.dart' as $2;\nimport '../../../vas/garb/model.pb.dart' as $3;\nimport 'v1.pbenum.dart';\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nexport 'v1.pbenum.dart';\n\nclass Activity extends $pb.GeneratedMessage {\n  factory Activity({\n    $fixnum.Int64? activityId,\n    $fixnum.Int64? activityState,\n    $core.String? activityPlaceholder,\n  }) {\n    final result = create();\n    if (activityId != null) result.activityId = activityId;\n    if (activityState != null) result.activityState = activityState;\n    if (activityPlaceholder != null)\n      result.activityPlaceholder = activityPlaceholder;\n    return result;\n  }\n\n  Activity._();\n\n  factory Activity.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Activity.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Activity',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'activityId')\n    ..aInt64(2, _omitFieldNames ? '' : 'activityState')\n    ..aOS(3, _omitFieldNames ? '' : 'activityPlaceholder')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Activity clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Activity copyWith(void Function(Activity) updates) =>\n      super.copyWith((message) => updates(message as Activity)) as Activity;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Activity create() => Activity._();\n  @$core.override\n  Activity createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Activity getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Activity>(create);\n  static Activity? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get activityId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set activityId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasActivityId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearActivityId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get activityState => $_getI64(1);\n  @$pb.TagNumber(2)\n  set activityState($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasActivityState() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearActivityState() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get activityPlaceholder => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set activityPlaceholder($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasActivityPlaceholder() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearActivityPlaceholder() => $_clearField(3);\n}\n\nclass AnswerQuestionReq extends $pb.GeneratedMessage {\n  factory AnswerQuestionReq({\n    $fixnum.Int64? qid,\n    $core.String? optionKey,\n  }) {\n    final result = create();\n    if (qid != null) result.qid = qid;\n    if (optionKey != null) result.optionKey = optionKey;\n    return result;\n  }\n\n  AnswerQuestionReq._();\n\n  factory AnswerQuestionReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AnswerQuestionReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AnswerQuestionReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'qid')\n    ..aOS(2, _omitFieldNames ? '' : 'optionKey')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AnswerQuestionReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AnswerQuestionReq copyWith(void Function(AnswerQuestionReq) updates) =>\n      super.copyWith((message) => updates(message as AnswerQuestionReq))\n          as AnswerQuestionReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AnswerQuestionReq create() => AnswerQuestionReq._();\n  @$core.override\n  AnswerQuestionReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AnswerQuestionReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AnswerQuestionReq>(create);\n  static AnswerQuestionReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get qid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set qid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasQid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearQid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get optionKey => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set optionKey($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOptionKey() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOptionKey() => $_clearField(2);\n}\n\nclass AnswerQuestionResp_MemberPassedPopup extends $pb.GeneratedMessage {\n  factory AnswerQuestionResp_MemberPassedPopup({\n    $core.String? title,\n    $core.String? subtitle,\n    $core.String? h5Link,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (subtitle != null) result.subtitle = subtitle;\n    if (h5Link != null) result.h5Link = h5Link;\n    return result;\n  }\n\n  AnswerQuestionResp_MemberPassedPopup._();\n\n  factory AnswerQuestionResp_MemberPassedPopup.fromBuffer(\n          $core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AnswerQuestionResp_MemberPassedPopup.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AnswerQuestionResp.MemberPassedPopup',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'subtitle')\n    ..aOS(3, _omitFieldNames ? '' : 'h5Link')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AnswerQuestionResp_MemberPassedPopup clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AnswerQuestionResp_MemberPassedPopup copyWith(\n          void Function(AnswerQuestionResp_MemberPassedPopup) updates) =>\n      super.copyWith((message) =>\n              updates(message as AnswerQuestionResp_MemberPassedPopup))\n          as AnswerQuestionResp_MemberPassedPopup;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AnswerQuestionResp_MemberPassedPopup create() =>\n      AnswerQuestionResp_MemberPassedPopup._();\n  @$core.override\n  AnswerQuestionResp_MemberPassedPopup createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AnswerQuestionResp_MemberPassedPopup getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<\n          AnswerQuestionResp_MemberPassedPopup>(create);\n  static AnswerQuestionResp_MemberPassedPopup? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get subtitle => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set subtitle($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSubtitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSubtitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get h5Link => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set h5Link($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasH5Link() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearH5Link() => $_clearField(3);\n}\n\nclass AnswerQuestionResp extends $pb.GeneratedMessage {\n  factory AnswerQuestionResp({\n    $core.bool? passed,\n    $core.bool? memberPassed,\n    AnswerQuestionResp_MemberPassedPopup? memberPassedPopup,\n    $core.String? bottomText,\n    QuestionCardStat? stat,\n  }) {\n    final result = create();\n    if (passed != null) result.passed = passed;\n    if (memberPassed != null) result.memberPassed = memberPassed;\n    if (memberPassedPopup != null) result.memberPassedPopup = memberPassedPopup;\n    if (bottomText != null) result.bottomText = bottomText;\n    if (stat != null) result.stat = stat;\n    return result;\n  }\n\n  AnswerQuestionResp._();\n\n  factory AnswerQuestionResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AnswerQuestionResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AnswerQuestionResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'passed')\n    ..aOB(2, _omitFieldNames ? '' : 'memberPassed')\n    ..aOM<AnswerQuestionResp_MemberPassedPopup>(\n        3, _omitFieldNames ? '' : 'memberPassedPopup',\n        subBuilder: AnswerQuestionResp_MemberPassedPopup.create)\n    ..aOS(4, _omitFieldNames ? '' : 'bottomText')\n    ..aOM<QuestionCardStat>(5, _omitFieldNames ? '' : 'stat',\n        subBuilder: QuestionCardStat.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AnswerQuestionResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AnswerQuestionResp copyWith(void Function(AnswerQuestionResp) updates) =>\n      super.copyWith((message) => updates(message as AnswerQuestionResp))\n          as AnswerQuestionResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AnswerQuestionResp create() => AnswerQuestionResp._();\n  @$core.override\n  AnswerQuestionResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AnswerQuestionResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AnswerQuestionResp>(create);\n  static AnswerQuestionResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get passed => $_getBF(0);\n  @$pb.TagNumber(1)\n  set passed($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPassed() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPassed() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get memberPassed => $_getBF(1);\n  @$pb.TagNumber(2)\n  set memberPassed($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMemberPassed() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMemberPassed() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  AnswerQuestionResp_MemberPassedPopup get memberPassedPopup => $_getN(2);\n  @$pb.TagNumber(3)\n  set memberPassedPopup(AnswerQuestionResp_MemberPassedPopup value) =>\n      $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasMemberPassedPopup() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearMemberPassedPopup() => $_clearField(3);\n  @$pb.TagNumber(3)\n  AnswerQuestionResp_MemberPassedPopup ensureMemberPassedPopup() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.String get bottomText => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set bottomText($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBottomText() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBottomText() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  QuestionCardStat get stat => $_getN(4);\n  @$pb.TagNumber(5)\n  set stat(QuestionCardStat value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasStat() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearStat() => $_clearField(5);\n  @$pb.TagNumber(5)\n  QuestionCardStat ensureStat() => $_ensure(4);\n}\n\nclass ArticleSearchItem extends $pb.GeneratedMessage {\n  factory ArticleSearchItem({\n    $core.String? title,\n    $core.String? upNickname,\n    $core.Iterable<$core.String>? covers,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (upNickname != null) result.upNickname = upNickname;\n    if (covers != null) result.covers.addAll(covers);\n    return result;\n  }\n\n  ArticleSearchItem._();\n\n  factory ArticleSearchItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ArticleSearchItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ArticleSearchItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'upNickname')\n    ..pPS(3, _omitFieldNames ? '' : 'covers')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ArticleSearchItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ArticleSearchItem copyWith(void Function(ArticleSearchItem) updates) =>\n      super.copyWith((message) => updates(message as ArticleSearchItem))\n          as ArticleSearchItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ArticleSearchItem create() => ArticleSearchItem._();\n  @$core.override\n  ArticleSearchItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ArticleSearchItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ArticleSearchItem>(create);\n  static ArticleSearchItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get upNickname => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set upNickname($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUpNickname() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUpNickname() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<$core.String> get covers => $_getList(2);\n}\n\nclass AtGroup extends $pb.GeneratedMessage {\n  factory AtGroup({\n    AtGroup_Type? groupType,\n    $core.String? groupName,\n    $core.Iterable<AtItem>? items,\n  }) {\n    final result = create();\n    if (groupType != null) result.groupType = groupType;\n    if (groupName != null) result.groupName = groupName;\n    if (items != null) result.items.addAll(items);\n    return result;\n  }\n\n  AtGroup._();\n\n  factory AtGroup.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AtGroup.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AtGroup',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aE<AtGroup_Type>(1, _omitFieldNames ? '' : 'groupType',\n        enumValues: AtGroup_Type.values)\n    ..aOS(2, _omitFieldNames ? '' : 'groupName')\n    ..pPM<AtItem>(3, _omitFieldNames ? '' : 'items', subBuilder: AtItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AtGroup clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AtGroup copyWith(void Function(AtGroup) updates) =>\n      super.copyWith((message) => updates(message as AtGroup)) as AtGroup;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AtGroup create() => AtGroup._();\n  @$core.override\n  AtGroup createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AtGroup getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<AtGroup>(create);\n  static AtGroup? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  AtGroup_Type get groupType => $_getN(0);\n  @$pb.TagNumber(1)\n  set groupType(AtGroup_Type value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasGroupType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearGroupType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get groupName => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set groupName($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasGroupName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearGroupName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<AtItem> get items => $_getList(2);\n}\n\nclass AtItem extends $pb.GeneratedMessage {\n  factory AtItem({\n    $fixnum.Int64? mid,\n    $core.String? name,\n    $core.String? face,\n    $core.int? fans,\n    $core.int? officialVerifyType,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (name != null) result.name = name;\n    if (face != null) result.face = face;\n    if (fans != null) result.fans = fans;\n    if (officialVerifyType != null)\n      result.officialVerifyType = officialVerifyType;\n    return result;\n  }\n\n  AtItem._();\n\n  factory AtItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AtItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AtItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'face')\n    ..aI(4, _omitFieldNames ? '' : 'fans')\n    ..aI(5, _omitFieldNames ? '' : 'officialVerifyType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AtItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AtItem copyWith(void Function(AtItem) updates) =>\n      super.copyWith((message) => updates(message as AtItem)) as AtItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AtItem create() => AtItem._();\n  @$core.override\n  AtItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AtItem getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<AtItem>(create);\n  static AtItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get face => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set face($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFace() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFace() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get fans => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set fans($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFans() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFans() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get officialVerifyType => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set officialVerifyType($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasOfficialVerifyType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearOfficialVerifyType() => $_clearField(5);\n}\n\nclass AtSearchReply extends $pb.GeneratedMessage {\n  factory AtSearchReply({\n    $core.Iterable<AtGroup>? groups,\n  }) {\n    final result = create();\n    if (groups != null) result.groups.addAll(groups);\n    return result;\n  }\n\n  AtSearchReply._();\n\n  factory AtSearchReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AtSearchReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AtSearchReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..pPM<AtGroup>(1, _omitFieldNames ? '' : 'groups',\n        subBuilder: AtGroup.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AtSearchReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AtSearchReply copyWith(void Function(AtSearchReply) updates) =>\n      super.copyWith((message) => updates(message as AtSearchReply))\n          as AtSearchReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AtSearchReply create() => AtSearchReply._();\n  @$core.override\n  AtSearchReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AtSearchReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AtSearchReply>(create);\n  static AtSearchReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<AtGroup> get groups => $_getList(0);\n}\n\nclass AtSearchReq extends $pb.GeneratedMessage {\n  factory AtSearchReq({\n    $fixnum.Int64? mid,\n    $core.String? keyword,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (keyword != null) result.keyword = keyword;\n    return result;\n  }\n\n  AtSearchReq._();\n\n  factory AtSearchReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AtSearchReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AtSearchReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aOS(2, _omitFieldNames ? '' : 'keyword')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AtSearchReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AtSearchReq copyWith(void Function(AtSearchReq) updates) =>\n      super.copyWith((message) => updates(message as AtSearchReq))\n          as AtSearchReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AtSearchReq create() => AtSearchReq._();\n  @$core.override\n  AtSearchReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AtSearchReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AtSearchReq>(create);\n  static AtSearchReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get keyword => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set keyword($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasKeyword() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearKeyword() => $_clearField(2);\n}\n\nclass CM extends $pb.GeneratedMessage {\n  factory CM({\n    $1.Any? sourceContent,\n  }) {\n    final result = create();\n    if (sourceContent != null) result.sourceContent = sourceContent;\n    return result;\n  }\n\n  CM._();\n\n  factory CM.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CM.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CM',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOM<$1.Any>(1, _omitFieldNames ? '' : 'sourceContent',\n        subBuilder: $1.Any.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CM clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CM copyWith(void Function(CM) updates) =>\n      super.copyWith((message) => updates(message as CM)) as CM;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CM create() => CM._();\n  @$core.override\n  CM createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CM getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CM>(create);\n  static CM? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $1.Any get sourceContent => $_getN(0);\n  @$pb.TagNumber(1)\n  set sourceContent($1.Any value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSourceContent() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSourceContent() => $_clearField(1);\n  @$pb.TagNumber(1)\n  $1.Any ensureSourceContent() => $_ensure(0);\n}\n\nclass Content extends $pb.GeneratedMessage {\n  factory Content({\n    $core.String? message,\n    $core.Iterable<$core.MapEntry<$core.String, Member>>? members,\n    $core.Iterable<$core.MapEntry<$core.String, Emote>>? emotes,\n    $core.Iterable<$core.MapEntry<$core.String, Topic>>? topics,\n    $core.Iterable<$core.MapEntry<$core.String, Url>>? urls,\n    Vote? vote,\n    $core.Iterable<$core.MapEntry<$core.String, $fixnum.Int64>>? atNameToMid,\n    RichText? richText,\n    $core.Iterable<Picture>? pictures,\n    $core.double? pictureScale,\n  }) {\n    final result = create();\n    if (message != null) result.message = message;\n    if (members != null) result.members.addEntries(members);\n    if (emotes != null) result.emotes.addEntries(emotes);\n    if (topics != null) result.topics.addEntries(topics);\n    if (urls != null) result.urls.addEntries(urls);\n    if (vote != null) result.vote = vote;\n    if (atNameToMid != null) result.atNameToMid.addEntries(atNameToMid);\n    if (richText != null) result.richText = richText;\n    if (pictures != null) result.pictures.addAll(pictures);\n    if (pictureScale != null) result.pictureScale = pictureScale;\n    return result;\n  }\n\n  Content._();\n\n  factory Content.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Content.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Content',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'message')\n    ..m<$core.String, Member>(2, _omitFieldNames ? '' : 'members',\n        entryClassName: 'Content.MembersEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OM,\n        valueCreator: Member.create,\n        valueDefaultOrMaker: Member.getDefault,\n        packageName: const $pb.PackageName('bilibili.main.community.reply.v1'))\n    ..m<$core.String, Emote>(3, _omitFieldNames ? '' : 'emotes',\n        entryClassName: 'Content.EmotesEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OM,\n        valueCreator: Emote.create,\n        valueDefaultOrMaker: Emote.getDefault,\n        packageName: const $pb.PackageName('bilibili.main.community.reply.v1'))\n    ..m<$core.String, Topic>(4, _omitFieldNames ? '' : 'topics',\n        entryClassName: 'Content.TopicsEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OM,\n        valueCreator: Topic.create,\n        valueDefaultOrMaker: Topic.getDefault,\n        packageName: const $pb.PackageName('bilibili.main.community.reply.v1'))\n    ..m<$core.String, Url>(5, _omitFieldNames ? '' : 'urls',\n        entryClassName: 'Content.UrlsEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OM,\n        valueCreator: Url.create,\n        valueDefaultOrMaker: Url.getDefault,\n        packageName: const $pb.PackageName('bilibili.main.community.reply.v1'))\n    ..aOM<Vote>(6, _omitFieldNames ? '' : 'vote', subBuilder: Vote.create)\n    ..m<$core.String, $fixnum.Int64>(7, _omitFieldNames ? '' : 'atNameToMid',\n        entryClassName: 'Content.AtNameToMidEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.O6,\n        packageName: const $pb.PackageName('bilibili.main.community.reply.v1'))\n    ..aOM<RichText>(8, _omitFieldNames ? '' : 'richText',\n        subBuilder: RichText.create)\n    ..pPM<Picture>(9, _omitFieldNames ? '' : 'pictures',\n        subBuilder: Picture.create)\n    ..aD(10, _omitFieldNames ? '' : 'pictureScale')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Content clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Content copyWith(void Function(Content) updates) =>\n      super.copyWith((message) => updates(message as Content)) as Content;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Content create() => Content._();\n  @$core.override\n  Content createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Content getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Content>(create);\n  static Content? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get message => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set message($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMessage() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMessage() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbMap<$core.String, Member> get members => $_getMap(1);\n\n  @$pb.TagNumber(3)\n  $pb.PbMap<$core.String, Emote> get emotes => $_getMap(2);\n\n  @$pb.TagNumber(4)\n  $pb.PbMap<$core.String, Topic> get topics => $_getMap(3);\n\n  @$pb.TagNumber(5)\n  $pb.PbMap<$core.String, Url> get urls => $_getMap(4);\n\n  @$pb.TagNumber(6)\n  Vote get vote => $_getN(5);\n  @$pb.TagNumber(6)\n  set vote(Vote value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasVote() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearVote() => $_clearField(6);\n  @$pb.TagNumber(6)\n  Vote ensureVote() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $pb.PbMap<$core.String, $fixnum.Int64> get atNameToMid => $_getMap(6);\n\n  @$pb.TagNumber(8)\n  RichText get richText => $_getN(7);\n  @$pb.TagNumber(8)\n  set richText(RichText value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasRichText() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearRichText() => $_clearField(8);\n  @$pb.TagNumber(8)\n  RichText ensureRichText() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  $pb.PbList<Picture> get pictures => $_getList(8);\n\n  @$pb.TagNumber(10)\n  $core.double get pictureScale => $_getN(9);\n  @$pb.TagNumber(10)\n  set pictureScale($core.double value) => $_setDouble(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasPictureScale() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearPictureScale() => $_clearField(10);\n}\n\nclass CursorReply extends $pb.GeneratedMessage {\n  factory CursorReply({\n    $fixnum.Int64? next,\n    $fixnum.Int64? prev,\n    $core.bool? isBegin,\n    $core.bool? isEnd,\n    Mode? mode,\n    $core.String? modeText,\n  }) {\n    final result = create();\n    if (next != null) result.next = next;\n    if (prev != null) result.prev = prev;\n    if (isBegin != null) result.isBegin = isBegin;\n    if (isEnd != null) result.isEnd = isEnd;\n    if (mode != null) result.mode = mode;\n    if (modeText != null) result.modeText = modeText;\n    return result;\n  }\n\n  CursorReply._();\n\n  factory CursorReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CursorReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CursorReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'next')\n    ..aInt64(2, _omitFieldNames ? '' : 'prev')\n    ..aOB(3, _omitFieldNames ? '' : 'isBegin')\n    ..aOB(4, _omitFieldNames ? '' : 'isEnd')\n    ..aE<Mode>(5, _omitFieldNames ? '' : 'mode', enumValues: Mode.values)\n    ..aOS(6, _omitFieldNames ? '' : 'modeText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CursorReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CursorReply copyWith(void Function(CursorReply) updates) =>\n      super.copyWith((message) => updates(message as CursorReply))\n          as CursorReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CursorReply create() => CursorReply._();\n  @$core.override\n  CursorReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CursorReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CursorReply>(create);\n  static CursorReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get next => $_getI64(0);\n  @$pb.TagNumber(1)\n  set next($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasNext() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearNext() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get prev => $_getI64(1);\n  @$pb.TagNumber(2)\n  set prev($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPrev() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPrev() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get isBegin => $_getBF(2);\n  @$pb.TagNumber(3)\n  set isBegin($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIsBegin() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIsBegin() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get isEnd => $_getBF(3);\n  @$pb.TagNumber(4)\n  set isEnd($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIsEnd() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIsEnd() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  Mode get mode => $_getN(4);\n  @$pb.TagNumber(5)\n  set mode(Mode value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasMode() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearMode() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get modeText => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set modeText($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasModeText() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearModeText() => $_clearField(6);\n}\n\nclass CursorReq extends $pb.GeneratedMessage {\n  factory CursorReq({\n    $fixnum.Int64? next,\n    $fixnum.Int64? prev,\n    Mode? mode,\n  }) {\n    final result = create();\n    if (next != null) result.next = next;\n    if (prev != null) result.prev = prev;\n    if (mode != null) result.mode = mode;\n    return result;\n  }\n\n  CursorReq._();\n\n  factory CursorReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CursorReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CursorReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'next')\n    ..aInt64(2, _omitFieldNames ? '' : 'prev')\n    ..aE<Mode>(4, _omitFieldNames ? '' : 'mode', enumValues: Mode.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CursorReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CursorReq copyWith(void Function(CursorReq) updates) =>\n      super.copyWith((message) => updates(message as CursorReq)) as CursorReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CursorReq create() => CursorReq._();\n  @$core.override\n  CursorReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CursorReq getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CursorReq>(create);\n  static CursorReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get next => $_getI64(0);\n  @$pb.TagNumber(1)\n  set next($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasNext() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearNext() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get prev => $_getI64(1);\n  @$pb.TagNumber(2)\n  set prev($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPrev() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPrev() => $_clearField(2);\n\n  @$pb.TagNumber(4)\n  Mode get mode => $_getN(2);\n  @$pb.TagNumber(4)\n  set mode(Mode value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasMode() => $_has(2);\n  @$pb.TagNumber(4)\n  void clearMode() => $_clearField(4);\n}\n\nclass DetailListReply_SubjectTitle extends $pb.GeneratedMessage {\n  factory DetailListReply_SubjectTitle({\n    $core.String? leftIcon,\n    $core.String? title,\n    $core.String? link,\n    $fixnum.Int64? rpidMute,\n    ReplyNotificationSwitch? pushSwitch,\n  }) {\n    final result = create();\n    if (leftIcon != null) result.leftIcon = leftIcon;\n    if (title != null) result.title = title;\n    if (link != null) result.link = link;\n    if (rpidMute != null) result.rpidMute = rpidMute;\n    if (pushSwitch != null) result.pushSwitch = pushSwitch;\n    return result;\n  }\n\n  DetailListReply_SubjectTitle._();\n\n  factory DetailListReply_SubjectTitle.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DetailListReply_SubjectTitle.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DetailListReply.SubjectTitle',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'leftIcon')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'link')\n    ..aInt64(4, _omitFieldNames ? '' : 'rpidMute')\n    ..aE<ReplyNotificationSwitch>(5, _omitFieldNames ? '' : 'pushSwitch',\n        enumValues: ReplyNotificationSwitch.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DetailListReply_SubjectTitle clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DetailListReply_SubjectTitle copyWith(\n          void Function(DetailListReply_SubjectTitle) updates) =>\n      super.copyWith(\n              (message) => updates(message as DetailListReply_SubjectTitle))\n          as DetailListReply_SubjectTitle;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DetailListReply_SubjectTitle create() =>\n      DetailListReply_SubjectTitle._();\n  @$core.override\n  DetailListReply_SubjectTitle createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DetailListReply_SubjectTitle getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DetailListReply_SubjectTitle>(create);\n  static DetailListReply_SubjectTitle? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get leftIcon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set leftIcon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLeftIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLeftIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get link => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set link($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLink() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLink() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get rpidMute => $_getI64(3);\n  @$pb.TagNumber(4)\n  set rpidMute($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasRpidMute() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearRpidMute() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  ReplyNotificationSwitch get pushSwitch => $_getN(4);\n  @$pb.TagNumber(5)\n  set pushSwitch(ReplyNotificationSwitch value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPushSwitch() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPushSwitch() => $_clearField(5);\n}\n\nclass DetailListReply extends $pb.GeneratedMessage {\n  factory DetailListReply({\n    CursorReply? cursor,\n    SubjectControl? subjectControl,\n    ReplyInfo? root,\n    Activity? activity,\n    LikeInfo? likes,\n    Mode? mode,\n    $core.String? modeText,\n    $2.FeedPaginationReply? paginationReply,\n    $core.String? sessionId,\n    DetailListReply_SubjectTitle? subjectTitle,\n  }) {\n    final result = create();\n    if (cursor != null) result.cursor = cursor;\n    if (subjectControl != null) result.subjectControl = subjectControl;\n    if (root != null) result.root = root;\n    if (activity != null) result.activity = activity;\n    if (likes != null) result.likes = likes;\n    if (mode != null) result.mode = mode;\n    if (modeText != null) result.modeText = modeText;\n    if (paginationReply != null) result.paginationReply = paginationReply;\n    if (sessionId != null) result.sessionId = sessionId;\n    if (subjectTitle != null) result.subjectTitle = subjectTitle;\n    return result;\n  }\n\n  DetailListReply._();\n\n  factory DetailListReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DetailListReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DetailListReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOM<CursorReply>(1, _omitFieldNames ? '' : 'cursor',\n        subBuilder: CursorReply.create)\n    ..aOM<SubjectControl>(2, _omitFieldNames ? '' : 'subjectControl',\n        subBuilder: SubjectControl.create)\n    ..aOM<ReplyInfo>(3, _omitFieldNames ? '' : 'root',\n        subBuilder: ReplyInfo.create)\n    ..aOM<Activity>(4, _omitFieldNames ? '' : 'activity',\n        subBuilder: Activity.create)\n    ..aOM<LikeInfo>(5, _omitFieldNames ? '' : 'likes',\n        subBuilder: LikeInfo.create)\n    ..aE<Mode>(6, _omitFieldNames ? '' : 'mode', enumValues: Mode.values)\n    ..aOS(7, _omitFieldNames ? '' : 'modeText')\n    ..aOM<$2.FeedPaginationReply>(8, _omitFieldNames ? '' : 'paginationReply',\n        subBuilder: $2.FeedPaginationReply.create)\n    ..aOS(9, _omitFieldNames ? '' : 'sessionId')\n    ..aOM<DetailListReply_SubjectTitle>(\n        10, _omitFieldNames ? '' : 'subjectTitle',\n        subBuilder: DetailListReply_SubjectTitle.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DetailListReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DetailListReply copyWith(void Function(DetailListReply) updates) =>\n      super.copyWith((message) => updates(message as DetailListReply))\n          as DetailListReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DetailListReply create() => DetailListReply._();\n  @$core.override\n  DetailListReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DetailListReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DetailListReply>(create);\n  static DetailListReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  CursorReply get cursor => $_getN(0);\n  @$pb.TagNumber(1)\n  set cursor(CursorReply value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCursor() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCursor() => $_clearField(1);\n  @$pb.TagNumber(1)\n  CursorReply ensureCursor() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  SubjectControl get subjectControl => $_getN(1);\n  @$pb.TagNumber(2)\n  set subjectControl(SubjectControl value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSubjectControl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSubjectControl() => $_clearField(2);\n  @$pb.TagNumber(2)\n  SubjectControl ensureSubjectControl() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  ReplyInfo get root => $_getN(2);\n  @$pb.TagNumber(3)\n  set root(ReplyInfo value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRoot() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRoot() => $_clearField(3);\n  @$pb.TagNumber(3)\n  ReplyInfo ensureRoot() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  Activity get activity => $_getN(3);\n  @$pb.TagNumber(4)\n  set activity(Activity value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasActivity() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearActivity() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Activity ensureActivity() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  LikeInfo get likes => $_getN(4);\n  @$pb.TagNumber(5)\n  set likes(LikeInfo value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasLikes() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearLikes() => $_clearField(5);\n  @$pb.TagNumber(5)\n  LikeInfo ensureLikes() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  Mode get mode => $_getN(5);\n  @$pb.TagNumber(6)\n  set mode(Mode value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasMode() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearMode() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get modeText => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set modeText($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasModeText() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearModeText() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $2.FeedPaginationReply get paginationReply => $_getN(7);\n  @$pb.TagNumber(8)\n  set paginationReply($2.FeedPaginationReply value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasPaginationReply() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearPaginationReply() => $_clearField(8);\n  @$pb.TagNumber(8)\n  $2.FeedPaginationReply ensurePaginationReply() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  $core.String get sessionId => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set sessionId($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasSessionId() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearSessionId() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  DetailListReply_SubjectTitle get subjectTitle => $_getN(9);\n  @$pb.TagNumber(10)\n  set subjectTitle(DetailListReply_SubjectTitle value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasSubjectTitle() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearSubjectTitle() => $_clearField(10);\n  @$pb.TagNumber(10)\n  DetailListReply_SubjectTitle ensureSubjectTitle() => $_ensure(9);\n}\n\nclass DetailListReq extends $pb.GeneratedMessage {\n  factory DetailListReq({\n    $fixnum.Int64? oid,\n    $fixnum.Int64? type,\n    $fixnum.Int64? root,\n    $fixnum.Int64? rpid,\n    CursorReq? cursor,\n    DetailListScene? scene,\n    Mode? mode,\n    $2.FeedPagination? pagination,\n    $core.String? extra,\n    $core.String? adExtra,\n    $core.bool? needSubjectTitle,\n  }) {\n    final result = create();\n    if (oid != null) result.oid = oid;\n    if (type != null) result.type = type;\n    if (root != null) result.root = root;\n    if (rpid != null) result.rpid = rpid;\n    if (cursor != null) result.cursor = cursor;\n    if (scene != null) result.scene = scene;\n    if (mode != null) result.mode = mode;\n    if (pagination != null) result.pagination = pagination;\n    if (extra != null) result.extra = extra;\n    if (adExtra != null) result.adExtra = adExtra;\n    if (needSubjectTitle != null) result.needSubjectTitle = needSubjectTitle;\n    return result;\n  }\n\n  DetailListReq._();\n\n  factory DetailListReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DetailListReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DetailListReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'oid')\n    ..aInt64(2, _omitFieldNames ? '' : 'type')\n    ..aInt64(3, _omitFieldNames ? '' : 'root')\n    ..aInt64(4, _omitFieldNames ? '' : 'rpid')\n    ..aOM<CursorReq>(5, _omitFieldNames ? '' : 'cursor',\n        subBuilder: CursorReq.create)\n    ..aE<DetailListScene>(6, _omitFieldNames ? '' : 'scene',\n        enumValues: DetailListScene.values)\n    ..aE<Mode>(7, _omitFieldNames ? '' : 'mode', enumValues: Mode.values)\n    ..aOM<$2.FeedPagination>(8, _omitFieldNames ? '' : 'pagination',\n        subBuilder: $2.FeedPagination.create)\n    ..aOS(9, _omitFieldNames ? '' : 'extra')\n    ..aOS(10, _omitFieldNames ? '' : 'adExtra')\n    ..aOB(11, _omitFieldNames ? '' : 'needSubjectTitle')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DetailListReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DetailListReq copyWith(void Function(DetailListReq) updates) =>\n      super.copyWith((message) => updates(message as DetailListReq))\n          as DetailListReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DetailListReq create() => DetailListReq._();\n  @$core.override\n  DetailListReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DetailListReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DetailListReq>(create);\n  static DetailListReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get oid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set oid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get type => $_getI64(1);\n  @$pb.TagNumber(2)\n  set type($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get root => $_getI64(2);\n  @$pb.TagNumber(3)\n  set root($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRoot() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRoot() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get rpid => $_getI64(3);\n  @$pb.TagNumber(4)\n  set rpid($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasRpid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearRpid() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  CursorReq get cursor => $_getN(4);\n  @$pb.TagNumber(5)\n  set cursor(CursorReq value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCursor() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCursor() => $_clearField(5);\n  @$pb.TagNumber(5)\n  CursorReq ensureCursor() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  DetailListScene get scene => $_getN(5);\n  @$pb.TagNumber(6)\n  set scene(DetailListScene value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasScene() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearScene() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  Mode get mode => $_getN(6);\n  @$pb.TagNumber(7)\n  set mode(Mode value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasMode() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearMode() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $2.FeedPagination get pagination => $_getN(7);\n  @$pb.TagNumber(8)\n  set pagination($2.FeedPagination value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasPagination() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearPagination() => $_clearField(8);\n  @$pb.TagNumber(8)\n  $2.FeedPagination ensurePagination() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  $core.String get extra => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set extra($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasExtra() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearExtra() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get adExtra => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set adExtra($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasAdExtra() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearAdExtra() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.bool get needSubjectTitle => $_getBF(10);\n  @$pb.TagNumber(11)\n  set needSubjectTitle($core.bool value) => $_setBool(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasNeedSubjectTitle() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearNeedSubjectTitle() => $_clearField(11);\n}\n\nclass DialogListReply extends $pb.GeneratedMessage {\n  factory DialogListReply({\n    CursorReply? cursor,\n    SubjectControl? subjectControl,\n    $core.Iterable<ReplyInfo>? replies,\n    Activity? activity,\n    $2.FeedPaginationReply? paginationReply,\n    $core.String? sessionId,\n  }) {\n    final result = create();\n    if (cursor != null) result.cursor = cursor;\n    if (subjectControl != null) result.subjectControl = subjectControl;\n    if (replies != null) result.replies.addAll(replies);\n    if (activity != null) result.activity = activity;\n    if (paginationReply != null) result.paginationReply = paginationReply;\n    if (sessionId != null) result.sessionId = sessionId;\n    return result;\n  }\n\n  DialogListReply._();\n\n  factory DialogListReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DialogListReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DialogListReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOM<CursorReply>(1, _omitFieldNames ? '' : 'cursor',\n        subBuilder: CursorReply.create)\n    ..aOM<SubjectControl>(2, _omitFieldNames ? '' : 'subjectControl',\n        subBuilder: SubjectControl.create)\n    ..pPM<ReplyInfo>(3, _omitFieldNames ? '' : 'replies',\n        subBuilder: ReplyInfo.create)\n    ..aOM<Activity>(4, _omitFieldNames ? '' : 'activity',\n        subBuilder: Activity.create)\n    ..aOM<$2.FeedPaginationReply>(5, _omitFieldNames ? '' : 'paginationReply',\n        subBuilder: $2.FeedPaginationReply.create)\n    ..aOS(6, _omitFieldNames ? '' : 'sessionId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DialogListReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DialogListReply copyWith(void Function(DialogListReply) updates) =>\n      super.copyWith((message) => updates(message as DialogListReply))\n          as DialogListReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DialogListReply create() => DialogListReply._();\n  @$core.override\n  DialogListReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DialogListReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DialogListReply>(create);\n  static DialogListReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  CursorReply get cursor => $_getN(0);\n  @$pb.TagNumber(1)\n  set cursor(CursorReply value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCursor() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCursor() => $_clearField(1);\n  @$pb.TagNumber(1)\n  CursorReply ensureCursor() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  SubjectControl get subjectControl => $_getN(1);\n  @$pb.TagNumber(2)\n  set subjectControl(SubjectControl value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSubjectControl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSubjectControl() => $_clearField(2);\n  @$pb.TagNumber(2)\n  SubjectControl ensureSubjectControl() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<ReplyInfo> get replies => $_getList(2);\n\n  @$pb.TagNumber(4)\n  Activity get activity => $_getN(3);\n  @$pb.TagNumber(4)\n  set activity(Activity value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasActivity() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearActivity() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Activity ensureActivity() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $2.FeedPaginationReply get paginationReply => $_getN(4);\n  @$pb.TagNumber(5)\n  set paginationReply($2.FeedPaginationReply value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPaginationReply() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPaginationReply() => $_clearField(5);\n  @$pb.TagNumber(5)\n  $2.FeedPaginationReply ensurePaginationReply() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.String get sessionId => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set sessionId($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasSessionId() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearSessionId() => $_clearField(6);\n}\n\nclass DialogListReq extends $pb.GeneratedMessage {\n  factory DialogListReq({\n    $fixnum.Int64? oid,\n    $fixnum.Int64? type,\n    $fixnum.Int64? root,\n    $fixnum.Int64? dialog,\n    CursorReq? cursor,\n    $2.FeedPagination? pagination,\n    $core.String? extra,\n    $core.String? adExtra,\n  }) {\n    final result = create();\n    if (oid != null) result.oid = oid;\n    if (type != null) result.type = type;\n    if (root != null) result.root = root;\n    if (dialog != null) result.dialog = dialog;\n    if (cursor != null) result.cursor = cursor;\n    if (pagination != null) result.pagination = pagination;\n    if (extra != null) result.extra = extra;\n    if (adExtra != null) result.adExtra = adExtra;\n    return result;\n  }\n\n  DialogListReq._();\n\n  factory DialogListReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DialogListReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DialogListReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'oid')\n    ..aInt64(2, _omitFieldNames ? '' : 'type')\n    ..aInt64(3, _omitFieldNames ? '' : 'root')\n    ..aInt64(4, _omitFieldNames ? '' : 'dialog')\n    ..aOM<CursorReq>(5, _omitFieldNames ? '' : 'cursor',\n        subBuilder: CursorReq.create)\n    ..aOM<$2.FeedPagination>(6, _omitFieldNames ? '' : 'pagination',\n        subBuilder: $2.FeedPagination.create)\n    ..aOS(7, _omitFieldNames ? '' : 'extra')\n    ..aOS(8, _omitFieldNames ? '' : 'adExtra')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DialogListReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DialogListReq copyWith(void Function(DialogListReq) updates) =>\n      super.copyWith((message) => updates(message as DialogListReq))\n          as DialogListReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DialogListReq create() => DialogListReq._();\n  @$core.override\n  DialogListReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DialogListReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DialogListReq>(create);\n  static DialogListReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get oid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set oid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get type => $_getI64(1);\n  @$pb.TagNumber(2)\n  set type($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get root => $_getI64(2);\n  @$pb.TagNumber(3)\n  set root($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRoot() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRoot() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get dialog => $_getI64(3);\n  @$pb.TagNumber(4)\n  set dialog($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDialog() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDialog() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  CursorReq get cursor => $_getN(4);\n  @$pb.TagNumber(5)\n  set cursor(CursorReq value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCursor() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCursor() => $_clearField(5);\n  @$pb.TagNumber(5)\n  CursorReq ensureCursor() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $2.FeedPagination get pagination => $_getN(5);\n  @$pb.TagNumber(6)\n  set pagination($2.FeedPagination value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasPagination() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearPagination() => $_clearField(6);\n  @$pb.TagNumber(6)\n  $2.FeedPagination ensurePagination() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $core.String get extra => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set extra($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasExtra() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearExtra() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get adExtra => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set adExtra($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasAdExtra() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearAdExtra() => $_clearField(8);\n}\n\nclass DoVoteReq extends $pb.GeneratedMessage {\n  factory DoVoteReq({\n    $fixnum.Int64? oid,\n    $fixnum.Int64? type,\n    $fixnum.Int64? voteId,\n    $fixnum.Int64? option,\n  }) {\n    final result = create();\n    if (oid != null) result.oid = oid;\n    if (type != null) result.type = type;\n    if (voteId != null) result.voteId = voteId;\n    if (option != null) result.option = option;\n    return result;\n  }\n\n  DoVoteReq._();\n\n  factory DoVoteReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DoVoteReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DoVoteReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'oid')\n    ..aInt64(2, _omitFieldNames ? '' : 'type')\n    ..aInt64(3, _omitFieldNames ? '' : 'voteId')\n    ..aInt64(4, _omitFieldNames ? '' : 'option')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DoVoteReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DoVoteReq copyWith(void Function(DoVoteReq) updates) =>\n      super.copyWith((message) => updates(message as DoVoteReq)) as DoVoteReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DoVoteReq create() => DoVoteReq._();\n  @$core.override\n  DoVoteReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DoVoteReq getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DoVoteReq>(create);\n  static DoVoteReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get oid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set oid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get type => $_getI64(1);\n  @$pb.TagNumber(2)\n  set type($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get voteId => $_getI64(2);\n  @$pb.TagNumber(3)\n  set voteId($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasVoteId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearVoteId() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get option => $_getI64(3);\n  @$pb.TagNumber(4)\n  set option($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasOption() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearOption() => $_clearField(4);\n}\n\nclass DoVoteResp extends $pb.GeneratedMessage {\n  factory DoVoteResp() => create();\n\n  DoVoteResp._();\n\n  factory DoVoteResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DoVoteResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DoVoteResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DoVoteResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DoVoteResp copyWith(void Function(DoVoteResp) updates) =>\n      super.copyWith((message) => updates(message as DoVoteResp)) as DoVoteResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DoVoteResp create() => DoVoteResp._();\n  @$core.override\n  DoVoteResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DoVoteResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DoVoteResp>(create);\n  static DoVoteResp? _defaultInstance;\n}\n\nclass ESportsGradeCard extends $pb.GeneratedMessage {\n  factory ESportsGradeCard({\n    $core.String? title,\n    $core.String? description,\n    $core.String? image,\n    $core.String? link,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (description != null) result.description = description;\n    if (image != null) result.image = image;\n    if (link != null) result.link = link;\n    return result;\n  }\n\n  ESportsGradeCard._();\n\n  factory ESportsGradeCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ESportsGradeCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ESportsGradeCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'description')\n    ..aOS(3, _omitFieldNames ? '' : 'image')\n    ..aOS(4, _omitFieldNames ? '' : 'link')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ESportsGradeCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ESportsGradeCard copyWith(void Function(ESportsGradeCard) updates) =>\n      super.copyWith((message) => updates(message as ESportsGradeCard))\n          as ESportsGradeCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ESportsGradeCard create() => ESportsGradeCard._();\n  @$core.override\n  ESportsGradeCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ESportsGradeCard getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ESportsGradeCard>(create);\n  static ESportsGradeCard? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get description => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set description($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDescription() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDescription() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get image => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set image($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasImage() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearImage() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get link => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set link($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLink() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLink() => $_clearField(4);\n}\n\nclass Effects extends $pb.GeneratedMessage {\n  factory Effects({\n    $core.String? preloading,\n  }) {\n    final result = create();\n    if (preloading != null) result.preloading = preloading;\n    return result;\n  }\n\n  Effects._();\n\n  factory Effects.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Effects.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Effects',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'preloading')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Effects clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Effects copyWith(void Function(Effects) updates) =>\n      super.copyWith((message) => updates(message as Effects)) as Effects;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Effects create() => Effects._();\n  @$core.override\n  Effects createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Effects getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Effects>(create);\n  static Effects? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get preloading => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set preloading($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPreloading() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPreloading() => $_clearField(1);\n}\n\nclass Emote extends $pb.GeneratedMessage {\n  factory Emote({\n    $fixnum.Int64? size,\n    $core.String? url,\n    $core.String? jumpUrl,\n    $core.String? jumpTitle,\n    $fixnum.Int64? id,\n    $fixnum.Int64? packageId,\n    $core.String? gifUrl,\n    $core.String? text,\n    $core.String? webpUrl,\n  }) {\n    final result = create();\n    if (size != null) result.size = size;\n    if (url != null) result.url = url;\n    if (jumpUrl != null) result.jumpUrl = jumpUrl;\n    if (jumpTitle != null) result.jumpTitle = jumpTitle;\n    if (id != null) result.id = id;\n    if (packageId != null) result.packageId = packageId;\n    if (gifUrl != null) result.gifUrl = gifUrl;\n    if (text != null) result.text = text;\n    if (webpUrl != null) result.webpUrl = webpUrl;\n    return result;\n  }\n\n  Emote._();\n\n  factory Emote.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Emote.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Emote',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'size')\n    ..aOS(2, _omitFieldNames ? '' : 'url')\n    ..aOS(3, _omitFieldNames ? '' : 'jumpUrl')\n    ..aOS(4, _omitFieldNames ? '' : 'jumpTitle')\n    ..aInt64(5, _omitFieldNames ? '' : 'id')\n    ..aInt64(6, _omitFieldNames ? '' : 'packageId')\n    ..aOS(7, _omitFieldNames ? '' : 'gifUrl')\n    ..aOS(8, _omitFieldNames ? '' : 'text')\n    ..aOS(9, _omitFieldNames ? '' : 'webpUrl')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Emote clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Emote copyWith(void Function(Emote) updates) =>\n      super.copyWith((message) => updates(message as Emote)) as Emote;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Emote create() => Emote._();\n  @$core.override\n  Emote createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Emote getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Emote>(create);\n  static Emote? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get size => $_getI64(0);\n  @$pb.TagNumber(1)\n  set size($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSize() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSize() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get url => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set url($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUrl() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get jumpUrl => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set jumpUrl($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasJumpUrl() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearJumpUrl() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get jumpTitle => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set jumpTitle($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasJumpTitle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearJumpTitle() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get id => $_getI64(4);\n  @$pb.TagNumber(5)\n  set id($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasId() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearId() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get packageId => $_getI64(5);\n  @$pb.TagNumber(6)\n  set packageId($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasPackageId() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearPackageId() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get gifUrl => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set gifUrl($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasGifUrl() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearGifUrl() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get text => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set text($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasText() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearText() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get webpUrl => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set webpUrl($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasWebpUrl() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearWebpUrl() => $_clearField(9);\n}\n\nclass EmptyPage_Button extends $pb.GeneratedMessage {\n  factory EmptyPage_Button({\n    $core.String? title,\n    EmptyPage_Action? action,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (action != null) result.action = action;\n    return result;\n  }\n\n  EmptyPage_Button._();\n\n  factory EmptyPage_Button.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory EmptyPage_Button.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'EmptyPage.Button',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aE<EmptyPage_Action>(2, _omitFieldNames ? '' : 'action',\n        enumValues: EmptyPage_Action.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  EmptyPage_Button clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  EmptyPage_Button copyWith(void Function(EmptyPage_Button) updates) =>\n      super.copyWith((message) => updates(message as EmptyPage_Button))\n          as EmptyPage_Button;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static EmptyPage_Button create() => EmptyPage_Button._();\n  @$core.override\n  EmptyPage_Button createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static EmptyPage_Button getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<EmptyPage_Button>(create);\n  static EmptyPage_Button? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  EmptyPage_Action get action => $_getN(1);\n  @$pb.TagNumber(2)\n  set action(EmptyPage_Action value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAction() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAction() => $_clearField(2);\n}\n\nclass EmptyPage_Text extends $pb.GeneratedMessage {\n  factory EmptyPage_Text({\n    $core.String? raw,\n    TextStyle? style,\n    EmptyPage_Action? action,\n  }) {\n    final result = create();\n    if (raw != null) result.raw = raw;\n    if (style != null) result.style = style;\n    if (action != null) result.action = action;\n    return result;\n  }\n\n  EmptyPage_Text._();\n\n  factory EmptyPage_Text.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory EmptyPage_Text.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'EmptyPage.Text',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'raw')\n    ..aOM<TextStyle>(2, _omitFieldNames ? '' : 'style',\n        subBuilder: TextStyle.create)\n    ..aE<EmptyPage_Action>(3, _omitFieldNames ? '' : 'action',\n        enumValues: EmptyPage_Action.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  EmptyPage_Text clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  EmptyPage_Text copyWith(void Function(EmptyPage_Text) updates) =>\n      super.copyWith((message) => updates(message as EmptyPage_Text))\n          as EmptyPage_Text;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static EmptyPage_Text create() => EmptyPage_Text._();\n  @$core.override\n  EmptyPage_Text createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static EmptyPage_Text getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<EmptyPage_Text>(create);\n  static EmptyPage_Text? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get raw => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set raw($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasRaw() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRaw() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  TextStyle get style => $_getN(1);\n  @$pb.TagNumber(2)\n  set style(TextStyle value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasStyle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearStyle() => $_clearField(2);\n  @$pb.TagNumber(2)\n  TextStyle ensureStyle() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  EmptyPage_Action get action => $_getN(2);\n  @$pb.TagNumber(3)\n  set action(EmptyPage_Action value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAction() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAction() => $_clearField(3);\n}\n\nclass EmptyPage extends $pb.GeneratedMessage {\n  factory EmptyPage({\n    $core.String? imageUrl,\n    $core.Iterable<EmptyPage_Text>? texts,\n    EmptyPage_Button? leftButton,\n    EmptyPage_Button? rightButton,\n  }) {\n    final result = create();\n    if (imageUrl != null) result.imageUrl = imageUrl;\n    if (texts != null) result.texts.addAll(texts);\n    if (leftButton != null) result.leftButton = leftButton;\n    if (rightButton != null) result.rightButton = rightButton;\n    return result;\n  }\n\n  EmptyPage._();\n\n  factory EmptyPage.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory EmptyPage.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'EmptyPage',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'imageUrl')\n    ..pPM<EmptyPage_Text>(2, _omitFieldNames ? '' : 'texts',\n        subBuilder: EmptyPage_Text.create)\n    ..aOM<EmptyPage_Button>(3, _omitFieldNames ? '' : 'leftButton',\n        subBuilder: EmptyPage_Button.create)\n    ..aOM<EmptyPage_Button>(4, _omitFieldNames ? '' : 'rightButton',\n        subBuilder: EmptyPage_Button.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  EmptyPage clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  EmptyPage copyWith(void Function(EmptyPage) updates) =>\n      super.copyWith((message) => updates(message as EmptyPage)) as EmptyPage;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static EmptyPage create() => EmptyPage._();\n  @$core.override\n  EmptyPage createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static EmptyPage getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<EmptyPage>(create);\n  static EmptyPage? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get imageUrl => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set imageUrl($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasImageUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearImageUrl() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<EmptyPage_Text> get texts => $_getList(1);\n\n  @$pb.TagNumber(3)\n  EmptyPage_Button get leftButton => $_getN(2);\n  @$pb.TagNumber(3)\n  set leftButton(EmptyPage_Button value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLeftButton() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLeftButton() => $_clearField(3);\n  @$pb.TagNumber(3)\n  EmptyPage_Button ensureLeftButton() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  EmptyPage_Button get rightButton => $_getN(3);\n  @$pb.TagNumber(4)\n  set rightButton(EmptyPage_Button value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasRightButton() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearRightButton() => $_clearField(4);\n  @$pb.TagNumber(4)\n  EmptyPage_Button ensureRightButton() => $_ensure(3);\n}\n\nclass Form extends $pb.GeneratedMessage {\n  factory Form({\n    $core.int? type,\n    $core.Iterable<QoeOption>? options,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (options != null) result.options.addAll(options);\n    return result;\n  }\n\n  Form._();\n\n  factory Form.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Form.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Form',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'type')\n    ..pPM<QoeOption>(2, _omitFieldNames ? '' : 'options',\n        subBuilder: QoeOption.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Form clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Form copyWith(void Function(Form) updates) =>\n      super.copyWith((message) => updates(message as Form)) as Form;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Form create() => Form._();\n  @$core.override\n  Form createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Form getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Form>(create);\n  static Form? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get type => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set type($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<QoeOption> get options => $_getList(1);\n}\n\nclass GoodsSearchItem extends $pb.GeneratedMessage {\n  factory GoodsSearchItem({\n    $fixnum.Int64? id,\n    $core.String? name,\n    $core.String? price,\n    $core.String? income,\n    $core.String? img,\n    $core.String? label,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (name != null) result.name = name;\n    if (price != null) result.price = price;\n    if (income != null) result.income = income;\n    if (img != null) result.img = img;\n    if (label != null) result.label = label;\n    return result;\n  }\n\n  GoodsSearchItem._();\n\n  factory GoodsSearchItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory GoodsSearchItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'GoodsSearchItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'price')\n    ..aOS(4, _omitFieldNames ? '' : 'income')\n    ..aOS(5, _omitFieldNames ? '' : 'img')\n    ..aOS(6, _omitFieldNames ? '' : 'label')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GoodsSearchItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GoodsSearchItem copyWith(void Function(GoodsSearchItem) updates) =>\n      super.copyWith((message) => updates(message as GoodsSearchItem))\n          as GoodsSearchItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static GoodsSearchItem create() => GoodsSearchItem._();\n  @$core.override\n  GoodsSearchItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static GoodsSearchItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<GoodsSearchItem>(create);\n  static GoodsSearchItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get price => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set price($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPrice() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPrice() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get income => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set income($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIncome() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIncome() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get img => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set img($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasImg() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearImg() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get label => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set label($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasLabel() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearLabel() => $_clearField(6);\n}\n\nclass LikeInfo_Item extends $pb.GeneratedMessage {\n  factory LikeInfo_Item({\n    Member? member,\n  }) {\n    final result = create();\n    if (member != null) result.member = member;\n    return result;\n  }\n\n  LikeInfo_Item._();\n\n  factory LikeInfo_Item.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LikeInfo_Item.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LikeInfo.Item',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOM<Member>(1, _omitFieldNames ? '' : 'member', subBuilder: Member.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeInfo_Item clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeInfo_Item copyWith(void Function(LikeInfo_Item) updates) =>\n      super.copyWith((message) => updates(message as LikeInfo_Item))\n          as LikeInfo_Item;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LikeInfo_Item create() => LikeInfo_Item._();\n  @$core.override\n  LikeInfo_Item createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LikeInfo_Item getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LikeInfo_Item>(create);\n  static LikeInfo_Item? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Member get member => $_getN(0);\n  @$pb.TagNumber(1)\n  set member(Member value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMember() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMember() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Member ensureMember() => $_ensure(0);\n}\n\nclass LikeInfo extends $pb.GeneratedMessage {\n  factory LikeInfo({\n    $core.Iterable<LikeInfo_Item>? items,\n    $core.String? title,\n  }) {\n    final result = create();\n    if (items != null) result.items.addAll(items);\n    if (title != null) result.title = title;\n    return result;\n  }\n\n  LikeInfo._();\n\n  factory LikeInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LikeInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LikeInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..pPM<LikeInfo_Item>(1, _omitFieldNames ? '' : 'items',\n        subBuilder: LikeInfo_Item.create)\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LikeInfo copyWith(void Function(LikeInfo) updates) =>\n      super.copyWith((message) => updates(message as LikeInfo)) as LikeInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LikeInfo create() => LikeInfo._();\n  @$core.override\n  LikeInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LikeInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<LikeInfo>(create);\n  static LikeInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<LikeInfo_Item> get items => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n}\n\nclass Lottery extends $pb.GeneratedMessage {\n  factory Lottery({\n    $fixnum.Int64? lotteryId,\n    $fixnum.Int64? lotteryStatus,\n    $fixnum.Int64? lotteryMid,\n    $fixnum.Int64? lotteryTime,\n    $fixnum.Int64? oid,\n    $fixnum.Int64? type,\n    $fixnum.Int64? ctime,\n    Content? content,\n    Member? member,\n    ReplyControl? replyControl,\n  }) {\n    final result = create();\n    if (lotteryId != null) result.lotteryId = lotteryId;\n    if (lotteryStatus != null) result.lotteryStatus = lotteryStatus;\n    if (lotteryMid != null) result.lotteryMid = lotteryMid;\n    if (lotteryTime != null) result.lotteryTime = lotteryTime;\n    if (oid != null) result.oid = oid;\n    if (type != null) result.type = type;\n    if (ctime != null) result.ctime = ctime;\n    if (content != null) result.content = content;\n    if (member != null) result.member = member;\n    if (replyControl != null) result.replyControl = replyControl;\n    return result;\n  }\n\n  Lottery._();\n\n  factory Lottery.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Lottery.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Lottery',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'lotteryId')\n    ..aInt64(2, _omitFieldNames ? '' : 'lotteryStatus')\n    ..aInt64(3, _omitFieldNames ? '' : 'lotteryMid')\n    ..aInt64(4, _omitFieldNames ? '' : 'lotteryTime')\n    ..aInt64(5, _omitFieldNames ? '' : 'oid')\n    ..aInt64(6, _omitFieldNames ? '' : 'type')\n    ..aInt64(7, _omitFieldNames ? '' : 'ctime')\n    ..aOM<Content>(8, _omitFieldNames ? '' : 'content',\n        subBuilder: Content.create)\n    ..aOM<Member>(9, _omitFieldNames ? '' : 'member', subBuilder: Member.create)\n    ..aOM<ReplyControl>(10, _omitFieldNames ? '' : 'replyControl',\n        subBuilder: ReplyControl.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Lottery clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Lottery copyWith(void Function(Lottery) updates) =>\n      super.copyWith((message) => updates(message as Lottery)) as Lottery;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Lottery create() => Lottery._();\n  @$core.override\n  Lottery createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Lottery getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Lottery>(create);\n  static Lottery? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get lotteryId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set lotteryId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLotteryId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLotteryId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get lotteryStatus => $_getI64(1);\n  @$pb.TagNumber(2)\n  set lotteryStatus($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLotteryStatus() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLotteryStatus() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get lotteryMid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set lotteryMid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLotteryMid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLotteryMid() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get lotteryTime => $_getI64(3);\n  @$pb.TagNumber(4)\n  set lotteryTime($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLotteryTime() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLotteryTime() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get oid => $_getI64(4);\n  @$pb.TagNumber(5)\n  set oid($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasOid() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearOid() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get type => $_getI64(5);\n  @$pb.TagNumber(6)\n  set type($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasType() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearType() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get ctime => $_getI64(6);\n  @$pb.TagNumber(7)\n  set ctime($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCtime() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCtime() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  Content get content => $_getN(7);\n  @$pb.TagNumber(8)\n  set content(Content value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasContent() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearContent() => $_clearField(8);\n  @$pb.TagNumber(8)\n  Content ensureContent() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  Member get member => $_getN(8);\n  @$pb.TagNumber(9)\n  set member(Member value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasMember() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearMember() => $_clearField(9);\n  @$pb.TagNumber(9)\n  Member ensureMember() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  ReplyControl get replyControl => $_getN(9);\n  @$pb.TagNumber(10)\n  set replyControl(ReplyControl value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasReplyControl() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearReplyControl() => $_clearField(10);\n  @$pb.TagNumber(10)\n  ReplyControl ensureReplyControl() => $_ensure(9);\n}\n\nclass MainListReply extends $pb.GeneratedMessage {\n  factory MainListReply({\n    CursorReply? cursor,\n    $core.Iterable<ReplyInfo>? replies,\n    SubjectControl? subjectControl,\n    ReplyInfo? upTop,\n    ReplyInfo? adminTop,\n    ReplyInfo? voteTop,\n    Notice? notice,\n    Lottery? lottery,\n    Activity? activity,\n    UpSelection? upSelection,\n    CM? cm,\n    Effects? effects,\n    Operation? operation,\n    $core.Iterable<ReplyInfo>? topReplies,\n    QoeInfo? qoe,\n    $core.Iterable<$core.MapEntry<$core.String, $core.int>>? callbacks,\n    OperationV2? operationV2,\n    Mode? mode,\n    $core.String? modeText,\n    $2.FeedPaginationReply? paginationReply,\n    $core.String? sessionId,\n    $core.String? reportParams,\n    VoteCard? voteCard,\n    ESportsGradeCard? esportsGradeCard,\n    $core.String? contextFeature,\n    $core.String? paginationEndText,\n    $core.Iterable<MixedCard>? mixedCards,\n    $core.Iterable<SubjectTopCards>? subjectTopCards,\n  }) {\n    final result = create();\n    if (cursor != null) result.cursor = cursor;\n    if (replies != null) result.replies.addAll(replies);\n    if (subjectControl != null) result.subjectControl = subjectControl;\n    if (upTop != null) result.upTop = upTop;\n    if (adminTop != null) result.adminTop = adminTop;\n    if (voteTop != null) result.voteTop = voteTop;\n    if (notice != null) result.notice = notice;\n    if (lottery != null) result.lottery = lottery;\n    if (activity != null) result.activity = activity;\n    if (upSelection != null) result.upSelection = upSelection;\n    if (cm != null) result.cm = cm;\n    if (effects != null) result.effects = effects;\n    if (operation != null) result.operation = operation;\n    if (topReplies != null) result.topReplies.addAll(topReplies);\n    if (qoe != null) result.qoe = qoe;\n    if (callbacks != null) result.callbacks.addEntries(callbacks);\n    if (operationV2 != null) result.operationV2 = operationV2;\n    if (mode != null) result.mode = mode;\n    if (modeText != null) result.modeText = modeText;\n    if (paginationReply != null) result.paginationReply = paginationReply;\n    if (sessionId != null) result.sessionId = sessionId;\n    if (reportParams != null) result.reportParams = reportParams;\n    if (voteCard != null) result.voteCard = voteCard;\n    if (esportsGradeCard != null) result.esportsGradeCard = esportsGradeCard;\n    if (contextFeature != null) result.contextFeature = contextFeature;\n    if (paginationEndText != null) result.paginationEndText = paginationEndText;\n    if (mixedCards != null) result.mixedCards.addAll(mixedCards);\n    if (subjectTopCards != null) result.subjectTopCards.addAll(subjectTopCards);\n    return result;\n  }\n\n  MainListReply._();\n\n  factory MainListReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MainListReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MainListReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOM<CursorReply>(1, _omitFieldNames ? '' : 'cursor',\n        subBuilder: CursorReply.create)\n    ..pPM<ReplyInfo>(2, _omitFieldNames ? '' : 'replies',\n        subBuilder: ReplyInfo.create)\n    ..aOM<SubjectControl>(3, _omitFieldNames ? '' : 'subjectControl',\n        subBuilder: SubjectControl.create)\n    ..aOM<ReplyInfo>(4, _omitFieldNames ? '' : 'upTop',\n        subBuilder: ReplyInfo.create)\n    ..aOM<ReplyInfo>(5, _omitFieldNames ? '' : 'adminTop',\n        subBuilder: ReplyInfo.create)\n    ..aOM<ReplyInfo>(6, _omitFieldNames ? '' : 'voteTop',\n        subBuilder: ReplyInfo.create)\n    ..aOM<Notice>(7, _omitFieldNames ? '' : 'notice', subBuilder: Notice.create)\n    ..aOM<Lottery>(8, _omitFieldNames ? '' : 'lottery',\n        subBuilder: Lottery.create)\n    ..aOM<Activity>(9, _omitFieldNames ? '' : 'activity',\n        subBuilder: Activity.create)\n    ..aOM<UpSelection>(10, _omitFieldNames ? '' : 'upSelection',\n        subBuilder: UpSelection.create)\n    ..aOM<CM>(11, _omitFieldNames ? '' : 'cm', subBuilder: CM.create)\n    ..aOM<Effects>(12, _omitFieldNames ? '' : 'effects',\n        subBuilder: Effects.create)\n    ..aOM<Operation>(13, _omitFieldNames ? '' : 'operation',\n        subBuilder: Operation.create)\n    ..pPM<ReplyInfo>(14, _omitFieldNames ? '' : 'topReplies',\n        subBuilder: ReplyInfo.create)\n    ..aOM<QoeInfo>(15, _omitFieldNames ? '' : 'qoe', subBuilder: QoeInfo.create)\n    ..m<$core.String, $core.int>(16, _omitFieldNames ? '' : 'callbacks',\n        entryClassName: 'MainListReply.CallbacksEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.O3,\n        packageName: const $pb.PackageName('bilibili.main.community.reply.v1'))\n    ..aOM<OperationV2>(17, _omitFieldNames ? '' : 'operationV2',\n        subBuilder: OperationV2.create)\n    ..aE<Mode>(18, _omitFieldNames ? '' : 'mode', enumValues: Mode.values)\n    ..aOS(19, _omitFieldNames ? '' : 'modeText')\n    ..aOM<$2.FeedPaginationReply>(20, _omitFieldNames ? '' : 'paginationReply',\n        subBuilder: $2.FeedPaginationReply.create)\n    ..aOS(21, _omitFieldNames ? '' : 'sessionId')\n    ..aOS(22, _omitFieldNames ? '' : 'reportParams')\n    ..aOM<VoteCard>(23, _omitFieldNames ? '' : 'voteCard',\n        subBuilder: VoteCard.create)\n    ..aOM<ESportsGradeCard>(24, _omitFieldNames ? '' : 'esportsGradeCard',\n        subBuilder: ESportsGradeCard.create)\n    ..aOS(25, _omitFieldNames ? '' : 'contextFeature')\n    ..aOS(26, _omitFieldNames ? '' : 'paginationEndText')\n    ..pPM<MixedCard>(27, _omitFieldNames ? '' : 'mixedCards',\n        subBuilder: MixedCard.create)\n    ..pPM<SubjectTopCards>(28, _omitFieldNames ? '' : 'subjectTopCards',\n        subBuilder: SubjectTopCards.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MainListReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MainListReply copyWith(void Function(MainListReply) updates) =>\n      super.copyWith((message) => updates(message as MainListReply))\n          as MainListReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MainListReply create() => MainListReply._();\n  @$core.override\n  MainListReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MainListReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MainListReply>(create);\n  static MainListReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  CursorReply get cursor => $_getN(0);\n  @$pb.TagNumber(1)\n  set cursor(CursorReply value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCursor() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCursor() => $_clearField(1);\n  @$pb.TagNumber(1)\n  CursorReply ensureCursor() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<ReplyInfo> get replies => $_getList(1);\n\n  @$pb.TagNumber(3)\n  SubjectControl get subjectControl => $_getN(2);\n  @$pb.TagNumber(3)\n  set subjectControl(SubjectControl value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSubjectControl() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSubjectControl() => $_clearField(3);\n  @$pb.TagNumber(3)\n  SubjectControl ensureSubjectControl() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  ReplyInfo get upTop => $_getN(3);\n  @$pb.TagNumber(4)\n  set upTop(ReplyInfo value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUpTop() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUpTop() => $_clearField(4);\n  @$pb.TagNumber(4)\n  ReplyInfo ensureUpTop() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  ReplyInfo get adminTop => $_getN(4);\n  @$pb.TagNumber(5)\n  set adminTop(ReplyInfo value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasAdminTop() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearAdminTop() => $_clearField(5);\n  @$pb.TagNumber(5)\n  ReplyInfo ensureAdminTop() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  ReplyInfo get voteTop => $_getN(5);\n  @$pb.TagNumber(6)\n  set voteTop(ReplyInfo value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasVoteTop() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearVoteTop() => $_clearField(6);\n  @$pb.TagNumber(6)\n  ReplyInfo ensureVoteTop() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  Notice get notice => $_getN(6);\n  @$pb.TagNumber(7)\n  set notice(Notice value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasNotice() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearNotice() => $_clearField(7);\n  @$pb.TagNumber(7)\n  Notice ensureNotice() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  Lottery get lottery => $_getN(7);\n  @$pb.TagNumber(8)\n  set lottery(Lottery value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasLottery() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearLottery() => $_clearField(8);\n  @$pb.TagNumber(8)\n  Lottery ensureLottery() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  Activity get activity => $_getN(8);\n  @$pb.TagNumber(9)\n  set activity(Activity value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasActivity() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearActivity() => $_clearField(9);\n  @$pb.TagNumber(9)\n  Activity ensureActivity() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  UpSelection get upSelection => $_getN(9);\n  @$pb.TagNumber(10)\n  set upSelection(UpSelection value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasUpSelection() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearUpSelection() => $_clearField(10);\n  @$pb.TagNumber(10)\n  UpSelection ensureUpSelection() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  CM get cm => $_getN(10);\n  @$pb.TagNumber(11)\n  set cm(CM value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasCm() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearCm() => $_clearField(11);\n  @$pb.TagNumber(11)\n  CM ensureCm() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  Effects get effects => $_getN(11);\n  @$pb.TagNumber(12)\n  set effects(Effects value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasEffects() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearEffects() => $_clearField(12);\n  @$pb.TagNumber(12)\n  Effects ensureEffects() => $_ensure(11);\n\n  @$pb.TagNumber(13)\n  Operation get operation => $_getN(12);\n  @$pb.TagNumber(13)\n  set operation(Operation value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasOperation() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearOperation() => $_clearField(13);\n  @$pb.TagNumber(13)\n  Operation ensureOperation() => $_ensure(12);\n\n  @$pb.TagNumber(14)\n  $pb.PbList<ReplyInfo> get topReplies => $_getList(13);\n\n  @$pb.TagNumber(15)\n  QoeInfo get qoe => $_getN(14);\n  @$pb.TagNumber(15)\n  set qoe(QoeInfo value) => $_setField(15, value);\n  @$pb.TagNumber(15)\n  $core.bool hasQoe() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearQoe() => $_clearField(15);\n  @$pb.TagNumber(15)\n  QoeInfo ensureQoe() => $_ensure(14);\n\n  @$pb.TagNumber(16)\n  $pb.PbMap<$core.String, $core.int> get callbacks => $_getMap(15);\n\n  @$pb.TagNumber(17)\n  OperationV2 get operationV2 => $_getN(16);\n  @$pb.TagNumber(17)\n  set operationV2(OperationV2 value) => $_setField(17, value);\n  @$pb.TagNumber(17)\n  $core.bool hasOperationV2() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearOperationV2() => $_clearField(17);\n  @$pb.TagNumber(17)\n  OperationV2 ensureOperationV2() => $_ensure(16);\n\n  @$pb.TagNumber(18)\n  Mode get mode => $_getN(17);\n  @$pb.TagNumber(18)\n  set mode(Mode value) => $_setField(18, value);\n  @$pb.TagNumber(18)\n  $core.bool hasMode() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearMode() => $_clearField(18);\n\n  @$pb.TagNumber(19)\n  $core.String get modeText => $_getSZ(18);\n  @$pb.TagNumber(19)\n  set modeText($core.String value) => $_setString(18, value);\n  @$pb.TagNumber(19)\n  $core.bool hasModeText() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearModeText() => $_clearField(19);\n\n  @$pb.TagNumber(20)\n  $2.FeedPaginationReply get paginationReply => $_getN(19);\n  @$pb.TagNumber(20)\n  set paginationReply($2.FeedPaginationReply value) => $_setField(20, value);\n  @$pb.TagNumber(20)\n  $core.bool hasPaginationReply() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearPaginationReply() => $_clearField(20);\n  @$pb.TagNumber(20)\n  $2.FeedPaginationReply ensurePaginationReply() => $_ensure(19);\n\n  @$pb.TagNumber(21)\n  $core.String get sessionId => $_getSZ(20);\n  @$pb.TagNumber(21)\n  set sessionId($core.String value) => $_setString(20, value);\n  @$pb.TagNumber(21)\n  $core.bool hasSessionId() => $_has(20);\n  @$pb.TagNumber(21)\n  void clearSessionId() => $_clearField(21);\n\n  @$pb.TagNumber(22)\n  $core.String get reportParams => $_getSZ(21);\n  @$pb.TagNumber(22)\n  set reportParams($core.String value) => $_setString(21, value);\n  @$pb.TagNumber(22)\n  $core.bool hasReportParams() => $_has(21);\n  @$pb.TagNumber(22)\n  void clearReportParams() => $_clearField(22);\n\n  @$pb.TagNumber(23)\n  VoteCard get voteCard => $_getN(22);\n  @$pb.TagNumber(23)\n  set voteCard(VoteCard value) => $_setField(23, value);\n  @$pb.TagNumber(23)\n  $core.bool hasVoteCard() => $_has(22);\n  @$pb.TagNumber(23)\n  void clearVoteCard() => $_clearField(23);\n  @$pb.TagNumber(23)\n  VoteCard ensureVoteCard() => $_ensure(22);\n\n  @$pb.TagNumber(24)\n  ESportsGradeCard get esportsGradeCard => $_getN(23);\n  @$pb.TagNumber(24)\n  set esportsGradeCard(ESportsGradeCard value) => $_setField(24, value);\n  @$pb.TagNumber(24)\n  $core.bool hasEsportsGradeCard() => $_has(23);\n  @$pb.TagNumber(24)\n  void clearEsportsGradeCard() => $_clearField(24);\n  @$pb.TagNumber(24)\n  ESportsGradeCard ensureEsportsGradeCard() => $_ensure(23);\n\n  @$pb.TagNumber(25)\n  $core.String get contextFeature => $_getSZ(24);\n  @$pb.TagNumber(25)\n  set contextFeature($core.String value) => $_setString(24, value);\n  @$pb.TagNumber(25)\n  $core.bool hasContextFeature() => $_has(24);\n  @$pb.TagNumber(25)\n  void clearContextFeature() => $_clearField(25);\n\n  @$pb.TagNumber(26)\n  $core.String get paginationEndText => $_getSZ(25);\n  @$pb.TagNumber(26)\n  set paginationEndText($core.String value) => $_setString(25, value);\n  @$pb.TagNumber(26)\n  $core.bool hasPaginationEndText() => $_has(25);\n  @$pb.TagNumber(26)\n  void clearPaginationEndText() => $_clearField(26);\n\n  @$pb.TagNumber(27)\n  $pb.PbList<MixedCard> get mixedCards => $_getList(26);\n\n  @$pb.TagNumber(28)\n  $pb.PbList<SubjectTopCards> get subjectTopCards => $_getList(27);\n}\n\nclass MainListReq extends $pb.GeneratedMessage {\n  factory MainListReq({\n    $fixnum.Int64? oid,\n    $fixnum.Int64? type,\n    CursorReq? cursor,\n    $core.String? extra,\n    $core.String? adExtra,\n    $fixnum.Int64? rpid,\n    $fixnum.Int64? seekRpid,\n    $core.String? filterTagName,\n    Mode? mode,\n    $2.FeedPagination? pagination,\n    $core.Iterable<$fixnum.Int64>? clientRecallRpids,\n    WordSearchParam? wordSearchParam,\n  }) {\n    final result = create();\n    if (oid != null) result.oid = oid;\n    if (type != null) result.type = type;\n    if (cursor != null) result.cursor = cursor;\n    if (extra != null) result.extra = extra;\n    if (adExtra != null) result.adExtra = adExtra;\n    if (rpid != null) result.rpid = rpid;\n    if (seekRpid != null) result.seekRpid = seekRpid;\n    if (filterTagName != null) result.filterTagName = filterTagName;\n    if (mode != null) result.mode = mode;\n    if (pagination != null) result.pagination = pagination;\n    if (clientRecallRpids != null)\n      result.clientRecallRpids.addAll(clientRecallRpids);\n    if (wordSearchParam != null) result.wordSearchParam = wordSearchParam;\n    return result;\n  }\n\n  MainListReq._();\n\n  factory MainListReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MainListReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MainListReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'oid')\n    ..aInt64(2, _omitFieldNames ? '' : 'type')\n    ..aOM<CursorReq>(3, _omitFieldNames ? '' : 'cursor',\n        subBuilder: CursorReq.create)\n    ..aOS(4, _omitFieldNames ? '' : 'extra')\n    ..aOS(5, _omitFieldNames ? '' : 'adExtra')\n    ..aInt64(6, _omitFieldNames ? '' : 'rpid')\n    ..aInt64(7, _omitFieldNames ? '' : 'seekRpid')\n    ..aOS(8, _omitFieldNames ? '' : 'filterTagName')\n    ..aE<Mode>(9, _omitFieldNames ? '' : 'mode', enumValues: Mode.values)\n    ..aOM<$2.FeedPagination>(10, _omitFieldNames ? '' : 'pagination',\n        subBuilder: $2.FeedPagination.create)\n    ..p<$fixnum.Int64>(\n        11, _omitFieldNames ? '' : 'clientRecallRpids', $pb.PbFieldType.K6)\n    ..aOM<WordSearchParam>(12, _omitFieldNames ? '' : 'wordSearchParam',\n        subBuilder: WordSearchParam.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MainListReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MainListReq copyWith(void Function(MainListReq) updates) =>\n      super.copyWith((message) => updates(message as MainListReq))\n          as MainListReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MainListReq create() => MainListReq._();\n  @$core.override\n  MainListReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MainListReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MainListReq>(create);\n  static MainListReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get oid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set oid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get type => $_getI64(1);\n  @$pb.TagNumber(2)\n  set type($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  CursorReq get cursor => $_getN(2);\n  @$pb.TagNumber(3)\n  set cursor(CursorReq value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCursor() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCursor() => $_clearField(3);\n  @$pb.TagNumber(3)\n  CursorReq ensureCursor() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.String get extra => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set extra($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasExtra() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearExtra() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get adExtra => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set adExtra($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasAdExtra() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearAdExtra() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get rpid => $_getI64(5);\n  @$pb.TagNumber(6)\n  set rpid($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasRpid() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearRpid() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get seekRpid => $_getI64(6);\n  @$pb.TagNumber(7)\n  set seekRpid($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasSeekRpid() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearSeekRpid() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get filterTagName => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set filterTagName($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasFilterTagName() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearFilterTagName() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  Mode get mode => $_getN(8);\n  @$pb.TagNumber(9)\n  set mode(Mode value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasMode() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearMode() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $2.FeedPagination get pagination => $_getN(9);\n  @$pb.TagNumber(10)\n  set pagination($2.FeedPagination value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasPagination() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearPagination() => $_clearField(10);\n  @$pb.TagNumber(10)\n  $2.FeedPagination ensurePagination() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  $pb.PbList<$fixnum.Int64> get clientRecallRpids => $_getList(10);\n\n  @$pb.TagNumber(12)\n  WordSearchParam get wordSearchParam => $_getN(11);\n  @$pb.TagNumber(12)\n  set wordSearchParam(WordSearchParam value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasWordSearchParam() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearWordSearchParam() => $_clearField(12);\n  @$pb.TagNumber(12)\n  WordSearchParam ensureWordSearchParam() => $_ensure(11);\n}\n\nclass Member_NftInteraction_Region extends $pb.GeneratedMessage {\n  factory Member_NftInteraction_Region({\n    Member_NftInteraction_RegionType? type,\n    $core.String? icon,\n    Member_NftInteraction_ShowStatus? showStatus,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (icon != null) result.icon = icon;\n    if (showStatus != null) result.showStatus = showStatus;\n    return result;\n  }\n\n  Member_NftInteraction_Region._();\n\n  factory Member_NftInteraction_Region.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Member_NftInteraction_Region.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Member.NftInteraction.Region',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aE<Member_NftInteraction_RegionType>(1, _omitFieldNames ? '' : 'type',\n        enumValues: Member_NftInteraction_RegionType.values)\n    ..aOS(2, _omitFieldNames ? '' : 'icon')\n    ..aE<Member_NftInteraction_ShowStatus>(\n        3, _omitFieldNames ? '' : 'showStatus',\n        enumValues: Member_NftInteraction_ShowStatus.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Member_NftInteraction_Region clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Member_NftInteraction_Region copyWith(\n          void Function(Member_NftInteraction_Region) updates) =>\n      super.copyWith(\n              (message) => updates(message as Member_NftInteraction_Region))\n          as Member_NftInteraction_Region;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Member_NftInteraction_Region create() =>\n      Member_NftInteraction_Region._();\n  @$core.override\n  Member_NftInteraction_Region createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Member_NftInteraction_Region getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<Member_NftInteraction_Region>(create);\n  static Member_NftInteraction_Region? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Member_NftInteraction_RegionType get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(Member_NftInteraction_RegionType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get icon => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set icon($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIcon() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIcon() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  Member_NftInteraction_ShowStatus get showStatus => $_getN(2);\n  @$pb.TagNumber(3)\n  set showStatus(Member_NftInteraction_ShowStatus value) =>\n      $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasShowStatus() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearShowStatus() => $_clearField(3);\n}\n\nclass Member_NftInteraction extends $pb.GeneratedMessage {\n  factory Member_NftInteraction({\n    $core.String? itype,\n    $core.String? metadataUrl,\n    $core.String? nftId,\n    Member_NftInteraction_Region? region,\n  }) {\n    final result = create();\n    if (itype != null) result.itype = itype;\n    if (metadataUrl != null) result.metadataUrl = metadataUrl;\n    if (nftId != null) result.nftId = nftId;\n    if (region != null) result.region = region;\n    return result;\n  }\n\n  Member_NftInteraction._();\n\n  factory Member_NftInteraction.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Member_NftInteraction.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Member.NftInteraction',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'itype')\n    ..aOS(2, _omitFieldNames ? '' : 'metadataUrl')\n    ..aOS(3, _omitFieldNames ? '' : 'nftId')\n    ..aOM<Member_NftInteraction_Region>(4, _omitFieldNames ? '' : 'region',\n        subBuilder: Member_NftInteraction_Region.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Member_NftInteraction clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Member_NftInteraction copyWith(\n          void Function(Member_NftInteraction) updates) =>\n      super.copyWith((message) => updates(message as Member_NftInteraction))\n          as Member_NftInteraction;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Member_NftInteraction create() => Member_NftInteraction._();\n  @$core.override\n  Member_NftInteraction createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Member_NftInteraction getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<Member_NftInteraction>(create);\n  static Member_NftInteraction? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get itype => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set itype($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasItype() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearItype() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get metadataUrl => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set metadataUrl($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMetadataUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMetadataUrl() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get nftId => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set nftId($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasNftId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearNftId() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  Member_NftInteraction_Region get region => $_getN(3);\n  @$pb.TagNumber(4)\n  set region(Member_NftInteraction_Region value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasRegion() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearRegion() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Member_NftInteraction_Region ensureRegion() => $_ensure(3);\n}\n\nclass Member extends $pb.GeneratedMessage {\n  factory Member({\n    $fixnum.Int64? mid,\n    $core.String? name,\n    $core.String? sex,\n    $core.String? face,\n    $fixnum.Int64? level,\n    $fixnum.Int64? officialVerifyType,\n    $fixnum.Int64? vipType,\n    $fixnum.Int64? vipStatus,\n    $fixnum.Int64? vipThemeType,\n    $core.String? vipLabelPath,\n    $core.String? garbPendantImage,\n    $core.String? garbCardImage,\n    $core.String? garbCardImageWithFocus,\n    $core.String? garbCardJumpUrl,\n    $core.String? garbCardNumber,\n    $core.String? garbCardFanColor,\n    $core.bool? garbCardIsFan,\n    $core.String? fansMedalName,\n    $fixnum.Int64? fansMedalLevel,\n    $fixnum.Int64? fansMedalColor,\n    $core.String? vipNicknameColor,\n    $core.int? vipAvatarSubscript,\n    $core.String? vipLabelText,\n    $core.String? vipLabelTheme,\n    $fixnum.Int64? fansMedalColorEnd,\n    $fixnum.Int64? fansMedalColorBorder,\n    $fixnum.Int64? fansMedalColorName,\n    $fixnum.Int64? fansMedalColorLevel,\n    $fixnum.Int64? fansGuardLevel,\n    $core.int? faceNft,\n    $core.int? faceNftNew,\n    $core.int? isSeniorMember,\n    Member_NftInteraction? nftInteraction,\n    $core.String? fansGuardIcon,\n    $core.String? fansHonorIcon,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (name != null) result.name = name;\n    if (sex != null) result.sex = sex;\n    if (face != null) result.face = face;\n    if (level != null) result.level = level;\n    if (officialVerifyType != null)\n      result.officialVerifyType = officialVerifyType;\n    if (vipType != null) result.vipType = vipType;\n    if (vipStatus != null) result.vipStatus = vipStatus;\n    if (vipThemeType != null) result.vipThemeType = vipThemeType;\n    if (vipLabelPath != null) result.vipLabelPath = vipLabelPath;\n    if (garbPendantImage != null) result.garbPendantImage = garbPendantImage;\n    if (garbCardImage != null) result.garbCardImage = garbCardImage;\n    if (garbCardImageWithFocus != null)\n      result.garbCardImageWithFocus = garbCardImageWithFocus;\n    if (garbCardJumpUrl != null) result.garbCardJumpUrl = garbCardJumpUrl;\n    if (garbCardNumber != null) result.garbCardNumber = garbCardNumber;\n    if (garbCardFanColor != null) result.garbCardFanColor = garbCardFanColor;\n    if (garbCardIsFan != null) result.garbCardIsFan = garbCardIsFan;\n    if (fansMedalName != null) result.fansMedalName = fansMedalName;\n    if (fansMedalLevel != null) result.fansMedalLevel = fansMedalLevel;\n    if (fansMedalColor != null) result.fansMedalColor = fansMedalColor;\n    if (vipNicknameColor != null) result.vipNicknameColor = vipNicknameColor;\n    if (vipAvatarSubscript != null)\n      result.vipAvatarSubscript = vipAvatarSubscript;\n    if (vipLabelText != null) result.vipLabelText = vipLabelText;\n    if (vipLabelTheme != null) result.vipLabelTheme = vipLabelTheme;\n    if (fansMedalColorEnd != null) result.fansMedalColorEnd = fansMedalColorEnd;\n    if (fansMedalColorBorder != null)\n      result.fansMedalColorBorder = fansMedalColorBorder;\n    if (fansMedalColorName != null)\n      result.fansMedalColorName = fansMedalColorName;\n    if (fansMedalColorLevel != null)\n      result.fansMedalColorLevel = fansMedalColorLevel;\n    if (fansGuardLevel != null) result.fansGuardLevel = fansGuardLevel;\n    if (faceNft != null) result.faceNft = faceNft;\n    if (faceNftNew != null) result.faceNftNew = faceNftNew;\n    if (isSeniorMember != null) result.isSeniorMember = isSeniorMember;\n    if (nftInteraction != null) result.nftInteraction = nftInteraction;\n    if (fansGuardIcon != null) result.fansGuardIcon = fansGuardIcon;\n    if (fansHonorIcon != null) result.fansHonorIcon = fansHonorIcon;\n    return result;\n  }\n\n  Member._();\n\n  factory Member.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Member.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Member',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'sex')\n    ..aOS(4, _omitFieldNames ? '' : 'face')\n    ..aInt64(5, _omitFieldNames ? '' : 'level')\n    ..aInt64(6, _omitFieldNames ? '' : 'officialVerifyType')\n    ..aInt64(7, _omitFieldNames ? '' : 'vipType')\n    ..aInt64(8, _omitFieldNames ? '' : 'vipStatus')\n    ..aInt64(9, _omitFieldNames ? '' : 'vipThemeType')\n    ..aOS(10, _omitFieldNames ? '' : 'vipLabelPath')\n    ..aOS(11, _omitFieldNames ? '' : 'garbPendantImage')\n    ..aOS(12, _omitFieldNames ? '' : 'garbCardImage')\n    ..aOS(13, _omitFieldNames ? '' : 'garbCardImageWithFocus')\n    ..aOS(14, _omitFieldNames ? '' : 'garbCardJumpUrl')\n    ..aOS(15, _omitFieldNames ? '' : 'garbCardNumber')\n    ..aOS(16, _omitFieldNames ? '' : 'garbCardFanColor')\n    ..aOB(17, _omitFieldNames ? '' : 'garbCardIsFan')\n    ..aOS(18, _omitFieldNames ? '' : 'fansMedalName')\n    ..aInt64(19, _omitFieldNames ? '' : 'fansMedalLevel')\n    ..aInt64(20, _omitFieldNames ? '' : 'fansMedalColor')\n    ..aOS(21, _omitFieldNames ? '' : 'vipNicknameColor')\n    ..aI(22, _omitFieldNames ? '' : 'vipAvatarSubscript')\n    ..aOS(23, _omitFieldNames ? '' : 'vipLabelText')\n    ..aOS(24, _omitFieldNames ? '' : 'vipLabelTheme')\n    ..aInt64(25, _omitFieldNames ? '' : 'fansMedalColorEnd')\n    ..aInt64(26, _omitFieldNames ? '' : 'fansMedalColorBorder')\n    ..aInt64(27, _omitFieldNames ? '' : 'fansMedalColorName')\n    ..aInt64(28, _omitFieldNames ? '' : 'fansMedalColorLevel')\n    ..aInt64(29, _omitFieldNames ? '' : 'fansGuardLevel')\n    ..aI(30, _omitFieldNames ? '' : 'faceNft')\n    ..aI(31, _omitFieldNames ? '' : 'faceNftNew')\n    ..aI(32, _omitFieldNames ? '' : 'isSeniorMember')\n    ..aOM<Member_NftInteraction>(33, _omitFieldNames ? '' : 'nftInteraction',\n        subBuilder: Member_NftInteraction.create)\n    ..aOS(34, _omitFieldNames ? '' : 'fansGuardIcon')\n    ..aOS(35, _omitFieldNames ? '' : 'fansHonorIcon')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Member clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Member copyWith(void Function(Member) updates) =>\n      super.copyWith((message) => updates(message as Member)) as Member;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Member create() => Member._();\n  @$core.override\n  Member createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Member getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Member>(create);\n  static Member? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get sex => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set sex($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSex() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSex() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get face => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set face($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFace() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFace() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get level => $_getI64(4);\n  @$pb.TagNumber(5)\n  set level($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasLevel() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearLevel() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get officialVerifyType => $_getI64(5);\n  @$pb.TagNumber(6)\n  set officialVerifyType($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasOfficialVerifyType() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearOfficialVerifyType() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get vipType => $_getI64(6);\n  @$pb.TagNumber(7)\n  set vipType($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasVipType() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearVipType() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get vipStatus => $_getI64(7);\n  @$pb.TagNumber(8)\n  set vipStatus($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasVipStatus() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearVipStatus() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get vipThemeType => $_getI64(8);\n  @$pb.TagNumber(9)\n  set vipThemeType($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasVipThemeType() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearVipThemeType() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get vipLabelPath => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set vipLabelPath($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasVipLabelPath() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearVipLabelPath() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get garbPendantImage => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set garbPendantImage($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasGarbPendantImage() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearGarbPendantImage() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get garbCardImage => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set garbCardImage($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasGarbCardImage() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearGarbCardImage() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.String get garbCardImageWithFocus => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set garbCardImageWithFocus($core.String value) => $_setString(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasGarbCardImageWithFocus() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearGarbCardImageWithFocus() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.String get garbCardJumpUrl => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set garbCardJumpUrl($core.String value) => $_setString(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasGarbCardJumpUrl() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearGarbCardJumpUrl() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $core.String get garbCardNumber => $_getSZ(14);\n  @$pb.TagNumber(15)\n  set garbCardNumber($core.String value) => $_setString(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasGarbCardNumber() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearGarbCardNumber() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $core.String get garbCardFanColor => $_getSZ(15);\n  @$pb.TagNumber(16)\n  set garbCardFanColor($core.String value) => $_setString(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasGarbCardFanColor() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearGarbCardFanColor() => $_clearField(16);\n\n  @$pb.TagNumber(17)\n  $core.bool get garbCardIsFan => $_getBF(16);\n  @$pb.TagNumber(17)\n  set garbCardIsFan($core.bool value) => $_setBool(16, value);\n  @$pb.TagNumber(17)\n  $core.bool hasGarbCardIsFan() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearGarbCardIsFan() => $_clearField(17);\n\n  @$pb.TagNumber(18)\n  $core.String get fansMedalName => $_getSZ(17);\n  @$pb.TagNumber(18)\n  set fansMedalName($core.String value) => $_setString(17, value);\n  @$pb.TagNumber(18)\n  $core.bool hasFansMedalName() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearFansMedalName() => $_clearField(18);\n\n  @$pb.TagNumber(19)\n  $fixnum.Int64 get fansMedalLevel => $_getI64(18);\n  @$pb.TagNumber(19)\n  set fansMedalLevel($fixnum.Int64 value) => $_setInt64(18, value);\n  @$pb.TagNumber(19)\n  $core.bool hasFansMedalLevel() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearFansMedalLevel() => $_clearField(19);\n\n  @$pb.TagNumber(20)\n  $fixnum.Int64 get fansMedalColor => $_getI64(19);\n  @$pb.TagNumber(20)\n  set fansMedalColor($fixnum.Int64 value) => $_setInt64(19, value);\n  @$pb.TagNumber(20)\n  $core.bool hasFansMedalColor() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearFansMedalColor() => $_clearField(20);\n\n  @$pb.TagNumber(21)\n  $core.String get vipNicknameColor => $_getSZ(20);\n  @$pb.TagNumber(21)\n  set vipNicknameColor($core.String value) => $_setString(20, value);\n  @$pb.TagNumber(21)\n  $core.bool hasVipNicknameColor() => $_has(20);\n  @$pb.TagNumber(21)\n  void clearVipNicknameColor() => $_clearField(21);\n\n  @$pb.TagNumber(22)\n  $core.int get vipAvatarSubscript => $_getIZ(21);\n  @$pb.TagNumber(22)\n  set vipAvatarSubscript($core.int value) => $_setSignedInt32(21, value);\n  @$pb.TagNumber(22)\n  $core.bool hasVipAvatarSubscript() => $_has(21);\n  @$pb.TagNumber(22)\n  void clearVipAvatarSubscript() => $_clearField(22);\n\n  @$pb.TagNumber(23)\n  $core.String get vipLabelText => $_getSZ(22);\n  @$pb.TagNumber(23)\n  set vipLabelText($core.String value) => $_setString(22, value);\n  @$pb.TagNumber(23)\n  $core.bool hasVipLabelText() => $_has(22);\n  @$pb.TagNumber(23)\n  void clearVipLabelText() => $_clearField(23);\n\n  @$pb.TagNumber(24)\n  $core.String get vipLabelTheme => $_getSZ(23);\n  @$pb.TagNumber(24)\n  set vipLabelTheme($core.String value) => $_setString(23, value);\n  @$pb.TagNumber(24)\n  $core.bool hasVipLabelTheme() => $_has(23);\n  @$pb.TagNumber(24)\n  void clearVipLabelTheme() => $_clearField(24);\n\n  @$pb.TagNumber(25)\n  $fixnum.Int64 get fansMedalColorEnd => $_getI64(24);\n  @$pb.TagNumber(25)\n  set fansMedalColorEnd($fixnum.Int64 value) => $_setInt64(24, value);\n  @$pb.TagNumber(25)\n  $core.bool hasFansMedalColorEnd() => $_has(24);\n  @$pb.TagNumber(25)\n  void clearFansMedalColorEnd() => $_clearField(25);\n\n  @$pb.TagNumber(26)\n  $fixnum.Int64 get fansMedalColorBorder => $_getI64(25);\n  @$pb.TagNumber(26)\n  set fansMedalColorBorder($fixnum.Int64 value) => $_setInt64(25, value);\n  @$pb.TagNumber(26)\n  $core.bool hasFansMedalColorBorder() => $_has(25);\n  @$pb.TagNumber(26)\n  void clearFansMedalColorBorder() => $_clearField(26);\n\n  @$pb.TagNumber(27)\n  $fixnum.Int64 get fansMedalColorName => $_getI64(26);\n  @$pb.TagNumber(27)\n  set fansMedalColorName($fixnum.Int64 value) => $_setInt64(26, value);\n  @$pb.TagNumber(27)\n  $core.bool hasFansMedalColorName() => $_has(26);\n  @$pb.TagNumber(27)\n  void clearFansMedalColorName() => $_clearField(27);\n\n  @$pb.TagNumber(28)\n  $fixnum.Int64 get fansMedalColorLevel => $_getI64(27);\n  @$pb.TagNumber(28)\n  set fansMedalColorLevel($fixnum.Int64 value) => $_setInt64(27, value);\n  @$pb.TagNumber(28)\n  $core.bool hasFansMedalColorLevel() => $_has(27);\n  @$pb.TagNumber(28)\n  void clearFansMedalColorLevel() => $_clearField(28);\n\n  @$pb.TagNumber(29)\n  $fixnum.Int64 get fansGuardLevel => $_getI64(28);\n  @$pb.TagNumber(29)\n  set fansGuardLevel($fixnum.Int64 value) => $_setInt64(28, value);\n  @$pb.TagNumber(29)\n  $core.bool hasFansGuardLevel() => $_has(28);\n  @$pb.TagNumber(29)\n  void clearFansGuardLevel() => $_clearField(29);\n\n  @$pb.TagNumber(30)\n  $core.int get faceNft => $_getIZ(29);\n  @$pb.TagNumber(30)\n  set faceNft($core.int value) => $_setSignedInt32(29, value);\n  @$pb.TagNumber(30)\n  $core.bool hasFaceNft() => $_has(29);\n  @$pb.TagNumber(30)\n  void clearFaceNft() => $_clearField(30);\n\n  @$pb.TagNumber(31)\n  $core.int get faceNftNew => $_getIZ(30);\n  @$pb.TagNumber(31)\n  set faceNftNew($core.int value) => $_setSignedInt32(30, value);\n  @$pb.TagNumber(31)\n  $core.bool hasFaceNftNew() => $_has(30);\n  @$pb.TagNumber(31)\n  void clearFaceNftNew() => $_clearField(31);\n\n  @$pb.TagNumber(32)\n  $core.int get isSeniorMember => $_getIZ(31);\n  @$pb.TagNumber(32)\n  set isSeniorMember($core.int value) => $_setSignedInt32(31, value);\n  @$pb.TagNumber(32)\n  $core.bool hasIsSeniorMember() => $_has(31);\n  @$pb.TagNumber(32)\n  void clearIsSeniorMember() => $_clearField(32);\n\n  @$pb.TagNumber(33)\n  Member_NftInteraction get nftInteraction => $_getN(32);\n  @$pb.TagNumber(33)\n  set nftInteraction(Member_NftInteraction value) => $_setField(33, value);\n  @$pb.TagNumber(33)\n  $core.bool hasNftInteraction() => $_has(32);\n  @$pb.TagNumber(33)\n  void clearNftInteraction() => $_clearField(33);\n  @$pb.TagNumber(33)\n  Member_NftInteraction ensureNftInteraction() => $_ensure(32);\n\n  @$pb.TagNumber(34)\n  $core.String get fansGuardIcon => $_getSZ(33);\n  @$pb.TagNumber(34)\n  set fansGuardIcon($core.String value) => $_setString(33, value);\n  @$pb.TagNumber(34)\n  $core.bool hasFansGuardIcon() => $_has(33);\n  @$pb.TagNumber(34)\n  void clearFansGuardIcon() => $_clearField(34);\n\n  @$pb.TagNumber(35)\n  $core.String get fansHonorIcon => $_getSZ(34);\n  @$pb.TagNumber(35)\n  set fansHonorIcon($core.String value) => $_setString(34, value);\n  @$pb.TagNumber(35)\n  $core.bool hasFansHonorIcon() => $_has(34);\n  @$pb.TagNumber(35)\n  void clearFansHonorIcon() => $_clearField(35);\n}\n\nclass MemberV2_Basic extends $pb.GeneratedMessage {\n  factory MemberV2_Basic({\n    $fixnum.Int64? mid,\n    $core.String? name,\n    $core.String? sex,\n    $core.String? face,\n    $fixnum.Int64? level,\n    $4.AvatarItem? avatarItem,\n    $5.NameRender? nameRender,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (name != null) result.name = name;\n    if (sex != null) result.sex = sex;\n    if (face != null) result.face = face;\n    if (level != null) result.level = level;\n    if (avatarItem != null) result.avatarItem = avatarItem;\n    if (nameRender != null) result.nameRender = nameRender;\n    return result;\n  }\n\n  MemberV2_Basic._();\n\n  factory MemberV2_Basic.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MemberV2_Basic.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MemberV2.Basic',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'sex')\n    ..aOS(4, _omitFieldNames ? '' : 'face')\n    ..aInt64(5, _omitFieldNames ? '' : 'level')\n    ..aOM<$4.AvatarItem>(6, _omitFieldNames ? '' : 'avatarItem',\n        subBuilder: $4.AvatarItem.create)\n    ..aOM<$5.NameRender>(7, _omitFieldNames ? '' : 'nameRender',\n        subBuilder: $5.NameRender.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MemberV2_Basic clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MemberV2_Basic copyWith(void Function(MemberV2_Basic) updates) =>\n      super.copyWith((message) => updates(message as MemberV2_Basic))\n          as MemberV2_Basic;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MemberV2_Basic create() => MemberV2_Basic._();\n  @$core.override\n  MemberV2_Basic createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MemberV2_Basic getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MemberV2_Basic>(create);\n  static MemberV2_Basic? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get sex => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set sex($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSex() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSex() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get face => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set face($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFace() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFace() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get level => $_getI64(4);\n  @$pb.TagNumber(5)\n  set level($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasLevel() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearLevel() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $4.AvatarItem get avatarItem => $_getN(5);\n  @$pb.TagNumber(6)\n  set avatarItem($4.AvatarItem value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasAvatarItem() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearAvatarItem() => $_clearField(6);\n  @$pb.TagNumber(6)\n  $4.AvatarItem ensureAvatarItem() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $5.NameRender get nameRender => $_getN(6);\n  @$pb.TagNumber(7)\n  set nameRender($5.NameRender value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasNameRender() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearNameRender() => $_clearField(7);\n  @$pb.TagNumber(7)\n  $5.NameRender ensureNameRender() => $_ensure(6);\n}\n\nclass MemberV2_Contractor extends $pb.GeneratedMessage {\n  factory MemberV2_Contractor({\n    $core.bool? isContractor,\n    $core.String? contractDesc,\n  }) {\n    final result = create();\n    if (isContractor != null) result.isContractor = isContractor;\n    if (contractDesc != null) result.contractDesc = contractDesc;\n    return result;\n  }\n\n  MemberV2_Contractor._();\n\n  factory MemberV2_Contractor.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MemberV2_Contractor.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MemberV2.Contractor',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'isContractor')\n    ..aOS(2, _omitFieldNames ? '' : 'contractDesc')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MemberV2_Contractor clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MemberV2_Contractor copyWith(void Function(MemberV2_Contractor) updates) =>\n      super.copyWith((message) => updates(message as MemberV2_Contractor))\n          as MemberV2_Contractor;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MemberV2_Contractor create() => MemberV2_Contractor._();\n  @$core.override\n  MemberV2_Contractor createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MemberV2_Contractor getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MemberV2_Contractor>(create);\n  static MemberV2_Contractor? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get isContractor => $_getBF(0);\n  @$pb.TagNumber(1)\n  set isContractor($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIsContractor() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIsContractor() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get contractDesc => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set contractDesc($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasContractDesc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearContractDesc() => $_clearField(2);\n}\n\nclass MemberV2_Garb_FanNumColorFormat extends $pb.GeneratedMessage {\n  factory MemberV2_Garb_FanNumColorFormat({\n    $core.String? startPoint,\n    $core.String? endPoint,\n    $core.Iterable<$core.String>? colors,\n    $core.Iterable<$fixnum.Int64>? gradients,\n  }) {\n    final result = create();\n    if (startPoint != null) result.startPoint = startPoint;\n    if (endPoint != null) result.endPoint = endPoint;\n    if (colors != null) result.colors.addAll(colors);\n    if (gradients != null) result.gradients.addAll(gradients);\n    return result;\n  }\n\n  MemberV2_Garb_FanNumColorFormat._();\n\n  factory MemberV2_Garb_FanNumColorFormat.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MemberV2_Garb_FanNumColorFormat.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MemberV2.Garb.FanNumColorFormat',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'startPoint')\n    ..aOS(2, _omitFieldNames ? '' : 'endPoint')\n    ..pPS(3, _omitFieldNames ? '' : 'colors')\n    ..p<$fixnum.Int64>(\n        4, _omitFieldNames ? '' : 'gradients', $pb.PbFieldType.K6)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MemberV2_Garb_FanNumColorFormat clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MemberV2_Garb_FanNumColorFormat copyWith(\n          void Function(MemberV2_Garb_FanNumColorFormat) updates) =>\n      super.copyWith(\n              (message) => updates(message as MemberV2_Garb_FanNumColorFormat))\n          as MemberV2_Garb_FanNumColorFormat;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MemberV2_Garb_FanNumColorFormat create() =>\n      MemberV2_Garb_FanNumColorFormat._();\n  @$core.override\n  MemberV2_Garb_FanNumColorFormat createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MemberV2_Garb_FanNumColorFormat getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MemberV2_Garb_FanNumColorFormat>(\n          create);\n  static MemberV2_Garb_FanNumColorFormat? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get startPoint => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set startPoint($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStartPoint() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStartPoint() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get endPoint => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set endPoint($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasEndPoint() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearEndPoint() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<$core.String> get colors => $_getList(2);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<$fixnum.Int64> get gradients => $_getList(3);\n}\n\nclass MemberV2_Garb extends $pb.GeneratedMessage {\n  factory MemberV2_Garb({\n    $core.String? pendantImage,\n    $core.String? cardImage,\n    $core.String? cardImageWithFocus,\n    $core.String? cardJumpUrl,\n    $core.String? cardNumber,\n    $core.String? cardFanColor,\n    $core.bool? cardIsFan,\n    $core.String? fanNumPrefix,\n    MemberV2_Garb_FanNumColorFormat? fanNumColorFormat,\n  }) {\n    final result = create();\n    if (pendantImage != null) result.pendantImage = pendantImage;\n    if (cardImage != null) result.cardImage = cardImage;\n    if (cardImageWithFocus != null)\n      result.cardImageWithFocus = cardImageWithFocus;\n    if (cardJumpUrl != null) result.cardJumpUrl = cardJumpUrl;\n    if (cardNumber != null) result.cardNumber = cardNumber;\n    if (cardFanColor != null) result.cardFanColor = cardFanColor;\n    if (cardIsFan != null) result.cardIsFan = cardIsFan;\n    if (fanNumPrefix != null) result.fanNumPrefix = fanNumPrefix;\n    if (fanNumColorFormat != null) result.fanNumColorFormat = fanNumColorFormat;\n    return result;\n  }\n\n  MemberV2_Garb._();\n\n  factory MemberV2_Garb.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MemberV2_Garb.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MemberV2.Garb',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'pendantImage')\n    ..aOS(2, _omitFieldNames ? '' : 'cardImage')\n    ..aOS(3, _omitFieldNames ? '' : 'cardImageWithFocus')\n    ..aOS(4, _omitFieldNames ? '' : 'cardJumpUrl')\n    ..aOS(5, _omitFieldNames ? '' : 'cardNumber')\n    ..aOS(6, _omitFieldNames ? '' : 'cardFanColor')\n    ..aOB(7, _omitFieldNames ? '' : 'cardIsFan')\n    ..aOS(8, _omitFieldNames ? '' : 'fanNumPrefix')\n    ..aOM<MemberV2_Garb_FanNumColorFormat>(\n        9, _omitFieldNames ? '' : 'fanNumColorFormat',\n        subBuilder: MemberV2_Garb_FanNumColorFormat.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MemberV2_Garb clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MemberV2_Garb copyWith(void Function(MemberV2_Garb) updates) =>\n      super.copyWith((message) => updates(message as MemberV2_Garb))\n          as MemberV2_Garb;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MemberV2_Garb create() => MemberV2_Garb._();\n  @$core.override\n  MemberV2_Garb createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MemberV2_Garb getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MemberV2_Garb>(create);\n  static MemberV2_Garb? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get pendantImage => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set pendantImage($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPendantImage() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPendantImage() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get cardImage => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cardImage($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCardImage() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCardImage() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get cardImageWithFocus => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set cardImageWithFocus($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCardImageWithFocus() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCardImageWithFocus() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get cardJumpUrl => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set cardJumpUrl($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCardJumpUrl() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCardJumpUrl() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get cardNumber => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set cardNumber($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCardNumber() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCardNumber() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get cardFanColor => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set cardFanColor($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCardFanColor() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCardFanColor() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.bool get cardIsFan => $_getBF(6);\n  @$pb.TagNumber(7)\n  set cardIsFan($core.bool value) => $_setBool(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasCardIsFan() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearCardIsFan() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get fanNumPrefix => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set fanNumPrefix($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasFanNumPrefix() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearFanNumPrefix() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  MemberV2_Garb_FanNumColorFormat get fanNumColorFormat => $_getN(8);\n  @$pb.TagNumber(9)\n  set fanNumColorFormat(MemberV2_Garb_FanNumColorFormat value) =>\n      $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasFanNumColorFormat() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearFanNumColorFormat() => $_clearField(9);\n  @$pb.TagNumber(9)\n  MemberV2_Garb_FanNumColorFormat ensureFanNumColorFormat() => $_ensure(8);\n}\n\nclass MemberV2_Medal extends $pb.GeneratedMessage {\n  factory MemberV2_Medal({\n    $core.String? name,\n    $fixnum.Int64? level,\n    $fixnum.Int64? colorStart,\n    $fixnum.Int64? colorEnd,\n    $fixnum.Int64? colorBorder,\n    $fixnum.Int64? colorName,\n    $fixnum.Int64? colorLevel,\n    $fixnum.Int64? guardLevel,\n    $core.String? firstIcon,\n    $core.String? secondIcon,\n    $fixnum.Int64? levelBgColor,\n  }) {\n    final result = create();\n    if (name != null) result.name = name;\n    if (level != null) result.level = level;\n    if (colorStart != null) result.colorStart = colorStart;\n    if (colorEnd != null) result.colorEnd = colorEnd;\n    if (colorBorder != null) result.colorBorder = colorBorder;\n    if (colorName != null) result.colorName = colorName;\n    if (colorLevel != null) result.colorLevel = colorLevel;\n    if (guardLevel != null) result.guardLevel = guardLevel;\n    if (firstIcon != null) result.firstIcon = firstIcon;\n    if (secondIcon != null) result.secondIcon = secondIcon;\n    if (levelBgColor != null) result.levelBgColor = levelBgColor;\n    return result;\n  }\n\n  MemberV2_Medal._();\n\n  factory MemberV2_Medal.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MemberV2_Medal.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MemberV2.Medal',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'name')\n    ..aInt64(2, _omitFieldNames ? '' : 'level')\n    ..aInt64(3, _omitFieldNames ? '' : 'colorStart')\n    ..aInt64(4, _omitFieldNames ? '' : 'colorEnd')\n    ..aInt64(5, _omitFieldNames ? '' : 'colorBorder')\n    ..aInt64(6, _omitFieldNames ? '' : 'colorName')\n    ..aInt64(7, _omitFieldNames ? '' : 'colorLevel')\n    ..aInt64(8, _omitFieldNames ? '' : 'guardLevel')\n    ..aOS(9, _omitFieldNames ? '' : 'firstIcon')\n    ..aOS(10, _omitFieldNames ? '' : 'secondIcon')\n    ..aInt64(11, _omitFieldNames ? '' : 'levelBgColor')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MemberV2_Medal clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MemberV2_Medal copyWith(void Function(MemberV2_Medal) updates) =>\n      super.copyWith((message) => updates(message as MemberV2_Medal))\n          as MemberV2_Medal;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MemberV2_Medal create() => MemberV2_Medal._();\n  @$core.override\n  MemberV2_Medal createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MemberV2_Medal getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MemberV2_Medal>(create);\n  static MemberV2_Medal? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get name => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set name($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasName() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearName() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get level => $_getI64(1);\n  @$pb.TagNumber(2)\n  set level($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLevel() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLevel() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get colorStart => $_getI64(2);\n  @$pb.TagNumber(3)\n  set colorStart($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasColorStart() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearColorStart() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get colorEnd => $_getI64(3);\n  @$pb.TagNumber(4)\n  set colorEnd($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasColorEnd() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearColorEnd() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get colorBorder => $_getI64(4);\n  @$pb.TagNumber(5)\n  set colorBorder($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasColorBorder() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearColorBorder() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get colorName => $_getI64(5);\n  @$pb.TagNumber(6)\n  set colorName($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasColorName() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearColorName() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get colorLevel => $_getI64(6);\n  @$pb.TagNumber(7)\n  set colorLevel($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasColorLevel() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearColorLevel() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get guardLevel => $_getI64(7);\n  @$pb.TagNumber(8)\n  set guardLevel($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasGuardLevel() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearGuardLevel() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get firstIcon => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set firstIcon($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasFirstIcon() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearFirstIcon() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get secondIcon => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set secondIcon($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasSecondIcon() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearSecondIcon() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $fixnum.Int64 get levelBgColor => $_getI64(10);\n  @$pb.TagNumber(11)\n  set levelBgColor($fixnum.Int64 value) => $_setInt64(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasLevelBgColor() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearLevelBgColor() => $_clearField(11);\n}\n\nclass MemberV2_Nft_Interaction_Region extends $pb.GeneratedMessage {\n  factory MemberV2_Nft_Interaction_Region({\n    MemberV2_Nft_Interaction_RegionType? type,\n    $core.String? icon,\n    MemberV2_Nft_Interaction_ShowStatus? showStatus,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (icon != null) result.icon = icon;\n    if (showStatus != null) result.showStatus = showStatus;\n    return result;\n  }\n\n  MemberV2_Nft_Interaction_Region._();\n\n  factory MemberV2_Nft_Interaction_Region.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MemberV2_Nft_Interaction_Region.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MemberV2.Nft.Interaction.Region',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aE<MemberV2_Nft_Interaction_RegionType>(1, _omitFieldNames ? '' : 'type',\n        enumValues: MemberV2_Nft_Interaction_RegionType.values)\n    ..aOS(2, _omitFieldNames ? '' : 'icon')\n    ..aE<MemberV2_Nft_Interaction_ShowStatus>(\n        3, _omitFieldNames ? '' : 'showStatus',\n        enumValues: MemberV2_Nft_Interaction_ShowStatus.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MemberV2_Nft_Interaction_Region clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MemberV2_Nft_Interaction_Region copyWith(\n          void Function(MemberV2_Nft_Interaction_Region) updates) =>\n      super.copyWith(\n              (message) => updates(message as MemberV2_Nft_Interaction_Region))\n          as MemberV2_Nft_Interaction_Region;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MemberV2_Nft_Interaction_Region create() =>\n      MemberV2_Nft_Interaction_Region._();\n  @$core.override\n  MemberV2_Nft_Interaction_Region createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MemberV2_Nft_Interaction_Region getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MemberV2_Nft_Interaction_Region>(\n          create);\n  static MemberV2_Nft_Interaction_Region? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  MemberV2_Nft_Interaction_RegionType get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(MemberV2_Nft_Interaction_RegionType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get icon => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set icon($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIcon() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIcon() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  MemberV2_Nft_Interaction_ShowStatus get showStatus => $_getN(2);\n  @$pb.TagNumber(3)\n  set showStatus(MemberV2_Nft_Interaction_ShowStatus value) =>\n      $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasShowStatus() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearShowStatus() => $_clearField(3);\n}\n\nclass MemberV2_Nft_Interaction extends $pb.GeneratedMessage {\n  factory MemberV2_Nft_Interaction({\n    $core.String? itype,\n    $core.String? metadataUrl,\n    $core.String? nftId,\n    MemberV2_Nft_Interaction_Region? region,\n  }) {\n    final result = create();\n    if (itype != null) result.itype = itype;\n    if (metadataUrl != null) result.metadataUrl = metadataUrl;\n    if (nftId != null) result.nftId = nftId;\n    if (region != null) result.region = region;\n    return result;\n  }\n\n  MemberV2_Nft_Interaction._();\n\n  factory MemberV2_Nft_Interaction.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MemberV2_Nft_Interaction.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MemberV2.Nft.Interaction',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'itype')\n    ..aOS(2, _omitFieldNames ? '' : 'metadataUrl')\n    ..aOS(3, _omitFieldNames ? '' : 'nftId')\n    ..aOM<MemberV2_Nft_Interaction_Region>(4, _omitFieldNames ? '' : 'region',\n        subBuilder: MemberV2_Nft_Interaction_Region.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MemberV2_Nft_Interaction clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MemberV2_Nft_Interaction copyWith(\n          void Function(MemberV2_Nft_Interaction) updates) =>\n      super.copyWith((message) => updates(message as MemberV2_Nft_Interaction))\n          as MemberV2_Nft_Interaction;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MemberV2_Nft_Interaction create() => MemberV2_Nft_Interaction._();\n  @$core.override\n  MemberV2_Nft_Interaction createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MemberV2_Nft_Interaction getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MemberV2_Nft_Interaction>(create);\n  static MemberV2_Nft_Interaction? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get itype => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set itype($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasItype() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearItype() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get metadataUrl => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set metadataUrl($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMetadataUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMetadataUrl() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get nftId => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set nftId($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasNftId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearNftId() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  MemberV2_Nft_Interaction_Region get region => $_getN(3);\n  @$pb.TagNumber(4)\n  set region(MemberV2_Nft_Interaction_Region value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasRegion() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearRegion() => $_clearField(4);\n  @$pb.TagNumber(4)\n  MemberV2_Nft_Interaction_Region ensureRegion() => $_ensure(3);\n}\n\nclass MemberV2_Nft extends $pb.GeneratedMessage {\n  factory MemberV2_Nft({\n    $core.int? face,\n    MemberV2_Nft_Interaction? interaction,\n  }) {\n    final result = create();\n    if (face != null) result.face = face;\n    if (interaction != null) result.interaction = interaction;\n    return result;\n  }\n\n  MemberV2_Nft._();\n\n  factory MemberV2_Nft.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MemberV2_Nft.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MemberV2.Nft',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'face')\n    ..aOM<MemberV2_Nft_Interaction>(2, _omitFieldNames ? '' : 'interaction',\n        subBuilder: MemberV2_Nft_Interaction.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MemberV2_Nft clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MemberV2_Nft copyWith(void Function(MemberV2_Nft) updates) =>\n      super.copyWith((message) => updates(message as MemberV2_Nft))\n          as MemberV2_Nft;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MemberV2_Nft create() => MemberV2_Nft._();\n  @$core.override\n  MemberV2_Nft createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MemberV2_Nft getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MemberV2_Nft>(create);\n  static MemberV2_Nft? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get face => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set face($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFace() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFace() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  MemberV2_Nft_Interaction get interaction => $_getN(1);\n  @$pb.TagNumber(2)\n  set interaction(MemberV2_Nft_Interaction value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasInteraction() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearInteraction() => $_clearField(2);\n  @$pb.TagNumber(2)\n  MemberV2_Nft_Interaction ensureInteraction() => $_ensure(1);\n}\n\nclass MemberV2_Official extends $pb.GeneratedMessage {\n  factory MemberV2_Official({\n    $fixnum.Int64? verifyType,\n  }) {\n    final result = create();\n    if (verifyType != null) result.verifyType = verifyType;\n    return result;\n  }\n\n  MemberV2_Official._();\n\n  factory MemberV2_Official.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MemberV2_Official.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MemberV2.Official',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'verifyType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MemberV2_Official clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MemberV2_Official copyWith(void Function(MemberV2_Official) updates) =>\n      super.copyWith((message) => updates(message as MemberV2_Official))\n          as MemberV2_Official;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MemberV2_Official create() => MemberV2_Official._();\n  @$core.override\n  MemberV2_Official createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MemberV2_Official getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MemberV2_Official>(create);\n  static MemberV2_Official? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get verifyType => $_getI64(0);\n  @$pb.TagNumber(1)\n  set verifyType($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasVerifyType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearVerifyType() => $_clearField(1);\n}\n\nclass MemberV2_Senior extends $pb.GeneratedMessage {\n  factory MemberV2_Senior({\n    $core.int? isSeniorMember,\n    MemberV2_Senior_Status? status,\n  }) {\n    final result = create();\n    if (isSeniorMember != null) result.isSeniorMember = isSeniorMember;\n    if (status != null) result.status = status;\n    return result;\n  }\n\n  MemberV2_Senior._();\n\n  factory MemberV2_Senior.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MemberV2_Senior.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MemberV2.Senior',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'isSeniorMember')\n    ..aE<MemberV2_Senior_Status>(2, _omitFieldNames ? '' : 'status',\n        enumValues: MemberV2_Senior_Status.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MemberV2_Senior clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MemberV2_Senior copyWith(void Function(MemberV2_Senior) updates) =>\n      super.copyWith((message) => updates(message as MemberV2_Senior))\n          as MemberV2_Senior;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MemberV2_Senior create() => MemberV2_Senior._();\n  @$core.override\n  MemberV2_Senior createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MemberV2_Senior getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MemberV2_Senior>(create);\n  static MemberV2_Senior? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get isSeniorMember => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set isSeniorMember($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIsSeniorMember() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIsSeniorMember() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  MemberV2_Senior_Status get status => $_getN(1);\n  @$pb.TagNumber(2)\n  set status(MemberV2_Senior_Status value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasStatus() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearStatus() => $_clearField(2);\n}\n\nclass MemberV2_Vip extends $pb.GeneratedMessage {\n  factory MemberV2_Vip({\n    $fixnum.Int64? type,\n    $fixnum.Int64? status,\n    $fixnum.Int64? themeType,\n    $core.String? labelPath,\n    $core.String? nicknameColor,\n    $core.int? avatarSubscript,\n    $core.String? labelText,\n    $core.String? vipLabelTheme,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (status != null) result.status = status;\n    if (themeType != null) result.themeType = themeType;\n    if (labelPath != null) result.labelPath = labelPath;\n    if (nicknameColor != null) result.nicknameColor = nicknameColor;\n    if (avatarSubscript != null) result.avatarSubscript = avatarSubscript;\n    if (labelText != null) result.labelText = labelText;\n    if (vipLabelTheme != null) result.vipLabelTheme = vipLabelTheme;\n    return result;\n  }\n\n  MemberV2_Vip._();\n\n  factory MemberV2_Vip.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MemberV2_Vip.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MemberV2.Vip',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'type')\n    ..aInt64(2, _omitFieldNames ? '' : 'status')\n    ..aInt64(3, _omitFieldNames ? '' : 'themeType')\n    ..aOS(4, _omitFieldNames ? '' : 'labelPath')\n    ..aOS(5, _omitFieldNames ? '' : 'nicknameColor')\n    ..aI(6, _omitFieldNames ? '' : 'avatarSubscript')\n    ..aOS(7, _omitFieldNames ? '' : 'labelText')\n    ..aOS(8, _omitFieldNames ? '' : 'vipLabelTheme')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MemberV2_Vip clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MemberV2_Vip copyWith(void Function(MemberV2_Vip) updates) =>\n      super.copyWith((message) => updates(message as MemberV2_Vip))\n          as MemberV2_Vip;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MemberV2_Vip create() => MemberV2_Vip._();\n  @$core.override\n  MemberV2_Vip createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MemberV2_Vip getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MemberV2_Vip>(create);\n  static MemberV2_Vip? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get type => $_getI64(0);\n  @$pb.TagNumber(1)\n  set type($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get status => $_getI64(1);\n  @$pb.TagNumber(2)\n  set status($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasStatus() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearStatus() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get themeType => $_getI64(2);\n  @$pb.TagNumber(3)\n  set themeType($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasThemeType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearThemeType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get labelPath => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set labelPath($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLabelPath() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLabelPath() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get nicknameColor => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set nicknameColor($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasNicknameColor() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearNicknameColor() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get avatarSubscript => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set avatarSubscript($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasAvatarSubscript() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearAvatarSubscript() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get labelText => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set labelText($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasLabelText() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearLabelText() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get vipLabelTheme => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set vipLabelTheme($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasVipLabelTheme() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearVipLabelTheme() => $_clearField(8);\n}\n\nclass MemberV2 extends $pb.GeneratedMessage {\n  factory MemberV2({\n    MemberV2_Basic? basic,\n    MemberV2_Official? official,\n    MemberV2_Vip? vip,\n    MemberV2_Garb? garb,\n    MemberV2_Medal? medal,\n    MemberV2_Nft? nft,\n    MemberV2_Senior? senior,\n    MemberV2_Contractor? contractor,\n    $3.UserSailing? userSailing,\n  }) {\n    final result = create();\n    if (basic != null) result.basic = basic;\n    if (official != null) result.official = official;\n    if (vip != null) result.vip = vip;\n    if (garb != null) result.garb = garb;\n    if (medal != null) result.medal = medal;\n    if (nft != null) result.nft = nft;\n    if (senior != null) result.senior = senior;\n    if (contractor != null) result.contractor = contractor;\n    if (userSailing != null) result.userSailing = userSailing;\n    return result;\n  }\n\n  MemberV2._();\n\n  factory MemberV2.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MemberV2.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MemberV2',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOM<MemberV2_Basic>(1, _omitFieldNames ? '' : 'basic',\n        subBuilder: MemberV2_Basic.create)\n    ..aOM<MemberV2_Official>(2, _omitFieldNames ? '' : 'official',\n        subBuilder: MemberV2_Official.create)\n    ..aOM<MemberV2_Vip>(3, _omitFieldNames ? '' : 'vip',\n        subBuilder: MemberV2_Vip.create)\n    ..aOM<MemberV2_Garb>(4, _omitFieldNames ? '' : 'garb',\n        subBuilder: MemberV2_Garb.create)\n    ..aOM<MemberV2_Medal>(5, _omitFieldNames ? '' : 'medal',\n        subBuilder: MemberV2_Medal.create)\n    ..aOM<MemberV2_Nft>(6, _omitFieldNames ? '' : 'nft',\n        subBuilder: MemberV2_Nft.create)\n    ..aOM<MemberV2_Senior>(7, _omitFieldNames ? '' : 'senior',\n        subBuilder: MemberV2_Senior.create)\n    ..aOM<MemberV2_Contractor>(8, _omitFieldNames ? '' : 'contractor',\n        subBuilder: MemberV2_Contractor.create)\n    ..aOM<$3.UserSailing>(9, _omitFieldNames ? '' : 'userSailing',\n        subBuilder: $3.UserSailing.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MemberV2 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MemberV2 copyWith(void Function(MemberV2) updates) =>\n      super.copyWith((message) => updates(message as MemberV2)) as MemberV2;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MemberV2 create() => MemberV2._();\n  @$core.override\n  MemberV2 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MemberV2 getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<MemberV2>(create);\n  static MemberV2? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  MemberV2_Basic get basic => $_getN(0);\n  @$pb.TagNumber(1)\n  set basic(MemberV2_Basic value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBasic() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBasic() => $_clearField(1);\n  @$pb.TagNumber(1)\n  MemberV2_Basic ensureBasic() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  MemberV2_Official get official => $_getN(1);\n  @$pb.TagNumber(2)\n  set official(MemberV2_Official value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOfficial() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOfficial() => $_clearField(2);\n  @$pb.TagNumber(2)\n  MemberV2_Official ensureOfficial() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  MemberV2_Vip get vip => $_getN(2);\n  @$pb.TagNumber(3)\n  set vip(MemberV2_Vip value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasVip() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearVip() => $_clearField(3);\n  @$pb.TagNumber(3)\n  MemberV2_Vip ensureVip() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  MemberV2_Garb get garb => $_getN(3);\n  @$pb.TagNumber(4)\n  set garb(MemberV2_Garb value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasGarb() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearGarb() => $_clearField(4);\n  @$pb.TagNumber(4)\n  MemberV2_Garb ensureGarb() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  MemberV2_Medal get medal => $_getN(4);\n  @$pb.TagNumber(5)\n  set medal(MemberV2_Medal value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasMedal() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearMedal() => $_clearField(5);\n  @$pb.TagNumber(5)\n  MemberV2_Medal ensureMedal() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  MemberV2_Nft get nft => $_getN(5);\n  @$pb.TagNumber(6)\n  set nft(MemberV2_Nft value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasNft() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearNft() => $_clearField(6);\n  @$pb.TagNumber(6)\n  MemberV2_Nft ensureNft() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  MemberV2_Senior get senior => $_getN(6);\n  @$pb.TagNumber(7)\n  set senior(MemberV2_Senior value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasSenior() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearSenior() => $_clearField(7);\n  @$pb.TagNumber(7)\n  MemberV2_Senior ensureSenior() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  MemberV2_Contractor get contractor => $_getN(7);\n  @$pb.TagNumber(8)\n  set contractor(MemberV2_Contractor value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasContractor() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearContractor() => $_clearField(8);\n  @$pb.TagNumber(8)\n  MemberV2_Contractor ensureContractor() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  $3.UserSailing get userSailing => $_getN(8);\n  @$pb.TagNumber(9)\n  set userSailing($3.UserSailing value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasUserSailing() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearUserSailing() => $_clearField(9);\n  @$pb.TagNumber(9)\n  $3.UserSailing ensureUserSailing() => $_ensure(8);\n}\n\nenum MixedCard_Item { question, notSet }\n\nclass MixedCard extends $pb.GeneratedMessage {\n  factory MixedCard({\n    MixedCard_Type? type,\n    $core.String? oid,\n    $fixnum.Int64? displayRank,\n    QuestionCard? question,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (oid != null) result.oid = oid;\n    if (displayRank != null) result.displayRank = displayRank;\n    if (question != null) result.question = question;\n    return result;\n  }\n\n  MixedCard._();\n\n  factory MixedCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MixedCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, MixedCard_Item> _MixedCard_ItemByTag = {\n    4: MixedCard_Item.question,\n    0: MixedCard_Item.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MixedCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [4])\n    ..aE<MixedCard_Type>(1, _omitFieldNames ? '' : 'type',\n        enumValues: MixedCard_Type.values)\n    ..aOS(2, _omitFieldNames ? '' : 'oid')\n    ..aInt64(3, _omitFieldNames ? '' : 'displayRank')\n    ..aOM<QuestionCard>(4, _omitFieldNames ? '' : 'question',\n        subBuilder: QuestionCard.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MixedCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MixedCard copyWith(void Function(MixedCard) updates) =>\n      super.copyWith((message) => updates(message as MixedCard)) as MixedCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MixedCard create() => MixedCard._();\n  @$core.override\n  MixedCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MixedCard getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<MixedCard>(create);\n  static MixedCard? _defaultInstance;\n\n  @$pb.TagNumber(4)\n  MixedCard_Item whichItem() => _MixedCard_ItemByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(4)\n  void clearItem() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  MixedCard_Type get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(MixedCard_Type value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get oid => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set oid($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get displayRank => $_getI64(2);\n  @$pb.TagNumber(3)\n  set displayRank($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDisplayRank() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDisplayRank() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  QuestionCard get question => $_getN(3);\n  @$pb.TagNumber(4)\n  set question(QuestionCard value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasQuestion() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearQuestion() => $_clearField(4);\n  @$pb.TagNumber(4)\n  QuestionCard ensureQuestion() => $_ensure(3);\n}\n\nclass Notice extends $pb.GeneratedMessage {\n  factory Notice({\n    $fixnum.Int64? id,\n    $core.String? content,\n    $core.String? link,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (content != null) result.content = content;\n    if (link != null) result.link = link;\n    return result;\n  }\n\n  Notice._();\n\n  factory Notice.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Notice.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Notice',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'content')\n    ..aOS(3, _omitFieldNames ? '' : 'link')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Notice clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Notice copyWith(void Function(Notice) updates) =>\n      super.copyWith((message) => updates(message as Notice)) as Notice;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Notice create() => Notice._();\n  @$core.override\n  Notice createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Notice getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Notice>(create);\n  static Notice? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get content => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set content($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasContent() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearContent() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get link => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set link($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLink() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLink() => $_clearField(3);\n}\n\nclass OgvGradeCard extends $pb.GeneratedMessage {\n  factory OgvGradeCard({\n    $core.String? title,\n    $core.String? subTitle,\n    $core.String? buttonText,\n    $core.String? gotoUrl,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (subTitle != null) result.subTitle = subTitle;\n    if (buttonText != null) result.buttonText = buttonText;\n    if (gotoUrl != null) result.gotoUrl = gotoUrl;\n    return result;\n  }\n\n  OgvGradeCard._();\n\n  factory OgvGradeCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OgvGradeCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OgvGradeCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'subTitle')\n    ..aOS(3, _omitFieldNames ? '' : 'buttonText')\n    ..aOS(4, _omitFieldNames ? '' : 'gotoUrl')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OgvGradeCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OgvGradeCard copyWith(void Function(OgvGradeCard) updates) =>\n      super.copyWith((message) => updates(message as OgvGradeCard))\n          as OgvGradeCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OgvGradeCard create() => OgvGradeCard._();\n  @$core.override\n  OgvGradeCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OgvGradeCard getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OgvGradeCard>(create);\n  static OgvGradeCard? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get subTitle => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set subTitle($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSubTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSubTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get buttonText => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set buttonText($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasButtonText() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearButtonText() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get gotoUrl => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set gotoUrl($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasGotoUrl() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearGotoUrl() => $_clearField(4);\n}\n\nclass Operation extends $pb.GeneratedMessage {\n  factory Operation({\n    Operation_Type? type,\n    $fixnum.Int64? id,\n    OperationTitle? title,\n    OperationTitle? subtitle,\n    $core.String? link,\n    $core.String? reportExtra,\n    $core.String? icon,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (id != null) result.id = id;\n    if (title != null) result.title = title;\n    if (subtitle != null) result.subtitle = subtitle;\n    if (link != null) result.link = link;\n    if (reportExtra != null) result.reportExtra = reportExtra;\n    if (icon != null) result.icon = icon;\n    return result;\n  }\n\n  Operation._();\n\n  factory Operation.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Operation.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Operation',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aE<Operation_Type>(1, _omitFieldNames ? '' : 'type',\n        enumValues: Operation_Type.values)\n    ..aInt64(2, _omitFieldNames ? '' : 'id')\n    ..aOM<OperationTitle>(3, _omitFieldNames ? '' : 'title',\n        subBuilder: OperationTitle.create)\n    ..aOM<OperationTitle>(4, _omitFieldNames ? '' : 'subtitle',\n        subBuilder: OperationTitle.create)\n    ..aOS(5, _omitFieldNames ? '' : 'link')\n    ..aOS(6, _omitFieldNames ? '' : 'reportExtra')\n    ..aOS(7, _omitFieldNames ? '' : 'icon')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Operation clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Operation copyWith(void Function(Operation) updates) =>\n      super.copyWith((message) => updates(message as Operation)) as Operation;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Operation create() => Operation._();\n  @$core.override\n  Operation createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Operation getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Operation>(create);\n  static Operation? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Operation_Type get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(Operation_Type value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get id => $_getI64(1);\n  @$pb.TagNumber(2)\n  set id($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  OperationTitle get title => $_getN(2);\n  @$pb.TagNumber(3)\n  set title(OperationTitle value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTitle() => $_clearField(3);\n  @$pb.TagNumber(3)\n  OperationTitle ensureTitle() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  OperationTitle get subtitle => $_getN(3);\n  @$pb.TagNumber(4)\n  set subtitle(OperationTitle value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSubtitle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSubtitle() => $_clearField(4);\n  @$pb.TagNumber(4)\n  OperationTitle ensureSubtitle() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $core.String get link => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set link($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasLink() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearLink() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get reportExtra => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set reportExtra($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasReportExtra() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearReportExtra() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get icon => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set icon($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasIcon() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearIcon() => $_clearField(7);\n}\n\nclass OperationTitle extends $pb.GeneratedMessage {\n  factory OperationTitle({\n    $core.String? content,\n    $core.bool? isHighlight,\n  }) {\n    final result = create();\n    if (content != null) result.content = content;\n    if (isHighlight != null) result.isHighlight = isHighlight;\n    return result;\n  }\n\n  OperationTitle._();\n\n  factory OperationTitle.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OperationTitle.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OperationTitle',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'content')\n    ..aOB(2, _omitFieldNames ? '' : 'isHighlight')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OperationTitle clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OperationTitle copyWith(void Function(OperationTitle) updates) =>\n      super.copyWith((message) => updates(message as OperationTitle))\n          as OperationTitle;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OperationTitle create() => OperationTitle._();\n  @$core.override\n  OperationTitle createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OperationTitle getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OperationTitle>(create);\n  static OperationTitle? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get content => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set content($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasContent() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearContent() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get isHighlight => $_getBF(1);\n  @$pb.TagNumber(2)\n  set isHighlight($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIsHighlight() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIsHighlight() => $_clearField(2);\n}\n\nclass OperationV2_Icon extends $pb.GeneratedMessage {\n  factory OperationV2_Icon({\n    OperationV2_Icon_Position? position,\n    $core.String? url,\n  }) {\n    final result = create();\n    if (position != null) result.position = position;\n    if (url != null) result.url = url;\n    return result;\n  }\n\n  OperationV2_Icon._();\n\n  factory OperationV2_Icon.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OperationV2_Icon.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OperationV2.Icon',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aE<OperationV2_Icon_Position>(1, _omitFieldNames ? '' : 'position',\n        enumValues: OperationV2_Icon_Position.values)\n    ..aOS(2, _omitFieldNames ? '' : 'url')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OperationV2_Icon clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OperationV2_Icon copyWith(void Function(OperationV2_Icon) updates) =>\n      super.copyWith((message) => updates(message as OperationV2_Icon))\n          as OperationV2_Icon;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OperationV2_Icon create() => OperationV2_Icon._();\n  @$core.override\n  OperationV2_Icon createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OperationV2_Icon getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OperationV2_Icon>(create);\n  static OperationV2_Icon? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  OperationV2_Icon_Position get position => $_getN(0);\n  @$pb.TagNumber(1)\n  set position(OperationV2_Icon_Position value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPosition() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPosition() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get url => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set url($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUrl() => $_clearField(2);\n}\n\nclass OperationV2 extends $pb.GeneratedMessage {\n  factory OperationV2({\n    OperationV2_Type? type,\n    $core.String? prefixText,\n    OperationV2_Icon? icon,\n    $core.String? title,\n    $core.String? link,\n    $core.String? reportExtra,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (prefixText != null) result.prefixText = prefixText;\n    if (icon != null) result.icon = icon;\n    if (title != null) result.title = title;\n    if (link != null) result.link = link;\n    if (reportExtra != null) result.reportExtra = reportExtra;\n    return result;\n  }\n\n  OperationV2._();\n\n  factory OperationV2.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory OperationV2.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'OperationV2',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aE<OperationV2_Type>(1, _omitFieldNames ? '' : 'type',\n        enumValues: OperationV2_Type.values)\n    ..aOS(2, _omitFieldNames ? '' : 'prefixText')\n    ..aOM<OperationV2_Icon>(3, _omitFieldNames ? '' : 'icon',\n        subBuilder: OperationV2_Icon.create)\n    ..aOS(4, _omitFieldNames ? '' : 'title')\n    ..aOS(5, _omitFieldNames ? '' : 'link')\n    ..aOS(6, _omitFieldNames ? '' : 'reportExtra')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OperationV2 clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  OperationV2 copyWith(void Function(OperationV2) updates) =>\n      super.copyWith((message) => updates(message as OperationV2))\n          as OperationV2;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static OperationV2 create() => OperationV2._();\n  @$core.override\n  OperationV2 createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static OperationV2 getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<OperationV2>(create);\n  static OperationV2? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  OperationV2_Type get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(OperationV2_Type value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get prefixText => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set prefixText($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPrefixText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPrefixText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  OperationV2_Icon get icon => $_getN(2);\n  @$pb.TagNumber(3)\n  set icon(OperationV2_Icon value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIcon() => $_clearField(3);\n  @$pb.TagNumber(3)\n  OperationV2_Icon ensureIcon() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.String get title => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set title($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTitle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTitle() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get link => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set link($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasLink() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearLink() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get reportExtra => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set reportExtra($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasReportExtra() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearReportExtra() => $_clearField(6);\n}\n\nclass PGCVideoSearchItem extends $pb.GeneratedMessage {\n  factory PGCVideoSearchItem({\n    $core.String? title,\n    $core.String? category,\n    $core.String? cover,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (category != null) result.category = category;\n    if (cover != null) result.cover = cover;\n    return result;\n  }\n\n  PGCVideoSearchItem._();\n\n  factory PGCVideoSearchItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PGCVideoSearchItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PGCVideoSearchItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'category')\n    ..aOS(3, _omitFieldNames ? '' : 'cover')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PGCVideoSearchItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PGCVideoSearchItem copyWith(void Function(PGCVideoSearchItem) updates) =>\n      super.copyWith((message) => updates(message as PGCVideoSearchItem))\n          as PGCVideoSearchItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PGCVideoSearchItem create() => PGCVideoSearchItem._();\n  @$core.override\n  PGCVideoSearchItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PGCVideoSearchItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PGCVideoSearchItem>(create);\n  static PGCVideoSearchItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get category => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set category($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCategory() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCategory() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get cover => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set cover($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCover() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCover() => $_clearField(3);\n}\n\nclass Picture extends $pb.GeneratedMessage {\n  factory Picture({\n    $core.String? imgSrc,\n    $core.double? imgWidth,\n    $core.double? imgHeight,\n    $core.double? imgSize,\n    $core.String? topRightIcon,\n    $core.bool? playGifThumbnail,\n  }) {\n    final result = create();\n    if (imgSrc != null) result.imgSrc = imgSrc;\n    if (imgWidth != null) result.imgWidth = imgWidth;\n    if (imgHeight != null) result.imgHeight = imgHeight;\n    if (imgSize != null) result.imgSize = imgSize;\n    if (topRightIcon != null) result.topRightIcon = topRightIcon;\n    if (playGifThumbnail != null) result.playGifThumbnail = playGifThumbnail;\n    return result;\n  }\n\n  Picture._();\n\n  factory Picture.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Picture.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Picture',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'imgSrc')\n    ..aD(2, _omitFieldNames ? '' : 'imgWidth')\n    ..aD(3, _omitFieldNames ? '' : 'imgHeight')\n    ..aD(4, _omitFieldNames ? '' : 'imgSize')\n    ..aOS(5, _omitFieldNames ? '' : 'topRightIcon')\n    ..aOB(6, _omitFieldNames ? '' : 'playGifThumbnail')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Picture clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Picture copyWith(void Function(Picture) updates) =>\n      super.copyWith((message) => updates(message as Picture)) as Picture;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Picture create() => Picture._();\n  @$core.override\n  Picture createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Picture getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Picture>(create);\n  static Picture? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get imgSrc => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set imgSrc($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasImgSrc() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearImgSrc() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.double get imgWidth => $_getN(1);\n  @$pb.TagNumber(2)\n  set imgWidth($core.double value) => $_setDouble(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasImgWidth() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearImgWidth() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.double get imgHeight => $_getN(2);\n  @$pb.TagNumber(3)\n  set imgHeight($core.double value) => $_setDouble(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasImgHeight() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearImgHeight() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.double get imgSize => $_getN(3);\n  @$pb.TagNumber(4)\n  set imgSize($core.double value) => $_setDouble(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasImgSize() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearImgSize() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get topRightIcon => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set topRightIcon($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasTopRightIcon() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearTopRightIcon() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.bool get playGifThumbnail => $_getBF(5);\n  @$pb.TagNumber(6)\n  set playGifThumbnail($core.bool value) => $_setBool(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasPlayGifThumbnail() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearPlayGifThumbnail() => $_clearField(6);\n}\n\nclass PictureListReq extends $pb.GeneratedMessage {\n  factory PictureListReq({\n    $fixnum.Int64? oid,\n    $fixnum.Int64? type,\n    $core.String? extra,\n    $fixnum.Int64? afterRpid,\n    Mode? mode,\n    $2.FeedPagination? pagination,\n    $core.String? sessionId,\n    $core.String? mainListSessionId,\n  }) {\n    final result = create();\n    if (oid != null) result.oid = oid;\n    if (type != null) result.type = type;\n    if (extra != null) result.extra = extra;\n    if (afterRpid != null) result.afterRpid = afterRpid;\n    if (mode != null) result.mode = mode;\n    if (pagination != null) result.pagination = pagination;\n    if (sessionId != null) result.sessionId = sessionId;\n    if (mainListSessionId != null) result.mainListSessionId = mainListSessionId;\n    return result;\n  }\n\n  PictureListReq._();\n\n  factory PictureListReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PictureListReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PictureListReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'oid')\n    ..aInt64(2, _omitFieldNames ? '' : 'type')\n    ..aOS(3, _omitFieldNames ? '' : 'extra')\n    ..aInt64(4, _omitFieldNames ? '' : 'afterRpid')\n    ..aE<Mode>(5, _omitFieldNames ? '' : 'mode', enumValues: Mode.values)\n    ..aOM<$2.FeedPagination>(6, _omitFieldNames ? '' : 'pagination',\n        subBuilder: $2.FeedPagination.create)\n    ..aOS(7, _omitFieldNames ? '' : 'sessionId')\n    ..aOS(8, _omitFieldNames ? '' : 'mainListSessionId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PictureListReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PictureListReq copyWith(void Function(PictureListReq) updates) =>\n      super.copyWith((message) => updates(message as PictureListReq))\n          as PictureListReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PictureListReq create() => PictureListReq._();\n  @$core.override\n  PictureListReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PictureListReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PictureListReq>(create);\n  static PictureListReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get oid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set oid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get type => $_getI64(1);\n  @$pb.TagNumber(2)\n  set type($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get extra => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set extra($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasExtra() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearExtra() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get afterRpid => $_getI64(3);\n  @$pb.TagNumber(4)\n  set afterRpid($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasAfterRpid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearAfterRpid() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  Mode get mode => $_getN(4);\n  @$pb.TagNumber(5)\n  set mode(Mode value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasMode() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearMode() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $2.FeedPagination get pagination => $_getN(5);\n  @$pb.TagNumber(6)\n  set pagination($2.FeedPagination value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasPagination() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearPagination() => $_clearField(6);\n  @$pb.TagNumber(6)\n  $2.FeedPagination ensurePagination() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $core.String get sessionId => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set sessionId($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasSessionId() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearSessionId() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get mainListSessionId => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set mainListSessionId($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasMainListSessionId() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearMainListSessionId() => $_clearField(8);\n}\n\nclass PictureListResp extends $pb.GeneratedMessage {\n  factory PictureListResp({\n    $core.Iterable<ReplyInfo>? replies,\n    $2.FeedPaginationReply? paginationReply,\n    $core.String? sessionId,\n    $core.String? reportParams,\n    $core.String? contextFeature,\n    $core.String? paginationEndText,\n  }) {\n    final result = create();\n    if (replies != null) result.replies.addAll(replies);\n    if (paginationReply != null) result.paginationReply = paginationReply;\n    if (sessionId != null) result.sessionId = sessionId;\n    if (reportParams != null) result.reportParams = reportParams;\n    if (contextFeature != null) result.contextFeature = contextFeature;\n    if (paginationEndText != null) result.paginationEndText = paginationEndText;\n    return result;\n  }\n\n  PictureListResp._();\n\n  factory PictureListResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PictureListResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PictureListResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..pPM<ReplyInfo>(1, _omitFieldNames ? '' : 'replies',\n        subBuilder: ReplyInfo.create)\n    ..aOM<$2.FeedPaginationReply>(2, _omitFieldNames ? '' : 'paginationReply',\n        subBuilder: $2.FeedPaginationReply.create)\n    ..aOS(3, _omitFieldNames ? '' : 'sessionId')\n    ..aOS(4, _omitFieldNames ? '' : 'reportParams')\n    ..aOS(5, _omitFieldNames ? '' : 'contextFeature')\n    ..aOS(6, _omitFieldNames ? '' : 'paginationEndText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PictureListResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PictureListResp copyWith(void Function(PictureListResp) updates) =>\n      super.copyWith((message) => updates(message as PictureListResp))\n          as PictureListResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PictureListResp create() => PictureListResp._();\n  @$core.override\n  PictureListResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PictureListResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PictureListResp>(create);\n  static PictureListResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<ReplyInfo> get replies => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $2.FeedPaginationReply get paginationReply => $_getN(1);\n  @$pb.TagNumber(2)\n  set paginationReply($2.FeedPaginationReply value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPaginationReply() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPaginationReply() => $_clearField(2);\n  @$pb.TagNumber(2)\n  $2.FeedPaginationReply ensurePaginationReply() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.String get sessionId => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set sessionId($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSessionId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSessionId() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get reportParams => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set reportParams($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasReportParams() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearReportParams() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get contextFeature => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set contextFeature($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasContextFeature() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearContextFeature() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get paginationEndText => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set paginationEndText($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasPaginationEndText() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearPaginationEndText() => $_clearField(6);\n}\n\nclass PreviewListReply extends $pb.GeneratedMessage {\n  factory PreviewListReply({\n    CursorReply? cursor,\n    $core.Iterable<ReplyInfo>? replies,\n    SubjectControl? subjectControl,\n    ReplyInfo? upTop,\n    ReplyInfo? adminTop,\n    ReplyInfo? voteTop,\n  }) {\n    final result = create();\n    if (cursor != null) result.cursor = cursor;\n    if (replies != null) result.replies.addAll(replies);\n    if (subjectControl != null) result.subjectControl = subjectControl;\n    if (upTop != null) result.upTop = upTop;\n    if (adminTop != null) result.adminTop = adminTop;\n    if (voteTop != null) result.voteTop = voteTop;\n    return result;\n  }\n\n  PreviewListReply._();\n\n  factory PreviewListReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PreviewListReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PreviewListReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOM<CursorReply>(1, _omitFieldNames ? '' : 'cursor',\n        subBuilder: CursorReply.create)\n    ..pPM<ReplyInfo>(2, _omitFieldNames ? '' : 'replies',\n        subBuilder: ReplyInfo.create)\n    ..aOM<SubjectControl>(3, _omitFieldNames ? '' : 'subjectControl',\n        subBuilder: SubjectControl.create)\n    ..aOM<ReplyInfo>(4, _omitFieldNames ? '' : 'upTop',\n        subBuilder: ReplyInfo.create)\n    ..aOM<ReplyInfo>(5, _omitFieldNames ? '' : 'adminTop',\n        subBuilder: ReplyInfo.create)\n    ..aOM<ReplyInfo>(6, _omitFieldNames ? '' : 'voteTop',\n        subBuilder: ReplyInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PreviewListReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PreviewListReply copyWith(void Function(PreviewListReply) updates) =>\n      super.copyWith((message) => updates(message as PreviewListReply))\n          as PreviewListReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PreviewListReply create() => PreviewListReply._();\n  @$core.override\n  PreviewListReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PreviewListReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PreviewListReply>(create);\n  static PreviewListReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  CursorReply get cursor => $_getN(0);\n  @$pb.TagNumber(1)\n  set cursor(CursorReply value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCursor() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCursor() => $_clearField(1);\n  @$pb.TagNumber(1)\n  CursorReply ensureCursor() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<ReplyInfo> get replies => $_getList(1);\n\n  @$pb.TagNumber(3)\n  SubjectControl get subjectControl => $_getN(2);\n  @$pb.TagNumber(3)\n  set subjectControl(SubjectControl value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSubjectControl() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSubjectControl() => $_clearField(3);\n  @$pb.TagNumber(3)\n  SubjectControl ensureSubjectControl() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  ReplyInfo get upTop => $_getN(3);\n  @$pb.TagNumber(4)\n  set upTop(ReplyInfo value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUpTop() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUpTop() => $_clearField(4);\n  @$pb.TagNumber(4)\n  ReplyInfo ensureUpTop() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  ReplyInfo get adminTop => $_getN(4);\n  @$pb.TagNumber(5)\n  set adminTop(ReplyInfo value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasAdminTop() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearAdminTop() => $_clearField(5);\n  @$pb.TagNumber(5)\n  ReplyInfo ensureAdminTop() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  ReplyInfo get voteTop => $_getN(5);\n  @$pb.TagNumber(6)\n  set voteTop(ReplyInfo value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasVoteTop() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearVoteTop() => $_clearField(6);\n  @$pb.TagNumber(6)\n  ReplyInfo ensureVoteTop() => $_ensure(5);\n}\n\nclass PreviewListReq extends $pb.GeneratedMessage {\n  factory PreviewListReq({\n    $fixnum.Int64? oid,\n    $fixnum.Int64? type,\n    CursorReq? cursor,\n  }) {\n    final result = create();\n    if (oid != null) result.oid = oid;\n    if (type != null) result.type = type;\n    if (cursor != null) result.cursor = cursor;\n    return result;\n  }\n\n  PreviewListReq._();\n\n  factory PreviewListReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PreviewListReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PreviewListReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'oid')\n    ..aInt64(2, _omitFieldNames ? '' : 'type')\n    ..aOM<CursorReq>(3, _omitFieldNames ? '' : 'cursor',\n        subBuilder: CursorReq.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PreviewListReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PreviewListReq copyWith(void Function(PreviewListReq) updates) =>\n      super.copyWith((message) => updates(message as PreviewListReq))\n          as PreviewListReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PreviewListReq create() => PreviewListReq._();\n  @$core.override\n  PreviewListReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PreviewListReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PreviewListReq>(create);\n  static PreviewListReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get oid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set oid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get type => $_getI64(1);\n  @$pb.TagNumber(2)\n  set type($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  CursorReq get cursor => $_getN(2);\n  @$pb.TagNumber(3)\n  set cursor(CursorReq value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCursor() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCursor() => $_clearField(3);\n  @$pb.TagNumber(3)\n  CursorReq ensureCursor() => $_ensure(2);\n}\n\nclass QoeInfo extends $pb.GeneratedMessage {\n  factory QoeInfo({\n    $fixnum.Int64? id,\n    $core.int? type,\n    $core.int? style,\n    $core.String? title,\n    $core.String? feedbackTitle,\n    $core.Iterable<QoeScoreItem>? scoreItems,\n    $fixnum.Int64? displayRank,\n    Form? form,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (type != null) result.type = type;\n    if (style != null) result.style = style;\n    if (title != null) result.title = title;\n    if (feedbackTitle != null) result.feedbackTitle = feedbackTitle;\n    if (scoreItems != null) result.scoreItems.addAll(scoreItems);\n    if (displayRank != null) result.displayRank = displayRank;\n    if (form != null) result.form = form;\n    return result;\n  }\n\n  QoeInfo._();\n\n  factory QoeInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory QoeInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'QoeInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aI(2, _omitFieldNames ? '' : 'type')\n    ..aI(3, _omitFieldNames ? '' : 'style')\n    ..aOS(4, _omitFieldNames ? '' : 'title')\n    ..aOS(5, _omitFieldNames ? '' : 'feedbackTitle')\n    ..pPM<QoeScoreItem>(6, _omitFieldNames ? '' : 'scoreItems',\n        subBuilder: QoeScoreItem.create)\n    ..aInt64(7, _omitFieldNames ? '' : 'displayRank')\n    ..aOM<Form>(8, _omitFieldNames ? '' : 'form', subBuilder: Form.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QoeInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QoeInfo copyWith(void Function(QoeInfo) updates) =>\n      super.copyWith((message) => updates(message as QoeInfo)) as QoeInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static QoeInfo create() => QoeInfo._();\n  @$core.override\n  QoeInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static QoeInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<QoeInfo>(create);\n  static QoeInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get type => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set type($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get style => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set style($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasStyle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearStyle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get title => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set title($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTitle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTitle() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get feedbackTitle => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set feedbackTitle($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasFeedbackTitle() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearFeedbackTitle() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $pb.PbList<QoeScoreItem> get scoreItems => $_getList(5);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get displayRank => $_getI64(6);\n  @$pb.TagNumber(7)\n  set displayRank($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasDisplayRank() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearDisplayRank() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  Form get form => $_getN(7);\n  @$pb.TagNumber(8)\n  set form(Form value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasForm() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearForm() => $_clearField(8);\n  @$pb.TagNumber(8)\n  Form ensureForm() => $_ensure(7);\n}\n\nclass QoeOption extends $pb.GeneratedMessage {\n  factory QoeOption({\n    $core.String? title,\n    $core.double? score,\n    $core.String? imgUrl,\n    $core.Iterable<$core.String>? desc,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (score != null) result.score = score;\n    if (imgUrl != null) result.imgUrl = imgUrl;\n    if (desc != null) result.desc.addAll(desc);\n    return result;\n  }\n\n  QoeOption._();\n\n  factory QoeOption.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory QoeOption.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'QoeOption',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aD(2, _omitFieldNames ? '' : 'score', fieldType: $pb.PbFieldType.OF)\n    ..aOS(3, _omitFieldNames ? '' : 'imgUrl')\n    ..pPS(4, _omitFieldNames ? '' : 'desc')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QoeOption clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QoeOption copyWith(void Function(QoeOption) updates) =>\n      super.copyWith((message) => updates(message as QoeOption)) as QoeOption;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static QoeOption create() => QoeOption._();\n  @$core.override\n  QoeOption createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static QoeOption getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<QoeOption>(create);\n  static QoeOption? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.double get score => $_getN(1);\n  @$pb.TagNumber(2)\n  set score($core.double value) => $_setFloat(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasScore() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearScore() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get imgUrl => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set imgUrl($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasImgUrl() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearImgUrl() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<$core.String> get desc => $_getList(3);\n}\n\nclass QoeOptionDesc extends $pb.GeneratedMessage {\n  factory QoeOptionDesc({\n    $core.Iterable<$core.String>? desc,\n  }) {\n    final result = create();\n    if (desc != null) result.desc.addAll(desc);\n    return result;\n  }\n\n  QoeOptionDesc._();\n\n  factory QoeOptionDesc.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory QoeOptionDesc.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'QoeOptionDesc',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..pPS(1, _omitFieldNames ? '' : 'desc')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QoeOptionDesc clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QoeOptionDesc copyWith(void Function(QoeOptionDesc) updates) =>\n      super.copyWith((message) => updates(message as QoeOptionDesc))\n          as QoeOptionDesc;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static QoeOptionDesc create() => QoeOptionDesc._();\n  @$core.override\n  QoeOptionDesc createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static QoeOptionDesc getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<QoeOptionDesc>(create);\n  static QoeOptionDesc? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<$core.String> get desc => $_getList(0);\n}\n\nclass QoeScoreItem extends $pb.GeneratedMessage {\n  factory QoeScoreItem({\n    $core.String? title,\n    $core.String? url,\n    $core.double? score,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (url != null) result.url = url;\n    if (score != null) result.score = score;\n    return result;\n  }\n\n  QoeScoreItem._();\n\n  factory QoeScoreItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory QoeScoreItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'QoeScoreItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'url')\n    ..aD(3, _omitFieldNames ? '' : 'score', fieldType: $pb.PbFieldType.OF)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QoeScoreItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QoeScoreItem copyWith(void Function(QoeScoreItem) updates) =>\n      super.copyWith((message) => updates(message as QoeScoreItem))\n          as QoeScoreItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static QoeScoreItem create() => QoeScoreItem._();\n  @$core.override\n  QoeScoreItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static QoeScoreItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<QoeScoreItem>(create);\n  static QoeScoreItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get url => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set url($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUrl() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.double get score => $_getN(2);\n  @$pb.TagNumber(3)\n  set score($core.double value) => $_setFloat(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasScore() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearScore() => $_clearField(3);\n}\n\nclass QuestionCard_Option extends $pb.GeneratedMessage {\n  factory QuestionCard_Option({\n    $core.String? key,\n    $core.String? title,\n  }) {\n    final result = create();\n    if (key != null) result.key = key;\n    if (title != null) result.title = title;\n    return result;\n  }\n\n  QuestionCard_Option._();\n\n  factory QuestionCard_Option.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory QuestionCard_Option.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'QuestionCard.Option',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'key')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QuestionCard_Option clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QuestionCard_Option copyWith(void Function(QuestionCard_Option) updates) =>\n      super.copyWith((message) => updates(message as QuestionCard_Option))\n          as QuestionCard_Option;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static QuestionCard_Option create() => QuestionCard_Option._();\n  @$core.override\n  QuestionCard_Option createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static QuestionCard_Option getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<QuestionCard_Option>(create);\n  static QuestionCard_Option? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get key => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set key($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasKey() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearKey() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n}\n\nclass QuestionCard_Question extends $pb.GeneratedMessage {\n  factory QuestionCard_Question({\n    $fixnum.Int64? qid,\n    $core.String? title,\n    $core.bool? mustRight,\n    $core.Iterable<QuestionCard_Option>? options,\n  }) {\n    final result = create();\n    if (qid != null) result.qid = qid;\n    if (title != null) result.title = title;\n    if (mustRight != null) result.mustRight = mustRight;\n    if (options != null) result.options.addAll(options);\n    return result;\n  }\n\n  QuestionCard_Question._();\n\n  factory QuestionCard_Question.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory QuestionCard_Question.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'QuestionCard.Question',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'qid')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOB(3, _omitFieldNames ? '' : 'mustRight')\n    ..pPM<QuestionCard_Option>(4, _omitFieldNames ? '' : 'options',\n        subBuilder: QuestionCard_Option.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QuestionCard_Question clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QuestionCard_Question copyWith(\n          void Function(QuestionCard_Question) updates) =>\n      super.copyWith((message) => updates(message as QuestionCard_Question))\n          as QuestionCard_Question;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static QuestionCard_Question create() => QuestionCard_Question._();\n  @$core.override\n  QuestionCard_Question createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static QuestionCard_Question getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<QuestionCard_Question>(create);\n  static QuestionCard_Question? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get qid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set qid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasQid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearQid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get mustRight => $_getBF(2);\n  @$pb.TagNumber(3)\n  set mustRight($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasMustRight() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearMustRight() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<QuestionCard_Option> get options => $_getList(3);\n}\n\nclass QuestionCard extends $pb.GeneratedMessage {\n  factory QuestionCard({\n    QuestionCard_Question? question,\n    QuestionCardStat? stat,\n    $core.String? bottomText,\n  }) {\n    final result = create();\n    if (question != null) result.question = question;\n    if (stat != null) result.stat = stat;\n    if (bottomText != null) result.bottomText = bottomText;\n    return result;\n  }\n\n  QuestionCard._();\n\n  factory QuestionCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory QuestionCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'QuestionCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOM<QuestionCard_Question>(1, _omitFieldNames ? '' : 'question',\n        subBuilder: QuestionCard_Question.create)\n    ..aOM<QuestionCardStat>(2, _omitFieldNames ? '' : 'stat',\n        subBuilder: QuestionCardStat.create)\n    ..aOS(3, _omitFieldNames ? '' : 'bottomText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QuestionCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QuestionCard copyWith(void Function(QuestionCard) updates) =>\n      super.copyWith((message) => updates(message as QuestionCard))\n          as QuestionCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static QuestionCard create() => QuestionCard._();\n  @$core.override\n  QuestionCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static QuestionCard getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<QuestionCard>(create);\n  static QuestionCard? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  QuestionCard_Question get question => $_getN(0);\n  @$pb.TagNumber(1)\n  set question(QuestionCard_Question value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasQuestion() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearQuestion() => $_clearField(1);\n  @$pb.TagNumber(1)\n  QuestionCard_Question ensureQuestion() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  QuestionCardStat get stat => $_getN(1);\n  @$pb.TagNumber(2)\n  set stat(QuestionCardStat value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasStat() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearStat() => $_clearField(2);\n  @$pb.TagNumber(2)\n  QuestionCardStat ensureStat() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.String get bottomText => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set bottomText($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBottomText() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBottomText() => $_clearField(3);\n}\n\nclass QuestionCardStat extends $pb.GeneratedMessage {\n  factory QuestionCardStat({\n    $fixnum.Int64? rightCnt,\n    $fixnum.Int64? rightMidCnt,\n    $fixnum.Int64? submitMidCnt,\n  }) {\n    final result = create();\n    if (rightCnt != null) result.rightCnt = rightCnt;\n    if (rightMidCnt != null) result.rightMidCnt = rightMidCnt;\n    if (submitMidCnt != null) result.submitMidCnt = submitMidCnt;\n    return result;\n  }\n\n  QuestionCardStat._();\n\n  factory QuestionCardStat.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory QuestionCardStat.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'QuestionCardStat',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'rightCnt')\n    ..aInt64(2, _omitFieldNames ? '' : 'rightMidCnt')\n    ..aInt64(3, _omitFieldNames ? '' : 'submitMidCnt')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QuestionCardStat clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QuestionCardStat copyWith(void Function(QuestionCardStat) updates) =>\n      super.copyWith((message) => updates(message as QuestionCardStat))\n          as QuestionCardStat;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static QuestionCardStat create() => QuestionCardStat._();\n  @$core.override\n  QuestionCardStat createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static QuestionCardStat getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<QuestionCardStat>(create);\n  static QuestionCardStat? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get rightCnt => $_getI64(0);\n  @$pb.TagNumber(1)\n  set rightCnt($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasRightCnt() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRightCnt() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get rightMidCnt => $_getI64(1);\n  @$pb.TagNumber(2)\n  set rightMidCnt($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasRightMidCnt() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRightMidCnt() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get submitMidCnt => $_getI64(2);\n  @$pb.TagNumber(3)\n  set submitMidCnt($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSubmitMidCnt() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSubmitMidCnt() => $_clearField(3);\n}\n\nclass ReplyCardLabel extends $pb.GeneratedMessage {\n  factory ReplyCardLabel({\n    $core.String? textContent,\n    $core.String? textColorDay,\n    $core.String? textColorNight,\n    $core.String? labelColorDay,\n    $core.String? labelColorNight,\n    $core.String? image,\n    ReplyCardLabel_Type? type,\n    $core.String? background,\n    $core.double? backgroundWidth,\n    $core.double? backgroundHeight,\n    $core.String? jumpUrl,\n    $fixnum.Int64? effect,\n    $fixnum.Int64? effectStartTime,\n  }) {\n    final result = create();\n    if (textContent != null) result.textContent = textContent;\n    if (textColorDay != null) result.textColorDay = textColorDay;\n    if (textColorNight != null) result.textColorNight = textColorNight;\n    if (labelColorDay != null) result.labelColorDay = labelColorDay;\n    if (labelColorNight != null) result.labelColorNight = labelColorNight;\n    if (image != null) result.image = image;\n    if (type != null) result.type = type;\n    if (background != null) result.background = background;\n    if (backgroundWidth != null) result.backgroundWidth = backgroundWidth;\n    if (backgroundHeight != null) result.backgroundHeight = backgroundHeight;\n    if (jumpUrl != null) result.jumpUrl = jumpUrl;\n    if (effect != null) result.effect = effect;\n    if (effectStartTime != null) result.effectStartTime = effectStartTime;\n    return result;\n  }\n\n  ReplyCardLabel._();\n\n  factory ReplyCardLabel.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReplyCardLabel.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReplyCardLabel',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'textContent')\n    ..aOS(2, _omitFieldNames ? '' : 'textColorDay')\n    ..aOS(3, _omitFieldNames ? '' : 'textColorNight')\n    ..aOS(4, _omitFieldNames ? '' : 'labelColorDay')\n    ..aOS(5, _omitFieldNames ? '' : 'labelColorNight')\n    ..aOS(6, _omitFieldNames ? '' : 'image')\n    ..aE<ReplyCardLabel_Type>(7, _omitFieldNames ? '' : 'type',\n        enumValues: ReplyCardLabel_Type.values)\n    ..aOS(8, _omitFieldNames ? '' : 'background')\n    ..aD(9, _omitFieldNames ? '' : 'backgroundWidth')\n    ..aD(10, _omitFieldNames ? '' : 'backgroundHeight')\n    ..aOS(11, _omitFieldNames ? '' : 'jumpUrl')\n    ..aInt64(12, _omitFieldNames ? '' : 'effect')\n    ..aInt64(13, _omitFieldNames ? '' : 'effectStartTime')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyCardLabel clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyCardLabel copyWith(void Function(ReplyCardLabel) updates) =>\n      super.copyWith((message) => updates(message as ReplyCardLabel))\n          as ReplyCardLabel;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReplyCardLabel create() => ReplyCardLabel._();\n  @$core.override\n  ReplyCardLabel createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReplyCardLabel getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReplyCardLabel>(create);\n  static ReplyCardLabel? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get textContent => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set textContent($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTextContent() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTextContent() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get textColorDay => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set textColorDay($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTextColorDay() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTextColorDay() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get textColorNight => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set textColorNight($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTextColorNight() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTextColorNight() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get labelColorDay => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set labelColorDay($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLabelColorDay() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLabelColorDay() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get labelColorNight => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set labelColorNight($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasLabelColorNight() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearLabelColorNight() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get image => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set image($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasImage() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearImage() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  ReplyCardLabel_Type get type => $_getN(6);\n  @$pb.TagNumber(7)\n  set type(ReplyCardLabel_Type value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasType() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearType() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get background => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set background($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasBackground() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearBackground() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.double get backgroundWidth => $_getN(8);\n  @$pb.TagNumber(9)\n  set backgroundWidth($core.double value) => $_setDouble(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasBackgroundWidth() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearBackgroundWidth() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.double get backgroundHeight => $_getN(9);\n  @$pb.TagNumber(10)\n  set backgroundHeight($core.double value) => $_setDouble(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasBackgroundHeight() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearBackgroundHeight() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get jumpUrl => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set jumpUrl($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasJumpUrl() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearJumpUrl() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $fixnum.Int64 get effect => $_getI64(11);\n  @$pb.TagNumber(12)\n  set effect($fixnum.Int64 value) => $_setInt64(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasEffect() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearEffect() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $fixnum.Int64 get effectStartTime => $_getI64(12);\n  @$pb.TagNumber(13)\n  set effectStartTime($fixnum.Int64 value) => $_setInt64(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasEffectStartTime() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearEffectStartTime() => $_clearField(13);\n}\n\nclass ReplyControl_EasterEggLabel extends $pb.GeneratedMessage {\n  factory ReplyControl_EasterEggLabel({\n    $core.String? image,\n    $core.String? jumpUrl,\n  }) {\n    final result = create();\n    if (image != null) result.image = image;\n    if (jumpUrl != null) result.jumpUrl = jumpUrl;\n    return result;\n  }\n\n  ReplyControl_EasterEggLabel._();\n\n  factory ReplyControl_EasterEggLabel.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReplyControl_EasterEggLabel.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReplyControl.EasterEggLabel',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'image')\n    ..aOS(2, _omitFieldNames ? '' : 'jumpUrl')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyControl_EasterEggLabel clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyControl_EasterEggLabel copyWith(\n          void Function(ReplyControl_EasterEggLabel) updates) =>\n      super.copyWith(\n              (message) => updates(message as ReplyControl_EasterEggLabel))\n          as ReplyControl_EasterEggLabel;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReplyControl_EasterEggLabel create() =>\n      ReplyControl_EasterEggLabel._();\n  @$core.override\n  ReplyControl_EasterEggLabel createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReplyControl_EasterEggLabel getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReplyControl_EasterEggLabel>(create);\n  static ReplyControl_EasterEggLabel? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get image => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set image($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasImage() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearImage() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get jumpUrl => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set jumpUrl($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasJumpUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearJumpUrl() => $_clearField(2);\n}\n\nclass ReplyControl_GradeRecord_Text extends $pb.GeneratedMessage {\n  factory ReplyControl_GradeRecord_Text({\n    $core.String? raw,\n    TextStyle? style,\n  }) {\n    final result = create();\n    if (raw != null) result.raw = raw;\n    if (style != null) result.style = style;\n    return result;\n  }\n\n  ReplyControl_GradeRecord_Text._();\n\n  factory ReplyControl_GradeRecord_Text.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReplyControl_GradeRecord_Text.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReplyControl.GradeRecord.Text',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'raw')\n    ..aOM<TextStyle>(2, _omitFieldNames ? '' : 'style',\n        subBuilder: TextStyle.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyControl_GradeRecord_Text clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyControl_GradeRecord_Text copyWith(\n          void Function(ReplyControl_GradeRecord_Text) updates) =>\n      super.copyWith(\n              (message) => updates(message as ReplyControl_GradeRecord_Text))\n          as ReplyControl_GradeRecord_Text;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReplyControl_GradeRecord_Text create() =>\n      ReplyControl_GradeRecord_Text._();\n  @$core.override\n  ReplyControl_GradeRecord_Text createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReplyControl_GradeRecord_Text getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReplyControl_GradeRecord_Text>(create);\n  static ReplyControl_GradeRecord_Text? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get raw => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set raw($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasRaw() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRaw() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  TextStyle get style => $_getN(1);\n  @$pb.TagNumber(2)\n  set style(TextStyle value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasStyle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearStyle() => $_clearField(2);\n  @$pb.TagNumber(2)\n  TextStyle ensureStyle() => $_ensure(1);\n}\n\nclass ReplyControl_GradeRecord extends $pb.GeneratedMessage {\n  factory ReplyControl_GradeRecord({\n    $core.int? score,\n    $core.Iterable<ReplyControl_GradeRecord_Text>? texts,\n  }) {\n    final result = create();\n    if (score != null) result.score = score;\n    if (texts != null) result.texts.addAll(texts);\n    return result;\n  }\n\n  ReplyControl_GradeRecord._();\n\n  factory ReplyControl_GradeRecord.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReplyControl_GradeRecord.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReplyControl.GradeRecord',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'score')\n    ..pPM<ReplyControl_GradeRecord_Text>(2, _omitFieldNames ? '' : 'texts',\n        subBuilder: ReplyControl_GradeRecord_Text.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyControl_GradeRecord clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyControl_GradeRecord copyWith(\n          void Function(ReplyControl_GradeRecord) updates) =>\n      super.copyWith((message) => updates(message as ReplyControl_GradeRecord))\n          as ReplyControl_GradeRecord;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReplyControl_GradeRecord create() => ReplyControl_GradeRecord._();\n  @$core.override\n  ReplyControl_GradeRecord createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReplyControl_GradeRecord getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReplyControl_GradeRecord>(create);\n  static ReplyControl_GradeRecord? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get score => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set score($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasScore() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearScore() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<ReplyControl_GradeRecord_Text> get texts => $_getList(1);\n}\n\nclass ReplyControl_InsertEffect extends $pb.GeneratedMessage {\n  factory ReplyControl_InsertEffect({\n    $core.String? content,\n    $core.String? icon,\n  }) {\n    final result = create();\n    if (content != null) result.content = content;\n    if (icon != null) result.icon = icon;\n    return result;\n  }\n\n  ReplyControl_InsertEffect._();\n\n  factory ReplyControl_InsertEffect.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReplyControl_InsertEffect.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReplyControl.InsertEffect',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'content')\n    ..aOS(2, _omitFieldNames ? '' : 'icon')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyControl_InsertEffect clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyControl_InsertEffect copyWith(\n          void Function(ReplyControl_InsertEffect) updates) =>\n      super.copyWith((message) => updates(message as ReplyControl_InsertEffect))\n          as ReplyControl_InsertEffect;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReplyControl_InsertEffect create() => ReplyControl_InsertEffect._();\n  @$core.override\n  ReplyControl_InsertEffect createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReplyControl_InsertEffect getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReplyControl_InsertEffect>(create);\n  static ReplyControl_InsertEffect? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get content => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set content($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasContent() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearContent() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get icon => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set icon($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIcon() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIcon() => $_clearField(2);\n}\n\nclass ReplyControl_VoteOption extends $pb.GeneratedMessage {\n  factory ReplyControl_VoteOption({\n    ReplyControl_VoteOption_LabelKind? labelKind,\n    $core.String? desc,\n    $fixnum.Int64? idx,\n    $fixnum.Int64? voteId,\n  }) {\n    final result = create();\n    if (labelKind != null) result.labelKind = labelKind;\n    if (desc != null) result.desc = desc;\n    if (idx != null) result.idx = idx;\n    if (voteId != null) result.voteId = voteId;\n    return result;\n  }\n\n  ReplyControl_VoteOption._();\n\n  factory ReplyControl_VoteOption.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReplyControl_VoteOption.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReplyControl.VoteOption',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aE<ReplyControl_VoteOption_LabelKind>(\n        1, _omitFieldNames ? '' : 'labelKind',\n        enumValues: ReplyControl_VoteOption_LabelKind.values)\n    ..aOS(2, _omitFieldNames ? '' : 'desc')\n    ..aInt64(3, _omitFieldNames ? '' : 'idx')\n    ..aInt64(4, _omitFieldNames ? '' : 'voteId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyControl_VoteOption clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyControl_VoteOption copyWith(\n          void Function(ReplyControl_VoteOption) updates) =>\n      super.copyWith((message) => updates(message as ReplyControl_VoteOption))\n          as ReplyControl_VoteOption;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReplyControl_VoteOption create() => ReplyControl_VoteOption._();\n  @$core.override\n  ReplyControl_VoteOption createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReplyControl_VoteOption getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReplyControl_VoteOption>(create);\n  static ReplyControl_VoteOption? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  ReplyControl_VoteOption_LabelKind get labelKind => $_getN(0);\n  @$pb.TagNumber(1)\n  set labelKind(ReplyControl_VoteOption_LabelKind value) =>\n      $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLabelKind() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLabelKind() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get desc => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set desc($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDesc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDesc() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get idx => $_getI64(2);\n  @$pb.TagNumber(3)\n  set idx($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIdx() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIdx() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get voteId => $_getI64(3);\n  @$pb.TagNumber(4)\n  set voteId($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasVoteId() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearVoteId() => $_clearField(4);\n}\n\nclass ReplyControl extends $pb.GeneratedMessage {\n  factory ReplyControl({\n    $fixnum.Int64? action,\n    $core.bool? upLike,\n    $core.bool? upReply,\n    $core.bool? showFollowBtn,\n    $core.bool? isAssist,\n    $core.String? labelText,\n    $core.bool? following,\n    $core.bool? followed,\n    $core.bool? blocked,\n    $core.bool? hasFoldedReply,\n    $core.bool? isFoldedReply,\n    $core.bool? isUpTop,\n    $core.bool? isAdminTop,\n    $core.bool? isVoteTop,\n    $fixnum.Int64? maxLine,\n    $core.bool? invisible,\n    $core.bool? isContractor,\n    $core.bool? isNote,\n    $core.Iterable<ReplyCardLabel>? cardLabels,\n    $core.String? subReplyEntryText,\n    $core.String? subReplyTitleText,\n    $core.String? contractDesc,\n    $core.String? timeDesc,\n    $core.String? bizScene,\n    $core.String? location,\n    $core.bool? foldPictures,\n    $core.bool? isNoteV2,\n    $core.bool? hideNoteIcon,\n    $core.String? cmRecommendComponent,\n    ReplyControl_VoteOption? voteOption,\n    $core.String? chargedDesc,\n    ReplyControl_GradeRecord? gradeRecord,\n    $core.String? presetReplyText,\n    ReplyControl_EasterEggLabel? easterEggLabel,\n    $core.String? contextFeature,\n    ReplyControl_InsertEffect? insertEffect,\n  }) {\n    final result = create();\n    if (action != null) result.action = action;\n    if (upLike != null) result.upLike = upLike;\n    if (upReply != null) result.upReply = upReply;\n    if (showFollowBtn != null) result.showFollowBtn = showFollowBtn;\n    if (isAssist != null) result.isAssist = isAssist;\n    if (labelText != null) result.labelText = labelText;\n    if (following != null) result.following = following;\n    if (followed != null) result.followed = followed;\n    if (blocked != null) result.blocked = blocked;\n    if (hasFoldedReply != null) result.hasFoldedReply = hasFoldedReply;\n    if (isFoldedReply != null) result.isFoldedReply = isFoldedReply;\n    if (isUpTop != null) result.isUpTop = isUpTop;\n    if (isAdminTop != null) result.isAdminTop = isAdminTop;\n    if (isVoteTop != null) result.isVoteTop = isVoteTop;\n    if (maxLine != null) result.maxLine = maxLine;\n    if (invisible != null) result.invisible = invisible;\n    if (isContractor != null) result.isContractor = isContractor;\n    if (isNote != null) result.isNote = isNote;\n    if (cardLabels != null) result.cardLabels.addAll(cardLabels);\n    if (subReplyEntryText != null) result.subReplyEntryText = subReplyEntryText;\n    if (subReplyTitleText != null) result.subReplyTitleText = subReplyTitleText;\n    if (contractDesc != null) result.contractDesc = contractDesc;\n    if (timeDesc != null) result.timeDesc = timeDesc;\n    if (bizScene != null) result.bizScene = bizScene;\n    if (location != null) result.location = location;\n    if (foldPictures != null) result.foldPictures = foldPictures;\n    if (isNoteV2 != null) result.isNoteV2 = isNoteV2;\n    if (hideNoteIcon != null) result.hideNoteIcon = hideNoteIcon;\n    if (cmRecommendComponent != null)\n      result.cmRecommendComponent = cmRecommendComponent;\n    if (voteOption != null) result.voteOption = voteOption;\n    if (chargedDesc != null) result.chargedDesc = chargedDesc;\n    if (gradeRecord != null) result.gradeRecord = gradeRecord;\n    if (presetReplyText != null) result.presetReplyText = presetReplyText;\n    if (easterEggLabel != null) result.easterEggLabel = easterEggLabel;\n    if (contextFeature != null) result.contextFeature = contextFeature;\n    if (insertEffect != null) result.insertEffect = insertEffect;\n    return result;\n  }\n\n  ReplyControl._();\n\n  factory ReplyControl.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReplyControl.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReplyControl',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'action')\n    ..aOB(2, _omitFieldNames ? '' : 'upLike')\n    ..aOB(3, _omitFieldNames ? '' : 'upReply')\n    ..aOB(4, _omitFieldNames ? '' : 'showFollowBtn')\n    ..aOB(5, _omitFieldNames ? '' : 'isAssist')\n    ..aOS(6, _omitFieldNames ? '' : 'labelText')\n    ..aOB(7, _omitFieldNames ? '' : 'following')\n    ..aOB(8, _omitFieldNames ? '' : 'followed')\n    ..aOB(9, _omitFieldNames ? '' : 'blocked')\n    ..aOB(10, _omitFieldNames ? '' : 'hasFoldedReply')\n    ..aOB(11, _omitFieldNames ? '' : 'isFoldedReply')\n    ..aOB(12, _omitFieldNames ? '' : 'isUpTop')\n    ..aOB(13, _omitFieldNames ? '' : 'isAdminTop')\n    ..aOB(14, _omitFieldNames ? '' : 'isVoteTop')\n    ..aInt64(15, _omitFieldNames ? '' : 'maxLine')\n    ..aOB(16, _omitFieldNames ? '' : 'invisible')\n    ..aOB(17, _omitFieldNames ? '' : 'isContractor')\n    ..aOB(18, _omitFieldNames ? '' : 'isNote')\n    ..pPM<ReplyCardLabel>(19, _omitFieldNames ? '' : 'cardLabels',\n        subBuilder: ReplyCardLabel.create)\n    ..aOS(20, _omitFieldNames ? '' : 'subReplyEntryText')\n    ..aOS(21, _omitFieldNames ? '' : 'subReplyTitleText')\n    ..aOS(22, _omitFieldNames ? '' : 'contractDesc')\n    ..aOS(23, _omitFieldNames ? '' : 'timeDesc')\n    ..aOS(24, _omitFieldNames ? '' : 'bizScene')\n    ..aOS(25, _omitFieldNames ? '' : 'location')\n    ..aOB(26, _omitFieldNames ? '' : 'foldPictures')\n    ..aOB(27, _omitFieldNames ? '' : 'isNoteV2')\n    ..aOB(28, _omitFieldNames ? '' : 'hideNoteIcon')\n    ..aOS(29, _omitFieldNames ? '' : 'cmRecommendComponent')\n    ..aOM<ReplyControl_VoteOption>(30, _omitFieldNames ? '' : 'voteOption',\n        subBuilder: ReplyControl_VoteOption.create)\n    ..aOS(31, _omitFieldNames ? '' : 'chargedDesc')\n    ..aOM<ReplyControl_GradeRecord>(32, _omitFieldNames ? '' : 'gradeRecord',\n        subBuilder: ReplyControl_GradeRecord.create)\n    ..aOS(33, _omitFieldNames ? '' : 'presetReplyText')\n    ..aOM<ReplyControl_EasterEggLabel>(\n        34, _omitFieldNames ? '' : 'easterEggLabel',\n        subBuilder: ReplyControl_EasterEggLabel.create)\n    ..aOS(35, _omitFieldNames ? '' : 'contextFeature')\n    ..aOM<ReplyControl_InsertEffect>(36, _omitFieldNames ? '' : 'insertEffect',\n        subBuilder: ReplyControl_InsertEffect.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyControl clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyControl copyWith(void Function(ReplyControl) updates) =>\n      super.copyWith((message) => updates(message as ReplyControl))\n          as ReplyControl;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReplyControl create() => ReplyControl._();\n  @$core.override\n  ReplyControl createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReplyControl getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReplyControl>(create);\n  static ReplyControl? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get action => $_getI64(0);\n  @$pb.TagNumber(1)\n  set action($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAction() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAction() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get upLike => $_getBF(1);\n  @$pb.TagNumber(2)\n  set upLike($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUpLike() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUpLike() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get upReply => $_getBF(2);\n  @$pb.TagNumber(3)\n  set upReply($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUpReply() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUpReply() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get showFollowBtn => $_getBF(3);\n  @$pb.TagNumber(4)\n  set showFollowBtn($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasShowFollowBtn() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearShowFollowBtn() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.bool get isAssist => $_getBF(4);\n  @$pb.TagNumber(5)\n  set isAssist($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasIsAssist() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearIsAssist() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get labelText => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set labelText($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasLabelText() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearLabelText() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.bool get following => $_getBF(6);\n  @$pb.TagNumber(7)\n  set following($core.bool value) => $_setBool(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasFollowing() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearFollowing() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.bool get followed => $_getBF(7);\n  @$pb.TagNumber(8)\n  set followed($core.bool value) => $_setBool(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasFollowed() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearFollowed() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.bool get blocked => $_getBF(8);\n  @$pb.TagNumber(9)\n  set blocked($core.bool value) => $_setBool(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasBlocked() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearBlocked() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.bool get hasFoldedReply => $_getBF(9);\n  @$pb.TagNumber(10)\n  set hasFoldedReply($core.bool value) => $_setBool(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasHasFoldedReply() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearHasFoldedReply() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.bool get isFoldedReply => $_getBF(10);\n  @$pb.TagNumber(11)\n  set isFoldedReply($core.bool value) => $_setBool(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasIsFoldedReply() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearIsFoldedReply() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.bool get isUpTop => $_getBF(11);\n  @$pb.TagNumber(12)\n  set isUpTop($core.bool value) => $_setBool(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasIsUpTop() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearIsUpTop() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.bool get isAdminTop => $_getBF(12);\n  @$pb.TagNumber(13)\n  set isAdminTop($core.bool value) => $_setBool(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasIsAdminTop() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearIsAdminTop() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.bool get isVoteTop => $_getBF(13);\n  @$pb.TagNumber(14)\n  set isVoteTop($core.bool value) => $_setBool(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasIsVoteTop() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearIsVoteTop() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $fixnum.Int64 get maxLine => $_getI64(14);\n  @$pb.TagNumber(15)\n  set maxLine($fixnum.Int64 value) => $_setInt64(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasMaxLine() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearMaxLine() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $core.bool get invisible => $_getBF(15);\n  @$pb.TagNumber(16)\n  set invisible($core.bool value) => $_setBool(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasInvisible() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearInvisible() => $_clearField(16);\n\n  @$pb.TagNumber(17)\n  $core.bool get isContractor => $_getBF(16);\n  @$pb.TagNumber(17)\n  set isContractor($core.bool value) => $_setBool(16, value);\n  @$pb.TagNumber(17)\n  $core.bool hasIsContractor() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearIsContractor() => $_clearField(17);\n\n  @$pb.TagNumber(18)\n  $core.bool get isNote => $_getBF(17);\n  @$pb.TagNumber(18)\n  set isNote($core.bool value) => $_setBool(17, value);\n  @$pb.TagNumber(18)\n  $core.bool hasIsNote() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearIsNote() => $_clearField(18);\n\n  @$pb.TagNumber(19)\n  $pb.PbList<ReplyCardLabel> get cardLabels => $_getList(18);\n\n  @$pb.TagNumber(20)\n  $core.String get subReplyEntryText => $_getSZ(19);\n  @$pb.TagNumber(20)\n  set subReplyEntryText($core.String value) => $_setString(19, value);\n  @$pb.TagNumber(20)\n  $core.bool hasSubReplyEntryText() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearSubReplyEntryText() => $_clearField(20);\n\n  @$pb.TagNumber(21)\n  $core.String get subReplyTitleText => $_getSZ(20);\n  @$pb.TagNumber(21)\n  set subReplyTitleText($core.String value) => $_setString(20, value);\n  @$pb.TagNumber(21)\n  $core.bool hasSubReplyTitleText() => $_has(20);\n  @$pb.TagNumber(21)\n  void clearSubReplyTitleText() => $_clearField(21);\n\n  @$pb.TagNumber(22)\n  $core.String get contractDesc => $_getSZ(21);\n  @$pb.TagNumber(22)\n  set contractDesc($core.String value) => $_setString(21, value);\n  @$pb.TagNumber(22)\n  $core.bool hasContractDesc() => $_has(21);\n  @$pb.TagNumber(22)\n  void clearContractDesc() => $_clearField(22);\n\n  @$pb.TagNumber(23)\n  $core.String get timeDesc => $_getSZ(22);\n  @$pb.TagNumber(23)\n  set timeDesc($core.String value) => $_setString(22, value);\n  @$pb.TagNumber(23)\n  $core.bool hasTimeDesc() => $_has(22);\n  @$pb.TagNumber(23)\n  void clearTimeDesc() => $_clearField(23);\n\n  @$pb.TagNumber(24)\n  $core.String get bizScene => $_getSZ(23);\n  @$pb.TagNumber(24)\n  set bizScene($core.String value) => $_setString(23, value);\n  @$pb.TagNumber(24)\n  $core.bool hasBizScene() => $_has(23);\n  @$pb.TagNumber(24)\n  void clearBizScene() => $_clearField(24);\n\n  @$pb.TagNumber(25)\n  $core.String get location => $_getSZ(24);\n  @$pb.TagNumber(25)\n  set location($core.String value) => $_setString(24, value);\n  @$pb.TagNumber(25)\n  $core.bool hasLocation() => $_has(24);\n  @$pb.TagNumber(25)\n  void clearLocation() => $_clearField(25);\n\n  @$pb.TagNumber(26)\n  $core.bool get foldPictures => $_getBF(25);\n  @$pb.TagNumber(26)\n  set foldPictures($core.bool value) => $_setBool(25, value);\n  @$pb.TagNumber(26)\n  $core.bool hasFoldPictures() => $_has(25);\n  @$pb.TagNumber(26)\n  void clearFoldPictures() => $_clearField(26);\n\n  @$pb.TagNumber(27)\n  $core.bool get isNoteV2 => $_getBF(26);\n  @$pb.TagNumber(27)\n  set isNoteV2($core.bool value) => $_setBool(26, value);\n  @$pb.TagNumber(27)\n  $core.bool hasIsNoteV2() => $_has(26);\n  @$pb.TagNumber(27)\n  void clearIsNoteV2() => $_clearField(27);\n\n  @$pb.TagNumber(28)\n  $core.bool get hideNoteIcon => $_getBF(27);\n  @$pb.TagNumber(28)\n  set hideNoteIcon($core.bool value) => $_setBool(27, value);\n  @$pb.TagNumber(28)\n  $core.bool hasHideNoteIcon() => $_has(27);\n  @$pb.TagNumber(28)\n  void clearHideNoteIcon() => $_clearField(28);\n\n  @$pb.TagNumber(29)\n  $core.String get cmRecommendComponent => $_getSZ(28);\n  @$pb.TagNumber(29)\n  set cmRecommendComponent($core.String value) => $_setString(28, value);\n  @$pb.TagNumber(29)\n  $core.bool hasCmRecommendComponent() => $_has(28);\n  @$pb.TagNumber(29)\n  void clearCmRecommendComponent() => $_clearField(29);\n\n  @$pb.TagNumber(30)\n  ReplyControl_VoteOption get voteOption => $_getN(29);\n  @$pb.TagNumber(30)\n  set voteOption(ReplyControl_VoteOption value) => $_setField(30, value);\n  @$pb.TagNumber(30)\n  $core.bool hasVoteOption() => $_has(29);\n  @$pb.TagNumber(30)\n  void clearVoteOption() => $_clearField(30);\n  @$pb.TagNumber(30)\n  ReplyControl_VoteOption ensureVoteOption() => $_ensure(29);\n\n  @$pb.TagNumber(31)\n  $core.String get chargedDesc => $_getSZ(30);\n  @$pb.TagNumber(31)\n  set chargedDesc($core.String value) => $_setString(30, value);\n  @$pb.TagNumber(31)\n  $core.bool hasChargedDesc() => $_has(30);\n  @$pb.TagNumber(31)\n  void clearChargedDesc() => $_clearField(31);\n\n  @$pb.TagNumber(32)\n  ReplyControl_GradeRecord get gradeRecord => $_getN(31);\n  @$pb.TagNumber(32)\n  set gradeRecord(ReplyControl_GradeRecord value) => $_setField(32, value);\n  @$pb.TagNumber(32)\n  $core.bool hasGradeRecord() => $_has(31);\n  @$pb.TagNumber(32)\n  void clearGradeRecord() => $_clearField(32);\n  @$pb.TagNumber(32)\n  ReplyControl_GradeRecord ensureGradeRecord() => $_ensure(31);\n\n  @$pb.TagNumber(33)\n  $core.String get presetReplyText => $_getSZ(32);\n  @$pb.TagNumber(33)\n  set presetReplyText($core.String value) => $_setString(32, value);\n  @$pb.TagNumber(33)\n  $core.bool hasPresetReplyText() => $_has(32);\n  @$pb.TagNumber(33)\n  void clearPresetReplyText() => $_clearField(33);\n\n  @$pb.TagNumber(34)\n  ReplyControl_EasterEggLabel get easterEggLabel => $_getN(33);\n  @$pb.TagNumber(34)\n  set easterEggLabel(ReplyControl_EasterEggLabel value) =>\n      $_setField(34, value);\n  @$pb.TagNumber(34)\n  $core.bool hasEasterEggLabel() => $_has(33);\n  @$pb.TagNumber(34)\n  void clearEasterEggLabel() => $_clearField(34);\n  @$pb.TagNumber(34)\n  ReplyControl_EasterEggLabel ensureEasterEggLabel() => $_ensure(33);\n\n  @$pb.TagNumber(35)\n  $core.String get contextFeature => $_getSZ(34);\n  @$pb.TagNumber(35)\n  set contextFeature($core.String value) => $_setString(34, value);\n  @$pb.TagNumber(35)\n  $core.bool hasContextFeature() => $_has(34);\n  @$pb.TagNumber(35)\n  void clearContextFeature() => $_clearField(35);\n\n  @$pb.TagNumber(36)\n  ReplyControl_InsertEffect get insertEffect => $_getN(35);\n  @$pb.TagNumber(36)\n  set insertEffect(ReplyControl_InsertEffect value) => $_setField(36, value);\n  @$pb.TagNumber(36)\n  $core.bool hasInsertEffect() => $_has(35);\n  @$pb.TagNumber(36)\n  void clearInsertEffect() => $_clearField(36);\n  @$pb.TagNumber(36)\n  ReplyControl_InsertEffect ensureInsertEffect() => $_ensure(35);\n}\n\nclass ReplyExtra extends $pb.GeneratedMessage {\n  factory ReplyExtra({\n    $fixnum.Int64? seasonId,\n    $fixnum.Int64? seasonType,\n    $fixnum.Int64? epId,\n    $core.bool? isStory,\n    $core.String? spmid,\n    $core.String? fromSpmid,\n    $core.bool? disableUnderline,\n    $core.bool? disableWeSearch,\n    $core.bool? disableFilterTag,\n    $core.bool? isActivityMode,\n    $core.String? trackId,\n  }) {\n    final result = create();\n    if (seasonId != null) result.seasonId = seasonId;\n    if (seasonType != null) result.seasonType = seasonType;\n    if (epId != null) result.epId = epId;\n    if (isStory != null) result.isStory = isStory;\n    if (spmid != null) result.spmid = spmid;\n    if (fromSpmid != null) result.fromSpmid = fromSpmid;\n    if (disableUnderline != null) result.disableUnderline = disableUnderline;\n    if (disableWeSearch != null) result.disableWeSearch = disableWeSearch;\n    if (disableFilterTag != null) result.disableFilterTag = disableFilterTag;\n    if (isActivityMode != null) result.isActivityMode = isActivityMode;\n    if (trackId != null) result.trackId = trackId;\n    return result;\n  }\n\n  ReplyExtra._();\n\n  factory ReplyExtra.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReplyExtra.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReplyExtra',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'seasonId')\n    ..aInt64(2, _omitFieldNames ? '' : 'seasonType')\n    ..aInt64(3, _omitFieldNames ? '' : 'epId')\n    ..aOB(4, _omitFieldNames ? '' : 'isStory')\n    ..aOS(5, _omitFieldNames ? '' : 'spmid')\n    ..aOS(6, _omitFieldNames ? '' : 'fromSpmid')\n    ..aOB(7, _omitFieldNames ? '' : 'disableUnderline')\n    ..aOB(8, _omitFieldNames ? '' : 'disableWeSearch')\n    ..aOB(9, _omitFieldNames ? '' : 'disableFilterTag')\n    ..aOB(10, _omitFieldNames ? '' : 'isActivityMode')\n    ..aOS(11, _omitFieldNames ? '' : 'trackId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyExtra clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyExtra copyWith(void Function(ReplyExtra) updates) =>\n      super.copyWith((message) => updates(message as ReplyExtra)) as ReplyExtra;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReplyExtra create() => ReplyExtra._();\n  @$core.override\n  ReplyExtra createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReplyExtra getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReplyExtra>(create);\n  static ReplyExtra? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get seasonId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set seasonId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSeasonId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSeasonId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get seasonType => $_getI64(1);\n  @$pb.TagNumber(2)\n  set seasonType($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSeasonType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSeasonType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get epId => $_getI64(2);\n  @$pb.TagNumber(3)\n  set epId($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasEpId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearEpId() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get isStory => $_getBF(3);\n  @$pb.TagNumber(4)\n  set isStory($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIsStory() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIsStory() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get spmid => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set spmid($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasSpmid() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearSpmid() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get fromSpmid => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set fromSpmid($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasFromSpmid() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearFromSpmid() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.bool get disableUnderline => $_getBF(6);\n  @$pb.TagNumber(7)\n  set disableUnderline($core.bool value) => $_setBool(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasDisableUnderline() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearDisableUnderline() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.bool get disableWeSearch => $_getBF(7);\n  @$pb.TagNumber(8)\n  set disableWeSearch($core.bool value) => $_setBool(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasDisableWeSearch() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearDisableWeSearch() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.bool get disableFilterTag => $_getBF(8);\n  @$pb.TagNumber(9)\n  set disableFilterTag($core.bool value) => $_setBool(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasDisableFilterTag() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearDisableFilterTag() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.bool get isActivityMode => $_getBF(9);\n  @$pb.TagNumber(10)\n  set isActivityMode($core.bool value) => $_setBool(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasIsActivityMode() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearIsActivityMode() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get trackId => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set trackId($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasTrackId() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearTrackId() => $_clearField(11);\n}\n\nclass ReplyInAppPushPayload_Content extends $pb.GeneratedMessage {\n  factory ReplyInAppPushPayload_Content({\n    $core.String? message,\n    $core.Iterable<$core.MapEntry<$core.String, Emote>>? emotes,\n    $core.Iterable<$core.MapEntry<$core.String, $fixnum.Int64>>? atNameToMid,\n    $core.Iterable<Picture>? pictures,\n  }) {\n    final result = create();\n    if (message != null) result.message = message;\n    if (emotes != null) result.emotes.addEntries(emotes);\n    if (atNameToMid != null) result.atNameToMid.addEntries(atNameToMid);\n    if (pictures != null) result.pictures.addAll(pictures);\n    return result;\n  }\n\n  ReplyInAppPushPayload_Content._();\n\n  factory ReplyInAppPushPayload_Content.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReplyInAppPushPayload_Content.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReplyInAppPushPayload.Content',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'message')\n    ..m<$core.String, Emote>(2, _omitFieldNames ? '' : 'emotes',\n        entryClassName: 'ReplyInAppPushPayload.Content.EmotesEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OM,\n        valueCreator: Emote.create,\n        valueDefaultOrMaker: Emote.getDefault,\n        packageName: const $pb.PackageName('bilibili.main.community.reply.v1'))\n    ..m<$core.String, $fixnum.Int64>(3, _omitFieldNames ? '' : 'atNameToMid',\n        entryClassName: 'ReplyInAppPushPayload.Content.AtNameToMidEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.O6,\n        packageName: const $pb.PackageName('bilibili.main.community.reply.v1'))\n    ..pPM<Picture>(4, _omitFieldNames ? '' : 'pictures',\n        subBuilder: Picture.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyInAppPushPayload_Content clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyInAppPushPayload_Content copyWith(\n          void Function(ReplyInAppPushPayload_Content) updates) =>\n      super.copyWith(\n              (message) => updates(message as ReplyInAppPushPayload_Content))\n          as ReplyInAppPushPayload_Content;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReplyInAppPushPayload_Content create() =>\n      ReplyInAppPushPayload_Content._();\n  @$core.override\n  ReplyInAppPushPayload_Content createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReplyInAppPushPayload_Content getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReplyInAppPushPayload_Content>(create);\n  static ReplyInAppPushPayload_Content? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get message => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set message($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMessage() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMessage() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbMap<$core.String, Emote> get emotes => $_getMap(1);\n\n  @$pb.TagNumber(3)\n  $pb.PbMap<$core.String, $fixnum.Int64> get atNameToMid => $_getMap(2);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<Picture> get pictures => $_getList(3);\n}\n\nclass ReplyInAppPushPayload_Member extends $pb.GeneratedMessage {\n  factory ReplyInAppPushPayload_Member({\n    $fixnum.Int64? mid,\n    $core.String? name,\n    $core.String? face,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (name != null) result.name = name;\n    if (face != null) result.face = face;\n    return result;\n  }\n\n  ReplyInAppPushPayload_Member._();\n\n  factory ReplyInAppPushPayload_Member.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReplyInAppPushPayload_Member.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReplyInAppPushPayload.Member',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'face')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyInAppPushPayload_Member clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyInAppPushPayload_Member copyWith(\n          void Function(ReplyInAppPushPayload_Member) updates) =>\n      super.copyWith(\n              (message) => updates(message as ReplyInAppPushPayload_Member))\n          as ReplyInAppPushPayload_Member;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReplyInAppPushPayload_Member create() =>\n      ReplyInAppPushPayload_Member._();\n  @$core.override\n  ReplyInAppPushPayload_Member createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReplyInAppPushPayload_Member getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReplyInAppPushPayload_Member>(create);\n  static ReplyInAppPushPayload_Member? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get face => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set face($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFace() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFace() => $_clearField(3);\n}\n\nclass ReplyInAppPushPayload_Reply extends $pb.GeneratedMessage {\n  factory ReplyInAppPushPayload_Reply({\n    $fixnum.Int64? id,\n    $fixnum.Int64? type,\n    $fixnum.Int64? oid,\n    $fixnum.Int64? mid,\n    $fixnum.Int64? root,\n    $fixnum.Int64? parent,\n    $fixnum.Int64? dialog,\n    $fixnum.Int64? ctime,\n    ReplyInAppPushPayload_Content? content,\n    ReplyInAppPushPayload_Member? member,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (type != null) result.type = type;\n    if (oid != null) result.oid = oid;\n    if (mid != null) result.mid = mid;\n    if (root != null) result.root = root;\n    if (parent != null) result.parent = parent;\n    if (dialog != null) result.dialog = dialog;\n    if (ctime != null) result.ctime = ctime;\n    if (content != null) result.content = content;\n    if (member != null) result.member = member;\n    return result;\n  }\n\n  ReplyInAppPushPayload_Reply._();\n\n  factory ReplyInAppPushPayload_Reply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReplyInAppPushPayload_Reply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReplyInAppPushPayload.Reply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aInt64(2, _omitFieldNames ? '' : 'type')\n    ..aInt64(3, _omitFieldNames ? '' : 'oid')\n    ..aInt64(4, _omitFieldNames ? '' : 'mid')\n    ..aInt64(5, _omitFieldNames ? '' : 'root')\n    ..aInt64(6, _omitFieldNames ? '' : 'parent')\n    ..aInt64(7, _omitFieldNames ? '' : 'dialog')\n    ..aInt64(8, _omitFieldNames ? '' : 'ctime')\n    ..aOM<ReplyInAppPushPayload_Content>(9, _omitFieldNames ? '' : 'content',\n        subBuilder: ReplyInAppPushPayload_Content.create)\n    ..aOM<ReplyInAppPushPayload_Member>(10, _omitFieldNames ? '' : 'member',\n        subBuilder: ReplyInAppPushPayload_Member.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyInAppPushPayload_Reply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyInAppPushPayload_Reply copyWith(\n          void Function(ReplyInAppPushPayload_Reply) updates) =>\n      super.copyWith(\n              (message) => updates(message as ReplyInAppPushPayload_Reply))\n          as ReplyInAppPushPayload_Reply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReplyInAppPushPayload_Reply create() =>\n      ReplyInAppPushPayload_Reply._();\n  @$core.override\n  ReplyInAppPushPayload_Reply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReplyInAppPushPayload_Reply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReplyInAppPushPayload_Reply>(create);\n  static ReplyInAppPushPayload_Reply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get type => $_getI64(1);\n  @$pb.TagNumber(2)\n  set type($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get oid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set oid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasOid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearOid() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get mid => $_getI64(3);\n  @$pb.TagNumber(4)\n  set mid($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasMid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearMid() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get root => $_getI64(4);\n  @$pb.TagNumber(5)\n  set root($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasRoot() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearRoot() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get parent => $_getI64(5);\n  @$pb.TagNumber(6)\n  set parent($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasParent() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearParent() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get dialog => $_getI64(6);\n  @$pb.TagNumber(7)\n  set dialog($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasDialog() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearDialog() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get ctime => $_getI64(7);\n  @$pb.TagNumber(8)\n  set ctime($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasCtime() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearCtime() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  ReplyInAppPushPayload_Content get content => $_getN(8);\n  @$pb.TagNumber(9)\n  set content(ReplyInAppPushPayload_Content value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasContent() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearContent() => $_clearField(9);\n  @$pb.TagNumber(9)\n  ReplyInAppPushPayload_Content ensureContent() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  ReplyInAppPushPayload_Member get member => $_getN(9);\n  @$pb.TagNumber(10)\n  set member(ReplyInAppPushPayload_Member value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasMember() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearMember() => $_clearField(10);\n  @$pb.TagNumber(10)\n  ReplyInAppPushPayload_Member ensureMember() => $_ensure(9);\n}\n\nclass ReplyInAppPushPayload_Subject extends $pb.GeneratedMessage {\n  factory ReplyInAppPushPayload_Subject({\n    $fixnum.Int64? type,\n    $fixnum.Int64? oid,\n    $fixnum.Int64? upMid,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (oid != null) result.oid = oid;\n    if (upMid != null) result.upMid = upMid;\n    return result;\n  }\n\n  ReplyInAppPushPayload_Subject._();\n\n  factory ReplyInAppPushPayload_Subject.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReplyInAppPushPayload_Subject.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReplyInAppPushPayload.Subject',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'type')\n    ..aInt64(2, _omitFieldNames ? '' : 'oid')\n    ..aInt64(3, _omitFieldNames ? '' : 'upMid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyInAppPushPayload_Subject clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyInAppPushPayload_Subject copyWith(\n          void Function(ReplyInAppPushPayload_Subject) updates) =>\n      super.copyWith(\n              (message) => updates(message as ReplyInAppPushPayload_Subject))\n          as ReplyInAppPushPayload_Subject;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReplyInAppPushPayload_Subject create() =>\n      ReplyInAppPushPayload_Subject._();\n  @$core.override\n  ReplyInAppPushPayload_Subject createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReplyInAppPushPayload_Subject getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReplyInAppPushPayload_Subject>(create);\n  static ReplyInAppPushPayload_Subject? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get type => $_getI64(0);\n  @$pb.TagNumber(1)\n  set type($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get oid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set oid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get upMid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set upMid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUpMid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUpMid() => $_clearField(3);\n}\n\nclass ReplyInAppPushPayload_SubjectMaterial_Archive\n    extends $pb.GeneratedMessage {\n  factory ReplyInAppPushPayload_SubjectMaterial_Archive({\n    $fixnum.Int64? aid,\n    $core.String? title,\n    $core.String? cover,\n  }) {\n    final result = create();\n    if (aid != null) result.aid = aid;\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    return result;\n  }\n\n  ReplyInAppPushPayload_SubjectMaterial_Archive._();\n\n  factory ReplyInAppPushPayload_SubjectMaterial_Archive.fromBuffer(\n          $core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReplyInAppPushPayload_SubjectMaterial_Archive.fromJson(\n          $core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReplyInAppPushPayload.SubjectMaterial.Archive',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'aid')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'cover')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyInAppPushPayload_SubjectMaterial_Archive clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyInAppPushPayload_SubjectMaterial_Archive copyWith(\n          void Function(ReplyInAppPushPayload_SubjectMaterial_Archive)\n              updates) =>\n      super.copyWith((message) =>\n              updates(message as ReplyInAppPushPayload_SubjectMaterial_Archive))\n          as ReplyInAppPushPayload_SubjectMaterial_Archive;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReplyInAppPushPayload_SubjectMaterial_Archive create() =>\n      ReplyInAppPushPayload_SubjectMaterial_Archive._();\n  @$core.override\n  ReplyInAppPushPayload_SubjectMaterial_Archive createEmptyInstance() =>\n      create();\n  @$core.pragma('dart2js:noInline')\n  static ReplyInAppPushPayload_SubjectMaterial_Archive getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<\n          ReplyInAppPushPayload_SubjectMaterial_Archive>(create);\n  static ReplyInAppPushPayload_SubjectMaterial_Archive? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get aid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set aid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get cover => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set cover($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCover() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCover() => $_clearField(3);\n}\n\nenum ReplyInAppPushPayload_SubjectMaterial_Item { arc, notSet }\n\nclass ReplyInAppPushPayload_SubjectMaterial extends $pb.GeneratedMessage {\n  factory ReplyInAppPushPayload_SubjectMaterial({\n    ReplyInAppPushPayload_SubjectMaterial_Archive? arc,\n  }) {\n    final result = create();\n    if (arc != null) result.arc = arc;\n    return result;\n  }\n\n  ReplyInAppPushPayload_SubjectMaterial._();\n\n  factory ReplyInAppPushPayload_SubjectMaterial.fromBuffer(\n          $core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReplyInAppPushPayload_SubjectMaterial.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, ReplyInAppPushPayload_SubjectMaterial_Item>\n      _ReplyInAppPushPayload_SubjectMaterial_ItemByTag = {\n    1: ReplyInAppPushPayload_SubjectMaterial_Item.arc,\n    0: ReplyInAppPushPayload_SubjectMaterial_Item.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReplyInAppPushPayload.SubjectMaterial',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [1])\n    ..aOM<ReplyInAppPushPayload_SubjectMaterial_Archive>(\n        1, _omitFieldNames ? '' : 'arc',\n        subBuilder: ReplyInAppPushPayload_SubjectMaterial_Archive.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyInAppPushPayload_SubjectMaterial clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyInAppPushPayload_SubjectMaterial copyWith(\n          void Function(ReplyInAppPushPayload_SubjectMaterial) updates) =>\n      super.copyWith((message) =>\n              updates(message as ReplyInAppPushPayload_SubjectMaterial))\n          as ReplyInAppPushPayload_SubjectMaterial;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReplyInAppPushPayload_SubjectMaterial create() =>\n      ReplyInAppPushPayload_SubjectMaterial._();\n  @$core.override\n  ReplyInAppPushPayload_SubjectMaterial createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReplyInAppPushPayload_SubjectMaterial getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<\n          ReplyInAppPushPayload_SubjectMaterial>(create);\n  static ReplyInAppPushPayload_SubjectMaterial? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  ReplyInAppPushPayload_SubjectMaterial_Item whichItem() =>\n      _ReplyInAppPushPayload_SubjectMaterial_ItemByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(1)\n  void clearItem() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  ReplyInAppPushPayload_SubjectMaterial_Archive get arc => $_getN(0);\n  @$pb.TagNumber(1)\n  set arc(ReplyInAppPushPayload_SubjectMaterial_Archive value) =>\n      $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasArc() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearArc() => $_clearField(1);\n  @$pb.TagNumber(1)\n  ReplyInAppPushPayload_SubjectMaterial_Archive ensureArc() => $_ensure(0);\n}\n\nclass ReplyInAppPushPayload extends $pb.GeneratedMessage {\n  factory ReplyInAppPushPayload({\n    ReplyInAppPushPayload_Reply? reply,\n    ReplyInAppPushPayload_Reply? parentReply,\n    ReplyInAppPushPayload_Subject? subject,\n    ReplyInAppPushPayload_SubjectMaterial? subjectMaterial,\n  }) {\n    final result = create();\n    if (reply != null) result.reply = reply;\n    if (parentReply != null) result.parentReply = parentReply;\n    if (subject != null) result.subject = subject;\n    if (subjectMaterial != null) result.subjectMaterial = subjectMaterial;\n    return result;\n  }\n\n  ReplyInAppPushPayload._();\n\n  factory ReplyInAppPushPayload.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReplyInAppPushPayload.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReplyInAppPushPayload',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOM<ReplyInAppPushPayload_Reply>(1, _omitFieldNames ? '' : 'reply',\n        subBuilder: ReplyInAppPushPayload_Reply.create)\n    ..aOM<ReplyInAppPushPayload_Reply>(2, _omitFieldNames ? '' : 'parentReply',\n        subBuilder: ReplyInAppPushPayload_Reply.create)\n    ..aOM<ReplyInAppPushPayload_Subject>(3, _omitFieldNames ? '' : 'subject',\n        subBuilder: ReplyInAppPushPayload_Subject.create)\n    ..aOM<ReplyInAppPushPayload_SubjectMaterial>(\n        4, _omitFieldNames ? '' : 'subjectMaterial',\n        subBuilder: ReplyInAppPushPayload_SubjectMaterial.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyInAppPushPayload clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyInAppPushPayload copyWith(\n          void Function(ReplyInAppPushPayload) updates) =>\n      super.copyWith((message) => updates(message as ReplyInAppPushPayload))\n          as ReplyInAppPushPayload;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReplyInAppPushPayload create() => ReplyInAppPushPayload._();\n  @$core.override\n  ReplyInAppPushPayload createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReplyInAppPushPayload getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReplyInAppPushPayload>(create);\n  static ReplyInAppPushPayload? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  ReplyInAppPushPayload_Reply get reply => $_getN(0);\n  @$pb.TagNumber(1)\n  set reply(ReplyInAppPushPayload_Reply value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasReply() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearReply() => $_clearField(1);\n  @$pb.TagNumber(1)\n  ReplyInAppPushPayload_Reply ensureReply() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  ReplyInAppPushPayload_Reply get parentReply => $_getN(1);\n  @$pb.TagNumber(2)\n  set parentReply(ReplyInAppPushPayload_Reply value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasParentReply() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearParentReply() => $_clearField(2);\n  @$pb.TagNumber(2)\n  ReplyInAppPushPayload_Reply ensureParentReply() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  ReplyInAppPushPayload_Subject get subject => $_getN(2);\n  @$pb.TagNumber(3)\n  set subject(ReplyInAppPushPayload_Subject value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSubject() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSubject() => $_clearField(3);\n  @$pb.TagNumber(3)\n  ReplyInAppPushPayload_Subject ensureSubject() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  ReplyInAppPushPayload_SubjectMaterial get subjectMaterial => $_getN(3);\n  @$pb.TagNumber(4)\n  set subjectMaterial(ReplyInAppPushPayload_SubjectMaterial value) =>\n      $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSubjectMaterial() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSubjectMaterial() => $_clearField(4);\n  @$pb.TagNumber(4)\n  ReplyInAppPushPayload_SubjectMaterial ensureSubjectMaterial() => $_ensure(3);\n}\n\nclass ReplyInfo extends $pb.GeneratedMessage {\n  factory ReplyInfo({\n    $core.Iterable<ReplyInfo>? replies,\n    $fixnum.Int64? id,\n    $fixnum.Int64? oid,\n    $fixnum.Int64? type,\n    $fixnum.Int64? mid,\n    $fixnum.Int64? root,\n    $fixnum.Int64? parent,\n    $fixnum.Int64? dialog,\n    $fixnum.Int64? like,\n    $fixnum.Int64? ctime,\n    $fixnum.Int64? count,\n    Content? content,\n    Member? member,\n    ReplyControl? replyControl,\n    MemberV2? memberV2,\n    $core.String? trackInfo,\n  }) {\n    final result = create();\n    if (replies != null) result.replies.addAll(replies);\n    if (id != null) result.id = id;\n    if (oid != null) result.oid = oid;\n    if (type != null) result.type = type;\n    if (mid != null) result.mid = mid;\n    if (root != null) result.root = root;\n    if (parent != null) result.parent = parent;\n    if (dialog != null) result.dialog = dialog;\n    if (like != null) result.like = like;\n    if (ctime != null) result.ctime = ctime;\n    if (count != null) result.count = count;\n    if (content != null) result.content = content;\n    if (member != null) result.member = member;\n    if (replyControl != null) result.replyControl = replyControl;\n    if (memberV2 != null) result.memberV2 = memberV2;\n    if (trackInfo != null) result.trackInfo = trackInfo;\n    return result;\n  }\n\n  ReplyInfo._();\n\n  factory ReplyInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReplyInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReplyInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..pPM<ReplyInfo>(1, _omitFieldNames ? '' : 'replies',\n        subBuilder: ReplyInfo.create)\n    ..aInt64(2, _omitFieldNames ? '' : 'id')\n    ..aInt64(3, _omitFieldNames ? '' : 'oid')\n    ..aInt64(4, _omitFieldNames ? '' : 'type')\n    ..aInt64(5, _omitFieldNames ? '' : 'mid')\n    ..aInt64(6, _omitFieldNames ? '' : 'root')\n    ..aInt64(7, _omitFieldNames ? '' : 'parent')\n    ..aInt64(8, _omitFieldNames ? '' : 'dialog')\n    ..aInt64(9, _omitFieldNames ? '' : 'like')\n    ..aInt64(10, _omitFieldNames ? '' : 'ctime')\n    ..aInt64(11, _omitFieldNames ? '' : 'count')\n    ..aOM<Content>(12, _omitFieldNames ? '' : 'content',\n        subBuilder: Content.create)\n    ..aOM<Member>(13, _omitFieldNames ? '' : 'member',\n        subBuilder: Member.create)\n    ..aOM<ReplyControl>(14, _omitFieldNames ? '' : 'replyControl',\n        subBuilder: ReplyControl.create)\n    ..aOM<MemberV2>(15, _omitFieldNames ? '' : 'memberV2',\n        subBuilder: MemberV2.create)\n    ..aOS(16, _omitFieldNames ? '' : 'trackInfo')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyInfo copyWith(void Function(ReplyInfo) updates) =>\n      super.copyWith((message) => updates(message as ReplyInfo)) as ReplyInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReplyInfo create() => ReplyInfo._();\n  @$core.override\n  ReplyInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReplyInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ReplyInfo>(create);\n  static ReplyInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<ReplyInfo> get replies => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get id => $_getI64(1);\n  @$pb.TagNumber(2)\n  set id($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get oid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set oid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasOid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearOid() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get type => $_getI64(3);\n  @$pb.TagNumber(4)\n  set type($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearType() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get mid => $_getI64(4);\n  @$pb.TagNumber(5)\n  set mid($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasMid() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearMid() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get root => $_getI64(5);\n  @$pb.TagNumber(6)\n  set root($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasRoot() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearRoot() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get parent => $_getI64(6);\n  @$pb.TagNumber(7)\n  set parent($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasParent() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearParent() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get dialog => $_getI64(7);\n  @$pb.TagNumber(8)\n  set dialog($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasDialog() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearDialog() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $fixnum.Int64 get like => $_getI64(8);\n  @$pb.TagNumber(9)\n  set like($fixnum.Int64 value) => $_setInt64(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasLike() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearLike() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $fixnum.Int64 get ctime => $_getI64(9);\n  @$pb.TagNumber(10)\n  set ctime($fixnum.Int64 value) => $_setInt64(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasCtime() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearCtime() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $fixnum.Int64 get count => $_getI64(10);\n  @$pb.TagNumber(11)\n  set count($fixnum.Int64 value) => $_setInt64(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasCount() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearCount() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  Content get content => $_getN(11);\n  @$pb.TagNumber(12)\n  set content(Content value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasContent() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearContent() => $_clearField(12);\n  @$pb.TagNumber(12)\n  Content ensureContent() => $_ensure(11);\n\n  @$pb.TagNumber(13)\n  Member get member => $_getN(12);\n  @$pb.TagNumber(13)\n  set member(Member value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasMember() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearMember() => $_clearField(13);\n  @$pb.TagNumber(13)\n  Member ensureMember() => $_ensure(12);\n\n  @$pb.TagNumber(14)\n  ReplyControl get replyControl => $_getN(13);\n  @$pb.TagNumber(14)\n  set replyControl(ReplyControl value) => $_setField(14, value);\n  @$pb.TagNumber(14)\n  $core.bool hasReplyControl() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearReplyControl() => $_clearField(14);\n  @$pb.TagNumber(14)\n  ReplyControl ensureReplyControl() => $_ensure(13);\n\n  @$pb.TagNumber(15)\n  MemberV2 get memberV2 => $_getN(14);\n  @$pb.TagNumber(15)\n  set memberV2(MemberV2 value) => $_setField(15, value);\n  @$pb.TagNumber(15)\n  $core.bool hasMemberV2() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearMemberV2() => $_clearField(15);\n  @$pb.TagNumber(15)\n  MemberV2 ensureMemberV2() => $_ensure(14);\n\n  @$pb.TagNumber(16)\n  $core.String get trackInfo => $_getSZ(15);\n  @$pb.TagNumber(16)\n  set trackInfo($core.String value) => $_setString(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasTrackInfo() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearTrackInfo() => $_clearField(16);\n}\n\nclass ReplyInfoReply extends $pb.GeneratedMessage {\n  factory ReplyInfoReply({\n    ReplyInfo? reply,\n  }) {\n    final result = create();\n    if (reply != null) result.reply = reply;\n    return result;\n  }\n\n  ReplyInfoReply._();\n\n  factory ReplyInfoReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReplyInfoReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReplyInfoReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOM<ReplyInfo>(1, _omitFieldNames ? '' : 'reply',\n        subBuilder: ReplyInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyInfoReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyInfoReply copyWith(void Function(ReplyInfoReply) updates) =>\n      super.copyWith((message) => updates(message as ReplyInfoReply))\n          as ReplyInfoReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReplyInfoReply create() => ReplyInfoReply._();\n  @$core.override\n  ReplyInfoReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReplyInfoReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReplyInfoReply>(create);\n  static ReplyInfoReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  ReplyInfo get reply => $_getN(0);\n  @$pb.TagNumber(1)\n  set reply(ReplyInfo value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasReply() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearReply() => $_clearField(1);\n  @$pb.TagNumber(1)\n  ReplyInfo ensureReply() => $_ensure(0);\n}\n\nclass ReplyInfoReq extends $pb.GeneratedMessage {\n  factory ReplyInfoReq({\n    $fixnum.Int64? rpid,\n    ReplyInfoReq_ReplyInfoScene? scene,\n  }) {\n    final result = create();\n    if (rpid != null) result.rpid = rpid;\n    if (scene != null) result.scene = scene;\n    return result;\n  }\n\n  ReplyInfoReq._();\n\n  factory ReplyInfoReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReplyInfoReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReplyInfoReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'rpid')\n    ..aE<ReplyInfoReq_ReplyInfoScene>(2, _omitFieldNames ? '' : 'scene',\n        enumValues: ReplyInfoReq_ReplyInfoScene.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyInfoReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyInfoReq copyWith(void Function(ReplyInfoReq) updates) =>\n      super.copyWith((message) => updates(message as ReplyInfoReq))\n          as ReplyInfoReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReplyInfoReq create() => ReplyInfoReq._();\n  @$core.override\n  ReplyInfoReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReplyInfoReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReplyInfoReq>(create);\n  static ReplyInfoReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get rpid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set rpid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasRpid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRpid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  ReplyInfoReq_ReplyInfoScene get scene => $_getN(1);\n  @$pb.TagNumber(2)\n  set scene(ReplyInfoReq_ReplyInfoScene value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasScene() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearScene() => $_clearField(2);\n}\n\nclass ReplyTrackInfo extends $pb.GeneratedMessage {\n  factory ReplyTrackInfo({\n    $core.String? trackId,\n  }) {\n    final result = create();\n    if (trackId != null) result.trackId = trackId;\n    return result;\n  }\n\n  ReplyTrackInfo._();\n\n  factory ReplyTrackInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ReplyTrackInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ReplyTrackInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'trackId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyTrackInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ReplyTrackInfo copyWith(void Function(ReplyTrackInfo) updates) =>\n      super.copyWith((message) => updates(message as ReplyTrackInfo))\n          as ReplyTrackInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ReplyTrackInfo create() => ReplyTrackInfo._();\n  @$core.override\n  ReplyTrackInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ReplyTrackInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ReplyTrackInfo>(create);\n  static ReplyTrackInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get trackId => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set trackId($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTrackId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTrackId() => $_clearField(1);\n}\n\nenum RichText_Item { note, opus, notSet }\n\nclass RichText extends $pb.GeneratedMessage {\n  factory RichText({\n    RichTextNote? note,\n    $6.OpusItem? opus,\n  }) {\n    final result = create();\n    if (note != null) result.note = note;\n    if (opus != null) result.opus = opus;\n    return result;\n  }\n\n  RichText._();\n\n  factory RichText.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RichText.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, RichText_Item> _RichText_ItemByTag = {\n    1: RichText_Item.note,\n    2: RichText_Item.opus,\n    0: RichText_Item.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RichText',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [1, 2])\n    ..aOM<RichTextNote>(1, _omitFieldNames ? '' : 'note',\n        subBuilder: RichTextNote.create)\n    ..aOM<$6.OpusItem>(2, _omitFieldNames ? '' : 'opus',\n        subBuilder: $6.OpusItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RichText clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RichText copyWith(void Function(RichText) updates) =>\n      super.copyWith((message) => updates(message as RichText)) as RichText;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RichText create() => RichText._();\n  @$core.override\n  RichText createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RichText getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<RichText>(create);\n  static RichText? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  @$pb.TagNumber(2)\n  RichText_Item whichItem() => _RichText_ItemByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(1)\n  @$pb.TagNumber(2)\n  void clearItem() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  RichTextNote get note => $_getN(0);\n  @$pb.TagNumber(1)\n  set note(RichTextNote value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasNote() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearNote() => $_clearField(1);\n  @$pb.TagNumber(1)\n  RichTextNote ensureNote() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $6.OpusItem get opus => $_getN(1);\n  @$pb.TagNumber(2)\n  set opus($6.OpusItem value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOpus() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOpus() => $_clearField(2);\n  @$pb.TagNumber(2)\n  $6.OpusItem ensureOpus() => $_ensure(1);\n}\n\nclass RichTextNote extends $pb.GeneratedMessage {\n  factory RichTextNote({\n    $core.String? summary,\n    $core.Iterable<$core.String>? images,\n    $core.String? clickUrl,\n    $core.String? lastMtimeText,\n  }) {\n    final result = create();\n    if (summary != null) result.summary = summary;\n    if (images != null) result.images.addAll(images);\n    if (clickUrl != null) result.clickUrl = clickUrl;\n    if (lastMtimeText != null) result.lastMtimeText = lastMtimeText;\n    return result;\n  }\n\n  RichTextNote._();\n\n  factory RichTextNote.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory RichTextNote.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'RichTextNote',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'summary')\n    ..pPS(2, _omitFieldNames ? '' : 'images')\n    ..aOS(3, _omitFieldNames ? '' : 'clickUrl')\n    ..aOS(4, _omitFieldNames ? '' : 'lastMtimeText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RichTextNote clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  RichTextNote copyWith(void Function(RichTextNote) updates) =>\n      super.copyWith((message) => updates(message as RichTextNote))\n          as RichTextNote;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static RichTextNote create() => RichTextNote._();\n  @$core.override\n  RichTextNote createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static RichTextNote getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<RichTextNote>(create);\n  static RichTextNote? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get summary => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set summary($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSummary() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSummary() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<$core.String> get images => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $core.String get clickUrl => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set clickUrl($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasClickUrl() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearClickUrl() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get lastMtimeText => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set lastMtimeText($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLastMtimeText() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLastMtimeText() => $_clearField(4);\n}\n\nenum SearchItem_Item { goods, video, article, notSet }\n\nclass SearchItem extends $pb.GeneratedMessage {\n  factory SearchItem({\n    $core.String? url,\n    GoodsSearchItem? goods,\n    VideoSearchItem? video,\n    ArticleSearchItem? article,\n  }) {\n    final result = create();\n    if (url != null) result.url = url;\n    if (goods != null) result.goods = goods;\n    if (video != null) result.video = video;\n    if (article != null) result.article = article;\n    return result;\n  }\n\n  SearchItem._();\n\n  factory SearchItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SearchItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, SearchItem_Item> _SearchItem_ItemByTag = {\n    2: SearchItem_Item.goods,\n    3: SearchItem_Item.video,\n    4: SearchItem_Item.article,\n    0: SearchItem_Item.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SearchItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [2, 3, 4])\n    ..aOS(1, _omitFieldNames ? '' : 'url')\n    ..aOM<GoodsSearchItem>(2, _omitFieldNames ? '' : 'goods',\n        subBuilder: GoodsSearchItem.create)\n    ..aOM<VideoSearchItem>(3, _omitFieldNames ? '' : 'video',\n        subBuilder: VideoSearchItem.create)\n    ..aOM<ArticleSearchItem>(4, _omitFieldNames ? '' : 'article',\n        subBuilder: ArticleSearchItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchItem copyWith(void Function(SearchItem) updates) =>\n      super.copyWith((message) => updates(message as SearchItem)) as SearchItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SearchItem create() => SearchItem._();\n  @$core.override\n  SearchItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SearchItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SearchItem>(create);\n  static SearchItem? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  SearchItem_Item whichItem() => _SearchItem_ItemByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  void clearItem() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  $core.String get url => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set url($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUrl() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  GoodsSearchItem get goods => $_getN(1);\n  @$pb.TagNumber(2)\n  set goods(GoodsSearchItem value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasGoods() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearGoods() => $_clearField(2);\n  @$pb.TagNumber(2)\n  GoodsSearchItem ensureGoods() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  VideoSearchItem get video => $_getN(2);\n  @$pb.TagNumber(3)\n  set video(VideoSearchItem value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasVideo() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearVideo() => $_clearField(3);\n  @$pb.TagNumber(3)\n  VideoSearchItem ensureVideo() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  ArticleSearchItem get article => $_getN(3);\n  @$pb.TagNumber(4)\n  set article(ArticleSearchItem value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasArticle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearArticle() => $_clearField(4);\n  @$pb.TagNumber(4)\n  ArticleSearchItem ensureArticle() => $_ensure(3);\n}\n\nclass SearchItemCursorReply extends $pb.GeneratedMessage {\n  factory SearchItemCursorReply({\n    $core.bool? hasNext,\n    $fixnum.Int64? next_2,\n  }) {\n    final result = create();\n    if (hasNext != null) result.hasNext = hasNext;\n    if (next_2 != null) result.next_2 = next_2;\n    return result;\n  }\n\n  SearchItemCursorReply._();\n\n  factory SearchItemCursorReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SearchItemCursorReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SearchItemCursorReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'hasNext')\n    ..aInt64(2, _omitFieldNames ? '' : 'next')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchItemCursorReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchItemCursorReply copyWith(\n          void Function(SearchItemCursorReply) updates) =>\n      super.copyWith((message) => updates(message as SearchItemCursorReply))\n          as SearchItemCursorReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SearchItemCursorReply create() => SearchItemCursorReply._();\n  @$core.override\n  SearchItemCursorReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SearchItemCursorReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SearchItemCursorReply>(create);\n  static SearchItemCursorReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get hasNext => $_getBF(0);\n  @$pb.TagNumber(1)\n  set hasNext($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasHasNext() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearHasNext() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get next_2 => $_getI64(1);\n  @$pb.TagNumber(2)\n  set next_2($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasNext_2() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearNext_2() => $_clearField(2);\n}\n\nclass SearchItemCursorReq extends $pb.GeneratedMessage {\n  factory SearchItemCursorReq({\n    $fixnum.Int64? next,\n    SearchItemType? itemType,\n  }) {\n    final result = create();\n    if (next != null) result.next = next;\n    if (itemType != null) result.itemType = itemType;\n    return result;\n  }\n\n  SearchItemCursorReq._();\n\n  factory SearchItemCursorReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SearchItemCursorReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SearchItemCursorReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'next')\n    ..aE<SearchItemType>(2, _omitFieldNames ? '' : 'itemType',\n        enumValues: SearchItemType.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchItemCursorReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchItemCursorReq copyWith(void Function(SearchItemCursorReq) updates) =>\n      super.copyWith((message) => updates(message as SearchItemCursorReq))\n          as SearchItemCursorReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SearchItemCursorReq create() => SearchItemCursorReq._();\n  @$core.override\n  SearchItemCursorReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SearchItemCursorReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SearchItemCursorReq>(create);\n  static SearchItemCursorReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get next => $_getI64(0);\n  @$pb.TagNumber(1)\n  set next($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasNext() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearNext() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  SearchItemType get itemType => $_getN(1);\n  @$pb.TagNumber(2)\n  set itemType(SearchItemType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasItemType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearItemType() => $_clearField(2);\n}\n\nclass SearchItemPreHookReply extends $pb.GeneratedMessage {\n  factory SearchItemPreHookReply({\n    $core.String? placeholderText,\n    $core.String? backgroundText,\n    $core.Iterable<$core.int>? orderedType,\n  }) {\n    final result = create();\n    if (placeholderText != null) result.placeholderText = placeholderText;\n    if (backgroundText != null) result.backgroundText = backgroundText;\n    if (orderedType != null) result.orderedType.addAll(orderedType);\n    return result;\n  }\n\n  SearchItemPreHookReply._();\n\n  factory SearchItemPreHookReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SearchItemPreHookReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SearchItemPreHookReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'placeholderText')\n    ..aOS(2, _omitFieldNames ? '' : 'backgroundText')\n    ..p<$core.int>(3, _omitFieldNames ? '' : 'orderedType', $pb.PbFieldType.K3)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchItemPreHookReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchItemPreHookReply copyWith(\n          void Function(SearchItemPreHookReply) updates) =>\n      super.copyWith((message) => updates(message as SearchItemPreHookReply))\n          as SearchItemPreHookReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SearchItemPreHookReply create() => SearchItemPreHookReply._();\n  @$core.override\n  SearchItemPreHookReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SearchItemPreHookReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SearchItemPreHookReply>(create);\n  static SearchItemPreHookReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get placeholderText => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set placeholderText($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPlaceholderText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPlaceholderText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get backgroundText => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set backgroundText($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBackgroundText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBackgroundText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<$core.int> get orderedType => $_getList(2);\n}\n\nclass SearchItemPreHookReq extends $pb.GeneratedMessage {\n  factory SearchItemPreHookReq({\n    $fixnum.Int64? oid,\n    $fixnum.Int64? type,\n  }) {\n    final result = create();\n    if (oid != null) result.oid = oid;\n    if (type != null) result.type = type;\n    return result;\n  }\n\n  SearchItemPreHookReq._();\n\n  factory SearchItemPreHookReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SearchItemPreHookReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SearchItemPreHookReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'oid')\n    ..aInt64(2, _omitFieldNames ? '' : 'type')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchItemPreHookReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchItemPreHookReq copyWith(void Function(SearchItemPreHookReq) updates) =>\n      super.copyWith((message) => updates(message as SearchItemPreHookReq))\n          as SearchItemPreHookReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SearchItemPreHookReq create() => SearchItemPreHookReq._();\n  @$core.override\n  SearchItemPreHookReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SearchItemPreHookReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SearchItemPreHookReq>(create);\n  static SearchItemPreHookReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get oid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set oid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get type => $_getI64(1);\n  @$pb.TagNumber(2)\n  set type($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearType() => $_clearField(2);\n}\n\nclass SearchItemReply extends $pb.GeneratedMessage {\n  factory SearchItemReply({\n    SearchItemCursorReply? cursor,\n    $core.Iterable<SearchItem>? items,\n    SearchItemReplyExtraInfo? extra,\n  }) {\n    final result = create();\n    if (cursor != null) result.cursor = cursor;\n    if (items != null) result.items.addAll(items);\n    if (extra != null) result.extra = extra;\n    return result;\n  }\n\n  SearchItemReply._();\n\n  factory SearchItemReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SearchItemReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SearchItemReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOM<SearchItemCursorReply>(1, _omitFieldNames ? '' : 'cursor',\n        subBuilder: SearchItemCursorReply.create)\n    ..pPM<SearchItem>(2, _omitFieldNames ? '' : 'items',\n        subBuilder: SearchItem.create)\n    ..aOM<SearchItemReplyExtraInfo>(3, _omitFieldNames ? '' : 'extra',\n        subBuilder: SearchItemReplyExtraInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchItemReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchItemReply copyWith(void Function(SearchItemReply) updates) =>\n      super.copyWith((message) => updates(message as SearchItemReply))\n          as SearchItemReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SearchItemReply create() => SearchItemReply._();\n  @$core.override\n  SearchItemReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SearchItemReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SearchItemReply>(create);\n  static SearchItemReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  SearchItemCursorReply get cursor => $_getN(0);\n  @$pb.TagNumber(1)\n  set cursor(SearchItemCursorReply value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCursor() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCursor() => $_clearField(1);\n  @$pb.TagNumber(1)\n  SearchItemCursorReply ensureCursor() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<SearchItem> get items => $_getList(1);\n\n  @$pb.TagNumber(3)\n  SearchItemReplyExtraInfo get extra => $_getN(2);\n  @$pb.TagNumber(3)\n  set extra(SearchItemReplyExtraInfo value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasExtra() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearExtra() => $_clearField(3);\n  @$pb.TagNumber(3)\n  SearchItemReplyExtraInfo ensureExtra() => $_ensure(2);\n}\n\nclass SearchItemReplyExtraInfo extends $pb.GeneratedMessage {\n  factory SearchItemReplyExtraInfo({\n    $core.String? eventId,\n  }) {\n    final result = create();\n    if (eventId != null) result.eventId = eventId;\n    return result;\n  }\n\n  SearchItemReplyExtraInfo._();\n\n  factory SearchItemReplyExtraInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SearchItemReplyExtraInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SearchItemReplyExtraInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'eventId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchItemReplyExtraInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchItemReplyExtraInfo copyWith(\n          void Function(SearchItemReplyExtraInfo) updates) =>\n      super.copyWith((message) => updates(message as SearchItemReplyExtraInfo))\n          as SearchItemReplyExtraInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SearchItemReplyExtraInfo create() => SearchItemReplyExtraInfo._();\n  @$core.override\n  SearchItemReplyExtraInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SearchItemReplyExtraInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SearchItemReplyExtraInfo>(create);\n  static SearchItemReplyExtraInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get eventId => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set eventId($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasEventId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearEventId() => $_clearField(1);\n}\n\nclass SearchItemReq extends $pb.GeneratedMessage {\n  factory SearchItemReq({\n    SearchItemCursorReq? cursor,\n    $fixnum.Int64? oid,\n    $fixnum.Int64? type,\n    $core.String? keyword,\n  }) {\n    final result = create();\n    if (cursor != null) result.cursor = cursor;\n    if (oid != null) result.oid = oid;\n    if (type != null) result.type = type;\n    if (keyword != null) result.keyword = keyword;\n    return result;\n  }\n\n  SearchItemReq._();\n\n  factory SearchItemReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SearchItemReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SearchItemReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOM<SearchItemCursorReq>(1, _omitFieldNames ? '' : 'cursor',\n        subBuilder: SearchItemCursorReq.create)\n    ..aInt64(2, _omitFieldNames ? '' : 'oid')\n    ..aInt64(3, _omitFieldNames ? '' : 'type')\n    ..aOS(4, _omitFieldNames ? '' : 'keyword')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchItemReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SearchItemReq copyWith(void Function(SearchItemReq) updates) =>\n      super.copyWith((message) => updates(message as SearchItemReq))\n          as SearchItemReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SearchItemReq create() => SearchItemReq._();\n  @$core.override\n  SearchItemReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SearchItemReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SearchItemReq>(create);\n  static SearchItemReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  SearchItemCursorReq get cursor => $_getN(0);\n  @$pb.TagNumber(1)\n  set cursor(SearchItemCursorReq value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCursor() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCursor() => $_clearField(1);\n  @$pb.TagNumber(1)\n  SearchItemCursorReq ensureCursor() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get oid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set oid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get type => $_getI64(2);\n  @$pb.TagNumber(3)\n  set type($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get keyword => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set keyword($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasKeyword() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearKeyword() => $_clearField(4);\n}\n\nclass ShareRepliesInfoReq extends $pb.GeneratedMessage {\n  factory ShareRepliesInfoReq({\n    $core.Iterable<$fixnum.Int64>? rpids,\n    $fixnum.Int64? oid,\n    $fixnum.Int64? type,\n  }) {\n    final result = create();\n    if (rpids != null) result.rpids.addAll(rpids);\n    if (oid != null) result.oid = oid;\n    if (type != null) result.type = type;\n    return result;\n  }\n\n  ShareRepliesInfoReq._();\n\n  factory ShareRepliesInfoReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ShareRepliesInfoReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ShareRepliesInfoReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..p<$fixnum.Int64>(1, _omitFieldNames ? '' : 'rpids', $pb.PbFieldType.K6)\n    ..aInt64(2, _omitFieldNames ? '' : 'oid')\n    ..aInt64(3, _omitFieldNames ? '' : 'type')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareRepliesInfoReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareRepliesInfoReq copyWith(void Function(ShareRepliesInfoReq) updates) =>\n      super.copyWith((message) => updates(message as ShareRepliesInfoReq))\n          as ShareRepliesInfoReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ShareRepliesInfoReq create() => ShareRepliesInfoReq._();\n  @$core.override\n  ShareRepliesInfoReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ShareRepliesInfoReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ShareRepliesInfoReq>(create);\n  static ShareRepliesInfoReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<$fixnum.Int64> get rpids => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get oid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set oid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get type => $_getI64(2);\n  @$pb.TagNumber(3)\n  set type($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearType() => $_clearField(3);\n}\n\nclass ShareRepliesInfoResp_ShareExtra extends $pb.GeneratedMessage {\n  factory ShareRepliesInfoResp_ShareExtra({\n    $core.bool? isPgc,\n  }) {\n    final result = create();\n    if (isPgc != null) result.isPgc = isPgc;\n    return result;\n  }\n\n  ShareRepliesInfoResp_ShareExtra._();\n\n  factory ShareRepliesInfoResp_ShareExtra.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ShareRepliesInfoResp_ShareExtra.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ShareRepliesInfoResp.ShareExtra',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'isPgc')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareRepliesInfoResp_ShareExtra clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareRepliesInfoResp_ShareExtra copyWith(\n          void Function(ShareRepliesInfoResp_ShareExtra) updates) =>\n      super.copyWith(\n              (message) => updates(message as ShareRepliesInfoResp_ShareExtra))\n          as ShareRepliesInfoResp_ShareExtra;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ShareRepliesInfoResp_ShareExtra create() =>\n      ShareRepliesInfoResp_ShareExtra._();\n  @$core.override\n  ShareRepliesInfoResp_ShareExtra createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ShareRepliesInfoResp_ShareExtra getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ShareRepliesInfoResp_ShareExtra>(\n          create);\n  static ShareRepliesInfoResp_ShareExtra? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get isPgc => $_getBF(0);\n  @$pb.TagNumber(1)\n  set isPgc($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIsPgc() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIsPgc() => $_clearField(1);\n}\n\nclass ShareRepliesInfoResp extends $pb.GeneratedMessage {\n  factory ShareRepliesInfoResp({\n    $core.Iterable<ShareReplyInfo>? infos,\n    $core.String? fromTitle,\n    $core.String? fromUp,\n    $core.String? fromPic,\n    $core.String? url,\n    $core.String? sloganPic,\n    $core.String? sloganText,\n    ShareReplyTopic? topic,\n    ShareRepliesInfoResp_ShareExtra? extra,\n  }) {\n    final result = create();\n    if (infos != null) result.infos.addAll(infos);\n    if (fromTitle != null) result.fromTitle = fromTitle;\n    if (fromUp != null) result.fromUp = fromUp;\n    if (fromPic != null) result.fromPic = fromPic;\n    if (url != null) result.url = url;\n    if (sloganPic != null) result.sloganPic = sloganPic;\n    if (sloganText != null) result.sloganText = sloganText;\n    if (topic != null) result.topic = topic;\n    if (extra != null) result.extra = extra;\n    return result;\n  }\n\n  ShareRepliesInfoResp._();\n\n  factory ShareRepliesInfoResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ShareRepliesInfoResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ShareRepliesInfoResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..pPM<ShareReplyInfo>(1, _omitFieldNames ? '' : 'infos',\n        subBuilder: ShareReplyInfo.create)\n    ..aOS(2, _omitFieldNames ? '' : 'fromTitle')\n    ..aOS(3, _omitFieldNames ? '' : 'fromUp')\n    ..aOS(4, _omitFieldNames ? '' : 'fromPic')\n    ..aOS(5, _omitFieldNames ? '' : 'url')\n    ..aOS(6, _omitFieldNames ? '' : 'sloganPic')\n    ..aOS(7, _omitFieldNames ? '' : 'sloganText')\n    ..aOM<ShareReplyTopic>(8, _omitFieldNames ? '' : 'topic',\n        subBuilder: ShareReplyTopic.create)\n    ..aOM<ShareRepliesInfoResp_ShareExtra>(9, _omitFieldNames ? '' : 'extra',\n        subBuilder: ShareRepliesInfoResp_ShareExtra.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareRepliesInfoResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareRepliesInfoResp copyWith(void Function(ShareRepliesInfoResp) updates) =>\n      super.copyWith((message) => updates(message as ShareRepliesInfoResp))\n          as ShareRepliesInfoResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ShareRepliesInfoResp create() => ShareRepliesInfoResp._();\n  @$core.override\n  ShareRepliesInfoResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ShareRepliesInfoResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ShareRepliesInfoResp>(create);\n  static ShareRepliesInfoResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<ShareReplyInfo> get infos => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.String get fromTitle => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set fromTitle($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFromTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFromTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get fromUp => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set fromUp($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFromUp() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFromUp() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get fromPic => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set fromPic($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFromPic() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFromPic() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get url => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set url($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasUrl() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearUrl() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get sloganPic => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set sloganPic($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasSloganPic() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearSloganPic() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get sloganText => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set sloganText($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasSloganText() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearSloganText() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  ShareReplyTopic get topic => $_getN(7);\n  @$pb.TagNumber(8)\n  set topic(ShareReplyTopic value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasTopic() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearTopic() => $_clearField(8);\n  @$pb.TagNumber(8)\n  ShareReplyTopic ensureTopic() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  ShareRepliesInfoResp_ShareExtra get extra => $_getN(8);\n  @$pb.TagNumber(9)\n  set extra(ShareRepliesInfoResp_ShareExtra value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasExtra() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearExtra() => $_clearField(9);\n  @$pb.TagNumber(9)\n  ShareRepliesInfoResp_ShareExtra ensureExtra() => $_ensure(8);\n}\n\nclass ShareReplyInfo extends $pb.GeneratedMessage {\n  factory ShareReplyInfo({\n    Member? member,\n    Content? content,\n    $core.String? title,\n    $core.String? subTitle,\n    $core.String? achievementText,\n    $core.String? labelUrl,\n  }) {\n    final result = create();\n    if (member != null) result.member = member;\n    if (content != null) result.content = content;\n    if (title != null) result.title = title;\n    if (subTitle != null) result.subTitle = subTitle;\n    if (achievementText != null) result.achievementText = achievementText;\n    if (labelUrl != null) result.labelUrl = labelUrl;\n    return result;\n  }\n\n  ShareReplyInfo._();\n\n  factory ShareReplyInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ShareReplyInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ShareReplyInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOM<Member>(1, _omitFieldNames ? '' : 'member', subBuilder: Member.create)\n    ..aOM<Content>(2, _omitFieldNames ? '' : 'content',\n        subBuilder: Content.create)\n    ..aOS(3, _omitFieldNames ? '' : 'title')\n    ..aOS(4, _omitFieldNames ? '' : 'subTitle')\n    ..aOS(5, _omitFieldNames ? '' : 'achievementText')\n    ..aOS(6, _omitFieldNames ? '' : 'labelUrl')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareReplyInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareReplyInfo copyWith(void Function(ShareReplyInfo) updates) =>\n      super.copyWith((message) => updates(message as ShareReplyInfo))\n          as ShareReplyInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ShareReplyInfo create() => ShareReplyInfo._();\n  @$core.override\n  ShareReplyInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ShareReplyInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ShareReplyInfo>(create);\n  static ShareReplyInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Member get member => $_getN(0);\n  @$pb.TagNumber(1)\n  set member(Member value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMember() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMember() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Member ensureMember() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  Content get content => $_getN(1);\n  @$pb.TagNumber(2)\n  set content(Content value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasContent() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearContent() => $_clearField(2);\n  @$pb.TagNumber(2)\n  Content ensureContent() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.String get title => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set title($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get subTitle => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set subTitle($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSubTitle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSubTitle() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get achievementText => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set achievementText($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasAchievementText() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearAchievementText() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get labelUrl => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set labelUrl($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasLabelUrl() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearLabelUrl() => $_clearField(6);\n}\n\nclass ShareReplyMaterialReq extends $pb.GeneratedMessage {\n  factory ShareReplyMaterialReq({\n    $fixnum.Int64? oid,\n    $fixnum.Int64? type,\n    $fixnum.Int64? rpid,\n  }) {\n    final result = create();\n    if (oid != null) result.oid = oid;\n    if (type != null) result.type = type;\n    if (rpid != null) result.rpid = rpid;\n    return result;\n  }\n\n  ShareReplyMaterialReq._();\n\n  factory ShareReplyMaterialReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ShareReplyMaterialReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ShareReplyMaterialReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'oid')\n    ..aInt64(2, _omitFieldNames ? '' : 'type')\n    ..aInt64(3, _omitFieldNames ? '' : 'rpid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareReplyMaterialReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareReplyMaterialReq copyWith(\n          void Function(ShareReplyMaterialReq) updates) =>\n      super.copyWith((message) => updates(message as ShareReplyMaterialReq))\n          as ShareReplyMaterialReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ShareReplyMaterialReq create() => ShareReplyMaterialReq._();\n  @$core.override\n  ShareReplyMaterialReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ShareReplyMaterialReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ShareReplyMaterialReq>(create);\n  static ShareReplyMaterialReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get oid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set oid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get type => $_getI64(1);\n  @$pb.TagNumber(2)\n  set type($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get rpid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set rpid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRpid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRpid() => $_clearField(3);\n}\n\nclass ShareReplyMaterialResp_ArchiveMaterial extends $pb.GeneratedMessage {\n  factory ShareReplyMaterialResp_ArchiveMaterial({\n    $core.String? title,\n    $core.String? cover,\n    $core.String? upName,\n    $core.String? upIcon,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (upName != null) result.upName = upName;\n    if (upIcon != null) result.upIcon = upIcon;\n    return result;\n  }\n\n  ShareReplyMaterialResp_ArchiveMaterial._();\n\n  factory ShareReplyMaterialResp_ArchiveMaterial.fromBuffer(\n          $core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ShareReplyMaterialResp_ArchiveMaterial.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ShareReplyMaterialResp.ArchiveMaterial',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'cover')\n    ..aOS(3, _omitFieldNames ? '' : 'upName')\n    ..aOS(4, _omitFieldNames ? '' : 'upIcon')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareReplyMaterialResp_ArchiveMaterial clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareReplyMaterialResp_ArchiveMaterial copyWith(\n          void Function(ShareReplyMaterialResp_ArchiveMaterial) updates) =>\n      super.copyWith((message) =>\n              updates(message as ShareReplyMaterialResp_ArchiveMaterial))\n          as ShareReplyMaterialResp_ArchiveMaterial;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ShareReplyMaterialResp_ArchiveMaterial create() =>\n      ShareReplyMaterialResp_ArchiveMaterial._();\n  @$core.override\n  ShareReplyMaterialResp_ArchiveMaterial createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ShareReplyMaterialResp_ArchiveMaterial getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<\n          ShareReplyMaterialResp_ArchiveMaterial>(create);\n  static ShareReplyMaterialResp_ArchiveMaterial? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get cover => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set cover($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCover() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCover() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get upName => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set upName($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasUpName() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearUpName() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get upIcon => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set upIcon($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUpIcon() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUpIcon() => $_clearField(4);\n}\n\nclass ShareReplyMaterialResp_ArticleMaterial extends $pb.GeneratedMessage {\n  factory ShareReplyMaterialResp_ArticleMaterial({\n    $core.String? title,\n    $core.String? message,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (message != null) result.message = message;\n    return result;\n  }\n\n  ShareReplyMaterialResp_ArticleMaterial._();\n\n  factory ShareReplyMaterialResp_ArticleMaterial.fromBuffer(\n          $core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ShareReplyMaterialResp_ArticleMaterial.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ShareReplyMaterialResp.ArticleMaterial',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'message')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareReplyMaterialResp_ArticleMaterial clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareReplyMaterialResp_ArticleMaterial copyWith(\n          void Function(ShareReplyMaterialResp_ArticleMaterial) updates) =>\n      super.copyWith((message) =>\n              updates(message as ShareReplyMaterialResp_ArticleMaterial))\n          as ShareReplyMaterialResp_ArticleMaterial;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ShareReplyMaterialResp_ArticleMaterial create() =>\n      ShareReplyMaterialResp_ArticleMaterial._();\n  @$core.override\n  ShareReplyMaterialResp_ArticleMaterial createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ShareReplyMaterialResp_ArticleMaterial getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<\n          ShareReplyMaterialResp_ArticleMaterial>(create);\n  static ShareReplyMaterialResp_ArticleMaterial? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get message => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set message($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMessage() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMessage() => $_clearField(2);\n}\n\nclass ShareReplyMaterialResp_DynamicMaterial extends $pb.GeneratedMessage {\n  factory ShareReplyMaterialResp_DynamicMaterial({\n    $core.String? title,\n    $core.String? message,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (message != null) result.message = message;\n    return result;\n  }\n\n  ShareReplyMaterialResp_DynamicMaterial._();\n\n  factory ShareReplyMaterialResp_DynamicMaterial.fromBuffer(\n          $core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ShareReplyMaterialResp_DynamicMaterial.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ShareReplyMaterialResp.DynamicMaterial',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'message')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareReplyMaterialResp_DynamicMaterial clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareReplyMaterialResp_DynamicMaterial copyWith(\n          void Function(ShareReplyMaterialResp_DynamicMaterial) updates) =>\n      super.copyWith((message) =>\n              updates(message as ShareReplyMaterialResp_DynamicMaterial))\n          as ShareReplyMaterialResp_DynamicMaterial;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ShareReplyMaterialResp_DynamicMaterial create() =>\n      ShareReplyMaterialResp_DynamicMaterial._();\n  @$core.override\n  ShareReplyMaterialResp_DynamicMaterial createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ShareReplyMaterialResp_DynamicMaterial getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<\n          ShareReplyMaterialResp_DynamicMaterial>(create);\n  static ShareReplyMaterialResp_DynamicMaterial? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get message => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set message($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMessage() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMessage() => $_clearField(2);\n}\n\nclass ShareReplyMaterialResp_ExtraData extends $pb.GeneratedMessage {\n  factory ShareReplyMaterialResp_ExtraData({\n    $core.bool? isPgc,\n    $core.String? originText,\n    $fixnum.Int64? topicId,\n  }) {\n    final result = create();\n    if (isPgc != null) result.isPgc = isPgc;\n    if (originText != null) result.originText = originText;\n    if (topicId != null) result.topicId = topicId;\n    return result;\n  }\n\n  ShareReplyMaterialResp_ExtraData._();\n\n  factory ShareReplyMaterialResp_ExtraData.fromBuffer(\n          $core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ShareReplyMaterialResp_ExtraData.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ShareReplyMaterialResp.ExtraData',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'isPgc')\n    ..aOS(2, _omitFieldNames ? '' : 'originText')\n    ..aInt64(3, _omitFieldNames ? '' : 'topicId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareReplyMaterialResp_ExtraData clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareReplyMaterialResp_ExtraData copyWith(\n          void Function(ShareReplyMaterialResp_ExtraData) updates) =>\n      super.copyWith(\n              (message) => updates(message as ShareReplyMaterialResp_ExtraData))\n          as ShareReplyMaterialResp_ExtraData;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ShareReplyMaterialResp_ExtraData create() =>\n      ShareReplyMaterialResp_ExtraData._();\n  @$core.override\n  ShareReplyMaterialResp_ExtraData createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ShareReplyMaterialResp_ExtraData getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ShareReplyMaterialResp_ExtraData>(\n          create);\n  static ShareReplyMaterialResp_ExtraData? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get isPgc => $_getBF(0);\n  @$pb.TagNumber(1)\n  set isPgc($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIsPgc() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIsPgc() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get originText => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set originText($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOriginText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOriginText() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get topicId => $_getI64(2);\n  @$pb.TagNumber(3)\n  set topicId($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTopicId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTopicId() => $_clearField(3);\n}\n\nenum ShareReplyMaterialResp_SubjectMaterial_Item {\n  archiveMaterial,\n  dynamicMaterial,\n  articleMaterial,\n  notSet\n}\n\nclass ShareReplyMaterialResp_SubjectMaterial extends $pb.GeneratedMessage {\n  factory ShareReplyMaterialResp_SubjectMaterial({\n    ShareReplyMaterialResp_ArchiveMaterial? archiveMaterial,\n    ShareReplyMaterialResp_DynamicMaterial? dynamicMaterial,\n    ShareReplyMaterialResp_ArticleMaterial? articleMaterial,\n  }) {\n    final result = create();\n    if (archiveMaterial != null) result.archiveMaterial = archiveMaterial;\n    if (dynamicMaterial != null) result.dynamicMaterial = dynamicMaterial;\n    if (articleMaterial != null) result.articleMaterial = articleMaterial;\n    return result;\n  }\n\n  ShareReplyMaterialResp_SubjectMaterial._();\n\n  factory ShareReplyMaterialResp_SubjectMaterial.fromBuffer(\n          $core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ShareReplyMaterialResp_SubjectMaterial.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, ShareReplyMaterialResp_SubjectMaterial_Item>\n      _ShareReplyMaterialResp_SubjectMaterial_ItemByTag = {\n    1: ShareReplyMaterialResp_SubjectMaterial_Item.archiveMaterial,\n    2: ShareReplyMaterialResp_SubjectMaterial_Item.dynamicMaterial,\n    3: ShareReplyMaterialResp_SubjectMaterial_Item.articleMaterial,\n    0: ShareReplyMaterialResp_SubjectMaterial_Item.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ShareReplyMaterialResp.SubjectMaterial',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [1, 2, 3])\n    ..aOM<ShareReplyMaterialResp_ArchiveMaterial>(\n        1, _omitFieldNames ? '' : 'archiveMaterial',\n        subBuilder: ShareReplyMaterialResp_ArchiveMaterial.create)\n    ..aOM<ShareReplyMaterialResp_DynamicMaterial>(\n        2, _omitFieldNames ? '' : 'dynamicMaterial',\n        subBuilder: ShareReplyMaterialResp_DynamicMaterial.create)\n    ..aOM<ShareReplyMaterialResp_ArticleMaterial>(\n        3, _omitFieldNames ? '' : 'articleMaterial',\n        subBuilder: ShareReplyMaterialResp_ArticleMaterial.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareReplyMaterialResp_SubjectMaterial clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareReplyMaterialResp_SubjectMaterial copyWith(\n          void Function(ShareReplyMaterialResp_SubjectMaterial) updates) =>\n      super.copyWith((message) =>\n              updates(message as ShareReplyMaterialResp_SubjectMaterial))\n          as ShareReplyMaterialResp_SubjectMaterial;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ShareReplyMaterialResp_SubjectMaterial create() =>\n      ShareReplyMaterialResp_SubjectMaterial._();\n  @$core.override\n  ShareReplyMaterialResp_SubjectMaterial createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ShareReplyMaterialResp_SubjectMaterial getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<\n          ShareReplyMaterialResp_SubjectMaterial>(create);\n  static ShareReplyMaterialResp_SubjectMaterial? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  ShareReplyMaterialResp_SubjectMaterial_Item whichItem() =>\n      _ShareReplyMaterialResp_SubjectMaterial_ItemByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(1)\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  void clearItem() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  ShareReplyMaterialResp_ArchiveMaterial get archiveMaterial => $_getN(0);\n  @$pb.TagNumber(1)\n  set archiveMaterial(ShareReplyMaterialResp_ArchiveMaterial value) =>\n      $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasArchiveMaterial() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearArchiveMaterial() => $_clearField(1);\n  @$pb.TagNumber(1)\n  ShareReplyMaterialResp_ArchiveMaterial ensureArchiveMaterial() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  ShareReplyMaterialResp_DynamicMaterial get dynamicMaterial => $_getN(1);\n  @$pb.TagNumber(2)\n  set dynamicMaterial(ShareReplyMaterialResp_DynamicMaterial value) =>\n      $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDynamicMaterial() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDynamicMaterial() => $_clearField(2);\n  @$pb.TagNumber(2)\n  ShareReplyMaterialResp_DynamicMaterial ensureDynamicMaterial() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  ShareReplyMaterialResp_ArticleMaterial get articleMaterial => $_getN(2);\n  @$pb.TagNumber(3)\n  set articleMaterial(ShareReplyMaterialResp_ArticleMaterial value) =>\n      $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasArticleMaterial() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearArticleMaterial() => $_clearField(3);\n  @$pb.TagNumber(3)\n  ShareReplyMaterialResp_ArticleMaterial ensureArticleMaterial() => $_ensure(2);\n}\n\nclass ShareReplyMaterialResp extends $pb.GeneratedMessage {\n  factory ShareReplyMaterialResp({\n    ShareReplyMaterialResp_SubjectMaterial? subjectMaterial,\n    $core.String? qrcodeUrl,\n    $core.String? savePicText,\n    $core.String? openAppText,\n    $core.String? shareTimeText,\n    $core.String? biliLogoIcon,\n    ShareReplyMaterialResp_ExtraData? extra,\n  }) {\n    final result = create();\n    if (subjectMaterial != null) result.subjectMaterial = subjectMaterial;\n    if (qrcodeUrl != null) result.qrcodeUrl = qrcodeUrl;\n    if (savePicText != null) result.savePicText = savePicText;\n    if (openAppText != null) result.openAppText = openAppText;\n    if (shareTimeText != null) result.shareTimeText = shareTimeText;\n    if (biliLogoIcon != null) result.biliLogoIcon = biliLogoIcon;\n    if (extra != null) result.extra = extra;\n    return result;\n  }\n\n  ShareReplyMaterialResp._();\n\n  factory ShareReplyMaterialResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ShareReplyMaterialResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ShareReplyMaterialResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOM<ShareReplyMaterialResp_SubjectMaterial>(\n        1, _omitFieldNames ? '' : 'subjectMaterial',\n        subBuilder: ShareReplyMaterialResp_SubjectMaterial.create)\n    ..aOS(2, _omitFieldNames ? '' : 'qrcodeUrl')\n    ..aOS(3, _omitFieldNames ? '' : 'savePicText')\n    ..aOS(4, _omitFieldNames ? '' : 'openAppText')\n    ..aOS(5, _omitFieldNames ? '' : 'shareTimeText')\n    ..aOS(6, _omitFieldNames ? '' : 'biliLogoIcon')\n    ..aOM<ShareReplyMaterialResp_ExtraData>(7, _omitFieldNames ? '' : 'extra',\n        subBuilder: ShareReplyMaterialResp_ExtraData.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareReplyMaterialResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareReplyMaterialResp copyWith(\n          void Function(ShareReplyMaterialResp) updates) =>\n      super.copyWith((message) => updates(message as ShareReplyMaterialResp))\n          as ShareReplyMaterialResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ShareReplyMaterialResp create() => ShareReplyMaterialResp._();\n  @$core.override\n  ShareReplyMaterialResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ShareReplyMaterialResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ShareReplyMaterialResp>(create);\n  static ShareReplyMaterialResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  ShareReplyMaterialResp_SubjectMaterial get subjectMaterial => $_getN(0);\n  @$pb.TagNumber(1)\n  set subjectMaterial(ShareReplyMaterialResp_SubjectMaterial value) =>\n      $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSubjectMaterial() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSubjectMaterial() => $_clearField(1);\n  @$pb.TagNumber(1)\n  ShareReplyMaterialResp_SubjectMaterial ensureSubjectMaterial() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get qrcodeUrl => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set qrcodeUrl($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasQrcodeUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearQrcodeUrl() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get savePicText => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set savePicText($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSavePicText() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSavePicText() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get openAppText => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set openAppText($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasOpenAppText() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearOpenAppText() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get shareTimeText => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set shareTimeText($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasShareTimeText() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearShareTimeText() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get biliLogoIcon => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set biliLogoIcon($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasBiliLogoIcon() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearBiliLogoIcon() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  ShareReplyMaterialResp_ExtraData get extra => $_getN(6);\n  @$pb.TagNumber(7)\n  set extra(ShareReplyMaterialResp_ExtraData value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasExtra() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearExtra() => $_clearField(7);\n  @$pb.TagNumber(7)\n  ShareReplyMaterialResp_ExtraData ensureExtra() => $_ensure(6);\n}\n\nclass ShareReplyTopic extends $pb.GeneratedMessage {\n  factory ShareReplyTopic({\n    Topic? topic,\n    $core.String? originText,\n  }) {\n    final result = create();\n    if (topic != null) result.topic = topic;\n    if (originText != null) result.originText = originText;\n    return result;\n  }\n\n  ShareReplyTopic._();\n\n  factory ShareReplyTopic.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ShareReplyTopic.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ShareReplyTopic',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOM<Topic>(1, _omitFieldNames ? '' : 'topic', subBuilder: Topic.create)\n    ..aOS(2, _omitFieldNames ? '' : 'originText')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareReplyTopic clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ShareReplyTopic copyWith(void Function(ShareReplyTopic) updates) =>\n      super.copyWith((message) => updates(message as ShareReplyTopic))\n          as ShareReplyTopic;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ShareReplyTopic create() => ShareReplyTopic._();\n  @$core.override\n  ShareReplyTopic createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ShareReplyTopic getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ShareReplyTopic>(create);\n  static ShareReplyTopic? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Topic get topic => $_getN(0);\n  @$pb.TagNumber(1)\n  set topic(Topic value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTopic() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTopic() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Topic ensureTopic() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get originText => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set originText($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOriginText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOriginText() => $_clearField(2);\n}\n\nclass SubjectControl_CmTopReplyProtection extends $pb.GeneratedMessage {\n  factory SubjectControl_CmTopReplyProtection({\n    $fixnum.Int64? protectedTopRpid,\n    $core.String? popupMessage,\n    $core.String? appealUrl,\n  }) {\n    final result = create();\n    if (protectedTopRpid != null) result.protectedTopRpid = protectedTopRpid;\n    if (popupMessage != null) result.popupMessage = popupMessage;\n    if (appealUrl != null) result.appealUrl = appealUrl;\n    return result;\n  }\n\n  SubjectControl_CmTopReplyProtection._();\n\n  factory SubjectControl_CmTopReplyProtection.fromBuffer(\n          $core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SubjectControl_CmTopReplyProtection.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SubjectControl.CmTopReplyProtection',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'protectedTopRpid')\n    ..aOS(2, _omitFieldNames ? '' : 'popupMessage')\n    ..aOS(3, _omitFieldNames ? '' : 'appealUrl')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SubjectControl_CmTopReplyProtection clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SubjectControl_CmTopReplyProtection copyWith(\n          void Function(SubjectControl_CmTopReplyProtection) updates) =>\n      super.copyWith((message) =>\n              updates(message as SubjectControl_CmTopReplyProtection))\n          as SubjectControl_CmTopReplyProtection;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SubjectControl_CmTopReplyProtection create() =>\n      SubjectControl_CmTopReplyProtection._();\n  @$core.override\n  SubjectControl_CmTopReplyProtection createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SubjectControl_CmTopReplyProtection getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<\n          SubjectControl_CmTopReplyProtection>(create);\n  static SubjectControl_CmTopReplyProtection? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get protectedTopRpid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set protectedTopRpid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasProtectedTopRpid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearProtectedTopRpid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get popupMessage => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set popupMessage($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPopupMessage() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPopupMessage() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get appealUrl => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set appealUrl($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAppealUrl() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAppealUrl() => $_clearField(3);\n}\n\nclass SubjectControl_FilterTag extends $pb.GeneratedMessage {\n  factory SubjectControl_FilterTag({\n    $core.String? name,\n    $core.String? eventId,\n  }) {\n    final result = create();\n    if (name != null) result.name = name;\n    if (eventId != null) result.eventId = eventId;\n    return result;\n  }\n\n  SubjectControl_FilterTag._();\n\n  factory SubjectControl_FilterTag.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SubjectControl_FilterTag.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SubjectControl.FilterTag',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'name')\n    ..aOS(2, _omitFieldNames ? '' : 'eventId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SubjectControl_FilterTag clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SubjectControl_FilterTag copyWith(\n          void Function(SubjectControl_FilterTag) updates) =>\n      super.copyWith((message) => updates(message as SubjectControl_FilterTag))\n          as SubjectControl_FilterTag;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SubjectControl_FilterTag create() => SubjectControl_FilterTag._();\n  @$core.override\n  SubjectControl_FilterTag createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SubjectControl_FilterTag getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SubjectControl_FilterTag>(create);\n  static SubjectControl_FilterTag? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get name => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set name($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasName() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearName() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get eventId => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set eventId($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasEventId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearEventId() => $_clearField(2);\n}\n\nclass SubjectControl extends $pb.GeneratedMessage {\n  factory SubjectControl({\n    $fixnum.Int64? upMid,\n    $core.bool? isAssist,\n    $core.bool? readOnly,\n    $core.bool? hasVoteAccess,\n    $core.bool? hasLotteryAccess,\n    $core.bool? hasFoldedReply,\n    $core.String? bgText,\n    $core.bool? upBlocked,\n    $core.bool? hasActivityAccess,\n    $core.bool? showTitle,\n    $core.bool? showUpAction,\n    $fixnum.Int64? switcherType,\n    $core.bool? inputDisable,\n    $core.String? rootText,\n    $core.String? childText,\n    $fixnum.Int64? count,\n    $core.String? title,\n    $core.String? giveupText,\n    $core.bool? hasNoteAccess,\n    $core.bool? disableJumpEmote,\n    $core.String? emptyBackgroundTextPlain,\n    $core.String? emptyBackgroundTextHighlight,\n    $core.String? emptyBackgroundUri,\n    $core.Iterable<SubjectControl_FilterTag>? supportFilterTags,\n    EditorIconState? screenshotIconState,\n    EditorIconState? uploadPictureIconState,\n    EmptyPage? emptyPage,\n    SubjectControl_CmTopReplyProtection? cmTopReplyProtection,\n    $core.bool? enableCharged,\n  }) {\n    final result = create();\n    if (upMid != null) result.upMid = upMid;\n    if (isAssist != null) result.isAssist = isAssist;\n    if (readOnly != null) result.readOnly = readOnly;\n    if (hasVoteAccess != null) result.hasVoteAccess = hasVoteAccess;\n    if (hasLotteryAccess != null) result.hasLotteryAccess = hasLotteryAccess;\n    if (hasFoldedReply != null) result.hasFoldedReply = hasFoldedReply;\n    if (bgText != null) result.bgText = bgText;\n    if (upBlocked != null) result.upBlocked = upBlocked;\n    if (hasActivityAccess != null) result.hasActivityAccess = hasActivityAccess;\n    if (showTitle != null) result.showTitle = showTitle;\n    if (showUpAction != null) result.showUpAction = showUpAction;\n    if (switcherType != null) result.switcherType = switcherType;\n    if (inputDisable != null) result.inputDisable = inputDisable;\n    if (rootText != null) result.rootText = rootText;\n    if (childText != null) result.childText = childText;\n    if (count != null) result.count = count;\n    if (title != null) result.title = title;\n    if (giveupText != null) result.giveupText = giveupText;\n    if (hasNoteAccess != null) result.hasNoteAccess = hasNoteAccess;\n    if (disableJumpEmote != null) result.disableJumpEmote = disableJumpEmote;\n    if (emptyBackgroundTextPlain != null)\n      result.emptyBackgroundTextPlain = emptyBackgroundTextPlain;\n    if (emptyBackgroundTextHighlight != null)\n      result.emptyBackgroundTextHighlight = emptyBackgroundTextHighlight;\n    if (emptyBackgroundUri != null)\n      result.emptyBackgroundUri = emptyBackgroundUri;\n    if (supportFilterTags != null)\n      result.supportFilterTags.addAll(supportFilterTags);\n    if (screenshotIconState != null)\n      result.screenshotIconState = screenshotIconState;\n    if (uploadPictureIconState != null)\n      result.uploadPictureIconState = uploadPictureIconState;\n    if (emptyPage != null) result.emptyPage = emptyPage;\n    if (cmTopReplyProtection != null)\n      result.cmTopReplyProtection = cmTopReplyProtection;\n    if (enableCharged != null) result.enableCharged = enableCharged;\n    return result;\n  }\n\n  SubjectControl._();\n\n  factory SubjectControl.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SubjectControl.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SubjectControl',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'upMid')\n    ..aOB(2, _omitFieldNames ? '' : 'isAssist')\n    ..aOB(3, _omitFieldNames ? '' : 'readOnly')\n    ..aOB(4, _omitFieldNames ? '' : 'hasVoteAccess')\n    ..aOB(5, _omitFieldNames ? '' : 'hasLotteryAccess')\n    ..aOB(6, _omitFieldNames ? '' : 'hasFoldedReply')\n    ..aOS(7, _omitFieldNames ? '' : 'bgText')\n    ..aOB(8, _omitFieldNames ? '' : 'upBlocked')\n    ..aOB(9, _omitFieldNames ? '' : 'hasActivityAccess')\n    ..aOB(10, _omitFieldNames ? '' : 'showTitle')\n    ..aOB(11, _omitFieldNames ? '' : 'showUpAction')\n    ..aInt64(12, _omitFieldNames ? '' : 'switcherType')\n    ..aOB(13, _omitFieldNames ? '' : 'inputDisable')\n    ..aOS(14, _omitFieldNames ? '' : 'rootText')\n    ..aOS(15, _omitFieldNames ? '' : 'childText')\n    ..aInt64(16, _omitFieldNames ? '' : 'count')\n    ..aOS(17, _omitFieldNames ? '' : 'title')\n    ..aOS(18, _omitFieldNames ? '' : 'giveupText')\n    ..aOB(19, _omitFieldNames ? '' : 'hasNoteAccess')\n    ..aOB(20, _omitFieldNames ? '' : 'disableJumpEmote')\n    ..aOS(21, _omitFieldNames ? '' : 'emptyBackgroundTextPlain')\n    ..aOS(22, _omitFieldNames ? '' : 'emptyBackgroundTextHighlight')\n    ..aOS(23, _omitFieldNames ? '' : 'emptyBackgroundUri')\n    ..pPM<SubjectControl_FilterTag>(\n        24, _omitFieldNames ? '' : 'supportFilterTags',\n        subBuilder: SubjectControl_FilterTag.create)\n    ..aE<EditorIconState>(25, _omitFieldNames ? '' : 'screenshotIconState',\n        enumValues: EditorIconState.values)\n    ..aE<EditorIconState>(26, _omitFieldNames ? '' : 'uploadPictureIconState',\n        enumValues: EditorIconState.values)\n    ..aOM<EmptyPage>(27, _omitFieldNames ? '' : 'emptyPage',\n        subBuilder: EmptyPage.create)\n    ..aOM<SubjectControl_CmTopReplyProtection>(\n        28, _omitFieldNames ? '' : 'cmTopReplyProtection',\n        subBuilder: SubjectControl_CmTopReplyProtection.create)\n    ..aOB(29, _omitFieldNames ? '' : 'enableCharged')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SubjectControl clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SubjectControl copyWith(void Function(SubjectControl) updates) =>\n      super.copyWith((message) => updates(message as SubjectControl))\n          as SubjectControl;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SubjectControl create() => SubjectControl._();\n  @$core.override\n  SubjectControl createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SubjectControl getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SubjectControl>(create);\n  static SubjectControl? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get upMid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set upMid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUpMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUpMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get isAssist => $_getBF(1);\n  @$pb.TagNumber(2)\n  set isAssist($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIsAssist() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIsAssist() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get readOnly => $_getBF(2);\n  @$pb.TagNumber(3)\n  set readOnly($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasReadOnly() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearReadOnly() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get hasVoteAccess => $_getBF(3);\n  @$pb.TagNumber(4)\n  set hasVoteAccess($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasHasVoteAccess() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearHasVoteAccess() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.bool get hasLotteryAccess => $_getBF(4);\n  @$pb.TagNumber(5)\n  set hasLotteryAccess($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasHasLotteryAccess() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearHasLotteryAccess() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.bool get hasFoldedReply => $_getBF(5);\n  @$pb.TagNumber(6)\n  set hasFoldedReply($core.bool value) => $_setBool(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasHasFoldedReply() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearHasFoldedReply() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get bgText => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set bgText($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBgText() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBgText() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.bool get upBlocked => $_getBF(7);\n  @$pb.TagNumber(8)\n  set upBlocked($core.bool value) => $_setBool(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasUpBlocked() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearUpBlocked() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.bool get hasActivityAccess => $_getBF(8);\n  @$pb.TagNumber(9)\n  set hasActivityAccess($core.bool value) => $_setBool(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasHasActivityAccess() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearHasActivityAccess() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.bool get showTitle => $_getBF(9);\n  @$pb.TagNumber(10)\n  set showTitle($core.bool value) => $_setBool(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasShowTitle() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearShowTitle() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.bool get showUpAction => $_getBF(10);\n  @$pb.TagNumber(11)\n  set showUpAction($core.bool value) => $_setBool(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasShowUpAction() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearShowUpAction() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $fixnum.Int64 get switcherType => $_getI64(11);\n  @$pb.TagNumber(12)\n  set switcherType($fixnum.Int64 value) => $_setInt64(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasSwitcherType() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearSwitcherType() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.bool get inputDisable => $_getBF(12);\n  @$pb.TagNumber(13)\n  set inputDisable($core.bool value) => $_setBool(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasInputDisable() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearInputDisable() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.String get rootText => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set rootText($core.String value) => $_setString(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasRootText() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearRootText() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $core.String get childText => $_getSZ(14);\n  @$pb.TagNumber(15)\n  set childText($core.String value) => $_setString(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasChildText() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearChildText() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $fixnum.Int64 get count => $_getI64(15);\n  @$pb.TagNumber(16)\n  set count($fixnum.Int64 value) => $_setInt64(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasCount() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearCount() => $_clearField(16);\n\n  @$pb.TagNumber(17)\n  $core.String get title => $_getSZ(16);\n  @$pb.TagNumber(17)\n  set title($core.String value) => $_setString(16, value);\n  @$pb.TagNumber(17)\n  $core.bool hasTitle() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearTitle() => $_clearField(17);\n\n  @$pb.TagNumber(18)\n  $core.String get giveupText => $_getSZ(17);\n  @$pb.TagNumber(18)\n  set giveupText($core.String value) => $_setString(17, value);\n  @$pb.TagNumber(18)\n  $core.bool hasGiveupText() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearGiveupText() => $_clearField(18);\n\n  @$pb.TagNumber(19)\n  $core.bool get hasNoteAccess => $_getBF(18);\n  @$pb.TagNumber(19)\n  set hasNoteAccess($core.bool value) => $_setBool(18, value);\n  @$pb.TagNumber(19)\n  $core.bool hasHasNoteAccess() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearHasNoteAccess() => $_clearField(19);\n\n  @$pb.TagNumber(20)\n  $core.bool get disableJumpEmote => $_getBF(19);\n  @$pb.TagNumber(20)\n  set disableJumpEmote($core.bool value) => $_setBool(19, value);\n  @$pb.TagNumber(20)\n  $core.bool hasDisableJumpEmote() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearDisableJumpEmote() => $_clearField(20);\n\n  @$pb.TagNumber(21)\n  $core.String get emptyBackgroundTextPlain => $_getSZ(20);\n  @$pb.TagNumber(21)\n  set emptyBackgroundTextPlain($core.String value) => $_setString(20, value);\n  @$pb.TagNumber(21)\n  $core.bool hasEmptyBackgroundTextPlain() => $_has(20);\n  @$pb.TagNumber(21)\n  void clearEmptyBackgroundTextPlain() => $_clearField(21);\n\n  @$pb.TagNumber(22)\n  $core.String get emptyBackgroundTextHighlight => $_getSZ(21);\n  @$pb.TagNumber(22)\n  set emptyBackgroundTextHighlight($core.String value) =>\n      $_setString(21, value);\n  @$pb.TagNumber(22)\n  $core.bool hasEmptyBackgroundTextHighlight() => $_has(21);\n  @$pb.TagNumber(22)\n  void clearEmptyBackgroundTextHighlight() => $_clearField(22);\n\n  @$pb.TagNumber(23)\n  $core.String get emptyBackgroundUri => $_getSZ(22);\n  @$pb.TagNumber(23)\n  set emptyBackgroundUri($core.String value) => $_setString(22, value);\n  @$pb.TagNumber(23)\n  $core.bool hasEmptyBackgroundUri() => $_has(22);\n  @$pb.TagNumber(23)\n  void clearEmptyBackgroundUri() => $_clearField(23);\n\n  @$pb.TagNumber(24)\n  $pb.PbList<SubjectControl_FilterTag> get supportFilterTags => $_getList(23);\n\n  @$pb.TagNumber(25)\n  EditorIconState get screenshotIconState => $_getN(24);\n  @$pb.TagNumber(25)\n  set screenshotIconState(EditorIconState value) => $_setField(25, value);\n  @$pb.TagNumber(25)\n  $core.bool hasScreenshotIconState() => $_has(24);\n  @$pb.TagNumber(25)\n  void clearScreenshotIconState() => $_clearField(25);\n\n  @$pb.TagNumber(26)\n  EditorIconState get uploadPictureIconState => $_getN(25);\n  @$pb.TagNumber(26)\n  set uploadPictureIconState(EditorIconState value) => $_setField(26, value);\n  @$pb.TagNumber(26)\n  $core.bool hasUploadPictureIconState() => $_has(25);\n  @$pb.TagNumber(26)\n  void clearUploadPictureIconState() => $_clearField(26);\n\n  @$pb.TagNumber(27)\n  EmptyPage get emptyPage => $_getN(26);\n  @$pb.TagNumber(27)\n  set emptyPage(EmptyPage value) => $_setField(27, value);\n  @$pb.TagNumber(27)\n  $core.bool hasEmptyPage() => $_has(26);\n  @$pb.TagNumber(27)\n  void clearEmptyPage() => $_clearField(27);\n  @$pb.TagNumber(27)\n  EmptyPage ensureEmptyPage() => $_ensure(26);\n\n  @$pb.TagNumber(28)\n  SubjectControl_CmTopReplyProtection get cmTopReplyProtection => $_getN(27);\n  @$pb.TagNumber(28)\n  set cmTopReplyProtection(SubjectControl_CmTopReplyProtection value) =>\n      $_setField(28, value);\n  @$pb.TagNumber(28)\n  $core.bool hasCmTopReplyProtection() => $_has(27);\n  @$pb.TagNumber(28)\n  void clearCmTopReplyProtection() => $_clearField(28);\n  @$pb.TagNumber(28)\n  SubjectControl_CmTopReplyProtection ensureCmTopReplyProtection() =>\n      $_ensure(27);\n\n  @$pb.TagNumber(29)\n  $core.bool get enableCharged => $_getBF(28);\n  @$pb.TagNumber(29)\n  set enableCharged($core.bool value) => $_setBool(28, value);\n  @$pb.TagNumber(29)\n  $core.bool hasEnableCharged() => $_has(28);\n  @$pb.TagNumber(29)\n  void clearEnableCharged() => $_clearField(29);\n}\n\nenum SubjectTopCards_Item { ogvGrade, notSet }\n\nclass SubjectTopCards extends $pb.GeneratedMessage {\n  factory SubjectTopCards({\n    SubjectTopCards_Type? type,\n    $core.String? oid,\n    OgvGradeCard? ogvGrade,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (oid != null) result.oid = oid;\n    if (ogvGrade != null) result.ogvGrade = ogvGrade;\n    return result;\n  }\n\n  SubjectTopCards._();\n\n  factory SubjectTopCards.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SubjectTopCards.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, SubjectTopCards_Item>\n      _SubjectTopCards_ItemByTag = {\n    3: SubjectTopCards_Item.ogvGrade,\n    0: SubjectTopCards_Item.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SubjectTopCards',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [3])\n    ..aE<SubjectTopCards_Type>(1, _omitFieldNames ? '' : 'type',\n        enumValues: SubjectTopCards_Type.values)\n    ..aOS(2, _omitFieldNames ? '' : 'oid')\n    ..aOM<OgvGradeCard>(3, _omitFieldNames ? '' : 'ogvGrade',\n        subBuilder: OgvGradeCard.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SubjectTopCards clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SubjectTopCards copyWith(void Function(SubjectTopCards) updates) =>\n      super.copyWith((message) => updates(message as SubjectTopCards))\n          as SubjectTopCards;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SubjectTopCards create() => SubjectTopCards._();\n  @$core.override\n  SubjectTopCards createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SubjectTopCards getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SubjectTopCards>(create);\n  static SubjectTopCards? _defaultInstance;\n\n  @$pb.TagNumber(3)\n  SubjectTopCards_Item whichItem() =>\n      _SubjectTopCards_ItemByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(3)\n  void clearItem() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  SubjectTopCards_Type get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(SubjectTopCards_Type value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get oid => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set oid($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  OgvGradeCard get ogvGrade => $_getN(2);\n  @$pb.TagNumber(3)\n  set ogvGrade(OgvGradeCard value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasOgvGrade() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearOgvGrade() => $_clearField(3);\n  @$pb.TagNumber(3)\n  OgvGradeCard ensureOgvGrade() => $_ensure(2);\n}\n\nclass SuggestEmotesReq extends $pb.GeneratedMessage {\n  factory SuggestEmotesReq({\n    $fixnum.Int64? oid,\n    $fixnum.Int64? type,\n  }) {\n    final result = create();\n    if (oid != null) result.oid = oid;\n    if (type != null) result.type = type;\n    return result;\n  }\n\n  SuggestEmotesReq._();\n\n  factory SuggestEmotesReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SuggestEmotesReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SuggestEmotesReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'oid')\n    ..aInt64(2, _omitFieldNames ? '' : 'type')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SuggestEmotesReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SuggestEmotesReq copyWith(void Function(SuggestEmotesReq) updates) =>\n      super.copyWith((message) => updates(message as SuggestEmotesReq))\n          as SuggestEmotesReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SuggestEmotesReq create() => SuggestEmotesReq._();\n  @$core.override\n  SuggestEmotesReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SuggestEmotesReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SuggestEmotesReq>(create);\n  static SuggestEmotesReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get oid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set oid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get type => $_getI64(1);\n  @$pb.TagNumber(2)\n  set type($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearType() => $_clearField(2);\n}\n\nclass SuggestEmotesResp extends $pb.GeneratedMessage {\n  factory SuggestEmotesResp({\n    $core.Iterable<Emote>? emotes,\n  }) {\n    final result = create();\n    if (emotes != null) result.emotes.addAll(emotes);\n    return result;\n  }\n\n  SuggestEmotesResp._();\n\n  factory SuggestEmotesResp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SuggestEmotesResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SuggestEmotesResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..pPM<Emote>(1, _omitFieldNames ? '' : 'emotes', subBuilder: Emote.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SuggestEmotesResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SuggestEmotesResp copyWith(void Function(SuggestEmotesResp) updates) =>\n      super.copyWith((message) => updates(message as SuggestEmotesResp))\n          as SuggestEmotesResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SuggestEmotesResp create() => SuggestEmotesResp._();\n  @$core.override\n  SuggestEmotesResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SuggestEmotesResp getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SuggestEmotesResp>(create);\n  static SuggestEmotesResp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<Emote> get emotes => $_getList(0);\n}\n\nclass TextStyle extends $pb.GeneratedMessage {\n  factory TextStyle({\n    $core.int? fontSize,\n    TextStyle_FontStyle? fontStyle,\n    $core.String? textDayColor,\n    $core.String? textNightColor,\n  }) {\n    final result = create();\n    if (fontSize != null) result.fontSize = fontSize;\n    if (fontStyle != null) result.fontStyle = fontStyle;\n    if (textDayColor != null) result.textDayColor = textDayColor;\n    if (textNightColor != null) result.textNightColor = textNightColor;\n    return result;\n  }\n\n  TextStyle._();\n\n  factory TextStyle.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TextStyle.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TextStyle',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'fontSize')\n    ..aE<TextStyle_FontStyle>(2, _omitFieldNames ? '' : 'fontStyle',\n        enumValues: TextStyle_FontStyle.values)\n    ..aOS(3, _omitFieldNames ? '' : 'textDayColor')\n    ..aOS(4, _omitFieldNames ? '' : 'textNightColor')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TextStyle clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TextStyle copyWith(void Function(TextStyle) updates) =>\n      super.copyWith((message) => updates(message as TextStyle)) as TextStyle;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TextStyle create() => TextStyle._();\n  @$core.override\n  TextStyle createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TextStyle getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TextStyle>(create);\n  static TextStyle? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get fontSize => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set fontSize($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFontSize() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFontSize() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  TextStyle_FontStyle get fontStyle => $_getN(1);\n  @$pb.TagNumber(2)\n  set fontStyle(TextStyle_FontStyle value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFontStyle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFontStyle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get textDayColor => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set textDayColor($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTextDayColor() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTextDayColor() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get textNightColor => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set textNightColor($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTextNightColor() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTextNightColor() => $_clearField(4);\n}\n\nclass Topic extends $pb.GeneratedMessage {\n  factory Topic({\n    $core.String? link,\n    $fixnum.Int64? id,\n  }) {\n    final result = create();\n    if (link != null) result.link = link;\n    if (id != null) result.id = id;\n    return result;\n  }\n\n  Topic._();\n\n  factory Topic.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Topic.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Topic',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'link')\n    ..aInt64(2, _omitFieldNames ? '' : 'id')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Topic clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Topic copyWith(void Function(Topic) updates) =>\n      super.copyWith((message) => updates(message as Topic)) as Topic;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Topic create() => Topic._();\n  @$core.override\n  Topic createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Topic getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Topic>(create);\n  static Topic? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get link => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set link($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLink() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLink() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get id => $_getI64(1);\n  @$pb.TagNumber(2)\n  set id($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearId() => $_clearField(2);\n}\n\nclass UGCVideoSearchItem extends $pb.GeneratedMessage {\n  factory UGCVideoSearchItem({\n    $core.String? title,\n    $core.String? upNickname,\n    $fixnum.Int64? duration,\n    $core.String? cover,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (upNickname != null) result.upNickname = upNickname;\n    if (duration != null) result.duration = duration;\n    if (cover != null) result.cover = cover;\n    return result;\n  }\n\n  UGCVideoSearchItem._();\n\n  factory UGCVideoSearchItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UGCVideoSearchItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UGCVideoSearchItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'upNickname')\n    ..aInt64(3, _omitFieldNames ? '' : 'duration')\n    ..aOS(4, _omitFieldNames ? '' : 'cover')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UGCVideoSearchItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UGCVideoSearchItem copyWith(void Function(UGCVideoSearchItem) updates) =>\n      super.copyWith((message) => updates(message as UGCVideoSearchItem))\n          as UGCVideoSearchItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UGCVideoSearchItem create() => UGCVideoSearchItem._();\n  @$core.override\n  UGCVideoSearchItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UGCVideoSearchItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UGCVideoSearchItem>(create);\n  static UGCVideoSearchItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get upNickname => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set upNickname($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUpNickname() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUpNickname() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get duration => $_getI64(2);\n  @$pb.TagNumber(3)\n  set duration($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDuration() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDuration() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get cover => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set cover($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCover() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCover() => $_clearField(4);\n}\n\nclass UpSelection extends $pb.GeneratedMessage {\n  factory UpSelection({\n    $fixnum.Int64? pendingCount,\n    $fixnum.Int64? ignoreCount,\n  }) {\n    final result = create();\n    if (pendingCount != null) result.pendingCount = pendingCount;\n    if (ignoreCount != null) result.ignoreCount = ignoreCount;\n    return result;\n  }\n\n  UpSelection._();\n\n  factory UpSelection.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UpSelection.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UpSelection',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'pendingCount')\n    ..aInt64(2, _omitFieldNames ? '' : 'ignoreCount')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpSelection clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpSelection copyWith(void Function(UpSelection) updates) =>\n      super.copyWith((message) => updates(message as UpSelection))\n          as UpSelection;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UpSelection create() => UpSelection._();\n  @$core.override\n  UpSelection createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UpSelection getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UpSelection>(create);\n  static UpSelection? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get pendingCount => $_getI64(0);\n  @$pb.TagNumber(1)\n  set pendingCount($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPendingCount() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPendingCount() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get ignoreCount => $_getI64(1);\n  @$pb.TagNumber(2)\n  set ignoreCount($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIgnoreCount() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIgnoreCount() => $_clearField(2);\n}\n\nclass UpdateSingleReplyNotificationConfigReq extends $pb.GeneratedMessage {\n  factory UpdateSingleReplyNotificationConfigReq({\n    $fixnum.Int64? rpid,\n    $fixnum.Int64? type,\n    $fixnum.Int64? oid,\n    ReplyNotificationSwitch? pushSwitch,\n  }) {\n    final result = create();\n    if (rpid != null) result.rpid = rpid;\n    if (type != null) result.type = type;\n    if (oid != null) result.oid = oid;\n    if (pushSwitch != null) result.pushSwitch = pushSwitch;\n    return result;\n  }\n\n  UpdateSingleReplyNotificationConfigReq._();\n\n  factory UpdateSingleReplyNotificationConfigReq.fromBuffer(\n          $core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UpdateSingleReplyNotificationConfigReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UpdateSingleReplyNotificationConfigReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'rpid')\n    ..aInt64(2, _omitFieldNames ? '' : 'type')\n    ..aInt64(3, _omitFieldNames ? '' : 'oid')\n    ..aE<ReplyNotificationSwitch>(4, _omitFieldNames ? '' : 'pushSwitch',\n        enumValues: ReplyNotificationSwitch.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpdateSingleReplyNotificationConfigReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpdateSingleReplyNotificationConfigReq copyWith(\n          void Function(UpdateSingleReplyNotificationConfigReq) updates) =>\n      super.copyWith((message) =>\n              updates(message as UpdateSingleReplyNotificationConfigReq))\n          as UpdateSingleReplyNotificationConfigReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UpdateSingleReplyNotificationConfigReq create() =>\n      UpdateSingleReplyNotificationConfigReq._();\n  @$core.override\n  UpdateSingleReplyNotificationConfigReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UpdateSingleReplyNotificationConfigReq getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<\n          UpdateSingleReplyNotificationConfigReq>(create);\n  static UpdateSingleReplyNotificationConfigReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get rpid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set rpid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasRpid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearRpid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get type => $_getI64(1);\n  @$pb.TagNumber(2)\n  set type($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get oid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set oid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasOid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearOid() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  ReplyNotificationSwitch get pushSwitch => $_getN(3);\n  @$pb.TagNumber(4)\n  set pushSwitch(ReplyNotificationSwitch value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPushSwitch() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPushSwitch() => $_clearField(4);\n}\n\nclass UpdateSingleReplyNotificationConfigResp extends $pb.GeneratedMessage {\n  factory UpdateSingleReplyNotificationConfigResp() => create();\n\n  UpdateSingleReplyNotificationConfigResp._();\n\n  factory UpdateSingleReplyNotificationConfigResp.fromBuffer(\n          $core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UpdateSingleReplyNotificationConfigResp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UpdateSingleReplyNotificationConfigResp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpdateSingleReplyNotificationConfigResp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UpdateSingleReplyNotificationConfigResp copyWith(\n          void Function(UpdateSingleReplyNotificationConfigResp) updates) =>\n      super.copyWith((message) =>\n              updates(message as UpdateSingleReplyNotificationConfigResp))\n          as UpdateSingleReplyNotificationConfigResp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UpdateSingleReplyNotificationConfigResp create() =>\n      UpdateSingleReplyNotificationConfigResp._();\n  @$core.override\n  UpdateSingleReplyNotificationConfigResp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UpdateSingleReplyNotificationConfigResp getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<\n          UpdateSingleReplyNotificationConfigResp>(create);\n  static UpdateSingleReplyNotificationConfigResp? _defaultInstance;\n}\n\nclass Url_Extra extends $pb.GeneratedMessage {\n  factory Url_Extra({\n    $fixnum.Int64? goodsItemId,\n    $core.String? goodsPrefetchedCache,\n    Url_Extra_GoodsShowType? goodsShowType,\n    $core.bool? isWordSearch,\n    $fixnum.Int64? goodsCmControl,\n    $core.String? goodsClickReport,\n    $core.String? goodsExposureReport,\n    $fixnum.Int64? goodsShowPopWindow,\n  }) {\n    final result = create();\n    if (goodsItemId != null) result.goodsItemId = goodsItemId;\n    if (goodsPrefetchedCache != null)\n      result.goodsPrefetchedCache = goodsPrefetchedCache;\n    if (goodsShowType != null) result.goodsShowType = goodsShowType;\n    if (isWordSearch != null) result.isWordSearch = isWordSearch;\n    if (goodsCmControl != null) result.goodsCmControl = goodsCmControl;\n    if (goodsClickReport != null) result.goodsClickReport = goodsClickReport;\n    if (goodsExposureReport != null)\n      result.goodsExposureReport = goodsExposureReport;\n    if (goodsShowPopWindow != null)\n      result.goodsShowPopWindow = goodsShowPopWindow;\n    return result;\n  }\n\n  Url_Extra._();\n\n  factory Url_Extra.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Url_Extra.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Url.Extra',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'goodsItemId')\n    ..aOS(2, _omitFieldNames ? '' : 'goodsPrefetchedCache')\n    ..aE<Url_Extra_GoodsShowType>(3, _omitFieldNames ? '' : 'goodsShowType',\n        enumValues: Url_Extra_GoodsShowType.values)\n    ..aOB(4, _omitFieldNames ? '' : 'isWordSearch')\n    ..aInt64(5, _omitFieldNames ? '' : 'goodsCmControl')\n    ..aOS(6, _omitFieldNames ? '' : 'goodsClickReport')\n    ..aOS(7, _omitFieldNames ? '' : 'goodsExposureReport')\n    ..aInt64(8, _omitFieldNames ? '' : 'goodsShowPopWindow')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Url_Extra clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Url_Extra copyWith(void Function(Url_Extra) updates) =>\n      super.copyWith((message) => updates(message as Url_Extra)) as Url_Extra;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Url_Extra create() => Url_Extra._();\n  @$core.override\n  Url_Extra createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Url_Extra getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Url_Extra>(create);\n  static Url_Extra? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get goodsItemId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set goodsItemId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasGoodsItemId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearGoodsItemId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get goodsPrefetchedCache => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set goodsPrefetchedCache($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasGoodsPrefetchedCache() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearGoodsPrefetchedCache() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  Url_Extra_GoodsShowType get goodsShowType => $_getN(2);\n  @$pb.TagNumber(3)\n  set goodsShowType(Url_Extra_GoodsShowType value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasGoodsShowType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearGoodsShowType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get isWordSearch => $_getBF(3);\n  @$pb.TagNumber(4)\n  set isWordSearch($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIsWordSearch() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIsWordSearch() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get goodsCmControl => $_getI64(4);\n  @$pb.TagNumber(5)\n  set goodsCmControl($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasGoodsCmControl() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearGoodsCmControl() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get goodsClickReport => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set goodsClickReport($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasGoodsClickReport() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearGoodsClickReport() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get goodsExposureReport => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set goodsExposureReport($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasGoodsExposureReport() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearGoodsExposureReport() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get goodsShowPopWindow => $_getI64(7);\n  @$pb.TagNumber(8)\n  set goodsShowPopWindow($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasGoodsShowPopWindow() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearGoodsShowPopWindow() => $_clearField(8);\n}\n\nclass Url extends $pb.GeneratedMessage {\n  factory Url({\n    $core.String? title,\n    $fixnum.Int64? state,\n    $core.String? prefixIcon,\n    $core.String? appUrlSchema,\n    $core.String? appName,\n    $core.String? appPackageName,\n    $core.String? clickReport,\n    $core.bool? isHalfScreen,\n    $core.String? exposureReport,\n    Url_Extra? extra,\n    $core.bool? underline,\n    $core.bool? matchOnce,\n    $core.String? pcUrl,\n    Url_IconPosition? iconPosition,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (state != null) result.state = state;\n    if (prefixIcon != null) result.prefixIcon = prefixIcon;\n    if (appUrlSchema != null) result.appUrlSchema = appUrlSchema;\n    if (appName != null) result.appName = appName;\n    if (appPackageName != null) result.appPackageName = appPackageName;\n    if (clickReport != null) result.clickReport = clickReport;\n    if (isHalfScreen != null) result.isHalfScreen = isHalfScreen;\n    if (exposureReport != null) result.exposureReport = exposureReport;\n    if (extra != null) result.extra = extra;\n    if (underline != null) result.underline = underline;\n    if (matchOnce != null) result.matchOnce = matchOnce;\n    if (pcUrl != null) result.pcUrl = pcUrl;\n    if (iconPosition != null) result.iconPosition = iconPosition;\n    return result;\n  }\n\n  Url._();\n\n  factory Url.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Url.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Url',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aInt64(2, _omitFieldNames ? '' : 'state')\n    ..aOS(3, _omitFieldNames ? '' : 'prefixIcon')\n    ..aOS(4, _omitFieldNames ? '' : 'appUrlSchema')\n    ..aOS(5, _omitFieldNames ? '' : 'appName')\n    ..aOS(6, _omitFieldNames ? '' : 'appPackageName')\n    ..aOS(7, _omitFieldNames ? '' : 'clickReport')\n    ..aOB(8, _omitFieldNames ? '' : 'isHalfScreen')\n    ..aOS(9, _omitFieldNames ? '' : 'exposureReport')\n    ..aOM<Url_Extra>(10, _omitFieldNames ? '' : 'extra',\n        subBuilder: Url_Extra.create)\n    ..aOB(11, _omitFieldNames ? '' : 'underline')\n    ..aOB(12, _omitFieldNames ? '' : 'matchOnce')\n    ..aOS(13, _omitFieldNames ? '' : 'pcUrl')\n    ..aE<Url_IconPosition>(14, _omitFieldNames ? '' : 'iconPosition',\n        enumValues: Url_IconPosition.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Url clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Url copyWith(void Function(Url) updates) =>\n      super.copyWith((message) => updates(message as Url)) as Url;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Url create() => Url._();\n  @$core.override\n  Url createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Url getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Url>(create);\n  static Url? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get state => $_getI64(1);\n  @$pb.TagNumber(2)\n  set state($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasState() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearState() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get prefixIcon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set prefixIcon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPrefixIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPrefixIcon() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get appUrlSchema => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set appUrlSchema($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasAppUrlSchema() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearAppUrlSchema() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get appName => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set appName($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasAppName() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearAppName() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get appPackageName => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set appPackageName($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasAppPackageName() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearAppPackageName() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get clickReport => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set clickReport($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasClickReport() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearClickReport() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.bool get isHalfScreen => $_getBF(7);\n  @$pb.TagNumber(8)\n  set isHalfScreen($core.bool value) => $_setBool(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasIsHalfScreen() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearIsHalfScreen() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get exposureReport => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set exposureReport($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasExposureReport() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearExposureReport() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  Url_Extra get extra => $_getN(9);\n  @$pb.TagNumber(10)\n  set extra(Url_Extra value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasExtra() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearExtra() => $_clearField(10);\n  @$pb.TagNumber(10)\n  Url_Extra ensureExtra() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  $core.bool get underline => $_getBF(10);\n  @$pb.TagNumber(11)\n  set underline($core.bool value) => $_setBool(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasUnderline() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearUnderline() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.bool get matchOnce => $_getBF(11);\n  @$pb.TagNumber(12)\n  set matchOnce($core.bool value) => $_setBool(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasMatchOnce() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearMatchOnce() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.String get pcUrl => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set pcUrl($core.String value) => $_setString(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasPcUrl() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearPcUrl() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  Url_IconPosition get iconPosition => $_getN(13);\n  @$pb.TagNumber(14)\n  set iconPosition(Url_IconPosition value) => $_setField(14, value);\n  @$pb.TagNumber(14)\n  $core.bool hasIconPosition() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearIconPosition() => $_clearField(14);\n}\n\nclass UserCallbackReply extends $pb.GeneratedMessage {\n  factory UserCallbackReply() => create();\n\n  UserCallbackReply._();\n\n  factory UserCallbackReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UserCallbackReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UserCallbackReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserCallbackReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserCallbackReply copyWith(void Function(UserCallbackReply) updates) =>\n      super.copyWith((message) => updates(message as UserCallbackReply))\n          as UserCallbackReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UserCallbackReply create() => UserCallbackReply._();\n  @$core.override\n  UserCallbackReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UserCallbackReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UserCallbackReply>(create);\n  static UserCallbackReply? _defaultInstance;\n}\n\nclass UserCallbackReq extends $pb.GeneratedMessage {\n  factory UserCallbackReq({\n    $fixnum.Int64? mid,\n    UserCallbackScene? scene,\n    UserCallbackAction? action,\n    $fixnum.Int64? oid,\n    $fixnum.Int64? type,\n    $core.Iterable<$fixnum.Int64>? rpids,\n  }) {\n    final result = create();\n    if (mid != null) result.mid = mid;\n    if (scene != null) result.scene = scene;\n    if (action != null) result.action = action;\n    if (oid != null) result.oid = oid;\n    if (type != null) result.type = type;\n    if (rpids != null) result.rpids.addAll(rpids);\n    return result;\n  }\n\n  UserCallbackReq._();\n\n  factory UserCallbackReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UserCallbackReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UserCallbackReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'mid')\n    ..aE<UserCallbackScene>(2, _omitFieldNames ? '' : 'scene',\n        enumValues: UserCallbackScene.values)\n    ..aE<UserCallbackAction>(3, _omitFieldNames ? '' : 'action',\n        enumValues: UserCallbackAction.values)\n    ..aInt64(4, _omitFieldNames ? '' : 'oid')\n    ..aInt64(5, _omitFieldNames ? '' : 'type')\n    ..p<$fixnum.Int64>(6, _omitFieldNames ? '' : 'rpids', $pb.PbFieldType.K6)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserCallbackReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserCallbackReq copyWith(void Function(UserCallbackReq) updates) =>\n      super.copyWith((message) => updates(message as UserCallbackReq))\n          as UserCallbackReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UserCallbackReq create() => UserCallbackReq._();\n  @$core.override\n  UserCallbackReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UserCallbackReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UserCallbackReq>(create);\n  static UserCallbackReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get mid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set mid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  UserCallbackScene get scene => $_getN(1);\n  @$pb.TagNumber(2)\n  set scene(UserCallbackScene value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasScene() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearScene() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  UserCallbackAction get action => $_getN(2);\n  @$pb.TagNumber(3)\n  set action(UserCallbackAction value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAction() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAction() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get oid => $_getI64(3);\n  @$pb.TagNumber(4)\n  set oid($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasOid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearOid() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get type => $_getI64(4);\n  @$pb.TagNumber(5)\n  set type($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearType() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $pb.PbList<$fixnum.Int64> get rpids => $_getList(5);\n}\n\nenum VideoSearchItem_VideoItem { ugc, pgc, notSet }\n\nclass VideoSearchItem extends $pb.GeneratedMessage {\n  factory VideoSearchItem({\n    SearchItemVideoSubType? type,\n    UGCVideoSearchItem? ugc,\n    PGCVideoSearchItem? pgc,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (ugc != null) result.ugc = ugc;\n    if (pgc != null) result.pgc = pgc;\n    return result;\n  }\n\n  VideoSearchItem._();\n\n  factory VideoSearchItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory VideoSearchItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, VideoSearchItem_VideoItem>\n      _VideoSearchItem_VideoItemByTag = {\n    2: VideoSearchItem_VideoItem.ugc,\n    3: VideoSearchItem_VideoItem.pgc,\n    0: VideoSearchItem_VideoItem.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'VideoSearchItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..oo(0, [2, 3])\n    ..aE<SearchItemVideoSubType>(1, _omitFieldNames ? '' : 'type',\n        enumValues: SearchItemVideoSubType.values)\n    ..aOM<UGCVideoSearchItem>(2, _omitFieldNames ? '' : 'ugc',\n        subBuilder: UGCVideoSearchItem.create)\n    ..aOM<PGCVideoSearchItem>(3, _omitFieldNames ? '' : 'pgc',\n        subBuilder: PGCVideoSearchItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VideoSearchItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VideoSearchItem copyWith(void Function(VideoSearchItem) updates) =>\n      super.copyWith((message) => updates(message as VideoSearchItem))\n          as VideoSearchItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static VideoSearchItem create() => VideoSearchItem._();\n  @$core.override\n  VideoSearchItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static VideoSearchItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<VideoSearchItem>(create);\n  static VideoSearchItem? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  VideoSearchItem_VideoItem whichVideoItem() =>\n      _VideoSearchItem_VideoItemByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  void clearVideoItem() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  SearchItemVideoSubType get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(SearchItemVideoSubType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  UGCVideoSearchItem get ugc => $_getN(1);\n  @$pb.TagNumber(2)\n  set ugc(UGCVideoSearchItem value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUgc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUgc() => $_clearField(2);\n  @$pb.TagNumber(2)\n  UGCVideoSearchItem ensureUgc() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  PGCVideoSearchItem get pgc => $_getN(2);\n  @$pb.TagNumber(3)\n  set pgc(PGCVideoSearchItem value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPgc() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPgc() => $_clearField(3);\n  @$pb.TagNumber(3)\n  PGCVideoSearchItem ensurePgc() => $_ensure(2);\n}\n\nclass Vote extends $pb.GeneratedMessage {\n  factory Vote({\n    $fixnum.Int64? id,\n    $core.String? title,\n    $fixnum.Int64? count,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (title != null) result.title = title;\n    if (count != null) result.count = count;\n    return result;\n  }\n\n  Vote._();\n\n  factory Vote.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Vote.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Vote',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aInt64(3, _omitFieldNames ? '' : 'count')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Vote clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Vote copyWith(void Function(Vote) updates) =>\n      super.copyWith((message) => updates(message as Vote)) as Vote;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Vote create() => Vote._();\n  @$core.override\n  Vote createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Vote getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Vote>(create);\n  static Vote? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get count => $_getI64(2);\n  @$pb.TagNumber(3)\n  set count($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCount() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCount() => $_clearField(3);\n}\n\nclass VoteCard_Option extends $pb.GeneratedMessage {\n  factory VoteCard_Option({\n    $fixnum.Int64? idx,\n    $core.String? desc,\n    $fixnum.Int64? count,\n  }) {\n    final result = create();\n    if (idx != null) result.idx = idx;\n    if (desc != null) result.desc = desc;\n    if (count != null) result.count = count;\n    return result;\n  }\n\n  VoteCard_Option._();\n\n  factory VoteCard_Option.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory VoteCard_Option.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'VoteCard.Option',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'idx')\n    ..aOS(2, _omitFieldNames ? '' : 'desc')\n    ..aInt64(3, _omitFieldNames ? '' : 'count')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VoteCard_Option clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VoteCard_Option copyWith(void Function(VoteCard_Option) updates) =>\n      super.copyWith((message) => updates(message as VoteCard_Option))\n          as VoteCard_Option;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static VoteCard_Option create() => VoteCard_Option._();\n  @$core.override\n  VoteCard_Option createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static VoteCard_Option getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<VoteCard_Option>(create);\n  static VoteCard_Option? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get idx => $_getI64(0);\n  @$pb.TagNumber(1)\n  set idx($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIdx() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIdx() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get desc => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set desc($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDesc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDesc() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get count => $_getI64(2);\n  @$pb.TagNumber(3)\n  set count($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCount() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCount() => $_clearField(3);\n}\n\nclass VoteCard extends $pb.GeneratedMessage {\n  factory VoteCard({\n    $fixnum.Int64? voteId,\n    $core.String? title,\n    $fixnum.Int64? count,\n    $core.Iterable<VoteCard_Option>? options,\n    $fixnum.Int64? myVoteOption,\n  }) {\n    final result = create();\n    if (voteId != null) result.voteId = voteId;\n    if (title != null) result.title = title;\n    if (count != null) result.count = count;\n    if (options != null) result.options.addAll(options);\n    if (myVoteOption != null) result.myVoteOption = myVoteOption;\n    return result;\n  }\n\n  VoteCard._();\n\n  factory VoteCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory VoteCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'VoteCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'voteId')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aInt64(3, _omitFieldNames ? '' : 'count')\n    ..pPM<VoteCard_Option>(4, _omitFieldNames ? '' : 'options',\n        subBuilder: VoteCard_Option.create)\n    ..aInt64(5, _omitFieldNames ? '' : 'myVoteOption')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VoteCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VoteCard copyWith(void Function(VoteCard) updates) =>\n      super.copyWith((message) => updates(message as VoteCard)) as VoteCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static VoteCard create() => VoteCard._();\n  @$core.override\n  VoteCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static VoteCard getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<VoteCard>(create);\n  static VoteCard? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get voteId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set voteId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasVoteId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearVoteId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get count => $_getI64(2);\n  @$pb.TagNumber(3)\n  set count($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCount() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCount() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<VoteCard_Option> get options => $_getList(3);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get myVoteOption => $_getI64(4);\n  @$pb.TagNumber(5)\n  set myVoteOption($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasMyVoteOption() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearMyVoteOption() => $_clearField(5);\n}\n\nclass WordSearchParam extends $pb.GeneratedMessage {\n  factory WordSearchParam({\n    $fixnum.Int64? shownCount,\n  }) {\n    final result = create();\n    if (shownCount != null) result.shownCount = shownCount;\n    return result;\n  }\n\n  WordSearchParam._();\n\n  factory WordSearchParam.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory WordSearchParam.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'WordSearchParam',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.main.community.reply.v1'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'shownCount')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  WordSearchParam clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  WordSearchParam copyWith(void Function(WordSearchParam) updates) =>\n      super.copyWith((message) => updates(message as WordSearchParam))\n          as WordSearchParam;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static WordSearchParam create() => WordSearchParam._();\n  @$core.override\n  WordSearchParam createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static WordSearchParam getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<WordSearchParam>(create);\n  static WordSearchParam? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get shownCount => $_getI64(0);\n  @$pb.TagNumber(1)\n  set shownCount($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasShownCount() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearShownCount() => $_clearField(1);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/main/community/reply/v1.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/main/community/reply/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nclass DetailListScene extends $pb.ProtobufEnum {\n  static const DetailListScene REPLY =\n      DetailListScene._(0, _omitEnumNames ? '' : 'REPLY');\n  static const DetailListScene MSG_FEED =\n      DetailListScene._(1, _omitEnumNames ? '' : 'MSG_FEED');\n  static const DetailListScene NOTIFY =\n      DetailListScene._(2, _omitEnumNames ? '' : 'NOTIFY');\n\n  static const $core.List<DetailListScene> values = <DetailListScene>[\n    REPLY,\n    MSG_FEED,\n    NOTIFY,\n  ];\n\n  static final $core.List<DetailListScene?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static DetailListScene? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const DetailListScene._(super.value, super.name);\n}\n\nclass EditorIconState extends $pb.ProtobufEnum {\n  static const EditorIconState EditorIconState_DEFAULT =\n      EditorIconState._(0, _omitEnumNames ? '' : 'EditorIconState_DEFAULT');\n  static const EditorIconState EditorIconState_ENABLE =\n      EditorIconState._(1, _omitEnumNames ? '' : 'EditorIconState_ENABLE');\n  static const EditorIconState EditorIconState_DISABLE =\n      EditorIconState._(2, _omitEnumNames ? '' : 'EditorIconState_DISABLE');\n  static const EditorIconState EditorIconState_HIDE =\n      EditorIconState._(3, _omitEnumNames ? '' : 'EditorIconState_HIDE');\n\n  static const $core.List<EditorIconState> values = <EditorIconState>[\n    EditorIconState_DEFAULT,\n    EditorIconState_ENABLE,\n    EditorIconState_DISABLE,\n    EditorIconState_HIDE,\n  ];\n\n  static final $core.List<EditorIconState?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static EditorIconState? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const EditorIconState._(super.value, super.name);\n}\n\nclass Mode extends $pb.ProtobufEnum {\n  static const Mode DEFAULT_Mode =\n      Mode._(0, _omitEnumNames ? '' : 'DEFAULT_Mode');\n\n  /// @Deprecated\n  static const Mode UNSPECIFIED =\n      Mode._(1, _omitEnumNames ? '' : 'UNSPECIFIED');\n  static const Mode MAIN_LIST_TIME =\n      Mode._(2, _omitEnumNames ? '' : 'MAIN_LIST_TIME');\n  static const Mode MAIN_LIST_HOT =\n      Mode._(3, _omitEnumNames ? '' : 'MAIN_LIST_HOT');\n\n  static const $core.List<Mode> values = <Mode>[\n    DEFAULT_Mode,\n    UNSPECIFIED,\n    MAIN_LIST_TIME,\n    MAIN_LIST_HOT,\n  ];\n\n  static final $core.List<Mode?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static Mode? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const Mode._(super.value, super.name);\n}\n\nclass ReplyNotificationSwitch extends $pb.ProtobufEnum {\n  static const ReplyNotificationSwitch ReplyNotificationSwitch_UNSPECIFIED =\n      ReplyNotificationSwitch._(\n          0, _omitEnumNames ? '' : 'ReplyNotificationSwitch_UNSPECIFIED');\n  static const ReplyNotificationSwitch ReplyNotificationSwitch_OFF =\n      ReplyNotificationSwitch._(\n          1, _omitEnumNames ? '' : 'ReplyNotificationSwitch_OFF');\n  static const ReplyNotificationSwitch ReplyNotificationSwitch_ON =\n      ReplyNotificationSwitch._(\n          2, _omitEnumNames ? '' : 'ReplyNotificationSwitch_ON');\n\n  static const $core.List<ReplyNotificationSwitch> values =\n      <ReplyNotificationSwitch>[\n    ReplyNotificationSwitch_UNSPECIFIED,\n    ReplyNotificationSwitch_OFF,\n    ReplyNotificationSwitch_ON,\n  ];\n\n  static final $core.List<ReplyNotificationSwitch?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static ReplyNotificationSwitch? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ReplyNotificationSwitch._(super.value, super.name);\n}\n\nclass SearchItemType extends $pb.ProtobufEnum {\n  static const SearchItemType DEFAULT_ITEM_TYPE =\n      SearchItemType._(0, _omitEnumNames ? '' : 'DEFAULT_ITEM_TYPE');\n  static const SearchItemType GOODS =\n      SearchItemType._(1, _omitEnumNames ? '' : 'GOODS');\n  static const SearchItemType VIDEO =\n      SearchItemType._(2, _omitEnumNames ? '' : 'VIDEO');\n  static const SearchItemType ARTICLE =\n      SearchItemType._(3, _omitEnumNames ? '' : 'ARTICLE');\n\n  static const $core.List<SearchItemType> values = <SearchItemType>[\n    DEFAULT_ITEM_TYPE,\n    GOODS,\n    VIDEO,\n    ARTICLE,\n  ];\n\n  static final $core.List<SearchItemType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static SearchItemType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const SearchItemType._(super.value, super.name);\n}\n\nclass SearchItemVideoSubType extends $pb.ProtobufEnum {\n  static const SearchItemVideoSubType UGC =\n      SearchItemVideoSubType._(0, _omitEnumNames ? '' : 'UGC');\n  static const SearchItemVideoSubType PGC =\n      SearchItemVideoSubType._(1, _omitEnumNames ? '' : 'PGC');\n\n  static const $core.List<SearchItemVideoSubType> values =\n      <SearchItemVideoSubType>[\n    UGC,\n    PGC,\n  ];\n\n  static final $core.List<SearchItemVideoSubType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static SearchItemVideoSubType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const SearchItemVideoSubType._(super.value, super.name);\n}\n\nclass UserCallbackAction extends $pb.ProtobufEnum {\n  static const UserCallbackAction Dismiss =\n      UserCallbackAction._(0, _omitEnumNames ? '' : 'Dismiss');\n\n  static const $core.List<UserCallbackAction> values = <UserCallbackAction>[\n    Dismiss,\n  ];\n\n  static final $core.List<UserCallbackAction?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 0);\n  static UserCallbackAction? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const UserCallbackAction._(super.value, super.name);\n}\n\nclass UserCallbackScene extends $pb.ProtobufEnum {\n  static const UserCallbackScene Insert_UserCallbackScene =\n      UserCallbackScene._(0, _omitEnumNames ? '' : 'Insert_UserCallbackScene');\n  static const UserCallbackScene RecommendSuperbReply =\n      UserCallbackScene._(1, _omitEnumNames ? '' : 'RecommendSuperbReply');\n\n  static const $core.List<UserCallbackScene> values = <UserCallbackScene>[\n    Insert_UserCallbackScene,\n    RecommendSuperbReply,\n  ];\n\n  static final $core.List<UserCallbackScene?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static UserCallbackScene? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const UserCallbackScene._(super.value, super.name);\n}\n\nclass AtGroup_Type extends $pb.ProtobufEnum {\n  static const AtGroup_Type AT_GROUP_TYPE_DEFAULT =\n      AtGroup_Type._(0, _omitEnumNames ? '' : 'AT_GROUP_TYPE_DEFAULT');\n  static const AtGroup_Type AT_GROUP_TYPE_RECENT =\n      AtGroup_Type._(1, _omitEnumNames ? '' : 'AT_GROUP_TYPE_RECENT');\n  static const AtGroup_Type AT_GROUP_TYPE_FOLLOW =\n      AtGroup_Type._(2, _omitEnumNames ? '' : 'AT_GROUP_TYPE_FOLLOW');\n  static const AtGroup_Type AT_GROUP_TYPE_FANS =\n      AtGroup_Type._(3, _omitEnumNames ? '' : 'AT_GROUP_TYPE_FANS');\n  static const AtGroup_Type AT_GROUP_TYPE_OTHERS =\n      AtGroup_Type._(4, _omitEnumNames ? '' : 'AT_GROUP_TYPE_OTHERS');\n\n  static const $core.List<AtGroup_Type> values = <AtGroup_Type>[\n    AT_GROUP_TYPE_DEFAULT,\n    AT_GROUP_TYPE_RECENT,\n    AT_GROUP_TYPE_FOLLOW,\n    AT_GROUP_TYPE_FANS,\n    AT_GROUP_TYPE_OTHERS,\n  ];\n\n  static final $core.List<AtGroup_Type?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 4);\n  static AtGroup_Type? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const AtGroup_Type._(super.value, super.name);\n}\n\nclass EmptyPage_Action extends $pb.ProtobufEnum {\n  static const EmptyPage_Action UNAVAILABLE =\n      EmptyPage_Action._(0, _omitEnumNames ? '' : 'UNAVAILABLE');\n  static const EmptyPage_Action SHOW_KEYBOARD =\n      EmptyPage_Action._(1, _omitEnumNames ? '' : 'SHOW_KEYBOARD');\n  static const EmptyPage_Action SEND_REPLY_WITH_BOLD_TEXT =\n      EmptyPage_Action._(2, _omitEnumNames ? '' : 'SEND_REPLY_WITH_BOLD_TEXT');\n\n  static const $core.List<EmptyPage_Action> values = <EmptyPage_Action>[\n    UNAVAILABLE,\n    SHOW_KEYBOARD,\n    SEND_REPLY_WITH_BOLD_TEXT,\n  ];\n\n  static final $core.List<EmptyPage_Action?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static EmptyPage_Action? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const EmptyPage_Action._(super.value, super.name);\n}\n\nclass Member_NftInteraction_RegionType extends $pb.ProtobufEnum {\n  static const Member_NftInteraction_RegionType DEFAULT =\n      Member_NftInteraction_RegionType._(0, _omitEnumNames ? '' : 'DEFAULT');\n  static const Member_NftInteraction_RegionType MAINLAND =\n      Member_NftInteraction_RegionType._(1, _omitEnumNames ? '' : 'MAINLAND');\n  static const Member_NftInteraction_RegionType GAT =\n      Member_NftInteraction_RegionType._(2, _omitEnumNames ? '' : 'GAT');\n\n  static const $core.List<Member_NftInteraction_RegionType> values =\n      <Member_NftInteraction_RegionType>[\n    DEFAULT,\n    MAINLAND,\n    GAT,\n  ];\n\n  static final $core.List<Member_NftInteraction_RegionType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static Member_NftInteraction_RegionType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const Member_NftInteraction_RegionType._(super.value, super.name);\n}\n\nclass Member_NftInteraction_ShowStatus extends $pb.ProtobufEnum {\n  static const Member_NftInteraction_ShowStatus SHOWDEFAULT =\n      Member_NftInteraction_ShowStatus._(\n          0, _omitEnumNames ? '' : 'SHOWDEFAULT');\n  static const Member_NftInteraction_ShowStatus ZOOMINMAINLAND =\n      Member_NftInteraction_ShowStatus._(\n          1, _omitEnumNames ? '' : 'ZOOMINMAINLAND');\n  static const Member_NftInteraction_ShowStatus RAW =\n      Member_NftInteraction_ShowStatus._(2, _omitEnumNames ? '' : 'RAW');\n\n  static const $core.List<Member_NftInteraction_ShowStatus> values =\n      <Member_NftInteraction_ShowStatus>[\n    SHOWDEFAULT,\n    ZOOMINMAINLAND,\n    RAW,\n  ];\n\n  static final $core.List<Member_NftInteraction_ShowStatus?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static Member_NftInteraction_ShowStatus? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const Member_NftInteraction_ShowStatus._(super.value, super.name);\n}\n\nclass MemberV2_Nft_Interaction_RegionType extends $pb.ProtobufEnum {\n  static const MemberV2_Nft_Interaction_RegionType DEFAULT_RegionType =\n      MemberV2_Nft_Interaction_RegionType._(\n          0, _omitEnumNames ? '' : 'DEFAULT_RegionType');\n  static const MemberV2_Nft_Interaction_RegionType MAINLAND_RegionType =\n      MemberV2_Nft_Interaction_RegionType._(\n          1, _omitEnumNames ? '' : 'MAINLAND_RegionType');\n  static const MemberV2_Nft_Interaction_RegionType GAT_RegionType =\n      MemberV2_Nft_Interaction_RegionType._(\n          2, _omitEnumNames ? '' : 'GAT_RegionType');\n\n  static const $core.List<MemberV2_Nft_Interaction_RegionType> values =\n      <MemberV2_Nft_Interaction_RegionType>[\n    DEFAULT_RegionType,\n    MAINLAND_RegionType,\n    GAT_RegionType,\n  ];\n\n  static final $core.List<MemberV2_Nft_Interaction_RegionType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static MemberV2_Nft_Interaction_RegionType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const MemberV2_Nft_Interaction_RegionType._(super.value, super.name);\n}\n\nclass MemberV2_Nft_Interaction_ShowStatus extends $pb.ProtobufEnum {\n  static const MemberV2_Nft_Interaction_ShowStatus SHOWDEFAULT_ShowStatus =\n      MemberV2_Nft_Interaction_ShowStatus._(\n          0, _omitEnumNames ? '' : 'SHOWDEFAULT_ShowStatus');\n  static const MemberV2_Nft_Interaction_ShowStatus ZOOMINMAINLAND_ShowStatus =\n      MemberV2_Nft_Interaction_ShowStatus._(\n          1, _omitEnumNames ? '' : 'ZOOMINMAINLAND_ShowStatus');\n  static const MemberV2_Nft_Interaction_ShowStatus RAW_ShowStatus =\n      MemberV2_Nft_Interaction_ShowStatus._(\n          2, _omitEnumNames ? '' : 'RAW_ShowStatus');\n\n  static const $core.List<MemberV2_Nft_Interaction_ShowStatus> values =\n      <MemberV2_Nft_Interaction_ShowStatus>[\n    SHOWDEFAULT_ShowStatus,\n    ZOOMINMAINLAND_ShowStatus,\n    RAW_ShowStatus,\n  ];\n\n  static final $core.List<MemberV2_Nft_Interaction_ShowStatus?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static MemberV2_Nft_Interaction_ShowStatus? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const MemberV2_Nft_Interaction_ShowStatus._(super.value, super.name);\n}\n\nclass MemberV2_Senior_Status extends $pb.ProtobufEnum {\n  static const MemberV2_Senior_Status Normal =\n      MemberV2_Senior_Status._(0, _omitEnumNames ? '' : 'Normal');\n  static const MemberV2_Senior_Status Pending =\n      MemberV2_Senior_Status._(1, _omitEnumNames ? '' : 'Pending');\n  static const MemberV2_Senior_Status Senior =\n      MemberV2_Senior_Status._(2, _omitEnumNames ? '' : 'Senior');\n  static const MemberV2_Senior_Status WillExpire =\n      MemberV2_Senior_Status._(3, _omitEnumNames ? '' : 'WillExpire');\n  static const MemberV2_Senior_Status Expired =\n      MemberV2_Senior_Status._(4, _omitEnumNames ? '' : 'Expired');\n\n  static const $core.List<MemberV2_Senior_Status> values =\n      <MemberV2_Senior_Status>[\n    Normal,\n    Pending,\n    Senior,\n    WillExpire,\n    Expired,\n  ];\n\n  static final $core.List<MemberV2_Senior_Status?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 4);\n  static MemberV2_Senior_Status? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const MemberV2_Senior_Status._(super.value, super.name);\n}\n\nclass MixedCard_Type extends $pb.ProtobufEnum {\n  static const MixedCard_Type UNKNOWN =\n      MixedCard_Type._(0, _omitEnumNames ? '' : 'UNKNOWN');\n  static const MixedCard_Type QUESTION =\n      MixedCard_Type._(1, _omitEnumNames ? '' : 'QUESTION');\n\n  static const $core.List<MixedCard_Type> values = <MixedCard_Type>[\n    UNKNOWN,\n    QUESTION,\n  ];\n\n  static final $core.List<MixedCard_Type?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static MixedCard_Type? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const MixedCard_Type._(super.value, super.name);\n}\n\nclass Operation_Type extends $pb.ProtobufEnum {\n  static const Operation_Type UNKNOWN_Type =\n      Operation_Type._(0, _omitEnumNames ? '' : 'UNKNOWN_Type');\n  static const Operation_Type NOTE =\n      Operation_Type._(1, _omitEnumNames ? '' : 'NOTE');\n  static const Operation_Type TOPIC =\n      Operation_Type._(2, _omitEnumNames ? '' : 'TOPIC');\n\n  /// @Deprecated\n  static const Operation_Type NOTICE =\n      Operation_Type._(3, _omitEnumNames ? '' : 'NOTICE');\n\n  static const $core.List<Operation_Type> values = <Operation_Type>[\n    UNKNOWN_Type,\n    NOTE,\n    TOPIC,\n    NOTICE,\n  ];\n\n  static final $core.List<Operation_Type?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static Operation_Type? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const Operation_Type._(super.value, super.name);\n}\n\nclass OperationV2_Type extends $pb.ProtobufEnum {\n  static const OperationV2_Type UNKNOWN_Type =\n      OperationV2_Type._(0, _omitEnumNames ? '' : 'UNKNOWN_Type');\n  static const OperationV2_Type NOTE_Type =\n      OperationV2_Type._(1, _omitEnumNames ? '' : 'NOTE_Type');\n  static const OperationV2_Type TOPIC_Type =\n      OperationV2_Type._(2, _omitEnumNames ? '' : 'TOPIC_Type');\n  static const OperationV2_Type SEARCH =\n      OperationV2_Type._(4, _omitEnumNames ? '' : 'SEARCH');\n\n  static const $core.List<OperationV2_Type> values = <OperationV2_Type>[\n    UNKNOWN_Type,\n    NOTE_Type,\n    TOPIC_Type,\n    SEARCH,\n  ];\n\n  static final $core.List<OperationV2_Type?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 4);\n  static OperationV2_Type? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const OperationV2_Type._(super.value, super.name);\n}\n\nclass OperationV2_Icon_Position extends $pb.ProtobufEnum {\n  static const OperationV2_Icon_Position PREFIX =\n      OperationV2_Icon_Position._(0, _omitEnumNames ? '' : 'PREFIX');\n  static const OperationV2_Icon_Position SUFFIX =\n      OperationV2_Icon_Position._(1, _omitEnumNames ? '' : 'SUFFIX');\n\n  static const $core.List<OperationV2_Icon_Position> values =\n      <OperationV2_Icon_Position>[\n    PREFIX,\n    SUFFIX,\n  ];\n\n  static final $core.List<OperationV2_Icon_Position?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static OperationV2_Icon_Position? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const OperationV2_Icon_Position._(super.value, super.name);\n}\n\nclass ReplyCardLabel_Type extends $pb.ProtobufEnum {\n  static const ReplyCardLabel_Type UNDERLINE =\n      ReplyCardLabel_Type._(0, _omitEnumNames ? '' : 'UNDERLINE');\n  static const ReplyCardLabel_Type BACKGROUND =\n      ReplyCardLabel_Type._(1, _omitEnumNames ? '' : 'BACKGROUND');\n\n  static const $core.List<ReplyCardLabel_Type> values = <ReplyCardLabel_Type>[\n    UNDERLINE,\n    BACKGROUND,\n  ];\n\n  static final $core.List<ReplyCardLabel_Type?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static ReplyCardLabel_Type? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ReplyCardLabel_Type._(super.value, super.name);\n}\n\nclass ReplyControl_VoteOption_LabelKind extends $pb.ProtobufEnum {\n  static const ReplyControl_VoteOption_LabelKind DEFAULT_LabelKind =\n      ReplyControl_VoteOption_LabelKind._(\n          0, _omitEnumNames ? '' : 'DEFAULT_LabelKind');\n  static const ReplyControl_VoteOption_LabelKind RED =\n      ReplyControl_VoteOption_LabelKind._(1, _omitEnumNames ? '' : 'RED');\n  static const ReplyControl_VoteOption_LabelKind BLUE =\n      ReplyControl_VoteOption_LabelKind._(2, _omitEnumNames ? '' : 'BLUE');\n  static const ReplyControl_VoteOption_LabelKind PLAIN =\n      ReplyControl_VoteOption_LabelKind._(3, _omitEnumNames ? '' : 'PLAIN');\n\n  static const $core.List<ReplyControl_VoteOption_LabelKind> values =\n      <ReplyControl_VoteOption_LabelKind>[\n    DEFAULT_LabelKind,\n    RED,\n    BLUE,\n    PLAIN,\n  ];\n\n  static final $core.List<ReplyControl_VoteOption_LabelKind?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static ReplyControl_VoteOption_LabelKind? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ReplyControl_VoteOption_LabelKind._(super.value, super.name);\n}\n\nclass ReplyInfoReq_ReplyInfoScene extends $pb.ProtobufEnum {\n  static const ReplyInfoReq_ReplyInfoScene Insert =\n      ReplyInfoReq_ReplyInfoScene._(0, _omitEnumNames ? '' : 'Insert');\n\n  static const $core.List<ReplyInfoReq_ReplyInfoScene> values =\n      <ReplyInfoReq_ReplyInfoScene>[\n    Insert,\n  ];\n\n  static final $core.List<ReplyInfoReq_ReplyInfoScene?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 0);\n  static ReplyInfoReq_ReplyInfoScene? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ReplyInfoReq_ReplyInfoScene._(super.value, super.name);\n}\n\nclass SubjectTopCards_Type extends $pb.ProtobufEnum {\n  static const SubjectTopCards_Type UNKNOWN_Type =\n      SubjectTopCards_Type._(0, _omitEnumNames ? '' : 'UNKNOWN_Type');\n  static const SubjectTopCards_Type OGV_GRADE =\n      SubjectTopCards_Type._(1, _omitEnumNames ? '' : 'OGV_GRADE');\n\n  static const $core.List<SubjectTopCards_Type> values = <SubjectTopCards_Type>[\n    UNKNOWN_Type,\n    OGV_GRADE,\n  ];\n\n  static final $core.List<SubjectTopCards_Type?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static SubjectTopCards_Type? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const SubjectTopCards_Type._(super.value, super.name);\n}\n\nclass TextStyle_FontStyle extends $pb.ProtobufEnum {\n  static const TextStyle_FontStyle NORMAL =\n      TextStyle_FontStyle._(0, _omitEnumNames ? '' : 'NORMAL');\n  static const TextStyle_FontStyle BOLD =\n      TextStyle_FontStyle._(1, _omitEnumNames ? '' : 'BOLD');\n\n  static const $core.List<TextStyle_FontStyle> values = <TextStyle_FontStyle>[\n    NORMAL,\n    BOLD,\n  ];\n\n  static final $core.List<TextStyle_FontStyle?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static TextStyle_FontStyle? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const TextStyle_FontStyle._(super.value, super.name);\n}\n\nclass Url_IconPosition extends $pb.ProtobufEnum {\n  static const Url_IconPosition Prefix =\n      Url_IconPosition._(0, _omitEnumNames ? '' : 'Prefix');\n  static const Url_IconPosition Suffix =\n      Url_IconPosition._(1, _omitEnumNames ? '' : 'Suffix');\n\n  static const $core.List<Url_IconPosition> values = <Url_IconPosition>[\n    Prefix,\n    Suffix,\n  ];\n\n  static final $core.List<Url_IconPosition?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static Url_IconPosition? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const Url_IconPosition._(super.value, super.name);\n}\n\nclass Url_Extra_GoodsShowType extends $pb.ProtobufEnum {\n  static const Url_Extra_GoodsShowType Popup =\n      Url_Extra_GoodsShowType._(0, _omitEnumNames ? '' : 'Popup');\n  static const Url_Extra_GoodsShowType FullScreen =\n      Url_Extra_GoodsShowType._(1, _omitEnumNames ? '' : 'FullScreen');\n  static const Url_Extra_GoodsShowType HalfScreen =\n      Url_Extra_GoodsShowType._(2, _omitEnumNames ? '' : 'HalfScreen');\n\n  static const $core.List<Url_Extra_GoodsShowType> values =\n      <Url_Extra_GoodsShowType>[\n    Popup,\n    FullScreen,\n    HalfScreen,\n  ];\n\n  static final $core.List<Url_Extra_GoodsShowType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static Url_Extra_GoodsShowType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const Url_Extra_GoodsShowType._(super.value, super.name);\n}\n\nconst $core.bool _omitEnumNames =\n    $core.bool.fromEnvironment('protobuf.omit_enum_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/main/community/reply/v1.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/main/community/reply/v1.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use detailListSceneDescriptor instead')\nconst DetailListScene$json = {\n  '1': 'DetailListScene',\n  '2': [\n    {'1': 'REPLY', '2': 0},\n    {'1': 'MSG_FEED', '2': 1},\n    {'1': 'NOTIFY', '2': 2},\n  ],\n};\n\n/// Descriptor for `DetailListScene`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List detailListSceneDescriptor = $convert.base64Decode(\n    'Cg9EZXRhaWxMaXN0U2NlbmUSCQoFUkVQTFkQABIMCghNU0dfRkVFRBABEgoKBk5PVElGWRAC');\n\n@$core.Deprecated('Use editorIconStateDescriptor instead')\nconst EditorIconState$json = {\n  '1': 'EditorIconState',\n  '2': [\n    {'1': 'EditorIconState_DEFAULT', '2': 0},\n    {'1': 'EditorIconState_ENABLE', '2': 1},\n    {'1': 'EditorIconState_DISABLE', '2': 2},\n    {'1': 'EditorIconState_HIDE', '2': 3},\n  ],\n};\n\n/// Descriptor for `EditorIconState`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List editorIconStateDescriptor = $convert.base64Decode(\n    'Cg9FZGl0b3JJY29uU3RhdGUSGwoXRWRpdG9ySWNvblN0YXRlX0RFRkFVTFQQABIaChZFZGl0b3'\n    'JJY29uU3RhdGVfRU5BQkxFEAESGwoXRWRpdG9ySWNvblN0YXRlX0RJU0FCTEUQAhIYChRFZGl0'\n    'b3JJY29uU3RhdGVfSElERRAD');\n\n@$core.Deprecated('Use modeDescriptor instead')\nconst Mode$json = {\n  '1': 'Mode',\n  '2': [\n    {'1': 'DEFAULT_Mode', '2': 0},\n    {'1': 'UNSPECIFIED', '2': 1},\n    {'1': 'MAIN_LIST_TIME', '2': 2},\n    {'1': 'MAIN_LIST_HOT', '2': 3},\n  ],\n};\n\n/// Descriptor for `Mode`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List modeDescriptor = $convert.base64Decode(\n    'CgRNb2RlEhAKDERFRkFVTFRfTW9kZRAAEg8KC1VOU1BFQ0lGSUVEEAESEgoOTUFJTl9MSVNUX1'\n    'RJTUUQAhIRCg1NQUlOX0xJU1RfSE9UEAM=');\n\n@$core.Deprecated('Use replyNotificationSwitchDescriptor instead')\nconst ReplyNotificationSwitch$json = {\n  '1': 'ReplyNotificationSwitch',\n  '2': [\n    {'1': 'ReplyNotificationSwitch_UNSPECIFIED', '2': 0},\n    {'1': 'ReplyNotificationSwitch_OFF', '2': 1},\n    {'1': 'ReplyNotificationSwitch_ON', '2': 2},\n  ],\n};\n\n/// Descriptor for `ReplyNotificationSwitch`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List replyNotificationSwitchDescriptor = $convert.base64Decode(\n    'ChdSZXBseU5vdGlmaWNhdGlvblN3aXRjaBInCiNSZXBseU5vdGlmaWNhdGlvblN3aXRjaF9VTl'\n    'NQRUNJRklFRBAAEh8KG1JlcGx5Tm90aWZpY2F0aW9uU3dpdGNoX09GRhABEh4KGlJlcGx5Tm90'\n    'aWZpY2F0aW9uU3dpdGNoX09OEAI=');\n\n@$core.Deprecated('Use searchItemTypeDescriptor instead')\nconst SearchItemType$json = {\n  '1': 'SearchItemType',\n  '2': [\n    {'1': 'DEFAULT_ITEM_TYPE', '2': 0},\n    {'1': 'GOODS', '2': 1},\n    {'1': 'VIDEO', '2': 2},\n    {'1': 'ARTICLE', '2': 3},\n  ],\n};\n\n/// Descriptor for `SearchItemType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List searchItemTypeDescriptor = $convert.base64Decode(\n    'Cg5TZWFyY2hJdGVtVHlwZRIVChFERUZBVUxUX0lURU1fVFlQRRAAEgkKBUdPT0RTEAESCQoFVk'\n    'lERU8QAhILCgdBUlRJQ0xFEAM=');\n\n@$core.Deprecated('Use searchItemVideoSubTypeDescriptor instead')\nconst SearchItemVideoSubType$json = {\n  '1': 'SearchItemVideoSubType',\n  '2': [\n    {'1': 'UGC', '2': 0},\n    {'1': 'PGC', '2': 1},\n  ],\n};\n\n/// Descriptor for `SearchItemVideoSubType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List searchItemVideoSubTypeDescriptor = $convert\n    .base64Decode('ChZTZWFyY2hJdGVtVmlkZW9TdWJUeXBlEgcKA1VHQxAAEgcKA1BHQxAB');\n\n@$core.Deprecated('Use userCallbackActionDescriptor instead')\nconst UserCallbackAction$json = {\n  '1': 'UserCallbackAction',\n  '2': [\n    {'1': 'Dismiss', '2': 0},\n  ],\n};\n\n/// Descriptor for `UserCallbackAction`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List userCallbackActionDescriptor =\n    $convert.base64Decode('ChJVc2VyQ2FsbGJhY2tBY3Rpb24SCwoHRGlzbWlzcxAA');\n\n@$core.Deprecated('Use userCallbackSceneDescriptor instead')\nconst UserCallbackScene$json = {\n  '1': 'UserCallbackScene',\n  '2': [\n    {'1': 'Insert_UserCallbackScene', '2': 0},\n    {'1': 'RecommendSuperbReply', '2': 1},\n  ],\n};\n\n/// Descriptor for `UserCallbackScene`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List userCallbackSceneDescriptor = $convert.base64Decode(\n    'ChFVc2VyQ2FsbGJhY2tTY2VuZRIcChhJbnNlcnRfVXNlckNhbGxiYWNrU2NlbmUQABIYChRSZW'\n    'NvbW1lbmRTdXBlcmJSZXBseRAB');\n\n@$core.Deprecated('Use activityDescriptor instead')\nconst Activity$json = {\n  '1': 'Activity',\n  '2': [\n    {'1': 'activity_id', '3': 1, '4': 1, '5': 3, '10': 'activityId'},\n    {'1': 'activity_state', '3': 2, '4': 1, '5': 3, '10': 'activityState'},\n    {\n      '1': 'activity_placeholder',\n      '3': 3,\n      '4': 1,\n      '5': 9,\n      '10': 'activityPlaceholder'\n    },\n  ],\n};\n\n/// Descriptor for `Activity`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List activityDescriptor = $convert.base64Decode(\n    'CghBY3Rpdml0eRIfCgthY3Rpdml0eV9pZBgBIAEoA1IKYWN0aXZpdHlJZBIlCg5hY3Rpdml0eV'\n    '9zdGF0ZRgCIAEoA1INYWN0aXZpdHlTdGF0ZRIxChRhY3Rpdml0eV9wbGFjZWhvbGRlchgDIAEo'\n    'CVITYWN0aXZpdHlQbGFjZWhvbGRlcg==');\n\n@$core.Deprecated('Use answerQuestionReqDescriptor instead')\nconst AnswerQuestionReq$json = {\n  '1': 'AnswerQuestionReq',\n  '2': [\n    {'1': 'qid', '3': 1, '4': 1, '5': 3, '10': 'qid'},\n    {'1': 'option_key', '3': 2, '4': 1, '5': 9, '10': 'optionKey'},\n  ],\n};\n\n/// Descriptor for `AnswerQuestionReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List answerQuestionReqDescriptor = $convert.base64Decode(\n    'ChFBbnN3ZXJRdWVzdGlvblJlcRIQCgNxaWQYASABKANSA3FpZBIdCgpvcHRpb25fa2V5GAIgAS'\n    'gJUglvcHRpb25LZXk=');\n\n@$core.Deprecated('Use answerQuestionRespDescriptor instead')\nconst AnswerQuestionResp$json = {\n  '1': 'AnswerQuestionResp',\n  '2': [\n    {'1': 'passed', '3': 1, '4': 1, '5': 8, '10': 'passed'},\n    {'1': 'member_passed', '3': 2, '4': 1, '5': 8, '10': 'memberPassed'},\n    {\n      '1': 'member_passed_popup',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6':\n          '.bilibili.main.community.reply.v1.AnswerQuestionResp.MemberPassedPopup',\n      '10': 'memberPassedPopup'\n    },\n    {'1': 'bottom_text', '3': 4, '4': 1, '5': 9, '10': 'bottomText'},\n    {\n      '1': 'stat',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.QuestionCardStat',\n      '10': 'stat'\n    },\n  ],\n  '3': [AnswerQuestionResp_MemberPassedPopup$json],\n};\n\n@$core.Deprecated('Use answerQuestionRespDescriptor instead')\nconst AnswerQuestionResp_MemberPassedPopup$json = {\n  '1': 'MemberPassedPopup',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'subtitle', '3': 2, '4': 1, '5': 9, '10': 'subtitle'},\n    {'1': 'h5_link', '3': 3, '4': 1, '5': 9, '10': 'h5Link'},\n  ],\n};\n\n/// Descriptor for `AnswerQuestionResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List answerQuestionRespDescriptor = $convert.base64Decode(\n    'ChJBbnN3ZXJRdWVzdGlvblJlc3ASFgoGcGFzc2VkGAEgASgIUgZwYXNzZWQSIwoNbWVtYmVyX3'\n    'Bhc3NlZBgCIAEoCFIMbWVtYmVyUGFzc2VkEnYKE21lbWJlcl9wYXNzZWRfcG9wdXAYAyABKAsy'\n    'Ri5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5BbnN3ZXJRdWVzdGlvblJlc3AuTW'\n    'VtYmVyUGFzc2VkUG9wdXBSEW1lbWJlclBhc3NlZFBvcHVwEh8KC2JvdHRvbV90ZXh0GAQgASgJ'\n    'Ugpib3R0b21UZXh0EkYKBHN0YXQYBSABKAsyMi5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZX'\n    'BseS52MS5RdWVzdGlvbkNhcmRTdGF0UgRzdGF0Gl4KEU1lbWJlclBhc3NlZFBvcHVwEhQKBXRp'\n    'dGxlGAEgASgJUgV0aXRsZRIaCghzdWJ0aXRsZRgCIAEoCVIIc3VidGl0bGUSFwoHaDVfbGluax'\n    'gDIAEoCVIGaDVMaW5r');\n\n@$core.Deprecated('Use articleSearchItemDescriptor instead')\nconst ArticleSearchItem$json = {\n  '1': 'ArticleSearchItem',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'up_nickname', '3': 2, '4': 1, '5': 9, '10': 'upNickname'},\n    {'1': 'covers', '3': 3, '4': 3, '5': 9, '10': 'covers'},\n  ],\n};\n\n/// Descriptor for `ArticleSearchItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List articleSearchItemDescriptor = $convert.base64Decode(\n    'ChFBcnRpY2xlU2VhcmNoSXRlbRIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSHwoLdXBfbmlja25hbW'\n    'UYAiABKAlSCnVwTmlja25hbWUSFgoGY292ZXJzGAMgAygJUgZjb3ZlcnM=');\n\n@$core.Deprecated('Use atGroupDescriptor instead')\nconst AtGroup$json = {\n  '1': 'AtGroup',\n  '2': [\n    {\n      '1': 'group_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.AtGroup.Type',\n      '10': 'groupType'\n    },\n    {'1': 'group_name', '3': 2, '4': 1, '5': 9, '10': 'groupName'},\n    {\n      '1': 'items',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.AtItem',\n      '10': 'items'\n    },\n  ],\n  '4': [AtGroup_Type$json],\n};\n\n@$core.Deprecated('Use atGroupDescriptor instead')\nconst AtGroup_Type$json = {\n  '1': 'Type',\n  '2': [\n    {'1': 'AT_GROUP_TYPE_DEFAULT', '2': 0},\n    {'1': 'AT_GROUP_TYPE_RECENT', '2': 1},\n    {'1': 'AT_GROUP_TYPE_FOLLOW', '2': 2},\n    {'1': 'AT_GROUP_TYPE_FANS', '2': 3},\n    {'1': 'AT_GROUP_TYPE_OTHERS', '2': 4},\n  ],\n};\n\n/// Descriptor for `AtGroup`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List atGroupDescriptor = $convert.base64Decode(\n    'CgdBdEdyb3VwEk0KCmdyb3VwX3R5cGUYASABKA4yLi5iaWxpYmlsaS5tYWluLmNvbW11bml0eS'\n    '5yZXBseS52MS5BdEdyb3VwLlR5cGVSCWdyb3VwVHlwZRIdCgpncm91cF9uYW1lGAIgASgJUgln'\n    'cm91cE5hbWUSPgoFaXRlbXMYAyADKAsyKC5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS'\n    '52MS5BdEl0ZW1SBWl0ZW1zIocBCgRUeXBlEhkKFUFUX0dST1VQX1RZUEVfREVGQVVMVBAAEhgK'\n    'FEFUX0dST1VQX1RZUEVfUkVDRU5UEAESGAoUQVRfR1JPVVBfVFlQRV9GT0xMT1cQAhIWChJBVF'\n    '9HUk9VUF9UWVBFX0ZBTlMQAxIYChRBVF9HUk9VUF9UWVBFX09USEVSUxAE');\n\n@$core.Deprecated('Use atItemDescriptor instead')\nconst AtItem$json = {\n  '1': 'AtItem',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'face', '3': 3, '4': 1, '5': 9, '10': 'face'},\n    {'1': 'fans', '3': 4, '4': 1, '5': 5, '10': 'fans'},\n    {\n      '1': 'official_verify_type',\n      '3': 5,\n      '4': 1,\n      '5': 5,\n      '10': 'officialVerifyType'\n    },\n  ],\n};\n\n/// Descriptor for `AtItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List atItemDescriptor = $convert.base64Decode(\n    'CgZBdEl0ZW0SEAoDbWlkGAEgASgDUgNtaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRISCgRmYWNlGA'\n    'MgASgJUgRmYWNlEhIKBGZhbnMYBCABKAVSBGZhbnMSMAoUb2ZmaWNpYWxfdmVyaWZ5X3R5cGUY'\n    'BSABKAVSEm9mZmljaWFsVmVyaWZ5VHlwZQ==');\n\n@$core.Deprecated('Use atSearchReplyDescriptor instead')\nconst AtSearchReply$json = {\n  '1': 'AtSearchReply',\n  '2': [\n    {\n      '1': 'groups',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.AtGroup',\n      '10': 'groups'\n    },\n  ],\n};\n\n/// Descriptor for `AtSearchReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List atSearchReplyDescriptor = $convert.base64Decode(\n    'Cg1BdFNlYXJjaFJlcGx5EkEKBmdyb3VwcxgBIAMoCzIpLmJpbGliaWxpLm1haW4uY29tbXVuaX'\n    'R5LnJlcGx5LnYxLkF0R3JvdXBSBmdyb3Vwcw==');\n\n@$core.Deprecated('Use atSearchReqDescriptor instead')\nconst AtSearchReq$json = {\n  '1': 'AtSearchReq',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'keyword', '3': 2, '4': 1, '5': 9, '10': 'keyword'},\n  ],\n};\n\n/// Descriptor for `AtSearchReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List atSearchReqDescriptor = $convert.base64Decode(\n    'CgtBdFNlYXJjaFJlcRIQCgNtaWQYASABKANSA21pZBIYCgdrZXl3b3JkGAIgASgJUgdrZXl3b3'\n    'Jk');\n\n@$core.Deprecated('Use cMDescriptor instead')\nconst CM$json = {\n  '1': 'CM',\n  '2': [\n    {\n      '1': 'source_content',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.google.protobuf.Any',\n      '10': 'sourceContent'\n    },\n  ],\n};\n\n/// Descriptor for `CM`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cMDescriptor = $convert.base64Decode(\n    'CgJDTRI7Cg5zb3VyY2VfY29udGVudBgBIAEoCzIULmdvb2dsZS5wcm90b2J1Zi5BbnlSDXNvdX'\n    'JjZUNvbnRlbnQ=');\n\n@$core.Deprecated('Use contentDescriptor instead')\nconst Content$json = {\n  '1': 'Content',\n  '2': [\n    {'1': 'message', '3': 1, '4': 1, '5': 9, '10': 'message'},\n    {\n      '1': 'members',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Content.MembersEntry',\n      '10': 'members'\n    },\n    {\n      '1': 'emotes',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Content.EmotesEntry',\n      '10': 'emotes'\n    },\n    {\n      '1': 'topics',\n      '3': 4,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Content.TopicsEntry',\n      '10': 'topics'\n    },\n    {\n      '1': 'urls',\n      '3': 5,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Content.UrlsEntry',\n      '10': 'urls'\n    },\n    {\n      '1': 'vote',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Vote',\n      '10': 'vote'\n    },\n    {\n      '1': 'at_name_to_mid',\n      '3': 7,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Content.AtNameToMidEntry',\n      '10': 'atNameToMid'\n    },\n    {\n      '1': 'rich_text',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.RichText',\n      '10': 'richText'\n    },\n    {\n      '1': 'pictures',\n      '3': 9,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Picture',\n      '10': 'pictures'\n    },\n    {'1': 'picture_scale', '3': 10, '4': 1, '5': 1, '10': 'pictureScale'},\n  ],\n  '3': [\n    Content_MembersEntry$json,\n    Content_EmotesEntry$json,\n    Content_TopicsEntry$json,\n    Content_UrlsEntry$json,\n    Content_AtNameToMidEntry$json\n  ],\n};\n\n@$core.Deprecated('Use contentDescriptor instead')\nconst Content_MembersEntry$json = {\n  '1': 'MembersEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {\n      '1': 'value',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Member',\n      '10': 'value'\n    },\n  ],\n  '7': {'7': true},\n};\n\n@$core.Deprecated('Use contentDescriptor instead')\nconst Content_EmotesEntry$json = {\n  '1': 'EmotesEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {\n      '1': 'value',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Emote',\n      '10': 'value'\n    },\n  ],\n  '7': {'7': true},\n};\n\n@$core.Deprecated('Use contentDescriptor instead')\nconst Content_TopicsEntry$json = {\n  '1': 'TopicsEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {\n      '1': 'value',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Topic',\n      '10': 'value'\n    },\n  ],\n  '7': {'7': true},\n};\n\n@$core.Deprecated('Use contentDescriptor instead')\nconst Content_UrlsEntry$json = {\n  '1': 'UrlsEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {\n      '1': 'value',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Url',\n      '10': 'value'\n    },\n  ],\n  '7': {'7': true},\n};\n\n@$core.Deprecated('Use contentDescriptor instead')\nconst Content_AtNameToMidEntry$json = {\n  '1': 'AtNameToMidEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 3, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `Content`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List contentDescriptor = $convert.base64Decode(\n    'CgdDb250ZW50EhgKB21lc3NhZ2UYASABKAlSB21lc3NhZ2USUAoHbWVtYmVycxgCIAMoCzI2Lm'\n    'JpbGliaWxpLm1haW4uY29tbXVuaXR5LnJlcGx5LnYxLkNvbnRlbnQuTWVtYmVyc0VudHJ5Ugdt'\n    'ZW1iZXJzEk0KBmVtb3RlcxgDIAMoCzI1LmJpbGliaWxpLm1haW4uY29tbXVuaXR5LnJlcGx5Ln'\n    'YxLkNvbnRlbnQuRW1vdGVzRW50cnlSBmVtb3RlcxJNCgZ0b3BpY3MYBCADKAsyNS5iaWxpYmls'\n    'aS5tYWluLmNvbW11bml0eS5yZXBseS52MS5Db250ZW50LlRvcGljc0VudHJ5UgZ0b3BpY3MSRw'\n    'oEdXJscxgFIAMoCzIzLmJpbGliaWxpLm1haW4uY29tbXVuaXR5LnJlcGx5LnYxLkNvbnRlbnQu'\n    'VXJsc0VudHJ5UgR1cmxzEjoKBHZvdGUYBiABKAsyJi5iaWxpYmlsaS5tYWluLmNvbW11bml0eS'\n    '5yZXBseS52MS5Wb3RlUgR2b3RlEl8KDmF0X25hbWVfdG9fbWlkGAcgAygLMjouYmlsaWJpbGku'\n    'bWFpbi5jb21tdW5pdHkucmVwbHkudjEuQ29udGVudC5BdE5hbWVUb01pZEVudHJ5UgthdE5hbW'\n    'VUb01pZBJHCglyaWNoX3RleHQYCCABKAsyKi5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBs'\n    'eS52MS5SaWNoVGV4dFIIcmljaFRleHQSRQoIcGljdHVyZXMYCSADKAsyKS5iaWxpYmlsaS5tYW'\n    'luLmNvbW11bml0eS5yZXBseS52MS5QaWN0dXJlUghwaWN0dXJlcxIjCg1waWN0dXJlX3NjYWxl'\n    'GAogASgBUgxwaWN0dXJlU2NhbGUaZAoMTWVtYmVyc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5Ej'\n    '4KBXZhbHVlGAIgASgLMiguYmlsaWJpbGkubWFpbi5jb21tdW5pdHkucmVwbHkudjEuTWVtYmVy'\n    'UgV2YWx1ZToCOAEaYgoLRW1vdGVzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSPQoFdmFsdWUYAi'\n    'ABKAsyJy5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5FbW90ZVIFdmFsdWU6AjgB'\n    'GmIKC1RvcGljc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5Ej0KBXZhbHVlGAIgASgLMicuYmlsaW'\n    'JpbGkubWFpbi5jb21tdW5pdHkucmVwbHkudjEuVG9waWNSBXZhbHVlOgI4ARpeCglVcmxzRW50'\n    'cnkSEAoDa2V5GAEgASgJUgNrZXkSOwoFdmFsdWUYAiABKAsyJS5iaWxpYmlsaS5tYWluLmNvbW'\n    '11bml0eS5yZXBseS52MS5VcmxSBXZhbHVlOgI4ARo+ChBBdE5hbWVUb01pZEVudHJ5EhAKA2tl'\n    'eRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgDUgV2YWx1ZToCOAE=');\n\n@$core.Deprecated('Use cursorReplyDescriptor instead')\nconst CursorReply$json = {\n  '1': 'CursorReply',\n  '2': [\n    {'1': 'next', '3': 1, '4': 1, '5': 3, '10': 'next'},\n    {'1': 'prev', '3': 2, '4': 1, '5': 3, '10': 'prev'},\n    {'1': 'is_begin', '3': 3, '4': 1, '5': 8, '10': 'isBegin'},\n    {'1': 'is_end', '3': 4, '4': 1, '5': 8, '10': 'isEnd'},\n    {\n      '1': 'mode',\n      '3': 5,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.Mode',\n      '10': 'mode'\n    },\n    {'1': 'mode_text', '3': 6, '4': 1, '5': 9, '10': 'modeText'},\n  ],\n};\n\n/// Descriptor for `CursorReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cursorReplyDescriptor = $convert.base64Decode(\n    'CgtDdXJzb3JSZXBseRISCgRuZXh0GAEgASgDUgRuZXh0EhIKBHByZXYYAiABKANSBHByZXYSGQ'\n    'oIaXNfYmVnaW4YAyABKAhSB2lzQmVnaW4SFQoGaXNfZW5kGAQgASgIUgVpc0VuZBI6CgRtb2Rl'\n    'GAUgASgOMiYuYmlsaWJpbGkubWFpbi5jb21tdW5pdHkucmVwbHkudjEuTW9kZVIEbW9kZRIbCg'\n    'ltb2RlX3RleHQYBiABKAlSCG1vZGVUZXh0');\n\n@$core.Deprecated('Use cursorReqDescriptor instead')\nconst CursorReq$json = {\n  '1': 'CursorReq',\n  '2': [\n    {'1': 'next', '3': 1, '4': 1, '5': 3, '10': 'next'},\n    {'1': 'prev', '3': 2, '4': 1, '5': 3, '10': 'prev'},\n    {\n      '1': 'mode',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.Mode',\n      '10': 'mode'\n    },\n  ],\n};\n\n/// Descriptor for `CursorReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List cursorReqDescriptor = $convert.base64Decode(\n    'CglDdXJzb3JSZXESEgoEbmV4dBgBIAEoA1IEbmV4dBISCgRwcmV2GAIgASgDUgRwcmV2EjoKBG'\n    '1vZGUYBCABKA4yJi5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5Nb2RlUgRtb2Rl');\n\n@$core.Deprecated('Use detailListReplyDescriptor instead')\nconst DetailListReply$json = {\n  '1': 'DetailListReply',\n  '2': [\n    {\n      '1': 'cursor',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.CursorReply',\n      '10': 'cursor'\n    },\n    {\n      '1': 'subject_control',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.SubjectControl',\n      '10': 'subjectControl'\n    },\n    {\n      '1': 'root',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ReplyInfo',\n      '10': 'root'\n    },\n    {\n      '1': 'activity',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Activity',\n      '10': 'activity'\n    },\n    {\n      '1': 'likes',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.LikeInfo',\n      '10': 'likes'\n    },\n    {\n      '1': 'mode',\n      '3': 6,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.Mode',\n      '10': 'mode'\n    },\n    {'1': 'mode_text', '3': 7, '4': 1, '5': 9, '10': 'modeText'},\n    {\n      '1': 'pagination_reply',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.pagination.FeedPaginationReply',\n      '10': 'paginationReply'\n    },\n    {'1': 'session_id', '3': 9, '4': 1, '5': 9, '10': 'sessionId'},\n    {\n      '1': 'subject_title',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.DetailListReply.SubjectTitle',\n      '10': 'subjectTitle'\n    },\n  ],\n  '3': [DetailListReply_SubjectTitle$json],\n};\n\n@$core.Deprecated('Use detailListReplyDescriptor instead')\nconst DetailListReply_SubjectTitle$json = {\n  '1': 'SubjectTitle',\n  '2': [\n    {'1': 'left_icon', '3': 1, '4': 1, '5': 9, '10': 'leftIcon'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'link', '3': 3, '4': 1, '5': 9, '10': 'link'},\n    {'1': 'rpid_mute', '3': 4, '4': 1, '5': 3, '10': 'rpidMute'},\n    {\n      '1': 'push_switch',\n      '3': 5,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.ReplyNotificationSwitch',\n      '10': 'pushSwitch'\n    },\n  ],\n};\n\n/// Descriptor for `DetailListReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List detailListReplyDescriptor = $convert.base64Decode(\n    'Cg9EZXRhaWxMaXN0UmVwbHkSRQoGY3Vyc29yGAEgASgLMi0uYmlsaWJpbGkubWFpbi5jb21tdW'\n    '5pdHkucmVwbHkudjEuQ3Vyc29yUmVwbHlSBmN1cnNvchJZCg9zdWJqZWN0X2NvbnRyb2wYAiAB'\n    'KAsyMC5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5TdWJqZWN0Q29udHJvbFIOc3'\n    'ViamVjdENvbnRyb2wSPwoEcm9vdBgDIAEoCzIrLmJpbGliaWxpLm1haW4uY29tbXVuaXR5LnJl'\n    'cGx5LnYxLlJlcGx5SW5mb1IEcm9vdBJGCghhY3Rpdml0eRgEIAEoCzIqLmJpbGliaWxpLm1haW'\n    '4uY29tbXVuaXR5LnJlcGx5LnYxLkFjdGl2aXR5UghhY3Rpdml0eRJACgVsaWtlcxgFIAEoCzIq'\n    'LmJpbGliaWxpLm1haW4uY29tbXVuaXR5LnJlcGx5LnYxLkxpa2VJbmZvUgVsaWtlcxI6CgRtb2'\n    'RlGAYgASgOMiYuYmlsaWJpbGkubWFpbi5jb21tdW5pdHkucmVwbHkudjEuTW9kZVIEbW9kZRIb'\n    'Cgltb2RlX3RleHQYByABKAlSCG1vZGVUZXh0ElMKEHBhZ2luYXRpb25fcmVwbHkYCCABKAsyKC'\n    '5iaWxpYmlsaS5wYWdpbmF0aW9uLkZlZWRQYWdpbmF0aW9uUmVwbHlSD3BhZ2luYXRpb25SZXBs'\n    'eRIdCgpzZXNzaW9uX2lkGAkgASgJUglzZXNzaW9uSWQSYwoNc3ViamVjdF90aXRsZRgKIAEoCz'\n    'I+LmJpbGliaWxpLm1haW4uY29tbXVuaXR5LnJlcGx5LnYxLkRldGFpbExpc3RSZXBseS5TdWJq'\n    'ZWN0VGl0bGVSDHN1YmplY3RUaXRsZRrOAQoMU3ViamVjdFRpdGxlEhsKCWxlZnRfaWNvbhgBIA'\n    'EoCVIIbGVmdEljb24SFAoFdGl0bGUYAiABKAlSBXRpdGxlEhIKBGxpbmsYAyABKAlSBGxpbmsS'\n    'GwoJcnBpZF9tdXRlGAQgASgDUghycGlkTXV0ZRJaCgtwdXNoX3N3aXRjaBgFIAEoDjI5LmJpbG'\n    'liaWxpLm1haW4uY29tbXVuaXR5LnJlcGx5LnYxLlJlcGx5Tm90aWZpY2F0aW9uU3dpdGNoUgpw'\n    'dXNoU3dpdGNo');\n\n@$core.Deprecated('Use detailListReqDescriptor instead')\nconst DetailListReq$json = {\n  '1': 'DetailListReq',\n  '2': [\n    {'1': 'oid', '3': 1, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'type', '3': 2, '4': 1, '5': 3, '10': 'type'},\n    {'1': 'root', '3': 3, '4': 1, '5': 3, '10': 'root'},\n    {'1': 'rpid', '3': 4, '4': 1, '5': 3, '10': 'rpid'},\n    {\n      '1': 'cursor',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.CursorReq',\n      '10': 'cursor'\n    },\n    {\n      '1': 'scene',\n      '3': 6,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.DetailListScene',\n      '10': 'scene'\n    },\n    {\n      '1': 'mode',\n      '3': 7,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.Mode',\n      '10': 'mode'\n    },\n    {\n      '1': 'pagination',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.pagination.FeedPagination',\n      '10': 'pagination'\n    },\n    {'1': 'extra', '3': 9, '4': 1, '5': 9, '10': 'extra'},\n    {'1': 'ad_extra', '3': 10, '4': 1, '5': 9, '10': 'adExtra'},\n    {\n      '1': 'need_subject_title',\n      '3': 11,\n      '4': 1,\n      '5': 8,\n      '10': 'needSubjectTitle'\n    },\n  ],\n};\n\n/// Descriptor for `DetailListReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List detailListReqDescriptor = $convert.base64Decode(\n    'Cg1EZXRhaWxMaXN0UmVxEhAKA29pZBgBIAEoA1IDb2lkEhIKBHR5cGUYAiABKANSBHR5cGUSEg'\n    'oEcm9vdBgDIAEoA1IEcm9vdBISCgRycGlkGAQgASgDUgRycGlkEkMKBmN1cnNvchgFIAEoCzIr'\n    'LmJpbGliaWxpLm1haW4uY29tbXVuaXR5LnJlcGx5LnYxLkN1cnNvclJlcVIGY3Vyc29yEkcKBX'\n    'NjZW5lGAYgASgOMjEuYmlsaWJpbGkubWFpbi5jb21tdW5pdHkucmVwbHkudjEuRGV0YWlsTGlz'\n    'dFNjZW5lUgVzY2VuZRI6CgRtb2RlGAcgASgOMiYuYmlsaWJpbGkubWFpbi5jb21tdW5pdHkucm'\n    'VwbHkudjEuTW9kZVIEbW9kZRJDCgpwYWdpbmF0aW9uGAggASgLMiMuYmlsaWJpbGkucGFnaW5h'\n    'dGlvbi5GZWVkUGFnaW5hdGlvblIKcGFnaW5hdGlvbhIUCgVleHRyYRgJIAEoCVIFZXh0cmESGQ'\n    'oIYWRfZXh0cmEYCiABKAlSB2FkRXh0cmESLAoSbmVlZF9zdWJqZWN0X3RpdGxlGAsgASgIUhBu'\n    'ZWVkU3ViamVjdFRpdGxl');\n\n@$core.Deprecated('Use dialogListReplyDescriptor instead')\nconst DialogListReply$json = {\n  '1': 'DialogListReply',\n  '2': [\n    {\n      '1': 'cursor',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.CursorReply',\n      '10': 'cursor'\n    },\n    {\n      '1': 'subject_control',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.SubjectControl',\n      '10': 'subjectControl'\n    },\n    {\n      '1': 'replies',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ReplyInfo',\n      '10': 'replies'\n    },\n    {\n      '1': 'activity',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Activity',\n      '10': 'activity'\n    },\n    {\n      '1': 'pagination_reply',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.pagination.FeedPaginationReply',\n      '10': 'paginationReply'\n    },\n    {'1': 'session_id', '3': 6, '4': 1, '5': 9, '10': 'sessionId'},\n  ],\n};\n\n/// Descriptor for `DialogListReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dialogListReplyDescriptor = $convert.base64Decode(\n    'Cg9EaWFsb2dMaXN0UmVwbHkSRQoGY3Vyc29yGAEgASgLMi0uYmlsaWJpbGkubWFpbi5jb21tdW'\n    '5pdHkucmVwbHkudjEuQ3Vyc29yUmVwbHlSBmN1cnNvchJZCg9zdWJqZWN0X2NvbnRyb2wYAiAB'\n    'KAsyMC5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5TdWJqZWN0Q29udHJvbFIOc3'\n    'ViamVjdENvbnRyb2wSRQoHcmVwbGllcxgDIAMoCzIrLmJpbGliaWxpLm1haW4uY29tbXVuaXR5'\n    'LnJlcGx5LnYxLlJlcGx5SW5mb1IHcmVwbGllcxJGCghhY3Rpdml0eRgEIAEoCzIqLmJpbGliaW'\n    'xpLm1haW4uY29tbXVuaXR5LnJlcGx5LnYxLkFjdGl2aXR5UghhY3Rpdml0eRJTChBwYWdpbmF0'\n    'aW9uX3JlcGx5GAUgASgLMiguYmlsaWJpbGkucGFnaW5hdGlvbi5GZWVkUGFnaW5hdGlvblJlcG'\n    'x5Ug9wYWdpbmF0aW9uUmVwbHkSHQoKc2Vzc2lvbl9pZBgGIAEoCVIJc2Vzc2lvbklk');\n\n@$core.Deprecated('Use dialogListReqDescriptor instead')\nconst DialogListReq$json = {\n  '1': 'DialogListReq',\n  '2': [\n    {'1': 'oid', '3': 1, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'type', '3': 2, '4': 1, '5': 3, '10': 'type'},\n    {'1': 'root', '3': 3, '4': 1, '5': 3, '10': 'root'},\n    {'1': 'dialog', '3': 4, '4': 1, '5': 3, '10': 'dialog'},\n    {\n      '1': 'cursor',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.CursorReq',\n      '10': 'cursor'\n    },\n    {\n      '1': 'pagination',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.pagination.FeedPagination',\n      '10': 'pagination'\n    },\n    {'1': 'extra', '3': 7, '4': 1, '5': 9, '10': 'extra'},\n    {'1': 'ad_extra', '3': 8, '4': 1, '5': 9, '10': 'adExtra'},\n  ],\n};\n\n/// Descriptor for `DialogListReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dialogListReqDescriptor = $convert.base64Decode(\n    'Cg1EaWFsb2dMaXN0UmVxEhAKA29pZBgBIAEoA1IDb2lkEhIKBHR5cGUYAiABKANSBHR5cGUSEg'\n    'oEcm9vdBgDIAEoA1IEcm9vdBIWCgZkaWFsb2cYBCABKANSBmRpYWxvZxJDCgZjdXJzb3IYBSAB'\n    'KAsyKy5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5DdXJzb3JSZXFSBmN1cnNvch'\n    'JDCgpwYWdpbmF0aW9uGAYgASgLMiMuYmlsaWJpbGkucGFnaW5hdGlvbi5GZWVkUGFnaW5hdGlv'\n    'blIKcGFnaW5hdGlvbhIUCgVleHRyYRgHIAEoCVIFZXh0cmESGQoIYWRfZXh0cmEYCCABKAlSB2'\n    'FkRXh0cmE=');\n\n@$core.Deprecated('Use doVoteReqDescriptor instead')\nconst DoVoteReq$json = {\n  '1': 'DoVoteReq',\n  '2': [\n    {'1': 'oid', '3': 1, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'type', '3': 2, '4': 1, '5': 3, '10': 'type'},\n    {'1': 'vote_id', '3': 3, '4': 1, '5': 3, '10': 'voteId'},\n    {'1': 'option', '3': 4, '4': 1, '5': 3, '10': 'option'},\n  ],\n};\n\n/// Descriptor for `DoVoteReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List doVoteReqDescriptor = $convert.base64Decode(\n    'CglEb1ZvdGVSZXESEAoDb2lkGAEgASgDUgNvaWQSEgoEdHlwZRgCIAEoA1IEdHlwZRIXCgd2b3'\n    'RlX2lkGAMgASgDUgZ2b3RlSWQSFgoGb3B0aW9uGAQgASgDUgZvcHRpb24=');\n\n@$core.Deprecated('Use doVoteRespDescriptor instead')\nconst DoVoteResp$json = {\n  '1': 'DoVoteResp',\n};\n\n/// Descriptor for `DoVoteResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List doVoteRespDescriptor =\n    $convert.base64Decode('CgpEb1ZvdGVSZXNw');\n\n@$core.Deprecated('Use eSportsGradeCardDescriptor instead')\nconst ESportsGradeCard$json = {\n  '1': 'ESportsGradeCard',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'description', '3': 2, '4': 1, '5': 9, '10': 'description'},\n    {'1': 'image', '3': 3, '4': 1, '5': 9, '10': 'image'},\n    {'1': 'link', '3': 4, '4': 1, '5': 9, '10': 'link'},\n  ],\n};\n\n/// Descriptor for `ESportsGradeCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List eSportsGradeCardDescriptor = $convert.base64Decode(\n    'ChBFU3BvcnRzR3JhZGVDYXJkEhQKBXRpdGxlGAEgASgJUgV0aXRsZRIgCgtkZXNjcmlwdGlvbh'\n    'gCIAEoCVILZGVzY3JpcHRpb24SFAoFaW1hZ2UYAyABKAlSBWltYWdlEhIKBGxpbmsYBCABKAlS'\n    'BGxpbms=');\n\n@$core.Deprecated('Use effectsDescriptor instead')\nconst Effects$json = {\n  '1': 'Effects',\n  '2': [\n    {'1': 'preloading', '3': 1, '4': 1, '5': 9, '10': 'preloading'},\n  ],\n};\n\n/// Descriptor for `Effects`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List effectsDescriptor = $convert\n    .base64Decode('CgdFZmZlY3RzEh4KCnByZWxvYWRpbmcYASABKAlSCnByZWxvYWRpbmc=');\n\n@$core.Deprecated('Use emoteDescriptor instead')\nconst Emote$json = {\n  '1': 'Emote',\n  '2': [\n    {'1': 'size', '3': 1, '4': 1, '5': 3, '10': 'size'},\n    {'1': 'url', '3': 2, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'jump_url', '3': 3, '4': 1, '5': 9, '10': 'jumpUrl'},\n    {'1': 'jump_title', '3': 4, '4': 1, '5': 9, '10': 'jumpTitle'},\n    {'1': 'id', '3': 5, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'package_id', '3': 6, '4': 1, '5': 3, '10': 'packageId'},\n    {'1': 'gif_url', '3': 7, '4': 1, '5': 9, '10': 'gifUrl'},\n    {'1': 'text', '3': 8, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'webp_url', '3': 9, '4': 1, '5': 9, '10': 'webpUrl'},\n  ],\n};\n\n/// Descriptor for `Emote`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List emoteDescriptor = $convert.base64Decode(\n    'CgVFbW90ZRISCgRzaXplGAEgASgDUgRzaXplEhAKA3VybBgCIAEoCVIDdXJsEhkKCGp1bXBfdX'\n    'JsGAMgASgJUgdqdW1wVXJsEh0KCmp1bXBfdGl0bGUYBCABKAlSCWp1bXBUaXRsZRIOCgJpZBgF'\n    'IAEoA1ICaWQSHQoKcGFja2FnZV9pZBgGIAEoA1IJcGFja2FnZUlkEhcKB2dpZl91cmwYByABKA'\n    'lSBmdpZlVybBISCgR0ZXh0GAggASgJUgR0ZXh0EhkKCHdlYnBfdXJsGAkgASgJUgd3ZWJwVXJs');\n\n@$core.Deprecated('Use emptyPageDescriptor instead')\nconst EmptyPage$json = {\n  '1': 'EmptyPage',\n  '2': [\n    {'1': 'image_url', '3': 1, '4': 1, '5': 9, '10': 'imageUrl'},\n    {\n      '1': 'texts',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.EmptyPage.Text',\n      '10': 'texts'\n    },\n    {\n      '1': 'left_button',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.EmptyPage.Button',\n      '10': 'leftButton'\n    },\n    {\n      '1': 'right_button',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.EmptyPage.Button',\n      '10': 'rightButton'\n    },\n  ],\n  '3': [EmptyPage_Button$json, EmptyPage_Text$json],\n  '4': [EmptyPage_Action$json],\n};\n\n@$core.Deprecated('Use emptyPageDescriptor instead')\nconst EmptyPage_Button$json = {\n  '1': 'Button',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'action',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.EmptyPage.Action',\n      '10': 'action'\n    },\n  ],\n};\n\n@$core.Deprecated('Use emptyPageDescriptor instead')\nconst EmptyPage_Text$json = {\n  '1': 'Text',\n  '2': [\n    {'1': 'raw', '3': 1, '4': 1, '5': 9, '10': 'raw'},\n    {\n      '1': 'style',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.TextStyle',\n      '10': 'style'\n    },\n    {\n      '1': 'action',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.EmptyPage.Action',\n      '10': 'action'\n    },\n  ],\n};\n\n@$core.Deprecated('Use emptyPageDescriptor instead')\nconst EmptyPage_Action$json = {\n  '1': 'Action',\n  '2': [\n    {'1': 'UNAVAILABLE', '2': 0},\n    {'1': 'SHOW_KEYBOARD', '2': 1},\n    {'1': 'SEND_REPLY_WITH_BOLD_TEXT', '2': 2},\n  ],\n};\n\n/// Descriptor for `EmptyPage`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List emptyPageDescriptor = $convert.base64Decode(\n    'CglFbXB0eVBhZ2USGwoJaW1hZ2VfdXJsGAEgASgJUghpbWFnZVVybBJGCgV0ZXh0cxgCIAMoCz'\n    'IwLmJpbGliaWxpLm1haW4uY29tbXVuaXR5LnJlcGx5LnYxLkVtcHR5UGFnZS5UZXh0UgV0ZXh0'\n    'cxJTCgtsZWZ0X2J1dHRvbhgDIAEoCzIyLmJpbGliaWxpLm1haW4uY29tbXVuaXR5LnJlcGx5Ln'\n    'YxLkVtcHR5UGFnZS5CdXR0b25SCmxlZnRCdXR0b24SVQoMcmlnaHRfYnV0dG9uGAQgASgLMjIu'\n    'YmlsaWJpbGkubWFpbi5jb21tdW5pdHkucmVwbHkudjEuRW1wdHlQYWdlLkJ1dHRvblILcmlnaH'\n    'RCdXR0b24aagoGQnV0dG9uEhQKBXRpdGxlGAEgASgJUgV0aXRsZRJKCgZhY3Rpb24YAiABKA4y'\n    'Mi5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5FbXB0eVBhZ2UuQWN0aW9uUgZhY3'\n    'Rpb24apwEKBFRleHQSEAoDcmF3GAEgASgJUgNyYXcSQQoFc3R5bGUYAiABKAsyKy5iaWxpYmls'\n    'aS5tYWluLmNvbW11bml0eS5yZXBseS52MS5UZXh0U3R5bGVSBXN0eWxlEkoKBmFjdGlvbhgDIA'\n    'EoDjIyLmJpbGliaWxpLm1haW4uY29tbXVuaXR5LnJlcGx5LnYxLkVtcHR5UGFnZS5BY3Rpb25S'\n    'BmFjdGlvbiJLCgZBY3Rpb24SDwoLVU5BVkFJTEFCTEUQABIRCg1TSE9XX0tFWUJPQVJEEAESHQ'\n    'oZU0VORF9SRVBMWV9XSVRIX0JPTERfVEVYVBAC');\n\n@$core.Deprecated('Use formDescriptor instead')\nconst Form$json = {\n  '1': 'Form',\n  '2': [\n    {'1': 'type', '3': 1, '4': 1, '5': 5, '10': 'type'},\n    {\n      '1': 'options',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.QoeOption',\n      '10': 'options'\n    },\n  ],\n};\n\n/// Descriptor for `Form`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List formDescriptor = $convert.base64Decode(\n    'CgRGb3JtEhIKBHR5cGUYASABKAVSBHR5cGUSRQoHb3B0aW9ucxgCIAMoCzIrLmJpbGliaWxpLm'\n    '1haW4uY29tbXVuaXR5LnJlcGx5LnYxLlFvZU9wdGlvblIHb3B0aW9ucw==');\n\n@$core.Deprecated('Use goodsSearchItemDescriptor instead')\nconst GoodsSearchItem$json = {\n  '1': 'GoodsSearchItem',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'price', '3': 3, '4': 1, '5': 9, '10': 'price'},\n    {'1': 'income', '3': 4, '4': 1, '5': 9, '10': 'income'},\n    {'1': 'img', '3': 5, '4': 1, '5': 9, '10': 'img'},\n    {'1': 'label', '3': 6, '4': 1, '5': 9, '10': 'label'},\n  ],\n};\n\n/// Descriptor for `GoodsSearchItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List goodsSearchItemDescriptor = $convert.base64Decode(\n    'Cg9Hb29kc1NlYXJjaEl0ZW0SDgoCaWQYASABKANSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSFA'\n    'oFcHJpY2UYAyABKAlSBXByaWNlEhYKBmluY29tZRgEIAEoCVIGaW5jb21lEhAKA2ltZxgFIAEo'\n    'CVIDaW1nEhQKBWxhYmVsGAYgASgJUgVsYWJlbA==');\n\n@$core.Deprecated('Use likeInfoDescriptor instead')\nconst LikeInfo$json = {\n  '1': 'LikeInfo',\n  '2': [\n    {\n      '1': 'items',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.LikeInfo.Item',\n      '10': 'items'\n    },\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n  ],\n  '3': [LikeInfo_Item$json],\n};\n\n@$core.Deprecated('Use likeInfoDescriptor instead')\nconst LikeInfo_Item$json = {\n  '1': 'Item',\n  '2': [\n    {\n      '1': 'member',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Member',\n      '10': 'member'\n    },\n  ],\n};\n\n/// Descriptor for `LikeInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List likeInfoDescriptor = $convert.base64Decode(\n    'CghMaWtlSW5mbxJFCgVpdGVtcxgBIAMoCzIvLmJpbGliaWxpLm1haW4uY29tbXVuaXR5LnJlcG'\n    'x5LnYxLkxpa2VJbmZvLkl0ZW1SBWl0ZW1zEhQKBXRpdGxlGAIgASgJUgV0aXRsZRpICgRJdGVt'\n    'EkAKBm1lbWJlchgBIAEoCzIoLmJpbGliaWxpLm1haW4uY29tbXVuaXR5LnJlcGx5LnYxLk1lbW'\n    'JlclIGbWVtYmVy');\n\n@$core.Deprecated('Use lotteryDescriptor instead')\nconst Lottery$json = {\n  '1': 'Lottery',\n  '2': [\n    {'1': 'lottery_id', '3': 1, '4': 1, '5': 3, '10': 'lotteryId'},\n    {'1': 'lottery_status', '3': 2, '4': 1, '5': 3, '10': 'lotteryStatus'},\n    {'1': 'lottery_mid', '3': 3, '4': 1, '5': 3, '10': 'lotteryMid'},\n    {'1': 'lottery_time', '3': 4, '4': 1, '5': 3, '10': 'lotteryTime'},\n    {'1': 'oid', '3': 5, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'type', '3': 6, '4': 1, '5': 3, '10': 'type'},\n    {'1': 'ctime', '3': 7, '4': 1, '5': 3, '10': 'ctime'},\n    {\n      '1': 'content',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Content',\n      '10': 'content'\n    },\n    {\n      '1': 'member',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Member',\n      '10': 'member'\n    },\n    {\n      '1': 'reply_control',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ReplyControl',\n      '10': 'replyControl'\n    },\n  ],\n};\n\n/// Descriptor for `Lottery`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List lotteryDescriptor = $convert.base64Decode(\n    'CgdMb3R0ZXJ5Eh0KCmxvdHRlcnlfaWQYASABKANSCWxvdHRlcnlJZBIlCg5sb3R0ZXJ5X3N0YX'\n    'R1cxgCIAEoA1INbG90dGVyeVN0YXR1cxIfCgtsb3R0ZXJ5X21pZBgDIAEoA1IKbG90dGVyeU1p'\n    'ZBIhCgxsb3R0ZXJ5X3RpbWUYBCABKANSC2xvdHRlcnlUaW1lEhAKA29pZBgFIAEoA1IDb2lkEh'\n    'IKBHR5cGUYBiABKANSBHR5cGUSFAoFY3RpbWUYByABKANSBWN0aW1lEkMKB2NvbnRlbnQYCCAB'\n    'KAsyKS5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5Db250ZW50Ugdjb250ZW50Ek'\n    'AKBm1lbWJlchgJIAEoCzIoLmJpbGliaWxpLm1haW4uY29tbXVuaXR5LnJlcGx5LnYxLk1lbWJl'\n    'clIGbWVtYmVyElMKDXJlcGx5X2NvbnRyb2wYCiABKAsyLi5iaWxpYmlsaS5tYWluLmNvbW11bm'\n    'l0eS5yZXBseS52MS5SZXBseUNvbnRyb2xSDHJlcGx5Q29udHJvbA==');\n\n@$core.Deprecated('Use mainListReplyDescriptor instead')\nconst MainListReply$json = {\n  '1': 'MainListReply',\n  '2': [\n    {\n      '1': 'cursor',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.CursorReply',\n      '10': 'cursor'\n    },\n    {\n      '1': 'replies',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ReplyInfo',\n      '10': 'replies'\n    },\n    {\n      '1': 'subject_control',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.SubjectControl',\n      '10': 'subjectControl'\n    },\n    {\n      '1': 'up_top',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ReplyInfo',\n      '10': 'upTop'\n    },\n    {\n      '1': 'admin_top',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ReplyInfo',\n      '10': 'adminTop'\n    },\n    {\n      '1': 'vote_top',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ReplyInfo',\n      '10': 'voteTop'\n    },\n    {\n      '1': 'notice',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Notice',\n      '10': 'notice'\n    },\n    {\n      '1': 'lottery',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Lottery',\n      '10': 'lottery'\n    },\n    {\n      '1': 'activity',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Activity',\n      '10': 'activity'\n    },\n    {\n      '1': 'up_selection',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.UpSelection',\n      '10': 'upSelection'\n    },\n    {\n      '1': 'cm',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.CM',\n      '10': 'cm'\n    },\n    {\n      '1': 'effects',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Effects',\n      '10': 'effects'\n    },\n    {\n      '1': 'operation',\n      '3': 13,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Operation',\n      '10': 'operation'\n    },\n    {\n      '1': 'top_replies',\n      '3': 14,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ReplyInfo',\n      '10': 'topReplies'\n    },\n    {\n      '1': 'qoe',\n      '3': 15,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.QoeInfo',\n      '10': 'qoe'\n    },\n    {\n      '1': 'callbacks',\n      '3': 16,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.MainListReply.CallbacksEntry',\n      '10': 'callbacks'\n    },\n    {\n      '1': 'operation_v2',\n      '3': 17,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.OperationV2',\n      '10': 'operationV2'\n    },\n    {\n      '1': 'mode',\n      '3': 18,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.Mode',\n      '10': 'mode'\n    },\n    {'1': 'mode_text', '3': 19, '4': 1, '5': 9, '10': 'modeText'},\n    {\n      '1': 'pagination_reply',\n      '3': 20,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.pagination.FeedPaginationReply',\n      '10': 'paginationReply'\n    },\n    {'1': 'session_id', '3': 21, '4': 1, '5': 9, '10': 'sessionId'},\n    {'1': 'report_params', '3': 22, '4': 1, '5': 9, '10': 'reportParams'},\n    {\n      '1': 'vote_card',\n      '3': 23,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.VoteCard',\n      '10': 'voteCard'\n    },\n    {\n      '1': 'esports_grade_card',\n      '3': 24,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ESportsGradeCard',\n      '10': 'esportsGradeCard'\n    },\n    {'1': 'context_feature', '3': 25, '4': 1, '5': 9, '10': 'contextFeature'},\n    {\n      '1': 'pagination_end_text',\n      '3': 26,\n      '4': 1,\n      '5': 9,\n      '10': 'paginationEndText'\n    },\n    {\n      '1': 'mixed_cards',\n      '3': 27,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.MixedCard',\n      '10': 'mixedCards'\n    },\n    {\n      '1': 'subject_top_cards',\n      '3': 28,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.SubjectTopCards',\n      '10': 'subjectTopCards'\n    },\n  ],\n  '3': [MainListReply_CallbacksEntry$json],\n};\n\n@$core.Deprecated('Use mainListReplyDescriptor instead')\nconst MainListReply_CallbacksEntry$json = {\n  '1': 'CallbacksEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 5, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `MainListReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mainListReplyDescriptor = $convert.base64Decode(\n    'Cg1NYWluTGlzdFJlcGx5EkUKBmN1cnNvchgBIAEoCzItLmJpbGliaWxpLm1haW4uY29tbXVuaX'\n    'R5LnJlcGx5LnYxLkN1cnNvclJlcGx5UgZjdXJzb3ISRQoHcmVwbGllcxgCIAMoCzIrLmJpbGli'\n    'aWxpLm1haW4uY29tbXVuaXR5LnJlcGx5LnYxLlJlcGx5SW5mb1IHcmVwbGllcxJZCg9zdWJqZW'\n    'N0X2NvbnRyb2wYAyABKAsyMC5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5TdWJq'\n    'ZWN0Q29udHJvbFIOc3ViamVjdENvbnRyb2wSQgoGdXBfdG9wGAQgASgLMisuYmlsaWJpbGkubW'\n    'Fpbi5jb21tdW5pdHkucmVwbHkudjEuUmVwbHlJbmZvUgV1cFRvcBJICglhZG1pbl90b3AYBSAB'\n    'KAsyKy5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5SZXBseUluZm9SCGFkbWluVG'\n    '9wEkYKCHZvdGVfdG9wGAYgASgLMisuYmlsaWJpbGkubWFpbi5jb21tdW5pdHkucmVwbHkudjEu'\n    'UmVwbHlJbmZvUgd2b3RlVG9wEkAKBm5vdGljZRgHIAEoCzIoLmJpbGliaWxpLm1haW4uY29tbX'\n    'VuaXR5LnJlcGx5LnYxLk5vdGljZVIGbm90aWNlEkMKB2xvdHRlcnkYCCABKAsyKS5iaWxpYmls'\n    'aS5tYWluLmNvbW11bml0eS5yZXBseS52MS5Mb3R0ZXJ5Ugdsb3R0ZXJ5EkYKCGFjdGl2aXR5GA'\n    'kgASgLMiouYmlsaWJpbGkubWFpbi5jb21tdW5pdHkucmVwbHkudjEuQWN0aXZpdHlSCGFjdGl2'\n    'aXR5ElAKDHVwX3NlbGVjdGlvbhgKIAEoCzItLmJpbGliaWxpLm1haW4uY29tbXVuaXR5LnJlcG'\n    'x5LnYxLlVwU2VsZWN0aW9uUgt1cFNlbGVjdGlvbhI0CgJjbRgLIAEoCzIkLmJpbGliaWxpLm1h'\n    'aW4uY29tbXVuaXR5LnJlcGx5LnYxLkNNUgJjbRJDCgdlZmZlY3RzGAwgASgLMikuYmlsaWJpbG'\n    'kubWFpbi5jb21tdW5pdHkucmVwbHkudjEuRWZmZWN0c1IHZWZmZWN0cxJJCglvcGVyYXRpb24Y'\n    'DSABKAsyKy5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5PcGVyYXRpb25SCW9wZX'\n    'JhdGlvbhJMCgt0b3BfcmVwbGllcxgOIAMoCzIrLmJpbGliaWxpLm1haW4uY29tbXVuaXR5LnJl'\n    'cGx5LnYxLlJlcGx5SW5mb1IKdG9wUmVwbGllcxI7CgNxb2UYDyABKAsyKS5iaWxpYmlsaS5tYW'\n    'luLmNvbW11bml0eS5yZXBseS52MS5Rb2VJbmZvUgNxb2USXAoJY2FsbGJhY2tzGBAgAygLMj4u'\n    'YmlsaWJpbGkubWFpbi5jb21tdW5pdHkucmVwbHkudjEuTWFpbkxpc3RSZXBseS5DYWxsYmFja3'\n    'NFbnRyeVIJY2FsbGJhY2tzElAKDG9wZXJhdGlvbl92MhgRIAEoCzItLmJpbGliaWxpLm1haW4u'\n    'Y29tbXVuaXR5LnJlcGx5LnYxLk9wZXJhdGlvblYyUgtvcGVyYXRpb25WMhI6CgRtb2RlGBIgAS'\n    'gOMiYuYmlsaWJpbGkubWFpbi5jb21tdW5pdHkucmVwbHkudjEuTW9kZVIEbW9kZRIbCgltb2Rl'\n    'X3RleHQYEyABKAlSCG1vZGVUZXh0ElMKEHBhZ2luYXRpb25fcmVwbHkYFCABKAsyKC5iaWxpYm'\n    'lsaS5wYWdpbmF0aW9uLkZlZWRQYWdpbmF0aW9uUmVwbHlSD3BhZ2luYXRpb25SZXBseRIdCgpz'\n    'ZXNzaW9uX2lkGBUgASgJUglzZXNzaW9uSWQSIwoNcmVwb3J0X3BhcmFtcxgWIAEoCVIMcmVwb3'\n    'J0UGFyYW1zEkcKCXZvdGVfY2FyZBgXIAEoCzIqLmJpbGliaWxpLm1haW4uY29tbXVuaXR5LnJl'\n    'cGx5LnYxLlZvdGVDYXJkUgh2b3RlQ2FyZBJgChJlc3BvcnRzX2dyYWRlX2NhcmQYGCABKAsyMi'\n    '5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5FU3BvcnRzR3JhZGVDYXJkUhBlc3Bv'\n    'cnRzR3JhZGVDYXJkEicKD2NvbnRleHRfZmVhdHVyZRgZIAEoCVIOY29udGV4dEZlYXR1cmUSLg'\n    'oTcGFnaW5hdGlvbl9lbmRfdGV4dBgaIAEoCVIRcGFnaW5hdGlvbkVuZFRleHQSTAoLbWl4ZWRf'\n    'Y2FyZHMYGyADKAsyKy5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5NaXhlZENhcm'\n    'RSCm1peGVkQ2FyZHMSXQoRc3ViamVjdF90b3BfY2FyZHMYHCADKAsyMS5iaWxpYmlsaS5tYWlu'\n    'LmNvbW11bml0eS5yZXBseS52MS5TdWJqZWN0VG9wQ2FyZHNSD3N1YmplY3RUb3BDYXJkcxo8Cg'\n    '5DYWxsYmFja3NFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoBVIFdmFsdWU6'\n    'AjgB');\n\n@$core.Deprecated('Use mainListReqDescriptor instead')\nconst MainListReq$json = {\n  '1': 'MainListReq',\n  '2': [\n    {'1': 'oid', '3': 1, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'type', '3': 2, '4': 1, '5': 3, '10': 'type'},\n    {\n      '1': 'cursor',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.CursorReq',\n      '10': 'cursor'\n    },\n    {'1': 'extra', '3': 4, '4': 1, '5': 9, '10': 'extra'},\n    {'1': 'ad_extra', '3': 5, '4': 1, '5': 9, '10': 'adExtra'},\n    {'1': 'rpid', '3': 6, '4': 1, '5': 3, '10': 'rpid'},\n    {'1': 'seek_rpid', '3': 7, '4': 1, '5': 3, '10': 'seekRpid'},\n    {'1': 'filter_tag_name', '3': 8, '4': 1, '5': 9, '10': 'filterTagName'},\n    {\n      '1': 'mode',\n      '3': 9,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.Mode',\n      '10': 'mode'\n    },\n    {\n      '1': 'pagination',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.pagination.FeedPagination',\n      '10': 'pagination'\n    },\n    {\n      '1': 'client_recall_rpids',\n      '3': 11,\n      '4': 3,\n      '5': 3,\n      '10': 'clientRecallRpids'\n    },\n    {\n      '1': 'word_search_param',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.WordSearchParam',\n      '10': 'wordSearchParam'\n    },\n  ],\n};\n\n/// Descriptor for `MainListReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mainListReqDescriptor = $convert.base64Decode(\n    'CgtNYWluTGlzdFJlcRIQCgNvaWQYASABKANSA29pZBISCgR0eXBlGAIgASgDUgR0eXBlEkMKBm'\n    'N1cnNvchgDIAEoCzIrLmJpbGliaWxpLm1haW4uY29tbXVuaXR5LnJlcGx5LnYxLkN1cnNvclJl'\n    'cVIGY3Vyc29yEhQKBWV4dHJhGAQgASgJUgVleHRyYRIZCghhZF9leHRyYRgFIAEoCVIHYWRFeH'\n    'RyYRISCgRycGlkGAYgASgDUgRycGlkEhsKCXNlZWtfcnBpZBgHIAEoA1IIc2Vla1JwaWQSJgoP'\n    'ZmlsdGVyX3RhZ19uYW1lGAggASgJUg1maWx0ZXJUYWdOYW1lEjoKBG1vZGUYCSABKA4yJi5iaW'\n    'xpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5Nb2RlUgRtb2RlEkMKCnBhZ2luYXRpb24Y'\n    'CiABKAsyIy5iaWxpYmlsaS5wYWdpbmF0aW9uLkZlZWRQYWdpbmF0aW9uUgpwYWdpbmF0aW9uEi'\n    '4KE2NsaWVudF9yZWNhbGxfcnBpZHMYCyADKANSEWNsaWVudFJlY2FsbFJwaWRzEl0KEXdvcmRf'\n    'c2VhcmNoX3BhcmFtGAwgASgLMjEuYmlsaWJpbGkubWFpbi5jb21tdW5pdHkucmVwbHkudjEuV2'\n    '9yZFNlYXJjaFBhcmFtUg93b3JkU2VhcmNoUGFyYW0=');\n\n@$core.Deprecated('Use memberDescriptor instead')\nconst Member$json = {\n  '1': 'Member',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'sex', '3': 3, '4': 1, '5': 9, '10': 'sex'},\n    {'1': 'face', '3': 4, '4': 1, '5': 9, '10': 'face'},\n    {'1': 'level', '3': 5, '4': 1, '5': 3, '10': 'level'},\n    {\n      '1': 'official_verify_type',\n      '3': 6,\n      '4': 1,\n      '5': 3,\n      '10': 'officialVerifyType'\n    },\n    {'1': 'vip_type', '3': 7, '4': 1, '5': 3, '10': 'vipType'},\n    {'1': 'vip_status', '3': 8, '4': 1, '5': 3, '10': 'vipStatus'},\n    {'1': 'vip_theme_type', '3': 9, '4': 1, '5': 3, '10': 'vipThemeType'},\n    {'1': 'vip_label_path', '3': 10, '4': 1, '5': 9, '10': 'vipLabelPath'},\n    {\n      '1': 'garb_pendant_image',\n      '3': 11,\n      '4': 1,\n      '5': 9,\n      '10': 'garbPendantImage'\n    },\n    {'1': 'garb_card_image', '3': 12, '4': 1, '5': 9, '10': 'garbCardImage'},\n    {\n      '1': 'garb_card_image_with_focus',\n      '3': 13,\n      '4': 1,\n      '5': 9,\n      '10': 'garbCardImageWithFocus'\n    },\n    {\n      '1': 'garb_card_jump_url',\n      '3': 14,\n      '4': 1,\n      '5': 9,\n      '10': 'garbCardJumpUrl'\n    },\n    {'1': 'garb_card_number', '3': 15, '4': 1, '5': 9, '10': 'garbCardNumber'},\n    {\n      '1': 'garb_card_fan_color',\n      '3': 16,\n      '4': 1,\n      '5': 9,\n      '10': 'garbCardFanColor'\n    },\n    {'1': 'garb_card_is_fan', '3': 17, '4': 1, '5': 8, '10': 'garbCardIsFan'},\n    {'1': 'fans_medal_name', '3': 18, '4': 1, '5': 9, '10': 'fansMedalName'},\n    {'1': 'fans_medal_level', '3': 19, '4': 1, '5': 3, '10': 'fansMedalLevel'},\n    {'1': 'fans_medal_color', '3': 20, '4': 1, '5': 3, '10': 'fansMedalColor'},\n    {\n      '1': 'vip_nickname_color',\n      '3': 21,\n      '4': 1,\n      '5': 9,\n      '10': 'vipNicknameColor'\n    },\n    {\n      '1': 'vip_avatar_subscript',\n      '3': 22,\n      '4': 1,\n      '5': 5,\n      '10': 'vipAvatarSubscript'\n    },\n    {'1': 'vip_label_text', '3': 23, '4': 1, '5': 9, '10': 'vipLabelText'},\n    {'1': 'vip_label_theme', '3': 24, '4': 1, '5': 9, '10': 'vipLabelTheme'},\n    {\n      '1': 'fans_medal_color_end',\n      '3': 25,\n      '4': 1,\n      '5': 3,\n      '10': 'fansMedalColorEnd'\n    },\n    {\n      '1': 'fans_medal_color_border',\n      '3': 26,\n      '4': 1,\n      '5': 3,\n      '10': 'fansMedalColorBorder'\n    },\n    {\n      '1': 'fans_medal_color_name',\n      '3': 27,\n      '4': 1,\n      '5': 3,\n      '10': 'fansMedalColorName'\n    },\n    {\n      '1': 'fans_medal_color_level',\n      '3': 28,\n      '4': 1,\n      '5': 3,\n      '10': 'fansMedalColorLevel'\n    },\n    {'1': 'fans_guard_level', '3': 29, '4': 1, '5': 3, '10': 'fansGuardLevel'},\n    {'1': 'face_nft', '3': 30, '4': 1, '5': 5, '10': 'faceNft'},\n    {'1': 'face_nft_new', '3': 31, '4': 1, '5': 5, '10': 'faceNftNew'},\n    {'1': 'is_senior_member', '3': 32, '4': 1, '5': 5, '10': 'isSeniorMember'},\n    {\n      '1': 'nft_interaction',\n      '3': 33,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Member.NftInteraction',\n      '10': 'nftInteraction'\n    },\n    {'1': 'fans_guard_icon', '3': 34, '4': 1, '5': 9, '10': 'fansGuardIcon'},\n    {'1': 'fans_honor_icon', '3': 35, '4': 1, '5': 9, '10': 'fansHonorIcon'},\n  ],\n  '3': [Member_NftInteraction$json],\n};\n\n@$core.Deprecated('Use memberDescriptor instead')\nconst Member_NftInteraction$json = {\n  '1': 'NftInteraction',\n  '2': [\n    {'1': 'itype', '3': 1, '4': 1, '5': 9, '10': 'itype'},\n    {'1': 'metadata_url', '3': 2, '4': 1, '5': 9, '10': 'metadataUrl'},\n    {'1': 'nft_id', '3': 3, '4': 1, '5': 9, '10': 'nftId'},\n    {\n      '1': 'region',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Member.NftInteraction.Region',\n      '10': 'region'\n    },\n  ],\n  '3': [Member_NftInteraction_Region$json],\n  '4': [\n    Member_NftInteraction_RegionType$json,\n    Member_NftInteraction_ShowStatus$json\n  ],\n};\n\n@$core.Deprecated('Use memberDescriptor instead')\nconst Member_NftInteraction_Region$json = {\n  '1': 'Region',\n  '2': [\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.Member.NftInteraction.RegionType',\n      '10': 'type'\n    },\n    {'1': 'icon', '3': 2, '4': 1, '5': 9, '10': 'icon'},\n    {\n      '1': 'show_status',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.Member.NftInteraction.ShowStatus',\n      '10': 'showStatus'\n    },\n  ],\n};\n\n@$core.Deprecated('Use memberDescriptor instead')\nconst Member_NftInteraction_RegionType$json = {\n  '1': 'RegionType',\n  '2': [\n    {'1': 'DEFAULT', '2': 0},\n    {'1': 'MAINLAND', '2': 1},\n    {'1': 'GAT', '2': 2},\n  ],\n};\n\n@$core.Deprecated('Use memberDescriptor instead')\nconst Member_NftInteraction_ShowStatus$json = {\n  '1': 'ShowStatus',\n  '2': [\n    {'1': 'SHOWDEFAULT', '2': 0},\n    {'1': 'ZOOMINMAINLAND', '2': 1},\n    {'1': 'RAW', '2': 2},\n  ],\n};\n\n/// Descriptor for `Member`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List memberDescriptor = $convert.base64Decode(\n    'CgZNZW1iZXISEAoDbWlkGAEgASgDUgNtaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIQCgNzZXgYAy'\n    'ABKAlSA3NleBISCgRmYWNlGAQgASgJUgRmYWNlEhQKBWxldmVsGAUgASgDUgVsZXZlbBIwChRv'\n    'ZmZpY2lhbF92ZXJpZnlfdHlwZRgGIAEoA1ISb2ZmaWNpYWxWZXJpZnlUeXBlEhkKCHZpcF90eX'\n    'BlGAcgASgDUgd2aXBUeXBlEh0KCnZpcF9zdGF0dXMYCCABKANSCXZpcFN0YXR1cxIkCg52aXBf'\n    'dGhlbWVfdHlwZRgJIAEoA1IMdmlwVGhlbWVUeXBlEiQKDnZpcF9sYWJlbF9wYXRoGAogASgJUg'\n    'x2aXBMYWJlbFBhdGgSLAoSZ2FyYl9wZW5kYW50X2ltYWdlGAsgASgJUhBnYXJiUGVuZGFudElt'\n    'YWdlEiYKD2dhcmJfY2FyZF9pbWFnZRgMIAEoCVINZ2FyYkNhcmRJbWFnZRI6ChpnYXJiX2Nhcm'\n    'RfaW1hZ2Vfd2l0aF9mb2N1cxgNIAEoCVIWZ2FyYkNhcmRJbWFnZVdpdGhGb2N1cxIrChJnYXJi'\n    'X2NhcmRfanVtcF91cmwYDiABKAlSD2dhcmJDYXJkSnVtcFVybBIoChBnYXJiX2NhcmRfbnVtYm'\n    'VyGA8gASgJUg5nYXJiQ2FyZE51bWJlchItChNnYXJiX2NhcmRfZmFuX2NvbG9yGBAgASgJUhBn'\n    'YXJiQ2FyZEZhbkNvbG9yEicKEGdhcmJfY2FyZF9pc19mYW4YESABKAhSDWdhcmJDYXJkSXNGYW'\n    '4SJgoPZmFuc19tZWRhbF9uYW1lGBIgASgJUg1mYW5zTWVkYWxOYW1lEigKEGZhbnNfbWVkYWxf'\n    'bGV2ZWwYEyABKANSDmZhbnNNZWRhbExldmVsEigKEGZhbnNfbWVkYWxfY29sb3IYFCABKANSDm'\n    'ZhbnNNZWRhbENvbG9yEiwKEnZpcF9uaWNrbmFtZV9jb2xvchgVIAEoCVIQdmlwTmlja25hbWVD'\n    'b2xvchIwChR2aXBfYXZhdGFyX3N1YnNjcmlwdBgWIAEoBVISdmlwQXZhdGFyU3Vic2NyaXB0Ei'\n    'QKDnZpcF9sYWJlbF90ZXh0GBcgASgJUgx2aXBMYWJlbFRleHQSJgoPdmlwX2xhYmVsX3RoZW1l'\n    'GBggASgJUg12aXBMYWJlbFRoZW1lEi8KFGZhbnNfbWVkYWxfY29sb3JfZW5kGBkgASgDUhFmYW'\n    '5zTWVkYWxDb2xvckVuZBI1ChdmYW5zX21lZGFsX2NvbG9yX2JvcmRlchgaIAEoA1IUZmFuc01l'\n    'ZGFsQ29sb3JCb3JkZXISMQoVZmFuc19tZWRhbF9jb2xvcl9uYW1lGBsgASgDUhJmYW5zTWVkYW'\n    'xDb2xvck5hbWUSMwoWZmFuc19tZWRhbF9jb2xvcl9sZXZlbBgcIAEoA1ITZmFuc01lZGFsQ29s'\n    'b3JMZXZlbBIoChBmYW5zX2d1YXJkX2xldmVsGB0gASgDUg5mYW5zR3VhcmRMZXZlbBIZCghmYW'\n    'NlX25mdBgeIAEoBVIHZmFjZU5mdBIgCgxmYWNlX25mdF9uZXcYHyABKAVSCmZhY2VOZnROZXcS'\n    'KAoQaXNfc2VuaW9yX21lbWJlchggIAEoBVIOaXNTZW5pb3JNZW1iZXISYAoPbmZ0X2ludGVyYW'\n    'N0aW9uGCEgASgLMjcuYmlsaWJpbGkubWFpbi5jb21tdW5pdHkucmVwbHkudjEuTWVtYmVyLk5m'\n    'dEludGVyYWN0aW9uUg5uZnRJbnRlcmFjdGlvbhImCg9mYW5zX2d1YXJkX2ljb24YIiABKAlSDW'\n    'ZhbnNHdWFyZEljb24SJgoPZmFuc19ob25vcl9pY29uGCMgASgJUg1mYW5zSG9ub3JJY29uGoIE'\n    'Cg5OZnRJbnRlcmFjdGlvbhIUCgVpdHlwZRgBIAEoCVIFaXR5cGUSIQoMbWV0YWRhdGFfdXJsGA'\n    'IgASgJUgttZXRhZGF0YVVybBIVCgZuZnRfaWQYAyABKAlSBW5mdElkElYKBnJlZ2lvbhgEIAEo'\n    'CzI+LmJpbGliaWxpLm1haW4uY29tbXVuaXR5LnJlcGx5LnYxLk1lbWJlci5OZnRJbnRlcmFjdG'\n    'lvbi5SZWdpb25SBnJlZ2lvbhrZAQoGUmVnaW9uElYKBHR5cGUYASABKA4yQi5iaWxpYmlsaS5t'\n    'YWluLmNvbW11bml0eS5yZXBseS52MS5NZW1iZXIuTmZ0SW50ZXJhY3Rpb24uUmVnaW9uVHlwZV'\n    'IEdHlwZRISCgRpY29uGAIgASgJUgRpY29uEmMKC3Nob3dfc3RhdHVzGAMgASgOMkIuYmlsaWJp'\n    'bGkubWFpbi5jb21tdW5pdHkucmVwbHkudjEuTWVtYmVyLk5mdEludGVyYWN0aW9uLlNob3dTdG'\n    'F0dXNSCnNob3dTdGF0dXMiMAoKUmVnaW9uVHlwZRILCgdERUZBVUxUEAASDAoITUFJTkxBTkQQ'\n    'ARIHCgNHQVQQAiI6CgpTaG93U3RhdHVzEg8KC1NIT1dERUZBVUxUEAASEgoOWk9PTUlOTUFJTk'\n    'xBTkQQARIHCgNSQVcQAg==');\n\n@$core.Deprecated('Use memberV2Descriptor instead')\nconst MemberV2$json = {\n  '1': 'MemberV2',\n  '2': [\n    {\n      '1': 'basic',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.MemberV2.Basic',\n      '10': 'basic'\n    },\n    {\n      '1': 'official',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.MemberV2.Official',\n      '10': 'official'\n    },\n    {\n      '1': 'vip',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.MemberV2.Vip',\n      '10': 'vip'\n    },\n    {\n      '1': 'garb',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.MemberV2.Garb',\n      '10': 'garb'\n    },\n    {\n      '1': 'medal',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.MemberV2.Medal',\n      '10': 'medal'\n    },\n    {\n      '1': 'nft',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.MemberV2.Nft',\n      '10': 'nft'\n    },\n    {\n      '1': 'senior',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.MemberV2.Senior',\n      '10': 'senior'\n    },\n    {\n      '1': 'contractor',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.MemberV2.Contractor',\n      '10': 'contractor'\n    },\n    {\n      '1': 'user_sailing',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.vas.garb.model.UserSailing',\n      '10': 'userSailing'\n    },\n  ],\n  '3': [\n    MemberV2_Basic$json,\n    MemberV2_Contractor$json,\n    MemberV2_Garb$json,\n    MemberV2_Medal$json,\n    MemberV2_Nft$json,\n    MemberV2_Official$json,\n    MemberV2_Senior$json,\n    MemberV2_Vip$json\n  ],\n};\n\n@$core.Deprecated('Use memberV2Descriptor instead')\nconst MemberV2_Basic$json = {\n  '1': 'Basic',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'sex', '3': 3, '4': 1, '5': 9, '10': 'sex'},\n    {'1': 'face', '3': 4, '4': 1, '5': 9, '10': 'face'},\n    {'1': 'level', '3': 5, '4': 1, '5': 3, '10': 'level'},\n    {\n      '1': 'avatar_item',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.dagw.component.avatar.v1.AvatarItem',\n      '10': 'avatarItem'\n    },\n    {\n      '1': 'name_render',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.account.service.v1.NameRender',\n      '10': 'nameRender'\n    },\n  ],\n};\n\n@$core.Deprecated('Use memberV2Descriptor instead')\nconst MemberV2_Contractor$json = {\n  '1': 'Contractor',\n  '2': [\n    {'1': 'is_contractor', '3': 1, '4': 1, '5': 8, '10': 'isContractor'},\n    {'1': 'contract_desc', '3': 2, '4': 1, '5': 9, '10': 'contractDesc'},\n  ],\n};\n\n@$core.Deprecated('Use memberV2Descriptor instead')\nconst MemberV2_Garb$json = {\n  '1': 'Garb',\n  '2': [\n    {'1': 'pendant_image', '3': 1, '4': 1, '5': 9, '10': 'pendantImage'},\n    {'1': 'card_image', '3': 2, '4': 1, '5': 9, '10': 'cardImage'},\n    {\n      '1': 'card_image_with_focus',\n      '3': 3,\n      '4': 1,\n      '5': 9,\n      '10': 'cardImageWithFocus'\n    },\n    {'1': 'card_jump_url', '3': 4, '4': 1, '5': 9, '10': 'cardJumpUrl'},\n    {'1': 'card_number', '3': 5, '4': 1, '5': 9, '10': 'cardNumber'},\n    {'1': 'card_fan_color', '3': 6, '4': 1, '5': 9, '10': 'cardFanColor'},\n    {'1': 'card_is_fan', '3': 7, '4': 1, '5': 8, '10': 'cardIsFan'},\n    {'1': 'fan_num_prefix', '3': 8, '4': 1, '5': 9, '10': 'fanNumPrefix'},\n    {\n      '1': 'fan_num_color_format',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.MemberV2.Garb.FanNumColorFormat',\n      '10': 'fanNumColorFormat'\n    },\n  ],\n  '3': [MemberV2_Garb_FanNumColorFormat$json],\n};\n\n@$core.Deprecated('Use memberV2Descriptor instead')\nconst MemberV2_Garb_FanNumColorFormat$json = {\n  '1': 'FanNumColorFormat',\n  '2': [\n    {'1': 'start_point', '3': 1, '4': 1, '5': 9, '10': 'startPoint'},\n    {'1': 'end_point', '3': 2, '4': 1, '5': 9, '10': 'endPoint'},\n    {'1': 'colors', '3': 3, '4': 3, '5': 9, '10': 'colors'},\n    {'1': 'gradients', '3': 4, '4': 3, '5': 3, '10': 'gradients'},\n  ],\n};\n\n@$core.Deprecated('Use memberV2Descriptor instead')\nconst MemberV2_Medal$json = {\n  '1': 'Medal',\n  '2': [\n    {'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'level', '3': 2, '4': 1, '5': 3, '10': 'level'},\n    {'1': 'color_start', '3': 3, '4': 1, '5': 3, '10': 'colorStart'},\n    {'1': 'color_end', '3': 4, '4': 1, '5': 3, '10': 'colorEnd'},\n    {'1': 'color_border', '3': 5, '4': 1, '5': 3, '10': 'colorBorder'},\n    {'1': 'color_name', '3': 6, '4': 1, '5': 3, '10': 'colorName'},\n    {'1': 'color_level', '3': 7, '4': 1, '5': 3, '10': 'colorLevel'},\n    {'1': 'guard_level', '3': 8, '4': 1, '5': 3, '10': 'guardLevel'},\n    {'1': 'first_icon', '3': 9, '4': 1, '5': 9, '10': 'firstIcon'},\n    {'1': 'second_icon', '3': 10, '4': 1, '5': 9, '10': 'secondIcon'},\n    {'1': 'level_bg_color', '3': 11, '4': 1, '5': 3, '10': 'levelBgColor'},\n  ],\n};\n\n@$core.Deprecated('Use memberV2Descriptor instead')\nconst MemberV2_Nft$json = {\n  '1': 'Nft',\n  '2': [\n    {'1': 'face', '3': 1, '4': 1, '5': 5, '10': 'face'},\n    {\n      '1': 'interaction',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.MemberV2.Nft.Interaction',\n      '10': 'interaction'\n    },\n  ],\n  '3': [MemberV2_Nft_Interaction$json],\n};\n\n@$core.Deprecated('Use memberV2Descriptor instead')\nconst MemberV2_Nft_Interaction$json = {\n  '1': 'Interaction',\n  '2': [\n    {'1': 'itype', '3': 1, '4': 1, '5': 9, '10': 'itype'},\n    {'1': 'metadata_url', '3': 2, '4': 1, '5': 9, '10': 'metadataUrl'},\n    {'1': 'nft_id', '3': 3, '4': 1, '5': 9, '10': 'nftId'},\n    {\n      '1': 'region',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.MemberV2.Nft.Interaction.Region',\n      '10': 'region'\n    },\n  ],\n  '3': [MemberV2_Nft_Interaction_Region$json],\n  '4': [\n    MemberV2_Nft_Interaction_RegionType$json,\n    MemberV2_Nft_Interaction_ShowStatus$json\n  ],\n};\n\n@$core.Deprecated('Use memberV2Descriptor instead')\nconst MemberV2_Nft_Interaction_Region$json = {\n  '1': 'Region',\n  '2': [\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6':\n          '.bilibili.main.community.reply.v1.MemberV2.Nft.Interaction.RegionType',\n      '10': 'type'\n    },\n    {'1': 'icon', '3': 2, '4': 1, '5': 9, '10': 'icon'},\n    {\n      '1': 'show_status',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6':\n          '.bilibili.main.community.reply.v1.MemberV2.Nft.Interaction.ShowStatus',\n      '10': 'showStatus'\n    },\n  ],\n};\n\n@$core.Deprecated('Use memberV2Descriptor instead')\nconst MemberV2_Nft_Interaction_RegionType$json = {\n  '1': 'RegionType',\n  '2': [\n    {'1': 'DEFAULT_RegionType', '2': 0},\n    {'1': 'MAINLAND_RegionType', '2': 1},\n    {'1': 'GAT_RegionType', '2': 2},\n  ],\n};\n\n@$core.Deprecated('Use memberV2Descriptor instead')\nconst MemberV2_Nft_Interaction_ShowStatus$json = {\n  '1': 'ShowStatus',\n  '2': [\n    {'1': 'SHOWDEFAULT_ShowStatus', '2': 0},\n    {'1': 'ZOOMINMAINLAND_ShowStatus', '2': 1},\n    {'1': 'RAW_ShowStatus', '2': 2},\n  ],\n};\n\n@$core.Deprecated('Use memberV2Descriptor instead')\nconst MemberV2_Official$json = {\n  '1': 'Official',\n  '2': [\n    {'1': 'verify_type', '3': 1, '4': 1, '5': 3, '10': 'verifyType'},\n  ],\n};\n\n@$core.Deprecated('Use memberV2Descriptor instead')\nconst MemberV2_Senior$json = {\n  '1': 'Senior',\n  '2': [\n    {'1': 'is_senior_member', '3': 1, '4': 1, '5': 5, '10': 'isSeniorMember'},\n    {\n      '1': 'status',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.MemberV2.Senior.Status',\n      '10': 'status'\n    },\n  ],\n  '4': [MemberV2_Senior_Status$json],\n};\n\n@$core.Deprecated('Use memberV2Descriptor instead')\nconst MemberV2_Senior_Status$json = {\n  '1': 'Status',\n  '2': [\n    {'1': 'Normal', '2': 0},\n    {'1': 'Pending', '2': 1},\n    {'1': 'Senior', '2': 2},\n    {'1': 'WillExpire', '2': 3},\n    {'1': 'Expired', '2': 4},\n  ],\n};\n\n@$core.Deprecated('Use memberV2Descriptor instead')\nconst MemberV2_Vip$json = {\n  '1': 'Vip',\n  '2': [\n    {'1': 'type', '3': 1, '4': 1, '5': 3, '10': 'type'},\n    {'1': 'status', '3': 2, '4': 1, '5': 3, '10': 'status'},\n    {'1': 'theme_type', '3': 3, '4': 1, '5': 3, '10': 'themeType'},\n    {'1': 'label_path', '3': 4, '4': 1, '5': 9, '10': 'labelPath'},\n    {'1': 'nickname_color', '3': 5, '4': 1, '5': 9, '10': 'nicknameColor'},\n    {'1': 'avatar_subscript', '3': 6, '4': 1, '5': 5, '10': 'avatarSubscript'},\n    {'1': 'label_text', '3': 7, '4': 1, '5': 9, '10': 'labelText'},\n    {'1': 'vip_label_theme', '3': 8, '4': 1, '5': 9, '10': 'vipLabelTheme'},\n  ],\n};\n\n/// Descriptor for `MemberV2`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List memberV2Descriptor = $convert.base64Decode(\n    'CghNZW1iZXJWMhJGCgViYXNpYxgBIAEoCzIwLmJpbGliaWxpLm1haW4uY29tbXVuaXR5LnJlcG'\n    'x5LnYxLk1lbWJlclYyLkJhc2ljUgViYXNpYxJPCghvZmZpY2lhbBgCIAEoCzIzLmJpbGliaWxp'\n    'Lm1haW4uY29tbXVuaXR5LnJlcGx5LnYxLk1lbWJlclYyLk9mZmljaWFsUghvZmZpY2lhbBJACg'\n    'N2aXAYAyABKAsyLi5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5NZW1iZXJWMi5W'\n    'aXBSA3ZpcBJDCgRnYXJiGAQgASgLMi8uYmlsaWJpbGkubWFpbi5jb21tdW5pdHkucmVwbHkudj'\n    'EuTWVtYmVyVjIuR2FyYlIEZ2FyYhJGCgVtZWRhbBgFIAEoCzIwLmJpbGliaWxpLm1haW4uY29t'\n    'bXVuaXR5LnJlcGx5LnYxLk1lbWJlclYyLk1lZGFsUgVtZWRhbBJACgNuZnQYBiABKAsyLi5iaW'\n    'xpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5NZW1iZXJWMi5OZnRSA25mdBJJCgZzZW5p'\n    'b3IYByABKAsyMS5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5NZW1iZXJWMi5TZW'\n    '5pb3JSBnNlbmlvchJVCgpjb250cmFjdG9yGAggASgLMjUuYmlsaWJpbGkubWFpbi5jb21tdW5p'\n    'dHkucmVwbHkudjEuTWVtYmVyVjIuQ29udHJhY3RvclIKY29udHJhY3RvchJHCgx1c2VyX3NhaW'\n    'xpbmcYCSABKAsyJC5iaWxpYmlsaS52YXMuZ2FyYi5tb2RlbC5Vc2VyU2FpbGluZ1ILdXNlclNh'\n    'aWxpbmcagwIKBUJhc2ljEhAKA21pZBgBIAEoA1IDbWlkEhIKBG5hbWUYAiABKAlSBG5hbWUSEA'\n    'oDc2V4GAMgASgJUgNzZXgSEgoEZmFjZRgEIAEoCVIEZmFjZRIUCgVsZXZlbBgFIAEoA1IFbGV2'\n    'ZWwSTgoLYXZhdGFyX2l0ZW0YBiABKAsyLS5iaWxpYmlsaS5kYWd3LmNvbXBvbmVudC5hdmF0YX'\n    'IudjEuQXZhdGFySXRlbVIKYXZhdGFySXRlbRJICgtuYW1lX3JlbmRlchgHIAEoCzInLmJpbGli'\n    'aWxpLmFjY291bnQuc2VydmljZS52MS5OYW1lUmVuZGVyUgpuYW1lUmVuZGVyGlYKCkNvbnRyYW'\n    'N0b3ISIwoNaXNfY29udHJhY3RvchgBIAEoCFIMaXNDb250cmFjdG9yEiMKDWNvbnRyYWN0X2Rl'\n    'c2MYAiABKAlSDGNvbnRyYWN0RGVzYxqsBAoER2FyYhIjCg1wZW5kYW50X2ltYWdlGAEgASgJUg'\n    'xwZW5kYW50SW1hZ2USHQoKY2FyZF9pbWFnZRgCIAEoCVIJY2FyZEltYWdlEjEKFWNhcmRfaW1h'\n    'Z2Vfd2l0aF9mb2N1cxgDIAEoCVISY2FyZEltYWdlV2l0aEZvY3VzEiIKDWNhcmRfanVtcF91cm'\n    'wYBCABKAlSC2NhcmRKdW1wVXJsEh8KC2NhcmRfbnVtYmVyGAUgASgJUgpjYXJkTnVtYmVyEiQK'\n    'DmNhcmRfZmFuX2NvbG9yGAYgASgJUgxjYXJkRmFuQ29sb3ISHgoLY2FyZF9pc19mYW4YByABKA'\n    'hSCWNhcmRJc0ZhbhIkCg5mYW5fbnVtX3ByZWZpeBgIIAEoCVIMZmFuTnVtUHJlZml4EnIKFGZh'\n    'bl9udW1fY29sb3JfZm9ybWF0GAkgASgLMkEuYmlsaWJpbGkubWFpbi5jb21tdW5pdHkucmVwbH'\n    'kudjEuTWVtYmVyVjIuR2FyYi5GYW5OdW1Db2xvckZvcm1hdFIRZmFuTnVtQ29sb3JGb3JtYXQa'\n    'hwEKEUZhbk51bUNvbG9yRm9ybWF0Eh8KC3N0YXJ0X3BvaW50GAEgASgJUgpzdGFydFBvaW50Eh'\n    'sKCWVuZF9wb2ludBgCIAEoCVIIZW5kUG9pbnQSFgoGY29sb3JzGAMgAygJUgZjb2xvcnMSHAoJ'\n    'Z3JhZGllbnRzGAQgAygDUglncmFkaWVudHMa2QIKBU1lZGFsEhIKBG5hbWUYASABKAlSBG5hbW'\n    'USFAoFbGV2ZWwYAiABKANSBWxldmVsEh8KC2NvbG9yX3N0YXJ0GAMgASgDUgpjb2xvclN0YXJ0'\n    'EhsKCWNvbG9yX2VuZBgEIAEoA1IIY29sb3JFbmQSIQoMY29sb3JfYm9yZGVyGAUgASgDUgtjb2'\n    'xvckJvcmRlchIdCgpjb2xvcl9uYW1lGAYgASgDUgljb2xvck5hbWUSHwoLY29sb3JfbGV2ZWwY'\n    'ByABKANSCmNvbG9yTGV2ZWwSHwoLZ3VhcmRfbGV2ZWwYCCABKANSCmd1YXJkTGV2ZWwSHQoKZm'\n    'lyc3RfaWNvbhgJIAEoCVIJZmlyc3RJY29uEh8KC3NlY29uZF9pY29uGAogASgJUgpzZWNvbmRJ'\n    'Y29uEiQKDmxldmVsX2JnX2NvbG9yGAsgASgDUgxsZXZlbEJnQ29sb3IaxAUKA05mdBISCgRmYW'\n    'NlGAEgASgFUgRmYWNlElwKC2ludGVyYWN0aW9uGAIgASgLMjouYmlsaWJpbGkubWFpbi5jb21t'\n    'dW5pdHkucmVwbHkudjEuTWVtYmVyVjIuTmZ0LkludGVyYWN0aW9uUgtpbnRlcmFjdGlvbhrKBA'\n    'oLSW50ZXJhY3Rpb24SFAoFaXR5cGUYASABKAlSBWl0eXBlEiEKDG1ldGFkYXRhX3VybBgCIAEo'\n    'CVILbWV0YWRhdGFVcmwSFQoGbmZ0X2lkGAMgASgJUgVuZnRJZBJZCgZyZWdpb24YBCABKAsyQS'\n    '5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5NZW1iZXJWMi5OZnQuSW50ZXJhY3Rp'\n    'b24uUmVnaW9uUgZyZWdpb24a3wEKBlJlZ2lvbhJZCgR0eXBlGAEgASgOMkUuYmlsaWJpbGkubW'\n    'Fpbi5jb21tdW5pdHkucmVwbHkudjEuTWVtYmVyVjIuTmZ0LkludGVyYWN0aW9uLlJlZ2lvblR5'\n    'cGVSBHR5cGUSEgoEaWNvbhgCIAEoCVIEaWNvbhJmCgtzaG93X3N0YXR1cxgDIAEoDjJFLmJpbG'\n    'liaWxpLm1haW4uY29tbXVuaXR5LnJlcGx5LnYxLk1lbWJlclYyLk5mdC5JbnRlcmFjdGlvbi5T'\n    'aG93U3RhdHVzUgpzaG93U3RhdHVzIlEKClJlZ2lvblR5cGUSFgoSREVGQVVMVF9SZWdpb25UeX'\n    'BlEAASFwoTTUFJTkxBTkRfUmVnaW9uVHlwZRABEhIKDkdBVF9SZWdpb25UeXBlEAIiWwoKU2hv'\n    'd1N0YXR1cxIaChZTSE9XREVGQVVMVF9TaG93U3RhdHVzEAASHQoZWk9PTUlOTUFJTkxBTkRfU2'\n    'hvd1N0YXR1cxABEhIKDlJBV19TaG93U3RhdHVzEAIaKwoIT2ZmaWNpYWwSHwoLdmVyaWZ5X3R5'\n    'cGUYASABKANSCnZlcmlmeVR5cGUa0AEKBlNlbmlvchIoChBpc19zZW5pb3JfbWVtYmVyGAEgAS'\n    'gFUg5pc1Nlbmlvck1lbWJlchJQCgZzdGF0dXMYAiABKA4yOC5iaWxpYmlsaS5tYWluLmNvbW11'\n    'bml0eS5yZXBseS52MS5NZW1iZXJWMi5TZW5pb3IuU3RhdHVzUgZzdGF0dXMiSgoGU3RhdHVzEg'\n    'oKBk5vcm1hbBAAEgsKB1BlbmRpbmcQARIKCgZTZW5pb3IQAhIOCgpXaWxsRXhwaXJlEAMSCwoH'\n    'RXhwaXJlZBAEGogCCgNWaXASEgoEdHlwZRgBIAEoA1IEdHlwZRIWCgZzdGF0dXMYAiABKANSBn'\n    'N0YXR1cxIdCgp0aGVtZV90eXBlGAMgASgDUgl0aGVtZVR5cGUSHQoKbGFiZWxfcGF0aBgEIAEo'\n    'CVIJbGFiZWxQYXRoEiUKDm5pY2tuYW1lX2NvbG9yGAUgASgJUg1uaWNrbmFtZUNvbG9yEikKEG'\n    'F2YXRhcl9zdWJzY3JpcHQYBiABKAVSD2F2YXRhclN1YnNjcmlwdBIdCgpsYWJlbF90ZXh0GAcg'\n    'ASgJUglsYWJlbFRleHQSJgoPdmlwX2xhYmVsX3RoZW1lGAggASgJUg12aXBMYWJlbFRoZW1l');\n\n@$core.Deprecated('Use mixedCardDescriptor instead')\nconst MixedCard$json = {\n  '1': 'MixedCard',\n  '2': [\n    {\n      '1': 'question',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.QuestionCard',\n      '9': 0,\n      '10': 'question'\n    },\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.MixedCard.Type',\n      '10': 'type'\n    },\n    {'1': 'oid', '3': 2, '4': 1, '5': 9, '10': 'oid'},\n    {'1': 'display_rank', '3': 3, '4': 1, '5': 3, '10': 'displayRank'},\n  ],\n  '4': [MixedCard_Type$json],\n  '8': [\n    {'1': 'item'},\n  ],\n};\n\n@$core.Deprecated('Use mixedCardDescriptor instead')\nconst MixedCard_Type$json = {\n  '1': 'Type',\n  '2': [\n    {'1': 'UNKNOWN', '2': 0},\n    {'1': 'QUESTION', '2': 1},\n  ],\n};\n\n/// Descriptor for `MixedCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mixedCardDescriptor = $convert.base64Decode(\n    'CglNaXhlZENhcmQSTAoIcXVlc3Rpb24YBCABKAsyLi5iaWxpYmlsaS5tYWluLmNvbW11bml0eS'\n    '5yZXBseS52MS5RdWVzdGlvbkNhcmRIAFIIcXVlc3Rpb24SRAoEdHlwZRgBIAEoDjIwLmJpbGli'\n    'aWxpLm1haW4uY29tbXVuaXR5LnJlcGx5LnYxLk1peGVkQ2FyZC5UeXBlUgR0eXBlEhAKA29pZB'\n    'gCIAEoCVIDb2lkEiEKDGRpc3BsYXlfcmFuaxgDIAEoA1ILZGlzcGxheVJhbmsiIQoEVHlwZRIL'\n    'CgdVTktOT1dOEAASDAoIUVVFU1RJT04QAUIGCgRpdGVt');\n\n@$core.Deprecated('Use noticeDescriptor instead')\nconst Notice$json = {\n  '1': 'Notice',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'content', '3': 2, '4': 1, '5': 9, '10': 'content'},\n    {'1': 'link', '3': 3, '4': 1, '5': 9, '10': 'link'},\n  ],\n};\n\n/// Descriptor for `Notice`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List noticeDescriptor = $convert.base64Decode(\n    'CgZOb3RpY2USDgoCaWQYASABKANSAmlkEhgKB2NvbnRlbnQYAiABKAlSB2NvbnRlbnQSEgoEbG'\n    'luaxgDIAEoCVIEbGluaw==');\n\n@$core.Deprecated('Use ogvGradeCardDescriptor instead')\nconst OgvGradeCard$json = {\n  '1': 'OgvGradeCard',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'sub_title', '3': 2, '4': 1, '5': 9, '10': 'subTitle'},\n    {'1': 'button_text', '3': 3, '4': 1, '5': 9, '10': 'buttonText'},\n    {'1': 'goto_url', '3': 4, '4': 1, '5': 9, '10': 'gotoUrl'},\n  ],\n};\n\n/// Descriptor for `OgvGradeCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List ogvGradeCardDescriptor = $convert.base64Decode(\n    'CgxPZ3ZHcmFkZUNhcmQSFAoFdGl0bGUYASABKAlSBXRpdGxlEhsKCXN1Yl90aXRsZRgCIAEoCV'\n    'IIc3ViVGl0bGUSHwoLYnV0dG9uX3RleHQYAyABKAlSCmJ1dHRvblRleHQSGQoIZ290b191cmwY'\n    'BCABKAlSB2dvdG9Vcmw=');\n\n@$core.Deprecated('Use operationDescriptor instead')\nconst Operation$json = {\n  '1': 'Operation',\n  '2': [\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.Operation.Type',\n      '10': 'type'\n    },\n    {'1': 'id', '3': 2, '4': 1, '5': 3, '10': 'id'},\n    {\n      '1': 'title',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.OperationTitle',\n      '10': 'title'\n    },\n    {\n      '1': 'subtitle',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.OperationTitle',\n      '10': 'subtitle'\n    },\n    {'1': 'link', '3': 5, '4': 1, '5': 9, '10': 'link'},\n    {'1': 'report_extra', '3': 6, '4': 1, '5': 9, '10': 'reportExtra'},\n    {'1': 'icon', '3': 7, '4': 1, '5': 9, '10': 'icon'},\n  ],\n  '4': [Operation_Type$json],\n};\n\n@$core.Deprecated('Use operationDescriptor instead')\nconst Operation_Type$json = {\n  '1': 'Type',\n  '2': [\n    {'1': 'UNKNOWN_Type', '2': 0},\n    {'1': 'NOTE', '2': 1},\n    {'1': 'TOPIC', '2': 2},\n    {'1': 'NOTICE', '2': 3},\n  ],\n};\n\n/// Descriptor for `Operation`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List operationDescriptor = $convert.base64Decode(\n    'CglPcGVyYXRpb24SRAoEdHlwZRgBIAEoDjIwLmJpbGliaWxpLm1haW4uY29tbXVuaXR5LnJlcG'\n    'x5LnYxLk9wZXJhdGlvbi5UeXBlUgR0eXBlEg4KAmlkGAIgASgDUgJpZBJGCgV0aXRsZRgDIAEo'\n    'CzIwLmJpbGliaWxpLm1haW4uY29tbXVuaXR5LnJlcGx5LnYxLk9wZXJhdGlvblRpdGxlUgV0aX'\n    'RsZRJMCghzdWJ0aXRsZRgEIAEoCzIwLmJpbGliaWxpLm1haW4uY29tbXVuaXR5LnJlcGx5LnYx'\n    'Lk9wZXJhdGlvblRpdGxlUghzdWJ0aXRsZRISCgRsaW5rGAUgASgJUgRsaW5rEiEKDHJlcG9ydF'\n    '9leHRyYRgGIAEoCVILcmVwb3J0RXh0cmESEgoEaWNvbhgHIAEoCVIEaWNvbiI5CgRUeXBlEhAK'\n    'DFVOS05PV05fVHlwZRAAEggKBE5PVEUQARIJCgVUT1BJQxACEgoKBk5PVElDRRAD');\n\n@$core.Deprecated('Use operationTitleDescriptor instead')\nconst OperationTitle$json = {\n  '1': 'OperationTitle',\n  '2': [\n    {'1': 'content', '3': 1, '4': 1, '5': 9, '10': 'content'},\n    {'1': 'is_highlight', '3': 2, '4': 1, '5': 8, '10': 'isHighlight'},\n  ],\n};\n\n/// Descriptor for `OperationTitle`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List operationTitleDescriptor = $convert.base64Decode(\n    'Cg5PcGVyYXRpb25UaXRsZRIYCgdjb250ZW50GAEgASgJUgdjb250ZW50EiEKDGlzX2hpZ2hsaW'\n    'dodBgCIAEoCFILaXNIaWdobGlnaHQ=');\n\n@$core.Deprecated('Use operationV2Descriptor instead')\nconst OperationV2$json = {\n  '1': 'OperationV2',\n  '2': [\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.OperationV2.Type',\n      '10': 'type'\n    },\n    {'1': 'prefix_text', '3': 2, '4': 1, '5': 9, '10': 'prefixText'},\n    {\n      '1': 'icon',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.OperationV2.Icon',\n      '10': 'icon'\n    },\n    {'1': 'title', '3': 4, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'link', '3': 5, '4': 1, '5': 9, '10': 'link'},\n    {'1': 'report_extra', '3': 6, '4': 1, '5': 9, '10': 'reportExtra'},\n  ],\n  '3': [OperationV2_Icon$json],\n  '4': [OperationV2_Type$json],\n};\n\n@$core.Deprecated('Use operationV2Descriptor instead')\nconst OperationV2_Icon$json = {\n  '1': 'Icon',\n  '2': [\n    {\n      '1': 'position',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.OperationV2.Icon.Position',\n      '10': 'position'\n    },\n    {'1': 'url', '3': 2, '4': 1, '5': 9, '10': 'url'},\n  ],\n  '4': [OperationV2_Icon_Position$json],\n};\n\n@$core.Deprecated('Use operationV2Descriptor instead')\nconst OperationV2_Icon_Position$json = {\n  '1': 'Position',\n  '2': [\n    {'1': 'PREFIX', '2': 0},\n    {'1': 'SUFFIX', '2': 1},\n  ],\n};\n\n@$core.Deprecated('Use operationV2Descriptor instead')\nconst OperationV2_Type$json = {\n  '1': 'Type',\n  '2': [\n    {'1': 'UNKNOWN_Type', '2': 0},\n    {'1': 'NOTE_Type', '2': 1},\n    {'1': 'TOPIC_Type', '2': 2},\n    {'1': 'SEARCH', '2': 4},\n  ],\n};\n\n/// Descriptor for `OperationV2`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List operationV2Descriptor = $convert.base64Decode(\n    'CgtPcGVyYXRpb25WMhJGCgR0eXBlGAEgASgOMjIuYmlsaWJpbGkubWFpbi5jb21tdW5pdHkucm'\n    'VwbHkudjEuT3BlcmF0aW9uVjIuVHlwZVIEdHlwZRIfCgtwcmVmaXhfdGV4dBgCIAEoCVIKcHJl'\n    'Zml4VGV4dBJGCgRpY29uGAMgASgLMjIuYmlsaWJpbGkubWFpbi5jb21tdW5pdHkucmVwbHkudj'\n    'EuT3BlcmF0aW9uVjIuSWNvblIEaWNvbhIUCgV0aXRsZRgEIAEoCVIFdGl0bGUSEgoEbGluaxgF'\n    'IAEoCVIEbGluaxIhCgxyZXBvcnRfZXh0cmEYBiABKAlSC3JlcG9ydEV4dHJhGpUBCgRJY29uEl'\n    'cKCHBvc2l0aW9uGAEgASgOMjsuYmlsaWJpbGkubWFpbi5jb21tdW5pdHkucmVwbHkudjEuT3Bl'\n    'cmF0aW9uVjIuSWNvbi5Qb3NpdGlvblIIcG9zaXRpb24SEAoDdXJsGAIgASgJUgN1cmwiIgoIUG'\n    '9zaXRpb24SCgoGUFJFRklYEAASCgoGU1VGRklYEAEiQwoEVHlwZRIQCgxVTktOT1dOX1R5cGUQ'\n    'ABINCglOT1RFX1R5cGUQARIOCgpUT1BJQ19UeXBlEAISCgoGU0VBUkNIEAQ=');\n\n@$core.Deprecated('Use pGCVideoSearchItemDescriptor instead')\nconst PGCVideoSearchItem$json = {\n  '1': 'PGCVideoSearchItem',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'category', '3': 2, '4': 1, '5': 9, '10': 'category'},\n    {'1': 'cover', '3': 3, '4': 1, '5': 9, '10': 'cover'},\n  ],\n};\n\n/// Descriptor for `PGCVideoSearchItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pGCVideoSearchItemDescriptor = $convert.base64Decode(\n    'ChJQR0NWaWRlb1NlYXJjaEl0ZW0SFAoFdGl0bGUYASABKAlSBXRpdGxlEhoKCGNhdGVnb3J5GA'\n    'IgASgJUghjYXRlZ29yeRIUCgVjb3ZlchgDIAEoCVIFY292ZXI=');\n\n@$core.Deprecated('Use pictureDescriptor instead')\nconst Picture$json = {\n  '1': 'Picture',\n  '2': [\n    {'1': 'img_src', '3': 1, '4': 1, '5': 9, '10': 'imgSrc'},\n    {'1': 'img_width', '3': 2, '4': 1, '5': 1, '10': 'imgWidth'},\n    {'1': 'img_height', '3': 3, '4': 1, '5': 1, '10': 'imgHeight'},\n    {'1': 'img_size', '3': 4, '4': 1, '5': 1, '10': 'imgSize'},\n    {'1': 'top_right_icon', '3': 5, '4': 1, '5': 9, '10': 'topRightIcon'},\n    {\n      '1': 'play_gif_thumbnail',\n      '3': 6,\n      '4': 1,\n      '5': 8,\n      '10': 'playGifThumbnail'\n    },\n  ],\n};\n\n/// Descriptor for `Picture`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pictureDescriptor = $convert.base64Decode(\n    'CgdQaWN0dXJlEhcKB2ltZ19zcmMYASABKAlSBmltZ1NyYxIbCglpbWdfd2lkdGgYAiABKAFSCG'\n    'ltZ1dpZHRoEh0KCmltZ19oZWlnaHQYAyABKAFSCWltZ0hlaWdodBIZCghpbWdfc2l6ZRgEIAEo'\n    'AVIHaW1nU2l6ZRIkCg50b3BfcmlnaHRfaWNvbhgFIAEoCVIMdG9wUmlnaHRJY29uEiwKEnBsYX'\n    'lfZ2lmX3RodW1ibmFpbBgGIAEoCFIQcGxheUdpZlRodW1ibmFpbA==');\n\n@$core.Deprecated('Use pictureListReqDescriptor instead')\nconst PictureListReq$json = {\n  '1': 'PictureListReq',\n  '2': [\n    {'1': 'oid', '3': 1, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'type', '3': 2, '4': 1, '5': 3, '10': 'type'},\n    {'1': 'extra', '3': 3, '4': 1, '5': 9, '10': 'extra'},\n    {'1': 'after_rpid', '3': 4, '4': 1, '5': 3, '10': 'afterRpid'},\n    {\n      '1': 'mode',\n      '3': 5,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.Mode',\n      '10': 'mode'\n    },\n    {\n      '1': 'pagination',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.pagination.FeedPagination',\n      '10': 'pagination'\n    },\n    {'1': 'session_id', '3': 7, '4': 1, '5': 9, '10': 'sessionId'},\n    {\n      '1': 'main_list_session_id',\n      '3': 8,\n      '4': 1,\n      '5': 9,\n      '10': 'mainListSessionId'\n    },\n  ],\n};\n\n/// Descriptor for `PictureListReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pictureListReqDescriptor = $convert.base64Decode(\n    'Cg5QaWN0dXJlTGlzdFJlcRIQCgNvaWQYASABKANSA29pZBISCgR0eXBlGAIgASgDUgR0eXBlEh'\n    'QKBWV4dHJhGAMgASgJUgVleHRyYRIdCgphZnRlcl9ycGlkGAQgASgDUglhZnRlclJwaWQSOgoE'\n    'bW9kZRgFIAEoDjImLmJpbGliaWxpLm1haW4uY29tbXVuaXR5LnJlcGx5LnYxLk1vZGVSBG1vZG'\n    'USQwoKcGFnaW5hdGlvbhgGIAEoCzIjLmJpbGliaWxpLnBhZ2luYXRpb24uRmVlZFBhZ2luYXRp'\n    'b25SCnBhZ2luYXRpb24SHQoKc2Vzc2lvbl9pZBgHIAEoCVIJc2Vzc2lvbklkEi8KFG1haW5fbG'\n    'lzdF9zZXNzaW9uX2lkGAggASgJUhFtYWluTGlzdFNlc3Npb25JZA==');\n\n@$core.Deprecated('Use pictureListRespDescriptor instead')\nconst PictureListResp$json = {\n  '1': 'PictureListResp',\n  '2': [\n    {\n      '1': 'replies',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ReplyInfo',\n      '10': 'replies'\n    },\n    {\n      '1': 'pagination_reply',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.pagination.FeedPaginationReply',\n      '10': 'paginationReply'\n    },\n    {'1': 'session_id', '3': 3, '4': 1, '5': 9, '10': 'sessionId'},\n    {'1': 'report_params', '3': 4, '4': 1, '5': 9, '10': 'reportParams'},\n    {'1': 'context_feature', '3': 5, '4': 1, '5': 9, '10': 'contextFeature'},\n    {\n      '1': 'pagination_end_text',\n      '3': 6,\n      '4': 1,\n      '5': 9,\n      '10': 'paginationEndText'\n    },\n  ],\n};\n\n/// Descriptor for `PictureListResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List pictureListRespDescriptor = $convert.base64Decode(\n    'Cg9QaWN0dXJlTGlzdFJlc3ASRQoHcmVwbGllcxgBIAMoCzIrLmJpbGliaWxpLm1haW4uY29tbX'\n    'VuaXR5LnJlcGx5LnYxLlJlcGx5SW5mb1IHcmVwbGllcxJTChBwYWdpbmF0aW9uX3JlcGx5GAIg'\n    'ASgLMiguYmlsaWJpbGkucGFnaW5hdGlvbi5GZWVkUGFnaW5hdGlvblJlcGx5Ug9wYWdpbmF0aW'\n    '9uUmVwbHkSHQoKc2Vzc2lvbl9pZBgDIAEoCVIJc2Vzc2lvbklkEiMKDXJlcG9ydF9wYXJhbXMY'\n    'BCABKAlSDHJlcG9ydFBhcmFtcxInCg9jb250ZXh0X2ZlYXR1cmUYBSABKAlSDmNvbnRleHRGZW'\n    'F0dXJlEi4KE3BhZ2luYXRpb25fZW5kX3RleHQYBiABKAlSEXBhZ2luYXRpb25FbmRUZXh0');\n\n@$core.Deprecated('Use previewListReplyDescriptor instead')\nconst PreviewListReply$json = {\n  '1': 'PreviewListReply',\n  '2': [\n    {\n      '1': 'cursor',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.CursorReply',\n      '10': 'cursor'\n    },\n    {\n      '1': 'replies',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ReplyInfo',\n      '10': 'replies'\n    },\n    {\n      '1': 'subject_control',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.SubjectControl',\n      '10': 'subjectControl'\n    },\n    {\n      '1': 'up_top',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ReplyInfo',\n      '10': 'upTop'\n    },\n    {\n      '1': 'admin_top',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ReplyInfo',\n      '10': 'adminTop'\n    },\n    {\n      '1': 'vote_top',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ReplyInfo',\n      '10': 'voteTop'\n    },\n  ],\n};\n\n/// Descriptor for `PreviewListReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List previewListReplyDescriptor = $convert.base64Decode(\n    'ChBQcmV2aWV3TGlzdFJlcGx5EkUKBmN1cnNvchgBIAEoCzItLmJpbGliaWxpLm1haW4uY29tbX'\n    'VuaXR5LnJlcGx5LnYxLkN1cnNvclJlcGx5UgZjdXJzb3ISRQoHcmVwbGllcxgCIAMoCzIrLmJp'\n    'bGliaWxpLm1haW4uY29tbXVuaXR5LnJlcGx5LnYxLlJlcGx5SW5mb1IHcmVwbGllcxJZCg9zdW'\n    'JqZWN0X2NvbnRyb2wYAyABKAsyMC5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5T'\n    'dWJqZWN0Q29udHJvbFIOc3ViamVjdENvbnRyb2wSQgoGdXBfdG9wGAQgASgLMisuYmlsaWJpbG'\n    'kubWFpbi5jb21tdW5pdHkucmVwbHkudjEuUmVwbHlJbmZvUgV1cFRvcBJICglhZG1pbl90b3AY'\n    'BSABKAsyKy5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5SZXBseUluZm9SCGFkbW'\n    'luVG9wEkYKCHZvdGVfdG9wGAYgASgLMisuYmlsaWJpbGkubWFpbi5jb21tdW5pdHkucmVwbHku'\n    'djEuUmVwbHlJbmZvUgd2b3RlVG9w');\n\n@$core.Deprecated('Use previewListReqDescriptor instead')\nconst PreviewListReq$json = {\n  '1': 'PreviewListReq',\n  '2': [\n    {'1': 'oid', '3': 1, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'type', '3': 2, '4': 1, '5': 3, '10': 'type'},\n    {\n      '1': 'cursor',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.CursorReq',\n      '10': 'cursor'\n    },\n  ],\n};\n\n/// Descriptor for `PreviewListReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List previewListReqDescriptor = $convert.base64Decode(\n    'Cg5QcmV2aWV3TGlzdFJlcRIQCgNvaWQYASABKANSA29pZBISCgR0eXBlGAIgASgDUgR0eXBlEk'\n    'MKBmN1cnNvchgDIAEoCzIrLmJpbGliaWxpLm1haW4uY29tbXVuaXR5LnJlcGx5LnYxLkN1cnNv'\n    'clJlcVIGY3Vyc29y');\n\n@$core.Deprecated('Use qoeInfoDescriptor instead')\nconst QoeInfo$json = {\n  '1': 'QoeInfo',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'type', '3': 2, '4': 1, '5': 5, '10': 'type'},\n    {'1': 'style', '3': 3, '4': 1, '5': 5, '10': 'style'},\n    {'1': 'title', '3': 4, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'feedback_title', '3': 5, '4': 1, '5': 9, '10': 'feedbackTitle'},\n    {\n      '1': 'score_items',\n      '3': 6,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.QoeScoreItem',\n      '10': 'scoreItems'\n    },\n    {'1': 'display_rank', '3': 7, '4': 1, '5': 3, '10': 'displayRank'},\n    {\n      '1': 'form',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Form',\n      '10': 'form'\n    },\n  ],\n};\n\n/// Descriptor for `QoeInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List qoeInfoDescriptor = $convert.base64Decode(\n    'CgdRb2VJbmZvEg4KAmlkGAEgASgDUgJpZBISCgR0eXBlGAIgASgFUgR0eXBlEhQKBXN0eWxlGA'\n    'MgASgFUgVzdHlsZRIUCgV0aXRsZRgEIAEoCVIFdGl0bGUSJQoOZmVlZGJhY2tfdGl0bGUYBSAB'\n    'KAlSDWZlZWRiYWNrVGl0bGUSTwoLc2NvcmVfaXRlbXMYBiADKAsyLi5iaWxpYmlsaS5tYWluLm'\n    'NvbW11bml0eS5yZXBseS52MS5Rb2VTY29yZUl0ZW1SCnNjb3JlSXRlbXMSIQoMZGlzcGxheV9y'\n    'YW5rGAcgASgDUgtkaXNwbGF5UmFuaxI6CgRmb3JtGAggASgLMiYuYmlsaWJpbGkubWFpbi5jb2'\n    '1tdW5pdHkucmVwbHkudjEuRm9ybVIEZm9ybQ==');\n\n@$core.Deprecated('Use qoeOptionDescriptor instead')\nconst QoeOption$json = {\n  '1': 'QoeOption',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'score', '3': 2, '4': 1, '5': 2, '10': 'score'},\n    {'1': 'img_url', '3': 3, '4': 1, '5': 9, '10': 'imgUrl'},\n    {'1': 'desc', '3': 4, '4': 3, '5': 9, '10': 'desc'},\n  ],\n};\n\n/// Descriptor for `QoeOption`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List qoeOptionDescriptor = $convert.base64Decode(\n    'CglRb2VPcHRpb24SFAoFdGl0bGUYASABKAlSBXRpdGxlEhQKBXNjb3JlGAIgASgCUgVzY29yZR'\n    'IXCgdpbWdfdXJsGAMgASgJUgZpbWdVcmwSEgoEZGVzYxgEIAMoCVIEZGVzYw==');\n\n@$core.Deprecated('Use qoeOptionDescDescriptor instead')\nconst QoeOptionDesc$json = {\n  '1': 'QoeOptionDesc',\n  '2': [\n    {'1': 'desc', '3': 1, '4': 3, '5': 9, '10': 'desc'},\n  ],\n};\n\n/// Descriptor for `QoeOptionDesc`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List qoeOptionDescDescriptor =\n    $convert.base64Decode('Cg1Rb2VPcHRpb25EZXNjEhIKBGRlc2MYASADKAlSBGRlc2M=');\n\n@$core.Deprecated('Use qoeScoreItemDescriptor instead')\nconst QoeScoreItem$json = {\n  '1': 'QoeScoreItem',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'url', '3': 2, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'score', '3': 3, '4': 1, '5': 2, '10': 'score'},\n  ],\n};\n\n/// Descriptor for `QoeScoreItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List qoeScoreItemDescriptor = $convert.base64Decode(\n    'CgxRb2VTY29yZUl0ZW0SFAoFdGl0bGUYASABKAlSBXRpdGxlEhAKA3VybBgCIAEoCVIDdXJsEh'\n    'QKBXNjb3JlGAMgASgCUgVzY29yZQ==');\n\n@$core.Deprecated('Use questionCardDescriptor instead')\nconst QuestionCard$json = {\n  '1': 'QuestionCard',\n  '2': [\n    {\n      '1': 'question',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.QuestionCard.Question',\n      '10': 'question'\n    },\n    {\n      '1': 'stat',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.QuestionCardStat',\n      '10': 'stat'\n    },\n    {'1': 'bottom_text', '3': 3, '4': 1, '5': 9, '10': 'bottomText'},\n  ],\n  '3': [QuestionCard_Option$json, QuestionCard_Question$json],\n};\n\n@$core.Deprecated('Use questionCardDescriptor instead')\nconst QuestionCard_Option$json = {\n  '1': 'Option',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n  ],\n};\n\n@$core.Deprecated('Use questionCardDescriptor instead')\nconst QuestionCard_Question$json = {\n  '1': 'Question',\n  '2': [\n    {'1': 'qid', '3': 1, '4': 1, '5': 3, '10': 'qid'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'must_right', '3': 3, '4': 1, '5': 8, '10': 'mustRight'},\n    {\n      '1': 'options',\n      '3': 4,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.QuestionCard.Option',\n      '10': 'options'\n    },\n  ],\n};\n\n/// Descriptor for `QuestionCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List questionCardDescriptor = $convert.base64Decode(\n    'CgxRdWVzdGlvbkNhcmQSUwoIcXVlc3Rpb24YASABKAsyNy5iaWxpYmlsaS5tYWluLmNvbW11bm'\n    'l0eS5yZXBseS52MS5RdWVzdGlvbkNhcmQuUXVlc3Rpb25SCHF1ZXN0aW9uEkYKBHN0YXQYAiAB'\n    'KAsyMi5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5RdWVzdGlvbkNhcmRTdGF0Ug'\n    'RzdGF0Eh8KC2JvdHRvbV90ZXh0GAMgASgJUgpib3R0b21UZXh0GjAKBk9wdGlvbhIQCgNrZXkY'\n    'ASABKAlSA2tleRIUCgV0aXRsZRgCIAEoCVIFdGl0bGUaogEKCFF1ZXN0aW9uEhAKA3FpZBgBIA'\n    'EoA1IDcWlkEhQKBXRpdGxlGAIgASgJUgV0aXRsZRIdCgptdXN0X3JpZ2h0GAMgASgIUgltdXN0'\n    'UmlnaHQSTwoHb3B0aW9ucxgEIAMoCzI1LmJpbGliaWxpLm1haW4uY29tbXVuaXR5LnJlcGx5Ln'\n    'YxLlF1ZXN0aW9uQ2FyZC5PcHRpb25SB29wdGlvbnM=');\n\n@$core.Deprecated('Use questionCardStatDescriptor instead')\nconst QuestionCardStat$json = {\n  '1': 'QuestionCardStat',\n  '2': [\n    {'1': 'right_cnt', '3': 1, '4': 1, '5': 3, '10': 'rightCnt'},\n    {'1': 'right_mid_cnt', '3': 2, '4': 1, '5': 3, '10': 'rightMidCnt'},\n    {'1': 'submit_mid_cnt', '3': 3, '4': 1, '5': 3, '10': 'submitMidCnt'},\n  ],\n};\n\n/// Descriptor for `QuestionCardStat`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List questionCardStatDescriptor = $convert.base64Decode(\n    'ChBRdWVzdGlvbkNhcmRTdGF0EhsKCXJpZ2h0X2NudBgBIAEoA1IIcmlnaHRDbnQSIgoNcmlnaH'\n    'RfbWlkX2NudBgCIAEoA1ILcmlnaHRNaWRDbnQSJAoOc3VibWl0X21pZF9jbnQYAyABKANSDHN1'\n    'Ym1pdE1pZENudA==');\n\n@$core.Deprecated('Use replyCardLabelDescriptor instead')\nconst ReplyCardLabel$json = {\n  '1': 'ReplyCardLabel',\n  '2': [\n    {'1': 'text_content', '3': 1, '4': 1, '5': 9, '10': 'textContent'},\n    {'1': 'text_color_day', '3': 2, '4': 1, '5': 9, '10': 'textColorDay'},\n    {'1': 'text_color_night', '3': 3, '4': 1, '5': 9, '10': 'textColorNight'},\n    {'1': 'label_color_day', '3': 4, '4': 1, '5': 9, '10': 'labelColorDay'},\n    {'1': 'label_color_night', '3': 5, '4': 1, '5': 9, '10': 'labelColorNight'},\n    {'1': 'image', '3': 6, '4': 1, '5': 9, '10': 'image'},\n    {\n      '1': 'type',\n      '3': 7,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.ReplyCardLabel.Type',\n      '10': 'type'\n    },\n    {'1': 'background', '3': 8, '4': 1, '5': 9, '10': 'background'},\n    {'1': 'background_width', '3': 9, '4': 1, '5': 1, '10': 'backgroundWidth'},\n    {\n      '1': 'background_height',\n      '3': 10,\n      '4': 1,\n      '5': 1,\n      '10': 'backgroundHeight'\n    },\n    {'1': 'jump_url', '3': 11, '4': 1, '5': 9, '10': 'jumpUrl'},\n    {'1': 'effect', '3': 12, '4': 1, '5': 3, '10': 'effect'},\n    {\n      '1': 'effect_start_time',\n      '3': 13,\n      '4': 1,\n      '5': 3,\n      '10': 'effectStartTime'\n    },\n  ],\n  '4': [ReplyCardLabel_Type$json],\n};\n\n@$core.Deprecated('Use replyCardLabelDescriptor instead')\nconst ReplyCardLabel_Type$json = {\n  '1': 'Type',\n  '2': [\n    {'1': 'UNDERLINE', '2': 0},\n    {'1': 'BACKGROUND', '2': 1},\n  ],\n};\n\n/// Descriptor for `ReplyCardLabel`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List replyCardLabelDescriptor = $convert.base64Decode(\n    'Cg5SZXBseUNhcmRMYWJlbBIhCgx0ZXh0X2NvbnRlbnQYASABKAlSC3RleHRDb250ZW50EiQKDn'\n    'RleHRfY29sb3JfZGF5GAIgASgJUgx0ZXh0Q29sb3JEYXkSKAoQdGV4dF9jb2xvcl9uaWdodBgD'\n    'IAEoCVIOdGV4dENvbG9yTmlnaHQSJgoPbGFiZWxfY29sb3JfZGF5GAQgASgJUg1sYWJlbENvbG'\n    '9yRGF5EioKEWxhYmVsX2NvbG9yX25pZ2h0GAUgASgJUg9sYWJlbENvbG9yTmlnaHQSFAoFaW1h'\n    'Z2UYBiABKAlSBWltYWdlEkkKBHR5cGUYByABKA4yNS5iaWxpYmlsaS5tYWluLmNvbW11bml0eS'\n    '5yZXBseS52MS5SZXBseUNhcmRMYWJlbC5UeXBlUgR0eXBlEh4KCmJhY2tncm91bmQYCCABKAlS'\n    'CmJhY2tncm91bmQSKQoQYmFja2dyb3VuZF93aWR0aBgJIAEoAVIPYmFja2dyb3VuZFdpZHRoEi'\n    'sKEWJhY2tncm91bmRfaGVpZ2h0GAogASgBUhBiYWNrZ3JvdW5kSGVpZ2h0EhkKCGp1bXBfdXJs'\n    'GAsgASgJUgdqdW1wVXJsEhYKBmVmZmVjdBgMIAEoA1IGZWZmZWN0EioKEWVmZmVjdF9zdGFydF'\n    '90aW1lGA0gASgDUg9lZmZlY3RTdGFydFRpbWUiJQoEVHlwZRINCglVTkRFUkxJTkUQABIOCgpC'\n    'QUNLR1JPVU5EEAE=');\n\n@$core.Deprecated('Use replyControlDescriptor instead')\nconst ReplyControl$json = {\n  '1': 'ReplyControl',\n  '2': [\n    {'1': 'action', '3': 1, '4': 1, '5': 3, '10': 'action'},\n    {'1': 'up_like', '3': 2, '4': 1, '5': 8, '10': 'upLike'},\n    {'1': 'up_reply', '3': 3, '4': 1, '5': 8, '10': 'upReply'},\n    {'1': 'show_follow_btn', '3': 4, '4': 1, '5': 8, '10': 'showFollowBtn'},\n    {'1': 'is_assist', '3': 5, '4': 1, '5': 8, '10': 'isAssist'},\n    {'1': 'label_text', '3': 6, '4': 1, '5': 9, '10': 'labelText'},\n    {'1': 'following', '3': 7, '4': 1, '5': 8, '10': 'following'},\n    {'1': 'followed', '3': 8, '4': 1, '5': 8, '10': 'followed'},\n    {'1': 'blocked', '3': 9, '4': 1, '5': 8, '10': 'blocked'},\n    {'1': 'has_folded_reply', '3': 10, '4': 1, '5': 8, '10': 'hasFoldedReply'},\n    {'1': 'is_folded_reply', '3': 11, '4': 1, '5': 8, '10': 'isFoldedReply'},\n    {'1': 'is_up_top', '3': 12, '4': 1, '5': 8, '10': 'isUpTop'},\n    {'1': 'is_admin_top', '3': 13, '4': 1, '5': 8, '10': 'isAdminTop'},\n    {'1': 'is_vote_top', '3': 14, '4': 1, '5': 8, '10': 'isVoteTop'},\n    {'1': 'max_line', '3': 15, '4': 1, '5': 3, '10': 'maxLine'},\n    {'1': 'invisible', '3': 16, '4': 1, '5': 8, '10': 'invisible'},\n    {'1': 'is_contractor', '3': 17, '4': 1, '5': 8, '10': 'isContractor'},\n    {'1': 'is_note', '3': 18, '4': 1, '5': 8, '10': 'isNote'},\n    {\n      '1': 'card_labels',\n      '3': 19,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ReplyCardLabel',\n      '10': 'cardLabels'\n    },\n    {\n      '1': 'sub_reply_entry_text',\n      '3': 20,\n      '4': 1,\n      '5': 9,\n      '10': 'subReplyEntryText'\n    },\n    {\n      '1': 'sub_reply_title_text',\n      '3': 21,\n      '4': 1,\n      '5': 9,\n      '10': 'subReplyTitleText'\n    },\n    {'1': 'contract_desc', '3': 22, '4': 1, '5': 9, '10': 'contractDesc'},\n    {'1': 'time_desc', '3': 23, '4': 1, '5': 9, '10': 'timeDesc'},\n    {'1': 'biz_scene', '3': 24, '4': 1, '5': 9, '10': 'bizScene'},\n    {'1': 'location', '3': 25, '4': 1, '5': 9, '10': 'location'},\n    {'1': 'fold_pictures', '3': 26, '4': 1, '5': 8, '10': 'foldPictures'},\n    {'1': 'is_note_v2', '3': 27, '4': 1, '5': 8, '10': 'isNoteV2'},\n    {'1': 'hide_note_icon', '3': 28, '4': 1, '5': 8, '10': 'hideNoteIcon'},\n    {\n      '1': 'cm_recommend_component',\n      '3': 29,\n      '4': 1,\n      '5': 9,\n      '10': 'cmRecommendComponent'\n    },\n    {\n      '1': 'vote_option',\n      '3': 30,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ReplyControl.VoteOption',\n      '10': 'voteOption'\n    },\n    {'1': 'charged_desc', '3': 31, '4': 1, '5': 9, '10': 'chargedDesc'},\n    {\n      '1': 'grade_record',\n      '3': 32,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ReplyControl.GradeRecord',\n      '10': 'gradeRecord'\n    },\n    {\n      '1': 'preset_reply_text',\n      '3': 33,\n      '4': 1,\n      '5': 9,\n      '10': 'presetReplyText'\n    },\n    {\n      '1': 'easter_egg_label',\n      '3': 34,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ReplyControl.EasterEggLabel',\n      '10': 'easterEggLabel'\n    },\n    {'1': 'context_feature', '3': 35, '4': 1, '5': 9, '10': 'contextFeature'},\n    {\n      '1': 'insert_effect',\n      '3': 36,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ReplyControl.InsertEffect',\n      '10': 'insertEffect'\n    },\n  ],\n  '3': [\n    ReplyControl_EasterEggLabel$json,\n    ReplyControl_GradeRecord$json,\n    ReplyControl_InsertEffect$json,\n    ReplyControl_VoteOption$json\n  ],\n};\n\n@$core.Deprecated('Use replyControlDescriptor instead')\nconst ReplyControl_EasterEggLabel$json = {\n  '1': 'EasterEggLabel',\n  '2': [\n    {'1': 'image', '3': 1, '4': 1, '5': 9, '10': 'image'},\n    {'1': 'jump_url', '3': 2, '4': 1, '5': 9, '10': 'jumpUrl'},\n  ],\n};\n\n@$core.Deprecated('Use replyControlDescriptor instead')\nconst ReplyControl_GradeRecord$json = {\n  '1': 'GradeRecord',\n  '2': [\n    {'1': 'score', '3': 1, '4': 1, '5': 5, '10': 'score'},\n    {\n      '1': 'texts',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ReplyControl.GradeRecord.Text',\n      '10': 'texts'\n    },\n  ],\n  '3': [ReplyControl_GradeRecord_Text$json],\n};\n\n@$core.Deprecated('Use replyControlDescriptor instead')\nconst ReplyControl_GradeRecord_Text$json = {\n  '1': 'Text',\n  '2': [\n    {'1': 'raw', '3': 1, '4': 1, '5': 9, '10': 'raw'},\n    {\n      '1': 'style',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.TextStyle',\n      '10': 'style'\n    },\n  ],\n};\n\n@$core.Deprecated('Use replyControlDescriptor instead')\nconst ReplyControl_InsertEffect$json = {\n  '1': 'InsertEffect',\n  '2': [\n    {'1': 'content', '3': 1, '4': 1, '5': 9, '10': 'content'},\n    {'1': 'icon', '3': 2, '4': 1, '5': 9, '10': 'icon'},\n  ],\n};\n\n@$core.Deprecated('Use replyControlDescriptor instead')\nconst ReplyControl_VoteOption$json = {\n  '1': 'VoteOption',\n  '2': [\n    {\n      '1': 'label_kind',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6':\n          '.bilibili.main.community.reply.v1.ReplyControl.VoteOption.LabelKind',\n      '10': 'labelKind'\n    },\n    {'1': 'desc', '3': 2, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'idx', '3': 3, '4': 1, '5': 3, '10': 'idx'},\n    {'1': 'vote_id', '3': 4, '4': 1, '5': 3, '10': 'voteId'},\n  ],\n  '4': [ReplyControl_VoteOption_LabelKind$json],\n};\n\n@$core.Deprecated('Use replyControlDescriptor instead')\nconst ReplyControl_VoteOption_LabelKind$json = {\n  '1': 'LabelKind',\n  '2': [\n    {'1': 'DEFAULT_LabelKind', '2': 0},\n    {'1': 'RED', '2': 1},\n    {'1': 'BLUE', '2': 2},\n    {'1': 'PLAIN', '2': 3},\n  ],\n};\n\n/// Descriptor for `ReplyControl`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List replyControlDescriptor = $convert.base64Decode(\n    'CgxSZXBseUNvbnRyb2wSFgoGYWN0aW9uGAEgASgDUgZhY3Rpb24SFwoHdXBfbGlrZRgCIAEoCF'\n    'IGdXBMaWtlEhkKCHVwX3JlcGx5GAMgASgIUgd1cFJlcGx5EiYKD3Nob3dfZm9sbG93X2J0bhgE'\n    'IAEoCFINc2hvd0ZvbGxvd0J0bhIbCglpc19hc3Npc3QYBSABKAhSCGlzQXNzaXN0Eh0KCmxhYm'\n    'VsX3RleHQYBiABKAlSCWxhYmVsVGV4dBIcCglmb2xsb3dpbmcYByABKAhSCWZvbGxvd2luZxIa'\n    'Cghmb2xsb3dlZBgIIAEoCFIIZm9sbG93ZWQSGAoHYmxvY2tlZBgJIAEoCFIHYmxvY2tlZBIoCh'\n    'BoYXNfZm9sZGVkX3JlcGx5GAogASgIUg5oYXNGb2xkZWRSZXBseRImCg9pc19mb2xkZWRfcmVw'\n    'bHkYCyABKAhSDWlzRm9sZGVkUmVwbHkSGgoJaXNfdXBfdG9wGAwgASgIUgdpc1VwVG9wEiAKDG'\n    'lzX2FkbWluX3RvcBgNIAEoCFIKaXNBZG1pblRvcBIeCgtpc192b3RlX3RvcBgOIAEoCFIJaXNW'\n    'b3RlVG9wEhkKCG1heF9saW5lGA8gASgDUgdtYXhMaW5lEhwKCWludmlzaWJsZRgQIAEoCFIJaW'\n    '52aXNpYmxlEiMKDWlzX2NvbnRyYWN0b3IYESABKAhSDGlzQ29udHJhY3RvchIXCgdpc19ub3Rl'\n    'GBIgASgIUgZpc05vdGUSUQoLY2FyZF9sYWJlbHMYEyADKAsyMC5iaWxpYmlsaS5tYWluLmNvbW'\n    '11bml0eS5yZXBseS52MS5SZXBseUNhcmRMYWJlbFIKY2FyZExhYmVscxIvChRzdWJfcmVwbHlf'\n    'ZW50cnlfdGV4dBgUIAEoCVIRc3ViUmVwbHlFbnRyeVRleHQSLwoUc3ViX3JlcGx5X3RpdGxlX3'\n    'RleHQYFSABKAlSEXN1YlJlcGx5VGl0bGVUZXh0EiMKDWNvbnRyYWN0X2Rlc2MYFiABKAlSDGNv'\n    'bnRyYWN0RGVzYxIbCgl0aW1lX2Rlc2MYFyABKAlSCHRpbWVEZXNjEhsKCWJpel9zY2VuZRgYIA'\n    'EoCVIIYml6U2NlbmUSGgoIbG9jYXRpb24YGSABKAlSCGxvY2F0aW9uEiMKDWZvbGRfcGljdHVy'\n    'ZXMYGiABKAhSDGZvbGRQaWN0dXJlcxIcCgppc19ub3RlX3YyGBsgASgIUghpc05vdGVWMhIkCg'\n    '5oaWRlX25vdGVfaWNvbhgcIAEoCFIMaGlkZU5vdGVJY29uEjQKFmNtX3JlY29tbWVuZF9jb21w'\n    'b25lbnQYHSABKAlSFGNtUmVjb21tZW5kQ29tcG9uZW50EloKC3ZvdGVfb3B0aW9uGB4gASgLMj'\n    'kuYmlsaWJpbGkubWFpbi5jb21tdW5pdHkucmVwbHkudjEuUmVwbHlDb250cm9sLlZvdGVPcHRp'\n    'b25SCnZvdGVPcHRpb24SIQoMY2hhcmdlZF9kZXNjGB8gASgJUgtjaGFyZ2VkRGVzYxJdCgxncm'\n    'FkZV9yZWNvcmQYICABKAsyOi5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5SZXBs'\n    'eUNvbnRyb2wuR3JhZGVSZWNvcmRSC2dyYWRlUmVjb3JkEioKEXByZXNldF9yZXBseV90ZXh0GC'\n    'EgASgJUg9wcmVzZXRSZXBseVRleHQSZwoQZWFzdGVyX2VnZ19sYWJlbBgiIAEoCzI9LmJpbGli'\n    'aWxpLm1haW4uY29tbXVuaXR5LnJlcGx5LnYxLlJlcGx5Q29udHJvbC5FYXN0ZXJFZ2dMYWJlbF'\n    'IOZWFzdGVyRWdnTGFiZWwSJwoPY29udGV4dF9mZWF0dXJlGCMgASgJUg5jb250ZXh0RmVhdHVy'\n    'ZRJgCg1pbnNlcnRfZWZmZWN0GCQgASgLMjsuYmlsaWJpbGkubWFpbi5jb21tdW5pdHkucmVwbH'\n    'kudjEuUmVwbHlDb250cm9sLkluc2VydEVmZmVjdFIMaW5zZXJ0RWZmZWN0GkEKDkVhc3RlckVn'\n    'Z0xhYmVsEhQKBWltYWdlGAEgASgJUgVpbWFnZRIZCghqdW1wX3VybBgCIAEoCVIHanVtcFVybB'\n    'rXAQoLR3JhZGVSZWNvcmQSFAoFc2NvcmUYASABKAVSBXNjb3JlElUKBXRleHRzGAIgAygLMj8u'\n    'YmlsaWJpbGkubWFpbi5jb21tdW5pdHkucmVwbHkudjEuUmVwbHlDb250cm9sLkdyYWRlUmVjb3'\n    'JkLlRleHRSBXRleHRzGlsKBFRleHQSEAoDcmF3GAEgASgJUgNyYXcSQQoFc3R5bGUYAiABKAsy'\n    'Ky5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5UZXh0U3R5bGVSBXN0eWxlGjwKDE'\n    'luc2VydEVmZmVjdBIYCgdjb250ZW50GAEgASgJUgdjb250ZW50EhIKBGljb24YAiABKAlSBGlj'\n    'b24a8QEKClZvdGVPcHRpb24SYgoKbGFiZWxfa2luZBgBIAEoDjJDLmJpbGliaWxpLm1haW4uY2'\n    '9tbXVuaXR5LnJlcGx5LnYxLlJlcGx5Q29udHJvbC5Wb3RlT3B0aW9uLkxhYmVsS2luZFIJbGFi'\n    'ZWxLaW5kEhIKBGRlc2MYAiABKAlSBGRlc2MSEAoDaWR4GAMgASgDUgNpZHgSFwoHdm90ZV9pZB'\n    'gEIAEoA1IGdm90ZUlkIkAKCUxhYmVsS2luZBIVChFERUZBVUxUX0xhYmVsS2luZBAAEgcKA1JF'\n    'RBABEggKBEJMVUUQAhIJCgVQTEFJThAD');\n\n@$core.Deprecated('Use replyExtraDescriptor instead')\nconst ReplyExtra$json = {\n  '1': 'ReplyExtra',\n  '2': [\n    {'1': 'season_id', '3': 1, '4': 1, '5': 3, '10': 'seasonId'},\n    {'1': 'season_type', '3': 2, '4': 1, '5': 3, '10': 'seasonType'},\n    {'1': 'ep_id', '3': 3, '4': 1, '5': 3, '10': 'epId'},\n    {'1': 'is_story', '3': 4, '4': 1, '5': 8, '10': 'isStory'},\n    {'1': 'spmid', '3': 5, '4': 1, '5': 9, '10': 'spmid'},\n    {'1': 'from_spmid', '3': 6, '4': 1, '5': 9, '10': 'fromSpmid'},\n    {\n      '1': 'disable_underline',\n      '3': 7,\n      '4': 1,\n      '5': 8,\n      '10': 'disableUnderline'\n    },\n    {'1': 'disable_we_search', '3': 8, '4': 1, '5': 8, '10': 'disableWeSearch'},\n    {\n      '1': 'disable_filter_tag',\n      '3': 9,\n      '4': 1,\n      '5': 8,\n      '10': 'disableFilterTag'\n    },\n    {'1': 'is_activity_mode', '3': 10, '4': 1, '5': 8, '10': 'isActivityMode'},\n    {'1': 'track_id', '3': 11, '4': 1, '5': 9, '10': 'trackId'},\n  ],\n};\n\n/// Descriptor for `ReplyExtra`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List replyExtraDescriptor = $convert.base64Decode(\n    'CgpSZXBseUV4dHJhEhsKCXNlYXNvbl9pZBgBIAEoA1IIc2Vhc29uSWQSHwoLc2Vhc29uX3R5cG'\n    'UYAiABKANSCnNlYXNvblR5cGUSEwoFZXBfaWQYAyABKANSBGVwSWQSGQoIaXNfc3RvcnkYBCAB'\n    'KAhSB2lzU3RvcnkSFAoFc3BtaWQYBSABKAlSBXNwbWlkEh0KCmZyb21fc3BtaWQYBiABKAlSCW'\n    'Zyb21TcG1pZBIrChFkaXNhYmxlX3VuZGVybGluZRgHIAEoCFIQZGlzYWJsZVVuZGVybGluZRIq'\n    'ChFkaXNhYmxlX3dlX3NlYXJjaBgIIAEoCFIPZGlzYWJsZVdlU2VhcmNoEiwKEmRpc2FibGVfZm'\n    'lsdGVyX3RhZxgJIAEoCFIQZGlzYWJsZUZpbHRlclRhZxIoChBpc19hY3Rpdml0eV9tb2RlGAog'\n    'ASgIUg5pc0FjdGl2aXR5TW9kZRIZCgh0cmFja19pZBgLIAEoCVIHdHJhY2tJZA==');\n\n@$core.Deprecated('Use replyInAppPushPayloadDescriptor instead')\nconst ReplyInAppPushPayload$json = {\n  '1': 'ReplyInAppPushPayload',\n  '2': [\n    {\n      '1': 'reply',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ReplyInAppPushPayload.Reply',\n      '10': 'reply'\n    },\n    {\n      '1': 'parent_reply',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ReplyInAppPushPayload.Reply',\n      '10': 'parentReply'\n    },\n    {\n      '1': 'subject',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ReplyInAppPushPayload.Subject',\n      '10': 'subject'\n    },\n    {\n      '1': 'subject_material',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6':\n          '.bilibili.main.community.reply.v1.ReplyInAppPushPayload.SubjectMaterial',\n      '10': 'subjectMaterial'\n    },\n  ],\n  '3': [\n    ReplyInAppPushPayload_Content$json,\n    ReplyInAppPushPayload_Member$json,\n    ReplyInAppPushPayload_Reply$json,\n    ReplyInAppPushPayload_Subject$json,\n    ReplyInAppPushPayload_SubjectMaterial$json\n  ],\n};\n\n@$core.Deprecated('Use replyInAppPushPayloadDescriptor instead')\nconst ReplyInAppPushPayload_Content$json = {\n  '1': 'Content',\n  '2': [\n    {'1': 'message', '3': 1, '4': 1, '5': 9, '10': 'message'},\n    {\n      '1': 'emotes',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6':\n          '.bilibili.main.community.reply.v1.ReplyInAppPushPayload.Content.EmotesEntry',\n      '10': 'emotes'\n    },\n    {\n      '1': 'at_name_to_mid',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6':\n          '.bilibili.main.community.reply.v1.ReplyInAppPushPayload.Content.AtNameToMidEntry',\n      '10': 'atNameToMid'\n    },\n    {\n      '1': 'pictures',\n      '3': 4,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Picture',\n      '10': 'pictures'\n    },\n  ],\n  '3': [\n    ReplyInAppPushPayload_Content_EmotesEntry$json,\n    ReplyInAppPushPayload_Content_AtNameToMidEntry$json\n  ],\n};\n\n@$core.Deprecated('Use replyInAppPushPayloadDescriptor instead')\nconst ReplyInAppPushPayload_Content_EmotesEntry$json = {\n  '1': 'EmotesEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {\n      '1': 'value',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Emote',\n      '10': 'value'\n    },\n  ],\n  '7': {'7': true},\n};\n\n@$core.Deprecated('Use replyInAppPushPayloadDescriptor instead')\nconst ReplyInAppPushPayload_Content_AtNameToMidEntry$json = {\n  '1': 'AtNameToMidEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 3, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n@$core.Deprecated('Use replyInAppPushPayloadDescriptor instead')\nconst ReplyInAppPushPayload_Member$json = {\n  '1': 'Member',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'face', '3': 3, '4': 1, '5': 9, '10': 'face'},\n  ],\n};\n\n@$core.Deprecated('Use replyInAppPushPayloadDescriptor instead')\nconst ReplyInAppPushPayload_Reply$json = {\n  '1': 'Reply',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'type', '3': 2, '4': 1, '5': 3, '10': 'type'},\n    {'1': 'oid', '3': 3, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'mid', '3': 4, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'root', '3': 5, '4': 1, '5': 3, '10': 'root'},\n    {'1': 'parent', '3': 6, '4': 1, '5': 3, '10': 'parent'},\n    {'1': 'dialog', '3': 7, '4': 1, '5': 3, '10': 'dialog'},\n    {'1': 'ctime', '3': 8, '4': 1, '5': 3, '10': 'ctime'},\n    {\n      '1': 'content',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ReplyInAppPushPayload.Content',\n      '10': 'content'\n    },\n    {\n      '1': 'member',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ReplyInAppPushPayload.Member',\n      '10': 'member'\n    },\n  ],\n};\n\n@$core.Deprecated('Use replyInAppPushPayloadDescriptor instead')\nconst ReplyInAppPushPayload_Subject$json = {\n  '1': 'Subject',\n  '2': [\n    {'1': 'type', '3': 1, '4': 1, '5': 3, '10': 'type'},\n    {'1': 'oid', '3': 2, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'up_mid', '3': 3, '4': 1, '5': 3, '10': 'upMid'},\n  ],\n};\n\n@$core.Deprecated('Use replyInAppPushPayloadDescriptor instead')\nconst ReplyInAppPushPayload_SubjectMaterial$json = {\n  '1': 'SubjectMaterial',\n  '2': [\n    {\n      '1': 'arc',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6':\n          '.bilibili.main.community.reply.v1.ReplyInAppPushPayload.SubjectMaterial.Archive',\n      '9': 0,\n      '10': 'arc'\n    },\n  ],\n  '3': [ReplyInAppPushPayload_SubjectMaterial_Archive$json],\n  '8': [\n    {'1': 'item'},\n  ],\n};\n\n@$core.Deprecated('Use replyInAppPushPayloadDescriptor instead')\nconst ReplyInAppPushPayload_SubjectMaterial_Archive$json = {\n  '1': 'Archive',\n  '2': [\n    {'1': 'aid', '3': 1, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 3, '4': 1, '5': 9, '10': 'cover'},\n  ],\n};\n\n/// Descriptor for `ReplyInAppPushPayload`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List replyInAppPushPayloadDescriptor = $convert.base64Decode(\n    'ChVSZXBseUluQXBwUHVzaFBheWxvYWQSUwoFcmVwbHkYASABKAsyPS5iaWxpYmlsaS5tYWluLm'\n    'NvbW11bml0eS5yZXBseS52MS5SZXBseUluQXBwUHVzaFBheWxvYWQuUmVwbHlSBXJlcGx5EmAK'\n    'DHBhcmVudF9yZXBseRgCIAEoCzI9LmJpbGliaWxpLm1haW4uY29tbXVuaXR5LnJlcGx5LnYxLl'\n    'JlcGx5SW5BcHBQdXNoUGF5bG9hZC5SZXBseVILcGFyZW50UmVwbHkSWQoHc3ViamVjdBgDIAEo'\n    'CzI/LmJpbGliaWxpLm1haW4uY29tbXVuaXR5LnJlcGx5LnYxLlJlcGx5SW5BcHBQdXNoUGF5bG'\n    '9hZC5TdWJqZWN0UgdzdWJqZWN0EnIKEHN1YmplY3RfbWF0ZXJpYWwYBCABKAsyRy5iaWxpYmls'\n    'aS5tYWluLmNvbW11bml0eS5yZXBseS52MS5SZXBseUluQXBwUHVzaFBheWxvYWQuU3ViamVjdE'\n    '1hdGVyaWFsUg9zdWJqZWN0TWF0ZXJpYWwa6gMKB0NvbnRlbnQSGAoHbWVzc2FnZRgBIAEoCVIH'\n    'bWVzc2FnZRJjCgZlbW90ZXMYAiADKAsySy5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS'\n    '52MS5SZXBseUluQXBwUHVzaFBheWxvYWQuQ29udGVudC5FbW90ZXNFbnRyeVIGZW1vdGVzEnUK'\n    'DmF0X25hbWVfdG9fbWlkGAMgAygLMlAuYmlsaWJpbGkubWFpbi5jb21tdW5pdHkucmVwbHkudj'\n    'EuUmVwbHlJbkFwcFB1c2hQYXlsb2FkLkNvbnRlbnQuQXROYW1lVG9NaWRFbnRyeVILYXROYW1l'\n    'VG9NaWQSRQoIcGljdHVyZXMYBCADKAsyKS5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS'\n    '52MS5QaWN0dXJlUghwaWN0dXJlcxpiCgtFbW90ZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRI9'\n    'CgV2YWx1ZRgCIAEoCzInLmJpbGliaWxpLm1haW4uY29tbXVuaXR5LnJlcGx5LnYxLkVtb3RlUg'\n    'V2YWx1ZToCOAEaPgoQQXROYW1lVG9NaWRFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1'\n    'ZRgCIAEoA1IFdmFsdWU6AjgBGkIKBk1lbWJlchIQCgNtaWQYASABKANSA21pZBISCgRuYW1lGA'\n    'IgASgJUgRuYW1lEhIKBGZhY2UYAyABKAlSBGZhY2Ua3AIKBVJlcGx5Eg4KAmlkGAEgASgDUgJp'\n    'ZBISCgR0eXBlGAIgASgDUgR0eXBlEhAKA29pZBgDIAEoA1IDb2lkEhAKA21pZBgEIAEoA1IDbW'\n    'lkEhIKBHJvb3QYBSABKANSBHJvb3QSFgoGcGFyZW50GAYgASgDUgZwYXJlbnQSFgoGZGlhbG9n'\n    'GAcgASgDUgZkaWFsb2cSFAoFY3RpbWUYCCABKANSBWN0aW1lElkKB2NvbnRlbnQYCSABKAsyPy'\n    '5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5SZXBseUluQXBwUHVzaFBheWxvYWQu'\n    'Q29udGVudFIHY29udGVudBJWCgZtZW1iZXIYCiABKAsyPi5iaWxpYmlsaS5tYWluLmNvbW11bm'\n    'l0eS5yZXBseS52MS5SZXBseUluQXBwUHVzaFBheWxvYWQuTWVtYmVyUgZtZW1iZXIaRgoHU3Vi'\n    'amVjdBISCgR0eXBlGAEgASgDUgR0eXBlEhAKA29pZBgCIAEoA1IDb2lkEhUKBnVwX21pZBgDIA'\n    'EoA1IFdXBNaWQaxwEKD1N1YmplY3RNYXRlcmlhbBJjCgNhcmMYASABKAsyTy5iaWxpYmlsaS5t'\n    'YWluLmNvbW11bml0eS5yZXBseS52MS5SZXBseUluQXBwUHVzaFBheWxvYWQuU3ViamVjdE1hdG'\n    'VyaWFsLkFyY2hpdmVIAFIDYXJjGkcKB0FyY2hpdmUSEAoDYWlkGAEgASgDUgNhaWQSFAoFdGl0'\n    'bGUYAiABKAlSBXRpdGxlEhQKBWNvdmVyGAMgASgJUgVjb3ZlckIGCgRpdGVt');\n\n@$core.Deprecated('Use replyInfoDescriptor instead')\nconst ReplyInfo$json = {\n  '1': 'ReplyInfo',\n  '2': [\n    {\n      '1': 'replies',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ReplyInfo',\n      '10': 'replies'\n    },\n    {'1': 'id', '3': 2, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'oid', '3': 3, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'type', '3': 4, '4': 1, '5': 3, '10': 'type'},\n    {'1': 'mid', '3': 5, '4': 1, '5': 3, '10': 'mid'},\n    {'1': 'root', '3': 6, '4': 1, '5': 3, '10': 'root'},\n    {'1': 'parent', '3': 7, '4': 1, '5': 3, '10': 'parent'},\n    {'1': 'dialog', '3': 8, '4': 1, '5': 3, '10': 'dialog'},\n    {'1': 'like', '3': 9, '4': 1, '5': 3, '10': 'like'},\n    {'1': 'ctime', '3': 10, '4': 1, '5': 3, '10': 'ctime'},\n    {'1': 'count', '3': 11, '4': 1, '5': 3, '10': 'count'},\n    {\n      '1': 'content',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Content',\n      '10': 'content'\n    },\n    {\n      '1': 'member',\n      '3': 13,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Member',\n      '10': 'member'\n    },\n    {\n      '1': 'reply_control',\n      '3': 14,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ReplyControl',\n      '10': 'replyControl'\n    },\n    {\n      '1': 'member_v2',\n      '3': 15,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.MemberV2',\n      '10': 'memberV2'\n    },\n    {'1': 'track_info', '3': 16, '4': 1, '5': 9, '10': 'trackInfo'},\n  ],\n};\n\n/// Descriptor for `ReplyInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List replyInfoDescriptor = $convert.base64Decode(\n    'CglSZXBseUluZm8SRQoHcmVwbGllcxgBIAMoCzIrLmJpbGliaWxpLm1haW4uY29tbXVuaXR5Ln'\n    'JlcGx5LnYxLlJlcGx5SW5mb1IHcmVwbGllcxIOCgJpZBgCIAEoA1ICaWQSEAoDb2lkGAMgASgD'\n    'UgNvaWQSEgoEdHlwZRgEIAEoA1IEdHlwZRIQCgNtaWQYBSABKANSA21pZBISCgRyb290GAYgAS'\n    'gDUgRyb290EhYKBnBhcmVudBgHIAEoA1IGcGFyZW50EhYKBmRpYWxvZxgIIAEoA1IGZGlhbG9n'\n    'EhIKBGxpa2UYCSABKANSBGxpa2USFAoFY3RpbWUYCiABKANSBWN0aW1lEhQKBWNvdW50GAsgAS'\n    'gDUgVjb3VudBJDCgdjb250ZW50GAwgASgLMikuYmlsaWJpbGkubWFpbi5jb21tdW5pdHkucmVw'\n    'bHkudjEuQ29udGVudFIHY29udGVudBJACgZtZW1iZXIYDSABKAsyKC5iaWxpYmlsaS5tYWluLm'\n    'NvbW11bml0eS5yZXBseS52MS5NZW1iZXJSBm1lbWJlchJTCg1yZXBseV9jb250cm9sGA4gASgL'\n    'Mi4uYmlsaWJpbGkubWFpbi5jb21tdW5pdHkucmVwbHkudjEuUmVwbHlDb250cm9sUgxyZXBseU'\n    'NvbnRyb2wSRwoJbWVtYmVyX3YyGA8gASgLMiouYmlsaWJpbGkubWFpbi5jb21tdW5pdHkucmVw'\n    'bHkudjEuTWVtYmVyVjJSCG1lbWJlclYyEh0KCnRyYWNrX2luZm8YECABKAlSCXRyYWNrSW5mbw'\n    '==');\n\n@$core.Deprecated('Use replyInfoReplyDescriptor instead')\nconst ReplyInfoReply$json = {\n  '1': 'ReplyInfoReply',\n  '2': [\n    {\n      '1': 'reply',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ReplyInfo',\n      '10': 'reply'\n    },\n  ],\n};\n\n/// Descriptor for `ReplyInfoReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List replyInfoReplyDescriptor = $convert.base64Decode(\n    'Cg5SZXBseUluZm9SZXBseRJBCgVyZXBseRgBIAEoCzIrLmJpbGliaWxpLm1haW4uY29tbXVuaX'\n    'R5LnJlcGx5LnYxLlJlcGx5SW5mb1IFcmVwbHk=');\n\n@$core.Deprecated('Use replyInfoReqDescriptor instead')\nconst ReplyInfoReq$json = {\n  '1': 'ReplyInfoReq',\n  '2': [\n    {'1': 'rpid', '3': 1, '4': 1, '5': 3, '10': 'rpid'},\n    {\n      '1': 'scene',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.ReplyInfoReq.ReplyInfoScene',\n      '10': 'scene'\n    },\n  ],\n  '4': [ReplyInfoReq_ReplyInfoScene$json],\n};\n\n@$core.Deprecated('Use replyInfoReqDescriptor instead')\nconst ReplyInfoReq_ReplyInfoScene$json = {\n  '1': 'ReplyInfoScene',\n  '2': [\n    {'1': 'Insert', '2': 0},\n  ],\n};\n\n/// Descriptor for `ReplyInfoReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List replyInfoReqDescriptor = $convert.base64Decode(\n    'CgxSZXBseUluZm9SZXESEgoEcnBpZBgBIAEoA1IEcnBpZBJTCgVzY2VuZRgCIAEoDjI9LmJpbG'\n    'liaWxpLm1haW4uY29tbXVuaXR5LnJlcGx5LnYxLlJlcGx5SW5mb1JlcS5SZXBseUluZm9TY2Vu'\n    'ZVIFc2NlbmUiHAoOUmVwbHlJbmZvU2NlbmUSCgoGSW5zZXJ0EAA=');\n\n@$core.Deprecated('Use replyTrackInfoDescriptor instead')\nconst ReplyTrackInfo$json = {\n  '1': 'ReplyTrackInfo',\n  '2': [\n    {'1': 'track_id', '3': 1, '4': 1, '5': 9, '10': 'trackId'},\n  ],\n};\n\n/// Descriptor for `ReplyTrackInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List replyTrackInfoDescriptor = $convert.base64Decode(\n    'Cg5SZXBseVRyYWNrSW5mbxIZCgh0cmFja19pZBgBIAEoCVIHdHJhY2tJZA==');\n\n@$core.Deprecated('Use richTextDescriptor instead')\nconst RichText$json = {\n  '1': 'RichText',\n  '2': [\n    {\n      '1': 'note',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.RichTextNote',\n      '9': 0,\n      '10': 'note'\n    },\n    {\n      '1': 'opus',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.app.dynamic.v2.OpusItem',\n      '9': 0,\n      '10': 'opus'\n    },\n  ],\n  '8': [\n    {'1': 'item'},\n  ],\n};\n\n/// Descriptor for `RichText`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List richTextDescriptor = $convert.base64Decode(\n    'CghSaWNoVGV4dBJECgRub3RlGAEgASgLMi4uYmlsaWJpbGkubWFpbi5jb21tdW5pdHkucmVwbH'\n    'kudjEuUmljaFRleHROb3RlSABSBG5vdGUSNwoEb3B1cxgCIAEoCzIhLmJpbGliaWxpLmFwcC5k'\n    'eW5hbWljLnYyLk9wdXNJdGVtSABSBG9wdXNCBgoEaXRlbQ==');\n\n@$core.Deprecated('Use richTextNoteDescriptor instead')\nconst RichTextNote$json = {\n  '1': 'RichTextNote',\n  '2': [\n    {'1': 'summary', '3': 1, '4': 1, '5': 9, '10': 'summary'},\n    {'1': 'images', '3': 2, '4': 3, '5': 9, '10': 'images'},\n    {'1': 'click_url', '3': 3, '4': 1, '5': 9, '10': 'clickUrl'},\n    {'1': 'last_mtime_text', '3': 4, '4': 1, '5': 9, '10': 'lastMtimeText'},\n  ],\n};\n\n/// Descriptor for `RichTextNote`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List richTextNoteDescriptor = $convert.base64Decode(\n    'CgxSaWNoVGV4dE5vdGUSGAoHc3VtbWFyeRgBIAEoCVIHc3VtbWFyeRIWCgZpbWFnZXMYAiADKA'\n    'lSBmltYWdlcxIbCgljbGlja191cmwYAyABKAlSCGNsaWNrVXJsEiYKD2xhc3RfbXRpbWVfdGV4'\n    'dBgEIAEoCVINbGFzdE10aW1lVGV4dA==');\n\n@$core.Deprecated('Use searchItemDescriptor instead')\nconst SearchItem$json = {\n  '1': 'SearchItem',\n  '2': [\n    {\n      '1': 'goods',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.GoodsSearchItem',\n      '9': 0,\n      '10': 'goods'\n    },\n    {\n      '1': 'video',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.VideoSearchItem',\n      '9': 0,\n      '10': 'video'\n    },\n    {\n      '1': 'article',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ArticleSearchItem',\n      '9': 0,\n      '10': 'article'\n    },\n    {'1': 'url', '3': 1, '4': 1, '5': 9, '10': 'url'},\n  ],\n  '8': [\n    {'1': 'item'},\n  ],\n};\n\n/// Descriptor for `SearchItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List searchItemDescriptor = $convert.base64Decode(\n    'CgpTZWFyY2hJdGVtEkkKBWdvb2RzGAIgASgLMjEuYmlsaWJpbGkubWFpbi5jb21tdW5pdHkucm'\n    'VwbHkudjEuR29vZHNTZWFyY2hJdGVtSABSBWdvb2RzEkkKBXZpZGVvGAMgASgLMjEuYmlsaWJp'\n    'bGkubWFpbi5jb21tdW5pdHkucmVwbHkudjEuVmlkZW9TZWFyY2hJdGVtSABSBXZpZGVvEk8KB2'\n    'FydGljbGUYBCABKAsyMy5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5BcnRpY2xl'\n    'U2VhcmNoSXRlbUgAUgdhcnRpY2xlEhAKA3VybBgBIAEoCVIDdXJsQgYKBGl0ZW0=');\n\n@$core.Deprecated('Use searchItemCursorReplyDescriptor instead')\nconst SearchItemCursorReply$json = {\n  '1': 'SearchItemCursorReply',\n  '2': [\n    {'1': 'has_next', '3': 1, '4': 1, '5': 8, '10': 'hasNext'},\n    {'1': 'next', '3': 2, '4': 1, '5': 3, '10': 'next'},\n  ],\n};\n\n/// Descriptor for `SearchItemCursorReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List searchItemCursorReplyDescriptor = $convert.base64Decode(\n    'ChVTZWFyY2hJdGVtQ3Vyc29yUmVwbHkSGQoIaGFzX25leHQYASABKAhSB2hhc05leHQSEgoEbm'\n    'V4dBgCIAEoA1IEbmV4dA==');\n\n@$core.Deprecated('Use searchItemCursorReqDescriptor instead')\nconst SearchItemCursorReq$json = {\n  '1': 'SearchItemCursorReq',\n  '2': [\n    {'1': 'next', '3': 1, '4': 1, '5': 3, '10': 'next'},\n    {\n      '1': 'item_type',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.SearchItemType',\n      '10': 'itemType'\n    },\n  ],\n};\n\n/// Descriptor for `SearchItemCursorReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List searchItemCursorReqDescriptor = $convert.base64Decode(\n    'ChNTZWFyY2hJdGVtQ3Vyc29yUmVxEhIKBG5leHQYASABKANSBG5leHQSTQoJaXRlbV90eXBlGA'\n    'IgASgOMjAuYmlsaWJpbGkubWFpbi5jb21tdW5pdHkucmVwbHkudjEuU2VhcmNoSXRlbVR5cGVS'\n    'CGl0ZW1UeXBl');\n\n@$core.Deprecated('Use searchItemPreHookReplyDescriptor instead')\nconst SearchItemPreHookReply$json = {\n  '1': 'SearchItemPreHookReply',\n  '2': [\n    {'1': 'placeholder_text', '3': 1, '4': 1, '5': 9, '10': 'placeholderText'},\n    {'1': 'background_text', '3': 2, '4': 1, '5': 9, '10': 'backgroundText'},\n    {'1': 'ordered_type', '3': 3, '4': 3, '5': 5, '10': 'orderedType'},\n  ],\n};\n\n/// Descriptor for `SearchItemPreHookReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List searchItemPreHookReplyDescriptor = $convert.base64Decode(\n    'ChZTZWFyY2hJdGVtUHJlSG9va1JlcGx5EikKEHBsYWNlaG9sZGVyX3RleHQYASABKAlSD3BsYW'\n    'NlaG9sZGVyVGV4dBInCg9iYWNrZ3JvdW5kX3RleHQYAiABKAlSDmJhY2tncm91bmRUZXh0EiEK'\n    'DG9yZGVyZWRfdHlwZRgDIAMoBVILb3JkZXJlZFR5cGU=');\n\n@$core.Deprecated('Use searchItemPreHookReqDescriptor instead')\nconst SearchItemPreHookReq$json = {\n  '1': 'SearchItemPreHookReq',\n  '2': [\n    {'1': 'oid', '3': 1, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'type', '3': 2, '4': 1, '5': 3, '10': 'type'},\n  ],\n};\n\n/// Descriptor for `SearchItemPreHookReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List searchItemPreHookReqDescriptor = $convert.base64Decode(\n    'ChRTZWFyY2hJdGVtUHJlSG9va1JlcRIQCgNvaWQYASABKANSA29pZBISCgR0eXBlGAIgASgDUg'\n    'R0eXBl');\n\n@$core.Deprecated('Use searchItemReplyDescriptor instead')\nconst SearchItemReply$json = {\n  '1': 'SearchItemReply',\n  '2': [\n    {\n      '1': 'cursor',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.SearchItemCursorReply',\n      '10': 'cursor'\n    },\n    {\n      '1': 'items',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.SearchItem',\n      '10': 'items'\n    },\n    {\n      '1': 'extra',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.SearchItemReplyExtraInfo',\n      '10': 'extra'\n    },\n  ],\n};\n\n/// Descriptor for `SearchItemReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List searchItemReplyDescriptor = $convert.base64Decode(\n    'Cg9TZWFyY2hJdGVtUmVwbHkSTwoGY3Vyc29yGAEgASgLMjcuYmlsaWJpbGkubWFpbi5jb21tdW'\n    '5pdHkucmVwbHkudjEuU2VhcmNoSXRlbUN1cnNvclJlcGx5UgZjdXJzb3ISQgoFaXRlbXMYAiAD'\n    'KAsyLC5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5TZWFyY2hJdGVtUgVpdGVtcx'\n    'JQCgVleHRyYRgDIAEoCzI6LmJpbGliaWxpLm1haW4uY29tbXVuaXR5LnJlcGx5LnYxLlNlYXJj'\n    'aEl0ZW1SZXBseUV4dHJhSW5mb1IFZXh0cmE=');\n\n@$core.Deprecated('Use searchItemReplyExtraInfoDescriptor instead')\nconst SearchItemReplyExtraInfo$json = {\n  '1': 'SearchItemReplyExtraInfo',\n  '2': [\n    {'1': 'event_id', '3': 1, '4': 1, '5': 9, '10': 'eventId'},\n  ],\n};\n\n/// Descriptor for `SearchItemReplyExtraInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List searchItemReplyExtraInfoDescriptor =\n    $convert.base64Decode(\n        'ChhTZWFyY2hJdGVtUmVwbHlFeHRyYUluZm8SGQoIZXZlbnRfaWQYASABKAlSB2V2ZW50SWQ=');\n\n@$core.Deprecated('Use searchItemReqDescriptor instead')\nconst SearchItemReq$json = {\n  '1': 'SearchItemReq',\n  '2': [\n    {\n      '1': 'cursor',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.SearchItemCursorReq',\n      '10': 'cursor'\n    },\n    {'1': 'oid', '3': 2, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'type', '3': 3, '4': 1, '5': 3, '10': 'type'},\n    {'1': 'keyword', '3': 4, '4': 1, '5': 9, '10': 'keyword'},\n  ],\n};\n\n/// Descriptor for `SearchItemReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List searchItemReqDescriptor = $convert.base64Decode(\n    'Cg1TZWFyY2hJdGVtUmVxEk0KBmN1cnNvchgBIAEoCzI1LmJpbGliaWxpLm1haW4uY29tbXVuaX'\n    'R5LnJlcGx5LnYxLlNlYXJjaEl0ZW1DdXJzb3JSZXFSBmN1cnNvchIQCgNvaWQYAiABKANSA29p'\n    'ZBISCgR0eXBlGAMgASgDUgR0eXBlEhgKB2tleXdvcmQYBCABKAlSB2tleXdvcmQ=');\n\n@$core.Deprecated('Use shareRepliesInfoReqDescriptor instead')\nconst ShareRepliesInfoReq$json = {\n  '1': 'ShareRepliesInfoReq',\n  '2': [\n    {'1': 'rpids', '3': 1, '4': 3, '5': 3, '10': 'rpids'},\n    {'1': 'oid', '3': 2, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'type', '3': 3, '4': 1, '5': 3, '10': 'type'},\n  ],\n};\n\n/// Descriptor for `ShareRepliesInfoReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List shareRepliesInfoReqDescriptor = $convert.base64Decode(\n    'ChNTaGFyZVJlcGxpZXNJbmZvUmVxEhQKBXJwaWRzGAEgAygDUgVycGlkcxIQCgNvaWQYAiABKA'\n    'NSA29pZBISCgR0eXBlGAMgASgDUgR0eXBl');\n\n@$core.Deprecated('Use shareRepliesInfoRespDescriptor instead')\nconst ShareRepliesInfoResp$json = {\n  '1': 'ShareRepliesInfoResp',\n  '2': [\n    {\n      '1': 'infos',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ShareReplyInfo',\n      '10': 'infos'\n    },\n    {'1': 'from_title', '3': 2, '4': 1, '5': 9, '10': 'fromTitle'},\n    {'1': 'from_up', '3': 3, '4': 1, '5': 9, '10': 'fromUp'},\n    {'1': 'from_pic', '3': 4, '4': 1, '5': 9, '10': 'fromPic'},\n    {'1': 'url', '3': 5, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'slogan_pic', '3': 6, '4': 1, '5': 9, '10': 'sloganPic'},\n    {'1': 'slogan_text', '3': 7, '4': 1, '5': 9, '10': 'sloganText'},\n    {\n      '1': 'topic',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ShareReplyTopic',\n      '10': 'topic'\n    },\n    {\n      '1': 'extra',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ShareRepliesInfoResp.ShareExtra',\n      '10': 'extra'\n    },\n  ],\n  '3': [ShareRepliesInfoResp_ShareExtra$json],\n};\n\n@$core.Deprecated('Use shareRepliesInfoRespDescriptor instead')\nconst ShareRepliesInfoResp_ShareExtra$json = {\n  '1': 'ShareExtra',\n  '2': [\n    {'1': 'is_pgc', '3': 1, '4': 1, '5': 8, '10': 'isPgc'},\n  ],\n};\n\n/// Descriptor for `ShareRepliesInfoResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List shareRepliesInfoRespDescriptor = $convert.base64Decode(\n    'ChRTaGFyZVJlcGxpZXNJbmZvUmVzcBJGCgVpbmZvcxgBIAMoCzIwLmJpbGliaWxpLm1haW4uY2'\n    '9tbXVuaXR5LnJlcGx5LnYxLlNoYXJlUmVwbHlJbmZvUgVpbmZvcxIdCgpmcm9tX3RpdGxlGAIg'\n    'ASgJUglmcm9tVGl0bGUSFwoHZnJvbV91cBgDIAEoCVIGZnJvbVVwEhkKCGZyb21fcGljGAQgAS'\n    'gJUgdmcm9tUGljEhAKA3VybBgFIAEoCVIDdXJsEh0KCnNsb2dhbl9waWMYBiABKAlSCXNsb2dh'\n    'blBpYxIfCgtzbG9nYW5fdGV4dBgHIAEoCVIKc2xvZ2FuVGV4dBJHCgV0b3BpYxgIIAEoCzIxLm'\n    'JpbGliaWxpLm1haW4uY29tbXVuaXR5LnJlcGx5LnYxLlNoYXJlUmVwbHlUb3BpY1IFdG9waWMS'\n    'VwoFZXh0cmEYCSABKAsyQS5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5TaGFyZV'\n    'JlcGxpZXNJbmZvUmVzcC5TaGFyZUV4dHJhUgVleHRyYRojCgpTaGFyZUV4dHJhEhUKBmlzX3Bn'\n    'YxgBIAEoCFIFaXNQZ2M=');\n\n@$core.Deprecated('Use shareReplyInfoDescriptor instead')\nconst ShareReplyInfo$json = {\n  '1': 'ShareReplyInfo',\n  '2': [\n    {\n      '1': 'member',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Member',\n      '10': 'member'\n    },\n    {\n      '1': 'content',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Content',\n      '10': 'content'\n    },\n    {'1': 'title', '3': 3, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'sub_title', '3': 4, '4': 1, '5': 9, '10': 'subTitle'},\n    {'1': 'achievement_text', '3': 5, '4': 1, '5': 9, '10': 'achievementText'},\n    {'1': 'label_url', '3': 6, '4': 1, '5': 9, '10': 'labelUrl'},\n  ],\n};\n\n/// Descriptor for `ShareReplyInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List shareReplyInfoDescriptor = $convert.base64Decode(\n    'Cg5TaGFyZVJlcGx5SW5mbxJACgZtZW1iZXIYASABKAsyKC5iaWxpYmlsaS5tYWluLmNvbW11bm'\n    'l0eS5yZXBseS52MS5NZW1iZXJSBm1lbWJlchJDCgdjb250ZW50GAIgASgLMikuYmlsaWJpbGku'\n    'bWFpbi5jb21tdW5pdHkucmVwbHkudjEuQ29udGVudFIHY29udGVudBIUCgV0aXRsZRgDIAEoCV'\n    'IFdGl0bGUSGwoJc3ViX3RpdGxlGAQgASgJUghzdWJUaXRsZRIpChBhY2hpZXZlbWVudF90ZXh0'\n    'GAUgASgJUg9hY2hpZXZlbWVudFRleHQSGwoJbGFiZWxfdXJsGAYgASgJUghsYWJlbFVybA==');\n\n@$core.Deprecated('Use shareReplyMaterialReqDescriptor instead')\nconst ShareReplyMaterialReq$json = {\n  '1': 'ShareReplyMaterialReq',\n  '2': [\n    {'1': 'oid', '3': 1, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'type', '3': 2, '4': 1, '5': 3, '10': 'type'},\n    {'1': 'rpid', '3': 3, '4': 1, '5': 3, '10': 'rpid'},\n  ],\n};\n\n/// Descriptor for `ShareReplyMaterialReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List shareReplyMaterialReqDescriptor = $convert.base64Decode(\n    'ChVTaGFyZVJlcGx5TWF0ZXJpYWxSZXESEAoDb2lkGAEgASgDUgNvaWQSEgoEdHlwZRgCIAEoA1'\n    'IEdHlwZRISCgRycGlkGAMgASgDUgRycGlk');\n\n@$core.Deprecated('Use shareReplyMaterialRespDescriptor instead')\nconst ShareReplyMaterialResp$json = {\n  '1': 'ShareReplyMaterialResp',\n  '2': [\n    {\n      '1': 'subject_material',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6':\n          '.bilibili.main.community.reply.v1.ShareReplyMaterialResp.SubjectMaterial',\n      '10': 'subjectMaterial'\n    },\n    {'1': 'qrcode_url', '3': 2, '4': 1, '5': 9, '10': 'qrcodeUrl'},\n    {'1': 'save_pic_text', '3': 3, '4': 1, '5': 9, '10': 'savePicText'},\n    {'1': 'open_app_text', '3': 4, '4': 1, '5': 9, '10': 'openAppText'},\n    {'1': 'share_time_text', '3': 5, '4': 1, '5': 9, '10': 'shareTimeText'},\n    {'1': 'bili_logo_icon', '3': 6, '4': 1, '5': 9, '10': 'biliLogoIcon'},\n    {\n      '1': 'extra',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.ShareReplyMaterialResp.ExtraData',\n      '10': 'extra'\n    },\n  ],\n  '3': [\n    ShareReplyMaterialResp_ArchiveMaterial$json,\n    ShareReplyMaterialResp_ArticleMaterial$json,\n    ShareReplyMaterialResp_DynamicMaterial$json,\n    ShareReplyMaterialResp_ExtraData$json,\n    ShareReplyMaterialResp_SubjectMaterial$json\n  ],\n};\n\n@$core.Deprecated('Use shareReplyMaterialRespDescriptor instead')\nconst ShareReplyMaterialResp_ArchiveMaterial$json = {\n  '1': 'ArchiveMaterial',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 2, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'up_name', '3': 3, '4': 1, '5': 9, '10': 'upName'},\n    {'1': 'up_icon', '3': 4, '4': 1, '5': 9, '10': 'upIcon'},\n  ],\n};\n\n@$core.Deprecated('Use shareReplyMaterialRespDescriptor instead')\nconst ShareReplyMaterialResp_ArticleMaterial$json = {\n  '1': 'ArticleMaterial',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'message', '3': 2, '4': 1, '5': 9, '10': 'message'},\n  ],\n};\n\n@$core.Deprecated('Use shareReplyMaterialRespDescriptor instead')\nconst ShareReplyMaterialResp_DynamicMaterial$json = {\n  '1': 'DynamicMaterial',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'message', '3': 2, '4': 1, '5': 9, '10': 'message'},\n  ],\n};\n\n@$core.Deprecated('Use shareReplyMaterialRespDescriptor instead')\nconst ShareReplyMaterialResp_ExtraData$json = {\n  '1': 'ExtraData',\n  '2': [\n    {'1': 'is_pgc', '3': 1, '4': 1, '5': 8, '10': 'isPgc'},\n    {'1': 'origin_text', '3': 2, '4': 1, '5': 9, '10': 'originText'},\n    {'1': 'topic_id', '3': 3, '4': 1, '5': 3, '10': 'topicId'},\n  ],\n};\n\n@$core.Deprecated('Use shareReplyMaterialRespDescriptor instead')\nconst ShareReplyMaterialResp_SubjectMaterial$json = {\n  '1': 'SubjectMaterial',\n  '2': [\n    {\n      '1': 'archive_material',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6':\n          '.bilibili.main.community.reply.v1.ShareReplyMaterialResp.ArchiveMaterial',\n      '9': 0,\n      '10': 'archiveMaterial'\n    },\n    {\n      '1': 'dynamic_material',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6':\n          '.bilibili.main.community.reply.v1.ShareReplyMaterialResp.DynamicMaterial',\n      '9': 0,\n      '10': 'dynamicMaterial'\n    },\n    {\n      '1': 'article_material',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6':\n          '.bilibili.main.community.reply.v1.ShareReplyMaterialResp.ArticleMaterial',\n      '9': 0,\n      '10': 'articleMaterial'\n    },\n  ],\n  '8': [\n    {'1': 'item'},\n  ],\n};\n\n/// Descriptor for `ShareReplyMaterialResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List shareReplyMaterialRespDescriptor = $convert.base64Decode(\n    'ChZTaGFyZVJlcGx5TWF0ZXJpYWxSZXNwEnMKEHN1YmplY3RfbWF0ZXJpYWwYASABKAsySC5iaW'\n    'xpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5TaGFyZVJlcGx5TWF0ZXJpYWxSZXNwLlN1'\n    'YmplY3RNYXRlcmlhbFIPc3ViamVjdE1hdGVyaWFsEh0KCnFyY29kZV91cmwYAiABKAlSCXFyY2'\n    '9kZVVybBIiCg1zYXZlX3BpY190ZXh0GAMgASgJUgtzYXZlUGljVGV4dBIiCg1vcGVuX2FwcF90'\n    'ZXh0GAQgASgJUgtvcGVuQXBwVGV4dBImCg9zaGFyZV90aW1lX3RleHQYBSABKAlSDXNoYXJlVG'\n    'ltZVRleHQSJAoOYmlsaV9sb2dvX2ljb24YBiABKAlSDGJpbGlMb2dvSWNvbhJYCgVleHRyYRgH'\n    'IAEoCzJCLmJpbGliaWxpLm1haW4uY29tbXVuaXR5LnJlcGx5LnYxLlNoYXJlUmVwbHlNYXRlcm'\n    'lhbFJlc3AuRXh0cmFEYXRhUgVleHRyYRpvCg9BcmNoaXZlTWF0ZXJpYWwSFAoFdGl0bGUYASAB'\n    'KAlSBXRpdGxlEhQKBWNvdmVyGAIgASgJUgVjb3ZlchIXCgd1cF9uYW1lGAMgASgJUgZ1cE5hbW'\n    'USFwoHdXBfaWNvbhgEIAEoCVIGdXBJY29uGkEKD0FydGljbGVNYXRlcmlhbBIUCgV0aXRsZRgB'\n    'IAEoCVIFdGl0bGUSGAoHbWVzc2FnZRgCIAEoCVIHbWVzc2FnZRpBCg9EeW5hbWljTWF0ZXJpYW'\n    'wSFAoFdGl0bGUYASABKAlSBXRpdGxlEhgKB21lc3NhZ2UYAiABKAlSB21lc3NhZ2UaXgoJRXh0'\n    'cmFEYXRhEhUKBmlzX3BnYxgBIAEoCFIFaXNQZ2MSHwoLb3JpZ2luX3RleHQYAiABKAlSCm9yaW'\n    'dpblRleHQSGQoIdG9waWNfaWQYAyABKANSB3RvcGljSWQa/gIKD1N1YmplY3RNYXRlcmlhbBJ1'\n    'ChBhcmNoaXZlX21hdGVyaWFsGAEgASgLMkguYmlsaWJpbGkubWFpbi5jb21tdW5pdHkucmVwbH'\n    'kudjEuU2hhcmVSZXBseU1hdGVyaWFsUmVzcC5BcmNoaXZlTWF0ZXJpYWxIAFIPYXJjaGl2ZU1h'\n    'dGVyaWFsEnUKEGR5bmFtaWNfbWF0ZXJpYWwYAiABKAsySC5iaWxpYmlsaS5tYWluLmNvbW11bm'\n    'l0eS5yZXBseS52MS5TaGFyZVJlcGx5TWF0ZXJpYWxSZXNwLkR5bmFtaWNNYXRlcmlhbEgAUg9k'\n    'eW5hbWljTWF0ZXJpYWwSdQoQYXJ0aWNsZV9tYXRlcmlhbBgDIAEoCzJILmJpbGliaWxpLm1haW'\n    '4uY29tbXVuaXR5LnJlcGx5LnYxLlNoYXJlUmVwbHlNYXRlcmlhbFJlc3AuQXJ0aWNsZU1hdGVy'\n    'aWFsSABSD2FydGljbGVNYXRlcmlhbEIGCgRpdGVt');\n\n@$core.Deprecated('Use shareReplyTopicDescriptor instead')\nconst ShareReplyTopic$json = {\n  '1': 'ShareReplyTopic',\n  '2': [\n    {\n      '1': 'topic',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Topic',\n      '10': 'topic'\n    },\n    {'1': 'origin_text', '3': 2, '4': 1, '5': 9, '10': 'originText'},\n  ],\n};\n\n/// Descriptor for `ShareReplyTopic`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List shareReplyTopicDescriptor = $convert.base64Decode(\n    'Cg9TaGFyZVJlcGx5VG9waWMSPQoFdG9waWMYASABKAsyJy5iaWxpYmlsaS5tYWluLmNvbW11bm'\n    'l0eS5yZXBseS52MS5Ub3BpY1IFdG9waWMSHwoLb3JpZ2luX3RleHQYAiABKAlSCm9yaWdpblRl'\n    'eHQ=');\n\n@$core.Deprecated('Use subjectControlDescriptor instead')\nconst SubjectControl$json = {\n  '1': 'SubjectControl',\n  '2': [\n    {'1': 'up_mid', '3': 1, '4': 1, '5': 3, '10': 'upMid'},\n    {'1': 'is_assist', '3': 2, '4': 1, '5': 8, '10': 'isAssist'},\n    {'1': 'read_only', '3': 3, '4': 1, '5': 8, '10': 'readOnly'},\n    {'1': 'has_vote_access', '3': 4, '4': 1, '5': 8, '10': 'hasVoteAccess'},\n    {\n      '1': 'has_lottery_access',\n      '3': 5,\n      '4': 1,\n      '5': 8,\n      '10': 'hasLotteryAccess'\n    },\n    {'1': 'has_folded_reply', '3': 6, '4': 1, '5': 8, '10': 'hasFoldedReply'},\n    {'1': 'bg_text', '3': 7, '4': 1, '5': 9, '10': 'bgText'},\n    {'1': 'up_blocked', '3': 8, '4': 1, '5': 8, '10': 'upBlocked'},\n    {\n      '1': 'has_activity_access',\n      '3': 9,\n      '4': 1,\n      '5': 8,\n      '10': 'hasActivityAccess'\n    },\n    {'1': 'show_title', '3': 10, '4': 1, '5': 8, '10': 'showTitle'},\n    {'1': 'show_up_action', '3': 11, '4': 1, '5': 8, '10': 'showUpAction'},\n    {'1': 'switcher_type', '3': 12, '4': 1, '5': 3, '10': 'switcherType'},\n    {'1': 'input_disable', '3': 13, '4': 1, '5': 8, '10': 'inputDisable'},\n    {'1': 'root_text', '3': 14, '4': 1, '5': 9, '10': 'rootText'},\n    {'1': 'child_text', '3': 15, '4': 1, '5': 9, '10': 'childText'},\n    {'1': 'count', '3': 16, '4': 1, '5': 3, '10': 'count'},\n    {'1': 'title', '3': 17, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'giveup_text', '3': 18, '4': 1, '5': 9, '10': 'giveupText'},\n    {'1': 'has_note_access', '3': 19, '4': 1, '5': 8, '10': 'hasNoteAccess'},\n    {\n      '1': 'disable_jump_emote',\n      '3': 20,\n      '4': 1,\n      '5': 8,\n      '10': 'disableJumpEmote'\n    },\n    {\n      '1': 'empty_background_text_plain',\n      '3': 21,\n      '4': 1,\n      '5': 9,\n      '10': 'emptyBackgroundTextPlain'\n    },\n    {\n      '1': 'empty_background_text_highlight',\n      '3': 22,\n      '4': 1,\n      '5': 9,\n      '10': 'emptyBackgroundTextHighlight'\n    },\n    {\n      '1': 'empty_background_uri',\n      '3': 23,\n      '4': 1,\n      '5': 9,\n      '10': 'emptyBackgroundUri'\n    },\n    {\n      '1': 'support_filter_tags',\n      '3': 24,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.SubjectControl.FilterTag',\n      '10': 'supportFilterTags'\n    },\n    {\n      '1': 'screenshot_icon_state',\n      '3': 25,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.EditorIconState',\n      '10': 'screenshotIconState'\n    },\n    {\n      '1': 'upload_picture_icon_state',\n      '3': 26,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.EditorIconState',\n      '10': 'uploadPictureIconState'\n    },\n    {\n      '1': 'empty_page',\n      '3': 27,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.EmptyPage',\n      '10': 'emptyPage'\n    },\n    {\n      '1': 'cm_top_reply_protection',\n      '3': 28,\n      '4': 1,\n      '5': 11,\n      '6':\n          '.bilibili.main.community.reply.v1.SubjectControl.CmTopReplyProtection',\n      '10': 'cmTopReplyProtection'\n    },\n    {'1': 'enable_charged', '3': 29, '4': 1, '5': 8, '10': 'enableCharged'},\n  ],\n  '3': [\n    SubjectControl_CmTopReplyProtection$json,\n    SubjectControl_FilterTag$json\n  ],\n};\n\n@$core.Deprecated('Use subjectControlDescriptor instead')\nconst SubjectControl_CmTopReplyProtection$json = {\n  '1': 'CmTopReplyProtection',\n  '2': [\n    {\n      '1': 'protected_top_rpid',\n      '3': 1,\n      '4': 1,\n      '5': 3,\n      '10': 'protectedTopRpid'\n    },\n    {'1': 'popup_message', '3': 2, '4': 1, '5': 9, '10': 'popupMessage'},\n    {'1': 'appeal_url', '3': 3, '4': 1, '5': 9, '10': 'appealUrl'},\n  ],\n};\n\n@$core.Deprecated('Use subjectControlDescriptor instead')\nconst SubjectControl_FilterTag$json = {\n  '1': 'FilterTag',\n  '2': [\n    {'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'event_id', '3': 2, '4': 1, '5': 9, '10': 'eventId'},\n  ],\n};\n\n/// Descriptor for `SubjectControl`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List subjectControlDescriptor = $convert.base64Decode(\n    'Cg5TdWJqZWN0Q29udHJvbBIVCgZ1cF9taWQYASABKANSBXVwTWlkEhsKCWlzX2Fzc2lzdBgCIA'\n    'EoCFIIaXNBc3Npc3QSGwoJcmVhZF9vbmx5GAMgASgIUghyZWFkT25seRImCg9oYXNfdm90ZV9h'\n    'Y2Nlc3MYBCABKAhSDWhhc1ZvdGVBY2Nlc3MSLAoSaGFzX2xvdHRlcnlfYWNjZXNzGAUgASgIUh'\n    'BoYXNMb3R0ZXJ5QWNjZXNzEigKEGhhc19mb2xkZWRfcmVwbHkYBiABKAhSDmhhc0ZvbGRlZFJl'\n    'cGx5EhcKB2JnX3RleHQYByABKAlSBmJnVGV4dBIdCgp1cF9ibG9ja2VkGAggASgIUgl1cEJsb2'\n    'NrZWQSLgoTaGFzX2FjdGl2aXR5X2FjY2VzcxgJIAEoCFIRaGFzQWN0aXZpdHlBY2Nlc3MSHQoK'\n    'c2hvd190aXRsZRgKIAEoCFIJc2hvd1RpdGxlEiQKDnNob3dfdXBfYWN0aW9uGAsgASgIUgxzaG'\n    '93VXBBY3Rpb24SIwoNc3dpdGNoZXJfdHlwZRgMIAEoA1IMc3dpdGNoZXJUeXBlEiMKDWlucHV0'\n    'X2Rpc2FibGUYDSABKAhSDGlucHV0RGlzYWJsZRIbCglyb290X3RleHQYDiABKAlSCHJvb3RUZX'\n    'h0Eh0KCmNoaWxkX3RleHQYDyABKAlSCWNoaWxkVGV4dBIUCgVjb3VudBgQIAEoA1IFY291bnQS'\n    'FAoFdGl0bGUYESABKAlSBXRpdGxlEh8KC2dpdmV1cF90ZXh0GBIgASgJUgpnaXZldXBUZXh0Ei'\n    'YKD2hhc19ub3RlX2FjY2VzcxgTIAEoCFINaGFzTm90ZUFjY2VzcxIsChJkaXNhYmxlX2p1bXBf'\n    'ZW1vdGUYFCABKAhSEGRpc2FibGVKdW1wRW1vdGUSPQobZW1wdHlfYmFja2dyb3VuZF90ZXh0X3'\n    'BsYWluGBUgASgJUhhlbXB0eUJhY2tncm91bmRUZXh0UGxhaW4SRQofZW1wdHlfYmFja2dyb3Vu'\n    'ZF90ZXh0X2hpZ2hsaWdodBgWIAEoCVIcZW1wdHlCYWNrZ3JvdW5kVGV4dEhpZ2hsaWdodBIwCh'\n    'RlbXB0eV9iYWNrZ3JvdW5kX3VyaRgXIAEoCVISZW1wdHlCYWNrZ3JvdW5kVXJpEmoKE3N1cHBv'\n    'cnRfZmlsdGVyX3RhZ3MYGCADKAsyOi5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS'\n    '5TdWJqZWN0Q29udHJvbC5GaWx0ZXJUYWdSEXN1cHBvcnRGaWx0ZXJUYWdzEmUKFXNjcmVlbnNo'\n    'b3RfaWNvbl9zdGF0ZRgZIAEoDjIxLmJpbGliaWxpLm1haW4uY29tbXVuaXR5LnJlcGx5LnYxLk'\n    'VkaXRvckljb25TdGF0ZVITc2NyZWVuc2hvdEljb25TdGF0ZRJsChl1cGxvYWRfcGljdHVyZV9p'\n    'Y29uX3N0YXRlGBogASgOMjEuYmlsaWJpbGkubWFpbi5jb21tdW5pdHkucmVwbHkudjEuRWRpdG'\n    '9ySWNvblN0YXRlUhZ1cGxvYWRQaWN0dXJlSWNvblN0YXRlEkoKCmVtcHR5X3BhZ2UYGyABKAsy'\n    'Ky5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5FbXB0eVBhZ2VSCWVtcHR5UGFnZR'\n    'J8ChdjbV90b3BfcmVwbHlfcHJvdGVjdGlvbhgcIAEoCzJFLmJpbGliaWxpLm1haW4uY29tbXVu'\n    'aXR5LnJlcGx5LnYxLlN1YmplY3RDb250cm9sLkNtVG9wUmVwbHlQcm90ZWN0aW9uUhRjbVRvcF'\n    'JlcGx5UHJvdGVjdGlvbhIlCg5lbmFibGVfY2hhcmdlZBgdIAEoCFINZW5hYmxlQ2hhcmdlZBqI'\n    'AQoUQ21Ub3BSZXBseVByb3RlY3Rpb24SLAoScHJvdGVjdGVkX3RvcF9ycGlkGAEgASgDUhBwcm'\n    '90ZWN0ZWRUb3BScGlkEiMKDXBvcHVwX21lc3NhZ2UYAiABKAlSDHBvcHVwTWVzc2FnZRIdCgph'\n    'cHBlYWxfdXJsGAMgASgJUglhcHBlYWxVcmwaOgoJRmlsdGVyVGFnEhIKBG5hbWUYASABKAlSBG'\n    '5hbWUSGQoIZXZlbnRfaWQYAiABKAlSB2V2ZW50SWQ=');\n\n@$core.Deprecated('Use subjectTopCardsDescriptor instead')\nconst SubjectTopCards$json = {\n  '1': 'SubjectTopCards',\n  '2': [\n    {\n      '1': 'ogv_grade',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.OgvGradeCard',\n      '9': 0,\n      '10': 'ogvGrade'\n    },\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.SubjectTopCards.Type',\n      '10': 'type'\n    },\n    {'1': 'oid', '3': 2, '4': 1, '5': 9, '10': 'oid'},\n  ],\n  '4': [SubjectTopCards_Type$json],\n  '8': [\n    {'1': 'item'},\n  ],\n};\n\n@$core.Deprecated('Use subjectTopCardsDescriptor instead')\nconst SubjectTopCards_Type$json = {\n  '1': 'Type',\n  '2': [\n    {'1': 'UNKNOWN_Type', '2': 0},\n    {'1': 'OGV_GRADE', '2': 1},\n  ],\n};\n\n/// Descriptor for `SubjectTopCards`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List subjectTopCardsDescriptor = $convert.base64Decode(\n    'Cg9TdWJqZWN0VG9wQ2FyZHMSTQoJb2d2X2dyYWRlGAMgASgLMi4uYmlsaWJpbGkubWFpbi5jb2'\n    '1tdW5pdHkucmVwbHkudjEuT2d2R3JhZGVDYXJkSABSCG9ndkdyYWRlEkoKBHR5cGUYASABKA4y'\n    'Ni5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5TdWJqZWN0VG9wQ2FyZHMuVHlwZV'\n    'IEdHlwZRIQCgNvaWQYAiABKAlSA29pZCInCgRUeXBlEhAKDFVOS05PV05fVHlwZRAAEg0KCU9H'\n    'Vl9HUkFERRABQgYKBGl0ZW0=');\n\n@$core.Deprecated('Use suggestEmotesReqDescriptor instead')\nconst SuggestEmotesReq$json = {\n  '1': 'SuggestEmotesReq',\n  '2': [\n    {'1': 'oid', '3': 1, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'type', '3': 2, '4': 1, '5': 3, '10': 'type'},\n  ],\n};\n\n/// Descriptor for `SuggestEmotesReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List suggestEmotesReqDescriptor = $convert.base64Decode(\n    'ChBTdWdnZXN0RW1vdGVzUmVxEhAKA29pZBgBIAEoA1IDb2lkEhIKBHR5cGUYAiABKANSBHR5cG'\n    'U=');\n\n@$core.Deprecated('Use suggestEmotesRespDescriptor instead')\nconst SuggestEmotesResp$json = {\n  '1': 'SuggestEmotesResp',\n  '2': [\n    {\n      '1': 'emotes',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Emote',\n      '10': 'emotes'\n    },\n  ],\n};\n\n/// Descriptor for `SuggestEmotesResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List suggestEmotesRespDescriptor = $convert.base64Decode(\n    'ChFTdWdnZXN0RW1vdGVzUmVzcBI/CgZlbW90ZXMYASADKAsyJy5iaWxpYmlsaS5tYWluLmNvbW'\n    '11bml0eS5yZXBseS52MS5FbW90ZVIGZW1vdGVz');\n\n@$core.Deprecated('Use textStyleDescriptor instead')\nconst TextStyle$json = {\n  '1': 'TextStyle',\n  '2': [\n    {'1': 'font_size', '3': 1, '4': 1, '5': 5, '10': 'fontSize'},\n    {\n      '1': 'font_style',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.TextStyle.FontStyle',\n      '10': 'fontStyle'\n    },\n    {'1': 'text_day_color', '3': 3, '4': 1, '5': 9, '10': 'textDayColor'},\n    {'1': 'text_night_color', '3': 4, '4': 1, '5': 9, '10': 'textNightColor'},\n  ],\n  '4': [TextStyle_FontStyle$json],\n};\n\n@$core.Deprecated('Use textStyleDescriptor instead')\nconst TextStyle_FontStyle$json = {\n  '1': 'FontStyle',\n  '2': [\n    {'1': 'NORMAL', '2': 0},\n    {'1': 'BOLD', '2': 1},\n  ],\n};\n\n/// Descriptor for `TextStyle`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List textStyleDescriptor = $convert.base64Decode(\n    'CglUZXh0U3R5bGUSGwoJZm9udF9zaXplGAEgASgFUghmb250U2l6ZRJUCgpmb250X3N0eWxlGA'\n    'IgASgOMjUuYmlsaWJpbGkubWFpbi5jb21tdW5pdHkucmVwbHkudjEuVGV4dFN0eWxlLkZvbnRT'\n    'dHlsZVIJZm9udFN0eWxlEiQKDnRleHRfZGF5X2NvbG9yGAMgASgJUgx0ZXh0RGF5Q29sb3ISKA'\n    'oQdGV4dF9uaWdodF9jb2xvchgEIAEoCVIOdGV4dE5pZ2h0Q29sb3IiIQoJRm9udFN0eWxlEgoK'\n    'Bk5PUk1BTBAAEggKBEJPTEQQAQ==');\n\n@$core.Deprecated('Use topicDescriptor instead')\nconst Topic$json = {\n  '1': 'Topic',\n  '2': [\n    {'1': 'link', '3': 1, '4': 1, '5': 9, '10': 'link'},\n    {'1': 'id', '3': 2, '4': 1, '5': 3, '10': 'id'},\n  ],\n};\n\n/// Descriptor for `Topic`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List topicDescriptor = $convert.base64Decode(\n    'CgVUb3BpYxISCgRsaW5rGAEgASgJUgRsaW5rEg4KAmlkGAIgASgDUgJpZA==');\n\n@$core.Deprecated('Use uGCVideoSearchItemDescriptor instead')\nconst UGCVideoSearchItem$json = {\n  '1': 'UGCVideoSearchItem',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'up_nickname', '3': 2, '4': 1, '5': 9, '10': 'upNickname'},\n    {'1': 'duration', '3': 3, '4': 1, '5': 3, '10': 'duration'},\n    {'1': 'cover', '3': 4, '4': 1, '5': 9, '10': 'cover'},\n  ],\n};\n\n/// Descriptor for `UGCVideoSearchItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List uGCVideoSearchItemDescriptor = $convert.base64Decode(\n    'ChJVR0NWaWRlb1NlYXJjaEl0ZW0SFAoFdGl0bGUYASABKAlSBXRpdGxlEh8KC3VwX25pY2tuYW'\n    '1lGAIgASgJUgp1cE5pY2tuYW1lEhoKCGR1cmF0aW9uGAMgASgDUghkdXJhdGlvbhIUCgVjb3Zl'\n    'chgEIAEoCVIFY292ZXI=');\n\n@$core.Deprecated('Use upSelectionDescriptor instead')\nconst UpSelection$json = {\n  '1': 'UpSelection',\n  '2': [\n    {'1': 'pending_count', '3': 1, '4': 1, '5': 3, '10': 'pendingCount'},\n    {'1': 'ignore_count', '3': 2, '4': 1, '5': 3, '10': 'ignoreCount'},\n  ],\n};\n\n/// Descriptor for `UpSelection`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List upSelectionDescriptor = $convert.base64Decode(\n    'CgtVcFNlbGVjdGlvbhIjCg1wZW5kaW5nX2NvdW50GAEgASgDUgxwZW5kaW5nQ291bnQSIQoMaW'\n    'dub3JlX2NvdW50GAIgASgDUgtpZ25vcmVDb3VudA==');\n\n@$core\n    .Deprecated('Use updateSingleReplyNotificationConfigReqDescriptor instead')\nconst UpdateSingleReplyNotificationConfigReq$json = {\n  '1': 'UpdateSingleReplyNotificationConfigReq',\n  '2': [\n    {'1': 'rpid', '3': 1, '4': 1, '5': 3, '10': 'rpid'},\n    {'1': 'type', '3': 2, '4': 1, '5': 3, '10': 'type'},\n    {'1': 'oid', '3': 3, '4': 1, '5': 3, '10': 'oid'},\n    {\n      '1': 'push_switch',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.ReplyNotificationSwitch',\n      '10': 'pushSwitch'\n    },\n  ],\n};\n\n/// Descriptor for `UpdateSingleReplyNotificationConfigReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List updateSingleReplyNotificationConfigReqDescriptor =\n    $convert.base64Decode(\n        'CiZVcGRhdGVTaW5nbGVSZXBseU5vdGlmaWNhdGlvbkNvbmZpZ1JlcRISCgRycGlkGAEgASgDUg'\n        'RycGlkEhIKBHR5cGUYAiABKANSBHR5cGUSEAoDb2lkGAMgASgDUgNvaWQSWgoLcHVzaF9zd2l0'\n        'Y2gYBCABKA4yOS5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5SZXBseU5vdGlmaW'\n        'NhdGlvblN3aXRjaFIKcHVzaFN3aXRjaA==');\n\n@$core\n    .Deprecated('Use updateSingleReplyNotificationConfigRespDescriptor instead')\nconst UpdateSingleReplyNotificationConfigResp$json = {\n  '1': 'UpdateSingleReplyNotificationConfigResp',\n};\n\n/// Descriptor for `UpdateSingleReplyNotificationConfigResp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List updateSingleReplyNotificationConfigRespDescriptor =\n    $convert.base64Decode(\n        'CidVcGRhdGVTaW5nbGVSZXBseU5vdGlmaWNhdGlvbkNvbmZpZ1Jlc3A=');\n\n@$core.Deprecated('Use urlDescriptor instead')\nconst Url$json = {\n  '1': 'Url',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'state', '3': 2, '4': 1, '5': 3, '10': 'state'},\n    {'1': 'prefix_icon', '3': 3, '4': 1, '5': 9, '10': 'prefixIcon'},\n    {'1': 'app_url_schema', '3': 4, '4': 1, '5': 9, '10': 'appUrlSchema'},\n    {'1': 'app_name', '3': 5, '4': 1, '5': 9, '10': 'appName'},\n    {'1': 'app_package_name', '3': 6, '4': 1, '5': 9, '10': 'appPackageName'},\n    {'1': 'click_report', '3': 7, '4': 1, '5': 9, '10': 'clickReport'},\n    {'1': 'is_half_screen', '3': 8, '4': 1, '5': 8, '10': 'isHalfScreen'},\n    {'1': 'exposure_report', '3': 9, '4': 1, '5': 9, '10': 'exposureReport'},\n    {\n      '1': 'extra',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.Url.Extra',\n      '10': 'extra'\n    },\n    {'1': 'underline', '3': 11, '4': 1, '5': 8, '10': 'underline'},\n    {'1': 'match_once', '3': 12, '4': 1, '5': 8, '10': 'matchOnce'},\n    {'1': 'pc_url', '3': 13, '4': 1, '5': 9, '10': 'pcUrl'},\n    {\n      '1': 'icon_position',\n      '3': 14,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.Url.IconPosition',\n      '10': 'iconPosition'\n    },\n  ],\n  '3': [Url_Extra$json],\n  '4': [Url_IconPosition$json],\n};\n\n@$core.Deprecated('Use urlDescriptor instead')\nconst Url_Extra$json = {\n  '1': 'Extra',\n  '2': [\n    {'1': 'goods_item_id', '3': 1, '4': 1, '5': 3, '10': 'goodsItemId'},\n    {\n      '1': 'goods_prefetched_cache',\n      '3': 2,\n      '4': 1,\n      '5': 9,\n      '10': 'goodsPrefetchedCache'\n    },\n    {\n      '1': 'goods_show_type',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.Url.Extra.GoodsShowType',\n      '10': 'goodsShowType'\n    },\n    {'1': 'is_word_search', '3': 4, '4': 1, '5': 8, '10': 'isWordSearch'},\n    {'1': 'goods_cm_control', '3': 5, '4': 1, '5': 3, '10': 'goodsCmControl'},\n    {\n      '1': 'goods_click_report',\n      '3': 6,\n      '4': 1,\n      '5': 9,\n      '10': 'goodsClickReport'\n    },\n    {\n      '1': 'goods_exposure_report',\n      '3': 7,\n      '4': 1,\n      '5': 9,\n      '10': 'goodsExposureReport'\n    },\n    {\n      '1': 'goods_show_pop_window',\n      '3': 8,\n      '4': 1,\n      '5': 3,\n      '10': 'goodsShowPopWindow'\n    },\n  ],\n  '4': [Url_Extra_GoodsShowType$json],\n};\n\n@$core.Deprecated('Use urlDescriptor instead')\nconst Url_Extra_GoodsShowType$json = {\n  '1': 'GoodsShowType',\n  '2': [\n    {'1': 'Popup', '2': 0},\n    {'1': 'FullScreen', '2': 1},\n    {'1': 'HalfScreen', '2': 2},\n  ],\n};\n\n@$core.Deprecated('Use urlDescriptor instead')\nconst Url_IconPosition$json = {\n  '1': 'IconPosition',\n  '2': [\n    {'1': 'Prefix', '2': 0},\n    {'1': 'Suffix', '2': 1},\n  ],\n};\n\n/// Descriptor for `Url`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List urlDescriptor = $convert.base64Decode(\n    'CgNVcmwSFAoFdGl0bGUYASABKAlSBXRpdGxlEhQKBXN0YXRlGAIgASgDUgVzdGF0ZRIfCgtwcm'\n    'VmaXhfaWNvbhgDIAEoCVIKcHJlZml4SWNvbhIkCg5hcHBfdXJsX3NjaGVtYRgEIAEoCVIMYXBw'\n    'VXJsU2NoZW1hEhkKCGFwcF9uYW1lGAUgASgJUgdhcHBOYW1lEigKEGFwcF9wYWNrYWdlX25hbW'\n    'UYBiABKAlSDmFwcFBhY2thZ2VOYW1lEiEKDGNsaWNrX3JlcG9ydBgHIAEoCVILY2xpY2tSZXBv'\n    'cnQSJAoOaXNfaGFsZl9zY3JlZW4YCCABKAhSDGlzSGFsZlNjcmVlbhInCg9leHBvc3VyZV9yZX'\n    'BvcnQYCSABKAlSDmV4cG9zdXJlUmVwb3J0EkEKBWV4dHJhGAogASgLMisuYmlsaWJpbGkubWFp'\n    'bi5jb21tdW5pdHkucmVwbHkudjEuVXJsLkV4dHJhUgVleHRyYRIcCgl1bmRlcmxpbmUYCyABKA'\n    'hSCXVuZGVybGluZRIdCgptYXRjaF9vbmNlGAwgASgIUgltYXRjaE9uY2USFQoGcGNfdXJsGA0g'\n    'ASgJUgVwY1VybBJXCg1pY29uX3Bvc2l0aW9uGA4gASgOMjIuYmlsaWJpbGkubWFpbi5jb21tdW'\n    '5pdHkucmVwbHkudjEuVXJsLkljb25Qb3NpdGlvblIMaWNvblBvc2l0aW9uGuUDCgVFeHRyYRIi'\n    'Cg1nb29kc19pdGVtX2lkGAEgASgDUgtnb29kc0l0ZW1JZBI0ChZnb29kc19wcmVmZXRjaGVkX2'\n    'NhY2hlGAIgASgJUhRnb29kc1ByZWZldGNoZWRDYWNoZRJhCg9nb29kc19zaG93X3R5cGUYAyAB'\n    'KA4yOS5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5VcmwuRXh0cmEuR29vZHNTaG'\n    '93VHlwZVINZ29vZHNTaG93VHlwZRIkCg5pc193b3JkX3NlYXJjaBgEIAEoCFIMaXNXb3JkU2Vh'\n    'cmNoEigKEGdvb2RzX2NtX2NvbnRyb2wYBSABKANSDmdvb2RzQ21Db250cm9sEiwKEmdvb2RzX2'\n    'NsaWNrX3JlcG9ydBgGIAEoCVIQZ29vZHNDbGlja1JlcG9ydBIyChVnb29kc19leHBvc3VyZV9y'\n    'ZXBvcnQYByABKAlSE2dvb2RzRXhwb3N1cmVSZXBvcnQSMQoVZ29vZHNfc2hvd19wb3Bfd2luZG'\n    '93GAggASgDUhJnb29kc1Nob3dQb3BXaW5kb3ciOgoNR29vZHNTaG93VHlwZRIJCgVQb3B1cBAA'\n    'Eg4KCkZ1bGxTY3JlZW4QARIOCgpIYWxmU2NyZWVuEAIiJgoMSWNvblBvc2l0aW9uEgoKBlByZW'\n    'ZpeBAAEgoKBlN1ZmZpeBAB');\n\n@$core.Deprecated('Use userCallbackReplyDescriptor instead')\nconst UserCallbackReply$json = {\n  '1': 'UserCallbackReply',\n};\n\n/// Descriptor for `UserCallbackReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List userCallbackReplyDescriptor =\n    $convert.base64Decode('ChFVc2VyQ2FsbGJhY2tSZXBseQ==');\n\n@$core.Deprecated('Use userCallbackReqDescriptor instead')\nconst UserCallbackReq$json = {\n  '1': 'UserCallbackReq',\n  '2': [\n    {'1': 'mid', '3': 1, '4': 1, '5': 3, '10': 'mid'},\n    {\n      '1': 'scene',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.UserCallbackScene',\n      '10': 'scene'\n    },\n    {\n      '1': 'action',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.UserCallbackAction',\n      '10': 'action'\n    },\n    {'1': 'oid', '3': 4, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'type', '3': 5, '4': 1, '5': 3, '10': 'type'},\n    {'1': 'rpids', '3': 6, '4': 3, '5': 3, '10': 'rpids'},\n  ],\n};\n\n/// Descriptor for `UserCallbackReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List userCallbackReqDescriptor = $convert.base64Decode(\n    'Cg9Vc2VyQ2FsbGJhY2tSZXESEAoDbWlkGAEgASgDUgNtaWQSSQoFc2NlbmUYAiABKA4yMy5iaW'\n    'xpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5Vc2VyQ2FsbGJhY2tTY2VuZVIFc2NlbmUS'\n    'TAoGYWN0aW9uGAMgASgOMjQuYmlsaWJpbGkubWFpbi5jb21tdW5pdHkucmVwbHkudjEuVXNlck'\n    'NhbGxiYWNrQWN0aW9uUgZhY3Rpb24SEAoDb2lkGAQgASgDUgNvaWQSEgoEdHlwZRgFIAEoA1IE'\n    'dHlwZRIUCgVycGlkcxgGIAMoA1IFcnBpZHM=');\n\n@$core.Deprecated('Use videoSearchItemDescriptor instead')\nconst VideoSearchItem$json = {\n  '1': 'VideoSearchItem',\n  '2': [\n    {\n      '1': 'ugc',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.UGCVideoSearchItem',\n      '9': 0,\n      '10': 'ugc'\n    },\n    {\n      '1': 'pgc',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.PGCVideoSearchItem',\n      '9': 0,\n      '10': 'pgc'\n    },\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.main.community.reply.v1.SearchItemVideoSubType',\n      '10': 'type'\n    },\n  ],\n  '8': [\n    {'1': 'video_item'},\n  ],\n};\n\n/// Descriptor for `VideoSearchItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List videoSearchItemDescriptor = $convert.base64Decode(\n    'Cg9WaWRlb1NlYXJjaEl0ZW0SSAoDdWdjGAIgASgLMjQuYmlsaWJpbGkubWFpbi5jb21tdW5pdH'\n    'kucmVwbHkudjEuVUdDVmlkZW9TZWFyY2hJdGVtSABSA3VnYxJICgNwZ2MYAyABKAsyNC5iaWxp'\n    'YmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5QR0NWaWRlb1NlYXJjaEl0ZW1IAFIDcGdjEk'\n    'wKBHR5cGUYASABKA4yOC5iaWxpYmlsaS5tYWluLmNvbW11bml0eS5yZXBseS52MS5TZWFyY2hJ'\n    'dGVtVmlkZW9TdWJUeXBlUgR0eXBlQgwKCnZpZGVvX2l0ZW0=');\n\n@$core.Deprecated('Use voteDescriptor instead')\nconst Vote$json = {\n  '1': 'Vote',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'count', '3': 3, '4': 1, '5': 3, '10': 'count'},\n  ],\n};\n\n/// Descriptor for `Vote`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List voteDescriptor = $convert.base64Decode(\n    'CgRWb3RlEg4KAmlkGAEgASgDUgJpZBIUCgV0aXRsZRgCIAEoCVIFdGl0bGUSFAoFY291bnQYAy'\n    'ABKANSBWNvdW50');\n\n@$core.Deprecated('Use voteCardDescriptor instead')\nconst VoteCard$json = {\n  '1': 'VoteCard',\n  '2': [\n    {'1': 'vote_id', '3': 1, '4': 1, '5': 3, '10': 'voteId'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'count', '3': 3, '4': 1, '5': 3, '10': 'count'},\n    {\n      '1': 'options',\n      '3': 4,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.main.community.reply.v1.VoteCard.Option',\n      '10': 'options'\n    },\n    {'1': 'my_vote_option', '3': 5, '4': 1, '5': 3, '10': 'myVoteOption'},\n  ],\n  '3': [VoteCard_Option$json],\n};\n\n@$core.Deprecated('Use voteCardDescriptor instead')\nconst VoteCard_Option$json = {\n  '1': 'Option',\n  '2': [\n    {'1': 'idx', '3': 1, '4': 1, '5': 3, '10': 'idx'},\n    {'1': 'desc', '3': 2, '4': 1, '5': 9, '10': 'desc'},\n    {'1': 'count', '3': 3, '4': 1, '5': 3, '10': 'count'},\n  ],\n};\n\n/// Descriptor for `VoteCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List voteCardDescriptor = $convert.base64Decode(\n    'CghWb3RlQ2FyZBIXCgd2b3RlX2lkGAEgASgDUgZ2b3RlSWQSFAoFdGl0bGUYAiABKAlSBXRpdG'\n    'xlEhQKBWNvdW50GAMgASgDUgVjb3VudBJLCgdvcHRpb25zGAQgAygLMjEuYmlsaWJpbGkubWFp'\n    'bi5jb21tdW5pdHkucmVwbHkudjEuVm90ZUNhcmQuT3B0aW9uUgdvcHRpb25zEiQKDm15X3ZvdG'\n    'Vfb3B0aW9uGAUgASgDUgxteVZvdGVPcHRpb24aRAoGT3B0aW9uEhAKA2lkeBgBIAEoA1IDaWR4'\n    'EhIKBGRlc2MYAiABKAlSBGRlc2MSFAoFY291bnQYAyABKANSBWNvdW50');\n\n@$core.Deprecated('Use wordSearchParamDescriptor instead')\nconst WordSearchParam$json = {\n  '1': 'WordSearchParam',\n  '2': [\n    {'1': 'shown_count', '3': 1, '4': 1, '5': 3, '10': 'shownCount'},\n  ],\n};\n\n/// Descriptor for `WordSearchParam`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List wordSearchParamDescriptor = $convert.base64Decode(\n    'Cg9Xb3JkU2VhcmNoUGFyYW0SHwoLc2hvd25fY291bnQYASABKANSCnNob3duQ291bnQ=');\n"
  },
  {
    "path": "lib/grpc/bilibili/metadata/device.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/metadata/device.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:fixnum/fixnum.dart' as $fixnum;\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nclass Device extends $pb.GeneratedMessage {\n  factory Device({\n    $core.int? appId,\n    $core.int? build,\n    $core.String? buvid,\n    $core.String? mobiApp,\n    $core.String? platform,\n    $core.String? device,\n    $core.String? channel,\n    $core.String? brand,\n    $core.String? model,\n    $core.String? osver,\n    $core.String? fpLocal,\n    $core.String? fpRemote,\n    $core.String? versionName,\n    $core.String? fp,\n    $fixnum.Int64? fts,\n    $core.String? guestId,\n  }) {\n    final result = create();\n    if (appId != null) result.appId = appId;\n    if (build != null) result.build = build;\n    if (buvid != null) result.buvid = buvid;\n    if (mobiApp != null) result.mobiApp = mobiApp;\n    if (platform != null) result.platform = platform;\n    if (device != null) result.device = device;\n    if (channel != null) result.channel = channel;\n    if (brand != null) result.brand = brand;\n    if (model != null) result.model = model;\n    if (osver != null) result.osver = osver;\n    if (fpLocal != null) result.fpLocal = fpLocal;\n    if (fpRemote != null) result.fpRemote = fpRemote;\n    if (versionName != null) result.versionName = versionName;\n    if (fp != null) result.fp = fp;\n    if (fts != null) result.fts = fts;\n    if (guestId != null) result.guestId = guestId;\n    return result;\n  }\n\n  Device._();\n\n  factory Device.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Device.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Device',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.metadata.device'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'appId')\n    ..aI(2, _omitFieldNames ? '' : 'build')\n    ..aOS(3, _omitFieldNames ? '' : 'buvid')\n    ..aOS(4, _omitFieldNames ? '' : 'mobiApp')\n    ..aOS(5, _omitFieldNames ? '' : 'platform')\n    ..aOS(6, _omitFieldNames ? '' : 'device')\n    ..aOS(7, _omitFieldNames ? '' : 'channel')\n    ..aOS(8, _omitFieldNames ? '' : 'brand')\n    ..aOS(9, _omitFieldNames ? '' : 'model')\n    ..aOS(10, _omitFieldNames ? '' : 'osver')\n    ..aOS(11, _omitFieldNames ? '' : 'fpLocal')\n    ..aOS(12, _omitFieldNames ? '' : 'fpRemote')\n    ..aOS(13, _omitFieldNames ? '' : 'versionName')\n    ..aOS(14, _omitFieldNames ? '' : 'fp')\n    ..aInt64(15, _omitFieldNames ? '' : 'fts')\n    ..aOS(16, _omitFieldNames ? '' : 'guestId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Device clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Device copyWith(void Function(Device) updates) =>\n      super.copyWith((message) => updates(message as Device)) as Device;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Device create() => Device._();\n  @$core.override\n  Device createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Device getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Device>(create);\n  static Device? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get appId => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set appId($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAppId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAppId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get build => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set build($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBuild() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBuild() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get buvid => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set buvid($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBuvid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBuvid() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get mobiApp => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set mobiApp($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasMobiApp() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearMobiApp() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get platform => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set platform($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasPlatform() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearPlatform() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get device => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set device($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasDevice() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearDevice() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get channel => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set channel($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasChannel() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearChannel() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get brand => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set brand($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasBrand() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearBrand() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get model => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set model($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasModel() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearModel() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get osver => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set osver($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasOsver() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearOsver() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get fpLocal => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set fpLocal($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasFpLocal() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearFpLocal() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get fpRemote => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set fpRemote($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasFpRemote() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearFpRemote() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.String get versionName => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set versionName($core.String value) => $_setString(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasVersionName() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearVersionName() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.String get fp => $_getSZ(13);\n  @$pb.TagNumber(14)\n  set fp($core.String value) => $_setString(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasFp() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearFp() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $fixnum.Int64 get fts => $_getI64(14);\n  @$pb.TagNumber(15)\n  set fts($fixnum.Int64 value) => $_setInt64(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasFts() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearFts() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $core.String get guestId => $_getSZ(15);\n  @$pb.TagNumber(16)\n  set guestId($core.String value) => $_setString(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasGuestId() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearGuestId() => $_clearField(16);\n}\n\nclass DeviceType extends $pb.GeneratedMessage {\n  factory DeviceType() => create();\n\n  DeviceType._();\n\n  factory DeviceType.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DeviceType.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DeviceType',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.metadata.device'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DeviceType clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DeviceType copyWith(void Function(DeviceType) updates) =>\n      super.copyWith((message) => updates(message as DeviceType)) as DeviceType;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DeviceType create() => DeviceType._();\n  @$core.override\n  DeviceType createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DeviceType getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DeviceType>(create);\n  static DeviceType? _defaultInstance;\n}\n\nclass MobiApp extends $pb.GeneratedMessage {\n  factory MobiApp() => create();\n\n  MobiApp._();\n\n  factory MobiApp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MobiApp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MobiApp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.metadata.device'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MobiApp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MobiApp copyWith(void Function(MobiApp) updates) =>\n      super.copyWith((message) => updates(message as MobiApp)) as MobiApp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MobiApp create() => MobiApp._();\n  @$core.override\n  MobiApp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MobiApp getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<MobiApp>(create);\n  static MobiApp? _defaultInstance;\n}\n\nclass Platform extends $pb.GeneratedMessage {\n  factory Platform() => create();\n\n  Platform._();\n\n  factory Platform.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Platform.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Platform',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.metadata.device'),\n      createEmptyInstance: create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Platform clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Platform copyWith(void Function(Platform) updates) =>\n      super.copyWith((message) => updates(message as Platform)) as Platform;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Platform create() => Platform._();\n  @$core.override\n  Platform createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Platform getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Platform>(create);\n  static Platform? _defaultInstance;\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/metadata/device.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/metadata/device.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n"
  },
  {
    "path": "lib/grpc/bilibili/metadata/device.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/metadata/device.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use deviceDescriptor instead')\nconst Device$json = {\n  '1': 'Device',\n  '2': [\n    {'1': 'app_id', '3': 1, '4': 1, '5': 5, '10': 'appId'},\n    {'1': 'build', '3': 2, '4': 1, '5': 5, '10': 'build'},\n    {'1': 'buvid', '3': 3, '4': 1, '5': 9, '10': 'buvid'},\n    {'1': 'mobi_app', '3': 4, '4': 1, '5': 9, '10': 'mobiApp'},\n    {'1': 'platform', '3': 5, '4': 1, '5': 9, '10': 'platform'},\n    {'1': 'device', '3': 6, '4': 1, '5': 9, '10': 'device'},\n    {'1': 'channel', '3': 7, '4': 1, '5': 9, '10': 'channel'},\n    {'1': 'brand', '3': 8, '4': 1, '5': 9, '10': 'brand'},\n    {'1': 'model', '3': 9, '4': 1, '5': 9, '10': 'model'},\n    {'1': 'osver', '3': 10, '4': 1, '5': 9, '10': 'osver'},\n    {'1': 'fp_local', '3': 11, '4': 1, '5': 9, '10': 'fpLocal'},\n    {'1': 'fp_remote', '3': 12, '4': 1, '5': 9, '10': 'fpRemote'},\n    {'1': 'version_name', '3': 13, '4': 1, '5': 9, '10': 'versionName'},\n    {'1': 'fp', '3': 14, '4': 1, '5': 9, '10': 'fp'},\n    {'1': 'fts', '3': 15, '4': 1, '5': 3, '10': 'fts'},\n    {'1': 'guest_id', '3': 16, '4': 1, '5': 9, '10': 'guestId'},\n  ],\n};\n\n/// Descriptor for `Device`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List deviceDescriptor = $convert.base64Decode(\n    'CgZEZXZpY2USFQoGYXBwX2lkGAEgASgFUgVhcHBJZBIUCgVidWlsZBgCIAEoBVIFYnVpbGQSFA'\n    'oFYnV2aWQYAyABKAlSBWJ1dmlkEhkKCG1vYmlfYXBwGAQgASgJUgdtb2JpQXBwEhoKCHBsYXRm'\n    'b3JtGAUgASgJUghwbGF0Zm9ybRIWCgZkZXZpY2UYBiABKAlSBmRldmljZRIYCgdjaGFubmVsGA'\n    'cgASgJUgdjaGFubmVsEhQKBWJyYW5kGAggASgJUgVicmFuZBIUCgVtb2RlbBgJIAEoCVIFbW9k'\n    'ZWwSFAoFb3N2ZXIYCiABKAlSBW9zdmVyEhkKCGZwX2xvY2FsGAsgASgJUgdmcExvY2FsEhsKCW'\n    'ZwX3JlbW90ZRgMIAEoCVIIZnBSZW1vdGUSIQoMdmVyc2lvbl9uYW1lGA0gASgJUgt2ZXJzaW9u'\n    'TmFtZRIOCgJmcBgOIAEoCVICZnASEAoDZnRzGA8gASgDUgNmdHMSGQoIZ3Vlc3RfaWQYECABKA'\n    'lSB2d1ZXN0SWQ=');\n\n@$core.Deprecated('Use deviceTypeDescriptor instead')\nconst DeviceType$json = {\n  '1': 'DeviceType',\n};\n\n/// Descriptor for `DeviceType`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List deviceTypeDescriptor =\n    $convert.base64Decode('CgpEZXZpY2VUeXBl');\n\n@$core.Deprecated('Use mobiAppDescriptor instead')\nconst MobiApp$json = {\n  '1': 'MobiApp',\n};\n\n/// Descriptor for `MobiApp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List mobiAppDescriptor =\n    $convert.base64Decode('CgdNb2JpQXBw');\n\n@$core.Deprecated('Use platformDescriptor instead')\nconst Platform$json = {\n  '1': 'Platform',\n};\n\n/// Descriptor for `Platform`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List platformDescriptor =\n    $convert.base64Decode('CghQbGF0Zm9ybQ==');\n"
  },
  {
    "path": "lib/grpc/bilibili/metadata/fawkes.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/metadata/fawkes.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nclass FawkesReply extends $pb.GeneratedMessage {\n  factory FawkesReply({\n    $core.String? config,\n    $core.String? ff,\n    $core.String? dd,\n  }) {\n    final result = create();\n    if (config != null) result.config = config;\n    if (ff != null) result.ff = ff;\n    if (dd != null) result.dd = dd;\n    return result;\n  }\n\n  FawkesReply._();\n\n  factory FawkesReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FawkesReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FawkesReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.metadata.fawkes'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'config')\n    ..aOS(2, _omitFieldNames ? '' : 'ff')\n    ..aOS(3, _omitFieldNames ? '' : 'dd')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FawkesReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FawkesReply copyWith(void Function(FawkesReply) updates) =>\n      super.copyWith((message) => updates(message as FawkesReply))\n          as FawkesReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FawkesReply create() => FawkesReply._();\n  @$core.override\n  FawkesReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FawkesReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FawkesReply>(create);\n  static FawkesReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get config => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set config($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasConfig() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearConfig() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get ff => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set ff($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFf() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFf() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get dd => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set dd($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDd() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDd() => $_clearField(3);\n}\n\nclass FawkesReq extends $pb.GeneratedMessage {\n  factory FawkesReq({\n    $core.String? appkey,\n    $core.String? env,\n    $core.String? sessionId,\n  }) {\n    final result = create();\n    if (appkey != null) result.appkey = appkey;\n    if (env != null) result.env = env;\n    if (sessionId != null) result.sessionId = sessionId;\n    return result;\n  }\n\n  FawkesReq._();\n\n  factory FawkesReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FawkesReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FawkesReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.metadata.fawkes'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'appkey')\n    ..aOS(2, _omitFieldNames ? '' : 'env')\n    ..aOS(3, _omitFieldNames ? '' : 'sessionId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FawkesReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FawkesReq copyWith(void Function(FawkesReq) updates) =>\n      super.copyWith((message) => updates(message as FawkesReq)) as FawkesReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FawkesReq create() => FawkesReq._();\n  @$core.override\n  FawkesReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FawkesReq getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<FawkesReq>(create);\n  static FawkesReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get appkey => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set appkey($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAppkey() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAppkey() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get env => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set env($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasEnv() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearEnv() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get sessionId => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set sessionId($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSessionId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSessionId() => $_clearField(3);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/metadata/fawkes.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/metadata/fawkes.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n"
  },
  {
    "path": "lib/grpc/bilibili/metadata/fawkes.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/metadata/fawkes.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use fawkesReplyDescriptor instead')\nconst FawkesReply$json = {\n  '1': 'FawkesReply',\n  '2': [\n    {'1': 'config', '3': 1, '4': 1, '5': 9, '10': 'config'},\n    {'1': 'ff', '3': 2, '4': 1, '5': 9, '10': 'ff'},\n    {'1': 'dd', '3': 3, '4': 1, '5': 9, '10': 'dd'},\n  ],\n};\n\n/// Descriptor for `FawkesReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List fawkesReplyDescriptor = $convert.base64Decode(\n    'CgtGYXdrZXNSZXBseRIWCgZjb25maWcYASABKAlSBmNvbmZpZxIOCgJmZhgCIAEoCVICZmYSDg'\n    'oCZGQYAyABKAlSAmRk');\n\n@$core.Deprecated('Use fawkesReqDescriptor instead')\nconst FawkesReq$json = {\n  '1': 'FawkesReq',\n  '2': [\n    {'1': 'appkey', '3': 1, '4': 1, '5': 9, '10': 'appkey'},\n    {'1': 'env', '3': 2, '4': 1, '5': 9, '10': 'env'},\n    {'1': 'session_id', '3': 3, '4': 1, '5': 9, '10': 'sessionId'},\n  ],\n};\n\n/// Descriptor for `FawkesReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List fawkesReqDescriptor = $convert.base64Decode(\n    'CglGYXdrZXNSZXESFgoGYXBwa2V5GAEgASgJUgZhcHBrZXkSEAoDZW52GAIgASgJUgNlbnYSHQ'\n    'oKc2Vzc2lvbl9pZBgDIAEoCVIJc2Vzc2lvbklk');\n"
  },
  {
    "path": "lib/grpc/bilibili/metadata/locale.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/metadata/locale.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nclass Locale extends $pb.GeneratedMessage {\n  factory Locale({\n    LocaleIds? cLocale,\n    LocaleIds? sLocale,\n    $core.String? simCode,\n    $core.String? timezone,\n    $core.String? utcOffset,\n    $core.bool? isDaylightTime,\n    $core.bool? alwaysTranslate,\n  }) {\n    final result = create();\n    if (cLocale != null) result.cLocale = cLocale;\n    if (sLocale != null) result.sLocale = sLocale;\n    if (simCode != null) result.simCode = simCode;\n    if (timezone != null) result.timezone = timezone;\n    if (utcOffset != null) result.utcOffset = utcOffset;\n    if (isDaylightTime != null) result.isDaylightTime = isDaylightTime;\n    if (alwaysTranslate != null) result.alwaysTranslate = alwaysTranslate;\n    return result;\n  }\n\n  Locale._();\n\n  factory Locale.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Locale.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Locale',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.metadata.locale'),\n      createEmptyInstance: create)\n    ..aOM<LocaleIds>(1, _omitFieldNames ? '' : 'cLocale',\n        subBuilder: LocaleIds.create)\n    ..aOM<LocaleIds>(2, _omitFieldNames ? '' : 'sLocale',\n        subBuilder: LocaleIds.create)\n    ..aOS(3, _omitFieldNames ? '' : 'simCode')\n    ..aOS(4, _omitFieldNames ? '' : 'timezone')\n    ..aOS(5, _omitFieldNames ? '' : 'utcOffset')\n    ..aOB(6, _omitFieldNames ? '' : 'isDaylightTime')\n    ..aOB(7, _omitFieldNames ? '' : 'alwaysTranslate')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Locale clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Locale copyWith(void Function(Locale) updates) =>\n      super.copyWith((message) => updates(message as Locale)) as Locale;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Locale create() => Locale._();\n  @$core.override\n  Locale createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Locale getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Locale>(create);\n  static Locale? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  LocaleIds get cLocale => $_getN(0);\n  @$pb.TagNumber(1)\n  set cLocale(LocaleIds value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCLocale() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCLocale() => $_clearField(1);\n  @$pb.TagNumber(1)\n  LocaleIds ensureCLocale() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  LocaleIds get sLocale => $_getN(1);\n  @$pb.TagNumber(2)\n  set sLocale(LocaleIds value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSLocale() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSLocale() => $_clearField(2);\n  @$pb.TagNumber(2)\n  LocaleIds ensureSLocale() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.String get simCode => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set simCode($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSimCode() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSimCode() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get timezone => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set timezone($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTimezone() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTimezone() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get utcOffset => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set utcOffset($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasUtcOffset() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearUtcOffset() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.bool get isDaylightTime => $_getBF(5);\n  @$pb.TagNumber(6)\n  set isDaylightTime($core.bool value) => $_setBool(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasIsDaylightTime() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearIsDaylightTime() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.bool get alwaysTranslate => $_getBF(6);\n  @$pb.TagNumber(7)\n  set alwaysTranslate($core.bool value) => $_setBool(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasAlwaysTranslate() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearAlwaysTranslate() => $_clearField(7);\n}\n\nclass LocaleIds extends $pb.GeneratedMessage {\n  factory LocaleIds({\n    $core.String? language,\n    $core.String? script,\n    $core.String? region,\n  }) {\n    final result = create();\n    if (language != null) result.language = language;\n    if (script != null) result.script = script;\n    if (region != null) result.region = region;\n    return result;\n  }\n\n  LocaleIds._();\n\n  factory LocaleIds.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LocaleIds.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LocaleIds',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.metadata.locale'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'language')\n    ..aOS(2, _omitFieldNames ? '' : 'script')\n    ..aOS(3, _omitFieldNames ? '' : 'region')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LocaleIds clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LocaleIds copyWith(void Function(LocaleIds) updates) =>\n      super.copyWith((message) => updates(message as LocaleIds)) as LocaleIds;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LocaleIds create() => LocaleIds._();\n  @$core.override\n  LocaleIds createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LocaleIds getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<LocaleIds>(create);\n  static LocaleIds? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get language => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set language($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLanguage() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLanguage() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get script => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set script($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasScript() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearScript() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get region => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set region($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRegion() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRegion() => $_clearField(3);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/metadata/locale.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/metadata/locale.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n"
  },
  {
    "path": "lib/grpc/bilibili/metadata/locale.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/metadata/locale.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use localeDescriptor instead')\nconst Locale$json = {\n  '1': 'Locale',\n  '2': [\n    {\n      '1': 'c_locale',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.metadata.locale.LocaleIds',\n      '10': 'cLocale'\n    },\n    {\n      '1': 's_locale',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.metadata.locale.LocaleIds',\n      '10': 'sLocale'\n    },\n    {'1': 'sim_code', '3': 3, '4': 1, '5': 9, '10': 'simCode'},\n    {'1': 'timezone', '3': 4, '4': 1, '5': 9, '10': 'timezone'},\n    {'1': 'utc_offset', '3': 5, '4': 1, '5': 9, '10': 'utcOffset'},\n    {'1': 'is_daylight_time', '3': 6, '4': 1, '5': 8, '10': 'isDaylightTime'},\n    {'1': 'always_translate', '3': 7, '4': 1, '5': 8, '10': 'alwaysTranslate'},\n  ],\n};\n\n/// Descriptor for `Locale`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List localeDescriptor = $convert.base64Decode(\n    'CgZMb2NhbGUSPgoIY19sb2NhbGUYASABKAsyIy5iaWxpYmlsaS5tZXRhZGF0YS5sb2NhbGUuTG'\n    '9jYWxlSWRzUgdjTG9jYWxlEj4KCHNfbG9jYWxlGAIgASgLMiMuYmlsaWJpbGkubWV0YWRhdGEu'\n    'bG9jYWxlLkxvY2FsZUlkc1IHc0xvY2FsZRIZCghzaW1fY29kZRgDIAEoCVIHc2ltQ29kZRIaCg'\n    'h0aW1lem9uZRgEIAEoCVIIdGltZXpvbmUSHQoKdXRjX29mZnNldBgFIAEoCVIJdXRjT2Zmc2V0'\n    'EigKEGlzX2RheWxpZ2h0X3RpbWUYBiABKAhSDmlzRGF5bGlnaHRUaW1lEikKEGFsd2F5c190cm'\n    'Fuc2xhdGUYByABKAhSD2Fsd2F5c1RyYW5zbGF0ZQ==');\n\n@$core.Deprecated('Use localeIdsDescriptor instead')\nconst LocaleIds$json = {\n  '1': 'LocaleIds',\n  '2': [\n    {'1': 'language', '3': 1, '4': 1, '5': 9, '10': 'language'},\n    {'1': 'script', '3': 2, '4': 1, '5': 9, '10': 'script'},\n    {'1': 'region', '3': 3, '4': 1, '5': 9, '10': 'region'},\n  ],\n};\n\n/// Descriptor for `LocaleIds`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List localeIdsDescriptor = $convert.base64Decode(\n    'CglMb2NhbGVJZHMSGgoIbGFuZ3VhZ2UYASABKAlSCGxhbmd1YWdlEhYKBnNjcmlwdBgCIAEoCV'\n    'IGc2NyaXB0EhYKBnJlZ2lvbhgDIAEoCVIGcmVnaW9u');\n"
  },
  {
    "path": "lib/grpc/bilibili/metadata/network.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/metadata/network.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:fixnum/fixnum.dart' as $fixnum;\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nimport 'network.pbenum.dart';\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nexport 'network.pbenum.dart';\n\nclass NetQuality extends $pb.GeneratedMessage {\n  factory NetQuality({\n    $core.double? successRate,\n    $core.int? speed,\n    $fixnum.Int64? speedTimestamp,\n    $core.int? netType,\n  }) {\n    final result = create();\n    if (successRate != null) result.successRate = successRate;\n    if (speed != null) result.speed = speed;\n    if (speedTimestamp != null) result.speedTimestamp = speedTimestamp;\n    if (netType != null) result.netType = netType;\n    return result;\n  }\n\n  NetQuality._();\n\n  factory NetQuality.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory NetQuality.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'NetQuality',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.metadata.network'),\n      createEmptyInstance: create)\n    ..aD(1, _omitFieldNames ? '' : 'successRate', fieldType: $pb.PbFieldType.OF)\n    ..aI(2, _omitFieldNames ? '' : 'speed')\n    ..aInt64(3, _omitFieldNames ? '' : 'speedTimestamp')\n    ..aI(4, _omitFieldNames ? '' : 'netType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NetQuality clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  NetQuality copyWith(void Function(NetQuality) updates) =>\n      super.copyWith((message) => updates(message as NetQuality)) as NetQuality;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static NetQuality create() => NetQuality._();\n  @$core.override\n  NetQuality createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static NetQuality getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<NetQuality>(create);\n  static NetQuality? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.double get successRate => $_getN(0);\n  @$pb.TagNumber(1)\n  set successRate($core.double value) => $_setFloat(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSuccessRate() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSuccessRate() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get speed => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set speed($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSpeed() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSpeed() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get speedTimestamp => $_getI64(2);\n  @$pb.TagNumber(3)\n  set speedTimestamp($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSpeedTimestamp() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSpeedTimestamp() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get netType => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set netType($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasNetType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearNetType() => $_clearField(4);\n}\n\nclass Network extends $pb.GeneratedMessage {\n  factory Network({\n    NetworkType? type,\n    TFType? tf,\n    $core.String? oid,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (tf != null) result.tf = tf;\n    if (oid != null) result.oid = oid;\n    return result;\n  }\n\n  Network._();\n\n  factory Network.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Network.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Network',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.metadata.network'),\n      createEmptyInstance: create)\n    ..aE<NetworkType>(1, _omitFieldNames ? '' : 'type',\n        enumValues: NetworkType.values)\n    ..aE<TFType>(2, _omitFieldNames ? '' : 'tf', enumValues: TFType.values)\n    ..aOS(3, _omitFieldNames ? '' : 'oid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Network clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Network copyWith(void Function(Network) updates) =>\n      super.copyWith((message) => updates(message as Network)) as Network;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Network create() => Network._();\n  @$core.override\n  Network createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Network getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Network>(create);\n  static Network? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  NetworkType get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(NetworkType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  TFType get tf => $_getN(1);\n  @$pb.TagNumber(2)\n  set tf(TFType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTf() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTf() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get oid => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set oid($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasOid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearOid() => $_clearField(3);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/metadata/network.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/metadata/network.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nclass NetworkType extends $pb.ProtobufEnum {\n  static const NetworkType NT_UNKNOWN =\n      NetworkType._(0, _omitEnumNames ? '' : 'NT_UNKNOWN');\n  static const NetworkType WIFI =\n      NetworkType._(1, _omitEnumNames ? '' : 'WIFI');\n  static const NetworkType CELLULAR =\n      NetworkType._(2, _omitEnumNames ? '' : 'CELLULAR');\n  static const NetworkType OFFLINE =\n      NetworkType._(3, _omitEnumNames ? '' : 'OFFLINE');\n  static const NetworkType OTHERNET =\n      NetworkType._(4, _omitEnumNames ? '' : 'OTHERNET');\n  static const NetworkType ETHERNET =\n      NetworkType._(5, _omitEnumNames ? '' : 'ETHERNET');\n\n  static const $core.List<NetworkType> values = <NetworkType>[\n    NT_UNKNOWN,\n    WIFI,\n    CELLULAR,\n    OFFLINE,\n    OTHERNET,\n    ETHERNET,\n  ];\n\n  static final $core.List<NetworkType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 5);\n  static NetworkType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const NetworkType._(super.value, super.name);\n}\n\nclass TFType extends $pb.ProtobufEnum {\n  static const TFType TF_UNKNOWN =\n      TFType._(0, _omitEnumNames ? '' : 'TF_UNKNOWN');\n  static const TFType U_CARD = TFType._(1, _omitEnumNames ? '' : 'U_CARD');\n  static const TFType U_PKG = TFType._(2, _omitEnumNames ? '' : 'U_PKG');\n  static const TFType C_CARD = TFType._(3, _omitEnumNames ? '' : 'C_CARD');\n  static const TFType C_PKG = TFType._(4, _omitEnumNames ? '' : 'C_PKG');\n  static const TFType T_CARD = TFType._(5, _omitEnumNames ? '' : 'T_CARD');\n  static const TFType T_PKG = TFType._(6, _omitEnumNames ? '' : 'T_PKG');\n\n  static const $core.List<TFType> values = <TFType>[\n    TF_UNKNOWN,\n    U_CARD,\n    U_PKG,\n    C_CARD,\n    C_PKG,\n    T_CARD,\n    T_PKG,\n  ];\n\n  static final $core.List<TFType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 6);\n  static TFType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const TFType._(super.value, super.name);\n}\n\nconst $core.bool _omitEnumNames =\n    $core.bool.fromEnvironment('protobuf.omit_enum_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/metadata/network.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/metadata/network.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use networkTypeDescriptor instead')\nconst NetworkType$json = {\n  '1': 'NetworkType',\n  '2': [\n    {'1': 'NT_UNKNOWN', '2': 0},\n    {'1': 'WIFI', '2': 1},\n    {'1': 'CELLULAR', '2': 2},\n    {'1': 'OFFLINE', '2': 3},\n    {'1': 'OTHERNET', '2': 4},\n    {'1': 'ETHERNET', '2': 5},\n  ],\n};\n\n/// Descriptor for `NetworkType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List networkTypeDescriptor = $convert.base64Decode(\n    'CgtOZXR3b3JrVHlwZRIOCgpOVF9VTktOT1dOEAASCAoEV0lGSRABEgwKCENFTExVTEFSEAISCw'\n    'oHT0ZGTElORRADEgwKCE9USEVSTkVUEAQSDAoIRVRIRVJORVQQBQ==');\n\n@$core.Deprecated('Use tFTypeDescriptor instead')\nconst TFType$json = {\n  '1': 'TFType',\n  '2': [\n    {'1': 'TF_UNKNOWN', '2': 0},\n    {'1': 'U_CARD', '2': 1},\n    {'1': 'U_PKG', '2': 2},\n    {'1': 'C_CARD', '2': 3},\n    {'1': 'C_PKG', '2': 4},\n    {'1': 'T_CARD', '2': 5},\n    {'1': 'T_PKG', '2': 6},\n  ],\n};\n\n/// Descriptor for `TFType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List tFTypeDescriptor = $convert.base64Decode(\n    'CgZURlR5cGUSDgoKVEZfVU5LTk9XThAAEgoKBlVfQ0FSRBABEgkKBVVfUEtHEAISCgoGQ19DQV'\n    'JEEAMSCQoFQ19QS0cQBBIKCgZUX0NBUkQQBRIJCgVUX1BLRxAG');\n\n@$core.Deprecated('Use netQualityDescriptor instead')\nconst NetQuality$json = {\n  '1': 'NetQuality',\n  '2': [\n    {'1': 'success_rate', '3': 1, '4': 1, '5': 2, '10': 'successRate'},\n    {'1': 'speed', '3': 2, '4': 1, '5': 5, '10': 'speed'},\n    {'1': 'speed_timestamp', '3': 3, '4': 1, '5': 3, '10': 'speedTimestamp'},\n    {'1': 'net_type', '3': 4, '4': 1, '5': 5, '10': 'netType'},\n  ],\n};\n\n/// Descriptor for `NetQuality`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List netQualityDescriptor = $convert.base64Decode(\n    'CgpOZXRRdWFsaXR5EiEKDHN1Y2Nlc3NfcmF0ZRgBIAEoAlILc3VjY2Vzc1JhdGUSFAoFc3BlZW'\n    'QYAiABKAVSBXNwZWVkEicKD3NwZWVkX3RpbWVzdGFtcBgDIAEoA1IOc3BlZWRUaW1lc3RhbXAS'\n    'GQoIbmV0X3R5cGUYBCABKAVSB25ldFR5cGU=');\n\n@$core.Deprecated('Use networkDescriptor instead')\nconst Network$json = {\n  '1': 'Network',\n  '2': [\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.metadata.network.NetworkType',\n      '10': 'type'\n    },\n    {\n      '1': 'tf',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.metadata.network.TFType',\n      '10': 'tf'\n    },\n    {'1': 'oid', '3': 3, '4': 1, '5': 9, '10': 'oid'},\n  ],\n};\n\n/// Descriptor for `Network`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List networkDescriptor = $convert.base64Decode(\n    'CgdOZXR3b3JrEjoKBHR5cGUYASABKA4yJi5iaWxpYmlsaS5tZXRhZGF0YS5uZXR3b3JrLk5ldH'\n    'dvcmtUeXBlUgR0eXBlEjEKAnRmGAIgASgOMiEuYmlsaWJpbGkubWV0YWRhdGEubmV0d29yay5U'\n    'RlR5cGVSAnRmEhAKA29pZBgDIAEoCVIDb2lk');\n"
  },
  {
    "path": "lib/grpc/bilibili/metadata/parabox.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/metadata/parabox.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:fixnum/fixnum.dart' as $fixnum;\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nclass Exp extends $pb.GeneratedMessage {\n  factory Exp({\n    $fixnum.Int64? id,\n    $core.int? bucket,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (bucket != null) result.bucket = bucket;\n    return result;\n  }\n\n  Exp._();\n\n  factory Exp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Exp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Exp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.metadata.parabox'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aI(2, _omitFieldNames ? '' : 'bucket')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Exp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Exp copyWith(void Function(Exp) updates) =>\n      super.copyWith((message) => updates(message as Exp)) as Exp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Exp create() => Exp._();\n  @$core.override\n  Exp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Exp getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Exp>(create);\n  static Exp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get bucket => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set bucket($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBucket() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBucket() => $_clearField(2);\n}\n\nclass Exps extends $pb.GeneratedMessage {\n  factory Exps({\n    $core.Iterable<Exp>? exps,\n  }) {\n    final result = create();\n    if (exps != null) result.exps.addAll(exps);\n    return result;\n  }\n\n  Exps._();\n\n  factory Exps.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Exps.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Exps',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.metadata.parabox'),\n      createEmptyInstance: create)\n    ..pPM<Exp>(1, _omitFieldNames ? '' : 'exps', subBuilder: Exp.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Exps clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Exps copyWith(void Function(Exps) updates) =>\n      super.copyWith((message) => updates(message as Exps)) as Exps;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Exps create() => Exps._();\n  @$core.override\n  Exps createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Exps getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Exps>(create);\n  static Exps? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<Exp> get exps => $_getList(0);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/metadata/parabox.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/metadata/parabox.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n"
  },
  {
    "path": "lib/grpc/bilibili/metadata/parabox.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/metadata/parabox.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use expDescriptor instead')\nconst Exp$json = {\n  '1': 'Exp',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'bucket', '3': 2, '4': 1, '5': 5, '10': 'bucket'},\n  ],\n};\n\n/// Descriptor for `Exp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List expDescriptor = $convert.base64Decode(\n    'CgNFeHASDgoCaWQYASABKANSAmlkEhYKBmJ1Y2tldBgCIAEoBVIGYnVja2V0');\n\n@$core.Deprecated('Use expsDescriptor instead')\nconst Exps$json = {\n  '1': 'Exps',\n  '2': [\n    {\n      '1': 'exps',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.metadata.parabox.Exp',\n      '10': 'exps'\n    },\n  ],\n};\n\n/// Descriptor for `Exps`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List expsDescriptor = $convert.base64Decode(\n    'CgRFeHBzEjIKBGV4cHMYASADKAsyHi5iaWxpYmlsaS5tZXRhZGF0YS5wYXJhYm94LkV4cFIEZX'\n    'hwcw==');\n"
  },
  {
    "path": "lib/grpc/bilibili/metadata/restriction.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/metadata/restriction.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nimport 'restriction.pbenum.dart';\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nexport 'restriction.pbenum.dart';\n\nclass Restriction extends $pb.GeneratedMessage {\n  factory Restriction({\n    $core.bool? teenagersMode,\n    $core.bool? lessonsMode,\n    ModeType? mode,\n    $core.bool? review,\n    $core.bool? disableRcmd,\n    $core.bool? basicMode,\n    $core.int? teenagersAge,\n  }) {\n    final result = create();\n    if (teenagersMode != null) result.teenagersMode = teenagersMode;\n    if (lessonsMode != null) result.lessonsMode = lessonsMode;\n    if (mode != null) result.mode = mode;\n    if (review != null) result.review = review;\n    if (disableRcmd != null) result.disableRcmd = disableRcmd;\n    if (basicMode != null) result.basicMode = basicMode;\n    if (teenagersAge != null) result.teenagersAge = teenagersAge;\n    return result;\n  }\n\n  Restriction._();\n\n  factory Restriction.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Restriction.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Restriction',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.metadata.restriction'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'teenagersMode')\n    ..aOB(2, _omitFieldNames ? '' : 'lessonsMode')\n    ..aE<ModeType>(3, _omitFieldNames ? '' : 'mode',\n        enumValues: ModeType.values)\n    ..aOB(4, _omitFieldNames ? '' : 'review')\n    ..aOB(5, _omitFieldNames ? '' : 'disableRcmd')\n    ..aOB(6, _omitFieldNames ? '' : 'basicMode')\n    ..aI(7, _omitFieldNames ? '' : 'teenagersAge')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Restriction clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Restriction copyWith(void Function(Restriction) updates) =>\n      super.copyWith((message) => updates(message as Restriction))\n          as Restriction;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Restriction create() => Restriction._();\n  @$core.override\n  Restriction createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Restriction getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<Restriction>(create);\n  static Restriction? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get teenagersMode => $_getBF(0);\n  @$pb.TagNumber(1)\n  set teenagersMode($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTeenagersMode() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTeenagersMode() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get lessonsMode => $_getBF(1);\n  @$pb.TagNumber(2)\n  set lessonsMode($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLessonsMode() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLessonsMode() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  ModeType get mode => $_getN(2);\n  @$pb.TagNumber(3)\n  set mode(ModeType value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasMode() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearMode() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get review => $_getBF(3);\n  @$pb.TagNumber(4)\n  set review($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasReview() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearReview() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.bool get disableRcmd => $_getBF(4);\n  @$pb.TagNumber(5)\n  set disableRcmd($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasDisableRcmd() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearDisableRcmd() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.bool get basicMode => $_getBF(5);\n  @$pb.TagNumber(6)\n  set basicMode($core.bool value) => $_setBool(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasBasicMode() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearBasicMode() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get teenagersAge => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set teenagersAge($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasTeenagersAge() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearTeenagersAge() => $_clearField(7);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/metadata/restriction.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/metadata/restriction.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nclass ModeType extends $pb.ProtobufEnum {\n  static const ModeType NORMAL = ModeType._(0, _omitEnumNames ? '' : 'NORMAL');\n  static const ModeType TEENAGERS =\n      ModeType._(1, _omitEnumNames ? '' : 'TEENAGERS');\n  static const ModeType LESSONS =\n      ModeType._(2, _omitEnumNames ? '' : 'LESSONS');\n  static const ModeType BASIC = ModeType._(3, _omitEnumNames ? '' : 'BASIC');\n\n  static const $core.List<ModeType> values = <ModeType>[\n    NORMAL,\n    TEENAGERS,\n    LESSONS,\n    BASIC,\n  ];\n\n  static final $core.List<ModeType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static ModeType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ModeType._(super.value, super.name);\n}\n\nconst $core.bool _omitEnumNames =\n    $core.bool.fromEnvironment('protobuf.omit_enum_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/metadata/restriction.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/metadata/restriction.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use modeTypeDescriptor instead')\nconst ModeType$json = {\n  '1': 'ModeType',\n  '2': [\n    {'1': 'NORMAL', '2': 0},\n    {'1': 'TEENAGERS', '2': 1},\n    {'1': 'LESSONS', '2': 2},\n    {'1': 'BASIC', '2': 3},\n  ],\n};\n\n/// Descriptor for `ModeType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List modeTypeDescriptor = $convert.base64Decode(\n    'CghNb2RlVHlwZRIKCgZOT1JNQUwQABINCglURUVOQUdFUlMQARILCgdMRVNTT05TEAISCQoFQk'\n    'FTSUMQAw==');\n\n@$core.Deprecated('Use restrictionDescriptor instead')\nconst Restriction$json = {\n  '1': 'Restriction',\n  '2': [\n    {'1': 'teenagers_mode', '3': 1, '4': 1, '5': 8, '10': 'teenagersMode'},\n    {'1': 'lessons_mode', '3': 2, '4': 1, '5': 8, '10': 'lessonsMode'},\n    {\n      '1': 'mode',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.metadata.restriction.ModeType',\n      '10': 'mode'\n    },\n    {'1': 'review', '3': 4, '4': 1, '5': 8, '10': 'review'},\n    {'1': 'disable_rcmd', '3': 5, '4': 1, '5': 8, '10': 'disableRcmd'},\n    {'1': 'basic_mode', '3': 6, '4': 1, '5': 8, '10': 'basicMode'},\n    {'1': 'teenagers_age', '3': 7, '4': 1, '5': 5, '10': 'teenagersAge'},\n  ],\n};\n\n/// Descriptor for `Restriction`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List restrictionDescriptor = $convert.base64Decode(\n    'CgtSZXN0cmljdGlvbhIlCg50ZWVuYWdlcnNfbW9kZRgBIAEoCFINdGVlbmFnZXJzTW9kZRIhCg'\n    'xsZXNzb25zX21vZGUYAiABKAhSC2xlc3NvbnNNb2RlEjsKBG1vZGUYAyABKA4yJy5iaWxpYmls'\n    'aS5tZXRhZGF0YS5yZXN0cmljdGlvbi5Nb2RlVHlwZVIEbW9kZRIWCgZyZXZpZXcYBCABKAhSBn'\n    'JldmlldxIhCgxkaXNhYmxlX3JjbWQYBSABKAhSC2Rpc2FibGVSY21kEh0KCmJhc2ljX21vZGUY'\n    'BiABKAhSCWJhc2ljTW9kZRIjCg10ZWVuYWdlcnNfYWdlGAcgASgFUgx0ZWVuYWdlcnNBZ2U=');\n"
  },
  {
    "path": "lib/grpc/bilibili/metadata.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/metadata.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nclass Metadata extends $pb.GeneratedMessage {\n  factory Metadata({\n    $core.String? accessKey,\n    $core.String? mobiApp,\n    $core.String? device,\n    $core.int? build,\n    $core.String? channel,\n    $core.String? buvid,\n    $core.String? platform,\n  }) {\n    final result = create();\n    if (accessKey != null) result.accessKey = accessKey;\n    if (mobiApp != null) result.mobiApp = mobiApp;\n    if (device != null) result.device = device;\n    if (build != null) result.build = build;\n    if (channel != null) result.channel = channel;\n    if (buvid != null) result.buvid = buvid;\n    if (platform != null) result.platform = platform;\n    return result;\n  }\n\n  Metadata._();\n\n  factory Metadata.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Metadata.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Metadata',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.metadata'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'accessKey')\n    ..aOS(2, _omitFieldNames ? '' : 'mobiApp')\n    ..aOS(3, _omitFieldNames ? '' : 'device')\n    ..aI(4, _omitFieldNames ? '' : 'build')\n    ..aOS(5, _omitFieldNames ? '' : 'channel')\n    ..aOS(6, _omitFieldNames ? '' : 'buvid')\n    ..aOS(7, _omitFieldNames ? '' : 'platform')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Metadata clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Metadata copyWith(void Function(Metadata) updates) =>\n      super.copyWith((message) => updates(message as Metadata)) as Metadata;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Metadata create() => Metadata._();\n  @$core.override\n  Metadata createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Metadata getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Metadata>(create);\n  static Metadata? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get accessKey => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set accessKey($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAccessKey() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAccessKey() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get mobiApp => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set mobiApp($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMobiApp() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMobiApp() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get device => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set device($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDevice() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDevice() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get build => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set build($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBuild() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBuild() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get channel => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set channel($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasChannel() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearChannel() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get buvid => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set buvid($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasBuvid() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearBuvid() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get platform => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set platform($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasPlatform() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearPlatform() => $_clearField(7);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/metadata.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/metadata.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n"
  },
  {
    "path": "lib/grpc/bilibili/metadata.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/metadata.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use metadataDescriptor instead')\nconst Metadata$json = {\n  '1': 'Metadata',\n  '2': [\n    {'1': 'access_key', '3': 1, '4': 1, '5': 9, '10': 'accessKey'},\n    {'1': 'mobi_app', '3': 2, '4': 1, '5': 9, '10': 'mobiApp'},\n    {'1': 'device', '3': 3, '4': 1, '5': 9, '10': 'device'},\n    {'1': 'build', '3': 4, '4': 1, '5': 5, '10': 'build'},\n    {'1': 'channel', '3': 5, '4': 1, '5': 9, '10': 'channel'},\n    {'1': 'buvid', '3': 6, '4': 1, '5': 9, '10': 'buvid'},\n    {'1': 'platform', '3': 7, '4': 1, '5': 9, '10': 'platform'},\n  ],\n};\n\n/// Descriptor for `Metadata`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List metadataDescriptor = $convert.base64Decode(\n    'CghNZXRhZGF0YRIdCgphY2Nlc3Nfa2V5GAEgASgJUglhY2Nlc3NLZXkSGQoIbW9iaV9hcHAYAi'\n    'ABKAlSB21vYmlBcHASFgoGZGV2aWNlGAMgASgJUgZkZXZpY2USFAoFYnVpbGQYBCABKAVSBWJ1'\n    'aWxkEhgKB2NoYW5uZWwYBSABKAlSB2NoYW5uZWwSFAoFYnV2aWQYBiABKAlSBWJ1dmlkEhoKCH'\n    'BsYXRmb3JtGAcgASgJUghwbGF0Zm9ybQ==');\n"
  },
  {
    "path": "lib/grpc/bilibili/pagination.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/pagination.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nclass FeedPagination extends $pb.GeneratedMessage {\n  factory FeedPagination({\n    $core.int? pageSize,\n    $core.String? offset,\n    $core.bool? isRefresh,\n  }) {\n    final result = create();\n    if (pageSize != null) result.pageSize = pageSize;\n    if (offset != null) result.offset = offset;\n    if (isRefresh != null) result.isRefresh = isRefresh;\n    return result;\n  }\n\n  FeedPagination._();\n\n  factory FeedPagination.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FeedPagination.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FeedPagination',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.pagination'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'pageSize')\n    ..aOS(2, _omitFieldNames ? '' : 'offset')\n    ..aOB(3, _omitFieldNames ? '' : 'isRefresh')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FeedPagination clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FeedPagination copyWith(void Function(FeedPagination) updates) =>\n      super.copyWith((message) => updates(message as FeedPagination))\n          as FeedPagination;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FeedPagination create() => FeedPagination._();\n  @$core.override\n  FeedPagination createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FeedPagination getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FeedPagination>(create);\n  static FeedPagination? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get pageSize => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set pageSize($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPageSize() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPageSize() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get offset => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set offset($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasOffset() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearOffset() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get isRefresh => $_getBF(2);\n  @$pb.TagNumber(3)\n  set isRefresh($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasIsRefresh() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearIsRefresh() => $_clearField(3);\n}\n\nclass FeedPaginationReply extends $pb.GeneratedMessage {\n  factory FeedPaginationReply({\n    $core.String? nextOffset,\n    $core.String? prevOffset,\n    $core.String? lastReadOffset,\n  }) {\n    final result = create();\n    if (nextOffset != null) result.nextOffset = nextOffset;\n    if (prevOffset != null) result.prevOffset = prevOffset;\n    if (lastReadOffset != null) result.lastReadOffset = lastReadOffset;\n    return result;\n  }\n\n  FeedPaginationReply._();\n\n  factory FeedPaginationReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FeedPaginationReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FeedPaginationReply',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.pagination'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'nextOffset')\n    ..aOS(2, _omitFieldNames ? '' : 'prevOffset')\n    ..aOS(3, _omitFieldNames ? '' : 'lastReadOffset')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FeedPaginationReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FeedPaginationReply copyWith(void Function(FeedPaginationReply) updates) =>\n      super.copyWith((message) => updates(message as FeedPaginationReply))\n          as FeedPaginationReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FeedPaginationReply create() => FeedPaginationReply._();\n  @$core.override\n  FeedPaginationReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FeedPaginationReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FeedPaginationReply>(create);\n  static FeedPaginationReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get nextOffset => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set nextOffset($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasNextOffset() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearNextOffset() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get prevOffset => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set prevOffset($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPrevOffset() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPrevOffset() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get lastReadOffset => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set lastReadOffset($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLastReadOffset() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLastReadOffset() => $_clearField(3);\n}\n\nclass Pagination extends $pb.GeneratedMessage {\n  factory Pagination({\n    $core.int? pageSize,\n    $core.String? next,\n  }) {\n    final result = create();\n    if (pageSize != null) result.pageSize = pageSize;\n    if (next != null) result.next = next;\n    return result;\n  }\n\n  Pagination._();\n\n  factory Pagination.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Pagination.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Pagination',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.pagination'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'pageSize')\n    ..aOS(2, _omitFieldNames ? '' : 'next')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Pagination clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Pagination copyWith(void Function(Pagination) updates) =>\n      super.copyWith((message) => updates(message as Pagination)) as Pagination;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Pagination create() => Pagination._();\n  @$core.override\n  Pagination createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Pagination getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<Pagination>(create);\n  static Pagination? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get pageSize => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set pageSize($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPageSize() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPageSize() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get next => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set next($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasNext() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearNext() => $_clearField(2);\n}\n\nclass PaginationReply extends $pb.GeneratedMessage {\n  factory PaginationReply({\n    $core.String? next,\n    $core.String? prev,\n  }) {\n    final result = create();\n    if (next != null) result.next = next;\n    if (prev != null) result.prev = prev;\n    return result;\n  }\n\n  PaginationReply._();\n\n  factory PaginationReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PaginationReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PaginationReply',\n      package:\n          const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.pagination'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'next')\n    ..aOS(2, _omitFieldNames ? '' : 'prev')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PaginationReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PaginationReply copyWith(void Function(PaginationReply) updates) =>\n      super.copyWith((message) => updates(message as PaginationReply))\n          as PaginationReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PaginationReply create() => PaginationReply._();\n  @$core.override\n  PaginationReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PaginationReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PaginationReply>(create);\n  static PaginationReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get next => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set next($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasNext() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearNext() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get prev => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set prev($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPrev() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPrev() => $_clearField(2);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/pagination.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/pagination.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n"
  },
  {
    "path": "lib/grpc/bilibili/pagination.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/pagination.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use feedPaginationDescriptor instead')\nconst FeedPagination$json = {\n  '1': 'FeedPagination',\n  '2': [\n    {'1': 'page_size', '3': 1, '4': 1, '5': 5, '10': 'pageSize'},\n    {'1': 'offset', '3': 2, '4': 1, '5': 9, '10': 'offset'},\n    {'1': 'is_refresh', '3': 3, '4': 1, '5': 8, '10': 'isRefresh'},\n  ],\n};\n\n/// Descriptor for `FeedPagination`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List feedPaginationDescriptor = $convert.base64Decode(\n    'Cg5GZWVkUGFnaW5hdGlvbhIbCglwYWdlX3NpemUYASABKAVSCHBhZ2VTaXplEhYKBm9mZnNldB'\n    'gCIAEoCVIGb2Zmc2V0Eh0KCmlzX3JlZnJlc2gYAyABKAhSCWlzUmVmcmVzaA==');\n\n@$core.Deprecated('Use feedPaginationReplyDescriptor instead')\nconst FeedPaginationReply$json = {\n  '1': 'FeedPaginationReply',\n  '2': [\n    {'1': 'next_offset', '3': 1, '4': 1, '5': 9, '10': 'nextOffset'},\n    {'1': 'prev_offset', '3': 2, '4': 1, '5': 9, '10': 'prevOffset'},\n    {'1': 'last_read_offset', '3': 3, '4': 1, '5': 9, '10': 'lastReadOffset'},\n  ],\n};\n\n/// Descriptor for `FeedPaginationReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List feedPaginationReplyDescriptor = $convert.base64Decode(\n    'ChNGZWVkUGFnaW5hdGlvblJlcGx5Eh8KC25leHRfb2Zmc2V0GAEgASgJUgpuZXh0T2Zmc2V0Eh'\n    '8KC3ByZXZfb2Zmc2V0GAIgASgJUgpwcmV2T2Zmc2V0EigKEGxhc3RfcmVhZF9vZmZzZXQYAyAB'\n    'KAlSDmxhc3RSZWFkT2Zmc2V0');\n\n@$core.Deprecated('Use paginationDescriptor instead')\nconst Pagination$json = {\n  '1': 'Pagination',\n  '2': [\n    {'1': 'page_size', '3': 1, '4': 1, '5': 5, '10': 'pageSize'},\n    {'1': 'next', '3': 2, '4': 1, '5': 9, '10': 'next'},\n  ],\n};\n\n/// Descriptor for `Pagination`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List paginationDescriptor = $convert.base64Decode(\n    'CgpQYWdpbmF0aW9uEhsKCXBhZ2Vfc2l6ZRgBIAEoBVIIcGFnZVNpemUSEgoEbmV4dBgCIAEoCV'\n    'IEbmV4dA==');\n\n@$core.Deprecated('Use paginationReplyDescriptor instead')\nconst PaginationReply$json = {\n  '1': 'PaginationReply',\n  '2': [\n    {'1': 'next', '3': 1, '4': 1, '5': 9, '10': 'next'},\n    {'1': 'prev', '3': 2, '4': 1, '5': 9, '10': 'prev'},\n  ],\n};\n\n/// Descriptor for `PaginationReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List paginationReplyDescriptor = $convert.base64Decode(\n    'Cg9QYWdpbmF0aW9uUmVwbHkSEgoEbmV4dBgBIAEoCVIEbmV4dBISCgRwcmV2GAIgASgJUgRwcm'\n    'V2');\n"
  },
  {
    "path": "lib/grpc/bilibili/playershared.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/playershared.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:fixnum/fixnum.dart' as $fixnum;\nimport 'package:protobuf/protobuf.dart' as $pb;\nimport 'package:protobuf/well_known_types/google/protobuf/any.pb.dart' as $0;\n\nimport 'playershared.pbenum.dart';\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nexport 'playershared.pbenum.dart';\n\nclass AIAudio extends $pb.GeneratedMessage {\n  factory AIAudio({\n    $core.bool? supportAiAudio,\n    $core.Iterable<AIAudioItem>? aiAudioItems,\n    $core.String? aiOpenToast,\n    $core.String? aiCloseToast,\n    Badge? badge,\n    $core.String? defaultTitle,\n    $core.String? listTitle,\n    $core.String? listDesc,\n  }) {\n    final result = create();\n    if (supportAiAudio != null) result.supportAiAudio = supportAiAudio;\n    if (aiAudioItems != null) result.aiAudioItems.addAll(aiAudioItems);\n    if (aiOpenToast != null) result.aiOpenToast = aiOpenToast;\n    if (aiCloseToast != null) result.aiCloseToast = aiCloseToast;\n    if (badge != null) result.badge = badge;\n    if (defaultTitle != null) result.defaultTitle = defaultTitle;\n    if (listTitle != null) result.listTitle = listTitle;\n    if (listDesc != null) result.listDesc = listDesc;\n    return result;\n  }\n\n  AIAudio._();\n\n  factory AIAudio.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AIAudio.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AIAudio',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'supportAiAudio')\n    ..pPM<AIAudioItem>(2, _omitFieldNames ? '' : 'aiAudioItems',\n        subBuilder: AIAudioItem.create)\n    ..aOS(3, _omitFieldNames ? '' : 'aiOpenToast')\n    ..aOS(4, _omitFieldNames ? '' : 'aiCloseToast')\n    ..aOM<Badge>(5, _omitFieldNames ? '' : 'badge', subBuilder: Badge.create)\n    ..aOS(6, _omitFieldNames ? '' : 'defaultTitle')\n    ..aOS(7, _omitFieldNames ? '' : 'listTitle')\n    ..aOS(8, _omitFieldNames ? '' : 'listDesc')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AIAudio clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AIAudio copyWith(void Function(AIAudio) updates) =>\n      super.copyWith((message) => updates(message as AIAudio)) as AIAudio;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AIAudio create() => AIAudio._();\n  @$core.override\n  AIAudio createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AIAudio getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<AIAudio>(create);\n  static AIAudio? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get supportAiAudio => $_getBF(0);\n  @$pb.TagNumber(1)\n  set supportAiAudio($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSupportAiAudio() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSupportAiAudio() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<AIAudioItem> get aiAudioItems => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $core.String get aiOpenToast => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set aiOpenToast($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasAiOpenToast() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearAiOpenToast() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get aiCloseToast => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set aiCloseToast($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasAiCloseToast() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearAiCloseToast() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  Badge get badge => $_getN(4);\n  @$pb.TagNumber(5)\n  set badge(Badge value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBadge() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBadge() => $_clearField(5);\n  @$pb.TagNumber(5)\n  Badge ensureBadge() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.String get defaultTitle => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set defaultTitle($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasDefaultTitle() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearDefaultTitle() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get listTitle => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set listTitle($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasListTitle() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearListTitle() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get listDesc => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set listDesc($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasListDesc() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearListDesc() => $_clearField(8);\n}\n\nclass AIAudioItem extends $pb.GeneratedMessage {\n  factory AIAudioItem({\n    $core.Iterable<DashItem>? audioInfo,\n    $core.String? title,\n    $core.String? buttonTitle,\n    $core.String? subtitleLang,\n  }) {\n    final result = create();\n    if (audioInfo != null) result.audioInfo.addAll(audioInfo);\n    if (title != null) result.title = title;\n    if (buttonTitle != null) result.buttonTitle = buttonTitle;\n    if (subtitleLang != null) result.subtitleLang = subtitleLang;\n    return result;\n  }\n\n  AIAudioItem._();\n\n  factory AIAudioItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AIAudioItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AIAudioItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..pPM<DashItem>(1, _omitFieldNames ? '' : 'audioInfo',\n        subBuilder: DashItem.create)\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'buttonTitle')\n    ..aOS(4, _omitFieldNames ? '' : 'subtitleLang')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AIAudioItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AIAudioItem copyWith(void Function(AIAudioItem) updates) =>\n      super.copyWith((message) => updates(message as AIAudioItem))\n          as AIAudioItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AIAudioItem create() => AIAudioItem._();\n  @$core.override\n  AIAudioItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AIAudioItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AIAudioItem>(create);\n  static AIAudioItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<DashItem> get audioInfo => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get buttonTitle => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set buttonTitle($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasButtonTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearButtonTitle() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get subtitleLang => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set subtitleLang($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSubtitleLang() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSubtitleLang() => $_clearField(4);\n}\n\nclass ArcConf extends $pb.GeneratedMessage {\n  factory ArcConf({\n    $core.bool? isSupport,\n    $core.bool? disabled,\n    ExtraContent? extraContent,\n    $core.Iterable<$core.int>? unsupportScene,\n    UnsupportState? unsupportState,\n  }) {\n    final result = create();\n    if (isSupport != null) result.isSupport = isSupport;\n    if (disabled != null) result.disabled = disabled;\n    if (extraContent != null) result.extraContent = extraContent;\n    if (unsupportScene != null) result.unsupportScene.addAll(unsupportScene);\n    if (unsupportState != null) result.unsupportState = unsupportState;\n    return result;\n  }\n\n  ArcConf._();\n\n  factory ArcConf.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ArcConf.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ArcConf',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'isSupport')\n    ..aOB(2, _omitFieldNames ? '' : 'disabled')\n    ..aOM<ExtraContent>(3, _omitFieldNames ? '' : 'extraContent',\n        subBuilder: ExtraContent.create)\n    ..p<$core.int>(\n        4, _omitFieldNames ? '' : 'unsupportScene', $pb.PbFieldType.K3)\n    ..aE<UnsupportState>(5, _omitFieldNames ? '' : 'unsupportState',\n        enumValues: UnsupportState.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ArcConf clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ArcConf copyWith(void Function(ArcConf) updates) =>\n      super.copyWith((message) => updates(message as ArcConf)) as ArcConf;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ArcConf create() => ArcConf._();\n  @$core.override\n  ArcConf createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ArcConf getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ArcConf>(create);\n  static ArcConf? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get isSupport => $_getBF(0);\n  @$pb.TagNumber(1)\n  set isSupport($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIsSupport() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIsSupport() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get disabled => $_getBF(1);\n  @$pb.TagNumber(2)\n  set disabled($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDisabled() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDisabled() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  ExtraContent get extraContent => $_getN(2);\n  @$pb.TagNumber(3)\n  set extraContent(ExtraContent value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasExtraContent() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearExtraContent() => $_clearField(3);\n  @$pb.TagNumber(3)\n  ExtraContent ensureExtraContent() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<$core.int> get unsupportScene => $_getList(3);\n\n  @$pb.TagNumber(5)\n  UnsupportState get unsupportState => $_getN(4);\n  @$pb.TagNumber(5)\n  set unsupportState(UnsupportState value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasUnsupportState() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearUnsupportState() => $_clearField(5);\n}\n\nclass AutoQnCtl extends $pb.GeneratedMessage {\n  factory AutoQnCtl({\n    $fixnum.Int64? loginHalf,\n    $fixnum.Int64? nologinHalf,\n    $fixnum.Int64? loginFull,\n    $fixnum.Int64? nologinFull,\n    $fixnum.Int64? mobileLoginFull,\n    $fixnum.Int64? mobileNologinFull,\n    $core.Iterable<$core.MapEntry<$core.String, AutoQnRange>>? sceneQnRange,\n  }) {\n    final result = create();\n    if (loginHalf != null) result.loginHalf = loginHalf;\n    if (nologinHalf != null) result.nologinHalf = nologinHalf;\n    if (loginFull != null) result.loginFull = loginFull;\n    if (nologinFull != null) result.nologinFull = nologinFull;\n    if (mobileLoginFull != null) result.mobileLoginFull = mobileLoginFull;\n    if (mobileNologinFull != null) result.mobileNologinFull = mobileNologinFull;\n    if (sceneQnRange != null) result.sceneQnRange.addEntries(sceneQnRange);\n    return result;\n  }\n\n  AutoQnCtl._();\n\n  factory AutoQnCtl.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AutoQnCtl.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AutoQnCtl',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'loginHalf')\n    ..aInt64(2, _omitFieldNames ? '' : 'nologinHalf')\n    ..aInt64(3, _omitFieldNames ? '' : 'loginFull')\n    ..aInt64(4, _omitFieldNames ? '' : 'nologinFull')\n    ..aInt64(5, _omitFieldNames ? '' : 'mobileLoginFull')\n    ..aInt64(6, _omitFieldNames ? '' : 'mobileNologinFull')\n    ..m<$core.String, AutoQnRange>(7, _omitFieldNames ? '' : 'sceneQnRange',\n        entryClassName: 'AutoQnCtl.SceneQnRangeEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OM,\n        valueCreator: AutoQnRange.create,\n        valueDefaultOrMaker: AutoQnRange.getDefault,\n        packageName: const $pb.PackageName('bilibili.playershared'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AutoQnCtl clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AutoQnCtl copyWith(void Function(AutoQnCtl) updates) =>\n      super.copyWith((message) => updates(message as AutoQnCtl)) as AutoQnCtl;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AutoQnCtl create() => AutoQnCtl._();\n  @$core.override\n  AutoQnCtl createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AutoQnCtl getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<AutoQnCtl>(create);\n  static AutoQnCtl? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get loginHalf => $_getI64(0);\n  @$pb.TagNumber(1)\n  set loginHalf($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLoginHalf() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLoginHalf() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get nologinHalf => $_getI64(1);\n  @$pb.TagNumber(2)\n  set nologinHalf($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasNologinHalf() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearNologinHalf() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get loginFull => $_getI64(2);\n  @$pb.TagNumber(3)\n  set loginFull($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasLoginFull() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearLoginFull() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get nologinFull => $_getI64(3);\n  @$pb.TagNumber(4)\n  set nologinFull($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasNologinFull() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearNologinFull() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get mobileLoginFull => $_getI64(4);\n  @$pb.TagNumber(5)\n  set mobileLoginFull($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasMobileLoginFull() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearMobileLoginFull() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get mobileNologinFull => $_getI64(5);\n  @$pb.TagNumber(6)\n  set mobileNologinFull($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasMobileNologinFull() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearMobileNologinFull() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $pb.PbMap<$core.String, AutoQnRange> get sceneQnRange => $_getMap(6);\n}\n\nclass AutoQnRange extends $pb.GeneratedMessage {\n  factory AutoQnRange({\n    $fixnum.Int64? max,\n    $fixnum.Int64? min,\n  }) {\n    final result = create();\n    if (max != null) result.max = max;\n    if (min != null) result.min = min;\n    return result;\n  }\n\n  AutoQnRange._();\n\n  factory AutoQnRange.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory AutoQnRange.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'AutoQnRange',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'max')\n    ..aInt64(2, _omitFieldNames ? '' : 'min')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AutoQnRange clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AutoQnRange copyWith(void Function(AutoQnRange) updates) =>\n      super.copyWith((message) => updates(message as AutoQnRange))\n          as AutoQnRange;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AutoQnRange create() => AutoQnRange._();\n  @$core.override\n  AutoQnRange createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static AutoQnRange getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<AutoQnRange>(create);\n  static AutoQnRange? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get max => $_getI64(0);\n  @$pb.TagNumber(1)\n  set max($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMax() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMax() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get min => $_getI64(1);\n  @$pb.TagNumber(2)\n  set min($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMin() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMin() => $_clearField(2);\n}\n\nclass BackgroundInfo extends $pb.GeneratedMessage {\n  factory BackgroundInfo({\n    $core.String? drawableColor,\n    $core.String? drawableBitmapUrl,\n    Effects? effects,\n  }) {\n    final result = create();\n    if (drawableColor != null) result.drawableColor = drawableColor;\n    if (drawableBitmapUrl != null) result.drawableBitmapUrl = drawableBitmapUrl;\n    if (effects != null) result.effects = effects;\n    return result;\n  }\n\n  BackgroundInfo._();\n\n  factory BackgroundInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BackgroundInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BackgroundInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'drawableColor')\n    ..aOS(2, _omitFieldNames ? '' : 'drawableBitmapUrl')\n    ..aE<Effects>(3, _omitFieldNames ? '' : 'effects',\n        enumValues: Effects.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BackgroundInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BackgroundInfo copyWith(void Function(BackgroundInfo) updates) =>\n      super.copyWith((message) => updates(message as BackgroundInfo))\n          as BackgroundInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BackgroundInfo create() => BackgroundInfo._();\n  @$core.override\n  BackgroundInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BackgroundInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<BackgroundInfo>(create);\n  static BackgroundInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get drawableColor => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set drawableColor($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDrawableColor() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDrawableColor() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get drawableBitmapUrl => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set drawableBitmapUrl($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDrawableBitmapUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDrawableBitmapUrl() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  Effects get effects => $_getN(2);\n  @$pb.TagNumber(3)\n  set effects(Effects value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasEffects() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearEffects() => $_clearField(3);\n}\n\nclass Badge extends $pb.GeneratedMessage {\n  factory Badge({\n    $core.String? text,\n    $core.String? textColor,\n    $core.String? textColorNight,\n    $core.String? bgColor,\n    $core.String? bgColorNight,\n    $core.String? borderColor,\n    $core.String? borderColorNight,\n    $core.int? bgStyle,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (textColor != null) result.textColor = textColor;\n    if (textColorNight != null) result.textColorNight = textColorNight;\n    if (bgColor != null) result.bgColor = bgColor;\n    if (bgColorNight != null) result.bgColorNight = bgColorNight;\n    if (borderColor != null) result.borderColor = borderColor;\n    if (borderColorNight != null) result.borderColorNight = borderColorNight;\n    if (bgStyle != null) result.bgStyle = bgStyle;\n    return result;\n  }\n\n  Badge._();\n\n  factory Badge.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Badge.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Badge',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aOS(2, _omitFieldNames ? '' : 'textColor')\n    ..aOS(3, _omitFieldNames ? '' : 'textColorNight')\n    ..aOS(4, _omitFieldNames ? '' : 'bgColor')\n    ..aOS(5, _omitFieldNames ? '' : 'bgColorNight')\n    ..aOS(6, _omitFieldNames ? '' : 'borderColor')\n    ..aOS(7, _omitFieldNames ? '' : 'borderColorNight')\n    ..aI(8, _omitFieldNames ? '' : 'bgStyle')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Badge clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Badge copyWith(void Function(Badge) updates) =>\n      super.copyWith((message) => updates(message as Badge)) as Badge;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Badge create() => Badge._();\n  @$core.override\n  Badge createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Badge getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Badge>(create);\n  static Badge? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get textColor => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set textColor($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTextColor() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTextColor() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get textColorNight => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set textColorNight($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTextColorNight() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTextColorNight() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get bgColor => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set bgColor($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBgColor() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBgColor() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get bgColorNight => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set bgColorNight($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBgColorNight() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBgColorNight() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get borderColor => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set borderColor($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasBorderColor() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearBorderColor() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get borderColorNight => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set borderColorNight($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBorderColorNight() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBorderColorNight() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.int get bgStyle => $_getIZ(7);\n  @$pb.TagNumber(8)\n  set bgStyle($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasBgStyle() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearBgStyle() => $_clearField(8);\n}\n\nclass BadgeInfo extends $pb.GeneratedMessage {\n  factory BadgeInfo({\n    $core.String? text,\n    $core.String? bgColor,\n    $core.String? bgColorNight,\n    $core.String? textColor,\n    GradientColor? bgGradientColor,\n    $core.String? img,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (bgColor != null) result.bgColor = bgColor;\n    if (bgColorNight != null) result.bgColorNight = bgColorNight;\n    if (textColor != null) result.textColor = textColor;\n    if (bgGradientColor != null) result.bgGradientColor = bgGradientColor;\n    if (img != null) result.img = img;\n    return result;\n  }\n\n  BadgeInfo._();\n\n  factory BadgeInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BadgeInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BadgeInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aOS(2, _omitFieldNames ? '' : 'bgColor')\n    ..aOS(3, _omitFieldNames ? '' : 'bgColorNight')\n    ..aOS(4, _omitFieldNames ? '' : 'textColor')\n    ..aOM<GradientColor>(5, _omitFieldNames ? '' : 'bgGradientColor',\n        subBuilder: GradientColor.create)\n    ..aOS(6, _omitFieldNames ? '' : 'img')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BadgeInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BadgeInfo copyWith(void Function(BadgeInfo) updates) =>\n      super.copyWith((message) => updates(message as BadgeInfo)) as BadgeInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BadgeInfo create() => BadgeInfo._();\n  @$core.override\n  BadgeInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BadgeInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BadgeInfo>(create);\n  static BadgeInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get bgColor => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set bgColor($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBgColor() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBgColor() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get bgColorNight => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set bgColorNight($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBgColorNight() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBgColorNight() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get textColor => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set textColor($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTextColor() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTextColor() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  GradientColor get bgGradientColor => $_getN(4);\n  @$pb.TagNumber(5)\n  set bgGradientColor(GradientColor value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBgGradientColor() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBgGradientColor() => $_clearField(5);\n  @$pb.TagNumber(5)\n  GradientColor ensureBgGradientColor() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.String get img => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set img($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasImg() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearImg() => $_clearField(6);\n}\n\nclass Banner extends $pb.GeneratedMessage {\n  factory Banner({\n    $core.String? jumpLink,\n    $core.String? imageLink,\n    $core.String? halfImageLink,\n    Report? report,\n  }) {\n    final result = create();\n    if (jumpLink != null) result.jumpLink = jumpLink;\n    if (imageLink != null) result.imageLink = imageLink;\n    if (halfImageLink != null) result.halfImageLink = halfImageLink;\n    if (report != null) result.report = report;\n    return result;\n  }\n\n  Banner._();\n\n  factory Banner.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Banner.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Banner',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'jumpLink')\n    ..aOS(2, _omitFieldNames ? '' : 'imageLink')\n    ..aOS(3, _omitFieldNames ? '' : 'halfImageLink')\n    ..aOM<Report>(4, _omitFieldNames ? '' : 'report', subBuilder: Report.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Banner clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Banner copyWith(void Function(Banner) updates) =>\n      super.copyWith((message) => updates(message as Banner)) as Banner;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Banner create() => Banner._();\n  @$core.override\n  Banner createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Banner getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Banner>(create);\n  static Banner? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get jumpLink => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set jumpLink($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasJumpLink() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearJumpLink() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get imageLink => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set imageLink($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasImageLink() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearImageLink() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get halfImageLink => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set halfImageLink($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasHalfImageLink() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearHalfImageLink() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  Report get report => $_getN(3);\n  @$pb.TagNumber(4)\n  set report(Report value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasReport() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearReport() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Report ensureReport() => $_ensure(3);\n}\n\nclass BenefitInfo extends $pb.GeneratedMessage {\n  factory BenefitInfo({\n    $core.String? title,\n    $core.String? icon,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (icon != null) result.icon = icon;\n    return result;\n  }\n\n  BenefitInfo._();\n\n  factory BenefitInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BenefitInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BenefitInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'icon')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BenefitInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BenefitInfo copyWith(void Function(BenefitInfo) updates) =>\n      super.copyWith((message) => updates(message as BenefitInfo))\n          as BenefitInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BenefitInfo create() => BenefitInfo._();\n  @$core.override\n  BenefitInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BenefitInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<BenefitInfo>(create);\n  static BenefitInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get icon => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set icon($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIcon() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIcon() => $_clearField(2);\n}\n\nclass BottomDisplay extends $pb.GeneratedMessage {\n  factory BottomDisplay({\n    TextInfo? title,\n    $core.String? icon,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (icon != null) result.icon = icon;\n    return result;\n  }\n\n  BottomDisplay._();\n\n  factory BottomDisplay.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory BottomDisplay.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'BottomDisplay',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOM<TextInfo>(1, _omitFieldNames ? '' : 'title',\n        subBuilder: TextInfo.create)\n    ..aOS(2, _omitFieldNames ? '' : 'icon')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BottomDisplay clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  BottomDisplay copyWith(void Function(BottomDisplay) updates) =>\n      super.copyWith((message) => updates(message as BottomDisplay))\n          as BottomDisplay;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static BottomDisplay create() => BottomDisplay._();\n  @$core.override\n  BottomDisplay createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static BottomDisplay getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<BottomDisplay>(create);\n  static BottomDisplay? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  TextInfo get title => $_getN(0);\n  @$pb.TagNumber(1)\n  set title(TextInfo value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n  @$pb.TagNumber(1)\n  TextInfo ensureTitle() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $core.String get icon => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set icon($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasIcon() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearIcon() => $_clearField(2);\n}\n\nclass Button extends $pb.GeneratedMessage {\n  factory Button({\n    $core.String? text,\n    $core.String? link,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? reportParams,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (link != null) result.link = link;\n    if (reportParams != null) result.reportParams.addEntries(reportParams);\n    return result;\n  }\n\n  Button._();\n\n  factory Button.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Button.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Button',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aOS(2, _omitFieldNames ? '' : 'link')\n    ..m<$core.String, $core.String>(3, _omitFieldNames ? '' : 'reportParams',\n        entryClassName: 'Button.ReportParamsEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.playershared'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Button clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Button copyWith(void Function(Button) updates) =>\n      super.copyWith((message) => updates(message as Button)) as Button;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Button create() => Button._();\n  @$core.override\n  Button createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Button getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Button>(create);\n  static Button? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get link => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set link($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLink() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLink() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbMap<$core.String, $core.String> get reportParams => $_getMap(2);\n}\n\nclass ButtonInfo extends $pb.GeneratedMessage {\n  factory ButtonInfo({\n    $core.String? text,\n    $core.String? textColor,\n    $core.String? textColorNight,\n    $core.String? bgColor,\n    $core.String? bgColorNight,\n    $core.String? link,\n    ButtonAction? actionType,\n    BadgeInfo? badgeInfo,\n    Report? report,\n    $core.String? leftStrikethroughText,\n    TextInfo? simpleTextInfo,\n    $core.String? simpleBgColor,\n    $core.String? simpleBgColorNight,\n    GradientColor? bgGradientColor,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>?\n        orderReportParams,\n    TaskParam? taskParam,\n    $core.String? frameColor,\n    $core.String? icon,\n    $core.int? fontSize,\n    $core.String? tipsLink,\n    $core.String? deliverCode,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (textColor != null) result.textColor = textColor;\n    if (textColorNight != null) result.textColorNight = textColorNight;\n    if (bgColor != null) result.bgColor = bgColor;\n    if (bgColorNight != null) result.bgColorNight = bgColorNight;\n    if (link != null) result.link = link;\n    if (actionType != null) result.actionType = actionType;\n    if (badgeInfo != null) result.badgeInfo = badgeInfo;\n    if (report != null) result.report = report;\n    if (leftStrikethroughText != null)\n      result.leftStrikethroughText = leftStrikethroughText;\n    if (simpleTextInfo != null) result.simpleTextInfo = simpleTextInfo;\n    if (simpleBgColor != null) result.simpleBgColor = simpleBgColor;\n    if (simpleBgColorNight != null)\n      result.simpleBgColorNight = simpleBgColorNight;\n    if (bgGradientColor != null) result.bgGradientColor = bgGradientColor;\n    if (orderReportParams != null)\n      result.orderReportParams.addEntries(orderReportParams);\n    if (taskParam != null) result.taskParam = taskParam;\n    if (frameColor != null) result.frameColor = frameColor;\n    if (icon != null) result.icon = icon;\n    if (fontSize != null) result.fontSize = fontSize;\n    if (tipsLink != null) result.tipsLink = tipsLink;\n    if (deliverCode != null) result.deliverCode = deliverCode;\n    return result;\n  }\n\n  ButtonInfo._();\n\n  factory ButtonInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ButtonInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ButtonInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aOS(2, _omitFieldNames ? '' : 'textColor')\n    ..aOS(3, _omitFieldNames ? '' : 'textColorNight')\n    ..aOS(4, _omitFieldNames ? '' : 'bgColor')\n    ..aOS(5, _omitFieldNames ? '' : 'bgColorNight')\n    ..aOS(6, _omitFieldNames ? '' : 'link')\n    ..aE<ButtonAction>(7, _omitFieldNames ? '' : 'actionType',\n        enumValues: ButtonAction.values)\n    ..aOM<BadgeInfo>(8, _omitFieldNames ? '' : 'badgeInfo',\n        subBuilder: BadgeInfo.create)\n    ..aOM<Report>(9, _omitFieldNames ? '' : 'report', subBuilder: Report.create)\n    ..aOS(10, _omitFieldNames ? '' : 'leftStrikethroughText')\n    ..aOM<TextInfo>(11, _omitFieldNames ? '' : 'simpleTextInfo',\n        subBuilder: TextInfo.create)\n    ..aOS(12, _omitFieldNames ? '' : 'simpleBgColor')\n    ..aOS(13, _omitFieldNames ? '' : 'simpleBgColorNight')\n    ..aOM<GradientColor>(14, _omitFieldNames ? '' : 'bgGradientColor',\n        subBuilder: GradientColor.create)\n    ..m<$core.String, $core.String>(\n        15, _omitFieldNames ? '' : 'orderReportParams',\n        entryClassName: 'ButtonInfo.OrderReportParamsEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.playershared'))\n    ..aOM<TaskParam>(16, _omitFieldNames ? '' : 'taskParam',\n        subBuilder: TaskParam.create)\n    ..aOS(17, _omitFieldNames ? '' : 'frameColor')\n    ..aOS(18, _omitFieldNames ? '' : 'icon')\n    ..aI(19, _omitFieldNames ? '' : 'fontSize')\n    ..aOS(20, _omitFieldNames ? '' : 'tipsLink')\n    ..aOS(21, _omitFieldNames ? '' : 'deliverCode')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ButtonInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ButtonInfo copyWith(void Function(ButtonInfo) updates) =>\n      super.copyWith((message) => updates(message as ButtonInfo)) as ButtonInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ButtonInfo create() => ButtonInfo._();\n  @$core.override\n  ButtonInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ButtonInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ButtonInfo>(create);\n  static ButtonInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get textColor => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set textColor($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTextColor() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTextColor() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get textColorNight => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set textColorNight($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTextColorNight() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTextColorNight() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get bgColor => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set bgColor($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBgColor() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBgColor() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get bgColorNight => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set bgColorNight($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBgColorNight() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBgColorNight() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get link => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set link($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasLink() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearLink() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  ButtonAction get actionType => $_getN(6);\n  @$pb.TagNumber(7)\n  set actionType(ButtonAction value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasActionType() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearActionType() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  BadgeInfo get badgeInfo => $_getN(7);\n  @$pb.TagNumber(8)\n  set badgeInfo(BadgeInfo value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasBadgeInfo() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearBadgeInfo() => $_clearField(8);\n  @$pb.TagNumber(8)\n  BadgeInfo ensureBadgeInfo() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  Report get report => $_getN(8);\n  @$pb.TagNumber(9)\n  set report(Report value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasReport() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearReport() => $_clearField(9);\n  @$pb.TagNumber(9)\n  Report ensureReport() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  $core.String get leftStrikethroughText => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set leftStrikethroughText($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasLeftStrikethroughText() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearLeftStrikethroughText() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  TextInfo get simpleTextInfo => $_getN(10);\n  @$pb.TagNumber(11)\n  set simpleTextInfo(TextInfo value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasSimpleTextInfo() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearSimpleTextInfo() => $_clearField(11);\n  @$pb.TagNumber(11)\n  TextInfo ensureSimpleTextInfo() => $_ensure(10);\n\n  @$pb.TagNumber(12)\n  $core.String get simpleBgColor => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set simpleBgColor($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasSimpleBgColor() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearSimpleBgColor() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.String get simpleBgColorNight => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set simpleBgColorNight($core.String value) => $_setString(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasSimpleBgColorNight() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearSimpleBgColorNight() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  GradientColor get bgGradientColor => $_getN(13);\n  @$pb.TagNumber(14)\n  set bgGradientColor(GradientColor value) => $_setField(14, value);\n  @$pb.TagNumber(14)\n  $core.bool hasBgGradientColor() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearBgGradientColor() => $_clearField(14);\n  @$pb.TagNumber(14)\n  GradientColor ensureBgGradientColor() => $_ensure(13);\n\n  @$pb.TagNumber(15)\n  $pb.PbMap<$core.String, $core.String> get orderReportParams => $_getMap(14);\n\n  @$pb.TagNumber(16)\n  TaskParam get taskParam => $_getN(15);\n  @$pb.TagNumber(16)\n  set taskParam(TaskParam value) => $_setField(16, value);\n  @$pb.TagNumber(16)\n  $core.bool hasTaskParam() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearTaskParam() => $_clearField(16);\n  @$pb.TagNumber(16)\n  TaskParam ensureTaskParam() => $_ensure(15);\n\n  @$pb.TagNumber(17)\n  $core.String get frameColor => $_getSZ(16);\n  @$pb.TagNumber(17)\n  set frameColor($core.String value) => $_setString(16, value);\n  @$pb.TagNumber(17)\n  $core.bool hasFrameColor() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearFrameColor() => $_clearField(17);\n\n  @$pb.TagNumber(18)\n  $core.String get icon => $_getSZ(17);\n  @$pb.TagNumber(18)\n  set icon($core.String value) => $_setString(17, value);\n  @$pb.TagNumber(18)\n  $core.bool hasIcon() => $_has(17);\n  @$pb.TagNumber(18)\n  void clearIcon() => $_clearField(18);\n\n  @$pb.TagNumber(19)\n  $core.int get fontSize => $_getIZ(18);\n  @$pb.TagNumber(19)\n  set fontSize($core.int value) => $_setSignedInt32(18, value);\n  @$pb.TagNumber(19)\n  $core.bool hasFontSize() => $_has(18);\n  @$pb.TagNumber(19)\n  void clearFontSize() => $_clearField(19);\n\n  @$pb.TagNumber(20)\n  $core.String get tipsLink => $_getSZ(19);\n  @$pb.TagNumber(20)\n  set tipsLink($core.String value) => $_setString(19, value);\n  @$pb.TagNumber(20)\n  $core.bool hasTipsLink() => $_has(19);\n  @$pb.TagNumber(20)\n  void clearTipsLink() => $_clearField(20);\n\n  @$pb.TagNumber(21)\n  $core.String get deliverCode => $_getSZ(20);\n  @$pb.TagNumber(21)\n  set deliverCode($core.String value) => $_setString(20, value);\n  @$pb.TagNumber(21)\n  $core.bool hasDeliverCode() => $_has(20);\n  @$pb.TagNumber(21)\n  void clearDeliverCode() => $_clearField(21);\n}\n\nclass ChargingExt extends $pb.GeneratedMessage {\n  factory ChargingExt({\n    $core.bool? hideBgImg,\n  }) {\n    final result = create();\n    if (hideBgImg != null) result.hideBgImg = hideBgImg;\n    return result;\n  }\n\n  ChargingExt._();\n\n  factory ChargingExt.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ChargingExt.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ChargingExt',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'hideBgImg')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ChargingExt clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ChargingExt copyWith(void Function(ChargingExt) updates) =>\n      super.copyWith((message) => updates(message as ChargingExt))\n          as ChargingExt;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ChargingExt create() => ChargingExt._();\n  @$core.override\n  ChargingExt createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ChargingExt getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ChargingExt>(create);\n  static ChargingExt? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get hideBgImg => $_getBF(0);\n  @$pb.TagNumber(1)\n  set hideBgImg($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasHideBgImg() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearHideBgImg() => $_clearField(1);\n}\n\nclass ComprehensiveToast extends $pb.GeneratedMessage {\n  factory ComprehensiveToast({\n    ToastType? type,\n    ButtonInfo? button,\n    ShowStyleType? showStyleType,\n    $core.String? icon,\n    TextInfo? toastText,\n    Report? report,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>?\n        orderReportParams,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (button != null) result.button = button;\n    if (showStyleType != null) result.showStyleType = showStyleType;\n    if (icon != null) result.icon = icon;\n    if (toastText != null) result.toastText = toastText;\n    if (report != null) result.report = report;\n    if (orderReportParams != null)\n      result.orderReportParams.addEntries(orderReportParams);\n    return result;\n  }\n\n  ComprehensiveToast._();\n\n  factory ComprehensiveToast.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ComprehensiveToast.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ComprehensiveToast',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aE<ToastType>(1, _omitFieldNames ? '' : 'type',\n        enumValues: ToastType.values)\n    ..aOM<ButtonInfo>(2, _omitFieldNames ? '' : 'button',\n        subBuilder: ButtonInfo.create)\n    ..aE<ShowStyleType>(3, _omitFieldNames ? '' : 'showStyleType',\n        enumValues: ShowStyleType.values)\n    ..aOS(4, _omitFieldNames ? '' : 'icon')\n    ..aOM<TextInfo>(5, _omitFieldNames ? '' : 'toastText',\n        subBuilder: TextInfo.create)\n    ..aOM<Report>(6, _omitFieldNames ? '' : 'report', subBuilder: Report.create)\n    ..m<$core.String, $core.String>(\n        7, _omitFieldNames ? '' : 'orderReportParams',\n        entryClassName: 'ComprehensiveToast.OrderReportParamsEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.playershared'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ComprehensiveToast clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ComprehensiveToast copyWith(void Function(ComprehensiveToast) updates) =>\n      super.copyWith((message) => updates(message as ComprehensiveToast))\n          as ComprehensiveToast;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ComprehensiveToast create() => ComprehensiveToast._();\n  @$core.override\n  ComprehensiveToast createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ComprehensiveToast getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ComprehensiveToast>(create);\n  static ComprehensiveToast? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  ToastType get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(ToastType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  ButtonInfo get button => $_getN(1);\n  @$pb.TagNumber(2)\n  set button(ButtonInfo value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasButton() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearButton() => $_clearField(2);\n  @$pb.TagNumber(2)\n  ButtonInfo ensureButton() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  ShowStyleType get showStyleType => $_getN(2);\n  @$pb.TagNumber(3)\n  set showStyleType(ShowStyleType value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasShowStyleType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearShowStyleType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get icon => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set icon($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasIcon() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearIcon() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  TextInfo get toastText => $_getN(4);\n  @$pb.TagNumber(5)\n  set toastText(TextInfo value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasToastText() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearToastText() => $_clearField(5);\n  @$pb.TagNumber(5)\n  TextInfo ensureToastText() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  Report get report => $_getN(5);\n  @$pb.TagNumber(6)\n  set report(Report value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasReport() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearReport() => $_clearField(6);\n  @$pb.TagNumber(6)\n  Report ensureReport() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  $pb.PbMap<$core.String, $core.String> get orderReportParams => $_getMap(6);\n}\n\nenum ConfValue_Value { switchVal, selectedVal, notSet }\n\nclass ConfValue extends $pb.GeneratedMessage {\n  factory ConfValue({\n    $core.bool? switchVal,\n    $fixnum.Int64? selectedVal,\n  }) {\n    final result = create();\n    if (switchVal != null) result.switchVal = switchVal;\n    if (selectedVal != null) result.selectedVal = selectedVal;\n    return result;\n  }\n\n  ConfValue._();\n\n  factory ConfValue.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ConfValue.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, ConfValue_Value> _ConfValue_ValueByTag = {\n    1: ConfValue_Value.switchVal,\n    2: ConfValue_Value.selectedVal,\n    0: ConfValue_Value.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ConfValue',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..oo(0, [1, 2])\n    ..aOB(1, _omitFieldNames ? '' : 'switchVal')\n    ..aInt64(2, _omitFieldNames ? '' : 'selectedVal')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ConfValue clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ConfValue copyWith(void Function(ConfValue) updates) =>\n      super.copyWith((message) => updates(message as ConfValue)) as ConfValue;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ConfValue create() => ConfValue._();\n  @$core.override\n  ConfValue createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ConfValue getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ConfValue>(create);\n  static ConfValue? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  @$pb.TagNumber(2)\n  ConfValue_Value whichValue() => _ConfValue_ValueByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(1)\n  @$pb.TagNumber(2)\n  void clearValue() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  $core.bool get switchVal => $_getBF(0);\n  @$pb.TagNumber(1)\n  set switchVal($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSwitchVal() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSwitchVal() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get selectedVal => $_getI64(1);\n  @$pb.TagNumber(2)\n  set selectedVal($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSelectedVal() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSelectedVal() => $_clearField(2);\n}\n\nclass CountDownItem extends $pb.GeneratedMessage {\n  factory CountDownItem({\n    $fixnum.Int64? foldCountdown,\n    TextInfo? title,\n    TextInfo? subtitle,\n  }) {\n    final result = create();\n    if (foldCountdown != null) result.foldCountdown = foldCountdown;\n    if (title != null) result.title = title;\n    if (subtitle != null) result.subtitle = subtitle;\n    return result;\n  }\n\n  CountDownItem._();\n\n  factory CountDownItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory CountDownItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'CountDownItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'foldCountdown')\n    ..aOM<TextInfo>(2, _omitFieldNames ? '' : 'title',\n        subBuilder: TextInfo.create)\n    ..aOM<TextInfo>(3, _omitFieldNames ? '' : 'subtitle',\n        subBuilder: TextInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CountDownItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  CountDownItem copyWith(void Function(CountDownItem) updates) =>\n      super.copyWith((message) => updates(message as CountDownItem))\n          as CountDownItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static CountDownItem create() => CountDownItem._();\n  @$core.override\n  CountDownItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static CountDownItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<CountDownItem>(create);\n  static CountDownItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get foldCountdown => $_getI64(0);\n  @$pb.TagNumber(1)\n  set foldCountdown($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFoldCountdown() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFoldCountdown() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  TextInfo get title => $_getN(1);\n  @$pb.TagNumber(2)\n  set title(TextInfo value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n  @$pb.TagNumber(2)\n  TextInfo ensureTitle() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  TextInfo get subtitle => $_getN(2);\n  @$pb.TagNumber(3)\n  set subtitle(TextInfo value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSubtitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSubtitle() => $_clearField(3);\n  @$pb.TagNumber(3)\n  TextInfo ensureSubtitle() => $_ensure(2);\n}\n\nclass DashItem extends $pb.GeneratedMessage {\n  factory DashItem({\n    $core.int? id,\n    $core.String? baseUrl,\n    $core.Iterable<$core.String>? backupUrl,\n    $core.int? bandwidth,\n    $core.int? codecid,\n    $core.String? md5,\n    $fixnum.Int64? size,\n    $core.String? frameRate,\n    $core.String? widevinePssh,\n    $core.String? bilidrmUri,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (baseUrl != null) result.baseUrl = baseUrl;\n    if (backupUrl != null) result.backupUrl.addAll(backupUrl);\n    if (bandwidth != null) result.bandwidth = bandwidth;\n    if (codecid != null) result.codecid = codecid;\n    if (md5 != null) result.md5 = md5;\n    if (size != null) result.size = size;\n    if (frameRate != null) result.frameRate = frameRate;\n    if (widevinePssh != null) result.widevinePssh = widevinePssh;\n    if (bilidrmUri != null) result.bilidrmUri = bilidrmUri;\n    return result;\n  }\n\n  DashItem._();\n\n  factory DashItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DashItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DashItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'baseUrl')\n    ..pPS(3, _omitFieldNames ? '' : 'backupUrl')\n    ..aI(4, _omitFieldNames ? '' : 'bandwidth')\n    ..aI(5, _omitFieldNames ? '' : 'codecid')\n    ..aOS(6, _omitFieldNames ? '' : 'md5')\n    ..aInt64(7, _omitFieldNames ? '' : 'size')\n    ..aOS(8, _omitFieldNames ? '' : 'frameRate')\n    ..aOS(9, _omitFieldNames ? '' : 'widevinePssh')\n    ..aOS(10, _omitFieldNames ? '' : 'bilidrmUri')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DashItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DashItem copyWith(void Function(DashItem) updates) =>\n      super.copyWith((message) => updates(message as DashItem)) as DashItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DashItem create() => DashItem._();\n  @$core.override\n  DashItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DashItem getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DashItem>(create);\n  static DashItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get id => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set id($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get baseUrl => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set baseUrl($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBaseUrl() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBaseUrl() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<$core.String> get backupUrl => $_getList(2);\n\n  @$pb.TagNumber(4)\n  $core.int get bandwidth => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set bandwidth($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBandwidth() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBandwidth() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get codecid => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set codecid($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCodecid() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCodecid() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get md5 => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set md5($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasMd5() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearMd5() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get size => $_getI64(6);\n  @$pb.TagNumber(7)\n  set size($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasSize() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearSize() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get frameRate => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set frameRate($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasFrameRate() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearFrameRate() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get widevinePssh => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set widevinePssh($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasWidevinePssh() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearWidevinePssh() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.String get bilidrmUri => $_getSZ(9);\n  @$pb.TagNumber(10)\n  set bilidrmUri($core.String value) => $_setString(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasBilidrmUri() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearBilidrmUri() => $_clearField(10);\n}\n\nclass DashVideo extends $pb.GeneratedMessage {\n  factory DashVideo({\n    $core.String? baseUrl,\n    $core.Iterable<$core.String>? backupUrl,\n    $core.int? bandwidth,\n    $core.int? codecid,\n    $core.String? md5,\n    $fixnum.Int64? size,\n    $core.int? audioId,\n    $core.bool? noRexcode,\n    $core.String? frameRate,\n    $core.int? width,\n    $core.int? height,\n    $core.String? widevinePssh,\n    $core.String? bilidrmUri,\n  }) {\n    final result = create();\n    if (baseUrl != null) result.baseUrl = baseUrl;\n    if (backupUrl != null) result.backupUrl.addAll(backupUrl);\n    if (bandwidth != null) result.bandwidth = bandwidth;\n    if (codecid != null) result.codecid = codecid;\n    if (md5 != null) result.md5 = md5;\n    if (size != null) result.size = size;\n    if (audioId != null) result.audioId = audioId;\n    if (noRexcode != null) result.noRexcode = noRexcode;\n    if (frameRate != null) result.frameRate = frameRate;\n    if (width != null) result.width = width;\n    if (height != null) result.height = height;\n    if (widevinePssh != null) result.widevinePssh = widevinePssh;\n    if (bilidrmUri != null) result.bilidrmUri = bilidrmUri;\n    return result;\n  }\n\n  DashVideo._();\n\n  factory DashVideo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DashVideo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DashVideo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'baseUrl')\n    ..pPS(2, _omitFieldNames ? '' : 'backupUrl')\n    ..aI(3, _omitFieldNames ? '' : 'bandwidth')\n    ..aI(4, _omitFieldNames ? '' : 'codecid')\n    ..aOS(5, _omitFieldNames ? '' : 'md5')\n    ..aInt64(6, _omitFieldNames ? '' : 'size')\n    ..aI(7, _omitFieldNames ? '' : 'audioId')\n    ..aOB(8, _omitFieldNames ? '' : 'noRexcode')\n    ..aOS(9, _omitFieldNames ? '' : 'frameRate')\n    ..aI(10, _omitFieldNames ? '' : 'width')\n    ..aI(11, _omitFieldNames ? '' : 'height')\n    ..aOS(12, _omitFieldNames ? '' : 'widevinePssh')\n    ..aOS(13, _omitFieldNames ? '' : 'bilidrmUri')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DashVideo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DashVideo copyWith(void Function(DashVideo) updates) =>\n      super.copyWith((message) => updates(message as DashVideo)) as DashVideo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DashVideo create() => DashVideo._();\n  @$core.override\n  DashVideo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DashVideo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DashVideo>(create);\n  static DashVideo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get baseUrl => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set baseUrl($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBaseUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBaseUrl() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<$core.String> get backupUrl => $_getList(1);\n\n  @$pb.TagNumber(3)\n  $core.int get bandwidth => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set bandwidth($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBandwidth() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBandwidth() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get codecid => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set codecid($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCodecid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCodecid() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get md5 => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set md5($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasMd5() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearMd5() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get size => $_getI64(5);\n  @$pb.TagNumber(6)\n  set size($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasSize() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearSize() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get audioId => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set audioId($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasAudioId() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearAudioId() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.bool get noRexcode => $_getBF(7);\n  @$pb.TagNumber(8)\n  set noRexcode($core.bool value) => $_setBool(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasNoRexcode() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearNoRexcode() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get frameRate => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set frameRate($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasFrameRate() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearFrameRate() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.int get width => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set width($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasWidth() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearWidth() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.int get height => $_getIZ(10);\n  @$pb.TagNumber(11)\n  set height($core.int value) => $_setSignedInt32(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasHeight() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearHeight() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get widevinePssh => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set widevinePssh($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasWidevinePssh() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearWidevinePssh() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.String get bilidrmUri => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set bilidrmUri($core.String value) => $_setString(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasBilidrmUri() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearBilidrmUri() => $_clearField(13);\n}\n\nclass DeviceConf extends $pb.GeneratedMessage {\n  factory DeviceConf({\n    ConfValue? confValue,\n  }) {\n    final result = create();\n    if (confValue != null) result.confValue = confValue;\n    return result;\n  }\n\n  DeviceConf._();\n\n  factory DeviceConf.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DeviceConf.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DeviceConf',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOM<ConfValue>(1, _omitFieldNames ? '' : 'confValue',\n        subBuilder: ConfValue.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DeviceConf clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DeviceConf copyWith(void Function(DeviceConf) updates) =>\n      super.copyWith((message) => updates(message as DeviceConf)) as DeviceConf;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DeviceConf create() => DeviceConf._();\n  @$core.override\n  DeviceConf createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DeviceConf getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<DeviceConf>(create);\n  static DeviceConf? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  ConfValue get confValue => $_getN(0);\n  @$pb.TagNumber(1)\n  set confValue(ConfValue value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasConfValue() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearConfValue() => $_clearField(1);\n  @$pb.TagNumber(1)\n  ConfValue ensureConfValue() => $_ensure(0);\n}\n\nclass Dialog extends $pb.GeneratedMessage {\n  factory Dialog({\n    GuideStyle? styleType,\n    BackgroundInfo? backgroundInfo,\n    TextInfo? title,\n    TextInfo? subtitle,\n    ImageInfo? image,\n    $core.Iterable<ButtonInfo>? button,\n    ButtonInfo? bottomDesc,\n    Report? report,\n    $core.int? countDownSec,\n    TextInfo? rightBottomDesc,\n    $core.Iterable<BottomDisplay>? bottomDisplay,\n    ExtData? extData,\n    LimitActionType? limitActionType,\n    $core.int? isHideMoreBtn,\n    $core.int? hideButtonOnHalf,\n    $core.String? deliverWinId,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? conditions,\n  }) {\n    final result = create();\n    if (styleType != null) result.styleType = styleType;\n    if (backgroundInfo != null) result.backgroundInfo = backgroundInfo;\n    if (title != null) result.title = title;\n    if (subtitle != null) result.subtitle = subtitle;\n    if (image != null) result.image = image;\n    if (button != null) result.button.addAll(button);\n    if (bottomDesc != null) result.bottomDesc = bottomDesc;\n    if (report != null) result.report = report;\n    if (countDownSec != null) result.countDownSec = countDownSec;\n    if (rightBottomDesc != null) result.rightBottomDesc = rightBottomDesc;\n    if (bottomDisplay != null) result.bottomDisplay.addAll(bottomDisplay);\n    if (extData != null) result.extData = extData;\n    if (limitActionType != null) result.limitActionType = limitActionType;\n    if (isHideMoreBtn != null) result.isHideMoreBtn = isHideMoreBtn;\n    if (hideButtonOnHalf != null) result.hideButtonOnHalf = hideButtonOnHalf;\n    if (deliverWinId != null) result.deliverWinId = deliverWinId;\n    if (conditions != null) result.conditions.addEntries(conditions);\n    return result;\n  }\n\n  Dialog._();\n\n  factory Dialog.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Dialog.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Dialog',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aE<GuideStyle>(1, _omitFieldNames ? '' : 'styleType',\n        enumValues: GuideStyle.values)\n    ..aOM<BackgroundInfo>(2, _omitFieldNames ? '' : 'backgroundInfo',\n        subBuilder: BackgroundInfo.create)\n    ..aOM<TextInfo>(3, _omitFieldNames ? '' : 'title',\n        subBuilder: TextInfo.create)\n    ..aOM<TextInfo>(4, _omitFieldNames ? '' : 'subtitle',\n        subBuilder: TextInfo.create)\n    ..aOM<ImageInfo>(5, _omitFieldNames ? '' : 'image',\n        subBuilder: ImageInfo.create)\n    ..pPM<ButtonInfo>(6, _omitFieldNames ? '' : 'button',\n        subBuilder: ButtonInfo.create)\n    ..aOM<ButtonInfo>(7, _omitFieldNames ? '' : 'bottomDesc',\n        subBuilder: ButtonInfo.create)\n    ..aOM<Report>(8, _omitFieldNames ? '' : 'report', subBuilder: Report.create)\n    ..aI(9, _omitFieldNames ? '' : 'countDownSec')\n    ..aOM<TextInfo>(10, _omitFieldNames ? '' : 'rightBottomDesc',\n        subBuilder: TextInfo.create)\n    ..pPM<BottomDisplay>(11, _omitFieldNames ? '' : 'bottomDisplay',\n        subBuilder: BottomDisplay.create)\n    ..aOM<ExtData>(12, _omitFieldNames ? '' : 'extData',\n        subBuilder: ExtData.create)\n    ..aE<LimitActionType>(13, _omitFieldNames ? '' : 'limitActionType',\n        enumValues: LimitActionType.values)\n    ..aI(14, _omitFieldNames ? '' : 'isHideMoreBtn')\n    ..aI(15, _omitFieldNames ? '' : 'hideButtonOnHalf')\n    ..aOS(16, _omitFieldNames ? '' : 'deliverWinId')\n    ..m<$core.String, $core.String>(17, _omitFieldNames ? '' : 'conditions',\n        entryClassName: 'Dialog.ConditionsEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.playershared'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Dialog clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Dialog copyWith(void Function(Dialog) updates) =>\n      super.copyWith((message) => updates(message as Dialog)) as Dialog;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Dialog create() => Dialog._();\n  @$core.override\n  Dialog createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Dialog getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Dialog>(create);\n  static Dialog? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  GuideStyle get styleType => $_getN(0);\n  @$pb.TagNumber(1)\n  set styleType(GuideStyle value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStyleType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStyleType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  BackgroundInfo get backgroundInfo => $_getN(1);\n  @$pb.TagNumber(2)\n  set backgroundInfo(BackgroundInfo value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasBackgroundInfo() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearBackgroundInfo() => $_clearField(2);\n  @$pb.TagNumber(2)\n  BackgroundInfo ensureBackgroundInfo() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  TextInfo get title => $_getN(2);\n  @$pb.TagNumber(3)\n  set title(TextInfo value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTitle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTitle() => $_clearField(3);\n  @$pb.TagNumber(3)\n  TextInfo ensureTitle() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  TextInfo get subtitle => $_getN(3);\n  @$pb.TagNumber(4)\n  set subtitle(TextInfo value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasSubtitle() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearSubtitle() => $_clearField(4);\n  @$pb.TagNumber(4)\n  TextInfo ensureSubtitle() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  ImageInfo get image => $_getN(4);\n  @$pb.TagNumber(5)\n  set image(ImageInfo value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasImage() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearImage() => $_clearField(5);\n  @$pb.TagNumber(5)\n  ImageInfo ensureImage() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $pb.PbList<ButtonInfo> get button => $_getList(5);\n\n  @$pb.TagNumber(7)\n  ButtonInfo get bottomDesc => $_getN(6);\n  @$pb.TagNumber(7)\n  set bottomDesc(ButtonInfo value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasBottomDesc() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearBottomDesc() => $_clearField(7);\n  @$pb.TagNumber(7)\n  ButtonInfo ensureBottomDesc() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  Report get report => $_getN(7);\n  @$pb.TagNumber(8)\n  set report(Report value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasReport() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearReport() => $_clearField(8);\n  @$pb.TagNumber(8)\n  Report ensureReport() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  $core.int get countDownSec => $_getIZ(8);\n  @$pb.TagNumber(9)\n  set countDownSec($core.int value) => $_setSignedInt32(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasCountDownSec() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearCountDownSec() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  TextInfo get rightBottomDesc => $_getN(9);\n  @$pb.TagNumber(10)\n  set rightBottomDesc(TextInfo value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasRightBottomDesc() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearRightBottomDesc() => $_clearField(10);\n  @$pb.TagNumber(10)\n  TextInfo ensureRightBottomDesc() => $_ensure(9);\n\n  @$pb.TagNumber(11)\n  $pb.PbList<BottomDisplay> get bottomDisplay => $_getList(10);\n\n  @$pb.TagNumber(12)\n  ExtData get extData => $_getN(11);\n  @$pb.TagNumber(12)\n  set extData(ExtData value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasExtData() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearExtData() => $_clearField(12);\n  @$pb.TagNumber(12)\n  ExtData ensureExtData() => $_ensure(11);\n\n  @$pb.TagNumber(13)\n  LimitActionType get limitActionType => $_getN(12);\n  @$pb.TagNumber(13)\n  set limitActionType(LimitActionType value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasLimitActionType() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearLimitActionType() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.int get isHideMoreBtn => $_getIZ(13);\n  @$pb.TagNumber(14)\n  set isHideMoreBtn($core.int value) => $_setSignedInt32(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasIsHideMoreBtn() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearIsHideMoreBtn() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $core.int get hideButtonOnHalf => $_getIZ(14);\n  @$pb.TagNumber(15)\n  set hideButtonOnHalf($core.int value) => $_setSignedInt32(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasHideButtonOnHalf() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearHideButtonOnHalf() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  $core.String get deliverWinId => $_getSZ(15);\n  @$pb.TagNumber(16)\n  set deliverWinId($core.String value) => $_setString(15, value);\n  @$pb.TagNumber(16)\n  $core.bool hasDeliverWinId() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearDeliverWinId() => $_clearField(16);\n\n  @$pb.TagNumber(17)\n  $pb.PbMap<$core.String, $core.String> get conditions => $_getMap(16);\n}\n\nclass Dimension extends $pb.GeneratedMessage {\n  factory Dimension({\n    $fixnum.Int64? width,\n    $fixnum.Int64? height,\n    $fixnum.Int64? rotate,\n    $fixnum.Int64? variable,\n  }) {\n    final result = create();\n    if (width != null) result.width = width;\n    if (height != null) result.height = height;\n    if (rotate != null) result.rotate = rotate;\n    if (variable != null) result.variable = variable;\n    return result;\n  }\n\n  Dimension._();\n\n  factory Dimension.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Dimension.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Dimension',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'width')\n    ..aInt64(2, _omitFieldNames ? '' : 'height')\n    ..aInt64(3, _omitFieldNames ? '' : 'rotate')\n    ..aInt64(4, _omitFieldNames ? '' : 'variable')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Dimension clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Dimension copyWith(void Function(Dimension) updates) =>\n      super.copyWith((message) => updates(message as Dimension)) as Dimension;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Dimension create() => Dimension._();\n  @$core.override\n  Dimension createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Dimension getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Dimension>(create);\n  static Dimension? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get width => $_getI64(0);\n  @$pb.TagNumber(1)\n  set width($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasWidth() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearWidth() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get height => $_getI64(1);\n  @$pb.TagNumber(2)\n  set height($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHeight() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearHeight() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get rotate => $_getI64(2);\n  @$pb.TagNumber(3)\n  set rotate($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRotate() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRotate() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get variable => $_getI64(3);\n  @$pb.TagNumber(4)\n  set variable($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasVariable() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearVariable() => $_clearField(4);\n}\n\nclass DolbyItem extends $pb.GeneratedMessage {\n  factory DolbyItem({\n    DolbyItem_Type? type,\n    $core.Iterable<DashItem>? audio,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (audio != null) result.audio.addAll(audio);\n    return result;\n  }\n\n  DolbyItem._();\n\n  factory DolbyItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory DolbyItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'DolbyItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aE<DolbyItem_Type>(1, _omitFieldNames ? '' : 'type',\n        enumValues: DolbyItem_Type.values)\n    ..pPM<DashItem>(2, _omitFieldNames ? '' : 'audio',\n        subBuilder: DashItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DolbyItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  DolbyItem copyWith(void Function(DolbyItem) updates) =>\n      super.copyWith((message) => updates(message as DolbyItem)) as DolbyItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static DolbyItem create() => DolbyItem._();\n  @$core.override\n  DolbyItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static DolbyItem getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DolbyItem>(create);\n  static DolbyItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  DolbyItem_Type get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(DolbyItem_Type value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<DashItem> get audio => $_getList(1);\n}\n\nclass EpInlineVideo extends $pb.GeneratedMessage {\n  factory EpInlineVideo({\n    $fixnum.Int64? materialNo,\n    $fixnum.Int64? aid,\n    $fixnum.Int64? cid,\n  }) {\n    final result = create();\n    if (materialNo != null) result.materialNo = materialNo;\n    if (aid != null) result.aid = aid;\n    if (cid != null) result.cid = cid;\n    return result;\n  }\n\n  EpInlineVideo._();\n\n  factory EpInlineVideo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory EpInlineVideo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'EpInlineVideo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'materialNo')\n    ..aInt64(2, _omitFieldNames ? '' : 'aid')\n    ..aInt64(3, _omitFieldNames ? '' : 'cid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  EpInlineVideo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  EpInlineVideo copyWith(void Function(EpInlineVideo) updates) =>\n      super.copyWith((message) => updates(message as EpInlineVideo))\n          as EpInlineVideo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static EpInlineVideo create() => EpInlineVideo._();\n  @$core.override\n  EpInlineVideo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static EpInlineVideo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<EpInlineVideo>(create);\n  static EpInlineVideo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get materialNo => $_getI64(0);\n  @$pb.TagNumber(1)\n  set materialNo($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMaterialNo() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMaterialNo() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get aid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set aid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get cid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set cid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCid() => $_clearField(3);\n}\n\nclass EpInlineVideoInfo extends $pb.GeneratedMessage {\n  factory EpInlineVideoInfo({\n    $core.Iterable<EpInlineVideo>? epInlineVideo,\n  }) {\n    final result = create();\n    if (epInlineVideo != null) result.epInlineVideo.addAll(epInlineVideo);\n    return result;\n  }\n\n  EpInlineVideoInfo._();\n\n  factory EpInlineVideoInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory EpInlineVideoInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'EpInlineVideoInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..pPM<EpInlineVideo>(1, _omitFieldNames ? '' : 'epInlineVideo',\n        subBuilder: EpInlineVideo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  EpInlineVideoInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  EpInlineVideoInfo copyWith(void Function(EpInlineVideoInfo) updates) =>\n      super.copyWith((message) => updates(message as EpInlineVideoInfo))\n          as EpInlineVideoInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static EpInlineVideoInfo create() => EpInlineVideoInfo._();\n  @$core.override\n  EpInlineVideoInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static EpInlineVideoInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<EpInlineVideoInfo>(create);\n  static EpInlineVideoInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<EpInlineVideo> get epInlineVideo => $_getList(0);\n}\n\nclass Event extends $pb.GeneratedMessage {\n  factory Event({\n    Shake? shake,\n    QnTip? qnTip,\n  }) {\n    final result = create();\n    if (shake != null) result.shake = shake;\n    if (qnTip != null) result.qnTip = qnTip;\n    return result;\n  }\n\n  Event._();\n\n  factory Event.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Event.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Event',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOM<Shake>(1, _omitFieldNames ? '' : 'shake', subBuilder: Shake.create)\n    ..aOM<QnTip>(2, _omitFieldNames ? '' : 'qnTip', subBuilder: QnTip.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Event clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Event copyWith(void Function(Event) updates) =>\n      super.copyWith((message) => updates(message as Event)) as Event;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Event create() => Event._();\n  @$core.override\n  Event createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Event getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Event>(create);\n  static Event? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Shake get shake => $_getN(0);\n  @$pb.TagNumber(1)\n  set shake(Shake value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasShake() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearShake() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Shake ensureShake() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  QnTip get qnTip => $_getN(1);\n  @$pb.TagNumber(2)\n  set qnTip(QnTip value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasQnTip() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearQnTip() => $_clearField(2);\n  @$pb.TagNumber(2)\n  QnTip ensureQnTip() => $_ensure(1);\n}\n\nclass ExpSwitch extends $pb.GeneratedMessage {\n  factory ExpSwitch({\n    $core.int? hitOptiTryWatch,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? expAb,\n  }) {\n    final result = create();\n    if (hitOptiTryWatch != null) result.hitOptiTryWatch = hitOptiTryWatch;\n    if (expAb != null) result.expAb.addEntries(expAb);\n    return result;\n  }\n\n  ExpSwitch._();\n\n  factory ExpSwitch.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ExpSwitch.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ExpSwitch',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aI(2, _omitFieldNames ? '' : 'hitOptiTryWatch')\n    ..m<$core.String, $core.String>(3, _omitFieldNames ? '' : 'expAb',\n        entryClassName: 'ExpSwitch.ExpAbEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.playershared'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExpSwitch clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExpSwitch copyWith(void Function(ExpSwitch) updates) =>\n      super.copyWith((message) => updates(message as ExpSwitch)) as ExpSwitch;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ExpSwitch create() => ExpSwitch._();\n  @$core.override\n  ExpSwitch createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ExpSwitch getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ExpSwitch>(create);\n  static ExpSwitch? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  $core.int get hitOptiTryWatch => $_getIZ(0);\n  @$pb.TagNumber(2)\n  set hitOptiTryWatch($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(2)\n  $core.bool hasHitOptiTryWatch() => $_has(0);\n  @$pb.TagNumber(2)\n  void clearHitOptiTryWatch() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbMap<$core.String, $core.String> get expAb => $_getMap(1);\n}\n\nenum ExtData_Data {\n  playListInfo,\n  banner,\n  epInlineVideoInfo,\n  chargingExt,\n  qrCode,\n  notSet\n}\n\nclass ExtData extends $pb.GeneratedMessage {\n  factory ExtData({\n    ExtDataType? type,\n    PlayListInfo? playListInfo,\n    Banner? banner,\n    EpInlineVideoInfo? epInlineVideoInfo,\n    ChargingExt? chargingExt,\n    QrCode? qrCode,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (playListInfo != null) result.playListInfo = playListInfo;\n    if (banner != null) result.banner = banner;\n    if (epInlineVideoInfo != null) result.epInlineVideoInfo = epInlineVideoInfo;\n    if (chargingExt != null) result.chargingExt = chargingExt;\n    if (qrCode != null) result.qrCode = qrCode;\n    return result;\n  }\n\n  ExtData._();\n\n  factory ExtData.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ExtData.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, ExtData_Data> _ExtData_DataByTag = {\n    2: ExtData_Data.playListInfo,\n    3: ExtData_Data.banner,\n    4: ExtData_Data.epInlineVideoInfo,\n    5: ExtData_Data.chargingExt,\n    6: ExtData_Data.qrCode,\n    0: ExtData_Data.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ExtData',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..oo(0, [2, 3, 4, 5, 6])\n    ..aE<ExtDataType>(1, _omitFieldNames ? '' : 'type',\n        enumValues: ExtDataType.values)\n    ..aOM<PlayListInfo>(2, _omitFieldNames ? '' : 'playListInfo',\n        subBuilder: PlayListInfo.create)\n    ..aOM<Banner>(3, _omitFieldNames ? '' : 'banner', subBuilder: Banner.create)\n    ..aOM<EpInlineVideoInfo>(4, _omitFieldNames ? '' : 'epInlineVideoInfo',\n        subBuilder: EpInlineVideoInfo.create)\n    ..aOM<ChargingExt>(5, _omitFieldNames ? '' : 'chargingExt',\n        subBuilder: ChargingExt.create)\n    ..aOM<QrCode>(6, _omitFieldNames ? '' : 'qrCode', subBuilder: QrCode.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtData clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtData copyWith(void Function(ExtData) updates) =>\n      super.copyWith((message) => updates(message as ExtData)) as ExtData;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ExtData create() => ExtData._();\n  @$core.override\n  ExtData createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ExtData getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ExtData>(create);\n  static ExtData? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  @$pb.TagNumber(6)\n  ExtData_Data whichData() => _ExtData_DataByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  @$pb.TagNumber(6)\n  void clearData() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  ExtDataType get type => $_getN(0);\n  @$pb.TagNumber(1)\n  set type(ExtDataType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  PlayListInfo get playListInfo => $_getN(1);\n  @$pb.TagNumber(2)\n  set playListInfo(PlayListInfo value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPlayListInfo() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPlayListInfo() => $_clearField(2);\n  @$pb.TagNumber(2)\n  PlayListInfo ensurePlayListInfo() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  Banner get banner => $_getN(2);\n  @$pb.TagNumber(3)\n  set banner(Banner value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasBanner() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearBanner() => $_clearField(3);\n  @$pb.TagNumber(3)\n  Banner ensureBanner() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  EpInlineVideoInfo get epInlineVideoInfo => $_getN(3);\n  @$pb.TagNumber(4)\n  set epInlineVideoInfo(EpInlineVideoInfo value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasEpInlineVideoInfo() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearEpInlineVideoInfo() => $_clearField(4);\n  @$pb.TagNumber(4)\n  EpInlineVideoInfo ensureEpInlineVideoInfo() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  ChargingExt get chargingExt => $_getN(4);\n  @$pb.TagNumber(5)\n  set chargingExt(ChargingExt value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasChargingExt() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearChargingExt() => $_clearField(5);\n  @$pb.TagNumber(5)\n  ChargingExt ensureChargingExt() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  QrCode get qrCode => $_getN(5);\n  @$pb.TagNumber(6)\n  set qrCode(QrCode value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasQrCode() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearQrCode() => $_clearField(6);\n  @$pb.TagNumber(6)\n  QrCode ensureQrCode() => $_ensure(5);\n}\n\nclass ExtraContent extends $pb.GeneratedMessage {\n  factory ExtraContent({\n    $core.String? disabledReason,\n    $fixnum.Int64? disabledCode,\n  }) {\n    final result = create();\n    if (disabledReason != null) result.disabledReason = disabledReason;\n    if (disabledCode != null) result.disabledCode = disabledCode;\n    return result;\n  }\n\n  ExtraContent._();\n\n  factory ExtraContent.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ExtraContent.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ExtraContent',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'disabledReason')\n    ..aInt64(2, _omitFieldNames ? '' : 'disabledCode')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtraContent clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ExtraContent copyWith(void Function(ExtraContent) updates) =>\n      super.copyWith((message) => updates(message as ExtraContent))\n          as ExtraContent;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ExtraContent create() => ExtraContent._();\n  @$core.override\n  ExtraContent createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ExtraContent getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ExtraContent>(create);\n  static ExtraContent? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get disabledReason => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set disabledReason($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDisabledReason() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDisabledReason() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get disabledCode => $_getI64(1);\n  @$pb.TagNumber(2)\n  set disabledCode($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDisabledCode() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDisabledCode() => $_clearField(2);\n}\n\nenum FoldData_Data { countDown, notSet }\n\nclass FoldData extends $pb.GeneratedMessage {\n  factory FoldData({\n    FoldStyle? foldStyle,\n    CountDownItem? countDown,\n  }) {\n    final result = create();\n    if (foldStyle != null) result.foldStyle = foldStyle;\n    if (countDown != null) result.countDown = countDown;\n    return result;\n  }\n\n  FoldData._();\n\n  factory FoldData.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FoldData.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, FoldData_Data> _FoldData_DataByTag = {\n    2: FoldData_Data.countDown,\n    0: FoldData_Data.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FoldData',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..oo(0, [2])\n    ..aE<FoldStyle>(1, _omitFieldNames ? '' : 'foldStyle',\n        enumValues: FoldStyle.values)\n    ..aOM<CountDownItem>(2, _omitFieldNames ? '' : 'countDown',\n        subBuilder: CountDownItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FoldData clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FoldData copyWith(void Function(FoldData) updates) =>\n      super.copyWith((message) => updates(message as FoldData)) as FoldData;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FoldData create() => FoldData._();\n  @$core.override\n  FoldData createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FoldData getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<FoldData>(create);\n  static FoldData? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  FoldData_Data whichData() => _FoldData_DataByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  void clearData() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  FoldStyle get foldStyle => $_getN(0);\n  @$pb.TagNumber(1)\n  set foldStyle(FoldStyle value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFoldStyle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFoldStyle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  CountDownItem get countDown => $_getN(1);\n  @$pb.TagNumber(2)\n  set countDown(CountDownItem value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCountDown() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCountDown() => $_clearField(2);\n  @$pb.TagNumber(2)\n  CountDownItem ensureCountDown() => $_ensure(1);\n}\n\nclass Fragment extends $pb.GeneratedMessage {\n  factory Fragment({\n    $core.Iterable<FragmentInfo>? infos,\n  }) {\n    final result = create();\n    if (infos != null) result.infos.addAll(infos);\n    return result;\n  }\n\n  Fragment._();\n\n  factory Fragment.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Fragment.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Fragment',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..pPM<FragmentInfo>(1, _omitFieldNames ? '' : 'infos',\n        subBuilder: FragmentInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Fragment clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Fragment copyWith(void Function(Fragment) updates) =>\n      super.copyWith((message) => updates(message as Fragment)) as Fragment;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Fragment create() => Fragment._();\n  @$core.override\n  Fragment createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Fragment getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Fragment>(create);\n  static Fragment? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<FragmentInfo> get infos => $_getList(0);\n}\n\nclass FragmentInfo extends $pb.GeneratedMessage {\n  factory FragmentInfo({\n    $core.int? index,\n    FragmentPosition? fragmentPosition,\n    FragmentType? fragmentType,\n    $fixnum.Int64? aid,\n    $fixnum.Int64? cid,\n    $fixnum.Int64? startTime,\n    $0.Any? report,\n  }) {\n    final result = create();\n    if (index != null) result.index = index;\n    if (fragmentPosition != null) result.fragmentPosition = fragmentPosition;\n    if (fragmentType != null) result.fragmentType = fragmentType;\n    if (aid != null) result.aid = aid;\n    if (cid != null) result.cid = cid;\n    if (startTime != null) result.startTime = startTime;\n    if (report != null) result.report = report;\n    return result;\n  }\n\n  FragmentInfo._();\n\n  factory FragmentInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FragmentInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FragmentInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'index')\n    ..aE<FragmentPosition>(2, _omitFieldNames ? '' : 'fragmentPosition',\n        enumValues: FragmentPosition.values)\n    ..aE<FragmentType>(3, _omitFieldNames ? '' : 'fragmentType',\n        enumValues: FragmentType.values)\n    ..aInt64(4, _omitFieldNames ? '' : 'aid')\n    ..aInt64(5, _omitFieldNames ? '' : 'cid')\n    ..aInt64(6, _omitFieldNames ? '' : 'startTime')\n    ..aOM<$0.Any>(7, _omitFieldNames ? '' : 'report', subBuilder: $0.Any.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FragmentInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FragmentInfo copyWith(void Function(FragmentInfo) updates) =>\n      super.copyWith((message) => updates(message as FragmentInfo))\n          as FragmentInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FragmentInfo create() => FragmentInfo._();\n  @$core.override\n  FragmentInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FragmentInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FragmentInfo>(create);\n  static FragmentInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get index => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set index($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIndex() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIndex() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  FragmentPosition get fragmentPosition => $_getN(1);\n  @$pb.TagNumber(2)\n  set fragmentPosition(FragmentPosition value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFragmentPosition() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFragmentPosition() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  FragmentType get fragmentType => $_getN(2);\n  @$pb.TagNumber(3)\n  set fragmentType(FragmentType value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasFragmentType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearFragmentType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get aid => $_getI64(3);\n  @$pb.TagNumber(4)\n  set aid($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasAid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearAid() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get cid => $_getI64(4);\n  @$pb.TagNumber(5)\n  set cid($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasCid() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearCid() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get startTime => $_getI64(5);\n  @$pb.TagNumber(6)\n  set startTime($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasStartTime() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearStartTime() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $0.Any get report => $_getN(6);\n  @$pb.TagNumber(7)\n  set report($0.Any value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasReport() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearReport() => $_clearField(7);\n  @$pb.TagNumber(7)\n  $0.Any ensureReport() => $_ensure(6);\n}\n\nclass FragmentVideo extends $pb.GeneratedMessage {\n  factory FragmentVideo({\n    $core.Iterable<FragmentVideoInfo>? videos,\n  }) {\n    final result = create();\n    if (videos != null) result.videos.addAll(videos);\n    return result;\n  }\n\n  FragmentVideo._();\n\n  factory FragmentVideo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FragmentVideo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FragmentVideo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..pPM<FragmentVideoInfo>(1, _omitFieldNames ? '' : 'videos',\n        subBuilder: FragmentVideoInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FragmentVideo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FragmentVideo copyWith(void Function(FragmentVideo) updates) =>\n      super.copyWith((message) => updates(message as FragmentVideo))\n          as FragmentVideo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FragmentVideo create() => FragmentVideo._();\n  @$core.override\n  FragmentVideo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FragmentVideo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FragmentVideo>(create);\n  static FragmentVideo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<FragmentVideoInfo> get videos => $_getList(0);\n}\n\nclass FragmentVideoInfo extends $pb.GeneratedMessage {\n  factory FragmentVideoInfo({\n    FragmentInfo? fragmentInfo,\n    VodInfo? vodInfo,\n    PlayArcConf? playArcConf,\n    Dimension? dimension,\n    $fixnum.Int64? timelength,\n    BizType? videoType,\n    $core.bool? playableStatus,\n  }) {\n    final result = create();\n    if (fragmentInfo != null) result.fragmentInfo = fragmentInfo;\n    if (vodInfo != null) result.vodInfo = vodInfo;\n    if (playArcConf != null) result.playArcConf = playArcConf;\n    if (dimension != null) result.dimension = dimension;\n    if (timelength != null) result.timelength = timelength;\n    if (videoType != null) result.videoType = videoType;\n    if (playableStatus != null) result.playableStatus = playableStatus;\n    return result;\n  }\n\n  FragmentVideoInfo._();\n\n  factory FragmentVideoInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FragmentVideoInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FragmentVideoInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOM<FragmentInfo>(1, _omitFieldNames ? '' : 'fragmentInfo',\n        subBuilder: FragmentInfo.create)\n    ..aOM<VodInfo>(2, _omitFieldNames ? '' : 'vodInfo',\n        subBuilder: VodInfo.create)\n    ..aOM<PlayArcConf>(3, _omitFieldNames ? '' : 'playArcConf',\n        subBuilder: PlayArcConf.create)\n    ..aOM<Dimension>(4, _omitFieldNames ? '' : 'dimension',\n        subBuilder: Dimension.create)\n    ..aInt64(5, _omitFieldNames ? '' : 'timelength')\n    ..aE<BizType>(6, _omitFieldNames ? '' : 'videoType',\n        enumValues: BizType.values)\n    ..aOB(7, _omitFieldNames ? '' : 'playableStatus')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FragmentVideoInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FragmentVideoInfo copyWith(void Function(FragmentVideoInfo) updates) =>\n      super.copyWith((message) => updates(message as FragmentVideoInfo))\n          as FragmentVideoInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FragmentVideoInfo create() => FragmentVideoInfo._();\n  @$core.override\n  FragmentVideoInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FragmentVideoInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FragmentVideoInfo>(create);\n  static FragmentVideoInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  FragmentInfo get fragmentInfo => $_getN(0);\n  @$pb.TagNumber(1)\n  set fragmentInfo(FragmentInfo value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFragmentInfo() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFragmentInfo() => $_clearField(1);\n  @$pb.TagNumber(1)\n  FragmentInfo ensureFragmentInfo() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  VodInfo get vodInfo => $_getN(1);\n  @$pb.TagNumber(2)\n  set vodInfo(VodInfo value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasVodInfo() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearVodInfo() => $_clearField(2);\n  @$pb.TagNumber(2)\n  VodInfo ensureVodInfo() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  PlayArcConf get playArcConf => $_getN(2);\n  @$pb.TagNumber(3)\n  set playArcConf(PlayArcConf value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasPlayArcConf() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearPlayArcConf() => $_clearField(3);\n  @$pb.TagNumber(3)\n  PlayArcConf ensurePlayArcConf() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  Dimension get dimension => $_getN(3);\n  @$pb.TagNumber(4)\n  set dimension(Dimension value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDimension() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDimension() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Dimension ensureDimension() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get timelength => $_getI64(4);\n  @$pb.TagNumber(5)\n  set timelength($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasTimelength() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearTimelength() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  BizType get videoType => $_getN(5);\n  @$pb.TagNumber(6)\n  set videoType(BizType value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasVideoType() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearVideoType() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.bool get playableStatus => $_getBF(6);\n  @$pb.TagNumber(7)\n  set playableStatus($core.bool value) => $_setBool(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasPlayableStatus() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearPlayableStatus() => $_clearField(7);\n}\n\nclass FullPromptBar extends $pb.GeneratedMessage {\n  factory FullPromptBar({\n    $core.String? icon,\n    TextInfo? title,\n    $fixnum.Int64? timerCountdown,\n    $core.bool? countdownEnable,\n    TextInfo? subtitle,\n    $core.Iterable<ButtonInfo>? button,\n    FoldData? foldData,\n    Report? report,\n    $core.String? bgImage,\n    $core.int? barHeight,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (title != null) result.title = title;\n    if (timerCountdown != null) result.timerCountdown = timerCountdown;\n    if (countdownEnable != null) result.countdownEnable = countdownEnable;\n    if (subtitle != null) result.subtitle = subtitle;\n    if (button != null) result.button.addAll(button);\n    if (foldData != null) result.foldData = foldData;\n    if (report != null) result.report = report;\n    if (bgImage != null) result.bgImage = bgImage;\n    if (barHeight != null) result.barHeight = barHeight;\n    return result;\n  }\n\n  FullPromptBar._();\n\n  factory FullPromptBar.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FullPromptBar.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FullPromptBar',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOM<TextInfo>(2, _omitFieldNames ? '' : 'title',\n        subBuilder: TextInfo.create)\n    ..aInt64(3, _omitFieldNames ? '' : 'timerCountdown')\n    ..aOB(4, _omitFieldNames ? '' : 'countdownEnable')\n    ..aOM<TextInfo>(5, _omitFieldNames ? '' : 'subtitle',\n        subBuilder: TextInfo.create)\n    ..pPM<ButtonInfo>(6, _omitFieldNames ? '' : 'button',\n        subBuilder: ButtonInfo.create)\n    ..aOM<FoldData>(7, _omitFieldNames ? '' : 'foldData',\n        subBuilder: FoldData.create)\n    ..aOM<Report>(8, _omitFieldNames ? '' : 'report', subBuilder: Report.create)\n    ..aOS(9, _omitFieldNames ? '' : 'bgImage')\n    ..aI(10, _omitFieldNames ? '' : 'barHeight')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FullPromptBar clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FullPromptBar copyWith(void Function(FullPromptBar) updates) =>\n      super.copyWith((message) => updates(message as FullPromptBar))\n          as FullPromptBar;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FullPromptBar create() => FullPromptBar._();\n  @$core.override\n  FullPromptBar createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FullPromptBar getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FullPromptBar>(create);\n  static FullPromptBar? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  TextInfo get title => $_getN(1);\n  @$pb.TagNumber(2)\n  set title(TextInfo value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n  @$pb.TagNumber(2)\n  TextInfo ensureTitle() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get timerCountdown => $_getI64(2);\n  @$pb.TagNumber(3)\n  set timerCountdown($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTimerCountdown() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTimerCountdown() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.bool get countdownEnable => $_getBF(3);\n  @$pb.TagNumber(4)\n  set countdownEnable($core.bool value) => $_setBool(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCountdownEnable() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCountdownEnable() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  TextInfo get subtitle => $_getN(4);\n  @$pb.TagNumber(5)\n  set subtitle(TextInfo value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasSubtitle() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearSubtitle() => $_clearField(5);\n  @$pb.TagNumber(5)\n  TextInfo ensureSubtitle() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $pb.PbList<ButtonInfo> get button => $_getList(5);\n\n  @$pb.TagNumber(7)\n  FoldData get foldData => $_getN(6);\n  @$pb.TagNumber(7)\n  set foldData(FoldData value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasFoldData() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearFoldData() => $_clearField(7);\n  @$pb.TagNumber(7)\n  FoldData ensureFoldData() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  Report get report => $_getN(7);\n  @$pb.TagNumber(8)\n  set report(Report value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasReport() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearReport() => $_clearField(8);\n  @$pb.TagNumber(8)\n  Report ensureReport() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  $core.String get bgImage => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set bgImage($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasBgImage() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearBgImage() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $core.int get barHeight => $_getIZ(9);\n  @$pb.TagNumber(10)\n  set barHeight($core.int value) => $_setSignedInt32(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasBarHeight() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearBarHeight() => $_clearField(10);\n}\n\nclass GradientColor extends $pb.GeneratedMessage {\n  factory GradientColor({\n    $core.String? startColor,\n    $core.String? endColor,\n  }) {\n    final result = create();\n    if (startColor != null) result.startColor = startColor;\n    if (endColor != null) result.endColor = endColor;\n    return result;\n  }\n\n  GradientColor._();\n\n  factory GradientColor.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory GradientColor.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'GradientColor',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'startColor')\n    ..aOS(2, _omitFieldNames ? '' : 'endColor')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GradientColor clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  GradientColor copyWith(void Function(GradientColor) updates) =>\n      super.copyWith((message) => updates(message as GradientColor))\n          as GradientColor;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static GradientColor create() => GradientColor._();\n  @$core.override\n  GradientColor createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static GradientColor getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<GradientColor>(create);\n  static GradientColor? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get startColor => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set startColor($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStartColor() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStartColor() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get endColor => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set endColor($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasEndColor() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearEndColor() => $_clearField(2);\n}\n\nclass History extends $pb.GeneratedMessage {\n  factory History({\n    HistoryInfo? currentVideo,\n    HistoryInfo? relatedVideo,\n  }) {\n    final result = create();\n    if (currentVideo != null) result.currentVideo = currentVideo;\n    if (relatedVideo != null) result.relatedVideo = relatedVideo;\n    return result;\n  }\n\n  History._();\n\n  factory History.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory History.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'History',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOM<HistoryInfo>(1, _omitFieldNames ? '' : 'currentVideo',\n        subBuilder: HistoryInfo.create)\n    ..aOM<HistoryInfo>(2, _omitFieldNames ? '' : 'relatedVideo',\n        subBuilder: HistoryInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  History clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  History copyWith(void Function(History) updates) =>\n      super.copyWith((message) => updates(message as History)) as History;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static History create() => History._();\n  @$core.override\n  History createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static History getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<History>(create);\n  static History? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  HistoryInfo get currentVideo => $_getN(0);\n  @$pb.TagNumber(1)\n  set currentVideo(HistoryInfo value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCurrentVideo() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCurrentVideo() => $_clearField(1);\n  @$pb.TagNumber(1)\n  HistoryInfo ensureCurrentVideo() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  HistoryInfo get relatedVideo => $_getN(1);\n  @$pb.TagNumber(2)\n  set relatedVideo(HistoryInfo value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasRelatedVideo() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRelatedVideo() => $_clearField(2);\n  @$pb.TagNumber(2)\n  HistoryInfo ensureRelatedVideo() => $_ensure(1);\n}\n\nclass HistoryInfo extends $pb.GeneratedMessage {\n  factory HistoryInfo({\n    $fixnum.Int64? progress,\n    $fixnum.Int64? lastPlayCid,\n    Toast? toast,\n    Toast? toastWithoutTime,\n    $fixnum.Int64? lastPlayAid,\n  }) {\n    final result = create();\n    if (progress != null) result.progress = progress;\n    if (lastPlayCid != null) result.lastPlayCid = lastPlayCid;\n    if (toast != null) result.toast = toast;\n    if (toastWithoutTime != null) result.toastWithoutTime = toastWithoutTime;\n    if (lastPlayAid != null) result.lastPlayAid = lastPlayAid;\n    return result;\n  }\n\n  HistoryInfo._();\n\n  factory HistoryInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory HistoryInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'HistoryInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'progress')\n    ..aInt64(2, _omitFieldNames ? '' : 'lastPlayCid')\n    ..aOM<Toast>(3, _omitFieldNames ? '' : 'toast', subBuilder: Toast.create)\n    ..aOM<Toast>(4, _omitFieldNames ? '' : 'toastWithoutTime',\n        subBuilder: Toast.create)\n    ..aInt64(5, _omitFieldNames ? '' : 'lastPlayAid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  HistoryInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  HistoryInfo copyWith(void Function(HistoryInfo) updates) =>\n      super.copyWith((message) => updates(message as HistoryInfo))\n          as HistoryInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static HistoryInfo create() => HistoryInfo._();\n  @$core.override\n  HistoryInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static HistoryInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<HistoryInfo>(create);\n  static HistoryInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get progress => $_getI64(0);\n  @$pb.TagNumber(1)\n  set progress($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasProgress() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearProgress() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get lastPlayCid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set lastPlayCid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLastPlayCid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLastPlayCid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  Toast get toast => $_getN(2);\n  @$pb.TagNumber(3)\n  set toast(Toast value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasToast() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearToast() => $_clearField(3);\n  @$pb.TagNumber(3)\n  Toast ensureToast() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  Toast get toastWithoutTime => $_getN(3);\n  @$pb.TagNumber(4)\n  set toastWithoutTime(Toast value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasToastWithoutTime() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearToastWithoutTime() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Toast ensureToastWithoutTime() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get lastPlayAid => $_getI64(4);\n  @$pb.TagNumber(5)\n  set lastPlayAid($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasLastPlayAid() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearLastPlayAid() => $_clearField(5);\n}\n\nclass ImageInfo extends $pb.GeneratedMessage {\n  factory ImageInfo({\n    $core.String? url,\n  }) {\n    final result = create();\n    if (url != null) result.url = url;\n    return result;\n  }\n\n  ImageInfo._();\n\n  factory ImageInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ImageInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ImageInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'url')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ImageInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ImageInfo copyWith(void Function(ImageInfo) updates) =>\n      super.copyWith((message) => updates(message as ImageInfo)) as ImageInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ImageInfo create() => ImageInfo._();\n  @$core.override\n  ImageInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ImageInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ImageInfo>(create);\n  static ImageInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get url => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set url($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUrl() => $_clearField(1);\n}\n\nclass Interaction extends $pb.GeneratedMessage {\n  factory Interaction({\n    Node? historyNode,\n    $fixnum.Int64? graphVersion,\n    $core.String? msg,\n    $fixnum.Int64? mark,\n  }) {\n    final result = create();\n    if (historyNode != null) result.historyNode = historyNode;\n    if (graphVersion != null) result.graphVersion = graphVersion;\n    if (msg != null) result.msg = msg;\n    if (mark != null) result.mark = mark;\n    return result;\n  }\n\n  Interaction._();\n\n  factory Interaction.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Interaction.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Interaction',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOM<Node>(1, _omitFieldNames ? '' : 'historyNode',\n        subBuilder: Node.create)\n    ..aInt64(2, _omitFieldNames ? '' : 'graphVersion')\n    ..aOS(3, _omitFieldNames ? '' : 'msg')\n    ..aInt64(4, _omitFieldNames ? '' : 'mark')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Interaction clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Interaction copyWith(void Function(Interaction) updates) =>\n      super.copyWith((message) => updates(message as Interaction))\n          as Interaction;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Interaction create() => Interaction._();\n  @$core.override\n  Interaction createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Interaction getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<Interaction>(create);\n  static Interaction? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Node get historyNode => $_getN(0);\n  @$pb.TagNumber(1)\n  set historyNode(Node value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasHistoryNode() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearHistoryNode() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Node ensureHistoryNode() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get graphVersion => $_getI64(1);\n  @$pb.TagNumber(2)\n  set graphVersion($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasGraphVersion() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearGraphVersion() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get msg => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set msg($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasMsg() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearMsg() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get mark => $_getI64(3);\n  @$pb.TagNumber(4)\n  set mark($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasMark() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearMark() => $_clearField(4);\n}\n\nclass LossLessItem extends $pb.GeneratedMessage {\n  factory LossLessItem({\n    $core.bool? isLosslessAudio,\n    DashItem? audio,\n    $core.bool? needVip,\n  }) {\n    final result = create();\n    if (isLosslessAudio != null) result.isLosslessAudio = isLosslessAudio;\n    if (audio != null) result.audio = audio;\n    if (needVip != null) result.needVip = needVip;\n    return result;\n  }\n\n  LossLessItem._();\n\n  factory LossLessItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory LossLessItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'LossLessItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'isLosslessAudio')\n    ..aOM<DashItem>(2, _omitFieldNames ? '' : 'audio',\n        subBuilder: DashItem.create)\n    ..aOB(3, _omitFieldNames ? '' : 'needVip')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LossLessItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  LossLessItem copyWith(void Function(LossLessItem) updates) =>\n      super.copyWith((message) => updates(message as LossLessItem))\n          as LossLessItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static LossLessItem create() => LossLessItem._();\n  @$core.override\n  LossLessItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static LossLessItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<LossLessItem>(create);\n  static LossLessItem? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get isLosslessAudio => $_getBF(0);\n  @$pb.TagNumber(1)\n  set isLosslessAudio($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIsLosslessAudio() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIsLosslessAudio() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  DashItem get audio => $_getN(1);\n  @$pb.TagNumber(2)\n  set audio(DashItem value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAudio() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAudio() => $_clearField(2);\n  @$pb.TagNumber(2)\n  DashItem ensureAudio() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.bool get needVip => $_getBF(2);\n  @$pb.TagNumber(3)\n  set needVip($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasNeedVip() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearNeedVip() => $_clearField(3);\n}\n\nclass MultiDashVideo extends $pb.GeneratedMessage {\n  factory MultiDashVideo({\n    $core.Iterable<DashVideo>? dashVideos,\n  }) {\n    final result = create();\n    if (dashVideos != null) result.dashVideos.addAll(dashVideos);\n    return result;\n  }\n\n  MultiDashVideo._();\n\n  factory MultiDashVideo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory MultiDashVideo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'MultiDashVideo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..pPM<DashVideo>(1, _omitFieldNames ? '' : 'dashVideos',\n        subBuilder: DashVideo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MultiDashVideo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  MultiDashVideo copyWith(void Function(MultiDashVideo) updates) =>\n      super.copyWith((message) => updates(message as MultiDashVideo))\n          as MultiDashVideo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static MultiDashVideo create() => MultiDashVideo._();\n  @$core.override\n  MultiDashVideo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static MultiDashVideo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<MultiDashVideo>(create);\n  static MultiDashVideo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<DashVideo> get dashVideos => $_getList(0);\n}\n\nclass Node extends $pb.GeneratedMessage {\n  factory Node({\n    $fixnum.Int64? nodeId,\n    $core.String? title,\n    $fixnum.Int64? cid,\n  }) {\n    final result = create();\n    if (nodeId != null) result.nodeId = nodeId;\n    if (title != null) result.title = title;\n    if (cid != null) result.cid = cid;\n    return result;\n  }\n\n  Node._();\n\n  factory Node.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Node.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Node',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'nodeId')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aInt64(3, _omitFieldNames ? '' : 'cid')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Node clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Node copyWith(void Function(Node) updates) =>\n      super.copyWith((message) => updates(message as Node)) as Node;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Node create() => Node._();\n  @$core.override\n  Node createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Node getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Node>(create);\n  static Node? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get nodeId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set nodeId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasNodeId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearNodeId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get cid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set cid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCid() => $_clearField(3);\n}\n\nclass PayWallOnshowAction extends $pb.GeneratedMessage {\n  factory PayWallOnshowAction({\n    $core.String? link,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>?\n        orderReportParams,\n    ButtonAction? actionType,\n  }) {\n    final result = create();\n    if (link != null) result.link = link;\n    if (orderReportParams != null)\n      result.orderReportParams.addEntries(orderReportParams);\n    if (actionType != null) result.actionType = actionType;\n    return result;\n  }\n\n  PayWallOnshowAction._();\n\n  factory PayWallOnshowAction.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PayWallOnshowAction.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PayWallOnshowAction',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'link')\n    ..m<$core.String, $core.String>(\n        2, _omitFieldNames ? '' : 'orderReportParams',\n        entryClassName: 'PayWallOnshowAction.OrderReportParamsEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.playershared'))\n    ..aE<ButtonAction>(3, _omitFieldNames ? '' : 'actionType',\n        enumValues: ButtonAction.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PayWallOnshowAction clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PayWallOnshowAction copyWith(void Function(PayWallOnshowAction) updates) =>\n      super.copyWith((message) => updates(message as PayWallOnshowAction))\n          as PayWallOnshowAction;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PayWallOnshowAction create() => PayWallOnshowAction._();\n  @$core.override\n  PayWallOnshowAction createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PayWallOnshowAction getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PayWallOnshowAction>(create);\n  static PayWallOnshowAction? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get link => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set link($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLink() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLink() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbMap<$core.String, $core.String> get orderReportParams => $_getMap(1);\n\n  @$pb.TagNumber(3)\n  ButtonAction get actionType => $_getN(2);\n  @$pb.TagNumber(3)\n  set actionType(ButtonAction value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasActionType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearActionType() => $_clearField(3);\n}\n\nclass PlayArc extends $pb.GeneratedMessage {\n  factory PlayArc({\n    BizType? videoType,\n    $fixnum.Int64? aid,\n    $fixnum.Int64? cid,\n    DrmTechType? drmTechType,\n    ArcType? arcType,\n    Interaction? interaction,\n    Dimension? dimension,\n    $fixnum.Int64? duration,\n    $core.bool? isPreview,\n    $fixnum.Int64? watchTimeLength,\n    $fixnum.Int64? durationMs,\n  }) {\n    final result = create();\n    if (videoType != null) result.videoType = videoType;\n    if (aid != null) result.aid = aid;\n    if (cid != null) result.cid = cid;\n    if (drmTechType != null) result.drmTechType = drmTechType;\n    if (arcType != null) result.arcType = arcType;\n    if (interaction != null) result.interaction = interaction;\n    if (dimension != null) result.dimension = dimension;\n    if (duration != null) result.duration = duration;\n    if (isPreview != null) result.isPreview = isPreview;\n    if (watchTimeLength != null) result.watchTimeLength = watchTimeLength;\n    if (durationMs != null) result.durationMs = durationMs;\n    return result;\n  }\n\n  PlayArc._();\n\n  factory PlayArc.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayArc.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayArc',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aE<BizType>(1, _omitFieldNames ? '' : 'videoType',\n        enumValues: BizType.values)\n    ..aInt64(2, _omitFieldNames ? '' : 'aid')\n    ..aInt64(3, _omitFieldNames ? '' : 'cid')\n    ..aE<DrmTechType>(4, _omitFieldNames ? '' : 'drmTechType',\n        enumValues: DrmTechType.values)\n    ..aE<ArcType>(5, _omitFieldNames ? '' : 'arcType',\n        enumValues: ArcType.values)\n    ..aOM<Interaction>(6, _omitFieldNames ? '' : 'interaction',\n        subBuilder: Interaction.create)\n    ..aOM<Dimension>(7, _omitFieldNames ? '' : 'dimension',\n        subBuilder: Dimension.create)\n    ..aInt64(8, _omitFieldNames ? '' : 'duration')\n    ..aOB(9, _omitFieldNames ? '' : 'isPreview')\n    ..aInt64(10, _omitFieldNames ? '' : 'watchTimeLength')\n    ..aInt64(11, _omitFieldNames ? '' : 'durationMs')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayArc clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayArc copyWith(void Function(PlayArc) updates) =>\n      super.copyWith((message) => updates(message as PlayArc)) as PlayArc;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayArc create() => PlayArc._();\n  @$core.override\n  PlayArc createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayArc getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PlayArc>(create);\n  static PlayArc? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  BizType get videoType => $_getN(0);\n  @$pb.TagNumber(1)\n  set videoType(BizType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasVideoType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearVideoType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get aid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set aid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasAid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearAid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get cid => $_getI64(2);\n  @$pb.TagNumber(3)\n  set cid($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCid() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCid() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  DrmTechType get drmTechType => $_getN(3);\n  @$pb.TagNumber(4)\n  set drmTechType(DrmTechType value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasDrmTechType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearDrmTechType() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  ArcType get arcType => $_getN(4);\n  @$pb.TagNumber(5)\n  set arcType(ArcType value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasArcType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearArcType() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  Interaction get interaction => $_getN(5);\n  @$pb.TagNumber(6)\n  set interaction(Interaction value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasInteraction() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearInteraction() => $_clearField(6);\n  @$pb.TagNumber(6)\n  Interaction ensureInteraction() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  Dimension get dimension => $_getN(6);\n  @$pb.TagNumber(7)\n  set dimension(Dimension value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasDimension() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearDimension() => $_clearField(7);\n  @$pb.TagNumber(7)\n  Dimension ensureDimension() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  $fixnum.Int64 get duration => $_getI64(7);\n  @$pb.TagNumber(8)\n  set duration($fixnum.Int64 value) => $_setInt64(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasDuration() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearDuration() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.bool get isPreview => $_getBF(8);\n  @$pb.TagNumber(9)\n  set isPreview($core.bool value) => $_setBool(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasIsPreview() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearIsPreview() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $fixnum.Int64 get watchTimeLength => $_getI64(9);\n  @$pb.TagNumber(10)\n  set watchTimeLength($fixnum.Int64 value) => $_setInt64(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasWatchTimeLength() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearWatchTimeLength() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $fixnum.Int64 get durationMs => $_getI64(10);\n  @$pb.TagNumber(11)\n  set durationMs($fixnum.Int64 value) => $_setInt64(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasDurationMs() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearDurationMs() => $_clearField(11);\n}\n\nclass PlayArcConf extends $pb.GeneratedMessage {\n  factory PlayArcConf({\n    $core.Iterable<$core.MapEntry<$core.int, ArcConf>>? arcConfs,\n  }) {\n    final result = create();\n    if (arcConfs != null) result.arcConfs.addEntries(arcConfs);\n    return result;\n  }\n\n  PlayArcConf._();\n\n  factory PlayArcConf.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayArcConf.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayArcConf',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..m<$core.int, ArcConf>(1, _omitFieldNames ? '' : 'arcConfs',\n        entryClassName: 'PlayArcConf.ArcConfsEntry',\n        keyFieldType: $pb.PbFieldType.O3,\n        valueFieldType: $pb.PbFieldType.OM,\n        valueCreator: ArcConf.create,\n        valueDefaultOrMaker: ArcConf.getDefault,\n        packageName: const $pb.PackageName('bilibili.playershared'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayArcConf clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayArcConf copyWith(void Function(PlayArcConf) updates) =>\n      super.copyWith((message) => updates(message as PlayArcConf))\n          as PlayArcConf;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayArcConf create() => PlayArcConf._();\n  @$core.override\n  PlayArcConf createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayArcConf getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayArcConf>(create);\n  static PlayArcConf? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbMap<$core.int, ArcConf> get arcConfs => $_getMap(0);\n}\n\nclass PlayDeviceConf extends $pb.GeneratedMessage {\n  factory PlayDeviceConf({\n    $core.Iterable<$core.MapEntry<$core.int, DeviceConf>>? deviceConfs,\n  }) {\n    final result = create();\n    if (deviceConfs != null) result.deviceConfs.addEntries(deviceConfs);\n    return result;\n  }\n\n  PlayDeviceConf._();\n\n  factory PlayDeviceConf.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayDeviceConf.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayDeviceConf',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..m<$core.int, DeviceConf>(1, _omitFieldNames ? '' : 'deviceConfs',\n        entryClassName: 'PlayDeviceConf.DeviceConfsEntry',\n        keyFieldType: $pb.PbFieldType.O3,\n        valueFieldType: $pb.PbFieldType.OM,\n        valueCreator: DeviceConf.create,\n        valueDefaultOrMaker: DeviceConf.getDefault,\n        packageName: const $pb.PackageName('bilibili.playershared'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayDeviceConf clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayDeviceConf copyWith(void Function(PlayDeviceConf) updates) =>\n      super.copyWith((message) => updates(message as PlayDeviceConf))\n          as PlayDeviceConf;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayDeviceConf create() => PlayDeviceConf._();\n  @$core.override\n  PlayDeviceConf createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayDeviceConf getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayDeviceConf>(create);\n  static PlayDeviceConf? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbMap<$core.int, DeviceConf> get deviceConfs => $_getMap(0);\n}\n\nclass PlayList extends $pb.GeneratedMessage {\n  factory PlayList({\n    $fixnum.Int64? seasonId,\n    $core.String? title,\n    $core.String? cover,\n    $core.String? link,\n    BadgeInfo? badgeInfo,\n  }) {\n    final result = create();\n    if (seasonId != null) result.seasonId = seasonId;\n    if (title != null) result.title = title;\n    if (cover != null) result.cover = cover;\n    if (link != null) result.link = link;\n    if (badgeInfo != null) result.badgeInfo = badgeInfo;\n    return result;\n  }\n\n  PlayList._();\n\n  factory PlayList.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayList.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayList',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'seasonId')\n    ..aOS(2, _omitFieldNames ? '' : 'title')\n    ..aOS(3, _omitFieldNames ? '' : 'cover')\n    ..aOS(4, _omitFieldNames ? '' : 'link')\n    ..aOM<BadgeInfo>(5, _omitFieldNames ? '' : 'badgeInfo',\n        subBuilder: BadgeInfo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayList clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayList copyWith(void Function(PlayList) updates) =>\n      super.copyWith((message) => updates(message as PlayList)) as PlayList;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayList create() => PlayList._();\n  @$core.override\n  PlayList createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayList getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PlayList>(create);\n  static PlayList? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get seasonId => $_getI64(0);\n  @$pb.TagNumber(1)\n  set seasonId($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasSeasonId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearSeasonId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get title => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set title($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get cover => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set cover($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCover() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCover() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get link => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set link($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLink() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLink() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  BadgeInfo get badgeInfo => $_getN(4);\n  @$pb.TagNumber(5)\n  set badgeInfo(BadgeInfo value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBadgeInfo() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBadgeInfo() => $_clearField(5);\n  @$pb.TagNumber(5)\n  BadgeInfo ensureBadgeInfo() => $_ensure(4);\n}\n\nclass PlayListInfo extends $pb.GeneratedMessage {\n  factory PlayListInfo({\n    $core.Iterable<PlayList>? playList,\n  }) {\n    final result = create();\n    if (playList != null) result.playList.addAll(playList);\n    return result;\n  }\n\n  PlayListInfo._();\n\n  factory PlayListInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PlayListInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PlayListInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..pPM<PlayList>(2, _omitFieldNames ? '' : 'playList',\n        subBuilder: PlayList.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayListInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PlayListInfo copyWith(void Function(PlayListInfo) updates) =>\n      super.copyWith((message) => updates(message as PlayListInfo))\n          as PlayListInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PlayListInfo create() => PlayListInfo._();\n  @$core.override\n  PlayListInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PlayListInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<PlayListInfo>(create);\n  static PlayListInfo? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  $pb.PbList<PlayList> get playList => $_getList(0);\n}\n\nclass PromptBar extends $pb.GeneratedMessage {\n  factory PromptBar({\n    TextInfo? title,\n    TextInfo? subTitle,\n    $core.String? subTitleIcon,\n    $core.String? bgImage,\n    GradientColor? bgGradientColor,\n    $core.Iterable<ButtonInfo>? button,\n    Report? report,\n    $core.String? fullScreenIpIcon,\n    GradientColor? fullScreenBgGradientColor,\n    PromptBarType? promptBarType,\n    PromptBarStyle? promptBarStyle,\n    $core.Iterable<BenefitInfo>? benefitInfos,\n    $fixnum.Int64? endTime,\n    $core.int? showOnPaywall,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (subTitle != null) result.subTitle = subTitle;\n    if (subTitleIcon != null) result.subTitleIcon = subTitleIcon;\n    if (bgImage != null) result.bgImage = bgImage;\n    if (bgGradientColor != null) result.bgGradientColor = bgGradientColor;\n    if (button != null) result.button.addAll(button);\n    if (report != null) result.report = report;\n    if (fullScreenIpIcon != null) result.fullScreenIpIcon = fullScreenIpIcon;\n    if (fullScreenBgGradientColor != null)\n      result.fullScreenBgGradientColor = fullScreenBgGradientColor;\n    if (promptBarType != null) result.promptBarType = promptBarType;\n    if (promptBarStyle != null) result.promptBarStyle = promptBarStyle;\n    if (benefitInfos != null) result.benefitInfos.addAll(benefitInfos);\n    if (endTime != null) result.endTime = endTime;\n    if (showOnPaywall != null) result.showOnPaywall = showOnPaywall;\n    return result;\n  }\n\n  PromptBar._();\n\n  factory PromptBar.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory PromptBar.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'PromptBar',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOM<TextInfo>(1, _omitFieldNames ? '' : 'title',\n        subBuilder: TextInfo.create)\n    ..aOM<TextInfo>(2, _omitFieldNames ? '' : 'subTitle',\n        subBuilder: TextInfo.create)\n    ..aOS(3, _omitFieldNames ? '' : 'subTitleIcon')\n    ..aOS(4, _omitFieldNames ? '' : 'bgImage')\n    ..aOM<GradientColor>(5, _omitFieldNames ? '' : 'bgGradientColor',\n        subBuilder: GradientColor.create)\n    ..pPM<ButtonInfo>(6, _omitFieldNames ? '' : 'button',\n        subBuilder: ButtonInfo.create)\n    ..aOM<Report>(7, _omitFieldNames ? '' : 'report', subBuilder: Report.create)\n    ..aOS(8, _omitFieldNames ? '' : 'fullScreenIpIcon')\n    ..aOM<GradientColor>(9, _omitFieldNames ? '' : 'fullScreenBgGradientColor',\n        subBuilder: GradientColor.create)\n    ..aE<PromptBarType>(10, _omitFieldNames ? '' : 'promptBarType',\n        enumValues: PromptBarType.values)\n    ..aE<PromptBarStyle>(11, _omitFieldNames ? '' : 'promptBarStyle',\n        enumValues: PromptBarStyle.values)\n    ..pPM<BenefitInfo>(12, _omitFieldNames ? '' : 'benefitInfos',\n        subBuilder: BenefitInfo.create)\n    ..aInt64(13, _omitFieldNames ? '' : 'endTime')\n    ..aI(14, _omitFieldNames ? '' : 'showOnPaywall')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PromptBar clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  PromptBar copyWith(void Function(PromptBar) updates) =>\n      super.copyWith((message) => updates(message as PromptBar)) as PromptBar;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static PromptBar create() => PromptBar._();\n  @$core.override\n  PromptBar createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static PromptBar getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<PromptBar>(create);\n  static PromptBar? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  TextInfo get title => $_getN(0);\n  @$pb.TagNumber(1)\n  set title(TextInfo value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n  @$pb.TagNumber(1)\n  TextInfo ensureTitle() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  TextInfo get subTitle => $_getN(1);\n  @$pb.TagNumber(2)\n  set subTitle(TextInfo value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasSubTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearSubTitle() => $_clearField(2);\n  @$pb.TagNumber(2)\n  TextInfo ensureSubTitle() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $core.String get subTitleIcon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set subTitleIcon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSubTitleIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSubTitleIcon() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get bgImage => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set bgImage($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBgImage() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBgImage() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  GradientColor get bgGradientColor => $_getN(4);\n  @$pb.TagNumber(5)\n  set bgGradientColor(GradientColor value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBgGradientColor() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBgGradientColor() => $_clearField(5);\n  @$pb.TagNumber(5)\n  GradientColor ensureBgGradientColor() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $pb.PbList<ButtonInfo> get button => $_getList(5);\n\n  @$pb.TagNumber(7)\n  Report get report => $_getN(6);\n  @$pb.TagNumber(7)\n  set report(Report value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasReport() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearReport() => $_clearField(7);\n  @$pb.TagNumber(7)\n  Report ensureReport() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  $core.String get fullScreenIpIcon => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set fullScreenIpIcon($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasFullScreenIpIcon() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearFullScreenIpIcon() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  GradientColor get fullScreenBgGradientColor => $_getN(8);\n  @$pb.TagNumber(9)\n  set fullScreenBgGradientColor(GradientColor value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasFullScreenBgGradientColor() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearFullScreenBgGradientColor() => $_clearField(9);\n  @$pb.TagNumber(9)\n  GradientColor ensureFullScreenBgGradientColor() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  PromptBarType get promptBarType => $_getN(9);\n  @$pb.TagNumber(10)\n  set promptBarType(PromptBarType value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasPromptBarType() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearPromptBarType() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  PromptBarStyle get promptBarStyle => $_getN(10);\n  @$pb.TagNumber(11)\n  set promptBarStyle(PromptBarStyle value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasPromptBarStyle() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearPromptBarStyle() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $pb.PbList<BenefitInfo> get benefitInfos => $_getList(11);\n\n  @$pb.TagNumber(13)\n  $fixnum.Int64 get endTime => $_getI64(12);\n  @$pb.TagNumber(13)\n  set endTime($fixnum.Int64 value) => $_setInt64(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasEndTime() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearEndTime() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.int get showOnPaywall => $_getIZ(13);\n  @$pb.TagNumber(14)\n  set showOnPaywall($core.int value) => $_setSignedInt32(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasShowOnPaywall() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearShowOnPaywall() => $_clearField(14);\n}\n\nclass QnExp extends $pb.GeneratedMessage {\n  factory QnExp({\n    $core.bool? qnExp1,\n    $core.bool? qnExp2,\n  }) {\n    final result = create();\n    if (qnExp1 != null) result.qnExp1 = qnExp1;\n    if (qnExp2 != null) result.qnExp2 = qnExp2;\n    return result;\n  }\n\n  QnExp._();\n\n  factory QnExp.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory QnExp.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'QnExp',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'qnExp1')\n    ..aOB(2, _omitFieldNames ? '' : 'qnExp2')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QnExp clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QnExp copyWith(void Function(QnExp) updates) =>\n      super.copyWith((message) => updates(message as QnExp)) as QnExp;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static QnExp create() => QnExp._();\n  @$core.override\n  QnExp createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static QnExp getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<QnExp>(create);\n  static QnExp? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get qnExp1 => $_getBF(0);\n  @$pb.TagNumber(1)\n  set qnExp1($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasQnExp1() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearQnExp1() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.bool get qnExp2 => $_getBF(1);\n  @$pb.TagNumber(2)\n  set qnExp2($core.bool value) => $_setBool(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasQnExp2() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearQnExp2() => $_clearField(2);\n}\n\nclass QnTip extends $pb.GeneratedMessage {\n  factory QnTip({\n    $core.String? msg,\n  }) {\n    final result = create();\n    if (msg != null) result.msg = msg;\n    return result;\n  }\n\n  QnTip._();\n\n  factory QnTip.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory QnTip.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'QnTip',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'msg')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QnTip clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QnTip copyWith(void Function(QnTip) updates) =>\n      super.copyWith((message) => updates(message as QnTip)) as QnTip;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static QnTip create() => QnTip._();\n  @$core.override\n  QnTip createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static QnTip getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<QnTip>(create);\n  static QnTip? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get msg => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set msg($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMsg() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMsg() => $_clearField(1);\n}\n\nclass QnTrialInfo extends $pb.GeneratedMessage {\n  factory QnTrialInfo({\n    $core.bool? trialAble,\n    $core.int? remainingTimes,\n    $core.int? start,\n    $core.int? timeLength,\n    Toast? startToast,\n    Toast? endToast,\n    Button? qualityOpenTipBtn,\n    $core.int? trialQualityType,\n  }) {\n    final result = create();\n    if (trialAble != null) result.trialAble = trialAble;\n    if (remainingTimes != null) result.remainingTimes = remainingTimes;\n    if (start != null) result.start = start;\n    if (timeLength != null) result.timeLength = timeLength;\n    if (startToast != null) result.startToast = startToast;\n    if (endToast != null) result.endToast = endToast;\n    if (qualityOpenTipBtn != null) result.qualityOpenTipBtn = qualityOpenTipBtn;\n    if (trialQualityType != null) result.trialQualityType = trialQualityType;\n    return result;\n  }\n\n  QnTrialInfo._();\n\n  factory QnTrialInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory QnTrialInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'QnTrialInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'trialAble')\n    ..aI(2, _omitFieldNames ? '' : 'remainingTimes')\n    ..aI(3, _omitFieldNames ? '' : 'start')\n    ..aI(4, _omitFieldNames ? '' : 'timeLength')\n    ..aOM<Toast>(5, _omitFieldNames ? '' : 'startToast',\n        subBuilder: Toast.create)\n    ..aOM<Toast>(6, _omitFieldNames ? '' : 'endToast', subBuilder: Toast.create)\n    ..aOM<Button>(8, _omitFieldNames ? '' : 'qualityOpenTipBtn',\n        subBuilder: Button.create)\n    ..aI(9, _omitFieldNames ? '' : 'trialQualityType')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QnTrialInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QnTrialInfo copyWith(void Function(QnTrialInfo) updates) =>\n      super.copyWith((message) => updates(message as QnTrialInfo))\n          as QnTrialInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static QnTrialInfo create() => QnTrialInfo._();\n  @$core.override\n  QnTrialInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static QnTrialInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<QnTrialInfo>(create);\n  static QnTrialInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get trialAble => $_getBF(0);\n  @$pb.TagNumber(1)\n  set trialAble($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTrialAble() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTrialAble() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get remainingTimes => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set remainingTimes($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasRemainingTimes() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRemainingTimes() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.int get start => $_getIZ(2);\n  @$pb.TagNumber(3)\n  set start($core.int value) => $_setSignedInt32(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasStart() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearStart() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get timeLength => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set timeLength($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasTimeLength() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearTimeLength() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  Toast get startToast => $_getN(4);\n  @$pb.TagNumber(5)\n  set startToast(Toast value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasStartToast() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearStartToast() => $_clearField(5);\n  @$pb.TagNumber(5)\n  Toast ensureStartToast() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  Toast get endToast => $_getN(5);\n  @$pb.TagNumber(6)\n  set endToast(Toast value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasEndToast() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearEndToast() => $_clearField(6);\n  @$pb.TagNumber(6)\n  Toast ensureEndToast() => $_ensure(5);\n\n  @$pb.TagNumber(8)\n  Button get qualityOpenTipBtn => $_getN(6);\n  @$pb.TagNumber(8)\n  set qualityOpenTipBtn(Button value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasQualityOpenTipBtn() => $_has(6);\n  @$pb.TagNumber(8)\n  void clearQualityOpenTipBtn() => $_clearField(8);\n  @$pb.TagNumber(8)\n  Button ensureQualityOpenTipBtn() => $_ensure(6);\n\n  @$pb.TagNumber(9)\n  $core.int get trialQualityType => $_getIZ(7);\n  @$pb.TagNumber(9)\n  set trialQualityType($core.int value) => $_setSignedInt32(7, value);\n  @$pb.TagNumber(9)\n  $core.bool hasTrialQualityType() => $_has(7);\n  @$pb.TagNumber(9)\n  void clearTrialQualityType() => $_clearField(9);\n}\n\nclass QrCode extends $pb.GeneratedMessage {\n  factory QrCode({\n    $core.String? link,\n    $core.String? linkDesc,\n  }) {\n    final result = create();\n    if (link != null) result.link = link;\n    if (linkDesc != null) result.linkDesc = linkDesc;\n    return result;\n  }\n\n  QrCode._();\n\n  factory QrCode.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory QrCode.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'QrCode',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'link')\n    ..aOS(2, _omitFieldNames ? '' : 'linkDesc')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QrCode clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  QrCode copyWith(void Function(QrCode) updates) =>\n      super.copyWith((message) => updates(message as QrCode)) as QrCode;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static QrCode create() => QrCode._();\n  @$core.override\n  QrCode createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static QrCode getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<QrCode>(create);\n  static QrCode? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get link => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set link($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLink() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLink() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get linkDesc => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set linkDesc($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLinkDesc() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLinkDesc() => $_clearField(2);\n}\n\nclass Report extends $pb.GeneratedMessage {\n  factory Report({\n    $core.String? showEventId,\n    $core.String? clickEventId,\n    $core.String? extends_3,\n  }) {\n    final result = create();\n    if (showEventId != null) result.showEventId = showEventId;\n    if (clickEventId != null) result.clickEventId = clickEventId;\n    if (extends_3 != null) result.extends_3 = extends_3;\n    return result;\n  }\n\n  Report._();\n\n  factory Report.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Report.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Report',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'showEventId')\n    ..aOS(2, _omitFieldNames ? '' : 'clickEventId')\n    ..aOS(3, _omitFieldNames ? '' : 'extends')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Report clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Report copyWith(void Function(Report) updates) =>\n      super.copyWith((message) => updates(message as Report)) as Report;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Report create() => Report._();\n  @$core.override\n  Report createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Report getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Report>(create);\n  static Report? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get showEventId => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set showEventId($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasShowEventId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearShowEventId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get clickEventId => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set clickEventId($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasClickEventId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearClickEventId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get extends_3 => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set extends_3($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasExtends_3() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearExtends_3() => $_clearField(3);\n}\n\nclass ResidentBar extends $pb.GeneratedMessage {\n  factory ResidentBar({\n    $core.String? icon,\n    TextInfo? questionText,\n    ButtonInfo? button,\n    $core.String? link,\n    Report? report,\n    $core.String? bgImage,\n  }) {\n    final result = create();\n    if (icon != null) result.icon = icon;\n    if (questionText != null) result.questionText = questionText;\n    if (button != null) result.button = button;\n    if (link != null) result.link = link;\n    if (report != null) result.report = report;\n    if (bgImage != null) result.bgImage = bgImage;\n    return result;\n  }\n\n  ResidentBar._();\n\n  factory ResidentBar.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ResidentBar.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ResidentBar',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'icon')\n    ..aOM<TextInfo>(2, _omitFieldNames ? '' : 'questionText',\n        subBuilder: TextInfo.create)\n    ..aOM<ButtonInfo>(3, _omitFieldNames ? '' : 'button',\n        subBuilder: ButtonInfo.create)\n    ..aOS(4, _omitFieldNames ? '' : 'link')\n    ..aOM<Report>(5, _omitFieldNames ? '' : 'report', subBuilder: Report.create)\n    ..aOS(6, _omitFieldNames ? '' : 'bgImage')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ResidentBar clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ResidentBar copyWith(void Function(ResidentBar) updates) =>\n      super.copyWith((message) => updates(message as ResidentBar))\n          as ResidentBar;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ResidentBar create() => ResidentBar._();\n  @$core.override\n  ResidentBar createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ResidentBar getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ResidentBar>(create);\n  static ResidentBar? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get icon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set icon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  TextInfo get questionText => $_getN(1);\n  @$pb.TagNumber(2)\n  set questionText(TextInfo value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasQuestionText() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearQuestionText() => $_clearField(2);\n  @$pb.TagNumber(2)\n  TextInfo ensureQuestionText() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  ButtonInfo get button => $_getN(2);\n  @$pb.TagNumber(3)\n  set button(ButtonInfo value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasButton() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearButton() => $_clearField(3);\n  @$pb.TagNumber(3)\n  ButtonInfo ensureButton() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  $core.String get link => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set link($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasLink() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearLink() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  Report get report => $_getN(4);\n  @$pb.TagNumber(5)\n  set report(Report value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasReport() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearReport() => $_clearField(5);\n  @$pb.TagNumber(5)\n  Report ensureReport() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.String get bgImage => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set bgImage($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasBgImage() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearBgImage() => $_clearField(6);\n}\n\nclass ResponseDash extends $pb.GeneratedMessage {\n  factory ResponseDash({\n    $core.Iterable<DashItem>? video,\n    $core.Iterable<DashItem>? audio,\n  }) {\n    final result = create();\n    if (video != null) result.video.addAll(video);\n    if (audio != null) result.audio.addAll(audio);\n    return result;\n  }\n\n  ResponseDash._();\n\n  factory ResponseDash.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ResponseDash.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ResponseDash',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..pPM<DashItem>(1, _omitFieldNames ? '' : 'video',\n        subBuilder: DashItem.create)\n    ..pPM<DashItem>(2, _omitFieldNames ? '' : 'audio',\n        subBuilder: DashItem.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ResponseDash clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ResponseDash copyWith(void Function(ResponseDash) updates) =>\n      super.copyWith((message) => updates(message as ResponseDash))\n          as ResponseDash;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ResponseDash create() => ResponseDash._();\n  @$core.override\n  ResponseDash createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ResponseDash getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ResponseDash>(create);\n  static ResponseDash? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<DashItem> get video => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<DashItem> get audio => $_getList(1);\n}\n\nclass ResponseUrl extends $pb.GeneratedMessage {\n  factory ResponseUrl({\n    $core.int? order,\n    $fixnum.Int64? length,\n    $fixnum.Int64? size,\n    $core.String? url,\n    $core.Iterable<$core.String>? backupUrl,\n    $core.String? md5,\n  }) {\n    final result = create();\n    if (order != null) result.order = order;\n    if (length != null) result.length = length;\n    if (size != null) result.size = size;\n    if (url != null) result.url = url;\n    if (backupUrl != null) result.backupUrl.addAll(backupUrl);\n    if (md5 != null) result.md5 = md5;\n    return result;\n  }\n\n  ResponseUrl._();\n\n  factory ResponseUrl.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ResponseUrl.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ResponseUrl',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'order')\n    ..aInt64(2, _omitFieldNames ? '' : 'length')\n    ..aInt64(3, _omitFieldNames ? '' : 'size')\n    ..aOS(4, _omitFieldNames ? '' : 'url')\n    ..pPS(5, _omitFieldNames ? '' : 'backupUrl')\n    ..aOS(6, _omitFieldNames ? '' : 'md5')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ResponseUrl clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ResponseUrl copyWith(void Function(ResponseUrl) updates) =>\n      super.copyWith((message) => updates(message as ResponseUrl))\n          as ResponseUrl;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ResponseUrl create() => ResponseUrl._();\n  @$core.override\n  ResponseUrl createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ResponseUrl getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ResponseUrl>(create);\n  static ResponseUrl? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get order => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set order($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasOrder() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearOrder() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get length => $_getI64(1);\n  @$pb.TagNumber(2)\n  set length($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLength() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLength() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get size => $_getI64(2);\n  @$pb.TagNumber(3)\n  set size($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSize() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSize() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get url => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set url($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasUrl() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearUrl() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $pb.PbList<$core.String> get backupUrl => $_getList(4);\n\n  @$pb.TagNumber(6)\n  $core.String get md5 => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set md5($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasMd5() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearMd5() => $_clearField(6);\n}\n\nclass Scheme extends $pb.GeneratedMessage {\n  factory Scheme({\n    Scheme_ActionType? actionType,\n    $core.String? toast,\n  }) {\n    final result = create();\n    if (actionType != null) result.actionType = actionType;\n    if (toast != null) result.toast = toast;\n    return result;\n  }\n\n  Scheme._();\n\n  factory Scheme.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Scheme.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Scheme',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aE<Scheme_ActionType>(1, _omitFieldNames ? '' : 'actionType',\n        enumValues: Scheme_ActionType.values)\n    ..aOS(2, _omitFieldNames ? '' : 'toast')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Scheme clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Scheme copyWith(void Function(Scheme) updates) =>\n      super.copyWith((message) => updates(message as Scheme)) as Scheme;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Scheme create() => Scheme._();\n  @$core.override\n  Scheme createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Scheme getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Scheme>(create);\n  static Scheme? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Scheme_ActionType get actionType => $_getN(0);\n  @$pb.TagNumber(1)\n  set actionType(Scheme_ActionType value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasActionType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearActionType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get toast => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set toast($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasToast() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearToast() => $_clearField(2);\n}\n\nclass SegmentVideo extends $pb.GeneratedMessage {\n  factory SegmentVideo({\n    $core.Iterable<ResponseUrl>? segment,\n  }) {\n    final result = create();\n    if (segment != null) result.segment.addAll(segment);\n    return result;\n  }\n\n  SegmentVideo._();\n\n  factory SegmentVideo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SegmentVideo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SegmentVideo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..pPM<ResponseUrl>(1, _omitFieldNames ? '' : 'segment',\n        subBuilder: ResponseUrl.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SegmentVideo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SegmentVideo copyWith(void Function(SegmentVideo) updates) =>\n      super.copyWith((message) => updates(message as SegmentVideo))\n          as SegmentVideo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SegmentVideo create() => SegmentVideo._();\n  @$core.override\n  SegmentVideo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SegmentVideo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SegmentVideo>(create);\n  static SegmentVideo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<ResponseUrl> get segment => $_getList(0);\n}\n\nclass SettingBase extends $pb.GeneratedMessage {\n  factory SettingBase({\n    $core.String? leftIcon,\n    $core.String? leftTitle,\n    SettingItemType? type,\n    SettingControl? control,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? report,\n  }) {\n    final result = create();\n    if (leftIcon != null) result.leftIcon = leftIcon;\n    if (leftTitle != null) result.leftTitle = leftTitle;\n    if (type != null) result.type = type;\n    if (control != null) result.control = control;\n    if (report != null) result.report.addEntries(report);\n    return result;\n  }\n\n  SettingBase._();\n\n  factory SettingBase.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SettingBase.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SettingBase',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'leftIcon')\n    ..aOS(2, _omitFieldNames ? '' : 'leftTitle')\n    ..aE<SettingItemType>(3, _omitFieldNames ? '' : 'type',\n        enumValues: SettingItemType.values)\n    ..aOM<SettingControl>(4, _omitFieldNames ? '' : 'control',\n        subBuilder: SettingControl.create)\n    ..m<$core.String, $core.String>(5, _omitFieldNames ? '' : 'report',\n        entryClassName: 'SettingBase.ReportEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.playershared'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SettingBase clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SettingBase copyWith(void Function(SettingBase) updates) =>\n      super.copyWith((message) => updates(message as SettingBase))\n          as SettingBase;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SettingBase create() => SettingBase._();\n  @$core.override\n  SettingBase createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SettingBase getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SettingBase>(create);\n  static SettingBase? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get leftIcon => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set leftIcon($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasLeftIcon() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearLeftIcon() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get leftTitle => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set leftTitle($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasLeftTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearLeftTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  SettingItemType get type => $_getN(2);\n  @$pb.TagNumber(3)\n  set type(SettingItemType value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasType() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearType() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  SettingControl get control => $_getN(3);\n  @$pb.TagNumber(4)\n  set control(SettingControl value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasControl() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearControl() => $_clearField(4);\n  @$pb.TagNumber(4)\n  SettingControl ensureControl() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  $pb.PbMap<$core.String, $core.String> get report => $_getMap(4);\n}\n\nclass SettingControl extends $pb.GeneratedMessage {\n  factory SettingControl({\n    $core.bool? disabled,\n    $core.String? disabledReason,\n    $core.bool? disableGray,\n  }) {\n    final result = create();\n    if (disabled != null) result.disabled = disabled;\n    if (disabledReason != null) result.disabledReason = disabledReason;\n    if (disableGray != null) result.disableGray = disableGray;\n    return result;\n  }\n\n  SettingControl._();\n\n  factory SettingControl.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SettingControl.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SettingControl',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOB(1, _omitFieldNames ? '' : 'disabled')\n    ..aOS(2, _omitFieldNames ? '' : 'disabledReason')\n    ..aOB(3, _omitFieldNames ? '' : 'disableGray')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SettingControl clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SettingControl copyWith(void Function(SettingControl) updates) =>\n      super.copyWith((message) => updates(message as SettingControl))\n          as SettingControl;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SettingControl create() => SettingControl._();\n  @$core.override\n  SettingControl createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SettingControl getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SettingControl>(create);\n  static SettingControl? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.bool get disabled => $_getBF(0);\n  @$pb.TagNumber(1)\n  set disabled($core.bool value) => $_setBool(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasDisabled() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearDisabled() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get disabledReason => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set disabledReason($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDisabledReason() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDisabledReason() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get disableGray => $_getBF(2);\n  @$pb.TagNumber(3)\n  set disableGray($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDisableGray() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDisableGray() => $_clearField(3);\n}\n\nclass SettingGroup extends $pb.GeneratedMessage {\n  factory SettingGroup({\n    $core.String? title,\n    $core.Iterable<SettingItem>? items,\n    GroupStyle? groupStyle,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (items != null) result.items.addAll(items);\n    if (groupStyle != null) result.groupStyle = groupStyle;\n    return result;\n  }\n\n  SettingGroup._();\n\n  factory SettingGroup.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SettingGroup.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SettingGroup',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..pPM<SettingItem>(2, _omitFieldNames ? '' : 'items',\n        subBuilder: SettingItem.create)\n    ..aE<GroupStyle>(3, _omitFieldNames ? '' : 'groupStyle',\n        enumValues: GroupStyle.values)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SettingGroup clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SettingGroup copyWith(void Function(SettingGroup) updates) =>\n      super.copyWith((message) => updates(message as SettingGroup))\n          as SettingGroup;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SettingGroup create() => SettingGroup._();\n  @$core.override\n  SettingGroup createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SettingGroup getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SettingGroup>(create);\n  static SettingGroup? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $pb.PbList<SettingItem> get items => $_getList(1);\n\n  @$pb.TagNumber(3)\n  GroupStyle get groupStyle => $_getN(2);\n  @$pb.TagNumber(3)\n  set groupStyle(GroupStyle value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasGroupStyle() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearGroupStyle() => $_clearField(3);\n}\n\nenum SettingItem_Value { more, vertical, switch_5, notSet }\n\nclass SettingItem extends $pb.GeneratedMessage {\n  factory SettingItem({\n    SettingBase? base,\n    SettingItemStyle? style,\n    SettingMore? more,\n    SettingVertical? vertical,\n    SettingSwitch? switch_5,\n  }) {\n    final result = create();\n    if (base != null) result.base = base;\n    if (style != null) result.style = style;\n    if (more != null) result.more = more;\n    if (vertical != null) result.vertical = vertical;\n    if (switch_5 != null) result.switch_5 = switch_5;\n    return result;\n  }\n\n  SettingItem._();\n\n  factory SettingItem.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SettingItem.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, SettingItem_Value> _SettingItem_ValueByTag =\n      {\n    3: SettingItem_Value.more,\n    4: SettingItem_Value.vertical,\n    5: SettingItem_Value.switch_5,\n    0: SettingItem_Value.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SettingItem',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..oo(0, [3, 4, 5])\n    ..aOM<SettingBase>(1, _omitFieldNames ? '' : 'base',\n        subBuilder: SettingBase.create)\n    ..aE<SettingItemStyle>(2, _omitFieldNames ? '' : 'style',\n        enumValues: SettingItemStyle.values)\n    ..aOM<SettingMore>(3, _omitFieldNames ? '' : 'more',\n        subBuilder: SettingMore.create)\n    ..aOM<SettingVertical>(4, _omitFieldNames ? '' : 'vertical',\n        subBuilder: SettingVertical.create)\n    ..aOM<SettingSwitch>(5, _omitFieldNames ? '' : 'switch',\n        subBuilder: SettingSwitch.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SettingItem clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SettingItem copyWith(void Function(SettingItem) updates) =>\n      super.copyWith((message) => updates(message as SettingItem))\n          as SettingItem;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SettingItem create() => SettingItem._();\n  @$core.override\n  SettingItem createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SettingItem getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SettingItem>(create);\n  static SettingItem? _defaultInstance;\n\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  SettingItem_Value whichValue() => _SettingItem_ValueByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  @$pb.TagNumber(5)\n  void clearValue() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  SettingBase get base => $_getN(0);\n  @$pb.TagNumber(1)\n  set base(SettingBase value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBase() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBase() => $_clearField(1);\n  @$pb.TagNumber(1)\n  SettingBase ensureBase() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  SettingItemStyle get style => $_getN(1);\n  @$pb.TagNumber(2)\n  set style(SettingItemStyle value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasStyle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearStyle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  SettingMore get more => $_getN(2);\n  @$pb.TagNumber(3)\n  set more(SettingMore value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasMore() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearMore() => $_clearField(3);\n  @$pb.TagNumber(3)\n  SettingMore ensureMore() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  SettingVertical get vertical => $_getN(3);\n  @$pb.TagNumber(4)\n  set vertical(SettingVertical value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasVertical() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearVertical() => $_clearField(4);\n  @$pb.TagNumber(4)\n  SettingVertical ensureVertical() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  SettingSwitch get switch_5 => $_getN(4);\n  @$pb.TagNumber(5)\n  set switch_5(SettingSwitch value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasSwitch_5() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearSwitch_5() => $_clearField(5);\n  @$pb.TagNumber(5)\n  SettingSwitch ensureSwitch_5() => $_ensure(4);\n}\n\nclass SettingMore extends $pb.GeneratedMessage {\n  factory SettingMore({\n    $core.String? url,\n    $core.String? rightTitle,\n    $core.String? rightIcon,\n    SettingJumpType? jumpType,\n    $core.bool? needLogin,\n    Badge? badge,\n  }) {\n    final result = create();\n    if (url != null) result.url = url;\n    if (rightTitle != null) result.rightTitle = rightTitle;\n    if (rightIcon != null) result.rightIcon = rightIcon;\n    if (jumpType != null) result.jumpType = jumpType;\n    if (needLogin != null) result.needLogin = needLogin;\n    if (badge != null) result.badge = badge;\n    return result;\n  }\n\n  SettingMore._();\n\n  factory SettingMore.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SettingMore.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SettingMore',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'url')\n    ..aOS(2, _omitFieldNames ? '' : 'rightTitle')\n    ..aOS(3, _omitFieldNames ? '' : 'rightIcon')\n    ..aE<SettingJumpType>(4, _omitFieldNames ? '' : 'jumpType',\n        enumValues: SettingJumpType.values)\n    ..aOB(5, _omitFieldNames ? '' : 'needLogin')\n    ..aOM<Badge>(6, _omitFieldNames ? '' : 'badge', subBuilder: Badge.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SettingMore clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SettingMore copyWith(void Function(SettingMore) updates) =>\n      super.copyWith((message) => updates(message as SettingMore))\n          as SettingMore;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SettingMore create() => SettingMore._();\n  @$core.override\n  SettingMore createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SettingMore getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SettingMore>(create);\n  static SettingMore? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get url => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set url($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUrl() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get rightTitle => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set rightTitle($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasRightTitle() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearRightTitle() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get rightIcon => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set rightIcon($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasRightIcon() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearRightIcon() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  SettingJumpType get jumpType => $_getN(3);\n  @$pb.TagNumber(4)\n  set jumpType(SettingJumpType value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasJumpType() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearJumpType() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.bool get needLogin => $_getBF(4);\n  @$pb.TagNumber(5)\n  set needLogin($core.bool value) => $_setBool(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasNeedLogin() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearNeedLogin() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  Badge get badge => $_getN(5);\n  @$pb.TagNumber(6)\n  set badge(Badge value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasBadge() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearBadge() => $_clearField(6);\n  @$pb.TagNumber(6)\n  Badge ensureBadge() => $_ensure(5);\n}\n\nclass SettingSwitch extends $pb.GeneratedMessage {\n  factory SettingSwitch({\n    Badge? badge,\n  }) {\n    final result = create();\n    if (badge != null) result.badge = badge;\n    return result;\n  }\n\n  SettingSwitch._();\n\n  factory SettingSwitch.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SettingSwitch.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SettingSwitch',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOM<Badge>(1, _omitFieldNames ? '' : 'badge', subBuilder: Badge.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SettingSwitch clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SettingSwitch copyWith(void Function(SettingSwitch) updates) =>\n      super.copyWith((message) => updates(message as SettingSwitch))\n          as SettingSwitch;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SettingSwitch create() => SettingSwitch._();\n  @$core.override\n  SettingSwitch createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SettingSwitch getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SettingSwitch>(create);\n  static SettingSwitch? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  Badge get badge => $_getN(0);\n  @$pb.TagNumber(1)\n  set badge(Badge value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasBadge() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearBadge() => $_clearField(1);\n  @$pb.TagNumber(1)\n  Badge ensureBadge() => $_ensure(0);\n}\n\nclass SettingVertical extends $pb.GeneratedMessage {\n  factory SettingVertical({\n    $core.String? url,\n    SettingJumpType? jumpType,\n    $core.bool? needLogin,\n    Badge? badge,\n  }) {\n    final result = create();\n    if (url != null) result.url = url;\n    if (jumpType != null) result.jumpType = jumpType;\n    if (needLogin != null) result.needLogin = needLogin;\n    if (badge != null) result.badge = badge;\n    return result;\n  }\n\n  SettingVertical._();\n\n  factory SettingVertical.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SettingVertical.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SettingVertical',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'url')\n    ..aE<SettingJumpType>(2, _omitFieldNames ? '' : 'jumpType',\n        enumValues: SettingJumpType.values)\n    ..aOB(3, _omitFieldNames ? '' : 'needLogin')\n    ..aOM<Badge>(4, _omitFieldNames ? '' : 'badge', subBuilder: Badge.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SettingVertical clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SettingVertical copyWith(void Function(SettingVertical) updates) =>\n      super.copyWith((message) => updates(message as SettingVertical))\n          as SettingVertical;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SettingVertical create() => SettingVertical._();\n  @$core.override\n  SettingVertical createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SettingVertical getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SettingVertical>(create);\n  static SettingVertical? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get url => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set url($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasUrl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearUrl() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  SettingJumpType get jumpType => $_getN(1);\n  @$pb.TagNumber(2)\n  set jumpType(SettingJumpType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasJumpType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearJumpType() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.bool get needLogin => $_getBF(2);\n  @$pb.TagNumber(3)\n  set needLogin($core.bool value) => $_setBool(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasNeedLogin() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearNeedLogin() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  Badge get badge => $_getN(3);\n  @$pb.TagNumber(4)\n  set badge(Badge value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasBadge() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearBadge() => $_clearField(4);\n  @$pb.TagNumber(4)\n  Badge ensureBadge() => $_ensure(3);\n}\n\nclass Shake extends $pb.GeneratedMessage {\n  factory Shake({\n    $core.String? file,\n  }) {\n    final result = create();\n    if (file != null) result.file = file;\n    return result;\n  }\n\n  Shake._();\n\n  factory Shake.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Shake.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Shake',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'file')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Shake clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Shake copyWith(void Function(Shake) updates) =>\n      super.copyWith((message) => updates(message as Shake)) as Shake;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Shake create() => Shake._();\n  @$core.override\n  Shake createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Shake getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Shake>(create);\n  static Shake? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get file => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set file($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasFile() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearFile() => $_clearField(1);\n}\n\nenum Stream_Content { dashVideo, segmentVideo, multiDashVideo, notSet }\n\nclass Stream extends $pb.GeneratedMessage {\n  factory Stream({\n    StreamInfo? streamInfo,\n    DashVideo? dashVideo,\n    SegmentVideo? segmentVideo,\n    MultiDashVideo? multiDashVideo,\n  }) {\n    final result = create();\n    if (streamInfo != null) result.streamInfo = streamInfo;\n    if (dashVideo != null) result.dashVideo = dashVideo;\n    if (segmentVideo != null) result.segmentVideo = segmentVideo;\n    if (multiDashVideo != null) result.multiDashVideo = multiDashVideo;\n    return result;\n  }\n\n  Stream._();\n\n  factory Stream.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Stream.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static const $core.Map<$core.int, Stream_Content> _Stream_ContentByTag = {\n    2: Stream_Content.dashVideo,\n    3: Stream_Content.segmentVideo,\n    4: Stream_Content.multiDashVideo,\n    0: Stream_Content.notSet\n  };\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Stream',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..oo(0, [2, 3, 4])\n    ..aOM<StreamInfo>(1, _omitFieldNames ? '' : 'streamInfo',\n        subBuilder: StreamInfo.create)\n    ..aOM<DashVideo>(2, _omitFieldNames ? '' : 'dashVideo',\n        subBuilder: DashVideo.create)\n    ..aOM<SegmentVideo>(3, _omitFieldNames ? '' : 'segmentVideo',\n        subBuilder: SegmentVideo.create)\n    ..aOM<MultiDashVideo>(4, _omitFieldNames ? '' : 'multiDashVideo',\n        subBuilder: MultiDashVideo.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Stream clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Stream copyWith(void Function(Stream) updates) =>\n      super.copyWith((message) => updates(message as Stream)) as Stream;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Stream create() => Stream._();\n  @$core.override\n  Stream createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Stream getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Stream>(create);\n  static Stream? _defaultInstance;\n\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  Stream_Content whichContent() => _Stream_ContentByTag[$_whichOneof(0)]!;\n  @$pb.TagNumber(2)\n  @$pb.TagNumber(3)\n  @$pb.TagNumber(4)\n  void clearContent() => $_clearField($_whichOneof(0));\n\n  @$pb.TagNumber(1)\n  StreamInfo get streamInfo => $_getN(0);\n  @$pb.TagNumber(1)\n  set streamInfo(StreamInfo value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStreamInfo() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStreamInfo() => $_clearField(1);\n  @$pb.TagNumber(1)\n  StreamInfo ensureStreamInfo() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  DashVideo get dashVideo => $_getN(1);\n  @$pb.TagNumber(2)\n  set dashVideo(DashVideo value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDashVideo() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDashVideo() => $_clearField(2);\n  @$pb.TagNumber(2)\n  DashVideo ensureDashVideo() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  SegmentVideo get segmentVideo => $_getN(2);\n  @$pb.TagNumber(3)\n  set segmentVideo(SegmentVideo value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasSegmentVideo() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearSegmentVideo() => $_clearField(3);\n  @$pb.TagNumber(3)\n  SegmentVideo ensureSegmentVideo() => $_ensure(2);\n\n  @$pb.TagNumber(4)\n  MultiDashVideo get multiDashVideo => $_getN(3);\n  @$pb.TagNumber(4)\n  set multiDashVideo(MultiDashVideo value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasMultiDashVideo() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearMultiDashVideo() => $_clearField(4);\n  @$pb.TagNumber(4)\n  MultiDashVideo ensureMultiDashVideo() => $_ensure(3);\n}\n\nclass StreamInfo extends $pb.GeneratedMessage {\n  factory StreamInfo({\n    $core.int? quality,\n    $core.String? format,\n    $core.String? description,\n    PlayErr? errCode,\n    StreamLimit? limit,\n    $core.bool? needVip,\n    $core.bool? needLogin,\n    $core.bool? intact,\n    $core.bool? noRexcode,\n    $fixnum.Int64? attribute,\n    $core.String? newDescription,\n    $core.String? displayDesc,\n    $core.String? superscript,\n    $core.bool? vipFree,\n    $core.String? subtitle,\n    Scheme? scheme,\n    $core.bool? supportDrm,\n  }) {\n    final result = create();\n    if (quality != null) result.quality = quality;\n    if (format != null) result.format = format;\n    if (description != null) result.description = description;\n    if (errCode != null) result.errCode = errCode;\n    if (limit != null) result.limit = limit;\n    if (needVip != null) result.needVip = needVip;\n    if (needLogin != null) result.needLogin = needLogin;\n    if (intact != null) result.intact = intact;\n    if (noRexcode != null) result.noRexcode = noRexcode;\n    if (attribute != null) result.attribute = attribute;\n    if (newDescription != null) result.newDescription = newDescription;\n    if (displayDesc != null) result.displayDesc = displayDesc;\n    if (superscript != null) result.superscript = superscript;\n    if (vipFree != null) result.vipFree = vipFree;\n    if (subtitle != null) result.subtitle = subtitle;\n    if (scheme != null) result.scheme = scheme;\n    if (supportDrm != null) result.supportDrm = supportDrm;\n    return result;\n  }\n\n  StreamInfo._();\n\n  factory StreamInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory StreamInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'StreamInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'quality')\n    ..aOS(2, _omitFieldNames ? '' : 'format')\n    ..aOS(3, _omitFieldNames ? '' : 'description')\n    ..aE<PlayErr>(4, _omitFieldNames ? '' : 'errCode',\n        enumValues: PlayErr.values)\n    ..aOM<StreamLimit>(5, _omitFieldNames ? '' : 'limit',\n        subBuilder: StreamLimit.create)\n    ..aOB(6, _omitFieldNames ? '' : 'needVip')\n    ..aOB(7, _omitFieldNames ? '' : 'needLogin')\n    ..aOB(8, _omitFieldNames ? '' : 'intact')\n    ..aOB(9, _omitFieldNames ? '' : 'noRexcode')\n    ..aInt64(10, _omitFieldNames ? '' : 'attribute')\n    ..aOS(11, _omitFieldNames ? '' : 'newDescription')\n    ..aOS(12, _omitFieldNames ? '' : 'displayDesc')\n    ..aOS(13, _omitFieldNames ? '' : 'superscript')\n    ..aOB(14, _omitFieldNames ? '' : 'vipFree')\n    ..aOS(15, _omitFieldNames ? '' : 'subtitle')\n    ..aOM<Scheme>(16, _omitFieldNames ? '' : 'scheme',\n        subBuilder: Scheme.create)\n    ..aOB(17, _omitFieldNames ? '' : 'supportDrm')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StreamInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StreamInfo copyWith(void Function(StreamInfo) updates) =>\n      super.copyWith((message) => updates(message as StreamInfo)) as StreamInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static StreamInfo create() => StreamInfo._();\n  @$core.override\n  StreamInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static StreamInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<StreamInfo>(create);\n  static StreamInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get quality => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set quality($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasQuality() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearQuality() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get format => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set format($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFormat() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFormat() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get description => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set description($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasDescription() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearDescription() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  PlayErr get errCode => $_getN(3);\n  @$pb.TagNumber(4)\n  set errCode(PlayErr value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasErrCode() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearErrCode() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  StreamLimit get limit => $_getN(4);\n  @$pb.TagNumber(5)\n  set limit(StreamLimit value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasLimit() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearLimit() => $_clearField(5);\n  @$pb.TagNumber(5)\n  StreamLimit ensureLimit() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.bool get needVip => $_getBF(5);\n  @$pb.TagNumber(6)\n  set needVip($core.bool value) => $_setBool(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasNeedVip() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearNeedVip() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.bool get needLogin => $_getBF(6);\n  @$pb.TagNumber(7)\n  set needLogin($core.bool value) => $_setBool(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasNeedLogin() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearNeedLogin() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.bool get intact => $_getBF(7);\n  @$pb.TagNumber(8)\n  set intact($core.bool value) => $_setBool(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasIntact() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearIntact() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.bool get noRexcode => $_getBF(8);\n  @$pb.TagNumber(9)\n  set noRexcode($core.bool value) => $_setBool(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasNoRexcode() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearNoRexcode() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $fixnum.Int64 get attribute => $_getI64(9);\n  @$pb.TagNumber(10)\n  set attribute($fixnum.Int64 value) => $_setInt64(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasAttribute() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearAttribute() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.String get newDescription => $_getSZ(10);\n  @$pb.TagNumber(11)\n  set newDescription($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasNewDescription() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearNewDescription() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  $core.String get displayDesc => $_getSZ(11);\n  @$pb.TagNumber(12)\n  set displayDesc($core.String value) => $_setString(11, value);\n  @$pb.TagNumber(12)\n  $core.bool hasDisplayDesc() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearDisplayDesc() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $core.String get superscript => $_getSZ(12);\n  @$pb.TagNumber(13)\n  set superscript($core.String value) => $_setString(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasSuperscript() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearSuperscript() => $_clearField(13);\n\n  @$pb.TagNumber(14)\n  $core.bool get vipFree => $_getBF(13);\n  @$pb.TagNumber(14)\n  set vipFree($core.bool value) => $_setBool(13, value);\n  @$pb.TagNumber(14)\n  $core.bool hasVipFree() => $_has(13);\n  @$pb.TagNumber(14)\n  void clearVipFree() => $_clearField(14);\n\n  @$pb.TagNumber(15)\n  $core.String get subtitle => $_getSZ(14);\n  @$pb.TagNumber(15)\n  set subtitle($core.String value) => $_setString(14, value);\n  @$pb.TagNumber(15)\n  $core.bool hasSubtitle() => $_has(14);\n  @$pb.TagNumber(15)\n  void clearSubtitle() => $_clearField(15);\n\n  @$pb.TagNumber(16)\n  Scheme get scheme => $_getN(15);\n  @$pb.TagNumber(16)\n  set scheme(Scheme value) => $_setField(16, value);\n  @$pb.TagNumber(16)\n  $core.bool hasScheme() => $_has(15);\n  @$pb.TagNumber(16)\n  void clearScheme() => $_clearField(16);\n  @$pb.TagNumber(16)\n  Scheme ensureScheme() => $_ensure(15);\n\n  @$pb.TagNumber(17)\n  $core.bool get supportDrm => $_getBF(16);\n  @$pb.TagNumber(17)\n  set supportDrm($core.bool value) => $_setBool(16, value);\n  @$pb.TagNumber(17)\n  $core.bool hasSupportDrm() => $_has(16);\n  @$pb.TagNumber(17)\n  void clearSupportDrm() => $_clearField(17);\n}\n\nclass StreamLimit extends $pb.GeneratedMessage {\n  factory StreamLimit({\n    $core.String? title,\n    $core.String? uri,\n    $core.String? msg,\n  }) {\n    final result = create();\n    if (title != null) result.title = title;\n    if (uri != null) result.uri = uri;\n    if (msg != null) result.msg = msg;\n    return result;\n  }\n\n  StreamLimit._();\n\n  factory StreamLimit.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory StreamLimit.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'StreamLimit',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'title')\n    ..aOS(2, _omitFieldNames ? '' : 'uri')\n    ..aOS(3, _omitFieldNames ? '' : 'msg')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StreamLimit clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  StreamLimit copyWith(void Function(StreamLimit) updates) =>\n      super.copyWith((message) => updates(message as StreamLimit))\n          as StreamLimit;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static StreamLimit create() => StreamLimit._();\n  @$core.override\n  StreamLimit createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static StreamLimit getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<StreamLimit>(create);\n  static StreamLimit? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get title => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set title($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTitle() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTitle() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get uri => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set uri($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUri() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUri() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get msg => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set msg($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasMsg() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearMsg() => $_clearField(3);\n}\n\nclass TaskParam extends $pb.GeneratedMessage {\n  factory TaskParam({\n    $core.String? taskType,\n    $fixnum.Int64? activityId,\n    $fixnum.Int64? tipsId,\n  }) {\n    final result = create();\n    if (taskType != null) result.taskType = taskType;\n    if (activityId != null) result.activityId = activityId;\n    if (tipsId != null) result.tipsId = tipsId;\n    return result;\n  }\n\n  TaskParam._();\n\n  factory TaskParam.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TaskParam.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TaskParam',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'taskType')\n    ..aInt64(2, _omitFieldNames ? '' : 'activityId')\n    ..aInt64(3, _omitFieldNames ? '' : 'tipsId')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TaskParam clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TaskParam copyWith(void Function(TaskParam) updates) =>\n      super.copyWith((message) => updates(message as TaskParam)) as TaskParam;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TaskParam create() => TaskParam._();\n  @$core.override\n  TaskParam createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TaskParam getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TaskParam>(create);\n  static TaskParam? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get taskType => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set taskType($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasTaskType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearTaskType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get activityId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set activityId($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasActivityId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearActivityId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get tipsId => $_getI64(2);\n  @$pb.TagNumber(3)\n  set tipsId($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTipsId() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTipsId() => $_clearField(3);\n}\n\nclass TextInfo extends $pb.GeneratedMessage {\n  factory TextInfo({\n    $core.String? text,\n    $core.String? textColor,\n    $core.String? textColorNight,\n    $core.int? fontSize,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (textColor != null) result.textColor = textColor;\n    if (textColorNight != null) result.textColorNight = textColorNight;\n    if (fontSize != null) result.fontSize = fontSize;\n    return result;\n  }\n\n  TextInfo._();\n\n  factory TextInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory TextInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'TextInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aOS(2, _omitFieldNames ? '' : 'textColor')\n    ..aOS(3, _omitFieldNames ? '' : 'textColorNight')\n    ..aI(4, _omitFieldNames ? '' : 'fontSize')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TextInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  TextInfo copyWith(void Function(TextInfo) updates) =>\n      super.copyWith((message) => updates(message as TextInfo)) as TextInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static TextInfo create() => TextInfo._();\n  @$core.override\n  TextInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static TextInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TextInfo>(create);\n  static TextInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get textColor => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set textColor($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasTextColor() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearTextColor() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get textColorNight => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set textColorNight($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTextColorNight() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTextColorNight() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get fontSize => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set fontSize($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFontSize() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFontSize() => $_clearField(4);\n}\n\nclass Toast extends $pb.GeneratedMessage {\n  factory Toast({\n    $core.String? text,\n    Button? button,\n  }) {\n    final result = create();\n    if (text != null) result.text = text;\n    if (button != null) result.button = button;\n    return result;\n  }\n\n  Toast._();\n\n  factory Toast.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Toast.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Toast',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'text')\n    ..aOM<Button>(2, _omitFieldNames ? '' : 'button', subBuilder: Button.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Toast clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Toast copyWith(void Function(Toast) updates) =>\n      super.copyWith((message) => updates(message as Toast)) as Toast;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Toast create() => Toast._();\n  @$core.override\n  Toast createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Toast getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Toast>(create);\n  static Toast? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get text => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set text($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasText() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearText() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  Button get button => $_getN(1);\n  @$pb.TagNumber(2)\n  set button(Button value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasButton() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearButton() => $_clearField(2);\n  @$pb.TagNumber(2)\n  Button ensureButton() => $_ensure(1);\n}\n\nclass VideoCtrl extends $pb.GeneratedMessage {\n  factory VideoCtrl({\n    AutoQnCtl? autoQnCtl,\n    QnExp? qnExp,\n  }) {\n    final result = create();\n    if (autoQnCtl != null) result.autoQnCtl = autoQnCtl;\n    if (qnExp != null) result.qnExp = qnExp;\n    return result;\n  }\n\n  VideoCtrl._();\n\n  factory VideoCtrl.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory VideoCtrl.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'VideoCtrl',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aOM<AutoQnCtl>(1, _omitFieldNames ? '' : 'autoQnCtl',\n        subBuilder: AutoQnCtl.create)\n    ..aOM<QnExp>(2, _omitFieldNames ? '' : 'qnExp', subBuilder: QnExp.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VideoCtrl clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VideoCtrl copyWith(void Function(VideoCtrl) updates) =>\n      super.copyWith((message) => updates(message as VideoCtrl)) as VideoCtrl;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static VideoCtrl create() => VideoCtrl._();\n  @$core.override\n  VideoCtrl createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static VideoCtrl getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<VideoCtrl>(create);\n  static VideoCtrl? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  AutoQnCtl get autoQnCtl => $_getN(0);\n  @$pb.TagNumber(1)\n  set autoQnCtl(AutoQnCtl value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAutoQnCtl() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAutoQnCtl() => $_clearField(1);\n  @$pb.TagNumber(1)\n  AutoQnCtl ensureAutoQnCtl() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  QnExp get qnExp => $_getN(1);\n  @$pb.TagNumber(2)\n  set qnExp(QnExp value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasQnExp() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearQnExp() => $_clearField(2);\n  @$pb.TagNumber(2)\n  QnExp ensureQnExp() => $_ensure(1);\n}\n\nclass VideoVod extends $pb.GeneratedMessage {\n  factory VideoVod({\n    $fixnum.Int64? aid,\n    $fixnum.Int64? cid,\n    $fixnum.Int64? qn,\n    $core.int? fnver,\n    $core.int? fnval,\n    $core.int? download,\n    $core.int? forceHost,\n    $core.bool? fourk,\n    CodeType? preferCodecType,\n    $fixnum.Int64? voiceBalance,\n    $core.bool? isNeedTrial,\n    QnPolicy? qnPolicy,\n    $fixnum.Int64? softFnval,\n  }) {\n    final result = create();\n    if (aid != null) result.aid = aid;\n    if (cid != null) result.cid = cid;\n    if (qn != null) result.qn = qn;\n    if (fnver != null) result.fnver = fnver;\n    if (fnval != null) result.fnval = fnval;\n    if (download != null) result.download = download;\n    if (forceHost != null) result.forceHost = forceHost;\n    if (fourk != null) result.fourk = fourk;\n    if (preferCodecType != null) result.preferCodecType = preferCodecType;\n    if (voiceBalance != null) result.voiceBalance = voiceBalance;\n    if (isNeedTrial != null) result.isNeedTrial = isNeedTrial;\n    if (qnPolicy != null) result.qnPolicy = qnPolicy;\n    if (softFnval != null) result.softFnval = softFnval;\n    return result;\n  }\n\n  VideoVod._();\n\n  factory VideoVod.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory VideoVod.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'VideoVod',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'aid')\n    ..aInt64(2, _omitFieldNames ? '' : 'cid')\n    ..aInt64(3, _omitFieldNames ? '' : 'qn')\n    ..aI(4, _omitFieldNames ? '' : 'fnver')\n    ..aI(5, _omitFieldNames ? '' : 'fnval')\n    ..aI(6, _omitFieldNames ? '' : 'download')\n    ..aI(7, _omitFieldNames ? '' : 'forceHost')\n    ..aOB(8, _omitFieldNames ? '' : 'fourk')\n    ..aE<CodeType>(9, _omitFieldNames ? '' : 'preferCodecType',\n        enumValues: CodeType.values)\n    ..aInt64(10, _omitFieldNames ? '' : 'voiceBalance')\n    ..aOB(11, _omitFieldNames ? '' : 'isNeedTrial')\n    ..aE<QnPolicy>(12, _omitFieldNames ? '' : 'qnPolicy',\n        enumValues: QnPolicy.values)\n    ..aInt64(13, _omitFieldNames ? '' : 'softFnval')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VideoVod clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VideoVod copyWith(void Function(VideoVod) updates) =>\n      super.copyWith((message) => updates(message as VideoVod)) as VideoVod;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static VideoVod create() => VideoVod._();\n  @$core.override\n  VideoVod createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static VideoVod getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<VideoVod>(create);\n  static VideoVod? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get aid => $_getI64(0);\n  @$pb.TagNumber(1)\n  set aid($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasAid() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearAid() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get cid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set cid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get qn => $_getI64(2);\n  @$pb.TagNumber(3)\n  set qn($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasQn() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearQn() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get fnver => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set fnver($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasFnver() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearFnver() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.int get fnval => $_getIZ(4);\n  @$pb.TagNumber(5)\n  set fnval($core.int value) => $_setSignedInt32(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasFnval() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearFnval() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.int get download => $_getIZ(5);\n  @$pb.TagNumber(6)\n  set download($core.int value) => $_setSignedInt32(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasDownload() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearDownload() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.int get forceHost => $_getIZ(6);\n  @$pb.TagNumber(7)\n  set forceHost($core.int value) => $_setSignedInt32(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasForceHost() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearForceHost() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.bool get fourk => $_getBF(7);\n  @$pb.TagNumber(8)\n  set fourk($core.bool value) => $_setBool(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasFourk() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearFourk() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  CodeType get preferCodecType => $_getN(8);\n  @$pb.TagNumber(9)\n  set preferCodecType(CodeType value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasPreferCodecType() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearPreferCodecType() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $fixnum.Int64 get voiceBalance => $_getI64(9);\n  @$pb.TagNumber(10)\n  set voiceBalance($fixnum.Int64 value) => $_setInt64(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasVoiceBalance() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearVoiceBalance() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  $core.bool get isNeedTrial => $_getBF(10);\n  @$pb.TagNumber(11)\n  set isNeedTrial($core.bool value) => $_setBool(10, value);\n  @$pb.TagNumber(11)\n  $core.bool hasIsNeedTrial() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearIsNeedTrial() => $_clearField(11);\n\n  @$pb.TagNumber(12)\n  QnPolicy get qnPolicy => $_getN(11);\n  @$pb.TagNumber(12)\n  set qnPolicy(QnPolicy value) => $_setField(12, value);\n  @$pb.TagNumber(12)\n  $core.bool hasQnPolicy() => $_has(11);\n  @$pb.TagNumber(12)\n  void clearQnPolicy() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $fixnum.Int64 get softFnval => $_getI64(12);\n  @$pb.TagNumber(13)\n  set softFnval($fixnum.Int64 value) => $_setInt64(12, value);\n  @$pb.TagNumber(13)\n  $core.bool hasSoftFnval() => $_has(12);\n  @$pb.TagNumber(13)\n  void clearSoftFnval() => $_clearField(13);\n}\n\nclass ViewInfo extends $pb.GeneratedMessage {\n  factory ViewInfo({\n    $core.Iterable<$core.MapEntry<$core.String, Dialog>>? dialogMap,\n    PromptBar? promptBar,\n    $core.Iterable<ComprehensiveToast>? toasts,\n    PayWallOnshowAction? payWallOnshowAction,\n    ExpSwitch? expSwitch,\n    FullPromptBar? fullPromptBar,\n    ResidentBar? residentBar,\n  }) {\n    final result = create();\n    if (dialogMap != null) result.dialogMap.addEntries(dialogMap);\n    if (promptBar != null) result.promptBar = promptBar;\n    if (toasts != null) result.toasts.addAll(toasts);\n    if (payWallOnshowAction != null)\n      result.payWallOnshowAction = payWallOnshowAction;\n    if (expSwitch != null) result.expSwitch = expSwitch;\n    if (fullPromptBar != null) result.fullPromptBar = fullPromptBar;\n    if (residentBar != null) result.residentBar = residentBar;\n    return result;\n  }\n\n  ViewInfo._();\n\n  factory ViewInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ViewInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ViewInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..m<$core.String, Dialog>(1, _omitFieldNames ? '' : 'dialogMap',\n        entryClassName: 'ViewInfo.DialogMapEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OM,\n        valueCreator: Dialog.create,\n        valueDefaultOrMaker: Dialog.getDefault,\n        packageName: const $pb.PackageName('bilibili.playershared'))\n    ..aOM<PromptBar>(2, _omitFieldNames ? '' : 'promptBar',\n        subBuilder: PromptBar.create)\n    ..pPM<ComprehensiveToast>(3, _omitFieldNames ? '' : 'toasts',\n        subBuilder: ComprehensiveToast.create)\n    ..aOM<PayWallOnshowAction>(4, _omitFieldNames ? '' : 'payWallOnshowAction',\n        subBuilder: PayWallOnshowAction.create)\n    ..aOM<ExpSwitch>(5, _omitFieldNames ? '' : 'expSwitch',\n        subBuilder: ExpSwitch.create)\n    ..aOM<FullPromptBar>(6, _omitFieldNames ? '' : 'fullPromptBar',\n        subBuilder: FullPromptBar.create)\n    ..aOM<ResidentBar>(7, _omitFieldNames ? '' : 'residentBar',\n        subBuilder: ResidentBar.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ViewInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ViewInfo copyWith(void Function(ViewInfo) updates) =>\n      super.copyWith((message) => updates(message as ViewInfo)) as ViewInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ViewInfo create() => ViewInfo._();\n  @$core.override\n  ViewInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ViewInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ViewInfo>(create);\n  static ViewInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbMap<$core.String, Dialog> get dialogMap => $_getMap(0);\n\n  @$pb.TagNumber(2)\n  PromptBar get promptBar => $_getN(1);\n  @$pb.TagNumber(2)\n  set promptBar(PromptBar value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasPromptBar() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearPromptBar() => $_clearField(2);\n  @$pb.TagNumber(2)\n  PromptBar ensurePromptBar() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<ComprehensiveToast> get toasts => $_getList(2);\n\n  @$pb.TagNumber(4)\n  PayWallOnshowAction get payWallOnshowAction => $_getN(3);\n  @$pb.TagNumber(4)\n  set payWallOnshowAction(PayWallOnshowAction value) => $_setField(4, value);\n  @$pb.TagNumber(4)\n  $core.bool hasPayWallOnshowAction() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearPayWallOnshowAction() => $_clearField(4);\n  @$pb.TagNumber(4)\n  PayWallOnshowAction ensurePayWallOnshowAction() => $_ensure(3);\n\n  @$pb.TagNumber(5)\n  ExpSwitch get expSwitch => $_getN(4);\n  @$pb.TagNumber(5)\n  set expSwitch(ExpSwitch value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasExpSwitch() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearExpSwitch() => $_clearField(5);\n  @$pb.TagNumber(5)\n  ExpSwitch ensureExpSwitch() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  FullPromptBar get fullPromptBar => $_getN(5);\n  @$pb.TagNumber(6)\n  set fullPromptBar(FullPromptBar value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasFullPromptBar() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearFullPromptBar() => $_clearField(6);\n  @$pb.TagNumber(6)\n  FullPromptBar ensureFullPromptBar() => $_ensure(5);\n\n  @$pb.TagNumber(7)\n  ResidentBar get residentBar => $_getN(6);\n  @$pb.TagNumber(7)\n  set residentBar(ResidentBar value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasResidentBar() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearResidentBar() => $_clearField(7);\n  @$pb.TagNumber(7)\n  ResidentBar ensureResidentBar() => $_ensure(6);\n}\n\nclass VodInfo extends $pb.GeneratedMessage {\n  factory VodInfo({\n    $core.int? quality,\n    $core.String? format,\n    $fixnum.Int64? timelength,\n    $core.int? videoCodecid,\n    $core.Iterable<Stream>? streamList,\n    $core.Iterable<DashItem>? dashAudio,\n    DolbyItem? dolby,\n    VolumeInfo? volume,\n    LossLessItem? lossLessItem,\n    $core.bool? supportProject,\n    AIAudio? aiAudio,\n  }) {\n    final result = create();\n    if (quality != null) result.quality = quality;\n    if (format != null) result.format = format;\n    if (timelength != null) result.timelength = timelength;\n    if (videoCodecid != null) result.videoCodecid = videoCodecid;\n    if (streamList != null) result.streamList.addAll(streamList);\n    if (dashAudio != null) result.dashAudio.addAll(dashAudio);\n    if (dolby != null) result.dolby = dolby;\n    if (volume != null) result.volume = volume;\n    if (lossLessItem != null) result.lossLessItem = lossLessItem;\n    if (supportProject != null) result.supportProject = supportProject;\n    if (aiAudio != null) result.aiAudio = aiAudio;\n    return result;\n  }\n\n  VodInfo._();\n\n  factory VodInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory VodInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'VodInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'quality')\n    ..aOS(2, _omitFieldNames ? '' : 'format')\n    ..aInt64(3, _omitFieldNames ? '' : 'timelength')\n    ..aI(4, _omitFieldNames ? '' : 'videoCodecid')\n    ..pPM<Stream>(5, _omitFieldNames ? '' : 'streamList',\n        subBuilder: Stream.create)\n    ..pPM<DashItem>(6, _omitFieldNames ? '' : 'dashAudio',\n        subBuilder: DashItem.create)\n    ..aOM<DolbyItem>(7, _omitFieldNames ? '' : 'dolby',\n        subBuilder: DolbyItem.create)\n    ..aOM<VolumeInfo>(8, _omitFieldNames ? '' : 'volume',\n        subBuilder: VolumeInfo.create)\n    ..aOM<LossLessItem>(9, _omitFieldNames ? '' : 'lossLessItem',\n        subBuilder: LossLessItem.create)\n    ..aOB(10, _omitFieldNames ? '' : 'supportProject')\n    ..aOM<AIAudio>(11, _omitFieldNames ? '' : 'aiAudio',\n        subBuilder: AIAudio.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VodInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VodInfo copyWith(void Function(VodInfo) updates) =>\n      super.copyWith((message) => updates(message as VodInfo)) as VodInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static VodInfo create() => VodInfo._();\n  @$core.override\n  VodInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static VodInfo getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<VodInfo>(create);\n  static VodInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get quality => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set quality($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasQuality() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearQuality() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get format => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set format($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasFormat() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearFormat() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get timelength => $_getI64(2);\n  @$pb.TagNumber(3)\n  set timelength($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasTimelength() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearTimelength() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.int get videoCodecid => $_getIZ(3);\n  @$pb.TagNumber(4)\n  set videoCodecid($core.int value) => $_setSignedInt32(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasVideoCodecid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearVideoCodecid() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $pb.PbList<Stream> get streamList => $_getList(4);\n\n  @$pb.TagNumber(6)\n  $pb.PbList<DashItem> get dashAudio => $_getList(5);\n\n  @$pb.TagNumber(7)\n  DolbyItem get dolby => $_getN(6);\n  @$pb.TagNumber(7)\n  set dolby(DolbyItem value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasDolby() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearDolby() => $_clearField(7);\n  @$pb.TagNumber(7)\n  DolbyItem ensureDolby() => $_ensure(6);\n\n  @$pb.TagNumber(8)\n  VolumeInfo get volume => $_getN(7);\n  @$pb.TagNumber(8)\n  set volume(VolumeInfo value) => $_setField(8, value);\n  @$pb.TagNumber(8)\n  $core.bool hasVolume() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearVolume() => $_clearField(8);\n  @$pb.TagNumber(8)\n  VolumeInfo ensureVolume() => $_ensure(7);\n\n  @$pb.TagNumber(9)\n  LossLessItem get lossLessItem => $_getN(8);\n  @$pb.TagNumber(9)\n  set lossLessItem(LossLessItem value) => $_setField(9, value);\n  @$pb.TagNumber(9)\n  $core.bool hasLossLessItem() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearLossLessItem() => $_clearField(9);\n  @$pb.TagNumber(9)\n  LossLessItem ensureLossLessItem() => $_ensure(8);\n\n  @$pb.TagNumber(10)\n  $core.bool get supportProject => $_getBF(9);\n  @$pb.TagNumber(10)\n  set supportProject($core.bool value) => $_setBool(9, value);\n  @$pb.TagNumber(10)\n  $core.bool hasSupportProject() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearSupportProject() => $_clearField(10);\n\n  @$pb.TagNumber(11)\n  AIAudio get aiAudio => $_getN(10);\n  @$pb.TagNumber(11)\n  set aiAudio(AIAudio value) => $_setField(11, value);\n  @$pb.TagNumber(11)\n  $core.bool hasAiAudio() => $_has(10);\n  @$pb.TagNumber(11)\n  void clearAiAudio() => $_clearField(11);\n  @$pb.TagNumber(11)\n  AIAudio ensureAiAudio() => $_ensure(10);\n}\n\nclass VolumeInfo extends $pb.GeneratedMessage {\n  factory VolumeInfo({\n    $core.double? measuredI,\n    $core.double? measuredLra,\n    $core.double? measuredTp,\n    $core.double? measuredThreshold,\n    $core.double? targetOffset,\n    $core.double? targetI,\n    $core.double? targetTp,\n    $core.Iterable<$core.MapEntry<$core.String, $core.String>>? multiSceneArgs,\n  }) {\n    final result = create();\n    if (measuredI != null) result.measuredI = measuredI;\n    if (measuredLra != null) result.measuredLra = measuredLra;\n    if (measuredTp != null) result.measuredTp = measuredTp;\n    if (measuredThreshold != null) result.measuredThreshold = measuredThreshold;\n    if (targetOffset != null) result.targetOffset = targetOffset;\n    if (targetI != null) result.targetI = targetI;\n    if (targetTp != null) result.targetTp = targetTp;\n    if (multiSceneArgs != null)\n      result.multiSceneArgs.addEntries(multiSceneArgs);\n    return result;\n  }\n\n  VolumeInfo._();\n\n  factory VolumeInfo.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory VolumeInfo.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'VolumeInfo',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.playershared'),\n      createEmptyInstance: create)\n    ..aD(1, _omitFieldNames ? '' : 'measuredI')\n    ..aD(2, _omitFieldNames ? '' : 'measuredLra')\n    ..aD(3, _omitFieldNames ? '' : 'measuredTp')\n    ..aD(4, _omitFieldNames ? '' : 'measuredThreshold')\n    ..aD(5, _omitFieldNames ? '' : 'targetOffset')\n    ..aD(6, _omitFieldNames ? '' : 'targetI')\n    ..aD(7, _omitFieldNames ? '' : 'targetTp')\n    ..m<$core.String, $core.String>(8, _omitFieldNames ? '' : 'multiSceneArgs',\n        entryClassName: 'VolumeInfo.MultiSceneArgsEntry',\n        keyFieldType: $pb.PbFieldType.OS,\n        valueFieldType: $pb.PbFieldType.OS,\n        packageName: const $pb.PackageName('bilibili.playershared'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VolumeInfo clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  VolumeInfo copyWith(void Function(VolumeInfo) updates) =>\n      super.copyWith((message) => updates(message as VolumeInfo)) as VolumeInfo;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static VolumeInfo create() => VolumeInfo._();\n  @$core.override\n  VolumeInfo createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static VolumeInfo getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<VolumeInfo>(create);\n  static VolumeInfo? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.double get measuredI => $_getN(0);\n  @$pb.TagNumber(1)\n  set measuredI($core.double value) => $_setDouble(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMeasuredI() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMeasuredI() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.double get measuredLra => $_getN(1);\n  @$pb.TagNumber(2)\n  set measuredLra($core.double value) => $_setDouble(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMeasuredLra() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMeasuredLra() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.double get measuredTp => $_getN(2);\n  @$pb.TagNumber(3)\n  set measuredTp($core.double value) => $_setDouble(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasMeasuredTp() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearMeasuredTp() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.double get measuredThreshold => $_getN(3);\n  @$pb.TagNumber(4)\n  set measuredThreshold($core.double value) => $_setDouble(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasMeasuredThreshold() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearMeasuredThreshold() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.double get targetOffset => $_getN(4);\n  @$pb.TagNumber(5)\n  set targetOffset($core.double value) => $_setDouble(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasTargetOffset() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearTargetOffset() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.double get targetI => $_getN(5);\n  @$pb.TagNumber(6)\n  set targetI($core.double value) => $_setDouble(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasTargetI() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearTargetI() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.double get targetTp => $_getN(6);\n  @$pb.TagNumber(7)\n  set targetTp($core.double value) => $_setDouble(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasTargetTp() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearTargetTp() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $pb.PbMap<$core.String, $core.String> get multiSceneArgs => $_getMap(7);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/playershared.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/playershared.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nclass ArcType extends $pb.ProtobufEnum {\n  static const ArcType ARC_TYPE_NORMAL =\n      ArcType._(0, _omitEnumNames ? '' : 'ARC_TYPE_NORMAL');\n  static const ArcType ARC_TYPE_INTERACT =\n      ArcType._(1, _omitEnumNames ? '' : 'ARC_TYPE_INTERACT');\n\n  static const $core.List<ArcType> values = <ArcType>[\n    ARC_TYPE_NORMAL,\n    ARC_TYPE_INTERACT,\n  ];\n\n  static final $core.List<ArcType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static ArcType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ArcType._(super.value, super.name);\n}\n\nclass BizType extends $pb.ProtobufEnum {\n  static const BizType BIZ_TYPE_UNKNOWN =\n      BizType._(0, _omitEnumNames ? '' : 'BIZ_TYPE_UNKNOWN');\n  static const BizType BIZ_TYPE_UGC =\n      BizType._(1, _omitEnumNames ? '' : 'BIZ_TYPE_UGC');\n  static const BizType BIZ_TYPE_PGC =\n      BizType._(2, _omitEnumNames ? '' : 'BIZ_TYPE_PGC');\n  static const BizType BIZ_TYPE_PUGV =\n      BizType._(3, _omitEnumNames ? '' : 'BIZ_TYPE_PUGV');\n\n  static const $core.List<BizType> values = <BizType>[\n    BIZ_TYPE_UNKNOWN,\n    BIZ_TYPE_UGC,\n    BIZ_TYPE_PGC,\n    BIZ_TYPE_PUGV,\n  ];\n\n  static final $core.List<BizType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static BizType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const BizType._(super.value, super.name);\n}\n\nclass ButtonAction extends $pb.ProtobufEnum {\n  static const ButtonAction BUTTON_UNKNOWN =\n      ButtonAction._(0, _omitEnumNames ? '' : 'BUTTON_UNKNOWN');\n  static const ButtonAction PAY =\n      ButtonAction._(1, _omitEnumNames ? '' : 'PAY');\n  static const ButtonAction VIP =\n      ButtonAction._(2, _omitEnumNames ? '' : 'VIP');\n  static const ButtonAction PACK =\n      ButtonAction._(3, _omitEnumNames ? '' : 'PACK');\n  static const ButtonAction LINK =\n      ButtonAction._(4, _omitEnumNames ? '' : 'LINK');\n  static const ButtonAction COUPON =\n      ButtonAction._(5, _omitEnumNames ? '' : 'COUPON');\n  static const ButtonAction DEMAND =\n      ButtonAction._(6, _omitEnumNames ? '' : 'DEMAND');\n  static const ButtonAction DEMAND_PACK =\n      ButtonAction._(7, _omitEnumNames ? '' : 'DEMAND_PACK');\n  static const ButtonAction FOLLOW =\n      ButtonAction._(8, _omitEnumNames ? '' : 'FOLLOW');\n  static const ButtonAction APPOINTMENT =\n      ButtonAction._(9, _omitEnumNames ? '' : 'APPOINTMENT');\n  static const ButtonAction VIP_FREE =\n      ButtonAction._(10, _omitEnumNames ? '' : 'VIP_FREE');\n  static const ButtonAction TASK =\n      ButtonAction._(11, _omitEnumNames ? '' : 'TASK');\n  static const ButtonAction CHARGINGPLUS =\n      ButtonAction._(12, _omitEnumNames ? '' : 'CHARGINGPLUS');\n  static const ButtonAction BP = ButtonAction._(13, _omitEnumNames ? '' : 'BP');\n  static const ButtonAction PRE_SELL =\n      ButtonAction._(14, _omitEnumNames ? '' : 'PRE_SELL');\n  static const ButtonAction LOGIN =\n      ButtonAction._(15, _omitEnumNames ? '' : 'LOGIN');\n  static const ButtonAction BUTTON_ACTION_CHEESE_PAY =\n      ButtonAction._(16, _omitEnumNames ? '' : 'BUTTON_ACTION_CHEESE_PAY');\n  static const ButtonAction DELIVER_REPORT =\n      ButtonAction._(17, _omitEnumNames ? '' : 'DELIVER_REPORT');\n  static const ButtonAction DEVICE_MANAGE =\n      ButtonAction._(18, _omitEnumNames ? '' : 'DEVICE_MANAGE');\n  static const ButtonAction RELOAD =\n      ButtonAction._(19, _omitEnumNames ? '' : 'RELOAD');\n\n  static const $core.List<ButtonAction> values = <ButtonAction>[\n    BUTTON_UNKNOWN,\n    PAY,\n    VIP,\n    PACK,\n    LINK,\n    COUPON,\n    DEMAND,\n    DEMAND_PACK,\n    FOLLOW,\n    APPOINTMENT,\n    VIP_FREE,\n    TASK,\n    CHARGINGPLUS,\n    BP,\n    PRE_SELL,\n    LOGIN,\n    BUTTON_ACTION_CHEESE_PAY,\n    DELIVER_REPORT,\n    DEVICE_MANAGE,\n    RELOAD,\n  ];\n\n  static final $core.List<ButtonAction?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 19);\n  static ButtonAction? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ButtonAction._(super.value, super.name);\n}\n\nclass CodeType extends $pb.ProtobufEnum {\n  static const CodeType NOCODE = CodeType._(0, _omitEnumNames ? '' : 'NOCODE');\n  static const CodeType CODE264 =\n      CodeType._(1, _omitEnumNames ? '' : 'CODE264');\n  static const CodeType CODE265 =\n      CodeType._(2, _omitEnumNames ? '' : 'CODE265');\n  static const CodeType CODEAV1 =\n      CodeType._(3, _omitEnumNames ? '' : 'CODEAV1');\n\n  static const $core.List<CodeType> values = <CodeType>[\n    NOCODE,\n    CODE264,\n    CODE265,\n    CODEAV1,\n  ];\n\n  static final $core.List<CodeType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static CodeType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const CodeType._(super.value, super.name);\n}\n\nclass ConfType extends $pb.ProtobufEnum {\n  static const ConfType NoType = ConfType._(0, _omitEnumNames ? '' : 'NoType');\n  static const ConfType FLIPCONF =\n      ConfType._(1, _omitEnumNames ? '' : 'FLIPCONF');\n  static const ConfType CASTCONF =\n      ConfType._(2, _omitEnumNames ? '' : 'CASTCONF');\n  static const ConfType FEEDBACK =\n      ConfType._(3, _omitEnumNames ? '' : 'FEEDBACK');\n  static const ConfType SUBTITLE =\n      ConfType._(4, _omitEnumNames ? '' : 'SUBTITLE');\n  static const ConfType PLAYBACKRATE =\n      ConfType._(5, _omitEnumNames ? '' : 'PLAYBACKRATE');\n  static const ConfType TIMEUP = ConfType._(6, _omitEnumNames ? '' : 'TIMEUP');\n  static const ConfType PLAYBACKMODE =\n      ConfType._(7, _omitEnumNames ? '' : 'PLAYBACKMODE');\n  static const ConfType SCALEMODE =\n      ConfType._(8, _omitEnumNames ? '' : 'SCALEMODE');\n  static const ConfType BACKGROUNDPLAY =\n      ConfType._(9, _omitEnumNames ? '' : 'BACKGROUNDPLAY');\n  static const ConfType LIKE = ConfType._(10, _omitEnumNames ? '' : 'LIKE');\n  static const ConfType DISLIKE =\n      ConfType._(11, _omitEnumNames ? '' : 'DISLIKE');\n  static const ConfType COIN = ConfType._(12, _omitEnumNames ? '' : 'COIN');\n  static const ConfType ELEC = ConfType._(13, _omitEnumNames ? '' : 'ELEC');\n  static const ConfType SHARE = ConfType._(14, _omitEnumNames ? '' : 'SHARE');\n  static const ConfType SCREENSHOT =\n      ConfType._(15, _omitEnumNames ? '' : 'SCREENSHOT');\n  static const ConfType LOCKSCREEN =\n      ConfType._(16, _omitEnumNames ? '' : 'LOCKSCREEN');\n  static const ConfType RECOMMEND =\n      ConfType._(17, _omitEnumNames ? '' : 'RECOMMEND');\n  static const ConfType PLAYBACKSPEED =\n      ConfType._(18, _omitEnumNames ? '' : 'PLAYBACKSPEED');\n  static const ConfType DEFINITION =\n      ConfType._(19, _omitEnumNames ? '' : 'DEFINITION');\n  static const ConfType SELECTIONS =\n      ConfType._(20, _omitEnumNames ? '' : 'SELECTIONS');\n  static const ConfType NEXT = ConfType._(21, _omitEnumNames ? '' : 'NEXT');\n  static const ConfType EDITDM = ConfType._(22, _omitEnumNames ? '' : 'EDITDM');\n  static const ConfType SMALLWINDOW =\n      ConfType._(23, _omitEnumNames ? '' : 'SMALLWINDOW');\n  static const ConfType SHAKE = ConfType._(24, _omitEnumNames ? '' : 'SHAKE');\n  static const ConfType OUTERDM =\n      ConfType._(25, _omitEnumNames ? '' : 'OUTERDM');\n  static const ConfType INNERDM =\n      ConfType._(26, _omitEnumNames ? '' : 'INNERDM');\n  static const ConfType PANORAMA =\n      ConfType._(27, _omitEnumNames ? '' : 'PANORAMA');\n  static const ConfType DOLBY = ConfType._(28, _omitEnumNames ? '' : 'DOLBY');\n  static const ConfType COLORFILTER =\n      ConfType._(29, _omitEnumNames ? '' : 'COLORFILTER');\n  static const ConfType LOSSLESS =\n      ConfType._(30, _omitEnumNames ? '' : 'LOSSLESS');\n  static const ConfType FREYAENTER =\n      ConfType._(31, _omitEnumNames ? '' : 'FREYAENTER');\n  static const ConfType FREYAFULLENTER =\n      ConfType._(32, _omitEnumNames ? '' : 'FREYAFULLENTER');\n  static const ConfType SKIPOPED =\n      ConfType._(33, _omitEnumNames ? '' : 'SKIPOPED');\n  static const ConfType RECORDSCREEN =\n      ConfType._(34, _omitEnumNames ? '' : 'RECORDSCREEN');\n  static const ConfType DUBBING =\n      ConfType._(35, _omitEnumNames ? '' : 'DUBBING');\n  static const ConfType LISTEN = ConfType._(36, _omitEnumNames ? '' : 'LISTEN');\n  static const ConfType WATCH_LATER =\n      ConfType._(37, _omitEnumNames ? '' : 'WATCH_LATER');\n  static const ConfType SYSTEM_RECORD =\n      ConfType._(38, _omitEnumNames ? '' : 'SYSTEM_RECORD');\n\n  static const $core.List<ConfType> values = <ConfType>[\n    NoType,\n    FLIPCONF,\n    CASTCONF,\n    FEEDBACK,\n    SUBTITLE,\n    PLAYBACKRATE,\n    TIMEUP,\n    PLAYBACKMODE,\n    SCALEMODE,\n    BACKGROUNDPLAY,\n    LIKE,\n    DISLIKE,\n    COIN,\n    ELEC,\n    SHARE,\n    SCREENSHOT,\n    LOCKSCREEN,\n    RECOMMEND,\n    PLAYBACKSPEED,\n    DEFINITION,\n    SELECTIONS,\n    NEXT,\n    EDITDM,\n    SMALLWINDOW,\n    SHAKE,\n    OUTERDM,\n    INNERDM,\n    PANORAMA,\n    DOLBY,\n    COLORFILTER,\n    LOSSLESS,\n    FREYAENTER,\n    FREYAFULLENTER,\n    SKIPOPED,\n    RECORDSCREEN,\n    DUBBING,\n    LISTEN,\n    WATCH_LATER,\n    SYSTEM_RECORD,\n  ];\n\n  static final $core.List<ConfType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 38);\n  static ConfType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ConfType._(super.value, super.name);\n}\n\nclass DrmTechType extends $pb.ProtobufEnum {\n  static const DrmTechType UNKNOWN_DRM =\n      DrmTechType._(0, _omitEnumNames ? '' : 'UNKNOWN_DRM');\n  static const DrmTechType FAIR_PLAY =\n      DrmTechType._(1, _omitEnumNames ? '' : 'FAIR_PLAY');\n  static const DrmTechType WIDE_VINE =\n      DrmTechType._(2, _omitEnumNames ? '' : 'WIDE_VINE');\n  static const DrmTechType BILI_DRM =\n      DrmTechType._(3, _omitEnumNames ? '' : 'BILI_DRM');\n\n  static const $core.List<DrmTechType> values = <DrmTechType>[\n    UNKNOWN_DRM,\n    FAIR_PLAY,\n    WIDE_VINE,\n    BILI_DRM,\n  ];\n\n  static final $core.List<DrmTechType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static DrmTechType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const DrmTechType._(super.value, super.name);\n}\n\nclass Effects extends $pb.ProtobufEnum {\n  static const Effects EFFECTS_UNKNOWN =\n      Effects._(0, _omitEnumNames ? '' : 'EFFECTS_UNKNOWN');\n  static const Effects GAUSSIAN_BLUR =\n      Effects._(1, _omitEnumNames ? '' : 'GAUSSIAN_BLUR');\n  static const Effects HALF_ALPHA =\n      Effects._(2, _omitEnumNames ? '' : 'HALF_ALPHA');\n\n  static const $core.List<Effects> values = <Effects>[\n    EFFECTS_UNKNOWN,\n    GAUSSIAN_BLUR,\n    HALF_ALPHA,\n  ];\n\n  static final $core.List<Effects?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static Effects? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const Effects._(super.value, super.name);\n}\n\nclass ExtDataType extends $pb.ProtobufEnum {\n  static const ExtDataType EXT_DATA_TYPE_UNKNOWN =\n      ExtDataType._(0, _omitEnumNames ? '' : 'EXT_DATA_TYPE_UNKNOWN');\n  static const ExtDataType PLAY_LIST =\n      ExtDataType._(1, _omitEnumNames ? '' : 'PLAY_LIST');\n  static const ExtDataType BANNER =\n      ExtDataType._(2, _omitEnumNames ? '' : 'BANNER');\n  static const ExtDataType HE_INLINE =\n      ExtDataType._(3, _omitEnumNames ? '' : 'HE_INLINE');\n  static const ExtDataType EXT_DATA_TYPE_CHARGING =\n      ExtDataType._(4, _omitEnumNames ? '' : 'EXT_DATA_TYPE_CHARGING');\n  static const ExtDataType QR_CODE =\n      ExtDataType._(5, _omitEnumNames ? '' : 'QR_CODE');\n\n  static const $core.List<ExtDataType> values = <ExtDataType>[\n    EXT_DATA_TYPE_UNKNOWN,\n    PLAY_LIST,\n    BANNER,\n    HE_INLINE,\n    EXT_DATA_TYPE_CHARGING,\n    QR_CODE,\n  ];\n\n  static final $core.List<ExtDataType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 5);\n  static ExtDataType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ExtDataType._(super.value, super.name);\n}\n\nclass FoldStyle extends $pb.ProtobufEnum {\n  static const FoldStyle FOLD_STYLE_UNSPECIFIED =\n      FoldStyle._(0, _omitEnumNames ? '' : 'FOLD_STYLE_UNSPECIFIED');\n  static const FoldStyle FOLD_STYLE_COUNT_DOWN =\n      FoldStyle._(1, _omitEnumNames ? '' : 'FOLD_STYLE_COUNT_DOWN');\n  static const FoldStyle FOLD_STYLE_ONLY_BUTTON =\n      FoldStyle._(2, _omitEnumNames ? '' : 'FOLD_STYLE_ONLY_BUTTON');\n\n  static const $core.List<FoldStyle> values = <FoldStyle>[\n    FOLD_STYLE_UNSPECIFIED,\n    FOLD_STYLE_COUNT_DOWN,\n    FOLD_STYLE_ONLY_BUTTON,\n  ];\n\n  static final $core.List<FoldStyle?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static FoldStyle? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const FoldStyle._(super.value, super.name);\n}\n\nclass FragmentPosition extends $pb.ProtobufEnum {\n  static const FragmentPosition INVALID =\n      FragmentPosition._(0, _omitEnumNames ? '' : 'INVALID');\n  static const FragmentPosition PRE =\n      FragmentPosition._(1, _omitEnumNames ? '' : 'PRE');\n  static const FragmentPosition MIDDLE =\n      FragmentPosition._(2, _omitEnumNames ? '' : 'MIDDLE');\n  static const FragmentPosition POST =\n      FragmentPosition._(3, _omitEnumNames ? '' : 'POST');\n\n  static const $core.List<FragmentPosition> values = <FragmentPosition>[\n    INVALID,\n    PRE,\n    MIDDLE,\n    POST,\n  ];\n\n  static final $core.List<FragmentPosition?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static FragmentPosition? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const FragmentPosition._(super.value, super.name);\n}\n\nclass FragmentType extends $pb.ProtobufEnum {\n  static const FragmentType UNKNOWN =\n      FragmentType._(0, _omitEnumNames ? '' : 'UNKNOWN');\n  static const FragmentType AD_FRAGMENT =\n      FragmentType._(1, _omitEnumNames ? '' : 'AD_FRAGMENT');\n  static const FragmentType OGV_FRAGMENT =\n      FragmentType._(2, _omitEnumNames ? '' : 'OGV_FRAGMENT');\n  static const FragmentType PUGV_FRAGMENT =\n      FragmentType._(3, _omitEnumNames ? '' : 'PUGV_FRAGMENT');\n\n  static const $core.List<FragmentType> values = <FragmentType>[\n    UNKNOWN,\n    AD_FRAGMENT,\n    OGV_FRAGMENT,\n    PUGV_FRAGMENT,\n  ];\n\n  static final $core.List<FragmentType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static FragmentType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const FragmentType._(super.value, super.name);\n}\n\nclass GroupStyle extends $pb.ProtobufEnum {\n  static const GroupStyle GROUP_STYLE_DEFAULT =\n      GroupStyle._(0, _omitEnumNames ? '' : 'GROUP_STYLE_DEFAULT');\n  static const GroupStyle GROUP_STYLE_HORIZON =\n      GroupStyle._(1, _omitEnumNames ? '' : 'GROUP_STYLE_HORIZON');\n\n  static const $core.List<GroupStyle> values = <GroupStyle>[\n    GROUP_STYLE_DEFAULT,\n    GROUP_STYLE_HORIZON,\n  ];\n\n  static final $core.List<GroupStyle?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static GroupStyle? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const GroupStyle._(super.value, super.name);\n}\n\nclass GuideStyle extends $pb.ProtobufEnum {\n  static const GuideStyle STYLE_UNKNOWN =\n      GuideStyle._(0, _omitEnumNames ? '' : 'STYLE_UNKNOWN');\n  static const GuideStyle HORIZONTAL_IMAGE =\n      GuideStyle._(1, _omitEnumNames ? '' : 'HORIZONTAL_IMAGE');\n  static const GuideStyle VERTICAL_TEXT =\n      GuideStyle._(2, _omitEnumNames ? '' : 'VERTICAL_TEXT');\n  static const GuideStyle SIMPLE_TEXT =\n      GuideStyle._(3, _omitEnumNames ? '' : 'SIMPLE_TEXT');\n  static const GuideStyle CHARGING_TEXT =\n      GuideStyle._(4, _omitEnumNames ? '' : 'CHARGING_TEXT');\n  static const GuideStyle UNIVERSAL_INTERCEPT =\n      GuideStyle._(5, _omitEnumNames ? '' : 'UNIVERSAL_INTERCEPT');\n  static const GuideStyle MSG_ATTACH_QR_CODE =\n      GuideStyle._(6, _omitEnumNames ? '' : 'MSG_ATTACH_QR_CODE');\n\n  static const $core.List<GuideStyle> values = <GuideStyle>[\n    STYLE_UNKNOWN,\n    HORIZONTAL_IMAGE,\n    VERTICAL_TEXT,\n    SIMPLE_TEXT,\n    CHARGING_TEXT,\n    UNIVERSAL_INTERCEPT,\n    MSG_ATTACH_QR_CODE,\n  ];\n\n  static final $core.List<GuideStyle?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 6);\n  static GuideStyle? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const GuideStyle._(super.value, super.name);\n}\n\nclass LimitActionType extends $pb.ProtobufEnum {\n  static const LimitActionType LAT_UNKNOWN =\n      LimitActionType._(0, _omitEnumNames ? '' : 'LAT_UNKNOWN');\n  static const LimitActionType SHOW_LIMIT_DIALOG =\n      LimitActionType._(1, _omitEnumNames ? '' : 'SHOW_LIMIT_DIALOG');\n  static const LimitActionType SKIP_CURRENT_EP =\n      LimitActionType._(2, _omitEnumNames ? '' : 'SKIP_CURRENT_EP');\n\n  static const $core.List<LimitActionType> values = <LimitActionType>[\n    LAT_UNKNOWN,\n    SHOW_LIMIT_DIALOG,\n    SKIP_CURRENT_EP,\n  ];\n\n  static final $core.List<LimitActionType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static LimitActionType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const LimitActionType._(super.value, super.name);\n}\n\nclass PlayCtrl extends $pb.ProtobufEnum {\n  static const PlayCtrl PLAY_CTRL_DEFAULT =\n      PlayCtrl._(0, _omitEnumNames ? '' : 'PLAY_CTRL_DEFAULT');\n  static const PlayCtrl PLAY_CTRL_SIMPLE =\n      PlayCtrl._(1, _omitEnumNames ? '' : 'PLAY_CTRL_SIMPLE');\n\n  static const $core.List<PlayCtrl> values = <PlayCtrl>[\n    PLAY_CTRL_DEFAULT,\n    PLAY_CTRL_SIMPLE,\n  ];\n\n  static final $core.List<PlayCtrl?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static PlayCtrl? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const PlayCtrl._(super.value, super.name);\n}\n\nclass PlayErr extends $pb.ProtobufEnum {\n  static const PlayErr NoErr = PlayErr._(0, _omitEnumNames ? '' : 'NoErr');\n  static const PlayErr WithMultiDeviceLoginErr =\n      PlayErr._(1, _omitEnumNames ? '' : 'WithMultiDeviceLoginErr');\n\n  static const $core.List<PlayErr> values = <PlayErr>[\n    NoErr,\n    WithMultiDeviceLoginErr,\n  ];\n\n  static final $core.List<PlayErr?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static PlayErr? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const PlayErr._(super.value, super.name);\n}\n\nclass PromptBarStyle extends $pb.ProtobufEnum {\n  static const PromptBarStyle PROMPT_BAR_STYLE_UNKNOWN =\n      PromptBarStyle._(0, _omitEnumNames ? '' : 'PROMPT_BAR_STYLE_UNKNOWN');\n  static const PromptBarStyle TEXT =\n      PromptBarStyle._(1, _omitEnumNames ? '' : 'TEXT');\n  static const PromptBarStyle CURING_BENEFITS =\n      PromptBarStyle._(2, _omitEnumNames ? '' : 'CURING_BENEFITS');\n  static const PromptBarStyle CARD_OPENING_GIFT =\n      PromptBarStyle._(3, _omitEnumNames ? '' : 'CARD_OPENING_GIFT');\n  static const PromptBarStyle COUNTDOWN =\n      PromptBarStyle._(4, _omitEnumNames ? '' : 'COUNTDOWN');\n\n  static const $core.List<PromptBarStyle> values = <PromptBarStyle>[\n    PROMPT_BAR_STYLE_UNKNOWN,\n    TEXT,\n    CURING_BENEFITS,\n    CARD_OPENING_GIFT,\n    COUNTDOWN,\n  ];\n\n  static final $core.List<PromptBarStyle?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 4);\n  static PromptBarStyle? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const PromptBarStyle._(super.value, super.name);\n}\n\nclass PromptBarType extends $pb.ProtobufEnum {\n  static const PromptBarType PROMPT_BAR_TYPE_UNKNOWN =\n      PromptBarType._(0, _omitEnumNames ? '' : 'PROMPT_BAR_TYPE_UNKNOWN');\n  static const PromptBarType OPEN_PROMPT_BAR =\n      PromptBarType._(1, _omitEnumNames ? '' : 'OPEN_PROMPT_BAR');\n  static const PromptBarType TRY_PROMPT_BAR =\n      PromptBarType._(2, _omitEnumNames ? '' : 'TRY_PROMPT_BAR');\n\n  static const $core.List<PromptBarType> values = <PromptBarType>[\n    PROMPT_BAR_TYPE_UNKNOWN,\n    OPEN_PROMPT_BAR,\n    TRY_PROMPT_BAR,\n  ];\n\n  static final $core.List<PromptBarType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static PromptBarType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const PromptBarType._(super.value, super.name);\n}\n\nclass QnPolicy extends $pb.ProtobufEnum {\n  static const QnPolicy QN_POLICY_DEFAULT =\n      QnPolicy._(0, _omitEnumNames ? '' : 'QN_POLICY_DEFAULT');\n  static const QnPolicy QN_POLICY_AUTO_QN_ENABLE =\n      QnPolicy._(1, _omitEnumNames ? '' : 'QN_POLICY_AUTO_QN_ENABLE');\n\n  static const $core.List<QnPolicy> values = <QnPolicy>[\n    QN_POLICY_DEFAULT,\n    QN_POLICY_AUTO_QN_ENABLE,\n  ];\n\n  static final $core.List<QnPolicy?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static QnPolicy? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const QnPolicy._(super.value, super.name);\n}\n\nclass SettingItemStyle extends $pb.ProtobufEnum {\n  static const SettingItemStyle SETTING_STYLE_NONE =\n      SettingItemStyle._(0, _omitEnumNames ? '' : 'SETTING_STYLE_NONE');\n  static const SettingItemStyle SETTING_STYLE_SWITCH =\n      SettingItemStyle._(1, _omitEnumNames ? '' : 'SETTING_STYLE_SWITCH');\n  static const SettingItemStyle SETTING_STYLE_MORE =\n      SettingItemStyle._(2, _omitEnumNames ? '' : 'SETTING_STYLE_MORE');\n  static const SettingItemStyle SETTING_STYLE_SELECT =\n      SettingItemStyle._(3, _omitEnumNames ? '' : 'SETTING_STYLE_SELECT');\n  static const SettingItemStyle SETTING_STYLE_VERTICAL =\n      SettingItemStyle._(4, _omitEnumNames ? '' : 'SETTING_STYLE_VERTICAL');\n\n  static const $core.List<SettingItemStyle> values = <SettingItemStyle>[\n    SETTING_STYLE_NONE,\n    SETTING_STYLE_SWITCH,\n    SETTING_STYLE_MORE,\n    SETTING_STYLE_SELECT,\n    SETTING_STYLE_VERTICAL,\n  ];\n\n  static final $core.List<SettingItemStyle?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 4);\n  static SettingItemStyle? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const SettingItemStyle._(super.value, super.name);\n}\n\nclass SettingItemType extends $pb.ProtobufEnum {\n  static const SettingItemType SETTING_NONE =\n      SettingItemType._(0, _omitEnumNames ? '' : 'SETTING_NONE');\n  static const SettingItemType SETTING_PLAYBACK_RATE =\n      SettingItemType._(1, _omitEnumNames ? '' : 'SETTING_PLAYBACK_RATE');\n  static const SettingItemType SETTING_WATCH_LATER =\n      SettingItemType._(2, _omitEnumNames ? '' : 'SETTING_WATCH_LATER');\n  static const SettingItemType SETTING_DOWNlOAD =\n      SettingItemType._(3, _omitEnumNames ? '' : 'SETTING_DOWNlOAD');\n  static const SettingItemType SETTING_SMALL_WINDOW =\n      SettingItemType._(4, _omitEnumNames ? '' : 'SETTING_SMALL_WINDOW');\n  static const SettingItemType SETTING_FREYAENTER =\n      SettingItemType._(5, _omitEnumNames ? '' : 'SETTING_FREYAENTER');\n  static const SettingItemType SETTING_PLAYBACK_MODE =\n      SettingItemType._(6, _omitEnumNames ? '' : 'SETTING_PLAYBACK_MODE');\n  static const SettingItemType SETTING_LOOP_PLAYBACK =\n      SettingItemType._(7, _omitEnumNames ? '' : 'SETTING_LOOP_PLAYBACK');\n  static const SettingItemType SETTING_TIMING_SWITCH =\n      SettingItemType._(8, _omitEnumNames ? '' : 'SETTING_TIMING_SWITCH');\n  static const SettingItemType SETTING_BACKGROUND_PLAY =\n      SettingItemType._(9, _omitEnumNames ? '' : 'SETTING_BACKGROUND_PLAY');\n  static const SettingItemType SETTING_SUBTITLE =\n      SettingItemType._(10, _omitEnumNames ? '' : 'SETTING_SUBTITLE');\n  static const SettingItemType SETTING_SUBTITLE_EXCHANGE =\n      SettingItemType._(11, _omitEnumNames ? '' : 'SETTING_SUBTITLE_EXCHANGE');\n  static const SettingItemType SETTING_FLIP_CONF =\n      SettingItemType._(12, _omitEnumNames ? '' : 'SETTING_FLIP_CONF');\n  static const SettingItemType SETTING_MORE_PLAY =\n      SettingItemType._(13, _omitEnumNames ? '' : 'SETTING_MORE_PLAY');\n  static const SettingItemType SETTING_SHAKE =\n      SettingItemType._(14, _omitEnumNames ? '' : 'SETTING_SHAKE');\n  static const SettingItemType SETTING_SKIP_OPED =\n      SettingItemType._(15, _omitEnumNames ? '' : 'SETTING_SKIP_OPED');\n  static const SettingItemType SETTING_NOTE =\n      SettingItemType._(16, _omitEnumNames ? '' : 'SETTING_NOTE');\n  static const SettingItemType SETTING_REPORT =\n      SettingItemType._(17, _omitEnumNames ? '' : 'SETTING_REPORT');\n  static const SettingItemType SETTING_FEEDBACK =\n      SettingItemType._(18, _omitEnumNames ? '' : 'SETTING_FEEDBACK');\n  static const SettingItemType SETTING_FREE_GIFT =\n      SettingItemType._(19, _omitEnumNames ? '' : 'SETTING_FREE_GIFT');\n  static const SettingItemType SETTING_DUB =\n      SettingItemType._(20, _omitEnumNames ? '' : 'SETTING_DUB');\n  static const SettingItemType SETTING_LISTEN =\n      SettingItemType._(21, _omitEnumNames ? '' : 'SETTING_LISTEN');\n  static const SettingItemType SETTING_PROJECT =\n      SettingItemType._(22, _omitEnumNames ? '' : 'SETTING_PROJECT');\n  static const SettingItemType SETTING_PIC_SIZE =\n      SettingItemType._(23, _omitEnumNames ? '' : 'SETTING_PIC_SIZE');\n  static const SettingItemType SETTING_PANORAMA =\n      SettingItemType._(24, _omitEnumNames ? '' : 'SETTING_PANORAMA');\n  static const SettingItemType SETTING_VISION_ASSIST =\n      SettingItemType._(25, _omitEnumNames ? '' : 'SETTING_VISION_ASSIST');\n  static const SettingItemType SETTING_EDIT =\n      SettingItemType._(26, _omitEnumNames ? '' : 'SETTING_EDIT');\n  static const SettingItemType SETTING_DISLIKE =\n      SettingItemType._(27, _omitEnumNames ? '' : 'SETTING_DISLIKE');\n  static const SettingItemType SETTING_BIHUO =\n      SettingItemType._(28, _omitEnumNames ? '' : 'SETTING_BIHUO');\n  static const SettingItemType SETTING_GESTURE =\n      SettingItemType._(29, _omitEnumNames ? '' : 'SETTING_GESTURE');\n  static const SettingItemType SETTING_DM =\n      SettingItemType._(30, _omitEnumNames ? '' : 'SETTING_DM');\n  static const SettingItemType SETTING_DEFINITION =\n      SettingItemType._(31, _omitEnumNames ? '' : 'SETTING_DEFINITION');\n  static const SettingItemType SETTING_SUGGEST =\n      SettingItemType._(32, _omitEnumNames ? '' : 'SETTING_SUGGEST');\n  static const SettingItemType SETTING_AUTOMATIC_SCROLL =\n      SettingItemType._(33, _omitEnumNames ? '' : 'SETTING_AUTOMATIC_SCROLL');\n  static const SettingItemType SETTING_BACKTRACKING =\n      SettingItemType._(34, _omitEnumNames ? '' : 'SETTING_BACKTRACKING');\n  static const SettingItemType SETTING_AI_AUDIO =\n      SettingItemType._(35, _omitEnumNames ? '' : 'SETTING_AI_AUDIO');\n  static const SettingItemType SETTING_AI_AUDIO_EXCHANGE =\n      SettingItemType._(36, _omitEnumNames ? '' : 'SETTING_AI_AUDIO_EXCHANGE');\n\n  static const $core.List<SettingItemType> values = <SettingItemType>[\n    SETTING_NONE,\n    SETTING_PLAYBACK_RATE,\n    SETTING_WATCH_LATER,\n    SETTING_DOWNlOAD,\n    SETTING_SMALL_WINDOW,\n    SETTING_FREYAENTER,\n    SETTING_PLAYBACK_MODE,\n    SETTING_LOOP_PLAYBACK,\n    SETTING_TIMING_SWITCH,\n    SETTING_BACKGROUND_PLAY,\n    SETTING_SUBTITLE,\n    SETTING_SUBTITLE_EXCHANGE,\n    SETTING_FLIP_CONF,\n    SETTING_MORE_PLAY,\n    SETTING_SHAKE,\n    SETTING_SKIP_OPED,\n    SETTING_NOTE,\n    SETTING_REPORT,\n    SETTING_FEEDBACK,\n    SETTING_FREE_GIFT,\n    SETTING_DUB,\n    SETTING_LISTEN,\n    SETTING_PROJECT,\n    SETTING_PIC_SIZE,\n    SETTING_PANORAMA,\n    SETTING_VISION_ASSIST,\n    SETTING_EDIT,\n    SETTING_DISLIKE,\n    SETTING_BIHUO,\n    SETTING_GESTURE,\n    SETTING_DM,\n    SETTING_DEFINITION,\n    SETTING_SUGGEST,\n    SETTING_AUTOMATIC_SCROLL,\n    SETTING_BACKTRACKING,\n    SETTING_AI_AUDIO,\n    SETTING_AI_AUDIO_EXCHANGE,\n  ];\n\n  static final $core.List<SettingItemType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 36);\n  static SettingItemType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const SettingItemType._(super.value, super.name);\n}\n\nclass SettingJumpType extends $pb.ProtobufEnum {\n  static const SettingJumpType SETTING_JUMP_TYPE_NONE =\n      SettingJumpType._(0, _omitEnumNames ? '' : 'SETTING_JUMP_TYPE_NONE');\n  static const SettingJumpType SETTING_JUMP_TYPE_OPEN_URL =\n      SettingJumpType._(1, _omitEnumNames ? '' : 'SETTING_JUMP_TYPE_OPEN_URL');\n  static const SettingJumpType SETTING_JUMP_TYPE_HALF_SCREEN =\n      SettingJumpType._(\n          2, _omitEnumNames ? '' : 'SETTING_JUMP_TYPE_HALF_SCREEN');\n  static const SettingJumpType SETTING_JUMP_TYPE_OPEN_URL_BY_OUTER_BROWSER =\n      SettingJumpType._(3,\n          _omitEnumNames ? '' : 'SETTING_JUMP_TYPE_OPEN_URL_BY_OUTER_BROWSER');\n\n  static const $core.List<SettingJumpType> values = <SettingJumpType>[\n    SETTING_JUMP_TYPE_NONE,\n    SETTING_JUMP_TYPE_OPEN_URL,\n    SETTING_JUMP_TYPE_HALF_SCREEN,\n    SETTING_JUMP_TYPE_OPEN_URL_BY_OUTER_BROWSER,\n  ];\n\n  static final $core.List<SettingJumpType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 3);\n  static SettingJumpType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const SettingJumpType._(super.value, super.name);\n}\n\nclass ShowStyleType extends $pb.ProtobufEnum {\n  static const ShowStyleType SHOW_STYLE_TYPE_UNKNOWN =\n      ShowStyleType._(0, _omitEnumNames ? '' : 'SHOW_STYLE_TYPE_UNKNOWN');\n  static const ShowStyleType SHOW_STYLE_TYPE_ORDINARY =\n      ShowStyleType._(1, _omitEnumNames ? '' : 'SHOW_STYLE_TYPE_ORDINARY');\n  static const ShowStyleType SHOW_STYLE_TYPE_RESIDENT =\n      ShowStyleType._(2, _omitEnumNames ? '' : 'SHOW_STYLE_TYPE_RESIDENT');\n\n  static const $core.List<ShowStyleType> values = <ShowStyleType>[\n    SHOW_STYLE_TYPE_UNKNOWN,\n    SHOW_STYLE_TYPE_ORDINARY,\n    SHOW_STYLE_TYPE_RESIDENT,\n  ];\n\n  static final $core.List<ShowStyleType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static ShowStyleType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ShowStyleType._(super.value, super.name);\n}\n\nclass ToastType extends $pb.ProtobufEnum {\n  static const ToastType TOAST_TYPE_UNKNOWN =\n      ToastType._(0, _omitEnumNames ? '' : 'TOAST_TYPE_UNKNOWN');\n  static const ToastType VIP_CONTENT_REMIND =\n      ToastType._(1, _omitEnumNames ? '' : 'VIP_CONTENT_REMIND');\n  static const ToastType VIP_DEFINITION_REMIND =\n      ToastType._(2, _omitEnumNames ? '' : 'VIP_DEFINITION_REMIND');\n  static const ToastType VIP_DEFINITION_GUIDE =\n      ToastType._(3, _omitEnumNames ? '' : 'VIP_DEFINITION_GUIDE');\n  static const ToastType OGV_VIDEO_START_TOAST =\n      ToastType._(4, _omitEnumNames ? '' : 'OGV_VIDEO_START_TOAST');\n  static const ToastType CHARGING_TOAST =\n      ToastType._(5, _omitEnumNames ? '' : 'CHARGING_TOAST');\n  static const ToastType VIP_SKIP_FRAGMENT_TOAST =\n      ToastType._(6, _omitEnumNames ? '' : 'VIP_SKIP_FRAGMENT_TOAST');\n  static const ToastType VIP_AI_FIX_DEFINITION_REMIND =\n      ToastType._(7, _omitEnumNames ? '' : 'VIP_AI_FIX_DEFINITION_REMIND');\n  static const ToastType NEW_USER_DEFINITION_REMIND =\n      ToastType._(8, _omitEnumNames ? '' : 'NEW_USER_DEFINITION_REMIND');\n  static const ToastType VIP_RISK_TOAST =\n      ToastType._(9, _omitEnumNames ? '' : 'VIP_RISK_TOAST');\n\n  static const $core.List<ToastType> values = <ToastType>[\n    TOAST_TYPE_UNKNOWN,\n    VIP_CONTENT_REMIND,\n    VIP_DEFINITION_REMIND,\n    VIP_DEFINITION_GUIDE,\n    OGV_VIDEO_START_TOAST,\n    CHARGING_TOAST,\n    VIP_SKIP_FRAGMENT_TOAST,\n    VIP_AI_FIX_DEFINITION_REMIND,\n    NEW_USER_DEFINITION_REMIND,\n    VIP_RISK_TOAST,\n  ];\n\n  static final $core.List<ToastType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 9);\n  static ToastType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const ToastType._(super.value, super.name);\n}\n\nclass UnsupportScene extends $pb.ProtobufEnum {\n  static const UnsupportScene UNKNOWN_SCENE =\n      UnsupportScene._(0, _omitEnumNames ? '' : 'UNKNOWN_SCENE');\n  static const UnsupportScene PREMIERE =\n      UnsupportScene._(1, _omitEnumNames ? '' : 'PREMIERE');\n\n  static const $core.List<UnsupportScene> values = <UnsupportScene>[\n    UNKNOWN_SCENE,\n    PREMIERE,\n  ];\n\n  static final $core.List<UnsupportScene?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static UnsupportScene? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const UnsupportScene._(super.value, super.name);\n}\n\nclass UnsupportState extends $pb.ProtobufEnum {\n  static const UnsupportState NONE_UnsupportState =\n      UnsupportState._(0, _omitEnumNames ? '' : 'NONE_UnsupportState');\n  static const UnsupportState HALF =\n      UnsupportState._(1, _omitEnumNames ? '' : 'HALF');\n  static const UnsupportState FULL =\n      UnsupportState._(2, _omitEnumNames ? '' : 'FULL');\n\n  static const $core.List<UnsupportState> values = <UnsupportState>[\n    NONE_UnsupportState,\n    HALF,\n    FULL,\n  ];\n\n  static final $core.List<UnsupportState?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static UnsupportState? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const UnsupportState._(super.value, super.name);\n}\n\nclass DolbyItem_Type extends $pb.ProtobufEnum {\n  static const DolbyItem_Type NONE =\n      DolbyItem_Type._(0, _omitEnumNames ? '' : 'NONE');\n  static const DolbyItem_Type COMMON =\n      DolbyItem_Type._(1, _omitEnumNames ? '' : 'COMMON');\n  static const DolbyItem_Type ATMOS =\n      DolbyItem_Type._(2, _omitEnumNames ? '' : 'ATMOS');\n\n  static const $core.List<DolbyItem_Type> values = <DolbyItem_Type>[\n    NONE,\n    COMMON,\n    ATMOS,\n  ];\n\n  static final $core.List<DolbyItem_Type?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static DolbyItem_Type? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const DolbyItem_Type._(super.value, super.name);\n}\n\nclass Scheme_ActionType extends $pb.ProtobufEnum {\n  static const Scheme_ActionType UNKNOWN_ActionType =\n      Scheme_ActionType._(0, _omitEnumNames ? '' : 'UNKNOWN_ActionType');\n  static const Scheme_ActionType SHOW_TOAST =\n      Scheme_ActionType._(1, _omitEnumNames ? '' : 'SHOW_TOAST');\n\n  static const $core.List<Scheme_ActionType> values = <Scheme_ActionType>[\n    UNKNOWN_ActionType,\n    SHOW_TOAST,\n  ];\n\n  static final $core.List<Scheme_ActionType?> _byValue =\n      $pb.ProtobufEnum.$_initByValueList(values, 1);\n  static Scheme_ActionType? valueOf($core.int value) =>\n      value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const Scheme_ActionType._(super.value, super.name);\n}\n\nconst $core.bool _omitEnumNames =\n    $core.bool.fromEnvironment('protobuf.omit_enum_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/playershared.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/playershared.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use arcTypeDescriptor instead')\nconst ArcType$json = {\n  '1': 'ArcType',\n  '2': [\n    {'1': 'ARC_TYPE_NORMAL', '2': 0},\n    {'1': 'ARC_TYPE_INTERACT', '2': 1},\n  ],\n};\n\n/// Descriptor for `ArcType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List arcTypeDescriptor = $convert.base64Decode(\n    'CgdBcmNUeXBlEhMKD0FSQ19UWVBFX05PUk1BTBAAEhUKEUFSQ19UWVBFX0lOVEVSQUNUEAE=');\n\n@$core.Deprecated('Use bizTypeDescriptor instead')\nconst BizType$json = {\n  '1': 'BizType',\n  '2': [\n    {'1': 'BIZ_TYPE_UNKNOWN', '2': 0},\n    {'1': 'BIZ_TYPE_UGC', '2': 1},\n    {'1': 'BIZ_TYPE_PGC', '2': 2},\n    {'1': 'BIZ_TYPE_PUGV', '2': 3},\n  ],\n};\n\n/// Descriptor for `BizType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List bizTypeDescriptor = $convert.base64Decode(\n    'CgdCaXpUeXBlEhQKEEJJWl9UWVBFX1VOS05PV04QABIQCgxCSVpfVFlQRV9VR0MQARIQCgxCSV'\n    'pfVFlQRV9QR0MQAhIRCg1CSVpfVFlQRV9QVUdWEAM=');\n\n@$core.Deprecated('Use buttonActionDescriptor instead')\nconst ButtonAction$json = {\n  '1': 'ButtonAction',\n  '2': [\n    {'1': 'BUTTON_UNKNOWN', '2': 0},\n    {'1': 'PAY', '2': 1},\n    {'1': 'VIP', '2': 2},\n    {'1': 'PACK', '2': 3},\n    {'1': 'LINK', '2': 4},\n    {'1': 'COUPON', '2': 5},\n    {'1': 'DEMAND', '2': 6},\n    {'1': 'DEMAND_PACK', '2': 7},\n    {'1': 'FOLLOW', '2': 8},\n    {'1': 'APPOINTMENT', '2': 9},\n    {'1': 'VIP_FREE', '2': 10},\n    {'1': 'TASK', '2': 11},\n    {'1': 'CHARGINGPLUS', '2': 12},\n    {'1': 'BP', '2': 13},\n    {'1': 'PRE_SELL', '2': 14},\n    {'1': 'LOGIN', '2': 15},\n    {'1': 'BUTTON_ACTION_CHEESE_PAY', '2': 16},\n    {'1': 'DELIVER_REPORT', '2': 17},\n    {'1': 'DEVICE_MANAGE', '2': 18},\n    {'1': 'RELOAD', '2': 19},\n  ],\n};\n\n/// Descriptor for `ButtonAction`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List buttonActionDescriptor = $convert.base64Decode(\n    'CgxCdXR0b25BY3Rpb24SEgoOQlVUVE9OX1VOS05PV04QABIHCgNQQVkQARIHCgNWSVAQAhIICg'\n    'RQQUNLEAMSCAoETElOSxAEEgoKBkNPVVBPThAFEgoKBkRFTUFORBAGEg8KC0RFTUFORF9QQUNL'\n    'EAcSCgoGRk9MTE9XEAgSDwoLQVBQT0lOVE1FTlQQCRIMCghWSVBfRlJFRRAKEggKBFRBU0sQCx'\n    'IQCgxDSEFSR0lOR1BMVVMQDBIGCgJCUBANEgwKCFBSRV9TRUxMEA4SCQoFTE9HSU4QDxIcChhC'\n    'VVRUT05fQUNUSU9OX0NIRUVTRV9QQVkQEBISCg5ERUxJVkVSX1JFUE9SVBAREhEKDURFVklDRV'\n    '9NQU5BR0UQEhIKCgZSRUxPQUQQEw==');\n\n@$core.Deprecated('Use codeTypeDescriptor instead')\nconst CodeType$json = {\n  '1': 'CodeType',\n  '2': [\n    {'1': 'NOCODE', '2': 0},\n    {'1': 'CODE264', '2': 1},\n    {'1': 'CODE265', '2': 2},\n    {'1': 'CODEAV1', '2': 3},\n  ],\n};\n\n/// Descriptor for `CodeType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List codeTypeDescriptor = $convert.base64Decode(\n    'CghDb2RlVHlwZRIKCgZOT0NPREUQABILCgdDT0RFMjY0EAESCwoHQ09ERTI2NRACEgsKB0NPRE'\n    'VBVjEQAw==');\n\n@$core.Deprecated('Use confTypeDescriptor instead')\nconst ConfType$json = {\n  '1': 'ConfType',\n  '2': [\n    {'1': 'NoType', '2': 0},\n    {'1': 'FLIPCONF', '2': 1},\n    {'1': 'CASTCONF', '2': 2},\n    {'1': 'FEEDBACK', '2': 3},\n    {'1': 'SUBTITLE', '2': 4},\n    {'1': 'PLAYBACKRATE', '2': 5},\n    {'1': 'TIMEUP', '2': 6},\n    {'1': 'PLAYBACKMODE', '2': 7},\n    {'1': 'SCALEMODE', '2': 8},\n    {'1': 'BACKGROUNDPLAY', '2': 9},\n    {'1': 'LIKE', '2': 10},\n    {'1': 'DISLIKE', '2': 11},\n    {'1': 'COIN', '2': 12},\n    {'1': 'ELEC', '2': 13},\n    {'1': 'SHARE', '2': 14},\n    {'1': 'SCREENSHOT', '2': 15},\n    {'1': 'LOCKSCREEN', '2': 16},\n    {'1': 'RECOMMEND', '2': 17},\n    {'1': 'PLAYBACKSPEED', '2': 18},\n    {'1': 'DEFINITION', '2': 19},\n    {'1': 'SELECTIONS', '2': 20},\n    {'1': 'NEXT', '2': 21},\n    {'1': 'EDITDM', '2': 22},\n    {'1': 'SMALLWINDOW', '2': 23},\n    {'1': 'SHAKE', '2': 24},\n    {'1': 'OUTERDM', '2': 25},\n    {'1': 'INNERDM', '2': 26},\n    {'1': 'PANORAMA', '2': 27},\n    {'1': 'DOLBY', '2': 28},\n    {'1': 'COLORFILTER', '2': 29},\n    {'1': 'LOSSLESS', '2': 30},\n    {'1': 'FREYAENTER', '2': 31},\n    {'1': 'FREYAFULLENTER', '2': 32},\n    {'1': 'SKIPOPED', '2': 33},\n    {'1': 'RECORDSCREEN', '2': 34},\n    {'1': 'DUBBING', '2': 35},\n    {'1': 'LISTEN', '2': 36},\n    {'1': 'WATCH_LATER', '2': 37},\n    {'1': 'SYSTEM_RECORD', '2': 38},\n  ],\n};\n\n/// Descriptor for `ConfType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List confTypeDescriptor = $convert.base64Decode(\n    'CghDb25mVHlwZRIKCgZOb1R5cGUQABIMCghGTElQQ09ORhABEgwKCENBU1RDT05GEAISDAoIRk'\n    'VFREJBQ0sQAxIMCghTVUJUSVRMRRAEEhAKDFBMQVlCQUNLUkFURRAFEgoKBlRJTUVVUBAGEhAK'\n    'DFBMQVlCQUNLTU9ERRAHEg0KCVNDQUxFTU9ERRAIEhIKDkJBQ0tHUk9VTkRQTEFZEAkSCAoETE'\n    'lLRRAKEgsKB0RJU0xJS0UQCxIICgRDT0lOEAwSCAoERUxFQxANEgkKBVNIQVJFEA4SDgoKU0NS'\n    'RUVOU0hPVBAPEg4KCkxPQ0tTQ1JFRU4QEBINCglSRUNPTU1FTkQQERIRCg1QTEFZQkFDS1NQRU'\n    'VEEBISDgoKREVGSU5JVElPThATEg4KClNFTEVDVElPTlMQFBIICgRORVhUEBUSCgoGRURJVERN'\n    'EBYSDwoLU01BTExXSU5ET1cQFxIJCgVTSEFLRRAYEgsKB09VVEVSRE0QGRILCgdJTk5FUkRNEB'\n    'oSDAoIUEFOT1JBTUEQGxIJCgVET0xCWRAcEg8KC0NPTE9SRklMVEVSEB0SDAoITE9TU0xFU1MQ'\n    'HhIOCgpGUkVZQUVOVEVSEB8SEgoORlJFWUFGVUxMRU5URVIQIBIMCghTS0lQT1BFRBAhEhAKDF'\n    'JFQ09SRFNDUkVFThAiEgsKB0RVQkJJTkcQIxIKCgZMSVNURU4QJBIPCgtXQVRDSF9MQVRFUhAl'\n    'EhEKDVNZU1RFTV9SRUNPUkQQJg==');\n\n@$core.Deprecated('Use drmTechTypeDescriptor instead')\nconst DrmTechType$json = {\n  '1': 'DrmTechType',\n  '2': [\n    {'1': 'UNKNOWN_DRM', '2': 0},\n    {'1': 'FAIR_PLAY', '2': 1},\n    {'1': 'WIDE_VINE', '2': 2},\n    {'1': 'BILI_DRM', '2': 3},\n  ],\n};\n\n/// Descriptor for `DrmTechType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List drmTechTypeDescriptor = $convert.base64Decode(\n    'CgtEcm1UZWNoVHlwZRIPCgtVTktOT1dOX0RSTRAAEg0KCUZBSVJfUExBWRABEg0KCVdJREVfVk'\n    'lORRACEgwKCEJJTElfRFJNEAM=');\n\n@$core.Deprecated('Use effectsDescriptor instead')\nconst Effects$json = {\n  '1': 'Effects',\n  '2': [\n    {'1': 'EFFECTS_UNKNOWN', '2': 0},\n    {'1': 'GAUSSIAN_BLUR', '2': 1},\n    {'1': 'HALF_ALPHA', '2': 2},\n  ],\n};\n\n/// Descriptor for `Effects`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List effectsDescriptor = $convert.base64Decode(\n    'CgdFZmZlY3RzEhMKD0VGRkVDVFNfVU5LTk9XThAAEhEKDUdBVVNTSUFOX0JMVVIQARIOCgpIQU'\n    'xGX0FMUEhBEAI=');\n\n@$core.Deprecated('Use extDataTypeDescriptor instead')\nconst ExtDataType$json = {\n  '1': 'ExtDataType',\n  '2': [\n    {'1': 'EXT_DATA_TYPE_UNKNOWN', '2': 0},\n    {'1': 'PLAY_LIST', '2': 1},\n    {'1': 'BANNER', '2': 2},\n    {'1': 'HE_INLINE', '2': 3},\n    {'1': 'EXT_DATA_TYPE_CHARGING', '2': 4},\n    {'1': 'QR_CODE', '2': 5},\n  ],\n};\n\n/// Descriptor for `ExtDataType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List extDataTypeDescriptor = $convert.base64Decode(\n    'CgtFeHREYXRhVHlwZRIZChVFWFRfREFUQV9UWVBFX1VOS05PV04QABINCglQTEFZX0xJU1QQAR'\n    'IKCgZCQU5ORVIQAhINCglIRV9JTkxJTkUQAxIaChZFWFRfREFUQV9UWVBFX0NIQVJHSU5HEAQS'\n    'CwoHUVJfQ09ERRAF');\n\n@$core.Deprecated('Use foldStyleDescriptor instead')\nconst FoldStyle$json = {\n  '1': 'FoldStyle',\n  '2': [\n    {'1': 'FOLD_STYLE_UNSPECIFIED', '2': 0},\n    {'1': 'FOLD_STYLE_COUNT_DOWN', '2': 1},\n    {'1': 'FOLD_STYLE_ONLY_BUTTON', '2': 2},\n  ],\n};\n\n/// Descriptor for `FoldStyle`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List foldStyleDescriptor = $convert.base64Decode(\n    'CglGb2xkU3R5bGUSGgoWRk9MRF9TVFlMRV9VTlNQRUNJRklFRBAAEhkKFUZPTERfU1RZTEVfQ0'\n    '9VTlRfRE9XThABEhoKFkZPTERfU1RZTEVfT05MWV9CVVRUT04QAg==');\n\n@$core.Deprecated('Use fragmentPositionDescriptor instead')\nconst FragmentPosition$json = {\n  '1': 'FragmentPosition',\n  '2': [\n    {'1': 'INVALID', '2': 0},\n    {'1': 'PRE', '2': 1},\n    {'1': 'MIDDLE', '2': 2},\n    {'1': 'POST', '2': 3},\n  ],\n};\n\n/// Descriptor for `FragmentPosition`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List fragmentPositionDescriptor = $convert.base64Decode(\n    'ChBGcmFnbWVudFBvc2l0aW9uEgsKB0lOVkFMSUQQABIHCgNQUkUQARIKCgZNSURETEUQAhIICg'\n    'RQT1NUEAM=');\n\n@$core.Deprecated('Use fragmentTypeDescriptor instead')\nconst FragmentType$json = {\n  '1': 'FragmentType',\n  '2': [\n    {'1': 'UNKNOWN', '2': 0},\n    {'1': 'AD_FRAGMENT', '2': 1},\n    {'1': 'OGV_FRAGMENT', '2': 2},\n    {'1': 'PUGV_FRAGMENT', '2': 3},\n  ],\n};\n\n/// Descriptor for `FragmentType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List fragmentTypeDescriptor = $convert.base64Decode(\n    'CgxGcmFnbWVudFR5cGUSCwoHVU5LTk9XThAAEg8KC0FEX0ZSQUdNRU5UEAESEAoMT0dWX0ZSQU'\n    'dNRU5UEAISEQoNUFVHVl9GUkFHTUVOVBAD');\n\n@$core.Deprecated('Use groupStyleDescriptor instead')\nconst GroupStyle$json = {\n  '1': 'GroupStyle',\n  '2': [\n    {'1': 'GROUP_STYLE_DEFAULT', '2': 0},\n    {'1': 'GROUP_STYLE_HORIZON', '2': 1},\n  ],\n};\n\n/// Descriptor for `GroupStyle`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List groupStyleDescriptor = $convert.base64Decode(\n    'CgpHcm91cFN0eWxlEhcKE0dST1VQX1NUWUxFX0RFRkFVTFQQABIXChNHUk9VUF9TVFlMRV9IT1'\n    'JJWk9OEAE=');\n\n@$core.Deprecated('Use guideStyleDescriptor instead')\nconst GuideStyle$json = {\n  '1': 'GuideStyle',\n  '2': [\n    {'1': 'STYLE_UNKNOWN', '2': 0},\n    {'1': 'HORIZONTAL_IMAGE', '2': 1},\n    {'1': 'VERTICAL_TEXT', '2': 2},\n    {'1': 'SIMPLE_TEXT', '2': 3},\n    {'1': 'CHARGING_TEXT', '2': 4},\n    {'1': 'UNIVERSAL_INTERCEPT', '2': 5},\n    {'1': 'MSG_ATTACH_QR_CODE', '2': 6},\n  ],\n};\n\n/// Descriptor for `GuideStyle`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List guideStyleDescriptor = $convert.base64Decode(\n    'CgpHdWlkZVN0eWxlEhEKDVNUWUxFX1VOS05PV04QABIUChBIT1JJWk9OVEFMX0lNQUdFEAESEQ'\n    'oNVkVSVElDQUxfVEVYVBACEg8KC1NJTVBMRV9URVhUEAMSEQoNQ0hBUkdJTkdfVEVYVBAEEhcK'\n    'E1VOSVZFUlNBTF9JTlRFUkNFUFQQBRIWChJNU0dfQVRUQUNIX1FSX0NPREUQBg==');\n\n@$core.Deprecated('Use limitActionTypeDescriptor instead')\nconst LimitActionType$json = {\n  '1': 'LimitActionType',\n  '2': [\n    {'1': 'LAT_UNKNOWN', '2': 0},\n    {'1': 'SHOW_LIMIT_DIALOG', '2': 1},\n    {'1': 'SKIP_CURRENT_EP', '2': 2},\n  ],\n};\n\n/// Descriptor for `LimitActionType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List limitActionTypeDescriptor = $convert.base64Decode(\n    'Cg9MaW1pdEFjdGlvblR5cGUSDwoLTEFUX1VOS05PV04QABIVChFTSE9XX0xJTUlUX0RJQUxPRx'\n    'ABEhMKD1NLSVBfQ1VSUkVOVF9FUBAC');\n\n@$core.Deprecated('Use playCtrlDescriptor instead')\nconst PlayCtrl$json = {\n  '1': 'PlayCtrl',\n  '2': [\n    {'1': 'PLAY_CTRL_DEFAULT', '2': 0},\n    {'1': 'PLAY_CTRL_SIMPLE', '2': 1},\n  ],\n};\n\n/// Descriptor for `PlayCtrl`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List playCtrlDescriptor = $convert.base64Decode(\n    'CghQbGF5Q3RybBIVChFQTEFZX0NUUkxfREVGQVVMVBAAEhQKEFBMQVlfQ1RSTF9TSU1QTEUQAQ'\n    '==');\n\n@$core.Deprecated('Use playErrDescriptor instead')\nconst PlayErr$json = {\n  '1': 'PlayErr',\n  '2': [\n    {'1': 'NoErr', '2': 0},\n    {'1': 'WithMultiDeviceLoginErr', '2': 1},\n  ],\n};\n\n/// Descriptor for `PlayErr`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List playErrDescriptor = $convert.base64Decode(\n    'CgdQbGF5RXJyEgkKBU5vRXJyEAASGwoXV2l0aE11bHRpRGV2aWNlTG9naW5FcnIQAQ==');\n\n@$core.Deprecated('Use promptBarStyleDescriptor instead')\nconst PromptBarStyle$json = {\n  '1': 'PromptBarStyle',\n  '2': [\n    {'1': 'PROMPT_BAR_STYLE_UNKNOWN', '2': 0},\n    {'1': 'TEXT', '2': 1},\n    {'1': 'CURING_BENEFITS', '2': 2},\n    {'1': 'CARD_OPENING_GIFT', '2': 3},\n    {'1': 'COUNTDOWN', '2': 4},\n  ],\n};\n\n/// Descriptor for `PromptBarStyle`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List promptBarStyleDescriptor = $convert.base64Decode(\n    'Cg5Qcm9tcHRCYXJTdHlsZRIcChhQUk9NUFRfQkFSX1NUWUxFX1VOS05PV04QABIICgRURVhUEA'\n    'ESEwoPQ1VSSU5HX0JFTkVGSVRTEAISFQoRQ0FSRF9PUEVOSU5HX0dJRlQQAxINCglDT1VOVERP'\n    'V04QBA==');\n\n@$core.Deprecated('Use promptBarTypeDescriptor instead')\nconst PromptBarType$json = {\n  '1': 'PromptBarType',\n  '2': [\n    {'1': 'PROMPT_BAR_TYPE_UNKNOWN', '2': 0},\n    {'1': 'OPEN_PROMPT_BAR', '2': 1},\n    {'1': 'TRY_PROMPT_BAR', '2': 2},\n  ],\n};\n\n/// Descriptor for `PromptBarType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List promptBarTypeDescriptor = $convert.base64Decode(\n    'Cg1Qcm9tcHRCYXJUeXBlEhsKF1BST01QVF9CQVJfVFlQRV9VTktOT1dOEAASEwoPT1BFTl9QUk'\n    '9NUFRfQkFSEAESEgoOVFJZX1BST01QVF9CQVIQAg==');\n\n@$core.Deprecated('Use qnPolicyDescriptor instead')\nconst QnPolicy$json = {\n  '1': 'QnPolicy',\n  '2': [\n    {'1': 'QN_POLICY_DEFAULT', '2': 0},\n    {'1': 'QN_POLICY_AUTO_QN_ENABLE', '2': 1},\n  ],\n};\n\n/// Descriptor for `QnPolicy`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List qnPolicyDescriptor = $convert.base64Decode(\n    'CghRblBvbGljeRIVChFRTl9QT0xJQ1lfREVGQVVMVBAAEhwKGFFOX1BPTElDWV9BVVRPX1FOX0'\n    'VOQUJMRRAB');\n\n@$core.Deprecated('Use settingItemStyleDescriptor instead')\nconst SettingItemStyle$json = {\n  '1': 'SettingItemStyle',\n  '2': [\n    {'1': 'SETTING_STYLE_NONE', '2': 0},\n    {'1': 'SETTING_STYLE_SWITCH', '2': 1},\n    {'1': 'SETTING_STYLE_MORE', '2': 2},\n    {'1': 'SETTING_STYLE_SELECT', '2': 3},\n    {'1': 'SETTING_STYLE_VERTICAL', '2': 4},\n  ],\n};\n\n/// Descriptor for `SettingItemStyle`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List settingItemStyleDescriptor = $convert.base64Decode(\n    'ChBTZXR0aW5nSXRlbVN0eWxlEhYKElNFVFRJTkdfU1RZTEVfTk9ORRAAEhgKFFNFVFRJTkdfU1'\n    'RZTEVfU1dJVENIEAESFgoSU0VUVElOR19TVFlMRV9NT1JFEAISGAoUU0VUVElOR19TVFlMRV9T'\n    'RUxFQ1QQAxIaChZTRVRUSU5HX1NUWUxFX1ZFUlRJQ0FMEAQ=');\n\n@$core.Deprecated('Use settingItemTypeDescriptor instead')\nconst SettingItemType$json = {\n  '1': 'SettingItemType',\n  '2': [\n    {'1': 'SETTING_NONE', '2': 0},\n    {'1': 'SETTING_PLAYBACK_RATE', '2': 1},\n    {'1': 'SETTING_WATCH_LATER', '2': 2},\n    {'1': 'SETTING_DOWNlOAD', '2': 3},\n    {'1': 'SETTING_SMALL_WINDOW', '2': 4},\n    {'1': 'SETTING_FREYAENTER', '2': 5},\n    {'1': 'SETTING_PLAYBACK_MODE', '2': 6},\n    {'1': 'SETTING_LOOP_PLAYBACK', '2': 7},\n    {'1': 'SETTING_TIMING_SWITCH', '2': 8},\n    {'1': 'SETTING_BACKGROUND_PLAY', '2': 9},\n    {'1': 'SETTING_SUBTITLE', '2': 10},\n    {'1': 'SETTING_SUBTITLE_EXCHANGE', '2': 11},\n    {'1': 'SETTING_FLIP_CONF', '2': 12},\n    {'1': 'SETTING_MORE_PLAY', '2': 13},\n    {'1': 'SETTING_SHAKE', '2': 14},\n    {'1': 'SETTING_SKIP_OPED', '2': 15},\n    {'1': 'SETTING_NOTE', '2': 16},\n    {'1': 'SETTING_REPORT', '2': 17},\n    {'1': 'SETTING_FEEDBACK', '2': 18},\n    {'1': 'SETTING_FREE_GIFT', '2': 19},\n    {'1': 'SETTING_DUB', '2': 20},\n    {'1': 'SETTING_LISTEN', '2': 21},\n    {'1': 'SETTING_PROJECT', '2': 22},\n    {'1': 'SETTING_PIC_SIZE', '2': 23},\n    {'1': 'SETTING_PANORAMA', '2': 24},\n    {'1': 'SETTING_VISION_ASSIST', '2': 25},\n    {'1': 'SETTING_EDIT', '2': 26},\n    {'1': 'SETTING_DISLIKE', '2': 27},\n    {'1': 'SETTING_BIHUO', '2': 28},\n    {'1': 'SETTING_GESTURE', '2': 29},\n    {'1': 'SETTING_DM', '2': 30},\n    {'1': 'SETTING_DEFINITION', '2': 31},\n    {'1': 'SETTING_SUGGEST', '2': 32},\n    {'1': 'SETTING_AUTOMATIC_SCROLL', '2': 33},\n    {'1': 'SETTING_BACKTRACKING', '2': 34},\n    {'1': 'SETTING_AI_AUDIO', '2': 35},\n    {'1': 'SETTING_AI_AUDIO_EXCHANGE', '2': 36},\n  ],\n};\n\n/// Descriptor for `SettingItemType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List settingItemTypeDescriptor = $convert.base64Decode(\n    'Cg9TZXR0aW5nSXRlbVR5cGUSEAoMU0VUVElOR19OT05FEAASGQoVU0VUVElOR19QTEFZQkFDS1'\n    '9SQVRFEAESFwoTU0VUVElOR19XQVRDSF9MQVRFUhACEhQKEFNFVFRJTkdfRE9XTmxPQUQQAxIY'\n    'ChRTRVRUSU5HX1NNQUxMX1dJTkRPVxAEEhYKElNFVFRJTkdfRlJFWUFFTlRFUhAFEhkKFVNFVF'\n    'RJTkdfUExBWUJBQ0tfTU9ERRAGEhkKFVNFVFRJTkdfTE9PUF9QTEFZQkFDSxAHEhkKFVNFVFRJ'\n    'TkdfVElNSU5HX1NXSVRDSBAIEhsKF1NFVFRJTkdfQkFDS0dST1VORF9QTEFZEAkSFAoQU0VUVE'\n    'lOR19TVUJUSVRMRRAKEh0KGVNFVFRJTkdfU1VCVElUTEVfRVhDSEFOR0UQCxIVChFTRVRUSU5H'\n    'X0ZMSVBfQ09ORhAMEhUKEVNFVFRJTkdfTU9SRV9QTEFZEA0SEQoNU0VUVElOR19TSEFLRRAOEh'\n    'UKEVNFVFRJTkdfU0tJUF9PUEVEEA8SEAoMU0VUVElOR19OT1RFEBASEgoOU0VUVElOR19SRVBP'\n    'UlQQERIUChBTRVRUSU5HX0ZFRURCQUNLEBISFQoRU0VUVElOR19GUkVFX0dJRlQQExIPCgtTRV'\n    'RUSU5HX0RVQhAUEhIKDlNFVFRJTkdfTElTVEVOEBUSEwoPU0VUVElOR19QUk9KRUNUEBYSFAoQ'\n    'U0VUVElOR19QSUNfU0laRRAXEhQKEFNFVFRJTkdfUEFOT1JBTUEQGBIZChVTRVRUSU5HX1ZJU0'\n    'lPTl9BU1NJU1QQGRIQCgxTRVRUSU5HX0VESVQQGhITCg9TRVRUSU5HX0RJU0xJS0UQGxIRCg1T'\n    'RVRUSU5HX0JJSFVPEBwSEwoPU0VUVElOR19HRVNUVVJFEB0SDgoKU0VUVElOR19ETRAeEhYKEl'\n    'NFVFRJTkdfREVGSU5JVElPThAfEhMKD1NFVFRJTkdfU1VHR0VTVBAgEhwKGFNFVFRJTkdfQVVU'\n    'T01BVElDX1NDUk9MTBAhEhgKFFNFVFRJTkdfQkFDS1RSQUNLSU5HECISFAoQU0VUVElOR19BSV'\n    '9BVURJTxAjEh0KGVNFVFRJTkdfQUlfQVVESU9fRVhDSEFOR0UQJA==');\n\n@$core.Deprecated('Use settingJumpTypeDescriptor instead')\nconst SettingJumpType$json = {\n  '1': 'SettingJumpType',\n  '2': [\n    {'1': 'SETTING_JUMP_TYPE_NONE', '2': 0},\n    {'1': 'SETTING_JUMP_TYPE_OPEN_URL', '2': 1},\n    {'1': 'SETTING_JUMP_TYPE_HALF_SCREEN', '2': 2},\n    {'1': 'SETTING_JUMP_TYPE_OPEN_URL_BY_OUTER_BROWSER', '2': 3},\n  ],\n};\n\n/// Descriptor for `SettingJumpType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List settingJumpTypeDescriptor = $convert.base64Decode(\n    'Cg9TZXR0aW5nSnVtcFR5cGUSGgoWU0VUVElOR19KVU1QX1RZUEVfTk9ORRAAEh4KGlNFVFRJTk'\n    'dfSlVNUF9UWVBFX09QRU5fVVJMEAESIQodU0VUVElOR19KVU1QX1RZUEVfSEFMRl9TQ1JFRU4Q'\n    'AhIvCitTRVRUSU5HX0pVTVBfVFlQRV9PUEVOX1VSTF9CWV9PVVRFUl9CUk9XU0VSEAM=');\n\n@$core.Deprecated('Use showStyleTypeDescriptor instead')\nconst ShowStyleType$json = {\n  '1': 'ShowStyleType',\n  '2': [\n    {'1': 'SHOW_STYLE_TYPE_UNKNOWN', '2': 0},\n    {'1': 'SHOW_STYLE_TYPE_ORDINARY', '2': 1},\n    {'1': 'SHOW_STYLE_TYPE_RESIDENT', '2': 2},\n  ],\n};\n\n/// Descriptor for `ShowStyleType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List showStyleTypeDescriptor = $convert.base64Decode(\n    'Cg1TaG93U3R5bGVUeXBlEhsKF1NIT1dfU1RZTEVfVFlQRV9VTktOT1dOEAASHAoYU0hPV19TVF'\n    'lMRV9UWVBFX09SRElOQVJZEAESHAoYU0hPV19TVFlMRV9UWVBFX1JFU0lERU5UEAI=');\n\n@$core.Deprecated('Use toastTypeDescriptor instead')\nconst ToastType$json = {\n  '1': 'ToastType',\n  '2': [\n    {'1': 'TOAST_TYPE_UNKNOWN', '2': 0},\n    {'1': 'VIP_CONTENT_REMIND', '2': 1},\n    {'1': 'VIP_DEFINITION_REMIND', '2': 2},\n    {'1': 'VIP_DEFINITION_GUIDE', '2': 3},\n    {'1': 'OGV_VIDEO_START_TOAST', '2': 4},\n    {'1': 'CHARGING_TOAST', '2': 5},\n    {'1': 'VIP_SKIP_FRAGMENT_TOAST', '2': 6},\n    {'1': 'VIP_AI_FIX_DEFINITION_REMIND', '2': 7},\n    {'1': 'NEW_USER_DEFINITION_REMIND', '2': 8},\n    {'1': 'VIP_RISK_TOAST', '2': 9},\n  ],\n};\n\n/// Descriptor for `ToastType`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List toastTypeDescriptor = $convert.base64Decode(\n    'CglUb2FzdFR5cGUSFgoSVE9BU1RfVFlQRV9VTktOT1dOEAASFgoSVklQX0NPTlRFTlRfUkVNSU'\n    '5EEAESGQoVVklQX0RFRklOSVRJT05fUkVNSU5EEAISGAoUVklQX0RFRklOSVRJT05fR1VJREUQ'\n    'AxIZChVPR1ZfVklERU9fU1RBUlRfVE9BU1QQBBISCg5DSEFSR0lOR19UT0FTVBAFEhsKF1ZJUF'\n    '9TS0lQX0ZSQUdNRU5UX1RPQVNUEAYSIAocVklQX0FJX0ZJWF9ERUZJTklUSU9OX1JFTUlORBAH'\n    'Eh4KGk5FV19VU0VSX0RFRklOSVRJT05fUkVNSU5EEAgSEgoOVklQX1JJU0tfVE9BU1QQCQ==');\n\n@$core.Deprecated('Use unsupportSceneDescriptor instead')\nconst UnsupportScene$json = {\n  '1': 'UnsupportScene',\n  '2': [\n    {'1': 'UNKNOWN_SCENE', '2': 0},\n    {'1': 'PREMIERE', '2': 1},\n  ],\n};\n\n/// Descriptor for `UnsupportScene`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List unsupportSceneDescriptor = $convert.base64Decode(\n    'Cg5VbnN1cHBvcnRTY2VuZRIRCg1VTktOT1dOX1NDRU5FEAASDAoIUFJFTUlFUkUQAQ==');\n\n@$core.Deprecated('Use unsupportStateDescriptor instead')\nconst UnsupportState$json = {\n  '1': 'UnsupportState',\n  '2': [\n    {'1': 'NONE_UnsupportState', '2': 0},\n    {'1': 'HALF', '2': 1},\n    {'1': 'FULL', '2': 2},\n  ],\n};\n\n/// Descriptor for `UnsupportState`. Decode as a `google.protobuf.EnumDescriptorProto`.\nfinal $typed_data.Uint8List unsupportStateDescriptor = $convert.base64Decode(\n    'Cg5VbnN1cHBvcnRTdGF0ZRIXChNOT05FX1Vuc3VwcG9ydFN0YXRlEAASCAoESEFMRhABEggKBE'\n    'ZVTEwQAg==');\n\n@$core.Deprecated('Use aIAudioDescriptor instead')\nconst AIAudio$json = {\n  '1': 'AIAudio',\n  '2': [\n    {'1': 'support_ai_audio', '3': 1, '4': 1, '5': 8, '10': 'supportAiAudio'},\n    {\n      '1': 'ai_audio_items',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.AIAudioItem',\n      '10': 'aiAudioItems'\n    },\n    {'1': 'ai_open_toast', '3': 3, '4': 1, '5': 9, '10': 'aiOpenToast'},\n    {'1': 'ai_close_toast', '3': 4, '4': 1, '5': 9, '10': 'aiCloseToast'},\n    {\n      '1': 'badge',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.Badge',\n      '10': 'badge'\n    },\n    {'1': 'default_title', '3': 6, '4': 1, '5': 9, '10': 'defaultTitle'},\n    {'1': 'list_title', '3': 7, '4': 1, '5': 9, '10': 'listTitle'},\n    {'1': 'list_desc', '3': 8, '4': 1, '5': 9, '10': 'listDesc'},\n  ],\n};\n\n/// Descriptor for `AIAudio`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List aIAudioDescriptor = $convert.base64Decode(\n    'CgdBSUF1ZGlvEigKEHN1cHBvcnRfYWlfYXVkaW8YASABKAhSDnN1cHBvcnRBaUF1ZGlvEkgKDm'\n    'FpX2F1ZGlvX2l0ZW1zGAIgAygLMiIuYmlsaWJpbGkucGxheWVyc2hhcmVkLkFJQXVkaW9JdGVt'\n    'UgxhaUF1ZGlvSXRlbXMSIgoNYWlfb3Blbl90b2FzdBgDIAEoCVILYWlPcGVuVG9hc3QSJAoOYW'\n    'lfY2xvc2VfdG9hc3QYBCABKAlSDGFpQ2xvc2VUb2FzdBIyCgViYWRnZRgFIAEoCzIcLmJpbGli'\n    'aWxpLnBsYXllcnNoYXJlZC5CYWRnZVIFYmFkZ2USIwoNZGVmYXVsdF90aXRsZRgGIAEoCVIMZG'\n    'VmYXVsdFRpdGxlEh0KCmxpc3RfdGl0bGUYByABKAlSCWxpc3RUaXRsZRIbCglsaXN0X2Rlc2MY'\n    'CCABKAlSCGxpc3REZXNj');\n\n@$core.Deprecated('Use aIAudioItemDescriptor instead')\nconst AIAudioItem$json = {\n  '1': 'AIAudioItem',\n  '2': [\n    {\n      '1': 'audio_info',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.DashItem',\n      '10': 'audioInfo'\n    },\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'button_title', '3': 3, '4': 1, '5': 9, '10': 'buttonTitle'},\n    {'1': 'subtitle_lang', '3': 4, '4': 1, '5': 9, '10': 'subtitleLang'},\n  ],\n};\n\n/// Descriptor for `AIAudioItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List aIAudioItemDescriptor = $convert.base64Decode(\n    'CgtBSUF1ZGlvSXRlbRI+CgphdWRpb19pbmZvGAEgAygLMh8uYmlsaWJpbGkucGxheWVyc2hhcm'\n    'VkLkRhc2hJdGVtUglhdWRpb0luZm8SFAoFdGl0bGUYAiABKAlSBXRpdGxlEiEKDGJ1dHRvbl90'\n    'aXRsZRgDIAEoCVILYnV0dG9uVGl0bGUSIwoNc3VidGl0bGVfbGFuZxgEIAEoCVIMc3VidGl0bG'\n    'VMYW5n');\n\n@$core.Deprecated('Use arcConfDescriptor instead')\nconst ArcConf$json = {\n  '1': 'ArcConf',\n  '2': [\n    {'1': 'is_support', '3': 1, '4': 1, '5': 8, '10': 'isSupport'},\n    {'1': 'disabled', '3': 2, '4': 1, '5': 8, '10': 'disabled'},\n    {\n      '1': 'extra_content',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.ExtraContent',\n      '10': 'extraContent'\n    },\n    {'1': 'unsupport_scene', '3': 4, '4': 3, '5': 5, '10': 'unsupportScene'},\n    {\n      '1': 'unsupport_state',\n      '3': 5,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.UnsupportState',\n      '10': 'unsupportState'\n    },\n  ],\n};\n\n/// Descriptor for `ArcConf`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List arcConfDescriptor = $convert.base64Decode(\n    'CgdBcmNDb25mEh0KCmlzX3N1cHBvcnQYASABKAhSCWlzU3VwcG9ydBIaCghkaXNhYmxlZBgCIA'\n    'EoCFIIZGlzYWJsZWQSSAoNZXh0cmFfY29udGVudBgDIAEoCzIjLmJpbGliaWxpLnBsYXllcnNo'\n    'YXJlZC5FeHRyYUNvbnRlbnRSDGV4dHJhQ29udGVudBInCg91bnN1cHBvcnRfc2NlbmUYBCADKA'\n    'VSDnVuc3VwcG9ydFNjZW5lEk4KD3Vuc3VwcG9ydF9zdGF0ZRgFIAEoDjIlLmJpbGliaWxpLnBs'\n    'YXllcnNoYXJlZC5VbnN1cHBvcnRTdGF0ZVIOdW5zdXBwb3J0U3RhdGU=');\n\n@$core.Deprecated('Use autoQnCtlDescriptor instead')\nconst AutoQnCtl$json = {\n  '1': 'AutoQnCtl',\n  '2': [\n    {'1': 'login_half', '3': 1, '4': 1, '5': 3, '10': 'loginHalf'},\n    {'1': 'nologin_half', '3': 2, '4': 1, '5': 3, '10': 'nologinHalf'},\n    {'1': 'login_full', '3': 3, '4': 1, '5': 3, '10': 'loginFull'},\n    {'1': 'nologin_full', '3': 4, '4': 1, '5': 3, '10': 'nologinFull'},\n    {'1': 'mobile_login_full', '3': 5, '4': 1, '5': 3, '10': 'mobileLoginFull'},\n    {\n      '1': 'mobile_nologin_full',\n      '3': 6,\n      '4': 1,\n      '5': 3,\n      '10': 'mobileNologinFull'\n    },\n    {\n      '1': 'scene_qn_range',\n      '3': 7,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.AutoQnCtl.SceneQnRangeEntry',\n      '10': 'sceneQnRange'\n    },\n  ],\n  '3': [AutoQnCtl_SceneQnRangeEntry$json],\n};\n\n@$core.Deprecated('Use autoQnCtlDescriptor instead')\nconst AutoQnCtl_SceneQnRangeEntry$json = {\n  '1': 'SceneQnRangeEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {\n      '1': 'value',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.AutoQnRange',\n      '10': 'value'\n    },\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `AutoQnCtl`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List autoQnCtlDescriptor = $convert.base64Decode(\n    'CglBdXRvUW5DdGwSHQoKbG9naW5faGFsZhgBIAEoA1IJbG9naW5IYWxmEiEKDG5vbG9naW5faG'\n    'FsZhgCIAEoA1ILbm9sb2dpbkhhbGYSHQoKbG9naW5fZnVsbBgDIAEoA1IJbG9naW5GdWxsEiEK'\n    'DG5vbG9naW5fZnVsbBgEIAEoA1ILbm9sb2dpbkZ1bGwSKgoRbW9iaWxlX2xvZ2luX2Z1bGwYBS'\n    'ABKANSD21vYmlsZUxvZ2luRnVsbBIuChNtb2JpbGVfbm9sb2dpbl9mdWxsGAYgASgDUhFtb2Jp'\n    'bGVOb2xvZ2luRnVsbBJYCg5zY2VuZV9xbl9yYW5nZRgHIAMoCzIyLmJpbGliaWxpLnBsYXllcn'\n    'NoYXJlZC5BdXRvUW5DdGwuU2NlbmVRblJhbmdlRW50cnlSDHNjZW5lUW5SYW5nZRpjChFTY2Vu'\n    'ZVFuUmFuZ2VFbnRyeRIQCgNrZXkYASABKAlSA2tleRI4CgV2YWx1ZRgCIAEoCzIiLmJpbGliaW'\n    'xpLnBsYXllcnNoYXJlZC5BdXRvUW5SYW5nZVIFdmFsdWU6AjgB');\n\n@$core.Deprecated('Use autoQnRangeDescriptor instead')\nconst AutoQnRange$json = {\n  '1': 'AutoQnRange',\n  '2': [\n    {'1': 'max', '3': 1, '4': 1, '5': 3, '10': 'max'},\n    {'1': 'min', '3': 2, '4': 1, '5': 3, '10': 'min'},\n  ],\n};\n\n/// Descriptor for `AutoQnRange`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List autoQnRangeDescriptor = $convert.base64Decode(\n    'CgtBdXRvUW5SYW5nZRIQCgNtYXgYASABKANSA21heBIQCgNtaW4YAiABKANSA21pbg==');\n\n@$core.Deprecated('Use backgroundInfoDescriptor instead')\nconst BackgroundInfo$json = {\n  '1': 'BackgroundInfo',\n  '2': [\n    {'1': 'drawable_color', '3': 1, '4': 1, '5': 9, '10': 'drawableColor'},\n    {\n      '1': 'drawable_bitmap_url',\n      '3': 2,\n      '4': 1,\n      '5': 9,\n      '10': 'drawableBitmapUrl'\n    },\n    {\n      '1': 'effects',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.Effects',\n      '10': 'effects'\n    },\n  ],\n};\n\n/// Descriptor for `BackgroundInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List backgroundInfoDescriptor = $convert.base64Decode(\n    'Cg5CYWNrZ3JvdW5kSW5mbxIlCg5kcmF3YWJsZV9jb2xvchgBIAEoCVINZHJhd2FibGVDb2xvch'\n    'IuChNkcmF3YWJsZV9iaXRtYXBfdXJsGAIgASgJUhFkcmF3YWJsZUJpdG1hcFVybBI4CgdlZmZl'\n    'Y3RzGAMgASgOMh4uYmlsaWJpbGkucGxheWVyc2hhcmVkLkVmZmVjdHNSB2VmZmVjdHM=');\n\n@$core.Deprecated('Use badgeDescriptor instead')\nconst Badge$json = {\n  '1': 'Badge',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'text_color', '3': 2, '4': 1, '5': 9, '10': 'textColor'},\n    {'1': 'text_color_night', '3': 3, '4': 1, '5': 9, '10': 'textColorNight'},\n    {'1': 'bg_color', '3': 4, '4': 1, '5': 9, '10': 'bgColor'},\n    {'1': 'bg_color_night', '3': 5, '4': 1, '5': 9, '10': 'bgColorNight'},\n    {'1': 'border_color', '3': 6, '4': 1, '5': 9, '10': 'borderColor'},\n    {\n      '1': 'border_color_night',\n      '3': 7,\n      '4': 1,\n      '5': 9,\n      '10': 'borderColorNight'\n    },\n    {'1': 'bg_style', '3': 8, '4': 1, '5': 5, '10': 'bgStyle'},\n  ],\n};\n\n/// Descriptor for `Badge`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List badgeDescriptor = $convert.base64Decode(\n    'CgVCYWRnZRISCgR0ZXh0GAEgASgJUgR0ZXh0Eh0KCnRleHRfY29sb3IYAiABKAlSCXRleHRDb2'\n    'xvchIoChB0ZXh0X2NvbG9yX25pZ2h0GAMgASgJUg50ZXh0Q29sb3JOaWdodBIZCghiZ19jb2xv'\n    'chgEIAEoCVIHYmdDb2xvchIkCg5iZ19jb2xvcl9uaWdodBgFIAEoCVIMYmdDb2xvck5pZ2h0Ei'\n    'EKDGJvcmRlcl9jb2xvchgGIAEoCVILYm9yZGVyQ29sb3ISLAoSYm9yZGVyX2NvbG9yX25pZ2h0'\n    'GAcgASgJUhBib3JkZXJDb2xvck5pZ2h0EhkKCGJnX3N0eWxlGAggASgFUgdiZ1N0eWxl');\n\n@$core.Deprecated('Use badgeInfoDescriptor instead')\nconst BadgeInfo$json = {\n  '1': 'BadgeInfo',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'bg_color', '3': 2, '4': 1, '5': 9, '10': 'bgColor'},\n    {'1': 'bg_color_night', '3': 3, '4': 1, '5': 9, '10': 'bgColorNight'},\n    {'1': 'text_color', '3': 4, '4': 1, '5': 9, '10': 'textColor'},\n    {\n      '1': 'bg_gradient_color',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.GradientColor',\n      '10': 'bgGradientColor'\n    },\n    {'1': 'img', '3': 6, '4': 1, '5': 9, '10': 'img'},\n  ],\n};\n\n/// Descriptor for `BadgeInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List badgeInfoDescriptor = $convert.base64Decode(\n    'CglCYWRnZUluZm8SEgoEdGV4dBgBIAEoCVIEdGV4dBIZCghiZ19jb2xvchgCIAEoCVIHYmdDb2'\n    'xvchIkCg5iZ19jb2xvcl9uaWdodBgDIAEoCVIMYmdDb2xvck5pZ2h0Eh0KCnRleHRfY29sb3IY'\n    'BCABKAlSCXRleHRDb2xvchJQChFiZ19ncmFkaWVudF9jb2xvchgFIAEoCzIkLmJpbGliaWxpLn'\n    'BsYXllcnNoYXJlZC5HcmFkaWVudENvbG9yUg9iZ0dyYWRpZW50Q29sb3ISEAoDaW1nGAYgASgJ'\n    'UgNpbWc=');\n\n@$core.Deprecated('Use bannerDescriptor instead')\nconst Banner$json = {\n  '1': 'Banner',\n  '2': [\n    {'1': 'jump_link', '3': 1, '4': 1, '5': 9, '10': 'jumpLink'},\n    {'1': 'image_link', '3': 2, '4': 1, '5': 9, '10': 'imageLink'},\n    {'1': 'half_image_link', '3': 3, '4': 1, '5': 9, '10': 'halfImageLink'},\n    {\n      '1': 'report',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.Report',\n      '10': 'report'\n    },\n  ],\n};\n\n/// Descriptor for `Banner`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bannerDescriptor = $convert.base64Decode(\n    'CgZCYW5uZXISGwoJanVtcF9saW5rGAEgASgJUghqdW1wTGluaxIdCgppbWFnZV9saW5rGAIgAS'\n    'gJUglpbWFnZUxpbmsSJgoPaGFsZl9pbWFnZV9saW5rGAMgASgJUg1oYWxmSW1hZ2VMaW5rEjUK'\n    'BnJlcG9ydBgEIAEoCzIdLmJpbGliaWxpLnBsYXllcnNoYXJlZC5SZXBvcnRSBnJlcG9ydA==');\n\n@$core.Deprecated('Use benefitInfoDescriptor instead')\nconst BenefitInfo$json = {\n  '1': 'BenefitInfo',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'icon', '3': 2, '4': 1, '5': 9, '10': 'icon'},\n  ],\n};\n\n/// Descriptor for `BenefitInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List benefitInfoDescriptor = $convert.base64Decode(\n    'CgtCZW5lZml0SW5mbxIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSEgoEaWNvbhgCIAEoCVIEaWNvbg'\n    '==');\n\n@$core.Deprecated('Use bottomDisplayDescriptor instead')\nconst BottomDisplay$json = {\n  '1': 'BottomDisplay',\n  '2': [\n    {\n      '1': 'title',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.TextInfo',\n      '10': 'title'\n    },\n    {'1': 'icon', '3': 2, '4': 1, '5': 9, '10': 'icon'},\n  ],\n};\n\n/// Descriptor for `BottomDisplay`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List bottomDisplayDescriptor = $convert.base64Decode(\n    'Cg1Cb3R0b21EaXNwbGF5EjUKBXRpdGxlGAEgASgLMh8uYmlsaWJpbGkucGxheWVyc2hhcmVkLl'\n    'RleHRJbmZvUgV0aXRsZRISCgRpY29uGAIgASgJUgRpY29u');\n\n@$core.Deprecated('Use buttonDescriptor instead')\nconst Button$json = {\n  '1': 'Button',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'link', '3': 2, '4': 1, '5': 9, '10': 'link'},\n    {\n      '1': 'report_params',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.Button.ReportParamsEntry',\n      '10': 'reportParams'\n    },\n  ],\n  '3': [Button_ReportParamsEntry$json],\n};\n\n@$core.Deprecated('Use buttonDescriptor instead')\nconst Button_ReportParamsEntry$json = {\n  '1': 'ReportParamsEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `Button`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List buttonDescriptor = $convert.base64Decode(\n    'CgZCdXR0b24SEgoEdGV4dBgBIAEoCVIEdGV4dBISCgRsaW5rGAIgASgJUgRsaW5rElQKDXJlcG'\n    '9ydF9wYXJhbXMYAyADKAsyLy5iaWxpYmlsaS5wbGF5ZXJzaGFyZWQuQnV0dG9uLlJlcG9ydFBh'\n    'cmFtc0VudHJ5UgxyZXBvcnRQYXJhbXMaPwoRUmVwb3J0UGFyYW1zRW50cnkSEAoDa2V5GAEgAS'\n    'gJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4AQ==');\n\n@$core.Deprecated('Use buttonInfoDescriptor instead')\nconst ButtonInfo$json = {\n  '1': 'ButtonInfo',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'text_color', '3': 2, '4': 1, '5': 9, '10': 'textColor'},\n    {'1': 'text_color_night', '3': 3, '4': 1, '5': 9, '10': 'textColorNight'},\n    {'1': 'bg_color', '3': 4, '4': 1, '5': 9, '10': 'bgColor'},\n    {'1': 'bg_color_night', '3': 5, '4': 1, '5': 9, '10': 'bgColorNight'},\n    {'1': 'link', '3': 6, '4': 1, '5': 9, '10': 'link'},\n    {\n      '1': 'action_type',\n      '3': 7,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.ButtonAction',\n      '10': 'actionType'\n    },\n    {\n      '1': 'badge_info',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.BadgeInfo',\n      '10': 'badgeInfo'\n    },\n    {\n      '1': 'report',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.Report',\n      '10': 'report'\n    },\n    {\n      '1': 'left_strikethrough_text',\n      '3': 10,\n      '4': 1,\n      '5': 9,\n      '10': 'leftStrikethroughText'\n    },\n    {\n      '1': 'simple_text_info',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.TextInfo',\n      '10': 'simpleTextInfo'\n    },\n    {'1': 'simple_bg_color', '3': 12, '4': 1, '5': 9, '10': 'simpleBgColor'},\n    {\n      '1': 'simple_bg_color_night',\n      '3': 13,\n      '4': 1,\n      '5': 9,\n      '10': 'simpleBgColorNight'\n    },\n    {\n      '1': 'bg_gradient_color',\n      '3': 14,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.GradientColor',\n      '10': 'bgGradientColor'\n    },\n    {\n      '1': 'order_report_params',\n      '3': 15,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.ButtonInfo.OrderReportParamsEntry',\n      '10': 'orderReportParams'\n    },\n    {\n      '1': 'task_param',\n      '3': 16,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.TaskParam',\n      '10': 'taskParam'\n    },\n    {'1': 'frame_color', '3': 17, '4': 1, '5': 9, '10': 'frameColor'},\n    {'1': 'icon', '3': 18, '4': 1, '5': 9, '10': 'icon'},\n    {'1': 'font_size', '3': 19, '4': 1, '5': 5, '10': 'fontSize'},\n    {'1': 'tips_link', '3': 20, '4': 1, '5': 9, '10': 'tipsLink'},\n    {'1': 'deliver_code', '3': 21, '4': 1, '5': 9, '10': 'deliverCode'},\n  ],\n  '3': [ButtonInfo_OrderReportParamsEntry$json],\n};\n\n@$core.Deprecated('Use buttonInfoDescriptor instead')\nconst ButtonInfo_OrderReportParamsEntry$json = {\n  '1': 'OrderReportParamsEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `ButtonInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List buttonInfoDescriptor = $convert.base64Decode(\n    'CgpCdXR0b25JbmZvEhIKBHRleHQYASABKAlSBHRleHQSHQoKdGV4dF9jb2xvchgCIAEoCVIJdG'\n    'V4dENvbG9yEigKEHRleHRfY29sb3JfbmlnaHQYAyABKAlSDnRleHRDb2xvck5pZ2h0EhkKCGJn'\n    'X2NvbG9yGAQgASgJUgdiZ0NvbG9yEiQKDmJnX2NvbG9yX25pZ2h0GAUgASgJUgxiZ0NvbG9yTm'\n    'lnaHQSEgoEbGluaxgGIAEoCVIEbGluaxJECgthY3Rpb25fdHlwZRgHIAEoDjIjLmJpbGliaWxp'\n    'LnBsYXllcnNoYXJlZC5CdXR0b25BY3Rpb25SCmFjdGlvblR5cGUSPwoKYmFkZ2VfaW5mbxgIIA'\n    'EoCzIgLmJpbGliaWxpLnBsYXllcnNoYXJlZC5CYWRnZUluZm9SCWJhZGdlSW5mbxI1CgZyZXBv'\n    'cnQYCSABKAsyHS5iaWxpYmlsaS5wbGF5ZXJzaGFyZWQuUmVwb3J0UgZyZXBvcnQSNgoXbGVmdF'\n    '9zdHJpa2V0aHJvdWdoX3RleHQYCiABKAlSFWxlZnRTdHJpa2V0aHJvdWdoVGV4dBJJChBzaW1w'\n    'bGVfdGV4dF9pbmZvGAsgASgLMh8uYmlsaWJpbGkucGxheWVyc2hhcmVkLlRleHRJbmZvUg5zaW'\n    '1wbGVUZXh0SW5mbxImCg9zaW1wbGVfYmdfY29sb3IYDCABKAlSDXNpbXBsZUJnQ29sb3ISMQoV'\n    'c2ltcGxlX2JnX2NvbG9yX25pZ2h0GA0gASgJUhJzaW1wbGVCZ0NvbG9yTmlnaHQSUAoRYmdfZ3'\n    'JhZGllbnRfY29sb3IYDiABKAsyJC5iaWxpYmlsaS5wbGF5ZXJzaGFyZWQuR3JhZGllbnRDb2xv'\n    'clIPYmdHcmFkaWVudENvbG9yEmgKE29yZGVyX3JlcG9ydF9wYXJhbXMYDyADKAsyOC5iaWxpYm'\n    'lsaS5wbGF5ZXJzaGFyZWQuQnV0dG9uSW5mby5PcmRlclJlcG9ydFBhcmFtc0VudHJ5UhFvcmRl'\n    'clJlcG9ydFBhcmFtcxI/Cgp0YXNrX3BhcmFtGBAgASgLMiAuYmlsaWJpbGkucGxheWVyc2hhcm'\n    'VkLlRhc2tQYXJhbVIJdGFza1BhcmFtEh8KC2ZyYW1lX2NvbG9yGBEgASgJUgpmcmFtZUNvbG9y'\n    'EhIKBGljb24YEiABKAlSBGljb24SGwoJZm9udF9zaXplGBMgASgFUghmb250U2l6ZRIbCgl0aX'\n    'BzX2xpbmsYFCABKAlSCHRpcHNMaW5rEiEKDGRlbGl2ZXJfY29kZRgVIAEoCVILZGVsaXZlckNv'\n    'ZGUaRAoWT3JkZXJSZXBvcnRQYXJhbXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZR'\n    'gCIAEoCVIFdmFsdWU6AjgB');\n\n@$core.Deprecated('Use chargingExtDescriptor instead')\nconst ChargingExt$json = {\n  '1': 'ChargingExt',\n  '2': [\n    {'1': 'hide_bg_img', '3': 1, '4': 1, '5': 8, '10': 'hideBgImg'},\n  ],\n};\n\n/// Descriptor for `ChargingExt`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List chargingExtDescriptor = $convert.base64Decode(\n    'CgtDaGFyZ2luZ0V4dBIeCgtoaWRlX2JnX2ltZxgBIAEoCFIJaGlkZUJnSW1n');\n\n@$core.Deprecated('Use comprehensiveToastDescriptor instead')\nconst ComprehensiveToast$json = {\n  '1': 'ComprehensiveToast',\n  '2': [\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.ToastType',\n      '10': 'type'\n    },\n    {\n      '1': 'button',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.ButtonInfo',\n      '10': 'button'\n    },\n    {\n      '1': 'show_style_type',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.ShowStyleType',\n      '10': 'showStyleType'\n    },\n    {'1': 'icon', '3': 4, '4': 1, '5': 9, '10': 'icon'},\n    {\n      '1': 'toast_text',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.TextInfo',\n      '10': 'toastText'\n    },\n    {\n      '1': 'report',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.Report',\n      '10': 'report'\n    },\n    {\n      '1': 'order_report_params',\n      '3': 7,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.ComprehensiveToast.OrderReportParamsEntry',\n      '10': 'orderReportParams'\n    },\n  ],\n  '3': [ComprehensiveToast_OrderReportParamsEntry$json],\n};\n\n@$core.Deprecated('Use comprehensiveToastDescriptor instead')\nconst ComprehensiveToast_OrderReportParamsEntry$json = {\n  '1': 'OrderReportParamsEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `ComprehensiveToast`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List comprehensiveToastDescriptor = $convert.base64Decode(\n    'ChJDb21wcmVoZW5zaXZlVG9hc3QSNAoEdHlwZRgBIAEoDjIgLmJpbGliaWxpLnBsYXllcnNoYX'\n    'JlZC5Ub2FzdFR5cGVSBHR5cGUSOQoGYnV0dG9uGAIgASgLMiEuYmlsaWJpbGkucGxheWVyc2hh'\n    'cmVkLkJ1dHRvbkluZm9SBmJ1dHRvbhJMCg9zaG93X3N0eWxlX3R5cGUYAyABKA4yJC5iaWxpYm'\n    'lsaS5wbGF5ZXJzaGFyZWQuU2hvd1N0eWxlVHlwZVINc2hvd1N0eWxlVHlwZRISCgRpY29uGAQg'\n    'ASgJUgRpY29uEj4KCnRvYXN0X3RleHQYBSABKAsyHy5iaWxpYmlsaS5wbGF5ZXJzaGFyZWQuVG'\n    'V4dEluZm9SCXRvYXN0VGV4dBI1CgZyZXBvcnQYBiABKAsyHS5iaWxpYmlsaS5wbGF5ZXJzaGFy'\n    'ZWQuUmVwb3J0UgZyZXBvcnQScAoTb3JkZXJfcmVwb3J0X3BhcmFtcxgHIAMoCzJALmJpbGliaW'\n    'xpLnBsYXllcnNoYXJlZC5Db21wcmVoZW5zaXZlVG9hc3QuT3JkZXJSZXBvcnRQYXJhbXNFbnRy'\n    'eVIRb3JkZXJSZXBvcnRQYXJhbXMaRAoWT3JkZXJSZXBvcnRQYXJhbXNFbnRyeRIQCgNrZXkYAS'\n    'ABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgB');\n\n@$core.Deprecated('Use confValueDescriptor instead')\nconst ConfValue$json = {\n  '1': 'ConfValue',\n  '2': [\n    {'1': 'switch_val', '3': 1, '4': 1, '5': 8, '9': 0, '10': 'switchVal'},\n    {'1': 'selected_val', '3': 2, '4': 1, '5': 3, '9': 0, '10': 'selectedVal'},\n  ],\n  '8': [\n    {'1': 'value'},\n  ],\n};\n\n/// Descriptor for `ConfValue`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List confValueDescriptor = $convert.base64Decode(\n    'CglDb25mVmFsdWUSHwoKc3dpdGNoX3ZhbBgBIAEoCEgAUglzd2l0Y2hWYWwSIwoMc2VsZWN0ZW'\n    'RfdmFsGAIgASgDSABSC3NlbGVjdGVkVmFsQgcKBXZhbHVl');\n\n@$core.Deprecated('Use countDownItemDescriptor instead')\nconst CountDownItem$json = {\n  '1': 'CountDownItem',\n  '2': [\n    {'1': 'fold_countdown', '3': 1, '4': 1, '5': 3, '10': 'foldCountdown'},\n    {\n      '1': 'title',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.TextInfo',\n      '10': 'title'\n    },\n    {\n      '1': 'subtitle',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.TextInfo',\n      '10': 'subtitle'\n    },\n  ],\n};\n\n/// Descriptor for `CountDownItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List countDownItemDescriptor = $convert.base64Decode(\n    'Cg1Db3VudERvd25JdGVtEiUKDmZvbGRfY291bnRkb3duGAEgASgDUg1mb2xkQ291bnRkb3duEj'\n    'UKBXRpdGxlGAIgASgLMh8uYmlsaWJpbGkucGxheWVyc2hhcmVkLlRleHRJbmZvUgV0aXRsZRI7'\n    'CghzdWJ0aXRsZRgDIAEoCzIfLmJpbGliaWxpLnBsYXllcnNoYXJlZC5UZXh0SW5mb1IIc3VidG'\n    'l0bGU=');\n\n@$core.Deprecated('Use dashItemDescriptor instead')\nconst DashItem$json = {\n  '1': 'DashItem',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 5, '10': 'id'},\n    {'1': 'base_url', '3': 2, '4': 1, '5': 9, '10': 'baseUrl'},\n    {'1': 'backup_url', '3': 3, '4': 3, '5': 9, '10': 'backupUrl'},\n    {'1': 'bandwidth', '3': 4, '4': 1, '5': 5, '10': 'bandwidth'},\n    {'1': 'codecid', '3': 5, '4': 1, '5': 5, '10': 'codecid'},\n    {'1': 'md5', '3': 6, '4': 1, '5': 9, '10': 'md5'},\n    {'1': 'size', '3': 7, '4': 1, '5': 3, '10': 'size'},\n    {'1': 'frame_rate', '3': 8, '4': 1, '5': 9, '10': 'frameRate'},\n    {'1': 'widevine_pssh', '3': 9, '4': 1, '5': 9, '10': 'widevinePssh'},\n    {'1': 'bilidrm_uri', '3': 10, '4': 1, '5': 9, '10': 'bilidrmUri'},\n  ],\n};\n\n/// Descriptor for `DashItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dashItemDescriptor = $convert.base64Decode(\n    'CghEYXNoSXRlbRIOCgJpZBgBIAEoBVICaWQSGQoIYmFzZV91cmwYAiABKAlSB2Jhc2VVcmwSHQ'\n    'oKYmFja3VwX3VybBgDIAMoCVIJYmFja3VwVXJsEhwKCWJhbmR3aWR0aBgEIAEoBVIJYmFuZHdp'\n    'ZHRoEhgKB2NvZGVjaWQYBSABKAVSB2NvZGVjaWQSEAoDbWQ1GAYgASgJUgNtZDUSEgoEc2l6ZR'\n    'gHIAEoA1IEc2l6ZRIdCgpmcmFtZV9yYXRlGAggASgJUglmcmFtZVJhdGUSIwoNd2lkZXZpbmVf'\n    'cHNzaBgJIAEoCVIMd2lkZXZpbmVQc3NoEh8KC2JpbGlkcm1fdXJpGAogASgJUgpiaWxpZHJtVX'\n    'Jp');\n\n@$core.Deprecated('Use dashVideoDescriptor instead')\nconst DashVideo$json = {\n  '1': 'DashVideo',\n  '2': [\n    {'1': 'base_url', '3': 1, '4': 1, '5': 9, '10': 'baseUrl'},\n    {'1': 'backup_url', '3': 2, '4': 3, '5': 9, '10': 'backupUrl'},\n    {'1': 'bandwidth', '3': 3, '4': 1, '5': 5, '10': 'bandwidth'},\n    {'1': 'codecid', '3': 4, '4': 1, '5': 5, '10': 'codecid'},\n    {'1': 'md5', '3': 5, '4': 1, '5': 9, '10': 'md5'},\n    {'1': 'size', '3': 6, '4': 1, '5': 3, '10': 'size'},\n    {'1': 'audio_id', '3': 7, '4': 1, '5': 5, '10': 'audioId'},\n    {'1': 'no_rexcode', '3': 8, '4': 1, '5': 8, '10': 'noRexcode'},\n    {'1': 'frame_rate', '3': 9, '4': 1, '5': 9, '10': 'frameRate'},\n    {'1': 'width', '3': 10, '4': 1, '5': 5, '10': 'width'},\n    {'1': 'height', '3': 11, '4': 1, '5': 5, '10': 'height'},\n    {'1': 'widevine_pssh', '3': 12, '4': 1, '5': 9, '10': 'widevinePssh'},\n    {'1': 'bilidrm_uri', '3': 13, '4': 1, '5': 9, '10': 'bilidrmUri'},\n  ],\n};\n\n/// Descriptor for `DashVideo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dashVideoDescriptor = $convert.base64Decode(\n    'CglEYXNoVmlkZW8SGQoIYmFzZV91cmwYASABKAlSB2Jhc2VVcmwSHQoKYmFja3VwX3VybBgCIA'\n    'MoCVIJYmFja3VwVXJsEhwKCWJhbmR3aWR0aBgDIAEoBVIJYmFuZHdpZHRoEhgKB2NvZGVjaWQY'\n    'BCABKAVSB2NvZGVjaWQSEAoDbWQ1GAUgASgJUgNtZDUSEgoEc2l6ZRgGIAEoA1IEc2l6ZRIZCg'\n    'hhdWRpb19pZBgHIAEoBVIHYXVkaW9JZBIdCgpub19yZXhjb2RlGAggASgIUglub1JleGNvZGUS'\n    'HQoKZnJhbWVfcmF0ZRgJIAEoCVIJZnJhbWVSYXRlEhQKBXdpZHRoGAogASgFUgV3aWR0aBIWCg'\n    'ZoZWlnaHQYCyABKAVSBmhlaWdodBIjCg13aWRldmluZV9wc3NoGAwgASgJUgx3aWRldmluZVBz'\n    'c2gSHwoLYmlsaWRybV91cmkYDSABKAlSCmJpbGlkcm1Vcmk=');\n\n@$core.Deprecated('Use deviceConfDescriptor instead')\nconst DeviceConf$json = {\n  '1': 'DeviceConf',\n  '2': [\n    {\n      '1': 'conf_value',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.ConfValue',\n      '10': 'confValue'\n    },\n  ],\n};\n\n/// Descriptor for `DeviceConf`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List deviceConfDescriptor = $convert.base64Decode(\n    'CgpEZXZpY2VDb25mEj8KCmNvbmZfdmFsdWUYASABKAsyIC5iaWxpYmlsaS5wbGF5ZXJzaGFyZW'\n    'QuQ29uZlZhbHVlUgljb25mVmFsdWU=');\n\n@$core.Deprecated('Use dialogDescriptor instead')\nconst Dialog$json = {\n  '1': 'Dialog',\n  '2': [\n    {\n      '1': 'style_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.GuideStyle',\n      '10': 'styleType'\n    },\n    {\n      '1': 'background_info',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.BackgroundInfo',\n      '10': 'backgroundInfo'\n    },\n    {\n      '1': 'title',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.TextInfo',\n      '10': 'title'\n    },\n    {\n      '1': 'subtitle',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.TextInfo',\n      '10': 'subtitle'\n    },\n    {\n      '1': 'image',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.ImageInfo',\n      '10': 'image'\n    },\n    {\n      '1': 'button',\n      '3': 6,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.ButtonInfo',\n      '10': 'button'\n    },\n    {\n      '1': 'bottom_desc',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.ButtonInfo',\n      '10': 'bottomDesc'\n    },\n    {\n      '1': 'report',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.Report',\n      '10': 'report'\n    },\n    {'1': 'count_down_sec', '3': 9, '4': 1, '5': 5, '10': 'countDownSec'},\n    {\n      '1': 'right_bottom_desc',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.TextInfo',\n      '10': 'rightBottomDesc'\n    },\n    {\n      '1': 'bottom_display',\n      '3': 11,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.BottomDisplay',\n      '10': 'bottomDisplay'\n    },\n    {\n      '1': 'ext_data',\n      '3': 12,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.ExtData',\n      '10': 'extData'\n    },\n    {\n      '1': 'limit_action_type',\n      '3': 13,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.LimitActionType',\n      '10': 'limitActionType'\n    },\n    {'1': 'is_hide_more_btn', '3': 14, '4': 1, '5': 5, '10': 'isHideMoreBtn'},\n    {\n      '1': 'hide_button_on_half',\n      '3': 15,\n      '4': 1,\n      '5': 5,\n      '10': 'hideButtonOnHalf'\n    },\n    {'1': 'deliver_win_id', '3': 16, '4': 1, '5': 9, '10': 'deliverWinId'},\n    {\n      '1': 'conditions',\n      '3': 17,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.Dialog.ConditionsEntry',\n      '10': 'conditions'\n    },\n  ],\n  '3': [Dialog_ConditionsEntry$json],\n};\n\n@$core.Deprecated('Use dialogDescriptor instead')\nconst Dialog_ConditionsEntry$json = {\n  '1': 'ConditionsEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `Dialog`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dialogDescriptor = $convert.base64Decode(\n    'CgZEaWFsb2cSQAoKc3R5bGVfdHlwZRgBIAEoDjIhLmJpbGliaWxpLnBsYXllcnNoYXJlZC5HdW'\n    'lkZVN0eWxlUglzdHlsZVR5cGUSTgoPYmFja2dyb3VuZF9pbmZvGAIgASgLMiUuYmlsaWJpbGku'\n    'cGxheWVyc2hhcmVkLkJhY2tncm91bmRJbmZvUg5iYWNrZ3JvdW5kSW5mbxI1CgV0aXRsZRgDIA'\n    'EoCzIfLmJpbGliaWxpLnBsYXllcnNoYXJlZC5UZXh0SW5mb1IFdGl0bGUSOwoIc3VidGl0bGUY'\n    'BCABKAsyHy5iaWxpYmlsaS5wbGF5ZXJzaGFyZWQuVGV4dEluZm9SCHN1YnRpdGxlEjYKBWltYW'\n    'dlGAUgASgLMiAuYmlsaWJpbGkucGxheWVyc2hhcmVkLkltYWdlSW5mb1IFaW1hZ2USOQoGYnV0'\n    'dG9uGAYgAygLMiEuYmlsaWJpbGkucGxheWVyc2hhcmVkLkJ1dHRvbkluZm9SBmJ1dHRvbhJCCg'\n    'tib3R0b21fZGVzYxgHIAEoCzIhLmJpbGliaWxpLnBsYXllcnNoYXJlZC5CdXR0b25JbmZvUgpi'\n    'b3R0b21EZXNjEjUKBnJlcG9ydBgIIAEoCzIdLmJpbGliaWxpLnBsYXllcnNoYXJlZC5SZXBvcn'\n    'RSBnJlcG9ydBIkCg5jb3VudF9kb3duX3NlYxgJIAEoBVIMY291bnREb3duU2VjEksKEXJpZ2h0'\n    'X2JvdHRvbV9kZXNjGAogASgLMh8uYmlsaWJpbGkucGxheWVyc2hhcmVkLlRleHRJbmZvUg9yaW'\n    'dodEJvdHRvbURlc2MSSwoOYm90dG9tX2Rpc3BsYXkYCyADKAsyJC5iaWxpYmlsaS5wbGF5ZXJz'\n    'aGFyZWQuQm90dG9tRGlzcGxheVINYm90dG9tRGlzcGxheRI5CghleHRfZGF0YRgMIAEoCzIeLm'\n    'JpbGliaWxpLnBsYXllcnNoYXJlZC5FeHREYXRhUgdleHREYXRhElIKEWxpbWl0X2FjdGlvbl90'\n    'eXBlGA0gASgOMiYuYmlsaWJpbGkucGxheWVyc2hhcmVkLkxpbWl0QWN0aW9uVHlwZVIPbGltaX'\n    'RBY3Rpb25UeXBlEicKEGlzX2hpZGVfbW9yZV9idG4YDiABKAVSDWlzSGlkZU1vcmVCdG4SLQoT'\n    'aGlkZV9idXR0b25fb25faGFsZhgPIAEoBVIQaGlkZUJ1dHRvbk9uSGFsZhIkCg5kZWxpdmVyX3'\n    'dpbl9pZBgQIAEoCVIMZGVsaXZlcldpbklkEk0KCmNvbmRpdGlvbnMYESADKAsyLS5iaWxpYmls'\n    'aS5wbGF5ZXJzaGFyZWQuRGlhbG9nLkNvbmRpdGlvbnNFbnRyeVIKY29uZGl0aW9ucxo9Cg9Db2'\n    '5kaXRpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4'\n    'AQ==');\n\n@$core.Deprecated('Use dimensionDescriptor instead')\nconst Dimension$json = {\n  '1': 'Dimension',\n  '2': [\n    {'1': 'width', '3': 1, '4': 1, '5': 3, '10': 'width'},\n    {'1': 'height', '3': 2, '4': 1, '5': 3, '10': 'height'},\n    {'1': 'rotate', '3': 3, '4': 1, '5': 3, '10': 'rotate'},\n    {'1': 'variable', '3': 4, '4': 1, '5': 3, '10': 'variable'},\n  ],\n};\n\n/// Descriptor for `Dimension`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dimensionDescriptor = $convert.base64Decode(\n    'CglEaW1lbnNpb24SFAoFd2lkdGgYASABKANSBXdpZHRoEhYKBmhlaWdodBgCIAEoA1IGaGVpZ2'\n    'h0EhYKBnJvdGF0ZRgDIAEoA1IGcm90YXRlEhoKCHZhcmlhYmxlGAQgASgDUgh2YXJpYWJsZQ==');\n\n@$core.Deprecated('Use dolbyItemDescriptor instead')\nconst DolbyItem$json = {\n  '1': 'DolbyItem',\n  '2': [\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.DolbyItem.Type',\n      '10': 'type'\n    },\n    {\n      '1': 'audio',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.DashItem',\n      '10': 'audio'\n    },\n  ],\n  '4': [DolbyItem_Type$json],\n};\n\n@$core.Deprecated('Use dolbyItemDescriptor instead')\nconst DolbyItem_Type$json = {\n  '1': 'Type',\n  '2': [\n    {'1': 'NONE', '2': 0},\n    {'1': 'COMMON', '2': 1},\n    {'1': 'ATMOS', '2': 2},\n  ],\n};\n\n/// Descriptor for `DolbyItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List dolbyItemDescriptor = $convert.base64Decode(\n    'CglEb2xieUl0ZW0SOQoEdHlwZRgBIAEoDjIlLmJpbGliaWxpLnBsYXllcnNoYXJlZC5Eb2xieU'\n    'l0ZW0uVHlwZVIEdHlwZRI1CgVhdWRpbxgCIAMoCzIfLmJpbGliaWxpLnBsYXllcnNoYXJlZC5E'\n    'YXNoSXRlbVIFYXVkaW8iJwoEVHlwZRIICgROT05FEAASCgoGQ09NTU9OEAESCQoFQVRNT1MQAg'\n    '==');\n\n@$core.Deprecated('Use epInlineVideoDescriptor instead')\nconst EpInlineVideo$json = {\n  '1': 'EpInlineVideo',\n  '2': [\n    {'1': 'material_no', '3': 1, '4': 1, '5': 3, '10': 'materialNo'},\n    {'1': 'aid', '3': 2, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'cid', '3': 3, '4': 1, '5': 3, '10': 'cid'},\n  ],\n};\n\n/// Descriptor for `EpInlineVideo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List epInlineVideoDescriptor = $convert.base64Decode(\n    'Cg1FcElubGluZVZpZGVvEh8KC21hdGVyaWFsX25vGAEgASgDUgptYXRlcmlhbE5vEhAKA2FpZB'\n    'gCIAEoA1IDYWlkEhAKA2NpZBgDIAEoA1IDY2lk');\n\n@$core.Deprecated('Use epInlineVideoInfoDescriptor instead')\nconst EpInlineVideoInfo$json = {\n  '1': 'EpInlineVideoInfo',\n  '2': [\n    {\n      '1': 'ep_inline_video',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.EpInlineVideo',\n      '10': 'epInlineVideo'\n    },\n  ],\n};\n\n/// Descriptor for `EpInlineVideoInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List epInlineVideoInfoDescriptor = $convert.base64Decode(\n    'ChFFcElubGluZVZpZGVvSW5mbxJMCg9lcF9pbmxpbmVfdmlkZW8YASADKAsyJC5iaWxpYmlsaS'\n    '5wbGF5ZXJzaGFyZWQuRXBJbmxpbmVWaWRlb1INZXBJbmxpbmVWaWRlbw==');\n\n@$core.Deprecated('Use eventDescriptor instead')\nconst Event$json = {\n  '1': 'Event',\n  '2': [\n    {\n      '1': 'shake',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.Shake',\n      '10': 'shake'\n    },\n    {\n      '1': 'qn_tip',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.QnTip',\n      '10': 'qnTip'\n    },\n  ],\n};\n\n/// Descriptor for `Event`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List eventDescriptor = $convert.base64Decode(\n    'CgVFdmVudBIyCgVzaGFrZRgBIAEoCzIcLmJpbGliaWxpLnBsYXllcnNoYXJlZC5TaGFrZVIFc2'\n    'hha2USMwoGcW5fdGlwGAIgASgLMhwuYmlsaWJpbGkucGxheWVyc2hhcmVkLlFuVGlwUgVxblRp'\n    'cA==');\n\n@$core.Deprecated('Use expSwitchDescriptor instead')\nconst ExpSwitch$json = {\n  '1': 'ExpSwitch',\n  '2': [\n    {\n      '1': 'hit_opti_try_watch',\n      '3': 2,\n      '4': 1,\n      '5': 5,\n      '10': 'hitOptiTryWatch'\n    },\n    {\n      '1': 'exp_ab',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.ExpSwitch.ExpAbEntry',\n      '10': 'expAb'\n    },\n  ],\n  '3': [ExpSwitch_ExpAbEntry$json],\n};\n\n@$core.Deprecated('Use expSwitchDescriptor instead')\nconst ExpSwitch_ExpAbEntry$json = {\n  '1': 'ExpAbEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `ExpSwitch`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List expSwitchDescriptor = $convert.base64Decode(\n    'CglFeHBTd2l0Y2gSKwoSaGl0X29wdGlfdHJ5X3dhdGNoGAIgASgFUg9oaXRPcHRpVHJ5V2F0Y2'\n    'gSQgoGZXhwX2FiGAMgAygLMisuYmlsaWJpbGkucGxheWVyc2hhcmVkLkV4cFN3aXRjaC5FeHBB'\n    'YkVudHJ5UgVleHBBYho4CgpFeHBBYkVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGA'\n    'IgASgJUgV2YWx1ZToCOAE=');\n\n@$core.Deprecated('Use extDataDescriptor instead')\nconst ExtData$json = {\n  '1': 'ExtData',\n  '2': [\n    {\n      '1': 'play_list_info',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.PlayListInfo',\n      '9': 0,\n      '10': 'playListInfo'\n    },\n    {\n      '1': 'banner',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.Banner',\n      '9': 0,\n      '10': 'banner'\n    },\n    {\n      '1': 'ep_inline_video_info',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.EpInlineVideoInfo',\n      '9': 0,\n      '10': 'epInlineVideoInfo'\n    },\n    {\n      '1': 'charging_ext',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.ChargingExt',\n      '9': 0,\n      '10': 'chargingExt'\n    },\n    {\n      '1': 'qr_code',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.QrCode',\n      '9': 0,\n      '10': 'qrCode'\n    },\n    {\n      '1': 'type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.ExtDataType',\n      '10': 'type'\n    },\n  ],\n  '8': [\n    {'1': 'data'},\n  ],\n};\n\n/// Descriptor for `ExtData`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List extDataDescriptor = $convert.base64Decode(\n    'CgdFeHREYXRhEksKDnBsYXlfbGlzdF9pbmZvGAIgASgLMiMuYmlsaWJpbGkucGxheWVyc2hhcm'\n    'VkLlBsYXlMaXN0SW5mb0gAUgxwbGF5TGlzdEluZm8SNwoGYmFubmVyGAMgASgLMh0uYmlsaWJp'\n    'bGkucGxheWVyc2hhcmVkLkJhbm5lckgAUgZiYW5uZXISWwoUZXBfaW5saW5lX3ZpZGVvX2luZm'\n    '8YBCABKAsyKC5iaWxpYmlsaS5wbGF5ZXJzaGFyZWQuRXBJbmxpbmVWaWRlb0luZm9IAFIRZXBJ'\n    'bmxpbmVWaWRlb0luZm8SRwoMY2hhcmdpbmdfZXh0GAUgASgLMiIuYmlsaWJpbGkucGxheWVyc2'\n    'hhcmVkLkNoYXJnaW5nRXh0SABSC2NoYXJnaW5nRXh0EjgKB3FyX2NvZGUYBiABKAsyHS5iaWxp'\n    'YmlsaS5wbGF5ZXJzaGFyZWQuUXJDb2RlSABSBnFyQ29kZRI2CgR0eXBlGAEgASgOMiIuYmlsaW'\n    'JpbGkucGxheWVyc2hhcmVkLkV4dERhdGFUeXBlUgR0eXBlQgYKBGRhdGE=');\n\n@$core.Deprecated('Use extraContentDescriptor instead')\nconst ExtraContent$json = {\n  '1': 'ExtraContent',\n  '2': [\n    {'1': 'disabled_reason', '3': 1, '4': 1, '5': 9, '10': 'disabledReason'},\n    {'1': 'disabled_code', '3': 2, '4': 1, '5': 3, '10': 'disabledCode'},\n  ],\n};\n\n/// Descriptor for `ExtraContent`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List extraContentDescriptor = $convert.base64Decode(\n    'CgxFeHRyYUNvbnRlbnQSJwoPZGlzYWJsZWRfcmVhc29uGAEgASgJUg5kaXNhYmxlZFJlYXNvbh'\n    'IjCg1kaXNhYmxlZF9jb2RlGAIgASgDUgxkaXNhYmxlZENvZGU=');\n\n@$core.Deprecated('Use foldDataDescriptor instead')\nconst FoldData$json = {\n  '1': 'FoldData',\n  '2': [\n    {\n      '1': 'count_down',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.CountDownItem',\n      '9': 0,\n      '10': 'countDown'\n    },\n    {\n      '1': 'fold_style',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.FoldStyle',\n      '10': 'foldStyle'\n    },\n  ],\n  '8': [\n    {'1': 'data'},\n  ],\n};\n\n/// Descriptor for `FoldData`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List foldDataDescriptor = $convert.base64Decode(\n    'CghGb2xkRGF0YRJFCgpjb3VudF9kb3duGAIgASgLMiQuYmlsaWJpbGkucGxheWVyc2hhcmVkLk'\n    'NvdW50RG93bkl0ZW1IAFIJY291bnREb3duEj8KCmZvbGRfc3R5bGUYASABKA4yIC5iaWxpYmls'\n    'aS5wbGF5ZXJzaGFyZWQuRm9sZFN0eWxlUglmb2xkU3R5bGVCBgoEZGF0YQ==');\n\n@$core.Deprecated('Use fragmentDescriptor instead')\nconst Fragment$json = {\n  '1': 'Fragment',\n  '2': [\n    {\n      '1': 'infos',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.FragmentInfo',\n      '10': 'infos'\n    },\n  ],\n};\n\n/// Descriptor for `Fragment`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List fragmentDescriptor = $convert.base64Decode(\n    'CghGcmFnbWVudBI5CgVpbmZvcxgBIAMoCzIjLmJpbGliaWxpLnBsYXllcnNoYXJlZC5GcmFnbW'\n    'VudEluZm9SBWluZm9z');\n\n@$core.Deprecated('Use fragmentInfoDescriptor instead')\nconst FragmentInfo$json = {\n  '1': 'FragmentInfo',\n  '2': [\n    {'1': 'index', '3': 1, '4': 1, '5': 5, '10': 'index'},\n    {\n      '1': 'fragment_position',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.FragmentPosition',\n      '10': 'fragmentPosition'\n    },\n    {\n      '1': 'fragment_type',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.FragmentType',\n      '10': 'fragmentType'\n    },\n    {'1': 'aid', '3': 4, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'cid', '3': 5, '4': 1, '5': 3, '10': 'cid'},\n    {'1': 'start_time', '3': 6, '4': 1, '5': 3, '10': 'startTime'},\n    {\n      '1': 'report',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.google.protobuf.Any',\n      '10': 'report'\n    },\n  ],\n};\n\n/// Descriptor for `FragmentInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List fragmentInfoDescriptor = $convert.base64Decode(\n    'CgxGcmFnbWVudEluZm8SFAoFaW5kZXgYASABKAVSBWluZGV4ElQKEWZyYWdtZW50X3Bvc2l0aW'\n    '9uGAIgASgOMicuYmlsaWJpbGkucGxheWVyc2hhcmVkLkZyYWdtZW50UG9zaXRpb25SEGZyYWdt'\n    'ZW50UG9zaXRpb24SSAoNZnJhZ21lbnRfdHlwZRgDIAEoDjIjLmJpbGliaWxpLnBsYXllcnNoYX'\n    'JlZC5GcmFnbWVudFR5cGVSDGZyYWdtZW50VHlwZRIQCgNhaWQYBCABKANSA2FpZBIQCgNjaWQY'\n    'BSABKANSA2NpZBIdCgpzdGFydF90aW1lGAYgASgDUglzdGFydFRpbWUSLAoGcmVwb3J0GAcgAS'\n    'gLMhQuZ29vZ2xlLnByb3RvYnVmLkFueVIGcmVwb3J0');\n\n@$core.Deprecated('Use fragmentVideoDescriptor instead')\nconst FragmentVideo$json = {\n  '1': 'FragmentVideo',\n  '2': [\n    {\n      '1': 'videos',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.FragmentVideoInfo',\n      '10': 'videos'\n    },\n  ],\n};\n\n/// Descriptor for `FragmentVideo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List fragmentVideoDescriptor = $convert.base64Decode(\n    'Cg1GcmFnbWVudFZpZGVvEkAKBnZpZGVvcxgBIAMoCzIoLmJpbGliaWxpLnBsYXllcnNoYXJlZC'\n    '5GcmFnbWVudFZpZGVvSW5mb1IGdmlkZW9z');\n\n@$core.Deprecated('Use fragmentVideoInfoDescriptor instead')\nconst FragmentVideoInfo$json = {\n  '1': 'FragmentVideoInfo',\n  '2': [\n    {\n      '1': 'fragment_info',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.FragmentInfo',\n      '10': 'fragmentInfo'\n    },\n    {\n      '1': 'vod_info',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.VodInfo',\n      '10': 'vodInfo'\n    },\n    {\n      '1': 'play_arc_conf',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.PlayArcConf',\n      '10': 'playArcConf'\n    },\n    {\n      '1': 'dimension',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.Dimension',\n      '10': 'dimension'\n    },\n    {'1': 'timelength', '3': 5, '4': 1, '5': 3, '10': 'timelength'},\n    {\n      '1': 'video_type',\n      '3': 6,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.BizType',\n      '10': 'videoType'\n    },\n    {'1': 'playable_status', '3': 7, '4': 1, '5': 8, '10': 'playableStatus'},\n  ],\n};\n\n/// Descriptor for `FragmentVideoInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List fragmentVideoInfoDescriptor = $convert.base64Decode(\n    'ChFGcmFnbWVudFZpZGVvSW5mbxJICg1mcmFnbWVudF9pbmZvGAEgASgLMiMuYmlsaWJpbGkucG'\n    'xheWVyc2hhcmVkLkZyYWdtZW50SW5mb1IMZnJhZ21lbnRJbmZvEjkKCHZvZF9pbmZvGAIgASgL'\n    'Mh4uYmlsaWJpbGkucGxheWVyc2hhcmVkLlZvZEluZm9SB3ZvZEluZm8SRgoNcGxheV9hcmNfY2'\n    '9uZhgDIAEoCzIiLmJpbGliaWxpLnBsYXllcnNoYXJlZC5QbGF5QXJjQ29uZlILcGxheUFyY0Nv'\n    'bmYSPgoJZGltZW5zaW9uGAQgASgLMiAuYmlsaWJpbGkucGxheWVyc2hhcmVkLkRpbWVuc2lvbl'\n    'IJZGltZW5zaW9uEh4KCnRpbWVsZW5ndGgYBSABKANSCnRpbWVsZW5ndGgSPQoKdmlkZW9fdHlw'\n    'ZRgGIAEoDjIeLmJpbGliaWxpLnBsYXllcnNoYXJlZC5CaXpUeXBlUgl2aWRlb1R5cGUSJwoPcG'\n    'xheWFibGVfc3RhdHVzGAcgASgIUg5wbGF5YWJsZVN0YXR1cw==');\n\n@$core.Deprecated('Use fullPromptBarDescriptor instead')\nconst FullPromptBar$json = {\n  '1': 'FullPromptBar',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {\n      '1': 'title',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.TextInfo',\n      '10': 'title'\n    },\n    {'1': 'timer_countdown', '3': 3, '4': 1, '5': 3, '10': 'timerCountdown'},\n    {'1': 'countdown_enable', '3': 4, '4': 1, '5': 8, '10': 'countdownEnable'},\n    {\n      '1': 'subtitle',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.TextInfo',\n      '10': 'subtitle'\n    },\n    {\n      '1': 'button',\n      '3': 6,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.ButtonInfo',\n      '10': 'button'\n    },\n    {\n      '1': 'fold_data',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.FoldData',\n      '10': 'foldData'\n    },\n    {\n      '1': 'report',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.Report',\n      '10': 'report'\n    },\n    {'1': 'bg_image', '3': 9, '4': 1, '5': 9, '10': 'bgImage'},\n    {'1': 'bar_height', '3': 10, '4': 1, '5': 5, '10': 'barHeight'},\n  ],\n};\n\n/// Descriptor for `FullPromptBar`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List fullPromptBarDescriptor = $convert.base64Decode(\n    'Cg1GdWxsUHJvbXB0QmFyEhIKBGljb24YASABKAlSBGljb24SNQoFdGl0bGUYAiABKAsyHy5iaW'\n    'xpYmlsaS5wbGF5ZXJzaGFyZWQuVGV4dEluZm9SBXRpdGxlEicKD3RpbWVyX2NvdW50ZG93bhgD'\n    'IAEoA1IOdGltZXJDb3VudGRvd24SKQoQY291bnRkb3duX2VuYWJsZRgEIAEoCFIPY291bnRkb3'\n    'duRW5hYmxlEjsKCHN1YnRpdGxlGAUgASgLMh8uYmlsaWJpbGkucGxheWVyc2hhcmVkLlRleHRJ'\n    'bmZvUghzdWJ0aXRsZRI5CgZidXR0b24YBiADKAsyIS5iaWxpYmlsaS5wbGF5ZXJzaGFyZWQuQn'\n    'V0dG9uSW5mb1IGYnV0dG9uEjwKCWZvbGRfZGF0YRgHIAEoCzIfLmJpbGliaWxpLnBsYXllcnNo'\n    'YXJlZC5Gb2xkRGF0YVIIZm9sZERhdGESNQoGcmVwb3J0GAggASgLMh0uYmlsaWJpbGkucGxheW'\n    'Vyc2hhcmVkLlJlcG9ydFIGcmVwb3J0EhkKCGJnX2ltYWdlGAkgASgJUgdiZ0ltYWdlEh0KCmJh'\n    'cl9oZWlnaHQYCiABKAVSCWJhckhlaWdodA==');\n\n@$core.Deprecated('Use gradientColorDescriptor instead')\nconst GradientColor$json = {\n  '1': 'GradientColor',\n  '2': [\n    {'1': 'start_color', '3': 1, '4': 1, '5': 9, '10': 'startColor'},\n    {'1': 'end_color', '3': 2, '4': 1, '5': 9, '10': 'endColor'},\n  ],\n};\n\n/// Descriptor for `GradientColor`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List gradientColorDescriptor = $convert.base64Decode(\n    'Cg1HcmFkaWVudENvbG9yEh8KC3N0YXJ0X2NvbG9yGAEgASgJUgpzdGFydENvbG9yEhsKCWVuZF'\n    '9jb2xvchgCIAEoCVIIZW5kQ29sb3I=');\n\n@$core.Deprecated('Use historyDescriptor instead')\nconst History$json = {\n  '1': 'History',\n  '2': [\n    {\n      '1': 'current_video',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.HistoryInfo',\n      '10': 'currentVideo'\n    },\n    {\n      '1': 'related_video',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.HistoryInfo',\n      '10': 'relatedVideo'\n    },\n  ],\n};\n\n/// Descriptor for `History`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List historyDescriptor = $convert.base64Decode(\n    'CgdIaXN0b3J5EkcKDWN1cnJlbnRfdmlkZW8YASABKAsyIi5iaWxpYmlsaS5wbGF5ZXJzaGFyZW'\n    'QuSGlzdG9yeUluZm9SDGN1cnJlbnRWaWRlbxJHCg1yZWxhdGVkX3ZpZGVvGAIgASgLMiIuYmls'\n    'aWJpbGkucGxheWVyc2hhcmVkLkhpc3RvcnlJbmZvUgxyZWxhdGVkVmlkZW8=');\n\n@$core.Deprecated('Use historyInfoDescriptor instead')\nconst HistoryInfo$json = {\n  '1': 'HistoryInfo',\n  '2': [\n    {'1': 'progress', '3': 1, '4': 1, '5': 3, '10': 'progress'},\n    {'1': 'last_play_cid', '3': 2, '4': 1, '5': 3, '10': 'lastPlayCid'},\n    {\n      '1': 'toast',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.Toast',\n      '10': 'toast'\n    },\n    {\n      '1': 'toast_without_time',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.Toast',\n      '10': 'toastWithoutTime'\n    },\n    {'1': 'last_play_aid', '3': 5, '4': 1, '5': 3, '10': 'lastPlayAid'},\n  ],\n};\n\n/// Descriptor for `HistoryInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List historyInfoDescriptor = $convert.base64Decode(\n    'CgtIaXN0b3J5SW5mbxIaCghwcm9ncmVzcxgBIAEoA1IIcHJvZ3Jlc3MSIgoNbGFzdF9wbGF5X2'\n    'NpZBgCIAEoA1ILbGFzdFBsYXlDaWQSMgoFdG9hc3QYAyABKAsyHC5iaWxpYmlsaS5wbGF5ZXJz'\n    'aGFyZWQuVG9hc3RSBXRvYXN0EkoKEnRvYXN0X3dpdGhvdXRfdGltZRgEIAEoCzIcLmJpbGliaW'\n    'xpLnBsYXllcnNoYXJlZC5Ub2FzdFIQdG9hc3RXaXRob3V0VGltZRIiCg1sYXN0X3BsYXlfYWlk'\n    'GAUgASgDUgtsYXN0UGxheUFpZA==');\n\n@$core.Deprecated('Use imageInfoDescriptor instead')\nconst ImageInfo$json = {\n  '1': 'ImageInfo',\n  '2': [\n    {'1': 'url', '3': 1, '4': 1, '5': 9, '10': 'url'},\n  ],\n};\n\n/// Descriptor for `ImageInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List imageInfoDescriptor =\n    $convert.base64Decode('CglJbWFnZUluZm8SEAoDdXJsGAEgASgJUgN1cmw=');\n\n@$core.Deprecated('Use interactionDescriptor instead')\nconst Interaction$json = {\n  '1': 'Interaction',\n  '2': [\n    {\n      '1': 'history_node',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.Node',\n      '10': 'historyNode'\n    },\n    {'1': 'graph_version', '3': 2, '4': 1, '5': 3, '10': 'graphVersion'},\n    {'1': 'msg', '3': 3, '4': 1, '5': 9, '10': 'msg'},\n    {'1': 'mark', '3': 4, '4': 1, '5': 3, '10': 'mark'},\n  ],\n};\n\n/// Descriptor for `Interaction`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List interactionDescriptor = $convert.base64Decode(\n    'CgtJbnRlcmFjdGlvbhI+CgxoaXN0b3J5X25vZGUYASABKAsyGy5iaWxpYmlsaS5wbGF5ZXJzaG'\n    'FyZWQuTm9kZVILaGlzdG9yeU5vZGUSIwoNZ3JhcGhfdmVyc2lvbhgCIAEoA1IMZ3JhcGhWZXJz'\n    'aW9uEhAKA21zZxgDIAEoCVIDbXNnEhIKBG1hcmsYBCABKANSBG1hcms=');\n\n@$core.Deprecated('Use lossLessItemDescriptor instead')\nconst LossLessItem$json = {\n  '1': 'LossLessItem',\n  '2': [\n    {'1': 'is_lossless_audio', '3': 1, '4': 1, '5': 8, '10': 'isLosslessAudio'},\n    {\n      '1': 'audio',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.DashItem',\n      '10': 'audio'\n    },\n    {'1': 'need_vip', '3': 3, '4': 1, '5': 8, '10': 'needVip'},\n  ],\n};\n\n/// Descriptor for `LossLessItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List lossLessItemDescriptor = $convert.base64Decode(\n    'CgxMb3NzTGVzc0l0ZW0SKgoRaXNfbG9zc2xlc3NfYXVkaW8YASABKAhSD2lzTG9zc2xlc3NBdW'\n    'RpbxI1CgVhdWRpbxgCIAEoCzIfLmJpbGliaWxpLnBsYXllcnNoYXJlZC5EYXNoSXRlbVIFYXVk'\n    'aW8SGQoIbmVlZF92aXAYAyABKAhSB25lZWRWaXA=');\n\n@$core.Deprecated('Use multiDashVideoDescriptor instead')\nconst MultiDashVideo$json = {\n  '1': 'MultiDashVideo',\n  '2': [\n    {\n      '1': 'dash_videos',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.DashVideo',\n      '10': 'dashVideos'\n    },\n  ],\n};\n\n/// Descriptor for `MultiDashVideo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List multiDashVideoDescriptor = $convert.base64Decode(\n    'Cg5NdWx0aURhc2hWaWRlbxJBCgtkYXNoX3ZpZGVvcxgBIAMoCzIgLmJpbGliaWxpLnBsYXllcn'\n    'NoYXJlZC5EYXNoVmlkZW9SCmRhc2hWaWRlb3M=');\n\n@$core.Deprecated('Use nodeDescriptor instead')\nconst Node$json = {\n  '1': 'Node',\n  '2': [\n    {'1': 'node_id', '3': 1, '4': 1, '5': 3, '10': 'nodeId'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cid', '3': 3, '4': 1, '5': 3, '10': 'cid'},\n  ],\n};\n\n/// Descriptor for `Node`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List nodeDescriptor = $convert.base64Decode(\n    'CgROb2RlEhcKB25vZGVfaWQYASABKANSBm5vZGVJZBIUCgV0aXRsZRgCIAEoCVIFdGl0bGUSEA'\n    'oDY2lkGAMgASgDUgNjaWQ=');\n\n@$core.Deprecated('Use payWallOnshowActionDescriptor instead')\nconst PayWallOnshowAction$json = {\n  '1': 'PayWallOnshowAction',\n  '2': [\n    {'1': 'link', '3': 1, '4': 1, '5': 9, '10': 'link'},\n    {\n      '1': 'order_report_params',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.PayWallOnshowAction.OrderReportParamsEntry',\n      '10': 'orderReportParams'\n    },\n    {\n      '1': 'action_type',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.ButtonAction',\n      '10': 'actionType'\n    },\n  ],\n  '3': [PayWallOnshowAction_OrderReportParamsEntry$json],\n};\n\n@$core.Deprecated('Use payWallOnshowActionDescriptor instead')\nconst PayWallOnshowAction_OrderReportParamsEntry$json = {\n  '1': 'OrderReportParamsEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `PayWallOnshowAction`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List payWallOnshowActionDescriptor = $convert.base64Decode(\n    'ChNQYXlXYWxsT25zaG93QWN0aW9uEhIKBGxpbmsYASABKAlSBGxpbmsScQoTb3JkZXJfcmVwb3'\n    'J0X3BhcmFtcxgCIAMoCzJBLmJpbGliaWxpLnBsYXllcnNoYXJlZC5QYXlXYWxsT25zaG93QWN0'\n    'aW9uLk9yZGVyUmVwb3J0UGFyYW1zRW50cnlSEW9yZGVyUmVwb3J0UGFyYW1zEkQKC2FjdGlvbl'\n    '90eXBlGAMgASgOMiMuYmlsaWJpbGkucGxheWVyc2hhcmVkLkJ1dHRvbkFjdGlvblIKYWN0aW9u'\n    'VHlwZRpEChZPcmRlclJlcG9ydFBhcmFtc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbH'\n    'VlGAIgASgJUgV2YWx1ZToCOAE=');\n\n@$core.Deprecated('Use playArcDescriptor instead')\nconst PlayArc$json = {\n  '1': 'PlayArc',\n  '2': [\n    {\n      '1': 'video_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.BizType',\n      '10': 'videoType'\n    },\n    {'1': 'aid', '3': 2, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'cid', '3': 3, '4': 1, '5': 3, '10': 'cid'},\n    {\n      '1': 'drm_tech_type',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.DrmTechType',\n      '10': 'drmTechType'\n    },\n    {\n      '1': 'arc_type',\n      '3': 5,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.ArcType',\n      '10': 'arcType'\n    },\n    {\n      '1': 'interaction',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.Interaction',\n      '10': 'interaction'\n    },\n    {\n      '1': 'dimension',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.Dimension',\n      '10': 'dimension'\n    },\n    {'1': 'duration', '3': 8, '4': 1, '5': 3, '10': 'duration'},\n    {'1': 'is_preview', '3': 9, '4': 1, '5': 8, '10': 'isPreview'},\n    {\n      '1': 'watch_time_length',\n      '3': 10,\n      '4': 1,\n      '5': 3,\n      '10': 'watchTimeLength'\n    },\n    {'1': 'duration_ms', '3': 11, '4': 1, '5': 3, '10': 'durationMs'},\n  ],\n};\n\n/// Descriptor for `PlayArc`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playArcDescriptor = $convert.base64Decode(\n    'CgdQbGF5QXJjEj0KCnZpZGVvX3R5cGUYASABKA4yHi5iaWxpYmlsaS5wbGF5ZXJzaGFyZWQuQm'\n    'l6VHlwZVIJdmlkZW9UeXBlEhAKA2FpZBgCIAEoA1IDYWlkEhAKA2NpZBgDIAEoA1IDY2lkEkYK'\n    'DWRybV90ZWNoX3R5cGUYBCABKA4yIi5iaWxpYmlsaS5wbGF5ZXJzaGFyZWQuRHJtVGVjaFR5cG'\n    'VSC2RybVRlY2hUeXBlEjkKCGFyY190eXBlGAUgASgOMh4uYmlsaWJpbGkucGxheWVyc2hhcmVk'\n    'LkFyY1R5cGVSB2FyY1R5cGUSRAoLaW50ZXJhY3Rpb24YBiABKAsyIi5iaWxpYmlsaS5wbGF5ZX'\n    'JzaGFyZWQuSW50ZXJhY3Rpb25SC2ludGVyYWN0aW9uEj4KCWRpbWVuc2lvbhgHIAEoCzIgLmJp'\n    'bGliaWxpLnBsYXllcnNoYXJlZC5EaW1lbnNpb25SCWRpbWVuc2lvbhIaCghkdXJhdGlvbhgIIA'\n    'EoA1IIZHVyYXRpb24SHQoKaXNfcHJldmlldxgJIAEoCFIJaXNQcmV2aWV3EioKEXdhdGNoX3Rp'\n    'bWVfbGVuZ3RoGAogASgDUg93YXRjaFRpbWVMZW5ndGgSHwoLZHVyYXRpb25fbXMYCyABKANSCm'\n    'R1cmF0aW9uTXM=');\n\n@$core.Deprecated('Use playArcConfDescriptor instead')\nconst PlayArcConf$json = {\n  '1': 'PlayArcConf',\n  '2': [\n    {\n      '1': 'arc_confs',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.PlayArcConf.ArcConfsEntry',\n      '10': 'arcConfs'\n    },\n  ],\n  '3': [PlayArcConf_ArcConfsEntry$json],\n};\n\n@$core.Deprecated('Use playArcConfDescriptor instead')\nconst PlayArcConf_ArcConfsEntry$json = {\n  '1': 'ArcConfsEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 5, '10': 'key'},\n    {\n      '1': 'value',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.ArcConf',\n      '10': 'value'\n    },\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `PlayArcConf`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playArcConfDescriptor = $convert.base64Decode(\n    'CgtQbGF5QXJjQ29uZhJNCglhcmNfY29uZnMYASADKAsyMC5iaWxpYmlsaS5wbGF5ZXJzaGFyZW'\n    'QuUGxheUFyY0NvbmYuQXJjQ29uZnNFbnRyeVIIYXJjQ29uZnMaWwoNQXJjQ29uZnNFbnRyeRIQ'\n    'CgNrZXkYASABKAVSA2tleRI0CgV2YWx1ZRgCIAEoCzIeLmJpbGliaWxpLnBsYXllcnNoYXJlZC'\n    '5BcmNDb25mUgV2YWx1ZToCOAE=');\n\n@$core.Deprecated('Use playDeviceConfDescriptor instead')\nconst PlayDeviceConf$json = {\n  '1': 'PlayDeviceConf',\n  '2': [\n    {\n      '1': 'device_confs',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.PlayDeviceConf.DeviceConfsEntry',\n      '10': 'deviceConfs'\n    },\n  ],\n  '3': [PlayDeviceConf_DeviceConfsEntry$json],\n};\n\n@$core.Deprecated('Use playDeviceConfDescriptor instead')\nconst PlayDeviceConf_DeviceConfsEntry$json = {\n  '1': 'DeviceConfsEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 5, '10': 'key'},\n    {\n      '1': 'value',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.DeviceConf',\n      '10': 'value'\n    },\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `PlayDeviceConf`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playDeviceConfDescriptor = $convert.base64Decode(\n    'Cg5QbGF5RGV2aWNlQ29uZhJZCgxkZXZpY2VfY29uZnMYASADKAsyNi5iaWxpYmlsaS5wbGF5ZX'\n    'JzaGFyZWQuUGxheURldmljZUNvbmYuRGV2aWNlQ29uZnNFbnRyeVILZGV2aWNlQ29uZnMaYQoQ'\n    'RGV2aWNlQ29uZnNFbnRyeRIQCgNrZXkYASABKAVSA2tleRI3CgV2YWx1ZRgCIAEoCzIhLmJpbG'\n    'liaWxpLnBsYXllcnNoYXJlZC5EZXZpY2VDb25mUgV2YWx1ZToCOAE=');\n\n@$core.Deprecated('Use playListDescriptor instead')\nconst PlayList$json = {\n  '1': 'PlayList',\n  '2': [\n    {'1': 'season_id', '3': 1, '4': 1, '5': 3, '10': 'seasonId'},\n    {'1': 'title', '3': 2, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'cover', '3': 3, '4': 1, '5': 9, '10': 'cover'},\n    {'1': 'link', '3': 4, '4': 1, '5': 9, '10': 'link'},\n    {\n      '1': 'badge_info',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.BadgeInfo',\n      '10': 'badgeInfo'\n    },\n  ],\n};\n\n/// Descriptor for `PlayList`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playListDescriptor = $convert.base64Decode(\n    'CghQbGF5TGlzdBIbCglzZWFzb25faWQYASABKANSCHNlYXNvbklkEhQKBXRpdGxlGAIgASgJUg'\n    'V0aXRsZRIUCgVjb3ZlchgDIAEoCVIFY292ZXISEgoEbGluaxgEIAEoCVIEbGluaxI/CgpiYWRn'\n    'ZV9pbmZvGAUgASgLMiAuYmlsaWJpbGkucGxheWVyc2hhcmVkLkJhZGdlSW5mb1IJYmFkZ2VJbm'\n    'Zv');\n\n@$core.Deprecated('Use playListInfoDescriptor instead')\nconst PlayListInfo$json = {\n  '1': 'PlayListInfo',\n  '2': [\n    {\n      '1': 'play_list',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.PlayList',\n      '10': 'playList'\n    },\n  ],\n};\n\n/// Descriptor for `PlayListInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List playListInfoDescriptor = $convert.base64Decode(\n    'CgxQbGF5TGlzdEluZm8SPAoJcGxheV9saXN0GAIgAygLMh8uYmlsaWJpbGkucGxheWVyc2hhcm'\n    'VkLlBsYXlMaXN0UghwbGF5TGlzdA==');\n\n@$core.Deprecated('Use promptBarDescriptor instead')\nconst PromptBar$json = {\n  '1': 'PromptBar',\n  '2': [\n    {\n      '1': 'title',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.TextInfo',\n      '10': 'title'\n    },\n    {\n      '1': 'sub_title',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.TextInfo',\n      '10': 'subTitle'\n    },\n    {'1': 'sub_title_icon', '3': 3, '4': 1, '5': 9, '10': 'subTitleIcon'},\n    {'1': 'bg_image', '3': 4, '4': 1, '5': 9, '10': 'bgImage'},\n    {\n      '1': 'bg_gradient_color',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.GradientColor',\n      '10': 'bgGradientColor'\n    },\n    {\n      '1': 'button',\n      '3': 6,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.ButtonInfo',\n      '10': 'button'\n    },\n    {\n      '1': 'report',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.Report',\n      '10': 'report'\n    },\n    {\n      '1': 'full_screen_ip_icon',\n      '3': 8,\n      '4': 1,\n      '5': 9,\n      '10': 'fullScreenIpIcon'\n    },\n    {\n      '1': 'full_screen_bg_gradient_color',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.GradientColor',\n      '10': 'fullScreenBgGradientColor'\n    },\n    {\n      '1': 'prompt_bar_type',\n      '3': 10,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.PromptBarType',\n      '10': 'promptBarType'\n    },\n    {\n      '1': 'prompt_bar_style',\n      '3': 11,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.PromptBarStyle',\n      '10': 'promptBarStyle'\n    },\n    {\n      '1': 'benefit_infos',\n      '3': 12,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.BenefitInfo',\n      '10': 'benefitInfos'\n    },\n    {'1': 'end_time', '3': 13, '4': 1, '5': 3, '10': 'endTime'},\n    {'1': 'show_on_paywall', '3': 14, '4': 1, '5': 5, '10': 'showOnPaywall'},\n  ],\n};\n\n/// Descriptor for `PromptBar`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List promptBarDescriptor = $convert.base64Decode(\n    'CglQcm9tcHRCYXISNQoFdGl0bGUYASABKAsyHy5iaWxpYmlsaS5wbGF5ZXJzaGFyZWQuVGV4dE'\n    'luZm9SBXRpdGxlEjwKCXN1Yl90aXRsZRgCIAEoCzIfLmJpbGliaWxpLnBsYXllcnNoYXJlZC5U'\n    'ZXh0SW5mb1IIc3ViVGl0bGUSJAoOc3ViX3RpdGxlX2ljb24YAyABKAlSDHN1YlRpdGxlSWNvbh'\n    'IZCghiZ19pbWFnZRgEIAEoCVIHYmdJbWFnZRJQChFiZ19ncmFkaWVudF9jb2xvchgFIAEoCzIk'\n    'LmJpbGliaWxpLnBsYXllcnNoYXJlZC5HcmFkaWVudENvbG9yUg9iZ0dyYWRpZW50Q29sb3ISOQ'\n    'oGYnV0dG9uGAYgAygLMiEuYmlsaWJpbGkucGxheWVyc2hhcmVkLkJ1dHRvbkluZm9SBmJ1dHRv'\n    'bhI1CgZyZXBvcnQYByABKAsyHS5iaWxpYmlsaS5wbGF5ZXJzaGFyZWQuUmVwb3J0UgZyZXBvcn'\n    'QSLQoTZnVsbF9zY3JlZW5faXBfaWNvbhgIIAEoCVIQZnVsbFNjcmVlbklwSWNvbhJmCh1mdWxs'\n    'X3NjcmVlbl9iZ19ncmFkaWVudF9jb2xvchgJIAEoCzIkLmJpbGliaWxpLnBsYXllcnNoYXJlZC'\n    '5HcmFkaWVudENvbG9yUhlmdWxsU2NyZWVuQmdHcmFkaWVudENvbG9yEkwKD3Byb21wdF9iYXJf'\n    'dHlwZRgKIAEoDjIkLmJpbGliaWxpLnBsYXllcnNoYXJlZC5Qcm9tcHRCYXJUeXBlUg1wcm9tcH'\n    'RCYXJUeXBlEk8KEHByb21wdF9iYXJfc3R5bGUYCyABKA4yJS5iaWxpYmlsaS5wbGF5ZXJzaGFy'\n    'ZWQuUHJvbXB0QmFyU3R5bGVSDnByb21wdEJhclN0eWxlEkcKDWJlbmVmaXRfaW5mb3MYDCADKA'\n    'syIi5iaWxpYmlsaS5wbGF5ZXJzaGFyZWQuQmVuZWZpdEluZm9SDGJlbmVmaXRJbmZvcxIZCghl'\n    'bmRfdGltZRgNIAEoA1IHZW5kVGltZRImCg9zaG93X29uX3BheXdhbGwYDiABKAVSDXNob3dPbl'\n    'BheXdhbGw=');\n\n@$core.Deprecated('Use qnExpDescriptor instead')\nconst QnExp$json = {\n  '1': 'QnExp',\n  '2': [\n    {'1': 'qn_exp1', '3': 1, '4': 1, '5': 8, '10': 'qnExp1'},\n    {'1': 'qn_exp2', '3': 2, '4': 1, '5': 8, '10': 'qnExp2'},\n  ],\n};\n\n/// Descriptor for `QnExp`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List qnExpDescriptor = $convert.base64Decode(\n    'CgVRbkV4cBIXCgdxbl9leHAxGAEgASgIUgZxbkV4cDESFwoHcW5fZXhwMhgCIAEoCFIGcW5FeH'\n    'Ay');\n\n@$core.Deprecated('Use qnTipDescriptor instead')\nconst QnTip$json = {\n  '1': 'QnTip',\n  '2': [\n    {'1': 'msg', '3': 1, '4': 1, '5': 9, '10': 'msg'},\n  ],\n};\n\n/// Descriptor for `QnTip`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List qnTipDescriptor =\n    $convert.base64Decode('CgVRblRpcBIQCgNtc2cYASABKAlSA21zZw==');\n\n@$core.Deprecated('Use qnTrialInfoDescriptor instead')\nconst QnTrialInfo$json = {\n  '1': 'QnTrialInfo',\n  '2': [\n    {'1': 'trial_able', '3': 1, '4': 1, '5': 8, '10': 'trialAble'},\n    {'1': 'remaining_times', '3': 2, '4': 1, '5': 5, '10': 'remainingTimes'},\n    {'1': 'start', '3': 3, '4': 1, '5': 5, '10': 'start'},\n    {'1': 'time_length', '3': 4, '4': 1, '5': 5, '10': 'timeLength'},\n    {\n      '1': 'start_toast',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.Toast',\n      '10': 'startToast'\n    },\n    {\n      '1': 'end_toast',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.Toast',\n      '10': 'endToast'\n    },\n    {\n      '1': 'quality_open_tip_btn',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.Button',\n      '10': 'qualityOpenTipBtn'\n    },\n    {\n      '1': 'trial_quality_type',\n      '3': 9,\n      '4': 1,\n      '5': 5,\n      '10': 'trialQualityType'\n    },\n  ],\n};\n\n/// Descriptor for `QnTrialInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List qnTrialInfoDescriptor = $convert.base64Decode(\n    'CgtRblRyaWFsSW5mbxIdCgp0cmlhbF9hYmxlGAEgASgIUgl0cmlhbEFibGUSJwoPcmVtYWluaW'\n    '5nX3RpbWVzGAIgASgFUg5yZW1haW5pbmdUaW1lcxIUCgVzdGFydBgDIAEoBVIFc3RhcnQSHwoL'\n    'dGltZV9sZW5ndGgYBCABKAVSCnRpbWVMZW5ndGgSPQoLc3RhcnRfdG9hc3QYBSABKAsyHC5iaW'\n    'xpYmlsaS5wbGF5ZXJzaGFyZWQuVG9hc3RSCnN0YXJ0VG9hc3QSOQoJZW5kX3RvYXN0GAYgASgL'\n    'MhwuYmlsaWJpbGkucGxheWVyc2hhcmVkLlRvYXN0UghlbmRUb2FzdBJOChRxdWFsaXR5X29wZW'\n    '5fdGlwX2J0bhgIIAEoCzIdLmJpbGliaWxpLnBsYXllcnNoYXJlZC5CdXR0b25SEXF1YWxpdHlP'\n    'cGVuVGlwQnRuEiwKEnRyaWFsX3F1YWxpdHlfdHlwZRgJIAEoBVIQdHJpYWxRdWFsaXR5VHlwZQ'\n    '==');\n\n@$core.Deprecated('Use qrCodeDescriptor instead')\nconst QrCode$json = {\n  '1': 'QrCode',\n  '2': [\n    {'1': 'link', '3': 1, '4': 1, '5': 9, '10': 'link'},\n    {'1': 'link_desc', '3': 2, '4': 1, '5': 9, '10': 'linkDesc'},\n  ],\n};\n\n/// Descriptor for `QrCode`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List qrCodeDescriptor = $convert.base64Decode(\n    'CgZRckNvZGUSEgoEbGluaxgBIAEoCVIEbGluaxIbCglsaW5rX2Rlc2MYAiABKAlSCGxpbmtEZX'\n    'Nj');\n\n@$core.Deprecated('Use reportDescriptor instead')\nconst Report$json = {\n  '1': 'Report',\n  '2': [\n    {'1': 'show_event_id', '3': 1, '4': 1, '5': 9, '10': 'showEventId'},\n    {'1': 'click_event_id', '3': 2, '4': 1, '5': 9, '10': 'clickEventId'},\n    {'1': 'extends', '3': 3, '4': 1, '5': 9, '10': 'extends'},\n  ],\n};\n\n/// Descriptor for `Report`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List reportDescriptor = $convert.base64Decode(\n    'CgZSZXBvcnQSIgoNc2hvd19ldmVudF9pZBgBIAEoCVILc2hvd0V2ZW50SWQSJAoOY2xpY2tfZX'\n    'ZlbnRfaWQYAiABKAlSDGNsaWNrRXZlbnRJZBIYCgdleHRlbmRzGAMgASgJUgdleHRlbmRz');\n\n@$core.Deprecated('Use residentBarDescriptor instead')\nconst ResidentBar$json = {\n  '1': 'ResidentBar',\n  '2': [\n    {'1': 'icon', '3': 1, '4': 1, '5': 9, '10': 'icon'},\n    {\n      '1': 'question_text',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.TextInfo',\n      '10': 'questionText'\n    },\n    {\n      '1': 'button',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.ButtonInfo',\n      '10': 'button'\n    },\n    {'1': 'link', '3': 4, '4': 1, '5': 9, '10': 'link'},\n    {\n      '1': 'report',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.Report',\n      '10': 'report'\n    },\n    {'1': 'bg_image', '3': 6, '4': 1, '5': 9, '10': 'bgImage'},\n  ],\n};\n\n/// Descriptor for `ResidentBar`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List residentBarDescriptor = $convert.base64Decode(\n    'CgtSZXNpZGVudEJhchISCgRpY29uGAEgASgJUgRpY29uEkQKDXF1ZXN0aW9uX3RleHQYAiABKA'\n    'syHy5iaWxpYmlsaS5wbGF5ZXJzaGFyZWQuVGV4dEluZm9SDHF1ZXN0aW9uVGV4dBI5CgZidXR0'\n    'b24YAyABKAsyIS5iaWxpYmlsaS5wbGF5ZXJzaGFyZWQuQnV0dG9uSW5mb1IGYnV0dG9uEhIKBG'\n    'xpbmsYBCABKAlSBGxpbmsSNQoGcmVwb3J0GAUgASgLMh0uYmlsaWJpbGkucGxheWVyc2hhcmVk'\n    'LlJlcG9ydFIGcmVwb3J0EhkKCGJnX2ltYWdlGAYgASgJUgdiZ0ltYWdl');\n\n@$core.Deprecated('Use responseDashDescriptor instead')\nconst ResponseDash$json = {\n  '1': 'ResponseDash',\n  '2': [\n    {\n      '1': 'video',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.DashItem',\n      '10': 'video'\n    },\n    {\n      '1': 'audio',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.DashItem',\n      '10': 'audio'\n    },\n  ],\n};\n\n/// Descriptor for `ResponseDash`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List responseDashDescriptor = $convert.base64Decode(\n    'CgxSZXNwb25zZURhc2gSNQoFdmlkZW8YASADKAsyHy5iaWxpYmlsaS5wbGF5ZXJzaGFyZWQuRG'\n    'FzaEl0ZW1SBXZpZGVvEjUKBWF1ZGlvGAIgAygLMh8uYmlsaWJpbGkucGxheWVyc2hhcmVkLkRh'\n    'c2hJdGVtUgVhdWRpbw==');\n\n@$core.Deprecated('Use responseUrlDescriptor instead')\nconst ResponseUrl$json = {\n  '1': 'ResponseUrl',\n  '2': [\n    {'1': 'order', '3': 1, '4': 1, '5': 5, '10': 'order'},\n    {'1': 'length', '3': 2, '4': 1, '5': 3, '10': 'length'},\n    {'1': 'size', '3': 3, '4': 1, '5': 3, '10': 'size'},\n    {'1': 'url', '3': 4, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'backup_url', '3': 5, '4': 3, '5': 9, '10': 'backupUrl'},\n    {'1': 'md5', '3': 6, '4': 1, '5': 9, '10': 'md5'},\n  ],\n};\n\n/// Descriptor for `ResponseUrl`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List responseUrlDescriptor = $convert.base64Decode(\n    'CgtSZXNwb25zZVVybBIUCgVvcmRlchgBIAEoBVIFb3JkZXISFgoGbGVuZ3RoGAIgASgDUgZsZW'\n    '5ndGgSEgoEc2l6ZRgDIAEoA1IEc2l6ZRIQCgN1cmwYBCABKAlSA3VybBIdCgpiYWNrdXBfdXJs'\n    'GAUgAygJUgliYWNrdXBVcmwSEAoDbWQ1GAYgASgJUgNtZDU=');\n\n@$core.Deprecated('Use schemeDescriptor instead')\nconst Scheme$json = {\n  '1': 'Scheme',\n  '2': [\n    {\n      '1': 'action_type',\n      '3': 1,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.Scheme.ActionType',\n      '10': 'actionType'\n    },\n    {'1': 'toast', '3': 2, '4': 1, '5': 9, '10': 'toast'},\n  ],\n  '4': [Scheme_ActionType$json],\n};\n\n@$core.Deprecated('Use schemeDescriptor instead')\nconst Scheme_ActionType$json = {\n  '1': 'ActionType',\n  '2': [\n    {'1': 'UNKNOWN_ActionType', '2': 0},\n    {'1': 'SHOW_TOAST', '2': 1},\n  ],\n};\n\n/// Descriptor for `Scheme`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List schemeDescriptor = $convert.base64Decode(\n    'CgZTY2hlbWUSSQoLYWN0aW9uX3R5cGUYASABKA4yKC5iaWxpYmlsaS5wbGF5ZXJzaGFyZWQuU2'\n    'NoZW1lLkFjdGlvblR5cGVSCmFjdGlvblR5cGUSFAoFdG9hc3QYAiABKAlSBXRvYXN0IjQKCkFj'\n    'dGlvblR5cGUSFgoSVU5LTk9XTl9BY3Rpb25UeXBlEAASDgoKU0hPV19UT0FTVBAB');\n\n@$core.Deprecated('Use segmentVideoDescriptor instead')\nconst SegmentVideo$json = {\n  '1': 'SegmentVideo',\n  '2': [\n    {\n      '1': 'segment',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.ResponseUrl',\n      '10': 'segment'\n    },\n  ],\n};\n\n/// Descriptor for `SegmentVideo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List segmentVideoDescriptor = $convert.base64Decode(\n    'CgxTZWdtZW50VmlkZW8SPAoHc2VnbWVudBgBIAMoCzIiLmJpbGliaWxpLnBsYXllcnNoYXJlZC'\n    '5SZXNwb25zZVVybFIHc2VnbWVudA==');\n\n@$core.Deprecated('Use settingBaseDescriptor instead')\nconst SettingBase$json = {\n  '1': 'SettingBase',\n  '2': [\n    {'1': 'left_icon', '3': 1, '4': 1, '5': 9, '10': 'leftIcon'},\n    {'1': 'left_title', '3': 2, '4': 1, '5': 9, '10': 'leftTitle'},\n    {\n      '1': 'type',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.SettingItemType',\n      '10': 'type'\n    },\n    {\n      '1': 'control',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.SettingControl',\n      '10': 'control'\n    },\n    {\n      '1': 'report',\n      '3': 5,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.SettingBase.ReportEntry',\n      '10': 'report'\n    },\n  ],\n  '3': [SettingBase_ReportEntry$json],\n};\n\n@$core.Deprecated('Use settingBaseDescriptor instead')\nconst SettingBase_ReportEntry$json = {\n  '1': 'ReportEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `SettingBase`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List settingBaseDescriptor = $convert.base64Decode(\n    'CgtTZXR0aW5nQmFzZRIbCglsZWZ0X2ljb24YASABKAlSCGxlZnRJY29uEh0KCmxlZnRfdGl0bG'\n    'UYAiABKAlSCWxlZnRUaXRsZRI6CgR0eXBlGAMgASgOMiYuYmlsaWJpbGkucGxheWVyc2hhcmVk'\n    'LlNldHRpbmdJdGVtVHlwZVIEdHlwZRI/Cgdjb250cm9sGAQgASgLMiUuYmlsaWJpbGkucGxheW'\n    'Vyc2hhcmVkLlNldHRpbmdDb250cm9sUgdjb250cm9sEkYKBnJlcG9ydBgFIAMoCzIuLmJpbGli'\n    'aWxpLnBsYXllcnNoYXJlZC5TZXR0aW5nQmFzZS5SZXBvcnRFbnRyeVIGcmVwb3J0GjkKC1JlcG'\n    '9ydEVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAE=');\n\n@$core.Deprecated('Use settingControlDescriptor instead')\nconst SettingControl$json = {\n  '1': 'SettingControl',\n  '2': [\n    {'1': 'disabled', '3': 1, '4': 1, '5': 8, '10': 'disabled'},\n    {'1': 'disabled_reason', '3': 2, '4': 1, '5': 9, '10': 'disabledReason'},\n    {'1': 'disable_gray', '3': 3, '4': 1, '5': 8, '10': 'disableGray'},\n  ],\n};\n\n/// Descriptor for `SettingControl`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List settingControlDescriptor = $convert.base64Decode(\n    'Cg5TZXR0aW5nQ29udHJvbBIaCghkaXNhYmxlZBgBIAEoCFIIZGlzYWJsZWQSJwoPZGlzYWJsZW'\n    'RfcmVhc29uGAIgASgJUg5kaXNhYmxlZFJlYXNvbhIhCgxkaXNhYmxlX2dyYXkYAyABKAhSC2Rp'\n    'c2FibGVHcmF5');\n\n@$core.Deprecated('Use settingGroupDescriptor instead')\nconst SettingGroup$json = {\n  '1': 'SettingGroup',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {\n      '1': 'items',\n      '3': 2,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.SettingItem',\n      '10': 'items'\n    },\n    {\n      '1': 'group_style',\n      '3': 3,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.GroupStyle',\n      '10': 'groupStyle'\n    },\n  ],\n};\n\n/// Descriptor for `SettingGroup`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List settingGroupDescriptor = $convert.base64Decode(\n    'CgxTZXR0aW5nR3JvdXASFAoFdGl0bGUYASABKAlSBXRpdGxlEjgKBWl0ZW1zGAIgAygLMiIuYm'\n    'lsaWJpbGkucGxheWVyc2hhcmVkLlNldHRpbmdJdGVtUgVpdGVtcxJCCgtncm91cF9zdHlsZRgD'\n    'IAEoDjIhLmJpbGliaWxpLnBsYXllcnNoYXJlZC5Hcm91cFN0eWxlUgpncm91cFN0eWxl');\n\n@$core.Deprecated('Use settingItemDescriptor instead')\nconst SettingItem$json = {\n  '1': 'SettingItem',\n  '2': [\n    {\n      '1': 'more',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.SettingMore',\n      '9': 0,\n      '10': 'more'\n    },\n    {\n      '1': 'vertical',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.SettingVertical',\n      '9': 0,\n      '10': 'vertical'\n    },\n    {\n      '1': 'switch',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.SettingSwitch',\n      '9': 0,\n      '10': 'switch'\n    },\n    {\n      '1': 'base',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.SettingBase',\n      '10': 'base'\n    },\n    {\n      '1': 'style',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.SettingItemStyle',\n      '10': 'style'\n    },\n  ],\n  '8': [\n    {'1': 'value'},\n  ],\n};\n\n/// Descriptor for `SettingItem`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List settingItemDescriptor = $convert.base64Decode(\n    'CgtTZXR0aW5nSXRlbRI4CgRtb3JlGAMgASgLMiIuYmlsaWJpbGkucGxheWVyc2hhcmVkLlNldH'\n    'RpbmdNb3JlSABSBG1vcmUSRAoIdmVydGljYWwYBCABKAsyJi5iaWxpYmlsaS5wbGF5ZXJzaGFy'\n    'ZWQuU2V0dGluZ1ZlcnRpY2FsSABSCHZlcnRpY2FsEj4KBnN3aXRjaBgFIAEoCzIkLmJpbGliaW'\n    'xpLnBsYXllcnNoYXJlZC5TZXR0aW5nU3dpdGNoSABSBnN3aXRjaBI2CgRiYXNlGAEgASgLMiIu'\n    'YmlsaWJpbGkucGxheWVyc2hhcmVkLlNldHRpbmdCYXNlUgRiYXNlEj0KBXN0eWxlGAIgASgOMi'\n    'cuYmlsaWJpbGkucGxheWVyc2hhcmVkLlNldHRpbmdJdGVtU3R5bGVSBXN0eWxlQgcKBXZhbHVl');\n\n@$core.Deprecated('Use settingMoreDescriptor instead')\nconst SettingMore$json = {\n  '1': 'SettingMore',\n  '2': [\n    {'1': 'url', '3': 1, '4': 1, '5': 9, '10': 'url'},\n    {'1': 'right_title', '3': 2, '4': 1, '5': 9, '10': 'rightTitle'},\n    {'1': 'right_icon', '3': 3, '4': 1, '5': 9, '10': 'rightIcon'},\n    {\n      '1': 'jump_type',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.SettingJumpType',\n      '10': 'jumpType'\n    },\n    {'1': 'need_login', '3': 5, '4': 1, '5': 8, '10': 'needLogin'},\n    {\n      '1': 'badge',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.Badge',\n      '10': 'badge'\n    },\n  ],\n};\n\n/// Descriptor for `SettingMore`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List settingMoreDescriptor = $convert.base64Decode(\n    'CgtTZXR0aW5nTW9yZRIQCgN1cmwYASABKAlSA3VybBIfCgtyaWdodF90aXRsZRgCIAEoCVIKcm'\n    'lnaHRUaXRsZRIdCgpyaWdodF9pY29uGAMgASgJUglyaWdodEljb24SQwoJanVtcF90eXBlGAQg'\n    'ASgOMiYuYmlsaWJpbGkucGxheWVyc2hhcmVkLlNldHRpbmdKdW1wVHlwZVIIanVtcFR5cGUSHQ'\n    'oKbmVlZF9sb2dpbhgFIAEoCFIJbmVlZExvZ2luEjIKBWJhZGdlGAYgASgLMhwuYmlsaWJpbGku'\n    'cGxheWVyc2hhcmVkLkJhZGdlUgViYWRnZQ==');\n\n@$core.Deprecated('Use settingSwitchDescriptor instead')\nconst SettingSwitch$json = {\n  '1': 'SettingSwitch',\n  '2': [\n    {\n      '1': 'badge',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.Badge',\n      '10': 'badge'\n    },\n  ],\n};\n\n/// Descriptor for `SettingSwitch`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List settingSwitchDescriptor = $convert.base64Decode(\n    'Cg1TZXR0aW5nU3dpdGNoEjIKBWJhZGdlGAEgASgLMhwuYmlsaWJpbGkucGxheWVyc2hhcmVkLk'\n    'JhZGdlUgViYWRnZQ==');\n\n@$core.Deprecated('Use settingVerticalDescriptor instead')\nconst SettingVertical$json = {\n  '1': 'SettingVertical',\n  '2': [\n    {'1': 'url', '3': 1, '4': 1, '5': 9, '10': 'url'},\n    {\n      '1': 'jump_type',\n      '3': 2,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.SettingJumpType',\n      '10': 'jumpType'\n    },\n    {'1': 'need_login', '3': 3, '4': 1, '5': 8, '10': 'needLogin'},\n    {\n      '1': 'badge',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.Badge',\n      '10': 'badge'\n    },\n  ],\n};\n\n/// Descriptor for `SettingVertical`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List settingVerticalDescriptor = $convert.base64Decode(\n    'Cg9TZXR0aW5nVmVydGljYWwSEAoDdXJsGAEgASgJUgN1cmwSQwoJanVtcF90eXBlGAIgASgOMi'\n    'YuYmlsaWJpbGkucGxheWVyc2hhcmVkLlNldHRpbmdKdW1wVHlwZVIIanVtcFR5cGUSHQoKbmVl'\n    'ZF9sb2dpbhgDIAEoCFIJbmVlZExvZ2luEjIKBWJhZGdlGAQgASgLMhwuYmlsaWJpbGkucGxheW'\n    'Vyc2hhcmVkLkJhZGdlUgViYWRnZQ==');\n\n@$core.Deprecated('Use shakeDescriptor instead')\nconst Shake$json = {\n  '1': 'Shake',\n  '2': [\n    {'1': 'file', '3': 1, '4': 1, '5': 9, '10': 'file'},\n  ],\n};\n\n/// Descriptor for `Shake`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List shakeDescriptor =\n    $convert.base64Decode('CgVTaGFrZRISCgRmaWxlGAEgASgJUgRmaWxl');\n\n@$core.Deprecated('Use streamDescriptor instead')\nconst Stream$json = {\n  '1': 'Stream',\n  '2': [\n    {\n      '1': 'dash_video',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.DashVideo',\n      '9': 0,\n      '10': 'dashVideo'\n    },\n    {\n      '1': 'segment_video',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.SegmentVideo',\n      '9': 0,\n      '10': 'segmentVideo'\n    },\n    {\n      '1': 'multi_dash_video',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.MultiDashVideo',\n      '9': 0,\n      '10': 'multiDashVideo'\n    },\n    {\n      '1': 'stream_info',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.StreamInfo',\n      '10': 'streamInfo'\n    },\n  ],\n  '8': [\n    {'1': 'content'},\n  ],\n};\n\n/// Descriptor for `Stream`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List streamDescriptor = $convert.base64Decode(\n    'CgZTdHJlYW0SQQoKZGFzaF92aWRlbxgCIAEoCzIgLmJpbGliaWxpLnBsYXllcnNoYXJlZC5EYX'\n    'NoVmlkZW9IAFIJZGFzaFZpZGVvEkoKDXNlZ21lbnRfdmlkZW8YAyABKAsyIy5iaWxpYmlsaS5w'\n    'bGF5ZXJzaGFyZWQuU2VnbWVudFZpZGVvSABSDHNlZ21lbnRWaWRlbxJRChBtdWx0aV9kYXNoX3'\n    'ZpZGVvGAQgASgLMiUuYmlsaWJpbGkucGxheWVyc2hhcmVkLk11bHRpRGFzaFZpZGVvSABSDm11'\n    'bHRpRGFzaFZpZGVvEkIKC3N0cmVhbV9pbmZvGAEgASgLMiEuYmlsaWJpbGkucGxheWVyc2hhcm'\n    'VkLlN0cmVhbUluZm9SCnN0cmVhbUluZm9CCQoHY29udGVudA==');\n\n@$core.Deprecated('Use streamInfoDescriptor instead')\nconst StreamInfo$json = {\n  '1': 'StreamInfo',\n  '2': [\n    {'1': 'quality', '3': 1, '4': 1, '5': 5, '10': 'quality'},\n    {'1': 'format', '3': 2, '4': 1, '5': 9, '10': 'format'},\n    {'1': 'description', '3': 3, '4': 1, '5': 9, '10': 'description'},\n    {\n      '1': 'err_code',\n      '3': 4,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.PlayErr',\n      '10': 'errCode'\n    },\n    {\n      '1': 'limit',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.StreamLimit',\n      '10': 'limit'\n    },\n    {'1': 'need_vip', '3': 6, '4': 1, '5': 8, '10': 'needVip'},\n    {'1': 'need_login', '3': 7, '4': 1, '5': 8, '10': 'needLogin'},\n    {'1': 'intact', '3': 8, '4': 1, '5': 8, '10': 'intact'},\n    {'1': 'no_rexcode', '3': 9, '4': 1, '5': 8, '10': 'noRexcode'},\n    {'1': 'attribute', '3': 10, '4': 1, '5': 3, '10': 'attribute'},\n    {'1': 'new_description', '3': 11, '4': 1, '5': 9, '10': 'newDescription'},\n    {'1': 'display_desc', '3': 12, '4': 1, '5': 9, '10': 'displayDesc'},\n    {'1': 'superscript', '3': 13, '4': 1, '5': 9, '10': 'superscript'},\n    {'1': 'vip_free', '3': 14, '4': 1, '5': 8, '10': 'vipFree'},\n    {'1': 'subtitle', '3': 15, '4': 1, '5': 9, '10': 'subtitle'},\n    {\n      '1': 'scheme',\n      '3': 16,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.Scheme',\n      '10': 'scheme'\n    },\n    {'1': 'support_drm', '3': 17, '4': 1, '5': 8, '10': 'supportDrm'},\n  ],\n};\n\n/// Descriptor for `StreamInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List streamInfoDescriptor = $convert.base64Decode(\n    'CgpTdHJlYW1JbmZvEhgKB3F1YWxpdHkYASABKAVSB3F1YWxpdHkSFgoGZm9ybWF0GAIgASgJUg'\n    'Zmb3JtYXQSIAoLZGVzY3JpcHRpb24YAyABKAlSC2Rlc2NyaXB0aW9uEjkKCGVycl9jb2RlGAQg'\n    'ASgOMh4uYmlsaWJpbGkucGxheWVyc2hhcmVkLlBsYXlFcnJSB2VyckNvZGUSOAoFbGltaXQYBS'\n    'ABKAsyIi5iaWxpYmlsaS5wbGF5ZXJzaGFyZWQuU3RyZWFtTGltaXRSBWxpbWl0EhkKCG5lZWRf'\n    'dmlwGAYgASgIUgduZWVkVmlwEh0KCm5lZWRfbG9naW4YByABKAhSCW5lZWRMb2dpbhIWCgZpbn'\n    'RhY3QYCCABKAhSBmludGFjdBIdCgpub19yZXhjb2RlGAkgASgIUglub1JleGNvZGUSHAoJYXR0'\n    'cmlidXRlGAogASgDUglhdHRyaWJ1dGUSJwoPbmV3X2Rlc2NyaXB0aW9uGAsgASgJUg5uZXdEZX'\n    'NjcmlwdGlvbhIhCgxkaXNwbGF5X2Rlc2MYDCABKAlSC2Rpc3BsYXlEZXNjEiAKC3N1cGVyc2Ny'\n    'aXB0GA0gASgJUgtzdXBlcnNjcmlwdBIZCgh2aXBfZnJlZRgOIAEoCFIHdmlwRnJlZRIaCghzdW'\n    'J0aXRsZRgPIAEoCVIIc3VidGl0bGUSNQoGc2NoZW1lGBAgASgLMh0uYmlsaWJpbGkucGxheWVy'\n    'c2hhcmVkLlNjaGVtZVIGc2NoZW1lEh8KC3N1cHBvcnRfZHJtGBEgASgIUgpzdXBwb3J0RHJt');\n\n@$core.Deprecated('Use streamLimitDescriptor instead')\nconst StreamLimit$json = {\n  '1': 'StreamLimit',\n  '2': [\n    {'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},\n    {'1': 'uri', '3': 2, '4': 1, '5': 9, '10': 'uri'},\n    {'1': 'msg', '3': 3, '4': 1, '5': 9, '10': 'msg'},\n  ],\n};\n\n/// Descriptor for `StreamLimit`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List streamLimitDescriptor = $convert.base64Decode(\n    'CgtTdHJlYW1MaW1pdBIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSEAoDdXJpGAIgASgJUgN1cmkSEA'\n    'oDbXNnGAMgASgJUgNtc2c=');\n\n@$core.Deprecated('Use taskParamDescriptor instead')\nconst TaskParam$json = {\n  '1': 'TaskParam',\n  '2': [\n    {'1': 'task_type', '3': 1, '4': 1, '5': 9, '10': 'taskType'},\n    {'1': 'activity_id', '3': 2, '4': 1, '5': 3, '10': 'activityId'},\n    {'1': 'tips_id', '3': 3, '4': 1, '5': 3, '10': 'tipsId'},\n  ],\n};\n\n/// Descriptor for `TaskParam`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List taskParamDescriptor = $convert.base64Decode(\n    'CglUYXNrUGFyYW0SGwoJdGFza190eXBlGAEgASgJUgh0YXNrVHlwZRIfCgthY3Rpdml0eV9pZB'\n    'gCIAEoA1IKYWN0aXZpdHlJZBIXCgd0aXBzX2lkGAMgASgDUgZ0aXBzSWQ=');\n\n@$core.Deprecated('Use textInfoDescriptor instead')\nconst TextInfo$json = {\n  '1': 'TextInfo',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {'1': 'text_color', '3': 2, '4': 1, '5': 9, '10': 'textColor'},\n    {'1': 'text_color_night', '3': 3, '4': 1, '5': 9, '10': 'textColorNight'},\n    {'1': 'font_size', '3': 4, '4': 1, '5': 5, '10': 'fontSize'},\n  ],\n};\n\n/// Descriptor for `TextInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List textInfoDescriptor = $convert.base64Decode(\n    'CghUZXh0SW5mbxISCgR0ZXh0GAEgASgJUgR0ZXh0Eh0KCnRleHRfY29sb3IYAiABKAlSCXRleH'\n    'RDb2xvchIoChB0ZXh0X2NvbG9yX25pZ2h0GAMgASgJUg50ZXh0Q29sb3JOaWdodBIbCglmb250'\n    'X3NpemUYBCABKAVSCGZvbnRTaXpl');\n\n@$core.Deprecated('Use toastDescriptor instead')\nconst Toast$json = {\n  '1': 'Toast',\n  '2': [\n    {'1': 'text', '3': 1, '4': 1, '5': 9, '10': 'text'},\n    {\n      '1': 'button',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.Button',\n      '10': 'button'\n    },\n  ],\n};\n\n/// Descriptor for `Toast`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List toastDescriptor = $convert.base64Decode(\n    'CgVUb2FzdBISCgR0ZXh0GAEgASgJUgR0ZXh0EjUKBmJ1dHRvbhgCIAEoCzIdLmJpbGliaWxpLn'\n    'BsYXllcnNoYXJlZC5CdXR0b25SBmJ1dHRvbg==');\n\n@$core.Deprecated('Use videoCtrlDescriptor instead')\nconst VideoCtrl$json = {\n  '1': 'VideoCtrl',\n  '2': [\n    {\n      '1': 'auto_qn_ctl',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.AutoQnCtl',\n      '10': 'autoQnCtl'\n    },\n    {\n      '1': 'qn_exp',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.QnExp',\n      '10': 'qnExp'\n    },\n  ],\n};\n\n/// Descriptor for `VideoCtrl`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List videoCtrlDescriptor = $convert.base64Decode(\n    'CglWaWRlb0N0cmwSQAoLYXV0b19xbl9jdGwYASABKAsyIC5iaWxpYmlsaS5wbGF5ZXJzaGFyZW'\n    'QuQXV0b1FuQ3RsUglhdXRvUW5DdGwSMwoGcW5fZXhwGAIgASgLMhwuYmlsaWJpbGkucGxheWVy'\n    'c2hhcmVkLlFuRXhwUgVxbkV4cA==');\n\n@$core.Deprecated('Use videoVodDescriptor instead')\nconst VideoVod$json = {\n  '1': 'VideoVod',\n  '2': [\n    {'1': 'aid', '3': 1, '4': 1, '5': 3, '10': 'aid'},\n    {'1': 'cid', '3': 2, '4': 1, '5': 3, '10': 'cid'},\n    {'1': 'qn', '3': 3, '4': 1, '5': 3, '10': 'qn'},\n    {'1': 'fnver', '3': 4, '4': 1, '5': 5, '10': 'fnver'},\n    {'1': 'fnval', '3': 5, '4': 1, '5': 5, '10': 'fnval'},\n    {'1': 'download', '3': 6, '4': 1, '5': 5, '10': 'download'},\n    {'1': 'force_host', '3': 7, '4': 1, '5': 5, '10': 'forceHost'},\n    {'1': 'fourk', '3': 8, '4': 1, '5': 8, '10': 'fourk'},\n    {\n      '1': 'prefer_codec_type',\n      '3': 9,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.CodeType',\n      '10': 'preferCodecType'\n    },\n    {'1': 'voice_balance', '3': 10, '4': 1, '5': 3, '10': 'voiceBalance'},\n    {'1': 'is_need_trial', '3': 11, '4': 1, '5': 8, '10': 'isNeedTrial'},\n    {\n      '1': 'qn_policy',\n      '3': 12,\n      '4': 1,\n      '5': 14,\n      '6': '.bilibili.playershared.QnPolicy',\n      '10': 'qnPolicy'\n    },\n    {'1': 'soft_fnval', '3': 13, '4': 1, '5': 3, '10': 'softFnval'},\n  ],\n};\n\n/// Descriptor for `VideoVod`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List videoVodDescriptor = $convert.base64Decode(\n    'CghWaWRlb1ZvZBIQCgNhaWQYASABKANSA2FpZBIQCgNjaWQYAiABKANSA2NpZBIOCgJxbhgDIA'\n    'EoA1ICcW4SFAoFZm52ZXIYBCABKAVSBWZudmVyEhQKBWZudmFsGAUgASgFUgVmbnZhbBIaCghk'\n    'b3dubG9hZBgGIAEoBVIIZG93bmxvYWQSHQoKZm9yY2VfaG9zdBgHIAEoBVIJZm9yY2VIb3N0Eh'\n    'QKBWZvdXJrGAggASgIUgVmb3VyaxJLChFwcmVmZXJfY29kZWNfdHlwZRgJIAEoDjIfLmJpbGli'\n    'aWxpLnBsYXllcnNoYXJlZC5Db2RlVHlwZVIPcHJlZmVyQ29kZWNUeXBlEiMKDXZvaWNlX2JhbG'\n    'FuY2UYCiABKANSDHZvaWNlQmFsYW5jZRIiCg1pc19uZWVkX3RyaWFsGAsgASgIUgtpc05lZWRU'\n    'cmlhbBI8Cglxbl9wb2xpY3kYDCABKA4yHy5iaWxpYmlsaS5wbGF5ZXJzaGFyZWQuUW5Qb2xpY3'\n    'lSCHFuUG9saWN5Eh0KCnNvZnRfZm52YWwYDSABKANSCXNvZnRGbnZhbA==');\n\n@$core.Deprecated('Use viewInfoDescriptor instead')\nconst ViewInfo$json = {\n  '1': 'ViewInfo',\n  '2': [\n    {\n      '1': 'dialog_map',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.ViewInfo.DialogMapEntry',\n      '10': 'dialogMap'\n    },\n    {\n      '1': 'prompt_bar',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.PromptBar',\n      '10': 'promptBar'\n    },\n    {\n      '1': 'toasts',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.ComprehensiveToast',\n      '10': 'toasts'\n    },\n    {\n      '1': 'pay_wall_onshow_action',\n      '3': 4,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.PayWallOnshowAction',\n      '10': 'payWallOnshowAction'\n    },\n    {\n      '1': 'exp_switch',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.ExpSwitch',\n      '10': 'expSwitch'\n    },\n    {\n      '1': 'full_prompt_bar',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.FullPromptBar',\n      '10': 'fullPromptBar'\n    },\n    {\n      '1': 'resident_bar',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.ResidentBar',\n      '10': 'residentBar'\n    },\n  ],\n  '3': [ViewInfo_DialogMapEntry$json],\n};\n\n@$core.Deprecated('Use viewInfoDescriptor instead')\nconst ViewInfo_DialogMapEntry$json = {\n  '1': 'DialogMapEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {\n      '1': 'value',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.Dialog',\n      '10': 'value'\n    },\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `ViewInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List viewInfoDescriptor = $convert.base64Decode(\n    'CghWaWV3SW5mbxJNCgpkaWFsb2dfbWFwGAEgAygLMi4uYmlsaWJpbGkucGxheWVyc2hhcmVkLl'\n    'ZpZXdJbmZvLkRpYWxvZ01hcEVudHJ5UglkaWFsb2dNYXASPwoKcHJvbXB0X2JhchgCIAEoCzIg'\n    'LmJpbGliaWxpLnBsYXllcnNoYXJlZC5Qcm9tcHRCYXJSCXByb21wdEJhchJBCgZ0b2FzdHMYAy'\n    'ADKAsyKS5iaWxpYmlsaS5wbGF5ZXJzaGFyZWQuQ29tcHJlaGVuc2l2ZVRvYXN0UgZ0b2FzdHMS'\n    'XwoWcGF5X3dhbGxfb25zaG93X2FjdGlvbhgEIAEoCzIqLmJpbGliaWxpLnBsYXllcnNoYXJlZC'\n    '5QYXlXYWxsT25zaG93QWN0aW9uUhNwYXlXYWxsT25zaG93QWN0aW9uEj8KCmV4cF9zd2l0Y2gY'\n    'BSABKAsyIC5iaWxpYmlsaS5wbGF5ZXJzaGFyZWQuRXhwU3dpdGNoUglleHBTd2l0Y2gSTAoPZn'\n    'VsbF9wcm9tcHRfYmFyGAYgASgLMiQuYmlsaWJpbGkucGxheWVyc2hhcmVkLkZ1bGxQcm9tcHRC'\n    'YXJSDWZ1bGxQcm9tcHRCYXISRQoMcmVzaWRlbnRfYmFyGAcgASgLMiIuYmlsaWJpbGkucGxheW'\n    'Vyc2hhcmVkLlJlc2lkZW50QmFyUgtyZXNpZGVudEJhchpbCg5EaWFsb2dNYXBFbnRyeRIQCgNr'\n    'ZXkYASABKAlSA2tleRIzCgV2YWx1ZRgCIAEoCzIdLmJpbGliaWxpLnBsYXllcnNoYXJlZC5EaW'\n    'Fsb2dSBXZhbHVlOgI4AQ==');\n\n@$core.Deprecated('Use vodInfoDescriptor instead')\nconst VodInfo$json = {\n  '1': 'VodInfo',\n  '2': [\n    {'1': 'quality', '3': 1, '4': 1, '5': 5, '10': 'quality'},\n    {'1': 'format', '3': 2, '4': 1, '5': 9, '10': 'format'},\n    {'1': 'timelength', '3': 3, '4': 1, '5': 3, '10': 'timelength'},\n    {'1': 'video_codecid', '3': 4, '4': 1, '5': 5, '10': 'videoCodecid'},\n    {\n      '1': 'stream_list',\n      '3': 5,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.Stream',\n      '10': 'streamList'\n    },\n    {\n      '1': 'dash_audio',\n      '3': 6,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.DashItem',\n      '10': 'dashAudio'\n    },\n    {\n      '1': 'dolby',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.DolbyItem',\n      '10': 'dolby'\n    },\n    {\n      '1': 'volume',\n      '3': 8,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.VolumeInfo',\n      '10': 'volume'\n    },\n    {\n      '1': 'loss_less_item',\n      '3': 9,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.LossLessItem',\n      '10': 'lossLessItem'\n    },\n    {'1': 'support_project', '3': 10, '4': 1, '5': 8, '10': 'supportProject'},\n    {\n      '1': 'ai_audio',\n      '3': 11,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.playershared.AIAudio',\n      '10': 'aiAudio'\n    },\n  ],\n};\n\n/// Descriptor for `VodInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List vodInfoDescriptor = $convert.base64Decode(\n    'CgdWb2RJbmZvEhgKB3F1YWxpdHkYASABKAVSB3F1YWxpdHkSFgoGZm9ybWF0GAIgASgJUgZmb3'\n    'JtYXQSHgoKdGltZWxlbmd0aBgDIAEoA1IKdGltZWxlbmd0aBIjCg12aWRlb19jb2RlY2lkGAQg'\n    'ASgFUgx2aWRlb0NvZGVjaWQSPgoLc3RyZWFtX2xpc3QYBSADKAsyHS5iaWxpYmlsaS5wbGF5ZX'\n    'JzaGFyZWQuU3RyZWFtUgpzdHJlYW1MaXN0Ej4KCmRhc2hfYXVkaW8YBiADKAsyHy5iaWxpYmls'\n    'aS5wbGF5ZXJzaGFyZWQuRGFzaEl0ZW1SCWRhc2hBdWRpbxI2CgVkb2xieRgHIAEoCzIgLmJpbG'\n    'liaWxpLnBsYXllcnNoYXJlZC5Eb2xieUl0ZW1SBWRvbGJ5EjkKBnZvbHVtZRgIIAEoCzIhLmJp'\n    'bGliaWxpLnBsYXllcnNoYXJlZC5Wb2x1bWVJbmZvUgZ2b2x1bWUSSQoObG9zc19sZXNzX2l0ZW'\n    '0YCSABKAsyIy5iaWxpYmlsaS5wbGF5ZXJzaGFyZWQuTG9zc0xlc3NJdGVtUgxsb3NzTGVzc0l0'\n    'ZW0SJwoPc3VwcG9ydF9wcm9qZWN0GAogASgIUg5zdXBwb3J0UHJvamVjdBI5CghhaV9hdWRpbx'\n    'gLIAEoCzIeLmJpbGliaWxpLnBsYXllcnNoYXJlZC5BSUF1ZGlvUgdhaUF1ZGlv');\n\n@$core.Deprecated('Use volumeInfoDescriptor instead')\nconst VolumeInfo$json = {\n  '1': 'VolumeInfo',\n  '2': [\n    {'1': 'measured_i', '3': 1, '4': 1, '5': 1, '10': 'measuredI'},\n    {'1': 'measured_lra', '3': 2, '4': 1, '5': 1, '10': 'measuredLra'},\n    {'1': 'measured_tp', '3': 3, '4': 1, '5': 1, '10': 'measuredTp'},\n    {\n      '1': 'measured_threshold',\n      '3': 4,\n      '4': 1,\n      '5': 1,\n      '10': 'measuredThreshold'\n    },\n    {'1': 'target_offset', '3': 5, '4': 1, '5': 1, '10': 'targetOffset'},\n    {'1': 'target_i', '3': 6, '4': 1, '5': 1, '10': 'targetI'},\n    {'1': 'target_tp', '3': 7, '4': 1, '5': 1, '10': 'targetTp'},\n    {\n      '1': 'multi_scene_args',\n      '3': 8,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.playershared.VolumeInfo.MultiSceneArgsEntry',\n      '10': 'multiSceneArgs'\n    },\n  ],\n  '3': [VolumeInfo_MultiSceneArgsEntry$json],\n};\n\n@$core.Deprecated('Use volumeInfoDescriptor instead')\nconst VolumeInfo_MultiSceneArgsEntry$json = {\n  '1': 'MultiSceneArgsEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},\n    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `VolumeInfo`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List volumeInfoDescriptor = $convert.base64Decode(\n    'CgpWb2x1bWVJbmZvEh0KCm1lYXN1cmVkX2kYASABKAFSCW1lYXN1cmVkSRIhCgxtZWFzdXJlZF'\n    '9scmEYAiABKAFSC21lYXN1cmVkTHJhEh8KC21lYXN1cmVkX3RwGAMgASgBUgptZWFzdXJlZFRw'\n    'Ei0KEm1lYXN1cmVkX3RocmVzaG9sZBgEIAEoAVIRbWVhc3VyZWRUaHJlc2hvbGQSIwoNdGFyZ2'\n    'V0X29mZnNldBgFIAEoAVIMdGFyZ2V0T2Zmc2V0EhkKCHRhcmdldF9pGAYgASgBUgd0YXJnZXRJ'\n    'EhsKCXRhcmdldF90cBgHIAEoAVIIdGFyZ2V0VHASXwoQbXVsdGlfc2NlbmVfYXJncxgIIAMoCz'\n    'I1LmJpbGliaWxpLnBsYXllcnNoYXJlZC5Wb2x1bWVJbmZvLk11bHRpU2NlbmVBcmdzRW50cnlS'\n    'Dm11bHRpU2NlbmVBcmdzGkEKE011bHRpU2NlbmVBcmdzRW50cnkSEAoDa2V5GAEgASgJUgNrZX'\n    'kSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4AQ==');\n"
  },
  {
    "path": "lib/grpc/bilibili/rpc.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/rpc.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\nimport 'package:protobuf/well_known_types/google/protobuf/any.pb.dart' as $0;\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nclass Status extends $pb.GeneratedMessage {\n  factory Status({\n    $core.int? code,\n    $core.String? message,\n    $core.Iterable<$0.Any>? details,\n  }) {\n    final result = create();\n    if (code != null) result.code = code;\n    if (message != null) result.message = message;\n    if (details != null) result.details.addAll(details);\n    return result;\n  }\n\n  Status._();\n\n  factory Status.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory Status.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'Status',\n      package: const $pb.PackageName(_omitMessageNames ? '' : 'bilibili.rpc'),\n      createEmptyInstance: create)\n    ..aI(1, _omitFieldNames ? '' : 'code')\n    ..aOS(2, _omitFieldNames ? '' : 'message')\n    ..pPM<$0.Any>(3, _omitFieldNames ? '' : 'details',\n        subBuilder: $0.Any.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Status clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Status copyWith(void Function(Status) updates) =>\n      super.copyWith((message) => updates(message as Status)) as Status;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Status create() => Status._();\n  @$core.override\n  Status createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static Status getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Status>(create);\n  static Status? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.int get code => $_getIZ(0);\n  @$pb.TagNumber(1)\n  set code($core.int value) => $_setSignedInt32(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasCode() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearCode() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get message => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set message($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasMessage() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearMessage() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<$0.Any> get details => $_getList(2);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/rpc.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/rpc.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n"
  },
  {
    "path": "lib/grpc/bilibili/rpc.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/rpc.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use statusDescriptor instead')\nconst Status$json = {\n  '1': 'Status',\n  '2': [\n    {'1': 'code', '3': 1, '4': 1, '5': 5, '10': 'code'},\n    {'1': 'message', '3': 2, '4': 1, '5': 9, '10': 'message'},\n    {\n      '1': 'details',\n      '3': 3,\n      '4': 3,\n      '5': 11,\n      '6': '.google.protobuf.Any',\n      '10': 'details'\n    },\n  ],\n};\n\n/// Descriptor for `Status`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List statusDescriptor = $convert.base64Decode(\n    'CgZTdGF0dXMSEgoEY29kZRgBIAEoBVIEY29kZRIYCgdtZXNzYWdlGAIgASgJUgdtZXNzYWdlEi'\n    '4KB2RldGFpbHMYAyADKAsyFC5nb29nbGUucHJvdG9idWYuQW55UgdkZXRhaWxz');\n"
  },
  {
    "path": "lib/grpc/bilibili/vas/garb/model.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/vas/garb/model.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:fixnum/fixnum.dart' as $fixnum;\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nclass FanNumColorFormat extends $pb.GeneratedMessage {\n  factory FanNumColorFormat({\n    $core.String? startPoint,\n    $core.String? endPoint,\n    $core.Iterable<$core.String>? colors,\n    $core.Iterable<$fixnum.Int64>? gradients,\n  }) {\n    final result = create();\n    if (startPoint != null) result.startPoint = startPoint;\n    if (endPoint != null) result.endPoint = endPoint;\n    if (colors != null) result.colors.addAll(colors);\n    if (gradients != null) result.gradients.addAll(gradients);\n    return result;\n  }\n\n  FanNumColorFormat._();\n\n  factory FanNumColorFormat.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory FanNumColorFormat.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'FanNumColorFormat',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.vas.garb.model'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'startPoint')\n    ..aOS(2, _omitFieldNames ? '' : 'endPoint')\n    ..pPS(3, _omitFieldNames ? '' : 'colors')\n    ..p<$fixnum.Int64>(\n        4, _omitFieldNames ? '' : 'gradients', $pb.PbFieldType.K6)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FanNumColorFormat clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  FanNumColorFormat copyWith(void Function(FanNumColorFormat) updates) =>\n      super.copyWith((message) => updates(message as FanNumColorFormat))\n          as FanNumColorFormat;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static FanNumColorFormat create() => FanNumColorFormat._();\n  @$core.override\n  FanNumColorFormat createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static FanNumColorFormat getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<FanNumColorFormat>(create);\n  static FanNumColorFormat? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get startPoint => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set startPoint($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasStartPoint() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearStartPoint() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get endPoint => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set endPoint($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasEndPoint() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearEndPoint() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $pb.PbList<$core.String> get colors => $_getList(2);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<$fixnum.Int64> get gradients => $_getList(3);\n}\n\nclass ImageGroup_VisualEffect extends $pb.GeneratedMessage {\n  factory ImageGroup_VisualEffect({\n    $core.String? medalImage,\n    $core.String? colorTheme,\n  }) {\n    final result = create();\n    if (medalImage != null) result.medalImage = medalImage;\n    if (colorTheme != null) result.colorTheme = colorTheme;\n    return result;\n  }\n\n  ImageGroup_VisualEffect._();\n\n  factory ImageGroup_VisualEffect.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ImageGroup_VisualEffect.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ImageGroup.VisualEffect',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.vas.garb.model'),\n      createEmptyInstance: create)\n    ..aOS(1, _omitFieldNames ? '' : 'medalImage')\n    ..aOS(2, _omitFieldNames ? '' : 'colorTheme')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ImageGroup_VisualEffect clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ImageGroup_VisualEffect copyWith(\n          void Function(ImageGroup_VisualEffect) updates) =>\n      super.copyWith((message) => updates(message as ImageGroup_VisualEffect))\n          as ImageGroup_VisualEffect;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ImageGroup_VisualEffect create() => ImageGroup_VisualEffect._();\n  @$core.override\n  ImageGroup_VisualEffect createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ImageGroup_VisualEffect getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ImageGroup_VisualEffect>(create);\n  static ImageGroup_VisualEffect? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get medalImage => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set medalImage($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasMedalImage() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearMedalImage() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get colorTheme => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set colorTheme($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasColorTheme() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearColorTheme() => $_clearField(2);\n}\n\nclass ImageGroup extends $pb.GeneratedMessage {\n  factory ImageGroup({\n    $fixnum.Int64? type,\n    ImageGroup_VisualEffect? effectVisual,\n  }) {\n    final result = create();\n    if (type != null) result.type = type;\n    if (effectVisual != null) result.effectVisual = effectVisual;\n    return result;\n  }\n\n  ImageGroup._();\n\n  factory ImageGroup.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory ImageGroup.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'ImageGroup',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.vas.garb.model'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'type')\n    ..aOM<ImageGroup_VisualEffect>(2, _omitFieldNames ? '' : 'effectVisual',\n        subBuilder: ImageGroup_VisualEffect.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ImageGroup clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  ImageGroup copyWith(void Function(ImageGroup) updates) =>\n      super.copyWith((message) => updates(message as ImageGroup)) as ImageGroup;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static ImageGroup create() => ImageGroup._();\n  @$core.override\n  ImageGroup createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static ImageGroup getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<ImageGroup>(create);\n  static ImageGroup? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get type => $_getI64(0);\n  @$pb.TagNumber(1)\n  set type($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasType() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearType() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  ImageGroup_VisualEffect get effectVisual => $_getN(1);\n  @$pb.TagNumber(2)\n  set effectVisual(ImageGroup_VisualEffect value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasEffectVisual() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearEffectVisual() => $_clearField(2);\n  @$pb.TagNumber(2)\n  ImageGroup_VisualEffect ensureEffectVisual() => $_ensure(1);\n}\n\nclass UserCardBG extends $pb.GeneratedMessage {\n  factory UserCardBG({\n    $fixnum.Int64? id,\n    $core.String? name,\n    $core.String? image,\n    $core.String? jumpUrl,\n    UserFanShow? fan,\n    $core.String? type,\n    ImageGroup? imageGroup,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (name != null) result.name = name;\n    if (image != null) result.image = image;\n    if (jumpUrl != null) result.jumpUrl = jumpUrl;\n    if (fan != null) result.fan = fan;\n    if (type != null) result.type = type;\n    if (imageGroup != null) result.imageGroup = imageGroup;\n    return result;\n  }\n\n  UserCardBG._();\n\n  factory UserCardBG.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UserCardBG.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UserCardBG',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.vas.garb.model'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'image')\n    ..aOS(4, _omitFieldNames ? '' : 'jumpUrl')\n    ..aOM<UserFanShow>(5, _omitFieldNames ? '' : 'fan',\n        subBuilder: UserFanShow.create)\n    ..aOS(6, _omitFieldNames ? '' : 'type')\n    ..aOM<ImageGroup>(7, _omitFieldNames ? '' : 'imageGroup',\n        subBuilder: ImageGroup.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserCardBG clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserCardBG copyWith(void Function(UserCardBG) updates) =>\n      super.copyWith((message) => updates(message as UserCardBG)) as UserCardBG;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UserCardBG create() => UserCardBG._();\n  @$core.override\n  UserCardBG createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UserCardBG getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UserCardBG>(create);\n  static UserCardBG? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get image => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set image($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasImage() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearImage() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get jumpUrl => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set jumpUrl($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasJumpUrl() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearJumpUrl() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  UserFanShow get fan => $_getN(4);\n  @$pb.TagNumber(5)\n  set fan(UserFanShow value) => $_setField(5, value);\n  @$pb.TagNumber(5)\n  $core.bool hasFan() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearFan() => $_clearField(5);\n  @$pb.TagNumber(5)\n  UserFanShow ensureFan() => $_ensure(4);\n\n  @$pb.TagNumber(6)\n  $core.String get type => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set type($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasType() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearType() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  ImageGroup get imageGroup => $_getN(6);\n  @$pb.TagNumber(7)\n  set imageGroup(ImageGroup value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasImageGroup() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearImageGroup() => $_clearField(7);\n  @$pb.TagNumber(7)\n  ImageGroup ensureImageGroup() => $_ensure(6);\n}\n\nclass UserFanShow extends $pb.GeneratedMessage {\n  factory UserFanShow({\n    $fixnum.Int64? isFan,\n    $fixnum.Int64? number,\n    $core.String? color,\n    $core.String? name,\n    $core.String? numDesc,\n    $core.String? numPrefix,\n    FanNumColorFormat? colorFormat,\n  }) {\n    final result = create();\n    if (isFan != null) result.isFan = isFan;\n    if (number != null) result.number = number;\n    if (color != null) result.color = color;\n    if (name != null) result.name = name;\n    if (numDesc != null) result.numDesc = numDesc;\n    if (numPrefix != null) result.numPrefix = numPrefix;\n    if (colorFormat != null) result.colorFormat = colorFormat;\n    return result;\n  }\n\n  UserFanShow._();\n\n  factory UserFanShow.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UserFanShow.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UserFanShow',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.vas.garb.model'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'isFan')\n    ..aInt64(2, _omitFieldNames ? '' : 'number')\n    ..aOS(3, _omitFieldNames ? '' : 'color')\n    ..aOS(4, _omitFieldNames ? '' : 'name')\n    ..aOS(5, _omitFieldNames ? '' : 'numDesc')\n    ..aOS(6, _omitFieldNames ? '' : 'numPrefix')\n    ..aOM<FanNumColorFormat>(7, _omitFieldNames ? '' : 'colorFormat',\n        subBuilder: FanNumColorFormat.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserFanShow clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserFanShow copyWith(void Function(UserFanShow) updates) =>\n      super.copyWith((message) => updates(message as UserFanShow))\n          as UserFanShow;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UserFanShow create() => UserFanShow._();\n  @$core.override\n  UserFanShow createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UserFanShow getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UserFanShow>(create);\n  static UserFanShow? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get isFan => $_getI64(0);\n  @$pb.TagNumber(1)\n  set isFan($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasIsFan() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearIsFan() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get number => $_getI64(1);\n  @$pb.TagNumber(2)\n  set number($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasNumber() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearNumber() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get color => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set color($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasColor() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearColor() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get name => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set name($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasName() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearName() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get numDesc => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set numDesc($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasNumDesc() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearNumDesc() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get numPrefix => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set numPrefix($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasNumPrefix() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearNumPrefix() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  FanNumColorFormat get colorFormat => $_getN(6);\n  @$pb.TagNumber(7)\n  set colorFormat(FanNumColorFormat value) => $_setField(7, value);\n  @$pb.TagNumber(7)\n  $core.bool hasColorFormat() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearColorFormat() => $_clearField(7);\n  @$pb.TagNumber(7)\n  FanNumColorFormat ensureColorFormat() => $_ensure(6);\n}\n\nclass UserPendant extends $pb.GeneratedMessage {\n  factory UserPendant({\n    $fixnum.Int64? id,\n    $core.String? name,\n    $core.String? image,\n    $core.String? jumpUrl,\n    $core.String? type,\n    $core.String? imageEnhance,\n    $core.String? imageEnhanceFrame,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (name != null) result.name = name;\n    if (image != null) result.image = image;\n    if (jumpUrl != null) result.jumpUrl = jumpUrl;\n    if (type != null) result.type = type;\n    if (imageEnhance != null) result.imageEnhance = imageEnhance;\n    if (imageEnhanceFrame != null) result.imageEnhanceFrame = imageEnhanceFrame;\n    return result;\n  }\n\n  UserPendant._();\n\n  factory UserPendant.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UserPendant.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UserPendant',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.vas.garb.model'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aOS(2, _omitFieldNames ? '' : 'name')\n    ..aOS(3, _omitFieldNames ? '' : 'image')\n    ..aOS(4, _omitFieldNames ? '' : 'jumpUrl')\n    ..aOS(5, _omitFieldNames ? '' : 'type')\n    ..aOS(6, _omitFieldNames ? '' : 'imageEnhance')\n    ..aOS(7, _omitFieldNames ? '' : 'imageEnhanceFrame')\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserPendant clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserPendant copyWith(void Function(UserPendant) updates) =>\n      super.copyWith((message) => updates(message as UserPendant))\n          as UserPendant;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UserPendant create() => UserPendant._();\n  @$core.override\n  UserPendant createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UserPendant getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UserPendant>(create);\n  static UserPendant? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.String get name => $_getSZ(1);\n  @$pb.TagNumber(2)\n  set name($core.String value) => $_setString(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasName() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearName() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get image => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set image($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasImage() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearImage() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get jumpUrl => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set jumpUrl($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasJumpUrl() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearJumpUrl() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get type => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set type($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasType() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearType() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $core.String get imageEnhance => $_getSZ(5);\n  @$pb.TagNumber(6)\n  set imageEnhance($core.String value) => $_setString(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasImageEnhance() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearImageEnhance() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $core.String get imageEnhanceFrame => $_getSZ(6);\n  @$pb.TagNumber(7)\n  set imageEnhanceFrame($core.String value) => $_setString(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasImageEnhanceFrame() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearImageEnhanceFrame() => $_clearField(7);\n}\n\nclass UserSailing extends $pb.GeneratedMessage {\n  factory UserSailing({\n    UserPendant? pendant,\n    UserCardBG? cardBg,\n    UserCardBG? cardBgWithFocus,\n  }) {\n    final result = create();\n    if (pendant != null) result.pendant = pendant;\n    if (cardBg != null) result.cardBg = cardBg;\n    if (cardBgWithFocus != null) result.cardBgWithFocus = cardBgWithFocus;\n    return result;\n  }\n\n  UserSailing._();\n\n  factory UserSailing.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UserSailing.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UserSailing',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.vas.garb.model'),\n      createEmptyInstance: create)\n    ..aOM<UserPendant>(1, _omitFieldNames ? '' : 'pendant',\n        subBuilder: UserPendant.create)\n    ..aOM<UserCardBG>(2, _omitFieldNames ? '' : 'cardBg',\n        subBuilder: UserCardBG.create)\n    ..aOM<UserCardBG>(3, _omitFieldNames ? '' : 'cardBgWithFocus',\n        subBuilder: UserCardBG.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserSailing clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserSailing copyWith(void Function(UserSailing) updates) =>\n      super.copyWith((message) => updates(message as UserSailing))\n          as UserSailing;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UserSailing create() => UserSailing._();\n  @$core.override\n  UserSailing createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UserSailing getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UserSailing>(create);\n  static UserSailing? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  UserPendant get pendant => $_getN(0);\n  @$pb.TagNumber(1)\n  set pendant(UserPendant value) => $_setField(1, value);\n  @$pb.TagNumber(1)\n  $core.bool hasPendant() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearPendant() => $_clearField(1);\n  @$pb.TagNumber(1)\n  UserPendant ensurePendant() => $_ensure(0);\n\n  @$pb.TagNumber(2)\n  UserCardBG get cardBg => $_getN(1);\n  @$pb.TagNumber(2)\n  set cardBg(UserCardBG value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasCardBg() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearCardBg() => $_clearField(2);\n  @$pb.TagNumber(2)\n  UserCardBG ensureCardBg() => $_ensure(1);\n\n  @$pb.TagNumber(3)\n  UserCardBG get cardBgWithFocus => $_getN(2);\n  @$pb.TagNumber(3)\n  set cardBgWithFocus(UserCardBG value) => $_setField(3, value);\n  @$pb.TagNumber(3)\n  $core.bool hasCardBgWithFocus() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearCardBgWithFocus() => $_clearField(3);\n  @$pb.TagNumber(3)\n  UserCardBG ensureCardBgWithFocus() => $_ensure(2);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/vas/garb/model.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/vas/garb/model.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n"
  },
  {
    "path": "lib/grpc/bilibili/vas/garb/model.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/vas/garb/model.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use fanNumColorFormatDescriptor instead')\nconst FanNumColorFormat$json = {\n  '1': 'FanNumColorFormat',\n  '2': [\n    {'1': 'start_point', '3': 1, '4': 1, '5': 9, '10': 'startPoint'},\n    {'1': 'end_point', '3': 2, '4': 1, '5': 9, '10': 'endPoint'},\n    {'1': 'colors', '3': 3, '4': 3, '5': 9, '10': 'colors'},\n    {'1': 'gradients', '3': 4, '4': 3, '5': 3, '10': 'gradients'},\n  ],\n};\n\n/// Descriptor for `FanNumColorFormat`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List fanNumColorFormatDescriptor = $convert.base64Decode(\n    'ChFGYW5OdW1Db2xvckZvcm1hdBIfCgtzdGFydF9wb2ludBgBIAEoCVIKc3RhcnRQb2ludBIbCg'\n    'llbmRfcG9pbnQYAiABKAlSCGVuZFBvaW50EhYKBmNvbG9ycxgDIAMoCVIGY29sb3JzEhwKCWdy'\n    'YWRpZW50cxgEIAMoA1IJZ3JhZGllbnRz');\n\n@$core.Deprecated('Use imageGroupDescriptor instead')\nconst ImageGroup$json = {\n  '1': 'ImageGroup',\n  '2': [\n    {'1': 'type', '3': 1, '4': 1, '5': 3, '10': 'type'},\n    {\n      '1': 'effect_visual',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.vas.garb.model.ImageGroup.VisualEffect',\n      '10': 'effectVisual'\n    },\n  ],\n  '3': [ImageGroup_VisualEffect$json],\n};\n\n@$core.Deprecated('Use imageGroupDescriptor instead')\nconst ImageGroup_VisualEffect$json = {\n  '1': 'VisualEffect',\n  '2': [\n    {'1': 'medal_image', '3': 1, '4': 1, '5': 9, '10': 'medalImage'},\n    {'1': 'color_theme', '3': 2, '4': 1, '5': 9, '10': 'colorTheme'},\n  ],\n};\n\n/// Descriptor for `ImageGroup`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List imageGroupDescriptor = $convert.base64Decode(\n    'CgpJbWFnZUdyb3VwEhIKBHR5cGUYASABKANSBHR5cGUSVQoNZWZmZWN0X3Zpc3VhbBgCIAEoCz'\n    'IwLmJpbGliaWxpLnZhcy5nYXJiLm1vZGVsLkltYWdlR3JvdXAuVmlzdWFsRWZmZWN0UgxlZmZl'\n    'Y3RWaXN1YWwaUAoMVmlzdWFsRWZmZWN0Eh8KC21lZGFsX2ltYWdlGAEgASgJUgptZWRhbEltYW'\n    'dlEh8KC2NvbG9yX3RoZW1lGAIgASgJUgpjb2xvclRoZW1l');\n\n@$core.Deprecated('Use userCardBGDescriptor instead')\nconst UserCardBG$json = {\n  '1': 'UserCardBG',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'image', '3': 3, '4': 1, '5': 9, '10': 'image'},\n    {'1': 'jump_url', '3': 4, '4': 1, '5': 9, '10': 'jumpUrl'},\n    {\n      '1': 'fan',\n      '3': 5,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.vas.garb.model.UserFanShow',\n      '10': 'fan'\n    },\n    {'1': 'type', '3': 6, '4': 1, '5': 9, '10': 'type'},\n    {\n      '1': 'image_group',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.vas.garb.model.ImageGroup',\n      '10': 'imageGroup'\n    },\n  ],\n};\n\n/// Descriptor for `UserCardBG`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List userCardBGDescriptor = $convert.base64Decode(\n    'CgpVc2VyQ2FyZEJHEg4KAmlkGAEgASgDUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEhQKBWltYW'\n    'dlGAMgASgJUgVpbWFnZRIZCghqdW1wX3VybBgEIAEoCVIHanVtcFVybBI2CgNmYW4YBSABKAsy'\n    'JC5iaWxpYmlsaS52YXMuZ2FyYi5tb2RlbC5Vc2VyRmFuU2hvd1IDZmFuEhIKBHR5cGUYBiABKA'\n    'lSBHR5cGUSRAoLaW1hZ2VfZ3JvdXAYByABKAsyIy5iaWxpYmlsaS52YXMuZ2FyYi5tb2RlbC5J'\n    'bWFnZUdyb3VwUgppbWFnZUdyb3Vw');\n\n@$core.Deprecated('Use userFanShowDescriptor instead')\nconst UserFanShow$json = {\n  '1': 'UserFanShow',\n  '2': [\n    {'1': 'is_fan', '3': 1, '4': 1, '5': 3, '10': 'isFan'},\n    {'1': 'number', '3': 2, '4': 1, '5': 3, '10': 'number'},\n    {'1': 'color', '3': 3, '4': 1, '5': 9, '10': 'color'},\n    {'1': 'name', '3': 4, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'num_desc', '3': 5, '4': 1, '5': 9, '10': 'numDesc'},\n    {'1': 'num_prefix', '3': 6, '4': 1, '5': 9, '10': 'numPrefix'},\n    {\n      '1': 'color_format',\n      '3': 7,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.vas.garb.model.FanNumColorFormat',\n      '10': 'colorFormat'\n    },\n  ],\n};\n\n/// Descriptor for `UserFanShow`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List userFanShowDescriptor = $convert.base64Decode(\n    'CgtVc2VyRmFuU2hvdxIVCgZpc19mYW4YASABKANSBWlzRmFuEhYKBm51bWJlchgCIAEoA1IGbn'\n    'VtYmVyEhQKBWNvbG9yGAMgASgJUgVjb2xvchISCgRuYW1lGAQgASgJUgRuYW1lEhkKCG51bV9k'\n    'ZXNjGAUgASgJUgdudW1EZXNjEh0KCm51bV9wcmVmaXgYBiABKAlSCW51bVByZWZpeBJNCgxjb2'\n    'xvcl9mb3JtYXQYByABKAsyKi5iaWxpYmlsaS52YXMuZ2FyYi5tb2RlbC5GYW5OdW1Db2xvckZv'\n    'cm1hdFILY29sb3JGb3JtYXQ=');\n\n@$core.Deprecated('Use userPendantDescriptor instead')\nconst UserPendant$json = {\n  '1': 'UserPendant',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'image', '3': 3, '4': 1, '5': 9, '10': 'image'},\n    {'1': 'jump_url', '3': 4, '4': 1, '5': 9, '10': 'jumpUrl'},\n    {'1': 'type', '3': 5, '4': 1, '5': 9, '10': 'type'},\n    {'1': 'image_enhance', '3': 6, '4': 1, '5': 9, '10': 'imageEnhance'},\n    {\n      '1': 'image_enhance_frame',\n      '3': 7,\n      '4': 1,\n      '5': 9,\n      '10': 'imageEnhanceFrame'\n    },\n  ],\n};\n\n/// Descriptor for `UserPendant`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List userPendantDescriptor = $convert.base64Decode(\n    'CgtVc2VyUGVuZGFudBIOCgJpZBgBIAEoA1ICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIUCgVpbW'\n    'FnZRgDIAEoCVIFaW1hZ2USGQoIanVtcF91cmwYBCABKAlSB2p1bXBVcmwSEgoEdHlwZRgFIAEo'\n    'CVIEdHlwZRIjCg1pbWFnZV9lbmhhbmNlGAYgASgJUgxpbWFnZUVuaGFuY2USLgoTaW1hZ2VfZW'\n    '5oYW5jZV9mcmFtZRgHIAEoCVIRaW1hZ2VFbmhhbmNlRnJhbWU=');\n\n@$core.Deprecated('Use userSailingDescriptor instead')\nconst UserSailing$json = {\n  '1': 'UserSailing',\n  '2': [\n    {\n      '1': 'pendant',\n      '3': 1,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.vas.garb.model.UserPendant',\n      '10': 'pendant'\n    },\n    {\n      '1': 'card_bg',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.vas.garb.model.UserCardBG',\n      '10': 'cardBg'\n    },\n    {\n      '1': 'card_bg_with_focus',\n      '3': 3,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.vas.garb.model.UserCardBG',\n      '10': 'cardBgWithFocus'\n    },\n  ],\n};\n\n/// Descriptor for `UserSailing`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List userSailingDescriptor = $convert.base64Decode(\n    'CgtVc2VyU2FpbGluZxI+CgdwZW5kYW50GAEgASgLMiQuYmlsaWJpbGkudmFzLmdhcmIubW9kZW'\n    'wuVXNlclBlbmRhbnRSB3BlbmRhbnQSPAoHY2FyZF9iZxgCIAEoCzIjLmJpbGliaWxpLnZhcy5n'\n    'YXJiLm1vZGVsLlVzZXJDYXJkQkdSBmNhcmRCZxJQChJjYXJkX2JnX3dpdGhfZm9jdXMYAyABKA'\n    'syIy5iaWxpYmlsaS52YXMuZ2FyYi5tb2RlbC5Vc2VyQ2FyZEJHUg9jYXJkQmdXaXRoRm9jdXM=');\n"
  },
  {
    "path": "lib/grpc/bilibili/vas/garb/service.pb.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/vas/garb/service.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n\nimport 'dart:core' as $core;\n\nimport 'package:fixnum/fixnum.dart' as $fixnum;\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nimport '../../metadata/device.pb.dart' as $1;\nimport 'model.pb.dart' as $0;\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nclass SailingEquipMultiReply extends $pb.GeneratedMessage {\n  factory SailingEquipMultiReply({\n    $core.Iterable<$core.MapEntry<$fixnum.Int64, $0.UserSailing>>? data,\n  }) {\n    final result = create();\n    if (data != null) result.data.addEntries(data);\n    return result;\n  }\n\n  SailingEquipMultiReply._();\n\n  factory SailingEquipMultiReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SailingEquipMultiReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SailingEquipMultiReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.vas.garb.service'),\n      createEmptyInstance: create)\n    ..m<$fixnum.Int64, $0.UserSailing>(1, _omitFieldNames ? '' : 'data',\n        entryClassName: 'SailingEquipMultiReply.DataEntry',\n        keyFieldType: $pb.PbFieldType.O6,\n        valueFieldType: $pb.PbFieldType.OM,\n        valueCreator: $0.UserSailing.create,\n        valueDefaultOrMaker: $0.UserSailing.getDefault,\n        packageName: const $pb.PackageName('bilibili.vas.garb.service'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SailingEquipMultiReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SailingEquipMultiReply copyWith(\n          void Function(SailingEquipMultiReply) updates) =>\n      super.copyWith((message) => updates(message as SailingEquipMultiReply))\n          as SailingEquipMultiReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SailingEquipMultiReply create() => SailingEquipMultiReply._();\n  @$core.override\n  SailingEquipMultiReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SailingEquipMultiReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SailingEquipMultiReply>(create);\n  static SailingEquipMultiReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbMap<$fixnum.Int64, $0.UserSailing> get data => $_getMap(0);\n}\n\nclass SailingEquipMultiReq extends $pb.GeneratedMessage {\n  factory SailingEquipMultiReq({\n    $core.Iterable<$fixnum.Int64>? mids,\n    $fixnum.Int64? upMid,\n    $fixnum.Int64? otype,\n    $fixnum.Int64? oid,\n    $fixnum.Int64? mid,\n    $1.Device? device,\n  }) {\n    final result = create();\n    if (mids != null) result.mids.addAll(mids);\n    if (upMid != null) result.upMid = upMid;\n    if (otype != null) result.otype = otype;\n    if (oid != null) result.oid = oid;\n    if (mid != null) result.mid = mid;\n    if (device != null) result.device = device;\n    return result;\n  }\n\n  SailingEquipMultiReq._();\n\n  factory SailingEquipMultiReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory SailingEquipMultiReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'SailingEquipMultiReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.vas.garb.service'),\n      createEmptyInstance: create)\n    ..p<$fixnum.Int64>(1, _omitFieldNames ? '' : 'mids', $pb.PbFieldType.K6)\n    ..aInt64(2, _omitFieldNames ? '' : 'upMid')\n    ..aInt64(3, _omitFieldNames ? '' : 'otype')\n    ..aInt64(4, _omitFieldNames ? '' : 'oid')\n    ..aInt64(5, _omitFieldNames ? '' : 'mid')\n    ..aOM<$1.Device>(6, _omitFieldNames ? '' : 'device',\n        subBuilder: $1.Device.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SailingEquipMultiReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  SailingEquipMultiReq copyWith(void Function(SailingEquipMultiReq) updates) =>\n      super.copyWith((message) => updates(message as SailingEquipMultiReq))\n          as SailingEquipMultiReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static SailingEquipMultiReq create() => SailingEquipMultiReq._();\n  @$core.override\n  SailingEquipMultiReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static SailingEquipMultiReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<SailingEquipMultiReq>(create);\n  static SailingEquipMultiReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<$fixnum.Int64> get mids => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get upMid => $_getI64(1);\n  @$pb.TagNumber(2)\n  set upMid($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasUpMid() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearUpMid() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $fixnum.Int64 get otype => $_getI64(2);\n  @$pb.TagNumber(3)\n  set otype($fixnum.Int64 value) => $_setInt64(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasOtype() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearOtype() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $fixnum.Int64 get oid => $_getI64(3);\n  @$pb.TagNumber(4)\n  set oid($fixnum.Int64 value) => $_setInt64(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasOid() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearOid() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $fixnum.Int64 get mid => $_getI64(4);\n  @$pb.TagNumber(5)\n  set mid($fixnum.Int64 value) => $_setInt64(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasMid() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearMid() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $1.Device get device => $_getN(5);\n  @$pb.TagNumber(6)\n  set device($1.Device value) => $_setField(6, value);\n  @$pb.TagNumber(6)\n  $core.bool hasDevice() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearDevice() => $_clearField(6);\n  @$pb.TagNumber(6)\n  $1.Device ensureDevice() => $_ensure(5);\n}\n\nclass UserCard extends $pb.GeneratedMessage {\n  factory UserCard({\n    $fixnum.Int64? id,\n    $fixnum.Int64? itemId,\n    $core.String? name,\n    $core.String? cardUrl,\n    $core.String? bigCardUrl,\n    $fixnum.Int64? cardType,\n    $fixnum.Int64? expireTime,\n    $core.String? cardTypeName,\n    $core.String? jumpUrl,\n    $0.UserFanShow? fan,\n    $core.String? imageEnhance,\n    $0.ImageGroup? imageGroup,\n  }) {\n    final result = create();\n    if (id != null) result.id = id;\n    if (itemId != null) result.itemId = itemId;\n    if (name != null) result.name = name;\n    if (cardUrl != null) result.cardUrl = cardUrl;\n    if (bigCardUrl != null) result.bigCardUrl = bigCardUrl;\n    if (cardType != null) result.cardType = cardType;\n    if (expireTime != null) result.expireTime = expireTime;\n    if (cardTypeName != null) result.cardTypeName = cardTypeName;\n    if (jumpUrl != null) result.jumpUrl = jumpUrl;\n    if (fan != null) result.fan = fan;\n    if (imageEnhance != null) result.imageEnhance = imageEnhance;\n    if (imageGroup != null) result.imageGroup = imageGroup;\n    return result;\n  }\n\n  UserCard._();\n\n  factory UserCard.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UserCard.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UserCard',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.vas.garb.service'),\n      createEmptyInstance: create)\n    ..aInt64(1, _omitFieldNames ? '' : 'id')\n    ..aInt64(2, _omitFieldNames ? '' : 'itemId')\n    ..aOS(3, _omitFieldNames ? '' : 'name')\n    ..aOS(4, _omitFieldNames ? '' : 'cardUrl')\n    ..aOS(5, _omitFieldNames ? '' : 'bigCardUrl')\n    ..aInt64(6, _omitFieldNames ? '' : 'cardType')\n    ..aInt64(7, _omitFieldNames ? '' : 'expireTime')\n    ..aOS(8, _omitFieldNames ? '' : 'cardTypeName')\n    ..aOS(9, _omitFieldNames ? '' : 'jumpUrl')\n    ..aOM<$0.UserFanShow>(10, _omitFieldNames ? '' : 'fan',\n        subBuilder: $0.UserFanShow.create)\n    ..aOS(12, _omitFieldNames ? '' : 'imageEnhance')\n    ..aOM<$0.ImageGroup>(13, _omitFieldNames ? '' : 'imageGroup',\n        subBuilder: $0.ImageGroup.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserCard clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserCard copyWith(void Function(UserCard) updates) =>\n      super.copyWith((message) => updates(message as UserCard)) as UserCard;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UserCard create() => UserCard._();\n  @$core.override\n  UserCard createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UserCard getDefault() =>\n      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<UserCard>(create);\n  static UserCard? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $fixnum.Int64 get id => $_getI64(0);\n  @$pb.TagNumber(1)\n  set id($fixnum.Int64 value) => $_setInt64(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasId() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearId() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $fixnum.Int64 get itemId => $_getI64(1);\n  @$pb.TagNumber(2)\n  set itemId($fixnum.Int64 value) => $_setInt64(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasItemId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearItemId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get name => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set name($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasName() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearName() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $core.String get cardUrl => $_getSZ(3);\n  @$pb.TagNumber(4)\n  set cardUrl($core.String value) => $_setString(3, value);\n  @$pb.TagNumber(4)\n  $core.bool hasCardUrl() => $_has(3);\n  @$pb.TagNumber(4)\n  void clearCardUrl() => $_clearField(4);\n\n  @$pb.TagNumber(5)\n  $core.String get bigCardUrl => $_getSZ(4);\n  @$pb.TagNumber(5)\n  set bigCardUrl($core.String value) => $_setString(4, value);\n  @$pb.TagNumber(5)\n  $core.bool hasBigCardUrl() => $_has(4);\n  @$pb.TagNumber(5)\n  void clearBigCardUrl() => $_clearField(5);\n\n  @$pb.TagNumber(6)\n  $fixnum.Int64 get cardType => $_getI64(5);\n  @$pb.TagNumber(6)\n  set cardType($fixnum.Int64 value) => $_setInt64(5, value);\n  @$pb.TagNumber(6)\n  $core.bool hasCardType() => $_has(5);\n  @$pb.TagNumber(6)\n  void clearCardType() => $_clearField(6);\n\n  @$pb.TagNumber(7)\n  $fixnum.Int64 get expireTime => $_getI64(6);\n  @$pb.TagNumber(7)\n  set expireTime($fixnum.Int64 value) => $_setInt64(6, value);\n  @$pb.TagNumber(7)\n  $core.bool hasExpireTime() => $_has(6);\n  @$pb.TagNumber(7)\n  void clearExpireTime() => $_clearField(7);\n\n  @$pb.TagNumber(8)\n  $core.String get cardTypeName => $_getSZ(7);\n  @$pb.TagNumber(8)\n  set cardTypeName($core.String value) => $_setString(7, value);\n  @$pb.TagNumber(8)\n  $core.bool hasCardTypeName() => $_has(7);\n  @$pb.TagNumber(8)\n  void clearCardTypeName() => $_clearField(8);\n\n  @$pb.TagNumber(9)\n  $core.String get jumpUrl => $_getSZ(8);\n  @$pb.TagNumber(9)\n  set jumpUrl($core.String value) => $_setString(8, value);\n  @$pb.TagNumber(9)\n  $core.bool hasJumpUrl() => $_has(8);\n  @$pb.TagNumber(9)\n  void clearJumpUrl() => $_clearField(9);\n\n  @$pb.TagNumber(10)\n  $0.UserFanShow get fan => $_getN(9);\n  @$pb.TagNumber(10)\n  set fan($0.UserFanShow value) => $_setField(10, value);\n  @$pb.TagNumber(10)\n  $core.bool hasFan() => $_has(9);\n  @$pb.TagNumber(10)\n  void clearFan() => $_clearField(10);\n  @$pb.TagNumber(10)\n  $0.UserFanShow ensureFan() => $_ensure(9);\n\n  @$pb.TagNumber(12)\n  $core.String get imageEnhance => $_getSZ(10);\n  @$pb.TagNumber(12)\n  set imageEnhance($core.String value) => $_setString(10, value);\n  @$pb.TagNumber(12)\n  $core.bool hasImageEnhance() => $_has(10);\n  @$pb.TagNumber(12)\n  void clearImageEnhance() => $_clearField(12);\n\n  @$pb.TagNumber(13)\n  $0.ImageGroup get imageGroup => $_getN(11);\n  @$pb.TagNumber(13)\n  set imageGroup($0.ImageGroup value) => $_setField(13, value);\n  @$pb.TagNumber(13)\n  $core.bool hasImageGroup() => $_has(11);\n  @$pb.TagNumber(13)\n  void clearImageGroup() => $_clearField(13);\n  @$pb.TagNumber(13)\n  $0.ImageGroup ensureImageGroup() => $_ensure(11);\n}\n\nclass UserCardMultiReply extends $pb.GeneratedMessage {\n  factory UserCardMultiReply({\n    $core.Iterable<$core.MapEntry<$fixnum.Int64, UserCard>>? cards,\n  }) {\n    final result = create();\n    if (cards != null) result.cards.addEntries(cards);\n    return result;\n  }\n\n  UserCardMultiReply._();\n\n  factory UserCardMultiReply.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UserCardMultiReply.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UserCardMultiReply',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.vas.garb.service'),\n      createEmptyInstance: create)\n    ..m<$fixnum.Int64, UserCard>(1, _omitFieldNames ? '' : 'cards',\n        entryClassName: 'UserCardMultiReply.CardsEntry',\n        keyFieldType: $pb.PbFieldType.O6,\n        valueFieldType: $pb.PbFieldType.OM,\n        valueCreator: UserCard.create,\n        valueDefaultOrMaker: UserCard.getDefault,\n        packageName: const $pb.PackageName('bilibili.vas.garb.service'))\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserCardMultiReply clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserCardMultiReply copyWith(void Function(UserCardMultiReply) updates) =>\n      super.copyWith((message) => updates(message as UserCardMultiReply))\n          as UserCardMultiReply;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UserCardMultiReply create() => UserCardMultiReply._();\n  @$core.override\n  UserCardMultiReply createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UserCardMultiReply getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UserCardMultiReply>(create);\n  static UserCardMultiReply? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbMap<$fixnum.Int64, UserCard> get cards => $_getMap(0);\n}\n\nclass UserCardMultiReq extends $pb.GeneratedMessage {\n  factory UserCardMultiReq({\n    $core.Iterable<$fixnum.Int64>? mids,\n    $1.Device? device,\n  }) {\n    final result = create();\n    if (mids != null) result.mids.addAll(mids);\n    if (device != null) result.device = device;\n    return result;\n  }\n\n  UserCardMultiReq._();\n\n  factory UserCardMultiReq.fromBuffer($core.List<$core.int> data,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromBuffer(data, registry);\n  factory UserCardMultiReq.fromJson($core.String json,\n          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>\n      create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(\n      _omitMessageNames ? '' : 'UserCardMultiReq',\n      package: const $pb.PackageName(\n          _omitMessageNames ? '' : 'bilibili.vas.garb.service'),\n      createEmptyInstance: create)\n    ..p<$fixnum.Int64>(1, _omitFieldNames ? '' : 'mids', $pb.PbFieldType.K6)\n    ..aOM<$1.Device>(2, _omitFieldNames ? '' : 'device',\n        subBuilder: $1.Device.create)\n    ..hasRequiredFields = false;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserCardMultiReq clone() => deepCopy();\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  UserCardMultiReq copyWith(void Function(UserCardMultiReq) updates) =>\n      super.copyWith((message) => updates(message as UserCardMultiReq))\n          as UserCardMultiReq;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static UserCardMultiReq create() => UserCardMultiReq._();\n  @$core.override\n  UserCardMultiReq createEmptyInstance() => create();\n  @$core.pragma('dart2js:noInline')\n  static UserCardMultiReq getDefault() => _defaultInstance ??=\n      $pb.GeneratedMessage.$_defaultFor<UserCardMultiReq>(create);\n  static UserCardMultiReq? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<$fixnum.Int64> get mids => $_getList(0);\n\n  @$pb.TagNumber(2)\n  $1.Device get device => $_getN(1);\n  @$pb.TagNumber(2)\n  set device($1.Device value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasDevice() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearDevice() => $_clearField(2);\n  @$pb.TagNumber(2)\n  $1.Device ensureDevice() => $_ensure(1);\n}\n\nconst $core.bool _omitFieldNames =\n    $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames =\n    $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "lib/grpc/bilibili/vas/garb/service.pbenum.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/vas/garb/service.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n"
  },
  {
    "path": "lib/grpc/bilibili/vas/garb/service.pbjson.dart",
    "content": "// This is a generated file - do not edit.\n//\n// Generated from bilibili/vas/garb/service.proto.\n\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names, prefer_relative_imports\n// ignore_for_file: unused_import\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use sailingEquipMultiReplyDescriptor instead')\nconst SailingEquipMultiReply$json = {\n  '1': 'SailingEquipMultiReply',\n  '2': [\n    {\n      '1': 'data',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.vas.garb.service.SailingEquipMultiReply.DataEntry',\n      '10': 'data'\n    },\n  ],\n  '3': [SailingEquipMultiReply_DataEntry$json],\n};\n\n@$core.Deprecated('Use sailingEquipMultiReplyDescriptor instead')\nconst SailingEquipMultiReply_DataEntry$json = {\n  '1': 'DataEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 3, '10': 'key'},\n    {\n      '1': 'value',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.vas.garb.model.UserSailing',\n      '10': 'value'\n    },\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `SailingEquipMultiReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sailingEquipMultiReplyDescriptor = $convert.base64Decode(\n    'ChZTYWlsaW5nRXF1aXBNdWx0aVJlcGx5Ek8KBGRhdGEYASADKAsyOy5iaWxpYmlsaS52YXMuZ2'\n    'FyYi5zZXJ2aWNlLlNhaWxpbmdFcXVpcE11bHRpUmVwbHkuRGF0YUVudHJ5UgRkYXRhGl0KCURh'\n    'dGFFbnRyeRIQCgNrZXkYASABKANSA2tleRI6CgV2YWx1ZRgCIAEoCzIkLmJpbGliaWxpLnZhcy'\n    '5nYXJiLm1vZGVsLlVzZXJTYWlsaW5nUgV2YWx1ZToCOAE=');\n\n@$core.Deprecated('Use sailingEquipMultiReqDescriptor instead')\nconst SailingEquipMultiReq$json = {\n  '1': 'SailingEquipMultiReq',\n  '2': [\n    {'1': 'mids', '3': 1, '4': 3, '5': 3, '10': 'mids'},\n    {'1': 'up_mid', '3': 2, '4': 1, '5': 3, '10': 'upMid'},\n    {'1': 'otype', '3': 3, '4': 1, '5': 3, '10': 'otype'},\n    {'1': 'oid', '3': 4, '4': 1, '5': 3, '10': 'oid'},\n    {'1': 'mid', '3': 5, '4': 1, '5': 3, '10': 'mid'},\n    {\n      '1': 'device',\n      '3': 6,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.metadata.device.Device',\n      '10': 'device'\n    },\n  ],\n};\n\n/// Descriptor for `SailingEquipMultiReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List sailingEquipMultiReqDescriptor = $convert.base64Decode(\n    'ChRTYWlsaW5nRXF1aXBNdWx0aVJlcRISCgRtaWRzGAEgAygDUgRtaWRzEhUKBnVwX21pZBgCIA'\n    'EoA1IFdXBNaWQSFAoFb3R5cGUYAyABKANSBW90eXBlEhAKA29pZBgEIAEoA1IDb2lkEhAKA21p'\n    'ZBgFIAEoA1IDbWlkEjgKBmRldmljZRgGIAEoCzIgLmJpbGliaWxpLm1ldGFkYXRhLmRldmljZS'\n    '5EZXZpY2VSBmRldmljZQ==');\n\n@$core.Deprecated('Use userCardDescriptor instead')\nconst UserCard$json = {\n  '1': 'UserCard',\n  '2': [\n    {'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},\n    {'1': 'item_id', '3': 2, '4': 1, '5': 3, '10': 'itemId'},\n    {'1': 'name', '3': 3, '4': 1, '5': 9, '10': 'name'},\n    {'1': 'card_url', '3': 4, '4': 1, '5': 9, '10': 'cardUrl'},\n    {'1': 'big_card_url', '3': 5, '4': 1, '5': 9, '10': 'bigCardUrl'},\n    {'1': 'card_type', '3': 6, '4': 1, '5': 3, '10': 'cardType'},\n    {'1': 'expire_time', '3': 7, '4': 1, '5': 3, '10': 'expireTime'},\n    {'1': 'card_type_name', '3': 8, '4': 1, '5': 9, '10': 'cardTypeName'},\n    {'1': 'jump_url', '3': 9, '4': 1, '5': 9, '10': 'jumpUrl'},\n    {\n      '1': 'fan',\n      '3': 10,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.vas.garb.model.UserFanShow',\n      '10': 'fan'\n    },\n    {'1': 'image_enhance', '3': 12, '4': 1, '5': 9, '10': 'imageEnhance'},\n    {\n      '1': 'image_group',\n      '3': 13,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.vas.garb.model.ImageGroup',\n      '10': 'imageGroup'\n    },\n  ],\n};\n\n/// Descriptor for `UserCard`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List userCardDescriptor = $convert.base64Decode(\n    'CghVc2VyQ2FyZBIOCgJpZBgBIAEoA1ICaWQSFwoHaXRlbV9pZBgCIAEoA1IGaXRlbUlkEhIKBG'\n    '5hbWUYAyABKAlSBG5hbWUSGQoIY2FyZF91cmwYBCABKAlSB2NhcmRVcmwSIAoMYmlnX2NhcmRf'\n    'dXJsGAUgASgJUgpiaWdDYXJkVXJsEhsKCWNhcmRfdHlwZRgGIAEoA1IIY2FyZFR5cGUSHwoLZX'\n    'hwaXJlX3RpbWUYByABKANSCmV4cGlyZVRpbWUSJAoOY2FyZF90eXBlX25hbWUYCCABKAlSDGNh'\n    'cmRUeXBlTmFtZRIZCghqdW1wX3VybBgJIAEoCVIHanVtcFVybBI2CgNmYW4YCiABKAsyJC5iaW'\n    'xpYmlsaS52YXMuZ2FyYi5tb2RlbC5Vc2VyRmFuU2hvd1IDZmFuEiMKDWltYWdlX2VuaGFuY2UY'\n    'DCABKAlSDGltYWdlRW5oYW5jZRJECgtpbWFnZV9ncm91cBgNIAEoCzIjLmJpbGliaWxpLnZhcy'\n    '5nYXJiLm1vZGVsLkltYWdlR3JvdXBSCmltYWdlR3JvdXA=');\n\n@$core.Deprecated('Use userCardMultiReplyDescriptor instead')\nconst UserCardMultiReply$json = {\n  '1': 'UserCardMultiReply',\n  '2': [\n    {\n      '1': 'cards',\n      '3': 1,\n      '4': 3,\n      '5': 11,\n      '6': '.bilibili.vas.garb.service.UserCardMultiReply.CardsEntry',\n      '10': 'cards'\n    },\n  ],\n  '3': [UserCardMultiReply_CardsEntry$json],\n};\n\n@$core.Deprecated('Use userCardMultiReplyDescriptor instead')\nconst UserCardMultiReply_CardsEntry$json = {\n  '1': 'CardsEntry',\n  '2': [\n    {'1': 'key', '3': 1, '4': 1, '5': 3, '10': 'key'},\n    {\n      '1': 'value',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.vas.garb.service.UserCard',\n      '10': 'value'\n    },\n  ],\n  '7': {'7': true},\n};\n\n/// Descriptor for `UserCardMultiReply`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List userCardMultiReplyDescriptor = $convert.base64Decode(\n    'ChJVc2VyQ2FyZE11bHRpUmVwbHkSTgoFY2FyZHMYASADKAsyOC5iaWxpYmlsaS52YXMuZ2FyYi'\n    '5zZXJ2aWNlLlVzZXJDYXJkTXVsdGlSZXBseS5DYXJkc0VudHJ5UgVjYXJkcxpdCgpDYXJkc0Vu'\n    'dHJ5EhAKA2tleRgBIAEoA1IDa2V5EjkKBXZhbHVlGAIgASgLMiMuYmlsaWJpbGkudmFzLmdhcm'\n    'Iuc2VydmljZS5Vc2VyQ2FyZFIFdmFsdWU6AjgB');\n\n@$core.Deprecated('Use userCardMultiReqDescriptor instead')\nconst UserCardMultiReq$json = {\n  '1': 'UserCardMultiReq',\n  '2': [\n    {'1': 'mids', '3': 1, '4': 3, '5': 3, '10': 'mids'},\n    {\n      '1': 'device',\n      '3': 2,\n      '4': 1,\n      '5': 11,\n      '6': '.bilibili.metadata.device.Device',\n      '10': 'device'\n    },\n  ],\n};\n\n/// Descriptor for `UserCardMultiReq`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List userCardMultiReqDescriptor = $convert.base64Decode(\n    'ChBVc2VyQ2FyZE11bHRpUmVxEhIKBG1pZHMYASADKANSBG1pZHMSOAoGZGV2aWNlGAIgASgLMi'\n    'AuYmlsaWJpbGkubWV0YWRhdGEuZGV2aWNlLkRldmljZVIGZGV2aWNl');\n"
  },
  {
    "path": "lib/grpc/dm.dart",
    "content": "import 'package:PiliPlus/grpc/bilibili/community/service/dm/v1.pb.dart';\nimport 'package:PiliPlus/grpc/grpc_req.dart';\nimport 'package:PiliPlus/grpc/url.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:fixnum/fixnum.dart';\n\nabstract final class DmGrpc {\n  static Future<LoadingState<DmSegMobileReply>> dmSegMobile({\n    required int cid,\n    required int segmentIndex,\n    int type = 1,\n  }) {\n    return GrpcReq.request(\n      GrpcUrl.dmSegMobile,\n      DmSegMobileReq(\n        oid: Int64(cid),\n        segmentIndex: Int64(segmentIndex),\n        type: type,\n      ),\n      DmSegMobileReply.fromBuffer,\n      isolate: true,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/grpc/dyn.dart",
    "content": "import 'package:PiliPlus/grpc/bilibili/app/dynamic/v1.pb.dart'\n    show DynRedReq, TabOffset, DynRedReply;\nimport 'package:PiliPlus/grpc/bilibili/app/dynamic/v2.pb.dart'\n    show OpusType, OpusDetailReq, OpusDetailResp;\nimport 'package:PiliPlus/grpc/grpc_req.dart';\nimport 'package:PiliPlus/grpc/url.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:fixnum/fixnum.dart';\n\nabstract final class DynGrpc {\n  // static Future dynSpace({\n  //   required int uid,\n  //   required int page,\n  // }) {\n  //   return _request(\n  //     GrpcUrl.dynSpace,\n  //     DynSpaceReq(\n  //       hostUid: Int64(uid),\n  //       localTime: 8,\n  //       page: Int64(page),\n  //       from: 'space',\n  //     ),\n  //     DynSpaceRsp.fromBuffer,\n  //   );\n  // }\n\n  static Future<int?> dynRed() async {\n    final res = await GrpcReq.request(\n      GrpcUrl.dynRed,\n      DynRedReq(tabOffset: [TabOffset(tab: 1)]),\n      DynRedReply.fromBuffer,\n    );\n    return res.dataOrNull?.dynRedItem.count.toInt();\n  }\n\n  static Future<LoadingState<OpusDetailResp>> opusDetail({\n    OpusType? opusType,\n    required int oid,\n  }) {\n    return GrpcReq.request(\n      GrpcUrl.opusDetail,\n      OpusDetailReq(\n        opusType: opusType,\n        oid: Int64(oid),\n      ),\n      OpusDetailResp.fromBuffer,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/grpc/grpc_req.dart",
    "content": "import 'dart:convert';\nimport 'dart:typed_data';\n\nimport 'package:PiliPlus/grpc/bilibili/rpc.pb.dart';\nimport 'package:PiliPlus/http/constants.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:archive/archive.dart';\nimport 'package:dio/dio.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode, compute;\nimport 'package:protobuf/protobuf.dart' show GeneratedMessage;\n\nabstract final class GrpcReq {\n  static const _isolateSize = 256 * 1024;\n  static const _gzipMinLength = 64;\n\n  static final options = Options(\n    contentType: 'application/grpc',\n    responseType: ResponseType.bytes,\n  );\n\n  static Uint8List compressProtobuf(Uint8List proto) {\n    final compress = proto.length > _gzipMinLength;\n    if (compress) {\n      proto = const GZipEncoder().encodeBytes(proto);\n    }\n    return Uint8List(5 + proto.length)\n      ..[0] = compress ? 1 : 0\n      ..buffer.asByteData(1, 4).setInt32(0, proto.length, Endian.big)\n      ..setAll(5, proto);\n  }\n\n  static Uint8List decompressProtobuf(Uint8List data) {\n    final length = ByteData.sublistView(data, 1, 5).getInt32(0, Endian.big);\n\n    if (data[0] == 1) {\n      return const GZipDecoder().decodeBytes(\n        Uint8List.sublistView(data, 5, length + 5),\n      );\n    } else {\n      return Uint8List.sublistView(data, 5, length + 5);\n    }\n  }\n\n  static LoadingState<T> _parse<T>((Uint8List, T Function(Uint8List)) args) {\n    try {\n      final data = decompressProtobuf(args.$1);\n      final grpcResponse = args.$2(data);\n      return Success(grpcResponse);\n    } catch (e) {\n      return Error(e.toString());\n    }\n  }\n\n  static Future<LoadingState<T>> request<T extends GeneratedMessage>(\n    String url,\n    GeneratedMessage request,\n    T Function(Uint8List) grpcParser, {\n    bool isolate = false,\n  }) async {\n    final response = await Request().post<Uint8List>(\n      HttpString.appBaseUrl + url,\n      data: compressProtobuf(request.writeToBuffer()),\n      options: options,\n    );\n\n    if (response.data case final Map map) {\n      return Error(map['message']);\n    }\n\n    if (response.headers.value('Grpc-Status') == '0') {\n      final data = response.data;\n      if (data is Uint8List) {\n        return isolate && data.length > _isolateSize\n            ? compute(_parse, (data, grpcParser))\n            : _parse((data, grpcParser));\n      } else {\n        return Error('grpc: ${data.runtimeType} is not Uint8List');\n      }\n    } else {\n      try {\n        int? code;\n        String msg = response.headers.value('Grpc-Status-Details-Bin') ?? '';\n        if (msg.isNotEmpty) {\n          final padding = -msg.length & 3;\n          if (padding != 0) {\n            msg += '=' * padding;\n          }\n          final msgBytes = base64Decode(msg);\n          try {\n            final grpcMsg = Status.fromBuffer(msgBytes);\n            final details = grpcMsg.details\n                .map((e) => Status.fromBuffer(e.value))\n                .toList();\n            code = details.firstOrNull?.code;\n            // UNKNOWN : -400 : msg\n            final errMsg = details.map((e) => e.message).join('\\n');\n            msg = kDebugMode\n                ? 'CODE: ${grpcMsg.code}(${grpcMsg.message})\\n'\n                      'MSG: $errMsg'\n                : errMsg;\n          } catch (e) {\n            msg = utf8.decode(msgBytes, allowMalformed: true);\n          }\n        }\n        return Error(msg, code: code);\n      } catch (e) {\n        return Error(e.toString());\n      }\n    }\n  }\n\n  // static Future playerOnline({\n  //   int aid = 0,\n  //   int cid = 0,\n  // }) {\n  //   return _request(\n  //       GrpcUrl.playerOnline,\n  //       PlayerOnlineReq(aid: Int64(aid), cid: Int64(cid), playOpen: true),\n  //       PlayerOnlineReply.fromBuffer,\n  //       onSuccess: (response) => response.totalNumberText);\n  // }\n\n  // static Future popular(int idx) {\n  //   return _request(GrpcUrl.popular, PopularResultReq(idx: Int64(idx)),\n  //       PopularReply.fromBuffer, onSuccess: (response) {\n  //     response.items.retainWhere((item) => item.smallCoverV5.base.goto == 'av');\n  //     return {'status': true, 'data': response.items};\n  //   });\n  // }\n}\n"
  },
  {
    "path": "lib/grpc/im.dart",
    "content": "import 'package:PiliPlus/grpc/bilibili/app/im/v1.pb.dart';\nimport 'package:PiliPlus/grpc/bilibili/im/interfaces/v1.pb.dart';\nimport 'package:PiliPlus/grpc/bilibili/im/type.pb.dart';\nimport 'package:PiliPlus/grpc/grpc_req.dart';\nimport 'package:PiliPlus/grpc/url.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:fixnum/fixnum.dart';\nimport 'package:protobuf/protobuf.dart' show PbMap;\nimport 'package:uuid/v4.dart';\n\nabstract final class ImGrpc {\n  static Future<LoadingState<RspSendMsg>> sendMsg({\n    required int senderUid,\n    required int receiverId,\n    required String content,\n    MsgType msgType = MsgType.EN_MSG_TYPE_TEXT,\n  }) {\n    return GrpcReq.request(\n      GrpcUrl.sendMsg,\n      ReqSendMsg(\n        msg: Msg(\n          senderUid: Int64(senderUid),\n          receiverType: 1,\n          receiverId: Int64(receiverId),\n          msgType: msgType.value,\n          content: content,\n          timestamp: Int64(DateTime.now().millisecondsSinceEpoch ~/ 1000),\n          msgStatus: 0,\n          newFaceVersion: 1,\n        ),\n        devId: const UuidV4().generate(),\n      ),\n      RspSendMsg.fromBuffer,\n    );\n  }\n\n  static Future<LoadingState<RspShareList>> shareList({int size = 10}) {\n    return GrpcReq.request(\n      GrpcUrl.shareList,\n      ReqShareList(size: size),\n      RspShareList.fromBuffer,\n    );\n  }\n\n  static Future<LoadingState<RspSessionMsg>> syncFetchSessionMsgs({\n    required int talkerId,\n    Int64? endSeqno,\n    Int64? beginSeqno,\n  }) {\n    return GrpcReq.request(\n      GrpcUrl.syncFetchSessionMsgs,\n      ReqSessionMsg(\n        talkerId: Int64(talkerId),\n        sessionType: 1,\n        endSeqno: endSeqno,\n        beginSeqno: beginSeqno,\n        size: 20,\n        devId: '1',\n      ),\n      RspSessionMsg.fromBuffer,\n    );\n  }\n\n  static Future<LoadingState<SessionMainReply>> sessionMain({\n    PbMap<int, Offset>? offset,\n  }) {\n    return GrpcReq.request(\n      GrpcUrl.sessionMain,\n      SessionMainReq(\n        paginationParams: PaginationParams(offsets: offset?.entries),\n      ),\n      SessionMainReply.fromBuffer,\n    );\n  }\n\n  static Future<LoadingState<SessionSecondaryReply>> sessionSecondary({\n    PbMap<int, Offset>? offset,\n    SessionPageType? pageType,\n  }) {\n    return GrpcReq.request(\n      GrpcUrl.sessionSecondary,\n      SessionSecondaryReq(\n        paginationParams: PaginationParams(offsets: offset?.entries),\n        pageType: pageType,\n      ),\n      SessionSecondaryReply.fromBuffer,\n    );\n  }\n\n  static Future<LoadingState<ClearUnreadReply>> clearUnread({\n    SessionPageType? pageType,\n    SessionId? sessionId,\n  }) {\n    return GrpcReq.request(\n      GrpcUrl.clearUnread,\n      ClearUnreadReq(\n        pageType: pageType,\n        sessionId: sessionId,\n      ),\n      ClearUnreadReply.fromBuffer,\n    );\n  }\n\n  static Future<LoadingState<SessionUpdateReply>> sessionUpdate({\n    SessionPageType? pageType,\n    SessionId? sessionId,\n  }) {\n    return GrpcReq.request(\n      GrpcUrl.sessionUpdate,\n      SessionUpdateReq(\n        pageType: pageType,\n        sessionId: sessionId,\n      ),\n      SessionUpdateReply.fromBuffer,\n    );\n  }\n\n  static Future<LoadingState<PinSessionReply>> pinSession({\n    SessionId? sessionId,\n    Int64? topTimeMicros,\n  }) {\n    return GrpcReq.request(\n      GrpcUrl.pinSession,\n      PinSessionReq(\n        sessionId: sessionId,\n        topTimeMicros: topTimeMicros,\n      ),\n      PinSessionReply.fromBuffer,\n    );\n  }\n\n  static Future<LoadingState<UnPinSessionReply>> unpinSession({\n    SessionId? sessionId,\n  }) {\n    return GrpcReq.request(\n      GrpcUrl.unpinSession,\n      UnPinSessionReq(\n        sessionId: sessionId,\n      ),\n      UnPinSessionReply.fromBuffer,\n    );\n  }\n\n  static Future<LoadingState<DeleteSessionListReply>> deleteSessionList({\n    SessionPageType? pageType,\n  }) {\n    return GrpcReq.request(\n      GrpcUrl.deleteSessionList,\n      DeleteSessionListReq(\n        pageType: pageType,\n      ),\n      DeleteSessionListReply.fromBuffer,\n    );\n  }\n\n  static Future<LoadingState<GetImSettingsReply>> getImSettings({\n    IMSettingType? type,\n  }) {\n    return GrpcReq.request(\n      GrpcUrl.getImSettings,\n      GetImSettingsReq(\n        type: type,\n      ),\n      GetImSettingsReply.fromBuffer,\n    );\n  }\n\n  static Future<LoadingState<SetImSettingsReply>> setImSettings({\n    Map<int, Setting>? settings,\n  }) {\n    return GrpcReq.request(\n      GrpcUrl.setImSettings,\n      SetImSettingsReq(settings: settings?.entries),\n      SetImSettingsReply.fromBuffer,\n    );\n  }\n\n  static Future<LoadingState<KeywordBlockingListReply>> keywordBlockingList() {\n    return GrpcReq.request(\n      GrpcUrl.keywordBlockingList,\n      KeywordBlockingListReq(),\n      KeywordBlockingListReply.fromBuffer,\n    );\n  }\n\n  static Future<LoadingState<KeywordBlockingAddReply>> keywordBlockingAdd(\n    String keyword,\n  ) {\n    return GrpcReq.request(\n      GrpcUrl.keywordBlockingAdd,\n      KeywordBlockingAddReq(keyword: keyword),\n      KeywordBlockingAddReply.fromBuffer,\n    );\n  }\n\n  static Future<LoadingState<KeywordBlockingDeleteReply>> keywordBlockingDelete(\n    String keyword,\n  ) {\n    return GrpcReq.request(\n      GrpcUrl.keywordBlockingDelete,\n      KeywordBlockingDeleteReq(keyword: keyword),\n      KeywordBlockingDeleteReply.fromBuffer,\n    );\n  }\n\n  static Future<LoadingState<RspTotalUnread>> getTotalUnread({\n    int? unreadType,\n  }) {\n    return GrpcReq.request(\n      GrpcUrl.getTotalUnread,\n      ReqTotalUnread(unreadType: unreadType, showUnfollowList: 1),\n      RspTotalUnread.fromBuffer,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/grpc/reply.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart';\nimport 'package:PiliPlus/grpc/bilibili/pagination.pb.dart';\nimport 'package:PiliPlus/grpc/grpc_req.dart';\nimport 'package:PiliPlus/grpc/url.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:fixnum/fixnum.dart';\n\nabstract final class ReplyGrpc {\n  static bool antiGoodsReply = Pref.antiGoodsReply;\n  static RegExp replyRegExp = RegExp(\n    Pref.banWordForReply,\n    caseSensitive: false,\n  );\n  static bool enableFilter = replyRegExp.pattern.isNotEmpty;\n\n  // static Future replyInfo({required int rpid}) {\n  //   return _request(\n  //     GrpcUrl.replyInfo,\n  //     ReplyInfoReq(rpid: Int64(rpid)),\n  //     ReplyInfoReply.fromBuffer,\n  //     onSuccess: (response) => response.reply,\n  //   );\n  // }\n\n  // ref BiliRoamingX\n  static bool needRemoveGoodGrpc(ReplyInfo reply) {\n    return (reply.content.urls.isNotEmpty &&\n            reply.content.urls.values.any((url) {\n              return url.hasExtra() &&\n                  (url.extra.goodsCmControl == Int64.ONE ||\n                      url.extra.hasGoodsItemId() ||\n                      url.extra.hasGoodsPrefetchedCache());\n            })) ||\n        reply.content.message.contains(Constants.goodsUrlPrefix);\n  }\n\n  static bool needRemoveGrpc(ReplyInfo reply) {\n    return (enableFilter && replyRegExp.hasMatch(reply.content.message)) ||\n        (antiGoodsReply && needRemoveGoodGrpc(reply));\n  }\n\n  static Future<LoadingState<MainListReply>> mainList({\n    int type = 1,\n    required int oid,\n    required Mode mode,\n    required String? offset,\n    required Int64? cursorNext,\n  }) async {\n    final res = await GrpcReq.request(\n      GrpcUrl.mainList,\n      MainListReq(\n        oid: Int64(oid),\n        type: Int64(type),\n        rpid: Int64.ZERO,\n        // cursor: CursorReq(\n        //   mode: mode,\n        //   next: cursorNext,\n        // ),\n        mode: mode,\n        pagination: offset == null ? null : FeedPagination(offset: offset),\n      ),\n      MainListReply.fromBuffer,\n    );\n    if (res case Success(:final response)) {\n      // keyword filter\n      if (response.hasUpTop() && needRemoveGrpc(response.upTop)) {\n        response.clearUpTop();\n      }\n\n      if (response.replies.isNotEmpty) {\n        response.replies.removeWhere((item) {\n          final hasMatch = needRemoveGrpc(item);\n          if (!hasMatch && item.replies.isNotEmpty) {\n            item.replies.removeWhere(needRemoveGrpc);\n          }\n          return hasMatch;\n        });\n      }\n    }\n    return res;\n  }\n\n  static Future<LoadingState<DetailListReply>> detailList({\n    int type = 1,\n    required int oid,\n    required int root,\n    required int rpid,\n    required Mode mode,\n    required String? offset,\n  }) async {\n    final res = await GrpcReq.request(\n      GrpcUrl.detailList,\n      DetailListReq(\n        oid: Int64(oid),\n        type: Int64(type),\n        root: Int64(root),\n        rpid: Int64(rpid),\n        scene: DetailListScene.REPLY,\n        mode: mode,\n        pagination: offset == null ? null : FeedPagination(offset: offset),\n      ),\n      DetailListReply.fromBuffer,\n    );\n    return res..dataOrNull?.root.replies.removeWhere(needRemoveGrpc);\n  }\n\n  static Future<LoadingState<DialogListReply>> dialogList({\n    int type = 1,\n    required int oid,\n    required int root,\n    required int dialog,\n    required String? offset,\n  }) async {\n    final res = await GrpcReq.request(\n      GrpcUrl.dialogList,\n      DialogListReq(\n        oid: Int64(oid),\n        type: Int64(type),\n        root: Int64(root),\n        dialog: Int64(dialog),\n        pagination: offset == null ? null : FeedPagination(offset: offset),\n      ),\n      DialogListReply.fromBuffer,\n    );\n    return res..dataOrNull?.replies.removeWhere(needRemoveGrpc);\n  }\n\n  static Future<LoadingState<SearchItemReply>> searchItem({\n    required int page,\n    required SearchItemType itemType,\n    required int oid,\n    int type = 1,\n    String? keyword,\n  }) {\n    return GrpcReq.request(\n      GrpcUrl.searchItem,\n      SearchItemReq(\n        cursor: SearchItemCursorReq(\n          next: Int64(page),\n          itemType: itemType,\n        ),\n        oid: Int64(oid),\n        type: Int64(type),\n        keyword: keyword,\n      ),\n      SearchItemReply.fromBuffer,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/grpc/space.dart",
    "content": "import 'package:PiliPlus/grpc/bilibili/app/dynamic/v2.pb.dart';\nimport 'package:PiliPlus/grpc/bilibili/pagination.pb.dart';\nimport 'package:PiliPlus/grpc/grpc_req.dart';\nimport 'package:PiliPlus/grpc/url.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:fixnum/fixnum.dart';\n\nabstract final class SpaceGrpc {\n  static Future<LoadingState<OpusSpaceFlowResp>> opusSpaceFlow({\n    required int hostMid,\n    String? next,\n    required String filterType,\n  }) {\n    return GrpcReq.request(\n      GrpcUrl.opusSpaceFlow,\n      OpusSpaceFlowReq(\n        hostMid: Int64(hostMid),\n        pagination: Pagination(\n          pageSize: 20,\n          next: next,\n        ),\n        filterType: filterType,\n      ),\n      OpusSpaceFlowResp.fromBuffer,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/grpc/url.dart",
    "content": "abstract final class GrpcUrl {\n  // static const playerOnline =\n  //     '/bilibili.app.playeronline.v1.PlayerOnline/PlayerOnline';\n  // static const popular = '/bilibili.app.show.v1.Popular/Index';\n\n  // dynamic\n  static const dynV1 = '/bilibili.app.dynamic.v1.Dynamic';\n  // static const dynV2 = '/bilibili.app.dynamic.v2.Dynamic';\n  static const opusV2 = '/bilibili.app.dynamic.v2.Opus';\n  static const dynRed = '$dynV1/DynRed';\n  static const opusSpaceFlow = '$opusV2/OpusSpaceFlow';\n  static const opusDetail = '$opusV2/OpusDetail';\n  // static const dynSpace = '$dynV2/DynSpace';\n\n  // danmaku\n  static const dmSegMobile = '/bilibili.community.service.dm.v1.DM/DmSegMobile';\n\n  // reply\n  static const reply = '/bilibili.main.community.reply.v1.Reply';\n  static const mainList = '$reply/MainList';\n  static const detailList = '$reply/DetailList';\n  static const dialogList = '$reply/DialogList';\n  // static const replyInfo = '$reply/ReplyInfo';\n  static const searchItem = '$reply/SearchItem';\n\n  // im\n  static const im = '/bilibili.im.interface.v1.ImInterface';\n  static const im2 = '/bilibili.app.im.v1.im';\n  static const sendMsg = '$im/SendMsg';\n  static const shareList = '$im/ShareList';\n  static const sessionMain = '$im2/SessionMain';\n  static const sessionSecondary = '$im2/SessionSecondary';\n  static const clearUnread = '$im2/ClearUnread';\n  static const sessionUpdate = '$im2/SessionUpdate';\n  static const pinSession = '$im2/PinSession';\n  static const unpinSession = '$im2/UnpinSession';\n  static const deleteSessionList = '$im2/DeleteSessionList';\n  static const getImSettings = '$im2/GetImSettings';\n  static const setImSettings = '$im2/SetImSettings';\n  static const keywordBlockingList = '$im2/KeywordBlockingList';\n  static const keywordBlockingAdd = '$im2/KeywordBlockingAdd';\n  static const keywordBlockingDelete = '$im2/KeywordBlockingDelete';\n  static const syncFetchSessionMsgs = '$im/SyncFetchSessionMsgs';\n  static const getTotalUnread = '$im/GetTotalUnread';\n\n  // view\n  static const viewunite = '/bilibili.app.viewunite.v1.View';\n  static const view = '$viewunite/View';\n\n  // audio\n  static const audio = '/bilibili.app.listener.v1.Listener';\n  static const audioPlayUrl = '$audio/PlayURL';\n  static const audioPlayList = '$audio/Playlist';\n  static const audioThumbUp = '$audio/ThumbUp';\n  static const audioTripleLike = '$audio/TripleLike';\n  static const audioCoinAdd = '$audio/CoinAdd';\n}\n"
  },
  {
    "path": "lib/grpc/view.dart",
    "content": "import 'package:PiliPlus/grpc/bilibili/app/viewunite/v1.pb.dart'\n    show ViewReq, ViewReply;\nimport 'package:PiliPlus/grpc/grpc_req.dart';\nimport 'package:PiliPlus/grpc/url.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\n\nabstract final class ViewGrpc {\n  static Future<LoadingState<ViewReply>> view({\n    required String bvid,\n  }) {\n    return GrpcReq.request(\n      GrpcUrl.view,\n      ViewReq(\n        bvid: bvid,\n      ),\n      ViewReply.fromBuffer,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/http/api.dart",
    "content": "import 'package:PiliPlus/http/constants.dart';\n\nabstract final class Api {\n  // 推荐视频\n  static const String recommendListApp =\n      '${HttpString.appBaseUrl}/x/v2/feed/index';\n  static const String recommendListWeb =\n      '/x/web-interface/wbi/index/top/feed/rcmd';\n\n  // APP端不感兴趣、取消不感兴趣\n  static const String feedDislike = '${HttpString.appBaseUrl}/x/feed/dislike';\n  static const String feedDislikeCancel =\n      '${HttpString.appBaseUrl}/x/feed/dislike/cancel';\n\n  // 热门视频\n  static const String hotList = '/x/web-interface/popular';\n\n  // 视频流\n  // https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/video/videostream_url.md\n  static const String ugcUrl = '/x/player/wbi/playurl';\n\n  // 番剧视频流\n  // https://api.bilibili.com/pgc/player/web/v2/playurl?cid=104236640&bvid=BV13t411n7ex\n  static const String pgcUrl = '/pgc/player/web/v2/playurl';\n\n  static const String pugvUrl = '/pugv/player/web/playurl';\n\n  static const String tvPlayUrl = '/x/tv/playurl';\n\n  // 字幕\n  // aid, cid\n  static const String playInfo = '/x/player/wbi/v2';\n\n  // 视频详情\n  // 竖屏 https://api.bilibili.com/x/web-interface/view?aid=527403921\n  // https://api.bilibili.com/x/web-interface/view/detail  获取视频超详细信息(web端)\n  static const String videoIntro = '/x/web-interface/view';\n  // 视频详情 超详细\n  // https://api.bilibili.com/x/web-interface/view/detail?aid=527403921\n\n  /// https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/video/action.md\n  // 点赞 Post\n  /// aid\tnum\t稿件avid\t必要（可选）\tavid与bvid任选一个\n  /// bvid\tstr\t稿件bvid\t必要（可选）\tavid与bvid任选一个\n  /// like\tnum\t操作方式\t必要\t1：点赞 2：取消赞\n  // csrf\tstr\tCSRF Token（位于cookie）\t必要\n  // https://api.bilibili.com/x/web-interface/archive/like\n  // static const String likeVideo = '/x/web-interface/archive/like';\n\n  // 改用app端点赞接口\n  static const String likeVideo = '${HttpString.appBaseUrl}/x/v2/view/like';\n  //判断视频是否被点赞（双端）Get\n  // access_key\tstr\tAPP登录Token\tAPP方式必要\n  /// aid\tnum\t稿件avid\t必要（可选）\tavid与bvid任选一个\n  /// bvid\tstr\t稿件bvid\t必要（可选）\tavid与bvid任选一个\n  // https://api.bilibili.com/x/web-interface/archive/has/like\n  // static const String hasLikeVideo = '/x/web-interface/archive/has/like';\n\n  static const String pgcLikeCoinFav = '/pgc/season/episode/community';\n\n  // 视频点踩 web端不支持\n\n  // 点踩 Post(app端)\n  /// access_key str\tAPP登录Token 必要\n  /// aid num\t稿件avid\t必要\n  ///\n  static const String dislikeVideo =\n      '${HttpString.appBaseUrl}/x/v2/view/dislike';\n\n  // 投币视频（web端）POST\n  /// aid\tnum\t稿件avid\t必要（可选）\tavid与bvid任选一个\n  /// bvid\tstr\t稿件bvid\t必要（可选）\tavid与bvid任选一个\n  /// multiply\tnum\t投币数量\t必要\t上限为2\n  /// select_like\tnum\t是否附加点赞\t非必要\t0：不点赞 1：同时点赞 默认为0\n  // csrf\tstr\tCSRF Token（位于cookie）\t必要\n  // https://api.bilibili.com/x/web-interface/coin/add\n  // static const String coinVideo = '/x/web-interface/coin/add';\n\n  // 改用app端投币接口\n  static const String coinVideo = '${HttpString.appBaseUrl}/x/v2/view/coin/add';\n\n  // 判断视频是否被投币（双端）GET\n  // access_key\tstr\tAPP登录Token\tAPP方式必要\n  /// aid\tnum\t稿件avid\t必要（可选）\tavid与bvid任选一个\n  /// bvid\tstr\t稿件bvid\t必要（可选）\tavid与bvid任选一个\n  /// https://api.bilibili.com/x/web-interface/archive/coins\n  // static const String hasCoinVideo = '/x/web-interface/archive/coins';\n\n  /// 收藏夹 详情\n  /// media_id  当前收藏夹id 搜索全部时为默认收藏夹id\n  /// pn int 当前页\n  /// ps int pageSize\n  /// keyword String 搜索词\n  /// order String 排序方式 view 最多播放 mtime 最近收藏 pubtime 最近投稿\n  /// tid int 分区id\n  /// platform web\n  /// type 0 当前收藏夹 1 全部收藏夹\n  // https://api.bilibili.com/x/v3/fav/resource/list?media_id=76614671&pn=1&ps=20&keyword=&order=mtime&type=0&tid=0\n  static const String favResourceList = '/x/v3/fav/resource/list';\n\n  // 收藏视频（双端）POST\n  // access_key\tstr\tAPP登录Token\tAPP方式必要\n  /// rid\tnum\t稿件avid\t必要\n  /// type\tnum\t必须为2\t必要\n  /// add_media_ids\tnums\t需要加入的收藏夹mlid\t非必要\t同时添加多个，用,（%2C）分隔\n  /// del_media_ids\tnums\t需要取消的收藏夹mlid\t非必要\t同时取消多个，用,（%2C）分隔\n  // csrf\tstr\tCSRF Token（位于cookie）\tCookie方式必要\n  // https://api.bilibili.com/medialist/gateway/coll/resource/deal\n  // https://api.bilibili.com/x/v3/fav/resource/deal\n  static const String favVideo = '/x/v3/fav/resource/batch-deal';\n\n  static const String unfavAll = '/x/v3/fav/resource/unfav-all';\n\n  static const String copyFav = '/x/v3/fav/resource/copy';\n\n  static const String moveFav = '/x/v3/fav/resource/move';\n\n  static const String cleanFav = '/x/v3/fav/resource/clean';\n\n  static const String sortFav = '/x/v3/fav/resource/sort';\n\n  static const String sortFavFolder = '/x/v3/fav/folder/sort';\n\n  // 判断视频是否被收藏（双端）GET\n  /// aid\n  // https://api.bilibili.com/x/v2/fav/video/favoured\n  // static const String hasFavVideo = '/x/v2/fav/video/favoured';\n\n  // 分享视频 （Web端） POST\n  // https://api.bilibili.com/x/web-interface/share/add\n  // aid\tnum\t稿件avid\t必要（可选）\tavid与bvid任选一个\n  // bvid\tstr\t稿件bvid\t必要（可选）\tavid与bvid任选一个\n  // csrf\tstr\tCSRF Token（位于cookie）\t必要\n\n  // 一键三连\n  // https://api.bilibili.com/x/web-interface/archive/like/triple\n  // aid\tnum\t稿件avid\t必要（可选）\tavid与bvid任选一个\n  // bvid\tstr\t稿件bvid\t必要（可选）\tavid与bvid任选一个\n  // csrf\tstr\tCSRF Token（位于cookie）\t必要\n  static const String ugcTriple = '/x/web-interface/archive/like/triple';\n\n  static const String pgcTriple = '/pgc/season/episode/like/triple';\n\n  // 获取指定用户创建的所有收藏夹信息\n  // 该接口也能查询目标内容id存在于那些收藏夹中\n  // up_mid\tnum\t目标用户mid\t必要\n  // type\tnum\t目标内容属性\t非必要\t默认为全部 0：全部 2：视频稿件\n  // rid\tnum\t目标 视频稿件avid\n  static const String favFolder = '/x/v3/fav/folder/created/list-all';\n\n  static const String copyToview = '/x/v2/history/toview/copy';\n\n  static const String moveToview = '/x/v2/history/toview/move';\n\n  // 视频详情页 相关视频\n  static const String relatedList = '/x/web-interface/archive/related';\n\n  // 查询用户与自己关系_仅查关注\n  static const String relation = '/x/relation';\n\n  static const String relations = '/x/relation/relations';\n\n  // 操作用户关系\n  static const String relationMod = '/x/relation/modify';\n\n  // 相互关系查询 // 失效\n  // static const String relationSearch = '/x/space/wbi/acc/relation';\n\n  // 评论列表\n  // https://api.bilibili.com/x/v2/reply/main?csrf=6e22efc1a47225ea25f901f922b5cfdd&mode=3&oid=254175381&pagination_str=%7B%22offset%22:%22%22%7D&plat=1&seek_rpid=0&type=11\n  static const String replyList = '/x/v2/reply';\n\n  // 楼中楼\n  static const String replyReplyList = '/x/v2/reply/reply';\n\n  // 评论点赞\n  static const String likeReply = '/x/v2/reply/action';\n\n  static const String hateReply = '/x/v2/reply/hate';\n\n  // 发表评论\n  // https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/comment/action.md\n  static const String replyAdd = '/x/v2/reply/add';\n\n  // 删除评论\n  // https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/comment/action.md\n  static const String replyDel = '/x/v2/reply/del';\n\n  // 用户(被)关注数、投稿数\n  // https://api.bilibili.com/x/relation/stat?vmid=697166795\n  static const String userStat = '/x/relation/stat';\n\n  // 获取我的表情列表\n  // business:reply（回复）dynamic（动态）\n  //https://api.bilibili.com/x/emote/user/panel/web?business=reply\n  static const String myEmote = '/x/emote/user/panel/web';\n\n  // 获取用户信息\n  static const String userInfo = '/x/web-interface/nav';\n\n  // 获取当前用户状态\n  static const String userStatOwner = '/x/web-interface/nav/stat';\n\n  // 收藏夹\n  // https://api.bilibili.com/x/v3/fav/folder/created/list?pn=1&ps=10&up_mid=17340771\n  static const String userFavFolder = '/x/v3/fav/folder/created/list';\n\n  static const String favFolderInfo = '/x/v3/fav/folder/info';\n\n  static const String addFolder = '/x/v3/fav/folder/add';\n\n  static const String editFolder = '/x/v3/fav/folder/edit';\n\n  static const String deleteFolder = '/x/v3/fav/folder/del';\n\n  // 正在直播的up & 关注的up\n  // https://api.bilibili.com/x/polymer/web-dynamic/v1/portal\n  static const String followUp = '/x/polymer/web-dynamic/v1/portal';\n\n  static const String dynUplist = '/x/polymer/web-dynamic/v1/uplist';\n\n  // 关注的up动态\n  // https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/all\n  // https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/all?timezone_offset=-480&type=video&page=1&features=itemOpusStyle\n  // https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/all?host_mid=548196587&offset=&page=1&features=itemOpusStyle\n  static const String followDynamic = '/x/polymer/web-dynamic/v1/feed/all';\n\n  // 动态点赞\n  // static const String likeDynamic =\n  //     '${HttpString.tUrl}/dynamic_like/v1/dynamic_like/thumb';\n\n  // 动态点赞 new\n  static const String thumbDynamic = '/x/dynamic/feed/dyn/thumb';\n\n  // 获取稍后再看\n  static const String seeYouLater = '/x/v2/history/toview/web';\n\n  // 获取历史记录\n  static const String historyList = '/x/web-interface/history/cursor';\n\n  // 暂停历史记录\n  static const String pauseHistory = '/x/v2/history/shadow/set';\n\n  // 查询历史记录暂停状态\n  static const String historyStatus = '/x/v2/history/shadow?jsonp=jsonp';\n\n  // 清空历史记录\n  static const String clearHistory = '/x/v2/history/clear';\n\n  // 删除某条历史记录\n  static const String delHistory = '/x/v2/history/delete';\n\n  // 搜索历史记录\n  static const String searchHistory = '/x/web-interface/history/search';\n\n  // 热搜\n  static const String hotSearchList =\n      'https://s.search.bilibili.com/main/hotword';\n\n  // 默认搜索词\n  static const String searchDefault = '/x/web-interface/wbi/search/default';\n\n  // 搜索关键词\n  static const String searchSuggest =\n      'https://s.search.bilibili.com/main/suggest';\n\n  // 分类搜索\n  static const String searchByType = '/x/web-interface/wbi/search/type';\n\n  static const String searchAll = '/x/web-interface/wbi/search/all/v2';\n\n  // 记录视频播放进度\n  // https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/video/report.md\n  static const String heartBeat = '/x/click-interface/web/heartbeat';\n\n  static const String historyReport = '/x/v2/history/report';\n\n  static const String roomEntryAction =\n      '${HttpString.liveBaseUrl}/xlive/web-room/v1/index/roomEntryAction';\n\n  static const String mediaListHistory = '/x/v1/medialist/history';\n\n  // 查询视频分P列表 (avid/bvid转cid)\n  static const String ab2c = '/x/player/pagelist';\n\n  // 番剧/剧集明细\n  static const String pgcInfo = '/pgc/view/web/season';\n\n  static const String pugvInfo = '/pugv/view/web/season';\n\n  // https://api.bilibili.com/pgc/season/episode/web/info?ep_id=12345678\n  static const String episodeInfo = '/pgc/season/episode/web/info';\n\n  // 全部关注的up\n  // vmid 用户id pn 页码 ps 每页个数，最大50 order: desc\n  // order_type 排序规则 最近访问传空，最常访问传 attention\n  static const String followings = '/x/relation/followings';\n\n  // 搜索follow\n  static const followSearch = '/x/relation/followings/search';\n\n  // 粉丝\n  // vmid 用户id pn 页码 ps 每页个数，最大50 order: desc\n  // order_type 排序规则 最近访问传空，最常访问传 attention\n  static const String fans = '/x/relation/fans';\n\n  // 直播\n  // ?page=1&page_size=30&platform=web\n  static const String liveList =\n      '${HttpString.liveBaseUrl}/xlive/web-interface/v1/second/getUserRecommend';\n\n  // 直播间详情\n  // cid roomId\n  // qn 80:流畅，150:高清，400:蓝光，10000:原画，20000:4K, 30000:杜比\n  static const String liveRoomInfo =\n      '${HttpString.liveBaseUrl}/xlive/web-room/v2/index/getRoomPlayInfo';\n\n  static const String sendLiveMsg = '${HttpString.liveBaseUrl}/msg/send';\n\n  // 直播间详情 H5\n  static const String liveRoomInfoH5 =\n      '${HttpString.liveBaseUrl}/xlive/web-room/v1/index/getH5InfoByRoom';\n\n  // 直播间弹幕预获取\n  // roomid roomId\n  static const String liveRoomDmPrefetch =\n      '${HttpString.liveBaseUrl}/xlive/web-room/v1/dM/gethistory';\n\n  //直播间弹幕密钥获取接口\n  static const String liveRoomDmToken =\n      '${HttpString.liveBaseUrl}/xlive/web-room/v1/index/getDanmuInfo';\n\n  // 用户信息 需要Wbi签名\n  // https://api.bilibili.com/x/space/wbi/acc/info?mid=503427686&token=&platform=web&web_location=1550101&w_rid=d709892496ce93e3d94d6d37c95bde91&wts=1689301482\n  static const String memberInfo = '/x/space/wbi/acc/info';\n\n  static const String space = '${HttpString.appBaseUrl}/x/v2/space';\n\n  static const String spaceArchive =\n      '${HttpString.appBaseUrl}/x/v2/space/archive/cursor';\n\n  static const String spaceStory =\n      '${HttpString.appBaseUrl}/x/v2/feed/index/space/story/cursor';\n\n  static const String spaceChargingArchive =\n      '${HttpString.appBaseUrl}/x/v2/space/archive/charging';\n\n  static const String spaceSeason =\n      '${HttpString.appBaseUrl}/x/v2/space/season/videos';\n\n  static const String spaceSeries =\n      '${HttpString.appBaseUrl}/x/v2/space/series';\n\n  static const String spaceBangumi =\n      '${HttpString.appBaseUrl}/x/v2/space/bangumi';\n\n  static const String spaceArticle =\n      '${HttpString.appBaseUrl}/x/v2/space/article';\n\n  static const String spaceFav = '/x/v3/fav/folder/space';\n\n  static const String seasonSeries = '/x/polymer/web-space/seasons_series_list';\n\n  // 用户名片信息\n  static const String memberCardInfo = '/x/web-interface/card';\n\n  // 用户投稿\n  // https://api.bilibili.com/x/space/wbi/arc/search?\n  // mid=85754245&\n  // ps=30&\n  // tid=0&\n  // pn=1&\n  // keyword=&\n  // order=pubdate&\n  // platform=web&\n  // web_location=1550101&\n  // order_avoided=true&\n  // w_rid=d893cf98a4e010cf326373194a648360&\n  // wts=1689767832\n  static const String searchArchive = '/x/space/wbi/arc/search';\n\n  // 用户动态搜索\n  // static const String memberDynamicSearch = '/x/space/dynamic/search';\n  static const String dynSearch = '/x/polymer/web-dynamic/v1/feed/space/search';\n\n  // 用户动态\n  static const String memberDynamic = '/x/polymer/web-dynamic/v1/feed/space';\n\n  // 稍后再看\n  static const String toViewLater = '/x/v2/history/toview/add';\n\n  // 移除已观看\n  static const String toViewDel = '/x/v2/history/toview/v2/dels';\n\n  // 清空稍后再看\n  static const String toViewClear = '/x/v2/history/toview/clear';\n\n  // 追番\n  static const String pgcAdd = '/pgc/web/follow/add';\n\n  // 取消追番\n  static const String pgcDel = '/pgc/web/follow/del';\n\n  static const String pgcUpdate = '/pgc/web/follow/status/update';\n\n  // 我的追番/追剧 ?type=1&pn=1&ps=15\n  static const String favPgc = '/x/space/bangumi/follow/list';\n\n  // 黑名单\n  static const String blackLst = '/x/relation/blacks';\n\n  // github 获取最新版\n  static const String latestApp =\n      'https://api.github.com/repos/bggRGjQaUbCoE/PiliPlus/releases';\n\n  // 多少人在看\n  // https://api.bilibili.com/x/player/online/total?aid=913663681&cid=1203559746&bvid=BV1MM4y1s7NZ&ts=56427838\n  static const String onlineTotal = '/x/player/online/total';\n\n  // static const String webDanmaku = '/x/v2/dm/web/seg.so';\n\n  // 发送视频弹幕\n  //https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/danmaku/action.md\n  static const String shootDanmaku = '/x/v2/dm/post';\n\n  // 弹幕屏蔽查询（Get）\n  static const String danmakuFilter = '/x/dm/filter/user';\n\n  // 弹幕屏蔽词添加（Post）\n  // 表单内容：\n  // type: 0（关键词）1（正则）2（用户）\n  // filter: 屏蔽内容\n  // csrf\n  static const String danmakuFilterAdd = '/x/dm/filter/user/add';\n\n  // 弹幕屏蔽词删除（Post）\n  // 表单内容：\n  // ids: 被删除条目编号\n  // csrf\n  static const String danmakuFilterDel = '/x/dm/filter/user/del';\n\n  // up主分组\n  static const String followUpTag = '/x/relation/tags';\n\n  // 设置Up主分组\n  // 0 添加至默认分组  否则使用,分割tagid\n  static const String addUsers = '/x/relation/tags/addUsers';\n\n  static const String addSpecial = '/x/relation/tag/special/add';\n\n  static const String delSpecial = '/x/relation/tag/special/del';\n\n  // 获取指定分组下的up\n  static const String followUpGroup = '/x/relation/tag';\n\n  static const String createFollowTag = '/x/relation/tag/create';\n\n  static const String updateFollowTag = '/x/relation/tag/update';\n\n  static const String delFollowTag = '/x/relation/tag/del';\n\n  // 获取未读私信数\n  // https://api.vc.bilibili.com/session_svr/v1/session_svr/single_unread\n  static const String msgUnread =\n      '${HttpString.tUrl}/session_svr/v1/session_svr/single_unread';\n\n  // 获取消息中心未读信息\n  static const String msgFeedUnread = '/x/msgfeed/unread';\n  //https://api.bilibili.com/x/msgfeed/reply?platform=web&build=0&mobi_app=web\n  static const String msgFeedReply = '/x/msgfeed/reply';\n  //https://api.bilibili.com/x/msgfeed/at?platform=web&build=0&mobi_app=web\n  static const String msgFeedAt = '/x/msgfeed/at';\n  //https://api.bilibili.com/x/msgfeed/like?platform=web&build=0&mobi_app=web\n  static const String msgFeedLike = '/x/msgfeed/like';\n  //https://message.bilibili.com/x/sys-msg/query_notify_list?page_size=20&cursor=xxx\n  static const String msgSysNotify =\n      '${HttpString.messageBaseUrl}/x/sys-msg/query_notify_list';\n\n  // 系统信息光标更新（已读标记）\n  //https://message.bilibili.com/x/sys-msg/update_cursor?csrf=xxxx&csrf=xxxx&cursor=1705288500000000000&has_up=0&build=0&mobi_app=web\n  static const String msgSysUpdateCursor =\n      '${HttpString.messageBaseUrl}/x/sys-msg/update_cursor';\n\n  /// 私聊\n  ///  'https://api.vc.bilibili.com/session_svr/v1/session_svr/get_sessions?\n  /// session_type=1&\n  /// group_fold=1&\n  /// unfollow_fold=0&\n  /// sort_rule=2&\n  /// build=0&\n  /// mobi_app=web&\n  /// w_rid=8641d157fb9a9255eb2159f316ee39e2&\n  /// wts=1697305010\n\n  static const String sessionList =\n      '${HttpString.tUrl}/session_svr/v1/session_svr/get_sessions';\n\n  /// 私聊用户信息\n  /// uids\n  /// build=0&mobi_app=web\n  static const String sessionAccountList =\n      '${HttpString.tUrl}/account/v1/user/cards';\n\n  /// https://api.vc.bilibili.com/svr_sync/v1/svr_sync/fetch_session_msgs?\n  /// talker_id=400787461&\n  /// session_type=1&\n  /// size=20&\n  /// sender_device_id=1&\n  /// build=0&\n  /// mobi_app=web&\n  /// web_location=333.1296&\n  /// w_rid=cfe3bf58c9fe181bbf4dd6c75175e6b0&\n  /// wts=1697350697\n\n  static const String sessionMsg =\n      '${HttpString.tUrl}/svr_sync/v1/svr_sync/fetch_session_msgs';\n\n  /// 标记已读 POST\n  /// talker_id:\n  /// session_type: 1\n  /// ack_seqno: 920224140918926\n  /// build: 0\n  /// mobi_app: web\n  /// csrf_token:\n  /// csrf:\n  static const String ackSessionMsg =\n      '${HttpString.tUrl}/session_svr/v1/session_svr/update_ack';\n\n  // 获取某个动态详情\n  // timezone_offset=-480\n  // id=849312409672744983\n  // features=itemOpusStyle\n  static const String dynamicDetail = '/x/polymer/web-dynamic/v1/detail';\n\n  // AI总结\n  /// https://api.bilibili.com/x/web-interface/view/conclusion/get?\n  /// bvid=BV1ju4y1s7kn&\n  /// cid=1296086601&\n  /// up_mid=4641697&\n  /// w_rid=1607c6c5a4a35a1297e31992220900ae&\n  /// wts=1697033079\n  static const String aiConclusion = '/x/web-interface/view/conclusion/get';\n\n  // captcha验证码\n  static const String getCaptcha =\n      '${HttpString.passBaseUrl}/x/passport-login/captcha?source=main_web';\n\n  // web端短信验证码\n  static const String smsCode =\n      '${HttpString.passBaseUrl}/x/passport-login/web/sms/send';\n\n  // web端验证码登录\n\n  // web端密码登录\n  static const String logInByWebPwd =\n      '${HttpString.passBaseUrl}/x/passport-login/web/login';\n\n  // 获取guestID\n  // static const String getGuestId = '/x/passport-user/guest/reg';\n\n  // app端短信验证码\n  static const String appSmsCode =\n      '${HttpString.passBaseUrl}/x/passport-login/sms/send';\n\n  // app端验证码登录\n  static const String logInByAppSms =\n      '${HttpString.passBaseUrl}/x/passport-login/login/sms';\n\n  // 获取短信验证码\n  // static const String appSafeSmsCode =\n  //     'https://passport.bilibili.com/x/safecenter/common/sms/send';\n\n  /// app端密码登录\n  /// username\n  /// password\n  /// key\n  /// salt\n  static const String loginByPwdApi =\n      '${HttpString.passBaseUrl}/x/passport-login/oauth2/login';\n\n  /// 密码登录时，提示“本次登录环境存在风险, 需使用手机号进行验证或绑定”\n  /// 根据https://ivan.hanloth.cn/archives/530/流程进行手机号验证\n  /// tmp_code\n  static const String safeCenterGetInfo =\n      '${HttpString.passBaseUrl}/x/safecenter/user/info';\n\n  /// 验证绑定手机号前的人机验证\n  static const String preCapture =\n      '${HttpString.passBaseUrl}/x/safecenter/captcha/pre';\n\n  /// 密码登录时风控发送手机验证码\n  ///sms_type\tstr\tloginTelCheck\n  /// tmp_code\tstr\t验证标记代码\t来自数据处理中的解析出的参数tmp_token\n  /// gee_challenge\tstr\t极验id\t申请人机验证时得到(data->gee_challenge)\n  /// gee_seccode\tstr\t极验key\t人机验证后得到(result->geetest_seccode)\n  /// gee_validate\tstr\t极验result\t人机验证后得到(result->geetest_validate)\n  /// recaptcha_token\tstr\t验证token\t申请人机验证时得到(data->recaptcha_token)\n  static const String safeCenterSmsCode =\n      '${HttpString.passBaseUrl}/x/safecenter/common/sms/send';\n\n  /// type\tstr\tloginTelCheck\n  /// code\tint\t验证码内容\n  /// tmp_code\tstr\t验证标记代码\t来自数据处理中的解析出的参数tmp_token\n  /// request_id\tstr\t验证请求标记\t来自数据处理中的解析出的参数requestId\n  /// captcha_key\tstr\t验证秘钥\t来自申请验证码的captcha_key（data->captcha_key）\n  static const String safeCenterSmsVerify =\n      '${HttpString.passBaseUrl}/x/safecenter/login/tel/verify';\n\n  static const String oauth2AccessToken =\n      '${HttpString.passBaseUrl}/x/passport-login/oauth2/access_token';\n\n  /// 密码加密密钥\n  /// disable_rcmd\n  /// local_id\n  static const getWebKey = '${HttpString.passBaseUrl}/x/passport-login/web/key';\n\n  /// cookie转access_key\n  static const qrcodeConfirm =\n      '${HttpString.passBaseUrl}/x/passport-tv-login/h5/qrcode/confirm';\n\n  /// 申请二维码(TV端)\n  static const getTVCode =\n      '${HttpString.passBaseUrl}/x/passport-tv-login/qrcode/auth_code';\n\n  ///扫码登录（TV端）\n  static const qrcodePoll =\n      '${HttpString.passBaseUrl}/x/passport-tv-login/qrcode/poll';\n\n  static const logout = '${HttpString.passBaseUrl}/login/exit/v2';\n\n  /// 置顶视频\n  static const getTopVideoApi = '/x/space/top/arc';\n\n  /// 主页 - 最近投币的视频\n  /// vmid\n  /// gaia_source = main_web\n  /// web_location\n  /// w_rid\n  /// wts\n  static const getRecentCoinVideoApi = '/x/space/coin/video';\n\n  /// 最近点赞的视频\n  static const getRecentLikeVideoApi = '/x/space/like/video';\n\n  /// 用户专栏\n  static const getMemberSeasonsApi = '/x/polymer/web-space/home/seasons_series';\n\n  /// 获赞数 播放数\n  /// mid\n  static const getMemberViewApi = '/x/space/upstat';\n\n  /// 查询某个专栏\n  /// mid\n  /// season_id\n  /// sort_reverse\n  /// page_num\n  /// page_size\n  static const getSeasonDetailApi =\n      '/x/polymer/web-space/seasons_archives_list';\n\n  /// 获取未读动态数\n  static const getUnreadDynamic = '/x/web-interface/dynamic/entrance';\n\n  /// 用户动态主页\n  static const dynamicSpmPrefix = '${HttpString.spaceBaseUrl}/1/dynamic';\n\n  /// 激活buvid3\n  static const activateBuvidApi = '/x/internal/gaia-gateway/ExClimbWuzhi';\n\n  /// 我的订阅\n  static const userSubFolder = '/x/v3/fav/folder/collected/list';\n\n  /// 我的订阅-合集详情\n  static const favSeasonList = '/x/space/fav/season/list';\n\n  /// 发送私信\n  static const String sendMsg = '${HttpString.tUrl}/web_im/v1/web_im/send_msg';\n\n  /// 排行榜\n  static const String getRankApi = \"/x/web-interface/ranking/v2\";\n\n  static const String pgcRank = \"/pgc/web/rank/list\";\n\n  static const String pgcSeasonRank = \"/pgc/season/rank/web/list\";\n\n  /// 取消订阅-播单\n  static const String unfavFolder = '/x/v3/fav/folder/unfav';\n\n  // static const String videoTags = '/x/tag/archive/tags';\n  static const String videoTags = '/x/web-interface/view/detail/tag';\n\n  static const String reportMember =\n      '${HttpString.spaceBaseUrl}/ajax/report/add';\n\n  static const String removeMsg = '/session_svr/v1/session_svr/remove_session';\n\n  static const String delSysMsg = '/x/sys-msg/del_notify_list';\n\n  static const String delMsgfeed = '/x/msgfeed/del';\n\n  static const String setTop = '/session_svr/v1/session_svr/set_top';\n\n  static const String createDynamic = '/x/dynamic/feed/create/dyn';\n\n  static const String createTextDynamic = '/dynamic_svr/v1/dynamic_svr/create';\n\n  // static const String removeDynamic = '${HttpString.tUrl}/dynamic_svr/v1/dynamic_svr/rm_dynamic';\n\n  static const String removeDynamic = '/x/dynamic/feed/operate/remove';\n\n  static const String uploadBfs = '/x/dynamic/feed/draw/upload_bfs';\n\n  static const String uploadImage = '/x/upload/web/image';\n\n  // 点赞投币收藏关注\n  static const String videoRelation = '/x/web-interface/archive/relation';\n\n  static const String favSeason = '/x/v3/fav/season/fav';\n\n  static const String unfavSeason = '/x/v3/fav/season/unfav';\n\n  /// 稍后再看&收藏夹视频列表\n  static const String mediaList = '/x/v2/medialist/resource/list';\n\n  static const String pgcIndexCondition = '/pgc/season/index/condition';\n\n  static const String pgcIndexResult = '/pgc/season/index/result';\n\n  static const String archiveNoteList = '/x/note/publish/list/archive';\n\n  static const String noteList = '/x/note/list';\n\n  static const String userNoteList = '/x/note/publish/list/user';\n\n  static const String addNote = '/x/note/add';\n\n  static const String delNote = '/x/note/del';\n\n  static const String delPublishNote = '/x/note/publish/del';\n\n  static const String archiveNote = '/x/note/list/archive';\n\n  static const String favArticle = '/x/polymer/web-dynamic/v1/opus/feed/fav';\n\n  static const String communityAction =\n      '/x/community/cosmo/interface/simple_action';\n\n  static const String delFavArticle = '/x/article/favorites/del';\n\n  static const String addFavArticle = '/x/article/favorites/add';\n\n  static const String replyTop = '/x/v2/reply/top';\n\n  static const String getCoin = '${HttpString.accountBaseUrl}/site/getCoin';\n\n  static const String getLiveEmoticons =\n      '${HttpString.liveBaseUrl}/xlive/web-ucenter/v2/emoticon/GetEmoticons';\n\n  static const String pgcTimeline = '/pgc/web/timeline';\n\n  static const String searchTrending = '/x/v2/search/trending/ranking';\n\n  static const String setTopDyn = '/x/dynamic/feed/space/set_top';\n\n  static const String rmTopDyn = '/x/dynamic/feed/space/rm_top';\n\n  static const String searchRecommend =\n      '${HttpString.appBaseUrl}/x/v2/search/recommend';\n\n  static const String articleInfo = '/x/article/viewinfo';\n\n  static const String dynamicReport = '/x/dynamic/feed/dynamic_report/add';\n\n  // https://github.com/SocialSisterYi/bilibili-API-collect/pull/1242\n  static const String articleView = '/x/article/view';\n\n  static const String opusDetail = '/x/polymer/web-dynamic/v1/opus/detail';\n\n  static const String gaiaVgateRegister = '/x/gaia-vgate/v1/register';\n\n  static const String gaiaVgateValidate = '/x/gaia-vgate/v1/validate';\n\n  static const String voteInfo = '/x/vote/vote_info';\n\n  static const String doVote = '/x/vote/do_vote';\n\n  static const String liveFeedIndex =\n      '${HttpString.liveBaseUrl}/xlive/app-interface/v2/index/feed';\n\n  static const String liveFollow =\n      '${HttpString.liveBaseUrl}/xlive/web-ucenter/user/following';\n\n  static const String liveSecondList =\n      '${HttpString.liveBaseUrl}/xlive/app-interface/v2/second/getList';\n\n  static const String msgSetNotice = '/x/msgfeed/notice';\n\n  static const String liveAreaList =\n      '${HttpString.liveBaseUrl}/xlive/app-interface/v2/index/getAreaList';\n\n  static const String liveRoomAreaList =\n      '${HttpString.liveBaseUrl}/room/v1/Area/getList';\n\n  static const String getLiveFavTag =\n      '${HttpString.liveBaseUrl}/xlive/app-interface/v2/second/get_fav_tag';\n\n  static const String setLiveFavTag =\n      '${HttpString.liveBaseUrl}/xlive/app-interface/v2/second/set_fav_tag';\n\n  static const String liveSearch =\n      '${HttpString.liveBaseUrl}/xlive/app-interface/v2/search_live';\n\n  static const String topicTop =\n      '${HttpString.appBaseUrl}/x/topic/web/details/top';\n\n  static const String topicFeed = '/x/polymer/web-dynamic/v1/feed/topic';\n\n  static const String spaceOpus = '/x/polymer/web-dynamic/v1/opus/feed/space';\n\n  static const String articleList = '/x/article/list/web/articles';\n\n  static const String setMsgDnd =\n      '${HttpString.tUrl}/link_setting/v1/link_setting/set_msg_dnd';\n\n  static const String imUserInfos = '${HttpString.tUrl}/x/im/user_infos';\n\n  static const String getSessionSs =\n      '${HttpString.tUrl}/link_setting/v1/link_setting/get_session_ss';\n\n  static const String getMsgDnd =\n      '${HttpString.tUrl}/link_setting/v1/link_setting/get_msg_dnd';\n\n  static const String setPushSs =\n      '${HttpString.tUrl}/link_setting/v1/link_setting/set_push_ss';\n\n  static const String dynReserve = '/x/dynamic/feed/reserve/click';\n\n  static const String favPugv = '/pugv/app/web/favorite/page';\n\n  static const String addFavPugv = '/pugv/app/web/favorite/add';\n\n  static const String delFavPugv = '/pugv/app/web/favorite/del';\n\n  static const String favTopicList = '/x/topic/web/fav/list';\n\n  static const String addFavTopic = '/x/topic/fav/sub/add';\n\n  static const String delFavTopic = '/x/topic/fav/sub/cancel';\n\n  static const String likeTopic = '/x/topic/like';\n\n  static const String pgcReviewL = '/pgc/review/long/list';\n\n  static const String pgcReviewS = '/pgc/review/short/list';\n\n  static const String pgcReviewLike = '/pgc/review/action/like';\n\n  static const String pgcReviewDislike = '/pgc/review/action/dislike';\n\n  static const String pgcReviewPost = '/pgc/review/short/post';\n\n  static const String pgcReviewMod = '/pgc/review/short/modify';\n\n  static const String pgcReviewDel = '/pgc/review/short/del';\n\n  static const String topicPubSearch =\n      '${HttpString.appBaseUrl}/x/topic/pub/search';\n\n  static const String upowerRank = '/x/upower/up/member/rank/v2';\n\n  static const String favFavFolder = '/x/v3/fav/folder/fav';\n\n  static const String unfavFavFolder = '/x/v3/fav/folder/unfav';\n\n  static const String coinArc = '${HttpString.appBaseUrl}/x/v2/space/coinarc';\n\n  static const String likeArc = '${HttpString.appBaseUrl}/x/v2/space/likearc';\n\n  static const String spaceSetting = '/x/space/setting/app';\n\n  static const String spaceSettingMod = '/x/space/privacy/batch/modify';\n\n  static const String vipExpAdd = '/x/vip/experience/add';\n\n  static const String coinLog = '/x/member/web/coin/log';\n\n  static const String dynTopicRcmd = '/x/topic/web/dynamic/rcmd';\n\n  static const String matchInfo = '/x/esports/match/info';\n\n  static const String dynPic = '/x/polymer/web-dynamic/v1/detail/pic';\n\n  static const String msgLikeDetail = '/x/msgfeed/like_detail';\n\n  static const String getLiveInfoByUser =\n      '${HttpString.liveBaseUrl}/xlive/web-room/v1/index/getInfoByUser';\n\n  static const String liveSetSilent =\n      '${HttpString.liveBaseUrl}/liveact/user_silent';\n\n  static const String addShieldKeyword =\n      '${HttpString.liveBaseUrl}/xlive/web-ucenter/v1/banned/AddShieldKeyword';\n\n  static const String delShieldKeyword =\n      '${HttpString.liveBaseUrl}/xlive/web-ucenter/v1/banned/DelShieldKeyword';\n\n  static const String liveShieldUser =\n      '${HttpString.liveBaseUrl}/liveact/shield_user';\n\n  static const String spaceComic = '${HttpString.appBaseUrl}/x/v2/space/comic';\n\n  static const String spaceAudio = '/audio/music-service/web/song/upper';\n\n  static const String spaceCheese = '/pugv/app/web/season/page';\n\n  static const String dynMention = '/x/polymer/web-dynamic/v1/mention/search';\n\n  static const String createVote = '/x/vote/create';\n\n  static const String updateVote = '/x/vote/update';\n\n  static const String createReserve = '/x/new-reserve/up/reserve/create';\n\n  static const String updateReserve = '/x/new-reserve/up/reserve/update';\n\n  static const String reserveInfo = '/x/new-reserve/up/reserve/info';\n\n  static const String loginLog = '/x/member/web/login/log';\n\n  static const String expLog = '/x/member/web/exp/log';\n\n  static const String moralLog = '/x/member/web/moral/log';\n\n  static const String liveLikeReport =\n      '${HttpString.liveBaseUrl}/xlive/app-ucenter/v1/like_info_v3/like/likeReportV3';\n\n  static const String loginDevices =\n      '${HttpString.passBaseUrl}/x/safecenter/user_login_devices';\n\n  static const String bgmDetail = '/x/copyright-music-publicity/bgm/detail';\n\n  static const String wishUpdate =\n      '/x/copyright-music-publicity/bgm/wish/update';\n\n  static const String bgmRecommend =\n      '/x/copyright-music-publicity/bgm/recommend_list';\n\n  static const String spaceShop =\n      '${HttpString.mallBaseUrl}/community-hub/small_shop/feed/tab/item';\n\n  static const String superChatMsg =\n      '${HttpString.liveBaseUrl}/av/v1/SuperChat/getMessageList';\n\n  static const String popularSeriesOne = '/x/web-interface/popular/series/one';\n\n  static const String popularSeriesList =\n      '/x/web-interface/popular/series/list';\n\n  static const String popularPrecious = '/x/web-interface/popular/precious';\n\n  static const String userRealName = '/x/member/app/up/realname';\n\n  static const String liveDmReport =\n      '${HttpString.liveBaseUrl}/xlive/web-ucenter/v1/dMReport/Report';\n\n  static const String danmakuLike = '/x/v2/dm/thumbup/add';\n\n  static const String danmakuReport = '/x/dm/report/add';\n\n  static const String danmakuRecall = '/x/dm/recall';\n\n  static const String danmakuEditState = '/x/v2/dm/edit/state';\n\n  static const String followedUp = '/x/relation/followings/followed_upper';\n\n  static const String sameFollowing = '/x/relation/same/followings';\n\n  static const String seasonStatus = '/pgc/view/web/season/user/status';\n\n  static const String followeeVotes =\n      '${HttpString.tUrl}/vote_svr/v1/vote_svr/followee_votes';\n\n  static const String liveContributionRank =\n      '${HttpString.liveBaseUrl}/xlive/general-interface/v1/rank/queryContributionRank';\n\n  static const String superChatReport =\n      '${HttpString.liveBaseUrl}/av/v1/SuperChat/report';\n\n  static const String imMsgReport = '${HttpString.tUrl}/x/bplus/im/report/add';\n\n  static const String dynPrivatePubSetting =\n      '/x/dynamic/feed/dyn/private_pub_setting';\n\n  static const String editDyn = '/x/dynamic/feed/edit/dyn';\n\n  static const String replyInteraction =\n      '/x/v2/reply/subject/interaction-status';\n\n  static const String replySubjectModify = '/x/v2/reply/subject/modify';\n\n  static const String videoshot = '/x/player/videoshot';\n}\n"
  },
  {
    "path": "lib/http/black.dart",
    "content": "import 'package:PiliPlus/http/api.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/blacklist/data.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\n\nabstract final class BlackHttp {\n  static Future<LoadingState<BlackListData>> blackList({\n    required int pn,\n    int ps = 50,\n  }) async {\n    final res = await Request().get(\n      Api.blackLst,\n      queryParameters: {\n        'pn': pn,\n        'ps': ps,\n        're_version': 0,\n        'jsonp': 'jsonp',\n        'csrf': Accounts.main.csrf,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(BlackListData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/http/browser_ua.dart",
    "content": "import 'package:PiliPlus/utils/platform_utils.dart';\n\nabstract final class BrowserUa {\n  static String get platform => PlatformUtils.isMobile ? mob : pc;\n\n  static const pc =\n      'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.2 Safari/605.1.15';\n\n  static const mob =\n      'Mozilla/5.0 (Linux; Android 10; SM-G975F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Mobile Safari/537.36';\n}\n"
  },
  {
    "path": "lib/http/constants.dart",
    "content": "abstract final class HttpString {\n  static const String baseUrl = 'https://www.bilibili.com';\n  static const String apiBaseUrl = 'https://api.bilibili.com';\n  static const String tUrl = 'https://api.vc.bilibili.com';\n  static const String appBaseUrl = 'https://app.bilibili.com';\n  static const String liveBaseUrl = 'https://api.live.bilibili.com';\n  static const String passBaseUrl = 'https://passport.bilibili.com';\n  static const String messageBaseUrl = 'https://message.bilibili.com';\n  static const String dynamicShareBaseUrl = 'https://t.bilibili.com';\n  static const String spaceBaseUrl = 'https://space.bilibili.com';\n  static const String accountBaseUrl = 'https://account.bilibili.com';\n  static const String mallBaseUrl = 'https://mall.bilibili.com';\n\n  static const String sponsorBlockBaseUrl = 'https://www.bsbsb.top';\n}\n"
  },
  {
    "path": "lib/http/danmaku.dart",
    "content": "import 'package:PiliPlus/http/api.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/danmaku/post.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:dio/dio.dart';\n\nabstract final class DanmakuHttp {\n  static Future<LoadingState<DanmakuPost>> shootDanmaku({\n    int type = 1, //弹幕类选择(1：视频弹幕 2：漫画弹幕)\n    required int oid, // 视频cid\n    required String msg, //弹幕文本(长度小于 100 字符)\n    // 弹幕类型(1：滚动弹幕 4：底端弹幕 5：顶端弹幕 6：逆向弹幕(不能使用） 7：高级弹幕 8：代码弹幕（不能使用） 9：BAS弹幕（pool必须为2）)\n    int mode = 1,\n    // String? aid,// 稿件avid\n    // String? bvid,// bvid与aid必须有一个\n    required String bvid,\n    int? progress, // 弹幕出现在视频内的时间（单位为毫秒，默认为0）\n    int? color, // 弹幕颜色(默认白色，16777215）\n    int? fontSize, // 弹幕字号（默认25）\n    int? pool, // 弹幕池选择（0：普通池 1：字幕池 2：特殊池（代码/BAS弹幕）默认普通池，0）\n    //int? rnd,// 当前时间戳*1000000（若无此项，则发送弹幕冷却时间限制为90s；若有此项，则发送弹幕冷却时间限制为5s）\n    bool colorful = false, //60001：专属渐变彩色（需要会员）\n    int? checkboxType, //是否带 UP 身份标识（0：普通；4：带有标识）\n    // String? csrf,//CSRF Token（位于 Cookie）\tCookie 方式必要\n    // String? access_key,//\tAPP 登录 Token\t\tAPP 方式必要\n  }) async {\n    // 构建参数对象\n    // assert(aid != null || bvid != null);\n    // assert(csrf != null || access_key != null);\n    // 构建参数对象\n    final data = <String, Object>{\n      'type': type,\n      'oid': oid,\n      'msg': msg,\n      'mode': mode,\n      //'aid': aid,\n      'bvid': bvid,\n      'progress': ?progress,\n      'color': ?colorful ? 16777215 : color,\n      'fontsize': ?fontSize,\n      'pool': ?pool,\n      'rnd': DateTime.now().microsecondsSinceEpoch,\n      'colorful': ?colorful ? 60001 : null,\n      'checkbox_type': ?checkboxType,\n      'csrf': Accounts.main.csrf,\n      // 'access_key': access_key,\n    };\n\n    final res = await Request().post(\n      Api.shootDanmaku,\n      data: data,\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n\n    if (res.data['code'] == 0) {\n      return Success(DanmakuPost.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message'], code: res.data['code']);\n    }\n  }\n\n  static Future<LoadingState<void>> danmakuLike({\n    required bool isLike,\n    required int cid,\n    required int id,\n  }) async {\n    final data = {\n      'op': isLike ? 1 : 2,\n      'dmid': id,\n      'oid': cid,\n      'platform': 'web_player',\n      'polaris_app_id': 100,\n      'polaris_platform': 5,\n      'spmid': '333.788.0.0',\n      'from_spmid': '333.788.0.0',\n      'statistics': '{\"appId\":100,\"platform\":5,\"abtest\":\"\",\"version\":\"\"}',\n      'csrf': Accounts.main.csrf,\n    };\n    final res = await Request().post(\n      Api.danmakuLike,\n      data: data,\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message'], code: res.data['code']);\n    }\n  }\n\n  static Future<LoadingState<void>> danmakuReport({\n    required int reason,\n    required int cid,\n    required int id,\n    bool block = false,\n    String? content,\n  }) async {\n    final data = {\n      'cid': cid,\n      'dmid': id,\n      'reason': reason,\n      'block': block,\n      'originCid': cid,\n      'content': ?content,\n      'polaris_app_id': 100,\n      'polaris_platform': 5,\n      'spmid': '333.788.0.0',\n      'from_spmid': '333.788.0.0',\n      'statistics': '{\"appId\":100,\"platform\":5,\"abtest\":\"\",\"version\":\"\"}',\n      'csrf': Accounts.main.csrf,\n    };\n    final res = await Request().post(\n      Api.danmakuReport,\n      data: data,\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n\n    /// res.data['data']['block']\n    /// {\n    ///       0: \"举报已提交\",\n    ///       \"-1\": \"举报失败，请先激活账号。\",\n    ///       \"-2\": \"举报失败，系统拒绝受理您的举报请求。\",\n    ///       \"-3\": \"举报失败，您已经被禁言。\",\n    ///       \"-4\": \"您的操作过于频繁，请稍后再试。\",\n    ///       \"-5\": \"您已经举报过这条弹幕了。\",\n    ///       \"-6\": \"举报失败，系统错误。\"\n    /// }\n  }\n\n  static Future<LoadingState<String?>> danmakuRecall({\n    required int cid,\n    required int id,\n  }) async {\n    final data = {\n      'dmid': id,\n      'cid': cid,\n      'type': 1,\n      'csrf': Accounts.main.csrf,\n    };\n    final res = await Request().post(\n      Api.danmakuRecall,\n      data: data,\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return Success(res.data['message']);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<String?>> danmakuEditState({\n    required int oid,\n    required Iterable<int> ids,\n    required int state,\n  }) async {\n    /// 0: 取消删除\n    /// 1：删除弹幕\n    /// 2：弹幕保护\n    /// 3：取消保护\n    final data = {\n      'dmids': ids.join(','),\n      'oid': oid,\n      'state': state,\n      'type': 1,\n      'csrf': Accounts.main.csrf,\n    };\n    final res = await Request().post(\n      Api.danmakuRecall,\n      data: data,\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return Success(res.data['message']);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/http/danmaku_block.dart",
    "content": "import 'package:PiliPlus/http/api.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/user/danmaku_block.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:dio/dio.dart';\n\nabstract final class DanmakuFilterHttp {\n  static Future<LoadingState<DanmakuBlockDataModel>> danmakuFilter() async {\n    final res = await Request().get(Api.danmakuFilter);\n    if (res.data['code'] == 0) {\n      return Success(DanmakuBlockDataModel.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> danmakuFilterDel({required int ids}) async {\n    final res = await Request().post(\n      Api.danmakuFilterDel,\n      data: {\n        'ids': ids,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<SimpleRule>> danmakuFilterAdd({\n    required String filter,\n    required int type,\n  }) async {\n    final res = await Request().post(\n      Api.danmakuFilterAdd,\n      data: {\n        'type': type,\n        'filter': filter,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return Success(SimpleRule.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/http/download.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/video.dart';\nimport 'package:PiliPlus/models/common/account_type.dart';\nimport 'package:PiliPlus/models/common/video/audio_quality.dart';\nimport 'package:PiliPlus/models/common/video/video_decode_type.dart';\nimport 'package:PiliPlus/models/common/video/video_quality.dart';\nimport 'package:PiliPlus/models/common/video/video_type.dart';\nimport 'package:PiliPlus/models/video/play/url.dart';\nimport 'package:PiliPlus/models_new/download/bili_download_entry_info.dart';\nimport 'package:PiliPlus/models_new/download/bili_download_media_file_info.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/video_utils.dart';\n\nabstract final class DownloadHttp {\n  static const String referer = \"https://www.bilibili.com/\";\n  static const String userAgent = \"Bilibili Freedoooooom/MarkII\";\n\n  static Future<BiliDownloadMediaInfo> getVideoUrl({\n    required BiliDownloadEntryInfo entry,\n    SourceInfo? source,\n    PageInfo? pageData,\n    EpInfo? ep,\n  }) async {\n    final isLogin = Accounts.get(AccountType.video).isLogin;\n    final res = await VideoHttp.videoUrl(\n      avid: entry.avid,\n      bvid: entry.bvid,\n      cid: entry.cid,\n      seasonId: entry.seasonId,\n      epid: ep?.episodeId,\n      qn: entry.preferedVideoQuality,\n      tryLook: !isLogin && Pref.p1080,\n      videoType: switch (ep?.from) {\n        'pugv' => VideoType.pugv,\n        != null when isLogin => VideoType.pgc,\n        _ => VideoType.ugc,\n      },\n    );\n    if (res case Success(:final response)) {\n      final Dash? dash = response.dash;\n      if (dash != null) {\n        final List<VideoItem> videoList = dash.video!;\n        final curHighestVideoQa = videoList.first.quality.code;\n        final preferVideoQa = entry.preferedVideoQuality;\n        int targetVideoQa = curHighestVideoQa;\n        if (response.acceptQuality?.isNotEmpty == true &&\n            preferVideoQa <= curHighestVideoQa) {\n          // 如果预设的画质低于当前最高\n          targetVideoQa = response.acceptQuality!.findClosestTarget(\n            (e) => e <= preferVideoQa,\n            (a, b) => a > b ? a : b,\n          );\n        }\n\n        /// 取出符合当前画质的videoList\n        final List<VideoItem> videosList = videoList\n            .where((e) => e.quality.code == targetVideoQa)\n            .toList();\n\n        /// 优先顺序 设置中指定解码格式 -> 当前可选的首个解码格式\n        final List<FormatItem> supportFormats = response.supportFormats!;\n        // 根据画质选编码格式\n        final FormatItem targetSupportFormats = supportFormats.firstWhere(\n          (e) => e.quality == targetVideoQa,\n          orElse: () => supportFormats.first,\n        );\n        final List<String> supportDecodeFormats = targetSupportFormats.codecs!;\n\n        entry\n          ..typeTag = targetVideoQa.toString()\n          ..videoQuality = targetVideoQa\n          ..preferedVideoQuality = targetVideoQa\n          ..qualityPithyDescription =\n              targetSupportFormats.newDesc ??\n              VideoQuality.fromCode(targetVideoQa).desc;\n\n        String preferDecode = Pref.defaultDecode; // def avc\n        String preferSecondDecode = Pref.secondDecode; // def av1\n\n        // 默认从设置中取AV1\n        VideoDecodeFormatType currentDecodeFormats =\n            VideoDecodeFormatType.fromString(preferDecode);\n        VideoDecodeFormatType secondDecodeFormats =\n            VideoDecodeFormatType.fromString(preferSecondDecode);\n        // 当前视频没有对应格式返回第一个\n        int flag = 0;\n        for (final e in supportDecodeFormats) {\n          if (currentDecodeFormats.codes.any(e.startsWith)) {\n            flag = 1;\n            break;\n          } else if (secondDecodeFormats.codes.any(e.startsWith)) {\n            flag = 2;\n          }\n        }\n        if (flag == 2) {\n          currentDecodeFormats = secondDecodeFormats;\n        } else if (flag == 0) {\n          currentDecodeFormats = VideoDecodeFormatType.fromString(\n            supportDecodeFormats.first,\n          );\n        }\n\n        /// 取出符合当前解码格式的videoItem\n        final videoDash = videosList.firstWhere(\n          (e) => currentDecodeFormats.codes.any(e.codecs!.startsWith),\n          orElse: () => videosList.first,\n        );\n\n        final videoUrl = VideoUtils.getCdnUrl(videoDash.playUrls);\n\n        final Type2File videoFile = Type2File(\n          id: videoDash.id!,\n          baseUrl: videoUrl,\n          bandwidth: videoDash.bandWidth!,\n          codecid: videoDash.codecid!,\n          size: 0,\n          md5: '',\n          noRexcode: false,\n          frameRate: videoDash.frameRate ?? '',\n          width: videoDash.width!,\n          height: videoDash.height!,\n          dashDrmType: 0,\n        );\n        List<Type2File>? audioFileList;\n        final List<AudioItem>? audioDashList = dash.audio;\n        if (audioDashList != null && audioDashList.isNotEmpty) {\n          final preferAudioQa = Pref.defaultAudioQa;\n          final List<int> audioIds = audioDashList\n              .map((map) => map.id!)\n              .toList();\n          int closestNumber = audioIds.findClosestTarget(\n            (e) => e <= preferAudioQa,\n            (a, b) => a > b ? a : b,\n          );\n          if (!audioIds.contains(preferAudioQa) &&\n              audioIds.any((e) => e > preferAudioQa)) {\n            closestNumber = AudioQuality.k192.code;\n          }\n          final AudioItem audioDash = audioDashList.firstWhere(\n            (e) => e.id == closestNumber,\n            orElse: () => audioDashList.first,\n          );\n          final audioUrl = VideoUtils.getCdnUrl(\n            audioDash.playUrls,\n            isAudio: true,\n          );\n          audioFileList = [\n            Type2File(\n              id: audioDash.id!,\n              baseUrl: audioUrl,\n              bandwidth: audioDash.bandWidth!,\n              codecid: audioDash.codecid!,\n              size: 0,\n              md5: '',\n              noRexcode: false,\n              frameRate: audioDash.frameRate!,\n              width: audioDash.width!,\n              height: audioDash.height!,\n              dashDrmType: 0,\n            ),\n          ];\n          entry.hasDashAudio = true;\n        }\n        return Type2(\n          duration: dash.duration!,\n          video: [videoFile],\n          audio: audioFileList,\n          referer: referer,\n          userAgent: userAgent,\n        );\n      } else {\n        final first = response.durl!.first;\n        final List<Type1Segment> segmentList = [\n          Type1Segment(\n            backupUrls: [],\n            bytes: first.size!,\n            duration: first.length!,\n            md5: '',\n            metaUrl: '',\n            order: first.order!,\n            url: VideoUtils.getCdnUrl(first.playUrls),\n          ),\n        ];\n        final FormatItem? formatItem = response.supportFormats\n            ?.firstWhereOrNull((e) => e.quality == response.quality);\n        final String description =\n            formatItem?.newDesc ?? VideoQuality.clear480.desc;\n        final int targetVideoQa =\n            formatItem?.quality ?? VideoQuality.clear480.code;\n\n        entry\n          ..mediaType = 1\n          ..typeTag = targetVideoQa.toString()\n          ..videoQuality = targetVideoQa\n          ..preferedVideoQuality = targetVideoQa\n          ..qualityPithyDescription = description;\n\n        final List<Type1PlayerCodecConfig> playerCodecConfigList = [\n          Type1PlayerCodecConfig(\n            player: \"IJK_PLAYER\",\n            useIjkMediaCodec: false,\n          ),\n          Type1PlayerCodecConfig(\n            player: \"ANDROID_PLAYER\",\n            useIjkMediaCodec: false,\n          ),\n        ];\n\n        return Type1(\n          from: pageData?.from ?? ep?.from,\n          quality: entry.preferedVideoQuality,\n          typeTag: entry.typeTag,\n          description: description,\n          playerCodecConfigList: playerCodecConfigList,\n          segmentList: segmentList,\n          parseTimestampMilli: 0,\n          availablePeriodMilli: 0,\n          isDownloaded: false,\n          isResolved: true,\n          timeLength: 0,\n          marlinToken: '',\n          videoCodecId: 0,\n          videoProject: true,\n          format: response.format!,\n          playerError: 0,\n          needVip: false,\n          needLogin: false,\n          intact: false,\n          referer: referer,\n          userAgent: userAgent,\n        );\n      }\n    } else {\n      throw res.toString();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/http/dynamics.dart",
    "content": "import 'dart:convert';\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/pair.dart';\nimport 'package:PiliPlus/http/api.dart';\nimport 'package:PiliPlus/http/constants.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/reply.dart';\nimport 'package:PiliPlus/models/common/dynamic/dynamics_type.dart';\nimport 'package:PiliPlus/models/common/reply/reply_option_type.dart';\nimport 'package:PiliPlus/models/dynamics/result.dart';\nimport 'package:PiliPlus/models/dynamics/up.dart';\nimport 'package:PiliPlus/models/dynamics/vote_model.dart';\nimport 'package:PiliPlus/models_new/article/article_info/data.dart';\nimport 'package:PiliPlus/models_new/article/article_list/data.dart';\nimport 'package:PiliPlus/models_new/article/article_view/data.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_mention/data.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_mention/group.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_reserve/data.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_reserve_info/data.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_topic_feed/topic_card_list.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_topic_top/top_details.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_topic_top/topic_item.dart';\nimport 'package:PiliPlus/models_new/followee_votes/vote.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:PiliPlus/utils/wbi_sign.dart';\nimport 'package:dio/dio.dart';\n\nabstract final class DynamicsHttp {\n  @pragma('vm:notify-debugger-on-exception')\n  static Future<LoadingState<DynamicsDataModel>> followDynamic({\n    DynamicsTabType type = DynamicsTabType.all,\n    String? offset,\n    int? mid,\n    Set<int>? tempBannedList,\n  }) async {\n    Map<String, dynamic> data = {\n      if (type == DynamicsTabType.up)\n        'host_mid': mid\n      else ...{\n        'type': type.name,\n        'timezone_offset': '-480',\n      },\n      'offset': offset,\n      'features': Constants.dynFeatures,\n    };\n    final res = await Request().get(Api.followDynamic, queryParameters: data);\n    final code = res.data['code'];\n    if (code == 0) {\n      try {\n        DynamicsDataModel data = DynamicsDataModel.fromJson(\n          res.data['data'],\n          type: type,\n          tempBannedList: tempBannedList,\n        );\n        if (data.loadNext == true) {\n          return followDynamic(\n            type: type,\n            offset: data.offset,\n            mid: mid,\n            tempBannedList: tempBannedList,\n          );\n        }\n        return Success(data);\n      } catch (e, s) {\n        return Error('$e\\n\\n$s');\n      }\n    } else {\n      return Error(code == 4101132 ? '没有数据' : res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<FollowUpModel>> followUp() async {\n    final res = await Request().get(\n      Api.followUp,\n      queryParameters: {\n        'up_list_more': 1,\n        'web_location': 333.1365,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(FollowUpModel.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<DynUpList>> dynUpList(String? offset) async {\n    final res = await Request().get(\n      Api.dynUplist,\n      queryParameters: {\n        'offset': offset,\n        'platform': 'web',\n        'web_location': 333.1365,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(DynUpList.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 动态点赞\n  // static Future likeDynamic({\n  //   required String? dynamicId,\n  //   required int? up,\n  // }) async {\n  //   final res = await Request().post(\n  //     Api.likeDynamic,\n  //     queryParameters: {\n  //       'dynamic_id': dynamicId,\n  //       'up': up,\n  //       'csrf': Accounts.main.csrf,\n  //     },\n  //   );\n  //   if (res.data['code'] == 0) {\n  //     return {\n  //       'status': true,\n  //       'data': res.data['data'],\n  //     };\n  //   } else {\n  //     return {'status': false, 'msg': res.data['message']};\n  //   }\n  // }\n\n  // 动态点赞\n  static Future<LoadingState<void>> thumbDynamic({\n    required String? dynamicId,\n    required int? up,\n  }) async {\n    final res = await Request().post(\n      Api.thumbDynamic,\n      queryParameters: {\n        'csrf': Accounts.main.csrf,\n      },\n      data: {\n        'dyn_id_str': dynamicId,\n        'up': up,\n        'spmid': '333.1365.0.0',\n      },\n      options: Options(\n        headers: {\n          'referer': HttpString.dynamicShareBaseUrl,\n        },\n      ),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<Map?>> createDynamic({\n    dynamic mid,\n    dynamic dynIdStr, // repost dyn\n    dynamic rid, // repost video\n    dynamic dynType,\n    dynamic rawText,\n    List? pics,\n    int? publishTime,\n    ReplyOptionType? replyOption,\n    int? privatePub,\n    List<Map<String, dynamic>>? extraContent,\n    Pair<int, String>? topic,\n    String? title,\n    Map? attachCard,\n  }) async {\n    final res = await Request().post(\n      Api.createDynamic,\n      queryParameters: {\n        'platform': 'web',\n        'csrf': Accounts.main.csrf,\n        'x-bili-device-req-json': '{\"platform\": \"web\", \"device\": \"pc\"}',\n        'x-bili-web-req-json': '{\"spm_id\": \"333.999\"}',\n      },\n      data: {\n        \"dyn_req\": {\n          \"content\": {\n            \"contents\": [\n              if (rawText != null)\n                {\n                  \"raw_text\": rawText,\n                  \"type\": 1,\n                  \"biz_id\": \"\",\n                },\n              ...?extraContent,\n            ],\n            if (title != null && title.isNotEmpty) 'title': title,\n          },\n          if (privatePub != null || replyOption != null || publishTime != null)\n            \"option\": {\n              'private_pub': ?privatePub,\n              \"timer_pub_time\": ?publishTime,\n              if (replyOption == ReplyOptionType.close)\n                \"close_comment\": 1\n              else if (replyOption == ReplyOptionType.choose)\n                \"up_choose_comment\": 1,\n            },\n          \"scene\": rid != null\n              ? 5\n              : dynIdStr != null\n              ? 4\n              : pics != null\n              ? 2\n              : 1,\n          'pics': ?pics,\n          \"attach_card\": attachCard,\n          \"upload_id\":\n              \"${rid != null ? 0 : mid}_${DateTime.now().millisecondsSinceEpoch ~/ 1000}_${Utils.random.nextInt(9000) + 1000}\",\n          \"meta\": {\n            \"app_meta\": {\"from\": \"create.dynamic.web\", \"mobi_app\": \"web\"},\n          },\n          if (topic != null)\n            \"topic\": {\n              \"id\": topic.first,\n              \"name\": topic.second,\n              \"from_source\": \"dyn.web.list\",\n              \"from_topic_id\": 0,\n            },\n        },\n        if (dynIdStr != null || rid != null)\n          \"web_repost_src\": {\n            \"dyn_id_str\": ?dynIdStr,\n            if (rid != null)\n              \"revs_id\": {\n                \"dyn_type\": dynType,\n                \"rid\": rid,\n              },\n          },\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(res.data['data']);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  //\n  @pragma('vm:notify-debugger-on-exception')\n  static Future<LoadingState<DynamicItemModel>> dynamicDetail({\n    dynamic id,\n    dynamic rid,\n    dynamic type,\n    bool clearCookie = false,\n  }) async {\n    final res = await Request().get(\n      Api.dynamicDetail,\n      queryParameters: {\n        'timezone_offset': -480,\n        'id': ?id,\n        'rid': ?rid,\n        'type': ?type,\n        'features': Constants.dynFeatures,\n        'gaia_source': 'Athena',\n        'web_location': '333.1330',\n        'x-bili-device-req-json':\n            '{\"platform\":\"web\",\"device\":\"pc\",\"spmid\":\"333.1330\"}',\n        if (!clearCookie && Accounts.main.isLogin) 'csrf': Accounts.main.csrf,\n      },\n      options: clearCookie ? ReplyHttp.options : null,\n    );\n    if (res.data['code'] == 0) {\n      try {\n        return Success(DynamicItemModel.fromJson(res.data['data']['item']));\n      } catch (e, s) {\n        return Error('$e\\n\\n$s');\n      }\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> setTop({\n    required Object dynamicId,\n  }) async {\n    final res = await Request().post(\n      Api.setTopDyn,\n      queryParameters: {\n        'csrf': Accounts.main.csrf,\n      },\n      data: {\n        'dyn_str': dynamicId,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> rmTop({\n    required Object dynamicId,\n  }) async {\n    final res = await Request().post(\n      Api.rmTopDyn,\n      queryParameters: {\n        'csrf': Accounts.main.csrf,\n      },\n      data: {\n        'dyn_str': dynamicId,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<ArticleInfoData>> articleInfo({\n    required Object cvId,\n  }) async {\n    final res = await Request().get(\n      Api.articleInfo,\n      queryParameters: await WbiSign.makSign({\n        'id': cvId,\n        'mobi_app': 'pc',\n        'from': 'web',\n        'gaia_source': 'main_web',\n      }),\n    );\n    if (res.data['code'] == 0) {\n      return Success(ArticleInfoData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<ArticleViewData>> articleView({\n    required dynamic cvId,\n  }) async {\n    final res = await Request().get(\n      Api.articleView,\n      queryParameters: await WbiSign.makSign({\n        'id': cvId,\n        'gaia_source': 'main_web',\n        'web_location': '333.976',\n      }),\n    );\n    if (res.data['code'] == 0) {\n      return Success(ArticleViewData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<DynamicItemModel>> opusDetail({\n    required dynamic opusId,\n  }) async {\n    final res = await Request().get(\n      Api.opusDetail,\n      queryParameters: await WbiSign.makSign({\n        'timezone_offset': '-480',\n        'features': 'htmlNewStyle',\n        'id': opusId,\n      }),\n    );\n    if (res.data['code'] == 0) {\n      return Success(DynamicItemModel.fromOpusJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<VoteInfo>> voteInfo(dynamic voteId) async {\n    final res = await Request().get(\n      Api.voteInfo,\n      queryParameters: {'vote_id': voteId},\n    );\n    if (res.data['code'] == 0) {\n      return Success(VoteInfo.fromSeparatedJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<VoteInfo>> doVote({\n    required int voteId,\n    required List<int> votes,\n    bool anonymous = false,\n    int? dynamicId,\n  }) async {\n    final csrf = Accounts.main.csrf;\n    final data = {\n      'vote_id': voteId,\n      'votes': votes,\n      'voter_uid': Accounts.main.mid,\n      'status': anonymous ? 1 : 0,\n      'op_bit': 0,\n      'dynamic_id': dynamicId ?? 0,\n      'csrf_token': csrf,\n      'csrf': csrf,\n    };\n    final res = await Request().post(\n      Api.doVote,\n      queryParameters: {'csrf': csrf},\n      data: data,\n      options: Options(contentType: Headers.jsonContentType),\n    );\n    if (res.data['code'] == 0) {\n      return Success(VoteInfo.fromJson(res.data['data']['vote_info']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<TopDetails?>> topicTop({\n    required Object topicId,\n  }) async {\n    final res = await Request().get(\n      Api.topicTop,\n      queryParameters: {\n        'topic_id': topicId,\n        'source': 'Web',\n      },\n    );\n    if (res.data['code'] == 0) {\n      TopDetails? data = res.data['data']?['top_details'] == null\n          ? null\n          : TopDetails.fromJson(res.data['data']['top_details']);\n      return Success(data);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<TopicCardList?>> topicFeed({\n    required Object topicId,\n    required String offset,\n    required int sortBy,\n  }) async {\n    final res = await Request().get(\n      Api.topicFeed,\n      queryParameters: {\n        'topic_id': topicId,\n        'sort_by': sortBy,\n        'offset': offset,\n        'page_size': 20,\n        'source': 'Web',\n        'features': Constants.dynFeatures,\n      },\n    );\n    if (res.data['code'] == 0) {\n      TopicCardList? data = res.data['data']?['topic_card_list'] == null\n          ? null\n          : TopicCardList.fromJson(res.data['data']['topic_card_list']);\n      return Success(data);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<ArticleListData>> articleList({\n    required Object id,\n  }) async {\n    final res = await Request().get(\n      Api.articleList,\n      queryParameters: {\n        'id': id,\n        'web_location': 333.1400,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(ArticleListData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<DynReserveData>> dynReserve({\n    required Object? reserveId,\n    required Object? curBtnStatus,\n    required Object dynamicIdStr,\n    required Object? reserveTotal,\n  }) async {\n    final res = await Request().post(\n      Api.dynReserve,\n      queryParameters: {\n        'csrf': Accounts.main.csrf,\n      },\n      data: {\n        'reserve_id': ?reserveId,\n        'cur_btn_status': ?curBtnStatus,\n        'dynamic_id_str': dynamicIdStr,\n        'reserve_total': ?reserveTotal,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(DynReserveData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<List<TopicItem>?>> dynTopicRcmd({\n    int ps = 25,\n  }) async {\n    final res = await Request().get(\n      Api.dynTopicRcmd,\n      queryParameters: {\n        'source': 'Web',\n        'page_size': ps,\n        'web_location': 333.1365,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(\n        (res.data['data']?['topic_items'] as List?)\n            ?.map((e) => TopicItem.fromJson(e))\n            .toList(),\n      );\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<List<OpusPicModel>?>> dynPic(dynamic id) async {\n    final res = await Request().get(\n      Api.dynPic,\n      queryParameters: {\n        'id': id,\n        'web_location': 333.1368,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(\n        (res.data['data'] as List?)\n            ?.map((e) => OpusPicModel.fromJson(e))\n            .toList(),\n      );\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<List<MentionGroup>?>> dynMention({\n    String? keyword,\n  }) async {\n    final res = await Request().get(\n      Api.dynMention,\n      queryParameters: {\n        if (keyword != null && keyword.isNotEmpty) 'keyword': keyword,\n        'web_location': 333.1365,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(\n        DynMentionData.fromJson(res.data['data']).groups,\n      );\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<int?>> createVote(VoteInfo voteInfo) async {\n    final res = await Request().post(\n      Api.createVote,\n      queryParameters: {'csrf': Accounts.main.csrf},\n      data: {'vote_info': voteInfo.toJson()},\n    );\n    if (res.data['code'] == 0) {\n      return Success(res.data['data']?['vote_id']);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<int?>> updateVote(VoteInfo voteInfo) async {\n    final res = await Request().post(\n      Api.updateVote,\n      queryParameters: {'csrf': Accounts.main.csrf},\n      data: {'vote_info': voteInfo.toJson()},\n    );\n    if (res.data['code'] == 0) {\n      return Success(res.data['data']?['vote_id']);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<int?>> createReserve({\n    int subType = 0,\n    required String title,\n    required int livePlanStartTime,\n  }) async {\n    final res = await Request().post(\n      Api.createReserve,\n      data: {\n        'type': 2,\n        'sub_type': subType,\n        'from': 1,\n        'title': title,\n        'live_plan_start_time': livePlanStartTime,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return Success(res.data['data']?['sid']);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<int?>> updateReserve({\n    int subType = 0,\n    required String title,\n    required int livePlanStartTime,\n    required int sid,\n  }) async {\n    final res = await Request().post(\n      Api.updateReserve,\n      data: {\n        'type': 2,\n        'sub_type': subType,\n        'from': 1,\n        'title': title,\n        'live_plan_start_time': livePlanStartTime,\n        'id': sid,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return Success(res.data['data']?['sid']);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<ReserveInfoData>> reserveInfo({\n    required dynamic sid,\n  }) async {\n    final res = await Request().get(\n      Api.reserveInfo,\n      queryParameters: {\n        'from': 1,\n        'id': sid,\n        'web_location': 333.1365,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(ReserveInfoData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<List<FolloweeVote>?>> followeeVotes({\n    required dynamic voteId,\n  }) async {\n    final res = await Request().get(\n      Api.followeeVotes,\n      queryParameters: {\n        'vote_id': voteId,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(\n        (res.data['data']?['votes'] as List?)\n            ?.map((e) => FolloweeVote.fromJson(e))\n            .toList(),\n      );\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> dynPrivatePubSetting({\n    required Object dynId,\n    int? dynType,\n    required String action,\n  }) async {\n    final res = await Request().post(\n      Api.dynPrivatePubSetting,\n      queryParameters: {\n        'platform': 'web',\n        'csrf': Accounts.main.csrf,\n      },\n      data: {\n        \"object_id\": jsonEncode({\n          \"dyn_id\": dynId.toString(),\n          \"dyn_type\": ?dynType,\n        }),\n        \"action\": action,\n      },\n      options: Options(contentType: Headers.jsonContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> editDyn({\n    required Object dynId,\n    Object? repostDynId,\n    dynamic rawText,\n    List? pics,\n    ReplyOptionType? replyOption,\n    int? privatePub,\n    List<Map<String, dynamic>>? extraContent,\n    Pair<int, String>? topic,\n    String? title,\n    Map? attachCard,\n  }) async {\n    final uploadId =\n        \"${Accounts.main.mid}_${DateTime.now().millisecondsSinceEpoch ~/ 1000}_${Utils.random.nextInt(9000) + 1000}\";\n    final res = await Request().post(\n      Api.editDyn,\n      queryParameters: await WbiSign.makSign({\n        'platform': 'web',\n        'csrf': Accounts.main.csrf,\n        'x-bili-device-req-json':\n            '{\"platform\":\"web\",\"device\":\"pc\",\"spmid\":\"333.1368\"}',\n        'w_dyn_req.upload_id': uploadId,\n        'w_dyn_req.meta':\n            '{\"app_meta\":{\"from\":\"create.dynamic.web\",\"mobi_app\":\"web\"}}',\n      }),\n      data: {\n        \"dyn_req\": {\n          \"content\": {\n            \"contents\": [\n              if (rawText != null)\n                {\n                  \"raw_text\": rawText,\n                  \"type\": 1,\n                  \"biz_id\": \"\",\n                },\n              ...?extraContent,\n            ],\n            if (title != null && title.isNotEmpty) 'title': title,\n          },\n          if (privatePub != null || replyOption != null)\n            \"option\": {\n              'private_pub': ?privatePub,\n              if (replyOption == ReplyOptionType.close)\n                \"close_comment\": 1\n              else if (replyOption == ReplyOptionType.choose)\n                \"up_choose_comment\": 1,\n            },\n          \"scene\": repostDynId != null\n              ? 4\n              : pics != null\n              ? 2\n              : 1,\n          'pics': ?pics,\n          \"attach_card\": attachCard,\n          \"upload_id\": uploadId,\n          \"meta\": {\n            \"app_meta\": {\"from\": \"create.dynamic.web\", \"mobi_app\": \"web\"},\n          },\n          if (topic != null)\n            \"topic\": {\n              \"id\": topic.first,\n              \"name\": topic.second,\n              \"from_source\": \"dyn.web.list\",\n              \"from_topic_id\": 0,\n            },\n        },\n        \"dyn_id_str\": dynId.toString(),\n        if (repostDynId != null)\n          \"web_repost_src\": {\"dyn_id_str\": repostDynId.toString()},\n      },\n      options: Options(contentType: Headers.jsonContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/http/fan.dart",
    "content": "import 'package:PiliPlus/http/api.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/follow/data.dart';\n\nabstract final class FanHttp {\n  static Future<LoadingState<FollowData>> fans({\n    int? vmid,\n    int? pn,\n    int ps = 20,\n    String? orderType,\n  }) async {\n    final res = await Request().get(\n      Api.fans,\n      queryParameters: {\n        'vmid': vmid,\n        'pn': pn,\n        'ps': ps,\n        'order': 'desc',\n        'order_type': orderType,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(FollowData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/http/fav.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/http/api.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/fav_order_type.dart';\nimport 'package:PiliPlus/models_new/fav/fav_article/data.dart';\nimport 'package:PiliPlus/models_new/fav/fav_detail/data.dart';\nimport 'package:PiliPlus/models_new/fav/fav_folder/data.dart';\nimport 'package:PiliPlus/models_new/fav/fav_folder/list.dart';\nimport 'package:PiliPlus/models_new/fav/fav_note/list.dart';\nimport 'package:PiliPlus/models_new/fav/fav_pgc/data.dart';\nimport 'package:PiliPlus/models_new/fav/fav_topic/data.dart';\nimport 'package:PiliPlus/models_new/space/space_cheese/data.dart';\nimport 'package:PiliPlus/models_new/space/space_fav/data.dart';\nimport 'package:PiliPlus/models_new/sub/sub_detail/data.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/app_sign.dart';\nimport 'package:dio/dio.dart';\n\nabstract final class FavHttp {\n  static Future<LoadingState<void>> favFavFolder(Object mediaId) async {\n    final res = await Request().post(\n      Api.favFavFolder,\n      data: {\n        'media_id': mediaId,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> unfavFavFolder(Object mediaId) async {\n    final res = await Request().post(\n      Api.unfavFavFolder,\n      data: {\n        'media_id': mediaId,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<FavDetailData>> userFavFolderDetail({\n    required int mediaId,\n    required int pn,\n    required int ps,\n    String keyword = '',\n    FavOrderType order = FavOrderType.mtime,\n    int type = 0,\n  }) async {\n    final res = await Request().get(\n      Api.favResourceList,\n      queryParameters: {\n        'media_id': mediaId,\n        'pn': pn,\n        'ps': ps,\n        'keyword': keyword,\n        'order': order.name,\n        'type': type,\n        'tid': 0,\n        'platform': 'web',\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(FavDetailData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 取消订阅\n  static Future<LoadingState<void>> cancelSub({\n    required int id,\n    required int type,\n  }) async {\n    final res = type == 11\n        ? await Request().post(\n            Api.unfavFolder,\n            data: {\n              'media_id': id,\n              'csrf': Accounts.main.csrf,\n            },\n            options: Options(contentType: Headers.formUrlEncodedContentType),\n          )\n        : await Request().post(\n            Api.unfavSeason,\n            data: {\n              'platform': 'web',\n              'season_id': id,\n              'csrf': Accounts.main.csrf,\n            },\n            options: Options(contentType: Headers.formUrlEncodedContentType),\n          );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<SubDetailData>> favSeasonList({\n    required int id,\n    required int pn,\n    required int ps,\n  }) async {\n    final res = await Request().get(\n      Api.favSeasonList,\n      queryParameters: {\n        'season_id': id,\n        'ps': ps,\n        'pn': pn,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(SubDetailData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<SpaceCheeseData>> favPugv({\n    required int mid,\n    required int page,\n  }) async {\n    final res = await Request().get(\n      Api.favPugv,\n      queryParameters: {\n        'mid': mid,\n        'ps': 20,\n        'pn': page,\n        'web_location': 333.1387,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(SpaceCheeseData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> addFavPugv(Object seasonId) async {\n    final res = await Request().post(\n      Api.addFavPugv,\n      data: {\n        'season_id': seasonId,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> delFavPugv(Object seasonId) async {\n    final res = await Request().post(\n      Api.delFavPugv,\n      data: {\n        'season_id': seasonId,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<FavTopicData>> favTopic({\n    required int page,\n  }) async {\n    final res = await Request().get(\n      Api.favTopicList,\n      queryParameters: {\n        'page_size': 24,\n        'page_num': page,\n        'web_location': 333.1387,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(FavTopicData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> addFavTopic(Object topicId) async {\n    final res = await Request().post(\n      Api.addFavTopic,\n      data: {\n        'topic_id': topicId,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> delFavTopic(Object topicId) async {\n    final res = await Request().post(\n      Api.delFavTopic,\n      data: {\n        'topic_id': topicId,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> likeTopic(\n    Object topicId,\n    bool isLike,\n  ) async {\n    final res = await Request().post(\n      Api.likeTopic,\n      data: {\n        'action': isLike ? 'cancel_like' : 'like',\n        'up_mid': Accounts.main.mid,\n        'topic_id': topicId,\n        'csrf': Accounts.main.csrf,\n        'business': 'topic',\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<FavArticleData>> favArticle({\n    required int page,\n  }) async {\n    final res = await Request().get(\n      Api.favArticle,\n      queryParameters: {\n        'page_size': 20,\n        'page': page,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(FavArticleData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> addFavArticle({\n    required Object id,\n  }) async {\n    final res = await Request().post(\n      Api.addFavArticle,\n      data: {\n        'id': id,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(\n        contentType: Headers.formUrlEncodedContentType,\n      ),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> delFavArticle({\n    required Object id,\n  }) async {\n    final res = await Request().post(\n      Api.delFavArticle,\n      data: {\n        'id': id,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(\n        contentType: Headers.formUrlEncodedContentType,\n      ),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<List<FavNoteItemModel>?>> userNoteList({\n    required int page,\n  }) async {\n    final res = await Request().get(\n      Api.userNoteList,\n      queryParameters: {\n        'pn': page,\n        'ps': 10,\n        'csrf': Accounts.main.csrf,\n      },\n    );\n    if (res.data['code'] == 0) {\n      List<FavNoteItemModel>? list = (res.data['data']?['list'] as List?)\n          ?.map((e) => FavNoteItemModel.fromJson(e))\n          .toList();\n      return Success(list);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<List<FavNoteItemModel>?>> noteList({\n    required int page,\n  }) async {\n    final res = await Request().get(\n      Api.noteList,\n      queryParameters: {\n        'pn': page,\n        'ps': 10,\n        'csrf': Accounts.main.csrf,\n      },\n    );\n    if (res.data['code'] == 0) {\n      List<FavNoteItemModel>? list = (res.data['data']?['list'] as List?)\n          ?.map((e) => FavNoteItemModel.fromJson(e))\n          .toList();\n      return Success(list);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> delNote({\n    required bool isPublish,\n    required String noteIds,\n  }) async {\n    final res = await Request().post(\n      isPublish ? Api.delPublishNote : Api.delNote,\n      data: {\n        isPublish ? 'cvids' : 'note_ids': noteIds,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(\n        contentType: Headers.formUrlEncodedContentType,\n      ),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<FavPgcData>> favPgc({\n    required int type,\n    required int pn,\n    int? followStatus,\n    Object? mid,\n  }) async {\n    final res = await Request().get(\n      Api.favPgc,\n      queryParameters: {\n        'vmid': mid ?? Accounts.main.mid,\n        'type': type,\n        'follow_status': ?followStatus,\n        'pn': pn,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(FavPgcData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 收藏夹\n  static Future<LoadingState<FavFolderData>> userfavFolder({\n    required int pn,\n    required int ps,\n    required dynamic mid,\n  }) async {\n    final res = await Request().get(\n      Api.userFavFolder,\n      queryParameters: {\n        'pn': pn,\n        'ps': ps,\n        'up_mid': mid,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(FavFolderData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message'] ?? '账号未登录');\n    }\n  }\n\n  static Future<LoadingState<void>> sortFavFolder({\n    required String sort,\n  }) async {\n    Map<String, dynamic> data = {\n      'sort': sort,\n      'csrf': Accounts.main.csrf,\n    };\n    AppSign.appSign(data);\n    final res = await Request().post(\n      Api.sortFavFolder,\n      data: data,\n      options: Options(\n        contentType: Headers.formUrlEncodedContentType,\n      ),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> sortFav({\n    required Object mediaId,\n    required String sort,\n  }) async {\n    Map<String, dynamic> data = {\n      'media_id': mediaId,\n      'sort': sort,\n      'csrf': Accounts.main.csrf,\n    };\n    AppSign.appSign(data);\n    final res = await Request().post(\n      Api.sortFav,\n      data: data,\n      options: Options(\n        contentType: Headers.formUrlEncodedContentType,\n      ),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> cleanFav({\n    required Object mediaId,\n  }) async {\n    final res = await Request().post(\n      Api.cleanFav,\n      data: {\n        'media_id': mediaId,\n        'platform': 'web',\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(\n        contentType: Headers.formUrlEncodedContentType,\n      ),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> deleteFolder({\n    required String mediaIds,\n  }) async {\n    final res = await Request().post(\n      Api.deleteFolder,\n      data: {\n        'media_ids': mediaIds,\n        'platform': 'web',\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(\n        contentType: Headers.formUrlEncodedContentType,\n      ),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<FavFolderInfo>> addOrEditFolder({\n    required bool isAdd,\n    dynamic mediaId,\n    required String title,\n    required int privacy,\n    required String cover,\n    required String intro,\n  }) async {\n    final res = await Request().post(\n      isAdd ? Api.addFolder : Api.editFolder,\n      data: {\n        'title': title,\n        'intro': intro,\n        'privacy': privacy,\n        'cover': cover.isNotEmpty ? Uri.encodeFull(cover) : cover,\n        'csrf': Accounts.main.csrf,\n        'media_id': ?mediaId,\n      },\n      options: Options(\n        contentType: Headers.formUrlEncodedContentType,\n      ),\n    );\n    if (res.data['code'] == 0) {\n      return Success(FavFolderInfo.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<FavFolderInfo>> favFolderInfo({\n    required Object mediaId,\n  }) async {\n    final res = await Request().get(\n      Api.favFolderInfo,\n      queryParameters: {\n        'media_id': mediaId,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(FavFolderInfo.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> seasonFav({\n    required bool isFav,\n    required dynamic seasonId,\n  }) async {\n    final res = await Request().post(\n      isFav ? Api.unfavSeason : Api.favSeason,\n      data: {\n        'platform': 'web',\n        'season_id': seasonId,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(\n        contentType: Headers.formUrlEncodedContentType,\n      ),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<List<SpaceFavData>?>> spaceFav({\n    required int mid,\n  }) async {\n    final params = {\n      'build': 8430300,\n      'version': '8.43.0',\n      'c_locale': 'zh_CN',\n      'channel': 'master',\n      'mobi_app': 'android',\n      'platform': 'android',\n      's_locale': 'zh_CN',\n      'statistics': Constants.statisticsApp,\n      'up_mid': mid,\n    };\n    final res = await Request().get(\n      Api.spaceFav,\n      queryParameters: params,\n      options: Options(\n        headers: {\n          'bili-http-engine': 'cronet',\n          'user-agent': Constants.userAgentApp,\n        },\n      ),\n    );\n    if (res.data['code'] == 0) {\n      return Success(\n        (res.data['data'] as List?)\n            ?.map((e) => SpaceFavData.fromJson(e))\n            .toList(),\n      );\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> communityAction({\n    required Object opusId,\n    required Object action,\n  }) async {\n    final res = await Request().post(\n      Api.communityAction,\n      queryParameters: {\n        'csrf': Accounts.main.csrf,\n      },\n      data: {\n        \"entity\": {\n          \"object_id_str\": opusId,\n          \"type\": {\"biz\": 2},\n        },\n        \"action\": action, // 3 fav, 4 unfav\n      },\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // （取消）收藏\n  static Future<LoadingState<void>> favVideo({\n    required String resources,\n    String? addIds,\n    String? delIds,\n  }) async {\n    final res = await Request().post(\n      Api.favVideo,\n      data: {\n        'resources': resources,\n        'add_media_ids': addIds ?? '',\n        'del_media_ids': delIds ?? '',\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // （取消）收藏\n  static Future<LoadingState<void>> unfavAll({\n    required Object rid,\n    required Object type,\n  }) async {\n    final res = await Request().post(\n      Api.unfavAll,\n      data: {\n        'rid': rid,\n        'type': type,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> copyOrMoveFav({\n    required bool isCopy,\n    required bool isFav,\n    required dynamic srcMediaId,\n    required dynamic tarMediaId,\n    dynamic mid,\n    required String resources,\n  }) async {\n    final res = await Request().post(\n      isFav\n          ? isCopy\n                ? Api.copyFav\n                : Api.moveFav\n          : isCopy\n          ? Api.copyToview\n          : Api.moveToview,\n      data: {\n        'src_media_id': ?srcMediaId,\n        'tar_media_id': tarMediaId,\n        'mid': ?mid,\n        'resources': resources,\n        'platform': 'web',\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<FavFolderData>> allFavFolders(Object mid) async {\n    final res = await Request().get(\n      Api.favFolder,\n      queryParameters: {'up_mid': mid},\n    );\n    if (res.data['code'] == 0) {\n      return Success(FavFolderData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 查看视频被收藏在哪个文件夹\n  static Future<LoadingState<FavFolderData>> videoInFolder({\n    dynamic mid,\n    dynamic rid,\n    dynamic type,\n  }) async {\n    final res = await Request().get(\n      Api.favFolder,\n      queryParameters: {\n        'up_mid': mid,\n        'rid': rid,\n        'type': ?type,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(FavFolderData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/http/follow.dart",
    "content": "import 'package:PiliPlus/http/api.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/follow/data.dart';\n\nabstract final class FollowHttp {\n  static Future<LoadingState<FollowData>> followings({\n    int? vmid,\n    int? pn,\n    int ps = 20,\n    String orderType = '', // ''=>最近关注，'attention'=>最常访问\n  }) async {\n    final res = await Request().get(\n      Api.followings,\n      queryParameters: {\n        'vmid': vmid,\n        'pn': pn,\n        'ps': ps,\n        'order': 'desc',\n        'order_type': orderType,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(FollowData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/http/init.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\nimport 'dart:io';\n\nimport 'package:PiliPlus/http/api.dart';\nimport 'package:PiliPlus/http/constants.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/retry_interceptor.dart';\nimport 'package:PiliPlus/http/user.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/accounts/account.dart';\nimport 'package:PiliPlus/utils/accounts/account_manager/account_mgr.dart';\nimport 'package:PiliPlus/utils/global_data.dart';\nimport 'package:PiliPlus/utils/login_utils.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:archive/archive.dart';\nimport 'package:brotli/brotli.dart';\nimport 'package:dio/dio.dart';\nimport 'package:dio/io.dart';\nimport 'package:dio_http2_adapter/dio_http2_adapter.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\n\nclass Request {\n  static const _gzipDecoder = GZipDecoder();\n  static const _brotliDecoder = BrotliDecoder();\n\n  static final Request _instance = Request._internal();\n  static late AccountManager accountManager;\n  static final _enableHttp2 = Pref.enableHttp2;\n  static late final Dio dio;\n  static Dio? _http11Dio;\n  static Dio get http11Dio =>\n      _http11Dio ??= _enableHttp2 ? _cloneHttp11Dio() : dio;\n  factory Request() => _instance;\n\n  /// 设置cookie\n  static void setCookie() {\n    accountManager = AccountManager();\n    dio.interceptors.add(accountManager);\n    Accounts.refresh();\n    LoginUtils.setWebCookie();\n\n    if (Accounts.main.isLogin) {\n      final coin = Pref.userInfoCache?.money;\n      if (coin == null) {\n        setCoin();\n      } else {\n        GlobalData().coins = coin;\n      }\n    }\n  }\n\n  static Future<void> setCoin() async {\n    final res = await UserHttp.getCoin();\n    if (res case Success(:final response)) {\n      GlobalData().coins = response;\n    }\n  }\n\n  static Future<void> buvidActive(Account account) async {\n    // 这样线程不安全, 但仍按预期进行\n    if (account.activated) return;\n    account.activated = true;\n    try {\n      // final html = await Request().get(Api.dynamicSpmPrefix,\n      //     options: Options(extra: {'account': account}));\n      // final String spmPrefix = _spmPrefixExp.firstMatch(html.data)!.group(1)!;\n      final String randPngEnd = base64.encode([\n        ...Iterable<int>.generate(32, (_) => Utils.random.nextInt(256)),\n        0,\n        0,\n        0,\n        0,\n        73,\n        69,\n        78,\n        68,\n        ...Iterable<int>.generate(4, (_) => Utils.random.nextInt(256)),\n      ]);\n\n      final jsonData = json.encode({\n        '3064': 1,\n        '39c8': '333.1387.fp.risk',\n        '3c43': {\n          'adca': 'Linux',\n          'bfe9': randPngEnd.substring(randPngEnd.length - 50),\n        },\n      });\n\n      await Request().post(\n        Api.activateBuvidApi,\n        data: {'payload': jsonData},\n        options: Options(\n          extra: {'account': account},\n          contentType: Headers.jsonContentType,\n        ),\n      );\n    } catch (_) {}\n  }\n\n  static Dio _cloneHttp11Dio() {\n    final h11 = dio.clone(\n      httpClientAdapter:\n          (dio.httpClientAdapter as Http2Adapter).fallbackAdapter,\n    );\n    final interceptors = h11.interceptors;\n    for (var i = 0; i < interceptors.length; i++) {\n      final elem = interceptors[i];\n      if (elem is RetryInterceptor) {\n        interceptors[i] = elem.copyWith(client: h11);\n        break;\n      }\n    }\n    return h11;\n  }\n\n  /*\n   * config it and create\n   */\n  Request._internal() {\n    //BaseOptions、Options、RequestOptions 都可以配置参数，优先级别依次递增，且可以根据优先级别覆盖参数\n    BaseOptions options = BaseOptions(\n      //请求基地址,可以包含子路径\n      baseUrl: HttpString.apiBaseUrl,\n      //连接服务器超时时间，单位是毫秒.\n      connectTimeout: const Duration(milliseconds: 10000),\n      //响应流上前后两次接受到数据的间隔，单位为毫秒。\n      receiveTimeout: const Duration(milliseconds: 10000),\n      //Http请求头.\n      headers: {\n        'user-agent': 'Dart/3.6 (dart:io)', // Http2Adapter不会自动添加标头\n        if (!_enableHttp2) 'connection': 'keep-alive',\n        'accept-encoding': 'br,gzip',\n      },\n      responseDecoder: _responseDecoder, // Http2Adapter没有自动解压\n      persistentConnection: true,\n    );\n\n    final bool enableSystemProxy;\n    late final String systemProxyHost;\n    late final int? systemProxyPort;\n    if (Pref.enableSystemProxy) {\n      systemProxyHost = Pref.systemProxyHost;\n      systemProxyPort = int.tryParse(Pref.systemProxyPort);\n      enableSystemProxy = systemProxyPort != null && systemProxyHost.isNotEmpty;\n    } else {\n      enableSystemProxy = false;\n    }\n\n    final http11Adapter = IOHttpClientAdapter(\n      createHttpClient: enableSystemProxy\n          ? () => HttpClient()\n              ..idleTimeout = const Duration(seconds: 15)\n              ..autoUncompress = false\n              ..findProxy = ((_) => 'PROXY $systemProxyHost:$systemProxyPort')\n              ..badCertificateCallback = (cert, host, port) => true\n          : () => HttpClient()\n              ..idleTimeout = const Duration(seconds: 15)\n              ..autoUncompress = false, // Http2Adapter没有自动解压, 统一行为\n    );\n\n    dio = Dio(options)\n      ..httpClientAdapter = _enableHttp2\n          ? Http2Adapter(\n              ConnectionManager(\n                idleTimeout: const Duration(seconds: 15),\n                onClientCreate: enableSystemProxy\n                    ? (_, config) {\n                        config\n                          ..proxy = Uri(\n                            scheme: 'http',\n                            host: systemProxyHost,\n                            port: systemProxyPort,\n                          )\n                          ..onBadCertificate = (_) => true;\n                      }\n                    : Pref.badCertificateCallback\n                    ? (_, config) {\n                        config.onBadCertificate = (_) => true;\n                      }\n                    : null,\n              ),\n              fallbackAdapter: http11Adapter,\n            )\n          : http11Adapter;\n\n    // 先于其他Interceptor\n    if (Pref.retryCount != 0) {\n      dio.interceptors.add(\n        RetryInterceptor(dio, Pref.retryCount, Pref.retryDelay),\n      );\n    }\n\n    // 日志拦截器 输出请求、响应内容\n    if (kDebugMode) {\n      dio.interceptors.add(\n        LogInterceptor(\n          request: false,\n          requestHeader: false,\n          responseHeader: false,\n        ),\n      );\n    }\n\n    dio\n      ..transformer = BackgroundTransformer()\n      ..options.validateStatus = (int? status) {\n        return status != null && status >= 200 && status < 300;\n      };\n  }\n\n  /*\n   * get请求\n   */\n  Future<Response> get<T>(\n    String url, {\n    Map<String, dynamic>? queryParameters,\n    Options? options,\n    CancelToken? cancelToken,\n  }) async {\n    try {\n      return await dio.get<T>(\n        url,\n        queryParameters: queryParameters,\n        options: options,\n        cancelToken: cancelToken,\n      );\n    } on DioException catch (e) {\n      return Response(\n        data: {\n          'message': await AccountManager.dioError(e),\n        }, // 将自定义 Map 数据赋值给 Response 的 data 属性\n        statusCode: e.response?.statusCode ?? -1,\n        requestOptions: e.requestOptions,\n      );\n    }\n  }\n\n  /*\n   * post请求\n   */\n  Future<Response> post<T>(\n    String url, {\n    Object? data,\n    Map<String, dynamic>? queryParameters,\n    Options? options,\n    CancelToken? cancelToken,\n  }) async {\n    // if (kDebugMode) debugPrint('post-data: $data');\n    try {\n      return await dio.post<T>(\n        url,\n        data: data,\n        queryParameters: queryParameters,\n        options: options,\n        cancelToken: cancelToken,\n      );\n    } on DioException catch (e) {\n      AccountManager.toast(e);\n      return Response(\n        data: {\n          'message': await AccountManager.dioError(e),\n        }, // 将自定义 Map 数据赋值给 Response 的 data 属性\n        statusCode: e.response?.statusCode ?? -1,\n        requestOptions: e.requestOptions,\n      );\n    }\n  }\n\n  /*\n   * 下载文件\n   */\n  Future<Response> downloadFile(\n    String urlPath,\n    String savePath, {\n    CancelToken? cancelToken,\n  }) async {\n    try {\n      return await dio.download(\n        urlPath,\n        savePath,\n        cancelToken: cancelToken,\n        // onReceiveProgress: (int count, int total) {\n        // 进度\n        // if (kDebugMode) debugPrint(\"$count $total\");\n        // },\n      );\n      // if (kDebugMode) debugPrint('downloadFile success: ${response.data}');\n    } on DioException catch (e) {\n      // if (kDebugMode) debugPrint('downloadFile error: $e');\n      return Response(\n        data: {\n          'message': await AccountManager.dioError(e),\n        },\n        statusCode: e.response?.statusCode ?? -1,\n        requestOptions: e.requestOptions,\n      );\n    }\n  }\n\n  static List<int> responseBytesDecoder(\n    List<int> responseBytes,\n    Map<String, List<String>> headers,\n  ) => switch (headers['content-encoding']?.firstOrNull) {\n    'gzip' => _gzipDecoder.decodeBytes(responseBytes),\n    'br' => _brotliDecoder.convert(responseBytes),\n    _ => responseBytes,\n  };\n\n  static String _responseDecoder(\n    List<int> responseBytes,\n    RequestOptions options,\n    ResponseBody responseBody,\n  ) => utf8.decode(\n    responseBytesDecoder(responseBytes, responseBody.headers),\n    allowMalformed: true,\n  );\n}\n"
  },
  {
    "path": "lib/http/live.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/http/api.dart';\nimport 'package:PiliPlus/http/browser_ua.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/login.dart';\nimport 'package:PiliPlus/models/common/account_type.dart';\nimport 'package:PiliPlus/models/common/live/live_contribution_rank_type.dart';\nimport 'package:PiliPlus/models/common/live/live_search_type.dart';\nimport 'package:PiliPlus/models_new/live/live_area_list/area_item.dart';\nimport 'package:PiliPlus/models_new/live/live_area_list/area_list.dart';\nimport 'package:PiliPlus/models_new/live/live_contribution_rank/data.dart';\nimport 'package:PiliPlus/models_new/live/live_danmaku/danmaku_msg.dart';\nimport 'package:PiliPlus/models_new/live/live_dm_block/data.dart';\nimport 'package:PiliPlus/models_new/live/live_dm_block/shield_info.dart';\nimport 'package:PiliPlus/models_new/live/live_dm_block/shield_user_list.dart';\nimport 'package:PiliPlus/models_new/live/live_dm_info/data.dart';\nimport 'package:PiliPlus/models_new/live/live_emote/data.dart';\nimport 'package:PiliPlus/models_new/live/live_emote/datum.dart';\nimport 'package:PiliPlus/models_new/live/live_feed_index/data.dart';\nimport 'package:PiliPlus/models_new/live/live_follow/data.dart';\nimport 'package:PiliPlus/models_new/live/live_room_info_h5/data.dart';\nimport 'package:PiliPlus/models_new/live/live_room_play_info/data.dart';\nimport 'package:PiliPlus/models_new/live/live_search/data.dart';\nimport 'package:PiliPlus/models_new/live/live_second_list/data.dart';\nimport 'package:PiliPlus/models_new/live/live_superchat/data.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/accounts/account.dart';\nimport 'package:PiliPlus/utils/app_sign.dart';\nimport 'package:PiliPlus/utils/wbi_sign.dart';\nimport 'package:dio/dio.dart';\n\nabstract final class LiveHttp {\n  static Account get recommend => Accounts.get(AccountType.recommend);\n\n  static Future<LoadingState<void>> sendLiveMsg({\n    required Object roomId,\n    required Object msg,\n    Object? dmType,\n    Object? emoticonOptions,\n    int replyMid = 0,\n    String replayDmid = '',\n  }) async {\n    String csrf = Accounts.main.csrf;\n    final res = await Request().post(\n      Api.sendLiveMsg,\n      queryParameters: await WbiSign.makSign({\n        'web_location': 444.8,\n      }),\n      data: FormData.fromMap({\n        'bubble': 0,\n        'msg': msg,\n        'color': 16777215,\n        'mode': 1,\n        'dm_type': ?dmType,\n        if (emoticonOptions != null)\n          'emoticonOptions': emoticonOptions\n        else ...{\n          'room_type': 0,\n          'jumpfrom': 0,\n          'reply_mid': replyMid,\n          'reply_attr': 0,\n          'replay_dmid': replayDmid,\n          'statistics': '{\"appId\":100,\"platform\":5}',\n          'reply_type': 0,\n          'reply_uname': '',\n        },\n        'fontsize': 25,\n        'rnd': DateTime.now().millisecondsSinceEpoch ~/ 1000,\n        'roomid': roomId,\n        'csrf': csrf,\n        'csrf_token': csrf,\n      }),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<RoomPlayInfoData>> liveRoomInfo({\n    required Object roomId,\n    Object? qn,\n    bool onlyAudio = false,\n  }) async {\n    final res = await Request().get(\n      Api.liveRoomInfo,\n      queryParameters: await WbiSign.makSign({\n        'room_id': roomId,\n        'protocol': '0,1',\n        'format': '0,1,2',\n        'codec': '0,1,2',\n        'qn': ?qn,\n        'platform': 'web',\n        'ptype': 8,\n        'dolby': 5,\n        'panorama': 1,\n        if (onlyAudio) 'only_audio': 1,\n        'web_location': 444.8,\n      }),\n    );\n    if (res.data['code'] == 0) {\n      return Success(RoomPlayInfoData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<RoomInfoH5Data>> liveRoomInfoH5({\n    required Object roomId,\n  }) async {\n    final res = await Request().get(\n      Api.liveRoomInfoH5,\n      queryParameters: {\n        'room_id': roomId,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(RoomInfoH5Data.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<List<DanmakuMsg>?>> liveRoomDmPrefetch({\n    required Object roomId,\n  }) async {\n    final res = await Request().get(\n      Api.liveRoomDmPrefetch,\n      queryParameters: {'roomid': roomId},\n      options: Options(\n        headers: {\n          'referer': 'https://live.bilibili.com/$roomId',\n          'user-agent': BrowserUa.pc,\n        },\n      ),\n    );\n    if (res.data['code'] == 0) {\n      try {\n        return Success(\n          (res.data['data']?['room'] as List?)\n              ?.map((e) => DanmakuMsg.fromPrefetch(e))\n              .toList(),\n        );\n      } catch (e) {\n        return Error(e.toString());\n      }\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<LiveDmInfoData>> liveRoomGetDanmakuToken({\n    required Object roomId,\n  }) async {\n    final res = await Request().get(\n      Api.liveRoomDmToken,\n      queryParameters: await WbiSign.makSign({\n        'id': roomId,\n        'web_location': 444.8,\n      }),\n    );\n    if (res.data['code'] == 0) {\n      return Success(LiveDmInfoData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<List<LiveEmoteDatum>?>> getLiveEmoticons({\n    required int roomId,\n  }) async {\n    final res = await Request().get(\n      Api.getLiveEmoticons,\n      queryParameters: {\n        'platform': 'pc',\n        'room_id': roomId,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(LiveEmoteData.fromJson(res.data['data']).data);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<LiveIndexData>> liveFeedIndex({\n    required int pn,\n    bool moduleSelect = false,\n  }) async {\n    final params = {\n      'access_key': ?recommend.accessKey,\n      'channel': 'master',\n      'actionKey': 'appkey',\n      'build': 8430300,\n      'version': '8.43.0',\n      'c_locale': 'zh_CN',\n      'device': 'android',\n      'device_name': 'android',\n      'device_type': 0,\n      'fnval': 912,\n      'disable_rcmd': 0,\n      'https_url_req': 1,\n      if (moduleSelect) 'module_select': 1,\n      'mobi_app': 'android',\n      'network': 'wifi',\n      'page': pn,\n      'platform': 'android',\n      if (recommend.isLogin) 'relation_page': 1,\n      's_locale': 'zh_CN',\n      'scale': 2,\n      'statistics': Constants.statisticsApp,\n    };\n    AppSign.appSign(params);\n    final res = await Request().get(\n      Api.liveFeedIndex,\n      queryParameters: params,\n      options: Options(\n        headers: {\n          'buvid': LoginHttp.buvid,\n          'fp_local':\n              '1111111111111111111111111111111111111111111111111111111111111111',\n          'fp_remote':\n              '1111111111111111111111111111111111111111111111111111111111111111',\n          'session_id': '11111111',\n          'env': 'prod',\n          'app-key': 'android',\n          'User-Agent': Constants.userAgentApp,\n          'x-bili-trace-id': Constants.traceId,\n          'x-bili-aurora-eid': '',\n          'x-bili-aurora-zone': '',\n          'bili-http-engine': 'cronet',\n        },\n      ),\n    );\n    if (res.data['code'] == 0) {\n      return Success(LiveIndexData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<LiveFollowData>> liveFollow(int page) async {\n    final res = await Request().get(\n      Api.liveFollow,\n      queryParameters: {\n        'page': page,\n        'page_size': 9,\n        'ignoreRecord': 1,\n        'hit_ab': true,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(LiveFollowData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<LiveSecondData>> liveSecondList({\n    required int pn,\n    required Object? areaId,\n    required Object? parentAreaId,\n    String? sortType,\n  }) async {\n    final params = {\n      'access_key': ?recommend.accessKey,\n      'actionKey': 'appkey',\n      'channel': 'master',\n      'area_id': ?areaId,\n      'parent_area_id': ?parentAreaId,\n      'build': 8430300,\n      'version': '8.43.0',\n      'c_locale': 'zh_CN',\n      'device': 'android',\n      'device_name': 'android',\n      'device_type': 0,\n      'fnval': 912,\n      'disable_rcmd': 0,\n      'https_url_req': 1,\n      'mobi_app': 'android',\n      'module_select': 0,\n      'network': 'wifi',\n      'page': pn,\n      'page_size': 20,\n      'platform': 'android',\n      'qn': 0,\n      'sort_type': ?sortType,\n      'tag_version': 1,\n      's_locale': 'zh_CN',\n      'scale': 2,\n      'statistics': Constants.statisticsApp,\n    };\n    AppSign.appSign(params);\n    final res = await Request().get(\n      Api.liveSecondList,\n      queryParameters: params,\n      options: Options(\n        headers: {\n          'buvid': LoginHttp.buvid,\n          'fp_local':\n              '1111111111111111111111111111111111111111111111111111111111111111',\n          'fp_remote':\n              '1111111111111111111111111111111111111111111111111111111111111111',\n          'session_id': '11111111',\n          'env': 'prod',\n          'app-key': 'android',\n          'User-Agent': Constants.userAgentApp,\n          'x-bili-trace-id': Constants.traceId,\n          'x-bili-aurora-eid': '',\n          'x-bili-aurora-zone': '',\n          'bili-http-engine': 'cronet',\n        },\n      ),\n    );\n    if (res.data['code'] == 0) {\n      return Success(LiveSecondData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<List<AreaList>?>> liveAreaList() async {\n    final params = {\n      'access_key': ?recommend.accessKey,\n      'actionKey': 'appkey',\n      'build': 8430300,\n      'channel': 'master',\n      'version': '8.43.0',\n      'c_locale': 'zh_CN',\n      'device': 'android',\n      'disable_rcmd': 0,\n      'mobi_app': 'android',\n      'platform': 'android',\n      's_locale': 'zh_CN',\n      'statistics': Constants.statisticsApp,\n    };\n    AppSign.appSign(params);\n    final res = await Request().get(\n      Api.liveAreaList,\n      queryParameters: params,\n    );\n    if (res.data['code'] == 0) {\n      return Success(\n        (res.data['data']?['list'] as List?)\n            ?.map((e) => AreaList.fromJson(e))\n            .toList(),\n      );\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<List<AreaItem>>> getLiveFavTag() async {\n    final params = {\n      'access_key': ?Accounts.main.accessKey,\n      'actionKey': 'appkey',\n      'build': 8430300,\n      'channel': 'master',\n      'version': '8.43.0',\n      'c_locale': 'zh_CN',\n      'device': 'android',\n      'disable_rcmd': 0,\n      'mobi_app': 'android',\n      'platform': 'android',\n      's_locale': 'zh_CN',\n      'statistics': Constants.statisticsApp,\n    };\n    AppSign.appSign(params);\n    final res = await Request().get(\n      Api.getLiveFavTag,\n      queryParameters: params,\n    );\n\n    if (res.data['code'] == 0) {\n      return Success(\n        (res.data['data']?['tags'] as List?)\n                ?.map((e) => AreaItem.fromJson(e))\n                .toList() ??\n            <AreaItem>[],\n      );\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> setLiveFavTag({\n    required String ids,\n  }) async {\n    final data = {\n      'tags': ids,\n      'access_key': Accounts.main.accessKey,\n      'actionKey': 'appkey',\n      'build': 8430300,\n      'channel': 'master',\n      'version': '8.43.0',\n      'c_locale': 'zh_CN',\n      'device': 'android',\n      'disable_rcmd': 0,\n      'mobi_app': 'android',\n      'platform': 'android',\n      's_locale': 'zh_CN',\n      'statistics': Constants.statisticsApp,\n    };\n    AppSign.appSign(data);\n    final res = await Request().post(\n      Api.setLiveFavTag,\n      data: data,\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<List<AreaItem>?>> liveRoomAreaList({\n    required Object parentid,\n  }) async {\n    final params = {\n      'access_key': ?recommend.accessKey,\n      'actionKey': 'appkey',\n      'build': 8430300,\n      'channel': 'master',\n      'version': '8.43.0',\n      'c_locale': 'zh_CN',\n      'device': 'android',\n      'disable_rcmd': 0,\n      'need_entrance': 1,\n      'parent_id': parentid,\n      'source_id': 2,\n      'mobi_app': 'android',\n      'platform': 'android',\n      's_locale': 'zh_CN',\n      'statistics': Constants.statisticsApp,\n    };\n    AppSign.appSign(params);\n    final res = await Request().get(\n      Api.liveRoomAreaList,\n      queryParameters: params,\n    );\n    if (res.data['code'] == 0) {\n      return Success(\n        (res.data['data'] as List?)?.map((e) => AreaItem.fromJson(e)).toList(),\n      );\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<LiveSearchData>> liveSearch({\n    required int page,\n    required String keyword,\n    required LiveSearchType type,\n  }) async {\n    final params = {\n      'access_key': ?recommend.accessKey,\n      'actionKey': 'appkey',\n      'build': 8430300,\n      'channel': 'master',\n      'version': '8.43.0',\n      'c_locale': 'zh_CN',\n      'device': 'android',\n      'page': page,\n      'pagesize': 30,\n      'keyword': keyword,\n      'disable_rcmd': 0,\n      'mobi_app': 'android',\n      'platform': 'android',\n      's_locale': 'zh_CN',\n      'statistics': Constants.statisticsApp,\n      'type': type.name,\n    };\n    AppSign.appSign(params);\n    final res = await Request().get(\n      Api.liveSearch,\n      queryParameters: params,\n    );\n    if (res.data['code'] == 0) {\n      return Success(LiveSearchData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<ShieldInfo?>> getLiveInfoByUser(\n    Object roomId,\n  ) async {\n    final res = await Request().get(\n      Api.getLiveInfoByUser,\n      queryParameters: await WbiSign.makSign({\n        'room_id': roomId,\n        'from': 0,\n        'not_mock_enter_effect': 1,\n        'web_location': 444.8,\n      }),\n    );\n    if (res.data['code'] == 0) {\n      return Success(LiveDmBlockData.fromJson(res.data['data']).shieldInfo);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> liveSetSilent({\n    required String type,\n    required int level,\n  }) async {\n    final csrf = Accounts.main.csrf;\n    final res = await Request().post(\n      Api.liveSetSilent,\n      data: {\n        'type': type,\n        'level': level,\n        'csrf': csrf,\n        'csrf_token': csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> addShieldKeyword({\n    required String keyword,\n  }) async {\n    final csrf = Accounts.main.csrf;\n    final res = await Request().post(\n      Api.addShieldKeyword,\n      data: {\n        'keyword': keyword,\n        'csrf': csrf,\n        'csrf_token': csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> delShieldKeyword({\n    required String keyword,\n  }) async {\n    final csrf = Accounts.main.csrf;\n    final res = await Request().post(\n      Api.delShieldKeyword,\n      data: {\n        'keyword': keyword,\n        'csrf': csrf,\n        'csrf_token': csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<ShieldUserList>> liveShieldUser({\n    required Object uid,\n    required Object roomid,\n    required int type,\n  }) async {\n    final csrf = Accounts.main.csrf;\n    final res = await Request().post(\n      Api.liveShieldUser,\n      data: {\n        'uid': uid,\n        'roomid': roomid,\n        'type': type,\n        'csrf': csrf,\n        'csrf_token': csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return Success(ShieldUserList.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> liveLikeReport({\n    required int clickTime,\n    required Object roomId,\n    required Object uid,\n    Object? anchorId,\n  }) async {\n    final res = await Request().post(\n      Api.liveLikeReport,\n      data: await WbiSign.makSign({\n        'click_time': clickTime,\n        'room_id': roomId,\n        'uid': uid,\n        'anchor_id': ?anchorId,\n        'web_location': 444.8,\n        'csrf': Accounts.heartbeat.csrf,\n      }),\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  @pragma('vm:notify-debugger-on-exception')\n  static Future<LoadingState<SuperChatData>> superChatMsg(\n    Object roomId,\n  ) async {\n    final res = await Request().get(\n      Api.superChatMsg,\n      queryParameters: {\n        'room_id': roomId,\n      },\n    );\n    if (res.data['code'] == 0) {\n      try {\n        return Success(SuperChatData.fromJson(res.data['data']));\n      } catch (e, s) {\n        return Error('$e\\n\\n$s');\n      }\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> liveDmReport({\n    required int roomId,\n    required Object mid,\n    required String msg,\n    required String reason,\n    required int reasonId,\n    required int dmType,\n    required Object idStr,\n    required Object ts,\n    required Object sign,\n  }) async {\n    final csrf = Accounts.main.csrf;\n    final data = {\n      'id': 0,\n      'roomid': roomId,\n      'tuid': mid,\n      'msg': msg,\n      'reason': reason,\n      'ts': ts,\n      'sign': sign,\n      'reason_id': reasonId,\n      'token': '',\n      'dm_type': dmType,\n      'id_str': idStr,\n      'csrf_token': csrf,\n      'csrf': csrf,\n      'visit_id': '',\n    };\n    final res = await Request().post(\n      Api.liveDmReport,\n      data: data,\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<LiveContributionRankData>> liveContributionRank({\n    required Object ruid,\n    required Object roomId,\n    required int page,\n    required LiveContributionRankType type,\n  }) async {\n    final res = await Request().get(\n      Api.liveContributionRank,\n      queryParameters: await WbiSign.makSign({\n        'ruid': ruid,\n        'room_id': roomId,\n        'page': page,\n        'page_size': 100,\n        'type': type.name,\n        'switch': type.sw1tch,\n        'platform': 'web',\n        'web_location': 444.8,\n      }),\n    );\n    if (res.data['code'] == 0) {\n      try {\n        return Success(LiveContributionRankData.fromJson(res.data['data']));\n      } catch (e, s) {\n        return Error('$e\\n\\n$s');\n      }\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> superChatReport({\n    required int id,\n    required Object roomId,\n    required Object uid,\n    required String msg,\n    required String reason,\n    required int ts,\n    required String token,\n  }) async {\n    final csrf = Accounts.main.csrf;\n    final res = await Request().post(\n      Api.superChatReport,\n      data: {\n        'id': id,\n        'roomid': roomId,\n        'uid': uid,\n        'msg': msg,\n        'reason': reason,\n        'ts': ts,\n        'sign': '',\n        'reason_id': reason,\n        'token': token,\n        'id_str': id.toString(),\n        'csrf_token': csrf,\n        'csrf': csrf,\n        'visit_id': '',\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/http/loading_state.dart",
    "content": "import 'package:flutter/foundation.dart' show immutable;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\n\nsealed class LoadingState<T> {\n  const LoadingState();\n\n  factory LoadingState.loading() => const Loading._internal();\n\n  bool get isSuccess => this is Success<T>;\n\n  T get data => switch (this) {\n    Success(:final response) => response,\n    _ => throw this,\n  };\n\n  T? get dataOrNull => switch (this) {\n    Success(:final response) => response,\n    _ => null,\n  };\n\n  Future<void> toast() => SmartDialog.showToast(toString());\n}\n\nclass Loading extends LoadingState<Never> {\n  const Loading._internal();\n\n  @override\n  String toString() {\n    return 'ApiException: loading';\n  }\n}\n\n@immutable\nclass Success<T> extends LoadingState<T> {\n  final T response;\n  const Success(this.response);\n\n  @override\n  bool operator ==(Object other) {\n    if (identical(this, other)) {\n      return true;\n    }\n    if (other is Success<T>) {\n      return response == other.response;\n    }\n    return false;\n  }\n\n  @override\n  int get hashCode => response.hashCode;\n}\n\n@immutable\nclass Error extends LoadingState<Never> {\n  final int? code;\n  final String? errMsg;\n  const Error(this.errMsg, {this.code});\n\n  @override\n  bool operator ==(Object other) {\n    if (identical(this, other)) {\n      return true;\n    }\n    if (other is Error) {\n      return errMsg == other.errMsg && code == other.code;\n    }\n    return false;\n  }\n\n  @override\n  int get hashCode => Object.hash(errMsg, code);\n\n  @override\n  String toString() {\n    return errMsg ?? code?.toString() ?? '';\n  }\n}\n"
  },
  {
    "path": "lib/http/login.dart",
    "content": "import 'dart:convert';\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/http/api.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/login/model.dart';\nimport 'package:PiliPlus/models_new/login_devices/data.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/accounts/account.dart';\nimport 'package:PiliPlus/utils/app_sign.dart';\nimport 'package:PiliPlus/utils/login_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:crypto/crypto.dart';\nimport 'package:dio/dio.dart';\nimport 'package:encrypt/encrypt.dart';\n\nabstract final class LoginHttp {\n  static final String deviceId = LoginUtils.genDeviceId();\n  static String get buvid => LoginUtils.buvid;\n  static final Map<String, String> headers = {\n    'buvid': buvid,\n    'env': 'prod',\n    'app-key': 'android_hd',\n    'user-agent': Constants.userAgent,\n    'x-bili-trace-id': Constants.traceId,\n    'x-bili-aurora-eid': '',\n    'x-bili-aurora-zone': '',\n    'bili-http-engine': 'cronet',\n    'content-type': 'application/x-www-form-urlencoded; charset=utf-8',\n  };\n\n  @pragma('vm:notify-debugger-on-exception')\n  static Future<LoadingState<({String authCode, String url})>>\n  getHDcode() async {\n    final params = {\n      // 'local_id': 'Y952A395BB157D305D8A8340FC2AAECECE17',\n      'local_id': '0',\n      'platform': 'android',\n      'mobi_app': 'android_hd',\n    };\n    AppSign.appSign(params);\n    final res = await Request().post(Api.getTVCode, queryParameters: params);\n\n    if (res.data['code'] == 0) {\n      try {\n        final Map<String, dynamic> data = res.data['data'];\n        return Success((authCode: data['auth_code'], url: data['url']));\n      } catch (e, s) {\n        return Error('$e\\n\\n$s');\n      }\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future codePoll(String authCode) async {\n    final params = {\n      'auth_code': authCode,\n      'local_id': '0',\n    };\n    AppSign.appSign(params);\n    final res = await Request().post(Api.qrcodePoll, queryParameters: params);\n    return {\n      'status': res.data['code'] == 0,\n      'code': res.data['code'],\n      'data': res.data['data'],\n      'msg': res.data['message'],\n    };\n  }\n\n  static Future queryCaptcha() async {\n    final res = await Request().get(Api.getCaptcha);\n    if (res.data['code'] == 0) {\n      return {\n        'status': true,\n        'data': CaptchaDataModel.fromJson(res.data['data']),\n      };\n    } else {\n      return {'status': false, 'data': res.data['message']};\n    }\n  }\n\n  // 获取salt与PubKey\n  static Future getWebKey() async {\n    final res = await Request().get(Api.getWebKey);\n    //data: {'disable_rcmd': 0, 'local_id': LoginUtils.generateBuvid()});\n    if (res.data['code'] == 0) {\n      return {'status': true, 'data': res.data['data']};\n    } else {\n      return {'status': false, 'data': {}, 'msg': res.data['message']};\n    }\n  }\n\n  static Future sendSmsCode({\n    required Object cid,\n    required String tel,\n    // String? deviceTouristId,\n    String? geeChallenge,\n    String? geeSeccode,\n    String? geeValidate,\n    String? recaptchaToken,\n  }) async {\n    int timestamp = DateTime.now().millisecondsSinceEpoch;\n    final data = {\n      'build': '2001100',\n      'buvid': buvid,\n      'c_locale': 'zh_CN',\n      'channel': 'master',\n      'cid': cid,\n      // if (deviceTouristId != null) 'device_tourist_id': deviceTouristId,\n      'disable_rcmd': '0',\n      'gee_challenge': ?geeChallenge,\n      'gee_seccode': ?geeSeccode,\n      'gee_validate': ?geeValidate,\n      'local_id': buvid,\n      // https://chinggg.github.io/post/appre/\n      'login_session_id': md5\n          .convert(ascii.encode(buvid + timestamp.toString()))\n          .toString(),\n      'mobi_app': 'android_hd',\n      'platform': 'android',\n      'recaptcha_token': ?recaptchaToken,\n      's_locale': 'zh_CN',\n      'statistics': Constants.statistics,\n      'tel': tel,\n      'ts': (timestamp ~/ 1000).toString(),\n    };\n    AppSign.appSign(data);\n\n    final res = await Request().post(\n      Api.appSmsCode,\n      data: data,\n      options: Options(\n        contentType: Headers.formUrlEncodedContentType,\n        headers: headers,\n      ),\n    );\n\n    if (res.data['code'] == 0 && res.data['data']['recaptcha_url'] == \"\") {\n      return {'status': true, 'data': res.data['data']};\n    } else {\n      return {\n        'status': false,\n        'code': res.data['code'],\n        'msg': res.data['message'],\n        'data': res.data['data'],\n      };\n    }\n  }\n\n  // static Future getGuestId(String key) async {\n  //   dynamic publicKey = RSAKeyParser().parse(key);\n  //   final params = {\n  //     'appkey': Constants.appKey,\n  //     'build': '2001100',\n  //     'buvid': buvid,\n  //     'c_locale': 'zh_CN',\n  //     'channel': 'master',\n  //     'deviceInfo': 'xxxxxx',\n  //     'disable_rcmd': '0',\n  //     'dt': Uri.encodeComponent(Encrypter(RSA(publicKey: publicKey))\n  //         .encrypt(generateRandomString(16))\n  //         .base64),\n  //     'local_id': buvid,\n  //     'mobi_app': 'android_hd',\n  //     'platform': 'android',\n  //     's_locale': 'zh_CN',\n  //     'statistics': Constants.statistics,\n  //     'ts': (DateTime.now().millisecondsSinceEpoch ~/ 1000).toString(),\n  //   };\n  //   String sign = AppSign.appSign(\n  //     params,\n  //     Constants.appKey,\n  //     Constants.appSec,\n  //   );\n  //   final res = await Request().post(Api.getGuestId,\n  //       queryParameters: {...params, 'sign': sign},\n  //       options: Options(\n  //         contentType: Headers.formUrlEncodedContentType,\n  //         headers: headers,\n  //       ));\n  //   print(\"getGuestId: $res\");\n  //   if (res.data['code'] == 0) {\n  //     return {'status': true, 'data': res.data['data']};\n  //   } else {\n  //     return {'status': false, 'msg': res.data['message']};\n  //   }\n  // }\n\n  // app端密码登录\n  static Future loginByPwd({\n    required String username,\n    required String password,\n    required String key,\n    required String salt,\n    String? geeChallenge,\n    String? geeSeccode,\n    String? geeValidate,\n    String? recaptchaToken,\n  }) async {\n    dynamic publicKey = RSAKeyParser().parse(key);\n    String passwordEncrypted = Encrypter(\n      RSA(publicKey: publicKey),\n    ).encrypt(salt + password).base64;\n\n    Map<String, String> data = {\n      'bili_local_id': deviceId,\n      'build': '2001100',\n      'buvid': buvid,\n      'c_locale': 'zh_CN',\n      'channel': 'master',\n      'device': 'phone',\n      'device_id': deviceId,\n      //'device_meta': '',\n      'device_name': 'vivo',\n      'device_platform': 'Android14vivo',\n      'disable_rcmd': '0',\n      'dt': Uri.encodeComponent(\n        Encrypter(\n          RSA(publicKey: publicKey),\n        ).encrypt(Utils.generateRandomString(16)).base64,\n      ),\n      'from_pv': 'main.homepage.avatar-nologin.all.click',\n      'from_url': Uri.encodeComponent('bilibili://pegasus/promo'),\n      'gee_challenge': ?geeChallenge,\n      'gee_seccode': ?geeSeccode,\n      'gee_validate': ?geeValidate,\n      'local_id': buvid, //LoginUtils.generateBuvid(),\n      'mobi_app': 'android_hd',\n      'password': passwordEncrypted,\n      'permission': 'ALL',\n      'platform': 'android',\n      'recaptcha_token': ?recaptchaToken,\n      's_locale': 'zh_CN',\n      'statistics': Constants.statistics,\n      'username': username,\n    };\n    AppSign.appSign(data);\n    final res = await Request().post(\n      Api.loginByPwdApi,\n      data: data,\n      options: Options(\n        contentType: Headers.formUrlEncodedContentType,\n        headers: headers,\n        //responseType: ResponseType.plain\n      ),\n    );\n\n    if (res.data['code'] == 0) {\n      return {\n        'status': true,\n        'data': res.data['data'],\n        'msg': res.data['message'],\n      };\n    } else {\n      return {\n        'status': false,\n        'code': res.data['code'],\n        'msg': res.data['message'],\n        'data': res.data['data'],\n      };\n    }\n  }\n\n  // app端短信验证码登录\n  static Future loginBySms({\n    required String captchaKey,\n    required String tel,\n    required String code,\n    required Object cid,\n    required String key,\n  }) async {\n    dynamic publicKey = RSAKeyParser().parse(key);\n    Map<String, Object> data = {\n      'bili_local_id': deviceId,\n      'build': '2001100',\n      'buvid': buvid,\n      'c_locale': 'zh_CN',\n      'captcha_key': captchaKey,\n      'channel': 'master',\n      'cid': cid,\n      'code': code,\n      'device': 'phone',\n      'device_id': deviceId,\n      //'device_meta': '',\n      'device_name': 'vivo',\n      'device_platform': 'Android14vivo',\n      // 'device_tourist_id': '',\n      'disable_rcmd': '0',\n      'dt': Uri.encodeComponent(\n        Encrypter(\n          RSA(publicKey: publicKey),\n        ).encrypt(Utils.generateRandomString(16)).base64,\n      ),\n      'from_pv': 'main.my-information.my-login.0.click',\n      'from_url': Uri.encodeComponent('bilibili://user_center/mine'),\n      'local_id': buvid,\n      'mobi_app': 'android_hd',\n      'platform': 'android',\n      's_locale': 'zh_CN',\n      'statistics': Constants.statistics,\n      'tel': tel,\n    };\n    AppSign.appSign(data);\n    final res = await Request().post(\n      Api.logInByAppSms,\n      data: data,\n      options: Options(\n        contentType: Headers.formUrlEncodedContentType,\n        headers: headers,\n        //responseType: ResponseType.plain\n      ),\n    );\n\n    if (res.data['code'] == 0) {\n      return {'status': true, 'data': res.data['data']};\n    } else {\n      return {\n        'status': false,\n        'code': res.data['code'],\n        'msg': res.data['message'],\n        'data': res.data['data'],\n      };\n    }\n  }\n\n  // 密码登录时风控验证手机\n  static Future safeCenterGetInfo({\n    required String tmpCode,\n  }) async {\n    final res = await Request().get(\n      Api.safeCenterGetInfo,\n      queryParameters: {\n        'tmp_code': tmpCode,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return {'status': true, 'data': res.data['data']};\n    } else {\n      return {\n        'status': false,\n        'code': res.data['code'],\n        'msg': res.data['message'],\n        'data': res.data['data'],\n      };\n    }\n  }\n\n  // 风控验证手机前的极验验证码\n  static Future preCapture() async {\n    final res = await Request().post(Api.preCapture);\n\n    if (res.data['code'] == 0) {\n      return {'status': true, 'data': res.data['data']};\n    } else {\n      return {\n        'status': false,\n        'code': res.data['code'],\n        'msg': res.data['message'],\n        'data': res.data['data'],\n      };\n    }\n  }\n\n  // 风控验证手机：发送短信验证码\n  static Future safeCenterSmsCode({\n    String? smsType,\n    required String tmpCode,\n    String? geeChallenge,\n    String? geeSeccode,\n    String? geeValidate,\n    String? recaptchaToken,\n    required String refererUrl,\n  }) async {\n    Map<String, String> data = {\n      'disable_rcmd': '0',\n      'sms_type': smsType ?? 'loginTelCheck',\n      'tmp_code': tmpCode,\n      'gee_challenge': ?geeChallenge,\n      'gee_seccode': ?geeSeccode,\n      'gee_validate': ?geeValidate,\n      'recaptcha_token': ?recaptchaToken,\n    };\n    AppSign.appSign(data);\n    final res = await Request().post(\n      Api.safeCenterSmsCode,\n      data: data,\n      options: Options(\n        contentType: Headers.formUrlEncodedContentType,\n        headers: {\n          \"Referer\": refererUrl,\n        },\n      ),\n    );\n\n    if (res.data['code'] == 0) {\n      return {'status': true, 'data': res.data['data']};\n    } else {\n      return {\n        'status': false,\n        'code': res.data['code'],\n        'msg': res.data['message'],\n        'data': res.data['data'],\n      };\n    }\n  }\n\n  // 风控验证手机：提交短信验证码\n  static Future safeCenterSmsVerify({\n    String? type,\n    required String code,\n    required String tmpCode,\n    required String requestId,\n    required String source,\n    required String captchaKey,\n    required String refererUrl,\n  }) async {\n    Map<String, String> data = {\n      'type': type ?? 'loginTelCheck',\n      'code': code,\n      'tmp_code': tmpCode,\n      'request_id': requestId,\n      'source': source,\n      'captcha_key': captchaKey,\n    };\n    AppSign.appSign(data);\n    final res = await Request().post(\n      Api.safeCenterSmsVerify,\n      data: data,\n      options: Options(\n        contentType: Headers.formUrlEncodedContentType,\n        headers: {\n          \"Referer\": refererUrl,\n        },\n      ),\n    );\n\n    if (res.data['code'] == 0) {\n      return {'status': true, 'data': res.data['data']};\n    } else {\n      return {\n        'status': false,\n        'code': res.data['code'],\n        'msg': res.data['message'],\n        'data': res.data['data'],\n      };\n    }\n  }\n\n  // 风控验证手机：用oauthCode换回accessToken\n  static Future oauth2AccessToken({\n    required String code,\n  }) async {\n    final Map<String, String> data = {\n      'build': '2001100',\n      'buvid': buvid,\n      // 'c_locale': 'zh_CN',\n      // 'channel': 'master',\n      'code': code,\n      // 'device': 'phone',\n      // 'device_id': deviceId,\n      // 'device_name': 'vivo',\n      // 'device_platform': 'Android14vivo',\n      'disable_rcmd': '0',\n      'grant_type': 'authorization_code',\n      'local_id': buvid,\n      'mobi_app': 'android_hd',\n      'platform': 'android',\n      // 's_locale': 'zh_CN',\n      // 'statistics': Constants.statistics,\n    };\n    AppSign.appSign(data);\n    final res = await Request().post(\n      Api.oauth2AccessToken,\n      data: data,\n      options: Options(\n        contentType: Headers.formUrlEncodedContentType,\n        headers: headers,\n      ),\n    );\n\n    if (res.data['code'] == 0) {\n      return {'status': true, 'data': res.data['data']};\n    } else {\n      return {\n        'status': false,\n        'code': res.data['code'],\n        'msg': res.data['message'],\n        'data': res.data['data'],\n      };\n    }\n  }\n\n  static Future<Map> logout(Account account) async {\n    final res = await Request().post(\n      Api.logout,\n      data: {'biliCSRF': account.csrf},\n      options: Options(\n        contentType: Headers.formUrlEncodedContentType,\n        extra: {'account': account},\n      ),\n    );\n    return {'status': res.data['code'] == 0, 'msg': res.data['message']};\n  }\n\n  static Future<LoadingState<LoginDevicesData>> loginDevices() async {\n    final account = Accounts.main;\n    final buvid = LoginUtils.buvid;\n    final params = {\n      'local_id': buvid,\n      'buvid': buvid,\n      'device_name': 'android',\n      'device_platform': 'android',\n      'csrf': account.csrf,\n      'mobi_app': 'android_hd',\n      'platform': 'android',\n      'access_key': account.accessKey,\n      'statistics': Constants.statistics,\n    };\n    AppSign.appSign(params);\n    final res = await Request().get(\n      Api.loginDevices,\n      queryParameters: params,\n    );\n    if (res.data['code'] == 0) {\n      return Success(LoginDevicesData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/http/match.dart",
    "content": "import 'package:PiliPlus/http/api.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/match/match_info/contest.dart';\nimport 'package:PiliPlus/models_new/match/match_info/data.dart';\n\nabstract final class MatchHttp {\n  static Future<LoadingState<MatchContest?>> matchInfo(Object cid) async {\n    final res = await Request().get(\n      Api.matchInfo,\n      queryParameters: {\n        'cid': cid,\n        'platform': 2,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(MatchInfoData.fromJson(res.data['data']).contest);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/http/member.dart",
    "content": "import 'dart:io';\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/http/api.dart';\nimport 'package:PiliPlus/http/browser_ua.dart';\nimport 'package:PiliPlus/http/constants.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/member/contribute_type.dart';\nimport 'package:PiliPlus/models/dynamics/result.dart';\nimport 'package:PiliPlus/models/member/info.dart';\nimport 'package:PiliPlus/models/member/tags.dart';\nimport 'package:PiliPlus/models_new/follow/data.dart';\nimport 'package:PiliPlus/models_new/follow/list.dart';\nimport 'package:PiliPlus/models_new/member/coin_like_arc/data.dart';\nimport 'package:PiliPlus/models_new/member/search_archive/data.dart';\nimport 'package:PiliPlus/models_new/member_card_info/data.dart';\nimport 'package:PiliPlus/models_new/space/space/data.dart';\nimport 'package:PiliPlus/models_new/space/space_archive/data.dart';\nimport 'package:PiliPlus/models_new/space/space_article/data.dart';\nimport 'package:PiliPlus/models_new/space/space_audio/data.dart';\nimport 'package:PiliPlus/models_new/space/space_cheese/data.dart';\nimport 'package:PiliPlus/models_new/space/space_opus/data.dart';\nimport 'package:PiliPlus/models_new/space/space_season_series/item.dart';\nimport 'package:PiliPlus/models_new/space/space_shop/data.dart';\nimport 'package:PiliPlus/models_new/upower_rank/data.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/app_sign.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:PiliPlus/utils/wbi_sign.dart';\nimport 'package:dio/dio.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\n\nabstract final class MemberHttp {\n  static Future<void> reportMember(\n    dynamic mid, {\n    String? reason,\n    int? reasonV2,\n  }) async {\n    final res = await Request().post(\n      Api.reportMember,\n      data: {\n        'mid': mid,\n        'reason': reason,\n        'reason_v2': ?reasonV2,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['status'] == true) {\n      SmartDialog.showToast('举报成功');\n    } else {\n      SmartDialog.showToast('举报失败');\n    }\n  }\n\n  static Future<LoadingState<SpaceArticleData>> spaceArticle({\n    required int mid,\n    required int page,\n  }) async {\n    final params = {\n      'build': 8430300,\n      'channel': 'master',\n      'version': '8.43.0',\n      'c_locale': 'zh_CN',\n      'mobi_app': 'android',\n      'platform': 'android',\n      'pn': page,\n      'ps': 10,\n      's_locale': 'zh_CN',\n      'statistics': Constants.statisticsApp,\n      'vmid': mid,\n    };\n    final res = await Request().get(\n      Api.spaceArticle,\n      queryParameters: params,\n      options: Options(\n        headers: {\n          'bili-http-engine': 'cronet',\n          'user-agent': Constants.userAgentApp,\n        },\n      ),\n    );\n    if (res.data['code'] == 0) {\n      return Success(SpaceArticleData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<SpaceSsData>> seasonSeriesList({\n    required int? mid,\n    required int pn,\n  }) async {\n    final res = await Request().get(\n      Api.seasonSeries,\n      queryParameters: {\n        'mid': mid,\n        'page_num': pn,\n        'page_size': 10,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(\n        SpaceSsData.fromJson(res.data['data']?['items_lists'] ?? {}),\n      );\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<SpaceArchiveData>> spaceArchive({\n    required ContributeType type,\n    required int? mid,\n    String? aid,\n    String? order,\n    String? sort,\n    int? pn,\n    int? next,\n    int? seasonId,\n    int? seriesId,\n    bool? includeCursor,\n  }) async {\n    final params = {\n      'aid': ?aid,\n      'build': 8430300,\n      'version': '8.43.0',\n      'c_locale': 'zh_CN',\n      'channel': 'master',\n      'mobi_app': 'android',\n      'platform': 'android',\n      's_locale': 'zh_CN',\n      'ps': 20,\n      'pn': ?pn,\n      'next': ?next,\n      'season_id': ?seasonId,\n      'series_id': ?seriesId,\n      'qn': type == ContributeType.video ? 80 : 32,\n      'order': ?order,\n      'sort': ?sort,\n      'include_cursor': ?includeCursor,\n      'statistics': Constants.statisticsApp,\n      'vmid': mid,\n    };\n    final res = await Request().get(\n      switch (type) {\n        ContributeType.video => Api.spaceArchive,\n        ContributeType.charging => Api.spaceChargingArchive,\n        ContributeType.season => Api.spaceSeason,\n        ContributeType.series => Api.spaceSeries,\n        ContributeType.bangumi => Api.spaceBangumi,\n        ContributeType.comic => Api.spaceComic,\n      },\n      queryParameters: params,\n      options: Options(\n        headers: {\n          'bili-http-engine': 'cronet',\n          'user-agent': Constants.userAgentApp,\n        },\n      ),\n    );\n    if (res.data['code'] == 0) {\n      return Success(SpaceArchiveData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<SpaceAudioData>> spaceAudio({\n    required int page,\n    required mid,\n  }) async {\n    final res = await Request().get(\n      Api.spaceAudio,\n      queryParameters: {\n        'pn': page,\n        'ps': 20,\n        'order': 1,\n        'uid': mid,\n        'web_location': 333.1387,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(SpaceAudioData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<SpaceCheeseData>> spaceCheese({\n    required int page,\n    required mid,\n  }) async {\n    final res = await Request().get(\n      Api.spaceCheese,\n      queryParameters: {\n        'pn': page,\n        'ps': 30,\n        'mid': mid,\n        'web_location': 333.1387,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(SpaceCheeseData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // static Future<LoadingState> spaceStory({\n  //   required Object mid,\n  //   required Object aid,\n  //   required Object beforeSize,\n  //   required Object afterSize,\n  //   required Object cid,\n  //   required Object contain,\n  //   required Object index,\n  // }) async {\n  //   final params = {\n  //     'aid': aid,\n  //     'before_size': beforeSize,\n  //     'after_size': afterSize,\n  //     'cid': cid,\n  //     'contain': contain,\n  //     'index': index,\n  //     'build': 8430300,\n  //     'version': '8.43.0',\n  //     'c_locale': 'zh_CN',\n  //     'channel': 'master',\n  //     'mobi_app': 'android',\n  //     'platform': 'android',\n  //     's_locale': 'zh_CN',\n  //     'statistics': Constants.statisticsApp,\n  //     'vmid': mid,\n  //   };\n  //   final res = await Request().get(\n  //     Api.spaceStory,\n  //     queryParameters: params,\n  //     options: Options(\n  //       headers: {\n  //         'bili-http-engine': 'cronet',\n  //         'user-agent': Constants.userAgentApp,\n  //       },\n  //     ),\n  //   );\n  //   if (res.data['code'] == 0) {\n  //     return Success(res.data['data']);\n  //   } else {\n  //     return Error(res.data['message']);\n  //   }\n  // }\n\n  static Future<LoadingState<SpaceData>> space({\n    int? mid,\n    dynamic fromViewAid,\n  }) async {\n    final params = {\n      'build': 8430300,\n      'version': '8.43.0',\n      'c_locale': 'zh_CN',\n      'channel': 'master',\n      'mobi_app': 'android',\n      'platform': 'android',\n      's_locale': 'zh_CN',\n      'from_view_aid': ?fromViewAid,\n      'statistics': Constants.statisticsApp,\n      'vmid': mid,\n    };\n    final res = await Request().get(\n      Api.space,\n      queryParameters: params,\n      options: Options(\n        headers: {\n          'bili-http-engine': 'cronet',\n          'user-agent': Constants.userAgentApp,\n        },\n      ),\n    );\n    if (res.data['code'] == 0) {\n      return Success(SpaceData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<MemberInfoModel>> memberInfo({\n    required int mid,\n    String token = '',\n  }) async {\n    String dmImgStr = Utils.base64EncodeRandomString(16, 64);\n    String dmCoverImgStr = Utils.base64EncodeRandomString(32, 128);\n    final params = await WbiSign.makSign({\n      'mid': mid,\n      'token': token,\n      'platform': 'web',\n      'web_location': 1550101,\n      'dm_img_list': '[]',\n      'dm_img_str': dmImgStr,\n      'dm_cover_img_str': dmCoverImgStr,\n      'dm_img_inter': '{\"ds\":[],\"wh\":[0,0,0],\"of\":[0,0,0]}',\n    });\n    final res = await Request().get(\n      Api.memberInfo,\n      queryParameters: params,\n      options: Options(\n        headers: {\n          'origin': 'https://space.bilibili.com',\n          'referer': 'https://space.bilibili.com/$mid/dynamic',\n          'user-agent': BrowserUa.pc,\n        },\n      ),\n    );\n    if (res.data['code'] == 0) {\n      return Success(MemberInfoModel.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<Map>> memberStat({int? mid}) async {\n    final res = await Request().get(\n      Api.userStat,\n      queryParameters: {'vmid': mid},\n    );\n    if (res.data['code'] == 0) {\n      return Success(res.data['data']);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<MemberCardInfoData>> memberCardInfo({\n    int? mid,\n  }) async {\n    final res = await Request().get(\n      Api.memberCardInfo,\n      queryParameters: {\n        'mid': mid,\n        'photo': false,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(MemberCardInfoData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<SearchArchiveData>> searchArchive({\n    required Object mid,\n    int ps = 30,\n    int tid = 0,\n    int? pn,\n    String? keyword,\n    String order = 'pubdate',\n    bool orderAvoided = true,\n  }) async {\n    String dmImgStr = Utils.base64EncodeRandomString(16, 64);\n    String dmCoverImgStr = Utils.base64EncodeRandomString(32, 128);\n    final params = await WbiSign.makSign({\n      'mid': mid,\n      'ps': ps,\n      'tid': tid,\n      'pn': ?pn,\n      'keyword': ?keyword,\n      'order': order,\n      'platform': 'web',\n      'web_location': 1550101,\n      'order_avoided': orderAvoided,\n      'dm_img_list': '[]',\n      'dm_img_str': dmImgStr,\n      'dm_cover_img_str': dmCoverImgStr,\n      'dm_img_inter': '{\"ds\":[],\"wh\":[0,0,0],\"of\":[0,0,0]}',\n    });\n    final res = await Request().get(\n      Api.searchArchive,\n      queryParameters: params,\n      options: Options(\n        headers: {\n          HttpHeaders.userAgentHeader: BrowserUa.pc,\n          HttpHeaders.refererHeader: '${HttpString.spaceBaseUrl}/$mid',\n          'origin': HttpString.spaceBaseUrl,\n        },\n      ),\n    );\n    if (res.data['code'] == 0) {\n      return Success(SearchArchiveData.fromJson(res.data['data']));\n    } else {\n      Map errMap = const {\n        -352: '风控校验失败，请检查登录状态',\n      };\n      return Error(errMap[res.data['code']] ?? res.data['message']);\n    }\n  }\n\n  // 用户动态\n  @pragma('vm:notify-debugger-on-exception')\n  static Future<LoadingState<DynamicsDataModel>> memberDynamic({\n    String? offset,\n    required int mid,\n  }) async {\n    String dmImgStr = Utils.base64EncodeRandomString(16, 64);\n    String dmCoverImgStr = Utils.base64EncodeRandomString(32, 128);\n    final params = await WbiSign.makSign({\n      'offset': offset ?? '',\n      'host_mid': mid,\n      'timezone_offset': '-480',\n      'features': Constants.dynFeatures,\n      'platform': 'web',\n      'web_location': '333.1387',\n      'dm_img_list': '[]',\n      'dm_img_str': dmImgStr,\n      'dm_cover_img_str': dmCoverImgStr,\n      'dm_img_inter': '{\"ds\":[],\"wh\":[0,0,0],\"of\":[0,0,0]}',\n      'x-bili-device-req-json':\n          '{\"platform\":\"web\",\"device\":\"pc\",\"spmid\":\"333.1387\"}',\n    });\n    final res = await Request().get(\n      Api.memberDynamic,\n      queryParameters: params,\n      options: Options(\n        headers: {\n          'user-agent': BrowserUa.pc,\n          'origin': 'https://space.bilibili.com',\n          'referer': 'https://space.bilibili.com/$mid/dynamic',\n        },\n      ),\n    );\n    if (res.data['code'] == 0) {\n      try {\n        DynamicsDataModel data = DynamicsDataModel.fromJson(res.data['data']);\n        if (data.loadNext == true) {\n          return memberDynamic(offset: data.offset, mid: mid);\n        }\n        return Success(data);\n      } catch (e, s) {\n        return Error('$e\\n\\n$s');\n      }\n    } else {\n      Map errMap = const {\n        -352: '风控校验失败，请检查登录状态',\n      };\n      return Error(errMap[res.data['code']] ?? res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<DynamicsDataModel>> dynSearch({\n    required int pn,\n    required dynamic mid,\n    required dynamic offset,\n    required String keyword,\n  }) async {\n    final res = await Request().get(\n      Api.dynSearch,\n      queryParameters: {\n        'host_mid': mid,\n        'page': pn,\n        'offset': offset,\n        'keyword': keyword,\n        'features': Constants.dynFeatures,\n        'web_location': 333.1387,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(DynamicsDataModel.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 查询分组\n  static Future<LoadingState<List<MemberTagItemModel>>> followUpTags() async {\n    final res = await Request().get(Api.followUpTag);\n    if (res.data['code'] == 0) {\n      return Success(\n        (res.data['data'] as List)\n            .map((e) => MemberTagItemModel.fromJson(e))\n            .toList(),\n      );\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> specialAction({\n    int? fid,\n    bool isAdd = true,\n  }) async {\n    final res = await Request().post(\n      isAdd ? Api.addSpecial : Api.delSpecial,\n      data: {\n        'fid': fid,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 设置分组\n  static Future<LoadingState<void>> addUsers(String fids, String tagids) async {\n    final res = await Request().post(\n      Api.addUsers,\n      queryParameters: {\n        'x-bili-device-req-json':\n            '{\"platform\":\"web\",\"device\":\"pc\",\"spmid\":\"333.1387\"}',\n      },\n      data: {\n        'fids': fids,\n        'tagids': tagids,\n        'csrf': Accounts.main.csrf,\n        // 'cross_domain': true\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 获取某分组下的up\n  static Future<LoadingState<FollowData>> followUpGroup({\n    int? mid,\n    int? tagid,\n    int? pn,\n    int ps = 20,\n  }) async {\n    final res = await Request().get(\n      Api.followUpGroup,\n      queryParameters: {\n        'mid': mid,\n        'tagid': tagid,\n        'pn': pn,\n        'ps': ps,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(\n        FollowData(\n          list:\n              (res.data['data'] as List?)\n                  ?.map<FollowItemModel>((e) => FollowItemModel.fromJson(e))\n                  .toList() ??\n              <FollowItemModel>[],\n        ),\n      );\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> createFollowTag(Object tagName) async {\n    final res = await Request().post(\n      Api.createFollowTag,\n      queryParameters: {\n        'x-bili-device-req-json':\n            '{\"platform\":\"web\",\"device\":\"pc\",\"spmid\":\"333.1387\"}',\n      },\n      data: {\n        'tag': tagName,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> updateFollowTag(\n    Object tagid,\n    Object name,\n  ) async {\n    final res = await Request().post(\n      Api.updateFollowTag,\n      queryParameters: {\n        'x-bili-device-req-json':\n            '{\"platform\":\"web\",\"device\":\"pc\",\"spmid\":\"333.1387\"}',\n      },\n      data: {\n        'tagid': tagid,\n        'name': name,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> delFollowTag(Object tagid) async {\n    final res = await Request().post(\n      Api.delFollowTag,\n      queryParameters: {\n        'x-bili-device-req-json':\n            '{\"platform\":\"web\",\"device\":\"pc\",\"spmid\":\"333.1387\"}',\n      },\n      data: {\n        'tagid': tagid,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 获取up置顶\n  static Future<LoadingState<List<MemberTagItemModel>?>> getTopVideo() async {\n    final res = await Request().get(Api.getTopVideoApi);\n    if (res.data['code'] == 0) {\n      return Success(\n        (res.data['data'] as List?)\n            ?.map<MemberTagItemModel>((e) => MemberTagItemModel.fromJson(e))\n            .toList(),\n      );\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 获取up播放数、点赞数\n  static Future<LoadingState<Map>> memberView({required int mid}) async {\n    final res = await Request().get(\n      Api.getMemberViewApi,\n      queryParameters: {'mid': mid},\n    );\n    if (res.data['code'] == 0) {\n      return Success(res.data['data']);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 搜索follow\n  static Future<LoadingState<FollowData>> getfollowSearch({\n    required int mid,\n    required int ps,\n    required int pn,\n    required String name,\n  }) async {\n    final data = {\n      'vmid': mid,\n      'pn': pn,\n      'ps': ps,\n      'order': 'desc',\n      'order_type': 'attention',\n      'gaia_source': 'main_web',\n      'name': name,\n      'web_location': 333.999,\n    };\n    Map params = await WbiSign.makSign(data);\n    final res = await Request().get(\n      Api.followSearch,\n      queryParameters: {\n        ...data,\n        'w_rid': params['w_rid'],\n        'wts': params['wts'],\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(FollowData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<SpaceOpusData>> spaceOpus({\n    required int hostMid,\n    required int page,\n    String offset = '',\n    String type = 'all',\n  }) async {\n    final res = await Request().get(\n      Api.spaceOpus,\n      queryParameters: await WbiSign.makSign({\n        'host_mid': hostMid,\n        'page': page,\n        'offset': offset,\n        'type': type,\n        'web_location': 333.1387,\n      }),\n    );\n    if (res.data['code'] == 0) {\n      return Success(SpaceOpusData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<UpowerRankData>> upowerRank({\n    required Object upMid,\n    required int page,\n    int? privilegeType,\n  }) async {\n    final res = await Request().get(\n      Api.upowerRank,\n      queryParameters: {\n        'up_mid': upMid,\n        'pn': page,\n        'ps': 100,\n        'privilege_type': ?privilegeType,\n        'mobi_app': 'web',\n        'web_location': 333.1196,\n        if (Accounts.main.isLogin) 'csrf': Accounts.main.csrf,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(UpowerRankData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<CoinLikeArcData>> coinArc({\n    required int mid,\n    required int page,\n  }) async {\n    final res = await Request().get(\n      Api.coinArc,\n      queryParameters: {\n        'pn': page,\n        'ps': 20,\n        'vmid': mid,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(CoinLikeArcData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<CoinLikeArcData>> likeArc({\n    required int mid,\n    required int page,\n  }) async {\n    final res = await Request().get(\n      Api.likeArc,\n      queryParameters: {\n        'pn': page,\n        'ps': 20,\n        'vmid': mid,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(CoinLikeArcData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<SpaceShopData>> spaceShop({\n    required int mid,\n  }) async {\n    final params = {\n      'access_key': ?Accounts.main.accessKey,\n      'actionKey': 'appkey',\n      'build': 8430300,\n      'mVersion': 309,\n      'mallVersion': 8430300,\n      'statistics': Constants.statisticsApp,\n    };\n    AppSign.appSign(params);\n    final res = await Request().post(\n      Api.spaceShop,\n      queryParameters: params,\n      data: {\n        \"from\": \"cps_productTab_$mid\",\n        \"searchAfter\": 0,\n        \"msource\": \"cps_productTab_$mid\",\n        \"pageSize\": 8,\n        \"upMid\": mid.toString(),\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(SpaceShopData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/http/msg.dart",
    "content": "import 'dart:convert';\n\nimport 'package:PiliPlus/http/api.dart';\nimport 'package:PiliPlus/http/constants.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/msg/im_user_infos/datum.dart';\nimport 'package:PiliPlus/models_new/msg/msg_at/data.dart';\nimport 'package:PiliPlus/models_new/msg/msg_dnd/uid_setting.dart';\nimport 'package:PiliPlus/models_new/msg/msg_like/data.dart';\nimport 'package:PiliPlus/models_new/msg/msg_like_detail/data.dart';\nimport 'package:PiliPlus/models_new/msg/msg_reply/data.dart';\nimport 'package:PiliPlus/models_new/msg/msg_sys/data.dart';\nimport 'package:PiliPlus/models_new/msg/session_ss/data.dart';\nimport 'package:PiliPlus/models_new/msgfeed_unread/data.dart';\nimport 'package:PiliPlus/models_new/single_unread/data.dart';\nimport 'package:PiliPlus/models_new/upload_bfs/data.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/wbi_sign.dart';\nimport 'package:dio/dio.dart';\n\nabstract final class MsgHttp {\n  static Future<LoadingState<MsgReplyData>> msgFeedReplyMe({\n    int? cursor,\n    int? cursorTime,\n  }) async {\n    final res = await Request().get(\n      Api.msgFeedReply,\n      queryParameters: {\n        'id': ?cursor,\n        'reply_time': ?cursorTime,\n        'platform': 'web',\n        'mobi_app': 'web',\n        'build': 0,\n        'web_location': 333.40164,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(MsgReplyData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<MsgAtData>> msgFeedAtMe({\n    int? cursor,\n    int? cursorTime,\n  }) async {\n    final res = await Request().get(\n      Api.msgFeedAt,\n      queryParameters: {\n        'id': ?cursor,\n        'at_time': ?cursorTime,\n        'platform': 'web',\n        'mobi_app': 'web',\n        'build': 0,\n        'web_location': 333.40164,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(MsgAtData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<MsgLikeData>> msgFeedLikeMe({\n    int? cursor,\n    int? cursorTime,\n  }) async {\n    final res = await Request().get(\n      Api.msgFeedLike,\n      queryParameters: {\n        'id': ?cursor,\n        'like_time': ?cursorTime,\n        'platform': 'web',\n        'mobi_app': 'web',\n        'build': 0,\n        'web_location': 333.40164,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(MsgLikeData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<MsgLikeDetailData>> msgLikeDetail({\n    required Object cardId,\n    required int pn,\n    Object lastMid = 0,\n  }) async {\n    final res = await Request().get(\n      Api.msgLikeDetail,\n      queryParameters: {\n        'card_id': cardId,\n        'pn': pn,\n        'last_mid': lastMid,\n        'platform': 'web',\n        'build': 0,\n        'mobi_app': 'web',\n        'web_location': 333.40164,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(MsgLikeDetailData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<List<MsgSysItem>?>> msgFeedNotify({\n    int? cursor,\n    int pageSize = 20,\n  }) async {\n    final res = await Request().get(\n      Api.msgSysNotify,\n      queryParameters: {\n        'cursor': ?cursor,\n        'page_size': pageSize,\n        'mobi_app': 'web',\n        'build': 0,\n        'web_location': 333.40164,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(\n        (res.data['data'] as List?)\n            ?.map((e) => MsgSysItem.fromJson(e))\n            .toList(),\n      );\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> msgSysUpdateCursor(int cursor) async {\n    String csrf = Accounts.main.csrf;\n    final res = await Request().get(\n      Api.msgSysUpdateCursor,\n      queryParameters: {\n        'csrf': csrf,\n        'cursor': cursor,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<Map>> uploadImage({\n    required dynamic path,\n    required String bucket,\n    required String dir,\n  }) async {\n    final res = await Request().post(\n      Api.uploadImage,\n      data: FormData.fromMap({\n        'bucket': bucket,\n        'file': await MultipartFile.fromFile(path),\n        'dir': dir,\n        'csrf': Accounts.main.csrf,\n      }),\n    );\n    if (res.data['code'] == 0) {\n      return Success(res.data['data']);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<UploadBfsResData>> uploadBfs({\n    required String path,\n    String? category,\n    String? biz,\n    CancelToken? cancelToken,\n  }) async {\n    final res = await Request().post(\n      Api.uploadBfs,\n      data: FormData.fromMap({\n        'file_up': await MultipartFile.fromFile(path),\n        'category': ?category,\n        'biz': ?biz,\n        'csrf': Accounts.main.csrf,\n      }),\n      cancelToken: cancelToken,\n    );\n    if (res.data['code'] == 0) {\n      return Success(UploadBfsResData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> createTextDynamic(\n    Object content,\n  ) async {\n    String csrf = Accounts.main.csrf;\n    Map<String, dynamic> data = await WbiSign.makSign({\n      'dynamic_id': 0,\n      'type': 4,\n      'rid': 0,\n      'content': content,\n      'csrf_token': csrf,\n      'csrf': csrf,\n    });\n    final res = await Request().post(\n      HttpString.tUrl + Api.createTextDynamic,\n      data: data,\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> removeDynamic({\n    required Object dynIdStr,\n    Object? dynType,\n    Object? ridStr,\n  }) async {\n    final res = await Request().post(\n      Api.removeDynamic,\n      queryParameters: {\n        'platform': 'web',\n        'csrf': Accounts.main.csrf,\n      },\n      data: {\n        \"dyn_id_str\": dynIdStr,\n        \"dyn_type\": ?dynType,\n        \"rid_str\": ?ridStr,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> removeMsg(\n    Object talkerId,\n  ) async {\n    String csrf = Accounts.main.csrf;\n    Map<String, dynamic> data = await WbiSign.makSign({\n      'talker_id': talkerId,\n      'session_type': 1,\n      'build': 0,\n      'mobi_app': 'web',\n      'csrf_token': csrf,\n      'csrf': csrf,\n    });\n    final res = await Request().post(\n      HttpString.tUrl + Api.removeMsg,\n      data: data,\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> delMsgfeed(\n    int tp,\n    dynamic id,\n  ) async {\n    String csrf = Accounts.main.csrf;\n    final res = await Request().post(\n      Api.delMsgfeed,\n      data: {\n        'tp': tp,\n        'id': id,\n        'build': 0,\n        'mobi_app': 'web',\n        'csrf_token': csrf,\n        'csrf': csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> delSysMsg(\n    Object id,\n  ) async {\n    String csrf = Accounts.main.csrf;\n    final res = await Request().post(\n      HttpString.messageBaseUrl + Api.delSysMsg,\n      queryParameters: {\n        'mobi_app': 'android',\n        'csrf': csrf,\n      },\n      data: {\n        'csrf': csrf,\n        'ids': [id],\n        'station_ids': [],\n        'type': 4,\n        'mobi_app': 'android',\n      },\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> setTop({\n    required Object talkerId,\n    required int opType,\n  }) async {\n    String csrf = Accounts.main.csrf;\n    Map<String, dynamic> data = await WbiSign.makSign({\n      'talker_id': talkerId,\n      'session_type': 1,\n      'op_type': opType,\n      'build': 0,\n      'mobi_app': 'web',\n      'csrf_token': csrf,\n      'csrf': csrf,\n    });\n    final res = await Request().post(\n      HttpString.tUrl + Api.setTop,\n      data: data,\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 消息标记已读\n  static Future<LoadingState<void>> ackSessionMsg({\n    required int talkerId,\n    required int ackSeqno,\n  }) async {\n    String csrf = Accounts.main.csrf;\n    final params = await WbiSign.makSign({\n      'talker_id': talkerId,\n      'session_type': 1,\n      'ack_seqno': ackSeqno,\n      'build': 0,\n      'mobi_app': 'web',\n      'csrf_token': csrf,\n      'csrf': csrf,\n    });\n    final res = await Request().get(Api.ackSessionMsg, queryParameters: params);\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(\n        \"message: ${res.data['message']},\"\n        \" msg: ${res.data['msg']},\"\n        \" code: ${res.data['code']}\",\n      );\n    }\n  }\n\n  // // 发送私信\n  // static Future<LoadingState<void>> sendMsg({\n  //   required int senderUid,\n  //   required int receiverId,\n  //   int? msgType,\n  //   dynamic content,\n  // }) async {\n  //   String csrf = Accounts.main.csrf;\n  //   final devId = getDevId();\n  //   final data = {\n  //     'msg': {\n  //       'sender_uid': senderUid,\n  //       'receiver_id': receiverId,\n  //       'receiver_type': 1,\n  //       'msg_type': msgType ?? 1,\n  //       'msg_status': 0,\n  //       'dev_id': devId,\n  //       'timestamp': DateTime.now().millisecondsSinceEpoch ~/ 1000,\n  //       'new_face_version': 1,\n  //       'content': content,\n  //     },\n  //     'from_firework': 0,\n  //     'build': 0,\n  //     'mobi_app': 'web',\n  //     'csrf_token': csrf,\n  //     'csrf': csrf,\n  //   };\n  //   Map<String, dynamic> params = await WbiSign.makSign(data);\n  //   final res = await Request().post(\n  //     Api.sendMsg,\n  //     queryParameters: <String, dynamic>{\n  //       'w_sender_uid': senderUid,\n  //       'w_receiver_id': receiverId,\n  //       'w_dev_id': devId,\n  //       'w_rid': params['w_rid'],\n  //       'wts': params['wts'],\n  //     },\n  //     data: data,\n  //     options: Options(\n  //       contentType: Headers.formUrlEncodedContentType,\n  //     ),\n  //   );\n  //   if (res.data['code'] == 0) {\n  //     return const Success(null);\n  //   } else {\n  //     return Error(res.data['message']);\n  //   }\n  // }\n\n  // static String getDevId() {\n  //   return const UuidV4().generate();\n  // }\n\n  static Future<LoadingState<void>> msgSetNotice({\n    required Object id,\n    required int noticeState,\n  }) async {\n    final csrf = Accounts.main.csrf;\n    final res = await Request().post(\n      Api.msgSetNotice,\n      data: {\n        'mobi_app': 'web',\n        'platform': 'web',\n        'tp': 0,\n        'id': id,\n        'notice_state': noticeState,\n        'build': 0,\n        'csrf_token': csrf,\n        'csrf': csrf,\n      },\n      options: Options(\n        contentType: Headers.formUrlEncodedContentType,\n      ),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> setMsgDnd({\n    required Object uid,\n    required int setting,\n    required dndUid,\n  }) async {\n    final csrf = Accounts.main.csrf;\n    final res = await Request().post(\n      Api.setMsgDnd,\n      data: {\n        'uid': uid,\n        'setting': setting,\n        'dnd_uid': dndUid,\n        'build': 0,\n        'mobi_app': 'web',\n        'csrf_token': csrf,\n        'csrf': csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> setPushSs({\n    required int setting,\n    required talkerUid,\n  }) async {\n    final csrf = Accounts.main.csrf;\n    final res = await Request().post(\n      Api.setPushSs,\n      data: {\n        'setting': setting,\n        'talker_uid': talkerUid,\n        'build': 0,\n        'mobi_app': 'web',\n        'csrf_token': csrf,\n        'csrf': csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<List<ImUserInfosData>?>> imUserInfos({\n    required String uids,\n  }) async {\n    final csrf = Accounts.main.csrf;\n    final res = await Request().get(\n      Api.imUserInfos,\n      queryParameters: {\n        'uids': uids,\n        'build': 0,\n        'mobi_app': 'web',\n        'csrf_token': csrf,\n        'csrf': csrf,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(\n        (res.data['data'] as List?)\n            ?.map((e) => ImUserInfosData.fromJson(e))\n            .toList(),\n      );\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<SessionSsData>> getSessionSs({\n    required Object talkerUid,\n  }) async {\n    final csrf = Accounts.main.csrf;\n    final res = await Request().get(\n      Api.getSessionSs,\n      queryParameters: {\n        'talker_uid': talkerUid,\n        'build': 0,\n        'mobi_app': 'web',\n        'csrf_token': csrf,\n        'csrf': csrf,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(SessionSsData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<List<UidSetting>?>> getMsgDnd({\n    required Object uidsStr,\n  }) async {\n    final csrf = Accounts.main.csrf;\n    final res = await Request().get(\n      Api.getMsgDnd,\n      queryParameters: {\n        'own_uid': Accounts.main.mid,\n        'uids_str': uidsStr,\n        'build': 0,\n        'mobi_app': 'web',\n        'csrf_token': csrf,\n        'csrf': csrf,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(\n        (res.data['data']?['uid_settings'] as List?)\n            ?.map((e) => UidSetting.fromJson(e))\n            .toList(),\n      );\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<SingleUnreadData>> msgUnread() async {\n    final res = await Request().get(\n      Api.msgUnread,\n      queryParameters: {\n        'build': 0,\n        'mobi_app': 'web',\n        'unread_type': 0,\n        'web_location': 333.1365,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(SingleUnreadData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<MsgFeedUnreadData>> msgFeedUnread() async {\n    final res = await Request().get(\n      Api.msgFeedUnread,\n      queryParameters: {\n        'build': 0,\n        'mobi_app': 'web',\n        'web_location': 333.1365,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(MsgFeedUnreadData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> imMsgReport({\n    required int accusedUid,\n    required int reasonType,\n    required String reasonDesc,\n    required Map comment,\n    required Map extra,\n  }) async {\n    final res = await Request().post(\n      Api.imMsgReport,\n      data: {\n        'biz_code': 4,\n        'accused_uid': accusedUid,\n        'object_id': accusedUid,\n        'reason_type': reasonType,\n        'reason_desc': reasonDesc,\n        'module': 604,\n        'comment': jsonEncode(comment),\n        'extra': jsonEncode(extra),\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/http/music.dart",
    "content": "import 'package:PiliPlus/http/api.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/music/bgm_detail.dart';\nimport 'package:PiliPlus/models_new/music/bgm_recommend_list.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/wbi_sign.dart';\nimport 'package:dio/dio.dart';\n\nabstract final class MusicHttp {\n  static Future<LoadingState<MusicDetail>> bgmDetail(String musicId) async {\n    final res = await Request().get(\n      Api.bgmDetail,\n      queryParameters: await WbiSign.makSign({\n        'music_id': musicId,\n        'relation_from': 'bgm_page',\n      }),\n    );\n    if (res.data['code'] == 0) {\n      return Success(MusicDetail.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> wishUpdate(\n    String musicId,\n    bool hasLike,\n  ) async {\n    final res = await Request().post(\n      Api.wishUpdate,\n      data: {\n        'music_id': musicId,\n        'state': hasLike ? 2 : 1,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<List<BgmRecommend>?>> bgmRecommend(\n    String musicId,\n  ) async {\n    final res = await Request().get(\n      Api.bgmRecommend,\n      queryParameters: {\n        'music_id': musicId,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(\n        (res.data['data']?['list'] as List?)\n            ?.map((i) => BgmRecommend.fromJson(i))\n            .toList(),\n      );\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/http/pgc.dart",
    "content": "import 'package:PiliPlus/http/api.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/pgc_review_type.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_index_condition/data.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_index_result/data.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_index_result/list.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_review/data.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_timeline/pgc_timeline.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_timeline/result.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:dio/dio.dart';\n\nabstract final class PgcHttp {\n  static Future<LoadingState<PgcIndexResult>> pgcIndexResult({\n    required int page,\n    required Map<String, dynamic> params,\n    seasonType,\n    type,\n    indexType,\n  }) async {\n    final res = await Request().get(\n      Api.pgcIndexResult,\n      queryParameters: {\n        ...params,\n        'season_type': ?seasonType,\n        'type': ?type,\n        'index_type': ?indexType,\n        'page': page,\n        'pagesize': 21,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(PgcIndexResult.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<PgcIndexConditionData>> pgcIndexCondition({\n    Object? seasonType,\n    required Object type,\n    Object? indexType,\n  }) async {\n    final res = await Request().get(\n      Api.pgcIndexCondition,\n      queryParameters: {\n        'season_type': ?seasonType,\n        'type': type,\n        'index_type': ?indexType,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(PgcIndexConditionData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<List<PgcIndexItem>?>> pgcIndex({\n    int? page,\n    int? indexType,\n  }) async {\n    final res = await Request().get(\n      Api.pgcIndexResult,\n      queryParameters: {\n        'st': 1,\n        'order': 3,\n        'season_version': -1,\n        'spoken_language_type': -1,\n        'area': -1,\n        'is_finish': -1,\n        'copyright': -1,\n        'season_status': -1,\n        'season_month': -1,\n        'year': -1,\n        'style_id': -1,\n        'sort': 0,\n        'season_type': 1,\n        'pagesize': 20,\n        'type': 1,\n        'page': page,\n        'index_type': ?indexType,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(PgcIndexResult.fromJson(res.data['data']).list);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<List<TimelineResult>?>> pgcTimeline({\n    int types = 1, // 1：`番剧`<br />3：`电影`<br />4：`国创` |\n    required int before,\n    required int after,\n  }) async {\n    final res = await Request().get(\n      Api.pgcTimeline,\n      queryParameters: {\n        'types': types,\n        'before': before,\n        'after': after,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(PgcTimeline.fromJson(res.data).result);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<PgcReviewData>> pgcReview({\n    required PgcReviewType type,\n    required mediaId,\n    int sort = 0,\n    String? next,\n  }) async {\n    final res = await Request().get(\n      type.api,\n      queryParameters: {\n        'media_id': mediaId,\n        'ps': 20,\n        'sort': sort,\n        'cursor': ?next,\n        'web_location': 666.19,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(PgcReviewData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> pgcReviewLike({\n    required Object mediaId,\n    required Object reviewId,\n  }) async {\n    final res = await Request().post(\n      Api.pgcReviewLike,\n      data: {\n        'media_id': mediaId,\n        'review_type': 2,\n        'review_id': reviewId,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> pgcReviewDislike({\n    required Object mediaId,\n    required Object reviewId,\n  }) async {\n    final res = await Request().post(\n      Api.pgcReviewDislike,\n      data: {\n        'media_id': mediaId,\n        'review_type': 2,\n        'review_id': reviewId,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> pgcReviewPost({\n    required Object mediaId,\n    required int score,\n    required String content,\n    bool shareFeed = false,\n  }) async {\n    final res = await Request().post(\n      Api.pgcReviewPost,\n      data: {\n        'media_id': mediaId,\n        'score': score,\n        'content': content,\n        if (shareFeed) 'share_feed': 1,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> pgcReviewMod({\n    required Object mediaId,\n    required int score,\n    required String content,\n    required reviewId,\n  }) async {\n    final res = await Request().post(\n      Api.pgcReviewMod,\n      data: {\n        'media_id': mediaId,\n        'score': score,\n        'content': content,\n        'review_id': reviewId,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> pgcReviewDel({\n    required Object mediaId,\n    required Object reviewId,\n  }) async {\n    final res = await Request().post(\n      Api.pgcReviewDel,\n      data: {\n        'media_id': mediaId,\n        'review_id': reviewId,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<Map>> seasonStatus(Object seasonId) async {\n    final res = await Request().get(\n      Api.seasonStatus,\n      queryParameters: {'season_id': seasonId},\n    );\n    if (res.data['code'] == 0) {\n      return Success(res.data['result']);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/http/reply.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/http/api.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/emote/data.dart';\nimport 'package:PiliPlus/models_new/emote/package.dart';\nimport 'package:PiliPlus/models_new/reply/data.dart';\nimport 'package:PiliPlus/models_new/reply2reply/data.dart';\nimport 'package:PiliPlus/models_new/reply_interaction/data.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/accounts/account.dart';\nimport 'package:dio/dio.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\n\nabstract final class ReplyHttp {\n  static final Options options = Options(\n    headers: {...Constants.baseHeaders, 'cookie': ''},\n    extra: {'account': const NoAccount()},\n  );\n\n  static Future<LoadingState<ReplyData>> replyList({\n    required bool isLogin,\n    required int oid,\n    required String nextOffset,\n    required int type,\n    required int page,\n    int sort = 1,\n  }) async {\n    final res = !isLogin\n        ? await Request().get(\n            '${Api.replyList}/main',\n            queryParameters: {\n              'oid': oid,\n              'type': type,\n              'pagination_str':\n                  '{\"offset\":\"${nextOffset.replaceAll('\"', '\\\\\"')}\"}',\n              'mode': sort + 2, //2:按时间排序；3：按热度排序\n            },\n            options: !isLogin ? options : null,\n          )\n        : await Request().get(\n            Api.replyList,\n            queryParameters: {\n              'oid': oid,\n              'type': type,\n              'sort': sort,\n              'pn': page,\n              'ps': 20,\n            },\n            options: !isLogin ? options : null,\n          );\n    if (res.data['code'] == 0) {\n      return Success(ReplyData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<ReplyReplyData>> replyReplyList({\n    required bool isLogin,\n    required int oid,\n    required int root,\n    required int pageNum,\n    required int type,\n    bool isCheck = false,\n  }) async {\n    final res = await Request().get(\n      Api.replyReplyList,\n      queryParameters: {\n        'oid': oid,\n        'root': root,\n        'pn': pageNum,\n        'type': type,\n        'sort': 1,\n        if (isLogin) 'csrf': Accounts.main.csrf,\n      },\n      options: !isLogin ? options : null,\n    );\n    if (res.data['code'] == 0) {\n      ReplyReplyData replyData = ReplyReplyData.fromJson(res.data['data']);\n      return Success(replyData);\n    } else {\n      return Error(\n        isCheck\n            ? '${res.data['code']}${res.data['message']}'\n            : res.data['message'],\n      );\n    }\n  }\n\n  static Future<LoadingState<void>> hateReply({\n    required int type,\n    required int action,\n    required int oid,\n    required int rpid,\n  }) async {\n    final res = await Request().post(\n      Api.hateReply,\n      data: {\n        'type': type,\n        'oid': oid,\n        'rpid': rpid,\n        'action': action,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 评论点赞\n  static Future<LoadingState<void>> likeReply({\n    required int type,\n    required int oid,\n    required int rpid,\n    required int action,\n  }) async {\n    final res = await Request().post(\n      Api.likeReply,\n      data: {\n        'type': type,\n        'oid': oid,\n        'rpid': rpid,\n        'action': action,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<List<Package>?>> getEmoteList({\n    String? business,\n  }) async {\n    final res = await Request().get(\n      Api.myEmote,\n      queryParameters: {\n        'business': business ?? 'reply',\n        'web_location': '333.1245',\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(EmoteModelData.fromJson(res.data['data']).packages);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> replyTop({\n    required Object oid,\n    required Object type,\n    required Object rpid,\n    required bool isUpTop,\n  }) async {\n    final res = await Request().post(\n      Api.replyTop,\n      data: {\n        'oid': oid,\n        'type': type,\n        'rpid': rpid,\n        'action': isUpTop ? 0 : 1,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> report({\n    required Object rpid,\n    required Object oid,\n    required int reasonType,\n    bool banUid = true,\n    String? reasonDesc,\n  }) async {\n    final res = await Request().post(\n      '/x/v2/reply/report',\n      data: {\n        'add_blacklist': banUid,\n        'csrf': Accounts.main.csrf,\n        'gaia_source': 'main_h5',\n        'oid': oid,\n        'platform': 'android',\n        'reason': reasonType,\n        'rpid': rpid,\n        'scene': 'main',\n        'type': 1,\n        if (reasonType == 0) 'content': reasonDesc!,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<ReplyInteractData>> replyInteraction({\n    required Object oid,\n    required Object type,\n  }) async {\n    final res = await Request().get(\n      Api.replyInteraction,\n      queryParameters: {\n        'oid': oid,\n        'type': type,\n        'web_location': 333.1369,\n      },\n    );\n    if (res.data['code'] == 0) {\n      try {\n        return Success(ReplyInteractData.fromJson(res.data['data']));\n      } catch (e) {\n        return Error(e.toString());\n      }\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> replySubjectModify({\n    required int oid,\n    required int type,\n    required int action,\n  }) async {\n    final res = await Request().post(\n      Api.replySubjectModify,\n      data: {\n        'oid': oid,\n        'type': type,\n        'action': action,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      if (res.data['data']?['action_toast'] case final String toast) {\n        SmartDialog.showToast(toast);\n      }\n      return const Success(null);\n    } else {\n      SmartDialog.showToast(res.data['message'].toString());\n      return const Error(null);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/http/retry_interceptor.dart",
    "content": "import 'package:dio/dio.dart';\nimport 'package:http2/http2.dart';\n\nclass RetryInterceptor extends Interceptor {\n  final Dio _client;\n  final int _count;\n  final int _delay;\n\n  RetryInterceptor(this._client, this._count, this._delay);\n\n  @override\n  void onError(DioException err, ErrorInterceptorHandler handler) {\n    if (err.requestOptions.responseType == ResponseType.stream) {\n      return handler.next(err);\n    }\n    if (err.response != null) {\n      final options = err.requestOptions;\n      if (options.followRedirects && options.maxRedirects > 0) {\n        final status = err.response!.statusCode;\n        if (status != null && 300 <= status && status < 400) {\n          var redirectUrl = err.response!.headers.value('location');\n          if (redirectUrl != null) {\n            var uri = Uri.parse(redirectUrl);\n            if (!uri.hasScheme) {\n              uri = options.uri.resolveUri(uri);\n              redirectUrl = uri.toString();\n            }\n            (options..path = redirectUrl).maxRedirects--;\n            if (status == 303) {\n              options\n                ..data = null\n                ..method = 'GET';\n            }\n            _client\n                .fetch(options)\n                .then(\n                  (i) => handler.resolve(\n                    i\n                      ..redirects.add(\n                        RedirectRecord(status, options.method, uri),\n                      )\n                      ..isRedirect = true,\n                  ),\n                )\n                .onError<DioException>((error, _) => handler.next(error));\n            return;\n          }\n        }\n      }\n      return handler.next(err);\n    } else {\n      switch (err.type) {\n        case DioExceptionType.connectionError:\n        case DioExceptionType.connectionTimeout:\n        case DioExceptionType.sendTimeout:\n        case DioExceptionType.unknown:\n          if ((err.requestOptions.extra['_rt'] ??= 0) < _count &&\n              err.error\n                  is! TransportConnectionException // 网络中断, 此时请求可能已经被服务器所接收\n                  ) {\n            Future.delayed(\n              Duration(\n                milliseconds: ++err.requestOptions.extra['_rt'] * _delay,\n              ),\n              () => _client\n                  .fetch(err.requestOptions)\n                  .then(handler.resolve)\n                  .onError<DioException>((error, _) => handler.reject(error)),\n            );\n          } else {\n            handler.next(err);\n          }\n          return;\n        default:\n          return handler.next(err);\n      }\n    }\n  }\n\n  RetryInterceptor copyWith({Dio? client, int? count, int? delay}) =>\n      .new(client ?? _client, count ?? _count, delay ?? _delay);\n}\n"
  },
  {
    "path": "lib/http/search.dart",
    "content": "import 'dart:convert';\n\nimport 'package:PiliPlus/http/api.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/search/search_type.dart';\nimport 'package:PiliPlus/models/search/result.dart';\nimport 'package:PiliPlus/models/search/suggest.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_topic_pub_search/data.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/result.dart';\nimport 'package:PiliPlus/models_new/search/search_rcmd/data.dart';\nimport 'package:PiliPlus/models_new/search/search_trending/data.dart';\nimport 'package:PiliPlus/utils/request_utils.dart';\nimport 'package:PiliPlus/utils/wbi_sign.dart';\nimport 'package:dio/dio.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\n\nabstract final class SearchHttp {\n  // 获取搜索建议\n  static Future<LoadingState<SearchSuggestModel>> searchSuggest({\n    required String term,\n  }) async {\n    final res = await Request().get(\n      Api.searchSuggest,\n      queryParameters: {\n        'term': term,\n        'main_ver': 'v1',\n        'highlight': term,\n      },\n    );\n    if (res.data is String) {\n      Map<String, dynamic> resultMap = json.decode(res.data);\n      if (resultMap['code'] == 0) {\n        if (resultMap['result'] is Map) {\n          return Success(SearchSuggestModel.fromJson(resultMap['result']));\n        }\n      }\n    }\n    return const Error(null);\n  }\n\n  // 分类搜索\n  @pragma('vm:notify-debugger-on-exception')\n  static Future<LoadingState<R>> searchByType<R extends SearchNumData>({\n    required SearchType searchType,\n    required String keyword,\n    required page,\n    String? order,\n    int? duration,\n    int? tids,\n    int? orderSort,\n    int? userType,\n    int? categoryId,\n    int? pubBegin,\n    int? pubEnd,\n    String? gaiaVtoken,\n    required ValueChanged<String> onSuccess,\n  }) async {\n    final params = await WbiSign.makSign({\n      'search_type': searchType.name,\n      'keyword': keyword,\n      'page': page,\n      if (order != null && order.isNotEmpty) 'order': order,\n      'duration': ?duration,\n      'tids': ?tids,\n      'order_sort': ?orderSort,\n      'user_type': ?userType,\n      'category_id': ?categoryId,\n      'pubtime_begin_s': ?pubBegin,\n      'pubtime_end_s': ?pubEnd,\n      'page_size': 20,\n      'platform': 'pc',\n      'web_location': 1430654,\n      'gaia_vtoken': ?gaiaVtoken,\n    });\n    final res = await Request().get(\n      Api.searchByType,\n      queryParameters: params,\n      options: Options(\n        headers: {\n          if (gaiaVtoken != null) 'cookie': 'x-bili-gaia-vtoken=$gaiaVtoken',\n          'origin': 'https://search.bilibili.com',\n          'referer':\n              'https://search.bilibili.com/${searchType.name}?keyword=${Uri.encodeFull(keyword)}',\n        },\n      ),\n    );\n    final resData = res.data;\n    if (resData is Map) {\n      if (resData['code'] == 0) {\n        final Map<String, dynamic> dataData = resData['data'];\n        final vVoucher = dataData['v_voucher'];\n        if (vVoucher != null) {\n          RequestUtils.validate(vVoucher, onSuccess);\n          return const Error('触发风控');\n        }\n        dynamic data;\n        try {\n          switch (searchType) {\n            case SearchType.video:\n              data = SearchVideoData.fromJson(dataData);\n              break;\n            case SearchType.live_room:\n              data = SearchLiveData.fromJson(dataData);\n              break;\n            case SearchType.bili_user:\n              data = SearchUserData.fromJson(dataData);\n              break;\n            case SearchType.media_bangumi || SearchType.media_ft:\n              data = SearchPgcData.fromJson(dataData);\n              break;\n            case SearchType.article:\n              data = SearchArticleData.fromJson(dataData);\n              break;\n            // default:\n            //   break;\n          }\n          return Success(data);\n        } catch (e, s) {\n          return Error('$e\\n\\n$s');\n        }\n      } else {\n        return Error(resData['message'], code: resData['code']);\n      }\n    } else {\n      return const Error('服务器错误');\n    }\n  }\n\n  @pragma('vm:notify-debugger-on-exception')\n  static Future<LoadingState<SearchAllData>> searchAll({\n    required String keyword,\n    required page,\n    String? order,\n    int? duration,\n    int? tids,\n    int? orderSort,\n    int? userType,\n    int? categoryId,\n    int? pubBegin,\n    int? pubEnd,\n  }) async {\n    final params = await WbiSign.makSign({\n      'keyword': keyword,\n      'page': page,\n      if (order != null && order.isNotEmpty) 'order': order,\n      'duration': ?duration,\n      'tids': ?tids,\n      'order_sort': ?orderSort,\n      'user_type': ?userType,\n      'category_id': ?categoryId,\n      'pubtime_begin_s': ?pubBegin,\n      'pubtime_end_s': ?pubEnd,\n    });\n    final res = await Request().get(\n      Api.searchAll,\n      queryParameters: params,\n    );\n    if (res.data is! Map) {\n      return const Error('没有相关数据');\n    }\n    if (res.data['code'] == 0) {\n      try {\n        return Success(SearchAllData.fromJson(res.data['data']));\n      } catch (e, s) {\n        return Error('$e\\n\\n$s');\n      }\n    } else {\n      return Error(res.data['message'] ?? '没有相关数据');\n    }\n  }\n\n  static Future<int?> ab2c({dynamic aid, dynamic bvid, int? part}) async {\n    final res = await Request().get(\n      Api.ab2c,\n      queryParameters: {\n        'aid': ?aid,\n        'bvid': ?bvid,\n      },\n    );\n    if (res.data['code'] == 0) {\n      if (res.data['data'] case List list) {\n        return part != null\n            ? (list.elementAtOrNull(part - 1)?['cid'] ??\n                  list.firstOrNull?['cid'])\n            : list.firstOrNull?['cid'];\n      } else {\n        return null;\n      }\n    } else {\n      SmartDialog.showToast(\"ab2c error: ${res.data['message']}\");\n      return null;\n    }\n  }\n\n  static Future<LoadingState<PgcInfoModel>> pgcInfo({\n    dynamic seasonId,\n    dynamic epId,\n  }) async {\n    final res = await Request().get(\n      Api.pgcInfo,\n      queryParameters: {\n        'season_id': ?seasonId,\n        'ep_id': ?epId,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(PgcInfoModel.fromJson(res.data['result']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<PgcInfoModel>> pugvInfo({\n    dynamic seasonId,\n    dynamic epId,\n  }) async {\n    final res = await Request().get(\n      Api.pugvInfo,\n      queryParameters: {\n        'season_id': ?seasonId,\n        'ep_id': ?epId,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(PgcInfoModel.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // static Future<LoadingState> episodeInfo({dynamic epId}) async {\n  //   final res = await Request().get(\n  //     Api.episodeInfo,\n  //     queryParameters: {\n  //       'ep_id': ?epId,\n  //     },\n  //   );\n  //   if (res.data['code'] == 0) {\n  //     return Success(res.data['data']);\n  //   } else {\n  //     return Error(res.data['message']);\n  //   }\n  // }\n\n  static Future<LoadingState<SearchTrendingData>> searchTrending({\n    int limit = 30,\n  }) async {\n    final res = await Request().get(\n      Api.searchTrending,\n      queryParameters: {\n        'limit': limit,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(SearchTrendingData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<SearchRcmdData>> searchRecommend() async {\n    final res = await Request().get(\n      Api.searchRecommend,\n      queryParameters: {\n        'build': 8430300,\n        'channel': 'master',\n        'version': '8.43.0',\n        'c_locale': 'zh_CN',\n        'mobi_app': 'android',\n        'platform': 'android',\n        's_locale': 'zh_CN',\n        'from': 2,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(SearchRcmdData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<TopicPubSearchData>> topicPubSearch({\n    required String keywords,\n    String content = '',\n    required int pageNum,\n  }) async {\n    final res = await Request().get(\n      Api.topicPubSearch,\n      queryParameters: {\n        'keywords': keywords,\n        'content': content,\n        if (pageNum == 1) ...{\n          'page_size': 20,\n          'page_num': 1,\n        } else\n          'offset': 20 * (pageNum - 1),\n        'web_location': 333.1365,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(TopicPubSearchData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/http/sponsor_block.dart",
    "content": "import 'dart:convert';\n\nimport 'package:PiliPlus/build_config.dart';\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/sponsor_block_api.dart';\nimport 'package:PiliPlus/models/common/sponsor_block/post_segment_model.dart';\nimport 'package:PiliPlus/models/common/sponsor_block/segment_type.dart';\nimport 'package:PiliPlus/models_new/sponsor_block/segment_item.dart';\nimport 'package:PiliPlus/models_new/sponsor_block/user_info.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:dio/dio.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\n\n/// https://github.com/hanydd/BilibiliSponsorBlock/wiki/API\nabstract final class SponsorBlock {\n  static String get blockServer => Pref.blockServer;\n  static final options = Options(\n    followRedirects: true,\n    // https://github.com/hanydd/BilibiliSponsorBlock/wiki/API#1-%E5%85%AC%E7%94%A8%E5%8F%82%E6%95%B0\n    headers: kDebugMode\n        ? null\n        : {\n            'origin': Constants.appName,\n            'x-ext-version': BuildConfig.versionName,\n          },\n    validateStatus: (status) => true,\n  );\n\n  static Error getErrMsg(Response res) {\n    String statusMessage = switch (res.statusCode) {\n      200 => '意料之外的响应',\n      400 => '参数错误',\n      403 => '被自动审核机制拒绝',\n      404 => '未找到数据',\n      409 => '重复提交',\n      429 => '提交太快（触发速率控制）',\n      500 => '服务器无法获取信息',\n      -1 => res.data['message'].toString(), // DioException\n      _ => res.statusMessage ?? res.statusCode.toString(),\n    };\n    if (res.statusCode != null && res.statusCode != -1) {\n      final data = res.data;\n      if (res.statusCode == 200 ||\n          (data is String && data.isNotEmpty && data.length < 200)) {\n        statusMessage = '$statusMessage：$data';\n      }\n    }\n    return Error(statusMessage, code: res.statusCode);\n  }\n\n  static String _api(String url) => '$blockServer/api/$url';\n\n  static Future<LoadingState<List<SegmentItemModel>>> getSkipSegments({\n    required String bvid,\n    required int cid,\n  }) async {\n    final res = await Request().get(\n      _api(SponsorBlockApi.skipSegments),\n      queryParameters: {\n        'videoID': bvid,\n        'cid': cid,\n      },\n      options: options,\n    );\n\n    if (res.statusCode == 200) {\n      if (res.data case final List list) {\n        return Success(list.map((i) => SegmentItemModel.fromJson(i)).toList());\n      }\n    }\n    return getErrMsg(res);\n  }\n\n  static Future<LoadingState<void>> voteOnSponsorTime({\n    required String uuid,\n    int? type,\n    SegmentType? category,\n  }) async {\n    assert((type == null) == (category == null));\n    final res = await Request().post(\n      _api(SponsorBlockApi.voteOnSponsorTime),\n      queryParameters: {\n        'UUID': uuid,\n        'type': ?type,\n        'category': ?category?.name,\n        'userID': Pref.blockUserID,\n      },\n      options: options,\n    );\n    return res.statusCode == 200 ? const Success(null) : getErrMsg(res);\n  }\n\n  static Future<LoadingState<void>> viewedVideoSponsorTime(String uuid) async {\n    final res = await Request().post(\n      _api(SponsorBlockApi.viewedVideoSponsorTime),\n      data: {'UUID': uuid},\n      options: options,\n    );\n    return res.statusCode == 200 ? const Success(null) : getErrMsg(res);\n  }\n\n  static Future<LoadingState<void>> uptimeStatus() async {\n    final res = await Request().get(\n      _api(SponsorBlockApi.uptimeStatus),\n      options: options,\n    );\n    if (res.statusCode == 200 &&\n        res.data is String &&\n        Utils.isStringNumeric(res.data)) {\n      return const Success(null);\n    }\n    return getErrMsg(res);\n  }\n\n  static Future<LoadingState<UserInfo>> userInfo(\n    List<String> query, {\n    String? userId,\n  }) async {\n    final res = await Request().get(\n      _api(SponsorBlockApi.userInfo),\n      queryParameters: {\n        'userID': userId ?? Pref.blockUserID,\n        'values': jsonEncode(query),\n      },\n      options: options,\n    );\n    if (res.statusCode == 200) {\n      return Success(UserInfo.fromJson(res.data));\n    }\n    return getErrMsg(res);\n  }\n\n  static Future<LoadingState<List<SegmentItemModel>>> postSkipSegments({\n    required String bvid,\n    required int cid,\n    required double videoDuration,\n    required List<PostSegmentModel> segments,\n  }) async {\n    final res = await Request().post(\n      _api(SponsorBlockApi.skipSegments),\n      data: {\n        'videoID': bvid,\n        'cid': cid.toString(),\n        'userID': Pref.blockUserID,\n        'userAgent': kDebugMode\n            ? Constants.userAgent\n            : '${Constants.appName}/${BuildConfig.versionName}',\n        'videoDuration': videoDuration,\n        'segments': segments\n            .map(\n              (item) => {\n                'segment': [item.segment.first, item.segment.second],\n                'category': item.category.name,\n                'actionType': item.actionType.name,\n              },\n            )\n            .toList(),\n      },\n      options: options,\n    );\n\n    if (res.statusCode == 200) {\n      if (res.data case final List list) {\n        return Success(list.map((i) => SegmentItemModel.fromJson(i)).toList());\n      }\n    }\n    return getErrMsg(res);\n  }\n\n  /// {\n  ///   \"bvID\": string,     // B站视频BVID\n  ///   \"cid\": string,      // 视频CID\n  ///   \"ytbID\": string,    // YouTube视频ID\n  ///   \"UUID\": string,     // 绑定记录的UUID（不是视频中片段的UUID，是绑定记录本身的UUID）\n  ///   \"votes\": int,       // 绑定记录的投票数\n  ///   \"locked\": int,      // 绑定记录是否锁定\n  /// }\n  /// TODO: show port video info dialog\n  static Future<LoadingState<String>> getPortVideo({\n    required String bvid,\n    required int cid,\n  }) async {\n    final res = await Request().get(\n      _api(SponsorBlockApi.portVideo),\n      queryParameters: {\n        'videoID': bvid,\n        'cid': cid.toString(),\n      },\n      options: options,\n    );\n\n    if (res.statusCode == 200) {\n      if (res.data case final Map<String, dynamic> data) {\n        if (data['ytbID'] case String ytbId) {\n          return Success(ytbId);\n        }\n      }\n    }\n    return getErrMsg(res);\n  }\n\n  static Future<LoadingState<String>> postPortVideo({\n    required String bvid,\n    required int cid,\n    required String ytbId,\n    required int videoDuration,\n  }) async {\n    final res = await Request().post(\n      _api(SponsorBlockApi.portVideo),\n      data: {\n        'bvID': bvid,\n        'cid': cid.toString(),\n        'ytbID': ytbId,\n        'userID': Pref.blockUserID,\n        'biliDuration': videoDuration,\n      },\n      options: options,\n    );\n\n    if (res.statusCode == 200) {\n      if (res.data case final Map<String, dynamic> data) {\n        if (data['UUID'] case String uuid) {\n          return Success(uuid);\n        }\n      }\n    }\n    return getErrMsg(res);\n  }\n}\n"
  },
  {
    "path": "lib/http/sponsor_block_api.dart",
    "content": "abstract final class SponsorBlockApi {\n  static const String skipSegments = 'skipSegments';\n  static const String voteOnSponsorTime = 'voteOnSponsorTime';\n  static const String viewedVideoSponsorTime = 'viewedVideoSponsorTime';\n  static const String portVideo = 'portVideo';\n\n  static const String userInfo = 'userInfo';\n  static const String uptimeStatus = 'status/uptime';\n}\n"
  },
  {
    "path": "lib/http/user.dart",
    "content": "import 'package:PiliPlus/http/api.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/user/info.dart';\nimport 'package:PiliPlus/models/user/stat.dart';\nimport 'package:PiliPlus/models_new/coin_log/data.dart';\nimport 'package:PiliPlus/models_new/follow/data.dart';\nimport 'package:PiliPlus/models_new/history/data.dart';\nimport 'package:PiliPlus/models_new/later/data.dart';\nimport 'package:PiliPlus/models_new/login_log/data.dart';\nimport 'package:PiliPlus/models_new/media_list/data.dart';\nimport 'package:PiliPlus/models_new/space_setting/data.dart';\nimport 'package:PiliPlus/models_new/sub/sub/data.dart';\nimport 'package:PiliPlus/models_new/user_real_name/data.dart';\nimport 'package:PiliPlus/models_new/video/video_tag/data.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/accounts/account.dart';\nimport 'package:PiliPlus/utils/app_sign.dart';\nimport 'package:PiliPlus/utils/global_data.dart';\nimport 'package:PiliPlus/utils/wbi_sign.dart';\nimport 'package:dio/dio.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\n\nabstract final class UserHttp {\n  // static Future<dynamic> userStat({required int mid}) async {\n  //   final res = await Request().get(\n  //     Api.userStat,\n  //     queryParameters: {'vmid': mid},\n  //   );\n  //   if (res.data['code'] == 0) {\n  //     return {'status': true, 'data': res.data['data']};\n  //   } else {\n  //     return {'status': false};\n  //   }\n  // }\n\n  static Future<LoadingState<UserInfoData>> userInfo() async {\n    final res = await Request().get(Api.userInfo);\n    if (res.data['code'] == 0) {\n      UserInfoData data = UserInfoData.fromJson(res.data['data']);\n      GlobalData().coins = data.money;\n      return Success(data);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<UserStat>> userStatOwner() async {\n    final res = await Request().get(Api.userStatOwner);\n    if (res.data['code'] == 0) {\n      return Success(UserStat.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 稍后再看\n  static Future<LoadingState<LaterData>> seeYouLater({\n    required int page,\n    int viewed = 0,\n    String keyword = '',\n    bool asc = false,\n  }) async {\n    final res = await Request().get(\n      Api.seeYouLater,\n      queryParameters: await WbiSign.makSign({\n        'pn': page,\n        'ps': 20,\n        'viewed': viewed,\n        'key': keyword,\n        'asc': asc,\n        'need_split': true,\n        'web_location': 333.881,\n      }),\n    );\n    if (res.data['code'] == 0) {\n      return Success(LaterData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 观看历史\n  static Future<LoadingState<HistoryData>> historyList({\n    required String type,\n    int? max,\n    int? viewAt,\n    Account? account,\n  }) async {\n    final res = await Request().get(\n      Api.historyList,\n      queryParameters: {\n        'type': type,\n        'ps': 20,\n        'max': max ?? 0,\n        'view_at': viewAt ?? 0,\n      },\n      options: Options(extra: {'account': account ?? Accounts.history}),\n    );\n    if (res.data['code'] == 0) {\n      return Success(HistoryData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 暂停观看历史\n  static Future<LoadingState<void>> pauseHistory(\n    bool switchStatus, {\n    Account? account,\n  }) async {\n    // 暂停switchStatus传true 否则false\n    account ??= Accounts.history;\n    final res = await Request().post(\n      Api.pauseHistory,\n      data: {\n        'switch': switchStatus,\n        'jsonp': 'jsonp',\n        'csrf': account.csrf,\n      },\n      options: Options(\n        extra: {'account': account},\n        contentType: Headers.formUrlEncodedContentType,\n      ),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 观看历史暂停状态\n  static Future<LoadingState<bool>> historyStatus({Account? account}) async {\n    final res = await Request().get(\n      Api.historyStatus,\n      options: Options(extra: {'account': account ?? Accounts.history}),\n    );\n    if (res.data['code'] == 0) {\n      return Success(res.data['data']);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 清空历史记录\n  static Future<LoadingState<void>> clearHistory({Account? account}) async {\n    account ??= Accounts.history;\n    final res = await Request().post(\n      Api.clearHistory,\n      data: {\n        'jsonp': 'jsonp',\n        'csrf': account.csrf,\n      },\n      options: Options(\n        extra: {'account': account},\n        contentType: Headers.formUrlEncodedContentType,\n      ),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 稍后再看\n  static Future<LoadingState<void>> toViewLater({\n    String? bvid,\n    Object? aid,\n  }) async {\n    assert(aid != null || bvid != null);\n    final res = await Request().post(\n      Api.toViewLater,\n      data: {\n        'aid': ?aid,\n        'bvid': ?bvid,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      SmartDialog.showToast('yeah！稍后再看');\n      return const Success(null);\n    } else {\n      SmartDialog.showToast(res.data['message'].toString());\n      return const Error(null);\n    }\n  }\n\n  // 移除已观看\n  static Future<LoadingState<void>> toViewDel({required String aids}) async {\n    final Map<String, dynamic> params = {\n      'csrf': Accounts.main.csrf,\n      'resources': aids,\n    };\n    final res = await Request().post(\n      Api.toViewDel,\n      data: params,\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      SmartDialog.showToast('yeah！成功移除');\n      return const Success(null);\n    } else {\n      SmartDialog.showToast(res.data['message'].toString());\n      return const Error(null);\n    }\n  }\n\n  // 获取用户凭证 失效\n  // static Future thirdLogin() async {\n  //   final res = await Request().get(\n  //     'https://passport.bilibili.com/login/app/third',\n  //     queryParameters: {\n  //       'appkey': Constants.appKey,\n  //       'api': Constants.thirdApi,\n  //       'sign': Constants.thirdSign,\n  //     },\n  //   );\n  //   try {\n  //     if (res.data['code'] == 0 && res.data['data']['has_login'] == 1) {\n  //       Request().get(res.data['data']['confirm_uri']);\n  //     }\n  //   } catch (err) {\n  //     SmartDialog.showNotify(msg: '获取用户凭证: $err', notifyType: NotifyType.error);\n  //   }\n  // }\n\n  // 清空稍后再看 // clean_type: null->all, 1->invalid, 2->viewed\n  static Future<LoadingState<void>> toViewClear([int? cleanType]) async {\n    final res = await Request().post(\n      Api.toViewClear,\n      data: {\n        'clean_type': ?cleanType,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 删除历史记录\n  static Future<LoadingState<void>> delHistory(\n    String kid, {\n    Account? account,\n  }) async {\n    account ??= Accounts.history;\n    final res = await Request().post(\n      Api.delHistory,\n      data: {\n        'kid': kid,\n        'jsonp': 'jsonp',\n        'csrf': account.csrf,\n      },\n      options: Options(\n        extra: {'account': account},\n        contentType: Headers.formUrlEncodedContentType,\n      ),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<Map>> hasFollow(int mid) async {\n    final res = await Request().get(\n      Api.relation,\n      queryParameters: {\n        'fid': mid,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(res.data['data']);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 搜索历史记录\n  static Future<LoadingState<HistoryData>> searchHistory({\n    required int pn,\n    required String keyword,\n    Account? account,\n  }) async {\n    final res = await Request().get(\n      Api.searchHistory,\n      queryParameters: {\n        'pn': pn,\n        'keyword': keyword,\n        'business': 'all',\n      },\n      options: Options(extra: {'account': account ?? Accounts.history}),\n    );\n    if (res.data['code'] == 0) {\n      return Success(HistoryData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 我的订阅\n  static Future<LoadingState<SubData>> userSubFolder({\n    required int mid,\n    required int pn,\n    required int ps,\n  }) async {\n    final res = await Request().get(\n      Api.userSubFolder,\n      queryParameters: {\n        'up_mid': mid,\n        'ps': ps,\n        'pn': pn,\n        'platform': 'web',\n      },\n    );\n    if (res.data['code'] == 0 && res.data['data'] is Map) {\n      return Success(SubData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<List<VideoTagItem>?>> videoTags({\n    required String bvid,\n    Object? cid,\n  }) async {\n    final res = await Request().get(\n      Api.videoTags,\n      queryParameters: {'bvid': bvid, 'cid': ?cid},\n    );\n    if (res.data['code'] == 0) {\n      return Success(\n        (res.data['data'] as List?)\n            ?.map((e) => VideoTagItem.fromJson(e))\n            .toList(),\n      );\n    } else {\n      return const Error(null);\n    }\n  }\n\n  // 稍后再看列表\n  static Future<LoadingState<MediaListData>> getMediaList({\n    required Object type,\n    required Object bizId,\n    required int ps,\n    dynamic oid,\n    int? otype,\n    bool withCurrent = false,\n    bool desc = true,\n    dynamic sortField = 1,\n    bool direction = false,\n  }) async {\n    final res = await Request().get(\n      Api.mediaList,\n      queryParameters: {\n        'mobi_app': 'web',\n        'type': type,\n        'biz_id': bizId,\n        'oid': ?oid,\n        'otype': ?otype, // ugc:2 // pgc: 24\n        'ps': ps,\n        'direction': direction,\n        'desc': desc,\n        'sort_field': sortField,\n        'tid': 0,\n        'with_current': withCurrent,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(MediaListData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<num?>> getCoin() async {\n    final res = await Request().get(Api.getCoin);\n    if (res.data['code'] == 0) {\n      return Success(res.data['data']?['money']);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> dynamicReport({\n    required Object mid,\n    required Object dynId,\n    required int reasonType,\n    String? reasonDesc,\n  }) async {\n    final res = await Request().post(\n      Api.dynamicReport,\n      queryParameters: {\n        'csrf': Accounts.main.csrf,\n      },\n      data: {\n        \"accused_uid\": mid,\n        \"dynamic_id\": dynId,\n        \"reason_type\": reasonType,\n        \"reason_desc\": reasonType == 0 ? reasonDesc : null,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<SpaceSettingData>> spaceSetting() async {\n    final res = await Request().get(\n      Api.spaceSetting,\n      queryParameters: {\n        'mid': Accounts.main.mid,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(SpaceSettingData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> spaceSettingMod(Map data) async {\n    final res = await Request().post(\n      Api.spaceSettingMod,\n      queryParameters: {\n        'csrf': Accounts.main.csrf,\n      },\n      data: data,\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> vipExpAdd() async {\n    final res = await Request().post(\n      Api.vipExpAdd,\n      queryParameters: {\n        'mid': Accounts.main.mid,\n        'csrf': Accounts.main.csrf,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<CoinLogData>> coinLog() async {\n    final res = await Request().get(\n      Api.coinLog,\n      queryParameters: {\n        'jsonp': 'jsonp',\n        'web_location': '333.33',\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(CoinLogData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<LoginLogData>> loginLog() async {\n    final res = await Request().get(\n      Api.loginLog,\n      queryParameters: {\n        'jsonp': 'jsonp',\n        'web_location': '333.33',\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(LoginLogData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<CoinLogData>> expLog() async {\n    final res = await Request().get(\n      Api.expLog,\n      queryParameters: {\n        'jsonp': 'jsonp',\n        'web_location': '333.33',\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(CoinLogData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<UserRealNameData>> getUserRealName(\n    Object mid,\n  ) async {\n    final params = {\n      'access_key': Accounts.main.accessKey,\n      'up_mid': mid,\n    };\n    AppSign.appSign(params);\n    final res = await Request().get(\n      Api.userRealName,\n      queryParameters: params,\n    );\n    if (res.data['code'] == 0) {\n      return Success(UserRealNameData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<FollowData>> followedUp({\n    required Object mid,\n    required int pn,\n  }) async {\n    final res = await Request().get(\n      Api.followedUp,\n      queryParameters: {\n        'csrf': Accounts.main.csrf,\n        'pn': pn,\n        'vmid': mid,\n        'web_location': 333.789,\n        'x-bili-device-req-json':\n            '{\"platform\":\"web\",\"device\":\"pc\",\"spmid\":\"333.789\"}',\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(FollowData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<FollowData>> sameFollowing({\n    required Object mid,\n    int? pn,\n  }) async {\n    final res = await Request().get(\n      Api.sameFollowing,\n      queryParameters: {\n        'csrf': Accounts.main.csrf,\n        'pn': ?pn,\n        'vmid': mid,\n        'web_location': 333.789,\n        'x-bili-device-req-json':\n            '{\"platform\":\"web\",\"device\":\"pc\",\"spmid\":\"333.789\"}',\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(FollowData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/http/validate.dart",
    "content": "import 'package:PiliPlus/http/api.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:dio/dio.dart';\n\nabstract final class ValidateHttp {\n  static Future<LoadingState<Map?>> gaiaVgateRegister(String vVoucher) async {\n    final res = await Request().post(\n      Api.gaiaVgateRegister,\n      queryParameters: {\n        if (Accounts.main.isLogin) 'csrf': Accounts.main.csrf,\n      },\n      data: {\n        'v_voucher': vVoucher,\n      },\n      options: Options(\n        contentType: Headers.formUrlEncodedContentType,\n      ),\n    );\n    if (res.data['code'] == 0) {\n      return Success(res.data['data']);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<Map?>> gaiaVgateValidate({\n    required dynamic challenge,\n    required dynamic seccode,\n    required dynamic token,\n    required dynamic validate,\n  }) async {\n    final res = await Request().post(\n      Api.gaiaVgateValidate,\n      queryParameters: {\n        if (Accounts.main.isLogin) 'csrf': Accounts.main.csrf,\n      },\n      data: {\n        'challenge': challenge,\n        'seccode': seccode,\n        'token': token,\n        'validate': validate,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(res.data['data']);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/http/video.dart",
    "content": "import 'dart:convert';\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'\n    show ReplyInfo;\nimport 'package:PiliPlus/http/api.dart';\nimport 'package:PiliPlus/http/browser_ua.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/login.dart';\nimport 'package:PiliPlus/models/common/account_type.dart';\nimport 'package:PiliPlus/models/common/video/video_type.dart';\nimport 'package:PiliPlus/models/home/rcmd/result.dart';\nimport 'package:PiliPlus/models/model_hot_video_item.dart';\nimport 'package:PiliPlus/models/model_rec_video_item.dart';\nimport 'package:PiliPlus/models/pgc_lcf.dart';\nimport 'package:PiliPlus/models/video/play/url.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_rank/pgc_rank_item_model.dart';\nimport 'package:PiliPlus/models_new/popular/popular_precious/data.dart';\nimport 'package:PiliPlus/models_new/popular/popular_series_list/list.dart';\nimport 'package:PiliPlus/models_new/popular/popular_series_one/data.dart';\nimport 'package:PiliPlus/models_new/triple/pgc_triple.dart';\nimport 'package:PiliPlus/models_new/triple/ugc_triple.dart';\nimport 'package:PiliPlus/models_new/video/video_ai_conclusion/data.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/data.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/video_detail_response.dart';\nimport 'package:PiliPlus/models_new/video/video_note_list/data.dart';\nimport 'package:PiliPlus/models_new/video/video_play_info/data.dart';\nimport 'package:PiliPlus/models_new/video/video_relation/data.dart';\nimport 'package:PiliPlus/models_new/video/video_shot/data.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/app_sign.dart';\nimport 'package:PiliPlus/utils/extension/string_ext.dart';\nimport 'package:PiliPlus/utils/global_data.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\nimport 'package:PiliPlus/utils/recommend_filter.dart';\nimport 'package:PiliPlus/utils/request_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:PiliPlus/utils/wbi_sign.dart';\nimport 'package:dio/dio.dart';\nimport 'package:flutter/foundation.dart' show compute;\nimport 'package:protobuf/protobuf.dart';\n\n/// view层根据 status 判断渲染逻辑\nabstract final class VideoHttp {\n  static RegExp zoneRegExp = RegExp(Pref.banWordForZone, caseSensitive: false);\n  static bool enableFilter = zoneRegExp.pattern.isNotEmpty;\n\n  // 首页推荐视频\n  static Future<LoadingState<List<RecVideoItemModel>>> rcmdVideoList({\n    required int ps,\n    required int freshIdx,\n  }) async {\n    final res = await Request().get(\n      Api.recommendListWeb,\n      queryParameters: await WbiSign.makSign({\n        'version': 1,\n        'feed_version': 'V8',\n        'homepage_ver': 1,\n        'ps': ps,\n        'fresh_idx': freshIdx,\n        'brush': freshIdx,\n        'fresh_type': 4,\n      }),\n    );\n    if (res.data['code'] == 0) {\n      List<RecVideoItemModel> list = <RecVideoItemModel>[];\n      for (final i in res.data['data']['item']) {\n        //过滤掉live与ad，以及拉黑用户\n        if (i['goto'] == 'av' &&\n            (i['owner'] != null &&\n                !GlobalData().blackMids.contains(i['owner']['mid']))) {\n          RecVideoItemModel videoItem = RecVideoItemModel.fromJson(i);\n          if (!RecommendFilter.filter(videoItem)) {\n            list.add(videoItem);\n          }\n        }\n      }\n      return Success(list);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 添加额外的loginState变量模拟未登录状态\n  static Future<LoadingState<List<RecVideoItemAppModel>>> rcmdVideoListApp({\n    required int freshIdx,\n  }) async {\n    final params = {\n      'build': 2001100,\n      'c_locale': 'zh_CN',\n      'channel': 'master',\n      'column': 4,\n      'device': 'pad',\n      'device_name': 'android',\n      'device_type': 0,\n      'disable_rcmd': 0,\n      'flush': 5,\n      'fnval': 976,\n      'fnver': 0,\n      'force_host': 2, //使用https\n      'fourk': 1,\n      'guidance': 0,\n      'https_url_req': 0,\n      'idx': freshIdx,\n      'mobi_app': 'android_hd',\n      'network': 'wifi',\n      'platform': 'android',\n      'player_net': 1,\n      'pull': freshIdx == 0 ? 'true' : 'false',\n      'qn': 32,\n      'recsys_mode': 0,\n      's_locale': 'zh_CN',\n      'splash_id': '',\n      'statistics': Constants.statistics,\n      'voice_balance': 0,\n    };\n    final res = await Request().get(\n      Api.recommendListApp,\n      queryParameters: params,\n      options: Options(\n        headers: {\n          'buvid': LoginHttp.buvid,\n          'fp_local':\n              '1111111111111111111111111111111111111111111111111111111111111111',\n          'fp_remote':\n              '1111111111111111111111111111111111111111111111111111111111111111',\n          'session_id': '11111111',\n          'env': 'prod',\n          'app-key': 'android_hd',\n          'User-Agent': Constants.userAgent,\n          'x-bili-trace-id': Constants.traceId,\n          'x-bili-aurora-eid': '',\n          'x-bili-aurora-zone': '',\n          'bili-http-engine': 'cronet',\n        },\n      ),\n    );\n    if (res.data['code'] == 0) {\n      List<RecVideoItemAppModel> list = <RecVideoItemAppModel>[];\n      for (final i in res.data['data']['items']) {\n        // 屏蔽推广和拉黑用户\n        if (i['card_goto'] != 'ad_av' &&\n            i['card_goto'] != 'ad_web_s' &&\n            i['ad_info'] == null &&\n            (i['args'] != null &&\n                !GlobalData().blackMids.contains(i['args']['up_id']))) {\n          if (enableFilter &&\n              i['args']?['tname'] != null &&\n              zoneRegExp.hasMatch(i['args']['tname'])) {\n            continue;\n          }\n          RecVideoItemAppModel videoItem = RecVideoItemAppModel.fromJson(i);\n          if (!RecommendFilter.filter(videoItem)) {\n            list.add(videoItem);\n          }\n        }\n      }\n      return Success(list);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 最热视频\n  static Future<LoadingState<List<HotVideoItemModel>>> hotVideoList({\n    required int pn,\n    required int ps,\n  }) async {\n    final res = await Request().get(\n      Api.hotList,\n      queryParameters: {'pn': pn, 'ps': ps},\n    );\n    if (res.data['code'] == 0) {\n      List<HotVideoItemModel> list = <HotVideoItemModel>[];\n      for (final i in res.data['data']['list']) {\n        if (!GlobalData().blackMids.contains(i['owner']['mid']) &&\n            !RecommendFilter.filterTitle(i['title']) &&\n            !RecommendFilter.filterLikeRatio(\n              i['stat']['like'],\n              i['stat']['view'],\n            )) {\n          if (enableFilter &&\n              i['tname'] != null &&\n              zoneRegExp.hasMatch(i['tname'])) {\n            continue;\n          }\n          list.add(HotVideoItemModel.fromJson(i));\n        }\n      }\n      return Success(list);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 视频流\n  @pragma('vm:notify-debugger-on-exception')\n  static Future<LoadingState<PlayUrlModel>> videoUrl({\n    int? avid,\n    String? bvid,\n    required int cid,\n    int? qn,\n    dynamic epid,\n    dynamic seasonId,\n    required bool tryLook,\n    required VideoType videoType,\n    String? language,\n  }) async {\n    final params = await WbiSign.makSign({\n      'avid': ?avid,\n      'bvid': ?bvid,\n      'ep_id': ?epid,\n      'season_id': ?seasonId,\n      'cid': cid,\n      'qn': qn ?? 80,\n      // 获取所有格式的视频\n      'fnval': 4048,\n      'fourk': 1,\n      'fnver': 0,\n      'voice_balance': 1,\n      'gaia_source': 'pre-load',\n      'isGaiaAvoided': true,\n      'web_location': 1315873,\n      // 免登录查看1080p\n      if (tryLook) 'try_look': 1,\n      'cur_language': ?language,\n    });\n\n    try {\n      final res = await Request().get(videoType.api, queryParameters: params);\n\n      if (res.data['code'] == 0) {\n        late PlayUrlModel data;\n        switch (videoType) {\n          case VideoType.ugc:\n            data = PlayUrlModel.fromJson(res.data['data']);\n            break;\n          case VideoType.pugv:\n            final result = res.data['data'];\n            data = PlayUrlModel.fromJson(result)\n              ..lastPlayTime =\n                  result?['play_view_business_info']?['user_status']?['watch_progress']?['current_watch_progress'];\n            break;\n          case VideoType.pgc:\n            final result = res.data['result'];\n            data = PlayUrlModel.fromJson(result['video_info'])\n              ..lastPlayTime =\n                  result?['play_view_business_info']?['user_status']?['watch_progress']?['current_watch_progress'];\n            break;\n        }\n        return Success(data);\n      } else if (epid != null && videoType == VideoType.ugc) {\n        return videoUrl(\n          avid: avid,\n          bvid: bvid,\n          cid: cid,\n          qn: qn,\n          epid: epid,\n          seasonId: seasonId,\n          tryLook: tryLook,\n          videoType: VideoType.pgc,\n        );\n      }\n      return Error(_parseVideoErr(res.data['code'], res.data['message']));\n    } catch (e, s) {\n      return Error('$e\\n\\n$s');\n    }\n  }\n\n  static String _parseVideoErr(int? code, String? msg) {\n    return switch (code) {\n      -404 => '视频不存在或已被删除',\n      87008 => '当前视频可能是专属视频，可能需包月充电观看($msg})',\n      _ => '错误($code): $msg',\n    };\n  }\n\n  // 视频信息 标题、简介\n  static Future<LoadingState<VideoDetailData>> videoIntro({\n    required String bvid,\n  }) async {\n    final res = await Request().get(\n      Api.videoIntro,\n      queryParameters: {'bvid': bvid},\n    );\n    VideoDetailResponse data = VideoDetailResponse.fromJson(res.data);\n    if (data.code == 0) {\n      return Success(data.data!);\n    } else {\n      return Error(data.message);\n    }\n  }\n\n  static Future<LoadingState<VideoRelation>> videoRelation({\n    required String bvid,\n  }) async {\n    final res = await Request().get(\n      Api.videoRelation,\n      queryParameters: {'aid': IdUtils.bv2av(bvid), 'bvid': bvid},\n    );\n    if (res.data['code'] == 0) {\n      return Success(VideoRelation.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 相关视频\n  static Future<LoadingState<List<HotVideoItemModel>?>> relatedVideoList({\n    required String bvid,\n  }) async {\n    final res = await Request().get(\n      Api.relatedList,\n      queryParameters: {'bvid': bvid},\n    );\n    if (res.data['code'] == 0) {\n      final items = (res.data['data'] as List?)?.map(\n        (i) => HotVideoItemModel.fromJson(i),\n      );\n      final list = RecommendFilter.applyFilterToRelatedVideos\n          ? items?.where((i) => !RecommendFilter.filterAll(i)).toList()\n          : items?.toList();\n      return Success(list);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 获取点赞/投币/收藏状态 pgc\n  static Future<LoadingState<PgcLCF>> pgcLikeCoinFav({\n    required Object epId,\n  }) async {\n    final res = await Request().get(\n      Api.pgcLikeCoinFav,\n      queryParameters: {'ep_id': epId},\n    );\n    if (res.data['code'] == 0) {\n      return Success(PgcLCF.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 投币\n  static Future<LoadingState<void>> coinVideo({\n    required String bvid,\n    required int multiply,\n    int selectLike = 0,\n  }) async {\n    final res = await Request().post(\n      Api.coinVideo,\n      data: {\n        'aid': IdUtils.bv2av(bvid).toString(),\n        // 'bvid': bvid,\n        'multiply': multiply.toString(),\n        'select_like': selectLike.toString(),\n        // 'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 一键三连 pgc\n  static Future<LoadingState<PgcTriple>> pgcTriple({\n    required Object epId,\n    Object? seasonId,\n  }) async {\n    final res = await Request().post(\n      Api.pgcTriple,\n      data: {'ep_id': epId, 'csrf': Accounts.main.csrf},\n      options: Options(\n        contentType: Headers.formUrlEncodedContentType,\n        headers: {\n          'origin': 'https://www.bilibili.com',\n          'referer':\n              'https://www.bilibili.com/bangumi/play/${seasonId == null ? \"ep$epId\" : \"ss$seasonId\"}',\n          'user-agent': BrowserUa.pc,\n        },\n      ),\n    );\n    if (res.data['code'] == 0) {\n      return Success(PgcTriple.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 一键三连\n  static Future<LoadingState<UgcTriple>> ugcTriple({\n    required String bvid,\n  }) async {\n    final res = await Request().post(\n      Api.ugcTriple,\n      data: {\n        'aid': IdUtils.bv2av(bvid),\n        'eab_x': 2,\n        'ramval': 0,\n        'source': 'web_normal',\n        'ga': 1,\n        'csrf': Accounts.main.csrf,\n        'spmid': '333.788.0.0',\n        'statistics': '{\"appId\":100,\"platform\":5}',\n      },\n      options: Options(\n        contentType: Headers.formUrlEncodedContentType,\n        headers: {\n          'origin': 'https://www.bilibili.com',\n          'referer': 'https://www.bilibili.com/video/$bvid',\n          'user-agent': BrowserUa.pc,\n        },\n      ),\n    );\n    if (res.data['code'] == 0) {\n      return Success(UgcTriple.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // （取消）点赞\n  static Future<LoadingState<String>> likeVideo({\n    required String bvid,\n    required bool type,\n  }) async {\n    final res = await Request().post(\n      Api.likeVideo,\n      data: {'aid': IdUtils.bv2av(bvid).toString(), 'like': type ? '0' : '1'},\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return Success(res.data['data']['toast']);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // （取消）点踩\n  static Future<LoadingState<void>> dislikeVideo({\n    required String bvid,\n    required bool type,\n  }) async {\n    if (Accounts.main.accessKey.isNullOrEmpty) {\n      return const Error('请退出账号后重新登录');\n    }\n    final res = await Request().post(\n      Api.dislikeVideo,\n      data: {\n        'aid': IdUtils.bv2av(bvid).toString(),\n        'dislike': type ? '0' : '1',\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data is! String && res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data is String ? res.data : res.data['message']);\n    }\n  }\n\n  // 推送不感兴趣反馈\n  static Future<LoadingState<void>> feedDislike({\n    required String goto,\n    required int id,\n    int? reasonId,\n    int? feedbackId,\n  }) async {\n    if (Accounts.get(AccountType.recommend).accessKey.isNullOrEmpty) {\n      return const Error('请退出账号后重新登录');\n    }\n    assert((reasonId != null) ^ (feedbackId != null));\n    final res = await Request().get(\n      Api.feedDislike,\n      queryParameters: {\n        'goto': goto,\n        'id': id,\n        'reason_id': ?reasonId,\n        'feedback_id': ?feedbackId,\n        'build': 1,\n        'mobi_app': 'android',\n      },\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 推送不感兴趣取消\n  static Future<LoadingState<void>> feedDislikeCancel({\n    required String goto,\n    required int id,\n    int? reasonId,\n    int? feedbackId,\n  }) async {\n    if (Accounts.get(AccountType.recommend).accessKey.isNullOrEmpty) {\n      return const Error('请退出账号后重新登录');\n    }\n    final res = await Request().get(\n      Api.feedDislikeCancel,\n      queryParameters: {\n        'goto': goto,\n        'id': id,\n        'reason_id': ?reasonId,\n        'feedback_id': ?feedbackId,\n        'build': 1,\n        'mobi_app': 'android',\n      },\n    );\n    if (res.data['code'] == 0) {\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 发表评论 replyAdd\n\n  // type\tnum\t评论区类型代码\t必要\t类型代码见表\n  // oid\tnum\t目标评论区id\t必要\n  // root\tnum\t根评论rpid\t非必要\t二级评论以上使用\n  // parent\tnum\t父评论rpid\t非必要\t二级评论同根评论id 大于二级评论为要回复的评论id\n  // message\tstr\t发送评论内容\t必要\t最大1000字符\n  // plat\tnum\t发送平台标识\t非必要\t1：web端 2：安卓客户端  3：ios客户端  4：wp客户端\n  static Future<LoadingState<ReplyInfo?>> replyAdd({\n    required int type,\n    required int oid,\n    required String message,\n    int? root,\n    int? parent,\n    List? pictures,\n    bool syncToDynamic = false,\n    Map<String, int>? atNameToMid,\n  }) async {\n    final data = {\n      'type': type,\n      'oid': oid,\n      if (root != null && root != 0) 'root': root,\n      if (parent != null && parent != 0) 'parent': parent,\n      'message': message,\n      if (atNameToMid?.isNotEmpty == true)\n        'at_name_to_mid': jsonEncode(atNameToMid), // {\"name\":uid}\n      if (pictures != null) 'pictures': jsonEncode(pictures),\n      if (syncToDynamic) 'sync_to_dynamic': 1,\n      'csrf': Accounts.main.csrf,\n    };\n    final res = await Request().post(\n      Api.replyAdd,\n      data: data,\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      try {\n        final replyInfo = RequestUtils.replyCast(res.data['data']['reply']);\n        GStorage.reply?.put(\n          replyInfo.id.toString(),\n          (replyInfo.deepCopy()\n                ..unknownFields.clear()\n                ..clearMemberV2()\n                ..clearTrackInfo())\n              .writeToBuffer(),\n        );\n        return Success(replyInfo);\n      } catch (e, s) {\n        Utils.reportError(e, s);\n        return const Success(null);\n      }\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<void>> replyDel({\n    required int type, //replyType\n    required int oid,\n    required int rpid,\n  }) async {\n    final res = await Request().post(\n      Api.replyDel,\n      data: {\n        'type': type, //type.index\n        'oid': oid,\n        'rpid': rpid,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      GStorage.reply?.delete(rpid.toString());\n      return const Success(null);\n    } else {\n      return const Error('请退出账号后重新登录');\n    }\n  }\n\n  // 操作用户关系\n  static Future<LoadingState<void>> relationMod({\n    required int mid,\n    required int act,\n    required int reSrc,\n  }) async {\n    final res = await Request().post(\n      Api.relationMod,\n      queryParameters: {\n        'statistics': '{\"appId\":100,\"platform\":5}',\n        'x-bili-device-req-json':\n            '{\"platform\":\"web\",\"device\":\"pc\",\"spmid\":\"333.1387\"}',\n      },\n      data: {\n        'fid': mid,\n        'act': act,\n        're_src': reSrc,\n        'gaia_source': 'web_main',\n        'spmid': '333.1387',\n        'extend_content': jsonEncode({\n          \"entity\": \"user\",\n          \"entity_id\": mid,\n          'fp': BrowserUa.pc,\n        }),\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(\n        contentType: Headers.formUrlEncodedContentType,\n        headers: {\n          'origin': 'https://space.bilibili.com',\n          'referer': 'https://space.bilibili.com/$mid/dynamic',\n          'user-agent': BrowserUa.pc,\n        },\n      ),\n    );\n    if (res.data['code'] == 0) {\n      if (act == 5) {\n        // block\n        Pref.setBlackMid(mid);\n      } else if (act == 6) {\n        // unblock\n        Pref.removeBlackMid(mid);\n      }\n      return const Success(null);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<void> roomEntryAction({required Object roomId}) {\n    return Request().post(\n      Api.roomEntryAction,\n      queryParameters: {'csrf': Accounts.heartbeat.csrf},\n      data: {'room_id': roomId, 'platform': 'pc'},\n    );\n  }\n\n  static Future<void> historyReport({\n    required Object aid,\n    required Object type,\n  }) {\n    return Request().post(\n      Api.historyReport,\n      data: {'aid': aid, 'type': type, 'csrf': Accounts.heartbeat.csrf},\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n  }\n\n  // 视频播放进度\n  static Future<void> heartBeat({\n    Object? aid,\n    Object? bvid,\n    required Object cid,\n    required Object progress,\n    Object? epid,\n    Object? seasonId,\n    Object? subType,\n    required VideoType videoType,\n  }) {\n    final isPugv = videoType == VideoType.pugv;\n    return Request().post(\n      Api.heartBeat,\n      data: {\n        if (isPugv) 'aid': ?aid else 'bvid': ?bvid,\n        'cid': cid,\n        'epid': ?epid,\n        'sid': ?seasonId,\n        'type': videoType.type,\n        'sub_type': ?subType,\n        'played_time': progress,\n        'csrf': Accounts.heartbeat.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n  }\n\n  static Future<void> medialistHistory({\n    required int desc,\n    required Object oid,\n    required Object upperMid,\n  }) {\n    return Request().post(\n      Api.mediaListHistory,\n      data: {\n        'desc': desc,\n        'oid': oid,\n        'upper_mid': upperMid,\n        'csrf': Accounts.heartbeat.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n  }\n\n  // 添加追番\n  static Future<LoadingState<String>> pgcAdd({int? seasonId}) async {\n    final res = await Request().post(\n      Api.pgcAdd,\n      data: {'season_id': seasonId, 'csrf': Accounts.main.csrf},\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return Success(res.data['result']['toast']);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 取消追番\n  static Future<LoadingState<String>> pgcDel({int? seasonId}) async {\n    final res = await Request().post(\n      Api.pgcDel,\n      data: {'season_id': seasonId, 'csrf': Accounts.main.csrf},\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return Success(res.data['result']['toast']);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<String>> pgcUpdate({\n    required String seasonId,\n    required int status,\n  }) async {\n    final res = await Request().post(\n      Api.pgcUpdate,\n      data: {\n        'season_id': seasonId,\n        'status': status,\n        'csrf': Accounts.main.csrf,\n      },\n      options: Options(contentType: Headers.formUrlEncodedContentType),\n    );\n    if (res.data['code'] == 0) {\n      return Success(res.data['result']['toast']);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // 查看视频同时在看人数\n  static Future<LoadingState<String>> onlineTotal({\n    int? aid,\n    String? bvid,\n    required int cid,\n  }) async {\n    assert(aid != null || bvid != null);\n    final res = await Request().get(\n      Api.onlineTotal,\n      queryParameters: {'aid': aid, 'bvid': bvid, 'cid': cid},\n    );\n    if (res.data['code'] == 0) {\n      return Success(res.data['data']['total']);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<AiConclusionData>> aiConclusion({\n    required String bvid,\n    required int cid,\n    int? upMid,\n  }) async {\n    final params = await WbiSign.makSign({\n      'bvid': bvid,\n      'cid': cid,\n      'up_mid': ?upMid,\n    });\n    final res = await Request().get(Api.aiConclusion, queryParameters: params);\n    final int? code = res.data['code'];\n    if (code == 0) {\n      final int? dataCode = res.data['data']?['code'];\n      if (dataCode == 0) {\n        return Success(AiConclusionData.fromJson(res.data['data']));\n      } else {\n        return Error(null, code: dataCode);\n      }\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<PlayInfoData>> playInfo({\n    String? aid,\n    String? bvid,\n    required int cid,\n    dynamic seasonId,\n    dynamic epId,\n  }) async {\n    assert(aid != null || bvid != null);\n    final res = await Request().get(\n      Api.playInfo,\n      queryParameters: await WbiSign.makSign({\n        'aid': ?aid,\n        'bvid': ?bvid,\n        'cid': cid,\n        'season_id': ?seasonId,\n        'ep_id': ?epId,\n      }),\n    );\n    if (res.data['code'] == 0) {\n      return Success(PlayInfoData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static String _subtitleTimecode(num seconds) {\n    int h = seconds ~/ 3600;\n    seconds %= 3600;\n    int m = seconds ~/ 60;\n    seconds %= 60;\n    String sms = seconds.toStringAsFixed(3).padLeft(6, '0');\n    return h == 0\n        ? \"${m.toString().padLeft(2, '0')}:$sms\"\n        : \"${h.toString().padLeft(2, '0')}:${m.toString().padLeft(2, '0')}:$sms\";\n  }\n\n  static String processList(List list) {\n    final sb = StringBuffer('WEBVTT\\n\\n')\n      ..writeAll(\n        list.map(\n          (item) =>\n              '${item?['sid'] ?? 0}\\n${_subtitleTimecode(item['from'])} --> ${_subtitleTimecode(item['to'])}\\n${item['content'].trim()}',\n        ),\n        '\\n\\n',\n      );\n    return sb.toString();\n  }\n\n  static Future<String?> vttSubtitles(String subtitleUrl) async {\n    final res = await Request().get(\"https:$subtitleUrl\");\n    if (res.data?['body'] case List list) {\n      return compute<List, String>(processList, list);\n    }\n    return null;\n  }\n\n  static bool _canAddRank(Map i) {\n    if (!GlobalData().blackMids.contains(i['owner']['mid']) &&\n        !RecommendFilter.filterTitle(i['title']) &&\n        !RecommendFilter.filterLikeRatio(\n          i['stat']['like'],\n          i['stat']['view'],\n        )) {\n      if (enableFilter &&\n          i['tname'] != null &&\n          zoneRegExp.hasMatch(i['tname'])) {\n        return false;\n      }\n      return true;\n    }\n    return false;\n  }\n\n  // 视频排行\n  static Future<LoadingState<List<HotVideoItemModel>>> getRankVideoList(\n    int rid,\n  ) async {\n    final res = await Request().get(\n      Api.getRankApi,\n      queryParameters: await WbiSign.makSign({'rid': rid, 'type': 'all'}),\n    );\n    if (res.data['code'] == 0) {\n      List<HotVideoItemModel> list = <HotVideoItemModel>[];\n      for (final i in res.data['data']['list']) {\n        if (_canAddRank(i)) {\n          list.add(HotVideoItemModel.fromJson(i));\n          // final List? others = i['others'];\n          // if (others != null && others.isNotEmpty) {\n          //   for (final j in others) {\n          //     if (_canAddRank(j)) {\n          //       list.add(HotVideoItemModel.fromJson(j));\n          //     }\n          //   }\n          // }\n        }\n      }\n      return Success(list);\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // pgc 排行\n  static Future<LoadingState<List<PgcRankItemModel>?>> pgcRankList({\n    int day = 3,\n    required int seasonType,\n  }) async {\n    final res = await Request().get(\n      Api.pgcRank,\n      queryParameters: await WbiSign.makSign({\n        'day': day,\n        'season_type': seasonType,\n      }),\n    );\n    if (res.data['code'] == 0) {\n      return Success(\n        (res.data['result']?['list'] as List?)\n            ?.map((e) => PgcRankItemModel.fromJson(e))\n            .toList(),\n      );\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  // pgc season 排行\n  static Future<LoadingState<List<PgcRankItemModel>?>> pgcSeasonRankList({\n    int day = 3,\n    required int seasonType,\n  }) async {\n    final res = await Request().get(\n      Api.pgcSeasonRank,\n      queryParameters: await WbiSign.makSign({\n        'day': day,\n        'season_type': seasonType,\n      }),\n    );\n    if (res.data['code'] == 0) {\n      return Success(\n        (res.data['data']?['list'] as List?)\n            ?.map((e) => PgcRankItemModel.fromJson(e))\n            .toList(),\n      );\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<VideoNoteData>> getVideoNoteList({\n    dynamic oid,\n    dynamic uperMid,\n    required int page,\n  }) async {\n    final res = await Request().get(\n      Api.archiveNoteList,\n      queryParameters: {\n        'csrf': Accounts.main.csrf,\n        'oid': oid,\n        'oid_type': 0,\n        'pn': page,\n        'ps': 10,\n        'uper_mid': ?uperMid,\n      },\n    );\n    if (res.data['code'] == 0) {\n      return Success(VideoNoteData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<List<PopularSeriesListItem>?>>\n  popularSeriesList() async {\n    final res = await Request().get(\n      Api.popularSeriesList,\n      queryParameters: await WbiSign.makSign({'web_location': 333.934}),\n    );\n    if (res.data['code'] == 0) {\n      return Success(\n        (res.data['data']?['list'] as List<dynamic>?)\n            ?.map(\n              (e) => PopularSeriesListItem.fromJson(e as Map<String, dynamic>),\n            )\n            .toList(),\n      );\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<PopularSeriesOneData>> popularSeriesOne({\n    required int number,\n  }) async {\n    final res = await Request().get(\n      Api.popularSeriesOne,\n      queryParameters: await WbiSign.makSign({\n        'number': number,\n        'web_location': 333.934,\n      }),\n    );\n    if (res.data['code'] == 0) {\n      return Success(PopularSeriesOneData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<PopularPreciousData>> popularPrecious({\n    required int page,\n  }) async {\n    final res = await Request().get(\n      Api.popularPrecious,\n      queryParameters: await WbiSign.makSign({\n        'page_size': 100,\n        'page': page,\n        'web_location': 333.934,\n      }),\n    );\n    if (res.data['code'] == 0) {\n      return Success(PopularPreciousData.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<PlayUrlModel>> tvPlayUrl({\n    required int cid,\n    required int objectId, // aid, epid\n    required int playurlType, // ugc 1, pgc 2\n    int? qn,\n  }) async {\n    final accessKey = Accounts.get(AccountType.video).accessKey;\n    final params = {\n      'access_key': ?accessKey,\n      'actionKey': 'appkey',\n      'cid': cid,\n      'fourk': 1,\n      'is_proj': 1,\n      'mobile_access_key': ?accessKey,\n      'object_id': objectId,\n      'mobi_app': 'android',\n      'platform': 'android',\n      'playurl_type': playurlType,\n      'protocol': 0,\n      'qn': qn ?? 80,\n    };\n    AppSign.appSign(params);\n    final res = await Request().get(Api.tvPlayUrl, queryParameters: params);\n    if (res.data['code'] == 0) {\n      return Success(PlayUrlModel.fromJson(res.data['data']));\n    } else {\n      return Error(res.data['message']);\n    }\n  }\n\n  static Future<LoadingState<VideoShotData>> videoshot({\n    required String bvid,\n    required int cid,\n  }) async {\n    final res = await Request().get(\n      Api.videoshot,\n      queryParameters: {\n        // 'aid': IdUtils.bv2av(_bvid),\n        'bvid': bvid,\n        'cid': cid,\n        'index': 1,\n      },\n      options: Options(\n        headers: {\n          'user-agent': BrowserUa.pc,\n          'referer': 'https://www.bilibili.com/video/$bvid',\n        },\n      ),\n    );\n    if (res.data['code'] == 0) {\n      final data = VideoShotData.fromJson(res.data['data']);\n      if (data.index.isNotEmpty) {\n        return Success(data);\n      } else {\n        return const Error(null);\n      }\n    }\n    return Error(res.data['message']);\n  }\n}\n"
  },
  {
    "path": "lib/main.dart",
    "content": "import 'dart:io';\n\nimport 'package:PiliPlus/build_config.dart';\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/back_detector.dart';\nimport 'package:PiliPlus/common/widgets/custom_toast.dart';\nimport 'package:PiliPlus/common/widgets/route_aware_mixin.dart';\nimport 'package:PiliPlus/common/widgets/scale_app.dart';\nimport 'package:PiliPlus/common/widgets/scroll_behavior.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/models/common/theme/theme_color_type.dart';\nimport 'package:PiliPlus/router/app_pages.dart';\nimport 'package:PiliPlus/services/account_service.dart';\nimport 'package:PiliPlus/services/download/download_service.dart';\nimport 'package:PiliPlus/services/service_locator.dart';\nimport 'package:PiliPlus/utils/cache_manager.dart';\nimport 'package:PiliPlus/utils/calc_window_position.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/json_file_handler.dart';\nimport 'package:PiliPlus/utils/path_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/request_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/theme_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:catcher_2/catcher_2.dart';\nimport 'package:dynamic_color/dynamic_color.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_displaymode/flutter_displaymode.dart';\nimport 'package:flutter_inappwebview/flutter_inappwebview.dart';\nimport 'package:flutter_localizations/flutter_localizations.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:media_kit/media_kit.dart';\nimport 'package:path/path.dart' as path;\nimport 'package:path_provider/path_provider.dart';\nimport 'package:window_manager/window_manager.dart' hide calcWindowPosition;\n\nWebViewEnvironment? webViewEnvironment;\n\nFuture<void> _initDownPath() async {\n  if (PlatformUtils.isDesktop) {\n    final customDownPath = Pref.downloadPath;\n    if (customDownPath != null && customDownPath.isNotEmpty) {\n      try {\n        final dir = Directory(customDownPath);\n        if (!dir.existsSync()) {\n          await dir.create(recursive: true);\n        }\n        downloadPath = customDownPath;\n      } catch (e) {\n        downloadPath = defDownloadPath;\n        await GStorage.setting.delete(SettingBoxKey.downloadPath);\n        if (kDebugMode) {\n          debugPrint('download path error: $e');\n        }\n      }\n    } else {\n      downloadPath = defDownloadPath;\n    }\n  } else if (Platform.isAndroid) {\n    final externalStorageDirPath = (await getExternalStorageDirectory())?.path;\n    downloadPath = externalStorageDirPath != null\n        ? path.join(externalStorageDirPath, PathUtils.downloadDir)\n        : defDownloadPath;\n  } else {\n    downloadPath = defDownloadPath;\n  }\n}\n\nFuture<void> _initTmpPath() async {\n  tmpDirPath = (await getTemporaryDirectory()).path;\n}\n\nFuture<void> _initAppPath() async {\n  appSupportDirPath = (await getApplicationSupportDirectory()).path;\n}\n\nvoid main() async {\n  ScaledWidgetsFlutterBinding.ensureInitialized();\n  MediaKit.ensureInitialized();\n  await _initAppPath();\n  try {\n    await GStorage.init();\n  } catch (e) {\n    await Utils.copyText(e.toString());\n    if (kDebugMode) debugPrint('GStorage init error: $e');\n    exit(0);\n  }\n  ScaledWidgetsFlutterBinding.instance.scaleFactor = Pref.uiScale;\n  await Future.wait([_initDownPath(), _initTmpPath()]);\n  Get\n    ..lazyPut(AccountService.new)\n    ..lazyPut(DownloadService.new);\n  HttpOverrides.global = _CustomHttpOverrides();\n\n  CacheManager.autoClearCache();\n\n  if (PlatformUtils.isMobile) {\n    await Future.wait([\n      SystemChrome.setPreferredOrientations(\n        [\n          DeviceOrientation.portraitUp,\n          if (Pref.horizontalScreen) ...[\n            DeviceOrientation.landscapeLeft,\n            DeviceOrientation.landscapeRight,\n          ],\n        ],\n      ),\n      setupServiceLocator(),\n    ]);\n  } else if (Platform.isWindows) {\n    if (await WebViewEnvironment.getAvailableVersion() != null) {\n      webViewEnvironment = await WebViewEnvironment.create(\n        settings: WebViewEnvironmentSettings(\n          userDataFolder: path.join(appSupportDirPath, 'flutter_inappwebview'),\n        ),\n      );\n    }\n  }\n\n  Request();\n  Request.setCookie();\n  RequestUtils.syncHistoryStatus();\n\n  SmartDialog.config.toast = SmartConfigToast(\n    displayType: SmartToastType.onlyRefresh,\n  );\n\n  if (PlatformUtils.isMobile) {\n    SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);\n    SystemChrome.setSystemUIOverlayStyle(\n      const SystemUiOverlayStyle(\n        systemNavigationBarColor: Colors.transparent,\n        systemNavigationBarDividerColor: Colors.transparent,\n        statusBarColor: Colors.transparent,\n        systemNavigationBarContrastEnforced: false,\n      ),\n    );\n    if (Platform.isAndroid) {\n      FlutterDisplayMode.supported.then((mode) {\n        final String? storageDisplay = GStorage.setting.get(\n          SettingBoxKey.displayMode,\n        );\n        DisplayMode? displayMode;\n        if (storageDisplay != null) {\n          displayMode = mode.firstWhereOrNull(\n            (e) => e.toString() == storageDisplay,\n          );\n        }\n        FlutterDisplayMode.setPreferredMode(displayMode ?? DisplayMode.auto);\n      });\n    }\n  } else if (PlatformUtils.isDesktop) {\n    await windowManager.ensureInitialized();\n\n    final windowOptions = WindowOptions(\n      minimumSize: const Size(400, 720),\n      skipTaskbar: false,\n      titleBarStyle: Pref.showWindowTitleBar\n          ? TitleBarStyle.normal\n          : TitleBarStyle.hidden,\n      title: Constants.appName,\n    );\n    windowManager.waitUntilReadyToShow(windowOptions, () async {\n      final windowSize = Pref.windowSize;\n      await windowManager.setBounds(\n        await calcWindowPosition(windowSize) & windowSize,\n      );\n      if (Pref.isWindowMaximized) await windowManager.maximize();\n      await windowManager.show();\n      await windowManager.focus();\n    });\n  }\n\n  if (Pref.dynamicColor) {\n    await MyApp.initPlatformState();\n  }\n\n  if (Pref.enableLog) {\n    // 异常捕获 logo记录\n    final customParameters = {\n      'BuildConfig':\n          '\\nBuild Time: ${DateFormatUtils.format(BuildConfig.buildTime, format: DateFormatUtils.longFormatDs)}\\n'\n          'Commit Hash: ${BuildConfig.commitHash}',\n    };\n    final fileHandler = await JsonFileHandler.init();\n    final Catcher2Options debugConfig = Catcher2Options(\n      SilentReportMode(),\n      [\n        ?fileHandler,\n        ConsoleHandler(\n          enableDeviceParameters: false,\n          enableApplicationParameters: false,\n          enableCustomParameters: true,\n        ),\n      ],\n      customParameters: customParameters,\n    );\n\n    final Catcher2Options releaseConfig = Catcher2Options(\n      SilentReportMode(),\n      [\n        ?fileHandler,\n        ConsoleHandler(enableCustomParameters: true),\n      ],\n      customParameters: customParameters,\n    );\n\n    Catcher2(\n      debugConfig: debugConfig,\n      releaseConfig: releaseConfig,\n      rootWidget: const MyApp(),\n    );\n  } else {\n    runApp(const MyApp());\n  }\n}\n\nclass MyApp extends StatelessWidget {\n  const MyApp({super.key});\n\n  static ColorScheme? _light, _dark;\n\n  static ThemeData? darkThemeData;\n\n  static void _onBack() {\n    if (SmartDialog.checkExist()) {\n      SmartDialog.dismiss();\n      return;\n    }\n\n    final route = Get.routing.route;\n    if (route is GetPageRoute) {\n      if (route.popDisposition == .doNotPop) {\n        route.onPopInvokedWithResult(false, null);\n        return;\n      }\n    }\n\n    final navigator = Get.key.currentState;\n    if (navigator?.canPop() ?? false) {\n      navigator!.pop();\n    }\n  }\n\n  static (ThemeData, ThemeData) getAllTheme() {\n    final dynamicColor = _light != null && _dark != null && Pref.dynamicColor;\n    late final brandColor = colorThemeTypes[Pref.customColor].color;\n    late final variant = Pref.schemeVariant;\n    return (\n      ThemeUtils.getThemeData(\n        colorScheme: dynamicColor\n            ? _light!\n            : brandColor.asColorSchemeSeed(variant, .light),\n        isDynamic: dynamicColor,\n      ),\n      ThemeUtils.getThemeData(\n        isDark: true,\n        colorScheme: dynamicColor\n            ? _dark!\n            : brandColor.asColorSchemeSeed(variant, .dark),\n        isDynamic: dynamicColor,\n      ),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final (light, dark) = getAllTheme();\n    return GetMaterialApp(\n      title: Constants.appName,\n      theme: light,\n      darkTheme: dark,\n      themeMode: Pref.themeMode,\n      localizationsDelegates: const [\n        GlobalCupertinoLocalizations.delegate,\n        GlobalMaterialLocalizations.delegate,\n        GlobalWidgetsLocalizations.delegate,\n      ],\n      locale: const Locale(\"zh\", \"CN\"),\n      fallbackLocale: const Locale(\"zh\", \"CN\"),\n      supportedLocales: const [Locale(\"zh\", \"CN\"), Locale(\"en\", \"US\")],\n      initialRoute: '/',\n      getPages: Routes.getPages,\n      defaultTransition: Pref.pageTransition,\n      builder: FlutterSmartDialog.init(\n        toastBuilder: (msg) => CustomToast(msg: msg),\n        loadingBuilder: (msg) => LoadingWidget(msg: msg),\n        builder: _builder,\n      ),\n      navigatorObservers: [\n        routeObserver,\n        FlutterSmartDialog.observer,\n      ],\n      scrollBehavior: PlatformUtils.isDesktop\n          ? const CustomScrollBehavior(desktopDragDevices)\n          : null,\n    );\n  }\n\n  static Widget _builder(BuildContext context, Widget? child) {\n    final uiScale = Pref.uiScale;\n    final mediaQuery = MediaQuery.of(context);\n    final textScaler = TextScaler.linear(Pref.defaultTextScale);\n    if (uiScale != 1.0) {\n      child = MediaQuery(\n        data: mediaQuery.copyWith(\n          textScaler: textScaler,\n          size: mediaQuery.size / uiScale,\n          padding: mediaQuery.padding / uiScale,\n          viewInsets: mediaQuery.viewInsets / uiScale,\n          viewPadding: mediaQuery.viewPadding / uiScale,\n          devicePixelRatio: mediaQuery.devicePixelRatio * uiScale,\n        ),\n        child: child!,\n      );\n    } else {\n      child = MediaQuery(\n        data: mediaQuery.copyWith(textScaler: textScaler),\n        child: child!,\n      );\n    }\n    if (PlatformUtils.isDesktop) {\n      return BackDetector(\n        onBack: _onBack,\n        child: child,\n      );\n    }\n    return child;\n  }\n\n  /// from [DynamicColorBuilderState.initPlatformState]\n  static Future<bool> initPlatformState() async {\n    if (_light != null || _dark != null) return true;\n    // Platform messages may fail, so we use a try/catch PlatformException.\n    try {\n      final corePalette = await DynamicColorPlugin.getCorePalette();\n\n      if (corePalette != null) {\n        if (kDebugMode) {\n          debugPrint('dynamic_color: Core palette detected.');\n        }\n        _light = corePalette.toColorScheme();\n        _dark = corePalette.toColorScheme(brightness: Brightness.dark);\n        return true;\n      }\n    } on PlatformException {\n      if (kDebugMode) {\n        debugPrint('dynamic_color: Failed to obtain core palette.');\n      }\n    }\n\n    try {\n      final Color? accentColor = await DynamicColorPlugin.getAccentColor();\n\n      if (accentColor != null) {\n        if (kDebugMode) {\n          debugPrint('dynamic_color: Accent color detected.');\n        }\n        final variant = Pref.schemeVariant;\n        _light = accentColor.asColorSchemeSeed(variant, .light);\n        _dark = accentColor.asColorSchemeSeed(variant, .dark);\n        return true;\n      }\n    } on PlatformException {\n      if (kDebugMode) {\n        debugPrint('dynamic_color: Failed to obtain accent color.');\n      }\n    }\n    if (kDebugMode) {\n      debugPrint('dynamic_color: Dynamic color not detected on this device.');\n    }\n    GStorage.setting.put(SettingBoxKey.dynamicColor, false);\n    return false;\n  }\n}\n\nclass _CustomHttpOverrides extends HttpOverrides {\n  @override\n  HttpClient createHttpClient(SecurityContext? context) {\n    final client = super.createHttpClient(context);\n    // ..maxConnectionsPerHost = 32\n    /// The default value is 15 seconds.\n    //   ..idleTimeout = const Duration(seconds: 15);\n    if (kDebugMode || Pref.badCertificateCallback) {\n      client.badCertificateCallback = (cert, host, port) => true;\n    }\n    return client;\n  }\n}\n"
  },
  {
    "path": "lib/models/common/account_type.dart",
    "content": "enum AccountType {\n  main('主账号'),\n  heartbeat('记录观看'),\n  recommend('推荐'),\n  video('视频取流')\n  ;\n\n  final String title;\n  const AccountType(this.title);\n}\n"
  },
  {
    "path": "lib/models/common/audio_normalization.dart",
    "content": "enum AudioNormalization {\n  disable('禁用'),\n  // ref https://github.com/KRTirtho/spotube/commit/da10ab2e291d4ba4d3082b9a6ae535639fb8f1b7\n  dynaudnorm('预设 dynaudnorm', 'dynaudnorm=g=5:f=250:r=0.9:p=0.5'),\n  loudnorm('预设 loudnorm', 'loudnorm=I=-16:LRA=11:TP=-1.5'),\n  custom('自定义参数')\n  ;\n\n  final String title;\n  final String param;\n  const AudioNormalization(this.title, [this.param = '']);\n\n  static String getTitleFromConfig(String config) => switch (config) {\n    '0' => disable.title,\n    '1' => dynaudnorm.title,\n    '2' => loudnorm.title,\n    _ => config,\n  };\n\n  static String getParamFromConfig(String config) => switch (config) {\n    '0' => disable.param,\n    '1' => dynaudnorm.param,\n    '2' => loudnorm.param,\n    _ => config,\n  };\n}\n"
  },
  {
    "path": "lib/models/common/avatar_badge_type.dart",
    "content": "import 'package:flutter/material.dart';\n\nenum BadgeType {\n  none(),\n  vip('大会员'),\n  person('认证个人', Color(0xFFFFCC00)),\n  institution('认证机构', Colors.lightBlueAccent)\n  ;\n\n  final String? desc;\n  final Color? color;\n  const BadgeType([this.desc, this.color]);\n}\n"
  },
  {
    "path": "lib/models/common/badge_type.dart",
    "content": "// ignore_for_file: constant_identifier_names\n\nenum PBadgeType {\n  primary,\n  secondary,\n  gray,\n  error,\n  line_primary,\n  line_secondary,\n  free,\n  shop,\n}\n\nenum PBadgeSize { medium, small }\n"
  },
  {
    "path": "lib/models/common/bar_hide_type.dart",
    "content": "import 'package:PiliPlus/models/common/enum_with_label.dart';\n\nenum BarHideType with EnumWithLabel {\n  instant('即时'),\n  sync('同步')\n  ;\n\n  @override\n  final String label;\n  const BarHideType(this.label);\n}\n"
  },
  {
    "path": "lib/models/common/dm_block_type.dart",
    "content": "enum DmBlockType {\n  keyword('关键词'),\n  regex('正则'),\n  uid('用户')\n  ;\n\n  final String label;\n  const DmBlockType(this.label);\n}\n"
  },
  {
    "path": "lib/models/common/dynamic/dynamic_badge_mode.dart",
    "content": "enum DynamicBadgeMode {\n  hidden('隐藏'),\n  point('红点'),\n  number('数字')\n  ;\n\n  final String desc;\n  const DynamicBadgeMode(this.desc);\n}\n"
  },
  {
    "path": "lib/models/common/dynamic/dynamics_type.dart",
    "content": "enum DynamicsTabType {\n  all('全部'),\n  video('投稿'),\n  pgc('番剧'),\n  article('专栏'),\n  up('UP')\n  ;\n\n  final String label;\n  const DynamicsTabType(this.label);\n}\n"
  },
  {
    "path": "lib/models/common/dynamic/up_panel_position.dart",
    "content": "enum UpPanelPosition {\n  top('顶部'),\n  leftFixed('左侧常驻'),\n  rightFixed('右侧常驻'),\n  leftDrawer('左侧抽屉'),\n  rightDrawer('右侧抽屉')\n  ;\n\n  final String label;\n  const UpPanelPosition(this.label);\n}\n"
  },
  {
    "path": "lib/models/common/enum_with_label.dart",
    "content": "mixin EnumWithLabel on Enum {\n  String get label;\n}\n"
  },
  {
    "path": "lib/models/common/episode_panel_type.dart",
    "content": "enum EpisodeType {\n  part('分P'),\n  season('合集'),\n  pgc('剧集')\n  ;\n\n  final String title;\n  const EpisodeType(this.title);\n}\n"
  },
  {
    "path": "lib/models/common/fav_order_type.dart",
    "content": "enum FavOrderType {\n  mtime('最近收藏'),\n  view('最多播放'),\n  pubtime('最近投稿')\n  ;\n\n  final String label;\n\n  const FavOrderType(this.label);\n}\n"
  },
  {
    "path": "lib/models/common/fav_type.dart",
    "content": "import 'package:PiliPlus/pages/fav/article/view.dart';\nimport 'package:PiliPlus/pages/fav/cheese/view.dart';\nimport 'package:PiliPlus/pages/fav/note/view.dart';\nimport 'package:PiliPlus/pages/fav/pgc/view.dart';\nimport 'package:PiliPlus/pages/fav/topic/view.dart';\nimport 'package:PiliPlus/pages/fav/video/view.dart';\nimport 'package:flutter/material.dart';\n\nenum FavTabType {\n  video('视频', FavVideoPage()),\n  bangumi('追番', FavPgcPage(type: 1)),\n  cinema('追剧', FavPgcPage(type: 2)),\n  article('专栏', FavArticlePage()),\n  note('笔记', FavNotePage()),\n  topic('话题', FavTopicPage()),\n  cheese('课堂', FavCheesePage())\n  ;\n\n  final String title;\n  final Widget page;\n  const FavTabType(this.title, this.page);\n}\n"
  },
  {
    "path": "lib/models/common/follow_order_type.dart",
    "content": "enum FollowOrderType {\n  def('', '最近关注'),\n  attention('attention', '最常访问')\n  ;\n\n  final String type;\n  final String title;\n\n  const FollowOrderType(this.type, this.title);\n}\n"
  },
  {
    "path": "lib/models/common/home_tab_type.dart",
    "content": "import 'package:PiliPlus/models/common/enum_with_label.dart';\nimport 'package:PiliPlus/pages/common/common_controller.dart';\nimport 'package:PiliPlus/pages/hot/controller.dart';\nimport 'package:PiliPlus/pages/hot/view.dart';\nimport 'package:PiliPlus/pages/live/controller.dart';\nimport 'package:PiliPlus/pages/live/view.dart';\nimport 'package:PiliPlus/pages/pgc/controller.dart';\nimport 'package:PiliPlus/pages/pgc/view.dart';\nimport 'package:PiliPlus/pages/rank/controller.dart';\nimport 'package:PiliPlus/pages/rank/view.dart';\nimport 'package:PiliPlus/pages/rcmd/controller.dart';\nimport 'package:PiliPlus/pages/rcmd/view.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nenum HomeTabType implements EnumWithLabel {\n  live('直播'),\n  rcmd('推荐'),\n  hot('热门'),\n  rank('分区'),\n  bangumi('番剧'),\n  cinema('影视')\n  ;\n\n  @override\n  final String label;\n  const HomeTabType(this.label);\n\n  ScrollOrRefreshMixin Function() get ctr => switch (this) {\n    HomeTabType.live => Get.find<LiveController>,\n    HomeTabType.rcmd => Get.find<RcmdController>,\n    HomeTabType.hot => Get.find<HotController>,\n    HomeTabType.rank => Get.find<RankController>,\n    HomeTabType.bangumi ||\n    HomeTabType.cinema => () => Get.find<PgcController>(tag: name),\n  };\n\n  Widget get page => switch (this) {\n    HomeTabType.live => const LivePage(),\n    HomeTabType.rcmd => const RcmdPage(),\n    HomeTabType.hot => const HotPage(),\n    HomeTabType.rank => const RankPage(),\n    HomeTabType.bangumi => const PgcPage(tabType: HomeTabType.bangumi),\n    HomeTabType.cinema => const PgcPage(tabType: HomeTabType.cinema),\n  };\n}\n"
  },
  {
    "path": "lib/models/common/image_preview_type.dart",
    "content": "enum SourceType { fileImage, networkImage, livePhoto }\n\nclass SourceModel {\n  final SourceType sourceType;\n  final String url;\n  final String? liveUrl;\n  final int? width;\n  final int? height;\n  final bool isLongPic;\n\n  const SourceModel({\n    this.sourceType = SourceType.networkImage,\n    required this.url,\n    this.liveUrl,\n    this.width,\n    this.height,\n    this.isLongPic = false,\n  });\n}\n"
  },
  {
    "path": "lib/models/common/image_type.dart",
    "content": "enum ImageType { avatar, emote, def }\n"
  },
  {
    "path": "lib/models/common/later_view_type.dart",
    "content": "import 'package:PiliPlus/pages/later/child_view.dart';\nimport 'package:flutter/material.dart';\n\nenum LaterViewType {\n  all(0, '全部'),\n  // toView(1, '未看'),\n  unfinished(2, '未看完')\n  // viewed(3, '已看完'),\n  ;\n\n  Widget get page => LaterViewChildPage(laterViewType: this);\n\n  final int type;\n  final String title;\n  const LaterViewType(this.type, this.title);\n}\n"
  },
  {
    "path": "lib/models/common/live/live_contribution_rank_type.dart",
    "content": "// ignore_for_file: constant_identifier_names\n\nenum LiveContributionRankType {\n  online_rank('在线榜', 'contribution_rank'),\n  daily_rank('日榜', 'today_rank'),\n  weekly_rank('周榜', 'current_week_rank'),\n  monthly_rank('月榜', 'current_month_rank')\n  ;\n\n  final String title;\n  final String sw1tch;\n  const LiveContributionRankType(this.title, this.sw1tch);\n}\n"
  },
  {
    "path": "lib/models/common/live/live_dm_silent_type.dart",
    "content": "enum LiveDmSilentType { level, rank, verify }\n"
  },
  {
    "path": "lib/models/common/live/live_search_type.dart",
    "content": "enum LiveSearchType { room, user }\n"
  },
  {
    "path": "lib/models/common/member/contribute_type.dart",
    "content": "enum ContributeType {\n  video,\n  charging,\n  season,\n  series,\n  bangumi,\n  comic,\n}\n"
  },
  {
    "path": "lib/models/common/member/profile_type.dart",
    "content": "enum ProfileType { uname, sign, sex, birthday }\n"
  },
  {
    "path": "lib/models/common/member/search_type.dart",
    "content": "enum MemberSearchType { archive, dynamic }\n"
  },
  {
    "path": "lib/models/common/member/tab_type.dart",
    "content": "import 'package:PiliPlus/utils/storage_pref.dart';\n\nenum MemberTabType {\n  def('默认'),\n  home('主页'),\n  dynamic('动态'),\n  contribute('投稿'),\n  favorite('收藏'),\n  bangumi('番剧'),\n  cheese('课堂'),\n  shop('小店')\n  ;\n\n  static bool showMemberShop = Pref.showMemberShop;\n\n  static bool contains(String type) {\n    if (type == shop.name && !showMemberShop) {\n      return false;\n    }\n    for (final e in MemberTabType.values) {\n      if (e.name == type) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  final String title;\n  const MemberTabType(this.title);\n}\n"
  },
  {
    "path": "lib/models/common/member/user_info_type.dart",
    "content": "import 'package:flutter/material.dart' show Alignment;\n\nenum UserInfoType {\n  fan('粉丝', .centerLeft),\n  follow('关注', .center),\n  like('获赞', .centerRight),\n  ;\n\n  final String title;\n  final Alignment alignment;\n\n  const UserInfoType(this.title, this.alignment);\n}\n"
  },
  {
    "path": "lib/models/common/msg/msg_type.dart",
    "content": "// enum MsgType {\n//   invalid(value: 0, label: \"空空的~\"),\n//   text(value: 1, label: \"文本消息\"),\n//   pic(value: 2, label: \"图片消息\"),\n//   audio(value: 3, label: \"语音消息\"),\n//   share(value: 4, label: \"分享消息\"),\n//   revoke(value: 5, label: \"撤回消息\"),\n//   customFace(value: 6, label: \"自定义表情\"),\n//   shareV2(value: 7, label: \"分享v2消息\"),\n//   sysCancel(value: 8, label: \"系统撤销\"),\n//   miniProgram(value: 9, label: \"小程序\"),\n//   notifyMsg(value: 10, label: \"业务通知\"),\n//   archiveCard(value: 11, label: \"投稿卡片\"),\n//   articleCard(value: 12, label: \"专栏卡片\"),\n//   picCard(value: 13, label: \"图片卡片\"),\n//   commonShare(value: 14, label: \"异形卡片\"),\n//   autoReplyPush(value: 16, label: \"自动回复推送\"),\n//   notifyText(value: 18, label: \"文本提示\");\n\n//   final int value;\n//   final String label;\n//   const MsgType({required this.value, required this.label});\n//   static MsgType parse(int value) {\n//     return MsgType.values\n//         .firstWhere((e) => e.value == value, orElse: () => MsgType.invalid);\n//   }\n// }\n"
  },
  {
    "path": "lib/models/common/msg/msg_unread_type.dart",
    "content": "enum MsgUnReadType {\n  pm('私信'),\n  reply('回复我的'),\n  at('@我'),\n  like('收到的赞'),\n  sysMsg('系统通知')\n  ;\n\n  final String title;\n  const MsgUnReadType(this.title);\n}\n"
  },
  {
    "path": "lib/models/common/nav_bar_config.dart",
    "content": "import 'package:PiliPlus/models/common/enum_with_label.dart';\nimport 'package:PiliPlus/pages/dynamics/view.dart';\nimport 'package:PiliPlus/pages/home/view.dart';\nimport 'package:PiliPlus/pages/mine/view.dart';\nimport 'package:flutter/material.dart';\n\nenum NavigationBarType implements EnumWithLabel {\n  home(\n    '首页',\n    Icon(Icons.home_outlined, size: 23),\n    Icon(Icons.home, size: 21),\n    HomePage(),\n  ),\n  dynamics(\n    '动态',\n    Icon(Icons.motion_photos_on_outlined, size: 21),\n    Icon(Icons.motion_photos_on, size: 21),\n    DynamicsPage(),\n  ),\n  mine(\n    '我的',\n    Icon(Icons.person_outline, size: 21),\n    Icon(Icons.person, size: 21),\n    MinePage(),\n  )\n  ;\n\n  @override\n  final String label;\n  final Icon icon;\n  final Icon selectIcon;\n  final Widget page;\n\n  const NavigationBarType(this.label, this.icon, this.selectIcon, this.page);\n}\n"
  },
  {
    "path": "lib/models/common/pgc_review_type.dart",
    "content": "import 'package:PiliPlus/http/api.dart';\n\nenum PgcReviewType {\n  long(label: '长评', api: Api.pgcReviewL),\n  short(label: '短评', api: Api.pgcReviewS)\n  ;\n\n  final String label;\n  final String api;\n  const PgcReviewType({\n    required this.label,\n    required this.api,\n  });\n}\n\nenum PgcReviewSortType {\n  def('默认', 0),\n  latest('最新', 1)\n  ;\n\n  final int sort;\n  final String label;\n  const PgcReviewSortType(this.label, this.sort);\n}\n"
  },
  {
    "path": "lib/models/common/publish_panel_type.dart",
    "content": "enum PanelType { none, keyboard, emoji, more }\n"
  },
  {
    "path": "lib/models/common/rank_type.dart",
    "content": "enum RankType {\n  all('全站', rid: 0),\n  anime('番剧', seasonType: 1),\n  guochuang('国创', seasonType: 4),\n  douga('动画', rid: 1005),\n  music('音乐', rid: 1003),\n  dance('舞蹈', rid: 1004),\n  game('游戏', rid: 1008),\n  knowledge('知识', rid: 1010),\n  tech('科技', rid: 1012),\n  sports('运动', rid: 1018),\n  car('汽车', rid: 1013),\n  food('美食', rid: 1020),\n  animal('动物', rid: 1024),\n  kichiku('鬼畜', rid: 1007),\n  fashion('时尚', rid: 1014),\n  ent('娱乐', rid: 1002),\n  cinephile('影视', rid: 1001),\n  documentary('记录', seasonType: 3),\n  movie('电影', seasonType: 2),\n  tv('剧集', seasonType: 5),\n  variety('综艺', seasonType: 7)\n  ;\n\n  final String label;\n  final int? rid;\n  final int? seasonType;\n  const RankType(this.label, {this.rid, this.seasonType});\n}\n"
  },
  {
    "path": "lib/models/common/reply/reply_option_type.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\n\nenum ReplyOptionType {\n  allow('允许评论'),\n  close('关闭评论'),\n  choose('精选评论')\n  ;\n\n  final String title;\n  const ReplyOptionType(this.title);\n\n  IconData get iconData => switch (this) {\n    ReplyOptionType.allow => MdiIcons.commentTextOutline,\n    ReplyOptionType.close => MdiIcons.commentOffOutline,\n    ReplyOptionType.choose => MdiIcons.commentProcessingOutline,\n  };\n}\n"
  },
  {
    "path": "lib/models/common/reply/reply_search_type.dart",
    "content": "enum ReplySearchType { video, article }\n"
  },
  {
    "path": "lib/models/common/reply/reply_sort_type.dart",
    "content": "enum ReplySortType {\n  time('最新评论', '最新'),\n  hot('最热评论', '最热'),\n  select('精选评论', '精选')\n  ;\n\n  final String title;\n  final String label;\n  const ReplySortType(this.title, this.label);\n}\n"
  },
  {
    "path": "lib/models/common/reply/reply_type.dart",
    "content": "// enum ReplyType {\n//   unset,\n//   // 视频\n//   video,\n//   // 话题\n//   topic,\n//   //\n//   unset2,\n//   // 活动\n//   activity,\n//   // 小视频\n//   videoS,\n//   // 小黑屋封禁信息\n//   blockMsg,\n//   // 公告信息\n//   publicMsg,\n//   // 直播活动\n//   liveActivity,\n//   // 活动稿件\n//   activityFile,\n//   // 直播公告\n//   livePublic,\n//   // 相簿\n//   album,\n//   // 专栏\n//   column,\n//   // 票务\n//   ticket,\n//   // 音频\n//   audio,\n//   // 风纪委员会\n//   unset3,\n//   // 点评\n//   comment,\n//   // 动态\n//   dynamics,\n//   // 播单\n//   playList,\n//   // 音乐播单\n//   musicPlayList,\n//   // 漫画\n//   comics1,\n//   // 漫画\n//   comics2,\n//   // 漫画\n//   comics3,\n//   // 课程\n//   course,\n// }\n"
  },
  {
    "path": "lib/models/common/search/article_search_type.dart",
    "content": "enum ArticleOrderType {\n  totalrank('综合排序'),\n  pubdate('最新发布'),\n  click('最多点击'),\n  attention('最多喜欢'),\n  scores('最多评论')\n  ;\n\n  String get order => name;\n  final String label;\n  const ArticleOrderType(this.label);\n}\n\nenum ArticleZoneType {\n  all('全部分区', 0),\n  douga('动画', 2),\n  game('游戏', 1),\n  cinephile('影视', 28),\n  life('生活', 3),\n  interest('兴趣', 29),\n  novel('轻小说', 16),\n  tech('科技', 17),\n  note('笔记', 41)\n  ;\n\n  final String label;\n  final int categoryId;\n  const ArticleZoneType(this.label, this.categoryId);\n}\n"
  },
  {
    "path": "lib/models/common/search/search_type.dart",
    "content": "// ignore_for_file: constant_identifier_names\nenum SearchType {\n  // all('综合'),\n  // 视频：video\n  video('视频'),\n  // 番剧：media_bangumi,\n  media_bangumi('番剧'),\n  // 影视：media_ft\n  media_ft('影视'),\n  // 直播间及主播：live\n  // live,\n  // 直播间：live_room\n  live_room('直播间'),\n  // 主播：live_user\n  // live_user,\n  // 话题：topic\n  // topic,\n  // 用户：bili_user\n  bili_user('用户'),\n  // 专栏：article\n  article('专栏')\n  ;\n  // 相簿：photo\n  // photo\n\n  final String label;\n  const SearchType(this.label);\n}\n"
  },
  {
    "path": "lib/models/common/search/user_search_type.dart",
    "content": "enum UserOrderType {\n  def('默认排序', 0, ''),\n  fansDesc('粉丝数由高到低', 0, 'fans'),\n  fansAsc('粉丝数由低到高', 1, 'fans'),\n  levelDesc('Lv等级由高到低', 0, 'level'),\n  levelAsc('Lv等级由低到高', 1, 'level')\n  ;\n\n  final String label;\n  final int orderSort;\n  final String order;\n  const UserOrderType(this.label, this.orderSort, this.order);\n}\n\nenum UserType {\n  all('全部用户'),\n  up('UP主'),\n  common('普通用户'),\n  verified('认证用户')\n  ;\n\n  final String label;\n  const UserType(this.label);\n}\n"
  },
  {
    "path": "lib/models/common/search/video_search_type.dart",
    "content": "enum VideoPubTimeType {\n  all('不限'),\n  day('最近一天'),\n  week('最近一周'),\n  halfYear('最近半年')\n  ;\n\n  final String label;\n  const VideoPubTimeType(this.label);\n}\n\nenum VideoDurationType {\n  all('全部时长'),\n  tenMins('0-10分钟'),\n  halfHour('10-30分钟'),\n  hour('30-60分钟'),\n  hourPlus('60分钟+')\n  ;\n\n  final String label;\n  const VideoDurationType(this.label);\n}\n\nenum VideoZoneType {\n  all('全部'),\n  douga('动画', tids: 1),\n  anime('番剧', tids: 13),\n  guochuang('国创', tids: 167),\n  music('音乐', tids: 3),\n  dance('舞蹈', tids: 129),\n  game('游戏', tids: 4),\n  knowledge('知识', tids: 36),\n  tech('科技', tids: 188),\n  sports('运动', tids: 234),\n  car('汽车', tids: 223),\n  life('生活', tids: 160),\n  food('美食', tids: 221),\n  animal('动物', tids: 217),\n  kichiku('鬼畜', tids: 119),\n  fashion('时尚', tids: 115),\n  info('资讯', tids: 202),\n  ent('娱乐', tids: 5),\n  cinephile('影视', tids: 181),\n  documentary('记录', tids: 177),\n  movie('电影', tids: 23),\n  tv('电视', tids: 11)\n  ;\n\n  final String label;\n  final int? tids;\n  const VideoZoneType(this.label, {this.tids});\n}\n\n// 搜索类型为视频、专栏及相簿时\nenum ArchiveFilterType {\n  totalrank('默认排序'),\n  click('播放多'),\n  pubdate('新发布'),\n  dm('弹幕多'),\n  stow('收藏多'),\n  scores('评论多')\n  ;\n  // 专栏\n  // attention('最多喜欢'),\n\n  final String desc;\n  const ArchiveFilterType(this.desc);\n}\n"
  },
  {
    "path": "lib/models/common/setting_type.dart",
    "content": "enum SettingType {\n  privacySetting('隐私设置'),\n  recommendSetting('推荐流设置'),\n  videoSetting('音视频设置'),\n  playSetting('播放器设置'),\n  styleSetting('外观设置'),\n  extraSetting('其它设置'),\n  webdavSetting('WebDAV 设置'),\n  about('关于')\n  ;\n\n  final String title;\n  const SettingType(this.title);\n}\n"
  },
  {
    "path": "lib/models/common/sponsor_block/action_type.dart",
    "content": "enum ActionType {\n  skip('跳过'),\n  mute('静音'),\n  full('整个视频'),\n  poi('精彩时刻')\n  ;\n\n  final String title;\n  const ActionType(this.title);\n}\n"
  },
  {
    "path": "lib/models/common/sponsor_block/post_segment_model.dart",
    "content": "import 'package:PiliPlus/common/widgets/pair.dart';\nimport 'package:PiliPlus/models/common/sponsor_block/action_type.dart';\nimport 'package:PiliPlus/models/common/sponsor_block/segment_type.dart';\n\nclass PostSegmentModel {\n  PostSegmentModel({\n    required this.segment,\n    required this.category,\n    required this.actionType,\n  });\n  Pair<double, double> segment;\n  SegmentType category;\n  ActionType actionType;\n}\n"
  },
  {
    "path": "lib/models/common/sponsor_block/segment_model.dart",
    "content": "import 'package:PiliPlus/models/common/sponsor_block/segment_type.dart';\nimport 'package:PiliPlus/models/common/sponsor_block/skip_type.dart';\nimport 'package:PiliPlus/models_new/sponsor_block/segment_item.dart';\nimport 'package:PiliPlus/pages/sponsor_block/block_mixin.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\n\nclass SegmentModel implements Comparable<SegmentModel> {\n  SegmentModel({\n    required this.uuid,\n    required this.segmentType,\n    required this.segment,\n    required this.skipType,\n  });\n  final String uuid;\n  final SegmentType segmentType;\n  final (int, int) segment;\n  final SkipType skipType;\n  bool hasSkipped = false;\n\n  factory SegmentModel.fromItemModel(\n    SegmentItemModel model,\n    BlockConfigMixin? config,\n  ) {\n    final segmentType = SegmentType.values.byName(model.category);\n    final segment = (model.segment[0], model.segment[1]);\n    SkipType skipType;\n    if (config != null) {\n      skipType = config.blockSettings[segmentType.index].second;\n      if (skipType != SkipType.showOnly) {\n        if (segment.isEq || segment.length < config.blockLimit) {\n          skipType = SkipType.showOnly;\n        }\n      }\n    } else {\n      skipType = Pref.pgcSkipType;\n    }\n\n    return SegmentModel(\n      uuid: model.uuid,\n      segmentType: segmentType,\n      segment: segment,\n      skipType: skipType,\n    );\n  }\n\n  @override\n  int compareTo(SegmentModel other) => segment.$1.compareTo(other.segment.$1);\n}\n\nextension IntRecordExt on (int, int) {\n  bool get isEq => $1 == $2;\n  int get length => $2 - $1;\n  bool contains(num other) => $1 <= other && other < $2;\n}\n"
  },
  {
    "path": "lib/models/common/sponsor_block/segment_type.dart",
    "content": "// ignore_for_file: constant_identifier_names\n\nimport 'dart:ui';\n\nimport 'package:PiliPlus/models/common/sponsor_block/action_type.dart';\n\nenum SegmentType {\n  sponsor(\n    '赞助/恰饭',\n    '赞助',\n    '付费推广、推荐和直接广告。不是自我推广或免费提及他们喜欢的商品/创作者/网站/产品。',\n    Color(0xFF00d400),\n    [\n      ActionType.skip,\n      ActionType.mute,\n      ActionType.full,\n    ],\n  ),\n  selfpromo(\n    '无偿/自我推广',\n    '推广',\n    '类似于 “赞助广告” ，但无报酬或是自我推广。包括有关商品、捐赠的部分或合作者的信息。',\n    Color(0xFFffff00),\n    [\n      ActionType.skip,\n      ActionType.mute,\n      ActionType.full,\n    ],\n  ),\n  exclusive_access(\n    '独家访问/抢先体验',\n    '品牌合作',\n    '仅用于对整个视频进行标记。适用于展示UP主免费或获得补贴后使用的产品、服务或场地的视频。',\n    Color(0xFF008a5c),\n    [ActionType.full],\n  ),\n  interaction(\n    '三连/互动提醒',\n    '三连提醒',\n    '视频中间简短提醒观众来一键三连或关注。 如果片段较长，或是有具体内容，则应分类为自我推广。',\n    Color(0xFFcc00ff),\n    [\n      ActionType.skip,\n      ActionType.mute,\n    ],\n  ),\n  poi_highlight(\n    '精彩时刻/重点',\n    '精彩时刻',\n    '大部分人都在寻找的空降时间。类似于“封面在12:34”的评论。',\n    Color(0xFFff1684),\n    [ActionType.poi],\n  ),\n  intro(\n    '过场/开场动画',\n    '开场动画',\n    '没有实际内容的间隔片段。可以是暂停、静态帧或重复动画。不适用于包含内容的过场。',\n    Color(0xFF00ffff),\n    [\n      ActionType.skip,\n      ActionType.mute,\n    ],\n  ),\n  outro(\n    '鸣谢/结束画面',\n    '片尾',\n    '致谢画面或片尾画面。不包含内容的结尾。',\n    Color(0xFF0202ed),\n    [\n      ActionType.skip,\n      ActionType.mute,\n    ],\n  ),\n  preview(\n    '回顾/概要',\n    '预览',\n    '展示此视频或同系列视频将出现的画面集锦，片段中所有内容都将在之后的正片中再次出现。',\n    Color(0xFF008fd6),\n    [\n      ActionType.skip,\n      ActionType.mute,\n    ],\n  ),\n  padding(\n    '填充内容/前黑/后黑',\n    '填充内容',\n    '搬运视频片头片尾的纯粹填充内容，如黑屏或无关画面，与视频主体内容无实际意义和关联。',\n    Color(0xFF222222),\n    [ActionType.skip],\n  ),\n  filler(\n    '离题闲聊/玩笑',\n    '离题',\n    \"仅作为填充内容或增添趣味而添加的离题片段，这些内容对理解视频的主要内容并非必需。这不包括提供背景信息或上下文的片段。这是一个非常激进的分类，适用于当你不想看'娱乐性'内容的时候。\",\n    Color(0xFF7300FF),\n    [\n      ActionType.skip,\n      ActionType.mute,\n    ],\n  ),\n  music_offtopic(\n    '音乐:非音乐部分',\n    '非音乐',\n    '仅用于音乐视频。此分类只能用于音乐视频中未包括于其他分类的部分。',\n    Color(0xFFff9900),\n    [ActionType.skip],\n  ),\n  ;\n\n  /// from https://github.com/hanydd/BilibiliSponsorBlock/blob/master/public/_locales/zh_CN/messages.json\n  final String title;\n  final String shortTitle;\n  final String description;\n  final Color color;\n  final List<ActionType> toActionType;\n\n  const SegmentType(\n    this.title,\n    this.shortTitle,\n    this.description,\n    this.color,\n    this.toActionType,\n  );\n}\n\n// List<SegmentType> _actionType2SegmentType(ActionType actionType) {\n//   return switch (actionType) {\n//     ActionType.skip => [\n//         SegmentType.sponsor,\n//         SegmentType.selfpromo,\n//         SegmentType.interaction,\n//         SegmentType.intro,\n//         SegmentType.outro,\n//         SegmentType.preview,\n//         SegmentType.filler,\n//       ],\n//     ActionType.mute => [\n//         SegmentType.sponsor,\n//         SegmentType.selfpromo,\n//         SegmentType.interaction,\n//         SegmentType.intro,\n//         SegmentType.outro,\n//         SegmentType.preview,\n//         SegmentType.music_offtopic,\n//         SegmentType.filler,\n//       ],\n//     ActionType.full => [\n//         SegmentType.sponsor,\n//         SegmentType.selfpromo,\n//         SegmentType.exclusive_access,\n//       ],\n//     ActionType.poi => [\n//         SegmentType.poi_highlight,\n//       ],\n//   };\n// }\n"
  },
  {
    "path": "lib/models/common/sponsor_block/skip_type.dart",
    "content": "import 'package:PiliPlus/models/common/enum_with_label.dart';\n\nenum SkipType implements EnumWithLabel {\n  alwaysSkip('总是跳过'),\n  skipOnce('跳过一次'),\n  skipManually('手动跳过'),\n  showOnly('仅显示'),\n  disable('禁用')\n  ;\n\n  @override\n  final String label;\n  const SkipType(this.label);\n}\n"
  },
  {
    "path": "lib/models/common/stat_type.dart",
    "content": "import 'package:flutter/material.dart' show IconData, Icons;\n\nenum StatType {\n  view(Icons.remove_red_eye_outlined, '观看'),\n  danmaku(Icons.subtitles_outlined, '弹幕'),\n  like(Icons.thumb_up_outlined, '点赞'),\n  reply(Icons.comment_outlined, '评论'),\n  follow(Icons.favorite_border, '关注'),\n  play(Icons.play_circle_outlined, '播放'),\n  listen(Icons.headset_outlined, '播放')\n  ;\n\n  final IconData iconData;\n  final String label;\n  const StatType(this.iconData, this.label);\n}\n"
  },
  {
    "path": "lib/models/common/super_chat_type.dart",
    "content": "enum SuperChatType {\n  valid('有效时间内显示'),\n  persist('常驻显示'),\n  disable('不显示'),\n  ;\n\n  final String title;\n  const SuperChatType(this.title);\n}\n"
  },
  {
    "path": "lib/models/common/super_resolution_type.dart",
    "content": "import 'package:PiliPlus/models/common/enum_with_label.dart';\n\nenum SuperResolutionType with EnumWithLabel {\n  disable('禁用'),\n  efficiency('效率'),\n  quality('画质')\n  ;\n\n  @override\n  final String label;\n  const SuperResolutionType(this.label);\n}\n"
  },
  {
    "path": "lib/models/common/theme/theme_color_type.dart",
    "content": "import 'package:flutter/material.dart';\n\nconst List<({Color color, String label})> colorThemeTypes = [\n  (color: Color(0xFF5CB67B), label: '默认绿'),\n  (color: Color(0xFFFF7299), label: '粉红色'),\n  (color: Colors.red, label: '红色'),\n  (color: Colors.orange, label: '橙色'),\n  (color: Colors.amber, label: '琥珀色'),\n  (color: Colors.yellow, label: '黄色'),\n  (color: Colors.lime, label: '酸橙色'),\n  (color: Colors.lightGreen, label: '浅绿色'),\n  (color: Colors.green, label: '绿色'),\n  (color: Colors.teal, label: '青色'),\n  (color: Colors.cyan, label: '蓝绿色'),\n  (color: Colors.lightBlue, label: '浅蓝色'),\n  (color: Colors.blue, label: '蓝色'),\n  (color: Colors.indigo, label: '靛蓝色'),\n  (color: Colors.purple, label: '紫色'),\n  (color: Colors.deepPurple, label: '深紫色'),\n  (color: Colors.blueGrey, label: '蓝灰色'),\n  (color: Colors.brown, label: '棕色'),\n  (color: Colors.grey, label: '灰色'),\n];\n"
  },
  {
    "path": "lib/models/common/theme/theme_type.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\n\nenum ThemeType {\n  light('浅色'),\n  dark('深色'),\n  system('跟随系统')\n  ;\n\n  final String desc;\n  const ThemeType(this.desc);\n\n  ThemeMode get toThemeMode => switch (this) {\n    ThemeType.light => ThemeMode.light,\n    ThemeType.dark => ThemeMode.dark,\n    ThemeType.system => ThemeMode.system,\n  };\n\n  Icon get icon => switch (this) {\n    ThemeType.light => const Icon(MdiIcons.weatherSunny),\n    ThemeType.dark => const Icon(MdiIcons.weatherNight),\n    ThemeType.system => const Icon(MdiIcons.themeLightDark),\n  };\n}\n"
  },
  {
    "path": "lib/models/common/video/audio_quality.dart",
    "content": "enum AudioQuality {\n  u_100010(100010, '100010'),\n  u_100009(100009, '100009'),\n  u_100008(100008, '100008'),\n  hiRes(30251, 'Hi-Res无损'),\n  dolby_30250(30250, '杜比全景声'),\n  dolby_30255(30255, '杜比全景声'),\n  k192(30280, '192K'),\n  k132(30232, '132K'),\n  k64(30216, '64K')\n  ;\n\n  final int code;\n  final String desc;\n\n  const AudioQuality(this.code, this.desc);\n\n  static final _codeMap = {for (final i in values) i.code: i};\n\n  static AudioQuality fromCode(int code) => _codeMap[code]!;\n}\n"
  },
  {
    "path": "lib/models/common/video/cdn_type.dart",
    "content": "// ignore_for_file: constant_identifier_names\n\n//https://github.com/yujincheng08/BiliRoaming/blob/master/app/src/main/res/values/strings_raw.xml\n//https://github.com/yujincheng08/BiliRoaming/blob/master/app/src/main/res/values/arrays.xml\n\nenum CDNService {\n  baseUrl('基础URL（不推荐）'),\n  backupUrl('备用URL'),\n  ali('ali（阿里云）', 'upos-sz-mirrorali.bilivideo.com'),\n  alib('alib（阿里云）', 'upos-sz-mirroralib.bilivideo.com'),\n  alio1('alio1（阿里云）', 'upos-sz-mirroralio1.bilivideo.com'),\n  cos('cos（腾讯云）', 'upos-sz-mirrorcos.bilivideo.com'),\n  cosb('cosb（腾讯云，VOD加速类型）', 'upos-sz-mirrorcosb.bilivideo.com'),\n  coso1('coso1（腾讯云）', 'upos-sz-mirrorcoso1.bilivideo.com'),\n  hw('hw（华为云，融合CDN）', 'upos-sz-mirrorhw.bilivideo.com'),\n  hwb('hwb（华为云，融合CDN）', 'upos-sz-mirrorhwb.bilivideo.com'),\n  hwo1('hwo1（华为云，融合CDN）', 'upos-sz-mirrorhwo1.bilivideo.com'),\n  hw_08c('08c（华为云，融合CDN）', 'upos-sz-mirror08c.bilivideo.com'),\n  hw_08h('08h（华为云，融合CDN）', 'upos-sz-mirror08h.bilivideo.com'),\n  hw_08ct('08ct（华为云，融合CDN）', 'upos-sz-mirror08ct.bilivideo.com'),\n  tf_hw('tf_hw（华为云）', 'upos-tf-all-hw.bilivideo.com'),\n  tf_tx('tf_tx（腾讯云）', 'upos-tf-all-tx.bilivideo.com'),\n  akamai('akamai（Akamai海外）', 'upos-hz-mirrorakam.akamaized.net'),\n  aliov('aliov（阿里云海外）', 'upos-sz-mirroraliov.bilivideo.com'),\n  cosov('cosov（腾讯云海外）', 'upos-sz-mirrorcosov.bilivideo.com'),\n  hwov('hwov（华为云海外）', 'upos-sz-mirrorhwov.bilivideo.com'),\n  hk_bcache('hk_bcache（Bilibili海外）', 'cn-hk-eq-bcache-01.bilivideo.com')\n  ;\n\n  final String desc;\n  final String? host;\n\n  const CDNService(this.desc, [this.host]);\n}\n\n// from https://rec.danmuji.org/dev/cdn-info/\n// {\n//     'cn-ahwh-ct-': {'01': 16},\n//     'cn-cq-ct-': {'01': 35, '02': 2},\n//     'cn-gddg-ct-': {'01': 36},\n//     'cn-gdfs-ct-': {'01': 28},\n//     'cn-hblf-ct-': {'01': 21},\n//     'cn-hbyc-ct-': {'02': 35},\n//     'cn-hljheb-ct-': {'01': 12},\n//     'cn-hnld-ct-': {'01': 56},\n//     'cn-jsnt-ct-': {'01': 52},\n//     'cn-jsyz-ct-': {'03': 52},\n//     'cn-jxjj-ct-': {'01': 14},\n//     'cn-sccd-ct-': {'01': 32},\n//     'cn-sxxa-ct-': {'03': 14},\n//     'cn-xj-ct-': {'01': 6},\n//     'cn-zjjh-ct-': {'04': 37},\n//     'cn-gddg-cu-': {'01': 15},\n//     'cn-hncs-cu-': {'01': 14, 'v': 6},\n//     'cn-hnly-cu-': {'01': 35},\n//     'cn-jlcc-cu-': {'03': 16},\n//     'cn-jstz-cu-': {'01': 14},\n//     'cn-lnsy-cu-': {'01': 9, 'v': 4},\n//     'cn-nmghhht-cu-': {'01': 15, 'v': 11},\n//     'cn-sccd-cu-': {'01': 13},\n//     'cn-sdqd-cu-': {'01': 25},\n//     'cn-sxty-cu-': {'03': 10},\n//     'cn-sxxa-cu-': {'02': 8},\n//     'cn-zjhz-cu-': {'01': 8, 'v': 6},\n//     'cn-cq-cm-': {'01': 30},\n//     'cn-fjqz-cm-': {'01': 10},\n//     'cn-gddg-cm-': {'01': 14},\n//     'cn-gdst-cm-': {'01': 17},\n//     'cn-hbsjz-cm-': {'02': 16},\n//     'cn-hbwh-cm-': {'01': 23},\n//     'cn-hncs-cm-': {'03': 24},\n//     'cn-hnzz-cm-': {'01': 16},\n//     'cn-jssz-cm-': {'01': 24, '02': 62},\n//     'cn-jxnc-cm-': {'01': 20},\n//     'cn-lnsy-cm-': {'01': 11},\n//     'cn-nmghhht-cm-': {'01': 5},\n//     'cn-sccd-cm-': {'03': 26},\n//     'cn-sdjn-cm-': {'02': 14},\n//     'cn-sxxa-cm-': {'01': 14},\n//     'cn-tj-cm-': {'02': 16},\n//     'cn-xj-cm-': {'02': 6},\n//     'cn-zjhz-cm-': {'01': 29},\n//     'cn-cq-gd-': {'01': 20},\n//     'cn-gdgz-gd-': {'01': 20},\n//     'cn-gzgy-gd-': {'01': 6},\n//     'cn-hb-gd-': {'01': 4},\n//     'cn-hbwh-gd-': {'01': 6},\n//     'cn-hljheb-gd-': {'01': 2},\n//     'cn-hncs-gd-': {'01': 8},\n//     'cn-jlcc-gd-': {'01': 5},\n//     'cn-jsnj-gd-': {'01': 8},\n//     'cn-zjhz-gd-': {'02': 2},\n//     'cn-bj-fx-': {'01': 6},\n//     'cn-fjfz-fx-': {'01': 6},\n//     'cn-gdgz-fx-': {'01': 18},\n//     'cn-hbwh-fx-': {'01': 16},\n//     'cn-hncs-fx-': {'01': 6},\n//     'cn-hnzz-fx-': {'01': 8},\n//     'cn-jsnj-fx-': {'02': 6},\n//     'cn-sccd-fx-': {'01': 6},\n//     'cn-sdjn-fx-': {'01': 6},\n//     'cn-sh-fx-': {'01': 10},\n//     'cn-tj-fx-': {'01': 6},\n//     'cn-bj-se-': {'01': 8},\n//     'cn-bj-cc-': {'03': 18},\n//     'cn-gdfs-cc-': {'02': 21},\n//     'cn-sh-cc-': {'01': 15},\n//     'cn-zjhz-wasu-': {'03': 21, '04': 12},\n//     'cn-sh-ix-': {'01': 13},\n//     'cn-hk-eq-': {'01': 14}\n// }\n"
  },
  {
    "path": "lib/models/common/video/live_quality.dart",
    "content": "enum LiveQuality {\n  dolby(30000, '杜比'),\n  origin4K(25000, '4K 原画'),\n  super4K(20000, '4K'),\n  super2K(15000, '2K'),\n  origin(10000, '原画'),\n  bluRay(400, '蓝光'),\n  superHD(250, '超清'),\n  smooth(150, '高清'),\n  flunt(80, '流畅')\n  ;\n\n  final int code;\n  final String desc;\n  const LiveQuality(this.code, this.desc);\n\n  static LiveQuality? fromCode(int? code) {\n    for (final e in LiveQuality.values) {\n      if (e.code == code) {\n        return e;\n      }\n    }\n    return null;\n  }\n}\n"
  },
  {
    "path": "lib/models/common/video/source_type.dart",
    "content": "import 'package:PiliPlus/grpc/bilibili/app/listener/v1.pbenum.dart'\n    show PlaylistSource;\n\nenum SourceType {\n  normal(\n    mediaType: -1,\n    playlistSource: PlaylistSource.UP_ARCHIVE,\n  ),\n  archive(\n    mediaType: 1,\n    extraId: 1,\n    playlistSource: PlaylistSource.MEDIA_LIST,\n  ),\n  watchLater(\n    mediaType: 2,\n    extraId: 2,\n    playlistSource: PlaylistSource.MEDIA_LIST,\n  ),\n  fav(\n    mediaType: 3,\n    extraId: 2,\n    playlistSource: PlaylistSource.USER_FAVOURITE,\n  ),\n  playlist(\n    mediaType: 3,\n    extraId: 4,\n    playlistSource: PlaylistSource.MEDIA_LIST,\n  ),\n  file\n  ;\n\n  final int? mediaType;\n  final int? extraId;\n  final PlaylistSource? playlistSource;\n  const SourceType({\n    this.mediaType,\n    this.extraId,\n    this.playlistSource,\n  });\n}\n"
  },
  {
    "path": "lib/models/common/video/subtitle_pref_type.dart",
    "content": "enum SubtitlePrefType {\n  off('默认不显示字幕'),\n  on('优先选择非自动生成(ai)字幕'),\n  withoutAi('跳过自动生成(ai)字幕，选择第一个可用字幕'),\n  auto('静音时等同第二项，非静音时等同第三项')\n  ;\n\n  final String desc;\n  const SubtitlePrefType(this.desc);\n}\n"
  },
  {
    "path": "lib/models/common/video/video_decode_type.dart",
    "content": "// ignore_for_file: constant_identifier_names\n\nenum VideoDecodeFormatType {\n  DVH1(['dvh1']),\n  AV1(['av01']),\n  HEVC(['hev1', 'hvc1']),\n  AVC(['avc1'])\n  ;\n\n  String get description => name;\n  final List<String> codes;\n\n  const VideoDecodeFormatType(this.codes);\n\n  static VideoDecodeFormatType fromCode(String code) =>\n      values.firstWhere((i) => i.codes.contains(code));\n\n  static VideoDecodeFormatType fromString(String val) =>\n      values.firstWhere((i) => i.codes.any(val.startsWith));\n}\n"
  },
  {
    "path": "lib/models/common/video/video_quality.dart",
    "content": "enum VideoQuality {\n  hdrVivid(129, 'HDR Vivid', 'HDR Vivid'),\n  super8k(127, '8K 超高清', '8K'),\n  dolbyVision(126, '杜比视界', '杜比'),\n  hdr(125, 'HDR 真彩', 'HDR'),\n  super4K(120, '4K 超高清', '4K'),\n  high108060(116, '1080P 60帧', '1080P60'),\n  high1080plus(112, '1080P 高码率', '1080P+'),\n  high1080(80, '1080P 高清', '1080P'),\n  high72060(74, '720P 60帧', '720P60'),\n  high720(64, '720P 准高清', '720P'),\n  clear480(32, '480P 标清', '480P'),\n  fluent360(16, '360P 流畅', '360P'),\n  speed240(6, '240P 极速', '240P')\n  ;\n\n  final int code;\n  final String desc;\n  final String shortDesc;\n\n  const VideoQuality(this.code, this.desc, this.shortDesc);\n\n  static final _codeMap = {for (final i in values) i.code: i};\n\n  static VideoQuality fromCode(int code) => _codeMap[code]!;\n}\n"
  },
  {
    "path": "lib/models/common/video/video_type.dart",
    "content": "import 'package:PiliPlus/http/api.dart';\n\nenum VideoType {\n  ugc(\n    type: 3,\n    api: Api.ugcUrl,\n  ),\n  pgc(\n    type: 4,\n    api: Api.pgcUrl,\n  ),\n  pugv(\n    type: 10,\n    replyType: 33,\n    api: Api.pugvUrl,\n  )\n  ;\n\n  final int type;\n  final String api;\n  final int replyType;\n  const VideoType({\n    required this.api,\n    required this.type,\n    this.replyType = 1,\n  });\n}\n"
  },
  {
    "path": "lib/models/common/webview_menu_type.dart",
    "content": "enum WebviewMenuItem {\n  refresh('刷新'),\n  copy('复制链接'),\n  openInBrowser('浏览器中打开'),\n  clearCache('清除缓存'),\n  resetCookie('重新设置Cookie'),\n  goBack('返回')\n  ;\n\n  final String title;\n  const WebviewMenuItem(this.title);\n}\n"
  },
  {
    "path": "lib/models/dynamics/article_content_model.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/models/dynamics/result.dart';\nimport 'package:PiliPlus/models/dynamics/vote_model.dart';\n\nclass ArticleContentModel {\n  int? align;\n  int? paraType;\n  Text? text;\n  Format? format;\n  Line? line;\n  Pic? pic;\n  LinkCard? linkCard;\n  Code? code;\n  L1st? list;\n  Text? heading;\n\n  ArticleContentModel.fromJson(Map<String, dynamic> json) {\n    align = json['align'];\n    paraType = json['para_type'];\n    text = json['text'] == null ? null : Text.fromJson(json['text']);\n    format = json['format'] == null ? null : Format.fromJson(json['format']);\n    line = json['line'] == null ? null : Line.fromJson(json['line']);\n    pic = json['pic'] == null ? null : Pic.fromJson(json['pic']);\n    linkCard = json['link_card'] == null\n        ? null\n        : LinkCard.fromJson(json['link_card']);\n    code = json['code'] == null ? null : Code.fromJson(json['code']);\n    list = json['list'] == null ? null : L1st.fromJson(json['list']);\n    heading = json['heading'] == null ? null : Text.fromJson(json['heading']);\n  }\n}\n\nclass Pic {\n  List<Pic>? pics;\n  int? style;\n  String? url;\n  double? width;\n  double? height;\n  num? size;\n  String? liveUrl;\n  bool? isLongPic;\n\n  Pic.fromJson(Map<String, dynamic> json) {\n    url = json['url'];\n    width = (json['width'] as num?)?.toDouble();\n    height = (json['height'] as num?)?.toDouble();\n    size = json['size'];\n    pics = (json['pics'] as List?)?.map((item) => Pic.fromJson(item)).toList();\n    style = json['style'];\n    liveUrl = json['live_url'];\n    if (width != null && height != null) {\n      isLongPic = (height! / width!) > StyleString.imgMaxRatio;\n    }\n  }\n}\n\nclass Line {\n  Line({\n    this.pic,\n  });\n  Pic? pic;\n\n  Line.fromJson(Map<String, dynamic> json) {\n    pic = json['pic'] == null ? null : Pic.fromJson(json['pic']);\n  }\n}\n\nclass Format {\n  Format({\n    this.align,\n  });\n  int? align;\n\n  Format.fromJson(Map<String, dynamic> json) {\n    align = json['align'];\n  }\n}\n\nclass Text {\n  Text({\n    this.nodes,\n  });\n  List<Node>? nodes;\n\n  Text.fromJson(Map<String, dynamic> json) {\n    nodes = (json['nodes'] as List?)\n        ?.map((item) => Node.fromJson(item))\n        .toList();\n  }\n}\n\nclass Node {\n  int? nodeType;\n  Word? word;\n  Rich? rich;\n  Formula? formula;\n  String? type;\n\n  Node.fromJson(Map<String, dynamic> json) {\n    nodeType = json['node_type'];\n    word = json['word'] == null ? null : Word.fromJson(json['word']);\n    rich = json['rich'] == null ? null : Rich.fromJson(json['rich']);\n    formula = json['formula'] == null\n        ? null\n        : Formula.fromJson(json['formula']);\n    type = json['type'];\n  }\n}\n\nclass Formula {\n  String? latexContent;\n\n  Formula.fromJson(Map<String, dynamic> json) {\n    latexContent = json['latex_content'];\n  }\n}\n\nclass Word {\n  String? words;\n  double? fontSize;\n  Style? style;\n  int? color;\n  String? fontLevel;\n\n  Word.fromJson(Map<String, dynamic> json) {\n    words = json['words'];\n    fontSize = (json['font_size'] as num?)?.toDouble();\n    style = json['style'] == null ? null : Style.fromJson(json['style']);\n    color = json['color'] == null\n        ? null\n        : int.tryParse(\n            'FF${(json['color'] as String).substring(1)}',\n            radix: 16,\n          );\n    fontLevel = json['font_level'];\n  }\n}\n\nclass Style {\n  Style({\n    this.bold,\n    this.italic,\n    this.strikethrough,\n  });\n  bool? bold;\n  bool? italic;\n  bool? strikethrough;\n\n  Style.fromJson(Map<String, dynamic> json) {\n    bold = json['bold'];\n    italic = json['italic'];\n    strikethrough = json['strikethrough'];\n  }\n}\n\nclass Rich {\n  Style? style;\n  String? jumpUrl;\n  String? origText;\n  String? text;\n  String? type;\n  String? rid;\n  Emoji? emoji;\n\n  Rich.fromJson(Map<String, dynamic> json) {\n    style = json['style'] == null ? null : Style.fromJson(json['style']);\n    jumpUrl = json['jump_url'];\n    origText = json['orig_text'];\n    text = json['text'];\n    type = json['type'];\n    rid = json['rid'];\n    emoji = json['emoji'] == null ? null : Emoji.fromJson(json['emoji']);\n  }\n}\n\nclass Ugc {\n  String? cover;\n  String? descSecond;\n  String? duration;\n  String? headText;\n  String? idStr;\n  String? jumpUrl;\n  bool? multiLine;\n  String? title;\n\n  Ugc.fromJson(Map<String, dynamic> json) {\n    cover = json['cover'];\n    descSecond = json['desc_second'];\n    duration = json['duration'];\n    headText = json['head_text'];\n    idStr = json['id_str'];\n    jumpUrl = json['jump_url'];\n    multiLine = json['multi_line'];\n    title = json['title'];\n  }\n}\n\nclass Card {\n  String? oid;\n  String? type;\n  Ugc? ugc;\n  ItemNull? itemNull;\n  Common? common;\n  Live? live;\n  Opus? opus;\n  SimpleVoteInfo? vote;\n  Music? music;\n  Goods? goods;\n\n  Card.fromJson(Map<String, dynamic> json) {\n    oid = json['oid'];\n    type = json['type'];\n    ugc = json['ugc'] == null ? null : Ugc.fromJson(json['ugc']);\n    itemNull = json['item_null'] == null\n        ? null\n        : ItemNull.fromJson(json['item_null']);\n    common = json['common'] == null ? null : Common.fromJson(json['common']);\n    live = json['live'] == null ? null : Live.fromJson(json['live']);\n    opus = json['opus'] == null ? null : Opus.fromJson(json['opus']);\n    vote = json['vote'] == null ? null : SimpleVoteInfo.fromJson(json['vote']);\n    music = json['music'] == null ? null : Music.fromJson(json['music']);\n    goods = json['goods'] == null ? null : Goods.fromJson(json['goods']);\n  }\n}\n\nclass Goods {\n  String? headIcon;\n  String? headText;\n  String? jumpUrl;\n  List<GoodsItem>? items;\n\n  Goods.fromJson(Map<String, dynamic> json) {\n    headIcon = json['head_icon'];\n    headText = json['head_text'];\n    jumpUrl = json['jump_url'];\n    items = (json['items'] as List?)\n        ?.map((item) => GoodsItem.fromJson(item))\n        .toList();\n  }\n}\n\nclass GoodsItem {\n  String? brief;\n  String? cover;\n  dynamic id;\n  String? jumpDesc;\n  String? jumpUrl;\n  String? name;\n  String? price;\n\n  GoodsItem.fromJson(Map<String, dynamic> json) {\n    brief = json['brief'];\n    cover = json['cover'];\n    id = json['id'];\n    jumpDesc = json['jump_desc'];\n    jumpUrl = json['jump_url'];\n    name = json['name'];\n    price = json['price'];\n  }\n}\n\nclass Music {\n  String? cover;\n  int? id;\n  String? jumpUrl;\n  String? label;\n  String? title;\n\n  Music.fromJson(Map<String, dynamic> json) {\n    cover = json['cover'];\n    id = json['id'];\n    jumpUrl = json['jump_url'];\n    label = json['label'];\n    title = json['title'];\n  }\n}\n\nclass Opus {\n  int? authorMid;\n  String? authorName;\n  String? cover;\n  String? jumpUrl;\n  String? title;\n  int? statView;\n\n  Opus.fromJson(Map<String, dynamic> json) {\n    authorMid = json['author']?['mid'];\n    authorName = json['author']?['name'];\n    cover = json['cover'];\n    jumpUrl = json['jump_url'];\n    title = json['title'];\n    statView = json['stat']?['view'];\n  }\n}\n\nclass Live {\n  String? cover;\n  String? descFirst;\n  String? descSecond;\n  String? title;\n  String? jumpUrl;\n  int? id;\n  int? liveState;\n  int? reserveType;\n  String? badgeText;\n\n  Live.fromJson(Map<String, dynamic> json) {\n    cover = json['cover'];\n    descFirst = json['desc_first'];\n    descSecond = json['desc_second'];\n    title = json['title'];\n    jumpUrl = json['jump_url'];\n    id = json['id'];\n    liveState = json['live_state'];\n    reserveType = json['reserve_type'];\n    badgeText = json['badge']?['text'];\n  }\n}\n\nclass Common {\n  Common({\n    this.cover,\n    this.desc,\n    this.desc1,\n    this.desc2,\n    this.headText,\n    this.idStr,\n    this.jumpUrl,\n    this.style,\n    this.subType,\n    this.title,\n  });\n  String? cover;\n  String? desc;\n  String? desc1;\n  String? desc2;\n  String? headText;\n  String? idStr;\n  String? jumpUrl;\n  int? style;\n  String? subType;\n  String? title;\n  String? titlePrefix;\n\n  Common.fromJson(Map<String, dynamic> json) {\n    cover = json['cover'];\n    desc = json['desc'];\n    desc1 = json['desc1'];\n    desc2 = json['desc2'];\n    headText = json['head_text'];\n    idStr = json['id_str'];\n    jumpUrl = json['jump_url'];\n    style = json['style'];\n    subType = json['sub_type'];\n    title = json['title'];\n    titlePrefix = json['title_prefix'];\n  }\n}\n\nclass ItemNull {\n  ItemNull({\n    this.icon,\n    this.text,\n  });\n  String? icon;\n  String? text;\n\n  ItemNull.fromJson(Map<String, dynamic> json) {\n    icon = json['icon'];\n    text = json['text'];\n  }\n}\n\nclass LinkCard {\n  LinkCard({\n    this.card,\n  });\n  Card? card;\n\n  LinkCard.fromJson(Map<String, dynamic> json) {\n    card = json['card'] == null ? null : Card.fromJson(json['card']);\n  }\n}\n\nclass L1st {\n  List<Item>? items;\n  int? style;\n\n  L1st.fromJson(Map<String, dynamic> json) {\n    items = (json['items'] as List?)?.map((e) => Item.fromJson(e)).toList();\n    style = json['style'];\n  }\n}\n\nclass Item {\n  int? level;\n  int? order;\n  List<Node>? nodes;\n\n  Item.fromJson(Map<String, dynamic> json) {\n    level = json['level'];\n    order = json['order'];\n    nodes = (json['nodes'] as List?)?.map((e) => Node.fromJson(e)).toList();\n  }\n}\n\nclass Code {\n  String? content;\n  String? lang;\n\n  Code.fromJson(Map<String, dynamic> json) {\n    content = json['content'];\n    lang = json['lang'];\n  }\n}\n"
  },
  {
    "path": "lib/models/dynamics/result.dart",
    "content": "import 'dart:convert';\n\nimport 'package:PiliPlus/common/widgets/pendant_avatar.dart';\nimport 'package:PiliPlus/models/common/dynamic/dynamics_type.dart';\nimport 'package:PiliPlus/models/dynamics/article_content_model.dart';\nimport 'package:PiliPlus/models/model_avatar.dart';\nimport 'package:PiliPlus/models/model_owner.dart';\nimport 'package:PiliPlus/models_new/live/live_feed_index/watched_show.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:PiliPlus/utils/parse_string.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/utils.dart';\n\nclass DynamicsDataModel {\n  bool? hasMore;\n  List<DynamicItemModel>? items;\n  String? offset;\n  int? total;\n  bool? loadNext;\n\n  static String _getMatchText(DynamicItemModel item) {\n    final moduleDynamic = item.modules.moduleDynamic;\n    final opus = moduleDynamic?.major?.opus;\n    return (opus?.title ?? '') +\n        (opus?.summary?.text ?? '') +\n        (moduleDynamic?.desc?.text ?? '') +\n        _getArcTitle(moduleDynamic?.major);\n  }\n\n  static String _getArcTitle(DynamicMajorModel? major) {\n    final title = switch (major?.type) {\n      'MAJOR_TYPE_ARCHIVE' => major?.archive?.title,\n      'MAJOR_TYPE_UGC_SEASON' => major?.ugcSeason?.title,\n      'MAJOR_TYPE_PGC' => major?.pgc?.title,\n      'MAJOR_TYPE_COURSES' => major?.courses?.title,\n      _ => null,\n    };\n    return title ?? '';\n  }\n\n  static RegExp banWordForDyn = RegExp(\n    Pref.banWordForDyn,\n    caseSensitive: false,\n  );\n  static bool enableFilter = banWordForDyn.pattern.isNotEmpty;\n\n  static bool antiGoodsDyn = Pref.antiGoodsDyn;\n\n  DynamicsDataModel.fromJson(\n    Map<String, dynamic> json, {\n    DynamicsTabType type = DynamicsTabType.all,\n    Set<int>? tempBannedList,\n  }) {\n    hasMore = json['has_more'];\n\n    List? list = json['items'] as List?;\n    if (list != null && list.isNotEmpty) {\n      items = <DynamicItemModel>[];\n      late final filterBan =\n          type != DynamicsTabType.up && tempBannedList?.isNotEmpty == true;\n      for (final e in list) {\n        DynamicItemModel item = DynamicItemModel.fromJson(e);\n        if (antiGoodsDyn &&\n            (item.orig?.modules.moduleDynamic?.additional?.type ==\n                    'ADDITIONAL_TYPE_GOODS' ||\n                item.modules.moduleDynamic?.additional?.type ==\n                    'ADDITIONAL_TYPE_GOODS')) {\n          continue;\n        }\n        if (enableFilter) {\n          if (item.orig case final orig?) {\n            if (banWordForDyn.hasMatch(_getMatchText(orig))) {\n              continue;\n            }\n          }\n          if (banWordForDyn.hasMatch(_getMatchText(item))) {\n            continue;\n          }\n        }\n        if (filterBan &&\n            tempBannedList!.contains(item.modules.moduleAuthor?.mid)) {\n          continue;\n        }\n        items!.add(item);\n      }\n      // filtered all\n      if (items!.isEmpty) {\n        loadNext = hasMore;\n      }\n    }\n\n    offset = json['offset'];\n    total = Utils.safeToInt(json['total']);\n  }\n}\n\n// 单个动态\nclass DynamicItemModel {\n  Basic? basic;\n  dynamic idStr;\n  late ItemModulesModel modules;\n\n  DynamicItemModel? orig;\n  String? type;\n  bool? visible;\n\n  late bool linkFolded = false;\n\n  // opus\n  Fallback? fallback;\n\n  DynamicItemModel.fromJson(Map<String, dynamic> json) {\n    if (json['basic'] != null) basic = Basic.fromJson(json['basic']);\n    idStr = json['id_str'];\n    modules = json['modules'] == null\n        ? ItemModulesModel()\n        : ItemModulesModel.fromJson(json['modules']);\n    if (json['orig'] != null) {\n      orig = DynamicItemModel.fromJson(json['orig']);\n    }\n    type = json['type'];\n    visible = json['visible'];\n  }\n\n  DynamicItemModel.fromOpusJson(Map<String, dynamic> json) {\n    if (json['item']?['basic'] != null) {\n      basic = Basic.fromJson(json['item']['basic']);\n    }\n    idStr = json['item']?['id_str'];\n    if (json['item']?['modules'] case List list) {\n      modules = ItemModulesModel.fromOpusJson(list);\n    } else {\n      modules = ItemModulesModel();\n    }\n\n    if (json['fallback'] != null) {\n      fallback = Fallback.fromJson(json['fallback']);\n    }\n  }\n}\n\nclass Fallback {\n  String? id;\n\n  Fallback({\n    this.id,\n  });\n\n  factory Fallback.fromJson(Map<String, dynamic> json) => Fallback(\n    id: json['id'],\n  );\n}\n\n// 单个动态详情\nclass ItemModulesModel {\n  ItemModulesModel();\n\n  ModuleAuthorModel? moduleAuthor;\n  ModuleStatModel? moduleStat;\n  ModuleTag? moduleTag; // 也做opus的title用\n\n  // 动态\n  ModuleDynamicModel? moduleDynamic;\n  // ModuleInterModel? moduleInter;\n  ModuleInteraction? moduleInteraction;\n  ModuleDispute? moduleDispute;\n\n  // 专栏\n  ModuleTop? moduleTop;\n  ModuleCollection? moduleCollection;\n  List<ModuleTag>? moduleExtend; // opus的tag\n  List<ArticleContentModel>? moduleContent;\n  ModuleBlocked? moduleBlocked;\n  ModuleFold? moduleFold;\n\n  static bool showDynDispute = Pref.showDynDispute;\n  static bool showDynInteraction = Pref.showDynInteraction;\n\n  ItemModulesModel.fromJson(Map<String, dynamic> json) {\n    moduleAuthor = json['module_author'] != null\n        ? ModuleAuthorModel.fromJson(json['module_author'])\n        : null;\n    moduleDynamic = json['module_dynamic'] != null\n        ? ModuleDynamicModel.fromJson(json['module_dynamic'])\n        : null;\n    moduleStat = json['module_stat'] != null\n        ? ModuleStatModel.fromJson(json['module_stat'])\n        : null;\n    moduleTag = json['module_tag'] != null\n        ? ModuleTag.fromJson(json['module_tag'])\n        : null;\n    moduleFold = json['module_fold'] != null\n        ? ModuleFold.fromJson(json['module_fold'])\n        : null;\n    if (showDynInteraction) {\n      moduleInteraction = json['module_interaction'] != null\n          ? ModuleInteraction.fromJson(json['module_interaction'])\n          : null;\n    }\n    if (showDynDispute) {\n      moduleDispute = json['module_dispute'] != null\n          ? ModuleDispute.fromJson(json['module_dispute'])\n          : null;\n    }\n  }\n\n  ItemModulesModel.fromOpusJson(List json) {\n    for (Map<String, dynamic> i in json) {\n      switch (i['module_type']) {\n        case 'MODULE_TYPE_TOP':\n          moduleTop = i['module_top'] == null\n              ? null\n              : ModuleTop.fromJson(i['module_top']);\n          break;\n        case 'MODULE_TYPE_TITLE':\n          moduleTag = i['module_title'] == null\n              ? null\n              : ModuleTag.fromJson(i['module_title']);\n          break;\n        case 'MODULE_TYPE_COLLECTION':\n          moduleCollection = i['module_collection'] == null\n              ? null\n              : ModuleCollection.fromJson(i['module_collection']);\n          break;\n        case 'MODULE_TYPE_AUTHOR':\n          moduleAuthor = i['module_author'] == null\n              ? null\n              : ModuleAuthorModel.fromJson(i['module_author']);\n          break;\n        case 'MODULE_TYPE_CONTENT':\n          moduleContent = (i['module_content']?['paragraphs'] as List?)\n              ?.map((i) => ArticleContentModel.fromJson(i))\n              .toList();\n          break;\n        case 'MODULE_TYPE_BLOCKED':\n          moduleBlocked = i['module_blocked'] == null\n              ? null\n              : ModuleBlocked.fromJson(i['module_blocked']);\n          break;\n        case 'MODULE_TYPE_EXTEND':\n          moduleExtend = (i['module_extend']?['items'] as List?)\n              ?.map((i) => ModuleTag.fromJson(i))\n              .toList();\n          break;\n        case 'MODULE_TYPE_STAT':\n          moduleStat = i['module_stat'] == null\n              ? null\n              : ModuleStatModel.fromJson(i['module_stat']);\n          break;\n      }\n    }\n  }\n}\n\nclass ModuleDispute {\n  String? title;\n  String? desc;\n  String? jumpUrl;\n\n  ModuleDispute.fromJson(Map<String, dynamic> json) {\n    title = json['title'];\n    desc = json['desc'];\n    jumpUrl = json['jump_url'];\n  }\n}\n\nclass ModuleInteraction {\n  List<ModuleInteractionItem>? items;\n\n  ModuleInteraction.fromJson(Map<String, dynamic> json) {\n    items = (json['items'] as List?)\n        ?.map((e) => ModuleInteractionItem.fromJson(e))\n        .toList();\n  }\n}\n\nclass ModuleInteractionItem {\n  int? type;\n  DynamicDescModel? desc;\n\n  ModuleInteractionItem.fromJson(Map<String, dynamic> json) {\n    type = json['type'];\n    desc = json[\"desc\"] == null\n        ? null\n        : DynamicDescModel.fromJson(json[\"desc\"]);\n  }\n}\n\nclass ModuleFold {\n  List<String>? ids;\n  String? statement;\n  List<Owner>? users;\n\n  ModuleFold.fromJson(Map<String, dynamic> json) {\n    ids = (json['ids'] as List?)?.fromCast();\n    statement = json['statement'];\n    users = (json['users'] as List?)?.map((e) => Owner.fromJson(e)).toList();\n  }\n}\n\nclass ModuleCollection {\n  String? count;\n  int? id;\n  String? name;\n  String? title;\n\n  ModuleCollection.fromJson(Map<String, dynamic> json) {\n    count = json['count'];\n    id = Utils.safeToInt(json['id']);\n    name = json['name'];\n    title = json['title'];\n  }\n}\n\nclass ModuleTop {\n  ModuleTopDisplay? display;\n\n  ModuleTop.fromJson(Map<String, dynamic> json) {\n    display = json['display'] == null\n        ? null\n        : ModuleTopDisplay.fromJson(json['display']);\n  }\n}\n\nclass ModuleTopDisplay {\n  ModuleTopAlbum? album;\n\n  ModuleTopDisplay.fromJson(Map<String, dynamic> json) {\n    album = json['album'] == null\n        ? null\n        : ModuleTopAlbum.fromJson(json['album']);\n  }\n}\n\nclass ModuleTopAlbum {\n  List<Pic>? pics;\n\n  ModuleTopAlbum.fromJson(Map<String, dynamic> json) {\n    pics = (json['pics'] as List?)?.map((e) => Pic.fromJson(e)).toList();\n  }\n}\n\nclass ModuleBlocked {\n  BgImg? bgImg;\n  int? blockedType;\n  Button? button;\n  String? title;\n  String? hintMessage;\n  BgImg? icon;\n\n  ModuleBlocked.fromJson(Map<String, dynamic> json) {\n    bgImg = json['bg_img'] == null ? null : BgImg.fromJson(json['bg_img']);\n    blockedType = Utils.safeToInt(json['blocked_type']);\n    button = json['button'] == null ? null : Button.fromJson(json['button']);\n    title = json['title'];\n    hintMessage = json['hint_message'];\n    icon = json['icon'] == null ? null : BgImg.fromJson(json['icon']);\n  }\n}\n\nclass Button {\n  String? icon;\n  String? jumpUrl;\n  String? text;\n  JumpStyle? jumpStyle;\n  Check? check;\n\n  Button.fromJson(Map<String, dynamic> json) {\n    icon = json['icon'];\n    jumpUrl = json['jump_url'];\n    text = json['text'];\n    jumpStyle = json['jump_style'] == null\n        ? null\n        : JumpStyle.fromJson(json['jump_style']);\n    check = json['check'] == null ? null : Check.fromJson(json['check']);\n  }\n}\n\nclass Check {\n  String? text;\n\n  Check.fromJson(Map<String, dynamic> json) {\n    text = json['text'];\n  }\n}\n\nclass BgImg {\n  String? imgDark;\n  String? imgDay;\n\n  BgImg.fromJson(Map<String, dynamic> json) {\n    imgDark = json['img_dark'];\n    imgDay = json['img_day'];\n  }\n}\n\nclass Basic {\n  String? commentIdStr;\n  int? commentType;\n  String? ridStr;\n\n  Basic.fromJson(Map<String, dynamic> json) {\n    commentIdStr = json['comment_id_str'];\n    commentType = Utils.safeToInt(json['comment_type']);\n    ridStr = json['rid_str'];\n  }\n}\n\n// 单个动态详情 - 作者信息\nclass ModuleAuthorModel extends Avatar {\n  String? pubAction;\n  String? pubTime;\n  int? pubTs;\n  String? type;\n  Decorate? decorate;\n  bool? isTop;\n  String? badgeText;\n\n  ModuleAuthorModel.fromJson(Map<String, dynamic> json) : super.fromJson(json) {\n    if (json['official'] != null) {\n      officialVerify ??= BaseOfficialVerify.fromJson(json['official']); // opus\n    }\n    pubAction = json['pub_action'];\n    pubTime = json['pub_time'];\n    pubTs = json['pub_ts'] == 0 ? null : Utils.safeToInt(json['pub_ts']);\n    type = json['type'];\n    if (PendantAvatar.showDynDecorate) {\n      decorate = json['decorate'] == null\n          ? null\n          : Decorate.fromJson(json['decorate']);\n    } else {\n      pendant = null;\n    }\n    isTop = json['is_top'];\n    badgeText = noneNullOrEmptyString(json['icon_badge']?['text']);\n  }\n}\n\nclass Decorate {\n  String? cardUrl;\n  Fan? fan;\n\n  Decorate({\n    this.cardUrl,\n    this.fan,\n  });\n\n  factory Decorate.fromJson(Map<String, dynamic> json) => Decorate(\n    cardUrl: json[\"card_url\"],\n    fan: json[\"fan\"] == null ? null : Fan.fromJson(json[\"fan\"]),\n  );\n}\n\nclass Fan {\n  String? color;\n  String? numStr;\n\n  Fan({\n    this.color,\n    this.numStr,\n  });\n\n  factory Fan.fromJson(Map<String, dynamic> json) => Fan(\n    color: json[\"color\"],\n    numStr: json[\"num_str\"],\n  );\n}\n\n// 单个动态详情 - 动态信息\nclass ModuleDynamicModel {\n  ModuleDynamicModel({\n    this.additional,\n    this.desc,\n    this.major,\n    this.topic,\n  });\n\n  DynamicAddModel? additional;\n  DynamicDescModel? desc;\n  DynamicMajorModel? major;\n  DynamicTopicModel? topic;\n\n  ModuleDynamicModel.fromJson(Map<String, dynamic> json) {\n    additional = json['additional'] != null\n        ? DynamicAddModel.fromJson(json['additional'])\n        : null;\n    desc = json['desc'] != null\n        ? DynamicDescModel.fromJson(json['desc'])\n        : null;\n    if (json['major'] != null) {\n      major = DynamicMajorModel.fromJson(json['major']);\n    }\n    topic = json['topic'] != null\n        ? DynamicTopicModel.fromJson(json['topic'])\n        : null;\n  }\n}\n\nclass DynamicAddModel {\n  DynamicAddModel({\n    this.type,\n    this.vote,\n    this.ugc,\n    this.reserve,\n    this.goods,\n  });\n\n  String? type;\n  Vote? vote;\n  Ugc? ugc;\n  Reserve? reserve;\n  Good? goods;\n  UpowerLottery? upowerLottery;\n  AddCommon? common;\n  AddMatch? match;\n\n  DynamicAddModel.fromJson(Map<String, dynamic> json) {\n    type = json['type'];\n    vote = json['vote'] != null ? Vote.fromJson(json['vote']) : null;\n    ugc = json['ugc'] != null ? Ugc.fromJson(json['ugc']) : null;\n    reserve = json['reserve'] != null\n        ? Reserve.fromJson(json['reserve'])\n        : null;\n    goods = json['goods'] != null ? Good.fromJson(json['goods']) : null;\n    upowerLottery = json['upower_lottery'] != null\n        ? UpowerLottery.fromJson(json['upower_lottery'])\n        : null;\n    common = json['common'] != null ? AddCommon.fromJson(json['common']) : null;\n    match = json['match'] != null ? AddMatch.fromJson(json['match']) : null;\n  }\n}\n\nclass AddMatch {\n  Button? button;\n  String? jumpUrl;\n  MatchInfo? matchInfo;\n\n  AddMatch({\n    this.button,\n    this.jumpUrl,\n    this.matchInfo,\n  });\n\n  factory AddMatch.fromJson(Map<String, dynamic> json) => AddMatch(\n    button: json[\"button\"] == null ? null : Button.fromJson(json[\"button\"]),\n    jumpUrl: json[\"jump_url\"],\n    matchInfo: json[\"match_info\"] == null\n        ? null\n        : MatchInfo.fromJson(json[\"match_info\"]),\n  );\n}\n\nclass MatchInfo {\n  String? centerBottom;\n  List? centerTop;\n  TTeam? leftTeam;\n  TTeam? rightTeam;\n  dynamic subTitle;\n  String? title;\n\n  MatchInfo({\n    this.centerBottom,\n    this.centerTop,\n    this.leftTeam,\n    this.rightTeam,\n    this.subTitle,\n    this.title,\n  });\n\n  factory MatchInfo.fromJson(Map<String, dynamic> json) => MatchInfo(\n    centerBottom: json[\"center_bottom\"],\n    centerTop: json[\"center_top\"],\n    leftTeam: json[\"left_team\"] == null\n        ? null\n        : TTeam.fromJson(json[\"left_team\"]),\n    rightTeam: json[\"right_team\"] == null\n        ? null\n        : TTeam.fromJson(json[\"right_team\"]),\n    subTitle: json[\"sub_title\"],\n    title: json[\"title\"],\n  );\n}\n\nclass TTeam {\n  String? name;\n  String? pic;\n\n  TTeam({\n    this.name,\n    this.pic,\n  });\n\n  factory TTeam.fromJson(Map<String, dynamic> json) => TTeam(\n    name: json[\"name\"],\n    pic: json[\"pic\"],\n  );\n}\n\nclass AddCommon {\n  Button? button;\n  String? cover;\n  String? desc1;\n  String? desc2;\n  String? jumpUrl;\n  String? title;\n\n  AddCommon({\n    this.button,\n    this.cover,\n    this.desc1,\n    this.desc2,\n    this.jumpUrl,\n    this.title,\n  });\n\n  factory AddCommon.fromJson(Map<String, dynamic> json) => AddCommon(\n    button: json[\"button\"] == null ? null : Button.fromJson(json[\"button\"]),\n    cover: json[\"cover\"],\n    desc1: json[\"desc1\"],\n    desc2: json[\"desc2\"],\n    jumpUrl: json[\"jump_url\"],\n    title: json[\"title\"],\n  );\n}\n\nclass UpowerLottery {\n  Button? button;\n  Desc? desc;\n  Hint? hint;\n  String? jumpUrl;\n  String? title;\n\n  UpowerLottery({\n    this.button,\n    this.desc,\n    this.hint,\n    this.jumpUrl,\n    this.title,\n  });\n\n  factory UpowerLottery.fromJson(Map<String, dynamic> json) => UpowerLottery(\n    button: json[\"button\"] == null ? null : Button.fromJson(json[\"button\"]),\n    desc: json[\"desc\"] == null ? null : Desc.fromJson(json[\"desc\"]),\n    hint: json[\"hint\"] == null ? null : Hint.fromJson(json[\"hint\"]),\n    jumpUrl: json[\"jump_url\"],\n    title: json[\"title\"],\n  );\n}\n\nclass Hint {\n  String? text;\n\n  Hint({\n    this.text,\n  });\n\n  factory Hint.fromJson(Map<String, dynamic> json) => Hint(\n    text: json[\"text\"],\n  );\n}\n\nclass JumpStyle {\n  String? text;\n\n  JumpStyle({\n    this.text,\n  });\n\n  factory JumpStyle.fromJson(Map<String, dynamic> json) => JumpStyle(\n    text: json[\"text\"],\n  );\n}\n\nclass Vote {\n  Vote({\n    this.joinNum,\n    this.voteId,\n    this.title,\n  });\n\n  int? joinNum;\n  int? voteId;\n  String? title;\n\n  Vote.fromJson(Map<String, dynamic> json) {\n    joinNum = Utils.safeToInt(json['join_num']);\n    voteId = Utils.safeToInt(json['vote_id']);\n    title =\n        noneNullOrEmptyString(json['title']) ??\n        noneNullOrEmptyString(json['desc']);\n  }\n}\n\nclass Ugc {\n  Ugc({\n    this.cover,\n    this.descSecond,\n    this.jumpUrl,\n    this.title,\n  });\n\n  String? cover;\n  String? descSecond;\n  String? jumpUrl;\n  String? title;\n\n  Ugc.fromJson(Map<String, dynamic> json) {\n    cover = json['cover'];\n    descSecond = json['desc_second'];\n    jumpUrl = json['jump_url'];\n    title = json['title'];\n  }\n}\n\nclass Reserve {\n  Reserve({\n    this.button,\n    this.desc1,\n    this.desc2,\n    this.desc3,\n    this.reserveTotal,\n    this.rid,\n    this.state,\n    this.title,\n  });\n\n  ReserveBtn? button;\n  Desc? desc1;\n  Desc? desc2;\n  Desc? desc3;\n  int? reserveTotal;\n  int? rid;\n  int? state;\n  String? title;\n\n  Reserve.fromJson(Map<String, dynamic> json) {\n    button = json['button'] == null\n        ? null\n        : ReserveBtn.fromJson(json['button']);\n    desc1 = json['desc1'] == null ? null : Desc.fromJson(json['desc1']);\n    desc2 = json['desc2'] == null ? null : Desc.fromJson(json['desc2']);\n    desc3 = json['desc3'] == null ? null : Desc.fromJson(json['desc3']);\n    reserveTotal = Utils.safeToInt(json['reserve_total']);\n    rid = Utils.safeToInt(json['rid']);\n    state = Utils.safeToInt(json['state']);\n    state = Utils.safeToInt(json['state']);\n    title = json['title'];\n  }\n}\n\nclass ReserveBtn {\n  ReserveBtn({\n    this.status,\n    this.type,\n    this.checkText,\n    this.uncheckText,\n  });\n\n  int? status;\n  int? type;\n  String? checkText;\n  String? uncheckText;\n  int? disable;\n  String? jumpText;\n  String? jumpUrl;\n\n  ReserveBtn.fromJson(Map<String, dynamic> json) {\n    status = Utils.safeToInt(json['status']);\n    type = Utils.safeToInt(json['type']);\n    checkText = json['check']?['text'] ?? '已预约';\n    uncheckText = json['uncheck']?['text'] ?? '预约';\n    disable = Utils.safeToInt(json['uncheck']?['disable']);\n    jumpText = json['jump_style']?['text'];\n    jumpUrl = json['jump_url'];\n  }\n}\n\nclass Desc {\n  Desc({\n    this.text,\n    this.jumpUrl,\n  });\n\n  String? text;\n  String? jumpUrl;\n\n  Desc.fromJson(Map<String, dynamic> json) {\n    text = json['text'];\n    jumpUrl = json[\"jump_url\"];\n  }\n}\n\nclass Good {\n  Good({\n    this.items,\n  });\n\n  List<GoodItem>? items;\n\n  Good.fromJson(Map<String, dynamic> json) {\n    items = (json['items'] as List?)\n        ?.map<GoodItem>((e) => GoodItem.fromJson(e))\n        .toList();\n  }\n}\n\nclass GoodItem {\n  GoodItem({\n    this.cover,\n    this.jumpDesc,\n    this.jumpUrl,\n    this.name,\n    this.price,\n  });\n\n  String? cover;\n  String? jumpDesc;\n  String? jumpUrl;\n  String? name;\n  String? price;\n\n  GoodItem.fromJson(Map<String, dynamic> json) {\n    cover = json['cover'];\n    jumpDesc = json['jump_desc'];\n    jumpUrl = json['jump_url'];\n    name = json['name'];\n    price = json['price'];\n  }\n}\n\nclass DynamicDescModel {\n  DynamicDescModel({\n    this.richTextNodes,\n    this.text,\n  });\n\n  List<RichTextNodeItem>? richTextNodes;\n  String? text;\n\n  DynamicDescModel.fromJson(Map<String, dynamic> json) {\n    richTextNodes = (json['rich_text_nodes'] as List?)\n        ?.map<RichTextNodeItem>((e) => RichTextNodeItem.fromJson(e))\n        .toList();\n    text = json['text'];\n  }\n}\n\nclass DynamicMajorModel {\n  DynamicMajorModel({\n    this.archive,\n    this.ugcSeason,\n    this.opus,\n    this.pgc,\n    this.liveRcmd,\n    this.live,\n    this.none,\n    this.type,\n    this.courses,\n    this.common,\n    this.music,\n    this.blocked,\n    this.medialist,\n  });\n\n  DynamicArchiveModel? archive;\n  DynamicArchiveModel? ugcSeason;\n  DynamicOpusModel? opus;\n  DynamicArchiveModel? pgc;\n  DynamicLiveModel? liveRcmd;\n  DynamicLive2Model? live;\n  DynamicNoneModel? none;\n  String? type;\n  DynamicArchiveModel? courses;\n  Common? common;\n  Common? upowerCommon;\n  Music? music;\n  ModuleBlocked? blocked;\n  Medialist? medialist;\n\n  SubscriptionNew? subscriptionNew;\n\n  DynamicMajorModel.fromJson(Map<String, dynamic> json) {\n    archive = json['archive'] != null\n        ? DynamicArchiveModel.fromJson(json['archive'])\n        : null;\n    ugcSeason = json['ugc_season'] != null\n        ? DynamicArchiveModel.fromJson(json['ugc_season'])\n        : null;\n    opus = json['opus'] != null\n        ? DynamicOpusModel.fromJson(json['opus'])\n        : null;\n    pgc = json['pgc'] != null\n        ? DynamicArchiveModel.fromJson(json['pgc'])\n        : null;\n    liveRcmd = json['live_rcmd'] != null\n        ? DynamicLiveModel.fromJson(json['live_rcmd'])\n        : null;\n    live = json['live'] != null\n        ? DynamicLive2Model.fromJson(json['live'])\n        : null;\n    none = json['none'] != null\n        ? DynamicNoneModel.fromJson(json['none'])\n        : null;\n    type = json['type'];\n    courses = json['courses'] == null\n        ? null\n        : DynamicArchiveModel.fromJson(json['courses']);\n    common = json['common'] == null ? null : Common.fromJson(json['common']);\n    upowerCommon = json['upower_common'] == null\n        ? null\n        : Common.fromJson(json['upower_common']);\n    music = json['music'] == null ? null : Music.fromJson(json['music']);\n    blocked = json['blocked'] == null\n        ? null\n        : ModuleBlocked.fromJson(json['blocked']);\n    medialist = json['medialist'] == null\n        ? null\n        : Medialist.fromJson(json['medialist']);\n    subscriptionNew = json['subscription_new'] == null\n        ? null\n        : SubscriptionNew.fromJson(json['subscription_new']);\n  }\n}\n\nclass Music {\n  int? id;\n  String? cover;\n  String? title;\n  String? label;\n\n  Music.fromJson(Map<String, dynamic> json) {\n    id = Utils.safeToInt(json['id']);\n    cover = json['cover'];\n    title = json['title'];\n    label = json['label'];\n  }\n}\n\nclass Medialist {\n  dynamic id;\n  String? cover;\n  String? title;\n  String? subTitle;\n  String? jumpUrl;\n  Badge? badge;\n\n  Medialist.fromJson(Map<String, dynamic> json) {\n    id = json['id'];\n    cover = json['cover'];\n    title = json['title'];\n    subTitle = json['sub_title'];\n    jumpUrl = json['jump_url'];\n    badge = json['badge'] == null ? null : Badge.fromJson(json['badge']);\n  }\n}\n\nclass SubscriptionNew {\n  LiveRcmd? liveRcmd;\n\n  SubscriptionNew({\n    this.liveRcmd,\n  });\n\n  factory SubscriptionNew.fromJson(Map<String, dynamic> json) =>\n      SubscriptionNew(\n        liveRcmd: json[\"live_rcmd\"] == null\n            ? null\n            : LiveRcmd.fromJson(json[\"live_rcmd\"]),\n      );\n}\n\nclass LiveRcmd {\n  LiveRcmdContent? content;\n\n  LiveRcmd({\n    this.content,\n  });\n\n  factory LiveRcmd.fromJson(Map<String, dynamic> json) => LiveRcmd(\n    content: json[\"content\"] == null\n        ? null\n        : LiveRcmdContent.fromJson(jsonDecode(json[\"content\"])),\n  );\n}\n\nclass LiveRcmdContent {\n  LivePlayInfo? livePlayInfo;\n\n  LiveRcmdContent({\n    this.livePlayInfo,\n  });\n\n  factory LiveRcmdContent.fromJson(Map<String, dynamic> json) =>\n      LiveRcmdContent(\n        livePlayInfo: json[\"live_play_info\"] == null\n            ? null\n            : LivePlayInfo.fromJson(json[\"live_play_info\"]),\n      );\n}\n\nclass LivePlayInfo {\n  int? roomId;\n  int? liveStatus;\n  String? title;\n  String? cover;\n  String? areaName;\n  WatchedShow? watchedShow;\n\n  LivePlayInfo({\n    this.roomId,\n    this.liveStatus,\n    this.title,\n    this.cover,\n    this.areaName,\n    this.watchedShow,\n  });\n\n  factory LivePlayInfo.fromJson(Map<String, dynamic> json) => LivePlayInfo(\n    roomId: Utils.safeToInt(json[\"room_id\"]),\n    liveStatus: Utils.safeToInt(json[\"live_status\"]),\n    title: json[\"title\"],\n    cover: json[\"cover\"],\n    areaName: json[\"area_name\"],\n    watchedShow: json[\"watched_show\"] == null\n        ? null\n        : WatchedShow.fromJson(json[\"watched_show\"]),\n  );\n}\n\nclass DynamicTopicModel {\n  DynamicTopicModel({\n    this.id,\n    this.name,\n  });\n\n  int? id;\n  String? name;\n\n  DynamicTopicModel.fromJson(Map<String, dynamic> json) {\n    id = Utils.safeToInt(json['id']);\n    name = json['name'];\n  }\n}\n\nclass DynamicArchiveModel {\n  DynamicArchiveModel({\n    this.id,\n    this.aid,\n    this.badge,\n    this.bvid,\n    this.cover,\n    this.durationText,\n    this.jumpUrl,\n    this.stat,\n    this.title,\n    this.type,\n    this.epid,\n    this.seasonId,\n  });\n\n  int? id;\n  int? aid;\n  Badge? badge;\n  String? bvid;\n  String? cover;\n  String? durationText;\n  String? jumpUrl;\n  Stat? stat;\n  String? title;\n  int? type;\n  int? epid;\n  int? seasonId;\n\n  DynamicArchiveModel.fromJson(Map<String, dynamic> json) {\n    id = Utils.safeToInt(json['id']);\n    aid = Utils.safeToInt(json['aid']);\n    badge = json['badge'] == null ? null : Badge.fromJson(json['badge']);\n    bvid = json['bvid'] ?? json['epid'].toString() ?? ' ';\n    cover = json['cover'];\n    durationText = json['duration_text'];\n    jumpUrl = json['jump_url'];\n    stat = json['stat'] != null ? Stat.fromJson(json['stat']) : null;\n    title = json['title'];\n    type = Utils.safeToInt(json['type']);\n    epid = Utils.safeToInt(json['epid']);\n    seasonId = Utils.safeToInt(json['season_id']);\n  }\n}\n\nclass Badge {\n  Badge({\n    this.text,\n  });\n\n  String? text;\n\n  Badge.fromJson(Map<String, dynamic> json) {\n    text = json['text'] == '投稿视频' ? null : json['text'];\n  }\n}\n\nclass DynamicOpusModel {\n  DynamicOpusModel({\n    this.pics,\n    this.summary,\n    this.title,\n  });\n\n  List<OpusPicModel>? pics;\n  SummaryModel? summary;\n  String? title;\n\n  DynamicOpusModel.fromJson(Map<String, dynamic> json) {\n    pics = (json['pics'] as List?)\n        ?.map<OpusPicModel>((e) => OpusPicModel.fromJson(e))\n        .toList();\n    summary = json['summary'] != null\n        ? SummaryModel.fromJson(json['summary'])\n        : null;\n    title = json['title'];\n  }\n}\n\nclass SummaryModel {\n  SummaryModel({\n    this.richTextNodes,\n    this.text,\n  });\n\n  List<RichTextNodeItem>? richTextNodes;\n  String? text;\n\n  SummaryModel.fromJson(Map<String, dynamic> json) {\n    richTextNodes = (json['rich_text_nodes'] as List?)\n        ?.map<RichTextNodeItem>((e) => RichTextNodeItem.fromJson(e))\n        .toList();\n    text = json['text'];\n  }\n}\n\nclass RichTextNodeItem {\n  RichTextNodeItem({\n    this.emoji,\n    this.origText,\n    this.text,\n    this.type,\n    this.rid,\n  });\n\n  Emoji? emoji;\n  String? origText;\n  String? text;\n  String? type;\n  String? rid;\n  List<OpusPicModel>? pics;\n  List<OpusPicModel>? dynPic;\n  String? jumpUrl;\n\n  RichTextNodeItem.fromJson(Map<String, dynamic> json) {\n    emoji = json['emoji'] != null ? Emoji.fromJson(json['emoji']) : null;\n    origText = json['orig_text'];\n    text = json['text'];\n    type = json['type'];\n    rid = json['rid'];\n    pics = (json['pics'] as List?)\n        ?.map((e) => OpusPicModel.fromJson(e))\n        .toList();\n    jumpUrl = json['jump_url'];\n  }\n}\n\nclass Emoji {\n  String? url;\n  late num size;\n\n  Emoji.fromJson(Map<String, dynamic> json) {\n    url =\n        noneNullOrEmptyString(json['webp_url']) ??\n        noneNullOrEmptyString(json['gif_url']) ??\n        noneNullOrEmptyString(json['icon_url']);\n    size = json['size'] ?? 1;\n  }\n}\n\nclass DynamicNoneModel {\n  DynamicNoneModel({\n    this.tips,\n  });\n\n  String? tips;\n\n  DynamicNoneModel.fromJson(Map<String, dynamic> json) {\n    tips = json['tips'];\n  }\n}\n\nsealed class PicModel {}\n\nclass FilePicModel extends PicModel {\n  String path;\n\n  FilePicModel({\n    required this.path,\n  });\n}\n\nclass OpusPicModel extends PicModel {\n  OpusPicModel({\n    this.width,\n    this.height,\n    this.src,\n    this.url,\n    this.size,\n  });\n\n  int? width;\n  int? height;\n  String? src;\n  String? url;\n  String? liveUrl;\n  num? size;\n\n  OpusPicModel.fromJson(Map<String, dynamic> json) {\n    width = Utils.safeToInt(json['width']);\n    height = Utils.safeToInt(json['height']);\n    src = json['src'];\n    url = json['url'];\n    liveUrl = json['live_url'];\n    size = json['size'];\n  }\n\n  Map<String, dynamic> toJson() => {\n    'img_width': width,\n    'img_height': height,\n    'img_size': size,\n    'img_src': url,\n  };\n}\n\nclass DynamicLiveModel {\n  int? roomId;\n  int? liveStatus;\n  String? cover;\n  String? areaName;\n  String? title;\n  WatchedShow? watchedShow;\n\n  DynamicLiveModel.fromJson(Map<String, dynamic> json) {\n    if (json['content'] != null) {\n      Map<String, dynamic> data = jsonDecode(json['content']);\n      Map livePlayInfo = data['live_play_info'];\n\n      roomId = Utils.safeToInt(livePlayInfo['room_id']);\n      liveStatus = Utils.safeToInt(livePlayInfo['live_status']);\n      cover = livePlayInfo['cover'];\n      areaName = livePlayInfo['area_name'];\n      title = livePlayInfo['title'];\n      watchedShow = livePlayInfo['watched_show'] == null\n          ? null\n          : WatchedShow.fromJson(livePlayInfo['watched_show']);\n    }\n  }\n}\n\nclass DynamicLive2Model {\n  DynamicLive2Model({\n    this.badge,\n    this.cover,\n    this.descFirst,\n    this.id,\n    this.liveState,\n    this.title,\n  });\n\n  Badge? badge;\n  String? cover;\n  String? descFirst;\n  int? id;\n  int? liveState;\n  String? title;\n\n  DynamicLive2Model.fromJson(Map<String, dynamic> json) {\n    badge = json['badge'] == null ? null : Badge.fromJson(json['badge']);\n    cover = json['cover'];\n    descFirst = json['desc_first'];\n    id = Utils.safeToInt(json['id']);\n    liveState = Utils.safeToInt(json['live_state']);\n    title = json['title'];\n  }\n}\n\nclass ModuleTag {\n  ModuleTag({\n    this.text,\n  });\n\n  String? text;\n\n  ModuleTag.fromJson(Map<String, dynamic> json) {\n    text = noneNullOrEmptyString(json['text']);\n  }\n}\n\n// 动态状态 转发、评论、点赞\nclass ModuleStatModel {\n  ModuleStatModel({\n    this.comment,\n    this.forward,\n    this.like,\n    this.favorite,\n  });\n\n  DynamicStat? comment;\n  DynamicStat? forward;\n  DynamicStat? like;\n  DynamicStat? favorite;\n\n  ModuleStatModel.fromJson(Map<String, dynamic> json) {\n    comment = json['comment'] == null\n        ? null\n        : DynamicStat.fromJson(json['comment']);\n    forward = json['forward'] == null\n        ? null\n        : DynamicStat.fromJson(json['forward']);\n    like = json['like'] == null ? null : DynamicStat.fromJson(json['like']);\n    if (json['favorite'] != null) {\n      favorite = DynamicStat.fromJson(json['favorite']);\n    }\n  }\n}\n\n// 动态状态\nclass DynamicStat {\n  DynamicStat({\n    this.count,\n    this.status,\n  });\n\n  int? count;\n  bool? status;\n\n  DynamicStat.fromJson(Map<String, dynamic> json) {\n    count = json['count'] == 0 ? null : Utils.safeToInt(json['count']);\n    status = json['status'];\n  }\n}\n\nclass Stat {\n  Stat({\n    this.danmu,\n    this.play,\n  });\n\n  String? danmu;\n  String? play;\n\n  Stat.fromJson(Map<String, dynamic> json) {\n    danmu = json['danmaku'];\n    play = json['play'];\n  }\n}\n"
  },
  {
    "path": "lib/models/dynamics/up.dart",
    "content": "class FollowUpModel {\n  FollowUpModel({\n    this.liveUsers,\n    required this.upList,\n  });\n\n  LiveUsers? liveUsers;\n  late List<UpItem> upList;\n  bool? hasMore;\n  String? offset;\n\n  FollowUpModel.fromJson(Map<String, dynamic> json) {\n    liveUsers = json['live_users'] != null\n        ? LiveUsers.fromJson(json['live_users'])\n        : null;\n    upList =\n        (json['up_list']?['items'] as List?)\n            ?.map<UpItem>((e) => UpItem.fromJson(e))\n            .toList() ??\n        <UpItem>[];\n    hasMore = json['up_list']?['has_more'];\n    offset = json['up_list']?['offset'];\n  }\n}\n\nclass DynUpList {\n  List<UpItem>? upList;\n  bool? hasMore;\n  String? offset;\n\n  DynUpList.fromJson(Map<String, dynamic> json) {\n    upList = (json['items'] as List?)\n        ?.map<UpItem>((e) => UpItem.fromJson(e))\n        .toList();\n    hasMore = json['has_more'];\n    offset = json['offset'];\n  }\n}\n\nclass LiveUsers {\n  LiveUsers({\n    this.count,\n    this.group,\n    this.items,\n  });\n\n  int? count;\n  String? group;\n  List<LiveUserItem>? items;\n\n  LiveUsers.fromJson(Map<String, dynamic> json) {\n    count = json['count'] ?? 0;\n    group = json['group'];\n    items = (json['items'] as List?)\n        ?.map<LiveUserItem>((e) => LiveUserItem.fromJson(e))\n        .toList();\n  }\n}\n\nclass LiveUserItem extends UpItem {\n  bool? isReserveRecall;\n  String? jumpUrl;\n  int? roomId;\n  String? title;\n\n  LiveUserItem.fromJson(Map<String, dynamic> json)\n    : super(mid: json['mid'] ?? 0) {\n    face = json['face'];\n    isReserveRecall = json['is_reserve_recall'];\n    jumpUrl = json['jump_url'];\n    roomId = json['room_id'];\n    title = json['title'];\n    uname = json['uname'];\n  }\n}\n\nclass UpItem {\n  String? face;\n  bool? hasUpdate;\n  late int mid;\n  String? uname;\n\n  UpItem({\n    this.face,\n    this.hasUpdate,\n    required this.mid,\n    this.uname,\n  });\n\n  UpItem.fromJson(Map<String, dynamic> json) {\n    face = json['face'];\n    hasUpdate = json['has_update'];\n    mid = json['mid'] ?? 0;\n    uname = json['uname'];\n  }\n\n  @override\n  bool operator ==(Object other) =>\n      identical(this, other) || other is UpItem && mid == other.mid;\n\n  @override\n  int get hashCode => mid.hashCode;\n}\n"
  },
  {
    "path": "lib/models/dynamics/vote_model.dart",
    "content": "import 'package:PiliPlus/utils/extension/iterable_ext.dart';\n\nclass SimpleVoteInfo {\n  int? choiceCnt;\n  int? defaultShare;\n  String? desc;\n  int? endTime;\n  int? status;\n  int? uid;\n  int? voteId;\n  late int joinNum;\n\n  SimpleVoteInfo({\n    this.choiceCnt,\n    this.defaultShare,\n    this.desc,\n    this.endTime,\n    this.status,\n    this.uid,\n    this.voteId,\n    this.joinNum = 0,\n  });\n\n  SimpleVoteInfo.fromJson(Map<String, dynamic> json) {\n    choiceCnt = json['choice_cnt'];\n    defaultShare = json['default_share'];\n    desc = json['desc'];\n    endTime = json['end_time'];\n    status = json['status'];\n    uid = json['uid'];\n    voteId = json['vote_id'];\n    joinNum = json['join_num'] ?? 0;\n  }\n}\n\nclass VoteInfo extends SimpleVoteInfo {\n  String? title;\n  int? ctime;\n  List<int>? myVotes;\n  late List<Option> options;\n  int? optionsCnt;\n  int? voterLevel;\n  String? face;\n  String? name;\n  // 0 文字, 1 图片\n  int? type;\n  int? votePublisher;\n  int? duration;\n  int? onlyFansLevel;\n\n  VoteInfo({\n    super.choiceCnt,\n    super.defaultShare,\n    super.desc,\n    super.endTime,\n    super.status,\n    super.uid,\n    super.voteId,\n    super.joinNum = 0,\n    this.title,\n    this.ctime,\n    this.myVotes,\n    List<Option>? options,\n    this.optionsCnt,\n    this.voterLevel,\n    this.face,\n    this.name,\n    this.type,\n    this.votePublisher,\n    this.duration,\n    this.onlyFansLevel,\n  }) : options = options ?? <Option>[];\n\n  VoteInfo.fromJson(Map<String, dynamic> json) : super.fromJson(json) {\n    title = json['title'];\n    uid = json['vote_publisher'];\n    ctime = json['ctime'];\n    myVotes = (json['my_votes'] as List?)?.fromCast(); // doVote\n    options =\n        (json['options'] as List?)?.map((v) => Option.fromJson(v)).toList() ??\n        <Option>[];\n    optionsCnt = json['options_cnt'];\n    voterLevel = json['voter_level'];\n    face = json['face'];\n    name = json['name'];\n    type = json['type'];\n    votePublisher = json['vote_publisher'];\n  }\n\n  factory VoteInfo.fromSeparatedJson(Map<String, dynamic> json) {\n    return VoteInfo.fromJson(json['vote_info'])\n      ..myVotes = (json['my_votes'] as List?)?.fromCast(); // voteInfo\n  }\n\n  Map<String, dynamic> toJson() => {\n    'title': title,\n    'desc': desc,\n    'type': type,\n    'choice_cnt': choiceCnt,\n    'duration': duration,\n    'options': options.map((e) => e.toJson()).toList(),\n    'only_fans_level': onlyFansLevel,\n    'vote_publisher': votePublisher,\n    if (voteId != null) 'vote_id': voteId,\n  };\n}\n\nclass Option {\n  int? optIdx;\n  String? optDesc;\n  late int cnt;\n  String? imgUrl;\n\n  Option({\n    this.optDesc,\n    this.imgUrl,\n  });\n\n  Option.fromJson(Map<String, dynamic> json) {\n    optIdx = json['opt_idx'];\n    optDesc = json['opt_desc'];\n    cnt = json['cnt'] ?? 0;\n    imgUrl = json['img_url'];\n  }\n\n  Map<String, dynamic> toJson() => {\n    'opt_desc': optDesc,\n    'img_url': imgUrl,\n  };\n}\n"
  },
  {
    "path": "lib/models/home/rcmd/result.dart",
    "content": "import 'package:PiliPlus/models/model_rec_video_item.dart';\nimport 'package:PiliPlus/models/model_video.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\n\nclass RecVideoItemAppModel extends BaseRecVideoItemModel {\n  int? get id => aid;\n  String? talkBack;\n\n  String? cardType;\n  ThreePoint? threePoint;\n\n  RecVideoItemAppModel.fromJson(Map<String, dynamic> json) {\n    aid = json['player_args']?['aid'] ?? int.tryParse(json['param'] ?? '0');\n    bvid = json['bvid'] ?? IdUtils.av2bv(aid!);\n    cid = json['player_args']?['cid'];\n    cover = json['cover'];\n    stat = RcmdStat.fromJson(json);\n    // 改用player_args中的duration作为原始数据（秒数）\n    duration = json['player_args']?['duration'] ?? 0;\n    //duration = json['cover_right_text'];\n    title = json['title'];\n    owner = RcmdOwner.fromJson(json);\n    rcmdReason = json['rcmd_reason'];\n    //     json['bottom_rcmd_reason'] ??\n    //     json['top_rcmd_reason'];\n    if (rcmdReason != null && rcmdReason!.contains('赞')) {\n      // 有时能在推荐原因里获得点赞数\n      (stat as RcmdStat).like = NumUtils.parseNum(rcmdReason!);\n    }\n    // 由于app端api并不会直接返回与owner的关注状态\n    // 所以借用推荐原因是否为“已关注”、“新关注”判别关注状态，从而与web端接口等效\n    isFollowed = const {'已关注', '新关注'}.contains(rcmdReason);\n    // 如果是，就无需再显示推荐原因，交由view统一处理即可\n    if (isFollowed) rcmdReason = null;\n\n    goto = json['goto'];\n    param = int.parse(json['param']);\n    uri = json['uri'];\n    talkBack = json['talk_back'];\n\n    if (json['goto'] == 'bangumi') {\n      pgcBadge = json['cover_right_text'];\n    }\n\n    cardType = json['card_type'];\n    threePoint = json['three_point_v2'] != null\n        ? ThreePoint.fromJson(json['three_point_v2'])\n        : null;\n    desc = json['desc'];\n  }\n}\n\nclass RcmdStat extends BaseStat {\n  RcmdStat.fromJson(Map<String, dynamic> json) {\n    view = NumUtils.parseNum(json[\"cover_left_text_1\"] ?? '');\n    danmu = NumUtils.parseNum(json[\"cover_left_text_2\"] ?? '');\n  }\n}\n\nclass RcmdOwner extends BaseOwner {\n  RcmdOwner.fromJson(Map<String, dynamic> json) {\n    name = json['goto'] == 'av'\n        ? (json['args']?['up_name'] ?? '')\n        : (json['desc_button']?['text'] ?? '');\n    mid = json['args']?['up_id'] ?? 0;\n  }\n}\n\nclass ThreePoint {\n  List<Reason>? dislikeReasons;\n  List<Reason>? feedbacks;\n  // int? watchLater;\n\n  ThreePoint.fromJson(List json) {\n    for (final elem in json) {\n      switch (elem['type']) {\n        // case 'watch_later':\n        //   watchLater = 1;\n        //   break;\n        case 'feedback':\n          feedbacks = (elem['reasons'] as List?)\n              ?.map((i) => Reason.fromJson(i))\n              .toList();\n          break;\n        case 'dislike':\n          dislikeReasons = (elem['reasons'] as List?)\n              ?.map((i) => Reason.fromJson(i))\n              .toList();\n          break;\n      }\n    }\n  }\n}\n\nclass Reason {\n  int? id;\n  String? name;\n  String? toast;\n\n  Reason.fromJson(Map<String, dynamic> json) {\n    id = json['id'];\n    name = json['name'];\n    toast = json['toast'];\n  }\n}\n"
  },
  {
    "path": "lib/models/login/model.dart",
    "content": "class CaptchaDataModel {\n  CaptchaDataModel({\n    this.type,\n    this.token,\n    this.geetest,\n    this.tencent,\n    this.validate,\n    this.seccode,\n  });\n\n  String? type;\n  String? token;\n  GeetestData? geetest;\n  Tencent? tencent;\n  String? validate;\n  String? seccode;\n\n  CaptchaDataModel.fromJson(Map<String, dynamic> json) {\n    type = json[\"type\"];\n    token = json[\"token\"];\n    geetest = json[\"geetest\"] != null\n        ? GeetestData.fromJson(json[\"geetest\"])\n        : null;\n    tencent = json[\"tencent\"] != null\n        ? Tencent.fromJson(json[\"tencent\"])\n        : null;\n  }\n}\n\nclass GeetestData {\n  const GeetestData({\n    required this.challenge,\n    required this.gt,\n  });\n\n  final String challenge;\n  final String gt;\n\n  factory GeetestData.fromJson(Map<String, dynamic> json) =>\n      GeetestData(challenge: json[\"challenge\"], gt: json[\"gt\"]);\n}\n\nclass Tencent {\n  Tencent({this.appid});\n  String? appid;\n  Tencent.fromJson(Map<String, dynamic> json) {\n    appid = json[\"appid\"];\n  }\n}\n"
  },
  {
    "path": "lib/models/member/info.dart",
    "content": "import 'package:PiliPlus/models/model_avatar.dart';\nimport 'package:PiliPlus/models_new/live/live_feed_index/watched_show.dart';\n\nclass MemberInfoModel {\n  MemberInfoModel({\n    this.mid,\n    this.name,\n    this.sex,\n    this.face,\n    this.sign,\n    this.level,\n    this.isFollowed,\n    this.topPhoto,\n    this.official,\n    this.vip,\n    this.liveRoom,\n    this.isSeniorMember,\n  });\n\n  int? mid;\n  String? name;\n  String? sex;\n  String? face;\n  String? sign;\n  int? level;\n  bool? isFollowed;\n  String? topPhoto;\n  BaseOfficialVerify? official;\n  Vip? vip;\n  LiveRoom? liveRoom;\n  int? isSeniorMember;\n\n  MemberInfoModel.fromJson(Map<String, dynamic> json) {\n    mid = json['mid'];\n    name = json['name'];\n    sex = json['sex'];\n    face = json['face'];\n    sign = json['sign'];\n    level = json['level'];\n    isFollowed = json['is_followed'];\n    topPhoto = json['top_photo'];\n    official = json['official'] == null\n        ? null\n        : BaseOfficialVerify.fromJson(json['official']);\n    vip = Vip.fromJson(json['vip']);\n    liveRoom = json['live_room'] != null\n        ? LiveRoom.fromJson(json['live_room'])\n        : null;\n    isSeniorMember = json['is_senior_member'];\n  }\n}\n\nclass LiveRoom {\n  LiveRoom({\n    this.roomStatus,\n    this.liveStatus,\n    this.url,\n    this.title,\n    this.cover,\n    this.roomId,\n    this.roundStatus,\n    this.watchedShow,\n  });\n\n  int? roomStatus;\n  int? liveStatus;\n  String? url;\n  String? title;\n  String? cover;\n  int? roomId;\n  int? roundStatus;\n  WatchedShow? watchedShow;\n\n  LiveRoom.fromJson(Map<String, dynamic> json) {\n    roomStatus = json['roomStatus'];\n    liveStatus = json['liveStatus'];\n    url = json['url'];\n    title = json['title'];\n    cover = json['cover'];\n    roomId = json['roomid'];\n    roundStatus = json['roundStatus'];\n    watchedShow = json['watched_show'] == null\n        ? null\n        : WatchedShow.fromJson(json['watched_show']);\n  }\n}\n"
  },
  {
    "path": "lib/models/member/tags.dart",
    "content": "class MemberTagItemModel {\n  MemberTagItemModel({\n    this.count,\n    this.name,\n    this.tagid,\n    this.tip,\n  });\n\n  int? count;\n  String? name;\n  int? tagid;\n  String? tip;\n\n  MemberTagItemModel.fromJson(Map<String, dynamic> json) {\n    count = json['count'];\n    name = json['name'];\n    tagid = json['tagid'];\n    tip = json['tip'];\n  }\n}\n"
  },
  {
    "path": "lib/models/model_avatar.dart",
    "content": "import 'package:PiliPlus/models/model_owner.dart';\n\nclass Avatar extends Owner {\n  Pendant? pendant;\n  BaseOfficialVerify? officialVerify;\n  Vip? vip;\n\n  Avatar.fromJson(Map<String, dynamic> json) : super.fromJson(json) {\n    if (json['pendant'] != null) pendant = Pendant.fromJson(json['pendant']);\n    if (json['official_verify'] != null) {\n      officialVerify = BaseOfficialVerify.fromJson(json['official_verify']);\n    }\n    if (json['vip'] != null) vip = Vip.fromJson(json['vip']);\n  }\n}\n\nclass Pendant {\n  String? image;\n\n  Pendant.fromJson(Map<String, dynamic> json) {\n    image = json['image'];\n  }\n}\n\nclass BaseOfficialVerify {\n  int? type;\n  String? desc;\n\n  BaseOfficialVerify.fromJson(Map<String, dynamic> json) {\n    type = json['type'];\n    desc = json['desc'];\n  }\n}\n\nclass Vip {\n  int? type;\n  late int status;\n  Label? label;\n\n  Vip.fromJson(Map<String, dynamic> json) {\n    type = json['type'] ?? json['vipType'];\n    status = json['status'] ?? json['vipStatus'] ?? 0;\n    if (json['label'] != null) label = Label.fromJson(json['label']);\n  }\n}\n\nclass Label {\n  String? text;\n\n  Label.fromJson(Map<String, dynamic> json) {\n    text = json['text'];\n  }\n}\n"
  },
  {
    "path": "lib/models/model_hot_video_item.dart",
    "content": "import 'package:PiliPlus/models/model_owner.dart';\nimport 'package:PiliPlus/models/model_rec_video_item.dart';\nimport 'package:PiliPlus/models/model_video.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/dimension.dart';\nimport 'package:PiliPlus/pages/common/multi_select/base.dart';\n\n// 稍后再看, 排行榜等网页返回也使用该类\nclass HotVideoItemModel extends BaseRecVideoItemModel with MultiSelectData {\n  int? videos;\n  int? tid;\n  String? tname;\n  int? copyright;\n  int? ctime;\n  int? state;\n  Dimension? dimension;\n  String? firstFrame;\n  String? pubLocation;\n  String? pgcLabel;\n  String? redirectUrl;\n  num? progress;\n  int? isCooperation;\n  bool? isCharging;\n\n  HotVideoItemModel.fromJson(Map<String, dynamic> json) {\n    aid = json[\"aid\"];\n    cid = json[\"cid\"];\n    bvid = json[\"bvid\"];\n    videos = json[\"videos\"];\n    tid = json[\"tid\"];\n    tname = json[\"tname\"];\n    copyright = json[\"copyright\"];\n    cover = json[\"pic\"];\n    title = json[\"title\"];\n    pubdate = json[\"pubdate\"];\n    ctime = json[\"ctime\"];\n    desc = json[\"desc\"];\n    state = json[\"state\"];\n    duration = json[\"duration\"];\n    owner = Owner.fromJson(json[\"owner\"]);\n    stat = HotStat.fromJson(json['stat']);\n    dimension = Dimension.fromJson(json['dimension']);\n    firstFrame = json[\"first_frame\"];\n    pubLocation = json[\"pub_location\"];\n    dynamic rcmd = json['rcmd_reason'];\n    rcmdReason = rcmd is Map ? rcmd['content'] : rcmd; // 相关视频里rcmd为String,\n    if (rcmdReason?.isEmpty == true) rcmdReason = null;\n    pgcLabel = json['pgc_label'];\n    redirectUrl = json['redirect_url'];\n    // uri = json['uri']; // 仅在稍后再看存在\n    progress = json['progress'];\n    isCooperation = json['rights']?['is_cooperation'];\n    isCharging = json['charging_pay']?['level'] != null;\n  }\n\n  // @override\n  // get isFollowed => false;\n  // @override\n  // get goto => 'av';\n  // @override\n  // get uri => 'bilibili://video/$aid';\n}\n\nclass HotStat extends Stat {\n  int? reply;\n  int? favorite;\n  num? coin;\n  int? share;\n  int? nowRank;\n  int? hisRank;\n  int? dislike;\n  int? vt;\n  int? vv;\n\n  HotStat.fromJson(Map<String, dynamic> json) : super.fromJson(json) {\n    reply = json[\"reply\"];\n    favorite = json[\"favorite\"];\n    coin = json['coin'];\n    share = json[\"share\"];\n    nowRank = json[\"now_rank\"];\n    hisRank = json['his_rank'];\n    dislike = json[\"dislike\"];\n    vt = json['vt'];\n    vv = json[\"vv\"];\n  }\n}\n\n// class RcmdReason {\n//   RcmdReason({\n//     this.rcornerMark,\n//     this.content,\n//   });\n\n//   int? rcornerMark;\n//   String? content = '';\n\n//   RcmdReason.fromJson(Map<String, dynamic> json) {\n//     rcornerMark = json[\"corner_mark\"];\n//     content = json[\"content\"] ?? '';\n//   }\n// }\n"
  },
  {
    "path": "lib/models/model_owner.dart",
    "content": "import 'package:PiliPlus/models/model_video.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:hive_ce/hive.dart';\n\npart 'model_owner.g.dart';\n\n@HiveType(typeId: 3)\nclass Owner implements BaseOwner {\n  Owner({\n    this.mid,\n    this.name,\n    this.face,\n  });\n  @HiveField(0)\n  @override\n  int? mid;\n  @HiveField(1)\n  @override\n  String? name;\n  @HiveField(2)\n  String? face;\n\n  Owner.fromJson(Map<String, dynamic> json) {\n    mid = Utils.safeToInt(json[\"mid\"]);\n    name = json[\"name\"];\n    face = json['face'];\n  }\n\n  Map<String, dynamic> toJson() => {\n    'mid': mid,\n    'name': name,\n    'face': face,\n  };\n}\n"
  },
  {
    "path": "lib/models/model_owner.g.dart",
    "content": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'model_owner.dart';\n\n// **************************************************************************\n// TypeAdapterGenerator\n// **************************************************************************\n\nclass OwnerAdapter extends TypeAdapter<Owner> {\n  @override\n  final int typeId = 3;\n\n  @override\n  Owner read(BinaryReader reader) {\n    final numOfFields = reader.readByte();\n    final fields = <int, dynamic>{\n      for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),\n    };\n    return Owner(\n      mid: fields[0] as int?,\n      name: fields[1] as String?,\n      face: fields[2] as String?,\n    );\n  }\n\n  @override\n  void write(BinaryWriter writer, Owner obj) {\n    writer\n      ..writeByte(3)\n      ..writeByte(0)\n      ..write(obj.mid)\n      ..writeByte(1)\n      ..write(obj.name)\n      ..writeByte(2)\n      ..write(obj.face);\n  }\n\n  @override\n  int get hashCode => typeId.hashCode;\n\n  @override\n  bool operator ==(Object other) =>\n      identical(this, other) ||\n      other is OwnerAdapter &&\n          runtimeType == other.runtimeType &&\n          typeId == other.typeId;\n}\n"
  },
  {
    "path": "lib/models/model_rec_video_item.dart",
    "content": "import 'package:PiliPlus/models/model_owner.dart';\nimport 'package:PiliPlus/models/model_video.dart';\n\nabstract class BaseRecVideoItemModel extends BaseVideoItemModel {\n  String? goto;\n  String? uri;\n  String? rcmdReason;\n\n  // app推荐专属\n  int? param;\n  String? pgcBadge;\n}\n\nclass RecVideoItemModel extends BaseRecVideoItemModel {\n  RecVideoItemModel.fromJson(Map<String, dynamic> json) {\n    aid = json[\"id\"];\n    bvid = json[\"bvid\"];\n    cid = json[\"cid\"];\n    goto = json[\"goto\"];\n    uri = json[\"uri\"];\n    cover = json[\"pic\"];\n    title = json[\"title\"];\n    duration = json[\"duration\"];\n    pubdate = json[\"pubdate\"];\n    owner = Owner.fromJson(json[\"owner\"]);\n    stat = Stat.fromJson(json[\"stat\"]);\n    isFollowed = json[\"is_followed\"] == 1;\n    // rcmdReason = json[\"rcmd_reason\"] != null\n    //     ? RcmdReason.fromJson(json[\"rcmd_reason\"])\n    //     : RcmdReason(content: '');\n    rcmdReason = json[\"rcmd_reason\"]?['content'];\n  }\n\n  // @override\n  // String? get desc => null;\n}\n\n// @HiveType(typeId: 2)\n// class RcmdReason {\n//   RcmdReason({\n//     this.reasonType,\n//     this.content,\n//   });\n// //   int? reasonType;\n// //   String? content;\n//\n//   RcmdReason.fromJson(Map<String, dynamic> json) {\n//     reasonType = json[\"reason_type\"];\n//     content = json[\"content\"] ?? '';\n//   }\n// }\n"
  },
  {
    "path": "lib/models/model_video.dart",
    "content": "abstract class BaseSimpleVideoItemModel {\n  late String title;\n  String? bvid;\n  int? cid;\n  String? cover;\n  int duration = -1;\n  late BaseOwner owner;\n  late BaseStat stat;\n}\n\nabstract class BaseVideoItemModel extends BaseSimpleVideoItemModel {\n  int? aid;\n  String? desc;\n  int? pubdate;\n  bool isFollowed = false;\n}\n\nabstract class BaseOwner {\n  int? mid;\n  String? name;\n}\n\nabstract class BaseStat {\n  int? view;\n  int? like;\n  int? danmu;\n}\n\nclass Stat extends BaseStat {\n  Stat.fromJson(Map<String, dynamic> json) {\n    view = json[\"view\"];\n    like = json[\"like\"];\n    danmu = json['danmaku'];\n  }\n}\n\nclass PlayStat extends BaseStat {\n  PlayStat.fromJson(Map<String, dynamic> json) {\n    view = json['play'];\n    danmu = json['danmaku'];\n  }\n}\n"
  },
  {
    "path": "lib/models/pgc_lcf.dart",
    "content": "class PgcLCF {\n  num? coinNumber;\n  int? favorite;\n  int? isOriginal;\n  int? like;\n\n  PgcLCF({\n    this.coinNumber,\n    this.favorite,\n    this.isOriginal,\n    this.like,\n  });\n\n  factory PgcLCF.fromJson(Map<String, dynamic> json) => PgcLCF(\n    coinNumber: json[\"coin_number\"],\n    favorite: json[\"favorite\"],\n    isOriginal: json[\"is_original\"],\n    like: json[\"like\"],\n  );\n}\n"
  },
  {
    "path": "lib/models/search/result.dart",
    "content": "import 'package:PiliPlus/models/model_avatar.dart';\nimport 'package:PiliPlus/models/model_owner.dart';\nimport 'package:PiliPlus/models/model_video.dart';\nimport 'package:PiliPlus/utils/duration_utils.dart';\nimport 'package:PiliPlus/utils/em.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:PiliPlus/utils/extension/string_ext.dart';\n\nabstract class SearchNumData<T> {\n  SearchNumData({\n    this.numResults,\n    this.list,\n  });\n\n  int? numResults;\n  List<T>? list;\n}\n\nclass SearchAllData extends SearchNumData {\n  SearchAllData({\n    super.numResults,\n    super.list,\n  });\n\n  SearchAllData.fromJson(Map<String, dynamic> json) {\n    numResults = (json['numResults'] as num?)?.toInt();\n    if (json['result'] case List result) {\n      final isRefresh = json['page'] == 1;\n      list = [];\n      for (final item in result) {\n        if (item['data'] case List data) {\n          switch (item['result_type']) {\n            case 'media_bangumi' || 'media_bangumi':\n              if (isRefresh) {\n                list!.addAll(data.map((e) => SearchPgcItemModel.fromJson(e)));\n              }\n              break;\n            case 'bili_user':\n              if (isRefresh) {\n                list!.addAll(data.map((e) => SearchUserItemModel.fromJson(e)));\n              }\n              break;\n            case 'video':\n              list!.addAll(data.map((e) => SearchVideoItemModel.fromJson(e)));\n              break;\n          }\n        }\n      }\n    }\n  }\n}\n\nclass SearchVideoData extends SearchNumData<SearchVideoItemModel> {\n  SearchVideoData({\n    super.numResults,\n    super.list,\n  });\n\n  SearchVideoData.fromJson(Map<String, dynamic> json) {\n    numResults = (json['numResults'] as num?)?.toInt();\n    list = (json['result'] as List?)\n        ?.map<SearchVideoItemModel>((e) => SearchVideoItemModel.fromJson(e))\n        .toList();\n  }\n}\n\nclass SearchVideoItemModel extends BaseVideoItemModel {\n  String? type;\n  int? id;\n  String? arcurl;\n  String? tag;\n  int? ctime;\n  int? isUnionVideo;\n\n  List<({bool isEm, String text})>? titleList;\n\n  SearchVideoItemModel.fromJson(Map<String, dynamic> json) {\n    type = json['type'];\n    id = json['id'];\n    arcurl = json['arcurl'];\n    aid = json['aid'];\n    bvid = json['bvid'];\n    titleList = Em.regTitle(json['title']);\n    title = titleList!.map((i) => i.text).join();\n    desc = json['description'];\n    cover = (json['pic'] as String?)?.http2https;\n    pubdate = json['pubdate'];\n    ctime = json['senddate'];\n    duration = DurationUtils.parseDuration(json['duration']);\n    owner = SearchOwner.fromJson(json);\n    stat = SearchStat.fromJson(json);\n    isUnionVideo = json['is_union_video'];\n  }\n}\n\nclass SearchStat extends BaseStat {\n  // 收藏数\n  int? favorite;\n  // 评论数\n  int? reply;\n\n  SearchStat.fromJson(Map<String, dynamic> json) {\n    view = json['play'];\n    danmu = json['danmaku'];\n    favorite = json['favorite'];\n    reply = json['review'];\n    like = json['like'];\n  }\n}\n\nclass SearchOwner extends Owner {\n  SearchOwner.fromJson(Map<String, dynamic> json) {\n    mid = json[\"mid\"];\n    name = json[\"author\"];\n    face = json['upic'];\n  }\n}\n\nclass SearchUserData extends SearchNumData<SearchUserItemModel> {\n  SearchUserData({\n    super.numResults,\n    super.list,\n  });\n\n  SearchUserData.fromJson(Map<String, dynamic> json) {\n    numResults = (json['numResults'] as num?)?.toInt();\n    list = (json['result'] as List?)\n        ?.map<SearchUserItemModel>((e) => SearchUserItemModel.fromJson(e))\n        .toList();\n  }\n}\n\nclass SearchUserItemModel {\n  SearchUserItemModel({\n    this.type,\n    this.mid,\n    this.uname,\n    this.usign,\n    this.fans,\n    this.videos,\n    this.upic,\n    this.faceNft,\n    this.faceNftType,\n    this.verifyInfo,\n    this.level,\n    this.gender,\n    this.isUpUser,\n    this.isLive,\n    this.roomId,\n    this.officialVerify,\n    this.isSeniorMember,\n  });\n\n  String? type;\n  int? mid;\n  String? uname;\n  String? usign;\n  int? fans;\n  int? videos;\n  String? upic;\n  int? faceNft;\n  int? faceNftType;\n  String? verifyInfo;\n  int? level;\n  int? gender;\n  int? isUpUser;\n  int? isLive;\n  int? roomId;\n  BaseOfficialVerify? officialVerify;\n  int? isSeniorMember;\n\n  SearchUserItemModel.fromJson(Map<String, dynamic> json) {\n    type = json['type'];\n    mid = json['mid'];\n    uname = json['uname'];\n    usign = json['usign'];\n    fans = json['fans'];\n    videos = json['videos'];\n    upic = (json['upic'] as String?)?.http2https;\n    faceNft = json['face_nft'];\n    faceNftType = json['face_nft_type'];\n    verifyInfo = json['verify_info'];\n    level = json['level'];\n    gender = json['gender'];\n    isUpUser = json['is_upuser'];\n    isLive = json['is_live'];\n    roomId = json['room_id'];\n    officialVerify = json['official_verify'] == null\n        ? null\n        : BaseOfficialVerify.fromJson(json['official_verify']);\n    isSeniorMember = json['is_senior_member'];\n  }\n}\n\nclass SearchLiveData extends SearchNumData<SearchLiveItemModel> {\n  SearchLiveData({\n    super.numResults,\n    super.list,\n  });\n\n  SearchLiveData.fromJson(Map<String, dynamic> json) {\n    numResults = (json['numResults'] as num?)?.toInt();\n    list = json['result']\n        ?.map<SearchLiveItemModel>((e) => SearchLiveItemModel.fromJson(e))\n        .toList();\n  }\n}\n\nclass SearchLiveItemModel {\n  SearchLiveItemModel({\n    this.rankOffset,\n    this.uid,\n    this.tags,\n    this.liveTime,\n    this.uname,\n    this.uface,\n    this.face,\n    this.userCover,\n    this.type,\n    required this.title,\n    this.cover,\n    this.pic,\n    this.online,\n    this.rankIndex,\n    this.rankScore,\n    this.roomid,\n    this.attentions,\n    this.cateName,\n  });\n\n  int? rankOffset;\n  int? uid;\n  String? tags;\n  String? liveTime;\n  String? uname;\n  String? uface;\n  String? face;\n  String? userCover;\n  String? type;\n  late List<({bool isEm, String text})> title;\n  String? cover;\n  String? pic;\n  int? online;\n  int? rankIndex;\n  int? rankScore;\n  int? roomid;\n  int? attentions;\n  String? cateName;\n  Map? watchedShow;\n\n  SearchLiveItemModel.fromJson(Map<String, dynamic> json) {\n    rankOffset = json['rank_offset'];\n    uid = json['uid'];\n    tags = json['tags'];\n    liveTime = json['live_time'];\n    uname = json['uname'];\n    uface = json['uface'];\n    face = json['uface'];\n    userCover = json['user_cover'];\n    type = json['type'];\n    title = Em.regTitle(json['title']);\n    cover = json['cover'];\n    pic = json['cover'];\n    online = json['online'];\n    rankIndex = json['rank_index'];\n    rankScore = json['rank_score'];\n    roomid = json['roomid'];\n    attentions = json['attentions'];\n    cateName = Em.regCate(json['cate_name']);\n  }\n}\n\nclass SearchPgcData extends SearchNumData<SearchPgcItemModel> {\n  SearchPgcData({\n    super.numResults,\n    super.list,\n  });\n\n  SearchPgcData.fromJson(Map<String, dynamic> json) {\n    numResults = (json['numResults'] as num?)?.toInt();\n    list = (json['result'] as List?)\n        ?.map<SearchPgcItemModel>((e) => SearchPgcItemModel.fromJson(e))\n        .toList();\n  }\n}\n\nclass SearchPgcItemModel {\n  SearchPgcItemModel({\n    this.type,\n    this.mediaId,\n    required this.title,\n    this.orgTitle,\n    this.mediaType,\n    this.cv,\n    this.staff,\n    this.seasonId,\n    this.isAvid,\n    this.hitEpids,\n    this.seasonType,\n    this.seasonTypeName,\n    this.url,\n    this.buttonText,\n    this.isFollow,\n    this.isSelection,\n    this.cover,\n    this.areas,\n    this.styles,\n    this.gotoUrl,\n    this.desc,\n    this.pubtime,\n    this.mediaMode,\n    this.mediaScore,\n    this.indexShow,\n  });\n\n  String? type;\n  int? mediaId;\n  late List<({bool isEm, String text})> title;\n  String? orgTitle;\n  int? mediaType;\n  String? cv;\n  String? staff;\n  int? seasonId;\n  bool? isAvid;\n  String? hitEpids;\n  int? seasonType;\n  String? seasonTypeName;\n  String? url;\n  String? buttonText;\n  int? isFollow;\n  int? isSelection;\n  String? cover;\n  String? areas;\n  String? styles;\n  String? gotoUrl;\n  String? desc;\n  int? pubtime;\n  int? mediaMode;\n  Map? mediaScore;\n  String? indexShow;\n\n  SearchPgcItemModel.fromJson(Map<String, dynamic> json) {\n    type = json['type'];\n    mediaId = json['media_id'];\n    title = Em.regTitle(json['title']);\n    orgTitle = json['org_title'];\n    mediaType = json['media_type'];\n    cv = json['cv'];\n    staff = json['staff'];\n    seasonId = json['season_id'];\n    isAvid = json['is_avid'];\n    hitEpids = json['hit_epids'];\n    seasonType = json['season_type'];\n    seasonTypeName = json['season_type_name'];\n    url = json['url'];\n    buttonText = json['button_text'];\n    isFollow = json['is_follow'];\n    isSelection = json['is_selection'];\n    cover = json['cover'];\n    areas = json['areas'];\n    styles = json['styles'];\n    gotoUrl = json['goto_url'];\n    desc = json['desc'];\n    pubtime = json['pubtime'];\n    mediaMode = json['media_mode'];\n    mediaScore = json['media_score'];\n    indexShow = json['index_show'];\n  }\n}\n\nclass SearchArticleData extends SearchNumData<SearchArticleItemModel> {\n  SearchArticleData({\n    super.numResults,\n    super.list,\n  });\n\n  SearchArticleData.fromJson(Map<String, dynamic> json) {\n    numResults = (json['numResults'] as num?)?.toInt();\n    list = (json['result'] as List?)\n        ?.map<SearchArticleItemModel>((e) => SearchArticleItemModel.fromJson(e))\n        .toList();\n  }\n}\n\nclass SearchArticleItemModel {\n  SearchArticleItemModel({\n    this.pubTime,\n    this.like,\n    required this.title,\n    this.subTitle,\n    this.rankOffset,\n    this.mid,\n    this.imageUrls,\n    this.id,\n    this.categoryId,\n    this.view,\n    this.reply,\n    this.desc,\n    this.rankScore,\n    this.type,\n    this.templateId,\n    this.categoryName,\n  });\n\n  int? pubTime;\n  int? like;\n  late List<({bool isEm, String text})> title;\n  String? subTitle;\n  int? rankOffset;\n  int? mid;\n  List<String>? imageUrls;\n  int? id;\n  int? categoryId;\n  int? view;\n  int? reply;\n  String? desc;\n  int? rankScore;\n  String? type;\n  int? templateId;\n  String? categoryName;\n\n  SearchArticleItemModel.fromJson(Map<String, dynamic> json) {\n    pubTime = json['pub_time'];\n    like = json['like'];\n    title = Em.regTitle(json['title']);\n    subTitle = title.map((e) => e.text).join();\n    rankOffset = json['rank_offset'];\n    mid = json['mid'];\n    imageUrls = (json['image_urls'] as List?)?.fromCast();\n    id = json['id'];\n    categoryId = json['category_id'];\n    view = json['view'];\n    reply = json['reply'];\n    desc = json['desc'];\n    rankScore = json['rank_score'];\n    type = json['type'];\n    templateId = json['templateId'];\n    categoryName = json['category_name'];\n  }\n}\n"
  },
  {
    "path": "lib/models/search/suggest.dart",
    "content": "class SearchSuggestModel {\n  SearchSuggestModel({\n    this.tag,\n  });\n\n  List<SearchSuggestItem>? tag;\n\n  SearchSuggestModel.fromJson(Map<String, dynamic> json) {\n    tag = (json['tag'] as List?)\n        ?.map<SearchSuggestItem>((e) => SearchSuggestItem.fromJson(e))\n        .toList();\n  }\n}\n\nclass SearchSuggestItem {\n  String? term;\n  late String textRich;\n\n  SearchSuggestItem.fromJson(Map<String, dynamic> json) {\n    term = json['term'];\n    textRich = json['name'];\n  }\n}\n"
  },
  {
    "path": "lib/models/user/danmaku_block.dart",
    "content": "class DanmakuBlockDataModel {\n  late List<SimpleRule> rule;\n  late List<SimpleRule> rule1;\n  late List<SimpleRule> rule2;\n  String? toast;\n  int? valid;\n  int? ver;\n\n  DanmakuBlockDataModel.fromJson(Map<String, dynamic> json) {\n    rule = <SimpleRule>[];\n    rule1 = <SimpleRule>[];\n    rule2 = <SimpleRule>[];\n    if (json['rule'] case List list) {\n      for (final e in list) {\n        SimpleRule item = SimpleRule.fromJson(e);\n        switch (item.type) {\n          case 0:\n            rule.add(item);\n          case 1:\n            rule1.add(item);\n          case 2:\n            rule2.add(item);\n        }\n      }\n    }\n    toast = json['toast'] == '' ? null : json['toast'];\n    valid = json['valid'];\n    ver = json['ver'];\n  }\n}\n\nclass SimpleRule {\n  late final int id;\n  late final int type;\n  late final String filter;\n\n  SimpleRule.fromJson(Map<String, dynamic> json) {\n    id = json['id'];\n    type = json['type'];\n    filter = json['filter'];\n  }\n}\n"
  },
  {
    "path": "lib/models/user/danmaku_rule.dart",
    "content": "import 'package:PiliPlus/grpc/bilibili/community/service/dm/v1.pb.dart';\nimport 'package:PiliPlus/models/user/danmaku_block.dart';\n\nclass RuleFilter {\n  static final _regExp = RegExp(r'^/(.*)/$');\n\n  List<String> dmFilterString = [];\n  List<RegExp> dmRegExp = [];\n  Set<String> dmUid = {};\n\n  int count = 0;\n\n  RuleFilter(this.dmFilterString, this.dmRegExp, this.dmUid, [int? count]) {\n    this.count =\n        count ?? dmFilterString.length + dmRegExp.length + dmUid.length;\n  }\n\n  RuleFilter.fromRuleTypeEntries(List<List<SimpleRule>> rules) {\n    dmFilterString = rules[0].map((e) => e.filter).toList();\n\n    dmRegExp = rules[1]\n        .map(\n          (e) => RegExp(\n            _regExp.matchAsPrefix(e.filter)?.group(1) ?? e.filter,\n            caseSensitive: false,\n          ),\n        )\n        .toList();\n\n    dmUid = rules[2].map((e) => e.filter).toSet();\n\n    count = dmFilterString.length + dmRegExp.length + dmUid.length;\n  }\n\n  RuleFilter.empty();\n\n  bool remove(DanmakuElem elem) {\n    return dmUid.contains(elem.midHash) ||\n        dmFilterString.any((i) => elem.content.contains(i)) ||\n        dmRegExp.any((i) => i.hasMatch(elem.content));\n  }\n}\n"
  },
  {
    "path": "lib/models/user/danmaku_rule_adapter.dart",
    "content": "import 'package:PiliPlus/models/user/danmaku_rule.dart';\nimport 'package:hive_ce/hive.dart';\n\nclass RuleFilterAdapter extends TypeAdapter<RuleFilter> {\n  @override\n  final int typeId = 12;\n\n  @override\n  RuleFilter read(BinaryReader reader) {\n    return RuleFilter(\n      reader.readStringList(),\n      reader\n          .readStringList()\n          .map((i) => RegExp(i, caseSensitive: false))\n          .toList(),\n      reader.readStringList().toSet(),\n    );\n  }\n\n  @override\n  void write(BinaryWriter writer, RuleFilter obj) {\n    writer\n      ..writeStringList(obj.dmFilterString)\n      ..writeStringList(obj.dmRegExp.map((i) => i.pattern).toList())\n      ..writeStringList(obj.dmUid.toList());\n  }\n\n  @override\n  int get hashCode => typeId.hashCode;\n\n  @override\n  bool operator ==(Object other) =>\n      identical(this, other) ||\n      other is RuleFilterAdapter &&\n          runtimeType == other.runtimeType &&\n          typeId == other.typeId;\n}\n"
  },
  {
    "path": "lib/models/user/info.dart",
    "content": "import 'package:PiliPlus/utils/extension/map_ext.dart';\nimport 'package:hive_ce/hive.dart';\n\npart 'info.g.dart';\n\n@HiveType(typeId: 4)\nclass UserInfoData {\n  UserInfoData({\n    this.isLogin,\n    this.emailVerified,\n    this.face,\n    this.levelInfo,\n    this.mid,\n    this.mobileVerified,\n    this.money,\n    this.moral,\n    this.official,\n    this.officialVerify,\n    this.pendant,\n    this.scores,\n    this.uname,\n    this.vipDueDate,\n    this.vipStatus,\n    this.vipType,\n    this.vipPayType,\n    this.vipThemeType,\n    this.vipLabel,\n    this.vipAvatarSub,\n    this.vipNicknameColor,\n    this.wallet,\n    this.hasShop,\n    this.shopUrl,\n    this.isSeniorMember,\n  });\n  @HiveField(0)\n  bool? isLogin;\n  @HiveField(1)\n  int? emailVerified;\n  @HiveField(2)\n  String? face;\n  @HiveField(3)\n  LevelInfo? levelInfo;\n  @HiveField(4)\n  int? mid;\n  @HiveField(5)\n  int? mobileVerified;\n  @HiveField(6)\n  double? money;\n  @HiveField(7)\n  int? moral;\n  @HiveField(8)\n  Map? official;\n  @HiveField(9)\n  Map? officialVerify;\n  @HiveField(10)\n  Map? pendant;\n  @HiveField(11)\n  int? scores;\n  @HiveField(12)\n  String? uname;\n  @HiveField(13)\n  int? vipDueDate;\n  @HiveField(14)\n  int? vipStatus;\n  @HiveField(15)\n  int? vipType;\n  @HiveField(16)\n  int? vipPayType;\n  @HiveField(17)\n  int? vipThemeType;\n  @HiveField(18)\n  Map? vipLabel;\n  @HiveField(19)\n  int? vipAvatarSub;\n  @HiveField(20)\n  String? vipNicknameColor;\n  @HiveField(21)\n  Map? wallet;\n  @HiveField(22)\n  bool? hasShop;\n  @HiveField(23)\n  String? shopUrl;\n  @HiveField(24)\n  int? isSeniorMember;\n\n  UserInfoData.fromJson(Map<String, dynamic> json) {\n    isLogin = json['isLogin'] ?? false;\n    emailVerified = json['email_verified'];\n    face = json['face'];\n    levelInfo = json['level_info'] != null\n        ? LevelInfo.fromJson(json['level_info'])\n        : null;\n    mid = json['mid'];\n    mobileVerified = json['mobile_verified'];\n    money = json['money'] is int ? json['money'].toDouble() : json['money'];\n    moral = json['moral'];\n    official = json['official'];\n    officialVerify = json['officialVerify'];\n    pendant = json['pendant'];\n    scores = json['scores'];\n    uname = json['uname'];\n    vipDueDate = json['vipDueDate'];\n    vipStatus = json['vipStatus'];\n    vipType = json['vipType'];\n    vipPayType = json['vip_pay_type'];\n    vipThemeType = json['vip_theme_type'];\n    vipLabel = json['vip_label'];\n    vipAvatarSub = json['vip_avatar_subscript'];\n    vipNicknameColor = json['vip_nickname_color'];\n    wallet = json['wallet'];\n    hasShop = json['has_shop'];\n    shopUrl = json['shop_url'];\n    isSeniorMember = json['is_senior_member'];\n  }\n\n  @override\n  int get hashCode => Object.hash(mid, uname, face, money, vipStatus);\n\n  @override\n  bool operator ==(Object other) {\n    return identical(this, other) ||\n        other is UserInfoData &&\n            isLogin == other.isLogin &&\n            face == other.face &&\n            levelInfo == other.levelInfo &&\n            mid == other.mid &&\n            money == other.money &&\n            uname == other.uname &&\n            vipDueDate == other.vipDueDate &&\n            vipStatus == other.vipStatus &&\n            isSeniorMember == other.isSeniorMember;\n  }\n}\n\n@HiveType(typeId: 5)\nclass LevelInfo {\n  LevelInfo({\n    this.currentLevel,\n    this.currentMin,\n    this.currentExp,\n    this.nextExp,\n  });\n  @HiveField(0)\n  int? currentLevel;\n  @HiveField(1)\n  int? currentMin;\n  @HiveField(2)\n  int? currentExp;\n  @HiveField(3)\n  int? nextExp;\n\n  LevelInfo.fromJson(Map<String, dynamic> json) {\n    currentLevel = json['current_level'];\n    currentMin = json['current_min'];\n    currentExp = json['current_exp'];\n    nextExp = json['current_level'] == 6\n        ? json['current_exp']\n        : json['next_exp'];\n  }\n\n  @override\n  int get hashCode => currentExp.hashCode;\n\n  @override\n  bool operator ==(Object other) {\n    return identical(this, other) ||\n        other is LevelInfo && currentExp == other.currentExp;\n  }\n}\n"
  },
  {
    "path": "lib/models/user/info.g.dart",
    "content": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'info.dart';\n\n// **************************************************************************\n// TypeAdapterGenerator\n// **************************************************************************\n\nclass UserInfoDataAdapter extends TypeAdapter<UserInfoData> {\n  @override\n  final int typeId = 4;\n\n  @override\n  UserInfoData read(BinaryReader reader) {\n    final numOfFields = reader.readByte();\n    final fields = <int, dynamic>{\n      for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),\n    };\n    return UserInfoData(\n      isLogin: fields[0] as bool?,\n      emailVerified: fields[1] as int?,\n      face: fields[2] as String?,\n      levelInfo: fields[3] as LevelInfo?,\n      mid: fields[4] as int?,\n      mobileVerified: fields[5] as int?,\n      money: fields[6] as double?,\n      moral: fields[7] as int?,\n      official: (fields[8] as Map?)?.fromCast<dynamic, dynamic>(),\n      officialVerify: (fields[9] as Map?)?.fromCast<dynamic, dynamic>(),\n      pendant: (fields[10] as Map?)?.fromCast<dynamic, dynamic>(),\n      scores: fields[11] as int?,\n      uname: fields[12] as String?,\n      vipDueDate: fields[13] as int?,\n      vipStatus: fields[14] as int?,\n      vipType: fields[15] as int?,\n      vipPayType: fields[16] as int?,\n      vipThemeType: fields[17] as int?,\n      vipLabel: (fields[18] as Map?)?.fromCast<dynamic, dynamic>(),\n      vipAvatarSub: fields[19] as int?,\n      vipNicknameColor: fields[20] as String?,\n      wallet: (fields[21] as Map?)?.fromCast<dynamic, dynamic>(),\n      hasShop: fields[22] as bool?,\n      shopUrl: fields[23] as String?,\n      isSeniorMember: fields[24] as int?,\n    );\n  }\n\n  @override\n  void write(BinaryWriter writer, UserInfoData obj) {\n    writer\n      ..writeByte(25)\n      ..writeByte(0)\n      ..write(obj.isLogin)\n      ..writeByte(1)\n      ..write(obj.emailVerified)\n      ..writeByte(2)\n      ..write(obj.face)\n      ..writeByte(3)\n      ..write(obj.levelInfo)\n      ..writeByte(4)\n      ..write(obj.mid)\n      ..writeByte(5)\n      ..write(obj.mobileVerified)\n      ..writeByte(6)\n      ..write(obj.money)\n      ..writeByte(7)\n      ..write(obj.moral)\n      ..writeByte(8)\n      ..write(obj.official)\n      ..writeByte(9)\n      ..write(obj.officialVerify)\n      ..writeByte(10)\n      ..write(obj.pendant)\n      ..writeByte(11)\n      ..write(obj.scores)\n      ..writeByte(12)\n      ..write(obj.uname)\n      ..writeByte(13)\n      ..write(obj.vipDueDate)\n      ..writeByte(14)\n      ..write(obj.vipStatus)\n      ..writeByte(15)\n      ..write(obj.vipType)\n      ..writeByte(16)\n      ..write(obj.vipPayType)\n      ..writeByte(17)\n      ..write(obj.vipThemeType)\n      ..writeByte(18)\n      ..write(obj.vipLabel)\n      ..writeByte(19)\n      ..write(obj.vipAvatarSub)\n      ..writeByte(20)\n      ..write(obj.vipNicknameColor)\n      ..writeByte(21)\n      ..write(obj.wallet)\n      ..writeByte(22)\n      ..write(obj.hasShop)\n      ..writeByte(23)\n      ..write(obj.shopUrl)\n      ..writeByte(24)\n      ..write(obj.isSeniorMember);\n  }\n\n  @override\n  int get hashCode => typeId.hashCode;\n\n  @override\n  bool operator ==(Object other) =>\n      identical(this, other) ||\n      other is UserInfoDataAdapter &&\n          runtimeType == other.runtimeType &&\n          typeId == other.typeId;\n}\n\nclass LevelInfoAdapter extends TypeAdapter<LevelInfo> {\n  @override\n  final int typeId = 5;\n\n  @override\n  LevelInfo read(BinaryReader reader) {\n    final numOfFields = reader.readByte();\n    final fields = <int, dynamic>{\n      for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),\n    };\n    return LevelInfo(\n      currentLevel: fields[0] as int?,\n      currentMin: fields[1] as int?,\n      currentExp: fields[2] as int?,\n      nextExp: fields[3] as int?,\n    );\n  }\n\n  @override\n  void write(BinaryWriter writer, LevelInfo obj) {\n    writer\n      ..writeByte(4)\n      ..writeByte(0)\n      ..write(obj.currentLevel)\n      ..writeByte(1)\n      ..write(obj.currentMin)\n      ..writeByte(2)\n      ..write(obj.currentExp)\n      ..writeByte(3)\n      ..write(obj.nextExp);\n  }\n\n  @override\n  int get hashCode => typeId.hashCode;\n\n  @override\n  bool operator ==(Object other) =>\n      identical(this, other) ||\n      other is LevelInfoAdapter &&\n          runtimeType == other.runtimeType &&\n          typeId == other.typeId;\n}\n"
  },
  {
    "path": "lib/models/user/stat.dart",
    "content": "import 'package:hive_ce/hive.dart';\n\npart 'stat.g.dart';\n\n@HiveType(typeId: 1)\nclass UserStat {\n  const UserStat({\n    this.following,\n    this.follower,\n    this.dynamicCount,\n  });\n\n  @HiveField(0)\n  final int? following;\n  @HiveField(1)\n  final int? follower;\n  @HiveField(2)\n  final int? dynamicCount;\n\n  factory UserStat.fromJson(Map<String, dynamic> json) => UserStat(\n    following: json['following'],\n    follower: json['follower'],\n    dynamicCount: json['dynamic_count'],\n  );\n}\n"
  },
  {
    "path": "lib/models/user/stat.g.dart",
    "content": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'stat.dart';\n\n// **************************************************************************\n// TypeAdapterGenerator\n// **************************************************************************\n\nclass UserStatAdapter extends TypeAdapter<UserStat> {\n  @override\n  final int typeId = 1;\n\n  @override\n  UserStat read(BinaryReader reader) {\n    final numOfFields = reader.readByte();\n    final fields = <int, dynamic>{\n      for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),\n    };\n    return UserStat(\n      following: fields[0] as int?,\n      follower: fields[1] as int?,\n      dynamicCount: fields[2] as int?,\n    );\n  }\n\n  @override\n  void write(BinaryWriter writer, UserStat obj) {\n    writer\n      ..writeByte(3)\n      ..writeByte(0)\n      ..write(obj.following)\n      ..writeByte(1)\n      ..write(obj.follower)\n      ..writeByte(2)\n      ..write(obj.dynamicCount);\n  }\n\n  @override\n  int get hashCode => typeId.hashCode;\n\n  @override\n  bool operator ==(Object other) =>\n      identical(this, other) ||\n      other is UserStatAdapter &&\n          runtimeType == other.runtimeType &&\n          typeId == other.typeId;\n}\n"
  },
  {
    "path": "lib/models/video/play/url.dart",
    "content": "import 'dart:math' show max, min;\n\nimport 'package:PiliPlus/models/common/video/audio_quality.dart';\nimport 'package:PiliPlus/models/common/video/video_quality.dart';\nimport 'package:PiliPlus/models_new/sponsor_block/segment_item.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\n\nclass PlayUrlModel {\n  PlayUrlModel({\n    this.from,\n    this.result,\n    this.message,\n    this.quality,\n    this.format,\n    this.timeLength,\n    this.acceptFormat,\n    this.acceptDesc,\n    this.acceptQuality,\n    this.videoCodecid,\n    this.seekParam,\n    this.seekType,\n    this.dash,\n    this.supportFormats,\n    this.lastPlayTime,\n    this.lastPlayCid,\n  });\n\n  String? from;\n  String? result;\n  String? message;\n  int? quality;\n  String? format;\n  int? timeLength;\n  String? acceptFormat;\n  List<dynamic>? acceptDesc;\n  List<int>? acceptQuality;\n  int? videoCodecid;\n  String? seekParam;\n  String? seekType;\n  Dash? dash;\n  List<Durl>? durl;\n  List<FormatItem>? supportFormats;\n  Volume? volume;\n  int? lastPlayTime;\n  int? lastPlayCid;\n  String? curLanguage;\n  Language? language;\n  List<SegmentItemModel>? clipInfoList;\n\n  PlayUrlModel.fromJson(Map<String, dynamic> json) {\n    from = json['from'];\n    result = json['result'];\n    message = json['message'];\n    quality = json['quality'];\n    format = json['format'];\n    timeLength = json['timelength'];\n    acceptFormat = json['accept_format'];\n    acceptDesc = json['accept_description'];\n    acceptQuality = (json['accept_quality'] as List?)\n        ?.map<int>((e) => e as int)\n        .toList();\n    videoCodecid = json['video_codecid'];\n    seekParam = json['seek_param'];\n    seekType = json['seek_type'];\n    dash = json['dash'] != null ? Dash.fromJson(json['dash']) : null;\n    durl = (json['durl'] as List?)?.map<Durl>((e) => Durl.fromJson(e)).toList();\n    supportFormats = (json['support_formats'] as List?)\n        ?.map<FormatItem>((e) => FormatItem.fromJson(e))\n        .toList();\n    volume = json['volume'] == null ? null : Volume.fromJson(json['volume']);\n    lastPlayTime = json['last_play_time'];\n    lastPlayCid = json['last_play_cid'];\n    curLanguage = json['cur_language'];\n    language = json['language'] == null\n        ? null\n        : Language.fromJson(json['language']);\n    // debug\n    // final clipInfoList = [\n    //   {\n    //     \"start\": 0,\n    //     \"end\": 150,\n    //     \"clipType\": \"CLIP_TYPE_OP\",\n    //   },\n    //   {\n    //     \"start\": timeLength! ~/ 1000 - 150,\n    //     \"end\": timeLength! ~/ 1000,\n    //     \"clipType\": \"CLIP_TYPE_ED\",\n    //   },\n    // ];\n    try {\n      final List? clipInfoList = json['clip_info_list'];\n      if (clipInfoList != null && clipInfoList.isNotEmpty) {\n        this.clipInfoList = clipInfoList\n            .map((e) => SegmentItemModel.fromPgcJson(e, timeLength))\n            .toList();\n      }\n    } catch (_) {\n      if (kDebugMode) rethrow;\n    }\n  }\n}\n\nclass Language {\n  Language({\n    this.support,\n    this.items,\n  });\n\n  bool? support;\n  List<LanguageItem>? items;\n\n  Language.fromJson(Map<String, dynamic> json) {\n    support = json['support'];\n    items =\n        (json['items'] as List?)?.map((e) => LanguageItem.fromJson(e)).toList()\n          ?..sort((a, b) {\n            final aHasZh = a.lang?.contains('zh') ?? false;\n            final bHasZh = b.lang?.contains('zh') ?? false;\n            if (aHasZh != bHasZh) return aHasZh ? -1 : 1;\n            if (a.isAi != b.isAi) return a.isAi ? 1 : -1;\n            return 0;\n          });\n  }\n}\n\nclass LanguageItem {\n  LanguageItem({\n    this.lang,\n    this.title,\n    this.subtitleLang,\n  });\n\n  String? lang;\n  String? title;\n  String? subtitleLang;\n  bool isAi = false;\n\n  LanguageItem.fromJson(Map<String, dynamic> json) {\n    lang = json['lang'];\n    isAi = json['production_type'] == 2;\n    title = '${json['title']}${isAi ? '（AI）' : ''}';\n    subtitleLang = json['subtitle_lang'];\n  }\n}\n\nclass Dash {\n  Dash({\n    this.duration,\n    this.minBufferTime,\n    this.video,\n    this.audio,\n  });\n\n  int? duration;\n  double? minBufferTime;\n  List<VideoItem>? video;\n  List<AudioItem>? audio;\n\n  Dash.fromJson(Map<String, dynamic> json) {\n    duration = json['duration'];\n    minBufferTime = json['minBufferTime'];\n    video = (json['video'] as List?)\n        ?.map<VideoItem>((e) => VideoItem.fromJson(e))\n        .toList();\n    final audio = [\n      if (json['flac']?['audio'] case Map<String, dynamic> flac)\n        AudioItem.fromJson(flac),\n      if (json['dolby']?['audio'] case List list)\n        ...list.map((e) => AudioItem.fromJson(e)),\n      if (json['audio'] case List list)\n        ...list.map((e) => AudioItem.fromJson(e)),\n    ];\n    this.audio = audio.isEmpty ? null : audio;\n  }\n}\n\nclass Durl {\n  int? order;\n  int? length;\n  int? size;\n  String? ahead;\n  String? vhead;\n  String? url;\n  List<String>? backupUrl;\n\n  Durl({\n    this.order,\n    this.length,\n    this.size,\n    this.ahead,\n    this.vhead,\n    this.url,\n    this.backupUrl,\n  });\n\n  factory Durl.fromJson(Map<String, dynamic> json) {\n    return Durl(\n      order: json['order'],\n      length: json['length'],\n      size: json['size'],\n      ahead: json['ahead'],\n      vhead: json['vhead'],\n      url: json['url'],\n      backupUrl: (json['backup_url'] as List?)?.fromCast<String>(),\n    );\n  }\n\n  Iterable<String> get playUrls sync* {\n    if (url?.isNotEmpty == true) yield url!;\n    if (backupUrl?.isNotEmpty == true) yield* backupUrl!;\n  }\n}\n\nabstract class BaseItem {\n  int? id;\n  String? baseUrl;\n  List<String>? backupUrl;\n  int? bandWidth;\n  String? mimeType;\n  String? codecs;\n  int? width;\n  int? height;\n  String? frameRate;\n  String? sar;\n  int? startWithSap;\n  Map? segmentBase;\n  int? codecid;\n\n  BaseItem({\n    this.id,\n    this.baseUrl,\n    this.backupUrl,\n    this.bandWidth,\n    this.mimeType,\n    this.codecs,\n    this.width,\n    this.height,\n    this.frameRate,\n    this.sar,\n    this.startWithSap,\n    this.segmentBase,\n    this.codecid,\n  });\n\n  BaseItem.fromJson(Map<String, dynamic> json) {\n    id = json['id'];\n    baseUrl = json['baseUrl'] ?? json['base_url'];\n    backupUrl = ((json['backupUrl'] ?? json['backup_url']) as List?)\n        ?.fromCast<String>();\n    bandWidth = json['bandWidth'] ?? json['bandwidth'];\n    mimeType = json['mime_type'];\n    codecs = json['codecs'];\n    width = json['width'];\n    height = json['height'];\n    frameRate = json['frameRate'] ?? json['frame_rate'];\n    sar = json['sar'];\n    startWithSap = json['startWithSap'] ?? json['start_with_sap'];\n    segmentBase = json['segmentBase'] ?? json['segment_base'];\n    codecid = json['codecid'];\n  }\n\n  Iterable<String> get playUrls sync* {\n    if (baseUrl?.isNotEmpty == true) yield baseUrl!;\n    if (backupUrl?.isNotEmpty == true) yield* backupUrl!;\n  }\n}\n\nclass VideoItem extends BaseItem {\n  late VideoQuality quality;\n\n  VideoItem({\n    super.id,\n    super.baseUrl,\n    super.backupUrl,\n    super.bandWidth,\n    super.mimeType,\n    super.codecs,\n    super.width,\n    super.height,\n    super.frameRate,\n    super.sar,\n    super.startWithSap,\n    super.segmentBase,\n    super.codecid,\n    required this.quality,\n  });\n\n  VideoItem.fromJson(Map<String, dynamic> json) : super.fromJson(json) {\n    quality = VideoQuality.fromCode(json['id']);\n  }\n}\n\nclass AudioItem extends BaseItem {\n  late String quality;\n\n  AudioItem();\n\n  AudioItem.fromJson(Map<String, dynamic> json) : super.fromJson(json) {\n    quality = AudioQuality.fromCode(json['id']).desc;\n  }\n}\n\nclass FormatItem {\n  FormatItem({\n    this.quality,\n    this.format,\n    this.newDesc,\n    this.displayDesc,\n    this.codecs,\n  });\n\n  int? quality;\n  String? format;\n  String? newDesc;\n  String? displayDesc;\n  List<String>? codecs;\n\n  FormatItem.fromJson(Map<String, dynamic> json) {\n    quality = json['quality'];\n    format = json['format'];\n    newDesc = json['new_description'];\n    displayDesc = json['display_desc'];\n    codecs = (json['codecs'] as List?)?.fromCast<String>();\n  }\n}\n\nclass Volume {\n  Volume({\n    required this.measuredI,\n    required this.measuredLra,\n    required this.measuredTp,\n    required this.measuredThreshold,\n    required this.targetOffset,\n    required this.targetI,\n    required this.targetTp,\n    // required this.multiSceneArgs,\n  });\n\n  final num measuredI;\n  final num measuredLra;\n  final num measuredTp;\n  final num measuredThreshold;\n  final num targetOffset;\n  final num targetI;\n  final num targetTp;\n\n  // final MultiSceneArgs? multiSceneArgs;\n\n  // FFmpeg loudnorm 滤镜的标准有效范围（https://ffmpeg.org/ffmpeg-filters.html#loudnorm）\n  static const double minTpValue = -9.0;\n  static const double maxTpValue = 0.0;\n\n  factory Volume.fromJson(Map<String, dynamic> json) {\n    return Volume(\n      measuredI: json[\"measured_i\"] ?? 0,\n      measuredLra: json[\"measured_lra\"] ?? 0,\n      measuredTp: json[\"measured_tp\"] ?? 0,\n      measuredThreshold: json[\"measured_threshold\"] ?? 0,\n      targetOffset: json[\"target_offset\"] ?? 0,\n      targetI: json[\"target_i\"] ?? 0,\n      targetTp: json[\"target_tp\"] ?? 0,\n      // multiSceneArgs: json[\"multi_scene_args\"] == null ? null : MultiSceneArgs.fromJson(json[\"multi_scene_args\"]),\n    );\n  }\n\n  String format(Map<String, num> config) {\n    final lra = max(config['lra'] ?? 11, measuredLra);\n    num i = config['i'] ?? targetI;\n    final tp = min(\n      config['tp'] ?? targetTp,\n      measuredTp,\n    ).clamp(minTpValue, maxTpValue);\n    final offset = config['offset'] ?? targetOffset;\n    num measuredI = this.measuredI;\n    if (measuredI > 0) {\n      i -= measuredI;\n      measuredI = 0;\n    }\n    num measuredThreshold = this.measuredThreshold;\n    if (measuredThreshold > 0) {\n      measuredThreshold = 0;\n    }\n\n    return 'LRA=$lra:I=$i:TP=$tp:offset=$offset:linear=true:measured_I=$measuredI:measured_LRA=$measuredLra:measured_TP=$measuredTp:measured_thresh=$measuredThreshold';\n  }\n\n  bool get isNotEmpty =>\n      measuredI != 0 ||\n      measuredLra != 0 ||\n      measuredTp != 0 ||\n      measuredThreshold != 0;\n}\n"
  },
  {
    "path": "lib/models_new/account_myinfo/data.dart",
    "content": "class AccountMyInfoData {\n  int? mid;\n  String? name;\n  String? sign;\n  num? coins;\n  String? birthday;\n  String? face;\n  int? faceNftNew;\n  int? sex;\n  int? level;\n  int? rank;\n  int? silence;\n  int? emailStatus;\n  int? telStatus;\n  int? identification;\n  int? isTourist;\n  int? pinPrompting;\n  int? inRegAudit;\n  bool? hasFaceNft;\n  bool? setBirthday;\n\n  AccountMyInfoData({\n    this.mid,\n    this.name,\n    this.sign,\n    this.coins,\n    this.birthday,\n    this.face,\n    this.faceNftNew,\n    this.sex,\n    this.level,\n    this.rank,\n    this.silence,\n    this.emailStatus,\n    this.telStatus,\n    this.identification,\n    this.isTourist,\n    this.pinPrompting,\n    this.inRegAudit,\n    this.hasFaceNft,\n    this.setBirthday,\n  });\n\n  factory AccountMyInfoData.fromJson(Map<String, dynamic> json) =>\n      AccountMyInfoData(\n        mid: json['mid'] as int?,\n        name: json['name'] as String?,\n        sign: json['sign'] as String?,\n        coins: json['coins'] as num?,\n        birthday: json['birthday'] as String?,\n        face: json['face'] as String?,\n        faceNftNew: json['face_nft_new'] as int?,\n        sex: json['sex'] as int?,\n        level: json['level'] as int?,\n        rank: json['rank'] as int?,\n        silence: json['silence'] as int?,\n        emailStatus: json['email_status'] as int?,\n        telStatus: json['tel_status'] as int?,\n        identification: json['identification'] as int?,\n        isTourist: json['is_tourist'] as int?,\n        pinPrompting: json['pin_prompting'] as int?,\n        inRegAudit: json['in_reg_audit'] as int?,\n        hasFaceNft: json['has_face_nft'] as bool?,\n        setBirthday: json['set_birthday'] as bool?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/article/article_info/data.dart",
    "content": "import 'package:PiliPlus/models_new/article/article_info/share_channel.dart';\nimport 'package:PiliPlus/models_new/article/article_info/stats.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\n\nclass ArticleInfoData {\n  int? like;\n  bool? attention;\n  bool? favorite;\n  num? coin;\n  Stats? stats;\n  String? title;\n  String? bannerUrl;\n  int? mid;\n  String? authorName;\n  bool? isAuthor;\n  List<String>? imageUrls;\n  List<String>? originImageUrls;\n  bool? shareable;\n  bool? showLaterWatch;\n  bool? showSmallWindow;\n  bool? inList;\n  int? pre;\n  int? next;\n  List<ShareChannel>? shareChannels;\n  int? type;\n  String? videoUrl;\n  String? location;\n  bool? disableShare;\n\n  ArticleInfoData({\n    this.like,\n    this.attention,\n    this.favorite,\n    this.coin,\n    this.stats,\n    this.title,\n    this.bannerUrl,\n    this.mid,\n    this.authorName,\n    this.isAuthor,\n    this.imageUrls,\n    this.originImageUrls,\n    this.shareable,\n    this.showLaterWatch,\n    this.showSmallWindow,\n    this.inList,\n    this.pre,\n    this.next,\n    this.shareChannels,\n    this.type,\n    this.videoUrl,\n    this.location,\n    this.disableShare,\n  });\n\n  factory ArticleInfoData.fromJson(Map<String, dynamic> json) =>\n      ArticleInfoData(\n        like: json['like'] as int?,\n        attention: json['attention'] as bool?,\n        favorite: json['favorite'] as bool?,\n        coin: json['coin'] as num?,\n        stats: json['stats'] == null\n            ? null\n            : Stats.fromJson(json['stats'] as Map<String, dynamic>),\n        title: json['title'] as String?,\n        bannerUrl: json['banner_url'] as String?,\n        mid: json['mid'] as int?,\n        authorName: json['author_name'] as String?,\n        isAuthor: json['is_author'] as bool?,\n        imageUrls: (json['image_urls'] as List?)?.fromCast(),\n        originImageUrls: (json['origin_image_urls'] as List?)?.fromCast(),\n        shareable: json['shareable'] as bool?,\n        showLaterWatch: json['show_later_watch'] as bool?,\n        showSmallWindow: json['show_small_window'] as bool?,\n        inList: json['in_list'] as bool?,\n        pre: json['pre'] as int?,\n        next: json['next'] as int?,\n        shareChannels: (json['share_channels'] as List<dynamic>?)\n            ?.map((e) => ShareChannel.fromJson(e as Map<String, dynamic>))\n            .toList(),\n        type: json['type'] as int?,\n        videoUrl: json['video_url'] as String?,\n        location: json['location'] as String?,\n        disableShare: json['disable_share'] as bool?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/article/article_info/share_channel.dart",
    "content": "class ShareChannel {\n  String? name;\n  String? picture;\n  String? shareChannel;\n\n  ShareChannel({this.name, this.picture, this.shareChannel});\n\n  factory ShareChannel.fromJson(Map<String, dynamic> json) => ShareChannel(\n    name: json['name'] as String?,\n    picture: json['picture'] as String?,\n    shareChannel: json['share_channel'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/article/article_info/stats.dart",
    "content": "class Stats {\n  int? view;\n  int? favorite;\n  int? like;\n  int? dislike;\n  int? reply;\n  int? share;\n  num? coin;\n  int? dynam1c;\n\n  Stats({\n    this.view,\n    this.favorite,\n    this.like,\n    this.dislike,\n    this.reply,\n    this.share,\n    this.coin,\n    this.dynam1c,\n  });\n\n  factory Stats.fromJson(Map<String, dynamic> json) => Stats(\n    view: json['view'] as int?,\n    favorite: json['favorite'] as int?,\n    like: json['like'] as int?,\n    dislike: json['dislike'] as int?,\n    reply: json['reply'] as int?,\n    share: json['share'] as int?,\n    coin: json['coin'] as num?,\n    dynam1c: json['dynamic'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/article/article_list/article.dart",
    "content": "import 'package:PiliPlus/models_new/article/article_list/category.dart';\nimport 'package:PiliPlus/models_new/article/article_list/stats.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\n\nclass ArticleListItemModel {\n  int? id;\n  String? title;\n  int? state;\n  int? publishTime;\n  int? words;\n  List<String>? imageUrls;\n  Category? category;\n  List<Category>? categories;\n  String? summary;\n  int? type;\n  String? dynIdStr;\n  int? attributes;\n  int? authorUid;\n  int? onlyFans;\n  Stats? stats;\n  int? likeState;\n\n  ArticleListItemModel({\n    this.id,\n    this.title,\n    this.state,\n    this.publishTime,\n    this.words,\n    this.imageUrls,\n    this.category,\n    this.categories,\n    this.summary,\n    this.type,\n    this.dynIdStr,\n    this.attributes,\n    this.authorUid,\n    this.onlyFans,\n    this.stats,\n    this.likeState,\n  });\n\n  factory ArticleListItemModel.fromJson(Map<String, dynamic> json) =>\n      ArticleListItemModel(\n        id: json['id'] as int?,\n        title: json['title'] as String?,\n        state: json['state'] as int?,\n        publishTime: json['publish_time'] as int?,\n        words: json['words'] as int?,\n        imageUrls: (json['image_urls'] as List?)?.fromCast(),\n        category: json['category'] == null\n            ? null\n            : Category.fromJson(json['category'] as Map<String, dynamic>),\n        categories: (json['categories'] as List<dynamic>?)\n            ?.map((e) => Category.fromJson(e as Map<String, dynamic>))\n            .toList(),\n        summary: json['summary'] as String?,\n        type: json['type'] as int?,\n        dynIdStr: json['dyn_id_str'] as String?,\n        attributes: json['attributes'] as int?,\n        authorUid: json['author_uid'] as int?,\n        onlyFans: json['only_fans'] as int?,\n        stats: json['stats'] == null\n            ? null\n            : Stats.fromJson(json['stats'] as Map<String, dynamic>),\n        likeState: json['like_state'] as int?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/article/article_list/category.dart",
    "content": "class Category {\n  int? id;\n  int? parentId;\n  String? name;\n\n  Category({this.id, this.parentId, this.name});\n\n  factory Category.fromJson(Map<String, dynamic> json) => Category(\n    id: json['id'] as int?,\n    parentId: json['parent_id'] as int?,\n    name: json['name'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/article/article_list/data.dart",
    "content": "import 'package:PiliPlus/models/model_owner.dart';\nimport 'package:PiliPlus/models_new/article/article_list/article.dart';\nimport 'package:PiliPlus/models_new/article/article_list/last.dart';\nimport 'package:PiliPlus/models_new/article/article_list/list.dart';\n\nclass ArticleListData {\n  ArticleListInfo? list;\n  List<ArticleListItemModel>? articles;\n  Owner? author;\n  Last? last;\n  bool? attention;\n\n  ArticleListData({\n    this.list,\n    this.articles,\n    this.author,\n    this.last,\n    this.attention,\n  });\n\n  factory ArticleListData.fromJson(Map<String, dynamic> json) =>\n      ArticleListData(\n        list: json['list'] == null\n            ? null\n            : ArticleListInfo.fromJson(json['list'] as Map<String, dynamic>),\n        articles: (json['articles'] as List<dynamic>?)\n            ?.map(\n              (e) => ArticleListItemModel.fromJson(e as Map<String, dynamic>),\n            )\n            .toList(),\n        author: json['author'] == null\n            ? null\n            : Owner.fromJson(json['author'] as Map<String, dynamic>),\n        last: json['last'] == null\n            ? null\n            : Last.fromJson(json['last'] as Map<String, dynamic>),\n        attention: json['attention'] as bool?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/article/article_list/label.dart",
    "content": "class Label {\n  String? path;\n  String? text;\n  String? labelTheme;\n\n  Label({this.path, this.text, this.labelTheme});\n\n  factory Label.fromJson(Map<String, dynamic> json) => Label(\n    path: json['path'] as String?,\n    text: json['text'] as String?,\n    labelTheme: json['label_theme'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/article/article_list/last.dart",
    "content": "import 'package:PiliPlus/models_new/article/article_list/category.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\n\nclass Last {\n  int? id;\n  String? title;\n  int? state;\n  int? publishTime;\n  int? words;\n  List<String>? imageUrls;\n  Category? category;\n  dynamic categories;\n  String? summary;\n  int? type;\n  String? dynIdStr;\n  int? attributes;\n  int? authorUid;\n  int? onlyFans;\n\n  Last({\n    this.id,\n    this.title,\n    this.state,\n    this.publishTime,\n    this.words,\n    this.imageUrls,\n    this.category,\n    this.categories,\n    this.summary,\n    this.type,\n    this.dynIdStr,\n    this.attributes,\n    this.authorUid,\n    this.onlyFans,\n  });\n\n  factory Last.fromJson(Map<String, dynamic> json) => Last(\n    id: json['id'] as int?,\n    title: json['title'] as String?,\n    state: json['state'] as int?,\n    publishTime: json['publish_time'] as int?,\n    words: json['words'] as int?,\n    imageUrls: (json['image_urls'] as List?)?.fromCast(),\n    category: json['category'] == null\n        ? null\n        : Category.fromJson(json['category'] as Map<String, dynamic>),\n    categories: json['categories'] as dynamic,\n    summary: json['summary'] as String?,\n    type: json['type'] as int?,\n    dynIdStr: json['dyn_id_str'] as String?,\n    attributes: json['attributes'] as int?,\n    authorUid: json['author_uid'] as int?,\n    onlyFans: json['only_fans'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/article/article_list/list.dart",
    "content": "class ArticleListInfo {\n  int? id;\n  int? mid;\n  String? name;\n  String? imageUrl;\n  int? updateTime;\n  int? ctime;\n  int? publishTime;\n  String? summary;\n  int? words;\n  int? read;\n  int? articlesCount;\n  int? state;\n  String? reason;\n  String? applyTime;\n  String? checkTime;\n\n  ArticleListInfo({\n    this.id,\n    this.mid,\n    this.name,\n    this.imageUrl,\n    this.updateTime,\n    this.ctime,\n    this.publishTime,\n    this.summary,\n    this.words,\n    this.read,\n    this.articlesCount,\n    this.state,\n    this.reason,\n    this.applyTime,\n    this.checkTime,\n  });\n\n  factory ArticleListInfo.fromJson(Map<String, dynamic> json) =>\n      ArticleListInfo(\n        id: json['id'] as int?,\n        mid: json['mid'] as int?,\n        name: json['name'] as String?,\n        imageUrl: json['image_url'] as String?,\n        updateTime: json['update_time'] as int?,\n        ctime: json['ctime'] as int?,\n        publishTime: json['publish_time'] as int?,\n        summary: json['summary'] as String?,\n        words: json['words'] as int?,\n        read: json['read'] as int?,\n        articlesCount: json['articles_count'] as int?,\n        state: json['state'] as int?,\n        reason: json['reason'] as String?,\n        applyTime: json['apply_time'] as String?,\n        checkTime: json['check_time'] as String?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/article/article_list/stats.dart",
    "content": "class Stats {\n  int? view;\n  int? favorite;\n  int? like;\n  int? dislike;\n  int? reply;\n  int? share;\n  num? coin;\n  int? dynam1c;\n\n  Stats({\n    this.view,\n    this.favorite,\n    this.like,\n    this.dislike,\n    this.reply,\n    this.share,\n    this.coin,\n    this.dynam1c,\n  });\n\n  factory Stats.fromJson(Map<String, dynamic> json) => Stats(\n    view: json['view'] as int?,\n    favorite: json['favorite'] as int?,\n    like: json['like'] as int?,\n    dislike: json['dislike'] as int?,\n    reply: json['reply'] as int?,\n    share: json['share'] as int?,\n    coin: json['coin'] as num?,\n    dynam1c: json['dynamic'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/article/article_view/category.dart",
    "content": "class Category {\n  int? id;\n  int? parentId;\n  String? name;\n\n  Category({this.id, this.parentId, this.name});\n\n  factory Category.fromJson(Map<String, dynamic> json) => Category(\n    id: json['id'] as int?,\n    parentId: json['parent_id'] as int?,\n    name: json['name'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/article/article_view/data.dart",
    "content": "import 'package:PiliPlus/models/model_avatar.dart';\nimport 'package:PiliPlus/models_new/article/article_view/category.dart';\nimport 'package:PiliPlus/models_new/article/article_view/media.dart';\nimport 'package:PiliPlus/models_new/article/article_view/ops.dart';\nimport 'package:PiliPlus/models_new/article/article_view/opus.dart';\nimport 'package:PiliPlus/models_new/article/article_view/stats.dart';\nimport 'package:PiliPlus/models_new/article/article_view/tag.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\n\nclass ArticleViewData {\n  int? id;\n  Category? category;\n  List<Category>? categories;\n  String? title;\n  String? summary;\n  String? bannerUrl;\n  int? templateId;\n  int? state;\n  Avatar? author;\n  int? reprint;\n  List<String>? imageUrls;\n  int? publishTime;\n  int? ctime;\n  int? mtime;\n  Stats? stats;\n  List<Tag>? tags;\n  int? words;\n  List<String>? originImageUrls;\n  dynamic list;\n  bool? isLike;\n  Media? media;\n  String? applyTime;\n  String? checkTime;\n  int? original;\n  int? actId;\n  dynamic dispute;\n  dynamic authenMark;\n  int? coverAvid;\n  dynamic topVideoInfo;\n  int? type;\n  int? checkState;\n  int? originTemplateId;\n  int? privatePub;\n  dynamic contentPicList;\n  String? content;\n  String? keywords;\n  int? versionId;\n  String? dynIdStr;\n  int? totalArtNum;\n  ArticleOpus? opus;\n  List<ArticleOps>? ops;\n\n  ArticleViewData({\n    this.id,\n    this.category,\n    this.categories,\n    this.title,\n    this.summary,\n    this.bannerUrl,\n    this.templateId,\n    this.state,\n    this.author,\n    this.reprint,\n    this.imageUrls,\n    this.publishTime,\n    this.ctime,\n    this.mtime,\n    this.stats,\n    this.tags,\n    this.words,\n    this.originImageUrls,\n    this.list,\n    this.isLike,\n    this.media,\n    this.applyTime,\n    this.checkTime,\n    this.original,\n    this.actId,\n    this.dispute,\n    this.authenMark,\n    this.coverAvid,\n    this.topVideoInfo,\n    this.type,\n    this.checkState,\n    this.originTemplateId,\n    this.privatePub,\n    this.contentPicList,\n    this.content,\n    this.keywords,\n    this.versionId,\n    this.dynIdStr,\n    this.totalArtNum,\n    this.opus,\n    this.ops,\n  });\n\n  factory ArticleViewData.fromJson(Map<String, dynamic> json) =>\n      ArticleViewData(\n        id: json['id'] as int?,\n        category: json['category'] == null\n            ? null\n            : Category.fromJson(json['category'] as Map<String, dynamic>),\n        categories: (json['categories'] as List<dynamic>?)\n            ?.map((e) => Category.fromJson(e as Map<String, dynamic>))\n            .toList(),\n        title: json['title'] as String?,\n        summary: json['summary'] as String?,\n        bannerUrl: json['banner_url'] as String?,\n        templateId: json['template_id'] as int?,\n        state: json['state'] as int?,\n        author: json['author'] == null\n            ? null\n            : Avatar.fromJson(json['author'] as Map<String, dynamic>),\n        reprint: json['reprint'] as int?,\n        imageUrls: (json['image_urls'] as List?)?.fromCast(),\n        publishTime: json['publish_time'] as int?,\n        ctime: json['ctime'] as int?,\n        mtime: json['mtime'] as int?,\n        stats: json['stats'] == null\n            ? null\n            : Stats.fromJson(json['stats'] as Map<String, dynamic>),\n        tags: (json['tags'] as List<dynamic>?)\n            ?.map((e) => Tag.fromJson(e as Map<String, dynamic>))\n            .toList(),\n        words: json['words'] as int?,\n        originImageUrls: (json['origin_image_urls'] as List?)?.fromCast(),\n        list: json['list'] as dynamic,\n        isLike: json['is_like'] as bool?,\n        media: json['media'] == null\n            ? null\n            : Media.fromJson(json['media'] as Map<String, dynamic>),\n        applyTime: json['apply_time'] as String?,\n        checkTime: json['check_time'] as String?,\n        original: json['original'] as int?,\n        actId: json['act_id'] as int?,\n        dispute: json['dispute'] as dynamic,\n        authenMark: json['authenMark'] as dynamic,\n        coverAvid: json['cover_avid'] as int?,\n        topVideoInfo: json['top_video_info'] as dynamic,\n        type: json['type'] as int?,\n        checkState: json['check_state'] as int?,\n        originTemplateId: json['origin_template_id'] as int?,\n        privatePub: json['private_pub'] as int?,\n        contentPicList: json['content_pic_list'] as dynamic,\n        content: json['content'] as String?,\n        keywords: json['keywords'] as String?,\n        versionId: json['version_id'] as int?,\n        dynIdStr: json['dyn_id_str'] as String?,\n        totalArtNum: json['total_art_num'] as int?,\n        opus: json['opus'] == null\n            ? null\n            : ArticleOpus.fromJson(json['opus'] as Map<String, dynamic>),\n        ops: (json['ops'] as List?)\n            ?.map((e) => ArticleOps.fromJson(e))\n            .toList(),\n      );\n}\n"
  },
  {
    "path": "lib/models_new/article/article_view/label.dart",
    "content": "class Label {\n  String? path;\n  String? text;\n  String? labelTheme;\n\n  Label({this.path, this.text, this.labelTheme});\n\n  factory Label.fromJson(Map<String, dynamic> json) => Label(\n    path: json['path'] as String?,\n    text: json['text'] as String?,\n    labelTheme: json['label_theme'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/article/article_view/media.dart",
    "content": "class Media {\n  int? score;\n  int? mediaId;\n  String? title;\n  String? cover;\n  String? area;\n  int? typeId;\n  String? typeName;\n  int? spoiler;\n  int? seasonId;\n\n  Media({\n    this.score,\n    this.mediaId,\n    this.title,\n    this.cover,\n    this.area,\n    this.typeId,\n    this.typeName,\n    this.spoiler,\n    this.seasonId,\n  });\n\n  factory Media.fromJson(Map<String, dynamic> json) => Media(\n    score: json['score'] as int?,\n    mediaId: json['media_id'] as int?,\n    title: json['title'] as String?,\n    cover: json['cover'] as String?,\n    area: json['area'] as String?,\n    typeId: json['type_id'] as int?,\n    typeName: json['type_name'] as String?,\n    spoiler: json['spoiler'] as int?,\n    seasonId: json['season_id'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/article/article_view/ops.dart",
    "content": "class ArticleOps {\n  dynamic insert;\n  Attributes? attributes;\n\n  ArticleOps({this.insert, this.attributes});\n\n  ArticleOps.fromJson(Map<String, dynamic> json) {\n    if (json['insert'] is Map) {\n      insert = Insert.fromJson(json['insert']);\n    } else {\n      insert = json['insert'];\n    }\n    attributes = json['attributes'] == null\n        ? null\n        : Attributes.fromJson(json['attributes'] as Map<String, dynamic>);\n  }\n}\n\nclass Attributes {\n  String? clazz;\n\n  Attributes({this.clazz});\n\n  factory Attributes.fromJson(Map<String, dynamic> json) => Attributes(\n    clazz: json['class'] as String?,\n  );\n}\n\nclass Insert {\n  InsertCard? card;\n\n  Insert({\n    this.card,\n  });\n\n  Insert.fromJson(Map<String, dynamic> json) {\n    if (json['article-card'] != null) {\n      card = InsertCard.fromJson(json['article-card']);\n      return;\n    }\n\n    if (json['live-card'] != null) {\n      card = InsertCard.fromJson(json['live-card']);\n      return;\n    }\n\n    if (json['goods-card'] != null) {\n      card = InsertCard.fromJson(json['goods-card']);\n      return;\n    }\n\n    if (json['video-card'] != null) {\n      card = InsertCard.fromJson(json['video-card']);\n      return;\n    }\n\n    if (json['mall-card'] != null) {\n      card = InsertCard.fromJson(json['mall-card']);\n      return;\n    }\n\n    if (json['vote-card'] != null) {\n      card = InsertCard.fromJson(json['vote-card']);\n      return;\n    }\n  }\n}\n\nclass InsertCard {\n  dynamic tid;\n  String? id;\n  dynamic alt;\n  String? url;\n  double? width;\n  double? height;\n  num? size;\n  String? status;\n\n  InsertCard({\n    this.tid,\n    this.id,\n    this.alt,\n    this.url,\n    this.width,\n    this.height,\n    this.size,\n    this.status,\n  });\n\n  InsertCard.fromJson(Map<String, dynamic> json) {\n    tid = json['tid'];\n    id = json['id'] == '' ? null : json['id'];\n    alt = json['alt'];\n    url = json['url'];\n    width = (json['width'] as num?)?.toDouble();\n    height = (json['height'] as num?)?.toDouble();\n    size = json['size'];\n    status = json['status'];\n  }\n}\n"
  },
  {
    "path": "lib/models_new/article/article_view/opus.dart",
    "content": "import 'package:PiliPlus/models/dynamics/article_content_model.dart';\n\nclass ArticleOpus {\n  int? opusid;\n  int? opussource;\n  String? title;\n  List<ArticleContentModel>? content;\n\n  ArticleOpus.fromJson(Map<String, dynamic> json) {\n    opusid = json['opus_id'];\n    opussource = json['opus_source'];\n    title = json['title'];\n    if (json['content']?['paragraphs'] case List list) {\n      content = list.map((i) => ArticleContentModel.fromJson(i)).toList();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/models_new/article/article_view/stats.dart",
    "content": "class Stats {\n  int? view;\n  int? favorite;\n  int? like;\n  int? dislike;\n  int? reply;\n  int? share;\n  num? coin;\n  int? dynam1c;\n\n  Stats({\n    this.view,\n    this.favorite,\n    this.like,\n    this.dislike,\n    this.reply,\n    this.share,\n    this.coin,\n    this.dynam1c,\n  });\n\n  factory Stats.fromJson(Map<String, dynamic> json) => Stats(\n    view: json['view'] as int?,\n    favorite: json['favorite'] as int?,\n    like: json['like'] as int?,\n    dislike: json['dislike'] as int?,\n    reply: json['reply'] as int?,\n    share: json['share'] as int?,\n    coin: json['coin'] as num?,\n    dynam1c: json['dynamic'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/article/article_view/tag.dart",
    "content": "class Tag {\n  int? tid;\n  String? name;\n\n  Tag({this.tid, this.name});\n\n  factory Tag.fromJson(Map<String, dynamic> json) => Tag(\n    tid: json['tid'] as int?,\n    name: json['name'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/blacklist/data.dart",
    "content": "import 'package:PiliPlus/models_new/blacklist/list.dart';\n\nclass BlackListData {\n  List<BlackListItem>? list;\n  int? reVersion;\n  int? total;\n\n  BlackListData({this.list, this.reVersion, this.total});\n\n  factory BlackListData.fromJson(Map<String, dynamic> json) => BlackListData(\n    list: (json['list'] as List<dynamic>?)\n        ?.map((e) => BlackListItem.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    reVersion: json['re_version'] as int?,\n    total: json['total'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/blacklist/list.dart",
    "content": "import 'package:PiliPlus/models/model_avatar.dart';\n\nclass BlackListItem {\n  int? mid;\n  int? attribute;\n  int? mtime;\n  dynamic tag;\n  int? special;\n  String? uname;\n  String? face;\n  String? sign;\n  int? faceNft;\n  BaseOfficialVerify? officialVerify;\n  Vip? vip;\n  String? nftIcon;\n  String? recReason;\n  String? trackId;\n  String? followTime;\n\n  BlackListItem({\n    this.mid,\n    this.attribute,\n    this.mtime,\n    this.tag,\n    this.special,\n    this.uname,\n    this.face,\n    this.sign,\n    this.faceNft,\n    this.officialVerify,\n    this.vip,\n    this.nftIcon,\n    this.recReason,\n    this.trackId,\n    this.followTime,\n  });\n\n  factory BlackListItem.fromJson(Map<String, dynamic> json) => BlackListItem(\n    mid: json['mid'] as int?,\n    attribute: json['attribute'] as int?,\n    mtime: json['mtime'] as int?,\n    tag: json['tag'] as dynamic,\n    special: json['special'] as int?,\n    uname: json['uname'] as String?,\n    face: json['face'] as String?,\n    sign: json['sign'] as String?,\n    faceNft: json['face_nft'] as int?,\n    officialVerify: json['official_verify'] == null\n        ? null\n        : BaseOfficialVerify.fromJson(\n            json['official_verify'] as Map<String, dynamic>,\n          ),\n    vip: json['vip'] == null\n        ? null\n        : Vip.fromJson(json['vip'] as Map<String, dynamic>),\n    nftIcon: json['nft_icon'] as String?,\n    recReason: json['rec_reason'] as String?,\n    trackId: json['track_id'] as String?,\n    followTime: json['follow_time'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/coin_log/data.dart",
    "content": "import 'package:PiliPlus/models_new/coin_log/list.dart';\n\nclass CoinLogData {\n  List<CoinLogItem>? list;\n  int? count;\n\n  CoinLogData({this.list, this.count});\n\n  factory CoinLogData.fromJson(Map<String, dynamic> json) => CoinLogData(\n    list: (json['list'] as List<dynamic>?)\n        ?.map((e) => CoinLogItem.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    count: json['count'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/coin_log/list.dart",
    "content": "class CoinLogItem {\n  final String time;\n  final String delta;\n  final String reason;\n\n  const CoinLogItem({\n    required this.time,\n    required this.delta,\n    required this.reason,\n  });\n\n  factory CoinLogItem.fromJson(Map<String, dynamic> json) => CoinLogItem(\n    time: json['time'],\n    delta: (json['delta'] as num).toString(),\n    reason: json['reason'],\n  );\n}\n"
  },
  {
    "path": "lib/models_new/danmaku/post.dart",
    "content": "class DanmakuPost {\n  DanmakuPost({\n    required this.action,\n    required this.animation,\n    required this.colorfulSrc,\n    required this.dmContent,\n    required this.dmid,\n    required this.dmidStr,\n    required this.visible,\n  });\n\n  final String? action;\n  final String? animation;\n  final dynamic colorfulSrc;\n  final String? dmContent;\n  final int? dmid;\n  final String? dmidStr;\n  final bool? visible;\n\n  factory DanmakuPost.fromJson(Map<String, dynamic> json) {\n    return DanmakuPost(\n      action: json[\"action\"],\n      animation: json[\"animation\"],\n      colorfulSrc: json[\"colorful_src\"],\n      dmContent: json[\"dm_content\"],\n      dmid: json[\"dmid\"],\n      dmidStr: json[\"dmid_str\"],\n      visible: json[\"visible\"],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/models_new/download/bili_download_entry_info.dart",
    "content": "import 'package:PiliPlus/models/common/video/video_type.dart';\nimport 'package:PiliPlus/pages/common/multi_select/base.dart'\n    show MultiSelectData;\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/route_manager.dart';\n\nclass BiliDownloadEntryInfo with MultiSelectData {\n  int mediaType;\n  bool hasDashAudio;\n  bool isCompleted;\n  int totalBytes;\n  int downloadedBytes;\n  final String title;\n  String? typeTag;\n  final String cover;\n  int? videoQuality;\n  int preferedVideoQuality;\n  String qualityPithyDescription;\n  final int guessedTotalBytes;\n  int totalTimeMilli;\n  final int danmakuCount;\n  final int timeUpdateStamp;\n  final int timeCreateStamp;\n  final bool canPlayInAdvance;\n  bool interruptTransformTempFile;\n  final int avid;\n  final int? spid;\n  final String bvid;\n  final int? ownerId;\n  final String? ownerName;\n  PageInfo? pageData;\n  final String? seasonId;\n  final SourceInfo? source;\n  EpInfo? ep;\n\n  late String pageDirPath;\n  late String entryDirPath;\n  late DownloadStatus status = .wait;\n\n  int get cid => source?.cid ?? pageData!.cid;\n\n  String get pageId => seasonId ?? avid.toString();\n\n  int get sortKey => ep?.sortIndex ?? pageData!.cid;\n\n  String get showTitle {\n    if (pageData case PageInfo(:final part)) {\n      return part != null && part.isNotEmpty ? part : title;\n    }\n    if (ep case final ep?) {\n      return ep.showTitle ?? '${ep.index} ${ep.indexTitle}';\n    }\n    return title;\n  }\n\n  Widget moreBtn(ThemeData theme) => SizedBox(\n    width: 29,\n    height: 29,\n    child: PopupMenuButton(\n      padding: EdgeInsets.zero,\n      position: PopupMenuPosition.under,\n      icon: Icon(\n        Icons.more_vert_outlined,\n        color: theme.colorScheme.outline,\n        size: 18,\n      ),\n      itemBuilder: (_) => [\n        PopupMenuItem(\n          height: 38,\n          child: const Text(\n            '查看详情页',\n            style: TextStyle(fontSize: 13),\n          ),\n          onTap: () {\n            if (ep case final ep?) {\n              if (ep.from == VideoType.pugv.name) {\n                PageUtils.viewPugv(\n                  seasonId: seasonId,\n                  epId: ep.episodeId,\n                );\n              } else {\n                PageUtils.viewPgc(\n                  seasonId: seasonId,\n                  epId: ep.episodeId,\n                );\n              }\n              return;\n            }\n            PageUtils.toVideoPage(\n              aid: avid,\n              bvid: bvid,\n              cid: cid,\n              epId: ep?.episodeId,\n              title: title,\n              cover: cover,\n            );\n          },\n        ),\n        if (ownerId case final mid?)\n          PopupMenuItem(\n            height: 38,\n            child: Text(\n              '访问${ownerName != null ? '：$ownerName' : '用户主页'}',\n              style: const TextStyle(\n                fontSize: 13,\n              ),\n            ),\n            onTap: () => Get.toNamed('/member?mid=$mid'),\n          ),\n      ],\n    ),\n  );\n\n  BiliDownloadEntryInfo({\n    this.mediaType = 1,\n    this.hasDashAudio = false,\n    required this.isCompleted,\n    required this.totalBytes,\n    required this.downloadedBytes,\n    required this.title,\n    this.typeTag,\n    required this.cover,\n    this.videoQuality,\n    required this.preferedVideoQuality,\n    this.qualityPithyDescription = '',\n    required this.guessedTotalBytes,\n    required this.totalTimeMilli,\n    required this.danmakuCount,\n    this.timeUpdateStamp = 0,\n    this.timeCreateStamp = 0,\n    this.canPlayInAdvance = false,\n    this.interruptTransformTempFile = false,\n    required this.avid,\n    this.spid,\n    required this.bvid,\n    this.ownerId,\n    this.ownerName,\n    this.pageData,\n    this.seasonId,\n    this.source,\n    this.ep,\n  });\n\n  factory BiliDownloadEntryInfo.fromJson(Map<String, dynamic> json) =>\n      BiliDownloadEntryInfo(\n        mediaType: json['media_type'] as int,\n        hasDashAudio: json['has_dash_audio'] as bool,\n        isCompleted: json['is_completed'] as bool,\n        totalBytes: json['total_bytes'] as int,\n        downloadedBytes: json['downloaded_bytes'] as int,\n        title: json['title'] as String,\n        typeTag: json['type_tag'] as String?,\n        cover: json['cover'] as String,\n        videoQuality: json['video_quality'] as int?,\n        preferedVideoQuality: json['prefered_video_quality'] as int,\n        qualityPithyDescription: json['quality_pithy_description'] as String,\n        guessedTotalBytes: json['guessed_total_bytes'] as int,\n        totalTimeMilli: json['total_time_milli'] as int,\n        danmakuCount: json['danmaku_count'] as int,\n        timeUpdateStamp: json['time_update_stamp'] as int,\n        timeCreateStamp: json['time_create_stamp'] as int,\n        canPlayInAdvance: json['can_play_in_advance'] as bool,\n        interruptTransformTempFile:\n            json['interrupt_transform_temp_file'] as bool,\n        avid: json['avid'] as int,\n        spid: json['spid'] as int?,\n        bvid: json['bvid'] as String,\n        ownerId: json['owner_id'] as int?,\n        ownerName: json['owner_name'] as String?,\n        pageData: json['page_data'] != null\n            ? PageInfo.fromJson(json['page_data'] as Map<String, dynamic>)\n            : null,\n        seasonId: json['season_id'] as String?,\n        source: json['source'] != null\n            ? SourceInfo.fromJson(json['source'] as Map<String, dynamic>)\n            : null,\n        ep: json['ep'] != null\n            ? EpInfo.fromJson(json['ep'] as Map<String, dynamic>)\n            : null,\n      );\n\n  Map<String, dynamic> toJson() => <String, dynamic>{\n    'media_type': mediaType,\n    'has_dash_audio': hasDashAudio,\n    'is_completed': isCompleted,\n    'total_bytes': totalBytes,\n    'downloaded_bytes': downloadedBytes,\n    'title': title,\n    'type_tag': ?typeTag,\n    'cover': cover,\n    'video_quality': ?videoQuality,\n    'prefered_video_quality': preferedVideoQuality,\n    'quality_pithy_description': qualityPithyDescription,\n    'guessed_total_bytes': guessedTotalBytes,\n    'total_time_milli': totalTimeMilli,\n    'danmaku_count': danmakuCount,\n    'time_update_stamp': timeUpdateStamp,\n    'time_create_stamp': timeCreateStamp,\n    'can_play_in_advance': canPlayInAdvance,\n    'interrupt_transform_temp_file': interruptTransformTempFile,\n    'avid': avid,\n    'spid': ?spid,\n    'bvid': bvid,\n    'owner_id': ownerId,\n    'owner_name': ownerName,\n    'page_data': ?pageData?.toJson(),\n    'season_id': ?seasonId,\n    'source': ?source?.toJson(),\n    'ep': ?ep?.toJson(),\n  };\n\n  @override\n  bool operator ==(Object other) {\n    if (identical(this, other)) {\n      return true;\n    }\n    if (other is BiliDownloadEntryInfo) {\n      return cid == other.cid;\n    }\n    return false;\n  }\n\n  @override\n  int get hashCode => cid.hashCode;\n}\n\nclass PageInfo {\n  final int cid;\n  final int page;\n  final String? from;\n  final String? part;\n  final String? vid;\n  final bool hasAlias;\n  final int tid;\n  int width;\n  int height;\n  final int rotate;\n  final String? downloadTitle;\n  final String? downloadSubtitle;\n\n  bool get cacheWidth => width <= height;\n\n  PageInfo({\n    required this.cid,\n    required this.page,\n    this.from,\n    this.part,\n    this.vid,\n    required this.hasAlias,\n    required this.tid,\n    this.width = 0,\n    this.height = 0,\n    this.rotate = 0,\n    this.downloadTitle,\n    this.downloadSubtitle,\n  });\n\n  factory PageInfo.fromJson(Map<String, dynamic> json) => PageInfo(\n    cid: json['cid'] as int,\n    page: json['page'] as int,\n    from: json['from'] as String?,\n    part: json['part'] as String?,\n    vid: json['vid'] as String?,\n    hasAlias: json['has_alias'] as bool,\n    tid: json['tid'] as int,\n    width: json['width'] as int,\n    height: json['height'] as int,\n    rotate: json['rotate'] as int,\n    downloadTitle: json['download_title'] as String?,\n    downloadSubtitle: json['download_subtitle'] as String?,\n  );\n\n  Map<String, dynamic> toJson() => <String, dynamic>{\n    'cid': cid,\n    'page': page,\n    'from': ?from,\n    'part': ?part,\n    'vid': ?vid,\n    'has_alias': hasAlias,\n    'tid': tid,\n    'width': width,\n    'height': height,\n    'rotate': rotate,\n    'download_title': downloadTitle,\n    'download_subtitle': downloadSubtitle,\n  };\n}\n\nclass SourceInfo {\n  final int avId;\n  final int cid;\n\n  SourceInfo({\n    required this.avId,\n    required this.cid,\n  });\n\n  factory SourceInfo.fromJson(Map<String, dynamic> json) => SourceInfo(\n    avId: json['av_id'] as int,\n    cid: json['cid'] as int,\n  );\n\n  Map<String, dynamic> toJson() => <String, dynamic>{\n    'av_id': avId,\n    'cid': cid,\n  };\n}\n\nclass EpInfo {\n  final int avId;\n  final int page;\n  final int danmaku;\n  final String cover;\n  final int episodeId;\n  final String index;\n  final String indexTitle;\n  final String? showTitle;\n  final String from;\n  final int seasonType;\n  int width;\n  int height;\n  final int rotate;\n  final String link;\n  final String bvid;\n  final int sortIndex;\n\n  EpInfo({\n    required this.avId,\n    required this.page,\n    required this.danmaku,\n    required this.cover,\n    required this.episodeId,\n    required this.index,\n    required this.indexTitle,\n    this.showTitle,\n    required this.from,\n    required this.seasonType,\n    required this.width,\n    required this.height,\n    required this.rotate,\n    this.link = '',\n    this.bvid = '',\n    this.sortIndex = 0,\n  });\n\n  factory EpInfo.fromJson(Map<String, dynamic> json) => EpInfo(\n    avId: json['av_id'] as int,\n    page: json['page'] as int,\n    danmaku: json['danmaku'] as int,\n    cover: json['cover'] as String,\n    episodeId: json['episode_id'] as int,\n    index: json['index'] as String,\n    indexTitle: json['index_title'] as String,\n    showTitle: json['show_title'] as String?,\n    from: json['from'] as String,\n    seasonType: json['season_type'] as int,\n    width: json['width'] as int,\n    height: json['height'] as int,\n    rotate: json['rotate'] as int,\n    link: json['link'] as String,\n    bvid: json['bvid'] as String,\n    sortIndex: json['sort_index'] as int,\n  );\n\n  Map<String, dynamic> toJson() => <String, dynamic>{\n    'av_id': avId,\n    'page': page,\n    'danmaku': danmaku,\n    'cover': cover,\n    'episode_id': episodeId,\n    'index': index,\n    'index_title': indexTitle,\n    'show_title': showTitle,\n    'from': from,\n    'season_type': seasonType,\n    'width': width,\n    'height': height,\n    'rotate': rotate,\n    'link': link,\n    'bvid': bvid,\n    'sort_index': sortIndex,\n  };\n}\n\nenum DownloadStatus {\n  downloading('正在下载'),\n  audioDownloading('正在下载音频'),\n  getDanmaku('获取弹幕'),\n  getPlayUrl('获取播放地址'),\n  //\n  completed('下载完成'),\n  failDownload('下载失败'),\n  failDownloadAudio('音频下载失败'),\n  failDanmaku('获取弹幕失败'),\n  failPlayUrl('获取播放地址失败'),\n  pause('暂停中'),\n  wait('等待中')\n  ;\n\n  final String message;\n  const DownloadStatus(this.message);\n\n  bool get isDownloading => index <= 3;\n}\n"
  },
  {
    "path": "lib/models_new/download/bili_download_media_file_info.dart",
    "content": "import 'package:PiliPlus/utils/extension/iterable_ext.dart';\n\nsealed class BiliDownloadMediaInfo {\n  const BiliDownloadMediaInfo();\n\n  Map<String, String> get httpHeader => {};\n\n  Map<String, dynamic> toJson();\n}\n\nclass Type1 extends BiliDownloadMediaInfo {\n  final int availablePeriodMilli;\n  final String description;\n  final String format;\n  final String? from;\n  final bool intact;\n  final bool isDownloaded;\n  final bool isResolved;\n  final String marlinToken;\n  final bool needLogin;\n  final bool needVip;\n  final int parseTimestampMilli;\n  final List<Type1PlayerCodecConfig> playerCodecConfigList;\n  final int playerError;\n  final int quality;\n  final List<Type1Segment> segmentList;\n  final int timeLength;\n  final String? typeTag;\n  final String? userAgent;\n  final String? referer;\n  final int videoCodecId;\n  final bool videoProject;\n\n  @override\n  Map<String, String> get httpHeader => {\n    if (referer?.isNotEmpty ?? false) 'referer': referer!,\n    if (userAgent?.isNotEmpty ?? false) 'user-agent': userAgent!,\n  };\n\n  Type1({\n    required this.availablePeriodMilli,\n    required this.description,\n    required this.format,\n    this.from,\n    required this.intact,\n    required this.isDownloaded,\n    required this.isResolved,\n    required this.marlinToken,\n    required this.needLogin,\n    required this.needVip,\n    required this.parseTimestampMilli,\n    required this.playerCodecConfigList,\n    required this.playerError,\n    required this.quality,\n    required this.segmentList,\n    required this.timeLength,\n    this.typeTag,\n    this.userAgent,\n    this.referer,\n    required this.videoCodecId,\n    required this.videoProject,\n  });\n\n  factory Type1.fromJson(Map<String, dynamic> json) => Type1(\n    availablePeriodMilli: json['available_period_milli'] as int,\n    description: json['description'] as String,\n    format: json['format'] as String,\n    from: json['from'] as String?,\n    intact: json['intact'] as bool,\n    isDownloaded: json['is_downloaded'] as bool,\n    isResolved: json['is_resolved'] as bool,\n    marlinToken: json['marlin_token'] as String,\n    needLogin: json['need_login'] as bool,\n    needVip: json['need_vip'] as bool,\n    parseTimestampMilli: json['parse_timestamp_milli'] as int,\n    playerCodecConfigList: (json['player_codec_config_list'] as List<dynamic>)\n        .map((e) => Type1PlayerCodecConfig.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    playerError: json['player_error'] as int,\n    quality: json['quality'] as int,\n    segmentList: (json['segment_list'] as List<dynamic>)\n        .map((e) => Type1Segment.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    timeLength: json['time_length'] as int,\n    typeTag: json['type_tag'] as String?,\n    userAgent: json['user_agent'] as String?,\n    referer: json['referer'] as String?,\n    videoCodecId: json['video_codec_id'] as int,\n    videoProject: json['video_project'] as bool,\n  );\n\n  @override\n  Map<String, dynamic> toJson() => <String, dynamic>{\n    'available_period_milli': availablePeriodMilli,\n    'description': description,\n    'format': format,\n    'from': ?from,\n    'intact': intact,\n    'is_downloaded': isDownloaded,\n    'is_resolved': isResolved,\n    'marlin_token': marlinToken,\n    'need_login': needLogin,\n    'need_vip': needVip,\n    'parse_timestamp_milli': parseTimestampMilli,\n    'player_codec_config_list': playerCodecConfigList\n        .map((e) => e.toJson())\n        .toList(),\n    'player_error': playerError,\n    'quality': quality,\n    'segment_list': segmentList.map((e) => e.toJson()).toList(),\n    'time_length': timeLength,\n    'type_tag': ?typeTag,\n    'user_agent': ?userAgent,\n    'referer': ?referer,\n    'video_codec_id': videoCodecId,\n    'video_project': videoProject,\n  };\n}\n\nclass Type1PlayerCodecConfig {\n  final String player;\n  final bool useIjkMediaCodec;\n\n  Type1PlayerCodecConfig({\n    required this.player,\n    required this.useIjkMediaCodec,\n  });\n\n  factory Type1PlayerCodecConfig.fromJson(Map<String, dynamic> json) =>\n      Type1PlayerCodecConfig(\n        player: json['player'] as String,\n        useIjkMediaCodec: json['use_ijk_media_codec'] as bool,\n      );\n\n  Map<String, dynamic> toJson() => <String, dynamic>{\n    'player': player,\n    'use_ijk_media_codec': useIjkMediaCodec,\n  };\n}\n\nclass Type1Segment {\n  final List<String> backupUrls;\n  final int bytes;\n  final int duration;\n  final String md5;\n  final String metaUrl;\n  final int order;\n  final String url;\n\n  Type1Segment({\n    required this.backupUrls,\n    required this.bytes,\n    this.duration = 0,\n    required this.md5,\n    required this.metaUrl,\n    required this.order,\n    required this.url,\n  });\n\n  factory Type1Segment.fromJson(Map<String, dynamic> json) => Type1Segment(\n    backupUrls: List<String>.from(json['backup_urls']),\n    bytes: json['bytes'] as int,\n    duration: json['duration'] as int,\n    md5: json['md5'] as String,\n    metaUrl: json['meta_url'] as String,\n    order: json['order'] as int,\n    url: json['url'] as String,\n  );\n\n  Map<String, dynamic> toJson() => <String, dynamic>{\n    'backup_urls': backupUrls,\n    'bytes': bytes,\n    'duration': duration,\n    'md5': md5,\n    'meta_url': metaUrl,\n    'order': order,\n    'url': url,\n  };\n}\n\nclass Type2 extends BiliDownloadMediaInfo {\n  final int duration;\n  final List<Type2File> video;\n  final List<Type2File>? audio;\n  final String? userAgent;\n  final String? referer;\n\n  Type2({\n    this.duration = 0,\n    required this.video,\n    this.audio,\n    this.userAgent,\n    this.referer,\n  });\n\n  @override\n  Map<String, String> get httpHeader => {\n    if (referer?.isNotEmpty ?? false) 'referer': referer!,\n    if (userAgent?.isNotEmpty ?? false) 'user-agent': userAgent!,\n  };\n\n  factory Type2.fromJson(Map<String, dynamic> json) => Type2(\n    duration: json['duration'] as int,\n    video: (json['video'] as List<dynamic>)\n        .map((e) => Type2File.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    audio: (json['audio'] as List<dynamic>?)\n        ?.map((e) => Type2File.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    userAgent: json['user_agent'] as String?,\n    referer: json['referer'] as String?,\n  );\n\n  @override\n  Map<String, dynamic> toJson() => <String, dynamic>{\n    'duration': duration,\n    'video': video.map((e) => e.toJson()).toList(),\n    'audio': ?audio?.map((e) => e.toJson()).toList(),\n    'user_agent': ?userAgent,\n    'referer': ?referer,\n  };\n}\n\nclass Type2File {\n  final int id;\n  final String baseUrl;\n  final List<String>? backupUrl;\n  final int bandwidth;\n  final int codecid;\n  int size;\n  final String md5;\n  final bool noRexcode;\n  final String frameRate;\n  final int width;\n  final int height;\n  final int dashDrmType;\n\n  Type2File({\n    required this.id,\n    required this.baseUrl,\n    this.backupUrl,\n    required this.bandwidth,\n    required this.codecid,\n    required this.size,\n    required this.md5,\n    required this.noRexcode,\n    this.frameRate = '',\n    this.width = 1,\n    this.height = 1,\n    this.dashDrmType = 0,\n  });\n\n  factory Type2File.fromJson(Map<String, dynamic> json) => Type2File(\n    id: json['id'] as int,\n    baseUrl: json['base_url'] as String,\n    backupUrl: (json['backup_url'] as List<dynamic>?)?.fromCast(),\n    bandwidth: json['bandwidth'] as int,\n    codecid: json['codecid'] as int,\n    size: json['size'] as int,\n    md5: json['md5'] as String,\n    noRexcode: json['no_rexcode'] as bool,\n    frameRate: json['frame_rate'] as String? ?? '',\n    width: json['width'] as int,\n    height: json['height'] as int,\n    dashDrmType: json['dash_drm_type'] as int,\n  );\n\n  Map<String, dynamic> toJson() => <String, dynamic>{\n    'id': id,\n    'base_url': baseUrl,\n    'backup_url': ?backupUrl,\n    'bandwidth': bandwidth,\n    'codecid': codecid,\n    'size': size,\n    'md5': md5,\n    'no_rexcode': noRexcode,\n    'frame_rate': frameRate,\n    'width': width,\n    'height': height,\n    'dash_drm_type': dashDrmType,\n  };\n}\n\nclass None extends BiliDownloadMediaInfo {\n  final String message;\n\n  const None({\n    required this.message,\n  });\n\n  @override\n  Map<String, dynamic> toJson() {\n    throw UnimplementedError();\n  }\n}\n"
  },
  {
    "path": "lib/models_new/download/download_info.dart",
    "content": "import 'package:PiliPlus/models_new/download/bili_download_entry_info.dart';\nimport 'package:PiliPlus/pages/common/multi_select/base.dart'\n    show MultiSelectData;\n\nclass DownloadPageInfo with MultiSelectData {\n  final String pageId;\n  final String dirPath;\n  final String title;\n  String cover;\n  int sortKey;\n  final int? seasonType;\n  final List<BiliDownloadEntryInfo> entries;\n\n  DownloadPageInfo({\n    required this.pageId,\n    required this.dirPath,\n    required this.title,\n    required this.cover,\n    required this.sortKey,\n    this.seasonType,\n    required this.entries,\n  });\n}\n"
  },
  {
    "path": "lib/models_new/dynamic/dyn_mention/data.dart",
    "content": "import 'package:PiliPlus/models_new/dynamic/dyn_mention/group.dart';\n\nclass DynMentionData {\n  List<MentionGroup>? groups;\n\n  DynMentionData({this.groups});\n\n  factory DynMentionData.fromJson(Map<String, dynamic> json) => DynMentionData(\n    groups: (json['groups'] as List<dynamic>?)\n        ?.map((e) => MentionGroup.fromJson(e as Map<String, dynamic>))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/dynamic/dyn_mention/group.dart",
    "content": "import 'package:PiliPlus/models_new/dynamic/dyn_mention/item.dart';\n\nclass MentionGroup {\n  String? groupName;\n  int? groupType;\n  List<MentionItem>? items;\n\n  MentionGroup({this.groupName, this.groupType, this.items});\n\n  factory MentionGroup.fromJson(Map<String, dynamic> json) => MentionGroup(\n    groupName: json['group_name'] as String?,\n    groupType: json['group_type'] as int?,\n    items: (json['items'] as List<dynamic>?)\n        ?.map((e) => MentionItem.fromJson(e as Map<String, dynamic>))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/dynamic/dyn_mention/item.dart",
    "content": "import 'package:PiliPlus/pages/common/multi_select/base.dart';\n\nclass MentionItem with MultiSelectData {\n  final String? face;\n  final int? fans;\n  final String? name;\n  final int? officialVerifyType;\n  final String? uid;\n\n  MentionItem({\n    this.face,\n    this.fans,\n    this.name,\n    this.officialVerifyType,\n    this.uid,\n  });\n\n  factory MentionItem.fromJson(Map<String, dynamic> json) => MentionItem(\n    face: json['face'] as String?,\n    fans: json['fans'] as int?,\n    name: json['name'] as String?,\n    officialVerifyType: json['official_verify_type'] as int?,\n    uid: json['uid'] as String?,\n  );\n\n  @override\n  bool operator ==(Object other) {\n    if (identical(this, other)) {\n      return true;\n    }\n    if (other is MentionItem) {\n      return uid == other.uid;\n    }\n    return false;\n  }\n\n  @override\n  int get hashCode => uid.hashCode;\n}\n"
  },
  {
    "path": "lib/models_new/dynamic/dyn_reserve/data.dart",
    "content": "class DynReserveData {\n  int? finalBtnStatus;\n  int? btnMode;\n  int? reserveUpdate;\n  String? descUpdate;\n  String? toast;\n\n  DynReserveData({\n    this.finalBtnStatus,\n    this.btnMode,\n    this.reserveUpdate,\n    this.descUpdate,\n    this.toast,\n  });\n\n  factory DynReserveData.fromJson(Map<String, dynamic> json) => DynReserveData(\n    finalBtnStatus: json['final_btn_status'] as int?,\n    btnMode: json['btn_mode'] as int?,\n    reserveUpdate: json['reserve_update'] as int?,\n    descUpdate: json['desc_update'] as String?,\n    toast: json['toast'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/dynamic/dyn_reserve_info/data.dart",
    "content": "class ReserveInfoData {\n  int? id;\n  String? title;\n  int? stime;\n  int? etime;\n  int? type;\n  int? livePlanStartTime;\n  int? lotteryType;\n  String? lotteryId;\n  int? subType;\n\n  ReserveInfoData({\n    this.id,\n    this.title,\n    this.stime,\n    this.etime,\n    this.type,\n    this.livePlanStartTime,\n    this.lotteryType,\n    this.lotteryId,\n    this.subType,\n  });\n\n  factory ReserveInfoData.fromJson(Map<String, dynamic> json) =>\n      ReserveInfoData(\n        id: json['id'] as int?,\n        title: json['title'] as String?,\n        stime: json['stime'] as int?,\n        etime: json['etime'] as int?,\n        type: json['type'] as int?,\n        livePlanStartTime: json['live_plan_start_time'] as int?,\n        lotteryType: json['lottery_type'] as int?,\n        lotteryId: json['lottery_id'] as String?,\n        subType: json['sub_type'] as int?,\n      );\n\n  Map<String, dynamic> toJson() => {\n    'id': id,\n    'title': title,\n    'stime': stime,\n    'etime': etime,\n    'type': type,\n    'live_plan_start_time': livePlanStartTime,\n    'lottery_type': lotteryType,\n    'lottery_id': lotteryId,\n    'sub_type': subType,\n  };\n}\n"
  },
  {
    "path": "lib/models_new/dynamic/dyn_topic_feed/all_sort_by.dart",
    "content": "class AllSortBy {\n  int? sortBy;\n  String? sortName;\n\n  AllSortBy({this.sortBy, this.sortName});\n\n  factory AllSortBy.fromJson(Map<String, dynamic> json) => AllSortBy(\n    sortBy: json['sort_by'] as int?,\n    sortName: json['sort_name'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/dynamic/dyn_topic_feed/item.dart",
    "content": "import 'package:PiliPlus/models/dynamics/result.dart';\n\nclass TopicCardItem {\n  DynamicItemModel? dynamicCardItem;\n  String? topicType;\n\n  TopicCardItem({this.dynamicCardItem, this.topicType});\n\n  factory TopicCardItem.fromJson(Map<String, dynamic> json) => TopicCardItem(\n    dynamicCardItem: json['dynamic_card_item'] == null\n        ? null\n        : DynamicItemModel.fromJson(\n            json['dynamic_card_item'] as Map<String, dynamic>,\n          ),\n    topicType: json['topic_type'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/dynamic/dyn_topic_feed/topic_card_list.dart",
    "content": "import 'package:PiliPlus/models_new/dynamic/dyn_topic_feed/item.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_topic_feed/topic_sort_by_conf.dart';\n\nclass TopicCardList {\n  bool? hasMore;\n  List<TopicCardItem>? items;\n  String? offset;\n  TopicSortByConf? topicSortByConf;\n\n  TopicCardList({\n    this.hasMore,\n    this.items,\n    this.offset,\n    this.topicSortByConf,\n  });\n\n  factory TopicCardList.fromJson(Map<String, dynamic> json) => TopicCardList(\n    hasMore: json['has_more'] as bool?,\n    items: (json['items'] as List<dynamic>?)\n        ?.map((e) => TopicCardItem.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    offset: json['offset'] as String?,\n    topicSortByConf: json['topic_sort_by_conf'] == null\n        ? null\n        : TopicSortByConf.fromJson(\n            json['topic_sort_by_conf'] as Map<String, dynamic>,\n          ),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/dynamic/dyn_topic_feed/topic_sort_by_conf.dart",
    "content": "import 'package:PiliPlus/models_new/dynamic/dyn_topic_feed/all_sort_by.dart';\n\nclass TopicSortByConf {\n  List<AllSortBy>? allSortBy;\n  int? defaultSortBy;\n  int? showSortBy;\n\n  TopicSortByConf({this.allSortBy, this.defaultSortBy, this.showSortBy});\n\n  factory TopicSortByConf.fromJson(Map<String, dynamic> json) {\n    return TopicSortByConf(\n      allSortBy: (json['all_sort_by'] as List<dynamic>?)\n          ?.map((e) => AllSortBy.fromJson(e as Map<String, dynamic>))\n          .toList(),\n      defaultSortBy: json['default_sort_by'] as int?,\n      showSortBy: json['show_sort_by'] as int?,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/models_new/dynamic/dyn_topic_pub_search/data.dart",
    "content": "import 'package:PiliPlus/models_new/dynamic/dyn_topic_pub_search/new_topic.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_topic_pub_search/page_info.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_topic_top/topic_item.dart';\n\nclass TopicPubSearchData {\n  NewTopic? newTopic;\n  bool? hasCreateJurisdiction;\n  List<TopicItem>? topicItems;\n  String? requestId;\n  PageInfo? pageInfo;\n\n  TopicPubSearchData({\n    this.newTopic,\n    this.hasCreateJurisdiction,\n    this.topicItems,\n    this.requestId,\n    this.pageInfo,\n  });\n\n  factory TopicPubSearchData.fromJson(Map<String, dynamic> json) =>\n      TopicPubSearchData(\n        newTopic: json['new_topic'] == null\n            ? null\n            : NewTopic.fromJson(json['new_topic'] as Map<String, dynamic>),\n        hasCreateJurisdiction: json['has_create_jurisdiction'] as bool?,\n        topicItems: (json['topic_items'] as List<dynamic>?)\n            ?.map((e) => TopicItem.fromJson(e as Map<String, dynamic>))\n            .toList(),\n        requestId: json['request_id'] as String?,\n        pageInfo: json['page_info'] == null\n            ? null\n            : PageInfo.fromJson(json['page_info'] as Map<String, dynamic>),\n      );\n}\n"
  },
  {
    "path": "lib/models_new/dynamic/dyn_topic_pub_search/new_topic.dart",
    "content": "class NewTopic {\n  String? name;\n\n  NewTopic({this.name});\n\n  factory NewTopic.fromJson(Map<String, dynamic> json) => NewTopic(\n    name: json['name'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/dynamic/dyn_topic_pub_search/page_info.dart",
    "content": "class PageInfo {\n  int? offset;\n  bool? hasMore;\n\n  PageInfo({this.offset, this.hasMore});\n\n  factory PageInfo.fromJson(Map<String, dynamic> json) => PageInfo(\n    offset: json['offset'] as int?,\n    hasMore: json['has_more'] as bool?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/dynamic/dyn_topic_top/top_details.dart",
    "content": "import 'package:PiliPlus/models_new/dynamic/dyn_topic_top/topic_creator.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_topic_top/topic_item.dart';\n\nclass TopDetails {\n  TopicItem? topicItem;\n  TopicCreator? topicCreator;\n  bool? hasCreateJurisdiction;\n  int? wordColor;\n  bool? closePubLayerEntry;\n\n  TopDetails({\n    this.topicItem,\n    this.topicCreator,\n    this.hasCreateJurisdiction,\n    this.wordColor,\n    this.closePubLayerEntry,\n  });\n\n  factory TopDetails.fromJson(Map<String, dynamic> json) => TopDetails(\n    topicItem: json['topic_item'] == null\n        ? null\n        : TopicItem.fromJson(json['topic_item'] as Map<String, dynamic>),\n    topicCreator: json['topic_creator'] == null\n        ? null\n        : TopicCreator.fromJson(json['topic_creator'] as Map<String, dynamic>),\n    hasCreateJurisdiction: json['has_create_jurisdiction'] as bool?,\n    wordColor: json['word_color'] as int?,\n    closePubLayerEntry: json['close_pub_layer_entry'] as bool?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/dynamic/dyn_topic_top/topic_creator.dart",
    "content": "class TopicCreator {\n  int? uid;\n  String? face;\n  String? name;\n\n  TopicCreator({\n    this.uid,\n    this.face,\n    this.name,\n  });\n\n  factory TopicCreator.fromJson(Map<String, dynamic> json) => TopicCreator(\n    uid: json['uid'] as int?,\n    face: json['face'] as String?,\n    name: json['name'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/dynamic/dyn_topic_top/topic_item.dart",
    "content": "class TopicItem {\n  int id;\n  String name;\n  int view;\n  int discuss;\n  int fav;\n  int like;\n  int? dynamics;\n  String? jumpUrl;\n  String? backColor;\n  String? description;\n  String? sharePic;\n  String? shareUrl;\n  int? ctime;\n  bool? showInteractData;\n  bool? isFav;\n  bool? isLike;\n\n  TopicItem({\n    required this.id,\n    required this.name,\n    required this.view,\n    required this.discuss,\n    required this.fav,\n    required this.like,\n    this.dynamics,\n    this.jumpUrl,\n    this.backColor,\n    this.description,\n    this.sharePic,\n    this.shareUrl,\n    this.ctime,\n    this.showInteractData,\n    this.isFav,\n    this.isLike,\n  });\n\n  factory TopicItem.fromJson(Map<String, dynamic> json) => TopicItem(\n    id: json['id'],\n    name: json['name'],\n    view: json['view'] ?? 0,\n    discuss: json['discuss'] ?? 0,\n    fav: json['fav'] ?? 0,\n    like: json['like'] ?? 0,\n    dynamics: json['dynamics'] as int?,\n    jumpUrl: json['jump_url'] as String?,\n    backColor: json['back_color'] as String?,\n    description: json['description'] as String?,\n    sharePic: json['share_pic'] as String?,\n    shareUrl: json['share_url'] as String?,\n    ctime: json['ctime'] as int?,\n    showInteractData: json['show_interact_data'] as bool?,\n    isFav: json['is_fav'] as bool?,\n    isLike: json['is_like'] as bool?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/emote/data.dart",
    "content": "import 'package:PiliPlus/models_new/emote/package.dart';\n\nclass EmoteModelData {\n  List<Package>? packages;\n\n  EmoteModelData({this.packages});\n\n  factory EmoteModelData.fromJson(Map<String, dynamic> json) => EmoteModelData(\n    packages: (json['packages'] as List<dynamic>?)\n        ?.map((e) => Package.fromJson(e as Map<String, dynamic>))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/emote/emote.dart",
    "content": "import 'package:PiliPlus/models_new/emote/meta.dart';\n\nclass Emote {\n  String? text;\n  String? url;\n  Meta? meta;\n\n  Emote({\n    this.text,\n    this.url,\n    this.meta,\n  });\n\n  factory Emote.fromJson(Map<String, dynamic> json) => Emote(\n    text: json['text'] as String?,\n    url: json['url'] as String?,\n    meta: json['meta'] == null\n        ? null\n        : Meta.fromJson(json['meta'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/emote/meta.dart",
    "content": "class Meta {\n  int? size;\n  String? alias;\n\n  Meta({\n    this.size,\n    this.alias,\n  });\n\n  factory Meta.fromJson(Map<String, dynamic> json) => Meta(\n    size: json['size'] as int?,\n    alias: json['alias'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/emote/package.dart",
    "content": "import 'package:PiliPlus/models_new/emote/emote.dart';\n\nclass Package {\n  String? url;\n  int? type;\n  List<Emote>? emote;\n\n  Package({\n    this.url,\n    this.type,\n    this.emote,\n  });\n\n  factory Package.fromJson(Map<String, dynamic> json) => Package(\n    url: json['url'] as String?,\n    type: json['type'] as int?,\n    emote: (json['emote'] as List<dynamic>?)\n        ?.map((e) => Emote.fromJson(e as Map<String, dynamic>))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_article/author.dart",
    "content": "class Author {\n  String? name;\n  String? face;\n  String? mid;\n\n  Author({this.name, this.face, this.mid});\n\n  factory Author.fromJson(Map<String, dynamic> json) => Author(\n    name: json['name'] as String?,\n    face: json['face'] as String?,\n    mid: json['mid'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_article/cover.dart",
    "content": "class Cover {\n  String? url;\n  int? width;\n  int? height;\n\n  Cover({this.url, this.width, this.height});\n\n  factory Cover.fromJson(Map<String, dynamic> json) => Cover(\n    url: json['url'] as String?,\n    width: json['width'] as int?,\n    height: json['height'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_article/data.dart",
    "content": "import 'package:PiliPlus/models_new/fav/fav_article/item.dart';\n\nclass FavArticleData {\n  List<FavArticleItemModel>? items;\n  bool? hasMore;\n  String? offset;\n  String? updateNum;\n  String? updateBaseline;\n\n  FavArticleData({\n    this.items,\n    this.hasMore,\n    this.offset,\n    this.updateNum,\n    this.updateBaseline,\n  });\n\n  factory FavArticleData.fromJson(Map<String, dynamic> json) => FavArticleData(\n    items: (json['items'] as List<dynamic>?)\n        ?.map((e) => FavArticleItemModel.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    hasMore: json['has_more'] as bool?,\n    offset: json['offset'] as String?,\n    updateNum: json['update_num'] as String?,\n    updateBaseline: json['update_baseline'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_article/item.dart",
    "content": "import 'package:PiliPlus/models_new/fav/fav_article/author.dart';\nimport 'package:PiliPlus/models_new/fav/fav_article/cover.dart';\nimport 'package:PiliPlus/models_new/fav/fav_article/stat.dart';\n\nclass FavArticleItemModel {\n  String? jumpUrl;\n  String? opusId;\n  String? content;\n  dynamic badge;\n  Author? author;\n  Cover? cover;\n  Stat? stat;\n  String? pubTime;\n\n  FavArticleItemModel({\n    this.jumpUrl,\n    this.opusId,\n    this.content,\n    this.badge,\n    this.author,\n    this.cover,\n    this.stat,\n    this.pubTime,\n  });\n\n  factory FavArticleItemModel.fromJson(Map<String, dynamic> json) =>\n      FavArticleItemModel(\n        jumpUrl: json['jump_url'] as String?,\n        opusId: json['opus_id'] as String?,\n        content: json['content'] as String?,\n        badge: json['badge'] as dynamic,\n        author: json['author'] == null\n            ? null\n            : Author.fromJson(json['author'] as Map<String, dynamic>),\n        cover: json['cover'] == null\n            ? null\n            : Cover.fromJson(json['cover'] as Map<String, dynamic>),\n        stat: json['stat'] == null\n            ? null\n            : Stat.fromJson(json['stat'] as Map<String, dynamic>),\n        pubTime: json['pub_time'] as String?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_article/stat.dart",
    "content": "class Stat {\n  String? view;\n  String? like;\n\n  Stat({this.view, this.like});\n\n  factory Stat.fromJson(Map<String, dynamic> json) => Stat(\n    view: json['view'] as String?,\n    like: json['like'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_detail/cnt_info.dart",
    "content": "class CntInfo {\n  int? collect;\n  int? play;\n  int? thumbUp;\n  int? thumbDown;\n  int? share;\n  int? reply;\n  int? danmaku;\n  num? coin;\n  int? vt;\n  int? playSwitch;\n  String? viewText1;\n\n  CntInfo({\n    this.collect,\n    this.play,\n    this.thumbUp,\n    this.thumbDown,\n    this.share,\n    this.reply,\n    this.danmaku,\n    this.coin,\n    this.vt,\n    this.playSwitch,\n    this.viewText1,\n  });\n\n  factory CntInfo.fromJson(Map<String, dynamic> json) => CntInfo(\n    collect: json['collect'] as int?,\n    play: json['play'] as int?,\n    thumbUp: json['thumb_up'] as int?,\n    thumbDown: json['thumb_down'] as int?,\n    share: json['share'] as int?,\n    reply: json['reply'] as int?,\n    danmaku: json['danmaku'] as int?,\n    coin: json['coin'] as num?,\n    vt: json['vt'] as int?,\n    playSwitch: json['play_switch'] as int?,\n    viewText1: json['view_text_1'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_detail/data.dart",
    "content": "import 'package:PiliPlus/models_new/fav/fav_detail/media.dart';\nimport 'package:PiliPlus/models_new/fav/fav_folder/list.dart';\n\nclass FavDetailData {\n  FavFolderInfo? info;\n  List<FavDetailItemModel>? medias;\n  bool? hasMore;\n  int? ttl;\n\n  FavDetailData({this.info, this.medias, this.hasMore, this.ttl});\n\n  factory FavDetailData.fromJson(Map<String, dynamic> json) => FavDetailData(\n    info: json['info'] == null\n        ? null\n        : FavFolderInfo.fromJson(json['info'] as Map<String, dynamic>),\n    medias: (json['medias'] as List<dynamic>?)\n        ?.map((e) => FavDetailItemModel.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    hasMore: json['has_more'] as bool?,\n    ttl: json['ttl'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_detail/info.dart",
    "content": "import 'package:PiliPlus/models/model_owner.dart';\nimport 'package:PiliPlus/models_new/fav/fav_detail/cnt_info.dart';\n\nclass FavDetailInfo {\n  int? id;\n  int? fid;\n  int? mid;\n  int? attr;\n  String? title;\n  String? cover;\n  Owner? upper;\n  int? coverType;\n  CntInfo? cntInfo;\n  int? type;\n  String? intro;\n  int? ctime;\n  int? mtime;\n  int? state;\n  int? favState;\n  int? likeState;\n  int? mediaCount;\n  bool? isTop;\n\n  FavDetailInfo({\n    this.id,\n    this.fid,\n    this.mid,\n    this.attr,\n    this.title,\n    this.cover,\n    this.upper,\n    this.coverType,\n    this.cntInfo,\n    this.type,\n    this.intro,\n    this.ctime,\n    this.mtime,\n    this.state,\n    this.favState,\n    this.likeState,\n    this.mediaCount,\n    this.isTop,\n  });\n\n  factory FavDetailInfo.fromJson(Map<String, dynamic> json) => FavDetailInfo(\n    id: json['id'] as int?,\n    fid: json['fid'] as int?,\n    mid: json['mid'] as int?,\n    attr: json['attr'] as int?,\n    title: json['title'] as String?,\n    cover: json['cover'] as String?,\n    upper: json['upper'] == null\n        ? null\n        : Owner.fromJson(json['upper'] as Map<String, dynamic>),\n    coverType: json['cover_type'] as int?,\n    cntInfo: json['cnt_info'] == null\n        ? null\n        : CntInfo.fromJson(json['cnt_info'] as Map<String, dynamic>),\n    type: json['type'] as int?,\n    intro: json['intro'] as String?,\n    ctime: json['ctime'] as int?,\n    mtime: json['mtime'] as int?,\n    state: json['state'] as int?,\n    favState: json['fav_state'] as int?,\n    likeState: json['like_state'] as int?,\n    mediaCount: json['media_count'] as int?,\n    isTop: json['is_top'] as bool?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_detail/media.dart",
    "content": "import 'package:PiliPlus/models/model_owner.dart';\nimport 'package:PiliPlus/models_new/fav/fav_detail/cnt_info.dart';\nimport 'package:PiliPlus/models_new/fav/fav_detail/ogv.dart';\nimport 'package:PiliPlus/models_new/fav/fav_detail/ugc.dart';\nimport 'package:PiliPlus/pages/common/multi_select/base.dart';\n\nclass FavDetailItemModel with MultiSelectData {\n  int? id;\n  int? type;\n  String? title;\n  String? cover;\n  String? intro;\n  int? page;\n  int? duration;\n  Owner? upper;\n  int? attr;\n  CntInfo? cntInfo;\n  String? link;\n  int? ctime;\n  int? pubtime;\n  int? favTime;\n  String? bvid;\n  Ogv? ogv;\n  Ugc? ugc;\n  String? mediaListLink;\n\n  FavDetailItemModel({\n    this.id,\n    this.type,\n    this.title,\n    this.cover,\n    this.intro,\n    this.page,\n    this.duration,\n    this.upper,\n    this.attr,\n    this.cntInfo,\n    this.link,\n    this.ctime,\n    this.pubtime,\n    this.favTime,\n    this.bvid,\n    this.ogv,\n    this.ugc,\n    this.mediaListLink,\n  });\n\n  factory FavDetailItemModel.fromJson(Map<String, dynamic> json) =>\n      FavDetailItemModel(\n        id: json['id'] as int?,\n        type: json['type'] as int?,\n        title: json['title'] as String?,\n        cover: json['cover'] as String?,\n        intro: json['intro'] as String?,\n        page: json['page'] as int?,\n        duration: json['duration'] as int?,\n        upper: json['upper'] == null\n            ? null\n            : Owner.fromJson(json['upper'] as Map<String, dynamic>),\n        attr: json['attr'] as int?,\n        cntInfo: json['cnt_info'] == null\n            ? null\n            : CntInfo.fromJson(json['cnt_info'] as Map<String, dynamic>),\n        link: json['link'] as String?,\n        ctime: json['ctime'] as int?,\n        pubtime: json['pubtime'] as int?,\n        favTime: json['fav_time'] as int?,\n        bvid: json['bvid'] ?? json['bv_id'],\n        ogv: json['ogv'] == null ? null : Ogv.fromJson(json['ogv']),\n        ugc: json['ugc'] == null\n            ? null\n            : Ugc.fromJson(json['ugc'] as Map<String, dynamic>),\n        mediaListLink: json['media_list_link'] as String?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_detail/ogv.dart",
    "content": "class Ogv {\n  String? typeName;\n  int? typeId;\n  int? seasonId;\n\n  Ogv({\n    this.typeName,\n    this.typeId,\n    this.seasonId,\n  });\n\n  factory Ogv.fromJson(Map<String, dynamic> json) => Ogv(\n    typeName: json['type_name'],\n    typeId: json['type_id'],\n    seasonId: json['season_id'],\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_detail/ugc.dart",
    "content": "class Ugc {\n  int? firstCid;\n\n  Ugc({this.firstCid});\n\n  factory Ugc.fromJson(Map<String, dynamic> json) => Ugc(\n    firstCid: json['first_cid'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_folder/data.dart",
    "content": "import 'package:PiliPlus/models_new/fav/fav_folder/list.dart';\n\nclass FavFolderData {\n  int? count;\n  List<FavFolderInfo>? list;\n  bool? hasMore;\n\n  FavFolderData({this.count, this.list, this.hasMore});\n\n  factory FavFolderData.fromJson(Map<String, dynamic> json) => FavFolderData(\n    count: json['count'] as int?,\n    list: (json['list'] as List<dynamic>?)\n        ?.map((e) => FavFolderInfo.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    hasMore: json['has_more'] as bool?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_folder/list.dart",
    "content": "import 'package:PiliPlus/models/model_owner.dart';\n\nclass FavFolderInfo {\n  int id;\n  int? fid;\n  int mid;\n  int attr;\n  String? attrDesc;\n  String title;\n  String cover;\n  Owner? upper;\n  int? coverType;\n  String? intro;\n  int? ctime;\n  int? mtime;\n  int? state;\n  int? favState;\n  int mediaCount;\n  int? viewCount;\n  bool? isTop;\n  int? type;\n  String? bvid;\n\n  FavFolderInfo({\n    this.id = 0,\n    this.fid,\n    this.mid = 0,\n    this.attr = -1,\n    this.attrDesc,\n    this.title = '',\n    this.cover = '',\n    this.upper,\n    this.coverType,\n    this.intro,\n    this.ctime,\n    this.mtime,\n    this.state,\n    this.favState,\n    this.mediaCount = 0,\n    this.viewCount,\n    this.isTop,\n    this.type,\n    this.bvid,\n  });\n\n  factory FavFolderInfo.fromJson(Map<String, dynamic> json) => FavFolderInfo(\n    id: json['id'] as int? ?? 0,\n    fid: json['fid'] as int?,\n    mid: json['mid'] as int? ?? 0,\n    attr: json['attr'] as int? ?? 0,\n    attrDesc: json['attr_desc'] as String?,\n    title: json['title'] as String? ?? '',\n    cover: json['cover'] as String? ?? '',\n    upper: json['upper'] == null\n        ? null\n        : Owner.fromJson(json['upper'] as Map<String, dynamic>),\n    coverType: json['cover_type'] as int?,\n    intro: json['intro'] as String?,\n    ctime: json['ctime'] as int?,\n    mtime: json['mtime'] as int?,\n    state: json['state'] as int?,\n    favState: json['fav_state'] as int?,\n    mediaCount: json['media_count'] as int? ?? 0,\n    viewCount: json['view_count'] as int?,\n    isTop: json['is_top'] as bool?,\n    type: json['type'] as int?,\n    bvid: json['bvid'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_note/arc.dart",
    "content": "class Arc {\n  int? oid;\n  String? bvid;\n  String? pic;\n  String? desc;\n  int? status;\n  int? oidType;\n  int? aid;\n\n  Arc({\n    this.oid,\n    this.bvid,\n    this.pic,\n    this.desc,\n    this.status,\n    this.oidType,\n    this.aid,\n  });\n\n  factory Arc.fromJson(Map<String, dynamic> json) => Arc(\n    oid: json['oid'] as int?,\n    bvid: json['bvid'] as String?,\n    pic: json['pic'] as String?,\n    desc: json['desc'] as String?,\n    status: json['status'] as int?,\n    oidType: json['oid_type'] as int?,\n    aid: json['aid'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_note/data.dart",
    "content": "import 'package:PiliPlus/models_new/fav/fav_note/list.dart';\nimport 'package:PiliPlus/models_new/fav/fav_note/page.dart';\n\nclass FavNoteData {\n  List<FavNoteItemModel>? list;\n  Page? page;\n\n  FavNoteData({this.list, this.page});\n\n  factory FavNoteData.fromJson(Map<String, dynamic> json) => FavNoteData(\n    list: (json['list'] as List<dynamic>?)\n        ?.map((e) => FavNoteItemModel.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    page: json['page'] == null\n        ? null\n        : Page.fromJson(json['page'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_note/list.dart",
    "content": "import 'package:PiliPlus/pages/common/multi_select/base.dart';\n\nclass FavNoteItemModel with MultiSelectData {\n  FavNoteItemModel({\n    this.webUrl,\n    this.title,\n    this.summary,\n    this.message,\n    this.pic,\n    this.cvid,\n    this.noteId,\n  });\n\n  String? webUrl;\n  String? title;\n  String? summary;\n  String? message;\n  String? pic;\n  dynamic cvid;\n  dynamic noteId;\n\n  FavNoteItemModel.fromJson(Map json) {\n    webUrl = json['web_url'];\n    title = json['title'];\n    summary = json['summary'];\n    message = json['message'];\n    pic = json['arc']?['pic'];\n    cvid = json['cvid'];\n    noteId = json['note_id'];\n  }\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_note/page.dart",
    "content": "class Page {\n  int? total;\n  int? size;\n  int? num;\n\n  Page({this.total, this.size, this.num});\n\n  factory Page.fromJson(Map<String, dynamic> json) => Page(\n    total: json['total'] as int?,\n    size: json['size'] as int?,\n    num: json['num'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_pgc/area.dart",
    "content": "class Area {\n  int? id;\n  String? name;\n\n  Area({this.id, this.name});\n\n  factory Area.fromJson(Map<String, dynamic> json) => Area(\n    id: json['id'] as int?,\n    name: json['name'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_pgc/badge_info.dart",
    "content": "import 'package:PiliPlus/models_new/fav/fav_pgc/multi_img.dart';\n\nclass BadgeInfo {\n  String? text;\n  String? bgColor;\n  String? bgColorNight;\n  String? img;\n  MultiImg? multiImg;\n\n  BadgeInfo({\n    this.text,\n    this.bgColor,\n    this.bgColorNight,\n    this.img,\n    this.multiImg,\n  });\n\n  factory BadgeInfo.fromJson(Map<String, dynamic> json) => BadgeInfo(\n    text: json['text'] as String?,\n    bgColor: json['bg_color'] as String?,\n    bgColorNight: json['bg_color_night'] as String?,\n    img: json['img'] as String?,\n    multiImg: json['multi_img'] == null\n        ? null\n        : MultiImg.fromJson(json['multi_img'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_pgc/badge_infos.dart",
    "content": "import 'package:PiliPlus/models_new/fav/fav_pgc/content_attr.dart';\nimport 'package:PiliPlus/models_new/fav/fav_pgc/vip_or_pay.dart';\n\nclass BadgeInfos {\n  ContentAttr? contentAttr;\n  VipOrPay? vipOrPay;\n\n  BadgeInfos({this.contentAttr, this.vipOrPay});\n\n  factory BadgeInfos.fromJson(Map<String, dynamic> json) => BadgeInfos(\n    contentAttr: json['content_attr'] == null\n        ? null\n        : ContentAttr.fromJson(json['content_attr'] as Map<String, dynamic>),\n    vipOrPay: json['vip_or_pay'] == null\n        ? null\n        : VipOrPay.fromJson(json['vip_or_pay'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_pgc/cc_on_lock.dart",
    "content": "class CcOnLock {\n  String? typeUrl;\n\n  CcOnLock({this.typeUrl});\n\n  factory CcOnLock.fromJson(Map<String, dynamic> json) => CcOnLock(\n    typeUrl: json['type_url'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_pgc/config_attrs.dart",
    "content": "import 'package:PiliPlus/models_new/fav/fav_pgc/cc_on_lock.dart';\nimport 'package:PiliPlus/models_new/fav/fav_pgc/highlight_ineffective_hd.dart';\nimport 'package:PiliPlus/models_new/fav/fav_pgc/highlight_ineffective_ott.dart';\nimport 'package:PiliPlus/models_new/fav/fav_pgc/highlight_ineffective_pink.dart';\n\nclass ConfigAttrs {\n  CcOnLock? ccOnLock;\n  HighlightIneffectiveHd? highlightIneffectiveHd;\n  HighlightIneffectiveOtt? highlightIneffectiveOtt;\n  HighlightIneffectivePink? highlightIneffectivePink;\n\n  ConfigAttrs({\n    this.ccOnLock,\n    this.highlightIneffectiveHd,\n    this.highlightIneffectiveOtt,\n    this.highlightIneffectivePink,\n  });\n\n  factory ConfigAttrs.fromJson(Map<String, dynamic> json) => ConfigAttrs(\n    ccOnLock: json['cc_on_lock'] == null\n        ? null\n        : CcOnLock.fromJson(json['cc_on_lock'] as Map<String, dynamic>),\n    highlightIneffectiveHd: json['highlight_ineffective_hd'] == null\n        ? null\n        : HighlightIneffectiveHd.fromJson(\n            json['highlight_ineffective_hd'] as Map<String, dynamic>,\n          ),\n    highlightIneffectiveOtt: json['highlight_ineffective_ott'] == null\n        ? null\n        : HighlightIneffectiveOtt.fromJson(\n            json['highlight_ineffective_ott'] as Map<String, dynamic>,\n          ),\n    highlightIneffectivePink: json['highlight_ineffective_pink'] == null\n        ? null\n        : HighlightIneffectivePink.fromJson(\n            json['highlight_ineffective_pink'] as Map<String, dynamic>,\n          ),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_pgc/content_attr.dart",
    "content": "import 'package:PiliPlus/models_new/fav/fav_pgc/multi_img.dart';\n\nclass ContentAttr {\n  String? text;\n  String? bgColor;\n  String? bgColorNight;\n  String? img;\n  MultiImg? multiImg;\n\n  ContentAttr({\n    this.text,\n    this.bgColor,\n    this.bgColorNight,\n    this.img,\n    this.multiImg,\n  });\n\n  factory ContentAttr.fromJson(Map<String, dynamic> json) => ContentAttr(\n    text: json['text'] as String?,\n    bgColor: json['bg_color'] as String?,\n    bgColorNight: json['bg_color_night'] as String?,\n    img: json['img'] as String?,\n    multiImg: json['multi_img'] == null\n        ? null\n        : MultiImg.fromJson(json['multi_img'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_pgc/data.dart",
    "content": "import 'package:PiliPlus/models_new/fav/fav_pgc/list.dart';\n\nclass FavPgcData {\n  List<FavPgcItemModel>? list;\n  int? pn;\n  int? ps;\n  int? total;\n\n  FavPgcData({this.list, this.pn, this.ps, this.total});\n\n  factory FavPgcData.fromJson(Map<String, dynamic> json) => FavPgcData(\n    list: (json['list'] as List<dynamic>?)\n        ?.map((e) => FavPgcItemModel.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    pn: json['pn'] as int?,\n    ps: json['ps'] as int?,\n    total: json['total'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_pgc/first_ep_info.dart",
    "content": "class FirstEpInfo {\n  int? id;\n  String? cover;\n  String? title;\n  String? longTitle;\n  String? pubTime;\n  int? duration;\n\n  FirstEpInfo({\n    this.id,\n    this.cover,\n    this.title,\n    this.longTitle,\n    this.pubTime,\n    this.duration,\n  });\n\n  factory FirstEpInfo.fromJson(Map<String, dynamic> json) => FirstEpInfo(\n    id: json['id'] as int?,\n    cover: json['cover'] as String?,\n    title: json['title'] as String?,\n    longTitle: json['long_title'] as String?,\n    pubTime: json['pub_time'] as String?,\n    duration: json['duration'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_pgc/highlight_ineffective_hd.dart",
    "content": "class HighlightIneffectiveHd {\n  String? typeUrl;\n\n  HighlightIneffectiveHd({this.typeUrl});\n\n  factory HighlightIneffectiveHd.fromJson(Map<String, dynamic> json) {\n    return HighlightIneffectiveHd(\n      typeUrl: json['type_url'] as String?,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_pgc/highlight_ineffective_ott.dart",
    "content": "class HighlightIneffectiveOtt {\n  String? typeUrl;\n\n  HighlightIneffectiveOtt({this.typeUrl});\n\n  factory HighlightIneffectiveOtt.fromJson(Map<String, dynamic> json) {\n    return HighlightIneffectiveOtt(\n      typeUrl: json['type_url'] as String?,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_pgc/highlight_ineffective_pink.dart",
    "content": "class HighlightIneffectivePink {\n  String? typeUrl;\n\n  HighlightIneffectivePink({this.typeUrl});\n\n  factory HighlightIneffectivePink.fromJson(Map<String, dynamic> json) {\n    return HighlightIneffectivePink(\n      typeUrl: json['type_url'] as String?,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_pgc/list.dart",
    "content": "import 'package:PiliPlus/models_new/fav/fav_pgc/area.dart';\nimport 'package:PiliPlus/models_new/fav/fav_pgc/badge_info.dart';\nimport 'package:PiliPlus/models_new/fav/fav_pgc/badge_infos.dart';\nimport 'package:PiliPlus/models_new/fav/fav_pgc/config_attrs.dart';\nimport 'package:PiliPlus/models_new/fav/fav_pgc/first_ep_info.dart';\nimport 'package:PiliPlus/models_new/fav/fav_pgc/new_ep.dart';\nimport 'package:PiliPlus/models_new/fav/fav_pgc/producer.dart';\nimport 'package:PiliPlus/models_new/fav/fav_pgc/publish.dart';\nimport 'package:PiliPlus/models_new/fav/fav_pgc/rating.dart';\nimport 'package:PiliPlus/models_new/fav/fav_pgc/rights.dart';\nimport 'package:PiliPlus/models_new/fav/fav_pgc/section.dart';\nimport 'package:PiliPlus/models_new/fav/fav_pgc/series.dart';\nimport 'package:PiliPlus/models_new/fav/fav_pgc/stat.dart';\nimport 'package:PiliPlus/pages/common/multi_select/base.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\n\nclass FavPgcItemModel with MultiSelectData {\n  int? seasonId;\n  int? mediaId;\n  int? seasonType;\n  String? seasonTypeName;\n  String? title;\n  String? cover;\n  int? totalCount;\n  int? isFinish;\n  int? isStarted;\n  int? isPlay;\n  String? badge;\n  int? badgeType;\n  Rights? rights;\n  Stat? stat;\n  NewEp? newEp;\n  Rating? rating;\n  String? squareCover;\n  int? seasonStatus;\n  String? seasonTitle;\n  String? badgeEp;\n  int? mediaAttr;\n  int? seasonAttr;\n  String? evaluate;\n  List<Area>? areas;\n  String? subtitle;\n  int? firstEp;\n  int? canWatch;\n  Series? series;\n  Publish? publish;\n  int? mode;\n  List<Section>? section;\n  String? url;\n  BadgeInfo? badgeInfo;\n  String? renewalTime;\n  FirstEpInfo? firstEpInfo;\n  int? formalEpCount;\n  String? shortUrl;\n  BadgeInfos? badgeInfos;\n  String? seasonVersion;\n  String? horizontalCover169;\n  String? horizontalCover1610;\n  String? subtitle14;\n  int? viewableCrowdType;\n  List<Producer>? producers;\n  String? summary;\n  List<String>? styles;\n  ConfigAttrs? configAttrs;\n  int? followStatus;\n  int? isNew;\n  String? progress;\n  bool? bothFollow;\n  String? subtitle25;\n\n  FavPgcItemModel({\n    this.seasonId,\n    this.mediaId,\n    this.seasonType,\n    this.seasonTypeName,\n    this.title,\n    this.cover,\n    this.totalCount,\n    this.isFinish,\n    this.isStarted,\n    this.isPlay,\n    this.badge,\n    this.badgeType,\n    this.rights,\n    this.stat,\n    this.newEp,\n    this.rating,\n    this.squareCover,\n    this.seasonStatus,\n    this.seasonTitle,\n    this.badgeEp,\n    this.mediaAttr,\n    this.seasonAttr,\n    this.evaluate,\n    this.areas,\n    this.subtitle,\n    this.firstEp,\n    this.canWatch,\n    this.series,\n    this.publish,\n    this.mode,\n    this.section,\n    this.url,\n    this.badgeInfo,\n    this.renewalTime,\n    this.firstEpInfo,\n    this.formalEpCount,\n    this.shortUrl,\n    this.badgeInfos,\n    this.seasonVersion,\n    this.horizontalCover169,\n    this.horizontalCover1610,\n    this.subtitle14,\n    this.viewableCrowdType,\n    this.producers,\n    this.summary,\n    this.styles,\n    this.configAttrs,\n    this.followStatus,\n    this.isNew,\n    this.progress,\n    this.bothFollow,\n    this.subtitle25,\n  });\n\n  factory FavPgcItemModel.fromJson(\n    Map<String, dynamic> json,\n  ) => FavPgcItemModel(\n    seasonId: json['season_id'] as int?,\n    mediaId: json['media_id'] as int?,\n    seasonType: json['season_type'] as int?,\n    seasonTypeName: json['season_type_name'] as String?,\n    title: json['title'] as String?,\n    cover: json['cover'] as String?,\n    totalCount: json['total_count'] as int?,\n    isFinish: json['is_finish'] as int?,\n    isStarted: json['is_started'] as int?,\n    isPlay: json['is_play'] as int?,\n    badge: json['badge'] as String?,\n    badgeType: json['badge_type'] as int?,\n    rights: json['rights'] == null\n        ? null\n        : Rights.fromJson(json['rights'] as Map<String, dynamic>),\n    stat: json['stat'] == null\n        ? null\n        : Stat.fromJson(json['stat'] as Map<String, dynamic>),\n    newEp: json['new_ep'] == null\n        ? null\n        : NewEp.fromJson(json['new_ep'] as Map<String, dynamic>),\n    rating: json['rating'] == null\n        ? null\n        : Rating.fromJson(json['rating'] as Map<String, dynamic>),\n    squareCover: json['square_cover'] as String?,\n    seasonStatus: json['season_status'] as int?,\n    seasonTitle: json['season_title'] as String?,\n    badgeEp: json['badge_ep'] as String?,\n    mediaAttr: json['media_attr'] as int?,\n    seasonAttr: json['season_attr'] as int?,\n    evaluate: json['evaluate'] as String?,\n    areas: (json['areas'] as List<dynamic>?)\n        ?.map((e) => Area.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    subtitle: json['subtitle'] as String?,\n    firstEp: json['first_ep'] as int?,\n    canWatch: json['can_watch'] as int?,\n    series: json['series'] == null\n        ? null\n        : Series.fromJson(json['series'] as Map<String, dynamic>),\n    publish: json['publish'] == null\n        ? null\n        : Publish.fromJson(json['publish'] as Map<String, dynamic>),\n    mode: json['mode'] as int?,\n    section: (json['section'] as List<dynamic>?)\n        ?.map((e) => Section.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    url: json['url'] as String?,\n    badgeInfo: json['badge_info'] == null\n        ? null\n        : BadgeInfo.fromJson(json['badge_info'] as Map<String, dynamic>),\n    renewalTime: json['renewal_time'] as String?,\n    firstEpInfo: json['first_ep_info'] == null\n        ? null\n        : FirstEpInfo.fromJson(json['first_ep_info'] as Map<String, dynamic>),\n    formalEpCount: json['formal_ep_count'] as int?,\n    shortUrl: json['short_url'] as String?,\n    badgeInfos: json['badge_infos'] == null\n        ? null\n        : BadgeInfos.fromJson(json['badge_infos'] as Map<String, dynamic>),\n    seasonVersion: json['season_version'] as String?,\n    horizontalCover169: json['horizontal_cover_16_9'] as String?,\n    horizontalCover1610: json['horizontal_cover_16_10'] as String?,\n    subtitle14: json['subtitle_14'] as String?,\n    viewableCrowdType: json['viewable_crowd_type'] as int?,\n    producers: (json['producers'] as List<dynamic>?)\n        ?.map((e) => Producer.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    summary: json['summary'] as String?,\n    styles: (json['styles'] as List?)?.fromCast(),\n    configAttrs: json['config_attrs'] == null\n        ? null\n        : ConfigAttrs.fromJson(json['config_attrs'] as Map<String, dynamic>),\n    followStatus: json['follow_status'] as int?,\n    isNew: json['is_new'] as int?,\n    progress: json['progress'] == '' ? null : json['progress'],\n    bothFollow: json['both_follow'] as bool?,\n    subtitle25: json['subtitle_25'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_pgc/multi_img.dart",
    "content": "class MultiImg {\n  String? color;\n  String? mediumRemind;\n\n  MultiImg({this.color, this.mediumRemind});\n\n  factory MultiImg.fromJson(Map<String, dynamic> json) => MultiImg(\n    color: json['color'] as String?,\n    mediumRemind: json['medium_remind'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_pgc/new_ep.dart",
    "content": "class NewEp {\n  int? id;\n  String? indexShow;\n  String? cover;\n  String? title;\n  String? longTitle;\n  String? pubTime;\n  int? duration;\n\n  NewEp({\n    this.id,\n    this.indexShow,\n    this.cover,\n    this.title,\n    this.longTitle,\n    this.pubTime,\n    this.duration,\n  });\n\n  factory NewEp.fromJson(Map<String, dynamic> json) => NewEp(\n    id: json['id'] as int?,\n    indexShow: json['index_show'] as String?,\n    cover: json['cover'] as String?,\n    title: json['title'] as String?,\n    longTitle: json['long_title'] as String?,\n    pubTime: json['pub_time'] as String?,\n    duration: json['duration'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_pgc/producer.dart",
    "content": "class Producer {\n  int? mid;\n  int? type;\n  int? isContribute;\n  String? title;\n\n  Producer({this.mid, this.type, this.isContribute, this.title});\n\n  factory Producer.fromJson(Map<String, dynamic> json) => Producer(\n    mid: json['mid'] as int?,\n    type: json['type'] as int?,\n    isContribute: json['is_contribute'] as int?,\n    title: json['title'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_pgc/publish.dart",
    "content": "class Publish {\n  String? pubTime;\n  String? pubTimeShow;\n  String? releaseDate;\n  String? releaseDateShow;\n\n  Publish({\n    this.pubTime,\n    this.pubTimeShow,\n    this.releaseDate,\n    this.releaseDateShow,\n  });\n\n  factory Publish.fromJson(Map<String, dynamic> json) => Publish(\n    pubTime: json['pub_time'] as String?,\n    pubTimeShow: json['pub_time_show'] as String?,\n    releaseDate: json['release_date'] as String?,\n    releaseDateShow: json['release_date_show'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_pgc/rating.dart",
    "content": "class Rating {\n  double? score;\n  int? count;\n\n  Rating({this.score, this.count});\n\n  factory Rating.fromJson(Map<String, dynamic> json) => Rating(\n    score: (json['score'] as num?)?.toDouble(),\n    count: json['count'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_pgc/rights.dart",
    "content": "class Rights {\n  int? allowReview;\n  int? allowPreview;\n  int? isSelection;\n  int? selectionStyle;\n  int? isRcmd;\n\n  Rights({\n    this.allowReview,\n    this.allowPreview,\n    this.isSelection,\n    this.selectionStyle,\n    this.isRcmd,\n  });\n\n  factory Rights.fromJson(Map<String, dynamic> json) => Rights(\n    allowReview: json['allow_review'] as int?,\n    allowPreview: json['allow_preview'] as int?,\n    isSelection: json['is_selection'] as int?,\n    selectionStyle: json['selection_style'] as int?,\n    isRcmd: json['is_rcmd'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_pgc/section.dart",
    "content": "import 'package:PiliPlus/utils/extension/iterable_ext.dart';\n\nclass Section {\n  int? sectionId;\n  int? seasonId;\n  int? limitGroup;\n  int? watchPlatform;\n  String? copyright;\n  int? banAreaShow;\n  List<int>? episodeIds;\n\n  Section({\n    this.sectionId,\n    this.seasonId,\n    this.limitGroup,\n    this.watchPlatform,\n    this.copyright,\n    this.banAreaShow,\n    this.episodeIds,\n  });\n\n  factory Section.fromJson(Map<String, dynamic> json) => Section(\n    sectionId: json['section_id'] as int?,\n    seasonId: json['season_id'] as int?,\n    limitGroup: json['limit_group'] as int?,\n    watchPlatform: json['watch_platform'] as int?,\n    copyright: json['copyright'] as String?,\n    banAreaShow: json['ban_area_show'] as int?,\n    episodeIds: (json['episode_ids'] as List?)?.fromCast(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_pgc/series.dart",
    "content": "class Series {\n  int? seriesId;\n  String? title;\n  int? seasonCount;\n  int? newSeasonId;\n  int? seriesOrd;\n\n  Series({\n    this.seriesId,\n    this.title,\n    this.seasonCount,\n    this.newSeasonId,\n    this.seriesOrd,\n  });\n\n  factory Series.fromJson(Map<String, dynamic> json) => Series(\n    seriesId: json['series_id'] as int?,\n    title: json['title'] as String?,\n    seasonCount: json['season_count'] as int?,\n    newSeasonId: json['new_season_id'] as int?,\n    seriesOrd: json['series_ord'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_pgc/stat.dart",
    "content": "class Stat {\n  int? follow;\n  int? view;\n  int? danmaku;\n  int? reply;\n  num? coin;\n  int? seriesFollow;\n  int? seriesView;\n  int? likes;\n  int? favorite;\n\n  Stat({\n    this.follow,\n    this.view,\n    this.danmaku,\n    this.reply,\n    this.coin,\n    this.seriesFollow,\n    this.seriesView,\n    this.likes,\n    this.favorite,\n  });\n\n  factory Stat.fromJson(Map<String, dynamic> json) => Stat(\n    follow: json['follow'] as int?,\n    view: json['view'] as int?,\n    danmaku: json['danmaku'] as int?,\n    reply: json['reply'] as int?,\n    coin: json['coin'] as num?,\n    seriesFollow: json['series_follow'] as int?,\n    seriesView: json['series_view'] as int?,\n    likes: json['likes'] as int?,\n    favorite: json['favorite'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_pgc/vip_or_pay.dart",
    "content": "import 'package:PiliPlus/models_new/fav/fav_pgc/multi_img.dart';\n\nclass VipOrPay {\n  String? text;\n  String? bgColor;\n  String? bgColorNight;\n  String? img;\n  MultiImg? multiImg;\n\n  VipOrPay({\n    this.text,\n    this.bgColor,\n    this.bgColorNight,\n    this.img,\n    this.multiImg,\n  });\n\n  factory VipOrPay.fromJson(Map<String, dynamic> json) => VipOrPay(\n    text: json['text'] as String?,\n    bgColor: json['bg_color'] as String?,\n    bgColorNight: json['bg_color_night'] as String?,\n    img: json['img'] as String?,\n    multiImg: json['multi_img'] == null\n        ? null\n        : MultiImg.fromJson(json['multi_img'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_topic/data.dart",
    "content": "import 'package:PiliPlus/models_new/fav/fav_topic/topic_list.dart';\n\nclass FavTopicData {\n  TopicList? topicList;\n\n  FavTopicData({this.topicList});\n\n  factory FavTopicData.fromJson(Map<String, dynamic> json) => FavTopicData(\n    topicList: json['topic_list'] == null\n        ? null\n        : TopicList.fromJson(json['topic_list'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_topic/page_info.dart",
    "content": "class PageInfo {\n  int? curPageNum;\n  int? total;\n\n  PageInfo({this.curPageNum, this.total});\n\n  factory PageInfo.fromJson(Map<String, dynamic> json) => PageInfo(\n    curPageNum: json['cur_page_num'] as int?,\n    total: json['total'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_topic/topic_item.dart",
    "content": "class FavTopicItem {\n  int? id;\n  String? name;\n  int? view;\n  int? discuss;\n  String? jumpUrl;\n  String? statDesc;\n  bool? showInteractData;\n\n  FavTopicItem({\n    this.id,\n    this.name,\n    this.view,\n    this.discuss,\n    this.jumpUrl,\n    this.statDesc,\n    this.showInteractData,\n  });\n\n  factory FavTopicItem.fromJson(Map<String, dynamic> json) => FavTopicItem(\n    id: json['id'] as int?,\n    name: json['name'] as String?,\n    view: json['view'] as int?,\n    discuss: json['discuss'] as int?,\n    jumpUrl: json['jump_url'] as String?,\n    statDesc: json['stat_desc'] as String?,\n    showInteractData: json['show_interact_data'] as bool?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/fav/fav_topic/topic_list.dart",
    "content": "import 'package:PiliPlus/models_new/fav/fav_topic/page_info.dart';\nimport 'package:PiliPlus/models_new/fav/fav_topic/topic_item.dart';\n\nclass TopicList {\n  List<FavTopicItem>? topicItems;\n  PageInfo? pageInfo;\n\n  TopicList({this.topicItems, this.pageInfo});\n\n  factory TopicList.fromJson(Map<String, dynamic> json) => TopicList(\n    topicItems: (json['topic_items'] as List<dynamic>?)\n        ?.map((e) => FavTopicItem.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    pageInfo: json['page_info'] == null\n        ? null\n        : PageInfo.fromJson(json['page_info'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/follow/data.dart",
    "content": "import 'package:PiliPlus/models_new/follow/list.dart';\n\nclass FollowData {\n  late List<FollowItemModel> list;\n  int? total;\n\n  FollowData({required this.list, this.total});\n\n  factory FollowData.fromJson(Map<String, dynamic> json) => FollowData(\n    list:\n        (json['list'] as List<dynamic>?)\n            ?.map((e) => FollowItemModel.fromJson(e as Map<String, dynamic>))\n            .toList() ??\n        <FollowItemModel>[],\n    total: json['total'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/follow/list.dart",
    "content": "import 'package:PiliPlus/models/dynamics/up.dart';\nimport 'package:PiliPlus/models/model_avatar.dart';\n\nclass FollowItemModel extends UpItem {\n  int? attribute;\n  int? mtime;\n  dynamic tag;\n  int? special;\n  String? sign;\n  BaseOfficialVerify? officialVerify;\n  Vip? vip;\n  String? followTime;\n\n  FollowItemModel({\n    required super.mid,\n    this.attribute,\n    this.mtime,\n    this.tag,\n    this.special,\n    super.uname,\n    super.face,\n    this.sign,\n    this.officialVerify,\n    this.vip,\n    this.followTime,\n  });\n\n  factory FollowItemModel.fromJson(Map<String, dynamic> json) =>\n      FollowItemModel(\n        mid: json['mid'] as int? ?? 0,\n        attribute: json['attribute'] as int?,\n        mtime: json['mtime'] as int?,\n        tag: json['tag'] as dynamic,\n        special: json['special'] as int?,\n        uname: json['uname'] as String?,\n        face: json['face'] as String?,\n        sign: json['sign'] as String?,\n        officialVerify: json['official_verify'] == null\n            ? null\n            : BaseOfficialVerify.fromJson(\n                json['official_verify'] as Map<String, dynamic>,\n              ),\n        vip: json['vip'] == null\n            ? null\n            : Vip.fromJson(json['vip'] as Map<String, dynamic>),\n        followTime: json['follow_time'] as String?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/followee_votes/vote.dart",
    "content": "import 'package:PiliPlus/models/model_owner.dart';\n\nclass FolloweeVote extends Owner {\n  String _name;\n  @override\n  String get name => _name;\n  String _face;\n  @override\n  String get face => _face;\n  List<int> votes;\n  int ctime;\n\n  FolloweeVote({\n    required super.mid,\n    required String name,\n    required String face,\n    required this.votes,\n    required this.ctime,\n  }) : _name = name,\n       _face = face;\n\n  factory FolloweeVote.fromJson(Map<String, dynamic> json) => FolloweeVote(\n    mid: json['uid'],\n    name: json['name'],\n    face: json['face'],\n    votes: List<int>.from(json['votes']),\n    ctime: json['ctime'],\n  );\n}\n"
  },
  {
    "path": "lib/models_new/history/cursor.dart",
    "content": "class Cursor {\n  int? max;\n  int? viewAt;\n  String? business;\n  int? ps;\n\n  Cursor({this.max, this.viewAt, this.business, this.ps});\n\n  factory Cursor.fromJson(Map<String, dynamic> json) => Cursor(\n    max: json['max'] as int?,\n    viewAt: json['view_at'] as int?,\n    business: json['business'] as String?,\n    ps: json['ps'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/history/data.dart",
    "content": "import 'package:PiliPlus/models_new/history/cursor.dart';\nimport 'package:PiliPlus/models_new/history/list.dart';\nimport 'package:PiliPlus/models_new/history/tab.dart';\n\nclass HistoryData {\n  Cursor? cursor;\n  List<HistoryTab>? tab;\n  List<HistoryItemModel>? list;\n\n  HistoryData({this.cursor, this.tab, this.list});\n\n  factory HistoryData.fromJson(Map<String, dynamic> json) => HistoryData(\n    cursor: json['cursor'] == null\n        ? null\n        : Cursor.fromJson(json['cursor'] as Map<String, dynamic>),\n    tab: (json['tab'] as List<dynamic>?)\n        ?.map((e) => HistoryTab.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    list: (json['list'] as List<dynamic>?)\n        ?.map((e) => HistoryItemModel.fromJson(e as Map<String, dynamic>))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/history/history.dart",
    "content": "class History {\n  int? oid;\n  int? epid;\n  String? bvid;\n  int? page;\n  int? cid;\n  String? part;\n  String? business;\n\n  History({\n    this.oid,\n    this.epid,\n    this.bvid,\n    this.page,\n    this.cid,\n    this.part,\n    this.business,\n  });\n\n  factory History.fromJson(Map<String, dynamic> json) => History(\n    oid: json['oid'],\n    epid: json['epid'],\n    bvid: json['bvid'],\n    page: json['page'],\n    cid: json['cid'] == 0 ? null : json['cid'],\n    part: json['part'],\n    business: json['business'],\n  );\n}\n"
  },
  {
    "path": "lib/models_new/history/list.dart",
    "content": "import 'package:PiliPlus/models_new/history/history.dart';\nimport 'package:PiliPlus/pages/common/multi_select/base.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\n\nclass HistoryItemModel with MultiSelectData {\n  String? title;\n  String? longTitle;\n  String? cover;\n  List<String>? covers;\n  String? uri;\n  late History history;\n  int? videos;\n  String? authorName;\n  String? authorFace;\n  int? authorMid;\n  int? viewAt;\n  int? progress;\n  String? badge;\n  String? showTitle;\n  int? duration;\n  String? current;\n  int? total;\n  String? newDesc;\n  int? isFinish;\n  int? isFav;\n  int? kid;\n  String? tagName;\n  int? liveStatus;\n\n  HistoryItemModel({\n    this.title,\n    this.longTitle,\n    this.cover,\n    this.covers,\n    this.uri,\n    required this.history,\n    this.videos,\n    this.authorName,\n    this.authorFace,\n    this.authorMid,\n    this.viewAt,\n    this.progress,\n    this.badge,\n    this.showTitle,\n    this.duration,\n    this.current,\n    this.total,\n    this.newDesc,\n    this.isFinish,\n    this.isFav,\n    this.kid,\n    this.tagName,\n    this.liveStatus,\n  });\n\n  factory HistoryItemModel.fromJson(Map<String, dynamic> json) =>\n      HistoryItemModel(\n        title: json['title'] as String?,\n        longTitle: json['long_title'] as String?,\n        cover: json['cover'] as String?,\n        covers: (json['covers'] as List?)?.fromCast(),\n        uri: json['uri'] as String?,\n        history: json['history'] == null\n            ? History()\n            : History.fromJson(json['history'] as Map<String, dynamic>),\n        videos: json['videos'] as int?,\n        authorName: json['author_name'] as String?,\n        authorFace: json['author_face'] as String?,\n        authorMid: json['author_mid'] as int?,\n        viewAt: json['view_at'] as int?,\n        progress: json['progress'] as int?,\n        badge: json['badge'] as String?,\n        showTitle: json['show_title'] as String?,\n        duration: json['duration'] as int?,\n        current: json['current'] as String?,\n        total: json['total'] as int?,\n        newDesc: json['new_desc'] as String?,\n        isFinish: json['is_finish'] as int?,\n        isFav: json['is_fav'] as int?,\n        kid: json['kid'] as int?,\n        tagName: json['tag_name'] as String?,\n        liveStatus: json['live_status'] as int?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/history/tab.dart",
    "content": "class HistoryTab {\n  String? type;\n  String? name;\n\n  HistoryTab({this.type, this.name});\n\n  factory HistoryTab.fromJson(Map<String, dynamic> json) => HistoryTab(\n    type: json['type'] as String?,\n    name: json['name'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/later/bangumi.dart",
    "content": "import 'package:PiliPlus/models_new/later/season.dart';\n\nclass Bangumi {\n  int? epId;\n  String? title;\n  String? longTitle;\n  String? cover;\n  Season? season;\n\n  Bangumi({\n    this.epId,\n    this.title,\n    this.longTitle,\n    this.cover,\n    this.season,\n  });\n\n  factory Bangumi.fromJson(Map<String, dynamic> json) => Bangumi(\n    epId: json['ep_id'] as int?,\n    title: json['title'] as String?,\n    longTitle: json['long_title'] as String?,\n    cover: json['cover'] as String?,\n    season: json['season'] == null\n        ? null\n        : Season.fromJson(json['season'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/later/data.dart",
    "content": "import 'package:PiliPlus/models_new/later/list.dart';\n\nclass LaterData {\n  int? count;\n  List<LaterItemModel>? list;\n\n  LaterData({this.count, this.list});\n\n  factory LaterData.fromJson(Map<String, dynamic> json) => LaterData(\n    count: json['count'] as int?,\n    list: (json['list'] as List<dynamic>?)\n        ?.map((e) => LaterItemModel.fromJson(e as Map<String, dynamic>))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/later/list.dart",
    "content": "import 'package:PiliPlus/models/model_owner.dart';\nimport 'package:PiliPlus/models_new/later/bangumi.dart';\nimport 'package:PiliPlus/models_new/later/page.dart';\nimport 'package:PiliPlus/models_new/later/rights.dart';\nimport 'package:PiliPlus/models_new/later/stat.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/dimension.dart';\nimport 'package:PiliPlus/pages/common/multi_select/base.dart';\n\nclass LaterItemModel with MultiSelectData {\n  int? aid;\n  int? videos;\n  String? pic;\n  String? title;\n  String? subtitle;\n  int? pubdate;\n  int? duration;\n  String? redirectUrl;\n  Rights? rights;\n  Owner? owner;\n  Stat? stat;\n  List<Page>? pages;\n  Bangumi? bangumi;\n  int? cid;\n  int? progress;\n  String? bvid;\n  bool? isPgc;\n  String? pgcLabel;\n  bool? isPugv;\n  int? seasonId;\n  bool? isCharging;\n  Dimension? dimension;\n\n  LaterItemModel({\n    this.aid,\n    this.videos,\n    this.pic,\n    this.title,\n    this.subtitle,\n    this.pubdate,\n    this.duration,\n    this.redirectUrl,\n    this.rights,\n    this.owner,\n    this.stat,\n    this.pages,\n    this.bangumi,\n    this.cid,\n    this.progress,\n    this.bvid,\n    this.isPgc,\n    this.pgcLabel,\n    this.isPugv,\n    this.seasonId,\n    this.isCharging,\n    this.dimension,\n  });\n\n  factory LaterItemModel.fromJson(Map<String, dynamic> json) => LaterItemModel(\n    aid: json['aid'] as int?,\n    videos: json['videos'] as int?,\n    pic: json['pic'] as String?,\n    title: json['title'] as String?,\n    pubdate: json['pubdate'] as int?,\n    duration: json['duration'] as int?,\n    redirectUrl: json['redirect_url'] as String?,\n    rights: json['rights'] == null\n        ? null\n        : Rights.fromJson(json['rights'] as Map<String, dynamic>),\n    owner: json['owner'] == null\n        ? null\n        : Owner.fromJson(json['owner'] as Map<String, dynamic>),\n    stat: json['stat'] == null\n        ? null\n        : Stat.fromJson(json['stat'] as Map<String, dynamic>),\n    pages: (json['pages'] as List<dynamic>?)\n        ?.map((e) => Page.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    bangumi: json['bangumi'] == null\n        ? null\n        : Bangumi.fromJson(json['bangumi'] as Map<String, dynamic>),\n    subtitle: json['bangumi'] == null\n        ? null\n        : (json['title'] as String).replaceFirst(\n            '${json['bangumi']['season']['title']} ',\n            '',\n          ),\n    cid: json['cid'] as int?,\n    progress: json['progress'] as int?,\n    bvid: json['bvid'] as String?,\n    isPgc: json['is_pgc'] as bool?,\n    pgcLabel: json['pgc_label'] == '' ? null : json['pgc_label'],\n    isPugv: json['is_pugv'] as bool?,\n    seasonId: json['season_id'] as int?,\n    isCharging: json['charging_pay']?['level'] != null,\n    dimension: json['dimension'] == null\n        ? null\n        : Dimension.fromJson(json['dimension'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/later/page.dart",
    "content": "class Page {\n  int? cid;\n  int? page;\n  int? duration;\n\n  Page({\n    this.cid,\n    this.page,\n    this.duration,\n  });\n\n  factory Page.fromJson(Map<String, dynamic> json) => Page(\n    cid: json['cid'] as int?,\n    page: json['page'] as int?,\n    duration: json['duration'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/later/rights.dart",
    "content": "class Rights {\n  int? isCooperation;\n\n  Rights({\n    this.isCooperation,\n  });\n\n  factory Rights.fromJson(Map<String, dynamic> json) => Rights(\n    isCooperation: json['is_cooperation'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/later/season.dart",
    "content": "class Season {\n  int? seasonId;\n  String? title;\n\n  Season({\n    this.seasonId,\n    this.title,\n  });\n\n  factory Season.fromJson(Map<String, dynamic> json) => Season(\n    seasonId: json['season_id'] as int?,\n    title: json['title'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/later/stat.dart",
    "content": "class Stat {\n  int? aid;\n  int? view;\n  int? danmaku;\n\n  Stat({\n    this.aid,\n    this.view,\n    this.danmaku,\n  });\n\n  factory Stat.fromJson(Map<String, dynamic> json) => Stat(\n    aid: json['aid'] as int?,\n    view: json['view'] as int?,\n    danmaku: json['danmaku'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_area_list/area_item.dart",
    "content": "import 'package:flutter/foundation.dart' show immutable;\n\n@immutable\nclass AreaItem {\n  final dynamic id;\n  final String? name;\n  final String? pic;\n  final dynamic parentId;\n  final String? parentName;\n\n  const AreaItem({\n    this.id,\n    this.name,\n    this.pic,\n    this.parentId,\n    this.parentName,\n  });\n\n  factory AreaItem.fromJson(Map<String, dynamic> json) => AreaItem(\n    id: json['id'],\n    name: json['name'] as String?,\n    pic: json['pic'] as String?,\n    parentId: json['parent_id'],\n    parentName: json['parent_name'] as String?,\n  );\n\n  @override\n  bool operator ==(Object other) {\n    if (identical(this, other)) {\n      return true;\n    }\n    if (other is AreaItem) {\n      return id == other.id && parentId == other.parentId;\n    }\n    return false;\n  }\n\n  @override\n  int get hashCode => Object.hash(id, parentId);\n}\n"
  },
  {
    "path": "lib/models_new/live/live_area_list/area_list.dart",
    "content": "import 'package:PiliPlus/models_new/live/live_area_list/area_item.dart';\n\nclass AreaList {\n  int? id;\n  String? name;\n  int? parentAreaType;\n  List<AreaItem>? areaList;\n\n  AreaList({this.id, this.name, this.parentAreaType, this.areaList});\n\n  factory AreaList.fromJson(Map<String, dynamic> json) => AreaList(\n    id: json['id'] as int?,\n    name: json['name'] ?? '',\n    parentAreaType: json['parent_area_type'] as int?,\n    areaList: (json['area_list'] as List<dynamic>?)\n        ?.map((e) => AreaItem.fromJson(e as Map<String, dynamic>))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_contribution_rank/data.dart",
    "content": "import 'package:PiliPlus/models_new/live/live_contribution_rank/item.dart';\n\nclass LiveContributionRankData {\n  List<LiveContributionRankItem>? item;\n\n  LiveContributionRankData({\n    this.item,\n  });\n\n  factory LiveContributionRankData.fromJson(Map<String, dynamic> json) =>\n      LiveContributionRankData(\n        item: (json['item'] as List<dynamic>?)\n            ?.map(\n              (e) =>\n                  LiveContributionRankItem.fromJson(e as Map<String, dynamic>),\n            )\n            .toList(),\n      );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_contribution_rank/item.dart",
    "content": "import 'package:PiliPlus/models_new/live/live_contribution_rank/medal_info.dart';\n\nclass LiveContributionRankItem {\n  int? uid;\n  String? name;\n  String? face;\n  int? rank;\n  int? score;\n  MedalInfo? medalInfo;\n\n  LiveContributionRankItem({\n    this.uid,\n    this.name,\n    this.face,\n    this.rank,\n    this.score,\n    this.medalInfo,\n  });\n\n  factory LiveContributionRankItem.fromJson(Map<String, dynamic> json) =>\n      LiveContributionRankItem(\n        uid: json['uid'] as int?,\n        name: json['name'] as String?,\n        face: json['face'] as String?,\n        rank: json['rank'] as int?,\n        score: json['score'] as int?,\n        medalInfo: json['medal_info'] == null\n            ? null\n            : MedalInfo.fromJson(json['medal_info'] as Map<String, dynamic>),\n      );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_contribution_rank/medal_info.dart",
    "content": "class MedalInfo {\n  String? medalName;\n  int? level;\n\n  MedalInfo({\n    this.medalName,\n    this.level,\n  });\n\n  factory MedalInfo.fromJson(Map<String, dynamic> json) => MedalInfo(\n    medalName: json['medal_name'] as String?,\n    level: json['level'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_danmaku/danmaku_msg.dart",
    "content": "import 'package:PiliPlus/models/model_owner.dart';\nimport 'package:PiliPlus/models_new/live/live_danmaku/live_emote.dart';\nimport 'package:PiliPlus/pages/danmaku/danmaku_model.dart';\n\nclass DanmakuMsg {\n  final String name;\n  final String text;\n  final Map<String, BaseEmote>? emots;\n  final BaseEmote? uemote;\n  final Owner? reply;\n  final LiveDanmaku extra;\n\n  const DanmakuMsg({\n    required this.name,\n    required this.text,\n    this.emots,\n    this.uemote,\n    this.reply,\n    required this.extra,\n  });\n\n  factory DanmakuMsg.fromPrefetch(Map<String, dynamic> obj) {\n    final user = obj['user'];\n    BaseEmote? uemote;\n    if ((obj['emoticon']?['emoticon_unique'] as String?)?.isNotEmpty == true) {\n      uemote = BaseEmote.fromJson(obj['emoticon']);\n    }\n    final checkInfo = obj['check_info'];\n    Owner? reply;\n    if (obj['reply'] case final Map map) {\n      final replyMid = map['reply_mid'];\n      if (replyMid != null && replyMid != 0) {\n        reply = Owner(\n          mid: replyMid,\n          name: map['reply_uname'],\n        );\n      }\n    }\n    return DanmakuMsg(\n      name: user['base']['name'],\n      text: obj['text'],\n      emots: (obj['emots'] as Map<String, dynamic>?)?.map(\n        (k, v) => MapEntry(k, BaseEmote.fromJson(v)),\n      ),\n      uemote: uemote,\n      reply: reply,\n      extra: LiveDanmaku(\n        id: obj['id_str'],\n        mid: user['uid'],\n        dmType: obj['dm_type'],\n        ts: checkInfo['ts'],\n        ct: checkInfo['ct'],\n      ),\n    );\n  }\n\n  Map<String, dynamic> toJson() => <String, dynamic>{\n    'name': name,\n    'text': text,\n    'emots': ?emots,\n    'uemote': ?uemote?.toJson(),\n    'reply': ?reply?.toJson(),\n    'extra': extra.toJson(),\n  };\n}\n"
  },
  {
    "path": "lib/models_new/live/live_danmaku/live_emote.dart",
    "content": "class BaseEmote {\n  late String url;\n  late String emoticonUnique;\n  late double width;\n  late double height;\n  late final isUpower = emoticonUnique.startsWith('upower_');\n\n  BaseEmote.fromJson(Map<String, dynamic> json) {\n    url = json['url'];\n    emoticonUnique = json['emoticon_unique'];\n    width = (json['width'] as num).toDouble();\n    height = (json['height'] as num?)?.toDouble() ?? width;\n  }\n\n  Map<String, dynamic> toJson() => <String, dynamic>{\n    'url': url,\n    'emoticon_unique': emoticonUnique,\n    'width': width,\n    'height': height,\n  };\n}\n\n// class Emote extends BaseEmote {\n//   late int count;\n//   late String descript;\n//   late String emoji;\n//   late int emoticonId;\n// }\n\n/*\n{\n  \"bulge_display\": 1,\n  \"emoticon_unique\": \"upower_[{{emote}}]\",\n  \"height\": {{height}},\n  \"in_player_area\": 1,\n  \"is_dynamic\": 0, // 0 or 1\n  \"url\": \"{{url}}\",\n  \"width\": {{width}}\n}\n\n{\n  \"bulge_display\": 1,\n  \"emoticon_unique\": \"room_{{room_id}}_{{int}}\",\n  \"height\": {{height}},\n  \"in_player_area\": 1,\n  \"is_dynamic\": 1,\n  \"url\": \"{{url}}\",\n  \"width\": {{width}}\n}\n\n*/\n// class Uemote extends BaseEmote {\n//   late int bulgeDisplay;\n//   late int inPlayerArea;\n//   late int isDynamic;\n// }\n"
  },
  {
    "path": "lib/models_new/live/live_dm_block/data.dart",
    "content": "import 'package:PiliPlus/models_new/live/live_dm_block/shield_info.dart';\n\nclass LiveDmBlockData {\n  ShieldInfo? shieldInfo;\n\n  LiveDmBlockData({\n    this.shieldInfo,\n  });\n\n  factory LiveDmBlockData.fromJson(Map<String, dynamic> json) =>\n      LiveDmBlockData(\n        shieldInfo: json['shield_info'] == null\n            ? null\n            : ShieldInfo.fromJson(json['shield_info'] as Map<String, dynamic>),\n      );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_dm_block/shield_info.dart",
    "content": "import 'package:PiliPlus/models_new/live/live_dm_block/shield_rules.dart';\nimport 'package:PiliPlus/models_new/live/live_dm_block/shield_user_list.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\n\nclass ShieldInfo {\n  List<ShieldUserList>? shieldUserList;\n  List<String>? keywordList;\n  ShieldRules? shieldRules;\n\n  ShieldInfo({\n    this.shieldUserList,\n    this.keywordList,\n    this.shieldRules,\n  });\n\n  factory ShieldInfo.fromJson(Map<String, dynamic> json) => ShieldInfo(\n    shieldUserList: (json['shield_user_list'] as List<dynamic>?)\n        ?.map((e) => ShieldUserList.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    keywordList: (json['keyword_list'] as List?)?.fromCast(),\n    shieldRules: json['shield_rules'] == null\n        ? null\n        : ShieldRules.fromJson(json['shield_rules'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_dm_block/shield_rules.dart",
    "content": "class ShieldRules {\n  int rank;\n  int verify;\n  int level;\n\n  ShieldRules({this.rank = 0, this.verify = 0, this.level = 0});\n\n  factory ShieldRules.fromJson(Map<String, dynamic> json) => ShieldRules(\n    rank: json['rank'] as int? ?? 0,\n    verify: json['verify'] as int? ?? 0,\n    level: json['level'] as int? ?? 0,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_dm_block/shield_user_list.dart",
    "content": "class ShieldUserList {\n  int? uid;\n  String? uname;\n\n  ShieldUserList({this.uid, this.uname});\n\n  factory ShieldUserList.fromJson(Map<String, dynamic> json) {\n    return ShieldUserList(\n      uid: json['uid'] as int?,\n      uname: json['uname'] as String?,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/models_new/live/live_dm_info/data.dart",
    "content": "import 'package:PiliPlus/models_new/live/live_dm_info/host_list.dart';\n\nclass LiveDmInfoData {\n  String? token;\n  List<HostList>? hostList;\n\n  LiveDmInfoData({\n    this.token,\n    this.hostList,\n  });\n\n  factory LiveDmInfoData.fromJson(Map<String, dynamic> json) => LiveDmInfoData(\n    token: json['token'] as String?,\n    hostList: (json['host_list'] as List<dynamic>?)\n        ?.map((e) => HostList.fromJson(e as Map<String, dynamic>))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_dm_info/host_list.dart",
    "content": "class HostList {\n  String? host;\n  int? port;\n  int? wssPort;\n  int? wsPort;\n\n  HostList({this.host, this.port, this.wssPort, this.wsPort});\n\n  factory HostList.fromJson(Map<String, dynamic> json) => HostList(\n    host: json['host'] as String?,\n    port: json['port'] as int?,\n    wssPort: json['wss_port'] as int?,\n    wsPort: json['ws_port'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_emote/data.dart",
    "content": "import 'package:PiliPlus/models_new/live/live_emote/datum.dart';\n\nclass LiveEmoteData {\n  List<LiveEmoteDatum>? data;\n\n  LiveEmoteData({this.data});\n\n  factory LiveEmoteData.fromJson(Map<String, dynamic> json) => LiveEmoteData(\n    data: (json['data'] as List<dynamic>?)\n        ?.map((e) => LiveEmoteDatum.fromJson(e as Map<String, dynamic>))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_emote/datum.dart",
    "content": "import 'package:PiliPlus/models_new/live/live_emote/emoticon.dart';\n\nclass LiveEmoteDatum {\n  List<Emoticon>? emoticons;\n  int? pkgType;\n  String? currentCover;\n\n  LiveEmoteDatum({\n    this.emoticons,\n    this.pkgType,\n    this.currentCover,\n  });\n\n  factory LiveEmoteDatum.fromJson(Map<String, dynamic> json) => LiveEmoteDatum(\n    emoticons: (json['emoticons'] as List<dynamic>?)\n        ?.map((e) => Emoticon.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    pkgType: json['pkg_type'] as int?,\n    currentCover: json['current_cover'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_emote/emoticon.dart",
    "content": "class Emoticon {\n  String? emoji;\n  String? url;\n  int? width;\n  int? height;\n  String? emoticonUnique;\n\n  Emoticon({\n    this.emoji,\n    this.url,\n    this.width,\n    this.height,\n    this.emoticonUnique,\n  });\n\n  factory Emoticon.fromJson(Map<String, dynamic> json) => Emoticon(\n    emoji: json['emoji'] as String?,\n    url: json['url'] as String?,\n    width: json['width'] as int?,\n    height: json['height'] as int?,\n    emoticonUnique: json['emoticon_unique'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_feed_index/card_data.dart",
    "content": "import 'package:PiliPlus/models_new/live/live_feed_index/card_data_item.dart';\nimport 'package:PiliPlus/models_new/live/live_feed_index/card_data_list_item.dart';\n\nclass CardData {\n  CardDataItem? bannerV2;\n  CardDataItem? myIdolV1;\n  CardDataItem? areaEntranceV3;\n  CardLiveItem? smallCardV1;\n\n  CardData({\n    this.bannerV2,\n    this.myIdolV1,\n    this.areaEntranceV3,\n    this.smallCardV1,\n  });\n\n  factory CardData.fromJson(Map<String, dynamic> json) => CardData(\n    bannerV2: json['banner_v2'] == null\n        ? null\n        : CardDataItem.fromJson(json['banner_v2'] as Map<String, dynamic>),\n    myIdolV1: json['my_idol_v1'] == null\n        ? null\n        : CardDataItem.fromJson(json['my_idol_v1'] as Map<String, dynamic>),\n    areaEntranceV3: json['area_entrance_v3'] == null\n        ? null\n        : CardDataItem.fromJson(\n            json['area_entrance_v3'] as Map<String, dynamic>,\n          ),\n    smallCardV1: json['small_card_v1'] == null\n        ? null\n        : CardLiveItem.fromJson(json['small_card_v1'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_feed_index/card_data_item.dart",
    "content": "import 'package:PiliPlus/models_new/live/live_feed_index/card_data_list_item.dart';\n\nclass CardDataItem {\n  List<CardLiveItem>? list;\n  ExtraInfo? extraInfo;\n\n  CardDataItem({\n    this.list,\n    this.extraInfo,\n  });\n\n  factory CardDataItem.fromJson(Map<String, dynamic> json) => CardDataItem(\n    list: (json['list'] as List<dynamic>?)\n        ?.map((e) => CardLiveItem.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    extraInfo: json['extra_info'] == null\n        ? null\n        : ExtraInfo.fromJson(json['extra_info'] as Map<String, dynamic>),\n  );\n}\n\nclass ExtraInfo {\n  int? totalCount;\n\n  ExtraInfo.fromJson(Map<String, dynamic> json) {\n    totalCount = json['total_count'];\n  }\n}\n"
  },
  {
    "path": "lib/models_new/live/live_feed_index/card_data_list_item.dart",
    "content": "import 'package:PiliPlus/models_new/live/live_feed_index/watched_show.dart';\nimport 'package:PiliPlus/utils/parse_string.dart';\n\nclass CardLiveItem {\n  int? roomid;\n  int? uid;\n  String? uname;\n  String? face;\n  String? cover;\n  String? _systemCover;\n  String? get systemCover => _systemCover ?? cover;\n  String? title;\n  int? liveTime;\n  String? areaName;\n  int? areaV2Id;\n  String? areaV2Name;\n  String? areaV2ParentName;\n  int? areaV2ParentId;\n  WatchedShow? watchedShow;\n\n  CardLiveItem({\n    this.roomid,\n    this.uid,\n    this.uname,\n    this.face,\n    this.cover,\n    String? systemCover,\n    this.title,\n    this.liveTime,\n    this.areaName,\n    this.areaV2Id,\n    this.areaV2Name,\n    this.areaV2ParentName,\n    this.areaV2ParentId,\n    this.watchedShow,\n  }) : _systemCover = noneNullOrEmptyString(systemCover);\n\n  factory CardLiveItem.fromJson(Map<String, dynamic> json) => CardLiveItem(\n    roomid: json['roomid'] ?? json['id'],\n    uid: json['uid'] as int?,\n    uname: json['uname'] as String?,\n    face: json['face'] as String?,\n    cover: json['cover'] as String?,\n    systemCover: json['system_cover'],\n    title: json['title'] as String?,\n    liveTime: json['live_time'] as int?,\n    areaName: json['area_name'] as String?,\n    areaV2Id: json['area_v2_id'] as int?,\n    areaV2Name: json['area_v2_name'] as String?,\n    areaV2ParentName: json['area_v2_parent_name'] as String?,\n    areaV2ParentId: json['area_v2_parent_id'] as int?,\n    watchedShow: json['watched_show'] == null\n        ? null\n        : WatchedShow.fromJson(json['watched_show'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_feed_index/card_list.dart",
    "content": "import 'package:PiliPlus/models_new/live/live_feed_index/card_data.dart';\n\nclass LiveCardList {\n  String? cardType;\n  CardData? cardData;\n\n  LiveCardList({this.cardType, this.cardData});\n\n  factory LiveCardList.fromJson(Map<String, dynamic> json) => LiveCardList(\n    cardType: json['card_type'] as String?,\n    cardData: json['card_data'] == null\n        ? null\n        : CardData.fromJson(json['card_data'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_feed_index/data.dart",
    "content": "import 'package:PiliPlus/models_new/live/live_feed_index/card_list.dart';\n\nclass LiveIndexData {\n  List<LiveCardList>? cardList;\n  int? hasMore;\n  LiveCardList? followItem;\n  LiveCardList? areaItem;\n\n  LiveIndexData({\n    this.cardList,\n    this.hasMore,\n  });\n\n  LiveIndexData.fromJson(Map<String, dynamic> json) {\n    if ((json['card_list'] as List<dynamic>?)?.isNotEmpty == true) {\n      // banner_v2\n      // my_idol_v1\n      // area_entrance_v3\n      // small_card_v1\n      for (final json in json['card_list']) {\n        switch (json['card_type']) {\n          case 'my_idol_v1':\n            followItem = LiveCardList.fromJson(json);\n            break;\n          case 'area_entrance_v3':\n            areaItem = LiveCardList.fromJson(json);\n            break;\n          case 'small_card_v1':\n            (cardList ??= <LiveCardList>[]).add(LiveCardList.fromJson(json));\n            break;\n        }\n      }\n    }\n    hasMore = json['has_more'] as int?;\n  }\n}\n"
  },
  {
    "path": "lib/models_new/live/live_feed_index/watched_show.dart",
    "content": "class WatchedShow {\n  String? textLarge;\n\n  WatchedShow({\n    this.textLarge,\n  });\n\n  factory WatchedShow.fromJson(Map<String, dynamic> json) => WatchedShow(\n    textLarge: json['text_large'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_follow/data.dart",
    "content": "import 'package:PiliPlus/models_new/live/live_follow/item.dart';\n\nclass LiveFollowData {\n  String? title;\n  int? pageSize;\n  int? totalPage;\n  List<LiveFollowItem>? list;\n  int? count;\n  int? liveCount;\n\n  LiveFollowData({\n    this.title,\n    this.pageSize,\n    this.totalPage,\n    this.list,\n    this.count,\n    this.liveCount,\n  });\n\n  LiveFollowData.fromJson(Map<String, dynamic> json) {\n    title = json['title'] as String?;\n    pageSize = json['pageSize'] as int?;\n    totalPage = json['totalPage'] as int?;\n    list = (json['list'] as List<dynamic>?)\n        ?.cast<Map<String, dynamic>>()\n        .where((i) => i['live_status'] == 1)\n        .map(LiveFollowItem.fromJson)\n        .toList();\n    count = json['count'] as int?;\n    liveCount = json['live_count'] as int?;\n  }\n}\n"
  },
  {
    "path": "lib/models_new/live/live_follow/item.dart",
    "content": "class LiveFollowItem {\n  int? roomid;\n  int? uid;\n  String? uname;\n  String? title;\n  String? face;\n  int? liveStatus;\n  String? areaName;\n  String? areaNameV2;\n  String? textSmall;\n  String? roomCover;\n\n  LiveFollowItem({\n    this.roomid,\n    this.uid,\n    this.uname,\n    this.title,\n    this.face,\n    this.liveStatus,\n    this.areaName,\n    this.areaNameV2,\n    this.textSmall,\n    this.roomCover,\n  });\n\n  factory LiveFollowItem.fromJson(Map<String, dynamic> json) => LiveFollowItem(\n    roomid: json['roomid'] as int?,\n    uid: json['uid'] as int?,\n    uname: json['uname'] as String?,\n    title: json['title'] as String?,\n    face: json['face'] as String?,\n    liveStatus: json['live_status'] as int?,\n    areaName: json['area_name'] as String?,\n    areaNameV2: json['area_name_v2'] as String?,\n    textSmall: json['text_small'] as String?,\n    roomCover: json['room_cover'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_room_info_h5/anchor_info.dart",
    "content": "import 'package:PiliPlus/models_new/live/live_room_info_h5/base_info.dart';\n\nclass AnchorInfo {\n  BaseInfo? baseInfo;\n\n  AnchorInfo({this.baseInfo});\n\n  factory AnchorInfo.fromJson(Map<String, dynamic> json) => AnchorInfo(\n    baseInfo: json['base_info'] == null\n        ? null\n        : BaseInfo.fromJson(json['base_info'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_room_info_h5/base_info.dart",
    "content": "class BaseInfo {\n  String? uname;\n  String? face;\n\n  BaseInfo({this.uname, this.face});\n\n  factory BaseInfo.fromJson(Map<String, dynamic> json) => BaseInfo(\n    uname: json['uname'] as String?,\n    face: json['face'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_room_info_h5/data.dart",
    "content": "import 'package:PiliPlus/models_new/live/live_feed_index/watched_show.dart';\nimport 'package:PiliPlus/models_new/live/live_room_info_h5/anchor_info.dart';\nimport 'package:PiliPlus/models_new/live/live_room_info_h5/room_info.dart';\n\nclass RoomInfoH5Data {\n  RoomInfo? roomInfo;\n  AnchorInfo? anchorInfo;\n  WatchedShow? watchedShow;\n\n  RoomInfoH5Data({\n    this.roomInfo,\n    this.anchorInfo,\n    this.watchedShow,\n  });\n\n  factory RoomInfoH5Data.fromJson(Map<String, dynamic> json) => RoomInfoH5Data(\n    roomInfo: json['room_info'] == null\n        ? null\n        : RoomInfo.fromJson(json['room_info'] as Map<String, dynamic>),\n    anchorInfo: json['anchor_info'] == null\n        ? null\n        : AnchorInfo.fromJson(json['anchor_info'] as Map<String, dynamic>),\n    watchedShow: json['watched_show'] == null\n        ? null\n        : WatchedShow.fromJson(json['watched_show'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_room_info_h5/room_info.dart",
    "content": "class RoomInfo {\n  int? uid;\n  int? roomId;\n  String? title;\n  String? cover;\n  int? liveStatus;\n  int? liveStartTime;\n  int? online;\n  String? appBackground;\n  String? subSessionKey;\n\n  RoomInfo({\n    this.uid,\n    this.roomId,\n    this.title,\n    this.cover,\n    this.liveStatus,\n    this.liveStartTime,\n    this.online,\n    this.appBackground,\n    this.subSessionKey,\n  });\n\n  factory RoomInfo.fromJson(Map<String, dynamic> json) => RoomInfo(\n    uid: json['uid'] as int?,\n    roomId: json['room_id'] as int?,\n    title: json['title'] as String?,\n    cover: json['cover'] as String?,\n    liveStatus: json['live_status'] as int?,\n    liveStartTime: json['live_start_time'] as int?,\n    online: json['online'] as int?,\n    appBackground: json['app_background'] as String?,\n    subSessionKey: json['sub_session_key'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_room_play_info/codec.dart",
    "content": "import 'package:PiliPlus/models_new/live/live_room_play_info/url_info.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\n\nclass CodecItem {\n  String? codecName;\n  int? currentQn;\n  List<int>? acceptQn;\n  String? baseUrl;\n  List<UrlInfo>? urlInfo;\n  dynamic hdrQn;\n  int? dolbyType;\n  String? attrName;\n  int? hdrType;\n\n  CodecItem({\n    this.codecName,\n    this.currentQn,\n    this.acceptQn,\n    this.baseUrl,\n    this.urlInfo,\n    this.hdrQn,\n    this.dolbyType,\n    this.attrName,\n    this.hdrType,\n  });\n\n  factory CodecItem.fromJson(Map<String, dynamic> json) => CodecItem(\n    codecName: json['codec_name'] as String?,\n    currentQn: json['current_qn'] as int?,\n    acceptQn: (json['accept_qn'] as List?)?.fromCast(),\n    baseUrl: json['base_url'] as String?,\n    urlInfo: (json['url_info'] as List<dynamic>?)\n        ?.map((e) => UrlInfo.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    hdrQn: json['hdr_qn'] as dynamic,\n    dolbyType: json['dolby_type'] as int?,\n    attrName: json['attr_name'] as String?,\n    hdrType: json['hdr_type'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_room_play_info/data.dart",
    "content": "import 'package:PiliPlus/models_new/live/live_room_play_info/playurl_info.dart';\n\nclass RoomPlayInfoData {\n  int? roomId;\n  int? shortId;\n  int? uid;\n  bool? isPortrait;\n  int? liveStatus;\n  int? liveTime;\n  PlayurlInfo? playurlInfo;\n\n  RoomPlayInfoData({\n    this.roomId,\n    this.shortId,\n    this.uid,\n    this.isPortrait,\n    this.liveStatus,\n    this.liveTime,\n    this.playurlInfo,\n  });\n\n  factory RoomPlayInfoData.fromJson(Map<String, dynamic> json) =>\n      RoomPlayInfoData(\n        roomId: json['room_id'] as int?,\n        shortId: json['short_id'] as int?,\n        uid: json['uid'] as int?,\n        isPortrait: json['is_portrait'] as bool?,\n        liveStatus: json['live_status'] as int?,\n        liveTime: json['live_time'] as int?,\n        playurlInfo: json['playurl_info'] == null\n            ? null\n            : PlayurlInfo.fromJson(\n                json['playurl_info'] as Map<String, dynamic>,\n              ),\n      );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_room_play_info/format.dart",
    "content": "import 'package:PiliPlus/models_new/live/live_room_play_info/codec.dart';\n\nclass Format {\n  String? formatName;\n  List<CodecItem>? codec;\n  String? masterUrl;\n\n  Format({this.formatName, this.codec, this.masterUrl});\n\n  factory Format.fromJson(Map<String, dynamic> json) => Format(\n    formatName: json['format_name'] as String?,\n    codec: (json['codec'] as List<dynamic>?)\n        ?.map((e) => CodecItem.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    masterUrl: json['master_url'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_room_play_info/playurl.dart",
    "content": "import 'package:PiliPlus/models_new/live/live_room_play_info/stream.dart';\n\nclass Playurl {\n  int? cid;\n  List<Stream>? stream;\n\n  Playurl({\n    this.cid,\n    this.stream,\n  });\n\n  factory Playurl.fromJson(Map<String, dynamic> json) => Playurl(\n    cid: json['cid'] as int?,\n    stream: (json['stream'] as List<dynamic>?)\n        ?.map((e) => Stream.fromJson(e as Map<String, dynamic>))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_room_play_info/playurl_info.dart",
    "content": "import 'package:PiliPlus/models_new/live/live_room_play_info/playurl.dart';\n\nclass PlayurlInfo {\n  Playurl? playurl;\n\n  PlayurlInfo({\n    this.playurl,\n  });\n\n  factory PlayurlInfo.fromJson(Map<String, dynamic> json) => PlayurlInfo(\n    playurl: json['playurl'] == null\n        ? null\n        : Playurl.fromJson(json['playurl'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_room_play_info/stream.dart",
    "content": "import 'package:PiliPlus/models_new/live/live_room_play_info/format.dart';\n\nclass Stream {\n  String? protocolName;\n  List<Format>? format;\n\n  Stream({this.protocolName, this.format});\n\n  factory Stream.fromJson(Map<String, dynamic> json) => Stream(\n    protocolName: json['protocol_name'] as String?,\n    format: (json['format'] as List<dynamic>?)\n        ?.map((e) => Format.fromJson(e as Map<String, dynamic>))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_room_play_info/url_info.dart",
    "content": "class UrlInfo {\n  String? host;\n  String? extra;\n  int? streamTtl;\n\n  UrlInfo({this.host, this.extra, this.streamTtl});\n\n  factory UrlInfo.fromJson(Map<String, dynamic> json) => UrlInfo(\n    host: json['host'] as String?,\n    extra: json['extra'] as String?,\n    streamTtl: json['stream_ttl'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_search/data.dart",
    "content": "import 'package:PiliPlus/models_new/live/live_search/room.dart';\nimport 'package:PiliPlus/models_new/live/live_search/user.dart';\n\nclass LiveSearchData {\n  String? type;\n  int? page;\n  int? pagesize;\n  Room? room;\n  User? user;\n\n  LiveSearchData({\n    this.type,\n    this.page,\n    this.pagesize,\n    this.room,\n    this.user,\n  });\n\n  factory LiveSearchData.fromJson(Map<String, dynamic> json) => LiveSearchData(\n    type: json['type'] as String?,\n    page: json['page'] as int?,\n    pagesize: json['pagesize'] as int?,\n    room: json['room'] == null\n        ? null\n        : Room.fromJson(json['room'] as Map<String, dynamic>),\n    user: json['user'] == null\n        ? null\n        : User.fromJson(json['user'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_search/live_search.dart",
    "content": "import 'package:PiliPlus/models_new/live/live_search/data.dart';\n\nclass LiveSearch {\n  int? code;\n  String? message;\n  int? ttl;\n  LiveSearchData? data;\n\n  LiveSearch({this.code, this.message, this.ttl, this.data});\n\n  factory LiveSearch.fromJson(Map<String, dynamic> json) => LiveSearch(\n    code: json['code'] as int?,\n    message: json['message'] as String?,\n    ttl: json['ttl'] as int?,\n    data: json['data'] == null\n        ? null\n        : LiveSearchData.fromJson(json['data'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_search/room.dart",
    "content": "import 'package:PiliPlus/models_new/live/live_search/room_item.dart';\n\nclass Room {\n  List<LiveSearchRoomItemModel>? list;\n  int? totalRoom;\n  int? totalPage;\n\n  Room({this.list, this.totalRoom, this.totalPage});\n\n  factory Room.fromJson(Map<String, dynamic> json) => Room(\n    list: (json['list'] as List<dynamic>?)\n        ?.map(\n          (e) => LiveSearchRoomItemModel.fromJson(e as Map<String, dynamic>),\n        )\n        .toList(),\n    totalRoom: json['total_room'] as int?,\n    totalPage: json['total_page'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_search/room_item.dart",
    "content": "import 'package:PiliPlus/models_new/live/live_feed_index/watched_show.dart';\n\nclass LiveSearchRoomItemModel {\n  int? roomid;\n  String? cover;\n  String? title;\n  String? name;\n  String? face;\n  WatchedShow? watchedShow;\n\n  LiveSearchRoomItemModel({\n    this.roomid,\n    this.cover,\n    this.title,\n    this.name,\n    this.face,\n    this.watchedShow,\n  });\n\n  factory LiveSearchRoomItemModel.fromJson(Map<String, dynamic> json) =>\n      LiveSearchRoomItemModel(\n        roomid: json['roomid'] as int?,\n        cover: json['cover'] as String?,\n        title: json['title'] as String?,\n        name: json['name'] as String?,\n        face: json['face'] as String?,\n        watchedShow: json['watched_show'] == null\n            ? null\n            : WatchedShow.fromJson(\n                json['watched_show'] as Map<String, dynamic>,\n              ),\n      );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_search/user.dart",
    "content": "import 'package:PiliPlus/models_new/live/live_search/user_item.dart';\n\nclass User {\n  List<LiveSearchUserItemModel>? list;\n  int? totalUser;\n  int? totalPage;\n\n  User({this.list, this.totalUser, this.totalPage});\n\n  factory User.fromJson(Map<String, dynamic> json) => User(\n    list: (json['list'] as List<dynamic>?)\n        ?.map((e) => LiveSearchUserItemModel.fromJson(e))\n        .toList(),\n    totalUser: json['total_user'] as int?,\n    totalPage: json['total_page'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_search/user_item.dart",
    "content": "class LiveSearchUserItemModel {\n  String? face;\n  String? name;\n  int? liveStatus;\n  String? areaName;\n  int? fansNum;\n  int? roomid;\n\n  LiveSearchUserItemModel({\n    this.face,\n    this.name,\n    this.liveStatus,\n    this.areaName,\n    this.fansNum,\n    this.roomid,\n  });\n\n  factory LiveSearchUserItemModel.fromJson(Map<String, dynamic> json) =>\n      LiveSearchUserItemModel(\n        face: json['face'] as String?,\n        name: json['name'] as String?,\n        liveStatus: json['live_status'] as int?,\n        areaName: json['areaName'] as String?,\n        fansNum: json['fansNum'] as int?,\n        roomid: json['roomid'] as int?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_second_list/data.dart",
    "content": "import 'package:PiliPlus/models_new/live/live_feed_index/card_data_list_item.dart';\nimport 'package:PiliPlus/models_new/live/live_second_list/tag.dart';\n\nclass LiveSecondData {\n  int? count;\n  List<CardLiveItem>? cardList;\n  List<LiveSecondTag>? newTags;\n\n  LiveSecondData({\n    this.count,\n    this.cardList,\n    this.newTags,\n  });\n\n  factory LiveSecondData.fromJson(Map<String, dynamic> json) => LiveSecondData(\n    count: json['count'] as int?,\n    cardList: (json['list'] as List<dynamic>?)\n        ?.map((e) => CardLiveItem.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    newTags: (json['new_tags'] as List<dynamic>?)\n        ?.map((e) => LiveSecondTag.fromJson(e as Map<String, dynamic>))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_second_list/tag.dart",
    "content": "class LiveSecondTag {\n  int? id;\n  String? name;\n  String? sortType;\n\n  LiveSecondTag({\n    this.id,\n    this.name,\n    this.sortType,\n  });\n\n  factory LiveSecondTag.fromJson(Map json) => LiveSecondTag(\n    id: json['id'],\n    name: json['name'],\n    sortType: json['sort_type'],\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_superchat/data.dart",
    "content": "import 'package:PiliPlus/models_new/live/live_superchat/item.dart';\n\nclass SuperChatData {\n  List<SuperChatItem>? list;\n\n  SuperChatData({this.list});\n\n  factory SuperChatData.fromJson(Map<String, dynamic> json) => SuperChatData(\n    list: (json['list'] as List<dynamic>?)\n        ?.map((e) => SuperChatItem.fromJson(e as Map<String, dynamic>))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/live/live_superchat/item.dart",
    "content": "import 'package:PiliPlus/models_new/live/live_superchat/user_info.dart';\nimport 'package:PiliPlus/utils/utils.dart';\n\nclass SuperChatItem {\n  int id;\n  int uid;\n  int price;\n  String backgroundColor;\n  String backgroundBottomColor;\n  String backgroundPriceColor;\n  String messageFontColor;\n  int endTime;\n  String message;\n  String token;\n  int ts;\n  UserInfo userInfo;\n  late bool expired = false;\n  late bool deleted = false;\n\n  SuperChatItem({\n    required this.id,\n    required this.uid,\n    required this.price,\n    required this.backgroundColor,\n    required this.backgroundBottomColor,\n    required this.backgroundPriceColor,\n    required this.messageFontColor,\n    required this.endTime,\n    required this.message,\n    required this.token,\n    required this.ts,\n    required this.userInfo,\n  });\n\n  static SuperChatItem get random => SuperChatItem.fromJson({\n    \"id\": Utils.random.nextInt(2147483647),\n    \"uid\": 0,\n    \"price\": 66,\n    \"end_time\": DateTime.now().millisecondsSinceEpoch ~/ 1000 + 5,\n    \"message\": Utils.generateRandomString(55),\n    \"user_info\": {\n      \"face\": \"\",\n      \"uname\": \"UNAME\",\n    },\n    'token': '',\n    'ts': 0,\n  });\n\n  factory SuperChatItem.fromJson(Map<String, dynamic> json) => SuperChatItem(\n    id: Utils.safeToInt(json['id']) ?? Utils.random.nextInt(2147483647),\n    uid: Utils.safeToInt(json['uid'])!,\n    price: json['price'],\n    backgroundColor: json['background_color'] ?? '#EDF5FF',\n    backgroundBottomColor: json['background_bottom_color'] ?? '#2A60B2',\n    backgroundPriceColor: json['background_price_color'] ?? '#7497CD',\n    messageFontColor: json['message_font_color'] ?? '#FFFFFF',\n    endTime: Utils.safeToInt(json['end_time'])!,\n    message: json['message'],\n    token: json['token'],\n    ts: Utils.safeToInt(json['ts'])!,\n    userInfo: UserInfo.fromJson(json['user_info'] as Map<String, dynamic>),\n  );\n\n  SuperChatItem copyWith({\n    int? id,\n    int? uid,\n    int? price,\n    String? backgroundColor,\n    String? backgroundBottomColor,\n    String? backgroundPriceColor,\n    String? messageFontColor,\n    int? endTime,\n    String? message,\n    String? token,\n    int? ts,\n    UserInfo? userInfo,\n    bool? expired,\n  }) {\n    return SuperChatItem(\n      id: id ?? this.id,\n      uid: uid ?? this.uid,\n      price: price ?? this.price,\n      backgroundColor: backgroundColor ?? this.backgroundColor,\n      backgroundBottomColor:\n          backgroundBottomColor ?? this.backgroundBottomColor,\n      backgroundPriceColor: backgroundPriceColor ?? this.backgroundPriceColor,\n      messageFontColor: messageFontColor ?? this.messageFontColor,\n      endTime: endTime ?? this.endTime,\n      message: message ?? this.message,\n      token: token ?? this.token,\n      ts: ts ?? this.ts,\n      userInfo: userInfo ?? this.userInfo,\n    );\n  }\n\n  Map<String, dynamic> toJson() => <String, dynamic>{\n    'id': id,\n    'uid': uid,\n    'price': price,\n    'background_color': backgroundColor,\n    'background_bottom_color': backgroundBottomColor,\n    'background_price_color': backgroundPriceColor,\n    'message_font_color': messageFontColor,\n    'end_time': endTime,\n    'message': message,\n    'token': token,\n    'ts': ts,\n    'user_info': userInfo.toJson(),\n  };\n}\n"
  },
  {
    "path": "lib/models_new/live/live_superchat/user_info.dart",
    "content": "class UserInfo {\n  String face;\n  String uname;\n  String nameColor;\n\n  UserInfo({\n    required this.face,\n    required this.uname,\n    required this.nameColor,\n  });\n\n  factory UserInfo.fromJson(Map<String, dynamic> json) => UserInfo(\n    face: json['face'],\n    uname: json['uname'],\n    nameColor: json['name_color'] ?? '#666666',\n  );\n\n  Map<String, dynamic> toJson() => <String, dynamic>{\n    'face': face,\n    'uname': uname,\n    'name_color': nameColor,\n  };\n}\n"
  },
  {
    "path": "lib/models_new/login_devices/data.dart",
    "content": "import 'package:PiliPlus/models_new/login_devices/device.dart';\n\nclass LoginDevicesData {\n  List<LoginDevice>? devices;\n\n  LoginDevicesData({this.devices});\n\n  factory LoginDevicesData.fromJson(Map<String, dynamic> json) =>\n      LoginDevicesData(\n        devices: (json['devices'] as List<dynamic>?)\n            ?.map((e) => LoginDevice.fromJson(e as Map<String, dynamic>))\n            .toList(),\n      );\n}\n"
  },
  {
    "path": "lib/models_new/login_devices/device.dart",
    "content": "class LoginDevice {\n  int? mid;\n  String? localId;\n  String? deviceName;\n  String? devicePlatform;\n  bool? isCurrentDevice;\n  String? latestLoginAt;\n  String? source;\n  int? origin;\n\n  LoginDevice({\n    this.mid,\n    this.localId,\n    this.deviceName,\n    this.devicePlatform,\n    this.isCurrentDevice,\n    this.latestLoginAt,\n    this.source,\n    this.origin,\n  });\n\n  factory LoginDevice.fromJson(Map<String, dynamic> json) => LoginDevice(\n    mid: json['mid'] as int?,\n    localId: json['local_id'] as String?,\n    deviceName: json['device_name'] as String?,\n    devicePlatform: json['device_platform'] as String?,\n    isCurrentDevice: json['is_current_device'] as bool?,\n    latestLoginAt: json['latest_login_at'] as String?,\n    source: json['source'] as String?,\n    origin: json['origin'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/login_log/data.dart",
    "content": "import 'package:PiliPlus/models_new/login_log/list.dart';\n\nclass LoginLogData {\n  int? count;\n  List<LoginLogItem>? list;\n\n  LoginLogData({this.count, this.list});\n\n  factory LoginLogData.fromJson(Map<String, dynamic> json) => LoginLogData(\n    count: json['count'] as int?,\n    list: (json['list'] as List<dynamic>?)\n        ?.map((e) => LoginLogItem.fromJson(e as Map<String, dynamic>))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/login_log/list.dart",
    "content": "class LoginLogItem {\n  final String ip;\n  final int? time;\n  final String timeAt;\n  final bool? status;\n  final int? type;\n  final String geo;\n\n  const LoginLogItem({\n    required this.ip,\n    this.time,\n    required this.timeAt,\n    this.status,\n    this.type,\n    required this.geo,\n  });\n\n  factory LoginLogItem.fromJson(Map<String, dynamic> json) => LoginLogItem(\n    ip: json['ip'] ?? '',\n    time: json['time'] as int?,\n    timeAt: json['time_at'] ?? '',\n    status: json['status'] as bool?,\n    type: json['type'] as int?,\n    geo: json['geo'] ?? '',\n  );\n}\n"
  },
  {
    "path": "lib/models_new/match/match_info/contest.dart",
    "content": "import 'package:PiliPlus/models_new/match/match_info/home_away.dart';\nimport 'package:PiliPlus/models_new/match/match_info/season.dart';\nimport 'package:PiliPlus/models_new/match/match_info/success_teaminfo.dart';\nimport 'package:PiliPlus/models_new/match/match_info/team.dart';\n\nclass MatchContest {\n  int? id;\n  String? gameStage;\n  int? stime;\n  int? etime;\n  int? homeId;\n  int? awayId;\n  int? homeScore;\n  int? awayScore;\n  int? liveRoom;\n  int? aid;\n  int? collection;\n  String? collectionBvid;\n  int? gameState;\n  String? dic;\n  String? ctime;\n  String? mtime;\n  int? status;\n  int? sid;\n  int? mid;\n  Season? season;\n  MatchTeam? homeTeam;\n  MatchTeam? awayTeam;\n  int? special;\n  int? successTeam;\n  SuccessTeaminfo? successTeaminfo;\n  String? specialName;\n  String? specialTips;\n  String? specialImage;\n  String? playback;\n  String? collectionUrl;\n  String? liveUrl;\n  int? dataType;\n  int? matchId;\n  int? guessType;\n  int? guessShow;\n  String? bvid;\n  String? gameStage1;\n  String? gameStage2;\n  int? liveStatus;\n  int? livePopular;\n  String? liveCover;\n  int? pushSwitch;\n  String? liveTitle;\n  int? seriesId;\n  int? contestStatus;\n  int? contestFreeze;\n  int? startTime;\n  int? endTime;\n  String? title;\n  String? playBack;\n  int? seasonId;\n  int? isSub;\n  int? isGuess;\n  HomeAway? home;\n  HomeAway? away;\n  dynamic series;\n  String? prospect;\n  String? afterContestVideo;\n  int? homeSmallScore;\n  int? awaySmallScore;\n  String? watchPoint;\n  String? watchPointIcon;\n  dynamic hottestPlayer;\n\n  MatchContest({\n    this.id,\n    this.gameStage,\n    this.stime,\n    this.etime,\n    this.homeId,\n    this.awayId,\n    this.homeScore,\n    this.awayScore,\n    this.liveRoom,\n    this.aid,\n    this.collection,\n    this.collectionBvid,\n    this.gameState,\n    this.dic,\n    this.ctime,\n    this.mtime,\n    this.status,\n    this.sid,\n    this.mid,\n    this.season,\n    this.homeTeam,\n    this.awayTeam,\n    this.special,\n    this.successTeam,\n    this.successTeaminfo,\n    this.specialName,\n    this.specialTips,\n    this.specialImage,\n    this.playback,\n    this.collectionUrl,\n    this.liveUrl,\n    this.dataType,\n    this.matchId,\n    this.guessType,\n    this.guessShow,\n    this.bvid,\n    this.gameStage1,\n    this.gameStage2,\n    this.liveStatus,\n    this.livePopular,\n    this.liveCover,\n    this.pushSwitch,\n    this.liveTitle,\n    this.seriesId,\n    this.contestStatus,\n    this.contestFreeze,\n    this.startTime,\n    this.endTime,\n    this.title,\n    this.playBack,\n    this.seasonId,\n    this.isSub,\n    this.isGuess,\n    this.home,\n    this.away,\n    this.series,\n    this.prospect,\n    this.afterContestVideo,\n    this.homeSmallScore,\n    this.awaySmallScore,\n    this.watchPoint,\n    this.watchPointIcon,\n    this.hottestPlayer,\n  });\n\n  factory MatchContest.fromJson(Map<String, dynamic> json) => MatchContest(\n    id: json['id'] as int?,\n    gameStage: json['game_stage'] as String?,\n    stime: json['stime'] as int?,\n    etime: json['etime'] as int?,\n    homeId: json['home_id'] as int?,\n    awayId: json['away_id'] as int?,\n    homeScore: json['home_score'] as int?,\n    awayScore: json['away_score'] as int?,\n    liveRoom: json['live_room'] as int?,\n    aid: json['aid'] as int?,\n    collection: json['collection'] as int?,\n    collectionBvid: json['collection_bvid'] as String?,\n    gameState: json['game_state'] as int?,\n    dic: json['dic'] as String?,\n    ctime: json['ctime'] as String?,\n    mtime: json['mtime'] as String?,\n    status: json['status'] as int?,\n    sid: json['sid'] as int?,\n    mid: json['mid'] as int?,\n    season: json['season'] == null\n        ? null\n        : Season.fromJson(json['season'] as Map<String, dynamic>),\n    homeTeam: json['home_team'] == null\n        ? null\n        : MatchTeam.fromJson(json['home_team'] as Map<String, dynamic>),\n    awayTeam: json['away_team'] == null\n        ? null\n        : MatchTeam.fromJson(json['away_team'] as Map<String, dynamic>),\n    special: json['special'] as int?,\n    successTeam: json['success_team'] as int?,\n    successTeaminfo: json['success_teaminfo'] == null\n        ? null\n        : SuccessTeaminfo.fromJson(\n            json['success_teaminfo'] as Map<String, dynamic>,\n          ),\n    specialName: json['special_name'] as String?,\n    specialTips: json['special_tips'] as String?,\n    specialImage: json['special_image'] as String?,\n    playback: json['playback'] as String?,\n    collectionUrl: json['collection_url'] as String?,\n    liveUrl: json['live_url'] as String?,\n    dataType: json['data_type'] as int?,\n    matchId: json['match_id'] as int?,\n    guessType: json['guess_type'] as int?,\n    guessShow: json['guess_show'] as int?,\n    bvid: json['bvid'] as String?,\n    gameStage1: json['game_stage1'] as String?,\n    gameStage2: json['game_stage2'] as String?,\n    liveStatus: json['live_status'] as int?,\n    livePopular: json['live_popular'] as int?,\n    liveCover: json['live_cover'] as String?,\n    pushSwitch: json['push_switch'] as int?,\n    liveTitle: json['live_title'] as String?,\n    seriesId: json['series_id'] as int?,\n    contestStatus: json['contest_status'] as int?,\n    contestFreeze: json['contest_freeze'] as int?,\n    startTime: json['start_time'] as int?,\n    endTime: json['end_time'] as int?,\n    title: json['title'] as String?,\n    playBack: json['play_back'] as String?,\n    seasonId: json['season_id'] as int?,\n    isSub: json['is_sub'] as int?,\n    isGuess: json['is_guess'] as int?,\n    home: json['home'] == null\n        ? null\n        : HomeAway.fromJson(json['home'] as Map<String, dynamic>),\n    away: json['away'] == null\n        ? null\n        : HomeAway.fromJson(json['away'] as Map<String, dynamic>),\n    series: json['series'] as dynamic,\n    prospect: json['prospect'] as String?,\n    afterContestVideo: json['after_contest_video'] as String?,\n    homeSmallScore: json['home_small_score'] as int?,\n    awaySmallScore: json['away_small_score'] as int?,\n    watchPoint: json['watch_point'] as String?,\n    watchPointIcon: json['watch_point_icon'] as String?,\n    hottestPlayer: json['hottest_player'] as dynamic,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/match/match_info/data.dart",
    "content": "import 'package:PiliPlus/models_new/match/match_info/contest.dart';\n\nclass MatchInfoData {\n  MatchContest? contest;\n\n  MatchInfoData({this.contest});\n\n  factory MatchInfoData.fromJson(Map<String, dynamic> json) => MatchInfoData(\n    contest: json['contest'] == null\n        ? null\n        : MatchContest.fromJson(json['contest'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/match/match_info/home_away.dart",
    "content": "class HomeAway {\n  int? id;\n  String? icon;\n  String? name;\n  int? wins;\n  String? region;\n  int? regionId;\n  int? externalTeamId;\n  String? divisionName;\n  String? divisionLogo;\n  dynamic playerGradeDetail;\n  bool? isSuccessTeam;\n\n  HomeAway({\n    this.id,\n    this.icon,\n    this.name,\n    this.wins,\n    this.region,\n    this.regionId,\n    this.externalTeamId,\n    this.divisionName,\n    this.divisionLogo,\n    this.playerGradeDetail,\n    this.isSuccessTeam,\n  });\n\n  factory HomeAway.fromJson(Map<String, dynamic> json) => HomeAway(\n    id: json['id'] as int?,\n    icon: json['icon'] as String?,\n    name: json['name'] as String?,\n    wins: json['wins'] as int?,\n    region: json['region'] as String?,\n    regionId: json['region_id'] as int?,\n    externalTeamId: json['ExternalTeamId'] as int?,\n    divisionName: json['division_name'] as String?,\n    divisionLogo: json['division_logo'] as String?,\n    playerGradeDetail: json['player_grade_detail'] as dynamic,\n    isSuccessTeam: json['is_success_team'] as bool?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/match/match_info/season.dart",
    "content": "class Season {\n  int? id;\n  int? mid;\n  String? title;\n  String? subTitle;\n  int? stime;\n  int? etime;\n  String? sponsor;\n  String? logo;\n  String? dic;\n  int? status;\n  int? ctime;\n  int? mtime;\n  int? rank;\n  int? isApp;\n  String? url;\n  String? dataFocus;\n  String? focusUrl;\n  int? leidaSid;\n  int? gameType;\n  String? searchImage;\n  int? syncPlatform;\n  String? centreLogo;\n  int? centreStatus;\n  String? centrePcLogo;\n  int? seasonType;\n\n  Season({\n    this.id,\n    this.mid,\n    this.title,\n    this.subTitle,\n    this.stime,\n    this.etime,\n    this.sponsor,\n    this.logo,\n    this.dic,\n    this.status,\n    this.ctime,\n    this.mtime,\n    this.rank,\n    this.isApp,\n    this.url,\n    this.dataFocus,\n    this.focusUrl,\n    this.leidaSid,\n    this.gameType,\n    this.searchImage,\n    this.syncPlatform,\n    this.centreLogo,\n    this.centreStatus,\n    this.centrePcLogo,\n    this.seasonType,\n  });\n\n  factory Season.fromJson(Map<String, dynamic> json) => Season(\n    id: json['id'] as int?,\n    mid: json['mid'] as int?,\n    title: json['title'] as String?,\n    subTitle: json['sub_title'] as String?,\n    stime: json['stime'] as int?,\n    etime: json['etime'] as int?,\n    sponsor: json['sponsor'] as String?,\n    logo: json['logo'] as String?,\n    dic: json['dic'] as String?,\n    status: json['status'] as int?,\n    ctime: json['ctime'] as int?,\n    mtime: json['mtime'] as int?,\n    rank: json['rank'] as int?,\n    isApp: json['is_app'] as int?,\n    url: json['url'] as String?,\n    dataFocus: json['data_focus'] as String?,\n    focusUrl: json['focus_url'] as String?,\n    leidaSid: json['leida_sid'] as int?,\n    gameType: json['game_type'] as int?,\n    searchImage: json['search_image'] as String?,\n    syncPlatform: json['sync_platform'] as int?,\n    centreLogo: json['centre_logo'] as String?,\n    centreStatus: json['centre_status'] as int?,\n    centrePcLogo: json['centre_pc_logo'] as String?,\n    seasonType: json['season_type'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/match/match_info/success_teaminfo.dart",
    "content": "class SuccessTeaminfo {\n  int? id;\n  String? title;\n  String? subTitle;\n  String? eTitle;\n  int? createTime;\n  String? area;\n  String? logo;\n  int? uid;\n  String? members;\n  String? dic;\n  int? isDeleted;\n  String? videoUrl;\n  String? profile;\n  int? leidaTid;\n  int? replyId;\n  int? teamType;\n  int? regionId;\n  String? divisionName;\n  String? divisionLogo;\n\n  SuccessTeaminfo({\n    this.id,\n    this.title,\n    this.subTitle,\n    this.eTitle,\n    this.createTime,\n    this.area,\n    this.logo,\n    this.uid,\n    this.members,\n    this.dic,\n    this.isDeleted,\n    this.videoUrl,\n    this.profile,\n    this.leidaTid,\n    this.replyId,\n    this.teamType,\n    this.regionId,\n    this.divisionName,\n    this.divisionLogo,\n  });\n\n  factory SuccessTeaminfo.fromJson(Map<String, dynamic> json) {\n    return SuccessTeaminfo(\n      id: json['id'] as int?,\n      title: json['title'] as String?,\n      subTitle: json['sub_title'] as String?,\n      eTitle: json['e_title'] as String?,\n      createTime: json['create_time'] as int?,\n      area: json['area'] as String?,\n      logo: json['logo'] as String?,\n      uid: json['uid'] as int?,\n      members: json['members'] as String?,\n      dic: json['dic'] as String?,\n      isDeleted: json['is_deleted'] as int?,\n      videoUrl: json['video_url'] as String?,\n      profile: json['profile'] as String?,\n      leidaTid: json['leida_tid'] as int?,\n      replyId: json['reply_id'] as int?,\n      teamType: json['team_type'] as int?,\n      regionId: json['region_id'] as int?,\n      divisionName: json['division_name'] as String?,\n      divisionLogo: json['division_logo'] as String?,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/models_new/match/match_info/team.dart",
    "content": "class MatchTeam {\n  int? id;\n  String? title;\n  String? subTitle;\n  String? eTitle;\n  int? createTime;\n  String? area;\n  String? logo;\n  int? uid;\n  String? members;\n  String? dic;\n  int? isDeleted;\n  String? videoUrl;\n  String? profile;\n  int? leidaTid;\n  int? replyId;\n  int? teamType;\n  int? regionId;\n  String? divisionName;\n  String? divisionLogo;\n\n  MatchTeam({\n    this.id,\n    this.title,\n    this.subTitle,\n    this.eTitle,\n    this.createTime,\n    this.area,\n    this.logo,\n    this.uid,\n    this.members,\n    this.dic,\n    this.isDeleted,\n    this.videoUrl,\n    this.profile,\n    this.leidaTid,\n    this.replyId,\n    this.teamType,\n    this.regionId,\n    this.divisionName,\n    this.divisionLogo,\n  });\n\n  factory MatchTeam.fromJson(Map<String, dynamic> json) => MatchTeam(\n    id: json['id'] as int?,\n    title: json['title'] as String?,\n    subTitle: json['sub_title'] as String?,\n    eTitle: json['e_title'] as String?,\n    createTime: json['create_time'] as int?,\n    area: json['area'] as String?,\n    logo: json['logo'] as String?,\n    uid: json['uid'] as int?,\n    members: json['members'] as String?,\n    dic: json['dic'] as String?,\n    isDeleted: json['is_deleted'] as int?,\n    videoUrl: json['video_url'] as String?,\n    profile: json['profile'] as String?,\n    leidaTid: json['leida_tid'] as int?,\n    replyId: json['reply_id'] as int?,\n    teamType: json['team_type'] as int?,\n    regionId: json['region_id'] as int?,\n    divisionName: json['division_name'] as String?,\n    divisionLogo: json['division_logo'] as String?,\n  );\n\n  Map<String, dynamic> toJson() => {\n    'id': id,\n    'title': title,\n    'sub_title': subTitle,\n    'e_title': eTitle,\n    'create_time': createTime,\n    'area': area,\n    'logo': logo,\n    'uid': uid,\n    'members': members,\n    'dic': dic,\n    'is_deleted': isDeleted,\n    'video_url': videoUrl,\n    'profile': profile,\n    'leida_tid': leidaTid,\n    'reply_id': replyId,\n    'team_type': teamType,\n    'region_id': regionId,\n    'division_name': divisionName,\n    'division_logo': divisionLogo,\n  };\n}\n"
  },
  {
    "path": "lib/models_new/media_list/badge.dart",
    "content": "class Badge {\n  String? text;\n  int? bgStyle;\n  String? img;\n\n  Badge({this.text, this.bgStyle, this.img});\n\n  factory Badge.fromJson(Map<String, dynamic> json) => Badge(\n    text: json['text'] as String?,\n    bgStyle: json['bg_style'] as int?,\n    img: json['img'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/media_list/coin.dart",
    "content": "class Coin {\n  num? maxNum;\n  num? coinNumber;\n\n  Coin({this.maxNum, this.coinNumber});\n\n  factory Coin.fromJson(Map<String, dynamic> json) => Coin(\n    maxNum: json['max_num'] as num?,\n    coinNumber: json['coin_number'] as num?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/media_list/data.dart",
    "content": "import 'package:PiliPlus/models_new/media_list/media_list.dart';\n\nclass MediaListData {\n  List<MediaListItemModel> mediaList;\n  bool? hasMore;\n  int? totalCount;\n  String? nextStartKey;\n\n  MediaListData({\n    required this.mediaList,\n    this.hasMore,\n    this.totalCount,\n    this.nextStartKey,\n  });\n\n  factory MediaListData.fromJson(Map<String, dynamic> json) => MediaListData(\n    mediaList:\n        (json['media_list'] as List<dynamic>?)\n            ?.map((e) => MediaListItemModel.fromJson(e as Map<String, dynamic>))\n            .toList() ??\n        <MediaListItemModel>[],\n    hasMore: json['has_more'] as bool?,\n    totalCount: json['total_count'] as int?,\n    nextStartKey: json['next_start_key'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/media_list/media_list.dart",
    "content": "import 'package:PiliPlus/models/model_owner.dart';\nimport 'package:PiliPlus/models_new/fav/fav_detail/cnt_info.dart';\nimport 'package:PiliPlus/models_new/media_list/coin.dart';\nimport 'package:PiliPlus/models_new/media_list/ogv_info.dart';\nimport 'package:PiliPlus/models_new/media_list/page.dart';\nimport 'package:PiliPlus/models_new/media_list/rights.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/episode.dart';\n\nclass MediaListItemModel extends BaseEpisodeItem {\n  @override\n  int? get id => aid;\n  int? offset;\n  int? index;\n  String? intro;\n  int? attr;\n  int? tid;\n  int? copyRight;\n  CntInfo? cntInfo;\n  int? duration;\n  int? pubtime;\n  int? likeState;\n  int? favState;\n  int? page;\n  List<Page>? pages;\n  int? type;\n  Owner? upper;\n  String? link;\n  String? shortLink;\n  Rights? rights;\n  dynamic elecInfo;\n  Coin? coin;\n  OgvInfo? ogvInfo;\n  double? progressPercent;\n  bool? forbidFav;\n  int? moreType;\n  int? businessOid;\n  @override\n  int? get cid => pages?.firstOrNull?.id;\n\n  MediaListItemModel({\n    super.aid,\n    this.offset,\n    this.index,\n    this.intro,\n    this.attr,\n    this.tid,\n    this.copyRight,\n    this.cntInfo,\n    super.cover,\n    this.duration,\n    this.pubtime,\n    this.likeState,\n    this.favState,\n    this.page,\n    this.pages,\n    super.title,\n    this.type,\n    this.upper,\n    this.link,\n    super.bvid,\n    this.shortLink,\n    this.rights,\n    this.elecInfo,\n    this.coin,\n    this.ogvInfo,\n    this.progressPercent,\n    super.badge,\n    this.forbidFav,\n    this.moreType,\n    this.businessOid,\n    super.cid,\n  });\n\n  MediaListItemModel.fromJson(Map<String, dynamic> json) {\n    aid = json['id'] as int?;\n    offset = json['offset'] as int?;\n    index = json['index'] as int?;\n    intro = json['intro'] as String?;\n    attr = json['attr'] as int?;\n    tid = json['tid'] as int?;\n    copyRight = json['copy_right'] as int?;\n    cntInfo = json['cnt_info'] == null\n        ? null\n        : CntInfo.fromJson(json['cnt_info']);\n    cover = json['cover'] as String?;\n    duration = json['duration'] as int?;\n    pubtime = json['pubtime'] as int?;\n    likeState = json['like_state'] as int?;\n    favState = json['fav_state'] as int?;\n    page = json['page'] as int?;\n    pages = (json['pages'] as List?)?.map((e) => Page.fromJson(e)).toList();\n    title = json['title'] as String?;\n    type = json['type'] as int?;\n    upper = json['upper'] == null ? null : Owner.fromJson(json['upper']);\n    link = json['link'] as String?;\n    bvid = json['bv_id'] as String?;\n    shortLink = json['short_link'] as String?;\n    rights = json['rights'] == null ? null : Rights.fromJson(json['rights']);\n    elecInfo = json['elec_info'] as dynamic;\n    coin = json['coin'] == null ? null : Coin.fromJson(json['coin']);\n    ogvInfo = json['ogv_info'] == null\n        ? null\n        : OgvInfo.fromJson(json['ogv_info']);\n    progressPercent = (json['progress_percent'] as num?)?.toDouble();\n    badge = json['badge']?['text'];\n    forbidFav = json['forbid_fav'] as bool?;\n    moreType = json['more_type'] as int?;\n    businessOid = json['business_oid'] as int?;\n  }\n}\n"
  },
  {
    "path": "lib/models_new/media_list/ogv_info.dart",
    "content": "import 'package:PiliPlus/models_new/video/video_detail/dimension.dart';\n\nclass OgvInfo {\n  int? epid;\n  int? seasonId;\n  int? aid;\n  int? cid;\n  Dimension? dimension;\n\n  OgvInfo({this.epid, this.seasonId, this.aid, this.cid, this.dimension});\n\n  factory OgvInfo.fromJson(Map<String, dynamic> json) => OgvInfo(\n    epid: json['epid'] as int?,\n    seasonId: json['season_id'] as int?,\n    aid: json['aid'] as int?,\n    cid: json['cid'] as int?,\n    dimension: json['dimension'] == null\n        ? null\n        : Dimension.fromJson(json['dimension'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/media_list/page.dart",
    "content": "import 'package:PiliPlus/models_new/video/video_detail/dimension.dart';\n\nclass Page {\n  int? id;\n  String? title;\n  String? intro;\n  int? duration;\n  String? link;\n  int? page;\n  String? from;\n  Dimension? dimension;\n\n  Page({\n    this.id,\n    this.title,\n    this.intro,\n    this.duration,\n    this.link,\n    this.page,\n    this.from,\n    this.dimension,\n  });\n\n  factory Page.fromJson(Map<String, dynamic> json) => Page(\n    id: json[\"id\"],\n    title: json[\"title\"],\n    intro: json[\"intro\"],\n    duration: json[\"duration\"],\n    link: json[\"link\"],\n    page: json[\"page\"],\n    from: json[\"from\"],\n    dimension: json[\"dimension\"] == null\n        ? null\n        : Dimension.fromJson(json[\"dimension\"]),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/media_list/rights.dart",
    "content": "class Rights {\n  int? bp;\n  int? elec;\n  int? download;\n  int? movie;\n  int? pay;\n  int? ugcPay;\n  int? hd5;\n  int? noReprint;\n  int? autoplay;\n  int? noBackground;\n\n  Rights({\n    this.bp,\n    this.elec,\n    this.download,\n    this.movie,\n    this.pay,\n    this.ugcPay,\n    this.hd5,\n    this.noReprint,\n    this.autoplay,\n    this.noBackground,\n  });\n\n  factory Rights.fromJson(Map<String, dynamic> json) => Rights(\n    bp: json['bp'] as int?,\n    elec: json['elec'] as int?,\n    download: json['download'] as int?,\n    movie: json['movie'] as int?,\n    pay: json['pay'] as int?,\n    ugcPay: json['ugc_pay'] as int?,\n    hd5: json['hd5'] as int?,\n    noReprint: json['no_reprint'] as int?,\n    autoplay: json['autoplay'] as int?,\n    noBackground: json['no_background'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/member/coin_like_arc/data.dart",
    "content": "import 'package:PiliPlus/models_new/member/coin_like_arc/item.dart';\n\nclass CoinLikeArcData {\n  int? count;\n  List<CoinLikeArcItem>? item;\n\n  CoinLikeArcData({this.count, this.item});\n\n  factory CoinLikeArcData.fromJson(Map<String, dynamic> json) =>\n      CoinLikeArcData(\n        count: json['count'] as int?,\n        item: (json['item'] as List<dynamic>?)\n            ?.map((e) => CoinLikeArcItem.fromJson(e as Map<String, dynamic>))\n            .toList(),\n      );\n}\n"
  },
  {
    "path": "lib/models_new/member/coin_like_arc/item.dart",
    "content": "class CoinLikeArcItem {\n  String? title;\n  String? subtitle;\n  String? tname;\n  String? cover;\n  String? coverIcon;\n  String? uri;\n  String? param;\n  String? goto;\n  String? length;\n  int? duration;\n  bool? isPopular;\n  bool? isSteins;\n  bool? isUgcpay;\n  bool? isCooperation;\n  bool? isPgc;\n  bool? isLivePlayback;\n  bool? isPugv;\n  bool? isFold;\n  bool? isOneself;\n  int? play;\n  int? danmaku;\n  int? ctime;\n  int? ugcPay;\n  String? author;\n  bool? state;\n  int? videos;\n  String? viewContent;\n  int? iconType;\n  String? publishTimeText;\n\n  CoinLikeArcItem({\n    this.title,\n    this.subtitle,\n    this.tname,\n    this.cover,\n    this.coverIcon,\n    this.uri,\n    this.param,\n    this.goto,\n    this.length,\n    this.duration,\n    this.isPopular,\n    this.isSteins,\n    this.isUgcpay,\n    this.isCooperation,\n    this.isPgc,\n    this.isLivePlayback,\n    this.isPugv,\n    this.isFold,\n    this.isOneself,\n    this.play,\n    this.danmaku,\n    this.ctime,\n    this.ugcPay,\n    this.author,\n    this.state,\n    this.videos,\n    this.viewContent,\n    this.iconType,\n    this.publishTimeText,\n  });\n\n  factory CoinLikeArcItem.fromJson(Map<String, dynamic> json) =>\n      CoinLikeArcItem(\n        title: json['title'] as String?,\n        subtitle: json['subtitle'] as String?,\n        tname: json['tname'] as String?,\n        cover: json['cover'] as String?,\n        coverIcon: json['cover_icon'] as String?,\n        uri: json['uri'] as String?,\n        param: json['param'] as String?,\n        goto: json['goto'] as String?,\n        length: json['length'] as String?,\n        duration: json['duration'] as int?,\n        isPopular: json['is_popular'] as bool?,\n        isSteins: json['is_steins'] as bool?,\n        isUgcpay: json['is_ugcpay'] as bool?,\n        isCooperation: json['is_cooperation'] as bool?,\n        isPgc: json['is_pgc'] as bool?,\n        isLivePlayback: json['is_live_playback'] as bool?,\n        isPugv: json['is_pugv'] as bool?,\n        isFold: json['is_fold'] as bool?,\n        isOneself: json['is_oneself'] as bool?,\n        play: json['play'] as int?,\n        danmaku: json['danmaku'] as int?,\n        ctime: json['ctime'] as int?,\n        ugcPay: json['ugc_pay'] as int?,\n        author: json['author'] as String?,\n        state: json['state'] as bool?,\n        videos: json['videos'] as int?,\n        viewContent: json['view_content'] as String?,\n        iconType: json['icon_type'] as int?,\n        publishTimeText: json['publish_time_text'] as String?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/member/search_archive/data.dart",
    "content": "import 'package:PiliPlus/models_new/member/search_archive/episodic_button.dart';\nimport 'package:PiliPlus/models_new/member/search_archive/list.dart';\nimport 'package:PiliPlus/models_new/member/search_archive/page.dart';\n\nclass SearchArchiveData {\n  SearchArchiveList? list;\n  Page? page;\n  EpisodicButton? episodicButton;\n  bool? isRisk;\n  int? gaiaResType;\n  dynamic gaiaData;\n\n  SearchArchiveData({\n    this.list,\n    this.page,\n    this.episodicButton,\n    this.isRisk,\n    this.gaiaResType,\n    this.gaiaData,\n  });\n\n  factory SearchArchiveData.fromJson(Map<String, dynamic> json) =>\n      SearchArchiveData(\n        list: json['list'] == null\n            ? null\n            : SearchArchiveList.fromJson(json['list'] as Map<String, dynamic>),\n        page: json['page'] == null\n            ? null\n            : Page.fromJson(json['page'] as Map<String, dynamic>),\n        episodicButton: json['episodic_button'] == null\n            ? null\n            : EpisodicButton.fromJson(\n                json['episodic_button'] as Map<String, dynamic>,\n              ),\n        isRisk: json['is_risk'] as bool?,\n        gaiaResType: json['gaia_res_type'] as int?,\n        gaiaData: json['gaia_data'] as dynamic,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/member/search_archive/episodic_button.dart",
    "content": "class EpisodicButton {\n  String? text;\n  String? uri;\n\n  EpisodicButton({this.text, this.uri});\n\n  factory EpisodicButton.fromJson(Map<String, dynamic> json) {\n    return EpisodicButton(\n      text: json['text'] as String?,\n      uri: json['uri'] as String?,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/models_new/member/search_archive/list.dart",
    "content": "import 'package:PiliPlus/models_new/member/search_archive/vlist.dart';\n\nclass SearchArchiveList {\n  List<VListItemModel>? vlist;\n\n  SearchArchiveList({this.vlist});\n\n  factory SearchArchiveList.fromJson(Map<String, dynamic> json) =>\n      SearchArchiveList(\n        vlist: (json['vlist'] as List<dynamic>?)\n            ?.map((e) => VListItemModel.fromJson(e as Map<String, dynamic>))\n            .toList(),\n      );\n}\n"
  },
  {
    "path": "lib/models_new/member/search_archive/page.dart",
    "content": "class Page {\n  int? pn;\n  int? ps;\n  int? count;\n\n  Page({this.pn, this.ps, this.count});\n\n  factory Page.fromJson(Map<String, dynamic> json) => Page(\n    pn: json['pn'] as int?,\n    ps: json['ps'] as int?,\n    count: json['count'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/member/search_archive/vlist.dart",
    "content": "import 'package:PiliPlus/models/model_video.dart';\nimport 'package:PiliPlus/utils/duration_utils.dart';\n\nclass VListItemModel extends BaseVideoItemModel {\n  int? comment;\n  int? typeid;\n  String? subtitle;\n  String? copyright;\n  int? review;\n  bool? hideClick;\n  bool? isChargingSrc;\n\n  VListItemModel.fromJson(Map<String, dynamic> json) {\n    comment = json['comment'];\n    typeid = json['typeid'];\n    cover = json['pic'];\n    subtitle = json['subtitle'];\n    desc = json['description'];\n    copyright = json['copyright'];\n    title = json['title'];\n    review = json['review'];\n    pubdate = json['created'];\n    if (json['length'] != null) {\n      duration = DurationUtils.parseDuration(json['length']);\n    }\n    aid = json['aid'];\n    bvid = json['bvid'];\n    hideClick = json['hide_click'];\n    isChargingSrc = json['is_charging_arc'];\n    stat = VListStat.fromJson(json);\n    owner = VListOwner.fromJson(json);\n  }\n}\n\nclass VListOwner extends BaseOwner {\n  VListOwner.fromJson(Map<String, dynamic> json) {\n    mid = json[\"mid\"];\n    name = json[\"author\"];\n  }\n}\n\nclass VListStat extends BaseStat {\n  VListStat.fromJson(Map<String, dynamic> json) {\n    view = json[\"play\"];\n    danmu = json['video_review'];\n  }\n}\n"
  },
  {
    "path": "lib/models_new/member_card_info/card.dart",
    "content": "import 'package:PiliPlus/models/model_avatar.dart';\n\nclass Card {\n  String? mid;\n  String? name;\n  String? face;\n  int? fans;\n  int? attention;\n  BaseOfficialVerify? official;\n  Vip? vip;\n\n  Card({\n    this.mid,\n    this.name,\n    this.face,\n    this.fans,\n    this.attention,\n    this.official,\n    this.vip,\n  });\n\n  factory Card.fromJson(Map<String, dynamic> json) => Card(\n    mid: json['mid'] as String?,\n    name: json['name'] as String?,\n    face: json['face'] as String?,\n    fans: json['fans'] as int?,\n    attention: json['attention'] as int?,\n    official: json['Official'] == null\n        ? null\n        : BaseOfficialVerify.fromJson(\n            json['Official'] as Map<String, dynamic>,\n          ),\n    vip: json['vip'] == null\n        ? null\n        : Vip.fromJson(json['vip'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/member_card_info/data.dart",
    "content": "import 'package:PiliPlus/models_new/member_card_info/card.dart';\n\nclass MemberCardInfoData {\n  Card? card;\n  bool? following;\n  int? archiveCount;\n  int? articleCount;\n  int? follower;\n  int? likeNum;\n\n  MemberCardInfoData({\n    this.card,\n    this.following,\n    this.archiveCount,\n    this.articleCount,\n    this.follower,\n    this.likeNum,\n  });\n\n  factory MemberCardInfoData.fromJson(Map<String, dynamic> json) =>\n      MemberCardInfoData(\n        card: json['card'] == null\n            ? null\n            : Card.fromJson(json['card'] as Map<String, dynamic>),\n        following: json['following'] as bool?,\n        archiveCount: json['archive_count'] as int?,\n        articleCount: json['article_count'] as int?,\n        follower: json['follower'] as int?,\n        likeNum: json['like_num'] as int?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/msg/im_user_infos/datum.dart",
    "content": "import 'package:PiliPlus/models/model_avatar.dart';\n\nclass ImUserInfosData {\n  int? mid;\n  String? name;\n  String? sex;\n  String? face;\n  String? sign;\n  int? rank;\n  int? level;\n  int? silence;\n  Vip? vip;\n  Pendant? pendant;\n  BaseOfficialVerify? official;\n  int? birthday;\n  int? isFakeAccount;\n  int? isDeleted;\n  int? inRegAudit;\n  int? faceNft;\n  int? faceNftNew;\n  int? isSeniorMember;\n  String? digitalId;\n  int? digitalType;\n\n  ImUserInfosData({\n    this.mid,\n    this.name,\n    this.sex,\n    this.face,\n    this.sign,\n    this.rank,\n    this.level,\n    this.silence,\n    this.vip,\n    this.pendant,\n    this.official,\n    this.birthday,\n    this.isFakeAccount,\n    this.isDeleted,\n    this.inRegAudit,\n    this.faceNft,\n    this.faceNftNew,\n    this.isSeniorMember,\n    this.digitalId,\n    this.digitalType,\n  });\n\n  factory ImUserInfosData.fromJson(Map<String, dynamic> json) =>\n      ImUserInfosData(\n        mid: json['mid'] as int?,\n        name: json['name'] as String?,\n        sex: json['sex'] as String?,\n        face: json['face'] as String?,\n        sign: json['sign'] as String?,\n        rank: json['rank'] as int?,\n        level: json['level'] as int?,\n        silence: json['silence'] as int?,\n        vip: json['vip'] == null\n            ? null\n            : Vip.fromJson(json['vip'] as Map<String, dynamic>),\n        pendant: json['pendant'] == null\n            ? null\n            : Pendant.fromJson(json['pendant'] as Map<String, dynamic>),\n        official: json['official'] == null\n            ? null\n            : BaseOfficialVerify.fromJson(\n                json['official'] as Map<String, dynamic>,\n              ),\n        birthday: json['birthday'] as int?,\n        isFakeAccount: json['is_fake_account'] as int?,\n        isDeleted: json['is_deleted'] as int?,\n        inRegAudit: json['in_reg_audit'] as int?,\n        faceNft: json['face_nft'] as int?,\n        faceNftNew: json['face_nft_new'] as int?,\n        isSeniorMember: json['is_senior_member'] as int?,\n        digitalId: json['digital_id'] as String?,\n        digitalType: json['digital_type'] as int?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/msg/msg_at/content.dart",
    "content": "class MsgAtContent {\n  String? type;\n  String? business;\n  int? businessId;\n  String? title;\n  String? image;\n  String? uri;\n  int? subjectId;\n  int? rootId;\n  int? targetId;\n  int? sourceId;\n  String? sourceContent;\n  String? nativeUri;\n  List<dynamic>? atDetails;\n  List<dynamic>? topicDetails;\n  bool? hideReplyButton;\n\n  MsgAtContent({\n    this.type,\n    this.business,\n    this.businessId,\n    this.title,\n    this.image,\n    this.uri,\n    this.subjectId,\n    this.rootId,\n    this.targetId,\n    this.sourceId,\n    this.sourceContent,\n    this.nativeUri,\n    this.atDetails,\n    this.topicDetails,\n    this.hideReplyButton,\n  });\n\n  factory MsgAtContent.fromJson(Map<String, dynamic> json) => MsgAtContent(\n    type: json['type'] as String?,\n    business: json['business'] as String?,\n    businessId: json['business_id'] as int?,\n    title: json['title'] as String?,\n    image: json['image'] as String?,\n    uri: json['uri'] as String?,\n    subjectId: json['subject_id'] as int?,\n    rootId: json['root_id'] as int?,\n    targetId: json['target_id'] as int?,\n    sourceId: json['source_id'] as int?,\n    sourceContent: json['source_content'] as String?,\n    nativeUri: json['native_uri'] as String?,\n    atDetails: json['at_details'] as List<dynamic>?,\n    topicDetails: json['topic_details'] as List<dynamic>?,\n    hideReplyButton: json['hide_reply_button'] as bool?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/msg/msg_at/cursor.dart",
    "content": "class Cursor {\n  bool? isEnd;\n  int? id;\n  int? time;\n\n  Cursor({this.isEnd, this.id, this.time});\n\n  factory Cursor.fromJson(Map<String, dynamic> json) => Cursor(\n    isEnd: json['is_end'] as bool?,\n    id: json['id'] as int?,\n    time: json['time'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/msg/msg_at/data.dart",
    "content": "import 'package:PiliPlus/models_new/msg/msg_at/cursor.dart';\nimport 'package:PiliPlus/models_new/msg/msg_at/item.dart';\n\nclass MsgAtData {\n  Cursor? cursor;\n  List<MsgAtItem>? items;\n\n  MsgAtData({this.cursor, this.items});\n\n  factory MsgAtData.fromJson(Map<String, dynamic> json) => MsgAtData(\n    cursor: json['cursor'] == null\n        ? null\n        : Cursor.fromJson(json['cursor'] as Map<String, dynamic>),\n    items: (json['items'] as List<dynamic>?)\n        ?.map((e) => MsgAtItem.fromJson(e as Map<String, dynamic>))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/msg/msg_at/item.dart",
    "content": "import 'package:PiliPlus/models_new/msg/msg_at/content.dart';\nimport 'package:PiliPlus/models_new/msg/msg_at/user.dart';\n\nclass MsgAtItem {\n  int? id;\n  User? user;\n  MsgAtContent? item;\n  int? atTime;\n\n  MsgAtItem({this.id, this.user, this.item, this.atTime});\n\n  factory MsgAtItem.fromJson(Map<String, dynamic> json) => MsgAtItem(\n    id: json['id'] as int?,\n    user: json['user'] == null\n        ? null\n        : User.fromJson(json['user'] as Map<String, dynamic>),\n    item: json['item'] == null\n        ? null\n        : MsgAtContent.fromJson(json['item'] as Map<String, dynamic>),\n    atTime: json['at_time'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/msg/msg_at/user.dart",
    "content": "class User {\n  int? mid;\n  int? fans;\n  String? nickname;\n  String? avatar;\n  String? midLink;\n  bool? follow;\n\n  User({\n    this.mid,\n    this.fans,\n    this.nickname,\n    this.avatar,\n    this.midLink,\n    this.follow,\n  });\n\n  factory User.fromJson(Map<String, dynamic> json) => User(\n    mid: json['mid'] as int?,\n    fans: json['fans'] as int?,\n    nickname: json['nickname'] as String?,\n    avatar: json['avatar'] as String?,\n    midLink: json['mid_link'] as String?,\n    follow: json['follow'] as bool?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/msg/msg_dnd/uid_setting.dart",
    "content": "class UidSetting {\n  int? id;\n  int? setting;\n\n  UidSetting({this.id, this.setting});\n\n  factory UidSetting.fromJson(Map<String, dynamic> json) => UidSetting(\n    id: json['id'] as int?,\n    setting: json['setting'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/msg/msg_like/content.dart",
    "content": "class MsgLikeContent {\n  int? itemId;\n  int? pid;\n  String? type;\n  String? business;\n  int? businessId;\n  int? replyBusinessId;\n  int? likeBusinessId;\n  String? title;\n  String? desc;\n  String? image;\n  String? uri;\n  String? detailName;\n  String? nativeUri;\n  int? ctime;\n\n  MsgLikeContent({\n    this.itemId,\n    this.pid,\n    this.type,\n    this.business,\n    this.businessId,\n    this.replyBusinessId,\n    this.likeBusinessId,\n    this.title,\n    this.desc,\n    this.image,\n    this.uri,\n    this.detailName,\n    this.nativeUri,\n    this.ctime,\n  });\n\n  factory MsgLikeContent.fromJson(Map<String, dynamic> json) {\n    return MsgLikeContent(\n      itemId: json['item_id'] as int?,\n      pid: json['pid'] as int?,\n      type: json['type'] as String?,\n      business: json['business'] as String?,\n      businessId: json['business_id'] as int?,\n      replyBusinessId: json['reply_business_id'] as int?,\n      likeBusinessId: json['like_business_id'] as int?,\n      title: json['title'] as String?,\n      desc: json['desc'] as String?,\n      image: json['image'] as String?,\n      uri: json['uri'] as String?,\n      detailName: json['detail_name'] as String?,\n      nativeUri: json['native_uri'] as String?,\n      ctime: json['ctime'] as int?,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/models_new/msg/msg_like/cursor.dart",
    "content": "class Cursor {\n  bool? isEnd;\n  int? id;\n  int? time;\n\n  Cursor({this.isEnd, this.id, this.time});\n\n  factory Cursor.fromJson(Map<String, dynamic> json) => Cursor(\n    isEnd: json['is_end'] as bool?,\n    id: json['id'] as int?,\n    time: json['time'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/msg/msg_like/data.dart",
    "content": "import 'package:PiliPlus/models_new/msg/msg_like/latest.dart';\nimport 'package:PiliPlus/models_new/msg/msg_like/total.dart';\n\nclass MsgLikeData {\n  Latest? latest;\n  Total? total;\n\n  MsgLikeData({this.latest, this.total});\n\n  factory MsgLikeData.fromJson(Map<String, dynamic> json) => MsgLikeData(\n    latest: json['latest'] == null\n        ? null\n        : Latest.fromJson(json['latest'] as Map<String, dynamic>),\n    total: json['total'] == null\n        ? null\n        : Total.fromJson(json['total'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/msg/msg_like/item.dart",
    "content": "import 'package:PiliPlus/models_new/msg/msg_like/content.dart';\nimport 'package:PiliPlus/models_new/msg/msg_like/user.dart';\n\nclass MsgLikeItem {\n  int? id;\n  List<User>? users;\n  MsgLikeContent? item;\n  int? counts;\n  int? likeTime;\n  int? noticeState;\n\n  MsgLikeItem({\n    this.id,\n    this.users,\n    this.item,\n    this.counts,\n    this.likeTime,\n    this.noticeState,\n  });\n\n  factory MsgLikeItem.fromJson(Map<String, dynamic> json) => MsgLikeItem(\n    id: json['id'] as int?,\n    users: (json['users'] as List<dynamic>?)\n        ?.map((e) => User.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    item: json['item'] == null\n        ? null\n        : MsgLikeContent.fromJson(json['item'] as Map<String, dynamic>),\n    counts: json['counts'] as int?,\n    likeTime: json['like_time'] as int?,\n    noticeState: json['notice_state'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/msg/msg_like/latest.dart",
    "content": "import 'package:PiliPlus/models_new/msg/msg_like/item.dart';\n\nclass Latest {\n  List<MsgLikeItem>? items;\n  int? lastViewAt;\n\n  Latest({this.items, this.lastViewAt});\n\n  factory Latest.fromJson(Map<String, dynamic> json) => Latest(\n    items: (json['items'] as List<dynamic>?)\n        ?.map((e) => MsgLikeItem.fromJson(e))\n        .toList(),\n    lastViewAt: json['last_view_at'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/msg/msg_like/total.dart",
    "content": "import 'package:PiliPlus/models_new/msg/msg_like/cursor.dart';\nimport 'package:PiliPlus/models_new/msg/msg_like/item.dart';\n\nclass Total {\n  Cursor? cursor;\n  List<MsgLikeItem>? items;\n\n  Total({this.cursor, this.items});\n\n  factory Total.fromJson(Map<String, dynamic> json) => Total(\n    cursor: json['cursor'] == null\n        ? null\n        : Cursor.fromJson(json['cursor'] as Map<String, dynamic>),\n    items: (json['items'] as List<dynamic>?)\n        ?.map((e) => MsgLikeItem.fromJson(e as Map<String, dynamic>))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/msg/msg_like/user.dart",
    "content": "class User {\n  int? mid;\n  int? fans;\n  String? nickname;\n  String? avatar;\n  String? midLink;\n  bool? follow;\n\n  User({\n    this.mid,\n    this.fans,\n    this.nickname,\n    this.avatar,\n    this.midLink,\n    this.follow,\n  });\n\n  factory User.fromJson(Map<String, dynamic> json) => User(\n    mid: json['mid'] as int?,\n    fans: json['fans'] as int?,\n    nickname: json['nickname'] as String?,\n    avatar: json['avatar'] as String?,\n    midLink: json['mid_link'] as String?,\n    follow: json['follow'] as bool?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/msg/msg_like_detail/card.dart",
    "content": "class MsgLikeDetailCard {\n  int? itemId;\n  int? pid;\n  String? type;\n  String? business;\n  int? businessId;\n  int? replyBusinessId;\n  int? likeBusinessId;\n  String? title;\n  String? desc;\n  String? image;\n  String? uri;\n  String? detailName;\n  String? nativeUri;\n  int? ctime;\n\n  MsgLikeDetailCard({\n    this.itemId,\n    this.pid,\n    this.type,\n    this.business,\n    this.businessId,\n    this.replyBusinessId,\n    this.likeBusinessId,\n    this.title,\n    this.desc,\n    this.image,\n    this.uri,\n    this.detailName,\n    this.nativeUri,\n    this.ctime,\n  });\n\n  factory MsgLikeDetailCard.fromJson(Map<String, dynamic> json) =>\n      MsgLikeDetailCard(\n        itemId: json['item_id'] as int?,\n        pid: json['pid'] as int?,\n        type: json['type'] as String?,\n        business: json['business'] as String?,\n        businessId: json['business_id'] as int?,\n        replyBusinessId: json['reply_business_id'] as int?,\n        likeBusinessId: json['like_business_id'] as int?,\n        title: json['title'] as String?,\n        desc: json['desc'] as String?,\n        image: json['image'] as String?,\n        uri: json['uri'] as String?,\n        detailName: json['detail_name'] as String?,\n        nativeUri: json['native_uri'] as String?,\n        ctime: json['ctime'] as int?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/msg/msg_like_detail/data.dart",
    "content": "import 'package:PiliPlus/models_new/msg/msg_like_detail/card.dart';\nimport 'package:PiliPlus/models_new/msg/msg_like_detail/item.dart';\nimport 'package:PiliPlus/models_new/msg/msg_like_detail/page.dart';\n\nclass MsgLikeDetailData {\n  MsgLikeDetailPage? page;\n  MsgLikeDetailCard? card;\n  List<MsgLikeDetailItem>? items;\n\n  MsgLikeDetailData({this.page, this.card, this.items});\n\n  factory MsgLikeDetailData.fromJson(Map<String, dynamic> json) =>\n      MsgLikeDetailData(\n        page: json['page'] == null\n            ? null\n            : MsgLikeDetailPage.fromJson(json['page'] as Map<String, dynamic>),\n        card: json['card'] == null\n            ? null\n            : MsgLikeDetailCard.fromJson(json['card'] as Map<String, dynamic>),\n        items: (json['items'] as List<dynamic>?)\n            ?.map((e) => MsgLikeDetailItem.fromJson(e as Map<String, dynamic>))\n            .toList(),\n      );\n}\n"
  },
  {
    "path": "lib/models_new/msg/msg_like_detail/item.dart",
    "content": "import 'package:PiliPlus/models_new/msg/msg_like_detail/user.dart';\n\nclass MsgLikeDetailItem {\n  MsgLikeDetailUser? user;\n  int? likeTime;\n\n  MsgLikeDetailItem({this.user, this.likeTime});\n\n  factory MsgLikeDetailItem.fromJson(Map<String, dynamic> json) =>\n      MsgLikeDetailItem(\n        user: json['user'] == null\n            ? null\n            : MsgLikeDetailUser.fromJson(json['user'] as Map<String, dynamic>),\n        likeTime: json['like_time'] as int?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/msg/msg_like_detail/page.dart",
    "content": "class MsgLikeDetailPage {\n  bool? isEnd;\n\n  MsgLikeDetailPage({this.isEnd});\n\n  factory MsgLikeDetailPage.fromJson(Map<String, dynamic> json) =>\n      MsgLikeDetailPage(\n        isEnd: json['is_end'] as bool?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/msg/msg_like_detail/user.dart",
    "content": "class MsgLikeDetailUser {\n  int? mid;\n  int? fans;\n  String? nickname;\n  String? avatar;\n  String? midLink;\n  bool? follow;\n\n  MsgLikeDetailUser({\n    this.mid,\n    this.fans,\n    this.nickname,\n    this.avatar,\n    this.midLink,\n    this.follow,\n  });\n\n  factory MsgLikeDetailUser.fromJson(Map<String, dynamic> json) =>\n      MsgLikeDetailUser(\n        mid: json['mid'] as int?,\n        fans: json['fans'] as int?,\n        nickname: json['nickname'] as String?,\n        avatar: json['avatar'] as String?,\n        midLink: json['mid_link'] as String?,\n        follow: json['follow'] as bool?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/msg/msg_reply/content.dart",
    "content": "class MsgReplyContent {\n  int? subjectId;\n  int? rootId;\n  int? sourceId;\n  int? targetId;\n  String? type;\n  int? businessId;\n  String? business;\n  String? title;\n  String? desc;\n  String? image;\n  String? uri;\n  String? nativeUri;\n  String? detailTitle;\n  String? rootReplyContent;\n  String? sourceContent;\n  String? targetReplyContent;\n  List<dynamic>? atDetails;\n  List<dynamic>? topicDetails;\n  bool? hideReplyButton;\n  bool? hideLikeButton;\n  int? likeState;\n  dynamic danmu;\n  String? message;\n\n  MsgReplyContent({\n    this.subjectId,\n    this.rootId,\n    this.sourceId,\n    this.targetId,\n    this.type,\n    this.businessId,\n    this.business,\n    this.title,\n    this.desc,\n    this.image,\n    this.uri,\n    this.nativeUri,\n    this.detailTitle,\n    this.rootReplyContent,\n    this.sourceContent,\n    this.targetReplyContent,\n    this.atDetails,\n    this.topicDetails,\n    this.hideReplyButton,\n    this.hideLikeButton,\n    this.likeState,\n    this.danmu,\n    this.message,\n  });\n\n  factory MsgReplyContent.fromJson(Map<String, dynamic> json) {\n    return MsgReplyContent(\n      subjectId: json['subject_id'] as int?,\n      rootId: json['root_id'] as int?,\n      sourceId: json['source_id'] as int?,\n      targetId: json['target_id'] as int?,\n      type: json['type'] as String?,\n      businessId: json['business_id'] as int?,\n      business: json['business'] as String?,\n      title: json['title'] as String?,\n      desc: json['desc'] as String?,\n      image: json['image'] as String?,\n      uri: json['uri'] as String?,\n      nativeUri: json['native_uri'] as String?,\n      detailTitle: json['detail_title'] as String?,\n      rootReplyContent: json['root_reply_content'] as String?,\n      sourceContent: json['source_content'] as String?,\n      targetReplyContent: json['target_reply_content'] as String?,\n      atDetails: json['at_details'] as List<dynamic>?,\n      topicDetails: json['topic_details'] as List<dynamic>?,\n      hideReplyButton: json['hide_reply_button'] as bool?,\n      hideLikeButton: json['hide_like_button'] as bool?,\n      likeState: json['like_state'] as int?,\n      danmu: json['danmu'] as dynamic,\n      message: json['message'] as String?,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/models_new/msg/msg_reply/cursor.dart",
    "content": "class Cursor {\n  bool? isEnd;\n  int? id;\n  int? time;\n\n  Cursor({this.isEnd, this.id, this.time});\n\n  factory Cursor.fromJson(Map<String, dynamic> json) => Cursor(\n    isEnd: json['is_end'] as bool?,\n    id: json['id'] as int?,\n    time: json['time'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/msg/msg_reply/data.dart",
    "content": "import 'package:PiliPlus/models_new/msg/msg_reply/cursor.dart';\nimport 'package:PiliPlus/models_new/msg/msg_reply/item.dart';\n\nclass MsgReplyData {\n  Cursor? cursor;\n  List<MsgReplyItem>? items;\n  int? lastViewAt;\n\n  MsgReplyData({this.cursor, this.items, this.lastViewAt});\n\n  factory MsgReplyData.fromJson(Map<String, dynamic> json) => MsgReplyData(\n    cursor: json['cursor'] == null\n        ? null\n        : Cursor.fromJson(json['cursor'] as Map<String, dynamic>),\n    items: (json['items'] as List<dynamic>?)\n        ?.map((e) => MsgReplyItem.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    lastViewAt: json['last_view_at'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/msg/msg_reply/item.dart",
    "content": "import 'package:PiliPlus/models_new/msg/msg_reply/content.dart';\nimport 'package:PiliPlus/models_new/msg/msg_reply/user.dart';\n\nclass MsgReplyItem {\n  int? id;\n  User? user;\n  MsgReplyContent? item;\n  int? counts;\n  int? isMulti;\n  int? replyTime;\n\n  MsgReplyItem({\n    this.id,\n    this.user,\n    this.item,\n    this.counts,\n    this.isMulti,\n    this.replyTime,\n  });\n\n  factory MsgReplyItem.fromJson(Map<String, dynamic> json) => MsgReplyItem(\n    id: json['id'] as int?,\n    user: json['user'] == null\n        ? null\n        : User.fromJson(json['user'] as Map<String, dynamic>),\n    item: json['item'] == null\n        ? null\n        : MsgReplyContent.fromJson(json['item'] as Map<String, dynamic>),\n    counts: json['counts'] as int?,\n    isMulti: json['is_multi'] as int?,\n    replyTime: json['reply_time'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/msg/msg_reply/user.dart",
    "content": "class User {\n  int? mid;\n  int? fans;\n  String? nickname;\n  String? avatar;\n  String? midLink;\n  bool? follow;\n\n  User({\n    this.mid,\n    this.fans,\n    this.nickname,\n    this.avatar,\n    this.midLink,\n    this.follow,\n  });\n\n  factory User.fromJson(Map<String, dynamic> json) => User(\n    mid: json['mid'] as int?,\n    fans: json['fans'] as int?,\n    nickname: json['nickname'] as String?,\n    avatar: json['avatar'] as String?,\n    midLink: json['mid_link'] as String?,\n    follow: json['follow'] as bool?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/msg/msg_sys/data.dart",
    "content": "import 'dart:convert';\n\nimport 'package:PiliPlus/models_new/msg/msg_sys/publisher.dart';\nimport 'package:PiliPlus/models_new/msg/msg_sys/source.dart';\n\nclass MsgSysItem {\n  int? id;\n  int? cursor;\n  Publisher? publisher;\n  int? type;\n  String? title;\n  String? content;\n  Source? source;\n  String? timeAt;\n  int? cardType;\n  String? cardBrief;\n  String? cardMsgBrief;\n  String? cardCover;\n  String? cardStoryTitle;\n  String? cardLink;\n  String? mc;\n  int? isStation;\n  int? isSend;\n  int? notifyCursor;\n\n  MsgSysItem({\n    this.id,\n    this.cursor,\n    this.publisher,\n    this.type,\n    this.title,\n    this.content,\n    this.source,\n    this.timeAt,\n    this.cardType,\n    this.cardBrief,\n    this.cardMsgBrief,\n    this.cardCover,\n    this.cardStoryTitle,\n    this.cardLink,\n    this.mc,\n    this.isStation,\n    this.isSend,\n    this.notifyCursor,\n  });\n\n  MsgSysItem.fromJson(Map<String, dynamic> json) {\n    id = json['id'] as int?;\n    cursor = json['cursor'] as int?;\n    publisher = json['publisher'] == null\n        ? null\n        : Publisher.fromJson(json['publisher'] as Map<String, dynamic>);\n    type = json['type'] as int?;\n    title = json['title'] as String?;\n    content = json['content'] as String?;\n    if (content != null) {\n      try {\n        dynamic json = jsonDecode(content!);\n        if (json?['web'] != null) {\n          content = json['web'];\n        }\n      } catch (_) {}\n    }\n    source = json['source'] == null\n        ? null\n        : Source.fromJson(json['source'] as Map<String, dynamic>);\n    timeAt = json['time_at'] as String?;\n    cardType = json['card_type'] as int?;\n    cardBrief = json['card_brief'] as String?;\n    cardMsgBrief = json['card_msg_brief'] as String?;\n    cardCover = json['card_cover'] as String?;\n    cardStoryTitle = json['card_story_title'] as String?;\n    cardLink = json['card_link'] as String?;\n    mc = json['mc'] as String?;\n    isStation = json['is_station'] as int?;\n    isSend = json['is_send'] as int?;\n    notifyCursor = json['notify_cursor'] as int?;\n  }\n}\n"
  },
  {
    "path": "lib/models_new/msg/msg_sys/publisher.dart",
    "content": "class Publisher {\n  String? name;\n  int? mid;\n  String? face;\n\n  Publisher({this.name, this.mid, this.face});\n\n  factory Publisher.fromJson(Map<String, dynamic> json) => Publisher(\n    name: json['name'] as String?,\n    mid: json['mid'] as int?,\n    face: json['face'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/msg/msg_sys/source.dart",
    "content": "class Source {\n  String? name;\n  String? logo;\n\n  Source({this.name, this.logo});\n\n  factory Source.fromJson(Map<String, dynamic> json) => Source(\n    name: json['name'] as String?,\n    logo: json['logo'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/msg/msgfeed_unread.dart",
    "content": "import 'package:fixnum/fixnum.dart';\n\nclass MsgFeedUnread {\n  int at = 0;\n  int like = 0;\n  int reply = 0;\n  int sysMsg = 0;\n\n  MsgFeedUnread.fromJson(Map<String, Int64> json) {\n    at = json['at']?.toInt() ?? 0;\n    like = json['like']?.toInt() ?? 0;\n    reply = json['reply']?.toInt() ?? 0;\n    sysMsg = json['sys_msg']?.toInt() ?? 0;\n  }\n}\n"
  },
  {
    "path": "lib/models_new/msg/session_ss/data.dart",
    "content": "class SessionSsData {\n  int? followStatus;\n  int? special;\n  int? pushSetting;\n  int? showPushSetting;\n\n  SessionSsData({\n    this.followStatus,\n    this.special,\n    this.pushSetting,\n    this.showPushSetting,\n  });\n\n  factory SessionSsData.fromJson(Map<String, dynamic> json) => SessionSsData(\n    followStatus: json['follow_status'] as int?,\n    special: json['special'] as int?,\n    pushSetting: json['push_setting'] as int?,\n    showPushSetting: json['show_push_setting'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/msgfeed_unread/data.dart",
    "content": "class MsgFeedUnreadData {\n  int at;\n  int coin;\n  int danmu;\n  int favorite;\n  int like;\n  int recvLike;\n  int recvReply;\n  int reply;\n  int sysMsg;\n  int sysMsgStyle;\n  int up;\n\n  MsgFeedUnreadData({\n    required this.at,\n    required this.coin,\n    required this.danmu,\n    required this.favorite,\n    required this.like,\n    required this.recvLike,\n    required this.recvReply,\n    required this.reply,\n    required this.sysMsg,\n    required this.sysMsgStyle,\n    required this.up,\n  });\n\n  factory MsgFeedUnreadData.fromJson(Map<String, dynamic> json) =>\n      MsgFeedUnreadData(\n        at: json['at'] ?? 0,\n        coin: json['coin'] ?? 0,\n        danmu: json['danmu'] ?? 0,\n        favorite: json['favorite'] ?? 0,\n        like: json['like'] ?? 0,\n        recvLike: json['recv_like'] ?? 0,\n        recvReply: json['recv_reply'] ?? 0,\n        reply: json['reply'] ?? 0,\n        sysMsg: json['sys_msg'] ?? 0,\n        sysMsgStyle: json['sys_msg_style'] ?? 0,\n        up: json['up'] ?? 0,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/music/bgm_detail.dart",
    "content": "import 'package:PiliPlus/models/model_owner.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\n\nclass MusicDetail {\n  MusicDetail({\n    required this.musicTitle,\n    required this.originArtist,\n    required this.originArtistList,\n    required this.mvAid,\n    required this.mvCid,\n    required this.mvBvid,\n    required this.mvIndexOrder,\n    required this.mvFav,\n    required this.mvLikes,\n    required this.mvShares,\n    required this.mvCover,\n    required this.bgColor,\n    required this.mvLyric,\n    required this.supportListen,\n    required this.wishListen,\n    required this.wishCount,\n    required this.musicShares,\n    required this.musicSource,\n    required this.album,\n    required this.artists,\n    required this.artistsList,\n    required this.listenPv,\n    required this.achievement,\n    required this.musicRank,\n    required this.maxListId,\n    required this.showChosen,\n    required this.hotSongHeat,\n    required this.hotSongRank,\n    required this.creationRank,\n    required this.musicOutUrl,\n    // required this.abTest,\n    required this.musicComment,\n    // required this.musicMaterial,\n    required this.isNextgenActivity,\n    required this.isOriginal,\n    required this.musicHot,\n    required this.musicRelation,\n    required this.musicPublish,\n    // required this.musicAchievementTimeline,\n    required this.flowAttr,\n  });\n\n  final String? musicTitle;\n  final String? originArtist;\n  final String? originArtistList;\n  final int? mvAid;\n  final int? mvCid;\n  final String? mvBvid;\n  final int? mvIndexOrder;\n  final int? mvFav;\n  final int? mvLikes;\n  final int? mvShares;\n  final String? mvCover;\n  final String? bgColor;\n  final String? mvLyric;\n  final bool? supportListen;\n  bool? wishListen;\n  int? wishCount;\n  final int? musicShares;\n  final String? musicSource;\n  final String? album;\n  final List<Artist>? artists;\n  final List<Artist>? artistsList;\n  final int? listenPv;\n  final List<String>? achievement;\n  final String? musicRank;\n  final int? maxListId;\n  final bool? showChosen;\n  final HotSongHeat? hotSongHeat;\n  final Rank? hotSongRank;\n  final Rank? creationRank;\n  final String? musicOutUrl;\n  //   final dynamic abTest;\n  final MusicComment? musicComment;\n  //   final dynamic musicMaterial;\n  final int? isNextgenActivity;\n  final int? isOriginal;\n  final int? musicHot;\n  final int? musicRelation;\n  final String? musicPublish;\n  //   final List<dynamic>? musicAchievementTimeline;\n  final FlowAttr? flowAttr;\n\n  factory MusicDetail.fromJson(Map<String, dynamic> json) {\n    return MusicDetail(\n      musicTitle: json[\"music_title\"],\n      originArtist: json[\"origin_artist\"],\n      originArtistList: json[\"origin_artist_list\"],\n      mvAid: json[\"mv_aid\"],\n      mvCid: json[\"mv_cid\"],\n      mvBvid: json[\"mv_bvid\"],\n      mvIndexOrder: json[\"mv_index_order\"],\n      mvFav: json[\"mv_fav\"],\n      mvLikes: json[\"mv_likes\"],\n      mvShares: json[\"mv_shares\"],\n      mvCover: json[\"mv_cover\"],\n      bgColor: json[\"bg_color\"],\n      mvLyric: json[\"mv_lyric\"],\n      supportListen: json[\"support_listen\"],\n      wishListen: json[\"wish_listen\"],\n      wishCount: json[\"wish_count\"],\n      musicShares: json[\"music_shares\"],\n      musicSource: json[\"music_source\"],\n      album: json[\"album\"],\n      artists: (json[\"artists\"] as List?)\n          ?.map((x) => Artist.fromJson(x))\n          .toList(),\n      artistsList: (json[\"artists_list\"] as List?)\n          ?.map((x) => Artist.fromJson(x))\n          .toList(),\n      listenPv: json[\"listen_pv\"],\n      achievement: (json[\"achievement\"] as List?)?.fromCast(),\n      musicRank: json[\"music_rank\"],\n      maxListId: json[\"max_list_id\"],\n      showChosen: json[\"show_chosen\"],\n      hotSongHeat: json[\"hot_song_heat\"] == null\n          ? null\n          : HotSongHeat.fromJson(json[\"hot_song_heat\"]),\n      hotSongRank: json[\"hot_song_rank\"] == null\n          ? null\n          : Rank.fromJson(json[\"hot_song_rank\"]),\n      creationRank: json[\"creation_rank\"] == null\n          ? null\n          : Rank.fromJson(json[\"creation_rank\"]),\n      musicOutUrl: json[\"music_out_url\"],\n      musicComment: json[\"music_comment\"] == null\n          ? null\n          : MusicComment.fromJson(json[\"music_comment\"]),\n      isNextgenActivity: json[\"is_nextgen_activity\"],\n      isOriginal: json[\"is_original\"],\n      musicHot: json[\"music_hot\"],\n      musicRelation: json[\"music_relation\"],\n      musicPublish: json[\"music_publish\"],\n      flowAttr: json[\"flow_attr\"] == null\n          ? null\n          : FlowAttr.fromJson(json[\"flow_attr\"]),\n    );\n  }\n}\n\nclass Artist extends Owner {\n  String? identity;\n  int? identifyType;\n\n  Artist.fromJson(Map<String, dynamic> json) : super.fromJson(json) {\n    identity = json[\"identity\"];\n    identifyType = json[\"identify_type\"];\n  }\n}\n\nclass Rank {\n  Rank({\n    required this.lastUpdate,\n    required this.highestRank,\n    required this.onListTimes,\n    required this.listDetail,\n  });\n\n  final int? lastUpdate;\n  final int? highestRank;\n  final int? onListTimes;\n  final List<ListDetail>? listDetail;\n\n  factory Rank.fromJson(Map<String, dynamic> json) {\n    return Rank(\n      lastUpdate: json[\"last_update\"],\n      highestRank: json[\"highest_rank\"],\n      onListTimes: json[\"on_list_times\"],\n      listDetail: (json[\"list_detail\"] as List?)\n          ?.map((x) => ListDetail.fromJson(x))\n          .toList(),\n    );\n  }\n}\n\nclass ListDetail {\n  ListDetail({\n    required this.date,\n    required this.rank,\n  });\n\n  final int? date;\n  final int? rank;\n\n  factory ListDetail.fromJson(Map<String, dynamic> json) {\n    return ListDetail(\n      date: json[\"date\"],\n      rank: json[\"rank\"],\n    );\n  }\n}\n\nclass FlowAttr {\n  FlowAttr({\n    required this.noShare,\n    required this.noComment,\n  });\n\n  final bool? noShare;\n  final bool? noComment;\n\n  factory FlowAttr.fromJson(Map<String, dynamic> json) {\n    return FlowAttr(\n      noShare: json[\"no_share\"],\n      noComment: json[\"no_comment\"],\n    );\n  }\n}\n\nclass HotSongHeat {\n  HotSongHeat({\n    required this.lastHeat,\n    required this.songHeat,\n  });\n\n  final int? lastHeat;\n  final List<SongHeat>? songHeat;\n\n  factory HotSongHeat.fromJson(Map<String, dynamic> json) {\n    return HotSongHeat(\n      lastHeat: json[\"last_heat\"],\n      songHeat: (json[\"song_heat\"] as List?)?.reversed\n          .map((x) => SongHeat.fromJson(x))\n          .toList(),\n    );\n  }\n}\n\nclass SongHeat {\n  SongHeat({\n    required this.date,\n    required this.heat,\n  });\n\n  final int date;\n  final int heat;\n\n  factory SongHeat.fromJson(Map<String, dynamic> json) {\n    return SongHeat(\n      date: json[\"date\"],\n      heat: json[\"heat\"],\n    );\n  }\n}\n\nclass MusicComment {\n  MusicComment({\n    required this.state,\n    required this.nums,\n    required this.oid,\n    required this.pageType,\n  });\n\n  final int? state;\n  final int? nums;\n  final int? oid;\n  final int? pageType;\n\n  factory MusicComment.fromJson(Map<String, dynamic> json) {\n    return MusicComment(\n      state: json[\"state\"],\n      nums: json[\"nums\"],\n      oid: json[\"oid\"],\n      pageType: json[\"page_type\"],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/models_new/music/bgm_recommend_list.dart",
    "content": "class BgmRecommend {\n  BgmRecommend({\n    required this.aid,\n    required this.bvid,\n    required this.indexOrder,\n    required this.cid,\n    required this.cover,\n    required this.title,\n    required this.mid,\n    required this.upNickName,\n    required this.play,\n    required this.vt,\n    required this.isVt,\n    required this.danmu,\n    required this.duration,\n    required this.label,\n    required this.labelList,\n    required this.isTop,\n    required this.showType,\n    required this.clickType,\n    required this.jumpUrl,\n    required this.vtDisplay,\n    required this.aidSource,\n    required this.tid,\n    required this.subTid,\n    required this.subTagName,\n    required this.coverMark,\n    // required this.districtLabel,\n  });\n\n  final int? aid;\n  final String? bvid;\n  final int? indexOrder;\n  final int? cid;\n  final String? cover;\n  final String? title;\n  final int? mid;\n  final String? upNickName;\n  final int? play;\n  final int? vt;\n  final int? isVt;\n  final int? danmu;\n  final int? duration;\n  final String? label;\n  final List<LabelList>? labelList;\n  final bool? isTop;\n  final int? showType;\n  final int? clickType;\n  final String? jumpUrl;\n  final String? vtDisplay;\n  final int? aidSource;\n  final int? tid;\n  final int? subTid;\n  final String? subTagName;\n  final CoverMark? coverMark;\n  // final dynamic districtLabel;\n\n  factory BgmRecommend.fromJson(Map<String, dynamic> json) {\n    return BgmRecommend(\n      aid: json[\"aid\"],\n      bvid: json[\"bvid\"],\n      indexOrder: json[\"index_order\"],\n      cid: json[\"cid\"],\n      cover: json[\"cover\"],\n      title: json[\"title\"],\n      mid: json[\"mid\"],\n      upNickName: json[\"up_nick_name\"],\n      play: json[\"play\"],\n      vt: json[\"vt\"],\n      isVt: json[\"is_vt\"],\n      danmu: json[\"danmu\"],\n      duration: json[\"duration\"],\n      label: json[\"label\"],\n      labelList: (json[\"label_list\"] as List?)\n          ?.map((x) => LabelList.fromJson(x))\n          .toList(),\n      isTop: json[\"is_top\"],\n      showType: json[\"show_type\"],\n      clickType: json[\"click_type\"],\n      jumpUrl: json[\"jump_url\"],\n      vtDisplay: json[\"vt_display\"],\n      aidSource: json[\"aid_source\"],\n      tid: json[\"tid\"],\n      subTid: json[\"sub_tid\"],\n      subTagName: json[\"sub_tag_name\"],\n      coverMark: json[\"cover_mark\"] == null\n          ? null\n          : CoverMark.fromJson(json[\"cover_mark\"]),\n      // districtLabel: json[\"district_label\"],\n    );\n  }\n}\n\nclass CoverMark {\n  CoverMark({\n    required this.name,\n    required this.value,\n  });\n\n  final String? name;\n  final String? value;\n\n  factory CoverMark.fromJson(Map<String, dynamic> json) {\n    return CoverMark(\n      name: json[\"name\"],\n      value: json[\"value\"],\n    );\n  }\n}\n\nclass LabelList {\n  LabelList({\n    required this.name,\n    required this.value,\n  });\n\n  final String? name;\n  final int? value;\n\n  factory LabelList.fromJson(Map<String, dynamic> json) {\n    return LabelList(\n      name: json[\"name\"],\n      value: json[\"value\"],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_index_condition/data.dart",
    "content": "import 'package:PiliPlus/models_new/pgc/pgc_index_condition/sort.dart';\n\nclass PgcIndexConditionData {\n  List<PgcConditionFilter>? filter;\n  List<PgcConditionOrder>? order;\n\n  PgcIndexConditionData({this.filter, this.order});\n\n  factory PgcIndexConditionData.fromJson(Map<String, dynamic> json) =>\n      PgcIndexConditionData(\n        filter: (json['filter'] as List<dynamic>?)\n            ?.map((e) => PgcConditionFilter.fromJson(e as Map<String, dynamic>))\n            .toList(),\n        order: (json['order'] as List<dynamic>?)\n            ?.map((e) => PgcConditionOrder.fromJson(e as Map<String, dynamic>))\n            .toList(),\n      );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_index_condition/sort.dart",
    "content": "import 'package:PiliPlus/models_new/pgc/pgc_index_condition/value.dart';\n\nclass PgcCondition {\n  String? field;\n  String? name;\n\n  PgcCondition({\n    this.field,\n    this.name,\n  });\n}\n\nclass PgcConditionFilter extends PgcCondition {\n  List<PgcConditionValue>? values;\n\n  PgcConditionFilter({super.field, super.name, this.values});\n\n  factory PgcConditionFilter.fromJson(Map<String, dynamic> json) =>\n      PgcConditionFilter(\n        field: json['field'] as String?,\n        name: json['name'] as String?,\n        values: (json['values'] as List<dynamic>?)\n            ?.map((e) => PgcConditionValue.fromJson(e as Map<String, dynamic>))\n            .toList(),\n      );\n}\n\nclass PgcConditionOrder extends PgcCondition {\n  String? sort;\n\n  PgcConditionOrder({super.field, super.name, this.sort});\n\n  factory PgcConditionOrder.fromJson(Map<String, dynamic> json) =>\n      PgcConditionOrder(\n        field: json['field'] as String?,\n        name: json['name'] as String?,\n        sort: json['sort'] as String?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_index_condition/value.dart",
    "content": "class PgcConditionValue {\n  String? keyword;\n  String? name;\n\n  PgcConditionValue({\n    this.keyword,\n    this.name,\n  });\n\n  PgcConditionValue.fromJson(Map json) {\n    keyword = json['keyword'];\n    name = json['name'];\n  }\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_index_result/badge_info.dart",
    "content": "class BadgeInfo {\n  String? bgColor;\n  String? bgColorNight;\n  String? text;\n\n  BadgeInfo({this.bgColor, this.bgColorNight, this.text});\n\n  factory BadgeInfo.fromJson(Map<String, dynamic> json) => BadgeInfo(\n    bgColor: json['bg_color'] as String?,\n    bgColorNight: json['bg_color_night'] as String?,\n    text: json['text'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_index_result/data.dart",
    "content": "import 'package:PiliPlus/models_new/pgc/pgc_index_result/list.dart';\n\nclass PgcIndexResult {\n  int? hasNext;\n  List<PgcIndexItem>? list;\n  int? num;\n  int? size;\n  int? total;\n\n  PgcIndexResult({this.hasNext, this.list, this.num, this.size, this.total});\n\n  factory PgcIndexResult.fromJson(Map<String, dynamic> json) => PgcIndexResult(\n    hasNext: json['has_next'] as int?,\n    list: (json['list'] as List<dynamic>?)\n        ?.map((e) => PgcIndexItem.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    num: json['num'] as int?,\n    size: json['size'] as int?,\n    total: json['total'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_index_result/first_ep.dart",
    "content": "class FirstEp {\n  String? cover;\n  int? epId;\n\n  FirstEp({this.cover, this.epId});\n\n  factory FirstEp.fromJson(Map<String, dynamic> json) => FirstEp(\n    cover: json['cover'] as String?,\n    epId: json['ep_id'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_index_result/list.dart",
    "content": "import 'package:PiliPlus/models_new/pgc/pgc_index_result/badge_info.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_index_result/first_ep.dart';\n\nclass PgcIndexItem {\n  String? badge;\n  BadgeInfo? badgeInfo;\n  int? badgeType;\n  String? cover;\n  FirstEp? firstEp;\n  String? indexShow;\n  int? isFinish;\n  String? link;\n  int? mediaId;\n  String? order;\n  String? orderType;\n  String? score;\n  int? seasonId;\n  int? seasonStatus;\n  int? seasonType;\n  String? subTitle;\n  String? title;\n  String? titleIcon;\n\n  PgcIndexItem({\n    this.badge,\n    this.badgeInfo,\n    this.badgeType,\n    this.cover,\n    this.firstEp,\n    this.indexShow,\n    this.isFinish,\n    this.link,\n    this.mediaId,\n    this.order,\n    this.orderType,\n    this.score,\n    this.seasonId,\n    this.seasonStatus,\n    this.seasonType,\n    this.subTitle,\n    this.title,\n    this.titleIcon,\n  });\n\n  factory PgcIndexItem.fromJson(Map<String, dynamic> json) => PgcIndexItem(\n    badge: json['badge'] as String?,\n    badgeInfo: json['badge_info'] == null\n        ? null\n        : BadgeInfo.fromJson(json['badge_info'] as Map<String, dynamic>),\n    badgeType: json['badge_type'] as int?,\n    cover: json['cover'] as String?,\n    firstEp: json['first_ep'] == null\n        ? null\n        : FirstEp.fromJson(json['first_ep'] as Map<String, dynamic>),\n    indexShow: json['index_show'] as String?,\n    isFinish: json['is_finish'] as int?,\n    link: json['link'] as String?,\n    mediaId: json['media_id'] as int?,\n    order: json['order'] as String?,\n    orderType: json['order_type'] as String?,\n    score: json['score'] as String?,\n    seasonId: json['season_id'] as int?,\n    seasonStatus: json['season_status'] as int?,\n    seasonType: json['season_type'] as int?,\n    subTitle: json['subTitle'] as String?,\n    title: json['title'] as String?,\n    titleIcon: json['title_icon'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_info_model/activity.dart",
    "content": "class Activity {\n  String? headBgUrl;\n  int? id;\n  String? title;\n\n  Activity({this.headBgUrl, this.id, this.title});\n\n  factory Activity.fromJson(Map<String, dynamic> json) => Activity(\n    headBgUrl: json['head_bg_url'] as String?,\n    id: json['id'] as int?,\n    title: json['title'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_info_model/area.dart",
    "content": "class Area {\n  int? id;\n  String? name;\n\n  Area({this.id, this.name});\n\n  factory Area.fromJson(Map<String, dynamic> json) => Area(\n    id: json['id'] as int?,\n    name: json['name'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_info_model/badge_info.dart",
    "content": "class BadgeInfo {\n  String? bgColor;\n  String? bgColorNight;\n  String? text;\n\n  BadgeInfo({this.bgColor, this.bgColorNight, this.text});\n\n  factory BadgeInfo.fromJson(Map<String, dynamic> json) => BadgeInfo(\n    bgColor: json['bg_color'] as String?,\n    bgColorNight: json['bg_color_night'] as String?,\n    text: json['text'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_info_model/brief.dart",
    "content": "class Brief {\n  List<Img>? img;\n\n  Brief({\n    this.img,\n  });\n\n  factory Brief.fromJson(Map<String, dynamic> json) => Brief(\n    img: (json['img'] as List?)?.map((e) => Img.fromJson(e)).toList(),\n  );\n}\n\nclass Img {\n  num aspectRatio;\n  String? url;\n\n  Img({\n    required this.aspectRatio,\n    this.url,\n  });\n\n  factory Img.fromJson(Map<String, dynamic> json) => Img(\n    aspectRatio: json['aspect_ratio'] ?? 1,\n    url: json['url'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_info_model/cooperator.dart",
    "content": "class Cooperator {\n  int? mid;\n  String? avatar;\n  String? nickName;\n  String? role;\n\n  Cooperator({\n    this.mid,\n    this.avatar,\n    this.nickName,\n    this.role,\n  });\n\n  factory Cooperator.fromJson(Map<String, dynamic> json) => Cooperator(\n    mid: json['mid'] as int?,\n    avatar: json['avatar'] as String?,\n    nickName: json['nick_name'] as String?,\n    role: json['role'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_info_model/danmaku.dart",
    "content": "class Danmaku {\n  String? icon;\n  String? pureText;\n  String? text;\n  int? value;\n\n  Danmaku({this.icon, this.pureText, this.text, this.value});\n\n  factory Danmaku.fromJson(Map<String, dynamic> json) => Danmaku(\n    icon: json['icon'] as String?,\n    pureText: json['pure_text'] as String?,\n    text: json['text'] as String?,\n    value: json['value'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_info_model/ed.dart",
    "content": "class Ed {\n  int? end;\n  int? start;\n\n  Ed({this.end, this.start});\n\n  factory Ed.fromJson(Map<String, dynamic> json) => Ed(\n    end: json['end'] as int?,\n    start: json['start'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_info_model/episode.dart",
    "content": "import 'package:PiliPlus/models_new/pgc/pgc_info_model/badge_info.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/rights.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/skip.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/dimension.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/episode.dart'\n    show BaseEpisodeItem;\n\nclass EpisodeItem extends BaseEpisodeItem {\n  BadgeInfo? badgeInfo;\n  int? badgeType;\n  Dimension? dimension;\n  int? duration; // pgc: millisec , pugv: sec\n  bool? enableVt;\n  String? from;\n  bool? isViewHide;\n  String? link;\n  String? longTitle;\n  int? pubTime;\n  int? pv;\n  // String? releaseDate;\n  Rights? rights;\n  int? sectionType;\n  String? shareCopy;\n  String? shareUrl;\n  String? shortLink;\n  bool? showDrmLoginDialog;\n  String? showTitle;\n  Skip? skip;\n  int? status;\n  String? subtitle;\n  String? vid;\n  int? play;\n\n  EpisodeItem({\n    super.aid,\n    super.badge,\n    this.badgeInfo,\n    this.badgeType,\n    super.bvid,\n    super.cid,\n    super.cover,\n    this.dimension,\n    this.duration,\n    this.enableVt,\n    super.epId,\n    this.from,\n    super.id,\n    this.isViewHide,\n    this.link,\n    this.longTitle,\n    this.pubTime,\n    this.pv,\n    // this.releaseDate,\n    this.rights,\n    this.sectionType,\n    this.shareCopy,\n    this.shareUrl,\n    this.shortLink,\n    this.showDrmLoginDialog,\n    this.showTitle,\n    this.skip,\n    this.status,\n    this.subtitle,\n    super.title,\n    this.vid,\n    this.play,\n  });\n\n  factory EpisodeItem.fromJson(Map<String, dynamic> json) => EpisodeItem(\n    aid: json['aid'] as int?,\n    badge: json['badge'] as String?,\n    badgeInfo: json['badge_info'] == null\n        ? null\n        : BadgeInfo.fromJson(json['badge_info'] as Map<String, dynamic>),\n    badgeType: json['badge_type'] as int?,\n    bvid: json['bvid'] as String?,\n    cid: json['cid'] as int?,\n    cover: json['cover'] as String?,\n    dimension: json['dimension'] == null\n        ? null\n        : Dimension.fromJson(json['dimension'] as Map<String, dynamic>),\n    duration: json['duration'] as int?,\n    enableVt: json['enable_vt'] as bool?,\n    epId: json['ep_id'] as int?,\n    from: json['from'] as String?,\n    id: json['id'] as int?,\n    isViewHide: json['is_view_hide'] as bool?,\n    link: json['link'] as String?,\n    longTitle: json['long_title'] as String?,\n    pubTime: json['pub_time'] ?? json['release_date'],\n    pv: json['pv'] as int?,\n    // releaseDate: json['release_date'] as String?,\n    rights: json['rights'] == null\n        ? null\n        : Rights.fromJson(json['rights'] as Map<String, dynamic>),\n    sectionType: json['section_type'] as int?,\n    shareCopy: json['share_copy'] as String?,\n    shareUrl: json['share_url'] as String?,\n    shortLink: json['short_link'] as String?,\n    showDrmLoginDialog: json['showDrmLoginDialog'] as bool?,\n    showTitle: json['show_title'] as String?,\n    skip: json['skip'] == null\n        ? null\n        : Skip.fromJson(json['skip'] as Map<String, dynamic>),\n    status: json['status'] as int?,\n    subtitle: json['subtitle'] as String?,\n    title: json['title'] as String?,\n    vid: json['vid'] as String?,\n    play: json['play'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_info_model/icon_font.dart",
    "content": "class IconFont {\n  String? name;\n  String? text;\n\n  IconFont({this.name, this.text});\n\n  factory IconFont.fromJson(Map<String, dynamic> json) => IconFont(\n    name: json['name'] as String?,\n    text: json['text'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_info_model/new_ep.dart",
    "content": "class NewEp {\n  String? desc;\n  int? id;\n  int? isNew;\n  String? title;\n\n  NewEp({this.desc, this.id, this.isNew, this.title});\n\n  factory NewEp.fromJson(Map<String, dynamic> json) => NewEp(\n    desc: json['desc'] as String?,\n    id: json['id'] as int?,\n    isNew: json['is_new'] as int?,\n    title: json['title'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_info_model/op.dart",
    "content": "class Op {\n  int? end;\n  int? start;\n\n  Op({this.end, this.start});\n\n  factory Op.fromJson(Map<String, dynamic> json) => Op(\n    end: json['end'] as int?,\n    start: json['start'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_info_model/publish.dart",
    "content": "class Publish {\n  int? isFinish;\n  int? isStarted;\n  String? pubTime;\n  String? pubTimeShow;\n  int? unknowPubDate;\n  int? weekday;\n\n  Publish({\n    this.isFinish,\n    this.isStarted,\n    this.pubTime,\n    this.pubTimeShow,\n    this.unknowPubDate,\n    this.weekday,\n  });\n\n  factory Publish.fromJson(Map<String, dynamic> json) => Publish(\n    isFinish: json['is_finish'] as int?,\n    isStarted: json['is_started'] as int?,\n    pubTime: json['pub_time'] as String?,\n    pubTimeShow: json['pub_time_show'] as String?,\n    unknowPubDate: json['unknow_pub_date'] as int?,\n    weekday: json['weekday'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_info_model/rating.dart",
    "content": "class Rating {\n  int? count;\n  double? score;\n\n  Rating({this.count, this.score});\n\n  factory Rating.fromJson(Map<String, dynamic> json) => Rating(\n    count: json['count'] as int?,\n    score: (json['score'] as num?)?.toDouble(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_info_model/result.dart",
    "content": "import 'package:PiliPlus/models_new/pgc/pgc_info_model/activity.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/area.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/brief.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/cooperator.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/episode.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/icon_font.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/new_ep.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/publish.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/rating.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/rights.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/season.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/section.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/series.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/stat.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/up_info.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/user_status.dart';\n\nclass PgcInfoModel {\n  Activity? activity;\n  String? actors;\n  String? alias;\n  List<Area>? areas;\n  String? bkgCover;\n  String? cover;\n  bool? enableVt;\n  List<EpisodeItem>? episodes;\n  String? evaluate;\n  int? hideEpVvVtDm;\n  IconFont? iconFont;\n  String? jpTitle;\n  String? link;\n  int? mediaId;\n  int? mode;\n  NewEp? newEp;\n  Publish? publish;\n  Rating? rating;\n  String? record;\n  Rights? rights;\n  int? seasonId;\n  String? seasonTitle;\n  List<Season>? seasons;\n  List<Section>? section;\n  Series? series;\n  String? shareCopy;\n  String? shareSubTitle;\n  String? shareUrl;\n  int? showSeasonType;\n  String? squareCover;\n  String? staff;\n  PgcStat? stat;\n  int? status;\n  String? subtitle;\n  String? title;\n  int? total;\n  int? type;\n  UpInfo? upInfo;\n  UserStatus? userStatus;\n  List<Cooperator>? cooperators;\n  Brief? brief;\n\n  PgcInfoModel({\n    this.activity,\n    this.actors,\n    this.alias,\n    this.areas,\n    this.bkgCover,\n    this.cover,\n    this.enableVt,\n    this.episodes,\n    this.evaluate,\n    this.hideEpVvVtDm,\n    this.iconFont,\n    this.jpTitle,\n    this.link,\n    this.mediaId,\n    this.mode,\n    this.newEp,\n    this.publish,\n    this.rating,\n    this.record,\n    this.rights,\n    this.seasonId,\n    this.seasonTitle,\n    this.seasons,\n    this.section,\n    this.series,\n    this.shareCopy,\n    this.shareSubTitle,\n    this.shareUrl,\n    this.showSeasonType,\n    this.squareCover,\n    this.staff,\n    this.stat,\n    this.status,\n    this.subtitle,\n    this.title,\n    this.total,\n    this.type,\n    this.upInfo,\n    this.userStatus,\n    this.cooperators,\n    this.brief,\n  });\n\n  factory PgcInfoModel.fromJson(Map<String, dynamic> json) => PgcInfoModel(\n    activity: json['activity'] == null\n        ? null\n        : Activity.fromJson(json['activity'] as Map<String, dynamic>),\n    actors: json['actors'] as String?,\n    alias: json['alias'] as String?,\n    areas: (json['areas'] as List<dynamic>?)\n        ?.map((e) => Area.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    bkgCover: json['bkg_cover'] as String?,\n    cover: json['cover'] as String?,\n    enableVt: json['enable_vt'] as bool?,\n    episodes: (json['episodes'] as List<dynamic>?)\n        ?.map((e) => EpisodeItem.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    evaluate: json['evaluate'] as String?,\n    hideEpVvVtDm: json['hide_ep_vv_vt_dm'] as int?,\n    iconFont: json['icon_font'] == null\n        ? null\n        : IconFont.fromJson(json['icon_font'] as Map<String, dynamic>),\n    jpTitle: json['jp_title'] as String?,\n    link: json['link'] as String?,\n    mediaId: json['media_id'] as int?,\n    mode: json['mode'] as int?,\n    newEp: json['new_ep'] == null\n        ? null\n        : NewEp.fromJson(json['new_ep'] as Map<String, dynamic>),\n    publish: json['publish'] == null\n        ? null\n        : Publish.fromJson(json['publish'] as Map<String, dynamic>),\n    rating: json['rating'] == null\n        ? null\n        : Rating.fromJson(json['rating'] as Map<String, dynamic>),\n    record: json['record'] as String?,\n    rights: json['rights'] == null\n        ? null\n        : Rights.fromJson(json['rights'] as Map<String, dynamic>),\n    seasonId: json['season_id'] as int?,\n    seasonTitle: json['season_title'] as String?,\n    seasons: (json['seasons'] as List<dynamic>?)\n        ?.map((e) => Season.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    section: (json['section'] as List<dynamic>?)\n        ?.map((e) => Section.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    series: json['series'] == null\n        ? null\n        : Series.fromJson(json['series'] as Map<String, dynamic>),\n    shareCopy: json['share_copy'] as String?,\n    shareSubTitle: json['share_sub_title'] as String?,\n    shareUrl: json['share_url'] as String?,\n    showSeasonType: json['show_season_type'] as int?,\n    squareCover: json['square_cover'] as String?,\n    staff: json['staff'] as String?,\n    stat: json['stat'] == null\n        ? null\n        : PgcStat.fromJson(json['stat'] as Map<String, dynamic>),\n    status: json['status'] as int?,\n    subtitle: json['subtitle'] as String?,\n    title: json['title'] as String?,\n    total: json['total'] as int?,\n    type: json['type'] as int?,\n    upInfo: json['up_info'] == null\n        ? null\n        : UpInfo.fromJson(json['up_info'] as Map<String, dynamic>),\n    userStatus: json['user_status'] == null\n        ? null\n        : UserStatus.fromJson(json['user_status'] as Map<String, dynamic>),\n    cooperators: (json['cooperators'] as List?)\n        ?.map((e) => Cooperator.fromJson(e))\n        .toList(),\n    brief: json['brief'] == null\n        ? null\n        : Brief.fromJson(json['brief'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_info_model/rights.dart",
    "content": "class Rights {\n  int? allowDm;\n  int? allowDownload;\n  int? areaLimit;\n\n  Rights({this.allowDm, this.allowDownload, this.areaLimit});\n\n  factory Rights.fromJson(Map<String, dynamic> json) => Rights(\n    allowDm: json['allow_dm'] as int?,\n    allowDownload: json['allow_download'] as int?,\n    areaLimit: json['area_limit'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_info_model/season.dart",
    "content": "import 'package:PiliPlus/models_new/pgc/pgc_info_model/badge_info.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/icon_font.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/new_ep.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/stat.dart';\n\nclass Season {\n  String? badge;\n  BadgeInfo? badgeInfo;\n  int? badgeType;\n  String? cover;\n  bool? enableVt;\n  String? horizontalCover1610;\n  String? horizontalCover169;\n  IconFont? iconFont;\n  int? mediaId;\n  NewEp? newEp;\n  int? seasonId;\n  String? seasonTitle;\n  int? seasonType;\n  PgcStat? stat;\n\n  Season({\n    this.badge,\n    this.badgeInfo,\n    this.badgeType,\n    this.cover,\n    this.enableVt,\n    this.horizontalCover1610,\n    this.horizontalCover169,\n    this.iconFont,\n    this.mediaId,\n    this.newEp,\n    this.seasonId,\n    this.seasonTitle,\n    this.seasonType,\n    this.stat,\n  });\n\n  factory Season.fromJson(Map<String, dynamic> json) => Season(\n    badge: json['badge'] as String?,\n    badgeInfo: json['badge_info'] == null\n        ? null\n        : BadgeInfo.fromJson(json['badge_info'] as Map<String, dynamic>),\n    badgeType: json['badge_type'] as int?,\n    cover: json['cover'] as String?,\n    enableVt: json['enable_vt'] as bool?,\n    horizontalCover1610: json['horizontal_cover_1610'] as String?,\n    horizontalCover169: json['horizontal_cover_169'] as String?,\n    iconFont: json['icon_font'] == null\n        ? null\n        : IconFont.fromJson(json['icon_font'] as Map<String, dynamic>),\n    mediaId: json['media_id'] as int?,\n    newEp: json['new_ep'] == null\n        ? null\n        : NewEp.fromJson(json['new_ep'] as Map<String, dynamic>),\n    seasonId: json['season_id'] as int?,\n    seasonTitle: json['season_title'] as String?,\n    seasonType: json['season_type'] as int?,\n    stat: json['stat'] == null\n        ? null\n        : PgcStat.fromJson(json['stat'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_info_model/section.dart",
    "content": "import 'package:PiliPlus/models_new/pgc/pgc_info_model/episode.dart';\n\nclass Section {\n  int? attr;\n  int? episodeId;\n  List<dynamic>? episodeIds;\n  List<EpisodeItem>? episodes;\n  int? id;\n  String? title;\n  int? type;\n  int? type2;\n\n  Section({\n    this.attr,\n    this.episodeId,\n    this.episodeIds,\n    this.episodes,\n    this.id,\n    this.title,\n    this.type,\n    this.type2,\n  });\n\n  factory Section.fromJson(Map<String, dynamic> json) => Section(\n    attr: json['attr'] as int?,\n    episodeId: json['episode_id'] as int?,\n    episodeIds: json['episode_ids'] as List<dynamic>?,\n    episodes: (json['episodes'] as List<dynamic>?)\n        ?.map((e) => EpisodeItem.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    id: json['id'] as int?,\n    title: json['title'] as String?,\n    type: json['type'] as int?,\n    type2: json['type2'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_info_model/series.dart",
    "content": "class Series {\n  int? displayType;\n  int? seriesId;\n  String? seriesTitle;\n\n  Series({this.displayType, this.seriesId, this.seriesTitle});\n\n  factory Series.fromJson(Map<String, dynamic> json) => Series(\n    displayType: json['display_type'] as int?,\n    seriesId: json['series_id'] as int?,\n    seriesTitle: json['series_title'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_info_model/skip.dart",
    "content": "import 'package:PiliPlus/models_new/pgc/pgc_info_model/ed.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/op.dart';\n\nclass Skip {\n  Ed? ed;\n  Op? op;\n\n  Skip({this.ed, this.op});\n\n  factory Skip.fromJson(Map<String, dynamic> json) => Skip(\n    ed: json['ed'] == null\n        ? null\n        : Ed.fromJson(json['ed'] as Map<String, dynamic>),\n    op: json['op'] == null\n        ? null\n        : Op.fromJson(json['op'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_info_model/stat.dart",
    "content": "import 'package:PiliPlus/models_new/video/video_detail/stat_detail.dart';\n\nclass PgcStat extends StatDetail {\n  int? favorites;\n  String? followText;\n\n  PgcStat.fromJson(Map<String, dynamic> json) {\n    coin = json[\"coins\"] ?? 0;\n    danmaku = json[\"danmakus\"];\n    favorite = json[\"favorite\"] ?? 0;\n    favorites = json[\"favorites\"];\n    followText = json[\"follow_text\"];\n    like = json[\"likes\"] ?? 0;\n    reply = json[\"reply\"];\n    share = json[\"share\"];\n    view = json[\"views\"];\n    vt = json[\"vt\"];\n  }\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_info_model/stat_for_unity.dart",
    "content": "import 'package:PiliPlus/models_new/pgc/pgc_info_model/danmaku.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/vt.dart';\n\nclass StatForUnity {\n  num? coin;\n  Danmaku? danmaku;\n  int? likes;\n  int? reply;\n  Vt? vt;\n\n  StatForUnity({this.coin, this.danmaku, this.likes, this.reply, this.vt});\n\n  factory StatForUnity.fromJson(Map<String, dynamic> json) => StatForUnity(\n    coin: json['coin'] as num?,\n    danmaku: json['danmaku'] == null\n        ? null\n        : Danmaku.fromJson(json['danmaku'] as Map<String, dynamic>),\n    likes: json['likes'] as int?,\n    reply: json['reply'] as int?,\n    vt: json['vt'] == null\n        ? null\n        : Vt.fromJson(json['vt'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_info_model/up_info.dart",
    "content": "class UpInfo {\n  String? avatar;\n  String? avatarSubscriptUrl;\n  int? follower;\n  int? isFollow;\n  int? mid;\n  String? nicknameColor;\n  int? themeType;\n  String? uname;\n  int? verifyType;\n  int? vipStatus;\n  int? vipType;\n\n  UpInfo({\n    this.avatar,\n    this.avatarSubscriptUrl,\n    this.follower,\n    this.isFollow,\n    this.mid,\n    this.nicknameColor,\n    this.themeType,\n    this.uname,\n    this.verifyType,\n    this.vipStatus,\n    this.vipType,\n  });\n\n  factory UpInfo.fromJson(Map<String, dynamic> json) => UpInfo(\n    avatar: json['avatar'] as String?,\n    avatarSubscriptUrl: json['avatar_subscript_url'] as String?,\n    follower: json['follower'] as int?,\n    isFollow: json['is_follow'] as int?,\n    mid: json['mid'] as int?,\n    nicknameColor: json['nickname_color'] as String?,\n    themeType: json['theme_type'] as int?,\n    uname: json['uname'] as String?,\n    verifyType: json['verify_type'] as int?,\n    vipStatus: json['vip_status'] as int?,\n    vipType: json['vip_type'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_info_model/user_progress.dart",
    "content": "class UserProgress {\n  UserProgress({\n    this.lastEpId,\n    this.lastEpIndex,\n    this.lastTime,\n  });\n  int? lastEpId;\n  String? lastEpIndex;\n  int? lastTime;\n  UserProgress.fromJson(Map<String, dynamic> json) {\n    lastEpId = json['last_ep_id'];\n    lastEpIndex = json['last_ep_index'];\n    lastTime = json['last_time'];\n  }\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_info_model/user_status.dart",
    "content": "import 'package:PiliPlus/models_new/pgc/pgc_info_model/user_progress.dart';\n\nclass UserStatus {\n  int? areaLimit;\n  int? banAreaShow;\n  int? follow;\n  int? followStatus;\n  int? login;\n  int? pay;\n  int? payPackPaid;\n  int? sponsor;\n  UserProgress? progress;\n  int? favored;\n\n  UserStatus({\n    this.areaLimit,\n    this.banAreaShow,\n    this.follow,\n    this.followStatus,\n    this.login,\n    this.pay,\n    this.payPackPaid,\n    this.sponsor,\n    this.progress,\n    this.favored,\n  });\n\n  factory UserStatus.fromJson(Map<String, dynamic> json) => UserStatus(\n    areaLimit: json['area_limit'] as int?,\n    banAreaShow: json['ban_area_show'] as int?,\n    follow: json['follow'] as int?,\n    followStatus: json['follow_status'] as int?,\n    login: json['login'] as int?,\n    pay: json['pay'] as int?,\n    payPackPaid: json['pay_pack_paid'] as int?,\n    sponsor: json['sponsor'] as int?,\n    progress: json['progress'] == null\n        ? null\n        : UserProgress.fromJson(json['progress']),\n    favored: json['favored'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_info_model/vt.dart",
    "content": "class Vt {\n  String? icon;\n  String? pureText;\n  String? text;\n  int? value;\n\n  Vt({this.icon, this.pureText, this.text, this.value});\n\n  factory Vt.fromJson(Map<String, dynamic> json) => Vt(\n    icon: json['icon'] as String?,\n    pureText: json['pure_text'] as String?,\n    text: json['text'] as String?,\n    value: json['value'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_rank/badge_info.dart",
    "content": "class BadgeInfo {\n  String? bgColor;\n  String? bgColorNight;\n  String? text;\n\n  BadgeInfo({this.bgColor, this.bgColorNight, this.text});\n\n  factory BadgeInfo.fromJson(Map<String, dynamic> json) => BadgeInfo(\n    bgColor: json['bg_color'] as String?,\n    bgColorNight: json['bg_color_night'] as String?,\n    text: json['text'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_rank/data.dart",
    "content": "import 'package:PiliPlus/models_new/pgc/pgc_rank/pgc_rank_item_model.dart';\n\nclass Data {\n  List<PgcRankItemModel>? list;\n  String? note;\n  int? seasonType;\n\n  Data({this.list, this.note, this.seasonType});\n\n  factory Data.fromJson(Map<String, dynamic> json) => Data(\n    list: (json['list'] as List<dynamic>?)\n        ?.map((e) => PgcRankItemModel.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    note: json['note'] as String?,\n    seasonType: json['season_type'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_rank/icon_font.dart",
    "content": "class IconFont {\n  String? name;\n  String? text;\n\n  IconFont({this.name, this.text});\n\n  factory IconFont.fromJson(Map<String, dynamic> json) => IconFont(\n    name: json['name'] as String?,\n    text: json['text'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_rank/new_ep.dart",
    "content": "class NewEp {\n  String? cover;\n  String? indexShow;\n\n  NewEp({this.cover, this.indexShow});\n\n  factory NewEp.fromJson(Map<String, dynamic> json) => NewEp(\n    cover: json['cover'] as String?,\n    indexShow: json['index_show'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_rank/pgc_rank_item_model.dart",
    "content": "import 'package:PiliPlus/models_new/pgc/pgc_rank/badge_info.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_rank/icon_font.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_rank/new_ep.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_rank/stat.dart';\n\nclass PgcRankItemModel {\n  String? badge;\n  BadgeInfo? badgeInfo;\n  int? badgeType;\n  String? cover;\n  String? desc;\n  bool? enableVt;\n  IconFont? iconFont;\n  NewEp? newEp;\n  int? rank;\n  String? rating;\n  int? seasonId;\n  String? ssHorizontalCover;\n  Stat? stat;\n  String? title;\n  String? url;\n\n  PgcRankItemModel({\n    this.badge,\n    this.badgeInfo,\n    this.badgeType,\n    this.cover,\n    this.desc,\n    this.enableVt,\n    this.iconFont,\n    this.newEp,\n    this.rank,\n    this.rating,\n    this.seasonId,\n    this.ssHorizontalCover,\n    this.stat,\n    this.title,\n    this.url,\n  });\n\n  factory PgcRankItemModel.fromJson(Map<String, dynamic> json) =>\n      PgcRankItemModel(\n        badge: json['badge'] as String?,\n        badgeInfo: json['badge_info'] == null\n            ? null\n            : BadgeInfo.fromJson(json['badge_info'] as Map<String, dynamic>),\n        badgeType: json['badge_type'] as int?,\n        cover: json['cover'] as String?,\n        desc: json['desc'] as String?,\n        enableVt: json['enable_vt'] as bool?,\n        iconFont: json['icon_font'] == null\n            ? null\n            : IconFont.fromJson(json['icon_font'] as Map<String, dynamic>),\n        newEp: json['new_ep'] == null\n            ? null\n            : NewEp.fromJson(json['new_ep'] as Map<String, dynamic>),\n        rank: json['rank'] as int?,\n        rating: json['rating'] as String?,\n        seasonId: json['season_id'] as int?,\n        ssHorizontalCover: json['ss_horizontal_cover'] as String?,\n        stat: json['stat'] == null\n            ? null\n            : Stat.fromJson(json['stat'] as Map<String, dynamic>),\n        title: json['title'] as String?,\n        url: json['url'] as String?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_rank/stat.dart",
    "content": "class Stat {\n  int? danmaku;\n  int? follow;\n  int? seriesFollow;\n  int? view;\n\n  Stat({this.danmaku, this.follow, this.seriesFollow, this.view});\n\n  factory Stat.fromJson(Map<String, dynamic> json) => Stat(\n    danmaku: json['danmaku'] as int?,\n    follow: (json['follow'] as int?) ?? 0,\n    seriesFollow: json['series_follow'] as int?,\n    view: (json['view'] as int?) ?? 0,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_review/author.dart",
    "content": "import 'package:PiliPlus/models/model_avatar.dart' show Vip;\n\nclass Author {\n  String? avatar;\n  int? level;\n  int? mid;\n  String? uname;\n  Vip? vip;\n\n  Author({\n    this.avatar,\n    this.level,\n    this.mid,\n    this.uname,\n    this.vip,\n  });\n\n  factory Author.fromJson(Map<String, dynamic> json) => Author(\n    avatar: json['avatar'] as String?,\n    level: json['level'] as int?,\n    mid: json['mid'] as int?,\n    uname: json['uname'] as String?,\n    vip: json['vip'] == null\n        ? null\n        : Vip.fromJson(json['vip'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_review/data.dart",
    "content": "import 'package:PiliPlus/models_new/pgc/pgc_review/list.dart';\n\nclass PgcReviewData {\n  List<PgcReviewItemModel>? list;\n  String? next;\n  int? count;\n\n  PgcReviewData({this.list, this.next, this.count});\n\n  factory PgcReviewData.fromJson(Map<String, dynamic> json) => PgcReviewData(\n    list: (json['list'] as List<dynamic>?)\n        ?.map((e) => PgcReviewItemModel.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    next: json['next'] as String?,\n    count: json['count'] ?? json['total'],\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_review/list.dart",
    "content": "import 'package:PiliPlus/models_new/pgc/pgc_review/author.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_review/stat.dart';\n\nclass PgcReviewItemModel {\n  Author? author;\n  String? title;\n  String? content;\n  int? ctime;\n  int? mediaId;\n  int? mid;\n  int? mtime;\n  String? progress;\n  String? pushTimeStr;\n  int? reviewId;\n  late int score;\n  Stat? stat;\n  int? articleId;\n\n  PgcReviewItemModel({\n    this.author,\n    this.title,\n    this.content,\n    this.ctime,\n    this.mediaId,\n    this.mid,\n    this.mtime,\n    this.progress,\n    this.pushTimeStr,\n    this.reviewId,\n    required this.score,\n    this.stat,\n    this.articleId,\n  });\n\n  factory PgcReviewItemModel.fromJson(Map<String, dynamic> json) =>\n      PgcReviewItemModel(\n        articleId: json['article_id'],\n        author: json['author'] == null\n            ? null\n            : Author.fromJson(json['author'] as Map<String, dynamic>),\n        title: json['title'] as String?,\n        content: json['content'] as String?,\n        ctime: json['ctime'] as int?,\n        mediaId: json['media_id'] as int?,\n        mid: json['mid'] as int?,\n        mtime: json['mtime'] as int?,\n        progress: json['progress'] as String?,\n        pushTimeStr: json['push_time_str'] as String?,\n        reviewId: json['review_id'] as int?,\n        score: json['score'] == null ? 0 : json['score'] ~/ 2,\n        stat: json['stat'] == null\n            ? null\n            : Stat.fromJson(json['stat'] as Map<String, dynamic>),\n      );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_review/stat.dart",
    "content": "class Stat {\n  int? disliked;\n  int? liked;\n  int? likes;\n\n  Stat({this.disliked, this.liked, this.likes});\n\n  factory Stat.fromJson(Map<String, dynamic> json) => Stat(\n    disliked: json['disliked'] as int?,\n    liked: json['liked'] as int?,\n    likes: json['likes'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_timeline/episode.dart",
    "content": "import 'package:PiliPlus/models_new/pgc/pgc_timeline/icon_font.dart';\n\nclass Episode {\n  String? cover;\n  int? delay;\n  int? delayId;\n  String? delayIndex;\n  String? delayReason;\n  bool? enableVt;\n  String? epCover;\n  int? episodeId;\n  int? follow;\n  String? follows;\n  IconFont? iconFont;\n  String? plays;\n  String? pubIndex;\n  String? pubTime;\n  int? pubTs;\n  int? published;\n  int? seasonId;\n  String? squareCover;\n  String? title;\n\n  Episode({\n    this.cover,\n    this.delay,\n    this.delayId,\n    this.delayIndex,\n    this.delayReason,\n    this.enableVt,\n    this.epCover,\n    this.episodeId,\n    this.follow,\n    this.follows,\n    this.iconFont,\n    this.plays,\n    this.pubIndex,\n    this.pubTime,\n    this.pubTs,\n    this.published,\n    this.seasonId,\n    this.squareCover,\n    this.title,\n  });\n\n  factory Episode.fromJson(Map<String, dynamic> json) => Episode(\n    cover: json['cover'] as String?,\n    delay: json['delay'] as int?,\n    delayId: json['delay_id'] as int?,\n    delayIndex: json['delay_index'] as String?,\n    delayReason: json['delay_reason'] as String?,\n    enableVt: json['enable_vt'] as bool?,\n    epCover: json['ep_cover'] as String?,\n    episodeId: json['episode_id'] as int?,\n    follow: json['follow'] as int?,\n    follows: json['follows'] as String?,\n    iconFont: json['icon_font'] == null\n        ? null\n        : IconFont.fromJson(json['icon_font'] as Map<String, dynamic>),\n    plays: json['plays'] as String?,\n    pubIndex: json['pub_index'] as String?,\n    pubTime: json['pub_time'] as String?,\n    pubTs: json['pub_ts'] as int?,\n    published: json['published'] as int?,\n    seasonId: json['season_id'] as int?,\n    squareCover: json['square_cover'] as String?,\n    title: json['title'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_timeline/icon_font.dart",
    "content": "class IconFont {\n  String? name;\n  String? text;\n\n  IconFont({this.name, this.text});\n\n  factory IconFont.fromJson(Map<String, dynamic> json) => IconFont(\n    name: json['name'] as String?,\n    text: json['text'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_timeline/pgc_timeline.dart",
    "content": "import 'package:PiliPlus/models_new/pgc/pgc_timeline/result.dart';\n\nclass PgcTimeline {\n  int? code;\n  String? message;\n  List<TimelineResult>? result;\n\n  PgcTimeline({this.code, this.message, this.result});\n\n  factory PgcTimeline.fromJson(Map<String, dynamic> json) => PgcTimeline(\n    code: json['code'] as int?,\n    message: json['message'] as String?,\n    result: (json['result'] as List<dynamic>?)\n        ?.map((e) => TimelineResult.fromJson(e as Map<String, dynamic>))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/pgc/pgc_timeline/result.dart",
    "content": "import 'package:PiliPlus/models_new/pgc/pgc_timeline/episode.dart';\n\nclass TimelineResult {\n  String? date;\n  int? dateTs;\n  int? dayOfWeek;\n  List<Episode>? episodes;\n  int? isToday;\n\n  TimelineResult({\n    this.date,\n    this.dateTs,\n    this.dayOfWeek,\n    this.episodes,\n    this.isToday,\n  });\n\n  factory TimelineResult.fromJson(Map<String, dynamic> json) => TimelineResult(\n    date: json['date'] as String?,\n    dateTs: json['date_ts'] as int?,\n    dayOfWeek: json['day_of_week'] as int?,\n    episodes: (json['episodes'] as List<dynamic>?)\n        ?.map((e) => Episode.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    isToday: json['is_today'] as int?,\n  );\n\n  void addAll(TimelineResult other) {\n    if (dateTs == other.dateTs) {\n      if (other.episodes case final list?) {\n        (episodes ??= <Episode>[]).addAll(list);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "lib/models_new/popular/popular_precious/data.dart",
    "content": "import 'package:PiliPlus/models/model_hot_video_item.dart';\n\nclass PopularPreciousData {\n  String? title;\n  int? mediaId;\n  String? explain;\n  List<HotVideoItemModel>? list;\n\n  PopularPreciousData({this.title, this.mediaId, this.explain, this.list});\n\n  factory PopularPreciousData.fromJson(Map<String, dynamic> json) =>\n      PopularPreciousData(\n        title: json['title'] as String?,\n        mediaId: json['media_id'] as int?,\n        explain: json['explain'] as String?,\n        list: (json['list'] as List<dynamic>?)\n            ?.map((e) => HotVideoItemModel.fromJson(e as Map<String, dynamic>))\n            .toList(),\n      );\n}\n"
  },
  {
    "path": "lib/models_new/popular/popular_series_list/list.dart",
    "content": "class PopularSeriesListItem {\n  int? number;\n  String? subject;\n  int? status;\n  String? name;\n\n  PopularSeriesListItem({this.number, this.subject, this.status, this.name});\n\n  factory PopularSeriesListItem.fromJson(Map<String, dynamic> json) =>\n      PopularSeriesListItem(\n        number: json['number'] as int?,\n        subject: json['subject'] as String?,\n        status: json['status'] as int?,\n        name: json['name'] as String?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/popular/popular_series_one/config.dart",
    "content": "class PopularSeriesConfig {\n  int? id;\n  String? type;\n  int? number;\n  String? subject;\n  int? stime;\n  int? etime;\n  int? status;\n  String? name;\n  String? label;\n  String? hint;\n  int? color;\n  String? cover;\n  String? shareTitle;\n  String? shareSubtitle;\n  int? mediaId;\n\n  PopularSeriesConfig({\n    this.id,\n    this.type,\n    this.number,\n    this.subject,\n    this.stime,\n    this.etime,\n    this.status,\n    this.name,\n    this.label,\n    this.hint,\n    this.color,\n    this.cover,\n    this.shareTitle,\n    this.shareSubtitle,\n    this.mediaId,\n  });\n\n  factory PopularSeriesConfig.fromJson(Map<String, dynamic> json) =>\n      PopularSeriesConfig(\n        id: json['id'] as int?,\n        type: json['type'] as String?,\n        number: json['number'] as int?,\n        subject: json['subject'] as String?,\n        stime: json['stime'] as int?,\n        etime: json['etime'] as int?,\n        status: json['status'] as int?,\n        name: json['name'] as String?,\n        label: json['label'] as String?,\n        hint: json['hint'] as String?,\n        color: json['color'] as int?,\n        cover: json['cover'] as String?,\n        shareTitle: json['share_title'] as String?,\n        shareSubtitle: json['share_subtitle'] as String?,\n        mediaId: json['media_id'] as int?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/popular/popular_series_one/data.dart",
    "content": "import 'package:PiliPlus/models/model_hot_video_item.dart';\nimport 'package:PiliPlus/models_new/popular/popular_series_one/config.dart';\n\nclass PopularSeriesOneData {\n  PopularSeriesConfig? config;\n  String? reminder;\n  List<HotVideoItemModel>? list;\n\n  PopularSeriesOneData({this.config, this.reminder, this.list});\n\n  factory PopularSeriesOneData.fromJson(Map<String, dynamic> json) =>\n      PopularSeriesOneData(\n        config: json['config'] == null\n            ? null\n            : PopularSeriesConfig.fromJson(\n                json['config'] as Map<String, dynamic>,\n              ),\n        reminder: json['reminder'] as String?,\n        list: (json['list'] as List<dynamic>?)\n            ?.map((e) => HotVideoItemModel.fromJson(e as Map<String, dynamic>))\n            .toList(),\n      );\n}\n"
  },
  {
    "path": "lib/models_new/reply/content.dart",
    "content": "import 'package:PiliPlus/models_new/reply/picture.dart';\n\nclass ReplyContent {\n  String? message;\n  List<dynamic>? members;\n  Map? jumpUrl;\n  int? maxLine;\n  List<ReplyPicture>? pictures;\n  double? pictureScale;\n\n  ReplyContent({\n    this.message,\n    this.members,\n    this.jumpUrl,\n    this.maxLine,\n    this.pictures,\n    this.pictureScale,\n  });\n\n  factory ReplyContent.fromJson(Map<String, dynamic> json) => ReplyContent(\n    message: json['message'] as String?,\n    members: json['members'] as List<dynamic>?,\n    jumpUrl: json['jump_url'],\n    maxLine: json['max_line'] as int?,\n    pictures: (json['pictures'] as List<dynamic>?)\n        ?.map((e) => ReplyPicture.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    pictureScale: (json['picture_scale'] as num?)?.toDouble(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/reply/control.dart",
    "content": "class ReplyControl {\n  bool? inputDisable;\n  String? rootInputText;\n  String? childInputText;\n  String? giveupInputText;\n  int? screenshotIconState;\n  int? uploadPictureIconState;\n  String? answerGuideText;\n  String? answerGuideIconUrl;\n  String? answerGuideIosUrl;\n  String? answerGuideAndroidUrl;\n  String? bgText;\n  dynamic emptyPage;\n  int? showType;\n  String? showText;\n  bool? webSelection;\n  bool? disableJumpEmote;\n  bool? enableCharged;\n  bool? enableCmBizHelper;\n  dynamic preloadResources;\n\n  ReplyControl({\n    this.inputDisable,\n    this.rootInputText,\n    this.childInputText,\n    this.giveupInputText,\n    this.screenshotIconState,\n    this.uploadPictureIconState,\n    this.answerGuideText,\n    this.answerGuideIconUrl,\n    this.answerGuideIosUrl,\n    this.answerGuideAndroidUrl,\n    this.bgText,\n    this.emptyPage,\n    this.showType,\n    this.showText,\n    this.webSelection,\n    this.disableJumpEmote,\n    this.enableCharged,\n    this.enableCmBizHelper,\n    this.preloadResources,\n  });\n\n  factory ReplyControl.fromJson(Map<String, dynamic> json) => ReplyControl(\n    inputDisable: json['input_disable'] as bool?,\n    rootInputText: json['root_input_text'] as String?,\n    childInputText: json['child_input_text'] as String?,\n    giveupInputText: json['giveup_input_text'] as String?,\n    screenshotIconState: json['screenshot_icon_state'] as int?,\n    uploadPictureIconState: json['upload_picture_icon_state'] as int?,\n    answerGuideText: json['answer_guide_text'] as String?,\n    answerGuideIconUrl: json['answer_guide_icon_url'] as String?,\n    answerGuideIosUrl: json['answer_guide_ios_url'] as String?,\n    answerGuideAndroidUrl: json['answer_guide_android_url'] as String?,\n    bgText: json['bg_text'] as String?,\n    emptyPage: json['empty_page'] as dynamic,\n    showType: json['show_type'] as int?,\n    showText: json['show_text'] as String?,\n    webSelection: json['web_selection'] as bool?,\n    disableJumpEmote: json['disable_jump_emote'] as bool?,\n    enableCharged: json['enable_charged'] as bool?,\n    enableCmBizHelper: json['enable_cm_biz_helper'] as bool?,\n    preloadResources: json['preload_resources'] as dynamic,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/reply/cursor.dart",
    "content": "import 'package:PiliPlus/models_new/reply/pagination_reply.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\n\nclass ReplyCursor {\n  bool? isBegin;\n  int? prev;\n  int? next;\n  bool? isEnd;\n  PaginationReply? paginationReply;\n  String? sessionId;\n  int? mode;\n  String? modeText;\n  int? allCount;\n  List<int>? supportMode;\n  String? name;\n\n  ReplyCursor({\n    this.isBegin,\n    this.prev,\n    this.next,\n    this.isEnd,\n    this.paginationReply,\n    this.sessionId,\n    this.mode,\n    this.modeText,\n    this.allCount,\n    this.supportMode,\n    this.name,\n  });\n\n  factory ReplyCursor.fromJson(Map<String, dynamic> json) => ReplyCursor(\n    isBegin: json['is_begin'] as bool?,\n    prev: json['prev'] as int?,\n    next: json['next'] as int?,\n    isEnd: json['is_end'] as bool?,\n    paginationReply: json['pagination_reply'] == null\n        ? null\n        : PaginationReply.fromJson(\n            json['pagination_reply'] as Map<String, dynamic>,\n          ),\n    sessionId: json['session_id'] as String?,\n    mode: json['mode'] as int?,\n    modeText: json['mode_text'] as String?,\n    allCount: json['all_count'] as int?,\n    supportMode: (json['support_mode'] as List?)?.fromCast(),\n    name: json['name'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/reply/data.dart",
    "content": "import 'package:PiliPlus/models_new/reply/control.dart';\nimport 'package:PiliPlus/models_new/reply/cursor.dart';\nimport 'package:PiliPlus/models_new/reply/reply.dart';\nimport 'package:PiliPlus/models_new/reply/top.dart';\nimport 'package:PiliPlus/models_new/reply/up_selection.dart';\nimport 'package:PiliPlus/models_new/reply/upper.dart';\n\nclass ReplyData {\n  ReplyCursor? cursor;\n  List<ReplyItemModel>? replies;\n  Top? top;\n  List<ReplyItemModel>? topReplies;\n  UpSelection? upSelection;\n  int? assist;\n  int? blacklist;\n  int? vote;\n  Upper? upper;\n  ReplyControl? control;\n  int? note;\n  dynamic esportsGradeCard;\n  dynamic callbacks;\n  String? contextFeature;\n\n  ReplyData({\n    this.cursor,\n    this.replies,\n    this.top,\n    this.topReplies,\n    this.upSelection,\n    this.assist,\n    this.blacklist,\n    this.vote,\n    this.upper,\n    this.control,\n    this.note,\n    this.esportsGradeCard,\n    this.callbacks,\n    this.contextFeature,\n  });\n\n  factory ReplyData.fromJson(Map<String, dynamic> json) => ReplyData(\n    cursor: json['cursor'] == null\n        ? null\n        : ReplyCursor.fromJson(json['cursor'] as Map<String, dynamic>),\n    replies: (json['replies'] as List<dynamic>?)\n        ?.map((e) => ReplyItemModel.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    top: json['top'] == null\n        ? null\n        : Top.fromJson(json['top'] as Map<String, dynamic>),\n    topReplies: (json['top_replies'] as List<dynamic>?)\n        ?.map((e) => ReplyItemModel.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    upSelection: json['up_selection'] == null\n        ? null\n        : UpSelection.fromJson(json['up_selection'] as Map<String, dynamic>),\n    assist: json['assist'] as int?,\n    blacklist: json['blacklist'] as int?,\n    vote: json['vote'] as int?,\n    upper: json['upper'] == null\n        ? null\n        : Upper.fromJson(json['upper'] as Map<String, dynamic>),\n    control: json['control'] == null\n        ? null\n        : ReplyControl.fromJson(json['control'] as Map<String, dynamic>),\n    note: json['note'] as int?,\n    esportsGradeCard: json['esports_grade_card'] as dynamic,\n    callbacks: json['callbacks'] as dynamic,\n    contextFeature: json['context_feature'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/reply/folder.dart",
    "content": "class ReplyFolder {\n  bool? hasFolded;\n  bool? isFolded;\n  String? rule;\n\n  ReplyFolder({this.hasFolded, this.isFolded, this.rule});\n\n  factory ReplyFolder.fromJson(Map<String, dynamic> json) => ReplyFolder(\n    hasFolded: json['has_folded'] as bool?,\n    isFolded: json['is_folded'] as bool?,\n    rule: json['rule'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/reply/level_info.dart",
    "content": "class LevelInfo {\n  int? currentLevel;\n  int? currentMin;\n  int? currentExp;\n  int? nextExp;\n\n  LevelInfo({\n    this.currentLevel,\n    this.currentMin,\n    this.currentExp,\n    this.nextExp,\n  });\n\n  factory LevelInfo.fromJson(Map<String, dynamic> json) => LevelInfo(\n    currentLevel: json['current_level'] as int?,\n    currentMin: json['current_min'] as int?,\n    currentExp: json['current_exp'] as int?,\n    nextExp: json['next_exp'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/reply/member.dart",
    "content": "import 'package:PiliPlus/models/model_avatar.dart';\nimport 'package:PiliPlus/models_new/reply/level_info.dart';\nimport 'package:PiliPlus/models_new/reply/nameplate.dart';\nimport 'package:PiliPlus/models_new/reply/senior.dart';\n\nclass ReplyMember {\n  String? mid;\n  String? uname;\n  String? sex;\n  String? sign;\n  String? avatar;\n  String? rank;\n  int? faceNftNew;\n  int? isSeniorMember;\n  Senior? senior;\n  LevelInfo? levelInfo;\n  Pendant? pendant;\n  Nameplate? nameplate;\n  BaseOfficialVerify? officialVerify;\n  Vip? vip;\n  dynamic fansDetail;\n  bool? isContractor;\n  String? contractDesc;\n  dynamic nftInteraction;\n\n  ReplyMember({\n    this.mid,\n    this.uname,\n    this.sex,\n    this.sign,\n    this.avatar,\n    this.rank,\n    this.faceNftNew,\n    this.isSeniorMember,\n    this.senior,\n    this.levelInfo,\n    this.pendant,\n    this.nameplate,\n    this.officialVerify,\n    this.vip,\n    this.fansDetail,\n    this.isContractor,\n    this.contractDesc,\n    this.nftInteraction,\n  });\n\n  factory ReplyMember.fromJson(Map<String, dynamic> json) => ReplyMember(\n    mid: json['mid'] as String?,\n    uname: json['uname'] as String?,\n    sex: json['sex'] as String?,\n    sign: json['sign'] as String?,\n    avatar: json['avatar'] as String?,\n    rank: json['rank'] as String?,\n    faceNftNew: json['face_nft_new'] as int?,\n    isSeniorMember: json['is_senior_member'] as int?,\n    senior: json['senior'] == null\n        ? null\n        : Senior.fromJson(json['senior'] as Map<String, dynamic>),\n    levelInfo: json['level_info'] == null\n        ? null\n        : LevelInfo.fromJson(json['level_info'] as Map<String, dynamic>),\n    pendant: json['pendant'] == null\n        ? null\n        : Pendant.fromJson(json['pendant'] as Map<String, dynamic>),\n    nameplate: json['nameplate'] == null\n        ? null\n        : Nameplate.fromJson(json['nameplate'] as Map<String, dynamic>),\n    officialVerify: json['official_verify'] == null\n        ? null\n        : BaseOfficialVerify.fromJson(\n            json['official_verify'] as Map<String, dynamic>,\n          ),\n    vip: json['vip'] == null\n        ? null\n        : Vip.fromJson(json['vip'] as Map<String, dynamic>),\n    fansDetail: json['fans_detail'] as dynamic,\n    isContractor: json['is_contractor'] as bool?,\n    contractDesc: json['contract_desc'] as String?,\n    nftInteraction: json['nft_interaction'] as dynamic,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/reply/nameplate.dart",
    "content": "class Nameplate {\n  int? nid;\n  String? name;\n  String? image;\n  String? imageSmall;\n  String? level;\n  String? condition;\n\n  Nameplate({\n    this.nid,\n    this.name,\n    this.image,\n    this.imageSmall,\n    this.level,\n    this.condition,\n  });\n\n  factory Nameplate.fromJson(Map<String, dynamic> json) => Nameplate(\n    nid: json['nid'] as int?,\n    name: json['name'] as String?,\n    image: json['image'] as String?,\n    imageSmall: json['image_small'] as String?,\n    level: json['level'] as String?,\n    condition: json['condition'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/reply/pagination_reply.dart",
    "content": "class PaginationReply {\n  String? nextOffset;\n\n  PaginationReply({this.nextOffset});\n\n  factory PaginationReply.fromJson(Map<String, dynamic> json) {\n    return PaginationReply(\n      nextOffset: json['next_offset'] as String?,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/models_new/reply/picture.dart",
    "content": "class ReplyPicture {\n  String? imgSrc;\n  int? imgWidth;\n  int? imgHeight;\n  double? imgSize;\n  String? topRightIcon;\n  bool? playGifThumbnail;\n\n  ReplyPicture({\n    this.imgSrc,\n    this.imgWidth,\n    this.imgHeight,\n    this.imgSize,\n    this.topRightIcon,\n    this.playGifThumbnail,\n  });\n\n  factory ReplyPicture.fromJson(Map<String, dynamic> json) => ReplyPicture(\n    imgSrc: json['img_src'] as String?,\n    imgWidth: json['img_width'] as int?,\n    imgHeight: json['img_height'] as int?,\n    imgSize: (json['img_size'] as num?)?.toDouble(),\n    topRightIcon: json['top_right_icon'] as String?,\n    playGifThumbnail: json['play_gif_thumbnail'] as bool?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/reply/reply.dart",
    "content": "import 'package:PiliPlus/models_new/reply/content.dart';\nimport 'package:PiliPlus/models_new/reply/folder.dart';\nimport 'package:PiliPlus/models_new/reply/member.dart';\nimport 'package:PiliPlus/models_new/reply/reply_control.dart';\nimport 'package:PiliPlus/models_new/reply/up_action.dart';\n\nclass ReplyItemModel {\n  int? rpid;\n  int? oid;\n  int? type;\n  int? mid;\n  int? root;\n  int? parent;\n  int? dialog;\n  int? count;\n  int? rcount;\n  int? state;\n  int? fansgrade;\n  int? attr;\n  int? ctime;\n  String? midStr;\n  String? oidStr;\n  String? rpidStr;\n  String? rootStr;\n  String? parentStr;\n  String? dialogStr;\n  int? like;\n  int? action;\n  ReplyMember? member;\n  ReplyContent? content;\n  List<ReplyItemModel>? replies;\n  int? assist;\n  UpAction? upAction;\n  bool? invisible;\n  ReplyControl? replyControl;\n  ReplyFolder? folder;\n  int? dynamicId;\n  String? dynamicIdStr;\n  String? noteCvidStr;\n  String? trackInfo;\n\n  ReplyItemModel({\n    this.rpid,\n    this.oid,\n    this.type,\n    this.mid,\n    this.root,\n    this.parent,\n    this.dialog,\n    this.count,\n    this.rcount,\n    this.state,\n    this.fansgrade,\n    this.attr,\n    this.ctime,\n    this.midStr,\n    this.oidStr,\n    this.rpidStr,\n    this.rootStr,\n    this.parentStr,\n    this.dialogStr,\n    this.like,\n    this.action,\n    this.member,\n    this.content,\n    this.replies,\n    this.assist,\n    this.upAction,\n    this.invisible,\n    this.replyControl,\n    this.folder,\n    this.dynamicId,\n    this.dynamicIdStr,\n    this.noteCvidStr,\n    this.trackInfo,\n  });\n\n  factory ReplyItemModel.fromJson(Map<String, dynamic> json) => ReplyItemModel(\n    rpid: json['rpid'] as int?,\n    oid: json['oid'] as int?,\n    type: json['type'] as int?,\n    mid: json['mid'] as int?,\n    root: json['root'] as int?,\n    parent: json['parent'] as int?,\n    dialog: json['dialog'] as int?,\n    count: json['count'] as int?,\n    rcount: json['rcount'] as int?,\n    state: json['state'] as int?,\n    fansgrade: json['fansgrade'] as int?,\n    attr: json['attr'] as int?,\n    ctime: json['ctime'] as int?,\n    midStr: json['mid_str'] as String?,\n    oidStr: json['oid_str'] as String?,\n    rpidStr: json['rpid_str'] as String?,\n    rootStr: json['root_str'] as String?,\n    parentStr: json['parent_str'] as String?,\n    dialogStr: json['dialog_str'] as String?,\n    like: json['like'] as int?,\n    action: json['action'] as int?,\n    member: json['member'] == null\n        ? null\n        : ReplyMember.fromJson(json['member'] as Map<String, dynamic>),\n    content: json['content'] == null\n        ? null\n        : ReplyContent.fromJson(json['content'] as Map<String, dynamic>),\n    replies: (json['replies'] as List<dynamic>?)\n        ?.map((e) => ReplyItemModel.fromJson(e))\n        .toList(),\n    assist: json['assist'] as int?,\n    upAction: json['up_action'] == null\n        ? null\n        : UpAction.fromJson(json['up_action'] as Map<String, dynamic>),\n    invisible: json['invisible'] as bool?,\n    replyControl: json['reply_control'] == null\n        ? null\n        : ReplyControl.fromJson(json['reply_control'] as Map<String, dynamic>),\n    folder: json['folder'] == null\n        ? null\n        : ReplyFolder.fromJson(json['folder'] as Map<String, dynamic>),\n    dynamicId: json['dynamic_id'] as int?,\n    dynamicIdStr: json['dynamic_id_str'] as String?,\n    noteCvidStr: json['note_cvid_str'] as String?,\n    trackInfo: json['track_info'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/reply/reply_control.dart",
    "content": "class ReplyControl {\n  int? maxLine;\n  String? timeDesc;\n  String? bizScene;\n  String? location;\n  bool? isNoteV2;\n  int? translationSwitch;\n\n  ReplyControl({\n    this.maxLine,\n    this.timeDesc,\n    this.bizScene,\n    this.location,\n    this.isNoteV2,\n    this.translationSwitch,\n  });\n\n  factory ReplyControl.fromJson(Map<String, dynamic> json) => ReplyControl(\n    maxLine: json['max_line'] as int?,\n    timeDesc: json['time_desc'] as String?,\n    bizScene: json['biz_scene'] as String?,\n    location: json['location'] as String?,\n    isNoteV2: json['is_note_v2'] as bool?,\n    translationSwitch: json['translation_switch'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/reply/senior.dart",
    "content": "class Senior {\n  int? status;\n\n  Senior({this.status});\n\n  factory Senior.fromJson(Map<String, dynamic> json) => Senior(\n    status: json['status'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/reply/top.dart",
    "content": "import 'package:PiliPlus/models_new/reply/upper.dart';\n\nclass Top {\n  dynamic admin;\n  Upper? upper;\n  dynamic vote;\n\n  Top({this.admin, this.upper, this.vote});\n\n  factory Top.fromJson(Map<String, dynamic> json) => Top(\n    admin: json['admin'] as dynamic,\n    upper: json['upper'] == null\n        ? null\n        : Upper.fromJson(json['upper'] as Map<String, dynamic>),\n    vote: json['vote'] as dynamic,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/reply/top_reply.dart",
    "content": "import 'package:PiliPlus/models_new/reply/content.dart';\nimport 'package:PiliPlus/models_new/reply/folder.dart';\nimport 'package:PiliPlus/models_new/reply/member.dart';\nimport 'package:PiliPlus/models_new/reply/reply.dart';\nimport 'package:PiliPlus/models_new/reply/reply_control.dart';\nimport 'package:PiliPlus/models_new/reply/up_action.dart';\n\nclass TopReply {\n  int? rpid;\n  int? oid;\n  int? type;\n  int? mid;\n  int? root;\n  int? parent;\n  int? dialog;\n  int? count;\n  int? rcount;\n  int? state;\n  int? fansgrade;\n  int? attr;\n  int? ctime;\n  String? midStr;\n  String? oidStr;\n  String? rpidStr;\n  String? rootStr;\n  String? parentStr;\n  String? dialogStr;\n  int? like;\n  int? action;\n  ReplyMember? member;\n  ReplyContent? content;\n  List<ReplyItemModel>? replies;\n  int? assist;\n  UpAction? upAction;\n  bool? invisible;\n  ReplyControl? replyControl;\n  ReplyFolder? folder;\n  String? dynamicIdStr;\n  String? noteCvidStr;\n  String? trackInfo;\n\n  TopReply({\n    this.rpid,\n    this.oid,\n    this.type,\n    this.mid,\n    this.root,\n    this.parent,\n    this.dialog,\n    this.count,\n    this.rcount,\n    this.state,\n    this.fansgrade,\n    this.attr,\n    this.ctime,\n    this.midStr,\n    this.oidStr,\n    this.rpidStr,\n    this.rootStr,\n    this.parentStr,\n    this.dialogStr,\n    this.like,\n    this.action,\n    this.member,\n    this.content,\n    this.replies,\n    this.assist,\n    this.upAction,\n    this.invisible,\n    this.replyControl,\n    this.folder,\n    this.dynamicIdStr,\n    this.noteCvidStr,\n    this.trackInfo,\n  });\n\n  factory TopReply.fromJson(Map<String, dynamic> json) => TopReply(\n    rpid: json['rpid'] as int?,\n    oid: json['oid'] as int?,\n    type: json['type'] as int?,\n    mid: json['mid'] as int?,\n    root: json['root'] as int?,\n    parent: json['parent'] as int?,\n    dialog: json['dialog'] as int?,\n    count: json['count'] as int?,\n    rcount: json['rcount'] as int?,\n    state: json['state'] as int?,\n    fansgrade: json['fansgrade'] as int?,\n    attr: json['attr'] as int?,\n    ctime: json['ctime'] as int?,\n    midStr: json['mid_str'] as String?,\n    oidStr: json['oid_str'] as String?,\n    rpidStr: json['rpid_str'] as String?,\n    rootStr: json['root_str'] as String?,\n    parentStr: json['parent_str'] as String?,\n    dialogStr: json['dialog_str'] as String?,\n    like: json['like'] as int?,\n    action: json['action'] as int?,\n    member: json['member'] == null\n        ? null\n        : ReplyMember.fromJson(json['member'] as Map<String, dynamic>),\n    content: json['content'] == null\n        ? null\n        : ReplyContent.fromJson(json['content'] as Map<String, dynamic>),\n    replies: (json['replies'] as List<dynamic>?)\n        ?.map((e) => ReplyItemModel.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    assist: json['assist'] as int?,\n    upAction: json['up_action'] == null\n        ? null\n        : UpAction.fromJson(json['up_action'] as Map<String, dynamic>),\n    invisible: json['invisible'] as bool?,\n    replyControl: json['reply_control'] == null\n        ? null\n        : ReplyControl.fromJson(json['reply_control'] as Map<String, dynamic>),\n    folder: json['folder'] == null\n        ? null\n        : ReplyFolder.fromJson(json['folder'] as Map<String, dynamic>),\n    dynamicIdStr: json['dynamic_id_str'] as String?,\n    noteCvidStr: json['note_cvid_str'] as String?,\n    trackInfo: json['track_info'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/reply/up_action.dart",
    "content": "class UpAction {\n  bool? like;\n  bool? reply;\n\n  UpAction({this.like, this.reply});\n\n  factory UpAction.fromJson(Map<String, dynamic> json) => UpAction(\n    like: json['like'] as bool?,\n    reply: json['reply'] as bool?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/reply/up_selection.dart",
    "content": "class UpSelection {\n  int? pendingCount;\n  int? ignoreCount;\n\n  UpSelection({this.pendingCount, this.ignoreCount});\n\n  factory UpSelection.fromJson(Map<String, dynamic> json) => UpSelection(\n    pendingCount: json['pending_count'] as int?,\n    ignoreCount: json['ignore_count'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/reply/upper.dart",
    "content": "import 'package:PiliPlus/models_new/reply/content.dart';\nimport 'package:PiliPlus/models_new/reply/folder.dart';\nimport 'package:PiliPlus/models_new/reply/member.dart';\nimport 'package:PiliPlus/models_new/reply/reply.dart';\nimport 'package:PiliPlus/models_new/reply/reply_control.dart';\nimport 'package:PiliPlus/models_new/reply/up_action.dart';\n\nclass Upper {\n  int? rpid;\n  int? oid;\n  int? type;\n  int? mid;\n  int? root;\n  int? parent;\n  int? dialog;\n  int? count;\n  int? rcount;\n  int? state;\n  int? fansgrade;\n  int? attr;\n  int? ctime;\n  String? midStr;\n  String? oidStr;\n  String? rpidStr;\n  String? rootStr;\n  String? parentStr;\n  String? dialogStr;\n  int? like;\n  int? action;\n  ReplyMember? member;\n  ReplyContent? content;\n  List<ReplyItemModel>? replies;\n  int? assist;\n  UpAction? upAction;\n  bool? invisible;\n  ReplyControl? replyControl;\n  ReplyFolder? folder;\n  String? dynamicIdStr;\n  String? noteCvidStr;\n  String? trackInfo;\n\n  Upper({\n    this.rpid,\n    this.oid,\n    this.type,\n    this.mid,\n    this.root,\n    this.parent,\n    this.dialog,\n    this.count,\n    this.rcount,\n    this.state,\n    this.fansgrade,\n    this.attr,\n    this.ctime,\n    this.midStr,\n    this.oidStr,\n    this.rpidStr,\n    this.rootStr,\n    this.parentStr,\n    this.dialogStr,\n    this.like,\n    this.action,\n    this.member,\n    this.content,\n    this.replies,\n    this.assist,\n    this.upAction,\n    this.invisible,\n    this.replyControl,\n    this.folder,\n    this.dynamicIdStr,\n    this.noteCvidStr,\n    this.trackInfo,\n  });\n\n  factory Upper.fromJson(Map<String, dynamic> json) => Upper(\n    rpid: json['rpid'] as int?,\n    oid: json['oid'] as int?,\n    type: json['type'] as int?,\n    mid: json['mid'] as int?,\n    root: json['root'] as int?,\n    parent: json['parent'] as int?,\n    dialog: json['dialog'] as int?,\n    count: json['count'] as int?,\n    rcount: json['rcount'] as int?,\n    state: json['state'] as int?,\n    fansgrade: json['fansgrade'] as int?,\n    attr: json['attr'] as int?,\n    ctime: json['ctime'] as int?,\n    midStr: json['mid_str'] as String?,\n    oidStr: json['oid_str'] as String?,\n    rpidStr: json['rpid_str'] as String?,\n    rootStr: json['root_str'] as String?,\n    parentStr: json['parent_str'] as String?,\n    dialogStr: json['dialog_str'] as String?,\n    like: json['like'] as int?,\n    action: json['action'] as int?,\n    member: json['member'] == null\n        ? null\n        : ReplyMember.fromJson(json['member'] as Map<String, dynamic>),\n    content: json['content'] == null\n        ? null\n        : ReplyContent.fromJson(json['content'] as Map<String, dynamic>),\n    replies: (json['replies'] as List<dynamic>?)\n        ?.map((e) => ReplyItemModel.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    assist: json['assist'] as int?,\n    upAction: json['up_action'] == null\n        ? null\n        : UpAction.fromJson(json['up_action'] as Map<String, dynamic>),\n    invisible: json['invisible'] as bool?,\n    replyControl: json['reply_control'] == null\n        ? null\n        : ReplyControl.fromJson(json['reply_control'] as Map<String, dynamic>),\n    folder: json['folder'] == null\n        ? null\n        : ReplyFolder.fromJson(json['folder'] as Map<String, dynamic>),\n    dynamicIdStr: json['dynamic_id_str'] as String?,\n    noteCvidStr: json['note_cvid_str'] as String?,\n    trackInfo: json['track_info'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/reply2reply/data.dart",
    "content": "import 'package:PiliPlus/models_new/reply/control.dart';\nimport 'package:PiliPlus/models_new/reply/reply.dart';\nimport 'package:PiliPlus/models_new/reply/upper.dart';\nimport 'package:PiliPlus/models_new/reply2reply/page.dart';\nimport 'package:PiliPlus/models_new/reply2reply/root.dart';\n\nclass ReplyReplyData {\n  ReplyPage? page;\n  Upper? upper;\n  List<ReplyItemModel>? replies;\n  ReplyRoot? root;\n  ReplyControl? control;\n\n  ReplyReplyData({\n    this.page,\n    this.upper,\n    this.replies,\n    this.root,\n    this.control,\n  });\n\n  factory ReplyReplyData.fromJson(Map<String, dynamic> json) => ReplyReplyData(\n    page: json['page'] == null\n        ? null\n        : ReplyPage.fromJson(json['page'] as Map<String, dynamic>),\n    upper: json['upper'] == null\n        ? null\n        : Upper.fromJson(json['upper'] as Map<String, dynamic>),\n    replies: (json['replies'] as List<dynamic>?)\n        ?.map((e) => ReplyItemModel.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    root: json['root'] == null\n        ? null\n        : ReplyRoot.fromJson(json['root'] as Map<String, dynamic>),\n    control: json['control'] == null\n        ? null\n        : ReplyControl.fromJson(json['control'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/reply2reply/page.dart",
    "content": "class ReplyPage {\n  int? num;\n  int? size;\n  int? count;\n\n  ReplyPage({this.num, this.size, this.count});\n\n  factory ReplyPage.fromJson(Map<String, dynamic> json) => ReplyPage(\n    num: json['num'] as int?,\n    size: json['size'] as int?,\n    count: json['count'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/reply2reply/root.dart",
    "content": "import 'package:PiliPlus/models_new/reply/content.dart';\nimport 'package:PiliPlus/models_new/reply/folder.dart';\nimport 'package:PiliPlus/models_new/reply/member.dart';\nimport 'package:PiliPlus/models_new/reply/reply_control.dart';\nimport 'package:PiliPlus/models_new/reply/up_action.dart';\n\nclass ReplyRoot {\n  int? rpid;\n  int? oid;\n  int? type;\n  int? mid;\n  int? root;\n  int? parent;\n  int? dialog;\n  int? count;\n  int? rcount;\n  int? state;\n  int? fansgrade;\n  int? attr;\n  int? ctime;\n  String? midStr;\n  String? oidStr;\n  String? rpidStr;\n  String? rootStr;\n  String? parentStr;\n  String? dialogStr;\n  int? like;\n  int? action;\n  ReplyMember? member;\n  ReplyContent? content;\n  dynamic replies;\n  int? assist;\n  UpAction? upAction;\n  bool? invisible;\n  ReplyControl? replyControl;\n  ReplyFolder? folder;\n  String? dynamicIdStr;\n  String? noteCvidStr;\n  String? trackInfo;\n\n  ReplyRoot({\n    this.rpid,\n    this.oid,\n    this.type,\n    this.mid,\n    this.root,\n    this.parent,\n    this.dialog,\n    this.count,\n    this.rcount,\n    this.state,\n    this.fansgrade,\n    this.attr,\n    this.ctime,\n    this.midStr,\n    this.oidStr,\n    this.rpidStr,\n    this.rootStr,\n    this.parentStr,\n    this.dialogStr,\n    this.like,\n    this.action,\n    this.member,\n    this.content,\n    this.replies,\n    this.assist,\n    this.upAction,\n    this.invisible,\n    this.replyControl,\n    this.folder,\n    this.dynamicIdStr,\n    this.noteCvidStr,\n    this.trackInfo,\n  });\n\n  factory ReplyRoot.fromJson(Map<String, dynamic> json) => ReplyRoot(\n    rpid: json['rpid'] as int?,\n    oid: json['oid'] as int?,\n    type: json['type'] as int?,\n    mid: json['mid'] as int?,\n    root: json['root'] as int?,\n    parent: json['parent'] as int?,\n    dialog: json['dialog'] as int?,\n    count: json['count'] as int?,\n    rcount: json['rcount'] as int?,\n    state: json['state'] as int?,\n    fansgrade: json['fansgrade'] as int?,\n    attr: json['attr'] as int?,\n    ctime: json['ctime'] as int?,\n    midStr: json['mid_str'] as String?,\n    oidStr: json['oid_str'] as String?,\n    rpidStr: json['rpid_str'] as String?,\n    rootStr: json['root_str'] as String?,\n    parentStr: json['parent_str'] as String?,\n    dialogStr: json['dialog_str'] as String?,\n    like: json['like'] as int?,\n    action: json['action'] as int?,\n    member: json['member'] == null\n        ? null\n        : ReplyMember.fromJson(json['member'] as Map<String, dynamic>),\n    content: json['content'] == null\n        ? null\n        : ReplyContent.fromJson(json['content'] as Map<String, dynamic>),\n    replies: json['replies'] as dynamic,\n    assist: json['assist'] as int?,\n    upAction: json['up_action'] == null\n        ? null\n        : UpAction.fromJson(json['up_action'] as Map<String, dynamic>),\n    invisible: json['invisible'] as bool?,\n    replyControl: json['reply_control'] == null\n        ? null\n        : ReplyControl.fromJson(json['reply_control'] as Map<String, dynamic>),\n    folder: json['folder'] == null\n        ? null\n        : ReplyFolder.fromJson(json['folder'] as Map<String, dynamic>),\n    dynamicIdStr: json['dynamic_id_str'] as String?,\n    noteCvidStr: json['note_cvid_str'] as String?,\n    trackInfo: json['track_info'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/reply_interaction/data.dart",
    "content": "import 'package:PiliPlus/models_new/reply_interaction/interact_status.dart';\n\nclass ReplyInteractData {\n  InteractStatus upReplySelection;\n  InteractStatus upReply;\n  // InteractStatus upDm;\n\n  ReplyInteractData({\n    required this.upReplySelection,\n    required this.upReply,\n    // required this.upDm,\n  });\n\n  factory ReplyInteractData.fromJson(Map<String, dynamic> json) =>\n      ReplyInteractData(\n        upReplySelection: InteractStatus.fromJson(json[\"up_reply_selection\"]),\n        upReply: InteractStatus.fromJson(json[\"up_reply\"]),\n        // upDm: InteractStatus.fromJson(json[\"up_dm\"]),\n      );\n}\n"
  },
  {
    "path": "lib/models_new/reply_interaction/interact_status.dart",
    "content": "class InteractStatus {\n  bool canModify;\n  int status;\n\n  InteractStatus({\n    required this.canModify,\n    required this.status,\n  });\n\n  factory InteractStatus.fromJson(Map<String, dynamic> json) => InteractStatus(\n    canModify: json[\"can_modify\"],\n    status: json[\"status\"],\n  );\n}\n"
  },
  {
    "path": "lib/models_new/search/search_rcmd/data.dart",
    "content": "import 'package:PiliPlus/models_new/search/search_trending/list.dart';\n\nclass SearchRcmdData {\n  List<SearchTrendingItemModel>? list;\n\n  SearchRcmdData({this.list});\n\n  factory SearchRcmdData.fromJson(Map<String, dynamic> json) => SearchRcmdData(\n    list: (json['list'] as List<dynamic>?)\n        ?.map(\n          (e) => SearchTrendingItemModel.fromJson(e as Map<String, dynamic>),\n        )\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/search/search_trending/data.dart",
    "content": "import 'package:PiliPlus/models_new/search/search_rcmd/data.dart';\nimport 'package:PiliPlus/models_new/search/search_trending/list.dart';\n\nclass SearchTrendingData extends SearchRcmdData {\n  List<SearchTrendingItemModel>? topList;\n\n  SearchTrendingData({super.list, this.topList});\n\n  factory SearchTrendingData.fromJson(Map<String, dynamic> json) =>\n      SearchTrendingData(\n        list: (json['list'] as List<dynamic>?)\n            ?.map(\n              (e) =>\n                  SearchTrendingItemModel.fromJson(e as Map<String, dynamic>),\n            )\n            .toList(),\n        topList: (json['top_list'] as List<dynamic>?)\n            ?.map(\n              (e) =>\n                  SearchTrendingItemModel.fromJson(e as Map<String, dynamic>),\n            )\n            .toList(),\n      );\n}\n"
  },
  {
    "path": "lib/models_new/search/search_trending/list.dart",
    "content": "class SearchTrendingItemModel {\n  String? keyword;\n  String? showName;\n  String? icon;\n  bool? showLiveIcon;\n  String? recommendReason;\n\n  SearchTrendingItemModel({\n    this.keyword,\n    this.showName,\n    this.icon,\n    this.showLiveIcon,\n    this.recommendReason,\n  });\n\n  factory SearchTrendingItemModel.fromJson(Map<String, dynamic> json) =>\n      SearchTrendingItemModel(\n        keyword: json['keyword'] as String?,\n        showName: json['show_name'] as String?,\n        icon: json['icon'] as String?,\n        showLiveIcon: json['show_live_icon'] as bool?,\n        recommendReason: (json['recommend_reason'] as String?)?.replaceFirst(\n          '·',\n          ' ',\n        ),\n      );\n}\n"
  },
  {
    "path": "lib/models_new/single_unread/data.dart",
    "content": "class SingleUnreadData {\n  int unfollowUnread;\n  int followUnread;\n  int unfollowPushMsg;\n  int dustbinPushMsg;\n  int dustbinUnread;\n  int bizMsgUnfollowUnread;\n  int bizMsgFollowUnread;\n  int customUnread;\n\n  SingleUnreadData({\n    required this.unfollowUnread,\n    required this.followUnread,\n    required this.unfollowPushMsg,\n    required this.dustbinPushMsg,\n    required this.dustbinUnread,\n    required this.bizMsgUnfollowUnread,\n    required this.bizMsgFollowUnread,\n    required this.customUnread,\n  });\n\n  factory SingleUnreadData.fromJson(Map<String, dynamic> json) =>\n      SingleUnreadData(\n        unfollowUnread: json['unfollow_unread'] ?? 0,\n        followUnread: json['follow_unread'] ?? 0,\n        unfollowPushMsg: json['unfollow_push_msg'] ?? 0,\n        dustbinPushMsg: json['dustbin_push_msg'] ?? 0,\n        dustbinUnread: json['dustbin_unread'] ?? 0,\n        bizMsgUnfollowUnread: json['biz_msg_unfollow_unread'] ?? 0,\n        bizMsgFollowUnread: json['biz_msg_follow_unread'] ?? 0,\n        customUnread: json['custom_unread'] ?? 0,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/achieve.dart",
    "content": "class Achieve {\n  bool? isDefault;\n  String? image;\n  String? achieveUrl;\n\n  Achieve({this.isDefault, this.image, this.achieveUrl});\n\n  factory Achieve.fromJson(Map<String, dynamic> json) => Achieve(\n    isDefault: json['is_default'] as bool?,\n    image: json['image'] as String?,\n    achieveUrl: json['achieve_url'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/archive.dart",
    "content": "import 'package:PiliPlus/models_new/space/space/episodic_button.dart';\nimport 'package:PiliPlus/models_new/space/space/order.dart';\nimport 'package:PiliPlus/models_new/space/space_archive/item.dart';\n\nclass Archive {\n  EpisodicButton? episodicButton;\n  List<Order>? order;\n  int? count;\n  List<SpaceArchiveItem>? item;\n\n  Archive({this.episodicButton, this.order, this.count, this.item});\n\n  factory Archive.fromJson(Map<String, dynamic> json) => Archive(\n    episodicButton: json['episodic_button'] == null\n        ? null\n        : EpisodicButton.fromJson(\n            json['episodic_button'] as Map<String, dynamic>,\n          ),\n    order: (json['order'] as List<dynamic>?)\n        ?.map((e) => Order.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    count: json['count'] as int?,\n    item: (json['item'] as List<dynamic>?)\n        ?.map((e) => SpaceArchiveItem.fromJson(e as Map<String, dynamic>))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/article.dart",
    "content": "import 'package:PiliPlus/models_new/space/space/list.dart';\nimport 'package:PiliPlus/models_new/space/space_article/item.dart';\n\nclass Article {\n  int? count;\n  List<SpaceArticleItem>? item;\n  int? listsCount;\n  List<ListItem>? lists;\n\n  Article({this.count, this.item, this.listsCount, this.lists});\n\n  factory Article.fromJson(Map<String, dynamic> json) => Article(\n    count: json['count'] as int?,\n    item: (json['item'] as List<dynamic>?)\n        ?.map((e) => SpaceArticleItem.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    listsCount: json['lists_count'] as int?,\n    lists: (json['lists'] as List<dynamic>?)\n        ?.map((e) => ListItem.fromJson(e as Map<String, dynamic>))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/attention_tip.dart",
    "content": "class AttentionTip {\n  int? cardNum;\n  String? tip;\n\n  AttentionTip({this.cardNum, this.tip});\n\n  factory AttentionTip.fromJson(Map<String, dynamic> json) => AttentionTip(\n    cardNum: json['card_num'] as int?,\n    tip: json['tip'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/audios.dart",
    "content": "import 'package:PiliPlus/models_new/space/space_audio/item.dart';\n\nclass Audios {\n  int? count;\n  List<SpaceAudioItem>? item;\n\n  Audios({this.count, this.item});\n\n  factory Audios.fromJson(Map<String, dynamic> json) => Audios(\n    count: json['count'] as int?,\n    item: (json['item'] as List<dynamic>?)\n        ?.map((e) => SpaceAudioItem.fromJson(e as Map<String, dynamic>))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/author.dart",
    "content": "import 'package:PiliPlus/models/model_avatar.dart';\nimport 'package:PiliPlus/models_new/space/space/nameplate.dart';\nimport 'package:PiliPlus/models_new/space/space/official_verify.dart';\n\nclass Author {\n  int? mid;\n  String? name;\n  String? face;\n  Pendant? pendant;\n  OfficialVerify? officialVerify;\n  Nameplate? nameplate;\n  Vip? vip;\n\n  Author({\n    this.mid,\n    this.name,\n    this.face,\n    this.pendant,\n    this.officialVerify,\n    this.nameplate,\n    this.vip,\n  });\n\n  factory Author.fromJson(Map<String, dynamic> json) => Author(\n    mid: json['mid'] as int?,\n    name: json['name'] as String?,\n    face: json['face'] as String?,\n    pendant: json['pendant'] == null\n        ? null\n        : Pendant.fromJson(json['pendant'] as Map<String, dynamic>),\n    officialVerify: json['official_verify'] == null\n        ? null\n        : OfficialVerify.fromJson(\n            json['official_verify'] as Map<String, dynamic>,\n          ),\n    nameplate: json['nameplate'] == null\n        ? null\n        : Nameplate.fromJson(json['nameplate'] as Map<String, dynamic>),\n    vip: json['vip'] == null\n        ? null\n        : Vip.fromJson(json['vip'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/badge.dart",
    "content": "class Badge {\n  String? text;\n  String? textColor;\n  String? textColorNight;\n  String? bgColor;\n  String? bgColorNight;\n  String? borderColor;\n  String? borderColorNight;\n  int? bgStyle;\n\n  Badge({\n    this.text,\n    this.textColor,\n    this.textColorNight,\n    this.bgColor,\n    this.bgColorNight,\n    this.borderColor,\n    this.borderColorNight,\n    this.bgStyle,\n  });\n\n  factory Badge.fromJson(Map<String, dynamic> json) => Badge(\n    text: json['text'] as String?,\n    textColor: json['text_color'] as String?,\n    textColorNight: json['text_color_night'] as String?,\n    bgColor: json['bg_color'] as String?,\n    bgColorNight: json['bg_color_night'] as String?,\n    borderColor: json['border_color'] as String?,\n    borderColorNight: json['border_color_night'] as String?,\n    bgStyle: json['bg_style'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/button.dart",
    "content": "class Button {\n  int? type;\n  String? text;\n  String? jumpUrl;\n\n  Button({this.type, this.text, this.jumpUrl});\n\n  factory Button.fromJson(Map<String, dynamic> json) => Button(\n    type: json['type'] as int?,\n    text: json['text'] as String?,\n    jumpUrl: json['jump_url'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/card.dart",
    "content": "import 'package:PiliPlus/models/model_avatar.dart';\nimport 'package:PiliPlus/models_new/space/space/achieve.dart';\nimport 'package:PiliPlus/models_new/space/space/entrance.dart';\nimport 'package:PiliPlus/models_new/space/space/followings_followed_upper.dart';\nimport 'package:PiliPlus/models_new/space/space/honours.dart';\nimport 'package:PiliPlus/models_new/space/space/level_info.dart';\nimport 'package:PiliPlus/models_new/space/space/likes.dart';\nimport 'package:PiliPlus/models_new/space/space/live_fans_wearing.dart';\nimport 'package:PiliPlus/models_new/space/space/nameplate.dart';\nimport 'package:PiliPlus/models_new/space/space/nft_certificate.dart';\nimport 'package:PiliPlus/models_new/space/space/official_verify.dart';\nimport 'package:PiliPlus/models_new/space/space/pr_info.dart';\nimport 'package:PiliPlus/models_new/space/space/profession_verify.dart';\nimport 'package:PiliPlus/models_new/space/space/relation.dart';\nimport 'package:PiliPlus/models_new/space/space/space_tag.dart';\n\nclass SpaceCard {\n  String? mid;\n  String? name;\n  bool? approve;\n  String? rank;\n  String? face;\n  String? displayRank;\n  int? regtime;\n  int? spacesta;\n  String? birthday;\n  String? place;\n  String? description;\n  int? article;\n  dynamic attentions;\n  int? fans;\n  int? friend;\n  int? attention;\n  String? sign;\n  LevelInfo? levelInfo;\n  Pendant? pendant;\n  Nameplate? nameplate;\n  OfficialVerify? officialVerify;\n  ProfessionVerify? professionVerify;\n  Vip? vip;\n  int? silence;\n  int? endTime;\n  String? silenceUrl;\n  Likes? likes;\n  Achieve? achieve;\n  SpaceRelation? relation;\n  int? isDeleted;\n  Honours? honours;\n  LiveFansWearing? liveFansWearing;\n  List<SpaceTag>? spaceTag;\n  int? faceNftNew;\n  bool? hasFaceNft;\n  NftCertificate? nftCertificate;\n  Entrance? entrance;\n  String? nftId;\n  dynamic nftFaceIcon;\n  String? digitalId;\n  int? digitalType;\n  bool? hasDigitalAsset;\n  SpacePrInfo? prInfo;\n  FollowingsFollowedUpper? followingsFollowedUpper;\n\n  SpaceCard({\n    this.mid,\n    this.name,\n    this.approve,\n    this.rank,\n    this.face,\n    this.displayRank,\n    this.regtime,\n    this.spacesta,\n    this.birthday,\n    this.place,\n    this.description,\n    this.article,\n    this.attentions,\n    this.fans,\n    this.friend,\n    this.attention,\n    this.sign,\n    this.levelInfo,\n    this.pendant,\n    this.nameplate,\n    this.officialVerify,\n    this.professionVerify,\n    this.vip,\n    this.silence,\n    this.endTime,\n    this.silenceUrl,\n    this.likes,\n    this.achieve,\n    this.relation,\n    this.isDeleted,\n    this.honours,\n    this.liveFansWearing,\n    this.spaceTag,\n    this.faceNftNew,\n    this.hasFaceNft,\n    this.nftCertificate,\n    this.entrance,\n    this.nftId,\n    this.nftFaceIcon,\n    this.digitalId,\n    this.digitalType,\n    this.hasDigitalAsset,\n    this.prInfo,\n    this.followingsFollowedUpper,\n  });\n\n  factory SpaceCard.fromJson(Map<String, dynamic> json) => SpaceCard(\n    mid: json['mid'] as String?,\n    name: json['name'] as String?,\n    approve: json['approve'] as bool?,\n    rank: json['rank'] as String?,\n    face: json['face'] as String?,\n    displayRank: json['DisplayRank'] as String?,\n    regtime: json['regtime'] as int?,\n    spacesta: json['spacesta'] as int?,\n    birthday: json['birthday'] as String?,\n    place: json['place'] as String?,\n    description: json['description'] as String?,\n    article: json['article'] as int?,\n    attentions: json['attentions'] as dynamic,\n    fans: json['fans'] as int?,\n    friend: json['friend'] as int?,\n    attention: json['attention'] as int?,\n    sign: json['sign'] as String?,\n    levelInfo: json['level_info'] == null\n        ? null\n        : LevelInfo.fromJson(json['level_info'] as Map<String, dynamic>),\n    pendant: json['pendant'] == null\n        ? null\n        : Pendant.fromJson(json['pendant'] as Map<String, dynamic>),\n    nameplate: json['nameplate'] == null\n        ? null\n        : Nameplate.fromJson(json['nameplate'] as Map<String, dynamic>),\n    officialVerify: json['official_verify'] == null\n        ? null\n        : OfficialVerify.fromJson(\n            json['official_verify'] as Map<String, dynamic>,\n          ),\n    professionVerify: json['profession_verify'] == null\n        ? null\n        : ProfessionVerify.fromJson(\n            json['profession_verify'] as Map<String, dynamic>,\n          ),\n    vip: json['vip'] == null\n        ? null\n        : Vip.fromJson(json['vip'] as Map<String, dynamic>),\n    silence: json['silence'] as int?,\n    endTime: json['end_time'] as int?,\n    silenceUrl: json['silence_url'] as String?,\n    likes: json['likes'] == null\n        ? null\n        : Likes.fromJson(json['likes'] as Map<String, dynamic>),\n    achieve: json['achieve'] == null\n        ? null\n        : Achieve.fromJson(json['achieve'] as Map<String, dynamic>),\n    relation: json['relation'] == null\n        ? null\n        : SpaceRelation.fromJson(json['relation'] as Map<String, dynamic>),\n    isDeleted: json['is_deleted'] as int?,\n    honours: json['honours'] == null\n        ? null\n        : Honours.fromJson(json['honours'] as Map<String, dynamic>),\n    liveFansWearing: json['live_fans_wearing'] == null\n        ? null\n        : LiveFansWearing.fromJson(\n            json['live_fans_wearing'] as Map<String, dynamic>,\n          ),\n    spaceTag: (json['space_tag'] as List<dynamic>?)\n        ?.where((e) => const ['location', 'real_name'].contains(e['type']))\n        .map((e) => SpaceTag.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    faceNftNew: json['face_nft_new'] as int?,\n    hasFaceNft: json['has_face_nft'] as bool?,\n    nftCertificate: json['nft_certificate'] == null\n        ? null\n        : NftCertificate.fromJson(\n            json['nft_certificate'] as Map<String, dynamic>,\n          ),\n    entrance: json['entrance'] == null\n        ? null\n        : Entrance.fromJson(json['entrance'] as Map<String, dynamic>),\n    nftId: json['nft_id'] as String?,\n    nftFaceIcon: json['nft_face_icon'] as dynamic,\n    digitalId: json['digital_id'] as String?,\n    digitalType: json['digital_type'] as int?,\n    hasDigitalAsset: json['has_digital_asset'] as bool?,\n    prInfo: json['pr_info'] == null\n        ? null\n        : SpacePrInfo.fromJson(json['pr_info'] as Map<String, dynamic>),\n    followingsFollowedUpper: json['followings_followed_upper'] == null\n        ? null\n        : FollowingsFollowedUpper.fromJson(\n            json['followings_followed_upper'] as Map<String, dynamic>,\n          ),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/category.dart",
    "content": "class Category {\n  int? id;\n  int? parentId;\n  String? name;\n\n  Category({this.id, this.parentId, this.name});\n\n  factory Category.fromJson(Map<String, dynamic> json) => Category(\n    id: json['id'] as int?,\n    parentId: json['parent_id'] as int?,\n    name: json['name'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/cheese.dart",
    "content": "import 'package:PiliPlus/models_new/space/space/item.dart';\n\nclass Cheese {\n  int? count;\n  List<Item>? item;\n\n  Cheese({this.count, this.item});\n\n  factory Cheese.fromJson(Map<String, dynamic> json) => Cheese(\n    count: json['count'] as int?,\n    item: (json['item'] as List<dynamic>?)\n        ?.map((e) => Item.fromJson(e as Map<String, dynamic>))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/coin_archive.dart",
    "content": "import 'package:PiliPlus/models_new/space/space_archive/item.dart';\n\nclass CoinArchive {\n  int? count;\n  List<SpaceArchiveItem>? item;\n\n  CoinArchive({this.count, this.item});\n\n  factory CoinArchive.fromJson(Map<String, dynamic> json) => CoinArchive(\n    count: json['count'] as int?,\n    item: (json['item'] as List<dynamic>?)\n        ?.map((e) => SpaceArchiveItem.fromJson(e))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/collection_top_simple.dart",
    "content": "import 'package:PiliPlus/models_new/space/space/preference.dart';\nimport 'package:PiliPlus/models_new/space/space/top.dart';\n\nclass CollectionTopSimple {\n  Top? top;\n  int? max;\n  Preference? preference;\n  String? collectionCompletedUrl;\n\n  CollectionTopSimple({\n    this.top,\n    this.max,\n    this.preference,\n    this.collectionCompletedUrl,\n  });\n\n  factory CollectionTopSimple.fromJson(Map<String, dynamic> json) {\n    return CollectionTopSimple(\n      top: json['top'] == null\n          ? null\n          : Top.fromJson(json['top'] as Map<String, dynamic>),\n      max: json['max'] as int?,\n      preference: json['preference'] == null\n          ? null\n          : Preference.fromJson(json['preference'] as Map<String, dynamic>),\n      collectionCompletedUrl: json['collection_completed_url'] as String?,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/models_new/space/space/color_config.dart",
    "content": "import 'package:PiliPlus/models_new/space/space/day.dart';\nimport 'package:PiliPlus/models_new/space/space/night.dart';\n\nclass ColorConfig {\n  bool? isDarkModeAware;\n  Day? day;\n  Night? night;\n\n  ColorConfig({this.isDarkModeAware, this.day, this.night});\n\n  factory ColorConfig.fromJson(Map<String, dynamic> json) => ColorConfig(\n    isDarkModeAware: json['is_dark_mode_aware'] as bool?,\n    day: json['day'] == null\n        ? null\n        : Day.fromJson(json['day'] as Map<String, dynamic>),\n    night: json['night'] == null\n        ? null\n        : Night.fromJson(json['night'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/colour.dart",
    "content": "class Colour {\n  String? dark;\n  String? normal;\n\n  Colour({this.dark, this.normal});\n\n  factory Colour.fromJson(Map<String, dynamic> json) => Colour(\n    dark: json['dark'] as String?,\n    normal: json['normal'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/comic.dart",
    "content": "import 'package:PiliPlus/models_new/space/space_archive/item.dart';\n\nclass Comic {\n  int? count;\n  List<SpaceArchiveItem>? item;\n\n  Comic({this.count, this.item});\n\n  factory Comic.fromJson(Map<String, dynamic> json) => Comic(\n    count: json['count'] as int?,\n    item: (json['item'] as List<dynamic>?)\n        ?.map((e) => SpaceArchiveItem.fromJson(e))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/container_size.dart",
    "content": "class ContainerSize {\n  double? width;\n  double? height;\n\n  ContainerSize({this.width, this.height});\n\n  factory ContainerSize.fromJson(Map<String, dynamic> json) => ContainerSize(\n    width: (json['width'] as num?)?.toDouble(),\n    height: (json['height'] as num?)?.toDouble(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/cover.dart",
    "content": "class Cover {\n  String? url;\n\n  Cover({this.url});\n\n  factory Cover.fromJson(Map<String, dynamic> json) => Cover(\n    url: json['url'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/data.dart",
    "content": "import 'package:PiliPlus/models_new/space/space/archive.dart';\nimport 'package:PiliPlus/models_new/space/space/article.dart';\nimport 'package:PiliPlus/models_new/space/space/attention_tip.dart';\nimport 'package:PiliPlus/models_new/space/space/audios.dart';\nimport 'package:PiliPlus/models_new/space/space/card.dart';\nimport 'package:PiliPlus/models_new/space/space/cheese.dart';\nimport 'package:PiliPlus/models_new/space/space/coin_archive.dart';\nimport 'package:PiliPlus/models_new/space/space/comic.dart';\nimport 'package:PiliPlus/models_new/space/space/elec.dart';\nimport 'package:PiliPlus/models_new/space/space/entry.dart';\nimport 'package:PiliPlus/models_new/space/space/favourite2.dart';\nimport 'package:PiliPlus/models_new/space/space/guard.dart';\nimport 'package:PiliPlus/models_new/space/space/images.dart';\nimport 'package:PiliPlus/models_new/space/space/like_archive.dart';\nimport 'package:PiliPlus/models_new/space/space/live.dart';\nimport 'package:PiliPlus/models_new/space/space/nft_show_module.dart';\nimport 'package:PiliPlus/models_new/space/space/play_game.dart';\nimport 'package:PiliPlus/models_new/space/space/season.dart';\nimport 'package:PiliPlus/models_new/space/space/series.dart';\nimport 'package:PiliPlus/models_new/space/space/setting.dart';\nimport 'package:PiliPlus/models_new/space/space/space_button_list.dart';\nimport 'package:PiliPlus/models_new/space/space/tab.dart';\nimport 'package:PiliPlus/models_new/space/space/tab2.dart';\nimport 'package:PiliPlus/models_new/space/space/ugc_season.dart';\n\nclass SpaceData {\n  int? relation;\n  int? guestRelation;\n  int? medal;\n  String? defaultTab;\n  bool? isParams;\n  SpaceSetting? setting;\n  SpaceTab? tab;\n  SpaceCard? card;\n  SpaceImages? images;\n  Live? live;\n  Elec? elec;\n  Archive? archive;\n  SpaceSeries? series;\n  PlayGame? playGame;\n  Article? article;\n  SpaceSeason? season;\n  CoinArchive? coinArchive;\n  LikeArchive? likeArchive;\n  Audios? audios;\n  Favourite2? favourite2;\n  Comic? comic;\n  UgcSeason? ugcSeason;\n  int? adShopType;\n  String? adContainerPath;\n  Cheese? cheese;\n  Guard? guard;\n  AttentionTip? attentionTip;\n  NftShowModule? nftShowModule;\n  List<SpaceTab2>? tab2;\n  dynamic nftFaceButton;\n  dynamic digitalButton;\n  List<Entry>? entry;\n  List<SpaceButtonList>? spaceButtonList;\n  int? relSpecial;\n  bool? hasItem;\n\n  SpaceData({\n    this.relation,\n    this.guestRelation,\n    this.medal,\n    this.defaultTab,\n    this.isParams,\n    this.setting,\n    this.tab,\n    this.card,\n    this.images,\n    this.live,\n    this.elec,\n    this.archive,\n    this.series,\n    this.playGame,\n    this.article,\n    this.season,\n    this.coinArchive,\n    this.likeArchive,\n    this.audios,\n    this.favourite2,\n    this.comic,\n    this.ugcSeason,\n    this.cheese,\n    this.guard,\n    this.attentionTip,\n    this.nftShowModule,\n    this.tab2,\n    this.nftFaceButton,\n    this.digitalButton,\n    this.entry,\n    this.spaceButtonList,\n    this.relSpecial,\n  });\n\n  SpaceData.fromJson(Map<String, dynamic> json) {\n    relation = json['relation'] as int?;\n    guestRelation = json['guest_relation'] as int?;\n    medal = json['medal'] as int?;\n    defaultTab = json['default_tab'] as String?;\n    isParams = json['is_params'] as bool?;\n    setting = json['setting'] == null\n        ? null\n        : SpaceSetting.fromJson(json['setting'] as Map<String, dynamic>);\n    tab = json['tab'] == null\n        ? null\n        : SpaceTab.fromJson(json['tab'] as Map<String, dynamic>);\n    card = json['card'] == null\n        ? null\n        : SpaceCard.fromJson(json['card'] as Map<String, dynamic>);\n    images = json['images'] == null\n        ? null\n        : SpaceImages.fromJson(json['images'] as Map<String, dynamic>);\n    live = json['live'] == null\n        ? null\n        : Live.fromJson(json['live'] as Map<String, dynamic>);\n    elec = json['elec'] == null\n        ? null\n        : Elec.fromJson(json['elec'] as Map<String, dynamic>);\n    archive = json['archive'] == null\n        ? null\n        : Archive.fromJson(json['archive'] as Map<String, dynamic>);\n    series = json['series'] == null\n        ? null\n        : SpaceSeries.fromJson(json['series'] as Map<String, dynamic>);\n    playGame = json['play_game'] == null\n        ? null\n        : PlayGame.fromJson(json['play_game'] as Map<String, dynamic>);\n    article = json['article'] == null\n        ? null\n        : Article.fromJson(json['article'] as Map<String, dynamic>);\n    season = json['season'] == null\n        ? null\n        : SpaceSeason.fromJson(json['season'] as Map<String, dynamic>);\n    coinArchive = json['coin_archive'] == null\n        ? null\n        : CoinArchive.fromJson(json['coin_archive'] as Map<String, dynamic>);\n    likeArchive = json['like_archive'] == null\n        ? null\n        : LikeArchive.fromJson(json['like_archive'] as Map<String, dynamic>);\n    audios = json['audios'] == null\n        ? null\n        : Audios.fromJson(json['audios'] as Map<String, dynamic>);\n    favourite2 = json['favourite2'] == null\n        ? null\n        : Favourite2.fromJson(json['favourite2'] as Map<String, dynamic>);\n    comic = json['comic'] == null\n        ? null\n        : Comic.fromJson(json['comic'] as Map<String, dynamic>);\n    ugcSeason = json['ugc_season'] == null\n        ? null\n        : UgcSeason.fromJson(json['ugc_season'] as Map<String, dynamic>);\n    cheese = json['cheese'] == null\n        ? null\n        : Cheese.fromJson(json['cheese'] as Map<String, dynamic>);\n    guard = json['guard'] == null\n        ? null\n        : Guard.fromJson(json['guard'] as Map<String, dynamic>);\n    attentionTip = json['attention_tip'] == null\n        ? null\n        : AttentionTip.fromJson(json['attention_tip'] as Map<String, dynamic>);\n    nftShowModule = json['nft_show_module'] == null\n        ? null\n        : NftShowModule.fromJson(\n            json['nft_show_module'] as Map<String, dynamic>,\n          );\n    tab2 = (json['tab2'] as List<dynamic>?)\n        ?.map((e) => SpaceTab2.fromJson(e as Map<String, dynamic>))\n        .toList();\n    nftFaceButton = json['nft_face_button'] as dynamic;\n    digitalButton = json['digital_button'] as dynamic;\n    entry = (json['entry'] as List<dynamic>?)\n        ?.map((e) => Entry.fromJson(e as Map<String, dynamic>))\n        .toList();\n    spaceButtonList = (json['space_button_list'] as List<dynamic>?)\n        ?.map((e) => SpaceButtonList.fromJson(e as Map<String, dynamic>))\n        .toList();\n    relSpecial = (json['rel_special'] as num?)?.toInt();\n    hasItem =\n        archive?.item?.isNotEmpty == true ||\n        favourite2?.item?.isNotEmpty == true ||\n        coinArchive?.item?.isNotEmpty == true ||\n        likeArchive?.item?.isNotEmpty == true ||\n        article?.item?.isNotEmpty == true ||\n        audios?.item?.isNotEmpty == true ||\n        comic?.item?.isNotEmpty == true ||\n        season?.item?.isNotEmpty == true;\n  }\n}\n"
  },
  {
    "path": "lib/models_new/space/space/day.dart",
    "content": "class Day {\n  String? argb;\n\n  Day({this.argb});\n\n  factory Day.fromJson(Map<String, dynamic> json) => Day(\n    argb: json['argb'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/digital_info.dart",
    "content": "class DigitalInfo {\n  bool? active;\n  String? jumpUrl;\n  int? nftType;\n  int? backgroundHandle;\n  String? animationFirstFrame;\n  dynamic musicAlbum;\n  dynamic animation;\n  String? nftRegionTitle;\n  int? cardId;\n  String? cutSpaceBg;\n  int? partType;\n  String? itemJumpUrl;\n\n  DigitalInfo({\n    this.active,\n    this.jumpUrl,\n    this.nftType,\n    this.backgroundHandle,\n    this.animationFirstFrame,\n    this.musicAlbum,\n    this.animation,\n    this.nftRegionTitle,\n    this.cardId,\n    this.cutSpaceBg,\n    this.partType,\n    this.itemJumpUrl,\n  });\n\n  factory DigitalInfo.fromJson(Map<String, dynamic> json) => DigitalInfo(\n    active: json['active'] as bool?,\n    jumpUrl: json['jump_url'] as String?,\n    nftType: json['nft_type'] as int?,\n    backgroundHandle: json['background_handle'] as int?,\n    animationFirstFrame: json['animation_first_frame'] as String?,\n    musicAlbum: json['music_album'] as dynamic,\n    animation: json['animation'] as dynamic,\n    nftRegionTitle: json['nft_region_title'] as String?,\n    cardId: json['card_id'] as int?,\n    cutSpaceBg: json['cut_space_bg'] as String?,\n    partType: json['part_type'] as int?,\n    itemJumpUrl: json['item_jump_url'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/display.dart",
    "content": "class Display {\n  String? bgThemeLight;\n  String? bgThemeNight;\n  String? nftPoster;\n  String? nftRaw;\n\n  Display({\n    this.bgThemeLight,\n    this.bgThemeNight,\n    this.nftPoster,\n    this.nftRaw,\n  });\n\n  factory Display.fromJson(Map<String, dynamic> json) => Display(\n    bgThemeLight: json['bg_theme_light'] as String?,\n    bgThemeNight: json['bg_theme_night'] as String?,\n    nftPoster: json['nft_poster'] as String?,\n    nftRaw: json['nft_raw'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/draw.dart",
    "content": "import 'package:PiliPlus/models_new/space/space/color_config.dart';\n\nclass Draw {\n  int? drawType;\n  int? fillMode;\n  ColorConfig? colorConfig;\n\n  Draw({this.drawType, this.fillMode, this.colorConfig});\n\n  factory Draw.fromJson(Map<String, dynamic> json) => Draw(\n    drawType: json['draw_type'] as int?,\n    fillMode: json['fill_mode'] as int?,\n    colorConfig: json['color_config'] == null\n        ? null\n        : ColorConfig.fromJson(json['color_config'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/draw_src.dart",
    "content": "import 'package:PiliPlus/models_new/space/space/draw.dart';\n\nclass DrawSrc {\n  int? srcType;\n  Draw? draw;\n\n  DrawSrc({this.srcType, this.draw});\n\n  factory DrawSrc.fromJson(Map<String, dynamic> json) => DrawSrc(\n    srcType: json['src_type'] as int?,\n    draw: json['draw'] == null\n        ? null\n        : Draw.fromJson(json['draw'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/elec.dart",
    "content": "import 'package:PiliPlus/models_new/space/space/elec_set.dart';\nimport 'package:PiliPlus/models_new/space/space/list.dart';\n\nclass Elec {\n  bool? show;\n  int? total;\n  int? count;\n  int? elecNum;\n  List<ListItem>? list;\n  ElecSet? elecSet;\n  int? state;\n  String? upowerTitle;\n  String? upowerJumpUrl;\n  String? upowerIconUrl;\n  int? upowerState;\n  String? rankTitle;\n  String? rankUrl;\n\n  Elec({\n    this.show,\n    this.total,\n    this.count,\n    this.elecNum,\n    this.list,\n    this.elecSet,\n    this.state,\n    this.upowerTitle,\n    this.upowerJumpUrl,\n    this.upowerIconUrl,\n    this.upowerState,\n    this.rankTitle,\n    this.rankUrl,\n  });\n\n  factory Elec.fromJson(Map<String, dynamic> json) => Elec(\n    show: json['show'] as bool?,\n    total: json['total'] as int?,\n    count: json['count'] as int?,\n    elecNum: json['elec_num'] as int?,\n    list: (json['list'] as List<dynamic>?)\n        ?.map((e) => ListItem.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    elecSet: json['elec_set'] == null\n        ? null\n        : ElecSet.fromJson(json['elec_set'] as Map<String, dynamic>),\n    state: json['state'] as int?,\n    upowerTitle: json['upower_title'] as String?,\n    upowerJumpUrl: json['upower_jump_url'] as String?,\n    upowerIconUrl: json['upower_icon_url'] as String?,\n    upowerState: json['upower_state'] as int?,\n    rankTitle: json['rank_title'] as String?,\n    rankUrl: json['rank_url'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/elec_list.dart",
    "content": "class ElecList {\n  String? title;\n  int? elecNum;\n  int? isCustomize;\n  String? bpNum;\n  String? minBp;\n  String? maxBp;\n  int? bpNumFen;\n  int? isDefault;\n  int? minElec;\n  int? maxElec;\n  int? minBpFen;\n  int? maxBpFen;\n\n  ElecList({\n    this.title,\n    this.elecNum,\n    this.isCustomize,\n    this.bpNum,\n    this.minBp,\n    this.maxBp,\n    this.bpNumFen,\n    this.isDefault,\n    this.minElec,\n    this.maxElec,\n    this.minBpFen,\n    this.maxBpFen,\n  });\n\n  factory ElecList.fromJson(Map<String, dynamic> json) => ElecList(\n    title: json['title'] as String?,\n    elecNum: json['elec_num'] as int?,\n    isCustomize: json['is_customize'] as int?,\n    bpNum: json['bp_num'] as String?,\n    minBp: json['min_bp'] as String?,\n    maxBp: json['max_bp'] as String?,\n    bpNumFen: json['bp_num_fen'] as int?,\n    isDefault: json['is_default'] as int?,\n    minElec: json['min_elec'] as int?,\n    maxElec: json['max_elec'] as int?,\n    minBpFen: json['min_bp_fen'] as int?,\n    maxBpFen: json['max_bp_fen'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/elec_set.dart",
    "content": "import 'package:PiliPlus/models_new/space/space/elec_list.dart';\n\nclass ElecSet {\n  int? elecTheme;\n  int? rmbRate;\n  int? integrityRate;\n  int? roundMode;\n  List<ElecList>? elecList;\n  String? batteryItemDesc;\n\n  ElecSet({\n    this.elecTheme,\n    this.rmbRate,\n    this.integrityRate,\n    this.roundMode,\n    this.elecList,\n    this.batteryItemDesc,\n  });\n\n  factory ElecSet.fromJson(Map<String, dynamic> json) => ElecSet(\n    elecTheme: json['elec_theme'] as int?,\n    rmbRate: json['rmb_rate'] as int?,\n    integrityRate: json['integrity_rate'] as int?,\n    roundMode: json['round_mode'] as int?,\n    elecList: (json['elec_list'] as List<dynamic>?)\n        ?.map((e) => ElecList.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    batteryItemDesc: json['battery_item_desc'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/entrance.dart",
    "content": "class Entrance {\n  String? icon;\n  String? jumpUrl;\n  bool? isShowEntrance;\n\n  Entrance({this.icon, this.jumpUrl, this.isShowEntrance});\n\n  factory Entrance.fromJson(Map<String, dynamic> json) => Entrance(\n    icon: json['icon'] as String?,\n    jumpUrl: json['jump_url'] as String?,\n    isShowEntrance: json['is_show_entrance'] as bool?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/entrance_button.dart",
    "content": "class EntranceButton {\n  String? uri;\n  String? title;\n\n  EntranceButton({this.uri, this.title});\n\n  factory EntranceButton.fromJson(Map<String, dynamic> json) {\n    return EntranceButton(\n      uri: json['uri'] as String?,\n      title: json['title'] as String?,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/models_new/space/space/entry.dart",
    "content": "class Entry {\n  String? icon;\n  String? jumpLink;\n  String? accessibility;\n  bool? needLogin;\n\n  Entry({this.icon, this.jumpLink, this.accessibility, this.needLogin});\n\n  factory Entry.fromJson(Map<String, dynamic> json) => Entry(\n    icon: json['icon'] as String?,\n    jumpLink: json['jump_link'] as String?,\n    accessibility: json['accessibility'] as String?,\n    needLogin: json['need_login'] as bool?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/episodic_button.dart",
    "content": "class EpisodicButton {\n  String? text;\n  String? uri;\n\n  EpisodicButton({this.text, this.uri});\n\n  factory EpisodicButton.fromJson(Map<String, dynamic> json) {\n    return EpisodicButton(\n      text: json['text'] as String?,\n      uri: json['uri'] as String?,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/models_new/space/space/extra.dart",
    "content": "import 'package:PiliPlus/models_new/space/space/card.dart';\n\nclass Extra {\n  SpaceCard? card;\n  int? salesType;\n  int? upzoneEntranceType;\n  String? upzoneEntranceReportId;\n\n  Extra({\n    this.card,\n    this.salesType,\n    this.upzoneEntranceType,\n    this.upzoneEntranceReportId,\n  });\n\n  factory Extra.fromJson(Map<String, dynamic> json) => Extra(\n    card: json['card'] == null\n        ? null\n        : SpaceCard.fromJson(json['card'] as Map<String, dynamic>),\n    salesType: json['sales_type'] as int?,\n    upzoneEntranceType: json['upzone_entrance_type'] as int?,\n    upzoneEntranceReportId: json['upzone_entrance_report_id'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/favourite2.dart",
    "content": "import 'package:PiliPlus/models_new/space/space_fav/list.dart';\n\nclass Favourite2 {\n  int? count;\n  List<SpaceFavItemModel>? item;\n\n  Favourite2({this.count, this.item});\n\n  factory Favourite2.fromJson(Map<String, dynamic> json) => Favourite2(\n    count: json['count'] as int?,\n    item: (json['item'] as List<dynamic>?)\n        ?.map((e) => SpaceFavItemModel.fromJson(e))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/followings_followed_upper.dart",
    "content": "import 'package:PiliPlus/models/model_owner.dart';\n\nclass FollowingsFollowedUpper {\n  List<Owner>? items;\n  String? jumpUrl;\n\n  FollowingsFollowedUpper({this.items, this.jumpUrl});\n\n  factory FollowingsFollowedUpper.fromJson(Map<String, dynamic> json) =>\n      FollowingsFollowedUpper(\n        items: (json['items'] as List?)?.map((e) => Owner.fromJson(e)).toList(),\n        jumpUrl: json['jump_url'] as String?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/general_spec.dart",
    "content": "import 'package:PiliPlus/models_new/space/space/pos_spec.dart';\nimport 'package:PiliPlus/models_new/space/space/render_spec.dart';\nimport 'package:PiliPlus/models_new/space/space/size_spec.dart';\n\nclass GeneralSpec {\n  PosSpec? posSpec;\n  SizeSpec? sizeSpec;\n  RenderSpec? renderSpec;\n\n  GeneralSpec({this.posSpec, this.sizeSpec, this.renderSpec});\n\n  factory GeneralSpec.fromJson(Map<String, dynamic> json) => GeneralSpec(\n    posSpec: json['pos_spec'] == null\n        ? null\n        : PosSpec.fromJson(json['pos_spec'] as Map<String, dynamic>),\n    sizeSpec: json['size_spec'] == null\n        ? null\n        : SizeSpec.fromJson(json['size_spec'] as Map<String, dynamic>),\n    renderSpec: json['render_spec'] == null\n        ? null\n        : RenderSpec.fromJson(json['render_spec'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/guard.dart",
    "content": "import 'package:PiliPlus/models_new/space/space/item.dart';\n\nclass Guard {\n  String? uri;\n  String? desc;\n  String? highLight;\n  List<Item>? item;\n  String? buttonMsg;\n\n  Guard({this.uri, this.desc, this.highLight, this.item, this.buttonMsg});\n\n  factory Guard.fromJson(Map<String, dynamic> json) => Guard(\n    uri: json['uri'] as String?,\n    desc: json['desc'] as String?,\n    highLight: json['high_light'] as String?,\n    item: (json['item'] as List<dynamic>?)\n        ?.map((e) => Item.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    buttonMsg: json['button_msg'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/honours.dart",
    "content": "import 'package:PiliPlus/models_new/space/space/colour.dart';\n\nclass Honours {\n  Colour? colour;\n  List<dynamic>? tags;\n\n  Honours({this.colour, this.tags});\n\n  factory Honours.fromJson(Map<String, dynamic> json) => Honours(\n    colour: json['colour'] == null\n        ? null\n        : Colour.fromJson(json['colour'] as Map<String, dynamic>),\n    tags: json['tags'] as List<dynamic>?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/images.dart",
    "content": "import 'package:PiliPlus/models_new/space/space/collection_top_simple.dart';\nimport 'package:PiliPlus/models_new/space/space/digital_info.dart';\nimport 'package:PiliPlus/models_new/space/space/entrance_button.dart';\nimport 'package:PiliPlus/models_new/space/space/purchase_button.dart';\n\nclass SpaceImages {\n  String? imgUrl;\n  String? nightImgurl;\n  bool? goodsAvailable;\n  PurchaseButton? purchaseButton;\n  EntranceButton? entranceButton;\n  DigitalInfo? digitalInfo;\n  bool? showDigital;\n  CollectionTopSimple? collectionTopSimple;\n\n  SpaceImages({\n    this.imgUrl,\n    this.nightImgurl,\n    this.goodsAvailable,\n    this.purchaseButton,\n    this.entranceButton,\n    this.digitalInfo,\n    this.showDigital,\n    this.collectionTopSimple,\n  });\n\n  factory SpaceImages.fromJson(Map<String, dynamic> json) => SpaceImages(\n    imgUrl: json['imgUrl'] as String?,\n    nightImgurl: json['night_imgurl'] as String?,\n    goodsAvailable: json['goods_available'] as bool?,\n    purchaseButton: json['purchase_button'] == null\n        ? null\n        : PurchaseButton.fromJson(\n            json['purchase_button'] as Map<String, dynamic>,\n          ),\n    entranceButton: json['entrance_button'] == null\n        ? null\n        : EntranceButton.fromJson(\n            json['entrance_button'] as Map<String, dynamic>,\n          ),\n    digitalInfo: json['digital_info'] == null\n        ? null\n        : DigitalInfo.fromJson(json['digital_info'] as Map<String, dynamic>),\n    showDigital: json['show_digital'] as bool?,\n    collectionTopSimple: json['collection_top_simple'] == null\n        ? null\n        : CollectionTopSimple.fromJson(\n            json['collection_top_simple'] as Map<String, dynamic>,\n          ),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/item.dart",
    "content": "import 'package:PiliPlus/models_new/space/space/badge.dart';\n\nclass Item {\n  String? title;\n  String? subtitle;\n  String? tname;\n  String? cover;\n  String? coverIcon;\n  String? uri;\n  String? param;\n  String? goto;\n  String? length;\n  int? duration;\n  bool? isPopular;\n  bool? isSteins;\n  bool? isUgcpay;\n  bool? isCooperation;\n  bool? isPgc;\n  bool? isLivePlayback;\n  bool? isPugv;\n  bool? isFold;\n  bool? isOneself;\n  int? play;\n  int? danmaku;\n  int? ctime;\n  int? ugcPay;\n  List<Badge>? badges;\n  String? author;\n  bool? state;\n  String? bvid;\n  int? videos;\n  int? firstCid;\n  String? viewContent;\n  int? iconType;\n  String? publishTimeText;\n\n  Item({\n    this.title,\n    this.subtitle,\n    this.tname,\n    this.cover,\n    this.coverIcon,\n    this.uri,\n    this.param,\n    this.goto,\n    this.length,\n    this.duration,\n    this.isPopular,\n    this.isSteins,\n    this.isUgcpay,\n    this.isCooperation,\n    this.isPgc,\n    this.isLivePlayback,\n    this.isPugv,\n    this.isFold,\n    this.isOneself,\n    this.play,\n    this.danmaku,\n    this.ctime,\n    this.ugcPay,\n    this.badges,\n    this.author,\n    this.state,\n    this.bvid,\n    this.videos,\n    this.firstCid,\n    this.viewContent,\n    this.iconType,\n    this.publishTimeText,\n  });\n\n  factory Item.fromJson(Map<String, dynamic> json) => Item(\n    title: json['title'] as String?,\n    subtitle: json['subtitle'] as String?,\n    tname: json['tname'] as String?,\n    cover: json['cover'] as String?,\n    coverIcon: json['cover_icon'] as String?,\n    uri: json['uri'] as String?,\n    param: json['param'] as String?,\n    goto: json['goto'] as String?,\n    length: json['length'] as String?,\n    duration: json['duration'] as int?,\n    isPopular: json['is_popular'] as bool?,\n    isSteins: json['is_steins'] as bool?,\n    isUgcpay: json['is_ugcpay'] as bool?,\n    isCooperation: json['is_cooperation'] as bool?,\n    isPgc: json['is_pgc'] as bool?,\n    isLivePlayback: json['is_live_playback'] as bool?,\n    isPugv: json['is_pugv'] as bool?,\n    isFold: json['is_fold'] as bool?,\n    isOneself: json['is_oneself'] as bool?,\n    play: json['play'] as int?,\n    danmaku: json['danmaku'] as int?,\n    ctime: json['ctime'] as int?,\n    ugcPay: json['ugc_pay'] as int?,\n    badges: (json['badges'] as List<dynamic>?)\n        ?.map((e) => Badge.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    author: json['author'] as String?,\n    state: json['state'] as bool?,\n    bvid: json['bvid'] as String?,\n    videos: json['videos'] as int?,\n    firstCid: json['first_cid'] as int?,\n    viewContent: json['view_content'] as String?,\n    iconType: json['icon_type'] as int?,\n    publishTimeText: json['publish_time_text'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/label.dart",
    "content": "class Label {\n  String? path;\n  String? text;\n  String? labelTheme;\n  String? textColor;\n  int? bgStyle;\n  String? bgColor;\n  String? borderColor;\n  String? image;\n\n  Label({\n    this.path,\n    this.text,\n    this.labelTheme,\n    this.textColor,\n    this.bgStyle,\n    this.bgColor,\n    this.borderColor,\n    this.image,\n  });\n\n  factory Label.fromJson(Map<String, dynamic> json) => Label(\n    path: json['path'] as String?,\n    text: json['text'] as String?,\n    labelTheme: json['label_theme'] as String?,\n    textColor: json['text_color'] as String?,\n    bgStyle: json['bg_style'] as int?,\n    bgColor: json['bg_color'] as String?,\n    borderColor: json['border_color'] as String?,\n    image: json['image'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/level_info.dart",
    "content": "import 'package:PiliPlus/models_new/space/space/senior_inquiry.dart';\n\nclass LevelInfo {\n  int? currentLevel;\n  int? currentMin;\n  int? currentExp;\n  dynamic nextExp;\n  int? identity;\n  SeniorInquiry? seniorInquiry;\n\n  LevelInfo({\n    this.currentLevel,\n    this.currentMin,\n    this.currentExp,\n    this.nextExp,\n    this.identity,\n    this.seniorInquiry,\n  });\n\n  factory LevelInfo.fromJson(Map<String, dynamic> json) => LevelInfo(\n    currentLevel: json['current_level'] as int?,\n    currentMin: json['current_min'] as int?,\n    currentExp: json['current_exp'] as int?,\n    nextExp: json['next_exp'] as dynamic,\n    identity: json['identity'] as int?,\n    seniorInquiry: json['senior_inquiry'] == null\n        ? null\n        : SeniorInquiry.fromJson(\n            json['senior_inquiry'] as Map<String, dynamic>,\n          ),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/like_archive.dart",
    "content": "import 'package:PiliPlus/models_new/space/space_archive/item.dart';\n\nclass LikeArchive {\n  int? count;\n  List<SpaceArchiveItem>? item;\n\n  LikeArchive({this.count, this.item});\n\n  factory LikeArchive.fromJson(Map<String, dynamic> json) => LikeArchive(\n    count: json['count'] as int?,\n    item: (json['item'] as List<dynamic>?)\n        ?.map((e) => SpaceArchiveItem.fromJson(e))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/likes.dart",
    "content": "class Likes {\n  int? likeNum;\n  String? skrTip;\n\n  Likes({this.likeNum, this.skrTip});\n\n  factory Likes.fromJson(Map<String, dynamic> json) => Likes(\n    likeNum: json['like_num'] as int?,\n    skrTip: json['skr_tip'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/list.dart",
    "content": "class ListItem {\n  int? payMid;\n  int? rank;\n  int? trendType;\n  String? message;\n  int? mid;\n  dynamic vipInfo;\n  String? uname;\n  String? avatar;\n\n  ListItem({\n    this.payMid,\n    this.rank,\n    this.trendType,\n    this.message,\n    this.mid,\n    this.vipInfo,\n    this.uname,\n    this.avatar,\n  });\n\n  factory ListItem.fromJson(Map<String, dynamic> json) => ListItem(\n    payMid: json['pay_mid'] as int?,\n    rank: json['rank'] as int?,\n    trendType: json['trend_type'] as int?,\n    message: json['message'] as String?,\n    mid: json['mid'] as int?,\n    vipInfo: json['vip_info'] as dynamic,\n    uname: json['uname'] as String?,\n    avatar: json['avatar'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/live.dart",
    "content": "class Live {\n  int? roomStatus;\n  int? roundStatus;\n  int? liveStatus;\n  String? url;\n  String? title;\n  String? cover;\n  int? online;\n  int? roomid;\n  int? broadcastType;\n  int? onlineHidden;\n  String? link;\n\n  Live({\n    this.roomStatus,\n    this.roundStatus,\n    this.liveStatus,\n    this.url,\n    this.title,\n    this.cover,\n    this.online,\n    this.roomid,\n    this.broadcastType,\n    this.onlineHidden,\n    this.link,\n  });\n\n  factory Live.fromJson(Map<String, dynamic> json) => Live(\n    roomStatus: json['roomStatus'] as int?,\n    roundStatus: json['roundStatus'] as int?,\n    liveStatus: json['liveStatus'] as int?,\n    url: json['url'] as String?,\n    title: json['title'] as String?,\n    cover: json['cover'] as String?,\n    online: json['online'] as int?,\n    roomid: json['roomid'] as int?,\n    broadcastType: json['broadcast_type'] as int?,\n    onlineHidden: json['online_hidden'] as int?,\n    link: json['link'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/live_fans_wearing.dart",
    "content": "class LiveFansWearing {\n  int? level;\n  String? medalName;\n  int? medalColorStart;\n  int? medalColorEnd;\n  int? medalColorBorder;\n  String? medalJumpUrl;\n\n  LiveFansWearing({\n    this.level,\n    this.medalName,\n    this.medalColorStart,\n    this.medalColorEnd,\n    this.medalColorBorder,\n    this.medalJumpUrl,\n  });\n\n  factory LiveFansWearing.fromJson(Map<String, dynamic> json) {\n    return LiveFansWearing(\n      level: json['level'] as int?,\n      medalName: json['medal_name'] as String?,\n      medalColorStart: json['medal_color_start'] as int?,\n      medalColorEnd: json['medal_color_end'] as int?,\n      medalColorBorder: json['medal_color_border'] as int?,\n      medalJumpUrl: json['medal_jump_url'] as String?,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/models_new/space/space/media.dart",
    "content": "class Media {\n  int? score;\n  int? mediaId;\n  String? title;\n  String? cover;\n  String? area;\n  int? typeId;\n  String? typeName;\n  int? spoiler;\n\n  Media({\n    this.score,\n    this.mediaId,\n    this.title,\n    this.cover,\n    this.area,\n    this.typeId,\n    this.typeName,\n    this.spoiler,\n  });\n\n  factory Media.fromJson(Map<String, dynamic> json) => Media(\n    score: json['score'] as int?,\n    mediaId: json['media_id'] as int?,\n    title: json['title'] as String?,\n    cover: json['cover'] as String?,\n    area: json['area'] as String?,\n    typeId: json['type_id'] as int?,\n    typeName: json['type_name'] as String?,\n    spoiler: json['spoiler'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/nameplate.dart",
    "content": "class Nameplate {\n  int? nid;\n  String? name;\n  String? image;\n  String? imageSmall;\n  String? level;\n  String? condition;\n\n  Nameplate({\n    this.nid,\n    this.name,\n    this.image,\n    this.imageSmall,\n    this.level,\n    this.condition,\n  });\n\n  factory Nameplate.fromJson(Map<String, dynamic> json) => Nameplate(\n    nid: json['nid'] as int?,\n    name: json['name'] as String?,\n    image: json['image'] as String?,\n    imageSmall: json['image_small'] as String?,\n    level: json['level'] as String?,\n    condition: json['condition'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/nft.dart",
    "content": "import 'package:PiliPlus/models_new/space/space/display.dart';\n\nclass Nft {\n  String? itemName;\n  String? issuer;\n  String? serialNumber;\n  String? detailUrl;\n  int? nftStatus;\n  Display? display;\n\n  Nft({\n    this.itemName,\n    this.issuer,\n    this.serialNumber,\n    this.detailUrl,\n    this.nftStatus,\n    this.display,\n  });\n\n  factory Nft.fromJson(Map<String, dynamic> json) => Nft(\n    itemName: json['item_name'] as String?,\n    issuer: json['issuer'] as String?,\n    serialNumber: json['serial_number'] as String?,\n    detailUrl: json['detail_url'] as String?,\n    nftStatus: json['nft_status'] as int?,\n    display: json['display'] == null\n        ? null\n        : Display.fromJson(json['display'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/nft_certificate.dart",
    "content": "class NftCertificate {\n  String? detailUrl;\n\n  NftCertificate({this.detailUrl});\n\n  factory NftCertificate.fromJson(Map<String, dynamic> json) {\n    return NftCertificate(\n      detailUrl: json['detail_url'] as String?,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/models_new/space/space/nft_show_module.dart",
    "content": "import 'package:PiliPlus/models_new/space/space/nft.dart';\n\nclass NftShowModule {\n  int? total;\n  String? artsMoreJump;\n  List<Nft>? nfts;\n  String? floorTitle;\n\n  NftShowModule({\n    this.total,\n    this.artsMoreJump,\n    this.nfts,\n    this.floorTitle,\n  });\n\n  factory NftShowModule.fromJson(Map<String, dynamic> json) => NftShowModule(\n    total: json['total'] as int?,\n    artsMoreJump: json['arts_more_jump'] as String?,\n    nfts: (json['nfts'] as List<dynamic>?)\n        ?.map((e) => Nft.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    floorTitle: json['floor_title'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/night.dart",
    "content": "class Night {\n  String? argb;\n\n  Night({this.argb});\n\n  factory Night.fromJson(Map<String, dynamic> json) => Night(\n    argb: json['argb'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/official_verify.dart",
    "content": "class OfficialVerify {\n  int? type;\n  String? desc;\n  int? role;\n  String? title;\n  String? icon;\n  String? spliceTitle;\n\n  OfficialVerify({\n    this.type,\n    this.desc,\n    this.role,\n    this.title,\n    this.icon,\n    this.spliceTitle,\n  });\n\n  factory OfficialVerify.fromJson(Map<String, dynamic> json) {\n    return OfficialVerify(\n      type: json['type'] as int?,\n      desc: json['desc'] as String?,\n      role: json['role'] as int?,\n      title: json['title'] as String?,\n      icon: json['icon'] as String?,\n      spliceTitle: json['splice_title'] as String?,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/models_new/space/space/order.dart",
    "content": "class Order {\n  String? title;\n  String? value;\n\n  Order({this.title, this.value});\n\n  factory Order.fromJson(Map<String, dynamic> json) => Order(\n    title: json['title'] as String?,\n    value: json['value'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/play_game.dart",
    "content": "class PlayGame {\n  int? count;\n  List<dynamic>? item;\n\n  PlayGame({this.count, this.item});\n\n  factory PlayGame.fromJson(Map<String, dynamic> json) => PlayGame(\n    count: json['count'] as int?,\n    item: json['item'] as List<dynamic>?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/pos_spec.dart",
    "content": "class PosSpec {\n  int? coordinatePos;\n  double? axisX;\n  double? axisY;\n\n  PosSpec({this.coordinatePos, this.axisX, this.axisY});\n\n  factory PosSpec.fromJson(Map<String, dynamic> json) => PosSpec(\n    coordinatePos: json['coordinate_pos'] as int?,\n    axisX: (json['axis_x'] as num?)?.toDouble(),\n    axisY: (json['axis_y'] as num?)?.toDouble(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/pr_info.dart",
    "content": "class SpacePrInfo {\n  SpacePrInfo(\n    this.content,\n    this.url,\n    this.icon,\n    this.iconNight,\n    this.textColor,\n    this.bgColor,\n    this.textColorNight,\n    this.bgColorNight,\n  );\n\n  String? content;\n  String? url;\n  String? icon;\n  String? iconNight;\n  late String textColor;\n  late String bgColor;\n  late String textColorNight;\n  late String bgColorNight;\n\n  SpacePrInfo.fromJson(Map<String, dynamic> json) {\n    content = json['content'];\n    if (content?.isNotEmpty == true) {\n      url = json['url'];\n      icon = json['icon'];\n      iconNight = json['icon_night'];\n      textColor = json['text_color'] ?? \"#999999\";\n      bgColor = json['bg_color'] ?? \"#e7e7e7\";\n      textColorNight = json['text_color_night'] ?? \"#727272\";\n      bgColorNight = json['bg_color_night'] ?? \"#2A2A2A\";\n    }\n  }\n}\n"
  },
  {
    "path": "lib/models_new/space/space/preference.dart",
    "content": "class Preference {\n  bool? collectionPublic;\n  String? garbFirstGain;\n  int? orderType;\n\n  Preference({this.collectionPublic, this.garbFirstGain, this.orderType});\n\n  factory Preference.fromJson(Map<String, dynamic> json) => Preference(\n    collectionPublic: json['collection_public'] as bool?,\n    garbFirstGain: json['garb_first_gain'] as String?,\n    orderType: json['order_type'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/profession_verify.dart",
    "content": "class ProfessionVerify {\n  String? icon;\n  String? showDesc;\n\n  ProfessionVerify({this.icon, this.showDesc});\n\n  factory ProfessionVerify.fromJson(Map<String, dynamic> json) {\n    return ProfessionVerify(\n      icon: json['icon'] as String?,\n      showDesc: json['show_desc'] as String?,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/models_new/space/space/purchase_button.dart",
    "content": "class PurchaseButton {\n  String? uri;\n  String? title;\n\n  PurchaseButton({this.uri, this.title});\n\n  factory PurchaseButton.fromJson(Map<String, dynamic> json) {\n    return PurchaseButton(\n      uri: json['uri'] as String?,\n      title: json['title'] as String?,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/models_new/space/space/relation.dart",
    "content": "class SpaceRelation {\n  int? status;\n  int? isFollow;\n  int? isFollowed;\n\n  SpaceRelation({\n    this.status,\n    this.isFollow,\n    this.isFollowed,\n  });\n\n  factory SpaceRelation.fromJson(Map<String, dynamic> json) => SpaceRelation(\n    status: json['status'] as int?,\n    isFollow: json['is_follow'] as int?,\n    isFollowed: json['is_followed'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/render_spec.dart",
    "content": "class RenderSpec {\n  int? opacity;\n\n  RenderSpec({this.opacity});\n\n  factory RenderSpec.fromJson(Map<String, dynamic> json) => RenderSpec(\n    opacity: json['opacity'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/res_native_draw.dart",
    "content": "import 'package:PiliPlus/models_new/space/space/draw_src.dart';\n\nclass ResNativeDraw {\n  DrawSrc? drawSrc;\n\n  ResNativeDraw({this.drawSrc});\n\n  factory ResNativeDraw.fromJson(Map<String, dynamic> json) => ResNativeDraw(\n    drawSrc: json['draw_src'] == null\n        ? null\n        : DrawSrc.fromJson(json['draw_src'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/resource.dart",
    "content": "import 'package:PiliPlus/models_new/space/space/res_native_draw.dart';\n\nclass Resource {\n  int? resType;\n  ResNativeDraw? resNativeDraw;\n\n  Resource({this.resType, this.resNativeDraw});\n\n  factory Resource.fromJson(Map<String, dynamic> json) => Resource(\n    resType: json['res_type'] as int?,\n    resNativeDraw: json['res_native_draw'] == null\n        ? null\n        : ResNativeDraw.fromJson(\n            json['res_native_draw'] as Map<String, dynamic>,\n          ),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/season.dart",
    "content": "import 'package:PiliPlus/models_new/space/space_archive/item.dart';\n\nclass SpaceSeason {\n  int? count;\n  List<SpaceArchiveItem>? item;\n\n  SpaceSeason({this.count, this.item});\n\n  factory SpaceSeason.fromJson(Map<String, dynamic> json) => SpaceSeason(\n    count: json['count'] as int?,\n    item: (json['item'] as List<dynamic>?)\n        ?.map((e) => SpaceArchiveItem.fromJson(e))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/senior_inquiry.dart",
    "content": "class SeniorInquiry {\n  String? inquiryText;\n  String? inquiryUrl;\n\n  SeniorInquiry({this.inquiryText, this.inquiryUrl});\n\n  factory SeniorInquiry.fromJson(Map<String, dynamic> json) => SeniorInquiry(\n    inquiryText: json['inquiry_text'] as String?,\n    inquiryUrl: json['inquiry_url'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/series.dart",
    "content": "import 'package:PiliPlus/models_new/space/space/item.dart';\n\nclass SpaceSeries {\n  List<Item>? item;\n\n  SpaceSeries({this.item});\n\n  factory SpaceSeries.fromJson(Map<String, dynamic> json) => SpaceSeries(\n    item: (json['item'] as List<dynamic>?)\n        ?.map((e) => Item.fromJson(e as Map<String, dynamic>))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/setting.dart",
    "content": "class SpaceSetting {\n  int? channel;\n  int? favVideo;\n  int? coinsVideo;\n  int? likesVideo;\n  int? bangumi;\n  int? playedGame;\n  int? groups;\n  int? comic;\n  int? bbq;\n  int? dressUp;\n  int? disableFollowing;\n  int? livePlayback;\n  int? closeSpaceMedal;\n  int? onlyShowWearing;\n  int? disableShowSchool;\n  int? disableShowNft;\n  int? disableShowFans;\n  int? chargeVideo;\n  int? lessonVideo;\n\n  SpaceSetting({\n    this.channel,\n    this.favVideo,\n    this.coinsVideo,\n    this.likesVideo,\n    this.bangumi,\n    this.playedGame,\n    this.groups,\n    this.comic,\n    this.bbq,\n    this.dressUp,\n    this.disableFollowing,\n    this.livePlayback,\n    this.closeSpaceMedal,\n    this.onlyShowWearing,\n    this.disableShowSchool,\n    this.disableShowNft,\n    this.disableShowFans,\n    this.chargeVideo,\n    this.lessonVideo,\n  });\n\n  factory SpaceSetting.fromJson(Map<String, dynamic> json) => SpaceSetting(\n    channel: json['channel'] as int?,\n    favVideo: json['fav_video'] as int?,\n    coinsVideo: json['coins_video'] as int?,\n    likesVideo: json['likes_video'] as int?,\n    bangumi: json['bangumi'] as int?,\n    playedGame: json['played_game'] as int?,\n    groups: json['groups'] as int?,\n    comic: json['comic'] as int?,\n    bbq: json['bbq'] as int?,\n    dressUp: json['dress_up'] as int?,\n    disableFollowing: json['disable_following'] as int?,\n    livePlayback: json['live_playback'] as int?,\n    closeSpaceMedal: json['close_space_medal'] as int?,\n    onlyShowWearing: json['only_show_wearing'] as int?,\n    disableShowSchool: json['disable_show_school'] as int?,\n    disableShowNft: json['disable_show_nft'] as int?,\n    disableShowFans: json['disable_show_fans'] as int?,\n    chargeVideo: json['charge_video'] as int?,\n    lessonVideo: json['lesson_video'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/size_spec.dart",
    "content": "class SizeSpec {\n  double? width;\n  double? height;\n\n  SizeSpec({this.width, this.height});\n\n  factory SizeSpec.fromJson(Map<String, dynamic> json) => SizeSpec(\n    width: (json['width'] as num?)?.toDouble(),\n    height: (json['height'] as num?)?.toDouble(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/space_button_list.dart",
    "content": "class SpaceButtonList {\n  String? icon;\n  String? title;\n  String? subTitle;\n  String? url;\n  String? moduleType;\n  String? titleDarkColor;\n  String? titleLightColor;\n  String? subTitleDarkColor;\n  String? subTitleLightColor;\n  String? backgroundDarkColor;\n  String? backgroundLightColor;\n\n  SpaceButtonList({\n    this.icon,\n    this.title,\n    this.subTitle,\n    this.url,\n    this.moduleType,\n    this.titleDarkColor,\n    this.titleLightColor,\n    this.subTitleDarkColor,\n    this.subTitleLightColor,\n    this.backgroundDarkColor,\n    this.backgroundLightColor,\n  });\n\n  factory SpaceButtonList.fromJson(Map<String, dynamic> json) {\n    return SpaceButtonList(\n      icon: json['icon'] as String?,\n      title: json['title'] as String?,\n      subTitle: json['sub_title'] as String?,\n      url: json['url'] as String?,\n      moduleType: json['module_type'] as String?,\n      titleDarkColor: json['title_dark_color'] as String?,\n      titleLightColor: json['title_light_color'] as String?,\n      subTitleDarkColor: json['sub_title_dark_color'] as String?,\n      subTitleLightColor: json['sub_title_light_color'] as String?,\n      backgroundDarkColor: json['background_dark_color'] as String?,\n      backgroundLightColor: json['background_light_color'] as String?,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/models_new/space/space/space_tag.dart",
    "content": "class SpaceTag {\n  String? type;\n  String? title;\n  String? textColor;\n  String? nightTextColor;\n  String? backgroundColor;\n  String? nightBackgroundColor;\n  String? uri;\n  String? icon;\n\n  SpaceTag({\n    this.type,\n    this.title,\n    this.textColor,\n    this.nightTextColor,\n    this.backgroundColor,\n    this.nightBackgroundColor,\n    this.uri,\n    this.icon,\n  });\n\n  factory SpaceTag.fromJson(Map<String, dynamic> json) => SpaceTag(\n    type: json['type'] as String?,\n    title: json['title'] as String?,\n    textColor: json['text_color'] as String?,\n    nightTextColor: json['night_text_color'] as String?,\n    backgroundColor: json['background_color'] as String?,\n    nightBackgroundColor: json['night_background_color'] as String?,\n    uri: json['uri'] as String?,\n    icon: json['icon'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/stats.dart",
    "content": "class Stats {\n  int? view;\n  int? favorite;\n  int? like;\n  int? dislike;\n  int? reply;\n  int? share;\n  num? coin;\n  int? dynam1c;\n\n  Stats({\n    this.view,\n    this.favorite,\n    this.like,\n    this.dislike,\n    this.reply,\n    this.share,\n    this.coin,\n    this.dynam1c,\n  });\n\n  factory Stats.fromJson(Map<String, dynamic> json) => Stats(\n    view: json['view'] as int?,\n    favorite: json['favorite'] as int?,\n    like: json['like'] as int?,\n    dislike: json['dislike'] as int?,\n    reply: json['reply'] as int?,\n    share: json['share'] as int?,\n    coin: json['coin'] as num?,\n    dynam1c: json['dynamic'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space/tab.dart",
    "content": "class SpaceTab {\n  bool? archive;\n  bool? article;\n  bool? clip;\n  bool? album;\n  bool? favorite;\n  bool? bangumi;\n  bool? coin;\n  bool? like;\n  bool? community;\n  bool? dynam1c;\n  bool? audios;\n  bool? shop;\n  bool? mall;\n  bool? ugcSeason;\n  bool? comic;\n  bool? cheese;\n  bool? subComic;\n  bool? activity;\n  bool? series;\n  bool? charging;\n  bool? opus;\n  bool? cheeseVideo;\n  bool? brand;\n  // bool? hasItem;\n\n  SpaceTab({\n    this.archive,\n    this.article,\n    this.clip,\n    this.album,\n    this.favorite,\n    this.bangumi,\n    this.coin,\n    this.like,\n    this.community,\n    this.dynam1c,\n    this.audios,\n    this.shop,\n    this.mall,\n    this.ugcSeason,\n    this.comic,\n    this.cheese,\n    this.subComic,\n    this.activity,\n    this.series,\n    this.charging,\n    this.opus,\n    this.cheeseVideo,\n    this.brand,\n  });\n\n  SpaceTab.fromJson(Map<String, dynamic> json) {\n    archive = json['archive'] as bool?;\n    article = json['article'] as bool?;\n    clip = json['clip'] as bool?;\n    album = json['album'] as bool?;\n    favorite = json['favorite'] as bool?;\n    bangumi = json['bangumi'] as bool?;\n    coin = json['coin'] as bool?;\n    like = json['like'] as bool?;\n    community = json['community'] as bool?;\n    dynam1c = json['dynamic'] as bool?;\n    audios = json['audios'] as bool?;\n    shop = json['shop'] as bool?;\n    mall = json['mall'] as bool?;\n    ugcSeason = json['ugc_season'] as bool?;\n    comic = json['comic'] as bool?;\n    cheese = json['cheese'] as bool?;\n    subComic = json['sub_comic'] as bool?;\n    activity = json['activity'] as bool?;\n    series = json['series'] as bool?;\n    charging = json['charging'] as bool?;\n    opus = json['opus'] as bool?;\n    cheeseVideo = json['cheese_video'] as bool?;\n    brand = json['brand'] as bool?;\n    // hasItem = json.values.any((e) => e == true);\n  }\n}\n"
  },
  {
    "path": "lib/models_new/space/space/tab2.dart",
    "content": "import 'package:flutter/foundation.dart' show immutable;\n\nclass SpaceTab2 {\n  final String? title;\n  final String? param;\n  final List<SpaceTab2Item>? items;\n\n  const SpaceTab2({this.title, this.param, this.items});\n\n  factory SpaceTab2.fromJson(Map<String, dynamic> json) => SpaceTab2(\n    title: json['title'] as String?,\n    param: json['param'] as String?,\n    items: (json['items'] as List<dynamic>?)\n        ?.map((e) => SpaceTab2Item.fromJson(e as Map<String, dynamic>))\n        .toList(),\n  );\n}\n\nclass SpaceTab2Item {\n  final String? title;\n  final String? param;\n  final List<SpaceTab2SubItem>? items;\n  final List<SpaceTabFilter>? filter;\n  final int? seasonId;\n  final int? seriesId;\n\n  const SpaceTab2Item({\n    this.title,\n    this.param,\n    this.items,\n    this.filter,\n    this.seasonId,\n    this.seriesId,\n  });\n\n  factory SpaceTab2Item.fromJson(Map<String, dynamic> json) => SpaceTab2Item(\n    title: json[\"title\"],\n    param: json[\"param\"],\n    items: (json[\"items\"] as List?)\n        ?.map((e) => SpaceTab2SubItem.fromJson(e))\n        .toList(),\n    filter: (json[\"filter\"] as List?)\n        ?.map((e) => SpaceTabFilter.fromJson(e))\n        .toList(),\n    seasonId: json['season_id'],\n    seriesId: json['series_id'],\n  );\n}\n\nclass SpaceTab2SubItem {\n  String? title;\n  String? param;\n  List<SpaceTabFilter>? filter;\n  int? seasonId;\n  int? seriesId;\n\n  SpaceTab2SubItem({\n    this.title,\n    this.param,\n    this.filter,\n    this.seasonId,\n    this.seriesId,\n  });\n\n  factory SpaceTab2SubItem.fromJson(Map<String, dynamic> json) =>\n      SpaceTab2SubItem(\n        title: json[\"title\"],\n        param: json[\"param\"],\n        filter: (json[\"filter\"] as List?)\n            ?.map((e) => SpaceTabFilter.fromJson(e))\n            .toList(),\n        seasonId: json[\"season_id\"],\n        seriesId: json[\"series_id\"],\n      );\n}\n\n@immutable\nclass SpaceTabFilter {\n  final String? text;\n  final String meta;\n  final String? tabName;\n\n  const SpaceTabFilter({\n    this.text,\n    this.meta = 'all',\n    this.tabName,\n  });\n\n  factory SpaceTabFilter.fromJson(Map<String, dynamic> json) => SpaceTabFilter(\n    text: json[\"text\"],\n    meta: json[\"meta\"] ?? 'all',\n    tabName: json[\"tab_name\"],\n  );\n\n  @override\n  bool operator ==(Object other) {\n    if (identical(this, other)) {\n      return true;\n    }\n    if (other is SpaceTabFilter) {\n      return meta == other.meta;\n    }\n    return false;\n  }\n\n  @override\n  int get hashCode => meta.hashCode;\n}\n"
  },
  {
    "path": "lib/models_new/space/space/top.dart",
    "content": "import 'package:PiliPlus/utils/parse_string.dart';\n\nclass Top {\n  List<TopImage>? imgUrls;\n\n  Top({this.imgUrls});\n\n  @pragma('vm:notify-debugger-on-exception')\n  Top.fromJson(Map<String, dynamic> json) {\n    try {\n      imgUrls = (json['result'] as List?)\n          ?.map((e) => TopImage.fromJson(e))\n          .toList();\n    } catch (_) {}\n  }\n}\n\nclass TopImage {\n  String? _defaultImage;\n  late final String fullCover;\n  String get header => _defaultImage ?? fullCover;\n  late final double dy;\n\n  @pragma('vm:notify-debugger-on-exception')\n  TopImage.fromJson(Map<String, dynamic> json) {\n    _defaultImage = noneNullOrEmptyString(\n      json['item']['image']?['default_image'],\n    );\n    fullCover = json['cover'];\n    double dy = 0;\n    try {\n      final Map image = json['item']['image'] ?? json['item']['animation'];\n      if (image['location'] case String locStr when (locStr.isNotEmpty)) {\n        final location = locStr\n            .split('-')\n            .skip(1)\n            .take(2)\n            .map(num.parse)\n            .toList();\n        if (location.length == 2) {\n          final num height = image['height'];\n          final start = location[0];\n          final end = location[1];\n          dy = (start + end) / height - 1;\n        }\n      }\n    } catch (_) {}\n    this.dy = dy;\n  }\n}\n"
  },
  {
    "path": "lib/models_new/space/space/ugc_season.dart",
    "content": "import 'package:PiliPlus/models_new/space/space/item.dart';\n\nclass UgcSeason {\n  int? count;\n  List<Item>? item;\n\n  UgcSeason({this.count, this.item});\n\n  factory UgcSeason.fromJson(Map<String, dynamic> json) => UgcSeason(\n    count: json['count'] as int?,\n    item: (json['item'] as List<dynamic>?)\n        ?.map((e) => Item.fromJson(e as Map<String, dynamic>))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_archive/badge.dart",
    "content": "class Badge {\n  String? text;\n  String? textColor;\n  String? textColorNight;\n  String? bgColor;\n  String? bgColorNight;\n  String? borderColor;\n  String? borderColorNight;\n  int? bgStyle;\n\n  Badge({\n    this.text,\n    this.textColor,\n    this.textColorNight,\n    this.bgColor,\n    this.bgColorNight,\n    this.borderColor,\n    this.borderColorNight,\n    this.bgStyle,\n  });\n\n  factory Badge.fromJson(Map<String, dynamic> json) => Badge(\n    text: json['text'] as String?,\n    textColor: json['text_color'] as String?,\n    textColorNight: json['text_color_night'] as String?,\n    bgColor: json['bg_color'] as String?,\n    bgColorNight: json['bg_color_night'] as String?,\n    borderColor: json['border_color'] as String?,\n    borderColorNight: json['border_color_night'] as String?,\n    bgStyle: json['bg_style'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_archive/cursor_attr.dart",
    "content": "class CursorAttr {\n  bool? isLastWatchedArc;\n  int? rank;\n\n  CursorAttr({this.isLastWatchedArc, this.rank});\n\n  factory CursorAttr.fromJson(Map<String, dynamic> json) => CursorAttr(\n    isLastWatchedArc: json['is_last_watched_arc'] as bool?,\n    rank: json['rank'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_archive/data.dart",
    "content": "import 'package:PiliPlus/models_new/space/space_archive/episodic_button.dart';\nimport 'package:PiliPlus/models_new/space/space_archive/item.dart';\nimport 'package:PiliPlus/models_new/space/space_archive/last_watched_locator.dart';\nimport 'package:PiliPlus/models_new/space/space_archive/order.dart';\n\nclass SpaceArchiveData {\n  EpisodicButton? episodicButton;\n  List<Order>? order;\n  int? count;\n  List<SpaceArchiveItem>? item;\n  LastWatchedLocator? lastWatchedLocator;\n  bool? hasNext;\n  bool? hasPrev;\n  int? next;\n\n  SpaceArchiveData({\n    this.episodicButton,\n    this.order,\n    this.count,\n    this.item,\n    this.lastWatchedLocator,\n    this.hasNext,\n    this.hasPrev,\n    this.next,\n  });\n\n  factory SpaceArchiveData.fromJson(Map<String, dynamic> json) =>\n      SpaceArchiveData(\n        episodicButton: json['episodic_button'] == null\n            ? null\n            : EpisodicButton.fromJson(\n                json['episodic_button'] as Map<String, dynamic>,\n              ),\n        order: (json['order'] as List<dynamic>?)\n            ?.map((e) => Order.fromJson(e as Map<String, dynamic>))\n            .toList(),\n        count: json['count'] as int?,\n        item: (json['item'] as List<dynamic>?)\n            ?.map((e) => SpaceArchiveItem.fromJson(e as Map<String, dynamic>))\n            .toList(),\n        lastWatchedLocator: json['last_watched_locator'] == null\n            ? null\n            : LastWatchedLocator.fromJson(\n                json['last_watched_locator'] as Map<String, dynamic>,\n              ),\n        hasNext: json['has_next'] as bool?,\n        hasPrev: json['has_prev'] as bool?,\n        next: json['next'],\n      );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_archive/episodic_button.dart",
    "content": "class EpisodicButton {\n  String? text;\n  String? uri;\n\n  EpisodicButton({this.text, this.uri});\n\n  factory EpisodicButton.fromJson(Map<String, dynamic> json) {\n    return EpisodicButton(\n      text: json['text'] as String?,\n      uri: json['uri'] as String?,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/models_new/space/space_archive/history.dart",
    "content": "class History {\n  int? progress;\n  int? duration;\n\n  History({this.progress, this.duration});\n\n  factory History.fromJson(Map<String, dynamic> json) => History(\n    progress: json['progress'] as int?,\n    duration: json['duration'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_archive/item.dart",
    "content": "import 'package:PiliPlus/models/model_owner.dart';\nimport 'package:PiliPlus/models/model_video.dart';\nimport 'package:PiliPlus/models_new/space/space_archive/badge.dart';\nimport 'package:PiliPlus/models_new/space/space_archive/cursor_attr.dart';\nimport 'package:PiliPlus/models_new/space/space_archive/history.dart';\nimport 'package:PiliPlus/models_new/space/space_archive/season.dart';\n\nclass SpaceArchiveItem extends BaseSimpleVideoItemModel {\n  String? subtitle;\n  String? tname;\n  String? coverIcon;\n  String? uri;\n  String? param;\n  String? goto;\n  String? length;\n  bool? isPopular;\n  bool? isSteins;\n  bool? isUgcpay;\n  bool? isCooperation;\n  bool? isPgc;\n  bool? isLivePlayback;\n  bool? isPugv;\n  bool? isFold;\n  bool? isOneself;\n  int? ctime;\n  int? ugcPay;\n  bool? state;\n  int? videos;\n  CursorAttr? cursorAttr;\n  int? iconType;\n  String? publishTimeText;\n  List<Badge>? badges;\n  SpaceArchiveSeason? season;\n  History? history;\n  String? styles;\n  String? label;\n\n  SpaceArchiveItem.fromJson(Map<String, dynamic> json) {\n    title = json['title'];\n    subtitle = json['subtitle'];\n    tname = json['tname'];\n    cover = json['cover'];\n    coverIcon = json['cover_icon'];\n    uri = json['uri'];\n    param = json['param'];\n    goto = json['goto'];\n    length = json['length'];\n    duration = json['duration'] ?? -1;\n    isPopular = json['is_popular'];\n    isSteins = json['is_steins'];\n    isUgcpay = json['is_ugcpay'];\n    isCooperation = json['is_cooperation'];\n    isPgc = json['is_pgc'];\n    isLivePlayback = json['is_live_playback'];\n    isPugv = json['is_pugv'];\n    isFold = json['is_fold'];\n    isOneself = json['is_oneself'];\n    ctime = json['ctime'];\n    ugcPay = json['ugc_pay'];\n    state = json['state'];\n    bvid = json['bvid'];\n    videos = json['videos'];\n    cid = json['first_cid'];\n    cursorAttr = json['cursor_attr'] == null\n        ? null\n        : CursorAttr.fromJson(json['cursor_attr'] as Map<String, dynamic>);\n    iconType = json['icon_type'];\n    publishTimeText = json['publish_time_text'];\n    badges = (json['badges'] as List<dynamic>?)\n        ?.map((e) => Badge.fromJson(e as Map<String, dynamic>))\n        .toList();\n    history = json['history'] == null\n        ? null\n        : History.fromJson(json['history'] as Map<String, dynamic>);\n    season = json['season'] == null\n        ? null\n        : SpaceArchiveSeason.fromJson(json['season'] as Map<String, dynamic>);\n    stat = PlayStat.fromJson(json);\n    owner = Owner(mid: 0, name: json['author']);\n    styles = json['styles'];\n    label = json['label'];\n  }\n}\n"
  },
  {
    "path": "lib/models_new/space/space_archive/last_watched_locator.dart",
    "content": "class LastWatchedLocator {\n  int? displayThreshold;\n  int? insertRanking;\n  String? text;\n\n  LastWatchedLocator({\n    this.displayThreshold,\n    this.insertRanking,\n    this.text,\n  });\n\n  factory LastWatchedLocator.fromJson(Map<String, dynamic> json) {\n    return LastWatchedLocator(\n      displayThreshold: json['display_threshold'] as int?,\n      insertRanking: json['insert_ranking'] as int?,\n      text: json['text'] as String?,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/models_new/space/space_archive/order.dart",
    "content": "class Order {\n  String? title;\n  String? value;\n\n  Order({this.title, this.value});\n\n  factory Order.fromJson(Map<String, dynamic> json) => Order(\n    title: json['title'] as String?,\n    value: json['value'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_archive/season.dart",
    "content": "class SpaceArchiveSeason {\n  dynamic mtime;\n\n  SpaceArchiveSeason({\n    this.mtime,\n  });\n\n  factory SpaceArchiveSeason.fromJson(Map<String, dynamic> json) =>\n      SpaceArchiveSeason(\n        mtime: json['mtime'],\n      );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_archive/stats.dart",
    "content": "class SpaceArchiveStat {\n  String? viewStr;\n  String? danmuStr;\n\n  SpaceArchiveStat({\n    this.viewStr,\n    this.danmuStr,\n  });\n\n  factory SpaceArchiveStat.fromJson(Map<String, dynamic> json) =>\n      SpaceArchiveStat(\n        viewStr: json['view_str'],\n        danmuStr: json['danmu_str'],\n      );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_article/author.dart",
    "content": "import 'package:PiliPlus/models/model_avatar.dart';\n\nclass Author {\n  int? mid;\n  String? name;\n  String? face;\n  Pendant? pendant;\n  BaseOfficialVerify? officialVerify;\n  Vip? vip;\n\n  Author({\n    this.mid,\n    this.name,\n    this.face,\n    this.pendant,\n    this.officialVerify,\n    this.vip,\n  });\n\n  factory Author.fromJson(Map<String, dynamic> json) => Author(\n    mid: json['mid'] as int?,\n    name: json['name'] as String?,\n    face: json['face'] as String?,\n    pendant: json['pendant'] == null\n        ? null\n        : Pendant.fromJson(json['pendant'] as Map<String, dynamic>),\n    officialVerify: json['official_verify'] == null\n        ? null\n        : BaseOfficialVerify.fromJson(\n            json['official_verify'] as Map<String, dynamic>,\n          ),\n    vip: json['vip'] == null\n        ? null\n        : Vip.fromJson(json['vip'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_article/category.dart",
    "content": "class Category {\n  int? id;\n  int? parentId;\n  String? name;\n\n  Category({this.id, this.parentId, this.name});\n\n  factory Category.fromJson(Map<String, dynamic> json) => Category(\n    id: json['id'] as int?,\n    parentId: json['parent_id'] as int?,\n    name: json['name'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_article/data.dart",
    "content": "import 'package:PiliPlus/models_new/space/space_article/item.dart';\nimport 'package:PiliPlus/models_new/space/space_article/list.dart';\n\nclass SpaceArticleData {\n  int? count;\n  List<SpaceArticleItem>? item;\n  int? listsCount;\n  List<SpaceArticleList>? lists;\n\n  SpaceArticleData({this.count, this.item, this.listsCount, this.lists});\n\n  factory SpaceArticleData.fromJson(Map<String, dynamic> json) =>\n      SpaceArticleData(\n        count: json['count'] as int?,\n        item: (json['item'] as List<dynamic>?)\n            ?.map((e) => SpaceArticleItem.fromJson(e as Map<String, dynamic>))\n            .toList(),\n        listsCount: json['lists_count'] as int?,\n        lists: (json['lists'] as List<dynamic>?)\n            ?.map((e) => SpaceArticleList.fromJson(e as Map<String, dynamic>))\n            .toList(),\n      );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_article/item.dart",
    "content": "import 'package:PiliPlus/models_new/space/space_article/author.dart';\nimport 'package:PiliPlus/models_new/space/space_article/category.dart';\nimport 'package:PiliPlus/models_new/space/space_article/media.dart';\nimport 'package:PiliPlus/models_new/space/space_article/stats.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\n\nclass SpaceArticleItem {\n  int? id;\n  Category? category;\n  List<Category>? categories;\n  String? title;\n  String? summary;\n  String? bannerUrl;\n  int? templateId;\n  int? state;\n  Author? author;\n  int? reprint;\n  List<String>? imageUrls;\n  int? publishTime;\n  int? ctime;\n  int? mtime;\n  Stats? stats;\n  int? attributes;\n  int? words;\n  List<String>? originImageUrls;\n  dynamic list;\n  bool? isLike;\n  Media? media;\n  String? applyTime;\n  String? checkTime;\n  int? original;\n  int? actId;\n  dynamic dispute;\n  dynamic authenMark;\n  int? coverAvid;\n  dynamic topVideoInfo;\n  int? type;\n  int? checkState;\n  int? originTemplateId;\n  String? uri;\n  String? param;\n  String? goto;\n  String? publishTimeText;\n  String? dynam1c;\n\n  SpaceArticleItem({\n    this.id,\n    this.category,\n    this.categories,\n    this.title,\n    this.summary,\n    this.bannerUrl,\n    this.templateId,\n    this.state,\n    this.author,\n    this.reprint,\n    this.imageUrls,\n    this.publishTime,\n    this.ctime,\n    this.mtime,\n    this.stats,\n    this.attributes,\n    this.words,\n    this.originImageUrls,\n    this.list,\n    this.isLike,\n    this.media,\n    this.applyTime,\n    this.checkTime,\n    this.original,\n    this.actId,\n    this.dispute,\n    this.authenMark,\n    this.coverAvid,\n    this.topVideoInfo,\n    this.type,\n    this.checkState,\n    this.originTemplateId,\n    this.uri,\n    this.param,\n    this.goto,\n    this.publishTimeText,\n    this.dynam1c,\n  });\n\n  factory SpaceArticleItem.fromJson(Map<String, dynamic> json) =>\n      SpaceArticleItem(\n        id: json['id'] as int?,\n        category: json['category'] == null\n            ? null\n            : Category.fromJson(json['category'] as Map<String, dynamic>),\n        categories: (json['categories'] as List<dynamic>?)\n            ?.map((e) => Category.fromJson(e as Map<String, dynamic>))\n            .toList(),\n        title: json['title'] as String?,\n        summary: json['summary'] as String?,\n        bannerUrl: json['banner_url'] as String?,\n        templateId: json['template_id'] as int?,\n        state: json['state'] as int?,\n        author: json['author'] == null\n            ? null\n            : Author.fromJson(json['author'] as Map<String, dynamic>),\n        reprint: json['reprint'] as int?,\n        imageUrls: (json['image_urls'] as List?)?.fromCast(),\n        publishTime: json['publish_time'] as int?,\n        ctime: json['ctime'] as int?,\n        mtime: json['mtime'] as int?,\n        stats: json['stats'] == null\n            ? null\n            : Stats.fromJson(json['stats'] as Map<String, dynamic>),\n        attributes: json['attributes'] as int?,\n        words: json['words'] as int?,\n        originImageUrls: (json['origin_image_urls'] as List?)?.fromCast(),\n        list: json['list'] as dynamic,\n        isLike: json['is_like'] as bool?,\n        media: json['media'] == null\n            ? null\n            : Media.fromJson(json['media'] as Map<String, dynamic>),\n        applyTime: json['apply_time'] as String?,\n        checkTime: json['check_time'] as String?,\n        original: json['original'] as int?,\n        actId: json['act_id'] as int?,\n        dispute: json['dispute'] as dynamic,\n        authenMark: json['authenMark'] as dynamic,\n        coverAvid: json['cover_avid'] as int?,\n        topVideoInfo: json['top_video_info'] as dynamic,\n        type: json['type'] as int?,\n        checkState: json['check_state'] as int?,\n        originTemplateId: json['origin_template_id'] as int?,\n        uri: json['uri'] as String?,\n        param: json['param'] as String?,\n        goto: json['goto'] as String?,\n        publishTimeText: json['publish_time_text'] as String?,\n        dynam1c: json['dynamic'] as String?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_article/list.dart",
    "content": "class SpaceArticleList {\n  int? id;\n  int? mid;\n  String? name;\n  String? imageUrl;\n  int? updateTime;\n  int? ctime;\n  int? publishTime;\n  String? summary;\n  int? words;\n  int? read;\n  int? articlesCount;\n  String? updateTimeText;\n\n  SpaceArticleList({\n    this.id,\n    this.mid,\n    this.name,\n    this.imageUrl,\n    this.updateTime,\n    this.ctime,\n    this.publishTime,\n    this.summary,\n    this.words,\n    this.read,\n    this.articlesCount,\n    this.updateTimeText,\n  });\n\n  factory SpaceArticleList.fromJson(Map<String, dynamic> json) =>\n      SpaceArticleList(\n        id: json['id'] as int?,\n        mid: json['mid'] as int?,\n        name: json['name'] as String?,\n        imageUrl: json['image_url'] as String?,\n        updateTime: json['update_time'] as int?,\n        ctime: json['ctime'] as int?,\n        publishTime: json['publish_time'] as int?,\n        summary: json['summary'] as String?,\n        words: json['words'] as int?,\n        read: json['read'] as int?,\n        articlesCount: json['articles_count'] as int?,\n        updateTimeText: json['update_time_text'] as String?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_article/media.dart",
    "content": "class Media {\n  int? score;\n  int? mediaId;\n  String? title;\n  String? cover;\n  String? area;\n  int? typeId;\n  String? typeName;\n  int? spoiler;\n\n  Media({\n    this.score,\n    this.mediaId,\n    this.title,\n    this.cover,\n    this.area,\n    this.typeId,\n    this.typeName,\n    this.spoiler,\n  });\n\n  factory Media.fromJson(Map<String, dynamic> json) => Media(\n    score: json['score'] as int?,\n    mediaId: json['media_id'] as int?,\n    title: json['title'] as String?,\n    cover: json['cover'] as String?,\n    area: json['area'] as String?,\n    typeId: json['type_id'] as int?,\n    typeName: json['type_name'] as String?,\n    spoiler: json['spoiler'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_article/stats.dart",
    "content": "class Stats {\n  int? view;\n  int? favorite;\n  int? like;\n  int? dislike;\n  int? reply;\n  int? share;\n  num? coin;\n  int? dynam1c;\n\n  Stats({\n    this.view,\n    this.favorite,\n    this.like,\n    this.dislike,\n    this.reply,\n    this.share,\n    this.coin,\n    this.dynam1c,\n  });\n\n  factory Stats.fromJson(Map<String, dynamic> json) => Stats(\n    view: json['view'] as int?,\n    favorite: json['favorite'] as int?,\n    like: json['like'] as int?,\n    dislike: json['dislike'] as int?,\n    reply: json['reply'] as int?,\n    share: json['share'] as int?,\n    coin: json['coin'] as num?,\n    dynam1c: json['dynamic'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_audio/data.dart",
    "content": "import 'package:PiliPlus/models_new/space/space_audio/item.dart';\n\nclass SpaceAudioData {\n  int? curPage;\n  int? pageCount;\n  int? totalSize;\n  int? pageSize;\n  List<SpaceAudioItem>? items;\n\n  SpaceAudioData({\n    this.curPage,\n    this.pageCount,\n    this.totalSize,\n    this.pageSize,\n    this.items,\n  });\n\n  factory SpaceAudioData.fromJson(Map<String, dynamic> json) => SpaceAudioData(\n    curPage: json['curPage'] as int?,\n    pageCount: json['pageCount'] as int?,\n    totalSize: json['totalSize'] as int?,\n    pageSize: json['pageSize'] as int?,\n    items: (json['data'] as List<dynamic>?)\n        ?.map((e) => SpaceAudioItem.fromJson(e as Map<String, dynamic>))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_audio/item.dart",
    "content": "import 'package:PiliPlus/models_new/space/space_audio/statistic.dart';\n\nclass SpaceAudioItem {\n  int? id;\n  int? uid;\n  String? uname;\n  String? author;\n  String? title;\n  String? cover;\n  String? intro;\n  String? lyric;\n  int? crtype;\n  int? duration;\n  int? passtime;\n  int? curtime;\n  int? aid;\n  String? bvid;\n  int? cid;\n  int? msid;\n  int? attr;\n  int? limit;\n  int? activityId;\n  String? limitdesc;\n  num? coinNum;\n  int? ctime;\n  Statistic? statistic;\n  dynamic vipInfo;\n  dynamic collectIds;\n  int? isCooper;\n\n  SpaceAudioItem({\n    this.id,\n    this.uid,\n    this.uname,\n    this.author,\n    this.title,\n    this.cover,\n    this.intro,\n    this.lyric,\n    this.crtype,\n    this.duration,\n    this.passtime,\n    this.curtime,\n    this.aid,\n    this.bvid,\n    this.cid,\n    this.msid,\n    this.attr,\n    this.limit,\n    this.activityId,\n    this.limitdesc,\n    this.coinNum,\n    this.ctime,\n    this.statistic,\n    this.vipInfo,\n    this.collectIds,\n    this.isCooper,\n  });\n\n  factory SpaceAudioItem.fromJson(Map<String, dynamic> json) => SpaceAudioItem(\n    id: json['id'] as int?,\n    uid: json['uid'] as int?,\n    uname: json['uname'] as String?,\n    author: json['author'] as String?,\n    title: json['title'] as String?,\n    cover: json['cover'] as String?,\n    intro: json['intro'] as String?,\n    lyric: json['lyric'] as String?,\n    crtype: json['crtype'] as int?,\n    duration: json['duration'] as int?,\n    passtime: json['passtime'] as int?,\n    curtime: json['curtime'] as int?,\n    aid: json['aid'] as int?,\n    bvid: json['bvid'] as String?,\n    cid: json['cid'] as int?,\n    msid: json['msid'] as int?,\n    attr: json['attr'] as int?,\n    limit: json['limit'] as int?,\n    activityId: json['activityId'] as int?,\n    limitdesc: json['limitdesc'] as String?,\n    coinNum: json['coin_num'] as num?,\n    ctime: json['ctime'] as int?,\n    statistic: json['statistic'] == null\n        ? null\n        : Statistic.fromJson(json['statistic'] as Map<String, dynamic>),\n    vipInfo: json['vipInfo'] as dynamic,\n    collectIds: json['collectIds'] as dynamic,\n    isCooper: json['is_cooper'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_audio/statistic.dart",
    "content": "class Statistic {\n  int? sid;\n  int? play;\n  int? collect;\n  int? comment;\n  int? share;\n\n  Statistic({this.sid, this.play, this.collect, this.comment, this.share});\n\n  factory Statistic.fromJson(Map<String, dynamic> json) => Statistic(\n    sid: json['sid'] as int?,\n    play: json['play'] as int?,\n    collect: json['collect'] as int?,\n    comment: json['comment'] as int?,\n    share: json['share'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_cheese/data.dart",
    "content": "import 'package:PiliPlus/models_new/space/space_cheese/item.dart';\nimport 'package:PiliPlus/models_new/space/space_cheese/page.dart';\n\nclass SpaceCheeseData {\n  List<SpaceCheeseItem>? items;\n  SpaceCheesePage? page;\n\n  SpaceCheeseData({this.items, this.page});\n\n  factory SpaceCheeseData.fromJson(Map<String, dynamic> json) =>\n      SpaceCheeseData(\n        items: (json['items'] as List<dynamic>?)\n            ?.map((e) => SpaceCheeseItem.fromJson(e as Map<String, dynamic>))\n            .toList(),\n        page: json['page'] == null\n            ? null\n            : SpaceCheesePage.fromJson(json['page'] as Map<String, dynamic>),\n      );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_cheese/item.dart",
    "content": "import 'package:PiliPlus/utils/extension/iterable_ext.dart';\n\nclass SpaceCheeseItem {\n  bool? cooperated;\n  String? cooperationMark;\n  String? cover;\n  int? epCount;\n  String? link;\n  List<String>? marks;\n  int? page;\n  int? play;\n  int? seasonId;\n  String? status;\n  String? subtitle;\n  String? title;\n  String? ctime;\n\n  SpaceCheeseItem({\n    this.cooperated,\n    this.cooperationMark,\n    this.cover,\n    this.epCount,\n    this.link,\n    this.marks,\n    this.page,\n    this.play,\n    this.seasonId,\n    this.status,\n    this.subtitle,\n    this.title,\n    this.ctime,\n  });\n\n  factory SpaceCheeseItem.fromJson(Map<String, dynamic> json) =>\n      SpaceCheeseItem(\n        cooperated: json['cooperated'] as bool?,\n        cooperationMark: json['cooperation_mark'] as String?,\n        cover: json['cover'] as String?,\n        epCount: json['ep_count'] as int?,\n        link: json['link'] as String?,\n        marks: (json['marks'] as List?)?.fromCast(),\n        page: json['page'] as int?,\n        play: json['play'] as int?,\n        seasonId: json['season_id'] as int?,\n        status: json['status'] as String?,\n        subtitle: json['subtitle'] as String?,\n        title: json['title'] as String?,\n        ctime: json['ctime'] as String?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_cheese/page.dart",
    "content": "class SpaceCheesePage {\n  bool? next;\n  int? num;\n  int? size;\n  int? total;\n\n  SpaceCheesePage({this.next, this.num, this.size, this.total});\n\n  factory SpaceCheesePage.fromJson(Map<String, dynamic> json) =>\n      SpaceCheesePage(\n        next: json['next'] as bool?,\n        num: json['num'] as int?,\n        size: json['size'] as int?,\n        total: json['total'] as int?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_fav/data.dart",
    "content": "import 'package:PiliPlus/models_new/space/space_fav/media_list_response.dart';\n\nclass SpaceFavData {\n  int? id;\n  String? name;\n  MediaListResponse? mediaListResponse;\n  String? uri;\n\n  SpaceFavData({this.id, this.name, this.mediaListResponse, this.uri});\n\n  factory SpaceFavData.fromJson(Map<String, dynamic> json) => SpaceFavData(\n    id: json['id'] as int?,\n    name: json['name'] as String?,\n    mediaListResponse: json['mediaListResponse'] == null\n        ? null\n        : MediaListResponse.fromJson(\n            json['mediaListResponse'] as Map<String, dynamic>,\n          ),\n    uri: json['uri'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_fav/list.dart",
    "content": "import 'package:PiliPlus/models/model_owner.dart';\nimport 'package:PiliPlus/models_new/sub/sub/list.dart';\n\nclass SpaceFavItemModel extends SubItemModel {\n  int? mediaId;\n  int? count;\n  int? isPublic;\n\n  SpaceFavItemModel({\n    super.id,\n    this.mediaId,\n    this.count,\n    this.isPublic,\n    super.fid,\n    super.mid,\n    super.attr,\n    super.attrDesc,\n    super.title,\n    super.cover,\n    super.upper,\n    super.coverType,\n    super.intro,\n    super.ctime,\n    super.mtime,\n    super.state,\n    super.favState,\n    super.mediaCount,\n    super.viewCount,\n    super.vt,\n    super.isTop,\n    super.recentFav,\n    super.playSwitch,\n    super.type,\n    super.link,\n    super.bvid,\n  });\n\n  factory SpaceFavItemModel.fromJson(Map<String, dynamic> json) =>\n      SpaceFavItemModel(\n        id: json['id'] as int?,\n        mediaId: json['media_id'] as int?,\n        count: json['count'] as int?,\n        isPublic: json['is_public'] as int?,\n        fid: json['fid'] as int?,\n        mid: json['mid'] as int?,\n        attr: json['attr'] as int?,\n        attrDesc: json['attr_desc'] as String?,\n        title: json['title'] as String?,\n        cover: json['cover'] as String?,\n        upper: json['upper'] == null\n            ? null\n            : Owner.fromJson(json['upper'] as Map<String, dynamic>),\n        coverType: json['cover_type'] as int?,\n        intro: json['intro'] as String?,\n        ctime: json['ctime'] as int?,\n        mtime: json['mtime'] as int?,\n        state: json['state'] as int?,\n        favState: json['fav_state'] as int?,\n        mediaCount: json['media_count'] as int?,\n        viewCount: json['view_count'] as int?,\n        vt: json['vt'] as int?,\n        isTop: json['is_top'] as bool?,\n        recentFav: json['recent_fav'] as dynamic,\n        playSwitch: json['play_switch'] as int?,\n        type: json['type'] as int?,\n        link: json['link'] as String?,\n        bvid: json['bvid'] as String?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_fav/media_list_response.dart",
    "content": "import 'package:PiliPlus/models_new/space/space_fav/list.dart';\n\nclass MediaListResponse {\n  int? count;\n  List<SpaceFavItemModel>? list;\n  bool? hasMore;\n\n  MediaListResponse({this.count, this.list, this.hasMore});\n\n  factory MediaListResponse.fromJson(Map<String, dynamic> json) {\n    return MediaListResponse(\n      count: json['count'] as int?,\n      list: (json['list'] as List<dynamic>?)\n          ?.map((e) => SpaceFavItemModel.fromJson(e as Map<String, dynamic>))\n          .toList(),\n      hasMore: json['has_more'] as bool?,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/models_new/space/space_opus/cover.dart",
    "content": "import 'package:flutter/foundation.dart';\n\nclass Cover {\n  int? height;\n  String? url;\n  int? width;\n  late double ratio;\n\n  Cover({this.height, this.url, this.width, required this.ratio});\n\n  Cover.fromJson(Map<String, dynamic> json) {\n    height = json['height'] as int?;\n    url = json['url'] as String?;\n    width = json['width'] as int?;\n    if (height != null && width != null) {\n      ratio = clampDouble(height! / width!, 0.68, 2.7);\n    } else {\n      ratio = 1;\n    }\n  }\n}\n"
  },
  {
    "path": "lib/models_new/space/space_opus/data.dart",
    "content": "import 'package:PiliPlus/models_new/space/space_opus/item.dart';\n\nclass SpaceOpusData {\n  bool? hasMore;\n  List<SpaceOpusItemModel>? items;\n  String? offset;\n  int? updateNum;\n\n  SpaceOpusData({this.hasMore, this.items, this.offset, this.updateNum});\n\n  factory SpaceOpusData.fromJson(Map<String, dynamic> json) => SpaceOpusData(\n    hasMore: json['has_more'] as bool?,\n    items: (json['items'] as List<dynamic>?)\n        ?.map((e) => SpaceOpusItemModel.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    offset: json['offset'] as String?,\n    updateNum: json['update_num'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_opus/item.dart",
    "content": "import 'package:PiliPlus/models_new/space/space_opus/cover.dart';\nimport 'package:PiliPlus/models_new/space/space_opus/stat.dart';\n\nclass SpaceOpusItemModel {\n  String? content;\n  String? jumpUrl;\n  String? opusId;\n  Stat? stat;\n  Cover? cover;\n\n  SpaceOpusItemModel({\n    this.content,\n    this.jumpUrl,\n    this.opusId,\n    this.stat,\n    this.cover,\n  });\n\n  factory SpaceOpusItemModel.fromJson(Map<String, dynamic> json) =>\n      SpaceOpusItemModel(\n        content: json['content'] as String?,\n        jumpUrl: json['jump_url'] as String?,\n        opusId: json['opus_id'] as String?,\n        stat: json['stat'] == null\n            ? null\n            : Stat.fromJson(json['stat'] as Map<String, dynamic>),\n        cover: json['cover'] == null\n            ? null\n            : Cover.fromJson(json['cover'] as Map<String, dynamic>),\n      );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_opus/stat.dart",
    "content": "class Stat {\n  String? like;\n\n  Stat({this.like});\n\n  factory Stat.fromJson(Map<String, dynamic> json) => Stat(\n    like: json['like'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_season_series/archive.dart",
    "content": "import 'package:PiliPlus/models_new/space/space_season_series/stat.dart';\n\nclass SpaceSsArchive {\n  int? aid;\n  String? bvid;\n  int? ctime;\n  int? duration;\n  bool? enableVt;\n  bool? interactiveVideo;\n  String? pic;\n  int? playbackPosition;\n  int? pubdate;\n  SpaceSsStat? stat;\n  int? state;\n  String? title;\n  int? ugcPay;\n  String? vtDisplay;\n  int? isLessonVideo;\n\n  SpaceSsArchive({\n    this.aid,\n    this.bvid,\n    this.ctime,\n    this.duration,\n    this.enableVt,\n    this.interactiveVideo,\n    this.pic,\n    this.playbackPosition,\n    this.pubdate,\n    this.stat,\n    this.state,\n    this.title,\n    this.ugcPay,\n    this.vtDisplay,\n    this.isLessonVideo,\n  });\n\n  factory SpaceSsArchive.fromJson(Map<String, dynamic> json) => SpaceSsArchive(\n    aid: json[\"aid\"],\n    bvid: json[\"bvid\"],\n    ctime: json[\"ctime\"],\n    duration: json[\"duration\"],\n    enableVt: json[\"enable_vt\"],\n    interactiveVideo: json[\"interactive_video\"],\n    pic: json[\"pic\"],\n    playbackPosition: json[\"playback_position\"],\n    pubdate: json[\"pubdate\"],\n    stat: json[\"stat\"] == null ? null : SpaceSsStat.fromJson(json[\"stat\"]),\n    state: json[\"state\"],\n    title: json[\"title\"],\n    ugcPay: json[\"ugc_pay\"],\n    vtDisplay: json[\"vt_display\"],\n    isLessonVideo: json[\"is_lesson_video\"],\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_season_series/item.dart",
    "content": "import 'package:PiliPlus/models_new/space/space_season_series/page.dart';\nimport 'package:PiliPlus/models_new/space/space_season_series/season.dart';\n\nclass SpaceSsData {\n  SpaceSsPage? page;\n  List<SpaceSsModel>? seasonsList;\n  List<SpaceSsModel>? seriesList;\n\n  SpaceSsData({\n    this.page,\n    this.seasonsList,\n    this.seriesList,\n  });\n\n  factory SpaceSsData.fromJson(Map<String, dynamic> json) => SpaceSsData(\n    page: json[\"page\"] == null ? null : SpaceSsPage.fromJson(json[\"page\"]),\n    seasonsList: (json[\"seasons_list\"] as List?)\n        ?.map((e) => SpaceSsModel.fromJson(e))\n        .toList(),\n    seriesList: (json[\"series_list\"] as List?)\n        ?.map((e) => SpaceSsModel.fromJson(e))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_season_series/page.dart",
    "content": "class SpaceSsPage {\n  int? pageNum;\n  int? pageSize;\n  int? total;\n\n  SpaceSsPage({\n    this.pageNum,\n    this.pageSize,\n    this.total,\n  });\n\n  factory SpaceSsPage.fromJson(Map<String, dynamic> json) => SpaceSsPage(\n    pageNum: json[\"page_num\"],\n    pageSize: json[\"page_size\"],\n    total: json[\"total\"],\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_season_series/season.dart",
    "content": "import 'package:PiliPlus/models_new/space/space_season_series/archive.dart';\nimport 'package:PiliPlus/models_new/space/space_season_series/stat.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\n\nclass SpaceSsModel {\n  List<SpaceSsArchive>? archives;\n  SpaceSsMeta? meta;\n  List<int>? recentAids;\n\n  SpaceSsModel({\n    this.archives,\n    this.meta,\n    this.recentAids,\n  });\n\n  factory SpaceSsModel.fromJson(Map<String, dynamic> json) => SpaceSsModel(\n    archives: (json[\"archives\"] as List?)\n        ?.map((e) => SpaceSsArchive.fromJson(e))\n        .toList(),\n    meta: json[\"meta\"] == null ? null : SpaceSsMeta.fromJson(json[\"meta\"]),\n    recentAids: (json[\"recent_aids\"] as List?)?.fromCast(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_season_series/stat.dart",
    "content": "class SpaceSsStat {\n  int? view;\n  int? vt;\n\n  SpaceSsStat({\n    this.view,\n    this.vt,\n  });\n\n  factory SpaceSsStat.fromJson(Map<String, dynamic> json) => SpaceSsStat(\n    view: json[\"view\"],\n    vt: json[\"vt\"],\n  );\n}\n\nclass SpaceSsMeta {\n  int? category;\n  String? cover;\n  String? description;\n  int? mid;\n  String? name;\n  int? ptime;\n  int? total;\n  dynamic seasonId;\n  dynamic seriesId;\n\n  SpaceSsMeta({\n    this.category,\n    this.cover,\n    this.description,\n    this.mid,\n    this.name,\n    this.ptime,\n    this.total,\n    this.seasonId,\n    this.seriesId,\n  });\n\n  factory SpaceSsMeta.fromJson(Map<String, dynamic> json) => SpaceSsMeta(\n    category: json[\"category\"],\n    cover: json[\"cover\"],\n    description: json[\"description\"],\n    mid: json[\"mid\"],\n    name: json[\"name\"],\n    ptime: json[\"ptime\"],\n    total: json[\"total\"],\n    seasonId: json[\"season_id\"],\n    seriesId: json[\"series_id\"],\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_shop/below_label.dart",
    "content": "class BelowLabel {\n  int? tagType;\n  String? title;\n  String? titleDayColor1;\n  String? titleDayColor2;\n  String? titleNightColor1;\n  String? titleNightColor2;\n  int? cornerRadius;\n  int? useBoard;\n  String? backDayColor1;\n  String? backDayColor2;\n  String? backNightColor1;\n  String? backNightColor2;\n\n  BelowLabel({\n    this.tagType,\n    this.title,\n    this.titleDayColor1,\n    this.titleDayColor2,\n    this.titleNightColor1,\n    this.titleNightColor2,\n    this.cornerRadius,\n    this.useBoard,\n    this.backDayColor1,\n    this.backDayColor2,\n    this.backNightColor1,\n    this.backNightColor2,\n  });\n\n  factory BelowLabel.fromJson(Map<String, dynamic> json) => BelowLabel(\n    tagType: json['tagType'] as int?,\n    title: json['title'] as String?,\n    titleDayColor1: json['titleDayColor1'] as String?,\n    titleDayColor2: json['titleDayColor2'] as String?,\n    titleNightColor1: json['titleNightColor1'] as String?,\n    titleNightColor2: json['titleNightColor2'] as String?,\n    cornerRadius: json['cornerRadius'] as int?,\n    useBoard: json['useBoard'] as int?,\n    backDayColor1: json['backDayColor1'] as String?,\n    backDayColor2: json['backDayColor2'] as String?,\n    backNightColor1: json['backNightColor1'] as String?,\n    backNightColor2: json['backNightColor2'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_shop/benefit_info.dart",
    "content": "class BenefitInfo {\n  String? prefix;\n  String? amount;\n  dynamic suffix;\n\n  BenefitInfo({this.prefix, this.amount, this.suffix});\n\n  factory BenefitInfo.fromJson(Map<String, dynamic> json) => BenefitInfo(\n    prefix: json['prefix'] as String?,\n    amount: json['amount'] as String?,\n    suffix: json['suffix'] as dynamic,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_shop/cover.dart",
    "content": "class Cover {\n  String? url;\n  String? imgWh;\n  int? height;\n  int? width;\n  dynamic size;\n\n  Cover({this.url, this.imgWh, this.height, this.width, this.size});\n\n  factory Cover.fromJson(Map<String, dynamic> json) => Cover(\n    url: json['url'] as String?,\n    imgWh: json['imgWH'] as String?,\n    height: json['height'] as int?,\n    width: json['width'] as int?,\n    size: json['size'] as dynamic,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_shop/data.dart",
    "content": "import 'package:PiliPlus/models_new/space/space_shop/item.dart';\n\nclass SpaceShopData {\n  List<SpaceShopItem>? data;\n  bool? showMoreTab;\n  String? clickUrl;\n  String? showMoreDesc;\n  bool? haveNextPage;\n  int? nextSearchAfter;\n\n  SpaceShopData({\n    this.data,\n    this.showMoreTab,\n    this.clickUrl,\n    this.showMoreDesc,\n    this.haveNextPage,\n    this.nextSearchAfter,\n  });\n\n  factory SpaceShopData.fromJson(Map<String, dynamic> json) => SpaceShopData(\n    data: (json['data'] as List<dynamic>?)\n        ?.map((e) => SpaceShopItem.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    showMoreTab: json['showMoreTab'] as bool?,\n    clickUrl: json['clickUrl'] as String?,\n    showMoreDesc: json['showMoreDesc'] as String?,\n    haveNextPage: json['haveNextPage'] as bool?,\n    nextSearchAfter: json['nextSearchAfter'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_shop/item.dart",
    "content": "import 'package:PiliPlus/models_new/space/space_shop/below_label.dart';\nimport 'package:PiliPlus/models_new/space/space_shop/benefit_info.dart';\nimport 'package:PiliPlus/models_new/space/space_shop/cover.dart';\nimport 'package:PiliPlus/models_new/space/space_shop/net_price.dart';\nimport 'package:PiliPlus/models_new/space/space_shop/report_params.dart';\nimport 'package:PiliPlus/models_new/space/space_shop/source_desc.dart';\nimport 'package:PiliPlus/models_new/space/space_shop/source_front_tag.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\n\nclass SpaceShopItem {\n  String? contentId;\n  int? contentType;\n  dynamic contentSubType;\n  dynamic trackId;\n  Cover? cover;\n  String? title;\n  dynamic subTitle;\n  String? cardUrl;\n  List<BelowLabel>? belowLabels;\n  dynamic topRightLabels;\n  dynamic bottomRightLabels;\n  dynamic topLeftLabels;\n  dynamic bottomLeftLabels;\n  List<dynamic>? titleFrontLabels;\n  dynamic priceBehindLabels;\n  NetPrice? netPrice;\n  dynamic userInteractInfos;\n  List<BenefitInfo>? benefitInfos;\n  ReportParams? reportParams;\n  dynamic ichibanItem;\n  bool? isMarketItem;\n  dynamic remainBoxStr;\n  dynamic surpriseTips;\n  String? outSchemaUrl;\n  int? itemCode;\n  dynamic merchantId;\n  int? itemSource;\n  String? itemSourceName;\n  SourceDesc? sourceDesc;\n  SourceFrontTag? sourceFrontTag;\n  List<String>? openWhiteList;\n  bool? sellOut;\n  int? status;\n  bool? preSaleEnd;\n  bool? preSaleNotStart;\n  int? jumpType;\n  dynamic lrpriceStr;\n\n  SpaceShopItem({\n    this.contentId,\n    this.contentType,\n    this.contentSubType,\n    this.trackId,\n    this.cover,\n    this.title,\n    this.subTitle,\n    this.cardUrl,\n    this.belowLabels,\n    this.topRightLabels,\n    this.bottomRightLabels,\n    this.topLeftLabels,\n    this.bottomLeftLabels,\n    this.titleFrontLabels,\n    this.priceBehindLabels,\n    this.netPrice,\n    this.userInteractInfos,\n    this.benefitInfos,\n    this.reportParams,\n    this.ichibanItem,\n    this.isMarketItem,\n    this.remainBoxStr,\n    this.surpriseTips,\n    this.outSchemaUrl,\n    this.itemCode,\n    this.merchantId,\n    this.itemSource,\n    this.itemSourceName,\n    this.sourceDesc,\n    this.sourceFrontTag,\n    this.openWhiteList,\n    this.sellOut,\n    this.status,\n    this.preSaleEnd,\n    this.preSaleNotStart,\n    this.jumpType,\n    this.lrpriceStr,\n  });\n\n  factory SpaceShopItem.fromJson(Map<String, dynamic> json) => SpaceShopItem(\n    contentId: json['contentId'] as String?,\n    contentType: json['contentType'] as int?,\n    contentSubType: json['contentSubType'] as dynamic,\n    trackId: json['trackId'] as dynamic,\n    cover: json['cover'] == null\n        ? null\n        : Cover.fromJson(json['cover'] as Map<String, dynamic>),\n    title: json['title'] as String?,\n    subTitle: json['subTitle'] as dynamic,\n    cardUrl: json['cardUrl'] as String?,\n    belowLabels: (json['belowLabels'] as List<dynamic>?)\n        ?.map((e) => BelowLabel.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    topRightLabels: json['topRightLabels'] as dynamic,\n    bottomRightLabels: json['bottomRightLabels'] as dynamic,\n    topLeftLabels: json['topLeftLabels'] as dynamic,\n    bottomLeftLabels: json['bottomLeftLabels'] as dynamic,\n    titleFrontLabels: json['titleFrontLabels'] as List<dynamic>?,\n    priceBehindLabels: json['priceBehindLabels'] as dynamic,\n    netPrice: json['netPrice'] == null\n        ? null\n        : NetPrice.fromJson(json['netPrice'] as Map<String, dynamic>),\n    userInteractInfos: json['userInteractInfos'] as dynamic,\n    benefitInfos: (json['benefitInfos'] as List<dynamic>?)\n        ?.map((e) => BenefitInfo.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    reportParams: json['reportParams'] == null\n        ? null\n        : ReportParams.fromJson(json['reportParams'] as Map<String, dynamic>),\n    ichibanItem: json['ichibanItem'] as dynamic,\n    isMarketItem: json['isMarketItem'] as bool?,\n    remainBoxStr: json['remainBoxStr'] as dynamic,\n    surpriseTips: json['surpriseTips'] as dynamic,\n    outSchemaUrl: json['outSchemaUrl'] as String?,\n    itemCode: json['itemCode'] as int?,\n    merchantId: json['merchantId'] as dynamic,\n    itemSource: json['itemSource'] as int?,\n    itemSourceName: json['itemSourceName'] as String?,\n    sourceDesc: json['sourceDesc'] == null\n        ? null\n        : SourceDesc.fromJson(json['sourceDesc'] as Map<String, dynamic>),\n    sourceFrontTag: json['sourceFrontTag'] == null\n        ? null\n        : SourceFrontTag.fromJson(\n            json['sourceFrontTag'] as Map<String, dynamic>,\n          ),\n    openWhiteList: (json['openWhiteList'] as List?)?.fromCast(),\n    sellOut: json['sellOut'] as bool?,\n    status: json['status'] as int?,\n    preSaleEnd: json['preSaleEnd'] as bool?,\n    preSaleNotStart: json['preSaleNotStart'] as bool?,\n    jumpType: json['jumpType'] as int?,\n    lrpriceStr: json['lrpriceStr'] as dynamic,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_shop/net_price.dart",
    "content": "class NetPrice {\n  String? netPrice;\n  String? priceSymbol;\n  String? pricePrefix;\n\n  NetPrice({this.netPrice, this.priceSymbol, this.pricePrefix});\n\n  factory NetPrice.fromJson(Map<String, dynamic> json) => NetPrice(\n    netPrice: json['netPrice'] as String?,\n    priceSymbol: json['priceSymbol'] as String?,\n    pricePrefix: json['pricePrefix'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_shop/report_params.dart",
    "content": "class ReportParams {\n  String? trail;\n  String? trackId;\n\n  ReportParams({this.trail, this.trackId});\n\n  factory ReportParams.fromJson(Map<String, dynamic> json) => ReportParams(\n    trail: json['trail'] as String?,\n    trackId: json['track_id'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_shop/source_desc.dart",
    "content": "class SourceDesc {\n  int? tagType;\n  String? title;\n  String? titleDayColor1;\n  String? titleDayColor2;\n  String? titleNightColor1;\n  String? titleNightColor2;\n  int? cornerRadius;\n  int? useBoard;\n  String? backDayColor1;\n  String? backDayColor2;\n  String? backNightColor1;\n  String? backNightColor2;\n\n  SourceDesc({\n    this.tagType,\n    this.title,\n    this.titleDayColor1,\n    this.titleDayColor2,\n    this.titleNightColor1,\n    this.titleNightColor2,\n    this.cornerRadius,\n    this.useBoard,\n    this.backDayColor1,\n    this.backDayColor2,\n    this.backNightColor1,\n    this.backNightColor2,\n  });\n\n  factory SourceDesc.fromJson(Map<String, dynamic> json) => SourceDesc(\n    tagType: json['tagType'] as int?,\n    title: json['title'] as String?,\n    titleDayColor1: json['titleDayColor1'] as String?,\n    titleDayColor2: json['titleDayColor2'] as String?,\n    titleNightColor1: json['titleNightColor1'] as String?,\n    titleNightColor2: json['titleNightColor2'] as String?,\n    cornerRadius: json['cornerRadius'] as int?,\n    useBoard: json['useBoard'] as int?,\n    backDayColor1: json['backDayColor1'] as String?,\n    backDayColor2: json['backDayColor2'] as String?,\n    backNightColor1: json['backNightColor1'] as String?,\n    backNightColor2: json['backNightColor2'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/space/space_shop/source_front_tag.dart",
    "content": "class SourceFrontTag {\n  int? tagType;\n  String? title;\n  String? titleDayColor1;\n  String? titleDayColor2;\n  String? titleNightColor1;\n  String? titleNightColor2;\n  int? cornerRadius;\n  int? useBoard;\n  String? backDayColor1;\n  String? backDayColor2;\n  String? backNightColor1;\n  String? backNightColor2;\n\n  SourceFrontTag({\n    this.tagType,\n    this.title,\n    this.titleDayColor1,\n    this.titleDayColor2,\n    this.titleNightColor1,\n    this.titleNightColor2,\n    this.cornerRadius,\n    this.useBoard,\n    this.backDayColor1,\n    this.backDayColor2,\n    this.backNightColor1,\n    this.backNightColor2,\n  });\n\n  factory SourceFrontTag.fromJson(Map<String, dynamic> json) {\n    return SourceFrontTag(\n      tagType: json['tagType'] as int?,\n      title: json['title'] as String?,\n      titleDayColor1: json['titleDayColor1'] as String?,\n      titleDayColor2: json['titleDayColor2'] as String?,\n      titleNightColor1: json['titleNightColor1'] as String?,\n      titleNightColor2: json['titleNightColor2'] as String?,\n      cornerRadius: json['cornerRadius'] as int?,\n      useBoard: json['useBoard'] as int?,\n      backDayColor1: json['backDayColor1'] as String?,\n      backDayColor2: json['backDayColor2'] as String?,\n      backNightColor1: json['backNightColor1'] as String?,\n      backNightColor2: json['backNightColor2'] as String?,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/models_new/space_setting/data.dart",
    "content": "import 'package:PiliPlus/models_new/space_setting/privacy.dart';\n\nclass SpaceSettingData {\n  Privacy? privacy;\n  bool? showNftSwitch;\n  String? exclusiveUrl;\n\n  SpaceSettingData({this.privacy, this.showNftSwitch, this.exclusiveUrl});\n\n  factory SpaceSettingData.fromJson(Map<String, dynamic> json) =>\n      SpaceSettingData(\n        privacy: json['privacy'] == null\n            ? null\n            : Privacy.fromJson(json['privacy'] as Map<String, dynamic>),\n        showNftSwitch: json['show_nft_switch'] as bool?,\n        exclusiveUrl: json['exclusive_url'] as String?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/space_setting/privacy.dart",
    "content": "class SpaceSettingModel {\n  SpaceSettingModel({\n    required this.name,\n    required this.key,\n    required this.value,\n    this.isReverse = false,\n  });\n\n  String name;\n  String key;\n  int? value;\n  bool isReverse;\n\n  bool get boolVal => isReverse ? value == 0 : value == 1;\n}\n\nclass Privacy {\n  List<SpaceSettingModel> list1;\n  List<SpaceSettingModel> list2;\n  List<SpaceSettingModel> list3;\n\n  Privacy({\n    required this.list1,\n    required this.list2,\n    required this.list3,\n  });\n\n  factory Privacy.fromJson(Map<String, dynamic> json) => Privacy(\n    list1: [\n      SpaceSettingModel(\n        name: '公开我的收藏',\n        key: 'fav_video',\n        value: json['fav_video'],\n      ),\n      SpaceSettingModel(\n        name: '公开我的追番追剧',\n        key: 'bangumi',\n        value: json['bangumi'],\n      ),\n      SpaceSettingModel(\n        name: '公开我的追漫',\n        key: 'comic',\n        value: json['comic'],\n      ),\n      SpaceSettingModel(\n        name: '公开最近投币的视频',\n        key: 'coins_video',\n        value: json['coins_video'],\n      ),\n      SpaceSettingModel(\n        name: '公开最近点赞的视频',\n        key: 'likes_video',\n        value: json['likes_video'],\n      ),\n      SpaceSettingModel(\n        name: '公开最近玩过的游戏',\n        key: 'played_game',\n        value: json['played_game'],\n      ),\n      SpaceSettingModel(\n        name: '公开拥有的粉丝装扮',\n        key: 'dress_up',\n        value: json['dress_up'],\n      ),\n      SpaceSettingModel(\n        name: '公开我的关注列表',\n        key: 'disable_following',\n        value: json['disable_following'],\n        isReverse: true,\n      ),\n      SpaceSettingModel(\n        name: '公开我的粉丝列表',\n        key: 'disable_show_fans',\n        value: json['disable_show_fans'],\n        isReverse: true,\n      ),\n    ],\n    list2: [\n      SpaceSettingModel(\n        name: '公开佩戴的粉丝勋章',\n        key: 'close_space_medal',\n        value: json['close_space_medal'],\n        isReverse: true,\n      ),\n      SpaceSettingModel(\n        name: '勋章墙公开显示所有粉丝勋章',\n        key: 'only_show_wearing',\n        value: json['only_show_wearing'],\n        isReverse: true,\n      ),\n      SpaceSettingModel(\n        name: '公开学校信息',\n        key: 'disable_show_school',\n        value: json['disable_show_school'],\n        isReverse: true,\n      ),\n    ],\n    list3: [\n      SpaceSettingModel(\n        name: '投稿视频列表中展现直播回放',\n        key: 'live_playback',\n        value: json['live_playback'],\n      ),\n      SpaceSettingModel(\n        name: '投稿视频列表中展现包月充电专属视频',\n        key: 'charge_video',\n        value: json['charge_video'],\n      ),\n      SpaceSettingModel(\n        name: '投稿视频列表中展现课堂视频',\n        key: 'lesson_video',\n        value: json['lesson_video'],\n      ),\n    ],\n  );\n}\n"
  },
  {
    "path": "lib/models_new/sponsor_block/segment_item.dart",
    "content": "import 'package:PiliPlus/models/common/sponsor_block/segment_type.dart';\n\nclass SegmentItemModel {\n  String? cid;\n  String category;\n  String? actionType;\n  List<int> segment;\n  String uuid;\n  num? videoDuration;\n  int? votes;\n\n  SegmentItemModel({\n    this.cid,\n    required this.category,\n    this.actionType,\n    required this.segment,\n    required this.uuid,\n    this.videoDuration,\n    this.votes,\n  });\n\n  factory SegmentItemModel.fromJson(Map<String, dynamic> json) =>\n      SegmentItemModel(\n        cid: json[\"cid\"],\n        category: json[\"category\"],\n        actionType: json[\"actionType\"],\n        segment: (json[\"segment\"] as List)\n            .map((e) => ((e as num) * 1000).round())\n            .toList(),\n        uuid: json[\"UUID\"],\n        videoDuration: json[\"videoDuration\"] == null\n            ? null\n            : (json[\"videoDuration\"] as num) * 1000,\n        votes: json[\"votes\"],\n      );\n\n  factory SegmentItemModel.fromPgcJson(\n    Map<String, dynamic> json,\n    num? videoDuration,\n  ) => SegmentItemModel(\n    category: switch (json['clipType']) {\n      'CLIP_TYPE_OP' => SegmentType.intro.name,\n      'CLIP_TYPE_ED' => SegmentType.outro.name,\n      _ => SegmentType.sponsor.name,\n    },\n    segment: [\n      ((json['start'] as num) * 1000).round(),\n      ((json['end'] as num) * 1000).round(),\n    ],\n    uuid: '',\n    videoDuration: videoDuration,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/sponsor_block/user_info.dart",
    "content": "import 'package:PiliPlus/utils/duration_utils.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\n\nclass UserInfo {\n  final int viewCount;\n  final double minutesSaved;\n  final int segmentCount;\n\n  const UserInfo({\n    required this.viewCount,\n    required this.minutesSaved,\n    required this.segmentCount,\n  });\n\n  factory UserInfo.fromJson(Map<String, dynamic> json) => UserInfo(\n    viewCount: json['viewCount'],\n    minutesSaved: (json['minutesSaved'] as num).toDouble(),\n    segmentCount: json['segmentCount'],\n  );\n\n  @override\n  String toString() {\n    String minutes = DurationUtils.formatTimeDuration(\n      Duration(minutes: minutesSaved.round()),\n    );\n    if (minutes.isEmpty) {\n      minutes = '0分钟';\n    }\n    return ('您提交了 ${NumUtils.formatPositiveDecimal(segmentCount)} 片段\\n'\n        '您为大家节省了 ${NumUtils.formatPositiveDecimal(viewCount)} 片段\\n'\n        '($minutes 的生命)');\n  }\n}\n"
  },
  {
    "path": "lib/models_new/sub/sub/data.dart",
    "content": "import 'package:PiliPlus/models_new/sub/sub/list.dart';\n\nclass SubData {\n  int? count;\n  List<SubItemModel>? list;\n  bool? hasMore;\n\n  SubData({this.count, this.list, this.hasMore});\n\n  factory SubData.fromJson(Map<String, dynamic> json) => SubData(\n    count: json['count'] as int?,\n    list: (json['list'] as List<dynamic>?)\n        ?.map((e) => SubItemModel.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    hasMore: json['has_more'] as bool?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/sub/sub/list.dart",
    "content": "import 'package:PiliPlus/models/model_owner.dart';\nimport 'package:PiliPlus/models_new/fav/fav_detail/cnt_info.dart';\n\nclass SubItemModel {\n  int? id;\n  int? fid;\n  int? mid;\n  int? attr;\n  String? attrDesc;\n  String? title;\n  String? cover;\n  Owner? upper;\n  int? coverType;\n  String? intro;\n  int? ctime;\n  int? mtime;\n  int? state;\n  int? favState;\n  int? mediaCount;\n  int? viewCount;\n  int? vt;\n  bool? isTop;\n  dynamic recentFav;\n  int? playSwitch;\n  int? type;\n  String? link;\n  String? bvid;\n  CntInfo? cntInfo;\n\n  SubItemModel({\n    this.id,\n    this.fid,\n    this.mid,\n    this.attr,\n    this.attrDesc,\n    this.title,\n    this.cover,\n    this.upper,\n    this.coverType,\n    this.intro,\n    this.ctime,\n    this.mtime,\n    this.state,\n    this.favState,\n    this.mediaCount,\n    this.viewCount,\n    this.vt,\n    this.isTop,\n    this.recentFav,\n    this.playSwitch,\n    this.type,\n    this.link,\n    this.bvid,\n    this.cntInfo,\n  });\n\n  factory SubItemModel.fromJson(Map<String, dynamic> json) => SubItemModel(\n    id: json['id'] as int?,\n    fid: json['fid'] as int?,\n    mid: json['mid'] as int?,\n    attr: json['attr'] as int?,\n    attrDesc: json['attr_desc'] as String?,\n    title: json['title'] as String?,\n    cover: json['cover'] as String?,\n    upper: json['upper'] == null\n        ? null\n        : Owner.fromJson(json['upper'] as Map<String, dynamic>),\n    coverType: json['cover_type'] as int?,\n    intro: json['intro'] as String?,\n    ctime: json['ctime'] as int?,\n    mtime: json['mtime'] as int?,\n    state: json['state'] as int?,\n    favState: json['fav_state'] as int?,\n    mediaCount: json['media_count'] as int?,\n    viewCount: json['view_count'] as int?,\n    vt: json['vt'] as int?,\n    isTop: json['is_top'] as bool?,\n    recentFav: json['recent_fav'] as dynamic,\n    playSwitch: json['play_switch'] as int?,\n    type: json['type'] as int?,\n    link: json['link'] as String?,\n    bvid: json['bvid'] as String?,\n    cntInfo: json['cnt_info'] == null\n        ? null\n        : CntInfo.fromJson(json['cnt_info']),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/sub/sub_detail/data.dart",
    "content": "import 'package:PiliPlus/models_new/sub/sub/list.dart';\nimport 'package:PiliPlus/models_new/sub/sub_detail/media.dart';\n\nclass SubDetailData {\n  SubItemModel? info;\n  List<SubDetailItemModel>? medias;\n\n  SubDetailData({this.info, this.medias});\n\n  factory SubDetailData.fromJson(Map<String, dynamic> json) => SubDetailData(\n    info: json['info'] == null\n        ? null\n        : SubItemModel.fromJson(json['info'] as Map<String, dynamic>),\n    medias: (json['medias'] as List<dynamic>?)\n        ?.map((e) => SubDetailItemModel.fromJson(e as Map<String, dynamic>))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/sub/sub_detail/media.dart",
    "content": "import 'package:PiliPlus/models/model_owner.dart';\nimport 'package:PiliPlus/models_new/fav/fav_detail/cnt_info.dart';\n\nclass SubDetailItemModel {\n  int? id;\n  String? title;\n  String? cover;\n  int? duration;\n  int? pubtime;\n  String? bvid;\n  Owner? upper;\n  CntInfo? cntInfo;\n  int? enableVt;\n  String? vtDisplay;\n  bool? isSelfView;\n\n  SubDetailItemModel({\n    this.id,\n    this.title,\n    this.cover,\n    this.duration,\n    this.pubtime,\n    this.bvid,\n    this.upper,\n    this.cntInfo,\n    this.enableVt,\n    this.vtDisplay,\n    this.isSelfView,\n  });\n\n  factory SubDetailItemModel.fromJson(Map<String, dynamic> json) =>\n      SubDetailItemModel(\n        id: json['id'] as int?,\n        title: json['title'] as String?,\n        cover: json['cover'] as String?,\n        duration: json['duration'] as int?,\n        pubtime: json['pubtime'] as int?,\n        bvid: json['bvid'] as String?,\n        upper: json['upper'] == null\n            ? null\n            : Owner.fromJson(json['upper'] as Map<String, dynamic>),\n        cntInfo: json['cnt_info'] == null\n            ? null\n            : CntInfo.fromJson(json['cnt_info'] as Map<String, dynamic>),\n        enableVt: json['enable_vt'] as int?,\n        vtDisplay: json['vt_display'] as String?,\n        isSelfView: json['is_self_view'] as bool?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/triple/pgc_triple.dart",
    "content": "class PgcTriple {\n  num? coin;\n  num? coinNumber;\n  int? favorite;\n  int? fmid;\n  int? follow;\n  int? like;\n  bool? relation;\n\n  PgcTriple({\n    this.coin,\n    this.coinNumber,\n    this.favorite,\n    this.fmid,\n    this.follow,\n    this.like,\n    this.relation,\n  });\n\n  factory PgcTriple.fromJson(Map<String, dynamic> json) => PgcTriple(\n    coin: json[\"coin\"],\n    coinNumber: json[\"coin_number\"],\n    favorite: json[\"favorite\"],\n    fmid: json[\"fmid\"],\n    follow: json[\"follow\"],\n    like: json[\"like\"],\n    relation: json[\"relation\"],\n  );\n}\n"
  },
  {
    "path": "lib/models_new/triple/ugc_triple.dart",
    "content": "class UgcTriple {\n  bool? like;\n  bool? coin;\n  bool? fav;\n  int? multiply;\n  bool? isRisk;\n  int? gaiaResType;\n  dynamic gaiaData;\n\n  UgcTriple({\n    this.like,\n    this.coin,\n    this.fav,\n    this.multiply,\n    this.isRisk,\n    this.gaiaResType,\n    this.gaiaData,\n  });\n\n  factory UgcTriple.fromJson(Map<String, dynamic> json) => UgcTriple(\n    like: json[\"like\"],\n    coin: json[\"coin\"],\n    fav: json[\"fav\"],\n    multiply: json[\"multiply\"],\n    isRisk: json[\"is_risk\"],\n    gaiaResType: json[\"gaia_res_type\"],\n    gaiaData: json[\"gaia_data\"],\n  );\n}\n"
  },
  {
    "path": "lib/models_new/upload_bfs/data.dart",
    "content": "class UploadBfsResData {\n  String? imageUrl;\n  int? imageWidth;\n  int? imageHeight;\n  double? imgSize;\n\n  UploadBfsResData({\n    this.imageUrl,\n    this.imageWidth,\n    this.imageHeight,\n    this.imgSize,\n  });\n\n  factory UploadBfsResData.fromJson(Map<String, dynamic> json) =>\n      UploadBfsResData(\n        imageUrl: json['image_url'] as String?,\n        imageWidth: json['image_width'] as int?,\n        imageHeight: json['image_height'] as int?,\n        imgSize: (json['img_size'] as num?)?.toDouble(),\n      );\n}\n"
  },
  {
    "path": "lib/models_new/upower_rank/data.dart",
    "content": "import 'package:PiliPlus/models_new/upower_rank/level_info.dart';\nimport 'package:PiliPlus/models_new/upower_rank/rank_info.dart';\nimport 'package:PiliPlus/models_new/upower_rank/up_info.dart';\nimport 'package:PiliPlus/models_new/upower_rank/user_info.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\n\nclass UpowerRankData {\n  UpInfo? upInfo;\n  List<UpowerRankInfo>? rankInfo;\n  UserInfo? userInfo;\n  int? memberTotal;\n  int? privilegeType;\n  bool? isCharge;\n  List<int>? tabs;\n  List<LevelInfo>? levelInfo;\n\n  UpowerRankData({\n    this.upInfo,\n    this.rankInfo,\n    this.userInfo,\n    this.memberTotal,\n    this.privilegeType,\n    this.isCharge,\n    this.tabs,\n    this.levelInfo,\n  });\n\n  factory UpowerRankData.fromJson(Map<String, dynamic> json) => UpowerRankData(\n    upInfo: json['up_info'] == null\n        ? null\n        : UpInfo.fromJson(json['up_info'] as Map<String, dynamic>),\n    rankInfo: (json['rank_info'] as List<dynamic>?)\n        ?.map((e) => UpowerRankInfo.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    userInfo: json['user_info'] == null\n        ? null\n        : UserInfo.fromJson(json['user_info'] as Map<String, dynamic>),\n    memberTotal: json['member_total'] as int?,\n    privilegeType: json['privilege_type'] as int?,\n    isCharge: json['is_charge'] as bool?,\n    tabs: (json['tabs'] as List?)?.fromCast(),\n    levelInfo: (json['level_info'] as List<dynamic>?)\n        ?.map((e) => LevelInfo.fromJson(e as Map<String, dynamic>))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/upower_rank/level_info.dart",
    "content": "class LevelInfo {\n  int? privilegeType;\n  String? name;\n  int? price;\n  int? memberTotal;\n\n  LevelInfo({this.privilegeType, this.name, this.price, this.memberTotal});\n\n  factory LevelInfo.fromJson(Map<String, dynamic> json) => LevelInfo(\n    privilegeType: json['privilege_type'] as int?,\n    name: json['name'] as String?,\n    price: json['price'] as int?,\n    memberTotal: json['member_total'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/upower_rank/rank_info.dart",
    "content": "class UpowerRankInfo {\n  int? mid;\n  String? nickname;\n  String? avatar;\n  int? rank;\n  int? day;\n  int? expireAt;\n  int? remainDays;\n\n  UpowerRankInfo({\n    this.mid,\n    this.nickname,\n    this.avatar,\n    this.rank,\n    this.day,\n    this.expireAt,\n    this.remainDays,\n  });\n\n  factory UpowerRankInfo.fromJson(Map<String, dynamic> json) => UpowerRankInfo(\n    mid: json['mid'] as int?,\n    nickname: json['nickname'] as String?,\n    avatar: json['avatar'] as String?,\n    rank: json['rank'] as int?,\n    day: json['day'] as int?,\n    expireAt: json['expire_at'] as int?,\n    remainDays: json['remain_days'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/upower_rank/up_info.dart",
    "content": "class UpInfo {\n  int? mid;\n  String? nickname;\n  String? avatar;\n  int? type;\n  String? title;\n  int? upowerState;\n\n  UpInfo({\n    this.mid,\n    this.nickname,\n    this.avatar,\n    this.type,\n    this.title,\n    this.upowerState,\n  });\n\n  factory UpInfo.fromJson(Map<String, dynamic> json) => UpInfo(\n    mid: json['mid'] as int?,\n    nickname: json['nickname'] as String?,\n    avatar: json['avatar'] as String?,\n    type: json['type'] as int?,\n    title: json['title'] as String?,\n    upowerState: json['upower_state'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/upower_rank/user_info.dart",
    "content": "class UserInfo {\n  int? mid;\n  String? nickname;\n  String? avatar;\n  int? rank;\n  int? day;\n  int? expireAt;\n  int? remainDays;\n\n  UserInfo({\n    this.mid,\n    this.nickname,\n    this.avatar,\n    this.rank,\n    this.day,\n    this.expireAt,\n    this.remainDays,\n  });\n\n  factory UserInfo.fromJson(Map<String, dynamic> json) => UserInfo(\n    mid: json['mid'] as int?,\n    nickname: json['nickname'] as String?,\n    avatar: json['avatar'] as String?,\n    rank: json['rank'] as int?,\n    day: json['day'] as int?,\n    expireAt: json['expire_at'] as int?,\n    remainDays: json['remain_days'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/user_real_name/data.dart",
    "content": "import 'package:PiliPlus/models_new/user_real_name/reject_page.dart';\n\nclass UserRealNameData {\n  String? name;\n  String? namePrefix;\n  bool? show;\n  RejectPage? rejectPage;\n\n  UserRealNameData({this.name, this.namePrefix, this.show, this.rejectPage});\n\n  factory UserRealNameData.fromJson(Map<String, dynamic> json) =>\n      UserRealNameData(\n        name: json['name'] as String?,\n        namePrefix: json['name_prefix'] as String?,\n        show: json['show'] as bool?,\n        rejectPage: json['reject_page'] == null\n            ? null\n            : RejectPage.fromJson(json['reject_page'] as Map<String, dynamic>),\n      );\n}\n"
  },
  {
    "path": "lib/models_new/user_real_name/reject_page.dart",
    "content": "class RejectPage {\n  String? title;\n  String? text;\n  String? img;\n\n  RejectPage({this.title, this.text, this.img});\n\n  factory RejectPage.fromJson(Map<String, dynamic> json) => RejectPage(\n    title: json['title'] as String?,\n    text: json['text'] as String?,\n    img: json['img'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_ai_conclusion/data.dart",
    "content": "import 'package:PiliPlus/models_new/video/video_ai_conclusion/model_result.dart';\n\nclass AiConclusionData {\n  int? code;\n  AiConclusionResult? modelResult;\n  String? stid;\n  int? status;\n  int? likeNum;\n  int? dislikeNum;\n\n  AiConclusionData({\n    this.code,\n    this.modelResult,\n    this.stid,\n    this.status,\n    this.likeNum,\n    this.dislikeNum,\n  });\n\n  factory AiConclusionData.fromJson(Map<String, dynamic> json) =>\n      AiConclusionData(\n        code: json['code'] as int?,\n        modelResult: json['model_result'] == null\n            ? null\n            : AiConclusionResult.fromJson(\n                json['model_result'] as Map<String, dynamic>,\n              ),\n        stid: json['stid'] as String?,\n        status: json['status'] as int?,\n        likeNum: json['like_num'] as int?,\n        dislikeNum: json['dislike_num'] as int?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_ai_conclusion/model_result.dart",
    "content": "import 'package:PiliPlus/models_new/video/video_ai_conclusion/outline.dart';\nimport 'package:PiliPlus/models_new/video/video_ai_conclusion/subtitle.dart';\n\nclass AiConclusionResult {\n  int? resultType;\n  String? summary;\n  List<Outline>? outline;\n  List<Subtitle>? subtitle;\n\n  AiConclusionResult({\n    this.resultType,\n    this.summary,\n    this.outline,\n    this.subtitle,\n  });\n\n  factory AiConclusionResult.fromJson(Map<String, dynamic> json) =>\n      AiConclusionResult(\n        resultType: json['result_type'] as int?,\n        summary: json['summary'] as String?,\n        outline: (json['outline'] as List<dynamic>?)\n            ?.map((e) => Outline.fromJson(e as Map<String, dynamic>))\n            .toList(),\n        subtitle: (json['subtitle'] as List<dynamic>?)\n            ?.map((e) => Subtitle.fromJson(e as Map<String, dynamic>))\n            .toList(),\n      );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_ai_conclusion/outline.dart",
    "content": "import 'package:PiliPlus/models_new/video/video_ai_conclusion/part_outline.dart';\n\nclass Outline {\n  String? title;\n  List<PartOutline>? partOutline;\n  int? timestamp;\n\n  Outline({this.title, this.partOutline, this.timestamp});\n\n  factory Outline.fromJson(Map<String, dynamic> json) => Outline(\n    title: json['title'] as String?,\n    partOutline: (json['part_outline'] as List<dynamic>?)\n        ?.map((e) => PartOutline.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    timestamp: json['timestamp'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_ai_conclusion/part_outline.dart",
    "content": "class PartOutline {\n  int? timestamp;\n  String? content;\n\n  PartOutline({this.timestamp, this.content});\n\n  factory PartOutline.fromJson(Map<String, dynamic> json) => PartOutline(\n    timestamp: json['timestamp'] as int?,\n    content: json['content'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_ai_conclusion/part_subtitle.dart",
    "content": "class PartSubtitle {\n  int? startTimestamp;\n  int? endTimestamp;\n  String? content;\n\n  PartSubtitle({this.startTimestamp, this.endTimestamp, this.content});\n\n  factory PartSubtitle.fromJson(Map<String, dynamic> json) => PartSubtitle(\n    startTimestamp: json['start_timestamp'] as int?,\n    endTimestamp: json['end_timestamp'] as int?,\n    content: json['content'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_ai_conclusion/subtitle.dart",
    "content": "import 'package:PiliPlus/models_new/video/video_ai_conclusion/part_subtitle.dart';\n\nclass Subtitle {\n  String? title;\n  List<PartSubtitle>? partSubtitle;\n  int? timestamp;\n\n  Subtitle({this.title, this.partSubtitle, this.timestamp});\n\n  factory Subtitle.fromJson(Map<String, dynamic> json) => Subtitle(\n    title: json['title'] as String?,\n    partSubtitle: (json['part_subtitle'] as List<dynamic>?)\n        ?.map((e) => PartSubtitle.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    timestamp: json['timestamp'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_detail/arc.dart",
    "content": "import 'package:PiliPlus/models/model_owner.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/dimension.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/rights.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/stat.dart';\n\nclass Arc {\n  int? aid;\n  int? videos;\n  int? typeId;\n  String? typeName;\n  int? copyright;\n  String? pic;\n  String? title;\n  int? pubdate;\n  int? ctime;\n  String? desc;\n  int? state;\n  int? duration;\n  Rights? rights;\n  Owner? author;\n  VideoStat? stat;\n  String? dynam1c;\n  Dimension? dimension;\n  bool? isChargeableSeason;\n  bool? isBlooper;\n  int? enableVt;\n  String? vtDisplay;\n  int? typeIdV2;\n  String? typeNameV2;\n  int? isLessonVideo;\n\n  Arc({\n    this.aid,\n    this.videos,\n    this.typeId,\n    this.typeName,\n    this.copyright,\n    this.pic,\n    this.title,\n    this.pubdate,\n    this.ctime,\n    this.desc,\n    this.state,\n    this.duration,\n    this.rights,\n    this.author,\n    this.stat,\n    this.dynam1c,\n    this.dimension,\n    this.isChargeableSeason,\n    this.isBlooper,\n    this.enableVt,\n    this.vtDisplay,\n    this.typeIdV2,\n    this.typeNameV2,\n    this.isLessonVideo,\n  });\n\n  factory Arc.fromJson(Map<String, dynamic> json) => Arc(\n    aid: json['aid'] as int?,\n    videos: json['videos'] as int?,\n    typeId: json['type_id'] as int?,\n    typeName: json['type_name'] as String?,\n    copyright: json['copyright'] as int?,\n    pic: json['pic'] as String?,\n    title: json['title'] as String?,\n    pubdate: json['pubdate'] as int?,\n    ctime: json['ctime'] as int?,\n    desc: json['desc'] as String?,\n    state: json['state'] as int?,\n    duration: json['duration'] as int?,\n    rights: json['rights'] == null\n        ? null\n        : Rights.fromJson(json['rights'] as Map<String, dynamic>),\n    author: json['author'] == null\n        ? null\n        : Owner.fromJson(json['author'] as Map<String, dynamic>),\n    stat: json['stat'] == null\n        ? null\n        : VideoStat.fromJson(json['stat'] as Map<String, dynamic>),\n    dynam1c: json['dynamic'] as String?,\n    dimension: json['dimension'] == null\n        ? null\n        : Dimension.fromJson(json['dimension'] as Map<String, dynamic>),\n    isChargeableSeason: json['is_chargeable_season'] as bool?,\n    isBlooper: json['is_blooper'] as bool?,\n    enableVt: json['enable_vt'] as int?,\n    vtDisplay: json['vt_display'] as String?,\n    typeIdV2: json['type_id_v2'] as int?,\n    typeNameV2: json['type_name_v2'] as String?,\n    isLessonVideo: json['is_lesson_video'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_detail/argue_info.dart",
    "content": "class ArgueInfo {\n  String? argueMsg;\n  int? argueType;\n  String? argueLink;\n\n  ArgueInfo({this.argueMsg, this.argueType, this.argueLink});\n\n  factory ArgueInfo.fromJson(Map<String, dynamic> json) => ArgueInfo(\n    argueMsg: json['argue_msg'] as String?,\n    argueType: json['argue_type'] as int?,\n    argueLink: json['argue_link'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_detail/data.dart",
    "content": "import 'package:PiliPlus/models/model_owner.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/argue_info.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/desc_v2.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/dimension.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/page.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/rights.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/staff.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/stat.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/subtitle.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/ugc_season.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/user_garb.dart';\nimport 'package:PiliPlus/utils/parse_string.dart';\n\nclass VideoDetailData {\n  String? bvid;\n  int? aid;\n  int? videos;\n  int? tid;\n  int? tidV2;\n  String? tname;\n  String? tnameV2;\n  int? copyright;\n  String? pic;\n  String? title;\n  int? pubdate;\n  int? ctime;\n  String? desc;\n  List<DescV2>? descV2;\n  int? state;\n  int? duration;\n  Rights? rights;\n  Owner? owner;\n  VideoStat? stat;\n  ArgueInfo? argueInfo;\n  String? dynam1c;\n  int? cid;\n  Dimension? dimension;\n  int? seasonId;\n  int? teenageMode;\n  bool? isChargeableSeason;\n  bool? isStory;\n  bool? isUpowerExclusive;\n  bool? isUpowerPlay;\n  bool? isUpowerPreview;\n  int? enableVt;\n  String? vtDisplay;\n  bool? isUpowerExclusiveWithQa;\n  bool? noCache;\n  List<Part>? pages;\n  Subtitle? subtitle;\n  UgcSeason? ugcSeason;\n  bool? isSeasonDisplay;\n  UserGarb? userGarb;\n  String? likeIcon;\n  bool? needJumpBv;\n  bool? disableShowUpInfo;\n  int? isStoryPlay;\n  bool? isViewSelf;\n  List<Staff>? staff;\n  String? redirectUrl;\n  bool isPageReversed = false;\n\n  VideoDetailData({\n    this.bvid,\n    this.aid,\n    this.videos,\n    this.tid,\n    this.tidV2,\n    this.tname,\n    this.tnameV2,\n    this.copyright,\n    this.pic,\n    this.title,\n    this.pubdate,\n    this.ctime,\n    this.desc,\n    this.descV2,\n    this.state,\n    this.duration,\n    this.rights,\n    this.owner,\n    this.stat,\n    this.argueInfo,\n    this.dynam1c,\n    this.cid,\n    this.dimension,\n    this.seasonId,\n    this.teenageMode,\n    this.isChargeableSeason,\n    this.isStory,\n    this.isUpowerExclusive,\n    this.isUpowerPlay,\n    this.isUpowerPreview,\n    this.enableVt,\n    this.vtDisplay,\n    this.isUpowerExclusiveWithQa,\n    this.noCache,\n    this.pages,\n    this.subtitle,\n    this.ugcSeason,\n    this.isSeasonDisplay,\n    this.userGarb,\n    this.likeIcon,\n    this.needJumpBv,\n    this.disableShowUpInfo,\n    this.isStoryPlay,\n    this.isViewSelf,\n    this.staff,\n    this.redirectUrl,\n  });\n\n  factory VideoDetailData.fromJson(Map<String, dynamic> json) =>\n      VideoDetailData(\n        bvid: json['bvid'] as String?,\n        aid: json['aid'] as int?,\n        videos: json['videos'] as int?,\n        tid: json['tid'] as int?,\n        tidV2: json['tid_v2'] as int?,\n        tname: json['tname'] as String?,\n        tnameV2: json['tname_v2'] as String?,\n        copyright: json['copyright'] as int?,\n        pic: json['pic'] as String?,\n        title: json['title'] as String?,\n        pubdate: json['pubdate'] as int?,\n        ctime: json['ctime'] as int?,\n        desc: json['desc'] as String?,\n        descV2: (json['desc_v2'] as List<dynamic>?)\n            ?.map((e) => DescV2.fromJson(e as Map<String, dynamic>))\n            .toList(),\n        state: json['state'] as int?,\n        duration: json['duration'] as int?,\n        rights: json['rights'] == null\n            ? null\n            : Rights.fromJson(json['rights'] as Map<String, dynamic>),\n        owner: json['owner'] == null\n            ? null\n            : Owner.fromJson(json['owner'] as Map<String, dynamic>),\n        stat: json['stat'] == null\n            ? null\n            : VideoStat.fromJson(json['stat'] as Map<String, dynamic>),\n        argueInfo: json['argue_info'] == null\n            ? null\n            : ArgueInfo.fromJson(json['argue_info'] as Map<String, dynamic>),\n        dynam1c: json['dynamic'] as String?,\n        cid: json['cid'] as int?,\n        dimension: json['dimension'] == null\n            ? null\n            : Dimension.fromJson(json['dimension'] as Map<String, dynamic>),\n        seasonId: json['season_id'] as int?,\n        teenageMode: json['teenage_mode'] as int?,\n        isChargeableSeason: json['is_chargeable_season'] as bool?,\n        isStory: json['is_story'] as bool?,\n        isUpowerExclusive: json['is_upower_exclusive'] as bool?,\n        isUpowerPlay: json['is_upower_play'] as bool?,\n        isUpowerPreview: json['is_upower_preview'] as bool?,\n        enableVt: json['enable_vt'] as int?,\n        vtDisplay: json['vt_display'] as String?,\n        isUpowerExclusiveWithQa: json['is_upower_exclusive_with_qa'] as bool?,\n        noCache: json['no_cache'] as bool?,\n        pages: (json['pages'] as List<dynamic>?)\n            ?.map((e) => Part.fromJson(e as Map<String, dynamic>))\n            .toList(),\n        subtitle: json['subtitle'] == null\n            ? null\n            : Subtitle.fromJson(json['subtitle'] as Map<String, dynamic>),\n        ugcSeason: json['ugc_season'] == null\n            ? null\n            : UgcSeason.fromJson(json['ugc_season'] as Map<String, dynamic>),\n        isSeasonDisplay: json['is_season_display'] as bool?,\n        userGarb: json['user_garb'] == null\n            ? null\n            : UserGarb.fromJson(json['user_garb'] as Map<String, dynamic>),\n        likeIcon: json['like_icon'] as String?,\n        needJumpBv: json['need_jump_bv'] as bool?,\n        disableShowUpInfo: json['disable_show_up_info'] as bool?,\n        isStoryPlay: json['is_story_play'] as int?,\n        isViewSelf: json['is_view_self'] as bool?,\n        staff: (json[\"staff\"] as List?)\n            ?.map((item) => Staff.fromJson(item))\n            .toList(),\n        redirectUrl: noneNullOrEmptyString(json['redirect_url']),\n      );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_detail/desc_v2.dart",
    "content": "class DescV2 {\n  String? rawText;\n  int? type;\n  int? bizId;\n\n  DescV2({this.rawText, this.type, this.bizId});\n\n  factory DescV2.fromJson(Map<String, dynamic> json) => DescV2(\n    rawText: json['raw_text'] as String?,\n    type: json['type'] as int?,\n    bizId: json['biz_id'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_detail/dimension.dart",
    "content": "class Dimension {\n  int? width;\n  int? height;\n\n  bool? get cacheWidth {\n    if (width != null && height != null) {\n      return width! <= height!;\n    }\n    return null;\n  }\n\n  Dimension({this.width, this.height});\n\n  factory Dimension.fromJson(Map<String, dynamic> json) => Dimension(\n    width: json['width'] as int?,\n    height: json['height'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_detail/episode.dart",
    "content": "import 'package:PiliPlus/models_new/video/video_detail/arc.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/page.dart';\n\nclass BaseEpisodeItem {\n  int? id;\n  int? aid;\n  int? cid;\n  int? epId;\n  String? bvid;\n  String? badge;\n  String? title;\n  String? cover;\n\n  BaseEpisodeItem({\n    this.id,\n    this.aid,\n    this.cid,\n    this.epId,\n    this.bvid,\n    this.badge,\n    this.title,\n    this.cover,\n  });\n}\n\nclass EpisodeItem extends BaseEpisodeItem {\n  int? seasonId;\n  int? sectionId;\n  int? attribute;\n  Arc? arc;\n  Part? page;\n  List<Part>? pages;\n  @override\n  String? get cover => arc?.pic;\n\n  EpisodeItem({\n    this.seasonId,\n    this.sectionId,\n    super.id,\n    super.aid,\n    super.cid,\n    super.title,\n    this.attribute,\n    this.arc,\n    this.page,\n    super.bvid,\n    this.pages,\n    super.badge,\n  });\n\n  factory EpisodeItem.fromJson(Map<String, dynamic> json) => EpisodeItem(\n    seasonId: json['season_id'] as int?,\n    sectionId: json['section_id'] as int?,\n    id: json['id'] as int?,\n    aid: json['aid'] as int?,\n    cid: json['cid'] as int?,\n    title: json['title'] as String?,\n    attribute: json['attribute'] as int?,\n    arc: json['arc'] == null\n        ? null\n        : Arc.fromJson(json['arc'] as Map<String, dynamic>),\n    page: json['page'] == null\n        ? null\n        : Part.fromJson(json['page'] as Map<String, dynamic>),\n    bvid: json['bvid'] as String?,\n    pages: (json['pages'] as List<dynamic>?)\n        ?.map((e) => Part.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    badge: json['badge'],\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_detail/page.dart",
    "content": "import 'package:PiliPlus/models_new/video/video_detail/dimension.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/episode.dart';\n\nclass Part extends BaseEpisodeItem {\n  int? page;\n  String? from;\n  String? part;\n  int? duration;\n  String? vid;\n  Dimension? dimension;\n  int? ctime;\n  String? firstFrame;\n\n  Part({\n    super.cid,\n    this.page,\n    this.from,\n    this.part,\n    this.duration,\n    this.vid,\n    this.dimension,\n    this.ctime,\n    this.firstFrame,\n    super.badge,\n  });\n\n  factory Part.fromJson(Map<String, dynamic> json) => Part(\n    cid: json['cid'] as int?,\n    page: json['page'] as int?,\n    from: json['from'] as String?,\n    part: json['part'] as String?,\n    duration: json['duration'] as int?,\n    vid: json['vid'] as String?,\n    dimension: json['dimension'] == null\n        ? null\n        : Dimension.fromJson(json['dimension'] as Map<String, dynamic>),\n    ctime: json['ctime'] as int?,\n    firstFrame: json['first_frame'] as String?,\n    badge: json[\"badge\"],\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_detail/rights.dart",
    "content": "class Rights {\n  int? bp;\n  int? elec;\n  int? download;\n  int? movie;\n  int? pay;\n  int? hd5;\n  int? noReprint;\n  int? autoplay;\n  int? ugcPay;\n  int? isCooperation;\n  int? ugcPayPreview;\n  int? noBackground;\n  int? cleanMode;\n  int? isSteinGate;\n  int? is360;\n  int? noShare;\n  int? arcPay;\n  int? freeWatch;\n\n  Rights({\n    this.bp,\n    this.elec,\n    this.download,\n    this.movie,\n    this.pay,\n    this.hd5,\n    this.noReprint,\n    this.autoplay,\n    this.ugcPay,\n    this.isCooperation,\n    this.ugcPayPreview,\n    this.noBackground,\n    this.cleanMode,\n    this.isSteinGate,\n    this.is360,\n    this.noShare,\n    this.arcPay,\n    this.freeWatch,\n  });\n\n  factory Rights.fromJson(Map<String, dynamic> json) => Rights(\n    bp: json['bp'] as int?,\n    elec: json['elec'] as int?,\n    download: json['download'] as int?,\n    movie: json['movie'] as int?,\n    pay: json['pay'] as int?,\n    hd5: json['hd5'] as int?,\n    noReprint: json['no_reprint'] as int?,\n    autoplay: json['autoplay'] as int?,\n    ugcPay: json['ugc_pay'] as int?,\n    isCooperation: json['is_cooperation'] as int?,\n    ugcPayPreview: json['ugc_pay_preview'] as int?,\n    noBackground: json['no_background'] as int?,\n    cleanMode: json['clean_mode'] as int?,\n    isSteinGate: json['is_stein_gate'] as int?,\n    is360: json['is_360'] as int?,\n    noShare: json['no_share'] as int?,\n    arcPay: json['arc_pay'] as int?,\n    freeWatch: json['free_watch'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_detail/section.dart",
    "content": "import 'package:PiliPlus/models_new/video/video_detail/episode.dart';\n\nclass SectionItem {\n  int? seasonId;\n  int? id;\n  String? title;\n  int? type;\n  List<EpisodeItem>? episodes;\n  bool isReversed = false;\n\n  SectionItem({this.seasonId, this.id, this.title, this.type, this.episodes});\n\n  factory SectionItem.fromJson(Map<String, dynamic> json) => SectionItem(\n    seasonId: json['season_id'] as int?,\n    id: json['id'] as int?,\n    title: json['title'] as String?,\n    type: json['type'] as int?,\n    episodes: (json['episodes'] as List<dynamic>?)\n        ?.map((e) => EpisodeItem.fromJson(e as Map<String, dynamic>))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_detail/staff.dart",
    "content": "import 'package:PiliPlus/models/model_avatar.dart';\n\nclass Staff {\n  dynamic mid;\n  String? title;\n  String? name;\n  String? face;\n  Vip? vip;\n  BaseOfficialVerify? official;\n\n  Staff({\n    this.mid,\n    this.title,\n    this.name,\n    this.face,\n    this.vip,\n  });\n\n  Staff.fromJson(Map<String, dynamic> json) {\n    mid = json[\"mid\"];\n    title = json[\"title\"];\n    name = json[\"name\"];\n    face = json[\"face\"];\n    vip = json[\"vip\"] == null ? null : Vip.fromJson(json[\"vip\"]);\n    official = json['official'] == null\n        ? null\n        : BaseOfficialVerify.fromJson(json['official']);\n  }\n}\n"
  },
  {
    "path": "lib/models_new/video/video_detail/stat.dart",
    "content": "import 'package:PiliPlus/models_new/video/video_detail/stat_detail.dart';\n\nclass VideoStat extends StatDetail {\n  int? aid;\n  int? nowRank;\n  int? hisRank;\n  int? dislike;\n  String? evaluation;\n\n  VideoStat.fromJson(Map<String, dynamic> json) {\n    aid = json['aid'] as int?;\n    view = json['view'] as int?;\n    danmaku = json['danmaku'] as int?;\n    reply = json['reply'] as int?;\n    favorite = json['favorite'] as int? ?? 0;\n    coin = json['coin'] as num? ?? 0;\n    share = json['share'] as int?;\n    nowRank = json['now_rank'] as int?;\n    hisRank = json['his_rank'] as int?;\n    like = json['like'] as int? ?? 0;\n    dislike = json['dislike'] as int?;\n    evaluation = json['evaluation'] as String?;\n    vt = json['vt'] as int?;\n  }\n}\n"
  },
  {
    "path": "lib/models_new/video/video_detail/stat_detail.dart",
    "content": "abstract class StatDetail {\n  late num coin;\n  int? danmaku;\n  late int favorite;\n  late int like;\n  int? reply;\n  int? share;\n  int? view;\n  int? vt;\n}\n"
  },
  {
    "path": "lib/models_new/video/video_detail/subtitle.dart",
    "content": "class Subtitle {\n  bool? allowSubmit;\n  List<dynamic>? list;\n\n  Subtitle({this.allowSubmit, this.list});\n\n  factory Subtitle.fromJson(Map<String, dynamic> json) => Subtitle(\n    allowSubmit: json['allow_submit'] as bool?,\n    list: json['list'] as List<dynamic>?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_detail/ugc_season.dart",
    "content": "import 'package:PiliPlus/models_new/video/video_detail/section.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/stat.dart';\n\nclass UgcSeason {\n  int? id;\n  String? title;\n  String? cover;\n  int? mid;\n  String? intro;\n  int? signState;\n  int? attribute;\n  List<SectionItem>? sections;\n  VideoStat? stat;\n  int? epCount;\n  int? seasonType;\n  bool? isPaySeason;\n  int? enableVt;\n\n  UgcSeason({\n    this.id,\n    this.title,\n    this.cover,\n    this.mid,\n    this.intro,\n    this.signState,\n    this.attribute,\n    this.sections,\n    this.stat,\n    this.epCount,\n    this.seasonType,\n    this.isPaySeason,\n    this.enableVt,\n  });\n\n  factory UgcSeason.fromJson(Map<String, dynamic> json) => UgcSeason(\n    id: json['id'] as int?,\n    title: json['title'] as String?,\n    cover: json['cover'] as String?,\n    mid: json['mid'] as int?,\n    intro: json['intro'] as String?,\n    signState: json['sign_state'] as int?,\n    attribute: json['attribute'] as int?,\n    sections: (json['sections'] as List<dynamic>?)\n        ?.map((e) => SectionItem.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    stat: json['stat'] == null\n        ? null\n        : VideoStat.fromJson(json['stat'] as Map<String, dynamic>),\n    epCount: json['ep_count'] as int?,\n    seasonType: json['season_type'] as int?,\n    isPaySeason: json['is_pay_season'] as bool?,\n    enableVt: json['enable_vt'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_detail/user_garb.dart",
    "content": "class UserGarb {\n  String? urlImageAniCut;\n\n  UserGarb({this.urlImageAniCut});\n\n  factory UserGarb.fromJson(Map<String, dynamic> json) => UserGarb(\n    urlImageAniCut: json['url_image_ani_cut'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_detail/video_detail_response.dart",
    "content": "import 'package:PiliPlus/models_new/video/video_detail/data.dart';\n\nclass VideoDetailResponse {\n  int? code;\n  String? message;\n  int? ttl;\n  VideoDetailData? data;\n\n  VideoDetailResponse({this.code, this.message, this.ttl, this.data});\n\n  factory VideoDetailResponse.fromJson(Map<String, dynamic> json) {\n    return VideoDetailResponse(\n      code: json['code'] as int?,\n      message: json['message'] as String?,\n      ttl: json['ttl'] as int?,\n      data: json['data'] == null\n          ? null\n          : VideoDetailData.fromJson(json['data'] as Map<String, dynamic>),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/models_new/video/video_note_list/author.dart",
    "content": "import 'package:PiliPlus/models/model_avatar.dart';\n\nclass Author {\n  int? mid;\n  String? name;\n  String? face;\n  int? level;\n  int? isSeniorMember;\n  Vip? vipInfo;\n  Pendant? pendant;\n  BaseOfficialVerify? official;\n  int? follower;\n\n  Author({\n    this.mid,\n    this.name,\n    this.face,\n    this.level,\n    this.isSeniorMember,\n    this.vipInfo,\n    this.pendant,\n    this.official,\n    this.follower,\n  });\n\n  factory Author.fromJson(Map<String, dynamic> json) => Author(\n    mid: json['mid'] as int?,\n    name: json['name'] as String?,\n    face: json['face'] as String?,\n    level: json['level'] as int?,\n    isSeniorMember: json['is_senior_member'] as int?,\n    vipInfo: json['vip_info'] == null\n        ? null\n        : Vip.fromJson(json['vip_info'] as Map<String, dynamic>),\n    pendant: json['pendant'] == null\n        ? null\n        : Pendant.fromJson(json['pendant'] as Map<String, dynamic>),\n    official: json['official'] == null\n        ? null\n        : BaseOfficialVerify.fromJson(json['official'] as Map<String, dynamic>),\n    follower: json['follower'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_note_list/data.dart",
    "content": "import 'package:PiliPlus/models_new/video/video_note_list/list.dart';\nimport 'package:PiliPlus/models_new/video/video_note_list/page.dart';\n\nclass VideoNoteData {\n  List<VideoNoteItemModel>? list;\n  Page? page;\n  bool? showPublicNote;\n  String? message;\n\n  VideoNoteData({this.list, this.page, this.showPublicNote, this.message});\n\n  factory VideoNoteData.fromJson(Map<String, dynamic> json) => VideoNoteData(\n    list: (json['list'] as List<dynamic>?)\n        ?.map((e) => VideoNoteItemModel.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    page: json['page'] == null\n        ? null\n        : Page.fromJson(json['page'] as Map<String, dynamic>),\n    showPublicNote: json['show_public_note'] as bool?,\n    message: json['message'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_note_list/list.dart",
    "content": "import 'package:PiliPlus/models_new/video/video_note_list/author.dart';\n\nclass VideoNoteItemModel {\n  int? cvid;\n  String? title;\n  String? summary;\n  String? pubtime;\n  String? webUrl;\n  String? message;\n  Author? author;\n  int? likes;\n  bool? hasLike;\n\n  VideoNoteItemModel({\n    this.cvid,\n    this.title,\n    this.summary,\n    this.pubtime,\n    this.webUrl,\n    this.message,\n    this.author,\n    this.likes,\n    this.hasLike,\n  });\n\n  factory VideoNoteItemModel.fromJson(Map<String, dynamic> json) =>\n      VideoNoteItemModel(\n        cvid: json['cvid'] as int?,\n        title: json['title'] as String?,\n        summary: json['summary'] as String?,\n        pubtime: json['pubtime'] as String?,\n        webUrl: json['web_url'] as String?,\n        message: json['message'] as String?,\n        author: json['author'] == null\n            ? null\n            : Author.fromJson(json['author'] as Map<String, dynamic>),\n        likes: json['likes'] as int?,\n        hasLike: json['has_like'] as bool?,\n      );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_note_list/page.dart",
    "content": "class Page {\n  int? total;\n  int? size;\n  int? num;\n\n  Page({this.total, this.size, this.num});\n\n  factory Page.fromJson(Map<String, dynamic> json) => Page(\n    total: json['total'] as int?,\n    size: json['size'] as int?,\n    num: json['num'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_pbp/data.dart",
    "content": "class PbpData {\n  int? stepSec;\n  Events? events;\n\n  PbpData({\n    this.stepSec,\n    this.events,\n  });\n\n  factory PbpData.fromJson(Map<String, dynamic> json) => PbpData(\n    stepSec: json[\"step_sec\"],\n    events: json[\"events\"] == null ? null : Events.fromJson(json[\"events\"]),\n  );\n}\n\nclass Events {\n  List<double>? eDefault;\n\n  Events({\n    this.eDefault,\n  });\n\n  factory Events.fromJson(Map<String, dynamic> json) => Events(\n    eDefault: (json[\"default\"] as List?)\n        ?.map((e) => (e as num).toDouble())\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_play_info/data.dart",
    "content": "import 'package:PiliPlus/models_new/video/video_play_info/interaction.dart';\nimport 'package:PiliPlus/models_new/video/video_play_info/subtitle_info.dart';\nimport 'package:PiliPlus/models_new/video/video_play_info/view_point.dart';\n\nclass PlayInfoData {\n  int? lastPlayCid;\n  SubtitleInfo? subtitle;\n  List<ViewPoint>? viewPoints;\n  Interaction? interaction;\n\n  PlayInfoData({\n    this.lastPlayCid,\n    this.subtitle,\n    this.viewPoints,\n    this.interaction,\n  });\n\n  factory PlayInfoData.fromJson(Map<String, dynamic> json) => PlayInfoData(\n    lastPlayCid: json['last_play_cid'] as int?,\n    subtitle: json['subtitle'] == null\n        ? null\n        : SubtitleInfo.fromJson(json['subtitle'] as Map<String, dynamic>),\n    viewPoints: (json['view_points'] as List?)\n        ?.map((e) => ViewPoint.fromJson(e))\n        .toList(),\n    interaction: json[\"interaction\"] == null\n        ? null\n        : Interaction.fromJson(json[\"interaction\"]),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_play_info/interaction.dart",
    "content": "class Interaction {\n  HistoryNode? historyNode;\n  int? graphVersion;\n\n  Interaction({\n    this.historyNode,\n    this.graphVersion,\n  });\n\n  factory Interaction.fromJson(Map<String, dynamic> json) => Interaction(\n    historyNode: json[\"history_node\"] == null\n        ? null\n        : HistoryNode.fromJson(json[\"history_node\"]),\n    graphVersion: json[\"graph_version\"],\n  );\n}\n\nclass HistoryNode {\n  int? nodeId;\n  String? title;\n  int? cid;\n\n  HistoryNode({\n    this.nodeId,\n    this.title,\n    this.cid,\n  });\n\n  factory HistoryNode.fromJson(Map<String, dynamic> json) => HistoryNode(\n    nodeId: json[\"node_id\"],\n    title: json[\"title\"],\n    cid: json[\"cid\"],\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_play_info/subtitle.dart",
    "content": "class Subtitle {\n  late String lan;\n  String? lanDoc;\n  String? subtitleUrl;\n  String? subtitleUrlV2;\n  bool isAi = false;\n\n  Subtitle({\n    required this.lan,\n    this.lanDoc,\n  });\n\n  Subtitle.fromJson(Map<String, dynamic> json) {\n    lan = json[\"lan\"];\n    isAi = json[\"type\"] == 1;\n    lanDoc = '${json[\"lan_doc\"]}${isAi ? '（AI）' : ''}';\n    subtitleUrl = json[\"subtitle_url\"];\n    subtitleUrlV2 = json[\"subtitle_url_v2\"];\n  }\n}\n"
  },
  {
    "path": "lib/models_new/video/video_play_info/subtitle_info.dart",
    "content": "import 'package:PiliPlus/models_new/video/video_play_info/subtitle.dart';\n\nclass SubtitleInfo {\n  String? lan;\n  String? lanDoc;\n  List<Subtitle>? subtitles;\n\n  SubtitleInfo({this.lan, this.lanDoc, this.subtitles});\n\n  factory SubtitleInfo.fromJson(Map<String, dynamic> json) => SubtitleInfo(\n    lan: json['lan'] as String?,\n    lanDoc: json['lan_doc'] as String?,\n    subtitles:\n        (json['subtitles'] as List<dynamic>?)\n            ?.map((e) => Subtitle.fromJson(e as Map<String, dynamic>))\n            .toList()\n          ?..sort((a, b) {\n            final aHasZh = a.lan.contains('zh');\n            final bHasZh = b.lan.contains('zh');\n            if (aHasZh != bHasZh) return aHasZh ? -1 : 1;\n            if (a.isAi != b.isAi) return a.isAi ? 1 : -1;\n            return 0;\n          }),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_play_info/view_point.dart",
    "content": "class ViewPoint {\n  int? type;\n  int? from;\n  int? to;\n  String? content;\n  String? imgUrl;\n  String? logoUrl;\n  String? teamType;\n  String? teamName;\n\n  ViewPoint({\n    this.type,\n    this.from,\n    this.to,\n    this.content,\n    this.imgUrl,\n    this.logoUrl,\n    this.teamType,\n    this.teamName,\n  });\n\n  factory ViewPoint.fromJson(Map<String, dynamic> json) => ViewPoint(\n    type: json[\"type\"],\n    from: json[\"from\"],\n    to: json[\"to\"],\n    content: json[\"content\"],\n    imgUrl: json[\"imgUrl\"],\n    logoUrl: json[\"logoUrl\"],\n    teamType: json[\"team_type\"],\n    teamName: json[\"team_name\"],\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_relation/data.dart",
    "content": "class VideoRelation {\n  bool? attention;\n  bool? favorite;\n  bool? seasonFav;\n  bool? like;\n  bool? dislike;\n  num? coin;\n\n  VideoRelation({\n    this.attention,\n    this.favorite,\n    this.seasonFav,\n    this.like,\n    this.dislike,\n    this.coin,\n  });\n\n  factory VideoRelation.fromJson(Map<String, dynamic> json) => VideoRelation(\n    attention: json['attention'] as bool?,\n    favorite: json['favorite'] as bool?,\n    seasonFav: json['season_fav'] as bool?,\n    like: json['like'] as bool?,\n    dislike: json['dislike'] as bool?,\n    coin: json['coin'] as num?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_shot/data.dart",
    "content": "import 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:PiliPlus/utils/extension/string_ext.dart';\n\nclass VideoShotData {\n  String? pvdata;\n  int imgXLen;\n  int imgYLen;\n  double imgXSize;\n  double imgYSize;\n  late final int totalPerImage = imgXLen * imgYLen;\n  List<String> image;\n  List<int> index;\n\n  VideoShotData({\n    this.pvdata,\n    required this.imgXLen,\n    required this.imgYLen,\n    required this.imgXSize,\n    required this.imgYSize,\n    required this.image,\n    required this.index,\n  });\n\n  factory VideoShotData.fromJson(Map<String, dynamic> json) => VideoShotData(\n    pvdata: json[\"pvdata\"],\n    imgXLen: json[\"img_x_len\"],\n    imgYLen: json[\"img_y_len\"],\n    imgXSize: (json[\"img_x_size\"] as num).toDouble(),\n    imgYSize: (json[\"img_y_size\"] as num).toDouble(),\n    image: (json[\"image\"] as List)\n        .map((e) => (e as String).http2https)\n        .toList(),\n    index: (json[\"index\"] as List).fromCast(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_stein_edgeinfo/choice.dart",
    "content": "import 'package:PiliPlus/models_new/video/video_detail/episode.dart';\n\nclass Choice extends BaseEpisodeItem {\n  String? platformAction;\n  String? nativeAction;\n  String? condition;\n  String? option;\n  int? isDefault;\n\n  Choice({\n    super.id,\n    this.platformAction,\n    this.nativeAction,\n    this.condition,\n    super.cid,\n    this.option,\n    this.isDefault,\n  });\n\n  factory Choice.fromJson(Map<String, dynamic> json) => Choice(\n    id: json['id'] as int?,\n    platformAction: json['platform_action'] as String?,\n    nativeAction: json['native_action'] as String?,\n    condition: json['condition'] as String?,\n    cid: json['cid'] as int?,\n    option: json['option'] as String?,\n    isDefault: json['is_default'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_stein_edgeinfo/data.dart",
    "content": "import 'package:PiliPlus/models_new/video/video_stein_edgeinfo/edges.dart';\nimport 'package:PiliPlus/models_new/video/video_stein_edgeinfo/preload.dart';\nimport 'package:PiliPlus/models_new/video/video_stein_edgeinfo/story_list.dart';\n\nclass EdgeInfoData {\n  String? title;\n  int? edgeId;\n  List<StoryList>? storyList;\n  Edges? edges;\n  String? buvid;\n  Preload? preload;\n  int? isLeaf;\n\n  EdgeInfoData({\n    this.title,\n    this.edgeId,\n    this.storyList,\n    this.edges,\n    this.buvid,\n    this.preload,\n    this.isLeaf,\n  });\n\n  factory EdgeInfoData.fromJson(Map<String, dynamic> json) => EdgeInfoData(\n    title: json['title'] as String?,\n    edgeId: json['edge_id'] as int?,\n    storyList: (json['story_list'] as List<dynamic>?)\n        ?.map((e) => StoryList.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    edges: json['edges'] == null\n        ? null\n        : Edges.fromJson(json['edges'] as Map<String, dynamic>),\n    buvid: json['buvid'] as String?,\n    preload: json['preload'] == null\n        ? null\n        : Preload.fromJson(json['preload'] as Map<String, dynamic>),\n    isLeaf: json['is_leaf'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_stein_edgeinfo/edges.dart",
    "content": "import 'package:PiliPlus/models_new/video/video_detail/dimension.dart';\nimport 'package:PiliPlus/models_new/video/video_stein_edgeinfo/question.dart';\nimport 'package:PiliPlus/models_new/video/video_stein_edgeinfo/skin.dart';\n\nclass Edges {\n  Dimension? dimension;\n  List<Question>? questions;\n  Skin? skin;\n\n  Edges({this.dimension, this.questions, this.skin});\n\n  factory Edges.fromJson(Map<String, dynamic> json) => Edges(\n    dimension: json['dimension'] == null\n        ? null\n        : Dimension.fromJson(json['dimension'] as Map<String, dynamic>),\n    questions: (json['questions'] as List<dynamic>?)\n        ?.map((e) => Question.fromJson(e as Map<String, dynamic>))\n        .toList(),\n    skin: json['skin'] == null\n        ? null\n        : Skin.fromJson(json['skin'] as Map<String, dynamic>),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_stein_edgeinfo/preload.dart",
    "content": "import 'package:PiliPlus/models_new/video/video_stein_edgeinfo/video.dart';\n\nclass Preload {\n  List<Video>? video;\n\n  Preload({this.video});\n\n  factory Preload.fromJson(Map<String, dynamic> json) => Preload(\n    video: (json['video'] as List<dynamic>?)\n        ?.map((e) => Video.fromJson(e as Map<String, dynamic>))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_stein_edgeinfo/question.dart",
    "content": "import 'package:PiliPlus/models_new/video/video_stein_edgeinfo/choice.dart';\n\nclass Question {\n  int? id;\n  int? type;\n  int? startTimeR;\n  int? duration;\n  int? pauseVideo;\n  String? title;\n  List<Choice>? choices;\n\n  Question({\n    this.id,\n    this.type,\n    this.startTimeR,\n    this.duration,\n    this.pauseVideo,\n    this.title,\n    this.choices,\n  });\n\n  factory Question.fromJson(Map<String, dynamic> json) => Question(\n    id: json['id'] as int?,\n    type: json['type'] as int?,\n    startTimeR: json['start_time_r'] as int?,\n    duration: json['duration'] as int?,\n    pauseVideo: json['pause_video'] as int?,\n    title: json['title'] as String?,\n    choices: (json['choices'] as List<dynamic>?)\n        ?.map((e) => Choice.fromJson(e as Map<String, dynamic>))\n        .toList(),\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_stein_edgeinfo/skin.dart",
    "content": "class Skin {\n  String? choiceImage;\n  String? titleTextColor;\n  String? titleShadowColor;\n  int? titleShadowOffsetY;\n  int? titleShadowRadius;\n  String? progressbarColor;\n  String? progressbarShadowColor;\n\n  Skin({\n    this.choiceImage,\n    this.titleTextColor,\n    this.titleShadowColor,\n    this.titleShadowOffsetY,\n    this.titleShadowRadius,\n    this.progressbarColor,\n    this.progressbarShadowColor,\n  });\n\n  factory Skin.fromJson(Map<String, dynamic> json) => Skin(\n    choiceImage: json['choice_image'] as String?,\n    titleTextColor: json['title_text_color'] as String?,\n    titleShadowColor: json['title_shadow_color'] as String?,\n    titleShadowOffsetY: json['title_shadow_offset_y'] as int?,\n    titleShadowRadius: json['title_shadow_radius'] as int?,\n    progressbarColor: json['progressbar_color'] as String?,\n    progressbarShadowColor: json['progressbar_shadow_color'] as String?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_stein_edgeinfo/story_list.dart",
    "content": "class StoryList {\n  int? nodeId;\n  int? edgeId;\n  String? title;\n  int? cid;\n  int? startPos;\n  String? cover;\n  int? isCurrent;\n  int? cursor;\n\n  StoryList({\n    this.nodeId,\n    this.edgeId,\n    this.title,\n    this.cid,\n    this.startPos,\n    this.cover,\n    this.isCurrent,\n    this.cursor,\n  });\n\n  factory StoryList.fromJson(Map<String, dynamic> json) => StoryList(\n    nodeId: json['node_id'] as int?,\n    edgeId: json['edge_id'] as int?,\n    title: json['title'] as String?,\n    cid: json['cid'] as int?,\n    startPos: json['start_pos'] as int?,\n    cover: json['cover'] as String?,\n    isCurrent: json['is_current'] as int?,\n    cursor: json['cursor'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_stein_edgeinfo/video.dart",
    "content": "class Video {\n  int? aid;\n  int? cid;\n\n  Video({this.aid, this.cid});\n\n  factory Video.fromJson(Map<String, dynamic> json) => Video(\n    aid: json['aid'] as int?,\n    cid: json['cid'] as int?,\n  );\n}\n"
  },
  {
    "path": "lib/models_new/video/video_tag/data.dart",
    "content": "class VideoTagItem {\n  int? tagId;\n  String? tagName;\n  String? tagType;\n  String? musicId;\n  String? jumpUrl;\n\n  VideoTagItem({\n    this.tagId,\n    this.tagName,\n    this.tagType,\n    this.musicId,\n    this.jumpUrl,\n  });\n\n  factory VideoTagItem.fromJson(Map<String, dynamic> json) => VideoTagItem(\n    tagId: json[\"tag_id\"],\n    tagName: json[\"tag_name\"],\n    tagType: json[\"tag_type\"],\n    musicId: json[\"music_id\"],\n    jumpUrl: json[\"jump_url\"],\n  );\n}\n"
  },
  {
    "path": "lib/pages/about/view.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:PiliPlus/build_config.dart';\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/common/widgets/dialog/export_import.dart';\nimport 'package:PiliPlus/common/widgets/flutter/list_tile.dart';\nimport 'package:PiliPlus/pages/mine/controller.dart';\nimport 'package:PiliPlus/services/logger.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/accounts/account.dart';\nimport 'package:PiliPlus/utils/cache_manager.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/extension/context_ext.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/login_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/update.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart' hide ListTile;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\n\nclass AboutPage extends StatefulWidget {\n  const AboutPage({super.key, this.showAppBar = true});\n\n  final bool showAppBar;\n\n  @override\n  State<AboutPage> createState() => _AboutPageState();\n}\n\nclass _AboutPageState extends State<AboutPage> {\n  final currentVersion =\n      '${BuildConfig.versionName}+${BuildConfig.versionCode}';\n  RxString cacheSize = ''.obs;\n\n  late int _pressCount = 0;\n\n  @override\n  void initState() {\n    super.initState();\n    getCacheSize();\n  }\n\n  @override\n  void dispose() {\n    cacheSize.close();\n    super.dispose();\n  }\n\n  void getCacheSize() {\n    CacheManager.loadApplicationCache().then((res) {\n      if (mounted) {\n        cacheSize.value = CacheManager.formatSize(res);\n      }\n    });\n  }\n\n  void _showDialog() => showDialog(\n    context: context,\n    builder: (context) => AlertDialog(\n      constraints: StyleString.dialogFixedConstraints,\n      content: TextField(\n        autofocus: true,\n        onSubmitted: (value) {\n          Get.back();\n          if (value.isNotEmpty) {\n            PageUtils.handleWebview(value, inApp: true);\n          }\n        },\n      ),\n    ),\n  );\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    const style = TextStyle(fontSize: 15);\n    final outline = theme.colorScheme.outline;\n    final subTitleStyle = TextStyle(fontSize: 13, color: outline);\n    final showAppBar = widget.showAppBar;\n    final padding = MediaQuery.viewPaddingOf(context);\n    return Scaffold(\n      appBar: showAppBar ? AppBar(title: const Text('关于')) : null,\n      resizeToAvoidBottomInset: false,\n      body: ListView(\n        padding: EdgeInsets.only(\n          left: showAppBar ? padding.left : 0,\n          right: showAppBar ? padding.right : 0,\n          bottom: padding.bottom + 100,\n        ),\n        children: [\n          GestureDetector(\n            onTap: () {\n              if (++_pressCount == 5) {\n                _pressCount = 0;\n                _showDialog();\n              }\n            },\n            onSecondaryTap: PlatformUtils.isDesktop ? _showDialog : null,\n            child: Image.asset(\n              width: 150,\n              height: 150,\n              excludeFromSemantics: true,\n              cacheWidth: 150.cacheSize(context),\n              'assets/images/logo/logo.png',\n            ),\n          ),\n          ListTile(\n            title: Text(\n              Constants.appName,\n              textAlign: TextAlign.center,\n              style: theme.textTheme.titleMedium!.copyWith(height: 2),\n            ),\n            subtitle: Row(\n              mainAxisAlignment: MainAxisAlignment.center,\n              children: [\n                Text(\n                  '使用Flutter开发的B站第三方客户端',\n                  style: TextStyle(color: outline),\n                  semanticsLabel: '与你一起，发现不一样的世界',\n                ),\n                const Icon(\n                  Icons.accessibility_new,\n                  semanticLabel: \"无障碍适配\",\n                  size: 18,\n                ),\n              ],\n            ),\n          ),\n          ListTile(\n            onTap: () => Update.checkUpdate(false),\n            onLongPress: () => Utils.copyText(currentVersion),\n            onSecondaryTap: PlatformUtils.isMobile\n                ? null\n                : () => Utils.copyText(currentVersion),\n            title: const Text('当前版本'),\n            leading: const Icon(Icons.commit_outlined),\n            trailing: Text(\n              currentVersion,\n              style: subTitleStyle,\n            ),\n          ),\n          ListTile(\n            title: Text(\n              '''\nBuild Time: ${DateFormatUtils.format(BuildConfig.buildTime, format: DateFormatUtils.longFormatDs)}\nCommit Hash: ${BuildConfig.commitHash}''',\n              style: const TextStyle(fontSize: 14),\n            ),\n            leading: const Icon(Icons.info_outline),\n            onTap: () => PageUtils.launchURL(\n              '${Constants.sourceCodeUrl}/commit/${BuildConfig.commitHash}',\n            ),\n            onLongPress: () => Utils.copyText(BuildConfig.commitHash),\n            onSecondaryTap: PlatformUtils.isMobile\n                ? null\n                : () => Utils.copyText(BuildConfig.commitHash),\n          ),\n          Divider(\n            thickness: 1,\n            height: 30,\n            color: theme.colorScheme.outlineVariant,\n          ),\n          ListTile(\n            onTap: () => PageUtils.launchURL(Constants.sourceCodeUrl),\n            leading: const Icon(Icons.code),\n            title: const Text('Source Code'),\n            subtitle: Text(Constants.sourceCodeUrl, style: subTitleStyle),\n          ),\n          if (Platform.isAndroid)\n            ListTile(\n              onTap: () => Utils.channel.invokeMethod('linkVerifySettings'),\n              leading: const Icon(MdiIcons.linkBoxOutline),\n              title: const Text('打开受支持的链接'),\n              trailing: Icon(\n                Icons.arrow_forward,\n                size: 16,\n                color: outline,\n              ),\n            ),\n          ListTile(\n            onTap: () =>\n                PageUtils.launchURL('${Constants.sourceCodeUrl}/issues'),\n            leading: const Icon(Icons.feedback_outlined),\n            title: const Text('问题反馈'),\n            trailing: Icon(\n              Icons.arrow_forward,\n              size: 16,\n              color: outline,\n            ),\n          ),\n          ListTile(\n            onTap: () => Get.toNamed('/logs'),\n            onLongPress: LoggerUtils.clearLogs,\n            onSecondaryTap: PlatformUtils.isMobile\n                ? null\n                : LoggerUtils.clearLogs,\n            leading: const Icon(Icons.bug_report_outlined),\n            title: const Text('错误日志'),\n            subtitle: Text('长按清除日志', style: subTitleStyle),\n            trailing: Icon(Icons.arrow_forward, size: 16, color: outline),\n          ),\n          ListTile(\n            onTap: () {\n              if (cacheSize.value.isNotEmpty) {\n                showConfirmDialog(\n                  context: context,\n                  title: '提示',\n                  content: '该操作将清除图片及网络请求缓存数据，确认清除？',\n                  onConfirm: () async {\n                    SmartDialog.showLoading(msg: '正在清除...');\n                    try {\n                      await CacheManager.clearLibraryCache();\n                      SmartDialog.showToast('清除成功');\n                    } catch (err) {\n                      SmartDialog.showToast(err.toString());\n                    } finally {\n                      SmartDialog.dismiss();\n                    }\n                    getCacheSize();\n                  },\n                );\n              }\n            },\n            leading: const Icon(Icons.delete_outline),\n            title: const Text('清除缓存'),\n            subtitle: Obx(\n              () => Text(\n                '图片及网络缓存 ${cacheSize.value}',\n                style: subTitleStyle,\n              ),\n            ),\n          ),\n          ListTile(\n            title: const Text('导入/导出登录信息'),\n            leading: const Icon(Icons.import_export_outlined),\n            onTap: () => showImportExportDialog<Map>(\n              context,\n              title: '登录信息',\n              localFileName: () => 'account',\n              onExport: () =>\n                  Utils.jsonEncoder.convert(Accounts.account.toMap()),\n              onImport: (json) async {\n                final res = json.map(\n                  (key, value) => MapEntry(key, LoginAccount.fromJson(value)),\n                );\n                await Accounts.account.putAll(res);\n                await Accounts.refresh();\n                MineController.anonymity.value = !Accounts.heartbeat.isLogin;\n                if (Accounts.main.isLogin) {\n                  await LoginUtils.onLoginMain();\n                }\n              },\n            ),\n          ),\n          ListTile(\n            title: const Text('导入/导出设置'),\n            dense: false,\n            leading: const Icon(Icons.import_export_outlined),\n            onTap: () => showImportExportDialog<Map<String, dynamic>>(\n              context,\n              title: '设置',\n              localFileName: () => 'setting_${context.platformName}',\n              onExport: GStorage.exportAllSettings,\n              onImport: GStorage.importAllJsonSettings,\n            ),\n          ),\n          ListTile(\n            title: const Text('重置所有设置'),\n            leading: const Icon(Icons.settings_backup_restore_outlined),\n            onTap: () => showDialog(\n              context: context,\n              builder: (context) {\n                return SimpleDialog(\n                  clipBehavior: Clip.hardEdge,\n                  title: const Text('是否重置所有设置？'),\n                  children: [\n                    ListTile(\n                      dense: true,\n                      onTap: () async {\n                        Get.back();\n                        await Future.wait([\n                          GStorage.setting.clear(),\n                          GStorage.video.clear(),\n                        ]);\n                        SmartDialog.showToast('重置成功');\n                      },\n                      title: const Text('重置可导出的设置', style: style),\n                    ),\n                    ListTile(\n                      dense: true,\n                      onTap: () async {\n                        Get.back();\n                        await GStorage.clear();\n                        SmartDialog.showToast('重置成功');\n                      },\n                      title: const Text('重置所有数据（含登录信息）', style: style),\n                    ),\n                  ],\n                );\n              },\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/article/controller.dart",
    "content": "import 'package:PiliPlus/http/dynamics.dart';\nimport 'package:PiliPlus/http/fav.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/video.dart';\nimport 'package:PiliPlus/models/dynamics/article_content_model.dart'\n    show ArticleContentModel;\nimport 'package:PiliPlus/models/dynamics/result.dart';\nimport 'package:PiliPlus/models/model_avatar.dart';\nimport 'package:PiliPlus/models_new/article/article_view/data.dart';\nimport 'package:PiliPlus/pages/common/dyn/common_dyn_controller.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/app_scheme.dart';\nimport 'package:PiliPlus/utils/extension/get_ext.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/url_utils.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass ArticleController extends CommonDynController {\n  late String id;\n  late String type;\n\n  late String url;\n  late int commentId;\n  @override\n  int get oid => commentId;\n  late int commentType;\n  @override\n  int get replyType => commentType;\n  final summary = Summary();\n\n  late final RxInt topIndex = 0.obs;\n\n  @override\n  dynamic get sourceId => commentType == 12 ? 'cv$commentId' : id;\n\n  final RxBool isLoaded = false.obs;\n  DynamicItemModel? opusData; // 标题信息从summary获取, 动态没有favorite\n  ArticleViewData? articleData;\n  final Rx<ModuleStatModel?> stats = Rx<ModuleStatModel?>(null);\n\n  List<ArticleContentModel>? get opus =>\n      opusData?.modules.moduleContent ?? articleData?.opus?.content;\n\n  @override\n  void onInit() {\n    super.onInit();\n    final params = Get.parameters;\n    id = params['id']!;\n    type = params['type']!;\n\n    // to opus\n    if (type == 'read') {\n      UrlUtils.parseRedirectUrl('https://www.bilibili.com/read/cv$id/').then((\n        url,\n      ) {\n        if (url != null) {\n          final opusId = PiliScheme.uriDigitRegExp.firstMatch(url)?.group(1);\n          if (opusId != null) {\n            id = opusId;\n            type = 'opus';\n          }\n          Get.putOrFind(() => this, tag: type + id);\n        }\n        init();\n      });\n    } else {\n      init();\n    }\n  }\n\n  void init() {\n    url = type == 'read'\n        ? 'https://www.bilibili.com/read/cv$id'\n        : 'https://www.bilibili.com/opus/$id';\n    commentType = type == 'picture' ? 11 : 12;\n\n    _queryContent();\n  }\n\n  Future<bool> queryOpus(String opusId) async {\n    final res = await DynamicsHttp.opusDetail(opusId: opusId);\n    if (res case Success(:final response)) {\n      //fallback\n      if (response.fallback?.id != null) {\n        id = response.fallback!.id!;\n        type = 'read';\n        init();\n        return false;\n      }\n      opusData = response;\n      commentType = response.basic!.commentType!;\n      commentId = int.parse(response.basic!.commentIdStr!);\n      if (showDynActionBar) {\n        if (response.modules.moduleStat != null) {\n          stats.value = response.modules.moduleStat;\n        } else {\n          getArticleInfo();\n        }\n      }\n      summary\n        ..author ??= response.modules.moduleAuthor\n        ..title ??= response.modules.moduleTag?.text;\n      return true;\n    } else {\n      loadingState.value = res as Error;\n      return false;\n    }\n  }\n\n  Future<bool> queryRead(int cvid) async {\n    final res = await DynamicsHttp.articleView(cvId: cvid);\n    if (res case Success(:final response)) {\n      articleData = response;\n      summary\n        ..author ??= response.author\n        ..title ??= response.title\n        ..cover ??= response.originImageUrls?.firstOrNull;\n\n      if (showDynActionBar) {\n        getArticleInfo();\n      }\n      return true;\n    } else {\n      loadingState.value = res as Error;\n      return false;\n    }\n  }\n\n  // stats\n  Future<bool> getArticleInfo([bool isGetCover = false]) async {\n    final res = await DynamicsHttp.articleInfo(cvId: commentId);\n    if (res case Success(:final response)) {\n      summary\n        ..cover ??= response.originImageUrls?.firstOrNull\n        ..title ??= response.title;\n\n      stats.value ??= ModuleStatModel(\n        comment: DynamicStat(count: response.stats?.reply),\n        forward: DynamicStat(count: response.stats?.share),\n        like: DynamicStat(\n          count: response.stats?.like,\n          status: response.stats?.like == 1,\n        ),\n        favorite: DynamicStat(\n          count: response.stats?.favorite,\n          status: response.favorite,\n        ),\n      );\n      return true;\n    }\n    if (isGetCover) {\n      res.toast();\n    }\n    return false;\n  }\n\n  // 请求动态内容\n  Future<void> _queryContent() async {\n    if (type != 'read') {\n      isLoaded.value = await queryOpus(id);\n    } else {\n      commentId = int.parse(id);\n      commentType = 12;\n      isLoaded.value = await queryRead(commentId);\n    }\n    if (isLoaded.value) {\n      queryData();\n      if (Accounts.heartbeat.isLogin && !Pref.historyPause) {\n        VideoHttp.historyReport(aid: commentId, type: 5);\n      }\n    }\n  }\n\n  Future<void> onFav() async {\n    final favorite = stats.value?.favorite;\n    bool isFav = favorite?.status == true;\n    final res = type == 'read'\n        ? isFav\n              ? await FavHttp.delFavArticle(id: commentId)\n              : await FavHttp.addFavArticle(id: commentId)\n        : await FavHttp.communityAction(opusId: id, action: isFav ? 4 : 3);\n    if (res.isSuccess) {\n      favorite?.status = !isFav;\n      if (isFav) {\n        favorite?.count--;\n      } else {\n        favorite?.count++;\n      }\n      stats.refresh();\n      SmartDialog.showToast('${isFav ? '取消' : ''}收藏成功');\n    } else {\n      res.toast();\n    }\n  }\n\n  Future<void> onLike() async {\n    final like = stats.value?.like;\n    bool isLike = like?.status == true;\n    final res = await DynamicsHttp.thumbDynamic(\n      dynamicId: opusData?.idStr ?? articleData?.dynIdStr,\n      up: isLike ? 2 : 1,\n    );\n    if (res.isSuccess) {\n      like?.status = !isLike;\n      if (isLike) {\n        like?.count--;\n      } else {\n        like?.count++;\n      }\n      stats.refresh();\n      SmartDialog.showToast(!isLike ? '点赞成功' : '取消赞');\n    } else {\n      res.toast();\n    }\n  }\n\n  @override\n  Future<void> onReload() {\n    if (!isLoaded.value) {\n      return Future.syncValue(null);\n    }\n    return super.onReload();\n  }\n}\n\nclass Summary {\n  Avatar? author;\n  String? title;\n  String? cover;\n\n  Summary({this.author, this.title, this.cover});\n}\n"
  },
  {
    "path": "lib/pages/article/view.dart",
    "content": "import 'dart:math';\n\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/custom_icon.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models/common/image_preview_type.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models/dynamics/result.dart' show DynamicStat;\nimport 'package:PiliPlus/pages/article/controller.dart';\nimport 'package:PiliPlus/pages/article/widgets/article_ops.dart';\nimport 'package:PiliPlus/pages/article/widgets/html_render.dart';\nimport 'package:PiliPlus/pages/article/widgets/opus_content.dart';\nimport 'package:PiliPlus/pages/common/dyn/common_dyn_page.dart';\nimport 'package:PiliPlus/pages/dynamics_repost/view.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/extension/get_ext.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:PiliPlus/utils/image_utils.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:cached_network_image/cached_network_image.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:font_awesome_flutter/font_awesome_flutter.dart';\nimport 'package:get/get.dart';\nimport 'package:html/parser.dart' as parser;\n\nclass ArticlePage extends StatefulWidget {\n  const ArticlePage({super.key});\n\n  @override\n  State<ArticlePage> createState() => _ArticlePageState();\n}\n\nclass _ArticlePageState extends CommonDynPageState<ArticlePage> {\n  @override\n  final ArticleController controller = Get.putOrFind(\n    ArticleController.new,\n    tag: Get.parameters['type']! + Get.parameters['id']!,\n  );\n\n  @override\n  dynamic get arguments => {\n    'id': controller.id,\n  };\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    WidgetsBinding.instance.addPostFrameCallback((_) {\n      if (scrollController.hasClients) {\n        controller.showTitle.value =\n            scrollController.positions.last.pixels >= 45;\n      }\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: _buildAppBar(),\n      body: Padding(\n        padding: EdgeInsets.only(left: padding.left, right: padding.right),\n        child: _buildPage(theme),\n      ),\n      floatingActionButtonLocation: floatingActionButtonLocation,\n      floatingActionButton: SlideTransition(\n        position: fabAnimation,\n        child: _buildBottom(theme),\n      ),\n    );\n  }\n\n  Widget _buildPage(ThemeData theme) {\n    double padding = max(maxWidth / 2 - Grid.smallCardWidth, 0);\n    if (isPortrait) {\n      return Padding(\n        padding: EdgeInsets.symmetric(horizontal: padding),\n        child: CustomScrollView(\n          controller: scrollController,\n          physics: const AlwaysScrollableScrollPhysics(),\n          slivers: [\n            _buildContent(\n              theme,\n              maxWidth - this.padding.horizontal - 2 * padding - 24,\n            ),\n            SliverToBoxAdapter(\n              child: Divider(\n                thickness: 8,\n                color: theme.dividerColor.withValues(alpha: 0.05),\n              ),\n            ),\n            buildReplyHeader(theme),\n            Obx(() => replyList(theme, controller.loadingState.value)),\n          ],\n        ),\n      );\n    }\n\n    padding = padding / 4;\n    final flex = controller.ratio[0].toInt();\n    final flex1 = controller.ratio[1].toInt();\n    return Row(\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        Expanded(\n          flex: flex,\n          child: CustomScrollView(\n            controller: scrollController,\n            physics: const AlwaysScrollableScrollPhysics(),\n            slivers: [\n              SliverPadding(\n                padding: EdgeInsets.only(\n                  left: padding,\n                  bottom: this.padding.bottom + 100,\n                ),\n                sliver: _buildContent(\n                  theme,\n                  (maxWidth - this.padding.horizontal) * flex / (flex + flex1) -\n                      padding -\n                      32,\n                ),\n              ),\n            ],\n          ),\n        ),\n        VerticalDivider(\n          thickness: 8,\n          color: theme.dividerColor.withValues(alpha: 0.05),\n        ),\n        Expanded(\n          flex: flex1,\n          child: Padding(\n            padding: EdgeInsets.only(right: padding),\n            child: Scaffold(\n              backgroundColor: Colors.transparent,\n              resizeToAvoidBottomInset: false,\n              body: refreshIndicator(\n                onRefresh: controller.onRefresh,\n                child: CustomScrollView(\n                  controller: scrollController,\n                  physics: const AlwaysScrollableScrollPhysics(),\n                  slivers: [\n                    buildReplyHeader(theme),\n                    Obx(() => replyList(theme, controller.loadingState.value)),\n                  ],\n                ),\n              ),\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n\n  Widget _buildContent(ThemeData theme, double maxWidth) => SliverPadding(\n    padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),\n    sliver: Obx(\n      () {\n        if (controller.isLoaded.value) {\n          late Widget content;\n          if (controller.opus != null) {\n            // if (kDebugMode) debugPrint('json page');\n            content = OpusContent(\n              opus: controller.opus!,\n              maxWidth: maxWidth,\n            );\n          } else if (controller.opusData?.modules.moduleBlocked != null) {\n            // if (kDebugMode) debugPrint('moduleBlocked');\n            final moduleBlocked = controller.opusData!.modules.moduleBlocked!;\n            content = SliverToBoxAdapter(\n              child: moduleBlockedItem(context, theme, moduleBlocked),\n            );\n          } else if (controller.articleData?.content != null) {\n            if (controller.articleData?.type == 3) {\n              // json\n              return ArticleOpus(\n                ops: controller.articleData?.ops,\n                maxWidth: maxWidth,\n              );\n            }\n            // if (kDebugMode) debugPrint('html page');\n            final res = parser.parse(controller.articleData!.content!);\n            if (res.body!.children.isEmpty) {\n              content = SliverToBoxAdapter(\n                child: htmlRender(\n                  context: context,\n                  html: controller.articleData!.content!,\n                  maxWidth: maxWidth,\n                ),\n              );\n            } else {\n              content = SliverList.separated(\n                itemCount: res.body!.children.length,\n                itemBuilder: (context, index) {\n                  return htmlRender(\n                    context: context,\n                    element: res.body!.children[index],\n                    maxWidth: maxWidth,\n                  );\n                },\n                separatorBuilder: (context, index) =>\n                    const SizedBox(height: 10),\n              );\n            }\n          } else {\n            content = const SliverToBoxAdapter(child: Text('NULL'));\n          }\n\n          int? pubTime =\n              controller.opusData?.modules.moduleAuthor?.pubTs ??\n              controller.articleData?.publishTime;\n          return SliverMainAxisGroup(\n            slivers: [\n              if (controller.type != 'read' &&\n                  controller\n                          .opusData\n                          ?.modules\n                          .moduleTop\n                          ?.display\n                          ?.album\n                          ?.pics\n                          ?.isNotEmpty ==\n                      true)\n                SliverToBoxAdapter(\n                  child: Builder(\n                    builder: (context) {\n                      final pics = controller\n                          .opusData!\n                          .modules\n                          .moduleTop!\n                          .display!\n                          .album!\n                          .pics!;\n                      final length = pics.length;\n                      final first = pics.first;\n                      double height;\n                      if (first.height != null && first.width != null) {\n                        final ratio = first.height! / first.width!;\n                        height = min(maxWidth * ratio, maxHeight * 0.55);\n                      } else {\n                        height = maxHeight * 0.55;\n                      }\n                      return Stack(\n                        clipBehavior: Clip.none,\n                        children: [\n                          Container(\n                            height: height,\n                            width: maxWidth,\n                            margin: const EdgeInsets.only(bottom: 10),\n                            child: PageView.builder(\n                              physics: clampingScrollPhysics,\n                              onPageChanged: (value) =>\n                                  controller.topIndex.value = value,\n                              itemCount: length,\n                              itemBuilder: (context, index) {\n                                final pic = pics[index];\n                                int? memCacheWidth, memCacheHeight;\n                                if (pic.isLongPic ?? false) {\n                                  memCacheWidth = maxWidth.cacheSize(context);\n                                } else if (pic.width != null &&\n                                    pic.height != null) {\n                                  if (pic.width! > pic.height!) {\n                                    memCacheWidth = maxWidth.cacheSize(context);\n                                  } else {\n                                    memCacheHeight = height.cacheSize(context);\n                                  }\n                                }\n                                return GestureDetector(\n                                  behavior: HitTestBehavior.opaque,\n                                  onTap: () => PageUtils.imageView(\n                                    quality: 60,\n                                    imgList: pics\n                                        .map((e) => SourceModel(url: e.url!))\n                                        .toList(),\n                                    initialPage: index,\n                                  ),\n                                  child: Hero(\n                                    tag: pic.url!,\n                                    child: Stack(\n                                      clipBehavior: Clip.none,\n                                      alignment: Alignment.center,\n                                      children: [\n                                        CachedNetworkImage(\n                                          height: height,\n                                          width: maxWidth,\n                                          memCacheWidth: memCacheWidth,\n                                          memCacheHeight: memCacheHeight,\n                                          fit: pic.isLongPic == true\n                                              ? BoxFit.cover\n                                              : null,\n                                          imageUrl: ImageUtils.thumbnailUrl(\n                                            pic.url,\n                                            60,\n                                          ),\n                                          fadeInDuration: const Duration(\n                                            milliseconds: 120,\n                                          ),\n                                          fadeOutDuration: const Duration(\n                                            milliseconds: 120,\n                                          ),\n                                          placeholder: (_, _) =>\n                                              const SizedBox.shrink(),\n                                        ),\n                                        if (pic.isLongPic == true)\n                                          const PBadge(\n                                            right: 12,\n                                            bottom: 12,\n                                            text: '长图',\n                                            type: .primary,\n                                          ),\n                                      ],\n                                    ),\n                                  ),\n                                );\n                              },\n                            ),\n                          ),\n                          Obx(\n                            () => PBadge(\n                              top: 12,\n                              right: 12,\n                              type: PBadgeType.gray,\n                              text: '${controller.topIndex.value + 1}/$length',\n                            ),\n                          ),\n                        ],\n                      );\n                    },\n                  ),\n                ),\n              if (controller.summary.title != null)\n                SliverToBoxAdapter(\n                  child: Text(\n                    controller.summary.title!,\n                    style: const TextStyle(\n                      fontSize: 17,\n                      fontWeight: FontWeight.bold,\n                    ),\n                  ),\n                ),\n              SliverToBoxAdapter(\n                child: Padding(\n                  padding: const EdgeInsets.symmetric(vertical: 10),\n                  child: GestureDetector(\n                    onTap: () => Get.toNamed(\n                      '/member?mid=${controller.summary.author?.mid}',\n                    ),\n                    child: Row(\n                      children: [\n                        NetworkImgLayer(\n                          width: 40,\n                          height: 40,\n                          type: ImageType.avatar,\n                          src: controller.summary.author?.face,\n                        ),\n                        const SizedBox(width: 10),\n                        Flexible(\n                          child: Column(\n                            crossAxisAlignment: CrossAxisAlignment.start,\n                            children: [\n                              Text(\n                                controller.summary.author?.name ?? '',\n                                style: TextStyle(\n                                  fontSize:\n                                      theme.textTheme.titleSmall!.fontSize,\n                                ),\n                              ),\n                              if (pubTime != null)\n                                Text(\n                                  DateFormatUtils.format(pubTime),\n                                  style: TextStyle(\n                                    color: theme.colorScheme.outline,\n                                    fontSize:\n                                        theme.textTheme.labelSmall!.fontSize,\n                                  ),\n                                ),\n                            ],\n                          ),\n                        ),\n                      ],\n                    ),\n                  ),\n                ),\n              ),\n              if (controller.type != 'read' &&\n                  controller.opusData?.modules.moduleCollection != null)\n                SliverToBoxAdapter(\n                  child: opusCollection(\n                    theme,\n                    controller.opusData!.modules.moduleCollection!,\n                  ),\n                ),\n              content,\n            ],\n          );\n        }\n\n        return const SliverToBoxAdapter();\n      },\n    ),\n  );\n\n  PreferredSizeWidget _buildAppBar() => AppBar(\n    title: Obx(() {\n      if (controller.isLoaded.value && controller.showTitle.value) {\n        return Text(controller.summary.title ?? '');\n      }\n      return const SizedBox.shrink();\n    }),\n    actions: [\n      const SizedBox(width: 4),\n      if (!isPortrait) ratioWidget(maxWidth),\n      IconButton(\n        tooltip: '浏览器打开',\n        onPressed: () => PageUtils.inAppWebview(controller.url),\n        icon: const Icon(Icons.open_in_browser_outlined, size: 19),\n      ),\n      PopupMenuButton(\n        icon: const Icon(Icons.more_vert, size: 19),\n        itemBuilder: (BuildContext context) => <PopupMenuEntry>[\n          PopupMenuItem(\n            onTap: () => Utils.shareText(controller.url),\n            child: const Row(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                Icon(Icons.share_outlined, size: 19),\n                SizedBox(width: 10),\n                Text('分享'),\n              ],\n            ),\n          ),\n          PopupMenuItem(\n            onTap: () => Utils.copyText(controller.url),\n            child: const Row(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                Icon(Icons.copy_rounded, size: 19),\n                SizedBox(width: 10),\n                Text('复制链接'),\n              ],\n            ),\n          ),\n          if (controller.commentType == 12 &&\n              controller.stats.value != null &&\n              controller.opusData?.modules.moduleBlocked == null)\n            PopupMenuItem(\n              onTap: () async {\n                final summary = controller.summary;\n                try {\n                  if (summary.cover == null) {\n                    if (!await controller.getArticleInfo(true)) {\n                      return;\n                    }\n                  }\n                  if (mounted) {\n                    PageUtils.pmShare(\n                      this.context,\n                      content: {\n                        \"id\": controller.commentId,\n                        \"title\": \"- 哔哩哔哩专栏\",\n                        \"headline\": summary.title!, // throw\n                        \"source\": 6,\n                        \"thumb\": summary.cover!,\n                        \"author\": summary.author!.name,\n                        \"author_id\": summary.author!.mid.toString(),\n                      },\n                    );\n                  }\n                } catch (e) {\n                  SmartDialog.showToast(e.toString());\n                }\n              },\n              child: const Row(\n                mainAxisSize: MainAxisSize.min,\n                children: [\n                  Icon(Icons.forward_to_inbox, size: 19),\n                  SizedBox(width: 10),\n                  Text('分享至消息'),\n                ],\n              ),\n            ),\n        ],\n      ),\n      const SizedBox(width: 6),\n    ],\n  );\n\n  Widget _buildBottom(ThemeData theme) {\n    if (!controller.showDynActionBar) {\n      return fabButton;\n    }\n\n    late final primary = theme.colorScheme.primary;\n    late final outline = theme.colorScheme.outline;\n    late final btnStyle = TextButton.styleFrom(\n      tapTargetSize: .padded,\n      padding: const EdgeInsets.symmetric(horizontal: 15),\n      foregroundColor: outline,\n    );\n\n    Widget textIconButton({\n      required IconData icon,\n      required String text,\n      required DynamicStat? stat,\n      required VoidCallback onPressed,\n      IconData? activatedIcon,\n    }) {\n      final status = stat?.status == true;\n      final color = status ? primary : outline;\n      return TextButton.icon(\n        onPressed: onPressed,\n        icon: Icon(\n          status ? activatedIcon : icon,\n          size: 16,\n          color: color,\n        ),\n        style: btnStyle,\n        label: Text(\n          stat?.count != null ? NumUtils.numFormat(stat!.count) : text,\n          style: TextStyle(color: color),\n        ),\n      );\n    }\n\n    return Padding(\n      padding: .only(left: padding.left, right: padding.right),\n      child: Obx(() {\n        final stats = controller.stats.value;\n\n        Widget btn = Padding(\n          padding: EdgeInsets.only(\n            right: kFloatingActionButtonMargin,\n            bottom:\n                kFloatingActionButtonMargin +\n                (stats != null ? 0 : padding.bottom),\n          ),\n          child: replyButton,\n        );\n\n        if (stats == null) {\n          return Align(\n            alignment: Alignment.bottomRight,\n            child: btn,\n          );\n        }\n\n        return Column(\n          mainAxisSize: MainAxisSize.min,\n          crossAxisAlignment: CrossAxisAlignment.end,\n          children: [\n            btn,\n            Container(\n              decoration: BoxDecoration(\n                color: theme.colorScheme.surface,\n                border: Border(\n                  top: BorderSide(\n                    color: theme.colorScheme.outline.withValues(\n                      alpha: 0.08,\n                    ),\n                  ),\n                ),\n              ),\n              padding: EdgeInsets.only(bottom: padding.bottom),\n              child: Row(\n                children: [\n                  Expanded(\n                    child: Builder(\n                      builder: (btnContext) {\n                        final forward = stats.forward;\n                        return textIconButton(\n                          text: '转发',\n                          icon: FontAwesomeIcons.shareFromSquare,\n                          stat: forward,\n                          onPressed: () {\n                            if (controller.opusData == null &&\n                                controller.articleData?.dynIdStr == null) {\n                              SmartDialog.showToast(\n                                'err: ${controller.id}',\n                              );\n                              return;\n                            }\n                            final summary = controller.summary;\n                            showModalBottomSheet(\n                              context: context,\n                              isScrollControlled: true,\n                              useSafeArea: true,\n                              builder: (context) => RepostPanel(\n                                item: controller.opusData,\n                                dynIdStr: controller.articleData?.dynIdStr,\n                                pic: summary.cover,\n                                title: summary.title,\n                                uname: summary.author?.name,\n                                onSuccess: () {\n                                  if (forward != null) {\n                                    int count = forward.count ?? 0;\n                                    forward.count = count + 1;\n                                    if (btnContext.mounted) {\n                                      (btnContext as Element?)\n                                          ?.markNeedsBuild();\n                                    }\n                                  }\n                                },\n                              ),\n                            );\n                          },\n                        );\n                      },\n                    ),\n                  ),\n                  Expanded(\n                    child: textIconButton(\n                      text: '分享',\n                      icon: CustomIcons.share_node,\n                      stat: null,\n                      onPressed: () => Utils.shareText(controller.url),\n                    ),\n                  ),\n                  Expanded(\n                    child: textIconButton(\n                      icon: FontAwesomeIcons.star,\n                      activatedIcon: FontAwesomeIcons.solidStar,\n                      text: '收藏',\n                      stat: stats.favorite,\n                      onPressed: controller.onFav,\n                    ),\n                  ),\n                  Expanded(\n                    child: textIconButton(\n                      icon: FontAwesomeIcons.thumbsUp,\n                      activatedIcon: FontAwesomeIcons.solidThumbsUp,\n                      text: '点赞',\n                      stat: stats.like,\n                      onPressed: controller.onLike,\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          ],\n        );\n      }),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/article/widgets/article_ops.dart",
    "content": "import 'dart:math' as math;\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/models_new/article/article_view/ops.dart';\nimport 'package:PiliPlus/pages/dynamics/widgets/vote.dart';\nimport 'package:PiliPlus/utils/app_scheme.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/image_utils.dart';\nimport 'package:cached_network_image/cached_network_image.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass ArticleOpus extends StatelessWidget {\n  const ArticleOpus({\n    super.key,\n    required List<ArticleOps>? ops,\n    required this.maxWidth,\n  }) : _ops = ops;\n\n  final List<ArticleOps>? _ops;\n  final double maxWidth;\n\n  @override\n  Widget build(BuildContext context) {\n    if (_ops == null || _ops.isEmpty) {\n      return const SliverToBoxAdapter();\n    }\n\n    return SliverList.separated(\n      itemCount: _ops.length,\n      itemBuilder: (context, index) {\n        try {\n          final item = _ops[index];\n          switch (item.insert) {\n            case String e:\n              return SelectableText(e);\n            case Insert(:final card):\n              if (card != null) {\n                if (card.url?.isNotEmpty == true) {\n                  double? width = card.width == null\n                      ? null\n                      : math.min(maxWidth, card.width!);\n                  final height = width == null || card.height == null\n                      ? null\n                      : width * card.height! / card.width!;\n                  width ??= maxWidth;\n                  return GestureDetector(\n                    onTap: () {\n                      switch (item.attributes?.clazz) {\n                        case 'article-card card':\n                          if (card.id != null) {\n                            Get.toNamed(\n                              '/articlePage',\n                              parameters: {\n                                'id': card.id!.substring(2),\n                                'type': 'read',\n                              },\n                            );\n                          }\n                        case 'video-card card':\n                          if (card.id != null) {\n                            PiliScheme.videoPush(null, card.id);\n                          }\n                        case 'vote-card card':\n                          if (card.id != null) {\n                            showVoteDialog(context, int.parse(card.id!));\n                          }\n                      }\n                    },\n                    child: ClipRRect(\n                      borderRadius: StyleString.mdRadius,\n                      child: CachedNetworkImage(\n                        width: width,\n                        height: height,\n                        memCacheWidth: width.cacheSize(context),\n                        imageUrl: ImageUtils.thumbnailUrl(card.url, 60),\n                        placeholder: (_, _) => const SizedBox.shrink(),\n                      ),\n                    ),\n                  );\n                }\n              }\n          }\n          return Text(item.attributes.toString());\n        } catch (e) {\n          return Text(e.toString());\n        }\n      },\n      separatorBuilder: (context, index) => const SizedBox(height: 10),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/article/widgets/html_render.dart",
    "content": "import 'package:PiliPlus/common/widgets/image_viewer/hero.dart';\nimport 'package:PiliPlus/models/common/image_preview_type.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/image_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:cached_network_image/cached_network_image.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_html/flutter_html.dart';\nimport 'package:html/dom.dart' as dom;\n\nWidget htmlRender({\n  required BuildContext context,\n  dom.Element? element,\n  String? html,\n  int? imgCount,\n  List<String>? imgList,\n  required double maxWidth,\n}) {\n  // if (kDebugMode) debugPrint('htmlRender');\n  final extensions = [\n    TagExtension(\n      tagsToExtend: <String>{'img'},\n      builder: (ExtensionContext extensionContext) {\n        try {\n          final Map<String, dynamic> attributes = extensionContext.attributes;\n          final List<dynamic> key = attributes.keys.toList();\n          String imgUrl = key.contains('src')\n              ? attributes['src'] as String\n              : attributes['data-src'] as String;\n          imgUrl = imgUrl.contains('@') ? imgUrl.split('@').first : imgUrl;\n          final bool isEmote = imgUrl.contains('/emote/');\n          final bool isMall = imgUrl.contains('/mall/');\n          if (isMall) {\n            return const SizedBox.shrink();\n          }\n\n          String? clazz = attributes['class'];\n          String? height = RegExp(\n            r'max-height:(\\d+)px',\n          ).firstMatch('${attributes['style']}')?.group(1);\n          if (clazz?.contains('cut-off') == true || height != null) {\n            return CachedNetworkImage(\n              width: maxWidth,\n              memCacheWidth: maxWidth.cacheSize(context),\n              height: height != null ? double.parse(height) : null,\n              imageUrl: ImageUtils.thumbnailUrl(imgUrl),\n              fit: BoxFit.contain,\n              placeholder: (_, _) => const SizedBox.shrink(),\n            );\n          }\n          final width = isEmote ? 22.0 : maxWidth;\n          return GestureDetector(\n            onTap: () => PageUtils.imageView(\n              imgList: [SourceModel(url: imgUrl)],\n              quality: 60,\n            ),\n            child: fromHero(\n              tag: imgUrl,\n              child: CachedNetworkImage(\n                width: width,\n                height: isEmote ? 22.0 : null,\n                memCacheWidth: width.cacheSize(context),\n                imageUrl: ImageUtils.thumbnailUrl(imgUrl, 60),\n                fadeInDuration: const Duration(milliseconds: 120),\n                fadeOutDuration: const Duration(milliseconds: 120),\n                placeholder: (context, url) =>\n                    Image.asset('assets/images/loading.png'),\n              ),\n            ),\n          );\n        } catch (err) {\n          if (kDebugMode) debugPrint('错误的HTML: $element');\n          return const SizedBox.shrink();\n        }\n      },\n    ),\n  ];\n  final style = {\n    'html': Style(\n      fontSize: FontSize(16),\n      lineHeight: LineHeight.percent(160),\n      letterSpacing: 0.3,\n    ),\n    'body': Style(margin: Margins.zero, padding: HtmlPaddings.zero),\n    'a': Style(\n      color: Theme.of(context).colorScheme.primary,\n      textDecoration: TextDecoration.none,\n    ),\n    'br': Style(\n      lineHeight: LineHeight.percent(-1),\n    ),\n    'p': Style(\n      margin: Margins.only(bottom: 4),\n    ),\n    'span': Style(\n      fontSize: FontSize.large,\n      height: Height(1.8),\n    ),\n    'div': Style(height: Height.auto()),\n    'li > p': Style(\n      display: Display.inline,\n    ),\n    'li': Style(\n      padding: HtmlPaddings.only(bottom: 4),\n      textAlign: TextAlign.justify,\n    ),\n    'img': Style(margin: Margins.only(top: 4, bottom: 4)),\n    'h1,h2': Style(\n      fontSize: FontSize.xLarge,\n      fontWeight: FontWeight.bold,\n      margin: Margins.only(bottom: 8),\n    ),\n    'h3,h4,h5': Style(\n      fontSize: FontSize(16),\n      fontWeight: FontWeight.bold,\n      margin: Margins.only(bottom: 4),\n    ),\n    'figcaption': Style(\n      fontSize: FontSize.large,\n      textAlign: TextAlign.center,\n    ),\n    'strong': Style(fontWeight: FontWeight.bold),\n    'figure': Style(\n      margin: Margins.zero,\n    ),\n  };\n  return SelectionArea(\n    child: element != null\n        ? Html.fromElement(\n            documentElement: element,\n            extensions: extensions,\n            style: style,\n          )\n        : Html(\n            data: html,\n            extensions: extensions,\n            style: style,\n          ),\n  );\n}\n"
  },
  {
    "path": "lib/pages/article/widgets/opus_content.dart",
    "content": "import 'dart:math' as math;\n\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/gesture/tap_gesture_recognizer.dart';\nimport 'package:PiliPlus/common/widgets/image/cached_network_svg_image.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/image_grid/image_grid_view.dart';\nimport 'package:PiliPlus/common/widgets/image_viewer/hero.dart';\nimport 'package:PiliPlus/http/constants.dart';\nimport 'package:PiliPlus/models/common/image_preview_type.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models/dynamics/article_content_model.dart'\n    show ArticleContentModel, Rich, Style, Word, Node;\nimport 'package:PiliPlus/models/dynamics/result.dart';\nimport 'package:PiliPlus/pages/dynamics/widgets/vote.dart';\nimport 'package:PiliPlus/utils/app_scheme.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/extension/string_ext.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/image_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:cached_network_image/cached_network_image.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart' hide LayoutBuilder;\nimport 'package:get/get_core/src/get_main.dart';\nimport 'package:get/get_navigation/src/extension_navigation.dart';\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\nimport 'package:re_highlight/languages/all.dart';\nimport 'package:re_highlight/re_highlight.dart';\nimport 'package:re_highlight/styles/github-dark.dart';\nimport 'package:re_highlight/styles/github.dart';\n\nclass OpusContent extends StatelessWidget {\n  final List<ArticleContentModel> opus;\n  final double maxWidth;\n\n  const OpusContent({\n    super.key,\n    required this.opus,\n    required this.maxWidth,\n  });\n\n  static InlineSpan _node2Widget({\n    required Node item,\n    required ColorScheme colorScheme,\n    bool isQuote = false,\n    required ValueGetter<double> surfaceLuminance,\n  }) {\n    switch (item.type) {\n      case 'TEXT_NODE_TYPE_RICH' when (item.rich != null):\n        Rich rich = item.rich!;\n        switch (rich.type) {\n          case 'RICH_TEXT_NODE_TYPE_EMOJI':\n            Emoji emoji = rich.emoji!;\n            final size = 20.0 * emoji.size;\n            return WidgetSpan(\n              child: NetworkImgLayer(\n                width: size,\n                height: size,\n                src: emoji.url,\n                type: ImageType.emote,\n              ),\n            );\n          default:\n            return TextSpan(\n              text:\n                  '${rich.type == 'RICH_TEXT_NODE_TYPE_WEB' ? '\\u{1F517}' : ''}${item.rich!.text}',\n              style: _getStyle(\n                rich.style,\n                rich.type == 'RICH_TEXT_NODE_TYPE_TEXT'\n                    ? null\n                    : colorScheme.primary,\n              ),\n              recognizer: NoDeadlineTapGestureRecognizer()\n                ..onTap = () {\n                  switch (rich.type) {\n                    case 'RICH_TEXT_NODE_TYPE_AT':\n                      Get.toNamed('/member?mid=${rich.rid}');\n                    // case 'RICH_TEXT_NODE_TYPE_TOPIC':\n                    default:\n                      if (rich.jumpUrl != null) {\n                        PiliScheme.routePushFromUrl(\n                          rich.jumpUrl!,\n                        );\n                      }\n                  }\n                },\n            );\n        }\n      case 'TEXT_NODE_TYPE_FORMULA' when (item.formula != null):\n        final latex = item.formula!.latexContent!;\n        return WidgetSpan(\n          child: CachedNetworkSVGImage(\n            cacheKey: latex,\n            semanticsLabel: latex,\n            '${HttpString.apiBaseUrl}/x/web-frontend/mathjax/tex?formula=${Uri.encodeComponent(latex)}',\n            colorFilter: ColorFilter.mode(\n              colorScheme.onSurfaceVariant,\n              BlendMode.srcIn,\n            ),\n            alignment: Alignment.centerLeft,\n            placeholderBuilder: (_) => Text(latex),\n            errorWidget: Text(latex),\n          ),\n        );\n      default:\n        return _getSpan(\n          item.word,\n          surfaceLuminance: surfaceLuminance,\n          defaultColor: isQuote ? colorScheme.onSurfaceVariant : null,\n        );\n    }\n  }\n\n  static TextStyle _getStyle(Style? style, [Color? color, double? fontSize]) =>\n      TextStyle(\n        decoration: style?.strikethrough == true\n            ? TextDecoration.lineThrough\n            : null,\n        decorationColor: color,\n        fontStyle: style?.italic == true ? FontStyle.italic : null,\n        fontWeight: style?.bold == true ? FontWeight.bold : null,\n        color: color,\n        fontSize: fontSize,\n      );\n\n  static TextSpan _getSpan(\n    Word? word, {\n    Color? defaultColor,\n    required ValueGetter<double> surfaceLuminance,\n  }) {\n    Color? color;\n    if (word?.color case final c?) {\n      final tmpColor = Color(c);\n      double max = tmpColor.computeLuminance();\n      double min = surfaceLuminance();\n      if (max < min) {\n        final tmp = max;\n        max = min;\n        min = tmp;\n      }\n\n      // WCAG AA : (max + 0.05) / (min + 0.05) > 3.0\n      if (max > 3.0 * min + 0.1) {\n        color = tmpColor;\n      }\n    }\n    return TextSpan(\n      text: word?.words,\n      style: _getStyle(\n        word?.style,\n        color ?? defaultColor,\n        word?.fontSize,\n      ),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    // if (kDebugMode) debugPrint('opusContent');\n    if (opus.isEmpty) {\n      return const SliverToBoxAdapter();\n    }\n\n    final colorScheme = Theme.of(context).colorScheme;\n    late final isDarkMode = colorScheme.isDark;\n    double? surfaceLuminance;\n    double getSurfaceLuminance() =>\n        surfaceLuminance ??= colorScheme.surface.computeLuminance();\n\n    late final highlight = Highlight()..registerLanguages(builtinAllLanguages);\n\n    return SliverList.separated(\n      itemCount: opus.length,\n      itemBuilder: (context, index) {\n        final element = opus[index];\n        try {\n          switch (element.paraType) {\n            case 1 || 4:\n              final isQuote = element.paraType == 4;\n              Widget widget = SelectableText.rich(\n                textAlign: element.align == 1 ? TextAlign.center : null,\n                TextSpan(\n                  children: element.text?.nodes\n                      ?.map(\n                        (item) => _node2Widget(\n                          item: item,\n                          colorScheme: colorScheme,\n                          surfaceLuminance: getSurfaceLuminance,\n                        ),\n                      )\n                      .toList(),\n                ),\n              );\n              if (isQuote) {\n                widget = Container(\n                  padding: const EdgeInsets.only(\n                    left: 8,\n                    top: 4,\n                    right: 4,\n                    bottom: 4,\n                  ),\n                  decoration: BoxDecoration(\n                    border: Border(\n                      left: BorderSide(\n                        color: colorScheme.outlineVariant,\n                        width: 4,\n                      ),\n                    ),\n                    borderRadius: const BorderRadius.all(Radius.circular(6)),\n                    color: colorScheme.onInverseSurface,\n                  ),\n                  child: widget,\n                );\n              }\n              return widget;\n            case 2 when (element.pic != null):\n              if (element.pic!.pics!.length == 1) {\n                final pic = element.pic!.pics!.first;\n                double? width = pic.width == null\n                    ? null\n                    : math.min(maxWidth, pic.width!);\n                final height = width == null || pic.height == null\n                    ? null\n                    : width * pic.height! / pic.width!;\n                width ??= maxWidth;\n                Widget child = CachedNetworkImage(\n                  width: width,\n                  height: height,\n                  memCacheWidth: width.cacheSize(context),\n                  imageUrl: ImageUtils.thumbnailUrl(pic.url!, 60),\n                  fadeInDuration: const Duration(milliseconds: 120),\n                  fadeOutDuration: const Duration(milliseconds: 120),\n                  placeholder: (_, _) =>\n                      Image.asset('assets/images/loading.png'),\n                );\n                if (!(pic.isLongPic ?? false)) {\n                  child = fromHero(\n                    tag: pic.url!,\n                    child: child,\n                  );\n                }\n                return GestureDetector(\n                  onTap: () => PageUtils.imageView(\n                    imgList: [SourceModel(url: pic.url!)],\n                    quality: 60,\n                  ),\n                  child: child,\n                );\n              } else {\n                return ImageGridView(\n                  picArr: element.pic!.pics!\n                      .map(\n                        (e) => ImageModel(\n                          width: e.width,\n                          height: e.height,\n                          url: e.url!,\n                        ),\n                      )\n                      .toList(),\n                );\n              }\n            case 3 when (element.line != null):\n              final height = element.line!.pic!.height?.toDouble();\n              return CachedNetworkImage(\n                fit: .contain,\n                height: height,\n                width: maxWidth,\n                memCacheWidth: maxWidth.cacheSize(context),\n                imageUrl: ImageUtils.thumbnailUrl(element.line!.pic!.url!),\n                placeholder: (_, _) => const SizedBox.shrink(),\n              );\n            case 5 when (element.list != null):\n              return SelectableText.rich(\n                TextSpan(\n                  children: element.list!.items?.indexed.map((entry) {\n                    return TextSpan(\n                      children: [\n                        const WidgetSpan(\n                          child: Icon(MdiIcons.circleMedium),\n                          alignment: PlaceholderAlignment.middle,\n                        ),\n                        ...entry.$2.nodes!.map((item) {\n                          if (item.word != null) {\n                            return _getSpan(\n                              item.word,\n                              surfaceLuminance: getSurfaceLuminance,\n                            );\n                          }\n                          if (item.rich case Rich(\n                            :final text,\n                            :final jumpUrl,\n                          )) {\n                            final hasUrl =\n                                jumpUrl != null && jumpUrl.isNotEmpty;\n                            return TextSpan(\n                              text: '${hasUrl ? '\\u{1F517}' : ''}$text',\n                              recognizer: hasUrl\n                                  ? (NoDeadlineTapGestureRecognizer()\n                                      ..onTap = () =>\n                                          PiliScheme.routePushFromUrl(jumpUrl))\n                                  : null,\n                              style: hasUrl\n                                  ? TextStyle(color: colorScheme.primary)\n                                  : null,\n                            );\n                          }\n                          return const TextSpan();\n                        }),\n                        if (entry.$1 < element.list!.items!.length - 1)\n                          const TextSpan(text: '\\n'),\n                      ],\n                    );\n                  }).toList(),\n                ),\n              );\n            case 6:\n              return Material(\n                shape: const RoundedRectangleBorder(\n                  borderRadius: BorderRadius.all(Radius.circular(8)),\n                ),\n                color: colorScheme.onInverseSurface,\n                child: InkWell(\n                  onTap: element.linkCard!.card!.type == 'LINK_CARD_TYPE_GOODS'\n                      ? null\n                      : () {\n                          try {\n                            if (element.linkCard!.card!.type ==\n                                'LINK_CARD_TYPE_VOTE') {\n                              showVoteDialog(\n                                context,\n                                element.linkCard!.card!.vote?.voteId ??\n                                    int.parse(element.linkCard!.card!.oid!),\n                              );\n                              return;\n                            }\n                            String? url =\n                                switch (element.linkCard!.card!.type) {\n                                  'LINK_CARD_TYPE_UGC' =>\n                                    element.linkCard!.card!.ugc!.jumpUrl,\n                                  'LINK_CARD_TYPE_COMMON' =>\n                                    element.linkCard!.card!.common!.jumpUrl,\n                                  'LINK_CARD_TYPE_LIVE' =>\n                                    element.linkCard!.card!.live!.jumpUrl,\n                                  'LINK_CARD_TYPE_OPUS' =>\n                                    element.linkCard!.card!.opus!.jumpUrl,\n                                  'LINK_CARD_TYPE_MUSIC' =>\n                                    element.linkCard!.card!.music!.jumpUrl,\n                                  _ => null,\n                                };\n                            if (url != null && url.isNotEmpty) {\n                              PiliScheme.routePushFromUrl(url);\n                            }\n                          } catch (_) {}\n                        },\n                  borderRadius: const BorderRadius.all(Radius.circular(8)),\n                  child: Padding(\n                    padding: const EdgeInsets.all(8),\n                    child: switch (element.linkCard?.card?.type) {\n                      'LINK_CARD_TYPE_UGC' => Row(\n                        spacing: 10,\n                        children: [\n                          NetworkImgLayer(\n                            width: 104,\n                            height: 65,\n                            src: element.linkCard!.card!.ugc!.cover,\n                            borderRadius: const BorderRadius.all(\n                              Radius.circular(6),\n                            ),\n                          ),\n                          Expanded(\n                            child: Column(\n                              crossAxisAlignment: CrossAxisAlignment.start,\n                              children: [\n                                Text(element.linkCard!.card!.ugc!.title!),\n                                Text(\n                                  element.linkCard!.card!.ugc!.descSecond!,\n                                  style: TextStyle(\n                                    fontSize: 13,\n                                    color: colorScheme.outline,\n                                  ),\n                                ),\n                              ],\n                            ),\n                          ),\n                        ],\n                      ),\n                      'LINK_CARD_TYPE_ITEM_NULL' => Row(\n                        children: [\n                          if (element\n                                  .linkCard\n                                  ?.card\n                                  ?.itemNull\n                                  ?.icon\n                                  ?.isNullOrEmpty ==\n                              true)\n                            const Icon(Icons.info, size: 20),\n                          Text(' ${element.linkCard?.card?.itemNull?.text}'),\n                        ],\n                      ),\n                      'LINK_CARD_TYPE_COMMON' => Row(\n                        spacing: 10,\n                        children: [\n                          NetworkImgLayer(\n                            width: 104,\n                            height: 65,\n                            src: element.linkCard!.card!.common!.cover,\n                            borderRadius: const BorderRadius.all(\n                              Radius.circular(6),\n                            ),\n                          ),\n                          Expanded(\n                            child: Column(\n                              crossAxisAlignment: CrossAxisAlignment.start,\n                              children: [\n                                Text(element.linkCard!.card!.common!.title!),\n                                if (element.linkCard!.card!.common!.desc1 !=\n                                    null)\n                                  Text(\n                                    element.linkCard!.card!.common!.desc1!,\n                                    style: TextStyle(\n                                      fontSize: 13,\n                                      color: colorScheme.outline,\n                                    ),\n                                  ),\n                                if (element.linkCard!.card!.common!.desc2 !=\n                                    null)\n                                  Text(\n                                    element.linkCard!.card!.common!.desc2!,\n                                    style: TextStyle(\n                                      fontSize: 13,\n                                      color: colorScheme.outline,\n                                    ),\n                                  ),\n                              ],\n                            ),\n                          ),\n                        ],\n                      ),\n                      'LINK_CARD_TYPE_LIVE' => Row(\n                        spacing: 10,\n                        children: [\n                          NetworkImgLayer(\n                            width: 104,\n                            height: 65,\n                            src: element.linkCard!.card!.live!.cover,\n                            borderRadius: const BorderRadius.all(\n                              Radius.circular(6),\n                            ),\n                          ),\n                          Expanded(\n                            child: Column(\n                              crossAxisAlignment: CrossAxisAlignment.start,\n                              children: [\n                                Text(element.linkCard!.card!.live!.title!),\n                                if (element.linkCard!.card!.live!.descFirst !=\n                                    null)\n                                  Text(\n                                    element.linkCard!.card!.live!.descFirst!,\n                                    style: TextStyle(\n                                      fontSize: 13,\n                                      color: colorScheme.outline,\n                                    ),\n                                  ),\n                                if (element.linkCard!.card!.live!.descSecond !=\n                                    null)\n                                  Text(\n                                    element.linkCard!.card!.live!.descSecond!,\n                                    style: TextStyle(\n                                      fontSize: 13,\n                                      color: colorScheme.outline,\n                                    ),\n                                  ),\n                              ],\n                            ),\n                          ),\n                        ],\n                      ),\n                      'LINK_CARD_TYPE_OPUS' => Row(\n                        spacing: 10,\n                        children: [\n                          NetworkImgLayer(\n                            width: 104,\n                            height: 65,\n                            src: element.linkCard!.card!.opus!.cover,\n                            borderRadius: const BorderRadius.all(\n                              Radius.circular(6),\n                            ),\n                          ),\n                          Expanded(\n                            child: Column(\n                              crossAxisAlignment: CrossAxisAlignment.start,\n                              children: [\n                                Text(element.linkCard!.card!.opus!.title!),\n                                Text(\n                                  '${element.linkCard!.card!.opus!.authorName} · ${element.linkCard!.card!.opus!.statView ?? 0}阅读',\n                                  style: TextStyle(\n                                    fontSize: 13,\n                                    color: colorScheme.outline,\n                                  ),\n                                ),\n                              ],\n                            ),\n                          ),\n                        ],\n                      ),\n                      'LINK_CARD_TYPE_VOTE' => Row(\n                        spacing: 10,\n                        children: [\n                          Container(\n                            decoration: BoxDecoration(\n                              borderRadius: const BorderRadius.all(\n                                Radius.circular(6),\n                              ),\n                              color: colorScheme.secondaryContainer,\n                            ),\n                            width: 70,\n                            height: 50,\n                            alignment: Alignment.center,\n                            child: Icon(\n                              Icons.bar_chart_rounded,\n                              color: colorScheme.onSurfaceVariant,\n                            ),\n                          ),\n                          Expanded(\n                            child: Column(\n                              crossAxisAlignment: CrossAxisAlignment.start,\n                              children: [\n                                Text(element.linkCard!.card!.vote!.desc!),\n                                Text(\n                                  '${element.linkCard!.card!.vote!.joinNum}人参与',\n                                  style: TextStyle(\n                                    fontSize: 13,\n                                    color: colorScheme.outline,\n                                  ),\n                                ),\n                              ],\n                            ),\n                          ),\n                        ],\n                      ),\n                      'LINK_CARD_TYPE_MUSIC' => Row(\n                        spacing: 10,\n                        children: [\n                          NetworkImgLayer(\n                            width: 104,\n                            height: 65,\n                            src: element.linkCard!.card!.music!.cover,\n                            borderRadius: const BorderRadius.all(\n                              Radius.circular(6),\n                            ),\n                          ),\n                          Expanded(\n                            child: Column(\n                              crossAxisAlignment: CrossAxisAlignment.start,\n                              children: [\n                                Text(element.linkCard!.card!.music!.title!),\n                                if (element.linkCard!.card!.music!.label !=\n                                    null)\n                                  Text(\n                                    element.linkCard!.card!.music!.label!,\n                                    style: TextStyle(\n                                      fontSize: 13,\n                                      color: colorScheme.outline,\n                                    ),\n                                  ),\n                              ],\n                            ),\n                          ),\n                        ],\n                      ),\n                      'LINK_CARD_TYPE_GOODS' => Column(\n                        children: element.linkCard!.card!.goods!.items!.map((\n                          e,\n                        ) {\n                          return GestureDetector(\n                            onTap: () {\n                              if (e.jumpUrl?.isNotEmpty == true) {\n                                PiliScheme.routePushFromUrl(e.jumpUrl!);\n                              }\n                            },\n                            child: Row(\n                              spacing: 10,\n                              children: [\n                                NetworkImgLayer(\n                                  width: 104,\n                                  height: 65,\n                                  src: e.cover,\n                                  borderRadius: const BorderRadius.all(\n                                    Radius.circular(6),\n                                  ),\n                                ),\n                                Expanded(\n                                  child: Column(\n                                    crossAxisAlignment:\n                                        CrossAxisAlignment.start,\n                                    children: [\n                                      Text(e.name!),\n                                      if (e.brief?.isNotEmpty == true)\n                                        Text(\n                                          e.brief!,\n                                          style: TextStyle(\n                                            fontSize: 13,\n                                            color: colorScheme.outline,\n                                          ),\n                                        ),\n                                      if (e.price?.isNotEmpty == true)\n                                        Text(\n                                          '${e.price!}起',\n                                          style: TextStyle(\n                                            fontSize: 13,\n                                            color: colorScheme.outline,\n                                          ),\n                                        ),\n                                    ],\n                                  ),\n                                ),\n                              ],\n                            ),\n                          );\n                        }).toList(),\n                      ),\n                      _ => throw UnimplementedError(\n                        '\\nparaType: ${element.paraType},\\ncard type: ${element.linkCard?.card?.type}',\n                      ),\n                    },\n                  ),\n                ),\n              );\n            case 7 when (element.code != null):\n              final renderer = TextSpanRenderer(\n                const TextStyle(),\n                isDarkMode ? githubDarkTheme : githubTheme,\n              );\n              highlight\n                  .highlightAuto(\n                    element.code!.content!,\n                    element.code!.lang == 'language-clike'\n                        ? const ['c', 'java']\n                        : [\n                            element.code!.lang!\n                                .replaceAll('language-', '')\n                                .replaceAll('like', ''),\n                          ],\n                  )\n                  .render(renderer);\n              return Container(\n                padding: const EdgeInsets.all(12),\n                decoration: BoxDecoration(\n                  borderRadius: const BorderRadius.all(Radius.circular(8)),\n                  color: colorScheme.onInverseSurface,\n                ),\n                width: double.infinity,\n                child: SelectableText.rich(renderer.span!),\n              );\n            case 8 when (element.heading?.nodes?.isNotEmpty == true):\n              return SelectableText.rich(\n                TextSpan(\n                  children: element.heading!.nodes!\n                      .map(\n                        (e) => _node2Widget(\n                          item: e,\n                          colorScheme: colorScheme,\n                          surfaceLuminance: getSurfaceLuminance,\n                        ),\n                      )\n                      .toList(),\n                ),\n              );\n            default:\n              if (kDebugMode) debugPrint('unknown type ${element.paraType}');\n              if (element.text?.nodes?.isNotEmpty == true) {\n                return SelectableText.rich(\n                  textAlign: element.align == 1 ? TextAlign.center : null,\n                  TextSpan(\n                    children: element.text!.nodes!\n                        .map<TextSpan>(\n                          (item) => _getSpan(\n                            item.word,\n                            surfaceLuminance: getSurfaceLuminance,\n                          ),\n                        )\n                        .toList(),\n                  ),\n                );\n              }\n\n              return SelectableText(\n                '不支持的类型 (${element.paraType})',\n                style: const TextStyle(\n                  fontWeight: FontWeight.bold,\n                  color: Colors.red,\n                ),\n              );\n          }\n        } catch (e) {\n          return SelectableText(\n            '错误的类型 $e',\n            style: const TextStyle(\n              fontWeight: FontWeight.bold,\n              color: Colors.red,\n            ),\n          );\n        }\n      },\n      separatorBuilder: (context, index) => const SizedBox(height: 10),\n    );\n  }\n}\n\nWidget moduleBlockedItem(\n  BuildContext context,\n  ThemeData theme,\n  ModuleBlocked moduleBlocked,\n) {\n  late final isDarkMode = theme.brightness.isDark;\n\n  BoxDecoration? bgImg() {\n    return moduleBlocked.bgImg == null\n        ? null\n        : BoxDecoration(\n            image: DecorationImage(\n              fit: BoxFit.fill,\n              image: CachedNetworkImageProvider(\n                ImageUtils.thumbnailUrl(\n                  isDarkMode\n                      ? moduleBlocked.bgImg!.imgDark\n                      : moduleBlocked.bgImg!.imgDay,\n                ),\n              ),\n            ),\n          );\n  }\n\n  Widget icon(double width) {\n    return CachedNetworkImage(\n      width: width,\n      memCacheWidth: width.cacheSize(context),\n      fit: BoxFit.contain,\n      imageUrl: ImageUtils.thumbnailUrl(\n        isDarkMode ? moduleBlocked.icon!.imgDark : moduleBlocked.icon!.imgDay,\n      ),\n      placeholder: (_, _) => const SizedBox.shrink(),\n    );\n  }\n\n  Widget btn(\n    BuildContext context, {\n    OutlinedBorder? shape,\n    VisualDensity? visualDensity,\n    EdgeInsetsGeometry? padding,\n  }) {\n    return FilledButton.tonal(\n      style: FilledButton.styleFrom(\n        padding: padding,\n        tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n        visualDensity: visualDensity,\n        backgroundColor: isDarkMode\n            ? const Color(0xFF8F0030)\n            : const Color(0xFFFF6699),\n        foregroundColor: Colors.white,\n        shape: shape,\n      ),\n      onPressed: () {\n        if (moduleBlocked.button!.jumpUrl?.isNotEmpty == true) {\n          PiliScheme.routePushFromUrl(moduleBlocked.button!.jumpUrl!);\n        }\n      },\n      child: Row(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          if (moduleBlocked.button!.icon?.isNotEmpty == true)\n            CachedNetworkImage(\n              height: 16,\n              color: Colors.white,\n              memCacheHeight: 16.cacheSize(context),\n              placeholder: (_, _) => const SizedBox.shrink(),\n              imageUrl: ImageUtils.safeThumbnailUrl(moduleBlocked.button!.icon),\n            ),\n          Text(moduleBlocked.button!.text ?? ''),\n        ],\n      ),\n    );\n  }\n\n  if (moduleBlocked.blockedType == 1) {\n    return Align(\n      alignment: .centerLeft,\n      child: LayoutBuilder(\n        builder: (context, constraints) {\n          var maxWidth = constraints.maxWidth;\n          maxWidth = maxWidth <= 255 ? maxWidth : math.min(400, maxWidth * 0.8);\n          return Container(\n            width: maxWidth,\n            height: maxWidth,\n            decoration: bgImg(),\n            padding: const EdgeInsets.all(12),\n            child: Column(\n              mainAxisAlignment: MainAxisAlignment.center,\n              children: [\n                if (moduleBlocked.icon != null)\n                  icon(math.max(40, maxWidth / 7)),\n                if (moduleBlocked.hintMessage?.isNotEmpty == true) ...[\n                  const SizedBox(height: 5),\n                  Text(\n                    moduleBlocked.hintMessage!,\n                    textAlign: TextAlign.center,\n                    style: TextStyle(color: theme.colorScheme.outline),\n                  ),\n                ],\n                if (moduleBlocked.button != null) ...[\n                  const SizedBox(height: 8),\n                  btn(\n                    context,\n                    visualDensity: const VisualDensity(vertical: -2.5),\n                  ),\n                ],\n              ],\n            ),\n          );\n        },\n      ),\n    );\n  }\n  return Container(\n    decoration: bgImg(),\n    padding: const EdgeInsets.all(12),\n    child: Row(\n      spacing: 8,\n      children: [\n        if (moduleBlocked.icon != null) icon(42),\n        Expanded(\n          child: Column(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            mainAxisSize: MainAxisSize.min,\n            spacing: 2,\n            children: [\n              if (moduleBlocked.title?.isNotEmpty == true)\n                Text(moduleBlocked.title!),\n              if (moduleBlocked.hintMessage?.isNotEmpty == true)\n                Text(\n                  moduleBlocked.hintMessage!,\n                  style: TextStyle(\n                    fontSize: 13,\n                    color: theme.colorScheme.outline,\n                  ),\n                ),\n            ],\n          ),\n        ),\n        if (moduleBlocked.button != null)\n          btn(\n            context,\n            visualDensity: const VisualDensity(vertical: -3, horizontal: -4),\n            shape: const RoundedRectangleBorder(\n              borderRadius: BorderRadius.all(Radius.circular(6)),\n            ),\n            padding: const EdgeInsets.symmetric(horizontal: 10),\n          ),\n      ],\n    ),\n  );\n}\n\nWidget opusCollection(ThemeData theme, ModuleCollection item) {\n  return Padding(\n    padding: const EdgeInsets.only(bottom: 10),\n    child: Material(\n      borderRadius: const BorderRadius.all(Radius.circular(8)),\n      color: theme.colorScheme.onInverseSurface,\n      child: InkWell(\n        borderRadius: const BorderRadius.all(Radius.circular(8)),\n        onTap: () => Get.toNamed(\n          '/articleList',\n          parameters: {'id': '${item.id}'},\n        ),\n        child: Padding(\n          padding: const EdgeInsets.all(10),\n          child: Row(\n            children: [\n              Expanded(\n                child: Column(\n                  mainAxisSize: MainAxisSize.min,\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    Text(item.title!),\n                    Text.rich(\n                      TextSpan(\n                        children: [\n                          WidgetSpan(\n                            alignment: PlaceholderAlignment.middle,\n                            child: Icon(\n                              size: 18,\n                              Icons.article_outlined,\n                              color: theme.colorScheme.outline,\n                            ),\n                          ),\n                          TextSpan(\n                            text: '${item.name} · ${item.count}',\n                            style: TextStyle(\n                              fontSize: 13,\n                              color: theme.colorScheme.outline,\n                            ),\n                          ),\n                        ],\n                      ),\n                    ),\n                  ],\n                ),\n              ),\n              Icon(\n                Icons.keyboard_arrow_right,\n                color: theme.colorScheme.outline,\n              ),\n            ],\n          ),\n        ),\n      ),\n    ),\n  );\n}\n"
  },
  {
    "path": "lib/pages/article_list/controller.dart",
    "content": "import 'package:PiliPlus/http/dynamics.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/model_owner.dart';\nimport 'package:PiliPlus/models_new/article/article_list/article.dart';\nimport 'package:PiliPlus/models_new/article/article_list/data.dart';\nimport 'package:PiliPlus/models_new/article/article_list/list.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:get/get.dart';\n\nclass ArticleListController\n    extends CommonListController<ArticleListData, ArticleListItemModel> {\n  final id = Get.parameters['id']!;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  Rx<ArticleListInfo?> list = Rx<ArticleListInfo?>(null);\n  Owner? author;\n\n  @override\n  List<ArticleListItemModel>? getDataList(ArticleListData response) {\n    list.value = response.list;\n    author = response.author;\n    return response.articles;\n  }\n\n  @override\n  Future<LoadingState<ArticleListData>> customGetData() =>\n      DynamicsHttp.articleList(id: id);\n}\n"
  },
  {
    "path": "lib/pages/article_list/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/http/constants.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models_new/article/article_list/article.dart';\nimport 'package:PiliPlus/models_new/article/article_list/list.dart';\nimport 'package:PiliPlus/pages/article_list/controller.dart';\nimport 'package:PiliPlus/pages/article_list/widgets/item.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass ArticleListPage extends StatefulWidget {\n  const ArticleListPage({super.key});\n\n  @override\n  State<ArticleListPage> createState() => _ArticleListPageState();\n}\n\nclass _ArticleListPageState extends State<ArticleListPage> with GridMixin {\n  final _controller = Get.put(\n    ArticleListController(),\n    tag: Get.parameters['id']!,\n  );\n\n  late EdgeInsets padding;\n\n  @override\n  Widget build(BuildContext context) {\n    final ThemeData theme = Theme.of(context);\n    padding = MediaQuery.viewPaddingOf(context);\n    return Material(\n      color: theme.colorScheme.surface,\n      child: refreshIndicator(\n        onRefresh: _controller.onRefresh,\n        child: CustomScrollView(\n          physics: const AlwaysScrollableScrollPhysics(),\n          slivers: [\n            Obx(() => _buildHeader(theme, _controller.list.value)),\n            SliverPadding(\n              padding: EdgeInsets.only(\n                left: padding.left,\n                right: padding.right,\n                bottom: padding.bottom + 100,\n              ),\n              sliver: Obx(\n                () => _buildBody(theme, _controller.loadingState.value),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  @override\n  Widget get gridSkeleton => SliverPadding(\n    padding: EdgeInsets.only(\n      top: padding.top + kToolbarHeight + 120,\n    ),\n    sliver: super.gridSkeleton,\n  );\n\n  Widget _buildBody(\n    ThemeData theme,\n    LoadingState<List<ArticleListItemModel>?> loadingState,\n  ) {\n    return switch (loadingState) {\n      Loading() => gridSkeleton,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverGrid.builder(\n                gridDelegate: gridDelegate,\n                itemBuilder: (context, index) =>\n                    ArticleListItem(item: response[index]),\n                itemCount: response.length,\n              )\n            : HttpError(onReload: _controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n\n  Widget _buildHeader(ThemeData theme, ArticleListInfo? item) {\n    if (item == null) {\n      return const SliverToBoxAdapter();\n    }\n    late final style = TextStyle(color: theme.colorScheme.onSurfaceVariant);\n    late final divider = TextSpan(\n      text: '  |  ',\n      style: TextStyle(color: theme.colorScheme.outline.withValues(alpha: 0.7)),\n    );\n    return SliverAppBar.medium(\n      title: Text(item.name!),\n      pinned: true,\n      expandedHeight: kToolbarHeight + 127,\n      flexibleSpace: FlexibleSpaceBar(\n        background: Container(\n          height: 120,\n          margin: EdgeInsets.only(\n            left: 12 + padding.left,\n            right: 12,\n            top: padding.top + kToolbarHeight,\n          ),\n          child: Row(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              if (item.imageUrl?.isNotEmpty == true) ...[\n                NetworkImgLayer(\n                  width: 91,\n                  height: 120,\n                  src: item.imageUrl,\n                  borderRadius: const BorderRadius.all(\n                    Radius.circular(6),\n                  ),\n                ),\n                const SizedBox(width: 10),\n              ],\n              Column(\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  Text(\n                    item.name!,\n                    maxLines: 1,\n                    overflow: TextOverflow.ellipsis,\n                    style: const TextStyle(\n                      fontSize: 16,\n                      fontWeight: FontWeight.bold,\n                    ),\n                  ),\n                  if (_controller.author != null) ...[\n                    const SizedBox(height: 10),\n                    GestureDetector(\n                      behavior: HitTestBehavior.opaque,\n                      onTap: () =>\n                          Get.toNamed('/member?mid=${_controller.author!.mid}'),\n                      child: Row(\n                        spacing: 10,\n                        mainAxisSize: MainAxisSize.min,\n                        children: [\n                          NetworkImgLayer(\n                            width: 30,\n                            height: 30,\n                            src: _controller.author!.face,\n                            type: ImageType.avatar,\n                          ),\n                          Flexible(child: Text(_controller.author!.name!)),\n                        ],\n                      ),\n                    ),\n                  ],\n                  const SizedBox(height: 10),\n                  Text.rich(\n                    TextSpan(\n                      children: [\n                        TextSpan(\n                          text: '${NumUtils.numFormat(item.articlesCount)}篇专栏',\n                        ),\n                        divider,\n                        TextSpan(text: '${NumUtils.numFormat(item.words)}个字'),\n                        divider,\n                        TextSpan(text: '${NumUtils.numFormat(item.read)}次阅读'),\n                      ],\n                      style: style,\n                    ),\n                  ),\n                  Text.rich(\n                    TextSpan(\n                      children: [\n                        TextSpan(\n                          text:\n                              '${DateFormatUtils.dateFormat(item.updateTime)}更新',\n                        ),\n                        divider,\n                        TextSpan(text: '文集号: ${item.id}'),\n                      ],\n                      style: style,\n                    ),\n                  ),\n                ],\n              ),\n            ],\n          ),\n        ),\n      ),\n      actions: [\n        IconButton(\n          tooltip: '浏览器打开',\n          onPressed: () => PageUtils.inAppWebview(\n            '${HttpString.baseUrl}/read/mobile-readlist/rl${_controller.id}',\n          ),\n          icon: const Icon(Icons.open_in_browser_outlined, size: 19),\n        ),\n        const SizedBox(width: 10),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/article_list/widgets/item.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/stat/stat.dart';\nimport 'package:PiliPlus/models/common/stat_type.dart';\nimport 'package:PiliPlus/models_new/article/article_list/article.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\nimport 'package:get/get.dart';\n\nclass ArticleListItem extends StatelessWidget {\n  const ArticleListItem({\n    super.key,\n    required this.item,\n  });\n\n  final ArticleListItemModel item;\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onTap: () {\n          final dynIdStr = item.dynIdStr;\n          Get.toNamed(\n            '/articlePage',\n            parameters: {\n              'id': dynIdStr ?? item.id!.toString(),\n              'type': dynIdStr != null ? 'opus' : 'read',\n            },\n          );\n        },\n        child: Padding(\n          padding: const EdgeInsets.symmetric(\n            horizontal: StyleString.safeSpace,\n            vertical: 5,\n          ),\n          child: Row(\n            spacing: 10,\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              if (item.imageUrls?.isNotEmpty == true)\n                AspectRatio(\n                  aspectRatio: StyleString.aspectRatio,\n                  child: LayoutBuilder(\n                    builder: (context, boxConstraints) {\n                      return NetworkImgLayer(\n                        src: item.imageUrls!.first,\n                        width: boxConstraints.maxWidth,\n                        height: boxConstraints.maxHeight,\n                      );\n                    },\n                  ),\n                ),\n              Expanded(\n                child: Column(\n                  mainAxisSize: MainAxisSize.min,\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    Text(\n                      item.title!,\n                      style: const TextStyle(\n                        fontSize: 14,\n                        height: 1.42,\n                        letterSpacing: 0.3,\n                      ),\n                      maxLines: 2,\n                      overflow: TextOverflow.ellipsis,\n                    ),\n                    const SizedBox(height: 3),\n                    if (item.summary != null)\n                      Text(\n                        item.summary!,\n                        style: TextStyle(\n                          fontSize: 12,\n                          color: theme.colorScheme.outline,\n                        ),\n                        maxLines: 1,\n                        overflow: TextOverflow.ellipsis,\n                      ),\n                    const Spacer(),\n                    Row(\n                      spacing: 16,\n                      children: [\n                        StatWidget(\n                          value: item.stats?.view,\n                          color: theme.colorScheme.outline,\n                          type: StatType.view,\n                        ),\n                        StatWidget(\n                          type: StatType.like,\n                          value: item.stats?.like,\n                          color: theme.colorScheme.outline,\n                        ),\n                        StatWidget(\n                          type: StatType.reply,\n                          value: item.stats?.reply,\n                          color: theme.colorScheme.outline,\n                        ),\n                      ],\n                    ),\n                  ],\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/audio/controller.dart",
    "content": "import 'dart:async';\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/grpc/audio.dart';\nimport 'package:PiliPlus/grpc/bilibili/app/listener/v1.pb.dart'\n    show\n        DetailItem,\n        PlayURLResp,\n        PlaylistSource,\n        PlayInfo,\n        ThumbUpReq_ThumbType,\n        ListOrder,\n        DashItem,\n        ResponseUrl;\nimport 'package:PiliPlus/http/browser_ua.dart';\nimport 'package:PiliPlus/http/constants.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/pages/common/common_intro_controller.dart'\n    show FavMixin;\nimport 'package:PiliPlus/pages/dynamics_repost/view.dart';\nimport 'package:PiliPlus/pages/main_reply/view.dart';\nimport 'package:PiliPlus/pages/sponsor_block/block_mixin.dart';\nimport 'package:PiliPlus/pages/video/controller.dart';\nimport 'package:PiliPlus/pages/video/introduction/ugc/widgets/triple_mixin.dart';\nimport 'package:PiliPlus/pages/video/pay_coins/view.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/play_repeat.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/play_status.dart';\nimport 'package:PiliPlus/services/service_locator.dart';\nimport 'package:PiliPlus/services/shutdown_timer_service.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/global_data.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:PiliPlus/utils/video_utils.dart';\nimport 'package:fixnum/fixnum.dart' show Int64;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:media_kit/media_kit.dart';\n\nclass AudioController extends GetxController\n    with\n        GetTickerProviderStateMixin,\n        TripleMixin,\n        FavMixin,\n        BlockConfigMixin,\n        BlockMixin {\n  late Int64 id;\n  late Int64 oid;\n  late List<Int64> subId;\n  late int itemType;\n  Int64? extraId;\n  late final PlaylistSource from;\n  @override\n  late final bool isUgc = itemType == 1;\n\n  final audioItem = Rxn<DetailItem>();\n\n  bool _hasInit = false;\n  @override\n  Player? player;\n  late int cacheAudioQa;\n\n  late bool isDragging = false;\n  final Rx<Duration> position = Duration.zero.obs;\n  final Rx<Duration> duration = Duration.zero.obs;\n\n  late final AnimationController animController;\n\n  List<StreamSubscription>? _subscriptions;\n\n  int? index;\n  List<DetailItem>? playlist;\n\n  late double speed = 1.0;\n\n  late final Rx<PlayRepeat> playMode = Pref.audioPlayMode.obs;\n\n  late final isLogin = Accounts.main.isLogin;\n\n  Duration? _start;\n  VideoDetailController? _videoDetailController;\n\n  String? _prev;\n  String? _next;\n  bool get reachStart => _prev == null;\n\n  ListOrder order = ListOrder.ORDER_NORMAL;\n\n  @override\n  void onInit() {\n    super.onInit();\n    final args = Get.arguments;\n    oid = Int64(args['oid']);\n    final id = args['id'];\n    this.id = id != null ? Int64(id) : oid;\n    subId = (args['subId'] as List<int>?)?.map(Int64.new).toList() ?? [oid];\n    itemType = args['itemType'];\n    from = args['from'];\n    _start = args['start'];\n    final int? extraId = args['extraId'];\n    if (extraId != null) {\n      this.extraId = Int64(extraId);\n    }\n    if (args['heroTag'] case String heroTag) {\n      try {\n        _videoDetailController = Get.find<VideoDetailController>(tag: heroTag);\n      } catch (_) {}\n    }\n\n    _queryPlayList(isInit: true);\n\n    final String? audioUrl = args['audioUrl'];\n    final hasAudioUrl = audioUrl != null;\n    if (hasAudioUrl) {\n      _querySponsorBlock();\n      _onOpenMedia(audioUrl, ua: BrowserUa.pc, referer: HttpString.baseUrl);\n    }\n    Utils.isWiFi.then((isWiFi) {\n      cacheAudioQa = isWiFi ? Pref.defaultAudioQa : Pref.defaultAudioQaCellular;\n      if (!hasAudioUrl) {\n        _queryPlayUrl();\n      }\n    });\n    videoPlayerServiceHandler\n      ?..onPlay = onPlay\n      ..onPause = onPause\n      ..onSeek = onSeek;\n\n    animController = AnimationController(\n      vsync: this,\n      duration: const Duration(milliseconds: 200),\n    );\n\n    if (shutdownTimerService.isActive) {\n      shutdownTimerService\n        ..onPause = onPause\n        ..isPlaying = isPlaying;\n    }\n  }\n\n  bool isPlaying() {\n    return player?.state.playing ?? false;\n  }\n\n  Future<void>? onPlay() {\n    return player?.play();\n  }\n\n  Future<void>? onPause() {\n    return player?.pause();\n  }\n\n  Future<void>? onSeek(Duration duration) {\n    return player?.seek(duration);\n  }\n\n  void _updateCurrItem(DetailItem item) {\n    audioItem.value = item;\n    hasLike.value = item.stat.hasLike_7;\n    coinNum.value = item.stat.hasCoin_8 ? 2 : 0;\n    hasFav.value = item.stat.hasFav;\n    videoPlayerServiceHandler?.onVideoDetailChange(\n      item,\n      (subId.firstOrNull ?? oid).toInt(),\n      hashCode.toString(),\n    );\n  }\n\n  Future<void> _queryPlayList({\n    bool isInit = false,\n    bool isLoadPrev = false,\n    bool isLoadNext = false,\n  }) async {\n    final res = await AudioGrpc.audioPlayList(\n      id: id,\n      oid: isInit ? oid : null,\n      subId: isInit ? subId : null,\n      itemType: isInit ? itemType : null,\n      from: isInit ? from : null,\n      next: isLoadPrev\n          ? _prev\n          : isLoadNext\n          ? _next\n          : null,\n      extraId: extraId,\n      order: order,\n    );\n    if (res case Success(:final response)) {\n      if (isInit) {\n        late final paginationReply = response.paginationReply;\n        _prev = response.reachStart ? null : paginationReply.prev;\n        _next = response.reachEnd ? null : paginationReply.next;\n        final index = response.list.indexWhere((e) => e.item.oid == oid);\n        if (index != -1) {\n          this.index = index;\n          _updateCurrItem(response.list[index]);\n          playlist = response.list;\n        }\n      } else if (isLoadPrev) {\n        _prev = response.reachStart ? null : response.paginationReply.prev;\n        if (response.list.isNotEmpty) {\n          index += response.list.length;\n          playlist?.insertAll(0, response.list);\n        }\n      } else if (isLoadNext) {\n        _next = response.reachEnd ? null : response.paginationReply.next;\n        if (response.list.isNotEmpty) {\n          playlist?.addAll(response.list);\n        }\n      }\n    } else {\n      res.toast();\n    }\n  }\n\n  @pragma('vm:notify-debugger-on-exception')\n  void _querySponsorBlock() {\n    if (isUgc && enableSponsorBlock) {\n      try {\n        final bvid = IdUtils.av2bv(oid.toInt());\n        final cid = subId.first.toInt();\n        querySponsorBlock(bvid: bvid, cid: cid);\n      } catch (_) {}\n    }\n  }\n\n  Future<bool> _queryPlayUrl() async {\n    _querySponsorBlock();\n    final res = await AudioGrpc.audioPlayUrl(\n      itemType: itemType,\n      oid: oid,\n      subId: subId,\n    );\n    if (res case Success(:final response)) {\n      _onPlay(response);\n      return true;\n    } else {\n      res.toast();\n      return false;\n    }\n  }\n\n  void _onPlay(PlayURLResp data) {\n    final PlayInfo? playInfo = data.playerInfo.values.firstOrNull;\n    if (playInfo != null) {\n      if (playInfo.hasPlayDash()) {\n        final playDash = playInfo.playDash;\n        final audios = playDash.audio;\n        if (audios.isEmpty) {\n          return;\n        }\n        position.value = Duration.zero;\n        final audio = audios.findClosestTarget(\n          (e) => e.id <= cacheAudioQa,\n          (a, b) => a.id > b.id ? a : b,\n        );\n        _onOpenMedia(VideoUtils.getCdnUrl(audio.playUrls));\n      } else if (playInfo.hasPlayUrl()) {\n        final playUrl = playInfo.playUrl;\n        final durls = playUrl.durl;\n        if (durls.isEmpty) {\n          return;\n        }\n        final durl = durls.first;\n        position.value = Duration.zero;\n        _onOpenMedia(VideoUtils.getCdnUrl(durl.playUrls));\n      }\n    }\n  }\n\n  Future<void> _onOpenMedia(\n    String url, {\n    String ua = Constants.userAgentApp,\n    String? referer,\n  }) async {\n    await _initPlayerIfNeeded();\n    player\n      ?..setMediaHeader(\n        userAgent: ua,\n        // mpv cannot clear referer option\n        headers: {'Referer': ?referer},\n      )\n      ..open(Media(url, start: _start));\n    _start = null;\n  }\n\n  Future<void> _initPlayerIfNeeded() async {\n    if (_hasInit) return;\n    _hasInit = true;\n    assert(player == null, _subscriptions = null);\n    player = await Player.create();\n    if (isClosed) {\n      player!.dispose();\n      player = null;\n      return;\n    }\n    final stream = player!.stream;\n    _subscriptions = [\n      stream.position.listen((position) {\n        if (isDragging) return;\n        if (position.inSeconds != this.position.value.inSeconds) {\n          this.position.value = position;\n          _videoDetailController?.playedTime = position;\n          videoPlayerServiceHandler?.onPositionChange(position);\n        }\n      }),\n      stream.duration.listen(duration.call),\n      stream.playing.listen((playing) {\n        final PlayerStatus playerStatus;\n        if (playing) {\n          animController.forward();\n          playerStatus = PlayerStatus.playing;\n        } else {\n          animController.reverse();\n          playerStatus = PlayerStatus.paused;\n        }\n        videoPlayerServiceHandler?.onStatusChange(playerStatus, false, false);\n      }),\n      stream.completed.listen((completed) {\n        _videoDetailController?.playedTime = duration.value;\n        videoPlayerServiceHandler?.onStatusChange(\n          PlayerStatus.completed,\n          false,\n          false,\n        );\n        if (completed) {\n          if (shutdownTimerService.isWaiting) {\n            shutdownTimerService.handleWaiting();\n          } else {\n            switch (playMode.value) {\n              case PlayRepeat.pause:\n                break;\n              case PlayRepeat.listOrder:\n                playNext(nextPart: true);\n                break;\n              case PlayRepeat.singleCycle:\n                onPlay();\n                break;\n              case PlayRepeat.listCycle:\n                if (!playNext(nextPart: true)) {\n                  if (index != null && index != 0 && playlist != null) {\n                    playIndex(0);\n                  } else {\n                    onPlay();\n                  }\n                }\n                break;\n              case PlayRepeat.autoPlayRelated:\n                break;\n            }\n          }\n        }\n      }),\n    ];\n  }\n\n  @override\n  Future<void> actionLikeVideo() async {\n    if (!isLogin) {\n      SmartDialog.showToast('账号未登录');\n      return;\n    }\n    final newVal = !hasLike.value;\n    final res = await AudioGrpc.audioThumbUp(\n      oid: oid,\n      subId: subId,\n      itemType: itemType,\n      type: newVal\n          ? ThumbUpReq_ThumbType.LIKE\n          : ThumbUpReq_ThumbType.CANCEL_LIKE,\n    );\n    if (res case Success(:final response)) {\n      hasLike.value = newVal;\n      try {\n        audioItem.value!.stat\n          ..hasLike_7 = newVal\n          ..like += newVal ? 1 : -1;\n        audioItem.refresh();\n      } catch (_) {}\n      SmartDialog.showToast(response.message);\n    } else {\n      res.toast();\n    }\n  }\n\n  @override\n  Future<void> actionTriple() async {\n    if (!isLogin) {\n      SmartDialog.showToast('账号未登录');\n      return;\n    }\n    final res = await AudioGrpc.audioTripleLike(\n      oid: oid,\n      subId: subId,\n      itemType: itemType,\n    );\n    if (res case Success(:final response)) {\n      hasLike.value = true;\n      if (response.coinOk && !hasCoin) {\n        coinNum.value = 2;\n        GlobalData().afterCoin(2);\n        try {\n          audioItem.value!.stat\n            ..hasCoin_8 = true\n            ..coin += 2;\n          audioItem.refresh();\n        } catch (_) {}\n      }\n      hasFav.value = true;\n      if (!hasCoin) {\n        SmartDialog.showToast('投币失败');\n      } else {\n        SmartDialog.showToast('三连成功');\n      }\n    } else {\n      res.toast();\n    }\n  }\n\n  void actionCoinVideo() {\n    final audioItem = this.audioItem.value;\n    if (audioItem == null) {\n      return;\n    }\n\n    if (!isLogin) {\n      SmartDialog.showToast('账号未登录');\n      return;\n    }\n\n    final int copyright = audioItem.arc.copyright;\n    if ((copyright != 1 && coinNum.value >= 1) || coinNum.value >= 2) {\n      SmartDialog.showToast('达到投币上限啦~');\n      return;\n    }\n\n    if (GlobalData().coins != null && GlobalData().coins! < 1) {\n      SmartDialog.showToast('硬币不足');\n      // return;\n    }\n\n    PayCoinsPage.toPayCoinsPage(\n      onPayCoin: _onPayCoin,\n      hasCoin: coinNum.value == 1,\n      copyright: copyright,\n    );\n  }\n\n  Future<void> _onPayCoin(int coin, bool coinWithLike) async {\n    final res = await AudioGrpc.audioCoinAdd(\n      oid: oid,\n      subId: subId,\n      itemType: itemType,\n      num: coin,\n      thumbUp: coinWithLike,\n    );\n    if (res.isSuccess) {\n      final updateLike = !hasLike.value && coinWithLike;\n      if (updateLike) {\n        hasLike.value = true;\n      }\n      coinNum.value += coin;\n      try {\n        final stat = audioItem.value!.stat\n          ..hasCoin_8 = true\n          ..coin += coin;\n        if (updateLike) {\n          stat\n            ..hasLike_7 = true\n            ..like += 1;\n        }\n        audioItem.refresh();\n      } catch (_) {}\n      GlobalData().afterCoin(coin);\n    } else {\n      res.toast();\n    }\n  }\n\n  @override\n  void showFavBottomSheet(BuildContext context, {bool isLongPress = false}) {\n    if (!isLogin) {\n      SmartDialog.showToast('账号未登录');\n      return;\n    }\n    if (enableQuickFav) {\n      if (!isLongPress) {\n        actionFavVideo(isQuick: true);\n      } else {\n        PageUtils.showFavBottomSheet(context: context, ctr: this);\n      }\n    } else if (!isLongPress) {\n      PageUtils.showFavBottomSheet(context: context, ctr: this);\n    }\n  }\n\n  void showReply() {\n    MainReplyPage.toMainReplyPage(\n      oid: oid.toInt(),\n      replyType: isUgc ? 1 : 14,\n    );\n  }\n\n  void actionShareVideo(BuildContext context) {\n    final audioUrl = isUgc\n        ? '${HttpString.baseUrl}/video/${IdUtils.av2bv(oid.toInt())}'\n        : '${HttpString.baseUrl}/audio/au$oid';\n    showDialog(\n      context: context,\n      builder: (_) => AlertDialog(\n        clipBehavior: Clip.hardEdge,\n        contentPadding: const EdgeInsets.symmetric(vertical: 12),\n        content: Column(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            ListTile(\n              dense: true,\n              title: const Text(\n                '复制链接',\n                style: TextStyle(fontSize: 14),\n              ),\n              onTap: () {\n                Get.back();\n                Utils.copyText(audioUrl);\n              },\n            ),\n            ListTile(\n              dense: true,\n              title: const Text(\n                '其它app打开',\n                style: TextStyle(fontSize: 14),\n              ),\n              onTap: () {\n                Get.back();\n                PageUtils.launchURL(audioUrl);\n              },\n            ),\n            if (PlatformUtils.isMobile)\n              ListTile(\n                dense: true,\n                title: const Text(\n                  '分享视频',\n                  style: TextStyle(fontSize: 14),\n                ),\n                onTap: () {\n                  Get.back();\n                  if (audioItem.value case DetailItem(\n                    :final arc,\n                    :final owner,\n                  )) {\n                    Utils.shareText(\n                      '${arc.title} '\n                      'UP主: ${owner.name}'\n                      ' - $audioUrl',\n                    );\n                  }\n                },\n              ),\n            ListTile(\n              dense: true,\n              title: const Text(\n                '分享至动态',\n                style: TextStyle(fontSize: 14),\n              ),\n              onTap: () {\n                Get.back();\n                if (audioItem.value case DetailItem(\n                  :final arc,\n                  :final owner,\n                )) {\n                  showModalBottomSheet(\n                    context: context,\n                    isScrollControlled: true,\n                    useSafeArea: true,\n                    builder: (context) => RepostPanel(\n                      rid: oid.toInt(),\n                      dynType: isUgc ? 8 : 256,\n                      pic: arc.cover,\n                      title: arc.title,\n                      uname: owner.name,\n                    ),\n                  );\n                }\n              },\n            ),\n            if (isUgc)\n              ListTile(\n                dense: true,\n                title: const Text(\n                  '分享至消息',\n                  style: TextStyle(fontSize: 14),\n                ),\n                onTap: () {\n                  Get.back();\n                  if (audioItem.value case DetailItem(\n                    :final arc,\n                    :final owner,\n                  )) {\n                    try {\n                      PageUtils.pmShare(\n                        context,\n                        content: {\n                          \"id\": oid.toString(),\n                          \"title\": arc.title,\n                          \"headline\": arc.title,\n                          \"source\": 5,\n                          \"thumb\": arc.cover,\n                          \"author\": owner.name,\n                          \"author_id\": owner.mid.toString(),\n                        },\n                      );\n                    } catch (e) {\n                      SmartDialog.showToast(e.toString());\n                    }\n                  }\n                },\n              ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  void playOrPause() {\n    if (player case final player?) {\n      if ((duration.value - position.value).inMilliseconds < 50) {\n        player.seek(Duration.zero).whenComplete(player.play);\n      } else {\n        player.playOrPause();\n      }\n    }\n  }\n\n  bool playPrev() {\n    if (index != null && playlist != null && player != null) {\n      final prev = index! - 1;\n      if (prev >= 0) {\n        playIndex(prev);\n        return true;\n      }\n    }\n    return false;\n  }\n\n  bool playNext({bool nextPart = false}) {\n    if (nextPart) {\n      if (audioItem.value case DetailItem(:final parts)) {\n        if (parts.length > 1) {\n          final subId = this.subId.firstOrNull;\n          final nextIndex = parts.indexWhere((e) => e.subId == subId) + 1;\n          if (nextIndex != 0 && nextIndex < parts.length) {\n            final nextPart = parts[nextIndex];\n            oid = nextPart.oid;\n            this.subId = [nextPart.subId];\n            _queryPlayUrl().then((res) {\n              if (res) {\n                _videoDetailController = null;\n              }\n            });\n            return true;\n          }\n        }\n      }\n    }\n    if (index != null && playlist != null && player != null) {\n      final next = index! + 1;\n      if (next < playlist!.length) {\n        if (next == playlist!.length - 1 && _next != null) {\n          _queryPlayList(isLoadNext: true);\n        }\n        playIndex(next);\n        return true;\n      }\n    }\n    return false;\n  }\n\n  void playIndex(int index, {List<Int64>? subId}) {\n    if (index == this.index && subId == null) return;\n    this.index = index;\n    final audioItem = playlist![index];\n    final item = audioItem.item;\n    oid = item.oid;\n    this.subId =\n        subId ??\n        (item.subId.isNotEmpty ? item.subId : [audioItem.parts.first.subId]);\n    itemType = item.itemType;\n    _queryPlayUrl().then((res) {\n      if (res) {\n        _videoDetailController = null;\n        _updateCurrItem(audioItem);\n      }\n    });\n  }\n\n  void setSpeed(double speed) {\n    if (player case final player?) {\n      this.speed = speed;\n      player.setRate(speed);\n    }\n  }\n\n  @override\n  (Object, int) get getFavRidType => (oid, isUgc ? 2 : 12);\n\n  @override\n  void updateFavCount(int count) {\n    try {\n      audioItem.value!.stat\n        ..hasFav = count > 0\n        ..favourite += count;\n      audioItem.refresh();\n    } catch (_) {}\n  }\n\n  Future<void> loadPrev(BuildContext context) async {\n    if (_prev == null) return;\n    final length = playlist!.length;\n    await _queryPlayList(isLoadPrev: true);\n    if (length != playlist!.length && context.mounted) {\n      (context as Element).markNeedsBuild();\n    }\n  }\n\n  Future<void> loadNext(BuildContext context) async {\n    if (_next == null) return;\n    final length = playlist!.length;\n    await _queryPlayList(isLoadNext: true);\n    if (length != playlist!.length && context.mounted) {\n      (context as Element).markNeedsBuild();\n    }\n  }\n\n  void onChangeOrder(ListOrder value) {\n    if (order != value) {\n      order = value;\n      _queryPlayList(isInit: true);\n    }\n  }\n\n  @override\n  BlockConfigMixin get blockConfig => this;\n\n  @override\n  int get currPosInMilliseconds => position.value.inMilliseconds;\n\n  @override\n  Future<void>? seekTo(Duration duration, {required bool isSeek}) =>\n      onSeek(duration);\n\n  @override\n  int? get timeLength => duration.value.inMilliseconds;\n\n  @override\n  bool get autoPlay => true;\n\n  @override\n  bool get preInitPlayer => true;\n\n  @override\n  void onClose() {\n    shutdownTimerService\n      ..onPause = null\n      ..isPlaying = null\n      ..reset();\n    videoPlayerServiceHandler\n      ?..onPlay = null\n      ..onPause = null\n      ..onSeek = null\n      ..onVideoDetailDispose(hashCode.toString());\n    _subscriptions?.forEach((e) => e.cancel());\n    _subscriptions?.clear();\n    _subscriptions = null;\n    player?.dispose();\n    player = null;\n    animController.dispose();\n    super.onClose();\n  }\n}\n\nextension on DashItem {\n  Iterable<String> get playUrls sync* {\n    yield baseUrl;\n    yield* backupUrl;\n  }\n}\n\nextension on ResponseUrl {\n  Iterable<String> get playUrls sync* {\n    yield url;\n    yield* backupUrl;\n  }\n}\n"
  },
  {
    "path": "lib/pages/audio/view.dart",
    "content": "import 'dart:math' show min;\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/gesture/tap_gesture_recognizer.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/image_viewer/hero.dart';\nimport 'package:PiliPlus/common/widgets/progress_bar/audio_video_progress_bar.dart';\nimport 'package:PiliPlus/common/widgets/progress_bar/segment_progress_bar.dart';\nimport 'package:PiliPlus/grpc/bilibili/app/listener/v1.pb.dart';\nimport 'package:PiliPlus/models/common/image_preview_type.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/pages/audio/controller.dart';\nimport 'package:PiliPlus/pages/video/introduction/ugc/widgets/action_item.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/play_repeat.dart';\nimport 'package:PiliPlus/services/shutdown_timer_service.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/duration_utils.dart';\nimport 'package:PiliPlus/utils/extension/context_ext.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/extension/size_ext.dart';\nimport 'package:PiliPlus/utils/extension/string_ext.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart' hide DraggableScrollableSheet;\nimport 'package:font_awesome_flutter/font_awesome_flutter.dart';\nimport 'package:get/get.dart';\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\n\nclass AudioPage extends StatefulWidget {\n  const AudioPage({super.key});\n\n  @override\n  State<AudioPage> createState() => _AudioPageState();\n\n  static void toAudioPage({\n    int? id,\n    required int oid,\n    List<int>? subId,\n    required int itemType,\n    required PlaylistSource from,\n    String? heroTag,\n    Duration? start,\n    String? audioUrl,\n    int? extraId,\n  }) => Get.toNamed(\n    '/audio',\n    arguments: {\n      'id': ?id,\n      'oid': oid,\n      'subId': ?subId,\n      'from': from,\n      'itemType': itemType,\n      'heroTag': ?heroTag,\n      'start': ?start,\n      'audioUrl': ?audioUrl,\n      'extraId': ?extraId,\n    },\n  );\n}\n\nextension _ListOrderExt on ListOrder {\n  String get title => const ['无序', '正序', '倒序', '随机'][value];\n}\n\nclass _AudioPageState extends State<AudioPage> {\n  final _controller = Get.put(\n    AudioController(),\n    tag: Utils.generateRandomString(8),\n  );\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    _controller.didChangeDependencies(context);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final colorScheme = ColorScheme.of(context);\n    final isPortrait = MediaQuery.sizeOf(context).isPortrait;\n    final padding = MediaQuery.viewPaddingOf(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        actions: [\n          if (_controller.isUgc && _controller.enableSponsorBlock)\n            Obx(() {\n              if (_controller.segmentProgressList.isNotEmpty) {\n                return IconButton(\n                  tooltip: '片段信息',\n                  onPressed: _controller.showSBDetail,\n                  icon: const Icon(MdiIcons.advertisements, size: 22),\n                );\n              }\n              return const SizedBox.shrink();\n            }),\n          Builder(\n            builder: (context) {\n              return PopupMenuButton<ListOrder>(\n                tooltip: '排序',\n                icon: const Icon(Icons.sort, size: 22),\n                initialValue: _controller.order,\n                onSelected: (value) {\n                  _controller.onChangeOrder(value);\n                  (context as Element).markNeedsBuild();\n                },\n                itemBuilder: (context) => ListOrder.values\n                    .map((e) => PopupMenuItem(value: e, child: Text(e.title)))\n                    .toList(),\n              );\n            },\n          ),\n          IconButton(\n            tooltip: '定时关闭',\n            onPressed: () => shutdownTimerService\n              ..onPause ??= _controller.onPause\n              ..isPlaying ??= _controller.isPlaying\n              ..showScheduleExitDialog(\n                context,\n                isFullScreen: false,\n              ),\n            icon: const Icon(Icons.schedule, size: 22),\n          ),\n          if (_controller.isUgc)\n            IconButton(\n              tooltip: '更多',\n              onPressed: _showMore,\n              icon: const Icon(Icons.more_vert, size: 22),\n            ),\n          const SizedBox(width: 5),\n        ],\n      ),\n      body: Padding(\n        padding: EdgeInsets.only(\n          left: 20 + padding.left,\n          right: 20 + padding.right,\n          bottom: 30 + padding.bottom,\n        ),\n        child: isPortrait\n            ? Column(\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  Expanded(child: _buildInfo(colorScheme, isPortrait)),\n                  const SizedBox(height: 25),\n                  _buildProgressBar(colorScheme),\n                  _buildDuration(colorScheme),\n                  _buildControls(),\n                ],\n              )\n            : Row(\n                spacing: 12,\n                children: [\n                  Expanded(\n                    child: _buildInfo(colorScheme, isPortrait),\n                  ),\n                  Expanded(\n                    child: Column(\n                      mainAxisAlignment: MainAxisAlignment.center,\n                      crossAxisAlignment: CrossAxisAlignment.start,\n                      children: [\n                        Obx(() {\n                          final audioItem = _controller.audioItem.value;\n                          if (audioItem != null) {\n                            return _buildActions(audioItem);\n                          }\n                          return const SizedBox.shrink();\n                        }),\n                        const SizedBox(height: 25),\n                        _buildProgressBar(colorScheme),\n                        _buildDuration(colorScheme),\n                        _buildControls(),\n                      ],\n                    ),\n                  ),\n                ],\n              ),\n      ),\n    );\n  }\n\n  void _showPlaylist() {\n    if (_controller.playlist case final playlist?) {\n      final initialScrollOffset = 45.0 * _controller.index!;\n      final scrollController = ScrollController(\n        initialScrollOffset: initialScrollOffset,\n      );\n      showModalBottomSheet(\n        context: context,\n        useSafeArea: true,\n        isScrollControlled: true,\n        constraints: BoxConstraints(\n          maxWidth: min(640, context.mediaQueryShortestSide),\n        ),\n        builder: (context) {\n          final theme = Theme.of(context);\n          final colorScheme = theme.colorScheme;\n          Widget child = CustomScrollView(\n            controller: scrollController,\n            physics: _controller.reachStart\n                ? null\n                : const AlwaysScrollableScrollPhysics(),\n            slivers: [\n              SliverPadding(\n                padding: EdgeInsets.only(\n                  bottom: MediaQuery.paddingOf(context).bottom + 100,\n                ),\n                sliver: SliverList.builder(\n                  itemCount: playlist.length,\n                  itemBuilder: (_, index) {\n                    if (index == playlist.length - 1) {\n                      _controller.loadNext(context);\n                    }\n                    final isCurr = index == _controller.index;\n                    final item = playlist[index];\n                    if (item.parts.length > 1) {\n                      final subId = _controller.subId.firstOrNull;\n                      return ExpansionTile(\n                        dense: true,\n                        minTileHeight: 45,\n                        initiallyExpanded: isCurr,\n                        collapsedIconColor: isCurr ? colorScheme.primary : null,\n                        iconColor: isCurr ? null : colorScheme.onSurfaceVariant,\n                        controlAffinity: ListTileControlAffinity.leading,\n                        title: Text(\n                          item.arc.title,\n                          maxLines: 1,\n                          overflow: TextOverflow.ellipsis,\n                          style: isCurr\n                              ? TextStyle(\n                                  fontSize: 14,\n                                  color: colorScheme.primary,\n                                  fontWeight: FontWeight.bold,\n                                )\n                              : const TextStyle(fontSize: 14),\n                        ),\n                        trailing: isCurr\n                            ? null\n                            : iconButton(\n                                icon: const Icon(Icons.clear),\n                                onPressed: () {\n                                  if (index < _controller.index!) {\n                                    _controller.index -= 1;\n                                  }\n                                  playlist.removeAt(index);\n                                  (context as Element).markNeedsBuild();\n                                },\n                                iconColor: colorScheme.outline,\n                                size: 28,\n                                iconSize: 18,\n                              ),\n                        children: item.parts.map((e) {\n                          final isCurr = e.subId == subId;\n                          return ListTile(\n                            dense: true,\n                            minTileHeight: 45,\n                            contentPadding: const EdgeInsetsDirectional.only(\n                              start: 56.0,\n                              end: 24.0,\n                            ),\n                            onTap: () {\n                              Get.back();\n                              if (!isCurr) {\n                                _controller.playIndex(\n                                  index,\n                                  subId: [e.subId],\n                                );\n                              }\n                            },\n                            title: Text.rich(\n                              maxLines: 1,\n                              overflow: TextOverflow.ellipsis,\n                              style: isCurr\n                                  ? TextStyle(\n                                      fontSize: 14,\n                                      color: colorScheme.primary,\n                                      fontWeight: FontWeight.bold,\n                                    )\n                                  : TextStyle(\n                                      fontSize: 14,\n                                      color: colorScheme.onSurfaceVariant,\n                                    ),\n                              TextSpan(\n                                children: [\n                                  if (isCurr) ...[\n                                    WidgetSpan(\n                                      alignment: .bottom,\n                                      child: Image.asset(\n                                        'assets/images/live.gif',\n                                        width: 16,\n                                        height: 16,\n                                        cacheWidth: 16.cacheSize(\n                                          context,\n                                        ),\n                                        color: colorScheme.primary,\n                                      ),\n                                    ),\n                                    const TextSpan(text: '  '),\n                                  ],\n                                  TextSpan(text: e.title),\n                                ],\n                              ),\n                            ),\n                          );\n                        }).toList(),\n                      );\n                    }\n                    return ListTile(\n                      dense: true,\n                      minTileHeight: 45,\n                      onTap: () {\n                        Get.back();\n                        if (!isCurr) {\n                          _controller.playIndex(index);\n                        }\n                      },\n                      title: Text.rich(\n                        maxLines: 1,\n                        overflow: TextOverflow.ellipsis,\n                        style: isCurr\n                            ? TextStyle(\n                                fontSize: 14,\n                                color: colorScheme.primary,\n                                fontWeight: FontWeight.bold,\n                              )\n                            : const TextStyle(fontSize: 14),\n                        TextSpan(\n                          children: [\n                            if (isCurr) ...[\n                              WidgetSpan(\n                                alignment: .bottom,\n                                child: Image.asset(\n                                  'assets/images/live.gif',\n                                  width: 16,\n                                  height: 16,\n                                  cacheWidth: 16.cacheSize(\n                                    context,\n                                  ),\n                                  color: colorScheme.primary,\n                                ),\n                              ),\n                              const TextSpan(text: '  '),\n                            ],\n                            TextSpan(\n                              text: item.arc.title,\n                            ),\n                          ],\n                        ),\n                      ),\n                      trailing: isCurr\n                          ? null\n                          : iconButton(\n                              icon: const Icon(Icons.clear),\n                              onPressed: () {\n                                if (index < _controller.index!) {\n                                  _controller.index -= 1;\n                                }\n                                playlist.removeAt(index);\n                                (context as Element).markNeedsBuild();\n                              },\n                              iconColor: colorScheme.outline,\n                              size: 28,\n                              iconSize: 18,\n                            ),\n                    );\n                  },\n                ),\n              ),\n            ],\n          );\n          if (!_controller.reachStart) {\n            child = refreshIndicator(\n              onRefresh: () => _controller.loadPrev(context),\n              isClampingScrollPhysics: true,\n              child: child,\n            );\n          }\n          return FractionallySizedBox(\n            heightFactor:\n                PlatformUtils.isMobile && !context.mediaQuerySize.isPortrait\n                ? 1.0\n                : 0.7,\n            alignment: Alignment.bottomCenter,\n            child: Column(\n              children: [\n                InkWell(\n                  onTap: Get.back,\n                  borderRadius: StyleString.bottomSheetRadius,\n                  child: SizedBox(\n                    height: 35,\n                    child: Center(\n                      child: Container(\n                        width: 32,\n                        height: 3,\n                        decoration: BoxDecoration(\n                          color: colorScheme.outline,\n                          borderRadius: const .all(.circular(3)),\n                        ),\n                      ),\n                    ),\n                  ),\n                ),\n                Expanded(\n                  child: Material(\n                    type: MaterialType.transparency,\n                    child: Theme(\n                      data: theme.copyWith(dividerColor: Colors.transparent),\n                      child: child,\n                    ),\n                  ),\n                ),\n                Divider(\n                  height: 1,\n                  color: colorScheme.outline.withValues(alpha: 0.1),\n                ),\n                Padding(\n                  padding: EdgeInsets.only(\n                    bottom: MediaQuery.viewPaddingOf(context).bottom,\n                  ),\n                  child: InkWell(\n                    onTap: Get.back,\n                    child: SizedBox(\n                      height: 45,\n                      child: Center(\n                        child: Text(\n                          '关闭',\n                          style: TextStyle(color: colorScheme.outline),\n                        ),\n                      ),\n                    ),\n                  ),\n                ),\n              ],\n            ),\n          );\n        },\n      ).whenComplete(scrollController.dispose);\n    }\n  }\n\n  void _showPlaySettings() {\n    showModalBottomSheet(\n      context: context,\n      useSafeArea: true,\n      isScrollControlled: true,\n      constraints: BoxConstraints(\n        maxWidth: min(640, context.mediaQueryShortestSide),\n      ),\n      builder: (context) {\n        final colorScheme = ColorScheme.of(context);\n        return Column(\n          mainAxisSize: MainAxisSize.min,\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            InkWell(\n              onTap: Get.back,\n              borderRadius: StyleString.bottomSheetRadius,\n              child: SizedBox(\n                height: 35,\n                child: Center(\n                  child: Container(\n                    width: 32,\n                    height: 3,\n                    decoration: BoxDecoration(\n                      color: colorScheme.outline,\n                      borderRadius: const BorderRadius.all(\n                        Radius.circular(3),\n                      ),\n                    ),\n                  ),\n                ),\n              ),\n            ),\n            Padding(\n              padding: EdgeInsets.only(\n                top: 12,\n                left: 20,\n                right: 20,\n                bottom: MediaQuery.viewPaddingOf(context).bottom + 20,\n              ),\n              child: Column(\n                spacing: 12,\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  Builder(\n                    builder: (context) => Column(\n                      spacing: 12,\n                      crossAxisAlignment: CrossAxisAlignment.start,\n                      children: [\n                        Text('播放倍速(${_controller.speed})'),\n                        Slider(\n                          padding: EdgeInsets.zero,\n                          min: 0.5,\n                          max: 2.0,\n                          divisions: 15,\n                          value: _controller.speed,\n                          onChanged: (value) {\n                            _controller.speed = value.toPrecision(1);\n                            (context as Element).markNeedsBuild();\n                          },\n                          onChangeEnd: (_) =>\n                              _controller.setSpeed(_controller.speed),\n                        ),\n                      ],\n                    ),\n                  ),\n                  const Text('播放模式'),\n                  Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceAround,\n                    children: PlayRepeat.values\n                        .take(4)\n                        .map(\n                          (e) => _playModeWidget(\n                            colorScheme: colorScheme,\n                            playMode: e,\n                          ),\n                        )\n                        .toList(),\n                  ),\n                ],\n              ),\n            ),\n          ],\n        );\n      },\n    );\n  }\n\n  Widget _playModeWidget({\n    required ColorScheme colorScheme,\n    required PlayRepeat playMode,\n  }) {\n    final isCurr = playMode == _controller.playMode.value;\n    final color = isCurr ? colorScheme.primary : colorScheme.outline;\n    return GestureDetector(\n      behavior: HitTestBehavior.opaque,\n      onTap: () {\n        Get.back();\n        if (!isCurr) {\n          _controller.playMode.value = playMode;\n          GStorage.setting.put(SettingBoxKey.audioPlayMode, playMode.index);\n        }\n      },\n      child: Column(\n        spacing: 6,\n        children: [\n          DecoratedBox(\n            decoration: BoxDecoration(\n              shape: BoxShape.circle,\n              color: isCurr\n                  ? colorScheme.primary.withValues(alpha: 0.15)\n                  : colorScheme.onInverseSurface.withValues(alpha: 0.8),\n            ),\n            child: SizedBox(\n              width: 40,\n              height: 40,\n              child: Icon(\n                size: 26,\n                playMode.icon,\n                color: color,\n              ),\n            ),\n          ),\n          Text(\n            playMode.label,\n            style: TextStyle(fontSize: 13, color: color),\n          ),\n        ],\n      ),\n    );\n  }\n\n  void _showMore() {\n    showModalBottomSheet(\n      context: context,\n      useSafeArea: true,\n      isScrollControlled: true,\n      constraints: BoxConstraints(\n        maxWidth: min(640, context.mediaQueryShortestSide),\n      ),\n      builder: (context) {\n        final colorScheme = ColorScheme.of(context);\n        return Padding(\n          padding: EdgeInsets.only(\n            bottom: MediaQuery.viewPaddingOf(context).bottom + 20,\n          ),\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              InkWell(\n                onTap: Get.back,\n                borderRadius: StyleString.bottomSheetRadius,\n                child: SizedBox(\n                  height: 35,\n                  child: Center(\n                    child: Container(\n                      width: 32,\n                      height: 3,\n                      decoration: BoxDecoration(\n                        color: colorScheme.outline,\n                        borderRadius: const BorderRadius.all(\n                          Radius.circular(3),\n                        ),\n                      ),\n                    ),\n                  ),\n                ),\n              ),\n              // ListTile(\n              //   dense: true,\n              //   title: const Text(\n              //     '定时关闭',\n              //     style: TextStyle(fontSize: 14),\n              //   ),\n              //   onTap: () {\n              //     Get.back();\n              //     _controller.showTimerDialog();\n              //   },\n              // ),\n              ListTile(\n                dense: true,\n                title: const Text(\n                  '举报',\n                  style: TextStyle(fontSize: 14),\n                ),\n                onTap: () {\n                  Get.back();\n                  PageUtils.reportVideo(_controller.oid.toInt());\n                },\n              ),\n            ],\n          ),\n        );\n      },\n    );\n  }\n\n  Widget _buildActions(DetailItem audioItem) {\n    return SizedBox(\n      height: 48,\n      child: Row(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          Obx(\n            () => ActionItem(\n              animation: _controller.tripleAnimation,\n              icon: const Icon(FontAwesomeIcons.thumbsUp),\n              selectIcon: const Icon(\n                FontAwesomeIcons.solidThumbsUp,\n              ),\n              selectStatus: _controller.hasLike.value,\n              semanticsLabel: '点赞',\n              text: NumUtils.numFormat(audioItem.stat.like),\n              onStartTriple: _controller.onStartTriple,\n              onCancelTriple: _controller.onCancelTriple,\n            ),\n          ),\n          Obx(\n            () => ActionItem(\n              animation: _controller.tripleAnimation,\n              icon: const Icon(FontAwesomeIcons.b),\n              selectIcon: const Icon(FontAwesomeIcons.b),\n              onTap: _controller.actionCoinVideo,\n              selectStatus: _controller.hasCoin,\n              semanticsLabel: '投币',\n              text: NumUtils.numFormat(\n                audioItem.stat.coin,\n              ),\n            ),\n          ),\n          Obx(\n            () => ActionItem(\n              animation: _controller.tripleAnimation,\n              icon: const Icon(FontAwesomeIcons.star),\n              selectIcon: const Icon(\n                FontAwesomeIcons.solidStar,\n              ),\n              onTap: () => _controller.showFavBottomSheet(context),\n              onLongPress: () => _controller.showFavBottomSheet(\n                context,\n                isLongPress: true,\n              ),\n              selectStatus: _controller.hasFav.value,\n              semanticsLabel: '收藏',\n              text: NumUtils.numFormat(\n                audioItem.stat.favourite,\n              ),\n            ),\n          ),\n          ActionItem(\n            icon: const Icon(FontAwesomeIcons.comment),\n            onTap: _controller.showReply,\n            semanticsLabel: '评论',\n            text: NumUtils.numFormat(\n              audioItem.stat.reply,\n            ),\n          ),\n          ActionItem(\n            icon: const Icon(\n              FontAwesomeIcons.shareFromSquare,\n            ),\n            onTap: () => _controller.actionShareVideo(context),\n            selectStatus: false,\n            semanticsLabel: '分享',\n            text: NumUtils.numFormat(\n              audioItem.stat.share,\n            ),\n          ),\n          if (audioItem.associatedItem.hasOid() &&\n              audioItem.associatedItem.subId.isNotEmpty)\n            ActionItem(\n              icon: const Icon(FontAwesomeIcons.circlePlay),\n              onTap: () {\n                _controller.player?.pause();\n                PageUtils.toVideoPage(\n                  cid: audioItem.associatedItem.subId.first.toInt(),\n                  aid: audioItem.associatedItem.oid.toInt(),\n                );\n              },\n              selectStatus: false,\n              semanticsLabel: '看MV',\n              text: '看MV',\n            ),\n        ],\n      ),\n    );\n  }\n\n  void _onDragStart(ThumbDragDetails details) {\n    // do nothing\n  }\n\n  void _onDragUpdate(ThumbDragDetails details) {\n    _controller\n      ..isDragging = true\n      ..position.value = details.timeStamp;\n  }\n\n  void _onSeek(Duration value) {\n    _controller\n      ..player?.seek(value)\n      ..isDragging = false;\n  }\n\n  Widget _buildProgressBar(ColorScheme colorScheme) {\n    final primary = colorScheme.primary;\n    final thumbGlowColor = primary.withAlpha(80);\n    final bufferedBarColor = primary.withValues(alpha: 0.4);\n    final baseBarColor = colorScheme.brightness.isDark\n        ? const Color(0x33FFFFFF)\n        : const Color(0x33999999);\n    Widget child = Obx(\n      () => ProgressBar(\n        progress: _controller.position.value,\n        total: _controller.duration.value,\n        baseBarColor: baseBarColor,\n        progressBarColor: primary,\n        bufferedBarColor: bufferedBarColor,\n        thumbColor: primary,\n        thumbGlowColor: thumbGlowColor,\n        thumbGlowRadius: 0,\n        thumbRadius: 6,\n        onDragStart: _onDragStart,\n        onDragUpdate: _onDragUpdate,\n        onSeek: _onSeek,\n      ),\n    );\n    if (_controller.isUgc && _controller.enableSponsorBlock) {\n      child = Stack(\n        children: [\n          child,\n          Positioned(\n            left: 0,\n            right: 0,\n            bottom: 3.5,\n            child: Obx(\n              () {\n                if (_controller.segmentProgressList.isNotEmpty) {\n                  return SegmentProgressBar(\n                    height: 5,\n                    segments: _controller.segmentProgressList,\n                  );\n                }\n                return const SizedBox.shrink();\n              },\n            ),\n          ),\n        ],\n      );\n    }\n    return child;\n  }\n\n  Widget _buildDuration(ColorScheme colorScheme) {\n    return SizedBox(\n      height: 30,\n      child: DefaultTextStyle(\n        style: TextStyle(fontSize: 13, color: colorScheme.outline),\n        child: Row(\n          mainAxisAlignment: MainAxisAlignment.spaceBetween,\n          children: [\n            Obx(() {\n              final position = _controller.position.value;\n              if (_controller.player != null) {\n                return Text(\n                  DurationUtils.formatDuration(position.inSeconds),\n                );\n              }\n              return const SizedBox.shrink();\n            }),\n            Obx(() {\n              final duration = _controller.duration.value;\n              if (_controller.player != null) {\n                return Text(\n                  DurationUtils.formatDuration(duration.inSeconds),\n                );\n              }\n              return const SizedBox.shrink();\n            }),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget _buildControls() {\n    return Row(\n      mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n      children: [\n        Obx(\n          () => IconButton(\n            onPressed: _showPlaySettings,\n            icon: Icon(\n              size: 26,\n              _controller.playMode.value.icon,\n            ),\n          ),\n        ),\n        IconButton(\n          onPressed: _controller.playPrev,\n          icon: const Icon(\n            size: 40,\n            Icons.skip_previous_rounded,\n          ),\n        ),\n        IconButton(\n          onPressed: _controller.playOrPause,\n          icon: AnimatedIcon(\n            size: 40,\n            icon: AnimatedIcons.play_pause,\n            progress: _controller.animController,\n          ),\n        ),\n        IconButton(\n          onPressed: _controller.playNext,\n          icon: const Icon(\n            size: 40,\n            Icons.skip_next_rounded,\n          ),\n        ),\n        IconButton(\n          onPressed: _showPlaylist,\n          icon: const Icon(\n            size: 26,\n            Icons.menu_rounded,\n          ),\n        ),\n      ],\n    );\n  }\n\n  Widget _buildInfo(ColorScheme colorScheme, bool isPortrait) {\n    return Obx(() {\n      final audioItem = _controller.audioItem.value;\n      if (audioItem != null) {\n        final cover = audioItem.arc.cover.http2https;\n        return Column(\n          children: [\n            Expanded(\n              child: Center(\n                child: ListView(\n                  key: const PageStorageKey(_AudioPageState),\n                  shrinkWrap: true,\n                  physics: const ClampingScrollPhysics(),\n                  children: [\n                    Center(\n                      child: GestureDetector(\n                        onTap: () => PageUtils.imageView(\n                          imgList: [SourceModel(url: cover)],\n                        ),\n                        child: fromHero(\n                          tag: cover,\n                          child: NetworkImgLayer(\n                            src: cover,\n                            width: 170,\n                            height: 170,\n                            cacheWidth: false,\n                          ),\n                        ),\n                      ),\n                    ),\n                    const SizedBox(height: 12),\n                    SelectableText(\n                      audioItem.arc.title,\n                      style: const TextStyle(height: 1.7, fontSize: 16),\n                      scrollPhysics: const NeverScrollableScrollPhysics(),\n                    ),\n                    const SizedBox(height: 12),\n                    if (audioItem.owner.hasName()) ...[\n                      GestureDetector(\n                        behavior: HitTestBehavior.opaque,\n                        onTap: () {\n                          _controller.player?.pause();\n                          Get.toNamed('/member?mid=${audioItem.owner.mid}');\n                        },\n                        child: Row(\n                          spacing: 6,\n                          mainAxisSize: MainAxisSize.min,\n                          children: [\n                            if (audioItem.owner.hasAvatar())\n                              NetworkImgLayer(\n                                src: audioItem.owner.avatar,\n                                width: 22,\n                                height: 22,\n                                type: ImageType.avatar,\n                              ),\n                            Text(\n                              audioItem.owner.name,\n                            ),\n                          ],\n                        ),\n                      ),\n                      const SizedBox(height: 10),\n                    ],\n                    Row(\n                      children: [\n                        Icon(\n                          size: 14,\n                          Icons.headphones_outlined,\n                          color: colorScheme.outline,\n                        ),\n                        Text.rich(\n                          TextSpan(\n                            children: [\n                              TextSpan(\n                                text:\n                                    ' ${NumUtils.numFormat(audioItem.stat.view)}   '\n                                    '${DateFormatUtils.dateFormat(audioItem.arc.publish.toInt(), long: DateFormatUtils.longFormatD)}   ',\n                              ),\n                              TextSpan(\n                                text: audioItem.arc.displayedOid,\n                                style: TextStyle(color: colorScheme.secondary),\n                                recognizer: NoDeadlineTapGestureRecognizer()\n                                  ..onTap = () => Utils.copyText(\n                                    audioItem.arc.displayedOid,\n                                  ),\n                              ),\n                            ],\n                          ),\n                          style: TextStyle(\n                            fontSize: 13,\n                            color: colorScheme.outline,\n                          ),\n                        ),\n                      ],\n                    ),\n                    if (audioItem.arc.hasDesc()) ...[\n                      const SizedBox(height: 10),\n                      SelectableText(\n                        audioItem.arc.desc,\n                        scrollPhysics: const NeverScrollableScrollPhysics(),\n                      ),\n                    ],\n                  ],\n                ),\n              ),\n            ),\n            if (isPortrait) ...[\n              const SizedBox(height: 10),\n              _buildActions(audioItem),\n            ],\n          ],\n        );\n      }\n      return const SizedBox.shrink();\n    });\n  }\n}\n\nextension _PlayReatExt on PlayRepeat {\n  IconData get icon => switch (this) {\n    PlayRepeat.pause => Icons.pause_rounded,\n    PlayRepeat.listOrder => Icons.keyboard_double_arrow_right_rounded,\n    PlayRepeat.singleCycle => Icons.play_circle_outline_rounded,\n    PlayRepeat.listCycle => Icons.sync_rounded,\n    PlayRepeat.autoPlayRelated => throw UnimplementedError(),\n  };\n}\n"
  },
  {
    "path": "lib/pages/blacklist/controller.dart",
    "content": "import 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/http/black.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/video.dart';\nimport 'package:PiliPlus/models_new/blacklist/data.dart';\nimport 'package:PiliPlus/models_new/blacklist/list.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass BlackListController\n    extends CommonListController<BlackListData, BlackListItem> {\n  RxInt total = (-1).obs;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  List<BlackListItem>? getDataList(BlackListData response) {\n    total.value = response.total ?? 0;\n    return response.list;\n  }\n\n  @override\n  void checkIsEnd(int length) {\n    if (length >= total.value) {\n      isEnd = true;\n    }\n  }\n\n  void onRemove(BuildContext context, int index, name, mid) {\n    showConfirmDialog(\n      context: context,\n      title: '确定将 $name 移出黑名单？',\n      onConfirm: () async {\n        final result = await VideoHttp.relationMod(mid: mid, act: 6, reSrc: 11);\n        if (result.isSuccess) {\n          loadingState\n            ..value.data!.removeAt(index)\n            ..refresh();\n          total.value -= 1;\n          SmartDialog.showToast('操作成功');\n        }\n      },\n    );\n  }\n\n  @override\n  Future<LoadingState<BlackListData>> customGetData() =>\n      BlackHttp.blackList(pn: page);\n}\n"
  },
  {
    "path": "lib/pages/blacklist/view.dart",
    "content": "import 'package:PiliPlus/common/skeleton/msg_feed_top.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models_new/blacklist/list.dart';\nimport 'package:PiliPlus/pages/blacklist/controller.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/global_data.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass BlackListPage extends StatefulWidget {\n  const BlackListPage({super.key});\n\n  @override\n  State<BlackListPage> createState() => _BlackListPageState();\n}\n\nclass _BlackListPageState extends State<BlackListPage> {\n  final _blackListController = Get.put(BlackListController());\n\n  @override\n  void dispose() {\n    if (_blackListController.loadingState.value case Success(:final response)) {\n      final blackMids = response?.map((e) => e.mid!).toSet() ?? {};\n      GlobalData().blackMids = blackMids;\n      Pref.blackMids = blackMids;\n    }\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        title: Obx(\n          () => Text(\n            '黑名单管理${_blackListController.total.value == -1 ? '' : ': ${_blackListController.total.value}'}',\n          ),\n        ),\n      ),\n      body: refreshIndicator(\n        onRefresh: _blackListController.onRefresh,\n        child: CustomScrollView(\n          physics: const AlwaysScrollableScrollPhysics(),\n          controller: _blackListController.scrollController,\n          slivers: [\n            SliverPadding(\n              padding: EdgeInsets.only(\n                bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n              ),\n              sliver: Obx(\n                () => _buildBody(_blackListController.loadingState.value),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget _buildBody(LoadingState<List<BlackListItem>?> loadingState) {\n    late final style = TextStyle(color: Theme.of(context).colorScheme.outline);\n    return switch (loadingState) {\n      Loading() => SliverList.builder(\n        itemCount: 12,\n        itemBuilder: (context, index) => const MsgFeedTopSkeleton(),\n      ),\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverList.builder(\n                itemCount: response.length,\n                itemBuilder: (BuildContext context, int index) {\n                  if (index == response.length - 1) {\n                    _blackListController.onLoadMore();\n                  }\n                  final item = response[index];\n                  return ListTile(\n                    visualDensity: .standard,\n                    onTap: () => Get.toNamed('/member?mid=${item.mid}'),\n                    leading: NetworkImgLayer(\n                      width: 45,\n                      height: 45,\n                      type: ImageType.avatar,\n                      src: item.face,\n                    ),\n                    title: Text(\n                      item.uname!,\n                      maxLines: 1,\n                      overflow: TextOverflow.ellipsis,\n                      style: const TextStyle(fontSize: 14),\n                    ),\n                    subtitle: Text(\n                      '添加时间: ${DateFormatUtils.format(item.mtime, format: DateFormatUtils.longFormatDs)}',\n                      maxLines: 1,\n                      style: style,\n                      overflow: TextOverflow.ellipsis,\n                    ),\n                    dense: true,\n                    trailing: TextButton(\n                      onPressed: () => _blackListController.onRemove(\n                        context,\n                        index,\n                        item.uname,\n                        item.mid,\n                      ),\n                      child: const Text('移除'),\n                    ),\n                  );\n                },\n              )\n            : HttpError(onReload: _blackListController.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _blackListController.onReload,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/coin_log/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/user.dart';\nimport 'package:PiliPlus/models_new/coin_log/data.dart';\nimport 'package:PiliPlus/models_new/coin_log/list.dart';\nimport 'package:PiliPlus/pages/log_table/controller.dart';\n\nclass CoinLogController extends LogController<CoinLogData, CoinLogItem> {\n  @override\n  List<CoinLogItem>? getDataList(CoinLogData response) {\n    return response.list;\n  }\n\n  @override\n  Future<LoadingState<CoinLogData>> customGetData() => UserHttp.coinLog();\n\n  @override\n  List<(int, String)> getFlexAndText(CoinLogItem item) {\n    return [(3, item.time), (1, item.delta), (4, item.reason)];\n  }\n\n  @override\n  final CoinLogItem header = const CoinLogItem(\n    time: '时间',\n    delta: '变化',\n    reason: '原因',\n  );\n\n  @override\n  final String title = '硬币记录';\n}\n"
  },
  {
    "path": "lib/pages/common/common_controller.dart",
    "content": "import 'dart:async';\n\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';\nimport 'package:easy_debounce/easy_throttle.dart';\nimport 'package:flutter/widgets.dart' show ScrollController;\nimport 'package:get/get.dart';\n\nmixin ScrollOrRefreshMixin {\n  ScrollController get scrollController;\n\n  void animateToTop() => scrollController.animToTop();\n\n  Future<void> onRefresh();\n\n  void toTopOrRefresh() {\n    if (scrollController.hasClients) {\n      if (scrollController.position.pixels == 0) {\n        EasyThrottle.throttle(\n          'topOrRefresh',\n          const Duration(milliseconds: 500),\n          onRefresh,\n        );\n      } else {\n        animateToTop();\n      }\n    }\n  }\n}\n\nabstract class CommonController<R, T> extends GetxController\n    with ScrollOrRefreshMixin {\n  @override\n  final ScrollController scrollController = ScrollController();\n\n  bool isLoading = false;\n  Rx<LoadingState> get loadingState;\n\n  Future<LoadingState<R>> customGetData();\n\n  Future<void> queryData([bool isRefresh = true]);\n\n  bool customHandleResponse(bool isRefresh, Success<R> response) {\n    return false;\n  }\n\n  bool handleError(String? errMsg) {\n    return false;\n  }\n\n  @override\n  Future<void> onRefresh() {\n    return queryData();\n  }\n\n  Future<void> onLoadMore() {\n    return queryData(false);\n  }\n\n  Future<void> onReload() {\n    return onRefresh();\n  }\n\n  @override\n  void onClose() {\n    scrollController.dispose();\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "lib/pages/common/common_data_controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/pages/common/common_controller.dart';\nimport 'package:get/get.dart';\n\nabstract class CommonDataController<R, T> extends CommonController<R, T> {\n  @override\n  Rx<LoadingState<T>> loadingState = LoadingState<T>.loading().obs;\n\n  @override\n  Future<void> queryData([bool isRefresh = true]) async {\n    if (isLoading) return;\n    isLoading = true;\n    final LoadingState<R> res = await customGetData();\n    if (res is Success<R>) {\n      if (!customHandleResponse(isRefresh, res)) {\n        loadingState.value = res as LoadingState<T>;\n      }\n    } else {\n      if (isRefresh && !handleError(res is Error ? res.errMsg : null)) {\n        loadingState.value = res as Error;\n      }\n    }\n    isLoading = false;\n  }\n\n  @override\n  Future<void> onReload() {\n    loadingState.value = LoadingState<T>.loading();\n    return super.onReload();\n  }\n}\n"
  },
  {
    "path": "lib/pages/common/common_intro_controller.dart",
    "content": "import 'dart:async' show FutureOr, Timer;\n\nimport 'package:PiliPlus/http/fav.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/user.dart';\nimport 'package:PiliPlus/http/video.dart';\nimport 'package:PiliPlus/models/common/video/source_type.dart';\nimport 'package:PiliPlus/models_new/fav/fav_folder/data.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/data.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/stat_detail.dart';\nimport 'package:PiliPlus/models_new/video/video_tag/data.dart';\nimport 'package:PiliPlus/pages/video/controller.dart';\nimport 'package:PiliPlus/pages/video/introduction/ugc/widgets/triple_mixin.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:PiliPlus/utils/global_data.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nabstract class CommonIntroController extends GetxController\n    with GetSingleTickerProviderStateMixin, TripleMixin, FavMixin {\n  late final String heroTag;\n  late String bvid;\n\n  // 是否稍后再看\n  final RxBool hasLater = false.obs;\n\n  final Rx<List<VideoTagItem>?> videoTags = Rx<List<VideoTagItem>?>(null);\n\n  bool isProcessing = false;\n  Future<void> handleAction(FutureOr Function() action) async {\n    if (!isProcessing) {\n      isProcessing = true;\n      await action();\n      isProcessing = false;\n    }\n  }\n\n  late final isLogin = Accounts.main.isLogin;\n\n  StatDetail? getStat();\n\n  @override\n  void updateFavCount(int count) {\n    getStat()?.favorite += count;\n  }\n\n  final Rx<VideoDetailData> videoDetail = VideoDetailData().obs;\n\n  void queryVideoIntro();\n\n  bool prevPlay();\n  bool nextPlay();\n\n  void actionCoinVideo();\n  void actionShareVideo(BuildContext context);\n\n  // 同时观看\n  final bool isShowOnlineTotal = Pref.enableOnlineTotal;\n  late final RxString total = '1'.obs;\n  Timer? timer;\n\n  late final RxInt cid;\n\n  late final videoDetailCtr = Get.find<VideoDetailController>(tag: heroTag);\n\n  @override\n  void onInit() {\n    super.onInit();\n    final args = Get.arguments;\n    heroTag = args['heroTag'];\n    bvid = args['bvid'];\n    cid = RxInt(args['cid']);\n    hasLater.value = args['sourceType'] == SourceType.watchLater;\n\n    queryVideoIntro();\n    startTimer();\n  }\n\n  void startTimer() {\n    if (isShowOnlineTotal) {\n      queryOnlineTotal();\n      timer ??= Timer.periodic(const Duration(seconds: 10), (Timer timer) {\n        queryOnlineTotal();\n      });\n    }\n  }\n\n  void cancelTimer() {\n    timer?.cancel();\n    timer = null;\n  }\n\n  // 查看同时在看人数\n  Future<void> queryOnlineTotal() async {\n    if (!isShowOnlineTotal) {\n      return;\n    }\n    final result = await VideoHttp.onlineTotal(\n      aid: IdUtils.bv2av(bvid),\n      bvid: bvid,\n      cid: cid.value,\n    );\n    if (result case Success(:final response)) {\n      total.value = response;\n    }\n  }\n\n  @override\n  void onClose() {\n    cancelTimer();\n    super.onClose();\n  }\n\n  Future<void> coinVideo(int coin, [bool selectLike = false]) async {\n    final stat = getStat();\n    if (stat == null) {\n      return;\n    }\n    final res = await VideoHttp.coinVideo(\n      bvid: bvid,\n      multiply: coin,\n      selectLike: selectLike ? 1 : 0,\n    );\n    if (res.isSuccess) {\n      SmartDialog.showToast('投币成功');\n      coinNum.value += coin;\n      GlobalData().afterCoin(coin);\n      stat.coin += coin;\n      if (selectLike && !hasLike.value) {\n        stat.like++;\n        hasLike.value = true;\n      }\n    } else {\n      res.toast();\n    }\n  }\n\n  Future<void> queryVideoTags() async {\n    final result = await UserHttp.videoTags(bvid: bvid, cid: cid.value);\n    videoTags.value = result.dataOrNull;\n  }\n\n  Future<void> viewLater() async {\n    final res = await (hasLater.value\n        ? UserHttp.toViewDel(aids: IdUtils.bv2av(bvid).toString())\n        : UserHttp.toViewLater(bvid: bvid));\n    if (res.isSuccess) hasLater.value = !hasLater.value;\n  }\n}\n\nmixin FavMixin on TripleMixin {\n  Set? favIds;\n  int? quickFavId;\n  late final enableQuickFav = Pref.enableQuickFav;\n  final Rx<FavFolderData> favFolderData = FavFolderData().obs;\n\n  (Object, int) get getFavRidType;\n\n  Future<LoadingState<FavFolderData>> queryVideoInFolder() async {\n    favIds = null;\n    final (rid, type) = getFavRidType;\n    final res = await FavHttp.videoInFolder(\n      mid: Accounts.main.mid,\n      rid: rid,\n      type: type,\n    );\n    if (res case Success(:final response)) {\n      favFolderData.value = response;\n      favIds = response.list\n          ?.where((item) => item.favState == 1)\n          .map((item) => item.id)\n          .toSet();\n    }\n    return res;\n  }\n\n  int get favFolderId {\n    if (this.quickFavId != null) {\n      return this.quickFavId!;\n    }\n    final quickFavId = Pref.quickFavId;\n    final list = favFolderData.value.list!;\n    if (quickFavId != null) {\n      final folderInfo = list.firstWhereOrNull((e) => e.id == quickFavId);\n      if (folderInfo != null) {\n        return this.quickFavId = quickFavId;\n      } else {\n        GStorage.setting.delete(SettingBoxKey.quickFavId);\n      }\n    }\n    return this.quickFavId = list.first.id;\n  }\n\n  // 收藏\n  void showFavBottomSheet(BuildContext context, {bool isLongPress = false}) {\n    if (!Accounts.main.isLogin) {\n      SmartDialog.showToast('账号未登录');\n      return;\n    }\n    // 快速收藏 &\n    // 点按 收藏至默认文件夹\n    // 长按选择文件夹\n    if (enableQuickFav) {\n      if (!isLongPress) {\n        actionFavVideo(isQuick: true);\n      } else {\n        PageUtils.showFavBottomSheet(context: context, ctr: this);\n      }\n    } else if (!isLongPress) {\n      PageUtils.showFavBottomSheet(context: context, ctr: this);\n    }\n  }\n\n  void updateFavCount(int count);\n\n  Future<void> actionFavVideo({bool isQuick = false}) async {\n    final (rid, type) = getFavRidType;\n    // 收藏至默认文件夹\n    if (isQuick) {\n      SmartDialog.showLoading(msg: '请求中');\n      queryVideoInFolder().then((res) async {\n        if (res.isSuccess) {\n          final hasFav = this.hasFav.value;\n          final result = hasFav\n              ? await FavHttp.unfavAll(rid: rid, type: type)\n              : await FavHttp.favVideo(\n                  resources: '$rid:$type',\n                  addIds: favFolderId.toString(),\n                );\n          SmartDialog.dismiss();\n          if (result.isSuccess) {\n            updateFavCount(hasFav ? -1 : 1);\n            this.hasFav.value = !hasFav;\n            SmartDialog.showToast('✅ 快速收藏/取消收藏成功');\n          } else {\n            res.toast();\n          }\n        } else {\n          SmartDialog.dismiss();\n        }\n      });\n      return;\n    }\n\n    List<int?> addMediaIdsNew = [];\n    List<int?> delMediaIdsNew = [];\n    try {\n      for (final i in favFolderData.value.list!) {\n        bool isFaved = favIds?.contains(i.id) == true;\n        if (i.favState == 1) {\n          if (!isFaved) {\n            addMediaIdsNew.add(i.id);\n          }\n        } else {\n          if (isFaved) {\n            delMediaIdsNew.add(i.id);\n          }\n        }\n      }\n    } catch (e) {\n      if (kDebugMode) debugPrint(e.toString());\n    }\n    SmartDialog.showLoading(msg: '请求中');\n    final result = await FavHttp.favVideo(\n      resources: '$rid:$type',\n      addIds: addMediaIdsNew.join(','),\n      delIds: delMediaIdsNew.join(','),\n    );\n    SmartDialog.dismiss();\n    if (result.isSuccess) {\n      Get.back();\n      final newVal =\n          addMediaIdsNew.isNotEmpty || favIds?.length != delMediaIdsNew.length;\n      if (hasFav.value != newVal) {\n        updateFavCount(newVal ? 1 : -1);\n        hasFav.value = newVal;\n      }\n      SmartDialog.showToast('操作成功');\n    } else {\n      result.toast();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/common/common_list_controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/pages/common/common_controller.dart';\nimport 'package:get/get.dart';\n\nabstract class CommonListController<R, T> extends CommonController<R, T> {\n  int page = 1;\n  bool isEnd = false;\n  bool? hasFooter;\n\n  @override\n  Rx<LoadingState<List<T>?>> loadingState =\n      LoadingState<List<T>?>.loading().obs;\n\n  void handleListResponse(List<T> dataList) {}\n\n  List<T>? getDataList(R response) {\n    return response as List<T>?;\n  }\n\n  void checkIsEnd(int length) {}\n\n  @override\n  Future<void> queryData([bool isRefresh = true]) async {\n    if (isLoading || (!isRefresh && isEnd)) return;\n    isLoading = true;\n    final LoadingState<R> res = await customGetData();\n    if (res case Success(:final response)) {\n      if (!customHandleResponse(isRefresh, res)) {\n        final dataList = getDataList(response);\n        if (dataList == null || dataList.isEmpty) {\n          isEnd = true;\n          if (isRefresh) {\n            loadingState.value = Success(dataList);\n          } else if (hasFooter == true) {\n            loadingState.refresh();\n          }\n          isLoading = false;\n          return;\n        }\n        handleListResponse(dataList);\n        if (isRefresh) {\n          checkIsEnd(dataList.length);\n          loadingState.value = Success(dataList);\n        } else if (loadingState.value case Success(:final response)) {\n          response!.addAll(dataList);\n          checkIsEnd(response.length);\n          loadingState.refresh();\n        }\n      }\n      page++;\n    } else {\n      if (isRefresh && !handleError(res is Error ? res.errMsg : null)) {\n        loadingState.value = res as Error;\n      }\n    }\n    isLoading = false;\n  }\n\n  @override\n  Future<void> onRefresh() {\n    page = 1;\n    isEnd = false;\n    return super.onRefresh();\n  }\n\n  @override\n  Future<void> onReload() {\n    loadingState.value = LoadingState<List<T>?>.loading();\n    return super.onReload();\n  }\n}\n"
  },
  {
    "path": "lib/pages/common/common_page.dart",
    "content": "import 'package:PiliPlus/common/constants.dart' show StyleString;\nimport 'package:PiliPlus/pages/home/controller.dart';\nimport 'package:PiliPlus/pages/main/controller.dart';\nimport 'package:flutter/foundation.dart' show clampDouble;\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nabstract class CommonPageState<T extends StatefulWidget> extends State<T> {\n  RxDouble? _barOffset;\n  RxBool? _showTopBar;\n  RxBool? _showBottomBar;\n  final _mainController = Get.find<MainController>();\n\n  bool get needsCorrection => false;\n\n  @override\n  void initState() {\n    super.initState();\n    _barOffset = _mainController.barOffset;\n    _showBottomBar = _mainController.showBottomBar;\n    try {\n      _showTopBar = Get.find<HomeController>().showTopBar;\n    } catch (_) {}\n  }\n\n  Widget onBuild(Widget child) {\n    if (_barOffset != null) {\n      return NotificationListener<ScrollNotification>(\n        onNotification: onNotificationType2,\n        child: child,\n      );\n    }\n    if (_showTopBar != null || _showBottomBar != null) {\n      return NotificationListener<UserScrollNotification>(\n        onNotification: onNotificationType1,\n        child: child,\n      );\n    }\n    return child;\n  }\n\n  bool onNotificationType1(UserScrollNotification notification) {\n    if (!_mainController.useBottomNav) return false;\n    if (notification.metrics.axis == .horizontal) return false;\n    switch (notification.direction) {\n      case .forward:\n        _showTopBar?.value = true;\n        _showBottomBar?.value = true;\n      case .reverse:\n        _showTopBar?.value = false;\n        _showBottomBar?.value = false;\n      case _:\n    }\n    return false;\n  }\n\n  void _updateOffset(double scrollDelta) {\n    _barOffset!.value = clampDouble(\n      _barOffset!.value + scrollDelta,\n      0.0,\n      StyleString.topBarHeight,\n    );\n  }\n\n  bool onNotificationType2(ScrollNotification notification) {\n    if (!_mainController.useBottomNav) return false;\n\n    final metrics = notification.metrics;\n    if (metrics.axis == .horizontal) return false;\n\n    if (notification is ScrollUpdateNotification) {\n      if (notification.dragDetails == null) return false;\n      final pixel = metrics.pixels;\n      final scrollDelta = notification.scrollDelta ?? 0;\n      if (pixel < 0.0 && scrollDelta > 0) return false;\n      if (needsCorrection) {\n        final value = _barOffset!.value;\n        final newValue = clampDouble(\n          value + scrollDelta,\n          0.0,\n          StyleString.topBarHeight,\n        );\n        final offset = value - newValue;\n        if (offset != 0) {\n          _barOffset!.value = newValue;\n          if (pixel < 0.0 && scrollDelta < 0.0 && value > 0.0) {\n            return false;\n          }\n          Scrollable.of(notification.context!).position.correctBy(offset);\n        }\n      } else {\n        _updateOffset(scrollDelta);\n      }\n      return false;\n    }\n\n    if (notification is OverscrollNotification) {\n      _updateOffset(notification.overscroll);\n      return false;\n    }\n\n    return false;\n  }\n\n  @override\n  void dispose() {\n    _barOffset = null;\n    _showTopBar = null;\n    _showBottomBar = null;\n    super.dispose();\n  }\n}\n"
  },
  {
    "path": "lib/pages/common/common_whisper_controller.dart",
    "content": "import 'package:PiliPlus/grpc/bilibili/app/im/v1.pb.dart'\n    show SessionPageType, SessionId, Session;\nimport 'package:PiliPlus/grpc/im.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/msg.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:fixnum/fixnum.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\n\nabstract class CommonWhisperController<R>\n    extends CommonListController<R, Session> {\n  SessionPageType get sessionPageType;\n\n  Future<void> onRemove(int index, int talkerId) async {\n    final res = await MsgHttp.removeMsg(talkerId);\n    if (res.isSuccess) {\n      loadingState\n        ..value.data!.removeAt(index)\n        ..refresh();\n      SmartDialog.showToast('删除成功');\n    } else {\n      res.toast();\n    }\n  }\n\n  Future<void> onSetTop(\n    Session item,\n    int index,\n    bool isTop,\n    SessionId sessionId,\n  ) async {\n    final res = isTop\n        ? await ImGrpc.unpinSession(sessionId: sessionId)\n        : await ImGrpc.pinSession(sessionId: sessionId);\n\n    if (res.isSuccess) {\n      List<Session> list = loadingState.value.data!;\n      item.isPinned = isTop ? false : true;\n      if (!isTop) {\n        list.insert(0, list.removeAt(index));\n      }\n      loadingState.refresh();\n      SmartDialog.showToast('${isTop ? '移除' : ''}置顶成功');\n    } else {\n      res.toast();\n    }\n  }\n\n  Future<void> onSetMute(Session item, bool isMuted, Int64 talkerUid) async {\n    final res = await MsgHttp.setMsgDnd(\n      uid: Accounts.main.mid,\n      setting: isMuted ? 0 : 1,\n      dndUid: talkerUid,\n    );\n    if (res.isSuccess) {\n      item.isMuted = !isMuted;\n      loadingState.refresh();\n      SmartDialog.showToast('操作成功');\n    } else {\n      res.toast();\n    }\n  }\n\n  Future<void> onClearUnread() async {\n    final res = await ImGrpc.clearUnread(pageType: sessionPageType);\n    if (res.isSuccess) {\n      if (loadingState.value case Success(:final response)) {\n        if (response != null && response.isNotEmpty) {\n          for (final item in response) {\n            if (item.hasUnread()) {\n              item.clearUnread();\n            }\n          }\n          loadingState.refresh();\n        }\n      }\n      SmartDialog.showToast('已标记为已读');\n    } else {\n      res.toast();\n    }\n  }\n\n  Future<void> onDeleteList() async {\n    final res = await ImGrpc.deleteSessionList(pageType: sessionPageType);\n    if (res.isSuccess) {\n      loadingState.value = const Success(null);\n    } else {\n      res.toast();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/common/dyn/common_dyn_controller.dart",
    "content": "import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart';\nimport 'package:PiliPlus/grpc/reply.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/pages/common/reply_controller.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:get/get.dart';\n\nabstract class CommonDynController extends ReplyController<MainListReply> {\n  int get oid;\n  int get replyType;\n\n  late final RxBool showTitle = false.obs;\n\n  late final horizontalPreview = Pref.horizontalPreview;\n  late final List<double> ratio = Pref.dynamicDetailRatio;\n\n  late final showDynActionBar = Pref.showDynActionBar;\n\n  @override\n  Future<LoadingState<MainListReply>> customGetData() => ReplyGrpc.mainList(\n    type: replyType,\n    oid: oid,\n    mode: mode.value,\n    cursorNext: cursorNext,\n    offset: paginationReply?.nextOffset,\n  );\n\n  @override\n  List<ReplyInfo>? getDataList(MainListReply response) {\n    return response.replies;\n  }\n}\n"
  },
  {
    "path": "lib/pages/common/dyn/common_dyn_page.dart",
    "content": "import 'dart:math' show pi;\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/skeleton/video_reply.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/sliver/sliver_pinned_header.dart';\nimport 'package:PiliPlus/common/widgets/view_safe_area.dart';\nimport 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'\n    show ReplyInfo;\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/pages/common/dyn/common_dyn_controller.dart';\nimport 'package:PiliPlus/pages/common/fab_mixin.dart';\nimport 'package:PiliPlus/pages/video/reply/widgets/reply_item_grpc.dart';\nimport 'package:PiliPlus/pages/video/reply_reply/view.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/extension/size_ext.dart';\nimport 'package:PiliPlus/utils/feed_back.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:easy_debounce/easy_throttle.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nabstract class CommonDynPageState<T extends StatefulWidget> extends State<T>\n    with SingleTickerProviderStateMixin, FabMixin {\n  CommonDynController get controller;\n\n  late final ScrollController scrollController;\n\n  bool get horizontalPreview => !isPortrait && controller.horizontalPreview;\n\n  dynamic get arguments;\n\n  late EdgeInsets padding;\n  late bool isPortrait;\n  late double maxWidth;\n  late double maxHeight;\n\n  @override\n  void initState() {\n    super.initState();\n    scrollController = ScrollController()..addListener(listener);\n  }\n\n  void listener() {\n    final pos = scrollController.positions;\n    controller.showTitle.value = pos.first.pixels > 55;\n    if (pos.any((e) => e.userScrollDirection == .forward)) {\n      showFab();\n    } else if (pos.any((e) => e.userScrollDirection == .reverse)) {\n      hideFab();\n    }\n  }\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    final size = MediaQuery.sizeOf(context);\n    maxWidth = size.width;\n    maxHeight = size.height;\n    isPortrait = size.isPortrait;\n    padding = MediaQuery.viewPaddingOf(context);\n  }\n\n  @override\n  void dispose() {\n    scrollController\n      ..removeListener(listener)\n      ..dispose();\n    super.dispose();\n  }\n\n  Widget buildReplyHeader(ThemeData theme) {\n    final secondary = theme.colorScheme.secondary;\n    return SliverPinnedHeader(\n      backgroundColor: theme.colorScheme.surface,\n      child: Padding(\n        padding: const .fromLTRB(12, 2.5, 6, 2.5),\n        child: Row(\n          mainAxisAlignment: MainAxisAlignment.spaceBetween,\n          children: [\n            Obx(\n              () {\n                final count = controller.count.value;\n                return Text(\n                  '${count == -1 ? 0 : NumUtils.numFormat(count)}条回复',\n                );\n              },\n            ),\n            TextButton.icon(\n              style: StyleString.buttonStyle,\n              onPressed: controller.queryBySort,\n              icon: Icon(Icons.sort, size: 16, color: secondary),\n              label: Obx(\n                () => Text(\n                  controller.sortType.value.label,\n                  style: TextStyle(fontSize: 13, color: secondary),\n                ),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget replyList(\n    ThemeData theme,\n    LoadingState<List<ReplyInfo>?> loadingState,\n  ) {\n    return switch (loadingState) {\n      Loading() => SliverList.builder(\n        itemCount: 12,\n        itemBuilder: (context, index) => const VideoReplySkeleton(),\n      ),\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverList.builder(\n                itemCount: response.length + 1,\n                itemBuilder: (context, index) {\n                  if (index == response.length) {\n                    controller.onLoadMore();\n                    return Container(\n                      alignment: Alignment.center,\n                      margin: EdgeInsets.only(bottom: padding.bottom),\n                      height: 125,\n                      child: Text(\n                        controller.isEnd ? '没有更多了' : '加载中...',\n                        style: TextStyle(\n                          fontSize: 12,\n                          color: theme.colorScheme.outline,\n                        ),\n                      ),\n                    );\n                  } else {\n                    return ReplyItemGrpc(\n                      replyItem: response[index],\n                      replyLevel: 1,\n                      replyReply: (replyItem, id) =>\n                          replyReply(context, replyItem, id, theme),\n                      onReply: controller.onReply,\n                      onDelete: (item, subIndex) =>\n                          controller.onRemove(index, item, subIndex),\n                      upMid: controller.upMid,\n                      onViewImage: hideFab,\n                      onCheckReply: (item) =>\n                          controller.onCheckReply(item, isManual: true),\n                      onToggleTop: (item) => controller.onToggleTop(\n                        item,\n                        index,\n                        controller.oid,\n                        controller.replyType,\n                      ),\n                    );\n                  }\n                },\n              )\n            : HttpError(\n                errMsg: '还没有评论',\n                onReload: controller.onReload,\n              ),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: controller.onReload,\n      ),\n    };\n  }\n\n  void replyReply(\n    BuildContext context,\n    ReplyInfo replyItem,\n    int? id,\n    ThemeData theme,\n  ) {\n    EasyThrottle.throttle('replyReply', const Duration(milliseconds: 500), () {\n      int oid = replyItem.oid.toInt();\n      int rpid = replyItem.id.toInt();\n      Widget replyReplyPage({bool showBackBtn = true}) {\n        final child = ViewSafeArea(\n          left: showBackBtn,\n          right: showBackBtn,\n          child: VideoReplyReplyPanel(\n            enableSlide: false,\n            id: id,\n            oid: oid,\n            rpid: rpid,\n            isVideoDetail: !showBackBtn,\n            replyType: controller.replyType,\n            firstFloor: replyItem,\n          ),\n        );\n        if (showBackBtn) {\n          return Scaffold(\n            resizeToAvoidBottomInset: false,\n            appBar: AppBar(\n              title: const Text('评论详情'),\n              shape: Border(\n                bottom: BorderSide(\n                  color: theme.colorScheme.outline.withValues(alpha: 0.1),\n                ),\n              ),\n            ),\n            body: child,\n          );\n        }\n        return child;\n      }\n\n      if (isPortrait) {\n        Get.to(\n          replyReplyPage,\n          routeName: 'dynamicDetail-Copy',\n          arguments: arguments,\n        );\n      } else {\n        final scaffoldState = Scaffold.maybeOf(context);\n        if (scaffoldState != null) {\n          hideFab();\n          scaffoldState.showBottomSheet(\n            backgroundColor: Colors.transparent,\n            (context) => replyReplyPage(showBackBtn: false),\n          );\n        } else {\n          Get.to(\n            replyReplyPage,\n            routeName: 'dynamicDetail-Copy',\n            arguments: arguments,\n          );\n        }\n      }\n    });\n  }\n\n  Widget ratioWidget(double maxWidth) => IconButton(\n    tooltip: '页面比例调节',\n    onPressed: () => showDialog(\n      context: context,\n      builder: (context) => Align(\n        alignment: Alignment.topRight,\n        child: Container(\n          margin: const EdgeInsets.only(top: 56, right: 16),\n          width: maxWidth / 4,\n          height: 32,\n          child: Builder(\n            builder: (context) => Slider(\n              min: 1,\n              max: 100,\n              value: controller.ratio.first,\n              onChanged: (value) {\n                if (value >= 10 && value <= 90) {\n                  value = value.toPrecision(2);\n                  controller.ratio\n                    ..[0] = value\n                    ..[1] = 100 - value;\n\n                  (context as Element).markNeedsBuild();\n                  setState(() {});\n                }\n              },\n              onChangeEnd: (_) => GStorage.setting.put(\n                SettingBoxKey.dynamicDetailRatio,\n                controller.ratio,\n              ),\n            ),\n          ),\n        ),\n      ),\n    ),\n    icon: Transform.rotate(\n      angle: pi / 2,\n      child: const Icon(Icons.splitscreen, size: 19),\n    ),\n  );\n\n  FloatingActionButtonLocation get floatingActionButtonLocation =>\n      controller.showDynActionBar\n      ? const ActionBarLocation()\n      : const NoBottomPaddingFabLocation();\n\n  Widget get fabButton => Padding(\n    padding: .only(bottom: padding.bottom + kFloatingActionButtonMargin),\n    child: replyButton,\n  );\n\n  Widget get replyButton => FloatingActionButton(\n    heroTag: null,\n    onPressed: () {\n      try {\n        feedBack();\n        controller.onReply(\n          null,\n          oid: controller.oid,\n          replyType: controller.replyType,\n        );\n      } catch (_) {}\n    },\n    tooltip: '评论',\n    child: const Icon(Icons.reply),\n  );\n}\n"
  },
  {
    "path": "lib/pages/common/fab_mixin.dart",
    "content": "import 'package:flutter/material.dart';\n\nmixin FabMixin<T extends StatefulWidget> on State<T>, TickerProvider {\n  bool _isFabVisible = true;\n  late final AnimationController _fabAnimationCtr;\n  late final Animation<Offset> fabAnimation;\n\n  @override\n  void initState() {\n    super.initState();\n    _fabAnimationCtr = AnimationController(\n      vsync: this,\n      duration: const Duration(milliseconds: 100),\n    );\n    fabAnimation = _fabAnimationCtr.drive(\n      Tween<Offset>(\n        begin: Offset.zero,\n        end: const Offset(0.0, 1.0),\n      ).chain(CurveTween(curve: Curves.easeInOut)),\n    );\n  }\n\n  void showFab() {\n    if (!_isFabVisible) {\n      _isFabVisible = true;\n      _fabAnimationCtr.reverse();\n    }\n  }\n\n  void hideFab() {\n    if (_isFabVisible) {\n      _isFabVisible = false;\n      _fabAnimationCtr.forward();\n    }\n  }\n\n  @override\n  void dispose() {\n    _fabAnimationCtr.dispose();\n    super.dispose();\n  }\n}\n\nmixin _NoRightMarginMixin on StandardFabLocation {\n  @override\n  double getOffsetX(scaffoldGeometry, _) {\n    return scaffoldGeometry.scaffoldSize.width -\n        scaffoldGeometry.minInsets.right -\n        scaffoldGeometry.floatingActionButtonSize.width;\n  }\n}\n\nmixin _NoBottomPaddingMixin on StandardFabLocation {\n  @override\n  double getOffsetY(scaffoldGeometry, _) {\n    return scaffoldGeometry.contentBottom -\n        scaffoldGeometry.floatingActionButtonSize.height;\n  }\n}\n\nclass NoRightMarginFabLocation extends StandardFabLocation\n    with FabFloatOffsetY, _NoRightMarginMixin {\n  const NoRightMarginFabLocation();\n}\n\nclass NoBottomPaddingFabLocation extends StandardFabLocation\n    with FabEndOffsetX, _NoBottomPaddingMixin {\n  const NoBottomPaddingFabLocation();\n}\n\nclass ActionBarLocation extends StandardFabLocation with _NoBottomPaddingMixin {\n  const ActionBarLocation();\n\n  @override\n  double getOffsetX(scaffoldGeometry, _) {\n    return 0.0;\n  }\n}\n"
  },
  {
    "path": "lib/pages/common/multi_select/base.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:get/get.dart';\n\nmixin MultiSelectData {\n  bool checked = false;\n}\n\nabstract interface class MultiSelectBase<T extends MultiSelectData> {\n  RxBool get enableMultiSelect;\n\n  int get checkedCount;\n\n  void onSelect(T item);\n  void handleSelect({bool checked = false, bool disableSelect = true});\n  void onRemove();\n}\n\nmixin BaseMultiSelectMixin<T extends MultiSelectData>\n    implements MultiSelectBase<T> {\n  late final RxInt rxCount = 0.obs;\n  @override\n  int get checkedCount => rxCount.value;\n\n  @override\n  final RxBool enableMultiSelect = false.obs;\n\n  RxObjectMixin get state;\n  List<T> get list;\n\n  Iterable<T> get allChecked => list.where((v) => v.checked);\n\n  @override\n  void handleSelect({bool checked = false, bool disableSelect = true}) {\n    for (final item in list) {\n      item.checked = checked;\n    }\n    state.refresh();\n    rxCount.value = checked ? list.length : 0;\n    if (disableSelect && !checked) {\n      enableMultiSelect.value = false;\n    }\n  }\n\n  @override\n  void onSelect(T item) {\n    item.checked = !item.checked;\n    if (item.checked) {\n      rxCount.value++;\n    } else {\n      rxCount.value--;\n    }\n    state.refresh();\n    if (checkedCount == 0) {\n      enableMultiSelect.value = false;\n    }\n  }\n}\n\nmixin CommonMultiSelectMixin<T extends MultiSelectData>\n    implements MultiSelectBase<T> {\n  @override\n  late final RxBool enableMultiSelect = false.obs;\n  RxBool? get allSelected => null;\n\n  Rx<LoadingState<List<T>?>> get loadingState;\n  late final RxInt rxCount = 0.obs;\n\n  @override\n  int get checkedCount => rxCount.value;\n\n  Iterable<T> get allChecked =>\n      loadingState.value.data!.where((v) => v.checked);\n\n  @override\n  void onSelect(T item) {\n    List<T> list = loadingState.value.data!;\n    item.checked = !item.checked;\n    if (item.checked) {\n      rxCount.value++;\n    } else {\n      rxCount.value--;\n    }\n    loadingState.refresh();\n    if (checkedCount == 0) {\n      enableMultiSelect.value = false;\n    } else {\n      allSelected?.value = checkedCount == list.length;\n    }\n  }\n\n  @override\n  void handleSelect({bool checked = false, bool disableSelect = true}) {\n    if (loadingState.value case Success(:final response)) {\n      if (response != null && response.isNotEmpty) {\n        for (final item in response) {\n          item.checked = checked;\n        }\n        loadingState.refresh();\n        rxCount.value = checked ? response.length : 0;\n      }\n    }\n    if (disableSelect && !checked) {\n      enableMultiSelect.value = false;\n    }\n  }\n}\n\nmixin DeleteItemMixin<R, T extends MultiSelectData>\n    on CommonListController<R, T>, CommonMultiSelectMixin<T> {\n  Future<void> afterDelete(Set<T> removeList) async {\n    final list = loadingState.value.data!;\n    if (removeList.length == list.length) {\n      list.clear();\n    } else if (removeList.length == 1) {\n      list.remove(removeList.first);\n    } else {\n      list.removeWhere(removeList.contains);\n    }\n    if (list.isNotEmpty || isEnd) {\n      loadingState.refresh();\n    } else {\n      onReload();\n    }\n    if (enableMultiSelect.value) {\n      rxCount.value = 0;\n      enableMultiSelect.value = false;\n    }\n  }\n}\n\n// abstract class SetMultiSelectController<R, T, I>\n//     extends CommonListController<R, T>\n//     with MultiSelectMixin<T>, SetCommonMultiSelectMixin<T, I> {}\n\n// mixin SetCommonMultiSelectMixin<T, R> on MultiSelectMixin<T> {\n//   Rx<LoadingState<List<T>?>> get loadingState;\n//   RxSet<R> get selected;\n\n//   @override\n//   int get checkedCount => selected.length;\n\n//   R getId(T item);\n\n//   @override\n//   void onSelect(T item, [bool disableSelect = true]) {\n//     final id = getId(item);\n//     if (selected.contains(id)) {\n//       selected.remove(id);\n//     } else {\n//       selected.add(id);\n//     }\n//     loadingState.refresh();\n//     if (disableSelect) {\n//       if (checkedCount == 0) {\n//         enableMultiSelect.value = false;\n//       }\n//     } else {\n//       allSelected.value = checkedCount == loadingState.value.data!.length;\n//     }\n//   }\n\n//   @override\n//   void handleSelect([bool checked = false, bool disableSelect = true]) {\n//     if (loadingState.value.isSuccess) {\n//       final list = loadingState.value.data;\n//       if (list != null && list.isNotEmpty) {\n//         if (checked) {\n//           selected.addAll(list!.map(getId));\n//         } else {\n//           selected.clear();\n//         }\n//         loadingState.refresh();\n//       }\n//     }\n//     if (disableSelect && !checked) {\n//       enableMultiSelect.value = false;\n//     }\n//   }\n// }\n"
  },
  {
    "path": "lib/pages/common/multi_select/multi_select_controller.dart",
    "content": "import 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:PiliPlus/pages/common/multi_select/base.dart';\n\nabstract class MultiSelectController<\n  R,\n  T extends MultiSelectData\n> = CommonListController<R, T>\n    with CommonMultiSelectMixin<T>, DeleteItemMixin;\n"
  },
  {
    "path": "lib/pages/common/publish/common_publish_page.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\nimport 'dart:math' show max;\n\nimport 'package:PiliPlus/models/common/publish_panel_type.dart';\nimport 'package:PiliPlus/utils/extension/context_ext.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:chat_bottom_container/chat_bottom_container.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nabstract class CommonPublishPage<T> extends StatefulWidget {\n  const CommonPublishPage({\n    super.key,\n    this.initialValue,\n    this.imageLengthLimit,\n    this.onSave,\n    this.autofocus = true,\n  });\n\n  final String? initialValue;\n  final int? imageLengthLimit;\n  final ValueChanged<T>? onSave;\n  final bool autofocus;\n}\n\nabstract class CommonPublishPageState<T extends CommonPublishPage>\n    extends State<T>\n    with WidgetsBindingObserver {\n  late final FocusNode focusNode;\n  late final controller = ChatBottomPanelContainerController<PanelType>(\n    uiScale: Pref.uiScale,\n  );\n  TextEditingController get editController;\n\n  final Rx<PanelType> panelType = PanelType.none.obs;\n  late final RxBool readOnly = false.obs;\n  late final RxBool enablePublish = false.obs;\n\n  bool hasPub = false;\n  void initPubState();\n\n  @override\n  void initState() {\n    super.initState();\n    if (Platform.isAndroid) {\n      WidgetsBinding.instance.addObserver(this);\n    }\n\n    focusNode = FocusNode();\n\n    initPubState();\n\n    if (widget.autofocus) {\n      Future.delayed(const Duration(milliseconds: 300), () {\n        if (mounted) {\n          focusNode.requestFocus();\n        }\n      });\n    }\n  }\n\n  @override\n  void dispose() {\n    if (!hasPub) {\n      onSave();\n    }\n    focusNode.dispose();\n    editController.dispose();\n    if (Platform.isAndroid) {\n      WidgetsBinding.instance.removeObserver(this);\n    }\n    super.dispose();\n  }\n\n  void _requestFocus() {\n    Future.delayed(const Duration(microseconds: 200), focusNode.requestFocus);\n  }\n\n  @override\n  void didChangeAppLifecycleState(AppLifecycleState state) {\n    if (state == AppLifecycleState.resumed) {\n      if (mounted &&\n          widget.autofocus &&\n          (panelType.value == PanelType.keyboard ||\n              panelType.value == PanelType.none)) {\n        controller.restoreChatPanel();\n        WidgetsBinding.instance.addPostFrameCallback((_) {\n          if (focusNode.hasFocus) {\n            focusNode.unfocus();\n            _requestFocus();\n          } else {\n            _requestFocus();\n          }\n        });\n      }\n    } else if (state == AppLifecycleState.paused) {\n      controller.keepChatPanel();\n      if (focusNode.hasFocus) {\n        focusNode.unfocus();\n      }\n    }\n  }\n\n  void updatePanelType(PanelType type) {\n    final isSwitchToKeyboard = PanelType.keyboard == type;\n    bool isUpdated = false;\n    switch (type) {\n      case PanelType.keyboard:\n        updateInputView(isReadOnly: false);\n        break;\n      case PanelType.emoji || PanelType.more:\n        isUpdated = updateInputView(isReadOnly: true);\n        break;\n      default:\n        break;\n    }\n\n    void updatePanelTypeFunc() {\n      controller.updatePanelType(\n        isSwitchToKeyboard\n            ? ChatBottomPanelType.keyboard\n            : ChatBottomPanelType.other,\n        data: type,\n        forceHandleFocus: isSwitchToKeyboard\n            ? ChatBottomHandleFocus.requestFocus\n            : ChatBottomHandleFocus.unfocus,\n      );\n    }\n\n    if (isUpdated) {\n      // Waiting for the input view to update.\n      WidgetsBinding.instance.addPostFrameCallback((timeStamp) {\n        updatePanelTypeFunc();\n      });\n    } else {\n      updatePanelTypeFunc();\n    }\n  }\n\n  Future<void> hidePanel([_]) async {\n    if (focusNode.hasFocus) {\n      await Future.delayed(const Duration(milliseconds: 100));\n      if (!mounted) return;\n      focusNode.unfocus();\n    }\n    updateInputView(isReadOnly: false);\n    if (ChatBottomPanelType.none == controller.currentPanelType) return;\n    controller.updatePanelType(ChatBottomPanelType.none);\n  }\n\n  bool updateInputView({\n    required bool isReadOnly,\n  }) {\n    if (readOnly.value != isReadOnly) {\n      readOnly.value = isReadOnly;\n      return true;\n    }\n    return false;\n  }\n\n  Widget buildEmojiPickerPanel() {\n    double height = context.isTablet ? 300 : 170;\n    final keyboardHeight = controller.keyboardHeight;\n    if (keyboardHeight != 0) {\n      height = max(height, keyboardHeight);\n    }\n    return SizedBox(\n      height: height,\n      child: customPanel,\n    );\n  }\n\n  Widget buildMorePanel(ThemeData theme) => throw UnimplementedError();\n\n  Widget buildPanelContainer(ThemeData theme, [Color? panelBgColor]) {\n    return ChatBottomPanelContainer<PanelType>(\n      controller: controller,\n      inputFocusNode: focusNode,\n      otherPanelWidget: (type) {\n        if (type == null) return const SizedBox.shrink();\n        switch (type) {\n          case PanelType.emoji:\n            return buildEmojiPickerPanel();\n          case PanelType.more:\n            return buildMorePanel(theme);\n          default:\n            return const SizedBox.shrink();\n        }\n      },\n      onPanelTypeChange: (panelType, data) {\n        switch (panelType) {\n          case ChatBottomPanelType.none:\n            this.panelType.value = PanelType.none;\n            break;\n          case ChatBottomPanelType.keyboard:\n            this.panelType.value = PanelType.keyboard;\n            break;\n          case ChatBottomPanelType.other:\n            if (data == null) return;\n            this.panelType.value = data;\n            break;\n        }\n      },\n      panelBgColor: panelBgColor ?? Theme.of(context).colorScheme.surface,\n    );\n  }\n\n  void onSubmitted(String value) {\n    if (enablePublish.value) {\n      onPublish();\n    }\n  }\n\n  Future<void> onPublish();\n\n  Future<void> onCustomPublish({List? pictures});\n\n  Widget? get customPanel => null;\n\n  void onChanged(String value) {\n    enablePublish.value = value.trim().isNotEmpty;\n  }\n\n  void onSave();\n}\n"
  },
  {
    "path": "lib/pages/common/publish/common_rich_text_pub_page.dart",
    "content": "import 'dart:io';\n\nimport 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/button/toolbar_icon_button.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text_field/controller.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text_field/text_field.dart';\nimport 'package:PiliPlus/http/msg.dart';\nimport 'package:PiliPlus/models/common/image_preview_type.dart';\nimport 'package:PiliPlus/models/common/publish_panel_type.dart';\nimport 'package:PiliPlus/models/dynamics/result.dart'\n    show PicModel, FilePicModel, OpusPicModel;\nimport 'package:PiliPlus/models_new/dynamic/dyn_mention/item.dart';\nimport 'package:PiliPlus/models_new/emote/emote.dart' as e;\nimport 'package:PiliPlus/models_new/live/live_emote/emoticon.dart';\nimport 'package:PiliPlus/pages/common/publish/common_publish_page.dart';\nimport 'package:PiliPlus/pages/dynamics_mention/view.dart';\nimport 'package:PiliPlus/utils/extension/file_ext.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/extension/string_ext.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/feed_back.dart';\nimport 'package:PiliPlus/utils/image_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:cached_network_image/cached_network_image.dart';\nimport 'package:dio/dio.dart' show CancelToken;\nimport 'package:easy_debounce/easy_throttle.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_cache_manager/flutter_cache_manager.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:image_cropper/image_cropper.dart';\nimport 'package:image_picker/image_picker.dart';\n\nabstract class CommonRichTextPubPage\n    extends CommonPublishPage<List<RichTextItem>> {\n  const CommonRichTextPubPage({\n    super.key,\n    this.items,\n    this.pics,\n    super.onSave,\n    super.autofocus,\n    super.imageLengthLimit,\n  });\n\n  final List<RichTextItem>? items;\n  final List<PicModel>? pics;\n}\n\nabstract class CommonRichTextPubPageState<T extends CommonRichTextPubPage>\n    extends CommonPublishPageState<T> {\n  final key = GlobalKey<RichTextFieldState>();\n  late final imagePicker = ImagePicker();\n  late final RxList<PicModel> imageList;\n  int get limit => widget.imageLengthLimit ?? 9;\n\n  @override\n  late final RichTextEditingController editController;\n\n  @override\n  void initPubState() {\n    editController = RichTextEditingController(\n      items: widget.items,\n      onMention: onMention,\n    );\n    if (editController.rawText.trim().isNotEmpty) {\n      enablePublish.value = true;\n    }\n    imageList = RxList<PicModel>(widget.pics ?? <PicModel>[]);\n  }\n\n  @override\n  void dispose() {\n    if (PlatformUtils.isMobile) {\n      for (final img in imageList) {\n        if (img is FilePicModel) {\n          File(img.path).tryDel();\n        }\n      }\n    }\n    super.dispose();\n  }\n\n  @override\n  void didChangeDependencies() {\n    editController.richStyle = null;\n    super.didChangeDependencies();\n  }\n\n  Widget buildImage(int index, double height) {\n    final color = Theme.of(\n      context,\n    ).colorScheme.secondaryContainer.withValues(alpha: 0.5);\n\n    void onClear() {\n      final image = imageList.removeAt(index);\n      if (PlatformUtils.isMobile) {\n        if (image is FilePicModel) {\n          File(image.path).tryDel();\n        }\n      }\n      if (imageList.isEmpty && editController.rawText.trim().isEmpty) {\n        enablePublish.value = false;\n      }\n    }\n\n    final image = imageList[index];\n    return Stack(\n      clipBehavior: Clip.none,\n      children: [\n        GestureDetector(\n          onTap: () async {\n            controller.keepChatPanel();\n            await PageUtils.imageView(\n              imgList: imageList\n                  .map(\n                    (img) => switch (img) {\n                      FilePicModel e => SourceModel(\n                        url: e.path,\n                        sourceType: .fileImage,\n                      ),\n                      OpusPicModel e => SourceModel(\n                        url: e.url!,\n                        sourceType: .networkImage,\n                      ),\n                    },\n                  )\n                  .toList(),\n              initialPage: index,\n            );\n            controller.restoreChatPanel();\n          },\n          onLongPress: () {\n            Feedback.forLongPress(context);\n            onClear();\n          },\n          onSecondaryTap: PlatformUtils.isMobile ? null : onClear,\n          child: ClipRRect(\n            borderRadius: const BorderRadius.all(Radius.circular(4)),\n            child: ConstrainedBox(\n              constraints: const BoxConstraints(minWidth: 42),\n              child: switch (image) {\n                FilePicModel e => Image.file(\n                  File(e.path),\n                  height: height,\n                  filterQuality: .low,\n                  cacheHeight: height.cacheSize(context),\n                ),\n                OpusPicModel e => CachedNetworkImage(\n                  imageUrl: ImageUtils.thumbnailUrl(e.url!),\n                  height: height,\n                  filterQuality: .low,\n                  memCacheHeight: height.cacheSize(context),\n                  fadeInDuration: .zero,\n                  fadeOutDuration: .zero,\n                  placeholder: (_, _) => const SizedBox(width: 42),\n                ),\n              },\n            ),\n          ),\n        ),\n        if (kDebugMode || PlatformUtils.isMobile)\n          Positioned(\n            top: 34,\n            right: 5,\n            child: iconButton(\n              icon: const Icon(Icons.edit),\n              onPressed: () => onCropImage(index, image),\n              size: 24,\n              iconSize: 14,\n              bgColor: color,\n            ),\n          ),\n        Positioned(\n          top: 5,\n          right: 5,\n          child: iconButton(\n            icon: const Icon(Icons.clear),\n            onPressed: onClear,\n            size: 24,\n            iconSize: 14,\n            bgColor: color,\n          ),\n        ),\n      ],\n    );\n  }\n\n  Future<void> onCropImage(int index, PicModel image) async {\n    String? path;\n    switch (image) {\n      case FilePicModel e:\n        path = e.path;\n      case OpusPicModel e:\n        SmartDialog.showLoading();\n        final file = (await DefaultCacheManager().getSingleFile(\n          e.url.http2https,\n        ));\n        await SmartDialog.dismiss();\n        path = file.path;\n    }\n    if (!mounted || path.isEmpty) return;\n    late final colorScheme = ColorScheme.of(context);\n    final croppedFile = await ImageCropper.platform.cropImage(\n      sourcePath: path,\n      uiSettings: [\n        AndroidUiSettings(\n          toolbarTitle: '裁剪',\n          toolbarColor: colorScheme.secondaryContainer,\n          toolbarWidgetColor: colorScheme.onSecondaryContainer,\n          statusBarLight: colorScheme.isLight,\n        ),\n        IOSUiSettings(title: '裁剪'),\n      ],\n    );\n    if (croppedFile != null) {\n      if (image is FilePicModel) {\n        File(image.path).tryDel();\n      }\n      imageList[index] = FilePicModel(path: croppedFile.path);\n    }\n  }\n\n  void onPickImage([VoidCallback? callback]) {\n    EasyThrottle.throttle(\n      'imagePicker',\n      const Duration(milliseconds: 500),\n      () async {\n        try {\n          List<XFile> pickedFiles = await imagePicker.pickMultiImage(\n            limit: limit,\n            imageQuality: 100,\n          );\n          if (pickedFiles.isNotEmpty) {\n            for (int i = 0; i < pickedFiles.length; i++) {\n              if (imageList.length == limit) {\n                SmartDialog.showToast('最多选择$limit张图片');\n                break;\n              } else {\n                imageList.add(FilePicModel(path: pickedFiles[i].path));\n              }\n            }\n            callback?.call();\n          }\n        } catch (e) {\n          SmartDialog.showToast(e.toString());\n        }\n      },\n    );\n  }\n\n  void onChooseEmote(dynamic emote, double? width, double? height) {\n    if (emote is e.Emote) {\n      final isTextEmote = width == null;\n      onInsertText(\n        isTextEmote ? emote.text! : '\\uFFFC',\n        RichTextType.emoji,\n        rawText: emote.text!,\n        emote: isTextEmote\n            ? null\n            : Emote(\n                url: emote.url!,\n                width: width,\n                height: height,\n              ),\n      );\n    } else if (emote is Emoticon) {\n      onInsertText(\n        '\\uFFFC',\n        RichTextType.emoji,\n        rawText: emote.emoji!,\n        emote: Emote(\n          url: emote.url!,\n          width: width!,\n          height: height,\n        ),\n      );\n    }\n  }\n\n  List<Map<String, dynamic>>? getRichContent() {\n    if (editController.items.isEmpty) return null;\n    final list = <Map<String, dynamic>>[];\n    for (final e in editController.items) {\n      switch (e.type) {\n        case RichTextType.text || RichTextType.composing || RichTextType.common:\n          list.add({\n            \"raw_text\": e.text,\n            \"type\": 1,\n            \"biz_id\": \"\",\n          });\n        case RichTextType.at:\n          list\n            ..add({\n              \"raw_text\": '@${e.rawText}',\n              \"type\": 2,\n              \"biz_id\": e.id,\n            })\n            ..add({\n              \"raw_text\": ' ',\n              \"type\": 1,\n              \"biz_id\": \"\",\n            });\n        case RichTextType.emoji:\n          list.add({\n            \"raw_text\": e.rawText,\n            \"type\": 9,\n            \"biz_id\": \"\",\n          });\n        case RichTextType.vote:\n          list\n            ..add({\n              \"raw_text\": e.rawText,\n              \"type\": 4,\n              \"biz_id\": e.id,\n            })\n            ..add({\n              \"raw_text\": ' ',\n              \"type\": 1,\n              \"biz_id\": \"\",\n            });\n      }\n    }\n    return list;\n  }\n\n  late double _mentionOffset = 0;\n  Future<void>? onMention([bool fromClick = false]) async {\n    controller.keepChatPanel();\n    final res = await DynMentionPanel.onDynMention(\n      context,\n      offset: _mentionOffset,\n      onCachePos: (offset) => _mentionOffset = offset,\n    );\n    if (res != null) {\n      if (res is MentionItem) {\n        _onInsertUser(res, fromClick);\n      } else if (res is Set<MentionItem>) {\n        for (final e in res) {\n          e.checked = false;\n          _onInsertUser(e, fromClick);\n        }\n        res.clear();\n      }\n    }\n    controller.restoreChatPanel();\n  }\n\n  void _onInsertUser(MentionItem e, bool fromClick) {\n    onInsertText(\n      '@${e.name} ',\n      RichTextType.at,\n      rawText: e.name,\n      id: e.uid,\n      fromClick: fromClick,\n    );\n  }\n\n  void onInsertText(\n    String text,\n    RichTextType type, {\n    String? rawText,\n    Emote? emote,\n    String? id,\n    bool? fromClick,\n  }) {\n    if (text.isEmpty) {\n      return;\n    }\n\n    enablePublish.value = true;\n\n    final oldValue = editController.value;\n    final selection = oldValue.selection;\n\n    if (selection.isValid) {\n      TextEditingDelta delta;\n\n      if (selection.isCollapsed) {\n        if (type == RichTextType.at && fromClick == false) {\n          delta = RichTextEditingDeltaReplacement(\n            oldText: oldValue.text,\n            replacementText: text,\n            replacedRange: TextRange(\n              start: selection.start - 1,\n              end: selection.end,\n            ),\n            selection: TextSelection.collapsed(\n              offset: selection.start - 1 + text.length,\n            ),\n            composing: TextRange.empty,\n            rawText: rawText,\n            type: type,\n            emote: emote,\n            id: id,\n          );\n        } else {\n          delta = RichTextEditingDeltaInsertion(\n            oldText: oldValue.text,\n            textInserted: text,\n            insertionOffset: selection.start,\n            selection: TextSelection.collapsed(\n              offset: selection.start + text.length,\n            ),\n            composing: TextRange.empty,\n            rawText: rawText,\n            type: type,\n            emote: emote,\n            id: id,\n          );\n        }\n      } else {\n        delta = RichTextEditingDeltaReplacement(\n          oldText: oldValue.text,\n          replacementText: text,\n          replacedRange: selection,\n          selection: TextSelection.collapsed(\n            offset: selection.start + text.length,\n          ),\n          composing: TextRange.empty,\n          rawText: rawText,\n          type: type,\n          emote: emote,\n          id: id,\n        );\n      }\n\n      final newValue = delta.apply(oldValue);\n\n      if (oldValue == newValue) {\n        return;\n      }\n\n      editController\n        ..syncRichText(delta)\n        ..value = newValue;\n    } else {\n      editController.items\n        ..clear()\n        ..add(\n          RichTextItem(\n            type: type,\n            text: text,\n            rawText: rawText,\n            range: TextRange(\n              start: 0,\n              end: text.length,\n            ),\n            emote: emote,\n            id: id,\n          ),\n        );\n      editController.value = TextEditingValue(\n        text: text,\n        selection: TextSelection.collapsed(offset: text.length),\n      );\n    }\n\n    key.currentState?.scheduleShowCaretOnScreen(withAnimation: true);\n  }\n\n  @override\n  void onSave() => widget.onSave?.call(editController.items);\n\n  Widget get emojiBtn => Obx(\n    () {\n      final isEmoji = panelType.value == PanelType.emoji;\n      return ToolbarIconButton(\n        tooltip: isEmoji ? '输入' : '表情',\n        onPressed: () {\n          if (isEmoji) {\n            updatePanelType(PanelType.keyboard);\n          } else {\n            updatePanelType(PanelType.emoji);\n          }\n        },\n        icon: isEmoji\n            ? const Icon(Icons.keyboard, size: 22)\n            : const Icon(Icons.emoji_emotions, size: 22),\n        selected: isEmoji,\n      );\n    },\n  );\n\n  Widget get atBtn => ToolbarIconButton(\n    onPressed: () => onMention(true),\n    icon: const Icon(Icons.alternate_email, size: 22),\n    tooltip: '@',\n    selected: false,\n  );\n\n  Widget get moreBtn => Obx(\n    () {\n      final isMore = panelType.value == PanelType.more;\n      return ToolbarIconButton(\n        tooltip: isMore ? '输入' : '更多',\n        onPressed: () {\n          if (isMore) {\n            updatePanelType(PanelType.keyboard);\n          } else {\n            updatePanelType(PanelType.more);\n          }\n        },\n        icon: isMore\n            ? const Icon(Icons.keyboard, size: 22)\n            : const Icon(Icons.add_circle_outline, size: 22),\n        selected: isMore,\n      );\n    },\n  );\n\n  @override\n  Future<void> onPublish() async {\n    feedBack();\n    List<Map<String, dynamic>>? pictures;\n    if (imageList.isNotEmpty) {\n      SmartDialog.showLoading(msg: '正在上传图片...');\n      final cancelToken = CancelToken();\n      try {\n        pictures = await Future.wait<Map<String, dynamic>>(\n          imageList.map((img) async {\n            switch (img) {\n              case FilePicModel e:\n                final result = await MsgHttp.uploadBfs(\n                  path: e.path,\n                  category: 'daily',\n                  biz: 'new_dyn',\n                  cancelToken: cancelToken,\n                );\n                final data = result.data;\n                return {\n                  'img_width': data.imageWidth,\n                  'img_height': data.imageHeight,\n                  'img_size': data.imgSize,\n                  'img_src': data.imageUrl,\n                };\n              case OpusPicModel e:\n                return e.toJson();\n            }\n          }),\n          eagerError: true,\n        );\n        SmartDialog.dismiss();\n      } on HttpException catch (e) {\n        cancelToken.cancel();\n        SmartDialog.dismiss();\n        SmartDialog.showToast(e.message);\n        return;\n      }\n    }\n    onCustomPublish(pictures: pictures);\n  }\n}\n"
  },
  {
    "path": "lib/pages/common/publish/common_text_pub_page.dart",
    "content": "import 'package:PiliPlus/pages/common/publish/common_publish_page.dart';\nimport 'package:PiliPlus/utils/feed_back.dart';\nimport 'package:flutter/material.dart';\n\nabstract class CommonTextPubPage extends CommonPublishPage<String> {\n  const CommonTextPubPage({\n    super.key,\n    super.initialValue,\n    super.onSave,\n  });\n}\n\nabstract class CommonTextPubPageState<T extends CommonTextPubPage>\n    extends CommonPublishPageState<T> {\n  @override\n  late final TextEditingController editController;\n\n  @override\n  void initPubState() {\n    editController = TextEditingController(\n      text: widget.initialValue,\n    );\n    if (widget.initialValue?.trim().isNotEmpty == true) {\n      enablePublish.value = true;\n    }\n  }\n\n  @override\n  void onSave() => widget.onSave?.call(editController.text);\n\n  @override\n  Future<void> onPublish() {\n    feedBack();\n    return onCustomPublish();\n  }\n}\n"
  },
  {
    "path": "lib/pages/common/publish/publish_route.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass PublishRoute<T> extends PopupRoute<T> {\n  PublishRoute({\n    required RoutePageBuilder pageBuilder,\n    bool barrierDismissible = true,\n    String? barrierLabel,\n    Color barrierColor = const Color(0x80000000),\n    Duration transitionDuration = const Duration(milliseconds: 500),\n    RouteTransitionsBuilder? transitionBuilder,\n    super.settings,\n  }) : widget = pageBuilder,\n       _barrierDismissible = barrierDismissible,\n       _barrierLabel = barrierLabel,\n       _barrierColor = barrierColor,\n       _transitionDuration = transitionDuration,\n       _transitionBuilder = transitionBuilder;\n\n  final RoutePageBuilder widget;\n\n  @override\n  bool get barrierDismissible => _barrierDismissible;\n  final bool _barrierDismissible;\n\n  @override\n  String? get barrierLabel => _barrierLabel;\n  final String? _barrierLabel;\n\n  @override\n  Color get barrierColor => _barrierColor;\n  final Color _barrierColor;\n\n  @override\n  Duration get transitionDuration => _transitionDuration;\n  final Duration _transitionDuration;\n\n  final RouteTransitionsBuilder? _transitionBuilder;\n\n  @override\n  Widget buildPage(\n    BuildContext context,\n    Animation<double> animation,\n    Animation<double> secondaryAnimation,\n  ) {\n    return Semantics(\n      scopesRoute: true,\n      explicitChildNodes: true,\n      child: widget(context, animation, secondaryAnimation),\n    );\n  }\n\n  @override\n  Widget buildTransitions(\n    BuildContext context,\n    Animation<double> animation,\n    Animation<double> secondaryAnimation,\n    Widget child,\n  ) {\n    if (_transitionBuilder != null) {\n      return _transitionBuilder(context, animation, secondaryAnimation, child);\n    }\n    return SlideTransition(\n      position: animation.drive(\n        Tween<Offset>(\n          begin: const Offset(0.0, 1.0),\n          end: Offset.zero,\n        ),\n      ),\n      child: child,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/common/reply_controller.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/text_field/controller.dart';\nimport 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'\n    show MainListReply, ReplyInfo, SubjectControl, Mode;\nimport 'package:PiliPlus/grpc/bilibili/pagination.pb.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/reply.dart';\nimport 'package:PiliPlus/models/common/reply/reply_sort_type.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:PiliPlus/pages/common/publish/publish_route.dart';\nimport 'package:PiliPlus/pages/video/reply_new/view.dart';\nimport 'package:PiliPlus/utils/feed_back.dart';\nimport 'package:PiliPlus/utils/reply_utils.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:fixnum/fixnum.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nabstract class ReplyController<R> extends CommonListController<R, ReplyInfo> {\n  final RxInt count = (-1).obs;\n\n  late final Rx<ReplySortType> sortType;\n  late final Rx<Mode> mode;\n\n  final savedReplies = <Object, List<RichTextItem>?>{};\n\n  Int64? upMid;\n  Int64? cursorNext;\n  SubjectControl? subjectControl;\n  FeedPaginationReply? paginationReply;\n  late bool hasUpTop = false;\n\n  @override\n  bool? get hasFooter => true;\n\n  // comment antifraud\n  late final _enableCommAntifraud = Pref.enableCommAntifraud;\n  late final _biliSendCommAntifraud = Pref.biliSendCommAntifraud;\n  bool get enableCommAntifraud =>\n      _enableCommAntifraud || _biliSendCommAntifraud;\n  dynamic get sourceId;\n\n  @override\n  void onInit() {\n    super.onInit();\n    final cacheSortType = Pref.replySortType;\n    sortType = cacheSortType.obs;\n    mode =\n        (cacheSortType == .time ? Mode.MAIN_LIST_TIME : Mode.MAIN_LIST_HOT).obs;\n  }\n\n  @override\n  void checkIsEnd(int length) {\n    final count = this.count.value;\n    if (count != -1 && length >= count) {\n      isEnd = true;\n    }\n  }\n\n  @override\n  bool customHandleResponse(bool isRefresh, Success response) {\n    MainListReply data = response.response;\n    cursorNext = data.cursor.next;\n    paginationReply = data.paginationReply;\n    count.value = data.subjectControl.count.toInt();\n    if (isRefresh) {\n      subjectControl = data.subjectControl;\n      upMid ??= data.subjectControl.upMid;\n      hasUpTop = data.hasUpTop();\n      if (data.hasUpTop()) {\n        data.replies.insert(0, data.upTop);\n      }\n      if (subjectControl?.title == ReplySortType.select.title) {\n        sortType.value = .select;\n      }\n    }\n    isEnd = data.cursor.isEnd;\n    return false;\n  }\n\n  @override\n  Future<void> onRefresh() {\n    cursorNext = null;\n    subjectControl = null;\n    paginationReply = null;\n    return super.onRefresh();\n  }\n\n  // 排序搜索评论\n  void queryBySort() {\n    if (isLoading) return;\n    switch (sortType.value) {\n      case ReplySortType.time:\n        sortType.value = ReplySortType.hot;\n        mode.value = Mode.MAIN_LIST_HOT;\n        break;\n      case ReplySortType.hot:\n        sortType.value = ReplySortType.time;\n        mode.value = Mode.MAIN_LIST_TIME;\n        break;\n      case ReplySortType.select:\n        return;\n    }\n    feedBack();\n    onReload();\n  }\n\n  (bool inputDisable, String? hint) get replyHint {\n    String? hint;\n    bool inputDisable = false;\n    try {\n      if (subjectControl case final subjectControl?) {\n        inputDisable = subjectControl.inputDisable;\n        if (subjectControl.hasRootText()) {\n          final rootText = subjectControl.rootText;\n          if (inputDisable) {\n            SmartDialog.showToast(rootText);\n          }\n          if (rootText.contains('可发') || rootText.contains('可见')) {\n            hint = rootText;\n          }\n        }\n      }\n    } catch (_) {}\n    return (inputDisable, hint);\n  }\n\n  void onReply(\n    ReplyInfo? replyItem, {\n    int? oid,\n    int? replyType,\n  }) {\n    if (loadingState.value case Error(:final errMsg, :final code)) {\n      if (errMsg != null && (code == 12061 || code == 12002)) {\n        SmartDialog.showToast(errMsg);\n        return;\n      }\n    }\n\n    assert(replyItem != null || (oid != null && replyType != null));\n\n    final (bool inputDisable, String? hint) = replyHint;\n    if (inputDisable) {\n      return;\n    }\n\n    final key = oid ?? replyItem!.oid + replyItem.id;\n    Get.key.currentState!\n        .push(\n          PublishRoute(\n            pageBuilder: (buildContext, animation, secondaryAnimation) {\n              return ReplyPage(\n                hint: hint,\n                oid: oid ?? replyItem!.oid.toInt(),\n                root: oid != null ? 0 : replyItem!.id.toInt(),\n                parent: oid != null ? 0 : replyItem!.id.toInt(),\n                replyType: replyItem?.type.toInt() ?? replyType!,\n                replyItem: replyItem,\n                items: savedReplies[key],\n\n                /// hd api deprecated\n                // canUploadPic: canUploadPic,\n                onSave: (reply) {\n                  if (reply.isEmpty) {\n                    savedReplies.remove(key);\n                  } else {\n                    savedReplies[key] = reply.toList();\n                  }\n                },\n              );\n            },\n            settings: RouteSettings(arguments: Get.arguments),\n          ),\n        )\n        .then(\n          (replyInfo) {\n            if (replyInfo is ReplyInfo) {\n              savedReplies.remove(key);\n              if (loadingState.value case Success(:final response)) {\n                if (response == null) {\n                  loadingState.value = Success([replyInfo]);\n                } else {\n                  if (oid != null) {\n                    response.insert(hasUpTop ? 1 : 0, replyInfo);\n                  } else {\n                    replyItem!\n                      ..count += 1\n                      ..replies.add(replyInfo);\n                  }\n                  loadingState.refresh();\n                }\n              } else {\n                loadingState.value = Success([replyInfo]);\n              }\n              count.value += 1;\n\n              // check reply\n              if (enableCommAntifraud) {\n                onCheckReply(replyInfo, isManual: false);\n              }\n            }\n          },\n        );\n  }\n\n  void onRemove(int index, ReplyInfo item, int? subIndex) {\n    if (subIndex == null) {\n      loadingState.value.data!.removeAt(index);\n    } else {\n      item\n        ..count -= 1\n        ..replies.removeAt(subIndex);\n    }\n    count.value -= 1;\n    loadingState.refresh();\n  }\n\n  void onCheckReply(ReplyInfo replyInfo, {required bool isManual}) {\n    ReplyUtils.onCheckReply(\n      replyInfo: replyInfo,\n      biliSendCommAntifraud: _biliSendCommAntifraud,\n      sourceId: sourceId,\n      isManual: isManual,\n    );\n  }\n\n  Future<void> onToggleTop(\n    ReplyInfo item,\n    int index,\n    oid,\n    int type,\n  ) async {\n    bool isUpTop = item.replyControl.isUpTop;\n    final res = await ReplyHttp.replyTop(\n      oid: oid,\n      type: type,\n      rpid: item.id,\n      isUpTop: isUpTop,\n    );\n    if (res.isSuccess) {\n      item.replyControl.isUpTop = !isUpTop;\n      if (!isUpTop && index != 0) {\n        final list = loadingState.value.data!;\n        list\n          ..first.replyControl.isUpTop = false\n          ..insert(0, list.removeAt(index));\n      }\n      loadingState.refresh();\n      SmartDialog.showToast('${isUpTop ? '取消' : ''}置顶成功');\n    } else {\n      res.toast();\n    }\n  }\n\n  @override\n  void onClose() {\n    savedReplies.clear();\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "lib/pages/common/search/common_search_controller.dart",
    "content": "import 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nabstract class CommonSearchController<R, T> extends CommonListController<R, T> {\n  final editController = TextEditingController();\n  final focusNode = FocusNode();\n\n  void onClear() {\n    if (editController.text.isNotEmpty) {\n      editController.clear();\n    } else {\n      Get.back();\n    }\n  }\n\n  @override\n  Future<void> onRefresh() {\n    if (editController.value.text.isEmpty) {\n      return Future.syncValue(null);\n    }\n    return super.onRefresh();\n  }\n\n  @override\n  void onClose() {\n    editController.dispose();\n    focusNode.dispose();\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "lib/pages/common/search/common_search_page.dart",
    "content": "import 'package:PiliPlus/common/widgets/appbar/appbar.dart';\nimport 'package:PiliPlus/common/widgets/flutter/pop_scope.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/view_sliver_safe_area.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/pages/common/multi_select/base.dart';\nimport 'package:PiliPlus/pages/common/search/common_search_controller.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nabstract class CommonSearchPageState<S extends StatefulWidget, R, T>\n    extends State<S> {\n  CommonSearchController<R, T> get controller;\n\n  List<Widget>? get extraActions => null;\n\n  List<Widget>? get multiSelectActions => null;\n\n  @override\n  Widget build(BuildContext context) {\n    if (controller case final MultiSelectBase multiCtr) {\n      return Obx(() {\n        final enableMultiSelect = multiCtr.enableMultiSelect.value;\n        return popScope(\n          canPop: !enableMultiSelect,\n          onPopInvokedWithResult: (didPop, result) {\n            if (enableMultiSelect) {\n              multiCtr.handleSelect();\n            }\n          },\n          child: _build(true),\n        );\n      });\n    }\n    return _build(false);\n  }\n\n  Widget _build(bool multiSelect) {\n    return Scaffold(\n      appBar: _buildBar(multiSelect),\n      body: CustomScrollView(\n        physics: const AlwaysScrollableScrollPhysics(),\n        controller: controller.scrollController,\n        slivers: [\n          ViewSliverSafeArea(\n            sliver: Obx(() => _buildBody(controller.loadingState.value)),\n          ),\n        ],\n      ),\n    );\n  }\n\n  PreferredSizeWidget _buildBar(bool multiSelect) {\n    final AppBar bar = AppBar(\n      actions: [\n        IconButton(\n          tooltip: '搜索',\n          onPressed: controller.onRefresh,\n          icon: const Icon(Icons.search_outlined, size: 22),\n        ),\n        ...?extraActions,\n        const SizedBox(width: 10),\n      ],\n      title: TextField(\n        autofocus: true,\n        focusNode: controller.focusNode,\n        controller: controller.editController,\n        textInputAction: TextInputAction.search,\n        textAlignVertical: TextAlignVertical.center,\n        decoration: InputDecoration(\n          hintText: '搜索',\n          visualDensity: .standard,\n          border: InputBorder.none,\n          suffixIcon: IconButton(\n            tooltip: '清空',\n            icon: const Icon(Icons.clear, size: 22),\n            onPressed: () => controller\n              ..loadingState.value = LoadingState.loading()\n              ..onClear()\n              ..focusNode.requestFocus(),\n          ),\n        ),\n        onSubmitted: (value) => controller.onRefresh(),\n      ),\n    );\n    if (multiSelect) {\n      return MultiSelectAppBarWidget(\n        ctr: controller as MultiSelectBase,\n        actions: multiSelectActions,\n        child: bar,\n      );\n    }\n    return bar;\n  }\n\n  Widget _buildBody(LoadingState<List<T>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => const HttpError(),\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? buildList(response)\n            : HttpError(onReload: controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: controller.onReload,\n      ),\n    };\n  }\n\n  Widget buildList(List<T> list);\n}\n"
  },
  {
    "path": "lib/pages/common/slide/common_slide_page.dart",
    "content": "import 'dart:math' show max;\n\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/gesture/horizontal_drag_gesture_recognizer.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:flutter/gestures.dart' show HorizontalDragGestureRecognizer;\nimport 'package:flutter/material.dart' hide LayoutBuilder;\nimport 'package:get/get.dart';\n\nabstract class CommonSlidePage extends StatefulWidget {\n  const CommonSlidePage({super.key, this.enableSlide = true});\n\n  final bool enableSlide;\n}\n\nmixin CommonSlideMixin<T extends CommonSlidePage> on State<T>, TickerProvider {\n  static const double offset = 30.0;\n  double? _downDx;\n  late double _maxWidth;\n  double get maxWidth => _maxWidth;\n  late bool _isRTL = false;\n  late final bool enableSlide;\n  late final AnimationController _animController;\n  SlideDragGestureRecognizer? _slideDragGestureRecognizer;\n\n  static bool slideDismissReplyPage = Pref.slideDismissReplyPage;\n\n  bool isDxAllowed(double dx) {\n    return enableSlide\n        ? dx > CommonSlideMixin.offset &&\n              dx < maxWidth - CommonSlideMixin.offset\n        : true;\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    enableSlide = widget.enableSlide && slideDismissReplyPage;\n    if (enableSlide) {\n      _animController = AnimationController(\n        vsync: this,\n        reverseDuration: const Duration(milliseconds: 500),\n      );\n      _slideDragGestureRecognizer =\n          SlideDragGestureRecognizer(\n              isDxAllowed: (double dx) {\n                final isLTR = dx <= offset;\n                final isRTL = dx >= _maxWidth - offset;\n                if (isLTR || isRTL) {\n                  _isRTL = isRTL;\n                  return true;\n                }\n                return false;\n              },\n            )\n            ..onStart = _onDragStart\n            ..onUpdate = _onDragUpdate\n            ..onEnd = _onDragEnd\n            ..onCancel = _onDragEnd;\n    }\n  }\n\n  @override\n  void dispose() {\n    if (enableSlide) {\n      _animController.dispose();\n      _slideDragGestureRecognizer?.dispose();\n      _slideDragGestureRecognizer = null;\n    }\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    if (enableSlide) {\n      return LayoutBuilder(\n        builder: (context, constraints) {\n          _maxWidth = constraints.maxWidth;\n          return AnimatedBuilder(\n            animation: _animController,\n            builder: (context, child) {\n              return Align(\n                alignment: AlignmentDirectional.topStart,\n                heightFactor: 1 - _animController.value,\n                child: child,\n              );\n            },\n            child: buildPage(theme),\n          );\n        },\n      );\n    }\n    return buildPage(theme);\n  }\n\n  Widget buildPage(ThemeData theme);\n\n  Widget buildList(ThemeData theme) => throw UnimplementedError();\n\n  void _onDragEnd([_]) {\n    if (_downDx == null) return;\n    final dx = _downDx!;\n    if (_animController.value * _maxWidth + (_isRTL ? (_maxWidth - dx) : dx) >=\n        100) {\n      Get.back();\n    } else {\n      _animController.reverse();\n    }\n    _downDx = null;\n  }\n\n  void _onDragStart(DragStartDetails details) {\n    _downDx = details.localPosition.dx;\n  }\n\n  void _onDragUpdate(DragUpdateDetails details) {\n    final from = _downDx!;\n    final to = details.localPosition.dx;\n    _animController.value = max(0, _isRTL ? from - to : to - from) / _maxWidth;\n  }\n\n  Widget slideList(ThemeData theme) => Listener(\n    onPointerDown: (event) => _slideDragGestureRecognizer?.addPointer(event),\n    child: buildList(theme),\n  );\n}\n\ntypedef IsDxAllowed = bool Function(double dx);\n\nclass SlideDragGestureRecognizer extends HorizontalDragGestureRecognizer {\n  SlideDragGestureRecognizer({\n    super.debugOwner,\n    super.supportedDevices,\n    super.allowedButtonsFilter,\n    required this.isDxAllowed,\n  });\n\n  final IsDxAllowed isDxAllowed;\n\n  @override\n  bool isPointerAllowed(PointerEvent event) {\n    return isDxAllowed(event.localPosition.dx) && super.isPointerAllowed(event);\n  }\n}\n\nclass TabBarDragGestureRecognizer\n    extends CustomHorizontalDragGestureRecognizer {\n  TabBarDragGestureRecognizer({\n    super.debugOwner,\n    super.supportedDevices,\n    super.allowedButtonsFilter,\n    required this.isDxAllowed,\n  });\n\n  final IsDxAllowed isDxAllowed;\n\n  @override\n  bool isPointerAllowed(PointerEvent event) {\n    return isDxAllowed(event.localPosition.dx) && super.isPointerAllowed(event);\n  }\n}\n"
  },
  {
    "path": "lib/pages/contact/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/pages/fan/view.dart';\nimport 'package:PiliPlus/pages/follow/child/child_view.dart';\nimport 'package:PiliPlus/pages/follow_search/view.dart';\nimport 'package:PiliPlus/pages/share/view.dart' show UserModel;\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass ContactPage extends StatefulWidget {\n  const ContactPage({super.key, this.isFromSelect = true});\n\n  final bool isFromSelect;\n\n  @override\n  State<ContactPage> createState() => _ContactPageState();\n}\n\nclass _ContactPageState extends State<ContactPage>\n    with SingleTickerProviderStateMixin {\n  late final mid = Accounts.main.mid;\n  late final TabController _controller;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = TabController(length: 2, vsync: this);\n  }\n\n  @override\n  void dispose() {\n    _controller.dispose();\n    super.dispose();\n  }\n\n  void onSelect(UserModel userModel) {\n    Get.back(result: userModel);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        title: const Text('通讯录'),\n        bottom: TabBar(\n          controller: _controller,\n          tabs: const [\n            Tab(text: '我的关注'),\n            Tab(text: '我的粉丝'),\n          ],\n        ),\n        actions: [\n          IconButton(\n            onPressed: () async {\n              final UserModel? userModel = await Navigator.of(context).push(\n                GetPageRoute(\n                  page: () => FollowSearchPage(\n                    mid: mid,\n                    isFromSelect: widget.isFromSelect,\n                  ),\n                ),\n              );\n              if (userModel != null) {\n                Get.back(result: userModel);\n              }\n            },\n            icon: const Icon(Icons.search),\n          ),\n          const SizedBox(width: 16),\n        ],\n      ),\n      body: tabBarView(\n        controller: _controller,\n        children: [\n          FollowChildPage(\n            mid: mid,\n            onSelect: widget.isFromSelect ? onSelect : null,\n          ),\n          FansPage(\n            showName: false,\n            onSelect: widget.isFromSelect ? onSelect : null,\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/danmaku/controller.dart",
    "content": "import 'dart:collection';\nimport 'dart:io' show File;\n\nimport 'package:PiliPlus/grpc/bilibili/community/service/dm/v1.pb.dart';\nimport 'package:PiliPlus/grpc/dm.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/plugin/pl_player/controller.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/data_source.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/path_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:path/path.dart' as path;\n\nclass PlDanmakuController {\n  PlDanmakuController(\n    this._cid,\n    this._plPlayerController,\n    this._isFileSource,\n  ) : _mergeDanmaku = _plPlayerController.mergeDanmaku;\n\n  final int _cid;\n  final PlPlayerController _plPlayerController;\n  final bool _mergeDanmaku;\n  final bool _isFileSource;\n\n  late final _isLogin = Accounts.main.isLogin;\n\n  final Map<int, List<DanmakuElem>> _dmSegMap = HashMap();\n  // 已请求的段落标记\n  late final Set<int> _requestedSeg = HashSet();\n\n  static const int segmentLength = 60 * 6 * 1000;\n\n  void dispose() {\n    _dmSegMap.clear();\n    _requestedSeg.clear();\n  }\n\n  static int calcSegment(int progress) {\n    return progress ~/ segmentLength;\n  }\n\n  Future<void> queryDanmaku(int segmentIndex) async {\n    if (_isFileSource) {\n      return;\n    }\n    if (_requestedSeg.contains(segmentIndex)) {\n      return;\n    }\n    _requestedSeg.add(segmentIndex);\n    final res = await DmGrpc.dmSegMobile(\n      cid: _cid,\n      segmentIndex: segmentIndex + 1,\n    );\n\n    if (res case Success(:final response)) {\n      if (response.state == 1) {\n        _plPlayerController.dmState.add(_cid);\n      }\n      handleDanmaku(response.elems);\n    } else {\n      _requestedSeg.remove(segmentIndex);\n    }\n  }\n\n  void handleDanmaku(List<DanmakuElem> elems) {\n    if (elems.isEmpty) return;\n    final uniques = HashMap<String, DanmakuElem>();\n\n    final filters = _plPlayerController.filters;\n    final shouldFilter = filters.count != 0;\n    for (final element in elems) {\n      if (_isLogin) {\n        element.isSelf = element.midHash == _plPlayerController.midHash;\n      }\n\n      if (!element.isSelf) {\n        if (_mergeDanmaku) {\n          final elem = uniques[element.content];\n          if (elem == null) {\n            uniques[element.content] = element..count = 1;\n          } else {\n            elem.count++;\n            continue;\n          }\n        }\n\n        if (shouldFilter && filters.remove(element)) {\n          continue;\n        }\n      }\n\n      final int pos = element.progress ~/ 100; //每0.1秒存储一次\n      (_dmSegMap[pos] ??= []).add(element);\n    }\n  }\n\n  List<DanmakuElem>? getCurrentDanmaku(int progress) {\n    if (_isFileSource) {\n      initFileDmIfNeeded();\n    } else {\n      final int segmentIndex = calcSegment(progress);\n      if (!_requestedSeg.contains(segmentIndex)) {\n        queryDanmaku(segmentIndex);\n        return null;\n      }\n    }\n    return _dmSegMap[progress ~/ 100];\n  }\n\n  bool _fileDmLoaded = false;\n\n  void initFileDmIfNeeded() {\n    if (_fileDmLoaded) return;\n    _fileDmLoaded = true;\n    _initFileDm();\n  }\n\n  @pragma('vm:notify-debugger-on-exception')\n  Future<void> _initFileDm() async {\n    try {\n      final file = File(\n        path.join(\n          (_plPlayerController.dataSource as FileSource).dir,\n          PathUtils.danmakuName,\n        ),\n      );\n      if (!file.existsSync()) return;\n      final bytes = await file.readAsBytes();\n      if (bytes.isEmpty) return;\n      final elem = DmSegMobileReply.fromBuffer(bytes).elems;\n      handleDanmaku(elem);\n    } catch (e, s) {\n      Utils.reportError(e, s);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/danmaku/danmaku_model.dart",
    "content": "sealed class DanmakuExtra {\n  Object get mid;\n  Object get id;\n\n  const DanmakuExtra();\n}\n\nclass VideoDanmaku extends DanmakuExtra {\n  @override\n  final int id;\n  @override\n  final String mid;\n\n  int like;\n\n  bool isLike;\n\n  VideoDanmaku({\n    required this.id,\n    required this.mid,\n    this.like = 0,\n    this.isLike = false,\n  });\n}\n\nclass LiveDanmaku extends DanmakuExtra {\n  @override\n  final Object id;\n  @override\n  final Object mid;\n\n  final int dmType;\n\n  final Object ts;\n  final Object ct;\n\n  const LiveDanmaku({\n    required this.id,\n    required this.mid,\n    required this.dmType,\n    required this.ts,\n    required this.ct,\n  });\n\n  Map<String, dynamic> toJson() => <String, dynamic>{\n    'id': id,\n    'mid': mid,\n    'dm_type': dmType,\n    'ts': ts,\n    'ct': ct,\n  };\n}\n"
  },
  {
    "path": "lib/pages/danmaku/view.dart",
    "content": "import 'dart:convert';\n\nimport 'package:PiliPlus/grpc/bilibili/community/service/dm/v1.pb.dart';\nimport 'package:PiliPlus/pages/danmaku/controller.dart';\nimport 'package:PiliPlus/pages/danmaku/danmaku_model.dart';\nimport 'package:PiliPlus/plugin/pl_player/controller.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/play_status.dart';\nimport 'package:PiliPlus/plugin/pl_player/utils/danmaku_options.dart';\nimport 'package:PiliPlus/utils/danmaku_utils.dart';\nimport 'package:canvas_danmaku/canvas_danmaku.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\n/// 传入播放器控制器，监听播放进度，加载对应弹幕\nclass PlDanmaku extends StatefulWidget {\n  final int cid;\n  final PlPlayerController playerController;\n  final bool isPipMode;\n  final bool isFullScreen;\n  final bool isFileSource;\n  final Size size;\n\n  const PlDanmaku({\n    super.key,\n    required this.cid,\n    required this.playerController,\n    this.isPipMode = false,\n    required this.isFullScreen,\n    required this.isFileSource,\n    required this.size,\n  });\n\n  @override\n  State<PlDanmaku> createState() => _PlDanmakuState();\n\n  bool get notFullscreen => !isFullScreen || isPipMode;\n}\n\nclass _PlDanmakuState extends State<PlDanmaku> {\n  PlPlayerController get playerController => widget.playerController;\n\n  late final PlDanmakuController _plDanmakuController;\n  DanmakuController<DanmakuExtra>? _controller;\n  int latestAddedPosition = -1;\n\n  @override\n  void initState() {\n    super.initState();\n    _plDanmakuController = PlDanmakuController(\n      widget.cid,\n      playerController,\n      widget.isFileSource,\n    );\n    if (playerController.enableShowDanmaku.value) {\n      if (widget.isFileSource) {\n        _plDanmakuController.initFileDmIfNeeded();\n      } else {\n        _plDanmakuController.queryDanmaku(\n          PlDanmakuController.calcSegment(\n            playerController.position.inMilliseconds,\n          ),\n        );\n      }\n    }\n    playerController\n      ..addStatusLister(playerListener)\n      ..addPositionListener(videoPositionListen);\n  }\n\n  @override\n  void didUpdateWidget(PlDanmaku oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (oldWidget.notFullscreen != widget.notFullscreen &&\n        !DanmakuOptions.sameFontScale) {\n      _controller?.updateOption(\n        DanmakuOptions.get(notFullscreen: widget.notFullscreen),\n      );\n    }\n  }\n\n  // 播放器状态监听\n  void playerListener(PlayerStatus status) {\n    if (_controller case final controller?) {\n      if (status.isPlaying) {\n        controller.resume();\n      } else {\n        controller.pause();\n      }\n    }\n  }\n\n  @pragma('vm:notify-debugger-on-exception')\n  void videoPositionListen(Duration position) {\n    if (_controller == null || !playerController.enableShowDanmaku.value) {\n      return;\n    }\n\n    if (!playerController.showDanmaku && !widget.isPipMode) {\n      return;\n    }\n\n    if (!playerController.playerStatus.isPlaying) {\n      return;\n    }\n\n    int currentPosition = position.inMilliseconds;\n    currentPosition -= currentPosition % 100; //取整百的毫秒数\n    if (currentPosition == latestAddedPosition) {\n      return;\n    }\n    latestAddedPosition = currentPosition;\n\n    List<DanmakuElem>? currentDanmakuList = _plDanmakuController\n        .getCurrentDanmaku(currentPosition);\n    if (currentDanmakuList != null) {\n      final blockColorful = DanmakuOptions.blockColorful;\n      for (DanmakuElem e in currentDanmakuList) {\n        if (e.mode == 7) {\n          try {\n            _controller!.addDanmaku(\n              SpecialDanmakuContentItem.fromList(\n                DmUtils.decimalToColor(e.color),\n                e.fontsize.toDouble(),\n                jsonDecode(e.content.replaceAll('\\n', '\\\\n')),\n                extra: VideoDanmaku(\n                  id: e.id.toInt(),\n                  mid: e.midHash,\n                  like: e.like.toInt(),\n                ),\n              ),\n            );\n          } catch (_) {}\n        } else {\n          _controller!.addDanmaku(\n            DanmakuContentItem(\n              e.content,\n              color: blockColorful\n                  ? Colors.white\n                  : DmUtils.decimalToColor(e.color),\n              type: DmUtils.getPosition(e.mode),\n              isColorful:\n                  playerController.showVipDanmaku &&\n                  e.colorful == DmColorfulType.VipGradualColor,\n              count: e.count > 1 ? e.count : null,\n              selfSend: e.isSelf,\n              extra: VideoDanmaku(\n                id: e.id.toInt(),\n                mid: e.midHash,\n                like: e.like.toInt(),\n              ),\n            ),\n          );\n        }\n      }\n    }\n  }\n\n  @override\n  void dispose() {\n    playerController\n      ..removePositionListener(videoPositionListen)\n      ..removeStatusLister(playerListener);\n    _plDanmakuController.dispose();\n    _controller = null;\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final option = DanmakuOptions.get(\n      notFullscreen: widget.notFullscreen,\n      speed: playerController.playbackSpeed,\n    );\n    return Obx(\n      () => AnimatedOpacity(\n        opacity: playerController.enableShowDanmaku.value\n            ? playerController.danmakuOpacity.value\n            : 0,\n        duration: const Duration(milliseconds: 100),\n        child: DanmakuScreen<DanmakuExtra>(\n          createdController: (e) {\n            playerController.danmakuController = _controller = e;\n          },\n          option: option,\n          size: widget.size,\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/danmaku_block/controller.dart",
    "content": "import 'dart:convert';\n\nimport 'package:PiliPlus/http/danmaku_block.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/dm_block_type.dart';\nimport 'package:PiliPlus/models/user/danmaku_block.dart';\nimport 'package:archive/archive.dart' show getCrc32;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass DanmakuBlockController extends GetxController\n    with GetSingleTickerProviderStateMixin {\n  late final List<RxList<SimpleRule>> rules = List.generate(\n    DmBlockType.values.length,\n    (_) => <SimpleRule>[].obs,\n  );\n\n  late TabController tabController;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryDanmakuFilter();\n    tabController = TabController(length: 3, vsync: this);\n  }\n\n  @override\n  void onClose() {\n    tabController.dispose();\n    super.onClose();\n  }\n\n  Future<void> queryDanmakuFilter() async {\n    SmartDialog.showLoading(msg: '正在同步弹幕屏蔽规则……');\n    final result = await DanmakuFilterHttp.danmakuFilter();\n    SmartDialog.dismiss();\n    if (result case Success(:final response)) {\n      rules[0].addAll(response.rule);\n      rules[1].addAll(response.rule1);\n      rules[2].addAll(response.rule2);\n      if (response.toast case final toast?) {\n        SmartDialog.showToast(toast);\n      }\n    } else {\n      result.toast();\n    }\n  }\n\n  Future<void> danmakuFilterDel(int tabIndex, int itemIndex, int id) async {\n    SmartDialog.showLoading(msg: '正在删除弹幕屏蔽规则……');\n    final res = await DanmakuFilterHttp.danmakuFilterDel(ids: id);\n    SmartDialog.dismiss();\n    if (res.isSuccess) {\n      rules[tabIndex].removeAt(itemIndex);\n      SmartDialog.showToast('删除成功');\n    } else {\n      res.toast();\n    }\n  }\n\n  Future<void> danmakuFilterAdd({\n    required String filter,\n    required int type,\n  }) async {\n    if (type == 2) {\n      filter = getCrc32(ascii.encode(filter), 0).toRadixString(16);\n    }\n    SmartDialog.showLoading(msg: '正在添加弹幕屏蔽规则……');\n    final res = await DanmakuFilterHttp.danmakuFilterAdd(\n      filter: filter,\n      type: type,\n    );\n    SmartDialog.dismiss();\n    if (res case Success(:final response)) {\n      rules[type].add(response);\n      SmartDialog.showToast('添加成功');\n    } else {\n      res.toast();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/danmaku_block/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/common/widgets/keep_alive_wrapper.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/models/common/dm_block_type.dart';\nimport 'package:PiliPlus/models/user/danmaku_block.dart';\nimport 'package:PiliPlus/models/user/danmaku_rule.dart';\nimport 'package:PiliPlus/pages/danmaku_block/controller.dart';\nimport 'package:PiliPlus/plugin/pl_player/controller.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass DanmakuBlockPage extends StatefulWidget {\n  const DanmakuBlockPage({super.key});\n\n  @override\n  State<DanmakuBlockPage> createState() => _DanmakuBlockPageState();\n}\n\nclass _DanmakuBlockPageState extends State<DanmakuBlockPage> {\n  final DanmakuBlockController _controller = Get.put(DanmakuBlockController());\n  late PlPlayerController plPlayerController;\n\n  @override\n  void initState() {\n    super.initState();\n    plPlayerController = Get.arguments as PlPlayerController;\n  }\n\n  @override\n  void dispose() {\n    final ruleFilter = RuleFilter.fromRuleTypeEntries(_controller.rules);\n    plPlayerController.filters = ruleFilter;\n    GStorage.localCache.put(LocalCacheKey.danmakuFilterRules, ruleFilter);\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        title: const Text('弹幕屏蔽'),\n        bottom: TabBar(\n          controller: _controller.tabController,\n          tabs: DmBlockType.values\n              .map(\n                (e) => Obx(\n                  () => Tab(\n                    text: '${e.label}(${_controller.rules[e.index].length})',\n                  ),\n                ),\n              )\n              .toList(),\n        ),\n      ),\n      body: tabBarView(\n        controller: _controller.tabController,\n        children: DmBlockType.values\n            .map(\n              (e) => KeepAliveWrapper(\n                child: Obx(\n                  () => tabViewBuilder(e.index, _controller.rules[e.index]),\n                ),\n              ),\n            )\n            .toList(),\n      ),\n      floatingActionButton: FloatingActionButton(\n        tooltip: '添加',\n        onPressed: () =>\n            _showAddDialog(DmBlockType.values[_controller.tabController.index]),\n        child: const Icon(Icons.add),\n      ),\n    );\n  }\n\n  Widget tabViewBuilder(final int tabIndex, List<SimpleRule> list) {\n    if (list.isEmpty) {\n      return scrollableError;\n    }\n    return ListView.builder(\n      itemCount: list.length,\n      padding: EdgeInsets.only(\n        bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n      ),\n      itemBuilder: (context, itemIndex) {\n        final SimpleRule item = list[itemIndex];\n        final child = iconButton(\n          iconSize: 20,\n          tooltip: '删除',\n          icon: const Icon(Icons.delete_outlined),\n          onPressed: () => showConfirmDialog(\n            context: context,\n            title: '确定删除该规则？',\n            onConfirm: () => _controller.danmakuFilterDel(\n              tabIndex,\n              itemIndex,\n              item.id,\n            ),\n          ),\n        );\n        return ListTile(\n          title: Text(\n            item.filter,\n            style: Theme.of(context).textTheme.bodyMedium,\n          ),\n          trailing: tabIndex == 2\n              ? child\n              : Row(\n                  mainAxisSize: MainAxisSize.min,\n                  children: [\n                    iconButton(\n                      iconSize: 20,\n                      tooltip: '编辑',\n                      icon: const Icon(Icons.edit_outlined),\n                      onPressed: () => _showAddDialog(\n                        DmBlockType.values[_controller.tabController.index],\n                        initFilter: item.filter,\n                        itemIndex: itemIndex,\n                        itemId: item.id,\n                      ),\n                    ),\n                    child,\n                  ],\n                ),\n        );\n      },\n    );\n  }\n\n  void _showAddDialog(\n    DmBlockType type, {\n    String initFilter = '',\n    int? itemIndex,\n    int? itemId,\n  }) {\n    assert((itemIndex == null) == (itemId == null));\n    String filter = initFilter;\n    final hintText = switch (type) {\n      DmBlockType.keyword => '输入过滤的关键词，其它类别请切换标签页后添加',\n      DmBlockType.regex => '输入//之间的正则表达式，无需包含头尾的\"/\"',\n      DmBlockType.uid => '输入用户UID',\n    };\n    final isUid = type == DmBlockType.uid;\n    showDialog(\n      context: context,\n      builder: (context) => AlertDialog(\n        title: Text('${itemId != null ? \"编辑\" : \"添加新的\"}${type.label}规则'),\n        content: Column(\n          mainAxisSize: MainAxisSize.min,\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            Text(hintText),\n            TextFormField(\n              autofocus: true,\n              initialValue: filter,\n              onChanged: (value) => filter = value,\n              keyboardType: isUid ? TextInputType.number : null,\n              inputFormatters: isUid\n                  ? [FilteringTextInputFormatter.digitsOnly]\n                  : null,\n            ),\n          ],\n        ),\n        actions: [\n          TextButton(\n            onPressed: Get.back,\n            child: Text(\n              '取消',\n              style: TextStyle(color: Theme.of(context).colorScheme.outline),\n            ),\n          ),\n          TextButton(\n            child: const Text('确定'),\n            onPressed: () async {\n              if (filter != initFilter) {\n                Get.back();\n                if (itemId != null) {\n                  await _controller.danmakuFilterDel(\n                    type.index,\n                    itemIndex!,\n                    itemId,\n                  );\n                }\n                await _controller.danmakuFilterAdd(\n                  filter: filter,\n                  type: type.index,\n                );\n              } else {\n                SmartDialog.showToast(\n                  '输入内容${filter.isEmpty ? \"不能为空\" : \"与上次相同\"}',\n                );\n              }\n            },\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/dlna/view.dart",
    "content": "import 'dart:async';\n\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/common/widgets/view_sliver_safe_area.dart';\nimport 'package:dlna_dart/dlna.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass DLNAPage extends StatefulWidget {\n  const DLNAPage({super.key});\n\n  @override\n  State<DLNAPage> createState() => _DLNAPageState();\n}\n\nclass _DLNAPageState extends State<DLNAPage> {\n  final _searcher = DLNAManager();\n  final Map<String, DLNADevice> _deviceList = {};\n  late final _url = Get.parameters['url']!;\n  late final _title = Get.parameters['title'];\n\n  Timer? _timer;\n  bool _isSearching = false;\n  DLNADevice? _lastDevice;\n  String? _lastDeviceKey;\n\n  @override\n  void initState() {\n    super.initState();\n    _onSearch(isInit: true);\n  }\n\n  Future<void> _onSearch({bool isInit = false}) async {\n    if (_isSearching) return;\n    _isSearching = true;\n    if (!isInit && mounted) {\n      _lastDevice = null;\n      _deviceList.clear();\n      setState(() {});\n    }\n    final deviceManager = await _searcher.start();\n    if (!mounted) {\n      return;\n    }\n    _timer = Timer(const Duration(seconds: 20), _searcher.stop);\n    await for (final deviceList in deviceManager.devices.stream) {\n      if (mounted) {\n        _deviceList.addAll(deviceList);\n        setState(() {});\n      }\n    }\n    if (mounted) {\n      setState(() {\n        _isSearching = false;\n      });\n    }\n  }\n\n  @override\n  void dispose() {\n    _timer?.cancel();\n    _timer = null;\n    _searcher.stop();\n    _lastDevice = null;\n    _lastDeviceKey = null;\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final colorScheme = ColorScheme.of(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        title: const Text('投屏'),\n        actions: [\n          IconButton(\n            tooltip: '搜索',\n            onPressed: _onSearch,\n            icon: const Icon(Icons.refresh),\n          ),\n          const SizedBox(width: 6),\n        ],\n      ),\n      body: CustomScrollView(\n        slivers: [\n          if (_isSearching) linearLoading,\n          ViewSliverSafeArea(sliver: _buildBody(colorScheme)),\n        ],\n      ),\n    );\n  }\n\n  Widget _buildBody(ColorScheme colorScheme) {\n    if (!_isSearching && _deviceList.isEmpty) {\n      return HttpError(\n        errMsg: '没有设备',\n        onReload: _onSearch,\n      );\n    }\n    if (_deviceList.isNotEmpty) {\n      final keys = _deviceList.keys.toList();\n      return SliverList.builder(\n        itemCount: keys.length,\n        itemBuilder: (context, index) {\n          final key = keys[index];\n          final device = _deviceList[key]!;\n          final isCurr = key == _lastDeviceKey;\n          return ListTile(\n            title: Text(\n              device.info.friendlyName,\n              style: isCurr ? TextStyle(color: colorScheme.primary) : null,\n            ),\n            subtitle: Text(key),\n            onTap: () async {\n              if (isCurr) return;\n              _lastDevice?.pause();\n              _lastDevice = device;\n              _lastDeviceKey = key;\n              setState(() {});\n              await device.setUrl(_url, title: _title ?? '');\n              await device.play();\n            },\n          );\n        },\n      );\n    }\n    return const SliverToBoxAdapter();\n  }\n}\n"
  },
  {
    "path": "lib/pages/download/controller.dart",
    "content": "import 'dart:async';\n\nimport 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/models_new/download/download_info.dart';\nimport 'package:PiliPlus/pages/common/multi_select/base.dart'\n    show BaseMultiSelectMixin;\nimport 'package:PiliPlus/services/download/download_service.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass DownloadPageController extends GetxController\n    with BaseMultiSelectMixin<DownloadPageInfo> {\n  final _downloadService = Get.find<DownloadService>();\n  final pages = RxList<DownloadPageInfo>();\n  final flag = RxInt(0);\n\n  @override\n  List<DownloadPageInfo> get list => pages;\n  @override\n  RxList<DownloadPageInfo> get state => pages;\n\n  @override\n  void onInit() {\n    super.onInit();\n    _loadList();\n    _downloadService.flagNotifier.add(_loadList);\n  }\n\n  @override\n  void onClose() {\n    _downloadService.flagNotifier.remove(_loadList);\n    super.onClose();\n  }\n\n  Future<void> _loadList() async {\n    await _downloadService.waitForInitialization;\n    if (isClosed) return;\n    if (_downloadService.downloadList.isEmpty) {\n      pages.clear();\n      return;\n    }\n    final list = <DownloadPageInfo>[];\n    for (final entry in _downloadService.downloadList) {\n      final pageId = entry.pageId;\n      final page = list.firstWhereOrNull((e) => e.pageId == pageId);\n      if (page != null) {\n        final aSortKey = entry.sortKey;\n        final bSortKey = page.sortKey;\n        if (aSortKey < bSortKey) {\n          page\n            ..cover = entry.cover\n            ..sortKey = aSortKey;\n        }\n        page.entries.add(entry);\n      } else {\n        list.add(\n          DownloadPageInfo(\n            pageId: pageId,\n            dirPath: entry.pageDirPath,\n            title: entry.title,\n            cover: entry.cover,\n            sortKey: entry.sortKey,\n            seasonType: entry.ep?.seasonType,\n            entries: [entry],\n          ),\n        );\n      }\n    }\n    pages.value = list;\n    flag.value++;\n  }\n\n  @override\n  void onRemove() {\n    showConfirmDialog(\n      context: Get.context!,\n      title: '确定删除选中视频？',\n      onConfirm: () async {\n        SmartDialog.showLoading();\n        final watchProgress = GStorage.watchProgress;\n        for (final page in allChecked) {\n          await watchProgress.deleteAll(\n            page.entries.map((e) => e.cid.toString()),\n          );\n          await _downloadService.deletePage(\n            pageDirPath: page.dirPath,\n            refresh: false,\n          );\n        }\n        _downloadService.flagNotifier.refresh();\n        if (enableMultiSelect.value) {\n          rxCount.value = 0;\n          enableMultiSelect.value = false;\n        }\n        SmartDialog.dismiss();\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/download/detail/view.dart",
    "content": "import 'dart:async';\n\nimport 'package:PiliPlus/common/widgets/appbar/appbar.dart';\nimport 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/common/widgets/flutter/pop_scope.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/view_sliver_safe_area.dart';\nimport 'package:PiliPlus/models_new/download/bili_download_entry_info.dart';\nimport 'package:PiliPlus/pages/common/multi_select/base.dart'\n    show BaseMultiSelectMixin;\nimport 'package:PiliPlus/pages/download/controller.dart';\nimport 'package:PiliPlus/pages/download/detail/widgets/item.dart';\nimport 'package:PiliPlus/services/download/download_service.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:flutter/material.dart'\n    hide SliverGridDelegateWithMaxCrossAxisExtent;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass DownloadDetailPage extends StatefulWidget {\n  const DownloadDetailPage({\n    super.key,\n    required this.pageId,\n    required this.title,\n    required this.progress,\n  });\n\n  final String pageId;\n  final String title;\n  final ChangeNotifier progress;\n\n  @override\n  State<DownloadDetailPage> createState() => _DownloadDetailPageState();\n}\n\nclass _DownloadDetailPageState extends State<DownloadDetailPage>\n    with BaseMultiSelectMixin<BiliDownloadEntryInfo> {\n  StreamSubscription? _sub;\n  final _downloadItems = RxList<BiliDownloadEntryInfo>();\n  final _controller = Get.find<DownloadPageController>();\n  final _downloadService = Get.find<DownloadService>();\n  @override\n  RxList<BiliDownloadEntryInfo> get list => _downloadItems;\n  @override\n  RxList<BiliDownloadEntryInfo> get state => _downloadItems;\n\n  @override\n  void initState() {\n    super.initState();\n    _loadList();\n    _sub = _controller.flag.listen((_) {\n      _loadList();\n    });\n  }\n\n  Future<void> _closeSub() async {\n    if (_sub != null) {\n      await _sub?.cancel();\n      _sub = null;\n    }\n  }\n\n  @override\n  void dispose() {\n    _closeSub();\n    super.dispose();\n  }\n\n  void _loadList() {\n    final list =\n        _controller.pages\n            .firstWhereOrNull((e) => e.pageId == widget.pageId)\n            ?.entries\n          ?..sort((a, b) => a.sortKey.compareTo(b.sortKey));\n    if (list != null) {\n      _downloadItems.value = list;\n    } else {\n      _downloadItems.clear();\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final colorScheme = ColorScheme.of(context);\n    return Obx(() {\n      final enableMultiSelect = this.enableMultiSelect.value;\n      return popScope(\n        canPop: !enableMultiSelect,\n        onPopInvokedWithResult: (didPop, result) {\n          if (enableMultiSelect) {\n            handleSelect();\n          }\n        },\n        child: Scaffold(\n          resizeToAvoidBottomInset: false,\n          appBar: MultiSelectAppBarWidget(\n            ctr: this,\n            actions: [\n              TextButton(\n                style: TextButton.styleFrom(\n                  visualDensity: VisualDensity.compact,\n                ),\n                onPressed: () async {\n                  final allChecked = this.allChecked.toSet();\n                  handleSelect();\n                  final res = await Future.wait(\n                    allChecked.map(\n                      (e) => _downloadService.downloadDanmaku(\n                        entry: e,\n                        isUpdate: true,\n                      ),\n                    ),\n                  );\n                  if (res.every((e) => e)) {\n                    SmartDialog.showToast('更新成功');\n                  } else {\n                    SmartDialog.showToast('更新失败');\n                  }\n                },\n                child: Text(\n                  '更新',\n                  style: TextStyle(color: colorScheme.onSurface),\n                ),\n              ),\n            ],\n            child: AppBar(\n              title: Text(widget.title),\n              actions: [\n                IconButton(\n                  tooltip: '多选',\n                  onPressed: () {\n                    if (enableMultiSelect) {\n                      handleSelect();\n                    } else {\n                      this.enableMultiSelect.value = true;\n                    }\n                  },\n                  icon: const Icon(Icons.edit_note),\n                ),\n                const SizedBox(width: 6),\n              ],\n            ),\n          ),\n          body: CustomScrollView(\n            slivers: [\n              ViewSliverSafeArea(\n                sliver: Obx(() {\n                  if (_downloadItems.isNotEmpty) {\n                    return SliverGrid.builder(\n                      gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(\n                        mainAxisSpacing: 2,\n                        mainAxisExtent: 100,\n                        maxCrossAxisExtent: Grid.smallCardWidth * 2,\n                      ),\n                      itemBuilder: (context, index) {\n                        final entry = _downloadItems[index];\n                        return DetailItem(\n                          entry: entry,\n                          progress: widget.progress,\n                          downloadService: _downloadService,\n                          showTitle: false,\n                          onDelete: () async {\n                            if (_downloadItems.length == 1) {\n                              await _closeSub();\n                              await _downloadService.deletePage(\n                                pageDirPath: entry.pageDirPath,\n                              );\n                              if (mounted) {\n                                Get.back();\n                              }\n                            } else {\n                              _downloadService.deleteDownload(\n                                entry: entry,\n                                removeList: true,\n                              );\n                            }\n                            GStorage.watchProgress.delete(entry.cid.toString());\n                          },\n                          controller: this,\n                        );\n                      },\n                      itemCount: _downloadItems.length,\n                    );\n                  }\n                  return const HttpError();\n                }),\n              ),\n            ],\n          ),\n        ),\n      );\n    });\n  }\n\n  @override\n  void onRemove() {\n    showConfirmDialog(\n      context: context,\n      title: '确定删除选中视频？',\n      onConfirm: () async {\n        SmartDialog.showLoading();\n        final watchProgress = GStorage.watchProgress;\n        final allChecked = this.allChecked.toSet();\n        final isDeleteAll = allChecked.length == _downloadItems.length;\n        if (isDeleteAll) {\n          await _closeSub();\n        }\n        for (final entry in allChecked) {\n          await watchProgress.deleteAll(\n            allChecked.map((e) => e.cid.toString()),\n          );\n          await _downloadService.deleteDownload(\n            entry: entry,\n            removeList: true,\n            refresh: false,\n          );\n        }\n        _downloadService.flagNotifier.refresh();\n        if (isDeleteAll) {\n          SmartDialog.dismiss();\n          if (mounted) {\n            Get.back();\n          }\n        } else {\n          if (enableMultiSelect.value) {\n            rxCount.value = 0;\n            enableMultiSelect.value = false;\n          }\n          SmartDialog.dismiss();\n        }\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/download/detail/widgets/item.dart",
    "content": "import 'dart:io';\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/progress_bar/video_progress_indicator.dart';\nimport 'package:PiliPlus/common/widgets/select_mask.dart';\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models/common/video/source_type.dart';\nimport 'package:PiliPlus/models/common/video/video_quality.dart';\nimport 'package:PiliPlus/models_new/download/bili_download_entry_info.dart';\nimport 'package:PiliPlus/pages/common/multi_select/base.dart';\nimport 'package:PiliPlus/pages/download/downloading/view.dart';\nimport 'package:PiliPlus/services/download/download_service.dart';\nimport 'package:PiliPlus/utils/cache_manager.dart';\nimport 'package:PiliPlus/utils/duration_utils.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/path_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:path/path.dart' as path;\n\nclass DetailItem extends StatelessWidget {\n  const DetailItem({\n    super.key,\n    required this.entry,\n    this.progress,\n    required this.downloadService,\n    this.onDelete,\n    required this.showTitle,\n    this.isCurr = false,\n    //\n    required this.controller,\n    this.checked,\n    this.onSelect,\n  });\n\n  final BiliDownloadEntryInfo entry;\n  final ChangeNotifier? progress;\n  final DownloadService downloadService;\n  final VoidCallback? onDelete;\n  final bool showTitle;\n  final bool isCurr;\n  //\n  final MultiSelectBase controller;\n  final bool? checked;\n  final ValueChanged<BiliDownloadEntryInfo>? onSelect;\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    final outline = theme.colorScheme.outline;\n    final cid = entry.source?.cid ?? entry.pageData?.cid;\n    final canDel = onDelete != null;\n    final enableMultiSelect = controller.enableMultiSelect.value;\n    void onLongPress() => canDel && !enableMultiSelect\n        ? showDialog(\n            context: context,\n            builder: (context) => AlertDialog(\n              clipBehavior: Clip.hardEdge,\n              contentPadding: const EdgeInsets.symmetric(vertical: 12),\n              content: Column(\n                mainAxisSize: MainAxisSize.min,\n                children: [\n                  ListTile(\n                    onTap: () {\n                      Get.back();\n                      showConfirmDialog(\n                        context: context,\n                        title: '确定删除该视频？',\n                        onConfirm: onDelete,\n                      );\n                    },\n                    dense: true,\n                    title: const Text(\n                      '删除',\n                      style: TextStyle(fontSize: 14),\n                    ),\n                  ),\n                  ListTile(\n                    onTap: () async {\n                      Get.back();\n                      final res = await downloadService.downloadDanmaku(\n                        entry: entry,\n                        isUpdate: true,\n                      );\n                      if (res) {\n                        SmartDialog.showToast('更新成功');\n                      } else {\n                        SmartDialog.showToast('更新失败');\n                      }\n                    },\n                    dense: true,\n                    title: const Text(\n                      '更新弹幕',\n                      style: TextStyle(fontSize: 14),\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          )\n        : null;\n\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onTap: () async {\n          if (!canDel) {\n            Get.to(const DownloadingPage());\n            return;\n          }\n          if (enableMultiSelect) {\n            (onSelect ?? controller.onSelect).call(entry);\n            return;\n          }\n          if (entry.isCompleted) {\n            await PageUtils.toVideoPage(\n              aid: entry.avid,\n              cid: cid!,\n              cover: entry.cover,\n              title: entry.showTitle,\n              extraArguments: {\n                'sourceType': SourceType.file,\n                'entry': entry,\n                'dirPath': entry.entryDirPath,\n              },\n            );\n            if (context.mounted) {\n              Future.delayed(const Duration(milliseconds: 400), () {\n                if (context.mounted) {\n                  // ignore: invalid_use_of_protected_member, invalid_use_of_visible_for_testing_member\n                  progress?.notifyListeners();\n                }\n              });\n            }\n          } else {\n            final curDownload = downloadService.curDownload.value;\n            if (curDownload != null &&\n                curDownload.cid == cid &&\n                curDownload.status.isDownloading) {\n              downloadService.cancelDownload(\n                isDelete: false,\n                downloadNext: false,\n              );\n            } else {\n              downloadService.startDownload(entry);\n            }\n          }\n        },\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        child: Padding(\n          padding: const EdgeInsets.symmetric(\n            horizontal: StyleString.safeSpace,\n            vertical: 5,\n          ),\n          child: Row(\n            spacing: 10,\n            children: [\n              Stack(\n                clipBehavior: Clip.none,\n                children: [\n                  AspectRatio(\n                    aspectRatio: StyleString.aspectRatio,\n                    child: LayoutBuilder(\n                      builder: (context, constraints) {\n                        final cover = File(\n                          path.join(entry.entryDirPath, PathUtils.coverName),\n                        );\n                        final maxWidth = constraints.maxWidth;\n                        final maxHeight = constraints.maxHeight;\n                        int? cacheWidth, cacheHeight;\n                        if (entry.pageData?.cacheWidth ?? false) {\n                          cacheWidth = maxWidth.cacheSize(context);\n                        } else {\n                          cacheHeight = maxHeight.cacheSize(context);\n                        }\n                        return cover.existsSync()\n                            ? ClipRRect(\n                                borderRadius: StyleString.mdRadius,\n                                child: Image.file(\n                                  cover,\n                                  width: maxWidth,\n                                  height: maxHeight,\n                                  fit: BoxFit.cover,\n                                  cacheWidth: cacheWidth,\n                                  cacheHeight: cacheHeight,\n                                  colorBlendMode: NetworkImgLayer.reduce\n                                      ? BlendMode.modulate\n                                      : null,\n                                  color: NetworkImgLayer.reduce\n                                      ? NetworkImgLayer.reduceLuxColor\n                                      : null,\n                                ),\n                              )\n                            : NetworkImgLayer(\n                                src: entry.cover,\n                                width: maxWidth,\n                                height: maxHeight,\n                                cacheWidth: entry.pageData?.cacheWidth,\n                              );\n                      },\n                    ),\n                  ),\n                  if (entry.videoQuality case final videoQuality?)\n                    PBadge(\n                      text: VideoQuality.fromCode(videoQuality).shortDesc,\n                      right: 6.0,\n                      top: 6.0,\n                      type: PBadgeType.gray,\n                    ),\n                  if (progress != null)\n                    ListenableBuilder(\n                      listenable: progress!,\n                      builder: (_, _) {\n                        final progress = GStorage.watchProgress.get(\n                          cid.toString(),\n                        );\n                        if (progress != null) {\n                          return Positioned(\n                            left: 0,\n                            right: 0,\n                            bottom: 0,\n                            child: Stack(\n                              clipBehavior: Clip.none,\n                              children: [\n                                VideoProgressIndicator(\n                                  color: theme.colorScheme.primary,\n                                  backgroundColor:\n                                      theme.colorScheme.secondaryContainer,\n                                  progress: progress / entry.totalTimeMilli,\n                                ),\n                                PBadge(\n                                  text: progress >= entry.totalTimeMilli - 400\n                                      ? '已看完'\n                                      : '${DurationUtils.formatDuration(\n                                              progress ~/ 1000,\n                                            )}/'\n                                            '${DurationUtils.formatDuration(\n                                              entry.totalTimeMilli ~/ 1000,\n                                            )}',\n                                  right: 6,\n                                  bottom: 7,\n                                  type: PBadgeType.gray,\n                                ),\n                              ],\n                            ),\n                          );\n                        }\n                        return PBadge(\n                          text: DurationUtils.formatDuration(\n                            entry.totalTimeMilli ~/ 1000,\n                          ),\n                          right: 6.0,\n                          bottom: 7.0,\n                          type: PBadgeType.gray,\n                        );\n                      },\n                    )\n                  else if (entry.totalTimeMilli != 0)\n                    PBadge(\n                      text: DurationUtils.formatDuration(\n                        entry.totalTimeMilli ~/ 1000,\n                      ),\n                      right: 6,\n                      bottom: 7,\n                      type: PBadgeType.gray,\n                    ),\n                  Positioned.fill(\n                    child: selectMask(theme, checked ?? entry.checked),\n                  ),\n                ],\n              ),\n              Expanded(\n                child: Stack(\n                  clipBehavior: Clip.none,\n                  children: [\n                    Column(\n                      spacing: 5,\n                      crossAxisAlignment: CrossAxisAlignment.start,\n                      children: [\n                        Text(\n                          showTitle ? entry.title : entry.showTitle,\n                          textAlign: TextAlign.start,\n                          style: TextStyle(\n                            fontSize: theme.textTheme.bodyMedium!.fontSize,\n                            height: 1.42,\n                            letterSpacing: 0.3,\n                          ),\n                          maxLines: showTitle\n                              ? entry.ep != null\n                                    ? 1\n                                    : 2\n                              : 2,\n                          overflow: TextOverflow.ellipsis,\n                        ),\n                        if (showTitle) ...[\n                          if (entry.pageData?.part case final part?)\n                            if (part != entry.title)\n                              Text(\n                                part,\n                                maxLines: 1,\n                                overflow: TextOverflow.ellipsis,\n                                style: TextStyle(\n                                  fontSize: 12,\n                                  color: theme.colorScheme.onSurfaceVariant,\n                                ),\n                              ),\n                          if (entry.ep?.showTitle case final showTitle?)\n                            Text(\n                              showTitle,\n                              maxLines: 2,\n                              overflow: TextOverflow.ellipsis,\n                              style: TextStyle(\n                                fontSize: 12,\n                                color: theme.colorScheme.onSurfaceVariant,\n                              ),\n                            ),\n                        ],\n                      ],\n                    ),\n                    if (entry.isCompleted) ...[\n                      Positioned(\n                        left: 0,\n                        bottom: 0,\n                        child: Text(\n                          '${CacheManager.formatSize(entry.totalBytes)}${entry.ownerName != null ? '  ${entry.ownerName}' : ''}',\n                          style: TextStyle(\n                            fontSize: 12,\n                            height: 1.6,\n                            color: outline,\n                          ),\n                        ),\n                      ),\n                      Positioned(\n                        right: 0,\n                        bottom: 0,\n                        child: entry.moreBtn(theme),\n                      ),\n                    ] else\n                      Positioned(\n                        left: 0,\n                        right: 0,\n                        bottom: 0,\n                        child: isCurr\n                            ? RepaintBoundary(\n                                child: Obx(\n                                  () {\n                                    final curDownload =\n                                        downloadService.curDownload.value;\n                                    if (curDownload != null) {\n                                      final status = curDownload.status;\n                                      final color =\n                                          status != DownloadStatus.pause\n                                          ? theme.colorScheme.primary\n                                          : theme.colorScheme.outline;\n                                      return progressWidget(\n                                        statusMsg: status.message,\n                                        progressStr:\n                                            status ==\n                                                    DownloadStatus\n                                                        .downloading ||\n                                                status == DownloadStatus.pause\n                                            ? '${CacheManager.formatSize(curDownload.downloadedBytes)}/${CacheManager.formatSize(curDownload.totalBytes)}'\n                                            : '',\n                                        progress: curDownload.totalBytes == 0\n                                            ? 0\n                                            : curDownload.downloadedBytes /\n                                                  curDownload.totalBytes,\n                                        color: color,\n                                        highlightColor: theme.highlightColor,\n                                      );\n                                    }\n                                    return entryProgress(theme);\n                                  },\n                                ),\n                              )\n                            : entryProgress(theme),\n                      ),\n                  ],\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget entryProgress(ThemeData theme) => progressWidget(\n    statusMsg: entry.status.message,\n    progressStr: entry.totalBytes == 0\n        ? ''\n        : '${CacheManager.formatSize(entry.downloadedBytes)}/${CacheManager.formatSize(entry.totalBytes)}',\n    progress: entry.totalBytes == 0\n        ? 0\n        : entry.downloadedBytes / entry.totalBytes,\n    color: theme.colorScheme.outline,\n    highlightColor: theme.highlightColor,\n  );\n\n  Widget progressWidget({\n    required String statusMsg,\n    required String progressStr,\n    required double progress,\n    required Color color,\n    required Color highlightColor,\n  }) {\n    return Column(\n      spacing: 6,\n      mainAxisSize: MainAxisSize.min,\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        Row(\n          mainAxisAlignment: MainAxisAlignment.spaceBetween,\n          children: [\n            Text(\n              statusMsg,\n              style: TextStyle(\n                fontSize: 12,\n                height: 1,\n                color: color,\n              ),\n            ),\n            Text(\n              progressStr,\n              style: TextStyle(\n                fontSize: 12,\n                height: 1,\n                color: color,\n              ),\n            ),\n          ],\n        ),\n        LinearProgressIndicator(\n          // ignore: deprecated_member_use\n          year2023: true,\n          minHeight: 2.5,\n          borderRadius: StyleString.mdRadius,\n          color: color,\n          backgroundColor: highlightColor,\n          value: progress,\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/download/downloading/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/appbar/appbar.dart';\nimport 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/common/widgets/flutter/pop_scope.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/view_sliver_safe_area.dart';\nimport 'package:PiliPlus/models_new/download/bili_download_entry_info.dart';\nimport 'package:PiliPlus/pages/common/multi_select/base.dart'\n    show BaseMultiSelectMixin;\nimport 'package:PiliPlus/pages/download/detail/widgets/item.dart';\nimport 'package:PiliPlus/services/download/download_service.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart'\n    hide SliverGridDelegateWithMaxCrossAxisExtent;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.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    with BaseMultiSelectMixin<BiliDownloadEntryInfo> {\n  final _downloadService = Get.find<DownloadService>();\n  late final _waitDownloadQueue = _downloadService.waitDownloadQueue;\n  @override\n  RxList<BiliDownloadEntryInfo> get list => _waitDownloadQueue;\n  @override\n  RxList<BiliDownloadEntryInfo> get state => _waitDownloadQueue;\n\n  @override\n  Widget build(BuildContext context) {\n    return Obx(() {\n      final enableMultiSelect = this.enableMultiSelect.value;\n      return popScope(\n        canPop: !enableMultiSelect,\n        onPopInvokedWithResult: (didPop, result) {\n          if (enableMultiSelect) {\n            handleSelect();\n          }\n        },\n        child: Scaffold(\n          resizeToAvoidBottomInset: false,\n          appBar: MultiSelectAppBarWidget(\n            ctr: this,\n            child: AppBar(\n              title: const Text('正在缓存'),\n              actions: [\n                IconButton(\n                  tooltip: '多选',\n                  onPressed: () {\n                    if (enableMultiSelect) {\n                      handleSelect();\n                    } else {\n                      this.enableMultiSelect.value = true;\n                    }\n                  },\n                  icon: const Icon(Icons.edit_note),\n                ),\n                const SizedBox(width: 6),\n              ],\n            ),\n          ),\n          body: CustomScrollView(\n            slivers: [\n              ViewSliverSafeArea(\n                sliver: Obx(() {\n                  if (_waitDownloadQueue.isNotEmpty) {\n                    return SliverGrid.builder(\n                      gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(\n                        mainAxisSpacing: 2,\n                        mainAxisExtent: 100,\n                        maxCrossAxisExtent: Grid.smallCardWidth * 2,\n                      ),\n                      itemCount: _waitDownloadQueue.length,\n                      itemBuilder: (context, index) {\n                        final entry = _waitDownloadQueue[index];\n                        final isCurr = entry.cid == _downloadService.curCid;\n                        return DetailItem(\n                          entry: entry,\n                          downloadService: _downloadService,\n                          showTitle: true,\n                          isCurr: isCurr,\n                          onDelete: () => _downloadService.deleteDownload(\n                            entry: entry,\n                            removeQueue: true,\n                            downloadNext:\n                                isCurr &&\n                                entry.status == DownloadStatus.downloading,\n                          ),\n                          controller: this,\n                        );\n                      },\n                    );\n                  }\n                  return const HttpError();\n                }),\n              ),\n            ],\n          ),\n        ),\n      );\n    });\n  }\n\n  @override\n  void onRemove() {\n    showConfirmDialog(\n      context: context,\n      title: '确定删除选中视频？',\n      onConfirm: () async {\n        SmartDialog.showLoading();\n        final allChecked = this.allChecked.toSet();\n        final isDownloading =\n            _downloadService.curDownload.value?.status ==\n            DownloadStatus.downloading;\n        for (final entry in allChecked) {\n          await _downloadService.deleteDownload(\n            entry: entry,\n            refresh: false,\n            downloadNext: false,\n          );\n        }\n        _downloadService.waitDownloadQueue.removeWhere(allChecked.contains);\n        if (isDownloading && _downloadService.curDownload.value == null) {\n          _downloadService.nextDownload();\n        }\n        if (enableMultiSelect.value) {\n          rxCount.value = 0;\n          enableMultiSelect.value = false;\n        }\n        SmartDialog.dismiss();\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/download/search/controller.dart",
    "content": "import 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/download/bili_download_entry_info.dart';\nimport 'package:PiliPlus/pages/common/multi_select/base.dart'\n    show BaseMultiSelectMixin;\nimport 'package:PiliPlus/pages/common/search/common_search_controller.dart';\nimport 'package:PiliPlus/services/download/download_service.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass DownloadSearchController\n    extends\n        CommonSearchController<\n          List<BiliDownloadEntryInfo>,\n          BiliDownloadEntryInfo\n        >\n    with BaseMultiSelectMixin<BiliDownloadEntryInfo> {\n  final _downloadService = Get.find<DownloadService>();\n\n  @override\n  List<BiliDownloadEntryInfo> get list => loadingState.value.data!;\n  @override\n  Rx<LoadingState<List<BiliDownloadEntryInfo>?>> get state => loadingState;\n\n  @override\n  Future<LoadingState<List<BiliDownloadEntryInfo>>> customGetData() async {\n    final text = editController.text.toLowerCase();\n    return Success(\n      _downloadService.downloadList\n          .where(\n            (e) =>\n                e.title.toLowerCase().contains(text) ||\n                e.showTitle.toLowerCase().contains(text),\n          )\n          .toList(),\n    );\n  }\n\n  void onRemoveSingle(int index, BiliDownloadEntryInfo entry) {\n    loadingState\n      ..value.data!.removeAt(index)\n      ..refresh();\n    _downloadService.deleteDownload(\n      entry: entry,\n      removeList: true,\n    );\n    GStorage.watchProgress.delete(entry.cid.toString());\n  }\n\n  @override\n  void onRemove() {\n    showConfirmDialog(\n      context: Get.context!,\n      title: '确定删除选中视频？',\n      onConfirm: () async {\n        SmartDialog.showLoading();\n        final allChecked = this.allChecked.toSet();\n        for (final entry in allChecked) {\n          await GStorage.watchProgress.delete(entry.cid.toString());\n          await _downloadService.deleteDownload(\n            entry: entry,\n            removeList: true,\n            refresh: false,\n          );\n        }\n        loadingState\n          ..value.data!.removeWhere(allChecked.contains)\n          ..refresh();\n        _downloadService.flagNotifier.refresh();\n        if (enableMultiSelect.value) {\n          rxCount.value = 0;\n          enableMultiSelect.value = false;\n        }\n        SmartDialog.dismiss();\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/download/search/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/download/bili_download_entry_info.dart';\nimport 'package:PiliPlus/pages/common/search/common_search_page.dart';\nimport 'package:PiliPlus/pages/download/detail/widgets/item.dart';\nimport 'package:PiliPlus/pages/download/search/controller.dart';\nimport 'package:PiliPlus/services/download/download_service.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart'\n    hide SliverGridDelegateWithMaxCrossAxisExtent;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass DownloadSearchPage extends StatefulWidget {\n  const DownloadSearchPage({\n    super.key,\n    required this.progress,\n  });\n\n  final ChangeNotifier progress;\n\n  @override\n  State<DownloadSearchPage> createState() => _DownloadSearchPageState();\n}\n\nclass _DownloadSearchPageState\n    extends\n        CommonSearchPageState<\n          DownloadSearchPage,\n          List<BiliDownloadEntryInfo>,\n          BiliDownloadEntryInfo\n        > {\n  @override\n  DownloadSearchController controller = Get.put(DownloadSearchController());\n  final _downloadService = Get.find<DownloadService>();\n\n  @override\n  List<Widget>? get extraActions => [\n    IconButton(\n      tooltip: '多选',\n      onPressed: () {\n        if (controller.loadingState.value is! Success) {\n          return;\n        }\n        if (controller.enableMultiSelect.value) {\n          controller.handleSelect();\n        } else {\n          controller.enableMultiSelect.value = true;\n        }\n      },\n      icon: const Icon(Icons.edit_note),\n    ),\n  ];\n\n  @override\n  List<Widget>? get multiSelectActions => [\n    TextButton(\n      style: TextButton.styleFrom(visualDensity: VisualDensity.compact),\n      onPressed: () async {\n        final allChecked = controller.allChecked.toSet();\n        controller.handleSelect();\n        final res = await Future.wait(\n          allChecked.map(\n            (e) => _downloadService.downloadDanmaku(\n              entry: e,\n              isUpdate: true,\n            ),\n          ),\n        );\n        if (res.every((e) => e)) {\n          SmartDialog.showToast('更新成功');\n        } else {\n          SmartDialog.showToast('更新失败');\n        }\n      },\n      child: Text(\n        '更新',\n        style: TextStyle(color: Get.theme.colorScheme.onSurface),\n      ),\n    ),\n  ];\n\n  @override\n  Widget buildList(List<BiliDownloadEntryInfo> list) {\n    if (list.isNotEmpty) {\n      return SliverGrid.builder(\n        gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(\n          mainAxisSpacing: 2,\n          mainAxisExtent: 100,\n          maxCrossAxisExtent: Grid.smallCardWidth * 2,\n        ),\n        itemBuilder: (context, index) {\n          final entry = list[index];\n          return DetailItem(\n            entry: entry,\n            progress: widget.progress,\n            downloadService: _downloadService,\n            showTitle: true,\n            onDelete: () => controller.onRemoveSingle(index, entry),\n            controller: controller,\n          );\n        },\n        itemCount: list.length,\n      );\n    }\n    return const HttpError();\n  }\n}\n"
  },
  {
    "path": "lib/pages/download/view.dart",
    "content": "import 'dart:async';\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/appbar/appbar.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/flutter/pop_scope.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/select_mask.dart';\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models_new/download/bili_download_entry_info.dart';\nimport 'package:PiliPlus/models_new/download/download_info.dart';\nimport 'package:PiliPlus/pages/download/controller.dart';\nimport 'package:PiliPlus/pages/download/detail/view.dart';\nimport 'package:PiliPlus/pages/download/detail/widgets/item.dart';\nimport 'package:PiliPlus/pages/download/search/view.dart';\nimport 'package:PiliPlus/services/download/download_service.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart' show IterableExt;\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:flutter/material.dart'\n    hide SliverGridDelegateWithMaxCrossAxisExtent, LayoutBuilder;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass DownloadPage extends StatefulWidget {\n  const DownloadPage({super.key});\n\n  @override\n  State<DownloadPage> createState() => _DownloadPageState();\n}\n\nclass _DownloadPageState extends State<DownloadPage> {\n  final _downloadService = Get.find<DownloadService>();\n  final _controller = Get.put(DownloadPageController());\n  final _progress = ChangeNotifier();\n\n  @override\n  void dispose() {\n    _progress.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    final padding = MediaQuery.viewPaddingOf(context);\n    return Obx(() {\n      final enableMultiSelect = _controller.enableMultiSelect.value;\n      return popScope(\n        canPop: !enableMultiSelect,\n        onPopInvokedWithResult: (didPop, result) {\n          if (enableMultiSelect) {\n            _controller.handleSelect();\n          }\n        },\n        child: Scaffold(\n          resizeToAvoidBottomInset: false,\n          appBar: MultiSelectAppBarWidget(\n            ctr: _controller,\n            actions: [\n              TextButton(\n                style: TextButton.styleFrom(\n                  visualDensity: VisualDensity.compact,\n                ),\n                onPressed: () async {\n                  final allChecked = _controller.allChecked.toSet();\n                  _controller.handleSelect();\n                  final list = <BiliDownloadEntryInfo>[];\n                  for (final page in allChecked) {\n                    list.addAll(page.entries);\n                  }\n                  final res = await Future.wait(\n                    list.map(\n                      (e) => _downloadService.downloadDanmaku(\n                        entry: e,\n                        isUpdate: true,\n                      ),\n                    ),\n                  );\n                  if (res.every((e) => e)) {\n                    SmartDialog.showToast('更新成功');\n                  } else {\n                    SmartDialog.showToast('更新失败');\n                  }\n                },\n                child: Text(\n                  '更新',\n                  style: TextStyle(color: theme.colorScheme.onSurface),\n                ),\n              ),\n            ],\n            child: AppBar(\n              title: const Text('离线缓存'),\n              actions: [\n                IconButton(\n                  tooltip: '搜索',\n                  onPressed: () async {\n                    await _downloadService.waitForInitialization;\n                    if (!mounted) return;\n                    Get.to(DownloadSearchPage(progress: _progress));\n                  },\n                  icon: const Icon(Icons.search),\n                ),\n                IconButton(\n                  tooltip: '多选',\n                  onPressed: () {\n                    if (enableMultiSelect) {\n                      _controller.handleSelect();\n                    } else {\n                      _controller.enableMultiSelect.value = true;\n                    }\n                  },\n                  icon: const Icon(Icons.edit_note),\n                ),\n                const SizedBox(width: 6),\n              ],\n            ),\n          ),\n          body: Padding(\n            padding: EdgeInsets.only(left: padding.left, right: padding.right),\n            child: CustomScrollView(\n              slivers: [\n                Obx(() {\n                  final entry =\n                      _downloadService.waitDownloadQueue.firstWhereOrNull(\n                        (e) => e.cid == _downloadService.curCid,\n                      ) ??\n                      _downloadService.waitDownloadQueue.firstOrNull;\n                  if (entry != null) {\n                    return SliverMainAxisGroup(\n                      slivers: [\n                        SliverPadding(\n                          padding: const EdgeInsets.only(left: 12, bottom: 7),\n                          sliver: SliverToBoxAdapter(\n                            child: Text(\n                              '正在缓存 (${_downloadService.waitDownloadQueue.length})',\n                            ),\n                          ),\n                        ),\n                        SliverToBoxAdapter(\n                          child: SizedBox(\n                            height: 100,\n                            child: DetailItem(\n                              entry: entry,\n                              progress: _progress,\n                              downloadService: _downloadService,\n                              showTitle: true,\n                              isCurr: true,\n                              controller: _controller,\n                            ),\n                          ),\n                        ),\n                      ],\n                    );\n                  }\n                  return const SliverToBoxAdapter();\n                }),\n                Obx(() {\n                  if (_controller.pages.isNotEmpty) {\n                    return SliverMainAxisGroup(\n                      slivers: [\n                        SliverPadding(\n                          padding: EdgeInsets.only(\n                            left: 12,\n                            bottom: 7,\n                            top: _downloadService.waitDownloadQueue.isEmpty\n                                ? 0\n                                : 7,\n                          ),\n                          sliver: const SliverToBoxAdapter(\n                            child: Text('已缓存视频'),\n                          ),\n                        ),\n                        SliverGrid.builder(\n                          gridDelegate:\n                              SliverGridDelegateWithMaxCrossAxisExtent(\n                                mainAxisSpacing: 2,\n                                mainAxisExtent: 100,\n                                maxCrossAxisExtent: Grid.smallCardWidth * 2,\n                              ),\n                          itemBuilder: (context, index) {\n                            final item = _controller.pages[index];\n                            if (item.entries.length == 1) {\n                              final entry = item.entries.first;\n                              return DetailItem(\n                                entry: entry,\n                                progress: _progress,\n                                downloadService: _downloadService,\n                                showTitle: true,\n                                onDelete: () {\n                                  _downloadService.deleteDownload(\n                                    entry: entry,\n                                    removeList: true,\n                                  );\n                                  GStorage.watchProgress.delete(\n                                    entry.cid.toString(),\n                                  );\n                                },\n                                checked: item.checked,\n                                onSelect: (_) => _controller.onSelect(item),\n                                controller: _controller,\n                              );\n                            }\n                            return _buildItem(theme, item, enableMultiSelect);\n                          },\n                          itemCount: _controller.pages.length,\n                        ),\n                      ],\n                    );\n                  }\n                  if (_downloadService.waitDownloadQueue.isNotEmpty) {\n                    return const SliverToBoxAdapter();\n                  }\n                  return const HttpError();\n                }),\n                SliverToBoxAdapter(\n                  child: SizedBox(height: padding.bottom + 100),\n                ),\n              ],\n            ),\n          ),\n        ),\n      );\n    });\n  }\n\n  Widget _buildItem(\n    ThemeData theme,\n    DownloadPageInfo pageInfo,\n    bool enableMultiSelect,\n  ) {\n    void onLongPress() => enableMultiSelect\n        ? null\n        : showDialog(\n            context: context,\n            builder: (context) => AlertDialog(\n              clipBehavior: Clip.hardEdge,\n              contentPadding: const EdgeInsets.symmetric(vertical: 12),\n              content: Column(\n                mainAxisSize: MainAxisSize.min,\n                children: [\n                  ListTile(\n                    onTap: () {\n                      Get.back();\n                      showConfirmDialog(\n                        context: context,\n                        title: '确定删除？',\n                        onConfirm: () async {\n                          await GStorage.watchProgress.deleteAll(\n                            pageInfo.entries.map((e) => e.cid.toString()),\n                          );\n                          _downloadService.deletePage(\n                            pageDirPath: pageInfo.dirPath,\n                          );\n                        },\n                      );\n                    },\n                    dense: true,\n                    title: const Text(\n                      '删除',\n                      style: TextStyle(fontSize: 14),\n                    ),\n                  ),\n                  ListTile(\n                    onTap: () async {\n                      Get.back();\n                      final res = await Future.wait(\n                        pageInfo.entries.map(\n                          (e) => _downloadService.downloadDanmaku(\n                            entry: e,\n                            isUpdate: true,\n                          ),\n                        ),\n                      );\n                      if (res.every((e) => e)) {\n                        SmartDialog.showToast('更新成功');\n                      } else {\n                        SmartDialog.showToast('更新失败');\n                      }\n                    },\n                    dense: true,\n                    title: const Text(\n                      '更新弹幕',\n                      style: TextStyle(fontSize: 14),\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          );\n    final first = pageInfo.entries.first;\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onTap: () {\n          if (_controller.enableMultiSelect.value) {\n            _controller.onSelect(pageInfo);\n            return;\n          }\n          Get.to(\n            DownloadDetailPage(\n              pageId: pageInfo.pageId,\n              title: pageInfo.title,\n              progress: _progress,\n            ),\n          );\n        },\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        child: Padding(\n          padding: const EdgeInsets.symmetric(\n            horizontal: StyleString.safeSpace,\n            vertical: 5,\n          ),\n          child: Row(\n            spacing: 10,\n            children: [\n              Stack(\n                clipBehavior: Clip.none,\n                children: [\n                  AspectRatio(\n                    aspectRatio: StyleString.aspectRatio,\n                    child: LayoutBuilder(\n                      builder: (context, constraints) => NetworkImgLayer(\n                        src: pageInfo.cover,\n                        width: constraints.maxWidth,\n                        height: constraints.maxHeight,\n                      ),\n                    ),\n                  ),\n                  PBadge(\n                    text: '${pageInfo.entries.length}个视频',\n                    right: 6.0,\n                    bottom: 6.0,\n                    isBold: false,\n                    type: PBadgeType.gray,\n                  ),\n                  if (pageInfo.seasonType case final pgcType?)\n                    PBadge(\n                      text: switch (pgcType) {\n                        -1 => '课程',\n                        1 => '番剧',\n                        2 => '电影',\n                        3 => '纪录片',\n                        4 => '国创',\n                        5 => '电视剧',\n                        7 => '综艺',\n                        _ => null,\n                      },\n                      right: 6.0,\n                      top: 6.0,\n                    ),\n                  Positioned.fill(\n                    child: selectMask(theme, pageInfo.checked),\n                  ),\n                ],\n              ),\n              Expanded(\n                child: Column(\n                  mainAxisSize: MainAxisSize.min,\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    Expanded(\n                      child: Text(\n                        pageInfo.title,\n                        textAlign: TextAlign.start,\n                        style: TextStyle(\n                          fontSize: theme.textTheme.bodyMedium!.fontSize,\n                          height: 1.42,\n                          letterSpacing: 0.3,\n                        ),\n                        maxLines: 2,\n                        overflow: TextOverflow.ellipsis,\n                      ),\n                    ),\n                    Row(\n                      crossAxisAlignment: .end,\n                      mainAxisAlignment: .spaceBetween,\n                      children: [\n                        if (first.ownerName case final ownerName?)\n                          Text(\n                            ownerName,\n                            style: TextStyle(\n                              fontSize: 12,\n                              height: 1.6,\n                              color: theme.colorScheme.outline,\n                            ),\n                          )\n                        else\n                          const Spacer(),\n                        pageInfo.entries.first.moreBtn(theme),\n                      ],\n                    ),\n                  ],\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/dynamics/controller.dart",
    "content": "import 'dart:async';\n\nimport 'package:PiliPlus/http/dynamics.dart';\nimport 'package:PiliPlus/http/follow.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/dynamic/dynamics_type.dart';\nimport 'package:PiliPlus/models/dynamics/up.dart';\nimport 'package:PiliPlus/models_new/follow/data.dart';\nimport 'package:PiliPlus/pages/common/common_controller.dart';\nimport 'package:PiliPlus/pages/dynamics_tab/controller.dart';\nimport 'package:PiliPlus/services/account_service.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';\nimport 'package:PiliPlus/utils/extension/string_ext.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:easy_debounce/easy_throttle.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass DynamicsController extends GetxController\n    with GetSingleTickerProviderStateMixin, ScrollOrRefreshMixin, AccountMixin {\n  @override\n  final ScrollController scrollController = ScrollController();\n  late final TabController tabController;\n\n  late final RxInt mid = (-1).obs;\n  late int currentMid = -1;\n\n  Set<int> tempBannedList = <int>{};\n\n  final Rx<LoadingState<FollowUpModel>> upState =\n      LoadingState<FollowUpModel>.loading().obs;\n  late int _upPage = 1;\n  late bool _upEnd = false;\n  Set<UpItem>? _cacheUpList;\n  late final _showAllUp = Pref.dynamicsShowAllFollowedUp;\n  late bool showLiveUp = Pref.expandDynLivePanel;\n\n  final upPanelPosition = Pref.upPanelPosition;\n\n  @override\n  final AccountService accountService = Get.find<AccountService>();\n\n  DynamicsTabController? get controller {\n    try {\n      return Get.find<DynamicsTabController>(\n        tag: DynamicsTabType.values[tabController.index].name,\n      );\n    } catch (_) {\n      return null;\n    }\n  }\n\n  @override\n  void onInit() {\n    super.onInit();\n    tabController = TabController(\n      length: DynamicsTabType.values.length,\n      vsync: this,\n      initialIndex: Pref.defaultDynamicTypeIndex,\n    );\n    queryFollowUp();\n  }\n\n  void onLoadMoreUp() {\n    if (_showAllUp) {\n      queryAllUp();\n    } else {\n      queryUpList();\n    }\n  }\n\n  Future<void> queryUpList() async {\n    if (isQuerying || _upEnd) return;\n    isQuerying = true;\n\n    final res = await DynamicsHttp.dynUpList(upState.value.data.offset);\n\n    if (res case Success(:final response)) {\n      if (response.hasMore == false || response.offset.isNullOrEmpty) {\n        _upEnd = true;\n      }\n      final upData = upState.value.data\n        ..hasMore = response.hasMore\n        ..offset = response.offset;\n      final list = response.upList;\n      if (list != null && list.isNotEmpty) {\n        upData.upList.addAll(list);\n        upState.refresh();\n      }\n    }\n\n    isQuerying = false;\n  }\n\n  Future<void> queryAllUp() async {\n    if (isQuerying || _upEnd) return;\n    isQuerying = true;\n\n    final res = await FollowHttp.followings(\n      vmid: Accounts.main.mid,\n      pn: _upPage,\n      orderType: 'attention',\n      ps: 50,\n    );\n\n    if (res case Success(:final response)) {\n      _upPage++;\n      final list = response.list;\n      if (list.isEmpty) {\n        _upEnd = true;\n      }\n      upState\n        ..value.data.upList.addAll(\n          list..removeWhere((e) => _cacheUpList?.contains(e) == true),\n        )\n        ..refresh();\n    }\n\n    isQuerying = false;\n  }\n\n  late bool isQuerying = false;\n  Future<void> queryFollowUp() async {\n    if (isQuerying) return;\n    isQuerying = true;\n\n    if (!accountService.isLogin.value) {\n      upState.value = const Error(null);\n      isQuerying = false;\n      return;\n    }\n\n    // reset\n    _upEnd = false;\n    if (_showAllUp) _upPage = 1;\n\n    final res = await Future.wait([\n      DynamicsHttp.followUp(),\n      if (_showAllUp)\n        FollowHttp.followings(\n          vmid: Accounts.main.mid,\n          pn: _upPage,\n          orderType: 'attention',\n          ps: 50,\n        ),\n    ]);\n\n    final first = res.first;\n    if (first case final Success<FollowUpModel> i) {\n      final data = i.response;\n      final second = res.elementAtOrNull(1);\n      if (second case final Success<FollowData> j) {\n        final data1 = j.response;\n        final list1 = data1.list;\n\n        _upPage++;\n        if (list1.isEmpty || list1.length >= (data1.total ?? 0)) {\n          _upEnd = true;\n        }\n\n        final list = data.upList;\n        list.addAll(list1..removeWhere((_cacheUpList = list.toSet()).contains));\n      }\n      if (!_showAllUp) {\n        if (data.hasMore == false || data.offset.isNullOrEmpty) {\n          _upEnd = true;\n        }\n      }\n      upState.value = Success(data);\n    } else {\n      upState.value = const Error(null);\n    }\n\n    isQuerying = false;\n  }\n\n  void onSelectUp(int mid) {\n    if (this.mid.value == mid) {\n      tabController.index = (mid == -1 ? 0 : 4);\n      if (mid == -1) {\n        queryFollowUp();\n      }\n      controller?.onReload();\n      return;\n    }\n\n    this.mid.value = mid;\n    tabController.index = (mid == -1 ? 0 : 4);\n  }\n\n  @override\n  Future<void> onRefresh() {\n    _refreshFollowUp();\n    return controller!.onRefresh();\n  }\n\n  void _refreshFollowUp() {\n    if (_showAllUp) {\n      _upPage = 1;\n      _cacheUpList = null;\n    }\n    queryFollowUp();\n  }\n\n  @override\n  void animateToTop() {\n    controller?.animateToTop();\n    scrollController.animToTop();\n  }\n\n  @override\n  void toTopOrRefresh() {\n    final ctr = controller;\n    if (ctr?.scrollController.hasClients == true) {\n      if (ctr!.scrollController.position.pixels == 0) {\n        if (scrollController.hasClients &&\n            scrollController.position.pixels != 0) {\n          scrollController.animToTop();\n        }\n        EasyThrottle.throttle(\n          'topOrRefresh',\n          const Duration(milliseconds: 500),\n          onRefresh,\n        );\n      } else {\n        animateToTop();\n      }\n    } else {\n      super.toTopOrRefresh();\n    }\n  }\n\n  @override\n  void onClose() {\n    tabController.dispose();\n    scrollController.dispose();\n    super.onClose();\n  }\n\n  @override\n  void onChangeAccount(bool isLogin) => _refreshFollowUp();\n}\n"
  },
  {
    "path": "lib/pages/dynamics/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/dynamic/dynamics_type.dart';\nimport 'package:PiliPlus/models/common/dynamic/up_panel_position.dart';\nimport 'package:PiliPlus/models/dynamics/up.dart';\nimport 'package:PiliPlus/pages/common/common_page.dart';\nimport 'package:PiliPlus/pages/dynamics/controller.dart';\nimport 'package:PiliPlus/pages/dynamics/widgets/up_panel.dart';\nimport 'package:PiliPlus/pages/dynamics_create/view.dart';\nimport 'package:PiliPlus/pages/dynamics_tab/view.dart';\nimport 'package:PiliPlus/pages/main/controller.dart';\nimport 'package:PiliPlus/utils/extension/get_ext.dart';\nimport 'package:flutter/material.dart' hide DraggableScrollableSheet;\nimport 'package:get/get.dart';\n\nclass DynamicsPage extends StatefulWidget {\n  const DynamicsPage({super.key});\n\n  @override\n  State<DynamicsPage> createState() => _DynamicsPageState();\n}\n\nclass _DynamicsPageState extends CommonPageState<DynamicsPage>\n    with AutomaticKeepAliveClientMixin {\n  final _dynamicsController = Get.putOrFind(DynamicsController.new);\n  UpPanelPosition get upPanelPosition => _dynamicsController.upPanelPosition;\n  late final MainController _mainController = Get.find<MainController>();\n\n  @override\n  bool get wantKeepAlive => true;\n\n  Widget _createDynamicBtn(ThemeData theme, {bool isRight = true}) => Center(\n    child: Container(\n      width: 34,\n      height: 34,\n      margin: EdgeInsets.only(left: !isRight ? 16 : 0, right: isRight ? 16 : 0),\n      child: IconButton(\n        tooltip: '发布动态',\n        style: ButtonStyle(\n          padding: const WidgetStatePropertyAll(EdgeInsets.zero),\n          backgroundColor: WidgetStatePropertyAll(\n            theme.colorScheme.secondaryContainer,\n          ),\n        ),\n        onPressed: () {\n          if (_dynamicsController.accountService.isLogin.value) {\n            CreateDynPanel.onCreateDyn(context);\n          }\n        },\n        icon: Icon(\n          Icons.add,\n          size: 18,\n          color: theme.colorScheme.onSecondaryContainer,\n        ),\n      ),\n    ),\n  );\n\n  Widget upPanelPart(ThemeData theme) {\n    final isTop = upPanelPosition == .top;\n    final needBg = upPanelPosition.index > 2;\n    return Material(\n      type: needBg ? .canvas : .transparency,\n      color: needBg ? theme.colorScheme.surface : null,\n      child: SizedBox(\n        width: isTop ? null : 64,\n        height: isTop ? 76 : null,\n        child: NotificationListener<ScrollEndNotification>(\n          onNotification: (notification) {\n            final metrics = notification.metrics;\n            if (metrics.pixels >= metrics.maxScrollExtent - 300) {\n              _dynamicsController.onLoadMoreUp();\n            }\n            return false;\n          },\n          child: Obx(() => _buildUpPanel(_dynamicsController.upState.value)),\n        ),\n      ),\n    );\n  }\n\n  Widget _buildUpPanel(LoadingState<FollowUpModel> upState) {\n    return switch (upState) {\n      Loading() => const SizedBox.shrink(),\n      Success<FollowUpModel>() => UpPanel(\n        dynamicsController: _dynamicsController,\n      ),\n      Error() => Center(\n        child: IconButton(\n          icon: const Icon(Icons.refresh),\n          onPressed: () => _dynamicsController\n            ..upState.value = LoadingState<FollowUpModel>.loading()\n            ..queryFollowUp(),\n        ),\n      ),\n    };\n  }\n\n  bool get checkPage =>\n      _mainController.navigationBars[0] != .dynamics &&\n      _mainController.selectedIndex.value == 0;\n\n  @override\n  bool onNotificationType1(UserScrollNotification notification) {\n    if (checkPage) {\n      return false;\n    }\n    return super.onNotificationType1(notification);\n  }\n\n  @override\n  bool onNotificationType2(ScrollNotification notification) {\n    if (checkPage) {\n      return false;\n    }\n    return super.onNotificationType2(notification);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final theme = Theme.of(context);\n\n    Widget? drawer;\n    Widget? endDrawer;\n\n    Widget? leading;\n    List<Widget>? actions;\n\n    Widget child = tabBarView(\n      controller: _dynamicsController.tabController,\n      children: DynamicsTabType.values\n          .map((e) => DynamicsTabPage(dynamicsType: e))\n          .toList(),\n    );\n\n    switch (upPanelPosition) {\n      case UpPanelPosition.top:\n        child = Column(\n          children: [\n            upPanelPart(theme),\n            Expanded(child: child),\n          ],\n        );\n        actions = [_createDynamicBtn(theme)];\n      case UpPanelPosition.leftFixed:\n        child = Row(\n          children: [\n            upPanelPart(theme),\n            Expanded(child: child),\n          ],\n        );\n        actions = [_createDynamicBtn(theme)];\n      case UpPanelPosition.rightFixed:\n        child = Row(\n          children: [\n            Expanded(child: child),\n            upPanelPart(theme),\n          ],\n        );\n        actions = [_createDynamicBtn(theme)];\n      case UpPanelPosition.leftDrawer:\n        drawer = upPanelPart(theme);\n        actions = [_createDynamicBtn(theme)];\n      case UpPanelPosition.rightDrawer:\n        endDrawer = upPanelPart(theme);\n        leading = _createDynamicBtn(theme, isRight: false);\n    }\n\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      backgroundColor: Colors.transparent,\n      appBar: AppBar(\n        primary: false,\n        leading: leading,\n        leadingWidth: 50,\n        toolbarHeight: 50,\n        backgroundColor: Colors.transparent,\n        title: SizedBox(\n          height: 50,\n          child: TabBar(\n            dividerHeight: 0,\n            isScrollable: true,\n            tabAlignment: .center,\n            dividerColor: Colors.transparent,\n            labelColor: theme.colorScheme.primary,\n            indicatorColor: theme.colorScheme.primary,\n            controller: _dynamicsController.tabController,\n            unselectedLabelColor: theme.colorScheme.onSurface,\n            labelStyle:\n                TabBarTheme.of(context).labelStyle?.copyWith(fontSize: 13) ??\n                const TextStyle(fontSize: 13),\n            tabs: DynamicsTabType.values\n                .map((e) => Tab(text: e.label))\n                .toList(),\n            onTap: (index) {\n              if (!_dynamicsController.tabController.indexIsChanging) {\n                _dynamicsController.animateToTop();\n              }\n            },\n          ),\n        ),\n        actions: actions,\n      ),\n      drawer: drawer,\n      endDrawer: endDrawer,\n      body: onBuild(child),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/dynamics/widgets/action_panel.dart",
    "content": "import 'package:PiliPlus/models/dynamics/result.dart';\nimport 'package:PiliPlus/pages/dynamics_repost/view.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/request_utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:font_awesome_flutter/font_awesome_flutter.dart';\n\nclass ActionPanel extends StatelessWidget {\n  const ActionPanel({\n    super.key,\n    required this.item,\n  });\n  final DynamicItemModel item;\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    final primary = theme.colorScheme.primary;\n    final outline = theme.colorScheme.outline;\n    final moduleStat = item.modules.moduleStat!;\n    final forward = moduleStat.forward!;\n    final comment = moduleStat.comment!;\n    final like = moduleStat.like!;\n    final btnStyle = TextButton.styleFrom(\n      tapTargetSize: .padded,\n      padding: const EdgeInsets.symmetric(horizontal: 15),\n      foregroundColor: outline,\n    );\n    return Row(\n      mainAxisAlignment: MainAxisAlignment.spaceAround,\n      children: [\n        Expanded(\n          child: Builder(\n            builder: (context) {\n              return TextButton.icon(\n                onPressed: () => showModalBottomSheet(\n                  context: context,\n                  isScrollControlled: true,\n                  useSafeArea: true,\n                  builder: (_) => RepostPanel(\n                    item: item,\n                    onSuccess: () {\n                      int count = forward.count ?? 0;\n                      forward.count = count + 1;\n                      if (context.mounted) {\n                        (context as Element?)?.markNeedsBuild();\n                      }\n                    },\n                  ),\n                ),\n                icon: Icon(\n                  FontAwesomeIcons.shareFromSquare,\n                  size: 16,\n                  color: outline,\n                  semanticLabel: \"转发\",\n                ),\n                style: btnStyle,\n                label: Text(\n                  forward.count != null\n                      ? NumUtils.numFormat(forward.count)\n                      : '转发',\n                ),\n              );\n            },\n          ),\n        ),\n        Expanded(\n          child: TextButton.icon(\n            onPressed: () => PageUtils.pushDynDetail(item, isPush: true),\n            icon: Icon(\n              FontAwesomeIcons.comment,\n              size: 16,\n              color: outline,\n              semanticLabel: \"评论\",\n            ),\n            style: btnStyle,\n            label: Text(\n              comment.count != null ? NumUtils.numFormat(comment.count) : '评论',\n            ),\n          ),\n        ),\n        Expanded(\n          child: Builder(\n            builder: (context) {\n              final likeIcon = Icon(\n                like.status!\n                    ? FontAwesomeIcons.solidThumbsUp\n                    : FontAwesomeIcons.thumbsUp,\n                size: 16,\n                color: like.status! ? primary : outline,\n                semanticLabel: like.status! ? \"已赞\" : \"点赞\",\n              );\n              return TextButton.icon(\n                onPressed: () => RequestUtils.onLikeDynamic(\n                  item,\n                  likeIcon.color == primary,\n                  () {\n                    if (context.mounted) {\n                      (context as Element?)?.markNeedsBuild();\n                    }\n                  },\n                ),\n                icon: likeIcon,\n                style: btnStyle,\n                label: AnimatedSwitcher(\n                  duration: const Duration(milliseconds: 400),\n                  transitionBuilder: (child, animation) =>\n                      ScaleTransition(scale: animation, child: child),\n                  child: Text(\n                    like.count != null ? NumUtils.numFormat(like.count) : '点赞',\n                    key: ValueKey<int?>(like.count),\n                    style: TextStyle(color: like.status! ? primary : outline),\n                  ),\n                ),\n              );\n            },\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/dynamics/widgets/additional_panel.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/gesture/tap_gesture_recognizer.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/http/dynamics.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/dynamics/result.dart';\nimport 'package:PiliPlus/pages/dynamics/widgets/vote.dart';\nimport 'package:PiliPlus/utils/app_scheme.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nWidget? addWidget(\n  BuildContext context, {\n  required int floor,\n  required ThemeData theme,\n  required Object idStr,\n  required DynamicAddModel additional,\n}) {\n  final type = additional.type;\n  late final Color bgColor = floor == 1\n      ? theme.dividerColor.withValues(alpha: 0.08)\n      : theme.colorScheme.surface;\n  late final borderRadius = floor == 1 ? null : StyleString.mdRadius;\n  Widget? child;\n  try {\n    switch (type) {\n      // 转发的投稿\n      case 'ADDITIONAL_TYPE_UGC' when (additional.ugc != null):\n        final ugc = additional.ugc!;\n        child = InkWell(\n          borderRadius: borderRadius,\n          onTap: ugc.jumpUrl == null\n              ? null\n              : () => PiliScheme.routePushFromUrl(ugc.jumpUrl!),\n          child: Padding(\n            padding: const EdgeInsets.symmetric(\n              horizontal: 12,\n              vertical: 8,\n            ),\n            child: Row(\n              children: [\n                NetworkImgLayer(\n                  width: 120,\n                  height: 75,\n                  src: ugc.cover,\n                ),\n                const SizedBox(width: 10),\n                Expanded(\n                  child: Column(\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: [\n                      Text(\n                        ugc.title!,\n                        maxLines: 2,\n                        overflow: TextOverflow.ellipsis,\n                      ),\n                      const SizedBox(height: 4),\n                      Text(\n                        ugc.descSecond!,\n                        style: TextStyle(\n                          color: theme.colorScheme.outline,\n                          fontSize: theme.textTheme.labelMedium!.fontSize,\n                        ),\n                      ),\n                    ],\n                  ),\n                ),\n              ],\n            ),\n          ),\n        );\n\n      case 'ADDITIONAL_TYPE_RESERVE' when (additional.reserve != null):\n        final reserve = additional.reserve!;\n        if (reserve.state != -1 && reserve.title != null) {\n          child = InkWell(\n            onTap: () {},\n            borderRadius: borderRadius,\n            child: Padding(\n              padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 10),\n              child: Row(\n                children: [\n                  Expanded(\n                    child: Column(\n                      crossAxisAlignment: CrossAxisAlignment.start,\n                      children: [\n                        Text(\n                          reserve.title!,\n                          maxLines: 1,\n                          overflow: TextOverflow.ellipsis,\n                        ),\n                        const SizedBox(height: 1),\n                        Text.rich(\n                          TextSpan(\n                            style: TextStyle(\n                              color: theme.colorScheme.outline,\n                              fontSize: 13,\n                            ),\n                            children: [\n                              if (reserve.desc1?.text?.isNotEmpty == true)\n                                TextSpan(\n                                  text: reserve.desc1!.text,\n                                ),\n                              if (reserve.desc2?.text?.isNotEmpty == true)\n                                TextSpan(\n                                  text: '    ${reserve.desc2!.text}',\n                                ),\n                              if (reserve.desc3?.text?.isNotEmpty == true) ...[\n                                const TextSpan(text: '\\n'),\n                                WidgetSpan(\n                                  alignment: PlaceholderAlignment.middle,\n                                  child: Icon(\n                                    size: 17,\n                                    Icons.card_giftcard,\n                                    color: theme.colorScheme.primary,\n                                  ),\n                                ),\n                                TextSpan(\n                                  text: ' ${reserve.desc3!.text}',\n                                  style: TextStyle(\n                                    color: theme.colorScheme.primary,\n                                  ),\n                                  recognizer: reserve.desc3!.jumpUrl == null\n                                      ? null\n                                      : (NoDeadlineTapGestureRecognizer()\n                                          ..onTap = () {\n                                            Get.toNamed(\n                                              '/webview',\n                                              parameters: {\n                                                'url': reserve.desc3!.jumpUrl!,\n                                              },\n                                            );\n                                          }),\n                                ),\n                              ],\n                            ],\n                          ),\n                        ),\n                      ],\n                    ),\n                  ),\n                  if (reserve.button != null) ...[\n                    const SizedBox(width: 10),\n                    Builder(\n                      builder: (context) {\n                        final btn = reserve.button!;\n                        final isReserved = btn.status == btn.type;\n                        final bool canJump = btn.jumpUrl?.isNotEmpty == true;\n                        return FilledButton.tonal(\n                          style: FilledButton.styleFrom(\n                            foregroundColor: canJump\n                                ? null\n                                : isReserved\n                                ? theme.colorScheme.onSurface.withValues(\n                                    alpha: 0.38,\n                                  )\n                                : null,\n                            backgroundColor: canJump\n                                ? null\n                                : isReserved\n                                ? theme.colorScheme.onSurface.withValues(\n                                    alpha: 0.12,\n                                  )\n                                : null,\n                            visualDensity: VisualDensity.compact,\n                            padding: const EdgeInsets.symmetric(\n                              horizontal: 16,\n                            ),\n                            tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n                          ),\n                          onPressed: canJump\n                              ? () => PiliScheme.routePushFromUrl(\n                                  btn.jumpUrl!,\n                                )\n                              : btn.disable == 1\n                              ? null\n                              : () async {\n                                  final res = await DynamicsHttp.dynReserve(\n                                    reserveId: reserve.rid,\n                                    curBtnStatus: btn.status,\n                                    dynamicIdStr: idStr,\n                                    reserveTotal: reserve.reserveTotal,\n                                  );\n                                  if (res case Success(:final response)) {\n                                    reserve\n                                      ..desc2?.text = response.descUpdate\n                                      ..reserveTotal = response.reserveUpdate\n                                      ..button!.status =\n                                          response.finalBtnStatus;\n                                    if (context.mounted) {\n                                      (context as Element?)?.markNeedsBuild();\n                                    }\n                                  } else {\n                                    res.toast();\n                                  }\n                                },\n                          child: Text(\n                            btn.jumpText != null\n                                ? btn.jumpText!\n                                : isReserved\n                                ? btn.checkText!\n                                : btn.uncheckText!,\n                          ),\n                        );\n                      },\n                    ),\n                  ],\n                ],\n              ),\n            ),\n          );\n        }\n\n      case 'ADDITIONAL_TYPE_UPOWER_LOTTERY'\n          when (additional.upowerLottery != null):\n        final content = additional.upowerLottery!;\n        child = InkWell(\n          borderRadius: borderRadius,\n          onTap: content.jumpUrl == null\n              ? null\n              : () => PiliScheme.routePushFromUrl(content.jumpUrl!),\n          child: Padding(\n            padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),\n            child: Row(\n              children: [\n                Expanded(\n                  child: Column(\n                    spacing: 2,\n                    mainAxisSize: MainAxisSize.min,\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: [\n                      if (content.title?.isNotEmpty == true)\n                        Text(content.title!),\n                      if (content.hint?.text?.isNotEmpty == true)\n                        Text(\n                          content.hint!.text!,\n                          style: TextStyle(\n                            color: theme.colorScheme.outline,\n                            fontSize: 13,\n                          ),\n                        ),\n                      if (content.desc?.text?.isNotEmpty == true)\n                        Text.rich(\n                          TextSpan(\n                            children: [\n                              WidgetSpan(\n                                alignment: PlaceholderAlignment.middle,\n                                child: Icon(\n                                  size: 17,\n                                  Icons.card_giftcard,\n                                  color: theme.colorScheme.primary,\n                                ),\n                              ),\n                              TextSpan(\n                                text: ' ${content.desc!.text!}',\n                                style: TextStyle(\n                                  color: theme.colorScheme.primary,\n                                  fontSize: 13,\n                                ),\n                                recognizer: content.desc!.jumpUrl == null\n                                    ? null\n                                    : (NoDeadlineTapGestureRecognizer()\n                                        ..onTap = () {\n                                          Get.toNamed(\n                                            '/webview',\n                                            parameters: {\n                                              'url': content.desc!.jumpUrl!,\n                                            },\n                                          );\n                                        }),\n                              ),\n                            ],\n                          ),\n                        ),\n                    ],\n                  ),\n                ),\n                if (content.button != null) ...[\n                  const SizedBox(width: 10),\n                  FilledButton.tonal(\n                    onPressed: content.button!.jumpUrl == null\n                        ? null\n                        : () => PiliScheme.routePushFromUrl(\n                            content.button!.jumpUrl!,\n                          ),\n                    style: FilledButton.styleFrom(\n                      shape: const RoundedRectangleBorder(\n                        borderRadius: BorderRadius.all(Radius.circular(6)),\n                      ),\n                      padding: const EdgeInsets.symmetric(horizontal: 10),\n                      visualDensity: const VisualDensity(\n                        horizontal: -2,\n                        vertical: -3,\n                      ),\n                      tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n                    ),\n                    child: Text(\n                      content.button!.jumpStyle?.text ??\n                          content.button!.check?.text ??\n                          '',\n                    ),\n                  ),\n                ],\n              ],\n            ),\n          ),\n        );\n\n      // 商品\n      case 'ADDITIONAL_TYPE_GOODS' when (additional.goods != null):\n        final content = additional.goods!;\n        if (content.items?.isNotEmpty == true) {\n          child = Column(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: content.items!.map((e) {\n              return InkWell(\n                borderRadius: borderRadius,\n                onTap: () => PiliScheme.routePushFromUrl(e.jumpUrl!),\n                child: Padding(\n                  padding: const EdgeInsets.symmetric(\n                    horizontal: 12,\n                    vertical: 8,\n                  ),\n                  child: Row(\n                    children: [\n                      if (e.cover?.isNotEmpty == true) ...[\n                        NetworkImgLayer(\n                          width: 45,\n                          height: 45,\n                          src: e.cover,\n                          borderRadius: const BorderRadius.all(\n                            Radius.circular(6),\n                          ),\n                        ),\n                        const SizedBox(width: 10),\n                      ],\n                      Expanded(\n                        child: Column(\n                          crossAxisAlignment: CrossAxisAlignment.start,\n                          children: [\n                            Text(\n                              e.name!,\n                              maxLines: 1,\n                              overflow: TextOverflow.ellipsis,\n                            ),\n                            if (e.price?.isNotEmpty == true)\n                              Text.rich(\n                                TextSpan(\n                                  children: [\n                                    TextSpan(\n                                      text: '${e.price}',\n                                      style: TextStyle(\n                                        color: theme.colorScheme.primary,\n                                      ),\n                                    ),\n                                    const TextSpan(\n                                      text: ' 起',\n                                      style: TextStyle(fontSize: 12),\n                                    ),\n                                  ],\n                                ),\n                              ),\n                          ],\n                        ),\n                      ),\n                      if (e.jumpDesc?.isNotEmpty == true) ...[\n                        const SizedBox(width: 10),\n                        FilledButton.tonal(\n                          onPressed: () =>\n                              PiliScheme.routePushFromUrl(e.jumpUrl!),\n                          style: FilledButton.styleFrom(\n                            shape: const RoundedRectangleBorder(\n                              borderRadius: BorderRadius.all(\n                                Radius.circular(6),\n                              ),\n                            ),\n                            padding: const EdgeInsets.symmetric(\n                              horizontal: 10,\n                            ),\n                            visualDensity: const VisualDensity(\n                              horizontal: -2,\n                              vertical: -3,\n                            ),\n                            tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n                          ),\n                          child: Text(e.jumpDesc!),\n                        ),\n                      ],\n                    ],\n                  ),\n                ),\n              );\n            }).toList(),\n          );\n        }\n\n      case 'ADDITIONAL_TYPE_VOTE' when (additional.vote != null):\n        final vote = additional.vote!;\n        child = InkWell(\n          borderRadius: borderRadius,\n          onTap: () => showVoteDialog(\n            context,\n            vote.voteId!,\n            idStr is int\n                ? idStr\n                : idStr is String\n                ? int.parse(idStr)\n                : null,\n          ),\n          child: Padding(\n            padding: const EdgeInsets.symmetric(\n              horizontal: 12,\n              vertical: 8,\n            ),\n            child: Row(\n              children: [\n                Container(\n                  decoration: BoxDecoration(\n                    color: floor == 1\n                        ? theme.colorScheme.surface\n                        : theme.dividerColor.withValues(alpha: 0.08),\n                    borderRadius: const BorderRadius.all(\n                      Radius.circular(8),\n                    ),\n                  ),\n                  width: 70,\n                  height: 50,\n                  child: Icon(\n                    Icons.bar_chart_rounded,\n                    color: theme.colorScheme.onSurfaceVariant,\n                  ),\n                ),\n                const SizedBox(width: 10),\n                Expanded(\n                  child: Column(\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: [\n                      if (vote.title case final title?)\n                        Text(\n                          title,\n                          maxLines: 1,\n                          overflow: TextOverflow.ellipsis,\n                        ),\n                      Text(\n                        '${NumUtils.numFormat(vote.joinNum)}人参与',\n                        maxLines: 1,\n                        overflow: TextOverflow.ellipsis,\n                        style: TextStyle(\n                          fontSize: 13,\n                          color: theme.colorScheme.outline,\n                        ),\n                      ),\n                    ],\n                  ),\n                ),\n                const SizedBox(width: 10),\n                FilledButton.tonal(\n                  onPressed: () => showVoteDialog(\n                    context,\n                    vote.voteId!,\n                    idStr is int\n                        ? idStr\n                        : idStr is String\n                        ? int.parse(idStr)\n                        : null,\n                  ),\n                  style: FilledButton.styleFrom(\n                    shape: const RoundedRectangleBorder(\n                      borderRadius: BorderRadius.all(Radius.circular(6)),\n                    ),\n                    padding: const EdgeInsets.symmetric(horizontal: 10),\n                    visualDensity: const VisualDensity(\n                      horizontal: -2,\n                      vertical: -3,\n                    ),\n                    tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n                  ),\n                  child: const Text('参与'),\n                ),\n              ],\n            ),\n          ),\n        );\n\n      case 'ADDITIONAL_TYPE_COMMON' when (additional.common != null):\n        final content = additional.common!;\n        child = InkWell(\n          borderRadius: borderRadius,\n          onTap: content.jumpUrl == null\n              ? null\n              : () => PiliScheme.routePushFromUrl(content.jumpUrl!),\n          child: Padding(\n            padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),\n            child: Row(\n              children: [\n                if (content.cover?.isNotEmpty == true) ...[\n                  NetworkImgLayer(\n                    width: 45,\n                    height: 45,\n                    src: content.cover,\n                    borderRadius: const BorderRadius.all(\n                      Radius.circular(6),\n                    ),\n                  ),\n                  const SizedBox(width: 10),\n                ],\n                Expanded(\n                  child: Column(\n                    spacing: 2,\n                    mainAxisSize: MainAxisSize.min,\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: [\n                      if (content.title?.isNotEmpty == true)\n                        Text(content.title!),\n                      if (content.desc1?.isNotEmpty == true)\n                        Text(\n                          content.desc1!,\n                          style: TextStyle(\n                            color: theme.colorScheme.outline,\n                            fontSize: 13,\n                          ),\n                        ),\n                      if (content.desc2?.isNotEmpty == true)\n                        Text(\n                          content.desc2!,\n                          style: TextStyle(\n                            color: theme.colorScheme.outline,\n                            fontSize: 13,\n                          ),\n                        ),\n                    ],\n                  ),\n                ),\n                if (content.button?.jumpUrl?.isNotEmpty == true) ...[\n                  const SizedBox(width: 10),\n                  FilledButton.tonal(\n                    onPressed: () => PiliScheme.routePushFromUrl(\n                      content.button!.jumpUrl!,\n                    ),\n                    style: FilledButton.styleFrom(\n                      shape: const RoundedRectangleBorder(\n                        borderRadius: BorderRadius.all(Radius.circular(6)),\n                      ),\n                      padding: const EdgeInsets.symmetric(horizontal: 10),\n                      visualDensity: const VisualDensity(\n                        horizontal: -2,\n                        vertical: -3,\n                      ),\n                      tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n                    ),\n                    child: Text(content.button!.jumpStyle?.text ?? ''),\n                  ),\n                ],\n              ],\n            ),\n          ),\n        );\n\n      case 'ADDITIONAL_TYPE_MATCH' when (additional.match != null):\n        final content = additional.match!;\n        Widget teamItem(TTeam team, Alignment alignment, EdgeInsets padding) {\n          return Expanded(\n            child: Align(\n              alignment: alignment,\n              child: Padding(\n                padding: padding,\n                child: Column(\n                  spacing: 5,\n                  mainAxisSize: .min,\n                  children: [\n                    NetworkImgLayer(\n                      type: .emote,\n                      width: 30,\n                      height: 30,\n                      src: team.pic,\n                    ),\n                    Text(\n                      maxLines: 1,\n                      overflow: .ellipsis,\n                      team.name!,\n                      style: const TextStyle(fontSize: 13),\n                    ),\n                  ],\n                ),\n              ),\n            ),\n          );\n        }\n        Widget? title;\n        if (content.matchInfo?.title?.isNotEmpty == true) {\n          title = Text(\n            content.matchInfo!.title!,\n            style: const TextStyle(fontSize: 13),\n          );\n        }\n        if (content.matchInfo?.subTitle?.isNotEmpty == true) {\n          title = Column(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              ?title,\n              Text(\n                content.matchInfo!.subTitle!,\n                style: TextStyle(\n                  fontSize: 13,\n                  color: theme.colorScheme.outline,\n                ),\n              ),\n            ],\n          );\n        }\n        child = InkWell(\n          borderRadius: borderRadius,\n          onTap: content.jumpUrl == null\n              ? null\n              : () => PiliScheme.routePushFromUrl(content.jumpUrl!),\n          child: Padding(\n            padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),\n            child: Row(\n              children: [\n                ?title,\n                if (content.matchInfo?.leftTeam != null)\n                  teamItem(\n                    content.matchInfo!.leftTeam!,\n                    Alignment.centerRight,\n                    const .only(right: 16),\n                  ),\n                Column(\n                  children: [\n                    if (content.matchInfo?.centerTop?.isNotEmpty == true)\n                      Container(\n                        height: 35,\n                        alignment: Alignment.center,\n                        child: Text(\n                          content.matchInfo!.centerTop!.join(' '),\n                          style: const TextStyle(\n                            fontWeight: FontWeight.bold,\n                            fontSize: 16,\n                          ),\n                        ),\n                      ),\n                    if (content.matchInfo?.centerBottom?.isNotEmpty == true)\n                      Text(\n                        content.matchInfo!.centerBottom!,\n                        style: TextStyle(\n                          fontSize: 13,\n                          color: theme.colorScheme.outline,\n                        ),\n                      ),\n                  ],\n                ),\n                if (content.matchInfo?.rightTeam != null)\n                  teamItem(\n                    content.matchInfo!.rightTeam!,\n                    Alignment.centerLeft,\n                    const .only(left: 16),\n                  ),\n                if (content.button case final button?)\n                  FilledButton.tonal(\n                    onPressed: () =>\n                        PiliScheme.routePushFromUrl(button.jumpUrl!),\n                    style: FilledButton.styleFrom(\n                      shape: const RoundedRectangleBorder(\n                        borderRadius: BorderRadius.all(Radius.circular(6)),\n                      ),\n                      padding: const EdgeInsets.symmetric(horizontal: 10),\n                      visualDensity: const VisualDensity(\n                        horizontal: -2,\n                        vertical: -3,\n                      ),\n                      tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n                    ),\n                    child: Text(button.jumpStyle?.text ?? ''),\n                  ),\n              ],\n            ),\n          ),\n        );\n    }\n    if (child != null) {\n      return Padding(\n        padding: const EdgeInsets.only(top: 6),\n        child: Material(\n          borderRadius: borderRadius,\n          color: bgColor,\n          child: child,\n        ),\n      );\n    } else {\n      return null;\n    }\n  } catch (e) {\n    return Padding(\n      padding: const EdgeInsets.all(12),\n      child: SelectableText(\n        '''\nadditional panel error\nid: $idStr\ntype: $type\nerr: $e''',\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/dynamics/widgets/author_panel.dart",
    "content": "import 'dart:math';\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/dialog/report.dart';\nimport 'package:PiliPlus/common/widgets/pendant_avatar.dart';\nimport 'package:PiliPlus/http/constants.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/reply.dart';\nimport 'package:PiliPlus/http/user.dart';\nimport 'package:PiliPlus/http/video.dart';\nimport 'package:PiliPlus/models/dynamics/result.dart';\nimport 'package:PiliPlus/pages/dynamics/controller.dart';\nimport 'package:PiliPlus/pages/save_panel/view.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/extension/context_ext.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/feed_back.dart';\nimport 'package:PiliPlus/utils/image_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/request_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:cached_network_image/cached_network_image.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass AuthorPanel extends StatelessWidget {\n  final DynamicItemModel item;\n  final bool isSave;\n  final bool isDetail;\n  final ValueChanged<Object>? onRemove;\n  final void Function(bool isTop, Object dynId)? onSetTop;\n  final VoidCallback? onBlock;\n  final Future<LoadingState> Function(bool isPrivate, Object dynId)?\n  onSetPubSetting;\n  final VoidCallback? onEdit;\n  final ValueChanged<int>? onSetReplySubject;\n\n  const AuthorPanel({\n    super.key,\n    required this.item,\n    this.isDetail = false,\n    this.onRemove,\n    this.isSave = false,\n    this.onSetTop,\n    this.onBlock,\n    this.onSetPubSetting,\n    this.onEdit,\n    this.onSetReplySubject,\n  });\n\n  Widget _buildAvatar(ModuleAuthorModel moduleAuthor) {\n    final pendant = moduleAuthor.pendant?.image;\n    final hasPendant = pendant != null && pendant.isNotEmpty;\n    Widget avatar = PendantAvatar(\n      avatar: moduleAuthor.face,\n      size: hasPendant ? 34 : 40,\n      officialType: null, // 已被注释\n      garbPendantImage: pendant,\n    );\n    if (hasPendant) {\n      avatar = Padding(padding: const EdgeInsets.all(3), child: avatar);\n    }\n    return avatar;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    final moduleAuthor = item.modules.moduleAuthor!;\n    final pubTime = moduleAuthor.pubTs != null\n        ? isSave\n              ? DateFormatUtils.format(\n                  moduleAuthor.pubTs,\n                  format: DateFormatUtils.longFormatDs,\n                )\n              : DateFormatUtils.dateFormat(moduleAuthor.pubTs)\n        : moduleAuthor.pubTime;\n    Widget? pubTs;\n    if (pubTime != null) {\n      pubTs = Text(\n        '$pubTime${moduleAuthor.pubAction != null ? ' ${moduleAuthor.pubAction}' : ''}',\n        style: TextStyle(\n          color: theme.colorScheme.outline,\n          fontSize: theme.textTheme.labelSmall!.fontSize,\n        ),\n      );\n      if (moduleAuthor.badgeText case final badgeText?) {\n        pubTs = Row(\n          mainAxisSize: .min,\n          spacing: 5,\n          children: [\n            pubTs,\n            Text(\n              badgeText,\n              style: TextStyle(\n                color: theme.colorScheme.secondary,\n                fontSize: theme.textTheme.labelSmall!.fontSize,\n              ),\n            ),\n          ],\n        );\n      }\n    }\n    final moduleTagText = !isDetail ? item.modules.moduleTag?.text : null;\n    return Stack(\n      clipBehavior: Clip.none,\n      alignment: Alignment.center,\n      children: [\n        Align(\n          alignment: Alignment.centerLeft,\n          child: GestureDetector(\n            behavior: HitTestBehavior.opaque,\n            onTap: moduleAuthor.type == 'AUTHOR_TYPE_NORMAL'\n                ? () {\n                    feedBack();\n                    Get.toNamed('/member?mid=${moduleAuthor.mid}');\n                  }\n                : null,\n            child: Row(\n              spacing: 10,\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                _buildAvatar(moduleAuthor),\n                Column(\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    Text(\n                      moduleAuthor.name ?? '',\n                      style: TextStyle(\n                        color:\n                            moduleAuthor.vip != null &&\n                                moduleAuthor.vip!.status > 0 &&\n                                moduleAuthor.vip!.type == 2\n                            ? theme.colorScheme.vipColor\n                            : theme.colorScheme.onSurface,\n                        fontSize: theme.textTheme.titleSmall!.fontSize,\n                      ),\n                    ),\n                    ?pubTs,\n                  ],\n                ),\n              ],\n            ),\n          ),\n        ),\n        Align(\n          alignment: Alignment.centerRight,\n          child: moduleTagText != null\n              ? Row(\n                  mainAxisSize: MainAxisSize.min,\n                  children: [\n                    Container(\n                      padding: const EdgeInsets.symmetric(\n                        horizontal: 4,\n                        vertical: 2,\n                      ),\n                      decoration: BoxDecoration(\n                        borderRadius: const BorderRadius.all(\n                          Radius.circular(4),\n                        ),\n                        border: Border.all(\n                          width: 1.25,\n                          color: theme.colorScheme.primary,\n                        ),\n                      ),\n                      child: Text(\n                        moduleTagText,\n                        style: TextStyle(\n                          height: 1,\n                          fontSize: 12,\n                          color: theme.colorScheme.primary,\n                        ),\n                        strutStyle: const StrutStyle(\n                          height: 1,\n                          leading: 0,\n                          fontSize: 12,\n                        ),\n                      ),\n                    ),\n                    _moreWidget(context),\n                  ],\n                )\n              : moduleAuthor.decorate != null\n              ? Row(\n                  mainAxisSize: MainAxisSize.min,\n                  children: [\n                    Stack(\n                      clipBehavior: Clip.none,\n                      alignment: Alignment.centerRight,\n                      children: [\n                        CachedNetworkImage(\n                          height: 32,\n                          memCacheHeight: 32.cacheSize(context),\n                          imageUrl: ImageUtils.safeThumbnailUrl(\n                            moduleAuthor.decorate!.cardUrl,\n                          ),\n                          placeholder: (_, _) => const SizedBox.shrink(),\n                        ),\n                        if (moduleAuthor.decorate!.fan?.numStr?.isNotEmpty ==\n                            true)\n                          Padding(\n                            padding: const EdgeInsets.only(right: 32),\n                            child: Text(\n                              '${moduleAuthor.decorate!.fan!.numStr}',\n                              style: TextStyle(\n                                height: 1,\n                                fontSize: 11,\n                                fontFamily: 'digital_id_num',\n                                color:\n                                    moduleAuthor.decorate!.fan?.color\n                                            ?.startsWith('#') ==\n                                        true\n                                    ? Utils.parseColor(\n                                        moduleAuthor.decorate!.fan!.color!,\n                                      )\n                                    : null,\n                              ),\n                            ),\n                          ),\n                      ],\n                    ),\n                    _moreWidget(context),\n                  ],\n                )\n              : _moreWidget(context),\n        ),\n      ],\n    );\n  }\n\n  Widget _moreWidget(BuildContext context) => isSave\n      ? const SizedBox.shrink()\n      : SizedBox(\n          width: 32,\n          height: 32,\n          child: IconButton(\n            tooltip: '更多',\n            style: const ButtonStyle(\n              padding: WidgetStatePropertyAll(EdgeInsets.zero),\n            ),\n            onPressed: () => morePanel(context),\n            icon: const Icon(Icons.more_vert_outlined, size: 18),\n          ),\n        );\n\n  void morePanel(BuildContext context) {\n    String? bvid;\n    try {\n      String? getBvid(String? type, DynamicMajorModel? major) => switch (type) {\n        'DYNAMIC_TYPE_AV' => major?.archive?.bvid,\n        'DYNAMIC_TYPE_UGC_SEASON' => major?.ugcSeason?.bvid,\n        _ => null,\n      };\n      bvid = getBvid(item.type, item.modules.moduleDynamic?.major);\n      if (bvid == null && item.orig != null) {\n        bvid = getBvid(\n          item.orig!.type,\n          item.orig!.modules.moduleDynamic?.major,\n        );\n      }\n    } catch (_) {}\n\n    showModalBottomSheet(\n      context: context,\n      useSafeArea: true,\n      isScrollControlled: true,\n      constraints: BoxConstraints(\n        maxWidth: min(640, context.mediaQueryShortestSide),\n      ),\n      builder: (context1) {\n        final theme = Theme.of(context);\n        final moduleAuthor = item.modules.moduleAuthor!;\n        return Padding(\n          padding: EdgeInsets.only(\n            bottom: MediaQuery.viewPaddingOf(context1).bottom,\n          ),\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              InkWell(\n                onTap: Get.back,\n                borderRadius: StyleString.bottomSheetRadius,\n                child: SizedBox(\n                  height: 35,\n                  child: Center(\n                    child: Container(\n                      width: 32,\n                      height: 3,\n                      decoration: BoxDecoration(\n                        color: theme.colorScheme.outline,\n                        borderRadius: const .all(.circular(1.5)),\n                      ),\n                    ),\n                  ),\n                ),\n              ),\n              if (bvid != null)\n                ListTile(\n                  onTap: () {\n                    Get.back();\n                    UserHttp.toViewLater(bvid: bvid);\n                  },\n                  minLeadingWidth: 0,\n                  leading: const Icon(Icons.watch_later_outlined, size: 19),\n                  title: Text(\n                    '稍后再看',\n                    style: theme.textTheme.titleSmall,\n                  ),\n                ),\n              ListTile(\n                onTap: () {\n                  Get.back();\n                  SavePanel.toSavePanel(item: item);\n                },\n                minLeadingWidth: 0,\n                leading: const Icon(Icons.save_alt, size: 19),\n                title: Text('保存动态', style: theme.textTheme.titleSmall!),\n              ),\n              ListTile(\n                title: Text(\n                  '分享动态',\n                  style: theme.textTheme.titleSmall,\n                ),\n                leading: const Icon(Icons.share_outlined, size: 19),\n                onTap: () {\n                  Get.back();\n                  Utils.shareText(\n                    '${HttpString.dynamicShareBaseUrl}/${item.idStr}',\n                  );\n                },\n                minLeadingWidth: 0,\n              ),\n              if ((item.basic!.commentType == 17 ||\n                      item.basic!.commentType == 11) &&\n                  item.modules.moduleDynamic?.major?.blocked == null)\n                ListTile(\n                  title: Text(\n                    '分享至消息',\n                    style: theme.textTheme.titleSmall,\n                  ),\n                  leading: const Icon(Icons.forward_to_inbox, size: 19),\n                  onTap: () {\n                    Get.back();\n                    try {\n                      bool isDyn = item.basic!.commentType == 17;\n                      String id = isDyn ? item.idStr : item.basic!.ridStr!;\n                      int source = isDyn ? 11 : 2;\n                      final moduleDynamic = item.modules.moduleDynamic!;\n                      final title =\n                          moduleDynamic.desc?.text ??\n                          moduleDynamic.major!.opus!.summary!.text!;\n                      String? thumb = isDyn\n                          ? moduleAuthor.face\n                          : moduleDynamic.major?.opus?.pics?.firstOrNull?.url;\n                      PageUtils.pmShare(\n                        context,\n                        content: {\n                          \"id\": id,\n                          \"title\": title,\n                          \"headline\": \"\",\n                          \"source\": source,\n                          if (thumb?.isNotEmpty == true) \"thumb\": thumb,\n                          \"author\": moduleAuthor.name,\n                          \"author_id\": moduleAuthor.mid.toString(),\n                        },\n                      );\n                    } catch (e) {\n                      SmartDialog.showToast(e.toString());\n                    }\n                  },\n                  minLeadingWidth: 0,\n                ),\n              ListTile(\n                title: Text(\n                  '临时屏蔽：${moduleAuthor.name}',\n                  style: theme.textTheme.titleSmall,\n                ),\n                leading: const Icon(Icons.visibility_off_outlined, size: 19),\n                onTap: () {\n                  Get.back();\n                  onBlock?.call();\n                  try {\n                    Get.find<DynamicsController>().tempBannedList.add(\n                      moduleAuthor.mid!,\n                    );\n                    SmartDialog.showToast(\n                      '已临时屏蔽${moduleAuthor.name}(${moduleAuthor.mid!})，重启恢复',\n                    );\n                  } catch (_) {}\n                },\n                minLeadingWidth: 0,\n              ),\n              if (kDebugMode || moduleAuthor.mid == Accounts.main.mid) ...[\n                ListTile(\n                  onTap: () {\n                    Get.back();\n                    RequestUtils.checkCreatedDyn(\n                      id: item.idStr,\n                      isManual: true,\n                    );\n                  },\n                  minLeadingWidth: 0,\n                  leading: const Stack(\n                    clipBehavior: Clip.none,\n                    alignment: Alignment.center,\n                    children: [\n                      Icon(Icons.shield_outlined, size: 19),\n                      Icon(Icons.published_with_changes_sharp, size: 12),\n                    ],\n                  ),\n                  title: Text('检查动态', style: theme.textTheme.titleSmall!),\n                ),\n                if (onSetTop != null)\n                  ListTile(\n                    onTap: () {\n                      Get.back();\n                      onSetTop!(moduleAuthor.isTop ?? false, item.idStr);\n                    },\n                    minLeadingWidth: 0,\n                    leading: const Icon(Icons.vertical_align_top, size: 19),\n                    title: Text(\n                      '${moduleAuthor.isTop == true ? '取消' : ''}置顶',\n                      style: theme.textTheme.titleSmall!,\n                    ),\n                  ),\n                if (onSetReplySubject != null)\n                  ListTile(\n                    onTap: () async {\n                      Get.back();\n                      final res = await ReplyHttp.replyInteraction(\n                        oid: item.basic!.commentIdStr!,\n                        type: item.basic!.commentType!,\n                      );\n                      if (res case Success(:final response)) {\n                        if (context.mounted) {\n                          showDialog(\n                            context: context,\n                            builder: (context) {\n                              final selection = response.upReplySelection;\n                              final enableSelection = selection.status == 1;\n\n                              final reply = response.upReply;\n                              final enableReply = reply.status == 1;\n\n                              return AlertDialog(\n                                clipBehavior: .hardEdge,\n                                contentPadding: const .symmetric(vertical: 12),\n                                content: Column(\n                                  mainAxisSize: .min,\n                                  crossAxisAlignment: .start,\n                                  children: [\n                                    ListTile(\n                                      dense: true,\n                                      enabled: selection.canModify,\n                                      title: Text(\n                                        '${enableSelection ? '停止' : '开启'}评论精选',\n                                        style: const TextStyle(fontSize: 14),\n                                      ),\n                                      onTap: () {\n                                        Get.back();\n                                        onSetReplySubject!(\n                                          enableSelection ? 2 : 1,\n                                        );\n                                      },\n                                    ),\n                                    ListTile(\n                                      dense: true,\n                                      enabled: reply.canModify,\n                                      title: Text(\n                                        '${enableReply ? '关闭' : '恢复'}评论',\n                                        style: const TextStyle(fontSize: 14),\n                                      ),\n                                      onTap: () {\n                                        Get.back();\n                                        onSetReplySubject!(enableReply ? 3 : 4);\n                                      },\n                                    ),\n                                  ],\n                                ),\n                              );\n                            },\n                          );\n                        }\n                      } else {\n                        res.toast();\n                      }\n                    },\n                    minLeadingWidth: 0,\n                    leading: const Icon(\n                      Icons.mark_unread_chat_alt_outlined,\n                      size: 19,\n                    ),\n                    title: Text(\n                      '互动设置',\n                      style: theme.textTheme.titleSmall!,\n                    ),\n                  ),\n                if (onSetPubSetting != null)\n                  ListTile(\n                    onTap: () {\n                      Get.back();\n\n                      final isPrivate = moduleAuthor.badgeText != null;\n                      Future<void> onTap() async {\n                        Get.back();\n                        if ((await onSetPubSetting!(\n                          isPrivate,\n                          item.idStr,\n                        )).isSuccess) {\n                          if (context.mounted) {\n                            (context as Element).markNeedsBuild();\n                          }\n                        }\n                      }\n\n                      showDialog(\n                        context: context,\n                        builder: (context) => AlertDialog(\n                          clipBehavior: Clip.hardEdge,\n                          contentPadding: const .symmetric(vertical: 12),\n                          content: Column(\n                            mainAxisSize: .min,\n                            children: [\n                              ListTile(\n                                dense: true,\n                                enabled: isPrivate,\n                                title: const Text(\n                                  '所有用户可见',\n                                  style: TextStyle(fontSize: 14),\n                                ),\n                                onTap: onTap,\n                              ),\n                              ListTile(\n                                dense: true,\n                                enabled: !isPrivate,\n                                title: const Text(\n                                  '仅自己可见',\n                                  style: TextStyle(fontSize: 14),\n                                ),\n                                onTap: onTap,\n                              ),\n                            ],\n                          ),\n                        ),\n                      );\n                    },\n                    minLeadingWidth: 0,\n                    leading: const Icon(Icons.visibility, size: 19),\n                    title: Text('可见范围', style: theme.textTheme.titleSmall!),\n                  ),\n                if (onEdit != null)\n                  ListTile(\n                    onTap: () {\n                      Get.back();\n                      onEdit!();\n                    },\n                    minLeadingWidth: 0,\n                    leading: const Icon(Icons.edit_note, size: 19),\n                    title: Text('编辑动态', style: theme.textTheme.titleSmall!),\n                  ),\n                if (onRemove != null)\n                  ListTile(\n                    onTap: () {\n                      Get.back();\n                      showDialog(\n                        context: context,\n                        builder: (context) => AlertDialog(\n                          title: const Text('确定删除该动态?'),\n                          actions: [\n                            TextButton(\n                              onPressed: Get.back,\n                              child: Text(\n                                '取消',\n                                style: TextStyle(\n                                  color: theme.colorScheme.outline,\n                                ),\n                              ),\n                            ),\n                            TextButton(\n                              onPressed: () {\n                                Get.back();\n                                onRemove!(item.idStr);\n                              },\n                              child: const Text('确定'),\n                            ),\n                          ],\n                        ),\n                      );\n                    },\n                    minLeadingWidth: 0,\n                    leading: Icon(\n                      Icons.delete_outline,\n                      color: theme.colorScheme.error,\n                      size: 19,\n                    ),\n                    title: Text(\n                      '删除',\n                      style: theme.textTheme.titleSmall!.copyWith(\n                        color: theme.colorScheme.error,\n                      ),\n                    ),\n                  ),\n              ],\n              if (Accounts.main.isLogin)\n                ListTile(\n                  title: Text(\n                    '举报',\n                    style: theme.textTheme.titleSmall!.copyWith(\n                      color: theme.colorScheme.error,\n                    ),\n                  ),\n                  leading: Icon(\n                    Icons.error_outline_outlined,\n                    size: 19,\n                    color: theme.colorScheme.error,\n                  ),\n                  onTap: () {\n                    Get.back();\n                    autoWrapReportDialog(\n                      context,\n                      ReportOptions.dynamicReport,\n                      (reasonType, reasonDesc, banUid) {\n                        if (banUid) {\n                          VideoHttp.relationMod(\n                            mid: moduleAuthor.mid!,\n                            act: 5,\n                            reSrc: 11,\n                          );\n                        }\n                        return UserHttp.dynamicReport(\n                          mid: moduleAuthor.mid!,\n                          dynId: item.idStr,\n                          reasonType: reasonType,\n                          reasonDesc: reasonType == 0 ? reasonDesc : null,\n                        );\n                      },\n                    );\n                  },\n                  minLeadingWidth: 0,\n                ),\n              const Divider(thickness: 0.1, height: 1),\n              ListTile(\n                onTap: Get.back,\n                minLeadingWidth: 0,\n                dense: true,\n                title: Text(\n                  '取消',\n                  style: TextStyle(color: theme.colorScheme.outline),\n                  textAlign: TextAlign.center,\n                ),\n              ),\n            ],\n          ),\n        );\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/dynamics/widgets/blocked_item.dart",
    "content": "import 'package:PiliPlus/models/dynamics/result.dart' show ModuleBlocked;\nimport 'package:PiliPlus/pages/article/widgets/opus_content.dart'\n    show moduleBlockedItem;\nimport 'package:flutter/material.dart';\n\nWidget blockedItem(\n  BuildContext context, {\n  required ThemeData theme,\n  required ModuleBlocked blocked,\n}) {\n  return Padding(\n    padding: const EdgeInsets.symmetric(horizontal: 13, vertical: 1),\n    child: moduleBlockedItem(context, theme, blocked),\n  );\n}\n"
  },
  {
    "path": "lib/pages/dynamics/widgets/content_panel.dart",
    "content": "// 内容\nimport 'package:PiliPlus/common/widgets/custom_icon.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text/text.dart' as custom_text;\nimport 'package:PiliPlus/common/widgets/image_grid/image_grid_view.dart';\nimport 'package:PiliPlus/models/dynamics/result.dart';\nimport 'package:PiliPlus/pages/dynamics/widgets/rich_node_panel.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nWidget content(\n  BuildContext context, {\n  required int floor,\n  required ThemeData theme,\n  required DynamicItemModel item,\n  required bool isSave,\n  required bool isDetail,\n}) {\n  TextSpan? richNodes = richNode(\n    context,\n    theme: theme,\n    item: item,\n  );\n  final moduleDynamic = item.modules.moduleDynamic;\n  final pics = moduleDynamic?.major?.opus?.pics;\n  final text =\n      moduleDynamic?.desc?.text ?? moduleDynamic?.major?.opus?.summary?.text;\n  return Padding(\n    padding: floor == 1\n        ? const EdgeInsets.fromLTRB(12, 0, 12, 6)\n        : const EdgeInsets.only(bottom: 6),\n    child: Column(\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        if (moduleDynamic?.topic case final topic?)\n          GestureDetector(\n            onTap: () => Get.toNamed(\n              '/dynTopic',\n              parameters: {\n                'id': topic.id!.toString(),\n                'name': topic.name!,\n              },\n            ),\n            child: Text.rich(\n              TextSpan(\n                children: [\n                  WidgetSpan(\n                    alignment: PlaceholderAlignment.middle,\n                    child: Padding(\n                      padding: const EdgeInsets.only(right: 4),\n                      child: Icon(\n                        size: 18,\n                        CustomIcons.topic_tag,\n                        color: theme.colorScheme.primary,\n                      ),\n                    ),\n                  ),\n                  TextSpan(text: topic.name),\n                ],\n              ),\n              style: TextStyle(\n                fontSize: floor != 1\n                    ? 14\n                    : isDetail && !isSave\n                    ? 16\n                    : 15,\n                color: theme.colorScheme.primary,\n              ),\n            ),\n          ),\n        if (richNodes != null)\n          isDetail && floor == 1\n              ? SelectableText.rich(\n                  richNodes,\n                  style: isSave\n                      ? const TextStyle(fontSize: 15)\n                      : const TextStyle(fontSize: 16),\n                  contextMenuBuilder: text == null || text.isEmpty\n                      ? null\n                      : (_, state) => _contextMenuBuilder(state, text),\n                )\n              : custom_text.Text.rich(\n                  style: floor == 1\n                      ? const TextStyle(fontSize: 15)\n                      : const TextStyle(fontSize: 14),\n                  richNodes,\n                  maxLines: isSave ? null : 6,\n                  onShowMore: () => PageUtils.pushDynDetail(item, isPush: true),\n                  primary: theme.colorScheme.primary,\n                ),\n        if (pics != null && pics.isNotEmpty)\n          ImageGridView(\n            fullScreen: true,\n            picArr: pics\n                .map(\n                  (item) => ImageModel(\n                    width: item.width,\n                    height: item.height,\n                    url: item.url ?? '',\n                    liveUrl: item.liveUrl,\n                  ),\n                )\n                .toList(),\n          ),\n      ],\n    ),\n  );\n}\n\nWidget _contextMenuBuilder(EditableTextState state, String text) {\n  return AdaptiveTextSelectionToolbar.buttonItems(\n    buttonItems: state.contextMenuButtonItems\n      ..add(\n        ContextMenuButtonItem(label: '文本', onPressed: () => _onCopyText(text)),\n      ),\n    anchors: state.contextMenuAnchors,\n  );\n}\n\nvoid _onCopyText(String text) {\n  showDialog(\n    context: Get.context!,\n    builder: (context) => Dialog(\n      child: Padding(\n        padding: const .symmetric(horizontal: 20, vertical: 16),\n        child: SelectableText(\n          text,\n          style: const TextStyle(fontSize: 15, height: 1.7),\n        ),\n      ),\n    ),\n  );\n}\n"
  },
  {
    "path": "lib/pages/dynamics/widgets/dyn_content.dart",
    "content": "import 'package:PiliPlus/models/dynamics/result.dart';\nimport 'package:PiliPlus/pages/dynamics/widgets/additional_panel.dart';\nimport 'package:PiliPlus/pages/dynamics/widgets/blocked_item.dart';\nimport 'package:PiliPlus/pages/dynamics/widgets/content_panel.dart';\nimport 'package:PiliPlus/pages/dynamics/widgets/module_panel.dart';\nimport 'package:flutter/material.dart';\n\nList<Widget> dynContent(\n  BuildContext context, {\n  required int floor,\n  required ThemeData theme,\n  required DynamicItemModel item,\n  required bool isSave,\n  required bool isDetail,\n}) {\n  final moduleDynamic = item.modules.moduleDynamic;\n  return [\n    if (item.type != 'DYNAMIC_TYPE_NONE')\n      content(\n        context,\n        theme: theme,\n        isSave: isSave,\n        isDetail: isDetail,\n        item: item,\n        floor: floor,\n      ),\n    module(\n      context,\n      theme: theme,\n      isSave: isSave,\n      isDetail: isDetail,\n      item: item,\n      floor: floor,\n    ),\n    if (moduleDynamic?.additional case final additional?)\n      ?addWidget(\n        theme: theme,\n        context,\n        idStr: item.idStr,\n        additional: additional,\n        floor: floor,\n      ),\n    if (moduleDynamic?.major?.blocked case final blocked?)\n      blockedItem(context, theme: theme, blocked: blocked),\n  ];\n}\n"
  },
  {
    "path": "lib/pages/dynamics/widgets/dynamic_panel.dart",
    "content": "import 'package:PiliPlus/common/widgets/avatars.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/dynamics/result.dart';\nimport 'package:PiliPlus/pages/dynamics/widgets/action_panel.dart';\nimport 'package:PiliPlus/pages/dynamics/widgets/author_panel.dart';\nimport 'package:PiliPlus/pages/dynamics/widgets/dyn_content.dart';\nimport 'package:PiliPlus/pages/dynamics/widgets/interaction.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart';\n\nclass DynamicPanel extends StatelessWidget {\n  final DynamicItemModel item;\n  final bool isDetail;\n  final ValueChanged<Object>? onRemove;\n  final bool isSave;\n  final void Function(bool isTop, Object dynId)? onSetTop;\n  final VoidCallback? onBlock;\n  final VoidCallback? onUnfold;\n  final bool isDetailPortraitW;\n  final Future<LoadingState> Function(bool isPrivate, Object dynId)?\n  onSetPubSetting;\n  final VoidCallback? onEdit;\n  final ValueChanged<int>? onSetReplySubject;\n\n  const DynamicPanel({\n    super.key,\n    required this.item,\n    this.isDetail = false,\n    this.onRemove,\n    this.isSave = false,\n    this.onSetTop,\n    this.onBlock,\n    this.onUnfold,\n    this.isDetailPortraitW = true,\n    this.onSetPubSetting,\n    this.onEdit,\n    this.onSetReplySubject,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    if (item.visible == false) {\n      return const SizedBox.shrink();\n    }\n    final theme = Theme.of(context);\n    final authorWidget = AuthorPanel(\n      item: item,\n      isDetail: isDetail,\n      onRemove: onRemove,\n      isSave: isSave,\n      onSetTop: onSetTop,\n      onBlock: onBlock,\n      onSetPubSetting: onSetPubSetting,\n      onEdit: onEdit,\n      onSetReplySubject: onSetReplySubject,\n    );\n\n    void showMore() => _imageSaveDialog(context, authorWidget.morePanel);\n\n    final child = Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onTap:\n            isDetail &&\n                !const {\n                  'DYNAMIC_TYPE_AV',\n                  'DYNAMIC_TYPE_UGC_SEASON',\n                  'DYNAMIC_TYPE_PGC_UNION',\n                  'DYNAMIC_TYPE_PGC',\n                  'DYNAMIC_TYPE_LIVE',\n                  'DYNAMIC_TYPE_LIVE_RCMD',\n                  'DYNAMIC_TYPE_MEDIALIST',\n                  'DYNAMIC_TYPE_COURSES_SEASON',\n                }.contains(item.type)\n            ? null\n            : () => PageUtils.pushDynDetail(item),\n        onLongPress: showMore,\n        onSecondaryTap: PlatformUtils.isMobile ? null : showMore,\n        child: Column(\n          mainAxisSize: MainAxisSize.min,\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            Padding(\n              padding: const EdgeInsets.fromLTRB(12, 12, 12, 6),\n              child: authorWidget,\n            ),\n            if (item.modules.moduleDispute case final moduleDispute?)\n              _buildDispute(theme, moduleDispute),\n            ...dynContent(\n              context,\n              theme: theme,\n              isSave: isSave,\n              isDetail: isDetail,\n              item: item,\n              floor: 1,\n            ),\n            const SizedBox(height: 2),\n            if (!isDetail) ...[\n              if (item.modules.moduleInteraction case ModuleInteraction(\n                :final items,\n              ))\n                if (items != null && items.isNotEmpty)\n                  dynInteraction(\n                    theme: theme,\n                    items: items,\n                  ),\n              ActionPanel(item: item),\n              if (item.modules.moduleFold case final moduleFold?) ...[\n                Divider(\n                  height: 1,\n                  color: theme.dividerColor.withValues(alpha: 0.1),\n                ),\n                _buildFoldItem(theme, moduleFold),\n              ],\n            ] else if (!isSave)\n              const SizedBox(height: 12),\n          ],\n        ),\n      ),\n    );\n    if (isSave || (isDetail && !isDetailPortraitW)) {\n      return child;\n    }\n    return DecoratedBox(\n      decoration: BoxDecoration(\n        border: Border(\n          bottom: BorderSide(\n            width: 8,\n            color: theme.dividerColor.withValues(alpha: 0.05),\n          ),\n        ),\n      ),\n      child: Padding(\n        padding: const EdgeInsets.only(bottom: 8),\n        child: child,\n      ),\n    );\n  }\n\n  void _imageSaveDialog(\n    BuildContext context,\n    Function(BuildContext) morePanel,\n  ) {\n    String? title;\n    String? cover;\n    String? bvid;\n    late final major = item.modules.moduleDynamic?.major;\n    switch (item.type) {\n      case 'DYNAMIC_TYPE_AV':\n        if (major?.archive case final archive?) {\n          title = archive.title;\n          cover = archive.cover;\n          bvid = archive.bvid;\n        }\n        break;\n      case 'DYNAMIC_TYPE_UGC_SEASON':\n        if (major?.ugcSeason case final ugcSeason?) {\n          title = ugcSeason.title;\n          cover = ugcSeason.cover;\n          bvid = ugcSeason.bvid;\n        }\n        break;\n      case 'DYNAMIC_TYPE_PGC' || 'DYNAMIC_TYPE_PGC_UNION':\n        if (major?.pgc case final pgc?) {\n          title = pgc.title;\n          cover = pgc.cover;\n        }\n        break;\n      case 'DYNAMIC_TYPE_LIVE_RCMD':\n        if (major?.liveRcmd case final liveRcmd?) {\n          title = liveRcmd.title;\n          cover = liveRcmd.cover;\n        }\n        break;\n      case 'DYNAMIC_TYPE_LIVE':\n        if (major?.live case final live?) {\n          title = live.title;\n          cover = live.cover;\n        }\n        break;\n      case 'DYNAMIC_TYPE_COURSES_SEASON':\n        if (major?.courses case final courses?) {\n          title = courses.title;\n          cover = courses.cover;\n        }\n        break;\n      case 'DYNAMIC_TYPE_SUBSCRIPTION_NEW':\n        if (major?.subscriptionNew?.liveRcmd?.content?.livePlayInfo\n            case final livePlayInfo?) {\n          title = livePlayInfo.title;\n          cover = livePlayInfo.cover;\n        }\n        break;\n      default:\n        morePanel(context);\n        return;\n    }\n    imageSaveDialog(\n      title: title,\n      cover: cover,\n      bvid: bvid,\n    );\n  }\n\n  Widget _buildFoldItem(ThemeData theme, ModuleFold moduleFold) {\n    Widget child = Text.rich(\n      textAlign: TextAlign.center,\n      style: TextStyle(\n        height: 1,\n        fontSize: 13,\n        color: theme.colorScheme.outline,\n      ),\n      strutStyle: const StrutStyle(\n        height: 1,\n        leading: 0,\n        fontSize: 13,\n      ),\n      TextSpan(\n        children: [\n          TextSpan(text: moduleFold.statement ?? '展开'),\n          WidgetSpan(\n            alignment: PlaceholderAlignment.middle,\n            child: Icon(\n              size: 19,\n              Icons.keyboard_arrow_down,\n              color: theme.colorScheme.outline,\n            ),\n          ),\n        ],\n      ),\n    );\n    final users = moduleFold.users;\n    if (users != null && users.isNotEmpty) {\n      child = Row(\n        spacing: 5,\n        mainAxisAlignment: .center,\n        children: [\n          avatars(colorScheme: theme.colorScheme, users: users),\n          child,\n        ],\n      );\n    }\n    return InkWell(\n      onTap: onUnfold,\n      child: Container(\n        alignment: Alignment.center,\n        padding: const EdgeInsets.symmetric(vertical: 10),\n        child: child,\n      ),\n    );\n  }\n\n  Widget _buildDispute(ThemeData theme, ModuleDispute moduleDispute) {\n    final child = Container(\n      width: .infinity,\n      margin: const .fromLTRB(12, 2, 12, 6),\n      padding: const .symmetric(horizontal: 8, vertical: 6),\n      decoration: BoxDecoration(\n        color: theme.colorScheme.secondaryContainer.withValues(\n          alpha: theme.brightness.isLight ? 0.5 : 0.7,\n        ),\n        borderRadius: const BorderRadius.all(Radius.circular(6)),\n      ),\n      child: Text.rich(\n        style: TextStyle(\n          height: 1,\n          fontSize: 13,\n          color: theme.colorScheme.onSecondaryContainer,\n        ),\n        strutStyle: const StrutStyle(\n          leading: 0,\n          height: 1,\n          fontSize: 13,\n        ),\n        TextSpan(\n          children: [\n            WidgetSpan(\n              alignment: .middle,\n              child: Padding(\n                padding: const .only(right: 4),\n                child: Icon(\n                  size: 15,\n                  Icons.warning_rounded,\n                  color: theme.colorScheme.onSecondaryContainer,\n                ),\n              ),\n            ),\n            TextSpan(text: moduleDispute.title),\n          ],\n        ),\n      ),\n    );\n    if (moduleDispute.jumpUrl?.isNotEmpty == true) {\n      return GestureDetector(\n        onTap: () => PageUtils.handleWebview(moduleDispute.jumpUrl!),\n        child: child,\n      );\n    }\n    return child;\n  }\n}\n"
  },
  {
    "path": "lib/pages/dynamics/widgets/forward_panel.dart",
    "content": "import 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/models/dynamics/result.dart';\nimport 'package:PiliPlus/pages/dynamics/widgets/dyn_content.dart';\nimport 'package:PiliPlus/pages/dynamics/widgets/module_panel.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nWidget forwardPanel(\n  BuildContext context, {\n  required int floor,\n  required ThemeData theme,\n  required DynamicItemModel orig,\n  required bool isSave,\n  required bool isDetail,\n}) {\n  final moduleDynamic = orig.modules.moduleDynamic;\n  final major = moduleDynamic?.major;\n  final isNoneMajor = major?.type == 'MAJOR_TYPE_NONE';\n\n  Widget child;\n\n  if (isNoneMajor) {\n    child = noneWidget(theme, major?.none?.tips);\n  } else {\n    child = Column(\n      mainAxisSize: MainAxisSize.min,\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        _forwardAuthor(\n          theme: theme,\n          moduleAuthor: orig.modules.moduleAuthor!,\n          isSave: isSave,\n        ),\n        const SizedBox(height: 5),\n        ...dynContent(\n          context,\n          theme: theme,\n          isSave: isSave,\n          isDetail: isDetail,\n          item: orig,\n          floor: floor + 1,\n        ),\n      ],\n    );\n  }\n\n  child = Container(\n    padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8),\n    color: theme.dividerColor.withValues(alpha: 0.08),\n    child: child,\n  );\n\n  if (isNoneMajor) {\n    return child;\n  }\n\n  void showMore() {\n    String? title, cover, bvid;\n    switch (orig.type) {\n      case 'DYNAMIC_TYPE_AV':\n        title = major?.archive?.title;\n        cover = major?.archive?.cover;\n        bvid = major?.archive?.bvid;\n        break;\n      case 'DYNAMIC_TYPE_UGC_SEASON':\n        title = major?.ugcSeason?.title;\n        cover = major?.ugcSeason?.cover;\n        bvid = major?.ugcSeason?.bvid;\n        break;\n      case 'DYNAMIC_TYPE_PGC' || 'DYNAMIC_TYPE_PGC_UNION':\n        title = major?.pgc?.title;\n        cover = major?.pgc?.cover;\n        break;\n      case 'DYNAMIC_TYPE_LIVE_RCMD':\n        title = major?.liveRcmd?.title;\n        cover = major?.liveRcmd?.cover;\n        break;\n      case 'DYNAMIC_TYPE_LIVE':\n        title = major?.live?.title;\n        cover = major?.live?.cover;\n        break;\n      default:\n        return;\n    }\n    if (cover != null) {\n      imageSaveDialog(\n        title: title,\n        cover: cover,\n        bvid: bvid,\n      );\n    }\n  }\n\n  return InkWell(\n    onTap: () => PageUtils.pushDynDetail(orig),\n    onLongPress: showMore,\n    onSecondaryTap: PlatformUtils.isMobile ? null : showMore,\n    child: child,\n  );\n}\n\nWidget _forwardAuthor({\n  required ThemeData theme,\n  required ModuleAuthorModel moduleAuthor,\n  required bool isSave,\n}) {\n  final isNormalAuth = moduleAuthor.type == 'AUTHOR_TYPE_NORMAL';\n  return Row(\n    children: [\n      GestureDetector(\n        onTap: isNormalAuth\n            ? () => Get.toNamed('/member?mid=${moduleAuthor.mid}')\n            : null,\n        child: Text(\n          '${isNormalAuth ? '@' : ''}${moduleAuthor.name}',\n          style: TextStyle(color: theme.colorScheme.primary),\n        ),\n      ),\n      const SizedBox(width: 6),\n      Text(\n        isSave\n            ? DateFormatUtils.format(\n                moduleAuthor.pubTs,\n                format: DateFormatUtils.longFormatDs,\n              )\n            : DateFormatUtils.dateFormat(moduleAuthor.pubTs),\n        style: TextStyle(\n          color: theme.colorScheme.outline,\n          fontSize: theme.textTheme.labelSmall!.fontSize,\n        ),\n      ),\n    ],\n  );\n}\n"
  },
  {
    "path": "lib/pages/dynamics/widgets/interaction.dart",
    "content": "import 'package:PiliPlus/common/widgets/gesture/tap_gesture_recognizer.dart';\nimport 'package:PiliPlus/models/dynamics/result.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:font_awesome_flutter/font_awesome_flutter.dart';\nimport 'package:get/get_core/src/get_main.dart';\nimport 'package:get/get_navigation/src/extension_navigation.dart';\n\nWidget dynInteraction({\n  required ThemeData theme,\n  required List<ModuleInteractionItem> items,\n}) {\n  try {\n    Widget child;\n    if (items.length > 1) {\n      child = Column(\n        spacing: 3,\n        mainAxisSize: .min,\n        crossAxisAlignment: .start,\n        children: items.map((e) => _item(theme, e)).toList(),\n      );\n    } else {\n      child = _item(theme, items.single);\n    }\n    return Container(\n      padding: const .only(left: 8),\n      margin: const .only(left: 12, right: 12, top: 6),\n      decoration: BoxDecoration(\n        border: Border(\n          left: BorderSide(\n            width: 1.5,\n            color: theme.colorScheme.outline.withValues(alpha: 0.3),\n          ),\n        ),\n      ),\n      child: child,\n    );\n  } catch (e) {\n    if (kDebugMode) {\n      return Text(\n        'interaction error: $e',\n        style: TextStyle(color: theme.colorScheme.error),\n      );\n    }\n    return const SizedBox.shrink();\n  }\n}\n\nWidget _item(\n  ThemeData theme,\n  ModuleInteractionItem item,\n) {\n  return Text.rich(\n    style: const TextStyle(fontSize: 13, height: 1.3),\n    strutStyle: const StrutStyle(fontSize: 13, height: 1.3, leading: 0),\n    TextSpan(\n      children: [\n        WidgetSpan(\n          alignment: .middle,\n          child: Padding(\n            padding: const .only(right: 6),\n            child: Icon(\n              size: 13,\n              color: theme.colorScheme.outline,\n              switch (item.type) {\n                1 => FontAwesomeIcons.comment,\n                _ => FontAwesomeIcons.thumbsUp,\n              },\n            ),\n          ),\n        ),\n        ...item.desc!.richTextNodes!.map(\n          (e) {\n            final isAt = e.type == 'RICH_TEXT_NODE_TYPE_AT';\n            return TextSpan(\n              text: e.origText,\n              style: isAt\n                  ? null\n                  : TextStyle(color: theme.colorScheme.onSurfaceVariant),\n              recognizer: isAt\n                  ? (NoDeadlineTapGestureRecognizer()\n                      ..onTap = () => Get.toNamed('/member?mid=${e.rid}'))\n                  : null,\n            );\n          },\n        ),\n      ],\n    ),\n  );\n}\n"
  },
  {
    "path": "lib/pages/dynamics/widgets/live_panel.dart",
    "content": "import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models/dynamics/result.dart';\nimport 'package:flutter/material.dart';\n\nWidget livePanel(\n  BuildContext context, {\n  required int floor,\n  required ThemeData theme,\n  required DynamicItemModel item,\n  required bool isDetail,\n  Function(List<String>, int)? callback,\n}) {\n  DynamicLive2Model? live = item.modules.moduleDynamic!.major!.live;\n  if (live == null) {\n    return const SizedBox.shrink();\n  }\n  return Padding(\n    padding: floor == 1\n        ? const EdgeInsets.symmetric(horizontal: 12)\n        : EdgeInsets.zero,\n    child: Row(\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        NetworkImgLayer(\n          width: 120,\n          height: 75,\n          src: live.cover,\n        ),\n        const SizedBox(width: 10),\n        Expanded(\n          child: Column(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              Text(\n                live.title!,\n                maxLines: isDetail ? null : 2,\n                overflow: isDetail ? null : TextOverflow.ellipsis,\n              ),\n              const SizedBox(height: 4),\n              if (live.descFirst case final descFirst?)\n                Text(\n                  descFirst,\n                  style: TextStyle(\n                    color: theme.colorScheme.outline,\n                    fontSize: theme.textTheme.labelMedium!.fontSize,\n                  ),\n                ),\n            ],\n          ),\n        ),\n        if (live.badge?.text case final badge?)\n          Text(\n            badge,\n            style: TextStyle(\n              fontSize: theme.textTheme.labelMedium!.fontSize,\n              color: live.liveState == 1\n                  ? theme.colorScheme.primary\n                  : theme.colorScheme.outline,\n            ),\n          ),\n      ],\n    ),\n  );\n}\n"
  },
  {
    "path": "lib/pages/dynamics/widgets/live_panel_sub.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models/dynamics/result.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\n\nWidget livePanelSub(\n  BuildContext context, {\n  required int floor,\n  required ThemeData theme,\n  required DynamicItemModel item,\n  required bool isDetail,\n}) {\n  LivePlayInfo? live = item\n      .modules\n      .moduleDynamic!\n      .major\n      ?.subscriptionNew\n      ?.liveRcmd\n      ?.content\n      ?.livePlayInfo;\n  if (live == null) {\n    return const SizedBox.shrink();\n  }\n  EdgeInsets padding;\n  if (floor == 1) {\n    padding = const EdgeInsets.symmetric(horizontal: 12);\n  } else {\n    padding = EdgeInsets.zero;\n  }\n  return Padding(\n    padding: padding,\n    child: Column(\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        Stack(\n          clipBehavior: Clip.none,\n          children: [\n            LayoutBuilder(\n              builder: (context, constraints) => NetworkImgLayer(\n                width: constraints.maxWidth,\n                height: constraints.maxWidth / StyleString.aspectRatio,\n                src: live.cover,\n                quality: 40,\n              ),\n            ),\n            PBadge(\n              text: live.watchedShow?.textLarge,\n              top: 6,\n              right: 65,\n              fontSize: 10.5,\n              type: PBadgeType.gray,\n            ),\n            if (live.liveStatus == 1)\n              Positioned(\n                right: 6,\n                top: 6,\n                child: Image.asset(\n                  height: 16,\n                  cacheHeight: 16.cacheSize(context),\n                  'assets/images/live/live.gif',\n                  filterQuality: FilterQuality.low,\n                ),\n              )\n            else\n              const PBadge(\n                text: '直播结束',\n                top: 6,\n                right: 6,\n              ),\n            if (live.areaName case final areaName?)\n              Positioned(\n                left: 0,\n                right: 0,\n                bottom: 0,\n                child: Container(\n                  height: 80,\n                  alignment: Alignment.bottomLeft,\n                  padding: const EdgeInsets.fromLTRB(12, 0, 10, 10),\n                  decoration: const BoxDecoration(\n                    gradient: LinearGradient(\n                      begin: Alignment.topCenter,\n                      end: Alignment.bottomCenter,\n                      colors: <Color>[\n                        Colors.transparent,\n                        Colors.black45,\n                      ],\n                    ),\n                    borderRadius: BorderRadius.vertical(\n                      bottom: StyleString.imgRadius,\n                    ),\n                  ),\n                  child: Text(\n                    areaName,\n                    style: TextStyle(\n                      fontSize: theme.textTheme.labelMedium!.fontSize,\n                      color: Colors.white,\n                    ),\n                  ),\n                ),\n              ),\n          ],\n        ),\n        const SizedBox(height: 6),\n        if (live.title case final title?)\n          Text(\n            title,\n            maxLines: isDetail ? null : 1,\n            style: const TextStyle(fontWeight: FontWeight.bold),\n            overflow: isDetail ? null : TextOverflow.ellipsis,\n          ),\n        const SizedBox(height: 2),\n      ],\n    ),\n  );\n}\n"
  },
  {
    "path": "lib/pages/dynamics/widgets/live_rcmd_panel.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models/dynamics/result.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\n\nWidget liveRcmdPanel(\n  BuildContext context, {\n  required int floor,\n  required ThemeData theme,\n  required DynamicItemModel item,\n  required bool isDetail,\n  Function(List<String>, int)? callback,\n}) {\n  DynamicLiveModel? liveRcmd = item.modules.moduleDynamic?.major?.liveRcmd;\n  if (liveRcmd == null) {\n    return const SizedBox.shrink();\n  }\n  EdgeInsets padding;\n  if (floor == 1) {\n    padding = const EdgeInsets.symmetric(horizontal: 12);\n  } else {\n    padding = EdgeInsets.zero;\n  }\n  return Padding(\n    padding: padding,\n    child: Column(\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        Stack(\n          clipBehavior: Clip.none,\n          children: [\n            LayoutBuilder(\n              builder: (context, constraints) => NetworkImgLayer(\n                width: constraints.maxWidth,\n                height: constraints.maxWidth / StyleString.aspectRatio,\n                src: liveRcmd.cover,\n                quality: 40,\n              ),\n            ),\n            PBadge(\n              text: liveRcmd.watchedShow?.textLarge,\n              top: 6,\n              right: 65,\n              fontSize: 10.5,\n              type: PBadgeType.gray,\n            ),\n            if (liveRcmd.liveStatus == 1)\n              Positioned(\n                right: 6,\n                top: 6,\n                child: Image.asset(\n                  height: 16,\n                  cacheHeight: 16.cacheSize(context),\n                  'assets/images/live/live.gif',\n                  filterQuality: FilterQuality.low,\n                ),\n              )\n            else\n              const PBadge(\n                text: '直播结束',\n                top: 6,\n                right: 6,\n                type: PBadgeType.gray,\n              ),\n            if (liveRcmd.areaName case final areaName?)\n              Positioned(\n                left: 0,\n                right: 0,\n                bottom: 0,\n                child: Container(\n                  height: 80,\n                  alignment: Alignment.bottomLeft,\n                  padding: const EdgeInsets.fromLTRB(12, 0, 10, 10),\n                  decoration: const BoxDecoration(\n                    gradient: LinearGradient(\n                      begin: Alignment.topCenter,\n                      end: Alignment.bottomCenter,\n                      colors: <Color>[\n                        Colors.transparent,\n                        Colors.black45,\n                      ],\n                    ),\n                    borderRadius: BorderRadius.vertical(\n                      bottom: StyleString.imgRadius,\n                    ),\n                  ),\n                  child: Text(\n                    areaName,\n                    style: TextStyle(\n                      fontSize: theme.textTheme.labelMedium!.fontSize,\n                      color: Colors.white,\n                    ),\n                  ),\n                ),\n              ),\n          ],\n        ),\n        const SizedBox(height: 6),\n        if (liveRcmd.title case final title?)\n          Text(\n            title,\n            maxLines: isDetail ? null : 1,\n            style: const TextStyle(fontWeight: FontWeight.bold),\n            overflow: isDetail ? null : TextOverflow.ellipsis,\n          ),\n        const SizedBox(height: 2),\n      ],\n    ),\n  );\n}\n"
  },
  {
    "path": "lib/pages/dynamics/widgets/module_panel.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/grpc/bilibili/app/listener/v1.pbenum.dart'\n    show PlaylistSource;\nimport 'package:PiliPlus/models/dynamics/result.dart';\nimport 'package:PiliPlus/pages/audio/view.dart';\nimport 'package:PiliPlus/pages/dynamics/widgets/forward_panel.dart';\nimport 'package:PiliPlus/pages/dynamics/widgets/live_panel.dart';\nimport 'package:PiliPlus/pages/dynamics/widgets/live_panel_sub.dart';\nimport 'package:PiliPlus/pages/dynamics/widgets/live_rcmd_panel.dart';\nimport 'package:PiliPlus/pages/dynamics/widgets/video_panel.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/image_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:cached_network_image/cached_network_image.dart';\nimport 'package:flutter/material.dart';\nimport 'package:font_awesome_flutter/font_awesome_flutter.dart';\n\nWidget noneWidget(ThemeData theme, String? tips) => Row(\n  spacing: 5,\n  children: [\n    Icon(\n      Icons.error,\n      size: 18,\n      color: theme.colorScheme.outline,\n    ),\n    Text(\n      tips ?? '已失效',\n      style: TextStyle(color: theme.colorScheme.outline),\n    ),\n  ],\n);\n\nWidget module(\n  BuildContext context, {\n  required int floor,\n  required ThemeData theme,\n  required DynamicItemModel item,\n  required bool isSave,\n  required bool isDetail,\n}) {\n  final moduleDynamic = item.modules.moduleDynamic;\n  final major = moduleDynamic?.major;\n\n  if (major?.type == 'MAJOR_TYPE_NONE') {\n    return noneWidget(theme, major?.none?.tips);\n  }\n\n  switch (item.type) {\n    case 'DYNAMIC_TYPE_NONE':\n      return Row(\n        spacing: 4,\n        children: [\n          const Icon(FontAwesomeIcons.ghost, size: 14),\n          Text(major!.none!.tips!),\n        ],\n      );\n    // 图文\n    case 'DYNAMIC_TYPE_DRAW':\n    // 文章\n    case 'DYNAMIC_TYPE_ARTICLE':\n    case 'DYNAMIC_TYPE_WORD':\n      return const SizedBox.shrink();\n    // 视频\n    case 'DYNAMIC_TYPE_AV':\n    case 'DYNAMIC_TYPE_UGC_SEASON':\n    case 'DYNAMIC_TYPE_PGC':\n    case 'DYNAMIC_TYPE_PGC_UNION':\n    case 'DYNAMIC_TYPE_COURSES_SEASON':\n      return videoSeasonWidget(\n        context,\n        theme: theme,\n        item: item,\n        floor: floor,\n        isSave: isSave,\n        isDetail: isDetail,\n      );\n    // 转发\n    case 'DYNAMIC_TYPE_FORWARD':\n      return forwardPanel(\n        context,\n        theme: theme,\n        isSave: isSave,\n        orig: item.orig!,\n        isDetail: isDetail,\n        floor: floor + 1,\n      );\n    // 直播\n    case 'DYNAMIC_TYPE_LIVE_RCMD':\n      return liveRcmdPanel(\n        context,\n        theme: theme,\n        isDetail: isDetail,\n        item: item,\n        floor: floor,\n      );\n    // 直播\n    case 'DYNAMIC_TYPE_LIVE':\n      return livePanel(\n        context,\n        theme: theme,\n        item: item,\n        floor: floor,\n        isDetail: isDetail,\n      );\n    // 活动\n    case 'DYNAMIC_TYPE_COMMON_SQUARE':\n      final common = major?.common ?? major?.upowerCommon;\n      if (common == null) return const SizedBox.shrink();\n      return Material(\n        color: floor == 1\n            ? theme.dividerColor.withValues(alpha: 0.08)\n            : theme.colorScheme.surface,\n        shape: floor == 1\n            ? null\n            : const RoundedRectangleBorder(borderRadius: StyleString.mdRadius),\n        child: InkWell(\n          borderRadius: floor == 1 ? null : StyleString.mdRadius,\n          onTap: () {\n            try {\n              String url = common.jumpUrl!;\n              if (url.contains('bangumi/play') &&\n                  PageUtils.viewPgcFromUri(url)) {\n                return;\n              }\n              PageUtils.handleWebview(url, inApp: true);\n            } catch (_) {}\n          },\n          child: Padding(\n            padding: const EdgeInsets.only(\n              left: 12,\n              top: 10,\n              right: 12,\n              bottom: 10,\n            ),\n            child: Row(\n              spacing: 10,\n              children: [\n                if (common.cover?.isNotEmpty ?? false)\n                  ClipRRect(\n                    borderRadius: const BorderRadius.all(Radius.circular(6)),\n                    child: CachedNetworkImage(\n                      width: 45,\n                      height: 45,\n                      fit: BoxFit.cover,\n                      memCacheWidth: 45.cacheSize(context),\n                      imageUrl: ImageUtils.safeThumbnailUrl(common.cover),\n                    ),\n                  ),\n                Expanded(\n                  child: Column(\n                    spacing: 2,\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: [\n                      Text(\n                        '${common.titlePrefix ?? ''}${common.title ?? ''}',\n                        style: TextStyle(color: theme.colorScheme.primary),\n                        maxLines: 1,\n                        overflow: TextOverflow.ellipsis,\n                      ),\n                      if (common.desc?.isNotEmpty ?? false)\n                        Text(\n                          common.desc!,\n                          style: TextStyle(\n                            color: theme.colorScheme.outline,\n                            fontSize: theme.textTheme.labelMedium!.fontSize,\n                          ),\n                          maxLines: 1,\n                          overflow: TextOverflow.ellipsis,\n                        ),\n                    ],\n                  ),\n                ),\n              ],\n            ),\n          ),\n        ),\n      );\n    case 'DYNAMIC_TYPE_MUSIC':\n      final music = major!.music!;\n      final borderRadius = floor == 1 ? null : StyleString.mdRadius;\n      final Color bgColor = floor == 1\n          ? theme.dividerColor.withValues(alpha: 0.08)\n          : theme.colorScheme.surface;\n      return Material(\n        color: bgColor,\n        borderRadius: borderRadius,\n        child: InkWell(\n          borderRadius: borderRadius,\n          onTap: () => AudioPage.toAudioPage(\n            oid: music.id!,\n            itemType: 3,\n            from: PlaylistSource.AUDIO_CARD,\n          ),\n          child: Padding(\n            padding: const EdgeInsets.only(\n              left: 12,\n              top: 10,\n              right: 12,\n              bottom: 10,\n            ),\n            child: Row(\n              spacing: 10,\n              children: [\n                NetworkImgLayer(\n                  width: 45,\n                  height: 45,\n                  src: music.cover,\n                  borderRadius: const BorderRadius.all(\n                    Radius.circular(8),\n                  ),\n                ),\n                Expanded(\n                  child: Column(\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: [\n                      Text(\n                        music.title!,\n                        style: TextStyle(\n                          color: theme.colorScheme.primary,\n                        ),\n                        maxLines: 1,\n                        overflow: TextOverflow.ellipsis,\n                      ),\n                      const SizedBox(height: 2),\n                      Text(\n                        music.label!,\n                        style: TextStyle(\n                          color: theme.colorScheme.outline,\n                          fontSize: theme.textTheme.labelMedium!.fontSize,\n                        ),\n                        maxLines: 1,\n                        overflow: TextOverflow.ellipsis,\n                      ),\n                    ],\n                  ),\n                ),\n              ],\n            ),\n          ),\n        ),\n      );\n    case 'DYNAMIC_TYPE_MEDIALIST':\n      return Row(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          if (floor == 1) const SizedBox(width: 12),\n          if (major?.medialist?.cover?.isNotEmpty == true) ...[\n            Stack(\n              clipBehavior: Clip.none,\n              children: [\n                Hero(\n                  tag: major!.medialist!.cover!,\n                  child: NetworkImgLayer(\n                    width: 180,\n                    height: 110,\n                    src: major.medialist!.cover,\n                  ),\n                ),\n                PBadge(\n                  right: 6,\n                  top: 6,\n                  text: major.medialist!.badge?.text,\n                ),\n              ],\n            ),\n            const SizedBox(width: 14),\n          ],\n          Expanded(\n            child: SizedBox(\n              height: 110,\n              child: Column(\n                mainAxisSize: MainAxisSize.min,\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  const SizedBox(height: 4),\n                  Text(\n                    major!.medialist!.title!,\n                    style: TextStyle(\n                      fontSize: theme.textTheme.titleMedium!.fontSize,\n                      fontWeight: FontWeight.bold,\n                    ),\n                  ),\n                  if (major.medialist?.subTitle != null) ...[\n                    const Spacer(),\n                    Text(\n                      major.medialist!.subTitle!,\n                      style: TextStyle(\n                        fontSize: theme.textTheme.labelLarge!.fontSize,\n                        color: theme.colorScheme.outline,\n                      ),\n                    ),\n                  ],\n                ],\n              ),\n            ),\n          ),\n          if (floor == 1) const SizedBox(width: 12),\n        ],\n      );\n\n    case 'DYNAMIC_TYPE_SUBSCRIPTION_NEW'\n        when major?.type == 'MAJOR_TYPE_SUBSCRIPTION_NEW':\n      return livePanelSub(\n        context,\n        theme: theme,\n        isDetail: isDetail,\n        item: item,\n        floor: floor,\n      );\n\n    default:\n      return Padding(\n        padding: floor == 1\n            ? const EdgeInsets.symmetric(horizontal: 12)\n            : EdgeInsets.zero,\n        child: Text('暂未支持的类型: \\n${item.idStr}\\n${item.type}'),\n      );\n  }\n}\n"
  },
  {
    "path": "lib/pages/dynamics/widgets/rich_node_panel.dart",
    "content": "import 'dart:io' show Platform;\n\nimport 'package:PiliPlus/common/widgets/gesture/tap_gesture_recognizer.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/image_grid/image_grid_view.dart';\nimport 'package:PiliPlus/http/dynamics.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/search.dart';\nimport 'package:PiliPlus/models/common/image_preview_type.dart'\n    show SourceModel;\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models/dynamics/result.dart';\nimport 'package:PiliPlus/pages/dynamics/widgets/vote.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nconst _linkFoldedText = '网页链接';\n\n// 富文本\nTextSpan? richNode(\n  BuildContext context, {\n  required ThemeData theme,\n  required DynamicItemModel item,\n}) {\n  try {\n    late final style = TextStyle(color: theme.colorScheme.primary);\n    List<InlineSpan> spanChildren = [];\n\n    final moduleDynamic = item.modules.moduleDynamic;\n    List<RichTextNodeItem>? richTextNodes;\n    if (moduleDynamic?.desc case final desc?) {\n      richTextNodes = desc.richTextNodes;\n      if (richTextNodes == null || richTextNodes.isEmpty) {\n        return TextSpan(text: desc.text);\n      }\n    } else if (moduleDynamic?.major?.opus case DynamicOpusModel(\n      :final title,\n      :final summary,\n    )) {\n      // 动态页面 richTextNodes 层级可能与主页动态层级不同\n      richTextNodes = summary?.richTextNodes;\n      if (title != null && title.isNotEmpty) {\n        if (richTextNodes == null || richTextNodes.isEmpty) {\n          return TextSpan(\n            text: title,\n            style: const TextStyle(fontWeight: FontWeight.bold),\n          );\n        } else {\n          spanChildren.add(\n            TextSpan(\n              text: '$title\\n',\n              style: const TextStyle(fontWeight: FontWeight.bold),\n            ),\n          );\n        }\n      }\n    }\n\n    if (richTextNodes == null || richTextNodes.isEmpty) {\n      return null;\n    } else {\n      for (final i in richTextNodes) {\n        switch (i.type) {\n          case 'RICH_TEXT_NODE_TYPE_TEXT':\n            if (i.origText == _linkFoldedText) {\n              item.linkFolded = true;\n            }\n            spanChildren.add(\n              TextSpan(\n                text: i.origText,\n                style: const TextStyle(height: 1.65),\n              ),\n            );\n            break;\n          // @用户\n          case 'RICH_TEXT_NODE_TYPE_AT':\n            spanChildren.add(\n              TextSpan(\n                text: ' ${i.text}',\n                style: style,\n                recognizer: NoDeadlineTapGestureRecognizer()\n                  ..onTap = () => Get.toNamed('/member?mid=${i.rid}'),\n              ),\n            );\n            break;\n          // 话题\n          case 'RICH_TEXT_NODE_TYPE_TOPIC':\n            spanChildren.add(\n              TextSpan(\n                text: i.origText,\n                style: style,\n                recognizer: NoDeadlineTapGestureRecognizer()\n                  ..onTap = () => Get.toNamed(\n                    '/searchResult',\n                    parameters: {\n                      'keyword': i.origText!.substring(\n                        1,\n                        i.origText!.length - 1,\n                      ),\n                    },\n                  ),\n              ),\n            );\n            break;\n          // 网页链接\n          case 'RICH_TEXT_NODE_TYPE_WEB':\n            final hasLink = i.jumpUrl?.isNotEmpty ?? false;\n            if (!hasLink) {\n              item.linkFolded = true;\n            }\n            spanChildren\n              ..add(\n                WidgetSpan(\n                  alignment: PlaceholderAlignment.middle,\n                  child: Icon(\n                    Icons.link,\n                    size: 20,\n                    color: theme.colorScheme.primary,\n                  ),\n                ),\n              )\n              ..add(\n                TextSpan(\n                  text: i.text,\n                  style: style,\n                  recognizer: hasLink\n                      ? (NoDeadlineTapGestureRecognizer()\n                          ..onTap = () => PageUtils.handleWebview(i.jumpUrl!))\n                      : null,\n                ),\n              );\n            break;\n          // 投票\n          case 'RICH_TEXT_NODE_TYPE_VOTE':\n            spanChildren\n              ..add(\n                WidgetSpan(\n                  alignment: PlaceholderAlignment.middle,\n                  child: Icon(\n                    size: 20,\n                    Icons.bar_chart_rounded,\n                    color: theme.colorScheme.primary,\n                  ),\n                ),\n              )\n              ..add(\n                TextSpan(\n                  text: '投票：${i.text}',\n                  style: style,\n                  recognizer: NoDeadlineTapGestureRecognizer()\n                    ..onTap = () {\n                      final dynIdStr = item.basic?.commentIdStr;\n                      final dynId = dynIdStr != null\n                          ? int.tryParse(dynIdStr)\n                          : null;\n                      showVoteDialog(context, int.parse(i.rid!), dynId);\n                    },\n                ),\n              );\n            break;\n          // 表情\n          case 'RICH_TEXT_NODE_TYPE_EMOJI' when (i.emoji != null):\n            final size = i.emoji!.size * 20.0;\n            spanChildren.add(\n              WidgetSpan(\n                child: NetworkImgLayer(\n                  src: i.emoji!.url,\n                  type: ImageType.emote,\n                  width: size,\n                  height: size,\n                ),\n              ),\n            );\n            break;\n          // 抽奖\n          case 'RICH_TEXT_NODE_TYPE_LOTTERY':\n            spanChildren\n              ..add(\n                WidgetSpan(\n                  alignment: PlaceholderAlignment.middle,\n                  child: Icon(\n                    Icons.redeem_rounded,\n                    size: 16,\n                    color: theme.colorScheme.primary,\n                  ),\n                ),\n              )\n              ..add(\n                TextSpan(\n                  text: '${i.origText} ',\n                  style: style,\n                  recognizer: NoDeadlineTapGestureRecognizer()\n                    ..onTap = () => Get.toNamed(\n                      '/webview',\n                      parameters: {\n                        'url':\n                            'https://www.bilibili.com/h5/lottery/result?business_id=${item.idStr}',\n                      },\n                    ),\n                ),\n              );\n            break;\n\n          case 'RICH_TEXT_NODE_TYPE_GOODS':\n            spanChildren\n              ..add(\n                WidgetSpan(\n                  alignment: PlaceholderAlignment.middle,\n                  child: Icon(\n                    Icons.shopping_bag_outlined,\n                    size: 16,\n                    color: theme.colorScheme.primary,\n                  ),\n                ),\n              )\n              ..add(\n                TextSpan(\n                  text: '${i.text} ',\n                  style: style,\n                  recognizer: i.jumpUrl == null\n                      ? null\n                      : (NoDeadlineTapGestureRecognizer()\n                          ..onTap = () => PageUtils.handleWebview(i.jumpUrl!)),\n                ),\n              );\n            break;\n          // 投稿\n          case 'RICH_TEXT_NODE_TYPE_BV':\n            spanChildren\n              ..add(\n                WidgetSpan(\n                  alignment: PlaceholderAlignment.middle,\n                  child: Icon(\n                    Icons.play_circle_outline_outlined,\n                    size: 16,\n                    color: theme.colorScheme.primary,\n                  ),\n                ),\n              )\n              ..add(\n                TextSpan(\n                  text: '${i.text} ',\n                  style: style,\n                  recognizer: NoDeadlineTapGestureRecognizer()\n                    ..onTap = () async {\n                      try {\n                        int? cid = await SearchHttp.ab2c(bvid: i.rid);\n                        if (cid != null) {\n                          PageUtils.toVideoPage(\n                            bvid: i.rid,\n                            cid: cid,\n                          );\n                        }\n                      } catch (err) {\n                        SmartDialog.showToast(err.toString());\n                      }\n                    },\n                ),\n              );\n            break;\n          case 'RICH_TEXT_NODE_TYPE_VIEW_PICTURE':\n            if (i.pics?.isNotEmpty == true) {\n              spanChildren\n                ..add(const TextSpan(text: '\\n'))\n                ..add(\n                  WidgetSpan(\n                    child: ImageGridView(\n                      fullScreen: true,\n                      picArr: i.pics!\n                          .map(\n                            (item) => ImageModel(\n                              url: item.src ?? '',\n                              width: item.width,\n                              height: item.height,\n                            ),\n                          )\n                          .toList(),\n                    ),\n                  ),\n                );\n            } else {\n              spanChildren.add(\n                TextSpan(\n                  text: i.text,\n                  style: style,\n                  recognizer: NoDeadlineTapGestureRecognizer()\n                    ..onTap = () {\n                      void onView(List<OpusPicModel> list) {\n                        PageUtils.imageView(\n                          imgList: list\n                              .map((e) => SourceModel(url: e.src!))\n                              .toList(),\n                        );\n                      }\n\n                      if (i.pics?.isNotEmpty == true) {\n                        onView(i.pics!);\n                        return;\n                      }\n                      if (i.dynPic?.isNotEmpty == true) {\n                        onView(i.dynPic!);\n                        return;\n                      }\n\n                      DynamicsHttp.dynPic(i.rid).then((res) {\n                        if (res case Success(:final response)) {\n                          if (Platform.isAndroid) {\n                            i.pics = response;\n                          } else {\n                            i.dynPic = response;\n                          }\n                          if (response != null && response.isNotEmpty) {\n                            onView(response);\n                          }\n                        } else {\n                          res.toast();\n                        }\n                      });\n                    },\n                ),\n              );\n            }\n            break;\n          case 'RICH_TEXT_NODE_TYPE_OGV_SEASON':\n            spanChildren\n              ..add(\n                WidgetSpan(\n                  alignment: PlaceholderAlignment.middle,\n                  child: Icon(\n                    Icons.play_circle_outline_outlined,\n                    size: 16,\n                    color: theme.colorScheme.primary,\n                  ),\n                ),\n              )\n              ..add(\n                TextSpan(\n                  text: i.text,\n                  style: style,\n                  recognizer: i.jumpUrl == null\n                      ? null\n                      : (NoDeadlineTapGestureRecognizer()\n                          ..onTap = () => PageUtils.handleWebview(i.jumpUrl!)),\n                ),\n              );\n            break;\n          default:\n            spanChildren.add(\n              TextSpan(\n                text: i.text,\n                style: style,\n                recognizer: i.jumpUrl == null\n                    ? null\n                    : (NoDeadlineTapGestureRecognizer()\n                        ..onTap = () => PageUtils.handleWebview(i.jumpUrl!)),\n              ),\n            );\n            break;\n        }\n      }\n      return TextSpan(children: spanChildren);\n    }\n  } catch (err) {\n    if (kDebugMode) debugPrint('❌rich_node_panel err: $err');\n    return null;\n  }\n}\n"
  },
  {
    "path": "lib/pages/dynamics/widgets/up_panel.dart",
    "content": "import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models/common/dynamic/up_panel_position.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models/dynamics/up.dart';\nimport 'package:PiliPlus/pages/dynamics/controller.dart';\nimport 'package:PiliPlus/pages/live_follow/view.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/feed_back.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass UpPanel extends StatefulWidget {\n  const UpPanel({\n    required this.dynamicsController,\n    super.key,\n  });\n\n  final DynamicsController dynamicsController;\n\n  @override\n  State<UpPanel> createState() => _UpPanelState();\n}\n\nclass _UpPanelState extends State<UpPanel> {\n  late final controller = widget.dynamicsController;\n  late final isTop = controller.upPanelPosition == UpPanelPosition.top;\n\n  void toFollowPage() => Get.to(const LiveFollowPage());\n\n  @override\n  Widget build(BuildContext context) {\n    final accountService = controller.accountService;\n    if (!accountService.isLogin.value) {\n      return const SizedBox.shrink();\n    }\n    final theme = Theme.of(context);\n    final upData = controller.upState.value.data;\n    final List<UpItem> upList = upData.upList;\n    final List<LiveUserItem>? liveList = upData.liveUsers?.items;\n    return CustomScrollView(\n      scrollDirection: isTop ? Axis.horizontal : Axis.vertical,\n      physics: const AlwaysScrollableScrollPhysics(),\n      controller: controller.scrollController,\n      slivers: [\n        SliverToBoxAdapter(\n          child: InkWell(\n            onTap: () => setState(() {\n              controller.showLiveUp = !controller.showLiveUp;\n            }),\n            onLongPress: toFollowPage,\n            onSecondaryTap: PlatformUtils.isMobile ? null : toFollowPage,\n            child: Container(\n              alignment: Alignment.center,\n              height: isTop ? 76 : 60,\n              padding: isTop ? const EdgeInsets.only(left: 12, right: 6) : null,\n              child: Text.rich(\n                textAlign: TextAlign.center,\n                style: TextStyle(\n                  fontSize: 13,\n                  color: theme.colorScheme.primary,\n                ),\n                TextSpan(\n                  children: [\n                    TextSpan(\n                      text: 'Live(${upData.liveUsers?.count ?? 0})',\n                    ),\n                    if (!isTop) ...[\n                      const TextSpan(text: '\\n'),\n                      WidgetSpan(\n                        alignment: PlaceholderAlignment.middle,\n                        child: Icon(\n                          controller.showLiveUp\n                              ? Icons.expand_less\n                              : Icons.expand_more,\n                          size: 12,\n                          color: theme.colorScheme.primary,\n                        ),\n                      ),\n                    ] else\n                      WidgetSpan(\n                        alignment: PlaceholderAlignment.middle,\n                        child: Icon(\n                          controller.showLiveUp\n                              ? Icons.keyboard_arrow_right\n                              : Icons.keyboard_arrow_left,\n                          color: theme.colorScheme.primary,\n                          size: 14,\n                        ),\n                      ),\n                  ],\n                ),\n              ),\n            ),\n          ),\n        ),\n        if (controller.showLiveUp && liveList != null && liveList.isNotEmpty)\n          SliverList.builder(\n            itemCount: liveList.length,\n            itemBuilder: (context, index) {\n              return upItemBuild(theme, liveList[index]);\n            },\n          ),\n        SliverToBoxAdapter(\n          child: upItemBuild(theme, UpItem(face: '', uname: '全部动态', mid: -1)),\n        ),\n        SliverToBoxAdapter(\n          child: Obx(\n            () => upItemBuild(\n              theme,\n              UpItem(\n                uname: '我',\n                face: accountService.face.value,\n                mid: Accounts.main.mid,\n              ),\n            ),\n          ),\n        ),\n        if (upList.isNotEmpty)\n          SliverList.builder(\n            itemCount: upList.length,\n            itemBuilder: (context, index) {\n              return upItemBuild(theme, upList[index]);\n            },\n          ),\n        if (!isTop) const SliverToBoxAdapter(child: SizedBox(height: 200)),\n      ],\n    );\n  }\n\n  void _onSelect(UpItem data) {\n    controller\n      ..currentMid = data.mid\n      ..onSelectUp(data.mid);\n\n    data.hasUpdate = false;\n\n    setState(() {});\n  }\n\n  Widget upItemBuild(ThemeData theme, UpItem data) {\n    final currentMid = controller.currentMid;\n    final isLive = data is LiveUserItem;\n    final isCurrent = isLive || currentMid == data.mid || currentMid == -1;\n\n    final isAll = data.mid == -1;\n    void toMemberPage() => Get.toNamed('/member?mid=${data.mid}');\n\n    Widget avatar;\n    if (isAll) {\n      avatar = DecoratedBox(\n        decoration: BoxDecoration(\n          shape: .circle,\n          border: Border.all(\n            width: 5,\n            color: const Color(0xFF5CB67B),\n          ),\n        ),\n        child: Image.asset(\n          width: 38,\n          height: 38,\n          cacheWidth: 38.cacheSize(context),\n          'assets/images/logo/logo.png',\n        ),\n      );\n    } else {\n      avatar = Padding(\n        padding: const EdgeInsets.symmetric(horizontal: 4),\n        child: NetworkImgLayer(\n          width: 38,\n          height: 38,\n          src: data.face,\n          type: ImageType.avatar,\n        ),\n      );\n      if (isLive) {\n        avatar = Stack(\n          clipBehavior: .none,\n          children: [\n            avatar,\n            Positioned(\n              top: isLive && !isTop ? -5 : 0,\n              right: -6,\n              child: Badge(\n                label: const Text(' Live '),\n                textColor: theme.colorScheme.onSecondaryContainer,\n                backgroundColor: theme.colorScheme.secondaryContainer\n                    .withValues(alpha: 0.75),\n              ),\n            ),\n          ],\n        );\n      } else if (data.hasUpdate ?? false) {\n        avatar = Stack(\n          clipBehavior: .none,\n          children: [\n            avatar,\n            Positioned(\n              top: 0,\n              right: 4,\n              child: Badge(\n                smallSize: 8,\n                backgroundColor: theme.colorScheme.primary,\n              ),\n            ),\n          ],\n        );\n      }\n    }\n\n    return SizedBox(\n      height: 76,\n      width: isTop ? 70 : null,\n      child: InkWell(\n        onTap: () {\n          feedBack();\n          if (isLive) {\n            PageUtils.toLiveRoom(data.roomId);\n          } else {\n            _onSelect(data);\n          }\n        },\n        // onDoubleTap: isLive ? () => _onSelect(data) : null,\n        onLongPress: !isAll ? toMemberPage : null,\n        onSecondaryTap: !isAll && !PlatformUtils.isMobile ? toMemberPage : null,\n        child: Opacity(\n          opacity: isCurrent ? 1 : 0.6,\n          child: Column(\n            spacing: 4,\n            mainAxisSize: MainAxisSize.min,\n            mainAxisAlignment: MainAxisAlignment.center,\n            children: [\n              avatar,\n              Padding(\n                padding: const EdgeInsets.symmetric(horizontal: 4),\n                child: Text(\n                  isTop ? '${data.uname}\\n' : data.uname!,\n                  maxLines: 2,\n                  textAlign: TextAlign.center,\n                  style: TextStyle(\n                    color: currentMid == data.mid\n                        ? theme.colorScheme.primary\n                        : theme.colorScheme.outline,\n                    height: 1.1,\n                    fontSize: 12.5,\n                  ),\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/dynamics/widgets/video_panel.dart",
    "content": "// 视频or合集\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models/dynamics/result.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\n\nWidget videoSeasonWidget(\n  BuildContext context, {\n  required int floor,\n  required ThemeData theme,\n  required DynamicItemModel item,\n  required bool isSave,\n  required bool isDetail,\n}) {\n  // type archive  ugcSeason\n  // archive 视频/显示发布人\n  // ugcSeason 合集/不显示发布人\n\n  DynamicArchiveModel? video = switch (item.type) {\n    'DYNAMIC_TYPE_AV' => item.modules.moduleDynamic?.major?.archive,\n    'DYNAMIC_TYPE_UGC_SEASON' => item.modules.moduleDynamic?.major?.ugcSeason,\n    'DYNAMIC_TYPE_PGC' ||\n    'DYNAMIC_TYPE_PGC_UNION' => item.modules.moduleDynamic?.major?.pgc,\n    'DYNAMIC_TYPE_COURSES_SEASON' => item.modules.moduleDynamic?.major?.courses,\n    _ => null,\n  };\n\n  if (video == null) {\n    return const SizedBox.shrink();\n  }\n\n  EdgeInsets padding;\n  if (floor == 1) {\n    padding = const EdgeInsets.symmetric(horizontal: 12);\n  } else {\n    padding = EdgeInsets.zero;\n  }\n  return Padding(\n    padding: padding,\n    child: Column(\n      spacing: 6,\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        if (video.cover case final cover?)\n          Stack(\n            clipBehavior: Clip.none,\n            children: [\n              LayoutBuilder(\n                builder: (context, constraints) => NetworkImgLayer(\n                  width: constraints.maxWidth,\n                  height: constraints.maxWidth / StyleString.aspectRatio,\n                  src: cover,\n                  quality: 40,\n                ),\n              ),\n              if (video.badge?.text case final badge?)\n                PBadge(\n                  text: badge,\n                  top: 8.0,\n                  right: 10.0,\n                  bottom: null,\n                  left: null,\n                  type: switch (badge) {\n                    '充电专属' => PBadgeType.error,\n                    _ => PBadgeType.primary,\n                  },\n                ),\n              Positioned(\n                left: 0,\n                right: 0,\n                bottom: 0,\n                child: Container(\n                  height: 70,\n                  alignment: Alignment.bottomLeft,\n                  padding: const EdgeInsets.fromLTRB(10, 0, 8, 8),\n                  decoration: const BoxDecoration(\n                    gradient: LinearGradient(\n                      begin: Alignment.topCenter,\n                      end: Alignment.bottomCenter,\n                      colors: [\n                        Colors.transparent,\n                        Colors.black54,\n                      ],\n                    ),\n                    borderRadius: BorderRadius.vertical(\n                      bottom: StyleString.imgRadius,\n                    ),\n                  ),\n                  child: DefaultTextStyle.merge(\n                    style: TextStyle(\n                      fontSize: theme.textTheme.labelMedium!.fontSize,\n                      color: Colors.white,\n                    ),\n                    child: Row(\n                      crossAxisAlignment: CrossAxisAlignment.end,\n                      children: [\n                        if (video.durationText case final durationText?) ...[\n                          DecoratedBox(\n                            decoration: const BoxDecoration(\n                              color: Colors.black45,\n                              borderRadius: BorderRadius.all(\n                                Radius.circular(4),\n                              ),\n                            ),\n                            child: Text(' $durationText '),\n                          ),\n                          const SizedBox(width: 6),\n                        ],\n                        if (video.stat case final stat?) ...[\n                          Text(\n                            '${NumUtils.numFormat(stat.play)}播放',\n                          ),\n                          const SizedBox(width: 6),\n                          Text(\n                            '${NumUtils.numFormat(stat.danmu)}弹幕',\n                          ),\n                        ],\n                        const Spacer(),\n                        Image.asset(\n                          'assets/images/play.png',\n                          width: 50,\n                          height: 50,\n                          cacheHeight: 50.cacheSize(context),\n                        ),\n                      ],\n                    ),\n                  ),\n                ),\n              ),\n            ],\n          ),\n        if (video.title case final title?)\n          Text(\n            title,\n            maxLines: isDetail ? null : 1,\n            style: const TextStyle(fontWeight: FontWeight.bold),\n            overflow: isDetail ? null : TextOverflow.ellipsis,\n          ),\n      ],\n    ),\n  );\n}\n"
  },
  {
    "path": "lib/pages/dynamics/widgets/vote.dart",
    "content": "import 'dart:async';\nimport 'dart:math';\n\nimport 'package:PiliPlus/common/widgets/avatars.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/dialog/report.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/http/dynamics.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models/dynamics/vote_model.dart';\nimport 'package:PiliPlus/models_new/followee_votes/vote.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\nimport 'package:get/get.dart';\n\nclass VotePanel extends StatefulWidget {\n  final VoteInfo voteInfo;\n  final FutureOr<LoadingState<VoteInfo>> Function(Set<int>, bool) onVote;\n\n  const VotePanel({\n    super.key,\n    required this.voteInfo,\n    required this.onVote,\n  });\n\n  @override\n  State<VotePanel> createState() => _VotePanelState();\n}\n\nclass _VotePanelState extends State<VotePanel> {\n  late bool anonymous = false;\n\n  late VoteInfo _voteInfo;\n  late final RxList<int> groupValue =\n      (_voteInfo.myVotes?.toList() ?? <int>[]).obs;\n  late var _percentage = _cnt2Percentage(_voteInfo.options);\n  late bool _enabled =\n      groupValue.isEmpty &&\n      _voteInfo.endTime! * 1000 > DateTime.now().millisecondsSinceEpoch;\n  late bool _showPercentage = !_enabled;\n  late final _maxCnt = _voteInfo.choiceCnt ?? _voteInfo.options.length;\n  final isLogin = Accounts.main.isLogin;\n  late final Rxn<List<FolloweeVote>> followeeVote = Rxn<List<FolloweeVote>>();\n\n  @override\n  void initState() {\n    super.initState();\n    _voteInfo = widget.voteInfo;\n    if (isLogin) {\n      DynamicsHttp.followeeVotes(voteId: _voteInfo.voteId).then((res) {\n        if (!mounted) return;\n        if (res case Success(:final response)) {\n          followeeVote.value = response;\n        }\n      });\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    final size = MediaQuery.sizeOf(context);\n    final usePortrait = size.width < 600 || size.shortestSide >= 600;\n    final right = [\n      Row(\n        mainAxisAlignment: MainAxisAlignment.spaceBetween,\n        children: [\n          Text(\n            _enabled\n                ? '投票选项'\n                : groupValue.isEmpty\n                ? '已结束'\n                : '已完成',\n          ),\n          if (_enabled) Obx(() => Text('${groupValue.length} / $_maxCnt')),\n        ],\n      ),\n      Flexible(\n        child: Padding(\n          padding: const EdgeInsets.symmetric(vertical: 6),\n          child: _voteInfo.type == 1\n              ? GridView.builder(\n                  shrinkWrap: true,\n                  padding: EdgeInsets.zero,\n                  itemCount: _voteInfo.options.length,\n                  gridDelegate: SliverGridDelegateWithExtentAndRatio(\n                    maxCrossAxisExtent: 100,\n                    mainAxisSpacing: 10,\n                    crossAxisSpacing: 10,\n                    mainAxisExtent: MediaQuery.textScalerOf(context).scale(50),\n                  ),\n                  itemBuilder: (context, index) =>\n                      _buildPicOptions(index, theme.colorScheme),\n                )\n              : ListView.separated(\n                  shrinkWrap: true,\n                  padding: EdgeInsets.zero,\n                  itemCount: _voteInfo.options.length,\n                  itemBuilder: (context, index) => _buildOptions(index),\n                  separatorBuilder: (context, index) =>\n                      const SizedBox(height: 6),\n                ),\n        ),\n      ),\n      if (_enabled) ...[\n        _checkBoxes,\n        Padding(\n          padding: const EdgeInsets.only(top: 8),\n          child: Obx(\n            () => OutlinedButton(\n              onPressed: groupValue.isNotEmpty\n                  ? () async {\n                      final res = await widget.onVote(\n                        groupValue.toSet(),\n                        anonymous,\n                      );\n                      if (!mounted) return;\n                      if (res case Success(:final response)) {\n                        _enabled = false;\n                        _showPercentage = true;\n                        _voteInfo = response;\n                        _percentage = _cnt2Percentage(_voteInfo.options);\n                        setState(() {});\n                      } else {\n                        res.toast();\n                      }\n                    }\n                  : null,\n              child: const Center(child: Text('投票')),\n            ),\n          ),\n        ),\n      ],\n    ];\n    Widget title = Text(\n      _voteInfo.title ?? '',\n      style: theme.textTheme.titleMedium,\n    );\n    if (isLogin) {\n      title = Row(\n        spacing: 3,\n        crossAxisAlignment: .start,\n        children: [\n          Expanded(child: title),\n          Obx(() {\n            final list = followeeVote.value;\n            if (list != null && list.isNotEmpty) {\n              return GestureDetector(\n                behavior: .opaque,\n                onTap: () {\n                  showDialog(\n                    context: context,\n                    builder: (context) {\n                      final colorScheme = ColorScheme.of(context);\n                      return AlertDialog(\n                        clipBehavior: .hardEdge,\n                        title: const Text('关注的人的投票'),\n                        contentPadding: const .only(top: 10, bottom: 12),\n                        content: SingleChildScrollView(\n                          child: Column(\n                            mainAxisSize: .min,\n                            children: list\n                                .map(\n                                  (e) => ListTile(\n                                    dense: true,\n                                    onTap: () =>\n                                        Get.toNamed('/member?mid=${e.mid}'),\n                                    leading: NetworkImgLayer(\n                                      src: e.face,\n                                      width: 40,\n                                      height: 40,\n                                      type: .avatar,\n                                    ),\n                                    title: Text.rich(\n                                      style: const TextStyle(fontSize: 13),\n                                      TextSpan(\n                                        children: [\n                                          TextSpan(text: e.name),\n                                          TextSpan(\n                                            text: ' 投给了',\n                                            style: TextStyle(\n                                              fontSize: 12,\n                                              color: colorScheme.outline,\n                                            ),\n                                          ),\n                                        ],\n                                      ),\n                                    ),\n                                    subtitle: Text(\n                                      style: const TextStyle(fontSize: 13),\n                                      e.votes\n                                          .map(\n                                            (vote) => _voteInfo.options\n                                                .firstWhereOrNull(\n                                                  (e) => e.optIdx == vote,\n                                                )\n                                                ?.optDesc,\n                                          )\n                                          .join('、'),\n                                    ),\n                                  ),\n                                )\n                                .toList(),\n                          ),\n                        ),\n                      );\n                    },\n                  );\n                },\n                child: Row(\n                  mainAxisSize: .min,\n                  children: [\n                    avatars(\n                      colorScheme: theme.colorScheme,\n                      users: list.take(3),\n                    ),\n                    Icon(\n                      size: 18,\n                      color: theme.colorScheme.outline.withValues(alpha: .7),\n                      Icons.keyboard_arrow_right,\n                    ),\n                  ],\n                ),\n              );\n            }\n            return const SizedBox.shrink();\n          }),\n        ],\n      );\n    }\n    Widget child = Column(\n      mainAxisSize: MainAxisSize.min,\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        title,\n        if (_voteInfo.desc != null)\n          Text(\n            _voteInfo.desc!,\n            style: theme.textTheme.titleSmall!.copyWith(\n              color: theme.colorScheme.onSurfaceVariant.withValues(alpha: 0.8),\n            ),\n          ),\n        Padding(\n          padding: const EdgeInsets.symmetric(vertical: 8),\n          child: Wrap(\n            spacing: 10,\n            runSpacing: 5,\n            children: [\n              Text(\n                '至 ${DateFormatUtils.format(_voteInfo.endTime, format: DateFormatUtils.longFormatDs)}',\n              ),\n              Text.rich(\n                TextSpan(\n                  children: [\n                    TextSpan(\n                      text: NumUtils.numFormat(_voteInfo.joinNum),\n                      style: TextStyle(color: theme.colorScheme.primary),\n                    ),\n                    const TextSpan(text: '人参与'),\n                  ],\n                ),\n              ),\n            ],\n          ),\n        ),\n        if (usePortrait) ...right,\n      ],\n    );\n    if (!usePortrait) {\n      child = Row(\n        spacing: 12,\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          Expanded(child: child),\n          Expanded(\n            child: Column(\n              mainAxisSize: MainAxisSize.min,\n              crossAxisAlignment: CrossAxisAlignment.start,\n              children: right,\n            ),\n          ),\n        ],\n      );\n    }\n    return child;\n  }\n\n  Widget get _checkBoxes => Row(\n    spacing: 16,\n    children: [\n      CheckBoxText(\n        text: '显示比例',\n        selected: _showPercentage,\n        onChanged: (value) {\n          setState(() {\n            _showPercentage = value;\n          });\n        },\n      ),\n      CheckBoxText(\n        text: '匿名',\n        selected: anonymous,\n        onChanged: (val) => anonymous = val,\n      ),\n    ],\n  );\n\n  Widget _buildPicOptions(int index, ColorScheme colorScheme) {\n    return Card(\n      clipBehavior: Clip.hardEdge,\n      shape: const RoundedRectangleBorder(\n        borderRadius: BorderRadius.all(Radius.circular(6)),\n      ),\n      child: Builder(\n        builder: (context) {\n          final opt = _voteInfo.options[index];\n          final selected = groupValue.contains(opt.optIdx);\n          return InkWell(\n            onTap: !_enabled\n                ? null\n                : () => _onSelected(context, !selected, opt.optIdx!),\n            child: Column(\n              spacing: 5,\n              crossAxisAlignment: CrossAxisAlignment.stretch,\n              children: [\n                Stack(\n                  clipBehavior: Clip.none,\n                  children: [\n                    AspectRatio(\n                      aspectRatio: 1,\n                      child: LayoutBuilder(\n                        builder: (context, constraints) => NetworkImgLayer(\n                          src: opt.imgUrl,\n                          width: constraints.maxWidth,\n                          height: constraints.maxHeight,\n                          type: .emote,\n                        ),\n                      ),\n                    ),\n                    if (_enabled || selected)\n                      Positioned(\n                        right: 4,\n                        top: 4,\n                        width: 20,\n                        height: 20,\n                        child: DecoratedBox(\n                          decoration: BoxDecoration(\n                            shape: BoxShape.circle,\n                            color: selected\n                                ? colorScheme.primaryContainer\n                                : null,\n                            border: selected\n                                ? null\n                                : Border.all(\n                                    color: colorScheme.primaryContainer,\n                                  ),\n                          ),\n                          child: selected\n                              ? Icon(\n                                  size: 15,\n                                  Icons.check_rounded,\n                                  color: colorScheme.onPrimaryContainer,\n                                )\n                              : null,\n                        ),\n                      ),\n                    if (_showPercentage) ...[\n                      Positioned(\n                        left: 0,\n                        right: 0,\n                        bottom: -1,\n                        child: LinearProgressIndicator(\n                          // ignore: deprecated_member_use\n                          year2023: true,\n                          value: _percentage[index],\n                        ),\n                      ),\n                      PBadge(\n                        right: 6,\n                        bottom: 8,\n                        type: PBadgeType.primary,\n                        padding: const EdgeInsets.symmetric(\n                          horizontal: 3,\n                          vertical: 1,\n                        ),\n                        text:\n                            '${(_percentage[index] * 100).toStringAsFixed(0)}%',\n                      ),\n                    ],\n                  ],\n                ),\n                Padding(\n                  padding: const EdgeInsets.symmetric(horizontal: 5),\n                  child: Text(\n                    opt.optDesc!,\n                    maxLines: 2,\n                    overflow: TextOverflow.ellipsis,\n                    style: const TextStyle(fontSize: 13),\n                  ),\n                ),\n              ],\n            ),\n          );\n        },\n      ),\n    );\n  }\n\n  Widget _buildOptions(int index) {\n    return Builder(\n      builder: (context) {\n        final opt = _voteInfo.options[index];\n        final selected = groupValue.contains(opt.optIdx);\n        return PercentageChip(\n          label: opt.optDesc!,\n          percentage: _showPercentage ? _percentage[index] : null,\n          selected: selected,\n          onSelected: !_enabled\n              ? null\n              : (value) => _onSelected(context, value, opt.optIdx!),\n        );\n      },\n    );\n  }\n\n  void _onSelected(BuildContext itemCtx, bool value, int optidx) {\n    final bool isMax = groupValue.length >= _maxCnt;\n    if (isMax && value && !groupValue.contains(optidx)) {\n      groupValue\n        ..removeAt(0)\n        ..add(optidx);\n      setState(() {});\n      return;\n    }\n\n    if (value) {\n      groupValue.add(optidx);\n    } else {\n      groupValue.remove(optidx);\n    }\n    (itemCtx as Element).markNeedsBuild();\n  }\n\n  static List<double> _cnt2Percentage(List<Option> options) {\n    final total = options.fold(0, (sum, opt) => sum + opt.cnt);\n    return total == 0\n        ? List<double>.filled(options.length, 0)\n        : options.map((i) => i.cnt / total).toList(growable: false);\n  }\n}\n\nclass PercentageChip extends StatelessWidget {\n  final String label;\n  final double? percentage;\n  final bool selected;\n  final ValueChanged<bool>? onSelected;\n\n  const PercentageChip({\n    super.key,\n    required this.label,\n    required this.selected,\n    required this.onSelected,\n    this.percentage,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    final colorScheme = Theme.of(context).colorScheme;\n    return ChoiceChip(\n      tooltip: label,\n      labelPadding: EdgeInsets.zero,\n      padding: EdgeInsets.zero,\n      showCheckmark: false,\n      clipBehavior: Clip.hardEdge,\n      label: Stack(\n        clipBehavior: Clip.none,\n        alignment: Alignment.center,\n        children: [\n          if (percentage != null)\n            Positioned.fill(\n              left: 0,\n              child: FractionallySizedBox(\n                alignment: Alignment.centerLeft,\n                widthFactor: percentage,\n                child: ColoredBox(\n                  color: selected\n                      ? colorScheme.inversePrimary\n                      : colorScheme.outlineVariant,\n                ),\n              ),\n            ),\n          Padding(\n            padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 10),\n            child: Row(\n              spacing: 8,\n              children: [\n                Expanded(\n                  child: Row(\n                    spacing: 4,\n                    mainAxisSize: MainAxisSize.min,\n                    children: [\n                      Flexible(\n                        child: Text(\n                          label,\n                          maxLines: 1,\n                          overflow: TextOverflow.ellipsis,\n                        ),\n                      ),\n                      if (selected)\n                        Icon(\n                          Icons.check_circle,\n                          size: 12,\n                          color: colorScheme.onPrimaryContainer,\n                        ),\n                    ],\n                  ),\n                ),\n                if (percentage != null)\n                  Text('${(percentage! * 100).toStringAsFixed(0)}%'),\n              ],\n            ),\n          ),\n        ],\n      ),\n      selected: selected,\n      onSelected: onSelected,\n    );\n  }\n}\n\nFuture<void> showVoteDialog(\n  BuildContext context,\n  int voteId, [\n  int? dynamicId,\n]) async {\n  final voteInfo = await DynamicsHttp.voteInfo(voteId);\n  if (context.mounted) {\n    if (voteInfo.isSuccess) {\n      showDialog(\n        context: context,\n        builder: (context) => Dialog(\n          constraints: const BoxConstraints(\n            minWidth: 280,\n            maxWidth: 625,\n          ),\n          child: Padding(\n            padding: const EdgeInsets.all(24),\n            child: VotePanel(\n              voteInfo: voteInfo.data,\n              onVote: (votes, anonymous) => DynamicsHttp.doVote(\n                voteId: voteId,\n                votes: votes.toList(),\n                anonymous: anonymous,\n                dynamicId: dynamicId,\n              ),\n            ),\n          ),\n        ),\n      );\n    } else {\n      voteInfo.toast();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/dynamics_create/view.dart",
    "content": "import 'dart:math' show max;\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/button/toolbar_icon_button.dart';\nimport 'package:PiliPlus/common/widgets/custom_icon.dart';\nimport 'package:PiliPlus/common/widgets/flutter/draggable_sheet/draggable_scrollable_sheet_dyn.dart'\n    as dyn_sheet;\nimport 'package:PiliPlus/common/widgets/flutter/text_field/controller.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text_field/text_field.dart';\nimport 'package:PiliPlus/common/widgets/pair.dart';\nimport 'package:PiliPlus/common/widgets/time_picker.dart';\nimport 'package:PiliPlus/http/dynamics.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/publish_panel_type.dart';\nimport 'package:PiliPlus/models/common/reply/reply_option_type.dart';\nimport 'package:PiliPlus/models/dynamics/result.dart' show PicModel;\nimport 'package:PiliPlus/models/dynamics/vote_model.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_reserve_info/data.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_topic_top/topic_item.dart';\nimport 'package:PiliPlus/pages/common/publish/common_rich_text_pub_page.dart';\nimport 'package:PiliPlus/pages/dynamics_create_reserve/view.dart';\nimport 'package:PiliPlus/pages/dynamics_create_vote/view.dart';\nimport 'package:PiliPlus/pages/dynamics_mention/controller.dart';\nimport 'package:PiliPlus/pages/dynamics_select_topic/controller.dart';\nimport 'package:PiliPlus/pages/dynamics_select_topic/view.dart';\nimport 'package:PiliPlus/pages/emote/controller.dart';\nimport 'package:PiliPlus/pages/emote/view.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/extension/context_ext.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:PiliPlus/utils/request_utils.dart';\nimport 'package:flutter/material.dart'\n    hide DraggableScrollableSheet, showTimePicker;\nimport 'package:flutter/services.dart' show LengthLimitingTextInputFormatter;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass CreateDynPanel extends CommonRichTextPubPage {\n  const CreateDynPanel({\n    super.key,\n    super.imageLengthLimit = 18,\n    super.items,\n    super.pics,\n    this.scrollController,\n    this.topic,\n    this.editConfig,\n    this.title,\n    this.isPrivate = false,\n    this.replyOption = .allow,\n    this.onSuccess,\n  });\n\n  final ScrollController? scrollController;\n  final String? title;\n  final Pair<int, String>? topic;\n  final bool isPrivate;\n  final ReplyOptionType replyOption;\n  final ({Object dynId, Object? repostDynId})? editConfig;\n  final VoidCallback? onSuccess;\n\n  @override\n  State<CreateDynPanel> createState() => _CreateDynPanelState();\n\n  static void onCreateDyn(\n    BuildContext context, {\n    String? title,\n    bool isPrivate = false,\n    ReplyOptionType replyOption = .allow,\n    List<RichTextItem>? items,\n    List<PicModel>? pics,\n    Pair<int, String>? topic,\n    ({Object dynId, Object? repostDynId})? editConfig,\n    VoidCallback? onSuccess,\n  }) => showModalBottomSheet(\n    context: context,\n    useSafeArea: true,\n    isScrollControlled: true,\n    builder: (context) => dyn_sheet.DraggableScrollableSheet(\n      snap: true,\n      expand: false,\n      initialChildSize: 1,\n      minChildSize: 0,\n      maxChildSize: 1,\n      snapSizes: const [1],\n      builder: (context, scrollController) => CreateDynPanel(\n        scrollController: scrollController,\n        title: title,\n        items: items,\n        pics: pics,\n        topic: topic,\n        isPrivate: isPrivate,\n        editConfig: editConfig,\n        replyOption: replyOption,\n        onSuccess: onSuccess,\n      ),\n    ),\n  );\n}\n\nclass _CreateDynPanelState extends CommonRichTextPubPageState<CreateDynPanel> {\n  late final bool _isEdit;\n  late final RxBool _isPrivate;\n  late final Rx<Pair<int, String>?> _topic;\n  late final Rx<ReplyOptionType> _replyOption;\n  late final TextEditingController _titleEditCtr;\n  late final Rx<DateTime?> _publishTime = Rx<DateTime?>(null);\n  final Rx<ReserveInfoData?> _reserveCard = Rx<ReserveInfoData?>(null);\n\n  @override\n  void initState() {\n    super.initState();\n    _isEdit = widget.editConfig != null;\n    _isPrivate = widget.isPrivate.obs;\n    _replyOption = widget.replyOption.obs;\n    _topic = Rx<Pair<int, String>?>(widget.topic);\n    _titleEditCtr = TextEditingController(text: widget.title);\n  }\n\n  @override\n  void dispose() {\n    _titleEditCtr.dispose();\n    Get\n      ..delete<EmotePanelController>()\n      ..delete<SelectTopicController>()\n      ..delete<DynMentionController>();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final ThemeData theme = Theme.of(context);\n    return Column(\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        _buildAppBar(theme),\n        Expanded(\n          child: ListView(\n            padding: EdgeInsets.zero,\n            controller: widget.scrollController,\n            physics: const ClampingScrollPhysics(),\n            children: [\n              Padding(\n                padding: const EdgeInsets.symmetric(horizontal: 16),\n                child: Obx(\n                  () {\n                    final hasTopic = _topic.value != null;\n                    return Row(\n                      spacing: 10,\n                      children: [\n                        TextButton(\n                          style: TextButton.styleFrom(\n                            overlayColor: hasTopic ? Colors.transparent : null,\n                            splashFactory: hasTopic\n                                ? NoSplash.splashFactory\n                                : null,\n                            shape: hasTopic\n                                ? null\n                                : RoundedRectangleBorder(\n                                    side: BorderSide(\n                                      color: hasTopic\n                                          ? Colors.transparent\n                                          : theme.colorScheme.outline\n                                                .withValues(alpha: 0.2),\n                                    ),\n                                    borderRadius: const BorderRadius.all(\n                                      Radius.circular(25),\n                                    ),\n                                  ),\n                            minimumSize: Size.zero,\n                            padding: hasTopic\n                                ? const EdgeInsets.symmetric(vertical: 12)\n                                : const EdgeInsets.all(12),\n                            visualDensity: VisualDensity.compact,\n                            tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n                          ),\n                          onPressed: _onSelectTopic,\n                          child: Text.rich(\n                            TextSpan(\n                              children: [\n                                WidgetSpan(\n                                  alignment: .middle,\n                                  child: Padding(\n                                    padding: const EdgeInsets.only(right: 5),\n                                    child: Icon(\n                                      CustomIcons.topic_tag,\n                                      size: 18,\n                                      color: hasTopic\n                                          ? null\n                                          : theme.colorScheme.outline,\n                                    ),\n                                  ),\n                                ),\n                                TextSpan(\n                                  text: hasTopic\n                                      ? _topic.value!.second\n                                      : '选择话题',\n                                  style: TextStyle(\n                                    color: hasTopic\n                                        ? null\n                                        : theme.colorScheme.outline,\n                                  ),\n                                ),\n                              ],\n                            ),\n                          ),\n                        ),\n                        if (hasTopic)\n                          iconButton(\n                            size: 22,\n                            iconSize: 16,\n                            icon: const Icon(Icons.clear),\n                            bgColor: theme.colorScheme.onInverseSurface,\n                            iconColor: theme.colorScheme.onSurfaceVariant,\n                            onPressed: () => _topic.value = null,\n                          ),\n                      ],\n                    );\n                  },\n                ),\n              ),\n              const SizedBox(height: 5),\n              Padding(\n                padding: const EdgeInsets.symmetric(horizontal: 16),\n                child: TextField(\n                  controller: _titleEditCtr,\n                  style: const TextStyle(fontWeight: FontWeight.bold),\n                  decoration: InputDecoration(\n                    hintText: '标题，选填20字',\n                    isDense: true,\n                    visualDensity: .standard,\n                    contentPadding: EdgeInsets.zero,\n                    border: const OutlineInputBorder(\n                      gapPadding: 0,\n                      borderSide: BorderSide.none,\n                    ),\n                    hintStyle: TextStyle(\n                      fontWeight: FontWeight.bold,\n                      color: theme.colorScheme.outline.withValues(alpha: 0.7),\n                    ),\n                  ),\n                  inputFormatters: [LengthLimitingTextInputFormatter(20)],\n                ),\n              ),\n              const SizedBox(height: 5),\n              Padding(\n                padding: const EdgeInsets.symmetric(horizontal: 16),\n                child: _buildEditWidget(theme),\n              ),\n              const SizedBox(height: 16),\n              _buildReserveItem(theme),\n              Padding(\n                padding: const EdgeInsets.symmetric(horizontal: 16),\n                child: Row(\n                  mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                  children: [\n                    Obx(() => _buildPubTimeWidget),\n                    Column(\n                      mainAxisSize: MainAxisSize.min,\n                      crossAxisAlignment: CrossAxisAlignment.start,\n                      children: [\n                        Obx(() => _buildReplyOptionWidget(theme)),\n                        const SizedBox(height: 5),\n                        Obx(() => _buildPrivateWidget(theme)),\n                      ],\n                    ),\n                  ],\n                ),\n              ),\n              const SizedBox(height: 10),\n              _buildImageList(theme),\n            ],\n          ),\n        ),\n        _buildToolbar,\n        buildPanelContainer(theme, Colors.transparent),\n      ],\n    );\n  }\n\n  Widget _buildImageList(ThemeData theme) => SizedBox(\n    height: 100,\n    child: Obx(\n      () => CustomScrollView(\n        scrollDirection: Axis.horizontal,\n        slivers: [\n          const SliverToBoxAdapter(child: SizedBox(width: 16)),\n          if (imageList.isNotEmpty)\n            SliverPadding(\n              padding: const .only(right: 10),\n              sliver: SliverList.separated(\n                itemCount: imageList.length,\n                itemBuilder: (context, index) => buildImage(index, 100),\n                separatorBuilder: (_, _) => const SizedBox(width: 10),\n              ),\n            ),\n          if (imageList.length != limit)\n            SliverToBoxAdapter(\n              child: Material(\n                borderRadius: StyleString.mdRadius,\n                child: InkWell(\n                  borderRadius: StyleString.mdRadius,\n                  onTap: () => onPickImage(() {\n                    if (imageList.isNotEmpty && !enablePublish.value) {\n                      enablePublish.value = true;\n                    }\n                  }),\n                  child: Ink(\n                    width: 100,\n                    height: 100,\n                    decoration: BoxDecoration(\n                      borderRadius: StyleString.mdRadius,\n                      color: theme.colorScheme.secondaryContainer,\n                    ),\n                    child: const Center(child: Icon(Icons.add, size: 35)),\n                  ),\n                ),\n              ),\n            ),\n          const SliverToBoxAdapter(child: SizedBox(width: 16)),\n        ],\n      ),\n    ),\n  );\n\n  Widget _buildAppBar(ThemeData theme) => Container(\n    height: 66,\n    padding: const EdgeInsets.all(16),\n    child: Stack(\n      clipBehavior: Clip.none,\n      children: [\n        Align(\n          alignment: Alignment.centerLeft,\n          child: SizedBox(\n            width: 34,\n            height: 34,\n            child: IconButton(\n              tooltip: '返回',\n              style: ButtonStyle(\n                padding: const WidgetStatePropertyAll(EdgeInsets.zero),\n                backgroundColor: WidgetStatePropertyAll(\n                  theme.colorScheme.secondaryContainer,\n                ),\n              ),\n              onPressed: Get.back,\n              icon: Icon(\n                Icons.arrow_back_outlined,\n                size: 18,\n                color: theme.colorScheme.onSecondaryContainer,\n              ),\n            ),\n          ),\n        ),\n        Center(\n          child: Text(\n            _isEdit ? '编辑动态' : '发布动态',\n            style: const TextStyle(fontSize: 15, fontWeight: FontWeight.bold),\n          ),\n        ),\n        Align(\n          alignment: Alignment.centerRight,\n          child: Obx(\n            () => FilledButton.tonal(\n              onPressed: enablePublish.value ? onPublish : null,\n              style: FilledButton.styleFrom(\n                tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n                padding: const EdgeInsets.symmetric(\n                  horizontal: 20,\n                  vertical: 10,\n                ),\n                visualDensity: VisualDensity.compact,\n              ),\n              child: Text(_publishTime.value == null ? '发布' : '定时发布'),\n            ),\n          ),\n        ),\n      ],\n    ),\n  );\n\n  Widget _buildPrivateWidget(ThemeData theme) {\n    final color = _isPrivate.value\n        ? theme.colorScheme.error\n        : theme.colorScheme.secondary;\n    return PopupMenuButton<bool>(\n      requestFocus: false,\n      initialValue: _isPrivate.value,\n      onSelected: (value) => _isPrivate.value = value,\n      itemBuilder: (context) => List.generate(\n        2,\n        (index) => PopupMenuItem<bool>(\n          enabled: _publishTime.value != null && index == 1 ? false : true,\n          value: index == 0 ? false : true,\n          child: Row(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              Icon(\n                size: 19,\n                index == 0 ? Icons.visibility : Icons.visibility_off,\n              ),\n              const SizedBox(width: 4),\n              Text(index == 0 ? '所有人可见' : '仅自己可见'),\n            ],\n          ),\n        ),\n      ),\n      child: Padding(\n        padding: const EdgeInsets.symmetric(vertical: 2),\n        child: Row(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            Icon(\n              size: 19,\n              _isPrivate.value ? Icons.visibility_off : Icons.visibility,\n              color: color,\n            ),\n            const SizedBox(width: 4),\n            Text(\n              _isPrivate.value ? '仅自己可见' : '所有人可见',\n              style: TextStyle(\n                height: 1,\n                color: color,\n              ),\n              strutStyle: const StrutStyle(leading: 0, height: 1),\n            ),\n            Icon(\n              size: 20,\n              Icons.keyboard_arrow_right,\n              color: color,\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget _buildReplyOptionWidget(ThemeData theme) {\n    final color = _replyOption.value == ReplyOptionType.close\n        ? theme.colorScheme.error\n        : theme.colorScheme.secondary;\n    return PopupMenuButton<ReplyOptionType>(\n      requestFocus: false,\n      initialValue: _replyOption.value,\n      onSelected: (item) => _replyOption.value = item,\n      itemBuilder: (context) => ReplyOptionType.values\n          .map(\n            (item) => PopupMenuItem<ReplyOptionType>(\n              value: item,\n              child: Row(\n                mainAxisSize: MainAxisSize.min,\n                children: [\n                  Icon(\n                    size: 19,\n                    item.iconData,\n                  ),\n                  const SizedBox(width: 4),\n                  Text(item.title),\n                ],\n              ),\n            ),\n          )\n          .toList(),\n      child: Padding(\n        padding: const EdgeInsets.symmetric(vertical: 2),\n        child: Row(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            Icon(\n              size: 19,\n              _replyOption.value.iconData,\n              color: color,\n            ),\n            const SizedBox(width: 4),\n            Text(\n              _replyOption.value.title,\n              style: TextStyle(\n                height: 1,\n                color: color,\n              ),\n              strutStyle: const StrutStyle(leading: 0, height: 1),\n            ),\n            Icon(\n              size: 20,\n              Icons.keyboard_arrow_right,\n              color: color,\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget get _buildPubTimeWidget => _publishTime.value == null\n      ? FilledButton.tonal(\n          style: FilledButton.styleFrom(\n            padding: const EdgeInsets.symmetric(\n              horizontal: 16,\n              vertical: 10,\n            ),\n            visualDensity: VisualDensity.compact,\n          ),\n          onPressed: _isEdit || _isPrivate.value\n              ? null\n              : () async {\n                  controller.keepChatPanel();\n                  DateTime nowDate = DateTime.now();\n                  final selectedDate = await showDatePicker(\n                    context: context,\n                    initialDate: nowDate,\n                    firstDate: nowDate,\n                    lastDate: DateTime(\n                      nowDate.year,\n                      nowDate.month,\n                      nowDate.day + 7,\n                    ),\n                  );\n                  if (selectedDate != null && mounted) {\n                    TimeOfDay nowTime = TimeOfDay.now();\n                    final selectedTime = await showTimePicker(\n                      context: context,\n                      initialTime: nowTime.replacing(\n                        hour: nowTime.minute + 6 >= 60\n                            ? (nowTime.hour + 1) % 24\n                            : nowTime.hour,\n                        minute: (nowTime.minute + 6) % 60,\n                      ),\n                    );\n                    if (selectedTime != null) {\n                      if (selectedDate.day == nowDate.day) {\n                        if (selectedTime.hour < nowTime.hour) {\n                          SmartDialog.showToast('时间设置错误，至少选择6分钟之后');\n                          return;\n                        } else if (selectedTime.hour == nowTime.hour) {\n                          if (selectedTime.minute < nowTime.minute + 6) {\n                            if (selectedDate.day == nowDate.day) {\n                              SmartDialog.showToast('时间设置错误，至少选择6分钟之后');\n                            }\n                            return;\n                          }\n                        }\n                      }\n                      _publishTime.value = DateTime(\n                        selectedDate.year,\n                        selectedDate.month,\n                        selectedDate.day,\n                        selectedTime.hour,\n                        selectedTime.minute,\n                      );\n                    }\n                  }\n                  controller.restoreChatPanel();\n                },\n          child: const Text('定时发布'),\n        )\n      : OutlinedButton.icon(\n          style: OutlinedButton.styleFrom(\n            padding: const EdgeInsets.symmetric(\n              horizontal: 16,\n              vertical: 10,\n            ),\n            visualDensity: VisualDensity.compact,\n          ),\n          onPressed: () => _publishTime.value = null,\n          label: Text(DateFormatUtils.longFormatD.format(_publishTime.value!)),\n          icon: const Icon(Icons.clear, size: 20),\n          iconAlignment: IconAlignment.end,\n        );\n\n  Widget get _buildToolbar => Padding(\n    padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),\n    child: Row(\n      spacing: 16,\n      children: [\n        emojiBtn,\n        atBtn,\n        if (!_isEdit) ...[\n          voteBtn,\n          moreBtn,\n        ],\n        // if (kDebugMode)\n        //   ToolbarIconButton(\n        //     onPressed: editController.clear,\n        //     icon: const Icon(Icons.clear, size: 22),\n        //     selected: false,\n        //   ),\n      ],\n    ),\n  );\n\n  @override\n  Widget buildMorePanel(ThemeData theme) {\n    double height = context.isTablet ? 300 : 170;\n    final keyboardHeight = controller.keyboardHeight;\n    if (keyboardHeight != 0) {\n      height = max(height, keyboardHeight);\n    }\n\n    Widget item({\n      required VoidCallback onTap,\n      required Icon icon,\n      required String title,\n    }) {\n      return GestureDetector(\n        onTap: onTap,\n        child: Column(\n          spacing: 5,\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            AspectRatio(\n              aspectRatio: 1,\n              child: Container(\n                decoration: BoxDecoration(\n                  color: theme.colorScheme.onInverseSurface,\n                  borderRadius: const BorderRadius.all(Radius.circular(6)),\n                ),\n                alignment: Alignment.center,\n                child: icon,\n              ),\n            ),\n            Text(\n              title,\n              maxLines: 1,\n              style: const TextStyle(fontSize: 13),\n            ),\n          ],\n        ),\n      );\n    }\n\n    final color = theme.colorScheme.onSurfaceVariant;\n\n    return SizedBox(\n      height: height,\n      child: GridView(\n        physics: const ClampingScrollPhysics(),\n        padding: const EdgeInsets.only(left: 12, bottom: 12, right: 12),\n        gridDelegate: SliverGridDelegateWithExtentAndRatio(\n          maxCrossAxisExtent: 65,\n          mainAxisSpacing: 12,\n          crossAxisSpacing: 12,\n          mainAxisExtent: 25,\n        ),\n        children: [\n          item(\n            onTap: _onReserve,\n            icon: Icon(CustomIcons.live_reserve, size: 28, color: color),\n            title: '直播预约',\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget get voteBtn => ToolbarIconButton(\n    onPressed: () async {\n      controller.keepChatPanel();\n      RichTextItem? voteItem = editController.items.firstWhereOrNull(\n        (e) => e.type == RichTextType.vote,\n      );\n      final VoteInfo? voteInfo = await Navigator.of(context).push(\n        GetPageRoute(\n          page: () => CreateVotePage(\n            voteId: voteItem?.id == null ? null : int.parse(voteItem!.id!),\n          ),\n        ),\n      );\n      if (voteInfo != null) {\n        if (voteItem != null) {\n          final range = voteItem.range;\n          final text = ' ${voteInfo.title} ';\n          final selection = TextSelection.collapsed(\n            offset: range.start + text.length,\n          );\n          final delta = RichTextEditingDeltaReplacement(\n            oldText: editController.text,\n            replacementText: text,\n            replacedRange: range,\n            selection: selection,\n            composing: TextRange.empty,\n            type: RichTextType.vote,\n            id: voteInfo.voteId.toString(),\n            rawText: voteInfo.title,\n          );\n          final newValue = delta.apply(editController.value);\n          editController\n            ..syncRichText(delta)\n            ..value = newValue;\n        } else {\n          onInsertText(\n            '我发起了一个投票',\n            RichTextType.text,\n          );\n          onInsertText(\n            ' ${voteInfo.title} ',\n            RichTextType.vote,\n            rawText: voteInfo.title,\n            id: voteInfo.voteId.toString(),\n          );\n        }\n      }\n      controller.restoreChatPanel();\n    },\n    icon: const Icon(Icons.bar_chart_rounded, size: 24),\n    tooltip: '投票',\n    selected: false,\n  );\n\n  Widget _buildEditWidget(ThemeData theme) => Listener(\n    onPointerUp: (event) {\n      if (readOnly.value) {\n        updatePanelType(PanelType.keyboard);\n      }\n    },\n    child: Obx(\n      () => RichTextField(\n        key: key,\n        controller: editController,\n        minLines: 4,\n        maxLines: null,\n        focusNode: focusNode,\n        readOnly: readOnly.value,\n        onChanged: onChanged,\n        onSubmitted: onSubmitted,\n        decoration: InputDecoration(\n          hintText: '说点什么吧',\n          visualDensity: .standard,\n          hintStyle: TextStyle(color: theme.colorScheme.outline),\n          border: const OutlineInputBorder(\n            borderSide: BorderSide.none,\n            gapPadding: 0,\n          ),\n          contentPadding: EdgeInsets.zero,\n        ),\n        // inputFormatters: [LengthLimitingTextInputFormatter(1000)],\n      ),\n    ),\n  );\n\n  @override\n  Widget? get customPanel => EmotePanel(onChoose: onChooseEmote);\n\n  @override\n  Future<void> onCustomPublish({List? pictures}) async {\n    SmartDialog.showLoading(msg: '正在发布');\n    List<Map<String, dynamic>>? extraContent = getRichContent();\n    final hasRichText = extraContent != null;\n\n    if (_isEdit) {\n      final editConfig = widget.editConfig!;\n      final res = await DynamicsHttp.editDyn(\n        dynId: editConfig.dynId,\n        repostDynId: editConfig.repostDynId,\n        rawText: hasRichText ? null : editController.text,\n        pics: pictures,\n        replyOption: _replyOption.value,\n        privatePub: _isPrivate.value ? 1 : null,\n        title: _titleEditCtr.text,\n        topic: _topic.value,\n        extraContent: extraContent,\n      );\n      SmartDialog.dismiss();\n      if (res.isSuccess) {\n        hasPub = true;\n        Get.back();\n        SmartDialog.showToast('发布成功');\n        widget.onSuccess?.call();\n      } else {\n        res.toast();\n      }\n      return;\n    }\n\n    final reserveCard = _reserveCard.value;\n    final res = await DynamicsHttp.createDynamic(\n      mid: Accounts.main.mid,\n      rawText: hasRichText ? null : editController.text,\n      pics: pictures,\n      publishTime: _publishTime.value != null\n          ? _publishTime.value!.millisecondsSinceEpoch ~/ 1000\n          : null,\n      replyOption: _replyOption.value,\n      privatePub: _isPrivate.value ? 1 : null,\n      title: _titleEditCtr.text,\n      topic: _topic.value,\n      extraContent: extraContent,\n      attachCard: reserveCard == null\n          ? null\n          : {\n              \"common_card\": {\n                \"type\": 14,\n                \"biz_id\": reserveCard.id,\n                \"reserve_source\": 0,\n                \"reserve_lottery\": 0,\n              },\n            },\n    );\n    SmartDialog.dismiss();\n    if (res case Success(:final response)) {\n      hasPub = true;\n      Get.back();\n      SmartDialog.showToast('发布成功');\n      final id = response?['dyn_id'];\n      RequestUtils.insertCreatedDyn(id);\n      if (!_isPrivate.value) {\n        RequestUtils.checkCreatedDyn(\n          id: id,\n          dynText: editController.rawText,\n        );\n      }\n    } else {\n      res.toast();\n    }\n  }\n\n  double _topicOffset = 0;\n  Future<void> _onSelectTopic() async {\n    controller.keepChatPanel();\n    TopicItem? res = await SelectTopicPanel.onSelectTopic(\n      context,\n      offset: _topicOffset,\n      onCachePos: (offset) => _topicOffset = offset,\n    );\n    if (res != null) {\n      _topic.value = Pair(first: res.id, second: res.name);\n    }\n    controller.restoreChatPanel();\n  }\n\n  @override\n  void onSave() {}\n\n  Widget _buildReserveItem(ThemeData theme) {\n    return Obx(\n      () {\n        final reserveCard = _reserveCard.value;\n        if (reserveCard == null) {\n          return const SizedBox.shrink();\n        }\n        return Stack(\n          clipBehavior: Clip.none,\n          children: [\n            GestureDetector(\n              onTap: _onReserve,\n              behavior: HitTestBehavior.opaque,\n              child: Container(\n                decoration: BoxDecoration(\n                  borderRadius: const BorderRadius.all(Radius.circular(8)),\n                  color: theme.colorScheme.onInverseSurface,\n                ),\n                margin: const EdgeInsets.only(left: 16, right: 16, bottom: 10),\n                padding: const EdgeInsets.fromLTRB(12, 12, 30, 12),\n                child: Column(\n                  spacing: 3,\n                  crossAxisAlignment: CrossAxisAlignment.stretch,\n                  children: [\n                    Text('直播预约: ${reserveCard.title}'),\n                    Text(\n                      '${DateFormatUtils.longFormatD.format(\n                        DateTime.fromMillisecondsSinceEpoch(reserveCard.livePlanStartTime! * 1000),\n                      )} 直播',\n                    ),\n                  ],\n                ),\n              ),\n            ),\n            Positioned(\n              right: 18,\n              top: 2,\n              child: iconButton(\n                size: 30,\n                iconSize: 18,\n                icon: const Icon(Icons.clear),\n                onPressed: () => _reserveCard.value = null,\n                iconColor: theme.colorScheme.onSurfaceVariant,\n              ),\n            ),\n          ],\n        );\n      },\n    );\n  }\n\n  Future<void> _onReserve() async {\n    controller.keepChatPanel();\n    final ReserveInfoData? reserveInfo = await Navigator.of(context).push(\n      GetPageRoute(\n        page: () => CreateReservePage(sid: _reserveCard.value?.id),\n      ),\n    );\n    if (reserveInfo != null) {\n      _reserveCard.value = reserveInfo;\n    }\n    controller.restoreChatPanel();\n  }\n}\n"
  },
  {
    "path": "lib/pages/dynamics_create_reserve/controller.dart",
    "content": "import 'package:PiliPlus/http/dynamics.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_reserve_info/data.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:get/get.dart';\n\nclass CreateReserveController extends GetxController {\n  CreateReserveController(this.sid);\n  final int? sid;\n  final RxInt subType = 0.obs;\n  String key = Utils.generateRandomString(6);\n  final RxString title = ''.obs;\n  final now = DateTime.now();\n  late final Rx<DateTime> date;\n  late final end = now.copyWith(day: now.day + 90);\n  final RxBool canCreate = false.obs;\n\n  @override\n  void onInit() {\n    super.onInit();\n    date = DateTime(now.year, now.month, now.day + 1, 20, 0).obs;\n    if (sid != null) {\n      queryData();\n    }\n  }\n\n  void updateCanCreate() {\n    canCreate.value = title.value.trim().isNotEmpty;\n  }\n\n  Future<void> queryData() async {\n    final res = await DynamicsHttp.reserveInfo(sid: sid);\n    if (res case Success(:final response)) {\n      key = Utils.generateRandomString(6);\n      title.value = response.title!;\n      date.value = DateTime.fromMillisecondsSinceEpoch(\n        response.livePlanStartTime! * 1000,\n      );\n      canCreate.value = true;\n    } else {\n      res.toast();\n    }\n  }\n\n  Future<void> onCreate() async {\n    final livePlanStartTime = date.value.millisecondsSinceEpoch ~/ 1000;\n    final res = sid == null\n        ? await DynamicsHttp.createReserve(\n            title: title.value,\n            subType: subType.value,\n            livePlanStartTime: livePlanStartTime,\n          )\n        : await DynamicsHttp.updateReserve(\n            sid: sid!,\n            subType: subType.value,\n            title: title.value,\n            livePlanStartTime: livePlanStartTime,\n          );\n    if (res case Success(:final response)) {\n      Get.back(\n        result: ReserveInfoData(\n          id: response,\n          title: title.value,\n          livePlanStartTime: livePlanStartTime,\n        ),\n      );\n    } else {\n      res.toast();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/dynamics_create_reserve/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/time_picker.dart';\nimport 'package:PiliPlus/pages/dynamics_create_reserve/controller.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart' hide showTimePicker;\nimport 'package:flutter/services.dart'\n    show TextInputFormatter, LengthLimitingTextInputFormatter;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass CreateReservePage extends StatefulWidget {\n  const CreateReservePage({super.key, this.sid});\n\n  final int? sid;\n\n  @override\n  State<CreateReservePage> createState() => _CreateReservePageState();\n}\n\nclass _CreateReservePageState extends State<CreateReservePage> {\n  late final CreateReserveController _controller;\n  late TextStyle _leadingStyle;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = Get.put(\n      CreateReserveController(widget.sid),\n      tag: Utils.generateRandomString(6),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    _leadingStyle = TextStyle(\n      fontSize: 15,\n      color: theme.colorScheme.onSurfaceVariant.withValues(alpha: 0.9),\n    );\n    final padding = MediaQuery.viewPaddingOf(context);\n    final divider = [\n      const SizedBox(height: 10),\n      Divider(\n        height: 1,\n        color: theme.colorScheme.outline.withValues(alpha: 0.1),\n      ),\n      const SizedBox(height: 10),\n    ];\n    return Scaffold(\n      appBar: AppBar(title: const Text('添加直播预约')),\n      body: ListView(\n        padding: EdgeInsets.only(\n          top: 16,\n          left: padding.left + 16,\n          right: padding.right + 16,\n          bottom: padding.bottom + 100,\n        ),\n        children: [\n          Row(\n            spacing: 12,\n            children: [\n              SizedBox(\n                width: 65,\n                child: Text('类型', style: _leadingStyle),\n              ),\n              Obx(\n                () => PopupMenuButton(\n                  requestFocus: false,\n                  initialValue: _controller.subType.value,\n                  onSelected: (value) => _controller.subType.value = value,\n                  itemBuilder: (context) {\n                    return const [\n                      PopupMenuItem(\n                        value: 0,\n                        child: Text('公开直播'),\n                      ),\n                      PopupMenuItem(\n                        value: 1,\n                        child: Text('大航海直播'),\n                      ),\n                    ];\n                  },\n                  child: Text(\n                    _controller.subType.value == 0 ? '公开直播' : '大航海直播',\n                  ),\n                ),\n              ),\n            ],\n          ),\n          ...divider,\n          Row(\n            spacing: 12,\n            children: [\n              SizedBox(\n                width: 65,\n                child: Text('时间', style: _leadingStyle),\n              ),\n              Expanded(\n                child: GestureDetector(\n                  behavior: HitTestBehavior.opaque,\n                  onTap: () async {\n                    FocusManager.instance.primaryFocus?.unfocus();\n                    DateTime? newDate = await showDatePicker(\n                      context: context,\n                      initialDate: _controller.date.value,\n                      firstDate: _controller.now,\n                      lastDate: _controller.end,\n                    );\n                    if (newDate != null && context.mounted) {\n                      TimeOfDay? newTime = await showTimePicker(\n                        context: context,\n                        initialTime: TimeOfDay.fromDateTime(\n                          _controller.date.value,\n                        ),\n                      );\n                      if (newTime != null) {\n                        final newEndtime = DateTime(\n                          newDate.year,\n                          newDate.month,\n                          newDate.day,\n                          newTime.hour,\n                          newTime.minute,\n                        );\n                        if (newEndtime.difference(DateTime.now()) >=\n                            const Duration(minutes: 5)) {\n                          _controller.date.value = newEndtime;\n                        } else {\n                          SmartDialog.showToast('至少选择5分钟之后');\n                        }\n                      }\n                    }\n                  },\n                  child: Padding(\n                    padding: const EdgeInsets.symmetric(vertical: 4),\n                    child: Obx(\n                      () => Text(\n                        DateFormatUtils.longFormatD.format(\n                          _controller.date.value,\n                        ),\n                      ),\n                    ),\n                  ),\n                ),\n              ),\n            ],\n          ),\n          ...divider,\n          Obx(\n            () => _buildInput(\n              theme,\n              key: ValueKey(_controller.key),\n              initialValue: _controller.title.value,\n              onChanged: (value) => _controller\n                ..title.value = value\n                ..updateCanCreate(),\n              desc: '标题',\n              hintText: '请填写标题，最多14字',\n              inputFormatters: [LengthLimitingTextInputFormatter(14)],\n            ),\n          ),\n          ...divider,\n          const SizedBox(height: 25),\n          Obx(() {\n            return FilledButton.tonal(\n              onPressed: _controller.canCreate.value\n                  ? _controller.onCreate\n                  : null,\n              child: const Text('添加预约'),\n            );\n          }),\n        ],\n      ),\n    );\n  }\n\n  Widget _buildInput(\n    ThemeData theme, {\n    Key? key,\n    String? initialValue,\n    required ValueChanged<String> onChanged,\n    required String desc,\n    String? hintText,\n    List<TextInputFormatter>? inputFormatters,\n  }) {\n    return Row(\n      spacing: 12,\n      children: [\n        SizedBox(\n          width: 65,\n          child: Text(\n            desc,\n            style: _leadingStyle,\n          ),\n        ),\n        Expanded(\n          child: TextFormField(\n            key: key,\n            initialValue: initialValue,\n            onChanged: onChanged,\n            decoration: InputDecoration(\n              isDense: true,\n              border: InputBorder.none,\n              contentPadding: EdgeInsets.zero,\n              hintText: hintText ?? desc,\n              hintStyle: TextStyle(\n                fontSize: 15,\n                color: theme.colorScheme.outline.withValues(alpha: 0.7),\n              ),\n            ),\n            inputFormatters: inputFormatters,\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/dynamics_create_vote/controller.dart",
    "content": "import 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/http/dynamics.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/msg.dart';\nimport 'package:PiliPlus/models/dynamics/vote_model.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:get/get.dart';\n\nclass CreateVoteController extends GetxController {\n  CreateVoteController(this.voteId);\n  final int? voteId;\n\n  String key = Utils.generateRandomString(6);\n  final RxString title = ''.obs;\n  final RxString desc = ''.obs;\n  final RxInt type = 0.obs;\n  final RxList<Option> options = <Option>[\n    Option(optDesc: '', imgUrl: ''),\n    Option(optDesc: '', imgUrl: ''),\n  ].obs;\n  final RxInt choiceCnt = 1.obs;\n  final now = DateTime.now();\n  late final end = now.copyWith(day: now.day + 90);\n  late Rx<DateTime> endtime;\n  final RxBool canCreate = false.obs;\n\n  void updateCanCreate() {\n    if (type.value == 0) {\n      canCreate.value =\n          title.value.isNotEmpty &&\n          options.every((e) => e.optDesc?.isNotEmpty == true);\n    } else {\n      canCreate.value =\n          title.value.isNotEmpty &&\n          options.every(\n            (e) =>\n                e.optDesc?.isNotEmpty == true && e.imgUrl?.isNotEmpty == true,\n          );\n    }\n  }\n\n  @override\n  void onInit() {\n    super.onInit();\n    endtime = DateTime(\n      now.year,\n      now.month,\n      now.day + 1,\n      now.hour,\n      now.minute,\n    ).obs;\n    if (voteId != null) {\n      queryData();\n    }\n  }\n\n  Future<void> queryData() async {\n    final res = await DynamicsHttp.voteInfo(voteId);\n    if (res case Success(:final response)) {\n      key = Utils.generateRandomString(6);\n      title.value = response.title!;\n      desc.value = response.desc ?? '';\n      type.value = response.options.first.imgUrl?.isNotEmpty == true ? 1 : 0;\n      options.value = response.options;\n      choiceCnt.value = response.choiceCnt!;\n      endtime.value = DateTime.fromMillisecondsSinceEpoch(\n        response.endTime! * 1000,\n      );\n      canCreate.value = true;\n    } else {\n      showConfirmDialog(\n        context: Get.context!,\n        title: res.toString(),\n        onConfirm: Get.back,\n      );\n    }\n  }\n\n  void onDel(int i) {\n    options.removeAt(i);\n    updateCanCreate();\n    if (choiceCnt.value > options.length) {\n      choiceCnt.value = options.length;\n    }\n  }\n\n  Future<void> onCreate() async {\n    final voteInfo = VoteInfo(\n      title: title.value,\n      desc: desc.value,\n      type: type.value,\n      duration: endtime.value.difference(now).inSeconds,\n      options: options,\n      onlyFansLevel: 0,\n      choiceCnt: choiceCnt.value,\n      votePublisher: Accounts.main.mid,\n      voteId: voteId,\n    );\n    final res = await (voteId == null\n        ? DynamicsHttp.createVote(voteInfo)\n        : DynamicsHttp.updateVote(voteInfo));\n    if (res case Success(:final response)) {\n      voteInfo.voteId = response;\n      Get.back(result: voteInfo);\n    } else {\n      res.toast();\n    }\n  }\n\n  Future<void> onUpload(int index, String path) async {\n    final res = await MsgHttp.uploadBfs(\n      path: path,\n      category: 'daily',\n      biz: 'vote',\n    );\n    if (res case Success(:final response)) {\n      options\n        ..[index].imgUrl = response.imageUrl\n        ..refresh();\n      updateCanCreate();\n    } else {\n      res.toast();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/dynamics_create_vote/view.dart",
    "content": "import 'dart:io' show File;\n\nimport 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/time_picker.dart';\nimport 'package:PiliPlus/models/dynamics/vote_model.dart';\nimport 'package:PiliPlus/pages/dynamics_create_vote/controller.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/extension/file_ext.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:easy_debounce/easy_throttle.dart';\nimport 'package:flutter/material.dart' hide showTimePicker;\nimport 'package:flutter/services.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:image_picker/image_picker.dart';\n\nclass CreateVotePage extends StatefulWidget {\n  const CreateVotePage({super.key, this.voteId});\n\n  final int? voteId;\n\n  @override\n  State<CreateVotePage> createState() => _CreateVotePageState();\n}\n\nclass _CreateVotePageState extends State<CreateVotePage> {\n  late final CreateVoteController _controller;\n  late final imagePicker = ImagePicker();\n\n  late TextStyle _leadingStyle;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = Get.put(\n      CreateVoteController(widget.voteId),\n      tag: Utils.generateRandomString(8),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    _leadingStyle = TextStyle(\n      fontSize: 15,\n      color: theme.colorScheme.onSurfaceVariant.withValues(alpha: 0.9),\n    );\n    final padding = MediaQuery.viewPaddingOf(context);\n    final divider = Divider(\n      height: 20,\n      thickness: 1,\n      color: theme.colorScheme.outline.withValues(alpha: 0.1),\n    );\n    return Scaffold(\n      appBar: AppBar(\n        title: Text('${_controller.voteId != null ? '' : '发起'}投票'),\n      ),\n      body: ListView(\n        padding: EdgeInsets.only(\n          left: padding.left + 16,\n          right: padding.right + 16,\n          bottom: padding.bottom + 100,\n        ),\n        children: [\n          const Text(\n            '投票类型',\n            style: TextStyle(fontSize: 14),\n          ),\n          const SizedBox(height: 12),\n          _buildType(theme),\n          const SizedBox(height: 40),\n          Obx(\n            () => _buildInput(\n              theme,\n              key: ValueKey('${_controller.key}title'),\n              initialValue: _controller.title.value,\n              onChanged: (value) => _controller\n                ..title.value = value\n                ..updateCanCreate(),\n              desc: '投票标题',\n              hintText: '请填写标题',\n              inputFormatters: [LengthLimitingTextInputFormatter(32)],\n            ),\n          ),\n          divider,\n          Obx(\n            () => _buildInput(\n              theme,\n              key: ValueKey('${_controller.key}desc'),\n              initialValue: _controller.desc.value,\n              onChanged: (value) => _controller.desc.value = value,\n              desc: '投票说明',\n              inputFormatters: [LengthLimitingTextInputFormatter(100)],\n            ),\n          ),\n          divider,\n          const SizedBox(height: 40),\n          Obx(\n            () {\n              final showImg = _controller.type.value == 1;\n              final showDel = _controller.options.length > 2;\n              List<Widget> children = [];\n              for (int i = 0; i < _controller.options.length; i++) {\n                final e = _controller.options[i];\n                children\n                  ..add(\n                    _buildInput(\n                      theme,\n                      key: ObjectKey(e),\n                      showDel: showDel,\n                      onDel: () {\n                        FocusManager.instance.primaryFocus?.unfocus();\n                        _controller.onDel(i);\n                      },\n                      showImg: showImg,\n                      imgUrl: e.imgUrl,\n                      onPickImg: () => EasyThrottle.throttle(\n                        'picImg',\n                        const Duration(milliseconds: 500),\n                        () => _onPickImg(i),\n                      ),\n                      initialValue: e.optDesc,\n                      onChanged: (value) => _controller\n                        ..options[i].optDesc = value\n                        ..updateCanCreate(),\n                      desc: '选项${i + 1}',\n                      hintText: '选项内容，最多20字',\n                      inputFormatters: [LengthLimitingTextInputFormatter(20)],\n                    ),\n                  )\n                  ..add(divider);\n              }\n              return Column(\n                mainAxisSize: MainAxisSize.min,\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  ...children,\n                  if (_controller.options.length < 20)\n                    FilledButton(\n                      onPressed: () => _controller\n                        ..options.add(Option(optDesc: '', imgUrl: ''))\n                        ..updateCanCreate(),\n                      style: FilledButton.styleFrom(\n                        minimumSize: Size.zero,\n                        padding: const EdgeInsets.only(\n                          left: 10,\n                          right: 14,\n                          top: 4,\n                          bottom: 4,\n                        ),\n                        visualDensity: .standard,\n                        tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n                        foregroundColor: theme.colorScheme.onSurfaceVariant,\n                        backgroundColor: theme.colorScheme.onInverseSurface,\n                      ),\n                      child: const Row(\n                        mainAxisSize: MainAxisSize.min,\n                        children: [\n                          Icon(Icons.add, size: 16),\n                          Text(\n                            ' 添加选项',\n                            style: TextStyle(fontSize: 13),\n                          ),\n                        ],\n                      ),\n                    ),\n                ],\n              );\n            },\n          ),\n          const SizedBox(height: 40),\n          Row(\n            spacing: 12,\n            children: [\n              SizedBox(\n                width: 100,\n                child: Text('单选/多选', style: _leadingStyle),\n              ),\n              Obx(() {\n                final choiceCnt = _controller.choiceCnt.value;\n                final choices = List.generate(\n                  _controller.options.length,\n                  (i) => i + 1,\n                );\n                return Listener(\n                  onPointerDown: (_) =>\n                      FocusManager.instance.primaryFocus?.unfocus(),\n                  child: PopupMenuButton<int>(\n                    initialValue: choiceCnt,\n                    requestFocus: false,\n                    child: Text(\n                      choiceCnt == 1 ? '单选         ' : '最多选$choiceCnt项',\n                    ),\n                    onSelected: (value) => _controller.choiceCnt.value = value,\n                    itemBuilder: (context) {\n                      return choices\n                          .map(\n                            (e) => PopupMenuItem(\n                              value: e,\n                              child: Text(e == 1 ? '单选' : '最多选$e项'),\n                            ),\n                          )\n                          .toList();\n                    },\n                  ),\n                );\n              }),\n            ],\n          ),\n          const SizedBox(height: 4),\n          divider,\n          Row(\n            spacing: 12,\n            children: [\n              SizedBox(\n                width: 100,\n                child: Text('投票截止时间', style: _leadingStyle),\n              ),\n              GestureDetector(\n                behavior: HitTestBehavior.opaque,\n                onTap: () async {\n                  FocusManager.instance.primaryFocus?.unfocus();\n                  DateTime? newDate = await showDatePicker(\n                    context: context,\n                    initialDate: _controller.endtime.value,\n                    firstDate: _controller.now,\n                    lastDate: _controller.end,\n                  );\n                  if (newDate != null && context.mounted) {\n                    TimeOfDay? newTime = await showTimePicker(\n                      context: context,\n                      initialTime: TimeOfDay.fromDateTime(\n                        _controller.endtime.value,\n                      ),\n                    );\n                    if (newTime != null) {\n                      final newEndtime = DateTime(\n                        newDate.year,\n                        newDate.month,\n                        newDate.day,\n                        newTime.hour,\n                        newTime.minute,\n                      );\n                      if (newEndtime.difference(DateTime.now()) >=\n                          const Duration(minutes: 5)) {\n                        _controller.endtime.value = newEndtime;\n                      } else {\n                        SmartDialog.showToast('至少选择5分钟之后');\n                      }\n                    }\n                  }\n                },\n                child: Padding(\n                  padding: const EdgeInsets.symmetric(vertical: 4),\n                  child: Obx(\n                    () => Text(\n                      DateFormatUtils.longFormatD.format(\n                        _controller.endtime.value,\n                      ),\n                    ),\n                  ),\n                ),\n              ),\n            ],\n          ),\n          divider,\n          const SizedBox(height: 40),\n          Obx(() {\n            final canCreate = _controller.canCreate.value;\n            return FilledButton.tonal(\n              onPressed: canCreate ? _controller.onCreate : null,\n              child: const Text('发起投票'),\n            );\n          }),\n        ],\n      ),\n    );\n  }\n\n  Widget _buildInput(\n    ThemeData theme, {\n    Key? key,\n    String? initialValue,\n    required ValueChanged<String> onChanged,\n    required String desc,\n    String? hintText,\n    List<TextInputFormatter>? inputFormatters,\n    bool showDel = false,\n    bool showImg = false,\n    String? imgUrl,\n    VoidCallback? onDel,\n    VoidCallback? onPickImg,\n  }) {\n    return Row(\n      spacing: 12,\n      children: [\n        SizedBox(\n          width: 65,\n          child: Text(\n            desc,\n            style: _leadingStyle,\n          ),\n        ),\n        Expanded(\n          child: TextFormField(\n            key: key,\n            initialValue: initialValue,\n            onChanged: onChanged,\n            decoration: InputDecoration(\n              isDense: true,\n              border: InputBorder.none,\n              contentPadding: EdgeInsets.zero,\n              hintText: hintText ?? desc,\n              hintStyle: TextStyle(\n                fontSize: 15,\n                color: theme.colorScheme.outline.withValues(alpha: 0.7),\n              ),\n            ),\n            inputFormatters: inputFormatters,\n          ),\n        ),\n        if (showImg)\n          GestureDetector(\n            onTap: onPickImg,\n            child: NetworkImgLayer(\n              src: imgUrl,\n              width: 40,\n              height: 40,\n              borderRadius: const BorderRadius.all(\n                Radius.circular(6),\n              ),\n            ),\n          ),\n        if (showDel)\n          iconButton(\n            size: 26,\n            iconSize: 18,\n            tooltip: '移除',\n            icon: const Icon(Icons.clear),\n            onPressed: onDel,\n            iconColor: theme.colorScheme.onSurfaceVariant,\n          ),\n      ],\n    );\n  }\n\n  Widget _buildType(ThemeData theme) => Obx(\n    () {\n      return Row(\n        spacing: 16,\n        children: List.generate(\n          2,\n          (index) {\n            final isEnable = index == _controller.type.value;\n            final style = TextButton.styleFrom(\n              tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n              visualDensity: VisualDensity.compact,\n              padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 17),\n              shape: RoundedRectangleBorder(\n                side: BorderSide(\n                  color: isEnable\n                      ? theme.colorScheme.secondary\n                      : theme.colorScheme.outline,\n                ),\n                borderRadius: const BorderRadius.all(Radius.circular(6)),\n              ),\n              backgroundColor: isEnable\n                  ? theme.colorScheme.secondaryContainer\n                  : Colors.transparent,\n              foregroundColor: isEnable\n                  ? theme.colorScheme.onSecondaryContainer\n                  : theme.colorScheme.onSurfaceVariant,\n            );\n            Widget child = TextButton(\n              style: style,\n              onPressed: () => _controller\n                ..type.value = index\n                ..updateCanCreate(),\n              child: Text(\n                '${const ['文字', '图片'][index]}投票',\n                style: const TextStyle(fontSize: 14, height: 1),\n                strutStyle: const StrutStyle(\n                  height: 1,\n                  leading: 0,\n                  fontSize: 14,\n                ),\n              ),\n            );\n            if (isEnable) {\n              child = Stack(\n                clipBehavior: Clip.none,\n                children: [\n                  child,\n                  Positioned(\n                    right: 0,\n                    bottom: 0,\n                    child: Container(\n                      padding: const EdgeInsets.all(1),\n                      decoration: BoxDecoration(\n                        borderRadius: const BorderRadius.only(\n                          topLeft: Radius.circular(4),\n                          bottomRight: Radius.circular(6),\n                        ),\n                        color: theme.colorScheme.primary,\n                      ),\n                      child: Icon(\n                        size: 10,\n                        Icons.check,\n                        color: theme.colorScheme.onPrimary,\n                      ),\n                    ),\n                  ),\n                ],\n              );\n            }\n            return child;\n          },\n        ),\n      );\n    },\n  );\n\n  void _onPickImg(int index) {\n    EasyThrottle.throttle(\n      'imagePicker',\n      const Duration(milliseconds: 500),\n      () async {\n        try {\n          XFile? pickedFile = await imagePicker.pickImage(\n            imageQuality: 100,\n            source: ImageSource.gallery,\n          );\n          if (pickedFile != null) {\n            final path = pickedFile.path;\n            _controller.onUpload(index, path).whenComplete(() {\n              if (PlatformUtils.isMobile) {\n                File(path).tryDel();\n              }\n            });\n          }\n        } catch (e) {\n          SmartDialog.showToast(e.toString());\n        }\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/dynamics_detail/controller.dart",
    "content": "import 'package:PiliPlus/http/dynamics.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/reply.dart';\nimport 'package:PiliPlus/models/dynamics/result.dart';\nimport 'package:PiliPlus/pages/common/dyn/common_dyn_controller.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass DynamicDetailController extends CommonDynController {\n  @override\n  late int oid;\n  @override\n  late int replyType;\n  late DynamicItemModel dynItem;\n\n  @override\n  dynamic get sourceId => replyType == 1 ? IdUtils.av2bv(oid) : oid;\n\n  @override\n  void onInit() {\n    super.onInit();\n    dynItem = Get.arguments['item'];\n    final commentType = dynItem.basic?.commentType;\n    final commentIdStr = dynItem.basic?.commentIdStr;\n    if (commentType != null &&\n        commentType != 0 &&\n        commentIdStr != null &&\n        commentIdStr.isNotEmpty) {\n      _init(commentIdStr, commentType);\n    } else {\n      DynamicsHttp.dynamicDetail(id: dynItem.idStr).then((res) {\n        if (res case Success(:final response)) {\n          _init(response.basic!.commentIdStr!, response.basic!.commentType!);\n        } else {\n          res.toast();\n        }\n      });\n    }\n  }\n\n  void _init(String commentIdStr, int commentType) {\n    oid = int.parse(commentIdStr);\n    replyType = commentType;\n    queryData();\n  }\n\n  Future<LoadingState> onSetPubSetting(bool isPrivate, Object dynId) async {\n    final res = await DynamicsHttp.dynPrivatePubSetting(\n      dynId: dynId,\n      action: isPrivate ? 'public_pub' : 'private_pub',\n    );\n    if (res.isSuccess) {\n      dynItem.modules.moduleAuthor?.badgeText = isPrivate ? null : '仅自己可见';\n      SmartDialog.showToast('设置成功');\n    } else {\n      res.toast();\n    }\n    return res;\n  }\n\n  Future<void> onSetReplySubject(int action) async {\n    final res = await ReplyHttp.replySubjectModify(\n      oid: oid,\n      type: replyType,\n      action: action,\n    );\n    if (res.isSuccess) {\n      Future.delayed(const Duration(milliseconds: 500), () {\n        if (!isClosed) {\n          onReload();\n        }\n      });\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/dynamics_detail/view.dart",
    "content": "import 'dart:math';\n\nimport 'package:PiliPlus/common/widgets/custom_icon.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text_field/controller.dart';\nimport 'package:PiliPlus/common/widgets/pair.dart';\nimport 'package:PiliPlus/http/constants.dart';\nimport 'package:PiliPlus/http/dynamics.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/reply/reply_option_type.dart';\nimport 'package:PiliPlus/models/dynamics/result.dart';\nimport 'package:PiliPlus/pages/common/dyn/common_dyn_page.dart';\nimport 'package:PiliPlus/pages/dynamics/widgets/author_panel.dart';\nimport 'package:PiliPlus/pages/dynamics/widgets/dynamic_panel.dart';\nimport 'package:PiliPlus/pages/dynamics_create/view.dart';\nimport 'package:PiliPlus/pages/dynamics_detail/controller.dart';\nimport 'package:PiliPlus/pages/dynamics_repost/view.dart';\nimport 'package:PiliPlus/utils/extension/get_ext.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\nimport 'package:PiliPlus/utils/request_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:font_awesome_flutter/font_awesome_flutter.dart';\nimport 'package:get/get.dart';\n\nclass DynamicDetailPage extends StatefulWidget {\n  const DynamicDetailPage({super.key});\n\n  @override\n  State<DynamicDetailPage> createState() => _DynamicDetailPageState();\n}\n\nclass _DynamicDetailPageState extends CommonDynPageState<DynamicDetailPage> {\n  @override\n  final DynamicDetailController controller = Get.putOrFind(\n    DynamicDetailController.new,\n    tag: (Get.arguments['item'] as DynamicItemModel).idStr.toString(),\n  );\n\n  @override\n  dynamic get arguments => {\n    'item': controller.dynItem,\n  };\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    WidgetsBinding.instance.addPostFrameCallback((_) {\n      if (scrollController.hasClients) {\n        controller.showTitle.value =\n            scrollController.positions.first.pixels > 55;\n      }\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: _buildAppBar(),\n      body: Padding(\n        padding: EdgeInsets.only(left: padding.left, right: padding.right),\n        child: isPortrait\n            ? refreshIndicator(\n                onRefresh: controller.onRefresh,\n                child: _buildBody(theme),\n              )\n            : _buildBody(theme),\n      ),\n      floatingActionButtonLocation: floatingActionButtonLocation,\n      floatingActionButton: SlideTransition(\n        position: fabAnimation,\n        child: _buildBottom(theme),\n      ),\n    );\n  }\n\n  void _onEdit() {\n    final item = controller.dynItem;\n    List<RichTextItem>? items;\n    final moduleDynamic = item.modules.moduleDynamic;\n    final desc = moduleDynamic?.desc;\n    final opus = moduleDynamic?.major?.opus;\n\n    Pair<int, String>? topic;\n    if (moduleDynamic?.topic case final t?) {\n      try {\n        topic = Pair(first: t.id!, second: t.name!);\n      } catch (_) {\n        if (kDebugMode) rethrow;\n      }\n    }\n\n    final richTextNodes = desc?.richTextNodes ?? opus?.summary?.richTextNodes;\n    if (richTextNodes != null && richTextNodes.isNotEmpty) {\n      items = <RichTextItem>[];\n      final buffer = StringBuffer();\n      try {\n        for (final e in richTextNodes) {\n          if (e.type == 'RICH_TEXT_NODE_TYPE_EMOJI') {\n            const placeHolder = '\\uFFFC';\n            items.add(\n              RichTextItem(\n                text: placeHolder,\n                rawText: e.origText,\n                type: .emoji,\n                range: TextRange(\n                  start: buffer.length,\n                  end: buffer.length + placeHolder.length,\n                ),\n                emote: Emote(\n                  url: e.emoji!.url!,\n                  width: 22,\n                ),\n              ),\n            );\n            buffer.write(placeHolder);\n            continue;\n          }\n          final range = TextRange(\n            start: buffer.length,\n            end: buffer.length + e.origText!.length,\n          );\n          final item = switch (e.type) {\n            'RICH_TEXT_NODE_TYPE_AT' => RichTextItem(\n              text: e.origText!,\n              type: .at,\n              range: range,\n              id: e.rid,\n            ),\n            'RICH_TEXT_NODE_TYPE_BV' ||\n            'RICH_TEXT_NODE_TYPE_TOPIC' ||\n            'RICH_TEXT_NODE_TYPE_LOTTERY' ||\n            'RICH_TEXT_NODE_TYPE_VIEW_PICTURE' => RichTextItem(\n              text: e.origText!,\n              type: .common,\n              range: range,\n              id: e.rid,\n            ),\n            'RICH_TEXT_NODE_TYPE_VOTE' => RichTextItem(\n              text: e.origText!,\n              type: .vote,\n              range: range,\n              id: e.rid,\n            ),\n            _ => RichTextItem(\n              text: e.origText!,\n              range: range,\n            ),\n          };\n          items.add(item);\n          buffer.write(e.origText!);\n        }\n\n        bool isValid = true;\n        int cursor = 0;\n        for (final e in items) {\n          final range = e.range;\n          if (range.start == cursor) {\n            cursor = range.end;\n          } else {\n            isValid = false;\n            break;\n          }\n        }\n        assert(isValid);\n      } catch (e) {\n        if (kDebugMode) rethrow;\n      }\n    } else {\n      final text = desc?.text ?? opus?.summary?.text;\n      if (text != null && text.isNotEmpty) {\n        items = [\n          RichTextItem.fromStart(text),\n        ];\n      }\n    }\n    ReplyOptionType? replyOption;\n    if (controller.loadingState.value case Error(:final code)) {\n      if (code == 12061 || code == 12002) {\n        replyOption = .close;\n      }\n    }\n    CreateDynPanel.onCreateDyn(\n      context,\n      title: opus?.title,\n      items: items,\n      pics: opus?.pics,\n      topic: topic,\n      replyOption: replyOption ?? .allow,\n      isPrivate: item.modules.moduleAuthor?.badgeText != null,\n      editConfig: (\n        dynId: item.idStr,\n        repostDynId: item.orig?.idStr,\n      ),\n      onSuccess: () {\n        Future.delayed(\n          const Duration(milliseconds: 500),\n          () async {\n            if (!mounted) return;\n            final res = await DynamicsHttp.dynamicDetail(id: item.idStr);\n            if (res case Success(:final response)) {\n              if (mounted) {\n                controller.dynItem = response;\n                setState(() {});\n              }\n            }\n          },\n        );\n      },\n    );\n  }\n\n  PreferredSizeWidget _buildAppBar() => AppBar(\n    title: Padding(\n      padding: const EdgeInsets.only(right: 12),\n      child: Obx(\n        () {\n          final showTitle = controller.showTitle.value;\n          return AnimatedOpacity(\n            opacity: showTitle ? 1 : 0,\n            duration: const Duration(milliseconds: 300),\n            child: IgnorePointer(\n              ignoring: !showTitle,\n              child: AuthorPanel(\n                item: controller.dynItem,\n                isDetail: true,\n                onSetPubSetting: controller.onSetPubSetting,\n                onEdit: _onEdit,\n                onSetReplySubject: controller.onSetReplySubject,\n              ),\n            ),\n          );\n        },\n      ),\n    ),\n    actions: isPortrait\n        ? null\n        : [ratioWidget(maxWidth), const SizedBox(width: 16)],\n  );\n\n  Widget _buildBody(ThemeData theme) {\n    double padding = max(maxWidth / 2 - Grid.smallCardWidth, 0);\n    Widget child;\n    if (isPortrait) {\n      child = Padding(\n        padding: EdgeInsets.symmetric(horizontal: padding),\n        child: CustomScrollView(\n          controller: scrollController,\n          physics: const AlwaysScrollableScrollPhysics(),\n          slivers: [\n            SliverToBoxAdapter(\n              child: DynamicPanel(\n                item: controller.dynItem,\n                isDetail: true,\n                isDetailPortraitW: isPortrait,\n                onSetPubSetting: controller.onSetPubSetting,\n                onEdit: _onEdit,\n                onSetReplySubject: controller.onSetReplySubject,\n              ),\n            ),\n            buildReplyHeader(theme),\n            Obx(() => replyList(theme, controller.loadingState.value)),\n          ],\n        ),\n      );\n    } else {\n      padding = padding / 4;\n      final flex = controller.ratio[0].toInt();\n      final flex1 = controller.ratio[1].toInt();\n      child = Row(\n        children: [\n          Expanded(\n            flex: flex,\n            child: CustomScrollView(\n              controller: scrollController,\n              physics: const AlwaysScrollableScrollPhysics(),\n              slivers: [\n                SliverPadding(\n                  padding: EdgeInsets.only(\n                    left: padding,\n                    bottom: this.padding.bottom + 100,\n                  ),\n                  sliver: SliverToBoxAdapter(\n                    child: DynamicPanel(\n                      item: controller.dynItem,\n                      isDetail: true,\n                      isDetailPortraitW: isPortrait,\n                      onSetPubSetting: controller.onSetPubSetting,\n                      onEdit: _onEdit,\n                      onSetReplySubject: controller.onSetReplySubject,\n                    ),\n                  ),\n                ),\n              ],\n            ),\n          ),\n          Expanded(\n            flex: flex1,\n            child: Padding(\n              padding: EdgeInsets.only(right: padding),\n              child: Scaffold(\n                backgroundColor: Colors.transparent,\n                resizeToAvoidBottomInset: false,\n                body: refreshIndicator(\n                  onRefresh: controller.onRefresh,\n                  child: CustomScrollView(\n                    controller: scrollController,\n                    physics: const AlwaysScrollableScrollPhysics(),\n                    slivers: [\n                      buildReplyHeader(theme),\n                      Obx(\n                        () => replyList(theme, controller.loadingState.value),\n                      ),\n                    ],\n                  ),\n                ),\n              ),\n            ),\n          ),\n        ],\n      );\n    }\n    return child;\n  }\n\n  Widget _buildBottom(ThemeData theme) {\n    if (!controller.showDynActionBar) {\n      return fabButton;\n    }\n\n    final primary = theme.colorScheme.primary;\n    final outline = theme.colorScheme.outline;\n    final btnStyle = TextButton.styleFrom(\n      tapTargetSize: .padded,\n      padding: const EdgeInsets.symmetric(horizontal: 15),\n      foregroundColor: outline,\n    );\n\n    Widget textIconButton({\n      required IconData icon,\n      required String text,\n      required DynamicStat? stat,\n      required ValueChanged<Color> onPressed,\n      IconData? activatedIcon,\n    }) {\n      final status = stat?.status == true;\n      final color = status ? primary : outline;\n      final iconWidget = Icon(\n        status ? activatedIcon : icon,\n        size: 16,\n        color: color,\n      );\n      return TextButton.icon(\n        onPressed: () => onPressed(iconWidget.color!),\n        icon: iconWidget,\n        style: btnStyle,\n        label: Text(\n          stat?.count != null ? NumUtils.numFormat(stat!.count) : text,\n          style: TextStyle(color: color),\n        ),\n      );\n    }\n\n    final moduleStat = controller.dynItem.modules.moduleStat;\n    return Padding(\n      padding: .only(left: padding.left, right: padding.right),\n      child: Column(\n        mainAxisSize: MainAxisSize.min,\n        crossAxisAlignment: CrossAxisAlignment.end,\n        children: [\n          Padding(\n            padding: const EdgeInsets.only(\n              right: kFloatingActionButtonMargin,\n              bottom: kFloatingActionButtonMargin,\n            ),\n            child: replyButton,\n          ),\n          Container(\n            decoration: BoxDecoration(\n              color: theme.colorScheme.surface,\n              border: Border(\n                top: BorderSide(\n                  color: theme.colorScheme.outline.withValues(\n                    alpha: 0.08,\n                  ),\n                ),\n              ),\n            ),\n            padding: EdgeInsets.only(bottom: padding.bottom),\n            child: Row(\n              children: [\n                Expanded(\n                  child: Builder(\n                    builder: (btnContext) {\n                      final forward = moduleStat?.forward;\n                      return textIconButton(\n                        icon: FontAwesomeIcons.shareFromSquare,\n                        text: '转发',\n                        stat: forward,\n                        onPressed: (_) => showModalBottomSheet(\n                          context: context,\n                          isScrollControlled: true,\n                          useSafeArea: true,\n                          builder: (context) => RepostPanel(\n                            item: controller.dynItem,\n                            onSuccess: () {\n                              if (forward != null) {\n                                int count = forward.count ?? 0;\n                                forward.count = count + 1;\n                                if (btnContext.mounted) {\n                                  (btnContext as Element).markNeedsBuild();\n                                }\n                              }\n                            },\n                          ),\n                        ),\n                      );\n                    },\n                  ),\n                ),\n                Expanded(\n                  child: textIconButton(\n                    icon: CustomIcons.share_node,\n                    text: '分享',\n                    stat: null,\n                    onPressed: (_) => Utils.shareText(\n                      '${HttpString.dynamicShareBaseUrl}/${controller.dynItem.idStr}',\n                    ),\n                  ),\n                ),\n                Expanded(\n                  child: Builder(\n                    builder: (context) {\n                      return textIconButton(\n                        icon: FontAwesomeIcons.thumbsUp,\n                        activatedIcon: FontAwesomeIcons.solidThumbsUp,\n                        text: '点赞',\n                        stat: moduleStat?.like,\n                        onPressed: (iconColor) => RequestUtils.onLikeDynamic(\n                          controller.dynItem,\n                          iconColor == primary,\n                          () {\n                            if (context.mounted) {\n                              (context as Element).markNeedsBuild();\n                            }\n                          },\n                        ),\n                      );\n                    },\n                  ),\n                ),\n              ],\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/dynamics_mention/controller.dart",
    "content": "import 'package:PiliPlus/http/dynamics.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_mention/group.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_mention/item.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass DynMentionController\n    extends CommonListController<List<MentionGroup>?, MentionGroup> {\n  final focusNode = FocusNode();\n  final controller = TextEditingController();\n\n  final RxBool enableClear = false.obs;\n\n  final RxBool showBtn = false.obs;\n  Set<MentionItem>? mentionList;\n\n  void updateBtn() {\n    showBtn.value = mentionList?.isNotEmpty == true;\n  }\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  Future<void> onRefresh() {\n    mentionList?.clear();\n    showBtn.value = false;\n    return super.onRefresh();\n  }\n\n  @override\n  Future<LoadingState<List<MentionGroup>?>> customGetData() =>\n      DynamicsHttp.dynMention(keyword: controller.text);\n\n  @override\n  void onClose() {\n    focusNode.dispose();\n    controller.dispose();\n    mentionList?.clear();\n    mentionList = null;\n    super.onClose();\n  }\n\n  void onCheck(bool? value, MentionItem item) {\n    if (value == true) {\n      (mentionList ??= <MentionItem>{}).add(item);\n    } else {\n      mentionList!.remove(item);\n    }\n    updateBtn();\n  }\n}\n"
  },
  {
    "path": "lib/pages/dynamics_mention/view.dart",
    "content": "import 'dart:async';\nimport 'dart:math';\n\nimport 'package:PiliPlus/common/widgets/flutter/draggable_sheet/draggable_scrollable_sheet_topic.dart'\n    as topic_sheet;\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/common/widgets/sliver/sliver_pinned_header.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_mention/group.dart';\nimport 'package:PiliPlus/pages/dynamics_mention/controller.dart';\nimport 'package:PiliPlus/pages/dynamics_mention/widgets/item.dart';\nimport 'package:PiliPlus/pages/search/controller.dart' show DebounceStreamState;\nimport 'package:PiliPlus/utils/extension/context_ext.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass DynMentionPanel extends StatefulWidget {\n  const DynMentionPanel({\n    super.key,\n    this.scrollController,\n    this.onCachePos,\n  });\n\n  final ScrollController? scrollController;\n  final ValueChanged<double>? onCachePos;\n\n  static Future<Object? /* ListOr<MentionItem> */> onDynMention(\n    BuildContext context, {\n    double offset = 0,\n    ValueChanged<double>? onCachePos,\n  }) {\n    return showModalBottomSheet(\n      context: Get.context!,\n      useSafeArea: true,\n      isScrollControlled: true,\n      constraints: BoxConstraints(\n        maxWidth: min(600, context.mediaQueryShortestSide),\n      ),\n      builder: (context) => topic_sheet.DraggableScrollableSheet(\n        expand: false,\n        snap: true,\n        minChildSize: 0,\n        maxChildSize: 1,\n        initialChildSize: offset == 0 ? 0.65 : 1,\n        initialScrollOffset: offset,\n        snapSizes: const [0.65],\n        builder: (context, scrollController) => DynMentionPanel(\n          scrollController: scrollController,\n          onCachePos: onCachePos,\n        ),\n      ),\n    );\n  }\n\n  @override\n  State<DynMentionPanel> createState() => _DynMentionPanelState();\n}\n\nclass _DynMentionPanelState\n    extends DebounceStreamState<DynMentionPanel, String> {\n  final _controller = Get.put(DynMentionController());\n  @override\n  Duration get duration => const Duration(milliseconds: 300);\n\n  @override\n  void initState() {\n    super.initState();\n    if (_controller.loadingState.value is Error) {\n      _controller.onReload();\n    }\n  }\n\n  @override\n  void onValueChanged(String value) => _controller\n    ..enableClear.value = value.isNotEmpty\n    ..onRefresh().whenComplete(\n      () => WidgetsBinding.instance.addPostFrameCallback(\n        (_) => widget.scrollController?.jumpToTop(),\n      ),\n    );\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    final padding = MediaQuery.paddingOf(context).bottom;\n    final viewInset = MediaQuery.viewInsetsOf(context).bottom;\n    return Column(\n      children: [\n        SizedBox(\n          height: 35,\n          child: Center(\n            child: Container(\n              width: 32,\n              height: 3,\n              decoration: BoxDecoration(\n                color: theme.colorScheme.outline,\n                borderRadius: const BorderRadius.all(Radius.circular(3)),\n              ),\n            ),\n          ),\n        ),\n        Padding(\n          padding: const EdgeInsets.only(left: 16, right: 16, bottom: 5),\n          child: TextField(\n            focusNode: _controller.focusNode,\n            controller: _controller.controller,\n            onChanged: ctr!.add,\n            decoration: InputDecoration(\n              visualDensity: .standard,\n              border: const OutlineInputBorder(\n                gapPadding: 0,\n                borderSide: BorderSide.none,\n                borderRadius: BorderRadius.all(Radius.circular(25)),\n              ),\n              isDense: true,\n              filled: true,\n              fillColor: theme.colorScheme.onInverseSurface,\n              hintText: '输入你想@的人',\n              hintStyle: const TextStyle(fontSize: 14),\n              prefixIcon: const Padding(\n                padding: EdgeInsets.only(left: 12, right: 4),\n                child: Icon(Icons.search, size: 20),\n              ),\n              prefixIconConstraints: const BoxConstraints(\n                minHeight: 0,\n                minWidth: 0,\n              ),\n              contentPadding: const EdgeInsets.symmetric(\n                horizontal: 16,\n                vertical: 6,\n              ),\n              suffixIcon: Obx(\n                () => _controller.enableClear.value\n                    ? Padding(\n                        padding: const EdgeInsets.only(right: 12),\n                        child: GestureDetector(\n                          child: Container(\n                            padding: const EdgeInsetsDirectional.all(2),\n                            decoration: BoxDecoration(\n                              shape: BoxShape.circle,\n                              color: theme.colorScheme.secondaryContainer,\n                            ),\n                            child: Icon(\n                              Icons.clear,\n                              size: 16,\n                              color: theme.colorScheme.onSecondaryContainer,\n                            ),\n                          ),\n                          onTap: () => _controller\n                            ..enableClear.value = false\n                            ..controller.clear()\n                            ..onRefresh().whenComplete(\n                              () =>\n                                  WidgetsBinding.instance.addPostFrameCallback(\n                                    (_) => widget.scrollController?.jumpToTop(),\n                                  ),\n                            ),\n                        ),\n                      )\n                    : const SizedBox.shrink(),\n              ),\n              suffixIconConstraints: const BoxConstraints(\n                minHeight: 0,\n                minWidth: 0,\n              ),\n            ),\n          ),\n        ),\n        Expanded(\n          child: Stack(\n            clipBehavior: Clip.none,\n            children: [\n              NotificationListener<ScrollNotification>(\n                onNotification: (notification) {\n                  if (notification is UserScrollNotification) {\n                    if (_controller.focusNode.hasFocus) {\n                      _controller.focusNode.unfocus();\n                    }\n                  } else if (notification is ScrollEndNotification) {\n                    widget.onCachePos?.call(notification.metrics.pixels);\n                  }\n                  return false;\n                },\n                child: CustomScrollView(\n                  controller: widget.scrollController,\n                  slivers: [\n                    Obx(\n                      () => _buildBody(theme, _controller.loadingState.value),\n                    ),\n                    SliverToBoxAdapter(\n                      child: SizedBox(height: padding + viewInset + 100),\n                    ),\n                  ],\n                ),\n              ),\n              Obx(() {\n                return Positioned(\n                  right: kFloatingActionButtonMargin,\n                  bottom:\n                      padding +\n                      kFloatingActionButtonMargin +\n                      (_controller.showBtn.value ? viewInset : 0),\n                  child: AnimatedSlide(\n                    offset: _controller.showBtn.value\n                        ? Offset.zero\n                        : const Offset(0, 3),\n                    duration: const Duration(milliseconds: 120),\n                    child: FloatingActionButton(\n                      onPressed: () {\n                        if (_controller.mentionList.isNullOrEmpty) {\n                          _controller.showBtn.value = false;\n                          return;\n                        }\n                        Get.back(result: _controller.mentionList);\n                        _controller.showBtn.value = false;\n                      },\n                      child: const Icon(Icons.check),\n                    ),\n                  ),\n                );\n              }),\n            ],\n          ),\n        ),\n      ],\n    );\n  }\n\n  Widget _buildBody(\n    ThemeData theme,\n    LoadingState<List<MentionGroup>?> loadingState,\n  ) {\n    return switch (loadingState) {\n      Loading() => const SliverPadding(\n        padding: EdgeInsets.only(top: 8),\n        sliver: linearLoading,\n      ),\n      Success<List<MentionGroup>?>(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverMainAxisGroup(\n                slivers: response.map((group) {\n                  if (group.items.isNullOrEmpty) {\n                    return const SliverToBoxAdapter();\n                  }\n                  return SliverMainAxisGroup(\n                    slivers: [\n                      SliverPinnedHeader(\n                        backgroundColor: theme.colorScheme.surface,\n                        child: Padding(\n                          padding: const .symmetric(\n                            horizontal: 16,\n                            vertical: 10,\n                          ),\n                          child: Text(group.groupName!),\n                        ),\n                      ),\n                      SliverList.builder(\n                        itemCount: group.items!.length,\n                        itemBuilder: (context, index) {\n                          final item = group.items![index];\n                          return DynMentionItem(\n                            item: item,\n                            onTap: () => Get.back(result: item),\n                            onCheck: (value) =>\n                                _controller.onCheck(value, item),\n                          );\n                        },\n                      ),\n                    ],\n                  );\n                }).toList(),\n              )\n            : HttpError(onReload: _controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/dynamics_mention/widgets/item.dart",
    "content": "import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_mention/item.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\nimport 'package:flutter/material.dart';\n\nclass DynMentionItem extends StatelessWidget {\n  const DynMentionItem({\n    super.key,\n    required this.item,\n    required this.onTap,\n    required this.onCheck,\n  });\n\n  final MentionItem item;\n  final VoidCallback onTap;\n  final ValueChanged<bool?> onCheck;\n\n  @override\n  Widget build(BuildContext context) {\n    return Material(\n      type: MaterialType.transparency,\n      child: ListTile(\n        dense: true,\n        onTap: onTap,\n        visualDensity: .standard,\n        leading: NetworkImgLayer(\n          src: item.face,\n          width: 42,\n          height: 42,\n          type: ImageType.avatar,\n        ),\n        title: Text(\n          item.name!,\n          style: const TextStyle(fontSize: 14),\n        ),\n        subtitle: Text(\n          '${NumUtils.numFormat(item.fans)}粉丝',\n          style: TextStyle(color: Theme.of(context).colorScheme.outline),\n        ),\n        trailing: Checkbox(\n          tristate: false,\n          value: item.checked,\n          onChanged: (value) {\n            item.checked = value!;\n            (context as Element).markNeedsBuild();\n            onCheck(value);\n          },\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/dynamics_repost/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/draggable_sheet/draggable_scrollable_sheet_dyn.dart'\n    show DraggableScrollableSheet;\nimport 'package:PiliPlus/common/widgets/flutter/text_field/text_field.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/http/dynamics.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/publish_panel_type.dart';\nimport 'package:PiliPlus/models/dynamics/result.dart';\nimport 'package:PiliPlus/pages/common/publish/common_rich_text_pub_page.dart';\nimport 'package:PiliPlus/pages/dynamics_mention/controller.dart';\nimport 'package:PiliPlus/pages/emote/controller.dart';\nimport 'package:PiliPlus/pages/emote/view.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/request_utils.dart';\nimport 'package:flutter/material.dart' hide DraggableScrollableSheet, TextField;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass RepostPanel extends CommonRichTextPubPage {\n  const RepostPanel({\n    super.key,\n    this.item,\n    this.dynIdStr,\n    this.onSuccess,\n    // video\n    this.rid,\n    this.dynType,\n    this.pic,\n    this.title,\n    this.uname,\n  });\n\n  // video\n  final int? rid;\n  final int? dynType;\n  final String? pic;\n  final String? title;\n  final String? uname;\n\n  final DynamicItemModel? item;\n  final String? dynIdStr;\n  final VoidCallback? onSuccess;\n\n  @override\n  State<RepostPanel> createState() => _RepostPanelState();\n}\n\nclass _RepostPanelState extends CommonRichTextPubPageState<RepostPanel> {\n  late bool _isMax = false;\n  late bool _isExpanded = false;\n\n  late final _key = GlobalKey();\n\n  late final String? _pic;\n  late final String _text;\n  late final String? _uname;\n\n  @override\n  void initState() {\n    super.initState();\n    late final modules = widget.item?.modules;\n    late final moduleDynamic = modules?.moduleDynamic;\n    late final major = moduleDynamic?.major;\n\n    _pic =\n        widget.pic ??\n        major?.archive?.cover ??\n        major?.pgc?.cover ??\n        major?.opus?.pics?.firstOrNull?.url;\n\n    _text =\n        widget.title ??\n        major?.opus?.summary?.text ??\n        major?.archive?.title ??\n        major?.pgc?.title ??\n        moduleDynamic?.desc?.text ??\n        '';\n\n    _uname = widget.uname ?? modules?.moduleAuthor?.name;\n  }\n\n  @override\n  void dispose() {\n    Get\n      ..delete<EmotePanelController>()\n      ..delete<DynMentionController>();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final ThemeData theme = Theme.of(context);\n\n    Widget page([ScrollController? scrollController]) => Column(\n      key: _isMax ? _key : null,\n      mainAxisSize: _isMax ? MainAxisSize.max : MainAxisSize.min,\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        if (!_isMax) const SizedBox(height: 10),\n        _buildAppBar(theme),\n        if (_isMax) ...[\n          Expanded(\n            child: ListView(\n              padding: EdgeInsets.zero,\n              controller: scrollController,\n              physics: const ClampingScrollPhysics(),\n              children: _buildEditPanel(theme),\n            ),\n          ),\n          _buildToolbar,\n          buildPanelContainer(theme, Colors.transparent),\n        ] else ...[\n          ..._buildEditPanel(theme),\n          ..._buildDismiss(theme),\n        ],\n      ],\n    );\n\n    Widget child() => _isMax\n        ? DraggableScrollableSheet(\n            snap: true,\n            expand: false,\n            initialChildSize: 1,\n            minChildSize: 0,\n            maxChildSize: 1,\n            snapSizes: const [1],\n            builder: (context, scrollController) => page(scrollController),\n          )\n        : page();\n\n    return _isExpanded\n        ? child()\n        : AnimatedSize(\n            alignment: Alignment.topCenter,\n            curve: Curves.ease,\n            duration: const Duration(milliseconds: 300),\n            child: child(),\n          );\n  }\n\n  List<Widget> _buildEditPanel(ThemeData theme) => [\n    Padding(\n      padding: const EdgeInsets.symmetric(horizontal: 16),\n      child: _isMax\n          ? _buildEditWidget(theme)\n          : DecoratedBox(\n              decoration: BoxDecoration(\n                border: Border(\n                  left: BorderSide(\n                    width: 2,\n                    color: theme.colorScheme.primary,\n                  ),\n                ),\n              ),\n              child: _buildEditPlaceHolder(theme),\n            ),\n    ),\n    const SizedBox(height: 10),\n    _buildRefWidget(theme),\n  ];\n\n  Widget _buildRefWidget(ThemeData theme) => Card(\n    margin: const EdgeInsets.symmetric(horizontal: 16),\n    shape: const RoundedRectangleBorder(\n      borderRadius: BorderRadius.all(Radius.circular(12)),\n    ),\n    child: Padding(\n      padding: const EdgeInsets.all(10),\n      child: Row(\n        children: [\n          if (_pic != null) ...[\n            NetworkImgLayer(\n              width: 40,\n              height: 40,\n              src: _pic,\n              borderRadius: const BorderRadius.all(\n                Radius.circular(6),\n              ),\n            ),\n            const SizedBox(width: 10),\n          ],\n          Expanded(\n            child: Column(\n              mainAxisSize: MainAxisSize.min,\n              crossAxisAlignment: CrossAxisAlignment.start,\n              children: [\n                if (_uname?.isNotEmpty == true)\n                  Text(\n                    '@$_uname',\n                    style: TextStyle(\n                      color: theme.colorScheme.primary,\n                      fontSize: 13,\n                    ),\n                  ),\n                Text(\n                  _text,\n                  maxLines: 2,\n                  overflow: TextOverflow.ellipsis,\n                ),\n              ],\n            ),\n          ),\n        ],\n      ),\n    ),\n  );\n\n  Widget _buildEditPlaceHolder(ThemeData theme) => GestureDetector(\n    behavior: HitTestBehavior.opaque,\n    onTap: () {\n      setState(() => _isMax = true);\n      Future.delayed(const Duration(milliseconds: 300), () {\n        if (mounted) {\n          focusNode.requestFocus();\n          setState(() => _isExpanded = true);\n        }\n      });\n    },\n    child: SizedBox(\n      width: double.infinity,\n      child: Text(\n        '说点什么吧',\n        style: TextStyle(\n          height: 1.75,\n          fontSize: 15,\n          color: theme.colorScheme.outline,\n        ),\n      ),\n    ),\n  );\n\n  Widget _buildEditWidget(ThemeData theme) => Listener(\n    onPointerUp: (event) {\n      if (readOnly.value) {\n        updatePanelType(PanelType.keyboard);\n      }\n    },\n    child: Obx(\n      () => RichTextField(\n        key: key,\n        controller: editController,\n        minLines: 4,\n        maxLines: null,\n        focusNode: focusNode,\n        onSubmitted: onSubmitted,\n        readOnly: readOnly.value,\n        decoration: InputDecoration(\n          hintText: '说点什么吧',\n          hintStyle: TextStyle(color: theme.colorScheme.outline),\n          border: const OutlineInputBorder(\n            borderSide: BorderSide.none,\n            gapPadding: 0,\n          ),\n          contentPadding: EdgeInsets.zero,\n        ),\n        // inputFormatters: [LengthLimitingTextInputFormatter(1000)],\n      ),\n    ),\n  );\n\n  Widget _buildAppBar(ThemeData theme) => !_isMax\n      ? Row(\n          children: [\n            const SizedBox(width: 16),\n            Text(\n              widget.rid != null ? '分享至动态' : '转发动态',\n              style: const TextStyle(fontWeight: FontWeight.bold),\n            ),\n            const Spacer(),\n            TextButton(\n              onPressed: onPublish,\n              style: TextButton.styleFrom(\n                padding: const EdgeInsets.symmetric(\n                  horizontal: 20,\n                  vertical: 10,\n                ),\n                visualDensity: VisualDensity.compact,\n              ),\n              child: Text(widget.rid != null ? '立即发布' : '立即转发'),\n            ),\n            const SizedBox(width: 16),\n          ],\n        )\n      : Container(\n          height: 66,\n          padding: const EdgeInsets.all(16),\n          child: Stack(\n            clipBehavior: Clip.none,\n            children: [\n              Align(\n                alignment: Alignment.centerLeft,\n                child: SizedBox(\n                  width: 34,\n                  height: 34,\n                  child: IconButton(\n                    tooltip: '返回',\n                    style: ButtonStyle(\n                      padding: const WidgetStatePropertyAll(EdgeInsets.zero),\n                      backgroundColor: WidgetStatePropertyAll(\n                        theme.colorScheme.secondaryContainer,\n                      ),\n                    ),\n                    onPressed: Get.back,\n                    icon: Icon(\n                      Icons.arrow_back_outlined,\n                      size: 18,\n                      color: theme.colorScheme.onSecondaryContainer,\n                    ),\n                  ),\n                ),\n              ),\n              Center(\n                child: Text(\n                  widget.rid != null ? '分享至动态' : '转发动态',\n                  style: const TextStyle(\n                    fontSize: 15,\n                    fontWeight: FontWeight.bold,\n                  ),\n                ),\n              ),\n              Align(\n                alignment: Alignment.centerRight,\n                child: FilledButton.tonal(\n                  onPressed: onPublish,\n                  style: FilledButton.styleFrom(\n                    tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n                    padding: const EdgeInsets.symmetric(\n                      horizontal: 20,\n                      vertical: 10,\n                    ),\n                    visualDensity: VisualDensity.compact,\n                  ),\n                  child: Text(widget.rid != null ? '发布' : '转发'),\n                ),\n              ),\n            ],\n          ),\n        );\n\n  Widget get _buildToolbar => Padding(\n    padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),\n    child: Row(\n      spacing: 16,\n      children: [\n        emojiBtn,\n        atBtn,\n      ],\n    ),\n  );\n\n  List<Widget> _buildDismiss(ThemeData theme) => [\n    const SizedBox(height: 10),\n    Divider(\n      height: 1,\n      color: theme.colorScheme.outline.withValues(alpha: 0.1),\n    ),\n    ListTile(\n      dense: true,\n      onTap: Get.back,\n      title: Center(\n        child: Text(\n          '取消',\n          style: TextStyle(color: theme.colorScheme.outline),\n        ),\n      ),\n    ),\n    SizedBox(height: 10 + MediaQuery.viewPaddingOf(context).bottom),\n  ];\n\n  @override\n  Widget? get customPanel => EmotePanel(onChoose: onChooseEmote);\n\n  List<Map<String, dynamic>>? getRepostContent(DynamicItemModel item) {\n    try {\n      return [\n        {\"raw_text\": \"//\", \"type\": 1, \"biz_id\": \"\"},\n        {\n          \"raw_text\": \"@${item.modules.moduleAuthor!.name}\",\n          \"type\": 2,\n          \"biz_id\": item.modules.moduleAuthor!.mid.toString(),\n        },\n        {\"raw_text\": \":\", \"type\": 1, \"biz_id\": \"\"},\n        ...item.modules.moduleDynamic!.desc!.richTextNodes!.map(\n          (e) {\n            int type;\n            String bizId;\n            switch (e.type) {\n              case 'RICH_TEXT_NODE_TYPE_EMOJI':\n                type = 9;\n                bizId = '';\n              case 'RICH_TEXT_NODE_TYPE_AT':\n                type = 2;\n                bizId = e.rid ?? '';\n              case 'RICH_TEXT_NODE_TYPE_TEXT':\n              default:\n                type = 1;\n                bizId = '';\n            }\n            return {\n              \"raw_text\": e.origText,\n              \"type\": type,\n              \"biz_id\": bizId,\n            };\n          },\n        ),\n      ];\n    } catch (_) {\n      return null;\n    }\n  }\n\n  @override\n  Future<void> onCustomPublish({List? pictures}) async {\n    SmartDialog.showLoading();\n    List<Map<String, dynamic>>? richContent = getRichContent();\n    final hasRichText = richContent != null;\n    List<Map<String, dynamic>>? repostContent = widget.item?.orig != null\n        ? getRepostContent(widget.item!)\n        : null;\n    if (hasRichText && repostContent != null) {\n      richContent.addAll(repostContent);\n    }\n    final res = await DynamicsHttp.createDynamic(\n      mid: Accounts.main.mid,\n      dynIdStr: widget.item?.idStr ?? widget.dynIdStr,\n      rid: widget.rid,\n      dynType: widget.dynType,\n      rawText: hasRichText ? null : editController.text,\n      extraContent: richContent ?? repostContent,\n    );\n    SmartDialog.dismiss();\n    if (res case Success(:final response)) {\n      hasPub = true;\n      Get.back();\n      SmartDialog.showToast('转发成功');\n      widget.onSuccess?.call();\n      final id = response?['dyn_id'];\n      RequestUtils.insertCreatedDyn(id);\n      RequestUtils.checkCreatedDyn(\n        id: id,\n        dynText: editController.rawText,\n      );\n    } else {\n      res.toast();\n    }\n  }\n\n  @override\n  void onSave() {}\n}\n"
  },
  {
    "path": "lib/pages/dynamics_select_topic/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/search.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_topic_pub_search/data.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_topic_top/topic_item.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:flutter/widgets.dart';\nimport 'package:get/get.dart';\n\nclass SelectTopicController\n    extends CommonListController<TopicPubSearchData, TopicItem> {\n  final focusNode = FocusNode();\n  final controller = TextEditingController();\n\n  final RxBool enableClear = false.obs;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  List<TopicItem>? getDataList(TopicPubSearchData response) {\n    if (response.pageInfo?.hasMore == false) {\n      isEnd = true;\n    }\n    return response.topicItems;\n  }\n\n  @override\n  Future<LoadingState<TopicPubSearchData>> customGetData() =>\n      SearchHttp.topicPubSearch(\n        keywords: controller.text,\n        pageNum: page,\n      );\n\n  @override\n  void onClose() {\n    focusNode.dispose();\n    controller.dispose();\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "lib/pages/dynamics_select_topic/view.dart",
    "content": "import 'dart:async';\nimport 'dart:math';\n\nimport 'package:PiliPlus/common/widgets/flutter/draggable_sheet/draggable_scrollable_sheet_topic.dart'\n    as topic_sheet;\nimport 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_topic_top/topic_item.dart';\nimport 'package:PiliPlus/pages/dynamics_select_topic/controller.dart';\nimport 'package:PiliPlus/pages/dynamics_select_topic/widgets/item.dart';\nimport 'package:PiliPlus/pages/search/controller.dart' show DebounceStreamState;\nimport 'package:PiliPlus/utils/extension/context_ext.dart';\nimport 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass SelectTopicPanel extends StatefulWidget {\n  const SelectTopicPanel({\n    super.key,\n    this.scrollController,\n    this.onCachePos,\n  });\n\n  final ScrollController? scrollController;\n  final ValueChanged<double>? onCachePos;\n\n  static Future<TopicItem?> onSelectTopic(\n    BuildContext context, {\n    double offset = 0,\n    ValueChanged<double>? onCachePos,\n  }) {\n    return showModalBottomSheet<TopicItem?>(\n      context: Get.context!,\n      useSafeArea: true,\n      isScrollControlled: true,\n      constraints: BoxConstraints(\n        maxWidth: min(600, context.mediaQueryShortestSide),\n      ),\n      builder: (context) => topic_sheet.DraggableScrollableSheet(\n        expand: false,\n        snap: true,\n        minChildSize: 0,\n        maxChildSize: 1,\n        initialChildSize: offset == 0 ? 0.65 : 1,\n        initialScrollOffset: offset,\n        snapSizes: const [0.65],\n        builder: (context, scrollController) => SelectTopicPanel(\n          scrollController: scrollController,\n          onCachePos: onCachePos,\n        ),\n      ),\n    );\n  }\n\n  @override\n  State<SelectTopicPanel> createState() => _SelectTopicPanelState();\n}\n\nclass _SelectTopicPanelState\n    extends DebounceStreamState<SelectTopicPanel, String> {\n  final _controller = Get.put(SelectTopicController());\n  @override\n  Duration get duration => const Duration(milliseconds: 300);\n\n  @override\n  void initState() {\n    super.initState();\n    if (_controller.loadingState.value is Error) {\n      _controller.onReload();\n    }\n  }\n\n  @override\n  void onValueChanged(String value) => _controller\n    ..enableClear.value = value.isNotEmpty\n    ..onRefresh().whenComplete(\n      () => WidgetsBinding.instance.addPostFrameCallback(\n        (_) => widget.scrollController?.jumpToTop(),\n      ),\n    );\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    return Column(\n      children: [\n        SizedBox(\n          height: 35,\n          child: Center(\n            child: Container(\n              width: 32,\n              height: 3,\n              decoration: BoxDecoration(\n                color: theme.colorScheme.outline,\n                borderRadius: const BorderRadius.all(Radius.circular(3)),\n              ),\n            ),\n          ),\n        ),\n        Padding(\n          padding: const EdgeInsets.only(left: 16, right: 16, bottom: 5),\n          child: TextField(\n            focusNode: _controller.focusNode,\n            controller: _controller.controller,\n            onChanged: ctr!.add,\n            decoration: InputDecoration(\n              visualDensity: .standard,\n              border: const OutlineInputBorder(\n                gapPadding: 0,\n                borderSide: BorderSide.none,\n                borderRadius: BorderRadius.all(Radius.circular(25)),\n              ),\n              isDense: true,\n              filled: true,\n              fillColor: theme.colorScheme.onInverseSurface,\n              hintText: '搜索话题',\n              hintStyle: const TextStyle(fontSize: 14),\n              prefixIcon: const Padding(\n                padding: EdgeInsets.only(left: 12, right: 4),\n                child: Icon(Icons.search, size: 20),\n              ),\n              prefixIconConstraints: const BoxConstraints(\n                minHeight: 0,\n                minWidth: 0,\n              ),\n              contentPadding: const EdgeInsets.symmetric(\n                horizontal: 16,\n                vertical: 6,\n              ),\n              suffixIcon: Obx(\n                () => _controller.enableClear.value\n                    ? Padding(\n                        padding: const EdgeInsets.only(right: 12),\n                        child: GestureDetector(\n                          child: Container(\n                            padding: const EdgeInsetsDirectional.all(2),\n                            decoration: BoxDecoration(\n                              shape: BoxShape.circle,\n                              color: theme.colorScheme.secondaryContainer,\n                            ),\n                            child: Icon(\n                              Icons.clear,\n                              size: 16,\n                              color: theme.colorScheme.onSecondaryContainer,\n                            ),\n                          ),\n                          onTap: () => _controller\n                            ..enableClear.value = false\n                            ..controller.clear()\n                            ..onRefresh().whenComplete(\n                              () =>\n                                  WidgetsBinding.instance.addPostFrameCallback(\n                                    (_) => widget.scrollController?.jumpToTop(),\n                                  ),\n                            ),\n                        ),\n                      )\n                    : const SizedBox.shrink(),\n              ),\n              suffixIconConstraints: const BoxConstraints(\n                minHeight: 0,\n                minWidth: 0,\n              ),\n            ),\n          ),\n        ),\n        Expanded(\n          child: NotificationListener<ScrollNotification>(\n            onNotification: (notification) {\n              if (notification is UserScrollNotification) {\n                if (_controller.focusNode.hasFocus) {\n                  _controller.focusNode.unfocus();\n                }\n              } else if (notification is ScrollEndNotification) {\n                widget.onCachePos?.call(notification.metrics.pixels);\n              }\n              return false;\n            },\n            child: Obx(() => _buildBody(theme, _controller.loadingState.value)),\n          ),\n        ),\n      ],\n    );\n  }\n\n  Widget _buildBody(\n    ThemeData theme,\n    LoadingState<List<TopicItem>?> loadingState,\n  ) {\n    return switch (loadingState) {\n      Loading() => m3eLoading,\n      Success<List<TopicItem>?>(:final response) =>\n        response != null && response.isNotEmpty\n            ? ListView.builder(\n                padding: EdgeInsets.only(\n                  bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n                ),\n                controller: widget.scrollController,\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    _controller.onLoadMore();\n                  }\n                  return DynTopicItem(\n                    item: response[index],\n                    onTap: (item) => Get.back(result: item),\n                  );\n                },\n                itemCount: response.length,\n              )\n            : _errWidget(),\n      Error(:final errMsg) => _errWidget(errMsg),\n    };\n  }\n\n  Widget _errWidget([String? errMsg]) => scrollErrorWidget(\n    errMsg: errMsg,\n    controller: widget.scrollController,\n    onReload: _controller.onReload,\n  );\n}\n"
  },
  {
    "path": "lib/pages/dynamics_select_topic/widgets/item.dart",
    "content": "import 'package:PiliPlus/common/widgets/custom_icon.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_topic_top/topic_item.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\nimport 'package:flutter/material.dart';\n\nclass DynTopicItem extends StatelessWidget {\n  const DynTopicItem({\n    super.key,\n    required this.item,\n    required this.onTap,\n  });\n\n  final TopicItem item;\n  final ValueChanged<TopicItem> onTap;\n\n  @override\n  Widget build(BuildContext context) {\n    return Material(\n      type: MaterialType.transparency,\n      child: ListTile(\n        dense: true,\n        onTap: () => onTap(item),\n        title: Text.rich(\n          TextSpan(\n            children: [\n              const WidgetSpan(\n                alignment: PlaceholderAlignment.middle,\n                child: Padding(\n                  padding: EdgeInsets.only(right: 5),\n                  child: Icon(\n                    CustomIcons.topic_tag,\n                    size: 18,\n                  ),\n                ),\n              ),\n              TextSpan(\n                text: item.name,\n                style: const TextStyle(fontSize: 14),\n              ),\n            ],\n          ),\n        ),\n        subtitle: Padding(\n          padding: const EdgeInsets.only(left: 23),\n          child: Text(\n            '${NumUtils.numFormat(item.view)}浏览 · ${NumUtils.numFormat(item.discuss)}讨论',\n            style: TextStyle(color: Theme.of(context).colorScheme.outline),\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/dynamics_tab/controller.dart",
    "content": "import 'package:PiliPlus/http/dynamics.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/msg.dart';\nimport 'package:PiliPlus/models/common/dynamic/dynamics_type.dart';\nimport 'package:PiliPlus/models/dynamics/result.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:PiliPlus/pages/dynamics/controller.dart';\nimport 'package:PiliPlus/pages/main/controller.dart';\nimport 'package:PiliPlus/services/account_service.dart';\nimport 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass DynamicsTabController\n    extends CommonListController<DynamicsDataModel, DynamicItemModel>\n    with AccountMixin {\n  DynamicsTabController({required this.dynamicsType});\n  final DynamicsTabType dynamicsType;\n  String offset = '';\n  int? mid;\n  late final MainController mainController = Get.find<MainController>();\n  final dynamicsController = Get.find<DynamicsController>();\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  Future<void> onRefresh() {\n    if (dynamicsType == DynamicsTabType.all) {\n      mainController.setDynCount();\n    }\n    offset = '';\n    return super.onRefresh();\n  }\n\n  @override\n  List<DynamicItemModel>? getDataList(DynamicsDataModel response) {\n    offset = response.offset ?? '';\n    return response.items;\n  }\n\n  @override\n  Future<LoadingState<DynamicsDataModel>> customGetData() =>\n      DynamicsHttp.followDynamic(\n        type: dynamicsType,\n        offset: offset,\n        mid: mid,\n        tempBannedList: dynamicsController.tempBannedList,\n      );\n\n  Future<void> onRemove(int index, dynamic dynamicId) async {\n    final res = await MsgHttp.removeDynamic(dynIdStr: dynamicId);\n    if (res.isSuccess) {\n      loadingState\n        ..value.data!.removeAt(index)\n        ..refresh();\n      SmartDialog.showToast('删除成功');\n    } else {\n      res.toast();\n    }\n  }\n\n  @override\n  Future<void> onReload() {\n    scrollController.jumpToTop();\n    return super.onReload();\n  }\n\n  void onBlock(int index) {\n    if (dynamicsType != DynamicsTabType.up) {\n      loadingState\n        ..value.data!.removeAt(index)\n        ..refresh();\n    }\n  }\n\n  void onUnfold(DynamicItemModel item, int index) {\n    try {\n      final list = loadingState.value.data!;\n      final ids = item.modules.moduleFold!.ids!;\n      final flag = index + ids.length + 1;\n      for (int i = index + 1; i < flag; i++) {\n        list[i].visible = true;\n      }\n      item.modules.moduleFold = null;\n      loadingState.refresh();\n    } catch (_) {}\n  }\n\n  @override\n  void onChangeAccount(bool isLogin) => onReload();\n}\n"
  },
  {
    "path": "lib/pages/dynamics_tab/view.dart",
    "content": "import 'dart:async';\n\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/dynamic/dynamics_type.dart';\nimport 'package:PiliPlus/models/dynamics/result.dart';\nimport 'package:PiliPlus/pages/dynamics/controller.dart';\nimport 'package:PiliPlus/pages/dynamics/widgets/dynamic_panel.dart';\nimport 'package:PiliPlus/pages/dynamics_tab/controller.dart';\nimport 'package:PiliPlus/utils/extension/get_ext.dart';\nimport 'package:PiliPlus/utils/global_data.dart';\nimport 'package:PiliPlus/utils/waterfall.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:waterfall_flow/waterfall_flow.dart'\n    hide SliverWaterfallFlowDelegateWithMaxCrossAxisExtent;\n\nclass DynamicsTabPage extends StatefulWidget {\n  const DynamicsTabPage({super.key, required this.dynamicsType});\n\n  final DynamicsTabType dynamicsType;\n\n  @override\n  State<DynamicsTabPage> createState() => _DynamicsTabPageState();\n}\n\nclass _DynamicsTabPageState extends State<DynamicsTabPage>\n    with AutomaticKeepAliveClientMixin, DynMixin {\n  StreamSubscription? _listener;\n\n  DynamicsController dynamicsController = Get.putOrFind(DynamicsController.new);\n  late final DynamicsTabController controller;\n\n  @override\n  bool get wantKeepAlive => true;\n\n  @override\n  void initState() {\n    controller = Get.putOrFind(\n      () =>\n          DynamicsTabController(dynamicsType: widget.dynamicsType)\n            ..mid = dynamicsController.mid.value,\n      tag: widget.dynamicsType.name,\n    );\n    super.initState();\n    if (widget.dynamicsType == DynamicsTabType.up) {\n      _listener = dynamicsController.mid.listen((mid) {\n        if (mid != -1) {\n          controller\n            ..mid = mid\n            ..onReload();\n        }\n      });\n    }\n  }\n\n  @override\n  void dispose() {\n    _listener?.cancel();\n    dynamicsController.mid.close();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    return refreshIndicator(\n      onRefresh: () {\n        dynamicsController.queryFollowUp();\n        return controller.onRefresh();\n      },\n      child: CustomScrollView(\n        physics: const AlwaysScrollableScrollPhysics(),\n        controller: controller.scrollController,\n        slivers: [\n          SliverPadding(\n            padding: const EdgeInsets.only(bottom: 100),\n            sliver: buildPage(\n              Obx(() => _buildBody(controller.loadingState.value)),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget _buildBody(LoadingState<List<DynamicItemModel>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => dynSkeleton,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? GlobalData().dynamicsWaterfallFlow\n                  ? SliverWaterfallFlow(\n                      gridDelegate: dynGridDelegate,\n                      delegate: SliverChildBuilderDelegate(\n                        (_, index) {\n                          if (index == response.length - 1) {\n                            controller.onLoadMore();\n                          }\n                          final item = response[index];\n                          return DynamicPanel(\n                            item: item,\n                            onRemove: (idStr) =>\n                                controller.onRemove(index, idStr),\n                            onBlock: () => controller.onBlock(index),\n                            onUnfold: () => controller.onUnfold(item, index),\n                          );\n                        },\n                        childCount: response.length,\n                      ),\n                    )\n                  : SliverList.builder(\n                      itemBuilder: (context, index) {\n                        if (index == response.length - 1) {\n                          controller.onLoadMore();\n                        }\n                        final item = response[index];\n                        return DynamicPanel(\n                          item: item,\n                          onRemove: (idStr) =>\n                              controller.onRemove(index, idStr),\n                          onBlock: () => controller.onBlock(index),\n                          onUnfold: () => controller.onUnfold(item, index),\n                        );\n                      },\n                      itemCount: response.length,\n                    )\n            : HttpError(onReload: controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: controller.onReload,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/dynamics_topic/controller.dart",
    "content": "import 'package:PiliPlus/http/dynamics.dart';\nimport 'package:PiliPlus/http/fav.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_topic_feed/item.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_topic_feed/topic_card_list.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_topic_feed/topic_sort_by_conf.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_topic_top/top_details.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass DynTopicController\n    extends CommonListController<TopicCardList?, TopicCardItem> {\n  final topicId = Get.parameters['id']!;\n  String topicName = Get.parameters['name'] ?? '';\n\n  int sortBy = 0;\n  String offset = '';\n  Rx<TopicSortByConf?> topicSortByConf = Rx<TopicSortByConf?>(null);\n\n  double? appbarOffset;\n\n  // top\n  Rx<bool?> isFav = Rx<bool?>(null);\n  Rx<bool?> isLike = Rx<bool?>(null);\n  Rx<LoadingState<TopDetails?>> topState =\n      LoadingState<TopDetails?>.loading().obs;\n\n  late final isLogin = Accounts.main.isLogin;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryTop();\n    queryData();\n  }\n\n  Future<void> queryTop() async {\n    topState.value = await DynamicsHttp.topicTop(topicId: topicId);\n    if (topState.value case Success(:final response)) {\n      final topicItem = response!.topicItem!;\n      topicName = topicItem.name;\n      isFav.value = topicItem.isFav;\n      isLike.value = topicItem.isLike;\n    }\n  }\n\n  @override\n  List<TopicCardItem>? getDataList(TopicCardList? response) {\n    offset = response?.offset ?? '';\n    topicSortByConf.value = response?.topicSortByConf;\n    sortBy = response?.topicSortByConf?.showSortBy ?? 0;\n    if (response?.hasMore == false) {\n      isEnd = true;\n    }\n    return response?.items;\n  }\n\n  @override\n  Future<void> onRefresh() {\n    offset = '';\n    queryTop();\n    return super.onRefresh();\n  }\n\n  @override\n  Future<void> onReload() {\n    if (appbarOffset != null) {\n      if (scrollController.hasClients &&\n          scrollController.offset > appbarOffset!) {\n        scrollController.jumpTo(appbarOffset!);\n      }\n    } else {\n      scrollController.jumpToTop();\n    }\n    return super.onReload();\n  }\n\n  @override\n  Future<LoadingState<TopicCardList?>> customGetData() =>\n      DynamicsHttp.topicFeed(\n        topicId: topicId,\n        offset: offset,\n        sortBy: sortBy,\n      );\n\n  void onSort(int sortBy) {\n    this.sortBy = sortBy;\n    onReload();\n  }\n\n  Future<void> onFav() async {\n    if (!isLogin) {\n      SmartDialog.showToast('账号未登录');\n      return;\n    }\n    bool isFav = this.isFav.value ?? false;\n    final res = isFav\n        ? await FavHttp.delFavTopic(topicId)\n        : await FavHttp.addFavTopic(topicId);\n    if (res.isSuccess) {\n      if (isFav) {\n        topState.value.data!.topicItem!.fav -= 1;\n      } else {\n        topState.value.data!.topicItem!.fav += 1;\n      }\n      this.isFav.value = !isFav;\n    } else {\n      res.toast();\n    }\n  }\n\n  Future<void> onLike() async {\n    if (!isLogin) {\n      SmartDialog.showToast('账号未登录');\n      return;\n    }\n    bool isLike = this.isLike.value ?? false;\n    final res = await FavHttp.likeTopic(topicId, isLike);\n    if (res.isSuccess) {\n      if (isLike) {\n        topState.value.data!.topicItem!.like -= 1;\n      } else {\n        topState.value.data!.topicItem!.like += 1;\n      }\n      this.isLike.value = !isLike;\n    } else {\n      res.toast();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/dynamics_topic/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/custom_icon.dart';\nimport 'package:PiliPlus/common/widgets/dynamic_sliver_app_bar/dynamic_sliver_app_bar.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/pair.dart';\nimport 'package:PiliPlus/common/widgets/sliver/sliver_pinned_header.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_topic_feed/item.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_topic_top/top_details.dart';\nimport 'package:PiliPlus/pages/dynamics/widgets/dynamic_panel.dart';\nimport 'package:PiliPlus/pages/dynamics_create/view.dart';\nimport 'package:PiliPlus/pages/dynamics_topic/controller.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/global_data.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:PiliPlus/utils/waterfall.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:font_awesome_flutter/font_awesome_flutter.dart';\nimport 'package:get/get.dart';\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\nimport 'package:waterfall_flow/waterfall_flow.dart'\n    hide SliverWaterfallFlowDelegateWithMaxCrossAxisExtent;\n\nclass DynTopicPage extends StatefulWidget {\n  const DynTopicPage({super.key});\n\n  @override\n  State<DynTopicPage> createState() => _DynTopicPageState();\n}\n\nclass _DynTopicPageState extends State<DynTopicPage> with DynMixin {\n  final DynTopicController _controller = Get.put(\n    DynTopicController(),\n    tag: Utils.generateRandomString(8),\n  );\n\n  @override\n  Widget build(BuildContext context) {\n    final ThemeData theme = Theme.of(context);\n    final padding = MediaQuery.viewPaddingOf(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      floatingActionButton: FloatingActionButton.extended(\n        onPressed: () {\n          if (_controller.isLogin) {\n            CreateDynPanel.onCreateDyn(\n              context,\n              topic: Pair(\n                first: int.parse(_controller.topicId),\n                second: _controller.topicName,\n              ),\n            );\n          } else {\n            SmartDialog.showToast('账号未登录');\n          }\n        },\n        icon: const Icon(CustomIcons.topic_tag, size: 20),\n        label: const Text('参与话题'),\n      ),\n      body: refreshIndicator(\n        onRefresh: _controller.onRefresh,\n        child: CustomScrollView(\n          controller: _controller.scrollController,\n          physics: const AlwaysScrollableScrollPhysics(),\n          slivers: [\n            Obx(\n              () => _buildAppBar(\n                theme,\n                padding,\n                _controller.topState.value,\n              ),\n            ),\n            Obx(() {\n              final allSortBy = _controller.topicSortByConf.value?.allSortBy;\n              if (allSortBy != null && allSortBy.isNotEmpty) {\n                return SliverPinnedHeader(\n                  backgroundColor: theme.colorScheme.surface,\n                  child: Padding(\n                    padding: EdgeInsets.only(\n                      left: 12 + padding.left,\n                      top: 6,\n                      bottom: 6,\n                    ),\n                    child: Builder(\n                      builder: (context) {\n                        return ToggleButtons(\n                          fillColor: theme.colorScheme.secondaryContainer,\n                          selectedColor: theme.colorScheme.onSecondaryContainer,\n                          constraints: const BoxConstraints(\n                            minWidth: 54,\n                            minHeight: 24,\n                          ),\n                          tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n                          borderRadius: const .all(.circular(25)),\n                          onPressed: (index) {\n                            _controller.onSort(allSortBy[index].sortBy!);\n                            (context as Element).markNeedsBuild();\n                          },\n                          isSelected: allSortBy\n                              .map((e) => e.sortBy == _controller.sortBy)\n                              .toList(),\n                          children: allSortBy.map((e) {\n                            return Text(\n                              e.sortName!,\n                              style: const TextStyle(\n                                fontSize: 13,\n                                height: 1,\n                              ),\n                              strutStyle: const StrutStyle(\n                                height: 1,\n                                leading: 0,\n                                fontSize: 13,\n                              ),\n                              textScaler: TextScaler.noScaling,\n                            );\n                          }).toList(),\n                        );\n                      },\n                    ),\n                  ),\n                );\n              }\n              return const SliverToBoxAdapter();\n            }),\n            SliverPadding(\n              padding: EdgeInsets.only(\n                left: padding.left,\n                right: padding.right,\n                bottom: padding.bottom + 100,\n              ),\n              sliver: buildPage(\n                Obx(() => _buildBody(_controller.loadingState.value)),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget _buildAppBar(\n    ThemeData theme,\n    EdgeInsets padding,\n    LoadingState<TopDetails?> topState,\n  ) {\n    return switch (topState) {\n      Loading() => const SliverAppBar(),\n      Success(:final response) when response != null => DynamicSliverAppBar.medium(\n        onPerformLayout: (value) => _controller.appbarOffset =\n            value.height - kToolbarHeight - padding.top,\n        title: IgnorePointer(child: Text(response.topicItem!.name)),\n        flexibleSpace: Container(\n          decoration: BoxDecoration(\n            image: DecorationImage(\n              image: Image.asset(\n                'assets/images/topic-header-bg.png',\n              ).image,\n              filterQuality: FilterQuality.low,\n              fit: BoxFit.cover,\n            ),\n          ),\n          padding: EdgeInsets.only(\n            top: padding.top,\n            left: 12 + padding.left,\n            right: 12 + padding.right,\n          ),\n          child: Column(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              Container(\n                height: kToolbarHeight,\n                alignment: Alignment.centerLeft,\n                margin: const EdgeInsets.only(left: 45, right: 78),\n                child: GestureDetector(\n                  behavior: HitTestBehavior.opaque,\n                  onTap: () => Get.toNamed(\n                    '/member?mid=${response.topicCreator!.uid}',\n                  ),\n                  child: Row(\n                    spacing: 10,\n                    mainAxisSize: MainAxisSize.min,\n                    children: [\n                      NetworkImgLayer(\n                        width: 28,\n                        height: 28,\n                        src: response.topicCreator!.face!,\n                        type: ImageType.avatar,\n                      ),\n                      Flexible(\n                        child: Text(\n                          response.topicCreator!.name!,\n                          maxLines: 1,\n                          overflow: TextOverflow.ellipsis,\n                        ),\n                      ),\n                      Text(\n                        ' 发起',\n                        style: TextStyle(color: theme.colorScheme.outline),\n                      ),\n                    ],\n                  ),\n                ),\n              ),\n              Text(\n                response.topicItem!.name,\n                style: const TextStyle(\n                  fontSize: 16,\n                  fontWeight: FontWeight.bold,\n                ),\n              ),\n              const SizedBox(height: 6),\n              SelectableText(\n                response.topicItem!.description!,\n                style: TextStyle(color: theme.colorScheme.onSurfaceVariant),\n              ),\n              const SizedBox(height: 10),\n              Row(\n                children: [\n                  Text(\n                    '${NumUtils.numFormat(response.topicItem!.view)}浏览 · ${NumUtils.numFormat(response.topicItem!.discuss)}讨论',\n                    style: TextStyle(\n                      fontSize: 13,\n                      color: theme.colorScheme.outline,\n                    ),\n                  ),\n                  const Spacer(),\n                  OutlinedButton.icon(\n                    style: OutlinedButton.styleFrom(\n                      side: BorderSide(\n                        width: 1,\n                        color: theme.colorScheme.outline.withValues(\n                          alpha: 0.2,\n                        ),\n                      ),\n                      foregroundColor: _controller.isLike.value == true\n                          ? null\n                          : theme.colorScheme.onSurfaceVariant,\n                      padding: const EdgeInsets.symmetric(horizontal: 10),\n                      visualDensity: const VisualDensity(\n                        horizontal: -4,\n                        vertical: -4,\n                      ),\n                      tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n                    ),\n                    onPressed: _controller.onLike,\n                    icon: _controller.isLike.value == true\n                        ? const Icon(FontAwesomeIcons.solidThumbsUp, size: 13)\n                        : const Icon(FontAwesomeIcons.thumbsUp, size: 13),\n                    label: Text(\n                      NumUtils.numFormat(response.topicItem!.like),\n                      style: const TextStyle(fontSize: 13),\n                      textScaler: TextScaler.noScaling,\n                    ),\n                  ),\n                  const SizedBox(width: 10),\n                  OutlinedButton.icon(\n                    style: OutlinedButton.styleFrom(\n                      side: BorderSide(\n                        width: 1,\n                        color: theme.colorScheme.outline.withValues(\n                          alpha: 0.2,\n                        ),\n                      ),\n                      foregroundColor: _controller.isFav.value == true\n                          ? null\n                          : theme.colorScheme.onSurfaceVariant,\n                      padding: const EdgeInsets.symmetric(horizontal: 10),\n                      visualDensity: const VisualDensity(\n                        horizontal: -4,\n                        vertical: -4,\n                      ),\n                      tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n                    ),\n                    onPressed: _controller.onFav,\n                    icon: _controller.isFav.value == true\n                        ? const Icon(FontAwesomeIcons.solidStar, size: 13)\n                        : const Icon(FontAwesomeIcons.star, size: 13),\n                    label: Text(\n                      NumUtils.numFormat(response.topicItem!.fav),\n                      style: const TextStyle(fontSize: 13),\n                      textScaler: TextScaler.noScaling,\n                    ),\n                  ),\n                ],\n              ),\n              const SizedBox(height: 6),\n            ],\n          ),\n        ),\n        actions: [\n          IconButton(\n            onPressed: () => Utils.shareText(\n              '${_controller.topicName} https://m.bilibili.com/topic-detail?topic_id=${_controller.topicId}',\n            ),\n            // https://www.bilibili.com/v/topic/detail?topic_id=${_controller.topicId}\n            icon: const Icon(MdiIcons.share),\n          ),\n          PopupMenuButton(\n            itemBuilder: (context) {\n              return [\n                PopupMenuItem(\n                  onTap: _controller.onFav,\n                  child: Text(\n                    '${_controller.isFav.value == true ? '取消' : ''}收藏',\n                  ),\n                ),\n                PopupMenuItem(\n                  child: const Text('举报'),\n                  onTap: () {\n                    if (!_controller.isLogin) {\n                      SmartDialog.showToast('账号未登录');\n                      return;\n                    }\n                    PageUtils.inAppWebview(\n                      'https://www.bilibili.com/h5/topic-active/topic-report?topic_id=${_controller.topicId}&topic_name=${_controller.topicName}&${Utils.themeUrl(theme.colorScheme.isDark)}',\n                    );\n                  },\n                ),\n              ];\n            },\n          ),\n          const SizedBox(width: 4),\n        ],\n      ),\n      _ => SliverAppBar(\n        pinned: true,\n        title: Text(_controller.topicName),\n      ),\n    };\n  }\n\n  Widget _buildBody(LoadingState<List<TopicCardItem>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => dynSkeleton,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? GlobalData().dynamicsWaterfallFlow\n                  ? SliverWaterfallFlow(\n                      gridDelegate: dynGridDelegate,\n                      delegate: SliverChildBuilderDelegate(\n                        (_, index) {\n                          if (index == response.length - 1) {\n                            _controller.onLoadMore();\n                          }\n\n                          final item = response[index];\n                          if (item.dynamicCardItem != null) {\n                            return DynamicPanel(item: item.dynamicCardItem!);\n                          }\n\n                          return Text(item.topicType ?? 'err');\n                        },\n                        childCount: response.length,\n                      ),\n                    )\n                  : SliverList.builder(\n                      itemBuilder: (context, index) {\n                        if (index == response.length - 1) {\n                          _controller.onLoadMore();\n                        }\n                        final item = response[index];\n                        if (item.dynamicCardItem != null) {\n                          return DynamicPanel(item: item.dynamicCardItem!);\n                        } else {\n                          return Text(item.topicType ?? 'err');\n                        }\n                      },\n                      itemCount: response.length,\n                    )\n            : HttpError(onReload: _controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/dynamics_topic_rcmd/controller.dart",
    "content": "import 'package:PiliPlus/http/dynamics.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_topic_top/topic_item.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\n\nclass DynTopicRcmdController\n    extends CommonListController<List<TopicItem>?, TopicItem> {\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  Future<LoadingState<List<TopicItem>?>> customGetData() =>\n      DynamicsHttp.dynTopicRcmd();\n}\n"
  },
  {
    "path": "lib/pages/dynamics_topic_rcmd/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/common/widgets/view_sliver_safe_area.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/dynamic/dyn_topic_top/topic_item.dart';\nimport 'package:PiliPlus/pages/dynamics_select_topic/widgets/item.dart';\nimport 'package:PiliPlus/pages/dynamics_topic_rcmd/controller.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass DynTopicRcmdPage extends StatefulWidget {\n  const DynTopicRcmdPage({super.key});\n\n  @override\n  State<DynTopicRcmdPage> createState() => _DynTopicRcmdPageState();\n}\n\nclass _DynTopicRcmdPageState extends State<DynTopicRcmdPage> {\n  final DynTopicRcmdController _controller = Get.put(DynTopicRcmdController());\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(title: const Text('话题')),\n      body: refreshIndicator(\n        onRefresh: _controller.onRefresh,\n        child: CustomScrollView(\n          physics: const AlwaysScrollableScrollPhysics(),\n          slivers: [\n            ViewSliverSafeArea(\n              sliver: Obx(() => _buildBody(_controller.loadingState.value)),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget _buildBody(LoadingState<List<TopicItem>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => linearLoading,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverList.builder(\n                itemCount: response.length,\n                itemBuilder: (context, index) {\n                  return DynTopicItem(\n                    item: response[index],\n                    onTap: (item) => Get.toNamed(\n                      '/dynTopic',\n                      parameters: {\n                        'id': item.id.toString(),\n                        'name': item.name,\n                      },\n                    ),\n                  );\n                },\n              )\n            : HttpError(onReload: _controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/emote/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/reply.dart';\nimport 'package:PiliPlus/models_new/emote/package.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass EmotePanelController extends CommonListController<List<Package>?, Package>\n    with GetSingleTickerProviderStateMixin {\n  TabController? tabController;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  bool customHandleResponse(bool isRefresh, Success<List<Package>?> response) {\n    if (response.response?.isNotEmpty == true) {\n      tabController = TabController(\n        length: response.response!.length,\n        vsync: this,\n      );\n    }\n    loadingState.value = response;\n    return true;\n  }\n\n  @override\n  Future<LoadingState<List<Package>?>> customGetData() =>\n      ReplyHttp.getEmoteList(business: 'reply');\n\n  @override\n  void onClose() {\n    tabController?.dispose();\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "lib/pages/emote/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/custom_tooltip.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models_new/emote/emote.dart';\nimport 'package:PiliPlus/models_new/emote/package.dart';\nimport 'package:PiliPlus/pages/emote/controller.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass EmotePanel extends StatefulWidget {\n  final Function(Emote emote, double? width, double? height) onChoose;\n\n  const EmotePanel({super.key, required this.onChoose});\n\n  @override\n  State<EmotePanel> createState() => _EmotePanelState();\n}\n\nclass _EmotePanelState extends State<EmotePanel>\n    with AutomaticKeepAliveClientMixin {\n  final EmotePanelController _emotePanelController = Get.put(\n    EmotePanelController(),\n  );\n\n  @override\n  bool get wantKeepAlive => true;\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final ThemeData theme = Theme.of(context);\n    return Obx(\n      () => _buildBody(theme, _emotePanelController.loadingState.value),\n    );\n  }\n\n  Widget _buildBody(\n    ThemeData theme,\n    LoadingState<List<Package>?> loadingState,\n  ) {\n    late final color = ElevationOverlay.colorWithOverlay(\n      theme.colorScheme.surface,\n      theme.hoverColor,\n      Get.currentRoute.startsWith('/whisperDetail') ? 8 : 2,\n    );\n    return switch (loadingState) {\n      Loading() => m3eLoading,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? Column(\n                children: [\n                  Expanded(\n                    child: tabBarView(\n                      controller: _emotePanelController.tabController,\n                      children: response.map(\n                        (e) {\n                          final emote = e.emote;\n                          if (emote == null || emote.isEmpty) {\n                            return const SizedBox.shrink();\n                          }\n                          final flag = emote.first.meta?.size == 1;\n                          final size = flag ? 40.0 : 60.0;\n                          final isTextEmote = e.type == 4;\n                          return GridView.builder(\n                            physics: const ClampingScrollPhysics(),\n                            padding: const EdgeInsets.only(\n                              left: 12,\n                              right: 12,\n                              bottom: 12,\n                            ),\n                            gridDelegate:\n                                SliverGridDelegateWithMaxCrossAxisExtent(\n                                  maxCrossAxisExtent: isTextEmote ? 100 : size,\n                                  crossAxisSpacing: 8,\n                                  mainAxisSpacing: 8,\n                                  mainAxisExtent: size,\n                                ),\n                            itemCount: emote.length,\n                            itemBuilder: (context, index) {\n                              final item = emote[index];\n                              Widget child = Padding(\n                                padding: const EdgeInsets.all(6),\n                                child: isTextEmote\n                                    ? Center(\n                                        child: Text(\n                                          item.text ?? '',\n                                          overflow: TextOverflow.clip,\n                                          maxLines: 1,\n                                        ),\n                                      )\n                                    : NetworkImgLayer(\n                                        src: item.url,\n                                        width: size,\n                                        height: size,\n                                        type: ImageType.emote,\n                                        fit: BoxFit.contain,\n                                      ),\n                              );\n                              if (!isTextEmote) {\n                                child = CustomTooltip(\n                                  indicator: () => Triangle(\n                                    color: color,\n                                    size: const Size(14, 8),\n                                  ),\n                                  overlayWidget: () => Container(\n                                    padding: const EdgeInsets.all(8),\n                                    decoration: BoxDecoration(\n                                      color: color,\n                                      borderRadius: const BorderRadius.all(\n                                        Radius.circular(8),\n                                      ),\n                                    ),\n                                    child: Column(\n                                      spacing: 4,\n                                      mainAxisSize: MainAxisSize.min,\n                                      children: [\n                                        NetworkImgLayer(\n                                          src: item.url,\n                                          width: 65,\n                                          height: 65,\n                                          type: ImageType.emote,\n                                          fit: BoxFit.contain,\n                                        ),\n                                        Text(\n                                          item.meta?.alias ??\n                                              item.text?.substring(\n                                                1,\n                                                item.text!.length - 1,\n                                              ) ??\n                                              '',\n                                          style: const TextStyle(fontSize: 12),\n                                        ),\n                                      ],\n                                    ),\n                                  ),\n                                  child: child,\n                                );\n                              }\n                              return Material(\n                                type: MaterialType.transparency,\n                                child: InkWell(\n                                  borderRadius: const BorderRadius.all(\n                                    Radius.circular(6),\n                                  ),\n                                  onTap: () => widget.onChoose(\n                                    item,\n                                    isTextEmote\n                                        ? null\n                                        : flag\n                                        ? 24\n                                        : 42,\n                                    null,\n                                  ),\n                                  child: child,\n                                ),\n                              );\n                            },\n                          );\n                        },\n                      ).toList(),\n                    ),\n                  ),\n                  Divider(\n                    height: 1,\n                    color: theme.dividerColor.withValues(alpha: 0.1),\n                  ),\n                  Row(\n                    children: [\n                      Padding(\n                        padding: const EdgeInsets.symmetric(horizontal: 10),\n                        child: iconButton(\n                          iconSize: 20,\n                          iconColor: theme.colorScheme.onSurfaceVariant\n                              .withValues(alpha: 0.8),\n                          onPressed: () => Get.toNamed(\n                            '/webview',\n                            parameters: {\n                              'url':\n                                  'https://www.bilibili.com/h5/mall/emoji-package/home?navhide=1&${Utils.themeUrl(theme.colorScheme.isDark)}',\n                            },\n                          ),\n                          icon: const Icon(Icons.settings),\n                        ),\n                      ),\n                      Expanded(\n                        child: TabBar(\n                          controller: _emotePanelController.tabController,\n                          padding: const EdgeInsets.only(right: 60),\n                          dividerColor: Colors.transparent,\n                          dividerHeight: 0,\n                          isScrollable: true,\n                          tabs: response\n                              .map(\n                                (e) => Padding(\n                                  padding: const EdgeInsets.all(8),\n                                  child: NetworkImgLayer(\n                                    width: 24,\n                                    height: 24,\n                                    type: ImageType.emote,\n                                    src: e.url,\n                                  ),\n                                ),\n                              )\n                              .toList(),\n                        ),\n                      ),\n                    ],\n                  ),\n                  SizedBox(height: MediaQuery.viewPaddingOf(context).bottom),\n                ],\n              )\n            : _errorWidget(),\n      Error(:final errMsg) => _errorWidget(errMsg),\n    };\n  }\n\n  Widget _errorWidget([String? errMsg]) => Center(\n    child: TextButton.icon(\n      onPressed: _emotePanelController.onReload,\n      icon: const Icon(Icons.refresh),\n      label: Text(errMsg ?? '没有数据'),\n    ),\n  );\n}\n"
  },
  {
    "path": "lib/pages/episode_panel/view.dart",
    "content": "import 'dart:math';\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/flutter/page/tabs.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/keep_alive_wrapper.dart';\nimport 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/common/widgets/stat/stat.dart';\nimport 'package:PiliPlus/http/fav.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/video.dart';\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models/common/episode_panel_type.dart';\nimport 'package:PiliPlus/models/common/stat_type.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/episode.dart' as pgc;\nimport 'package:PiliPlus/models_new/video/video_detail/episode.dart' as ugc;\nimport 'package:PiliPlus/models_new/video/video_detail/page.dart';\nimport 'package:PiliPlus/pages/common/slide/common_slide_page.dart';\nimport 'package:PiliPlus/pages/video/controller.dart';\nimport 'package:PiliPlus/pages/video/introduction/ugc/controller.dart';\nimport 'package:PiliPlus/pages/video/introduction/ugc/widgets/page.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/duration_utils.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart' hide TabBarView;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\n\nclass EpisodePanel extends CommonSlidePage {\n  const EpisodePanel({\n    super.key,\n    super.enableSlide,\n    required this.ugcIntroController,\n    required this.heroTag,\n    required this.type,\n    // required this.count,\n    // required this.name,\n    required this.aid,\n    required this.bvid,\n    required this.cid,\n    required this.cover,\n    this.showTitle = true,\n    required this.list,\n    this.seasonId,\n    this.initialTabIndex = 0,\n    this.isSupportReverse,\n    this.isReversed,\n    this.onReverse,\n    required this.onChangeEpisode,\n    this.onClose,\n  }) : assert(type == EpisodeType.pgc || ugcIntroController != null);\n\n  final UgcIntroController? ugcIntroController;\n  final String heroTag;\n  final EpisodeType type;\n  // final int count;\n  // final String name;\n  final int? aid;\n  final String bvid;\n  final int cid;\n  final String? cover;\n  final bool showTitle;\n  final List list;\n  final int? seasonId;\n  final int initialTabIndex;\n  final bool? isSupportReverse;\n  final bool? isReversed;\n  final Future<bool> Function(ugc.BaseEpisodeItem) onChangeEpisode;\n  final VoidCallback? onReverse;\n  final VoidCallback? onClose;\n\n  @override\n  State<EpisodePanel> createState() => _EpisodePanelState();\n}\n\nclass _EpisodePanelState extends State<EpisodePanel>\n    with TickerProviderStateMixin, CommonSlideMixin {\n  // tab\n  late final TabController _tabController;\n  late final RxInt _currentTabIndex = _tabController.index.obs;\n\n  late final showTitle = widget.showTitle;\n\n  List<ugc.BaseEpisodeItem> get _getCurrEpisodes =>\n      widget.type == EpisodeType.season\n      ? widget.list[_currentTabIndex.value].episodes\n      : widget.list[_currentTabIndex.value];\n\n  // item\n  late int _currentItemIndex;\n  int get _findCurrentItemIndex => max(\n    0,\n    _getCurrEpisodes.indexWhere((item) => item.cid == widget.cid),\n  );\n\n  late final List<bool> _isReversed;\n  late final List<ScrollController> _itemScrollController;\n\n  // fav\n  Rx<LoadingState<bool>>? _favState;\n\n  void listener() {\n    _currentTabIndex.value = _tabController.index;\n  }\n\n  @override\n  void didUpdateWidget(EpisodePanel oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (showTitle) {\n      return;\n    }\n\n    @pragma('vm:notify-debugger-on-exception')\n    void jumpToCurrent() {\n      final newItemIndex = _findCurrentItemIndex;\n      if (_currentItemIndex != newItemIndex) {\n        _currentItemIndex = newItemIndex;\n        try {\n          _itemScrollController[_currentTabIndex.value].jumpTo(\n            _calcItemOffset(newItemIndex),\n          );\n        } catch (e, s) {\n          Utils.reportError(e, s);\n        }\n      }\n    }\n\n    // jump to current\n    if (_currentTabIndex.value != widget.initialTabIndex) {\n      _tabController.animateTo(\n        widget.initialTabIndex,\n        duration: const Duration(milliseconds: 200),\n      );\n      Future.delayed(const Duration(milliseconds: 300), jumpToCurrent);\n    } else {\n      jumpToCurrent();\n    }\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    _tabController = TabController(\n      initialIndex: widget.initialTabIndex,\n      length: widget.list.length,\n      vsync: this,\n    )..addListener(listener);\n\n    _currentItemIndex = _findCurrentItemIndex;\n    _itemScrollController = List.generate(\n      widget.list.length,\n      (i) => ScrollController(\n        initialScrollOffset: i == widget.initialTabIndex\n            ? _currentItemIndex == 0\n                  ? 0\n                  : _calcItemOffset(_currentItemIndex)\n            : 0,\n      ),\n      growable: false,\n    );\n    _isReversed = List.filled(widget.list.length, false);\n\n    if (widget.type == EpisodeType.season && Accounts.main.isLogin) {\n      final favState =\n          widget.ugcIntroController?.seasonFavState[widget.seasonId];\n      if (favState != null) {\n        _favState = Success(favState).obs;\n      } else {\n        _favState = LoadingState<bool>.loading().obs;\n        VideoHttp.videoRelation(bvid: widget.bvid).then(\n          (result) {\n            if (!mounted) return;\n            if (result case Success(:final response)) {\n              final seasonFav = response.seasonFav ?? false;\n              _favState!.value = Success(seasonFav);\n              widget.ugcIntroController?.seasonFavState[widget.seasonId] =\n                  seasonFav;\n            }\n          },\n        );\n      }\n    }\n  }\n\n  @override\n  void dispose() {\n    _tabController\n      ..removeListener(listener)\n      ..dispose();\n    _favState?.close();\n    for (final e in _itemScrollController) {\n      e.dispose();\n    }\n    super.dispose();\n  }\n\n  late final _isMulti =\n      widget.type == EpisodeType.season && widget.list.length > 1;\n\n  @override\n  Widget buildPage(ThemeData theme) {\n    return Material(\n      color: showTitle ? theme.colorScheme.surface : null,\n      type: showTitle ? MaterialType.canvas : MaterialType.transparency,\n      child: Column(\n        children: [\n          _buildToolbar(theme),\n          if (_isMulti)\n            TabBar(\n              controller: _tabController,\n              padding: const EdgeInsets.only(right: 60),\n              isScrollable: true,\n              tabs: widget.list.map((item) => Tab(text: item.title)).toList(),\n              dividerHeight: 1,\n              dividerColor: theme.dividerColor.withValues(alpha: 0.1),\n            ),\n          Expanded(child: enableSlide ? slideList(theme) : buildList(theme)),\n        ],\n      ),\n    );\n  }\n\n  @override\n  Widget buildList(ThemeData theme) {\n    if (_isMulti) {\n      return TabBarView<TabBarDragGestureRecognizer>(\n        controller: _tabController,\n        physics: clampingScrollPhysics,\n        horizontalDragGestureRecognizer: () =>\n            TabBarDragGestureRecognizer(isDxAllowed: isDxAllowed),\n        children: List.generate(\n          widget.list.length,\n          (index) => _buildBody(\n            theme,\n            index,\n            widget.list[index].episodes,\n          ),\n        ),\n      );\n    }\n    return _buildBody(theme, 0, _getCurrEpisodes);\n  }\n\n  double _calcItemOffset(int index) {\n    if (showTitle) {\n      final episodes = _getCurrEpisodes;\n      double offset = 0;\n      for (var i = 0; i < index; i++) {\n        offset += _calcItemHeight(episodes[i]);\n      }\n      return offset + 7;\n    } else {\n      return index * 100 + 7;\n    }\n  }\n\n  double _calcItemHeight(ugc.BaseEpisodeItem episode) {\n    if (episode is ugc.EpisodeItem && episode.pages!.length > 1) {\n      return 145; // 98 + 2 + 10 + 35\n    }\n    return 100;\n  }\n\n  Widget _buildBody(\n    ThemeData theme,\n    int tabIndex,\n    List<ugc.BaseEpisodeItem> episodes,\n  ) {\n    final isCurrTab = tabIndex == widget.initialTabIndex;\n    return KeepAliveWrapper(\n      child: CustomScrollView(\n        reverse: _isReversed[tabIndex],\n        physics: const AlwaysScrollableScrollPhysics(),\n        controller: _itemScrollController[tabIndex],\n        slivers: [\n          SliverPadding(\n            padding: EdgeInsets.only(\n              top: 7,\n              bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n            ),\n            sliver: showTitle\n                ? SliverVariedExtentList.builder(\n                    itemCount: episodes.length,\n                    itemBuilder: (context, index) {\n                      final episode = episodes[index];\n                      final isCurrItem = isCurrTab\n                          ? index == _currentItemIndex\n                          : false;\n                      Widget episodeItem = _buildEpisodeItem(\n                        theme: theme,\n                        episode: episode,\n                        index: index,\n                        length: episodes.length,\n                        isCurrentIndex: isCurrItem,\n                      );\n                      if (episode is ugc.EpisodeItem &&\n                          episode.pages!.length > 1) {\n                        return Column(\n                          mainAxisSize: MainAxisSize.min,\n                          crossAxisAlignment: CrossAxisAlignment.start,\n                          children: [\n                            episodeItem, // 98\n                            Padding(\n                              padding: const EdgeInsets.symmetric(\n                                horizontal: 12,\n                                vertical: 5,\n                              ), // 10\n                              child: PagesPanel(\n                                // 35\n                                list: isCurrTab && isCurrItem\n                                    ? null\n                                    : episode.pages,\n                                cover: episode.arc?.pic,\n                                heroTag: widget.heroTag,\n                                ugcIntroController: widget.ugcIntroController!,\n                                bvid:\n                                    episode.bvid ?? IdUtils.av2bv(episode.aid!),\n                              ),\n                            ),\n                          ],\n                        );\n                      }\n                      return episodeItem;\n                    },\n                    itemExtentBuilder: (index, _) =>\n                        _calcItemHeight(episodes[index]),\n                  )\n                : SliverFixedExtentList.builder(\n                    itemCount: episodes.length,\n                    itemBuilder: (context, index) {\n                      final episode = episodes[index];\n                      final isCurrItem = isCurrTab\n                          ? index == _currentItemIndex\n                          : false;\n                      return _buildEpisodeItem(\n                        theme: theme,\n                        episode: episode,\n                        index: index,\n                        length: episodes.length,\n                        isCurrentIndex: isCurrItem,\n                      );\n                    },\n                    itemExtent: 100,\n                  ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  late final int? vipStatus = Pref.userInfoCache?.vipStatus;\n  Widget _buildEpisodeItem({\n    required ThemeData theme,\n    required ugc.BaseEpisodeItem episode,\n    required int index,\n    required int length,\n    required bool isCurrentIndex,\n  }) {\n    late String title;\n    String? cover;\n    String? bvid;\n    num? duration;\n    int? pubdate;\n    int? view;\n    int? danmaku;\n    bool? isCharging;\n    bool? cacheWidth;\n\n    switch (episode) {\n      case Part part:\n        cover = part.firstFrame ?? widget.cover;\n        title = part.part!;\n        duration = part.duration;\n        pubdate = part.ctime;\n        cacheWidth = part.dimension?.cacheWidth;\n        break;\n      case ugc.EpisodeItem item:\n        title = item.title!;\n        bvid = item.bvid;\n        if (item.arc case final arc?) {\n          cover = arc.pic;\n          duration = arc.duration;\n          pubdate = arc.pubdate;\n          if (arc.stat case final stat?) {\n            view = stat.view;\n            danmaku = stat.danmaku;\n          }\n          cacheWidth = arc.dimension?.cacheWidth;\n        }\n        if (item.attribute == 8) {\n          isCharging = true;\n        }\n        break;\n      case pgc.EpisodeItem item:\n        bvid = item.bvid;\n        title = item.showTitle ?? item.title!;\n        cover = item.cover;\n        if (item.from == 'pugv') {\n          duration = item.duration;\n          view = item.play;\n        } else {\n          duration = item.duration == null ? null : item.duration! ~/ 1000;\n        }\n        pubdate = item.pubTime;\n        cacheWidth = item.dimension?.cacheWidth;\n        break;\n    }\n    late final Color primary = theme.colorScheme.primary;\n\n    void onLongPress() {\n      if (cover?.isNotEmpty == true) {\n        imageSaveDialog(title: title, cover: cover, bvid: bvid);\n      }\n    }\n\n    return Padding(\n      padding: const EdgeInsets.only(bottom: 2),\n      child: SizedBox(\n        height: 98,\n        child: Material(\n          type: MaterialType.transparency,\n          child: InkWell(\n            onTap: () {\n              if (episode.badge == \"会员\" && vipStatus != 1) {\n                SmartDialog.showToast('需要大会员');\n                // return;\n              }\n              SmartDialog.showToast('切换到：$title');\n              widget.onClose?.call();\n\n              widget.onChangeEpisode(episode).then((res) {\n                if (res) {\n                  if (!showTitle) {\n                    _currentItemIndex = index;\n                  }\n                  if (widget.type == EpisodeType.season) {\n                    try {\n                      Get.find<VideoDetailController>(\n                        tag: widget.ugcIntroController!.heroTag,\n                      ).seasonCid = episode.cid;\n                    } catch (_) {\n                      if (kDebugMode) rethrow;\n                    }\n                  }\n                }\n              });\n            },\n            onLongPress: onLongPress,\n            onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n            child: Padding(\n              padding: const EdgeInsets.symmetric(\n                horizontal: StyleString.safeSpace,\n                vertical: 5,\n              ),\n              child: Row(\n                spacing: 10,\n                children: [\n                  if (cover?.isNotEmpty == true)\n                    Stack(\n                      clipBehavior: Clip.none,\n                      children: [\n                        NetworkImgLayer(\n                          src: cover,\n                          width: 140.8,\n                          height: 88,\n                          cacheWidth: cacheWidth,\n                        ),\n                        if (duration != null && duration > 0)\n                          PBadge(\n                            text: DurationUtils.formatDuration(duration),\n                            right: 6.0,\n                            bottom: 6.0,\n                            type: PBadgeType.gray,\n                          ),\n                        if (isCharging == true)\n                          const PBadge(\n                            text: '充电专属',\n                            top: 6,\n                            right: 6,\n                            type: PBadgeType.error,\n                          )\n                        else if (episode.badge != null)\n                          PBadge(\n                            text: episode.badge,\n                            top: 6,\n                            right: 6,\n                            type: switch (episode.badge) {\n                              '预告' => PBadgeType.gray,\n                              '限免' => PBadgeType.free,\n                              _ => PBadgeType.primary,\n                            },\n                          ),\n                      ],\n                    )\n                  else if (isCurrentIndex)\n                    Image.asset(\n                      'assets/images/live.png',\n                      color: primary,\n                      height: 12,\n                      cacheHeight: 12.cacheSize(context),\n                      semanticLabel: \"正在播放：\",\n                    ),\n                  Expanded(\n                    child: Column(\n                      mainAxisSize: MainAxisSize.min,\n                      crossAxisAlignment: CrossAxisAlignment.start,\n                      children: [\n                        Expanded(\n                          child: Text(\n                            title,\n                            textAlign: TextAlign.start,\n                            style: TextStyle(\n                              fontSize: theme.textTheme.bodyMedium!.fontSize,\n                              height: 1.42,\n                              letterSpacing: 0.3,\n                              fontWeight: isCurrentIndex\n                                  ? FontWeight.bold\n                                  : null,\n                              color: isCurrentIndex ? primary : null,\n                            ),\n                            maxLines: 2,\n                            overflow: TextOverflow.ellipsis,\n                          ),\n                        ),\n                        if (pubdate != null)\n                          Text(\n                            DateFormatUtils.format(pubdate),\n                            maxLines: 1,\n                            style: TextStyle(\n                              fontSize: 12,\n                              height: 1,\n                              color: theme.colorScheme.outline,\n                              overflow: TextOverflow.clip,\n                            ),\n                          ),\n                        if (view != null) ...[\n                          const SizedBox(height: 2),\n                          Row(\n                            spacing: 8,\n                            children: [\n                              StatWidget(\n                                value: view,\n                                type: StatType.play,\n                              ),\n                              if (danmaku != null)\n                                StatWidget(\n                                  value: danmaku,\n                                  type: StatType.danmaku,\n                                ),\n                            ],\n                          ),\n                        ],\n                      ],\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget _buildFavBtn(LoadingState<bool> loadingState) {\n    return switch (loadingState) {\n      Success(:final response) => iconButton(\n        iconSize: 22,\n        tooltip: response ? '取消订阅' : '订阅',\n        icon: response\n            ? const Icon(Icons.notifications_off_outlined)\n            : const Icon(Icons.notifications_active_outlined),\n        onPressed: () async {\n          final res = await FavHttp.seasonFav(\n            isFav: response,\n            seasonId: widget.seasonId,\n          );\n          if (res.isSuccess) {\n            SmartDialog.showToast('${response ? '取消' : ''}订阅成功');\n            _favState!.value = Success(!response);\n            widget.ugcIntroController?.seasonFavState[widget.seasonId] =\n                !response;\n          } else {\n            res.toast();\n          }\n        },\n      ),\n      _ => const SizedBox.shrink(),\n    };\n  }\n\n  Widget get _buildReverseBtn => iconButton(\n    iconSize: 22,\n    tooltip: widget.isReversed == true ? '正序播放' : '倒序播放',\n    icon: widget.isReversed == true\n        ? const Icon(MdiIcons.sortDescending)\n        : const Icon(MdiIcons.sortAscending),\n    onPressed: () => widget.onReverse?.call(),\n  );\n\n  void _animToTopOrBottom({bool top = true}) {\n    final tabIndex = _currentTabIndex.value;\n    _itemScrollController[tabIndex].animTo(\n      top ^ _isReversed[tabIndex]\n          ? 0\n          : _calcItemOffset(_getCurrEpisodes.length),\n      duration: const Duration(milliseconds: 200),\n    );\n  }\n\n  Widget _buildToolbar(ThemeData theme) => Container(\n    height: 45,\n    padding: EdgeInsets.symmetric(horizontal: showTitle ? 14 : 6),\n    decoration: BoxDecoration(\n      border: Border(\n        bottom: BorderSide(\n          color: theme.dividerColor.withValues(alpha: 0.1),\n        ),\n      ),\n    ),\n    child: Row(\n      children: [\n        if (showTitle)\n          Text(\n            widget.type.title,\n            style: theme.textTheme.titleMedium,\n          ),\n        if (_favState != null) Obx(() => _buildFavBtn(_favState!.value)),\n        iconButton(\n          iconSize: 22,\n          tooltip: '跳至顶部',\n          icon: const Icon(Icons.vertical_align_top),\n          onPressed: _animToTopOrBottom,\n        ),\n        iconButton(\n          iconSize: 22,\n          tooltip: '跳至底部',\n          icon: const Icon(Icons.vertical_align_bottom),\n          onPressed: () => _animToTopOrBottom(top: false),\n        ),\n        iconButton(\n          iconSize: 22,\n          tooltip: '跳至当前',\n          icon: const Icon(Icons.my_location),\n          onPressed: () async {\n            final currentTabIndex = _currentTabIndex.value;\n            if (currentTabIndex != widget.initialTabIndex) {\n              _tabController.animateTo(widget.initialTabIndex);\n              await Future.delayed(const Duration(milliseconds: 225));\n            }\n            _itemScrollController[widget.initialTabIndex].animTo(\n              _calcItemOffset(_currentItemIndex),\n              duration: const Duration(milliseconds: 200),\n            );\n          },\n        ),\n        if (widget.isSupportReverse == true)\n          Obx(\n            () {\n              return _currentTabIndex.value == widget.initialTabIndex\n                  ? _buildReverseBtn\n                  : const SizedBox.shrink();\n            },\n          ),\n        const Spacer(),\n        Obx(\n          () {\n            final currentTabIndex = _currentTabIndex.value;\n            return iconButton(\n              iconSize: 22,\n              tooltip: _isReversed[currentTabIndex] ? '顺序' : '倒序',\n              icon: !_isReversed[currentTabIndex]\n                  ? const Icon(MdiIcons.sortNumericAscending)\n                  : const Icon(MdiIcons.sortNumericDescending),\n              onPressed: () => setState(() {\n                _isReversed[currentTabIndex] = !_isReversed[currentTabIndex];\n              }),\n            );\n          },\n        ),\n        if (widget.onClose != null)\n          iconButton(\n            iconSize: 22,\n            tooltip: '关闭',\n            icon: const Icon(Icons.close),\n            onPressed: widget.onClose,\n          ),\n      ],\n    ),\n  );\n}\n"
  },
  {
    "path": "lib/pages/exp_log/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/user.dart';\nimport 'package:PiliPlus/models_new/coin_log/data.dart';\nimport 'package:PiliPlus/models_new/coin_log/list.dart';\nimport 'package:PiliPlus/pages/log_table/controller.dart';\n\nclass ExpLogController extends LogController<CoinLogData, CoinLogItem> {\n  @override\n  List<CoinLogItem>? getDataList(CoinLogData response) {\n    return response.list;\n  }\n\n  @override\n  Future<LoadingState<CoinLogData>> customGetData() => UserHttp.expLog();\n\n  @override\n  List<(int, String)> getFlexAndText(CoinLogItem item) {\n    return [(2, item.time), (1, item.delta), (2, item.reason)];\n  }\n\n  @override\n  final CoinLogItem header = const CoinLogItem(\n    time: '时间',\n    delta: '变化',\n    reason: '原因',\n  );\n\n  @override\n  final String title = '经验记录';\n}\n"
  },
  {
    "path": "lib/pages/fan/controller.dart",
    "content": "import 'package:PiliPlus/http/fan.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/video.dart';\nimport 'package:PiliPlus/models_new/follow/data.dart';\nimport 'package:PiliPlus/pages/follow_type/controller.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass FansController extends FollowTypeController {\n  FansController(this.showName);\n  final bool showName;\n  late final bool isOwner;\n\n  @override\n  void init() {\n    final Map? args = Get.arguments;\n    final ownerMid = Accounts.main.mid;\n    final int? mid = args?['mid'];\n    this.mid = mid ?? ownerMid;\n    isOwner = ownerMid == this.mid;\n    if (showName && !isOwner) {\n      final String? name = args?['name'];\n      this.name = RxnString(name);\n      if (name == null) {\n        queryUserName();\n      }\n    }\n    queryData();\n  }\n\n  @override\n  Future<LoadingState<FollowData>> customGetData() => FanHttp.fans(\n    vmid: mid,\n    pn: page,\n    orderType: 'attention',\n  );\n\n  Future<void> onRemoveFan(int index, int mid) async {\n    final res = await VideoHttp.relationMod(\n      mid: mid,\n      act: 7,\n      reSrc: 11,\n    );\n    if (res.isSuccess) {\n      loadingState\n        ..value.data!.removeAt(index)\n        ..refresh();\n      SmartDialog.showToast('移除成功');\n    } else {\n      res.toast();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/fan/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/models_new/follow/list.dart';\nimport 'package:PiliPlus/pages/fan/controller.dart';\nimport 'package:PiliPlus/pages/follow_type/view.dart';\nimport 'package:PiliPlus/pages/follow_type/widgets/item.dart';\nimport 'package:PiliPlus/pages/share/view.dart' show UserModel;\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass FansPage extends StatefulWidget {\n  const FansPage({\n    super.key,\n    this.showName = true,\n    this.onSelect,\n  });\n\n  final bool showName;\n  final ValueChanged<UserModel>? onSelect;\n\n  @override\n  State<FansPage> createState() => _FansPageState();\n\n  static void toFansPage({dynamic mid, String? name}) {\n    if (mid == null) {\n      return;\n    }\n    Get.toNamed(\n      '/fan',\n      arguments: {\n        'mid': Utils.safeToInt(mid),\n        'name': name,\n      },\n    );\n  }\n}\n\nclass _FansPageState extends FollowTypePageState<FansPage> {\n  @override\n  late final FansController controller;\n  late final flag = widget.onSelect == null && controller.isOwner;\n\n  @override\n  void initState() {\n    super.initState();\n    controller = Get.put(\n      FansController(widget.showName),\n      tag: Get.arguments?['mid']?.toString() ?? Utils.generateRandomString(8),\n    );\n  }\n\n  @override\n  PreferredSizeWidget? get appBar => widget.showName\n      ? AppBar(\n          title: controller.isOwner\n              ? const Text('我的粉丝')\n              : Obx(() {\n                  final name = controller.name.value;\n                  if (name != null) return Text('$name的粉丝');\n                  return const SizedBox.shrink();\n                }),\n        )\n      : null;\n\n  @override\n  Widget buildItem(int index, FollowItemModel item) {\n    void onRemove() => showConfirmDialog(\n      context: context,\n      title: '确定移除 ${item.uname} ？',\n      onConfirm: () => controller.onRemoveFan(index, item.mid),\n    );\n\n    return FollowTypeItem(\n      item: item,\n      onTap: () {\n        if (widget.onSelect != null) {\n          widget.onSelect!(\n            UserModel(\n              mid: item.mid,\n              name: item.uname!,\n              avatar: item.face!,\n              selected: true,\n            ),\n          );\n          return;\n        }\n        Get.toNamed('/member?mid=${item.mid}');\n      },\n      onLongPress: flag ? onRemove : null,\n      onSecondaryTap: flag && !PlatformUtils.isMobile ? onRemove : null,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/fav/article/controller.dart",
    "content": "import 'package:PiliPlus/http/fav.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/fav/fav_article/data.dart';\nimport 'package:PiliPlus/models_new/fav/fav_article/item.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\n\nclass FavArticleController\n    extends CommonListController<FavArticleData, FavArticleItemModel> {\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  List<FavArticleItemModel>? getDataList(FavArticleData response) {\n    if (response.hasMore == false) {\n      isEnd = true;\n    }\n    return response.items;\n  }\n\n  @override\n  Future<LoadingState<FavArticleData>> customGetData() =>\n      FavHttp.favArticle(page: page);\n\n  Future<void> onRemove(int index, String id) async {\n    final res = await FavHttp.communityAction(opusId: id, action: 4);\n    if (res.isSuccess) {\n      loadingState\n        ..value.data!.removeAt(index)\n        ..refresh();\n      SmartDialog.showToast('已取消收藏');\n    } else {\n      res.toast();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/fav/article/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/fav/fav_article/item.dart';\nimport 'package:PiliPlus/pages/fav/article/controller.dart';\nimport 'package:PiliPlus/pages/fav/article/widget/item.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass FavArticlePage extends StatefulWidget {\n  const FavArticlePage({super.key});\n\n  @override\n  State<FavArticlePage> createState() => _FavArticlePageState();\n}\n\nclass _FavArticlePageState extends State<FavArticlePage>\n    with AutomaticKeepAliveClientMixin, GridMixin {\n  final FavArticleController _favArticleController = Get.put(\n    FavArticleController(),\n  );\n\n  @override\n  bool get wantKeepAlive => true;\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    return refreshIndicator(\n      onRefresh: _favArticleController.onRefresh,\n      child: CustomScrollView(\n        controller: _favArticleController.scrollController,\n        physics: const AlwaysScrollableScrollPhysics(),\n        slivers: [\n          SliverPadding(\n            padding: EdgeInsets.only(\n              top: 7,\n              bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n            ),\n            sliver: Obx(\n              () => _buildBody(_favArticleController.loadingState.value),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget _buildBody(LoadingState<List<FavArticleItemModel>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => gridSkeleton,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverGrid.builder(\n                gridDelegate: gridDelegate,\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    _favArticleController.onLoadMore();\n                  }\n                  final item = response[index];\n                  return FavArticleItem(\n                    item: item,\n                    onDelete: () => showConfirmDialog(\n                      context: context,\n                      title: '确定取消收藏？',\n                      onConfirm: () =>\n                          _favArticleController.onRemove(index, item.opusId!),\n                    ),\n                  );\n                },\n                itemCount: response.length,\n              )\n            : HttpError(onReload: _favArticleController.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _favArticleController.onReload,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/fav/article/widget/item.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/stat/stat.dart';\nimport 'package:PiliPlus/models/common/stat_type.dart';\nimport 'package:PiliPlus/models_new/fav/fav_article/item.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\nimport 'package:get/get.dart';\n\nclass FavArticleItem extends StatelessWidget {\n  const FavArticleItem({\n    super.key,\n    required this.item,\n    required this.onDelete,\n  });\n\n  final FavArticleItemModel item;\n  final VoidCallback onDelete;\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    return Material(\n      type: MaterialType.transparency,\n      child: Stack(\n        clipBehavior: Clip.none,\n        children: [\n          InkWell(\n            onTap: () => Get.toNamed(\n              '/articlePage',\n              parameters: {\n                'id': item.opusId!.toString(),\n                'type': 'opus',\n              },\n            ),\n            child: Padding(\n              padding: const EdgeInsets.symmetric(\n                horizontal: StyleString.safeSpace,\n                vertical: 5,\n              ),\n              child: Row(\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  if (item.cover != null) ...[\n                    AspectRatio(\n                      aspectRatio: StyleString.aspectRatio,\n                      child: LayoutBuilder(\n                        builder: (context, boxConstraints) {\n                          return NetworkImgLayer(\n                            src: item.cover!.url,\n                            width: boxConstraints.maxWidth,\n                            height: boxConstraints.maxHeight,\n                          );\n                        },\n                      ),\n                    ),\n                    const SizedBox(width: 10),\n                  ],\n                  Expanded(\n                    child: Column(\n                      mainAxisSize: MainAxisSize.min,\n                      crossAxisAlignment: CrossAxisAlignment.start,\n                      children: [\n                        Expanded(\n                          child: Text(\n                            item.content!,\n                            style: TextStyle(\n                              fontSize: theme.textTheme.bodyMedium!.fontSize,\n                              height: 1.42,\n                              letterSpacing: 0.3,\n                            ),\n                            maxLines: 2,\n                            overflow: TextOverflow.ellipsis,\n                          ),\n                        ),\n                        Text(\n                          item.author!.name!,\n                          maxLines: 1,\n                          style: TextStyle(\n                            fontSize: 13,\n                            height: 1,\n                            color: theme.colorScheme.outline,\n                          ),\n                        ),\n                        const SizedBox(height: 3),\n                        Row(\n                          children: [\n                            StatWidget(\n                              type: StatType.like,\n                              value: item.stat!.like,\n                              color: theme.colorScheme.outline,\n                            ),\n                            Text(\n                              '  ·  ${item.pubTime}',\n                              maxLines: 1,\n                              style: TextStyle(\n                                fontSize: 13,\n                                height: 1,\n                                color: theme.colorScheme.outline,\n                              ),\n                            ),\n                          ],\n                        ),\n                      ],\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          ),\n          Positioned(\n            right: 12,\n            bottom: -6,\n            child: iconButton(\n              iconSize: 18,\n              onPressed: onDelete,\n              icon: const Icon(Icons.clear),\n              iconColor: theme.colorScheme.outline,\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/fav/cheese/controller.dart",
    "content": "import 'package:PiliPlus/http/fav.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/space/space_cheese/data.dart';\nimport 'package:PiliPlus/models_new/space/space_cheese/item.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\n\nclass FavCheeseController\n    extends CommonListController<SpaceCheeseData, SpaceCheeseItem> {\n  final mid = Accounts.main.mid;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  List<SpaceCheeseItem>? getDataList(SpaceCheeseData response) {\n    isEnd = response.page?.next == false;\n    return response.items;\n  }\n\n  @override\n  Future<LoadingState<SpaceCheeseData>> customGetData() =>\n      FavHttp.favPugv(mid: mid, page: page);\n\n  Future<void> onRemove(int index, int sid) async {\n    final res = await FavHttp.delFavPugv(sid);\n    if (res.isSuccess) {\n      loadingState\n        ..value.data!.removeAt(index)\n        ..refresh();\n      SmartDialog.showToast('已取消收藏');\n    } else {\n      res.toast();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/fav/cheese/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/space/space_cheese/item.dart';\nimport 'package:PiliPlus/pages/fav/cheese/controller.dart';\nimport 'package:PiliPlus/pages/member_cheese/widgets/item.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass FavCheesePage extends StatefulWidget {\n  const FavCheesePage({super.key});\n\n  @override\n  State<FavCheesePage> createState() => _FavCheesePageState();\n}\n\nclass _FavCheesePageState extends State<FavCheesePage>\n    with AutomaticKeepAliveClientMixin, GridMixin {\n  final FavCheeseController _controller = Get.put(FavCheeseController());\n\n  @override\n  bool get wantKeepAlive => true;\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final ThemeData theme = Theme.of(context);\n    return refreshIndicator(\n      onRefresh: _controller.onRefresh,\n      child: CustomScrollView(\n        controller: _controller.scrollController,\n        physics: const AlwaysScrollableScrollPhysics(),\n        slivers: [\n          SliverPadding(\n            padding: EdgeInsets.only(\n              top: 7,\n              bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n            ),\n            sliver: Obx(\n              () => _buildBody(theme, _controller.loadingState.value),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget _buildBody(\n    ThemeData theme,\n    LoadingState<List<SpaceCheeseItem>?> loadingState,\n  ) {\n    return switch (loadingState) {\n      Loading() => gridSkeleton,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverGrid.builder(\n                gridDelegate: gridDelegate,\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    _controller.onLoadMore();\n                  }\n                  final item = response[index];\n                  return MemberCheeseItem(\n                    item: item,\n                    onRemove: () => showConfirmDialog(\n                      context: context,\n                      title: '确定取消收藏该课堂？',\n                      onConfirm: () =>\n                          _controller.onRemove(index, item.seasonId!),\n                    ),\n                  );\n                },\n                itemCount: response.length,\n              )\n            : HttpError(onReload: _controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/fav/note/child_view.dart",
    "content": "import 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/fav/fav_note/list.dart';\nimport 'package:PiliPlus/pages/fav/note/controller.dart';\nimport 'package:PiliPlus/pages/fav/note/widget/item.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass FavNoteChildPage extends StatefulWidget {\n  const FavNoteChildPage({super.key, required this.isPublish});\n\n  final bool isPublish;\n\n  @override\n  State<FavNoteChildPage> createState() => _FavNoteChildPageState();\n}\n\nclass _FavNoteChildPageState extends State<FavNoteChildPage>\n    with AutomaticKeepAliveClientMixin, GridMixin {\n  late final FavNoteController _favNoteController;\n\n  @override\n  void initState() {\n    super.initState();\n    _favNoteController = Get.put(\n      FavNoteController(widget.isPublish),\n      tag: widget.isPublish.toString(),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final theme = Theme.of(context);\n    final padding = MediaQuery.viewPaddingOf(context);\n    final bottomH = 50 + padding.bottom;\n    return Stack(\n      clipBehavior: Clip.none,\n      children: [\n        refreshIndicator(\n          onRefresh: _favNoteController.onRefresh,\n          child: CustomScrollView(\n            controller: _favNoteController.scrollController,\n            physics: const AlwaysScrollableScrollPhysics(),\n            slivers: [\n              SliverPadding(\n                padding: EdgeInsets.only(bottom: padding.bottom + 100),\n                sliver: Obx(\n                  () => _buildBody(_favNoteController.loadingState.value),\n                ),\n              ),\n            ],\n          ),\n        ),\n        Positioned(\n          left: 0,\n          right: 0,\n          bottom: -bottomH,\n          child: Obx(\n            () => AnimatedSlide(\n              offset: _favNoteController.enableMultiSelect.value\n                  ? const Offset(0, -1)\n                  : Offset.zero,\n              duration: const Duration(milliseconds: 150),\n              child: Container(\n                height: bottomH,\n                padding: padding,\n                decoration: BoxDecoration(\n                  color: theme.colorScheme.onInverseSurface,\n                  border: Border(\n                    top: BorderSide(\n                      width: 0.5,\n                      color: theme.colorScheme.outline.withValues(alpha: 0.5),\n                    ),\n                  ),\n                ),\n                child: Row(\n                  children: [\n                    const SizedBox(width: 16),\n                    iconButton(\n                      size: 32,\n                      tooltip: '取消',\n                      context: context,\n                      icon: const Icon(Icons.clear),\n                      onPressed: _favNoteController.onDisable,\n                    ),\n                    const SizedBox(width: 12),\n                    Obx(\n                      () => Checkbox(\n                        value: _favNoteController.allSelected.value,\n                        onChanged: (value) {\n                          _favNoteController.handleSelect(\n                            checked: !_favNoteController.allSelected.value,\n                            disableSelect: false,\n                          );\n                        },\n                      ),\n                    ),\n                    GestureDetector(\n                      behavior: HitTestBehavior.opaque,\n                      onTap: () => _favNoteController.handleSelect(\n                        checked: !_favNoteController.allSelected.value,\n                        disableSelect: false,\n                      ),\n                      child: const Padding(\n                        padding: EdgeInsets.only(\n                          top: 14,\n                          bottom: 14,\n                          right: 12,\n                        ),\n                        child: Text('全选'),\n                      ),\n                    ),\n                    const Spacer(),\n                    FilledButton.tonal(\n                      style: TextButton.styleFrom(\n                        visualDensity: VisualDensity.compact,\n                        tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n                      ),\n                      onPressed: () {\n                        if (_favNoteController.checkedCount != 0) {\n                          showConfirmDialog(\n                            context: context,\n                            title: '确定删除已选中的笔记吗？',\n                            onConfirm: _favNoteController.onRemove,\n                          );\n                        }\n                      },\n                      child: const Text('删除'),\n                    ),\n                    const SizedBox(width: 16),\n                  ],\n                ),\n              ),\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n\n  Widget _buildBody(LoadingState<List<FavNoteItemModel>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => gridSkeleton,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverGrid.builder(\n                gridDelegate: gridDelegate,\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    _favNoteController.onLoadMore();\n                  }\n                  final item = response[index];\n                  return FavNoteItem(\n                    item: item,\n                    ctr: _favNoteController,\n                    onSelect: () => _favNoteController.onSelect(item),\n                  );\n                },\n                itemCount: response.length,\n              )\n            : HttpError(onReload: _favNoteController.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _favNoteController.onReload,\n      ),\n    };\n  }\n\n  @override\n  bool get wantKeepAlive => true;\n}\n"
  },
  {
    "path": "lib/pages/fav/note/controller.dart",
    "content": "import 'package:PiliPlus/http/fav.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/fav/fav_note/list.dart';\nimport 'package:PiliPlus/pages/common/multi_select/multi_select_controller.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass FavNoteController\n    extends MultiSelectController<List<FavNoteItemModel>?, FavNoteItemModel> {\n  FavNoteController(this.isPublish);\n\n  final bool isPublish;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  final RxBool allSelected = false.obs;\n\n  @override\n  void handleSelect({bool checked = false, bool disableSelect = true}) {\n    allSelected.value = checked;\n    super.handleSelect(checked: checked, disableSelect: disableSelect);\n  }\n\n  @override\n  Future<LoadingState<List<FavNoteItemModel>?>> customGetData() {\n    return isPublish\n        ? FavHttp.userNoteList(page: page)\n        : FavHttp.noteList(page: page);\n  }\n\n  @override\n  Future<void> onRemove() async {\n    final removeList = allChecked.toSet();\n    final res = await FavHttp.delNote(\n      isPublish: isPublish,\n      noteIds: removeList\n          .map((item) => isPublish ? item.cvid : item.noteId)\n          .join(','),\n    );\n    if (res.isSuccess) {\n      afterDelete(removeList);\n      SmartDialog.showToast('删除成功');\n    } else {\n      res.toast();\n    }\n  }\n\n  void onDisable() {\n    if (checkedCount != 0) {\n      handleSelect();\n    }\n    enableMultiSelect.value = false;\n  }\n}\n"
  },
  {
    "path": "lib/pages/fav/note/view.dart",
    "content": "import 'package:PiliPlus/pages/fav/note/child_view.dart';\nimport 'package:PiliPlus/pages/fav/note/controller.dart';\nimport 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass FavNotePage extends StatefulWidget {\n  const FavNotePage({super.key});\n\n  @override\n  State<FavNotePage> createState() => _FavNotePageState();\n}\n\nclass _FavNotePageState extends State<FavNotePage>\n    with SingleTickerProviderStateMixin, AutomaticKeepAliveClientMixin {\n  late final TabController _tabController;\n\n  @override\n  void initState() {\n    super.initState();\n    _tabController = TabController(\n      length: 2,\n      vsync: this,\n    );\n  }\n\n  @override\n  bool get wantKeepAlive => true;\n\n  @override\n  void dispose() {\n    _tabController.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final theme = Theme.of(context);\n    return Column(\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        Row(\n          children: [\n            Expanded(\n              child: TabBar(\n                overlayColor: const WidgetStatePropertyAll(Colors.transparent),\n                splashFactory: NoSplash.splashFactory,\n                isScrollable: true,\n                tabAlignment: TabAlignment.start,\n                controller: _tabController,\n                padding: const EdgeInsets.symmetric(horizontal: 8),\n                dividerHeight: 0,\n                indicatorWeight: 0,\n                indicatorPadding: const EdgeInsets.symmetric(\n                  horizontal: 3,\n                  vertical: 8,\n                ),\n                indicator: BoxDecoration(\n                  color: theme.colorScheme.secondaryContainer,\n                  borderRadius: const BorderRadius.all(Radius.circular(20)),\n                ),\n                indicatorSize: TabBarIndicatorSize.tab,\n                labelStyle:\n                    TabBarTheme.of(\n                      context,\n                    ).labelStyle?.copyWith(fontSize: 14) ??\n                    const TextStyle(fontSize: 14),\n                labelColor: theme.colorScheme.onSecondaryContainer,\n                unselectedLabelColor: theme.colorScheme.outline,\n                tabs: const [\n                  Tab(text: '未发布笔记'),\n                  Tab(text: '公开笔记'),\n                ],\n                onTap: (index) {\n                  try {\n                    if (!_tabController.indexIsChanging) {\n                      Get.find<FavNoteController>(\n                        tag: index == 0 ? 'false' : 'true',\n                      ).scrollController.animToTop();\n                    }\n                  } catch (_) {}\n                },\n              ),\n            ),\n            // TextButton(\n            //   style: TextButton.styleFrom(\n            //     foregroundColor: theme.colorScheme.onSurfaceVariant,\n            //     visualDensity: VisualDensity.compact,\n            //     tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n            //   ),\n            //   onPressed: () async {\n            //     final favNoteController = Get.find<FavNoteController>(\n            //         tag: _tabController.index == 0 ? 'false' : 'true');\n            //     if (favNoteController.enableMultiSelect.value) {\n            //       favNoteController.onDisable();\n            //     } else {\n            //       if (favNoteController.loadingState.value.isSuccess &&\n            //           favNoteController.loadingState.value.data?.isNotEmpty ==\n            //               true) {\n            //         favNoteController.enableMultiSelect.value = true;\n            //       }\n            //     }\n            //   },\n            //   child: const Text('管理'),\n            // ),\n            // const SizedBox(width: 12),\n          ],\n        ),\n        Expanded(\n          child: TabBarView(\n            controller: _tabController,\n            physics: const NeverScrollableScrollPhysics(),\n            children: const [\n              FavNoteChildPage(isPublish: false),\n              FavNoteChildPage(isPublish: true),\n            ],\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/fav/note/widget/item.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/select_mask.dart';\nimport 'package:PiliPlus/models_new/fav/fav_note/list.dart';\nimport 'package:PiliPlus/pages/fav/note/controller.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\n\nclass FavNoteItem extends StatelessWidget {\n  const FavNoteItem({\n    super.key,\n    required this.item,\n    required this.ctr,\n    required this.onSelect,\n  });\n\n  final FavNoteItemModel item;\n  final FavNoteController ctr;\n  final VoidCallback onSelect;\n\n  void onLongPress() {\n    if (!ctr.enableMultiSelect.value) {\n      ctr.enableMultiSelect.value = true;\n      onSelect();\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onTap: () {\n          if (ctr.enableMultiSelect.value) {\n            onSelect();\n            return;\n          }\n          if (item.webUrl?.isNotEmpty == true) {\n            PageUtils.handleWebview(\n              item.webUrl!,\n              inApp: true,\n            );\n          }\n        },\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        child: Padding(\n          padding: const EdgeInsets.symmetric(\n            horizontal: StyleString.safeSpace,\n            vertical: 5,\n          ),\n          child: Row(\n            spacing: 10,\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              if (item.pic?.isNotEmpty == true)\n                AspectRatio(\n                  aspectRatio: StyleString.aspectRatio,\n                  child: LayoutBuilder(\n                    builder: (context, boxConstraints) {\n                      return Stack(\n                        clipBehavior: Clip.none,\n                        children: [\n                          NetworkImgLayer(\n                            src: item.pic,\n                            width: boxConstraints.maxWidth,\n                            height: boxConstraints.maxHeight,\n                          ),\n                          Positioned.fill(\n                            child: selectMask(\n                              theme,\n                              item.checked,\n                            ),\n                          ),\n                        ],\n                      );\n                    },\n                  ),\n                ),\n              Expanded(\n                child: Column(\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    Text(\n                      item.title ?? '',\n                      maxLines: 2,\n                      overflow: TextOverflow.ellipsis,\n                      style: const TextStyle(\n                        height: 1.4,\n                        fontSize: 14,\n                      ),\n                    ),\n                    const Spacer(),\n                    Text(\n                      item.summary ?? '',\n                      maxLines: 1,\n                      style: TextStyle(\n                        fontSize: 14,\n                        height: 1,\n                        color: theme.colorScheme.outline,\n                      ),\n                    ),\n                    const Spacer(),\n                    Text(\n                      item.message ?? '',\n                      maxLines: 1,\n                      style: TextStyle(\n                        fontSize: 13,\n                        height: 1,\n                        color: theme.colorScheme.outline,\n                      ),\n                    ),\n                  ],\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/fav/pgc/child_view.dart",
    "content": "import 'package:PiliPlus/common/skeleton/fav_pgc_item.dart';\nimport 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/fav/fav_pgc/list.dart';\nimport 'package:PiliPlus/pages/fav/pgc/controller.dart';\nimport 'package:PiliPlus/pages/fav/pgc/widget/item.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass FavPgcChildPage extends StatefulWidget {\n  const FavPgcChildPage({\n    super.key,\n    required this.type,\n    required this.followStatus,\n  });\n\n  final int type;\n  final int followStatus;\n\n  @override\n  State<FavPgcChildPage> createState() => _FavPgcChildPageState();\n}\n\nclass _FavPgcChildPageState extends State<FavPgcChildPage>\n    with AutomaticKeepAliveClientMixin, GridMixin {\n  late final FavPgcController _favPgcController;\n\n  @override\n  void initState() {\n    super.initState();\n    _favPgcController = Get.put(\n      FavPgcController(widget.type, widget.followStatus),\n      tag: '${widget.type}${widget.followStatus}',\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final theme = Theme.of(context);\n    final padding = MediaQuery.viewPaddingOf(context);\n    final bottomH = 50 + padding.bottom;\n    return Stack(\n      clipBehavior: Clip.none,\n      children: [\n        refreshIndicator(\n          onRefresh: _favPgcController.onRefresh,\n          child: CustomScrollView(\n            controller: _favPgcController.scrollController,\n            physics: const AlwaysScrollableScrollPhysics(),\n            slivers: [\n              SliverPadding(\n                padding: EdgeInsets.only(bottom: padding.bottom + 100),\n                sliver: Obx(\n                  () => _buildBody(_favPgcController.loadingState.value),\n                ),\n              ),\n            ],\n          ),\n        ),\n        Positioned(\n          left: 0,\n          right: 0,\n          bottom: -bottomH,\n          child: Obx(\n            () => AnimatedSlide(\n              offset: _favPgcController.enableMultiSelect.value\n                  ? const Offset(0, -1)\n                  : Offset.zero,\n              duration: const Duration(milliseconds: 150),\n              child: Container(\n                height: bottomH,\n                padding: padding,\n                decoration: BoxDecoration(\n                  color: theme.colorScheme.onInverseSurface,\n                  border: Border(\n                    top: BorderSide(\n                      width: 0.5,\n                      color: theme.colorScheme.outline.withValues(alpha: 0.5),\n                    ),\n                  ),\n                ),\n                child: Row(\n                  children: [\n                    const SizedBox(width: 16),\n                    iconButton(\n                      size: 32,\n                      tooltip: '取消',\n                      context: context,\n                      icon: const Icon(Icons.clear),\n                      onPressed: _favPgcController.onDisable,\n                    ),\n                    const SizedBox(width: 12),\n                    Obx(\n                      () => Checkbox(\n                        value: _favPgcController.allSelected.value,\n                        onChanged: (value) {\n                          _favPgcController.handleSelect(\n                            checked: !_favPgcController.allSelected.value,\n                            disableSelect: false,\n                          );\n                        },\n                      ),\n                    ),\n                    GestureDetector(\n                      behavior: HitTestBehavior.opaque,\n                      onTap: () => _favPgcController.handleSelect(\n                        checked: !_favPgcController.allSelected.value,\n                        disableSelect: false,\n                      ),\n                      child: const Padding(\n                        padding: EdgeInsets.only(\n                          top: 14,\n                          bottom: 14,\n                          right: 12,\n                        ),\n                        child: Text('全选'),\n                      ),\n                    ),\n                    const Spacer(),\n                    ...const [\n                          (followStatus: 1, title: '想看'),\n                          (followStatus: 2, title: '在看'),\n                          (followStatus: 3, title: '看过'),\n                        ]\n                        .where(\n                          (item) => item.followStatus != widget.followStatus,\n                        )\n                        .map(\n                          (item) => Padding(\n                            padding: const EdgeInsets.only(left: 25),\n                            child: GestureDetector(\n                              behavior: HitTestBehavior.opaque,\n                              onTap: () {\n                                if (_favPgcController.checkedCount != 0) {\n                                  _favPgcController.onUpdateList(\n                                    item.followStatus,\n                                  );\n                                }\n                              },\n                              child: Padding(\n                                padding: const EdgeInsets.symmetric(\n                                  vertical: 14,\n                                  horizontal: 5,\n                                ),\n                                child: Text(\n                                  '标记为${item.title}',\n                                  style: TextStyle(\n                                    color: theme.colorScheme.onSurfaceVariant,\n                                  ),\n                                ),\n                              ),\n                            ),\n                          ),\n                        ),\n                    const SizedBox(width: 20),\n                  ],\n                ),\n              ),\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n\n  Widget _buildBody(LoadingState<List<FavPgcItemModel>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => SliverGrid.builder(\n        gridDelegate: gridDelegate,\n        itemBuilder: (context, index) => const FavPgcItemSkeleton(),\n        itemCount: 10,\n      ),\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverGrid.builder(\n                gridDelegate: gridDelegate,\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    _favPgcController.onLoadMore();\n                  }\n                  final item = response[index];\n                  return FavPgcItem(\n                    item: item,\n                    ctr: _favPgcController,\n                    onSelect: () => _favPgcController.onSelect(item),\n                    onUpdateStatus: () => showPgcFollowDialog(\n                      context: context,\n                      type: widget.type == 0 ? '追番' : '追剧',\n                      followStatus: widget.followStatus,\n                      onUpdateStatus: (followStatus) {\n                        if (followStatus == -1) {\n                          _favPgcController.pgcDel(\n                            index,\n                            item.seasonId,\n                          );\n                        } else {\n                          _favPgcController.onUpdate(\n                            index,\n                            followStatus,\n                            item.seasonId,\n                          );\n                        }\n                      },\n                    ),\n                  );\n                },\n                itemCount: response.length,\n              )\n            : HttpError(onReload: _favPgcController.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _favPgcController.onReload,\n      ),\n    };\n  }\n\n  @override\n  bool get wantKeepAlive => true;\n}\n"
  },
  {
    "path": "lib/pages/fav/pgc/controller.dart",
    "content": "import 'package:PiliPlus/http/fav.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/video.dart';\nimport 'package:PiliPlus/models_new/fav/fav_pgc/data.dart';\nimport 'package:PiliPlus/models_new/fav/fav_pgc/list.dart';\nimport 'package:PiliPlus/pages/common/multi_select/multi_select_controller.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass FavPgcController\n    extends MultiSelectController<FavPgcData, FavPgcItemModel> {\n  final int type;\n  final int followStatus;\n\n  FavPgcController(this.type, this.followStatus);\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  final RxBool allSelected = false.obs;\n\n  @override\n  void handleSelect({bool checked = false, bool disableSelect = true}) {\n    allSelected.value = checked;\n    super.handleSelect(checked: checked, disableSelect: disableSelect);\n  }\n\n  @override\n  List<FavPgcItemModel>? getDataList(FavPgcData response) {\n    return response.list;\n  }\n\n  @override\n  Future<LoadingState<FavPgcData>> customGetData() => FavHttp.favPgc(\n    type: type,\n    followStatus: followStatus,\n    pn: page,\n  );\n\n  void onDisable() {\n    if (checkedCount != 0) {\n      handleSelect();\n    }\n    enableMultiSelect.value = false;\n  }\n\n  // 取消追番\n  Future<void> pgcDel(int index, seasonId) async {\n    final result = await VideoHttp.pgcDel(seasonId: seasonId);\n    if (result case Success(:final response)) {\n      loadingState\n        ..value.data!.removeAt(index)\n        ..refresh();\n      SmartDialog.showToast(response);\n    } else {\n      result.toast();\n    }\n  }\n\n  @override\n  void onRemove() {\n    assert(false, 'call onUpdateList');\n  }\n\n  Future<void> onUpdateList(int followStatus) async {\n    final removeList = allChecked.toSet();\n    final res = await VideoHttp.pgcUpdate(\n      seasonId: removeList.map((item) => item.seasonId).join(','),\n      status: followStatus,\n    );\n    if (res case Success(:final response)) {\n      try {\n        final ctr = Get.find<FavPgcController>(tag: '$type$followStatus');\n        if (ctr.loadingState.value case Success(:final response)) {\n          response?.insertAll(\n            0,\n            removeList.map((item) => item..checked = false),\n          );\n          ctr\n            ..loadingState.refresh()\n            ..allSelected.value = false;\n        }\n      } catch (e) {\n        if (kDebugMode) debugPrint('fav pgc onUpdate: $e');\n      }\n      afterDelete(removeList);\n      SmartDialog.showToast(response);\n    } else {\n      res.toast();\n    }\n  }\n\n  Future<void> onUpdate(int index, int followStatus, int? seasonId) async {\n    final res = await VideoHttp.pgcUpdate(\n      seasonId: seasonId.toString(),\n      status: followStatus,\n    );\n    if (res case Success(:final response)) {\n      List<FavPgcItemModel> list = loadingState.value.data!;\n      final item = list.removeAt(index);\n      loadingState.refresh();\n      try {\n        final ctr = Get.find<FavPgcController>(tag: '$type$followStatus');\n        if (ctr.loadingState.value case Success(:final response)) {\n          response?.insert(0, item);\n          ctr\n            ..loadingState.refresh()\n            ..allSelected.value = false;\n        }\n      } catch (e) {\n        if (kDebugMode) debugPrint('fav pgc pgcUpdate: $e');\n      }\n      SmartDialog.showToast(response);\n    } else {\n      res.toast();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/fav/pgc/view.dart",
    "content": "import 'package:PiliPlus/pages/fav/pgc/child_view.dart';\nimport 'package:PiliPlus/pages/fav/pgc/controller.dart';\nimport 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass FavPgcPage extends StatefulWidget {\n  const FavPgcPage({super.key, required this.type});\n\n  final int type;\n\n  @override\n  State<FavPgcPage> createState() => _FavPgcPageState();\n}\n\nclass _FavPgcPageState extends State<FavPgcPage>\n    with AutomaticKeepAliveClientMixin, SingleTickerProviderStateMixin {\n  late final TabController _tabController;\n\n  @override\n  void initState() {\n    super.initState();\n    _tabController = TabController(\n      length: 3,\n      vsync: this,\n      initialIndex: 1,\n    );\n  }\n\n  @override\n  bool get wantKeepAlive => true;\n\n  @override\n  void dispose() {\n    _tabController.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final theme = Theme.of(context);\n    return Column(\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        Row(\n          children: [\n            Expanded(\n              child: TabBar(\n                overlayColor: const WidgetStatePropertyAll(Colors.transparent),\n                splashFactory: NoSplash.splashFactory,\n                isScrollable: true,\n                tabAlignment: TabAlignment.start,\n                controller: _tabController,\n                padding: const EdgeInsets.symmetric(horizontal: 8),\n                dividerHeight: 0,\n                indicatorWeight: 0,\n                indicatorPadding: const EdgeInsets.symmetric(\n                  horizontal: 3,\n                  vertical: 8,\n                ),\n                indicator: BoxDecoration(\n                  color: theme.colorScheme.secondaryContainer,\n                  borderRadius: const BorderRadius.all(Radius.circular(20)),\n                ),\n                indicatorSize: TabBarIndicatorSize.tab,\n                labelStyle:\n                    TabBarTheme.of(\n                      context,\n                    ).labelStyle?.copyWith(fontSize: 14) ??\n                    const TextStyle(fontSize: 14),\n                labelColor: theme.colorScheme.onSecondaryContainer,\n                unselectedLabelColor: theme.colorScheme.outline,\n                tabs: const [\n                  Tab(text: '想看'),\n                  Tab(text: '在看'),\n                  Tab(text: '看过'),\n                ],\n                onTap: (index) {\n                  try {\n                    if (!_tabController.indexIsChanging) {\n                      Get.find<FavPgcController>(\n                        tag: '${widget.type}${index + 1}',\n                      ).scrollController.animToTop();\n                    }\n                  } catch (_) {}\n                },\n              ),\n            ),\n            // TextButton(\n            //   style: TextButton.styleFrom(\n            //     foregroundColor: theme.colorScheme.onSurfaceVariant,\n            //     visualDensity:\n            //         const VisualDensity(horizontal: -2, vertical: -2),\n            //     tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n            //   ),\n            //   onPressed: () {},\n            //   child: const Text('管理'),\n            // ),\n            // const SizedBox(width: 12),\n          ],\n        ),\n        Expanded(\n          child: TabBarView(\n            controller: _tabController,\n            physics: const NeverScrollableScrollPhysics(),\n            children: List.generate(\n              3,\n              (index) => FavPgcChildPage(\n                type: widget.type,\n                followStatus: index + 1,\n              ),\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/fav/pgc/widget/item.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/select_mask.dart';\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models_new/fav/fav_pgc/list.dart';\nimport 'package:PiliPlus/pages/common/multi_select/base.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\n\nclass FavPgcItem extends StatelessWidget {\n  const FavPgcItem({\n    super.key,\n    required this.item,\n    required this.ctr,\n    required this.onSelect,\n    required this.onUpdateStatus,\n  });\n\n  final FavPgcItemModel item;\n  final MultiSelectBase ctr;\n  final VoidCallback onSelect;\n  final VoidCallback onUpdateStatus;\n\n  void onLongPress() {\n    if (!ctr.enableMultiSelect.value) {\n      ctr.enableMultiSelect.value = true;\n      onSelect();\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    return Material(\n      type: MaterialType.transparency,\n      child: Stack(\n        clipBehavior: Clip.none,\n        children: [\n          InkWell(\n            onTap: () {\n              if (ctr.enableMultiSelect.value) {\n                onSelect();\n                return;\n              }\n              PageUtils.viewPgc(seasonId: item.seasonId);\n            },\n            onLongPress: onLongPress,\n            onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n            child: Padding(\n              padding: const EdgeInsets.symmetric(\n                horizontal: StyleString.safeSpace,\n                vertical: 5,\n              ),\n              child: Row(\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  AspectRatio(\n                    aspectRatio: 3 / 4,\n                    child: LayoutBuilder(\n                      builder: (context, boxConstraints) {\n                        return Stack(\n                          clipBehavior: Clip.none,\n                          children: [\n                            NetworkImgLayer(\n                              src: item.cover,\n                              width: boxConstraints.maxWidth,\n                              height: boxConstraints.maxHeight,\n                              borderRadius: const BorderRadius.all(\n                                Radius.circular(4),\n                              ),\n                            ),\n                            PBadge(\n                              right: 4,\n                              top: 4,\n                              text: item.badge,\n                              size: PBadgeSize.small,\n                              fontSize: 10,\n                              padding: const EdgeInsets.symmetric(\n                                horizontal: 2,\n                                vertical: 1,\n                              ),\n                            ),\n                            Positioned.fill(\n                              child: selectMask(\n                                theme,\n                                item.checked,\n                                borderRadius: const BorderRadius.all(\n                                  Radius.circular(4),\n                                ),\n                              ),\n                            ),\n                          ],\n                        );\n                      },\n                    ),\n                  ),\n                  const SizedBox(width: 10),\n                  Expanded(\n                    child: Column(\n                      mainAxisSize: MainAxisSize.min,\n                      crossAxisAlignment: CrossAxisAlignment.start,\n                      children: [\n                        Text(item.title!),\n                        if (item.newEp?.indexShow != null) ...[\n                          const SizedBox(height: 6),\n                          Text(\n                            '${item.newEp!.indexShow}${item.isFinish == 0 && item.renewalTime?.isNotEmpty == true ? '，${item.renewalTime}' : ''}',\n                            style: TextStyle(\n                              fontSize: 13,\n                              color: theme.colorScheme.onSurfaceVariant,\n                            ),\n                          ),\n                        ],\n                        if (item.progress != null) ...[\n                          SizedBox(\n                            height: item.newEp?.indexShow != null ? 2 : 6,\n                          ),\n                          Text(\n                            item.progress!,\n                            style: TextStyle(\n                              fontSize: 13,\n                              color: theme.colorScheme.onSurfaceVariant,\n                            ),\n                          ),\n                        ],\n                      ],\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          ),\n          Positioned(\n            right: 12,\n            bottom: 0,\n            child: iconButton(\n              iconSize: 18,\n              onPressed: onUpdateStatus,\n              icon: const Icon(Icons.more_vert),\n              iconColor: theme.colorScheme.outline,\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/fav/topic/controller.dart",
    "content": "import 'package:PiliPlus/http/fav.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/fav/fav_topic/data.dart';\nimport 'package:PiliPlus/models_new/fav/fav_topic/topic_item.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\n\nclass FavTopicController\n    extends CommonListController<FavTopicData, FavTopicItem> {\n  int? total;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  void checkIsEnd(int length) {\n    if (total != null && length >= total!) {\n      isEnd = true;\n    }\n  }\n\n  @override\n  List<FavTopicItem>? getDataList(FavTopicData response) {\n    total = response.topicList?.pageInfo?.total;\n    return response.topicList?.topicItems;\n  }\n\n  @override\n  Future<void> onRefresh() {\n    total = null;\n    return super.onRefresh();\n  }\n\n  @override\n  Future<LoadingState<FavTopicData>> customGetData() =>\n      FavHttp.favTopic(page: page);\n\n  Future<void> onRemove(int index, int id) async {\n    final res = await FavHttp.delFavTopic(id);\n    if (res.isSuccess) {\n      loadingState\n        ..value.data!.removeAt(index)\n        ..refresh();\n      SmartDialog.showToast('已取消收藏');\n    } else {\n      res.toast();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/fav/topic/view.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart'\n    show m3eLoading;\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/fav/fav_topic/topic_item.dart';\nimport 'package:PiliPlus/pages/fav/topic/controller.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart'\n    hide SliverGridDelegateWithMaxCrossAxisExtent;\nimport 'package:get/get.dart';\n\nclass FavTopicPage extends StatefulWidget {\n  const FavTopicPage({super.key});\n\n  @override\n  State<FavTopicPage> createState() => _FavTopicPageState();\n}\n\nclass _FavTopicPageState extends State<FavTopicPage>\n    with AutomaticKeepAliveClientMixin {\n  final FavTopicController _controller = Get.put(FavTopicController());\n\n  @override\n  bool get wantKeepAlive => true;\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final ThemeData theme = Theme.of(context);\n    return refreshIndicator(\n      onRefresh: _controller.onRefresh,\n      child: CustomScrollView(\n        controller: _controller.scrollController,\n        physics: const AlwaysScrollableScrollPhysics(),\n        slivers: [\n          SliverPadding(\n            padding: EdgeInsets.only(\n              left: StyleString.safeSpace,\n              right: StyleString.safeSpace,\n              top: StyleString.safeSpace,\n              bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n            ),\n            sliver: Obx(\n              () => _buildBody(theme, _controller.loadingState.value),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  late final gridDelegate = SliverGridDelegateWithMaxCrossAxisExtent(\n    mainAxisSpacing: 12,\n    crossAxisSpacing: 12,\n    maxCrossAxisExtent: Grid.smallCardWidth,\n    mainAxisExtent: MediaQuery.textScalerOf(context).scale(30),\n  );\n\n  Widget _buildBody(\n    ThemeData theme,\n    LoadingState<List<FavTopicItem>?> loadingState,\n  ) {\n    return switch (loadingState) {\n      Loading() => const SliverToBoxAdapter(\n        child: SizedBox(\n          height: 125,\n          child: m3eLoading,\n        ),\n      ),\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverGrid.builder(\n                gridDelegate: gridDelegate,\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    _controller.onLoadMore();\n                  }\n                  final item = response[index];\n\n                  void onLongPress() => showConfirmDialog(\n                    context: context,\n                    title: '确定取消收藏？',\n                    onConfirm: () => _controller.onRemove(index, item.id!),\n                  );\n\n                  return Material(\n                    color: theme.colorScheme.onInverseSurface,\n                    borderRadius: const BorderRadius.all(Radius.circular(6)),\n                    child: InkWell(\n                      onTap: () => Get.toNamed(\n                        '/dynTopic',\n                        parameters: {\n                          'id': item.id!.toString(),\n                          'name': item.name!,\n                        },\n                      ),\n                      onLongPress: onLongPress,\n                      onSecondaryTap: PlatformUtils.isMobile\n                          ? null\n                          : onLongPress,\n                      borderRadius: const BorderRadius.all(\n                        Radius.circular(6),\n                      ),\n                      child: Container(\n                        alignment: Alignment.centerLeft,\n                        padding: const EdgeInsets.symmetric(\n                          horizontal: 11,\n                          vertical: 5,\n                        ),\n                        child: Text(\n                          '# ${item.name}',\n                          maxLines: 1,\n                          overflow: TextOverflow.ellipsis,\n                          style: TextStyle(\n                            fontSize: 14,\n                            color: theme.colorScheme.onSurfaceVariant,\n                          ),\n                        ),\n                      ),\n                    ),\n                  );\n                },\n                itemCount: response.length,\n              )\n            : HttpError(onReload: _controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/fav/video/controller.dart",
    "content": "import 'package:PiliPlus/http/fav.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/fav/fav_folder/data.dart';\nimport 'package:PiliPlus/models_new/fav/fav_folder/list.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\n\nclass FavController extends CommonListController<FavFolderData, FavFolderInfo> {\n  late final account = Accounts.main;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  Future<void> queryData([bool isRefresh = true]) {\n    if (!account.isLogin) {\n      loadingState.value = const Error('账号未登录');\n      return Future.syncValue(null);\n    }\n    return super.queryData(isRefresh);\n  }\n\n  @override\n  List<FavFolderInfo>? getDataList(FavFolderData response) {\n    if (response.hasMore == false) {\n      isEnd = true;\n    }\n    return response.list;\n  }\n\n  @override\n  Future<LoadingState<FavFolderData>> customGetData() => FavHttp.userfavFolder(\n    pn: page,\n    ps: 20,\n    mid: account.mid,\n  );\n}\n"
  },
  {
    "path": "lib/pages/fav/video/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/fav/fav_folder/list.dart';\nimport 'package:PiliPlus/pages/fav/video/controller.dart';\nimport 'package:PiliPlus/pages/fav/video/widgets/item.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass FavVideoPage extends StatefulWidget {\n  const FavVideoPage({super.key});\n\n  @override\n  State<FavVideoPage> createState() => _FavVideoPageState();\n}\n\nclass _FavVideoPageState extends State<FavVideoPage>\n    with AutomaticKeepAliveClientMixin, GridMixin {\n  final FavController _favController = Get.find<FavController>();\n\n  @override\n  bool get wantKeepAlive => true;\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    return refreshIndicator(\n      onRefresh: _favController.onRefresh,\n      child: CustomScrollView(\n        controller: _favController.scrollController,\n        physics: const AlwaysScrollableScrollPhysics(),\n        slivers: [\n          SliverPadding(\n            padding: EdgeInsets.only(\n              top: 7,\n              bottom: 100 + MediaQuery.viewPaddingOf(context).bottom,\n            ),\n            sliver: Obx(\n              () => _buildBody(_favController.loadingState.value),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget _buildBody(LoadingState<List<FavFolderInfo>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => gridSkeleton,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverGrid.builder(\n                gridDelegate: gridDelegate,\n                itemBuilder: (BuildContext context, int index) {\n                  if (index == response.length - 1) {\n                    _favController.onLoadMore();\n                  }\n                  final item = response[index];\n                  String heroTag = Utils.makeHeroTag(item.fid);\n                  return FavVideoItem(\n                    heroTag: heroTag,\n                    item: item,\n                    onTap: () async {\n                      final res = await Get.toNamed(\n                        '/favDetail',\n                        arguments: item,\n                        parameters: {\n                          'heroTag': heroTag,\n                          'mediaId': item.id.toString(),\n                        },\n                      );\n                      if (res == true) {\n                        _favController.loadingState\n                          ..value.data!.removeAt(index)\n                          ..refresh();\n                      }\n                    },\n                  );\n                },\n                itemCount: response.length,\n              )\n            : HttpError(onReload: _favController.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _favController.onReload,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/fav/video/widgets/item.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models_new/fav/fav_folder/list.dart';\nimport 'package:PiliPlus/utils/fav_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\n\nclass FavVideoItem extends StatelessWidget {\n  final String heroTag;\n  final FavFolderInfo item;\n  final VoidCallback? onTap;\n  final VoidCallback? onLongPress;\n\n  const FavVideoItem({\n    super.key,\n    this.onTap,\n    this.onLongPress,\n    required this.heroTag,\n    required this.item,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onTap: onTap,\n        onLongPress:\n            onLongPress ??\n            (onTap == null\n                ? null\n                : () => imageSaveDialog(\n                    title: item.title,\n                    cover: item.cover,\n                  )),\n        child: Padding(\n          padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 5),\n          child: Row(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              AspectRatio(\n                aspectRatio: StyleString.aspectRatio,\n                child: LayoutBuilder(\n                  builder: (context, boxConstraints) {\n                    return Hero(\n                      tag: heroTag,\n                      child: NetworkImgLayer(\n                        src: item.cover,\n                        width: boxConstraints.maxWidth,\n                        height: boxConstraints.maxHeight,\n                      ),\n                    );\n                  },\n                ),\n              ),\n              const SizedBox(width: 10),\n              content(context),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget content(BuildContext context) {\n    final theme = Theme.of(context);\n    final fontSize = theme.textTheme.labelMedium!.fontSize;\n    final color = theme.colorScheme.outline;\n    return Expanded(\n      child: Column(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          Text(\n            item.title,\n            textAlign: TextAlign.start,\n            style: const TextStyle(\n              letterSpacing: 0.3,\n            ),\n          ),\n          if (item.intro?.isNotEmpty == true)\n            Text(\n              item.intro!,\n              maxLines: 2,\n              overflow: TextOverflow.ellipsis,\n              style: TextStyle(\n                fontSize: fontSize,\n                color: color,\n              ),\n            ),\n          Text(\n            '${item.mediaCount}个内容',\n            style: TextStyle(\n              fontSize: fontSize,\n              color: color,\n            ),\n          ),\n          const Spacer(),\n          Text(\n            FavUtils.isPublicFavText(item.attr),\n            style: TextStyle(\n              fontSize: fontSize,\n              color: color,\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/fav/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/common/widgets/view_safe_area.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/fav_type.dart';\nimport 'package:PiliPlus/pages/fav/article/controller.dart';\nimport 'package:PiliPlus/pages/fav/cheese/controller.dart';\nimport 'package:PiliPlus/pages/fav/topic/controller.dart';\nimport 'package:PiliPlus/pages/fav/video/controller.dart';\nimport 'package:PiliPlus/pages/fav_folder_sort/view.dart';\nimport 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass FavPage extends StatefulWidget {\n  const FavPage({super.key});\n\n  @override\n  State<FavPage> createState() => _FavPageState();\n}\n\nclass _FavPageState extends State<FavPage> with SingleTickerProviderStateMixin {\n  late final TabController _tabController;\n  final FavController _favController = Get.put(FavController());\n  late final RxBool _showVideoFavMenu;\n\n  void listener() {\n    _showVideoFavMenu.value = _tabController.index == 0;\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    int initialIndex = Get.arguments is int ? Get.arguments as int : 0;\n    _showVideoFavMenu = (initialIndex == 0).obs;\n    _tabController = TabController(\n      length: FavTabType.values.length,\n      vsync: this,\n      initialIndex: initialIndex,\n    );\n    _tabController.addListener(listener);\n  }\n\n  @override\n  void dispose() {\n    _tabController\n      ..removeListener(listener)\n      ..dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        title: const Text('我的收藏'),\n        actions: [\n          Obx(\n            () => _showVideoFavMenu.value\n                ? IconButton(\n                    onPressed: () => Get.toNamed('/createFav')?.then(\n                      (data) {\n                        if (data != null) {\n                          final list =\n                              _favController.loadingState.value.dataOrNull;\n                          if (list != null && list.isNotEmpty) {\n                            list.insert(1, data);\n                            _favController.loadingState.refresh();\n                          } else {\n                            _favController.loadingState.value = Success([data]);\n                          }\n                        }\n                      },\n                    ),\n                    icon: const Icon(Icons.add),\n                    tooltip: '新建收藏夹',\n                  )\n                : const SizedBox.shrink(),\n          ),\n          Obx(\n            () => _showVideoFavMenu.value\n                ? IconButton(\n                    onPressed: () {\n                      if (_favController.loadingState.value.isSuccess) {\n                        if (!_favController.isEnd) {\n                          SmartDialog.showToast('加载全部收藏夹再排序');\n                          return;\n                        }\n                        Get.to(\n                          FavFolderSortPage(favController: _favController),\n                        );\n                      }\n                    },\n                    icon: const Icon(Icons.sort),\n                    tooltip: '收藏夹排序',\n                  )\n                : const SizedBox.shrink(),\n          ),\n          Obx(\n            () => _showVideoFavMenu.value\n                ? IconButton(\n                    onPressed: () {\n                      if (_favController.loadingState.value case Success(\n                        :final response,\n                      )) {\n                        try {\n                          final item = response!.first;\n                          Get.toNamed(\n                            '/favSearch',\n                            arguments: {\n                              'type': 1,\n                              'mediaId': item.id,\n                              'title': item.title,\n                              'count': item.mediaCount,\n                              'isOwner': true,\n                            },\n                          );\n                        } catch (_) {}\n                      }\n                    },\n                    icon: const Icon(Icons.search_outlined),\n                    tooltip: '搜索',\n                  )\n                : const SizedBox.shrink(),\n          ),\n          const SizedBox(width: 6),\n        ],\n        bottom: TabBar(\n          controller: _tabController,\n          isScrollable: true,\n          tabAlignment: TabAlignment.start,\n          tabs: FavTabType.values.map((item) => Tab(text: item.title)).toList(),\n          onTap: (index) {\n            try {\n              if (!_tabController.indexIsChanging) {\n                switch (FavTabType.values[index]) {\n                  case FavTabType.video:\n                    _favController.scrollController.animToTop();\n                  case FavTabType.article:\n                    Get.find<FavArticleController>().scrollController\n                        .animToTop();\n                  case FavTabType.topic:\n                    Get.find<FavTopicController>().scrollController.animToTop();\n                  case FavTabType.cheese:\n                    Get.find<FavCheeseController>().scrollController\n                        .animToTop();\n                  default:\n                }\n              }\n            } catch (_) {}\n          },\n        ),\n      ),\n      body: ViewSafeArea(\n        child: tabBarView(\n          controller: _tabController,\n          children: FavTabType.values.map((item) => item.page).toList(),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/fav_create/view.dart",
    "content": "import 'dart:io' show File;\n\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/http/fav.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/msg.dart';\nimport 'package:PiliPlus/utils/extension/file_ext.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/fav_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:easy_debounce/easy_throttle.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart' show LengthLimitingTextInputFormatter;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:image_cropper/image_cropper.dart';\nimport 'package:image_picker/image_picker.dart';\n\nclass CreateFavPage extends StatefulWidget {\n  const CreateFavPage({super.key});\n\n  @override\n  State<CreateFavPage> createState() => _CreateFavPageState();\n}\n\nclass _CreateFavPageState extends State<CreateFavPage> {\n  dynamic _mediaId;\n  late final TextEditingController _titleController;\n  late final TextEditingController _introController;\n  String? _cover;\n  bool _isPublic = true;\n  late final _imagePicker = ImagePicker();\n  String? _errMsg;\n  int? _attr;\n\n  @override\n  void initState() {\n    super.initState();\n    _titleController = TextEditingController();\n    _introController = TextEditingController();\n    _mediaId = Get.parameters['mediaId'];\n    if (_mediaId != null) {\n      _getFolderInfo();\n    }\n  }\n\n  void _getFolderInfo() {\n    _errMsg = null;\n    FavHttp.favFolderInfo(mediaId: _mediaId).then((res) {\n      if (res case Success(:final response)) {\n        _titleController.text = response.title;\n        _introController.text = response.intro ?? '';\n        _isPublic = FavUtils.isPublicFav(response.attr);\n        _cover = response.cover;\n        _attr = response.attr;\n      } else {\n        _errMsg = res.toString();\n      }\n      setState(() {});\n    });\n  }\n\n  @override\n  void dispose() {\n    _titleController.dispose();\n    _introController.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    return Scaffold(\n      appBar: AppBar(\n        title: Text(_mediaId != null ? '编辑' : '创建'),\n        actions: [\n          TextButton(\n            onPressed: () {\n              if (_titleController.text.isEmpty) {\n                SmartDialog.showToast('名称不能为空');\n                return;\n              }\n              FavHttp.addOrEditFolder(\n                isAdd: _mediaId == null,\n                mediaId: _mediaId,\n                title: _titleController.text,\n                privacy: _isPublic ? 0 : 1,\n                cover: _cover ?? '',\n                intro: _introController.text,\n              ).then((res) {\n                if (res case Success(:final response)) {\n                  Get.back(result: response);\n                  SmartDialog.showToast('${_mediaId != null ? '编辑' : '创建'}成功');\n                } else {\n                  res.toast();\n                }\n              });\n            },\n            child: const Text('完成'),\n          ),\n          const SizedBox(width: 16),\n        ],\n      ),\n      body: _mediaId != null\n          ? _titleController.text.isNotEmpty\n                ? _buildBody(theme)\n                : _errMsg?.isNotEmpty == true\n                ? scrollErrorWidget(errMsg: _errMsg, onReload: _getFolderInfo)\n                : m3eLoading\n          : _buildBody(theme),\n    );\n  }\n\n  Future<void> _pickImg(BuildContext context, ThemeData theme) async {\n    try {\n      XFile? pickedFile = await _imagePicker.pickImage(\n        source: ImageSource.gallery,\n        imageQuality: 100,\n      );\n      if (pickedFile != null && mounted) {\n        String imgPath = pickedFile.path;\n        if (PlatformUtils.isMobile) {\n          final croppedFile = await ImageCropper.platform.cropImage(\n            sourcePath: imgPath,\n            uiSettings: [\n              AndroidUiSettings(\n                toolbarTitle: '裁剪',\n                toolbarColor: theme.colorScheme.secondaryContainer,\n                toolbarWidgetColor: theme.colorScheme.onSecondaryContainer,\n                statusBarLight: theme.colorScheme.isLight,\n                aspectRatioPresets: [CropAspectRatioPreset.ratio16x9],\n                lockAspectRatio: true,\n                hideBottomControls: true,\n                initAspectRatio: CropAspectRatioPreset.ratio16x9,\n              ),\n              IOSUiSettings(\n                title: '裁剪',\n                // aspectRatioPresets: [CropAspectRatioPreset.ratio16x9],\n                // aspectRatioLockEnabled: false,\n                // resetAspectRatioEnabled: false,\n                // aspectRatioPickerButtonHidden: true,\n              ),\n            ],\n          );\n          if (croppedFile != null) {\n            File(imgPath).tryDel();\n            imgPath = croppedFile.path;\n          }\n        }\n        MsgHttp.uploadImage(\n          path: imgPath,\n          bucket: 'medialist',\n          dir: 'cover',\n        ).then((res) {\n          if (context.mounted) {\n            if (res case Success(:final response)) {\n              _cover = response['location'];\n              (context as Element).markNeedsBuild();\n            } else {\n              res.toast();\n            }\n          }\n          if (PlatformUtils.isMobile) {\n            File(imgPath).tryDel();\n          }\n        });\n      }\n    } catch (e) {\n      SmartDialog.showToast(e.toString());\n    }\n  }\n\n  final leadingStyle = const TextStyle(fontSize: 14);\n\n  Widget _buildBody(ThemeData theme) => SingleChildScrollView(\n    padding: .only(bottom: MediaQuery.viewPaddingOf(context).bottom + 25),\n    child: Column(\n      spacing: 12,\n      children: [\n        if (_attr == null || !FavUtils.isDefaultFav(_attr!))\n          Builder(\n            builder: (context) {\n              return ListTile(\n                visualDensity: .standard,\n                tileColor: theme.colorScheme.onInverseSurface,\n                onTap: () {\n                  EasyThrottle.throttle(\n                    'imagePicker',\n                    const Duration(milliseconds: 500),\n                    () {\n                      if (_cover?.isNotEmpty == true) {\n                        showDialog(\n                          context: context,\n                          builder: (_) => AlertDialog(\n                            clipBehavior: Clip.hardEdge,\n                            contentPadding: const .symmetric(vertical: 12),\n                            content: Column(\n                              mainAxisSize: MainAxisSize.min,\n                              children: [\n                                ListTile(\n                                  dense: true,\n                                  onTap: () {\n                                    Get.back();\n                                    _pickImg(context, theme);\n                                  },\n                                  title: const Text(\n                                    '替换封面',\n                                    style: TextStyle(fontSize: 14),\n                                  ),\n                                ),\n                                ListTile(\n                                  dense: true,\n                                  onTap: () {\n                                    Get.back();\n                                    _cover = null;\n                                    (context as Element).markNeedsBuild();\n                                  },\n                                  title: const Text(\n                                    '移除封面',\n                                    style: TextStyle(fontSize: 14),\n                                  ),\n                                ),\n                              ],\n                            ),\n                          ),\n                        );\n                      } else {\n                        _pickImg(context, theme);\n                      }\n                    },\n                  );\n                },\n                leading: Text(\n                  '封面',\n                  style: leadingStyle,\n                ),\n                trailing: Row(\n                  spacing: 10,\n                  mainAxisSize: MainAxisSize.min,\n                  children: [\n                    if (_cover?.isNotEmpty == true)\n                      Padding(\n                        padding: const EdgeInsets.symmetric(vertical: 5),\n                        child: NetworkImgLayer(\n                          src: _cover,\n                          height: 55,\n                          width: 88,\n                          borderRadius: const BorderRadius.all(\n                            Radius.circular(6),\n                          ),\n                        ),\n                      ),\n                    Icon(\n                      Icons.keyboard_arrow_right,\n                      color: theme.colorScheme.outline,\n                    ),\n                  ],\n                ),\n              );\n            },\n          ),\n        ListTile(\n          tileColor: theme.colorScheme.onInverseSurface,\n          title: Row(\n            children: [\n              SizedBox(\n                width: 55,\n                child: Text.rich(\n                  TextSpan(\n                    children: [\n                      TextSpan(\n                        text: '*',\n                        style: TextStyle(\n                          fontSize: 14,\n                          color: theme.colorScheme.error,\n                        ),\n                      ),\n                      const TextSpan(\n                        text: '名称',\n                        style: TextStyle(fontSize: 14),\n                      ),\n                    ],\n                  ),\n                ),\n              ),\n              Expanded(\n                child: TextField(\n                  autofocus: true,\n                  readOnly: _attr != null && FavUtils.isDefaultFav(_attr!),\n                  controller: _titleController,\n                  style: TextStyle(\n                    fontSize: 14,\n                    color: _attr != null && FavUtils.isDefaultFav(_attr!)\n                        ? theme.colorScheme.outline\n                        : null,\n                  ),\n                  inputFormatters: [\n                    LengthLimitingTextInputFormatter(20),\n                  ],\n                  decoration: InputDecoration(\n                    isDense: true,\n                    hintText: '名称',\n                    hintStyle: TextStyle(\n                      fontSize: 14,\n                      color: theme.colorScheme.outline,\n                    ),\n                    border: const OutlineInputBorder(\n                      borderSide: BorderSide.none,\n                      gapPadding: 0,\n                    ),\n                    contentPadding: EdgeInsets.zero,\n                  ),\n                ),\n              ),\n            ],\n          ),\n        ),\n        if (_attr == null || !FavUtils.isDefaultFav(_attr!))\n          ListTile(\n            tileColor: theme.colorScheme.onInverseSurface,\n            title: Row(\n              crossAxisAlignment: CrossAxisAlignment.start,\n              children: [\n                SizedBox(\n                  width: 55,\n                  child: Text(\n                    '简介',\n                    style: TextStyle(\n                      fontSize: 14,\n                      color: theme.colorScheme.onSurfaceVariant,\n                    ),\n                  ),\n                ),\n                Expanded(\n                  child: TextField(\n                    minLines: 6,\n                    maxLines: 6,\n                    controller: _introController,\n                    style: const TextStyle(fontSize: 14),\n                    inputFormatters: [\n                      LengthLimitingTextInputFormatter(200),\n                    ],\n                    decoration: InputDecoration(\n                      isDense: true,\n                      hintText: '可填写简介',\n                      hintStyle: TextStyle(\n                        fontSize: 14,\n                        color: theme.colorScheme.outline,\n                      ),\n                      border: const OutlineInputBorder(\n                        borderSide: BorderSide.none,\n                        gapPadding: 0,\n                      ),\n                      contentPadding: EdgeInsets.zero,\n                    ),\n                  ),\n                ),\n              ],\n            ),\n          ),\n        Builder(\n          builder: (context) {\n            void onTap() {\n              _isPublic = !_isPublic;\n              (context as Element).markNeedsBuild();\n            }\n\n            return ListTile(\n              onTap: onTap,\n              tileColor: theme.colorScheme.onInverseSurface,\n              leading: Text(\n                '公开',\n                style: leadingStyle,\n              ),\n              trailing: Transform.scale(\n                alignment: Alignment.centerRight,\n                scale: 0.8,\n                child: Switch(\n                  value: _isPublic,\n                  onChanged: (value) => onTap(),\n                ),\n              ),\n            );\n          },\n        ),\n      ],\n    ),\n  );\n}\n"
  },
  {
    "path": "lib/pages/fav_detail/controller.dart",
    "content": "import 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/http/fav.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/fav_order_type.dart';\nimport 'package:PiliPlus/models/common/video/source_type.dart';\nimport 'package:PiliPlus/models_new/fav/fav_detail/data.dart';\nimport 'package:PiliPlus/models_new/fav/fav_detail/media.dart';\nimport 'package:PiliPlus/models_new/fav/fav_folder/list.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:PiliPlus/pages/common/multi_select/base.dart';\nimport 'package:PiliPlus/pages/common/multi_select/multi_select_controller.dart';\nimport 'package:PiliPlus/pages/fav_sort/view.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:flutter/services.dart' show ValueChanged;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nmixin BaseFavController\n    on\n        CommonListController<FavDetailData, FavDetailItemModel>,\n        DeleteItemMixin<FavDetailData, FavDetailItemModel> {\n  bool get isOwner;\n  int get mediaId;\n\n  ValueChanged<int>? updateCount;\n\n  void onViewFav(FavDetailItemModel item, int? index);\n\n  Future<void> onCancelFav(int index, int id, int type) async {\n    final res = await FavHttp.favVideo(\n      resources: '$id:$type',\n      delIds: mediaId.toString(),\n    );\n    if (res.isSuccess) {\n      loadingState\n        ..value.data!.removeAt(index)\n        ..refresh();\n      updateCount?.call(1);\n      SmartDialog.showToast('取消收藏');\n    } else {\n      res.toast();\n    }\n  }\n\n  @override\n  void onRemove() {\n    showConfirmDialog(\n      context: Get.context!,\n      content: '确认删除所选收藏吗？',\n      title: '提示',\n      onConfirm: () async {\n        final removeList = allChecked.toSet();\n        final res = await FavHttp.favVideo(\n          resources: removeList\n              .map((item) => '${item.id}:${item.type}')\n              .join(','),\n          delIds: mediaId.toString(),\n        );\n        if (res.isSuccess) {\n          updateCount?.call(removeList.length);\n          afterDelete(removeList);\n          SmartDialog.showToast('取消收藏');\n        } else {\n          res.toast();\n        }\n      },\n    );\n  }\n}\n\nclass FavDetailController\n    extends MultiSelectController<FavDetailData, FavDetailItemModel>\n    with BaseFavController {\n  @override\n  late int mediaId;\n  late String heroTag;\n  final Rx<FavFolderInfo> folderInfo = FavFolderInfo().obs;\n  final Rx<bool?> _isOwner = Rx<bool?>(null);\n  final Rx<FavOrderType> order = FavOrderType.mtime.obs;\n\n  @override\n  bool get isOwner => _isOwner.value ?? false;\n\n  late final account = Accounts.main;\n\n  late double dx = 0;\n  late final RxBool isPlayAll = Pref.enablePlayAll.obs;\n\n  void setIsPlayAll(bool isPlayAll) {\n    if (this.isPlayAll.value == isPlayAll) return;\n    this.isPlayAll.value = isPlayAll;\n    GStorage.setting.put(SettingBoxKey.enablePlayAll, isPlayAll);\n  }\n\n  @override\n  void onInit() {\n    super.onInit();\n\n    mediaId = int.parse(Get.parameters['mediaId']!);\n    heroTag = Get.parameters['heroTag']!;\n\n    queryData();\n  }\n\n  @override\n  bool? get hasFooter => true;\n\n  @override\n  List<FavDetailItemModel>? getDataList(FavDetailData response) {\n    if (response.hasMore == false) {\n      isEnd = true;\n    }\n    return response.medias;\n  }\n\n  @override\n  void checkIsEnd(int length) {\n    if (length >= folderInfo.value.mediaCount) {\n      isEnd = true;\n    }\n  }\n\n  @override\n  bool customHandleResponse(bool isRefresh, Success<FavDetailData> response) {\n    if (isRefresh) {\n      FavDetailData data = response.response;\n      folderInfo.value = data.info!;\n      _isOwner.value = data.info?.mid == account.mid;\n    }\n    return false;\n  }\n\n  @override\n  ValueChanged<int>? get updateCount =>\n      (count) => folderInfo\n        ..value.mediaCount -= count\n        ..refresh();\n\n  @override\n  Future<LoadingState<FavDetailData>> customGetData() =>\n      FavHttp.userFavFolderDetail(\n        pn: page,\n        ps: 20,\n        mediaId: mediaId,\n        order: order.value,\n      );\n\n  void toViewPlayAll() {\n    if (loadingState.value case Success(:final response)) {\n      if (response == null || response.isEmpty) return;\n\n      for (FavDetailItemModel element in response) {\n        if (element.ugc?.firstCid == null) {\n          continue;\n        } else {\n          onViewFav(element, null);\n          break;\n        }\n      }\n    }\n  }\n\n  @override\n  Future<void> onReload() {\n    scrollController.jumpToTop();\n    return super.onReload();\n  }\n\n  Future<void> onFav(bool isFav) async {\n    if (!account.isLogin) {\n      SmartDialog.showToast('账号未登录');\n      return;\n    }\n    final res = isFav\n        ? await FavHttp.unfavFavFolder(mediaId)\n        : await FavHttp.favFavFolder(mediaId);\n\n    if (res.isSuccess) {\n      folderInfo\n        ..value.favState = isFav ? 0 : 1\n        ..refresh();\n    }\n    res.toast();\n  }\n\n  Future<void> cleanFav() async {\n    final res = await FavHttp.cleanFav(mediaId: mediaId);\n    if (res.isSuccess) {\n      SmartDialog.showToast('清除成功');\n      Future.delayed(const Duration(milliseconds: 200), onReload);\n    } else {\n      res.toast();\n    }\n  }\n\n  void onSort() {\n    if (loadingState.value case Success(:final response)) {\n      if (response != null && response.isNotEmpty) {\n        if (folderInfo.value.mediaCount > 1000) {\n          SmartDialog.showToast('内容太多啦！超过1000不支持排序');\n          return;\n        }\n        Get.to(FavSortPage(favDetailController: this));\n      }\n    }\n  }\n\n  @override\n  void onViewFav(FavDetailItemModel item, int? index) {\n    final folder = folderInfo.value;\n    PageUtils.toVideoPage(\n      bvid: item.bvid,\n      cid: item.ugc!.firstCid!,\n      cover: item.cover,\n      title: item.title,\n      extraArguments: isPlayAll.value\n          ? {\n              'sourceType': SourceType.fav,\n              'mediaId': folder.id,\n              'oid': item.id,\n              'favTitle': folder.title,\n              'count': folder.mediaCount,\n              'desc': true,\n              if (index != null) 'isContinuePlaying': index != 0,\n              'isOwner': isOwner,\n            }\n          : null,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/fav_detail/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/common/widgets/flutter/pop_scope.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/http/fav.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/fav_order_type.dart';\nimport 'package:PiliPlus/models_new/fav/fav_detail/media.dart';\nimport 'package:PiliPlus/models_new/fav/fav_folder/list.dart';\nimport 'package:PiliPlus/pages/common/fab_mixin.dart'\n    show NoRightMarginFabLocation;\nimport 'package:PiliPlus/pages/dynamics_repost/view.dart';\nimport 'package:PiliPlus/pages/fav_detail/controller.dart';\nimport 'package:PiliPlus/pages/fav_detail/widget/fav_video_card.dart';\nimport 'package:PiliPlus/utils/fav_utils.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:PiliPlus/utils/request_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass FavDetailPage extends StatefulWidget {\n  const FavDetailPage({super.key});\n\n  @override\n  State<FavDetailPage> createState() => _FavDetailPageState();\n}\n\nclass _FavDetailPageState extends State<FavDetailPage> with GridMixin {\n  late final FavDetailController _favDetailController;\n  late String mediaId;\n\n  @override\n  void initState() {\n    super.initState();\n    mediaId = Get.parameters['mediaId']!;\n    _favDetailController = Get.put(\n      FavDetailController(),\n      tag: Utils.makeHeroTag(mediaId),\n    );\n  }\n\n  late EdgeInsets padding;\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    padding = MediaQuery.viewPaddingOf(context);\n    return Obx(\n      () {\n        final enableMultiSelect = _favDetailController.enableMultiSelect.value;\n        return popScope(\n          canPop: !enableMultiSelect,\n          onPopInvokedWithResult: (didPop, result) {\n            if (enableMultiSelect) {\n              _favDetailController.handleSelect();\n            }\n          },\n          child: Scaffold(\n            resizeToAvoidBottomInset: false,\n            floatingActionButtonLocation: const NoRightMarginFabLocation(),\n            floatingActionButton: Padding(\n              padding: const EdgeInsets.only(\n                right: kFloatingActionButtonMargin,\n              ),\n              child: Obx(\n                () => _favDetailController.folderInfo.value.mediaCount > 0\n                    ? AnimatedSlide(\n                        offset: _favDetailController.isPlayAll.value\n                            ? Offset.zero\n                            : const Offset(0.75, 0),\n                        duration: const Duration(milliseconds: 120),\n                        child: GestureDetector(\n                          onHorizontalDragDown: (details) =>\n                              _favDetailController.dx =\n                                  details.localPosition.dx,\n                          onHorizontalDragStart: (details) =>\n                              _favDetailController.setIsPlayAll(\n                                details.localPosition.dx <\n                                    _favDetailController.dx,\n                              ),\n                          child: FloatingActionButton.extended(\n                            onPressed: () {\n                              if (_favDetailController.isPlayAll.value) {\n                                _favDetailController.toViewPlayAll();\n                              } else {\n                                _favDetailController.setIsPlayAll(true);\n                              }\n                            },\n                            label: const Text('播放全部'),\n                            icon: const Icon(Icons.playlist_play),\n                          ),\n                        ),\n                      )\n                    : const SizedBox.shrink(),\n              ),\n            ),\n            body: refreshIndicator(\n              onRefresh: _favDetailController.onRefresh,\n              child: CustomScrollView(\n                physics: const AlwaysScrollableScrollPhysics(),\n                controller: _favDetailController.scrollController,\n                slivers: [\n                  _buildHeader(enableMultiSelect, theme),\n                  SliverPadding(\n                    padding: EdgeInsets.only(\n                      left: padding.left,\n                      right: padding.right,\n                      bottom: padding.bottom + 100,\n                    ),\n                    sliver: Obx(\n                      () => _buildBody(\n                        enableMultiSelect,\n                        theme,\n                        _favDetailController.loadingState.value,\n                      ),\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          ),\n        );\n      },\n    );\n  }\n\n  Widget _buildHeader(bool enableMultiSelect, ThemeData theme) {\n    return SliverAppBar.medium(\n      leadingWidth: enableMultiSelect ? 125 : null,\n      leading: enableMultiSelect\n          ? Row(\n              mainAxisSize: .min,\n              children: [\n                IconButton(\n                  tooltip: '取消',\n                  onPressed: _favDetailController.handleSelect,\n                  icon: const Icon(Icons.close_outlined),\n                ),\n                Obx(\n                  () {\n                    return Text(\n                      '已选: ${_favDetailController.checkedCount}',\n                      style: const TextStyle(fontSize: 15),\n                    );\n                  },\n                ),\n              ],\n            )\n          : null,\n      expandedHeight: kToolbarHeight + 127,\n      pinned: true,\n      title: enableMultiSelect\n          ? null\n          : Column(\n              crossAxisAlignment: CrossAxisAlignment.start,\n              children: [\n                Text(\n                  _favDetailController.folderInfo.value.title,\n                  style: theme.textTheme.titleMedium,\n                ),\n                Text(\n                  '共${_favDetailController.folderInfo.value.mediaCount}条视频',\n                  style: theme.textTheme.labelMedium,\n                ),\n              ],\n            ),\n      actions: enableMultiSelect ? _selectActions(theme) : _actions(theme),\n      flexibleSpace: _flexibleSpace(theme),\n    );\n  }\n\n  List<Widget> _actions(ThemeData theme) {\n    return [\n      IconButton(\n        tooltip: '搜索',\n        onPressed: () {\n          final folderInfo = _favDetailController.folderInfo.value;\n          Get.toNamed(\n            '/favSearch',\n            arguments: {\n              'type': 0,\n              'mediaId': int.parse(mediaId),\n              'title': folderInfo.title,\n              'count': folderInfo.mediaCount,\n              'isOwner': _favDetailController.isOwner,\n            },\n          );\n        },\n        icon: const Icon(Icons.search_outlined),\n      ),\n      Obx(() {\n        final attr = _favDetailController.folderInfo.value.attr;\n        return attr == -1 || !FavUtils.isPublicFav(attr)\n            ? const SizedBox.shrink()\n            : IconButton(\n                iconSize: 22,\n                tooltip: '分享',\n                onPressed: () => Utils.shareText(\n                  'https://www.bilibili.com/medialist/detail/ml${_favDetailController.mediaId}',\n                ),\n                icon: const Icon(Icons.share),\n              );\n      }),\n      Obx(\n        () {\n          return PopupMenuButton<FavOrderType>(\n            icon: const Icon(Icons.sort),\n            initialValue: _favDetailController.order.value,\n            tooltip: '排序方式',\n            onSelected: (value) => _favDetailController\n              ..order.value = value\n              ..onReload(),\n            itemBuilder: (context) => FavOrderType.values\n                .map(\n                  (e) => PopupMenuItem(\n                    value: e,\n                    child: Text(e.label),\n                  ),\n                )\n                .toList(),\n          );\n        },\n      ),\n      PopupMenuButton(\n        icon: const Icon(Icons.more_vert),\n        itemBuilder: (context) {\n          final isOwner = _favDetailController.isOwner;\n          final folderInfo = _favDetailController.folderInfo.value;\n          return [\n            if (isOwner) ...[\n              PopupMenuItem(\n                onTap: _favDetailController.onSort,\n                child: const Text('排序'),\n              ),\n              PopupMenuItem(\n                onTap: () =>\n                    Get.toNamed(\n                      '/createFav',\n                      parameters: {'mediaId': mediaId},\n                    )?.then((res) {\n                      if (res is FavFolderInfo) {\n                        _favDetailController.folderInfo.value = res;\n                      }\n                    }),\n                child: const Text('编辑信息'),\n              ),\n            ] else\n              PopupMenuItem(\n                onTap: () =>\n                    _favDetailController.onFav(folderInfo.favState == 1),\n                child: Text('${folderInfo.favState == 1 ? '取消' : ''}收藏'),\n              ),\n            if (FavUtils.isPublicFav(folderInfo.attr))\n              PopupMenuItem(\n                onTap: () => showModalBottomSheet(\n                  context: context,\n                  isScrollControlled: true,\n                  useSafeArea: true,\n                  builder: (context) => RepostPanel(\n                    rid: _favDetailController.mediaId,\n                    dynType: 4300,\n                    pic: folderInfo.cover,\n                    title: folderInfo.title,\n                    uname: folderInfo.upper?.name,\n                  ),\n                ),\n                child: const Text('分享至动态'),\n              ),\n            if (isOwner) ...<PopupMenuEntry>[\n              PopupMenuItem(\n                onTap: _favDetailController.cleanFav,\n                child: const Text('清除失效内容'),\n              ),\n              if (!FavUtils.isDefaultFav(folderInfo.attr)) ...[\n                const PopupMenuDivider(height: 12),\n                PopupMenuItem(\n                  onTap: () => showConfirmDialog(\n                    context: context,\n                    title: '确定删除该收藏夹?',\n                    onConfirm: () =>\n                        FavHttp.deleteFolder(mediaIds: mediaId).then((res) {\n                          if (res.isSuccess) {\n                            SmartDialog.showToast('删除成功');\n                            Get.back(result: true);\n                          } else {\n                            res.toast();\n                          }\n                        }),\n                  ),\n                  child: Text(\n                    '删除',\n                    style: TextStyle(\n                      color: theme.colorScheme.error,\n                    ),\n                  ),\n                ),\n              ],\n            ],\n          ];\n        },\n      ),\n      const SizedBox(width: 10),\n    ];\n  }\n\n  List<Widget> _selectActions(ThemeData theme) {\n    final btnStyle = TextButton.styleFrom(visualDensity: .compact);\n    final textStyle = TextStyle(color: theme.colorScheme.onSurfaceVariant);\n    return [\n      TextButton(\n        style: btnStyle,\n        onPressed: () => _favDetailController.handleSelect(checked: true),\n        child: const Text('全选'),\n      ),\n      TextButton(\n        style: btnStyle,\n        onPressed: () => RequestUtils.onCopyOrMove<FavDetailItemModel>(\n          context: context,\n          isCopy: true,\n          ctr: _favDetailController,\n          mediaId: _favDetailController.mediaId,\n          mid: _favDetailController.account.mid,\n        ),\n        child: Text('复制', style: textStyle),\n      ),\n      TextButton(\n        style: btnStyle,\n        onPressed: () => RequestUtils.onCopyOrMove<FavDetailItemModel>(\n          context: context,\n          isCopy: false,\n          ctr: _favDetailController,\n          mediaId: _favDetailController.mediaId,\n          mid: _favDetailController.account.mid,\n        ),\n        child: Text('移动', style: textStyle),\n      ),\n      TextButton(\n        style: btnStyle,\n        onPressed: _favDetailController.onRemove,\n        child: Text(\n          '删除',\n          style: TextStyle(color: theme.colorScheme.error),\n        ),\n      ),\n      const SizedBox(width: 10),\n    ];\n  }\n\n  Widget _flexibleSpace(ThemeData theme) {\n    final style = TextStyle(\n      height: 1,\n      fontSize: 12.5,\n      color: theme.colorScheme.outline,\n    );\n    return FlexibleSpaceBar(\n      background: Padding(\n        padding: EdgeInsets.only(\n          top: kToolbarHeight + padding.top + 10,\n          left: 12 + padding.left,\n          right: 12,\n          bottom: 7,\n        ),\n        child: SizedBox(\n          height: 110,\n          child: Obx(\n            () {\n              final folderInfo = _favDetailController.folderInfo.value;\n              return Row(\n                spacing: 12,\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  Stack(\n                    clipBehavior: Clip.none,\n                    children: [\n                      Hero(\n                        tag: _favDetailController.heroTag,\n                        child: NetworkImgLayer(\n                          width: 176,\n                          height: 110,\n                          src: folderInfo.cover,\n                        ),\n                      ),\n                      Positioned(\n                        right: 6,\n                        top: 6,\n                        child: Obx(() {\n                          if (_favDetailController.isOwner ||\n                              _favDetailController.loadingState.value\n                                  is! Success) {\n                            return const SizedBox.shrink();\n                          }\n                          bool isFav = folderInfo.favState == 1;\n                          return iconButton(\n                            size: 28,\n                            iconSize: 18,\n                            tooltip: '${isFav ? '取消' : ''}收藏',\n                            onPressed: () => _favDetailController.onFav(isFav),\n                            icon: isFav\n                                ? const Icon(Icons.favorite)\n                                : const Icon(Icons.favorite_border),\n                            bgColor: isFav\n                                ? theme.colorScheme.secondaryContainer\n                                : theme.colorScheme.onInverseSurface,\n                            iconColor: isFav\n                                ? theme.colorScheme.onSecondaryContainer\n                                : theme.colorScheme.onSurfaceVariant,\n                          );\n                        }),\n                      ),\n                    ],\n                  ),\n                  if (folderInfo.title.isNotEmpty)\n                    Expanded(\n                      child: Column(\n                        crossAxisAlignment: CrossAxisAlignment.start,\n                        children: [\n                          Expanded(\n                            child: Text(\n                              folderInfo.title,\n                              maxLines: 2,\n                              overflow: TextOverflow.ellipsis,\n                              style: TextStyle(\n                                fontSize: theme.textTheme.titleMedium!.fontSize,\n                                fontWeight: FontWeight.bold,\n                              ),\n                            ),\n                          ),\n                          GestureDetector(\n                            onTap: () => Get.toNamed(\n                              '/member?mid=${folderInfo.upper!.mid}',\n                            ),\n                            child: Text(\n                              folderInfo.upper!.name!,\n                              style: TextStyle(\n                                color: theme.colorScheme.primary,\n                              ),\n                            ),\n                          ),\n                          const SizedBox(height: 4),\n                          if (folderInfo.intro?.isNotEmpty == true) ...[\n                            Text(\n                              folderInfo.intro!,\n                              style: style,\n                              maxLines: 2,\n                              overflow: TextOverflow.ellipsis,\n                            ),\n                            const SizedBox(height: 4),\n                          ],\n                          Text(\n                            '共${folderInfo.mediaCount}条视频 · '\n                            '${FavUtils.isPublicFavText(folderInfo.attr)}',\n                            style: style,\n                          ),\n                        ],\n                      ),\n                    ),\n                ],\n              );\n            },\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget _buildBody(\n    bool enableMultiSelect,\n    ThemeData theme,\n    LoadingState<List<FavDetailItemModel>?> loadingState,\n  ) {\n    return switch (loadingState) {\n      Loading() => gridSkeleton,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverGrid.builder(\n                gridDelegate: gridDelegate,\n                itemBuilder: (context, index) {\n                  if (index == response.length) {\n                    _favDetailController.onLoadMore();\n                    return Container(\n                      height: 60,\n                      alignment: Alignment.center,\n                      child: Text(\n                        _favDetailController.isEnd ? '没有更多了' : '加载中...',\n                        style: TextStyle(\n                          color: theme.colorScheme.outline,\n                          fontSize: 13,\n                        ),\n                      ),\n                    );\n                  }\n                  FavDetailItemModel item = response[index];\n                  return FavVideoCardH(\n                    item: item,\n                    index: index,\n                    ctr: _favDetailController,\n                  );\n                },\n                itemCount: response.length + 1,\n              )\n            : HttpError(onReload: _favDetailController.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _favDetailController.onReload,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/fav_detail/widget/fav_video_card.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/select_mask.dart';\nimport 'package:PiliPlus/common/widgets/stat/stat.dart';\nimport 'package:PiliPlus/grpc/bilibili/app/listener/v1.pbenum.dart'\n    show PlaylistSource;\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models/common/stat_type.dart';\nimport 'package:PiliPlus/models_new/fav/fav_detail/media.dart';\nimport 'package:PiliPlus/pages/audio/view.dart';\nimport 'package:PiliPlus/pages/fav_detail/controller.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/duration_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\nimport 'package:get/get.dart';\n\n// 收藏视频卡片 - 水平布局\nclass FavVideoCardH extends StatelessWidget {\n  final FavDetailItemModel item;\n  final int? index;\n  final BaseFavController? ctr;\n\n  const FavVideoCardH({\n    super.key,\n    required this.item,\n    this.index,\n    this.ctr,\n  }) : assert(ctr == null || index != null);\n\n  bool get isSort => ctr == null;\n\n  @override\n  Widget build(BuildContext context) {\n    final isOwner = !isSort && ctr!.isOwner;\n    late final enableMultiSelect = ctr?.enableMultiSelect.value ?? false;\n    final theme = Theme.of(context);\n\n    final onLongPress = isSort || enableMultiSelect\n        ? null\n        : isOwner && !enableMultiSelect\n        ? () {\n            ctr!\n              ..enableMultiSelect.value = true\n              ..onSelect(item);\n          }\n        : () => imageSaveDialog(\n            title: item.title,\n            cover: item.cover,\n            bvid: item.bvid,\n          );\n\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onTap: isSort\n            ? null\n            : enableMultiSelect\n            ? () => ctr!.onSelect(item)\n            : () {\n                if (!const [0, 16].contains(item.attr)) {\n                  Get.toNamed('/member?mid=${item.upper?.mid}');\n                  return;\n                }\n\n                switch (item.type) {\n                  case 12:\n                    AudioPage.toAudioPage(\n                      oid: item.id!,\n                      itemType: 3,\n                      from: PlaylistSource.AUDIO_CARD,\n                    );\n                    break;\n                  case 24:\n                    PageUtils.viewPgc(\n                      seasonId: item.ogv!.seasonId,\n                      epId: item.id,\n                    );\n                    break;\n                  default:\n                    ctr!.onViewFav(item, index);\n                    break;\n                }\n              },\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        child: Padding(\n          padding: const EdgeInsets.symmetric(\n            horizontal: StyleString.safeSpace,\n            vertical: 5,\n          ),\n          child: Row(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              AspectRatio(\n                aspectRatio: StyleString.aspectRatio,\n                child: LayoutBuilder(\n                  builder: (context, boxConstraints) {\n                    double maxWidth = boxConstraints.maxWidth;\n                    double maxHeight = boxConstraints.maxHeight;\n                    return Stack(\n                      clipBehavior: Clip.none,\n                      children: [\n                        NetworkImgLayer(\n                          src: item.cover,\n                          width: maxWidth,\n                          height: maxHeight,\n                        ),\n                        PBadge(\n                          text: DurationUtils.formatDuration(item.duration),\n                          right: 6.0,\n                          bottom: 6.0,\n                          type: PBadgeType.gray,\n                        ),\n                        if (item.type == 12)\n                          const PBadge(\n                            text: '音频',\n                            top: 6.0,\n                            right: 6.0,\n                            type: PBadgeType.gray,\n                          )\n                        else\n                          PBadge(\n                            text: item.ogv?.typeName,\n                            top: 6.0,\n                            right: 6.0,\n                            bottom: null,\n                            left: null,\n                          ),\n                        if (!isSort)\n                          Positioned.fill(\n                            child: selectMask(\n                              theme,\n                              item.checked,\n                            ),\n                          ),\n                      ],\n                    );\n                  },\n                ),\n              ),\n              const SizedBox(width: 10),\n              content(context, theme, isOwner),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget content(BuildContext context, ThemeData theme, isOwner) {\n    return Expanded(\n      child: Stack(\n        clipBehavior: Clip.none,\n        children: [\n          Column(\n            spacing: 3,\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              Text(\n                item.title!,\n                textAlign: TextAlign.start,\n                style: const TextStyle(\n                  letterSpacing: 0.3,\n                ),\n                maxLines: 2,\n                overflow: TextOverflow.ellipsis,\n              ),\n              if (item.type == 24 && item.intro?.isNotEmpty == true)\n                Text(\n                  item.intro!,\n                  maxLines: 2,\n                  overflow: TextOverflow.ellipsis,\n                  style: TextStyle(\n                    fontSize: 13,\n                    color: theme.colorScheme.outline,\n                  ),\n                ),\n              const Spacer(),\n              Text(\n                '${DateFormatUtils.dateFormat(item.favTime)} ${item.upper?.name}',\n                maxLines: 1,\n                overflow: TextOverflow.ellipsis,\n                style: TextStyle(\n                  height: 1,\n                  fontSize: 12,\n                  color: theme.colorScheme.outline,\n                ),\n              ),\n              if (item.type != 24)\n                Row(\n                  spacing: 8,\n                  children: [\n                    StatWidget(\n                      type: StatType.play,\n                      value: item.cntInfo?.play,\n                    ),\n                    StatWidget(\n                      type: StatType.danmaku,\n                      value: item.cntInfo?.danmaku,\n                    ),\n                  ],\n                ),\n            ],\n          ),\n          if (isOwner)\n            Positioned(\n              right: 0,\n              bottom: -8,\n              child: iconButton(\n                icon: const Icon(Icons.clear),\n                tooltip: '取消收藏',\n                iconColor: theme.colorScheme.outline,\n                onPressed: () => showDialog(\n                  context: context,\n                  builder: (context) => AlertDialog(\n                    title: const Text('提示'),\n                    content: const Text('要取消收藏吗?'),\n                    actions: [\n                      TextButton(\n                        onPressed: Get.back,\n                        child: Text(\n                          '取消',\n                          style: TextStyle(color: theme.colorScheme.outline),\n                        ),\n                      ),\n                      TextButton(\n                        onPressed: () {\n                          Get.back();\n                          ctr!.onCancelFav(index!, item.id!, item.type!);\n                        },\n                        child: const Text('确定取消'),\n                      ),\n                    ],\n                  ),\n                ),\n              ),\n            ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/fav_folder_sort/view.dart",
    "content": "import 'package:PiliPlus/http/fav.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/fav/fav_folder/list.dart';\nimport 'package:PiliPlus/pages/fav/video/controller.dart';\nimport 'package:PiliPlus/pages/fav/video/widgets/item.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass FavFolderSortPage extends StatefulWidget {\n  const FavFolderSortPage({super.key, required this.favController});\n\n  final FavController favController;\n\n  @override\n  State<FavFolderSortPage> createState() => _FavFolderSortPageState();\n}\n\nclass _FavFolderSortPageState extends State<FavFolderSortPage> {\n  FavController get _favController => widget.favController;\n\n  final GlobalKey _key = GlobalKey();\n  late List<FavFolderInfo> sortList = List<FavFolderInfo>.from(\n    _favController.loadingState.value.data!,\n  );\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        title: const Text('收藏夹排序'),\n        actions: [\n          TextButton(\n            onPressed: () async {\n              final res = await FavHttp.sortFavFolder(\n                sort: sortList.map((item) => item.id).join(','),\n              );\n              if (res.isSuccess) {\n                SmartDialog.showToast('排序完成');\n                _favController.loadingState.value = Success(sortList);\n                Get.back();\n              } else {\n                res.toast();\n              }\n            },\n            child: const Text('完成'),\n          ),\n          const SizedBox(width: 16),\n        ],\n      ),\n      body: _buildBody,\n    );\n  }\n\n  void onReorder(int oldIndex, int newIndex) {\n    if (oldIndex == 0 || newIndex == 0) {\n      SmartDialog.showToast('默认收藏夹不支持排序');\n      return;\n    }\n\n    if (newIndex > oldIndex) {\n      newIndex -= 1;\n    }\n\n    final tabsItem = sortList.removeAt(oldIndex);\n    sortList.insert(newIndex, tabsItem);\n\n    setState(() {});\n  }\n\n  Widget get _buildBody {\n    return ReorderableListView.builder(\n      key: _key,\n      onReorder: onReorder,\n      physics: const AlwaysScrollableScrollPhysics(),\n      itemCount: sortList.length,\n      padding:\n          MediaQuery.viewPaddingOf(context).copyWith(top: 0) +\n          const EdgeInsets.only(bottom: 100),\n      itemBuilder: (context, index) {\n        final item = sortList[index];\n        final key = item.id.toString();\n        return SizedBox(\n          key: Key(key),\n          height: 98,\n          child: FavVideoItem(\n            heroTag: key,\n            item: item,\n            onLongPress: index == 0\n                ? () => SmartDialog.showToast('默认收藏夹不支持排序')\n                : null,\n          ),\n        );\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/fav_panel/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/fav/fav_folder/list.dart';\nimport 'package:PiliPlus/pages/common/common_intro_controller.dart';\nimport 'package:PiliPlus/utils/fav_utils.dart';\nimport 'package:PiliPlus/utils/feed_back.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass FavPanel extends StatefulWidget {\n  const FavPanel({\n    super.key,\n    required this.ctr,\n    this.scrollController,\n  });\n\n  final FavMixin ctr;\n  final ScrollController? scrollController;\n\n  @override\n  State<FavPanel> createState() => _FavPanelState();\n}\n\nclass _FavPanelState extends State<FavPanel> {\n  LoadingState loadingState = LoadingState.loading();\n\n  @override\n  void initState() {\n    super.initState();\n    _query();\n  }\n\n  Future<void> _query() async {\n    final res = await widget.ctr.queryVideoInFolder();\n    if (mounted) {\n      loadingState = res;\n      setState(() {});\n    }\n  }\n\n  Widget get _buildBody {\n    late final list = widget.ctr.favFolderData.value.list!;\n    return switch (loadingState) {\n      Loading() => m3eLoading,\n      Success() => ListView.builder(\n        controller: widget.scrollController,\n        itemCount: list.length,\n        itemBuilder: (context, index) {\n          FavFolderInfo item = list[index];\n          return Material(\n            type: MaterialType.transparency,\n            child: Builder(\n              builder: (context) {\n                void onTap() {\n                  bool isChecked = item.favState == 1;\n                  item\n                    ..favState = isChecked ? 0 : 1\n                    ..mediaCount = isChecked\n                        ? item.mediaCount - 1\n                        : item.mediaCount + 1;\n                  (context as Element).markNeedsBuild();\n                }\n\n                return ListTile(\n                  onTap: onTap,\n                  dense: true,\n                  leading: FavUtils.isPublicFav(item.attr)\n                      ? const Icon(Icons.folder_outlined)\n                      : const Icon(Icons.lock_outline),\n                  minLeadingWidth: 0,\n                  title: Text(item.title),\n                  subtitle: Text(\n                    '${item.mediaCount}个内容 . ${FavUtils.isPublicFavText(item.attr)}',\n                  ),\n                  trailing: Transform.scale(\n                    scale: 0.9,\n                    child: Checkbox(\n                      value: item.favState == 1,\n                      onChanged: (bool? checkValue) => onTap(),\n                    ),\n                  ),\n                );\n              },\n            ),\n          );\n        },\n      ),\n      Error(:final errMsg) => scrollErrorWidget(\n        controller: widget.scrollController,\n        errMsg: errMsg,\n        onReload: _query,\n      ),\n    };\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context).colorScheme;\n    return Column(\n      children: [\n        AppBar(\n          backgroundColor: Colors.transparent,\n          leading: IconButton(\n            tooltip: '关闭',\n            onPressed: Get.back,\n            icon: const Icon(Icons.close_outlined),\n          ),\n          title: const Text('添加到收藏夹'),\n          actions: [\n            TextButton.icon(\n              onPressed: () => Get.toNamed('/createFav')?.then((data) {\n                if (data != null) {\n                  widget.ctr.favFolderData\n                    ..value.list?.insert(1, data)\n                    ..refresh();\n                }\n              }),\n              icon: Icon(\n                Icons.add,\n                color: theme.primary,\n              ),\n              label: const Text('新建收藏夹'),\n              style: TextButton.styleFrom(\n                padding: const EdgeInsets.symmetric(\n                  horizontal: 18,\n                  vertical: 14,\n                ),\n                visualDensity: VisualDensity.compact,\n              ),\n            ),\n            const SizedBox(width: 16),\n          ],\n        ),\n        Expanded(child: _buildBody),\n        Divider(\n          height: 1,\n          color: theme.outline.withValues(alpha: 0.1),\n        ),\n        Padding(\n          padding: EdgeInsets.only(\n            left: 20,\n            right: 20,\n            top: 12,\n            bottom: MediaQuery.viewPaddingOf(context).bottom + 12,\n          ),\n          child: Row(\n            spacing: 25,\n            mainAxisAlignment: MainAxisAlignment.end,\n            children: [\n              FilledButton.tonal(\n                onPressed: Get.back,\n                style: FilledButton.styleFrom(\n                  visualDensity: VisualDensity.compact,\n                  foregroundColor: theme.outline,\n                  backgroundColor: theme.onInverseSurface,\n                ),\n                child: const Text('取消'),\n              ),\n              FilledButton.tonal(\n                onPressed: () {\n                  feedBack();\n                  widget.ctr.actionFavVideo();\n                },\n                style: FilledButton.styleFrom(\n                  visualDensity: VisualDensity.compact,\n                ),\n                child: const Text('完成'),\n              ),\n            ],\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/fav_search/controller.dart",
    "content": "import 'package:PiliPlus/http/fav.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/fav_order_type.dart';\nimport 'package:PiliPlus/models/common/video/source_type.dart';\nimport 'package:PiliPlus/models_new/fav/fav_detail/data.dart';\nimport 'package:PiliPlus/models_new/fav/fav_detail/media.dart';\nimport 'package:PiliPlus/pages/common/multi_select/base.dart';\nimport 'package:PiliPlus/pages/common/search/common_search_controller.dart';\nimport 'package:PiliPlus/pages/fav_detail/controller.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:get/get.dart';\n\nclass FavSearchController\n    extends CommonSearchController<FavDetailData, FavDetailItemModel>\n    with\n        CommonMultiSelectMixin<FavDetailItemModel>,\n        DeleteItemMixin,\n        BaseFavController {\n  int type = Get.arguments['type'];\n  @override\n  int mediaId = Get.arguments['mediaId'];\n  @override\n  bool isOwner = Get.arguments['isOwner'];\n  dynamic count = Get.arguments['count'];\n  dynamic title = Get.arguments['title'];\n\n  final Rx<FavOrderType> order = FavOrderType.mtime.obs;\n\n  @override\n  Future<LoadingState<FavDetailData>> customGetData() =>\n      FavHttp.userFavFolderDetail(\n        pn: page,\n        ps: 20,\n        mediaId: mediaId,\n        keyword: editController.text,\n        type: type,\n        order: order.value,\n      );\n\n  @override\n  List<FavDetailItemModel>? getDataList(FavDetailData response) {\n    if (response.hasMore == false) {\n      isEnd = true;\n    }\n    return response.medias;\n  }\n\n  @override\n  void onViewFav(FavDetailItemModel item, int? index) => PageUtils.toVideoPage(\n    bvid: item.bvid,\n    cid: item.ugc!.firstCid!,\n    cover: item.cover,\n    title: item.title,\n    extraArguments: {\n      'sourceType': SourceType.fav,\n      'mediaId': mediaId,\n      'oid': item.id,\n      'favTitle': title,\n      'count': count,\n      'desc': true,\n      'isContinuePlaying': true,\n    },\n  );\n}\n"
  },
  {
    "path": "lib/pages/fav_search/view.dart",
    "content": "import 'package:PiliPlus/models/common/fav_order_type.dart';\nimport 'package:PiliPlus/models_new/fav/fav_detail/data.dart';\nimport 'package:PiliPlus/models_new/fav/fav_detail/media.dart';\nimport 'package:PiliPlus/pages/common/search/common_search_page.dart';\nimport 'package:PiliPlus/pages/fav_detail/widget/fav_video_card.dart';\nimport 'package:PiliPlus/pages/fav_search/controller.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:PiliPlus/utils/request_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass FavSearchPage extends StatefulWidget {\n  const FavSearchPage({super.key});\n\n  @override\n  State<FavSearchPage> createState() => _FavSearchPageState();\n}\n\nclass _FavSearchPageState\n    extends\n        CommonSearchPageState<\n          FavSearchPage,\n          FavDetailData,\n          FavDetailItemModel\n        > {\n  @override\n  final FavSearchController controller = Get.put(\n    FavSearchController(),\n    tag: Utils.generateRandomString(8),\n  );\n\n  @override\n  List<Widget>? get multiSelectActions {\n    final btnStyle = TextButton.styleFrom(visualDensity: .compact);\n    final textStyle = TextStyle(\n      color: ColorScheme.of(context).onSurfaceVariant,\n    );\n    return [\n      TextButton(\n        style: btnStyle,\n        onPressed: () => RequestUtils.onCopyOrMove<FavDetailItemModel>(\n          context: context,\n          isCopy: true,\n          ctr: controller,\n          mediaId: controller.mediaId,\n          mid: Accounts.main.mid,\n        ),\n        child: Text('复制', style: textStyle),\n      ),\n      TextButton(\n        style: btnStyle,\n        onPressed: () => RequestUtils.onCopyOrMove<FavDetailItemModel>(\n          context: context,\n          isCopy: false,\n          ctr: controller,\n          mediaId: controller.mediaId,\n          mid: Accounts.main.mid,\n        ),\n        child: Text('移动', style: textStyle),\n      ),\n    ];\n  }\n\n  @override\n  List<Widget>? get extraActions => [\n    Obx(\n      () {\n        return PopupMenuButton<FavOrderType>(\n          icon: const Icon(Icons.sort),\n          requestFocus: false,\n          initialValue: controller.order.value,\n          tooltip: '排序方式',\n          onSelected: (value) => controller\n            ..order.value = value\n            ..onReload(),\n          itemBuilder: (context) => FavOrderType.values\n              .map(\n                (e) => PopupMenuItem(\n                  value: e,\n                  child: Text(e.label),\n                ),\n              )\n              .toList(),\n        );\n      },\n    ),\n  ];\n\n  late final gridDelegate = Grid.videoCardHDelegate(context, minHeight: 110);\n\n  @override\n  Widget buildList(List<FavDetailItemModel> list) {\n    return SliverGrid.builder(\n      gridDelegate: gridDelegate,\n      itemBuilder: (context, index) {\n        if (index == list.length - 1) {\n          controller.onLoadMore();\n        }\n        final item = list[index];\n        return FavVideoCardH(\n          item: item,\n          index: index,\n          ctr: controller,\n        );\n      },\n      itemCount: list.length,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/fav_sort/view.dart",
    "content": "import 'package:PiliPlus/http/fav.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/fav/fav_detail/media.dart';\nimport 'package:PiliPlus/pages/fav_detail/controller.dart';\nimport 'package:PiliPlus/pages/fav_detail/widget/fav_video_card.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass FavSortPage extends StatefulWidget {\n  const FavSortPage({super.key, required this.favDetailController});\n\n  final FavDetailController favDetailController;\n\n  @override\n  State<FavSortPage> createState() => _FavSortPageState();\n}\n\nclass _FavSortPageState extends State<FavSortPage> {\n  FavDetailController get _favDetailController => widget.favDetailController;\n\n  final GlobalKey _key = GlobalKey();\n  late List<FavDetailItemModel> sortList = List<FavDetailItemModel>.from(\n    _favDetailController.loadingState.value.data!,\n  );\n  List<String> sort = <String>[];\n\n  void onLoadMore() {\n    if (_favDetailController.isEnd) {\n      return;\n    }\n    _favDetailController.onLoadMore().whenComplete(() {\n      try {\n        if (_favDetailController.loadingState.value case Success(\n          :final response,\n        )) {\n          sortList.addAll(response!.skip(sortList.length));\n          if (mounted) {\n            setState(() {});\n          }\n        }\n      } catch (_) {}\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        title: Text('排序: ${_favDetailController.folderInfo.value.title}'),\n        actions: [\n          TextButton(\n            onPressed: () async {\n              if (sort.isEmpty) {\n                Get.back();\n                return;\n              }\n              final res = await FavHttp.sortFav(\n                mediaId: _favDetailController.mediaId,\n                sort: sort.join(','),\n              );\n              if (res.isSuccess) {\n                SmartDialog.showToast('排序完成');\n                _favDetailController.loadingState.value = Success(sortList);\n                Get.back();\n              } else {\n                res.toast();\n              }\n            },\n            child: const Text('完成'),\n          ),\n          const SizedBox(width: 16),\n        ],\n      ),\n      body: _buildBody,\n    );\n  }\n\n  void onReorder(int oldIndex, int newIndex) {\n    if (newIndex > oldIndex) {\n      newIndex -= 1;\n    }\n\n    final oldItem = sortList[oldIndex];\n    final newItem = sortList.elementAtOrNull(\n      oldIndex > newIndex ? newIndex - 1 : newIndex,\n    );\n    sort.add(\n      '${newItem == null ? '0:0' : '${newItem.id}:${newItem.type}'}:${oldItem.id}:${oldItem.type}',\n    );\n\n    final tabsItem = sortList.removeAt(oldIndex);\n    sortList.insert(newIndex, tabsItem);\n\n    setState(() {});\n  }\n\n  Widget get _buildBody {\n    final child = ReorderableListView.builder(\n      key: _key,\n      onReorder: onReorder,\n      physics: const AlwaysScrollableScrollPhysics(),\n      padding:\n          MediaQuery.viewPaddingOf(context).copyWith(top: 0) +\n          const EdgeInsets.only(bottom: 100),\n      itemCount: sortList.length,\n      itemBuilder: (context, index) {\n        final item = sortList[index];\n        return SizedBox(\n          key: Key(item.id.toString()),\n          height: 98,\n          child: FavVideoCardH(item: item),\n        );\n      },\n    );\n    if (!_favDetailController.isEnd) {\n      return NotificationListener<ScrollEndNotification>(\n        onNotification: (notification) {\n          final metrics = notification.metrics;\n          if (metrics.pixels >= metrics.maxScrollExtent - 300) {\n            onLoadMore();\n          }\n          return false;\n        },\n        child: child,\n      );\n    }\n    return child;\n  }\n}\n"
  },
  {
    "path": "lib/pages/follow/child/child_controller.dart",
    "content": "import 'package:PiliPlus/http/follow.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/member.dart';\nimport 'package:PiliPlus/http/user.dart';\nimport 'package:PiliPlus/models/common/follow_order_type.dart';\nimport 'package:PiliPlus/models_new/follow/data.dart';\nimport 'package:PiliPlus/models_new/follow/list.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:PiliPlus/pages/follow/controller.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:get/get.dart';\n\nclass FollowChildController\n    extends CommonListController<FollowData, FollowItemModel> {\n  FollowChildController(this.controller, this.mid, this.tagid);\n  final FollowController? controller;\n  final int? tagid;\n  final int mid;\n  int? total;\n\n  late final loadSameFollow = controller?.isOwner == false;\n  late final Rx<LoadingState<List<FollowItemModel>?>> sameState =\n      LoadingState<List<FollowItemModel>?>.loading().obs;\n\n  late final Rx<FollowOrderType> orderType = Pref.followOrderType.obs;\n\n  void setOrderType(FollowOrderType type) {\n    orderType.value = type;\n    GStorage.setting.put(SettingBoxKey.followOrderType, type.index);\n  }\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n    if (loadSameFollow) {\n      _loadSameFollow();\n    }\n  }\n\n  @override\n  List<FollowItemModel>? getDataList(FollowData response) {\n    total = response.total;\n    return response.list;\n  }\n\n  @override\n  void checkIsEnd(int length) {\n    if (total != null && length >= total!) {\n      isEnd = true;\n    }\n  }\n\n  @override\n  bool customHandleResponse(bool isRefresh, Success<FollowData> response) {\n    if (controller != null) {\n      try {\n        if (controller!.isOwner &&\n            tagid == null &&\n            isRefresh &&\n            controller!.followState.value.isSuccess) {\n          controller!.tabs\n            ..[0].count = response.response.total\n            ..refresh();\n        }\n      } catch (_) {}\n    }\n    return false;\n  }\n\n  @override\n  Future<LoadingState<FollowData>> customGetData() {\n    if (tagid != null) {\n      return MemberHttp.followUpGroup(mid: mid, tagid: tagid, pn: page);\n    }\n\n    return FollowHttp.followings(\n      vmid: mid,\n      pn: page,\n      orderType: orderType.value.type,\n    );\n  }\n\n  Future<void> _loadSameFollow() async {\n    final res = await UserHttp.sameFollowing(mid: mid);\n    if (res case Success(:final response)) {\n      sameState.value = Success(response.list);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/follow/child/child_view.dart",
    "content": "import 'dart:math';\n\nimport 'package:PiliPlus/common/skeleton/msg_feed_top.dart';\nimport 'package:PiliPlus/common/widgets/button/more_btn.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/follow_order_type.dart';\nimport 'package:PiliPlus/models_new/follow/list.dart';\nimport 'package:PiliPlus/pages/follow/child/child_controller.dart';\nimport 'package:PiliPlus/pages/follow/controller.dart';\nimport 'package:PiliPlus/pages/follow/widgets/follow_item.dart';\nimport 'package:PiliPlus/pages/follow_type/follow_same/view.dart';\nimport 'package:PiliPlus/pages/share/view.dart' show UserModel;\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass FollowChildPage extends StatefulWidget {\n  const FollowChildPage({\n    super.key,\n    this.tag,\n    this.controller,\n    required this.mid,\n    this.tagid,\n    this.onSelect,\n  });\n\n  final String? tag;\n  final FollowController? controller;\n  final int mid;\n  final int? tagid;\n  final ValueChanged<UserModel>? onSelect;\n\n  @override\n  State<FollowChildPage> createState() => _FollowChildPageState();\n}\n\nclass _FollowChildPageState extends State<FollowChildPage>\n    with AutomaticKeepAliveClientMixin {\n  late final FollowChildController _followController;\n\n  @override\n  void initState() {\n    super.initState();\n    _followController = Get.put(\n      FollowChildController(widget.controller, widget.mid, widget.tagid),\n      tag: '${widget.tag ?? Utils.generateRandomString(8)}${widget.tagid}',\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final colorScheme = ColorScheme.of(context);\n    final padding = MediaQuery.viewPaddingOf(context);\n    Widget child = Padding(\n      padding: EdgeInsets.only(left: padding.left, right: padding.right),\n      child: refreshIndicator(\n        onRefresh: _followController.onRefresh,\n        child: CustomScrollView(\n          controller: _followController.scrollController,\n          physics: const AlwaysScrollableScrollPhysics(),\n          slivers: [\n            if (_followController.loadSameFollow)\n              Obx(\n                () => _buildSameFollowing(\n                  colorScheme,\n                  _followController.sameState.value,\n                ),\n              ),\n            SliverPadding(\n              padding: EdgeInsets.only(bottom: padding.bottom + 100),\n              sliver: Obx(\n                () => _buildBody(_followController.loadingState.value),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n    if (widget.onSelect != null ||\n        (widget.controller?.isOwner == true && widget.tagid == null)) {\n      return Stack(\n        clipBehavior: Clip.none,\n        children: [\n          child,\n          Positioned(\n            right: kFloatingActionButtonMargin + padding.right,\n            bottom: kFloatingActionButtonMargin + padding.bottom,\n            child: FloatingActionButton.extended(\n              onPressed: () => _followController\n                ..setOrderType(\n                  _followController.orderType.value == FollowOrderType.def\n                      ? FollowOrderType.attention\n                      : FollowOrderType.def,\n                )\n                ..onReload(),\n              icon: const Icon(Icons.format_list_bulleted, size: 20),\n              label: Obx(() => Text(_followController.orderType.value.title)),\n            ),\n          ),\n        ],\n      );\n    }\n    return child;\n  }\n\n  Widget _buildBody(LoadingState<List<FollowItemModel>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => SliverList.builder(\n        itemCount: 12,\n        itemBuilder: (context, index) => const MsgFeedTopSkeleton(),\n      ),\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverList.builder(\n                itemCount: response.length,\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    _followController.onLoadMore();\n                  }\n                  final item = response[index];\n                  return FollowItem(\n                    item: item,\n                    isOwner: widget.controller?.isOwner,\n                    onSelect: widget.onSelect,\n                    afterMod: (attr) {\n                      item.attribute = attr == 0 ? -1 : 0;\n                      _followController.loadingState.refresh();\n                    },\n                  );\n                },\n              )\n            : HttpError(onReload: _followController.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _followController.onReload,\n      ),\n    };\n  }\n\n  Widget _buildSameFollowing(\n    ColorScheme colorScheme,\n    LoadingState<List<FollowItemModel>?> state,\n  ) {\n    return switch (state) {\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverMainAxisGroup(\n                slivers: [\n                  SliverToBoxAdapter(\n                    child: Padding(\n                      padding: const EdgeInsets.only(\n                        left: 16,\n                        right: 16,\n                        bottom: 6,\n                      ),\n                      child: Row(\n                        mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                        children: [\n                          Text(\n                            '我们的共同关注',\n                            style: TextStyle(\n                              color: colorScheme.onSurfaceVariant,\n                            ),\n                          ),\n                          moreTextButton(\n                            onTap: () => FollowSamePage.toFollowSamePage(\n                              mid: _followController.mid,\n                              name: widget.controller?.name.value,\n                            ),\n                            color: colorScheme.outline,\n                          ),\n                        ],\n                      ),\n                    ),\n                  ),\n                  SliverList.builder(\n                    itemCount: min(3, response.length),\n                    itemBuilder: (_, index) =>\n                        FollowItem(item: response[index]),\n                  ),\n                  SliverToBoxAdapter(\n                    child: Padding(\n                      padding: const EdgeInsets.only(\n                        left: 16,\n                        top: 16,\n                        bottom: 6,\n                      ),\n                      child: Text(\n                        '全部关注',\n                        style: TextStyle(\n                          color: colorScheme.onSurfaceVariant,\n                        ),\n                      ),\n                    ),\n                  ),\n                ],\n              )\n            : const SliverToBoxAdapter(),\n      _ => const SliverToBoxAdapter(),\n    };\n  }\n\n  @override\n  bool get wantKeepAlive =>\n      widget.onSelect != null || widget.controller?.tabController != null;\n}\n"
  },
  {
    "path": "lib/pages/follow/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/member.dart';\nimport 'package:PiliPlus/models/member/tags.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass FollowController extends GetxController with GetTickerProviderStateMixin {\n  late final int mid;\n  late final RxnString name;\n  late final bool isOwner;\n\n  late final Rx<LoadingState> followState = LoadingState.loading().obs;\n  late final RxList<MemberTagItemModel> tabs = <MemberTagItemModel>[].obs;\n  TabController? tabController;\n\n  @override\n  void onInit() {\n    super.onInit();\n    final Map? args = Get.arguments;\n    final ownerMid = Accounts.main.mid;\n    final int? mid = args?['mid'];\n    this.mid = mid ?? ownerMid;\n    isOwner = ownerMid == this.mid;\n    if (isOwner) {\n      queryFollowUpTags();\n    } else {\n      final String? name = args?['name'];\n      this.name = RxnString(name);\n      if (name == null) {\n        _queryUserName();\n      }\n    }\n  }\n\n  Future<void> _queryUserName() async {\n    final res = await MemberHttp.memberCardInfo(mid: mid);\n    name.value = res.dataOrNull?.card?.name;\n  }\n\n  Future<void> queryFollowUpTags() async {\n    final res = await MemberHttp.followUpTags();\n    if (res case Success(:final response)) {\n      tabs\n        ..assign(MemberTagItemModel(name: '全部关注'))\n        ..addAll(response);\n      int initialIndex = 0;\n      if (tabController != null) {\n        initialIndex = tabController!.index.clamp(0, tabs.length - 1);\n        tabController!.dispose();\n      }\n      tabController = TabController(\n        initialIndex: initialIndex,\n        length: tabs.length,\n        vsync: this,\n      );\n      followState.value = Success(tabs.hashCode);\n    } else {\n      followState.value = res;\n    }\n  }\n\n  @override\n  void onClose() {\n    tabController?.dispose();\n    super.onClose();\n  }\n\n  Future<void> onCreateTag(String tagName) async {\n    final res = await MemberHttp.createFollowTag(tagName);\n    if (res.isSuccess) {\n      followState.value = LoadingState.loading();\n      queryFollowUpTags();\n      SmartDialog.showToast('创建成功');\n    } else {\n      res.toast();\n    }\n  }\n\n  Future<void> onUpdateTag(MemberTagItemModel item, String tagName) async {\n    final res = await MemberHttp.updateFollowTag(item.tagid!, tagName);\n    if (res.isSuccess) {\n      item.name = tagName;\n      tabs.refresh();\n      SmartDialog.showToast('修改成功');\n    } else {\n      res.toast();\n    }\n  }\n\n  Future<void> onDelTag(int tagid) async {\n    final res = await MemberHttp.delFollowTag(tagid);\n    if (res.isSuccess) {\n      followState.value = LoadingState.loading();\n      queryFollowUpTags();\n      SmartDialog.showToast('删除成功');\n    } else {\n      res.toast();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/follow/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/common/widgets/view_safe_area.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/member/tags.dart';\nimport 'package:PiliPlus/pages/follow/child/child_controller.dart';\nimport 'package:PiliPlus/pages/follow/child/child_view.dart';\nimport 'package:PiliPlus/pages/follow/controller.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart' show LengthLimitingTextInputFormatter;\nimport 'package:get/get.dart';\n\nclass FollowPage extends StatefulWidget {\n  const FollowPage({super.key});\n\n  @override\n  State<FollowPage> createState() => _FollowPageState();\n\n  static void toFollowPage({dynamic mid, String? name}) {\n    if (mid == null) return;\n    Get.toNamed(\n      '/follow',\n      arguments: {\n        'mid': Utils.safeToInt(mid),\n        'name': name,\n      },\n    );\n  }\n}\n\nclass _FollowPageState extends State<FollowPage> {\n  final _tag = Utils.generateRandomString(8);\n  late final FollowController _followController;\n\n  @override\n  void initState() {\n    super.initState();\n    _followController = Get.put(FollowController(), tag: _tag);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        title: _followController.isOwner\n            ? const Text('我的关注')\n            : Obx(() {\n                final name = _followController.name.value;\n                if (name != null) return Text('$name的关注');\n                return const SizedBox.shrink();\n              }),\n        actions: _followController.isOwner\n            ? [\n                IconButton(\n                  onPressed: _onCreateTag,\n                  icon: const Icon(Icons.add),\n                  tooltip: '新建分组',\n                ),\n                IconButton(\n                  onPressed: () => Get.toNamed(\n                    '/followSearch',\n                    arguments: {\n                      'mid': _followController.mid,\n                    },\n                  ),\n                  icon: const Icon(Icons.search_outlined),\n                  tooltip: '搜索',\n                ),\n                PopupMenuButton(\n                  icon: const Icon(Icons.more_vert),\n                  itemBuilder: (context) => [\n                    PopupMenuItem(\n                      onTap: () => Get.toNamed('/blackListPage'),\n                      child: const Row(\n                        mainAxisSize: MainAxisSize.min,\n                        children: [\n                          Icon(Icons.block, size: 19),\n                          SizedBox(width: 10),\n                          Text('黑名单管理'),\n                        ],\n                      ),\n                    ),\n                  ],\n                ),\n                const SizedBox(width: 6),\n              ]\n            : null,\n      ),\n      body: _followController.isOwner\n          ? Obx(() => _buildBody(_followController.followState.value))\n          : _childPage(),\n    );\n  }\n\n  Widget _childPage([MemberTagItemModel? item]) => FollowChildPage(\n    tag: _tag,\n    controller: _followController,\n    mid: _followController.mid,\n    tagid: item?.tagid,\n  );\n\n  bool _isCustomTag(int? tagid) {\n    return tagid != null && tagid != 0 && tagid != -10 && tagid != -2;\n  }\n\n  Widget _buildBody(LoadingState loadingState) {\n    return switch (loadingState) {\n      Loading() => m3eLoading,\n      Success() => Column(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          ViewSafeArea(\n            child: TabBar(\n              isScrollable: true,\n              tabAlignment: TabAlignment.start,\n              controller: _followController.tabController,\n              tabs: List.generate(_followController.tabs.length, (index) {\n                return Obx(() {\n                  final item = _followController.tabs[index];\n                  int? count = item.count;\n                  if (_isCustomTag(item.tagid)) {\n                    return GestureDetector(\n                      behavior: HitTestBehavior.translucent,\n                      onLongPress: () {\n                        Feedback.forLongPress(context);\n                        _onHandleTag(index, item);\n                      },\n                      onSecondaryTap: PlatformUtils.isMobile\n                          ? null\n                          : () => _onHandleTag(index, item),\n                      child: Tab(\n                        child: Row(\n                          children: [\n                            Text(\n                              '${item.name}${count != null ? '($count)' : ''} ',\n                            ),\n                            const Icon(Icons.menu, size: 18),\n                          ],\n                        ),\n                      ),\n                    );\n                  }\n                  return Tab(\n                    text: '${item.name}${count != null ? '($count)' : ''}',\n                  );\n                });\n              }),\n              onTap: (value) {\n                if (!_followController.tabController!.indexIsChanging) {\n                  final item = _followController.tabs[value];\n                  // if (_isCustomTag(item.tagid)) {\n                  //   _onHandleTag(value, item);\n                  // }\n                  try {\n                    Get.find<FollowChildController>(\n                      tag: '$_tag${item.tagid}',\n                    ).animateToTop();\n                  } catch (_) {}\n                }\n              },\n            ),\n          ),\n          Expanded(\n            child: tabBarView(\n              controller: _followController.tabController,\n              children: _followController.tabs.map(_childPage).toList(),\n            ),\n          ),\n        ],\n      ),\n      Error() => _childPage(),\n    };\n  }\n\n  void _onHandleTag(int index, MemberTagItemModel item) {\n    showDialog(\n      context: context,\n      builder: (context) => AlertDialog(\n        clipBehavior: Clip.hardEdge,\n        contentPadding: const EdgeInsets.symmetric(vertical: 12),\n        content: Column(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            ListTile(\n              onTap: () {\n                Get.back();\n                String tagName = item.name!;\n                showConfirmDialog(\n                  context: context,\n                  title: '编辑分组名称',\n                  content: TextFormField(\n                    autofocus: true,\n                    initialValue: tagName,\n                    onChanged: (value) => tagName = value,\n                    inputFormatters: [\n                      LengthLimitingTextInputFormatter(16),\n                    ],\n                    decoration: const InputDecoration(\n                      border: OutlineInputBorder(),\n                    ),\n                  ),\n                  onConfirm: () {\n                    if (tagName.isNotEmpty) {\n                      _followController.onUpdateTag(item, tagName);\n                    }\n                  },\n                );\n              },\n              dense: true,\n              title: const Text(\n                '修改名称',\n                style: TextStyle(fontSize: 14),\n              ),\n            ),\n            ListTile(\n              onTap: () {\n                Get.back();\n                showConfirmDialog(\n                  context: context,\n                  title: '删除分组',\n                  content: '删除后，该分组下的用户依旧保留？',\n                  onConfirm: () => _followController.onDelTag(item.tagid!),\n                );\n              },\n              dense: true,\n              title: const Text(\n                '删除分组',\n                style: TextStyle(fontSize: 14),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  void _onCreateTag() {\n    String tagName = '';\n    showConfirmDialog(\n      context: context,\n      title: '新建分组',\n      content: TextFormField(\n        autofocus: true,\n        initialValue: tagName,\n        onChanged: (value) => tagName = value,\n        inputFormatters: [\n          LengthLimitingTextInputFormatter(16),\n        ],\n        decoration: const InputDecoration(border: OutlineInputBorder()),\n      ),\n      onConfirm: () => _followController.onCreateTag(tagName),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/follow/widgets/follow_item.dart",
    "content": "import 'package:PiliPlus/common/widgets/pendant_avatar.dart';\nimport 'package:PiliPlus/models_new/follow/list.dart';\nimport 'package:PiliPlus/pages/share/view.dart' show UserModel;\nimport 'package:PiliPlus/utils/feed_back.dart';\nimport 'package:PiliPlus/utils/request_utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass FollowItem extends StatelessWidget {\n  final FollowItemModel item;\n  final bool? isOwner;\n  final ValueChanged? afterMod;\n  final ValueChanged<UserModel>? onSelect;\n\n  const FollowItem({\n    super.key,\n    required this.item,\n    this.afterMod,\n    this.isOwner,\n    this.onSelect,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    final colorScheme = ColorScheme.of(context);\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onTap: () {\n          if (onSelect != null) {\n            onSelect!.call(\n              UserModel(\n                mid: item.mid,\n                name: item.uname!,\n                avatar: item.face!,\n                selected: true,\n              ),\n            );\n          } else {\n            feedBack();\n            Get.toNamed('/member?mid=${item.mid}');\n          }\n        },\n        child: Padding(\n          padding: const EdgeInsets.symmetric(\n            horizontal: 12,\n            vertical: 10,\n          ),\n          child: Row(\n            children: [\n              PendantAvatar(\n                size: 45,\n                badgeSize: 14,\n                avatar: item.face,\n                officialType: item.officialVerify?.type,\n              ),\n              const SizedBox(width: 10),\n              Expanded(\n                child: Column(\n                  spacing: 3,\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    Text(\n                      item.uname!,\n                      maxLines: 1,\n                      overflow: TextOverflow.ellipsis,\n                      style: const TextStyle(fontSize: 14),\n                    ),\n                    if (item.sign != null)\n                      Text(\n                        item.sign!,\n                        maxLines: 1,\n                        overflow: TextOverflow.ellipsis,\n                        style: TextStyle(\n                          fontSize: 13,\n                          color: colorScheme.outline,\n                        ),\n                      ),\n                  ],\n                ),\n              ),\n              if (isOwner ?? false)\n                FilledButton.tonal(\n                  onPressed: () => RequestUtils.actionRelationMod(\n                    context: context,\n                    mid: item.mid,\n                    isFollow: item.attribute != -1,\n                    afterMod: afterMod,\n                  ),\n                  style: FilledButton.styleFrom(\n                    visualDensity: .compact,\n                    tapTargetSize: .shrinkWrap,\n                    padding: const .symmetric(horizontal: 15),\n                    foregroundColor: item.attribute == -1\n                        ? null\n                        : colorScheme.outline,\n                    backgroundColor: item.attribute == -1\n                        ? null\n                        : colorScheme.onInverseSurface,\n                  ),\n                  child: Text(\n                    '${item.attribute == -1 ? '' : '已'}关注',\n                    style: const TextStyle(fontSize: 12),\n                  ),\n                ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/follow_search/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/member.dart';\nimport 'package:PiliPlus/models_new/follow/data.dart';\nimport 'package:PiliPlus/models_new/follow/list.dart';\nimport 'package:PiliPlus/pages/common/search/common_search_controller.dart';\n\nclass FollowSearchController\n    extends CommonSearchController<FollowData, FollowItemModel> {\n  FollowSearchController(this.mid);\n  final int mid;\n\n  @override\n  Future<LoadingState<FollowData>> customGetData() =>\n      MemberHttp.getfollowSearch(\n        mid: mid,\n        ps: 20,\n        pn: page,\n        name: editController.value.text,\n      );\n\n  @override\n  List<FollowItemModel>? getDataList(FollowData response) {\n    return response.list;\n  }\n}\n"
  },
  {
    "path": "lib/pages/follow_search/view.dart",
    "content": "import 'package:PiliPlus/models_new/follow/data.dart';\nimport 'package:PiliPlus/models_new/follow/list.dart';\nimport 'package:PiliPlus/pages/common/search/common_search_page.dart';\nimport 'package:PiliPlus/pages/follow/widgets/follow_item.dart';\nimport 'package:PiliPlus/pages/follow_search/controller.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass FollowSearchPage extends StatefulWidget {\n  const FollowSearchPage({\n    super.key,\n    this.mid,\n    this.isFromSelect = false,\n  });\n\n  final int? mid;\n  final bool isFromSelect;\n\n  @override\n  State<FollowSearchPage> createState() => _FollowSearchPageState();\n}\n\nclass _FollowSearchPageState\n    extends\n        CommonSearchPageState<FollowSearchPage, FollowData, FollowItemModel> {\n  @override\n  late final FollowSearchController controller;\n\n  @override\n  void initState() {\n    super.initState();\n    controller = Get.put(\n      FollowSearchController(widget.mid ?? Get.arguments['mid']),\n      tag: Utils.generateRandomString(8),\n    );\n  }\n\n  @override\n  Widget buildList(List<FollowItemModel> list) {\n    return SliverList.builder(\n      itemCount: list.length,\n      itemBuilder: ((context, index) {\n        if (index == list.length - 1) {\n          controller.onLoadMore();\n        }\n        return FollowItem(\n          item: list[index],\n          onSelect: widget.mid != null && widget.isFromSelect\n              ? (userModel) => Get.back(result: userModel)\n              : null,\n        );\n      }),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/follow_type/controller.dart",
    "content": "import 'package:PiliPlus/http/member.dart';\nimport 'package:PiliPlus/models_new/follow/data.dart';\nimport 'package:PiliPlus/models_new/follow/list.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:get/get.dart';\n\nabstract class FollowTypeController\n    extends CommonListController<FollowData, FollowItemModel> {\n  late final int mid;\n  late final RxnString name;\n\n  RxInt total = 0.obs;\n\n  @override\n  void onInit() {\n    super.onInit();\n    init();\n  }\n\n  void init() {\n    final ownerMid = Accounts.main.mid;\n    final Map? args = Get.arguments;\n    mid = args?['mid'] ?? ownerMid;\n    final String? name = args?['name'];\n    this.name = RxnString(name);\n    if (name == null) {\n      queryUserName();\n    }\n    queryData();\n  }\n\n  Future<void> queryUserName() async {\n    final res = await MemberHttp.memberCardInfo(mid: mid);\n    name.value = res.dataOrNull?.card?.name;\n  }\n\n  @override\n  List<FollowItemModel>? getDataList(FollowData response) {\n    total.value = response.total ?? 0;\n    return response.list;\n  }\n\n  @override\n  void checkIsEnd(int length) {\n    if (length >= total.value) {\n      isEnd = true;\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/follow_type/follow_same/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/user.dart';\nimport 'package:PiliPlus/models_new/follow/data.dart';\nimport 'package:PiliPlus/pages/follow_type/controller.dart';\n\nclass FollowSameController extends FollowTypeController {\n  @override\n  Future<LoadingState<FollowData>> customGetData() =>\n      UserHttp.sameFollowing(mid: mid, pn: page);\n}\n"
  },
  {
    "path": "lib/pages/follow_type/follow_same/view.dart",
    "content": "import 'package:PiliPlus/pages/follow_type/follow_same/controller.dart';\nimport 'package:PiliPlus/pages/follow_type/view.dart';\nimport 'package:PiliPlus/utils/extension/get_ext.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass FollowSamePage extends StatefulWidget {\n  const FollowSamePage({super.key});\n\n  @override\n  State<FollowSamePage> createState() => _FollowSamePageState();\n\n  static void toFollowSamePage({dynamic mid, String? name}) {\n    if (mid == null) return;\n    Get.toNamed(\n      '/sameFollowing',\n      arguments: {\n        'mid': Utils.safeToInt(mid),\n        'name': name,\n      },\n    );\n  }\n}\n\nclass _FollowSamePageState extends FollowTypePageState<FollowSamePage> {\n  @override\n  final controller = Get.putOrFind(\n    FollowSameController.new,\n    tag: Get.arguments?['mid']?.toString() ?? Utils.generateRandomString(8),\n  );\n\n  @override\n  PreferredSizeWidget get appBar => AppBar(\n    title: Obx(\n      () {\n        final name = controller.name.value;\n        return Text('${name == null ? '' : '我与$name的'}共同关注');\n      },\n    ),\n  );\n}\n"
  },
  {
    "path": "lib/pages/follow_type/followed/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/user.dart';\nimport 'package:PiliPlus/models_new/follow/data.dart';\nimport 'package:PiliPlus/pages/follow_type/controller.dart';\n\nclass FollowedController extends FollowTypeController {\n  @override\n  Future<LoadingState<FollowData>> customGetData() =>\n      UserHttp.followedUp(mid: mid, pn: page);\n}\n"
  },
  {
    "path": "lib/pages/follow_type/followed/view.dart",
    "content": "import 'package:PiliPlus/pages/follow_type/followed/controller.dart';\nimport 'package:PiliPlus/pages/follow_type/view.dart';\nimport 'package:PiliPlus/utils/extension/get_ext.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass FollowedPage extends StatefulWidget {\n  const FollowedPage({super.key});\n\n  @override\n  State<FollowedPage> createState() => _FollowedPageState();\n\n  static void toFollowedPage({dynamic mid, String? name}) {\n    if (mid == null) return;\n    Get.toNamed(\n      '/followed',\n      arguments: {\n        'mid': Utils.safeToInt(mid),\n        'name': name,\n      },\n    );\n  }\n}\n\nclass _FollowedPageState extends FollowTypePageState<FollowedPage> {\n  @override\n  final controller = Get.putOrFind(\n    FollowedController.new,\n    tag: Get.arguments?['mid']?.toString() ?? Utils.generateRandomString(8),\n  );\n\n  @override\n  PreferredSizeWidget get appBar => AppBar(\n    title: Obx(\n      () => Text(\n        '我关注的${controller.total.value}人也关注了${controller.name.value ?? 'TA'}',\n      ),\n    ),\n  );\n}\n"
  },
  {
    "path": "lib/pages/follow_type/view.dart",
    "content": "import 'package:PiliPlus/common/skeleton/msg_feed_top.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/view_sliver_safe_area.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/follow/list.dart';\nimport 'package:PiliPlus/pages/follow/widgets/follow_item.dart';\nimport 'package:PiliPlus/pages/follow_type/controller.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart'\n    hide SliverGridDelegateWithMaxCrossAxisExtent;\nimport 'package:get/get.dart';\n\nabstract class FollowTypePageState<T extends StatefulWidget> extends State<T> {\n  FollowTypeController get controller;\n\n  PreferredSizeWidget? get appBar;\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context).colorScheme;\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: appBar,\n      body: refreshIndicator(\n        onRefresh: controller.onRefresh,\n        child: CustomScrollView(\n          physics: const AlwaysScrollableScrollPhysics(),\n          // controller: controller.scrollController,\n          slivers: [\n            ViewSliverSafeArea(\n              sliver: Obx(\n                () => _buildBody(theme, controller.loadingState.value),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  late final gridDelegate = SliverGridDelegateWithMaxCrossAxisExtent(\n    maxCrossAxisExtent: Grid.smallCardWidth * 2,\n    mainAxisExtent: 66,\n  );\n\n  Widget _buildBody(\n    ColorScheme theme,\n    LoadingState<List<FollowItemModel>?> loadingState,\n  ) {\n    return switch (loadingState) {\n      Loading() => SliverGrid.builder(\n        gridDelegate: gridDelegate,\n        itemBuilder: (context, index) => const MsgFeedTopSkeleton(),\n        itemCount: 16,\n      ),\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverGrid.builder(\n                gridDelegate: gridDelegate,\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    controller.onLoadMore();\n                  }\n                  return buildItem(index, response[index]);\n                },\n                itemCount: response.length,\n              )\n            : HttpError(onReload: controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: controller.onReload,\n      ),\n    };\n  }\n\n  Widget buildItem(int index, FollowItemModel item) => FollowItem(item: item);\n}\n"
  },
  {
    "path": "lib/pages/follow_type/widgets/item.dart",
    "content": "import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models_new/follow/list.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass FollowTypeItem extends StatelessWidget {\n  const FollowTypeItem({\n    super.key,\n    required this.item,\n    this.onTap,\n    this.onLongPress,\n    this.onSecondaryTap,\n  });\n\n  final FollowItemModel item;\n  final VoidCallback? onTap;\n  final VoidCallback? onLongPress;\n  final VoidCallback? onSecondaryTap;\n\n  @override\n  Widget build(BuildContext context) {\n    return SizedBox(\n      height: 66,\n      child: InkWell(\n        onTap: onTap ?? () => Get.toNamed('/member?mid=${item.mid}'),\n        onLongPress: onLongPress,\n        onSecondaryTap: onSecondaryTap,\n        child: Padding(\n          padding: const EdgeInsets.symmetric(\n            horizontal: 12,\n            vertical: 10,\n          ),\n          child: Row(\n            spacing: 10,\n            children: [\n              NetworkImgLayer(\n                width: 45,\n                height: 45,\n                type: ImageType.avatar,\n                src: item.face,\n              ),\n              Expanded(\n                child: Column(\n                  spacing: 3,\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    Text(\n                      item.uname!,\n                      style: const TextStyle(fontSize: 14),\n                    ),\n                    if (item.sign case final sign?)\n                      Text(\n                        sign,\n                        maxLines: 1,\n                        overflow: TextOverflow.ellipsis,\n                        style: TextStyle(\n                          fontSize: 13,\n                          color: ColorScheme.of(context).outline,\n                        ),\n                      ),\n                  ],\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/group_panel/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/member.dart';\nimport 'package:PiliPlus/models/member/tags.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/feed_back.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass GroupPanel extends StatefulWidget {\n  final int mid;\n  final List? tags;\n  final ScrollController? scrollController;\n  const GroupPanel({\n    super.key,\n    required this.mid,\n    this.tags,\n    this.scrollController,\n  });\n\n  @override\n  State<GroupPanel> createState() => _GroupPanelState();\n}\n\nclass _GroupPanelState extends State<GroupPanel> {\n  LoadingState<List<MemberTagItemModel>> loadingState = LoadingState.loading();\n  RxBool showDefaultBtn = true.obs;\n  late final Set<int> tags = widget.tags == null\n      ? {}\n      : Set<int>.from(widget.tags!);\n\n  @override\n  void initState() {\n    super.initState();\n    _query();\n  }\n\n  void _query() {\n    MemberHttp.followUpTags().then((res) {\n      if (mounted) {\n        loadingState = res..dataOrNull?.removeFirstWhere((e) => e.tagid == 0);\n        showDefaultBtn.value = tags.isEmpty;\n        setState(() {});\n      }\n    });\n  }\n\n  Future<void> onSave() async {\n    if (!loadingState.isSuccess) {\n      Get.back();\n      return;\n    }\n    feedBack();\n    // 保存\n    final res = await MemberHttp.addUsers(\n      widget.mid.toString(),\n      tags.isEmpty ? '0' : tags.join(','),\n    );\n    if (res.isSuccess) {\n      SmartDialog.showToast('操作成功');\n      Get.back(result: tags);\n    } else {\n      res.toast();\n    }\n  }\n\n  Widget get _buildBody {\n    return switch (loadingState) {\n      Loading() => m3eLoading,\n      Success(:final response) => ListView.builder(\n        controller: widget.scrollController,\n        itemCount: response.length,\n        itemBuilder: (context, index) {\n          final item = response[index];\n          return Material(\n            type: MaterialType.transparency,\n            child: Builder(\n              builder: (context) {\n                void onTap() {\n                  final tagid = item.tagid!;\n                  if (tags.contains(tagid)) {\n                    tags.remove(tagid);\n                    item.count--;\n                  } else {\n                    tags.add(tagid);\n                    item.count++;\n                  }\n                  (context as Element).markNeedsBuild();\n                  showDefaultBtn.value = tags.isEmpty;\n                }\n\n                return ListTile(\n                  onTap: onTap,\n                  dense: true,\n                  leading: const Icon(Icons.group_outlined),\n                  minLeadingWidth: 0,\n                  title: Text('${item.name} (${item.count})'),\n                  subtitle: item.tip?.isNotEmpty == true\n                      ? Text(item.tip!)\n                      : null,\n                  trailing: Transform.scale(\n                    scale: 0.9,\n                    child: Checkbox(\n                      value: tags.contains(item.tagid),\n                      onChanged: (_) => onTap(),\n                    ),\n                  ),\n                );\n              },\n            ),\n          );\n        },\n      ),\n      Error(:final errMsg) => scrollErrorWidget(\n        controller: widget.scrollController,\n        errMsg: errMsg,\n        onReload: _query,\n      ),\n    };\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    return Column(\n      crossAxisAlignment: CrossAxisAlignment.end,\n      children: <Widget>[\n        AppBar(\n          backgroundColor: Colors.transparent,\n          leading: IconButton(\n            tooltip: '关闭',\n            onPressed: Get.back,\n            icon: const Icon(Icons.close_outlined),\n          ),\n          title: const Text('设置关注分组'),\n        ),\n        Expanded(child: _buildBody),\n        Divider(\n          height: 1,\n          color: theme.disabledColor.withValues(alpha: 0.08),\n        ),\n        Padding(\n          padding: EdgeInsets.only(\n            right: 20,\n            top: 12,\n            bottom: MediaQuery.viewPaddingOf(context).bottom + 12,\n          ),\n          child: FilledButton.tonal(\n            onPressed: onSave,\n            style: FilledButton.styleFrom(\n              visualDensity: VisualDensity.compact,\n            ),\n            child: Obx(() => Text(showDefaultBtn.value ? '保存至默认分组' : '保存')),\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/history/base_controller.dart",
    "content": "import 'package:PiliPlus/http/user.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass HistoryBaseController extends GetxController {\n  RxBool pauseStatus = false.obs;\n\n  RxBool enableMultiSelect = false.obs;\n  RxInt checkedCount = 0.obs;\n\n  final account = Accounts.history;\n\n  // 清空观看历史\n  void onClearHistory(BuildContext context, VoidCallback onSuccess) {\n    showDialog(\n      context: context,\n      builder: (context) => AlertDialog(\n        title: const Text('提示'),\n        content: const Text('啊叻？你要清空历史记录功能吗？'),\n        actions: [\n          TextButton(\n            onPressed: Get.back,\n            child: Text(\n              '取消',\n              style: TextStyle(color: Theme.of(context).colorScheme.outline),\n            ),\n          ),\n          TextButton(\n            onPressed: () async {\n              Get.back();\n              SmartDialog.showLoading(msg: '请求中');\n              final res = await UserHttp.clearHistory(account: account);\n              SmartDialog.dismiss();\n              if (res.isSuccess) {\n                SmartDialog.showToast('清空观看历史');\n                onSuccess();\n              } else {\n                res.toast();\n              }\n            },\n            child: const Text('确认清空'),\n          ),\n        ],\n      ),\n    );\n  }\n\n  // 暂停观看历史\n  void onPauseHistory(BuildContext context) {\n    final pauseStatus = !this.pauseStatus.value;\n    showDialog(\n      context: context,\n      builder: (context) => AlertDialog(\n        title: const Text('提示'),\n        content: Text(pauseStatus ? '啊叻？你要暂停历史记录功能吗？' : '啊叻？要恢复历史记录功能吗？'),\n        actions: [\n          TextButton(\n            onPressed: Get.back,\n            child: Text(\n              '取消',\n              style: TextStyle(color: Theme.of(context).colorScheme.outline),\n            ),\n          ),\n          TextButton(\n            onPressed: () async {\n              SmartDialog.showLoading(msg: '请求中');\n              final res = await UserHttp.pauseHistory(\n                pauseStatus,\n                account: account,\n              );\n              SmartDialog.dismiss();\n              if (res.isSuccess) {\n                SmartDialog.showToast(pauseStatus ? '暂停观看历史' : '恢复观看历史');\n                this.pauseStatus.value = pauseStatus;\n                GStorage.localCache.put(\n                  LocalCacheKey.historyPause,\n                  pauseStatus,\n                );\n              } else {\n                res.toast();\n              }\n              Get.back();\n            },\n            child: Text(pauseStatus ? '确认暂停' : '确认恢复'),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/history/controller.dart",
    "content": "import 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/user.dart';\nimport 'package:PiliPlus/models_new/history/data.dart';\nimport 'package:PiliPlus/models_new/history/list.dart';\nimport 'package:PiliPlus/models_new/history/tab.dart';\nimport 'package:PiliPlus/pages/common/multi_select/multi_select_controller.dart';\nimport 'package:PiliPlus/pages/history/base_controller.dart';\nimport 'package:PiliPlus/utils/accounts/account.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass HistoryController\n    extends MultiSelectController<HistoryData, HistoryItemModel>\n    with GetSingleTickerProviderStateMixin {\n  HistoryController(this.type);\n\n  late final baseCtr = Get.put(HistoryBaseController());\n\n  Account get account => baseCtr.account;\n\n  final String? type;\n  TabController? tabController;\n  late RxList<HistoryTab> tabs = <HistoryTab>[].obs;\n\n  int? max;\n  int? viewAt;\n\n  @override\n  RxInt get rxCount => baseCtr.checkedCount;\n\n  @override\n  RxBool get enableMultiSelect => baseCtr.enableMultiSelect;\n\n  @override\n  void onInit() {\n    super.onInit();\n    historyStatus();\n    queryData();\n  }\n\n  @override\n  Future<void> onRefresh() {\n    max = null;\n    viewAt = null;\n    return super.onRefresh();\n  }\n\n  @override\n  List<HistoryItemModel>? getDataList(HistoryData response) {\n    return response.list;\n  }\n\n  @override\n  bool customHandleResponse(bool isRefresh, Success<HistoryData> response) {\n    HistoryData data = response.response;\n    isEnd = data.list.isNullOrEmpty;\n    max = data.list?.lastOrNull?.history.oid;\n    viewAt = data.list?.lastOrNull?.viewAt;\n\n    if (isRefresh && type == null) {\n      if (tabs.isEmpty && data.tab?.isNotEmpty == true) {\n        tabs.value = data.tab!;\n        tabController = TabController(\n          length: data.tab!.length + 1,\n          vsync: this,\n        );\n      }\n    }\n\n    return false;\n  }\n\n  // 观看历史暂停状态\n  Future<void> historyStatus() async {\n    final res = await UserHttp.historyStatus(account: account);\n    if (res case Success(:final response)) {\n      baseCtr.pauseStatus.value = response;\n      GStorage.localCache.put(LocalCacheKey.historyPause, response);\n    } else {\n      res.toast();\n    }\n  }\n\n  // 删除某条历史记录\n  void delHistory(HistoryItemModel item) {\n    _onDelete({item});\n  }\n\n  // 删除已看历史记录\n  void onDelViewedHistory() {\n    final viewedList = loadingState.value.dataOrNull\n        ?.where((e) => e.progress == -1)\n        .toSet();\n    if (viewedList != null && viewedList.isNotEmpty) {\n      _onDelete(viewedList);\n    } else {\n      SmartDialog.showToast('无已看记录');\n    }\n  }\n\n  Future<void> _onDelete(Set<HistoryItemModel> removeList) async {\n    SmartDialog.showLoading(msg: '请求中');\n    final res = await UserHttp.delHistory(\n      removeList\n          .map((item) => '${item.history.business}_${item.kid}')\n          .join(','),\n      account: account,\n    );\n    SmartDialog.dismiss();\n    if (res.isSuccess) {\n      afterDelete(removeList);\n      SmartDialog.showToast('已删除');\n    } else {\n      res.toast();\n    }\n  }\n\n  // 删除选中的记录\n  @override\n  void onRemove() {\n    showConfirmDialog(\n      context: Get.context!,\n      content: '确认删除所选历史记录吗？',\n      title: '提示',\n      onConfirm: () => _onDelete(allChecked.toSet()),\n    );\n  }\n\n  @override\n  Future<LoadingState<HistoryData>> customGetData() => UserHttp.historyList(\n    type: type ?? 'all',\n    max: max,\n    viewAt: viewAt,\n    account: account,\n  );\n\n  @override\n  void onClose() {\n    tabController?.dispose();\n    super.onClose();\n  }\n\n  @override\n  Future<void> onReload() {\n    scrollController.jumpToTop();\n    return super.onReload();\n  }\n}\n"
  },
  {
    "path": "lib/pages/history/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/appbar/appbar.dart';\nimport 'package:PiliPlus/common/widgets/flutter/page/tabs.dart';\nimport 'package:PiliPlus/common/widgets/flutter/pop_scope.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/gesture/horizontal_drag_gesture_recognizer.dart';\nimport 'package:PiliPlus/common/widgets/keep_alive_wrapper.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/history/list.dart';\nimport 'package:PiliPlus/pages/history/base_controller.dart';\nimport 'package:PiliPlus/pages/history/controller.dart';\nimport 'package:PiliPlus/pages/history/widgets/item.dart';\nimport 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart' hide TabBarView;\nimport 'package:get/get.dart';\n\nclass HistoryPage extends StatefulWidget {\n  const HistoryPage({super.key, this.type});\n\n  final String? type;\n\n  @override\n  State<HistoryPage> createState() => _HistoryPageState();\n}\n\nclass _HistoryPageState extends State<HistoryPage>\n    with AutomaticKeepAliveClientMixin, GridMixin {\n  late final HistoryController _historyController;\n\n  @override\n  void initState() {\n    super.initState();\n    _historyController = Get.put(\n      HistoryController(widget.type),\n      tag: widget.type ?? 'all',\n    );\n  }\n\n  HistoryController currCtr([int? index]) {\n    try {\n      index ??= _historyController.tabController!.index;\n      if (index != 0) {\n        return Get.find<HistoryController>(\n          tag: _historyController.tabs[index - 1].type,\n        );\n      }\n    } catch (_) {}\n    return _historyController;\n  }\n\n  @override\n  void dispose() {\n    Get.delete<HistoryBaseController>();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final padding = MediaQuery.viewPaddingOf(context);\n    Widget child = refreshIndicator(\n      onRefresh: _historyController.onRefresh,\n      child: CustomScrollView(\n        physics: const AlwaysScrollableScrollPhysics(),\n        controller: _historyController.scrollController,\n        slivers: [\n          SliverPadding(\n            padding: EdgeInsets.only(\n              top: 7,\n              bottom: padding.bottom + 100,\n            ),\n            sliver: Obx(\n              () => _buildBody(_historyController.loadingState.value),\n            ),\n          ),\n        ],\n      ),\n    );\n    if (widget.type != null) {\n      return child;\n    }\n    return Obx(\n      () {\n        final enableMultiSelect =\n            _historyController.baseCtr.enableMultiSelect.value;\n        return popScope(\n          canPop: !enableMultiSelect,\n          onPopInvokedWithResult: (didPop, result) {\n            if (enableMultiSelect) {\n              currCtr().handleSelect();\n            }\n          },\n          child: Scaffold(\n            resizeToAvoidBottomInset: false,\n            appBar: MultiSelectAppBarWidget(\n              visible: enableMultiSelect,\n              ctr: currCtr(),\n              child: _buildAppBar,\n            ),\n            body: Padding(\n              padding: EdgeInsets.only(\n                left: padding.left,\n                right: padding.right,\n              ),\n              child: Obx(() {\n                if (_historyController.tabs.isEmpty) {\n                  return child;\n                }\n                return Column(\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    TabBar(\n                      controller: _historyController.tabController,\n                      onTap: (index) {\n                        if (!_historyController\n                            .tabController!\n                            .indexIsChanging) {\n                          currCtr().scrollController.animToTop();\n                        } else {\n                          if (enableMultiSelect) {\n                            currCtr(\n                              _historyController.tabController!.previousIndex,\n                            ).handleSelect();\n                          }\n                        }\n                      },\n                      tabs: [\n                        const Tab(text: '全部'),\n                        ..._historyController.tabs.map(\n                          (item) => Tab(text: item.name),\n                        ),\n                      ],\n                    ),\n                    Expanded(\n                      child: TabBarView<CustomHorizontalDragGestureRecognizer>(\n                        physics: enableMultiSelect\n                            ? const NeverScrollableScrollPhysics()\n                            : clampingScrollPhysics,\n                        controller: _historyController.tabController,\n                        horizontalDragGestureRecognizer:\n                            CustomHorizontalDragGestureRecognizer.new,\n                        children: [\n                          KeepAliveWrapper(child: child),\n                          ..._historyController.tabs.map(\n                            (item) => HistoryPage(type: item.type),\n                          ),\n                        ],\n                      ),\n                    ),\n                  ],\n                );\n              }),\n            ),\n          ),\n        );\n      },\n    );\n  }\n\n  AppBar get _buildAppBar => AppBar(\n    title: const Text('观看记录'),\n    bottom: _buildPauseTip,\n    actions: [\n      IconButton(\n        tooltip: '搜索',\n        onPressed: () => Get.toNamed('/historySearch'),\n        icon: const Icon(Icons.search_outlined),\n      ),\n      PopupMenuButton(\n        itemBuilder: (_) => [\n          PopupMenuItem(\n            onTap: () => _historyController.baseCtr.onPauseHistory(context),\n            child: Text(\n              !_historyController.baseCtr.pauseStatus.value\n                  ? '暂停观看记录'\n                  : '恢复观看记录',\n            ),\n          ),\n          PopupMenuItem(\n            onTap: () => _historyController.baseCtr.onClearHistory(\n              context,\n              () {\n                _historyController.loadingState.value = const Success(null);\n                if (_historyController.tabController != null) {\n                  for (final item in _historyController.tabs) {\n                    try {\n                      Get.find<HistoryController>(\n                        tag: item.type,\n                      ).loadingState.value = const Success(\n                        null,\n                      );\n                    } catch (_) {}\n                  }\n                }\n              },\n            ),\n            child: const Text('清空观看记录'),\n          ),\n          PopupMenuItem(\n            onTap: currCtr().onDelViewedHistory,\n            child: const Text('删除已看记录'),\n          ),\n        ],\n      ),\n      const SizedBox(width: 6),\n    ],\n  );\n\n  Widget _buildBody(LoadingState<List<HistoryItemModel>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => gridSkeleton,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverGrid.builder(\n                gridDelegate: gridDelegate,\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    _historyController.onLoadMore();\n                  }\n                  final item = response[index];\n                  return HistoryItem(\n                    item: item,\n                    ctr: _historyController,\n                    onDelete: (kid, business) =>\n                        _historyController.delHistory(item),\n                  );\n                },\n                itemCount: response.length,\n              )\n            : HttpError(onReload: _historyController.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _historyController.onReload,\n      ),\n    };\n  }\n\n  PreferredSizeWidget? get _buildPauseTip {\n    if (_historyController.baseCtr.pauseStatus.value) {\n      final theme = Theme.of(context).colorScheme;\n      return PreferredSize(\n        preferredSize: const Size.fromHeight(38),\n        child: Container(\n          height: 38,\n          color: theme.secondaryContainer.withValues(alpha: 0.8),\n          padding: const EdgeInsets.only(left: 16, right: 6),\n          child: Row(\n            children: [\n              Expanded(\n                child: Text.rich(\n                  strutStyle: const StrutStyle(height: 1, leading: 0),\n                  style: TextStyle(\n                    height: 1,\n                    color: theme.onSecondaryContainer,\n                  ),\n                  TextSpan(\n                    children: [\n                      WidgetSpan(\n                        alignment: PlaceholderAlignment.middle,\n                        child: Icon(\n                          Icons.info_outline,\n                          size: 18,\n                          color: theme.onSecondaryContainer,\n                        ),\n                      ),\n                      const TextSpan(text: ' 历史记录功能已关闭'),\n                    ],\n                  ),\n                ),\n              ),\n              GestureDetector(\n                behavior: HitTestBehavior.opaque,\n                onTap: () => _historyController.baseCtr.onPauseHistory(context),\n                child: Padding(\n                  padding: const EdgeInsets.symmetric(\n                    vertical: 6,\n                    horizontal: 10,\n                  ),\n                  child: Text(\n                    '点击开启',\n                    strutStyle: const StrutStyle(height: 1, leading: 0),\n                    style: TextStyle(height: 1, color: theme.primary),\n                  ),\n                ),\n              ),\n            ],\n          ),\n        ),\n      );\n    }\n\n    return null;\n  }\n\n  @override\n  bool get wantKeepAlive => widget.type != null;\n}\n"
  },
  {
    "path": "lib/pages/history/widgets/item.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/progress_bar/video_progress_indicator.dart';\nimport 'package:PiliPlus/common/widgets/select_mask.dart';\nimport 'package:PiliPlus/http/search.dart';\nimport 'package:PiliPlus/http/user.dart';\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models_new/history/list.dart';\nimport 'package:PiliPlus/pages/common/multi_select/base.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/duration_utils.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\n\nclass HistoryItem extends StatelessWidget {\n  final HistoryItemModel item;\n  final MultiSelectBase ctr;\n  final void Function(int kid, String business) onDelete;\n\n  const HistoryItem({\n    super.key,\n    required this.item,\n    required this.ctr,\n    required this.onDelete,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    final hasDuration = item.duration != null && item.duration != 0;\n    int aid = item.history.oid!;\n    String bvid = item.history.bvid ?? IdUtils.av2bv(aid);\n    final business = item.history.business;\n    final enableMultiSelect = ctr.enableMultiSelect.value;\n\n    final onLongPress = enableMultiSelect\n        ? null\n        : () => ctr\n            ..enableMultiSelect.value = true\n            ..onSelect(item);\n\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onTap: enableMultiSelect\n            ? () => ctr.onSelect(item)\n            : () async {\n                if (business?.contains('article') == true) {\n                  PageUtils.toDupNamed(\n                    '/articlePage',\n                    parameters: {\n                      'id': business == 'article-list'\n                          ? '${item.history.cid}'\n                          : '${item.history.oid}',\n                      'type': 'read',\n                    },\n                  );\n                } else if (business == 'live') {\n                  if (item.liveStatus == 1) {\n                    PageUtils.toLiveRoom(item.history.oid);\n                  } else {\n                    SmartDialog.showToast('直播未开播');\n                  }\n                } else if (business == 'pgc') {\n                  PageUtils.viewPgc(epId: item.history.epid);\n                } else if (business == 'cheese') {\n                  if (item.uri?.isNotEmpty == true) {\n                    PageUtils.viewPgcFromUri(\n                      item.uri!,\n                      isPgc: false,\n                      aid: item.history.oid,\n                    );\n                  }\n                } else {\n                  int? cid =\n                      item.history.cid ??\n                      await SearchHttp.ab2c(\n                        aid: aid,\n                        bvid: bvid,\n                        part: item.history.page,\n                      );\n                  if (cid != null) {\n                    PageUtils.toVideoPage(\n                      aid: aid,\n                      bvid: bvid,\n                      cid: cid,\n                      cover: item.cover,\n                      title: item.title,\n                    );\n                  }\n                }\n              },\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        child: Stack(\n          clipBehavior: Clip.none,\n          children: [\n            Padding(\n              padding: const EdgeInsets.symmetric(\n                horizontal: StyleString.safeSpace,\n                vertical: 5,\n              ),\n              child: Row(\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  AspectRatio(\n                    aspectRatio: StyleString.aspectRatio,\n                    child: LayoutBuilder(\n                      builder: (context, boxConstraints) {\n                        double maxWidth = boxConstraints.maxWidth;\n                        double maxHeight = boxConstraints.maxHeight;\n                        return Stack(\n                          clipBehavior: Clip.none,\n                          children: [\n                            NetworkImgLayer(\n                              src: item.cover?.isNotEmpty == true\n                                  ? item.cover\n                                  : item.covers?.firstOrNull ?? '',\n                              width: maxWidth,\n                              height: maxHeight,\n                            ),\n                            if (hasDuration)\n                              PBadge(\n                                text: item.progress == -1\n                                    ? '已看完'\n                                    : '${DurationUtils.formatDuration(item.progress)}/${DurationUtils.formatDuration(item.duration)}',\n                                right: 6.0,\n                                bottom: 8.0,\n                                type: PBadgeType.gray,\n                              ),\n                            if (item.isFav == 1)\n                              const PBadge(\n                                text: '已收藏',\n                                top: 6.0,\n                                right: 6.0,\n                                type: PBadgeType.gray,\n                              )\n                            else if (item.badge?.isNotEmpty == true)\n                              PBadge(\n                                text: item.badge,\n                                top: 6.0,\n                                right: 6.0,\n                                type: business == 'live' && item.liveStatus != 1\n                                    ? PBadgeType.gray\n                                    : PBadgeType.primary,\n                              ),\n                            if (hasDuration &&\n                                item.progress != null &&\n                                item.progress != 0)\n                              Positioned(\n                                left: 0,\n                                right: 0,\n                                bottom: 0,\n                                child: VideoProgressIndicator(\n                                  color: theme.colorScheme.primary,\n                                  backgroundColor:\n                                      theme.colorScheme.secondaryContainer,\n                                  progress: item.progress == -1\n                                      ? 1\n                                      : item.progress! / item.duration!,\n                                ),\n                              ),\n                            Positioned.fill(\n                              child: selectMask(theme, item.checked),\n                            ),\n                          ],\n                        );\n                      },\n                    ),\n                  ),\n                  const SizedBox(width: 10),\n                  content(theme),\n                ],\n              ),\n            ),\n            Positioned(\n              right: 12,\n              bottom: 0,\n              width: 29,\n              height: 29,\n              child: PopupMenuButton(\n                padding: EdgeInsets.zero,\n                tooltip: '功能菜单',\n                icon: Icon(\n                  Icons.more_vert_outlined,\n                  color: theme.colorScheme.outline,\n                  size: 18,\n                ),\n                position: PopupMenuPosition.under,\n                itemBuilder: (_) => [\n                  if (item.authorMid != null &&\n                      item.authorName?.isNotEmpty == true)\n                    PopupMenuItem(\n                      onTap: () => Get.toNamed('/member?mid=${item.authorMid}'),\n                      height: 38,\n                      child: Row(\n                        children: [\n                          const Icon(\n                            MdiIcons.accountCircleOutline,\n                            size: 16,\n                          ),\n                          const SizedBox(width: 6),\n                          Text(\n                            '访问：${item.authorName}',\n                            style: const TextStyle(fontSize: 13),\n                          ),\n                        ],\n                      ),\n                    ),\n                  if (business != 'pgc' &&\n                      item.badge != '番剧' &&\n                      item.tagName?.contains('动画') != true &&\n                      business != 'live' &&\n                      business?.contains('article') != true)\n                    PopupMenuItem(\n                      onTap: () =>\n                          UserHttp.toViewLater(bvid: item.history.bvid),\n                      height: 38,\n                      child: const Row(\n                        children: [\n                          Icon(Icons.watch_later_outlined, size: 16),\n                          SizedBox(width: 6),\n                          Text('稍后再看', style: TextStyle(fontSize: 13)),\n                        ],\n                      ),\n                    ),\n                  PopupMenuItem(\n                    onTap: () => onDelete(item.kid!, business!),\n                    height: 38,\n                    child: const Row(\n                      children: [\n                        Icon(Icons.close_outlined, size: 16),\n                        SizedBox(width: 6),\n                        Text('删除记录', style: TextStyle(fontSize: 13)),\n                      ],\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget content(ThemeData theme) {\n    return Expanded(\n      child: Column(\n        spacing: 2,\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          Text(\n            item.title!,\n            style: TextStyle(\n              fontSize: theme.textTheme.bodyMedium!.fontSize,\n              height: 1.42,\n              letterSpacing: 0.3,\n            ),\n            maxLines: item.videos! > 1 ? 1 : 2,\n            overflow: TextOverflow.ellipsis,\n          ),\n          if (item.history.business == 'pgc' &&\n              item.showTitle?.isNotEmpty == true)\n            Text(\n              item.showTitle!,\n              style: TextStyle(\n                fontSize: 13,\n                color: theme.colorScheme.outline,\n              ),\n              maxLines: 2,\n              overflow: TextOverflow.ellipsis,\n            ),\n          const Spacer(),\n          if (item.authorName?.isNotEmpty == true)\n            Text(\n              item.authorName!,\n              maxLines: 1,\n              overflow: TextOverflow.ellipsis,\n              style: TextStyle(\n                fontSize: theme.textTheme.labelMedium!.fontSize,\n                color: theme.colorScheme.outline,\n              ),\n            ),\n          Text(\n            DateFormatUtils.chatFormat(item.viewAt!, isHistory: true),\n            style: TextStyle(\n              fontSize: theme.textTheme.labelMedium!.fontSize,\n              color: theme.colorScheme.outline,\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/history_search/controller.dart",
    "content": "import 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/user.dart';\nimport 'package:PiliPlus/models_new/history/data.dart';\nimport 'package:PiliPlus/models_new/history/list.dart';\nimport 'package:PiliPlus/pages/common/multi_select/base.dart';\nimport 'package:PiliPlus/pages/common/search/common_search_controller.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass HistorySearchController\n    extends CommonSearchController<HistoryData, HistoryItemModel>\n    with CommonMultiSelectMixin<HistoryItemModel>, DeleteItemMixin {\n  @override\n  Future<LoadingState<HistoryData>> customGetData() => UserHttp.searchHistory(\n    pn: page,\n    keyword: editController.value.text,\n    account: account,\n  );\n\n  @override\n  List<HistoryItemModel>? getDataList(HistoryData response) {\n    return response.list;\n  }\n\n  final account = Accounts.history;\n\n  Future<void> onDelHistory(int index, kid, String business) async {\n    final res = await UserHttp.delHistory(\n      '${business}_$kid',\n      account: account,\n    );\n    if (res.isSuccess) {\n      loadingState\n        ..value.data!.removeAt(index)\n        ..refresh();\n      SmartDialog.showToast('已删除');\n    } else {\n      res.toast();\n    }\n  }\n\n  @override\n  void onRemove() {\n    showConfirmDialog(\n      context: Get.context!,\n      content: '确认删除所选历史记录吗？',\n      title: '提示',\n      onConfirm: () async {\n        SmartDialog.showLoading(msg: '请求中');\n        final removeList = allChecked.toSet();\n        final response = await UserHttp.delHistory(\n          removeList\n              .map((item) => '${item.history.business!}_${item.kid!}')\n              .join(','),\n          account: account,\n        );\n        if (response.isSuccess) {\n          afterDelete(removeList);\n          SmartDialog.showToast('已删除');\n        } else {\n          response.toast();\n        }\n        SmartDialog.dismiss();\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/history_search/view.dart",
    "content": "import 'package:PiliPlus/models_new/history/data.dart';\nimport 'package:PiliPlus/models_new/history/list.dart';\nimport 'package:PiliPlus/pages/common/search/common_search_page.dart';\nimport 'package:PiliPlus/pages/history/widgets/item.dart';\nimport 'package:PiliPlus/pages/history_search/controller.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass HistorySearchPage extends StatefulWidget {\n  const HistorySearchPage({super.key});\n\n  @override\n  State<HistorySearchPage> createState() => _HistorySearchPageState();\n}\n\nclass _HistorySearchPageState\n    extends\n        CommonSearchPageState<\n          HistorySearchPage,\n          HistoryData,\n          HistoryItemModel\n        > {\n  @override\n  final HistorySearchController controller = Get.put(\n    HistorySearchController(),\n    tag: Utils.generateRandomString(8),\n  );\n\n  late final gridDelegate = Grid.videoCardHDelegate(context, minHeight: 110);\n\n  @override\n  Widget buildList(List<HistoryItemModel> list) {\n    return SliverGrid.builder(\n      gridDelegate: gridDelegate,\n      itemBuilder: (context, index) {\n        if (index == list.length - 1) {\n          controller.onLoadMore();\n        }\n        final item = list[index];\n        return HistoryItem(\n          item: item,\n          ctr: controller,\n          onDelete: (kid, business) =>\n              controller.onDelHistory(index, kid, business),\n        );\n      },\n      itemCount: list.length,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/home/controller.dart",
    "content": "import 'dart:async';\nimport 'dart:math';\n\nimport 'package:PiliPlus/http/api.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/models/common/home_tab_type.dart';\nimport 'package:PiliPlus/pages/common/common_controller.dart';\nimport 'package:PiliPlus/pages/main/controller.dart';\nimport 'package:PiliPlus/services/account_service.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/wbi_sign.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass HomeController extends GetxController\n    with GetSingleTickerProviderStateMixin, ScrollOrRefreshMixin {\n  late List<HomeTabType> tabs;\n  late TabController tabController;\n\n  RxBool? showTopBar;\n  late final bool hideTopBar;\n\n  bool enableSearchWord = Pref.enableSearchWord;\n  late final RxString defaultSearch = ''.obs;\n  late int lateCheckSearchAt = 0;\n\n  ScrollOrRefreshMixin get controller => tabs[tabController.index].ctr();\n\n  @override\n  ScrollController get scrollController => controller.scrollController;\n\n  AccountService accountService = Get.find<AccountService>();\n\n  @override\n  void onInit() {\n    super.onInit();\n\n    hideTopBar = !Pref.useSideBar && Pref.hideTopBar;\n    if (hideTopBar) {\n      final mainCtr = Get.find<MainController>();\n      switch (mainCtr.barHideType) {\n        case .instant:\n          showTopBar = RxBool(true);\n        case .sync:\n          mainCtr.barOffset ??= RxDouble(0.0);\n      }\n    }\n\n    if (enableSearchWord) {\n      lateCheckSearchAt = DateTime.now().millisecondsSinceEpoch;\n      querySearchDefault();\n    }\n\n    setTabConfig();\n  }\n\n  @override\n  Future<void> onRefresh() {\n    return controller.onRefresh().catchError((e) {\n      if (kDebugMode) debugPrint(e.toString());\n    });\n  }\n\n  void setTabConfig() {\n    final tabs = GStorage.setting.get(SettingBoxKey.tabBarSort) as List?;\n    if (tabs != null) {\n      this.tabs = tabs.map((i) => HomeTabType.values[i]).toList();\n    } else {\n      this.tabs = HomeTabType.values;\n    }\n\n    tabController = TabController(\n      initialIndex: max(0, this.tabs.indexOf(HomeTabType.rcmd)),\n      length: this.tabs.length,\n      vsync: this,\n    );\n  }\n\n  @override\n  void dispose() {\n    tabController.dispose();\n    super.dispose();\n  }\n\n  Future<void> querySearchDefault() async {\n    try {\n      final res = await Request().get(\n        Api.searchDefault,\n        queryParameters: await WbiSign.makSign({'web_location': 333.1365}),\n      );\n      if (res.data['code'] == 0) {\n        defaultSearch.value = res.data['data']?['name'] ?? '';\n        // defaultSearch.value = res.data['data']?['show_name'] ?? '';\n      }\n    } catch (_) {}\n  }\n}\n"
  },
  {
    "path": "lib/pages/home/view.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/custom_height_widget.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/pages/common/common_page.dart';\nimport 'package:PiliPlus/pages/home/controller.dart';\nimport 'package:PiliPlus/pages/main/controller.dart';\nimport 'package:PiliPlus/pages/mine/controller.dart';\nimport 'package:PiliPlus/utils/extension/get_ext.dart';\nimport 'package:PiliPlus/utils/extension/size_ext.dart';\nimport 'package:PiliPlus/utils/feed_back.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\n\nclass HomePage extends StatefulWidget {\n  const HomePage({super.key});\n\n  @override\n  State<HomePage> createState() => _HomePageState();\n}\n\nclass _HomePageState extends CommonPageState<HomePage>\n    with AutomaticKeepAliveClientMixin {\n  final _homeController = Get.putOrFind(HomeController.new);\n  final _mainController = Get.find<MainController>();\n\n  @override\n  bool get needsCorrection => _homeController.hideTopBar;\n\n  @override\n  bool get wantKeepAlive => true;\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final theme = Theme.of(context);\n    Widget tabBar;\n    if (_homeController.tabs.length > 1) {\n      tabBar = Padding(\n        padding: const EdgeInsets.only(top: 4),\n        child: SizedBox(\n          height: 42,\n          width: double.infinity,\n          child: TabBar(\n            controller: _homeController.tabController,\n            tabs: _homeController.tabs.map((e) => Tab(text: e.label)).toList(),\n            isScrollable: true,\n            dividerColor: Colors.transparent,\n            dividerHeight: 0,\n            splashBorderRadius: StyleString.mdRadius,\n            tabAlignment: TabAlignment.center,\n            onTap: (_) {\n              feedBack();\n              if (!_homeController.tabController.indexIsChanging) {\n                _homeController.animateToTop();\n              }\n            },\n          ),\n        ),\n      );\n      if (_homeController.hideTopBar &&\n          _mainController.barHideType == .instant) {\n        tabBar = Material(\n          color: theme.colorScheme.surface,\n          child: tabBar,\n        );\n      }\n    } else {\n      tabBar = const SizedBox(height: 6);\n    }\n    return Column(\n      children: [\n        if (!_mainController.useSideBar &&\n            MediaQuery.sizeOf(context).isPortrait)\n          customAppBar(theme),\n        tabBar,\n        Expanded(\n          child: onBuild(\n            tabBarView(\n              controller: _homeController.tabController,\n              children: _homeController.tabs.map((e) => e.page).toList(),\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n\n  Widget customAppBar(ThemeData theme) {\n    const padding = EdgeInsets.fromLTRB(14, 6, 14, 0);\n    final child = Row(\n      children: [\n        searchBar(theme),\n        const SizedBox(width: 4),\n        msgBadge(_mainController),\n        const SizedBox(width: 8),\n        userAvatar(theme: theme, mainController: _mainController),\n      ],\n    );\n    if (_homeController.hideTopBar) {\n      if (_mainController.barOffset case final barOffset?) {\n        return Obx(\n          () {\n            final offset = barOffset.value;\n            return CustomHeightWidget(\n              offset: Offset(0, -offset),\n              height: StyleString.topBarHeight - offset,\n              child: Padding(\n                padding: padding,\n                child: child,\n              ),\n            );\n          },\n        );\n      }\n      if (_homeController.showTopBar case final showTopBar?) {\n        return Obx(() {\n          final showSearchBar = showTopBar.value;\n          return AnimatedOpacity(\n            opacity: showSearchBar ? 1 : 0,\n            duration: const Duration(milliseconds: 300),\n            child: AnimatedContainer(\n              curve: Curves.easeInOutCubicEmphasized,\n              duration: const Duration(milliseconds: 500),\n              height: showSearchBar ? StyleString.topBarHeight : 0,\n              padding: padding,\n              child: child,\n            ),\n          );\n        });\n      }\n    }\n    return Container(\n      height: StyleString.topBarHeight,\n      padding: padding,\n      child: child,\n    );\n  }\n\n  Widget searchBar(ThemeData theme) {\n    const borderRadius = BorderRadius.all(Radius.circular(25));\n    return Expanded(\n      child: SizedBox(\n        height: 44,\n        child: Material(\n          borderRadius: borderRadius,\n          color: theme.colorScheme.onSecondaryContainer.withValues(alpha: 0.05),\n          child: InkWell(\n            borderRadius: borderRadius,\n            splashColor: theme.colorScheme.primaryContainer.withValues(\n              alpha: 0.3,\n            ),\n            onTap: () => Get.toNamed(\n              '/search',\n              parameters: _homeController.enableSearchWord\n                  ? {'hintText': _homeController.defaultSearch.value}\n                  : null,\n            ),\n            child: Row(\n              children: [\n                const SizedBox(width: 14),\n                Icon(\n                  Icons.search_outlined,\n                  color: theme.colorScheme.onSecondaryContainer,\n                  semanticLabel: '搜索',\n                ),\n                const SizedBox(width: 10),\n                Expanded(\n                  child: Obx(\n                    () => Text(\n                      _homeController.defaultSearch.value,\n                      maxLines: 1,\n                      overflow: TextOverflow.ellipsis,\n                      style: TextStyle(color: theme.colorScheme.outline),\n                    ),\n                  ),\n                ),\n                const SizedBox(width: 5),\n              ],\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n\nWidget userAvatar({\n  required ThemeData theme,\n  required MainController mainController,\n}) {\n  return Semantics(\n    label: \"我的\",\n    child: Obx(\n      () {\n        if (mainController.accountService.isLogin.value) {\n          return Stack(\n            clipBehavior: .none,\n            children: [\n              NetworkImgLayer(\n                type: .avatar,\n                width: 34,\n                height: 34,\n                src: mainController.accountService.face.value,\n              ),\n              Positioned.fill(\n                child: Material(\n                  type: .transparency,\n                  child: InkWell(\n                    onTap: mainController.toMinePage,\n                    splashColor: theme.colorScheme.primaryContainer.withValues(\n                      alpha: 0.3,\n                    ),\n                    customBorder: const CircleBorder(),\n                  ),\n                ),\n              ),\n              Positioned(\n                right: -4,\n                bottom: -4,\n                child: Obx(\n                  () => MineController.anonymity.value\n                      ? IgnorePointer(\n                          child: Container(\n                            padding: const .all(2),\n                            decoration: BoxDecoration(\n                              shape: .circle,\n                              color: theme.colorScheme.secondaryContainer,\n                            ),\n                            child: Icon(\n                              size: 14,\n                              MdiIcons.incognito,\n                              color: theme.colorScheme.onSecondaryContainer,\n                            ),\n                          ),\n                        )\n                      : const SizedBox.shrink(),\n                ),\n              ),\n            ],\n          );\n        }\n        return SizedBox(\n          width: 38,\n          height: 38,\n          child: IconButton(\n            tooltip: '点击登录',\n            style: IconButton.styleFrom(\n              padding: .zero,\n              backgroundColor: theme.colorScheme.onInverseSurface,\n            ),\n            onPressed: mainController.toMinePage,\n            icon: Icon(\n              Icons.person_rounded,\n              size: 22,\n              color: theme.colorScheme.primary,\n            ),\n          ),\n        );\n      },\n    ),\n  );\n}\n\nWidget msgBadge(MainController mainController) {\n  return Obx(\n    () {\n      if (mainController.accountService.isLogin.value) {\n        final count = mainController.msgUnReadCount.value;\n        final isNumBadge = mainController.msgBadgeMode == .number;\n        return IconButton(\n          tooltip: '消息',\n          onPressed: () {\n            mainController\n              ..msgUnReadCount.value = ''\n              ..lastCheckUnreadAt = DateTime.now().millisecondsSinceEpoch;\n            Get.toNamed('/whisper');\n          },\n          icon: Badge(\n            isLabelVisible:\n                mainController.msgBadgeMode != .hidden && count.isNotEmpty,\n            alignment: isNumBadge\n                ? const Alignment(0.0, -0.85)\n                : const Alignment(1.0, -0.85),\n            label: isNumBadge && count.isNotEmpty ? Text(count) : null,\n            child: const Icon(Icons.notifications_none),\n          ),\n        );\n      }\n      return const SizedBox.shrink();\n    },\n  );\n}\n"
  },
  {
    "path": "lib/pages/hot/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/video.dart';\nimport 'package:PiliPlus/models/model_hot_video_item.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\n\nclass HotController\n    extends CommonListController<List<HotVideoItemModel>, HotVideoItemModel> {\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  Future<LoadingState<List<HotVideoItemModel>>> customGetData() =>\n      VideoHttp.hotVideoList(\n        pn: page,\n        ps: 20,\n      );\n}\n"
  },
  {
    "path": "lib/pages/hot/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/video_card/video_card_h.dart';\nimport 'package:PiliPlus/common/widgets/view_safe_area.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/home_tab_type.dart';\nimport 'package:PiliPlus/models/model_hot_video_item.dart';\nimport 'package:PiliPlus/pages/home/controller.dart';\nimport 'package:PiliPlus/pages/hot/controller.dart';\nimport 'package:PiliPlus/pages/rank/view.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass HotPage extends StatefulWidget {\n  const HotPage({super.key});\n\n  @override\n  State<HotPage> createState() => _HotPageState();\n}\n\nclass _HotPageState extends State<HotPage>\n    with AutomaticKeepAliveClientMixin, GridMixin {\n  final HotController controller = Get.put(HotController());\n\n  @override\n  bool get wantKeepAlive => true;\n\n  Widget _buildEntranceItem({\n    required String iconUrl,\n    required String title,\n    required VoidCallback onTap,\n  }) {\n    return GestureDetector(\n      onTap: onTap,\n      behavior: HitTestBehavior.opaque,\n      child: Column(\n        spacing: 4,\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          NetworkImgLayer(\n            width: 35,\n            height: 35,\n            type: .emote,\n            src: iconUrl,\n          ),\n          Text(\n            title,\n            style: const TextStyle(fontSize: 12),\n          ),\n        ],\n      ),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    return refreshIndicator(\n      onRefresh: controller.onRefresh,\n      child: CustomScrollView(\n        physics: const AlwaysScrollableScrollPhysics(),\n        controller: controller.scrollController,\n        slivers: [\n          if (Pref.showHotRcmd)\n            SliverToBoxAdapter(\n              child: Padding(\n                padding: const .only(left: 12, top: 12, right: 12),\n                child: Row(\n                  mainAxisAlignment: .spaceEvenly,\n                  children: [\n                    _buildEntranceItem(\n                      iconUrl:\n                          'https://i0.hdslb.com/bfs/archive/a3f11218aaf4521b4967db2ae164ecd3052586b9.png',\n                      title: '排行榜',\n                      onTap: () {\n                        try {\n                          final homeController = Get.find<HomeController>();\n                          final index = homeController.tabs.indexOf(\n                            HomeTabType.rank,\n                          );\n                          if (index != -1) {\n                            homeController.tabController.animateTo(index);\n                          } else {\n                            Get.to(\n                              Scaffold(\n                                resizeToAvoidBottomInset: false,\n                                appBar: AppBar(title: const Text('排行榜')),\n                                body: const ViewSafeArea(child: RankPage()),\n                              ),\n                            );\n                          }\n                        } catch (_) {}\n                      },\n                    ),\n                    _buildEntranceItem(\n                      iconUrl:\n                          'https://i0.hdslb.com/bfs/archive/552ebe8c4794aeef30ebd1568b59ad35f15e21ad.png',\n                      title: '每周必看',\n                      onTap: () => Get.toNamed('/popularSeries'),\n                    ),\n                    _buildEntranceItem(\n                      iconUrl:\n                          'https://i0.hdslb.com/bfs/archive/3693ec9335b78ca57353ac0734f36a46f3d179a9.png',\n                      title: '入站必刷',\n                      onTap: () => Get.toNamed('/popularPrecious'),\n                    ),\n                  ],\n                ),\n              ),\n            ),\n          SliverPadding(\n            padding: const EdgeInsets.only(top: 7, bottom: 100),\n            sliver: Obx(\n              () => _buildBody(controller.loadingState.value),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget _buildBody(LoadingState<List<HotVideoItemModel>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => gridSkeleton,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverGrid.builder(\n                gridDelegate: gridDelegate,\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    controller.onLoadMore();\n                  }\n                  return VideoCardH(\n                    videoItem: response[index],\n                    onRemove: () => controller.loadingState\n                      ..value.data!.removeAt(index)\n                      ..refresh(),\n                  );\n                },\n                itemCount: response.length,\n              )\n            : HttpError(onReload: controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: controller.onReload,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/later/base_controller.dart",
    "content": "import 'package:PiliPlus/models/common/later_view_type.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:get/get.dart';\n\nclass LaterBaseController extends GetxController {\n  RxBool enableMultiSelect = false.obs;\n  RxInt checkedCount = 0.obs;\n\n  RxList<int> counts = List.filled(LaterViewType.values.length, -1).obs;\n\n  late double dx = 0;\n  late final RxBool isPlayAll = Pref.enablePlayAll.obs;\n\n  void setIsPlayAll(bool isPlayAll) {\n    if (this.isPlayAll.value == isPlayAll) return;\n    this.isPlayAll.value = isPlayAll;\n    GStorage.setting.put(SettingBoxKey.enablePlayAll, isPlayAll);\n  }\n}\n"
  },
  {
    "path": "lib/pages/later/child_view.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/later_view_type.dart';\nimport 'package:PiliPlus/models/common/video/source_type.dart';\nimport 'package:PiliPlus/models_new/later/list.dart';\nimport 'package:PiliPlus/pages/later/base_controller.dart';\nimport 'package:PiliPlus/pages/later/controller.dart';\nimport 'package:PiliPlus/pages/later/widgets/video_card_h_later.dart';\nimport 'package:PiliPlus/utils/extension/get_ext.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass LaterViewChildPage extends StatefulWidget {\n  const LaterViewChildPage({\n    super.key,\n    required this.laterViewType,\n  });\n\n  final LaterViewType laterViewType;\n\n  @override\n  State<LaterViewChildPage> createState() => _LaterViewChildPageState();\n}\n\nclass _LaterViewChildPageState extends State<LaterViewChildPage>\n    with AutomaticKeepAliveClientMixin, GridMixin {\n  late final LaterController _laterController;\n  late final _baseCtr = Get.putOrFind(LaterBaseController.new);\n\n  @override\n  void initState() {\n    super.initState();\n    _laterController = Get.put(\n      LaterController(widget.laterViewType),\n      tag: widget.laterViewType.type.toString(),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    return refreshIndicator(\n      onRefresh: _laterController.onRefresh,\n      child: CustomScrollView(\n        physics: const AlwaysScrollableScrollPhysics(),\n        controller: _laterController.scrollController,\n        slivers: [\n          SliverPadding(\n            padding: EdgeInsets.only(\n              top: 7,\n              bottom: MediaQuery.viewPaddingOf(context).bottom + 85,\n            ),\n            sliver: Obx(\n              () => _buildBody(_laterController.loadingState.value),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget _buildBody(LoadingState<List<LaterItemModel>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => gridSkeleton,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverGrid.builder(\n                gridDelegate: gridDelegate,\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    _laterController.onLoadMore();\n                  }\n                  final videoItem = response[index];\n                  return VideoCardHLater(\n                    index: index,\n                    videoItem: videoItem,\n                    ctr: _laterController,\n                    onViewLater: (cid) {\n                      PageUtils.toVideoPage(\n                        bvid: videoItem.bvid,\n                        cid: cid,\n                        cover: videoItem.pic,\n                        title: videoItem.title,\n                        extraArguments: _baseCtr.isPlayAll.value\n                            ? {\n                                'oid': videoItem.aid,\n                                'sourceType': SourceType.watchLater,\n                                'count': _laterController\n                                    .baseCtr\n                                    .counts[LaterViewType.all.index],\n                                'favTitle': '稍后再看',\n                                'mediaId': _laterController.mid,\n                                'desc': _laterController.asc.value,\n                                'isContinuePlaying': index != 0,\n                              }\n                            : null,\n                      );\n                    },\n                  );\n                },\n                itemCount: response.length,\n              )\n            : HttpError(onReload: _laterController.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _laterController.onReload,\n      ),\n    };\n  }\n\n  @override\n  bool get wantKeepAlive => true;\n}\n"
  },
  {
    "path": "lib/pages/later/controller.dart",
    "content": "import 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/user.dart';\nimport 'package:PiliPlus/models/common/later_view_type.dart';\nimport 'package:PiliPlus/models/common/video/source_type.dart';\nimport 'package:PiliPlus/models_new/later/data.dart';\nimport 'package:PiliPlus/models_new/later/list.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart'\n    show CommonListController;\nimport 'package:PiliPlus/pages/common/multi_select/base.dart';\nimport 'package:PiliPlus/pages/common/multi_select/multi_select_controller.dart';\nimport 'package:PiliPlus/pages/later/base_controller.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nmixin BaseLaterController\n    on\n        CommonListController<LaterData, LaterItemModel>,\n        CommonMultiSelectMixin<LaterItemModel>,\n        DeleteItemMixin<LaterData, LaterItemModel> {\n  ValueChanged<int>? updateCount;\n\n  @override\n  void onRemove() {\n    showConfirmDialog(\n      context: Get.context!,\n      content: '确认删除所选稍后再看吗？',\n      title: '提示',\n      onConfirm: () async {\n        final removeList = allChecked.toSet();\n        SmartDialog.showLoading(msg: '请求中');\n        final res = await UserHttp.toViewDel(\n          aids: removeList.map((item) => item.aid).join(','),\n        );\n        if (res.isSuccess) {\n          updateCount?.call(removeList.length);\n          afterDelete(removeList);\n        }\n        SmartDialog.dismiss();\n      },\n    );\n  }\n\n  // single\n  void toViewDel(\n    BuildContext context,\n    int index,\n    int? aid,\n  ) {\n    showDialog(\n      context: context,\n      builder: (context) => AlertDialog(\n        title: const Text('提示'),\n        content: const Text('即将移除该视频，确定是否移除'),\n        actions: [\n          TextButton(\n            onPressed: Get.back,\n            child: Text(\n              '取消',\n              style: TextStyle(color: Theme.of(context).colorScheme.outline),\n            ),\n          ),\n          TextButton(\n            onPressed: () async {\n              Get.back();\n              final res = await UserHttp.toViewDel(aids: aid.toString());\n              if (res.isSuccess) {\n                loadingState\n                  ..value.data!.removeAt(index)\n                  ..refresh();\n                updateCount?.call(1);\n              }\n            },\n            child: const Text('确认移除'),\n          ),\n        ],\n      ),\n    );\n  }\n}\n\nclass LaterController extends MultiSelectController<LaterData, LaterItemModel>\n    with BaseLaterController {\n  LaterController(this.laterViewType);\n  final LaterViewType laterViewType;\n\n  late final mid = Accounts.main.mid;\n\n  final RxBool asc = false.obs;\n\n  final LaterBaseController baseCtr = Get.put(LaterBaseController());\n\n  @override\n  RxBool get enableMultiSelect => baseCtr.enableMultiSelect;\n\n  @override\n  RxInt get rxCount => baseCtr.checkedCount;\n\n  @override\n  Future<LoadingState<LaterData>> customGetData() => UserHttp.seeYouLater(\n    page: page,\n    viewed: laterViewType.type,\n    asc: asc.value,\n  );\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  List<LaterItemModel>? getDataList(response) {\n    baseCtr.counts[laterViewType.index] = response.count ?? 0;\n    return response.list;\n  }\n\n  @override\n  void checkIsEnd(int length) {\n    if (length >= baseCtr.counts[laterViewType.index]) {\n      isEnd = true;\n    }\n  }\n\n  // 一键清空\n  void toViewClear(BuildContext context, [int? cleanType]) {\n    String content = switch (cleanType) {\n      1 => '确定清空已失效视频吗？',\n      2 => '确定清空已看完视频吗？',\n      _ => '确定清空稍后再看列表吗？',\n    };\n    showConfirmDialog(\n      context: context,\n      title: '确认',\n      content: content,\n      onConfirm: () async {\n        final res = await UserHttp.toViewClear(cleanType);\n        if (res.isSuccess) {\n          onReload();\n          final restTypes = List<LaterViewType>.from(LaterViewType.values)\n            ..remove(laterViewType);\n          for (final item in restTypes) {\n            try {\n              Get.find<LaterController>(tag: item.type.toString()).onReload();\n            } catch (_) {}\n          }\n          SmartDialog.showToast('操作成功');\n        } else {\n          res.toast();\n        }\n      },\n    );\n  }\n\n  // 稍后再看播放全部\n  void toViewPlayAll() {\n    if (loadingState.value case Success(:final response)) {\n      if (response == null || response.isEmpty) return;\n\n      for (LaterItemModel item in response) {\n        if (item.cid == null || item.pgcLabel?.isNotEmpty == true) {\n          continue;\n        } else {\n          PageUtils.toVideoPage(\n            bvid: item.bvid,\n            cid: item.cid!,\n            cover: item.pic,\n            title: item.title,\n            extraArguments: {\n              'sourceType': SourceType.watchLater,\n              'count': baseCtr.counts[LaterViewType.all.index],\n              'favTitle': '稍后再看',\n              'mediaId': mid,\n              'desc': asc.value,\n            },\n          );\n          break;\n        }\n      }\n    }\n  }\n\n  @override\n  ValueChanged<int>? get updateCount =>\n      (count) => baseCtr.counts[laterViewType.index] -= count;\n\n  @override\n  Future<void> onReload() {\n    scrollController.jumpToTop();\n    return super.onReload();\n  }\n}\n"
  },
  {
    "path": "lib/pages/later/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/appbar/appbar.dart';\nimport 'package:PiliPlus/common/widgets/flutter/page/tabs.dart';\nimport 'package:PiliPlus/common/widgets/flutter/pop_scope.dart';\nimport 'package:PiliPlus/common/widgets/gesture/horizontal_drag_gesture_recognizer.dart';\nimport 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/common/widgets/view_safe_area.dart';\nimport 'package:PiliPlus/models/common/later_view_type.dart';\nimport 'package:PiliPlus/models_new/later/list.dart';\nimport 'package:PiliPlus/pages/common/fab_mixin.dart'\n    show NoRightMarginFabLocation;\nimport 'package:PiliPlus/pages/later/base_controller.dart';\nimport 'package:PiliPlus/pages/later/controller.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/extension/get_ext.dart';\nimport 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';\nimport 'package:PiliPlus/utils/request_utils.dart';\nimport 'package:flutter/material.dart' hide TabBarView;\nimport 'package:get/get.dart';\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\n\nclass LaterPage extends StatefulWidget {\n  const LaterPage({super.key});\n\n  @override\n  State<LaterPage> createState() => _LaterPageState();\n}\n\nclass _LaterPageState extends State<LaterPage>\n    with SingleTickerProviderStateMixin {\n  final LaterBaseController _baseCtr = Get.put(LaterBaseController());\n  late final TabController _tabController;\n\n  LaterController currCtr([int? index]) {\n    final type = LaterViewType.values[index ?? _tabController.index];\n    return Get.putOrFind(\n      () => LaterController(type),\n      tag: type.type.toString(),\n    );\n  }\n\n  final _sortKey = GlobalKey();\n  void listener() {\n    (_sortKey.currentContext as Element?)?.markNeedsBuild();\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    _tabController = TabController(\n      length: LaterViewType.values.length,\n      vsync: this,\n    )..addListener(listener);\n  }\n\n  @override\n  void dispose() {\n    _tabController\n      ..removeListener(listener)\n      ..dispose();\n    Get.delete<LaterBaseController>();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Obx(\n      () {\n        final enableMultiSelect = _baseCtr.enableMultiSelect.value;\n        return popScope(\n          canPop: !enableMultiSelect,\n          onPopInvokedWithResult: (didPop, result) {\n            if (enableMultiSelect) {\n              currCtr().handleSelect();\n            }\n          },\n          child: Scaffold(\n            resizeToAvoidBottomInset: false,\n            appBar: _buildAppbar(enableMultiSelect),\n            floatingActionButtonLocation: const NoRightMarginFabLocation(),\n            floatingActionButton: Padding(\n              padding: const .only(right: kFloatingActionButtonMargin),\n              child: Obx(\n                () => currCtr().loadingState.value.isSuccess\n                    ? AnimatedSlide(\n                        offset: _baseCtr.isPlayAll.value\n                            ? Offset.zero\n                            : const Offset(0.75, 0),\n                        duration: const Duration(milliseconds: 120),\n                        child: GestureDetector(\n                          onHorizontalDragDown: (details) =>\n                              _baseCtr.dx = details.localPosition.dx,\n                          onHorizontalDragStart: (details) =>\n                              _baseCtr.setIsPlayAll(\n                                details.localPosition.dx < _baseCtr.dx,\n                              ),\n                          child: FloatingActionButton.extended(\n                            onPressed: () {\n                              if (_baseCtr.isPlayAll.value) {\n                                currCtr().toViewPlayAll();\n                              } else {\n                                _baseCtr.setIsPlayAll(true);\n                              }\n                            },\n                            label: const Text('播放全部'),\n                            icon: const Icon(Icons.playlist_play),\n                          ),\n                        ),\n                      )\n                    : const SizedBox.shrink(),\n              ),\n            ),\n            body: ViewSafeArea(\n              child: Column(\n                children: [\n                  TabBar(\n                    // isScrollable: true,\n                    // tabAlignment: TabAlignment.start,\n                    controller: _tabController,\n                    tabs: LaterViewType.values.map((item) {\n                      final count = _baseCtr.counts[item.index];\n                      return Tab(\n                        text: '${item.title}${count != -1 ? '($count)' : ''}',\n                      );\n                    }).toList(),\n                    onTap: (_) {\n                      if (!_tabController.indexIsChanging) {\n                        currCtr().scrollController.animToTop();\n                      } else if (enableMultiSelect) {\n                        currCtr(_tabController.previousIndex).handleSelect();\n                      }\n                    },\n                  ),\n                  Expanded(\n                    child: TabBarView<CustomHorizontalDragGestureRecognizer>(\n                      physics: enableMultiSelect\n                          ? const NeverScrollableScrollPhysics()\n                          : clampingScrollPhysics,\n                      controller: _tabController,\n                      horizontalDragGestureRecognizer:\n                          CustomHorizontalDragGestureRecognizer.new,\n                      children: LaterViewType.values\n                          .map((item) => item.page)\n                          .toList(),\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          ),\n        );\n      },\n    );\n  }\n\n  PreferredSizeWidget _buildAppbar(bool enableMultiSelect) {\n    final theme = Theme.of(context);\n    Color color = theme.colorScheme.secondary;\n    final btnStyle = TextButton.styleFrom(visualDensity: .compact);\n    final textStyle = TextStyle(color: theme.colorScheme.onSurfaceVariant);\n    return MultiSelectAppBarWidget(\n      visible: enableMultiSelect,\n      ctr: currCtr(),\n      actions: [\n        TextButton(\n          style: btnStyle,\n          onPressed: () {\n            final ctr = currCtr();\n            RequestUtils.onCopyOrMove<LaterItemModel>(\n              context: context,\n              isCopy: true,\n              ctr: ctr,\n              mediaId: null,\n              mid: ctr.mid,\n            );\n          },\n          child: Text('复制', style: textStyle),\n        ),\n        TextButton(\n          style: btnStyle,\n          onPressed: () {\n            final ctr = currCtr();\n            RequestUtils.onCopyOrMove<LaterItemModel>(\n              context: context,\n              isCopy: false,\n              ctr: ctr,\n              mediaId: null,\n              mid: ctr.mid,\n            );\n          },\n          child: Text('移动', style: textStyle),\n        ),\n      ],\n      child: AppBar(\n        title: const Text('稍后再看'),\n        actions: [\n          IconButton(\n            tooltip: '搜索',\n            onPressed: () {\n              final mid = Accounts.main.mid;\n              Get.toNamed(\n                '/laterSearch',\n                arguments: {\n                  'type': 0,\n                  'mediaId': mid,\n                  'mid': mid,\n                  'title': '稍后再看',\n                  'count': _baseCtr.counts[LaterViewType.all.index],\n                },\n              );\n            },\n            icon: const Icon(Icons.search),\n          ),\n          Builder(\n            key: _sortKey,\n            builder: (context) {\n              final value = currCtr().asc.value;\n              return PopupMenuButton(\n                initialValue: value,\n                tooltip: '排序',\n                onSelected: (value) => currCtr()\n                  ..asc.value = value\n                  ..onReload(),\n                borderRadius: const .all(.circular(20)),\n                child: Padding(\n                  padding: const .symmetric(horizontal: 12, vertical: 6),\n                  child: Text.rich(\n                    style: TextStyle(fontSize: 14, height: 1, color: color),\n                    strutStyle: const StrutStyle(\n                      leading: 0,\n                      height: 1,\n                      fontSize: 14,\n                    ),\n                    TextSpan(\n                      children: [\n                        TextSpan(text: value ? '最早添加' : '最近添加'),\n                        WidgetSpan(\n                          alignment: .middle,\n                          child: Icon(\n                            size: 14,\n                            MdiIcons.unfoldMoreHorizontal,\n                            color: color,\n                          ),\n                        ),\n                      ],\n                      style: TextStyle(color: color),\n                    ),\n                  ),\n                ),\n                itemBuilder: (_) => [\n                  const PopupMenuItem(\n                    value: false,\n                    child: Text('最近添加'),\n                  ),\n                  const PopupMenuItem(\n                    value: true,\n                    child: Text('最早添加'),\n                  ),\n                ],\n              );\n            },\n          ),\n          PopupMenuButton(\n            tooltip: '清空',\n            borderRadius: const .all(.circular(20)),\n            child: Padding(\n              padding: const .symmetric(horizontal: 12, vertical: 6),\n              child: Text.rich(\n                style: TextStyle(fontSize: 14, height: 1, color: color),\n                strutStyle: const StrutStyle(\n                  leading: 0,\n                  height: 1,\n                  fontSize: 14,\n                ),\n                TextSpan(\n                  children: [\n                    const TextSpan(text: '清空'),\n                    WidgetSpan(\n                      alignment: .middle,\n                      child: Icon(\n                        size: 14,\n                        MdiIcons.unfoldMoreHorizontal,\n                        color: color,\n                      ),\n                    ),\n                  ],\n                  style: TextStyle(color: color),\n                ),\n              ),\n            ),\n            itemBuilder: (_) => [\n              PopupMenuItem(\n                onTap: () => currCtr().toViewClear(context, 1),\n                child: const Text('清空失效'),\n              ),\n              PopupMenuItem(\n                onTap: () => currCtr().toViewClear(context, 2),\n                child: const Text('清空看完'),\n              ),\n              PopupMenuItem(\n                onTap: () => currCtr().toViewClear(context),\n                child: const Text('清空全部'),\n              ),\n            ],\n          ),\n          const SizedBox(width: 8),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/later/widgets/video_card_h_later.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/progress_bar/video_progress_indicator.dart';\nimport 'package:PiliPlus/common/widgets/select_mask.dart';\nimport 'package:PiliPlus/common/widgets/stat/stat.dart';\nimport 'package:PiliPlus/http/search.dart';\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models/common/stat_type.dart';\nimport 'package:PiliPlus/models_new/later/list.dart';\nimport 'package:PiliPlus/pages/later/controller.dart';\nimport 'package:PiliPlus/utils/duration_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\n\n// 视频卡片 - 水平布局\nclass VideoCardHLater extends StatelessWidget {\n  const VideoCardHLater({\n    super.key,\n    required this.ctr,\n    required this.index,\n    required this.videoItem,\n    required this.onViewLater,\n  });\n  final int index;\n  final BaseLaterController ctr;\n  final LaterItemModel videoItem;\n  final ValueChanged<int> onViewLater;\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    final enableMultiSelect = ctr.enableMultiSelect.value;\n\n    final onLongPress = enableMultiSelect\n        ? null\n        : () => ctr\n            ..enableMultiSelect.value = true\n            ..onSelect(videoItem);\n\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        onTap: enableMultiSelect\n            ? () => ctr.onSelect(videoItem)\n            : () async {\n                if (videoItem.isPugv ?? false) {\n                  PageUtils.viewPugv(seasonId: videoItem.aid);\n                  return;\n                }\n                if (videoItem.isPgc ?? false) {\n                  if (videoItem.bangumi?.epId != null) {\n                    PageUtils.viewPgc(epId: videoItem.bangumi!.epId);\n                  } else if (videoItem.redirectUrl?.isNotEmpty == true) {\n                    PageUtils.viewPgcFromUri(videoItem.redirectUrl!);\n                  }\n                  return;\n                }\n                try {\n                  final int? cid =\n                      videoItem.cid ??\n                      await SearchHttp.ab2c(\n                        aid: videoItem.aid,\n                        bvid: videoItem.bvid,\n                      );\n                  if (cid != null) {\n                    onViewLater(cid);\n                  }\n                } catch (err) {\n                  SmartDialog.showToast(err.toString());\n                }\n              },\n        child: Padding(\n          padding: const EdgeInsets.symmetric(\n            horizontal: StyleString.safeSpace,\n            vertical: 5,\n          ),\n          child: Row(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: <Widget>[\n              AspectRatio(\n                aspectRatio: StyleString.aspectRatio,\n                child: LayoutBuilder(\n                  builder: (context, boxConstraints) {\n                    final double maxWidth = boxConstraints.maxWidth;\n                    final double maxHeight = boxConstraints.maxHeight;\n                    num? progress = videoItem.progress;\n                    return Stack(\n                      clipBehavior: Clip.none,\n                      children: [\n                        NetworkImgLayer(\n                          src: videoItem.pic,\n                          width: maxWidth,\n                          height: maxHeight,\n                          cacheWidth: videoItem.dimension?.cacheWidth,\n                        ),\n                        if (videoItem.isCharging == true)\n                          const PBadge(\n                            text: '充电专属',\n                            top: 6.0,\n                            right: 6.0,\n                            type: PBadgeType.error,\n                          )\n                        else if (videoItem.rights?.isCooperation == 1)\n                          const PBadge(\n                            text: '合作',\n                            top: 6.0,\n                            right: 6.0,\n                          )\n                        else if (videoItem.pgcLabel != null)\n                          PBadge(\n                            text: videoItem.pgcLabel,\n                            top: 6.0,\n                            right: 6.0,\n                          )\n                        else if (videoItem.isPugv ?? false)\n                          const PBadge(\n                            text: '课堂',\n                            top: 6.0,\n                            right: 6.0,\n                          ),\n                        if (progress != null && progress != 0) ...[\n                          PBadge(\n                            text: progress == -1\n                                ? '已看完'\n                                : '${DurationUtils.formatDuration(progress)}/${DurationUtils.formatDuration(videoItem.duration)}',\n                            right: 6,\n                            bottom: 8,\n                            type: PBadgeType.gray,\n                          ),\n                          Positioned(\n                            left: 0,\n                            bottom: 0,\n                            right: 0,\n                            child: VideoProgressIndicator(\n                              color: theme.colorScheme.primary,\n                              backgroundColor:\n                                  theme.colorScheme.secondaryContainer,\n                              progress: progress == -1\n                                  ? 1\n                                  : progress / videoItem.duration!,\n                            ),\n                          ),\n                        ] else if (videoItem.duration! > 0)\n                          PBadge(\n                            text: DurationUtils.formatDuration(\n                              videoItem.duration,\n                            ),\n                            right: 6.0,\n                            bottom: 6.0,\n                            type: PBadgeType.gray,\n                          ),\n                        Positioned.fill(\n                          child: selectMask(\n                            theme,\n                            videoItem.checked,\n                          ),\n                        ),\n                      ],\n                    );\n                  },\n                ),\n              ),\n              const SizedBox(width: 10),\n              content(context, theme),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget content(BuildContext context, ThemeData theme) {\n    final isPgc = videoItem.isPgc == true && videoItem.bangumi != null;\n    Widget stat = StatWidget(\n      type: StatType.play,\n      value: videoItem.stat?.view,\n    );\n    return Expanded(\n      child: Stack(\n        clipBehavior: Clip.none,\n        children: [\n          Column(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: isPgc\n                ? [\n                    Text(\n                      videoItem.bangumi!.season!.title!,\n                      style: TextStyle(\n                        fontSize: theme.textTheme.bodyMedium!.fontSize,\n                        height: 1.42,\n                        letterSpacing: 0.3,\n                      ),\n                      maxLines: 2,\n                      overflow: TextOverflow.ellipsis,\n                    ),\n                    const SizedBox(height: 3),\n                    Text(\n                      videoItem.subtitle!,\n                      textAlign: TextAlign.start,\n                      style: TextStyle(\n                        fontSize: 13,\n                        color: theme.colorScheme.outline,\n                      ),\n                      maxLines: 2,\n                      overflow: TextOverflow.ellipsis,\n                    ),\n                    const Spacer(),\n                    stat,\n                  ]\n                : [\n                    Expanded(\n                      child: Text(\n                        videoItem.title!,\n                        style: TextStyle(\n                          fontSize: theme.textTheme.bodyMedium!.fontSize,\n                          height: 1.42,\n                          letterSpacing: 0.3,\n                        ),\n                        maxLines: 2,\n                        overflow: TextOverflow.ellipsis,\n                      ),\n                    ),\n                    Text(\n                      videoItem.owner!.name!,\n                      maxLines: 1,\n                      style: TextStyle(\n                        fontSize: 12,\n                        height: 1,\n                        color: theme.colorScheme.outline,\n                        overflow: TextOverflow.clip,\n                      ),\n                    ),\n                    const SizedBox(height: 3),\n                    Row(\n                      spacing: 8,\n                      children: [\n                        stat,\n                        StatWidget(\n                          type: StatType.danmaku,\n                          value: videoItem.stat?.danmaku,\n                        ),\n                      ],\n                    ),\n                  ],\n          ),\n          Positioned(\n            right: 0,\n            bottom: -8,\n            child: iconButton(\n              tooltip: '移除',\n              onPressed: () => ctr.toViewDel(context, index, videoItem.aid),\n              icon: const Icon(Icons.clear),\n              iconColor: theme.colorScheme.outline,\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/later_search/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/user.dart';\nimport 'package:PiliPlus/models_new/later/data.dart';\nimport 'package:PiliPlus/models_new/later/list.dart';\nimport 'package:PiliPlus/pages/common/multi_select/base.dart';\nimport 'package:PiliPlus/pages/common/search/common_search_controller.dart';\nimport 'package:PiliPlus/pages/later/controller.dart' show BaseLaterController;\nimport 'package:get/get.dart';\n\nclass LaterSearchController\n    extends CommonSearchController<LaterData, LaterItemModel>\n    with\n        CommonMultiSelectMixin<LaterItemModel>,\n        DeleteItemMixin,\n        BaseLaterController {\n  dynamic mid = Get.arguments['mid'];\n  dynamic count = Get.arguments['count'];\n\n  @override\n  Future<LoadingState<LaterData>> customGetData() => UserHttp.seeYouLater(\n    page: page,\n    keyword: editController.value.text,\n  );\n\n  @override\n  List<LaterItemModel>? getDataList(LaterData response) {\n    return response.list;\n  }\n}\n"
  },
  {
    "path": "lib/pages/later_search/view.dart",
    "content": "import 'package:PiliPlus/models/common/video/source_type.dart';\nimport 'package:PiliPlus/models_new/later/data.dart';\nimport 'package:PiliPlus/models_new/later/list.dart';\nimport 'package:PiliPlus/pages/common/search/common_search_page.dart';\nimport 'package:PiliPlus/pages/later/widgets/video_card_h_later.dart';\nimport 'package:PiliPlus/pages/later_search/controller.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/request_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass LaterSearchPage extends StatefulWidget {\n  const LaterSearchPage({super.key});\n\n  @override\n  State<LaterSearchPage> createState() => _LaterSearchPageState();\n}\n\nclass _LaterSearchPageState\n    extends CommonSearchPageState<LaterSearchPage, LaterData, LaterItemModel> {\n  @override\n  final LaterSearchController controller = Get.put(\n    LaterSearchController(),\n    tag: Utils.generateRandomString(8),\n  );\n\n  @override\n  List<Widget>? get multiSelectActions {\n    final btnStyle = TextButton.styleFrom(visualDensity: .compact);\n    final textStyle = TextStyle(\n      color: ColorScheme.of(context).onSurfaceVariant,\n    );\n    return [\n      TextButton(\n        style: btnStyle,\n        onPressed: () => RequestUtils.onCopyOrMove<LaterItemModel>(\n          context: context,\n          isCopy: true,\n          ctr: controller,\n          mediaId: null,\n          mid: controller.mid,\n        ),\n        child: Text('复制', style: textStyle),\n      ),\n      TextButton(\n        style: btnStyle,\n        onPressed: () => RequestUtils.onCopyOrMove<LaterItemModel>(\n          context: context,\n          isCopy: false,\n          ctr: controller,\n          mediaId: null,\n          mid: controller.mid,\n        ),\n        child: Text('移动', style: textStyle),\n      ),\n    ];\n  }\n\n  late final gridDelegate = Grid.videoCardHDelegate(context, minHeight: 110);\n\n  @override\n  Widget buildList(List<LaterItemModel> list) {\n    return SliverGrid.builder(\n      gridDelegate: gridDelegate,\n      itemBuilder: (context, index) {\n        if (index == list.length - 1) {\n          controller.onLoadMore();\n        }\n        final item = list[index];\n        return VideoCardHLater(\n          index: index,\n          videoItem: item,\n          ctr: controller,\n          onViewLater: (cid) {\n            PageUtils.toVideoPage(\n              bvid: item.bvid,\n              cid: cid,\n              cover: item.pic,\n              title: item.title,\n              extraArguments: {\n                'oid': item.aid,\n                'sourceType': SourceType.watchLater,\n                'count': controller.count,\n                'favTitle': '稍后再看',\n                'mediaId': controller.mid,\n                'desc': false,\n                'isContinuePlaying': index != 0,\n              },\n            );\n          },\n        );\n      },\n      itemCount: list.length,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/live/controller.dart",
    "content": "import 'package:PiliPlus/common/widgets/pair.dart';\nimport 'package:PiliPlus/http/live.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/live/live_feed_index/card_data_list_item.dart';\nimport 'package:PiliPlus/models_new/live/live_feed_index/card_list.dart';\nimport 'package:PiliPlus/models_new/live/live_feed_index/data.dart';\nimport 'package:PiliPlus/models_new/live/live_second_list/data.dart';\nimport 'package:PiliPlus/models_new/live/live_second_list/tag.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:PiliPlus/services/account_service.dart';\nimport 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';\nimport 'package:flutter/widgets.dart' show ScrollController;\nimport 'package:get/get.dart';\n\nclass LiveController extends CommonListController with AccountMixin {\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  int? count;\n\n  // area\n  int? areaId;\n  String? sortType;\n  int? parentAreaId;\n  final RxInt areaIndex = 0.obs;\n\n  // tag\n  final RxInt tagIndex = 0.obs;\n  List<LiveSecondTag>? newTags;\n\n  final Rx<Pair<LiveCardList?, LiveCardList?>> topState =\n      Pair<LiveCardList?, LiveCardList?>(first: null, second: null).obs;\n\n  final followController = ScrollController();\n\n  bool showFirstFrame = false;\n\n  @override\n  void checkIsEnd(int length) {\n    if (count != null && length >= count!) {\n      isEnd = true;\n    }\n  }\n\n  @override\n  List? getDataList(response) {\n    return response.cardList;\n  }\n\n  @override\n  bool customHandleResponse(bool isRefresh, Success response) {\n    if (isRefresh) {\n      final res = response.response;\n      if (res is LiveIndexData) {\n        if (res.hasMore == 0) {\n          isEnd = true;\n        }\n        topState.value = Pair(\n          first: res.followItem,\n          second: res.areaItem,\n        );\n      } else if (res is LiveSecondData) {\n        count = res.count;\n        newTags = res.newTags;\n        if (sortType != null) {\n          tagIndex.value =\n              newTags?.indexWhere((e) => e.sortType == sortType) ?? -1;\n        }\n      }\n    }\n    return false;\n  }\n\n  @override\n  Future<LoadingState> customGetData() {\n    if (areaIndex.value != 0) {\n      return LiveHttp.liveSecondList(\n        pn: page,\n        areaId: areaId,\n        parentAreaId: parentAreaId,\n        sortType: sortType,\n      );\n    }\n    return LiveHttp.liveFeedIndex(pn: page);\n  }\n\n  @override\n  Future<void> onRefresh() {\n    count = null;\n    page = 1;\n    isEnd = false;\n    if (areaIndex.value != 0) {\n      queryTop().whenComplete(followController.jumpToTop);\n      return queryData();\n    }\n    return queryData().whenComplete(followController.jumpToTop);\n  }\n\n  Future<void> queryTop() async {\n    final res = await LiveHttp.liveFeedIndex(pn: page, moduleSelect: true);\n    if (res case Success(:final response)) {\n      topState.value = Pair(\n        first: response.followItem,\n        second: response.areaItem,\n      );\n      areaIndex.value =\n          (response.areaItem?.cardData?.areaEntranceV3?.list?.indexWhere(\n                (e) => e.areaV2Id == areaId && e.areaV2ParentId == parentAreaId,\n              ) ??\n              -2) +\n          1;\n    }\n  }\n\n  void onSelectArea(int index, CardLiveItem? cardLiveItem) {\n    if (isLoading) {\n      return; // areaIndex conflict\n    }\n    if (index == areaIndex.value) {\n      return;\n    }\n    tagIndex.value = 0;\n    newTags = null;\n    sortType = null;\n    areaIndex.value = index;\n    areaId = cardLiveItem?.areaV2Id;\n    parentAreaId = cardLiveItem?.areaV2ParentId;\n\n    count = null;\n    page = 1;\n    isEnd = false;\n    queryData();\n  }\n\n  void onSelectTag(int index, String? sortType) {\n    if (isLoading) {\n      return;\n    }\n    tagIndex.value = index;\n    this.sortType = sortType;\n\n    count = null;\n    page = 1;\n    isEnd = false;\n    queryData();\n  }\n\n  @override\n  void onChangeAccount(bool isLogin) => onReload();\n\n  @override\n  void onClose() {\n    followController.dispose();\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "lib/pages/live/view.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/skeleton/video_card_v.dart';\nimport 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/button/more_btn.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/pair.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/live/live_feed_index/card_data_list_item.dart';\nimport 'package:PiliPlus/models_new/live/live_feed_index/card_list.dart';\nimport 'package:PiliPlus/pages/live/controller.dart';\nimport 'package:PiliPlus/pages/live/widgets/live_item_app.dart';\nimport 'package:PiliPlus/pages/live_area/view.dart';\nimport 'package:PiliPlus/pages/live_follow/view.dart';\nimport 'package:PiliPlus/pages/search/widgets/search_text.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\n\nclass LivePage extends StatefulWidget {\n  const LivePage({super.key});\n\n  @override\n  State<LivePage> createState() => _LivePageState();\n}\n\nclass _LivePageState extends State<LivePage>\n    with AutomaticKeepAliveClientMixin {\n  final LiveController controller = Get.put(LiveController());\n\n  @override\n  bool get wantKeepAlive => true;\n\n  late TextScaler textScaler;\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    textScaler = MediaQuery.textScalerOf(context);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final ThemeData theme = Theme.of(context);\n    return Container(\n      clipBehavior: Clip.hardEdge,\n      margin: const EdgeInsets.symmetric(horizontal: StyleString.safeSpace),\n      decoration: const BoxDecoration(borderRadius: StyleString.mdRadius),\n      child: refreshIndicator(\n        onRefresh: controller.onRefresh,\n        child: CustomScrollView(\n          controller: controller.scrollController,\n          physics: const AlwaysScrollableScrollPhysics(),\n          slivers: [\n            SliverPadding(\n              padding: const EdgeInsets.only(\n                top: StyleString.cardSpace,\n                bottom: 100,\n              ),\n              sliver: SliverMainAxisGroup(\n                slivers: [\n                  Obx(() => _buildTop(theme, controller.topState.value)),\n                  Obx(() => _buildBody(theme, controller.loadingState.value)),\n                ],\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget _buildTop(ThemeData theme, Pair<LiveCardList?, LiveCardList?> data) {\n    return SliverMainAxisGroup(\n      slivers: [\n        if (data.first != null) ..._buildFollowList(theme, data.first!),\n        if (data.second?.cardData?.areaEntranceV3?.list case final list?)\n          if (list.isNotEmpty)\n            SliverToBoxAdapter(\n              child: Padding(\n                padding: const .only(bottom: 8.0),\n                child: Row(\n                  children: [\n                    Expanded(\n                      child: SizedBox(\n                        // 10+14*textScaler\n                        height: 10.0 + textScaler.scale(14),\n                        child: Obx(() {\n                          final areaIndex = controller.areaIndex.value;\n                          return ListView.separated(\n                            scrollDirection: .horizontal,\n                            padding: const .only(right: 8),\n                            physics: const AlwaysScrollableScrollPhysics(),\n                            separatorBuilder: (_, _) =>\n                                const SizedBox(width: 12),\n                            itemBuilder: (context, index) {\n                              final isFirst = index == 0;\n                              late final item = list[index - 1];\n                              final isCurr = index == areaIndex;\n                              return SearchText(\n                                fontSize: 14,\n                                height: 1,\n                                padding: const .symmetric(\n                                  horizontal: 8,\n                                  vertical: 5,\n                                ),\n                                text: isFirst ? '推荐' : item.title!,\n                                bgColor: isCurr\n                                    ? theme.colorScheme.secondaryContainer\n                                    : Colors.transparent,\n                                textColor: isCurr\n                                    ? theme.colorScheme.onSecondaryContainer\n                                    : null,\n                                onTap: (_) => controller.onSelectArea(\n                                  index,\n                                  isFirst ? null : item,\n                                ),\n                              );\n                            },\n                            itemCount: list.length + 1,\n                          );\n                        }),\n                      ),\n                    ),\n                    iconButton(\n                      size: 26,\n                      iconSize: 18,\n                      context: context,\n                      tooltip: '切换${controller.showFirstFrame ? '封面' : '首帧'}',\n                      icon: controller.showFirstFrame\n                          ? const Icon(MdiIcons.alphaFBox)\n                          : const Icon(MdiIcons.image),\n                      onPressed: () {\n                        controller.showFirstFrame = !controller.showFirstFrame;\n                        setState(() {});\n                      },\n                    ),\n                    const SizedBox(width: 8),\n                    iconButton(\n                      size: 26,\n                      iconSize: 16,\n                      context: context,\n                      tooltip: '游戏赛事',\n                      icon: const Icon(Icons.gamepad),\n                      onPressed: () => Get.toNamed(\n                        '/webview',\n                        parameters: {\n                          'uaType': 'mob',\n                          'url':\n                              'https://www.bilibili.com/h5/match/data/home?navhide=1&${Utils.themeUrl(theme.brightness.isDark)}',\n                        },\n                      ),\n                    ),\n                    const SizedBox(width: 8),\n                    iconButton(\n                      size: 26,\n                      iconSize: 16,\n                      context: context,\n                      tooltip: '全部标签',\n                      icon: const Icon(Icons.widgets),\n                      onPressed: () => Get.to(const LiveAreaPage()),\n                    ),\n                  ],\n                ),\n              ),\n            ),\n      ],\n    );\n  }\n\n  late final gridDelegate = SliverGridDelegateWithExtentAndRatio(\n    mainAxisSpacing: StyleString.cardSpace,\n    crossAxisSpacing: StyleString.cardSpace,\n    maxCrossAxisExtent: Grid.smallCardWidth,\n    childAspectRatio: StyleString.aspectRatio,\n    mainAxisExtent: textScaler.scale(90),\n  );\n\n  Widget _buildBody(ThemeData theme, LoadingState<List?> loadingState) {\n    return switch (loadingState) {\n      Loading() => SliverGrid.builder(\n        gridDelegate: gridDelegate,\n        itemBuilder: (context, index) => const VideoCardVSkeleton(),\n        itemCount: 10,\n      ),\n      Success(:final response) => SliverMainAxisGroup(\n        slivers: [\n          if (controller.newTags case final newTags?)\n            if (newTags.isNotEmpty)\n              SliverToBoxAdapter(\n                child: SizedBox(\n                  // 8+10+13*textScaler\n                  height: 18.0 + textScaler.scale(13),\n                  child: Obx(() {\n                    final tagIndex = controller.tagIndex.value;\n                    return ListView.separated(\n                      scrollDirection: .horizontal,\n                      padding: const .only(bottom: 8),\n                      separatorBuilder: (_, _) => const SizedBox(width: 12),\n                      physics: const AlwaysScrollableScrollPhysics(),\n                      itemBuilder: (context, index) {\n                        final item = newTags[index];\n                        final isCurr = index == tagIndex;\n                        return SearchText(\n                          height: 1,\n                          fontSize: 13,\n                          padding: const .symmetric(horizontal: 8, vertical: 5),\n                          text: item.name!,\n                          bgColor: isCurr\n                              ? theme.colorScheme.secondaryContainer\n                              : Colors.transparent,\n                          textColor: isCurr\n                              ? theme.colorScheme.onSecondaryContainer\n                              : null,\n                          onTap: (value) =>\n                              controller.onSelectTag(index, item.sortType),\n                        );\n                      },\n                      itemCount: newTags.length,\n                    );\n                  }),\n                ),\n              ),\n          response != null && response.isNotEmpty\n              ? SliverGrid.builder(\n                  gridDelegate: gridDelegate,\n                  itemBuilder: (context, index) {\n                    if (index == response.length - 1) {\n                      controller.onLoadMore();\n                    }\n                    final item = response[index];\n                    if (item is LiveCardList) {\n                      return LiveCardVApp(\n                        item: item.cardData!.smallCardV1!,\n                        showFirstFrame: controller.showFirstFrame,\n                      );\n                    }\n                    return LiveCardVApp(\n                      item: item,\n                      showFirstFrame: controller.showFirstFrame,\n                    );\n                  },\n                  itemCount: response.length,\n                )\n              : HttpError(onReload: controller.onReload),\n        ],\n      ),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: controller.onReload,\n      ),\n    };\n  }\n\n  List<Widget> _buildFollowList(ThemeData theme, LiveCardList item) {\n    final totalCount = item.cardData?.myIdolV1?.extraInfo?.totalCount ?? 0;\n    return [\n      SliverToBoxAdapter(\n        child: Padding(\n          padding: const .only(bottom: 8.0),\n          child: Row(\n            mainAxisAlignment: .spaceBetween,\n            children: [\n              Text.rich(\n                TextSpan(\n                  children: [\n                    const TextSpan(text: '我的关注  '),\n                    TextSpan(\n                      text: totalCount.toString(),\n                      style: TextStyle(\n                        fontSize: 13,\n                        color: theme.colorScheme.primary,\n                      ),\n                    ),\n                    TextSpan(\n                      text: '人正在直播',\n                      style: TextStyle(\n                        fontSize: 13,\n                        color: theme.colorScheme.outline,\n                      ),\n                    ),\n                  ],\n                ),\n              ),\n              moreTextButton(\n                onTap: () => Get.to(const LiveFollowPage()),\n                color: theme.colorScheme.outline,\n              ),\n            ],\n          ),\n        ),\n      ),\n      if (item.cardData?.myIdolV1?.list case final list?)\n        if (list.isNotEmpty) _buildFollowBody(theme, list, totalCount),\n    ];\n  }\n\n  Widget _buildFollowBody(\n    ThemeData theme,\n    List<CardLiveItem> followList,\n    int totalCount,\n  ) {\n    final listLength = followList.length;\n    return SliverToBoxAdapter(\n      child: SizedBox(\n        // 3+4+45+6+10+12*textScaler\n        height: 68.0 + textScaler.scale(12),\n        child: CustomScrollView(\n          scrollDirection: Axis.horizontal,\n          controller: controller.followController,\n          physics: const AlwaysScrollableScrollPhysics(),\n          slivers: [\n            SliverFixedExtentList.builder(\n              itemExtent: 70,\n              itemCount: totalCount > listLength ? listLength + 1 : listLength,\n              itemBuilder: (context, index) {\n                if (index == listLength) {\n                  return Align(\n                    alignment: const Alignment(0, -0.3),\n                    child: GestureDetector(\n                      onTap: () => Get.to(const LiveFollowPage()),\n                      child: Container(\n                        width: 40,\n                        height: 40,\n                        decoration: BoxDecoration(\n                          shape: .circle,\n                          color: theme.colorScheme.onInverseSurface,\n                        ),\n                        child: Icon(\n                          Icons.keyboard_arrow_right,\n                          color: theme.colorScheme.onSurfaceVariant,\n                        ),\n                      ),\n                    ),\n                  );\n                }\n                final item = followList[index];\n                return Padding(\n                  padding: const .only(right: 5),\n                  child: SizedBox(\n                    width: 65,\n                    child: GestureDetector(\n                      behavior: HitTestBehavior.opaque,\n                      onTap: () => PageUtils.toLiveRoom(item.roomid),\n                      onLongPress: () {\n                        Feedback.forLongPress(context);\n                        Get.toNamed('/member?mid=${item.uid}');\n                      },\n                      onSecondaryTap: PlatformUtils.isMobile\n                          ? null\n                          : () => Get.toNamed('/member?mid=${item.uid}'),\n                      child: Column(\n                        mainAxisSize: .min,\n                        children: [\n                          Container(\n                            padding: const .all(2),\n                            decoration: BoxDecoration(\n                              border: Border.all(\n                                width: 1.5,\n                                color: theme.colorScheme.primary,\n                                strokeAlign: BorderSide.strokeAlignInside,\n                              ),\n                              shape: .circle,\n                            ),\n                            child: NetworkImgLayer(\n                              type: .avatar,\n                              width: 45,\n                              height: 45,\n                              src: item.face,\n                            ),\n                          ),\n                          const SizedBox(height: 6),\n                          Text(\n                            item.uname!,\n                            maxLines: 1,\n                            overflow: TextOverflow.ellipsis,\n                            style: const TextStyle(fontSize: 12, height: 1),\n                            textAlign: TextAlign.center,\n                          ),\n                        ],\n                      ),\n                    ),\n                  ),\n                );\n              },\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/live/widgets/live_item_app.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models_new/live/live_feed_index/card_data_list_item.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\n\n// 视频卡片 - 垂直布局\nclass LiveCardVApp extends StatelessWidget {\n  final CardLiveItem item;\n  final bool showFirstFrame;\n\n  const LiveCardVApp({\n    super.key,\n    required this.item,\n    this.showFirstFrame = false,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    void onLongPress() => imageSaveDialog(\n      title: item.title,\n      cover: item.cover,\n    );\n    return Card(\n      clipBehavior: Clip.hardEdge,\n      child: InkWell(\n        onTap: () => PageUtils.toLiveRoom(item.roomid),\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        child: Column(\n          children: [\n            AspectRatio(\n              aspectRatio: StyleString.aspectRatio,\n              child: LayoutBuilder(\n                builder: (context, boxConstraints) {\n                  double maxWidth = boxConstraints.maxWidth;\n                  double maxHeight = boxConstraints.maxHeight;\n                  return Stack(\n                    clipBehavior: Clip.none,\n                    children: [\n                      NetworkImgLayer(\n                        src: showFirstFrame ? item.systemCover : item.cover,\n                        width: maxWidth,\n                        height: maxHeight,\n                        type: .emote,\n                      ),\n                      Positioned(\n                        left: 0,\n                        right: 0,\n                        bottom: 0,\n                        child: AnimatedOpacity(\n                          opacity: 1,\n                          duration: const Duration(milliseconds: 200),\n                          child: videoStat(context),\n                        ),\n                      ),\n                    ],\n                  );\n                },\n              ),\n            ),\n            liveContent(context),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget liveContent(BuildContext context) {\n    final theme = Theme.of(context);\n    return Expanded(\n      flex: 1,\n      child: Padding(\n        padding: const EdgeInsets.fromLTRB(5, 8, 5, 4),\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          mainAxisAlignment: MainAxisAlignment.spaceBetween,\n          children: [\n            Text(\n              '${item.title}',\n              textAlign: TextAlign.start,\n              style: const TextStyle(\n                letterSpacing: 0.3,\n              ),\n              maxLines: 2,\n              overflow: TextOverflow.ellipsis,\n            ),\n            Row(\n              children: [\n                Expanded(\n                  child: Text(\n                    '${item.uname}',\n                    textAlign: TextAlign.start,\n                    style: TextStyle(\n                      fontSize: theme.textTheme.labelMedium!.fontSize,\n                      color: theme.colorScheme.outline,\n                    ),\n                    maxLines: 1,\n                    overflow: TextOverflow.ellipsis,\n                  ),\n                ),\n              ],\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget videoStat(BuildContext context) {\n    return Container(\n      height: 50,\n      padding: const EdgeInsets.only(top: 26, left: 10, right: 10),\n      decoration: const BoxDecoration(\n        gradient: LinearGradient(\n          begin: Alignment.topCenter,\n          end: Alignment.bottomCenter,\n          colors: <Color>[\n            Colors.transparent,\n            Colors.black54,\n          ],\n          tileMode: TileMode.mirror,\n        ),\n      ),\n      child: Row(\n        mainAxisAlignment: MainAxisAlignment.spaceBetween,\n        children: [\n          Text(\n            '${item.areaName}',\n            style: const TextStyle(fontSize: 11, color: Colors.white),\n          ),\n          if (item.watchedShow?.textLarge case final textLarge?)\n            Text(\n              textLarge,\n              style: const TextStyle(fontSize: 11, color: Colors.white),\n            ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/live_area/controller.dart",
    "content": "import 'package:PiliPlus/http/live.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/live/live_area_list/area_item.dart';\nimport 'package:PiliPlus/models_new/live/live_area_list/area_list.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:flutter/material.dart' show TabController;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass LiveAreaController extends CommonListController<List<AreaList>?, AreaList>\n    with GetSingleTickerProviderStateMixin {\n  late final isLogin = Accounts.main.isLogin;\n\n  late final isEditing = false.obs;\n  late final favInfo = {};\n\n  TabController? tabController;\n\n  @override\n  void onInit() {\n    super.onInit();\n    if (isLogin) {\n      queryFavTags();\n    }\n    queryData();\n  }\n\n  @override\n  Future<void> onRefresh() {\n    if (isLogin) {\n      queryFavTags();\n    }\n    return super.onRefresh();\n  }\n\n  @override\n  bool customHandleResponse(bool isRefresh, Success<List<AreaList>?> response) {\n    assert(tabController == null);\n    final length = response.response?.length;\n    if (length != null && length != 0) {\n      tabController = TabController(length: length, vsync: this);\n    }\n    return super.customHandleResponse(isRefresh, response);\n  }\n\n  Rx<LoadingState<List<AreaItem>>> favState =\n      LoadingState<List<AreaItem>>.loading().obs;\n\n  @override\n  Future<LoadingState<List<AreaList>?>> customGetData() =>\n      LiveHttp.liveAreaList();\n\n  Future<void> queryFavTags() async {\n    favState.value = await LiveHttp.getLiveFavTag();\n  }\n\n  Future<void> setFavTag() async {\n    if (favState.value case Success(:final response)) {\n      final res = await LiveHttp.setLiveFavTag(\n        ids: response.map((e) => e.id).join(','),\n      );\n      if (res.isSuccess) {\n        isEditing.value = !isEditing.value;\n        SmartDialog.showToast('设置成功');\n      } else {\n        res.toast();\n      }\n    } else {\n      isEditing.value = !isEditing.value;\n    }\n  }\n\n  void onEdit() {\n    if (isEditing.value) {\n      setFavTag();\n    } else {\n      isEditing.value = !isEditing.value;\n    }\n  }\n\n  @override\n  void onClose() {\n    tabController?.dispose();\n    tabController = null;\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "lib/pages/live_area/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/keep_alive_wrapper.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models_new/live/live_area_list/area_item.dart';\nimport 'package:PiliPlus/models_new/live/live_area_list/area_list.dart';\nimport 'package:PiliPlus/pages/live_area/controller.dart';\nimport 'package:PiliPlus/pages/live_area_detail/view.dart';\nimport 'package:PiliPlus/pages/search/widgets/search_text.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_sortable_wrap/sortable_wrap.dart';\nimport 'package:get/get.dart';\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\n\nclass LiveAreaPage extends StatefulWidget {\n  const LiveAreaPage({super.key});\n\n  @override\n  State<LiveAreaPage> createState() => _LiveAreaPageState();\n}\n\nclass _LiveAreaPageState extends State<LiveAreaPage> {\n  final _controller = Get.put(LiveAreaController());\n\n  @override\n  Widget build(BuildContext context) {\n    final ThemeData theme = Theme.of(context);\n    final padding = MediaQuery.viewPaddingOf(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        title: const Text('全部标签'),\n        actions: _controller.isLogin\n            ? [\n                TextButton(\n                  onPressed: _controller.onEdit,\n                  style: TextButton.styleFrom(\n                    visualDensity: VisualDensity.compact,\n                  ),\n                  child: Obx(\n                    () => Text(_controller.isEditing.value ? '完成' : '编辑'),\n                  ),\n                ),\n                const SizedBox(width: 16),\n              ]\n            : null,\n      ),\n      body: Padding(\n        padding: EdgeInsets.only(left: padding.left, right: padding.right),\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            if (_controller.isLogin)\n              Obx(() => _buildFavWidget(theme, _controller.favState.value)),\n            Expanded(\n              child: Obx(\n                () => _buildBody(\n                  theme,\n                  padding.bottom,\n                  _controller.loadingState.value,\n                ),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget _buildBody(\n    ThemeData theme,\n    double bottom,\n    LoadingState<List<AreaList>?> loadingState,\n  ) {\n    return switch (loadingState) {\n      Loading() => const SizedBox.shrink(),\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? Column(\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  TabBar(\n                    isScrollable: true,\n                    tabAlignment: TabAlignment.start,\n                    controller: _controller.tabController,\n                    tabs: response.map((e) => Tab(text: e.name)).toList(),\n                  ),\n                  Expanded(\n                    child: tabBarView(\n                      controller: _controller.tabController,\n                      children: response\n                          .map(\n                            (e) => KeepAliveWrapper(\n                              child: e.areaList.isNullOrEmpty\n                                  ? const SizedBox.shrink()\n                                  : GridView.builder(\n                                      padding: EdgeInsets.only(\n                                        top: 12,\n                                        bottom: bottom + 100,\n                                      ),\n                                      gridDelegate:\n                                          const SliverGridDelegateWithMaxCrossAxisExtent(\n                                            maxCrossAxisExtent: 100,\n                                            mainAxisSpacing: 10,\n                                            crossAxisSpacing: 10,\n                                            mainAxisExtent: 80,\n                                          ),\n                                      itemCount: e.areaList!.length,\n                                      itemBuilder: (context, index) {\n                                        final item = e.areaList![index];\n                                        return _tagItem(\n                                          theme: theme,\n                                          item: item,\n                                          onPressed: () {\n                                            // success\n                                            bool? isFav =\n                                                _controller.favInfo[item.id];\n                                            if (isFav == true) {\n                                              _controller.favInfo[item.id] =\n                                                  false;\n                                              _controller.favState\n                                                ..value.data.remove(item)\n                                                ..refresh();\n                                              (context as Element)\n                                                  .markNeedsBuild();\n                                            } else {\n                                              // check\n                                              if (_controller\n                                                  .favState\n                                                  .value\n                                                  .isSuccess) {\n                                                _controller.favInfo[item.id] =\n                                                    true;\n                                                _controller.favState\n                                                  ..value.data.add(item)\n                                                  ..refresh();\n                                                (context as Element)\n                                                    .markNeedsBuild();\n                                              }\n                                            }\n                                          },\n                                        );\n                                      },\n                                    ),\n                            ),\n                          )\n                          .toList(),\n                    ),\n                  ),\n                ],\n              )\n            : scrollErrorWidget(onReload: _controller.onReload),\n      Error(:final errMsg) => scrollErrorWidget(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n\n  Widget _buildFavWidget(\n    ThemeData theme,\n    LoadingState<List<AreaItem>?> loadingState,\n  ) {\n    if (loadingState case Success(:final response)) {\n      return Padding(\n        padding: const EdgeInsets.symmetric(horizontal: 12),\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            Text.rich(\n              TextSpan(\n                children: [\n                  const TextSpan(text: '我的常用标签  '),\n                  TextSpan(\n                    text: '点击进入标签',\n                    style: TextStyle(\n                      fontSize: 13,\n                      color: theme.colorScheme.outline,\n                    ),\n                  ),\n                ],\n              ),\n            ),\n            const SizedBox(height: 8),\n            if (response != null && response.isNotEmpty) ...[\n              SortableWrap(\n                onSortStart: (index) => _controller.isEditing.value = true,\n                onSorted: (int oldIndex, int newIndex) {\n                  response.insert(newIndex, response.removeAt(oldIndex));\n                },\n                spacing: 12,\n                runSpacing: 8,\n                children: response\n                    .map(\n                      (item) => _favTagItem(\n                        theme: theme,\n                        item: item,\n                        onPressed: () {\n                          response.remove(item);\n                          _controller\n                            ..favInfo[item.id] = false\n                            ..favState.refresh();\n                        },\n                      ),\n                    )\n                    .toList(),\n              ),\n              const SizedBox(height: 4),\n            ],\n          ],\n        ),\n      );\n    }\n\n    return const SizedBox.shrink();\n  }\n\n  Widget _tagItem({\n    required ThemeData theme,\n    required AreaItem item,\n    required VoidCallback onPressed,\n  }) {\n    return GestureDetector(\n      behavior: HitTestBehavior.opaque,\n      onTap: () {\n        if (_controller.isEditing.value) {\n          if (item.id != 0) {\n            onPressed();\n          }\n          return;\n        }\n\n        Get.to(\n          LiveAreaDetailPage(\n            areaId: item.id,\n            parentAreaId: item.parentId,\n            parentName: item.parentName ?? '',\n          ),\n        );\n      },\n      child: Stack(\n        alignment: Alignment.center,\n        clipBehavior: Clip.none,\n        children: [\n          Column(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              NetworkImgLayer(\n                width: 45,\n                height: 45,\n                src: item.pic,\n                type: ImageType.emote,\n              ),\n              const SizedBox(height: 4),\n              Text(\n                item.name!,\n                maxLines: 1,\n                overflow: TextOverflow.ellipsis,\n                style: const TextStyle(fontSize: 12),\n              ),\n            ],\n          ),\n          if (item.id != 0)\n            Positioned(\n              top: 0,\n              right: 16,\n              child: Obx(() {\n                if (_controller.isEditing.value) {\n                  if (_controller.favState.value case Success(\n                    :final response,\n                  )) {\n                    bool? isFav = _controller.favInfo[item.id];\n                    if (isFav == null) {\n                      isFav = response.contains(item);\n                      _controller.favInfo[item.id] = isFav;\n                    }\n                    return iconButton(\n                      size: 17,\n                      iconSize: 13,\n                      icon: isFav\n                          ? const Icon(MdiIcons.check)\n                          : const Icon(MdiIcons.plus),\n                      bgColor: isFav\n                          ? theme.colorScheme.onInverseSurface\n                          : theme.colorScheme.secondaryContainer,\n                      iconColor: isFav\n                          ? theme.colorScheme.outline\n                          : theme.colorScheme.onSecondaryContainer,\n                      onPressed: onPressed,\n                    );\n                  }\n                }\n                return const SizedBox.shrink();\n              }),\n            ),\n        ],\n      ),\n    );\n  }\n\n  Widget _favTagItem({\n    required ThemeData theme,\n    required AreaItem item,\n    required VoidCallback onPressed,\n  }) {\n    return Stack(\n      clipBehavior: Clip.none,\n      children: [\n        DecoratedBox(\n          decoration: BoxDecoration(\n            border: Border.all(\n              color: theme.colorScheme.outline,\n            ),\n            color: theme.colorScheme.surface,\n            borderRadius: const BorderRadius.all(Radius.circular(4)),\n          ),\n          child: SearchText(\n            text: item.name!,\n            fontSize: 14,\n            bgColor: Colors.transparent,\n            padding: const EdgeInsets.symmetric(\n              horizontal: 12,\n              vertical: 4,\n            ),\n            onTap: (value) {\n              if (_controller.isEditing.value) {\n                onPressed();\n                return;\n              }\n\n              Get.to(\n                LiveAreaDetailPage(\n                  areaId: item.id,\n                  parentAreaId: item.parentId,\n                  parentName: item.parentName ?? '',\n                ),\n              );\n            },\n          ),\n        ),\n        Positioned(\n          right: -4,\n          top: -4,\n          child: Obx(() {\n            if (_controller.isEditing.value) {\n              final isDark = theme.brightness == Brightness.dark;\n              return iconButton(\n                size: 16,\n                iconSize: 12,\n                icon: const Icon(Icons.horizontal_rule),\n                bgColor: isDark\n                    ? theme.colorScheme.error\n                    : theme.colorScheme.errorContainer,\n                iconColor: isDark\n                    ? theme.colorScheme.onError\n                    : theme.colorScheme.onErrorContainer,\n                onPressed: onPressed,\n              );\n            }\n            return const SizedBox.shrink();\n          }),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/live_area_detail/child/controller.dart",
    "content": "import 'dart:math';\n\nimport 'package:PiliPlus/http/live.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/live/live_feed_index/card_data_list_item.dart';\nimport 'package:PiliPlus/models_new/live/live_second_list/data.dart';\nimport 'package:PiliPlus/models_new/live/live_second_list/tag.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:get/get.dart';\n\nclass LiveAreaChildController\n    extends CommonListController<LiveSecondData, CardLiveItem> {\n  LiveAreaChildController(this.areaId, this.parentAreaId);\n  final dynamic areaId;\n  final dynamic parentAreaId;\n\n  int? count;\n\n  String? sortType;\n\n  // tag\n  final RxInt tagIndex = 0.obs;\n  List<LiveSecondTag>? newTags;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  void checkIsEnd(int length) {\n    if (count != null && length >= count!) {\n      isEnd = true;\n    }\n  }\n\n  @override\n  List<CardLiveItem>? getDataList(LiveSecondData response) {\n    count = response.count;\n    newTags = response.newTags;\n    tagIndex.value = max(\n      0,\n      newTags?.indexWhere((e) => e.sortType == sortType) ?? 0,\n    );\n    return response.cardList;\n  }\n\n  @override\n  Future<LoadingState<LiveSecondData>> customGetData() =>\n      LiveHttp.liveSecondList(\n        pn: page,\n        areaId: areaId,\n        parentAreaId: parentAreaId,\n        sortType: sortType,\n      );\n\n  void onSelectTag(int index, String? sortType) {\n    if (isLoading) {\n      return;\n    }\n    tagIndex.value = index;\n    this.sortType = sortType;\n\n    onRefresh();\n  }\n}\n"
  },
  {
    "path": "lib/pages/live_area_detail/child/view.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/skeleton/video_card_v.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/self_sized_horizontal_list.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/live/live_feed_index/card_data_list_item.dart';\nimport 'package:PiliPlus/pages/live/widgets/live_item_app.dart';\nimport 'package:PiliPlus/pages/live_area_detail/child/controller.dart';\nimport 'package:PiliPlus/pages/search/widgets/search_text.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass LiveAreaChildPage extends StatefulWidget {\n  const LiveAreaChildPage({\n    super.key,\n    required this.areaId,\n    required this.parentAreaId,\n    required this.showFirstFrame,\n  });\n\n  final dynamic areaId;\n  final dynamic parentAreaId;\n  final bool showFirstFrame;\n\n  @override\n  State<LiveAreaChildPage> createState() => _LiveAreaChildPageState();\n}\n\nclass _LiveAreaChildPageState extends State<LiveAreaChildPage>\n    with AutomaticKeepAliveClientMixin {\n  late final LiveAreaChildController _controller;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = Get.put(\n      LiveAreaChildController(widget.areaId, widget.parentAreaId),\n      tag: '${widget.areaId}${widget.parentAreaId}',\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final ThemeData theme = Theme.of(context);\n    return refreshIndicator(\n      onRefresh: _controller.onRefresh,\n      child: CustomScrollView(\n        controller: _controller.scrollController,\n        physics: const AlwaysScrollableScrollPhysics(),\n        slivers: [\n          SliverPadding(\n            padding: EdgeInsets.only(\n              left: StyleString.safeSpace,\n              right: StyleString.safeSpace,\n              top: StyleString.safeSpace,\n              bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n            ),\n            sliver: Obx(\n              () => _buildBody(theme, _controller.loadingState.value),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  late final gridDelegate = SliverGridDelegateWithExtentAndRatio(\n    mainAxisSpacing: StyleString.cardSpace,\n    crossAxisSpacing: StyleString.cardSpace,\n    maxCrossAxisExtent: Grid.smallCardWidth,\n    childAspectRatio: StyleString.aspectRatio,\n    mainAxisExtent: MediaQuery.textScalerOf(context).scale(90),\n  );\n\n  Widget _buildBody(\n    ThemeData theme,\n    LoadingState<List<CardLiveItem>?> loadingState,\n  ) {\n    return switch (loadingState) {\n      Loading() => SliverGrid.builder(\n        gridDelegate: gridDelegate,\n        itemBuilder: (context, index) => const VideoCardVSkeleton(),\n        itemCount: 10,\n      ),\n      Success(:final response) => SliverMainAxisGroup(\n        slivers: [\n          if (_controller.newTags?.isNotEmpty == true)\n            SliverToBoxAdapter(\n              child: Obx(() {\n                final tagIndex = _controller.tagIndex.value;\n                return SelfSizedHorizontalList(\n                  padding: const .only(bottom: 12),\n                  separatorBuilder: (_, _) => const SizedBox(width: 12),\n                  itemBuilder: (context, index) {\n                    final item = _controller.newTags![index];\n                    final isCurr = index == tagIndex;\n                    return SearchText(\n                      fontSize: 14,\n                      padding: const .symmetric(horizontal: 8, vertical: 3),\n                      text: item.name!,\n                      bgColor: isCurr\n                          ? theme.colorScheme.secondaryContainer\n                          : Colors.transparent,\n                      textColor: isCurr\n                          ? theme.colorScheme.onSecondaryContainer\n                          : null,\n                      onTap: (value) =>\n                          _controller.onSelectTag(index, item.sortType),\n                    );\n                  },\n                  itemCount: _controller.newTags!.length,\n                );\n              }),\n            ),\n          response != null && response.isNotEmpty\n              ? SliverGrid.builder(\n                  gridDelegate: gridDelegate,\n                  itemBuilder: (context, index) {\n                    if (index == response.length - 1) {\n                      _controller.onLoadMore();\n                    }\n                    return LiveCardVApp(\n                      item: response[index],\n                      showFirstFrame: widget.showFirstFrame,\n                    );\n                  },\n                  itemCount: response.length,\n                )\n              : HttpError(onReload: _controller.onReload),\n        ],\n      ),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n\n  @override\n  bool get wantKeepAlive => true;\n}\n"
  },
  {
    "path": "lib/pages/live_area_detail/controller.dart",
    "content": "import 'dart:math';\n\nimport 'package:PiliPlus/http/live.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/live/live_area_list/area_item.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:flutter/material.dart' show TabController;\nimport 'package:get/get_state_manager/src/rx_flutter/rx_ticket_provider_mixin.dart';\n\nclass LiveAreaDetailController\n    extends CommonListController<List<AreaItem>?, AreaItem>\n    with GetSingleTickerProviderStateMixin {\n  LiveAreaDetailController(this.areaId, this.parentAreaId);\n  final dynamic areaId;\n  final dynamic parentAreaId;\n\n  TabController? tabController;\n\n  bool showFirstFrame = false;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  List<AreaItem>? getDataList(List<AreaItem>? response) {\n    if (response != null && response.isNotEmpty) {\n      assert(tabController == null);\n      final initialIndex = max(0, response.indexWhere((e) => e.id == areaId));\n      tabController = TabController(\n        length: response.length,\n        initialIndex: initialIndex,\n        vsync: this,\n      );\n    }\n    return response;\n  }\n\n  @override\n  Future<LoadingState<List<AreaItem>?>> customGetData() =>\n      LiveHttp.liveRoomAreaList(parentid: parentAreaId);\n\n  @override\n  void onClose() {\n    tabController?.dispose();\n    tabController = null;\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "lib/pages/live_area_detail/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models_new/live/live_area_list/area_item.dart';\nimport 'package:PiliPlus/pages/live_area_detail/child/controller.dart';\nimport 'package:PiliPlus/pages/live_area_detail/child/view.dart';\nimport 'package:PiliPlus/pages/live_area_detail/controller.dart';\nimport 'package:PiliPlus/pages/live_search/view.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\n\nclass LiveAreaDetailPage extends StatefulWidget {\n  const LiveAreaDetailPage({\n    super.key,\n    required this.areaId,\n    required this.parentAreaId,\n    required this.parentName,\n  });\n\n  final dynamic areaId;\n  final dynamic parentAreaId;\n  final String parentName;\n\n  @override\n  State<LiveAreaDetailPage> createState() => _LiveAreaDetailPageState();\n}\n\nclass _LiveAreaDetailPageState extends State<LiveAreaDetailPage> {\n  late final LiveAreaDetailController _controller;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = Get.put(\n      LiveAreaDetailController(widget.areaId?.toString(), widget.parentAreaId),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final ThemeData theme = Theme.of(context);\n    final padding = MediaQuery.viewPaddingOf(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        title: Text(widget.parentName),\n        actions: [\n          IconButton(\n            onPressed: () => Get.to(const LiveSearchPage()),\n            icon: const Icon(Icons.search),\n          ),\n          const SizedBox(width: 16),\n        ],\n      ),\n      body: Padding(\n        padding: EdgeInsets.only(left: padding.left, right: padding.right),\n        child: Obx(\n          () =>\n              _buildBody(theme, padding.bottom, _controller.loadingState.value),\n        ),\n      ),\n    );\n  }\n\n  Widget _buildBody(\n    ThemeData theme,\n    double bottom,\n    LoadingState<List<AreaItem>?> loadingState,\n  ) {\n    return switch (loadingState) {\n      Loading() => const SizedBox.shrink(),\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? Column(\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  Row(\n                    children: [\n                      Expanded(\n                        child: TabBar(\n                          dividerHeight: 0,\n                          isScrollable: true,\n                          tabAlignment: TabAlignment.start,\n                          dividerColor: Colors.transparent,\n                          controller: _controller.tabController,\n                          tabs: response\n                              .map((e) => Tab(text: e.name ?? ''))\n                              .toList(),\n                          onTap: (index) {\n                            try {\n                              if (!_controller.tabController!.indexIsChanging) {\n                                final item = response[index];\n                                Get.find<LiveAreaChildController>(\n                                  tag: '${item.id}${item.parentId}',\n                                ).animateToTop();\n                              }\n                            } catch (_) {}\n                          },\n                        ),\n                      ),\n                      iconButton(\n                        iconSize: 20,\n                        tooltip:\n                            '切换${_controller.showFirstFrame ? '封面' : '首帧'}',\n                        icon: _controller.showFirstFrame\n                            ? const Icon(MdiIcons.alphaFBox)\n                            : const Icon(MdiIcons.image),\n                        onPressed: () {\n                          _controller.showFirstFrame =\n                              !_controller.showFirstFrame;\n                          setState(() {});\n                        },\n                      ),\n                      iconButton(\n                        iconSize: 20,\n                        tooltip: '显示菜单',\n                        icon: const Icon(Icons.menu),\n                        onPressed: () =>\n                            _showTags(context, theme, bottom, response),\n                      ),\n                    ],\n                  ),\n                  const Divider(height: 1),\n                  Expanded(\n                    child: tabBarView(\n                      controller: _controller.tabController,\n                      children: response\n                          .map(\n                            (e) => LiveAreaChildPage(\n                              areaId: e.id,\n                              parentAreaId: e.parentId,\n                              showFirstFrame: _controller.showFirstFrame,\n                            ),\n                          )\n                          .toList(),\n                    ),\n                  ),\n                ],\n              )\n            : LiveAreaChildPage(\n                areaId: widget.areaId,\n                parentAreaId: widget.parentAreaId,\n                showFirstFrame: _controller.showFirstFrame,\n              ),\n      Error() => LiveAreaChildPage(\n        areaId: widget.areaId,\n        parentAreaId: widget.parentAreaId,\n        showFirstFrame: _controller.showFirstFrame,\n      ),\n    };\n  }\n\n  Widget _tagItem({\n    required ThemeData theme,\n    required AreaItem item,\n    required VoidCallback onTap,\n  }) {\n    return GestureDetector(\n      behavior: HitTestBehavior.opaque,\n      onTap: onTap,\n      child: Column(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          NetworkImgLayer(\n            width: 45,\n            height: 45,\n            src: item.pic,\n            type: ImageType.emote,\n          ),\n          const SizedBox(height: 4),\n          Text(\n            item.name!,\n            maxLines: 1,\n            overflow: TextOverflow.ellipsis,\n            style: const TextStyle(fontSize: 12),\n          ),\n        ],\n      ),\n    );\n  }\n\n  void _showTags(\n    BuildContext context,\n    ThemeData theme,\n    double bottom,\n    List<AreaItem> list,\n  ) {\n    showModalBottomSheet(\n      context: context,\n      useSafeArea: true,\n      isScrollControlled: true,\n      builder: (_) {\n        return DraggableScrollableSheet(\n          minChildSize: 0,\n          maxChildSize: 1,\n          initialChildSize: 1,\n          snap: true,\n          expand: false,\n          snapSizes: const [1],\n          builder: (_, scrollController) {\n            return Column(\n              children: [\n                AppBar(\n                  centerTitle: true,\n                  backgroundColor: Colors.transparent,\n                  automaticallyImplyLeading: false,\n                  title: Text(widget.parentName),\n                  actions: [\n                    IconButton(\n                      onPressed: Get.back,\n                      icon: const Icon(Icons.clear),\n                    ),\n                    const SizedBox(width: 12),\n                  ],\n                ),\n                Expanded(\n                  child: GridView.builder(\n                    controller: scrollController,\n                    padding: EdgeInsets.only(\n                      top: 12,\n                      bottom: bottom + 100,\n                    ),\n                    itemCount: list.length,\n                    gridDelegate:\n                        const SliverGridDelegateWithMaxCrossAxisExtent(\n                          maxCrossAxisExtent: 100,\n                          mainAxisSpacing: 10,\n                          crossAxisSpacing: 10,\n                          mainAxisExtent: 80,\n                        ),\n                    itemBuilder: (_, index) {\n                      return _tagItem(\n                        theme: theme,\n                        item: list[index],\n                        onTap: () {\n                          Get.back();\n                          _controller.tabController?.index = index;\n                        },\n                      );\n                    },\n                  ),\n                ),\n              ],\n            );\n          },\n        );\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/live_dm_block/controller.dart",
    "content": "import 'package:PiliPlus/http/live.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/live/live_dm_silent_type.dart';\nimport 'package:PiliPlus/models_new/live/live_dm_block/shield_user_list.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass LiveDmBlockController extends GetxController\n    with GetSingleTickerProviderStateMixin {\n  final roomId = Get.parameters['roomId']!;\n\n  @override\n  void onInit() {\n    super.onInit();\n    tabController = TabController(length: 2, vsync: this);\n    queryData();\n  }\n\n  late final TabController tabController;\n\n  int? oldLevel;\n  final RxInt level = 0.obs;\n  final RxInt rank = 0.obs;\n  final RxInt verify = 0.obs;\n  final RxBool isEnable = false.obs;\n\n  final RxList<String> keywordList = <String>[].obs;\n  final RxList<ShieldUserList> shieldUserList = <ShieldUserList>[].obs;\n\n  void updateValue() {\n    isEnable.value = level.value != 0 || rank.value != 0 || verify.value != 0;\n  }\n\n  Future<void> queryData() async {\n    final res = await LiveHttp.getLiveInfoByUser(roomId);\n    if (res case Success(:final response)) {\n      final shieldRules = response?.shieldRules;\n      level.value = shieldRules?.level ?? 0;\n      rank.value = shieldRules?.rank ?? 0;\n      verify.value = shieldRules?.verify ?? 0;\n      updateValue();\n\n      if (response?.keywordList case final keywordList?) {\n        this.keywordList.addAll(keywordList);\n      }\n      if (response?.shieldUserList case final shieldUserList?) {\n        this.shieldUserList.addAll(shieldUserList);\n      }\n    } else {\n      res.toast();\n    }\n  }\n\n  Future<bool> setSilent(\n    LiveDmSilentType type,\n    int level, {\n    VoidCallback? onError,\n  }) async {\n    final res = await LiveHttp.liveSetSilent(type: type.name, level: level);\n    if (res.isSuccess) {\n      switch (type) {\n        case LiveDmSilentType.level:\n          this.level.value = level;\n        case LiveDmSilentType.rank:\n          rank.value = level;\n        case LiveDmSilentType.verify:\n          verify.value = level;\n      }\n      updateValue();\n      return true;\n    } else {\n      onError?.call();\n      res.toast();\n      return false;\n    }\n  }\n\n  Future<void> setEnable(bool enable) async {\n    if (enable == isEnable.value) {\n      return;\n    }\n    final futures = enable\n        ? [\n            setSilent(LiveDmSilentType.rank, 1),\n            setSilent(LiveDmSilentType.verify, 1),\n          ]\n        : [\n            for (final e in LiveDmSilentType.values) setSilent(e, 0),\n          ];\n    final res = await Future.wait(futures);\n    if (enable) {\n      if (res.any((e) => e)) {\n        isEnable.value = true;\n      }\n    } else {\n      if (res.every((e) => e)) {\n        isEnable.value = false;\n      }\n    }\n  }\n\n  Future<void> addShieldKeyword(bool isKeyword, String value) async {\n    if (isKeyword) {\n      final res = await LiveHttp.addShieldKeyword(keyword: value);\n      if (res.isSuccess) {\n        keywordList.insert(0, value);\n      } else {\n        res.toast();\n      }\n    } else {\n      final res = await LiveHttp.liveShieldUser(\n        uid: value,\n        roomid: roomId,\n        type: 1,\n      );\n      if (res case Success(:final response)) {\n        shieldUserList.insert(0, response);\n      } else {\n        res.toast();\n      }\n    }\n  }\n\n  Future<void> onRemove(int index, Object item) async {\n    assert(item is ShieldUserList || item is String);\n    if (item is ShieldUserList) {\n      final res = await LiveHttp.liveShieldUser(\n        uid: item.uid!,\n        roomid: roomId,\n        type: 0,\n      );\n      if (res.isSuccess) {\n        shieldUserList.removeAt(index);\n      } else {\n        res.toast();\n      }\n    } else {\n      final res = await LiveHttp.delShieldKeyword(keyword: item as String);\n      if (res.isSuccess) {\n        keywordList.removeAt(index);\n      } else {\n        res.toast();\n      }\n    }\n  }\n\n  @override\n  void onClose() {\n    tabController.dispose();\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "lib/pages/live_dm_block/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/keep_alive_wrapper.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/common/widgets/sliver/sliver_pinned_header.dart';\nimport 'package:PiliPlus/models/common/live/live_dm_silent_type.dart';\nimport 'package:PiliPlus/models_new/live/live_dm_block/shield_user_list.dart';\nimport 'package:PiliPlus/pages/live_dm_block/controller.dart';\nimport 'package:PiliPlus/pages/search/widgets/search_text.dart';\nimport 'package:PiliPlus/utils/extension/size_ext.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\nimport 'package:flutter/services.dart' show FilteringTextInputFormatter;\nimport 'package:get/get.dart';\n\nclass LiveDmBlockPage extends StatefulWidget {\n  const LiveDmBlockPage({super.key});\n\n  @override\n  State<LiveDmBlockPage> createState() => _LiveDmBlockPageState();\n}\n\nclass _LiveDmBlockPageState extends State<LiveDmBlockPage> {\n  final _controller = Get.put(\n    LiveDmBlockController(),\n    tag: Utils.generateRandomString(8),\n  );\n  late bool isPortrait;\n  late EdgeInsets padding;\n\n  @override\n  Widget build(BuildContext context) {\n    isPortrait = MediaQuery.sizeOf(context).isPortrait;\n    padding = MediaQuery.viewPaddingOf(context);\n    final theme = Theme.of(context);\n    Widget tabBar = TabBar(\n      controller: _controller.tabController,\n      tabs: const [\n        Tab(text: '关键词'),\n        Tab(text: '用户'),\n      ],\n    );\n\n    Widget view = tabBarView(\n      controller: _controller.tabController,\n      children: [\n        KeepAliveWrapper(\n          child: Obx(() => _buildKeyword(_controller.keywordList)),\n        ),\n        KeepAliveWrapper(\n          child: Obx(() => _buildKeyword(_controller.shieldUserList)),\n        ),\n      ],\n    );\n\n    Widget title = Padding(\n      padding: EdgeInsets.only(\n        top: isPortrait ? 18 : 0,\n        left: isPortrait ? 0 : 12,\n        bottom: 12,\n      ),\n      child: const Text(\n        '关键词屏蔽',\n        style: TextStyle(fontSize: 17, fontWeight: FontWeight.bold),\n      ),\n    );\n\n    Widget left = Padding(\n      padding: const EdgeInsets.symmetric(horizontal: 12),\n      child: Column(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          const Text(\n            '全局屏蔽',\n            style: TextStyle(fontSize: 17, fontWeight: FontWeight.bold),\n          ),\n          ..._buildHeader(theme),\n          if (isPortrait) title,\n        ],\n      ),\n    );\n\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(title: const Text('弹幕屏蔽')),\n      body: Padding(\n        padding: EdgeInsets.only(left: padding.left, right: padding.right),\n        child: Stack(\n          clipBehavior: Clip.none,\n          children: [\n            isPortrait\n                ? ExtendedNestedScrollView(\n                    onlyOneScrollInBody: true,\n                    headerSliverBuilder: (context, innerBoxIsScrolled) {\n                      return [\n                        SliverToBoxAdapter(child: left),\n                        SliverOverlapAbsorber(\n                          handle:\n                              ExtendedNestedScrollView.sliverOverlapAbsorberHandleFor(\n                                context,\n                              ),\n                          sliver: SliverPinnedHeader(child: tabBar),\n                        ),\n                      ];\n                    },\n                    body: LayoutBuilder(\n                      builder: (context, _) {\n                        return Padding(\n                          padding: EdgeInsets.only(\n                            top:\n                                ExtendedNestedScrollView.sliverOverlapAbsorberHandleFor(\n                                  context,\n                                ).layoutExtent ??\n                                0,\n                          ),\n                          child: view,\n                        );\n                      },\n                    ),\n                  )\n                : Row(\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: [\n                      Expanded(child: left),\n                      VerticalDivider(\n                        width: 1,\n                        color: theme.colorScheme.outline.withValues(alpha: 0.1),\n                      ),\n                      Expanded(\n                        child: Column(\n                          crossAxisAlignment: CrossAxisAlignment.start,\n                          children: [\n                            title,\n                            tabBar,\n                            Expanded(child: view),\n                          ],\n                        ),\n                      ),\n                    ],\n                  ),\n            Positioned(\n              right: kFloatingActionButtonMargin,\n              bottom: kFloatingActionButtonMargin + padding.bottom,\n              child: FloatingActionButton(\n                tooltip: '添加',\n                onPressed: _addShieldKeyword,\n                child: const Icon(Icons.add),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget _buildKeyword(List list) {\n    if (list.isEmpty) {\n      return scrollableError;\n    }\n    return SingleChildScrollView(\n      padding: EdgeInsets.only(\n        top: 12,\n        left: 12,\n        right: 12,\n        bottom: padding.bottom + 100,\n      ),\n      child: Wrap(\n        spacing: 12,\n        runSpacing: 12,\n        children: list.indexed.map(\n          (e) {\n            final item = e.$2;\n            return SearchText(\n              text: item is ShieldUserList ? item.uname! : item as String,\n              onTap: (value) => showConfirmDialog(\n                context: context,\n                title: '确定删除该规则？',\n                onConfirm: () => _controller.onRemove(e.$1, item),\n              ),\n            );\n          },\n        ).toList(),\n      ),\n    );\n  }\n\n  List<Widget> _buildHeader(ThemeData theme) {\n    return [\n      const SizedBox(height: 6),\n      Obx(\n        () {\n          final isEnable = _controller.isEnable.value;\n          return Row(\n            spacing: 10,\n            children: [\n              Text('屏蔽${isEnable ? '已' : '未'}开启'),\n              Transform.scale(\n                scale: .8,\n                child: Switch(\n                  value: isEnable,\n                  onChanged: _controller.setEnable,\n                ),\n              ),\n            ],\n          );\n        },\n      ),\n      const SizedBox(height: 6),\n      Obx(\n        () {\n          final level = _controller.level.value;\n          return Row(\n            children: [\n              const Text('用户等级'),\n              Slider(\n                min: 0,\n                max: 60,\n                // ignore: deprecated_member_use\n                year2023: true,\n                inactiveColor: theme.colorScheme.onInverseSurface,\n                padding: const EdgeInsets.only(left: 20, right: 25),\n                value: level.toDouble(),\n                onChangeStart: (value) => _controller.oldLevel = level,\n                onChanged: (value) =>\n                    _controller.level.value = value.round().clamp(0, 60),\n                onChangeEnd: (value) {\n                  if (_controller.oldLevel != level) {\n                    _controller.setSilent(\n                      LiveDmSilentType.level,\n                      level,\n                      onError: () =>\n                          _controller.level.value = _controller.oldLevel ?? 0,\n                    );\n                  }\n                },\n              ),\n              Text('$level 以下'),\n            ],\n          );\n        },\n      ),\n      const SizedBox(height: 20),\n      Row(\n        spacing: 16,\n        children: [\n          Obx(() {\n            final isEnable = _controller.rank.value == 1;\n            return _headerBtn(\n              theme,\n              isEnable,\n              Icons.live_tv,\n              '非正式会员',\n              () => _controller.setSilent(\n                LiveDmSilentType.rank,\n                isEnable ? 0 : 1,\n              ),\n            );\n          }),\n          Obx(() {\n            final isEnable = _controller.verify.value == 1;\n            return _headerBtn(\n              theme,\n              isEnable,\n              Icons.smartphone,\n              '未绑定手机用户',\n              () => _controller.setSilent(\n                LiveDmSilentType.verify,\n                isEnable ? 0 : 1,\n              ),\n            );\n          }),\n        ],\n      ),\n    ];\n  }\n\n  Widget _headerBtn(\n    ThemeData theme,\n    bool isEnable,\n    IconData icon,\n    String name,\n    VoidCallback onTap,\n  ) {\n    final color = isEnable\n        ? theme.colorScheme.primary\n        : theme.colorScheme.outline;\n\n    Widget top = Container(\n      width: 42,\n      height: 42,\n      alignment: Alignment.center,\n      decoration: isEnable\n          ? BoxDecoration(\n              border: Border.all(color: color),\n              borderRadius: const BorderRadius.all(Radius.circular(4)),\n            )\n          : null,\n      child: Icon(icon, color: color),\n    );\n\n    if (isEnable) {\n      top = Stack(\n        clipBehavior: Clip.none,\n        children: [\n          top,\n          Positioned(\n            right: -6,\n            top: -6,\n            child: DecoratedBox(\n              decoration: BoxDecoration(\n                color: theme.colorScheme.error,\n                shape: BoxShape.circle,\n              ),\n              child: Padding(\n                padding: const EdgeInsets.all(2),\n                child: Icon(\n                  size: 14,\n                  Icons.horizontal_rule,\n                  color: theme.colorScheme.onError,\n                ),\n              ),\n            ),\n          ),\n        ],\n      );\n    }\n\n    return GestureDetector(\n      onTap: onTap,\n      behavior: HitTestBehavior.opaque,\n      child: Column(\n        spacing: 5,\n        children: [\n          top,\n          Text(\n            name,\n            style: TextStyle(color: color),\n          ),\n        ],\n      ),\n    );\n  }\n\n  void _addShieldKeyword() {\n    bool isKeyword = _controller.tabController.index == 0;\n    String value = '';\n    showConfirmDialog(\n      context: context,\n      title: '${isKeyword ? '关键词' : '用户'}屏蔽',\n      content: TextFormField(\n        autofocus: true,\n        initialValue: value,\n        onChanged: (val) => value = val,\n        decoration: isKeyword ? null : const InputDecoration(hintText: 'UID'),\n        keyboardType: isKeyword ? null : TextInputType.number,\n        inputFormatters: isKeyword\n            ? null\n            : [FilteringTextInputFormatter.digitsOnly],\n      ),\n      onConfirm: () {\n        if (value.isNotEmpty) {\n          _controller.addShieldKeyword(isKeyword, value);\n        }\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/live_emote/controller.dart",
    "content": "import 'package:PiliPlus/http/live.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/live/live_emote/datum.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass LiveEmotePanelController\n    extends CommonListController<List<LiveEmoteDatum>?, LiveEmoteDatum>\n    with GetSingleTickerProviderStateMixin {\n  LiveEmotePanelController(this.roomId);\n  final int roomId;\n  TabController? tabController;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  bool customHandleResponse(\n    bool isRefresh,\n    Success<List<LiveEmoteDatum>?> response,\n  ) {\n    if (response.response?.isNotEmpty == true) {\n      tabController = TabController(\n        length: response.response!.length,\n        vsync: this,\n      );\n    }\n    loadingState.value = response;\n    return true;\n  }\n\n  @override\n  Future<LoadingState<List<LiveEmoteDatum>?>> customGetData() =>\n      LiveHttp.getLiveEmoticons(roomId: roomId);\n\n  @override\n  void onClose() {\n    tabController?.dispose();\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "lib/pages/live_emote/view.dart",
    "content": "import 'dart:math';\n\nimport 'package:PiliPlus/common/widgets/custom_tooltip.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models_new/live/live_emote/datum.dart';\nimport 'package:PiliPlus/models_new/live/live_emote/emoticon.dart';\nimport 'package:PiliPlus/pages/live_emote/controller.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass LiveEmotePanel extends StatefulWidget {\n  final int roomId;\n  final Function(Emoticon emote, double? width, double? height) onChoose;\n  final ValueChanged<Emoticon> onSendEmoticonUnique;\n  const LiveEmotePanel({\n    super.key,\n    required this.roomId,\n    required this.onChoose,\n    required this.onSendEmoticonUnique,\n  });\n\n  @override\n  State<LiveEmotePanel> createState() => _LiveEmotePanelState();\n}\n\nclass _LiveEmotePanelState extends State<LiveEmotePanel>\n    with AutomaticKeepAliveClientMixin {\n  late final LiveEmotePanelController _emotePanelController;\n\n  @override\n  void initState() {\n    super.initState();\n    _emotePanelController = Get.put(\n      LiveEmotePanelController(widget.roomId),\n      tag: widget.roomId.toString(),\n    );\n  }\n\n  @override\n  bool get wantKeepAlive => true;\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    return Obx(() => _buildBody(_emotePanelController.loadingState.value));\n  }\n\n  Widget _buildBody(LoadingState<List<LiveEmoteDatum>?> loadingState) {\n    late final theme = Theme.of(context);\n    late final color = ElevationOverlay.colorWithOverlay(\n      theme.colorScheme.surface,\n      theme.hoverColor,\n      2,\n    );\n    return switch (loadingState) {\n      Loading() => m3eLoading,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? Column(\n                children: [\n                  Expanded(\n                    child: tabBarView(\n                      controller: _emotePanelController.tabController,\n                      children: response.map(\n                        (item) {\n                          final emote = item.emoticons;\n                          if (emote == null || emote.isEmpty) {\n                            return const SizedBox.shrink();\n                          }\n                          final first = emote.first;\n                          final widthFac = first.width == null\n                              ? 1.0\n                              : max(1.0, first.width! / 80);\n                          final heightFac = first.height == null\n                              ? 1.0\n                              : max(1.0, first.height! / 80);\n                          final width = widthFac * 38;\n                          final height = heightFac * 38;\n                          return GridView.builder(\n                            physics: const ClampingScrollPhysics(),\n                            padding: const EdgeInsets.only(\n                              left: 12,\n                              right: 12,\n                              bottom: 12,\n                            ),\n                            gridDelegate:\n                                SliverGridDelegateWithMaxCrossAxisExtent(\n                                  maxCrossAxisExtent: widthFac * 40,\n                                  mainAxisExtent: heightFac * 40,\n                                  crossAxisSpacing: 8,\n                                  mainAxisSpacing: 8,\n                                ),\n                            itemCount: emote.length,\n                            itemBuilder: (context, index) {\n                              final e = emote[index];\n                              return Material(\n                                type: MaterialType.transparency,\n                                child: InkWell(\n                                  borderRadius: const BorderRadius.all(\n                                    Radius.circular(6),\n                                  ),\n                                  onTap: () {\n                                    if (item.pkgType == 3) {\n                                      widget.onChoose(e, width, height);\n                                    } else {\n                                      widget.onSendEmoticonUnique(e);\n                                    }\n                                  },\n                                  child: CustomTooltip(\n                                    indicator: () => Triangle(\n                                      color: color,\n                                      size: const Size(14, 8),\n                                    ),\n                                    overlayWidget: () => Container(\n                                      padding: const EdgeInsets.all(8),\n                                      decoration: BoxDecoration(\n                                        color: color,\n                                        borderRadius: const BorderRadius.all(\n                                          Radius.circular(8),\n                                        ),\n                                      ),\n                                      child: Column(\n                                        spacing: 4,\n                                        mainAxisSize: MainAxisSize.min,\n                                        children: [\n                                          NetworkImgLayer(\n                                            src: e.url,\n                                            width: 65,\n                                            height: 65,\n                                            type: ImageType.emote,\n                                            fit: BoxFit.contain,\n                                          ),\n                                          Text(\n                                            e.emoji == null\n                                                ? ''\n                                                : e.emoji!.startsWith('[')\n                                                ? e.emoji!.substring(\n                                                    1,\n                                                    e.emoji!.length - 1,\n                                                  )\n                                                : e.emoji!,\n                                            style: const TextStyle(\n                                              fontSize: 12,\n                                            ),\n                                          ),\n                                        ],\n                                      ),\n                                    ),\n                                    child: Padding(\n                                      padding: const EdgeInsets.all(6),\n                                      child: NetworkImgLayer(\n                                        fit: BoxFit.contain,\n                                        src: e.url,\n                                        width: width,\n                                        height: height,\n                                        type: ImageType.emote,\n                                        quality: item.pkgType == 3 ? 1 : 80,\n                                      ),\n                                    ),\n                                  ),\n                                ),\n                              );\n                            },\n                          );\n                        },\n                      ).toList(),\n                    ),\n                  ),\n                  Divider(\n                    height: 1,\n                    color: theme.dividerColor.withValues(alpha: 0.1),\n                  ),\n                  TabBar(\n                    controller: _emotePanelController.tabController,\n                    padding: const EdgeInsets.only(right: 60),\n                    dividerColor: Colors.transparent,\n                    dividerHeight: 0,\n                    isScrollable: true,\n                    tabs: response\n                        .map(\n                          (item) => Padding(\n                            padding: const EdgeInsets.all(8),\n                            child: NetworkImgLayer(\n                              width: 24,\n                              height: 24,\n                              type: ImageType.emote,\n                              src: item.currentCover,\n                            ),\n                          ),\n                        )\n                        .toList(),\n                  ),\n                  SizedBox(height: MediaQuery.viewPaddingOf(context).bottom),\n                ],\n              )\n            : _errorWidget(),\n      Error(:final errMsg) => _errorWidget(errMsg),\n    };\n  }\n\n  Widget _errorWidget([String? errMsg]) => Center(\n    child: TextButton.icon(\n      onPressed: _emotePanelController.onReload,\n      icon: const Icon(Icons.refresh),\n      label: Text(errMsg ?? '没有数据'),\n    ),\n  );\n}\n"
  },
  {
    "path": "lib/pages/live_follow/controller.dart",
    "content": "import 'package:PiliPlus/http/live.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/live/live_follow/data.dart';\nimport 'package:PiliPlus/models_new/live/live_follow/item.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:get/get.dart';\n\nclass LiveFollowController\n    extends CommonListController<LiveFollowData, LiveFollowItem> {\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  Rx<int?> count = Rx<int?>(null);\n\n  @override\n  void checkIsEnd(int length) {\n    final count = this.count.value;\n    if (count != null && length >= count) {\n      isEnd = true;\n    }\n  }\n\n  @override\n  List<LiveFollowItem>? getDataList(LiveFollowData response) {\n    count.value = response.liveCount;\n    return response.list;\n  }\n\n  @override\n  Future<LoadingState<LiveFollowData>> customGetData() =>\n      LiveHttp.liveFollow(page);\n}\n"
  },
  {
    "path": "lib/pages/live_follow/view.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/skeleton/video_card_v.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/live/live_follow/item.dart';\nimport 'package:PiliPlus/pages/live_follow/controller.dart';\nimport 'package:PiliPlus/pages/live_follow/widgets/live_item_follow.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass LiveFollowPage extends StatefulWidget {\n  const LiveFollowPage({super.key});\n\n  @override\n  State<LiveFollowPage> createState() => _LiveFollowPageState();\n}\n\nclass _LiveFollowPageState extends State<LiveFollowPage> {\n  final _controller = Get.put(LiveFollowController());\n\n  @override\n  Widget build(BuildContext context) {\n    final padding = MediaQuery.viewPaddingOf(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        title: Obx(\n          () {\n            final count = _controller.count.value;\n            return Text(count != null ? '$count人正在直播' : '关注直播');\n          },\n        ),\n      ),\n      body: refreshIndicator(\n        onRefresh: _controller.onRefresh,\n        child: CustomScrollView(\n          physics: const AlwaysScrollableScrollPhysics(),\n          slivers: [\n            SliverPadding(\n              padding: EdgeInsets.only(\n                left: StyleString.safeSpace + padding.left,\n                right: StyleString.safeSpace + padding.right,\n                bottom: padding.bottom + 100,\n              ),\n              sliver: Obx(() => _buildBody(_controller.loadingState.value)),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  late final gridDelegate = SliverGridDelegateWithExtentAndRatio(\n    mainAxisSpacing: StyleString.cardSpace,\n    crossAxisSpacing: StyleString.cardSpace,\n    maxCrossAxisExtent: Grid.smallCardWidth,\n    childAspectRatio: StyleString.aspectRatio,\n    mainAxisExtent: MediaQuery.textScalerOf(context).scale(90),\n  );\n\n  Widget _buildBody(LoadingState<List<LiveFollowItem>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => SliverGrid.builder(\n        gridDelegate: gridDelegate,\n        itemBuilder: (context, index) => const VideoCardVSkeleton(),\n        itemCount: 10,\n      ),\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverGrid.builder(\n                gridDelegate: gridDelegate,\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    _controller.onLoadMore();\n                  }\n                  return LiveCardVFollow(\n                    liveItem: response[index],\n                  );\n                },\n                itemCount: response.length,\n              )\n            : HttpError(onReload: _controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/live_follow/widgets/live_item_follow.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models_new/live/live_follow/item.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\n\n// 视频卡片 - 垂直布局\nclass LiveCardVFollow extends StatelessWidget {\n  final LiveFollowItem liveItem;\n\n  const LiveCardVFollow({\n    super.key,\n    required this.liveItem,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    void onLongPress() => imageSaveDialog(\n      title: liveItem.title,\n      cover: liveItem.roomCover,\n    );\n    return Card(\n      clipBehavior: Clip.hardEdge,\n      child: InkWell(\n        onTap: () => PageUtils.toLiveRoom(liveItem.roomid),\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        child: Column(\n          children: [\n            AspectRatio(\n              aspectRatio: StyleString.aspectRatio,\n              child: LayoutBuilder(\n                builder: (context, boxConstraints) {\n                  double maxWidth = boxConstraints.maxWidth;\n                  double maxHeight = boxConstraints.maxHeight;\n                  return Stack(\n                    clipBehavior: Clip.none,\n                    children: [\n                      NetworkImgLayer(\n                        src: liveItem.roomCover!,\n                        width: maxWidth,\n                        height: maxHeight,\n                        type: .emote,\n                      ),\n                      Positioned(\n                        left: 0,\n                        right: 0,\n                        bottom: 0,\n                        child: AnimatedOpacity(\n                          opacity: 1,\n                          duration: const Duration(milliseconds: 200),\n                          child: videoStat(context),\n                        ),\n                      ),\n                    ],\n                  );\n                },\n              ),\n            ),\n            liveContent(context),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget liveContent(BuildContext context) {\n    final theme = Theme.of(context);\n    return Expanded(\n      flex: 1,\n      child: Padding(\n        padding: const EdgeInsets.fromLTRB(5, 8, 5, 4),\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          mainAxisAlignment: MainAxisAlignment.spaceBetween,\n          children: [\n            Text(\n              '${liveItem.title}',\n              textAlign: TextAlign.start,\n              style: const TextStyle(\n                letterSpacing: 0.3,\n              ),\n              maxLines: 2,\n              overflow: TextOverflow.ellipsis,\n            ),\n            Row(\n              children: [\n                Expanded(\n                  child: Text(\n                    '${liveItem.uname}',\n                    textAlign: TextAlign.start,\n                    style: TextStyle(\n                      fontSize: theme.textTheme.labelMedium!.fontSize,\n                      color: theme.colorScheme.outline,\n                    ),\n                    maxLines: 1,\n                    overflow: TextOverflow.ellipsis,\n                  ),\n                ),\n              ],\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget videoStat(BuildContext context) {\n    return Container(\n      height: 50,\n      padding: const EdgeInsets.only(top: 26, left: 10, right: 10),\n      decoration: const BoxDecoration(\n        gradient: LinearGradient(\n          begin: Alignment.topCenter,\n          end: Alignment.bottomCenter,\n          colors: <Color>[\n            Colors.transparent,\n            Colors.black54,\n          ],\n          tileMode: TileMode.mirror,\n        ),\n      ),\n      child: Row(\n        mainAxisAlignment: MainAxisAlignment.spaceBetween,\n        children: [\n          Text(\n            '${liveItem.areaName}',\n            style: const TextStyle(fontSize: 11, color: Colors.white),\n          ),\n          if (liveItem.textSmall case final textSmall?)\n            Text(\n              '$textSmall围观',\n              style: const TextStyle(fontSize: 11, color: Colors.white),\n            ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/live_room/contribution_rank/controller.dart",
    "content": "import 'package:PiliPlus/http/live.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/live/live_contribution_rank_type.dart';\nimport 'package:PiliPlus/models_new/live/live_contribution_rank/data.dart';\nimport 'package:PiliPlus/models_new/live/live_contribution_rank/item.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\n\nclass ContributionRankController\n    extends\n        CommonListController<\n          LiveContributionRankData,\n          LiveContributionRankItem\n        > {\n  final Object ruid;\n  final Object roomId;\n  final LiveContributionRankType type;\n\n  ContributionRankController({\n    required this.ruid,\n    required this.roomId,\n    required this.type,\n  });\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  List<LiveContributionRankItem>? getDataList(\n    LiveContributionRankData response,\n  ) {\n    return response.item;\n  }\n\n  @override\n  Future<LoadingState<LiveContributionRankData>> customGetData() =>\n      LiveHttp.liveContributionRank(\n        ruid: ruid,\n        roomId: roomId,\n        page: page,\n        type: type,\n      );\n}\n"
  },
  {
    "path": "lib/pages/live_room/contribution_rank/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/common/widgets/pendant_avatar.dart';\nimport 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/common/widgets/view_sliver_safe_area.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/live/live_contribution_rank_type.dart';\nimport 'package:PiliPlus/models_new/live/live_contribution_rank/item.dart';\nimport 'package:PiliPlus/models_new/live/live_contribution_rank/medal_info.dart';\nimport 'package:PiliPlus/pages/live_room/contribution_rank/controller.dart';\nimport 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass ContributionRankPanel extends StatefulWidget {\n  const ContributionRankPanel({\n    super.key,\n    required this.ruid,\n    required this.roomId,\n  });\n\n  final Object ruid;\n  final Object roomId;\n\n  @override\n  State<ContributionRankPanel> createState() => _ContributionRankPanelState();\n}\n\nclass _ContributionRankPanelState extends State<ContributionRankPanel>\n    with SingleTickerProviderStateMixin {\n  late final TabController _tabController;\n\n  @override\n  void initState() {\n    super.initState();\n    _tabController = TabController(\n      length: LiveContributionRankType.values.length,\n      vsync: this,\n    );\n  }\n\n  @override\n  void dispose() {\n    _tabController.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: [\n        SizedBox(\n          height: 45,\n          child: TabBar(\n            controller: _tabController,\n            tabs: LiveContributionRankType.values\n                .map((e) => Tab(text: e.title))\n                .toList(),\n            dividerColor: Theme.of(\n              context,\n            ).colorScheme.outline.withValues(alpha: 0.3),\n            onTap: (index) {\n              if (!_tabController.indexIsChanging) {\n                Get.find<ContributionRankController>(\n                  tag:\n                      '${widget.roomId}${LiveContributionRankType.values[index].name}',\n                ).scrollController.animToTop();\n              }\n            },\n          ),\n        ),\n        Expanded(\n          child: tabBarView(\n            controller: _tabController,\n            children: LiveContributionRankType.values\n                .map(\n                  (e) => _ContributionRankType(\n                    ruid: widget.ruid,\n                    roomId: widget.roomId,\n                    type: e,\n                  ),\n                )\n                .toList(),\n          ),\n        ),\n      ],\n    );\n  }\n}\n\nclass _ContributionRankType extends StatefulWidget {\n  const _ContributionRankType({\n    required this.ruid,\n    required this.roomId,\n    required this.type,\n  });\n\n  final Object ruid;\n  final Object roomId;\n  final LiveContributionRankType type;\n\n  @override\n  State<_ContributionRankType> createState() => _ContributionRankTypeState();\n}\n\nclass _ContributionRankTypeState extends State<_ContributionRankType>\n    with AutomaticKeepAliveClientMixin {\n  late final ContributionRankController _controller;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = Get.put(\n      ContributionRankController(\n        ruid: widget.ruid,\n        roomId: widget.roomId,\n        type: widget.type,\n      ),\n      tag: '${widget.roomId}${widget.type.name}',\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final showScore = widget.type == .online_rank;\n    return Material(\n      type: .transparency,\n      child: refreshIndicator(\n        onRefresh: _controller.onRefresh,\n        child: CustomScrollView(\n          controller: _controller.scrollController,\n          physics: const AlwaysScrollableScrollPhysics(),\n          slivers: [\n            ViewSliverSafeArea(\n              sliver: Obx(\n                () => _buildBody(showScore, _controller.loadingState.value),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget _buildBody(\n    bool showScore,\n    LoadingState<List<LiveContributionRankItem>?> state,\n  ) {\n    return switch (state) {\n      Loading() => linearLoading,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverFixedExtentList.builder(\n                itemCount: response.length,\n                itemBuilder: (context, index) {\n                  final item = response[index];\n                  return _Item(\n                    index: index,\n                    item: item,\n                    showScore: showScore,\n                  );\n                },\n                itemExtent: 60,\n              )\n            : HttpError(onReload: _controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n\n  @override\n  bool get wantKeepAlive => true;\n}\n\nclass _Item extends StatelessWidget {\n  const _Item({\n    required this.index,\n    required this.item,\n    required this.showScore,\n  });\n\n  final int index;\n  final bool showScore;\n  final LiveContributionRankItem item;\n\n  @override\n  Widget build(BuildContext context) {\n    late final colorScheme = ColorScheme.of(context);\n    return InkWell(\n      onTap: () => Get.toNamed('/member?mid=${item.uid}'),\n      child: Padding(\n        padding: const .only(left: 10, top: 9, bottom: 8, right: 16),\n        child: Row(\n          spacing: 10,\n          children: [\n            SizedBox(\n              width: 32,\n              child: Center(\n                child: Text(\n                  '${index + 1}',\n                  textAlign: .center,\n                  textScaler: .noScaling,\n                  style: TextStyle(\n                    fontWeight: FontWeight.bold,\n                    color: Utils.index2Color(index, colorScheme.outline),\n                    fontSize: 16,\n                    fontStyle: FontStyle.italic,\n                  ),\n                ),\n              ),\n            ),\n            PendantAvatar(\n              avatar: item.face,\n              size: 42,\n            ),\n            Expanded(\n              child: Column(\n                spacing: 3,\n                crossAxisAlignment: .start,\n                children: [\n                  Text(item.name!),\n                  Row(\n                    children: [\n                      if (item.medalInfo case MedalInfo(\n                        :final medalName,\n                        :final level,\n                      ))\n                        Text(\n                          '$medalName$level',\n                          style: TextStyle(\n                            fontSize: 12,\n                            color: colorScheme.onSurfaceVariant,\n                          ),\n                        ),\n                    ],\n                  ),\n                ],\n              ),\n            ),\n            if (showScore)\n              Text(\n                item.score.toString(),\n                style: TextStyle(color: colorScheme.outline),\n              ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/live_room/controller.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\n\nimport 'package:PiliPlus/common/widgets/dialog/report.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text_field/controller.dart';\nimport 'package:PiliPlus/http/live.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/video.dart';\nimport 'package:PiliPlus/models/common/super_chat_type.dart';\nimport 'package:PiliPlus/models/common/video/live_quality.dart';\nimport 'package:PiliPlus/models/model_owner.dart';\nimport 'package:PiliPlus/models_new/live/live_danmaku/danmaku_msg.dart';\nimport 'package:PiliPlus/models_new/live/live_danmaku/live_emote.dart';\nimport 'package:PiliPlus/models_new/live/live_dm_info/data.dart';\nimport 'package:PiliPlus/models_new/live/live_room_info_h5/data.dart';\nimport 'package:PiliPlus/models_new/live/live_room_play_info/codec.dart';\nimport 'package:PiliPlus/models_new/live/live_superchat/item.dart';\nimport 'package:PiliPlus/pages/common/publish/publish_route.dart';\nimport 'package:PiliPlus/pages/danmaku/danmaku_model.dart';\nimport 'package:PiliPlus/pages/live_room/contribution_rank/view.dart';\nimport 'package:PiliPlus/pages/live_room/send_danmaku/view.dart';\nimport 'package:PiliPlus/pages/video/widgets/header_control.dart';\nimport 'package:PiliPlus/plugin/pl_player/controller.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/data_source.dart';\nimport 'package:PiliPlus/plugin/pl_player/utils/danmaku_options.dart';\nimport 'package:PiliPlus/services/service_locator.dart';\nimport 'package:PiliPlus/tcp/live.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/danmaku_utils.dart';\nimport 'package:PiliPlus/utils/duration_utils.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:PiliPlus/utils/extension/size_ext.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:PiliPlus/utils/video_utils.dart';\nimport 'package:canvas_danmaku/canvas_danmaku.dart';\nimport 'package:easy_debounce/easy_throttle.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass LiveRoomController extends GetxController {\n  LiveRoomController(this.heroTag);\n  final String heroTag;\n\n  int roomId = Get.arguments;\n  int? ruid;\n  DanmakuController<DanmakuExtra>? danmakuController;\n  PlPlayerController plPlayerController = PlPlayerController.getInstance(\n    isLive: true,\n  );\n\n  RxBool isLoaded = false.obs;\n  Rx<RoomInfoH5Data?> roomInfoH5 = Rx<RoomInfoH5Data?>(null);\n\n  Rx<int?> liveTime = Rx<int?>(null);\n  Timer? liveTimeTimer;\n\n  void startLiveTimer() {\n    if (liveTime.value != null) {\n      liveTimeTimer ??= Timer.periodic(\n        const Duration(minutes: 5),\n        (_) => liveTime.refresh(),\n      );\n    }\n  }\n\n  void cancelLiveTimer() {\n    liveTimeTimer?.cancel();\n    liveTimeTimer = null;\n  }\n\n  Widget get timeWidget => Obx(() {\n    final liveTime = this.liveTime.value;\n    String text = '';\n    if (liveTime != null) {\n      final duration = DurationUtils.formatDurationBetween(\n        liveTime * 1000,\n        DateTime.now().millisecondsSinceEpoch,\n      );\n      text += duration.isEmpty ? '刚刚开播' : '开播$duration';\n    }\n    if (text.isEmpty) {\n      return const SizedBox.shrink();\n    }\n    return Text(\n      text,\n      style: const TextStyle(\n        fontSize: 12,\n        color: Colors.white,\n      ),\n    );\n  });\n\n  // dm\n  LiveDmInfoData? dmInfo;\n  List<RichTextItem>? savedDanmaku;\n  RxList<dynamic> messages = <dynamic>[].obs;\n  late final Rx<SuperChatItem?> fsSC = Rx<SuperChatItem?>(null);\n  late final RxList<SuperChatItem> superChatMsg = <SuperChatItem>[].obs;\n  RxBool disableAutoScroll = false.obs;\n  bool autoScroll = true;\n  LiveMessageStream? _msgStream;\n  late final ScrollController scrollController;\n  late final RxInt pageIndex = 0.obs;\n  PageController? pageController;\n\n  int? currentQn = PlatformUtils.isMobile ? null : Pref.liveQuality;\n  RxString currentQnDesc = ''.obs;\n  final RxBool isPortrait = false.obs;\n  late List<({int code, String desc})> acceptQnList = [];\n\n  late final bool isLogin;\n  late final int mid;\n\n  String? videoUrl;\n  bool? isPlaying;\n  late bool isFullScreen = false;\n\n  final superChatType = Pref.superChatType;\n  late final showSuperChat = superChatType != SuperChatType.disable;\n\n  final headerKey = GlobalKey<TimeBatteryMixin>();\n\n  final RxString title = ''.obs;\n\n  final RxnString onlineCount = RxnString();\n  Widget get onlineWidget => GestureDetector(\n    onTap: _showRank,\n    child: Obx(() {\n      if (onlineCount.value case final onlineCount?) {\n        return Text(\n          '高能观众($onlineCount)',\n          style: const TextStyle(\n            fontSize: 12,\n            color: Colors.white,\n          ),\n        );\n      }\n      return const SizedBox.shrink();\n    }),\n  );\n\n  void _showRank() {\n    if (ruid case final ruid?) {\n      final heightFactor =\n          PlatformUtils.isMobile && !Get.mediaQuery.size.isPortrait ? 1.0 : 0.7;\n      showModalBottomSheet(\n        context: Get.context!,\n        useSafeArea: true,\n        clipBehavior: .hardEdge,\n        isScrollControlled: true,\n        constraints: const BoxConstraints(maxWidth: 450),\n        builder: (context) => FractionallySizedBox(\n          widthFactor: 1.0,\n          heightFactor: heightFactor,\n          child: ContributionRankPanel(ruid: ruid, roomId: roomId),\n        ),\n      );\n    }\n  }\n\n  final RxnString watchedShow = RxnString();\n  Widget get watchedWidget => Obx(() {\n    if (watchedShow.value case final watchedShow?) {\n      return Text(\n        watchedShow,\n        style: const TextStyle(\n          fontSize: 12,\n          color: Colors.white,\n        ),\n      );\n    }\n    return const SizedBox.shrink();\n  });\n\n  @override\n  void onInit() {\n    super.onInit();\n    scrollController = ScrollController()..addListener(listener);\n    final account = Accounts.main;\n    isLogin = account.isLogin;\n    mid = account.mid;\n    queryLiveUrl(autoFullScreenFlag: true);\n    queryLiveInfoH5();\n    if (Accounts.heartbeat.isLogin && !Pref.historyPause) {\n      VideoHttp.roomEntryAction(roomId: roomId);\n    }\n    if (showSuperChat) {\n      pageController = PageController();\n    }\n  }\n\n  Future<void>? playerInit({\n    bool autoplay = true,\n    bool autoFullScreenFlag = false,\n  }) {\n    if (videoUrl == null) {\n      return null;\n    }\n    return plPlayerController.setDataSource(\n      NetworkSource(videoSource: videoUrl!, audioSource: null),\n      isLive: true,\n      autoplay: autoplay,\n      isVertical: isPortrait.value,\n      autoFullScreenFlag: autoFullScreenFlag,\n    );\n  }\n\n  Future<void> queryLiveUrl({bool autoFullScreenFlag = false}) async {\n    currentQn ??= await Utils.isWiFi\n        ? Pref.liveQuality\n        : Pref.liveQualityCellular;\n    final res = await LiveHttp.liveRoomInfo(\n      roomId: roomId,\n      qn: currentQn,\n      onlyAudio: plPlayerController.onlyPlayAudio.value,\n    );\n    if (res case Success(:final response)) {\n      if (response.liveStatus != 1) {\n        _showDialog('当前直播间未开播');\n        return;\n      }\n      if (response.playurlInfo?.playurl == null) {\n        _showDialog('无法获取播放地址');\n        return;\n      }\n      ruid = response.uid;\n      if (response.roomId != null) {\n        roomId = response.roomId!;\n      }\n      liveTime.value = response.liveTime;\n      startLiveTimer();\n      isPortrait.value = response.isPortrait ?? false;\n      List<CodecItem> codec =\n          response.playurlInfo!.playurl!.stream!.first.format!.first.codec!;\n      CodecItem item = codec.first;\n      // 以服务端返回的码率为准\n      currentQn = item.currentQn!;\n      acceptQnList = item.acceptQn!.map((e) {\n        return (\n          code: e,\n          desc: LiveQuality.fromCode(e)?.desc ?? e.toString(),\n        );\n      }).toList();\n      currentQnDesc.value =\n          LiveQuality.fromCode(currentQn)?.desc ?? currentQn.toString();\n      videoUrl = VideoUtils.getLiveCdnUrl(item);\n      await playerInit(autoFullScreenFlag: autoFullScreenFlag);\n      isLoaded.value = true;\n    } else {\n      _showDialog(res.toString());\n    }\n  }\n\n  Future<void> queryLiveInfoH5() async {\n    final res = await LiveHttp.liveRoomInfoH5(roomId: roomId);\n    if (res case Success(:final response)) {\n      roomInfoH5.value = response;\n      title.value = response.roomInfo?.title ?? '';\n      watchedShow.value = response.watchedShow?.textLarge;\n      videoPlayerServiceHandler?.onVideoDetailChange(response, roomId, heroTag);\n    } else {\n      res.toast();\n    }\n  }\n\n  void _showDialog(String title) {\n    showDialog(\n      context: Get.context!,\n      builder: (_) => AlertDialog(\n        title: Text(title),\n        actions: [\n          TextButton(\n            onPressed: Get.back,\n            child: Text(\n              '关闭',\n              style: TextStyle(color: Get.theme.colorScheme.outline),\n            ),\n          ),\n          TextButton(\n            onPressed: () {\n              if (plPlayerController.isDesktopPip) {\n                plPlayerController.exitDesktopPip();\n              }\n              Get\n                ..back()\n                ..back();\n            },\n            child: const Text('退出'),\n          ),\n        ],\n      ),\n    );\n  }\n\n  void scrollToBottom([_]) {\n    EasyThrottle.throttle(\n      'liveDm',\n      const Duration(milliseconds: 500),\n      () => WidgetsBinding.instance.addPostFrameCallback(\n        _scrollToBottom,\n      ),\n    );\n  }\n\n  void _scrollToBottom([_]) {\n    if (scrollController.hasClients) {\n      scrollController.animateTo(\n        scrollController.position.maxScrollExtent,\n        duration: const Duration(milliseconds: 500),\n        curve: Curves.linearToEaseOut,\n      );\n    }\n  }\n\n  void jumpToBottom() {\n    if (scrollController.hasClients) {\n      scrollController.jumpTo(scrollController.position.maxScrollExtent);\n    }\n  }\n\n  void closeLiveMsg() {\n    _msgStream?.close();\n    _msgStream = null;\n  }\n\n  @pragma('vm:notify-debugger-on-exception')\n  Future<void> prefetch() async {\n    final res = await LiveHttp.liveRoomDmPrefetch(roomId: roomId);\n    if (res case Success(:final response)) {\n      if (response != null && response.isNotEmpty) {\n        messages.addAll(response);\n        scrollToBottom();\n      }\n    }\n  }\n\n  Future<void> getSuperChatMsg() async {\n    final res = await LiveHttp.superChatMsg(roomId);\n    if (res.dataOrNull?.list case final list?) {\n      superChatMsg.addAll(list);\n    }\n  }\n\n  void clearSC() {\n    superChatMsg.removeWhere((e) => e.expired);\n  }\n\n  void startLiveMsg() {\n    if (messages.isEmpty) {\n      prefetch();\n      if (showSuperChat) {\n        getSuperChatMsg();\n      }\n    }\n    if (_msgStream != null) {\n      return;\n    }\n    if (dmInfo != null) {\n      initDm(dmInfo!);\n      return;\n    }\n    LiveHttp.liveRoomGetDanmakuToken(roomId: roomId).then((res) {\n      if (res case Success(:final response)) {\n        initDm(dmInfo = response);\n      }\n    });\n  }\n\n  void listener() {\n    final userScrollDirection = scrollController.position.userScrollDirection;\n    if (userScrollDirection == .forward) {\n      disableAutoScroll.value = true;\n    } else if (userScrollDirection == .reverse) {\n      final pos = scrollController.position;\n      if (pos.maxScrollExtent - pos.pixels <= 100) {\n        disableAutoScroll.value = false;\n      }\n    }\n  }\n\n  @override\n  void onClose() {\n    closeLiveMsg();\n    cancelLikeTimer();\n    cancelLiveTimer();\n    savedDanmaku?.clear();\n    savedDanmaku = null;\n    messages.clear();\n    if (showSuperChat) {\n      superChatMsg.clear();\n      fsSC.value = null;\n    }\n    scrollController\n      ..removeListener(listener)\n      ..dispose();\n    pageController?.dispose();\n    danmakuController = null;\n    super.onClose();\n  }\n\n  // 修改画质\n  Future<void>? changeQn(int qn) {\n    if (currentQn == qn) {\n      return null;\n    }\n    currentQn = qn;\n    currentQnDesc.value =\n        LiveQuality.fromCode(currentQn)?.desc ?? currentQn.toString();\n    return queryLiveUrl();\n  }\n\n  void initDm(LiveDmInfoData info) {\n    if (info.hostList.isNullOrEmpty) {\n      return;\n    }\n    _msgStream =\n        LiveMessageStream(\n            streamToken: info.token!,\n            roomId: roomId,\n            uid: Accounts.heartbeat.mid,\n            servers: info.hostList!\n                .map((host) => 'wss://${host.host}:${host.wssPort}/sub')\n                .toList(),\n          )\n          ..addEventListener(_danmakuListener)\n          ..init();\n  }\n\n  void addDm(dynamic msg, [DanmakuContentItem<DanmakuExtra>? item]) {\n    if (plPlayerController.showDanmaku) {\n      if (item != null) {\n        danmakuController?.addDanmaku(item);\n      }\n      if (autoScroll && !disableAutoScroll.value) {\n        messages.add(msg);\n        scrollToBottom();\n        return;\n      }\n    }\n\n    messages.addOnly(msg);\n  }\n\n  @pragma('vm:notify-debugger-on-exception')\n  void _danmakuListener(dynamic obj) {\n    try {\n      // logger.i(' 原始弹幕消息 ======> ${jsonEncode(obj)}');\n      switch (obj['cmd']) {\n        case 'DANMU_MSG':\n          final info = obj['info'];\n          final first = info[0];\n          final content = first[15];\n          final Map<String, dynamic> extra = jsonDecode(content['extra']);\n          final user = content['user'];\n          // final midHash = first[7];\n          final uid = user['uid'];\n          final name = user['base']['name'];\n          final msg = info[1];\n          BaseEmote? uemote;\n          if (first[13] case Map<String, dynamic> map) {\n            uemote = BaseEmote.fromJson(map);\n          }\n          final checkInfo = info[9];\n          final liveExtra = LiveDanmaku(\n            id: extra['id_str'],\n            mid: uid,\n            dmType: extra['dm_type'],\n            ts: checkInfo['ts'],\n            ct: checkInfo['ct'],\n          );\n          Owner? reply;\n          final replyMid = extra['reply_mid'];\n          if (replyMid != null && replyMid != 0) {\n            reply = Owner(\n              mid: replyMid,\n              name: extra['reply_uname'],\n            );\n          }\n          addDm(\n            DanmakuMsg(\n              name: name,\n              text: msg,\n              emots: (extra['emots'] as Map<String, dynamic>?)?.map(\n                (k, v) => MapEntry(k, BaseEmote.fromJson(v)),\n              ),\n              uemote: uemote,\n              extra: liveExtra,\n              reply: reply,\n            ),\n            DanmakuContentItem(\n              msg,\n              color: DanmakuOptions.blockColorful\n                  ? Colors.white\n                  : DmUtils.decimalToColor(extra['color']),\n              type: DmUtils.getPosition(extra['mode']),\n              // extra['send_from_me'] is invalid\n              selfSend: isLogin && uid == mid,\n              extra: liveExtra,\n            ),\n          );\n          break;\n        case 'SUPER_CHAT_MESSAGE' when showSuperChat:\n          final item = SuperChatItem.fromJson(obj['data']);\n          superChatMsg.insert(0, item);\n          if (isFullScreen || plPlayerController.isDesktopPip) {\n            fsSC.value = item.copyWith(\n              endTime: DateTime.now().millisecondsSinceEpoch ~/ 1000 + 10,\n            );\n          }\n          addDm(item);\n          break;\n        case 'SUPER_CHAT_MESSAGE_DELETE' when showSuperChat:\n          if (obj['roomid'] == roomId) {\n            final ids = obj['data']?['ids'] as List?;\n            if (ids != null && ids.isNotEmpty) {\n              if (superChatType == .valid) {\n                superChatMsg.removeWhere((e) => ids.contains(e.id));\n              } else {\n                bool? refresh;\n                for (final id in ids) {\n                  if (superChatMsg.firstWhereOrNull((e) => e.id == id)\n                      case final item?) {\n                    item.deleted = true;\n                    refresh ??= true;\n                  }\n                }\n                if (refresh ?? false) {\n                  superChatMsg.refresh();\n                }\n              }\n            }\n          }\n        case 'WATCHED_CHANGE':\n          watchedShow.value = obj['data']['text_large'];\n          break;\n        case 'ONLINE_RANK_COUNT':\n          onlineCount.value = NumUtils.numFormat(obj['data']['count']);\n          break;\n        case 'ROOM_CHANGE':\n          title.value = obj['data']['title'];\n          break;\n      }\n    } catch (_) {}\n  }\n\n  final RxInt likeClickTime = 0.obs;\n  Timer? likeClickTimer;\n\n  void cancelLikeTimer() {\n    likeClickTimer?.cancel();\n    likeClickTimer = null;\n  }\n\n  void onLikeTapDown([_]) {\n    cancelLikeTimer();\n    likeClickTime.value++;\n  }\n\n  void onLikeTapUp([_]) {\n    likeClickTimer ??= Timer(\n      const Duration(milliseconds: 800),\n      onLike,\n    );\n  }\n\n  Future<void> onLike() async {\n    if (!isLogin) {\n      likeClickTime.value = 0;\n      return;\n    }\n    final res = await LiveHttp.liveLikeReport(\n      clickTime: likeClickTime.value,\n      roomId: roomId,\n      uid: mid,\n      anchorId: roomInfoH5.value?.roomInfo?.uid,\n    );\n    if (res.isSuccess) {\n      SmartDialog.showToast('点赞成功');\n    } else {\n      res.toast();\n    }\n    likeClickTime.value = 0;\n  }\n\n  void onSendDanmaku([bool fromEmote = false]) {\n    if (!isLogin) {\n      SmartDialog.showToast('账号未登录');\n      return;\n    }\n    Get.key.currentState!.push(\n      PublishRoute(\n        pageBuilder: (context, animation, secondaryAnimation) {\n          return LiveSendDmPanel(\n            fromEmote: fromEmote,\n            liveRoomController: this,\n            items: savedDanmaku,\n            autofocus: !fromEmote,\n            onSave: (msg) {\n              if (msg.isEmpty) {\n                savedDanmaku?.clear();\n                savedDanmaku = null;\n              } else {\n                savedDanmaku = msg.toList();\n              }\n            },\n          );\n        },\n        transitionDuration: fromEmote\n            ? const Duration(milliseconds: 400)\n            : const Duration(milliseconds: 500),\n      ),\n    );\n  }\n\n  void reportSC(SuperChatItem item) {\n    if (!isLogin) {\n      SmartDialog.showToast('账号未登录');\n      return;\n    }\n    autoWrapReportDialog(\n      Get.context!,\n      ban: false,\n      ReportOptions.liveDanmakuReport,\n      (reasonType, reasonDesc, banUid) {\n        return LiveHttp.superChatReport(\n          id: item.id,\n          roomId: roomId,\n          uid: item.uid,\n          msg: item.message,\n          reason: ReportOptions.liveDanmakuReport['']![reasonType]!,\n          ts: item.ts,\n          token: item.token,\n        );\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/live_room/send_danmaku/view.dart",
    "content": "import 'dart:async';\n\nimport 'package:PiliPlus/common/widgets/flutter/text_field/text_field.dart';\nimport 'package:PiliPlus/common/widgets/view_safe_area.dart';\nimport 'package:PiliPlus/http/live.dart';\nimport 'package:PiliPlus/models/common/publish_panel_type.dart';\nimport 'package:PiliPlus/pages/common/publish/common_rich_text_pub_page.dart';\nimport 'package:PiliPlus/pages/live_emote/controller.dart';\nimport 'package:PiliPlus/pages/live_emote/view.dart';\nimport 'package:PiliPlus/pages/live_room/controller.dart';\nimport 'package:flutter/material.dart' hide TextField;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass LiveSendDmPanel extends CommonRichTextPubPage {\n  final bool fromEmote;\n  final LiveRoomController liveRoomController;\n\n  const LiveSendDmPanel({\n    super.key,\n    super.items,\n    super.onSave,\n    super.autofocus = true,\n    this.fromEmote = false,\n    required this.liveRoomController,\n  });\n\n  @override\n  State<LiveSendDmPanel> createState() => _ReplyPageState();\n}\n\nclass _ReplyPageState extends CommonRichTextPubPageState<LiveSendDmPanel> {\n  LiveRoomController get liveRoomController => widget.liveRoomController;\n\n  @override\n  void initState() {\n    super.initState();\n    if (widget.fromEmote) {\n      updatePanelType(PanelType.emoji);\n    }\n  }\n\n  @override\n  void dispose() {\n    Get.delete<LiveEmotePanelController>(\n      tag: liveRoomController.roomId.toString(),\n    );\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    return ViewSafeArea(\n      child: Align(\n        alignment: Alignment.bottomCenter,\n        child: Container(\n          constraints: const BoxConstraints(maxWidth: 640),\n          decoration: BoxDecoration(\n            borderRadius: const BorderRadius.vertical(top: Radius.circular(12)),\n            color: theme.colorScheme.surface,\n          ),\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              ...buildInputView(theme),\n              Flexible(child: buildPanelContainer(theme, Colors.transparent)),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  @override\n  Widget? get customPanel => LiveEmotePanel(\n    onChoose: onChooseEmote,\n    roomId: liveRoomController.roomId,\n    onSendEmoticonUnique: (emote) {\n      onCustomPublish(\n        message: emote.emoticonUnique!,\n        dmType: 1,\n        emoticonOptions: '[object Object]',\n      );\n    },\n  );\n\n  List<Widget> buildInputView(ThemeData theme) {\n    return [\n      Padding(\n        padding: const EdgeInsets.only(\n          top: 12,\n          right: 15,\n          left: 15,\n          bottom: 10,\n        ),\n        child: Listener(\n          onPointerUp: (event) {\n            if (readOnly.value) {\n              updatePanelType(PanelType.keyboard);\n            }\n          },\n          child: Obx(\n            () => RichTextField(\n              key: key,\n              controller: editController,\n              minLines: 1,\n              maxLines: 2,\n              autofocus: false,\n              readOnly: readOnly.value,\n              onChanged: onChanged,\n              onSubmitted: onSubmitted,\n              focusNode: focusNode,\n              decoration: const InputDecoration(\n                hintText: \"输入弹幕内容\",\n                border: InputBorder.none,\n                hintStyle: TextStyle(fontSize: 14),\n              ),\n              style: theme.textTheme.bodyLarge,\n              // inputFormatters: [LengthLimitingTextInputFormatter(20)],\n            ),\n          ),\n        ),\n      ),\n      Divider(\n        height: 1,\n        color: theme.dividerColor.withValues(alpha: 0.1),\n      ),\n      Container(\n        height: 52,\n        padding: const .symmetric(horizontal: 12),\n        child: Row(\n          mainAxisAlignment: .spaceBetween,\n          children: [\n            emojiBtn,\n            Obx(\n              () => FilledButton.tonal(\n                onPressed: enablePublish.value ? onPublish : null,\n                style: FilledButton.styleFrom(\n                  visualDensity: .compact,\n                  padding: const .symmetric(horizontal: 20, vertical: 10),\n                ),\n                child: const Text('发送'),\n              ),\n            ),\n          ],\n        ),\n      ),\n    ];\n  }\n\n  @override\n  Future<void> onCustomPublish({\n    String? message,\n    List? pictures,\n    int? dmType,\n    emoticonOptions,\n  }) async {\n    int replyMid = 0;\n    String replyDmid = '';\n    if (message == null) {\n      final buffer = StringBuffer();\n      for (final e in editController.items) {\n        if (e.type == .at) {\n          replyMid = int.parse(e.rawText);\n          replyDmid = e.id!;\n        } else {\n          buffer.write(e.rawText);\n        }\n      }\n      message = buffer.toString();\n    }\n    final res = await LiveHttp.sendLiveMsg(\n      roomId: liveRoomController.roomId,\n      msg: message,\n      dmType: dmType,\n      emoticonOptions: emoticonOptions,\n      replyMid: replyMid,\n      replayDmid: replyDmid,\n    );\n    if (res.isSuccess) {\n      hasPub = true;\n      Get.back();\n      liveRoomController\n        ..savedDanmaku?.clear()\n        ..savedDanmaku = null;\n      SmartDialog.showToast('发送成功');\n    } else {\n      res.toast();\n    }\n  }\n\n  @override\n  Future<void>? onMention([bool fromClick = false]) => null;\n}\n"
  },
  {
    "path": "lib/pages/live_room/superchat/superchat_card.dart",
    "content": "import 'dart:async';\n\nimport 'package:PiliPlus/common/widgets/flutter/selectable_text/selection_area.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models_new/live/live_superchat/item.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart' hide SelectionArea;\nimport 'package:get/get.dart';\n\nclass SuperChatCard extends StatefulWidget {\n  const SuperChatCard({\n    super.key,\n    required this.item,\n    this.onRemove,\n    this.persistentSC = false,\n    required this.onReport,\n  });\n\n  final SuperChatItem item;\n  final VoidCallback? onRemove;\n  final bool persistentSC;\n  final VoidCallback onReport;\n\n  @override\n  State<SuperChatCard> createState() => _SuperChatCardState();\n}\n\nclass _SuperChatCardState extends State<SuperChatCard> {\n  Timer? _timer;\n  RxInt? _remains;\n\n  @override\n  void initState() {\n    super.initState();\n    if (!widget.persistentSC) {\n      if (widget.item.expired) {\n        _remove();\n        return;\n      }\n      final now = DateTime.now().millisecondsSinceEpoch ~/ 1000;\n      final offset = widget.item.endTime - now;\n      if (offset > 0) {\n        _remains = offset.obs;\n        _startTimer();\n      } else {\n        _remove();\n      }\n    }\n  }\n\n  void _remove() {\n    WidgetsBinding.instance.addPostFrameCallback((_) {\n      Future.delayed(const Duration(seconds: 1), _onRemove);\n    });\n  }\n\n  void _onRemove() {\n    widget\n      ..item.expired = true\n      ..onRemove?.call();\n  }\n\n  void _callback(_) {\n    final remains = _remains!.value;\n    if (remains > 0) {\n      _remains!.value = remains - 1;\n    } else {\n      _cancelTimer();\n      _onRemove();\n    }\n  }\n\n  void _startTimer() {\n    _timer = Timer.periodic(const Duration(seconds: 1), _callback);\n  }\n\n  void _cancelTimer() {\n    _timer?.cancel();\n    _timer = null;\n  }\n\n  @override\n  void dispose() {\n    _cancelTimer();\n    super.dispose();\n  }\n\n  void _showMenu(Offset offset, SuperChatItem item) {\n    final flag = _timer != null;\n    if (flag) {\n      _cancelTimer();\n    }\n    showMenu(\n      context: context,\n      position: PageUtils.menuPosition(offset),\n      items: [\n        PopupMenuItem(\n          height: 38,\n          onTap: () => Get.toNamed('/member?mid=${item.uid}'),\n          child: Text(\n            '访问: ${item.userInfo.uname}',\n            style: const TextStyle(fontSize: 13),\n          ),\n        ),\n        PopupMenuItem(\n          height: 38,\n          onTap: () => Utils.copyText(Utils.jsonEncoder.convert(item.toJson())),\n          child: const Text(\n            '复制 SC 信息',\n            style: TextStyle(fontSize: 13),\n          ),\n        ),\n        PopupMenuItem(\n          height: 38,\n          onTap: widget.onReport,\n          child: const Text(\n            '举报',\n            style: TextStyle(fontSize: 13),\n          ),\n        ),\n      ],\n    ).whenComplete(() {\n      if (flag && mounted) {\n        _startTimer();\n      }\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final item = widget.item;\n    final bottomColor = Utils.parseColor(item.backgroundBottomColor);\n    final border = BorderSide(color: bottomColor);\n    void showMenu(TapUpDetails e) => _showMenu(e.globalPosition, item);\n    return Column(\n      crossAxisAlignment: CrossAxisAlignment.stretch,\n      children: [\n        GestureDetector(\n          onTapUp: showMenu,\n          onSecondaryTapUp: PlatformUtils.isDesktop ? showMenu : null,\n          child: Container(\n            decoration: BoxDecoration(\n              borderRadius: const .vertical(top: .circular(8)),\n              color: Utils.parseColor(item.backgroundColor),\n              border: Border(top: border, left: border, right: border),\n            ),\n            padding: const EdgeInsets.all(8),\n            child: Row(\n              spacing: 12,\n              children: [\n                NetworkImgLayer(\n                  src: item.userInfo.face,\n                  width: 45,\n                  height: 45,\n                  type: ImageType.avatar,\n                ),\n                Expanded(\n                  child: Column(\n                    mainAxisSize: .min,\n                    crossAxisAlignment: .start,\n                    children: [\n                      Text(\n                        item.userInfo.uname,\n                        style: TextStyle(\n                          color: Utils.parseColor(item.userInfo.nameColor),\n                        ),\n                      ),\n                      Text(\n                        \"￥${item.price}\",\n                        style: TextStyle(\n                          color: Utils.parseColor(item.backgroundPriceColor),\n                        ),\n                      ),\n                    ],\n                  ),\n                ),\n                if (_remains != null)\n                  Obx(\n                    () => Text(\n                      _remains.toString(),\n                      style: const TextStyle(\n                        fontSize: 14,\n                        color: Colors.grey,\n                      ),\n                    ),\n                  ),\n              ],\n            ),\n          ),\n        ),\n        Container(\n          decoration: BoxDecoration(\n            borderRadius: const .vertical(bottom: .circular(8)),\n            color: bottomColor,\n          ),\n          padding: const EdgeInsets.all(8),\n          child: SelectionArea(\n            child: Text(\n              item.message,\n              style: TextStyle(\n                color: Utils.parseColor(item.messageFontColor),\n                decoration: widget.persistentSC && item.deleted\n                    ? .lineThrough\n                    : null,\n                decorationThickness: 1.5,\n                decorationStyle: .double,\n                decorationColor: Colors.white,\n              ),\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/live_room/superchat/superchat_panel.dart",
    "content": "import 'package:PiliPlus/models/common/super_chat_type.dart';\nimport 'package:PiliPlus/pages/live_room/controller.dart';\nimport 'package:PiliPlus/pages/live_room/superchat/superchat_card.dart';\nimport 'package:PiliPlus/pages/search/controller.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get_state_manager/src/rx_flutter/rx_obx_widget.dart';\n\nclass SuperChatPanel extends StatefulWidget {\n  const SuperChatPanel({\n    super.key,\n    required this.controller,\n  });\n\n  final LiveRoomController controller;\n\n  @override\n  State<SuperChatPanel> createState() => _SuperChatPanelState();\n}\n\nclass _SuperChatPanelState extends DebounceStreamState<SuperChatPanel, bool>\n    with AutomaticKeepAliveClientMixin {\n  @override\n  Duration get duration => const Duration(milliseconds: 300);\n\n  late final persistentSC =\n      widget.controller.superChatType == SuperChatType.persist;\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    return Obx(\n      () => ListView.separated(\n        key: const PageStorageKey(_SuperChatPanelState),\n        padding: const EdgeInsets.symmetric(horizontal: 12),\n        physics: const ClampingScrollPhysics(),\n        itemCount: widget.controller.superChatMsg.length,\n        findItemIndexCallback: (key) {\n          final index = widget.controller.superChatMsg.indexWhere(\n            (i) => i.id == (key as ValueKey<int>).value,\n          );\n          // Return item index directly - no need to multiply by 2.\n          return index == -1 ? null : index;\n        },\n        itemBuilder: (context, index) {\n          final item = widget.controller.superChatMsg[index];\n          return SuperChatCard(\n            key: ValueKey(item.id),\n            item: item,\n            onRemove: () => ctr?.add(true),\n            persistentSC: persistentSC,\n            onReport: () => widget.controller.reportSC(item),\n          );\n        },\n        separatorBuilder: (_, _) => const SizedBox(height: 8),\n      ),\n    );\n  }\n\n  @override\n  void onValueChanged(value) => widget.controller.clearSC();\n\n  @override\n  bool get wantKeepAlive => true;\n}\n"
  },
  {
    "path": "lib/pages/live_room/view.dart",
    "content": "import 'dart:io';\nimport 'dart:math';\nimport 'dart:ui';\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/custom_icon.dart';\nimport 'package:PiliPlus/common/widgets/flutter/page/page_view.dart';\nimport 'package:PiliPlus/common/widgets/flutter/pop_scope.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text_field/controller.dart';\nimport 'package:PiliPlus/common/widgets/gesture/horizontal_drag_gesture_recognizer.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/keep_alive_wrapper.dart';\nimport 'package:PiliPlus/common/widgets/route_aware_mixin.dart';\nimport 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models/common/live/live_contribution_rank_type.dart';\nimport 'package:PiliPlus/models_new/live/live_room_info_h5/data.dart';\nimport 'package:PiliPlus/models_new/live/live_superchat/item.dart';\nimport 'package:PiliPlus/pages/danmaku/danmaku_model.dart';\nimport 'package:PiliPlus/pages/live_room/contribution_rank/controller.dart';\nimport 'package:PiliPlus/pages/live_room/controller.dart';\nimport 'package:PiliPlus/pages/live_room/superchat/superchat_card.dart';\nimport 'package:PiliPlus/pages/live_room/superchat/superchat_panel.dart';\nimport 'package:PiliPlus/pages/live_room/widgets/bottom_control.dart';\nimport 'package:PiliPlus/pages/live_room/widgets/chat_panel.dart';\nimport 'package:PiliPlus/pages/live_room/widgets/header_control.dart';\nimport 'package:PiliPlus/pages/video/widgets/player_focus.dart';\nimport 'package:PiliPlus/plugin/pl_player/controller.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/play_status.dart';\nimport 'package:PiliPlus/plugin/pl_player/utils/danmaku_options.dart';\nimport 'package:PiliPlus/plugin/pl_player/utils/fullscreen.dart';\nimport 'package:PiliPlus/plugin/pl_player/view/view.dart';\nimport 'package:PiliPlus/services/service_locator.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/extension/size_ext.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/image_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:cached_network_image/cached_network_image.dart';\nimport 'package:canvas_danmaku/canvas_danmaku.dart';\nimport 'package:floating/floating.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart' hide PageView;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:screen_brightness_platform_interface/screen_brightness_platform_interface.dart';\n\nclass LiveRoomPage extends StatefulWidget {\n  const LiveRoomPage({super.key});\n\n  @override\n  State<LiveRoomPage> createState() => _LiveRoomPageState();\n}\n\nclass _LiveRoomPageState extends State<LiveRoomPage>\n    with WidgetsBindingObserver, RouteAware, RouteAwareMixin {\n  final String heroTag = Utils.generateRandomString(6);\n  late final LiveRoomController _liveRoomController;\n  late final PlPlayerController plPlayerController;\n  bool get isFullScreen => plPlayerController.isFullScreen.value;\n\n  late final GlobalKey pageKey = GlobalKey();\n  late final GlobalKey chatKey = GlobalKey();\n  late final GlobalKey scKey = GlobalKey();\n  late final GlobalKey playerKey = GlobalKey();\n\n  @override\n  void initState() {\n    super.initState();\n    WidgetsBinding.instance.addObserver(this);\n    _liveRoomController = Get.put(\n      LiveRoomController(heroTag),\n      tag: heroTag,\n    );\n    plPlayerController = _liveRoomController.plPlayerController\n      ..addStatusLister(playerListener);\n    PlPlayerController.setPlayCallBack(plPlayerController.play);\n  }\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    padding = MediaQuery.viewPaddingOf(context);\n    final size = MediaQuery.sizeOf(context);\n    maxWidth = size.width;\n    maxHeight = size.height;\n    isPortrait = size.isPortrait;\n  }\n\n  @override\n  Future<void> didPopNext() async {\n    WidgetsBinding.instance.addObserver(this);\n    plPlayerController\n      ..isLive = true\n      ..danmakuController = _liveRoomController.danmakuController;\n    PlPlayerController.setPlayCallBack(plPlayerController.play);\n    _liveRoomController.startLiveTimer();\n    if (plPlayerController.playerStatus.isPlaying &&\n        plPlayerController.cid == null) {\n      _liveRoomController\n        ..danmakuController?.resume()\n        ..startLiveMsg();\n    } else {\n      final shouldPlay = _liveRoomController.isPlaying ?? false;\n      if (shouldPlay) {\n        _liveRoomController\n          ..danmakuController?.resume()\n          ..startLiveMsg();\n      }\n      await _liveRoomController.playerInit(autoplay: shouldPlay);\n    }\n    if (!mounted) return;\n    plPlayerController.addStatusLister(playerListener);\n    super.didPopNext();\n  }\n\n  @override\n  void didPushNext() {\n    WidgetsBinding.instance.removeObserver(this);\n    plPlayerController.removeStatusLister(playerListener);\n    _liveRoomController\n      ..danmakuController?.clear()\n      ..danmakuController?.pause()\n      ..cancelLiveTimer()\n      ..closeLiveMsg()\n      ..isPlaying = plPlayerController.playerStatus.isPlaying;\n    super.didPushNext();\n  }\n\n  void playerListener(PlayerStatus status) {\n    if (status.isPlaying) {\n      _liveRoomController\n        ..danmakuController?.resume()\n        ..startLiveTimer()\n        ..startLiveMsg();\n    } else {\n      _liveRoomController\n        ..danmakuController?.pause()\n        ..cancelLiveTimer()\n        ..closeLiveMsg();\n    }\n  }\n\n  @override\n  void dispose() {\n    videoPlayerServiceHandler?.onVideoDetailDispose(heroTag);\n    WidgetsBinding.instance.removeObserver(this);\n    if (Platform.isAndroid && !plPlayerController.setSystemBrightness) {\n      ScreenBrightnessPlatform.instance.resetApplicationScreenBrightness();\n    }\n    PlPlayerController.setPlayCallBack(null);\n    plPlayerController\n      ..removeStatusLister(playerListener)\n      ..dispose();\n    for (final e in LiveContributionRankType.values) {\n      Get.delete<ContributionRankController>(\n        tag: '${_liveRoomController.roomId}${e.name}',\n      );\n    }\n    super.dispose();\n  }\n\n  @override\n  void didChangeAppLifecycleState(AppLifecycleState state) {\n    if (state == AppLifecycleState.resumed) {\n      if (!plPlayerController.showDanmaku) {\n        _liveRoomController.startLiveTimer();\n        plPlayerController.showDanmaku = true;\n        if (isFullScreen && Platform.isIOS) {\n          WidgetsBinding.instance.addPostFrameCallback((_) {\n            if (!_liveRoomController.isPortrait.value) {\n              landscape();\n            }\n          });\n        }\n      }\n    } else if (state == AppLifecycleState.paused) {\n      _liveRoomController.cancelLiveTimer();\n      plPlayerController\n        ..showDanmaku = false\n        ..danmakuController?.clear();\n    }\n  }\n\n  late double maxWidth;\n  late double maxHeight;\n  late EdgeInsets padding;\n  late bool isPortrait;\n\n  @override\n  Widget build(BuildContext context) {\n    Widget child;\n    if (Platform.isAndroid && Floating().isPipMode) {\n      child = videoPlayerPanel(\n        isFullScreen,\n        width: maxWidth,\n        height: maxHeight,\n        isPipMode: true,\n        needDm: !plPlayerController.pipNoDanmaku,\n      );\n    } else {\n      child = childWhenDisabled;\n    }\n    if (plPlayerController.keyboardControl) {\n      child = PlayerFocus(\n        plPlayerController: plPlayerController,\n        onSendDanmaku: _liveRoomController.onSendDanmaku,\n        onRefresh: _liveRoomController.queryLiveUrl,\n        child: child,\n      );\n    }\n    return child;\n  }\n\n  Widget videoPlayerPanel(\n    bool isFullScreen, {\n    required double width,\n    required double height,\n    bool isPipMode = false,\n    Color fill = Colors.black,\n    Alignment alignment = Alignment.center,\n    bool needDm = true,\n  }) {\n    if (!plPlayerController.isLive) {\n      return const SizedBox.shrink();\n    }\n    if (!isFullScreen && !plPlayerController.isDesktopPip) {\n      _liveRoomController.fsSC.value = null;\n    }\n    _liveRoomController.isFullScreen = isFullScreen;\n    Widget player = Obx(\n      key: playerKey,\n      () {\n        if (_liveRoomController.isLoaded.value) {\n          final roomInfoH5 = _liveRoomController.roomInfoH5.value;\n          return PLVideoPlayer(\n            maxWidth: width,\n            maxHeight: height,\n            fill: fill,\n            alignment: alignment,\n            plPlayerController: plPlayerController,\n            headerControl: LiveHeaderControl(\n              key: _liveRoomController.headerKey,\n              title: roomInfoH5?.roomInfo?.title,\n              upName: roomInfoH5?.anchorInfo?.baseInfo?.uname,\n              plPlayerController: plPlayerController,\n              onSendDanmaku: _liveRoomController.onSendDanmaku,\n              onPlayAudio: _liveRoomController.queryLiveUrl,\n              isPortrait: isPortrait,\n              liveController: _liveRoomController,\n            ),\n            bottomControl: BottomControl(\n              plPlayerController: plPlayerController,\n              liveRoomCtr: _liveRoomController,\n              onRefresh: _liveRoomController.queryLiveUrl,\n            ),\n            danmuWidget: !needDm\n                ? null\n                : LiveDanmaku(\n                    liveRoomController: _liveRoomController,\n                    plPlayerController: plPlayerController,\n                    isFullScreen: isFullScreen,\n                    isPipMode: plPlayerController.isDesktopPip || isPipMode,\n                    size: Size(width, height),\n                  ),\n          );\n        }\n        return const SizedBox.shrink();\n      },\n    );\n    if (_liveRoomController.showSuperChat &&\n        (isFullScreen || plPlayerController.isDesktopPip)) {\n      player = Stack(\n        clipBehavior: Clip.none,\n        children: [\n          Positioned.fill(child: player),\n          if (kDebugMode) ...[\n            Positioned(\n              top: 50,\n              right: 0,\n              child: TextButton(\n                onPressed: () {\n                  final item = SuperChatItem.random;\n                  _liveRoomController\n                    ..fsSC.value = item\n                    ..addDm(item);\n                },\n                child: const Text('add superchat'),\n              ),\n            ),\n            Positioned(\n              right: 0,\n              top: 90,\n              child: TextButton(\n                onPressed: () {\n                  _liveRoomController.fsSC.value = null;\n                },\n                child: const Text('remove superchat'),\n              ),\n            ),\n          ],\n          Positioned(\n            left: padding.left + 25,\n            bottom: 25,\n            width: 255,\n            child: Obx(() {\n              final item = _liveRoomController.fsSC.value;\n              if (item == null) {\n                return const SizedBox.shrink();\n              }\n              try {\n                return Stack(\n                  key: ValueKey(item.id),\n                  clipBehavior: Clip.none,\n                  children: [\n                    Padding(\n                      padding: const EdgeInsets.only(right: 6, top: 6),\n                      child: SuperChatCard(\n                        item: item,\n                        onRemove: () => _liveRoomController.fsSC.value = null,\n                        onReport: () => _liveRoomController.reportSC(item),\n                      ),\n                    ),\n                    Positioned(\n                      right: 0,\n                      top: 0,\n                      child: iconButton(\n                        size: 24,\n                        iconSize: 14,\n                        bgColor: const Color(0xEEFFFFFF),\n                        iconColor: Colors.black54,\n                        icon: const Icon(Icons.clear),\n                        onPressed: () => _liveRoomController.fsSC.value = null,\n                      ),\n                    ),\n                  ],\n                );\n              } catch (_) {\n                if (kDebugMode) rethrow;\n                return const SizedBox.shrink();\n              }\n            }),\n          ),\n        ],\n      );\n    }\n    return popScope(\n      canPop: !isFullScreen && !plPlayerController.isDesktopPip,\n      onPopInvokedWithResult: plPlayerController.onPopInvokedWithResult,\n      child: player,\n    );\n  }\n\n  Widget get childWhenDisabled {\n    return Obx(() {\n      final isFullScreen = this.isFullScreen || plPlayerController.isDesktopPip;\n      return Stack(\n        clipBehavior: Clip.none,\n        children: [\n          const SizedBox.expand(child: ColoredBox(color: Colors.black)),\n          if (!isFullScreen)\n            Obx(\n              () {\n                final appBackground = _liveRoomController\n                    .roomInfoH5\n                    .value\n                    ?.roomInfo\n                    ?.appBackground;\n                Widget child;\n                if (appBackground != null && appBackground.isNotEmpty) {\n                  child = CachedNetworkImage(\n                    fit: BoxFit.cover,\n                    width: maxWidth,\n                    height: maxHeight,\n                    memCacheWidth: maxWidth.cacheSize(context),\n                    imageUrl: ImageUtils.safeThumbnailUrl(appBackground),\n                    placeholder: (_, _) => const SizedBox.shrink(),\n                  );\n                } else {\n                  child = Image.asset(\n                    'assets/images/live/default_bg.webp',\n                    fit: BoxFit.cover,\n                    width: maxWidth,\n                    height: maxHeight,\n                    cacheWidth: maxWidth.cacheSize(context),\n                  );\n                }\n                return Positioned.fill(\n                  child: Opacity(opacity: 0.6, child: child),\n                );\n              },\n            ),\n          Scaffold(\n            resizeToAvoidBottomInset: false,\n            backgroundColor: Colors.transparent,\n            appBar: _buildAppBar(isFullScreen),\n            body: isPortrait\n                ? Obx(\n                    () {\n                      if (_liveRoomController.isPortrait.value) {\n                        return _buildPP(isFullScreen);\n                      }\n                      return _buildPH(isFullScreen);\n                    },\n                  )\n                : _buildBodyH(isFullScreen),\n          ),\n        ],\n      );\n    });\n  }\n\n  Widget _buildPH(bool isFullScreen) {\n    final height = maxWidth / StyleString.aspectRatio16x9;\n    final videoHeight = isFullScreen ? maxHeight - padding.top : height;\n    final bottomHeight = maxHeight - padding.top - height - kToolbarHeight;\n    return Column(\n      children: [\n        SizedBox(\n          width: maxWidth,\n          height: videoHeight,\n          child: videoPlayerPanel(\n            isFullScreen,\n            width: maxWidth,\n            height: videoHeight,\n          ),\n        ),\n        Offstage(\n          offstage: isFullScreen,\n          child: SizedBox(\n            width: maxWidth,\n            height: max(0, bottomHeight),\n            child: _buildBottomWidget,\n          ),\n        ),\n      ],\n    );\n  }\n\n  Widget _buildPP(bool isFullScreen) {\n    final bottomHeight = 70 + padding.bottom;\n    final videoHeight = isFullScreen\n        ? maxHeight - padding.top\n        : maxHeight - bottomHeight;\n    return Stack(\n      clipBehavior: Clip.none,\n      children: [\n        Positioned.fill(\n          bottom: isFullScreen ? 0 : bottomHeight,\n          child: videoPlayerPanel(\n            width: maxWidth,\n            height: videoHeight,\n            isFullScreen,\n            needDm: isFullScreen,\n            alignment: isFullScreen ? Alignment.center : Alignment.topCenter,\n          ),\n        ),\n        Positioned(\n          left: 0,\n          right: 0,\n          bottom: 55 + bottomHeight,\n          height: maxHeight * 0.32,\n          child: Offstage(\n            offstage: isFullScreen,\n            child: _buildChatWidget(true),\n          ),\n        ),\n        Positioned(\n          left: 0,\n          right: 0,\n          bottom: 0,\n          height: bottomHeight,\n          child: Offstage(\n            offstage: isFullScreen,\n            child: _buildInputWidget,\n          ),\n        ),\n      ],\n    );\n  }\n\n  PreferredSizeWidget _buildAppBar(bool isFullScreen) {\n    final color = Theme.of(context).colorScheme.onSurfaceVariant;\n    return AppBar(\n      toolbarHeight: isFullScreen ? 0 : null,\n      backgroundColor: Colors.transparent,\n      foregroundColor: Colors.white,\n      titleTextStyle: const TextStyle(color: Colors.white),\n      title: isFullScreen || plPlayerController.isDesktopPip\n          ? null\n          : Obx(\n              () {\n                RoomInfoH5Data? roomInfoH5 =\n                    _liveRoomController.roomInfoH5.value;\n                if (roomInfoH5 == null) {\n                  return const SizedBox.shrink();\n                }\n                return GestureDetector(\n                  behavior: HitTestBehavior.opaque,\n                  onTap: () =>\n                      Get.toNamed('/member?mid=${roomInfoH5.roomInfo?.uid}'),\n                  child: Row(\n                    spacing: 10,\n                    mainAxisSize: MainAxisSize.min,\n                    children: [\n                      NetworkImgLayer(\n                        width: 34,\n                        height: 34,\n                        type: ImageType.avatar,\n                        src: roomInfoH5.anchorInfo!.baseInfo!.face,\n                      ),\n                      Flexible(\n                        child: Column(\n                          spacing: 1,\n                          crossAxisAlignment: CrossAxisAlignment.start,\n                          children: [\n                            Row(\n                              spacing: 10,\n                              mainAxisSize: .min,\n                              crossAxisAlignment: CrossAxisAlignment.end,\n                              children: [\n                                Flexible(\n                                  child: Text(\n                                    roomInfoH5.anchorInfo!.baseInfo!.uname!,\n                                    style: const TextStyle(\n                                      fontSize: 14,\n                                      color: Colors.white,\n                                    ),\n                                  ),\n                                ),\n                                _liveRoomController.onlineWidget,\n                              ],\n                            ),\n                            Row(\n                              spacing: 10,\n                              mainAxisSize: .min,\n                              children: [\n                                _liveRoomController.watchedWidget,\n                                _liveRoomController.timeWidget,\n                              ],\n                            ),\n                          ],\n                        ),\n                      ),\n                    ],\n                  ),\n                );\n              },\n            ),\n      actions: [\n        // IconButton(\n        //   tooltip: '刷新',\n        //   onPressed: _liveRoomController.queryLiveUrl,\n        //   icon: const Icon(Icons.refresh, size: 20),\n        // ),\n        PopupMenuButton(\n          icon: const Icon(Icons.more_vert, size: 20),\n          itemBuilder: (BuildContext context) {\n            final liveUrl =\n                'https://live.bilibili.com/${_liveRoomController.roomId}';\n            return <PopupMenuEntry>[\n              PopupMenuItem(\n                onTap: () => Utils.copyText(liveUrl),\n                child: Row(\n                  spacing: 10,\n                  mainAxisSize: MainAxisSize.min,\n                  children: [\n                    Icon(\n                      Icons.copy,\n                      size: 19,\n                      color: color,\n                    ),\n                    const Text('复制链接'),\n                  ],\n                ),\n              ),\n              if (PlatformUtils.isMobile)\n                PopupMenuItem(\n                  onTap: () => Utils.shareText(liveUrl),\n                  child: Row(\n                    spacing: 10,\n                    mainAxisSize: MainAxisSize.min,\n                    children: [\n                      Icon(\n                        Icons.share,\n                        size: 19,\n                        color: color,\n                      ),\n                      const Text('分享直播间'),\n                    ],\n                  ),\n                ),\n              PopupMenuItem(\n                onTap: () => PageUtils.inAppWebview(liveUrl, off: true),\n                child: Row(\n                  spacing: 10,\n                  mainAxisSize: MainAxisSize.min,\n                  children: [\n                    Icon(\n                      Icons.open_in_browser,\n                      size: 19,\n                      color: color,\n                    ),\n                    const Text('浏览器打开'),\n                  ],\n                ),\n              ),\n              if (_liveRoomController.roomInfoH5.value != null)\n                PopupMenuItem(\n                  onTap: () {\n                    try {\n                      RoomInfoH5Data roomInfo =\n                          _liveRoomController.roomInfoH5.value!;\n                      PageUtils.pmShare(\n                        this.context,\n                        content: {\n                          \"cover\": roomInfo.roomInfo!.cover!,\n                          \"sourceID\": _liveRoomController.roomId.toString(),\n                          \"title\": roomInfo.roomInfo!.title!,\n                          \"url\": liveUrl,\n                          \"authorID\": roomInfo.roomInfo!.uid.toString(),\n                          \"source\": \"直播\",\n                          \"desc\": roomInfo.roomInfo!.title!,\n                          \"author\": roomInfo.anchorInfo!.baseInfo!.uname,\n                        },\n                      );\n                    } catch (e) {\n                      SmartDialog.showToast(e.toString());\n                    }\n                  },\n                  child: Row(\n                    spacing: 10,\n                    mainAxisSize: MainAxisSize.min,\n                    children: [\n                      Icon(\n                        Icons.forward_to_inbox,\n                        size: 19,\n                        color: color,\n                      ),\n                      const Text('分享至消息'),\n                    ],\n                  ),\n                ),\n            ];\n          },\n        ),\n      ],\n    );\n  }\n\n  Widget _buildBodyH(bool isFullScreen) {\n    double videoWidth =\n        clampDouble(maxHeight / maxWidth * 1.08, 0.56, 0.7) * maxWidth;\n    final rightWidth = min(400.0, maxWidth - videoWidth - padding.horizontal);\n    videoWidth = maxWidth - rightWidth - padding.horizontal;\n    final videoHeight = maxHeight - padding.top - kToolbarHeight;\n    final width = isFullScreen ? maxWidth : videoWidth;\n    final height = isFullScreen ? maxHeight - padding.top : videoHeight;\n    return Padding(\n      padding: isFullScreen\n          ? EdgeInsets.zero\n          : EdgeInsets.only(left: padding.left, right: padding.right),\n      child: Row(\n        children: [\n          Container(\n            width: width,\n            height: height,\n            margin: EdgeInsets.only(bottom: padding.bottom),\n            child: videoPlayerPanel(\n              isFullScreen,\n              fill: Colors.transparent,\n              width: width,\n              height: height,\n            ),\n          ),\n          Offstage(\n            offstage: isFullScreen,\n            child: SizedBox(\n              width: rightWidth,\n              height: videoHeight,\n              child: _buildBottomWidget,\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget get _buildBottomWidget => Column(\n    crossAxisAlignment: CrossAxisAlignment.start,\n    children: [\n      Expanded(child: _buildChatWidget()),\n      _buildInputWidget,\n    ],\n  );\n\n  Widget _buildChatWidget([bool isPP = false]) {\n    Widget chat() => LiveRoomChatPanel(\n      key: chatKey,\n      isPP: isPP,\n      roomId: _liveRoomController.roomId,\n      liveRoomController: _liveRoomController,\n      onAtUser: (item) => _liveRoomController\n        ..savedDanmaku = [\n          RichTextItem.fromStart(\n            '@${item.name} ',\n            rawText: item.extra.mid.toString(),\n            type: .at,\n            id: item.extra.id.toString(),\n          ),\n        ]\n        ..onSendDanmaku(),\n    );\n    return Padding(\n      padding: EdgeInsets.only(bottom: 12, top: isPortrait ? 12 : 0),\n      child: _liveRoomController.showSuperChat\n          ? PageView<CustomHorizontalDragGestureRecognizer>(\n              key: pageKey,\n              controller: _liveRoomController.pageController,\n              physics: clampingScrollPhysics,\n              onPageChanged: (value) =>\n                  _liveRoomController.pageIndex.value = value,\n              horizontalDragGestureRecognizer:\n                  CustomHorizontalDragGestureRecognizer.new,\n              children: [\n                KeepAliveWrapper(child: chat()),\n                SuperChatPanel(\n                  key: scKey,\n                  controller: _liveRoomController,\n                ),\n              ],\n            )\n          : chat(),\n    );\n  }\n\n  Widget get _buildInputWidget {\n    final child = Container(\n      padding: EdgeInsets.only(\n        top: 5,\n        left: 10,\n        right: 10,\n        bottom: padding.bottom,\n      ),\n      height: 70 + padding.bottom,\n      decoration: const BoxDecoration(\n        borderRadius: BorderRadius.vertical(top: Radius.circular(20)),\n        border: Border(top: BorderSide(color: Color(0x1AFFFFFF))),\n        color: Color(0x1AFFFFFF),\n      ),\n      child: GestureDetector(\n        onTap: _liveRoomController.onSendDanmaku,\n        behavior: HitTestBehavior.opaque,\n        child: Padding(\n          padding: const EdgeInsets.only(top: 5, bottom: 10),\n          child: Align(\n            alignment: Alignment.topCenter,\n            child: Row(\n              spacing: 6,\n              children: [\n                Obx(\n                  () {\n                    final enableShowLiveDanmaku =\n                        plPlayerController.enableShowDanmaku.value;\n                    return SizedBox(\n                      width: 34,\n                      height: 34,\n                      child: IconButton(\n                        style: IconButton.styleFrom(\n                          padding: EdgeInsets.zero,\n                        ),\n                        onPressed: () {\n                          final newVal = !enableShowLiveDanmaku;\n                          plPlayerController.enableShowDanmaku.value = newVal;\n                          if (!plPlayerController.tempPlayerConf) {\n                            GStorage.setting.put(\n                              SettingBoxKey.enableShowLiveDanmaku,\n                              newVal,\n                            );\n                          }\n                        },\n                        icon: enableShowLiveDanmaku\n                            ? const Icon(\n                                size: 22,\n                                CustomIcons.dm_on,\n                                color: Color(0xFFEEEEEE),\n                              )\n                            : const Icon(\n                                size: 22,\n                                CustomIcons.dm_off,\n                                color: Color(0xFFEEEEEE),\n                              ),\n                      ),\n                    );\n                  },\n                ),\n                const Expanded(\n                  child: Text(\n                    '发送弹幕',\n                    style: TextStyle(color: Color(0xFFEEEEEE)),\n                  ),\n                ),\n                Builder(\n                  builder: (context) {\n                    final colorScheme = Theme.of(context).colorScheme;\n                    return Material(\n                      type: MaterialType.transparency,\n                      child: Stack(\n                        clipBehavior: Clip.none,\n                        children: [\n                          InkWell(\n                            overlayColor: overlayColor(colorScheme),\n                            customBorder: const CircleBorder(),\n                            onTapDown: _liveRoomController.onLikeTapDown,\n                            onTapUp: _liveRoomController.onLikeTapUp,\n                            onTapCancel: _liveRoomController.onLikeTapUp,\n                            child: const SizedBox.square(\n                              dimension: 34,\n                              child: Icon(\n                                size: 22,\n                                color: Color(0xFFEEEEEE),\n                                Icons.thumb_up_off_alt,\n                              ),\n                            ),\n                          ),\n                          Positioned(\n                            right: -12,\n                            top: -12,\n                            child: Obx(() {\n                              final likeClickTime =\n                                  _liveRoomController.likeClickTime.value;\n                              if (likeClickTime == 0) {\n                                return const SizedBox.shrink();\n                              }\n                              return AnimatedSwitcher(\n                                duration: const Duration(milliseconds: 160),\n                                transitionBuilder: (child, animation) {\n                                  return ScaleTransition(\n                                    scale: animation,\n                                    child: child,\n                                  );\n                                },\n                                child: Text(\n                                  key: ValueKey(likeClickTime),\n                                  'x$likeClickTime',\n                                  style: TextStyle(\n                                    fontSize: 16,\n                                    color: colorScheme.isDark\n                                        ? colorScheme.primary\n                                        : colorScheme.inversePrimary,\n                                  ),\n                                ),\n                              );\n                            }),\n                          ),\n                        ],\n                      ),\n                    );\n                  },\n                ),\n                SizedBox(\n                  width: 34,\n                  height: 34,\n                  child: IconButton(\n                    style: IconButton.styleFrom(padding: EdgeInsets.zero),\n                    onPressed: () => _liveRoomController.onSendDanmaku(true),\n                    icon: const Icon(\n                      size: 22,\n                      color: Color(0xFFEEEEEE),\n                      Icons.emoji_emotions_outlined,\n                    ),\n                  ),\n                ),\n              ],\n            ),\n          ),\n        ),\n      ),\n    );\n    if (_liveRoomController.showSuperChat) {\n      return Stack(\n        children: [\n          child,\n          Positioned(\n            left: 0,\n            top: 0,\n            right: 0,\n            child: Obx(\n              () => _BorderIndicator(\n                radius: const Radius.circular(20),\n                isLeft: _liveRoomController.pageIndex.value == 0,\n              ),\n            ),\n          ),\n        ],\n      );\n    }\n    return child;\n  }\n\n  WidgetStateProperty<Color?>? overlayColor(ColorScheme theme) =>\n      WidgetStateProperty.resolveWith((Set<WidgetState> states) {\n        if (states.contains(WidgetState.selected)) {\n          if (states.contains(WidgetState.pressed)) {\n            return theme.primary.withValues(alpha: 0.1);\n          }\n          if (states.contains(WidgetState.hovered)) {\n            return theme.primary.withValues(alpha: 0.08);\n          }\n          if (states.contains(WidgetState.focused)) {\n            return theme.primary.withValues(alpha: 0.1);\n          }\n        }\n        if (states.contains(WidgetState.pressed)) {\n          return theme.onSurfaceVariant.withValues(alpha: 0.1);\n        }\n        if (states.contains(WidgetState.hovered)) {\n          return theme.onSurfaceVariant.withValues(alpha: 0.08);\n        }\n        if (states.contains(WidgetState.focused)) {\n          return theme.onSurfaceVariant.withValues(alpha: 0.1);\n        }\n        return Colors.transparent;\n      });\n}\n\nclass _BorderIndicator extends LeafRenderObjectWidget {\n  const _BorderIndicator({\n    required this.radius,\n    required this.isLeft,\n  });\n\n  final Radius radius;\n  final bool isLeft;\n\n  @override\n  RenderObject createRenderObject(BuildContext context) {\n    return _RenderBorderIndicator(\n      radius: radius,\n      isLeft: isLeft,\n    );\n  }\n\n  @override\n  void updateRenderObject(\n    BuildContext context,\n    _RenderBorderIndicator renderObject,\n  ) {\n    renderObject\n      ..radius = radius\n      ..isLeft = isLeft;\n  }\n}\n\nclass _RenderBorderIndicator extends RenderBox {\n  _RenderBorderIndicator({\n    required Radius radius,\n    required bool isLeft,\n  }) : _radius = radius,\n       _isLeft = isLeft;\n\n  Radius _radius;\n  Radius get radius => _radius;\n  set radius(Radius value) {\n    if (_radius == value) return;\n    _radius = value;\n    markNeedsLayout();\n  }\n\n  bool _isLeft;\n  bool get isLeft => _isLeft;\n  set isLeft(bool value) {\n    if (_isLeft == value) return;\n    _isLeft = value;\n    markNeedsPaint();\n  }\n\n  @override\n  void performLayout() {\n    size = constraints.constrainDimensions(constraints.maxWidth, _radius.x);\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    final size = this.size;\n    final canvas = context.canvas;\n    final width = size.width / 2;\n\n    BoxBorder.paintNonUniformBorder(\n      canvas,\n      Rect.fromLTWH(\n        offset.dx + (_isLeft ? 0 : width),\n        offset.dy,\n        width,\n        size.height,\n      ),\n      borderRadius: BorderRadius.only(\n        topLeft: _isLeft ? _radius : .zero,\n        topRight: _isLeft ? .zero : _radius,\n      ),\n      textDirection: null,\n      top: const BorderSide(),\n      color: Colors.white38,\n    );\n  }\n}\n\nclass LiveDanmaku extends StatefulWidget {\n  final LiveRoomController liveRoomController;\n  final PlPlayerController plPlayerController;\n  final bool isPipMode;\n  final bool isFullScreen;\n  final Size size;\n\n  const LiveDanmaku({\n    super.key,\n    required this.liveRoomController,\n    required this.plPlayerController,\n    this.isPipMode = false,\n    required this.isFullScreen,\n    required this.size,\n  });\n\n  @override\n  State<LiveDanmaku> createState() => _LiveDanmakuState();\n\n  bool get notFullscreen => !isFullScreen || isPipMode;\n}\n\nclass _LiveDanmakuState extends State<LiveDanmaku> {\n  PlPlayerController get plPlayerController => widget.plPlayerController;\n\n  @override\n  void didUpdateWidget(LiveDanmaku oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (oldWidget.notFullscreen != widget.notFullscreen &&\n        !DanmakuOptions.sameFontScale) {\n      plPlayerController.danmakuController?.updateOption(\n        DanmakuOptions.get(notFullscreen: widget.notFullscreen),\n      );\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final option = DanmakuOptions.get(notFullscreen: widget.notFullscreen);\n    return Obx(\n      () => AnimatedOpacity(\n        opacity: plPlayerController.enableShowDanmaku.value\n            ? plPlayerController.danmakuOpacity.value\n            : 0,\n        duration: const Duration(milliseconds: 100),\n        child: DanmakuScreen<DanmakuExtra>(\n          createdController: (e) {\n            widget.liveRoomController.danmakuController =\n                plPlayerController.danmakuController = e;\n          },\n          option: option,\n          size: widget.size,\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/live_room/widgets/bottom_control.dart",
    "content": "import 'package:PiliPlus/common/widgets/custom_icon.dart';\nimport 'package:PiliPlus/pages/live_room/controller.dart';\nimport 'package:PiliPlus/pages/video/widgets/header_mixin.dart';\nimport 'package:PiliPlus/plugin/pl_player/controller.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/video_fit_type.dart';\nimport 'package:PiliPlus/plugin/pl_player/widgets/common_btn.dart';\nimport 'package:PiliPlus/plugin/pl_player/widgets/play_pause_btn.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass BottomControl extends StatefulWidget {\n  const BottomControl({\n    super.key,\n    required this.plPlayerController,\n    required this.liveRoomCtr,\n    required this.onRefresh,\n    this.subTitleStyle = const TextStyle(fontSize: 12),\n    this.titleStyle = const TextStyle(fontSize: 14),\n  });\n\n  final PlPlayerController plPlayerController;\n  final LiveRoomController liveRoomCtr;\n  final VoidCallback onRefresh;\n\n  final TextStyle subTitleStyle;\n  final TextStyle titleStyle;\n\n  @override\n  State<BottomControl> createState() => _BottomControlState();\n}\n\nclass _BottomControlState extends State<BottomControl> with HeaderMixin {\n  late final LiveRoomController liveRoomCtr = widget.liveRoomCtr;\n  @override\n  late final PlPlayerController plPlayerController = widget.plPlayerController;\n\n  @override\n  Widget build(BuildContext context) {\n    final isFullScreen = plPlayerController.isFullScreen.value;\n    return AppBar(\n      backgroundColor: Colors.transparent,\n      foregroundColor: Colors.white,\n      primary: false,\n      automaticallyImplyLeading: false,\n      titleSpacing: 14,\n      title: Row(\n        children: [\n          PlayOrPauseButton(plPlayerController: plPlayerController),\n          ComBtn(\n            height: 30,\n            tooltip: '刷新',\n            icon: const Icon(\n              Icons.refresh,\n              size: 18,\n              color: Colors.white,\n            ),\n            onTap: widget.onRefresh,\n          ),\n          const Spacer(),\n          ComBtn(\n            height: 30,\n            tooltip: '屏蔽',\n            icon: const Icon(\n              size: 18,\n              Icons.block,\n              color: Colors.white,\n            ),\n            onTap: () {\n              if (liveRoomCtr.isLogin) {\n                Get.toNamed(\n                  '/liveDmBlockPage',\n                  parameters: {\n                    'roomId': liveRoomCtr.roomId.toString(),\n                  },\n                );\n              } else {\n                SmartDialog.showToast('账号未登录');\n              }\n            },\n          ),\n          const SizedBox(width: 3),\n          Obx(\n            () {\n              final enableShowLiveDanmaku =\n                  plPlayerController.enableShowDanmaku.value;\n              return ComBtn(\n                height: 30,\n                tooltip: \"${enableShowLiveDanmaku ? '关闭' : '开启'}弹幕\",\n                icon: enableShowLiveDanmaku\n                    ? const Icon(\n                        size: 18,\n                        CustomIcons.dm_on,\n                        color: Colors.white,\n                      )\n                    : const Icon(\n                        size: 18,\n                        CustomIcons.dm_off,\n                        color: Colors.white,\n                      ),\n                onTap: () {\n                  final newVal = !enableShowLiveDanmaku;\n                  plPlayerController.enableShowDanmaku.value = newVal;\n                  if (!plPlayerController.tempPlayerConf) {\n                    GStorage.setting.put(\n                      SettingBoxKey.enableShowLiveDanmaku,\n                      newVal,\n                    );\n                  }\n                },\n              );\n            },\n          ),\n          ComBtn(\n            height: 30,\n            tooltip: '弹幕设置',\n            icon: const Icon(\n              size: 18,\n              CustomIcons.dm_settings,\n              color: Colors.white,\n            ),\n            onTap: () => showSetDanmaku(isLive: true),\n          ),\n          Obx(\n            () => PopupMenuButton<VideoFitType>(\n              tooltip: '画面比例',\n              initialValue: plPlayerController.videoFit.value,\n              color: Colors.black.withValues(alpha: 0.8),\n              itemBuilder: (context) {\n                return VideoFitType.values\n                    .map(\n                      (boxFit) => PopupMenuItem<VideoFitType>(\n                        height: 35,\n                        padding: const EdgeInsets.only(left: 30),\n                        value: boxFit,\n                        onTap: () => plPlayerController.toggleVideoFit(boxFit),\n                        child: Text(\n                          boxFit.desc,\n                          style: const TextStyle(\n                            color: Colors.white,\n                            fontSize: 13,\n                          ),\n                        ),\n                      ),\n                    )\n                    .toList();\n              },\n              child: Padding(\n                padding: const EdgeInsets.symmetric(horizontal: 10),\n                child: Text(\n                  plPlayerController.videoFit.value.desc,\n                  style: const TextStyle(color: Colors.white, fontSize: 13),\n                ),\n              ),\n            ),\n          ),\n          Obx(\n            () => PopupMenuButton<int>(\n              tooltip: '画质',\n              padding: EdgeInsets.zero,\n              initialValue: liveRoomCtr.currentQn,\n              color: Colors.black.withValues(alpha: 0.8),\n              itemBuilder: (context) {\n                return liveRoomCtr.acceptQnList\n                    .map(\n                      (e) => PopupMenuItem<int>(\n                        height: 35,\n                        padding: const EdgeInsets.only(left: 30),\n                        value: e.code,\n                        onTap: () => liveRoomCtr.changeQn(e.code),\n                        child: Text(\n                          e.desc,\n                          style: const TextStyle(\n                            color: Colors.white,\n                            fontSize: 13,\n                          ),\n                        ),\n                      ),\n                    )\n                    .toList();\n              },\n              child: Padding(\n                padding: const EdgeInsets.symmetric(horizontal: 10),\n                child: Text(\n                  liveRoomCtr.currentQnDesc.value,\n                  style: const TextStyle(color: Colors.white, fontSize: 13),\n                ),\n              ),\n            ),\n          ),\n          if (!plPlayerController.isDesktopPip)\n            ComBtn(\n              height: 30,\n              tooltip: isFullScreen ? '退出全屏' : '全屏',\n              icon: isFullScreen\n                  ? const Icon(\n                      Icons.fullscreen_exit,\n                      size: 24,\n                      color: Colors.white,\n                    )\n                  : const Icon(\n                      Icons.fullscreen,\n                      size: 24,\n                      color: Colors.white,\n                    ),\n              onTap: () =>\n                  plPlayerController.triggerFullScreen(status: !isFullScreen),\n              onSecondaryTap: () => plPlayerController.triggerFullScreen(\n                status: !isFullScreen,\n                inAppFullScreen: true,\n              ),\n            ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/live_room/widgets/chat_panel.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/popup_menu.dart';\nimport 'package:PiliPlus/common/widgets/gesture/tap_gesture_recognizer.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/http/live.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models_new/live/live_danmaku/danmaku_msg.dart';\nimport 'package:PiliPlus/models_new/live/live_superchat/item.dart';\nimport 'package:PiliPlus/pages/live_room/controller.dart';\nimport 'package:PiliPlus/pages/live_room/superchat/superchat_card.dart';\nimport 'package:PiliPlus/pages/video/widgets/header_control.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass LiveRoomChatPanel extends StatelessWidget {\n  const LiveRoomChatPanel({\n    super.key,\n    required this.roomId,\n    required this.liveRoomController,\n    required this.isPP,\n    required this.onAtUser,\n  });\n\n  final int roomId;\n  final LiveRoomController liveRoomController;\n  final bool isPP;\n  final ValueChanged<DanmakuMsg> onAtUser;\n\n  bool get disableAutoScroll => liveRoomController.disableAutoScroll.value;\n\n  @override\n  Widget build(BuildContext context) {\n    late final bg = isPP\n        ? Colors.black.withValues(alpha: 0.4)\n        : const Color(0x15FFFFFF);\n    late final nameColor = isPP\n        ? Colors.white.withValues(alpha: 0.9)\n        : Colors.white.withValues(alpha: 0.6);\n    late final devicePixelRatio = MediaQuery.devicePixelRatioOf(context);\n    late final colorScheme = ColorScheme.of(context);\n    late final primary = colorScheme.isDark\n        ? colorScheme.primary\n        : colorScheme.inversePrimary;\n    return Stack(\n      children: [\n        Obx(\n          () => ListView.separated(\n            key: const PageStorageKey(LiveRoomChatPanel),\n            padding: const EdgeInsets.symmetric(horizontal: 12),\n            controller: liveRoomController.scrollController,\n            separatorBuilder: (_, _) => const SizedBox(height: 8),\n            itemCount: liveRoomController.messages.length,\n            physics: const ClampingScrollPhysics(),\n            itemBuilder: (_, index) {\n              final item = liveRoomController.messages[index];\n              if (item is DanmakuMsg) {\n                return Align(\n                  alignment: Alignment.centerLeft,\n                  child: Builder(\n                    builder: (itemContext) {\n                      return Container(\n                        padding: const EdgeInsets.symmetric(\n                          horizontal: 10,\n                          vertical: 4,\n                        ),\n                        decoration: BoxDecoration(\n                          color: bg,\n                          borderRadius: const BorderRadius.all(\n                            Radius.circular(14),\n                          ),\n                        ),\n                        child: Text.rich(\n                          TextSpan(\n                            children: [\n                              TextSpan(\n                                text: '${item.name}: ',\n                                style: TextStyle(\n                                  color: nameColor,\n                                  fontSize: 14,\n                                ),\n                                recognizer: item.extra.mid == 0\n                                    ? null\n                                    : (NoDeadlineTapGestureRecognizer()\n                                        ..onTapUp = (e) => _showMsgMenu(\n                                          context,\n                                          itemContext,\n                                          e,\n                                          item,\n                                        )),\n                              ),\n                              if (item.reply case final reply?)\n                                TextSpan(\n                                  text: '@${reply.name} ',\n                                  style: TextStyle(\n                                    color: primary,\n                                    fontSize: 14,\n                                  ),\n                                  recognizer: NoDeadlineTapGestureRecognizer()\n                                    ..onTap = () =>\n                                        Get.toNamed('/member?mid=${reply.mid}'),\n                                ),\n                              _buildMsg(devicePixelRatio, item),\n                            ],\n                          ),\n                        ),\n                      );\n                    },\n                  ),\n                );\n              }\n              if (item is SuperChatItem) {\n                return SuperChatCard(\n                  item: item,\n                  persistentSC: true,\n                  onReport: () => liveRoomController.reportSC(item),\n                );\n              }\n              throw item.runtimeType;\n            },\n          ),\n        ),\n        if (kDebugMode && liveRoomController.showSuperChat) ...[\n          Positioned(\n            top: 50,\n            right: 0,\n            child: TextButton(\n              onPressed: () {\n                final item = SuperChatItem.random;\n                liveRoomController\n                  ..superChatMsg.insert(0, item)\n                  ..addDm(item);\n              },\n              child: const Text('add superchat'),\n            ),\n          ),\n          Positioned(\n            right: 0,\n            top: 90,\n            child: TextButton(\n              onPressed: () {\n                if (liveRoomController.superChatMsg.isNotEmpty) {\n                  liveRoomController.superChatMsg.removeLast();\n                }\n              },\n              child: const Text('remove superchat'),\n            ),\n          ),\n        ],\n        if (liveRoomController.showSuperChat)\n          Positioned(\n            top: 12,\n            right: 12,\n            child: Obx(() {\n              final isEmpty = liveRoomController.superChatMsg.isEmpty;\n              return AnimatedOpacity(\n                opacity: isEmpty ? 0 : 1,\n                duration: const Duration(milliseconds: 120),\n                child: GestureDetector(\n                  onTap: isEmpty\n                      ? null\n                      : () => liveRoomController.pageController?.animateToPage(\n                          1,\n                          duration: const Duration(milliseconds: 200),\n                          curve: Curves.easeInOut,\n                        ),\n                  child: Container(\n                    decoration: BoxDecoration(\n                      borderRadius: const BorderRadius.all(Radius.circular(8)),\n                      color: const Color(0x2FFFFFFF),\n                      border: Border.all(color: Colors.white24, width: 0.7),\n                    ),\n                    padding: const EdgeInsets.fromLTRB(10, 4, 4, 4),\n                    child: Text.rich(\n                      style: const TextStyle(color: Colors.white, height: 1),\n                      strutStyle: const StrutStyle(height: 1, leading: 0),\n                      TextSpan(\n                        children: [\n                          TextSpan(\n                            text:\n                                'SC(${liveRoomController.superChatMsg.length})',\n                          ),\n                          const WidgetSpan(\n                            alignment: PlaceholderAlignment.middle,\n                            child: Icon(\n                              size: 18,\n                              Icons.keyboard_arrow_right,\n                              color: Colors.white,\n                            ),\n                          ),\n                        ],\n                      ),\n                    ),\n                  ),\n                ),\n              );\n            }),\n          ),\n        Obx(\n          () => liveRoomController.disableAutoScroll.value\n              ? Positioned(\n                  right: 12,\n                  bottom: 0,\n                  child: ElevatedButton.icon(\n                    style: ElevatedButton.styleFrom(\n                      visualDensity: VisualDensity.comfortable,\n                    ),\n                    icon: const Icon(\n                      Icons.arrow_downward_rounded,\n                      size: 20,\n                    ),\n                    label: const Text('回到底部'),\n                    onPressed: () => liveRoomController\n                      ..disableAutoScroll.value = false\n                      ..jumpToBottom(),\n                  ),\n                )\n              : const SizedBox.shrink(),\n        ),\n      ],\n    );\n  }\n\n  InlineSpan _buildMsg(double devicePixelRatio, DanmakuMsg obj) {\n    final uemote = obj.uemote;\n    if (uemote != null) {\n      // \"room_{{room_id}}_{{int}}\" or \"upower_[{{emote}}]\"\n      final isUpower = uemote.isUpower;\n      return WidgetSpan(\n        child: NetworkImgLayer(\n          src: uemote.url,\n          type: ImageType.emote,\n          width: isUpower ? uemote.width : uemote.width / devicePixelRatio,\n          height: isUpower ? uemote.height : uemote.height / devicePixelRatio,\n        ),\n      );\n    }\n    final emots = obj.emots;\n    if (emots != null) {\n      RegExp regExp = RegExp(emots.keys.map(RegExp.escape).join('|'));\n      final List<InlineSpan> spanChildren = <InlineSpan>[];\n      obj.text.splitMapJoin(\n        regExp,\n        onMatch: (match) {\n          final key = match[0]!;\n          final emote = emots[key]!;\n          spanChildren.add(\n            WidgetSpan(\n              child: NetworkImgLayer(\n                src: emote.url,\n                type: ImageType.emote,\n                width: emote.width,\n                height: emote.height,\n              ),\n            ),\n          );\n          return '';\n        },\n        onNonMatch: (String nonMatchStr) {\n          spanChildren.add(\n            TextSpan(\n              text: nonMatchStr,\n              style: const TextStyle(\n                color: Colors.white,\n                fontSize: 14,\n              ),\n            ),\n          );\n          return '';\n        },\n      );\n      return TextSpan(children: spanChildren);\n    } else {\n      return TextSpan(\n        text: obj.text,\n        style: const TextStyle(\n          color: Colors.white,\n          fontSize: 14,\n        ),\n      );\n    }\n  }\n\n  void _showMsgMenu(\n    BuildContext context,\n    BuildContext itemContext,\n    TapUpDetails details,\n    DanmakuMsg item,\n  ) {\n    final dx = details.globalPosition.dx;\n    final renderBox = itemContext.findRenderObject() as RenderBox;\n    final dy =\n        details.globalPosition.dy -\n        details.localPosition.dy +\n        renderBox.size.height -\n        4; // padding\n    final autoScroll =\n        liveRoomController.autoScroll &&\n        !liveRoomController.disableAutoScroll.value;\n    if (autoScroll) {\n      liveRoomController.autoScroll = false;\n    }\n    showMenu(\n      context: context,\n      position: RelativeRect.fromLTRB(dx, dy, dx, 0),\n      items: <PopupMenuEntry<Never>>[\n        CustomPopupMenuItem(\n          height: 38,\n          child: Text(\n            item.name,\n            style: const TextStyle(fontSize: 13),\n          ),\n        ),\n        const CustomPopupMenuDivider(height: 1),\n        PopupMenuItem(\n          height: 38,\n          onTap: () => Utils.copyText(Utils.jsonEncoder.convert(item.toJson())),\n          child: const Text(\n            '复制弹幕信息',\n            style: TextStyle(fontSize: 13),\n          ),\n        ),\n        PopupMenuItem(\n          height: 38,\n          onTap: () => Get.toNamed('/member?mid=${item.extra.mid}'),\n          child: const Text(\n            '去TA的个人空间',\n            style: TextStyle(fontSize: 13),\n          ),\n        ),\n        PopupMenuItem(\n          height: 38,\n          onTap: () => onAtUser(item),\n          child: const Text(\n            '@TA',\n            style: TextStyle(fontSize: 13),\n          ),\n        ),\n        PopupMenuItem(\n          height: 38,\n          onTap: () async {\n            if (!liveRoomController.isLogin) return;\n            final res = await LiveHttp.liveShieldUser(\n              uid: item.extra.mid,\n              roomid: roomId,\n              type: 1,\n            );\n            if (res.isSuccess) {\n              SmartDialog.showToast('屏蔽成功');\n            } else {\n              res.toast();\n            }\n          },\n          child: const Text(\n            '屏蔽发送者',\n            style: TextStyle(fontSize: 13),\n          ),\n        ),\n        PopupMenuItem(\n          height: 38,\n          onTap: () => HeaderControl.reportLiveDanmaku(\n            context,\n            roomId: roomId,\n            msg: item.text,\n            extra: item.extra,\n          ),\n          child: const Text(\n            '举报选中弹幕',\n            style: TextStyle(fontSize: 13),\n          ),\n        ),\n      ],\n    ).whenComplete(() {\n      if (autoScroll && context.mounted) {\n        liveRoomController\n          ..autoScroll = true\n          ..scrollToBottom();\n      }\n    });\n  }\n}\n"
  },
  {
    "path": "lib/pages/live_room/widgets/header_control.dart",
    "content": "import 'dart:io';\n\nimport 'package:PiliPlus/common/widgets/marquee.dart';\nimport 'package:PiliPlus/pages/live_room/controller.dart';\nimport 'package:PiliPlus/pages/video/widgets/header_control.dart';\nimport 'package:PiliPlus/plugin/pl_player/controller.dart';\nimport 'package:PiliPlus/plugin/pl_player/widgets/common_btn.dart';\nimport 'package:PiliPlus/services/shutdown_timer_service.dart'\n    show shutdownTimerService;\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:floating/floating.dart';\nimport 'package:flutter/material.dart';\nimport 'package:font_awesome_flutter/font_awesome_flutter.dart';\nimport 'package:get/get.dart';\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\n\nclass LiveHeaderControl extends StatefulWidget {\n  const LiveHeaderControl({\n    super.key,\n    required this.title,\n    required this.upName,\n    required this.plPlayerController,\n    required this.onSendDanmaku,\n    required this.onPlayAudio,\n    required this.isPortrait,\n    required this.liveController,\n  });\n\n  final String? title;\n  final String? upName;\n  final PlPlayerController plPlayerController;\n  final VoidCallback onSendDanmaku;\n  final VoidCallback onPlayAudio;\n  final bool isPortrait;\n  final LiveRoomController liveController;\n\n  @override\n  State<LiveHeaderControl> createState() => _LiveHeaderControlState();\n}\n\nclass _LiveHeaderControlState extends State<LiveHeaderControl>\n    with TimeBatteryMixin {\n  @override\n  late final plPlayerController = widget.plPlayerController;\n\n  @override\n  bool get horizontalScreen => true;\n\n  @override\n  bool get isFullScreen => plPlayerController.isFullScreen.value;\n\n  @override\n  bool get isPortrait => widget.isPortrait;\n\n  @override\n  Widget build(BuildContext context) {\n    final isFullScreen = this.isFullScreen;\n    showCurrTimeIfNeeded(isFullScreen);\n    final liveController = widget.liveController;\n    Widget child;\n    child = Obx(\n      key: titleKey,\n      () => MarqueeText(\n        liveController.title.value,\n        spacing: 30,\n        velocity: 30,\n        style: const TextStyle(\n          fontSize: 15,\n          height: 1,\n          color: Colors.white,\n        ),\n      ),\n    );\n    if (isFullScreen) {\n      child = Column(\n        spacing: 5,\n        mainAxisSize: MainAxisSize.min,\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          child,\n          Row(\n            spacing: 10,\n            children: [\n              if (widget.upName case final upName?)\n                Text(\n                  upName,\n                  style: const TextStyle(\n                    fontSize: 12,\n                    color: Colors.white,\n                  ),\n                ),\n              liveController.watchedWidget,\n              liveController.onlineWidget,\n              liveController.timeWidget,\n            ],\n          ),\n        ],\n      );\n    }\n    child = Expanded(child: child);\n    return AppBar(\n      backgroundColor: Colors.transparent,\n      foregroundColor: Colors.white,\n      primary: false,\n      automaticallyImplyLeading: false,\n      titleSpacing: 14,\n      title: Row(\n        children: [\n          if (isFullScreen || plPlayerController.isDesktopPip)\n            ComBtn(\n              height: 30,\n              tooltip: '返回',\n              icon: const Icon(FontAwesomeIcons.arrowLeft, size: 15),\n              onTap: () {\n                if (plPlayerController.isDesktopPip) {\n                  plPlayerController.exitDesktopPip();\n                } else {\n                  plPlayerController.triggerFullScreen(status: false);\n                }\n              },\n            ),\n          child,\n          ...?timeBatteryWidgets,\n          const SizedBox(width: 10),\n          if (PlatformUtils.isDesktop && !plPlayerController.isDesktopPip)\n            Obx(() {\n              final isAlwaysOnTop = plPlayerController.isAlwaysOnTop.value;\n              return ComBtn(\n                height: 30,\n                tooltip: '${isAlwaysOnTop ? '取消' : ''}置顶',\n                icon: isAlwaysOnTop\n                    ? const Icon(\n                        size: 18,\n                        Icons.push_pin,\n                        color: Colors.white,\n                      )\n                    : const Icon(\n                        size: 18,\n                        Icons.push_pin_outlined,\n                        color: Colors.white,\n                      ),\n                onTap: () => plPlayerController.setAlwaysOnTop(!isAlwaysOnTop),\n              );\n            }),\n          if (isFullScreen || PlatformUtils.isDesktop)\n            ComBtn(\n              height: 30,\n              tooltip: '发弹幕',\n              icon: const Icon(\n                size: 18,\n                Icons.comment_outlined,\n                color: Colors.white,\n              ),\n              onTap: widget.onSendDanmaku,\n            ),\n          if (Platform.isAndroid || (PlatformUtils.isDesktop && !isFullScreen))\n            ComBtn(\n              height: 30,\n              tooltip: '画中画',\n              onTap: () async {\n                if (PlatformUtils.isDesktop) {\n                  plPlayerController.toggleDesktopPip();\n                  return;\n                }\n                if (await Floating().isPipAvailable) {\n                  plPlayerController.enterPip();\n                }\n              },\n              icon: const Icon(\n                size: 18,\n                Icons.picture_in_picture_outlined,\n                color: Colors.white,\n              ),\n            ),\n          Obx(\n            () {\n              final onlyPlayAudio = plPlayerController.onlyPlayAudio.value;\n              return ComBtn(\n                height: 30,\n                tooltip: '仅播放音频',\n                onTap: () {\n                  plPlayerController.onlyPlayAudio.value = !onlyPlayAudio;\n                  widget.onPlayAudio();\n                },\n                icon: onlyPlayAudio\n                    ? const Icon(\n                        size: 18,\n                        MdiIcons.musicCircle,\n                        color: Colors.white,\n                      )\n                    : const Icon(\n                        size: 18,\n                        MdiIcons.musicCircleOutline,\n                        color: Colors.white,\n                      ),\n              );\n            },\n          ),\n          Obx(() {\n            final continuePlayInBackground =\n                plPlayerController.continuePlayInBackground.value;\n            return ComBtn(\n              height: 30,\n              tooltip: '${continuePlayInBackground ? '关闭' : ''}后台播放',\n              onTap: plPlayerController.setContinuePlayInBackground,\n              icon: continuePlayInBackground\n                  ? const Icon(\n                      size: 18,\n                      Icons.play_circle,\n                      color: Colors.white,\n                    )\n                  : const Icon(\n                      size: 18,\n                      Icons.play_circle_outline,\n                      color: Colors.white,\n                    ),\n            );\n          }),\n          ComBtn(\n            height: 30,\n            tooltip: '定时关闭',\n            onTap: () => shutdownTimerService.showScheduleExitDialog(\n              context,\n              isFullScreen: isFullScreen,\n              isLive: true,\n            ),\n            icon: const Icon(\n              size: 18,\n              Icons.schedule,\n              color: Colors.white,\n            ),\n          ),\n          ComBtn(\n            height: 30,\n            tooltip: '播放信息',\n            onTap: () => HeaderControlState.showPlayerInfo(\n              context,\n              plPlayerController: plPlayerController,\n            ),\n            icon: const Icon(\n              size: 18,\n              Icons.info_outline,\n              color: Colors.white,\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/live_search/child/controller.dart",
    "content": "import 'package:PiliPlus/http/live.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/live/live_search_type.dart';\nimport 'package:PiliPlus/models_new/live/live_search/data.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:PiliPlus/pages/live_search/controller.dart';\n\nclass LiveSearchChildController\n    extends CommonListController<LiveSearchData, dynamic> {\n  LiveSearchChildController(this.controller, this.searchType);\n\n  final LiveSearchController controller;\n  final LiveSearchType searchType;\n\n  @override\n  void checkIsEnd(int length) {\n    switch (searchType) {\n      case LiveSearchType.room:\n        if (controller.counts.first != -1 &&\n            length >= controller.counts.first) {\n          isEnd = true;\n        }\n        break;\n      case LiveSearchType.user:\n        if (controller.counts[1] != -1 && length >= controller.counts[1]) {\n          isEnd = true;\n        }\n        break;\n    }\n  }\n\n  @override\n  List? getDataList(response) {\n    switch (searchType) {\n      case LiveSearchType.room:\n        controller.counts[searchType.index] = response.room?.totalRoom ?? 0;\n        return response.room?.list;\n      case LiveSearchType.user:\n        controller.counts[searchType.index] = response.user?.totalUser ?? 0;\n        return response.user?.list;\n    }\n  }\n\n  @override\n  Future<LoadingState<LiveSearchData>> customGetData() {\n    return LiveHttp.liveSearch(\n      page: page,\n      keyword: controller.editingController.text,\n      type: searchType,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/live_search/child/view.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/skeleton/msg_feed_top.dart';\nimport 'package:PiliPlus/common/skeleton/video_card_v.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/live/live_search_type.dart';\nimport 'package:PiliPlus/pages/live_search/child/controller.dart';\nimport 'package:PiliPlus/pages/live_search/widgets/live_search_room.dart';\nimport 'package:PiliPlus/pages/live_search/widgets/live_search_user.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart'\n    hide SliverGridDelegateWithMaxCrossAxisExtent;\nimport 'package:get/get.dart';\n\nclass LiveSearchChildPage extends StatefulWidget {\n  const LiveSearchChildPage({\n    super.key,\n    required this.controller,\n    required this.searchType,\n  });\n\n  final LiveSearchChildController controller;\n  final LiveSearchType searchType;\n\n  @override\n  State<LiveSearchChildPage> createState() => _LiveSearchChildPageState();\n}\n\nclass _LiveSearchChildPageState extends State<LiveSearchChildPage>\n    with AutomaticKeepAliveClientMixin {\n  LiveSearchChildController get _controller => widget.controller;\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    double padding = widget.searchType == LiveSearchType.room ? 12 : 0;\n    return refreshIndicator(\n      onRefresh: _controller.onRefresh,\n      child: CustomScrollView(\n        controller: _controller.scrollController,\n        physics: const AlwaysScrollableScrollPhysics(),\n        slivers: [\n          SliverPadding(\n            padding: EdgeInsets.only(\n              top: padding,\n              left: padding,\n              right: padding,\n              bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n            ),\n            sliver: Obx(() => _buildBody(_controller.loadingState.value)),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget get _buildLoading {\n    return switch (widget.searchType) {\n      LiveSearchType.room => SliverGrid.builder(\n        gridDelegate: roomDelegate,\n        itemBuilder: (context, index) => const VideoCardVSkeleton(),\n        itemCount: 10,\n      ),\n      LiveSearchType.user => SliverGrid.builder(\n        gridDelegate: userDelegate,\n        itemBuilder: (context, index) => const MsgFeedTopSkeleton(),\n        itemCount: 12,\n      ),\n    };\n  }\n\n  late final roomDelegate = SliverGridDelegateWithExtentAndRatio(\n    mainAxisSpacing: StyleString.cardSpace,\n    crossAxisSpacing: StyleString.cardSpace,\n    maxCrossAxisExtent: Grid.smallCardWidth,\n    childAspectRatio: StyleString.aspectRatio,\n    mainAxisExtent: MediaQuery.textScalerOf(context).scale(60),\n  );\n\n  late final userDelegate = SliverGridDelegateWithMaxCrossAxisExtent(\n    maxCrossAxisExtent: Grid.smallCardWidth * 2,\n    mainAxisExtent: 60,\n  );\n\n  Widget _buildBody(LoadingState<List?> loadingState) {\n    return switch (loadingState) {\n      Loading() => _buildLoading,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? Builder(\n                builder: (context) {\n                  return switch (widget.searchType) {\n                    LiveSearchType.room => SliverGrid.builder(\n                      gridDelegate: roomDelegate,\n                      itemBuilder: (context, index) {\n                        if (index == response.length - 1) {\n                          _controller.onLoadMore();\n                        }\n                        return LiveCardVSearch(\n                          item: response[index],\n                        );\n                      },\n                      itemCount: response.length,\n                    ),\n                    LiveSearchType.user => SliverGrid.builder(\n                      gridDelegate: userDelegate,\n                      itemBuilder: (context, index) {\n                        if (index == response.length - 1) {\n                          _controller.onLoadMore();\n                        }\n                        return LiveSearchUserItem(\n                          item: response[index],\n                        );\n                      },\n                      itemCount: response.length,\n                    ),\n                  };\n                },\n              )\n            : HttpError(onReload: _controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n\n  @override\n  bool get wantKeepAlive => true;\n}\n"
  },
  {
    "path": "lib/pages/live_search/controller.dart",
    "content": "import 'package:PiliPlus/models/common/live/live_search_type.dart';\nimport 'package:PiliPlus/pages/live_search/child/controller.dart';\nimport 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass LiveSearchController extends GetxController\n    with GetSingleTickerProviderStateMixin {\n  late final TabController tabController;\n  final editingController = TextEditingController();\n  final focusNode = FocusNode();\n\n  final mid = Get.parameters['mid'];\n  final uname = Get.parameters['uname'];\n\n  final RxBool hasData = false.obs;\n  final RxList<int> counts = <int>[-1, -1].obs;\n\n  late final roomCtr = Get.put(\n    LiveSearchChildController(this, LiveSearchType.room),\n    tag: Utils.generateRandomString(8),\n  );\n  late final userCtr = Get.put(\n    LiveSearchChildController(this, LiveSearchType.user),\n    tag: Utils.generateRandomString(8),\n  );\n\n  @override\n  void onInit() {\n    super.onInit();\n    tabController = TabController(vsync: this, length: 2);\n  }\n\n  void onClear() {\n    if (editingController.value.text.isNotEmpty) {\n      editingController.clear();\n      counts.value = <int>[-1, -1];\n      hasData.value = false;\n      focusNode.requestFocus();\n    } else {\n      Get.back();\n    }\n  }\n\n  void submit() {\n    if (editingController.text.isNotEmpty) {\n      if (IdUtils.digitOnlyRegExp.hasMatch(editingController.text)) {\n        PageUtils.toLiveRoom(int.parse(editingController.text));\n      } else {\n        hasData.value = true;\n        roomCtr\n          ..scrollController.jumpToTop()\n          ..onReload();\n        userCtr\n          ..scrollController.jumpToTop()\n          ..onReload();\n      }\n    }\n  }\n\n  @override\n  void onClose() {\n    editingController.dispose();\n    focusNode.dispose();\n    tabController.dispose();\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "lib/pages/live_search/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/common/widgets/view_safe_area.dart';\nimport 'package:PiliPlus/models/common/live/live_search_type.dart';\nimport 'package:PiliPlus/pages/live_search/child/view.dart';\nimport 'package:PiliPlus/pages/live_search/controller.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass LiveSearchPage extends StatefulWidget {\n  const LiveSearchPage({super.key});\n\n  @override\n  State<LiveSearchPage> createState() => _LiveSearchPageState();\n}\n\nclass _LiveSearchPageState extends State<LiveSearchPage> {\n  final _controller = Get.put(\n    LiveSearchController(),\n    tag: Utils.generateRandomString(8),\n  );\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        actions: [\n          IconButton(\n            tooltip: '搜索',\n            onPressed: _controller.submit,\n            icon: const Icon(Icons.search, size: 22),\n          ),\n          const SizedBox(width: 10),\n        ],\n        title: TextField(\n          autofocus: true,\n          focusNode: _controller.focusNode,\n          controller: _controller.editingController,\n          textInputAction: TextInputAction.search,\n          textAlignVertical: TextAlignVertical.center,\n          decoration: InputDecoration(\n            hintText: '搜索房间或主播',\n            visualDensity: .standard,\n            border: InputBorder.none,\n            suffixIcon: IconButton(\n              tooltip: '清空',\n              icon: const Icon(Icons.clear, size: 22),\n              onPressed: _controller.onClear,\n            ),\n          ),\n          onSubmitted: (value) => _controller.submit(),\n          onChanged: (value) {\n            if (value.isEmpty) {\n              _controller.hasData.value = false;\n            }\n          },\n        ),\n      ),\n      body: ViewSafeArea(\n        child: Obx(() {\n          return Opacity(\n            opacity: _controller.hasData.value ? 1 : 0,\n            child: Column(\n              children: [\n                TabBar(\n                  controller: _controller.tabController,\n                  tabs: [\n                    Obx(\n                      () => Tab(\n                        text:\n                            '正在直播 ${_controller.counts[0] != -1 ? _controller.counts[0] : ''}',\n                      ),\n                    ),\n                    Obx(\n                      () => Tab(\n                        text:\n                            '主播 ${_controller.counts[1] != -1 ? _controller.counts[1] : ''}',\n                      ),\n                    ),\n                  ],\n                  onTap: (index) {\n                    if (!_controller.tabController.indexIsChanging) {\n                      if (index == 0) {\n                        _controller.roomCtr.animateToTop();\n                      } else {\n                        _controller.userCtr.animateToTop();\n                      }\n                    }\n                  },\n                ),\n                Expanded(\n                  child: tabBarView(\n                    controller: _controller.tabController,\n                    children: [\n                      LiveSearchChildPage(\n                        controller: _controller.roomCtr,\n                        searchType: LiveSearchType.room,\n                      ),\n                      LiveSearchChildPage(\n                        controller: _controller.userCtr,\n                        searchType: LiveSearchType.user,\n                      ),\n                    ],\n                  ),\n                ),\n              ],\n            ),\n          );\n        }),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/live_search/widgets/live_search_room.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models_new/live/live_search/room_item.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\n\n// 视频卡片 - 垂直布局\nclass LiveCardVSearch extends StatelessWidget {\n  final LiveSearchRoomItemModel item;\n\n  const LiveCardVSearch({\n    super.key,\n    required this.item,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    void onLongPress() => imageSaveDialog(\n      title: item.title,\n      cover: item.cover,\n    );\n    return Card(\n      clipBehavior: Clip.hardEdge,\n      child: InkWell(\n        onTap: () => PageUtils.toLiveRoom(item.roomid),\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            AspectRatio(\n              aspectRatio: StyleString.aspectRatio,\n              child: LayoutBuilder(\n                builder: (context, boxConstraints) {\n                  double maxWidth = boxConstraints.maxWidth;\n                  double maxHeight = boxConstraints.maxHeight;\n                  return Stack(\n                    clipBehavior: Clip.none,\n                    children: [\n                      NetworkImgLayer(\n                        src: item.cover!,\n                        width: maxWidth,\n                        height: maxHeight,\n                        type: .emote,\n                      ),\n                      Positioned(\n                        left: 0,\n                        right: 0,\n                        bottom: 0,\n                        child: AnimatedOpacity(\n                          opacity: 1,\n                          duration: const Duration(milliseconds: 200),\n                          child: videoStat(context),\n                        ),\n                      ),\n                    ],\n                  );\n                },\n              ),\n            ),\n            Padding(\n              padding: const EdgeInsets.fromLTRB(5, 8, 5, 4),\n              child: Text(\n                '${item.title}',\n                textAlign: TextAlign.start,\n                style: const TextStyle(\n                  letterSpacing: 0.3,\n                ),\n                maxLines: 2,\n                overflow: TextOverflow.ellipsis,\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget videoStat(BuildContext context) {\n    return Container(\n      height: 50,\n      padding: const EdgeInsets.only(top: 26, left: 10, right: 10),\n      decoration: const BoxDecoration(\n        gradient: LinearGradient(\n          begin: Alignment.topCenter,\n          end: Alignment.bottomCenter,\n          colors: <Color>[\n            Colors.transparent,\n            Colors.black54,\n          ],\n          tileMode: TileMode.mirror,\n        ),\n      ),\n      child: Row(\n        mainAxisAlignment: MainAxisAlignment.spaceBetween,\n        children: [\n          Text(\n            '${item.name}',\n            style: const TextStyle(fontSize: 11, color: Colors.white),\n          ),\n          if (item.watchedShow?.textLarge case final textLarge?)\n            Text(\n              textLarge,\n              style: const TextStyle(fontSize: 11, color: Colors.white),\n            ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/live_search/widgets/live_search_user.dart",
    "content": "import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models_new/live/live_search/user_item.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:flutter/material.dart';\n\nclass LiveSearchUserItem extends StatelessWidget {\n  const LiveSearchUserItem({\n    super.key,\n    required this.item,\n  });\n\n  final LiveSearchUserItemModel item;\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    final style = TextStyle(\n      fontSize: 13,\n      color: theme.colorScheme.outline,\n    );\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onTap: () => PageUtils.toLiveRoom(item.roomid),\n        child: Row(\n          children: [\n            const SizedBox(width: 15),\n            NetworkImgLayer(\n              src: item.face,\n              width: 42,\n              height: 42,\n              type: ImageType.avatar,\n            ),\n            const SizedBox(width: 10),\n            Column(\n              mainAxisSize: MainAxisSize.max,\n              crossAxisAlignment: CrossAxisAlignment.start,\n              mainAxisAlignment: MainAxisAlignment.center,\n              children: [\n                Row(\n                  children: [\n                    Text(\n                      item.name!,\n                      style: const TextStyle(\n                        fontSize: 14,\n                      ),\n                    ),\n                    if (item.liveStatus == 1) ...[\n                      const SizedBox(width: 10),\n                      Image.asset(\n                        height: 14,\n                        cacheHeight: 14.cacheSize(context),\n                        'assets/images/live/live.gif',\n                      ),\n                    ],\n                  ],\n                ),\n                const SizedBox(height: 2),\n                Text(\n                  '分区: ${item.areaName ?? ''}    关注数: ${NumUtils.numFormat(item.fansNum ?? 0)}',\n                  style: style,\n                ),\n              ],\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/log_table/controller.dart",
    "content": "import 'package:PiliPlus/pages/common/common_list_controller.dart';\n\nabstract class LogController<R, T> extends CommonListController<R, T> {\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  String get title;\n\n  T get header;\n\n  List<(int, String)> getFlexAndText(T item);\n}\n"
  },
  {
    "path": "lib/pages/log_table/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/pages/log_table/controller.dart';\nimport 'package:PiliPlus/utils/extension/widget_ext.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass LogPage<T> extends StatefulWidget {\n  const LogPage({super.key});\n\n  @override\n  State<LogPage<T>> createState() => _LogPageState<T>();\n}\n\nclass _LogPageState<T> extends State<LogPage<T>> {\n  final _controller = Get.put<LogController<dynamic, T>>(Get.arguments);\n\n  @override\n  Widget build(BuildContext context) {\n    final padding = MediaQuery.viewPaddingOf(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(title: Text(_controller.title)),\n      body: CustomScrollView(\n        slivers: [\n          SliverPadding(\n            padding: EdgeInsets.only(\n              left: 10 + padding.left,\n              right: 10 + padding.right,\n              bottom: padding.bottom + 100,\n            ),\n            sliver: Obx(() => _buildBody(_controller.loadingState.value)),\n          ),\n        ],\n      ).constraintWidth(constraints: const BoxConstraints(maxWidth: 680)),\n    );\n  }\n\n  Widget _buildBody(LoadingState<List<T>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => linearLoading,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? Builder(\n                builder: (context) {\n                  final them = Theme.of(context);\n                  final outline = them.colorScheme.outline.withValues(\n                    alpha: 0.1,\n                  );\n                  final divider = Divider(\n                    height: 1,\n                    color: outline,\n                  );\n                  final sliverDivider = SliverToBoxAdapter(\n                    child: divider,\n                  );\n                  final dividerV = VerticalDivider(\n                    width: 1,\n                    color: outline,\n                  );\n                  return SliverMainAxisGroup(\n                    slivers: [\n                      sliverDivider,\n                      SliverToBoxAdapter(\n                        child: ColoredBox(\n                          color: them.colorScheme.onInverseSurface,\n                          child: _item(\n                            _controller.header,\n                            dividerV,\n                            isHeader: true,\n                          ),\n                        ),\n                      ),\n                      sliverDivider,\n                      SliverList.separated(\n                        itemCount: response.length,\n                        itemBuilder: (context, index) {\n                          return _item(response[index], dividerV);\n                        },\n                        separatorBuilder: (context, index) => divider,\n                      ),\n                      sliverDivider,\n                    ],\n                  );\n                },\n              )\n            : HttpError(onReload: _controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n\n  Widget _item(T item, Widget divider, {bool isHeader = false}) {\n    Widget text(int flex, String text) => Expanded(\n      flex: flex,\n      child: Padding(\n        padding: isHeader\n            ? const EdgeInsets.symmetric(vertical: 6)\n            : const EdgeInsets.symmetric(vertical: 8),\n        child: Center(\n          child: Text(\n            text,\n            textAlign: TextAlign.center,\n            style: isHeader\n                ? const TextStyle(fontSize: 13, fontWeight: FontWeight.bold)\n                : const TextStyle(fontSize: 13),\n          ),\n        ),\n      ),\n    );\n\n    Widget content = Row(\n      children: [\n        divider,\n        for (final (i, j) in _controller.getFlexAndText(item)) ...[\n          text(i, j),\n          divider,\n        ],\n      ],\n    );\n    return IntrinsicHeight(\n      child: isHeader ? content : SelectionArea(child: content),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/login/controller.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/radio_widget.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/login.dart';\nimport 'package:PiliPlus/models/common/account_type.dart';\nimport 'package:PiliPlus/models/login/model.dart';\nimport 'package:PiliPlus/pages/login/geetest/geetest_webview_dialog.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/accounts/account.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:dio/dio.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:gt3_flutter_plugin/gt3_flutter_plugin.dart';\n\nclass LoginPageController extends GetxController\n    with GetSingleTickerProviderStateMixin {\n  final TextEditingController telTextController = TextEditingController();\n  final TextEditingController usernameTextController = TextEditingController();\n  final TextEditingController passwordTextController = TextEditingController();\n  final TextEditingController smsCodeTextController = TextEditingController();\n  final TextEditingController cookieTextController = TextEditingController();\n\n  late final codeInfo =\n      LoadingState<({String authCode, String url})>.loading().obs;\n\n  late final TabController tabController;\n\n  late final Gt3FlutterPlugin captcha = Gt3FlutterPlugin();\n\n  late final CaptchaDataModel captchaData = CaptchaDataModel();\n  late final RxInt qrCodeLeftTime = 180.obs;\n  late final RxString statusQRCode = ''.obs;\n\n  late var selectedCountryCodeId = Constants.internationalDialingPrefix.first;\n  late String captchaKey = '';\n  late final RxInt smsSendCooldown = 0.obs;\n  late int smsSendTimestamp = 0;\n\n  // 定时器\n  Timer? qrCodeTimer;\n  Timer? smsSendCooldownTimer;\n\n  bool _isReq = false;\n\n  @override\n  void onInit() {\n    super.onInit();\n    tabController = TabController(length: 4, vsync: this)\n      ..addListener(_handleTabChange);\n  }\n\n  @override\n  void onClose() {\n    tabController\n      ..removeListener(_handleTabChange)\n      ..dispose();\n    qrCodeTimer?.cancel();\n    smsSendCooldownTimer?.cancel();\n    telTextController.dispose();\n    usernameTextController.dispose();\n    passwordTextController.dispose();\n    smsCodeTextController.dispose();\n    cookieTextController.dispose();\n    super.onClose();\n  }\n\n  Future<void> refreshQRCode() async {\n    final res = await LoginHttp.getHDcode();\n    if (res case Success(:final response)) {\n      qrCodeTimer?.cancel();\n      codeInfo.value = res;\n      qrCodeTimer = Timer.periodic(const Duration(milliseconds: 1000), (t) {\n        final left = 180 - t.tick;\n        if (left <= 0) {\n          t.cancel();\n          statusQRCode.value = '二维码已过期，请刷新';\n          qrCodeLeftTime.value = 0;\n          return;\n        }\n        qrCodeLeftTime.value = left;\n        if (_isReq || tabController.index != 2) return;\n\n        _isReq = true;\n        LoginHttp.codePoll(response.authCode).then((value) async {\n          _isReq = false;\n          if (value['status']) {\n            t.cancel();\n            statusQRCode.value = '扫码成功';\n            await setAccount(\n              value['data'],\n              value['data']['cookie_info']['cookies'],\n            );\n            Get.back();\n          } else if (value['code'] == 86038) {\n            t.cancel();\n            qrCodeLeftTime.value = 0;\n          } else {\n            statusQRCode.value = value['msg'];\n          }\n        });\n      });\n    }\n  }\n\n  void _handleTabChange() {\n    if (tabController.index == 2) {\n      if (qrCodeTimer == null || !qrCodeTimer!.isActive) {\n        refreshQRCode();\n      }\n    }\n  }\n\n  // 申请极验验证码\n  void getCaptcha(\n    String geeGt,\n    String geeChallenge,\n    VoidCallback onSuccess,\n  ) {\n    void updateCaptchaData(Map json) {\n      captchaData\n        ..validate = json['geetest_validate']\n        ..seccode = json['geetest_seccode']\n        ..geetest = GeetestData(\n          challenge: json['geetest_challenge'],\n          gt: geeGt,\n        );\n      SmartDialog.showToast('验证成功');\n      onSuccess();\n    }\n\n    if (PlatformUtils.isDesktop) {\n      showDialog<Map<String, dynamic>>(\n        context: Get.context!,\n        builder: (context) => GeetestWebviewDialog(geeGt, geeChallenge),\n      ).then((res) {\n        if (res != null) {\n          updateCaptchaData(res);\n        }\n      });\n    } else {\n      final registerData = Gt3RegisterData(\n        challenge: geeChallenge,\n        gt: geeGt,\n        success: true,\n      );\n\n      captcha\n        ..addEventHandler(\n          onShow: (Map<String, dynamic> message) {},\n          onClose: (Map<String, dynamic> message) {\n            SmartDialog.showToast('关闭验证');\n          },\n          onResult: (Map<String, dynamic> message) {\n            if (kDebugMode) debugPrint(\"Captcha result: $message\");\n            final String code = message[\"code\"];\n            if (code == \"1\") {\n              // 发送 message[\"result\"] 中的数据向 B 端的业务服务接口进行查询\n              updateCaptchaData(message['result']);\n            } else {\n              // 终端用户完成验证失败，自动重试 If the verification fails, it will be automatically retried.\n              if (kDebugMode) debugPrint(\"Captcha result code : $code\");\n            }\n          },\n          onError: (Map<String, dynamic> message) {\n            SmartDialog.showToast(\"Captcha onError: $message\");\n            String code = message[\"code\"];\n            // 处理验证中返回的错误 Handling errors returned in verification\n            if (Platform.isAndroid) {\n              // Android 平台\n              if (code == \"-2\") {\n                // Dart 调用异常 Call exception\n              } else if (code == \"-1\") {\n                // Gt3RegisterData 参数不合法 Parameter is invalid\n              } else if (code == \"201\") {\n                // 网络无法访问 Network inaccessible\n              } else if (code == \"202\") {\n                // Json 解析错误 Analysis error\n              } else if (code == \"204\") {\n                // WebView 加载超时，请检查是否混淆极验 SDK   Load timed out\n              } else if (code == \"204_1\") {\n                // WebView 加载前端页面错误，请查看日志 Error loading front-end page, please check the log\n              } else if (code == \"204_2\") {\n                // WebView 加载 SSLError\n              } else if (code == \"206\") {\n                // gettype 接口错误或返回为 null   API error or return null\n              } else if (code == \"207\") {\n                // getphp 接口错误或返回为 null    API error or return null\n              } else if (code == \"208\") {\n                // ajax 接口错误或返回为 null      API error or return null\n              } else {\n                // 更多错误码参考开发文档  More error codes refer to the development document\n                // https://docs.geetest.com/sensebot/apirefer/errorcode/android\n              }\n            }\n\n            if (Platform.isIOS) {\n              // iOS 平台\n              if (code == \"-1009\") {\n                // 网络无法访问 Network inaccessible\n              } else if (code == \"-1004\") {\n                // 无法查找到 HOST  Unable to find HOST\n              } else if (code == \"-1002\") {\n                // 非法的 URL  Illegal URL\n              } else if (code == \"-1001\") {\n                // 网络超时 Network timeout\n              } else if (code == \"-999\") {\n                // 请求被意外中断, 一般由用户进行取消操作导致 The interrupted request was usually caused by the user cancelling the operation\n              } else if (code == \"-21\") {\n                // 使用了重复的 challenge   Duplicate challenges are used\n                // 检查获取 challenge 是否进行了缓存  Check if the fetch challenge is cached\n              } else if (code == \"-20\") {\n                // 尝试过多, 重新引导用户触发验证即可 Try too many times, lead the user to request verification again\n              } else if (code == \"-10\") {\n                // 预判断时被封禁, 不会再进行图形验证 Banned during pre-judgment, and no more image captcha verification\n              } else if (code == \"-2\") {\n                // Dart 调用异常 Call exception\n              } else if (code == \"-1\") {\n                // Gt3RegisterData 参数不合法  Parameter is invalid\n              } else {\n                // 更多错误码参考开发文档 More error codes refer to the development document\n                // https://docs.geetest.com/sensebot/apirefer/errorcode/ios\n              }\n            }\n          },\n        )\n        ..startCaptcha(registerData);\n    }\n  }\n\n  // cookie登录\n  Future<void> loginByCookie() async {\n    if (cookieTextController.text.isEmpty) {\n      SmartDialog.showToast('cookie不能为空');\n      return;\n    }\n    try {\n      final result = await Request().get(\n        \"/x/member/web/account\",\n        options: Options(\n          headers: {\n            \"cookie\": cookieTextController.text,\n          },\n          extra: {'account': AnonymousAccount()},\n        ),\n      );\n      if (result.data['code'] == 0) {\n        try {\n          await LoginAccount(\n            BiliCookieJar.fromJson(\n              Map.fromEntries(\n                cookieTextController.text.split(';').map((item) {\n                  final list = item.split('=');\n                  return MapEntry(list.first, list.skip(1).join());\n                }),\n              ),\n            ),\n            null,\n            null,\n          ).onChange();\n          if (!Accounts.main.isLogin) await switchAccountDialog(Get.context!);\n          SmartDialog.showToast('登录成功');\n          Get.back();\n        } catch (e) {\n          SmartDialog.showToast(\"登录失败: $e\");\n        }\n      } else {\n        SmartDialog.showToast(\"哔哩哔哩登录已失效，请重新登录\");\n      }\n    } catch (e) {\n      SmartDialog.showToast(\"获取哔哩哔哩用户信息失败，可前往账号管理重试\");\n    }\n  }\n\n  // app端密码登录\n  Future<void> loginByPassword() async {\n    String username = usernameTextController.text;\n    String password = passwordTextController.text;\n    if (username.isEmpty || password.isEmpty) {\n      SmartDialog.showToast('用户名或密码不能为空');\n      return;\n    }\n    // if ((passwordFormKey.currentState as FormState).validate()) {\n    final webKeyRes = await LoginHttp.getWebKey();\n    if (!webKeyRes['status']) {\n      SmartDialog.showToast(webKeyRes['msg']);\n      return;\n    }\n    String salt = webKeyRes['data']['hash'];\n    String key = webKeyRes['data']['key'];\n    final res = await LoginHttp.loginByPwd(\n      username: username,\n      password: password,\n      key: key,\n      salt: salt,\n      geeValidate: captchaData.validate,\n      geeSeccode: captchaData.seccode,\n      geeChallenge: captchaData.geetest?.challenge,\n      recaptchaToken: captchaData.token,\n    );\n    if (res['status']) {\n      final data = res['data'];\n      if (data == null) {\n        SmartDialog.showToast('登录异常，接口未返回数据：${res[\"msg\"]}');\n        return;\n      }\n      if (data['status'] == 2) {\n        SmartDialog.showToast(data['message']);\n        if (Platform.isLinux) {\n          return;\n        }\n        // return;\n        //{\"code\":0,\"message\":\"0\",\"ttl\":1,\"data\":{\"status\":2,\"message\":\"本次登录环境存在风险, 需使用手机号进行验证或绑定\",\"url\":\"https://passport.bilibili.com/h5-app/passport/risk/verify?tmp_token=9e785433940891dfa78f033fb7928181&request_id=e5a6d6480df04097870be56c6e60f7ef&source=risk\",\"token_info\":null,\"cookie_info\":null,\"sso\":null,\"is_new\":false,\"is_tourist\":false}}\n        String url = data['url']!;\n        Uri currentUri = Uri.parse(url);\n        final safeCenterRes = await LoginHttp.safeCenterGetInfo(\n          tmpCode: currentUri.queryParameters['tmp_token']!,\n        );\n        //{\"code\":0,\"message\":\"0\",\"ttl\":1,\"data\":{\"account_info\":{\"hide_tel\":\"111*****111\",\"hide_mail\":\"aaa*****aaaa.aaa\",\"bind_mail\":true,\"bind_tel\":true,\"tel_verify\":true,\"mail_verify\":true,\"unneeded_check\":false,\"bind_safe_question\":false,\"mid\":1111111},\"member_info\":{\"nickname\":\"xxxxxxx\",\"face\":\"https://i0.hdslb.com/bfs/face/xxxxxxx.jpg\",\"realname_status\":false},\"sns_info\":{\"bind_google\":false,\"bind_fb\":false,\"bind_apple\":false,\"bind_qq\":true,\"bind_weibo\":true,\"bind_wechat\":false},\"account_safe\":{\"score\":80}}}\n        if (!safeCenterRes['status']) {\n          SmartDialog.showToast(\n            \"获取安全验证信息失败，请尝试其它登录方式\\n\"\n            \"(${safeCenterRes['code']}) ${safeCenterRes['msg']}\",\n          );\n          return;\n        }\n        Map<String, String> accountInfo = {\n          \"hindTel\": safeCenterRes['data']['account_info']![\"hide_tel\"],\n          \"hindMail\": safeCenterRes['data']['account_info']![\"hide_mail\"],\n        };\n        if (!safeCenterRes['data']['account_info']!['tel_verify']) {\n          SmartDialog.showToast(\"当前账号未支持手机号验证，请尝试其它登录方式\");\n          return;\n        }\n\n        TextEditingController textFieldController = TextEditingController();\n        String captchaKey = '';\n        showDialog(\n          context: Get.context!,\n          builder: (context) => AlertDialog(\n            titlePadding: const EdgeInsets.only(\n              left: 16,\n              top: 18,\n              right: 16,\n              bottom: 12,\n            ),\n            contentPadding: const EdgeInsets.symmetric(horizontal: 16),\n            actionsPadding: const EdgeInsets.symmetric(\n              horizontal: 16,\n              vertical: 12,\n            ),\n            title: const Text(\n              \"本次登录需要验证您的手机号\",\n              textAlign: TextAlign.center,\n            ),\n            content: Column(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                Text(\n                  accountInfo['hindTel'] ?? '未能获取手机号',\n                  style: const TextStyle(fontSize: 18),\n                ),\n                // 带有清空按钮的输入框\n                TextField(\n                  style: const TextStyle(fontSize: 15),\n                  controller: textFieldController,\n                  textAlign: TextAlign.center,\n                  decoration: InputDecoration(\n                    hintText: \"请输入短信验证码\",\n                    hintStyle: const TextStyle(fontSize: 15),\n                    suffixIcon: iconButton(\n                      icon: const Icon(Icons.clear),\n                      size: 32,\n                      onPressed: textFieldController.clear,\n                    ),\n                    suffixIconConstraints: const BoxConstraints(\n                      maxHeight: 32,\n                      maxWidth: 32,\n                    ),\n                  ),\n                ),\n              ],\n            ),\n            actions: <Widget>[\n              TextButton(\n                child: const Text(\"发送验证码\"),\n                onPressed: () async {\n                  final preCaptureRes = await LoginHttp.preCapture();\n                  if (!preCaptureRes['status'] ||\n                      preCaptureRes['data'] == null) {\n                    SmartDialog.showToast(\n                      \"获取验证码失败，请尝试其它登录方式\\n\"\n                      \"(${preCaptureRes['code']}) ${preCaptureRes['msg']} ${preCaptureRes['data']}\",\n                    );\n                  }\n                  String geeGt = preCaptureRes['data']['gee_gt'];\n                  String geeChallenge = preCaptureRes['data']['gee_challenge'];\n                  captchaData.token = preCaptureRes['data']['recaptcha_token'];\n                  if (!isGeeArgumentValid(geeGt, geeChallenge)) {\n                    SmartDialog.showToast(\n                      \"获取极验参数为空，请尝试其它登录方式\\n\"\n                      \"(${preCaptureRes['code']}) ${preCaptureRes['msg']} ${preCaptureRes['data']}\",\n                    );\n                    return;\n                  }\n\n                  getCaptcha(\n                    geeGt,\n                    geeChallenge,\n                    () async {\n                      final safeCenterSendSmsCodeRes =\n                          await LoginHttp.safeCenterSmsCode(\n                            tmpCode: currentUri.queryParameters['tmp_token']!,\n                            geeChallenge: geeChallenge,\n                            geeSeccode: captchaData.seccode,\n                            geeValidate: captchaData.validate,\n                            recaptchaToken: captchaData.token,\n                            refererUrl: url,\n                          );\n                      if (!safeCenterSendSmsCodeRes['status']) {\n                        SmartDialog.showToast(\n                          \"发送短信验证码失败，请尝试其它登录方式\\n\"\n                          \"(${safeCenterSendSmsCodeRes['code']}) ${safeCenterSendSmsCodeRes['msg']}\",\n                        );\n                        return;\n                      }\n                      SmartDialog.showToast(\"短信验证码已发送，请查收\");\n                      captchaKey =\n                          safeCenterSendSmsCodeRes['data']['captcha_key'];\n                    },\n                  );\n                },\n              ),\n              TextButton(\n                onPressed: Get.back,\n                child: Text(\n                  \"取消\",\n                  style: TextStyle(color: Get.theme.colorScheme.outline),\n                ),\n              ),\n              TextButton(\n                onPressed: () async {\n                  String? code = textFieldController.text;\n                  if (code.isEmpty) {\n                    SmartDialog.showToast(\"请输入短信验证码\");\n                    return;\n                  }\n                  final safeCenterSmsVerifyRes =\n                      await LoginHttp.safeCenterSmsVerify(\n                        code: code,\n                        tmpCode: currentUri.queryParameters['tmp_token']!,\n                        requestId: currentUri.queryParameters['request_id']!,\n                        source: currentUri.queryParameters['source']!,\n                        captchaKey: captchaKey,\n                        refererUrl: url,\n                      );\n                  if (!safeCenterSmsVerifyRes['status']) {\n                    SmartDialog.showToast(\n                      \"验证短信验证码失败，请尝试其它登录方式\\n\"\n                      \"(${safeCenterSmsVerifyRes['code']}) ${safeCenterSmsVerifyRes['msg']}\",\n                    );\n                    return;\n                  }\n                  SmartDialog.showToast(\"验证成功，正在登录\");\n                  final oauth2AccessTokenRes =\n                      await LoginHttp.oauth2AccessToken(\n                        code: safeCenterSmsVerifyRes['data']['code'],\n                      );\n                  if (!oauth2AccessTokenRes['status']) {\n                    SmartDialog.showToast(\n                      \"登录失败，请尝试其它登录方式\\n\"\n                      \"(${oauth2AccessTokenRes['code']}) ${oauth2AccessTokenRes['msg']}\",\n                    );\n                    return;\n                  }\n                  final data = oauth2AccessTokenRes['data'];\n                  if (data['token_info'] == null ||\n                      data['cookie_info'] == null) {\n                    SmartDialog.showToast(\n                      '登录异常，接口未返回身份信息，可能是因为账号风控，请尝试其它登录方式。\\n${oauth2AccessTokenRes[\"msg\"]}，\\n $data',\n                    );\n                    return;\n                  }\n                  SmartDialog.showToast('正在保存身份信息');\n                  await setAccount(\n                    data['token_info'],\n                    data['cookie_info']['cookies'],\n                  );\n                  Get\n                    ..back()\n                    ..back();\n                },\n                child: const Text(\"确认\"),\n              ),\n            ],\n          ),\n        ).whenComplete(textFieldController.dispose);\n\n        return;\n      }\n      if (data['token_info'] == null || data['cookie_info'] == null) {\n        SmartDialog.showToast(\n          '登录异常，接口未返回身份信息，可能是因为账号风控，请尝试其它登录方式。\\n${res[\"msg\"]}，\\n $data',\n        );\n        return;\n      }\n      SmartDialog.showToast('正在保存身份信息');\n      await setAccount(data['token_info'], data['cookie_info']['cookies']);\n      Get.back();\n    } else {\n      // handle login result\n      switch (res['code']) {\n        case 0:\n          // login success\n          break;\n        case -105 when (!Platform.isLinux):\n          String captureUrl = res['data']['url'];\n          Uri captureUri = Uri.parse(captureUrl);\n          captchaData.token = captureUri.queryParameters['recaptcha_token']!;\n          String geeGt = captureUri.queryParameters['gee_gt']!;\n          String geeChallenge = captureUri.queryParameters['gee_challenge']!;\n\n          getCaptcha(geeGt, geeChallenge, loginByPassword);\n          break;\n        default:\n          SmartDialog.showToast(res['msg']);\n          // login failed\n          break;\n      }\n    }\n    // }\n  }\n\n  // 短信验证码登录\n  Future<void> loginBySmsCode() async {\n    if (telTextController.text.isEmpty) {\n      SmartDialog.showToast('手机号不能为空');\n      return;\n    }\n    if (captchaKey.isEmpty) {\n      SmartDialog.showToast('请先点击获取验证码');\n      return;\n    }\n    if (smsCodeTextController.text.isEmpty) {\n      SmartDialog.showToast('验证码不能为空');\n      return;\n    }\n    if (DateTime.now().millisecondsSinceEpoch - smsSendTimestamp >\n        1000 * 60 * 5) {\n      SmartDialog.showToast('验证码已过期，请重新获取');\n      return;\n    }\n    final webKeyRes = await LoginHttp.getWebKey();\n    if (!webKeyRes['status']) {\n      SmartDialog.showToast(webKeyRes['msg']);\n      return;\n    }\n    String key = webKeyRes['data']['key'];\n    final res = await LoginHttp.loginBySms(\n      tel: telTextController.text,\n      code: smsCodeTextController.text,\n      captchaKey: captchaKey,\n      cid: selectedCountryCodeId.countryId,\n      key: key,\n    );\n    if (res['status']) {\n      SmartDialog.showToast('登录成功');\n      final data = res['data'];\n      await setAccount(data['token_info'], data['cookie_info']['cookies']);\n      Get.back();\n    } else {\n      SmartDialog.showToast(res['msg']);\n    }\n  }\n\n  // app端验证码\n  Future<void> sendSmsCode() async {\n    if (telTextController.text.isEmpty) {\n      SmartDialog.showToast('手机号不能为空');\n      return;\n    }\n    // String? guestId;\n    // final webKeyRes = await LoginHttp.getWebKey();\n    // if (!webKeyRes['status']) {\n    //   SmartDialog.showToast(webKeyRes['msg']);\n    // } else {\n    //   String key = webKeyRes['data']['key'];\n    //   final guestIdRes = await LoginHttp.getGuestId(key);\n    //   if (!guestIdRes['status']) {\n    //     SmartDialog.showToast(guestIdRes['msg']);\n    //   } else {\n    //     guestId = guestIdRes['data']['guest_id'];\n    //   }\n    // }\n    // final preCaptureRes = await LoginHttp.preCapture();\n    // if (!preCaptureRes['status']) {\n    //   SmartDialog.showToast(\"获取验证码失败，请尝试其它登录方式\\n\"\n    //       \"(${preCaptureRes['code']}) ${preCaptureRes['msg']}\");\n    //   return;\n    // }\n    // String geeGt = preCaptureRes['data']['gee_gt']!;\n    // String geeChallenge = preCaptureRes['data']['gee_challenge'];\n    // captchaData.token = preCaptureRes['data']['recaptcha_token']!;\n\n    // getCaptcha(geeGt, geeChallenge, () async {\n\n    // final safeCenterSendSmsCodeRes =\n    // await LoginHttp.safeCenterSmsCode(\n    //   tmpCode: currentUri.queryParameters['tmp_token']!,\n    //   geeChallenge: geeChallenge,\n    //   geeSeccode: captchaData.seccode!,\n    //   geeValidate: captchaData.validate!,\n    //   recaptchaToken: captchaData.token!,\n    //   refererUrl: url,\n    // );\n    // if (!safeCenterSendSmsCodeRes['status']) {\n    //   SmartDialog.showToast(\"发送短信验证码失败，请尝试其它登录方式\\n\"\n    //       \"(${safeCenterSendSmsCodeRes['code']}) ${safeCenterSendSmsCodeRes['msg']}\");\n    //   return;\n    // }\n    // SmartDialog.showToast(\"短信验证码已发送，请查收\");\n    // captchaKey = safeCenterSendSmsCodeRes['data']['captcha_key'];\n\n    final res = await LoginHttp.sendSmsCode(\n      tel: telTextController.text,\n      cid: selectedCountryCodeId.countryId,\n      // deviceTouristId: guestId,\n      geeValidate: captchaData.validate,\n      geeSeccode: captchaData.seccode,\n      geeChallenge: captchaData.geetest?.challenge,\n      recaptchaToken: captchaData.token,\n    );\n    if (res['status']) {\n      SmartDialog.showToast('发送成功');\n      smsSendTimestamp = DateTime.now().millisecondsSinceEpoch;\n      smsSendCooldown.value = 60;\n      captchaKey = res['data']['captcha_key'];\n      smsSendCooldownTimer = Timer.periodic(const Duration(seconds: 1), (\n        timer,\n      ) {\n        smsSendCooldown.value = 60 - timer.tick;\n        if (smsSendCooldown <= 0) {\n          smsSendCooldownTimer?.cancel();\n          smsSendCooldown.value = 0;\n        }\n      });\n    } else {\n      // handle login result\n      switch (res['code']) {\n        case 0:\n        case -105:\n          String? captureUrl = res['data']?['recaptcha_url'];\n          String? geeGt;\n          String? geeChallenge;\n          if (captureUrl != null && captureUrl.isNotEmpty) {\n            Uri captureUri = Uri.parse(captureUrl);\n            captchaData.token = captureUri.queryParameters['recaptcha_token'];\n            geeGt = captureUri.queryParameters['gee_gt'];\n            geeChallenge = captureUri.queryParameters['gee_challenge'];\n          }\n\n          if (!isGeeArgumentValid(geeGt, geeChallenge)) {\n            if (kDebugMode) {\n              debugPrint(\n                '验证信息错误：${res[\"msg\"]}\\n返回内容：${res[\"data\"]}，尝试另一个验证码接口',\n              );\n            }\n            final preCaptureRes = await LoginHttp.preCapture();\n            if (!preCaptureRes['status'] || preCaptureRes['data'] == null) {\n              SmartDialog.showToast(\n                \"获取验证码失败，请尝试其它登录方式\\n\"\n                \"(${preCaptureRes['code']}) ${preCaptureRes['msg']} ${preCaptureRes['data']}\",\n              );\n              return;\n            }\n            geeGt = preCaptureRes['data']['gee_gt'];\n            geeChallenge = preCaptureRes['data']['gee_challenge'];\n            captchaData.token = preCaptureRes['data']['recaptcha_token'];\n          }\n\n          if (!isGeeArgumentValid(geeGt, geeChallenge)) {\n            SmartDialog.showToast(\"获取验证码失败，请尝试其它登录方式\\n\");\n            return;\n          }\n\n          getCaptcha(geeGt!, geeChallenge!, sendSmsCode);\n          break;\n        default:\n          SmartDialog.showToast(res['msg']);\n          break;\n      }\n    }\n  }\n\n  bool isGeeArgumentValid(String? geeGt, String? geeChallenge) {\n    return geeGt?.isNotEmpty == true &&\n        geeChallenge?.isNotEmpty == true &&\n        captchaData.token?.isNotEmpty == true;\n  }\n\n  Future<void> setAccount(Map tokenInfo, List cookieInfo) async {\n    final account = LoginAccount(\n      BiliCookieJar.fromList(cookieInfo),\n      tokenInfo['access_token'],\n      tokenInfo['refresh_token'],\n    );\n    await Future.wait([account.onChange(), AnonymousAccount().delete()]);\n    for (int i = 0; i < AccountType.values.length; i++) {\n      if (Accounts.accountMode[i].mid == account.mid) {\n        Accounts.accountMode[i] = account;\n      }\n    }\n    if (Accounts.main.isLogin) {\n      SmartDialog.showToast('登录成功');\n    } else {\n      SmartDialog.showToast('登录成功, 请先设置账号模式');\n      await switchAccountDialog(Get.context!);\n    }\n  }\n\n  static Future<void>? switchAccountDialog(BuildContext context) {\n    if (Accounts.account.isEmpty) {\n      SmartDialog.showToast('请先登录');\n      return Get.toNamed('/loginPage');\n    }\n    final selectAccount = List.of(Accounts.accountMode);\n    final options = {\n      AnonymousAccount(): '0',\n      ...Accounts.account.toMap().map(\n        (k, v) => MapEntry(v, k as String),\n      ),\n    };\n    bool quickSelect = selectAccount.every((e) => e == selectAccount.first);\n    return showDialog(\n      context: context,\n      builder: (context) => AlertDialog(\n        title: Row(\n          crossAxisAlignment: .start,\n          mainAxisAlignment: .spaceBetween,\n          children: [\n            Text.rich(\n              style: const TextStyle(height: 1.5),\n              TextSpan(\n                children: [\n                  const TextSpan(text: '账号切换'),\n                  TextSpan(\n                    text: '\\nmid 为0时使用匿名',\n                    style: TextStyle(\n                      fontSize: 14,\n                      color: ColorScheme.of(context).outline,\n                    ),\n                  ),\n                ],\n              ),\n            ),\n            TextButton(\n              style: TextButton.styleFrom(\n                visualDensity: .compact,\n                tapTargetSize: .shrinkWrap,\n              ),\n              onPressed: () {\n                quickSelect = !quickSelect;\n                (context as Element).markNeedsBuild();\n              },\n              child: const Text('切换'),\n            ),\n          ],\n        ),\n        titlePadding: const .only(left: 22, top: 16, right: 22, bottom: 3),\n        contentPadding: const .symmetric(vertical: 5),\n        actionsPadding: const .only(left: 16, right: 16, bottom: 10),\n        content: SingleChildScrollView(\n          child: AnimatedSize(\n            curve: Curves.easeIn,\n            alignment: .topCenter,\n            duration: const Duration(milliseconds: 200),\n            child: quickSelect\n                ? Builder(\n                    builder: (context) => RadioGroup<Account>(\n                      groupValue: selectAccount[0],\n                      onChanged: (v) {\n                        selectAccount.fillRange(0, selectAccount.length, v);\n                        (context as Element).markNeedsBuild();\n                      },\n                      child: Column(\n                        crossAxisAlignment: .start,\n                        children: options.entries\n                            .map(\n                              (entry) => RadioWidget<Account>(\n                                value: entry.key,\n                                title: entry.value,\n                                mainAxisSize: .max,\n                                padding: PlatformUtils.isDesktop\n                                    ? const .only(left: 12)\n                                    : const .only(left: 12, top: 2, bottom: 2),\n                              ),\n                            )\n                            .toList(),\n                      ),\n                    ),\n                  )\n                : Column(\n                    crossAxisAlignment: .start,\n                    children: AccountType.values\n                        .map(\n                          (e) => Builder(\n                            builder: (context) => RadioGroup<Account>(\n                              groupValue: selectAccount[e.index],\n                              onChanged: (v) {\n                                selectAccount[e.index] = v!;\n                                (context as Element).markNeedsBuild();\n                              },\n                              child: WrapRadioOptionsGroup<Account>(\n                                groupTitle: e.title,\n                                options: options,\n                              ),\n                            ),\n                          ),\n                        )\n                        .toList(),\n                  ),\n          ),\n        ),\n        actions: [\n          TextButton(\n            onPressed: Get.back,\n            child: Text(\n              '取消',\n              style: TextStyle(color: ColorScheme.of(context).outline),\n            ),\n          ),\n          TextButton(\n            onPressed: () {\n              Get.back();\n              for (final type in AccountType.values) {\n                final index = type.index;\n                final account = quickSelect\n                    ? selectAccount.first\n                    : selectAccount[index];\n                if (account != Accounts.accountMode[index]) {\n                  Accounts.set(type, account);\n                }\n              }\n            },\n            child: const Text('确定'),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/login/geetest/geetest_webview_dialog.dart",
    "content": "import 'dart:convert';\n\nimport 'package:PiliPlus/http/browser_ua.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/main.dart';\nimport 'package:PiliPlus/utils/accounts/account.dart';\nimport 'package:dio/dio.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_inappwebview/flutter_inappwebview.dart';\nimport 'package:get/get.dart';\n\nclass GeetestWebviewDialog extends StatelessWidget {\n  const GeetestWebviewDialog(this.gt, this.challenge, {super.key});\n\n  final String gt;\n  final String challenge;\n\n  static const _geetestJsUri =\n      'https://static.geetest.com/static/js/fullpage.0.0.0.js';\n\n  static Future<LoadingState<String>> _getConfig(\n    String gt,\n    String challenge,\n  ) async {\n    final res = await Request().get<String>(\n      'https://api.geetest.com/gettype.php',\n      queryParameters: {'gt': gt},\n      options: Options(\n        responseType: ResponseType.plain,\n        extra: {'account': const NoAccount()},\n      ),\n    );\n    if (res.data case final String data) {\n      if (data.startsWith('(') && data.endsWith(')')) {\n        final Map<String, dynamic> config;\n        try {\n          config = jsonDecode(data.substring(1, data.length - 1));\n        } catch (e) {\n          return Error(e.toString());\n        }\n        if (config['status'] == 'success') {\n          return Success(\n            jsonEncode(\n              config['data'] as Map<String, dynamic>..addAll({\n                \"gt\": gt,\n                \"challenge\": challenge,\n                \"offline\": false,\n                \"new_captcha\": true,\n                \"product\": \"bind\",\n                \"width\": \"100%\",\n                \"https\": true,\n                \"protocol\": \"https://\",\n              }),\n            ),\n          );\n        } else {\n          return Error(data);\n        }\n      }\n    }\n    return Error(res.data['message']);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final future = _getConfig(gt, challenge);\n    return AlertDialog(\n      title: const Text('验证码'),\n      content: SizedBox(\n        width: 300,\n        height: 400,\n        child: InAppWebView(\n          webViewEnvironment: webViewEnvironment,\n          initialSettings: InAppWebViewSettings(\n            clearCache: true,\n            javaScriptEnabled: true,\n            forceDark: ForceDark.AUTO,\n            useHybridComposition: false,\n            algorithmicDarkeningAllowed: true,\n            useShouldOverrideUrlLoading: true,\n            userAgent: BrowserUa.mob,\n            mixedContentMode: MixedContentMode.MIXED_CONTENT_ALWAYS_ALLOW,\n          ),\n          initialData: InAppWebViewInitialData(\n            data:\n                '<!DOCTYPE html><html><head></head><body><script src=\"$_geetestJsUri\"></script><script>function R(n,o){flutter_inappwebview.callHandler(n,o)}</script></body></html>',\n          ),\n          onWebViewCreated: (ctr) {\n            ctr\n              ..addJavaScriptHandler(\n                handlerName: 'success',\n                callback: (args) {\n                  if (args.isNotEmpty) {\n                    if (args[0] case Map<String, dynamic> data) {\n                      Get.back(result: data);\n                      return;\n                    }\n                  }\n                  debugPrint('geetest invalid result: $args');\n                },\n              )\n              ..addJavaScriptHandler(\n                handlerName: 'error',\n                callback: (args) {\n                  debugPrint('geetest error: $args');\n                },\n              );\n          },\n          onLoadStop: (ctr, _) async {\n            final config = await future;\n            if (config case Success(:final response)) {\n              ctr.evaluateJavascript(\n                source:\n                    'let t=Geetest($response).onSuccess(()=>R(\"success\",t.getValidate())).onError((o)=>R(\"error\",o));t.onReady(()=>t.verify());',\n              );\n            } else {\n              config.toast();\n              Get.back();\n            }\n          },\n        ),\n      ),\n      actions: [\n        TextButton(\n          onPressed: Get.back,\n          child: Text(\n            '取消',\n            style: TextStyle(color: ColorScheme.of(context).outline),\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/login/view.dart",
    "content": "import 'dart:io';\nimport 'dart:ui';\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/pages/login/controller.dart';\nimport 'package:PiliPlus/utils/extension/size_ext.dart';\nimport 'package:PiliPlus/utils/extension/widget_ext.dart';\nimport 'package:PiliPlus/utils/image_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:pretty_qr_code/pretty_qr_code.dart';\nimport 'package:url_launcher/url_launcher.dart';\n\nclass LoginPage extends StatefulWidget {\n  const LoginPage({super.key});\n\n  @override\n  State<LoginPage> createState() => _LoginPageState();\n}\n\nclass _LoginPageState extends State<LoginPage> {\n  final LoginPageController _loginPageCtr = Get.put(LoginPageController());\n  // 二维码生成时间\n  bool showPassword = false;\n  GlobalKey globalKey = GlobalKey();\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    _loginPageCtr.didChangeDependencies(context);\n  }\n\n  Widget loginByQRCode(ThemeData theme) {\n    return Column(\n      children: [\n        const SizedBox(height: 20),\n        const Text('使用 bilibili 官方 App 扫码登录'),\n        const SizedBox(height: 20),\n        Obx(\n          () => Text(\n            '剩余有效时间: ${_loginPageCtr.qrCodeLeftTime} 秒',\n            style: TextStyle(\n              fontFeatures: const [FontFeature.tabularFigures()],\n              color: theme.colorScheme.primaryFixedDim,\n            ),\n          ),\n        ),\n        const SizedBox(height: 5),\n        Row(\n          mainAxisAlignment: MainAxisAlignment.center,\n          children: [\n            TextButton.icon(\n              onPressed: _loginPageCtr.refreshQRCode,\n              icon: const Icon(Icons.refresh),\n              label: const Text('刷新二维码'),\n            ),\n            TextButton.icon(\n              onPressed: () async {\n                SmartDialog.showLoading(msg: '正在生成截图');\n                RenderRepaintBoundary boundary =\n                    globalKey.currentContext!.findRenderObject()!\n                        as RenderRepaintBoundary;\n                final image = await boundary.toImage(pixelRatio: 3);\n                ByteData? byteData = await image.toByteData(\n                  format: ImageByteFormat.png,\n                );\n                Uint8List pngBytes = byteData!.buffer.asUint8List();\n                SmartDialog.dismiss();\n                String picName =\n                    \"${Constants.appName}_loginQRCode_${ImageUtils.time}\";\n                ImageUtils.saveByteImg(bytes: pngBytes, fileName: picName);\n              },\n              icon: const Icon(Icons.save),\n              label: const Text('保存至相册'),\n            ),\n            if (kDebugMode || PlatformUtils.isMobile)\n              TextButton.icon(\n                onPressed: () => PageUtils.launchURL(\n                  'bilibili://browser?url=${Uri.encodeComponent(_loginPageCtr.codeInfo.value.data.url)}',\n                  mode: LaunchMode.externalNonBrowserApplication,\n                ),\n                icon: const Icon(Icons.open_in_browser_outlined),\n                label: const Text('其他应用打开'),\n              ),\n          ],\n        ),\n        RepaintBoundary(\n          key: globalKey,\n          child: Obx(\n            () => switch (_loginPageCtr.codeInfo.value) {\n              Loading() => const SizedBox(\n                height: 200,\n                width: 200,\n                child: m3eLoading,\n              ),\n              Success(:final response) => Container(\n                width: 200,\n                height: 200,\n                color: Colors.white,\n                padding: const EdgeInsets.all(8),\n                child: PrettyQrView.data(\n                  data: response.url,\n                  decoration: const PrettyQrDecoration(\n                    shape: PrettyQrSquaresSymbol(\n                      color: Colors.black87,\n                    ),\n                  ),\n                ),\n              ),\n              Error(:final errMsg) => HttpError(\n                isSliver: false,\n                errMsg: errMsg,\n                onReload: _loginPageCtr.refreshQRCode,\n              ),\n            },\n          ),\n        ),\n        const SizedBox(height: 10),\n        Obx(\n          () => Text(\n            _loginPageCtr.statusQRCode.value,\n            style: TextStyle(color: theme.colorScheme.secondaryFixedDim),\n          ),\n        ),\n        Obx(\n          () {\n            final url = _loginPageCtr.codeInfo.value.dataOrNull?.url ?? '';\n            return GestureDetector(\n              onTap: () => Utils.copyText(\n                url,\n                toastText: '已复制到剪贴板，可粘贴至已登录的app私信处发送，然后点击已发送的链接打开',\n              ),\n              child: Padding(\n                padding: const EdgeInsets.symmetric(\n                  horizontal: 20,\n                  vertical: 20,\n                ),\n                child: Text(\n                  url,\n                  style: theme.textTheme.labelSmall!.copyWith(\n                    color: theme.colorScheme.onSurface.withValues(alpha: 0.4),\n                  ),\n                ),\n              ),\n            );\n          },\n        ),\n        Padding(\n          padding: const EdgeInsets.symmetric(horizontal: 20),\n          child: Text(\n            '请务必在 ${Constants.appName} 开源仓库等可信渠道下载安装。',\n            style: theme.textTheme.labelSmall!.copyWith(\n              color: theme.colorScheme.onSurface.withValues(alpha: 0.4),\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n\n  Widget loginByCookie(ThemeData theme) {\n    return Column(\n      mainAxisSize: MainAxisSize.min,\n      children: [\n        const SizedBox(height: 20),\n        const Text('使用Cookie登录'),\n        const SizedBox(height: 10),\n        Padding(\n          padding: const EdgeInsets.symmetric(horizontal: 20),\n          child: Text(\n            '使用App端Api实现的功能将不可用',\n            style: theme.textTheme.labelMedium!.copyWith(\n              color: theme.colorScheme.primary,\n            ),\n          ),\n        ),\n        const SizedBox(height: 10),\n        Padding(\n          padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10),\n          child: TextField(\n            minLines: 1,\n            maxLines: 10,\n            controller: _loginPageCtr.cookieTextController,\n            inputFormatters: [FilteringTextInputFormatter.deny(RegExp(r\"\\s\"))],\n            decoration: InputDecoration(\n              prefixIcon: const Icon(Icons.cookie_outlined),\n              border: const UnderlineInputBorder(),\n              labelText: 'Cookie',\n              suffixIcon: IconButton(\n                onPressed: _loginPageCtr.cookieTextController.clear,\n                icon: const Icon(Icons.clear),\n              ),\n            ),\n          ),\n        ),\n        OutlinedButton.icon(\n          onPressed: _loginPageCtr.loginByCookie,\n          icon: const Icon(Icons.login),\n          label: const Text('登录'),\n        ),\n      ],\n    );\n  }\n\n  Widget loginByPassword(ThemeData theme) {\n    return Column(\n      children: [\n        const SizedBox(height: 20),\n        const Text('使用账号密码登录'),\n        const SizedBox(height: 10),\n        Padding(\n          padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10),\n          child: TextField(\n            controller: _loginPageCtr.usernameTextController,\n            inputFormatters: [FilteringTextInputFormatter.deny(RegExp(r\"\\s\"))],\n            decoration: InputDecoration(\n              prefixIcon: const Icon(Icons.account_box),\n              border: const UnderlineInputBorder(),\n              labelText: '账号',\n              hintText: '邮箱/手机号',\n              suffixIcon: IconButton(\n                onPressed: _loginPageCtr.usernameTextController.clear,\n                icon: const Icon(Icons.clear),\n              ),\n            ),\n          ),\n        ),\n        Padding(\n          padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10),\n          child: TextField(\n            obscureText: !showPassword,\n            keyboardType: TextInputType.visiblePassword,\n            inputFormatters: [FilteringTextInputFormatter.deny(RegExp(r\"\\s\"))],\n            controller: _loginPageCtr.passwordTextController,\n            autofillHints: const [AutofillHints.password],\n            decoration: InputDecoration(\n              prefixIcon: const Icon(Icons.password),\n              border: const UnderlineInputBorder(),\n              labelText: '密码',\n              suffixIcon: IconButton(\n                onPressed: _loginPageCtr.passwordTextController.clear,\n                icon: const Icon(Icons.clear),\n              ),\n            ),\n          ),\n        ),\n        Row(\n          children: [\n            const SizedBox(width: 10),\n            Checkbox(\n              value: showPassword,\n              onChanged: (value) => setState(() => showPassword = value!),\n            ),\n            const Text('显示密码'),\n            const Spacer(),\n            TextButton(\n              onPressed: () {\n                //https://passport.bilibili.com/h5-app/passport/login/findPassword\n                //https://passport.bilibili.com/passport/findPassword\n                showDialog(\n                  context: context,\n                  builder: (context) => SimpleDialog(\n                    clipBehavior: Clip.hardEdge,\n                    title: const Text('忘记密码？'),\n                    contentPadding: const EdgeInsets.fromLTRB(\n                      0.0,\n                      2.0,\n                      0.0,\n                      16.0,\n                    ),\n                    children: [\n                      const Padding(\n                        padding: EdgeInsets.fromLTRB(25, 0, 25, 10),\n                        child: Text(\"试试扫码、手机号登录，或选择\"),\n                      ),\n                      ListTile(\n                        title: const Text(\n                          '找回密码（手机版）',\n                        ),\n                        leading: const Icon(Icons.smartphone_outlined),\n                        subtitle: const Text(\n                          'https://passport.bilibili.com/h5-app/passport/login/findPassword',\n                        ),\n                        dense: false,\n                        onTap: () => Get\n                          ..back()\n                          ..toNamed(\n                            '/webview',\n                            parameters: {\n                              'url':\n                                  'https://passport.bilibili.com/h5-app/passport/login/findPassword',\n                              'type': 'url',\n                              'pageTitle': '忘记密码',\n                            },\n                          ),\n                      ),\n                      ListTile(\n                        title: const Text(\n                          '找回密码（电脑版）',\n                        ),\n                        leading: const Icon(Icons.desktop_windows_outlined),\n                        subtitle: const Text(\n                          'https://passport.bilibili.com/pc/passport/findPassword',\n                        ),\n                        dense: false,\n                        onTap: () => Get\n                          ..back()\n                          ..toNamed(\n                            '/webview',\n                            parameters: {\n                              'url':\n                                  'https://passport.bilibili.com/pc/passport/findPassword',\n                              'type': 'url',\n                              'pageTitle': '忘记密码',\n                              'uaType': 'pc',\n                            },\n                          ),\n                      ),\n                    ],\n                  ),\n                );\n              },\n              child: const Text('忘记密码'),\n            ),\n            const SizedBox(width: 20),\n          ],\n        ),\n        OutlinedButton.icon(\n          onPressed: _loginPageCtr.loginByPassword,\n          icon: const Icon(Icons.login),\n          label: const Text('登录'),\n        ),\n        const SizedBox(height: 20),\n        Padding(\n          padding: const EdgeInsets.symmetric(horizontal: 20),\n          child: Text(\n            '根据 bilibili 官方登录接口规范，密码将在本地加盐、加密后传输。\\n'\n            '盐与公钥均由官方提供；以 RSA/ECB/PKCS1Padding 方式加密。\\n'\n            '账号密码仅用于该登录接口，不予保存；本地仅存储登录凭证。\\n'\n            '请务必在 ${Constants.appName} 开源仓库等可信渠道下载安装。',\n            textAlign: TextAlign.center,\n            style: theme.textTheme.labelSmall!.copyWith(\n              color: theme.colorScheme.onSurface.withValues(alpha: 0.4),\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n\n  Widget loginBySmS(ThemeData theme) {\n    return Column(\n      children: [\n        const SizedBox(height: 20),\n        const Text('使用手机短信验证码登录'),\n        const SizedBox(height: 10),\n        Padding(\n          padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10),\n          child: DecoratedBox(\n            decoration: UnderlineTabIndicator(\n              borderSide: BorderSide(\n                color: theme.colorScheme.outline.withValues(alpha: 0.4),\n              ),\n            ),\n            child: Row(\n              children: [\n                const SizedBox(width: 12),\n                Builder(\n                  builder: (context) {\n                    return PopupMenuButton(\n                      enabled: !Platform.isLinux,\n                      padding: EdgeInsets.zero,\n                      tooltip:\n                          '选择国际冠码，'\n                          '当前为${_loginPageCtr.selectedCountryCodeId.cname}，'\n                          '+${_loginPageCtr.selectedCountryCodeId.countryId}',\n                      onSelected: (item) {\n                        _loginPageCtr.selectedCountryCodeId = item;\n                        (context as Element).markNeedsBuild();\n                      },\n                      initialValue: _loginPageCtr.selectedCountryCodeId,\n                      itemBuilder: (_) =>\n                          Constants.internationalDialingPrefix.map((item) {\n                            return PopupMenuItem(\n                              value: item,\n                              child: Row(\n                                children: [\n                                  Text(item.cname),\n                                  const Spacer(),\n                                  Text(\"+${item.countryId}\"),\n                                ],\n                              ),\n                            );\n                          }).toList(),\n                      child: Row(\n                        children: [\n                          Icon(\n                            Icons.phone,\n                            color: theme.colorScheme.onSurfaceVariant,\n                          ),\n                          const SizedBox(width: 12),\n                          Text(\n                            \"+${_loginPageCtr.selectedCountryCodeId.countryId}\",\n                          ),\n                        ],\n                      ),\n                    );\n                  },\n                ),\n                const SizedBox(width: 6),\n                SizedBox(\n                  height: 24,\n                  child: VerticalDivider(\n                    color: theme.colorScheme.outline.withValues(alpha: 0.5),\n                  ),\n                ),\n                const SizedBox(width: 6),\n                Expanded(\n                  child: TextField(\n                    enabled: !Platform.isLinux,\n                    controller: _loginPageCtr.telTextController,\n                    keyboardType: TextInputType.number,\n                    inputFormatters: <TextInputFormatter>[\n                      FilteringTextInputFormatter.digitsOnly,\n                    ],\n                    decoration: InputDecoration(\n                      border: InputBorder.none,\n                      labelText: '手机号',\n                      suffixIcon: IconButton(\n                        onPressed: _loginPageCtr.telTextController.clear,\n                        icon: const Icon(Icons.clear),\n                      ),\n                    ),\n                  ),\n                ),\n              ],\n            ),\n          ),\n        ),\n        Padding(\n          padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10),\n          child: DecoratedBox(\n            decoration: UnderlineTabIndicator(\n              borderSide: BorderSide(\n                color: theme.colorScheme.outline.withValues(alpha: 0.4),\n              ),\n            ),\n            child: Row(\n              children: [\n                Expanded(\n                  child: TextField(\n                    enabled: !Platform.isLinux,\n                    controller: _loginPageCtr.smsCodeTextController,\n                    decoration: const InputDecoration(\n                      prefixIcon: Icon(Icons.sms_outlined),\n                      border: InputBorder.none,\n                      labelText: '验证码',\n                    ),\n                    keyboardType: TextInputType.number,\n                    inputFormatters: <TextInputFormatter>[\n                      FilteringTextInputFormatter.digitsOnly,\n                    ],\n                  ),\n                ),\n                Obx(\n                  () => TextButton.icon(\n                    onPressed: !Platform.isLinux\n                        ? _loginPageCtr.smsSendCooldown > 0\n                              ? null\n                              : _loginPageCtr.sendSmsCode\n                        : null,\n                    icon: const Icon(Icons.send),\n                    label: Text(\n                      _loginPageCtr.smsSendCooldown > 0\n                          ? '等待${_loginPageCtr.smsSendCooldown}秒'\n                          : '获取验证码',\n                    ),\n                  ),\n                ),\n              ],\n            ),\n          ),\n        ),\n        const SizedBox(height: 20),\n        OutlinedButton.icon(\n          onPressed: !Platform.isLinux ? _loginPageCtr.loginBySmsCode : null,\n          icon: const Icon(Icons.login),\n          label: const Text('登录'),\n        ),\n        const SizedBox(height: 20),\n        Padding(\n          padding: const EdgeInsets.symmetric(horizontal: 20),\n          child: Text(\n            '手机号仅用于 bilibili 官方发送验证码与登录接口，不予保存；\\n'\n            '本地仅存储登录凭证。\\n'\n            '请务必在 ${Constants.appName} 开源仓库等可信渠道下载安装。',\n            textAlign: TextAlign.center,\n            style: theme.textTheme.labelSmall!.copyWith(\n              color: theme.colorScheme.onSurface.withValues(alpha: 0.4),\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n\n  late EdgeInsets padding;\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    padding =\n        MediaQuery.viewPaddingOf(context).copyWith(top: 0) +\n        const EdgeInsets.only(bottom: 25);\n    final isLandscape = !MediaQuery.sizeOf(context).isPortrait;\n    return Scaffold(\n      appBar: AppBar(\n        leading: IconButton(\n          tooltip: '关闭',\n          icon: const Icon(Icons.close_outlined),\n          onPressed: Get.back,\n        ),\n        title: Row(\n          children: [\n            const Text('登录'),\n            if (isLandscape)\n              Expanded(\n                child: Align(\n                  alignment: Alignment.centerRight,\n                  child: TabBar(\n                    isScrollable: true,\n                    dividerHeight: 0,\n                    tabs: const [\n                      Tab(\n                        child: Row(\n                          mainAxisSize: MainAxisSize.min,\n                          children: [Icon(Icons.password), Text(' 密码')],\n                        ),\n                      ),\n                      Tab(\n                        child: Row(\n                          mainAxisSize: MainAxisSize.min,\n                          children: [Icon(Icons.sms_outlined), Text(' 短信')],\n                        ),\n                      ),\n                      Tab(\n                        child: Row(\n                          mainAxisSize: MainAxisSize.min,\n                          children: [Icon(Icons.qr_code), Text(' 扫码')],\n                        ),\n                      ),\n                      Tab(\n                        child: Row(\n                          mainAxisSize: MainAxisSize.min,\n                          children: [\n                            Icon(Icons.cookie_outlined),\n                            Text(' Cookie'),\n                          ],\n                        ),\n                      ),\n                    ],\n                    controller: _loginPageCtr.tabController,\n                  ),\n                ),\n              ),\n          ],\n        ),\n        bottom: !isLandscape\n            ? TabBar(\n                tabs: const [\n                  Tab(icon: Icon(Icons.password), text: '密码'),\n                  Tab(icon: Icon(Icons.sms_outlined), text: '短信'),\n                  Tab(icon: Icon(Icons.qr_code), text: '扫码'),\n                  Tab(icon: Icon(Icons.cookie_outlined), text: 'Cookie'),\n                ],\n                controller: _loginPageCtr.tabController,\n              )\n            : null,\n      ),\n      body: NotificationListener<ScrollStartNotification>(\n        onNotification: (notification) {\n          if (notification.metrics.axis == Axis.horizontal) {\n            FocusScope.of(context).unfocus();\n          }\n          return false;\n        },\n        child: tabBarView(\n          controller: _loginPageCtr.tabController,\n          children: [\n            tabViewOuter(loginByPassword(theme)),\n            tabViewOuter(loginBySmS(theme)),\n            tabViewOuter(loginByQRCode(theme)),\n            tabViewOuter(loginByCookie(theme)),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget tabViewOuter(Widget child) {\n    return SingleChildScrollView(\n      padding: padding,\n      child: child.constraintWidth(),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/login_devices/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/login.dart';\nimport 'package:PiliPlus/models_new/login_devices/data.dart';\nimport 'package:PiliPlus/models_new/login_devices/device.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\n\nclass LoginDevicesController\n    extends CommonListController<LoginDevicesData, LoginDevice> {\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  List<LoginDevice>? getDataList(LoginDevicesData response) {\n    return response.devices;\n  }\n\n  @override\n  Future<LoadingState<LoginDevicesData>> customGetData() =>\n      LoginHttp.loginDevices();\n}\n"
  },
  {
    "path": "lib/pages/login_devices/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/list_tile.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/view_sliver_safe_area.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/login_devices/device.dart';\nimport 'package:PiliPlus/pages/login_devices/controller.dart';\nimport 'package:PiliPlus/utils/extension/widget_ext.dart';\nimport 'package:flutter/material.dart' hide ListTile;\nimport 'package:get/get.dart';\n\nclass LoginDevicesPage extends StatefulWidget {\n  const LoginDevicesPage({super.key});\n\n  @override\n  State<LoginDevicesPage> createState() => LoginDevicesPageState();\n}\n\nclass LoginDevicesPageState extends State<LoginDevicesPage> {\n  final _controller = Get.put(LoginDevicesController());\n\n  @override\n  Widget build(BuildContext context) {\n    final colorScheme = Theme.of(context).colorScheme;\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(title: const Text('登录设备')),\n      body: refreshIndicator(\n        onRefresh: _controller.onRefresh,\n        child: CustomScrollView(\n          physics: const AlwaysScrollableScrollPhysics(),\n          slivers: [\n            ViewSliverSafeArea(\n              sliver: Obx(\n                () => _buildBody(colorScheme, _controller.loadingState.value),\n              ),\n            ),\n          ],\n        ),\n      ).constraintWidth(),\n    );\n  }\n\n  Widget _buildBody(\n    ColorScheme colorScheme,\n    LoadingState<List<LoginDevice>?> loadingState,\n  ) {\n    late final divider = Divider(\n      height: 1,\n      color: colorScheme.outline.withValues(alpha: 0.1),\n    );\n    return switch (loadingState) {\n      Loading() => const SliverToBoxAdapter(),\n      Success<List<LoginDevice>?>(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverList.separated(\n                itemBuilder: (context, index) {\n                  return _buildItem(colorScheme, response[index]);\n                },\n                itemCount: response.length,\n                separatorBuilder: (_, _) => divider,\n              )\n            : HttpError(onReload: _controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n\n  Widget _buildItem(ColorScheme colorScheme, LoginDevice item) {\n    final style = TextStyle(fontSize: 13, color: colorScheme.outline);\n    return ListTile(\n      dense: true,\n      title: Text(\n        item.deviceName ?? '',\n        style: const TextStyle(fontSize: 14),\n      ),\n      subtitle: Text(\n        '${item.latestLoginAt} ${item.source}',\n        style: style,\n      ),\n      trailing: item.isCurrentDevice == true\n          ? Text('(本机)', style: style)\n          : null,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/login_log/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/user.dart';\nimport 'package:PiliPlus/models_new/login_log/data.dart';\nimport 'package:PiliPlus/models_new/login_log/list.dart';\nimport 'package:PiliPlus/pages/log_table/controller.dart';\n\nclass LoginLogController extends LogController<LoginLogData, LoginLogItem> {\n  @override\n  List<LoginLogItem>? getDataList(LoginLogData response) {\n    return response.list;\n  }\n\n  @override\n  Future<LoadingState<LoginLogData>> customGetData() => UserHttp.loginLog();\n\n  @override\n  List<(int, String)> getFlexAndText(LoginLogItem item) {\n    return [(3, item.timeAt), (2, item.ip), (3, item.geo)];\n  }\n\n  @override\n  final LoginLogItem header = const LoginLogItem(\n    timeAt: '时间',\n    ip: '变化',\n    geo: '地理位置',\n  );\n\n  @override\n  final String title = '登录记录';\n}\n"
  },
  {
    "path": "lib/pages/main/controller.dart",
    "content": "import 'dart:async';\n\nimport 'package:PiliPlus/common/widgets/view_safe_area.dart';\nimport 'package:PiliPlus/grpc/dyn.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/msg.dart';\nimport 'package:PiliPlus/models/common/dynamic/dynamic_badge_mode.dart';\nimport 'package:PiliPlus/models/common/msg/msg_unread_type.dart';\nimport 'package:PiliPlus/models/common/nav_bar_config.dart';\nimport 'package:PiliPlus/pages/dynamics/controller.dart';\nimport 'package:PiliPlus/pages/home/controller.dart';\nimport 'package:PiliPlus/pages/mine/view.dart';\nimport 'package:PiliPlus/services/account_service.dart';\nimport 'package:PiliPlus/utils/extension/get_ext.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:PiliPlus/utils/feed_back.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/update.dart';\nimport 'package:collection/collection.dart';\nimport 'package:easy_debounce/easy_throttle.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass MainController extends GetxController\n    with GetSingleTickerProviderStateMixin, AccountMixin {\n  @override\n  final AccountService accountService = Get.find<AccountService>();\n\n  List<NavigationBarType> navigationBars = <NavigationBarType>[];\n\n  RxDouble? barOffset;\n  RxBool? showBottomBar;\n  late final bool hideBottomBar;\n  late final barHideType = Pref.barHideType;\n  bool useBottomNav = false;\n  late dynamic controller;\n  final RxInt selectedIndex = 0.obs;\n\n  final RxInt dynCount = 0.obs;\n  late DynamicBadgeMode dynamicBadgeMode;\n  late bool checkDynamic = Pref.checkDynamic;\n  late int dynamicPeriod = Pref.dynamicPeriod * 60 * 1000;\n  late int _lastCheckDynamicAt = 0;\n  late bool hasDyn = false;\n  late final dynamicController = Get.putOrFind(DynamicsController.new);\n\n  late bool hasHome = false;\n  late final homeController = Get.putOrFind(HomeController.new);\n\n  late DynamicBadgeMode msgBadgeMode = Pref.msgBadgeMode;\n  late Set<MsgUnReadType> msgUnReadTypes = Pref.msgUnReadTypeV2;\n  late final RxString msgUnReadCount = ''.obs;\n  late int lastCheckUnreadAt = 0;\n\n  final enableMYBar = Pref.enableMYBar;\n  final useSideBar = Pref.useSideBar;\n  final mainTabBarView = Pref.mainTabBarView;\n  late final optTabletNav = Pref.optTabletNav;\n\n  late bool directExitOnBack = Pref.directExitOnBack;\n  late bool showTrayIcon = Pref.showTrayIcon;\n  late bool minimizeOnExit = Pref.minimizeOnExit;\n  late bool pauseOnMinimize = Pref.pauseOnMinimize;\n  late bool isPlaying = false;\n\n  static const _period = 5 * 60 * 1000;\n  late int _lastSelectTime = 0;\n\n  @override\n  void onInit() {\n    super.onInit();\n    if (Pref.autoUpdate) {\n      Update.checkUpdate();\n    }\n\n    setNavBarConfig();\n\n    controller = mainTabBarView\n        ? TabController(\n            vsync: this,\n            initialIndex: selectedIndex.value,\n            length: navigationBars.length,\n          )\n        : PageController(initialPage: selectedIndex.value);\n\n    hideBottomBar =\n        !useSideBar && navigationBars.length > 1 && Pref.hideBottomBar;\n    if (hideBottomBar) {\n      switch (barHideType) {\n        case .instant:\n          showBottomBar = RxBool(true);\n        case .sync:\n          barOffset ??= RxDouble(0.0);\n      }\n    }\n\n    dynamicBadgeMode = Pref.dynamicBadgeMode;\n\n    hasDyn = navigationBars.contains(NavigationBarType.dynamics);\n    if (dynamicBadgeMode != DynamicBadgeMode.hidden) {\n      if (hasDyn) {\n        if (checkDynamic) {\n          _lastCheckDynamicAt = DateTime.now().millisecondsSinceEpoch;\n        }\n        getUnreadDynamic();\n      }\n    }\n\n    hasHome = navigationBars.contains(NavigationBarType.home);\n    if (msgBadgeMode != DynamicBadgeMode.hidden) {\n      if (hasHome) {\n        lastCheckUnreadAt = DateTime.now().millisecondsSinceEpoch;\n        queryUnreadMsg();\n      }\n    }\n  }\n\n  Future<int> _msgUnread() async {\n    if (msgUnReadTypes.contains(MsgUnReadType.pm)) {\n      final res = await MsgHttp.msgUnread();\n      if (res case Success(:final response)) {\n        return response.followUnread +\n            response.unfollowUnread +\n            response.bizMsgFollowUnread +\n            response.bizMsgUnfollowUnread +\n            response.unfollowPushMsg +\n            response.customUnread;\n      }\n    }\n    return 0;\n  }\n\n  Future<int> _msgFeedUnread() async {\n    int count = 0;\n    final remainTypes = Set<MsgUnReadType>.from(msgUnReadTypes)\n      ..remove(MsgUnReadType.pm);\n    if (remainTypes.isNotEmpty) {\n      final res = await MsgHttp.msgFeedUnread();\n      if (res case Success(:final response)) {\n        for (final item in remainTypes) {\n          switch (item) {\n            case MsgUnReadType.pm:\n              break;\n            case MsgUnReadType.reply:\n              count += response.reply;\n              break;\n            case MsgUnReadType.at:\n              count += response.at;\n              break;\n            case MsgUnReadType.like:\n              count += response.like;\n              break;\n            case MsgUnReadType.sysMsg:\n              count += response.sysMsg;\n              break;\n          }\n        }\n      }\n    }\n    return count;\n  }\n\n  Future<void> queryUnreadMsg([bool isChangeType = false]) async {\n    if (!accountService.isLogin.value ||\n        !hasHome ||\n        msgUnReadTypes.isEmpty ||\n        msgBadgeMode == DynamicBadgeMode.hidden) {\n      msgUnReadCount.value = '';\n      return;\n    }\n\n    final res = await Future.wait([_msgUnread(), _msgFeedUnread()]);\n\n    final count = res.sum;\n\n    final countStr = count == 0\n        ? ''\n        : count > 99\n        ? '99+'\n        : count.toString();\n    if (msgUnReadCount.value == countStr) {\n      if (isChangeType) {\n        msgUnReadCount.refresh();\n      }\n    } else {\n      msgUnReadCount.value = countStr;\n    }\n  }\n\n  void getUnreadDynamic() {\n    if (!accountService.isLogin.value || !hasDyn) {\n      return;\n    }\n    DynGrpc.dynRed().then((res) {\n      if (res != null) {\n        setDynCount(res);\n      }\n    });\n  }\n\n  void setDynCount([int count = 0]) {\n    if (!hasDyn) return;\n    dynCount.value = count;\n  }\n\n  void checkUnreadDynamic() {\n    if (!hasDyn ||\n        !accountService.isLogin.value ||\n        dynamicBadgeMode == DynamicBadgeMode.hidden ||\n        !checkDynamic) {\n      return;\n    }\n    int now = DateTime.now().millisecondsSinceEpoch;\n    if (now - _lastCheckDynamicAt >= dynamicPeriod) {\n      _lastCheckDynamicAt = now;\n      getUnreadDynamic();\n    }\n  }\n\n  void setNavBarConfig() {\n    List<int>? navBarSort =\n        (GStorage.setting.get(SettingBoxKey.navBarSort) as List?)?.fromCast();\n    late final List<NavigationBarType> navigationBars;\n    if (navBarSort == null || navBarSort.isEmpty) {\n      navigationBars = NavigationBarType.values;\n    } else {\n      navigationBars = navBarSort\n          .map((i) => NavigationBarType.values[i])\n          .toList();\n    }\n    this.navigationBars = navigationBars;\n    selectedIndex.value = Pref.defaultHomePageIndex;\n  }\n\n  void checkDefaultSearch([bool shouldCheck = false]) {\n    if (hasHome && homeController.enableSearchWord) {\n      if (shouldCheck &&\n          navigationBars[selectedIndex.value] != NavigationBarType.home) {\n        return;\n      }\n      int now = DateTime.now().millisecondsSinceEpoch;\n      if (now - homeController.lateCheckSearchAt >= _period) {\n        homeController\n          ..lateCheckSearchAt = now\n          ..querySearchDefault();\n      }\n    }\n  }\n\n  void checkUnread([bool shouldCheck = false]) {\n    if (accountService.isLogin.value &&\n        hasHome &&\n        msgBadgeMode != DynamicBadgeMode.hidden) {\n      if (shouldCheck &&\n          navigationBars[selectedIndex.value] != NavigationBarType.home) {\n        return;\n      }\n      int now = DateTime.now().millisecondsSinceEpoch;\n      if (now - lastCheckUnreadAt >= _period) {\n        lastCheckUnreadAt = now;\n        queryUnreadMsg();\n      }\n    }\n  }\n\n  int? _mineIndex;\n  void toMinePage() {\n    _mineIndex ??= navigationBars.indexOf(NavigationBarType.mine);\n    if (_mineIndex != -1) {\n      setIndex(_mineIndex!);\n    } else {\n      Get.to(\n        const Material(\n          child: ViewSafeArea(\n            top: true,\n            child: MinePage(showBackBtn: true),\n          ),\n        ),\n      );\n    }\n  }\n\n  void setIndex(int value) {\n    feedBack();\n\n    final currentNav = navigationBars[value];\n    if (value != selectedIndex.value) {\n      selectedIndex.value = value;\n      if (mainTabBarView) {\n        controller.animateTo(value);\n      } else {\n        controller.jumpToPage(value);\n      }\n      if (currentNav == NavigationBarType.home) {\n        checkDefaultSearch();\n        checkUnread();\n      } else if (currentNav == NavigationBarType.dynamics) {\n        setDynCount();\n      }\n    } else {\n      int now = DateTime.now().millisecondsSinceEpoch;\n      if (now - _lastSelectTime < 500) {\n        EasyThrottle.throttle(\n          'topOrRefresh',\n          const Duration(milliseconds: 500),\n          () {\n            if (currentNav == NavigationBarType.home) {\n              homeController.onRefresh();\n            } else if (currentNav == NavigationBarType.dynamics) {\n              dynamicController.onRefresh();\n            }\n          },\n        );\n      } else {\n        if (currentNav == NavigationBarType.home) {\n          homeController.toTopOrRefresh();\n        } else if (currentNav == NavigationBarType.dynamics) {\n          dynamicController.toTopOrRefresh();\n        }\n      }\n      _lastSelectTime = now;\n    }\n  }\n\n  void setSearchBar() {\n    if (hasHome) {\n      homeController.showTopBar?.value = true;\n    }\n  }\n\n  @override\n  void onClose() {\n    barOffset?.close();\n    controller.dispose();\n    super.onClose();\n  }\n\n  @override\n  void onChangeAccount(bool isLogin) {\n    if (isLogin) {\n      getUnreadDynamic();\n    } else {\n      setDynCount();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/main/view.dart",
    "content": "import 'dart:io';\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/flutter/pop_scope.dart';\nimport 'package:PiliPlus/common/widgets/flutter/tabs.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/route_aware_mixin.dart';\nimport 'package:PiliPlus/models/common/nav_bar_config.dart';\nimport 'package:PiliPlus/pages/home/view.dart';\nimport 'package:PiliPlus/pages/main/controller.dart';\nimport 'package:PiliPlus/plugin/pl_player/controller.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/play_status.dart';\nimport 'package:PiliPlus/utils/app_scheme.dart';\nimport 'package:PiliPlus/utils/extension/context_ext.dart';\nimport 'package:PiliPlus/utils/extension/size_ext.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:get/get.dart';\nimport 'package:tray_manager/tray_manager.dart';\nimport 'package:window_manager/window_manager.dart';\n\nclass MainApp extends StatefulWidget {\n  const MainApp({super.key});\n\n  @override\n  State<MainApp> createState() => _MainAppState();\n}\n\nclass _MainAppState extends PopScopeState<MainApp>\n    with\n        RouteAware,\n        RouteAwareMixin,\n        WidgetsBindingObserver,\n        WindowListener,\n        TrayListener {\n  final _mainController = Get.put(MainController());\n  late final _setting = GStorage.setting;\n  late EdgeInsets _padding;\n\n  @override\n  bool get initCanPop => false;\n\n  @override\n  void initState() {\n    super.initState();\n    WidgetsBinding.instance.addObserver(this);\n    if (PlatformUtils.isDesktop) {\n      windowManager\n        ..addListener(this)\n        ..setPreventClose(true);\n      if (_mainController.showTrayIcon) {\n        trayManager.addListener(this);\n        _handleTray();\n      }\n    } else {\n      // FlutterSmartDialog throws\n      PiliScheme.init();\n    }\n  }\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    _padding = MediaQuery.viewPaddingOf(context);\n    final brightness = Theme.brightnessOf(context);\n    NetworkImgLayer.reduce =\n        NetworkImgLayer.reduceLuxColor != null && brightness.isDark;\n    if (PlatformUtils.isDesktop) {\n      windowManager.setBrightness(brightness);\n    }\n    if (!_mainController.useSideBar) {\n      _mainController.useBottomNav = MediaQuery.sizeOf(context).isPortrait;\n    }\n  }\n\n  @override\n  void didPopNext() {\n    WidgetsBinding.instance.addObserver(this);\n    _mainController\n      ..checkUnreadDynamic()\n      ..checkDefaultSearch(true)\n      ..checkUnread(_mainController.useBottomNav);\n    super.didPopNext();\n  }\n\n  @override\n  void didPushNext() {\n    WidgetsBinding.instance.removeObserver(this);\n    super.didPushNext();\n  }\n\n  @override\n  void didChangeAppLifecycleState(AppLifecycleState state) {\n    if (state == AppLifecycleState.resumed) {\n      _mainController\n        ..checkUnreadDynamic()\n        ..checkDefaultSearch(true)\n        ..checkUnread(_mainController.useBottomNav);\n    }\n  }\n\n  @override\n  void dispose() {\n    if (PlatformUtils.isDesktop) {\n      trayManager.removeListener(this);\n      windowManager.removeListener(this);\n    }\n    WidgetsBinding.instance.removeObserver(this);\n    PiliScheme.listener?.cancel();\n    GStorage.close();\n    super.dispose();\n  }\n\n  @override\n  void onWindowMaximize() {\n    _setting.put(SettingBoxKey.isWindowMaximized, true);\n  }\n\n  @override\n  void onWindowUnmaximize() {\n    _setting.put(SettingBoxKey.isWindowMaximized, false);\n  }\n\n  @override\n  Future<void> onWindowMoved() async {\n    if (PlPlayerController.instance?.isDesktopPip ?? false) {\n      return;\n    }\n    final Offset offset = await windowManager.getPosition();\n    _setting.put(SettingBoxKey.windowPosition, [offset.dx, offset.dy]);\n  }\n\n  @override\n  Future<void> onWindowResized() async {\n    if (PlPlayerController.instance?.isDesktopPip ?? false) {\n      return;\n    }\n    final Rect bounds = await windowManager.getBounds();\n    _setting.putAll({\n      SettingBoxKey.windowSize: [bounds.width, bounds.height],\n      SettingBoxKey.windowPosition: [bounds.left, bounds.top],\n    });\n  }\n\n  @override\n  void onWindowClose() {\n    if (_mainController.showTrayIcon && _mainController.minimizeOnExit) {\n      windowManager.hide();\n      _onHideWindow();\n    } else {\n      _onClose();\n    }\n  }\n\n  Future<void> _onClose() async {\n    await GStorage.compact();\n    await GStorage.close();\n    await trayManager.destroy();\n    if (Platform.isWindows) {\n      const MethodChannel('window_control').invokeMethod('closeWindow');\n    } else {\n      exit(0);\n    }\n  }\n\n  @override\n  void onWindowMinimize() {\n    _onHideWindow();\n  }\n\n  @override\n  void onWindowRestore() {\n    _onShowWindow();\n  }\n\n  void _onHideWindow() {\n    if (_mainController.pauseOnMinimize) {\n      if (PlPlayerController.instance case final player?) {\n        if (_mainController.isPlaying = player.playerStatus.isPlaying) {\n          player.pause();\n        }\n      } else {\n        _mainController.isPlaying = false;\n      }\n    }\n  }\n\n  void _onShowWindow() {\n    if (_mainController.pauseOnMinimize && _mainController.isPlaying) {\n      PlPlayerController.instance?.play();\n    }\n  }\n\n  @override\n  Future<void> onTrayIconMouseDown() async {\n    if (await windowManager.isVisible()) {\n      _onHideWindow();\n      windowManager.hide();\n    } else {\n      _onShowWindow();\n      windowManager.show();\n    }\n  }\n\n  @override\n  Future<void> onTrayIconRightMouseDown() async {\n    // ignore: deprecated_member_use\n    trayManager.popUpContextMenu(bringAppToFront: true);\n  }\n\n  @override\n  void onTrayMenuItemClick(MenuItem menuItem) {\n    switch (menuItem.key) {\n      case 'show':\n        windowManager.show();\n      case 'exit':\n        _onClose();\n    }\n  }\n\n  Future<void> _handleTray() async {\n    if (Platform.isWindows) {\n      await trayManager.setIcon('assets/images/logo/ico/app_icon.ico');\n    } else {\n      await trayManager.setIcon('assets/images/logo/desktop/logo_large.png');\n    }\n    if (!Platform.isLinux) {\n      await trayManager.setToolTip(Constants.appName);\n    }\n\n    Menu trayMenu = Menu(\n      items: [\n        MenuItem(key: 'show', label: '显示窗口'),\n        MenuItem.separator(),\n        MenuItem(key: 'exit', label: '退出 ${Constants.appName}'),\n      ],\n    );\n    await trayManager.setContextMenu(trayMenu);\n  }\n\n  static void _onBack() {\n    if (Platform.isAndroid) {\n      Utils.channel.invokeMethod('back');\n    }\n  }\n\n  @override\n  void onPopInvokedWithResult(bool didPop, Object? result) {\n    if (_mainController.directExitOnBack) {\n      _onBack();\n    } else {\n      if (_mainController.selectedIndex.value != 0) {\n        _mainController\n          ..setIndex(0)\n          ..barOffset?.value = 0.0\n          ..showBottomBar?.value = true\n          ..setSearchBar();\n      } else {\n        _onBack();\n      }\n    }\n  }\n\n  Widget? get _bottomNav {\n    Widget? bottomNav = _mainController.navigationBars.length > 1\n        ? _mainController.enableMYBar\n              ? Obx(\n                  () => NavigationBar(\n                    maintainBottomViewPadding: true,\n                    onDestinationSelected: _mainController.setIndex,\n                    selectedIndex: _mainController.selectedIndex.value,\n                    destinations: _mainController.navigationBars\n                        .map(\n                          (e) => NavigationDestination(\n                            label: e.label,\n                            icon: _buildIcon(type: e),\n                            selectedIcon: _buildIcon(type: e, selected: true),\n                          ),\n                        )\n                        .toList(),\n                  ),\n                )\n              : Obx(\n                  () => BottomNavigationBar(\n                    currentIndex: _mainController.selectedIndex.value,\n                    onTap: _mainController.setIndex,\n                    iconSize: 16,\n                    selectedFontSize: 12,\n                    unselectedFontSize: 12,\n                    type: .fixed,\n                    items: _mainController.navigationBars\n                        .map(\n                          (e) => BottomNavigationBarItem(\n                            label: e.label,\n                            icon: _buildIcon(type: e),\n                            activeIcon: _buildIcon(type: e, selected: true),\n                          ),\n                        )\n                        .toList(),\n                  ),\n                )\n        : null;\n    if (bottomNav != null && _mainController.hideBottomBar) {\n      if (_mainController.barOffset case final barOffset?) {\n        return Obx(\n          () => FractionalTranslation(\n            translation: Offset(\n              0.0,\n              barOffset.value / StyleString.topBarHeight,\n            ),\n            child: bottomNav,\n          ),\n        );\n      }\n      if (_mainController.showBottomBar case final showBottomBar?) {\n        return Obx(\n          () => AnimatedSlide(\n            curve: Curves.easeInOutCubicEmphasized,\n            duration: const Duration(milliseconds: 500),\n            offset: Offset(0, showBottomBar.value ? 0 : 1),\n            child: bottomNav,\n          ),\n        );\n      }\n    }\n    return bottomNav;\n  }\n\n  Widget _sideBar(ThemeData theme) {\n    return _mainController.navigationBars.length > 1\n        ? context.isTablet && _mainController.optTabletNav\n              ? Column(\n                  children: [\n                    const SizedBox(height: 25),\n                    userAndSearchVertical(theme),\n                    const Spacer(flex: 2),\n                    Expanded(\n                      flex: 5,\n                      child: SizedBox(\n                        width: 130,\n                        child: Obx(\n                          () => NavigationDrawer(\n                            backgroundColor: Colors.transparent,\n                            tilePadding: const .symmetric(\n                              vertical: 5,\n                              horizontal: 12,\n                            ),\n                            indicatorShape: const RoundedRectangleBorder(\n                              borderRadius: .all(.circular(16)),\n                            ),\n                            onDestinationSelected: _mainController.setIndex,\n                            selectedIndex: _mainController.selectedIndex.value,\n                            children: _mainController.navigationBars\n                                .map(\n                                  (e) => NavigationDrawerDestination(\n                                    label: Text(e.label),\n                                    icon: _buildIcon(type: e),\n                                    selectedIcon: _buildIcon(\n                                      type: e,\n                                      selected: true,\n                                    ),\n                                  ),\n                                )\n                                .toList(),\n                          ),\n                        ),\n                      ),\n                    ),\n                  ],\n                )\n              : Obx(\n                  () => NavigationRail(\n                    groupAlignment: 0.5,\n                    selectedIndex: _mainController.selectedIndex.value,\n                    onDestinationSelected: _mainController.setIndex,\n                    labelType: .selected,\n                    leading: userAndSearchVertical(theme),\n                    destinations: _mainController.navigationBars\n                        .map(\n                          (e) => NavigationRailDestination(\n                            label: Text(e.label),\n                            icon: _buildIcon(type: e),\n                            selectedIcon: _buildIcon(type: e, selected: true),\n                          ),\n                        )\n                        .toList(),\n                  ),\n                )\n        : Container(\n            width: 80,\n            padding: const .only(top: 10),\n            child: userAndSearchVertical(theme),\n          );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    Widget child;\n    if (_mainController.mainTabBarView) {\n      child = CustomTabBarView(\n        scrollDirection: _mainController.useBottomNav ? .horizontal : .vertical,\n        physics: const NeverScrollableScrollPhysics(),\n        controller: _mainController.controller,\n        children: _mainController.navigationBars.map((i) => i.page).toList(),\n      );\n    } else {\n      child = PageView(\n        physics: const NeverScrollableScrollPhysics(),\n        controller: _mainController.controller,\n        children: _mainController.navigationBars.map((i) => i.page).toList(),\n      );\n    }\n\n    Widget? bottomNav;\n    if (_mainController.useBottomNav) {\n      bottomNav = _bottomNav;\n      child = Row(children: [Expanded(child: child)]);\n    } else {\n      child = Row(\n        children: [\n          _sideBar(theme),\n          VerticalDivider(\n            width: 1,\n            endIndent: _padding.bottom,\n            color: theme.colorScheme.outline.withValues(alpha: 0.06),\n          ),\n          Expanded(child: child),\n        ],\n      );\n    }\n\n    child = Scaffold(\n      extendBody: true,\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(toolbarHeight: 0),\n      body: Padding(\n        padding: EdgeInsets.only(\n          left: _mainController.useBottomNav ? _padding.left : 0.0,\n          right: _padding.right,\n        ),\n        child: child,\n      ),\n      bottomNavigationBar: bottomNav,\n    );\n\n    if (PlatformUtils.isMobile) {\n      child = AnnotatedRegion<SystemUiOverlayStyle>(\n        value: SystemUiOverlayStyle(\n          systemNavigationBarColor: Colors.transparent,\n          systemNavigationBarIconBrightness: theme.brightness.reverse,\n        ),\n        child: child,\n      );\n    }\n\n    return child;\n  }\n\n  Widget _buildIcon({required NavigationBarType type, bool selected = false}) {\n    final icon = selected ? type.selectIcon : type.icon;\n    return type == .dynamics\n        ? Obx(\n            () {\n              final dynCount = _mainController.dynCount.value;\n              return Badge(\n                isLabelVisible: dynCount > 0,\n                label: _mainController.dynamicBadgeMode == .number\n                    ? Text(dynCount.toString())\n                    : null,\n                padding: const .symmetric(horizontal: 6),\n                child: icon,\n              );\n            },\n          )\n        : icon;\n  }\n\n  Widget userAndSearchVertical(ThemeData theme) {\n    return Column(\n      children: [\n        userAvatar(theme: theme, mainController: _mainController),\n        const SizedBox(height: 8),\n        msgBadge(_mainController),\n        IconButton(\n          tooltip: '搜索',\n          icon: const Icon(\n            Icons.search_outlined,\n            semanticLabel: '搜索',\n          ),\n          onPressed: () => Get.toNamed('/search'),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/main_reply/controller.dart",
    "content": "import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'\n    show MainListReply, ReplyInfo;\nimport 'package:PiliPlus/grpc/reply.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/pages/common/reply_controller.dart';\nimport 'package:get/get.dart';\n\nclass MainReplyController extends ReplyController<MainListReply> {\n  late final int oid;\n  late final int replyType;\n\n  @override\n  int get sourceId => oid;\n\n  @override\n  void onInit() {\n    super.onInit();\n    final args = Get.arguments;\n    oid = args['oid'];\n    replyType = args['replyType'];\n\n    queryData();\n  }\n\n  @override\n  Future<LoadingState<MainListReply>> customGetData() => ReplyGrpc.mainList(\n    type: replyType,\n    oid: oid,\n    mode: mode.value,\n    cursorNext: cursorNext,\n    offset: paginationReply?.nextOffset,\n  );\n\n  @override\n  List<ReplyInfo>? getDataList(MainListReply response) => response.replies;\n}\n"
  },
  {
    "path": "lib/pages/main_reply/view.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/skeleton/video_reply.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/sliver/sliver_floating_header.dart';\nimport 'package:PiliPlus/common/widgets/view_safe_area.dart';\nimport 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'\n    show ReplyInfo;\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/pages/common/fab_mixin.dart';\nimport 'package:PiliPlus/pages/main_reply/controller.dart';\nimport 'package:PiliPlus/pages/video/reply/widgets/reply_item_grpc.dart';\nimport 'package:PiliPlus/pages/video/reply_reply/view.dart';\nimport 'package:PiliPlus/utils/extension/widget_ext.dart';\nimport 'package:PiliPlus/utils/feed_back.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:easy_debounce/easy_throttle.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass MainReplyPage extends StatefulWidget {\n  const MainReplyPage({super.key});\n\n  @override\n  State<MainReplyPage> createState() => _MainReplyPageState();\n\n  static void toMainReplyPage({\n    required int oid,\n    required int replyType,\n  }) {\n    Get.toNamed(\n      '/mainReply',\n      arguments: {\n        'oid': oid,\n        'replyType': replyType,\n      },\n    );\n  }\n}\n\nclass _MainReplyPageState extends State<MainReplyPage>\n    with SingleTickerProviderStateMixin, FabMixin {\n  final _controller = Get.put(\n    MainReplyController(),\n    tag: Utils.generateRandomString(8),\n  );\n\n  late EdgeInsets padding;\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    padding = MediaQuery.viewPaddingOf(context);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final colorScheme = ColorScheme.of(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(title: const Text('查看评论')),\n      body: NotificationListener<UserScrollNotification>(\n        onNotification: (notification) {\n          final direction = notification.direction;\n          if (direction == .forward) {\n            showFab();\n          } else if (direction == .reverse) {\n            hideFab();\n          }\n          return false;\n        },\n        child: refreshIndicator(\n          onRefresh: _controller.onRefresh,\n          child: Padding(\n            padding: EdgeInsets.only(\n              left: padding.left,\n              right: padding.right,\n            ),\n            child: CustomScrollView(\n              physics: const AlwaysScrollableScrollPhysics(),\n              slivers: [\n                buildReplyHeader(colorScheme),\n                Obx(\n                  () => _buildBody(colorScheme, _controller.loadingState.value),\n                ),\n              ],\n            ),\n          ),\n        ).constraintWidth(),\n      ),\n      floatingActionButtonLocation: const NoBottomPaddingFabLocation(),\n      floatingActionButton: SlideTransition(\n        position: fabAnimation,\n        child: Padding(\n          padding: .only(bottom: padding.bottom + kFloatingActionButtonMargin),\n          child: FloatingActionButton(\n            heroTag: null,\n            onPressed: () {\n              try {\n                feedBack();\n                _controller.onReply(\n                  null,\n                  oid: _controller.oid,\n                  replyType: _controller.replyType,\n                );\n              } catch (_) {}\n            },\n            tooltip: '评论',\n            child: const Icon(Icons.reply),\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget _buildBody(\n    ColorScheme colorScheme,\n    LoadingState<List<ReplyInfo>?> loadingState,\n  ) {\n    return switch (loadingState) {\n      Loading() => SliverPrototypeExtentList.builder(\n        itemCount: 10,\n        itemBuilder: (_, _) => const VideoReplySkeleton(),\n        prototypeItem: const VideoReplySkeleton(),\n      ),\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverList.builder(\n                itemCount: response.length + 1,\n                itemBuilder: (context, index) {\n                  if (index == response.length) {\n                    _controller.onLoadMore();\n                    return Container(\n                      alignment: Alignment.center,\n                      margin: EdgeInsets.only(bottom: padding.bottom),\n                      height: 125,\n                      child: Text(\n                        _controller.isEnd ? '没有更多了' : '加载中...',\n                        style: TextStyle(\n                          fontSize: 12,\n                          color: colorScheme.outline,\n                        ),\n                      ),\n                    );\n                  } else {\n                    return ReplyItemGrpc(\n                      replyItem: response[index],\n                      replyLevel: 1,\n                      replyReply: (replyItem, id) =>\n                          replyReply(context, replyItem, id, colorScheme),\n                      onReply: _controller.onReply,\n                      onDelete: (item, subIndex) =>\n                          _controller.onRemove(index, item, subIndex),\n                      upMid: _controller.upMid,\n                      onCheckReply: (item) =>\n                          _controller.onCheckReply(item, isManual: true),\n                      onToggleTop: (item) => _controller.onToggleTop(\n                        item,\n                        index,\n                        _controller.oid,\n                        _controller.replyType,\n                      ),\n                    );\n                  }\n                },\n              )\n            : HttpError(\n                errMsg: '还没有评论',\n                onReload: _controller.onReload,\n              ),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n\n  Widget buildReplyHeader(ColorScheme colorScheme) {\n    final secondary = colorScheme.secondary;\n    return SliverFloatingHeaderWidget(\n      backgroundColor: colorScheme.surface,\n      child: Padding(\n        padding: const .fromLTRB(12, 2.5, 6, 2.5),\n        child: Row(\n          mainAxisAlignment: MainAxisAlignment.spaceBetween,\n          children: [\n            Obx(\n              () {\n                final count = _controller.count.value;\n                return Text(\n                  '${count == -1 ? 0 : NumUtils.numFormat(count)}条回复',\n                );\n              },\n            ),\n            TextButton.icon(\n              style: StyleString.buttonStyle,\n              onPressed: _controller.queryBySort,\n              icon: Icon(Icons.sort, size: 16, color: secondary),\n              label: Obx(\n                () => Text(\n                  _controller.sortType.value.label,\n                  style: TextStyle(fontSize: 13, color: secondary),\n                ),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  void replyReply(\n    BuildContext context,\n    ReplyInfo replyItem,\n    int? id,\n    ColorScheme colorScheme,\n  ) {\n    EasyThrottle.throttle('replyReply', const Duration(milliseconds: 500), () {\n      int oid = replyItem.oid.toInt();\n      int rpid = replyItem.id.toInt();\n      Get.to(\n        Scaffold(\n          resizeToAvoidBottomInset: false,\n          appBar: AppBar(\n            title: const Text('评论详情'),\n            shape: Border(\n              bottom: BorderSide(\n                color: colorScheme.outline.withValues(alpha: 0.1),\n              ),\n            ),\n          ),\n          body: ViewSafeArea(\n            child: VideoReplyReplyPanel(\n              enableSlide: false,\n              id: id,\n              oid: oid,\n              rpid: rpid,\n              isVideoDetail: false,\n              replyType: _controller.replyType,\n              firstFloor: replyItem,\n            ),\n          ).constraintWidth(),\n        ),\n        routeName: 'dynamicDetail-Copy',\n      );\n    });\n  }\n}\n"
  },
  {
    "path": "lib/pages/match_info/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/match.dart';\nimport 'package:PiliPlus/models_new/match/match_info/contest.dart';\nimport 'package:PiliPlus/pages/common/dyn/common_dyn_controller.dart';\nimport 'package:get/get.dart';\n\nclass MatchInfoController extends CommonDynController {\n  @override\n  final int oid = int.parse(Get.parameters['cid']!);\n  @override\n  final int replyType = 27;\n\n  @override\n  dynamic get sourceId => oid.toString();\n\n  final Rx<LoadingState<MatchContest?>> infoState =\n      LoadingState<MatchContest?>.loading().obs;\n\n  @override\n  void onInit() {\n    super.onInit();\n    getMatchInfo();\n  }\n\n  Future<void> getMatchInfo() async {\n    final res = await MatchHttp.matchInfo(oid);\n    if (res.isSuccess) {\n      queryData();\n    }\n    infoState.value = res;\n  }\n}\n"
  },
  {
    "path": "lib/pages/match_info/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/view_safe_area.dart';\nimport 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'\n    show ReplyInfo;\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models_new/match/match_info/contest.dart';\nimport 'package:PiliPlus/models_new/match/match_info/team.dart';\nimport 'package:PiliPlus/pages/common/dyn/common_dyn_page.dart';\nimport 'package:PiliPlus/pages/common/fab_mixin.dart'\n    show NoBottomPaddingFabLocation;\nimport 'package:PiliPlus/pages/match_info/controller.dart';\nimport 'package:PiliPlus/pages/video/reply_reply/view.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/extension/get_ext.dart';\nimport 'package:PiliPlus/utils/extension/widget_ext.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:easy_debounce/easy_throttle.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:intl/intl.dart';\n\nclass MatchInfoPage extends StatefulWidget {\n  const MatchInfoPage({super.key});\n\n  @override\n  State<MatchInfoPage> createState() => _MatchInfoPageState();\n}\n\nclass _MatchInfoPageState extends CommonDynPageState<MatchInfoPage> {\n  @override\n  final MatchInfoController controller = Get.putOrFind(\n    MatchInfoController.new,\n    tag: Get.parameters['cid']!,\n  );\n\n  @override\n  dynamic get arguments => null;\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(title: const Text('比赛详情')),\n      body: ViewSafeArea(\n        child: refreshIndicator(\n          onRefresh: controller.onRefresh,\n          child: CustomScrollView(\n            controller: scrollController,\n            physics: const AlwaysScrollableScrollPhysics(),\n            slivers: [\n              Obx(() => _buildInfo(theme, controller.infoState.value)),\n              buildReplyHeader(theme),\n              Obx(() => replyList(theme, controller.loadingState.value)),\n            ],\n          ),\n        ),\n      ).constraintWidth(),\n      floatingActionButtonLocation: const NoBottomPaddingFabLocation(),\n      floatingActionButton: SlideTransition(\n        position: fabAnimation,\n        child: fabButton,\n      ),\n    );\n  }\n\n  Widget _buildInfo(ThemeData theme, LoadingState<MatchContest?> infoState) {\n    if (infoState case Success(:final response?)) {\n      try {\n        Widget teamInfo(MatchTeam team) {\n          return Column(\n            spacing: 5,\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              NetworkImgLayer(\n                width: 50,\n                height: 50,\n                src: 'https://i1.hdslb.com${team.logo}',\n                type: ImageType.emote,\n              ),\n              Text(team.title!),\n            ],\n          );\n        }\n\n        return SliverToBoxAdapter(\n          child: Padding(\n            padding: const EdgeInsets.symmetric(vertical: 10),\n            child: Column(\n              spacing: 12,\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                Center(\n                  child: Text(\n                    '${response.season?.title ?? ''}  ${response.gameStage ?? ''}',\n                  ),\n                ),\n                Row(\n                  spacing: 20,\n                  mainAxisAlignment: MainAxisAlignment.center,\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    if (response.homeId != 0)\n                      Expanded(\n                        child: Align(\n                          alignment: const Alignment(0.8, 1),\n                          child: teamInfo(response.homeTeam!),\n                        ),\n                      ),\n                    Column(\n                      spacing: 10,\n                      mainAxisSize: MainAxisSize.min,\n                      children: [\n                        if (response.homeId != 0)\n                          Text(\n                            response.contestStatus == 1\n                                ? 'VS'\n                                : '${response.homeScore} : ${response.awayScore}',\n                            style: const TextStyle(\n                              fontSize: 25,\n                              fontWeight: FontWeight.bold,\n                            ),\n                          )\n                        else if (response.season?.logo != null)\n                          NetworkImgLayer(\n                            width: 50,\n                            height: 50,\n                            src: 'https://i1.hdslb.com${response.season!.logo}',\n                            type: ImageType.emote,\n                          ),\n                        if (response.contestStatus == 2)\n                          FilledButton.tonal(\n                            style: FilledButton.styleFrom(\n                              padding: const EdgeInsets.symmetric(\n                                horizontal: 12,\n                              ),\n                              shape: const RoundedRectangleBorder(\n                                borderRadius: BorderRadius.all(\n                                  Radius.circular(6),\n                                ),\n                              ),\n                              visualDensity: VisualDensity.compact,\n                              tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n                            ),\n                            onPressed: () =>\n                                PageUtils.toLiveRoom(response.liveRoom),\n                            child: const Text('看直播'),\n                          )\n                        else if (response.contestStatus == 3)\n                          Text(\n                            '${DateFormatUtils.dateFormat(response.stime)}${response.contestStatus == 3 ? ' 已结束' : ''}',\n                            style: TextStyle(\n                              color: theme.colorScheme.outline,\n                            ),\n                          )\n                        else if (response.contestStatus == 1)\n                          Text(\n                            DateFormatUtils.format(\n                              response.stime,\n                              format: DateFormat('yy-MM-dd HH:mm'),\n                            ),\n                            style: TextStyle(\n                              color: theme.colorScheme.outline,\n                            ),\n                          ),\n                      ],\n                    ),\n                    if (response.awayId != 0)\n                      Expanded(\n                        child: Align(\n                          alignment: const Alignment(-0.8, -1),\n                          child: teamInfo(response.awayTeam!),\n                        ),\n                      ),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        );\n      } catch (_) {\n        return const SliverToBoxAdapter();\n      }\n    }\n    return const SliverToBoxAdapter();\n  }\n\n  @override\n  void replyReply(\n    BuildContext context,\n    ReplyInfo replyItem,\n    int? id,\n    ThemeData theme,\n  ) {\n    EasyThrottle.throttle('replyReply', const Duration(milliseconds: 500), () {\n      int oid = replyItem.oid.toInt();\n      int rpid = replyItem.id.toInt();\n      Get.to(\n        Scaffold(\n          resizeToAvoidBottomInset: false,\n          appBar: AppBar(\n            title: const Text('评论详情'),\n            shape: Border(\n              bottom: BorderSide(\n                color: theme.colorScheme.outline.withValues(alpha: 0.1),\n              ),\n            ),\n          ),\n          body: ViewSafeArea(\n            child: VideoReplyReplyPanel(\n              enableSlide: false,\n              id: id,\n              oid: oid,\n              rpid: rpid,\n              isVideoDetail: false,\n              replyType: controller.replyType,\n              firstFloor: replyItem,\n            ),\n          ).constraintWidth(),\n        ),\n      );\n    });\n  }\n}\n"
  },
  {
    "path": "lib/pages/member/controller.dart",
    "content": "import 'dart:math';\n\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/member.dart';\nimport 'package:PiliPlus/http/user.dart';\nimport 'package:PiliPlus/http/video.dart';\nimport 'package:PiliPlus/models/common/member/tab_type.dart';\nimport 'package:PiliPlus/models_new/space/space/data.dart';\nimport 'package:PiliPlus/models_new/space/space/live.dart';\nimport 'package:PiliPlus/models_new/space/space/setting.dart';\nimport 'package:PiliPlus/models_new/space/space/tab2.dart';\nimport 'package:PiliPlus/pages/common/common_data_controller.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/request_utils.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart'\n    show ExtendedNestedScrollViewState;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass MemberController extends CommonDataController<SpaceData, SpaceData?>\n    with GetTickerProviderStateMixin {\n  MemberController({required this.mid});\n  int mid;\n  String? username;\n\n  late final account = Accounts.main;\n\n  Live? live;\n  int? silence;\n\n  int? isFollowed; // 被关注\n  RxInt relation = 0.obs;\n  bool get isFollow => relation.value != 0 && relation.value != 128;\n\n  SpaceSetting? spaceSetting;\n  List<SpaceTab2>? tab2;\n  late List<Tab> tabs;\n  TabController? tabController;\n  RxInt contributeInitialIndex = 0.obs;\n\n  bool? hasSeasonOrSeries;\n\n  final fromViewAid = Get.parameters['from_view_aid'];\n\n  final key = GlobalKey<ExtendedNestedScrollViewState>();\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  bool customHandleResponse(bool isRefresh, Success<SpaceData> response) {\n    final data = response.response;\n    username = data.card?.name ?? '';\n    isFollowed = data.card?.relation?.isFollowed;\n    if (data.relation == -1) {\n      relation.value = 128;\n    } else {\n      relation.value = data.card?.relation?.isFollow == 1\n          ? data.relSpecial == 1\n                ? -10\n                : data.card?.relation?.status ?? 2\n          : 0;\n    }\n    tab2 = data.tab2;\n    live = data.live;\n    silence = data.card?.silence;\n    if ((data.ugcSeason?.count != null && data.ugcSeason?.count != 0) ||\n        data.series?.item?.isNotEmpty == true) {\n      hasSeasonOrSeries = true;\n    }\n    tab2?.retainWhere((item) => MemberTabType.contains(item.param!));\n    if (tab2?.isNotEmpty == true) {\n      if (data.hasItem != true && tab2!.first.param == 'home') {\n        // remove empty home tab\n        tab2!.removeAt(0);\n      }\n      if (tab2!.isNotEmpty) {\n        int initialIndex = -1;\n        MemberTabType memberTab = Pref.memberTab;\n        if (memberTab != MemberTabType.def) {\n          initialIndex = tab2!.indexWhere((item) {\n            return item.param == memberTab.name;\n          });\n        }\n        if (initialIndex == -1) {\n          if (data.defaultTab == 'video') {\n            data.defaultTab = 'contribute';\n          }\n          initialIndex = tab2!.indexWhere((item) {\n            return item.param == data.defaultTab;\n          });\n        }\n        tabs = tab2!.map((item) => Tab(text: item.title ?? '')).toList();\n        tabController?.dispose();\n        tabController = TabController(\n          vsync: this,\n          length: tabs.length,\n          initialIndex: max(0, initialIndex),\n        );\n      }\n    }\n    if (mid == account.mid) {\n      spaceSetting = data.setting;\n    }\n    loadingState.value = response;\n    return true;\n  }\n\n  @override\n  bool handleError(String? errMsg) {\n    tab2 = const [\n      SpaceTab2(title: '动态', param: 'dynamic'),\n      SpaceTab2(\n        title: '投稿',\n        param: 'contribute',\n        items: [SpaceTab2Item(title: '视频', param: 'video')],\n      ),\n      SpaceTab2(title: '收藏', param: 'favorite'),\n      SpaceTab2(title: '追番', param: 'bangumi'),\n    ];\n    tabs = tab2!.map((item) => Tab(text: item.title)).toList();\n    tabController?.dispose();\n    tabController = TabController(\n      vsync: this,\n      length: tabs.length,\n    );\n    username = errMsg;\n    loadingState.value = const Success(null);\n    return true;\n  }\n\n  @override\n  Future<LoadingState<SpaceData>> customGetData() => MemberHttp.space(\n    mid: mid,\n    fromViewAid: fromViewAid,\n  );\n\n  void blockUser(BuildContext context) {\n    if (!account.isLogin) {\n      SmartDialog.showToast('账号未登录');\n      return;\n    }\n    showDialog(\n      context: context,\n      builder: (context) => AlertDialog(\n        title: const Text('提示'),\n        content: Text(relation.value != 128 ? '确定拉黑UP主?' : '从黑名单移除UP主'),\n        actions: [\n          TextButton(\n            onPressed: Get.back,\n            child: Text(\n              '点错了',\n              style: TextStyle(color: Theme.of(context).colorScheme.outline),\n            ),\n          ),\n          TextButton(\n            onPressed: () {\n              Get.back();\n              _onBlock();\n            },\n            child: const Text('确认'),\n          ),\n        ],\n      ),\n    );\n  }\n\n  void shareUser() {\n    Utils.shareText('https://space.bilibili.com/$mid');\n  }\n\n  Future<void> _onBlock() async {\n    final isBlocked = relation.value == 128;\n    final res = await VideoHttp.relationMod(\n      mid: mid,\n      act: isBlocked ? 6 : 5,\n      reSrc: 11,\n    );\n    if (res.isSuccess) {\n      relation.value = isBlocked ? 0 : 128;\n    }\n  }\n\n  void onFollow(BuildContext context) {\n    if (mid == account.mid) {\n      Get.toNamed('/editProfile');\n    } else if (relation.value == 128) {\n      _onBlock();\n    } else {\n      if (!account.isLogin) {\n        SmartDialog.showToast('账号未登录');\n        return;\n      }\n      RequestUtils.actionRelationMod(\n        context: context,\n        mid: mid,\n        isFollow: isFollow,\n        afterMod: (attribute) => relation.value = attribute,\n      );\n    }\n  }\n\n  @override\n  void onClose() {\n    tabController?.dispose();\n    super.onClose();\n  }\n\n  Future<void> onRemoveFan() async {\n    final res = await VideoHttp.relationMod(mid: mid, act: 7, reSrc: 11);\n    if (res.isSuccess) {\n      isFollowed = null;\n      if (relation.value == 4) {\n        relation.value = 2;\n      }\n      SmartDialog.showToast('移除成功');\n    } else {\n      res.toast();\n    }\n  }\n\n  void onTapTab(int value) {\n    if (tabController?.indexIsChanging == false &&\n        key.currentState?.outerController.hasClients == true) {\n      key.currentState!.outerController.animateTo(\n        key.currentState!.outerController.offset,\n        duration: const Duration(milliseconds: 500),\n        curve: Curves.easeInOut,\n      );\n    }\n  }\n\n  Future<void> vipExpAdd() async {\n    final res = await UserHttp.vipExpAdd();\n    if (res.isSuccess) {\n      SmartDialog.showToast('领取成功');\n    } else {\n      res.toast();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/member/view.dart",
    "content": "import 'dart:io' show Platform;\n\nimport 'package:PiliPlus/common/widgets/dialog/report_member.dart';\nimport 'package:PiliPlus/common/widgets/dynamic_sliver_app_bar/dynamic_sliver_app_bar.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/pages/coin_log/controller.dart';\nimport 'package:PiliPlus/pages/exp_log/controller.dart';\nimport 'package:PiliPlus/pages/log_table/view.dart';\nimport 'package:PiliPlus/pages/login_devices/view.dart';\nimport 'package:PiliPlus/pages/login_log/controller.dart';\nimport 'package:PiliPlus/pages/member/controller.dart';\nimport 'package:PiliPlus/pages/member/widget/user_info_card.dart';\nimport 'package:PiliPlus/pages/member_cheese/view.dart';\nimport 'package:PiliPlus/pages/member_contribute/view.dart';\nimport 'package:PiliPlus/pages/member_dynamics/view.dart';\nimport 'package:PiliPlus/pages/member_favorite/view.dart';\nimport 'package:PiliPlus/pages/member_home/view.dart';\nimport 'package:PiliPlus/pages/member_pgc/view.dart';\nimport 'package:PiliPlus/pages/member_shop/view.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:font_awesome_flutter/font_awesome_flutter.dart';\nimport 'package:get/get.dart';\n\nclass MemberPage extends StatefulWidget {\n  const MemberPage({super.key});\n\n  @override\n  State<MemberPage> createState() => _MemberPageState();\n}\n\nclass _MemberPageState extends State<MemberPage> {\n  late final int _mid;\n  late final String _heroTag;\n  late final MemberController _userController;\n  PageController? _headerController;\n  PageController getHeaderController() =>\n      _headerController ??= PageController();\n\n  @override\n  void initState() {\n    super.initState();\n    _mid = int.tryParse(Get.parameters['mid']!) ?? -1;\n    _heroTag = Utils.makeHeroTag(_mid);\n    _userController = Get.put(\n      MemberController(mid: _mid),\n      tag: _heroTag,\n    );\n  }\n\n  @override\n  void dispose() {\n    _headerController?.dispose();\n    _headerController = null;\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context).colorScheme;\n    final padding = MediaQuery.viewPaddingOf(context);\n    return Material(\n      color: theme.surface,\n      child: Obx(\n        () => switch (_userController.loadingState.value) {\n          Loading() => m3eLoading,\n          Success(:final response) => ExtendedNestedScrollView(\n            key: _userController.key,\n            onlyOneScrollInBody: true,\n            pinnedHeaderSliverHeightBuilder: () =>\n                kToolbarHeight + MediaQuery.viewPaddingOf(context).top,\n            headerSliverBuilder: (context, innerBoxIsScrolled) {\n              if (response != null) {\n                return [\n                  DynamicSliverAppBar.medium(\n                    actions: _actions(theme),\n                    title: Text(_userController.username ?? ''),\n                    flexibleSpace: Obx(\n                      () => UserInfoCard(\n                        isOwner:\n                            _userController.mid == _userController.account.mid,\n                        relation: _userController.relation.value,\n                        card: response.card!,\n                        images: response.images!,\n                        onFollow: () => _userController.onFollow(context),\n                        live: _userController.live,\n                        silence: _userController.silence,\n                        headerControllerBuilder: getHeaderController,\n                      ),\n                    ),\n                  ),\n                ];\n              }\n              return [\n                SliverAppBar(\n                  pinned: true,\n                  actions: _actions(theme),\n                  title: GestureDetector(\n                    onTap: _userController.onReload,\n                    behavior: HitTestBehavior.opaque,\n                    child: Text(_userController.username ?? ''),\n                  ),\n                ),\n              ];\n            },\n            body: _userController.tab2?.isNotEmpty == true\n                ? Padding(\n                    padding: .only(left: padding.left, right: padding.right),\n                    child: Column(\n                      children: [\n                        if ((_userController.tab2?.length ?? 0) > 1)\n                          SizedBox(\n                            height: 45,\n                            child: TabBar(\n                              controller: _userController.tabController,\n                              tabs: _userController.tabs,\n                              onTap: _userController.onTapTab,\n                              dividerColor: theme.outline.withValues(\n                                alpha: 0.2,\n                              ),\n                            ),\n                          ),\n                        Expanded(child: _buildBody),\n                      ],\n                    ),\n                  )\n                : scrollableError,\n          ),\n          Error(:final errMsg) => scrollErrorWidget(\n            errMsg: errMsg,\n            onReload: _userController.onReload,\n          ),\n        },\n      ),\n    );\n  }\n\n  List<Widget> _actions(ColorScheme theme) => [\n    IconButton(\n      tooltip: '搜索',\n      onPressed: () => Get.toNamed(\n        '/memberSearch?mid=$_mid&uname=${_userController.username}',\n      ),\n      icon: const Icon(Icons.search_outlined),\n    ),\n    PopupMenuButton(\n      icon: const Icon(Icons.more_vert),\n      itemBuilder: (_) => <PopupMenuEntry>[\n        if (_userController.account.isLogin &&\n            _userController.account.mid != _mid) ...[\n          PopupMenuItem(\n            onTap: () => _userController.blockUser(context),\n            child: Row(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                const Icon(Icons.block, size: 19),\n                const SizedBox(width: 10),\n                Text(\n                  _userController.relation.value != 128 ? '加入黑名单' : '移除黑名单',\n                ),\n              ],\n            ),\n          ),\n          if (_userController.isFollowed == 1)\n            PopupMenuItem(\n              onTap: _userController.onRemoveFan,\n              child: const Row(\n                mainAxisSize: MainAxisSize.min,\n                children: [\n                  Icon(Icons.remove_circle_outline_outlined, size: 19),\n                  SizedBox(width: 10),\n                  Text('移除粉丝'),\n                ],\n              ),\n            ),\n        ],\n        PopupMenuItem(\n          onTap: _userController.shareUser,\n          child: Row(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              const Icon(Icons.share_outlined, size: 19),\n              const SizedBox(width: 10),\n              Text(\n                _userController.account.mid != _mid ? '分享UP主' : '分享我的主页',\n              ),\n            ],\n          ),\n        ),\n        if (kDebugMode || Platform.isIOS)\n          PopupMenuItem(\n            onTap: () => PageUtils.launchURL(\n              'https://www.bilibili.com/blackboard/disablelink/go-to-up-space.html?mid=$_mid',\n            ),\n            child: const Row(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                Icon(Icons.add_box_outlined, size: 19),\n                SizedBox(width: 10),\n                Text('添加至桌面'),\n              ],\n            ),\n          ),\n        PopupMenuItem(\n          onTap: () => Get.toNamed(\n            '/upowerRank',\n            parameters: {\n              'mid': _userController.mid.toString(),\n            },\n          ),\n          child: const Row(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              Icon(Icons.electric_bolt, size: 19),\n              SizedBox(width: 10),\n              Text('充电排行榜'),\n            ],\n          ),\n        ),\n        if (_userController.account.isLogin)\n          if (_userController.mid == _userController.account.mid) ...[\n            if ((_userController\n                        .loadingState\n                        .value\n                        .dataOrNull\n                        ?.card\n                        ?.vip\n                        ?.status ??\n                    0) >\n                0)\n              PopupMenuItem(\n                onTap: _userController.vipExpAdd,\n                child: const Row(\n                  mainAxisSize: MainAxisSize.min,\n                  children: [\n                    Icon(Icons.upcoming_outlined, size: 19),\n                    SizedBox(width: 10),\n                    Text('大会员经验'),\n                  ],\n                ),\n              ),\n            PopupMenuItem(\n              onTap: () => Get.to(const LoginDevicesPage()),\n              child: const Row(\n                mainAxisSize: MainAxisSize.min,\n                children: [\n                  Icon(Icons.devices, size: 18),\n                  SizedBox(width: 10),\n                  Text('登录设备'),\n                ],\n              ),\n            ),\n            PopupMenuItem(\n              onTap: () => Get.to(\n                const LogPage(),\n                arguments: LoginLogController(),\n              ),\n              child: const Row(\n                mainAxisSize: MainAxisSize.min,\n                children: [\n                  Icon(Icons.login, size: 18),\n                  SizedBox(width: 10),\n                  Text('登录记录'),\n                ],\n              ),\n            ),\n            PopupMenuItem(\n              onTap: () => Get.to(\n                const LogPage(),\n                arguments: CoinLogController(),\n              ),\n              child: const Row(\n                mainAxisSize: MainAxisSize.min,\n                children: [\n                  Icon(FontAwesomeIcons.b, size: 16),\n                  SizedBox(width: 10),\n                  Text('硬币记录'),\n                ],\n              ),\n            ),\n            PopupMenuItem(\n              onTap: () => Get.to(\n                const LogPage(),\n                arguments: ExpLogController(),\n              ),\n              child: const Row(\n                mainAxisSize: MainAxisSize.min,\n                children: [\n                  Icon(Icons.linear_scale, size: 18),\n                  SizedBox(width: 10),\n                  Text('经验记录'),\n                ],\n              ),\n            ),\n            PopupMenuItem(\n              onTap: () => Get.toNamed('/spaceSetting'),\n              child: const Row(\n                mainAxisSize: MainAxisSize.min,\n                children: [\n                  Icon(Icons.settings_outlined, size: 19),\n                  SizedBox(width: 10),\n                  Text('空间设置'),\n                ],\n              ),\n            ),\n          ] else ...[\n            const PopupMenuDivider(),\n            PopupMenuItem(\n              onTap: () => showMemberReportDialog(\n                context,\n                name: _userController.username,\n                mid: _mid,\n              ),\n              child: Row(\n                mainAxisSize: MainAxisSize.min,\n                children: [\n                  Icon(\n                    Icons.error_outline,\n                    size: 19,\n                    color: theme.error,\n                  ),\n                  const SizedBox(width: 10),\n                  Text(\n                    '举报',\n                    style: TextStyle(color: theme.error),\n                  ),\n                ],\n              ),\n            ),\n          ],\n      ],\n    ),\n    const SizedBox(width: 4),\n  ];\n\n  Widget get _buildBody => tabBarView(\n    controller: _userController.tabController,\n    children: _userController.tab2!.map((item) {\n      return switch (item.param!) {\n        'home' => MemberHome(heroTag: _heroTag),\n        'dynamic' => MemberDynamicsPage(mid: _mid),\n        'contribute' => Obx(\n          () => MemberContribute(\n            heroTag: _heroTag,\n            initialIndex: _userController.contributeInitialIndex.value,\n            mid: _mid,\n          ),\n        ),\n        'bangumi' => MemberBangumi(\n          heroTag: _heroTag,\n          mid: _mid,\n        ),\n        'favorite' => MemberFavorite(\n          heroTag: _heroTag,\n          mid: _mid,\n        ),\n        'cheese' => MemberCheese(\n          heroTag: _heroTag,\n          mid: _mid,\n        ),\n        'shop' => MemberShop(\n          heroTag: _heroTag,\n          mid: _mid,\n        ),\n        _ => Center(child: Text(item.title ?? '')),\n      };\n    }).toList(),\n  );\n}\n"
  },
  {
    "path": "lib/pages/member/widget/header_layout_widget.dart",
    "content": "/*\n * This file is part of PiliPlus\n *\n * PiliPlus 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 * PiliPlus 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 PiliPlus.  If not, see <https://www.gnu.org/licenses/>.\n */\n\nimport 'dart:math' as math;\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart' show BoxHitTestResult, BoxParentData;\n\nconst double kHeaderHeight = 135.0;\n\nconst double kAvatarSize = 80.0;\nconst double kPendantAvatarSize = 70.0;\nconst double _kAvatarLeftPadding = 20.0;\nconst double _kAvatarTopPadding = 115.0;\nconst double _kAvatarEffectiveHeight =\n    kAvatarSize - (kHeaderHeight - _kAvatarTopPadding);\n\nconst double _kActionsTopPadding = 140.0;\nconst double _kActionsLeftPadding = 160.0;\nconst double _kActionsRightPadding = 15.0;\n\nenum HeaderType { header, avatar, actions }\n\nclass HeaderLayoutWidget\n    extends SlottedMultiChildRenderObjectWidget<HeaderType, RenderBox> {\n  final Widget header;\n  final Widget avatar;\n  final Widget actions;\n\n  const HeaderLayoutWidget({\n    super.key,\n    required this.header,\n    required this.avatar,\n    required this.actions,\n  });\n\n  @override\n  Iterable<HeaderType> get slots => HeaderType.values;\n\n  @override\n  Widget childForSlot(HeaderType slot) => switch (slot) {\n    .header => header,\n    .avatar => avatar,\n    .actions => actions,\n  };\n\n  @override\n  RenderHeaderWidget createRenderObject(BuildContext context) {\n    return RenderHeaderWidget();\n  }\n}\n\nclass RenderHeaderWidget extends RenderBox\n    with SlottedContainerRenderObjectMixin<HeaderType, RenderBox> {\n  Offset _getOffset(RenderBox child) {\n    return (child.parentData as BoxParentData).offset;\n  }\n\n  void _setOffset(RenderBox child, Offset offset) {\n    (child.parentData as BoxParentData).offset = offset;\n  }\n\n  @override\n  void performLayout() {\n    double height = kHeaderHeight;\n    final maxWidth = constraints.maxWidth;\n\n    _setOffset(\n      childForSlot(HeaderType.header)!..layout(constraints),\n      Offset.zero,\n    );\n\n    _setOffset(\n      childForSlot(HeaderType.avatar)!..layout(constraints),\n      const Offset(_kAvatarLeftPadding, _kAvatarTopPadding),\n    );\n\n    final actions = childForSlot(HeaderType.actions)!;\n    final childSize =\n        (actions..layout(\n              BoxConstraints(\n                maxWidth: math.max(\n                  0.0,\n                  maxWidth - _kActionsLeftPadding - _kActionsRightPadding,\n                ),\n              ),\n              parentUsesSize: true,\n            ))\n            .size;\n    height += (math.max(_kAvatarEffectiveHeight, childSize.height)) + 5.0;\n    _setOffset(\n      actions,\n      Offset(\n        maxWidth - childSize.width - _kActionsRightPadding,\n        _kActionsTopPadding,\n      ),\n    );\n\n    size = constraints.constrainDimensions(maxWidth, height);\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    for (var slot in HeaderType.values) {\n      final child = childForSlot(slot)!;\n      context.paintChild(child, _getOffset(child) + offset);\n    }\n  }\n\n  @override\n  bool hitTestChildren(BoxHitTestResult result, {required Offset position}) {\n    for (var slot in HeaderType.values.reversed) {\n      final child = childForSlot(slot)!;\n      final bool isHit = result.addWithPaintOffset(\n        offset: _getOffset(child),\n        position: position,\n        hitTest: (BoxHitTestResult result, Offset transformed) {\n          return child.hitTest(result, position: transformed);\n        },\n      );\n      if (isHit) {\n        return true;\n      }\n    }\n    return false;\n  }\n}\n"
  },
  {
    "path": "lib/pages/member/widget/user_info_card.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/avatars.dart';\nimport 'package:PiliPlus/common/widgets/image_viewer/hero.dart';\nimport 'package:PiliPlus/common/widgets/pendant_avatar.dart';\nimport 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/common/widgets/view_safe_area.dart';\nimport 'package:PiliPlus/models/common/image_preview_type.dart';\nimport 'package:PiliPlus/models/common/member/user_info_type.dart';\nimport 'package:PiliPlus/models_new/space/space/card.dart';\nimport 'package:PiliPlus/models_new/space/space/followings_followed_upper.dart';\nimport 'package:PiliPlus/models_new/space/space/images.dart';\nimport 'package:PiliPlus/models_new/space/space/live.dart';\nimport 'package:PiliPlus/models_new/space/space/pr_info.dart';\nimport 'package:PiliPlus/models_new/space/space/top.dart';\nimport 'package:PiliPlus/pages/fan/view.dart';\nimport 'package:PiliPlus/pages/follow/view.dart';\nimport 'package:PiliPlus/pages/follow_type/followed/view.dart';\nimport 'package:PiliPlus/pages/member/widget/header_layout_widget.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/app_scheme.dart';\nimport 'package:PiliPlus/utils/extension/context_ext.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/extension/string_ext.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/image_utils.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:cached_network_image/cached_network_image.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass UserInfoCard extends StatelessWidget {\n  const UserInfoCard({\n    super.key,\n    required this.isOwner,\n    required this.card,\n    required this.images,\n    required this.relation,\n    required this.onFollow,\n    this.live,\n    this.silence,\n    required this.headerControllerBuilder,\n  });\n\n  final bool isOwner;\n  final int relation;\n  final SpaceCard card;\n  final SpaceImages images;\n  final VoidCallback onFollow;\n  final Live? live;\n  final int? silence;\n  final ValueGetter<PageController> headerControllerBuilder;\n\n  @override\n  Widget build(BuildContext context) {\n    final colorScheme = Theme.of(context).colorScheme;\n    final isLight = colorScheme.isLight;\n    final width = context.width;\n    final isPortrait = width < 600;\n    return ViewSafeArea(\n      top: !isPortrait,\n      child: isPortrait\n          ? _buildV(context, colorScheme, isLight, width)\n          : _buildH(context, colorScheme, isLight),\n    );\n  }\n\n  Widget _countWidget({\n    required ColorScheme colorScheme,\n    required UserInfoType type,\n  }) {\n    int? count;\n    VoidCallback? onTap;\n    switch (type) {\n      case UserInfoType.fan:\n        count = card.fans;\n        onTap = () => FansPage.toFansPage(\n          mid: card.mid,\n          name: card.name,\n        );\n      case UserInfoType.follow:\n        count = card.attention;\n        onTap = () => FollowPage.toFollowPage(\n          mid: card.mid,\n          name: card.name,\n        );\n      case UserInfoType.like:\n        count = card.likes?.likeNum;\n    }\n    return GestureDetector(\n      behavior: .opaque,\n      onTap: onTap,\n      child: Align(\n        alignment: type.alignment,\n        widthFactor: 1.0,\n        child: Column(\n          mainAxisSize: .min,\n          children: [\n            Text(\n              NumUtils.numFormat(count),\n              style: const TextStyle(fontSize: 14),\n            ),\n            Text(\n              type.title,\n              style: TextStyle(\n                height: 1.2,\n                fontSize: 12,\n                color: colorScheme.outline,\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  List<Widget> _buildLeft(\n    BuildContext context,\n    ColorScheme colorScheme,\n    bool isLight,\n  ) => [\n    Padding(\n      padding: const EdgeInsets.only(left: 20, right: 20),\n      child: Wrap(\n        spacing: 8,\n        runSpacing: 8,\n        crossAxisAlignment: WrapCrossAlignment.center,\n        children: [\n          GestureDetector(\n            onTap: () => Utils.copyText(card.name!),\n            child: Text(\n              card.name!,\n              strutStyle: const StrutStyle(\n                height: 1,\n                leading: 0,\n                fontSize: 17,\n                fontWeight: FontWeight.bold,\n              ),\n              style: TextStyle(\n                height: 1,\n                fontSize: 17,\n                fontWeight: FontWeight.bold,\n                color: (card.vip?.status ?? -1) > 0 && card.vip?.type == 2\n                    ? colorScheme.vipColor\n                    : null,\n              ),\n            ),\n          ),\n          Image.asset(\n            Utils.levelName(\n              card.levelInfo!.currentLevel!,\n              isSeniorMember: card.levelInfo?.identity == 2,\n            ),\n            height: 11,\n            cacheHeight: 11.cacheSize(context),\n            semanticLabel: '等级${card.levelInfo?.currentLevel}',\n          ),\n          if (card.vip?.status == 1)\n            Container(\n              padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 3),\n              decoration: BoxDecoration(\n                borderRadius: StyleString.mdRadius,\n                color: colorScheme.vipColor,\n              ),\n              child: Text(\n                card.vip?.label?.text ?? '大会员',\n                strutStyle: const StrutStyle(\n                  height: 1,\n                  fontSize: 10,\n                  fontWeight: FontWeight.bold,\n                ),\n                style: const TextStyle(\n                  height: 1,\n                  fontWeight: FontWeight.bold,\n                  fontSize: 10,\n                  color: Colors.white,\n                ),\n              ),\n            ),\n          // if (card.nameplate?.imageSmall?.isNotEmpty == true)\n          //   CachedNetworkImage(\n          //     imageUrl: ImageUtils.thumbnailUrl(card.nameplate!.imageSmall!),\n          //     height: 20,\n          //     placeholder: (context, url) {\n          //       return const SizedBox.shrink();\n          //     },\n          //   ),\n        ],\n      ),\n    ),\n    if (card.officialVerify?.desc?.isNotEmpty == true)\n      Container(\n        margin: const EdgeInsets.only(left: 20, top: 8, right: 20),\n        padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 2),\n        decoration: BoxDecoration(\n          borderRadius: const BorderRadius.all(Radius.circular(12)),\n          color: colorScheme.onInverseSurface,\n        ),\n        child: Text.rich(\n          TextSpan(\n            children: [\n              if (card.officialVerify?.icon?.isNotEmpty == true) ...[\n                WidgetSpan(\n                  alignment: PlaceholderAlignment.middle,\n                  child: DecoratedBox(\n                    decoration: BoxDecoration(\n                      shape: BoxShape.circle,\n                      color: colorScheme.surface,\n                    ),\n                    child: Icon(\n                      Icons.offline_bolt,\n                      color: card.officialVerify?.type == 0\n                          ? const Color(0xFFFFCC00)\n                          : Colors.lightBlueAccent,\n                      size: 18,\n                    ),\n                  ),\n                ),\n                const TextSpan(\n                  text: ' ',\n                ),\n              ],\n              TextSpan(\n                text: card.officialVerify!.spliceTitle!,\n                style: TextStyle(\n                  fontSize: 12,\n                  fontWeight: FontWeight.bold,\n                  color: colorScheme.onSurface.withValues(alpha: 0.7),\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    if (card.sign?.isNotEmpty == true)\n      Padding(\n        padding: const EdgeInsets.only(left: 20, top: 6, right: 20),\n        child: SelectableText(\n          card.sign!.trim().replaceAll(RegExp(r'\\n{2,}'), '\\n'),\n          style: const TextStyle(fontSize: 14),\n        ),\n      ),\n    if (card.followingsFollowedUpper?.items?.isNotEmpty == true) ...[\n      const SizedBox(height: 6),\n      _buildFollowedUp(colorScheme, card.followingsFollowedUpper!),\n    ],\n    Padding(\n      padding: const EdgeInsets.only(left: 20, top: 6, right: 20),\n      child: Wrap(\n        spacing: 10,\n        runSpacing: 8,\n        crossAxisAlignment: WrapCrossAlignment.center,\n        children: [\n          GestureDetector(\n            onTap: () => Utils.copyText(card.mid.toString()),\n            child: Text(\n              'UID: ${card.mid}',\n              style: TextStyle(\n                fontSize: 12,\n                color: colorScheme.outline,\n              ),\n            ),\n          ),\n          ...?card.spaceTag?.map(\n            (item) {\n              final hasUri = item.uri?.isNotEmpty == true;\n              final child = Text(\n                item.title ?? '',\n                style: TextStyle(\n                  fontSize: 12,\n                  color: hasUri ? colorScheme.secondary : colorScheme.outline,\n                ),\n              );\n              if (hasUri) {\n                return GestureDetector(\n                  onTap: () => PiliScheme.routePushFromUrl(item.uri!),\n                  child: child,\n                );\n              }\n              return child;\n            },\n          ),\n        ],\n      ),\n    ),\n    if (silence == 1)\n      Container(\n        width: double.infinity,\n        decoration: BoxDecoration(\n          borderRadius: const BorderRadius.all(Radius.circular(6)),\n          color: isLight ? colorScheme.errorContainer : colorScheme.error,\n        ),\n        margin: const EdgeInsets.only(left: 20, top: 8, right: 20),\n        padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),\n        child: Text.rich(\n          TextSpan(\n            children: [\n              WidgetSpan(\n                alignment: PlaceholderAlignment.middle,\n                child: Icon(\n                  Icons.info,\n                  size: 17,\n                  color: isLight\n                      ? colorScheme.onErrorContainer\n                      : colorScheme.onError,\n                ),\n              ),\n              TextSpan(\n                text: ' 该账号封禁中',\n                style: TextStyle(\n                  color: isLight\n                      ? colorScheme.onErrorContainer\n                      : colorScheme.onError,\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n  ];\n\n  Column _buildRight(ColorScheme colorScheme) => Column(\n    mainAxisSize: MainAxisSize.min,\n    children: [\n      Row(\n        children: UserInfoType.values\n            .map(\n              (e) => Expanded(\n                child: _countWidget(\n                  colorScheme: colorScheme,\n                  type: e,\n                ),\n              ),\n            )\n            .expand((child) sync* {\n              yield const SizedBox(\n                height: 15,\n                width: 1,\n                child: VerticalDivider(),\n              );\n              yield child;\n            })\n            .skip(1)\n            .toList(),\n      ),\n      const SizedBox(height: 5),\n      Row(\n        spacing: 10,\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          if (!isOwner)\n            IconButton.outlined(\n              onPressed: () {\n                if (Accounts.main.isLogin) {\n                  int mid = int.parse(card.mid!);\n                  Get.toNamed(\n                    '/whisperDetail',\n                    arguments: {\n                      'talkerId': mid,\n                      'name': card.name,\n                      'face': card.face,\n                      'mid': mid,\n                      'isLive': live?.liveStatus == 1,\n                    },\n                  );\n                }\n              },\n              icon: const Icon(Icons.mail_outline, size: 21),\n              style: IconButton.styleFrom(\n                side: BorderSide(\n                  width: 1.0,\n                  color: colorScheme.outline.withValues(alpha: 0.3),\n                ),\n                tapTargetSize: .padded,\n                padding: EdgeInsets.zero,\n                visualDensity: VisualDensity.compact,\n              ),\n            ),\n          Expanded(\n            child: FilledButton.tonal(\n              onPressed: onFollow,\n              style: FilledButton.styleFrom(\n                backgroundColor: relation != 0\n                    ? colorScheme.onInverseSurface\n                    : null,\n                tapTargetSize: .padded,\n                visualDensity: const VisualDensity(vertical: -1.8),\n              ),\n              child: Text.rich(\n                style: TextStyle(\n                  color: relation != 0 ? colorScheme.outline : null,\n                ),\n                TextSpan(\n                  children: [\n                    if (relation != 0 && relation != 128) ...[\n                      WidgetSpan(\n                        alignment: PlaceholderAlignment.middle,\n                        child: Icon(\n                          Icons.sort,\n                          size: 16,\n                          color: colorScheme.outline,\n                        ),\n                      ),\n                      const TextSpan(text: ' '),\n                    ],\n                    TextSpan(\n                      text: isOwner\n                          ? '编辑资料'\n                          : switch (relation) {\n                              0 => '关注',\n                              1 => '悄悄关注',\n                              2 => '已关注',\n                              // 3 => '回关',\n                              4 || 6 => '已互关',\n                              128 => '移除黑名单',\n                              -10 => '特别关注', // 该状态码并不是官方状态码\n                              _ => relation.toString(),\n                            },\n                    ),\n                  ],\n                ),\n              ),\n            ),\n          ),\n        ],\n      ),\n    ],\n  );\n\n  Widget _buildAvatar(bool hasPendant) => fromHero(\n    tag: '${card.face}$hashCode',\n    child: PendantAvatar(\n      avatar: card.face,\n      size: hasPendant ? kPendantAvatarSize : kAvatarSize,\n      isMemberAvatar: true,\n      badgeSize: 20,\n      officialType: card.officialVerify?.type,\n      isVip: (card.vip?.status ?? -1) > 0,\n      garbPendantImage: card.pendant?.image,\n      roomId: live?.liveStatus == 1 ? live!.roomid : null,\n      onTap: () => PageUtils.imageView(\n        tag: hashCode.toString(),\n        imgList: [SourceModel(url: card.face.http2https)],\n      ),\n    ),\n  );\n\n  Column _buildV(\n    BuildContext context,\n    ColorScheme scheme,\n    bool isLight,\n    double width,\n  ) {\n    final hasPendant = card.pendant?.image?.isNotEmpty ?? false;\n    final imgUrls = images.collectionTopSimple?.top?.imgUrls;\n    return Column(\n      mainAxisSize: MainAxisSize.min,\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        HeaderLayoutWidget(\n          header: imgUrls != null && imgUrls.isNotEmpty\n              ? _buildCollectionHeader(context, scheme, isLight, imgUrls, width)\n              : _buildHeader(\n                  context,\n                  isLight,\n                  width,\n                  (isLight\n                          ? images.imgUrl\n                          : images.nightImgurl.isNullOrEmpty\n                          ? images.imgUrl\n                          : images.nightImgurl)\n                      .http2https,\n                ),\n          avatar: _buildAvatar(hasPendant),\n          actions: _buildRight(scheme),\n        ),\n        const SizedBox(height: 5),\n        ..._buildLeft(context, scheme, isLight),\n        if (card.prInfo?.content?.isNotEmpty == true)\n          buildPrInfo(context, scheme, isLight, card.prInfo!),\n        const SizedBox(height: 5),\n      ],\n    );\n  }\n\n  Widget _buildCollectionHeader(\n    BuildContext context,\n    ColorScheme scheme,\n    bool isLight,\n    List<TopImage> imgUrls,\n    double width,\n  ) {\n    if (imgUrls.length == 1) {\n      final img = imgUrls.first;\n      return _buildHeader(\n        context,\n        isLight,\n        width,\n        img.header,\n        filter: false,\n        fullCover: img.fullCover,\n        alignment: Alignment(0.0, img.dy),\n      );\n    }\n    final controller = headerControllerBuilder();\n    final memCacheWidth = width.cacheSize(context);\n    return GestureDetector(\n      behavior: .opaque,\n      onTap: () => PageUtils.imageView(\n        initialPage: controller.page?.round() ?? 0,\n        imgList: imgUrls.map((e) => SourceModel(url: e.fullCover)).toList(),\n        onPageChanged: controller.jumpToPage,\n      ),\n      child: Stack(\n        children: [\n          SizedBox(\n            width: .infinity,\n            height: kHeaderHeight,\n            child: PageView.builder(\n              controller: controller,\n              itemCount: imgUrls.length,\n              physics: clampingScrollPhysics,\n              itemBuilder: (context, index) {\n                final img = imgUrls[index];\n                return fromHero(\n                  tag: img.fullCover,\n                  child: CachedNetworkImage(\n                    fit: .cover,\n                    alignment: Alignment(0.0, img.dy),\n                    height: kHeaderHeight,\n                    width: width,\n                    memCacheWidth: memCacheWidth,\n                    imageUrl: ImageUtils.thumbnailUrl(img.header),\n                    fadeInDuration: const Duration(milliseconds: 120),\n                    fadeOutDuration: const Duration(milliseconds: 120),\n                    placeholder: (_, _) =>\n                        const SizedBox(width: .infinity, height: kHeaderHeight),\n                  ),\n                );\n              },\n            ),\n          ),\n          Positioned(\n            left: 0,\n            right: 0,\n            bottom: 0,\n            child: HeaderIndicator(\n              length: imgUrls.length,\n              pageController: controller,\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget _buildHeader(\n    BuildContext context,\n    bool isLight,\n    double width,\n    String imgUrl, {\n    bool filter = true,\n    String? fullCover,\n    Alignment alignment = .center,\n  }) {\n    final img = fullCover ?? imgUrl;\n    return GestureDetector(\n      behavior: .opaque,\n      onTap: () => PageUtils.imageView(imgList: [SourceModel(url: img)]),\n      child: fromHero(\n        tag: img,\n        child: CachedNetworkImage(\n          fit: .cover,\n          alignment: alignment,\n          height: kHeaderHeight,\n          width: width,\n          memCacheWidth: width.cacheSize(context),\n          imageUrl: ImageUtils.thumbnailUrl(imgUrl),\n          placeholder: (_, _) =>\n              const SizedBox(width: .infinity, height: kHeaderHeight),\n          color: filter\n              ? isLight\n                    ? const Color(0x5DFFFFFF)\n                    : const Color(0x8D000000)\n              : null,\n          colorBlendMode: filter\n              ? isLight\n                    ? BlendMode.lighten\n                    : BlendMode.darken\n              : null,\n          fadeInDuration: const Duration(milliseconds: 120),\n          fadeOutDuration: const Duration(milliseconds: 120),\n        ),\n      ),\n    );\n  }\n\n  Widget buildPrInfo(\n    BuildContext context,\n    ColorScheme colorScheme,\n    bool isLight,\n    SpacePrInfo prInfo,\n  ) {\n    final textColor = Utils.parseColor(\n      isLight ? prInfo.textColor : prInfo.textColorNight,\n    );\n    String? icon = !isLight && prInfo.iconNight?.isNotEmpty == true\n        ? prInfo.iconNight\n        : prInfo.icon?.isNotEmpty == true\n        ? prInfo.icon\n        : null;\n\n    Widget child = Container(\n      margin: const EdgeInsets.only(top: 8),\n      padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10),\n      color: Utils.parseColor(isLight ? prInfo.bgColor : prInfo.bgColorNight),\n      child: Row(\n        children: [\n          if (icon != null) ...[\n            CachedNetworkImage(\n              height: 20,\n              memCacheHeight: 20.cacheSize(context),\n              imageUrl: ImageUtils.thumbnailUrl(icon),\n              placeholder: (_, _) => const SizedBox.shrink(),\n              fadeInDuration: .zero,\n              fadeOutDuration: .zero,\n            ),\n            const SizedBox(width: 16),\n          ],\n          Expanded(\n            child: Text(\n              card.prInfo!.content!,\n              style: TextStyle(fontSize: 13, color: textColor),\n            ),\n          ),\n          if (prInfo.url?.isNotEmpty == true) ...[\n            const SizedBox(width: 10),\n            Icon(\n              Icons.keyboard_arrow_right,\n              color: textColor,\n            ),\n          ],\n        ],\n      ),\n    );\n    if (prInfo.url?.isNotEmpty == true) {\n      return GestureDetector(\n        onTap: () => PageUtils.handleWebview(prInfo.url!),\n        child: child,\n      );\n    }\n    return child;\n  }\n\n  Column _buildH(BuildContext context, ColorScheme colorScheme, bool isLight) =>\n      Column(\n        mainAxisSize: MainAxisSize.min,\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          // _buildHeader(context),\n          const SizedBox(height: kToolbarHeight),\n          Row(\n            children: [\n              const SizedBox(width: 20),\n              Padding(\n                padding: EdgeInsets.only(\n                  top: 10,\n                  bottom: card.prInfo?.content?.isNotEmpty == true ? 0 : 10,\n                ),\n                child: _buildAvatar(card.pendant?.image?.isNotEmpty ?? false),\n              ),\n              const SizedBox(width: 10),\n              Expanded(\n                flex: 5,\n                child: Column(\n                  mainAxisSize: MainAxisSize.min,\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    const SizedBox(height: 10),\n                    ..._buildLeft(context, colorScheme, isLight),\n                    const SizedBox(height: 5),\n                  ],\n                ),\n              ),\n              Expanded(\n                flex: 3,\n                child: _buildRight(colorScheme),\n              ),\n              const SizedBox(width: 20),\n            ],\n          ),\n          if (card.prInfo?.content?.isNotEmpty == true)\n            buildPrInfo(context, colorScheme, isLight, card.prInfo!),\n        ],\n      );\n\n  Widget _buildFollowedUp(\n    ColorScheme colorScheme,\n    FollowingsFollowedUpper item,\n  ) {\n    var list = item.items!;\n    final flag = list.length > 3;\n    if (flag) list = list.sublist(0, 3);\n    Widget child = Row(\n      mainAxisSize: MainAxisSize.min,\n      children: [\n        const SizedBox(width: 20),\n        avatars(colorScheme: colorScheme, users: list),\n        const SizedBox(width: 4),\n        Flexible(\n          child: Text(\n            list.map((e) => e.name).join('、'),\n            maxLines: 1,\n            overflow: TextOverflow.ellipsis,\n            style: TextStyle(\n              fontSize: 13,\n              color: colorScheme.onSurfaceVariant,\n            ),\n          ),\n        ),\n        Text(\n          '${flag ? '等${item.items!.length}人' : ''}也关注了TA ',\n          style: TextStyle(fontSize: 13, color: colorScheme.outline),\n        ),\n        Icon(\n          Icons.keyboard_arrow_right,\n          size: 20,\n          color: colorScheme.outline,\n        ),\n        const SizedBox(width: 10),\n      ],\n    );\n    return GestureDetector(\n      onTap: () => FollowedPage.toFollowedPage(mid: card.mid, name: card.name),\n      child: child,\n    );\n  }\n}\n\nclass HeaderIndicator extends StatefulWidget {\n  const HeaderIndicator({\n    super.key,\n    required this.length,\n    required this.pageController,\n  });\n\n  final int length;\n  final PageController pageController;\n\n  @override\n  State<HeaderIndicator> createState() => _HeaderIndicatorState();\n}\n\nclass _HeaderIndicatorState extends State<HeaderIndicator> {\n  late double _progress;\n\n  @override\n  void initState() {\n    super.initState();\n    _updateProgress();\n    widget.pageController.addListener(_listener);\n  }\n\n  void _listener() {\n    _updateProgress();\n    setState(() {});\n  }\n\n  void _updateProgress() {\n    _progress = ((widget.pageController.page ?? 0) + 1) / widget.length;\n  }\n\n  @override\n  void dispose() {\n    widget.pageController.removeListener(_listener);\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return LinearProgressIndicator(\n      // ignore: deprecated_member_use\n      year2023: true,\n      minHeight: 3.5,\n      backgroundColor: const Color(0xA09E9E9E),\n      value: _progress,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_article/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/member.dart';\nimport 'package:PiliPlus/models_new/space/space_article/data.dart';\nimport 'package:PiliPlus/models_new/space/space_article/item.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\n\nclass MemberArticleCtr\n    extends CommonListController<SpaceArticleData, SpaceArticleItem> {\n  MemberArticleCtr({\n    required this.mid,\n  });\n\n  final int mid;\n\n  int count = -1;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  List<SpaceArticleItem>? getDataList(SpaceArticleData response) {\n    count = response.count ?? -1;\n    return response.item;\n  }\n\n  @override\n  void checkIsEnd(int length) {\n    if (length >= count) {\n      isEnd = true;\n    }\n  }\n\n  @override\n  Future<LoadingState<SpaceArticleData>> customGetData() =>\n      MemberHttp.spaceArticle(mid: mid, page: page);\n}\n"
  },
  {
    "path": "lib/pages/member_article/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/space/space_article/item.dart';\nimport 'package:PiliPlus/pages/member_article/controller.dart';\nimport 'package:PiliPlus/pages/member_article/widget/item.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass MemberArticle extends StatefulWidget {\n  const MemberArticle({\n    super.key,\n    required this.heroTag,\n    required this.mid,\n  });\n\n  final String? heroTag;\n  final int mid;\n\n  @override\n  State<MemberArticle> createState() => _MemberArticleState();\n}\n\nclass _MemberArticleState extends State<MemberArticle>\n    with AutomaticKeepAliveClientMixin, GridMixin {\n  @override\n  bool get wantKeepAlive => true;\n\n  late final MemberArticleCtr _controller;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = Get.put(\n      MemberArticleCtr(mid: widget.mid),\n      tag: widget.heroTag,\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    return refreshIndicator(\n      onRefresh: _controller.onRefresh,\n      child: CustomScrollView(\n        physics: const AlwaysScrollableScrollPhysics(),\n        slivers: [\n          SliverPadding(\n            padding: EdgeInsets.only(\n              top: 7,\n              bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n            ),\n            sliver: Obx(() => _buildBody(_controller.loadingState.value)),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget _buildBody(LoadingState<List<SpaceArticleItem>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => gridSkeleton,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverGrid.builder(\n                gridDelegate: gridDelegate,\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    _controller.onLoadMore();\n                  }\n                  return MemberArticleItem(\n                    item: response[index],\n                  );\n                },\n                itemCount: response.length,\n              )\n            : HttpError(onReload: _controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_article/widget/item.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/stat/stat.dart';\nimport 'package:PiliPlus/models/common/stat_type.dart';\nimport 'package:PiliPlus/models_new/space/space_article/item.dart';\nimport 'package:PiliPlus/utils/app_scheme.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\n\nclass MemberArticleItem extends StatelessWidget {\n  const MemberArticleItem({super.key, required this.item});\n\n  final SpaceArticleItem item;\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    final outline = theme.colorScheme.outline;\n    void onLongPress() => imageSaveDialog(\n      title: item.title,\n      cover: item.originImageUrls?.firstOrNull,\n    );\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onTap: () {\n          if (item.uri?.isNotEmpty == true) {\n            PiliScheme.routePushFromUrl(item.uri!);\n          }\n        },\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        child: Padding(\n          padding: const EdgeInsets.symmetric(\n            horizontal: StyleString.safeSpace,\n            vertical: 5,\n          ),\n          child: Row(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              if (item.originImageUrls?.firstOrNull?.isNotEmpty == true) ...[\n                AspectRatio(\n                  aspectRatio: StyleString.aspectRatio,\n                  child: LayoutBuilder(\n                    builder:\n                        (BuildContext context, BoxConstraints boxConstraints) {\n                          return NetworkImgLayer(\n                            src: item.originImageUrls!.first,\n                            width: boxConstraints.maxWidth,\n                            height: boxConstraints.maxHeight,\n                          );\n                        },\n                  ),\n                ),\n                const SizedBox(width: 10),\n              ],\n              Expanded(\n                child: Column(\n                  mainAxisSize: MainAxisSize.min,\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    if (item.title?.isNotEmpty == true) ...[\n                      Expanded(\n                        child: Text(\n                          item.title!,\n                          maxLines: 2,\n                          overflow: TextOverflow.ellipsis,\n                          style: TextStyle(\n                            fontSize: theme.textTheme.bodyMedium!.fontSize,\n                            height: 1.42,\n                            letterSpacing: 0.3,\n                          ),\n                        ),\n                      ),\n                    ],\n                    Text(\n                      '${item.publishTimeText}',\n                      style: TextStyle(\n                        fontSize: 12,\n                        height: 1,\n                        color: outline,\n                      ),\n                    ),\n                    const SizedBox(height: 3),\n                    Row(\n                      spacing: 16,\n                      children: [\n                        StatWidget(\n                          type: StatType.view,\n                          value: item.stats?.view,\n                          color: outline,\n                        ),\n                        StatWidget(\n                          type: StatType.reply,\n                          value: item.stats?.reply,\n                          color: outline,\n                        ),\n                      ],\n                    ),\n                  ],\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_audio/controller.dart",
    "content": "import 'package:PiliPlus/grpc/bilibili/app/listener/v1.pbenum.dart'\n    show PlaylistSource;\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/member.dart';\nimport 'package:PiliPlus/models_new/space/space_audio/data.dart';\nimport 'package:PiliPlus/models_new/space/space_audio/item.dart';\nimport 'package:PiliPlus/pages/audio/view.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\n\nclass MemberAudioController\n    extends CommonListController<SpaceAudioData, SpaceAudioItem> {\n  MemberAudioController(this.mid);\n\n  final int mid;\n  int? totalSize;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  void checkIsEnd(int length) {\n    if (totalSize != null && length >= totalSize!) {\n      isEnd = true;\n    }\n  }\n\n  @override\n  List<SpaceAudioItem>? getDataList(SpaceAudioData response) {\n    totalSize = response.totalSize;\n    return response.items;\n  }\n\n  @override\n  Future<LoadingState<SpaceAudioData>> customGetData() => MemberHttp.spaceAudio(\n    page: page,\n    mid: mid,\n  );\n\n  void toViewPlayAll() {\n    final item = loadingState.value.data!.first;\n    AudioPage.toAudioPage(\n      itemType: 3,\n      id: item.uid!,\n      oid: item.id!,\n      from: PlaylistSource.MEM_SPACE,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_audio/view.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/common/widgets/sliver/sliver_floating_header.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/space/space_audio/item.dart';\nimport 'package:PiliPlus/pages/member_audio/controller.dart';\nimport 'package:PiliPlus/pages/member_audio/widgets/item.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass MemberAudio extends StatefulWidget {\n  const MemberAudio({\n    super.key,\n    required this.heroTag,\n    required this.mid,\n  });\n\n  final String? heroTag;\n  final int mid;\n\n  @override\n  State<MemberAudio> createState() => _MemberAudioState();\n}\n\nclass _MemberAudioState extends State<MemberAudio>\n    with AutomaticKeepAliveClientMixin {\n  late final MemberAudioController _controller;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = Get.put(\n      MemberAudioController(widget.mid),\n      tag: widget.heroTag,\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final colorScheme = ColorScheme.of(context);\n    return refreshIndicator(\n      onRefresh: _controller.onRefresh,\n      child: CustomScrollView(\n        physics: const AlwaysScrollableScrollPhysics(),\n        slivers: [\n          SliverPadding(\n            padding: EdgeInsets.only(\n              bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n            ),\n            sliver: Obx(\n              () => _buildBody(colorScheme, _controller.loadingState.value),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  @override\n  bool get wantKeepAlive => true;\n\n  late final gridDelegate = SliverGridDelegateWithExtentAndRatio(\n    mainAxisSpacing: 2,\n    maxCrossAxisExtent: Grid.smallCardWidth * 2,\n    childAspectRatio: StyleString.aspectRatio * 2.6,\n    minHeight: MediaQuery.textScalerOf(context).scale(90),\n  );\n\n  Widget _buildBody(\n    ColorScheme colorScheme,\n    LoadingState<List<SpaceAudioItem>?> loadingState,\n  ) {\n    return switch (loadingState) {\n      Loading() => linearLoading,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverMainAxisGroup(\n                slivers: [\n                  SliverFloatingHeaderWidget(\n                    backgroundColor: colorScheme.surface,\n                    child: Padding(\n                      padding: const EdgeInsets.fromLTRB(14, 2.5, 8, 2.5),\n                      child: Row(\n                        children: [\n                          Text(\n                            '共${_controller.totalSize ?? 0}首',\n                            style: const TextStyle(fontSize: 13),\n                          ),\n                          Padding(\n                            padding: const EdgeInsets.only(left: 6),\n                            child: TextButton.icon(\n                              style: StyleString.buttonStyle,\n                              onPressed: _controller.toViewPlayAll,\n                              icon: Icon(\n                                Icons.play_circle_outline_rounded,\n                                size: 16,\n                                color: colorScheme.secondary,\n                              ),\n                              label: Text(\n                                '播放全部',\n                                style: TextStyle(\n                                  fontSize: 13,\n                                  color: colorScheme.secondary,\n                                ),\n                              ),\n                            ),\n                          ),\n                        ],\n                      ),\n                    ),\n                  ),\n                  SliverGrid.builder(\n                    gridDelegate: gridDelegate,\n                    itemBuilder: (context, index) {\n                      if (index == response.length - 1) {\n                        _controller.onLoadMore();\n                      }\n                      return MemberAudioItem(\n                        item: response[index],\n                      );\n                    },\n                    itemCount: response.length,\n                  ),\n                ],\n              )\n            : HttpError(onReload: _controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_audio/widgets/item.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/stat/stat.dart';\nimport 'package:PiliPlus/grpc/bilibili/app/listener/v1.pbenum.dart'\n    show PlaylistSource;\nimport 'package:PiliPlus/models/common/stat_type.dart';\nimport 'package:PiliPlus/models_new/space/space_audio/item.dart';\nimport 'package:PiliPlus/pages/audio/view.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\n\nclass MemberAudioItem extends StatelessWidget {\n  const MemberAudioItem({super.key, required this.item});\n\n  final SpaceAudioItem item;\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    final hasStat = item.statistic != null;\n    void onLongPress() => imageSaveDialog(title: item.title, cover: item.cover);\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onTap: () => AudioPage.toAudioPage(\n          itemType: 3,\n          id: item.uid!,\n          oid: item.id!,\n          from: PlaylistSource.MEM_SPACE,\n        ),\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        child: Padding(\n          padding: const EdgeInsets.symmetric(\n            horizontal: StyleString.safeSpace,\n            vertical: 5,\n          ),\n          child: Row(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              AspectRatio(\n                aspectRatio: 1,\n                child: LayoutBuilder(\n                  builder:\n                      (BuildContext context, BoxConstraints boxConstraints) {\n                        return NetworkImgLayer(\n                          src: item.cover,\n                          width: boxConstraints.maxWidth,\n                          height: boxConstraints.maxHeight,\n                          borderRadius: const BorderRadius.all(\n                            Radius.circular(4),\n                          ),\n                        );\n                      },\n                ),\n              ),\n              const SizedBox(width: 10),\n              Expanded(\n                child: Column(\n                  mainAxisSize: MainAxisSize.min,\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    Text(\n                      item.title!,\n                      maxLines: 2,\n                      overflow: TextOverflow.ellipsis,\n                    ),\n                    const SizedBox(height: 3),\n                    Text(\n                      DateFormatUtils.dateFormat(\n                        hasStat ? item.ctime! ~/ 1000 : item.ctime!,\n                      ),\n                      style: TextStyle(\n                        fontSize: 13,\n                        color: theme.colorScheme.onSurfaceVariant,\n                      ),\n                    ),\n                    if (hasStat)\n                      Row(\n                        spacing: 16,\n                        children: [\n                          StatWidget(\n                            type: StatType.listen,\n                            value: item.statistic!.play,\n                          ),\n                          StatWidget(\n                            type: StatType.reply,\n                            value: item.statistic!.comment,\n                          ),\n                        ],\n                      ),\n                  ],\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_cheese/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/member.dart';\nimport 'package:PiliPlus/models_new/space/space_cheese/data.dart';\nimport 'package:PiliPlus/models_new/space/space_cheese/item.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\n\nclass MemberCheeseController\n    extends CommonListController<SpaceCheeseData, SpaceCheeseItem> {\n  MemberCheeseController(this.mid);\n\n  final int mid;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  List<SpaceCheeseItem>? getDataList(SpaceCheeseData response) {\n    isEnd = response.page?.next == false;\n    return response.items;\n  }\n\n  @override\n  Future<LoadingState<SpaceCheeseData>> customGetData() =>\n      MemberHttp.spaceCheese(\n        page: page,\n        mid: mid,\n      );\n}\n"
  },
  {
    "path": "lib/pages/member_cheese/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/space/space_cheese/item.dart';\nimport 'package:PiliPlus/pages/member_cheese/controller.dart';\nimport 'package:PiliPlus/pages/member_cheese/widgets/item.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass MemberCheese extends StatefulWidget {\n  const MemberCheese({\n    super.key,\n    required this.heroTag,\n    required this.mid,\n  });\n\n  final String? heroTag;\n  final int mid;\n\n  @override\n  State<MemberCheese> createState() => _MemberCheeseState();\n}\n\nclass _MemberCheeseState extends State<MemberCheese>\n    with AutomaticKeepAliveClientMixin, GridMixin {\n  late final MemberCheeseController _controller;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = Get.put(\n      MemberCheeseController(widget.mid),\n      tag: widget.heroTag,\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    return refreshIndicator(\n      onRefresh: _controller.onRefresh,\n      child: CustomScrollView(\n        physics: const AlwaysScrollableScrollPhysics(),\n        slivers: [\n          SliverPadding(\n            padding: EdgeInsets.only(\n              top: 7,\n              bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n            ),\n            sliver: Obx(() => _buildBody(_controller.loadingState.value)),\n          ),\n        ],\n      ),\n    );\n  }\n\n  @override\n  bool get wantKeepAlive => true;\n\n  Widget _buildBody(LoadingState<List<SpaceCheeseItem>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => gridSkeleton,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverGrid.builder(\n                gridDelegate: gridDelegate,\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    _controller.onLoadMore();\n                  }\n                  return MemberCheeseItem(item: response[index]);\n                },\n                itemCount: response.length,\n              )\n            : HttpError(onReload: _controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_cheese/widgets/item.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models_new/space/space_cheese/item.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\n\nclass MemberCheeseItem extends StatelessWidget {\n  const MemberCheeseItem({\n    super.key,\n    required this.item,\n    this.onRemove,\n  });\n\n  final SpaceCheeseItem item;\n  final VoidCallback? onRemove;\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    Widget child = Column(\n      mainAxisSize: MainAxisSize.min,\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        Text(\n          item.title!,\n          maxLines: 2,\n          overflow: TextOverflow.ellipsis,\n        ),\n        if (item.status != null) ...[\n          const SizedBox(height: 6),\n          Text(\n            item.status!,\n            style: TextStyle(\n              fontSize: 13,\n              color: theme.colorScheme.onSurfaceVariant,\n            ),\n          ),\n        ],\n        if (item.ctime != null) ...[\n          const Spacer(),\n          Text(\n            '收藏于${DateFormatUtils.dateFormat(int.parse(item.ctime!))}',\n            style: TextStyle(\n              fontSize: 12,\n              color: theme.colorScheme.outline,\n            ),\n          ),\n        ],\n      ],\n    );\n    if (onRemove != null) {\n      child = Stack(\n        clipBehavior: Clip.none,\n        children: [\n          child,\n          Positioned(\n            right: 0,\n            bottom: -8,\n            child: iconButton(\n              tooltip: '移除',\n              onPressed: onRemove,\n              icon: const Icon(Icons.clear),\n              iconColor: theme.colorScheme.outline,\n            ),\n          ),\n        ],\n      );\n    }\n    void onLongPress() => imageSaveDialog(title: item.title, cover: item.cover);\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onTap: () => PageUtils.viewPugv(seasonId: item.seasonId),\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        child: Padding(\n          padding: const EdgeInsets.symmetric(\n            horizontal: StyleString.safeSpace,\n            vertical: 5,\n          ),\n          child: Row(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              AspectRatio(\n                aspectRatio: StyleString.aspectRatio,\n                child: LayoutBuilder(\n                  builder: (context, boxConstraints) {\n                    Widget child = NetworkImgLayer(\n                      src: item.cover,\n                      width: boxConstraints.maxWidth,\n                      height: boxConstraints.maxHeight,\n                      borderRadius: const BorderRadius.all(\n                        Radius.circular(4),\n                      ),\n                    );\n                    if (item.marks?.isNotEmpty == true) {\n                      return Stack(\n                        clipBehavior: Clip.none,\n                        children: [\n                          child,\n                          PBadge(\n                            right: 6,\n                            top: 6,\n                            text: item.marks!.join('|'),\n                          ),\n                        ],\n                      );\n                    }\n                    return child;\n                  },\n                ),\n              ),\n              const SizedBox(width: 10),\n              Expanded(child: child),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_coin_arc/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/member.dart';\nimport 'package:PiliPlus/models_new/member/coin_like_arc/data.dart';\nimport 'package:PiliPlus/models_new/member/coin_like_arc/item.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\n\nclass MemberCoinArcController\n    extends CommonListController<CoinLikeArcData, CoinLikeArcItem> {\n  final dynamic mid;\n  MemberCoinArcController({this.mid});\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  List<CoinLikeArcItem>? getDataList(CoinLikeArcData response) {\n    return response.item;\n  }\n\n  @override\n  Future<LoadingState<CoinLikeArcData>> customGetData() =>\n      MemberHttp.coinArc(mid: mid, page: page);\n}\n"
  },
  {
    "path": "lib/pages/member_coin_arc/view.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/skeleton/video_card_v.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/member/coin_like_arc/item.dart';\nimport 'package:PiliPlus/pages/member_coin_arc/controller.dart';\nimport 'package:PiliPlus/pages/member_coin_arc/widgets/item.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass MemberCoinArcPage extends StatefulWidget {\n  const MemberCoinArcPage({\n    super.key,\n    required this.mid,\n    this.name,\n  });\n\n  final dynamic mid;\n  final String? name;\n\n  @override\n  State<MemberCoinArcPage> createState() => _MemberCoinArcPageState();\n}\n\nclass _MemberCoinArcPageState extends State<MemberCoinArcPage> {\n  late final mid = Accounts.main.mid;\n  late final MemberCoinArcController _ctr;\n\n  @override\n  void initState() {\n    super.initState();\n    _ctr = Get.put(\n      MemberCoinArcController(mid: widget.mid),\n      tag: Utils.makeHeroTag(widget.mid),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final padding = MediaQuery.viewPaddingOf(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        title: Text(\n          '${widget.mid == mid ? '我' : '${widget.name}'}的最近投币',\n        ),\n      ),\n      body: refreshIndicator(\n        onRefresh: _ctr.onRefresh,\n        child: CustomScrollView(\n          physics: const AlwaysScrollableScrollPhysics(),\n          slivers: [\n            SliverPadding(\n              padding: EdgeInsets.only(\n                top: 7,\n                left: StyleString.safeSpace + padding.left,\n                right: StyleString.safeSpace + padding.right,\n                bottom: padding.bottom + 100,\n              ),\n              sliver: Obx(() => _buildBody(_ctr.loadingState.value)),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  late final gridDelegate = SliverGridDelegateWithExtentAndRatio(\n    mainAxisSpacing: StyleString.cardSpace,\n    crossAxisSpacing: StyleString.cardSpace,\n    maxCrossAxisExtent: Grid.smallCardWidth,\n    childAspectRatio: StyleString.aspectRatio,\n    mainAxisExtent: MediaQuery.textScalerOf(context).scale(75),\n  );\n\n  Widget _buildBody(LoadingState<List<CoinLikeArcItem>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => SliverGrid.builder(\n        gridDelegate: gridDelegate,\n        itemCount: 16,\n        itemBuilder: (context, index) => const VideoCardVSkeleton(),\n      ),\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverGrid.builder(\n                gridDelegate: gridDelegate,\n                itemCount: response.length,\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    _ctr.onLoadMore();\n                  }\n                  return MemberCoinLikeItem(item: response[index]);\n                },\n              )\n            : HttpError(onReload: _ctr.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _ctr.onReload,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_coin_arc/widgets/item.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/stat/stat.dart';\nimport 'package:PiliPlus/common/widgets/video_card/video_card_v.dart';\nimport 'package:PiliPlus/http/search.dart';\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models/common/stat_type.dart';\nimport 'package:PiliPlus/models_new/member/coin_like_arc/item.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/duration_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\n\nclass MemberCoinLikeItem extends StatelessWidget {\n  final CoinLikeArcItem item;\n\n  const MemberCoinLikeItem({\n    super.key,\n    required this.item,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    void onLongPress() => imageSaveDialog(\n      title: item.title,\n      cover: item.cover,\n      aid: item.param,\n    );\n    return Card(\n      clipBehavior: Clip.hardEdge,\n      child: InkWell(\n        onTap: () async {\n          if (item.isPgc == true) {\n            if (item.uri?.isNotEmpty == true) {\n              PageUtils.viewPgcFromUri(item.uri!);\n            }\n            return;\n          }\n\n          if (item.param != null) {\n            int? cid = await SearchHttp.ab2c(aid: item.param);\n            if (cid != null) {\n              PageUtils.toVideoPage(\n                aid: int.parse(item.param!),\n                cid: cid,\n                cover: item.cover,\n                title: item.title,\n              );\n            }\n          }\n        },\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            AspectRatio(\n              aspectRatio: StyleString.aspectRatio,\n              child: LayoutBuilder(\n                builder: (context, boxConstraints) {\n                  double maxWidth = boxConstraints.maxWidth;\n                  double maxHeight = boxConstraints.maxHeight;\n                  return Stack(\n                    clipBehavior: Clip.none,\n                    children: [\n                      NetworkImgLayer(\n                        src: item.cover,\n                        width: maxWidth,\n                        height: maxHeight,\n                        type: .emote,\n                      ),\n                      if (item.isCooperation == true)\n                        const PBadge(\n                          text: '合作',\n                          top: 6,\n                          right: 6,\n                        )\n                      else if (item.isSteins == true)\n                        const PBadge(\n                          text: '互动',\n                          top: 6,\n                          right: 6,\n                        ),\n                      if (item.duration != null && item.duration! > 0)\n                        PBadge(\n                          bottom: 6,\n                          right: 6,\n                          type: PBadgeType.gray,\n                          text: DurationUtils.formatDuration(item.duration),\n                        ),\n                    ],\n                  );\n                },\n              ),\n            ),\n            Padding(\n              padding: const EdgeInsets.fromLTRB(5, 6, 0, 0),\n              child: Column(\n                crossAxisAlignment: CrossAxisAlignment.start,\n                mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                children: [\n                  Text(\n                    '${item.title}\\n',\n                    maxLines: 2,\n                    overflow: TextOverflow.ellipsis,\n                  ),\n                  const SizedBox(height: 4),\n                  Row(\n                    children: [\n                      StatWidget(\n                        type: StatType.play,\n                        value: item.play,\n                      ),\n                      const SizedBox(width: 8),\n                      StatWidget(\n                        type: StatType.danmaku,\n                        value: item.danmaku,\n                      ),\n                      const Spacer(),\n                      Text(\n                        DateFormatUtils.dateFormat(\n                          item.ctime,\n                          short: VideoCardV.shortFormat,\n                          long: VideoCardV.longFormat,\n                        ),\n                        style: TextStyle(\n                          fontSize: 11,\n                          color: Theme.of(context).colorScheme.outline,\n                        ),\n                      ),\n                      const SizedBox(width: 6),\n                    ],\n                  ),\n                ],\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_comic/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/member.dart';\nimport 'package:PiliPlus/models/common/member/contribute_type.dart';\nimport 'package:PiliPlus/models_new/space/space_archive/data.dart';\nimport 'package:PiliPlus/models_new/space/space_archive/item.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\n\nclass MemberComicController\n    extends CommonListController<SpaceArchiveData, SpaceArchiveItem> {\n  MemberComicController(this.mid);\n\n  final int mid;\n\n  int? count;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  void checkIsEnd(int length) {\n    if (count != null && length >= count!) {\n      isEnd = true;\n    }\n  }\n\n  @override\n  List<SpaceArchiveItem>? getDataList(SpaceArchiveData response) {\n    count = response.count;\n    return response.item;\n  }\n\n  @override\n  Future<LoadingState<SpaceArchiveData>> customGetData() =>\n      MemberHttp.spaceArchive(\n        type: ContributeType.comic,\n        mid: mid,\n      );\n}\n"
  },
  {
    "path": "lib/pages/member_comic/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/space/space_archive/item.dart';\nimport 'package:PiliPlus/pages/member_comic/controller.dart';\nimport 'package:PiliPlus/pages/member_comic/widgets/item.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass MemberComic extends StatefulWidget {\n  const MemberComic({\n    super.key,\n    required this.heroTag,\n    required this.mid,\n  });\n\n  final String? heroTag;\n  final int mid;\n\n  @override\n  State<MemberComic> createState() => _MemberComicState();\n}\n\nclass _MemberComicState extends State<MemberComic>\n    with AutomaticKeepAliveClientMixin, GridMixin {\n  late final MemberComicController _controller;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = Get.put(\n      MemberComicController(widget.mid),\n      tag: widget.heroTag,\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    return refreshIndicator(\n      onRefresh: _controller.onRefresh,\n      child: CustomScrollView(\n        physics: const AlwaysScrollableScrollPhysics(),\n        slivers: [\n          SliverPadding(\n            padding: EdgeInsets.only(\n              bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n            ),\n            sliver: Obx(() => _buildBody(_controller.loadingState.value)),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget _buildBody(LoadingState<List<SpaceArchiveItem>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => gridSkeleton,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverGrid.builder(\n                gridDelegate: gridDelegate,\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    _controller.onLoadMore();\n                  }\n                  return MemberComicItem(item: response[index]);\n                },\n                itemCount: response.length,\n              )\n            : HttpError(onReload: _controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n\n  @override\n  bool get wantKeepAlive => true;\n}\n"
  },
  {
    "path": "lib/pages/member_comic/widgets/item.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models_new/space/space_archive/item.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\nimport 'package:get/get.dart';\n\nclass MemberComicItem extends StatelessWidget {\n  const MemberComicItem({super.key, required this.item});\n\n  final SpaceArchiveItem item;\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    late final style = TextStyle(\n      fontSize: 13,\n      color: theme.colorScheme.onSurfaceVariant,\n    );\n    void onLongPress() => imageSaveDialog(title: item.title, cover: item.cover);\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onTap: () {\n          Get.toNamed(\n            '/webview',\n            parameters: {\n              'url': 'https://manga.bilibili.com/detail/mc${item.param}',\n            },\n          );\n        },\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        child: Padding(\n          padding: const EdgeInsets.symmetric(\n            horizontal: StyleString.safeSpace,\n            vertical: 5,\n          ),\n          child: Row(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              AspectRatio(\n                aspectRatio: 3 / 4,\n                child: LayoutBuilder(\n                  builder:\n                      (BuildContext context, BoxConstraints boxConstraints) {\n                        return NetworkImgLayer(\n                          src: item.cover,\n                          width: boxConstraints.maxWidth,\n                          height: boxConstraints.maxHeight,\n                          borderRadius: const BorderRadius.all(\n                            Radius.circular(4),\n                          ),\n                        );\n                      },\n                ),\n              ),\n              const SizedBox(width: 10),\n              Expanded(\n                child: Column(\n                  mainAxisSize: MainAxisSize.min,\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    Text(item.title),\n                    if (item.styles != null) ...[\n                      const SizedBox(height: 6),\n                      Text(\n                        item.styles!,\n                        style: style,\n                      ),\n                    ],\n                    if (item.label != null) ...[\n                      Text(\n                        item.label!,\n                        style: style,\n                      ),\n                    ],\n                  ],\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_contribute/controller.dart",
    "content": "import 'dart:math';\n\nimport 'package:PiliPlus/models_new/space/space/tab2.dart';\nimport 'package:PiliPlus/pages/member/controller.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass MemberContributeCtr extends GetxController\n    with GetSingleTickerProviderStateMixin {\n  MemberContributeCtr({\n    required this.heroTag,\n    required this.initialIndex,\n  });\n  final String? heroTag;\n  final int? initialIndex;\n\n  TabController? tabController;\n  List<Tab>? tabs;\n  late final _ctr = Get.find<MemberController>(tag: heroTag);\n  List<SpaceTab2Item>? items;\n\n  @override\n  void onInit() {\n    super.onInit();\n    SpaceTab2 contribute = _ctr.tab2!.firstWhere(\n      (item) => item.param == 'contribute',\n    );\n    if (contribute.items?.isNullOrEmpty == false) {\n      items = contribute.items;\n      if (contribute.items!.length > 1) {\n        // show if exist\n        if (_ctr.hasSeasonOrSeries == true) {\n          items!.add(\n            const SpaceTab2Item(\n              param: 'ugcSeason',\n              title: '全部合集/列表',\n            ),\n          );\n        }\n        tabs = items!.map((item) => Tab(text: item.title)).toList();\n        tabController = TabController(\n          vsync: this,\n          length: items!.length,\n          initialIndex: max(0, initialIndex ?? 0),\n        );\n      }\n    }\n  }\n\n  @override\n  void onClose() {\n    tabController?.dispose();\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_contribute/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/models/common/member/contribute_type.dart';\nimport 'package:PiliPlus/models_new/space/space/tab2.dart';\nimport 'package:PiliPlus/pages/member_article/view.dart';\nimport 'package:PiliPlus/pages/member_audio/view.dart';\nimport 'package:PiliPlus/pages/member_comic/view.dart';\nimport 'package:PiliPlus/pages/member_contribute/controller.dart';\nimport 'package:PiliPlus/pages/member_opus/view.dart';\nimport 'package:PiliPlus/pages/member_season_series/view.dart';\nimport 'package:PiliPlus/pages/member_video/view.dart';\nimport 'package:PiliPlus/utils/extension/get_ext.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass MemberContribute extends StatefulWidget {\n  const MemberContribute({\n    super.key,\n    this.heroTag,\n    this.initialIndex,\n    required this.mid,\n  });\n\n  final String? heroTag;\n  final int? initialIndex;\n  final int mid;\n\n  @override\n  State<MemberContribute> createState() => _MemberContributeState();\n}\n\nclass _MemberContributeState extends State<MemberContribute>\n    with AutomaticKeepAliveClientMixin {\n  @override\n  bool get wantKeepAlive => true;\n\n  late final MemberContributeCtr _controller;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = Get.putOrFind(\n      () => MemberContributeCtr(\n        heroTag: widget.heroTag,\n        initialIndex: widget.initialIndex,\n      ),\n      tag: widget.heroTag,\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final theme = Theme.of(context);\n    return _controller.tabs != null\n        ? Column(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              TabBar(\n                overlayColor: const WidgetStatePropertyAll(Colors.transparent),\n                splashFactory: NoSplash.splashFactory,\n                padding: const EdgeInsets.symmetric(horizontal: 8),\n                isScrollable: true,\n                tabs: _controller.tabs!,\n                tabAlignment: TabAlignment.start,\n                controller: _controller.tabController,\n                dividerHeight: 0,\n                indicatorWeight: 0,\n                indicatorPadding: const EdgeInsets.symmetric(\n                  horizontal: 3,\n                  vertical: 8,\n                ),\n                indicator: BoxDecoration(\n                  color: theme.colorScheme.secondaryContainer,\n                  borderRadius: const BorderRadius.all(Radius.circular(20)),\n                ),\n                indicatorSize: TabBarIndicatorSize.tab,\n                labelStyle:\n                    TabBarTheme.of(\n                      context,\n                    ).labelStyle?.copyWith(fontSize: 14) ??\n                    const TextStyle(fontSize: 14),\n                labelColor: theme.colorScheme.onSecondaryContainer,\n                unselectedLabelColor: theme.colorScheme.outline,\n              ),\n              Expanded(\n                child: TabBarView(\n                  physics: const NeverScrollableScrollPhysics(),\n                  controller: _controller.tabController,\n                  children: _controller.items!.map(_getPageFromType).toList(),\n                ),\n              ),\n            ],\n          )\n        : _controller.items?.isNotEmpty == true\n        ? _getPageFromType(_controller.items!.first)\n        : scrollableError;\n  }\n\n  Widget _getPageFromType(SpaceTab2Item item) {\n    final isSingle = _controller.tabs == null;\n    return switch (item.param) {\n      'video' => MemberVideo(\n        type: ContributeType.video,\n        heroTag: widget.heroTag,\n        mid: widget.mid,\n        title: item.title,\n        isSingle: isSingle,\n      ),\n      'charging_video' => MemberVideo(\n        type: ContributeType.charging,\n        heroTag: widget.heroTag,\n        mid: widget.mid,\n        title: item.title,\n      ),\n      'article' => MemberArticle(\n        heroTag: widget.heroTag,\n        mid: widget.mid,\n      ),\n      'opus' => MemberOpus(\n        heroTag: widget.heroTag,\n        mid: widget.mid,\n        isSingle: isSingle,\n      ),\n      'audio' => MemberAudio(\n        heroTag: widget.heroTag,\n        mid: widget.mid,\n      ),\n      'comic' => MemberComic(\n        heroTag: widget.heroTag,\n        mid: widget.mid,\n      ),\n      'season_video' => MemberVideo(\n        type: ContributeType.season,\n        heroTag: widget.heroTag,\n        mid: widget.mid,\n        seasonId: item.seasonId,\n        title: item.title,\n      ),\n      'series' => MemberVideo(\n        type: ContributeType.series,\n        heroTag: widget.heroTag,\n        mid: widget.mid,\n        seriesId: item.seriesId,\n        title: item.title,\n      ),\n      'ugcSeason' => SeasonSeriesPage(\n        mid: widget.mid,\n        heroTag: widget.heroTag,\n      ),\n      _ => Center(child: Text(item.title!)),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_dynamics/controller.dart",
    "content": "import 'package:PiliPlus/http/dynamics.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/member.dart';\nimport 'package:PiliPlus/http/msg.dart';\nimport 'package:PiliPlus/models/dynamics/result.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\n\nclass MemberDynamicsController\n    extends CommonListController<DynamicsDataModel, DynamicItemModel> {\n  MemberDynamicsController(this.mid);\n  int mid;\n  String offset = '';\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  Future<void> onRefresh() {\n    offset = '';\n    return super.onRefresh();\n  }\n\n  @override\n  Future<void> queryData([bool isRefresh = true]) {\n    if (!isRefresh && (isEnd || offset == '-1')) {\n      return Future.syncValue(null);\n    }\n    return super.queryData(isRefresh);\n  }\n\n  @override\n  List<DynamicItemModel>? getDataList(DynamicsDataModel response) {\n    offset = response.offset?.isNotEmpty == true ? response.offset! : '-1';\n    if (response.hasMore == false) {\n      isEnd = true;\n    }\n    return response.items;\n  }\n\n  @override\n  Future<LoadingState<DynamicsDataModel>> customGetData() =>\n      MemberHttp.memberDynamic(\n        offset: offset,\n        mid: mid,\n      );\n\n  Future<void> onRemove(dynamic dynamicId) async {\n    final res = await MsgHttp.removeDynamic(dynIdStr: dynamicId);\n    if (res.isSuccess) {\n      loadingState\n        ..value.data!.removeWhere((item) => item.idStr == dynamicId)\n        ..refresh();\n      SmartDialog.showToast('删除成功');\n    } else {\n      res.toast();\n    }\n  }\n\n  Future<void> onSetTop(bool isTop, Object dynamicId) async {\n    final res = await (isTop\n        ? DynamicsHttp.rmTop(dynamicId: dynamicId)\n        : DynamicsHttp.setTop(dynamicId: dynamicId));\n    if (res.isSuccess) {\n      List<DynamicItemModel> list = loadingState.value.data!;\n      list[0].modules\n        ..moduleTag = null\n        ..moduleAuthor?.isTop = false;\n      if (isTop) {\n        loadingState.refresh();\n        SmartDialog.showToast('取消置顶成功');\n      } else {\n        final item = list.firstWhere((item) => item.idStr == dynamicId);\n        item.modules\n          ..moduleTag = ModuleTag(text: '置顶')\n          ..moduleAuthor?.isTop = true;\n        list\n          ..remove(item)\n          ..insert(0, item);\n        loadingState.refresh();\n        SmartDialog.showToast('置顶成功');\n      }\n    } else {\n      res.toast();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_dynamics/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/dynamics/result.dart';\nimport 'package:PiliPlus/pages/dynamics/widgets/dynamic_panel.dart';\nimport 'package:PiliPlus/pages/member_dynamics/controller.dart';\nimport 'package:PiliPlus/utils/global_data.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:PiliPlus/utils/waterfall.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:waterfall_flow/waterfall_flow.dart'\n    hide SliverWaterfallFlowDelegateWithMaxCrossAxisExtent;\n\nclass MemberDynamicsPage extends StatefulWidget {\n  const MemberDynamicsPage({super.key, this.mid});\n\n  final int? mid;\n\n  @override\n  State<MemberDynamicsPage> createState() => _MemberDynamicsPageState();\n}\n\nclass _MemberDynamicsPageState extends State<MemberDynamicsPage>\n    with AutomaticKeepAliveClientMixin, DynMixin {\n  late MemberDynamicsController _memberDynamicController;\n  late int mid;\n\n  @override\n  bool get wantKeepAlive => true;\n\n  @override\n  void initState() {\n    super.initState();\n    mid = widget.mid ?? int.parse(Get.parameters['mid']!);\n    final String heroTag = Utils.makeHeroTag(mid);\n    _memberDynamicController = Get.put(\n      MemberDynamicsController(mid),\n      tag: heroTag,\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final padding = MediaQuery.viewPaddingOf(context);\n    return widget.mid == null\n        ? Scaffold(\n            resizeToAvoidBottomInset: false,\n            appBar: AppBar(title: const Text('我的动态')),\n            body: Padding(\n              padding: EdgeInsets.only(\n                left: padding.left,\n                right: padding.right,\n              ),\n              child: _buildBody(padding),\n            ),\n          )\n        : _buildBody(padding);\n  }\n\n  Widget _buildBody(EdgeInsets padding) => refreshIndicator(\n    onRefresh: _memberDynamicController.onRefresh,\n    child: CustomScrollView(\n      physics: const AlwaysScrollableScrollPhysics(),\n      slivers: [\n        SliverPadding(\n          padding: EdgeInsets.only(bottom: padding.bottom + 100),\n          sliver: buildPage(\n            Obx(\n              () => _buildContent(_memberDynamicController.loadingState.value),\n            ),\n          ),\n        ),\n      ],\n    ),\n  );\n\n  Widget _buildContent(LoadingState<List<DynamicItemModel>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => dynSkeleton,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? GlobalData().dynamicsWaterfallFlow\n                  ? SliverWaterfallFlow(\n                      gridDelegate: dynGridDelegate,\n                      delegate: SliverChildBuilderDelegate(\n                        (_, index) {\n                          if (index == response.length - 1) {\n                            _memberDynamicController.onLoadMore();\n                          }\n                          return DynamicPanel(\n                            item: response[index],\n                            onRemove: _memberDynamicController.onRemove,\n                            onSetTop: _memberDynamicController.onSetTop,\n                          );\n                        },\n                        childCount: response.length,\n                      ),\n                    )\n                  : SliverList.builder(\n                      itemBuilder: (context, index) {\n                        if (index == response.length - 1) {\n                          _memberDynamicController.onLoadMore();\n                        }\n                        return DynamicPanel(\n                          item: response[index],\n                          onRemove: _memberDynamicController.onRemove,\n                          onSetTop: _memberDynamicController.onSetTop,\n                        );\n                      },\n                      itemCount: response.length,\n                    )\n            : HttpError(onReload: _memberDynamicController.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _memberDynamicController.onReload,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_favorite/controller.dart",
    "content": "import 'package:PiliPlus/http/api.dart';\nimport 'package:PiliPlus/http/fav.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/space/space_fav/data.dart';\nimport 'package:PiliPlus/models_new/space/space_fav/list.dart';\nimport 'package:PiliPlus/pages/common/common_data_controller.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass MemberFavoriteCtr\n    extends CommonDataController<List<SpaceFavData>?, List<SpaceFavData>?> {\n  MemberFavoriteCtr({\n    required this.mid,\n  });\n\n  final int mid;\n\n  late int favPage = 2;\n  bool _favExpand = true;\n  final RxBool favEnd = true.obs;\n  final Rx<SpaceFavData> favState = SpaceFavData().obs;\n\n  late int subPage = 2;\n  bool _subExpand = true;\n  final RxBool subEnd = true.obs;\n  final Rx<SpaceFavData> subState = SpaceFavData().obs;\n\n  bool isExpand(bool isFav) {\n    return isFav ? _favExpand : _subExpand;\n  }\n\n  void setExpand(bool isFav) {\n    if (isFav) {\n      flag = _favExpand;\n      _favExpand = !_favExpand;\n    } else {\n      _subExpand = !_subExpand;\n    }\n  }\n\n  bool flag = false;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  Future<void> onRefresh() {\n    favPage = 2;\n    subPage = 2;\n    return super.onRefresh();\n  }\n\n  @override\n  bool customHandleResponse(\n    bool isRefresh,\n    Success<List<SpaceFavData>?> response,\n  ) {\n    try {\n      List<SpaceFavData> res = response.response!;\n      favState.value = res.first;\n      subState.value = res[1];\n\n      favEnd.value =\n          (res.first.mediaListResponse?.count ?? -1) <=\n          (res.first.mediaListResponse?.list?.length ?? -1);\n      subEnd.value =\n          (res[1].mediaListResponse?.count ?? -1) <=\n          (res[1].mediaListResponse?.list?.length ?? -1);\n    } catch (e) {\n      if (kDebugMode) debugPrint(e.toString());\n    }\n    loadingState.value = response;\n    return true;\n  }\n\n  Future<void> userFavFolder() async {\n    try {\n      final res = await Request().get(\n        Api.userFavFolder,\n        queryParameters: {\n          'pn': favPage,\n          'ps': 20,\n          'up_mid': mid,\n        },\n      );\n      if (res.data['code'] == 0) {\n        favPage++;\n        final data = res.data['data'];\n        if (data != null) {\n          favEnd.value = data['has_more'] == false;\n          final list = (data['list'] as List<dynamic>?)\n              ?.map((item) => SpaceFavItemModel.fromJson(item))\n              .toList();\n          if (list != null && list.isNotEmpty) {\n            favState\n              ..value.mediaListResponse!.list!.addAll(list)\n              ..refresh();\n          } else {\n            favEnd.value = true;\n          }\n        } else {\n          favEnd.value = true;\n        }\n      } else {\n        SmartDialog.showToast(res.data['message']);\n      }\n    } catch (e) {\n      SmartDialog.showToast(e.toString());\n    }\n  }\n\n  Future<void> userSubFolder() async {\n    try {\n      final res = await Request().get(\n        Api.userSubFolder,\n        queryParameters: {\n          'up_mid': mid,\n          'ps': 20,\n          'pn': subPage,\n          'platform': 'web',\n        },\n      );\n      if (res.data['code'] == 0) {\n        subPage++;\n        final data = res.data['data'];\n        if (data != null) {\n          subEnd.value = data['has_more'] == false;\n          final list = (data['list'] as List<dynamic>?)\n              ?.map((item) => SpaceFavItemModel.fromJson(item))\n              .toList();\n          if (list != null && list.isNotEmpty) {\n            subState\n              ..value.mediaListResponse!.list!.addAll(list)\n              ..refresh();\n          } else {\n            subEnd.value = true;\n          }\n        } else {\n          subEnd.value = true;\n        }\n      } else {\n        SmartDialog.showToast(res.data['message']);\n      }\n    } catch (e) {\n      SmartDialog.showToast(e.toString());\n    }\n  }\n\n  @override\n  Future<LoadingState<List<SpaceFavData>?>> customGetData() =>\n      FavHttp.spaceFav(mid: mid);\n}\n"
  },
  {
    "path": "lib/pages/member_favorite/view.dart",
    "content": "import 'package:PiliPlus/common/skeleton/video_card_h.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/sliver/sliver_pinned_header.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/space/space_fav/data.dart';\nimport 'package:PiliPlus/pages/member_favorite/controller.dart';\nimport 'package:PiliPlus/pages/member_favorite/widget/item.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass MemberFavorite extends StatefulWidget {\n  const MemberFavorite({\n    super.key,\n    required this.heroTag,\n    required this.mid,\n  });\n\n  final String? heroTag;\n  final int mid;\n\n  @override\n  State<MemberFavorite> createState() => _MemberFavoriteState();\n}\n\nclass _MemberFavoriteState extends State<MemberFavorite>\n    with AutomaticKeepAliveClientMixin, GridMixin {\n  @override\n  bool get wantKeepAlive => true;\n\n  late final MemberFavoriteCtr _controller;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = Get.put(\n      MemberFavoriteCtr(mid: widget.mid),\n      tag: widget.heroTag,\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final theme = Theme.of(context);\n    return refreshIndicator(\n      onRefresh: _controller.onRefresh,\n      child: CustomScrollView(\n        physics: _FavScrollPhysics(controller: _controller),\n        slivers: [\n          SliverPadding(\n            padding: EdgeInsets.only(\n              bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n            ),\n            sliver: Obx(\n              () => _buildBody(theme, _controller.loadingState.value),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget _buildBody(\n    ThemeData theme,\n    LoadingState<List<SpaceFavData>?> loadingState,\n  ) {\n    return switch (loadingState) {\n      Loading() => SliverPadding(\n        padding: const EdgeInsets.only(top: 7),\n        sliver: SliverGrid.builder(\n          gridDelegate: Grid.videoCardHDelegate(context),\n          itemBuilder: (context, index) => const VideoCardHSkeleton(),\n          itemCount: 10,\n        ),\n      ),\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverMainAxisGroup(\n                slivers: [\n                  _buildItem(\n                    theme,\n                    data: _controller.favState,\n                    isEnd: _controller.favEnd,\n                    isFav: true,\n                  ),\n                  _buildItem(\n                    theme,\n                    data: _controller.subState,\n                    isEnd: _controller.subEnd,\n                    isFav: false,\n                  ),\n                ],\n              )\n            : HttpError(onReload: _controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n\n  Widget _buildItem(\n    ThemeData theme, {\n    required Rx<SpaceFavData> data,\n    required RxBool isEnd,\n    required bool isFav,\n  }) {\n    return SliverMainAxisGroup(\n      slivers: [\n        SliverPinnedHeader(\n          child: Material(\n            color: theme.colorScheme.surface,\n            child: Builder(\n              builder: (context) {\n                return InkWell(\n                  onTap: () {\n                    _controller.setExpand(isFav);\n                    (context as Element).markNeedsBuild();\n                    data.refresh();\n                    if (!isEnd.value) {\n                      isEnd.refresh();\n                    }\n                  },\n                  child: Padding(\n                    padding: const .symmetric(horizontal: 12, vertical: 10),\n                    child: Text.rich(\n                      TextSpan(\n                        children: [\n                          WidgetSpan(\n                            alignment: .middle,\n                            child: Icon(\n                              _controller.isExpand(isFav)\n                                  ? Icons.expand_less\n                                  : Icons.expand_more,\n                              color: theme.colorScheme.outline,\n                            ),\n                          ),\n                          TextSpan(\n                            text: ' ${data.value.name}',\n                            style: const TextStyle(fontSize: 14),\n                          ),\n                          TextSpan(\n                            text: ' ${data.value.mediaListResponse?.count}',\n                            style: TextStyle(\n                              fontSize: 13,\n                              color: theme.colorScheme.outline,\n                            ),\n                          ),\n                        ],\n                      ),\n                    ),\n                  ),\n                );\n              },\n            ),\n          ),\n        ),\n        Obx(() {\n          final list = data.value.mediaListResponse?.list;\n          if (!_controller.isExpand(isFav)) {\n            return const SliverToBoxAdapter();\n          }\n          if (list != null && list.isNotEmpty) {\n            return SliverGrid.builder(\n              gridDelegate: gridDelegate,\n              itemCount: list.length,\n              itemBuilder: (context, index) {\n                final item = list[index];\n                return SizedBox(\n                  height: 98,\n                  child: MemberFavItem(\n                    item: item,\n                    onDelete: (isDeleted) {\n                      if (isDeleted ?? false) {\n                        _controller.favState\n                          ..value.mediaListResponse?.list?.remove(item)\n                          ..refresh();\n                      }\n                    },\n                  ),\n                );\n              },\n            );\n          }\n          return const SliverToBoxAdapter();\n        }),\n        Obx(\n          () => isEnd.value || !_controller.isExpand(isFav)\n              ? const SliverToBoxAdapter()\n              : SliverToBoxAdapter(child: _buildLoadMoreItem(theme, isFav)),\n        ),\n      ],\n    );\n  }\n\n  Widget _buildLoadMoreItem(ThemeData theme, bool isFav) {\n    return Padding(\n      padding: const .only(top: 7),\n      child: InkWell(\n        onTap: () {\n          if (isFav) {\n            _controller.userFavFolder();\n          } else {\n            _controller.userSubFolder();\n          }\n        },\n        child: Container(\n          height: 40,\n          alignment: .center,\n          child: Text(\n            '查看更多内容',\n            textAlign: TextAlign.center,\n            style: TextStyle(color: theme.colorScheme.primary),\n          ),\n        ),\n      ),\n    );\n  }\n}\n\nclass _FavScrollPhysics extends AlwaysScrollableScrollPhysics {\n  const _FavScrollPhysics({super.parent, required this.controller});\n\n  final MemberFavoriteCtr controller;\n\n  @override\n  _FavScrollPhysics applyTo(ScrollPhysics? ancestor) {\n    return _FavScrollPhysics(\n      parent: buildParent(ancestor),\n      controller: controller,\n    );\n  }\n\n  @override\n  double adjustPositionForNewDimensions({\n    required ScrollMetrics oldPosition,\n    required ScrollMetrics newPosition,\n    required bool isScrolling,\n    required double velocity,\n  }) {\n    if (controller.flag) {\n      controller.flag = false;\n      return 0;\n    }\n    return super.adjustPositionForNewDimensions(\n      oldPosition: oldPosition,\n      newPosition: newPosition,\n      isScrolling: isScrolling,\n      velocity: velocity,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_favorite/widget/item.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models_new/space/space_fav/list.dart';\nimport 'package:PiliPlus/pages/subscription_detail/view.dart';\nimport 'package:PiliPlus/utils/fav_utils.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\nimport 'package:get/get.dart';\n\nclass MemberFavItem extends StatelessWidget {\n  const MemberFavItem({super.key, required this.item, this.onDelete});\n\n  final SpaceFavItemModel item;\n  final ValueChanged<bool?>? onDelete;\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    void onLongPress() => imageSaveDialog(\n      title: item.title,\n      cover: item.cover,\n    );\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onTap: () async {\n          if (item.state == 1) {\n            // invalid\n            return;\n          }\n\n          if (item.type == 0 || item.type == 11) {\n            final isDeleted = await Get.toNamed(\n              '/favDetail',\n              parameters: {\n                'mediaId': item.id.toString(),\n                'heroTag': Utils.makeHeroTag(item.id),\n              },\n            );\n            onDelete?.call(isDeleted);\n          } else {\n            SubDetailPage.toSubDetailPage(\n              item.id!,\n              subInfo: item,\n            );\n          }\n        },\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        child: Padding(\n          padding: const EdgeInsets.symmetric(\n            horizontal: StyleString.safeSpace,\n            vertical: 5,\n          ),\n          child: Row(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              Stack(\n                clipBehavior: Clip.none,\n                children: [\n                  AspectRatio(\n                    aspectRatio: StyleString.aspectRatio,\n                    child: LayoutBuilder(\n                      builder: (context, constraints) => NetworkImgLayer(\n                        src: item.cover,\n                        width: constraints.maxWidth,\n                        height: constraints.maxHeight,\n                      ),\n                    ),\n                  ),\n                  if (item.type == 21)\n                    const PBadge(\n                      right: 6,\n                      top: 6,\n                      text: '合集',\n                    )\n                  else if (item.type == 11)\n                    const PBadge(\n                      right: 6,\n                      top: 6,\n                      text: '收藏夹',\n                    ),\n                ],\n              ),\n              const SizedBox(width: 10),\n              Expanded(\n                child: Column(\n                  mainAxisSize: MainAxisSize.min,\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    Text(\n                      item.title ?? '',\n                      maxLines: 2,\n                      overflow: TextOverflow.ellipsis,\n                    ),\n                    const Spacer(),\n                    Text(\n                      item.type == 0\n                          ? '${item.mediaCount}个内容 · ${FavUtils.isPublicFavText(item.attr)}'\n                          : item.type == 11\n                          ? '${item.mediaCount}个内容 · ${item.upper?.name}'\n                          : item.type == 21\n                          ? '创建者: ${item.upper?.name}\\n${item.mediaCount}个视频 · ${NumUtils.numFormat(item.viewCount)}播放'\n                          : '${item.mediaCount}个内容',\n                      style: TextStyle(\n                        fontSize: 12,\n                        color: theme.colorScheme.outline,\n                      ),\n                    ),\n                  ],\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_home/view.dart",
    "content": "import 'dart:math';\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/button/more_btn.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/space/space/data.dart';\nimport 'package:PiliPlus/models_new/space/space/tab2.dart';\nimport 'package:PiliPlus/pages/member/controller.dart';\nimport 'package:PiliPlus/pages/member_article/widget/item.dart';\nimport 'package:PiliPlus/pages/member_audio/widgets/item.dart';\nimport 'package:PiliPlus/pages/member_coin_arc/view.dart';\nimport 'package:PiliPlus/pages/member_comic/widgets/item.dart';\nimport 'package:PiliPlus/pages/member_contribute/controller.dart';\nimport 'package:PiliPlus/pages/member_home/widgets/fav_item.dart';\nimport 'package:PiliPlus/pages/member_home/widgets/video_card_v_member_home.dart';\nimport 'package:PiliPlus/pages/member_like_arc/view.dart';\nimport 'package:PiliPlus/pages/member_pgc/widgets/pgc_card_v_member_pgc.dart';\nimport 'package:PiliPlus/utils/extension/context_ext.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass MemberHome extends StatefulWidget {\n  const MemberHome({super.key, this.heroTag});\n\n  final String? heroTag;\n\n  @override\n  State<MemberHome> createState() => _MemberHomeState();\n}\n\nclass _MemberHomeState extends State<MemberHome>\n    with AutomaticKeepAliveClientMixin, GridMixin {\n  @override\n  bool get wantKeepAlive => true;\n\n  late final _ctr = Get.find<MemberController>(tag: widget.heroTag);\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    return _buildBody(_ctr.loadingState.value);\n  }\n\n  late final gridDelegateV = SliverGridDelegateWithExtentAndRatio(\n    mainAxisSpacing: StyleString.cardSpace,\n    crossAxisSpacing: StyleString.cardSpace,\n    maxCrossAxisExtent: Grid.smallCardWidth,\n    childAspectRatio: StyleString.aspectRatio,\n    mainAxisExtent: MediaQuery.textScalerOf(context).scale(55),\n  );\n\n  late final gridDelegateAudio = SliverGridDelegateWithExtentAndRatio(\n    mainAxisSpacing: 2,\n    maxCrossAxisExtent: Grid.smallCardWidth * 2,\n    childAspectRatio: StyleString.aspectRatio * 2.6,\n    minHeight: MediaQuery.textScalerOf(context).scale(90),\n  );\n\n  late final gridDelegatePgc = SliverGridDelegateWithExtentAndRatio(\n    mainAxisSpacing: StyleString.cardSpace,\n    crossAxisSpacing: StyleString.cardSpace,\n    maxCrossAxisExtent: Grid.smallCardWidth * 0.6,\n    childAspectRatio: 0.75,\n    mainAxisExtent: MediaQuery.textScalerOf(context).scale(52),\n  );\n\n  Widget _buildBody(LoadingState<SpaceData?> loadingState) {\n    final isVertical = context.width < 600;\n    final setting = _ctr.spaceSetting;\n    final isOwner = setting != null;\n    final color = Theme.of(context).colorScheme.outline;\n    return switch (loadingState) {\n      Loading() => m3eLoading,\n      Success(response: final res) =>\n        res != null\n            ? CustomScrollView(\n                slivers: [\n                  if (res.archive?.item?.isNotEmpty == true) ...[\n                    _header(\n                      color,\n                      title: '视频',\n                      param: 'contribute',\n                      param1: 'video',\n                      count: res.archive!.count!,\n                    ),\n                    SliverPadding(\n                      padding: const EdgeInsets.symmetric(\n                        horizontal: StyleString.safeSpace,\n                      ),\n                      sliver: SliverGrid.builder(\n                        gridDelegate: gridDelegateV,\n                        itemBuilder: (context, index) {\n                          return VideoCardVMemberHome(\n                            videoItem: res.archive!.item![index],\n                          );\n                        },\n                        itemCount: min(\n                          isVertical ? 4 : 8,\n                          res.archive!.item!.length,\n                        ),\n                      ),\n                    ),\n                  ],\n                  if (res.favourite2?.item?.isNotEmpty == true) ...[\n                    _header(\n                      color,\n                      title: '收藏',\n                      param: 'favorite',\n                      count: res.favourite2!.count!,\n                      visible: isOwner ? setting.favVideo == 1 : null,\n                    ),\n                    SliverToBoxAdapter(\n                      child: SizedBox(\n                        height: 98,\n                        child: MemberFavItem(\n                          item: res.favourite2!.item!.first,\n                        ),\n                      ),\n                    ),\n                  ],\n                  if (res.coinArchive?.item?.isNotEmpty == true) ...[\n                    _header(\n                      color,\n                      title: '最近投币的视频',\n                      param: 'coinArchive',\n                      count: res.coinArchive!.count!,\n                      visible: isOwner ? setting.coinsVideo == 1 : null,\n                    ),\n                    SliverPadding(\n                      padding: const EdgeInsets.symmetric(\n                        horizontal: StyleString.safeSpace,\n                      ),\n                      sliver: SliverGrid.builder(\n                        gridDelegate: gridDelegateV,\n                        itemBuilder: (context, index) {\n                          return VideoCardVMemberHome(\n                            videoItem: res.coinArchive!.item![index],\n                          );\n                        },\n                        itemCount: min(\n                          isVertical ? 2 : 4,\n                          res.coinArchive!.item!.length,\n                        ),\n                      ),\n                    ),\n                  ],\n                  if (res.likeArchive?.item?.isNotEmpty == true) ...[\n                    _header(\n                      color,\n                      title: '最近点赞的视频',\n                      param: 'likeArchive',\n                      count: res.likeArchive!.count!,\n                      visible: isOwner ? setting.likesVideo == 1 : null,\n                    ),\n                    SliverPadding(\n                      padding: const EdgeInsets.symmetric(\n                        horizontal: StyleString.safeSpace,\n                      ),\n                      sliver: SliverGrid.builder(\n                        gridDelegate: gridDelegateV,\n                        itemBuilder: (context, index) {\n                          return VideoCardVMemberHome(\n                            videoItem: res.likeArchive!.item![index],\n                          );\n                        },\n                        itemCount: min(\n                          isVertical ? 2 : 4,\n                          res.likeArchive!.item!.length,\n                        ),\n                      ),\n                    ),\n                  ],\n                  if (res.article?.item?.isNotEmpty == true) ...[\n                    _header(\n                      color,\n                      title: '图文',\n                      param: 'contribute',\n                      param1: 'opus',\n                      count: res.article!.count!,\n                    ),\n                    SliverToBoxAdapter(\n                      child: SizedBox(\n                        height: 98,\n                        child: MemberArticleItem(\n                          item: res.article!.item!.first,\n                        ),\n                      ),\n                    ),\n                  ],\n                  if (res.audios?.item?.isNotEmpty == true) ...[\n                    _header(\n                      color,\n                      title: '音频',\n                      param: 'contribute',\n                      param1: 'audio',\n                      count: res.audios!.count!,\n                    ),\n                    SliverGrid.builder(\n                      gridDelegate: gridDelegateAudio,\n                      itemBuilder: (context, index) {\n                        return MemberAudioItem(\n                          item: res.audios!.item![index],\n                        );\n                      },\n                      itemCount: isVertical ? 1 : min(3, res.audios!.count!),\n                    ),\n                  ],\n                  if (res.comic?.item?.isNotEmpty == true) ...[\n                    _header(\n                      color,\n                      title: '漫画',\n                      param: 'contribute',\n                      param1: 'comic',\n                      count: res.comic!.count!,\n                    ),\n                    SliverGrid.builder(\n                      gridDelegate: gridDelegate,\n                      itemBuilder: (context, index) {\n                        return MemberComicItem(item: res.comic!.item![index]);\n                      },\n                      itemCount: isVertical ? 1 : min(3, res.comic!.count!),\n                    ),\n                  ],\n                  if (res.season?.item?.isNotEmpty == true) ...[\n                    _header(\n                      color,\n                      title: '追番',\n                      param: 'bangumi',\n                      count: res.season!.count!,\n                      visible: isOwner ? setting.bangumi == 1 : null,\n                    ),\n                    SliverPadding(\n                      padding: const EdgeInsets.symmetric(\n                        horizontal: StyleString.safeSpace,\n                      ),\n                      sliver: SliverGrid.builder(\n                        gridDelegate: gridDelegatePgc,\n                        itemBuilder: (context, index) {\n                          return PgcCardVMemberPgc(\n                            item: res.season!.item![index],\n                          );\n                        },\n                        itemCount: min(\n                          isVertical ? 3 : 6,\n                          res.season!.item!.length,\n                        ),\n                      ),\n                    ),\n                  ],\n                  SliverToBoxAdapter(\n                    child: SizedBox(\n                      height: 100 + MediaQuery.viewPaddingOf(context).bottom,\n                    ),\n                  ),\n                ],\n              )\n            : scrollableError,\n      Error(:final errMsg) => scrollErrorWidget(errMsg: errMsg),\n    };\n  }\n\n  Widget _header(\n    Color color, {\n    required String title,\n    required String param,\n    String? param1,\n    required int count,\n    bool? visible,\n  }) {\n    return SliverToBoxAdapter(\n      child: Padding(\n        padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),\n        child: Row(\n          mainAxisAlignment: MainAxisAlignment.spaceBetween,\n          children: [\n            Text.rich(\n              TextSpan(\n                children: [\n                  TextSpan(text: '$title '),\n                  TextSpan(\n                    text: count.toString(),\n                    style: TextStyle(fontSize: 13, color: color),\n                  ),\n                  if (visible != null)\n                    WidgetSpan(\n                      alignment: PlaceholderAlignment.middle,\n                      child: Padding(\n                        padding: const EdgeInsets.only(left: 10),\n                        child: Icon(\n                          visible ? Icons.visibility : Icons.visibility_off,\n                          size: 17,\n                          color: color,\n                        ),\n                      ),\n                    ),\n                ],\n              ),\n            ),\n            moreTextButton(\n              onTap: () {\n                int index = _ctr.tab2!.indexWhere(\n                  (item) => item.param == param,\n                );\n                if (index != -1) {\n                  if (const [\n                    'video',\n                    'opus',\n                    'audio',\n                    'comic',\n                  ].contains(param1)) {\n                    List<SpaceTab2Item> items = _ctr.tab2!\n                        .firstWhere((item) => item.param == param)\n                        .items!;\n                    int index1 = items.indexWhere(\n                      (item) => item.param == param1,\n                    );\n                    if (index1 != -1) {\n                      try {\n                        final contributeCtr = Get.find<MemberContributeCtr>(\n                          tag: widget.heroTag,\n                        );\n                        // contributeCtr.tabController?.animateTo(index1);\n                        if (contributeCtr.tabController?.index != index1) {\n                          contributeCtr.tabController?.index = index1;\n                        }\n                        // if (kDebugMode) debugPrint('initialized');\n                      } catch (e) {\n                        _ctr.contributeInitialIndex.value = index1;\n                        // if (kDebugMode) debugPrint('not initialized');\n                      }\n                    }\n                  }\n                  _ctr.tabController?.animateTo(index);\n                } else {\n                  if (param == 'coinArchive') {\n                    Get.to(\n                      MemberCoinArcPage(\n                        mid: _ctr.mid,\n                        name: _ctr.username,\n                      ),\n                    );\n                    return;\n                  }\n\n                  if (param == 'likeArchive') {\n                    Get.to(\n                      MemberLikeArcPage(\n                        mid: _ctr.mid,\n                        name: _ctr.username,\n                      ),\n                    );\n                    return;\n                  }\n\n                  // else TODO\n                  SmartDialog.showToast('view $param');\n                }\n              },\n              color: color,\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_home/widgets/fav_item.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models_new/space/space_fav/list.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass MemberFavItem extends StatelessWidget {\n  const MemberFavItem({super.key, required this.item});\n\n  final SpaceFavItemModel item;\n\n  @override\n  Widget build(BuildContext context) {\n    void onLongPress() => imageSaveDialog(\n      title: item.title,\n      cover: item.cover,\n    );\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onTap: () {\n          Get.toNamed(\n            '/favDetail',\n            parameters: {\n              'mediaId': item.mediaId.toString(),\n              'heroTag': Utils.makeHeroTag(item.mediaId),\n            },\n          );\n        },\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        child: Padding(\n          padding: const EdgeInsets.symmetric(\n            horizontal: StyleString.safeSpace,\n            vertical: 5,\n          ),\n          child: Row(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              NetworkImgLayer(\n                src: item.cover,\n                width: 140.8,\n                height: 88,\n              ),\n              const SizedBox(width: 10),\n              Expanded(\n                child: Column(\n                  mainAxisSize: MainAxisSize.min,\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    Text(\n                      item.title!,\n                      maxLines: 2,\n                      overflow: TextOverflow.ellipsis,\n                    ),\n                    const Spacer(),\n                    Text(\n                      '${item.count}个内容 · ${item.isPublic == 1 ? '私密' : '公开'}',\n                      style: TextStyle(\n                        fontSize: 12,\n                        color: Theme.of(context).colorScheme.outline,\n                      ),\n                    ),\n                  ],\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_home/widgets/video_card_v_member_home.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/http/search.dart';\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models_new/space/space_archive/item.dart';\nimport 'package:PiliPlus/utils/app_scheme.dart';\nimport 'package:PiliPlus/utils/duration_utils.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\n\n// 视频卡片 - 垂直布局\nclass VideoCardVMemberHome extends StatelessWidget {\n  final SpaceArchiveItem videoItem;\n\n  const VideoCardVMemberHome({\n    super.key,\n    required this.videoItem,\n  });\n\n  Future<void> onPushDetail() async {\n    String? goto = videoItem.goto;\n    switch (goto) {\n      case 'bangumi':\n        PageUtils.viewPgc(epId: videoItem.param);\n        break;\n\n      case 'av':\n        if (videoItem.isPgc == true) {\n          if (videoItem.uri?.isNotEmpty == true) {\n            PageUtils.viewPgcFromUri(videoItem.uri!);\n          }\n          return;\n        }\n\n        String? aid = videoItem.param;\n        String? bvid = videoItem.bvid;\n        if (aid == null && bvid == null) {\n          return;\n        }\n\n        bvid ??= IdUtils.av2bv(int.parse(aid!));\n        int? cid = videoItem.cid ?? await SearchHttp.ab2c(aid: aid, bvid: bvid);\n        if (cid != null) {\n          PageUtils.toVideoPage(\n            bvid: bvid,\n            cid: cid,\n            cover: videoItem.cover,\n            title: videoItem.title,\n          );\n        }\n        break;\n\n      default:\n        if (videoItem.uri?.isNotEmpty == true) {\n          PiliScheme.routePushFromUrl(videoItem.uri!);\n        }\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    void onLongPress() => imageSaveDialog(\n      title: videoItem.title,\n      cover: videoItem.cover,\n      aid: videoItem.param,\n      bvid: videoItem.bvid,\n    );\n    return Card(\n      clipBehavior: Clip.hardEdge,\n      child: InkWell(\n        onTap: onPushDetail,\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            AspectRatio(\n              aspectRatio: StyleString.aspectRatio,\n              child: LayoutBuilder(\n                builder: (context, boxConstraints) {\n                  double maxWidth = boxConstraints.maxWidth;\n                  double maxHeight = boxConstraints.maxHeight;\n                  return Stack(\n                    clipBehavior: Clip.none,\n                    children: [\n                      NetworkImgLayer(\n                        src: videoItem.cover,\n                        width: maxWidth,\n                        height: maxHeight,\n                        type: .emote,\n                      ),\n                      if (videoItem.duration > 0)\n                        PBadge(\n                          bottom: 6,\n                          right: 7,\n                          size: PBadgeSize.small,\n                          type: PBadgeType.gray,\n                          text: DurationUtils.formatDuration(\n                            videoItem.duration,\n                          ),\n                        ),\n                      if (videoItem.badges?.isNotEmpty == true)\n                        PBadge(\n                          text: videoItem.badges!\n                              .map((e) => e.text ?? '')\n                              .join('|'),\n                          top: 6,\n                          right: 6,\n                          type: videoItem.badges!.first.text == '充电专属'\n                              ? PBadgeType.error\n                              : PBadgeType.primary,\n                        )\n                      else if (videoItem.isCooperation == true)\n                        const PBadge(\n                          text: '合作',\n                          top: 6,\n                          right: 6,\n                        )\n                      else if (videoItem.isSteins == true)\n                        const PBadge(\n                          text: '互动',\n                          top: 6,\n                          right: 6,\n                        ),\n                    ],\n                  );\n                },\n              ),\n            ),\n            content(context),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget content(BuildContext context) {\n    return Expanded(\n      child: Padding(\n        padding: const EdgeInsets.fromLTRB(6, 5, 6, 5),\n        child: Text(\n          '${videoItem.title}\\n',\n          maxLines: 2,\n          overflow: TextOverflow.ellipsis,\n          style: const TextStyle(\n            height: 1.38,\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_like_arc/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/member.dart';\nimport 'package:PiliPlus/models_new/member/coin_like_arc/data.dart';\nimport 'package:PiliPlus/models_new/member/coin_like_arc/item.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\n\nclass MemberLikeArcController\n    extends CommonListController<CoinLikeArcData, CoinLikeArcItem> {\n  final dynamic mid;\n  MemberLikeArcController({this.mid});\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  List<CoinLikeArcItem>? getDataList(CoinLikeArcData response) {\n    return response.item;\n  }\n\n  @override\n  Future<LoadingState<CoinLikeArcData>> customGetData() =>\n      MemberHttp.likeArc(mid: mid, page: page);\n}\n"
  },
  {
    "path": "lib/pages/member_like_arc/view.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/skeleton/video_card_v.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/member/coin_like_arc/item.dart';\nimport 'package:PiliPlus/pages/member_coin_arc/widgets/item.dart';\nimport 'package:PiliPlus/pages/member_like_arc/controller.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass MemberLikeArcPage extends StatefulWidget {\n  const MemberLikeArcPage({\n    super.key,\n    required this.mid,\n    this.name,\n  });\n\n  final dynamic mid;\n  final String? name;\n\n  @override\n  State<MemberLikeArcPage> createState() => _MemberLikeArcPageState();\n}\n\nclass _MemberLikeArcPageState extends State<MemberLikeArcPage> {\n  late final mid = Accounts.main.mid;\n  late final MemberLikeArcController _ctr;\n\n  @override\n  void initState() {\n    super.initState();\n    _ctr = Get.put(\n      MemberLikeArcController(mid: widget.mid),\n      tag: Utils.makeHeroTag(widget.mid),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final padding = MediaQuery.viewPaddingOf(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        title: Text(\n          '${widget.mid == mid ? '我' : '${widget.name}'}的推荐',\n        ),\n      ),\n      body: refreshIndicator(\n        onRefresh: _ctr.onRefresh,\n        child: CustomScrollView(\n          physics: const AlwaysScrollableScrollPhysics(),\n          slivers: [\n            SliverPadding(\n              padding: EdgeInsets.only(\n                top: 7,\n                left: StyleString.safeSpace + padding.left,\n                right: StyleString.safeSpace + padding.right,\n                bottom: padding.bottom + 100,\n              ),\n              sliver: Obx(() => _buildBody(_ctr.loadingState.value)),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  late final gridDelegate = SliverGridDelegateWithExtentAndRatio(\n    mainAxisSpacing: StyleString.cardSpace,\n    crossAxisSpacing: StyleString.cardSpace,\n    maxCrossAxisExtent: Grid.smallCardWidth,\n    childAspectRatio: StyleString.aspectRatio,\n    mainAxisExtent: MediaQuery.textScalerOf(context).scale(75),\n  );\n\n  Widget _buildBody(LoadingState<List<CoinLikeArcItem>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => SliverGrid.builder(\n        gridDelegate: gridDelegate,\n        itemCount: 16,\n        itemBuilder: (context, index) => const VideoCardVSkeleton(),\n      ),\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverGrid.builder(\n                gridDelegate: gridDelegate,\n                itemCount: response.length,\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    _ctr.onLoadMore();\n                  }\n                  return MemberCoinLikeItem(item: response[index]);\n                },\n              )\n            : HttpError(onReload: _ctr.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _ctr.onReload,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_opus/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/member.dart';\nimport 'package:PiliPlus/models_new/space/space/tab2.dart';\nimport 'package:PiliPlus/models_new/space/space_opus/data.dart';\nimport 'package:PiliPlus/models_new/space/space_opus/item.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:PiliPlus/pages/member/controller.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:get/get.dart';\n\nclass MemberOpusController\n    extends CommonListController<SpaceOpusData, SpaceOpusItemModel> {\n  MemberOpusController({\n    required this.heroTag,\n    required this.mid,\n  });\n\n  final String? heroTag;\n  final int mid;\n\n  String offset = '';\n  Rx<SpaceTabFilter> type = const SpaceTabFilter(\n    text: \"全部图文\",\n    meta: \"all\",\n    tabName: \"图文\",\n  ).obs;\n  List<SpaceTabFilter>? filter;\n\n  @override\n  void onInit() {\n    super.onInit();\n    filter = Get.find<MemberController>(tag: heroTag).tab2\n        ?.firstWhereOrNull((e) => e.param == 'contribute')\n        ?.items\n        ?.firstWhereOrNull((e) => e.param == 'opus')\n        ?.filter;\n    queryData();\n  }\n\n  @override\n  Future<void> onRefresh() {\n    offset = '';\n    return super.onRefresh();\n  }\n\n  @override\n  List<SpaceOpusItemModel>? getDataList(SpaceOpusData response) {\n    offset = response.offset ?? '';\n    if (response.hasMore == false) {\n      isEnd = true;\n    }\n    return response.items;\n  }\n\n  @override\n  Future<LoadingState<SpaceOpusData>> customGetData() => MemberHttp.spaceOpus(\n    hostMid: mid,\n    page: page,\n    offset: offset,\n    type: type.value.meta,\n  );\n}\n"
  },
  {
    "path": "lib/pages/member_opus/view.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/skeleton/space_opus.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/space/space_opus/item.dart';\nimport 'package:PiliPlus/pages/member_opus/controller.dart';\nimport 'package:PiliPlus/pages/member_opus/widgets/space_opus_item.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:PiliPlus/utils/waterfall.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:waterfall_flow/waterfall_flow.dart'\n    hide SliverWaterfallFlowDelegateWithMaxCrossAxisExtent;\n\nclass MemberOpus extends StatefulWidget {\n  const MemberOpus({\n    super.key,\n    this.isSingle = false,\n    required this.heroTag,\n    required this.mid,\n  });\n\n  final bool isSingle;\n  final String? heroTag;\n  final int mid;\n\n  @override\n  State<MemberOpus> createState() => _MemberOpusState();\n}\n\nclass _MemberOpusState extends State<MemberOpus>\n    with AutomaticKeepAliveClientMixin {\n  late final MemberOpusController _controller;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = Get.put(\n      MemberOpusController(\n        mid: widget.mid,\n        heroTag: widget.heroTag,\n      ),\n      tag: widget.heroTag,\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final bottom = MediaQuery.viewPaddingOf(context).bottom;\n    return Stack(\n      children: [\n        refreshIndicator(\n          onRefresh: _controller.onRefresh,\n          child: CustomScrollView(\n            physics: const AlwaysScrollableScrollPhysics(),\n            slivers: [\n              SliverPadding(\n                padding: EdgeInsets.only(\n                  top: widget.isSingle ? 12 : 0,\n                  left: StyleString.safeSpace,\n                  right: StyleString.safeSpace,\n                  bottom: bottom + 100,\n                ),\n                sliver: Obx(() => _buildBody(_controller.loadingState.value)),\n              ),\n            ],\n          ),\n        ),\n        if (_controller.filter?.isNotEmpty == true)\n          Positioned(\n            right: kFloatingActionButtonMargin,\n            bottom: bottom + kFloatingActionButtonMargin,\n            child: FloatingActionButton.extended(\n              onPressed: () => showDialog(\n                context: context,\n                builder: (context) => AlertDialog(\n                  clipBehavior: Clip.hardEdge,\n                  contentPadding: const EdgeInsets.symmetric(vertical: 12),\n                  content: Column(\n                    mainAxisSize: MainAxisSize.min,\n                    children: _controller.filter!\n                        .map(\n                          (e) => ListTile(\n                            onTap: () {\n                              if (e == _controller.type.value) {\n                                return;\n                              }\n                              Get.back();\n                              _controller\n                                ..type.value = e\n                                ..onReload();\n                            },\n                            tileColor: e == _controller.type.value\n                                ? Theme.of(\n                                    context,\n                                  ).colorScheme.onInverseSurface\n                                : null,\n                            dense: true,\n                            title: Text(\n                              e.text ?? e.tabName!,\n                              style: const TextStyle(fontSize: 14),\n                            ),\n                          ),\n                        )\n                        .toList(),\n                  ),\n                ),\n              ),\n              icon: const Icon(size: 20, Icons.sort),\n              label: Obx(\n                () {\n                  final type = _controller.type.value;\n                  return Text(type.text ?? type.tabName!);\n                },\n              ),\n            ),\n          ),\n      ],\n    );\n  }\n\n  late final gridDelegate = SliverWaterfallFlowDelegateWithMaxCrossAxisExtent(\n    maxCrossAxisExtent: Grid.smallCardWidth,\n    mainAxisSpacing: StyleString.safeSpace,\n    crossAxisSpacing: StyleString.safeSpace,\n  );\n\n  Widget _buildBody(LoadingState<List<SpaceOpusItemModel>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => SliverWaterfallFlow(\n        gridDelegate: gridDelegate,\n        delegate: SliverChildBuilderDelegate(\n          (context, index) => const SpaceOpusSkeleton(),\n          childCount: 10,\n        ),\n      ),\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverWaterfallFlow(\n                gridDelegate: gridDelegate,\n                delegate: SliverChildBuilderDelegate(\n                  (_, index) {\n                    if (index == response.length - 1) {\n                      _controller.onLoadMore();\n                    }\n                    return SpaceOpusItem(item: response[index]);\n                  },\n                  childCount: response.length,\n                ),\n              )\n            : HttpError(onReload: _controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n\n  @override\n  bool get wantKeepAlive => true;\n}\n"
  },
  {
    "path": "lib/pages/member_opus/widgets/space_opus_item.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/stat/stat.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models/common/stat_type.dart';\nimport 'package:PiliPlus/models_new/space/space_opus/item.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\n\nclass SpaceOpusItem extends StatelessWidget {\n  const SpaceOpusItem({\n    super.key,\n    required this.item,\n  });\n\n  final SpaceOpusItemModel item;\n\n  @override\n  Widget build(BuildContext context) {\n    final hasPic = item.cover?.url?.isNotEmpty == true;\n    return Card(\n      clipBehavior: Clip.hardEdge,\n      shape: const RoundedRectangleBorder(\n        borderRadius: BorderRadius.all(Radius.circular(6)),\n      ),\n      child: InkWell(\n        onTap: () => PageUtils.pushDynFromId(id: item.opusId!),\n        borderRadius: const BorderRadius.all(Radius.circular(6)),\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            if (hasPic)\n              Stack(\n                children: [\n                  LayoutBuilder(\n                    builder: (context, constraints) => NetworkImgLayer(\n                      width: constraints.maxWidth,\n                      height: constraints.maxWidth * item.cover!.ratio,\n                      src: item.cover!.url,\n                      type: ImageType.emote,\n                      quality: 60,\n                    ),\n                  ),\n                  Positioned(\n                    left: 0,\n                    bottom: 0,\n                    right: 0,\n                    child: Container(\n                      height: 45,\n                      alignment: Alignment.bottomLeft,\n                      padding: const EdgeInsets.only(left: 8, bottom: 4),\n                      decoration: const BoxDecoration(\n                        gradient: LinearGradient(\n                          begin: Alignment.topCenter,\n                          end: Alignment.bottomCenter,\n                          colors: [Colors.transparent, Colors.black54],\n                        ),\n                      ),\n                      child: StatWidget(\n                        type: StatType.like,\n                        value: item.stat?.like,\n                        color: Colors.white,\n                      ),\n                    ),\n                  ),\n                ],\n              ),\n            if (item.content?.isNotEmpty == true)\n              Padding(\n                padding: const EdgeInsets.symmetric(\n                  horizontal: 8,\n                  vertical: 10,\n                ),\n                child: Text(\n                  item.content!,\n                  maxLines: hasPic ? 4 : 6,\n                  overflow: TextOverflow.ellipsis,\n                ),\n              ),\n            if (!hasPic)\n              Padding(\n                padding: const EdgeInsets.only(left: 8, bottom: 8, right: 8),\n                child: StatWidget(\n                  type: StatType.like,\n                  value: item.stat?.like,\n                  color: Theme.of(context).colorScheme.onSurfaceVariant,\n                ),\n              ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_pgc/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/member.dart';\nimport 'package:PiliPlus/models/common/member/contribute_type.dart';\nimport 'package:PiliPlus/models_new/space/space/data.dart';\nimport 'package:PiliPlus/models_new/space/space_archive/data.dart';\nimport 'package:PiliPlus/models_new/space/space_archive/item.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:PiliPlus/pages/member/controller.dart';\nimport 'package:get/get.dart';\n\nclass MemberBangumiCtr\n    extends CommonListController<SpaceArchiveData, SpaceArchiveItem> {\n  MemberBangumiCtr({\n    required this.mid,\n    required this.heroTag,\n  });\n\n  final int mid;\n  final String? heroTag;\n  int? count;\n  late final _ctr = Get.find<MemberController>(tag: heroTag);\n\n  @override\n  void onInit() {\n    super.onInit();\n    SpaceData? response = _ctr.loadingState.value.data;\n    if (response != null) {\n      page = 2;\n      final res = response.season!;\n      loadingState.value = Success(res.item);\n      count = res.count!;\n      isEnd = res.item!.length >= count!;\n    } else {\n      queryData();\n    }\n  }\n\n  @override\n  List<SpaceArchiveItem>? getDataList(SpaceArchiveData response) {\n    return response.item;\n  }\n\n  @override\n  void checkIsEnd(int length) {\n    if (count != null && length >= count!) {\n      isEnd = true;\n    }\n  }\n\n  @override\n  Future<LoadingState<SpaceArchiveData>> customGetData() =>\n      MemberHttp.spaceArchive(\n        type: ContributeType.bangumi,\n        mid: mid,\n        pn: page,\n      );\n}\n"
  },
  {
    "path": "lib/pages/member_pgc/view.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/space/space_archive/item.dart';\nimport 'package:PiliPlus/pages/member_pgc/controller.dart';\nimport 'package:PiliPlus/pages/member_pgc/widgets/pgc_card_v_member_pgc.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass MemberBangumi extends StatefulWidget {\n  const MemberBangumi({\n    super.key,\n    required this.heroTag,\n    required this.mid,\n  });\n\n  final String? heroTag;\n  final int mid;\n\n  @override\n  State<MemberBangumi> createState() => _MemberBangumiState();\n}\n\nclass _MemberBangumiState extends State<MemberBangumi>\n    with AutomaticKeepAliveClientMixin {\n  @override\n  bool get wantKeepAlive => true;\n\n  late final MemberBangumiCtr _controller;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = Get.put(\n      MemberBangumiCtr(\n        heroTag: widget.heroTag,\n        mid: widget.mid,\n      ),\n      tag: widget.heroTag,\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    return refreshIndicator(\n      onRefresh: _controller.onRefresh,\n      child: CustomScrollView(\n        physics: const AlwaysScrollableScrollPhysics(),\n        slivers: [\n          SliverPadding(\n            padding: EdgeInsets.only(\n              left: StyleString.safeSpace,\n              right: StyleString.safeSpace,\n              top: StyleString.safeSpace,\n              bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n            ),\n            sliver: Obx(\n              () => _buildBody(_controller.loadingState.value),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  late final gridDelegate = SliverGridDelegateWithExtentAndRatio(\n    mainAxisSpacing: StyleString.cardSpace,\n    crossAxisSpacing: StyleString.cardSpace,\n    maxCrossAxisExtent: Grid.smallCardWidth * 0.6,\n    childAspectRatio: 0.75,\n    mainAxisExtent: MediaQuery.textScalerOf(context).scale(52),\n  );\n\n  Widget _buildBody(LoadingState<List<SpaceArchiveItem>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => const SliverToBoxAdapter(),\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverGrid.builder(\n                gridDelegate: gridDelegate,\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    _controller.onLoadMore();\n                  }\n                  return PgcCardVMemberPgc(\n                    item: response[index],\n                  );\n                },\n                itemCount: response.length,\n              )\n            : HttpError(onReload: _controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_pgc/widgets/pgc_card_v_member_pgc.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models_new/space/space_archive/item.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\n\n// 视频卡片 - 垂直布局\nclass PgcCardVMemberPgc extends StatelessWidget {\n  const PgcCardVMemberPgc({\n    super.key,\n    required this.item,\n  });\n\n  final SpaceArchiveItem item;\n\n  @override\n  Widget build(BuildContext context) {\n    void onLongPress() => imageSaveDialog(\n      title: item.title,\n      cover: item.cover,\n    );\n    return Card(\n      shape: const RoundedRectangleBorder(borderRadius: StyleString.mdRadius),\n      child: InkWell(\n        borderRadius: StyleString.mdRadius,\n        onTap: () => PageUtils.viewPgc(seasonId: item.param),\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            AspectRatio(\n              aspectRatio: 0.75,\n              child: LayoutBuilder(\n                builder: (context, boxConstraints) {\n                  return NetworkImgLayer(\n                    src: item.cover,\n                    width: boxConstraints.maxWidth,\n                    height: boxConstraints.maxHeight,\n                  );\n                },\n              ),\n            ),\n            Padding(\n              padding: const EdgeInsets.fromLTRB(4, 5, 0, 3),\n              child: Text(\n                item.title,\n                textAlign: TextAlign.start,\n                style: const TextStyle(\n                  letterSpacing: 0.3,\n                ),\n                maxLines: 2,\n                overflow: TextOverflow.ellipsis,\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_profile/view.dart",
    "content": "import 'dart:io' show File;\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/http/constants.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/member/profile_type.dart';\nimport 'package:PiliPlus/models/user/info.dart';\nimport 'package:PiliPlus/models_new/account_myinfo/data.dart';\nimport 'package:PiliPlus/pages/mine/controller.dart';\nimport 'package:PiliPlus/services/account_service.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/app_sign.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/extension/file_ext.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:dio/dio.dart';\nimport 'package:easy_debounce/easy_throttle.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart' show LengthLimitingTextInputFormatter;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:image_cropper/image_cropper.dart';\nimport 'package:image_picker/image_picker.dart';\nimport 'package:mime/mime.dart';\n\nclass EditProfilePage extends StatefulWidget {\n  const EditProfilePage({super.key});\n\n  @override\n  State<EditProfilePage> createState() => _EditProfilePageState();\n}\n\nclass _EditProfilePageState extends State<EditProfilePage> {\n  LoadingState<AccountMyInfoData> _loadingState =\n      LoadingState<AccountMyInfoData>.loading();\n  late final TextEditingController _textController;\n  late final _imagePicker = ImagePicker();\n  AccountService accountService = Get.find<AccountService>();\n\n  @override\n  void initState() {\n    super.initState();\n    _textController = TextEditingController();\n    _getInfo();\n  }\n\n  @override\n  void dispose() {\n    _textController.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(title: const Text('账号资料')),\n      body: _buildBody(theme, _loadingState),\n    );\n  }\n\n  Future<void> _getInfo() async {\n    Map<String, String> data = {\n      'build': '2001100',\n      'c_locale': 'zh_CN',\n      'channel': 'master',\n      'mobi_app': 'android_hd',\n      'platform': 'android',\n      's_locale': 'zh_CN',\n      'statistics': Constants.statistics,\n    };\n    Request()\n        .get(\n          '${HttpString.appBaseUrl}/x/v2/account/myinfo',\n          queryParameters: data,\n        )\n        .then((res) {\n          if (mounted) {\n            setState(() {\n              if (res.data['code'] == 0) {\n                AccountMyInfoData data = AccountMyInfoData.fromJson(\n                  res.data['data'],\n                );\n                _loadingState = Success(data);\n                accountService.face.value = data.face!;\n                try {\n                  UserInfoData userInfo = Pref.userInfoCache!\n                    ..uname = data.name\n                    ..face = data.face;\n                  GStorage.userInfo.put('userInfoCache', userInfo);\n                } catch (_) {}\n                try {\n                  Get.find<MineController>().userInfo\n                    ..value.uname = data.name\n                    ..value.face = data.face\n                    ..refresh();\n                } catch (_) {}\n              } else {\n                _loadingState = Error(res.data['message']);\n              }\n            });\n          }\n        });\n  }\n\n  Widget _buildBody(\n    ThemeData theme,\n    LoadingState<AccountMyInfoData> loadingState,\n  ) {\n    late final divider = Divider(\n      height: 1,\n      color: theme.dividerColor.withValues(alpha: 0.1),\n    );\n\n    late final divider1 = Divider(\n      thickness: 16,\n      color: theme.dividerColor.withValues(alpha: 0.1),\n    );\n\n    return switch (loadingState) {\n      Loading() => m3eLoading,\n      Success(:final response) => ListView(\n        padding: EdgeInsets.only(\n          bottom: MediaQuery.viewPaddingOf(context).bottom + 25,\n        ),\n        children: [\n          divider1,\n          _item(\n            theme: theme,\n            title: '头像',\n            widget: Padding(\n              padding: const EdgeInsets.symmetric(vertical: 5),\n              child: NetworkImgLayer(\n                width: 55,\n                height: 55,\n                type: .avatar,\n                src: response.face,\n              ),\n            ),\n            onTap: () => EasyThrottle.throttle(\n              'imagePicker',\n              const Duration(milliseconds: 500),\n              () {\n                _pickImg(theme);\n              },\n            ),\n          ),\n          divider,\n          _item(\n            theme: theme,\n            title: '昵称',\n            text: response.name,\n            onTap: () {\n              if (response.coins! < 6) {\n                SmartDialog.showToast('硬币不足');\n              } else {\n                _editDialog(\n                  type: ProfileType.uname,\n                  title: '昵称',\n                  text: response.name!,\n                );\n              }\n            },\n          ),\n          divider,\n          _item(\n            theme: theme,\n            title: '性别',\n            text: _sex(response.sex!),\n            onTap: () => showDialog(\n              context: context,\n              builder: (context_) => _sexDialog(response.sex!),\n            ),\n          ),\n          divider,\n          _item(\n            theme: theme,\n            title: '出生年月',\n            text: response.birthday,\n            onTap: () =>\n                showDatePicker(\n                  context: context,\n                  initialDate: DateTime.parse(response.birthday!),\n                  firstDate: DateTime(0001, 1, 1),\n                  lastDate: DateTime.now(),\n                ).then((res) {\n                  if (res != null) {\n                    _update(\n                      type: ProfileType.birthday,\n                      datum: DateFormatUtils.longFormat.format(res),\n                    );\n                  }\n                }),\n          ),\n          divider,\n          _item(\n            theme: theme,\n            title: '个性签名',\n            text: response.sign,\n            onTap: () => _editDialog(\n              type: ProfileType.sign,\n              title: '个性签名',\n              text: response.sign ?? '',\n            ),\n          ),\n          divider1,\n          _item(\n            theme: theme,\n            title: '头像挂件',\n            onTap: () => PageUtils.inAppWebview(\n              'https://www.bilibili.com/h5/mall/pendant/home',\n            ),\n          ),\n          divider1,\n          _item(\n            theme: theme,\n            title: 'UID',\n            needIcon: false,\n            text: response.mid.toString(),\n            onTap: () => Utils.copyText(response.mid.toString()),\n          ),\n          divider1,\n          _item(\n            theme: theme,\n            title: '哔哩哔哩认证',\n            onTap: () => PageUtils.inAppWebview(\n              'https://account.bilibili.com/official/mobile/home',\n            ),\n          ),\n          divider1,\n        ],\n      ),\n      Error(:final errMsg) => scrollErrorWidget(\n        errMsg: errMsg,\n        onReload: _getInfo,\n      ),\n    };\n  }\n\n  Widget _sexDialog(int current) {\n    return AlertDialog(\n      clipBehavior: Clip.hardEdge,\n      contentPadding: const EdgeInsets.symmetric(vertical: 12),\n      content: Column(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          _sexDialogItem(1, current, '男'),\n          _sexDialogItem(0, current, '保密'),\n          _sexDialogItem(2, current, '女'),\n        ],\n      ),\n    );\n  }\n\n  Widget _sexDialogItem(\n    int sex,\n    int current,\n    String text,\n  ) {\n    return ListTile(\n      dense: true,\n      enabled: current != sex,\n      title: Padding(\n        padding: const EdgeInsets.only(left: 10),\n        child: Text(\n          text,\n          style: const TextStyle(fontSize: 14),\n        ),\n      ),\n      trailing: current == sex ? const Icon(size: 22, Icons.check) : null,\n      onTap: () {\n        Get.back();\n        _update(type: ProfileType.sex, datum: sex);\n      },\n    );\n  }\n\n  void _editDialog({\n    required ProfileType type,\n    required String title,\n    required String text,\n  }) {\n    _textController.text = text;\n    final lines = type == ProfileType.uname ? 1 : 4;\n    showDialog(\n      context: context,\n      builder: (BuildContext context) {\n        final theme = Theme.of(context);\n        return AlertDialog(\n          title: Text('修改$title'),\n          content: TextField(\n            controller: _textController,\n            minLines: lines,\n            maxLines: lines,\n            autofocus: true,\n            style: const TextStyle(fontSize: 14),\n            textInputAction: type == ProfileType.sign\n                ? TextInputAction.newline\n                : null,\n            inputFormatters: [\n              LengthLimitingTextInputFormatter(\n                type == ProfileType.uname ? 16 : 70,\n              ),\n            ],\n            decoration: InputDecoration(\n              hintText: text,\n              hintStyle: TextStyle(\n                fontSize: 14,\n                color: theme.colorScheme.outline,\n              ),\n            ),\n          ),\n          actions: [\n            TextButton(\n              onPressed: Get.back,\n              child: Text(\n                '取消',\n                style: TextStyle(color: theme.colorScheme.outline),\n              ),\n            ),\n            TextButton(\n              onPressed: () {\n                if (_textController.text == text) {\n                  SmartDialog.showToast('与原$title相同');\n                } else {\n                  _update(type: type);\n                }\n              },\n              child: const Text('确定'),\n            ),\n          ],\n        );\n      },\n    ).whenComplete(_textController.clear);\n  }\n\n  Future<void> _update({\n    required ProfileType type,\n    dynamic datum,\n  }) async {\n    final accessKey = Accounts.main.accessKey;\n    if (accessKey == null || accessKey.isEmpty) {\n      SmartDialog.showToast('请退出账号后重新登录');\n      return;\n    }\n    final data = <String, String>{\n      'access_key': accessKey,\n      'build': '2001100',\n      'c_locale': 'zh_CN',\n      'channel': 'master',\n      'mobi_app': 'android_hd',\n      'platform': 'android',\n      's_locale': 'zh_CN',\n      'statistics': Constants.statistics,\n      if (type == ProfileType.uname)\n        'uname': _textController.text\n      else if (type == ProfileType.sign)\n        'user_sign': _textController.text\n      else if (type == ProfileType.birthday)\n        'birthday': datum\n      else if (type == ProfileType.sex)\n        'sex': datum.toString(),\n    };\n    AppSign.appSign(data);\n    Request()\n        .post(\n          '/x/member/app/${type.name}/update',\n          data: data,\n          options: Options(\n            contentType: Headers.formUrlEncodedContentType,\n          ),\n        )\n        .then((res) {\n          if (res.data['code'] == 0) {\n            AccountMyInfoData data = _loadingState.data;\n            if (type == ProfileType.uname) {\n              data\n                ..name = _textController.text\n                ..coins = data.coins! - 6;\n              try {\n                UserInfoData userInfo = Pref.userInfoCache!\n                  ..uname = _textController.text;\n                GStorage.userInfo.put('userInfoCache', userInfo);\n              } catch (_) {}\n              try {\n                Get.find<MineController>().userInfo\n                  ..value.uname = _textController.text\n                  ..refresh();\n              } catch (_) {}\n            } else if (type == ProfileType.sign) {\n              data.sign = _textController.text;\n            } else if (type == ProfileType.birthday) {\n              data.birthday = datum;\n            } else if (type == ProfileType.sex) {\n              data.sex = datum;\n            }\n            SmartDialog.showToast('修改成功');\n            if (mounted) {\n              setState(() {});\n            }\n            if (type == ProfileType.uname || type == ProfileType.sign) {\n              Get.back();\n            }\n          } else {\n            SmartDialog.showToast(res.data['message']);\n          }\n        });\n  }\n\n  String _sex(int sex) {\n    return switch (sex) {\n      0 => '保密',\n      1 => '男',\n      2 => '女',\n      _ => '未知',\n    };\n  }\n\n  Widget _item({\n    required ThemeData theme,\n    required String title,\n    Widget? widget,\n    String? text,\n    GestureTapCallback? onTap,\n    bool needIcon = true,\n  }) {\n    return ListTile(\n      onTap: onTap,\n      dense: title != '头像',\n      leading: Text(\n        title,\n        style: const TextStyle(\n          fontSize: 14,\n          fontWeight: FontWeight.normal,\n        ),\n      ),\n      title: Row(\n        mainAxisAlignment: MainAxisAlignment.end,\n        children: [\n          if (text != null)\n            Flexible(\n              child: Text(\n                text,\n                maxLines: 1,\n                overflow: TextOverflow.ellipsis,\n                style: TextStyle(\n                  fontSize: 14,\n                  fontWeight: FontWeight.normal,\n                  color: theme.colorScheme.outline,\n                ),\n              ),\n            )\n          else\n            ?widget,\n          if (needIcon)\n            Icon(\n              Icons.keyboard_arrow_right,\n              color: theme.colorScheme.outline,\n            )\n          else\n            const SizedBox(width: 24),\n        ],\n      ),\n    );\n  }\n\n  Future<void> _pickImg(ThemeData theme) async {\n    try {\n      XFile? pickedFile = await _imagePicker.pickImage(\n        source: ImageSource.gallery,\n        imageQuality: 100,\n      );\n      if (pickedFile != null && mounted) {\n        String? mimeType = lookupMimeType(\n          pickedFile.path,\n        )?.split('/').elementAtOrNull(1);\n        if (mimeType == 'gif') {\n          SmartDialog.showToast('不能选GIF');\n          return;\n        }\n        String? imagePath = pickedFile.path;\n        if (PlatformUtils.isMobile) {\n          final croppedFile = await ImageCropper.platform.cropImage(\n            sourcePath: imagePath,\n            uiSettings: [\n              AndroidUiSettings(\n                toolbarTitle: '裁剪',\n                toolbarColor: theme.colorScheme.secondaryContainer,\n                toolbarWidgetColor: theme.colorScheme.onSecondaryContainer,\n                statusBarLight: theme.colorScheme.isLight,\n                aspectRatioPresets: const [CropAspectRatioPresetCustom()],\n                lockAspectRatio: true,\n                hideBottomControls: true,\n                cropStyle: CropStyle.circle,\n                initAspectRatio: const CropAspectRatioPresetCustom(),\n              ),\n              IOSUiSettings(\n                title: '裁剪',\n                aspectRatioPresets: const [CropAspectRatioPresetCustom()],\n                cropStyle: CropStyle.circle,\n                aspectRatioLockEnabled: true,\n                resetAspectRatioEnabled: false,\n                aspectRatioPickerButtonHidden: true,\n              ),\n            ],\n          );\n          File(imagePath).tryDel();\n          imagePath = croppedFile?.path;\n        }\n        if (imagePath != null) {\n          Request()\n              .post(\n                '/x/member/web/face/update',\n                queryParameters: {\n                  'csrf': Accounts.main.csrf,\n                },\n                data: FormData.fromMap({\n                  'dopost': 'save',\n                  'DisplayRank': 10000,\n                  'face': await MultipartFile.fromFile(imagePath),\n                }),\n              )\n              .then((res) {\n                if (res.data['code'] == 0) {\n                  SmartDialog.showToast('修改成功');\n                  Future.delayed(const Duration(milliseconds: 500), () {\n                    if (mounted) {\n                      _getInfo();\n                    }\n                  });\n                } else {\n                  SmartDialog.showToast(res.data['message']);\n                }\n                if (PlatformUtils.isMobile && imagePath != null) {\n                  File(imagePath).tryDel();\n                }\n              });\n        }\n      }\n    } catch (e) {\n      SmartDialog.showToast(e.toString());\n    }\n  }\n}\n\nclass CropAspectRatioPresetCustom implements CropAspectRatioPresetData {\n  const CropAspectRatioPresetCustom();\n\n  @override\n  (int, int) get data => const (1, 1);\n\n  @override\n  String get name => '1x1 (customized)';\n}\n"
  },
  {
    "path": "lib/pages/member_search/child/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/member.dart';\nimport 'package:PiliPlus/models/common/member/search_type.dart';\nimport 'package:PiliPlus/models/dynamics/result.dart';\nimport 'package:PiliPlus/models_new/member/search_archive/data.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:PiliPlus/pages/member_search/controller.dart';\n\nclass MemberSearchChildController extends CommonListController {\n  MemberSearchChildController(this.controller, this.searchType);\n\n  final MemberSearchController controller;\n  final MemberSearchType searchType;\n\n  dynamic offset;\n\n  @override\n  void checkIsEnd(int length) {\n    switch (searchType) {\n      case MemberSearchType.archive:\n        if (controller.counts.first != -1 &&\n            length >= controller.counts.first) {\n          isEnd = true;\n        }\n        break;\n      case MemberSearchType.dynamic:\n        if (controller.counts[1] != -1 && length >= controller.counts[1]) {\n          isEnd = true;\n        }\n        break;\n    }\n  }\n\n  @override\n  List? getDataList(response) {\n    switch (searchType) {\n      case MemberSearchType.archive:\n        SearchArchiveData data = response;\n        controller.counts[searchType.index] = data.page?.count ?? 0;\n        return data.list?.vlist;\n      case MemberSearchType.dynamic:\n        DynamicsDataModel data = response;\n        offset = data.offset;\n        if (data.hasMore == false) {\n          isEnd = true;\n        }\n        controller.counts[searchType.index] = data.total ?? 0;\n        return data.items;\n    }\n  }\n\n  @override\n  Future<void> onRefresh() {\n    offset = null;\n    return super.onRefresh();\n  }\n\n  @override\n  Future<LoadingState> customGetData() {\n    return switch (searchType) {\n      MemberSearchType.archive => MemberHttp.searchArchive(\n        mid: controller.mid,\n        pn: page,\n        keyword: controller.editingController.text,\n        order: 'pubdate',\n      ),\n      MemberSearchType.dynamic => MemberHttp.dynSearch(\n        mid: controller.mid,\n        pn: page,\n        offset: offset ?? '',\n        keyword: controller.editingController.text,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_search/child/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/video_card/video_card_h.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/member/search_type.dart';\nimport 'package:PiliPlus/pages/dynamics/widgets/dynamic_panel.dart';\nimport 'package:PiliPlus/pages/member_search/child/controller.dart';\nimport 'package:PiliPlus/utils/global_data.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:PiliPlus/utils/waterfall.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:waterfall_flow/waterfall_flow.dart'\n    hide SliverWaterfallFlowDelegateWithMaxCrossAxisExtent;\n\nclass MemberSearchChildPage extends StatefulWidget {\n  const MemberSearchChildPage({\n    super.key,\n    required this.controller,\n    required this.searchType,\n  });\n\n  final MemberSearchChildController controller;\n  final MemberSearchType searchType;\n\n  @override\n  State<MemberSearchChildPage> createState() => _MemberSearchChildPageState();\n}\n\nclass _MemberSearchChildPageState extends State<MemberSearchChildPage>\n    with AutomaticKeepAliveClientMixin, DynMixin, GridMixin {\n  MemberSearchChildController get _controller => widget.controller;\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    return refreshIndicator(\n      onRefresh: _controller.onRefresh,\n      child: CustomScrollView(\n        controller: _controller.scrollController,\n        physics: const AlwaysScrollableScrollPhysics(),\n        slivers: [\n          SliverPadding(\n            padding: EdgeInsets.only(\n              top: widget.searchType == MemberSearchType.archive ? 7 : 0,\n              bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n            ),\n            sliver: switch (widget.searchType) {\n              MemberSearchType.archive => Obx(\n                () => _buildBody(_controller.loadingState.value),\n              ),\n              MemberSearchType.dynamic => buildPage(\n                Obx(() => _buildBody(_controller.loadingState.value)),\n              ),\n            },\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget get _buildLoading {\n    return switch (widget.searchType) {\n      MemberSearchType.archive => gridSkeleton,\n      MemberSearchType.dynamic => dynSkeleton,\n    };\n  }\n\n  Widget _buildBody(LoadingState<List?> loadingState) {\n    return switch (loadingState) {\n      Loading() => _buildLoading,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? Builder(\n                builder: (context) {\n                  return switch (widget.searchType) {\n                    MemberSearchType.archive => SliverGrid.builder(\n                      gridDelegate: gridDelegate,\n                      itemBuilder: (context, index) {\n                        if (index == response.length - 1) {\n                          _controller.onLoadMore();\n                        }\n                        return VideoCardH(\n                          videoItem: response[index],\n                        );\n                      },\n                      itemCount: response.length,\n                    ),\n                    MemberSearchType.dynamic =>\n                      GlobalData().dynamicsWaterfallFlow\n                          ? SliverWaterfallFlow(\n                              gridDelegate: dynGridDelegate,\n                              delegate: SliverChildBuilderDelegate(\n                                (_, index) {\n                                  if (index == response.length - 1) {\n                                    _controller.onLoadMore();\n                                  }\n                                  return DynamicPanel(item: response[index]);\n                                },\n                                childCount: response.length,\n                              ),\n                            )\n                          : SliverList.builder(\n                              itemBuilder: (context, index) {\n                                if (index == response.length - 1) {\n                                  _controller.onLoadMore();\n                                }\n                                return DynamicPanel(item: response[index]);\n                              },\n                              itemCount: response.length,\n                            ),\n                  };\n                },\n              )\n            : HttpError(onReload: _controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n\n  @override\n  bool get wantKeepAlive => true;\n}\n"
  },
  {
    "path": "lib/pages/member_search/controller.dart",
    "content": "import 'package:PiliPlus/models/common/member/search_type.dart';\nimport 'package:PiliPlus/pages/member_search/child/controller.dart';\nimport 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass MemberSearchController extends GetxController\n    with GetSingleTickerProviderStateMixin {\n  late final FocusNode focusNode;\n  late final TabController tabController;\n  late final TextEditingController editingController;\n\n  final mid = Get.parameters['mid']!;\n  final uname = Get.parameters['uname'];\n\n  final RxBool hasData = false.obs;\n  final RxList<int> counts = <int>[-1, -1].obs;\n\n  late final MemberSearchChildController arcCtr;\n  late final MemberSearchChildController dynCtr;\n\n  @override\n  void onInit() {\n    super.onInit();\n    focusNode = FocusNode();\n    editingController = TextEditingController();\n    tabController = TabController(vsync: this, length: 2);\n    arcCtr = Get.put(\n      MemberSearchChildController(this, MemberSearchType.archive),\n      tag: Utils.generateRandomString(8),\n    );\n    dynCtr = Get.put(\n      MemberSearchChildController(this, MemberSearchType.dynamic),\n      tag: Utils.generateRandomString(8),\n    );\n  }\n\n  void onClear() {\n    if (editingController.value.text.isNotEmpty) {\n      editingController.clear();\n      counts.value = <int>[-1, -1];\n      hasData.value = false;\n      focusNode.requestFocus();\n    } else {\n      Get.back();\n    }\n  }\n\n  void submit() {\n    if (editingController.text.isNotEmpty) {\n      hasData.value = true;\n      arcCtr\n        ..scrollController.jumpToTop()\n        ..onReload();\n      dynCtr\n        ..scrollController.jumpToTop()\n        ..onReload();\n    }\n  }\n\n  @override\n  void onClose() {\n    focusNode.dispose();\n    tabController.dispose();\n    editingController.dispose();\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_search/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/common/widgets/view_safe_area.dart';\nimport 'package:PiliPlus/models/common/member/search_type.dart';\nimport 'package:PiliPlus/pages/member_search/child/view.dart';\nimport 'package:PiliPlus/pages/member_search/controller.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass MemberSearchPage extends StatefulWidget {\n  const MemberSearchPage({super.key});\n\n  @override\n  State<MemberSearchPage> createState() => _MemberSearchPageState();\n}\n\nclass _MemberSearchPageState extends State<MemberSearchPage> {\n  final _controller = Get.put(\n    MemberSearchController(),\n    tag: Utils.generateRandomString(8),\n  );\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        actions: [\n          IconButton(\n            tooltip: '搜索',\n            onPressed: _controller.submit,\n            icon: const Icon(Icons.search, size: 22),\n          ),\n          const SizedBox(width: 10),\n        ],\n        title: TextField(\n          autofocus: true,\n          focusNode: _controller.focusNode,\n          controller: _controller.editingController,\n          textInputAction: TextInputAction.search,\n          textAlignVertical: TextAlignVertical.center,\n          decoration: InputDecoration(\n            hintText: '搜索',\n            visualDensity: .standard,\n            border: InputBorder.none,\n            suffixIcon: IconButton(\n              tooltip: '清空',\n              icon: const Icon(Icons.clear, size: 22),\n              onPressed: _controller.onClear,\n            ),\n          ),\n          onSubmitted: (value) => _controller.submit(),\n          onChanged: (value) {\n            if (value.isEmpty) {\n              _controller.hasData.value = false;\n            }\n          },\n        ),\n      ),\n      body: ViewSafeArea(\n        child: Stack(\n          clipBehavior: Clip.none,\n          children: [\n            Obx(() {\n              return Opacity(\n                opacity: _controller.hasData.value ? 1 : 0,\n                child: Column(\n                  children: [\n                    TabBar(\n                      controller: _controller.tabController,\n                      tabs: [\n                        Obx(\n                          () => Tab(\n                            text:\n                                '视频 ${_controller.counts[0] != -1 ? _controller.counts[0] : ''}',\n                          ),\n                        ),\n                        Obx(\n                          () => Tab(\n                            text:\n                                '动态 ${_controller.counts[1] != -1 ? _controller.counts[1] : ''}',\n                          ),\n                        ),\n                      ],\n                      onTap: (index) {\n                        if (!_controller.tabController.indexIsChanging) {\n                          if (index == 0) {\n                            _controller.arcCtr.animateToTop();\n                          } else {\n                            _controller.dynCtr.animateToTop();\n                          }\n                        }\n                      },\n                    ),\n                    Expanded(\n                      child: tabBarView(\n                        controller: _controller.tabController,\n                        children: [\n                          MemberSearchChildPage(\n                            controller: _controller.arcCtr,\n                            searchType: MemberSearchType.archive,\n                          ),\n                          MemberSearchChildPage(\n                            controller: _controller.dynCtr,\n                            searchType: MemberSearchType.dynamic,\n                          ),\n                        ],\n                      ),\n                    ),\n                  ],\n                ),\n              );\n            }),\n            Obx(\n              () => _controller.hasData.value\n                  ? const SizedBox.shrink()\n                  : Align(\n                      alignment: const Alignment(0, -0.5),\n                      child: Text(\n                        '搜索「${_controller.uname}」的动态、视频',\n                        textAlign: TextAlign.center,\n                      ),\n                    ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_season_series/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/member.dart';\nimport 'package:PiliPlus/models_new/space/space_season_series/item.dart';\nimport 'package:PiliPlus/models_new/space/space_season_series/season.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\n\nclass SeasonSeriesController\n    extends CommonListController<SpaceSsData, SpaceSsModel> {\n  SeasonSeriesController(this.mid);\n  final int mid;\n  int? count;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  List<SpaceSsModel>? getDataList(SpaceSsData response) {\n    count = response.page?.total;\n    return (response.seasonsList ?? <SpaceSsModel>[]) +\n        (response.seriesList ?? <SpaceSsModel>[]);\n  }\n\n  @override\n  void checkIsEnd(int length) {\n    if (count != null && length >= count!) {\n      isEnd = true;\n    }\n  }\n\n  @override\n  Future<LoadingState<SpaceSsData>> customGetData() =>\n      MemberHttp.seasonSeriesList(\n        mid: mid,\n        pn: page,\n      );\n}\n"
  },
  {
    "path": "lib/pages/member_season_series/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/view_safe_area.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/member/contribute_type.dart';\nimport 'package:PiliPlus/models_new/space/space_season_series/season.dart'\n    show SpaceSsModel;\nimport 'package:PiliPlus/pages/member_season_series/controller.dart';\nimport 'package:PiliPlus/pages/member_season_series/widget/season_series_card.dart';\nimport 'package:PiliPlus/pages/member_video/view.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass SeasonSeriesPage extends StatefulWidget {\n  const SeasonSeriesPage({\n    super.key,\n    required this.mid,\n    this.heroTag,\n  });\n\n  final int mid;\n  final String? heroTag;\n\n  @override\n  State<SeasonSeriesPage> createState() => _SeasonSeriesPageState();\n}\n\nclass _SeasonSeriesPageState extends State<SeasonSeriesPage>\n    with AutomaticKeepAliveClientMixin, GridMixin {\n  late final SeasonSeriesController _controller;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = Get.put(\n      SeasonSeriesController(widget.mid),\n      tag: widget.heroTag,\n    );\n  }\n\n  @override\n  bool get wantKeepAlive => true;\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    return CustomScrollView(\n      slivers: [\n        SliverPadding(\n          padding: EdgeInsets.only(\n            bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n          ),\n          sliver: Obx(\n            () => _buildBody(_controller.loadingState.value),\n          ),\n        ),\n      ],\n    );\n  }\n\n  Widget _buildBody(LoadingState<List<SpaceSsModel>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => gridSkeleton,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverGrid.builder(\n                gridDelegate: gridDelegate,\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    _controller.onLoadMore();\n                  }\n                  SpaceSsModel item = response[index];\n                  return SeasonSeriesCard(\n                    item: item,\n                    onTap: () {\n                      bool isSeason = item.meta!.seasonId != null;\n                      dynamic id = isSeason\n                          ? item.meta!.seasonId\n                          : item.meta!.seriesId;\n                      Get.to(\n                        Scaffold(\n                          resizeToAvoidBottomInset: false,\n                          appBar: AppBar(title: Text(item.meta!.name!)),\n                          body: ViewSafeArea(\n                            child: MemberVideo(\n                              type: isSeason\n                                  ? ContributeType.season\n                                  : ContributeType.series,\n                              heroTag: widget.heroTag,\n                              mid: widget.mid,\n                              seasonId: isSeason ? id : null,\n                              seriesId: isSeason ? null : id,\n                              title: item.meta!.name,\n                            ),\n                          ),\n                        ),\n                      );\n                    },\n                  );\n                },\n                itemCount: response.length,\n              )\n            : HttpError(onReload: _controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_season_series/widget/season_series_card.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models_new/space/space_season_series/season.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\n\nclass SeasonSeriesCard extends StatelessWidget {\n  const SeasonSeriesCard({\n    super.key,\n    required this.item,\n    required this.onTap,\n  });\n  final SpaceSsModel item;\n  final VoidCallback onTap;\n\n  @override\n  Widget build(BuildContext context) {\n    void onLongPress() => imageSaveDialog(\n      title: item.meta!.name,\n      cover: item.meta!.cover,\n    );\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        onTap: onTap,\n        child: Padding(\n          padding: const EdgeInsets.symmetric(\n            horizontal: StyleString.safeSpace,\n            vertical: 5,\n          ),\n          child: Row(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              AspectRatio(\n                aspectRatio: StyleString.aspectRatio,\n                child: LayoutBuilder(\n                  builder: (BuildContext context, BoxConstraints boxConstraints) {\n                    final double maxWidth = boxConstraints.maxWidth;\n                    final double maxHeight = boxConstraints.maxHeight;\n                    return Stack(\n                      clipBehavior: Clip.none,\n                      children: [\n                        NetworkImgLayer(\n                          src: item.meta!.cover,\n                          width: maxWidth,\n                          height: maxHeight,\n                        ),\n                        PBadge(\n                          text:\n                              '${item.meta!.seasonId != null ? '合集' : '列表'}: ${item.meta!.total}',\n                          bottom: 6.0,\n                          right: 6.0,\n                        ),\n                      ],\n                    );\n                  },\n                ),\n              ),\n              const SizedBox(width: 10),\n              content(context),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget content(BuildContext context) {\n    final theme = Theme.of(context);\n    return Expanded(\n      child: Column(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          Text(\n            item.meta!.name!,\n            textAlign: TextAlign.start,\n            style: TextStyle(\n              fontSize: theme.textTheme.bodyMedium!.fontSize,\n              height: 1.42,\n              letterSpacing: 0.3,\n            ),\n            maxLines: 2,\n            overflow: TextOverflow.ellipsis,\n          ),\n          const Spacer(),\n          Text(\n            DateFormatUtils.dateFormat(item.meta!.ptime),\n            maxLines: 1,\n            style: TextStyle(\n              fontSize: 12,\n              height: 1,\n              color: theme.colorScheme.outline,\n              overflow: TextOverflow.clip,\n            ),\n          ),\n          const Spacer(),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_shop/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/member.dart';\nimport 'package:PiliPlus/models_new/space/space_shop/data.dart';\nimport 'package:PiliPlus/models_new/space/space_shop/item.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\n\nclass MemberShopController\n    extends CommonListController<SpaceShopData, SpaceShopItem> {\n  MemberShopController(this.mid);\n\n  final int mid;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  bool? showMoreTab;\n  String? clickUrl;\n  String? showMoreDesc;\n\n  @override\n  List<SpaceShopItem>? getDataList(SpaceShopData response) {\n    isEnd = response.haveNextPage == false;\n    showMoreTab = response.showMoreTab;\n    clickUrl = response.clickUrl;\n    showMoreDesc = response.showMoreDesc;\n    return response.data;\n  }\n\n  @override\n  Future<LoadingState<SpaceShopData>> customGetData() =>\n      MemberHttp.spaceShop(mid: mid);\n}\n"
  },
  {
    "path": "lib/pages/member_shop/view.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/skeleton/space_opus.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/space/space_shop/item.dart';\nimport 'package:PiliPlus/pages/member_shop/controller.dart';\nimport 'package:PiliPlus/pages/member_shop/widgets/item.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:PiliPlus/utils/waterfall.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:waterfall_flow/waterfall_flow.dart'\n    hide SliverWaterfallFlowDelegateWithMaxCrossAxisExtent;\n\nclass MemberShop extends StatefulWidget {\n  const MemberShop({\n    super.key,\n    required this.heroTag,\n    required this.mid,\n  });\n\n  final String? heroTag;\n  final int mid;\n\n  @override\n  State<MemberShop> createState() => _MemberShopState();\n}\n\nclass _MemberShopState extends State<MemberShop>\n    with AutomaticKeepAliveClientMixin {\n  late final MemberShopController _controller;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = Get.put(\n      MemberShopController(widget.mid),\n      tag: widget.heroTag,\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    return refreshIndicator(\n      onRefresh: _controller.onRefresh,\n      child: CustomScrollView(\n        physics: const AlwaysScrollableScrollPhysics(),\n        slivers: [\n          SliverPadding(\n            padding: EdgeInsets.only(\n              top: 12,\n              left: StyleString.safeSpace,\n              right: StyleString.safeSpace,\n              bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n            ),\n            sliver: Obx(() => _buildBody(_controller.loadingState.value)),\n          ),\n        ],\n      ),\n    );\n  }\n\n  @override\n  bool get wantKeepAlive => true;\n\n  late final gridDelegate = SliverWaterfallFlowDelegateWithMaxCrossAxisExtent(\n    maxCrossAxisExtent: Grid.smallCardWidth,\n    mainAxisSpacing: StyleString.safeSpace,\n    crossAxisSpacing: StyleString.safeSpace,\n  );\n\n  Widget _buildBody(LoadingState<List<SpaceShopItem>?> loadingState) {\n    switch (loadingState) {\n      case Loading():\n        return SliverWaterfallFlow(\n          gridDelegate: gridDelegate,\n          delegate: SliverChildBuilderDelegate(\n            (context, index) => const SpaceOpusSkeleton(),\n            childCount: 10,\n          ),\n        );\n      case Success(:final response):\n        if (response == null || response.isEmpty) {\n          return HttpError(onReload: _controller.onReload);\n        }\n        Widget sliver = SliverWaterfallFlow(\n          gridDelegate: gridDelegate,\n          delegate: SliverChildBuilderDelegate(\n            (_, index) {\n              return MemberShopItem(item: response[index]);\n            },\n            childCount: response.length,\n          ),\n        );\n        if (_controller.showMoreTab == true) {\n          sliver = SliverMainAxisGroup(\n            slivers: [\n              sliver,\n              SliverToBoxAdapter(\n                child: Padding(\n                  padding: const EdgeInsets.only(top: 25),\n                  child: Center(\n                    child: FilledButton.tonal(\n                      onPressed: () {\n                        if (_controller.clickUrl case final clickUrl?) {\n                          final url = Uri.parse(\n                            clickUrl,\n                          ).queryParameters['url'];\n                          if (url case final url?) {\n                            Get.toNamed(\n                              '/webview',\n                              parameters: {'url': url},\n                            );\n                          }\n                        }\n                      },\n                      style: FilledButton.styleFrom(\n                        visualDensity: VisualDensity.compact,\n                      ),\n                      child: Text(_controller.showMoreDesc ?? ''),\n                    ),\n                  ),\n                ),\n              ),\n            ],\n          );\n        }\n        return sliver;\n      case Error(:final errMsg):\n        return HttpError(\n          errMsg: errMsg,\n          onReload: _controller.onReload,\n        );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_shop/widgets/item.dart",
    "content": "import 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models_new/space/space_shop/item.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\nimport 'package:get/get.dart';\n\nclass MemberShopItem extends StatelessWidget {\n  const MemberShopItem({\n    super.key,\n    required this.item,\n  });\n\n  final SpaceShopItem item;\n\n  @override\n  Widget build(BuildContext context) {\n    final colorScheme = Theme.of(context).colorScheme;\n    final belowLabels = item.belowLabels?.map((e) => e.title).join('|');\n    return Card(\n      clipBehavior: Clip.hardEdge,\n      shape: const RoundedRectangleBorder(\n        borderRadius: BorderRadius.all(Radius.circular(6)),\n      ),\n      child: InkWell(\n        onTap: () {\n          if (item.cardUrl case final cardUrl?) {\n            Get.toNamed('/webview', parameters: {'url': cardUrl});\n          }\n        },\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            LayoutBuilder(\n              builder: (context, constraints) => NetworkImgLayer(\n                type: .emote,\n                src: item.cover?.url,\n                width: constraints.maxWidth,\n                height: constraints.maxWidth,\n              ),\n            ),\n            Padding(\n              padding: const EdgeInsets.all(8),\n              child: Column(\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  Text(\n                    item.title!,\n                    maxLines: 2,\n                    overflow: TextOverflow.ellipsis,\n                  ),\n                  if (belowLabels?.isNotEmpty == true)\n                    Padding(\n                      padding: const EdgeInsets.symmetric(vertical: 2),\n                      child: PBadge(\n                        text: belowLabels,\n                        type: PBadgeType.shop,\n                        size: PBadgeSize.small,\n                        isStack: false,\n                        fontSize: 10,\n                        padding: const EdgeInsets.symmetric(\n                          horizontal: 3,\n                          vertical: 2,\n                        ),\n                      ),\n                    ),\n                  Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: [\n                      if (item.netPrice case final netPrice?)\n                        Text.rich(\n                          style: TextStyle(color: colorScheme.vipColor),\n                          TextSpan(\n                            children: [\n                              if (netPrice.pricePrefix?.isNotEmpty == true)\n                                TextSpan(\n                                  text: '${netPrice.pricePrefix} ',\n                                  style: const TextStyle(fontSize: 11),\n                                ),\n                              TextSpan(\n                                text:\n                                    '${netPrice.priceSymbol}${netPrice.netPrice}',\n                                style: const TextStyle(\n                                  fontWeight: FontWeight.w500,\n                                ),\n                              ),\n                            ],\n                          ),\n                        ),\n                      if (item.benefitInfos?.isNotEmpty == true)\n                        Text(\n                          item.benefitInfos!\n                              .map(\n                                (e) =>\n                                    '${e.prefix ?? ''}${e.amount ?? ''}${e.suffix ?? ''}',\n                              )\n                              .join('|'),\n                          style: TextStyle(\n                            fontSize: 11,\n                            color: colorScheme.outline,\n                          ),\n                        ),\n                    ],\n                  ),\n                  if (item.itemSourceName?.isNotEmpty == true)\n                    Text(\n                      '来自${item.itemSourceName}',\n                      style: TextStyle(\n                        fontSize: 11,\n                        color: colorScheme.freeColor,\n                      ),\n                    ),\n                ],\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_upower_rank/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/member.dart';\nimport 'package:PiliPlus/models_new/upower_rank/data.dart';\nimport 'package:PiliPlus/models_new/upower_rank/level_info.dart';\nimport 'package:PiliPlus/models_new/upower_rank/rank_info.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:get/get.dart';\n\nclass UpowerRankController\n    extends CommonListController<UpowerRankData, UpowerRankInfo> {\n  UpowerRankController({this.privilegeType, required this.upMid});\n  int? privilegeType;\n\n  final String upMid;\n  final Rx<String?> name = Rx<String?>(null);\n  final Rx<List<LevelInfo>?> tabs = Rx<List<LevelInfo>?>(null);\n  int? memberTotal;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  List<UpowerRankInfo>? getDataList(UpowerRankData response) {\n    isEnd = true;\n    memberTotal = response.memberTotal ?? 0;\n    if (response.levelInfo != null && response.levelInfo!.length > 1) {\n      tabs.value = response.levelInfo;\n    }\n    name.value = response.upInfo!.nickname;\n    return response.rankInfo;\n  }\n\n  @override\n  Future<LoadingState<UpowerRankData>> customGetData() => MemberHttp.upowerRank(\n    upMid: upMid,\n    page: page,\n    privilegeType: privilegeType,\n  );\n}\n"
  },
  {
    "path": "lib/pages/member_upower_rank/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/list_tile.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/keep_alive_wrapper.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models_new/upower_rank/rank_info.dart';\nimport 'package:PiliPlus/pages/member_upower_rank/controller.dart';\nimport 'package:PiliPlus/utils/extension/widget_ext.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart' hide ListTile;\nimport 'package:get/get.dart';\n\nclass UpowerRankPage extends StatefulWidget {\n  const UpowerRankPage({super.key, this.upMid, this.tag, this.privilegeType});\n\n  final String? upMid;\n  final String? tag;\n  final int? privilegeType;\n\n  @override\n  State<UpowerRankPage> createState() => _UpowerRankPageState();\n}\n\nclass _UpowerRankPageState extends State<UpowerRankPage>\n    with AutomaticKeepAliveClientMixin {\n  late final _upMid = Get.parameters['mid']!;\n  late final String _tag;\n  late final UpowerRankController _controller;\n\n  @override\n  void initState() {\n    super.initState();\n    _tag = widget.privilegeType == null\n        ? Utils.generateRandomString(8)\n        : '${widget.tag}${widget.privilegeType}';\n    _controller = Get.put(\n      UpowerRankController(\n        privilegeType: widget.privilegeType,\n        upMid: widget.upMid ?? _upMid,\n      ),\n      tag: _tag,\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final theme = Theme.of(context);\n    final padding = MediaQuery.viewPaddingOf(context);\n    final child = refreshIndicator(\n      onRefresh: _controller.onRefresh,\n      child: CustomScrollView(\n        controller: _controller.scrollController,\n        physics: const AlwaysScrollableScrollPhysics(),\n        slivers: [\n          SliverPadding(\n            padding: EdgeInsets.only(bottom: padding.bottom + 100),\n            sliver: Obx(\n              () => _buildBody(theme, _controller.loadingState.value),\n            ),\n          ),\n        ],\n      ),\n    );\n    if (widget.privilegeType == null) {\n      return Scaffold(\n        resizeToAvoidBottomInset: false,\n        appBar: AppBar(\n          title: Obx(() {\n            final name = _controller.name.value;\n            return name == null\n                ? const SizedBox.shrink()\n                : Text(\n                    '$name 充电排行榜${_controller.memberTotal == 0 ? '' : '(${_controller.memberTotal})'}',\n                  );\n          }),\n          actions: [\n            TextButton(\n              onPressed: () => Get.toNamed(\n                '/webview',\n                parameters: {\n                  'url':\n                      'https://member.bilibili.com/mall/upower-pay?mid=$_upMid&oid=$_upMid',\n                },\n              ),\n              style: TextButton.styleFrom(visualDensity: VisualDensity.compact),\n              child: const Text('充电'),\n            ),\n            const SizedBox(width: 12),\n          ],\n        ),\n        body: Padding(\n          padding: EdgeInsets.only(left: padding.left, right: padding.right),\n          child: Obx(\n            () {\n              final tabs = _controller.tabs.value;\n              return tabs != null\n                  ? DefaultTabController(\n                      length: tabs.length,\n                      child: Builder(\n                        builder: (context) {\n                          return Column(\n                            children: [\n                              TabBar(\n                                isScrollable: true,\n                                tabAlignment: TabAlignment.start,\n                                tabs: tabs\n                                    .map(\n                                      (e) => Tab(\n                                        text:\n                                            '${e.name!}(${e.memberTotal ?? 0})',\n                                      ),\n                                    )\n                                    .toList(),\n                                onTap: (index) {\n                                  if (!DefaultTabController.of(\n                                    context,\n                                  ).indexIsChanging) {\n                                    try {\n                                      if (index == 0) {\n                                        _controller.animateToTop();\n                                      } else {\n                                        Get.find<UpowerRankController>(\n                                          tag:\n                                              '$_tag${tabs[index].privilegeType}',\n                                        ).animateToTop();\n                                      }\n                                    } catch (_) {}\n                                  }\n                                },\n                              ),\n                              Expanded(\n                                child: tabBarView(\n                                  children: [\n                                    KeepAliveWrapper(child: child),\n                                    ...tabs\n                                        .skip(1)\n                                        .map(\n                                          (e) => UpowerRankPage(\n                                            upMid: _upMid,\n                                            tag: _tag,\n                                            privilegeType: e.privilegeType,\n                                          ),\n                                        ),\n                                  ],\n                                ),\n                              ),\n                            ],\n                          );\n                        },\n                      ),\n                    )\n                  : child;\n            },\n          ),\n        ).constraintWidth(),\n      );\n    } else {\n      return child;\n    }\n  }\n\n  Widget _buildBody(\n    ThemeData theme,\n    LoadingState<List<UpowerRankInfo>?> loadingState,\n  ) {\n    late final width = MediaQuery.textScalerOf(context).scale(32);\n    return switch (loadingState) {\n      Loading() => linearLoading,\n      Success<List<UpowerRankInfo>?>(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverList.builder(\n                itemCount: response.length,\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    _controller.onLoadMore();\n                  }\n                  final item = response[index];\n                  return Material(\n                    type: MaterialType.transparency,\n                    child: ListTile(\n                      onTap: () => Get.toNamed('/member?mid=${item.mid}'),\n                      leading: SizedBox(\n                        width: width,\n                        child: Center(\n                          child: Text(\n                            (index + 1).toString(),\n                            style: TextStyle(\n                              fontSize: 16,\n                              fontStyle: FontStyle.italic,\n                              fontWeight: FontWeight.bold,\n                              color: switch (index) {\n                                0 => const Color(0xFFfdad13),\n                                1 => const Color(0xFF8aace1),\n                                2 => const Color(0xFFdfa777),\n                                _ => theme.colorScheme.outline,\n                              },\n                            ),\n                          ),\n                        ),\n                      ),\n                      title: Row(\n                        spacing: 12,\n                        children: [\n                          NetworkImgLayer(\n                            width: 38,\n                            height: 38,\n                            src: item.avatar,\n                            type: ImageType.avatar,\n                          ),\n                          Text(\n                            item.nickname!,\n                            style: const TextStyle(fontSize: 14),\n                          ),\n                        ],\n                      ),\n                      trailing: Text.rich(\n                        TextSpan(\n                          children: [\n                            TextSpan(\n                              text: item.day!.toString(),\n                              style: const TextStyle(\n                                fontSize: 14,\n                                fontWeight: FontWeight.bold,\n                              ),\n                            ),\n                            const TextSpan(\n                              text: ' 天',\n                              style: TextStyle(fontSize: 13),\n                            ),\n                          ],\n                        ),\n                      ),\n                    ),\n                  );\n                },\n              )\n            : HttpError(onReload: _controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n\n  @override\n  bool get wantKeepAlive => widget.privilegeType != null;\n}\n"
  },
  {
    "path": "lib/pages/member_video/controller.dart",
    "content": "import 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/member.dart';\nimport 'package:PiliPlus/http/search.dart';\nimport 'package:PiliPlus/models/common/member/contribute_type.dart';\nimport 'package:PiliPlus/models/common/video/source_type.dart';\nimport 'package:PiliPlus/models_new/space/space_archive/data.dart';\nimport 'package:PiliPlus/models_new/space/space_archive/episodic_button.dart';\nimport 'package:PiliPlus/models_new/space/space_archive/item.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:get/get.dart';\n\nclass MemberVideoCtr\n    extends CommonListController<SpaceArchiveData, SpaceArchiveItem>\n    with ReloadMixin {\n  MemberVideoCtr({\n    required this.type,\n    required this.mid,\n    required this.seasonId,\n    required this.seriesId,\n    this.username,\n    this.title,\n  });\n\n  ContributeType type;\n  int? seasonId;\n  int? seriesId;\n  final int mid;\n  late RxString order = 'pubdate'.obs;\n  late RxString sort = 'desc'.obs;\n  RxInt count = (-1).obs;\n  int? next;\n  Rx<EpisodicButton> episodicButton = EpisodicButton().obs;\n  final String? username;\n  final String? title;\n\n  String? firstAid;\n  String? lastAid;\n  String? fromViewAid;\n  RxBool isLocating = false.obs;\n  bool isLoadPrevious = false;\n  bool? hasPrev;\n\n  @override\n  Future<void> onRefresh() async {\n    if (isLocating.value) {\n      if (hasPrev == true) {\n        isLoadPrevious = true;\n        await queryData();\n      }\n    } else {\n      isLoadPrevious = false;\n      firstAid = null;\n      lastAid = null;\n      next = null;\n      isEnd = false;\n      page = 0;\n      await queryData();\n    }\n  }\n\n  @override\n  void onInit() {\n    super.onInit();\n    if (type == ContributeType.video) {\n      fromViewAid = Get.parameters['from_view_aid'];\n    }\n    page = 0;\n    queryData();\n  }\n\n  @override\n  bool customHandleResponse(\n    bool isRefresh,\n    Success<SpaceArchiveData> response,\n  ) {\n    final data = response.response;\n    episodicButton\n      ..value = data.episodicButton ?? EpisodicButton()\n      ..refresh();\n    next = data.next;\n    if (page == 0 || isLoadPrevious) {\n      hasPrev = data.hasPrev;\n    }\n    if (page == 0 || !isLoadPrevious) {\n      if ((type == ContributeType.video\n              ? data.hasNext == false\n              : data.next == 0) ||\n          data.item.isNullOrEmpty) {\n        isEnd = true;\n      }\n    }\n    count.value = type == ContributeType.season\n        ? (data.item?.length ?? -1)\n        : (data.count ?? -1);\n    if (page != 0) {\n      if (loadingState.value case Success(:final response)) {\n        data.item ??= <SpaceArchiveItem>[];\n        if (isLoadPrevious) {\n          data.item!.addAll(response!);\n        } else {\n          data.item!.insertAll(0, response!);\n        }\n      }\n    }\n    firstAid = data.item?.firstOrNull?.param;\n    lastAid = data.item?.lastOrNull?.param;\n    isLoadPrevious = false;\n    loadingState.value = Success(data.item);\n    return true;\n  }\n\n  @override\n  Future<LoadingState<SpaceArchiveData>> customGetData() =>\n      MemberHttp.spaceArchive(\n        type: type,\n        mid: mid,\n        aid: type == ContributeType.video\n            ? isLoadPrevious\n                  ? firstAid\n                  : lastAid\n            : null,\n        order: type == ContributeType.video ? order.value : null,\n        sort: type == ContributeType.video\n            ? isLoadPrevious\n                  ? 'asc'\n                  : null\n            : sort.value,\n        pn: type == ContributeType.charging ? page : null,\n        next: next,\n        seasonId: seasonId,\n        seriesId: seriesId,\n        includeCursor: isLocating.value && page == 0,\n      );\n\n  void queryBySort() {\n    if (isLoading) return;\n    if (type == ContributeType.video) {\n      isLocating.value = false;\n      order.value = order.value == 'pubdate' ? 'click' : 'pubdate';\n    } else {\n      sort.value = sort.value == 'desc' ? 'asc' : 'desc';\n    }\n    onReload();\n  }\n\n  Future<void> toViewPlayAll() async {\n    final episodicButton = this.episodicButton.value;\n    if (episodicButton.text == '继续播放' &&\n        episodicButton.uri?.isNotEmpty == true) {\n      final params = Uri.parse(episodicButton.uri!).queryParameters;\n      String? oid = params['oid'];\n      if (oid != null) {\n        final bvid = IdUtils.av2bv(int.parse(oid));\n        final cid = await SearchHttp.ab2c(aid: oid, bvid: bvid);\n        if (cid != null) {\n          PageUtils.toVideoPage(\n            aid: int.parse(oid),\n            bvid: bvid,\n            cid: cid,\n            extraArguments: {\n              'sourceType': SourceType.archive,\n              'mediaId': seasonId ?? seriesId ?? mid,\n              'oid': oid,\n              'favTitle':\n                  '$username: ${title ?? episodicButton.text ?? '播放全部'}',\n              if (seriesId == null) 'count': count.value,\n              if (seasonId != null || seriesId != null)\n                'mediaType': params['page_type'],\n              'desc': params['desc'] == '1',\n              'sortField': params['sort_field'],\n              'isContinuePlaying': true,\n            },\n          );\n        }\n      }\n      return;\n    }\n\n    if (loadingState.value case Success(:final response)) {\n      if (response == null || response.isEmpty) return;\n\n      for (SpaceArchiveItem element in response) {\n        if (element.cid == null) {\n          continue;\n        } else {\n          bool desc = seasonId != null ? false : true;\n          desc =\n              (seasonId != null || seriesId != null) &&\n                  (type == ContributeType.video\n                      ? order.value == 'click'\n                      : sort.value == 'asc')\n              ? !desc\n              : desc;\n          PageUtils.toVideoPage(\n            bvid: element.bvid,\n            cid: element.cid!,\n            cover: element.cover,\n            title: element.title,\n            extraArguments: {\n              'sourceType': SourceType.archive,\n              'mediaId': seasonId ?? seriesId ?? mid,\n              'oid': IdUtils.bv2av(element.bvid!),\n              'favTitle':\n                  '$username: ${title ?? episodicButton.text ?? '播放全部'}',\n              if (seriesId == null) 'count': count.value,\n              if (seasonId != null || seriesId != null)\n                'mediaType': Uri.parse(\n                  episodicButton.uri!,\n                ).queryParameters['page_type'],\n              'desc': desc,\n              if (type == ContributeType.video)\n                'sortField': order.value == 'click' ? 2 : 1,\n            },\n          );\n          break;\n        }\n      }\n    }\n  }\n\n  @override\n  Future<void> onReload() {\n    reload = true;\n    isLocating.value = false;\n    return super.onReload();\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_video/view.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/common/widgets/sliver/sliver_floating_header.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/member/contribute_type.dart';\nimport 'package:PiliPlus/models_new/space/space_archive/item.dart';\nimport 'package:PiliPlus/pages/member/controller.dart';\nimport 'package:PiliPlus/pages/member_video/controller.dart';\nimport 'package:PiliPlus/pages/member_video/widgets/video_card_h_member_video.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:flutter/scheduler.dart';\nimport 'package:get/get.dart';\n\nclass MemberVideo extends StatefulWidget {\n  const MemberVideo({\n    super.key,\n    required this.type,\n    required this.heroTag,\n    required this.mid,\n    this.seasonId,\n    this.seriesId,\n    this.title,\n    this.isSingle = false,\n  });\n\n  final ContributeType type;\n  final String? heroTag;\n  final int mid;\n  final int? seasonId;\n  final int? seriesId;\n  final String? title;\n  final bool isSingle;\n\n  @override\n  State<MemberVideo> createState() => _MemberVideoState();\n}\n\nclass _MemberVideoState extends State<MemberVideo>\n    with AutomaticKeepAliveClientMixin, GridMixin {\n  @override\n  bool get wantKeepAlive => true;\n\n  late final MemberVideoCtr _controller;\n\n  int? _index;\n  late ExtendedNestedScrollController _scrollController;\n\n  void _jumpToIndex(int index) {\n    final scrollOffset = gridDelegate.layoutCache!\n        .getGeometryForChildIndex(index)\n        .scrollOffset;\n    try {\n      _scrollController.nestedPositions\n          .elementAt(_index!)\n          .localJumpTo(scrollOffset);\n    } catch (e) {\n      _scrollController.jumpTo(scrollOffset);\n      if (kDebugMode) debugPrint('jump error: $e');\n    }\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = Get.put(\n      MemberVideoCtr(\n        type: widget.type,\n        mid: widget.mid,\n        seasonId: widget.seasonId,\n        seriesId: widget.seriesId,\n        username: Get.find<MemberController>(tag: widget.heroTag).username,\n        title: widget.title,\n      ),\n      tag:\n          '${widget.heroTag}${widget.type.name}${widget.seasonId}${widget.seriesId}',\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final theme = Theme.of(context);\n    final padding = MediaQuery.viewPaddingOf(context);\n    final child = refreshIndicator(\n      onRefresh: () async {\n        final count = _controller.loadingState.value.dataOrNull?.length;\n        await _controller.onRefresh();\n        if (_controller.isLocating.value && mounted) {\n          final newCount = _controller.loadingState.value.dataOrNull?.length;\n          if (count != null && newCount != null && newCount > count) {\n            SchedulerBinding.instance.addPostFrameCallback((_) {\n              _jumpToIndex(newCount - count);\n            });\n          }\n        }\n      },\n      child: CustomScrollView(\n        physics: ReloadScrollPhysics(controller: _controller),\n        slivers: [\n          SliverPadding(\n            padding: EdgeInsets.only(bottom: padding.bottom + 100),\n            sliver: Obx(\n              () => _buildBody(theme, _controller.loadingState.value),\n            ),\n          ),\n        ],\n      ),\n    );\n    if (widget.type == ContributeType.video &&\n        _controller.fromViewAid?.isNotEmpty == true) {\n      if (_index == null) {\n        _scrollController =\n            PrimaryScrollController.of(this.context)\n                as ExtendedNestedScrollController;\n        _index = _scrollController.nestedPositions.length;\n      }\n      return Stack(\n        clipBehavior: Clip.none,\n        children: [\n          child,\n          Obx(\n            () => !_controller.isLocating.value\n                ? Positioned(\n                    right: kFloatingActionButtonMargin,\n                    bottom: kFloatingActionButtonMargin + padding.bottom,\n                    child: FloatingActionButton.extended(\n                      onPressed: () {\n                        final fromViewAid = _controller.fromViewAid;\n                        _controller.isLocating.value = true;\n                        final locatedIndex =\n                            _controller.loadingState.value.dataOrNull\n                                ?.indexWhere((i) => i.param == fromViewAid) ??\n                            -1;\n                        if (locatedIndex == -1) {\n                          _controller\n                            ..lastAid = fromViewAid\n                            ..reload = true\n                            ..page = 0\n                            ..loadingState.value = LoadingState.loading()\n                            ..queryData();\n                        } else {\n                          _jumpToIndex(locatedIndex);\n                        }\n                      },\n                      label: const Text('定位至上次观看'),\n                    ),\n                  )\n                : const SizedBox.shrink(),\n          ),\n        ],\n      );\n    }\n    return child;\n  }\n\n  @override\n  Widget get gridSkeleton => SliverPadding(\n    padding: widget.isSingle ? const EdgeInsets.only(top: 7) : EdgeInsets.zero,\n    sliver: super.gridSkeleton,\n  );\n\n  Widget _buildBody(\n    ThemeData theme,\n    LoadingState<List<SpaceArchiveItem>?> loadingState,\n  ) {\n    return switch (loadingState) {\n      Loading() => gridSkeleton,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverMainAxisGroup(\n                slivers: [\n                  SliverFloatingHeaderWidget(\n                    backgroundColor: theme.colorScheme.surface,\n                    child: Padding(\n                      padding: const EdgeInsets.fromLTRB(14, 2.5, 8, 2.5),\n                      child: Row(\n                        children: [\n                          Obx(\n                            () {\n                              final count = _controller.count.value;\n                              return Text(\n                                count != -1 ? '共$count视频' : '',\n                                style: const TextStyle(fontSize: 13),\n                              );\n                            },\n                          ),\n                          Obx(\n                            () {\n                              final episodicButton =\n                                  _controller.episodicButton.value;\n                              return episodicButton.uri?.isNotEmpty == true\n                                  ? Padding(\n                                      padding: EdgeInsets.only(\n                                        left: _controller.count.value != -1\n                                            ? 6\n                                            : 0,\n                                      ),\n                                      child: TextButton.icon(\n                                        style: StyleString.buttonStyle,\n                                        onPressed: _controller.toViewPlayAll,\n                                        icon: Icon(\n                                          Icons.play_circle_outline_rounded,\n                                          size: 16,\n                                          color: theme.colorScheme.secondary,\n                                        ),\n                                        label: Text(\n                                          episodicButton.text ?? '播放全部',\n                                          style: TextStyle(\n                                            fontSize: 13,\n                                            color: theme.colorScheme.secondary,\n                                          ),\n                                        ),\n                                      ),\n                                    )\n                                  : const SizedBox.shrink();\n                            },\n                          ),\n                          const Spacer(),\n                          TextButton.icon(\n                            style: StyleString.buttonStyle,\n                            onPressed: _controller.queryBySort,\n                            icon: Icon(\n                              Icons.sort,\n                              size: 16,\n                              color: theme.colorScheme.secondary,\n                            ),\n                            label: Obx(\n                              () => Text(\n                                widget.type == ContributeType.video\n                                    ? _controller.order.value == 'pubdate'\n                                          ? '最新发布'\n                                          : '最多播放'\n                                    : _controller.sort.value == 'desc'\n                                    ? '默认'\n                                    : '倒序',\n                                style: TextStyle(\n                                  fontSize: 13,\n                                  color: theme.colorScheme.secondary,\n                                ),\n                              ),\n                            ),\n                          ),\n                        ],\n                      ),\n                    ),\n                  ),\n                  SliverGrid.builder(\n                    gridDelegate: gridDelegate,\n                    itemBuilder: (context, index) {\n                      if (widget.type != ContributeType.season &&\n                          index == response.length - 1) {\n                        _controller.onLoadMore();\n                      }\n                      return VideoCardHMemberVideo(\n                        videoItem: response[index],\n                        fromViewAid: _controller.fromViewAid,\n                      );\n                    },\n                    itemCount: response.length,\n                  ),\n                ],\n              )\n            : HttpError(onReload: _controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/member_video/widgets/video_card_h_member_video.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/progress_bar/video_progress_indicator.dart';\nimport 'package:PiliPlus/common/widgets/stat/stat.dart';\nimport 'package:PiliPlus/common/widgets/video_popup_menu.dart';\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models/common/stat_type.dart';\nimport 'package:PiliPlus/models_new/space/space_archive/item.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/duration_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\n\n// 视频卡片 - 水平布局\nclass VideoCardHMemberVideo extends StatelessWidget {\n  const VideoCardHMemberVideo({\n    super.key,\n    required this.videoItem,\n    this.onTap,\n    this.bvid,\n    this.fromViewAid,\n  });\n  final SpaceArchiveItem videoItem;\n  final VoidCallback? onTap;\n  final dynamic bvid;\n  final String? fromViewAid;\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    void onLongPress() => imageSaveDialog(\n      title: videoItem.title,\n      cover: videoItem.cover,\n      bvid: videoItem.bvid,\n    );\n    return Material(\n      type: MaterialType.transparency,\n      child: Stack(\n        clipBehavior: Clip.none,\n        children: [\n          InkWell(\n            onLongPress: onLongPress,\n            onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n            onTap:\n                onTap ??\n                () {\n                  final isPgc = videoItem.isPgc == true;\n                  final isPugv = videoItem.isPugv == true;\n                  if ((isPgc || isPugv) && videoItem.uri?.isNotEmpty == true) {\n                    if (PageUtils.viewPgcFromUri(\n                      videoItem.uri!,\n                      isPgc: isPgc,\n                    )) {\n                      return;\n                    }\n                  }\n                  if (videoItem.bvid == null || videoItem.cid == null) {\n                    return;\n                  }\n                  try {\n                    PageUtils.toVideoPage(\n                      bvid: videoItem.bvid,\n                      cid: videoItem.cid!,\n                      cover: videoItem.cover,\n                      title: videoItem.title,\n                    );\n                  } catch (err) {\n                    SmartDialog.showToast(err.toString());\n                  }\n                },\n            child: Padding(\n              padding: const EdgeInsets.symmetric(\n                horizontal: StyleString.safeSpace,\n                vertical: 5,\n              ),\n              child: Row(\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  AspectRatio(\n                    aspectRatio: StyleString.aspectRatio,\n                    child: LayoutBuilder(\n                      builder: (context, boxConstraints) {\n                        final double maxWidth = boxConstraints.maxWidth;\n                        final double maxHeight = boxConstraints.maxHeight;\n                        return Stack(\n                          clipBehavior: Clip.none,\n                          children: [\n                            NetworkImgLayer(\n                              src: videoItem.cover,\n                              width: maxWidth,\n                              height: maxHeight,\n                            ),\n                            if (fromViewAid == videoItem.param)\n                              const Positioned.fill(\n                                child: DecoratedBox(\n                                  decoration: BoxDecoration(\n                                    borderRadius: StyleString.mdRadius,\n                                    color: Colors.black54,\n                                  ),\n                                  child: Center(\n                                    child: Text(\n                                      '上次观看',\n                                      style: TextStyle(\n                                        color: Colors.white,\n                                        fontSize: 15,\n                                        letterSpacing: 5,\n                                      ),\n                                    ),\n                                  ),\n                                ),\n                              ),\n                            if (videoItem.badges?.isNotEmpty == true)\n                              PBadge(\n                                text: videoItem.badges!\n                                    .map((item) => item.text)\n                                    .join('|'),\n                                right: 6.0,\n                                top: 6.0,\n                                type: videoItem.badges!.first.text == '充电专属'\n                                    ? PBadgeType.error\n                                    : PBadgeType.primary,\n                              ),\n                            if (videoItem.history != null) ...[\n                              Builder(\n                                builder: (context) {\n                                  try {\n                                    return Positioned(\n                                      left: 0,\n                                      right: 0,\n                                      bottom: 0,\n                                      child: VideoProgressIndicator(\n                                        color: theme.colorScheme.primary,\n                                        backgroundColor: theme\n                                            .colorScheme\n                                            .secondaryContainer,\n                                        progress:\n                                            videoItem.history!.progress! /\n                                            videoItem.history!.duration!,\n                                      ),\n                                    );\n                                  } catch (_) {\n                                    return const SizedBox.shrink();\n                                  }\n                                },\n                              ),\n                              Builder(\n                                builder: (context) {\n                                  try {\n                                    return PBadge(\n                                      text:\n                                          videoItem.history!.progress ==\n                                              videoItem.history!.duration\n                                          ? '已看完'\n                                          : '${DurationUtils.formatDuration(videoItem.history!.progress)}/${DurationUtils.formatDuration(videoItem.history!.duration)}',\n                                      right: 6.0,\n                                      bottom: 6.0,\n                                      type: PBadgeType.gray,\n                                    );\n                                  } catch (_) {\n                                    return PBadge(\n                                      text: DurationUtils.formatDuration(\n                                        videoItem.duration,\n                                      ),\n                                      right: 6.0,\n                                      bottom: 6.0,\n                                      type: PBadgeType.gray,\n                                    );\n                                  }\n                                },\n                              ),\n                            ] else if (videoItem.duration > 0)\n                              PBadge(\n                                text: DurationUtils.formatDuration(\n                                  videoItem.duration,\n                                ),\n                                right: 6.0,\n                                bottom: 6.0,\n                                type: PBadgeType.gray,\n                              ),\n                          ],\n                        );\n                      },\n                    ),\n                  ),\n                  const SizedBox(width: 10),\n                  content(context, theme),\n                ],\n              ),\n            ),\n          ),\n          Positioned(\n            bottom: 0,\n            right: 12,\n            width: 29,\n            height: 29,\n            child: VideoPopupMenu(\n              iconSize: 17,\n              videoItem: videoItem,\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget content(BuildContext context, ThemeData theme) {\n    final isCurr =\n        fromViewAid == videoItem.param ||\n        (videoItem.bvid != null && videoItem.bvid == bvid);\n    return Expanded(\n      child: Column(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          Expanded(\n            child: Text(\n              videoItem.title,\n              textAlign: TextAlign.start,\n              style: TextStyle(\n                fontWeight: isCurr ? FontWeight.bold : null,\n                fontSize: theme.textTheme.bodyMedium!.fontSize,\n                height: 1.42,\n                letterSpacing: 0.3,\n                color: isCurr ? theme.colorScheme.primary : null,\n              ),\n              maxLines: 2,\n              overflow: TextOverflow.ellipsis,\n            ),\n          ),\n          Text(\n            videoItem.season != null\n                ? DateFormatUtils.dateFormat(videoItem.season!.mtime)\n                : videoItem.publishTimeText ?? '',\n            maxLines: 1,\n            style: TextStyle(\n              fontSize: 12,\n              height: 1,\n              color: theme.colorScheme.outline,\n              overflow: TextOverflow.clip,\n            ),\n          ),\n          const SizedBox(height: 3),\n          Row(\n            spacing: 8,\n            children: [\n              StatWidget(\n                type: StatType.play,\n                value: videoItem.stat.view,\n              ),\n              StatWidget(\n                type: StatType.danmaku,\n                value: videoItem.stat.danmu,\n              ),\n            ],\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/mine/controller.dart",
    "content": "import 'package:PiliPlus/http/fav.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/user.dart';\nimport 'package:PiliPlus/models/common/account_type.dart';\nimport 'package:PiliPlus/models/common/theme/theme_type.dart';\nimport 'package:PiliPlus/models/user/info.dart';\nimport 'package:PiliPlus/models/user/stat.dart';\nimport 'package:PiliPlus/models_new/fav/fav_folder/data.dart';\nimport 'package:PiliPlus/pages/common/common_data_controller.dart';\nimport 'package:PiliPlus/services/account_service.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/accounts/account.dart';\nimport 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';\nimport 'package:PiliPlus/utils/login_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\n\nclass MineController extends CommonDataController<FavFolderData, FavFolderData>\n    with AccountMixin {\n  @override\n  AccountService accountService = Get.find<AccountService>();\n\n  int? favFolderCount;\n\n  // 用户信息 头像、昵称、lv\n  final Rx<UserInfoData> userInfo = UserInfoData().obs;\n  // 用户状态 动态、关注、粉丝\n  final Rx<UserStat> userStat = const UserStat().obs;\n\n  Rx<ThemeType> themeType = Pref.themeType.obs;\n\n  ThemeType get nextThemeType =>\n      ThemeType.values[(themeType.value.index + 1) % ThemeType.values.length];\n\n  static RxBool anonymity =\n      (Accounts.account.isNotEmpty && !Accounts.heartbeat.isLogin).obs;\n\n  late final list =\n      <({IconData icon, double size, String title, VoidCallback onTap})>[\n        (\n          size: 23,\n          icon: MdiIcons.folderDownloadOutline,\n          title: '离线缓存',\n          onTap: () => Get.toNamed('/download'),\n        ),\n        (\n          size: 23,\n          icon: Icons.history,\n          title: '观看记录',\n          onTap: () {\n            if (isLogin) {\n              Get.toNamed('/history');\n            }\n          },\n        ),\n        (\n          size: 20,\n          icon: Icons.subscriptions_outlined,\n          title: '我的订阅',\n          onTap: () {\n            if (isLogin) {\n              Get.toNamed('/subscription');\n            }\n          },\n        ),\n        (\n          size: 22,\n          icon: Icons.watch_later_outlined,\n          title: '稍后再看',\n          onTap: () {\n            if (isLogin) {\n              Get.toNamed('/later');\n            }\n          },\n        ),\n      ];\n\n  @override\n  void onInit() {\n    super.onInit();\n    UserInfoData? userInfoCache = Pref.userInfoCache;\n    if (userInfoCache != null) {\n      userInfo.value = userInfoCache;\n      queryData();\n      queryUserInfo();\n    }\n  }\n\n  bool get isLogin {\n    if (!accountService.isLogin.value) {\n      // SmartDialog.showToast('账号未登录');\n      return false;\n    }\n    return true;\n  }\n\n  Future<void> queryUserInfo() async {\n    final res = await UserHttp.userInfo();\n    if (res case Success(:final response)) {\n      if (response.isLogin == true) {\n        userInfo.value = response;\n        if (response != Pref.userInfoCache) {\n          GStorage.userInfo.put('userInfoCache', response);\n        }\n        accountService\n          ..face.value = response.face!\n          ..isLogin.value = true;\n      } else {\n        LoginUtils.onLogoutMain();\n        return;\n      }\n    } else {\n      final errMsg = res.toString();\n      SmartDialog.showToast(errMsg);\n      if (errMsg == '账号未登录') {\n        LoginUtils.onLogoutMain();\n        return;\n      }\n    }\n    queryUserStatOwner();\n  }\n\n  Future<void> queryUserStatOwner() async {\n    final res = await UserHttp.userStatOwner();\n    if (res case Success(:final response)) {\n      userStat.value = response;\n    }\n  }\n\n  @override\n  bool customHandleResponse(bool isRefresh, Success<FavFolderData> response) {\n    favFolderCount = response.response.count;\n    loadingState.value = response;\n    return true;\n  }\n\n  @override\n  Future<LoadingState<FavFolderData>> customGetData() {\n    return FavHttp.userfavFolder(\n      pn: 1,\n      ps: 20,\n      mid: Accounts.main.mid,\n    );\n  }\n\n  static void onChangeAnonymity() {\n    if (Accounts.account.isEmpty) {\n      SmartDialog.showToast('请先登录');\n      return;\n    }\n    final newVal = !anonymity.value;\n    anonymity.value = newVal;\n    if (newVal) {\n      SmartDialog.dismiss();\n      SmartDialog.show<bool>(\n        clickMaskDismiss: false,\n        usePenetrate: true,\n        displayTime: const Duration(seconds: 2),\n        alignment: Alignment.bottomCenter,\n        builder: (context) {\n          final theme = Theme.of(context);\n          final style = TextStyle(\n            color: theme.colorScheme.onSecondaryContainer,\n          );\n          return ColoredBox(\n            color: theme.colorScheme.secondaryContainer,\n            child: Padding(\n              padding: EdgeInsets.only(\n                top: 15,\n                left: 20,\n                right: 20,\n                bottom: MediaQuery.viewPaddingOf(context).bottom + 15,\n              ),\n              child: Column(\n                mainAxisSize: MainAxisSize.min,\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: <Widget>[\n                  Row(\n                    children: <Widget>[\n                      const Icon(MdiIcons.incognito, size: 20),\n                      const SizedBox(width: 10),\n                      Text('已进入无痕模式', style: theme.textTheme.titleMedium),\n                    ],\n                  ),\n                  const SizedBox(height: 10),\n                  Text(\n                    '搜索、观看视频/直播不携带身份信息（包含大会员）\\n'\n                    '不产生查询或播放记录\\n'\n                    '点赞等其它操作不受影响\\n'\n                    '(前往隐私设置了解详情)',\n                    style: theme.textTheme.bodySmall,\n                  ),\n                  Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n                    children: [\n                      TextButton(\n                        onPressed: () {\n                          SmartDialog.dismiss(result: true);\n                          SmartDialog.showToast('已设为永久无痕模式');\n                        },\n                        child: Text('保存为永久', style: style),\n                      ),\n                      const SizedBox(width: 10),\n                      TextButton(\n                        onPressed: () {\n                          SmartDialog.dismiss();\n                          SmartDialog.showToast('已设为临时无痕模式');\n                        },\n                        child: Text('仅本次（默认）', style: style),\n                      ),\n                    ],\n                  ),\n                ],\n              ),\n            ),\n          );\n        },\n      ).then((res) {\n        if (res == false) {\n          return;\n        }\n        res == true\n            ? Accounts.set(AccountType.heartbeat, AnonymousAccount())\n            : Accounts.accountMode[AccountType.heartbeat.index] =\n                  AnonymousAccount();\n      });\n    } else {\n      Accounts.set(AccountType.heartbeat, Accounts.main);\n      SmartDialog.dismiss(result: false);\n      SmartDialog.show(\n        clickMaskDismiss: false,\n        usePenetrate: true,\n        displayTime: const Duration(seconds: 1),\n        alignment: Alignment.bottomCenter,\n        builder: (context) {\n          final theme = Theme.of(context);\n          return ColoredBox(\n            color: theme.colorScheme.secondaryContainer,\n            child: Padding(\n              padding: EdgeInsets.only(\n                top: 15,\n                left: 20,\n                right: 20,\n                bottom: MediaQuery.viewPaddingOf(context).bottom + 15,\n              ),\n              child: Row(\n                children: [\n                  const Icon(MdiIcons.incognitoOff, size: 20),\n                  const SizedBox(width: 10),\n                  Text('已退出无痕模式', style: theme.textTheme.titleMedium),\n                ],\n              ),\n            ),\n          );\n        },\n      );\n    }\n  }\n\n  void onChangeTheme() {\n    final newVal = nextThemeType;\n    themeType.value = newVal;\n    GStorage.setting.put(SettingBoxKey.themeMode, newVal.index);\n    Get.changeThemeMode(newVal.toThemeMode);\n  }\n\n  void push(String name) {\n    late final mid = userInfo.value.mid;\n    if (isLogin && mid != null) {\n      Get.toNamed('/$name?mid=$mid');\n    }\n  }\n\n  void onLogin([bool longPress = false]) {\n    if (!accountService.isLogin.value || longPress) {\n      Get.toNamed('/loginPage');\n    } else {\n      Get.toNamed('/member?mid=${userInfo.value.mid}');\n    }\n  }\n\n  @override\n  Future<void> onRefresh({bool isManual = true}) {\n    if (!accountService.isLogin.value) {\n      return Future.syncValue(null);\n    }\n    queryUserInfo();\n    return super.onRefresh().whenComplete(() {\n      if (isManual) {\n        scrollController.jumpToTop();\n      }\n    });\n  }\n\n  @override\n  void onChangeAccount(bool isLogin) {\n    if (isLogin) {\n      onRefresh();\n    } else {\n      userInfo.value = UserInfoData();\n      userStat.value = const UserStat();\n      loadingState.value = LoadingState.loading();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/mine/view.dart",
    "content": "import 'dart:async';\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/flutter/list_tile.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/nav_bar_config.dart';\nimport 'package:PiliPlus/models_new/fav/fav_folder/list.dart';\nimport 'package:PiliPlus/pages/common/common_page.dart';\nimport 'package:PiliPlus/pages/home/view.dart';\nimport 'package:PiliPlus/pages/login/controller.dart';\nimport 'package:PiliPlus/pages/main/controller.dart';\nimport 'package:PiliPlus/pages/mine/controller.dart';\nimport 'package:PiliPlus/pages/mine/widgets/item.dart';\nimport 'package:PiliPlus/utils/extension/get_ext.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart' hide ListTile;\nimport 'package:get/get.dart';\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\n\nclass MinePage extends StatefulWidget {\n  const MinePage({super.key, this.showBackBtn = false});\n\n  final bool showBackBtn;\n\n  @override\n  State<MinePage> createState() => _MediaPageState();\n}\n\nclass _MediaPageState extends CommonPageState<MinePage>\n    with AutomaticKeepAliveClientMixin {\n  final MineController controller = Get.putOrFind(MineController.new);\n  late final MainController _mainController = Get.find<MainController>();\n\n  @override\n  bool get wantKeepAlive => true;\n\n  bool get checkPage =>\n      _mainController.navigationBars[0] != NavigationBarType.mine &&\n      _mainController.selectedIndex.value == 0;\n\n  @override\n  bool onNotificationType1(UserScrollNotification notification) {\n    if (checkPage) {\n      return false;\n    }\n    return super.onNotificationType1(notification);\n  }\n\n  @override\n  bool onNotificationType2(ScrollNotification notification) {\n    if (checkPage) {\n      return false;\n    }\n    return super.onNotificationType2(notification);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final theme = Theme.of(context);\n    final secondary = theme.colorScheme.secondary;\n    return Column(\n      children: [\n        Padding(\n          padding: const .symmetric(vertical: 10),\n          child: _buildHeaderActions,\n        ),\n        Expanded(\n          child: Material(\n            type: .transparency,\n            child: refreshIndicator(\n              onRefresh: controller.onRefresh,\n              child: onBuild(\n                ListView(\n                  padding: const .only(bottom: 100),\n                  physics: const AlwaysScrollableScrollPhysics(),\n                  children: [\n                    _buildUserInfo(theme, secondary),\n                    _buildActions(secondary),\n                    Obx(\n                      () => controller.loadingState.value is Loading\n                          ? const SizedBox.shrink()\n                          : _buildFav(theme, secondary),\n                    ),\n                  ],\n                ),\n              ),\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n\n  Widget _buildActions(Color primary) {\n    return Row(\n      mainAxisAlignment: .spaceEvenly,\n      children: controller.list\n          .map(\n            (e) => Flexible(\n              child: InkWell(\n                onTap: e.onTap,\n                borderRadius: StyleString.mdRadius,\n                child: ConstrainedBox(\n                  constraints: const BoxConstraints(maxWidth: 80),\n                  child: AspectRatio(\n                    aspectRatio: 1,\n                    child: Column(\n                      spacing: 6,\n                      mainAxisSize: .min,\n                      mainAxisAlignment: .center,\n                      children: [\n                        Icon(size: e.size, e.icon, color: primary),\n                        Text(\n                          e.title,\n                          style: const TextStyle(fontSize: 13),\n                        ),\n                      ],\n                    ),\n                  ),\n                ),\n              ),\n            ),\n          )\n          .toList(),\n    );\n  }\n\n  Widget get _buildHeaderActions {\n    const iconSize = 22.0;\n    const padding = EdgeInsets.all(8);\n    const style = ButtonStyle(tapTargetSize: .shrinkWrap);\n    return Row(\n      spacing: 5,\n      mainAxisAlignment: .end,\n      children: [\n        if (widget.showBackBtn)\n          const Expanded(\n            child: Align(\n              alignment: Alignment.centerLeft,\n              child: Padding(\n                padding: EdgeInsets.only(left: 8),\n                child: BackButton(),\n              ),\n            ),\n          ),\n        if (!_mainController.hasHome) ...[\n          IconButton(\n            iconSize: iconSize,\n            padding: padding,\n            style: style,\n            tooltip: '搜索',\n            onPressed: () => Get.toNamed('/search'),\n            icon: const Icon(Icons.search),\n          ),\n          msgBadge(_mainController),\n        ],\n        if (GStorage.reply != null)\n          IconButton(\n            iconSize: iconSize,\n            padding: padding,\n            style: style,\n            tooltip: '评论记录',\n            onPressed: () => Get.toNamed('/myReply'),\n            icon: const Icon(Icons.message_outlined),\n          ),\n        Obx(\n          () {\n            final anonymity = MineController.anonymity.value;\n            return IconButton(\n              iconSize: iconSize,\n              padding: padding,\n              style: style,\n              tooltip: \"${anonymity ? '退出' : '进入'}无痕模式\",\n              onPressed: MineController.onChangeAnonymity,\n              icon: anonymity\n                  ? const Icon(MdiIcons.incognito)\n                  : const Icon(MdiIcons.incognitoOff),\n            );\n          },\n        ),\n        IconButton(\n          iconSize: iconSize,\n          padding: padding,\n          style: style,\n          tooltip: '设置账号模式',\n          onPressed: () => LoginPageController.switchAccountDialog(context),\n          icon: const Icon(Icons.switch_account_outlined),\n        ),\n        Obx(\n          () {\n            return IconButton(\n              iconSize: iconSize,\n              padding: padding,\n              style: style,\n              tooltip: '切换至${controller.nextThemeType.desc}主题',\n              onPressed: controller.onChangeTheme,\n              icon: controller.themeType.value.icon,\n            );\n          },\n        ),\n        IconButton(\n          iconSize: iconSize,\n          padding: padding,\n          style: style,\n          tooltip: '设置',\n          onPressed: () => Get.toNamed('/setting', preventDuplicates: false),\n          icon: const Icon(Icons.settings_outlined),\n        ),\n        const SizedBox(width: 16),\n      ],\n    );\n  }\n\n  Widget _buildUserInfo(ThemeData theme, Color secondary) {\n    final style = TextStyle(\n      fontSize: theme.textTheme.titleMedium!.fontSize,\n      fontWeight: FontWeight.bold,\n    );\n    final labelStyle = theme.textTheme.labelMedium!.copyWith(\n      color: theme.colorScheme.outline,\n    );\n    final coinLabelStyle = TextStyle(\n      fontSize: theme.textTheme.labelMedium!.fontSize,\n      color: theme.colorScheme.outline,\n    );\n    final coinValStyle = TextStyle(\n      fontSize: theme.textTheme.labelMedium!.fontSize,\n      fontWeight: FontWeight.bold,\n      color: secondary,\n    );\n    return Obx(() {\n      final userInfo = controller.userInfo.value;\n      final levelInfo = userInfo.levelInfo;\n      final hasLevel = levelInfo != null;\n      final isVip = userInfo.vipStatus != null && userInfo.vipStatus! > 0;\n      final userStat = controller.userStat.value;\n      return Column(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          GestureDetector(\n            behavior: .opaque,\n            onTap: controller.onLogin,\n            onLongPress: () {\n              Feedback.forLongPress(context);\n              controller.onLogin(true);\n            },\n            onSecondaryTap: PlatformUtils.isMobile\n                ? null\n                : () => controller.onLogin(true),\n            child: Row(\n              mainAxisSize: .min,\n              children: [\n                const SizedBox(width: 20),\n                userInfo.face != null\n                    ? Stack(\n                        clipBehavior: .none,\n                        children: [\n                          NetworkImgLayer(\n                            src: userInfo.face,\n                            type: .avatar,\n                            width: 55,\n                            height: 55,\n                          ),\n                          if (isVip)\n                            Positioned(\n                              right: -1,\n                              bottom: -2,\n                              child: Image.asset(\n                                'assets/images/big-vip.png',\n                                height: 19,\n                                cacheHeight: 19.cacheSize(context),\n                                semanticLabel: \"大会员\",\n                              ),\n                            ),\n                        ],\n                      )\n                    : ClipOval(\n                        child: Image.asset(\n                          width: 55,\n                          height: 55,\n                          cacheHeight: 55.cacheSize(context),\n                          'assets/images/noface.jpeg',\n                          semanticLabel: \"默认头像\",\n                        ),\n                      ),\n                const SizedBox(width: 16),\n                Expanded(\n                  child: Column(\n                    mainAxisSize: .min,\n                    mainAxisAlignment: .center,\n                    crossAxisAlignment: .start,\n                    children: [\n                      Row(\n                        spacing: 6,\n                        children: [\n                          Flexible(\n                            child: Text(\n                              userInfo.uname ?? '点击登录',\n                              style: theme.textTheme.titleMedium!.copyWith(\n                                height: 1,\n                                color: isVip && userInfo.vipType == 2\n                                    ? theme.colorScheme.vipColor\n                                    : null,\n                              ),\n                              maxLines: 1,\n                              overflow: .ellipsis,\n                            ),\n                          ),\n                          Image.asset(\n                            Utils.levelName(\n                              levelInfo?.currentLevel ?? 0,\n                              isSeniorMember: userInfo.isSeniorMember == 1,\n                            ),\n                            height: 10,\n                            cacheHeight: 10.cacheSize(context),\n                          ),\n                        ],\n                      ),\n                      const SizedBox(height: 8),\n                      Text.rich(\n                        TextSpan(\n                          children: [\n                            TextSpan(\n                              text: '硬币 ',\n                              style: coinLabelStyle,\n                            ),\n                            TextSpan(\n                              text: userInfo.money?.toString() ?? '-',\n                              style: coinValStyle,\n                            ),\n                            TextSpan(\n                              text: \"      经验 \",\n                              style: coinLabelStyle,\n                            ),\n                            TextSpan(\n                              text: levelInfo?.currentExp?.toString() ?? '-',\n                              style: coinValStyle,\n                            ),\n                            TextSpan(\n                              text: \"/${levelInfo?.nextExp ?? '-'}\",\n                              style: coinLabelStyle,\n                            ),\n                          ],\n                        ),\n                      ),\n                      const SizedBox(height: 4),\n                      ConstrainedBox(\n                        constraints: const BoxConstraints(maxWidth: 225),\n                        child: LinearProgressIndicator(\n                          minHeight: 2.25,\n                          value: hasLevel\n                              ? levelInfo.currentExp! / levelInfo.nextExp!\n                              : 0,\n                          backgroundColor: theme.colorScheme.outline.withValues(\n                            alpha: 0.4,\n                          ),\n                          valueColor: AlwaysStoppedAnimation<Color>(secondary),\n                          stopIndicatorColor: Colors.transparent,\n                        ),\n                      ),\n                    ],\n                  ),\n                ),\n                const SizedBox(width: 20),\n              ],\n            ),\n          ),\n          const SizedBox(height: 10),\n          Row(\n            mainAxisAlignment: .spaceEvenly,\n            children: [\n              _btn(\n                count: userStat.dynamicCount,\n                countStyle: style,\n                name: '动态',\n                labelStyle: labelStyle,\n                onTap: () => controller.push('memberDynamics'),\n              ),\n              _btn(\n                count: userStat.following,\n                countStyle: style,\n                name: '关注',\n                labelStyle: labelStyle,\n                onTap: () => controller.push('follow'),\n              ),\n              _btn(\n                count: userStat.follower,\n                countStyle: style,\n                name: '粉丝',\n                labelStyle: labelStyle,\n                onTap: () => controller.push('fan'),\n              ),\n            ],\n          ),\n        ],\n      );\n    });\n  }\n\n  Widget _btn({\n    required int? count,\n    required TextStyle countStyle,\n    required String name,\n    required TextStyle? labelStyle,\n    required VoidCallback onTap,\n  }) {\n    return Flexible(\n      child: InkWell(\n        onTap: onTap,\n        borderRadius: StyleString.mdRadius,\n        child: ConstrainedBox(\n          constraints: const BoxConstraints(maxWidth: 80),\n          child: AspectRatio(\n            aspectRatio: 1,\n            child: Column(\n              spacing: 4,\n              mainAxisSize: .min,\n              mainAxisAlignment: .center,\n              children: [\n                Text(\n                  count?.toString() ?? '-',\n                  style: countStyle,\n                ),\n                Text(\n                  name,\n                  style: labelStyle,\n                ),\n              ],\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n\n  void _autoRefresh() => Future.delayed(\n    const Duration(milliseconds: 150),\n    () => controller.onRefresh(isManual: false),\n  );\n\n  Widget _buildFav(ThemeData theme, Color secondary) {\n    return Column(\n      children: [\n        Divider(\n          height: 20,\n          color: theme.dividerColor.withValues(alpha: 0.1),\n        ),\n        ListTile(\n          onTap: () => Get.toNamed('/fav')?.whenComplete(_autoRefresh),\n          dense: true,\n          title: Padding(\n            padding: const EdgeInsets.only(left: 10),\n            child: Text.rich(\n              TextSpan(\n                children: [\n                  TextSpan(\n                    text: '我的收藏  ',\n                    style: TextStyle(\n                      fontSize: theme.textTheme.titleMedium!.fontSize,\n                      fontWeight: .bold,\n                    ),\n                  ),\n                  if (controller.favFolderCount != null)\n                    TextSpan(\n                      text: \"${controller.favFolderCount}  \",\n                      style: TextStyle(\n                        fontSize: theme.textTheme.titleSmall!.fontSize,\n                        color: secondary,\n                      ),\n                    ),\n                  WidgetSpan(\n                    child: Icon(\n                      Icons.arrow_forward_ios,\n                      size: 18,\n                      color: secondary,\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          ),\n          trailing: IconButton(\n            tooltip: '刷新',\n            onPressed: controller.onRefresh,\n            icon: const Icon(Icons.refresh, size: 20),\n          ),\n        ),\n        _buildFavBody(theme, secondary, controller.loadingState.value),\n      ],\n    );\n  }\n\n  Widget _buildFavBody(\n    ThemeData theme,\n    Color secondary,\n    LoadingState loadingState,\n  ) {\n    return switch (loadingState) {\n      Loading() => const SizedBox.shrink(),\n      Success(:final response) => Builder(\n        builder: (context) {\n          List<FavFolderInfo>? favFolderList = response.list;\n          if (favFolderList == null || favFolderList.isEmpty) {\n            return const SizedBox.shrink();\n          }\n          bool flag = (controller.favFolderCount ?? 0) > favFolderList.length;\n          return SizedBox(\n            height: 200,\n            child: ListView.separated(\n              controller: controller.scrollController,\n              padding: const .only(left: 20, top: 10, right: 20),\n              itemCount: response.list.length + (flag ? 1 : 0),\n              itemBuilder: (context, index) {\n                if (flag && index == favFolderList.length) {\n                  return Padding(\n                    padding: const .only(bottom: 35),\n                    child: Center(\n                      child: IconButton(\n                        tooltip: '查看更多',\n                        style: ButtonStyle(\n                          padding: const WidgetStatePropertyAll(.zero),\n                          backgroundColor: WidgetStatePropertyAll(\n                            theme.colorScheme.secondaryContainer.withValues(\n                              alpha: 0.5,\n                            ),\n                          ),\n                        ),\n                        onPressed: () =>\n                            Get.toNamed('/fav')?.whenComplete(_autoRefresh),\n                        icon: Icon(\n                          Icons.arrow_forward_ios,\n                          size: 18,\n                          color: secondary,\n                        ),\n                      ),\n                    ),\n                  );\n                } else {\n                  return FavFolderItem(\n                    heroTag: Utils.generateRandomString(8),\n                    item: response.list[index],\n                    onPop: _autoRefresh,\n                  );\n                }\n              },\n              scrollDirection: .horizontal,\n              separatorBuilder: (_, _) => const SizedBox(width: 14),\n            ),\n          );\n        },\n      ),\n      Error(:final errMsg) => SizedBox(\n        height: 160,\n        child: Center(\n          child: Text(\n            errMsg ?? '',\n            textAlign: .center,\n          ),\n        ),\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/mine/widgets/item.dart",
    "content": "import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models_new/fav/fav_folder/list.dart';\nimport 'package:PiliPlus/utils/fav_utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass FavFolderItem extends StatelessWidget {\n  const FavFolderItem({\n    super.key,\n    required this.item,\n    required this.onPop,\n    required this.heroTag,\n  });\n\n  final FavFolderInfo item;\n  final VoidCallback onPop;\n  final String heroTag;\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    return GestureDetector(\n      onTap: () {\n        Get.toNamed(\n          '/favDetail',\n          arguments: item,\n          parameters: {\n            'mediaId': item.id.toString(),\n            'heroTag': heroTag,\n          },\n        )?.whenComplete(onPop);\n      },\n      behavior: HitTestBehavior.opaque,\n      child: Column(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          DecoratedBox(\n            decoration: BoxDecoration(\n              borderRadius: const BorderRadius.all(Radius.circular(12)),\n              boxShadow: [\n                BoxShadow(\n                  color: theme.colorScheme.onInverseSurface.withValues(\n                    alpha: 0.4,\n                  ),\n                  offset: const Offset(6, -8),\n                  blurRadius: 0.0,\n                  spreadRadius: 0.0,\n                ),\n              ],\n            ),\n            child: Hero(\n              tag: heroTag,\n              child: NetworkImgLayer(\n                src: item.cover,\n                width: 180,\n                height: 110,\n              ),\n            ),\n          ),\n          const SizedBox(height: 8),\n          Text(\n            ' ${item.title}',\n            overflow: TextOverflow.fade,\n            maxLines: 1,\n          ),\n          Text(\n            ' 共${item.mediaCount}条视频 · ${FavUtils.isPublicFavText(item.attr)}',\n            style: theme.textTheme.labelSmall!.copyWith(\n              color: theme.colorScheme.outline,\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/msg_feed_top/at_me/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/msg.dart';\nimport 'package:PiliPlus/models_new/msg/msg_at/data.dart';\nimport 'package:PiliPlus/models_new/msg/msg_at/item.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\n\nclass AtMeController extends CommonListController<MsgAtData, MsgAtItem> {\n  int? cursor;\n  int? cursorTime;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  List<MsgAtItem>? getDataList(MsgAtData response) {\n    if (response.cursor?.isEnd == true) {\n      isEnd = true;\n    }\n    cursor = response.cursor?.id;\n    cursorTime = response.cursor?.time;\n    return response.items;\n  }\n\n  @override\n  Future<void> onRefresh() {\n    cursor = null;\n    cursorTime = null;\n    return super.onRefresh();\n  }\n\n  @override\n  Future<LoadingState<MsgAtData>> customGetData() =>\n      MsgHttp.msgFeedAtMe(cursor: cursor, cursorTime: cursorTime);\n\n  @pragma('vm:notify-debugger-on-exception')\n  Future<void> onRemove(Object id, int index) async {\n    try {\n      final res = await MsgHttp.delMsgfeed(2, id);\n      if (res.isSuccess) {\n        loadingState\n          ..value.data!.removeAt(index)\n          ..refresh();\n        SmartDialog.showToast('删除成功');\n      } else {\n        res.toast();\n      }\n    } catch (_) {}\n  }\n}\n"
  },
  {
    "path": "lib/pages/msg_feed_top/at_me/view.dart",
    "content": "import 'package:PiliPlus/common/skeleton/msg_feed_top.dart';\nimport 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/common/widgets/flutter/list_tile.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/grpc/bilibili/app/im/v1.pbenum.dart'\n    show IMSettingType;\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models_new/msg/msg_at/item.dart';\nimport 'package:PiliPlus/pages/msg_feed_top/at_me/controller.dart';\nimport 'package:PiliPlus/pages/whisper_settings/view.dart';\nimport 'package:PiliPlus/utils/app_scheme.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide ListTile;\nimport 'package:get/get.dart';\n\nclass AtMePage extends StatefulWidget {\n  const AtMePage({super.key});\n\n  @override\n  State<AtMePage> createState() => _AtMePageState();\n}\n\nclass _AtMePageState extends State<AtMePage> {\n  final AtMeController _atMeController = Get.put(AtMeController());\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        title: const Text('@我的'),\n        actions: [\n          IconButton(\n            onPressed: () => Get.to(\n              const WhisperSettingsPage(\n                imSettingType: IMSettingType.SETTING_TYPE_OLD_AT_ME,\n              ),\n            ),\n            icon: Icon(\n              size: 20,\n              Icons.settings,\n              color: theme.colorScheme.onSurfaceVariant.withValues(alpha: 0.8),\n            ),\n          ),\n          const SizedBox(width: 10),\n        ],\n      ),\n      body: refreshIndicator(\n        onRefresh: _atMeController.onRefresh,\n        child: CustomScrollView(\n          physics: const AlwaysScrollableScrollPhysics(),\n          slivers: [\n            SliverPadding(\n              padding: EdgeInsets.only(\n                bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n              ),\n              sliver: Obx(\n                () => _buildBody(theme, _atMeController.loadingState.value),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget _buildBody(\n    ThemeData theme,\n    LoadingState<List<MsgAtItem>?> loadingState,\n  ) {\n    late final divider = Divider(\n      indent: 72,\n      endIndent: 20,\n      height: 6,\n      color: Colors.grey.withValues(alpha: 0.1),\n    );\n    return switch (loadingState) {\n      Loading() => SliverList.builder(\n        itemCount: 12,\n        itemBuilder: (context, index) => const MsgFeedTopSkeleton(),\n      ),\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverList.separated(\n                itemCount: response.length,\n                itemBuilder: (context, int index) {\n                  if (index == response.length - 1) {\n                    _atMeController.onLoadMore();\n                  }\n                  final item = response[index];\n                  void onLongPress() => showConfirmDialog(\n                    context: context,\n                    title: '确定删除该通知?',\n                    onConfirm: () => _atMeController.onRemove(item.id!, index),\n                  );\n                  return ListTile(\n                    safeArea: true,\n                    onTap: () {\n                      String? nativeUri = item.item?.nativeUri;\n                      if (nativeUri == null ||\n                          nativeUri.isEmpty ||\n                          nativeUri.startsWith('?')) {\n                        return;\n                      }\n                      PiliScheme.routePushFromUrl(nativeUri);\n                    },\n                    onLongPress: onLongPress,\n                    onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n                    leading: GestureDetector(\n                      onTap: () => Get.toNamed('/member?mid=${item.user?.mid}'),\n                      child: NetworkImgLayer(\n                        width: 45,\n                        height: 45,\n                        type: ImageType.avatar,\n                        src: item.user?.avatar,\n                      ),\n                    ),\n                    title: Text.rich(\n                      TextSpan(\n                        children: [\n                          TextSpan(\n                            text: \"${item.user?.nickname}\",\n                            style: theme.textTheme.titleSmall!.copyWith(\n                              color: theme.colorScheme.primary,\n                            ),\n                          ),\n                          TextSpan(\n                            text: \" 在${item.item?.business}中@了我\",\n                            style: theme.textTheme.titleSmall!.copyWith(\n                              color: theme.colorScheme.onSurfaceVariant,\n                            ),\n                          ),\n                        ],\n                      ),\n                    ),\n                    subtitle: Column(\n                      crossAxisAlignment: CrossAxisAlignment.start,\n                      children: [\n                        if (item.item?.sourceContent?.isNotEmpty == true) ...[\n                          const SizedBox(height: 4),\n                          Text(\n                            item.item!.sourceContent!,\n                            maxLines: 3,\n                            overflow: TextOverflow.ellipsis,\n                            style: theme.textTheme.bodyMedium!.copyWith(\n                              color: theme.colorScheme.outline,\n                            ),\n                          ),\n                        ],\n                        const SizedBox(height: 4),\n                        Text(\n                          DateFormatUtils.dateFormat(item.atTime),\n                          style: theme.textTheme.bodyMedium!.copyWith(\n                            fontSize: 13,\n                            color: theme.colorScheme.outline,\n                          ),\n                        ),\n                      ],\n                    ),\n                    trailing: item.item?.image?.isNotEmpty == true\n                        ? NetworkImgLayer(\n                            width: 45,\n                            height: 45,\n                            src: item.item?.image,\n                            borderRadius: const BorderRadius.all(\n                              Radius.circular(8),\n                            ),\n                          )\n                        : null,\n                  );\n                },\n                separatorBuilder: (context, index) => divider,\n              )\n            : HttpError(onReload: _atMeController.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _atMeController.onReload,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/msg_feed_top/like_detail/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/msg.dart';\nimport 'package:PiliPlus/models_new/msg/msg_like_detail/card.dart';\nimport 'package:PiliPlus/models_new/msg/msg_like_detail/data.dart';\nimport 'package:PiliPlus/models_new/msg/msg_like_detail/item.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:get/get.dart';\n\nclass LikeDetailController\n    extends CommonListController<MsgLikeDetailData, MsgLikeDetailItem> {\n  late final String cardId;\n  late final String? uri;\n  late final int counts;\n\n  int lastMid = 0;\n\n  @override\n  void onInit() {\n    super.onInit();\n    final args = Get.arguments;\n    cardId = args['id'];\n    uri = args['uri'];\n    counts = args['counts'];\n    queryData();\n  }\n\n  MsgLikeDetailCard? card;\n\n  @override\n  List<MsgLikeDetailItem>? getDataList(MsgLikeDetailData response) {\n    card = response.card;\n    final items = response.items;\n    if (items?.lastOrNull?.user?.mid case final mid?) {\n      lastMid = mid;\n    }\n    return items;\n  }\n\n  @override\n  void checkIsEnd(int length) {\n    if (length >= counts) {\n      isEnd = true;\n    }\n  }\n\n  @override\n  Future<void> onRefresh() {\n    lastMid = 0;\n    return super.onRefresh();\n  }\n\n  @override\n  Future<LoadingState<MsgLikeDetailData>> customGetData() =>\n      MsgHttp.msgLikeDetail(cardId: cardId, pn: page, lastMid: lastMid);\n}\n"
  },
  {
    "path": "lib/pages/msg_feed_top/like_detail/view.dart",
    "content": "import 'package:PiliPlus/common/skeleton/msg_feed_top.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models_new/msg/msg_like_detail/card.dart';\nimport 'package:PiliPlus/models_new/msg/msg_like_detail/item.dart';\nimport 'package:PiliPlus/pages/msg_feed_top/like_detail/controller.dart';\nimport 'package:PiliPlus/utils/app_scheme.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass LikeDetailPage extends StatefulWidget {\n  const LikeDetailPage({super.key});\n\n  @override\n  State<LikeDetailPage> createState() => _LikeDetailPageState();\n}\n\nclass _LikeDetailPageState extends State<LikeDetailPage> {\n  final LikeDetailController _controller = Get.put(\n    LikeDetailController(),\n    tag: Utils.generateRandomString(8),\n  );\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(title: const Text('点赞详情')),\n      body: refreshIndicator(\n        onRefresh: _controller.onRefresh,\n        child: CustomScrollView(\n          physics: const AlwaysScrollableScrollPhysics(),\n          slivers: [\n            SliverPadding(\n              padding: EdgeInsets.only(\n                bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n              ),\n              sliver: Obx(\n                () => _buildBody(theme, _controller.loadingState.value),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget _buildBody(\n    ThemeData theme,\n    LoadingState<List<MsgLikeDetailItem>?> loadingState,\n  ) {\n    late final divider = Divider(\n      indent: 72,\n      endIndent: 20,\n      height: 6,\n      color: Colors.grey.withValues(alpha: 0.1),\n    );\n    return switch (loadingState) {\n      Loading() => SliverList.builder(\n        itemCount: 12,\n        itemBuilder: (context, index) => const MsgFeedTopSkeleton(),\n      ),\n      Success(:final response) => SliverMainAxisGroup(\n        slivers: [\n          if (_controller.card != null) ...[\n            _buildCard(_controller.card!),\n            SliverToBoxAdapter(\n              child: Divider(\n                height: 1,\n                color: Colors.grey.withValues(alpha: 0.1),\n              ),\n            ),\n          ],\n          SliverList.separated(\n            itemCount: response!.length,\n            itemBuilder: (context, index) {\n              if (index == response.length - 1) {\n                _controller.onLoadMore();\n              }\n              return _buildItem(theme, response[index]);\n            },\n            separatorBuilder: (context, index) => divider,\n          ),\n        ],\n      ),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n\n  Widget _buildCard(MsgLikeDetailCard card) {\n    return SliverToBoxAdapter(\n      child: ListTile(\n        onTap: () {\n          if (_controller.uri != null) {\n            PiliScheme.routePushFromUrl(_controller.uri!);\n          }\n        },\n        title: Text('${card.business}: ${card.title}'),\n      ),\n    );\n  }\n\n  Widget _buildItem(ThemeData theme, MsgLikeDetailItem item) {\n    return ListTile(\n      onTap: () => Get.toNamed('/member?mid=${item.user!.mid}'),\n      leading: NetworkImgLayer(\n        width: 45,\n        height: 45,\n        type: ImageType.avatar,\n        src: item.user!.avatar,\n      ),\n      title: Text.rich(\n        TextSpan(\n          children: [\n            TextSpan(\n              text: \"${item.user!.nickname}\",\n              style: theme.textTheme.titleSmall!.copyWith(\n                height: 1.5,\n                color: theme.colorScheme.primary,\n              ),\n            ),\n            TextSpan(\n              text: \" 赞了我\",\n              style: TextStyle(\n                fontSize: 13,\n                color: theme.colorScheme.onSurfaceVariant,\n              ),\n            ),\n          ],\n        ),\n        maxLines: 2,\n        overflow: TextOverflow.ellipsis,\n      ),\n      subtitle: Text(\n        DateFormatUtils.dateFormat(item.likeTime),\n        style: theme.textTheme.bodyMedium!.copyWith(\n          fontSize: 13,\n          color: theme.colorScheme.outline,\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/msg_feed_top/like_me/controller.dart",
    "content": "import 'package:PiliPlus/common/widgets/pair.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/msg.dart';\nimport 'package:PiliPlus/models_new/msg/msg_like/data.dart';\nimport 'package:PiliPlus/models_new/msg/msg_like/item.dart';\nimport 'package:PiliPlus/pages/common/common_data_controller.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\n\nclass LikeMeController\n    extends\n        CommonDataController<\n          MsgLikeData,\n          Pair<List<MsgLikeItem>, List<MsgLikeItem>>\n        > {\n  int? cursor;\n  int? cursorTime;\n\n  bool isEnd = false;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  Future<void> queryData([bool isRefresh = true]) {\n    if (!isRefresh && isEnd) {\n      return Future.syncValue(null);\n    }\n    return super.queryData(isRefresh);\n  }\n\n  @override\n  bool customHandleResponse(bool isRefresh, Success<MsgLikeData> response) {\n    MsgLikeData data = response.response;\n    if (data.total?.cursor?.isEnd == true ||\n        data.total?.items.isNullOrEmpty == true) {\n      isEnd = true;\n    }\n    cursor = data.total?.cursor?.id;\n    cursorTime = data.total?.cursor?.time;\n    List<MsgLikeItem> latest = data.latest?.items ?? <MsgLikeItem>[];\n    List<MsgLikeItem> total = data.total?.items ?? <MsgLikeItem>[];\n    if (!isRefresh) {\n      if (loadingState.value case Success(:final response)) {\n        latest.insertAll(0, response.first);\n        total.insertAll(0, response.second);\n      }\n    }\n    loadingState.value = Success(Pair(first: latest, second: total));\n    return true;\n  }\n\n  @override\n  Future<void> onRefresh() {\n    cursor = null;\n    cursorTime = null;\n    return super.onRefresh();\n  }\n\n  @override\n  Future<LoadingState<MsgLikeData>> customGetData() =>\n      MsgHttp.msgFeedLikeMe(cursor: cursor, cursorTime: cursorTime);\n\n  Future<void> onRemove(dynamic id, int index, bool isLatest) async {\n    try {\n      final res = await MsgHttp.delMsgfeed(0, id);\n      if (res.isSuccess) {\n        Pair<List<MsgLikeItem>, List<MsgLikeItem>> pair =\n            loadingState.value.data;\n        if (isLatest) {\n          pair.first.removeAt(index);\n        } else {\n          pair.second.removeAt(index);\n        }\n        loadingState.refresh();\n        SmartDialog.showToast('删除成功');\n      } else {\n        res.toast();\n      }\n    } catch (_) {}\n  }\n\n  Future<void> onSetNotice(MsgLikeItem item, bool isNotice) async {\n    int noticeState = isNotice ? 1 : 0;\n    final res = await MsgHttp.msgSetNotice(\n      id: item.id!,\n      noticeState: noticeState,\n    );\n    if (res.isSuccess) {\n      item.noticeState = noticeState;\n      loadingState.refresh();\n      SmartDialog.showToast('操作成功');\n    } else {\n      res.toast();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/msg_feed_top/like_me/view.dart",
    "content": "import 'package:PiliPlus/common/skeleton/msg_feed_top.dart';\nimport 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/common/widgets/flutter/list_tile.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/pair.dart';\nimport 'package:PiliPlus/grpc/bilibili/app/im/v1.pbenum.dart'\n    show IMSettingType;\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models_new/msg/msg_like/item.dart';\nimport 'package:PiliPlus/pages/msg_feed_top/like_me/controller.dart';\nimport 'package:PiliPlus/pages/whisper_settings/view.dart';\nimport 'package:PiliPlus/utils/app_scheme.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide ListTile;\nimport 'package:get/get.dart';\n\nclass LikeMePage extends StatefulWidget {\n  const LikeMePage({super.key});\n\n  @override\n  State<LikeMePage> createState() => _LikeMePageState();\n}\n\nclass _LikeMePageState extends State<LikeMePage> {\n  final LikeMeController _likeMeController = Get.put(LikeMeController());\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        title: const Text('收到的赞'),\n        actions: [\n          IconButton(\n            onPressed: () => Get.to(\n              const WhisperSettingsPage(\n                imSettingType: IMSettingType.SETTING_TYPE_OLD_RECEIVE_LIKE,\n              ),\n            ),\n            icon: Icon(\n              size: 20,\n              Icons.settings,\n              color: theme.colorScheme.onSurfaceVariant.withValues(alpha: 0.8),\n            ),\n          ),\n          const SizedBox(width: 10),\n        ],\n      ),\n      body: refreshIndicator(\n        onRefresh: _likeMeController.onRefresh,\n        child: CustomScrollView(\n          physics: const AlwaysScrollableScrollPhysics(),\n          slivers: [\n            SliverPadding(\n              padding: EdgeInsets.only(\n                bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n              ),\n              sliver: Obx(\n                () => _buildBody(theme, _likeMeController.loadingState.value),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget _buildBody(ThemeData theme, LoadingState loadingState) {\n    late final divider = Divider(\n      indent: 72,\n      endIndent: 20,\n      height: 6,\n      color: Colors.grey.withValues(alpha: 0.1),\n    );\n    return switch (loadingState) {\n      Loading() => SliverList.builder(\n        itemCount: 12,\n        itemBuilder: (context, index) => const MsgFeedTopSkeleton(),\n      ),\n      Success(:final response) => Builder(\n        builder: (context) {\n          Pair<List<MsgLikeItem>, List<MsgLikeItem>> pair = response;\n          List<MsgLikeItem> latest = pair.first;\n          List<MsgLikeItem> total = pair.second;\n          if (latest.isNotEmpty || total.isNotEmpty) {\n            return SliverMainAxisGroup(\n              slivers: [\n                if (latest.isNotEmpty) ...[\n                  _buildHeader(theme, '最新'),\n                  SliverList.separated(\n                    itemBuilder: (context, index) {\n                      if (total.isEmpty && index == latest.length - 1) {\n                        _likeMeController.onLoadMore();\n                      }\n                      return _buildItem(\n                        theme,\n                        latest[index],\n                        (id) {\n                          _likeMeController.onRemove(id, index, true);\n                        },\n                      );\n                    },\n                    itemCount: latest.length,\n                    separatorBuilder: (context, index) => divider,\n                  ),\n                ],\n                if (total.isNotEmpty) ...[\n                  _buildHeader(theme, '累计'),\n                  SliverList.separated(\n                    itemBuilder: (context, index) {\n                      if (index == total.length - 1) {\n                        _likeMeController.onLoadMore();\n                      }\n                      return _buildItem(\n                        theme,\n                        total[index],\n                        (id) {\n                          _likeMeController.onRemove(id, index, false);\n                        },\n                      );\n                    },\n                    itemCount: total.length,\n                    separatorBuilder: (context, index) => divider,\n                  ),\n                ],\n              ],\n            );\n          }\n          return HttpError(onReload: _likeMeController.onReload);\n        },\n      ),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _likeMeController.onReload,\n      ),\n    };\n  }\n\n  Widget _buildHeader(ThemeData theme, String title) {\n    return SliverSafeArea(\n      top: false,\n      bottom: false,\n      sliver: SliverToBoxAdapter(\n        child: Padding(\n          padding: const EdgeInsets.only(left: 16),\n          child: Text(\n            title,\n            style: theme.textTheme.labelLarge!.copyWith(\n              color: theme.colorScheme.secondary,\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget _buildItem(\n    ThemeData theme,\n    MsgLikeItem item,\n    ValueChanged<int?> onRemove,\n  ) {\n    final firstUser = item.users!.first;\n    Widget avatar;\n    if (item.users!.length == 1) {\n      avatar = NetworkImgLayer(\n        width: 45,\n        height: 45,\n        type: ImageType.avatar,\n        src: firstUser.avatar,\n      );\n    } else {\n      avatar = SizedBox(\n        width: 45,\n        height: 45,\n        child: Stack(\n          clipBehavior: Clip.none,\n          children: [\n            for (var j = 0; j < item.users!.length && j < 4; j++) ...[\n              Positioned(\n                left: 15.0 * (j % 2),\n                top: 15.0 * (j ~/ 2),\n                child: NetworkImgLayer(\n                  width: 30,\n                  height: 30,\n                  type: ImageType.avatar,\n                  src: item.users![j].avatar,\n                ),\n              ),\n            ],\n          ],\n        ),\n      );\n    }\n    void onLongPress() => showDialog(\n      context: context,\n      builder: (context) {\n        final isNotice = item.noticeState == 0;\n        return AlertDialog(\n          clipBehavior: Clip.hardEdge,\n          contentPadding: const EdgeInsets.symmetric(vertical: 12),\n          content: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              ListTile(\n                onTap: () {\n                  Get.back();\n                  showConfirmDialog(\n                    context: context,\n                    title: '删除',\n                    content: '该条通知删除后，当有新点赞时会重新出现在列表，是否继续？',\n                    onConfirm: () => onRemove(item.id),\n                  );\n                },\n                dense: true,\n                title: const Text(\n                  '删除',\n                  style: TextStyle(fontSize: 14),\n                ),\n              ),\n              ListTile(\n                onTap: () {\n                  Get.back();\n                  if (isNotice) {\n                    showConfirmDialog(\n                      context: context,\n                      title: '不再通知',\n                      content: '这条内容的点赞将不再通知，但仍可在列表内查看，是否继续？',\n                      onConfirm: () =>\n                          _likeMeController.onSetNotice(item, isNotice),\n                    );\n                  } else {\n                    _likeMeController.onSetNotice(item, isNotice);\n                  }\n                },\n                dense: true,\n                title: Text(\n                  isNotice ? '不再通知' : '接收通知',\n                  style: const TextStyle(fontSize: 14),\n                ),\n              ),\n            ],\n          ),\n        );\n      },\n    );\n    return ListTile(\n      safeArea: true,\n      onTap: () {\n        String? nativeUri = item.item?.nativeUri;\n        bool isInvalid =\n            nativeUri == null || nativeUri.isEmpty || nativeUri.startsWith('?');\n        if (item.counts! > 1) {\n          Get.toNamed(\n            'msgLikeDetail',\n            arguments: {\n              'id': item.id!.toString(),\n              if (!isInvalid) 'uri': nativeUri,\n              'counts': item.counts,\n            },\n          );\n          return;\n        }\n        if (isInvalid) {\n          return;\n        }\n        PiliScheme.routePushFromUrl(nativeUri);\n      },\n      onLongPress: onLongPress,\n      onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n      leading: avatar,\n      title: Text.rich(\n        TextSpan(\n          children: [\n            TextSpan(\n              text: firstUser.nickname,\n              style: theme.textTheme.titleSmall!.copyWith(\n                height: 1.5,\n                color: theme.colorScheme.primary,\n              ),\n            ),\n            if (item.counts! > 1)\n              TextSpan(\n                text: ' 等${item.counts}人',\n                style: theme.textTheme.titleSmall!.copyWith(\n                  fontSize: 12,\n                  height: 1.5,\n                ),\n              ),\n            TextSpan(\n              text: ' 赞了我的${item.item?.business}',\n              style: theme.textTheme.titleSmall!.copyWith(\n                height: 1.5,\n                color: theme.colorScheme.onSurfaceVariant,\n              ),\n            ),\n          ],\n        ),\n        maxLines: 2,\n        overflow: TextOverflow.ellipsis,\n      ),\n      subtitle: Column(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          if (item.item?.title?.isNotEmpty == true) ...[\n            const SizedBox(height: 4),\n            Text(\n              item.item!.title!,\n              maxLines: 3,\n              overflow: TextOverflow.ellipsis,\n              style: theme.textTheme.bodyMedium!.copyWith(\n                color: theme.colorScheme.outline,\n                height: 1.5,\n              ),\n            ),\n          ],\n          const SizedBox(height: 4),\n          Text(\n            DateFormatUtils.dateFormat(item.likeTime),\n            style: theme.textTheme.bodyMedium!.copyWith(\n              fontSize: 13,\n              color: theme.colorScheme.outline,\n            ),\n          ),\n        ],\n      ),\n      trailing: Row(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          if (item.item?.image?.isNotEmpty == true)\n            NetworkImgLayer(\n              width: 45,\n              height: 45,\n              src: item.item!.image,\n              borderRadius: const BorderRadius.all(\n                Radius.circular(8),\n              ),\n            ),\n          if (item.noticeState == 1) ...[\n            if (item.item?.image?.isNotEmpty == true) const SizedBox(width: 4),\n            Icon(\n              size: 18,\n              Icons.notifications_off,\n              color: theme.colorScheme.outline,\n            ),\n          ],\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/msg_feed_top/reply_me/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/msg.dart';\nimport 'package:PiliPlus/models_new/msg/msg_reply/data.dart';\nimport 'package:PiliPlus/models_new/msg/msg_reply/item.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\n\nclass ReplyMeController\n    extends CommonListController<MsgReplyData, MsgReplyItem> {\n  int? cursor;\n  int? cursorTime;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  List<MsgReplyItem>? getDataList(MsgReplyData response) {\n    if (response.cursor?.isEnd == true) {\n      isEnd = true;\n    }\n    cursor = response.cursor?.id;\n    cursorTime = response.cursor?.time;\n    return response.items;\n  }\n\n  @override\n  Future<void> onRefresh() {\n    cursor = null;\n    cursorTime = null;\n    return super.onRefresh();\n  }\n\n  @override\n  Future<LoadingState<MsgReplyData>> customGetData() =>\n      MsgHttp.msgFeedReplyMe(cursor: cursor, cursorTime: cursorTime);\n\n  Future<void> onRemove(dynamic id, int index) async {\n    try {\n      final res = await MsgHttp.delMsgfeed(1, id);\n      if (res.isSuccess) {\n        loadingState\n          ..value.data!.removeAt(index)\n          ..refresh();\n        SmartDialog.showToast('删除成功');\n      } else {\n        res.toast();\n      }\n    } catch (_) {}\n  }\n}\n"
  },
  {
    "path": "lib/pages/msg_feed_top/reply_me/view.dart",
    "content": "import 'package:PiliPlus/common/skeleton/msg_feed_top.dart';\nimport 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/common/widgets/flutter/list_tile.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/grpc/bilibili/app/im/v1.pbenum.dart'\n    show IMSettingType;\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models_new/msg/msg_reply/item.dart';\nimport 'package:PiliPlus/pages/msg_feed_top/reply_me/controller.dart';\nimport 'package:PiliPlus/pages/whisper_settings/view.dart';\nimport 'package:PiliPlus/utils/app_scheme.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide ListTile;\nimport 'package:get/get.dart';\n\nclass ReplyMePage extends StatefulWidget {\n  const ReplyMePage({super.key});\n\n  @override\n  State<ReplyMePage> createState() => _ReplyMePageState();\n}\n\nclass _ReplyMePageState extends State<ReplyMePage> {\n  final _replyMeController = Get.put(ReplyMeController());\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        title: const Text('回复我的'),\n        actions: [\n          IconButton(\n            onPressed: () => Get.to(\n              const WhisperSettingsPage(\n                imSettingType: IMSettingType.SETTING_TYPE_OLD_REPLY_ME,\n              ),\n            ),\n            icon: Icon(\n              size: 20,\n              Icons.settings,\n              color: theme.colorScheme.onSurfaceVariant.withValues(alpha: 0.8),\n            ),\n          ),\n          const SizedBox(width: 10),\n        ],\n      ),\n      body: refreshIndicator(\n        onRefresh: _replyMeController.onRefresh,\n        child: CustomScrollView(\n          physics: const AlwaysScrollableScrollPhysics(),\n          slivers: [\n            SliverPadding(\n              padding: EdgeInsets.only(\n                bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n              ),\n              sliver: Obx(\n                () => _buildBody(theme, _replyMeController.loadingState.value),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget _buildBody(\n    ThemeData theme,\n    LoadingState<List<MsgReplyItem>?> loadingState,\n  ) {\n    late final divider = Divider(\n      indent: 72,\n      endIndent: 20,\n      height: 6,\n      color: Colors.grey.withValues(alpha: 0.1),\n    );\n    return switch (loadingState) {\n      Loading() => SliverList.builder(\n        itemCount: 12,\n        itemBuilder: (context, index) => const MsgFeedTopSkeleton(),\n      ),\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverList.separated(\n                itemCount: response.length,\n                itemBuilder: (context, int index) {\n                  if (index == response.length - 1) {\n                    _replyMeController.onLoadMore();\n                  }\n\n                  MsgReplyItem item = response[index];\n\n                  void onLongPress() => showConfirmDialog(\n                    context: context,\n                    title: '确定删除该通知?',\n                    onConfirm: () =>\n                        _replyMeController.onRemove(item.id, index),\n                  );\n\n                  return ListTile(\n                    safeArea: true,\n                    onTap: () {\n                      String? nativeUri = item.item?.nativeUri;\n                      if (nativeUri == null ||\n                          nativeUri.isEmpty ||\n                          nativeUri.startsWith('?')) {\n                        return;\n                      }\n                      PiliScheme.routePushFromUrl(\n                        nativeUri,\n                        businessId: item.item?.businessId,\n                        oid: item.item?.subjectId,\n                      );\n                    },\n                    onLongPress: onLongPress,\n                    onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n                    leading: GestureDetector(\n                      onTap: () => Get.toNamed('/member?mid=${item.user?.mid}'),\n                      child: NetworkImgLayer(\n                        width: 45,\n                        height: 45,\n                        type: ImageType.avatar,\n                        src: item.user?.avatar,\n                      ),\n                    ),\n                    title: Text.rich(\n                      TextSpan(\n                        children: [\n                          TextSpan(\n                            text: \"${item.user?.nickname}\",\n                            style: theme.textTheme.titleSmall!.copyWith(\n                              color: theme.colorScheme.primary,\n                            ),\n                          ),\n                          if (item.isMulti == 1)\n                            TextSpan(\n                              text: \" 等人\",\n                              style: theme.textTheme.titleSmall!.copyWith(\n                                fontSize: 12,\n                              ),\n                            ),\n                          TextSpan(\n                            text:\n                                \" 对我的${item.item?.business}发布了${item.counts}条评论\",\n                            style: theme.textTheme.titleSmall!.copyWith(\n                              color: theme.colorScheme.onSurfaceVariant,\n                            ),\n                          ),\n                        ],\n                      ),\n                    ),\n                    subtitle: Column(\n                      crossAxisAlignment: CrossAxisAlignment.start,\n                      children: [\n                        const SizedBox(height: 4),\n                        Text(\n                          item.item?.sourceContent ?? \"\",\n                          style: theme.textTheme.bodyMedium,\n                        ),\n                        const SizedBox(height: 4),\n                        if (item.item?.targetReplyContent != null &&\n                            item.item?.targetReplyContent != \"\")\n                          Text(\n                            \"| ${item.item?.targetReplyContent}\",\n                            maxLines: 1,\n                            overflow: TextOverflow.ellipsis,\n                            style: theme.textTheme.labelMedium!.copyWith(\n                              color: theme.colorScheme.outline,\n                              height: 1.5,\n                            ),\n                          ),\n                        if (item.item?.rootReplyContent != null &&\n                            item.item?.rootReplyContent != \"\")\n                          Text(\n                            \" | ${item.item?.rootReplyContent}\",\n                            maxLines: 1,\n                            overflow: TextOverflow.ellipsis,\n                            style: theme.textTheme.labelMedium!.copyWith(\n                              color: theme.colorScheme.outline,\n                              height: 1.5,\n                            ),\n                          ),\n                        Text(\n                          DateFormatUtils.dateFormat(item.replyTime),\n                          style: theme.textTheme.bodyMedium!.copyWith(\n                            fontSize: 13,\n                            color: theme.colorScheme.outline,\n                          ),\n                        ),\n                      ],\n                    ),\n                  );\n                },\n                separatorBuilder: (context, index) => divider,\n              )\n            : HttpError(onReload: _replyMeController.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _replyMeController.onReload,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/msg_feed_top/sys_msg/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/msg.dart';\nimport 'package:PiliPlus/models_new/msg/msg_sys/data.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\n\nclass SysMsgController\n    extends CommonListController<List<MsgSysItem>?, MsgSysItem> {\n  int? cursor;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  void handleListResponse(List<MsgSysItem> dataList) {\n    if (cursor == null) {\n      msgSysUpdateCursor(dataList.first.cursor);\n    }\n    cursor = dataList.last.cursor;\n  }\n\n  void msgSysUpdateCursor(int? cursor) {\n    if (cursor != null) {\n      MsgHttp.msgSysUpdateCursor(cursor);\n    }\n  }\n\n  @override\n  Future<void> onRefresh() {\n    cursor = null;\n    return super.onRefresh();\n  }\n\n  Future<void> onRemove(dynamic id, int index) async {\n    try {\n      final res = await MsgHttp.delSysMsg(id);\n      if (res.isSuccess) {\n        loadingState\n          ..value.data!.removeAt(index)\n          ..refresh();\n        SmartDialog.showToast('删除成功');\n      } else {\n        res.toast();\n      }\n    } catch (_) {}\n  }\n\n  @override\n  Future<LoadingState<List<MsgSysItem>?>> customGetData() =>\n      MsgHttp.msgFeedNotify(cursor: cursor);\n}\n"
  },
  {
    "path": "lib/pages/msg_feed_top/sys_msg/view.dart",
    "content": "import 'package:PiliPlus/common/skeleton/msg_feed_sys_msg_.dart';\nimport 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/common/widgets/flutter/list_tile.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/gesture/tap_gesture_recognizer.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/msg/msg_sys/data.dart';\nimport 'package:PiliPlus/pages/msg_feed_top/sys_msg/controller.dart';\nimport 'package:PiliPlus/utils/app_scheme.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide ListTile;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass SysMsgPage extends StatefulWidget {\n  const SysMsgPage({super.key});\n\n  @override\n  State<SysMsgPage> createState() => _SysMsgPageState();\n}\n\nclass _SysMsgPageState extends State<SysMsgPage> {\n  final _sysMsgController = Get.put(SysMsgController());\n\n  static final RegExp _urlRegExp = RegExp(\n    r'#\\{([^}]*)\\}\\{([^}]*)\\}|https?:\\/\\/[^\\s/\\$.?#].[^\\s]*|www\\.[^\\s/\\$.?#].[^\\s]*|【(.*?)】|（(\\d+)）',\n  );\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(title: const Text('系统通知')),\n      body: refreshIndicator(\n        onRefresh: _sysMsgController.onRefresh,\n        child: CustomScrollView(\n          physics: const AlwaysScrollableScrollPhysics(),\n          slivers: [\n            SliverPadding(\n              padding: EdgeInsets.only(\n                bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n              ),\n              sliver: Obx(\n                () => _buildBody(theme, _sysMsgController.loadingState.value),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget _buildBody(\n    ThemeData theme,\n    LoadingState<List<MsgSysItem>?> loadingState,\n  ) {\n    late final divider = Divider(\n      indent: 72,\n      endIndent: 20,\n      height: 6,\n      color: Colors.grey.withValues(alpha: 0.1),\n    );\n    return switch (loadingState) {\n      Loading() => SliverSafeArea(\n        sliver: SliverList.builder(\n          itemCount: 12,\n          itemBuilder: (context, index) => const MsgFeedSysMsgSkeleton(),\n        ),\n      ),\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverList.separated(\n                itemCount: response.length,\n                itemBuilder: (context, int index) {\n                  if (index == response.length - 1) {\n                    _sysMsgController.onLoadMore();\n                  }\n                  final item = response[index];\n                  void onLongPress() => showConfirmDialog(\n                    context: context,\n                    title: '确定删除该通知?',\n                    onConfirm: () => _sysMsgController.onRemove(item.id, index),\n                  );\n                  return ListTile(\n                    safeArea: true,\n                    onLongPress: onLongPress,\n                    onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n                    title: Text(\n                      \"${item.title}\",\n                      style: theme.textTheme.titleMedium,\n                    ),\n                    subtitle: Column(\n                      crossAxisAlignment: CrossAxisAlignment.start,\n                      children: [\n                        const SizedBox(height: 4),\n                        Text.rich(\n                          _buildContent(theme, item.content ?? ''),\n                          style: TextStyle(\n                            fontSize: 14,\n                            color: theme.colorScheme.onSurface.withValues(\n                              alpha: 0.85,\n                            ),\n                          ),\n                        ),\n                        const SizedBox(height: 5),\n                        Align(\n                          alignment: Alignment.centerRight,\n                          child: Text(\n                            \"${item.timeAt}\",\n                            maxLines: 1,\n                            overflow: TextOverflow.ellipsis,\n                            style: theme.textTheme.bodyMedium!.copyWith(\n                              fontSize: 13,\n                              color: theme.colorScheme.outline,\n                            ),\n                          ),\n                        ),\n                      ],\n                    ),\n                  );\n                },\n                separatorBuilder: (context, index) => divider,\n              )\n            : HttpError(onReload: _sysMsgController.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _sysMsgController.onReload,\n      ),\n    };\n  }\n\n  InlineSpan _buildContent(ThemeData theme, String content) {\n    final List<InlineSpan> spanChildren = <InlineSpan>[];\n    content.splitMapJoin(\n      _urlRegExp,\n      onMatch: (Match match) {\n        final matchStr = match[0]!;\n        if (matchStr.startsWith('#')) {\n          try {\n            final url = match[2]!.replaceAll('\"', '');\n            spanChildren.add(\n              TextSpan(\n                text: match[1],\n                style: TextStyle(color: theme.colorScheme.primary),\n                recognizer: NoDeadlineTapGestureRecognizer()\n                  ..onTap = () {\n                    try {\n                      PiliScheme.routePushFromUrl(url);\n                    } catch (err) {\n                      SmartDialog.showToast(err.toString());\n                    }\n                  },\n              ),\n            );\n          } catch (e) {\n            spanChildren.add(TextSpan(text: matchStr));\n          }\n        } else if (matchStr.startsWith('【')) {\n          try {\n            final isBV = match[3]!.startsWith('BV');\n            final int validAv;\n            final String validBv;\n            if (isBV) {\n              validBv = match[3]!;\n              validAv = IdUtils.bv2av(validBv);\n            } else {\n              validAv = int.parse(match[3]!);\n              validBv = IdUtils.av2bv(validAv);\n            }\n            spanChildren\n              ..add(const TextSpan(text: '【'))\n              ..add(\n                TextSpan(\n                  text: match[3],\n                  style: TextStyle(color: theme.colorScheme.primary),\n                  recognizer: NoDeadlineTapGestureRecognizer()\n                    ..onTap = () {\n                      PiliScheme.videoPush(validAv, validBv);\n                    },\n                ),\n              )\n              ..add(const TextSpan(text: '】'));\n          } catch (e) {\n            spanChildren.add(TextSpan(text: matchStr));\n          }\n        } else if (matchStr.startsWith('（')) {\n          try {\n            final dynId = match[4]!; // check dynId\n            spanChildren\n              ..add(const TextSpan(text: '（'))\n              ..add(\n                TextSpan(\n                  text: '查看动态',\n                  style: TextStyle(color: theme.colorScheme.primary),\n                  recognizer: NoDeadlineTapGestureRecognizer()\n                    ..onTap = () {\n                      PageUtils.pushDynFromId(id: dynId).catchError(\n                        (err) => SmartDialog.showToast(err.toString()),\n                      );\n                    },\n                ),\n              )\n              ..add(const TextSpan(text: '）'));\n          } catch (e) {\n            spanChildren.add(TextSpan(text: matchStr));\n          }\n        } else {\n          spanChildren.add(\n            TextSpan(\n              text: '\\u{1F517}网页链接',\n              style: TextStyle(color: theme.colorScheme.primary),\n              recognizer: NoDeadlineTapGestureRecognizer()\n                ..onTap = () {\n                  PiliScheme.routePushFromUrl(matchStr);\n                },\n            ),\n          );\n        }\n        return '';\n      },\n      onNonMatch: (String nonMatchStr) {\n        spanChildren.add(\n          TextSpan(text: nonMatchStr),\n        );\n        return '';\n      },\n    );\n    return TextSpan(children: spanChildren);\n  }\n}\n"
  },
  {
    "path": "lib/pages/music/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/music.dart';\nimport 'package:PiliPlus/models_new/music/bgm_detail.dart';\nimport 'package:PiliPlus/pages/common/dyn/common_dyn_controller.dart';\nimport 'package:get/get.dart';\n\nclass MusicDetailController extends CommonDynController {\n  @override\n  late final int oid;\n  @override\n  late final int replyType;\n\n  @override\n  dynamic get sourceId => oid.toString();\n\n  final infoState = LoadingState<MusicDetail>.loading().obs;\n\n  late final String musicId;\n\n  String get shareUrl =>\n      'https://music.bilibili.com/h5/music-detail?music_id=$musicId';\n\n  @override\n  void onInit() {\n    super.onInit();\n    musicId = Get.parameters['musicId']!;\n    getMusicDetail();\n  }\n\n  Future<void> getMusicDetail() async {\n    final res = await MusicHttp.bgmDetail(musicId);\n    if (res case Success(:final response)) {\n      final comment = response.musicComment!;\n      oid = comment.oid!;\n      replyType = comment.pageType ?? 47;\n      count.value = comment.nums ?? -1;\n      queryData();\n    }\n    infoState.value = res;\n  }\n}\n"
  },
  {
    "path": "lib/pages/music/video/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/music.dart';\nimport 'package:PiliPlus/models_new/music/bgm_detail.dart';\nimport 'package:PiliPlus/models_new/music/bgm_recommend_list.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:get/get.dart';\n\ntypedef MusicRecommendArgs = ({String id, MusicDetail item});\n\nclass MusicRecommendController\n    extends CommonListController<List<BgmRecommend>?, BgmRecommend> {\n  late final String musicId;\n  late final MusicDetail musicDetail;\n\n  @override\n  void onInit() {\n    super.onInit();\n    final MusicRecommendArgs args = Get.arguments;\n    musicId = args.id;\n    musicDetail = args.item;\n    queryData();\n  }\n\n  @override\n  void checkIsEnd(int length) {\n    isEnd = true;\n  }\n\n  @override\n  Future<LoadingState<List<BgmRecommend>?>> customGetData() =>\n      MusicHttp.bgmRecommend(musicId);\n}\n"
  },
  {
    "path": "lib/pages/music/video/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models_new/music/bgm_recommend_list.dart';\nimport 'package:PiliPlus/pages/music/video/controller.dart';\nimport 'package:PiliPlus/pages/music/widget/music_video_card_h.dart';\nimport 'package:PiliPlus/utils/extension/get_ext.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass MusicRecommendPage extends StatefulWidget {\n  const MusicRecommendPage({super.key});\n\n  @override\n  State<MusicRecommendPage> createState() => _MusicRecommendPageState();\n}\n\nclass _MusicRecommendPageState extends State<MusicRecommendPage>\n    with GridMixin {\n  final MusicRecommendController _controller = Get.putOrFind(\n    MusicRecommendController.new,\n    tag: (Get.arguments as MusicRecommendArgs).id,\n  );\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    final padding = MediaQuery.viewPaddingOf(context);\n    return Material(\n      color: theme.colorScheme.surface,\n      child: refreshIndicator(\n        onRefresh: _controller.onRefresh,\n        child: CustomScrollView(\n          physics: const AlwaysScrollableScrollPhysics(),\n          slivers: [\n            _buildAppBar(theme, padding),\n            SliverPadding(\n              padding: EdgeInsets.only(\n                top: 7,\n                left: padding.left,\n                right: padding.right,\n                bottom: padding.bottom + 100,\n              ),\n              sliver: Obx(\n                () => _buildBody(_controller.loadingState.value),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget _buildBody(LoadingState<List<BgmRecommend>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => gridSkeleton,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverGrid.builder(\n                gridDelegate: gridDelegate,\n                itemBuilder: (context, index) =>\n                    MusicVideoCardH(videoItem: response[index]),\n                itemCount: response.length,\n              )\n            : HttpError(onReload: _controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n\n  Widget _buildAppBar(ThemeData theme, EdgeInsets padding) {\n    final info = _controller.musicDetail;\n    return SliverAppBar(\n      pinned: true,\n      title: Row(\n        spacing: 12,\n        children: [\n          NetworkImgLayer(\n            width: 40,\n            height: 40,\n            src: info.mvCover,\n            type: ImageType.avatar,\n          ),\n          Column(\n            mainAxisAlignment: MainAxisAlignment.center,\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              Text(\n                info.musicTitle!,\n                maxLines: 1,\n                overflow: TextOverflow.ellipsis,\n                style: theme.textTheme.titleMedium,\n              ),\n              Obx(() {\n                final count = _controller.loadingState.value.dataOrNull?.length;\n                return count == null\n                    ? const SizedBox.shrink()\n                    : Text(\n                        '共$count条视频',\n                        style: theme.textTheme.labelMedium,\n                      );\n              }),\n            ],\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/music/view.dart",
    "content": "import 'dart:io';\nimport 'dart:math';\n\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/custom_icon.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/image_viewer/hero.dart';\nimport 'package:PiliPlus/common/widgets/marquee.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/music.dart';\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models/common/image_preview_type.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models_new/music/bgm_detail.dart';\nimport 'package:PiliPlus/pages/common/dyn/common_dyn_page.dart';\nimport 'package:PiliPlus/pages/music/controller.dart';\nimport 'package:PiliPlus/pages/music/video/view.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/extension/get_ext.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/extension/string_ext.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:fl_chart/fl_chart.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:font_awesome_flutter/font_awesome_flutter.dart';\nimport 'package:get/get.dart';\n\nclass MusicDetailPage extends StatefulWidget {\n  const MusicDetailPage({super.key});\n\n  @override\n  State<MusicDetailPage> createState() => _MusicDetailPageState();\n}\n\nclass _MusicDetailPageState extends CommonDynPageState<MusicDetailPage> {\n  @override\n  final MusicDetailController controller = Get.putOrFind(\n    MusicDetailController.new,\n    tag: Get.parameters['musicId']!,\n  );\n\n  @override\n  dynamic get arguments => null;\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: _buildAppBar(),\n      body: Padding(\n        padding: EdgeInsets.only(left: padding.left, right: padding.right),\n        child: isPortrait\n            ? refreshIndicator(\n                onRefresh: controller.onRefresh,\n                child: _buildBody(theme),\n              )\n            : _buildBody(theme),\n      ),\n    );\n  }\n\n  PreferredSizeWidget _buildAppBar() => AppBar(\n    title: Padding(\n      padding: const EdgeInsets.only(right: 12),\n      child: Obx(\n        () {\n          if (controller.infoState.value case Success(:final response)) {\n            final showTitle = controller.showTitle.value;\n            return AnimatedOpacity(\n              opacity: showTitle ? 1 : 0,\n              duration: const Duration(milliseconds: 300),\n              child: IgnorePointer(\n                ignoring: !showTitle,\n                child: Row(\n                  spacing: 8,\n                  children: [\n                    NetworkImgLayer(\n                      src: response.mvCover,\n                      width: 36,\n                      height: 36,\n                      type: ImageType.avatar,\n                    ),\n                    Text(response.musicTitle!),\n                  ],\n                ),\n              ),\n            );\n          }\n          return const SizedBox.shrink();\n        },\n      ),\n    ),\n    actions: isPortrait\n        ? null\n        : [\n            ratioWidget(maxWidth),\n            const SizedBox(width: 16),\n          ],\n  );\n\n  Widget _buildBody(ThemeData theme) => Obx(() {\n    switch (controller.infoState.value) {\n      case Success(:final response):\n        double padding = max(maxWidth / 2 - Grid.smallCardWidth, 0);\n        final Widget child;\n        if (isPortrait) {\n          child = Padding(\n            padding: EdgeInsets.symmetric(horizontal: padding),\n            child: CustomScrollView(\n              controller: scrollController,\n              physics: const AlwaysScrollableScrollPhysics(),\n              slivers: [\n                SliverToBoxAdapter(\n                  child: _buildCard(theme, response, maxWidth),\n                ),\n                SliverToBoxAdapter(\n                  child: _buildChart(theme, response, maxWidth),\n                ),\n                buildReplyHeader(theme),\n                Obx(() => replyList(theme, controller.loadingState.value)),\n              ],\n            ),\n          );\n        } else {\n          padding = padding / 4;\n          final flex = controller.ratio[0].toInt();\n          final flex1 = controller.ratio[1].toInt();\n          final leftWidth =\n              (maxWidth - this.padding.horizontal) * (flex / (flex + flex1)) -\n              padding;\n          child = Row(\n            children: [\n              Expanded(\n                flex: flex,\n                child: CustomScrollView(\n                  controller: scrollController,\n                  physics: const AlwaysScrollableScrollPhysics(),\n                  slivers: [\n                    SliverPadding(\n                      padding: EdgeInsets.only(\n                        left: padding,\n                      ),\n                      sliver: SliverToBoxAdapter(\n                        child: _buildCard(theme, response, leftWidth),\n                      ),\n                    ),\n                    SliverPadding(\n                      padding: EdgeInsets.only(\n                        left: padding,\n                        bottom: this.padding.bottom + 100,\n                      ),\n                      sliver: SliverToBoxAdapter(\n                        child: _buildChart(theme, response, leftWidth),\n                      ),\n                    ),\n                  ],\n                ),\n              ),\n              Expanded(\n                flex: flex1,\n                child: Padding(\n                  padding: EdgeInsets.only(right: padding),\n                  child: Scaffold(\n                    backgroundColor: Colors.transparent,\n                    resizeToAvoidBottomInset: false,\n                    body: refreshIndicator(\n                      onRefresh: controller.onRefresh,\n                      child: CustomScrollView(\n                        controller: scrollController,\n                        physics: const AlwaysScrollableScrollPhysics(),\n                        slivers: [\n                          buildReplyHeader(theme),\n                          Obx(\n                            () =>\n                                replyList(theme, controller.loadingState.value),\n                          ),\n                        ],\n                      ),\n                    ),\n                  ),\n                ),\n              ),\n            ],\n          );\n        }\n        return Stack(\n          clipBehavior: Clip.none,\n          children: [\n            child,\n            _buildBottom(theme, response),\n          ],\n        );\n      default:\n        return const SizedBox.shrink();\n    }\n  });\n\n  Widget _buildBottom(ThemeData theme, MusicDetail item) {\n    if (!controller.showDynActionBar) {\n      return Positioned(\n        right: kFloatingActionButtonMargin,\n        bottom: 0,\n        child: SlideTransition(\n          position: fabAnimation,\n          child: fabButton,\n        ),\n      );\n    }\n\n    final primary = theme.colorScheme.primary;\n    final outline = theme.colorScheme.outline;\n    final style = TextButton.styleFrom(\n      tapTargetSize: .padded,\n      padding: const EdgeInsets.symmetric(horizontal: 15),\n      foregroundColor: outline,\n    );\n\n    Widget textIconButton({\n      required IconData icon,\n      required String text,\n      int? count,\n      bool status = false,\n      required VoidCallback onPressed,\n      IconData? activatedIcon,\n    }) {\n      final color = status ? primary : outline;\n      return TextButton.icon(\n        onPressed: onPressed,\n        icon: Icon(\n          status ? activatedIcon : icon,\n          size: 16,\n          color: color,\n        ),\n        style: style,\n        label: Text(\n          count != null ? NumUtils.numFormat(count) : text,\n          style: TextStyle(color: color),\n        ),\n      );\n    }\n\n    return Positioned(\n      left: 0,\n      right: 0,\n      bottom: 0,\n      child: SlideTransition(\n        position: fabAnimation,\n        child: Column(\n          mainAxisSize: MainAxisSize.min,\n          crossAxisAlignment: CrossAxisAlignment.end,\n          children: [\n            Padding(\n              padding: const EdgeInsets.only(\n                right: kFloatingActionButtonMargin,\n                bottom: kFloatingActionButtonMargin,\n              ),\n              child: replyButton,\n            ),\n            Container(\n              decoration: BoxDecoration(\n                color: theme.colorScheme.surface,\n                border: Border(\n                  top: BorderSide(\n                    color: theme.colorScheme.outline.withValues(\n                      alpha: 0.08,\n                    ),\n                  ),\n                ),\n              ),\n              padding: EdgeInsets.only(bottom: padding.bottom),\n              child: Row(\n                mainAxisAlignment: MainAxisAlignment.spaceAround,\n                children: [\n                  // TODO\n                  // Expanded(\n                  //   child: textIconButton(\n                  //     icon: FontAwesomeIcons.shareFromSquare,\n                  //     text: '转发',\n                  //     count: item.musicShares,\n                  //     onPressed: () {\n                  //       final data = controller.infoState.value.dataOrNull;\n                  //       if (data != null) {\n                  //         showModalBottomSheet(\n                  //           context: context,\n                  //           isScrollControlled: true,\n                  //           useSafeArea: true,\n                  //           builder: (context) => RepostPanel(\n                  //             rid: controller.oid,\n                  //             dynType: null,\n                  //             pic: data.mvCover,\n                  //             title: data.musicTitle,\n                  //           ),\n                  //         );\n                  //       }\n                  //     },\n                  //   ),\n                  // ),\n                  Expanded(\n                    child: textIconButton(\n                      icon: CustomIcons.share_node,\n                      text: '分享',\n                      onPressed: () => Utils.shareText(controller.shareUrl),\n                    ),\n                  ),\n                  Expanded(\n                    child: Builder(\n                      builder: (context) => textIconButton(\n                        icon: FontAwesomeIcons.thumbsUp,\n                        activatedIcon: FontAwesomeIcons.solidThumbsUp,\n                        text: '点赞',\n                        count: item.wishCount,\n                        status: item.wishListen ?? false,\n                        onPressed: () async {\n                          if (!Accounts.main.isLogin) {\n                            SmartDialog.showToast('请先登录');\n                            return;\n                          }\n                          final hasLike = item.wishListen ?? false;\n                          final res = await MusicHttp.wishUpdate(\n                            controller.musicId,\n                            hasLike,\n                          );\n                          if (res.isSuccess) {\n                            if (hasLike) {\n                              item.wishCount--;\n                            } else {\n                              item.wishCount++;\n                            }\n                            item.wishListen = !hasLike;\n                            if (context.mounted) {\n                              (context as Element).markNeedsBuild();\n                            }\n                          } else {\n                            res.toast();\n                          }\n                        },\n                      ),\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget _buildArtist(Artist artist, TextStyle? style) {\n    Widget child = Text('${artist.identity}: ${artist.name}', style: style);\n    if (!artist.face.isNullOrEmpty) {\n      child = Row(\n        spacing: 2,\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          NetworkImgLayer(\n            src: artist.face,\n            width: 15,\n            height: 15,\n            type: ImageType.avatar,\n          ),\n          child,\n        ],\n      );\n    }\n    child = GestureDetector(\n      onTap: artist.mid == null || artist.mid == 0\n          ? () => Utils.copyText(artist.name!)\n          : () => Get.toNamed(\n              '/member',\n              parameters: {'mid': artist.mid!.toString()},\n            ),\n      child: child,\n    );\n    return child;\n  }\n\n  Widget _buildRank(\n    int? rank,\n    String name,\n    ThemeData theme, [\n    VoidCallback? onTap,\n  ]) {\n    final outline = theme.colorScheme.outline;\n    final child = Column(\n      mainAxisSize: MainAxisSize.min,\n      children: [\n        Text(NumUtils.numFormat(rank)),\n        Text(\n          name,\n          style: theme.textTheme.bodySmall!.copyWith(color: outline),\n        ),\n      ],\n    );\n    return onTap == null\n        ? child\n        : InkWell(\n            onTap: onTap,\n            borderRadius: const BorderRadius.all(Radius.circular(6)),\n            child: Padding(\n              padding: const EdgeInsets.all(4),\n              child: Row(\n                mainAxisSize: MainAxisSize.min,\n                children: [\n                  child,\n                  Icon(\n                    size: 18,\n                    color: outline,\n                    Icons.keyboard_arrow_right,\n                  ),\n                ],\n              ),\n            ),\n          );\n  }\n\n  Widget _buildCard(ThemeData theme, MusicDetail item, double maxWidth) {\n    final textTheme = theme.textTheme;\n    return SizedBox(\n      width: maxWidth,\n      child: Card(\n        margin: const EdgeInsets.all(8),\n        child: Padding(\n          padding: const EdgeInsets.all(16),\n          child: Column(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              Row(\n                spacing: 10,\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  GestureDetector(\n                    onTap: () => PageUtils.imageView(\n                      imgList: [SourceModel(url: item.mvCover!)],\n                    ),\n                    child: fromHero(\n                      tag: item.mvCover!,\n                      child: NetworkImgLayer(\n                        src: item.mvCover,\n                        width: 80,\n                        height: 80,\n                      ),\n                    ),\n                  ),\n                  Expanded(\n                    child: Column(\n                      spacing: 2,\n                      mainAxisSize: MainAxisSize.min,\n                      crossAxisAlignment: CrossAxisAlignment.start,\n                      children: [\n                        GestureDetector(\n                          onTap: () => _searchMusic(item),\n                          onLongPress: () => Utils.copyText(item.musicTitle!),\n                          behavior: HitTestBehavior.opaque,\n                          child: MarqueeText(\n                            item.musicTitle!,\n                            spacing: 30,\n                            style: textTheme.titleMedium,\n                          ),\n                        ),\n                        Wrap(\n                          spacing: 8,\n                          runSpacing: 2,\n                          children: [\n                            if (!item.artistsList.isNullOrEmpty)\n                              for (final artist in item.artistsList!)\n                                _buildArtist(artist, textTheme.bodySmall),\n                            if (!item.musicPublish.isNullOrEmpty)\n                              Text(\n                                '发行日期：${item.musicPublish}',\n                                style: textTheme.bodySmall!.copyWith(\n                                  color: theme.colorScheme.outline,\n                                ),\n                              ),\n                          ],\n                        ),\n                        const SizedBox(height: 3),\n                        Wrap(\n                          spacing: 16,\n                          children: [\n                            if (!item.musicRank.isNullOrEmpty)\n                              PBadge(\n                                text: item.musicRank,\n                                type: PBadgeType.secondary,\n                                isStack: false,\n                                fontSize: 11,\n                              ),\n                            if (item.mvCid != null && item.mvCid != 0)\n                              GestureDetector(\n                                onTap: () => PageUtils.toVideoPage(\n                                  bvid: item.mvBvid,\n                                  cid: item.mvCid!,\n                                  aid: item.mvAid,\n                                ),\n                                child: DecoratedBox(\n                                  decoration: BoxDecoration(\n                                    borderRadius: const BorderRadius.all(\n                                      Radius.circular(4),\n                                    ),\n                                    color: theme.colorScheme.secondaryContainer\n                                        .withValues(alpha: 0.5),\n                                  ),\n                                  child: Padding(\n                                    padding: const EdgeInsets.symmetric(\n                                      vertical: 3,\n                                      horizontal: 4,\n                                    ),\n                                    child: Row(\n                                      mainAxisSize: MainAxisSize.min,\n                                      children: [\n                                        Icon(\n                                          Icons.play_circle_outline,\n                                          size: 11,\n                                          color: theme\n                                              .colorScheme\n                                              .onSecondaryContainer,\n                                        ),\n                                        Text(\n                                          '看MV',\n                                          style: TextStyle(\n                                            color: theme\n                                                .colorScheme\n                                                .onSecondaryContainer,\n                                            height: 1,\n                                            fontSize: 11,\n                                            fontWeight: FontWeight.bold,\n                                          ),\n                                          strutStyle: const StrutStyle(\n                                            leading: 0,\n                                            height: 1,\n                                            fontSize: 11,\n                                            fontWeight: FontWeight.bold,\n                                          ),\n                                        ),\n                                      ],\n                                    ),\n                                  ),\n                                ),\n                              ),\n                          ],\n                        ),\n                      ],\n                    ),\n                  ),\n                ],\n              ),\n              const SizedBox(height: 10),\n              SelectableText(\n                [\n                  if (!(item.originArtist ?? item.originArtistList)\n                      .isNullOrEmpty)\n                    '原唱：${item.originArtist ?? item.originArtistList}',\n                  if (!item.album.isNullOrEmpty) '专辑：${item.album}',\n                  if (!item.musicSource.isNullOrEmpty) '出处：${item.musicSource}',\n                ].join('\\n'),\n              ),\n              const Divider(),\n              Row(\n                mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                children: [\n                  const Text('热歌榜排名'),\n                  _buildRank(item.hotSongHeat?.lastHeat, '热度', theme),\n                  _buildRank(item.listenPv, '总播放量', theme),\n                  _buildRank(\n                    item.musicRelation,\n                    '使用稿件量',\n                    theme,\n                    () => Get.to(\n                      const MusicRecommendPage(),\n                      arguments: (id: controller.musicId, item: item),\n                    ),\n                  ),\n                ],\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget? _buildChart(ThemeData theme, MusicDetail item, double maxWidth) {\n    final heat = item.hotSongHeat?.songHeat;\n    if (heat == null || heat.isEmpty) return null;\n    final colorScheme = theme.colorScheme;\n    int maxHeat = heat.first.heat;\n    int minHeat = heat.first.heat;\n    for (int i = 1; i < heat.length; i++) {\n      final h = heat[i].heat;\n      if (h > maxHeat) maxHeat = h;\n      if (h < minHeat) minHeat = h;\n    }\n    return Padding(\n      padding: const EdgeInsets.only(top: 8),\n      child: Column(\n        spacing: 8,\n        children: [\n          Text('近${heat.length}日热度趋势', style: theme.textTheme.titleMedium),\n          SizedBox(\n            width: maxWidth,\n            height: maxWidth * 0.5,\n            child: Padding(\n              padding: const EdgeInsetsGeometry.only(top: 4, right: 22),\n              child: LineChart(\n                LineChartData(\n                  lineTouchData: const LineTouchData(enabled: false),\n                  titlesData: FlTitlesData(\n                    show: true,\n                    rightTitles: const AxisTitles(\n                      sideTitles: SideTitles(showTitles: false),\n                    ),\n                    topTitles: const AxisTitles(\n                      sideTitles: SideTitles(showTitles: false),\n                    ),\n                    leftTitles: const AxisTitles(\n                      sideTitles: SideTitles(\n                        reservedSize: 55,\n                        showTitles: true,\n                      ),\n                    ),\n                    bottomTitles: AxisTitles(\n                      sideTitles: SideTitles(\n                        showTitles: true,\n                        reservedSize: 30 * sqrt2,\n                        getTitlesWidget: (index, meta) {\n                          return SideTitleWidget(\n                            angle: -pi / 4,\n                            space: 8 * sqrt2,\n                            meta: meta,\n                            child: Text(\n                              DateFormatUtils.shortFormat.format(\n                                DateTime.fromMillisecondsSinceEpoch(\n                                  heat[index.toInt()].date * 1000,\n                                ),\n                              ),\n                            ),\n                          );\n                        },\n                      ),\n                    ),\n                  ),\n                  borderData: FlBorderData(\n                    show: true,\n                    border: Border.all(color: colorScheme.onSurface),\n                  ),\n                  minX: 0,\n                  maxX: (heat.length - 1).toDouble(),\n                  minY: minHeat.toDouble(),\n                  maxY: maxHeat.toDouble(),\n                  lineBarsData: [\n                    LineChartBarData(\n                      spots: List.generate(\n                        heat.length,\n                        (index) => FlSpot(\n                          index.toDouble(),\n                          heat[index].heat.toDouble(),\n                        ),\n                      ),\n                      color: colorScheme.primary,\n                      barWidth: 1,\n                      dotData: const FlDotData(show: false),\n                      belowBarData: BarAreaData(\n                        show: true,\n                        gradient: LinearGradient(\n                          begin: Alignment.topCenter,\n                          end: Alignment.bottomCenter,\n                          colors: [\n                            colorScheme.primary.withValues(alpha: 0.5),\n                            colorScheme.onPrimary.withValues(alpha: 0.5),\n                          ],\n                        ),\n                      ),\n                    ),\n                  ],\n                ),\n              ),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Future<void> _searchMusic(MusicDetail item) async {\n    final res =\n        Platform.isAndroid &&\n        (await Utils.channel.invokeMethod<bool>('music', {\n              'title': item.musicTitle,\n              'artist': item.originArtist ?? item.originArtistList,\n              'album': item.album,\n            }) ??\n            false);\n    if (!res) {\n      Utils.copyText(item.musicTitle!);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/music/widget/music_video_card_h.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/marquee.dart';\nimport 'package:PiliPlus/common/widgets/stat/stat.dart';\nimport 'package:PiliPlus/http/search.dart';\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models/common/stat_type.dart';\nimport 'package:PiliPlus/models_new/music/bgm_recommend_list.dart';\nimport 'package:PiliPlus/utils/duration_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\n\nclass MusicVideoCardH extends StatelessWidget {\n  final BgmRecommend videoItem;\n\n  const MusicVideoCardH({\n    super.key,\n    required this.videoItem,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    void onLongPress() => imageSaveDialog(\n      title: videoItem.title,\n      cover: videoItem.cover,\n      bvid: videoItem.bvid,\n    );\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onTap: () async {\n          int? cid =\n              videoItem.cid ?? await SearchHttp.ab2c(bvid: videoItem.bvid);\n          if (cid != null) {\n            PageUtils.toVideoPage(\n              bvid: videoItem.bvid,\n              cid: cid,\n              cover: videoItem.cover,\n              title: videoItem.title,\n            );\n          }\n        },\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        child: Padding(\n          padding: const EdgeInsets.symmetric(\n            horizontal: StyleString.safeSpace,\n            vertical: 5,\n          ),\n          child: Row(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              AspectRatio(\n                aspectRatio: StyleString.aspectRatio,\n                child: LayoutBuilder(\n                  builder: (context, boxConstraints) {\n                    double maxWidth = boxConstraints.maxWidth;\n                    double maxHeight = boxConstraints.maxHeight;\n                    return Stack(\n                      clipBehavior: Clip.none,\n                      children: [\n                        NetworkImgLayer(\n                          src: videoItem.cover,\n                          width: maxWidth,\n                          height: maxHeight,\n                        ),\n                        PBadge(\n                          text: DurationUtils.formatDuration(\n                            videoItem.duration,\n                          ),\n                          right: 6.0,\n                          bottom: 6.0,\n                          type: PBadgeType.gray,\n                        ),\n                      ],\n                    );\n                  },\n                ),\n              ),\n              const SizedBox(width: 10),\n              content(context),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget content(BuildContext context) {\n    return Expanded(\n      child: Column(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          Expanded(\n            child: Text(\n              videoItem.title!,\n              textAlign: TextAlign.start,\n              style: const TextStyle(\n                letterSpacing: 0.3,\n              ),\n              maxLines: 2,\n              overflow: TextOverflow.ellipsis,\n            ),\n          ),\n          Row(\n            spacing: 8,\n            children: [\n              StatWidget(\n                type: StatType.play,\n                value: videoItem.play,\n              ),\n              StatWidget(\n                type: StatType.danmaku,\n                value: videoItem.danmu,\n              ),\n            ],\n          ),\n          const SizedBox(height: 3),\n          NormalMarquee(\n            velocity: 25,\n            spacing: 30,\n            child: Row(\n              spacing: 8,\n              children: [\n                if (videoItem.labelList case final labelList?)\n                  for (final label in labelList)\n                    PBadge(\n                      text: label.name,\n                      isStack: false,\n                      size: PBadgeSize.small,\n                      type: PBadgeType.secondary,\n                    ),\n                Text(\n                  videoItem.upNickName!,\n                  maxLines: 1,\n                  overflow: TextOverflow.ellipsis,\n                  style: TextStyle(\n                    fontSize: 12,\n                    color: Theme.of(context).colorScheme.outline,\n                  ),\n                ),\n              ],\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/my_reply/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/common/widgets/dialog/export_import.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/view_sliver_safe_area.dart';\nimport 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'\n    show ReplyInfo;\nimport 'package:PiliPlus/pages/video/reply/widgets/reply_item_grpc.dart';\nimport 'package:PiliPlus/utils/app_scheme.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/reply_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:PiliPlus/utils/waterfall.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:get/get_core/src/get_main.dart';\nimport 'package:get/get_navigation/src/extension_navigation.dart';\nimport 'package:get/get_rx/get_rx.dart';\nimport 'package:waterfall_flow/waterfall_flow.dart';\n\nclass MyReply extends StatefulWidget {\n  const MyReply({super.key});\n\n  @override\n  State<MyReply> createState() => _MyReplyState();\n}\n\nclass _MyReplyState extends State<MyReply> with DynMixin {\n  final List<ReplyInfo> _replies = <ReplyInfo>[];\n\n  @override\n  void initState() {\n    super.initState();\n    _initReply();\n  }\n\n  void _initReply() {\n    _replies\n      ..assignAll(GStorage.reply!.values.map(ReplyInfo.fromBuffer))\n      ..sort((a, b) => b.ctime.compareTo(a.ctime)); // rpid not aligned;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text('我的评论'),\n        actions: [\n          if (kDebugMode)\n            IconButton(\n              tooltip: 'Clear',\n              onPressed: () => showConfirmDialog(\n                context: context,\n                title: 'Clear Local Storage?',\n                onConfirm: () {\n                  GStorage.reply!.clear();\n                  _replies.clear();\n                  setState(() {});\n                },\n              ),\n              icon: const Icon(Icons.clear_all),\n            ),\n          IconButton(\n            tooltip: '导出',\n            onPressed: _showExportDialog,\n            icon: const Icon(Icons.file_upload_outlined),\n          ),\n          IconButton(\n            tooltip: '导入',\n            onPressed: _showImportDialog,\n            icon: const Icon(Icons.file_download_outlined),\n          ),\n          const SizedBox(width: 6),\n        ],\n      ),\n      body: CustomScrollView(\n        physics: const AlwaysScrollableScrollPhysics(),\n        slivers: [\n          _replies.isNotEmpty\n              ? ViewSliverSafeArea(\n                  sliver: SliverWaterfallFlow(\n                    gridDelegate: dynGridDelegate,\n                    delegate: SliverChildBuilderDelegate(\n                      childCount: _replies.length,\n                      (context, index) => ReplyItemGrpc(\n                        replyLevel: 0,\n                        needDivider: false,\n                        replyItem: _replies[index],\n                        replyReply: _replyReply,\n                        onDelete: (_, _) => _onDelete(index),\n                        onCheckReply: _onCheckReply,\n                      ),\n                    ),\n                  ),\n                )\n              : const HttpError(),\n        ],\n      ),\n    );\n  }\n\n  void _replyReply(ReplyInfo replyInfo, int? rpid) {\n    switch (replyInfo.type.toInt()) {\n      case 1:\n        PiliScheme.videoPush(\n          replyInfo.oid.toInt(),\n          null,\n        );\n      case 12:\n        PageUtils.toDupNamed(\n          '/articlePage',\n          parameters: {\n            'id': replyInfo.oid.toString(),\n            'type': 'read',\n          },\n        );\n      case _:\n        PageUtils.pushDynFromId(\n          rid: replyInfo.oid.toString(),\n          type: replyInfo.type,\n        );\n    }\n  }\n\n  void _onDelete(int index) {\n    _replies.removeAt(index);\n    setState(() {});\n  }\n\n  void _onCheckReply(ReplyInfo replyInfo) {\n    final oid = replyInfo.oid.toInt();\n    ReplyUtils.onCheckReply(\n      replyInfo: replyInfo,\n      biliSendCommAntifraud: Pref.biliSendCommAntifraud,\n      sourceId: switch (oid) {\n        1 => IdUtils.av2bv(oid),\n        _ => oid.toString(),\n      },\n      isManual: true,\n    );\n  }\n\n  String _onExport() {\n    return Utils.jsonEncoder.convert(\n      _replies.map((e) => e.toProto3Json()).toList(),\n    );\n  }\n\n  void _showExportDialog() {\n    const style = TextStyle(fontSize: 14);\n    showDialog(\n      context: context,\n      builder: (context) => SimpleDialog(\n        clipBehavior: .hardEdge,\n        contentPadding: const .symmetric(vertical: 12),\n        children: [\n          ListTile(\n            dense: true,\n            title: const Text('导出至剪贴板', style: style),\n            onTap: () {\n              Get.back();\n              exportToClipBoard(onExport: _onExport);\n            },\n          ),\n          ListTile(\n            dense: true,\n            title: const Text('导出文件至本地', style: style),\n            onTap: () {\n              Get.back();\n              exportToLocalFile(\n                onExport: _onExport,\n                localFileName: () => 'reply',\n              );\n            },\n          ),\n        ],\n      ),\n    );\n  }\n\n  Future<void> _onImport(List<dynamic> list) async {\n    await GStorage.reply!.putAll({\n      for (var e in list)\n        e['id'].toString(): (ReplyInfo.create()..mergeFromProto3Json(e))\n            .writeToBuffer(),\n    });\n    if (mounted) {\n      _initReply();\n      setState(() {});\n    }\n  }\n\n  void _showImportDialog() {\n    const style = TextStyle(fontSize: 14);\n    showDialog(\n      context: context,\n      builder: (context) => SimpleDialog(\n        clipBehavior: .hardEdge,\n        contentPadding: const .symmetric(vertical: 12),\n        children: [\n          ListTile(\n            dense: true,\n            title: const Text('从剪贴板导入', style: style),\n            onTap: () {\n              Get.back();\n              importFromClipBoard<List<dynamic>>(\n                context,\n                title: '评论',\n                onExport: _onExport,\n                onImport: _onImport,\n                showConfirmDialog: false,\n              );\n            },\n          ),\n          ListTile(\n            dense: true,\n            title: const Text('从本地文件导入', style: style),\n            onTap: () {\n              Get.back();\n              importFromLocalFile<List<dynamic>>(onImport: _onImport);\n            },\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/pgc/controller.dart",
    "content": "import 'package:PiliPlus/http/fav.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/pgc.dart';\nimport 'package:PiliPlus/models/common/home_tab_type.dart';\nimport 'package:PiliPlus/models_new/fav/fav_pgc/list.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_index_result/list.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_timeline/result.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:PiliPlus/services/account_service.dart';\nimport 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:flutter/widgets.dart' show ScrollController;\nimport 'package:get/get.dart';\n\nclass PgcController\n    extends CommonListController<List<PgcIndexItem>?, PgcIndexItem>\n    with AccountMixin {\n  PgcController({required this.tabType})\n    : indexType = tabType == HomeTabType.cinema ? 102 : null;\n\n  final HomeTabType tabType;\n  final int? indexType;\n\n  late final showPgcTimeline =\n      tabType == HomeTabType.bangumi && Pref.showPgcTimeline;\n\n  @override\n  final accountService = Get.find<AccountService>();\n\n  @override\n  void onInit() {\n    super.onInit();\n\n    queryData();\n    queryPgcFollow();\n    if (showPgcTimeline) {\n      queryPgcTimeline();\n    }\n  }\n\n  @override\n  Future<void> onRefresh() {\n    if (accountService.isLogin.value) {\n      _refreshPgcFollow();\n    }\n    if (showPgcTimeline) {\n      queryPgcTimeline();\n    }\n    return super.onRefresh();\n  }\n\n  void _refreshPgcFollow() {\n    followPage = 1;\n    followEnd = false;\n    queryPgcFollow();\n  }\n\n  // follow\n  late int followPage = 1;\n  late RxInt followCount = (-1).obs;\n  late bool followLoading = false;\n  late bool followEnd = false;\n  late Rx<LoadingState<List<FavPgcItemModel>?>> followState =\n      LoadingState<List<FavPgcItemModel>?>.loading().obs;\n  final followController = ScrollController();\n\n  // timeline\n  late Rx<LoadingState<List<TimelineResult>?>> timelineState =\n      LoadingState<List<TimelineResult>?>.loading().obs;\n\n  Future<void> queryPgcTimeline() async {\n    final res = await Future.wait([\n      PgcHttp.pgcTimeline(types: 1, before: 6, after: 6),\n      PgcHttp.pgcTimeline(types: 4, before: 6, after: 6),\n    ]);\n    final list1 = res.first.dataOrNull;\n    final list2 = res[1].dataOrNull;\n    if (list1 != null &&\n        list2 != null &&\n        list1.isNotEmpty &&\n        list2.isNotEmpty) {\n      for (var i = 0; i < list1.length; i++) {\n        list1[i].addAll(list2[i]);\n      }\n    }\n    timelineState.value = Success(list1 ?? list2);\n  }\n\n  // 我的订阅\n  Future<void> queryPgcFollow([bool isRefresh = true]) async {\n    if (!accountService.isLogin.value ||\n        followLoading ||\n        (!isRefresh && followEnd)) {\n      return;\n    }\n    followLoading = true;\n    final res = await FavHttp.favPgc(\n      type: tabType == HomeTabType.bangumi ? 1 : 2,\n      pn: followPage,\n    );\n\n    if (res case Success(:final response)) {\n      final list = response.list;\n      followCount.value = response.total ?? -1;\n\n      if (list == null || list.isEmpty) {\n        followEnd = true;\n        if (isRefresh) {\n          followState.value = Success(list);\n        }\n        followLoading = false;\n        return;\n      }\n\n      if (isRefresh) {\n        if (list.length >= followCount.value) {\n          followEnd = true;\n        }\n        followState.value = Success(list);\n        followController.jumpToTop();\n      } else if (followState.value case Success(:final response)) {\n        final currentList = response!..addAll(list);\n        if (currentList.length >= followCount.value) {\n          followEnd = true;\n        }\n        followState.refresh();\n      }\n      followPage++;\n    } else if (isRefresh) {\n      followState.value = res as Error;\n    }\n    followLoading = false;\n  }\n\n  @override\n  Future<LoadingState<List<PgcIndexItem>?>> customGetData() => PgcHttp.pgcIndex(\n    page: page,\n    indexType: indexType,\n  );\n\n  @override\n  void onClose() {\n    followController.dispose();\n    super.onClose();\n  }\n\n  @override\n  void onChangeAccount(bool isLogin) {\n    if (isLogin) {\n      _refreshPgcFollow();\n    } else {\n      followState.value = LoadingState.loading();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/pgc/view.dart",
    "content": "import 'dart:math';\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/button/more_btn.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/common/widgets/view_safe_area.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/fav_type.dart';\nimport 'package:PiliPlus/models/common/home_tab_type.dart';\nimport 'package:PiliPlus/models_new/fav/fav_pgc/list.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_index_result/list.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_timeline/result.dart';\nimport 'package:PiliPlus/pages/pgc/controller.dart';\nimport 'package:PiliPlus/pages/pgc/widgets/pgc_card_v.dart';\nimport 'package:PiliPlus/pages/pgc/widgets/pgc_card_v_timeline.dart';\nimport 'package:PiliPlus/pages/pgc_index/controller.dart';\nimport 'package:PiliPlus/pages/pgc_index/view.dart';\nimport 'package:PiliPlus/pages/pgc_index/widgets/pgc_card_v_pgc_index.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass PgcPage extends StatefulWidget {\n  const PgcPage({\n    super.key,\n    required this.tabType,\n  });\n\n  final HomeTabType tabType;\n\n  @override\n  State<PgcPage> createState() => _PgcPageState();\n}\n\nclass _PgcPageState extends State<PgcPage> with AutomaticKeepAliveClientMixin {\n  late final PgcController controller;\n\n  @override\n  void initState() {\n    controller = Get.put(\n      PgcController(tabType: widget.tabType),\n      tag: widget.tabType.name,\n    );\n    super.initState();\n  }\n\n  @override\n  bool get wantKeepAlive => true;\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final ThemeData theme = Theme.of(context);\n    return refreshIndicator(\n      onRefresh: controller.onRefresh,\n      child: CustomScrollView(\n        controller: controller.scrollController,\n        physics: const AlwaysScrollableScrollPhysics(),\n        slivers: [\n          _buildFollow(theme),\n          if (controller.showPgcTimeline)\n            SliverToBoxAdapter(\n              child: SizedBox(\n                height:\n                    Grid.smallCardWidth / 2 / 0.75 +\n                    MediaQuery.textScalerOf(context).scale(96),\n                child: Obx(\n                  () => _buildTimeline(theme, controller.timelineState.value),\n                ),\n              ),\n            ),\n          ..._buildRcmd(theme),\n        ],\n      ),\n    );\n  }\n\n  Widget _buildTimeline(\n    ThemeData theme,\n    LoadingState<List<TimelineResult>?> loadingState,\n  ) => switch (loadingState) {\n    Loading() => m3eLoading,\n    Success(:final response) =>\n      response != null && response.isNotEmpty\n          ? Builder(\n              builder: (context) {\n                final initialIndex = max(\n                  0,\n                  response.indexWhere((item) => item.isToday == 1),\n                );\n                return DefaultTabController(\n                  initialIndex: initialIndex,\n                  length: response.length,\n                  child: Column(\n                    children: [\n                      Row(\n                        children: [\n                          const SizedBox(width: 16),\n                          Text(\n                            '追番时间表',\n                            style: theme.textTheme.titleMedium,\n                          ),\n                          const SizedBox(width: 16),\n                          Expanded(\n                            child: TabBar(\n                              isScrollable: true,\n                              tabAlignment: TabAlignment.start,\n                              dividerHeight: 0,\n                              overlayColor: const WidgetStatePropertyAll(\n                                Colors.transparent,\n                              ),\n                              splashFactory: NoSplash.splashFactory,\n                              padding: const EdgeInsets.only(right: 10),\n                              indicatorPadding: const EdgeInsets.symmetric(\n                                horizontal: 4,\n                                vertical: 10,\n                              ),\n                              indicator: BoxDecoration(\n                                color: theme.colorScheme.secondaryContainer,\n                                borderRadius: const BorderRadius.all(\n                                  Radius.circular(20),\n                                ),\n                              ),\n                              indicatorSize: TabBarIndicatorSize.tab,\n                              labelColor:\n                                  theme.colorScheme.onSecondaryContainer,\n                              labelStyle:\n                                  TabBarTheme.of(\n                                    context,\n                                  ).labelStyle?.copyWith(fontSize: 14) ??\n                                  const TextStyle(fontSize: 14),\n                              dividerColor: Colors.transparent,\n                              tabs: response.map(\n                                (item) {\n                                  return Tab(\n                                    text:\n                                        '${item.date} ${item.isToday == 1 ? '今天' : '周${const [\n                                                '一',\n                                                '二',\n                                                '三',\n                                                '四',\n                                                '五',\n                                                '六',\n                                                '日',\n                                              ][item.dayOfWeek! - 1]}'}',\n                                  );\n                                },\n                              ).toList(),\n                            ),\n                          ),\n                        ],\n                      ),\n                      Expanded(\n                        child: TabBarView(\n                          physics: const NeverScrollableScrollPhysics(),\n                          children: response.map((item) {\n                            if (item.episodes.isNullOrEmpty) {\n                              return const SizedBox.shrink();\n                            }\n                            return ListView.builder(\n                              physics: const AlwaysScrollableScrollPhysics(),\n                              scrollDirection: Axis.horizontal,\n                              itemCount: item.episodes!.length,\n                              padding: EdgeInsets.zero,\n                              itemBuilder: (context, index) {\n                                return Container(\n                                  width: Grid.smallCardWidth / 2,\n                                  margin: EdgeInsets.only(\n                                    left: StyleString.safeSpace,\n                                    right: index == item.episodes!.length - 1\n                                        ? StyleString.safeSpace\n                                        : 0,\n                                  ),\n                                  child: PgcCardVTimeline(\n                                    item: item.episodes![index],\n                                  ),\n                                );\n                              },\n                            );\n                          }).toList(),\n                        ),\n                      ),\n                    ],\n                  ),\n                );\n              },\n            )\n          : const SizedBox.shrink(),\n    Error(:final errMsg) => GestureDetector(\n      behavior: HitTestBehavior.opaque,\n      onTap: controller.queryPgcTimeline,\n      child: Container(\n        padding: const EdgeInsets.symmetric(horizontal: 16),\n        alignment: Alignment.center,\n        child: Text(\n          errMsg ?? '',\n          textAlign: TextAlign.center,\n        ),\n      ),\n    ),\n  };\n\n  List<Widget> _buildRcmd(ThemeData theme) => [\n    _buildRcmdTitle(theme),\n    SliverPadding(\n      padding: const EdgeInsets.only(\n        left: StyleString.safeSpace,\n        right: StyleString.safeSpace,\n        bottom: 100,\n      ),\n      sliver: Obx(\n        () => _buildRcmdBody(controller.loadingState.value),\n      ),\n    ),\n  ];\n\n  Widget _buildRcmdTitle(ThemeData theme) => SliverToBoxAdapter(\n    child: Padding(\n      padding: const EdgeInsets.only(\n        top: 10,\n        bottom: 10,\n        left: 16,\n        right: 10,\n      ),\n      child: Row(\n        mainAxisAlignment: MainAxisAlignment.spaceBetween,\n        children: [\n          Text(\n            '推荐',\n            style: theme.textTheme.titleMedium,\n          ),\n          moreTextButton(\n            padding: const EdgeInsets.symmetric(vertical: 2),\n            onTap: () {\n              if (widget.tabType == HomeTabType.bangumi) {\n                Get.to(const PgcIndexPage());\n              } else {\n                List<String> titles = const [\n                  '全部',\n                  '电影',\n                  '电视剧',\n                  '纪录片',\n                  '综艺',\n                ];\n                List<int> types = const [102, 2, 5, 3, 7];\n                Get.to(\n                  Scaffold(\n                    resizeToAvoidBottomInset: false,\n                    appBar: AppBar(title: const Text('索引')),\n                    body: DefaultTabController(\n                      length: types.length,\n                      child: Builder(\n                        builder: (context) {\n                          return Column(\n                            children: [\n                              ViewSafeArea(\n                                child: TabBar(\n                                  tabs: titles\n                                      .map((title) => Tab(text: title))\n                                      .toList(),\n                                  onTap: (index) {\n                                    try {\n                                      if (!DefaultTabController.of(\n                                        context,\n                                      ).indexIsChanging) {\n                                        Get.find<PgcIndexController>(\n                                          tag: types[index].toString(),\n                                        ).animateToTop();\n                                      }\n                                    } catch (_) {}\n                                  },\n                                ),\n                              ),\n                              Expanded(\n                                child: tabBarView(\n                                  children: types\n                                      .map(\n                                        (type) => PgcIndexPage(indexType: type),\n                                      )\n                                      .toList(),\n                                ),\n                              ),\n                            ],\n                          );\n                        },\n                      ),\n                    ),\n                  ),\n                );\n              }\n            },\n            color: theme.colorScheme.secondary,\n          ),\n        ],\n      ),\n    ),\n  );\n\n  late final gridDelegate = SliverGridDelegateWithExtentAndRatio(\n    mainAxisSpacing: StyleString.cardSpace,\n    crossAxisSpacing: StyleString.cardSpace,\n    maxCrossAxisExtent: Grid.smallCardWidth * 0.6,\n    childAspectRatio: 0.75,\n    mainAxisExtent: MediaQuery.textScalerOf(context).scale(50),\n  );\n\n  Widget _buildRcmdBody(LoadingState<List<PgcIndexItem>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => const SliverToBoxAdapter(),\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverGrid.builder(\n                gridDelegate: gridDelegate,\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    controller.onLoadMore();\n                  }\n                  return PgcCardVPgcIndex(item: response[index]);\n                },\n                itemCount: response.length,\n              )\n            : HttpError(onReload: controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: controller.onReload,\n      ),\n    };\n  }\n\n  Widget _buildFollow(ThemeData theme) => SliverToBoxAdapter(\n    child: Obx(\n      () => controller.accountService.isLogin.value\n          ? Column(\n              children: [\n                _buildFollowTitle(theme),\n                SizedBox(\n                  height:\n                      Grid.smallCardWidth / 2 / 0.75 +\n                      MediaQuery.textScalerOf(context).scale(50),\n                  child: Obx(\n                    () => _buildFollowBody(controller.followState.value),\n                  ),\n                ),\n              ],\n            )\n          : const SizedBox.shrink(),\n    ),\n  );\n\n  Widget _buildFollowTitle(ThemeData theme) => Padding(\n    padding: const EdgeInsets.only(left: 16),\n    child: Row(\n      children: [\n        Obx(\n          () => Text(\n            '最近${widget.tabType == HomeTabType.bangumi ? '追番' : '追剧'}${controller.followCount.value == -1 ? '' : ' ${controller.followCount.value}'}',\n            style: theme.textTheme.titleMedium,\n          ),\n        ),\n        const Spacer(),\n        IconButton(\n          tooltip: '刷新',\n          onPressed: () => controller\n            ..followPage = 1\n            ..followEnd = false\n            ..queryPgcFollow(),\n          icon: const Icon(\n            Icons.refresh,\n            size: 20,\n          ),\n        ),\n        Obx(\n          () => controller.accountService.isLogin.value\n              ? Padding(\n                  padding: const EdgeInsets.symmetric(horizontal: 10),\n                  child: moreTextButton(\n                    text: '查看全部',\n                    onTap: () => Get.toNamed(\n                      '/fav',\n                      arguments: widget.tabType == HomeTabType.bangumi\n                          ? FavTabType.bangumi.index\n                          : FavTabType.cinema.index,\n                    ),\n                    padding: const EdgeInsets.symmetric(vertical: 8),\n                    color: theme.colorScheme.secondary,\n                  ),\n                )\n              : const SizedBox.shrink(),\n        ),\n      ],\n    ),\n  );\n\n  Widget _buildFollowBody(LoadingState<List<FavPgcItemModel>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => m3eLoading,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? ListView.builder(\n                controller: controller.followController,\n                scrollDirection: Axis.horizontal,\n                itemCount: response.length,\n                padding: EdgeInsets.zero,\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    controller.queryPgcFollow(false);\n                  }\n                  return Container(\n                    width: Grid.smallCardWidth / 2,\n                    margin: EdgeInsets.only(\n                      left: StyleString.safeSpace,\n                      right: index == response.length - 1\n                          ? StyleString.safeSpace\n                          : 0,\n                    ),\n                    child: PgcCardV(item: response[index]),\n                  );\n                },\n              )\n            : Center(\n                child: Text(\n                  '还没有${widget.tabType == HomeTabType.bangumi ? '追番' : '追剧'}',\n                ),\n              ),\n      Error(:final errMsg) => Container(\n        padding: const EdgeInsets.symmetric(horizontal: 16),\n        alignment: Alignment.center,\n        child: Text(\n          errMsg ?? '',\n          textAlign: TextAlign.center,\n        ),\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/pgc/widgets/pgc_card_v.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models_new/fav/fav_pgc/list.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\n\n// 视频卡片 - 垂直布局\nclass PgcCardV extends StatelessWidget {\n  const PgcCardV({\n    super.key,\n    required this.item,\n  });\n\n  final FavPgcItemModel item;\n\n  @override\n  Widget build(BuildContext context) {\n    void onLongPress() => imageSaveDialog(\n      title: item.title,\n      cover: item.cover,\n    );\n    return Card(\n      shape: const RoundedRectangleBorder(borderRadius: StyleString.mdRadius),\n      child: InkWell(\n        borderRadius: StyleString.mdRadius,\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        onTap: () => PageUtils.viewPgc(seasonId: item.seasonId),\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            AspectRatio(\n              aspectRatio: 0.75,\n              child: LayoutBuilder(\n                builder: (context, boxConstraints) {\n                  final double maxWidth = boxConstraints.maxWidth;\n                  final double maxHeight = boxConstraints.maxHeight;\n                  return Stack(\n                    clipBehavior: Clip.none,\n                    children: [\n                      NetworkImgLayer(\n                        src: item.cover,\n                        width: maxWidth,\n                        height: maxHeight,\n                      ),\n                      PBadge(\n                        text: item.badge,\n                        top: 6,\n                        right: 6,\n                        bottom: null,\n                        left: null,\n                      ),\n                      if (item.isFinish == 0 &&\n                          item.renewalTime?.isNotEmpty == true)\n                        PBadge(\n                          text: item.renewalTime,\n                          bottom: 6,\n                          left: 6,\n                          type: PBadgeType.gray,\n                        ),\n                    ],\n                  );\n                },\n              ),\n            ),\n            content(context),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget content(BuildContext context) {\n    final theme = Theme.of(context);\n    final style = TextStyle(\n      fontSize: theme.textTheme.labelMedium!.fontSize,\n      color: theme.colorScheme.outline,\n    );\n    return Expanded(\n      child: Padding(\n        padding: const EdgeInsets.fromLTRB(4, 5, 0, 3),\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            Text(\n              item.title!,\n              textAlign: TextAlign.start,\n              style: const TextStyle(\n                letterSpacing: 0.3,\n              ),\n              maxLines: 1,\n              overflow: TextOverflow.ellipsis,\n            ),\n            const SizedBox(height: 1),\n            if (item.progress != null)\n              Text(\n                item.progress!,\n                maxLines: 1,\n                style: style,\n              )\n            else if (item.newEp?.indexShow != null)\n              Text(\n                item.newEp!.indexShow!,\n                maxLines: 1,\n                style: style,\n              ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/pgc/widgets/pgc_card_v_timeline.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_timeline/episode.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\n\n// 视频卡片 - 垂直布局\nclass PgcCardVTimeline extends StatelessWidget {\n  const PgcCardVTimeline({\n    super.key,\n    required this.item,\n  });\n\n  final Episode item;\n\n  @override\n  Widget build(BuildContext context) {\n    void onLongPress() => imageSaveDialog(\n      title: item.title,\n      cover: item.cover,\n    );\n    return Card(\n      shape: const RoundedRectangleBorder(borderRadius: StyleString.mdRadius),\n      child: InkWell(\n        borderRadius: StyleString.mdRadius,\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        onTap: () =>\n            PageUtils.viewPgc(seasonId: item.seasonId, epId: item.episodeId),\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            AspectRatio(\n              aspectRatio: 0.75,\n              child: LayoutBuilder(\n                builder: (context, boxConstraints) {\n                  final double maxWidth = boxConstraints.maxWidth;\n                  final double maxHeight = boxConstraints.maxHeight;\n                  return Stack(\n                    clipBehavior: Clip.none,\n                    children: [\n                      NetworkImgLayer(\n                        src: item.cover,\n                        width: maxWidth,\n                        height: maxHeight,\n                      ),\n                      if (item.follow == 1)\n                        const PBadge(\n                          text: '已追番',\n                          right: 6,\n                          top: 6,\n                        ),\n                      PBadge(\n                        text: '${item.pubTime}',\n                        left: 6,\n                        bottom: 6,\n                        type: PBadgeType.gray,\n                      ),\n                    ],\n                  );\n                },\n              ),\n            ),\n            content(context),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget content(BuildContext context) {\n    final theme = Theme.of(context);\n    return Expanded(\n      child: Padding(\n        padding: const EdgeInsets.fromLTRB(4, 5, 0, 3),\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            Text(\n              item.title ?? '',\n              textAlign: TextAlign.start,\n              style: const TextStyle(\n                letterSpacing: 0.3,\n              ),\n              maxLines: 1,\n              overflow: TextOverflow.ellipsis,\n            ),\n            Text(\n              item.pubIndex ?? '',\n              maxLines: 1,\n              style: TextStyle(\n                fontSize: theme.textTheme.labelMedium!.fontSize,\n                color: theme.colorScheme.outline,\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/pgc_index/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/pgc.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_index_condition/data.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_index_condition/sort.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_index_result/data.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_index_result/list.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:get/get.dart';\n\nclass PgcIndexController\n    extends CommonListController<PgcIndexResult, PgcIndexItem> {\n  PgcIndexController(this.indexType);\n  int? indexType;\n  Rx<LoadingState<PgcIndexConditionData>> conditionState =\n      LoadingState<PgcIndexConditionData>.loading().obs;\n\n  late final RxBool isExpand = false.obs;\n\n  RxMap<String, dynamic> indexParams = <String, dynamic>{}.obs;\n\n  @override\n  void onInit() {\n    super.onInit();\n    getPgcIndexCondition();\n  }\n\n  Future<void> getPgcIndexCondition() async {\n    final res = await PgcHttp.pgcIndexCondition(\n      seasonType: indexType == null ? 1 : null,\n      type: 0,\n      indexType: indexType,\n    );\n    if (res case Success(:final response)) {\n      if (response.order?.isNotEmpty == true) {\n        indexParams['order'] = response.order!.first.field;\n      }\n      if (response.filter?.isNotEmpty == true) {\n        for (PgcConditionFilter item in response.filter!) {\n          indexParams['${item.field}'] = item.values?.firstOrNull?.keyword;\n        }\n      }\n      queryData();\n    }\n    conditionState.value = res;\n  }\n\n  @override\n  Future<LoadingState<PgcIndexResult>> customGetData() =>\n      PgcHttp.pgcIndexResult(\n        page: page,\n        params: indexParams,\n        seasonType: indexType == null ? 1 : null,\n        type: 0,\n        indexType: indexType,\n      );\n\n  @override\n  List<PgcIndexItem>? getDataList(PgcIndexResult response) {\n    if (response.hasNext == null || response.hasNext == 0) {\n      isEnd = true;\n    }\n    return response.list;\n  }\n}\n"
  },
  {
    "path": "lib/pages/pgc_index/view.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/common/widgets/self_sized_horizontal_list.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_index_condition/data.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_index_condition/sort.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_index_condition/value.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_index_result/list.dart';\nimport 'package:PiliPlus/pages/pgc_index/controller.dart';\nimport 'package:PiliPlus/pages/pgc_index/widgets/pgc_card_v_pgc_index.dart';\nimport 'package:PiliPlus/pages/search/widgets/search_text.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass PgcIndexPage extends StatefulWidget {\n  const PgcIndexPage({super.key, this.indexType});\n\n  final int? indexType;\n\n  @override\n  State<PgcIndexPage> createState() => _PgcIndexPageState();\n}\n\nclass _PgcIndexPageState extends State<PgcIndexPage>\n    with AutomaticKeepAliveClientMixin {\n  late final PgcIndexController _ctr;\n\n  @override\n  void initState() {\n    super.initState();\n    _ctr = Get.put(\n      PgcIndexController(widget.indexType),\n      tag: widget.indexType.toString(),\n    );\n  }\n\n  @override\n  bool get wantKeepAlive => widget.indexType != null;\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final theme = Theme.of(context);\n    return widget.indexType == null\n        ? Scaffold(\n            resizeToAvoidBottomInset: false,\n            appBar: AppBar(title: const Text('索引')),\n            body: Obx(() => _buildBody(theme, _ctr.conditionState.value)),\n          )\n        : Obx(() => _buildBody(theme, _ctr.conditionState.value));\n  }\n\n  Widget _buildBody(\n    ThemeData theme,\n    LoadingState<PgcIndexConditionData> loadingState,\n  ) {\n    final padding = MediaQuery.viewPaddingOf(context);\n    return switch (loadingState) {\n      Loading() => m3eLoading,\n      Success(:final response) => Builder(\n        builder: (context) {\n          int count =\n              (response.order?.isNotEmpty == true ? 1 : 0) +\n              (response.filter?.length ?? 0);\n          if (count == 0) return const SizedBox.shrink();\n          return Padding(\n            padding: EdgeInsets.only(left: padding.left, right: padding.right),\n            child: CustomScrollView(\n              controller: _ctr.scrollController,\n              slivers: [\n                if (widget.indexType != null)\n                  const SliverToBoxAdapter(child: SizedBox(height: 12)),\n                SliverToBoxAdapter(\n                  child: AnimatedSize(\n                    curve: Curves.easeInOut,\n                    alignment: Alignment.topCenter,\n                    duration: const Duration(milliseconds: 200),\n                    child: count > 5\n                        ? Obx(() => _buildSortsWidget(theme, count, response))\n                        : _buildSortsWidget(theme, count, response),\n                  ),\n                ),\n                SliverPadding(\n                  padding: EdgeInsets.only(\n                    left: StyleString.safeSpace,\n                    right: StyleString.safeSpace,\n                    top: 12,\n                    bottom: padding.bottom + 100,\n                  ),\n                  sliver: Obx(() => _buildList(_ctr.loadingState.value)),\n                ),\n              ],\n            ),\n          );\n        },\n      ),\n      Error(:final errMsg) => scrollErrorWidget(\n        errMsg: errMsg,\n        onReload: () => _ctr\n          ..conditionState.value = LoadingState.loading()\n          ..getPgcIndexCondition(),\n      ),\n    };\n  }\n\n  Widget _buildSortWidget(\n    ThemeData theme,\n    int index,\n    PgcIndexConditionData data,\n    Object item,\n    Map<String, dynamic> indexParams,\n  ) {\n    if (item is PgcConditionOrder) {\n      final isCurr = indexParams['order'] == item.field;\n      return SearchText(\n        bgColor: isCurr\n            ? theme.colorScheme.secondaryContainer\n            : Colors.transparent,\n        textColor: isCurr\n            ? theme.colorScheme.onSecondaryContainer\n            : theme.colorScheme.onSurfaceVariant,\n        text: item.name!,\n        padding: const .symmetric(horizontal: 6, vertical: 3),\n        onTap: (_) => _ctr\n          ..indexParams['order'] = item.field\n          ..onReload(),\n      );\n    }\n    if (item is PgcConditionValue) {\n      final hasOrder = data.order?.isNotEmpty == true;\n      if (hasOrder) index -= 1;\n      final key = data.filter![index].field!;\n      final isCurr = indexParams[key] == item.keyword;\n      return SearchText(\n        bgColor: isCurr\n            ? theme.colorScheme.secondaryContainer\n            : Colors.transparent,\n        textColor: isCurr\n            ? theme.colorScheme.onSecondaryContainer\n            : theme.colorScheme.onSurfaceVariant,\n        text: item.name!,\n        padding: const .symmetric(horizontal: 6, vertical: 3),\n        onTap: (_) => _ctr\n          ..indexParams[key] = item.keyword\n          ..onReload(),\n      );\n    }\n    throw UnsupportedError(item.toString());\n  }\n\n  Widget _buildSortsWidget(\n    ThemeData theme,\n    int count,\n    PgcIndexConditionData data,\n  ) => Column(\n    mainAxisSize: MainAxisSize.min,\n    crossAxisAlignment: CrossAxisAlignment.start,\n    children: [\n      ...List.generate(\n        count > 5\n            ? _ctr.isExpand.value\n                  ? count\n                  : count ~/ 2\n            : count,\n        (index) {\n          final isFirst = index == 0;\n          List? item = data.order?.isNotEmpty == true\n              ? isFirst\n                    ? data.order\n                    : data.filter![index - 1].values\n              : data.filter![index].values;\n          if (item != null && item.isNotEmpty) {\n            return Obx(() {\n              // ignore: invalid_use_of_protected_member\n              final indexParams = _ctr.indexParams.value;\n              return SelfSizedHorizontalList(\n                padding: isFirst\n                    ? const .symmetric(horizontal: 12)\n                    : const .fromLTRB(12, 10, 12, 0),\n                separatorBuilder: (_, _) => const SizedBox(width: 12),\n                itemBuilder: (context, childIndex) => _buildSortWidget(\n                  theme,\n                  index,\n                  data,\n                  item[childIndex],\n                  indexParams,\n                ),\n                itemCount: item.length,\n              );\n            });\n          }\n          return const SizedBox.shrink();\n        },\n      ),\n      if (count > 5) ...[\n        const SizedBox(height: 8),\n        GestureDetector(\n          behavior: HitTestBehavior.opaque,\n          onTap: () => _ctr.isExpand.value = !_ctr.isExpand.value,\n          child: Center(\n            child: Row(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                Text(\n                  _ctr.isExpand.value ? '收起' : '展开',\n                  style: TextStyle(\n                    color: theme.colorScheme.outline,\n                  ),\n                ),\n                Icon(\n                  _ctr.isExpand.value\n                      ? Icons.keyboard_arrow_up\n                      : Icons.keyboard_arrow_down,\n                  color: theme.colorScheme.outline,\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    ],\n  );\n\n  late final gridDelegate = SliverGridDelegateWithExtentAndRatio(\n    mainAxisSpacing: StyleString.cardSpace,\n    crossAxisSpacing: StyleString.cardSpace,\n    maxCrossAxisExtent: Grid.smallCardWidth * 0.6,\n    childAspectRatio: 0.75,\n    mainAxisExtent: MediaQuery.textScalerOf(context).scale(50),\n  );\n\n  Widget _buildList(LoadingState<List<PgcIndexItem>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => linearLoading,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverGrid.builder(\n                gridDelegate: gridDelegate,\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    _ctr.onLoadMore();\n                  }\n                  return PgcCardVPgcIndex(item: response[index]);\n                },\n                itemCount: response.length,\n              )\n            : HttpError(onReload: _ctr.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _ctr.onReload,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/pgc_index/widgets/pgc_card_v_pgc_index.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_index_result/list.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\n\n// 视频卡片 - 垂直布局\nclass PgcCardVPgcIndex extends StatelessWidget {\n  const PgcCardVPgcIndex({\n    super.key,\n    required this.item,\n  });\n\n  final PgcIndexItem item;\n\n  @override\n  Widget build(BuildContext context) {\n    void onLongPress() => imageSaveDialog(\n      title: item.title,\n      cover: item.cover,\n    );\n    return Card(\n      shape: const RoundedRectangleBorder(borderRadius: StyleString.mdRadius),\n      child: InkWell(\n        borderRadius: StyleString.mdRadius,\n        onTap: () => PageUtils.viewPgc(seasonId: item.seasonId),\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            AspectRatio(\n              aspectRatio: 0.75,\n              child: LayoutBuilder(\n                builder: (context, boxConstraints) {\n                  final double maxWidth = boxConstraints.maxWidth;\n                  final double maxHeight = boxConstraints.maxHeight;\n                  return Stack(\n                    clipBehavior: Clip.none,\n                    children: [\n                      NetworkImgLayer(\n                        src: item.cover,\n                        width: maxWidth,\n                        height: maxHeight,\n                      ),\n                      PBadge(\n                        text: item.badge,\n                        top: 6,\n                        right: 6,\n                        bottom: null,\n                        left: null,\n                      ),\n                      PBadge(\n                        text: item.order,\n                        top: null,\n                        right: null,\n                        bottom: 6,\n                        left: 6,\n                        type: PBadgeType.gray,\n                      ),\n                    ],\n                  );\n                },\n              ),\n            ),\n            content(context),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget content(BuildContext context) {\n    final theme = Theme.of(context);\n    return Expanded(\n      child: Padding(\n        padding: const EdgeInsets.fromLTRB(4, 5, 0, 3),\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            Text(\n              item.title!,\n              textAlign: TextAlign.start,\n              style: const TextStyle(\n                letterSpacing: 0.3,\n              ),\n              maxLines: 1,\n              overflow: TextOverflow.ellipsis,\n            ),\n            const SizedBox(height: 1),\n            if (item.indexShow != null)\n              Text(\n                item.indexShow!,\n                maxLines: 1,\n                style: TextStyle(\n                  fontSize: theme.textTheme.labelMedium!.fontSize,\n                  color: theme.colorScheme.outline,\n                ),\n              ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/pgc_review/child/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/pgc.dart';\nimport 'package:PiliPlus/models/common/pgc_review_type.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_review/data.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_review/list.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass PgcReviewController\n    extends CommonListController<PgcReviewData, PgcReviewItemModel> {\n  PgcReviewController({required this.type, required this.mediaId});\n\n  final PgcReviewType type;\n  final dynamic mediaId;\n\n  Rx<int?> count = Rx<int?>(null);\n  String? next;\n  Rx<PgcReviewSortType> sortType = PgcReviewSortType.def.obs;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  Future<void> onRefresh() {\n    next = null;\n    return super.onRefresh();\n  }\n\n  @override\n  void checkIsEnd(int length) {\n    final count = this.count.value;\n    if (count != null && length >= count) {\n      isEnd = true;\n    }\n  }\n\n  @override\n  List<PgcReviewItemModel>? getDataList(PgcReviewData response) {\n    if (type == PgcReviewType.long &&\n        sortType.value == PgcReviewSortType.latest) {\n      count.value = null;\n    } else {\n      count.value = response.count;\n    }\n    next = response.next;\n\n    return response.list;\n  }\n\n  @override\n  Future<LoadingState<PgcReviewData>> customGetData() => PgcHttp.pgcReview(\n    type: type,\n    mediaId: mediaId,\n    next: next,\n    sort: sortType.value.sort,\n  );\n\n  Future<void> onLike(PgcReviewItemModel item, bool isLike, reviewId) async {\n    final res = await PgcHttp.pgcReviewLike(\n      mediaId: mediaId,\n      reviewId: reviewId,\n    );\n    if (res.isSuccess) {\n      int likes = item.stat?.likes ?? 0;\n      item.stat\n        ?..liked = isLike ? 0 : 1\n        ..likes = isLike ? likes - 1 : likes + 1;\n      if (!isLike) {\n        item.stat?.disliked = 0;\n      }\n      loadingState.refresh();\n    } else {\n      res.toast();\n    }\n  }\n\n  Future<void> onDislike(\n    PgcReviewItemModel item,\n    bool isDislike,\n    reviewId,\n  ) async {\n    final res = await PgcHttp.pgcReviewDislike(\n      mediaId: mediaId,\n      reviewId: reviewId,\n    );\n    if (res.isSuccess) {\n      item.stat?.disliked = isDislike ? 0 : 1;\n      if (!isDislike) {\n        if (item.stat?.liked == 1) {\n          item.stat!.likes = item.stat!.likes! - 1;\n        }\n        item.stat?.liked = 0;\n      }\n      loadingState.refresh();\n    } else {\n      res.toast();\n    }\n  }\n\n  Future<void> onDel(int index, int reviewId) async {\n    final res = await PgcHttp.pgcReviewDel(\n      mediaId: mediaId,\n      reviewId: reviewId,\n    );\n    if (res.isSuccess) {\n      loadingState\n        ..value.data!.removeAt(index)\n        ..refresh();\n      SmartDialog.showToast('删除成功');\n    } else {\n      res.toast();\n    }\n  }\n\n  void queryBySort() {\n    if (isLoading) return;\n    sortType.value = sortType.value == PgcReviewSortType.def\n        ? PgcReviewSortType.latest\n        : PgcReviewSortType.def;\n    onReload();\n  }\n}\n"
  },
  {
    "path": "lib/pages/pgc_review/child/view.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/skeleton/video_reply.dart';\nimport 'package:PiliPlus/common/widgets/custom_icon.dart';\nimport 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/flutter/selectable_text/selectable_text.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/sliver/sliver_floating_header.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models/common/pgc_review_type.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_review/list.dart';\nimport 'package:PiliPlus/pages/pgc_review/child/controller.dart';\nimport 'package:PiliPlus/pages/pgc_review/post/view.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart' hide SelectableText;\nimport 'package:font_awesome_flutter/font_awesome_flutter.dart';\nimport 'package:get/get.dart';\n\nclass PgcReviewChildPage extends StatefulWidget {\n  const PgcReviewChildPage({\n    super.key,\n    required this.type,\n    required this.name,\n    required this.mediaId,\n  });\n\n  final PgcReviewType type;\n  final String name;\n  final dynamic mediaId;\n\n  @override\n  State<PgcReviewChildPage> createState() => _PgcReviewChildPageState();\n}\n\nclass _PgcReviewChildPageState extends State<PgcReviewChildPage>\n    with AutomaticKeepAliveClientMixin {\n  late final String _tag;\n  late final PgcReviewController _controller;\n  late final isLongReview = widget.type == PgcReviewType.long;\n\n  @override\n  void initState() {\n    super.initState();\n    _tag = '${widget.mediaId}${widget.type.name}';\n    _controller = Get.put(\n      PgcReviewController(type: widget.type, mediaId: widget.mediaId),\n      tag: _tag,\n    );\n  }\n\n  @override\n  void dispose() {\n    Get.delete<PgcReviewController>(tag: _tag);\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final theme = Theme.of(context);\n    return refreshIndicator(\n      onRefresh: _controller.onRefresh,\n      child: CustomScrollView(\n        controller: _controller.scrollController,\n        physics: const AlwaysScrollableScrollPhysics(),\n        slivers: [\n          _buildHeader(theme),\n          SliverPadding(\n            padding: EdgeInsets.only(\n              bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n            ),\n            sliver: Obx(\n              () => _buildBody(theme, _controller.loadingState.value),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget _buildBody(\n    ThemeData theme,\n    LoadingState<List<PgcReviewItemModel>?> loadingState,\n  ) {\n    late final divider = Divider(\n      height: 1,\n      color: theme.colorScheme.outline.withValues(alpha: 0.1),\n    );\n    return switch (loadingState) {\n      Loading() => SliverPrototypeExtentList.builder(\n        prototypeItem: const VideoReplySkeleton(),\n        itemBuilder: (_, _) => const VideoReplySkeleton(),\n        itemCount: 8,\n      ),\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverList.separated(\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    _controller.onLoadMore();\n                  }\n                  return _itemWidget(theme, index, response[index]);\n                },\n                itemCount: response.length,\n                separatorBuilder: (context, index) => divider,\n              )\n            : HttpError(onReload: _controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n\n  Widget _itemWidget(ThemeData theme, int index, PgcReviewItemModel item) {\n    void showMore() => showDialog(\n      context: context,\n      builder: (context) => AlertDialog(\n        clipBehavior: Clip.hardEdge,\n        contentPadding: const EdgeInsets.symmetric(vertical: 12),\n        content: Column(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            if (item.author!.mid == Accounts.main.mid) ...[\n              ListTile(\n                dense: true,\n                title: const Text(\n                  '编辑',\n                  style: TextStyle(fontSize: 14),\n                ),\n                onTap: () {\n                  Get.back();\n                  showModalBottomSheet(\n                    context: context,\n                    useSafeArea: true,\n                    isScrollControlled: true,\n                    builder: (context) {\n                      return PgcReviewPostPanel(\n                        name: widget.name,\n                        mediaId: widget.mediaId,\n                        reviewId: item.reviewId,\n                        content: item.content,\n                        score: item.score,\n                      );\n                    },\n                  );\n                },\n              ),\n              ListTile(\n                dense: true,\n                title: const Text(\n                  '删除',\n                  style: TextStyle(fontSize: 14),\n                ),\n                onTap: () {\n                  Get.back();\n                  showConfirmDialog(\n                    context: context,\n                    title: '删除短评，同时删除评分？',\n                    onConfirm: () => _controller.onDel(index, item.reviewId!),\n                  );\n                },\n              ),\n            ],\n            ListTile(\n              dense: true,\n              title: const Text(\n                '举报',\n                style: TextStyle(fontSize: 14),\n              ),\n              onTap: () => Get\n                ..back()\n                ..toNamed(\n                  '/webview',\n                  parameters: {\n                    'url':\n                        'https://www.bilibili.com/appeal/?reviewId=${item.reviewId}&type=shortComment&mediaId=${widget.mediaId}',\n                  },\n                ),\n            ),\n          ],\n        ),\n      ),\n    );\n\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onTap: isLongReview\n            ? () => Get.toNamed(\n                '/articlePage',\n                parameters: {\n                  'id': item.articleId!.toString(),\n                  'type': 'read',\n                },\n              )\n            : null,\n        onLongPress: !isLongReview ? showMore : null,\n        onSecondaryTap: !isLongReview && !PlatformUtils.isMobile\n            ? showMore\n            : null,\n        child: Padding(\n          padding: const EdgeInsets.all(12),\n          child: Column(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              GestureDetector(\n                behavior: HitTestBehavior.opaque,\n                onTap: () => Get.toNamed('/member?mid=${item.author!.mid}'),\n                child: Row(\n                  mainAxisSize: MainAxisSize.min,\n                  children: [\n                    NetworkImgLayer(\n                      height: 34,\n                      width: 34,\n                      src: item.author!.avatar,\n                      type: ImageType.avatar,\n                    ),\n                    const SizedBox(width: 10),\n                    Column(\n                      spacing: 2,\n                      mainAxisSize: MainAxisSize.min,\n                      crossAxisAlignment: CrossAxisAlignment.start,\n                      children: [\n                        Row(\n                          spacing: 6,\n                          mainAxisSize: MainAxisSize.min,\n                          children: [\n                            Text(\n                              item.author!.uname!,\n                              style: TextStyle(\n                                color:\n                                    item.author?.vip?.status != null &&\n                                        item.author!.vip!.status > 0 &&\n                                        item.author!.vip!.type == 2\n                                    ? theme.colorScheme.vipColor\n                                    : theme.colorScheme.outline,\n                                fontSize: 13,\n                              ),\n                            ),\n                            Image.asset(\n                              Utils.levelName(item.author!.level!),\n                              height: 11,\n                              cacheHeight: 11.cacheSize(context),\n                            ),\n                          ],\n                        ),\n                        Row(\n                          children: [\n                            if (item.pushTimeStr != null) ...[\n                              Text(\n                                item.pushTimeStr!,\n                                style: TextStyle(\n                                  color: theme.colorScheme.outline,\n                                  fontSize: 12,\n                                ),\n                              ),\n                              const SizedBox(width: 10),\n                            ],\n                            ...List.generate(\n                              5,\n                              (index) {\n                                if (index <= item.score - 1) {\n                                  return const Icon(\n                                    CustomIcons.star_favorite_solid,\n                                    size: 13,\n                                    color: Color(0xFFFFAD35),\n                                  );\n                                }\n                                return const Icon(\n                                  CustomIcons.star_favorite_line,\n                                  size: 14,\n                                  color: Colors.grey,\n                                );\n                              },\n                            ),\n                          ],\n                        ),\n                      ],\n                    ),\n                  ],\n                ),\n              ),\n              const SizedBox(height: 5),\n              if (item.title != null)\n                Text(\n                  item.title!,\n                  style: const TextStyle(\n                    height: 1.75,\n                    fontSize: 15,\n                    fontWeight: FontWeight.bold,\n                  ),\n                ),\n              if (isLongReview)\n                Text(\n                  item.content!,\n                  style: const TextStyle(height: 1.75),\n                )\n              else\n                SelectableText(\n                  item.content!,\n                  style: const TextStyle(height: 1.75),\n                ),\n              Builder(\n                builder: (context) {\n                  final Color color = theme.colorScheme.outline;\n                  final Color primary = theme.colorScheme.primary;\n                  final ButtonStyle style = TextButton.styleFrom(\n                    padding: EdgeInsets.zero,\n                    tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n                    visualDensity: VisualDensity.compact,\n                  );\n                  final isLike = item.stat?.liked == 1;\n                  late final isDislike = item.stat?.disliked == 1;\n                  return Row(\n                    mainAxisAlignment: MainAxisAlignment.end,\n                    children: [\n                      if (!isLongReview)\n                        SizedBox(\n                          height: 32,\n                          child: TextButton(\n                            style: style,\n                            onPressed: () => _controller.onDislike(\n                              item,\n                              isDislike,\n                              item.reviewId,\n                            ),\n                            child: Icon(\n                              isDislike\n                                  ? FontAwesomeIcons.solidThumbsDown\n                                  : FontAwesomeIcons.thumbsDown,\n                              size: 16,\n                              color: isDislike ? primary : color,\n                            ),\n                          ),\n                        ),\n                      SizedBox(\n                        height: 32,\n                        child: TextButton(\n                          style: style,\n                          onPressed: isLongReview\n                              ? null\n                              : () => _controller.onLike(\n                                  item,\n                                  isLike,\n                                  item.reviewId,\n                                ),\n                          child: Row(\n                            spacing: 4,\n                            children: [\n                              Icon(\n                                isLike\n                                    ? FontAwesomeIcons.solidThumbsUp\n                                    : FontAwesomeIcons.thumbsUp,\n                                size: 16,\n                                color: isLike ? primary : color,\n                              ),\n                              Text(\n                                NumUtils.numFormat(item.stat?.likes ?? 0),\n                                style: TextStyle(\n                                  color: isLike ? primary : color,\n                                  fontSize: 12,\n                                ),\n                              ),\n                            ],\n                          ),\n                        ),\n                      ),\n                    ],\n                  );\n                },\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget _buildHeader(ThemeData theme) => SliverFloatingHeaderWidget(\n    backgroundColor: theme.colorScheme.surface,\n    child: Padding(\n      padding: const EdgeInsets.fromLTRB(12, 2.5, 6, 2.5),\n      child: Row(\n        mainAxisAlignment: MainAxisAlignment.spaceBetween,\n        children: [\n          Obx(\n            () {\n              final count = _controller.count.value;\n              return count == null\n                  ? const SizedBox.shrink()\n                  : Text(\n                      '${NumUtils.numFormat(count)}条点评',\n                      style: const TextStyle(fontSize: 13),\n                    );\n            },\n          ),\n          TextButton.icon(\n            style: StyleString.buttonStyle,\n            onPressed: _controller.queryBySort,\n            icon: Icon(\n              Icons.sort,\n              size: 16,\n              color: theme.colorScheme.secondary,\n            ),\n            label: Obx(\n              () => Text(\n                _controller.sortType.value.label,\n                style: TextStyle(\n                  fontSize: 13,\n                  color: theme.colorScheme.secondary,\n                ),\n              ),\n            ),\n          ),\n        ],\n      ),\n    ),\n  );\n\n  @override\n  bool get wantKeepAlive => true;\n}\n"
  },
  {
    "path": "lib/pages/pgc_review/post/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/custom_icon.dart';\nimport 'package:PiliPlus/http/pgc.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass PgcReviewPostPanel extends StatefulWidget {\n  const PgcReviewPostPanel({\n    super.key,\n    required this.name,\n    required this.mediaId,\n    this.reviewId,\n    this.score,\n    this.content,\n  });\n\n  final String name;\n  final dynamic mediaId;\n  // modify\n  final dynamic reviewId;\n  final int? score;\n  final String? content;\n\n  @override\n  State<PgcReviewPostPanel> createState() => _PgcReviewPostPanelState();\n}\n\nclass _PgcReviewPostPanelState extends State<PgcReviewPostPanel> {\n  late final TextEditingController _controller;\n  late final RxInt _score = (widget.score ?? 0).obs;\n  late final RxBool _shareFeed = false.obs;\n  late final RxBool _enablePost = _isMod.obs;\n  late final _isMod = widget.reviewId != null;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = TextEditingController(text: widget.content);\n  }\n\n  @override\n  void dispose() {\n    _controller.dispose();\n    super.dispose();\n  }\n\n  void _onScore(double dx) {\n    int index = (dx ~/ 50).clamp(0, 4);\n    _enablePost.value = true;\n    _score.value = index + 1;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    return Column(\n      mainAxisSize: MainAxisSize.min,\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        SizedBox(\n          height: 45,\n          child: AppBar(\n            backgroundColor: Colors.transparent,\n            automaticallyImplyLeading: false,\n            titleSpacing: 16,\n            toolbarHeight: 45,\n            title: Text(widget.name),\n            actions: [\n              IconButton(\n                icon: const Icon(Icons.clear, size: 20),\n                onPressed: Get.back,\n              ),\n              const SizedBox(width: 2),\n            ],\n            shape: Border(\n              bottom: BorderSide(\n                color: theme.colorScheme.outline.withValues(alpha: 0.1),\n              ),\n            ),\n          ),\n        ),\n        Center(\n          child: Padding(\n            padding: const EdgeInsets.only(top: 10, bottom: 8),\n            child: GestureDetector(\n              behavior: HitTestBehavior.opaque,\n              onHorizontalDragUpdate: (details) =>\n                  _onScore(details.localPosition.dx),\n              onTapDown: (details) => _onScore(details.localPosition.dx),\n              child: Row(\n                mainAxisSize: MainAxisSize.min,\n                children: List.generate(\n                  5,\n                  (index) {\n                    return Obx(\n                      () => index <= _score.value - 1\n                          ? const Icon(\n                              CustomIcons.star_favorite_solid,\n                              size: 50,\n                              color: Color(0xFFFFAD35),\n                            )\n                          : const Icon(\n                              CustomIcons.star_favorite_line,\n                              size: 50,\n                              color: Colors.grey,\n                            ),\n                    );\n                  },\n                ),\n              ),\n            ),\n          ),\n        ),\n        Center(\n          child: Obx(\n            () {\n              final score = _score.value;\n              return Text(\n                switch (score) {\n                  1 => '很差',\n                  2 => '较差',\n                  3 => '还行',\n                  4 => '很好',\n                  5 => '佳作',\n                  _ => '轻触评分',\n                },\n                style: TextStyle(\n                  fontSize: 16,\n                  color: score == 0\n                      ? theme.colorScheme.outline\n                      : const Color(0xFFFFAD35),\n                ),\n              );\n            },\n          ),\n        ),\n        Flexible(\n          child: Padding(\n            padding: const EdgeInsets.all(12),\n            child: TextField(\n              maxLength: 100,\n              minLines: 5,\n              maxLines: 5,\n              controller: _controller,\n              decoration: const InputDecoration(\n                border: OutlineInputBorder(),\n              ),\n              textInputAction: TextInputAction.done,\n            ),\n          ),\n        ),\n        if (!_isMod)\n          Padding(\n            padding: const EdgeInsets.only(left: 12, right: 12, bottom: 12),\n            child: GestureDetector(\n              behavior: HitTestBehavior.opaque,\n              onTap: () => _shareFeed.value = !_shareFeed.value,\n              child: Obx(\n                () {\n                  final shareFeed = _shareFeed.value;\n                  Color color = shareFeed\n                      ? theme.colorScheme.primary\n                      : theme.colorScheme.outline;\n                  return Row(\n                    mainAxisSize: MainAxisSize.min,\n                    children: [\n                      Icon(\n                        size: 22,\n                        shareFeed\n                            ? Icons.check_box_outlined\n                            : Icons.check_box_outline_blank_outlined,\n                        color: color,\n                      ),\n                      Text(\n                        ' 分享到动态',\n                        style: TextStyle(color: color),\n                      ),\n                    ],\n                  );\n                },\n              ),\n            ),\n          ),\n        Container(\n          padding: EdgeInsets.only(\n            left: 12,\n            right: 12,\n            top: 6,\n            bottom:\n                MediaQuery.paddingOf(context).bottom +\n                MediaQuery.viewInsetsOf(context).bottom +\n                6,\n          ),\n          width: double.infinity,\n          decoration: BoxDecoration(\n            color: theme.colorScheme.onInverseSurface,\n            border: Border(\n              top: BorderSide(\n                width: 0.5,\n                color: theme.colorScheme.outline.withValues(alpha: 0.1),\n              ),\n            ),\n          ),\n          child: Obx(\n            () => FilledButton.tonal(\n              style: FilledButton.styleFrom(\n                tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n                padding: EdgeInsets.zero,\n                shape: const RoundedRectangleBorder(\n                  borderRadius: BorderRadius.all(Radius.circular(6)),\n                ),\n              ),\n              onPressed: _enablePost.value ? _onPost : null,\n              child: _isMod ? const Text('编辑') : const Text('发布'),\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n\n  Future<void> _onPost() async {\n    if (_isMod) {\n      final res = await PgcHttp.pgcReviewMod(\n        mediaId: widget.mediaId,\n        score: _score.value * 2,\n        content: _controller.text,\n        reviewId: widget.reviewId,\n      );\n      if (res.isSuccess) {\n        Get.back();\n        SmartDialog.showToast('编辑成功');\n      } else {\n        res.toast();\n      }\n      return;\n    }\n    if (!Accounts.main.isLogin) {\n      SmartDialog.showToast('账号未登录');\n      return;\n    }\n    final res = await PgcHttp.pgcReviewPost(\n      mediaId: widget.mediaId,\n      score: _score.value * 2,\n      content: _controller.text,\n      shareFeed: _isMod ? false : _shareFeed.value,\n    );\n    if (res.isSuccess) {\n      Get.back();\n      SmartDialog.showToast('点评成功');\n    } else {\n      res.toast();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/pgc_review/view.dart",
    "content": "import 'package:PiliPlus/models/common/pgc_review_type.dart';\nimport 'package:PiliPlus/pages/pgc_review/child/controller.dart';\nimport 'package:PiliPlus/pages/pgc_review/child/view.dart';\nimport 'package:PiliPlus/pages/pgc_review/post/view.dart';\nimport 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass PgcReviewPage extends StatefulWidget {\n  const PgcReviewPage({\n    super.key,\n    required this.name,\n    required this.mediaId,\n  });\n\n  final String name;\n  final dynamic mediaId;\n\n  @override\n  State<PgcReviewPage> createState() => _PgcReviewPageState();\n}\n\nclass _PgcReviewPageState extends State<PgcReviewPage>\n    with SingleTickerProviderStateMixin, AutomaticKeepAliveClientMixin {\n  late final TabController _tabController;\n\n  @override\n  void initState() {\n    super.initState();\n    _tabController = TabController(\n      length: PgcReviewType.values.length,\n      vsync: this,\n    );\n  }\n\n  @override\n  void dispose() {\n    _tabController.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final theme = Theme.of(context);\n    return Stack(\n      clipBehavior: Clip.none,\n      children: [\n        Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            TabBar(\n              controller: _tabController,\n              isScrollable: true,\n              tabAlignment: TabAlignment.start,\n              dividerHeight: 0,\n              indicatorWeight: 0,\n              overlayColor: const WidgetStatePropertyAll(Colors.transparent),\n              splashFactory: NoSplash.splashFactory,\n              padding: const EdgeInsets.only(left: 6),\n              indicatorPadding: const EdgeInsets.symmetric(\n                horizontal: 3,\n                vertical: 8,\n              ),\n              indicator: BoxDecoration(\n                color: theme.colorScheme.secondaryContainer,\n                borderRadius: const BorderRadius.all(Radius.circular(20)),\n              ),\n              indicatorSize: TabBarIndicatorSize.tab,\n              labelColor: theme.colorScheme.onSecondaryContainer,\n              unselectedLabelColor: theme.colorScheme.outline,\n              labelStyle:\n                  TabBarTheme.of(\n                    context,\n                  ).labelStyle?.copyWith(fontSize: 13) ??\n                  const TextStyle(fontSize: 13),\n              dividerColor: Colors.transparent,\n              tabs: PgcReviewType.values\n                  .map((e) => Tab(text: e.label))\n                  .toList(),\n              onTap: (index) {\n                try {\n                  if (!_tabController.indexIsChanging) {\n                    final item = PgcReviewType.values[index];\n                    Get.find<PgcReviewController>(\n                      tag: '${widget.mediaId}${item.name}',\n                    ).scrollController.animToTop();\n                  }\n                } catch (_) {}\n              },\n            ),\n            Expanded(\n              child: TabBarView(\n                controller: _tabController,\n                physics: const NeverScrollableScrollPhysics(),\n                children: PgcReviewType.values\n                    .map(\n                      (e) => PgcReviewChildPage(\n                        type: e,\n                        name: widget.name,\n                        mediaId: widget.mediaId,\n                      ),\n                    )\n                    .toList(),\n              ),\n            ),\n          ],\n        ),\n        Positioned(\n          right: kFloatingActionButtonMargin,\n          bottom:\n              MediaQuery.viewPaddingOf(context).bottom +\n              kFloatingActionButtonMargin,\n          child: FloatingActionButton(\n            onPressed: () => showDialog(\n              context: context,\n              builder: (context) => AlertDialog(\n                clipBehavior: Clip.hardEdge,\n                contentPadding: const EdgeInsets.symmetric(vertical: 12),\n                content: Column(\n                  mainAxisSize: MainAxisSize.min,\n                  children: [\n                    ListTile(\n                      dense: true,\n                      title: const Text(\n                        '写短评',\n                        style: TextStyle(fontSize: 14),\n                      ),\n                      onTap: () {\n                        Get.back();\n                        showModalBottomSheet(\n                          context: context,\n                          useSafeArea: true,\n                          isScrollControlled: true,\n                          builder: (context) {\n                            return PgcReviewPostPanel(\n                              name: widget.name,\n                              mediaId: widget.mediaId,\n                            );\n                          },\n                        );\n                      },\n                    ),\n                    ListTile(\n                      dense: true,\n                      title: const Text(\n                        '写长评',\n                        style: TextStyle(fontSize: 14),\n                      ),\n                      onTap: () => Get\n                        ..back()\n                        ..toNamed(\n                          '/webview',\n                          parameters: {\n                            'url':\n                                'https://member.bilibili.com/article-text/mobile?theme=${theme.brightness.isDark ? 1 : 0}&media_id=${widget.mediaId}',\n                          },\n                        ),\n                    ),\n                  ],\n                ),\n              ),\n            ),\n            child: const Icon(Icons.edit),\n          ),\n        ),\n      ],\n    );\n  }\n\n  @override\n  bool get wantKeepAlive => true;\n}\n"
  },
  {
    "path": "lib/pages/popular_precious/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/video.dart';\nimport 'package:PiliPlus/models/model_hot_video_item.dart';\nimport 'package:PiliPlus/models_new/popular/popular_precious/data.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\n\nclass PopularPreciousController\n    extends CommonListController<PopularPreciousData, HotVideoItemModel> {\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  int? mediaId;\n\n  @override\n  List<HotVideoItemModel>? getDataList(PopularPreciousData response) {\n    mediaId = response.mediaId;\n    return response.list;\n  }\n\n  @override\n  Future<LoadingState<PopularPreciousData>> customGetData() =>\n      VideoHttp.popularPrecious(page: page);\n}\n"
  },
  {
    "path": "lib/pages/popular_precious/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/video_card/video_card_h.dart';\nimport 'package:PiliPlus/common/widgets/view_sliver_safe_area.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/video/source_type.dart';\nimport 'package:PiliPlus/models/model_hot_video_item.dart';\nimport 'package:PiliPlus/pages/popular_precious/controller.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass PopularPreciousPage extends StatefulWidget {\n  const PopularPreciousPage({super.key});\n\n  @override\n  State<PopularPreciousPage> createState() => _PopularPreciousPageState();\n}\n\nclass _PopularPreciousPageState extends State<PopularPreciousPage>\n    with GridMixin {\n  final _controller = Get.put(PopularPreciousController());\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(title: const Text('入站必刷')),\n      body: refreshIndicator(\n        onRefresh: _controller.onRefresh,\n        child: CustomScrollView(\n          physics: const AlwaysScrollableScrollPhysics(),\n          slivers: [\n            ViewSliverSafeArea(\n              sliver: Obx(() => _buildBody(_controller.loadingState.value)),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget _buildBody(LoadingState<List<HotVideoItemModel>?> value) {\n    switch (value) {\n      case Loading():\n        return gridSkeleton;\n      case Success<List<HotVideoItemModel>?>(:final response):\n        return SliverGrid.builder(\n          gridDelegate: gridDelegate,\n          itemCount: response!.length,\n          itemBuilder: (context, index) {\n            final item = response[index];\n            return VideoCardH(\n              videoItem: item,\n              onTap: () {\n                PageUtils.toVideoPage(\n                  bvid: item.bvid,\n                  cid: item.cid!,\n                  extraArguments: {\n                    'sourceType': SourceType.playlist,\n                    'favTitle': '入站必刷',\n                    'mediaId': _controller.mediaId,\n                    'desc': true,\n                    'oid': item.aid,\n                    'isContinuePlaying': index != 0,\n                  },\n                );\n              },\n            );\n          },\n        );\n      case Error(:final errMsg):\n        return HttpError(\n          errMsg: errMsg,\n          onReload: _controller.onReload,\n        );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/popular_series/controller.dart",
    "content": "import 'package:PiliPlus/common/widgets/scroll_physics.dart' show ReloadMixin;\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/video.dart';\nimport 'package:PiliPlus/models/model_hot_video_item.dart';\nimport 'package:PiliPlus/models_new/popular/popular_series_list/list.dart';\nimport 'package:PiliPlus/models_new/popular/popular_series_one/config.dart';\nimport 'package:PiliPlus/models_new/popular/popular_series_one/data.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:get/get.dart';\n\nclass PopularSeriesController\n    extends CommonListController<PopularSeriesOneData, HotVideoItemModel>\n    with ReloadMixin {\n  late int number;\n\n  final Rx<PopularSeriesConfig?> config = Rx<PopularSeriesConfig?>(null);\n  String? reminder;\n  List<PopularSeriesListItem>? seriesList;\n\n  @override\n  void onInit() {\n    super.onInit();\n    _getSeriesList();\n  }\n\n  Future<void> _getSeriesList() async {\n    final res = await VideoHttp.popularSeriesList();\n    if (res case Success(:final response)) {\n      if (response != null && response.isNotEmpty) {\n        number = response.first.number!;\n        seriesList = response;\n        queryData();\n      } else {\n        loadingState.value = const Success(null);\n      }\n    } else {\n      loadingState.value = res as Error;\n    }\n  }\n\n  @override\n  List<HotVideoItemModel>? getDataList(PopularSeriesOneData response) {\n    config.value = response.config;\n    reminder = response.reminder;\n    return response.list;\n  }\n\n  @override\n  Future<LoadingState<PopularSeriesOneData>> customGetData() =>\n      VideoHttp.popularSeriesOne(number: number);\n\n  @override\n  Future<void> onReload() {\n    if (seriesList.isNullOrEmpty) {\n      return _getSeriesList();\n    }\n    reload = true;\n    return super.onReload();\n  }\n}\n"
  },
  {
    "path": "lib/pages/popular_series/view.dart",
    "content": "import 'dart:math';\n\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/common/widgets/sliver/sliver_floating_header.dart';\nimport 'package:PiliPlus/common/widgets/video_card/video_card_h.dart';\nimport 'package:PiliPlus/common/widgets/view_sliver_safe_area.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/video/source_type.dart';\nimport 'package:PiliPlus/models/model_hot_video_item.dart';\nimport 'package:PiliPlus/models_new/popular/popular_series_one/config.dart';\nimport 'package:PiliPlus/pages/popular_series/controller.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass PopularSeriesPage extends StatefulWidget {\n  const PopularSeriesPage({super.key});\n\n  @override\n  State<PopularSeriesPage> createState() => _PopularSeriesPageState();\n}\n\nclass _PopularSeriesPageState extends State<PopularSeriesPage> with GridMixin {\n  final _controller = Get.put(PopularSeriesController());\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        title: Obx(() {\n          final config = _controller.config.value;\n          if (config != null) {\n            return Text(config.name!);\n          }\n          return const Text('每周必看');\n        }),\n      ),\n      body: refreshIndicator(\n        onRefresh: _controller.onRefresh,\n        child: CustomScrollView(\n          physics: ReloadScrollPhysics(controller: _controller),\n          slivers: [\n            ViewSliverSafeArea(\n              sliver: Obx(() => _buildBody(_controller.loadingState.value)),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget _buildBody(LoadingState<List<HotVideoItemModel>?> value) {\n    switch (value) {\n      case Loading():\n        return gridSkeleton;\n      case Success<List<HotVideoItemModel>?>(:final response):\n        Widget sliver;\n        if (response != null && response.isNotEmpty) {\n          sliver = SliverGrid.builder(\n            gridDelegate: gridDelegate,\n            itemCount: response.length,\n            itemBuilder: (context, index) {\n              final item = response[index];\n              return VideoCardH(\n                videoItem: item,\n                onTap: () {\n                  final config = _controller.config.value;\n                  PageUtils.toVideoPage(\n                    bvid: item.bvid,\n                    cid: item.cid!,\n                    extraArguments: {\n                      'sourceType': SourceType.playlist,\n                      'favTitle': '每周必看 ${config?.label ?? ''}',\n                      'mediaId': config?.mediaId,\n                      'desc': true,\n                      'oid': item.aid,\n                      'isContinuePlaying': index != 0,\n                    },\n                  );\n                },\n              );\n            },\n          );\n        } else {\n          sliver = HttpError(onReload: _controller.onReload);\n        }\n        if (_controller.config.value case final config?) {\n          sliver = SliverMainAxisGroup(\n            slivers: [\n              _buildSeriesList(config),\n              sliver,\n            ],\n          );\n        }\n        return sliver;\n      case Error(:final errMsg):\n        return HttpError(\n          errMsg: errMsg,\n          onReload: _controller.onReload,\n        );\n    }\n  }\n\n  Widget _buildSeriesList(PopularSeriesConfig config) {\n    final colorScheme = ColorScheme.of(context);\n    Widget child = GestureDetector(\n      behavior: HitTestBehavior.opaque,\n      onTap: () {\n        final number = _controller.number;\n        final seriesList = _controller.seriesList!;\n        final size = MediaQuery.sizeOf(context);\n        final padding = MediaQuery.viewPaddingOf(context);\n        final width = min(\n          min(\n            size.width - padding.horizontal - 80,\n            size.height - padding.vertical - 48,\n          ),\n          525.0,\n        );\n        final currIndex = seriesList.indexWhere((e) => e.number == number);\n        final controller = ScrollController(\n          initialScrollOffset: max(0, currIndex * 44 + 34 - width / 2),\n        );\n        showDialog(\n          context: context,\n          builder: (context) => Dialog(\n            clipBehavior: Clip.hardEdge,\n            child: SizedBox(\n              width: width,\n              height: width,\n              child: ListView.builder(\n                controller: controller,\n                padding: const EdgeInsets.symmetric(vertical: 12),\n                itemCount: seriesList.length,\n                itemExtent: 44,\n                itemBuilder: (context, index) {\n                  final item = seriesList[index];\n                  final isCurr = index == currIndex;\n                  return ListTile(\n                    dense: true,\n                    minTileHeight: 44,\n                    tileColor: isCurr ? Theme.of(context).highlightColor : null,\n                    onTap: () {\n                      Get.back();\n                      if (!isCurr) {\n                        _controller\n                          ..number = item.number!\n                          ..onReload();\n                      }\n                    },\n                    title: Text(\n                      item.name!,\n                      style: const TextStyle(fontSize: 14),\n                    ),\n                    trailing: isCurr ? const Icon(Icons.check, size: 18) : null,\n                    contentPadding: const EdgeInsetsGeometry.symmetric(\n                      horizontal: 16,\n                    ),\n                  );\n                },\n              ),\n            ),\n          ),\n        ).whenComplete(controller.dispose);\n      },\n      child: Text.rich(\n        style: TextStyle(\n          height: 1,\n          fontSize: 14,\n          color: colorScheme.onSurfaceVariant,\n        ),\n        strutStyle: const StrutStyle(height: 1, leading: 0, fontSize: 14),\n        TextSpan(\n          children: [\n            TextSpan(text: config.label!),\n            WidgetSpan(\n              alignment: PlaceholderAlignment.middle,\n              child: Icon(\n                size: 18,\n                Icons.keyboard_arrow_down,\n                color: colorScheme.onSurfaceVariant,\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n    if (_controller.reminder case final reminder?) {\n      child = Row(\n        spacing: 16,\n        children: [\n          child,\n          Text(\n            reminder,\n            style: TextStyle(color: colorScheme.outline),\n          ),\n        ],\n      );\n    }\n    return SliverFloatingHeaderWidget(\n      backgroundColor: colorScheme.surface,\n      child: Padding(\n        padding: const .only(left: 14, bottom: 7),\n        child: child,\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/rank/controller.dart",
    "content": "import 'dart:async';\n\nimport 'package:PiliPlus/models/common/rank_type.dart';\nimport 'package:PiliPlus/pages/common/common_controller.dart';\nimport 'package:PiliPlus/pages/rank/zone/controller.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass RankController extends GetxController\n    with GetSingleTickerProviderStateMixin, ScrollOrRefreshMixin {\n  RxInt tabIndex = 0.obs;\n  late TabController tabController;\n\n  ZoneController get controller {\n    final item = RankType.values[tabController.index];\n    return Get.find<ZoneController>(tag: '${item.rid}${item.seasonType}');\n  }\n\n  @override\n  ScrollController get scrollController => controller.scrollController;\n\n  @override\n  void onInit() {\n    super.onInit();\n    tabController = TabController(length: RankType.values.length, vsync: this);\n  }\n\n  @override\n  void onClose() {\n    tabController.dispose();\n    super.onClose();\n  }\n\n  @override\n  Future<void> onRefresh() => controller.onRefresh();\n}\n"
  },
  {
    "path": "lib/pages/rank/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/vertical_tabs.dart';\nimport 'package:PiliPlus/models/common/rank_type.dart';\nimport 'package:PiliPlus/pages/rank/controller.dart';\nimport 'package:PiliPlus/pages/rank/zone/view.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass RankPage extends StatefulWidget {\n  const RankPage({super.key});\n\n  @override\n  State<RankPage> createState() => _RankPageState();\n}\n\nclass _RankPageState extends State<RankPage>\n    with AutomaticKeepAliveClientMixin {\n  final RankController _rankController = Get.put(RankController());\n\n  @override\n  bool get wantKeepAlive => true;\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final theme = Theme.of(context);\n    return Row(\n      children: [\n        _buildTab(theme),\n        Expanded(\n          child: TabBarView(\n            physics: const NeverScrollableScrollPhysics(),\n            controller: _rankController.tabController,\n            children: RankType.values\n                .map(\n                  (item) => ZonePage(\n                    rid: item.rid,\n                    seasonType: item.seasonType,\n                  ),\n                )\n                .toList(),\n          ),\n        ),\n      ],\n    );\n  }\n\n  Widget _buildTab(ThemeData theme) {\n    return VerticalTabBar(\n      dividerWidth: 0,\n      isScrollable: true,\n      indicatorWeight: 3,\n      indicatorSize: .tab,\n      controller: _rankController.tabController,\n      padding: .only(bottom: MediaQuery.paddingOf(context).bottom + 105),\n      tabs: RankType.values.map((e) => VerticalTab(text: e.label)).toList(),\n      onTap: (index) {\n        if (!_rankController.tabController.indexIsChanging) {\n          _rankController.animateToTop();\n        } else {\n          _rankController\n            ..tabIndex.value = index\n            ..tabController.animateTo(index);\n        }\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/rank/zone/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/video.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\n\nclass ZoneController extends CommonListController {\n  ZoneController({this.rid, this.seasonType});\n\n  int? rid;\n  int? seasonType;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  Future<LoadingState> customGetData() {\n    if (rid != null) {\n      return VideoHttp.getRankVideoList(rid!);\n    }\n    if (seasonType == 1) {\n      return VideoHttp.pgcRankList(seasonType: seasonType!);\n    }\n    return VideoHttp.pgcSeasonRankList(seasonType: seasonType!);\n  }\n}\n"
  },
  {
    "path": "lib/pages/rank/zone/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/video_card/video_card_h.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/model_hot_video_item.dart';\nimport 'package:PiliPlus/pages/rank/zone/controller.dart';\nimport 'package:PiliPlus/pages/rank/zone/widget/pgc_rank_item.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass ZonePage extends StatefulWidget {\n  const ZonePage({super.key, this.rid, this.seasonType});\n\n  final int? rid;\n  final int? seasonType;\n\n  @override\n  State<ZonePage> createState() => _ZonePageState();\n}\n\nclass _ZonePageState extends State<ZonePage>\n    with AutomaticKeepAliveClientMixin, GridMixin {\n  late final ZoneController controller;\n\n  @override\n  void initState() {\n    controller = Get.put(\n      ZoneController(rid: widget.rid, seasonType: widget.seasonType),\n      tag: '${widget.rid}${widget.seasonType}',\n    );\n    super.initState();\n  }\n\n  @override\n  bool get wantKeepAlive => true;\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    return refreshIndicator(\n      onRefresh: controller.onRefresh,\n      child: CustomScrollView(\n        controller: controller.scrollController,\n        physics: const AlwaysScrollableScrollPhysics(),\n        slivers: [\n          SliverPadding(\n            padding: const EdgeInsets.only(top: 7, bottom: 100),\n            sliver: Obx(() => _buildBody(controller.loadingState.value)),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget _buildBody(LoadingState<List<dynamic>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => gridSkeleton,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverGrid.builder(\n                gridDelegate: gridDelegate,\n                itemBuilder: (context, index) {\n                  final item = response[index];\n                  if (item is HotVideoItemModel) {\n                    return VideoCardH(\n                      videoItem: item,\n                      onRemove: () => controller.loadingState\n                        ..value.data!.removeAt(index)\n                        ..refresh(),\n                    );\n                  }\n                  return PgcRankItem(item: item);\n                },\n                itemCount: response.length,\n              )\n            : HttpError(onReload: controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: controller.onReload,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/rank/zone/widget/pgc_rank_item.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/stat/stat.dart';\nimport 'package:PiliPlus/models/common/stat_type.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_rank/pgc_rank_item_model.dart';\nimport 'package:PiliPlus/utils/app_scheme.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\n\nclass PgcRankItem extends StatelessWidget {\n  const PgcRankItem({super.key, required this.item});\n\n  final PgcRankItemModel item;\n\n  @override\n  Widget build(BuildContext context) {\n    void onLongPress() => imageSaveDialog(\n      title: item.title,\n      cover: item.cover,\n    );\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onTap: () {\n          if (item.url != null) {\n            PiliScheme.routePushFromUrl(item.url!);\n          }\n        },\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        child: Padding(\n          padding: const EdgeInsets.symmetric(\n            horizontal: StyleString.safeSpace,\n            vertical: 5,\n          ),\n          child: Row(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              AspectRatio(\n                aspectRatio: 3 / 4,\n                child: LayoutBuilder(\n                  builder: (context, constraints) {\n                    return NetworkImgLayer(\n                      width: constraints.maxWidth,\n                      height: constraints.maxHeight,\n                      src: item.cover,\n                      borderRadius: const BorderRadius.all(\n                        Radius.circular(6),\n                      ),\n                    );\n                  },\n                ),\n              ),\n              const SizedBox(width: 10),\n              Expanded(\n                child: Column(\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    Expanded(\n                      child: Text(item.title!),\n                    ),\n                    if (item.newEp?.indexShow?.isNotEmpty == true) ...[\n                      Text(\n                        item.newEp!.indexShow!,\n                        maxLines: 1,\n                        style: TextStyle(\n                          fontSize: 12,\n                          height: 1,\n                          color: Theme.of(context).colorScheme.outline,\n                          overflow: TextOverflow.clip,\n                        ),\n                      ),\n                      const SizedBox(height: 4),\n                    ],\n                    Row(\n                      children: [\n                        StatWidget(\n                          type: StatType.play,\n                          value: item.stat!.view,\n                        ),\n                        const SizedBox(width: 8),\n                        StatWidget(\n                          type: StatType.follow,\n                          value: item.stat!.follow,\n                        ),\n                      ],\n                    ),\n                  ],\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/rcmd/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/video.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\n\nclass RcmdController extends CommonListController {\n  late bool enableSaveLastData = Pref.enableSaveLastData;\n  final bool appRcmd = Pref.appRcmd;\n\n  int? lastRefreshAt;\n  late bool savedRcmdTip = Pref.savedRcmdTip;\n\n  @override\n  void onInit() {\n    super.onInit();\n    page = 0;\n    queryData();\n  }\n\n  @override\n  Future<LoadingState> customGetData() {\n    return appRcmd\n        ? VideoHttp.rcmdVideoListApp(freshIdx: page)\n        : VideoHttp.rcmdVideoList(freshIdx: page, ps: 20);\n  }\n\n  @override\n  void handleListResponse(List dataList) {\n    if (enableSaveLastData && page == 0) {\n      if (loadingState.value case Success(:final response)) {\n        if (response != null && response.isNotEmpty) {\n          if (savedRcmdTip) {\n            lastRefreshAt = dataList.length;\n          }\n          if (response.length > 200) {\n            dataList.addAll(response.take(50));\n          } else {\n            dataList.addAll(response);\n          }\n        }\n      }\n    }\n  }\n\n  @override\n  Future<void> onRefresh() {\n    page = 0;\n    isEnd = false;\n    return queryData();\n  }\n}\n"
  },
  {
    "path": "lib/pages/rcmd/view.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/skeleton/video_card_v.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/video_card/video_card_v.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/pages/rcmd/controller.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass RcmdPage extends StatefulWidget {\n  const RcmdPage({super.key});\n\n  @override\n  State<RcmdPage> createState() => _RcmdPageState();\n}\n\nclass _RcmdPageState extends State<RcmdPage>\n    with AutomaticKeepAliveClientMixin {\n  final RcmdController controller = Get.put(RcmdController());\n\n  @override\n  bool get wantKeepAlive => true;\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    return Container(\n      clipBehavior: .hardEdge,\n      margin: const .symmetric(horizontal: StyleString.safeSpace),\n      decoration: const BoxDecoration(borderRadius: StyleString.mdRadius),\n      child: refreshIndicator(\n        onRefresh: controller.onRefresh,\n        child: CustomScrollView(\n          controller: controller.scrollController,\n          physics: const AlwaysScrollableScrollPhysics(),\n          slivers: [\n            SliverPadding(\n              padding: const .only(top: StyleString.cardSpace, bottom: 100),\n              sliver: Obx(() => _buildBody(controller.loadingState.value)),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  late final gridDelegate = SliverGridDelegateWithExtentAndRatio(\n    mainAxisSpacing: StyleString.cardSpace,\n    crossAxisSpacing: StyleString.cardSpace,\n    maxCrossAxisExtent: Pref.recommendCardWidth,\n    childAspectRatio: StyleString.aspectRatio,\n    mainAxisExtent: MediaQuery.textScalerOf(context).scale(90),\n  );\n\n  Widget _buildBody(LoadingState<List<dynamic>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => _buildSkeleton,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverGrid.builder(\n                gridDelegate: gridDelegate,\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    controller.onLoadMore();\n                  }\n                  if (controller.lastRefreshAt != null) {\n                    if (controller.lastRefreshAt == index) {\n                      return GestureDetector(\n                        onTap: () => controller\n                          ..animateToTop()\n                          ..onRefresh(),\n                        child: Card(\n                          child: Container(\n                            alignment: Alignment.center,\n                            padding: const .symmetric(horizontal: 10),\n                            child: Text(\n                              '上次看到这里\\n点击刷新',\n                              textAlign: .center,\n                              style: TextStyle(\n                                color: Theme.of(\n                                  context,\n                                ).colorScheme.onSurfaceVariant,\n                              ),\n                            ),\n                          ),\n                        ),\n                      );\n                    }\n                    final actualIndex = index > controller.lastRefreshAt!\n                        ? index - 1\n                        : index;\n                    return VideoCardV(\n                      videoItem: response[actualIndex],\n                      onRemove: () {\n                        if (controller.lastRefreshAt != null &&\n                            actualIndex < controller.lastRefreshAt!) {\n                          controller.lastRefreshAt =\n                              controller.lastRefreshAt! - 1;\n                        }\n                        controller.loadingState\n                          ..value.data!.removeAt(actualIndex)\n                          ..refresh();\n                      },\n                    );\n                  } else {\n                    return VideoCardV(\n                      videoItem: response[index],\n                      onRemove: () => controller.loadingState\n                        ..value.data!.removeAt(index)\n                        ..refresh(),\n                    );\n                  }\n                },\n                itemCount: controller.lastRefreshAt != null\n                    ? response.length + 1\n                    : response.length,\n              )\n            : HttpError(onReload: controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: controller.onReload,\n      ),\n    };\n  }\n\n  Widget get _buildSkeleton => SliverGrid.builder(\n    gridDelegate: gridDelegate,\n    itemBuilder: (context, index) => const VideoCardVSkeleton(),\n    itemCount: 10,\n  );\n}\n"
  },
  {
    "path": "lib/pages/save_panel/view.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'\n    show ReplyInfo;\nimport 'package:PiliPlus/models/common/video/video_type.dart';\nimport 'package:PiliPlus/models/dynamics/result.dart';\nimport 'package:PiliPlus/pages/common/publish/publish_route.dart';\nimport 'package:PiliPlus/pages/dynamics/widgets/dynamic_panel.dart';\nimport 'package:PiliPlus/pages/music/controller.dart';\nimport 'package:PiliPlus/pages/video/introduction/pgc/controller.dart';\nimport 'package:PiliPlus/pages/video/introduction/ugc/controller.dart';\nimport 'package:PiliPlus/pages/video/reply/widgets/reply_item_grpc.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/extension/context_ext.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/image_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:intl/intl.dart' show DateFormat;\nimport 'package:pretty_qr_code/pretty_qr_code.dart';\nimport 'package:share_plus/share_plus.dart';\n\nclass SavePanel extends StatefulWidget {\n  const SavePanel({\n    required this.item,\n    // reply\n    this.upMid,\n    super.key,\n  });\n\n  final dynamic upMid;\n  final dynamic item;\n\n  @override\n  State<SavePanel> createState() => _SavePanelState();\n\n  static void toSavePanel({dynamic upMid, dynamic item}) {\n    Get.key.currentState!.push(\n      PublishRoute(\n        pageBuilder: (context, animation, secondaryAnimation) {\n          return SavePanel(upMid: upMid, item: item);\n        },\n        transitionDuration: const Duration(milliseconds: 255),\n        transitionBuilder: (context, animation, secondaryAnimation, child) {\n          return FadeTransition(\n            opacity: animation.drive(CurveTween(curve: Curves.easeInOut)),\n            child: child,\n          );\n        },\n        settings: RouteSettings(arguments: Get.arguments),\n      ),\n    );\n  }\n}\n\nclass _SavePanelState extends State<SavePanel> {\n  final boundaryKey = GlobalKey();\n\n  bool showBottom = true;\n\n  // item\n  Object get _item => widget.item;\n  late String viewType = '查看';\n  late String itemType = '内容';\n\n  //reply\n  String? cover;\n  _CoverType coverType = _CoverType.def16_9;\n  String? title;\n  int? pubdate;\n  DateFormat dateFormat = DateFormatUtils.longFormatDs;\n  String? uname;\n\n  String uri = '';\n\n  @override\n  void initState() {\n    super.initState();\n    if (_item case final ReplyInfo reply) {\n      itemType = '评论';\n      final currentRoute = Get.currentRoute;\n      late final hasRoot = reply.hasRoot();\n\n      if (currentRoute.startsWith('/video')) {\n        final rootId = hasRoot ? reply.root : reply.id;\n\n        uri =\n            'https://www.bilibili.com/video/av${reply.oid}?comment_on=1&comment_root_id=$rootId${hasRoot ? '&comment_secondary_id=${reply.id}' : ''}';\n        try {\n          final heroTag = Get.arguments['heroTag'];\n          final videoType = Get.arguments['videoType'];\n          if (videoType == VideoType.pgc || videoType == VideoType.pugv) {\n            final ctr = Get.find<PgcIntroController>(tag: heroTag);\n            final pgcItem = ctr.pgcItem;\n            final cid = ctr.cid.value;\n            final episode = pgcItem.episodes!.firstWhere(\n              (e) => e.cid == cid,\n            );\n            cover = episode.cover;\n            title =\n                episode.shareCopy ??\n                '${pgcItem.title} ${episode.showTitle ?? episode.longTitle ?? ''}';\n            pubdate = episode.pubTime;\n            uname = pgcItem.upInfo?.uname;\n\n            final oid = reply.oid;\n            final type = reply.type.toInt();\n            final anchor = hasRoot ? 'anchor=${reply.id}&' : '';\n            uri =\n                'bilibili://comment/detail/$type/$oid/$rootId/?${anchor}enterUri=bilibili://pgc/season/ep/${ctr.epId}';\n          } else {\n            final ctr = Get.find<UgcIntroController>(tag: heroTag);\n            final videoDetail = ctr.videoDetail.value;\n            cover = videoDetail.pic;\n            title = videoDetail.title;\n            pubdate = videoDetail.pubdate;\n            uname = videoDetail.owner?.name;\n\n            final cid = ctr.cid.value;\n            final part =\n                ctr.videoDetail.value.pages?.indexWhere((i) => i.cid == cid) ??\n                -1;\n            if (part > 0) uri += '&p=${part + 1}';\n          }\n        } catch (_) {}\n      } else if (currentRoute.startsWith('/dynamicDetail')) {\n        DynamicItemModel? dynItem;\n        try {\n          dynItem = Get.arguments['item'] as DynamicItemModel;\n          uname = dynItem.modules.moduleAuthor?.name;\n        } catch (_) {}\n        final type = reply.type.toInt();\n        final oid = reply.oid;\n        final rootId = hasRoot ? reply.root : reply.id;\n\n        if (type == 1) {\n          uri =\n              'https://www.bilibili.com/video/av$oid?comment_on=1&comment_root_id=$rootId${hasRoot ? '&comment_secondary_id=${reply.id}' : ''}';\n        } else {\n          final enterUri = dynItem == null\n              ? ''\n              : 'enterUri=${parseDyn(dynItem)}';\n          uri =\n              'bilibili://comment/detail/$type/$oid/$rootId/?${hasRoot ? 'anchor=${reply.id}&' : ''}$enterUri';\n        }\n      } else if (currentRoute.startsWith('/Scaffold')) {\n        try {\n          final type = reply.type.toInt();\n          final oid = Get.arguments['oid'] ?? reply.oid;\n          final rootId = hasRoot ? reply.root : reply.id;\n          if (type == 1) {\n            uri =\n                'https://www.bilibili.com/video/av$oid?comment_on=1&comment_root_id=$rootId${hasRoot ? '&comment_secondary_id=${reply.id}' : ''}';\n          } else {\n            String enterUri = Get.arguments['enterUri'] ?? '';\n            if (enterUri.isNotEmpty) {\n              enterUri = 'enterUri=${Uri.encodeComponent(enterUri)}';\n            } else if (const [11, 12, 17].contains(type)) {\n              enterUri = 'enterUri=bilibili://following/detail/$oid';\n            }\n            uri =\n                'bilibili://comment/detail/$type/$oid/$rootId/?${hasRoot ? 'anchor=${reply.id}&' : ''}$enterUri';\n          }\n        } catch (_) {}\n      } else if (currentRoute.startsWith('/articlePage')) {\n        try {\n          final type = reply.type.toInt();\n          final oid = reply.oid;\n          final rootId = hasRoot ? reply.root : reply.id;\n          final anchor = hasRoot ? 'anchor=${reply.id}&' : '';\n          final enterUri =\n              'bilibili://following/detail/${Get.parameters['id'] ?? Get.arguments?['id']}';\n          uri =\n              'bilibili://comment/detail/$type/$oid/$rootId/?${anchor}enterUri=$enterUri';\n        } catch (_) {}\n      } else if (currentRoute.startsWith('/musicDetail')) {\n        final type = reply.type.toInt();\n        final oid = reply.oid;\n        final rootId = hasRoot ? reply.root : reply.id;\n        final anchor = hasRoot ? 'anchor=${reply.id}&' : '';\n        String enterUri = '';\n        try {\n          final ctr = Get.find<MusicDetailController>(\n            tag: Get.parameters['musicId'],\n          );\n          enterUri =\n              'enterUri=${Uri.encodeComponent(ctr.shareUrl)}'; // official client cannot parse it\n          final data = ctr.infoState.value.dataOrNull;\n          if (data != null) {\n            coverType = _CoverType.square;\n            cover = data.mvCover;\n            title = data.musicTitle;\n            if (data.musicPublish != null) {\n              final time = DateTime.tryParse(\n                data.musicPublish!,\n              )?.millisecondsSinceEpoch;\n              if (time != null) {\n                pubdate = time ~/ 1000;\n                dateFormat = DateFormatUtils.longFormat;\n              }\n            }\n          }\n        } catch (_) {}\n        uri = 'bilibili://comment/detail/$type/$oid/$rootId/?$anchor$enterUri';\n      }\n\n      if (kDebugMode) debugPrint(uri);\n    } else if (_item case final DynamicItemModel i) {\n      uri = parseDyn(i);\n\n      if (kDebugMode) debugPrint(uri);\n    }\n  }\n\n  String parseDyn(DynamicItemModel item) {\n    String uri = '';\n    try {\n      switch (item.type) {\n        case 'DYNAMIC_TYPE_AV':\n          viewType = '观看';\n          itemType = '视频';\n          uri = 'bilibili://video/${item.basic!.commentIdStr}';\n          break;\n\n        case 'DYNAMIC_TYPE_ARTICLE':\n          itemType = '专栏';\n          uri = 'bilibili://following/detail/${item.idStr}';\n          break;\n\n        case 'DYNAMIC_TYPE_LIVE_RCMD':\n          viewType = '观看';\n          itemType = '直播';\n          final roomId = item.modules.moduleDynamic!.major!.liveRcmd!.roomId;\n          uri = 'bilibili://live/$roomId';\n          break;\n\n        case 'DYNAMIC_TYPE_UGC_SEASON':\n          viewType = '观看';\n          itemType = '合集';\n          final aid = item.modules.moduleDynamic!.major!.ugcSeason!.aid;\n          uri = 'bilibili://video/$aid';\n          break;\n\n        case 'DYNAMIC_TYPE_PGC':\n        case 'DYNAMIC_TYPE_PGC_UNION':\n          viewType = '观看';\n          itemType =\n              item.modules.moduleDynamic?.major?.pgc?.badge?.text ?? '番剧';\n          final epid = item.modules.moduleDynamic!.major!.pgc!.epid;\n          uri = 'bilibili://pgc/season/ep/$epid';\n          break;\n\n        // https://www.bilibili.com/medialist/detail/ml12345678\n        case 'DYNAMIC_TYPE_MEDIALIST':\n          itemType = '收藏夹';\n          final mediaId = item.modules.moduleDynamic!.major!.medialist!.id;\n          uri = 'bilibili://medialist/detail/$mediaId';\n          break;\n\n        // 纯文字动态查看\n        // case 'DYNAMIC_TYPE_WORD':\n        // # 装扮/剧集点评/普通分享\n        // case 'DYNAMIC_TYPE_COMMON_SQUARE':\n        // 转发的动态\n        // case 'DYNAMIC_TYPE_FORWARD':\n        // 图文动态查看\n        // case 'DYNAMIC_TYPE_DRAW':\n        default:\n          itemType = '动态';\n          uri = 'bilibili://following/detail/${item.idStr}';\n          break;\n      }\n    } catch (_) {}\n    return uri;\n  }\n\n  Future<void> _onSaveOrSharePic([bool isShare = false]) async {\n    if (!isShare &&\n        PlatformUtils.isMobile &&\n        !await ImageUtils.checkPermissionDependOnSdkInt()) {\n      return;\n    }\n    SmartDialog.showLoading();\n    try {\n      final boundary =\n          boundaryKey.currentContext!.findRenderObject()\n              as RenderRepaintBoundary;\n      final image = await boundary.toImage(pixelRatio: 3);\n      final byteData = await image.toByteData(format: .png);\n      image.dispose();\n      final pngBytes = byteData!.buffer.asUint8List();\n      final picName =\n          \"${Constants.appName}_${itemType}_${DateFormat('yyyyMMddHHmmss').format(DateTime.now())}\";\n      if (isShare) {\n        Get.back();\n        SmartDialog.dismiss();\n        SharePlus.instance.share(\n          ShareParams(\n            files: [\n              XFile.fromData(\n                pngBytes,\n                name: picName,\n                mimeType: 'image/png',\n              ),\n            ],\n            sharePositionOrigin: await Utils.sharePositionOrigin,\n          ),\n        );\n      } else {\n        final result = await ImageUtils.saveByteImg(\n          bytes: pngBytes,\n          fileName: picName,\n        );\n        if (result != null) {\n          if (result.isSuccess) {\n            Get.back();\n          }\n        }\n      }\n    } catch (e) {\n      if (kDebugMode) debugPrint('on save/share reply: $e');\n      SmartDialog.dismiss();\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    final padding = MediaQuery.viewPaddingOf(context);\n    final maxWidth = context.mediaQueryShortestSide;\n    late final coverSize = MediaQuery.textScalerOf(context).scale(65);\n    return Stack(\n      clipBehavior: .none,\n      alignment: .center,\n      children: [\n        SingleChildScrollView(\n          hitTestBehavior: .deferToChild,\n          padding: .only(\n            top: 12 + padding.top,\n            bottom: 80 + padding.bottom,\n          ),\n          child: Container(\n            width: maxWidth,\n            padding: const .symmetric(horizontal: 12),\n            child: RepaintBoundary(\n              key: boundaryKey,\n              child: Container(\n                clipBehavior: .hardEdge,\n                decoration: BoxDecoration(\n                  color: theme.colorScheme.surface,\n                  borderRadius: const .all(.circular(12)),\n                ),\n                child: AnimatedSize(\n                  curve: Curves.easeInOut,\n                  alignment: .topCenter,\n                  duration: const Duration(milliseconds: 255),\n                  child: Column(\n                    mainAxisSize: .min,\n                    crossAxisAlignment: .start,\n                    children: [\n                      switch (_item) {\n                        ReplyInfo reply => IgnorePointer(\n                          child: ReplyItemGrpc(\n                            replyItem: reply,\n                            replyLevel: 0,\n                            needDivider: false,\n                            upMid: widget.upMid,\n                          ),\n                        ),\n                        DynamicItemModel dyn => IgnorePointer(\n                          child: DynamicPanel(\n                            item: dyn,\n                            isDetail: true,\n                            isSave: true,\n                          ),\n                        ),\n                        _ => throw UnsupportedError(_item.toString()),\n                      },\n                      if (cover?.isNotEmpty == true &&\n                          title?.isNotEmpty == true)\n                        Container(\n                          height: 81,\n                          clipBehavior: Clip.hardEdge,\n                          margin: const .symmetric(horizontal: 12),\n                          padding: const .all(8),\n                          decoration: BoxDecoration(\n                            color: theme.colorScheme.onInverseSurface,\n                            borderRadius: const .all(.circular(8)),\n                          ),\n                          child: Row(\n                            spacing: 10,\n                            children: [\n                              NetworkImgLayer(\n                                src: cover!,\n                                height: coverSize,\n                                width: coverType == .def16_9\n                                    ? coverSize * StyleString.aspectRatio16x9\n                                    : coverSize,\n                                quality: 100,\n                                borderRadius: const .all(.circular(6)),\n                              ),\n                              Expanded(\n                                child: Column(\n                                  crossAxisAlignment: .start,\n                                  children: [\n                                    Expanded(\n                                      child: Text(\n                                        '$title\\n',\n                                        maxLines: 2,\n                                        overflow: .ellipsis,\n                                      ),\n                                    ),\n                                    if (pubdate != null)\n                                      Text(\n                                        DateFormatUtils.format(\n                                          pubdate,\n                                          format: dateFormat,\n                                        ),\n                                        style: TextStyle(\n                                          color: theme.colorScheme.outline,\n                                        ),\n                                      ),\n                                  ],\n                                ),\n                              ),\n                            ],\n                          ),\n                        ),\n                      showBottom\n                          ? Stack(\n                              clipBehavior: .none,\n                              children: [\n                                if (uri.isNotEmpty)\n                                  Align(\n                                    alignment: .centerRight,\n                                    child: Row(\n                                      children: [\n                                        Expanded(\n                                          child: Column(\n                                            mainAxisSize: .min,\n                                            crossAxisAlignment: .end,\n                                            spacing: 4,\n                                            children: [\n                                              if (uname?.isNotEmpty == true)\n                                                Text(\n                                                  '@$uname',\n                                                  maxLines: 1,\n                                                  overflow: .ellipsis,\n                                                  style: TextStyle(\n                                                    color: theme\n                                                        .colorScheme\n                                                        .primary,\n                                                  ),\n                                                ),\n                                              Text(\n                                                '识别二维码，$viewType$itemType',\n                                                textAlign: .end,\n                                                style: TextStyle(\n                                                  color: theme\n                                                      .colorScheme\n                                                      .onSurfaceVariant,\n                                                ),\n                                              ),\n                                              Text(\n                                                DateFormatUtils.longFormatDs\n                                                    .format(.now()),\n                                                textAlign: .end,\n                                                style: TextStyle(\n                                                  fontSize: 13,\n                                                  color:\n                                                      theme.colorScheme.outline,\n                                                ),\n                                              ),\n                                            ],\n                                          ),\n                                        ),\n                                        GestureDetector(\n                                          onTap: () => Utils.copyText(uri),\n                                          child: Container(\n                                            width: 88,\n                                            height: 88,\n                                            margin: const .all(12),\n                                            padding: const .all(3),\n                                            color: theme.brightness.isDark\n                                                ? Colors.white\n                                                : theme.colorScheme.surface,\n                                            child: PrettyQrView.data(\n                                              data: uri,\n                                              decoration:\n                                                  const PrettyQrDecoration(\n                                                    shape:\n                                                        PrettyQrSquaresSymbol(),\n                                                  ),\n                                            ),\n                                          ),\n                                        ),\n                                      ],\n                                    ),\n                                  ),\n                                Align(\n                                  alignment: .centerLeft,\n                                  child: Image.asset(\n                                    'assets/images/logo/logo_2.png',\n                                    width: 100,\n                                    cacheWidth: 100.cacheSize(context),\n                                    color: theme.colorScheme.onSurfaceVariant,\n                                  ),\n                                ),\n                              ],\n                            )\n                          : const SizedBox(height: 12),\n                    ],\n                  ),\n                ),\n              ),\n            ),\n          ),\n        ),\n        Positioned(\n          left: 0,\n          right: 0,\n          bottom: 0,\n          child: DecoratedBox(\n            decoration: const BoxDecoration(\n              gradient: LinearGradient(\n                begin: .topCenter,\n                end: .bottomCenter,\n                colors: [\n                  Colors.transparent,\n                  Colors.black54,\n                ],\n              ),\n            ),\n            child: Padding(\n              padding: EdgeInsets.only(\n                left: padding.left,\n                right: padding.right,\n                bottom: 25 + padding.bottom,\n              ),\n              child: Row(\n                spacing: 40,\n                mainAxisAlignment: .center,\n                children: [\n                  iconButton(\n                    size: 42,\n                    tooltip: '关闭',\n                    icon: const Icon(Icons.clear),\n                    onPressed: Get.back,\n                    bgColor: theme.colorScheme.onInverseSurface,\n                    iconColor: theme.colorScheme.onSurfaceVariant,\n                  ),\n                  iconButton(\n                    size: 42,\n                    tooltip: showBottom ? '隐藏' : '显示',\n                    context: context,\n                    icon: showBottom\n                        ? const Icon(Icons.visibility_off)\n                        : const Icon(Icons.visibility),\n                    onPressed: () => setState(() {\n                      showBottom = !showBottom;\n                    }),\n                  ),\n                  if (PlatformUtils.isMobile)\n                    iconButton(\n                      size: 42,\n                      tooltip: '分享',\n                      context: context,\n                      icon: const Icon(Icons.share),\n                      onPressed: () => _onSaveOrSharePic(true),\n                    ),\n                  iconButton(\n                    size: 42,\n                    tooltip: '保存',\n                    context: context,\n                    icon: const Icon(Icons.save_alt),\n                    onPressed: _onSaveOrSharePic,\n                  ),\n                ],\n              ),\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n}\n\nenum _CoverType { def16_9, square }\n"
  },
  {
    "path": "lib/pages/search/controller.dart",
    "content": "import 'dart:async';\n\nimport 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/search.dart';\nimport 'package:PiliPlus/models/search/suggest.dart';\nimport 'package:PiliPlus/models_new/search/search_rcmd/data.dart';\nimport 'package:PiliPlus/models_new/search/search_trending/data.dart';\nimport 'package:PiliPlus/utils/extension/get_ext.dart';\nimport 'package:PiliPlus/utils/extension/string_ext.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/scheduler.dart';\nimport 'package:get/get.dart';\nimport 'package:stream_transform/stream_transform.dart';\n\nmixin DebounceStreamMixin<T> {\n  final Duration duration = const Duration(milliseconds: 200);\n  StreamController<T>? ctr;\n  StreamSubscription<T>? _sub;\n  void onValueChanged(T value);\n\n  void subInit() {\n    _sub = (ctr = StreamController<T>()).stream\n        .debounce(duration, trailing: true)\n        .listen(onValueChanged);\n  }\n\n  void subDispose() {\n    _sub?.cancel();\n    ctr?.close();\n    _sub = null;\n    ctr = null;\n  }\n}\n\nabstract class DebounceStreamState<T extends StatefulWidget, S> extends State<T>\n    with DebounceStreamMixin<S> {\n  @override\n  void dispose() {\n    subDispose();\n    super.dispose();\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    subInit();\n  }\n}\n\nclass BaseSearchController extends GetxController {\n  final historyList = List<String>.from(\n    GStorage.historyWord.get('cacheList') ?? const <String>[],\n  ).obs;\n\n  late final Rx<LoadingState<SearchTrendingData>> trendingState;\n\n  final recordSearchHistory = Pref.recordSearchHistory.obs;\n  final searchSuggestion = Pref.searchSuggestion;\n  final enableTrending = Pref.enableTrending;\n  final enableSearchRcmd = Pref.enableSearchRcmd;\n\n  @override\n  void onInit() {\n    super.onInit();\n\n    if (enableTrending) {\n      trendingState = LoadingState<SearchTrendingData>.loading().obs;\n      queryTrendingList();\n    }\n  }\n\n  // 获取热搜关键词\n  Future<void> queryTrendingList() async {\n    trendingState.value = await SearchHttp.searchTrending(limit: 10);\n  }\n}\n\nclass SSearchController extends GetxController\n    with DebounceStreamMixin<String> {\n  SSearchController(this.tag);\n  final String tag;\n\n  final searchFocusNode = FocusNode();\n  final controller = TextEditingController();\n  final _baseCtr = Get.putOrFind(BaseSearchController.new);\n\n  String? hintText;\n\n  int initIndex = 0;\n\n  // uid\n  final RxBool showUidBtn = false.obs;\n\n  // history\n  RxBool get recordSearchHistory => _baseCtr.recordSearchHistory;\n  RxList<String> get historyList => _baseCtr.historyList;\n\n  // suggestion\n  bool get searchSuggestion => _baseCtr.searchSuggestion;\n  late final RxList<SearchSuggestItem> searchSuggestList;\n\n  // trending\n  bool get enableTrending => _baseCtr.enableTrending;\n  Rx<LoadingState<SearchTrendingData>> get trendingState =>\n      _baseCtr.trendingState;\n\n  // rcmd\n  bool get enableSearchRcmd => _baseCtr.enableSearchRcmd;\n  late final Rx<LoadingState<SearchRcmdData>> recommendData;\n\n  Future<void> Function() get queryTrendingList => _baseCtr.queryTrendingList;\n\n  @override\n  void onInit() {\n    super.onInit();\n    final params = Get.parameters;\n    hintText = params['hintText'];\n    final text = params['text'];\n    if (text != null) {\n      controller.text = text;\n    }\n\n    if (searchSuggestion) {\n      subInit();\n      searchSuggestList = <SearchSuggestItem>[].obs;\n    }\n\n    if (enableSearchRcmd) {\n      recommendData = LoadingState<SearchRcmdData>.loading().obs;\n      queryRecommendList();\n    }\n  }\n\n  void validateUid() {\n    showUidBtn.value = IdUtils.digitOnlyRegExp.hasMatch(controller.text);\n  }\n\n  void onChange(String value) {\n    validateUid();\n    if (searchSuggestion) {\n      if (value.isEmpty) {\n        searchSuggestList.clear();\n      } else {\n        ctr!.add(value);\n      }\n    }\n  }\n\n  void onClear() {\n    if (controller.value.text != '') {\n      controller.clear();\n      if (searchSuggestion) searchSuggestList.clear();\n      searchFocusNode.requestFocus();\n      showUidBtn.value = false;\n    } else {\n      Get.back();\n    }\n  }\n\n  // 搜索\n  Future<void> submit() async {\n    if (controller.text.isEmpty) {\n      if (hintText.isNullOrEmpty) {\n        return;\n      }\n      controller.text = hintText!;\n      validateUid();\n    }\n\n    if (recordSearchHistory.value) {\n      historyList\n        ..remove(controller.text)\n        ..insert(0, controller.text);\n      GStorage.historyWord.put('cacheList', historyList);\n    }\n\n    searchFocusNode.unfocus();\n    await Get.toNamed(\n      '/searchResult',\n      parameters: {\n        'tag': tag,\n        'keyword': controller.text,\n      },\n      arguments: {\n        'initIndex': initIndex,\n        'fromSearch': true,\n      },\n    );\n    searchFocusNode.requestFocus();\n    if (PlatformUtils.isDesktop) {\n      SchedulerBinding.instance.addPostFrameCallback((_) {\n        controller.selection = TextSelection.collapsed(\n          offset: controller.text.length,\n        );\n      });\n    }\n  }\n\n  Future<void> queryRecommendList() async {\n    recommendData.value = await SearchHttp.searchRecommend();\n  }\n\n  void onClickKeyword(String keyword) {\n    controller.text = keyword;\n    validateUid();\n\n    if (searchSuggestion) searchSuggestList.clear();\n    submit();\n  }\n\n  @override\n  Future<void> onValueChanged(String value) async {\n    final res = await SearchHttp.searchSuggest(term: value);\n    if (res case Success(:final response)) {\n      if (response.tag?.isNotEmpty == true) {\n        searchSuggestList.value = response.tag!;\n      }\n    }\n  }\n\n  void onLongSelect(String word) {\n    historyList.remove(word);\n    GStorage.historyWord.put('cacheList', historyList);\n  }\n\n  void onClearHistory() {\n    showConfirmDialog(\n      context: Get.context!,\n      title: '确定清空搜索历史？',\n      onConfirm: () {\n        historyList.clear();\n        GStorage.historyWord.delete('cacheList');\n      },\n    );\n  }\n\n  @override\n  void onClose() {\n    subDispose();\n    searchFocusNode.dispose();\n    controller.dispose();\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "lib/pages/search/view.dart",
    "content": "import 'dart:convert';\n\nimport 'package:PiliPlus/common/widgets/dialog/export_import.dart';\nimport 'package:PiliPlus/common/widgets/disabled_icon.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/sliver_wrap.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/search/search_rcmd/data.dart';\nimport 'package:PiliPlus/pages/search/controller.dart';\nimport 'package:PiliPlus/pages/search/widgets/hot_keyword.dart';\nimport 'package:PiliPlus/pages/search/widgets/search_text.dart';\nimport 'package:PiliPlus/utils/em.dart' show Em;\nimport 'package:PiliPlus/utils/extension/size_ext.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\nimport 'package:get/get.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  final _tag = Utils.generateRandomString(6);\n  late final SSearchController _searchController;\n  late ThemeData theme;\n  late bool isPortrait;\n  late EdgeInsets padding;\n\n  @override\n  void initState() {\n    super.initState();\n    _searchController = Get.put(\n      SSearchController(_tag),\n      tag: _tag,\n    );\n  }\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    theme = Theme.of(context);\n    padding = MediaQuery.viewPaddingOf(context);\n    isPortrait = MediaQuery.sizeOf(context).isPortrait;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final trending = _searchController.enableTrending\n        ? _buildHotSearch()\n        : null;\n    final rcmd = _searchController.enableSearchRcmd\n        ? _buildHotSearch(isTrending: false)\n        : null;\n\n    return Scaffold(\n      appBar: _buildAppBar,\n      body: Padding(\n        padding: .only(left: padding.left, right: padding.right),\n        child: CustomScrollView(\n          slivers: [\n            if (_searchController.searchSuggestion) _buildSearchSuggest(),\n            if (isPortrait) ...[\n              ?trending,\n              _buildHistory,\n              ?rcmd,\n            ] else if (_searchController.enableTrending ||\n                _searchController.enableSearchRcmd)\n              SliverCrossAxisGroup(\n                slivers: [\n                  SliverMainAxisGroup(slivers: [?trending, ?rcmd]),\n                  _buildHistory,\n                ],\n              )\n            else\n              _buildHistory,\n            SliverPadding(padding: .only(bottom: padding.bottom)),\n          ],\n        ),\n      ),\n    );\n  }\n\n  PreferredSizeWidget get _buildAppBar => AppBar(\n    shape: Border(\n      bottom: BorderSide(\n        color: theme.dividerColor.withValues(alpha: 0.08),\n        width: 1,\n      ),\n    ),\n    actions: [\n      Obx(\n        () => _searchController.showUidBtn.value\n            ? IconButton(\n                tooltip: 'UID搜索用户',\n                icon: const Icon(Icons.person_outline, size: 22),\n                onPressed: () => Get.toNamed(\n                  '/member?mid=${_searchController.controller.text}',\n                ),\n              )\n            : const SizedBox.shrink(),\n      ),\n      IconButton(\n        tooltip: '清空',\n        icon: const Icon(Icons.clear, size: 22),\n        onPressed: _searchController.onClear,\n      ),\n      IconButton(\n        tooltip: '搜索',\n        onPressed: _searchController.submit,\n        icon: const Icon(Icons.search, size: 22),\n      ),\n      const SizedBox(width: 10),\n    ],\n    title: TextField(\n      autofocus: true,\n      focusNode: _searchController.searchFocusNode,\n      controller: _searchController.controller,\n      textInputAction: TextInputAction.search,\n      onChanged: _searchController.onChange,\n      decoration: InputDecoration(\n        visualDensity: .standard,\n        hintText: _searchController.hintText ?? '搜索',\n        border: InputBorder.none,\n      ),\n      onSubmitted: (value) => _searchController.submit(),\n    ),\n  );\n\n  Widget _buildSearchSuggest() {\n    return Obx(() {\n      final list = _searchController.searchSuggestList;\n      return list.isNotEmpty &&\n              list.first.term != null &&\n              _searchController.controller.text != ''\n          ? SliverList.list(\n              children: list\n                  .map(\n                    (item) => InkWell(\n                      borderRadius: const .all(.circular(4)),\n                      onTap: () => _searchController.onClickKeyword(item.term!),\n                      child: Padding(\n                        padding: const .only(left: 20, top: 9, bottom: 9),\n                        child: Text.rich(\n                          TextSpan(\n                            children: Em.regTitle(item.textRich)\n                                .map(\n                                  (e) => TextSpan(\n                                    text: e.text,\n                                    style: e.isEm\n                                        ? TextStyle(\n                                            fontWeight: FontWeight.bold,\n                                            color: Theme.of(\n                                              context,\n                                            ).colorScheme.primary,\n                                          )\n                                        : null,\n                                  ),\n                                )\n                                .toList(),\n                          ),\n                        ),\n                      ),\n                    ),\n                  )\n                  .toList(),\n            )\n          : const SliverToBoxAdapter();\n    });\n  }\n\n  Widget _buildHotSearch({\n    bool isTrending = true,\n  }) {\n    final text = Text(\n      isTrending ? '大家都在搜' : '搜索发现',\n      strutStyle: const StrutStyle(leading: 0, height: 1),\n      style: theme.textTheme.titleMedium!.copyWith(\n        height: 1,\n        fontWeight: FontWeight.bold,\n      ),\n    );\n    final outline = theme.colorScheme.outline;\n    final secondary = theme.colorScheme.secondary;\n    final style = TextStyle(\n      height: 1,\n      fontSize: 13,\n      color: outline,\n    );\n    return SliverPadding(\n      padding: EdgeInsets.fromLTRB(\n        10,\n        !isTrending && (isPortrait || _searchController.enableTrending)\n            ? 4\n            : 25,\n        4,\n        25,\n      ),\n      sliver: SliverMainAxisGroup(\n        slivers: [\n          SliverPadding(\n            padding: const EdgeInsets.fromLTRB(6, 0, 6, 6),\n            sliver: SliverToBoxAdapter(\n              child: Row(\n                mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                children: [\n                  isTrending\n                      ? Row(\n                          mainAxisSize: MainAxisSize.min,\n                          children: [\n                            text,\n                            const SizedBox(width: 14),\n                            TextButton(\n                              style: const ButtonStyle(\n                                visualDensity: .compact,\n                                tapTargetSize: .shrinkWrap,\n                                padding: WidgetStatePropertyAll(\n                                  .symmetric(horizontal: 10),\n                                ),\n                              ),\n                              onPressed: () => Get.toNamed('/searchTrending'),\n                              child: Row(\n                                children: [\n                                  Text(\n                                    '完整榜单',\n                                    strutStyle: const StrutStyle(\n                                      leading: 0,\n                                      height: 1,\n                                    ),\n                                    style: style,\n                                  ),\n                                  Icon(\n                                    size: 18,\n                                    Icons.keyboard_arrow_right,\n                                    color: outline,\n                                  ),\n                                ],\n                              ),\n                            ),\n                          ],\n                        )\n                      : text,\n                  TextButton.icon(\n                    style: const ButtonStyle(\n                      visualDensity: .compact,\n                      tapTargetSize: .shrinkWrap,\n                      padding: WidgetStatePropertyAll(\n                        .symmetric(horizontal: 10),\n                      ),\n                    ),\n                    onPressed: isTrending\n                        ? _searchController.queryTrendingList\n                        : _searchController.queryRecommendList,\n                    icon: Icon(\n                      Icons.refresh_outlined,\n                      size: 18,\n                      color: secondary,\n                    ),\n                    label: Text(\n                      '刷新',\n                      strutStyle: const StrutStyle(leading: 0, height: 1),\n                      style: TextStyle(\n                        height: 1,\n                        color: secondary,\n                      ),\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          ),\n          Obx(\n            () => _buildHotKey(\n              isTrending\n                  ? _searchController.trendingState.value\n                  : _searchController.recommendData.value,\n              isTrending,\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  late final mainAxisExtent = 16 + MediaQuery.textScalerOf(context).scale(14);\n  Widget get _buildHistory {\n    return Obx(\n      () {\n        final list = _searchController.historyList;\n        if (list.isEmpty) {\n          return const SliverToBoxAdapter();\n        }\n        final secondary = theme.colorScheme.secondary;\n        return SliverPadding(\n          padding: EdgeInsets.fromLTRB(\n            10,\n            !isPortrait\n                ? 25\n                : _searchController.enableTrending\n                ? 0\n                : 6,\n            6,\n            25,\n          ),\n          sliver: SliverMainAxisGroup(\n            slivers: [\n              SliverPadding(\n                padding: const EdgeInsets.fromLTRB(6, 0, 6, 6),\n                sliver: SliverToBoxAdapter(\n                  child: Row(\n                    children: [\n                      Text(\n                        '搜索历史',\n                        strutStyle: const StrutStyle(leading: 0, height: 1),\n                        style: theme.textTheme.titleMedium!.copyWith(\n                          height: 1,\n                          fontWeight: FontWeight.bold,\n                        ),\n                      ),\n                      const SizedBox(width: 12),\n                      _recordBtn,\n                      _exportBtn,\n                      const Spacer(),\n                      TextButton.icon(\n                        style: const ButtonStyle(\n                          visualDensity: .compact,\n                          tapTargetSize: .shrinkWrap,\n                          padding: WidgetStatePropertyAll(\n                            .symmetric(horizontal: 10),\n                          ),\n                        ),\n                        onPressed: _searchController.onClearHistory,\n                        icon: Icon(\n                          Icons.clear_all_outlined,\n                          size: 18,\n                          color: secondary,\n                        ),\n                        label: Text(\n                          '清空',\n                          style: TextStyle(\n                            height: 1,\n                            color: secondary,\n                          ),\n                        ),\n                      ),\n                    ],\n                  ),\n                ),\n              ),\n              SliverFixedWrap(\n                mainAxisExtent: mainAxisExtent,\n                spacing: 8,\n                runSpacing: 8,\n                delegate: SliverChildBuilderDelegate(\n                  addAutomaticKeepAlives: false,\n                  addRepaintBoundaries: false,\n                  childCount: list.length,\n                  (context, index) => SearchText(\n                    text: list[index],\n                    onTap: _searchController.onClickKeyword,\n                    onLongPress: _searchController.onLongSelect,\n                    fontSize: 14,\n                    height: 1,\n                    padding: const EdgeInsets.symmetric(\n                      horizontal: 11,\n                      vertical: 8,\n                    ),\n                  ),\n                ),\n              ),\n            ],\n          ),\n        );\n      },\n    );\n  }\n\n  Widget get _recordBtn => Obx(\n    () {\n      bool enable = _searchController.recordSearchHistory.value;\n      return IconButton(\n        iconSize: 22,\n        tooltip: enable ? '记录搜索' : '无痕搜索',\n        icon: DisabledIcon(\n          disable: !enable,\n          child: Icon(\n            Icons.history,\n            color: theme.colorScheme.onSurfaceVariant.withValues(alpha: 0.8),\n          ),\n        ),\n        style: const ButtonStyle(\n          visualDensity: .comfortable,\n          tapTargetSize: .shrinkWrap,\n          padding: WidgetStatePropertyAll(.zero),\n        ),\n        onPressed: () {\n          enable = !enable;\n          _searchController.recordSearchHistory.value = enable;\n          GStorage.setting.put(\n            SettingBoxKey.recordSearchHistory,\n            enable,\n          );\n        },\n      );\n    },\n  );\n\n  Widget get _exportBtn => IconButton(\n    iconSize: 22,\n    tooltip: '导入/导出历史记录',\n    icon: Icon(\n      Icons.import_export_outlined,\n      color: theme.colorScheme.onSurfaceVariant.withValues(alpha: 0.8),\n    ),\n    style: const ButtonStyle(\n      visualDensity: .comfortable,\n      tapTargetSize: .shrinkWrap,\n      padding: WidgetStatePropertyAll(.zero),\n    ),\n    onPressed: () => showImportExportDialog<List>(\n      context,\n      title: '历史记录',\n      localFileName: () => 'search',\n      onExport: () => jsonEncode(_searchController.historyList),\n      onImport: (json) {\n        final list = List<String>.from(json);\n        _searchController.historyList.value = list;\n        GStorage.historyWord.put('cacheList', list);\n      },\n    ),\n  );\n\n  Widget _buildHotKey(\n    LoadingState<SearchRcmdData> loadingState,\n    bool isTrending,\n  ) {\n    return switch (loadingState) {\n      Success(:final response) when (response.list?.isNotEmpty ?? false) =>\n        SliverHotKeyword(\n          hotSearchList: response.list!,\n          onClick: _searchController.onClickKeyword,\n        ),\n      Error(:final errMsg) => HttpError(\n        safeArea: false,\n        errMsg: errMsg,\n        onReload: isTrending\n            ? _searchController.queryTrendingList\n            : _searchController.queryRecommendList,\n      ),\n      _ => const SliverToBoxAdapter(),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/search/widgets/hot_keyword.dart",
    "content": "import 'package:PiliPlus/models_new/search/search_trending/list.dart';\nimport 'package:PiliPlus/utils/extension/string_ext.dart';\nimport 'package:PiliPlus/utils/image_utils.dart';\nimport 'package:cached_network_image/cached_network_image.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart'\n    show\n        ContainerRenderObjectMixin,\n        MultiChildLayoutParentData,\n        RenderBoxContainerDefaultsMixin,\n        BoxHitTestResult;\n\nclass SliverHotKeyword extends StatelessWidget {\n  final List<SearchTrendingItemModel> hotSearchList;\n  final Function? onClick;\n  const SliverHotKeyword({\n    super.key,\n    required this.hotSearchList,\n    this.onClick,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    late final style = TextStyle(\n      fontSize: 14,\n      color: ColorScheme.of(context).outline,\n    );\n\n    late final cacheHeight = (MediaQuery.devicePixelRatioOf(context) * 15.0)\n        .round();\n\n    return SliverToBoxAdapter(\n      child: _HotKeywordGrid(\n        mainAxisSpacing: 5,\n        crossAxisSpacing: 0.4,\n        crossAxisCount: 2,\n        children: hotSearchList\n            .map(\n              (i) => Material(\n                type: MaterialType.transparency,\n                borderRadius: const BorderRadius.all(Radius.circular(3)),\n                child: InkWell(\n                  borderRadius: const BorderRadius.all(Radius.circular(3)),\n                  onTap: () => onClick?.call(i.keyword),\n                  child: Padding(\n                    padding: const EdgeInsets.only(left: 2, right: 10),\n                    child: Tooltip(\n                      message: i.keyword,\n                      child: Row(\n                        children: [\n                          Flexible(\n                            child: Padding(\n                              padding: const EdgeInsets.fromLTRB(6, 5, 0, 5),\n                              child: Text(\n                                i.keyword!,\n                                overflow: TextOverflow.ellipsis,\n                                maxLines: 1,\n                                style: const TextStyle(fontSize: 14),\n                              ),\n                            ),\n                          ),\n                          if (!i.icon.isNullOrEmpty)\n                            Padding(\n                              padding: const EdgeInsets.only(left: 4),\n                              child: CachedNetworkImage(\n                                height: 15,\n                                memCacheHeight: cacheHeight,\n                                imageUrl: ImageUtils.thumbnailUrl(i.icon!),\n                                placeholder: (_, _) => const SizedBox.shrink(),\n                              ),\n                            )\n                          else if (i.showLiveIcon == true)\n                            Padding(\n                              padding: const EdgeInsets.only(left: 4),\n                              child: Image.asset(\n                                'assets/images/live/live.gif',\n                                width: 48,\n                                height: 15,\n                                cacheHeight: cacheHeight,\n                              ),\n                            )\n                          else if (i.recommendReason?.isNotEmpty == true)\n                            Text(i.recommendReason!, style: style),\n                        ],\n                      ),\n                    ),\n                  ),\n                ),\n              ),\n            )\n            .toList(),\n      ),\n    );\n  }\n}\n\nclass _HotKeywordGrid extends MultiChildRenderObjectWidget {\n  const _HotKeywordGrid({\n    required this.crossAxisCount,\n    this.mainAxisSpacing = 0.0,\n    this.crossAxisSpacing = 0.0,\n    required super.children,\n  }) : assert(crossAxisCount > 0),\n       assert(mainAxisSpacing >= 0.0),\n       assert(crossAxisSpacing >= 0.0);\n\n  final int crossAxisCount;\n  final double mainAxisSpacing;\n  final double crossAxisSpacing;\n\n  @override\n  RenderObject createRenderObject(BuildContext context) {\n    return _RenderHotKeywordGrid(\n      crossAxisCount: crossAxisCount,\n      mainAxisSpacing: mainAxisSpacing,\n      crossAxisSpacing: crossAxisSpacing,\n    );\n  }\n\n  @override\n  void updateRenderObject(\n    BuildContext context,\n    _RenderHotKeywordGrid renderObject,\n  ) {\n    renderObject\n      ..crossAxisCount = crossAxisCount\n      ..mainAxisSpacing = mainAxisSpacing\n      ..crossAxisSpacing = crossAxisSpacing;\n  }\n}\n\nclass _RenderHotKeywordGrid extends RenderBox\n    with\n        ContainerRenderObjectMixin<RenderBox, MultiChildLayoutParentData>,\n        RenderBoxContainerDefaultsMixin<RenderBox, MultiChildLayoutParentData> {\n  _RenderHotKeywordGrid({\n    required int crossAxisCount,\n    required double mainAxisSpacing,\n    required double crossAxisSpacing,\n  }) : _crossAxisCount = crossAxisCount,\n       _mainAxisSpacing = mainAxisSpacing,\n       _crossAxisSpacing = crossAxisSpacing;\n\n  int _crossAxisCount;\n  int get crossAxisCount => _crossAxisCount;\n  set crossAxisCount(int value) {\n    if (_crossAxisCount == value) return;\n    _crossAxisCount = value;\n    markNeedsLayout();\n  }\n\n  double _mainAxisSpacing;\n  double get mainAxisSpacing => _mainAxisSpacing;\n  set mainAxisSpacing(double value) {\n    if (_mainAxisSpacing == value) return;\n    _mainAxisSpacing = value;\n    markNeedsLayout();\n  }\n\n  double _crossAxisSpacing;\n  double get crossAxisSpacing => _crossAxisSpacing;\n  set crossAxisSpacing(double value) {\n    if (_crossAxisSpacing == value) return;\n    _crossAxisSpacing = value;\n    markNeedsLayout();\n  }\n\n  @override\n  void setupParentData(RenderBox child) {\n    if (child.parentData is! MultiChildLayoutParentData) {\n      child.parentData = MultiChildLayoutParentData();\n    }\n  }\n\n  @override\n  void performLayout() {\n    final constraints = this.constraints;\n    final childWidth =\n        (constraints.maxWidth - mainAxisSpacing * (crossAxisCount - 1)) /\n        crossAxisCount;\n    final c = BoxConstraints(maxWidth: childWidth);\n    var child = firstChild;\n    double? childHeight;\n    int index = 0;\n    while (child != null) {\n      if (childHeight == null) {\n        childHeight = (child..layout(c, parentUsesSize: true)).size.height;\n      } else {\n        child.layout(c);\n      }\n      final parentData = child.parentData as MultiChildLayoutParentData\n        ..offset = Offset(\n          (childWidth + mainAxisSpacing) * (index % crossAxisCount),\n          (childHeight + crossAxisSpacing) * (index ~/ crossAxisCount),\n        );\n      child = parentData.nextSibling;\n      index++;\n    }\n    final row = (index / crossAxisCount).ceil();\n    size = constraints.constrainDimensions(\n      constraints.maxWidth,\n      row * childHeight! + crossAxisSpacing * (row - 1),\n    );\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    defaultPaint(context, offset);\n  }\n\n  @override\n  bool hitTestChildren(BoxHitTestResult result, {required Offset position}) {\n    return defaultHitTestChildren(result, position: position);\n  }\n}\n"
  },
  {
    "path": "lib/pages/search/widgets/search_text.dart",
    "content": "import 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart';\n\nclass SearchText extends StatelessWidget {\n  final String text;\n  final ValueChanged<String>? onTap;\n  final ValueChanged<String>? onLongPress;\n  final double? fontSize;\n  final Color? bgColor;\n  final Color? textColor;\n  final TextAlign? textAlign;\n  final EdgeInsetsGeometry? padding;\n  final double? height;\n\n  const SearchText({\n    super.key,\n    required this.text,\n    this.onTap,\n    this.onLongPress,\n    this.fontSize,\n    this.bgColor,\n    this.textColor,\n    this.textAlign,\n    this.padding,\n    this.height,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    late final colorScheme = ColorScheme.of(context);\n    final hasLongPress = onLongPress != null;\n    return Material(\n      color: bgColor ?? colorScheme.onInverseSurface,\n      borderRadius: const BorderRadius.all(Radius.circular(6)),\n      child: InkWell(\n        onTap: () => onTap?.call(text),\n        onLongPress: hasLongPress ? () => onLongPress!(text) : null,\n        onSecondaryTap: hasLongPress && !PlatformUtils.isMobile\n            ? () => onLongPress!(text)\n            : null,\n        borderRadius: const BorderRadius.all(Radius.circular(6)),\n        child: Padding(\n          padding:\n              padding ??\n              const EdgeInsets.symmetric(horizontal: 11, vertical: 5),\n          child: Text(\n            text,\n            textAlign: textAlign,\n            style: TextStyle(\n              fontSize: fontSize,\n              height: height,\n              color: textColor ?? colorScheme.onSurfaceVariant,\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/search_panel/all/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/search.dart';\nimport 'package:PiliPlus/models/common/search/search_type.dart';\nimport 'package:PiliPlus/models/search/result.dart';\nimport 'package:PiliPlus/pages/search_panel/controller.dart';\nimport 'package:PiliPlus/utils/app_scheme.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\n\nclass SearchAllController\n    extends SearchPanelController<SearchAllData, dynamic> {\n  SearchAllController({\n    required super.keyword,\n    required super.searchType,\n    required super.tag,\n  });\n\n  late bool hasJump2Video = false;\n\n  @override\n  void onInit() {\n    super.onInit();\n    jump2Video();\n  }\n\n  @override\n  List? getDataList(response) {\n    return response.list;\n  }\n\n  @override\n  bool customHandleResponse(bool isRefresh, Success response) {\n    searchResultController?.count[searchType.index] =\n        response.response.numResults ?? 0;\n    if (searchType == SearchType.video && !hasJump2Video && isRefresh) {\n      hasJump2Video = true;\n      onPushDetail(response.response.list);\n    }\n    return false;\n  }\n\n  @override\n  Future<LoadingState<SearchAllData>> customGetData() => SearchHttp.searchAll(\n    keyword: keyword,\n    page: page,\n    order: order,\n    duration: null,\n    tids: videoZoneType?.tids,\n    orderSort: userOrderType?.value.orderSort,\n    userType: userType?.value.index,\n    categoryId: articleZoneType?.value.categoryId,\n    pubBegin: pubBegin,\n    pubEnd: pubEnd,\n  );\n\n  void onPushDetail(dynamic resultList) {\n    try {\n      int? aid = int.tryParse(keyword);\n      if (aid != null && resultList.first.aid == aid) {\n        PiliScheme.videoPush(aid, null, showDialog: false);\n      }\n    } catch (_) {}\n  }\n\n  void jump2Video() {\n    if (IdUtils.avRegexExact.hasMatch(keyword)) {\n      hasJump2Video = true;\n      PiliScheme.videoPush(\n        int.parse(keyword.substring(2)),\n        null,\n        showDialog: false,\n      );\n    } else if (IdUtils.bvRegexExact.hasMatch(keyword)) {\n      hasJump2Video = true;\n      PiliScheme.videoPush(null, keyword, showDialog: false);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/search_panel/all/view.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/skeleton/video_card_h.dart';\nimport 'package:PiliPlus/common/widgets/video_card/video_card_h.dart';\nimport 'package:PiliPlus/models/search/result.dart';\nimport 'package:PiliPlus/pages/search_panel/all/controller.dart';\nimport 'package:PiliPlus/pages/search_panel/all/widgets/pgc_card_v_search.dart';\nimport 'package:PiliPlus/pages/search_panel/pgc/widgets/item.dart';\nimport 'package:PiliPlus/pages/search_panel/user/widgets/item.dart';\nimport 'package:PiliPlus/pages/search_panel/view.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:PiliPlus/utils/waterfall.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:waterfall_flow/waterfall_flow.dart'\n    hide SliverWaterfallFlowDelegateWithMaxCrossAxisExtent;\n\nclass SearchAllPanel extends CommonSearchPanel {\n  const SearchAllPanel({\n    super.key,\n    required super.keyword,\n    required super.tag,\n    required super.searchType,\n  });\n\n  @override\n  State<SearchAllPanel> createState() => _SearchAllPanelState();\n}\n\nclass _SearchAllPanelState\n    extends CommonSearchPanelState<SearchAllPanel, SearchAllData, dynamic> {\n  @override\n  late final SearchAllController controller;\n\n  @override\n  void initState() {\n    super.initState();\n    controller = Get.put(\n      SearchAllController(\n        keyword: widget.keyword,\n        searchType: widget.searchType,\n        tag: widget.tag,\n      ),\n      tag: widget.searchType.name + widget.tag,\n    );\n  }\n\n  @override\n  Widget buildList(ThemeData theme, List<dynamic> list) {\n    return SliverWaterfallFlow(\n      gridDelegate: SliverWaterfallFlowDelegateWithMaxCrossAxisExtent(\n        maxCrossAxisExtent: Grid.smallCardWidth * 2,\n        crossAxisSpacing: StyleString.safeSpace,\n      ),\n      delegate: SliverChildBuilderDelegate(\n        (_, index) {\n          if (index == list.length - 1) {\n            controller.onLoadMore();\n          }\n          return switch (list[index]) {\n            SearchVideoItemModel e => SizedBox(\n              height: 120,\n              child: VideoCardH(videoItem: e),\n            ),\n            List<SearchPgcItemModel> e =>\n              e.length == 1\n                  ? SizedBox(\n                      height: 160,\n                      child: SearchPgcItem(item: e.first),\n                    )\n                  : SizedBox(\n                      height:\n                          Grid.smallCardWidth / 2 / 0.75 +\n                          MediaQuery.textScalerOf(context).scale(60),\n                      child: ListView.builder(\n                        padding: const EdgeInsets.only(bottom: 7),\n                        physics: const AlwaysScrollableScrollPhysics(),\n                        scrollDirection: Axis.horizontal,\n                        itemCount: e.length,\n                        itemBuilder: (context, index) {\n                          return Container(\n                            width: Grid.smallCardWidth / 2,\n                            margin: EdgeInsets.only(\n                              left: StyleString.safeSpace,\n                              right: index == e.length - 1\n                                  ? StyleString.safeSpace\n                                  : 0,\n                            ),\n                            child: PgcCardVSearch(item: e[index]),\n                          );\n                        },\n                      ),\n                    ),\n            SearchUserItemModel e => Padding(\n              padding: const EdgeInsets.only(bottom: 5),\n              child: SearchUserItem(item: e),\n            ),\n            _ => const SizedBox.shrink(),\n          };\n        },\n        childCount: list.length,\n      ),\n    );\n  }\n\n  @override\n  Widget get buildLoading => SliverGrid.builder(\n    gridDelegate: Grid.videoCardHDelegate(context),\n    itemBuilder: (context, index) => const VideoCardHSkeleton(),\n    itemCount: 10,\n  );\n}\n"
  },
  {
    "path": "lib/pages/search_panel/all/widgets/pgc_card_v_search.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models/search/result.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\n\n// 视频卡片 - 垂直布局\nclass PgcCardVSearch extends StatelessWidget {\n  const PgcCardVSearch({\n    super.key,\n    required this.item,\n  });\n\n  final SearchPgcItemModel item;\n\n  @override\n  Widget build(BuildContext context) {\n    void onLongPress() => imageSaveDialog(\n      title: item.title.map((e) => e.text).join(),\n      cover: item.cover,\n    );\n    return Card(\n      shape: const RoundedRectangleBorder(borderRadius: StyleString.mdRadius),\n      child: InkWell(\n        borderRadius: StyleString.mdRadius,\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        onTap: () => PageUtils.viewPgc(seasonId: item.seasonId),\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            AspectRatio(\n              aspectRatio: 0.75,\n              child: LayoutBuilder(\n                builder: (context, boxConstraints) {\n                  final double maxWidth = boxConstraints.maxWidth;\n                  final double maxHeight = boxConstraints.maxHeight;\n                  return Stack(\n                    clipBehavior: Clip.none,\n                    children: [\n                      NetworkImgLayer(\n                        src: item.cover,\n                        width: maxWidth,\n                        height: maxHeight,\n                      ),\n                      PBadge(\n                        text: item.seasonTypeName,\n                        right: 6,\n                        top: 6,\n                      ),\n                    ],\n                  );\n                },\n              ),\n            ),\n            Padding(\n              padding: const EdgeInsets.fromLTRB(4, 5, 0, 3),\n              child: Text(\n                item.title.map((e) => e.text).join(),\n                textAlign: TextAlign.start,\n                style: const TextStyle(\n                  letterSpacing: 0.3,\n                ),\n                maxLines: 2,\n                overflow: TextOverflow.ellipsis,\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/search_panel/article/controller.dart",
    "content": "import 'dart:math';\n\nimport 'package:PiliPlus/models/common/search/article_search_type.dart';\nimport 'package:PiliPlus/models/search/result.dart';\nimport 'package:PiliPlus/pages/search/widgets/search_text.dart';\nimport 'package:PiliPlus/pages/search_panel/controller.dart';\nimport 'package:PiliPlus/utils/extension/context_ext.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass SearchArticleController\n    extends SearchPanelController<SearchArticleData, SearchArticleItemModel> {\n  SearchArticleController({\n    required super.keyword,\n    required super.searchType,\n    required super.tag,\n  });\n\n  @override\n  void onInit() {\n    super.onInit();\n    articleZoneType = ArticleZoneType.all.obs;\n    jump2Article();\n  }\n\n  void jump2Article() {\n    String? cvid = RegExp(\n      r'^cv(id)?(\\d+)$',\n      caseSensitive: false,\n    ).matchAsPrefix(keyword)?.group(2);\n    if (cvid != null) {\n      WidgetsBinding.instance.addPostFrameCallback((_) {\n        Get.toNamed(\n          '/articlePage',\n          parameters: {\n            'id': cvid,\n            'type': 'read',\n          },\n        );\n      });\n    }\n  }\n\n  Rx<ArticleOrderType> articleOrderType = ArticleOrderType.totalrank.obs;\n\n  void onShowFilterDialog(BuildContext context) {\n    showModalBottomSheet(\n      context: context,\n      useSafeArea: true,\n      isScrollControlled: true,\n      constraints: BoxConstraints(\n        maxWidth: min(640, context.mediaQueryShortestSide),\n      ),\n      builder: (context) {\n        final theme = Theme.of(context);\n        return SingleChildScrollView(\n          padding: EdgeInsets.only(\n            top: 20,\n            left: 16,\n            right: 16,\n            bottom: 100 + MediaQuery.viewPaddingOf(context).bottom,\n          ),\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            crossAxisAlignment: CrossAxisAlignment.stretch,\n            children: [\n              const SizedBox(height: 10),\n              const Text('排序', style: TextStyle(fontSize: 16)),\n              const SizedBox(height: 10),\n              Wrap(\n                spacing: 8,\n                runSpacing: 8,\n                children: ArticleOrderType.values.map(\n                  (e) {\n                    final isCurr = e == articleOrderType.value;\n                    return SearchText(\n                      text: e.label,\n                      onTap: (_) {\n                        articleOrderType.value = e;\n                        order = e.order;\n                        onSortSearch(label: e.label);\n                      },\n                      bgColor: isCurr\n                          ? theme.colorScheme.secondaryContainer\n                          : null,\n                      textColor: isCurr\n                          ? theme.colorScheme.onSecondaryContainer\n                          : null,\n                    );\n                  },\n                ).toList(),\n              ),\n              const SizedBox(height: 20),\n              const Text('分区', style: TextStyle(fontSize: 16)),\n              const SizedBox(height: 10),\n              Wrap(\n                spacing: 8,\n                runSpacing: 8,\n                children: ArticleZoneType.values.map(\n                  (e) {\n                    final isCurr = e == articleZoneType!.value;\n                    return SearchText(\n                      text: e.label,\n                      onTap: (_) {\n                        articleZoneType!.value = e;\n                        onSortSearch(label: e.label);\n                      },\n                      bgColor: isCurr\n                          ? theme.colorScheme.secondaryContainer\n                          : null,\n                      textColor: isCurr\n                          ? theme.colorScheme.onSecondaryContainer\n                          : null,\n                    );\n                  },\n                ).toList(),\n              ),\n            ],\n          ),\n        );\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/search_panel/article/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/sliver/sliver_floating_header.dart';\nimport 'package:PiliPlus/models/search/result.dart';\nimport 'package:PiliPlus/pages/search_panel/article/controller.dart';\nimport 'package:PiliPlus/pages/search_panel/article/widgets/item.dart';\nimport 'package:PiliPlus/pages/search_panel/view.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass SearchArticlePanel extends CommonSearchPanel {\n  const SearchArticlePanel({\n    super.key,\n    required super.keyword,\n    required super.tag,\n    required super.searchType,\n  });\n\n  @override\n  State<SearchArticlePanel> createState() => _SearchArticlePanelState();\n}\n\nclass _SearchArticlePanelState\n    extends\n        CommonSearchPanelState<\n          SearchArticlePanel,\n          SearchArticleData,\n          SearchArticleItemModel\n        >\n    with GridMixin {\n  @override\n  late final SearchArticleController controller;\n\n  @override\n  void initState() {\n    super.initState();\n    controller = Get.put(\n      SearchArticleController(\n        keyword: widget.keyword,\n        searchType: widget.searchType,\n        tag: widget.tag,\n      ),\n      tag: widget.searchType.name + widget.tag,\n    );\n  }\n\n  @override\n  Widget buildHeader(ThemeData theme) {\n    return SliverFloatingHeaderWidget(\n      backgroundColor: theme.colorScheme.surface,\n      child: Padding(\n        padding: const .fromLTRB(25, 0, 12, 4),\n        child: Row(\n          children: [\n            Obx(\n              () => Text(\n                '排序: ${controller.articleOrderType.value.label}',\n                maxLines: 1,\n                style: TextStyle(color: theme.colorScheme.outline),\n              ),\n            ),\n            const Spacer(),\n            Obx(\n              () => Text(\n                '分区: ${controller.articleZoneType!.value.label}',\n                maxLines: 1,\n                style: TextStyle(color: theme.colorScheme.outline),\n              ),\n            ),\n            const Spacer(),\n            SizedBox(\n              width: 32,\n              height: 32,\n              child: IconButton(\n                tooltip: '筛选',\n                style: const ButtonStyle(\n                  padding: WidgetStatePropertyAll(EdgeInsets.zero),\n                ),\n                onPressed: () => controller.onShowFilterDialog(context),\n                icon: Icon(\n                  Icons.filter_list_outlined,\n                  size: 18,\n                  color: theme.colorScheme.primary,\n                ),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  @override\n  Widget buildList(ThemeData theme, List<SearchArticleItemModel> list) {\n    return SliverGrid.builder(\n      gridDelegate: gridDelegate,\n      itemBuilder: (context, index) {\n        if (index == list.length - 1) {\n          controller.onLoadMore();\n        }\n        return SearchArticleItem(item: list[index]);\n      },\n      itemCount: list.length,\n    );\n  }\n\n  @override\n  Widget get buildLoading => gridSkeleton;\n}\n"
  },
  {
    "path": "lib/pages/search_panel/article/widgets/item.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models/search/result.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\nimport 'package:get/get.dart';\n\nclass SearchArticleItem extends StatelessWidget {\n  const SearchArticleItem({super.key, required this.item});\n\n  final SearchArticleItemModel item;\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    final textStyle = TextStyle(\n      fontSize: theme.textTheme.labelSmall!.fontSize,\n      color: theme.colorScheme.outline,\n    );\n    void onLongPress() => imageSaveDialog(\n      title: item.title.map((item) => item.text).join(),\n      cover: item.imageUrls?.firstOrNull,\n    );\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onTap: () => Get.toNamed(\n          '/articlePage',\n          parameters: {\n            'id': '${item.id}',\n            'type': 'read',\n          },\n        ),\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        child: Padding(\n          padding: const EdgeInsets.symmetric(\n            horizontal: StyleString.safeSpace,\n            vertical: 5,\n          ),\n          child: Row(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: <Widget>[\n              if (item.imageUrls?.isNotEmpty == true)\n                AspectRatio(\n                  aspectRatio: StyleString.aspectRatio,\n                  child: LayoutBuilder(\n                    builder: (context, boxConstraints) {\n                      double maxWidth = boxConstraints.maxWidth;\n                      double maxHeight = boxConstraints.maxHeight;\n                      return NetworkImgLayer(\n                        width: maxWidth,\n                        height: maxHeight,\n                        src: item.imageUrls?.firstOrNull,\n                      );\n                    },\n                  ),\n                ),\n              const SizedBox(width: 10),\n              Expanded(\n                child: Column(\n                  mainAxisSize: MainAxisSize.min,\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    Text.rich(\n                      maxLines: 2,\n                      TextSpan(\n                        children: item.title\n                            .map(\n                              (e) => TextSpan(\n                                text: e.text,\n                                style: TextStyle(\n                                  color: e.isEm\n                                      ? theme.colorScheme.primary\n                                      : theme.colorScheme.onSurface,\n                                ),\n                              ),\n                            )\n                            .toList(),\n                      ),\n                    ),\n                    const Spacer(),\n                    Text(\n                      DateFormatUtils.dateFormat(item.pubTime),\n                      style: textStyle,\n                    ),\n                    Row(\n                      children: [\n                        Text('${item.view}浏览', style: textStyle),\n                        Text(' • ', style: textStyle),\n                        Text('${item.reply}评论', style: textStyle),\n                      ],\n                    ),\n                  ],\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/search_panel/controller.dart",
    "content": "import 'dart:async' show StreamSubscription;\n\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/search.dart';\nimport 'package:PiliPlus/models/common/search/article_search_type.dart';\nimport 'package:PiliPlus/models/common/search/search_type.dart';\nimport 'package:PiliPlus/models/common/search/user_search_type.dart';\nimport 'package:PiliPlus/models/common/search/video_search_type.dart';\nimport 'package:PiliPlus/models/search/result.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:PiliPlus/pages/search_result/controller.dart';\nimport 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass SearchPanelController<R extends SearchNumData<T>, T>\n    extends CommonListController<R, T> {\n  SearchPanelController({\n    required this.keyword,\n    required this.searchType,\n    required this.tag,\n  });\n  final String tag;\n  final String keyword;\n  final SearchType searchType;\n\n  // sort\n  // common\n  String order = '';\n\n  // video\n  VideoDurationType? videoDurationType; // int duration\n  VideoZoneType? videoZoneType; // int? tids;\n  int? pubBegin;\n  int? pubEnd;\n\n  // user\n  Rx<UserOrderType>? userOrderType;\n  Rx<UserType>? userType;\n\n  // article\n  Rx<ArticleZoneType>? articleZoneType; // int? categoryId;\n\n  SearchResultController? searchResultController;\n\n  void onSortSearch({\n    bool getBack = true,\n    String? label,\n  }) {\n    if (getBack) Get.back();\n    SmartDialog.dismiss();\n    if (label != null) {\n      SmartDialog.showToast(\"「$label」的筛选结果\");\n    }\n    SmartDialog.showLoading(msg: 'loading');\n    onReload().whenComplete(SmartDialog.dismiss);\n  }\n\n  StreamSubscription? _listener;\n\n  void cancelListener() {\n    _listener?.cancel();\n  }\n\n  @override\n  void onInit() {\n    super.onInit();\n    try {\n      searchResultController = Get.find<SearchResultController>(tag: tag);\n      _listener = searchResultController!.toTopIndex.listen((index) {\n        if (index == searchType.index) {\n          scrollController.animToTop();\n        }\n      });\n    } catch (_) {}\n    queryData();\n  }\n\n  @override\n  List<T>? getDataList(R response) {\n    return response.list;\n  }\n\n  @override\n  bool customHandleResponse(bool isRefresh, Success<R> response) {\n    if (isRefresh) {\n      searchResultController?.count[searchType.index] =\n          response.response.numResults ?? 0;\n    }\n    return false;\n  }\n\n  String? gaiaVtoken;\n\n  @override\n  Future<LoadingState<R>> customGetData() => SearchHttp.searchByType<R>(\n    searchType: searchType,\n    keyword: keyword,\n    page: page,\n    order: order,\n    duration: videoDurationType?.index,\n    tids: videoZoneType?.tids,\n    orderSort: userOrderType?.value.orderSort,\n    userType: userType?.value.index,\n    categoryId: articleZoneType?.value.categoryId,\n    pubBegin: pubBegin,\n    pubEnd: pubEnd,\n    gaiaVtoken: gaiaVtoken,\n    onSuccess: (String gaiaVtoken) {\n      this.gaiaVtoken = gaiaVtoken;\n      queryData(page == 1);\n    },\n  );\n\n  @override\n  Future<void> onReload() {\n    scrollController.jumpToTop();\n    return super.onReload();\n  }\n}\n"
  },
  {
    "path": "lib/pages/search_panel/live/view.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/skeleton/video_card_v.dart';\nimport 'package:PiliPlus/models/search/result.dart';\nimport 'package:PiliPlus/pages/search_panel/controller.dart';\nimport 'package:PiliPlus/pages/search_panel/live/widgets/item.dart';\nimport 'package:PiliPlus/pages/search_panel/view.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass SearchLivePanel extends CommonSearchPanel {\n  const SearchLivePanel({\n    super.key,\n    required super.keyword,\n    required super.tag,\n    required super.searchType,\n  });\n\n  @override\n  State<SearchLivePanel> createState() => _SearchLivePanelState();\n}\n\nclass _SearchLivePanelState\n    extends\n        CommonSearchPanelState<\n          SearchLivePanel,\n          SearchLiveData,\n          SearchLiveItemModel\n        > {\n  @override\n  late final SearchPanelController<SearchLiveData, SearchLiveItemModel>\n  controller;\n\n  @override\n  void initState() {\n    super.initState();\n    controller = Get.put(\n      SearchPanelController<SearchLiveData, SearchLiveItemModel>(\n        keyword: widget.keyword,\n        searchType: widget.searchType,\n        tag: widget.tag,\n      ),\n      tag: widget.searchType.name + widget.tag,\n    );\n  }\n\n  late final gridDelegate = SliverGridDelegateWithExtentAndRatio(\n    maxCrossAxisExtent: Grid.smallCardWidth,\n    crossAxisSpacing: StyleString.cardSpace,\n    mainAxisSpacing: StyleString.cardSpace,\n    childAspectRatio: StyleString.aspectRatio,\n    mainAxisExtent: MediaQuery.textScalerOf(context).scale(80),\n  );\n\n  @override\n  Widget buildList(ThemeData theme, List<SearchLiveItemModel> list) {\n    return SliverPadding(\n      padding: const EdgeInsets.only(\n        left: StyleString.safeSpace,\n        right: StyleString.safeSpace,\n      ),\n      sliver: SliverGrid.builder(\n        gridDelegate: gridDelegate,\n        itemBuilder: (context, index) {\n          if (index == list.length - 1) {\n            controller.onLoadMore();\n          }\n          return LiveItem(liveItem: list[index]);\n        },\n        itemCount: list.length,\n      ),\n    );\n  }\n\n  @override\n  Widget get buildLoading => SliverGrid.builder(\n    gridDelegate: gridDelegate,\n    itemBuilder: (context, index) => const VideoCardVSkeleton(),\n    itemCount: 10,\n  );\n}\n"
  },
  {
    "path": "lib/pages/search_panel/live/widgets/item.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models/search/result.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\n\nclass LiveItem extends StatelessWidget {\n  final SearchLiveItemModel liveItem;\n\n  const LiveItem({super.key, required this.liveItem});\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    void onLongPress() => imageSaveDialog(\n      title: liveItem.title.map((item) => item.text).join(),\n      cover: liveItem.cover,\n    );\n    return Card(\n      clipBehavior: Clip.hardEdge,\n      child: InkWell(\n        onTap: () => PageUtils.toLiveRoom(liveItem.roomid),\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            AspectRatio(\n              aspectRatio: StyleString.aspectRatio,\n              child: LayoutBuilder(\n                builder: (context, boxConstraints) {\n                  double maxWidth = boxConstraints.maxWidth;\n                  double maxHeight = boxConstraints.maxHeight;\n                  return Stack(\n                    clipBehavior: Clip.none,\n                    children: [\n                      NetworkImgLayer(\n                        src: liveItem.cover,\n                        width: maxWidth,\n                        height: maxHeight,\n                        type: .emote,\n                      ),\n                      Positioned(\n                        left: 0,\n                        right: 0,\n                        bottom: 0,\n                        child: AnimatedOpacity(\n                          opacity: 1,\n                          duration: const Duration(milliseconds: 200),\n                          child: liveStat(\n                            liveItem.online,\n                            liveItem.cateName,\n                          ),\n                        ),\n                      ),\n                    ],\n                  );\n                },\n              ),\n            ),\n            liveContent(theme),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget liveContent(ThemeData theme) => Expanded(\n    child: Padding(\n      padding: const EdgeInsets.fromLTRB(9, 8, 9, 6),\n      child: Column(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        mainAxisAlignment: MainAxisAlignment.spaceBetween,\n        children: [\n          Text.rich(\n            TextSpan(\n              children: liveItem.title\n                  .map(\n                    (e) => TextSpan(\n                      text: e.text,\n                      style: TextStyle(\n                        color: e.isEm\n                            ? theme.colorScheme.primary\n                            : theme.colorScheme.onSurface,\n                      ),\n                    ),\n                  )\n                  .toList(),\n            ),\n          ),\n          Text(\n            liveItem.uname!,\n            maxLines: 1,\n            style: TextStyle(\n              fontSize: theme.textTheme.labelMedium!.fontSize,\n              color: theme.colorScheme.outline,\n            ),\n          ),\n        ],\n      ),\n    ),\n  );\n\n  Widget liveStat(int? online, String? cateName) {\n    return Container(\n      height: 45,\n      padding: const EdgeInsets.only(top: 22, left: 8, right: 8),\n      decoration: const BoxDecoration(\n        gradient: LinearGradient(\n          begin: Alignment.topCenter,\n          end: Alignment.bottomCenter,\n          colors: <Color>[\n            Colors.transparent,\n            Colors.black54,\n          ],\n          tileMode: TileMode.mirror,\n        ),\n      ),\n      child: Row(\n        mainAxisAlignment: MainAxisAlignment.spaceBetween,\n        children: [\n          Text(\n            cateName!,\n            style: const TextStyle(fontSize: 11, color: Colors.white),\n          ),\n          Text(\n            '${NumUtils.numFormat(online)}围观',\n            style: const TextStyle(fontSize: 11, color: Colors.white),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/search_panel/pgc/view.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/skeleton/media_bangumi.dart';\nimport 'package:PiliPlus/models/search/result.dart';\nimport 'package:PiliPlus/pages/search_panel/controller.dart';\nimport 'package:PiliPlus/pages/search_panel/pgc/widgets/item.dart';\nimport 'package:PiliPlus/pages/search_panel/view.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart'\n    hide SliverGridDelegateWithMaxCrossAxisExtent;\nimport 'package:get/get.dart';\n\nclass SearchPgcPanel extends CommonSearchPanel {\n  const SearchPgcPanel({\n    super.key,\n    required super.keyword,\n    required super.tag,\n    required super.searchType,\n  });\n\n  @override\n  State<SearchPgcPanel> createState() => _SearchPgcPanelState();\n}\n\nclass _SearchPgcPanelState\n    extends\n        CommonSearchPanelState<\n          SearchPgcPanel,\n          SearchPgcData,\n          SearchPgcItemModel\n        > {\n  @override\n  late final SearchPanelController<SearchPgcData, SearchPgcItemModel>\n  controller;\n\n  @override\n  void initState() {\n    super.initState();\n    controller = Get.put(\n      SearchPanelController<SearchPgcData, SearchPgcItemModel>(\n        keyword: widget.keyword,\n        searchType: widget.searchType,\n        tag: widget.tag,\n      ),\n      tag: widget.searchType.name + widget.tag,\n    );\n  }\n\n  late final gridDelegate = SliverGridDelegateWithMaxCrossAxisExtent(\n    maxCrossAxisExtent: Grid.smallCardWidth * 2,\n    mainAxisExtent: 160,\n  );\n\n  @override\n  Widget buildList(ThemeData theme, List<SearchPgcItemModel> list) {\n    return SliverGrid.builder(\n      gridDelegate: gridDelegate,\n      itemBuilder: (BuildContext context, int index) {\n        if (index == list.length - 1) {\n          controller.onLoadMore();\n        }\n        return SearchPgcItem(item: list[index]);\n      },\n      itemCount: list.length,\n    );\n  }\n\n  @override\n  Widget get buildLoading => SliverGrid.builder(\n    gridDelegate: SliverGridDelegateWithExtentAndRatio(\n      mainAxisSpacing: 2,\n      maxCrossAxisExtent: Grid.smallCardWidth * 2,\n      childAspectRatio: StyleString.aspectRatio * 1.5,\n      minHeight: MediaQuery.textScalerOf(context).scale(155),\n    ),\n    itemBuilder: (context, index) => const MediaPgcSkeleton(),\n    itemCount: 10,\n  );\n}\n"
  },
  {
    "path": "lib/pages/search_panel/pgc/widgets/item.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models/search/result.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart';\n\nclass SearchPgcItem extends StatelessWidget {\n  const SearchPgcItem({\n    super.key,\n    required this.item,\n  });\n\n  final SearchPgcItemModel item;\n\n  @override\n  Widget build(BuildContext context) {\n    final ThemeData theme = Theme.of(context);\n    const TextStyle style = TextStyle(fontSize: 13);\n    void onLongPress() => imageSaveDialog(\n      title: item.title.map((item) => item.text).join(),\n      cover: item.cover,\n    );\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onTap: () => PageUtils.viewPgc(seasonId: item.seasonId),\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        child: Padding(\n          padding: const EdgeInsets.symmetric(\n            horizontal: StyleString.safeSpace,\n            vertical: StyleString.cardSpace,\n          ),\n          child: Row(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              Stack(\n                clipBehavior: Clip.none,\n                children: [\n                  NetworkImgLayer(\n                    width: 111,\n                    height: 148,\n                    src: item.cover,\n                  ),\n                  PBadge(\n                    text: item.seasonTypeName,\n                    top: 6.0,\n                    right: 4.0,\n                    bottom: null,\n                    left: null,\n                  ),\n                ],\n              ),\n              const SizedBox(width: 10),\n              Expanded(\n                child: Column(\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    const SizedBox(height: 4),\n                    Text.rich(\n                      TextSpan(\n                        children: item.title\n                            .map(\n                              (e) => TextSpan(\n                                text: e.text,\n                                style: TextStyle(\n                                  color: e.isEm\n                                      ? theme.colorScheme.primary\n                                      : theme.colorScheme.onSurface,\n                                ),\n                              ),\n                            )\n                            .toList(),\n                      ),\n                    ),\n                    const SizedBox(height: 12),\n                    Text('评分:${item.mediaScore?['score']}', style: style),\n                    Row(\n                      children: [\n                        if (item.areas?.isNotEmpty == true)\n                          Text(item.areas!, style: style),\n                        const SizedBox(width: 3),\n                        const Text('·'),\n                        const SizedBox(width: 3),\n                        Text(\n                          DateFormatUtils.dateFormat(item.pubtime),\n                          style: style,\n                        ),\n                      ],\n                    ),\n                    Row(\n                      children: [\n                        if (item.styles?.isNotEmpty == true)\n                          Text(item.styles!, style: style),\n                        const SizedBox(width: 3),\n                        const Text('·'),\n                        const SizedBox(width: 3),\n                        if (item.indexShow?.isNotEmpty == true)\n                          Text(item.indexShow!, style: style),\n                      ],\n                    ),\n                  ],\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/search_panel/user/controller.dart",
    "content": "import 'dart:math';\n\nimport 'package:PiliPlus/models/common/search/user_search_type.dart';\nimport 'package:PiliPlus/models/search/result.dart';\nimport 'package:PiliPlus/pages/search/widgets/search_text.dart';\nimport 'package:PiliPlus/pages/search_panel/controller.dart';\nimport 'package:PiliPlus/utils/extension/context_ext.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass SearchUserController\n    extends SearchPanelController<SearchUserData, SearchUserItemModel> {\n  SearchUserController({\n    required super.keyword,\n    required super.searchType,\n    required super.tag,\n  });\n\n  @override\n  void onInit() {\n    super.onInit();\n    userType = UserType.all.obs;\n    userOrderType = UserOrderType.def.obs;\n  }\n\n  void onShowFilterDialog(BuildContext context) {\n    showModalBottomSheet(\n      context: context,\n      useSafeArea: true,\n      isScrollControlled: true,\n      constraints: BoxConstraints(\n        maxWidth: min(640, context.mediaQueryShortestSide),\n      ),\n      builder: (context) {\n        final theme = Theme.of(context);\n        return SingleChildScrollView(\n          padding: EdgeInsets.only(\n            top: 20,\n            left: 16,\n            right: 16,\n            bottom: 100 + MediaQuery.viewPaddingOf(context).bottom,\n          ),\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            crossAxisAlignment: CrossAxisAlignment.stretch,\n            children: [\n              const SizedBox(height: 10),\n              const Text('用户粉丝数及等级排序顺序', style: TextStyle(fontSize: 16)),\n              const SizedBox(height: 10),\n              Wrap(\n                spacing: 8,\n                runSpacing: 8,\n                children: UserOrderType.values.map(\n                  (e) {\n                    final isCurr = e == userOrderType!.value;\n                    return SearchText(\n                      text: e.label,\n                      onTap: (_) {\n                        userOrderType!.value = e;\n                        order = e.order;\n                        onSortSearch(label: e.label);\n                      },\n                      bgColor: isCurr\n                          ? theme.colorScheme.secondaryContainer\n                          : null,\n                      textColor: isCurr\n                          ? theme.colorScheme.onSecondaryContainer\n                          : null,\n                    );\n                  },\n                ).toList(),\n              ),\n              const SizedBox(height: 20),\n              const Text('用户分类', style: TextStyle(fontSize: 16)),\n              const SizedBox(height: 10),\n              Wrap(\n                spacing: 8,\n                runSpacing: 8,\n                children: UserType.values.map(\n                  (e) {\n                    final isCurr = e == userType!.value;\n                    return SearchText(\n                      text: e.label,\n                      onTap: (_) {\n                        userType!.value = e;\n                        onSortSearch(label: e.label);\n                      },\n                      bgColor: isCurr\n                          ? theme.colorScheme.secondaryContainer\n                          : null,\n                      textColor: isCurr\n                          ? theme.colorScheme.onSecondaryContainer\n                          : null,\n                    );\n                  },\n                ).toList(),\n              ),\n            ],\n          ),\n        );\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/search_panel/user/view.dart",
    "content": "import 'package:PiliPlus/common/skeleton/msg_feed_top.dart';\nimport 'package:PiliPlus/common/widgets/sliver/sliver_floating_header.dart';\nimport 'package:PiliPlus/models/search/result.dart';\nimport 'package:PiliPlus/pages/search_panel/user/controller.dart';\nimport 'package:PiliPlus/pages/search_panel/user/widgets/item.dart';\nimport 'package:PiliPlus/pages/search_panel/view.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart'\n    hide SliverGridDelegateWithMaxCrossAxisExtent;\nimport 'package:get/get.dart';\n\nclass SearchUserPanel extends CommonSearchPanel {\n  const SearchUserPanel({\n    super.key,\n    required super.keyword,\n    required super.tag,\n    required super.searchType,\n  });\n\n  @override\n  State<SearchUserPanel> createState() => _SearchUserPanelState();\n}\n\nclass _SearchUserPanelState\n    extends\n        CommonSearchPanelState<\n          SearchUserPanel,\n          SearchUserData,\n          SearchUserItemModel\n        > {\n  @override\n  late final SearchUserController controller;\n\n  @override\n  void initState() {\n    super.initState();\n    controller = Get.put(\n      SearchUserController(\n        keyword: widget.keyword,\n        searchType: widget.searchType,\n        tag: widget.tag,\n      ),\n      tag: widget.searchType.name + widget.tag,\n    );\n  }\n\n  @override\n  Widget buildHeader(ThemeData theme) {\n    return SliverFloatingHeaderWidget(\n      backgroundColor: theme.colorScheme.surface,\n      child: Padding(\n        padding: const .fromLTRB(25, 0, 12, 4),\n        child: Row(\n          children: [\n            Obx(\n              () => Text(\n                '排序: ${controller.userOrderType!.value.label}',\n                maxLines: 1,\n                style: TextStyle(color: theme.colorScheme.outline),\n              ),\n            ),\n            const Spacer(),\n            Obx(\n              () => Text(\n                '用户类型: ${controller.userType!.value.label}',\n                maxLines: 1,\n                style: TextStyle(color: theme.colorScheme.outline),\n              ),\n            ),\n            const Spacer(),\n            SizedBox(\n              width: 32,\n              height: 32,\n              child: IconButton(\n                tooltip: '筛选',\n                style: const ButtonStyle(\n                  padding: WidgetStatePropertyAll(EdgeInsets.zero),\n                ),\n                onPressed: () => controller.onShowFilterDialog(context),\n                icon: Icon(\n                  Icons.filter_list_outlined,\n                  size: 18,\n                  color: theme.colorScheme.primary,\n                ),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  late final gridDelegate = SliverGridDelegateWithMaxCrossAxisExtent(\n    maxCrossAxisExtent: Grid.smallCardWidth * 2,\n    mainAxisExtent: 66,\n  );\n\n  @override\n  Widget buildList(ThemeData theme, List<SearchUserItemModel> list) {\n    return SliverGrid.builder(\n      gridDelegate: gridDelegate,\n      itemBuilder: (BuildContext context, int index) {\n        if (index == list.length - 1) {\n          controller.onLoadMore();\n        }\n        return SearchUserItem(\n          item: list[index],\n        );\n      },\n      itemCount: list.length,\n    );\n  }\n\n  @override\n  Widget get buildLoading => SliverGrid.builder(\n    gridDelegate: gridDelegate,\n    itemBuilder: (context, index) => const MsgFeedTopSkeleton(),\n    itemCount: 10,\n  );\n}\n"
  },
  {
    "path": "lib/pages/search_panel/user/widgets/item.dart",
    "content": "import 'package:PiliPlus/common/widgets/pendant_avatar.dart';\nimport 'package:PiliPlus/models/search/result.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass SearchUserItem extends StatelessWidget {\n  const SearchUserItem({\n    super.key,\n    required this.item,\n  });\n\n  final SearchUserItemModel item;\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    final style = TextStyle(\n      fontSize: theme.textTheme.labelSmall!.fontSize,\n      color: theme.colorScheme.outline,\n    );\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onTap: () => Get.toNamed('/member?mid=${item.mid}'),\n        child: Row(\n          children: [\n            const SizedBox(width: 15),\n            PendantAvatar(\n              avatar: item.upic,\n              size: 42,\n              isVip: false,\n              officialType: item.officialVerify?.type,\n              roomId: item.isLive == 1 ? item.roomId : null,\n            ),\n            const SizedBox(width: 10),\n            Column(\n              mainAxisSize: MainAxisSize.max,\n              crossAxisAlignment: CrossAxisAlignment.start,\n              mainAxisAlignment: MainAxisAlignment.center,\n              children: [\n                Row(\n                  children: [\n                    Text(\n                      item.uname!,\n                      style: const TextStyle(\n                        fontSize: 14,\n                      ),\n                    ),\n                    const SizedBox(width: 6),\n                    Image.asset(\n                      Utils.levelName(\n                        item.level!,\n                        isSeniorMember: item.isSeniorMember == 1,\n                      ),\n                      height: 11,\n                      cacheHeight: 11.cacheSize(context),\n                      semanticLabel: '等级${item.level}',\n                    ),\n                  ],\n                ),\n                Text(\n                  '粉丝：${NumUtils.numFormat(item.fans)}  视频：${NumUtils.numFormat(item.videos)}',\n                  style: style,\n                ),\n                if (item.officialVerify?.desc?.isNotEmpty == true)\n                  Text(\n                    item.officialVerify!.desc!,\n                    style: style,\n                  ),\n              ],\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/search_panel/video/controller.dart",
    "content": "import 'dart:math';\n\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/search/search_type.dart';\nimport 'package:PiliPlus/models/common/search/video_search_type.dart';\nimport 'package:PiliPlus/models/search/result.dart';\nimport 'package:PiliPlus/pages/search/widgets/search_text.dart';\nimport 'package:PiliPlus/pages/search_panel/controller.dart';\nimport 'package:PiliPlus/utils/app_scheme.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/extension/context_ext.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass SearchVideoController\n    extends SearchPanelController<SearchVideoData, SearchVideoItemModel> {\n  SearchVideoController({\n    required super.keyword,\n    required super.searchType,\n    required super.tag,\n  });\n\n  late bool hasJump2Video = false;\n\n  @override\n  void onInit() {\n    super.onInit();\n    videoDurationType = VideoDurationType.all;\n    videoZoneType = VideoZoneType.all;\n    DateTime now = DateTime.now();\n    pubBeginDate = DateTime(now.year, now.month, 1, 0, 0, 0);\n    pubEndDate = DateTime(now.year, now.month, now.day, 23, 59, 59);\n\n    jump2Video();\n  }\n\n  @override\n  List<SearchVideoItemModel>? getDataList(SearchVideoData response) {\n    return response.list;\n  }\n\n  @override\n  bool customHandleResponse(bool isRefresh, Success<SearchVideoData> response) {\n    searchResultController?.count[searchType.index] =\n        response.response.numResults ?? 0;\n    if (searchType == SearchType.video && !hasJump2Video && isRefresh) {\n      hasJump2Video = true;\n      onPushDetail(response.response.list);\n    }\n    return false;\n  }\n\n  void onPushDetail(List<SearchVideoItemModel>? resultList) {\n    try {\n      int? aid = int.tryParse(keyword);\n      if (aid != null && resultList?.firstOrNull?.aid == aid) {\n        PiliScheme.videoPush(aid, null, showDialog: false);\n      }\n    } catch (_) {}\n  }\n\n  void jump2Video() {\n    if (IdUtils.avRegexExact.hasMatch(keyword)) {\n      hasJump2Video = true;\n      PiliScheme.videoPush(\n        int.parse(keyword.substring(2)),\n        null,\n        showDialog: false,\n      );\n    } else if (IdUtils.bvRegexExact.hasMatch(keyword)) {\n      hasJump2Video = true;\n      PiliScheme.videoPush(null, keyword, showDialog: false);\n    }\n  }\n\n  final Rx<ArchiveFilterType> selectedType = ArchiveFilterType.totalrank.obs;\n  VideoPubTimeType? pubTimeType = VideoPubTimeType.all;\n  late DateTime pubBeginDate;\n  late DateTime pubEndDate;\n  bool customPubBeginDate = false;\n  bool customPubEndDate = false;\n\n  void onShowFilterDialog(BuildContext context) {\n    showModalBottomSheet(\n      context: context,\n      useSafeArea: true,\n      isScrollControlled: true,\n      constraints: BoxConstraints(\n        maxWidth: min(640, context.mediaQueryShortestSide),\n      ),\n      builder: (context) => StatefulBuilder(\n        builder: (context, setState) {\n          final theme = Theme.of(context);\n          Widget dateWidget([bool isFirst = true]) {\n            final enable =\n                pubTimeType == null &&\n                (isFirst ? customPubBeginDate : customPubEndDate);\n            return SearchText(\n              text: DateFormatUtils.longFormat.format(\n                isFirst ? pubBeginDate : pubEndDate,\n              ),\n              textAlign: TextAlign.center,\n              onTap: (text) {\n                showDatePicker(\n                  context: context,\n                  initialDate: isFirst ? pubBeginDate : pubEndDate,\n                  firstDate: isFirst ? DateTime(2009, 6, 26) : pubBeginDate,\n                  lastDate: isFirst ? pubEndDate : DateTime.now(),\n                ).then((selectedDate) {\n                  if (selectedDate != null) {\n                    if (isFirst) {\n                      customPubBeginDate = true;\n                      pubBeginDate = selectedDate;\n                    } else {\n                      customPubEndDate = true;\n                      pubEndDate = selectedDate;\n                    }\n                    pubTimeType = null;\n                    SmartDialog.dismiss();\n                    pubBegin =\n                        DateTime(\n                          pubBeginDate.year,\n                          pubBeginDate.month,\n                          pubBeginDate.day,\n                          0,\n                          0,\n                          0,\n                        ).millisecondsSinceEpoch ~/\n                        1000;\n                    pubEnd =\n                        DateTime(\n                          pubEndDate.year,\n                          pubEndDate.month,\n                          pubEndDate.day,\n                          23,\n                          59,\n                          59,\n                        ).millisecondsSinceEpoch ~/\n                        1000;\n                    setState(() {});\n                    onSortSearch(getBack: false);\n                  }\n                });\n              },\n              bgColor: enable\n                  ? theme.colorScheme.secondaryContainer\n                  : theme.colorScheme.outline.withValues(alpha: 0.1),\n              textColor: enable\n                  ? theme.colorScheme.onSecondaryContainer\n                  : theme.colorScheme.outline.withValues(alpha: 0.8),\n            );\n          }\n\n          return SingleChildScrollView(\n            padding: EdgeInsets.only(\n              top: 20,\n              left: 16,\n              right: 16,\n              bottom: 100 + MediaQuery.viewPaddingOf(context).bottom,\n            ),\n            child: Column(\n              mainAxisSize: MainAxisSize.min,\n              crossAxisAlignment: CrossAxisAlignment.stretch,\n              children: [\n                const SizedBox(height: 10),\n                const Text('发布时间', style: TextStyle(fontSize: 16)),\n                const SizedBox(height: 10),\n                Wrap(\n                  spacing: 8,\n                  runSpacing: 8,\n                  children: VideoPubTimeType.values.map(\n                    (e) {\n                      final isCurr = e == pubTimeType;\n                      return SearchText(\n                        text: e.label,\n                        onTap: (text) {\n                          pubTimeType = e;\n                          DateTime now = DateTime.now();\n                          if (e == VideoPubTimeType.all) {\n                            pubBegin = null;\n                            pubEnd = null;\n                          } else {\n                            pubBegin =\n                                DateTime(\n                                  now.year,\n                                  now.month,\n                                  now.day -\n                                      (e == VideoPubTimeType.day\n                                          ? 0\n                                          : e == VideoPubTimeType.week\n                                          ? 6\n                                          : 179),\n                                  0,\n                                  0,\n                                  0,\n                                ).millisecondsSinceEpoch ~/\n                                1000;\n                            pubEnd =\n                                DateTime(\n                                  now.year,\n                                  now.month,\n                                  now.day,\n                                  23,\n                                  59,\n                                  59,\n                                ).millisecondsSinceEpoch ~/\n                                1000;\n                          }\n                          onSortSearch();\n                        },\n                        bgColor: isCurr\n                            ? theme.colorScheme.secondaryContainer\n                            : null,\n                        textColor: isCurr\n                            ? theme.colorScheme.onSecondaryContainer\n                            : null,\n                      );\n                    },\n                  ).toList(),\n                ),\n                const SizedBox(height: 8),\n                Row(\n                  spacing: 8,\n                  children: [\n                    Expanded(child: dateWidget()),\n                    const Text('至', style: TextStyle(fontSize: 13)),\n                    Expanded(child: dateWidget(false)),\n                  ],\n                ),\n                const SizedBox(height: 20),\n                const Text('内容时长', style: TextStyle(fontSize: 16)),\n                const SizedBox(height: 10),\n                Wrap(\n                  spacing: 8,\n                  runSpacing: 8,\n                  children: VideoDurationType.values.map(\n                    (e) {\n                      final isCurr = e == videoDurationType;\n                      return SearchText(\n                        text: e.label,\n                        onTap: (_) {\n                          videoDurationType = e;\n                          onSortSearch(label: e.label);\n                        },\n                        bgColor: isCurr\n                            ? theme.colorScheme.secondaryContainer\n                            : null,\n                        textColor: isCurr\n                            ? theme.colorScheme.onSecondaryContainer\n                            : null,\n                      );\n                    },\n                  ).toList(),\n                ),\n                const SizedBox(height: 20),\n                const Text('内容分区', style: TextStyle(fontSize: 16)),\n                const SizedBox(height: 10),\n                Wrap(\n                  spacing: 8,\n                  runSpacing: 8,\n                  children: VideoZoneType.values.map(\n                    (e) {\n                      final isCurr = e == videoZoneType;\n                      return SearchText(\n                        text: e.label,\n                        onTap: (_) {\n                          videoZoneType = e;\n                          onSortSearch(label: e.label);\n                        },\n                        bgColor: isCurr\n                            ? theme.colorScheme.secondaryContainer\n                            : null,\n                        textColor: isCurr\n                            ? theme.colorScheme.onSecondaryContainer\n                            : null,\n                      );\n                    },\n                  ).toList(),\n                ),\n              ],\n            ),\n          );\n        },\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/search_panel/video/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/sliver/sliver_floating_header.dart';\nimport 'package:PiliPlus/common/widgets/video_card/video_card_h.dart';\nimport 'package:PiliPlus/models/common/search/video_search_type.dart';\nimport 'package:PiliPlus/models/search/result.dart';\nimport 'package:PiliPlus/pages/search/widgets/search_text.dart';\nimport 'package:PiliPlus/pages/search_panel/video/controller.dart';\nimport 'package:PiliPlus/pages/search_panel/view.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass SearchVideoPanel extends CommonSearchPanel {\n  const SearchVideoPanel({\n    super.key,\n    required super.keyword,\n    required super.tag,\n    required super.searchType,\n  });\n\n  @override\n  State<SearchVideoPanel> createState() => _SearchVideoPanelState();\n}\n\nclass _SearchVideoPanelState\n    extends\n        CommonSearchPanelState<\n          SearchVideoPanel,\n          SearchVideoData,\n          SearchVideoItemModel\n        >\n    with GridMixin {\n  @override\n  late final SearchVideoController controller;\n\n  @override\n  void initState() {\n    super.initState();\n    controller = Get.put(\n      SearchVideoController(\n        keyword: widget.keyword,\n        searchType: widget.searchType,\n        tag: widget.tag,\n      ),\n      tag: widget.searchType.name + widget.tag,\n    );\n  }\n\n  @override\n  Widget buildHeader(ThemeData theme) {\n    return SliverFloatingHeaderWidget(\n      backgroundColor: theme.colorScheme.surface,\n      child: Padding(\n        padding: const .fromLTRB(12, 0, 12, 4),\n        child: Row(\n          children: [\n            Expanded(\n              child: SingleChildScrollView(\n                scrollDirection: Axis.horizontal,\n                child: Wrap(\n                  children: [\n                    for (final e in ArchiveFilterType.values)\n                      Obx(\n                        () => SearchText(\n                          fontSize: 13,\n                          text: e.desc,\n                          bgColor: Colors.transparent,\n                          textColor: controller.selectedType.value == e\n                              ? theme.colorScheme.primary\n                              : theme.colorScheme.outline,\n                          onTap: (_) => controller\n                            ..order = e.name\n                            ..selectedType.value = e\n                            ..onSortSearch(getBack: false),\n                        ),\n                      ),\n                  ],\n                ),\n              ),\n            ),\n            const VerticalDivider(indent: 7, endIndent: 8),\n            const SizedBox(width: 3),\n            SizedBox(\n              width: 32,\n              height: 32,\n              child: IconButton(\n                tooltip: '筛选',\n                style: const ButtonStyle(\n                  padding: WidgetStatePropertyAll(EdgeInsets.zero),\n                ),\n                onPressed: () => controller.onShowFilterDialog(context),\n                icon: Icon(\n                  Icons.filter_list_outlined,\n                  size: 18,\n                  color: theme.colorScheme.primary,\n                ),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  @override\n  Widget buildList(ThemeData theme, List<SearchVideoItemModel> list) {\n    return SliverGrid.builder(\n      gridDelegate: gridDelegate,\n      itemBuilder: (context, index) {\n        if (index == list.length - 1) {\n          controller.onLoadMore();\n        }\n        return VideoCardH(\n          videoItem: list[index],\n          onRemove: () => controller.loadingState\n            ..value.data!.removeAt(index)\n            ..refresh(),\n        );\n      },\n      itemCount: list.length,\n    );\n  }\n\n  @override\n  Widget get buildLoading => gridSkeleton;\n}\n"
  },
  {
    "path": "lib/pages/search_panel/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/search/search_type.dart';\nimport 'package:PiliPlus/models/search/result.dart';\nimport 'package:PiliPlus/pages/search_panel/controller.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nabstract class CommonSearchPanel extends StatefulWidget {\n  const CommonSearchPanel({\n    super.key,\n    required this.keyword,\n    required this.searchType,\n    required this.tag,\n  });\n\n  final String keyword;\n  final SearchType searchType;\n  final String tag;\n}\n\nabstract class CommonSearchPanelState<\n  S extends CommonSearchPanel,\n  R extends SearchNumData<T>,\n  T\n>\n    extends State<S>\n    with AutomaticKeepAliveClientMixin {\n  SearchPanelController<R, T> get controller;\n\n  @override\n  bool get wantKeepAlive => true;\n\n  @override\n  void dispose() {\n    controller.cancelListener();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final theme = Theme.of(context);\n    return refreshIndicator(\n      onRefresh: controller.onRefresh,\n      child: CustomScrollView(\n        controller: controller.scrollController,\n        physics: const AlwaysScrollableScrollPhysics(),\n        slivers: [\n          ?buildHeader(theme),\n          SliverPadding(\n            padding: EdgeInsets.only(\n              bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n            ),\n            sliver: Obx(() => _buildBody(theme, controller.loadingState.value)),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget get buildLoading;\n\n  Widget _buildBody(ThemeData theme, LoadingState<List<T>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => buildLoading,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? buildList(theme, response)\n            : HttpError(onReload: controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: controller.onReload,\n      ),\n    };\n  }\n\n  Widget? buildHeader(ThemeData theme) => null;\n\n  Widget buildList(ThemeData theme, List<T> list);\n}\n"
  },
  {
    "path": "lib/pages/search_result/controller.dart",
    "content": "import 'package:PiliPlus/models/common/search/search_type.dart';\nimport 'package:get/get.dart';\n\nclass SearchResultController extends GetxController {\n  String keyword = Get.parameters['keyword'] ?? '';\n\n  RxList<int> count = List.filled(SearchType.values.length, -1).obs;\n\n  RxInt toTopIndex = (-1).obs;\n\n  @override\n  void onClose() {\n    toTopIndex.close();\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "lib/pages/search_result/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/common/widgets/view_safe_area.dart';\nimport 'package:PiliPlus/models/common/search/search_type.dart';\nimport 'package:PiliPlus/pages/search/controller.dart';\nimport 'package:PiliPlus/pages/search_panel/article/view.dart';\nimport 'package:PiliPlus/pages/search_panel/live/view.dart';\nimport 'package:PiliPlus/pages/search_panel/pgc/view.dart';\nimport 'package:PiliPlus/pages/search_panel/user/view.dart';\nimport 'package:PiliPlus/pages/search_panel/video/view.dart';\nimport 'package:PiliPlus/pages/search_result/controller.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass SearchResultPage extends StatefulWidget {\n  const SearchResultPage({super.key});\n\n  @override\n  State<SearchResultPage> createState() => _SearchResultPageState();\n}\n\nclass _SearchResultPageState extends State<SearchResultPage>\n    with SingleTickerProviderStateMixin {\n  late SearchResultController _searchResultController;\n  late TabController _tabController;\n  final String _tag = DateTime.now().millisecondsSinceEpoch.toString();\n  final bool _isFromSearch = Get.arguments?['fromSearch'] ?? false;\n  SSearchController? sSearchController;\n\n  @override\n  void initState() {\n    super.initState();\n    _searchResultController = Get.put(\n      SearchResultController(),\n      tag: _tag,\n    );\n\n    _tabController = TabController(\n      vsync: this,\n      initialIndex: Get.arguments?['initIndex'] ?? 0,\n      length: SearchType.values.length,\n    );\n\n    if (_isFromSearch) {\n      try {\n        sSearchController = Get.find<SSearchController>(\n          tag: Get.parameters['tag'],\n        );\n        _tabController.addListener(listener);\n      } catch (_) {}\n    }\n  }\n\n  void listener() {\n    sSearchController?.initIndex = _tabController.index;\n  }\n\n  @override\n  void dispose() {\n    _tabController\n      ..removeListener(listener)\n      ..dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        shape: Border(\n          bottom: BorderSide(\n            color: theme.dividerColor.withValues(alpha: 0.08),\n            width: 1,\n          ),\n        ),\n        title: GestureDetector(\n          onTap: () {\n            if (_isFromSearch) {\n              Get.back();\n            } else {\n              Get.offNamed(\n                '/search',\n                parameters: {'text': _searchResultController.keyword},\n              );\n            }\n          },\n          behavior: HitTestBehavior.opaque,\n          child: SizedBox(\n            width: double.infinity,\n            child: Text(\n              _searchResultController.keyword,\n              style: theme.textTheme.titleMedium,\n              maxLines: 1,\n            ),\n          ),\n        ),\n      ),\n      body: ViewSafeArea(\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            TabBar(\n              overlayColor: const WidgetStatePropertyAll(Colors.transparent),\n              splashFactory: NoSplash.splashFactory,\n              padding: const EdgeInsets.only(top: 4, left: 8, right: 8),\n              controller: _tabController,\n              tabs: SearchType.values\n                  .map(\n                    (item) => Obx(\n                      () {\n                        int count = _searchResultController.count[item.index];\n                        return Tab(\n                          text:\n                              '${item.label}${count != -1 ? ' ${count > 99 ? '99+' : count}' : ''}',\n                        );\n                      },\n                    ),\n                  )\n                  .toList(),\n              isScrollable: true,\n              indicatorWeight: 0,\n              indicatorPadding: const EdgeInsets.symmetric(\n                horizontal: 3,\n                vertical: 8,\n              ),\n              indicator: BoxDecoration(\n                color: theme.colorScheme.secondaryContainer,\n                borderRadius: const BorderRadius.all(Radius.circular(20)),\n              ),\n              indicatorSize: TabBarIndicatorSize.tab,\n              labelColor: theme.colorScheme.onSecondaryContainer,\n              labelStyle:\n                  TabBarTheme.of(\n                    context,\n                  ).labelStyle?.copyWith(fontSize: 13) ??\n                  const TextStyle(fontSize: 13),\n              dividerColor: Colors.transparent,\n              dividerHeight: 0,\n              unselectedLabelColor: theme.colorScheme.outline,\n              tabAlignment: TabAlignment.start,\n              onTap: (index) {\n                if (!_tabController.indexIsChanging) {\n                  if (_searchResultController.toTopIndex.value == index) {\n                    _searchResultController.toTopIndex.refresh();\n                  } else {\n                    _searchResultController.toTopIndex.value = index;\n                  }\n                }\n              },\n            ),\n            Expanded(\n              child: tabBarView(\n                controller: _tabController,\n                children: SearchType.values\n                    .map(\n                      (item) => switch (item) {\n                        // SearchType.all => SearchAllPanel(\n                        //   tag: _tag,\n                        //   searchType: item,\n                        //   keyword: _searchResultController.keyword,\n                        // ),\n                        SearchType.video => SearchVideoPanel(\n                          tag: _tag,\n                          searchType: item,\n                          keyword: _searchResultController.keyword,\n                        ),\n                        SearchType.media_bangumi ||\n                        SearchType.media_ft => SearchPgcPanel(\n                          tag: _tag,\n                          searchType: item,\n                          keyword: _searchResultController.keyword,\n                        ),\n                        SearchType.live_room => SearchLivePanel(\n                          tag: _tag,\n                          searchType: item,\n                          keyword: _searchResultController.keyword,\n                        ),\n                        SearchType.bili_user => SearchUserPanel(\n                          tag: _tag,\n                          searchType: item,\n                          keyword: _searchResultController.keyword,\n                        ),\n                        SearchType.article => SearchArticlePanel(\n                          tag: _tag,\n                          searchType: item,\n                          keyword: _searchResultController.keyword,\n                        ),\n                      },\n                    )\n                    .toList(),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/search_trending/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/search.dart';\nimport 'package:PiliPlus/models_new/search/search_trending/data.dart';\nimport 'package:PiliPlus/models_new/search/search_trending/list.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\n\nclass SearchTrendingController\n    extends CommonListController<SearchTrendingData, SearchTrendingItemModel> {\n  int topCount = 0;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  List<SearchTrendingItemModel>? getDataList(SearchTrendingData response) {\n    List<SearchTrendingItemModel> topList =\n        response.topList ?? <SearchTrendingItemModel>[];\n    topCount = topList.length;\n    return response.list == null ? topList : topList\n      ..addAll(response.list ?? []);\n  }\n\n  @override\n  Future<LoadingState<SearchTrendingData>> customGetData() =>\n      SearchHttp.searchTrending();\n}\n"
  },
  {
    "path": "lib/pages/search_trending/view.dart",
    "content": "import 'dart:math';\n\nimport 'package:PiliPlus/common/widgets/flutter/list_tile.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/search/search_trending/list.dart';\nimport 'package:PiliPlus/pages/search_trending/controller.dart';\nimport 'package:PiliPlus/utils/extension/context_ext.dart';\nimport 'package:PiliPlus/utils/extension/get_ext.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/extension/size_ext.dart';\nimport 'package:PiliPlus/utils/image_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:cached_network_image/cached_network_image.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart' hide ListTile;\nimport 'package:flutter/services.dart' show SystemUiOverlayStyle;\nimport 'package:get/get.dart';\n\nclass SearchTrendingPage extends StatefulWidget {\n  const SearchTrendingPage({super.key});\n\n  @override\n  State<SearchTrendingPage> createState() => _SearchTrendingPageState();\n}\n\nclass _SearchTrendingPageState extends State<SearchTrendingPage> {\n  final _controller = Get.putOrFind(SearchTrendingController.new);\n\n  late double _offset;\n  final RxDouble _scrollRatio = 0.0.obs;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller.scrollController.addListener(listener);\n  }\n\n  @override\n  void dispose() {\n    _controller.scrollController.removeListener(listener);\n    super.dispose();\n  }\n\n  void listener() {\n    if (_controller.scrollController.hasClients) {\n      _scrollRatio.value = clampDouble(\n        _controller.scrollController.position.pixels / _offset,\n        0.0,\n        1.0,\n      );\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    final padding = MediaQuery.viewPaddingOf(context);\n    final size = context.mediaQuerySize;\n    final maxWidth = size.width - padding.horizontal;\n    final width = size.isPortrait ? maxWidth : min(640.0, maxWidth * 0.6);\n    final height = width * 528 / 1125;\n    _offset = height - 56 - padding.top;\n    listener();\n    return Scaffold(\n      extendBody: true,\n      extendBodyBehindAppBar: true,\n      resizeToAvoidBottomInset: false,\n      appBar: PreferredSize(\n        preferredSize: const Size.fromHeight(56),\n        child: Obx(\n          () {\n            final scrollRatio = _scrollRatio.value;\n            final flag = maxWidth > width || scrollRatio >= 0.5;\n            return AppBar(\n              title: Opacity(\n                opacity: scrollRatio,\n                child: Text(\n                  'bilibili热搜',\n                  style: TextStyle(\n                    color: flag ? null : Colors.white,\n                  ),\n                ),\n              ),\n              backgroundColor: theme.colorScheme.surface.withValues(\n                alpha: scrollRatio,\n              ),\n              foregroundColor: flag ? null : Colors.white,\n              systemOverlayStyle: flag\n                  ? null\n                  : const SystemUiOverlayStyle(\n                      statusBarBrightness: Brightness.dark,\n                      statusBarIconBrightness: Brightness.light,\n                    ),\n              shape: scrollRatio == 1\n                  ? Border(\n                      bottom: BorderSide(\n                        color: theme.colorScheme.outline.withValues(\n                          alpha: 0.1,\n                        ),\n                      ),\n                    )\n                  : null,\n            );\n          },\n        ),\n      ),\n      body: Padding(\n        padding: EdgeInsets.only(\n          left: padding.left,\n          right: padding.right,\n        ),\n        child: Center(\n          child: SizedBox(\n            width: width,\n            child: refreshIndicator(\n              onRefresh: _controller.onRefresh,\n              child: CustomScrollView(\n                controller: _controller.scrollController,\n                physics: const AlwaysScrollableScrollPhysics(),\n                slivers: [\n                  SliverToBoxAdapter(\n                    child: Image.asset(\n                      width: width,\n                      height: height,\n                      cacheWidth: width.cacheSize(context),\n                      'assets/images/trending_banner.png',\n                      filterQuality: FilterQuality.low,\n                    ),\n                  ),\n                  SliverPadding(\n                    padding: EdgeInsets.only(bottom: padding.bottom + 100),\n                    sliver: Obx(\n                      () => _buildBody(theme, _controller.loadingState.value),\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget _buildBody(\n    ThemeData theme,\n    LoadingState<List<SearchTrendingItemModel>?> loadingState,\n  ) {\n    late final divider = Divider(\n      height: 1,\n      indent: 48,\n      color: theme.colorScheme.outline.withValues(alpha: 0.1),\n    );\n    return switch (loadingState) {\n      Loading() => linearLoading,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverList.separated(\n                itemCount: response.length,\n                itemBuilder: (context, index) {\n                  final item = response[index];\n                  return ListTile(\n                    dense: true,\n                    onTap: () => Get.toNamed(\n                      '/searchResult',\n                      parameters: {\n                        'keyword': item.keyword!,\n                      },\n                    ),\n                    leading: index < _controller.topCount\n                        ? const Icon(\n                            size: 17,\n                            Icons.vertical_align_top_outlined,\n                            color: Color(0xFFd1403e),\n                          )\n                        : Text(\n                            '${index + 1 - _controller.topCount}',\n                            style: TextStyle(\n                              fontWeight: FontWeight.bold,\n                              color: Utils.index2Color(\n                                index - _controller.topCount,\n                                theme.colorScheme.outline,\n                              ),\n                              fontSize: 17,\n                              fontStyle: FontStyle.italic,\n                            ),\n                          ),\n                    title: Row(\n                      children: [\n                        Flexible(\n                          child: Text(\n                            item.keyword!,\n                            maxLines: 1,\n                            overflow: TextOverflow.ellipsis,\n                            strutStyle: const StrutStyle(height: 1, leading: 0),\n                            style: const TextStyle(height: 1, fontSize: 15),\n                          ),\n                        ),\n                        if (item.icon?.isNotEmpty == true) ...[\n                          const SizedBox(width: 4),\n                          CachedNetworkImage(\n                            height: 16,\n                            memCacheHeight: 16.cacheSize(context),\n                            imageUrl: ImageUtils.thumbnailUrl(item.icon!),\n                            placeholder: (_, _) => const SizedBox.shrink(),\n                          ),\n                        ] else if (item.showLiveIcon == true) ...[\n                          const SizedBox(width: 4),\n                          Image.asset(\n                            'assets/images/live/live.gif',\n                            width: 51,\n                            height: 16,\n                            cacheHeight: 16.cacheSize(context),\n                          ),\n                        ],\n                      ],\n                    ),\n                  );\n                },\n                separatorBuilder: (context, index) => divider,\n              )\n            : HttpError(onReload: _controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/setting/extra_setting.dart",
    "content": "import 'package:PiliPlus/pages/setting/models/extra_settings.dart';\nimport 'package:flutter/material.dart';\n\nclass ExtraSetting extends StatefulWidget {\n  const ExtraSetting({super.key, this.showAppBar = true});\n\n  final bool showAppBar;\n\n  @override\n  State<ExtraSetting> createState() => _ExtraSettingState();\n}\n\nclass _ExtraSettingState extends State<ExtraSetting> {\n  final settings = extraSettings;\n\n  @override\n  Widget build(BuildContext context) {\n    final showAppBar = widget.showAppBar;\n    final padding = MediaQuery.viewPaddingOf(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: showAppBar ? AppBar(title: const Text('其它设置')) : null,\n      body: ListView.builder(\n        padding: EdgeInsets.only(\n          left: showAppBar ? padding.left : 0,\n          right: showAppBar ? padding.right : 0,\n          bottom: padding.bottom + 100,\n        ),\n        itemCount: settings.length,\n        itemBuilder: (context, index) => settings[index].widget,\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/setting/models/extra_settings.dart",
    "content": "import 'dart:io';\nimport 'dart:math' show pi, max;\n\nimport 'package:PiliPlus/common/widgets/custom_icon.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/gesture/horizontal_drag_gesture_recognizer.dart'\n    show touchSlopH;\nimport 'package:PiliPlus/common/widgets/image_grid/image_grid_view.dart'\n    show ImageGridView, ImageModel;\nimport 'package:PiliPlus/common/widgets/pendant_avatar.dart';\nimport 'package:PiliPlus/grpc/reply.dart';\nimport 'package:PiliPlus/http/fav.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/audio_normalization.dart';\nimport 'package:PiliPlus/models/common/dynamic/dynamics_type.dart';\nimport 'package:PiliPlus/models/common/member/tab_type.dart';\nimport 'package:PiliPlus/models/common/reply/reply_sort_type.dart';\nimport 'package:PiliPlus/models/common/sponsor_block/skip_type.dart';\nimport 'package:PiliPlus/models/common/super_resolution_type.dart';\nimport 'package:PiliPlus/models/dynamics/result.dart'\n    show DynamicsDataModel, ItemModulesModel;\nimport 'package:PiliPlus/pages/common/slide/common_slide_page.dart';\nimport 'package:PiliPlus/pages/home/controller.dart';\nimport 'package:PiliPlus/pages/main/controller.dart';\nimport 'package:PiliPlus/pages/setting/models/model.dart';\nimport 'package:PiliPlus/pages/setting/widgets/select_dialog.dart';\nimport 'package:PiliPlus/pages/setting/widgets/slider_dialog.dart';\nimport 'package:PiliPlus/pages/video/reply/widgets/reply_item_grpc.dart';\nimport 'package:PiliPlus/plugin/pl_player/controller.dart';\nimport 'package:PiliPlus/services/download/download_service.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/cache_manager.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/feed_back.dart';\nimport 'package:PiliPlus/utils/image_utils.dart';\nimport 'package:PiliPlus/utils/path_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/update.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:file_picker/file_picker.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart' hide RefreshIndicator;\nimport 'package:flutter/services.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:font_awesome_flutter/font_awesome_flutter.dart';\nimport 'package:get/get.dart';\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\n\nList<SettingsModel> get extraSettings => [\n  if (PlatformUtils.isDesktop) ...[\n    SwitchModel(\n      title: '退出时最小化',\n      leading: const Icon(Icons.exit_to_app),\n      setKey: SettingBoxKey.minimizeOnExit,\n      defaultVal: true,\n      onChanged: (value) {\n        try {\n          Get.find<MainController>().minimizeOnExit = value;\n        } catch (_) {}\n      },\n    ),\n    NormalModel(\n      title: '缓存路径',\n      getSubtitle: () => downloadPath,\n      leading: const Icon(Icons.storage),\n      onTap: _showDownPathDialog,\n    ),\n  ],\n  SwitchModel(\n    title: '空降助手',\n    subtitle: '点击配置',\n    setKey: SettingBoxKey.enableSponsorBlock,\n    defaultVal: false,\n    onTap: (context) => Get.toNamed('/sponsorBlock'),\n    leading: const Stack(\n      clipBehavior: Clip.none,\n      alignment: Alignment.center,\n      children: [\n        Icon(Icons.shield_outlined),\n        Icon(Icons.play_arrow_rounded, size: 15),\n      ],\n    ),\n  ),\n  PopupModel<SkipType>(\n    title: '番剧片头/片尾跳过类型',\n    leading: const Icon(MdiIcons.debugStepOver),\n    value: () => Pref.pgcSkipType,\n    items: SkipType.values,\n    onSelected: (value, setState) => GStorage.setting\n        .put(SettingBoxKey.pgcSkipType, value.index)\n        .whenComplete(setState),\n  ),\n  SwitchModel(\n    title: '检查未读动态',\n    subtitle: '点击设置检查周期(min)',\n    leading: const Icon(Icons.notifications_none),\n    setKey: SettingBoxKey.checkDynamic,\n    defaultVal: true,\n    onChanged: (value) => Get.find<MainController>().checkDynamic = value,\n    onTap: _showDynDialog,\n  ),\n  SwitchModel(\n    title: '显示视频分段信息',\n    leading: Transform.rotate(\n      angle: pi / 2,\n      child: const Icon(MdiIcons.viewHeadline),\n    ),\n    setKey: SettingBoxKey.showViewPoints,\n    defaultVal: true,\n  ),\n  const SwitchModel(\n    title: '视频页显示相关视频',\n    leading: Icon(MdiIcons.motionPlayOutline),\n    setKey: SettingBoxKey.showRelatedVideo,\n    defaultVal: true,\n  ),\n  const SwitchModel(\n    title: '显示视频评论',\n    leading: Icon(MdiIcons.commentTextOutline),\n    setKey: SettingBoxKey.showVideoReply,\n    defaultVal: true,\n  ),\n  const SwitchModel(\n    title: '显示番剧评论',\n    leading: Icon(MdiIcons.commentTextOutline),\n    setKey: SettingBoxKey.showBangumiReply,\n    defaultVal: true,\n  ),\n  const SwitchModel(\n    title: '默认展开视频简介',\n    leading: Icon(Icons.expand_more),\n    setKey: SettingBoxKey.alwaysExpandIntroPanel,\n    defaultVal: false,\n  ),\n  const SwitchModel(\n    title: '横屏自动展开视频简介',\n    leading: Icon(Icons.expand_more),\n    setKey: SettingBoxKey.expandIntroPanelH,\n    defaultVal: false,\n  ),\n  SwitchModel(\n    title: '横屏分P/合集列表显示在Tab栏',\n    leading: const Icon(Icons.format_list_numbered_rtl_sharp),\n    setKey: SettingBoxKey.horizontalSeasonPanel,\n    defaultVal: PlatformUtils.isDesktop,\n  ),\n  SwitchModel(\n    title: '横屏播放页在侧栏打开UP主页',\n    leading: const Icon(Icons.account_circle_outlined),\n    setKey: SettingBoxKey.horizontalMemberPage,\n    defaultVal: PlatformUtils.isDesktop,\n  ),\n  SwitchModel(\n    title: '横屏在侧栏打开图片预览',\n    leading: const Icon(Icons.photo_outlined),\n    setKey: SettingBoxKey.horizontalPreview,\n    defaultVal: false,\n    onChanged: (value) => ImageGridView.horizontalPreview = value,\n  ),\n  NormalModel(\n    title: '评论折叠行数',\n    subtitle: '0行为不折叠',\n    leading: const Icon(Icons.compress),\n    getTrailing: (theme) => Text(\n      '${ReplyItemGrpc.replyLengthLimit}行',\n      style: theme.textTheme.titleSmall,\n    ),\n    onTap: _showReplyLengthDialog,\n  ),\n  NormalModel(\n    title: '弹幕行高',\n    subtitle: '默认1.6',\n    leading: const Icon(CustomIcons.dm_settings),\n    getTrailing: (theme) => Text(\n      Pref.danmakuLineHeight.toString(),\n      style: theme.textTheme.titleSmall,\n    ),\n    onTap: _showDmHeightDialog,\n  ),\n  const SwitchModel(\n    title: '显示视频警告/争议信息',\n    leading: Icon(Icons.warning_amber_rounded),\n    setKey: SettingBoxKey.showArgueMsg,\n    defaultVal: true,\n  ),\n  SwitchModel(\n    title: '显示动态警告/争议信息',\n    leading: const Icon(Icons.warning_amber_rounded),\n    setKey: SettingBoxKey.showDynDispute,\n    defaultVal: false,\n    onChanged: (val) => ItemModulesModel.showDynDispute = val,\n  ),\n  const SwitchModel(\n    title: '分P/合集：倒序播放从首集开始播放',\n    subtitle: '开启则自动切换为倒序首集，否则保持当前集',\n    leading: Icon(MdiIcons.sort),\n    setKey: SettingBoxKey.reverseFromFirst,\n    defaultVal: true,\n  ),\n  const SwitchModel(\n    title: '禁用 SSL 证书验证',\n    subtitle: '谨慎开启，禁用容易受到中间人攻击',\n    leading: Icon(Icons.security),\n    needReboot: true,\n    setKey: SettingBoxKey.badCertificateCallback,\n  ),\n  const SwitchModel(\n    title: '显示继续播放分P提示',\n    leading: Icon(Icons.local_parking),\n    setKey: SettingBoxKey.continuePlayingPart,\n    defaultVal: true,\n  ),\n  getBanWordModel(\n    title: '评论关键词过滤',\n    key: SettingBoxKey.banWordForReply,\n    onChanged: (value) {\n      ReplyGrpc.replyRegExp = value;\n      ReplyGrpc.enableFilter = value.pattern.isNotEmpty;\n    },\n  ),\n  getBanWordModel(\n    title: '动态关键词过滤',\n    key: SettingBoxKey.banWordForDyn,\n    onChanged: (value) {\n      DynamicsDataModel.banWordForDyn = value;\n      DynamicsDataModel.enableFilter = value.pattern.isNotEmpty;\n    },\n  ),\n  const SwitchModel(\n    title: '使用外部浏览器打开链接',\n    leading: Icon(Icons.open_in_browser),\n    setKey: SettingBoxKey.openInBrowser,\n    defaultVal: false,\n  ),\n  NormalModel(\n    title: '横向滑动阈值',\n    getSubtitle: () => '当前:「${Pref.touchSlopH}」',\n    onTap: _showTouchSlopDialog,\n    leading: const Icon(Icons.pan_tool_alt_outlined),\n  ),\n  NormalModel(\n    title: '刷新滑动距离',\n    leading: const Icon(Icons.refresh),\n    getSubtitle: () => '当前滑动距离: ${Pref.refreshDragPercentage}x',\n    onTap: _showRefreshDragDialog,\n  ),\n  NormalModel(\n    title: '刷新指示器高度',\n    leading: const Icon(Icons.height),\n    getSubtitle: () => '当前指示器高度: ${Pref.refreshDisplacement}',\n    onTap: _showRefreshDialog,\n  ),\n  const SwitchModel(\n    title: '显示会员彩色弹幕',\n    leading: Icon(MdiIcons.gradientHorizontal),\n    setKey: SettingBoxKey.showVipDanmaku,\n    defaultVal: true,\n  ),\n  const SwitchModel(\n    title: '合并弹幕',\n    subtitle: '合并一段时间内获取到的相同弹幕',\n    leading: Icon(Icons.merge),\n    setKey: SettingBoxKey.mergeDanmaku,\n    defaultVal: false,\n  ),\n  const SwitchModel(\n    title: '显示热门推荐',\n    subtitle: '热门页面显示每周必看等推荐内容入口',\n    leading: Icon(Icons.local_fire_department_outlined),\n    setKey: SettingBoxKey.showHotRcmd,\n    defaultVal: false,\n    needReboot: true,\n  ),\n  if (kDebugMode || Platform.isAndroid)\n    NormalModel(\n      title: '音量均衡',\n      leading: const Icon(Icons.multitrack_audio),\n      getSubtitle: () {\n        final audioNormalization = AudioNormalization.getTitleFromConfig(\n          Pref.audioNormalization,\n        );\n        String fallback = Pref.fallbackNormalization;\n        if (fallback == '0') {\n          fallback = '';\n        } else {\n          fallback =\n              '，无参数时:「${AudioNormalization.getTitleFromConfig(fallback)}」';\n        }\n        return '当前:「$audioNormalization」$fallback';\n      },\n      onTap: audioNormalization,\n    ),\n  NormalModel(\n    title: '超分辨率',\n    leading: const Icon(Icons.stay_current_landscape_outlined),\n    getSubtitle: () =>\n        '当前:「${Pref.superResolutionType.label}」\\n默认设置对番剧生效, 其他视频默认关闭\\n超分辨率需要启用硬件解码, 若启用硬件解码后仍然不生效, 尝试切换硬件解码器为 auto-copy',\n    onTap: _showSuperResolutionDialog,\n  ),\n  const SwitchModel(\n    title: '提前初始化播放器',\n    subtitle: '相对减少手动播放加载时间',\n    leading: Icon(Icons.play_circle_outlined),\n    setKey: SettingBoxKey.preInitPlayer,\n    defaultVal: false,\n  ),\n  const SwitchModel(\n    title: '首页切换页面动画',\n    leading: Icon(Icons.home_outlined),\n    setKey: SettingBoxKey.mainTabBarView,\n    defaultVal: false,\n    needReboot: true,\n  ),\n  const SwitchModel(\n    title: '搜索建议',\n    leading: Icon(Icons.search),\n    setKey: SettingBoxKey.searchSuggestion,\n    defaultVal: true,\n  ),\n  const SwitchModel(\n    title: '记录搜索历史',\n    leading: Icon(Icons.history),\n    setKey: SettingBoxKey.recordSearchHistory,\n    defaultVal: true,\n  ),\n  SwitchModel(\n    title: '展示头像/评论/动态装饰',\n    leading: const Icon(MdiIcons.stickerCircleOutline),\n    setKey: SettingBoxKey.showDynDecorate,\n    defaultVal: true,\n    onChanged: (value) => PendantAvatar.showDynDecorate = value,\n  ),\n  SwitchModel(\n    title: '预览 Live Photo',\n    subtitle: '开启则以视频形式预览 Live Photo，否则预览静态图片',\n    leading: const Icon(Icons.image_outlined),\n    setKey: SettingBoxKey.enableLivePhoto,\n    defaultVal: true,\n    onChanged: (value) => ImageModel.enableLivePhoto = value,\n  ),\n  const SwitchModel(\n    title: '滑动跳转预览视频缩略图',\n    leading: Icon(Icons.preview_outlined),\n    setKey: SettingBoxKey.showSeekPreview,\n    defaultVal: true,\n  ),\n  const SwitchModel(\n    title: '显示高能进度条',\n    subtitle: '高能进度条反应了在时域上，单位时间内弹幕发送量的变化趋势',\n    leading: Icon(Icons.show_chart),\n    setKey: SettingBoxKey.showDmChart,\n    defaultVal: false,\n  ),\n  const SwitchModel(\n    title: '记录评论',\n    leading: Icon(Icons.message_outlined),\n    setKey: SettingBoxKey.saveReply,\n    defaultVal: true,\n    needReboot: true,\n  ),\n  const SwitchModel(\n    title: '发评反诈',\n    subtitle: '发送评论后检查评论是否可见',\n    leading: Stack(\n      clipBehavior: Clip.none,\n      alignment: Alignment.center,\n      children: [\n        Icon(Icons.shield_outlined),\n        Icon(Icons.reply, size: 14),\n      ],\n    ),\n    setKey: SettingBoxKey.enableCommAntifraud,\n    defaultVal: false,\n  ),\n  if (Platform.isAndroid)\n    const SwitchModel(\n      title: '使用「哔哩发评反诈」检查评论',\n      leading: Icon(\n        FontAwesomeIcons.b,\n        size: 22,\n      ),\n      setKey: SettingBoxKey.biliSendCommAntifraud,\n      defaultVal: false,\n    ),\n  const SwitchModel(\n    title: '发布/转发动态反诈',\n    subtitle: '发布/转发动态后检查动态是否可见',\n    leading: Stack(\n      clipBehavior: Clip.none,\n      alignment: Alignment.center,\n      children: [\n        Icon(Icons.shield_outlined),\n        Icon(Icons.motion_photos_on, size: 12),\n      ],\n    ),\n    setKey: SettingBoxKey.enableCreateDynAntifraud,\n    defaultVal: false,\n  ),\n  SwitchModel(\n    title: '屏蔽带货动态',\n    leading: const Stack(\n      clipBehavior: Clip.none,\n      alignment: Alignment.center,\n      children: [\n        Icon(Icons.shopping_bag_outlined, size: 14),\n        Icon(Icons.not_interested),\n      ],\n    ),\n    setKey: SettingBoxKey.antiGoodsDyn,\n    defaultVal: false,\n    onChanged: (value) => DynamicsDataModel.antiGoodsDyn = value,\n  ),\n  SwitchModel(\n    title: '屏蔽带货评论',\n    leading: const Stack(\n      clipBehavior: Clip.none,\n      alignment: Alignment.center,\n      children: [\n        Icon(Icons.shopping_bag_outlined, size: 14),\n        Icon(Icons.not_interested),\n      ],\n    ),\n    setKey: SettingBoxKey.antiGoodsReply,\n    defaultVal: false,\n    onChanged: (value) => ReplyGrpc.antiGoodsReply = value,\n  ),\n  SwitchModel(\n    title: '侧滑关闭二级页面',\n    leading: Transform.rotate(\n      angle: pi * 1.5,\n      child: const Icon(Icons.touch_app),\n    ),\n    setKey: SettingBoxKey.slideDismissReplyPage,\n    defaultVal: Platform.isIOS,\n    onChanged: (value) => CommonSlideMixin.slideDismissReplyPage = value,\n  ),\n  const SwitchModel(\n    title: '启用双指缩小视频',\n    leading: Icon(Icons.pinch),\n    setKey: SettingBoxKey.enableShrinkVideoSize,\n    defaultVal: true,\n  ),\n  const SwitchModel(\n    title: '动态/专栏详情页展示底部操作栏',\n    leading: Icon(Icons.more_horiz),\n    setKey: SettingBoxKey.showDynActionBar,\n    defaultVal: true,\n  ),\n  const SwitchModel(\n    title: '启用拖拽字幕调整底部边距',\n    leading: Icon(MdiIcons.dragVariant),\n    setKey: SettingBoxKey.enableDragSubtitle,\n    defaultVal: false,\n  ),\n  const SwitchModel(\n    title: '展示追番时间表',\n    leading: Icon(MdiIcons.chartTimelineVariantShimmer),\n    setKey: SettingBoxKey.showPgcTimeline,\n    defaultVal: true,\n    needReboot: true,\n  ),\n  SwitchModel(\n    title: '静默下载图片',\n    subtitle: '不显示下载 Loading 弹窗',\n    leading: const Icon(Icons.download_for_offline_outlined),\n    setKey: SettingBoxKey.silentDownImg,\n    defaultVal: false,\n    onChanged: (value) => ImageUtils.silentDownImg = value,\n  ),\n  SwitchModel(\n    title: '长按/右键显示图片菜单',\n    leading: const Icon(Icons.menu),\n    setKey: SettingBoxKey.enableImgMenu,\n    defaultVal: false,\n    onChanged: (value) => ImageGridView.enableImgMenu = value,\n  ),\n  SwitchModel(\n    setKey: SettingBoxKey.feedBackEnable,\n    onChanged: (value) {\n      enableFeedback = value;\n      feedBack();\n    },\n    leading: const Icon(Icons.vibration_outlined),\n    title: '震动反馈',\n    subtitle: '请确定手机设置中已开启震动反馈',\n  ),\n  const SwitchModel(\n    title: '大家都在搜',\n    subtitle: '是否展示「大家都在搜」',\n    leading: Icon(Icons.data_thresholding_outlined),\n    setKey: SettingBoxKey.enableHotKey,\n    defaultVal: true,\n  ),\n  const SwitchModel(\n    title: '搜索发现',\n    subtitle: '是否展示「搜索发现」',\n    leading: Icon(Icons.search_outlined),\n    setKey: SettingBoxKey.enableSearchRcmd,\n    defaultVal: true,\n  ),\n  SwitchModel(\n    title: '搜索默认词',\n    subtitle: '是否展示搜索框默认词',\n    leading: const Icon(Icons.whatshot_outlined),\n    setKey: SettingBoxKey.enableSearchWord,\n    defaultVal: false,\n    onChanged: (val) {\n      try {\n        final controller = Get.find<HomeController>()..enableSearchWord = val;\n        if (val) {\n          controller.querySearchDefault();\n        } else {\n          controller.defaultSearch.value = '';\n        }\n      } catch (_) {}\n    },\n  ),\n  const SwitchModel(\n    title: '快速收藏',\n    subtitle: '点击设置默认收藏夹\\n点按收藏至默认，长按选择文件夹',\n    leading: Icon(Icons.bookmark_add_outlined),\n    setKey: SettingBoxKey.enableQuickFav,\n    onTap: _showFavDialog,\n    defaultVal: false,\n  ),\n  SwitchModel(\n    title: '评论区搜索关键词',\n    subtitle: '展示评论区搜索关键词',\n    leading: const Icon(Icons.search_outlined),\n    setKey: SettingBoxKey.enableWordRe,\n    defaultVal: false,\n    onChanged: (value) => ReplyItemGrpc.enableWordRe = value,\n  ),\n  const SwitchModel(\n    title: '启用AI总结',\n    subtitle: '视频详情页开启AI总结',\n    leading: Icon(Icons.engineering_outlined),\n    setKey: SettingBoxKey.enableAi,\n    defaultVal: false,\n  ),\n  const SwitchModel(\n    title: '消息页禁用\"收到的赞\"功能',\n    subtitle: '禁止打开入口，降低网络社交依赖',\n    leading: Icon(Icons.beach_access_outlined),\n    setKey: SettingBoxKey.disableLikeMsg,\n    defaultVal: false,\n  ),\n  const SwitchModel(\n    title: '默认展示评论区',\n    subtitle: '在视频详情页默认切换至评论区页（仅Tab型布局）',\n    leading: Icon(Icons.mode_comment_outlined),\n    setKey: SettingBoxKey.defaultShowComment,\n    defaultVal: false,\n  ),\n  const SwitchModel(\n    title: '启用HTTP/2',\n    leading: Icon(Icons.swap_horizontal_circle_outlined),\n    setKey: SettingBoxKey.enableHttp2,\n    defaultVal: false,\n    needReboot: true,\n  ),\n  const NormalModel(\n    title: '连接重试次数',\n    subtitle: '为0时禁用',\n    leading: Icon(Icons.repeat),\n    onTap: _showReplyCountDialog,\n  ),\n  const NormalModel(\n    title: '连接重试间隔',\n    subtitle: '实际间隔 = 间隔 * 第x次重试',\n    leading: Icon(Icons.more_time_outlined),\n    onTap: _showReplyDelayDialog,\n  ),\n  NormalModel(\n    title: '评论展示',\n    leading: const Icon(Icons.whatshot_outlined),\n    getSubtitle: () => '当前优先展示「${Pref.replySortType.title}」',\n    onTap: _showReplySortDialog,\n  ),\n  NormalModel(\n    title: '动态展示',\n    leading: const Icon(Icons.dynamic_feed_rounded),\n    getSubtitle: () => '当前优先展示「${Pref.defaultDynamicType.label}」',\n    onTap: _showDefDynDialog,\n  ),\n  SwitchModel(\n    title: '显示动态互动内容',\n    subtitle: '开启后则在动态卡片底部显示互动内容（如关注的人点赞、热评等）',\n    leading: const Icon(Icons.quickreply_outlined),\n    setKey: SettingBoxKey.showDynInteraction,\n    defaultVal: true,\n    onChanged: (val) => ItemModulesModel.showDynInteraction = val,\n  ),\n  NormalModel(\n    title: '用户页默认展示TAB',\n    leading: const Icon(Icons.tab),\n    getSubtitle: () => '当前优先展示「${Pref.memberTab.title}」',\n    onTap: _showMemberTabDialog,\n  ),\n  SwitchModel(\n    title: '显示UP主页小店TAB',\n    leading: const Icon(Icons.shop_outlined),\n    setKey: SettingBoxKey.showMemberShop,\n    defaultVal: false,\n    onChanged: (value) => MemberTabType.showMemberShop = value,\n  ),\n  const SwitchModel(\n    leading: Icon(Icons.airplane_ticket_outlined),\n    title: '设置代理',\n    subtitle: '设置代理 host:port',\n    setKey: SettingBoxKey.enableSystemProxy,\n    onTap: _showProxyDialog,\n  ),\n  const SwitchModel(\n    title: '自动清除缓存',\n    subtitle: '每次启动时清除缓存',\n    leading: Icon(Icons.auto_delete_outlined),\n    setKey: SettingBoxKey.autoClearCache,\n    defaultVal: false,\n  ),\n  NormalModel(\n    title: '最大缓存大小',\n    getSubtitle: () {\n      final num = Pref.maxCacheSize;\n      return '当前最大缓存大小: 「${num == 0 ? '无限' : CacheManager.formatSize(Pref.maxCacheSize)}」';\n    },\n    leading: const Icon(Icons.delete_outlined),\n    onTap: _showCacheDialog,\n  ),\n  SwitchModel(\n    title: '检查更新',\n    subtitle: '每次启动时检查是否需要更新',\n    leading: const Icon(Icons.system_update_alt),\n    setKey: SettingBoxKey.autoUpdate,\n    defaultVal: true,\n    onChanged: (val) {\n      if (val) {\n        Update.checkUpdate(false);\n      }\n    },\n  ),\n];\n\nFuture<void> audioNormalization(\n  BuildContext context,\n  VoidCallback setState, {\n  bool fallback = false,\n}) async {\n  final key = fallback\n      ? SettingBoxKey.fallbackNormalization\n      : SettingBoxKey.audioNormalization;\n  final res = await showDialog<String>(\n    context: context,\n    builder: (context) {\n      String audioNormalization = fallback\n          ? Pref.fallbackNormalization\n          : Pref.audioNormalization;\n      Set<String> values = {\n        '0',\n        '1',\n        if (!fallback) '2',\n        audioNormalization,\n        '3',\n      };\n      return SelectDialog<String>(\n        title: fallback ? '服务器无loudnorm配置时使用' : '音量均衡',\n        toggleable: true,\n        value: audioNormalization,\n        values: values\n            .map(\n              (e) => (\n                e,\n                switch (e) {\n                  '0' => AudioNormalization.disable.title,\n                  '1' => AudioNormalization.dynaudnorm.title,\n                  '2' => AudioNormalization.loudnorm.title,\n                  '3' => AudioNormalization.custom.title,\n                  _ => e,\n                },\n              ),\n            )\n            .toList(),\n      );\n    },\n  );\n  if (res != null && context.mounted) {\n    if (res == '3') {\n      String param = '';\n      await showDialog(\n        context: context,\n        builder: (context) => AlertDialog(\n          title: const Text('自定义参数'),\n          content: Column(\n            mainAxisSize: MainAxisSize.min,\n            spacing: 16,\n            children: [\n              const Text('等同于 --lavfi-complex=\"[aid1] 参数 [ao]\"'),\n              TextField(\n                autofocus: true,\n                onChanged: (value) => param = value,\n              ),\n            ],\n          ),\n          actions: [\n            TextButton(\n              onPressed: Get.back,\n              child: Text(\n                '取消',\n                style: TextStyle(color: ColorScheme.of(context).outline),\n              ),\n            ),\n            TextButton(\n              onPressed: () {\n                Get.back();\n                GStorage.setting.put(key, param);\n                if (!fallback &&\n                    PlPlayerController.loudnormRegExp.hasMatch(param)) {\n                  audioNormalization(context, setState, fallback: true);\n                }\n                setState();\n              },\n              child: const Text('确定'),\n            ),\n          ],\n        ),\n      );\n    } else {\n      GStorage.setting.put(key, res);\n      if (res == '2') {\n        audioNormalization(context, setState, fallback: true);\n      }\n      setState();\n    }\n  }\n}\n\nvoid _showDownPathDialog(BuildContext context, VoidCallback setState) {\n  showDialog(\n    context: context,\n    builder: (context) => AlertDialog(\n      clipBehavior: Clip.hardEdge,\n      contentPadding: const EdgeInsets.symmetric(vertical: 12),\n      content: Column(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          ListTile(\n            onTap: () {\n              Get.back();\n              Utils.copyText(downloadPath);\n            },\n            dense: true,\n            title: const Text('复制', style: TextStyle(fontSize: 14)),\n          ),\n          ListTile(\n            onTap: () {\n              Get.back();\n              final defPath = defDownloadPath;\n              if (downloadPath == defPath) return;\n              downloadPath = defPath;\n              setState();\n              Get.find<DownloadService>().initDownloadList();\n              GStorage.setting.delete(SettingBoxKey.downloadPath);\n            },\n            dense: true,\n            title: const Text('重置', style: TextStyle(fontSize: 14)),\n          ),\n          ListTile(\n            onTap: () async {\n              Get.back();\n              final path = await FilePicker.getDirectoryPath();\n              if (path == null || path == downloadPath) return;\n              downloadPath = path;\n              setState();\n              Get.find<DownloadService>().initDownloadList();\n              GStorage.setting.put(SettingBoxKey.downloadPath, path);\n            },\n            dense: true,\n            title: const Text('设置新路径', style: TextStyle(fontSize: 14)),\n          ),\n        ],\n      ),\n    ),\n  );\n}\n\nvoid _showDynDialog(BuildContext context) {\n  String dynamicPeriod = Pref.dynamicPeriod.toString();\n  showDialog(\n    context: context,\n    builder: (context) => AlertDialog(\n      title: const Text('检查周期'),\n      content: TextFormField(\n        autofocus: true,\n        initialValue: dynamicPeriod,\n        keyboardType: TextInputType.number,\n        onChanged: (value) => dynamicPeriod = value,\n        inputFormatters: [FilteringTextInputFormatter.digitsOnly],\n        decoration: const InputDecoration(suffixText: 'min'),\n      ),\n      actions: [\n        TextButton(\n          onPressed: Get.back,\n          child: Text(\n            '取消',\n            style: TextStyle(color: ColorScheme.of(context).outline),\n          ),\n        ),\n        TextButton(\n          onPressed: () {\n            try {\n              final val = int.parse(dynamicPeriod);\n              Get.back();\n              GStorage.setting.put(SettingBoxKey.dynamicPeriod, val);\n              Get.find<MainController>().dynamicPeriod = val * 60 * 1000;\n            } catch (e) {\n              SmartDialog.showToast(e.toString());\n            }\n          },\n          child: const Text('确定'),\n        ),\n      ],\n    ),\n  );\n}\n\nvoid _showReplyLengthDialog(BuildContext context, VoidCallback setState) {\n  String replyLengthLimit = ReplyItemGrpc.replyLengthLimit.toString();\n  showDialog(\n    context: context,\n    builder: (context) => AlertDialog(\n      title: const Text('评论折叠行数'),\n      content: TextFormField(\n        autofocus: true,\n        initialValue: replyLengthLimit,\n        keyboardType: TextInputType.number,\n        onChanged: (value) => replyLengthLimit = value,\n        inputFormatters: [FilteringTextInputFormatter.digitsOnly],\n        decoration: const InputDecoration(suffixText: '行'),\n      ),\n      actions: [\n        TextButton(\n          onPressed: Get.back,\n          child: Text(\n            '取消',\n            style: TextStyle(color: ColorScheme.of(context).outline),\n          ),\n        ),\n        TextButton(\n          onPressed: () async {\n            try {\n              final val = int.parse(replyLengthLimit);\n              Get.back();\n              ReplyItemGrpc.replyLengthLimit = val == 0 ? null : val;\n              await GStorage.setting.put(SettingBoxKey.replyLengthLimit, val);\n              setState();\n            } catch (e) {\n              SmartDialog.showToast(e.toString());\n            }\n          },\n          child: const Text('确定'),\n        ),\n      ],\n    ),\n  );\n}\n\nvoid _showDmHeightDialog(BuildContext context, VoidCallback setState) {\n  String danmakuLineHeight = Pref.danmakuLineHeight.toString();\n  showDialog(\n    context: context,\n    builder: (context) => AlertDialog(\n      title: const Text('弹幕行高'),\n      content: TextFormField(\n        autofocus: true,\n        initialValue: danmakuLineHeight,\n        keyboardType: const .numberWithOptions(decimal: true),\n        onChanged: (value) => danmakuLineHeight = value,\n        inputFormatters: [\n          FilteringTextInputFormatter.allow(RegExp(r'[\\d\\.]+')),\n        ],\n      ),\n      actions: [\n        TextButton(\n          onPressed: Get.back,\n          child: Text(\n            '取消',\n            style: TextStyle(color: ColorScheme.of(context).outline),\n          ),\n        ),\n        TextButton(\n          onPressed: () async {\n            try {\n              final val = max(\n                1.0,\n                double.parse(danmakuLineHeight).toPrecision(1),\n              );\n              Get.back();\n              await GStorage.setting.put(SettingBoxKey.danmakuLineHeight, val);\n              setState();\n            } catch (e) {\n              SmartDialog.showToast(e.toString());\n            }\n          },\n          child: const Text('确定'),\n        ),\n      ],\n    ),\n  );\n}\n\nvoid _showTouchSlopDialog(BuildContext context, VoidCallback setState) {\n  String initialValue = Pref.touchSlopH.toString();\n  showDialog(\n    context: context,\n    builder: (context) => AlertDialog(\n      title: const Text('横向滑动阈值'),\n      content: TextFormField(\n        autofocus: true,\n        initialValue: initialValue,\n        keyboardType: const .numberWithOptions(decimal: true),\n        onChanged: (value) => initialValue = value,\n        inputFormatters: [\n          FilteringTextInputFormatter.allow(RegExp(r'[\\d\\.]+')),\n        ],\n      ),\n      actions: [\n        TextButton(\n          onPressed: Get.back,\n          child: Text(\n            '取消',\n            style: TextStyle(color: ColorScheme.of(context).outline),\n          ),\n        ),\n        TextButton(\n          onPressed: () async {\n            try {\n              final val = double.parse(initialValue);\n              Get.back();\n              touchSlopH = val;\n              await GStorage.setting.put(SettingBoxKey.touchSlopH, val);\n              setState();\n            } catch (e) {\n              SmartDialog.showToast(e.toString());\n            }\n          },\n          child: const Text('确定'),\n        ),\n      ],\n    ),\n  );\n}\n\nFuture<void> _showRefreshDragDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<double>(\n    context: context,\n    builder: (context) => SliderDialog(\n      title: '刷新滑动距离',\n      min: 0.1,\n      max: 0.5,\n      divisions: 8,\n      precise: 2,\n      value: Pref.refreshDragPercentage,\n      suffix: 'x',\n    ),\n  );\n  if (res != null) {\n    kDragContainerExtentPercentage = res;\n    await GStorage.setting.put(SettingBoxKey.refreshDragPercentage, res);\n    setState();\n  }\n}\n\nFuture<void> _showRefreshDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<double>(\n    context: context,\n    builder: (context) => SliderDialog(\n      title: '刷新指示器高度',\n      min: 10.0,\n      max: 100.0,\n      divisions: 9,\n      value: Pref.refreshDisplacement,\n    ),\n  );\n  if (res != null) {\n    displacement = res;\n    await GStorage.setting.put(SettingBoxKey.refreshDisplacement, res);\n    if (WidgetsBinding.instance.rootElement case final context?) {\n      context.visitChildElements(_visitor);\n    }\n    setState();\n  }\n}\n\nvoid _visitor(Element context) {\n  if (!context.mounted) return;\n  if (context.widget is RefreshIndicator) {\n    context.markNeedsBuild();\n  } else {\n    context.visitChildren(_visitor);\n  }\n}\n\nFuture<void> _showSuperResolutionDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<SuperResolutionType>(\n    context: context,\n    builder: (context) => SelectDialog<SuperResolutionType>(\n      title: '超分辨率',\n      value: Pref.superResolutionType,\n      values: SuperResolutionType.values.map((e) => (e, e.label)).toList(),\n    ),\n  );\n  if (res != null) {\n    await GStorage.setting.put(\n      SettingBoxKey.superResolutionType,\n      res.index,\n    );\n    setState();\n  }\n}\n\nFuture<void> _showFavDialog(BuildContext context) async {\n  if (Accounts.main.isLogin) {\n    final res = await FavHttp.allFavFolders(Accounts.main.mid);\n    if (res case Success(:final response)) {\n      final list = response.list;\n      if (list == null || list.isEmpty) {\n        return;\n      }\n      final quickFavId = Pref.quickFavId;\n      if (!context.mounted) return;\n      showDialog(\n        context: context,\n        builder: (context) => AlertDialog(\n          clipBehavior: Clip.hardEdge,\n          title: const Text('选择默认收藏夹'),\n          contentPadding: const EdgeInsets.only(top: 5, bottom: 18),\n          content: SingleChildScrollView(\n            child: RadioGroup(\n              onChanged: (value) {\n                Get.back();\n                GStorage.setting.put(SettingBoxKey.quickFavId, value);\n                SmartDialog.showToast('设置成功');\n              },\n              groupValue: quickFavId,\n              child: Column(\n                children: list\n                    .map(\n                      (item) => RadioListTile(\n                        toggleable: true,\n                        dense: true,\n                        title: Text(item.title),\n                        value: item.id,\n                      ),\n                    )\n                    .toList(),\n              ),\n            ),\n          ),\n        ),\n      );\n    } else {\n      res.toast();\n    }\n  }\n}\n\nFuture<void> _showReplyCountDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<double>(\n    context: context,\n    builder: (context) => SliderDialog(\n      title: '连接重试次数',\n      min: 0,\n      max: 8,\n      divisions: 8,\n      precise: 0,\n      value: Pref.retryCount.toDouble(),\n    ),\n  );\n  if (res != null) {\n    await GStorage.setting.put(SettingBoxKey.retryCount, res.toInt());\n    setState();\n    SmartDialog.showToast('重启生效');\n  }\n}\n\nFuture<void> _showReplyDelayDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<double>(\n    context: context,\n    builder: (context) => SliderDialog(\n      title: '连接重试间隔',\n      min: 0,\n      max: 1000,\n      divisions: 10,\n      precise: 0,\n      value: Pref.retryDelay.toDouble(),\n      suffix: 'ms',\n    ),\n  );\n  if (res != null) {\n    await GStorage.setting.put(SettingBoxKey.retryDelay, res.toInt());\n    setState();\n    SmartDialog.showToast('重启生效');\n  }\n}\n\nFuture<void> _showReplySortDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<ReplySortType>(\n    context: context,\n    builder: (context) => SelectDialog<ReplySortType>(\n      title: '评论展示',\n      value: Pref.replySortType,\n      values: ReplySortType.values.take(2).map((e) => (e, e.title)).toList(),\n    ),\n  );\n  if (res != null) {\n    await GStorage.setting.put(SettingBoxKey.replySortType, res.index);\n    setState();\n  }\n}\n\nFuture<void> _showDefDynDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<DynamicsTabType>(\n    context: context,\n    builder: (context) => SelectDialog<DynamicsTabType>(\n      title: '动态展示',\n      value: Pref.defaultDynamicType,\n      values: DynamicsTabType.values.take(4).map((e) => (e, e.label)).toList(),\n    ),\n  );\n  if (res != null) {\n    await GStorage.setting.put(\n      SettingBoxKey.defaultDynamicType,\n      res.index,\n    );\n    setState();\n  }\n}\n\nFuture<void> _showMemberTabDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<MemberTabType>(\n    context: context,\n    builder: (context) => SelectDialog<MemberTabType>(\n      title: '用户页默认展示TAB',\n      value: Pref.memberTab,\n      values: MemberTabType.values.map((e) => (e, e.title)).toList(),\n    ),\n  );\n  if (res != null) {\n    await GStorage.setting.put(SettingBoxKey.memberTab, res.index);\n    setState();\n  }\n}\n\nvoid _showProxyDialog(BuildContext context) {\n  String systemProxyHost = Pref.systemProxyHost;\n  String systemProxyPort = Pref.systemProxyPort;\n\n  showDialog(\n    context: context,\n    builder: (context) => AlertDialog(\n      title: const Text('设置代理'),\n      content: Column(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          const SizedBox(height: 6),\n          TextFormField(\n            initialValue: systemProxyHost,\n            decoration: const InputDecoration(\n              isDense: true,\n              labelText: '请输入Host，使用 . 分割',\n              border: OutlineInputBorder(\n                borderRadius: BorderRadius.all(Radius.circular(6)),\n              ),\n            ),\n            onChanged: (e) => systemProxyHost = e,\n          ),\n          const SizedBox(height: 10),\n          TextFormField(\n            initialValue: systemProxyPort,\n            keyboardType: TextInputType.number,\n            decoration: const InputDecoration(\n              isDense: true,\n              labelText: '请输入Port',\n              border: OutlineInputBorder(\n                borderRadius: BorderRadius.all(Radius.circular(6)),\n              ),\n            ),\n            inputFormatters: [FilteringTextInputFormatter.digitsOnly],\n            onChanged: (e) => systemProxyPort = e,\n          ),\n        ],\n      ),\n      actions: [\n        TextButton(\n          onPressed: Get.back,\n          child: Text(\n            '取消',\n            style: TextStyle(color: ColorScheme.of(context).outline),\n          ),\n        ),\n        TextButton(\n          onPressed: () {\n            Get.back();\n            GStorage.setting.put(\n              SettingBoxKey.systemProxyHost,\n              systemProxyHost,\n            );\n            GStorage.setting.put(\n              SettingBoxKey.systemProxyPort,\n              systemProxyPort,\n            );\n          },\n          child: const Text('确认'),\n        ),\n      ],\n    ),\n  );\n}\n\nvoid _showCacheDialog(BuildContext context, VoidCallback setState) {\n  String valueStr = '';\n  showDialog(\n    context: context,\n    builder: (context) => AlertDialog(\n      title: const Text('最大缓存大小'),\n      content: TextField(\n        autofocus: true,\n        onChanged: (value) => valueStr = value,\n        keyboardType: TextInputType.number,\n        inputFormatters: [\n          FilteringTextInputFormatter.allow(RegExp(r'[\\d\\.]+')),\n        ],\n        decoration: const InputDecoration(suffixText: 'MB'),\n      ),\n      actions: [\n        TextButton(\n          onPressed: Get.back,\n          child: Text(\n            '取消',\n            style: TextStyle(color: ColorScheme.of(context).outline),\n          ),\n        ),\n        TextButton(\n          onPressed: () async {\n            try {\n              final val = num.parse(valueStr);\n              Get.back();\n              await GStorage.setting.put(\n                SettingBoxKey.maxCacheSize,\n                val * 1024 * 1024,\n              );\n              setState();\n            } catch (e) {\n              SmartDialog.showToast(e.toString());\n            }\n          },\n          child: const Text('确定'),\n        ),\n      ],\n    ),\n  );\n}\n"
  },
  {
    "path": "lib/pages/setting/models/model.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/models/common/enum_with_label.dart';\nimport 'package:PiliPlus/pages/setting/widgets/normal_item.dart';\nimport 'package:PiliPlus/pages/setting/widgets/popup_item.dart';\nimport 'package:PiliPlus/pages/setting/widgets/select_dialog.dart';\nimport 'package:PiliPlus/pages/setting/widgets/switch_item.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:flutter/material.dart' hide PopupMenuItemSelected;\nimport 'package:flutter/services.dart' show FilteringTextInputFormatter;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\n@immutable\nsealed class SettingsModel {\n  final String? subtitle;\n  final Widget? leading;\n  final EdgeInsetsGeometry? contentPadding;\n  final TextStyle? titleStyle;\n\n  String? get title;\n  Widget get widget;\n  String get effectiveTitle;\n  String? get effectiveSubtitle;\n\n  const SettingsModel({\n    this.subtitle,\n    this.leading,\n    this.contentPadding,\n    this.titleStyle,\n  });\n}\n\nclass PopupModel<T extends EnumWithLabel> extends SettingsModel {\n  const PopupModel({\n    required this.title,\n    super.leading,\n    super.contentPadding,\n    super.titleStyle,\n    required this.value,\n    required this.items,\n    required this.onSelected,\n  });\n\n  @override\n  String? get effectiveSubtitle => null;\n\n  @override\n  String get effectiveTitle => title;\n\n  @override\n  final String title;\n\n  final ValueGetter<T> value;\n  final List<T> items;\n  final PopupMenuItemSelected<T> onSelected;\n\n  @override\n  Widget get widget => PopupListTile<T>(\n    safeArea: false,\n    leading: leading,\n    title: Text(title),\n    value: () {\n      final v = value();\n      return (v, v.label);\n    },\n    itemBuilder: (_) => enumItemBuilder(items),\n    onSelected: onSelected,\n  );\n}\n\nclass NormalModel extends SettingsModel {\n  @override\n  final String? title;\n  final ValueGetter<String>? getTitle;\n  final ValueGetter<String>? getSubtitle;\n  final Widget Function(ThemeData theme)? getTrailing;\n  final void Function(BuildContext context, VoidCallback setState)? onTap;\n\n  const NormalModel({\n    super.subtitle,\n    super.leading,\n    super.contentPadding,\n    super.titleStyle,\n    this.title,\n    this.getTitle,\n    this.getSubtitle,\n    this.getTrailing,\n    this.onTap,\n  }) : assert(title != null || getTitle != null);\n\n  @override\n  String get effectiveTitle => title ?? getTitle!();\n  @override\n  String? get effectiveSubtitle => subtitle ?? getSubtitle?.call();\n\n  @override\n  Widget get widget => NormalItem(\n    title: title,\n    getTitle: getTitle,\n    subtitle: subtitle,\n    getSubtitle: getSubtitle,\n    leading: leading,\n    getTrailing: getTrailing,\n    onTap: onTap,\n    contentPadding: contentPadding,\n    titleStyle: titleStyle,\n  );\n}\n\nclass SwitchModel extends SettingsModel {\n  @override\n  final String title;\n  final String setKey;\n  final bool defaultVal;\n  final ValueChanged<bool>? onChanged;\n  final bool needReboot;\n  final void Function(BuildContext context)? onTap;\n\n  const SwitchModel({\n    super.subtitle,\n    super.leading,\n    super.contentPadding,\n    super.titleStyle,\n    required this.title,\n    required this.setKey,\n    this.defaultVal = false,\n    this.onChanged,\n    this.needReboot = false,\n    this.onTap,\n  });\n\n  @override\n  String get effectiveTitle => title;\n  @override\n  String? get effectiveSubtitle => subtitle;\n\n  @override\n  Widget get widget => SetSwitchItem(\n    title: title,\n    subtitle: subtitle,\n    setKey: setKey,\n    defaultVal: defaultVal,\n    onChanged: onChanged,\n    needReboot: needReboot,\n    leading: leading,\n    onTap: onTap,\n    contentPadding: contentPadding,\n    titleStyle: titleStyle,\n  );\n}\n\nSettingsModel getBanWordModel({\n  required String title,\n  required String key,\n  required ValueChanged<RegExp> onChanged,\n}) {\n  String banWord = GStorage.setting.get(key, defaultValue: '');\n  return NormalModel(\n    leading: const Icon(Icons.filter_alt_outlined),\n    title: title,\n    getSubtitle: () => banWord.isEmpty ? \"点击添加\" : banWord,\n    onTap: (context, setState) {\n      String editValue = banWord;\n      showDialog(\n        context: context,\n        builder: (context) => AlertDialog(\n          constraints: StyleString.dialogFixedConstraints,\n          title: Text(title),\n          content: Column(\n            mainAxisSize: MainAxisSize.min,\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              const Text('使用|隔开，如：尝试|测试'),\n              TextFormField(\n                autofocus: true,\n                initialValue: editValue,\n                textInputAction: TextInputAction.newline,\n                minLines: 1,\n                maxLines: 4,\n                onChanged: (value) => editValue = value,\n              ),\n            ],\n          ),\n          actions: [\n            TextButton(\n              onPressed: Get.back,\n              child: Text(\n                '取消',\n                style: TextStyle(color: ColorScheme.of(context).outline),\n              ),\n            ),\n            TextButton(\n              child: const Text('保存'),\n              onPressed: () {\n                Get.back();\n                banWord = editValue;\n                setState();\n                onChanged(RegExp(banWord, caseSensitive: false));\n                SmartDialog.showToast('已保存');\n                GStorage.setting.put(key, banWord);\n              },\n            ),\n          ],\n        ),\n      );\n    },\n  );\n}\n\nSettingsModel getVideoFilterSelectModel({\n  required String title,\n  String? subtitle,\n  String? suffix,\n  required String key,\n  required List<int> values,\n  int defaultValue = 0,\n  bool isFilter = true,\n  ValueChanged<int>? onChanged,\n}) {\n  assert(!isFilter || onChanged != null);\n  int value = GStorage.setting.get(key, defaultValue: defaultValue);\n  return NormalModel(\n    title: '$title${isFilter ? '过滤' : ''}',\n    leading: const Icon(Icons.timelapse_outlined),\n    subtitle: subtitle,\n    getSubtitle: subtitle == null\n        ? () => isFilter\n              ? '过滤掉$title小于「$value${suffix ?? \"\"}」的视频'\n              : '当前$title:「$value${suffix ?? \"\"}」'\n        : null,\n    onTap: (context, setState) async {\n      var result = await showDialog<int>(\n        context: context,\n        builder: (context) => SelectDialog<int>(\n          title: '选择$title${isFilter ? '（0即不过滤）' : ''}',\n          value: value,\n          values:\n              (values\n                    ..addIf(!values.contains(value), value)\n                    ..sort())\n                  .map((e) => (e, suffix == null ? e.toString() : '$e $suffix'))\n                  .toList()\n                ..add((-1, '自定义')),\n        ),\n      );\n      if (result != null) {\n        if (result == -1 && context.mounted) {\n          String valueStr = '';\n          await showDialog(\n            context: context,\n            builder: (context) => AlertDialog(\n              title: Text('自定义$title'),\n              content: TextField(\n                autofocus: true,\n                onChanged: (value) => valueStr = value,\n                keyboardType: TextInputType.number,\n                inputFormatters: [FilteringTextInputFormatter.digitsOnly],\n                decoration: InputDecoration(suffixText: suffix),\n              ),\n              actions: [\n                TextButton(\n                  onPressed: Get.back,\n                  child: Text(\n                    '取消',\n                    style: TextStyle(color: ColorScheme.of(context).outline),\n                  ),\n                ),\n                TextButton(\n                  onPressed: () {\n                    try {\n                      result = int.parse(valueStr);\n                      Get.back();\n                    } catch (e) {\n                      SmartDialog.showToast(e.toString());\n                    }\n                  },\n                  child: const Text('确定'),\n                ),\n              ],\n            ),\n          );\n        }\n        if (result != -1) {\n          value = result!;\n          setState();\n          onChanged?.call(value);\n          GStorage.setting.put(key, value);\n        }\n      }\n    },\n  );\n}\n"
  },
  {
    "path": "lib/pages/setting/models/play_settings.dart",
    "content": "import 'dart:io';\n\nimport 'package:PiliPlus/common/widgets/custom_icon.dart';\nimport 'package:PiliPlus/models/common/super_chat_type.dart';\nimport 'package:PiliPlus/models/common/video/subtitle_pref_type.dart';\nimport 'package:PiliPlus/pages/main/controller.dart';\nimport 'package:PiliPlus/pages/setting/models/model.dart';\nimport 'package:PiliPlus/pages/setting/widgets/select_dialog.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/bottom_progress_behavior.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/fullscreen_mode.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/play_repeat.dart';\nimport 'package:PiliPlus/plugin/pl_player/utils/fullscreen.dart'\n    show allowRotateScreen;\nimport 'package:PiliPlus/services/service_locator.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\n\nList<SettingsModel> get playSettings => [\n  const SwitchModel(\n    title: '弹幕开关',\n    subtitle: '是否展示弹幕',\n    leading: Icon(CustomIcons.dm_settings),\n    setKey: SettingBoxKey.enableShowDanmaku,\n    defaultVal: true,\n  ),\n  if (PlatformUtils.isMobile)\n    const SwitchModel(\n      title: '启用点击弹幕',\n      subtitle: '点击弹幕悬停，支持点赞、复制、举报操作',\n      leading: Icon(Icons.touch_app_outlined),\n      setKey: SettingBoxKey.enableTapDm,\n      defaultVal: true,\n    ),\n  NormalModel(\n    onTap: (context, setState) => Get.toNamed('/playSpeedSet'),\n    leading: const Icon(Icons.speed_outlined),\n    title: '倍速设置',\n    subtitle: '设置视频播放速度',\n  ),\n  const SwitchModel(\n    title: '自动播放',\n    subtitle: '进入详情页自动播放',\n    leading: Icon(Icons.motion_photos_auto_outlined),\n    setKey: SettingBoxKey.autoPlayEnable,\n    defaultVal: false,\n  ),\n  const SwitchModel(\n    title: '全屏显示锁定按钮',\n    leading: Icon(Icons.lock_outline),\n    setKey: SettingBoxKey.showFsLockBtn,\n    defaultVal: true,\n  ),\n  const SwitchModel(\n    title: '全屏显示截图按钮',\n    leading: Icon(Icons.photo_camera_outlined),\n    setKey: SettingBoxKey.showFsScreenshotBtn,\n    defaultVal: true,\n  ),\n  SwitchModel(\n    title: '全屏显示电池电量',\n    leading: const Icon(Icons.battery_3_bar),\n    setKey: SettingBoxKey.showBatteryLevel,\n    defaultVal: PlatformUtils.isMobile,\n  ),\n  const SwitchModel(\n    title: '双击快退/快进',\n    subtitle: '左侧双击快退/右侧双击快进，关闭则双击均为暂停/播放',\n    leading: Icon(Icons.touch_app_outlined),\n    setKey: SettingBoxKey.enableQuickDouble,\n    defaultVal: true,\n  ),\n  const SwitchModel(\n    title: '左右侧滑动调节亮度/音量',\n    leading: Icon(MdiIcons.tuneVerticalVariant),\n    setKey: SettingBoxKey.enableSlideVolumeBrightness,\n    defaultVal: true,\n  ),\n  if (Platform.isAndroid)\n    const SwitchModel(\n      title: '调节系统亮度',\n      leading: Icon(Icons.brightness_6_outlined),\n      setKey: SettingBoxKey.setSystemBrightness,\n      defaultVal: false,\n    ),\n  const SwitchModel(\n    title: '中间滑动进入/退出全屏',\n    leading: Icon(MdiIcons.panVertical),\n    setKey: SettingBoxKey.enableSlideFS,\n    defaultVal: true,\n  ),\n  getVideoFilterSelectModel(\n    title: '双击快进/快退时长',\n    suffix: 's',\n    key: SettingBoxKey.fastForBackwardDuration,\n    values: [5, 10, 15],\n    defaultValue: 10,\n    isFilter: false,\n  ),\n  const SwitchModel(\n    title: '滑动快进/快退使用相对时长',\n    leading: Icon(Icons.swap_horiz_outlined),\n    setKey: SettingBoxKey.useRelativeSlide,\n    defaultVal: false,\n  ),\n  getVideoFilterSelectModel(\n    title: '滑动快进/快退时长',\n    subtitle: '从播放器一端滑到另一端的快进/快退时长',\n    suffix: Pref.useRelativeSlide ? '%' : 's',\n    key: SettingBoxKey.sliderDuration,\n    values: [25, 50, 90, 100],\n    defaultValue: 90,\n    isFilter: false,\n  ),\n  NormalModel(\n    title: '自动启用字幕',\n    leading: const Icon(Icons.closed_caption_outlined),\n    getSubtitle: () => '当前选择偏好：${Pref.subtitlePreferenceV2.desc}',\n    onTap: _showSubtitleDialog,\n  ),\n  if (PlatformUtils.isDesktop)\n    SwitchModel(\n      title: '最小化时暂停/还原时播放',\n      leading: const Icon(Icons.pause_circle_outline),\n      setKey: SettingBoxKey.pauseOnMinimize,\n      defaultVal: false,\n      onChanged: (value) {\n        try {\n          Get.find<MainController>().pauseOnMinimize = value;\n        } catch (_) {}\n      },\n    ),\n  const SwitchModel(\n    title: '启用键盘控制',\n    leading: Icon(Icons.keyboard_alt_outlined),\n    setKey: SettingBoxKey.keyboardControl,\n    defaultVal: true,\n  ),\n  NormalModel(\n    title: 'SuperChat (醒目留言) 显示类型',\n    leading: const Icon(Icons.live_tv),\n    getSubtitle: () => '当前:「${Pref.superChatType.title}」',\n    onTap: _showSuperChatDialog,\n  ),\n  const SwitchModel(\n    title: '竖屏扩大展示',\n    subtitle: '小屏竖屏视频宽高比由16:9扩大至1:1（不支持收起）；横屏适配时，扩大至9:16',\n    leading: Icon(Icons.expand_outlined),\n    setKey: SettingBoxKey.enableVerticalExpand,\n    defaultVal: false,\n  ),\n  const SwitchModel(\n    title: '自动全屏',\n    subtitle: '视频开始播放时进入全屏',\n    leading: Icon(Icons.fullscreen_outlined),\n    setKey: SettingBoxKey.enableAutoEnter,\n    defaultVal: false,\n  ),\n  const SwitchModel(\n    title: '自动退出全屏',\n    subtitle: '视频结束播放时退出全屏',\n    leading: Icon(Icons.fullscreen_exit_outlined),\n    setKey: SettingBoxKey.enableAutoExit,\n    defaultVal: true,\n  ),\n  const SwitchModel(\n    title: '延长播放控件显示时间',\n    subtitle: '开启后延长至30秒，便于屏幕阅读器滑动切换控件焦点',\n    leading: Icon(Icons.timer_outlined),\n    setKey: SettingBoxKey.enableLongShowControl,\n    defaultVal: false,\n  ),\n  SwitchModel(\n    title: '全向旋转',\n    subtitle: '小屏可受重力转为临时全屏，若系统锁定旋转仍触发请关闭，关闭会影响横屏适配',\n    leading: const Icon(Icons.screen_rotation_alt_outlined),\n    setKey: SettingBoxKey.allowRotateScreen,\n    defaultVal: true,\n    onChanged: (value) => allowRotateScreen = value,\n  ),\n  const SwitchModel(\n    title: '后台播放',\n    subtitle: '进入后台时继续播放',\n    leading: Icon(Icons.motion_photos_pause_outlined),\n    setKey: SettingBoxKey.continuePlayInBackground,\n    defaultVal: false,\n  ),\n  if (Platform.isAndroid) ...[\n    SwitchModel(\n      title: '后台画中画',\n      subtitle: '进入后台时以小窗形式（PiP）播放',\n      leading: const Icon(Icons.picture_in_picture_outlined),\n      setKey: SettingBoxKey.autoPiP,\n      defaultVal: false,\n      onChanged: (val) {\n        if (val && !videoPlayerServiceHandler!.enableBackgroundPlay) {\n          SmartDialog.showToast('建议开启后台音频服务');\n        }\n      },\n    ),\n    const SwitchModel(\n      title: '画中画不加载弹幕',\n      subtitle: '当弹幕开关开启时，小窗屏蔽弹幕以获得较好的体验',\n      leading: Icon(CustomIcons.dm_off),\n      setKey: SettingBoxKey.pipNoDanmaku,\n      defaultVal: false,\n    ),\n  ],\n  const SwitchModel(\n    title: '全屏手势反向',\n    subtitle: '默认播放器中部向上滑动进入全屏，向下退出\\n开启后向下全屏，向上退出',\n    leading: Icon(Icons.swap_vert),\n    setKey: SettingBoxKey.fullScreenGestureReverse,\n    defaultVal: false,\n  ),\n  const SwitchModel(\n    title: '全屏展示点赞/投币/收藏等操作按钮',\n    leading: Icon(MdiIcons.dotsHorizontalCircleOutline),\n    setKey: SettingBoxKey.showFSActionItem,\n    defaultVal: true,\n  ),\n  const SwitchModel(\n    title: '观看人数',\n    subtitle: '展示同时在看人数',\n    leading: Icon(Icons.people_outlined),\n    setKey: SettingBoxKey.enableOnlineTotal,\n    defaultVal: false,\n  ),\n  NormalModel(\n    title: '默认全屏方向',\n    leading: const Icon(Icons.open_with_outlined),\n    getSubtitle: () => '当前全屏方向：${Pref.fullScreenMode.desc}',\n    onTap: _showFullScreenModeDialog,\n  ),\n  NormalModel(\n    title: '底部进度条展示',\n    leading: const Icon(Icons.border_bottom_outlined),\n    getSubtitle: () => '当前展示方式：${Pref.btmProgressBehavior.desc}',\n    onTap: _showProgressBehaviorDialog,\n  ),\n  if (PlatformUtils.isMobile)\n    SwitchModel(\n      title: '后台音频服务',\n      subtitle: '避免画中画没有播放暂停功能',\n      leading: const Icon(Icons.volume_up_outlined),\n      setKey: SettingBoxKey.enableBackgroundPlay,\n      defaultVal: true,\n      onChanged: (value) =>\n          videoPlayerServiceHandler!.enableBackgroundPlay = value,\n    ),\n  PopupModel(\n    title: '播放顺序',\n    leading: const Icon(Icons.repeat),\n    value: () => Pref.playRepeat,\n    items: PlayRepeat.values,\n    onSelected: (value, setState) => GStorage.video\n        .put(VideoBoxKey.playRepeat, value.index)\n        .whenComplete(setState),\n  ),\n  const SwitchModel(\n    title: '播放器设置仅对当前生效',\n    subtitle: '弹幕、字幕及部分设置中没有的设置除外',\n    leading: Icon(Icons.video_settings_outlined),\n    setKey: SettingBoxKey.tempPlayerConf,\n    defaultVal: false,\n  ),\n];\n\nFuture<void> _showSubtitleDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<SubtitlePrefType>(\n    context: context,\n    builder: (context) => SelectDialog<SubtitlePrefType>(\n      title: '字幕选择偏好',\n      value: Pref.subtitlePreferenceV2,\n      values: SubtitlePrefType.values.map((e) => (e, e.desc)).toList(),\n    ),\n  );\n  if (res != null) {\n    await GStorage.setting.put(\n      SettingBoxKey.subtitlePreferenceV2,\n      res.index,\n    );\n    setState();\n  }\n}\n\nFuture<void> _showSuperChatDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<SuperChatType>(\n    context: context,\n    builder: (context) => SelectDialog<SuperChatType>(\n      title: 'SuperChat (醒目留言) 显示类型',\n      value: Pref.superChatType,\n      values: SuperChatType.values.map((e) => (e, e.title)).toList(),\n    ),\n  );\n  if (res != null) {\n    await GStorage.setting.put(SettingBoxKey.superChatType, res.index);\n    setState();\n  }\n}\n\nFuture<void> _showFullScreenModeDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<FullScreenMode>(\n    context: context,\n    builder: (context) => SelectDialog<FullScreenMode>(\n      title: '默认全屏方向',\n      value: Pref.fullScreenMode,\n      values: FullScreenMode.values.map((e) => (e, e.desc)).toList(),\n    ),\n  );\n  if (res != null) {\n    await GStorage.setting.put(SettingBoxKey.fullScreenMode, res.index);\n    setState();\n  }\n}\n\nFuture<void> _showProgressBehaviorDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<BtmProgressBehavior>(\n    context: context,\n    builder: (context) => SelectDialog<BtmProgressBehavior>(\n      title: '底部进度条展示',\n      value: Pref.btmProgressBehavior,\n      values: BtmProgressBehavior.values.map((e) => (e, e.desc)).toList(),\n    ),\n  );\n  if (res != null) {\n    await GStorage.setting.put(\n      SettingBoxKey.btmProgressBehavior,\n      res.index,\n    );\n    setState();\n  }\n}\n"
  },
  {
    "path": "lib/pages/setting/models/privacy_settings.dart",
    "content": "import 'package:PiliPlus/models/common/account_type.dart';\nimport 'package:PiliPlus/pages/mine/controller.dart';\nimport 'package:PiliPlus/pages/setting/models/model.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/accounts/api_type.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nList<SettingsModel> get privacySettings => [\n  NormalModel(\n    onTap: (context, setState) {\n      if (!Accounts.main.isLogin) {\n        SmartDialog.showToast('登录后查看');\n        return;\n      }\n      Get.toNamed('/blackListPage');\n    },\n    title: '黑名单管理',\n    subtitle: '已拉黑用户',\n    leading: const Icon(Icons.block),\n  ),\n  NormalModel(\n    onTap: (context, setState) {\n      MineController.onChangeAnonymity();\n      setState();\n    },\n    leading: const Icon(Icons.privacy_tip_outlined),\n    getTitle: () => MineController.anonymity.value ? '退出无痕模式' : '进入无痕模式',\n    getSubtitle: () => MineController.anonymity.value\n        ? '已进入无痕模式，搜索、观看视频/直播不携带Cookie与CSRF，其余操作不受影响'\n        : '未开启无痕模式，将使用账户信息提供完整服务',\n  ),\n  NormalModel(\n    onTap: (context, setState) {\n      showDialog(\n        context: context,\n        builder: (context) => AlertDialog(\n          title: const Text('账号模式详情'),\n          content: SingleChildScrollView(\n            child: _getAccountDetail(context),\n          ),\n          actions: [\n            TextButton(\n              onPressed: Get.back,\n              child: const Text('确认'),\n            ),\n          ],\n        ),\n      );\n    },\n    leading: const Icon(Icons.flag_outlined),\n    title: '了解账号模式',\n    subtitle: '查看各个账号模式作用的API列表',\n  ),\n];\n\nWidget _getAccountDetail(BuildContext context) {\n  final slivers = <Widget>[];\n  final theme = TextTheme.of(context);\n  for (final i in AccountType.values) {\n    final url = ApiType.apiTypeSet[i];\n    if (url == null) continue;\n\n    slivers\n      ..add(Center(child: Text(i.title, style: theme.titleMedium)))\n      ..add(SelectableText(url.join('\\n')));\n  }\n  return Column(\n    mainAxisSize: MainAxisSize.min,\n    crossAxisAlignment: CrossAxisAlignment.start,\n    spacing: 8,\n    children: slivers,\n  );\n}\n"
  },
  {
    "path": "lib/pages/setting/models/recommend_settings.dart",
    "content": "import 'package:PiliPlus/http/video.dart';\nimport 'package:PiliPlus/pages/rcmd/controller.dart';\nimport 'package:PiliPlus/pages/setting/models/model.dart';\nimport 'package:PiliPlus/utils/recommend_filter.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nList<SettingsModel> get recommendSettings => [\n  const SwitchModel(\n    title: '首页使用app端推荐',\n    subtitle: '若web端推荐不太符合预期，可尝试切换至app端推荐',\n    leading: Icon(Icons.model_training_outlined),\n    setKey: SettingBoxKey.appRcmd,\n    defaultVal: true,\n    needReboot: true,\n  ),\n  SwitchModel(\n    title: '保留首页推荐刷新',\n    subtitle: '下拉刷新时保留上次内容',\n    leading: const Icon(Icons.refresh),\n    setKey: SettingBoxKey.enableSaveLastData,\n    defaultVal: true,\n    onChanged: (value) {\n      try {\n        Get.find<RcmdController>()\n          ..enableSaveLastData = value\n          ..lastRefreshAt = null;\n      } catch (e) {\n        if (kDebugMode) debugPrint('$e');\n      }\n    },\n  ),\n  SwitchModel(\n    title: '显示上次看到位置提示',\n    subtitle: '保留上次推荐时，在上次刷新位置显示提示',\n    leading: const Icon(Icons.tips_and_updates_outlined),\n    setKey: SettingBoxKey.savedRcmdTip,\n    defaultVal: true,\n    onChanged: (value) {\n      try {\n        Get.find<RcmdController>()\n          ..savedRcmdTip = value\n          ..lastRefreshAt = null;\n      } catch (e) {\n        if (kDebugMode) debugPrint('$e');\n      }\n    },\n  ),\n  getVideoFilterSelectModel(\n    title: '点赞率',\n    suffix: '%',\n    key: SettingBoxKey.minLikeRatioForRecommend,\n    values: [0, 1, 2, 3, 4],\n    onChanged: (value) => RecommendFilter.minLikeRatioForRecommend = value,\n  ),\n  getBanWordModel(\n    title: '标题关键词过滤',\n    key: SettingBoxKey.banWordForRecommend,\n    onChanged: (value) {\n      RecommendFilter.rcmdRegExp = value;\n      RecommendFilter.enableFilter = value.pattern.isNotEmpty;\n    },\n  ),\n  getBanWordModel(\n    title: 'App推荐/热门/排行榜: 视频分区关键词过滤',\n    key: SettingBoxKey.banWordForZone,\n    onChanged: (value) {\n      VideoHttp.zoneRegExp = value;\n      VideoHttp.enableFilter = value.pattern.isNotEmpty;\n    },\n  ),\n  getVideoFilterSelectModel(\n    title: '视频时长',\n    suffix: 's',\n    key: SettingBoxKey.minDurationForRcmd,\n    values: [0, 30, 60, 90, 120],\n    onChanged: (value) => RecommendFilter.minDurationForRcmd = value,\n  ),\n  getVideoFilterSelectModel(\n    title: '播放量',\n    key: SettingBoxKey.minPlayForRcmd,\n    values: [0, 50, 100, 500, 1000],\n    onChanged: (value) => RecommendFilter.minPlayForRcmd = value,\n  ),\n  SwitchModel(\n    title: '已关注UP豁免推荐过滤',\n    subtitle: '推荐中已关注用户发布的内容不会被过滤',\n    leading: const Icon(Icons.favorite_border_outlined),\n    setKey: SettingBoxKey.exemptFilterForFollowed,\n    defaultVal: true,\n    onChanged: (value) => RecommendFilter.exemptFilterForFollowed = value,\n  ),\n  SwitchModel(\n    title: '过滤器也应用于相关视频',\n    subtitle: '视频详情页的相关视频也进行过滤¹',\n    leading: const Icon(Icons.explore_outlined),\n    setKey: SettingBoxKey.applyFilterToRelatedVideos,\n    defaultVal: true,\n    onChanged: (value) => RecommendFilter.applyFilterToRelatedVideos = value,\n  ),\n];\n"
  },
  {
    "path": "lib/pages/setting/models/style_settings.dart",
    "content": "import 'dart:io';\nimport 'dart:math' as math;\n\nimport 'package:PiliPlus/common/widgets/color_palette.dart';\nimport 'package:PiliPlus/common/widgets/custom_toast.dart';\nimport 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/scale_app.dart';\nimport 'package:PiliPlus/common/widgets/stateful_builder.dart';\nimport 'package:PiliPlus/main.dart';\nimport 'package:PiliPlus/models/common/bar_hide_type.dart';\nimport 'package:PiliPlus/models/common/dynamic/dynamic_badge_mode.dart';\nimport 'package:PiliPlus/models/common/dynamic/up_panel_position.dart';\nimport 'package:PiliPlus/models/common/home_tab_type.dart';\nimport 'package:PiliPlus/models/common/msg/msg_unread_type.dart';\nimport 'package:PiliPlus/models/common/nav_bar_config.dart';\nimport 'package:PiliPlus/models/common/theme/theme_color_type.dart';\nimport 'package:PiliPlus/models/common/theme/theme_type.dart';\nimport 'package:PiliPlus/pages/main/controller.dart';\nimport 'package:PiliPlus/pages/mine/controller.dart';\nimport 'package:PiliPlus/pages/setting/models/model.dart';\nimport 'package:PiliPlus/pages/setting/slide_color_picker.dart';\nimport 'package:PiliPlus/pages/setting/widgets/dual_slider_dialog.dart';\nimport 'package:PiliPlus/pages/setting/widgets/multi_select_dialog.dart';\nimport 'package:PiliPlus/pages/setting/widgets/select_dialog.dart';\nimport 'package:PiliPlus/pages/setting/widgets/slider_dialog.dart';\nimport 'package:PiliPlus/plugin/pl_player/utils/fullscreen.dart';\nimport 'package:PiliPlus/utils/extension/file_ext.dart';\nimport 'package:PiliPlus/utils/extension/get_ext.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/global_data.dart';\nimport 'package:PiliPlus/utils/path_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:auto_orientation/auto_orientation.dart';\nimport 'package:flutter/material.dart' hide StatefulBuilder;\nimport 'package:flutter/services.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\nimport 'package:path/path.dart' as path;\n\nList<SettingsModel> get styleSettings => [\n  if (PlatformUtils.isDesktop) ...[\n    const SwitchModel(\n      title: '显示窗口标题栏',\n      leading: Icon(Icons.window),\n      setKey: SettingBoxKey.showWindowTitleBar,\n      defaultVal: true,\n      needReboot: true,\n    ),\n    const SwitchModel(\n      title: '显示托盘图标',\n      leading: Icon(Icons.donut_large_rounded),\n      setKey: SettingBoxKey.showTrayIcon,\n      defaultVal: true,\n      needReboot: true,\n    ),\n  ],\n  if (Platform.isLinux) _useSSDModel(),\n  SwitchModel(\n    title: '横屏适配',\n    subtitle: '启用横屏布局与逻辑，平板、折叠屏等可开启；建议全屏方向设为【不改变当前方向】',\n    leading: const Icon(Icons.phonelink_outlined),\n    setKey: SettingBoxKey.horizontalScreen,\n    defaultVal: Pref.horizontalScreen,\n    onChanged: (value) {\n      if (value) {\n        autoScreen();\n      } else {\n        AutoOrientation.portraitUpMode();\n      }\n    },\n  ),\n  const SwitchModel(\n    title: '改用侧边栏',\n    subtitle: '开启后底栏与顶栏被替换，且相关设置失效',\n    leading: Icon(Icons.chrome_reader_mode_outlined),\n    setKey: SettingBoxKey.useSideBar,\n    defaultVal: false,\n    needReboot: true,\n  ),\n  SwitchModel(\n    title: 'App字体字重',\n    subtitle: '点击设置',\n    setKey: SettingBoxKey.appFontWeight,\n    defaultVal: false,\n    leading: const Icon(Icons.text_fields),\n    onChanged: (_) => Get.updateMyAppTheme(),\n    onTap: _showFontWeightDialog,\n  ),\n  NormalModel(\n    title: '界面缩放',\n    getSubtitle: () => '当前缩放比例：${Pref.uiScale.toStringAsFixed(2)}',\n    leading: const Icon(Icons.zoom_in_outlined),\n    onTap: _showUiScaleDialog,\n  ),\n  NormalModel(\n    title: '页面过渡动画',\n    leading: const Icon(Icons.animation),\n    getSubtitle: () => '当前：${Pref.pageTransition.name}',\n    onTap: _showTransitionDialog,\n  ),\n  const SwitchModel(\n    title: '优化平板导航栏',\n    leading: Icon(MdiIcons.soundbar),\n    setKey: SettingBoxKey.optTabletNav,\n    defaultVal: true,\n    needReboot: true,\n  ),\n  const SwitchModel(\n    title: 'MD3样式底栏',\n    subtitle: 'Material You设计规范底栏，关闭可变窄',\n    leading: Icon(Icons.design_services_outlined),\n    setKey: SettingBoxKey.enableMYBar,\n    defaultVal: true,\n    needReboot: true,\n  ),\n  NormalModel(\n    leading: const Icon(Icons.calendar_view_week_outlined),\n    title: '列表宽度（dp）限制',\n    getSubtitle: () =>\n        '当前: 主页${Pref.recommendCardWidth.toInt()}dp 其他${Pref.smallCardWidth.toInt()}dp，屏幕宽度:${MediaQuery.widthOf(Get.context!).toPrecision(2)}dp。宽度越小列数越多。',\n    onTap: _showCardWidthDialog,\n  ),\n  SwitchModel(\n    title: '视频播放页使用深色主题',\n    leading: const Icon(Icons.dark_mode_outlined),\n    setKey: SettingBoxKey.darkVideoPage,\n    defaultVal: false,\n    onChanged: (value) {\n      if (value && MyApp.darkThemeData == null) {\n        Get.updateMyAppTheme();\n      }\n    },\n  ),\n  const SwitchModel(\n    title: '动态页启用瀑布流',\n    subtitle: '关闭会显示为单列',\n    leading: Icon(Icons.view_array_outlined),\n    setKey: SettingBoxKey.dynamicsWaterfallFlow,\n    defaultVal: true,\n    needReboot: true,\n  ),\n  NormalModel(\n    title: '动态页UP主显示位置',\n    leading: const Icon(Icons.person_outlined),\n    getSubtitle: () => '当前：${Pref.upPanelPosition.label}',\n    onTap: _showUpPosDialog,\n  ),\n  const SwitchModel(\n    title: '动态页显示所有已关注UP主',\n    leading: Icon(Icons.people_alt_outlined),\n    setKey: SettingBoxKey.dynamicsShowAllFollowedUp,\n    defaultVal: false,\n    needReboot: true,\n  ),\n  const SwitchModel(\n    title: '动态页展开正在直播UP列表',\n    leading: Icon(Icons.live_tv),\n    setKey: SettingBoxKey.expandDynLivePanel,\n    defaultVal: false,\n    needReboot: true,\n  ),\n  NormalModel(\n    title: '动态未读标记',\n    leading: const Icon(Icons.motion_photos_on_outlined),\n    getSubtitle: () => '当前标记样式：${Pref.dynamicBadgeType.desc}',\n    onTap: _showDynBadgeDialog,\n  ),\n  NormalModel(\n    title: '消息未读标记',\n    leading: const Icon(MdiIcons.bellBadgeOutline),\n    getSubtitle: () => '当前标记样式：${Pref.msgBadgeMode.desc}',\n    onTap: _showMsgBadgeDialog,\n  ),\n  NormalModel(\n    onTap: _showMsgUnReadDialog,\n    title: '消息未读类型',\n    leading: const Icon(MdiIcons.bellCogOutline),\n    getSubtitle: () =>\n        '当前消息类型：${Pref.msgUnReadTypeV2.map((item) => item.title).join('、')}',\n  ),\n  NormalModel(\n    onTap: _showBarHideTypeDialog,\n    title: '顶/底栏收起类型',\n    leading: const Icon(MdiIcons.arrowExpandVertical),\n    getSubtitle: () => '当前：${Pref.barHideType.label}',\n  ),\n  SwitchModel(\n    title: '首页顶栏收起',\n    subtitle: '首页列表滑动时，收起顶栏',\n    leading: const Icon(Icons.vertical_align_top_outlined),\n    setKey: SettingBoxKey.hideTopBar,\n    defaultVal: PlatformUtils.isMobile,\n    needReboot: true,\n  ),\n  SwitchModel(\n    title: '首页底栏收起',\n    subtitle: '首页列表滑动时，收起底栏',\n    leading: const Icon(Icons.vertical_align_bottom_outlined),\n    setKey: SettingBoxKey.hideBottomBar,\n    defaultVal: PlatformUtils.isMobile,\n    needReboot: true,\n  ),\n  NormalModel(\n    onTap: (context, setState) => _showQualityDialog(\n      context: context,\n      title: '图片质量',\n      initValue: Pref.picQuality,\n      onChanged: (picQuality) async {\n        GlobalData().imgQuality = picQuality;\n        await GStorage.setting.put(SettingBoxKey.defaultPicQa, picQuality);\n        setState();\n      },\n    ),\n    title: '图片质量',\n    subtitle: '选择合适的图片清晰度，上限100%',\n    leading: const Icon(Icons.image_outlined),\n    getTrailing: (theme) => Text(\n      '${Pref.picQuality}%',\n      style: theme.textTheme.titleSmall,\n    ),\n  ),\n  NormalModel(\n    onTap: (context, setState) => _showQualityDialog(\n      context: context,\n      title: '查看大图质量',\n      initValue: Pref.previewQ,\n      onChanged: (picQuality) async {\n        await GStorage.setting.put(SettingBoxKey.previewQuality, picQuality);\n        setState();\n      },\n    ),\n    title: '查看大图质量',\n    subtitle: '选择合适的图片清晰度，上限100%',\n    leading: const Icon(Icons.image_outlined),\n    getTrailing: (theme) => Text(\n      '${Pref.previewQ}%',\n      style: theme.textTheme.titleSmall,\n    ),\n  ),\n  NormalModel(\n    onTap: _showReduceColorDialog,\n    title: '深色下图片颜色叠加',\n    subtitle: '显示颜色=图片原色x所选颜色，大图查看不受影响',\n    leading: const Icon(Icons.format_color_fill_outlined),\n    getTrailing: (theme) => Container(\n      width: 20,\n      height: 20,\n      decoration: BoxDecoration(\n        color: Pref.reduceLuxColor ?? Colors.white,\n        shape: BoxShape.circle,\n      ),\n    ),\n  ),\n  NormalModel(\n    leading: const Icon(Icons.opacity_outlined),\n    title: '气泡提示不透明度',\n    subtitle: '自定义气泡提示(Toast)不透明度',\n    getTrailing: (theme) => Text(\n      CustomToast.toastOpacity.toStringAsFixed(1),\n      style: theme.textTheme.titleSmall,\n    ),\n    onTap: _showToastDialog,\n  ),\n  NormalModel(\n    onTap: _showThemeTypeDialog,\n    leading: const Icon(Icons.flashlight_on_outlined),\n    title: '主题模式',\n    getSubtitle: () => '当前模式：${Pref.themeType.desc}',\n  ),\n  SwitchModel(\n    leading: const Icon(Icons.invert_colors),\n    title: '纯黑主题',\n    setKey: SettingBoxKey.isPureBlackTheme,\n    defaultVal: false,\n    onChanged: (value) {\n      if (Get.isDarkMode || Pref.darkVideoPage) {\n        Get.updateMyAppTheme();\n      }\n    },\n  ),\n  NormalModel(\n    onTap: (context, setState) => Get.toNamed('/colorSetting'),\n    leading: const Icon(Icons.color_lens_outlined),\n    title: '应用主题',\n    getSubtitle: () => '当前主题：${Pref.dynamicColor ? '动态取色' : '指定颜色'}',\n    getTrailing: (theme) => Pref.dynamicColor\n        ? Icon(Icons.color_lens_rounded, color: theme.colorScheme.primary)\n        : SizedBox.square(\n            dimension: 20,\n            child: ColorPalette(\n              colorScheme: colorThemeTypes[Pref.customColor].color\n                  .asColorSchemeSeed(Pref.schemeVariant, theme.brightness),\n              selected: false,\n              showBgColor: false,\n            ),\n          ),\n  ),\n  NormalModel(\n    leading: const Icon(Icons.home_outlined),\n    title: '默认启动页',\n    getSubtitle: () => '当前启动页：${Pref.defaultHomePage.label}',\n    onTap: _showDefHomeDialog,\n  ),\n  const NormalModel(\n    title: '滑动动画弹簧参数',\n    leading: Icon(Icons.chrome_reader_mode_outlined),\n    onTap: _showSpringDialog,\n  ),\n  NormalModel(\n    onTap: (context, setState) async {\n      final res = await Get.toNamed('/fontSizeSetting');\n      if (res != null) {\n        setState();\n      }\n    },\n    title: '字体大小',\n    leading: const Icon(Icons.format_size_outlined),\n    getSubtitle: () {\n      final scale = Pref.defaultTextScale;\n      return scale == 1.0 ? '默认' : scale.toString();\n    },\n  ),\n  NormalModel(\n    onTap: (context, setState) => Get.toNamed(\n      '/barSetting',\n      arguments: {\n        'key': SettingBoxKey.tabBarSort,\n        'defaultBars': HomeTabType.values,\n        'title': '首页标签页',\n      },\n    ),\n    title: '首页标签页',\n    subtitle: '删除或调换首页标签页',\n    leading: const Icon(Icons.toc_outlined),\n  ),\n  NormalModel(\n    onTap: (context, setState) => Get.toNamed(\n      '/barSetting',\n      arguments: {\n        'key': SettingBoxKey.navBarSort,\n        'defaultBars': NavigationBarType.values,\n        'title': 'Navbar',\n      },\n    ),\n    title: 'Navbar编辑',\n    subtitle: '删除或调换Navbar',\n    leading: const Icon(Icons.toc_outlined),\n  ),\n  SwitchModel(\n    title: '返回时直接退出',\n    subtitle: '开启后在主页任意tab按返回键都直接退出，关闭则先回到Navbar的第一个tab',\n    leading: const Icon(Icons.exit_to_app_outlined),\n    setKey: SettingBoxKey.directExitOnBack,\n    defaultVal: false,\n    onChanged: (value) => Get.find<MainController>().directExitOnBack = value,\n  ),\n  if (Platform.isAndroid)\n    NormalModel(\n      onTap: (context, setState) => Get.toNamed('/displayModeSetting'),\n      title: '屏幕帧率',\n      leading: const Icon(Icons.autofps_select_outlined),\n    ),\n];\n\nvoid _showQualityDialog({\n  required BuildContext context,\n  required String title,\n  required int initValue,\n  required ValueChanged<int> onChanged,\n}) {\n  showDialog<double>(\n    context: context,\n    builder: (context) => SliderDialog(\n      value: initValue.toDouble(),\n      title: title,\n      min: 10,\n      max: 100,\n      divisions: 9,\n      suffix: '%',\n      precise: 0,\n    ),\n  ).then((result) {\n    if (result != null) {\n      SmartDialog.showToast('设置成功');\n      onChanged(result.toInt());\n    }\n  });\n}\n\nvoid _showUiScaleDialog(\n  BuildContext context,\n  VoidCallback setState,\n) {\n  const minUiScale = 0.5;\n  const maxUiScale = 2.0;\n\n  double uiScale = Pref.uiScale;\n  final textController = TextEditingController(\n    text: uiScale.toStringAsFixed(2),\n  );\n\n  showDialog(\n    context: context,\n    builder: (context) => AlertDialog(\n      title: const Text('界面缩放'),\n      contentPadding: const EdgeInsets.fromLTRB(24, 20, 24, 12),\n      content: StatefulBuilder(\n        onDispose: textController.dispose,\n        builder: (context, setDialogState) => Column(\n          spacing: 20,\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            Slider(\n              padding: .zero,\n              value: uiScale,\n              min: minUiScale,\n              max: maxUiScale,\n              secondaryTrackValue: 1.0,\n              divisions: ((maxUiScale - minUiScale) * 20).toInt(),\n              label: textController.text,\n              onChanged: (value) => setDialogState(() {\n                uiScale = value.toPrecision(2);\n                textController.text = uiScale.toStringAsFixed(2);\n              }),\n            ),\n            TextFormField(\n              controller: textController,\n              keyboardType: const TextInputType.numberWithOptions(\n                decimal: true,\n              ),\n              inputFormatters: [\n                LengthLimitingTextInputFormatter(4),\n                FilteringTextInputFormatter.allow(RegExp(r'[\\d.]+')),\n              ],\n              decoration: const InputDecoration(\n                labelText: '缩放比例',\n                hintText: '0.50 - 2.00',\n                border: OutlineInputBorder(),\n              ),\n              onChanged: (value) {\n                final parsed = double.tryParse(value);\n                if (parsed != null &&\n                    parsed >= minUiScale &&\n                    parsed <= maxUiScale) {\n                  setDialogState(() {\n                    uiScale = parsed;\n                  });\n                }\n              },\n            ),\n          ],\n        ),\n      ),\n      actions: [\n        TextButton(\n          onPressed: () {\n            Navigator.pop(context);\n            GStorage.setting.delete(SettingBoxKey.uiScale).whenComplete(() {\n              setState();\n              Get.appUpdate();\n              ScaledWidgetsFlutterBinding.instance.scaleFactor = 1.0;\n            });\n          },\n          child: const Text('重置'),\n        ),\n        TextButton(\n          onPressed: () => Navigator.pop(context),\n          child: Text(\n            '取消',\n            style: TextStyle(color: ColorScheme.of(context).outline),\n          ),\n        ),\n        TextButton(\n          onPressed: () {\n            Navigator.pop(context);\n            GStorage.setting.put(SettingBoxKey.uiScale, uiScale).whenComplete(\n              () {\n                setState();\n                Get.appUpdate();\n                ScaledWidgetsFlutterBinding.instance.scaleFactor = uiScale;\n              },\n            );\n          },\n          child: const Text('确定'),\n        ),\n      ],\n    ),\n  );\n}\n\nvoid _showSpringDialog(BuildContext context, _) {\n  final List<String> springDescription = Pref.springDescription\n      .map((i) => i.toString())\n      .toList(growable: false);\n  bool physicalMode = true;\n\n  void physical2Duration() {\n    final mass = double.parse(springDescription[0]);\n    final stiffness = double.parse(springDescription[1]);\n    final damping = double.parse(springDescription[2]);\n\n    final duration = math.sqrt(4 * math.pi * math.pi * mass / stiffness);\n    final dampingRatio = damping / (2.0 * math.sqrt(mass * stiffness));\n    final bounce = dampingRatio < 1.0\n        ? 1.0 - dampingRatio\n        : 1.0 / dampingRatio - 1;\n\n    springDescription[0] = duration.toString();\n    springDescription[1] = bounce.toString();\n  }\n\n  /// from [SpringDescription.withDurationAndBounce] but with higher precision\n  void duration2Physical() {\n    final duration = double.parse(springDescription[0]);\n    final bounce = double.parse(springDescription[1]).clamp(-1.0, 1.0);\n\n    final stiffness = 4 * math.pi * math.pi / math.pow(duration, 2);\n    final dampingRatio = bounce > 0 ? 1.0 - bounce : 1.0 / (bounce + 1);\n    final damping = 2 * math.sqrt(stiffness) * dampingRatio;\n\n    springDescription[0] = '1';\n    springDescription[1] = stiffness.toString();\n    springDescription[2] = damping.toString();\n  }\n\n  showDialog(\n    context: context,\n    builder: (context) => AlertDialog(\n      title: Row(\n        mainAxisAlignment: .spaceBetween,\n        children: [\n          const Text('弹簧参数'),\n          TextButton(\n            style: TextButton.styleFrom(\n              visualDensity: .compact,\n              tapTargetSize: .shrinkWrap,\n            ),\n            onPressed: () {\n              try {\n                if (physicalMode) {\n                  physical2Duration();\n                } else {\n                  duration2Physical();\n                }\n                physicalMode = !physicalMode;\n                (context as Element).markNeedsBuild();\n              } catch (e) {\n                SmartDialog.showToast(e.toString());\n              }\n            },\n            child: Text(physicalMode ? '滑动时间' : '物理参数'),\n          ),\n        ],\n      ),\n      content: Column(\n        key: ValueKey(physicalMode),\n        mainAxisSize: .min,\n        children: List.generate(\n          physicalMode ? 3 : 2,\n          (index) => TextFormField(\n            autofocus: index == 0,\n            initialValue: springDescription[index],\n            keyboardType: .numberWithOptions(\n              signed: !physicalMode && index == 1,\n              decimal: true,\n            ),\n            onChanged: (value) => springDescription[index] = value,\n            inputFormatters: [\n              !physicalMode && index == 1\n                  ? FilteringTextInputFormatter.allow(RegExp(r'[-\\d\\.]+'))\n                  : FilteringTextInputFormatter.allow(RegExp(r'[\\d\\.]+')),\n            ],\n            decoration: InputDecoration(\n              labelText: (physicalMode\n                  ? const ['mass', 'stiffness', 'damping']\n                  : const ['duration', 'bounce'])[index],\n              suffixText: !physicalMode && index == 0 ? 's' : null,\n            ),\n          ),\n        ),\n      ),\n      actions: [\n        TextButton(\n          onPressed: () {\n            Get.back();\n            GStorage.setting.delete(SettingBoxKey.springDescription);\n            SmartDialog.showToast('重置成功，重启生效');\n          },\n          child: const Text('重置'),\n        ),\n        TextButton(\n          onPressed: Get.back,\n          child: Text(\n            '取消',\n            style: TextStyle(color: ColorScheme.of(context).outline),\n          ),\n        ),\n        TextButton(\n          onPressed: () {\n            try {\n              if (!physicalMode) {\n                duration2Physical();\n              }\n              final res = springDescription.map(double.parse).toList();\n              Get.back();\n              GStorage.setting.put(SettingBoxKey.springDescription, res);\n              SmartDialog.showToast('设置成功，重启生效');\n            } catch (e) {\n              SmartDialog.showToast(e.toString());\n            }\n          },\n          child: const Text('确定'),\n        ),\n      ],\n    ),\n  );\n}\n\nFuture<void> _showFontWeightDialog(BuildContext context) async {\n  final res = await showDialog<double>(\n    context: context,\n    builder: (context) => SliderDialog(\n      title: 'App字体字重',\n      value: Pref.appFontWeight.toDouble() + 1,\n      min: 1,\n      max: FontWeight.values.length.toDouble(),\n      divisions: FontWeight.values.length - 1,\n    ),\n  );\n  if (res != null) {\n    await GStorage.setting.put(SettingBoxKey.appFontWeight, res.toInt() - 1);\n    Get.updateMyAppTheme();\n  }\n}\n\nFuture<void> _showTransitionDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<Transition>(\n    context: context,\n    builder: (context) => SelectDialog<Transition>(\n      title: '页面过渡动画',\n      value: Pref.pageTransition,\n      values: Transition.values.map((e) => (e, e.name)).toList(),\n    ),\n  );\n  if (res != null) {\n    await GStorage.setting.put(SettingBoxKey.pageTransition, res.index);\n    SmartDialog.showToast('重启生效');\n    setState();\n  }\n}\n\nFuture<void> _showCardWidthDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<(double, double)>(\n    context: context,\n    builder: (context) => DualSliderDialog(\n      title: '列表最大列宽度（默认240dp）',\n      value1: Pref.recommendCardWidth,\n      value2: Pref.smallCardWidth,\n      description1: '主页推荐流',\n      description2: '其他',\n      min: 150.0,\n      max: 500.0,\n      divisions: 35,\n      suffix: 'dp',\n    ),\n  );\n  if (res != null) {\n    await GStorage.setting.putAll({\n      SettingBoxKey.recommendCardWidth: res.$1,\n      SettingBoxKey.smallCardWidth: res.$2,\n    });\n    SmartDialog.showToast('重启生效');\n    setState();\n  }\n}\n\nFuture<void> _showUpPosDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<UpPanelPosition>(\n    context: context,\n    builder: (context) => SelectDialog<UpPanelPosition>(\n      title: '动态页UP主显示位置',\n      value: Pref.upPanelPosition,\n      values: UpPanelPosition.values.map((e) => (e, e.label)).toList(),\n    ),\n  );\n  if (res != null) {\n    await GStorage.setting.put(SettingBoxKey.upPanelPosition, res.index);\n    SmartDialog.showToast('重启生效');\n    setState();\n  }\n}\n\nFuture<void> _showDynBadgeDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<DynamicBadgeMode>(\n    context: context,\n    builder: (context) => SelectDialog<DynamicBadgeMode>(\n      title: '动态未读标记',\n      value: Pref.dynamicBadgeType,\n      values: DynamicBadgeMode.values.map((e) => (e, e.desc)).toList(),\n    ),\n  );\n  if (res != null) {\n    final mainController = Get.find<MainController>()\n      ..dynamicBadgeMode = DynamicBadgeMode.values[res.index];\n    if (mainController.dynamicBadgeMode != DynamicBadgeMode.hidden) {\n      mainController.getUnreadDynamic();\n    }\n    await GStorage.setting.put(\n      SettingBoxKey.dynamicBadgeMode,\n      res.index,\n    );\n    SmartDialog.showToast('设置成功');\n    setState();\n  }\n}\n\nFuture<void> _showMsgBadgeDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<DynamicBadgeMode>(\n    context: context,\n    builder: (context) => SelectDialog<DynamicBadgeMode>(\n      title: '消息未读标记',\n      value: Pref.msgBadgeMode,\n      values: DynamicBadgeMode.values.map((e) => (e, e.desc)).toList(),\n    ),\n  );\n  if (res != null) {\n    final mainController = Get.find<MainController>()\n      ..msgBadgeMode = DynamicBadgeMode.values[res.index];\n    if (mainController.msgBadgeMode != DynamicBadgeMode.hidden) {\n      mainController.queryUnreadMsg(true);\n    } else {\n      mainController.msgUnReadCount.value = '';\n    }\n    await GStorage.setting.put(SettingBoxKey.msgBadgeMode, res.index);\n    SmartDialog.showToast('设置成功');\n    setState();\n  }\n}\n\nFuture<void> _showMsgUnReadDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<Set<MsgUnReadType>>(\n    context: context,\n    builder: (context) => MultiSelectDialog<MsgUnReadType>(\n      title: '消息未读类型',\n      initValues: Pref.msgUnReadTypeV2,\n      values: {for (final i in MsgUnReadType.values) i: i.title},\n    ),\n  );\n  if (res != null) {\n    final mainController = Get.find<MainController>()..msgUnReadTypes = res;\n    if (mainController.msgBadgeMode != DynamicBadgeMode.hidden) {\n      mainController.queryUnreadMsg();\n    }\n    await GStorage.setting.put(\n      SettingBoxKey.msgUnReadTypeV2,\n      res.map((item) => item.index).toList()..sort(),\n    );\n    SmartDialog.showToast('设置成功');\n    setState();\n  }\n}\n\nvoid _showReduceColorDialog(\n  BuildContext context,\n  VoidCallback setState,\n) {\n  final reduceLuxColor = Pref.reduceLuxColor;\n  showDialog(\n    context: context,\n    builder: (context) => AlertDialog(\n      clipBehavior: Clip.hardEdge,\n      contentPadding: const EdgeInsets.symmetric(vertical: 16),\n      title: const Text('Color Picker'),\n      content: SlideColorPicker(\n        color: reduceLuxColor ?? Colors.white,\n        onChanged: (Color? color) {\n          if (color != null && color != reduceLuxColor) {\n            if (color == Colors.white) {\n              NetworkImgLayer.reduceLuxColor = null;\n              GStorage.setting.delete(SettingBoxKey.reduceLuxColor);\n              SmartDialog.showToast('设置成功');\n              setState();\n            } else {\n              void onConfirm() {\n                NetworkImgLayer.reduceLuxColor = color;\n                GStorage.setting.put(\n                  SettingBoxKey.reduceLuxColor,\n                  color.toARGB32(),\n                );\n                SmartDialog.showToast('设置成功');\n                setState();\n              }\n\n              if (color.computeLuminance() < 0.2) {\n                showConfirmDialog(\n                  context: context,\n                  title:\n                      '确认使用#${(color.toARGB32() & 0xFFFFFF).toRadixString(16).toUpperCase().padLeft(6)}？',\n                  content: '所选颜色过于昏暗，可能会影响图片观看',\n                  onConfirm: onConfirm,\n                );\n              } else {\n                onConfirm();\n              }\n            }\n          }\n        },\n      ),\n    ),\n  );\n}\n\nFuture<void> _showToastDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<double>(\n    context: context,\n    builder: (context) => SliderDialog(\n      title: 'Toast不透明度',\n      value: CustomToast.toastOpacity,\n      min: 0.0,\n      max: 1.0,\n      divisions: 10,\n    ),\n  );\n  if (res != null) {\n    CustomToast.toastOpacity = res;\n    await GStorage.setting.put(SettingBoxKey.defaultToastOp, res);\n    SmartDialog.showToast('设置成功');\n    setState();\n  }\n}\n\nFuture<void> _showThemeTypeDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<ThemeType>(\n    context: context,\n    builder: (context) => SelectDialog<ThemeType>(\n      title: '主题模式',\n      value: Pref.themeType,\n      values: ThemeType.values.map((e) => (e, e.desc)).toList(),\n    ),\n  );\n  if (res != null) {\n    try {\n      Get.find<MineController>().themeType.value = res;\n    } catch (_) {}\n    GStorage.setting.put(SettingBoxKey.themeMode, res.index);\n    Get.changeThemeMode(res.toThemeMode);\n    setState();\n  }\n}\n\nFuture<void> _showDefHomeDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<NavigationBarType>(\n    context: context,\n    builder: (context) => SelectDialog<NavigationBarType>(\n      title: '首页启动页',\n      value: Pref.defaultHomePage,\n      values: NavigationBarType.values.map((e) => (e, e.label)).toList(),\n    ),\n  );\n  if (res != null) {\n    await GStorage.setting.put(SettingBoxKey.defaultHomePage, res.index);\n    SmartDialog.showToast('设置成功，重启生效');\n    setState();\n  }\n}\n\nFuture<void> _showBarHideTypeDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<BarHideType>(\n    context: context,\n    builder: (context) => SelectDialog<BarHideType>(\n      title: '顶/底栏收起类型',\n      value: Pref.barHideType,\n      values: BarHideType.values.map((e) => (e, e.label)).toList(),\n    ),\n  );\n  if (res != null) {\n    await GStorage.setting.put(SettingBoxKey.barHideType, res.index);\n    SmartDialog.showToast('重启生效');\n    setState();\n  }\n}\n\nNormalModel _useSSDModel() {\n  final file = File(path.join(appSupportDirPath, 'use_ssd'));\n  void onChanged(BuildContext context, VoidCallback setState) {\n    (file.existsSync() ? file.tryDel() : file.create()).whenComplete(() {\n      if (context.mounted) {\n        setState();\n      }\n    });\n  }\n\n  return NormalModel(\n    title: '使用SSD（Server-Side Decoration）',\n    leading: const Icon(Icons.web_asset),\n    onTap: onChanged,\n    getTrailing: (theme) => Builder(\n      builder: (context) => Transform.scale(\n        scale: 0.8,\n        alignment: .centerRight,\n        child: Switch(\n          value: file.existsSync(),\n          onChanged: (_) =>\n              onChanged(context, (context as Element).markNeedsBuild),\n        ),\n      ),\n    ),\n  );\n}\n"
  },
  {
    "path": "lib/pages/setting/models/video_settings.dart",
    "content": "import 'dart:io';\n\nimport 'package:PiliPlus/models/common/video/audio_quality.dart';\nimport 'package:PiliPlus/models/common/video/cdn_type.dart';\nimport 'package:PiliPlus/models/common/video/live_quality.dart';\nimport 'package:PiliPlus/models/common/video/video_decode_type.dart';\nimport 'package:PiliPlus/models/common/video/video_quality.dart';\nimport 'package:PiliPlus/pages/setting/models/model.dart';\nimport 'package:PiliPlus/pages/setting/widgets/ordered_multi_select_dialog.dart';\nimport 'package:PiliPlus/pages/setting/widgets/select_dialog.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/audio_output_type.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/hwdec_type.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/video_utils.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart' show FilteringTextInputFormatter;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\n\nList<SettingsModel> get videoSettings => [\n  const SwitchModel(\n    title: '开启硬解',\n    subtitle: '以较低功耗播放视频，若异常卡死请关闭',\n    leading: Icon(Icons.flash_on_outlined),\n    setKey: SettingBoxKey.enableHA,\n    defaultVal: true,\n  ),\n  const SwitchModel(\n    title: '免登录1080P',\n    subtitle: '免登录查看1080P视频',\n    leading: Icon(Icons.hd_outlined),\n    setKey: SettingBoxKey.p1080,\n    defaultVal: true,\n  ),\n  NormalModel(\n    title: 'B站定向流量支持',\n    subtitle: '若套餐含B站定向流量，则会自动使用。可查阅运营商的流量记录确认。',\n    leading: const Icon(Icons.perm_data_setting_outlined),\n    getTrailing: (theme) => IgnorePointer(\n      child: Transform.scale(\n        scale: 0.8,\n        alignment: Alignment.centerRight,\n        child: Switch(\n          value: true,\n          onChanged: (_) {},\n          thumbIcon: WidgetStateProperty.all(\n            const Icon(Icons.lock_outline_rounded),\n          ),\n        ),\n      ),\n    ),\n  ),\n  NormalModel(\n    title: 'CDN 设置',\n    leading: const Icon(MdiIcons.cloudPlusOutline),\n    getSubtitle: () =>\n        '当前使用：${VideoUtils.cdnService.desc}，部分 CDN 可能失效，如无法播放请尝试切换',\n    onTap: _showCDNDialog,\n  ),\n  NormalModel(\n    title: '直播 CDN 设置',\n    leading: const Icon(MdiIcons.cloudPlusOutline),\n    getSubtitle: () => '当前使用：${Pref.liveCdnUrl ?? \"默认\"}',\n    onTap: _showLiveCDNDialog,\n  ),\n  const SwitchModel(\n    title: 'CDN 测速',\n    leading: Icon(Icons.speed),\n    subtitle: '测速通过模拟加载视频实现，注意流量消耗，结果仅供参考',\n    setKey: SettingBoxKey.cdnSpeedTest,\n    defaultVal: true,\n  ),\n  SwitchModel(\n    title: '音频不跟随 CDN 设置',\n    subtitle: '直接采用备用 URL，可解决部分视频无声',\n    leading: const Icon(MdiIcons.musicNotePlus),\n    setKey: SettingBoxKey.disableAudioCDN,\n    defaultVal: false,\n    onChanged: (value) => VideoUtils.disableAudioCDN = value,\n  ),\n  NormalModel(\n    title: '默认画质',\n    leading: const Icon(Icons.video_settings_outlined),\n    getSubtitle: () =>\n        '当前画质：${VideoQuality.fromCode(Pref.defaultVideoQa).desc}',\n    onTap: _showVideoQaDialog,\n  ),\n  NormalModel(\n    title: '蜂窝网络画质',\n    leading: const Icon(Icons.video_settings_outlined),\n    getSubtitle: () =>\n        '当前画质：${VideoQuality.fromCode(Pref.defaultVideoQaCellular).desc}',\n    onTap: _showVideoCellularQaDialog,\n  ),\n  NormalModel(\n    title: '默认音质',\n    leading: const Icon(Icons.music_video_outlined),\n    getSubtitle: () =>\n        '当前音质：${AudioQuality.fromCode(Pref.defaultAudioQa).desc}',\n    onTap: _showAudioQaDialog,\n  ),\n  NormalModel(\n    title: '蜂窝网络音质',\n    leading: const Icon(Icons.music_video_outlined),\n    getSubtitle: () =>\n        '当前音质：${AudioQuality.fromCode(Pref.defaultAudioQaCellular).desc}',\n    onTap: _showAudioCellularQaDialog,\n  ),\n  NormalModel(\n    title: '直播默认画质',\n    leading: const Icon(Icons.video_settings_outlined),\n    getSubtitle: () => '当前画质：${LiveQuality.fromCode(Pref.liveQuality)?.desc}',\n    onTap: _showLiveQaDialog,\n  ),\n  NormalModel(\n    title: '蜂窝网络直播默认画质',\n    leading: const Icon(Icons.video_settings_outlined),\n    getSubtitle: () =>\n        '当前画质：${LiveQuality.fromCode(Pref.liveQualityCellular)?.desc}',\n    onTap: _showLiveCellularQaDialog,\n  ),\n  NormalModel(\n    title: '首选解码格式',\n    leading: const Icon(Icons.movie_creation_outlined),\n    getSubtitle: () =>\n        '首选解码格式：${VideoDecodeFormatType.fromCode(Pref.defaultDecode).description}，请根据设备支持情况与需求调整',\n    onTap: _showDecodeDialog,\n  ),\n  NormalModel(\n    title: '次选解码格式',\n    getSubtitle: () =>\n        '非杜比视频次选：${VideoDecodeFormatType.fromCode(Pref.secondDecode).description}，仍无则选择首个提供的解码格式',\n    leading: const Icon(Icons.swap_horizontal_circle_outlined),\n    onTap: _showSecondDecodeDialog,\n  ),\n  if (kDebugMode || Platform.isAndroid)\n    NormalModel(\n      title: '音频输出设备',\n      leading: const Icon(Icons.speaker_outlined),\n      getSubtitle: () => '当前：${Pref.audioOutput}',\n      onTap: _showAudioOutputDialog,\n    ),\n  const SwitchModel(\n    title: '扩大缓冲区',\n    leading: Icon(Icons.storage_outlined),\n    subtitle: '默认缓冲区为视频4MB/直播16MB，开启后为32MB/64MB，加载时间变长',\n    setKey: SettingBoxKey.expandBuffer,\n    defaultVal: false,\n  ),\n  NormalModel(\n    title: '自动同步',\n    leading: const Icon(Icons.sync_rounded),\n    getSubtitle: () => '当前：${Pref.autosync}（此项即mpv的--autosync）',\n    onTap: _showAutoSyncDialog,\n  ),\n  NormalModel(\n    title: '视频同步',\n    leading: const Icon(Icons.view_timeline_outlined),\n    getSubtitle: () => '当前：${Pref.videoSync}（此项即mpv的--video-sync）',\n    onTap: _showVideoSyncDialog,\n  ),\n  NormalModel(\n    title: '硬解模式',\n    leading: const Icon(Icons.memory_outlined),\n    getSubtitle: () => '当前：${Pref.hardwareDecoding}（此项即mpv的--hwdec）',\n    onTap: _showHwDecDialog,\n  ),\n];\n\nFuture<void> _showCDNDialog(BuildContext context, VoidCallback setState) async {\n  final res = await showDialog<CDNService>(\n    context: context,\n    builder: (context) => const CdnSelectDialog(),\n  );\n  if (res != null) {\n    VideoUtils.cdnService = res;\n    await GStorage.setting.put(SettingBoxKey.CDNService, res.name);\n    setState();\n  }\n}\n\nFuture<void> _showLiveCDNDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  String host = Pref.liveCdnUrl ?? '';\n  String? res = await showDialog<String>(\n    context: context,\n    builder: (context) => AlertDialog(\n      title: const Text('输入CDN host'),\n      content: TextFormField(\n        initialValue: host,\n        autofocus: true,\n        onChanged: (value) => host = value,\n      ),\n      actions: [\n        TextButton(\n          onPressed: Get.back,\n          child: Text(\n            '取消',\n            style: TextStyle(color: ColorScheme.of(context).outline),\n          ),\n        ),\n        TextButton(\n          onPressed: () => Get.back(result: host),\n          child: const Text('确定'),\n        ),\n      ],\n    ),\n  );\n  if (res != null) {\n    if (res.isEmpty) {\n      res = null;\n      await GStorage.setting.delete(SettingBoxKey.liveCdnUrl);\n    } else {\n      if (!res.startsWith('http')) {\n        res = 'https://$res';\n      }\n      await GStorage.setting.put(SettingBoxKey.liveCdnUrl, res);\n    }\n    VideoUtils.liveCdnUrl = res;\n    setState();\n  }\n}\n\nFuture<void> _showVideoQaDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<int>(\n    context: context,\n    builder: (context) => SelectDialog<int>(\n      title: '默认画质',\n      value: Pref.defaultVideoQa,\n      values: VideoQuality.values.map((e) => (e.code, e.desc)).toList(),\n    ),\n  );\n  if (res != null) {\n    await GStorage.setting.put(SettingBoxKey.defaultVideoQa, res);\n    setState();\n  }\n}\n\nFuture<void> _showVideoCellularQaDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<int>(\n    context: context,\n    builder: (context) => SelectDialog<int>(\n      title: '蜂窝网络画质',\n      value: Pref.defaultVideoQaCellular,\n      values: VideoQuality.values.map((e) => (e.code, e.desc)).toList(),\n    ),\n  );\n  if (res != null) {\n    await GStorage.setting.put(\n      SettingBoxKey.defaultVideoQaCellular,\n      res,\n    );\n    setState();\n  }\n}\n\nFuture<void> _showAudioQaDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<int>(\n    context: context,\n    builder: (context) => SelectDialog<int>(\n      title: '默认音质',\n      value: Pref.defaultAudioQa,\n      values: AudioQuality.values.map((e) => (e.code, e.desc)).toList(),\n    ),\n  );\n  if (res != null) {\n    await GStorage.setting.put(SettingBoxKey.defaultAudioQa, res);\n    setState();\n  }\n}\n\nFuture<void> _showAudioCellularQaDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<int>(\n    context: context,\n    builder: (context) => SelectDialog<int>(\n      title: '蜂窝网络音质',\n      value: Pref.defaultAudioQaCellular,\n      values: AudioQuality.values.map((e) => (e.code, e.desc)).toList(),\n    ),\n  );\n  if (res != null) {\n    await GStorage.setting.put(\n      SettingBoxKey.defaultAudioQaCellular,\n      res,\n    );\n    setState();\n  }\n}\n\nFuture<void> _showLiveQaDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<int>(\n    context: context,\n    builder: (context) => SelectDialog<int>(\n      title: '直播默认画质',\n      value: Pref.liveQuality,\n      values: LiveQuality.values.map((e) => (e.code, e.desc)).toList(),\n    ),\n  );\n  if (res != null) {\n    await GStorage.setting.put(SettingBoxKey.liveQuality, res);\n    setState();\n  }\n}\n\nFuture<void> _showLiveCellularQaDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<int>(\n    context: context,\n    builder: (context) => SelectDialog<int>(\n      title: '蜂窝网络直播默认画质',\n      value: Pref.liveQualityCellular,\n      values: LiveQuality.values.map((e) => (e.code, e.desc)).toList(),\n    ),\n  );\n  if (res != null) {\n    await GStorage.setting.put(SettingBoxKey.liveQualityCellular, res);\n    setState();\n  }\n}\n\nFuture<void> _showDecodeDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<String>(\n    context: context,\n    builder: (context) => SelectDialog<String>(\n      title: '默认解码格式',\n      value: Pref.defaultDecode,\n      values: VideoDecodeFormatType.values\n          .map((e) => (e.codes.first, e.description))\n          .toList(),\n    ),\n  );\n  if (res != null) {\n    await GStorage.setting.put(SettingBoxKey.defaultDecode, res);\n    setState();\n  }\n}\n\nFuture<void> _showSecondDecodeDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<String>(\n    context: context,\n    builder: (context) => SelectDialog<String>(\n      title: '次选解码格式',\n      value: Pref.secondDecode,\n      values: VideoDecodeFormatType.values\n          .map((e) => (e.codes.first, e.description))\n          .toList(),\n    ),\n  );\n  if (res != null) {\n    await GStorage.setting.put(SettingBoxKey.secondDecode, res);\n    setState();\n  }\n}\n\nFuture<void> _showAudioOutputDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<List<String>>(\n    context: context,\n    builder: (context) => OrderedMultiSelectDialog<String>(\n      title: '音频输出设备',\n      initValues: Pref.audioOutput.split(','),\n      values: {\n        for (final e in AudioOutput.values) e.name: e.label,\n      },\n    ),\n  );\n  if (res != null && res.isNotEmpty) {\n    await GStorage.setting.put(\n      SettingBoxKey.audioOutput,\n      res.join(','),\n    );\n    setState();\n  }\n}\n\nFuture<void> _showVideoSyncDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<String>(\n    context: context,\n    builder: (context) => SelectDialog<String>(\n      title: '视频同步',\n      value: Pref.videoSync,\n      values: const [\n        'audio',\n        'display-resample',\n        'display-resample-vdrop',\n        'display-resample-desync',\n        'display-tempo',\n        'display-vdrop',\n        'display-adrop',\n        'display-desync',\n        'desync',\n      ].map((e) => (e, e)).toList(),\n    ),\n  );\n  if (res != null) {\n    await GStorage.setting.put(SettingBoxKey.videoSync, res);\n    setState();\n  }\n}\n\nFuture<void> _showHwDecDialog(\n  BuildContext context,\n  VoidCallback setState,\n) async {\n  final res = await showDialog<List<String>>(\n    context: context,\n    builder: (context) => OrderedMultiSelectDialog<String>(\n      title: '硬解模式',\n      initValues: Pref.hardwareDecoding.split(','),\n      values: {\n        for (final e in HwDecType.values) e.hwdec: '${e.hwdec}\\n${e.desc}',\n      },\n    ),\n  );\n  if (res != null && res.isNotEmpty) {\n    await GStorage.setting.put(\n      SettingBoxKey.hardwareDecoding,\n      res.join(','),\n    );\n    setState();\n  }\n}\n\nvoid _showAutoSyncDialog(BuildContext context, VoidCallback setState) {\n  String autosync = Pref.autosync.toString();\n  showDialog(\n    context: context,\n    builder: (context) => AlertDialog(\n      title: const Text('自动同步'),\n      content: TextFormField(\n        autofocus: true,\n        initialValue: autosync,\n        keyboardType: TextInputType.number,\n        onChanged: (value) => autosync = value,\n        inputFormatters: [FilteringTextInputFormatter.digitsOnly],\n      ),\n      actions: [\n        TextButton(\n          onPressed: Get.back,\n          child: Text(\n            '取消',\n            style: TextStyle(color: ColorScheme.of(context).outline),\n          ),\n        ),\n        TextButton(\n          onPressed: () async {\n            try {\n              // validate\n              int.parse(autosync);\n              Get.back();\n              await GStorage.setting.put(SettingBoxKey.autosync, autosync);\n              setState();\n            } catch (e) {\n              SmartDialog.showToast(e.toString());\n            }\n          },\n          child: const Text('确定'),\n        ),\n      ],\n    ),\n  );\n}\n"
  },
  {
    "path": "lib/pages/setting/pages/bar_set.dart",
    "content": "import 'package:PiliPlus/common/widgets/pair.dart';\nimport 'package:PiliPlus/models/common/enum_with_label.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass BarSetPage extends StatefulWidget {\n  const BarSetPage({super.key});\n\n  @override\n  State<BarSetPage> createState() => _BarSetPageState();\n}\n\nclass _BarSetPageState extends State<BarSetPage> {\n  late final String key;\n  late final String title;\n  late final List<Pair<EnumWithLabel, bool>> list;\n\n  @override\n  void initState() {\n    super.initState();\n    final Map<String, dynamic> args = Get.arguments;\n    key = args['key'];\n    title = args['title'];\n    final List? cache = GStorage.setting.get(key);\n    list = (args['defaultBars'] as List<EnumWithLabel>)\n        .map((e) => Pair(first: e, second: cache?.contains(e.index) ?? true))\n        .toList();\n    if (cache != null && cache.isNotEmpty) {\n      final cacheIndex = {for (final (k, v) in cache.indexed) v: k};\n      list.sort((a, b) {\n        final indexA = cacheIndex[a.first.index] ?? cacheIndex.length;\n        final indexB = cacheIndex[b.first.index] ?? cacheIndex.length;\n        return indexA.compareTo(indexB);\n      });\n    }\n  }\n\n  void saveEdit() {\n    GStorage.setting.put(\n      key,\n      list.where((e) => e.second).map((e) => e.first.index).toList(),\n    );\n    SmartDialog.showToast('保存成功，下次启动时生效');\n  }\n\n  void onReset() {\n    Get.back();\n    GStorage.setting.delete(key);\n    SmartDialog.showToast('重置成功，下次启动时生效');\n  }\n\n  void onReorder(int oldIndex, int newIndex) {\n    if (newIndex > oldIndex) newIndex -= 1;\n    list.insert(newIndex, list.removeAt(oldIndex));\n    setState(() {});\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        title: Text('$title编辑'),\n        actions: [\n          TextButton(onPressed: onReset, child: const Text('重置')),\n          TextButton(onPressed: saveEdit, child: const Text('保存')),\n          const SizedBox(width: 12),\n        ],\n      ),\n      body: ReorderableListView(\n        onReorder: onReorder,\n        footer: Padding(\n          padding:\n              MediaQuery.viewPaddingOf(context).copyWith(top: 0, left: 0) +\n              const EdgeInsets.only(right: 34, top: 10),\n          child: const Align(\n            alignment: Alignment.centerRight,\n            child: Text('*长按拖动排序'),\n          ),\n        ),\n        children: list\n            .map(\n              (e) => CheckboxListTile(\n                key: ValueKey(e.hashCode),\n                value: e.second,\n                onChanged: (bool? value) {\n                  e.second = value!;\n                  setState(() {});\n                },\n                title: Text(e.first.label),\n                secondary: const Icon(Icons.drag_indicator_rounded),\n              ),\n            )\n            .toList(),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/setting/pages/color_select.dart",
    "content": "import 'dart:io' show Platform;\n\nimport 'package:PiliPlus/common/widgets/color_palette.dart';\nimport 'package:PiliPlus/main.dart' show MyApp;\nimport 'package:PiliPlus/models/common/nav_bar_config.dart';\nimport 'package:PiliPlus/models/common/theme/theme_color_type.dart';\nimport 'package:PiliPlus/models/common/theme/theme_type.dart';\nimport 'package:PiliPlus/pages/home/view.dart';\nimport 'package:PiliPlus/pages/mine/controller.dart';\nimport 'package:PiliPlus/pages/setting/widgets/popup_item.dart';\nimport 'package:PiliPlus/pages/setting/widgets/select_dialog.dart';\nimport 'package:PiliPlus/utils/extension/get_ext.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:flex_seed_scheme/flex_seed_scheme.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass ColorSelectPage extends StatefulWidget {\n  const ColorSelectPage({super.key});\n\n  @override\n  State<ColorSelectPage> createState() => _ColorSelectPageState();\n}\n\nclass Item {\n  Item({\n    required this.expandedValue,\n    required this.headerValue,\n    this.isExpanded = false,\n  });\n\n  String expandedValue;\n  String headerValue;\n  bool isExpanded;\n}\n\nclass _ColorSelectPageState extends State<ColorSelectPage> {\n  final ctr = Get.put(_ColorSelectController());\n  FlexSchemeVariant _dynamicSchemeVariant = Pref.schemeVariant;\n\n  Future<void> _onChanged([bool? val]) async {\n    val ??= !ctr.dynamicColor.value;\n    if (val && !await MyApp.initPlatformState()) {\n      SmartDialog.showToast('设备可能不支持动态取色');\n      return;\n    }\n    ctr.dynamicColor.value = val;\n    await GStorage.setting.put(SettingBoxKey.dynamicColor, val);\n    Get.updateMyAppTheme();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    TextStyle titleStyle = theme.textTheme.titleMedium!;\n    TextStyle subTitleStyle = theme.textTheme.labelMedium!.copyWith(\n      color: theme.colorScheme.outline,\n    );\n    final size = MediaQuery.sizeOf(context);\n    final padding = MediaQuery.viewPaddingOf(\n      context,\n    ).copyWith(top: 0, bottom: 0);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(title: const Text('选择应用主题')),\n      body: ListView(\n        children: [\n          ListTile(\n            onTap: () async {\n              final result = await showDialog<ThemeType>(\n                context: context,\n                builder: (context) => SelectDialog<ThemeType>(\n                  title: '主题模式',\n                  value: ctr.themeType.value,\n                  values: ThemeType.values.map((e) => (e, e.desc)).toList(),\n                ),\n              );\n              if (result != null) {\n                try {\n                  Get.find<MineController>().themeType.value = result;\n                } catch (_) {}\n                ctr.themeType.value = result;\n                GStorage.setting.put(SettingBoxKey.themeMode, result.index);\n                Get.changeThemeMode(result.toThemeMode);\n              }\n            },\n            leading: const Icon(Icons.flashlight_on_outlined),\n            title: Text('主题模式', style: titleStyle),\n            subtitle: Obx(\n              () => Text(\n                '当前模式：${ctr.themeType.value.desc}',\n                style: subTitleStyle,\n              ),\n            ),\n          ),\n          Obx(\n            () => PopupListTile<FlexSchemeVariant>(\n              enabled: !ctr.dynamicColor.value,\n              leading: const Icon(Icons.palette_outlined),\n              title: const Text('调色板风格'),\n              value: () =>\n                  (_dynamicSchemeVariant, _dynamicSchemeVariant.variantName),\n              itemBuilder: (_) => FlexSchemeVariant.values\n                  .map(\n                    (e) => PopupMenuItem(value: e, child: Text(e.variantName)),\n                  )\n                  .toList(),\n              onSelected: (value, setState) {\n                _dynamicSchemeVariant = value;\n                GStorage.setting\n                    .put(SettingBoxKey.schemeVariant, value.index)\n                    .whenComplete(Get.updateMyAppTheme);\n              },\n            ),\n          ),\n          if (!Platform.isIOS)\n            Obx(\n              () => ListTile(\n                title: const Text('动态取色'),\n                leading: ExcludeFocus(\n                  child: Checkbox(\n                    value: ctr.dynamicColor.value,\n                    onChanged: _onChanged,\n                    materialTapTargetSize: .shrinkWrap,\n                    visualDensity: const .new(horizontal: -4, vertical: -4),\n                  ),\n                ),\n                onTap: _onChanged,\n              ),\n            ),\n          Padding(\n            padding: padding,\n            child: AnimatedSize(\n              curve: Curves.easeInOut,\n              alignment: Alignment.topCenter,\n              duration: const Duration(milliseconds: 200),\n              child: Obx(\n                () => ctr.dynamicColor.value\n                    ? const SizedBox.shrink()\n                    : Padding(\n                        padding: const EdgeInsets.all(12),\n                        child: Wrap(\n                          alignment: WrapAlignment.center,\n                          spacing: 22,\n                          runSpacing: 18,\n                          children: colorThemeTypes.indexed.map(\n                            (e) {\n                              final index = e.$1;\n                              final item = e.$2;\n                              return GestureDetector(\n                                behavior: HitTestBehavior.opaque,\n                                onTap: () {\n                                  ctr.currentColor.value = index;\n                                  GStorage.setting\n                                      .put(SettingBoxKey.customColor, index)\n                                      .whenComplete(Get.updateMyAppTheme);\n                                },\n                                child: Column(\n                                  spacing: 3,\n                                  children: [\n                                    ColorPalette(\n                                      colorScheme: item.color.asColorSchemeSeed(\n                                        _dynamicSchemeVariant,\n                                        theme.brightness,\n                                      ),\n                                      selected: ctr.currentColor.value == index,\n                                    ),\n                                    Text(\n                                      item.label,\n                                      style: TextStyle(\n                                        fontSize: 12,\n                                        color: ctr.currentColor.value != index\n                                            ? theme.colorScheme.outline\n                                            : null,\n                                      ),\n                                    ),\n                                  ],\n                                ),\n                              );\n                            },\n                          ).toList(),\n                        ),\n                      ),\n              ),\n            ),\n          ),\n          Padding(\n            padding: padding,\n            child: ExcludeFocus(\n              child: IgnorePointer(\n                child: Container(\n                  height: size.height / 2,\n                  width: size.width,\n                  color: theme.colorScheme.surface,\n                  child: const HomePage(),\n                ),\n              ),\n            ),\n          ),\n          ExcludeFocus(\n            child: IgnorePointer(\n              child: NavigationBar(\n                destinations: NavigationBarType.values\n                    .map(\n                      (item) => NavigationDestination(\n                        icon: item.icon,\n                        label: item.label,\n                      ),\n                    )\n                    .toList(),\n              ),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n\nclass _ColorSelectController extends GetxController {\n  final RxBool dynamicColor = Pref.dynamicColor.obs;\n  final RxInt currentColor = Pref.customColor.obs;\n  final Rx<ThemeType> themeType = Pref.themeType.obs;\n}\n"
  },
  {
    "path": "lib/pages/setting/pages/display_mode.dart",
    "content": "import 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart' show PlatformException;\nimport 'package:flutter_displaymode/flutter_displaymode.dart';\nimport 'package:hive_ce/hive.dart';\n\nclass SetDisplayMode extends StatefulWidget {\n  const SetDisplayMode({super.key});\n\n  @override\n  State<SetDisplayMode> createState() => _SetDisplayModeState();\n}\n\nclass _SetDisplayModeState extends State<SetDisplayMode> {\n  List<DisplayMode> modes = <DisplayMode>[];\n  DisplayMode? active;\n  DisplayMode? preferred;\n\n  Box setting = GStorage.setting;\n\n  @override\n  void initState() {\n    super.initState();\n    init();\n  }\n\n  // 获取所有的mode\n  Future<void> fetchAll() async {\n    preferred = await FlutterDisplayMode.preferred;\n    active = await FlutterDisplayMode.active;\n    setting.put(SettingBoxKey.displayMode, preferred.toString());\n    if (mounted) {\n      setState(() {});\n    }\n  }\n\n  // 初始化mode/手动设置\n  Future<void> init() async {\n    try {\n      modes = await FlutterDisplayMode.supported;\n    } on PlatformException catch (e) {\n      if (kDebugMode) debugPrint(e.toString());\n    }\n\n    final value = setting.get(SettingBoxKey.displayMode);\n    if (value != null) {\n      preferred = modes.firstWhereOrNull((e) => e.toString() == value);\n    }\n\n    preferred ??= DisplayMode.auto;\n\n    FlutterDisplayMode.setPreferredMode(preferred!).whenComplete(() {\n      Future.delayed(const Duration(milliseconds: 100), fetchAll);\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(title: const Text('屏幕帧率设置')),\n      body: Column(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          Padding(\n            padding:\n                MediaQuery.viewPaddingOf(context).copyWith(top: 0, bottom: 0) +\n                const EdgeInsets.only(left: 25, top: 10, bottom: 5),\n            child: Text(\n              '没有生效？重启app试试',\n              style: TextStyle(color: Theme.of(context).colorScheme.outline),\n            ),\n          ),\n          Expanded(\n            child: RadioGroup(\n              onChanged: (DisplayMode? newMode) {\n                FlutterDisplayMode.setPreferredMode(\n                  newMode!,\n                ).whenComplete(\n                  () => Future.delayed(\n                    const Duration(milliseconds: 100),\n                    fetchAll,\n                  ),\n                );\n              },\n              groupValue: preferred,\n              child: ListView.builder(\n                itemCount: modes.length,\n                itemBuilder: (context, index) {\n                  final DisplayMode mode = modes[index];\n                  return RadioListTile<DisplayMode>(\n                    value: mode,\n                    title: mode == DisplayMode.auto\n                        ? const Text('自动')\n                        : Text('$mode${mode == active ? '  [系统]' : ''}'),\n                  );\n                },\n              ),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/setting/pages/font_size_select.dart",
    "content": "import 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass FontSizeSelectPage extends StatefulWidget {\n  const FontSizeSelectPage({super.key});\n\n  @override\n  State<FontSizeSelectPage> createState() => _FontSizeSelectPageState();\n}\n\nclass _FontSizeSelectPageState extends State<FontSizeSelectPage> {\n  List<double> list = List.generate(16, (index) => 0.85 + index * 0.05);\n  late double minSize = list.first;\n  late double maxSize = list.last;\n  double currentSize = Pref.defaultTextScale;\n\n  void setFontSize() {\n    GStorage.setting.put(SettingBoxKey.defaultTextScale, currentSize);\n    Get\n      ..back(result: currentSize)\n      ..appUpdate();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        actions: [\n          TextButton(\n            onPressed: () {\n              currentSize = 1.0;\n              setFontSize();\n            },\n            child: const Text('重置'),\n          ),\n          TextButton(onPressed: setFontSize, child: const Text('确定')),\n          const SizedBox(width: 12),\n        ],\n      ),\n      body: SafeArea(\n        child: Column(\n          children: [\n            Expanded(\n              child: Center(\n                child: Text(\n                  '当前字体大小:${currentSize == 1.0 ? '默认' : currentSize}',\n                  style: TextStyle(fontSize: 14 * currentSize),\n                ),\n              ),\n            ),\n            Container(\n              padding: const EdgeInsets.all(20),\n              decoration: BoxDecoration(\n                border: Border(\n                  top: BorderSide(\n                    color: theme.colorScheme.primary.withValues(alpha: 0.3),\n                  ),\n                ),\n                color: theme.colorScheme.surface,\n              ),\n              child: Row(\n                children: [\n                  const Text('小'),\n                  Expanded(\n                    child: Slider(\n                      min: minSize,\n                      value: currentSize,\n                      max: maxSize,\n                      divisions: list.length - 1,\n                      secondaryTrackValue: 1,\n                      onChanged: (double val) {\n                        currentSize = val.toPrecision(2);\n                        setState(() {});\n                      },\n                    ),\n                  ),\n                  const SizedBox(width: 5),\n                  const Text(\n                    '大',\n                    style: TextStyle(fontSize: 20),\n                  ),\n                ],\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/setting/pages/logs.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/services/logger.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:catcher_2/model/platform_type.dart';\nimport 'package:catcher_2/model/report.dart' as catcher;\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\n\nconst _snackBarDisplayDuration = Duration(seconds: 1);\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  List<Report> logsContent = [];\n  Report? latestLog;\n  late bool enableLog = Pref.enableLog;\n\n  @override\n  void initState() {\n    getLog();\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    if (latestLog != null) {\n      final time = latestLog!.dateTime;\n      if (DateTime.now().difference(time) >= const Duration(days: 14)) {\n        LoggerUtils.clearLogs();\n      }\n    }\n    super.dispose();\n  }\n\n  Future<void> getLog() async {\n    final logsPath = await LoggerUtils.getLogsPath();\n    logsContent = (await logsPath.readAsLines()).reversed.map((i) {\n      try {\n        final log = Report.fromJson(jsonDecode(i));\n        latestLog ??= log.copyWith();\n        return log;\n      } catch (e, s) {\n        return Report(\n          'Parse log failed: $e\\n\\n\\n$i',\n          s,\n          DateTime.now(),\n          const {},\n          const {},\n          const {},\n          null,\n          PlatformType.unknown,\n          null,\n        );\n      }\n    }).toList();\n    if (mounted) {\n      setState(() {});\n    }\n  }\n\n  void copyLogs() {\n    Utils.copyText(\n      '```\\n${logsContent.join('\\n\\n')}```',\n      needToast: false,\n    );\n    if (mounted) {\n      ScaffoldMessenger.of(context).showSnackBar(\n        const SnackBar(\n          content: Text('复制成功'),\n          duration: _snackBarDisplayDuration,\n        ),\n      );\n    }\n  }\n\n  Future<void> clearLogs() async {\n    if (await LoggerUtils.clearLogs()) {\n      if (mounted) {\n        ScaffoldMessenger.of(context).showSnackBar(\n          const SnackBar(\n            content: Text('已清空'),\n            duration: _snackBarDisplayDuration,\n          ),\n        );\n        logsContent.clear();\n        setState(() {});\n      }\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final padding = MediaQuery.viewPaddingOf(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        title: const Text('日志'),\n        actions: [\n          PopupMenuButton(\n            itemBuilder: (_) => [\n              if (kDebugMode)\n                PopupMenuItem(\n                  onTap: () => Timer.periodic(\n                    const Duration(milliseconds: 3500),\n                    (timer) {\n                      Utils.reportError('Manual');\n                      if (timer.tick > 3) {\n                        timer.cancel();\n                        if (mounted) getLog();\n                      }\n                    },\n                  ),\n                  child: const Text('引发错误'),\n                ),\n              PopupMenuItem(\n                onTap: () {\n                  enableLog = !enableLog;\n                  GStorage.setting.put(SettingBoxKey.enableLog, enableLog);\n                  SmartDialog.showToast('已${enableLog ? '开启' : '关闭'}，重启生效');\n                },\n                child: Text('${enableLog ? '关闭' : '开启'}日志'),\n              ),\n              PopupMenuItem(\n                onTap: copyLogs,\n                child: const Text('复制日志'),\n              ),\n              PopupMenuItem(\n                onTap: () =>\n                    PageUtils.launchURL('${Constants.sourceCodeUrl}/issues'),\n                child: const Text('错误反馈'),\n              ),\n              PopupMenuItem(\n                onTap: () {\n                  latestLog = null;\n                  clearLogs();\n                },\n                child: const Text('清空日志'),\n              ),\n            ],\n          ),\n          const SizedBox(width: 6),\n        ],\n      ),\n      body: logsContent.isNotEmpty\n          ? Padding(\n              padding: EdgeInsets.only(\n                left: padding.left + 12,\n                right: padding.right + 12,\n              ),\n              child: CustomScrollView(\n                slivers: [\n                  if (latestLog != null)\n                    SliverToBoxAdapter(\n                      child: Padding(\n                        padding: const .only(bottom: 12),\n                        child: InfoCard(report: latestLog!),\n                      ),\n                    ),\n                  SliverPadding(\n                    padding: EdgeInsets.only(bottom: padding.bottom + 100),\n                    sliver: SliverList.separated(\n                      itemCount: logsContent.length,\n                      itemBuilder: (context, index) =>\n                          ReportCard(report: logsContent[index]),\n                      separatorBuilder: (_, _) => const SizedBox(height: 12),\n                    ),\n                  ),\n                ],\n              ),\n            )\n          : scrollableError,\n    );\n  }\n}\n\nclass InfoCard extends StatelessWidget {\n  final Report report;\n\n  const InfoCard({super.key, required this.report});\n\n  Widget _buildMapSection(\n    Color color,\n    String title,\n    Map<String, dynamic> map,\n  ) {\n    if (map.isEmpty) {\n      return const SizedBox.shrink();\n    }\n\n    return Column(\n      spacing: 4,\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        const SizedBox(height: 8),\n        Text(\n          title,\n          style: TextStyle(\n            fontWeight: FontWeight.bold,\n            color: color,\n            fontSize: 15,\n          ),\n        ),\n        ...map.entries.map(\n          (entry) => Text.rich(\n            TextSpan(\n              children: [\n                TextSpan(\n                  text: '• ${entry.key}: ',\n                  style: const TextStyle(fontWeight: FontWeight.w500),\n                ),\n                TextSpan(\n                  text: entry.value.toString(),\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final colorScheme = ColorScheme.of(context);\n    return _card([\n      Row(\n        spacing: 8,\n        children: [\n          Icon(\n            Icons.info_outline,\n            size: 22,\n            color: colorScheme.primary,\n          ),\n          const Expanded(\n            child: Text(\n              '相关信息',\n              style: TextStyle(\n                fontWeight: FontWeight.bold,\n                fontSize: 15,\n              ),\n              maxLines: 1,\n              overflow: TextOverflow.ellipsis,\n            ),\n          ),\n          iconButton(\n            size: 34,\n            iconSize: 22,\n            icon: Icon(\n              report.isExpanded ? Icons.expand_less : Icons.expand_more,\n            ),\n            onPressed: () {\n              report.isExpanded = !report.isExpanded;\n              (context as Element).markNeedsBuild();\n            },\n          ),\n        ],\n      ),\n      if (report.isExpanded) ...[\n        _buildMapSection(\n          colorScheme.primary,\n          '设备信息',\n          report.deviceParameters,\n        ),\n        _buildMapSection(\n          colorScheme.primary,\n          '应用信息',\n          report.applicationParameters,\n        ),\n        _buildMapSection(\n          colorScheme.primary,\n          '编译信息',\n          report.customParameters,\n        ),\n      ],\n    ]);\n  }\n}\n\nclass ReportCard extends StatelessWidget {\n  final Report report;\n\n  const ReportCard({super.key, required this.report});\n\n  @override\n  Widget build(BuildContext context) {\n    final colorScheme = ColorScheme.of(context);\n    late final stackTrace = report.stackTrace.toString().trim();\n    final dateTime = DateFormatUtils.longFormatDs.format(report.dateTime);\n    return _card([\n      Row(\n        crossAxisAlignment: .start,\n        children: [\n          Expanded(\n            child: Column(\n              spacing: 6,\n              crossAxisAlignment: .start,\n              children: [\n                Text(\n                  report.error.toString(),\n                  style: const TextStyle(\n                    fontWeight: FontWeight.bold,\n                    fontSize: 15,\n                  ),\n                  maxLines: 2,\n                  overflow: TextOverflow.ellipsis,\n                ),\n                Text(\n                  dateTime,\n                  style: TextStyle(\n                    height: 1.2,\n                    color: colorScheme.outline,\n                    fontSize: 13,\n                  ),\n                ),\n              ],\n            ),\n          ),\n          iconButton(\n            size: 34,\n            iconSize: 22,\n            onPressed: () {\n              Utils.copyText('```\\n$report```', needToast: false);\n              ScaffoldMessenger.of(context).showSnackBar(\n                SnackBar(\n                  content: Text('已将 $dateTime 复制至剪贴板'),\n                  duration: _snackBarDisplayDuration,\n                ),\n              );\n            },\n            icon: const Icon(\n              Icons.copy_outlined,\n              size: 16,\n            ),\n          ),\n          iconButton(\n            size: 34,\n            iconSize: 22,\n            icon: Icon(\n              report.isExpanded ? Icons.expand_less : Icons.expand_more,\n            ),\n            onPressed: () {\n              report.isExpanded = !report.isExpanded;\n              (context as Element).markNeedsBuild();\n            },\n          ),\n        ],\n      ),\n      if (report.isExpanded) ...[\n        const SizedBox(height: 16),\n        Text(\n          '错误详情',\n          style: TextStyle(\n            fontWeight: FontWeight.bold,\n            color: colorScheme.error,\n            fontSize: 15,\n          ),\n        ),\n        const SizedBox(height: 8),\n        Container(\n          padding: const EdgeInsets.all(12),\n          decoration: BoxDecoration(\n            color: colorScheme.surface,\n            borderRadius: const BorderRadius.all(Radius.circular(8)),\n            border: Border.all(\n              color: colorScheme.outline.withValues(alpha: 0.5),\n            ),\n          ),\n          child: SelectableText(\n            report.error.toString(),\n            style: TextStyle(\n              fontFamily: 'Monospace',\n              color: colorScheme.onSurfaceVariant,\n            ),\n          ),\n        ),\n        // stackTrace may be null or String(\"null\") or blank\n        if (stackTrace.isNotEmpty && stackTrace != 'null') ...[\n          const SizedBox(height: 16),\n          Text(\n            '堆栈跟踪',\n            style: TextStyle(\n              fontWeight: FontWeight.bold,\n              color: colorScheme.error,\n              fontSize: 15,\n            ),\n          ),\n          const SizedBox(height: 8),\n          Container(\n            padding: const EdgeInsets.all(12),\n            decoration: BoxDecoration(\n              color: colorScheme.surface,\n              borderRadius: const BorderRadius.all(Radius.circular(8)),\n              border: Border.all(\n                color: colorScheme.outline.withValues(alpha: 0.5),\n              ),\n            ),\n            child: SelectableText(\n              stackTrace,\n              style: TextStyle(\n                fontFamily: 'Monospace',\n                fontSize: 13,\n                color: colorScheme.onSurfaceVariant,\n              ),\n            ),\n          ),\n        ],\n      ],\n    ]);\n  }\n}\n\nWidget _card(List<Widget> contents) {\n  return Card(\n    child: Padding(\n      padding: const .all(12),\n      child: Column(\n        crossAxisAlignment: .stretch,\n        children: contents,\n      ),\n    ),\n  );\n}\n\nclass Report extends catcher.Report {\n  Report(\n    super.error,\n    super.stackTrace,\n    super.dateTime,\n    super.deviceParameters,\n    super.applicationParameters,\n    super.customParameters,\n    super.errorDetails,\n    super.platformType,\n    super.screenshot,\n  );\n\n  bool isExpanded = false;\n\n  factory Report.fromJson(Map<String, dynamic> json) => Report(\n    json['error'],\n    json['stackTrace'],\n    DateTime.tryParse(json['dateTime'] ?? '') ?? DateTime(1970),\n    json['deviceParameters'] ?? const {},\n    json['applicationParameters'] ?? const {},\n    json['customParameters'] ?? const {},\n    null,\n    PlatformType.values.byName(json['platformType']),\n    null,\n  );\n\n  Report copyWith({\n    dynamic error,\n    dynamic stackTrace,\n    DateTime? dateTime,\n    Map<String, dynamic>? deviceParameters,\n    Map<String, dynamic>? applicationParameters,\n    Map<String, dynamic>? customParameters,\n    FlutterErrorDetails? errorDetails,\n    PlatformType? platformType,\n  }) {\n    return Report(\n      error ?? this.error,\n      stackTrace ?? this.stackTrace,\n      dateTime ?? this.dateTime,\n      deviceParameters ?? this.deviceParameters,\n      applicationParameters ?? this.applicationParameters,\n      customParameters ?? this.customParameters,\n      errorDetails ?? this.errorDetails,\n      platformType ?? this.platformType,\n      null,\n    );\n  }\n\n  String _params2String(Map<String, dynamic> params) {\n    return params.entries\n        .map((entry) => '${entry.key}: ${entry.value}\\n')\n        .join();\n  }\n\n  @override\n  String toString() {\n    return '------- DEVICE INFO -------\\n${_params2String(deviceParameters)}'\n        '------- APP INFO -------\\n${_params2String(applicationParameters)}'\n        '------- ERROR -------\\n$error\\n'\n        '------- STACK TRACE -------\\n${stackTrace.toString().trim()}\\n'\n        '------- CUSTOM INFO -------\\n${_params2String(customParameters)}';\n  }\n}\n"
  },
  {
    "path": "lib/pages/setting/pages/play_speed_set.dart",
    "content": "import 'dart:math';\n\nimport 'package:PiliPlus/common/widgets/flutter/list_tile.dart';\nimport 'package:PiliPlus/common/widgets/view_safe_area.dart';\nimport 'package:PiliPlus/pages/setting/widgets/switch_item.dart';\nimport 'package:PiliPlus/utils/extension/context_ext.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:flutter/material.dart' hide ListTile;\nimport 'package:flutter/services.dart' show FilteringTextInputFormatter;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:hive_ce/hive.dart';\n\nclass PlaySpeedPage extends StatefulWidget {\n  const PlaySpeedPage({super.key});\n\n  @override\n  State<PlaySpeedPage> createState() => _PlaySpeedPageState();\n}\n\nclass _PlaySpeedPageState extends State<PlaySpeedPage> {\n  late double playSpeedDefault = Pref.playSpeedDefault;\n  late double longPressSpeedDefault = Pref.longPressSpeedDefault;\n  late List<double> speedList = Pref.speedList;\n  late bool enableAutoLongPressSpeed = Pref.enableAutoLongPressSpeed;\n  List<({int id, String title, Icon icon})> sheetMenu = [\n    (\n      id: 1,\n      title: '设置为默认倍速',\n      icon: const Icon(\n        Icons.speed,\n        size: 21,\n      ),\n    ),\n    (\n      id: 2,\n      title: '设置为默认长按倍速',\n      icon: const Icon(\n        Icons.speed_sharp,\n        size: 21,\n      ),\n    ),\n    (\n      id: -1,\n      title: '删除该项',\n      icon: const Icon(\n        Icons.delete_outline,\n        size: 21,\n      ),\n    ),\n  ];\n\n  Box video = GStorage.video;\n\n  // 添加自定义倍速\n  void onAddSpeed() {\n    String initialValue = '';\n    showDialog(\n      context: context,\n      builder: (context) => AlertDialog(\n        title: const Text('添加倍速'),\n        content: Column(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            const SizedBox(height: 12),\n            TextFormField(\n              autofocus: true,\n              initialValue: initialValue,\n              keyboardType: const .numberWithOptions(decimal: true),\n              decoration: const InputDecoration(\n                labelText: '自定义倍速',\n                border: OutlineInputBorder(borderRadius: .all(.circular(6))),\n              ),\n              onChanged: (value) => initialValue = value,\n              inputFormatters: [\n                FilteringTextInputFormatter.allow(RegExp(r'[\\d\\.]+')),\n              ],\n            ),\n          ],\n        ),\n        actions: [\n          TextButton(\n            onPressed: Get.back,\n            child: Text(\n              '取消',\n              style: TextStyle(color: Theme.of(context).colorScheme.outline),\n            ),\n          ),\n          TextButton(\n            onPressed: () {\n              try {\n                final val = double.parse(initialValue);\n                if (speedList.contains(val)) {\n                  SmartDialog.showToast('该倍速已存在');\n                } else {\n                  Get.back();\n                  speedList\n                    ..add(val)\n                    ..sort();\n                  video.put(VideoBoxKey.speedsList, speedList);\n                  setState(() {});\n                }\n              } catch (e) {\n                SmartDialog.showToast(e.toString());\n              }\n            },\n            child: const Text('确认'),\n          ),\n        ],\n      ),\n    );\n  }\n\n  // 设定倍速弹窗\n  void showBottomSheet(ThemeData theme, int index) {\n    showModalBottomSheet(\n      context: context,\n      useSafeArea: true,\n      isScrollControlled: true,\n      clipBehavior: Clip.hardEdge,\n      constraints: BoxConstraints(\n        maxWidth: min(640, context.mediaQueryShortestSide),\n      ),\n      builder: (context) {\n        return Column(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            const SizedBox(height: 10),\n            ...sheetMenu.map(\n              (item) => ListTile(\n                enabled: enableAutoLongPressSpeed && item.id == 2\n                    ? false\n                    : true,\n                onTap: () {\n                  Get.back();\n                  menuAction(index, item.id);\n                },\n                minLeadingWidth: 0,\n                iconColor: theme.colorScheme.onSurface,\n                leading: item.icon,\n                title: Text(\n                  item.title,\n                  style: const TextStyle(fontSize: 14),\n                ),\n              ),\n            ),\n            SizedBox(height: 25 + MediaQuery.viewPaddingOf(context).bottom),\n          ],\n        );\n      },\n    );\n  }\n\n  //\n  void menuAction(int index, int id) {\n    double speed = speedList[index];\n    // 设置\n    if (id == 1) {\n      // 设置默认倍速\n      playSpeedDefault = speed;\n      video.put(VideoBoxKey.playSpeedDefault, playSpeedDefault);\n    } else if (id == 2) {\n      // 设置默认长按倍速\n      longPressSpeedDefault = speed;\n      video.put(VideoBoxKey.longPressSpeedDefault, longPressSpeedDefault);\n    } else if (id == -1) {\n      if ([\n        1.0,\n        playSpeedDefault,\n        longPressSpeedDefault,\n      ].contains(speed)) {\n        SmartDialog.showToast('不支持删除默认倍速');\n        return;\n      }\n      speedList.removeAt(index);\n      video.put(VideoBoxKey.speedsList, speedList);\n    }\n    setState(() {});\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        title: const Text('倍速设置'),\n        actions: [\n          TextButton(\n            onPressed: () async {\n              await video.delete(VideoBoxKey.speedsList);\n              speedList = Pref.speedList;\n              setState(() {});\n            },\n            child: const Text('重置'),\n          ),\n          const SizedBox(width: 16),\n        ],\n      ),\n      body: ViewSafeArea(\n        child: ListView(\n          children: [\n            Padding(\n              padding: const EdgeInsets.only(\n                left: 14,\n                right: 14,\n                top: 6,\n                bottom: 0,\n              ),\n              child: Text(\n                '点击下方按钮设置默认（长按）倍速',\n                style: TextStyle(color: theme.colorScheme.outline),\n              ),\n            ),\n            ListTile(\n              title: const Text('默认倍速'),\n              subtitle: Text(playSpeedDefault.toString()),\n            ),\n            SetSwitchItem(\n              title: '动态长按倍速',\n              subtitle: '根据默认倍速长按时自动双倍',\n              setKey: SettingBoxKey.enableAutoLongPressSpeed,\n              defaultVal: enableAutoLongPressSpeed,\n              onChanged: (val) =>\n                  setState(() => enableAutoLongPressSpeed = val),\n            ),\n            if (!enableAutoLongPressSpeed)\n              ListTile(\n                title: const Text('默认长按倍速'),\n                subtitle: Text(longPressSpeedDefault.toString()),\n              ),\n            Padding(\n              padding: const EdgeInsets.only(\n                left: 14,\n                right: 14,\n                bottom: 10,\n                top: 20,\n              ),\n              child: Row(\n                children: [\n                  Text(\n                    '倍速列表',\n                    style: theme.textTheme.titleMedium,\n                  ),\n                  const SizedBox(width: 12),\n                  TextButton(\n                    onPressed: onAddSpeed,\n                    child: const Text('添加'),\n                  ),\n                ],\n              ),\n            ),\n            Padding(\n              padding: const EdgeInsets.only(\n                left: 18,\n                right: 18,\n                bottom: 30,\n              ),\n              child: Wrap(\n                alignment: WrapAlignment.start,\n                spacing: 8,\n                runSpacing: 2,\n                children: List.generate(\n                  speedList.length,\n                  (index) => FilledButton.tonal(\n                    style: FilledButton.styleFrom(tapTargetSize: .padded),\n                    onPressed: () => showBottomSheet(theme, index),\n                    child: Text(speedList[index].toString()),\n                  ),\n                ),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/setting/play_setting.dart",
    "content": "import 'package:PiliPlus/pages/setting/models/play_settings.dart';\nimport 'package:flutter/material.dart';\n\nclass PlaySetting extends StatefulWidget {\n  const PlaySetting({super.key, this.showAppBar = true});\n\n  final bool showAppBar;\n\n  @override\n  State<PlaySetting> createState() => _PlaySettingState();\n}\n\nclass _PlaySettingState extends State<PlaySetting> {\n  final settings = playSettings;\n\n  @override\n  Widget build(BuildContext context) {\n    final showAppBar = widget.showAppBar;\n    final padding = MediaQuery.viewPaddingOf(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: showAppBar ? AppBar(title: const Text('播放器设置')) : null,\n      body: ListView.builder(\n        padding: EdgeInsets.only(\n          left: showAppBar ? padding.left : 0,\n          right: showAppBar ? padding.right : 0,\n          bottom: padding.bottom + 100,\n        ),\n        itemCount: settings.length,\n        itemBuilder: (context, index) => settings[index].widget,\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/setting/privacy_setting.dart",
    "content": "import 'package:PiliPlus/pages/setting/models/privacy_settings.dart';\nimport 'package:flutter/material.dart';\n\nclass PrivacySetting extends StatefulWidget {\n  const PrivacySetting({super.key, this.showAppBar = true});\n\n  final bool showAppBar;\n\n  @override\n  State<PrivacySetting> createState() => _PrivacySettingState();\n}\n\nclass _PrivacySettingState extends State<PrivacySetting> {\n  final settings = privacySettings;\n\n  @override\n  Widget build(BuildContext context) {\n    final showAppBar = widget.showAppBar;\n    final padding = MediaQuery.viewPaddingOf(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: showAppBar ? AppBar(title: const Text('隐私设置')) : null,\n      body: ListView(\n        padding: EdgeInsets.only(\n          left: showAppBar ? padding.left : 0,\n          right: showAppBar ? padding.right : 0,\n          bottom: padding.bottom + 100,\n        ),\n        children: settings.map((item) => item.widget).toList(),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/setting/recommend_setting.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/list_tile.dart';\nimport 'package:PiliPlus/pages/setting/models/recommend_settings.dart';\nimport 'package:flutter/material.dart' hide ListTile;\n\nclass RecommendSetting extends StatefulWidget {\n  const RecommendSetting({super.key, this.showAppBar = true});\n\n  final bool showAppBar;\n\n  @override\n  State<RecommendSetting> createState() => _RecommendSettingState();\n}\n\nclass _RecommendSettingState extends State<RecommendSetting> {\n  final list = recommendSettings;\n\n  @override\n  Widget build(BuildContext context) {\n    final showAppBar = widget.showAppBar;\n    final padding = MediaQuery.viewPaddingOf(context);\n    final theme = Theme.of(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: widget.showAppBar ? AppBar(title: const Text('推荐流设置')) : null,\n      body: ListView(\n        padding: EdgeInsets.only(\n          left: showAppBar ? padding.left : 0,\n          right: showAppBar ? padding.right : 0,\n          bottom: padding.bottom + 100,\n        ),\n        children: [\n          ...list.take(4).map((item) => item.widget),\n          const Divider(height: 1),\n          ...list.skip(4).map((item) => item.widget),\n          ListTile(\n            dense: true,\n            subtitle: Text(\n              '¹ 由于接口未提供关注信息，无法豁免相关视频中的已关注Up。\\n\\n'\n              '* 其它（如热门视频、手动搜索、链接跳转等）均不受过滤器影响。\\n'\n              '* 设定较严苛的条件可导致推荐项数锐减或多次请求，请酌情选择。\\n'\n              '* 后续可能会增加更多过滤条件，敬请期待。',\n              style: theme.textTheme.labelSmall!.copyWith(\n                color: theme.colorScheme.outline.withValues(alpha: 0.7),\n              ),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/setting/slide_color_picker.dart",
    "content": "import 'package:PiliPlus/utils/danmaku_utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart'\n    show LengthLimitingTextInputFormatter, FilteringTextInputFormatter;\nimport 'package:get/get.dart';\n\nclass SlideColorPicker extends StatefulWidget {\n  const SlideColorPicker({\n    super.key,\n    required this.color,\n    required this.onChanged,\n    this.showResetBtn = false,\n  });\n\n  final Color color;\n  final Function(Color? color) onChanged;\n  final bool showResetBtn;\n\n  @override\n  State<SlideColorPicker> createState() => _SlideColorPickerState();\n}\n\nclass _SlideColorPickerState extends State<SlideColorPicker> {\n  late int _rgb;\n  late final TextEditingController _textController;\n\n  @override\n  void initState() {\n    super.initState();\n    _rgb = widget.color.toARGB32() & 0xFFFFFF;\n    _textController = TextEditingController(text: _convert);\n  }\n\n  @override\n  void dispose() {\n    _textController.dispose();\n    super.dispose();\n  }\n\n  String get _convert => _rgb.toRadixString(16).toUpperCase().padLeft(6, '0');\n\n  Widget _slider({\n    required String title,\n    required int value,\n    required ValueChanged<double> onChanged,\n  }) {\n    return Row(\n      children: [\n        const SizedBox(width: 16),\n        SizedBox(\n          width: MediaQuery.textScalerOf(context).scale(16),\n          child: Text(title),\n        ),\n        const SizedBox(width: 12),\n        Expanded(\n          child: SliderTheme(\n            data: SliderTheme.of(context).copyWith(\n              trackHeight: 10,\n              thumbSize: const WidgetStatePropertyAll(Size(4, 25)),\n            ),\n            child: Slider(\n              padding: EdgeInsets.zero,\n              min: 0,\n              max: 255,\n              divisions: 255,\n              value: value.toDouble(),\n              onChanged: onChanged,\n            ),\n          ),\n        ),\n        const SizedBox(width: 12),\n        SizedBox(\n          width: MediaQuery.textScalerOf(context).scale(25) + 16,\n          child: Text(\n            value.toString(),\n            textAlign: TextAlign.start,\n          ),\n        ),\n      ],\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return SingleChildScrollView(\n      child: Column(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          Container(\n            height: 100,\n            color: DmUtils.decimalToColor(_rgb),\n          ),\n          const SizedBox(height: 10),\n          IntrinsicWidth(\n            child: TextField(\n              inputFormatters: [\n                LengthLimitingTextInputFormatter(6),\n                FilteringTextInputFormatter.allow(RegExp('[0-9a-fA-F]')),\n              ],\n              controller: _textController,\n              decoration: const InputDecoration(\n                isDense: true,\n                prefixText: '#',\n                contentPadding: EdgeInsets.zero,\n              ),\n              onChanged: (value) {\n                _textController.text = value.toUpperCase();\n                if (value.length == 6) {\n                  setState(() {\n                    _rgb = int.tryParse(value, radix: 16) ?? 0;\n                  });\n                }\n              },\n            ),\n          ),\n          _slider(\n            title: 'R',\n            value: _rgb >> 16,\n            onChanged: (value) {\n              setState(() {\n                _rgb = _rgb.setByte(value.round(), 16);\n                _textController.text = _convert;\n              });\n            },\n          ),\n          _slider(\n            title: 'G',\n            value: (_rgb >> 8) & 0xFF,\n            onChanged: (value) {\n              setState(() {\n                _rgb = _rgb.setByte(value.round(), 8);\n                _textController.text = _convert;\n              });\n            },\n          ),\n          _slider(\n            title: 'B',\n            value: _rgb & 0xFF,\n            onChanged: (value) {\n              setState(() {\n                _rgb = _rgb.setByte(value.round(), 0);\n                _textController.text = _convert;\n              });\n            },\n          ),\n          Row(\n            children: [\n              if (widget.showResetBtn) ...[\n                const SizedBox(width: 16),\n                TextButton(\n                  onPressed: () {\n                    Get.back();\n                    widget.onChanged(null);\n                  },\n                  child: const Text('重置'),\n                ),\n              ],\n              const Spacer(),\n              TextButton(\n                onPressed: Get.back,\n                child: Text(\n                  '取消',\n                  style: TextStyle(\n                    color: Theme.of(context).colorScheme.outline,\n                  ),\n                ),\n              ),\n              TextButton(\n                onPressed: () {\n                  Get.back();\n                  widget.onChanged(DmUtils.decimalToColor(_rgb));\n                },\n                child: const Text('确定'),\n              ),\n              const SizedBox(width: 16),\n            ],\n          ),\n        ],\n      ),\n    );\n  }\n}\n\nextension on int {\n  @pragma(\"vm:prefer-inline\")\n  int setByte(int value, int shift) =>\n      (this & ~(0xFF << shift)) | (value << shift);\n}\n"
  },
  {
    "path": "lib/pages/setting/style_setting.dart",
    "content": "import 'package:PiliPlus/pages/setting/models/style_settings.dart';\nimport 'package:flutter/material.dart';\n\nclass StyleSetting extends StatefulWidget {\n  const StyleSetting({super.key, this.showAppBar = true});\n\n  final bool showAppBar;\n\n  @override\n  State<StyleSetting> createState() => _StyleSettingState();\n}\n\nclass _StyleSettingState extends State<StyleSetting> {\n  final settings = styleSettings;\n\n  @override\n  Widget build(BuildContext context) {\n    final showAppBar = widget.showAppBar;\n    final padding = MediaQuery.viewPaddingOf(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: showAppBar ? AppBar(title: const Text('外观设置')) : null,\n      body: ListView.builder(\n        padding: EdgeInsets.only(\n          left: showAppBar ? padding.left : 0,\n          right: showAppBar ? padding.right : 0,\n          bottom: padding.bottom + 100,\n        ),\n        itemCount: settings.length,\n        itemBuilder: (context, index) => settings[index].widget,\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/setting/video_setting.dart",
    "content": "import 'package:PiliPlus/pages/setting/models/video_settings.dart';\nimport 'package:flutter/material.dart';\n\nclass VideoSetting extends StatefulWidget {\n  const VideoSetting({super.key, this.showAppBar = true});\n\n  final bool showAppBar;\n\n  @override\n  State<VideoSetting> createState() => _VideoSettingState();\n}\n\nclass _VideoSettingState extends State<VideoSetting> {\n  final settings = videoSettings;\n\n  @override\n  Widget build(BuildContext context) {\n    final showAppBar = widget.showAppBar;\n    final padding = MediaQuery.viewPaddingOf(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: showAppBar ? AppBar(title: const Text('音视频设置')) : null,\n      body: ListView.builder(\n        padding: EdgeInsets.only(\n          left: showAppBar ? padding.left : 0,\n          right: showAppBar ? padding.right : 0,\n          bottom: padding.bottom + 100,\n        ),\n        itemCount: settings.length,\n        itemBuilder: (context, index) => settings[index].widget,\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/setting/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/list_tile.dart';\nimport 'package:PiliPlus/common/widgets/view_safe_area.dart';\nimport 'package:PiliPlus/http/login.dart';\nimport 'package:PiliPlus/models/common/setting_type.dart';\nimport 'package:PiliPlus/pages/about/view.dart';\nimport 'package:PiliPlus/pages/login/controller.dart';\nimport 'package:PiliPlus/pages/setting/extra_setting.dart';\nimport 'package:PiliPlus/pages/setting/play_setting.dart';\nimport 'package:PiliPlus/pages/setting/privacy_setting.dart';\nimport 'package:PiliPlus/pages/setting/recommend_setting.dart';\nimport 'package:PiliPlus/pages/setting/style_setting.dart';\nimport 'package:PiliPlus/pages/setting/video_setting.dart';\nimport 'package:PiliPlus/pages/setting/widgets/multi_select_dialog.dart';\nimport 'package:PiliPlus/pages/webdav/view.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/accounts/account.dart';\nimport 'package:PiliPlus/utils/extension/size_ext.dart';\nimport 'package:flutter/material.dart' hide ListTile;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\n\nclass _SettingsModel {\n  final SettingType type;\n  final String? subtitle;\n  final Icon icon;\n\n  const _SettingsModel({\n    required this.type,\n    this.subtitle,\n    required this.icon,\n  });\n}\n\nclass SettingPage extends StatefulWidget {\n  const SettingPage({super.key});\n\n  @override\n  State<SettingPage> createState() => _SettingPageState();\n}\n\nclass _SettingPageState extends State<SettingPage> {\n  late SettingType _type = SettingType.privacySetting;\n  final RxBool _noAccount = Accounts.account.isEmpty.obs;\n  late bool _isPortrait;\n\n  static const List<_SettingsModel> _items = [\n    _SettingsModel(\n      type: SettingType.privacySetting,\n      subtitle: '黑名单、无痕模式',\n      icon: Icon(Icons.privacy_tip_outlined),\n    ),\n    _SettingsModel(\n      type: SettingType.recommendSetting,\n      subtitle: '推荐来源（web/app）、刷新保留内容、过滤器',\n      icon: Icon(Icons.explore_outlined),\n    ),\n    _SettingsModel(\n      type: SettingType.videoSetting,\n      subtitle: '画质、音质、解码、缓冲、音频输出等',\n      icon: Icon(Icons.video_settings_outlined),\n    ),\n    _SettingsModel(\n      type: SettingType.playSetting,\n      subtitle: '双击/长按、全屏、后台播放、弹幕、字幕、底部进度条等',\n      icon: Icon(Icons.touch_app_outlined),\n    ),\n    _SettingsModel(\n      type: SettingType.styleSetting,\n      subtitle: '横屏适配（平板）、侧栏、列宽、首页、动态红点、主题、字号、图片、帧率等',\n      icon: Icon(Icons.style_outlined),\n    ),\n    _SettingsModel(\n      type: SettingType.extraSetting,\n      subtitle: '震动、搜索、收藏、ai、评论、动态、代理、更新检查等',\n      icon: Icon(Icons.extension_outlined),\n    ),\n    _SettingsModel(\n      type: SettingType.webdavSetting,\n      icon: Icon(MdiIcons.databaseCogOutline),\n    ),\n    _SettingsModel(\n      type: SettingType.about,\n      icon: Icon(Icons.info_outline),\n    ),\n  ];\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    _isPortrait = MediaQuery.sizeOf(context).isPortrait;\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        title: _isPortrait ? const Text('设置') : Text(_type.title),\n      ),\n      body: ViewSafeArea(\n        child: _isPortrait\n            ? _buildList(theme)\n            : Row(\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  Expanded(\n                    flex: 4,\n                    child: _buildList(theme),\n                  ),\n                  VerticalDivider(\n                    width: 1,\n                    color: theme.colorScheme.outline.withValues(alpha: 0.1),\n                  ),\n                  Expanded(\n                    flex: 6,\n                    child: switch (_type) {\n                      SettingType.privacySetting => const PrivacySetting(\n                        showAppBar: false,\n                      ),\n                      SettingType.recommendSetting => const RecommendSetting(\n                        showAppBar: false,\n                      ),\n                      SettingType.videoSetting => const VideoSetting(\n                        showAppBar: false,\n                      ),\n                      SettingType.playSetting => const PlaySetting(\n                        showAppBar: false,\n                      ),\n                      SettingType.styleSetting => const StyleSetting(\n                        showAppBar: false,\n                      ),\n                      SettingType.extraSetting => const ExtraSetting(\n                        showAppBar: false,\n                      ),\n                      SettingType.webdavSetting => const WebDavSettingPage(\n                        showAppBar: false,\n                      ),\n                      SettingType.about => const AboutPage(showAppBar: false),\n                    },\n                  ),\n                ],\n              ),\n      ),\n    );\n  }\n\n  @override\n  void dispose() {\n    _noAccount.close();\n    super.dispose();\n  }\n\n  void _toPage(SettingType type) {\n    if (_isPortrait) {\n      Get.toNamed('/${type.name}');\n    } else {\n      _type = type;\n      setState(() {});\n    }\n  }\n\n  Color? _getTileColor(ThemeData theme, SettingType type) {\n    if (_isPortrait) {\n      return null;\n    } else {\n      return type == _type ? theme.colorScheme.onInverseSurface : null;\n    }\n  }\n\n  Widget _buildList(ThemeData theme) {\n    final padding = MediaQuery.viewPaddingOf(context);\n    TextStyle titleStyle = theme.textTheme.titleMedium!;\n    TextStyle subTitleStyle = theme.textTheme.labelMedium!.copyWith(\n      color: theme.colorScheme.outline,\n    );\n    return ListView(\n      padding: EdgeInsets.only(bottom: padding.bottom + 100),\n      children: [\n        _buildSearchItem(theme),\n        ..._items\n            .take(_items.length - 1)\n            .map(\n              (item) => ListTile(\n                tileColor: _getTileColor(theme, item.type),\n                onTap: () => _toPage(item.type),\n                leading: item.icon,\n                title: Text(item.type.title, style: titleStyle),\n                subtitle: item.subtitle == null\n                    ? null\n                    : Text(item.subtitle!, style: subTitleStyle),\n              ),\n            ),\n        ListTile(\n          onTap: () => LoginPageController.switchAccountDialog(context),\n          leading: const Icon(Icons.switch_account_outlined),\n          title: Text('设置账号模式', style: titleStyle),\n        ),\n        Obx(\n          () => _noAccount.value\n              ? const SizedBox.shrink()\n              : ListTile(\n                  leading: const Icon(Icons.logout_outlined),\n                  onTap: () => _logoutDialog(context),\n                  title: Text('退出登录', style: titleStyle),\n                ),\n        ),\n        ListTile(\n          tileColor: _getTileColor(theme, _items.last.type),\n          onTap: () => _toPage(_items.last.type),\n          leading: _items.last.icon,\n          title: Text(_items.last.type.title, style: titleStyle),\n        ),\n      ],\n    );\n  }\n\n  Future<void> _logoutDialog(BuildContext context) async {\n    final result = await showDialog<Set<LoginAccount>>(\n      context: context,\n      builder: (context) => MultiSelectDialog<LoginAccount>(\n        title: '选择要登出的账号uid',\n        initValues: const Iterable.empty(),\n        values: {\n          for (final i in Accounts.account.values) i: i.mid.toString(),\n        },\n      ),\n    );\n    if (!context.mounted || result == null || result.isEmpty) return;\n    Future<void> logout() {\n      _noAccount.value = result.length == Accounts.account.length;\n      return Accounts.deleteAll(result);\n    }\n\n    showDialog(\n      context: context,\n      builder: (context) {\n        final theme = Theme.of(context);\n        return AlertDialog(\n          title: const Text('提示'),\n          content: Text(\n            \"确认要退出以下账号登录吗\\n\\n${result.map((i) => i.mid.toString()).join('\\n')}\",\n          ),\n          actions: [\n            TextButton(\n              onPressed: Get.back,\n              child: Text(\n                '点错了',\n                style: TextStyle(\n                  color: theme.colorScheme.outline,\n                ),\n              ),\n            ),\n            TextButton(\n              onPressed: () {\n                Get.back();\n                logout();\n              },\n              child: Text(\n                '仅登出',\n                style: TextStyle(color: theme.colorScheme.error),\n              ),\n            ),\n            TextButton(\n              onPressed: () async {\n                SmartDialog.showLoading();\n                final res = await LoginHttp.logout(Accounts.main);\n                if (res['status']) {\n                  SmartDialog.dismiss();\n                  logout();\n                  Get.back();\n                } else {\n                  SmartDialog.dismiss();\n                  SmartDialog.showToast(res['msg'].toString());\n                }\n              },\n              child: const Text('确认'),\n            ),\n          ],\n        );\n      },\n    );\n  }\n\n  Widget _buildSearchItem(ThemeData theme) => Padding(\n    padding: const EdgeInsets.only(\n      left: 16,\n      right: 16,\n      bottom: 8,\n    ),\n    child: Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onTap: () => Get.toNamed('/settingsSearch'),\n        borderRadius: const BorderRadius.all(Radius.circular(50)),\n        child: Ink(\n          padding: const EdgeInsets.symmetric(vertical: 8),\n          decoration: BoxDecoration(\n            borderRadius: const BorderRadius.all(Radius.circular(50)),\n            color: theme.colorScheme.onInverseSurface,\n          ),\n          child: const Center(\n            child: Row(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                Icon(\n                  size: 18,\n                  applyTextScaling: true,\n                  Icons.search,\n                ),\n                Text(\n                  ' 搜索',\n                  style: TextStyle(height: 1),\n                  strutStyle: StrutStyle(height: 1, leading: 0),\n                ),\n              ],\n            ),\n          ),\n        ),\n      ),\n    ),\n  );\n}\n"
  },
  {
    "path": "lib/pages/setting/widgets/checkbox_num.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass OrderedCheckbox extends StatelessWidget {\n  const OrderedCheckbox({\n    super.key,\n    required this.value,\n    required this.onChanged,\n  }) : assert(value == null || value < 100);\n\n  final int? value;\n  final ValueChanged<int?>? onChanged;\n  bool get selected => value != null;\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n\n    final child = DecoratedBox(\n      decoration: BoxDecoration(\n        borderRadius: const BorderRadius.all(Radius.circular(1.5)),\n        border: Border.all(\n          color: selected\n              ? theme.colorScheme.primary\n              : theme.colorScheme.onSurface,\n          width: 1.6,\n          strokeAlign: BorderSide.strokeAlignCenter,\n        ),\n        color: selected ? theme.colorScheme.primary : null,\n      ),\n      child: selected\n          ? SizedBox.square(\n              dimension: 16.5,\n              child: Center(\n                child: Text(\n                  value.toString(),\n                  style: TextStyle(\n                    inherit: false,\n                    color: theme.colorScheme.onPrimary,\n                    fontSize: 12,\n                    fontWeight: FontWeight.bold,\n                    shadows: theme.iconTheme.shadows,\n                    height: 1.0,\n                    leadingDistribution: TextLeadingDistribution.even,\n                  ),\n                ),\n              ),\n            )\n          : const SizedBox.square(dimension: 16.5),\n    );\n    if (onChanged != null) {\n      return InkWell(\n        onTap: () => onChanged!(value),\n        child: child,\n      );\n    }\n    return child;\n  }\n}\n"
  },
  {
    "path": "lib/pages/setting/widgets/checkbox_num_list_tile.dart",
    "content": "import 'package:PiliPlus/pages/setting/widgets/checkbox_num.dart';\nimport 'package:flutter/material.dart';\n\nclass OrderedCheckboxListTile extends StatelessWidget {\n  /// Creates a combination of a list tile and a checkbox.\n  ///\n  /// The checkbox tile itself does not maintain any state. Instead, when the\n  /// state of the checkbox changes, the widget calls the [onChanged] callback.\n  /// Most widgets that use a checkbox will listen for the [onChanged] callback\n  /// and rebuild the checkbox tile with a new [value] to update the visual\n  /// appearance of the checkbox.\n  ///\n  /// The following arguments are required:\n  ///\n  /// * [value], which determines whether the checkbox is checked. The [value]\n  ///   can only be null if [tristate] is true.\n  /// * [onChanged], which is called when the value of the checkbox should\n  ///   change. It can be set to null to disable the checkbox.\n  const OrderedCheckboxListTile({\n    super.key,\n    required this.value,\n    required this.onChanged,\n    this.activeColor,\n    this.visualDensity,\n    this.focusNode,\n    this.autofocus = false,\n    this.shape,\n    this.tileColor,\n    this.title,\n    this.subtitle,\n    this.isThreeLine,\n    this.dense,\n    this.trailing,\n    this.contentPadding,\n    this.selectedTileColor,\n    this.onFocusChange,\n    this.enableFeedback,\n    this.checkboxScaleFactor = 1.0,\n    this.titleAlignment,\n    this.internalAddSemanticForOnTap = false,\n  }) : assert(isThreeLine != true || subtitle != null);\n\n  /// Whether this checkbox is checked.\n  final int? value;\n\n  /// Called when the value of the checkbox should change.\n  ///\n  /// The checkbox passes the new value to the callback but does not actually\n  /// change state until the parent widget rebuilds the checkbox tile with the\n  /// new value.\n  ///\n  /// If null, the checkbox will be displayed as disabled.\n  ///\n  /// {@tool snippet}\n  ///\n  /// The callback provided to [onChanged] should update the state of the parent\n  /// [StatefulWidget] using the [State.setState] method, so that the parent\n  /// gets rebuilt; for example:\n  ///\n  /// ```dart\n  /// CheckboxListTile(\n  ///   value: _throwShotAway,\n  ///   onChanged: (bool? newValue) {\n  ///     setState(() {\n  ///       _throwShotAway = newValue;\n  ///     });\n  ///   },\n  ///   title: const Text('Throw away your shot'),\n  /// )\n  /// ```\n  /// {@end-tool}\n  final ValueChanged<int?>? onChanged;\n\n  /// The color to use when this checkbox is checked.\n  ///\n  /// Defaults to [ColorScheme.secondary] of the current [Theme].\n  final Color? activeColor;\n\n  /// Defines how compact the list tile's layout will be.\n  ///\n  /// {@macro flutter.material.themedata.visualDensity}\n  final VisualDensity? visualDensity;\n\n  /// {@macro flutter.widgets.Focus.focusNode}\n  final FocusNode? focusNode;\n\n  /// {@macro flutter.widgets.Focus.autofocus}\n  final bool autofocus;\n\n  /// {@macro flutter.material.ListTile.shape}\n  final ShapeBorder? shape;\n\n  /// {@macro flutter.material.ListTile.tileColor}\n  final Color? tileColor;\n\n  /// The primary content of the list tile.\n  ///\n  /// Typically a [Text] widget.\n  final Widget? title;\n\n  /// Additional content displayed below the title.\n  ///\n  /// Typically a [Text] widget.\n  final Widget? subtitle;\n\n  /// A widget to display on the opposite side of the tile from the checkbox.\n  ///\n  /// Typically an [Icon] widget.\n  final Widget? trailing;\n\n  /// Whether this list tile is intended to display three lines of text.\n  ///\n  /// If null, the value from [ListTileThemeData.isThreeLine] is used.\n  /// If that is also null, the value from [ThemeData.listTileTheme] is used.\n  /// If still null, the default value is `false`.\n  final bool? isThreeLine;\n\n  /// Whether this list tile is part of a vertically dense list.\n  ///\n  /// If this property is null then its value is based on [ListTileThemeData.dense].\n  final bool? dense;\n\n  /// Defines insets surrounding the tile's contents.\n  ///\n  /// This value will surround the [Checkbox], [title], [subtitle], and [trailing]\n  /// widgets in [OrderedCheckboxListTile].\n  ///\n  /// When the value is null, the [contentPadding] is `EdgeInsets.symmetric(horizontal: 16.0)`.\n  final EdgeInsetsGeometry? contentPadding;\n\n  /// If non-null, defines the background color when [OrderedCheckboxListTile.selected] is true.\n  final Color? selectedTileColor;\n\n  /// {@macro flutter.material.inkwell.onFocusChange}\n  final ValueChanged<bool>? onFocusChange;\n\n  /// {@macro flutter.material.ListTile.enableFeedback}\n  ///\n  /// See also:\n  ///\n  ///  * [Feedback] for providing platform-specific feedback to certain actions.\n  final bool? enableFeedback;\n\n  /// Defines how [ListTile.leading] and [ListTile.trailing] are\n  /// vertically aligned relative to the [ListTile]'s titles\n  /// ([ListTile.title] and [ListTile.subtitle]).\n  ///\n  /// If this property is null then [ListTileThemeData.titleAlignment]\n  /// is used. If that is also null then [ListTileTitleAlignment.threeLine]\n  /// is used.\n  ///\n  /// See also:\n  ///\n  /// * [ListTileTheme.of], which returns the nearest [ListTileTheme]'s\n  ///   [ListTileThemeData].\n  final ListTileTitleAlignment? titleAlignment;\n\n  /// Whether to add button:true to the semantics if onTap is provided.\n  /// This is a temporary flag to help changing the behavior of ListTile onTap semantics.\n  ///\n  // the default value to true.\n  final bool internalAddSemanticForOnTap;\n\n  /// Controls the scaling factor applied to the [Checkbox] within the [OrderedCheckboxListTile].\n  ///\n  /// Defaults to 1.0.\n  final double checkboxScaleFactor;\n\n  @override\n  Widget build(BuildContext context) {\n    Widget control;\n\n    control = OrderedCheckbox(value: value, onChanged: null);\n    if (checkboxScaleFactor != 1.0) {\n      control = Transform.scale(scale: checkboxScaleFactor, child: control);\n    }\n\n    final ThemeData theme = Theme.of(context);\n    final CheckboxThemeData checkboxTheme = CheckboxTheme.of(context);\n    final Set<WidgetState> states = <WidgetState>{\n      if (value != null) WidgetState.selected,\n    };\n    final Color effectiveActiveColor =\n        activeColor ??\n        checkboxTheme.fillColor?.resolve(states) ??\n        theme.colorScheme.secondary;\n    return MergeSemantics(\n      child: ListTile(\n        selectedColor: effectiveActiveColor,\n        leading: control,\n        title: title,\n        subtitle: subtitle,\n        trailing: trailing,\n        isThreeLine: isThreeLine,\n        dense: dense,\n        enabled: onChanged != null,\n        onTap: onChanged != null ? () => onChanged!(value) : null,\n        selected: value != null,\n        autofocus: autofocus,\n        contentPadding: contentPadding,\n        shape: shape,\n        selectedTileColor: selectedTileColor,\n        tileColor: tileColor,\n        visualDensity: visualDensity,\n        focusNode: focusNode,\n        onFocusChange: onFocusChange,\n        enableFeedback: enableFeedback,\n        titleAlignment: titleAlignment,\n        internalAddSemanticForOnTap: internalAddSemanticForOnTap,\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/setting/widgets/dual_slider_dialog.dart",
    "content": "import 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:flutter/material.dart';\n\nclass DualSliderDialog extends StatefulWidget {\n  final double value1;\n  final double value2;\n  final String title;\n  final String description1;\n  final String description2;\n  final double min;\n  final double max;\n  final int? divisions;\n  final String suffix;\n  final int precise;\n\n  const DualSliderDialog({\n    super.key,\n    required this.value1,\n    required this.value2,\n    required this.description1,\n    required this.description2,\n    required this.title,\n    required this.min,\n    required this.max,\n    this.divisions,\n    this.suffix = '',\n    this.precise = 1,\n  });\n\n  @override\n  State<DualSliderDialog> createState() => _DualSliderDialogState();\n}\n\nclass _DualSliderDialogState extends State<DualSliderDialog> {\n  late double _tempValue1;\n  late double _tempValue2;\n\n  @override\n  void initState() {\n    super.initState();\n    _tempValue1 = widget.value1;\n    _tempValue2 = widget.value2;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return AlertDialog(\n      title: Text(widget.title),\n      contentPadding: const EdgeInsets.only(\n        top: 20,\n        left: 8,\n        right: 8,\n        bottom: 8,\n      ),\n      content: Column(\n        mainAxisSize: .min,\n        children: [\n          Text(widget.description1),\n          Builder(\n            builder: (context) {\n              return Slider(\n                value: _tempValue1,\n                min: widget.min,\n                max: widget.max,\n                divisions: widget.divisions,\n                label:\n                    '${_tempValue1.toStringAsFixed(widget.precise)}${widget.suffix}',\n                onChanged: (double value) {\n                  _tempValue1 = value.toPrecision(widget.precise);\n                  (context as Element).markNeedsBuild();\n                },\n              );\n            },\n          ),\n          Text(widget.description2),\n          Builder(\n            builder: (context) {\n              return Slider(\n                value: _tempValue2,\n                min: widget.min,\n                max: widget.max,\n                divisions: widget.divisions,\n                label:\n                    '${_tempValue2.toStringAsFixed(widget.precise)}${widget.suffix}',\n                onChanged: (double value) {\n                  _tempValue2 = value.toPrecision(widget.precise);\n                  (context as Element).markNeedsBuild();\n                },\n              );\n            },\n          ),\n        ],\n      ),\n      actions: [\n        TextButton(\n          onPressed: Navigator.of(context).pop,\n          child: Text(\n            '取消',\n            style: TextStyle(color: Theme.of(context).colorScheme.outline),\n          ),\n        ),\n        TextButton(\n          onPressed: () => Navigator.pop(context, (_tempValue1, _tempValue2)),\n          child: const Text('确定'),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/setting/widgets/multi_select_dialog.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass MultiSelectDialog<T> extends StatefulWidget {\n  final Iterable<T> initValues;\n  final String title;\n  final Map<T, String> values;\n\n  const MultiSelectDialog({\n    super.key,\n    required this.initValues,\n    required this.values,\n    required this.title,\n  });\n\n  @override\n  State<MultiSelectDialog<T>> createState() => _MultiSelectDialogState<T>();\n}\n\nclass _MultiSelectDialogState<T> extends State<MultiSelectDialog<T>> {\n  late Set<T> _tempValues;\n\n  @override\n  void initState() {\n    super.initState();\n    _tempValues = widget.initValues.toSet();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    return AlertDialog(\n      clipBehavior: Clip.hardEdge,\n      title: Text(widget.title),\n      contentPadding: const EdgeInsets.only(top: 12),\n      content: Material(\n        type: .transparency,\n        child: SingleChildScrollView(\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: widget.values.entries.map((i) {\n              return Builder(\n                builder: (context) {\n                  bool isChecked = _tempValues.contains(i.key);\n                  return CheckboxListTile(\n                    dense: true,\n                    value: isChecked,\n                    controlAffinity: ListTileControlAffinity.leading,\n                    title: Text(\n                      i.value,\n                      style: theme.textTheme.titleMedium!,\n                    ),\n                    onChanged: (value) {\n                      isChecked\n                          ? _tempValues.remove(i.key)\n                          : _tempValues.add(i.key);\n                      (context as Element).markNeedsBuild();\n                    },\n                  );\n                },\n              );\n            }).toList(),\n          ),\n        ),\n      ),\n      actionsPadding: const EdgeInsets.only(left: 16, right: 16, bottom: 12),\n      actions: [\n        TextButton(\n          onPressed: Get.back,\n          child: Text(\n            '取消',\n            style: TextStyle(\n              color: theme.colorScheme.outline,\n            ),\n          ),\n        ),\n        TextButton(\n          onPressed: () => Get.back(result: _tempValues),\n          child: const Text('确定'),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/setting/widgets/normal_item.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/list_tile.dart';\nimport 'package:flutter/material.dart' hide ListTile;\n\nclass NormalItem extends StatefulWidget {\n  final String? title;\n  final ValueGetter<String>? getTitle;\n  final String? subtitle;\n  final ValueGetter<String>? getSubtitle;\n  final Widget? leading;\n  final Widget Function(ThemeData theme)? getTrailing;\n  final void Function(BuildContext context, VoidCallback setState)? onTap;\n  final EdgeInsetsGeometry? contentPadding;\n  final TextStyle? titleStyle;\n\n  const NormalItem({\n    this.title,\n    this.getTitle,\n    this.subtitle,\n    this.getSubtitle,\n    this.leading,\n    this.getTrailing,\n    this.onTap,\n    this.contentPadding,\n    this.titleStyle,\n    super.key,\n  }) : assert(title != null || getTitle != null);\n\n  @override\n  State<NormalItem> createState() => _NormalItemState();\n}\n\nclass _NormalItemState extends State<NormalItem> {\n  @override\n  Widget build(BuildContext context) {\n    late final theme = Theme.of(context);\n    Widget? subtitle;\n    if ((widget.subtitle ?? widget.getSubtitle?.call()) case final text?) {\n      subtitle = Text(\n        text,\n        style: theme.textTheme.labelMedium!.copyWith(\n          color: theme.colorScheme.outline,\n        ),\n      );\n    }\n    return ListTile(\n      contentPadding: widget.contentPadding,\n      onTap: widget.onTap == null\n          ? null\n          : () => widget.onTap!(context, refresh),\n      title: Text(\n        widget.title ?? widget.getTitle!(),\n        style: widget.titleStyle ?? theme.textTheme.titleMedium!,\n      ),\n      subtitle: subtitle,\n      leading: widget.leading,\n      trailing: widget.getTrailing?.call(theme),\n    );\n  }\n\n  void refresh() {\n    if (mounted) {\n      setState(() {});\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/setting/widgets/ordered_multi_select_dialog.dart",
    "content": "import 'package:PiliPlus/pages/setting/widgets/checkbox_num_list_tile.dart';\nimport 'package:collection/collection.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass OrderedMultiSelectDialog<T> extends StatefulWidget {\n  final Iterable<T> initValues;\n  final String title;\n  final Map<T, String> values;\n\n  const OrderedMultiSelectDialog({\n    super.key,\n    required this.initValues,\n    required this.values,\n    required this.title,\n  });\n\n  @override\n  State<OrderedMultiSelectDialog<T>> createState() =>\n      _OrderedMultiSelectDialogState<T>();\n}\n\nclass _OrderedMultiSelectDialogState<T>\n    extends State<OrderedMultiSelectDialog<T>> {\n  late Map<T, int> _tempValues;\n\n  @override\n  void initState() {\n    super.initState();\n    _tempValues = {for (final (i, j) in widget.initValues.indexed) j: i + 1};\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    return AlertDialog(\n      clipBehavior: Clip.hardEdge,\n      title: Text(widget.title),\n      contentPadding: const EdgeInsets.only(top: 12),\n      content: Material(\n        type: .transparency,\n        child: SingleChildScrollView(\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: widget.values.entries.map((i) {\n              return Builder(\n                builder: (context) {\n                  return OrderedCheckboxListTile(\n                    dense: true,\n                    value: _tempValues[i.key],\n                    title: Text(\n                      i.value,\n                      style: theme.textTheme.titleMedium!,\n                    ),\n                    onChanged: (value) {\n                      if (value == null) {\n                        _tempValues[i.key] = _tempValues.length + 1;\n                        (context as Element).markNeedsBuild();\n                      } else {\n                        final pos = _tempValues.remove(i.key)!;\n                        if (pos == _tempValues.length + 1) {\n                          (context as Element).markNeedsBuild();\n                        } else {\n                          _tempValues.updateAll(\n                            (key, value) => value > pos ? value - 1 : value,\n                          );\n                          setState(() {});\n                        }\n                      }\n                    },\n                  );\n                },\n              );\n            }).toList(),\n          ),\n        ),\n      ),\n      actionsPadding: const EdgeInsets.only(left: 16, right: 16, bottom: 12),\n      actions: [\n        TextButton(\n          onPressed: Get.back,\n          child: Text(\n            '取消',\n            style: TextStyle(\n              color: theme.colorScheme.outline,\n            ),\n          ),\n        ),\n        TextButton(\n          onPressed: () {\n            assert(_tempValues.values.isSorted((a, b) => a.compareTo(b)));\n            Get.back(result: _tempValues.keys.toList());\n          },\n          child: const Text('确定'),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/setting/widgets/popup_item.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/list_tile.dart';\nimport 'package:PiliPlus/models/common/enum_with_label.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide ListTile;\n\ntypedef PopupMenuItemSelected<T> =\n    void Function(T value, VoidCallback setState);\n\nList<PopupMenuEntry<T>> enumItemBuilder<T extends EnumWithLabel>(\n  List<T> items,\n) => items.map((e) => PopupMenuItem(value: e, child: Text(e.label))).toList();\n\nenum DescPosType { subtitle, title, trailing }\n\nclass PopupListTile<T> extends StatefulWidget {\n  const PopupListTile({\n    super.key,\n    this.dense,\n    this.safeArea = true,\n    this.enabled = true,\n    this.leading,\n    required this.title,\n    this.descPosType = .subtitle,\n    required this.value,\n    required this.itemBuilder,\n    required this.onSelected,\n    this.descFontSize = 13,\n  });\n\n  final bool? dense;\n  final bool safeArea;\n  final bool enabled;\n  final Widget? leading;\n  final Widget title;\n\n  final DescPosType descPosType;\n  final ValueGetter<(T, String)> value;\n  final PopupMenuItemBuilder<T> itemBuilder;\n  final PopupMenuItemSelected<T> onSelected;\n  final double descFontSize;\n\n  @override\n  State<PopupListTile<T>> createState() => _PopupListTileState<T>();\n}\n\nclass _PopupListTileState<T> extends State<PopupListTile<T>> {\n  final _key = PlatformUtils.isDesktop ? null : GlobalKey();\n\n  void _showButtonMenu(TapUpDetails details, T value) {\n    final thisOffset = details.globalPosition - details.localPosition;\n    final double dx;\n    if (PlatformUtils.isDesktop) {\n      dx = details.globalPosition.dx + 1;\n    } else {\n      final thisBox = context.findRenderObject() as RenderBox;\n      final titleBox = _key!.currentContext!.findRenderObject() as RenderBox;\n      final titleOffset = titleBox.localToGlobal(.zero, ancestor: thisBox);\n      dx = thisOffset.dx + titleOffset.dx;\n    }\n    showMenu<T?>(\n      context: context,\n      position: RelativeRect.fromLTRB(dx, thisOffset.dy + 5, dx, 0),\n      items: widget.itemBuilder(context),\n      initialValue: value,\n      requestFocus: false,\n    ).then<void>((T? newValue) {\n      if (!mounted) {\n        return;\n      }\n      if (newValue == null || newValue == value) {\n        return;\n      }\n      widget.onSelected(newValue, _refresh);\n    });\n  }\n\n  void _refresh() {\n    if (mounted) {\n      setState(() {});\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    final (value, descStr) = widget.value();\n    Widget title = KeyedSubtree(key: _key, child: widget.title);\n    Widget? subtitle;\n    Widget? trailing;\n    final desc = Text(\n      descStr,\n      style: TextStyle(\n        fontSize: widget.descFontSize,\n        color: widget.enabled\n            ? theme.colorScheme.secondary\n            : theme.disabledColor,\n      ),\n    );\n    switch (widget.descPosType) {\n      case DescPosType.subtitle:\n        subtitle = desc;\n      case DescPosType.title:\n        title = Row(\n          spacing: 12,\n          mainAxisSize: .min,\n          children: [title, desc],\n        );\n      case DescPosType.trailing:\n        trailing = desc;\n    }\n    return ListTile(\n      dense: widget.dense,\n      safeArea: widget.safeArea,\n      enabled: widget.enabled,\n      onTapUp: (details) => _showButtonMenu(details, value),\n      leading: widget.leading,\n      title: title,\n      subtitle: subtitle,\n      trailing: trailing,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/setting/widgets/select_dialog.dart",
    "content": "import 'dart:async';\n\nimport 'package:PiliPlus/http/browser_ua.dart';\nimport 'package:PiliPlus/http/constants.dart';\nimport 'package:PiliPlus/http/video.dart';\nimport 'package:PiliPlus/models/common/video/cdn_type.dart';\nimport 'package:PiliPlus/models/common/video/video_type.dart';\nimport 'package:PiliPlus/models/video/play/url.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/video_utils.dart';\nimport 'package:dio/dio.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\n\nclass SelectDialog<T> extends StatelessWidget {\n  final T? value;\n  final String title;\n  final List<(T, String)> values;\n  final Widget Function(BuildContext, int)? subtitleBuilder;\n  final bool toggleable;\n\n  const SelectDialog({\n    super.key,\n    this.value,\n    required this.values,\n    required this.title,\n    this.subtitleBuilder,\n    this.toggleable = false,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    final titleMedium = TextTheme.of(context).titleMedium!;\n    return AlertDialog(\n      clipBehavior: Clip.hardEdge,\n      title: Text(title),\n      constraints: subtitleBuilder != null\n          ? const BoxConstraints(maxWidth: 320, minWidth: 320)\n          : null,\n      contentPadding: const EdgeInsets.symmetric(vertical: 12),\n      content: Material(\n        type: .transparency,\n        child: SingleChildScrollView(\n          child: RadioGroup<T>(\n            onChanged: (v) => Navigator.of(context).pop(v ?? value),\n            groupValue: value,\n            child: Column(\n              mainAxisSize: MainAxisSize.min,\n              children: List.generate(\n                values.length,\n                (index) {\n                  final item = values[index];\n                  return RadioListTile<T>(\n                    toggleable: toggleable,\n                    dense: true,\n                    value: item.$1,\n                    title: Text(\n                      item.$2,\n                      style: titleMedium,\n                    ),\n                    subtitle: subtitleBuilder?.call(context, index),\n                  );\n                },\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n\nclass CdnSelectDialog extends StatefulWidget {\n  final BaseItem? sample;\n\n  const CdnSelectDialog({\n    super.key,\n    this.sample,\n  });\n\n  @override\n  State<CdnSelectDialog> createState() => _CdnSelectDialogState();\n}\n\nclass _CdnSelectDialogState extends State<CdnSelectDialog> {\n  late final List<ValueNotifier<String?>> _cdnResList;\n  late final List<CancelToken?> _tokens;\n  late final bool _cdnSpeedTest;\n\n  @override\n  void initState() {\n    _cdnSpeedTest = Pref.cdnSpeedTest;\n    if (_cdnSpeedTest) {\n      _dio =\n          Dio(\n              BaseOptions(\n                connectTimeout: const Duration(seconds: 15),\n                receiveTimeout: const Duration(seconds: 15),\n              ),\n            )\n            ..options.headers = {\n              'user-agent': BrowserUa.pc,\n              'referer': HttpString.baseUrl,\n            };\n      final length = CDNService.values.length;\n      _cdnResList = List.generate(\n        length,\n        (_) => ValueNotifier<String?>(null),\n      );\n      _tokens = List.generate(length, (_) => CancelToken());\n      _startSpeedTest();\n    }\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    if (_cdnSpeedTest) {\n      for (final e in _tokens) {\n        e?.cancel();\n      }\n      for (final notifier in _cdnResList) {\n        notifier.dispose();\n      }\n      _dio.close(force: true);\n    }\n    super.dispose();\n  }\n\n  Future<BaseItem> _getSampleUrl() async {\n    final result = await VideoHttp.videoUrl(\n      cid: 196018899,\n      bvid: 'BV1fK4y1t7hj',\n      tryLook: false,\n      videoType: VideoType.ugc,\n    );\n    final item = result.dataOrNull?.dash?.video?.first;\n    if (item == null) throw Exception('无法获取视频流');\n    return item;\n  }\n\n  Future<void> _startSpeedTest() async {\n    try {\n      final videoItem = widget.sample ?? await _getSampleUrl();\n      await _testAllCdnServices(videoItem);\n    } catch (e) {\n      if (kDebugMode) debugPrint('CDN speed test failed: $e');\n    }\n  }\n\n  Future<void> _testAllCdnServices(BaseItem videoItem) async {\n    for (final item in CDNService.values) {\n      if (!mounted) break;\n      await _testSingleCdn(item, videoItem);\n    }\n  }\n\n  Future<void> _testSingleCdn(CDNService item, BaseItem videoItem) async {\n    try {\n      final cdnUrl = VideoUtils.getCdnUrl(\n        videoItem.playUrls,\n        defaultCDNService: item,\n      );\n      await _measureDownloadSpeed(cdnUrl, item.index);\n    } catch (e) {\n      _handleSpeedTestError(e, item.index);\n    }\n  }\n\n  late final Dio _dio;\n\n  Future<void> _measureDownloadSpeed(String url, int index) async {\n    const maxSize = 8 * 1024 * 1024;\n    int downloaded = 0;\n\n    final cancelToken = _tokens[index];\n    final start = DateTime.now().microsecondsSinceEpoch;\n\n    void onClose() {\n      cancelToken?.cancel();\n      _tokens[index] = null;\n    }\n\n    await _dio.get(\n      url,\n      cancelToken: cancelToken,\n      onReceiveProgress: (count, total) {\n        if (!mounted) {\n          return;\n        }\n\n        final duration = DateTime.now().microsecondsSinceEpoch - start;\n\n        downloaded += count;\n\n        if (duration > 15000000) {\n          onClose();\n          if (downloaded > 0) {\n            _updateSpeedResult(index, downloaded, duration);\n            downloaded = 0;\n          } else {\n            throw TimeoutException('测速超时');\n          }\n        } else if (downloaded >= maxSize) {\n          onClose();\n          _updateSpeedResult(index, downloaded, duration);\n          downloaded = 0;\n        }\n      },\n    );\n  }\n\n  void _updateSpeedResult(int index, int downloaded, int duration) {\n    final speed = (downloaded / duration).toStringAsPrecision(3);\n    _cdnResList[index].value = '${speed}MB/s';\n  }\n\n  void _handleSpeedTestError(dynamic error, int index) {\n    _tokens\n      ..[index]?.cancel()\n      ..[index] = null;\n    final item = _cdnResList[index];\n    if (item.value != null) return;\n\n    if (kDebugMode) debugPrint('CDN speed test error: $error');\n    if (!mounted) return;\n    String message;\n    if (error is DioException) {\n      final statusCode = error.response?.statusCode;\n      if (statusCode != null && 400 <= statusCode && statusCode < 500) {\n        message = '此视频可能无法替换为该CDN';\n      } else {\n        message = error.toString();\n      }\n    } else {\n      message = error.toString();\n    }\n    if (message.isEmpty) {\n      message = '测速失败';\n    }\n    item.value = message;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return SelectDialog<CDNService>(\n      title: 'CDN 设置',\n      values: CDNService.values.map((i) => (i, i.desc)).toList(),\n      value: VideoUtils.cdnService,\n      subtitleBuilder: _cdnSpeedTest\n          ? (context, index) {\n              final item = _cdnResList[index];\n              return ValueListenableBuilder(\n                valueListenable: item,\n                builder: (context, value, _) {\n                  return Text(\n                    value ?? '---',\n                    style: const TextStyle(fontSize: 13),\n                    maxLines: 1,\n                    overflow: TextOverflow.ellipsis,\n                  );\n                },\n              );\n            }\n          : null,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/setting/widgets/slider_dialog.dart",
    "content": "import 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:flutter/material.dart';\n\nclass SliderDialog extends StatefulWidget {\n  final double value;\n  final String title;\n  final double min;\n  final double max;\n  final int? divisions;\n  final String suffix;\n  final int precise;\n\n  const SliderDialog({\n    super.key,\n    required this.value,\n    required this.title,\n    required this.min,\n    required this.max,\n    this.divisions,\n    this.suffix = '',\n    this.precise = 1,\n  });\n\n  @override\n  State<SliderDialog> createState() => _SliderDialogState();\n}\n\nclass _SliderDialogState extends State<SliderDialog> {\n  late double _tempValue;\n\n  @override\n  void initState() {\n    super.initState();\n    _tempValue = widget.value;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return AlertDialog(\n      title: Text(widget.title),\n      contentPadding: const EdgeInsets.only(\n        top: 20,\n        left: 8,\n        right: 8,\n        bottom: 8,\n      ),\n      content: SizedBox(\n        height: 40,\n        child: Slider(\n          value: _tempValue,\n          min: widget.min,\n          max: widget.max,\n          divisions: widget.divisions,\n          label:\n              '${_tempValue.toStringAsFixed(widget.precise)}${widget.suffix}',\n          onChanged: (double value) {\n            setState(() {\n              _tempValue = value.toPrecision(widget.precise);\n            });\n          },\n        ),\n      ),\n      actions: [\n        TextButton(\n          onPressed: Navigator.of(context).pop,\n          child: Text(\n            '取消',\n            style: TextStyle(color: Theme.of(context).colorScheme.outline),\n          ),\n        ),\n        TextButton(\n          onPressed: () => Navigator.pop(context, _tempValue),\n          child: const Text('确定'),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/setting/widgets/switch_item.dart",
    "content": "import 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/common/widgets/flutter/list_tile.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:flutter/material.dart' hide ListTile;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\n\nclass SetSwitchItem extends StatefulWidget {\n  final String title;\n  final String? subtitle;\n  final String setKey;\n  final bool defaultVal;\n  final ValueChanged<bool>? onChanged;\n  final bool needReboot;\n  final Widget? leading;\n  final void Function(BuildContext context)? onTap;\n  final EdgeInsetsGeometry? contentPadding;\n  final TextStyle? titleStyle;\n\n  const SetSwitchItem({\n    required this.title,\n    this.subtitle,\n    required this.setKey,\n    this.defaultVal = false,\n    this.onChanged,\n    this.needReboot = false,\n    this.leading,\n    this.onTap,\n    this.contentPadding,\n    this.titleStyle,\n    super.key,\n  });\n\n  @override\n  State<SetSwitchItem> createState() => _SetSwitchItemState();\n}\n\nclass _SetSwitchItemState extends State<SetSwitchItem> {\n  late bool val;\n\n  void setVal() {\n    if (widget.setKey == SettingBoxKey.appFontWeight) {\n      val = Pref.appFontWeight != -1;\n    } else {\n      val = GStorage.setting.get(\n        widget.setKey,\n        defaultValue: widget.defaultVal,\n      );\n    }\n  }\n\n  @override\n  void didUpdateWidget(SetSwitchItem oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (oldWidget.setKey != widget.setKey) {\n      setVal();\n    }\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    setVal();\n  }\n\n  Future<void> switchChange([bool? value]) async {\n    val = value ?? !val;\n\n    if (widget.setKey == SettingBoxKey.badCertificateCallback && val) {\n      val = await showConfirmDialog(\n        context: context,\n        title: '确定禁用 SSL 证书验证？',\n        content: '禁用容易受到中间人攻击',\n      );\n    }\n\n    if (widget.setKey == SettingBoxKey.appFontWeight) {\n      await GStorage.setting.put(SettingBoxKey.appFontWeight, val ? 4 : -1);\n    } else {\n      await GStorage.setting.put(widget.setKey, val);\n    }\n\n    widget.onChanged?.call(val);\n    if (widget.needReboot) {\n      SmartDialog.showToast('重启生效');\n    }\n    if (mounted) {\n      setState(() {});\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    final titleStyle =\n        widget.titleStyle ??\n        theme.textTheme.titleMedium!.copyWith(\n          color: widget.onTap != null && !val\n              ? theme.colorScheme.outline\n              : null,\n        );\n    final subTitleStyle = theme.textTheme.labelMedium!.copyWith(\n      color: theme.colorScheme.outline,\n    );\n    return ListTile(\n      contentPadding: widget.contentPadding,\n      enabled: widget.onTap == null ? true : val,\n      onTap: widget.onTap == null ? switchChange : () => widget.onTap!(context),\n      title: Text(widget.title, style: titleStyle),\n      subtitle: widget.subtitle != null\n          ? Text(widget.subtitle!, style: subTitleStyle)\n          : null,\n      leading: widget.leading,\n      trailing: Transform.scale(\n        scale: 0.8,\n        alignment: .centerRight,\n        child: Switch(\n          value: val,\n          onChanged: switchChange,\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/settings_search/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/view_sliver_safe_area.dart';\nimport 'package:PiliPlus/pages/search/controller.dart' show DebounceStreamState;\nimport 'package:PiliPlus/pages/setting/models/extra_settings.dart';\nimport 'package:PiliPlus/pages/setting/models/model.dart';\nimport 'package:PiliPlus/pages/setting/models/play_settings.dart';\nimport 'package:PiliPlus/pages/setting/models/privacy_settings.dart';\nimport 'package:PiliPlus/pages/setting/models/recommend_settings.dart';\nimport 'package:PiliPlus/pages/setting/models/style_settings.dart';\nimport 'package:PiliPlus/pages/setting/models/video_settings.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:PiliPlus/utils/waterfall.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:waterfall_flow/waterfall_flow.dart'\n    hide SliverWaterfallFlowDelegateWithMaxCrossAxisExtent;\n\nclass SettingsSearchPage extends StatefulWidget {\n  const SettingsSearchPage({super.key});\n\n  @override\n  State<SettingsSearchPage> createState() => _SettingsSearchPageState();\n}\n\nclass _SettingsSearchPageState\n    extends DebounceStreamState<SettingsSearchPage, String> {\n  final _textEditingController = TextEditingController();\n  final RxList<SettingsModel> _list = <SettingsModel>[].obs;\n  late final _settings = [\n    ...extraSettings,\n    ...privacySettings,\n    ...recommendSettings,\n    ...videoSettings,\n    ...playSettings,\n    ...styleSettings,\n  ];\n\n  @override\n  void onValueChanged(String value) {\n    if (value.isEmpty) {\n      _list.clear();\n    } else {\n      value = value.toLowerCase();\n      _list.value = _settings\n          .where(\n            (item) =>\n                item.effectiveTitle.toLowerCase().contains(value) ||\n                item.effectiveSubtitle?.toLowerCase().contains(value) == true,\n          )\n          .toList();\n    }\n  }\n\n  @override\n  void dispose() {\n    _textEditingController.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        actions: [\n          IconButton(\n            onPressed: () {\n              if (_textEditingController.text.isNotEmpty) {\n                _textEditingController.clear();\n                _list.clear();\n              } else {\n                Get.back();\n              }\n            },\n            icon: const Icon(Icons.clear),\n          ),\n          const SizedBox(width: 10),\n        ],\n        title: TextField(\n          autofocus: true,\n          controller: _textEditingController,\n          textAlignVertical: TextAlignVertical.center,\n          onChanged: ctr!.add,\n          decoration: const InputDecoration(\n            isDense: true,\n            hintText: '搜索',\n            visualDensity: .standard,\n            border: InputBorder.none,\n          ),\n        ),\n      ),\n      body: CustomScrollView(\n        slivers: [\n          ViewSliverSafeArea(\n            sliver: Obx(\n              () => _list.isEmpty\n                  ? const HttpError()\n                  : SliverWaterfallFlow(\n                      gridDelegate:\n                          SliverWaterfallFlowDelegateWithMaxCrossAxisExtent(\n                            maxCrossAxisExtent: Grid.smallCardWidth * 2,\n                          ),\n                      delegate: SliverChildBuilderDelegate(\n                        (_, index) => _list[index].widget,\n                        childCount: _list.length,\n                      ),\n                    ),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/share/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/self_sized_horizontal_list.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/pages/contact/view.dart';\nimport 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';\nimport 'package:PiliPlus/utils/request_utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart' show LengthLimitingTextInputFormatter;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass UserModel {\n  UserModel({\n    required this.mid,\n    required this.name,\n    required this.avatar,\n    this.selected = false,\n  });\n\n  final int mid;\n  final String name;\n  final String avatar;\n  bool selected;\n\n  @override\n  bool operator ==(Object other) {\n    if (identical(this, other)) {\n      return true;\n    }\n    if (other is UserModel) {\n      return mid == other.mid;\n    }\n    return false;\n  }\n\n  @override\n  int get hashCode => mid.hashCode;\n}\n\nclass SharePanel extends StatefulWidget {\n  const SharePanel({\n    super.key,\n    required this.content,\n    this.userList,\n  });\n\n  final Map content;\n  final List<UserModel>? userList;\n\n  @override\n  State<SharePanel> createState() => _SharePanelState();\n}\n\nclass _SharePanelState extends State<SharePanel> {\n  final List<UserModel> _userList = <UserModel>[];\n  final ScrollController _scrollController = ScrollController();\n  final FocusNode _focusNode = FocusNode();\n  final TextEditingController _controller = TextEditingController();\n\n  @override\n  void dispose() {\n    _focusNode.dispose();\n    _controller.dispose();\n    _scrollController.dispose();\n    super.dispose();\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    if (widget.userList?.isNotEmpty == true) {\n      _userList.addAll(widget.userList!);\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    return Padding(\n      padding:\n          const EdgeInsets.all(12) +\n          MediaQuery.paddingOf(context) +\n          MediaQuery.viewInsetsOf(context),\n      child: Column(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          Row(\n            mainAxisAlignment: MainAxisAlignment.spaceBetween,\n            children: [\n              const Text('分享给'),\n              iconButton(\n                size: 32,\n                iconSize: 18,\n                tooltip: '关闭',\n                icon: const Icon(Icons.clear),\n                onPressed: Get.back,\n              ),\n            ],\n          ),\n          const SizedBox(height: 5),\n          Row(\n            children: [\n              Expanded(\n                child: SelfSizedHorizontalList(\n                  padding: .zero,\n                  itemCount: _userList.length,\n                  controller: _scrollController,\n                  separatorBuilder: (_, _) => const SizedBox(width: 10),\n                  itemBuilder: (context, index) {\n                    final item = _userList[index];\n                    return Builder(\n                      builder: (context) {\n                        return GestureDetector(\n                          onTap: () {\n                            item.selected = !item.selected;\n                            (context as Element).markNeedsBuild();\n                          },\n                          behavior: HitTestBehavior.opaque,\n                          child: SizedBox(\n                            width: 65,\n                            child: Stack(\n                              clipBehavior: Clip.none,\n                              alignment: Alignment.topCenter,\n                              children: [\n                                Column(\n                                  children: [\n                                    Padding(\n                                      padding: const EdgeInsets.all(5),\n                                      child: NetworkImgLayer(\n                                        width: 40,\n                                        height: 40,\n                                        src: item.avatar,\n                                        type: ImageType.avatar,\n                                      ),\n                                    ),\n                                    const SizedBox(height: 2),\n                                    Text(\n                                      item.name,\n                                      maxLines: 1,\n                                      overflow: TextOverflow.ellipsis,\n                                      style: const TextStyle(fontSize: 12),\n                                    ),\n                                  ],\n                                ),\n                                if (item.selected)\n                                  Container(\n                                    width: 50,\n                                    height: 50,\n                                    decoration: BoxDecoration(\n                                      color: theme.colorScheme.primary\n                                          .withValues(\n                                            alpha: 0.3,\n                                          ),\n                                      shape: BoxShape.circle,\n                                      border: Border.all(\n                                        width: 1.5,\n                                        color: theme.colorScheme.primary,\n                                      ),\n                                    ),\n                                    child: const Icon(\n                                      Icons.check,\n                                      size: 20,\n                                      color: Colors.white,\n                                    ),\n                                  ),\n                              ],\n                            ),\n                          ),\n                        );\n                      },\n                    );\n                  },\n                ),\n              ),\n              GestureDetector(\n                onTap: () async {\n                  _focusNode.unfocus();\n                  final UserModel? userModel = await Navigator.of(context).push(\n                    GetPageRoute(page: () => const ContactPage()),\n                  );\n                  if (userModel != null) {\n                    _userList\n                      ..remove(userModel)\n                      ..insert(0, userModel);\n                    _scrollController.jumpToTop();\n                    setState(() {});\n                  }\n                },\n                behavior: HitTestBehavior.opaque,\n                child: SizedBox(\n                  width: 65,\n                  child: Column(\n                    children: [\n                      Container(\n                        width: 50,\n                        height: 50,\n                        alignment: Alignment.center,\n                        child: Container(\n                          width: 40,\n                          height: 40,\n                          decoration: BoxDecoration(\n                            shape: BoxShape.circle,\n                            color: theme.colorScheme.onInverseSurface,\n                          ),\n                          child: Icon(\n                            Icons.person_add_alt,\n                            color: theme.colorScheme.onSurfaceVariant,\n                          ),\n                        ),\n                      ),\n                      const SizedBox(height: 2),\n                      const Text('更多', style: TextStyle(fontSize: 12)),\n                    ],\n                  ),\n                ),\n              ),\n            ],\n          ),\n          const SizedBox(height: 12),\n          Row(\n            children: [\n              Expanded(\n                child: TextField(\n                  controller: _controller,\n                  focusNode: _focusNode,\n                  minLines: 1,\n                  maxLines: 2,\n                  textInputAction: TextInputAction.newline,\n                  decoration: InputDecoration(\n                    hintText: '说说你的想法吧...',\n                    visualDensity: .standard,\n                    hintStyle: const TextStyle(fontSize: 14),\n                    border: const OutlineInputBorder(\n                      borderSide: BorderSide.none,\n                      borderRadius: BorderRadius.all(Radius.circular(20)),\n                    ),\n                    filled: true,\n                    isDense: true,\n                    contentPadding: const .symmetric(\n                      horizontal: 12,\n                      vertical: 6,\n                    ),\n                    fillColor: theme.colorScheme.onInverseSurface,\n                  ),\n                  inputFormatters: [LengthLimitingTextInputFormatter(100)],\n                ),\n              ),\n              const SizedBox(width: 12),\n              FilledButton.tonal(\n                onPressed: _onSend,\n                style: FilledButton.styleFrom(\n                  tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n                  visualDensity: const VisualDensity(\n                    horizontal: -2,\n                    vertical: -1,\n                  ),\n                ),\n                child: const Text('发送'),\n              ),\n            ],\n          ),\n        ],\n      ),\n    );\n  }\n\n  Future<void> _onSend() async {\n    final list = _userList.where((user) => user.selected);\n    if (list.isEmpty) {\n      SmartDialog.showToast('请选择分享的用户');\n      return;\n    }\n    SmartDialog.showLoading();\n    final res = await Future.wait(\n      list.map(\n        (user) => RequestUtils.pmShare(\n          receiverId: user.mid,\n          content: widget.content,\n          message: _controller.text,\n        ),\n      ),\n    );\n    SmartDialog.dismiss();\n    if (res.every((e) => e)) {\n      Get.back();\n      SmartDialog.showToast('分享成功');\n    } else if (res.every((e) => !e)) {\n      SmartDialog.showToast('分享失败');\n    } else {\n      SmartDialog.showToast('部分分享失败');\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/space_setting/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/user.dart';\nimport 'package:PiliPlus/models_new/space_setting/data.dart';\nimport 'package:PiliPlus/models_new/space_setting/privacy.dart';\nimport 'package:PiliPlus/pages/common/common_data_controller.dart';\n\nclass SpaceSettingController\n    extends CommonDataController<SpaceSettingData, Privacy?> {\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  bool? hasMod;\n\n  @override\n  bool customHandleResponse(\n    bool isRefresh,\n    Success<SpaceSettingData> response,\n  ) {\n    loadingState.value = Success(response.response.privacy);\n    return true;\n  }\n\n  @override\n  Future<LoadingState<SpaceSettingData>> customGetData() =>\n      UserHttp.spaceSetting();\n\n  Future<void> onMod() async {\n    if (hasMod ?? false) {\n      if (loadingState.value case Success(:final response?)) {\n        final res = await UserHttp.spaceSettingMod(\n          {\n            for (final e in response.list1) e.key: e.value,\n            for (final e in response.list2) e.key: e.value,\n            for (final e in response.list3) e.key: e.value,\n          },\n        );\n        if (!res.isSuccess) {\n          res.toast();\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/space_setting/view.dart",
    "content": "import 'dart:math';\n\nimport 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/space_setting/privacy.dart';\nimport 'package:PiliPlus/pages/space_setting/controller.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass SpaceSettingPage extends StatefulWidget {\n  const SpaceSettingPage({super.key});\n\n  @override\n  State<SpaceSettingPage> createState() => _SpaceSettingPageState();\n}\n\nclass _SpaceSettingPageState extends State<SpaceSettingPage> {\n  final _controller = Get.put(SpaceSettingController());\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(title: const Text('空间设置')),\n      body: Obx(() => _buildBody(theme, _controller.loadingState.value)),\n    );\n  }\n\n  @override\n  void dispose() {\n    _controller.onMod();\n    super.dispose();\n  }\n\n  Widget _buildBody(ThemeData theme, LoadingState<Privacy?> loadingState) {\n    return switch (loadingState) {\n      Loading() => const SizedBox.shrink(),\n      Success<Privacy?>(:final response) =>\n        response == null\n            ? scrollErrorWidget(onReload: _controller.onReload)\n            : Builder(\n                builder: (context) {\n                  final padding = MediaQuery.viewPaddingOf(context);\n                  final divider = Divider(\n                    height: 1,\n                    indent: max(16, padding.left),\n                    color: theme.colorScheme.outline.withValues(alpha: 0.1),\n                  );\n                  final dividerL = SliverToBoxAdapter(\n                    child: Divider(\n                      height: 12,\n                      thickness: 12,\n                      color: theme.colorScheme.outline.withValues(alpha: 0.1),\n                    ),\n                  );\n                  return CustomScrollView(\n                    slivers: [\n                      dividerL,\n                      SliverList.separated(\n                        itemCount: response.list1.length,\n                        itemBuilder: (context, index) {\n                          return _item(response.list1[index]);\n                        },\n                        separatorBuilder: (context, index) => divider,\n                      ),\n                      dividerL,\n                      SliverList.separated(\n                        itemCount: response.list2.length,\n                        itemBuilder: (context, index) {\n                          return _item(response.list2[index]);\n                        },\n                        separatorBuilder: (context, index) => divider,\n                      ),\n                      dividerL,\n                      SliverList.separated(\n                        itemCount: response.list3.length,\n                        itemBuilder: (context, index) {\n                          return _item(response.list3[index]);\n                        },\n                        separatorBuilder: (context, index) => divider,\n                      ),\n                      dividerL,\n                      SliverToBoxAdapter(\n                        child: SizedBox(height: padding.bottom + 100),\n                      ),\n                    ],\n                  );\n                },\n              ),\n      Error(:final errMsg) => scrollErrorWidget(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n\n  Widget _item(SpaceSettingModel item) {\n    return Builder(\n      builder: (context) {\n        void onChanged([bool? value]) {\n          _controller.hasMod ??= true;\n\n          value ??= !item.boolVal;\n          item.value = item.isReverse\n              ? value\n                    ? 0\n                    : 1\n              : value\n              ? 1\n              : 0;\n          (context as Element).markNeedsBuild();\n        }\n\n        return ListTile(\n          dense: true,\n          onTap: onChanged,\n          title: Text(\n            item.name,\n            style: const TextStyle(fontSize: 14),\n          ),\n          trailing: Transform.scale(\n            alignment: Alignment.centerRight,\n            scale: 0.8,\n            child: Switch(\n              value: item.boolVal,\n              onChanged: onChanged,\n            ),\n          ),\n        );\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/sponsor_block/block_mixin.dart",
    "content": "import 'dart:async' show StreamSubscription, Timer;\nimport 'dart:math' as math;\n\nimport 'package:PiliPlus/common/widgets/progress_bar/segment_progress_bar.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/sponsor_block.dart';\nimport 'package:PiliPlus/models/common/sponsor_block/segment_model.dart';\nimport 'package:PiliPlus/models/common/sponsor_block/segment_type.dart';\nimport 'package:PiliPlus/models/common/sponsor_block/skip_type.dart';\nimport 'package:PiliPlus/models_new/sponsor_block/segment_item.dart';\nimport 'package:PiliPlus/utils/duration_utils.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:easy_debounce/easy_throttle.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\nimport 'package:media_kit/media_kit.dart';\n\nmixin BlockConfigMixin {\n  late final pgcSkipType = Pref.pgcSkipType;\n  late final enablePgcSkip = pgcSkipType != SkipType.disable;\n  late final enableSponsorBlock = Pref.enableSponsorBlock;\n  late final enableBlock = enableSponsorBlock || enablePgcSkip;\n  late final blockColor = Pref.blockColor;\n  late final blockLimit = Pref.blockLimit;\n  late final blockSettings = Pref.blockSettings;\n  late final enableList = blockSettings\n      .where((item) => item.second != SkipType.disable)\n      .map((item) => item.first.name)\n      .toSet();\n\n  Color _getColor(SegmentType segment) => blockColor[segment.index];\n}\n\nmixin BlockMixin on GetxController {\n  int? _lastBlockPos;\n  BlockConfigMixin get blockConfig;\n  StreamSubscription<Duration>? _blockListener;\n  StreamSubscription<Duration>? get blockListener => _blockListener;\n  late final List<SegmentModel> _segmentList = <SegmentModel>[];\n  late final RxList<Segment> segmentProgressList = <Segment>[].obs;\n\n  Timer? _skipTimer;\n  late final listKey = GlobalKey<AnimatedListState>();\n  late final List<Object> listData = [];\n\n  RxString? get videoLabel => null;\n  Player? get player;\n  bool get autoPlay;\n  int? get timeLength;\n  bool get preInitPlayer;\n  int get currPosInMilliseconds;\n  bool get isFullScreen => false;\n\n  bool get isUgc;\n  late final isBlock = isUgc || !blockConfig.enablePgcSkip;\n\n  Future<void> querySponsorBlock({\n    required String bvid,\n    required int cid,\n  }) async {\n    resetBlock();\n\n    final result = await SponsorBlock.getSkipSegments(bvid: bvid, cid: cid);\n    switch (result) {\n      case Success<List<SegmentItemModel>>(:final response):\n        handleSBData(response);\n      case Error(:final code) when code != 404:\n        if (kDebugMode) {\n          result.toast();\n        }\n      default:\n    }\n  }\n\n  void initSkip() {\n    if (isClosed) return;\n    if (_segmentList.isNotEmpty) {\n      _blockListener?.cancel();\n      _blockListener = player?.stream.position.listen((position) {\n        int currentPos = position.inSeconds;\n        if (currentPos != _lastBlockPos) {\n          _lastBlockPos = currentPos;\n          final msPos = currentPos * 1000;\n          for (SegmentModel item in _segmentList) {\n            // if (kDebugMode) {\n            //   debugPrint(\n            //       '${position.inSeconds},,${item.segment.first},,${item.segment.second},,${item.skipType.name},,${item.hasSkipped}');\n            // }\n            if (msPos <= item.segment.$1 && item.segment.$1 <= msPos + 1000) {\n              switch (item.skipType) {\n                case SkipType.alwaysSkip:\n                  onSkip(item, isSeek: false);\n                  break;\n                case SkipType.skipOnce:\n                  if (!item.hasSkipped) {\n                    item.hasSkipped = true;\n                    onSkip(item, isSeek: false);\n                  }\n                  break;\n                case SkipType.skipManually:\n                  onAddItem(item);\n                  break;\n                default:\n                  break;\n              }\n              break;\n            }\n          }\n        }\n      });\n    }\n  }\n\n  Future<void> handleSBData(List<SegmentItemModel> list) async {\n    if (list.isNotEmpty) {\n      try {\n        Future<void>? future;\n        final duration = list.first.videoDuration ?? timeLength!;\n        // segmentList\n        _segmentList.addAll(\n          list\n              .where(\n                (item) =>\n                    blockConfig.enableList.contains(item.category) &&\n                    item.segment[1] >= item.segment[0],\n              )\n              .map(\n                (item) {\n                  final segmentModel = SegmentModel.fromItemModel(\n                    item,\n                    isBlock ? blockConfig : null,\n                  );\n                  if (segmentModel.segment == const (0, 0)) {\n                    videoLabel?.value +=\n                        '${videoLabel!.value.isNotEmpty ? '/' : ''}${segmentModel.segmentType.title}';\n                  }\n\n                  if (_blockListener == null && autoPlay && player != null) {\n                    final currPos = currPosInMilliseconds;\n\n                    if (segmentModel.segment.contains(currPos)) {\n                      _lastBlockPos = currPos;\n\n                      switch (segmentModel.skipType) {\n                        case SkipType.alwaysSkip:\n                        case SkipType.skipOnce:\n                          segmentModel.hasSkipped = true;\n                          if (player!.state.playing) {\n                            future = onSkip(\n                              segmentModel,\n                            );\n                          } else {\n                            player!.stream.playing.firstWhere((e) {\n                              if (e) {\n                                future = onSkip(segmentModel);\n                                return true;\n                              }\n                              return false;\n                            }, orElse: () => false);\n                          }\n                          break;\n                        case SkipType.skipManually:\n                          onAddItem(segmentModel);\n                          break;\n                        default:\n                          break;\n                      }\n                    }\n                  }\n\n                  return segmentModel;\n                },\n              ),\n        );\n\n        // _segmentProgressList\n        segmentProgressList.addAll(\n          _segmentList.map((e) {\n            double start = (e.segment.$1 / duration).clamp(0.0, 1.0);\n            double end = (e.segment.$2 / duration).clamp(0.0, 1.0);\n            return Segment(\n              start: start,\n              end: end,\n              color: blockConfig._getColor(e.segmentType),\n            );\n          }),\n        );\n\n        if (_blockListener == null && (autoPlay || preInitPlayer)) {\n          await future;\n          initSkip();\n        }\n      } catch (e) {\n        if (kDebugMode) debugPrint('failed to parse sponsorblock: $e');\n      }\n    }\n  }\n\n  void onAddItem(Object item) {\n    if (listData.contains(item)) return;\n    listData.insert(0, item);\n    listKey.currentState?.insertItem(0);\n    _skipTimer ??= Timer.periodic(const Duration(seconds: 4), (_) {\n      if (listData.isNotEmpty) {\n        onRemoveItem(listData.length - 1, listData.last);\n      }\n    });\n  }\n\n  void onRemoveItem(int index, Object item) {\n    EasyThrottle.throttle(\n      'onRemoveItem',\n      const Duration(milliseconds: 500),\n      () {\n        try {\n          listData.removeAt(index);\n          if (listData.isEmpty) {\n            _stopSkipTimer();\n          }\n          listKey.currentState?.removeItem(\n            index,\n            (context, animation) => buildItem(item, animation),\n          );\n        } catch (_) {}\n      },\n    );\n  }\n\n  Widget buildItem(Object item, Animation<double> animation) =>\n      throw UnimplementedError();\n\n  void _stopSkipTimer() {\n    if (_skipTimer != null) {\n      _skipTimer!.cancel();\n      _skipTimer = null;\n    }\n  }\n\n  Future<void>? seekTo(Duration duration, {required bool isSeek});\n\n  void _skipToast(SegmentModel item) {\n    if (autoPlay && Pref.blockToast) {\n      _showBlockToast('已跳过${item.segmentType.shortTitle}片段');\n    }\n    if (isBlock && Pref.blockTrack) {\n      SponsorBlock.viewedVideoSponsorTime(item.uuid);\n    }\n  }\n\n  Future<void> onSkip(\n    SegmentModel item, {\n    bool isSkip = true,\n    bool isSeek = true,\n  }) async {\n    try {\n      await seekTo(\n        Duration(milliseconds: item.segment.$2),\n        isSeek: isSeek,\n      );\n      if (isSkip) {\n        _skipToast(item);\n      } else {\n        _showBlockToast('已跳至${item.segmentType.shortTitle}');\n      }\n    } catch (e) {\n      if (kDebugMode) debugPrint('failed to skip: $e');\n      if (isSkip) {\n        _showBlockToast('${item.segmentType.shortTitle}片段跳过失败');\n      } else {\n        _showBlockToast('跳转失败');\n      }\n    }\n  }\n\n  void _showBlockToast(String msg) {\n    SmartDialog.showToast(\n      msg,\n      alignment: isFullScreen ? const Alignment(0, 0.7) : null,\n    );\n  }\n\n  void _showVoteDialog(SegmentModel segment) {\n    showDialog(\n      context: Get.context!,\n      builder: (context) => AlertDialog(\n        clipBehavior: Clip.hardEdge,\n        contentPadding: const EdgeInsets.fromLTRB(0, 10, 0, 10),\n        content: SingleChildScrollView(\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              ListTile(\n                dense: true,\n                title: const Text('赞成票', style: TextStyle(fontSize: 14)),\n                onTap: () {\n                  Get.back();\n                  _doVote(segment.uuid, 1);\n                },\n              ),\n              ListTile(\n                dense: true,\n                title: const Text('反对票', style: TextStyle(fontSize: 14)),\n                onTap: () {\n                  Get.back();\n                  _doVote(segment.uuid, 0);\n                },\n              ),\n              ListTile(\n                dense: true,\n                title: const Text('更改类别', style: TextStyle(fontSize: 14)),\n                onTap: () {\n                  Get.back();\n                  _showCategoryDialog(segment);\n                },\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  void _doVote(String uuid, int type) => SponsorBlock.voteOnSponsorTime(\n    uuid: uuid,\n    type: type,\n  ).then((i) => SmartDialog.showToast(i.isSuccess ? '投票成功' : '投票失败: $i'));\n\n  void _showCategoryDialog(SegmentModel segment) {\n    showDialog(\n      context: Get.context!,\n      builder: (context) => AlertDialog(\n        clipBehavior: Clip.hardEdge,\n        contentPadding: const EdgeInsets.fromLTRB(0, 10, 0, 10),\n        content: SingleChildScrollView(\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: SegmentType.values\n                .map(\n                  (item) => ListTile(\n                    dense: true,\n                    onTap: () {\n                      Get.back();\n                      SponsorBlock.voteOnSponsorTime(\n                        uuid: segment.uuid,\n                        category: item,\n                      ).then((i) {\n                        SmartDialog.showToast(\n                          '类别更改${i.isSuccess ? '成功' : '失败: $i'}',\n                        );\n                      });\n                    },\n                    title: Text.rich(\n                      TextSpan(\n                        children: [\n                          WidgetSpan(\n                            alignment: PlaceholderAlignment.middle,\n                            child: Container(\n                              height: 10,\n                              width: 10,\n                              decoration: BoxDecoration(\n                                shape: BoxShape.circle,\n                                color: blockConfig._getColor(item),\n                              ),\n                            ),\n                            style: const TextStyle(fontSize: 14, height: 1),\n                          ),\n                          TextSpan(\n                            text: ' ${item.title}',\n                            style: const TextStyle(fontSize: 14, height: 1),\n                          ),\n                        ],\n                      ),\n                    ),\n                  ),\n                )\n                .toList(),\n          ),\n        ),\n      ),\n    );\n  }\n\n  void showSBDetail() {\n    showDialog(\n      context: Get.context!,\n      builder: (context) => AlertDialog(\n        clipBehavior: Clip.hardEdge,\n        contentPadding: const EdgeInsets.fromLTRB(0, 10, 0, 10),\n        content: SingleChildScrollView(\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: _segmentList\n                .map(\n                  (item) => ListTile(\n                    onTap: () {\n                      Get.back();\n                      if (isBlock) {\n                        _showVoteDialog(item);\n                      }\n                    },\n                    dense: true,\n                    title: Text.rich(\n                      TextSpan(\n                        children: [\n                          WidgetSpan(\n                            alignment: PlaceholderAlignment.middle,\n                            child: Container(\n                              height: 10,\n                              width: 10,\n                              decoration: BoxDecoration(\n                                shape: BoxShape.circle,\n                                color: blockConfig._getColor(item.segmentType),\n                              ),\n                            ),\n                            style: const TextStyle(fontSize: 14, height: 1),\n                          ),\n                          TextSpan(\n                            text: ' ${item.segmentType.title}',\n                            style: const TextStyle(fontSize: 14, height: 1),\n                          ),\n                        ],\n                      ),\n                    ),\n                    contentPadding: const EdgeInsets.only(left: 16, right: 8),\n                    subtitle: Text(\n                      '${DurationUtils.formatDuration(item.segment.$1 / 1000)} 至 ${DurationUtils.formatDuration(item.segment.$2 / 1000)}',\n                      style: const TextStyle(fontSize: 13),\n                    ),\n                    trailing: Row(\n                      mainAxisSize: MainAxisSize.min,\n                      children: [\n                        Text(\n                          item.skipType.label,\n                          style: const TextStyle(fontSize: 13),\n                        ),\n                        if (item.segment.$2 != 0)\n                          SizedBox(\n                            width: 36,\n                            height: 36,\n                            child: IconButton(\n                              tooltip: item.skipType == SkipType.showOnly\n                                  ? '跳至此片段'\n                                  : '跳过此片段',\n                              onPressed: () {\n                                Get.back();\n                                onSkip(\n                                  item,\n                                  isSkip: item.skipType != SkipType.showOnly,\n                                  isSeek: false,\n                                );\n                              },\n                              style: IconButton.styleFrom(\n                                padding: EdgeInsets.zero,\n                                tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n                              ),\n                              icon: Icon(\n                                item.skipType == SkipType.showOnly\n                                    ? Icons.my_location\n                                    : MdiIcons.debugStepOver,\n                                size: 18,\n                                color: Theme.of(\n                                  context,\n                                ).colorScheme.onSurface.withValues(alpha: 0.7),\n                              ),\n                            ),\n                          )\n                        else\n                          const SizedBox(width: 10),\n                      ],\n                    ),\n                  ),\n                )\n                .toList(),\n          ),\n        ),\n      ),\n    );\n  }\n\n  void cancelBlockListener() {\n    if (_blockListener != null) {\n      _blockListener!.cancel();\n      _blockListener = null;\n    }\n  }\n\n  void resetBlock() {\n    cancelBlockListener();\n    _lastBlockPos = null;\n    videoLabel?.value = '';\n    _segmentList.clear();\n    segmentProgressList.clear();\n  }\n\n  Duration? getFirstSegment([int pos = 0]) {\n    for (var i in _segmentList..sort()) {\n      final (start, end) = i.segment;\n      if (start == end) {\n        continue;\n      } else if (start - pos < 100) {\n        if (switch (i.skipType) {\n          .alwaysSkip => true,\n          .skipOnce => !i.hasSkipped,\n          _ => false,\n        }) {\n          _skipToast(i);\n          pos = math.max(pos, i.segment.$2);\n        }\n      } else {\n        break;\n      }\n    }\n    if (pos != 0) {\n      return Duration(milliseconds: pos);\n    }\n    return null;\n  }\n\n  @override\n  void onClose() {\n    _stopSkipTimer();\n    if (blockConfig.enableBlock) {\n      resetBlock();\n    }\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "lib/pages/sponsor_block/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/pair.dart';\nimport 'package:PiliPlus/http/constants.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/sponsor_block.dart';\nimport 'package:PiliPlus/models/common/sponsor_block/segment_type.dart';\nimport 'package:PiliPlus/models/common/sponsor_block/skip_type.dart';\nimport 'package:PiliPlus/models_new/sponsor_block/user_info.dart';\nimport 'package:PiliPlus/pages/setting/slide_color_picker.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:crypto/crypto.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart' show FilteringTextInputFormatter;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:hive_ce/hive.dart';\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\n\nclass SponsorBlockPage extends StatefulWidget {\n  const SponsorBlockPage({super.key});\n\n  @override\n  State<SponsorBlockPage> createState() => _SponsorBlockPageState();\n}\n\nclass _SponsorBlockPageState extends State<SponsorBlockPage> {\n  final _url = 'https://github.com/hanydd/BilibiliSponsorBlock';\n  final _textController = TextEditingController();\n  double _blockLimit = Pref.blockLimit;\n  final _blockSettings = Pref.blockSettings;\n  final List<Color> _blockColor = Pref.blockColor;\n  String _userId = Pref.blockUserID;\n  bool _blockToast = Pref.blockToast;\n  String _blockServer = Pref.blockServer;\n  bool _blockTrack = Pref.blockTrack;\n  final _serverStatus = Rxn<bool>();\n  final _userInfo = LoadingState<UserInfo>.loading().obs;\n\n  Box setting = GStorage.setting;\n\n  @override\n  void initState() {\n    super.initState();\n    _checkServerStatus();\n    _getUserInfo();\n  }\n\n  @override\n  void dispose() {\n    _textController.dispose();\n    super.dispose();\n  }\n\n  Future<void> _checkServerStatus() async {\n    _serverStatus.value = (await SponsorBlock.uptimeStatus()).isSuccess;\n  }\n\n  Future<void> _getUserInfo() async {\n    _userInfo.value = await SponsorBlock.userInfo(const [\n      'viewCount',\n      'minutesSaved',\n      'segmentCount',\n    ], userId: _userId);\n  }\n\n  Widget _blockLimitItem(\n    ThemeData theme,\n    TextStyle titleStyle,\n    TextStyle subTitleStyle,\n  ) => Builder(\n    builder: (context) {\n      return ListTile(\n        dense: true,\n        onTap: () {\n          _textController.text = _blockLimit.toString();\n          showDialog(\n            context: context,\n            builder: (_) => AlertDialog(\n              title: Text('最短片段时长', style: titleStyle),\n              content: TextFormField(\n                keyboardType: const TextInputType.numberWithOptions(\n                  decimal: true,\n                ),\n                controller: _textController,\n                autofocus: true,\n                decoration: const InputDecoration(suffixText: 's'),\n                inputFormatters: [\n                  FilteringTextInputFormatter.allow(RegExp(r'[\\d\\.]+')),\n                ],\n              ),\n              actions: [\n                TextButton(\n                  onPressed: Get.back,\n                  child: Text(\n                    '取消',\n                    style: TextStyle(color: theme.colorScheme.outline),\n                  ),\n                ),\n                TextButton(\n                  onPressed: () {\n                    try {\n                      _blockLimit = double.parse(_textController.text);\n                      Get.back();\n                      setting.put(SettingBoxKey.blockLimit, _blockLimit);\n                      (context as Element).markNeedsBuild();\n                    } catch (e) {\n                      SmartDialog.showToast(e.toString());\n                    }\n                  },\n                  child: const Text('确定'),\n                ),\n              ],\n            ),\n          );\n        },\n        title: Text('最短片段时长', style: titleStyle),\n        subtitle: Text(\n          '忽略短于此时长的片段',\n          style: subTitleStyle,\n        ),\n        trailing: Text(\n          '${_blockLimit}s',\n          style: const TextStyle(fontSize: 13),\n        ),\n      );\n    },\n  );\n\n  Widget _aboutItem(TextStyle titleStyle, TextStyle subTitleStyle) => ListTile(\n    dense: true,\n    title: Text('关于空降助手', style: titleStyle),\n    subtitle: Text(_url, style: subTitleStyle),\n    onTap: () => PageUtils.launchURL(_url),\n  );\n\n  Widget _userIdItem(\n    ThemeData theme,\n    TextStyle titleStyle,\n    TextStyle subTitleStyle,\n  ) => Builder(\n    builder: (context) {\n      return ListTile(\n        dense: true,\n        title: Text('用户ID', style: titleStyle),\n        subtitle: Text(_userId, style: subTitleStyle),\n        onTap: () {\n          final key = GlobalKey<FormFieldState<String>>();\n          _textController.text = _userId;\n          showDialog(\n            context: context,\n            builder: (_) {\n              return AlertDialog(\n                title: Text('用户ID', style: titleStyle),\n                content: TextFormField(\n                  key: key,\n                  minLines: 1,\n                  maxLines: 4,\n                  autofocus: true,\n                  controller: _textController,\n                  inputFormatters: [\n                    FilteringTextInputFormatter.allow(RegExp(r'[a-zA-Z\\d]+')),\n                  ],\n                  decoration: const InputDecoration(errorMaxLines: 2),\n                  validator: (value) {\n                    if ((value?.length ?? -1) < 30) {\n                      return '用户ID要求至少为30个字符长度的纯字符串';\n                    }\n                    return null;\n                  },\n                ),\n                actions: [\n                  TextButton(\n                    onPressed: () {\n                      Get.back();\n                      _userId = Digest(\n                        List.generate(16, (_) => Utils.random.nextInt(256)),\n                      ).toString();\n                      setting.put(SettingBoxKey.blockUserID, _userId);\n                      (context as Element).markNeedsBuild();\n                    },\n                    child: const Text('随机'),\n                  ),\n                  TextButton(\n                    onPressed: Get.back,\n                    child: Text(\n                      '取消',\n                      style: TextStyle(\n                        color: theme.colorScheme.outline,\n                      ),\n                    ),\n                  ),\n                  TextButton(\n                    onPressed: () {\n                      if (key.currentState?.validate() == true) {\n                        Get.back();\n                        _userId = _textController.text;\n                        setting.put(SettingBoxKey.blockUserID, _userId);\n                        (context as Element).markNeedsBuild();\n                      }\n                    },\n                    child: const Text('确定'),\n                  ),\n                ],\n              );\n            },\n          );\n        },\n      );\n    },\n  );\n\n  Widget _blockToastItem(TextStyle titleStyle) => Builder(\n    builder: (context) {\n      void update() {\n        _blockToast = !_blockToast;\n        setting.put(SettingBoxKey.blockToast, _blockToast);\n        (context as Element).markNeedsBuild();\n      }\n\n      return ListTile(\n        dense: true,\n        onTap: update,\n        title: Text(\n          '显示跳过Toast',\n          style: titleStyle,\n        ),\n        trailing: Transform.scale(\n          alignment: Alignment.centerRight,\n          scale: 0.8,\n          child: Switch(\n            value: _blockToast,\n            onChanged: (val) => update(),\n          ),\n        ),\n      );\n    },\n  );\n\n  Widget _blockTrackItem(\n    TextStyle titleStyle,\n    TextStyle subTitleStyle,\n  ) => Builder(\n    builder: (context) {\n      void update() {\n        _blockTrack = !_blockTrack;\n        setting.put(SettingBoxKey.blockTrack, _blockTrack);\n        (context as Element).markNeedsBuild();\n      }\n\n      return ListTile(\n        dense: true,\n        onTap: update,\n        title: Text(\n          '跳过次数统计跟踪',\n          style: titleStyle,\n        ),\n        subtitle: Text(\n          // from origin extension\n          '此功能追踪您跳过了哪些片段，让用户知道他们提交的片段帮助了多少人。同时点赞会作为依据，确保垃圾信息不会污染数据库。在您每次跳过片段时，我们都会向服务器发送一条消息。希望大家开启此项设置，以便得到更准确的统计数据。:)',\n          style: subTitleStyle,\n        ),\n        trailing: Transform.scale(\n          alignment: Alignment.centerRight,\n          scale: 0.8,\n          child: Switch(\n            value: _blockTrack,\n            onChanged: (val) => update(),\n          ),\n        ),\n      );\n    },\n  );\n\n  Widget _blockUserInfo(\n    ThemeData theme,\n    TextStyle titleStyle,\n    TextStyle subTitleStyle,\n  ) => Obx(\n    () {\n      return ListTile(\n        dense: true,\n        onTap: () {\n          _userInfo.value = LoadingState.loading();\n          _getUserInfo();\n        },\n        title: Text(\n          '您的信息',\n          style: titleStyle,\n        ),\n        subtitle: switch (_userInfo.value) {\n          Loading() => const SizedBox.shrink(),\n          Success<UserInfo>(:final response) => Text(\n            response.toString(),\n            style: subTitleStyle,\n          ),\n          Error(:final errMsg) => Text(\n            errMsg ?? '服务器错误',\n            style: subTitleStyle.copyWith(color: theme.colorScheme.error),\n          ),\n        },\n      );\n    },\n  );\n\n  Widget _blockServerItem(\n    ThemeData theme,\n    TextStyle titleStyle,\n    TextStyle subTitleStyle,\n  ) => Builder(\n    builder: (context) {\n      return ListTile(\n        dense: true,\n        onTap: () {\n          _textController.text = _blockServer;\n          showDialog(\n            context: context,\n            builder: (_) => AlertDialog(\n              title: Text('服务器地址', style: titleStyle),\n              content: TextFormField(\n                keyboardType: TextInputType.url,\n                controller: _textController,\n                autofocus: true,\n              ),\n              actions: [\n                TextButton(\n                  onPressed: () {\n                    Get.back();\n                    _blockServer = HttpString.sponsorBlockBaseUrl;\n                    setting.put(SettingBoxKey.blockServer, _blockServer);\n                    Request.accountManager.blockServer = _blockServer;\n                    (context as Element).markNeedsBuild();\n                  },\n                  child: const Text('重置'),\n                ),\n                TextButton(\n                  onPressed: Get.back,\n                  child: Text(\n                    '取消',\n                    style: TextStyle(\n                      color: theme.colorScheme.outline,\n                    ),\n                  ),\n                ),\n                TextButton(\n                  onPressed: () {\n                    Get.back();\n                    _blockServer = _textController.text;\n                    setting.put(SettingBoxKey.blockServer, _blockServer);\n                    Request.accountManager.blockServer = _blockServer;\n                    _checkServerStatus();\n                    _getUserInfo();\n                    (context as Element).markNeedsBuild();\n                  },\n                  child: const Text('确定'),\n                ),\n              ],\n            ),\n          );\n        },\n        title: Text(\n          '服务器地址',\n          style: titleStyle,\n        ),\n        subtitle: Text(\n          _blockServer,\n          style: subTitleStyle,\n        ),\n      );\n    },\n  );\n\n  Widget _serverStatusItem(ThemeData theme, TextStyle titleStyle) => Obx(\n    () {\n      String status;\n      Color? color;\n      switch (_serverStatus.value) {\n        case null:\n          status = '——';\n        case true:\n          status = '正常';\n          color = theme.colorScheme.primary;\n        case false:\n          status = '错误';\n          color = theme.colorScheme.error;\n      }\n      return ListTile(\n        dense: true,\n        onTap: () {\n          _serverStatus.value = null;\n          _checkServerStatus();\n        },\n        title: Text('服务器状态', style: titleStyle),\n        trailing: Text(\n          status,\n          style: TextStyle(fontSize: 13, color: color),\n        ),\n      );\n    },\n  );\n\n  void onSelectColor(\n    BuildContext context,\n    int index,\n    Color color,\n    Pair<SegmentType, SkipType> item,\n  ) {\n    showDialog(\n      context: context,\n      builder: (_) => AlertDialog(\n        clipBehavior: Clip.hardEdge,\n        contentPadding: const EdgeInsets.symmetric(vertical: 16),\n        title: Text.rich(\n          TextSpan(\n            children: [\n              const TextSpan(\n                text: 'Color Picker ',\n                style: TextStyle(fontSize: 15),\n              ),\n              WidgetSpan(\n                alignment: PlaceholderAlignment.middle,\n                child: Container(\n                  height: 10,\n                  width: 10,\n                  decoration: BoxDecoration(\n                    shape: BoxShape.circle,\n                    color: color,\n                  ),\n                ),\n                style: const TextStyle(fontSize: 13, height: 1),\n              ),\n              TextSpan(\n                text: ' ${item.first.title}',\n                style: const TextStyle(fontSize: 13, height: 1),\n              ),\n            ],\n          ),\n        ),\n        content: SlideColorPicker(\n          color: color,\n          showResetBtn: true,\n          onChanged: (Color? color) {\n            _blockColor[index] = color ?? item.first.color;\n            setting.put(\n              SettingBoxKey.blockColor,\n              _blockColor\n                  .map((item) => item.toARGB32().toRadixString(16).substring(2))\n                  .toList(),\n            );\n            (context as Element).markNeedsBuild();\n          },\n        ),\n      ),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n\n    const titleStyle = TextStyle(fontSize: 15);\n\n    final subTitleStyle = TextStyle(\n      fontSize: 13,\n      color: theme.colorScheme.outline,\n    );\n\n    final divider = Divider(\n      height: 1,\n      color: theme.colorScheme.outline.withValues(alpha: 0.1),\n    );\n\n    final sliverDivider = SliverToBoxAdapter(child: divider);\n\n    final dividerL = SliverToBoxAdapter(\n      child: Divider(\n        thickness: 16,\n        color: theme.colorScheme.outline.withValues(alpha: 0.1),\n      ),\n    );\n\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(title: const Text('空降助手')),\n      body: CustomScrollView(\n        slivers: [\n          dividerL,\n          SliverToBoxAdapter(child: _serverStatusItem(theme, titleStyle)),\n          dividerL,\n          SliverToBoxAdapter(\n            child: _blockLimitItem(theme, titleStyle, subTitleStyle),\n          ),\n          sliverDivider,\n          SliverToBoxAdapter(child: _blockToastItem(titleStyle)),\n          sliverDivider,\n          SliverToBoxAdapter(child: _blockTrackItem(titleStyle, subTitleStyle)),\n          sliverDivider,\n          SliverToBoxAdapter(\n            child: _blockUserInfo(theme, titleStyle, subTitleStyle),\n          ),\n          dividerL,\n          SliverList.separated(\n            itemCount: _blockSettings.length,\n            itemBuilder: (context, index) =>\n                _buildItem(theme, index, _blockSettings[index]),\n            separatorBuilder: (context, index) => divider,\n          ),\n          dividerL,\n          SliverToBoxAdapter(\n            child: _userIdItem(theme, titleStyle, subTitleStyle),\n          ),\n          sliverDivider,\n          SliverToBoxAdapter(\n            child: _blockServerItem(theme, titleStyle, subTitleStyle),\n          ),\n          dividerL,\n          SliverToBoxAdapter(child: _aboutItem(titleStyle, subTitleStyle)),\n          dividerL,\n          SliverToBoxAdapter(\n            child: SizedBox(\n              height: 55 + MediaQuery.viewPaddingOf(context).bottom,\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget _buildItem(\n    ThemeData theme,\n    int index,\n    Pair<SegmentType, SkipType> item,\n  ) {\n    return Builder(\n      builder: (context) {\n        Color color = _blockColor[index];\n        final isDisable = item.second == SkipType.disable;\n        return ListTile(\n          dense: true,\n          enabled: item.second != SkipType.disable,\n          onTap: () => onSelectColor(context, index, color, item),\n          title: Row(\n            mainAxisAlignment: MainAxisAlignment.spaceBetween,\n            children: [\n              Text.rich(\n                TextSpan(\n                  children: [\n                    WidgetSpan(\n                      alignment: PlaceholderAlignment.middle,\n                      child: Container(\n                        height: 10,\n                        width: 10,\n                        decoration: BoxDecoration(\n                          shape: BoxShape.circle,\n                          color: color,\n                        ),\n                      ),\n                      style: const TextStyle(fontSize: 14, height: 1),\n                    ),\n                    TextSpan(\n                      text: ' ${item.first.title}',\n                      style: const TextStyle(fontSize: 14, height: 1),\n                    ),\n                  ],\n                ),\n              ),\n              Builder(\n                builder: (btnContext) {\n                  return PopupMenuButton<SkipType>(\n                    initialValue: item.second,\n                    onSelected: (e) {\n                      final updateItem = isDisable || e == SkipType.disable;\n                      item.second = e;\n                      setting.put(\n                        SettingBoxKey.blockSettings,\n                        _blockSettings.map((e) => e.second.index).toList(),\n                      );\n                      if (updateItem) {\n                        (context as Element).markNeedsBuild();\n                      } else {\n                        (btnContext as Element).markNeedsBuild();\n                      }\n                    },\n                    itemBuilder: (context) => SkipType.values\n                        .map(\n                          (item) => PopupMenuItem<SkipType>(\n                            value: item,\n                            child: Text(item.label),\n                          ),\n                        )\n                        .toList(),\n                    child: Padding(\n                      padding: const EdgeInsets.symmetric(vertical: 8),\n                      child: Text.rich(\n                        style: TextStyle(\n                          height: 1,\n                          fontSize: 14,\n                          color: isDisable\n                              ? theme.colorScheme.outline.withValues(\n                                  alpha: 0.7,\n                                )\n                              : theme.colorScheme.secondary,\n                        ),\n                        strutStyle: const StrutStyle(\n                          height: 1,\n                          leading: 0,\n                          fontSize: 14,\n                        ),\n                        TextSpan(\n                          children: [\n                            TextSpan(text: item.second.label),\n                            WidgetSpan(\n                              alignment: .middle,\n                              child: Icon(\n                                size: 14,\n                                MdiIcons.unfoldMoreHorizontal,\n                                color: isDisable\n                                    ? theme.colorScheme.outline.withValues(\n                                        alpha: 0.7,\n                                      )\n                                    : theme.colorScheme.secondary,\n                              ),\n                            ),\n                          ],\n                        ),\n                      ),\n                    ),\n                  );\n                },\n              ),\n            ],\n          ),\n          subtitle: Text(\n            item.first.description,\n            style: TextStyle(\n              fontSize: 12,\n              color: isDisable ? null : theme.colorScheme.outline,\n            ),\n          ),\n        );\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/subscription/controller.dart",
    "content": "import 'package:PiliPlus/http/fav.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/user.dart';\nimport 'package:PiliPlus/models_new/sub/sub/data.dart';\nimport 'package:PiliPlus/models_new/sub/sub/list.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass SubController extends CommonListController<SubData, SubItemModel> {\n  late final account = Accounts.main;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  Future<void> queryData([bool isRefresh = true]) {\n    if (!account.isLogin) {\n      loadingState.value = const Error('账号未登录');\n      return Future.syncValue(null);\n    }\n    return super.queryData(isRefresh);\n  }\n\n  // 取消订阅\n  void cancelSub(SubItemModel subFolderItem) {\n    showDialog(\n      context: Get.context!,\n      builder: (context) => AlertDialog(\n        title: const Text('提示'),\n        content: const Text('确定取消订阅吗？'),\n        actions: [\n          TextButton(\n            onPressed: Get.back,\n            child: Text(\n              '取消',\n              style: TextStyle(color: Theme.of(context).colorScheme.outline),\n            ),\n          ),\n          TextButton(\n            onPressed: () async {\n              final res = await FavHttp.cancelSub(\n                id: subFolderItem.id!,\n                type: subFolderItem.type!,\n              );\n              if (res.isSuccess) {\n                loadingState\n                  ..value.data!.remove(subFolderItem)\n                  ..refresh();\n                SmartDialog.showToast('取消订阅成功');\n              } else {\n                res.toast();\n              }\n              Get.back();\n            },\n            child: const Text('确定'),\n          ),\n        ],\n      ),\n    );\n  }\n\n  @override\n  List<SubItemModel>? getDataList(SubData response) {\n    if (response.hasMore == false) {\n      isEnd = true;\n    }\n    return response.list;\n  }\n\n  @override\n  Future<LoadingState<SubData>> customGetData() => UserHttp.userSubFolder(\n    pn: page,\n    ps: 20,\n    mid: account.mid,\n  );\n}\n"
  },
  {
    "path": "lib/pages/subscription/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/view_sliver_safe_area.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/sub/sub/list.dart';\nimport 'package:PiliPlus/pages/subscription/controller.dart';\nimport 'package:PiliPlus/pages/subscription/widgets/item.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass SubPage extends StatefulWidget {\n  const SubPage({super.key});\n\n  @override\n  State<SubPage> createState() => _SubPageState();\n}\n\nclass _SubPageState extends State<SubPage> with GridMixin {\n  final SubController _subController = Get.put(SubController());\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(title: const Text('我的订阅')),\n      body: refreshIndicator(\n        onRefresh: _subController.onRefresh,\n        child: CustomScrollView(\n          physics: const AlwaysScrollableScrollPhysics(),\n          slivers: [\n            ViewSliverSafeArea(\n              sliver: Obx(\n                () => _buildBody(_subController.loadingState.value),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget _buildBody(LoadingState<List<SubItemModel>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => gridSkeleton,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverGrid.builder(\n                gridDelegate: gridDelegate,\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    _subController.onLoadMore();\n                  }\n                  final item = response[index];\n                  return SubItem(\n                    item: item,\n                    cancelSub: () => _subController.cancelSub(item),\n                  );\n                },\n                itemCount: response.length,\n              )\n            : HttpError(onReload: _subController.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _subController.onReload,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/subscription/widgets/item.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models_new/sub/sub/list.dart';\nimport 'package:PiliPlus/pages/subscription_detail/view.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass SubItem extends StatelessWidget {\n  final SubItemModel item;\n  final VoidCallback cancelSub;\n  const SubItem({\n    super.key,\n    required this.item,\n    required this.cancelSub,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    String heroTag = Utils.makeHeroTag(item.id);\n    final type = switch (item.type) {\n      11 => '收藏夹',\n      21 => '合集',\n      _ => '其它(${item.type})',\n    };\n    void onLongPress() => imageSaveDialog(\n      title: item.title,\n      cover: item.cover,\n    );\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onTap: () {\n          if (item.state == 1) {\n            SmartDialog.showToast('该$type已失效');\n            return;\n          }\n          if (item.type == 11) {\n            Get.toNamed(\n              '/favDetail',\n              parameters: {\n                'mediaId': item.id!.toString(),\n                'heroTag': heroTag,\n              },\n            );\n          } else {\n            SubDetailPage.toSubDetailPage(\n              item.id!,\n              heroTag: heroTag,\n              subInfo: item,\n            );\n          }\n        },\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        child: Padding(\n          padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 5),\n          child: Row(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              AspectRatio(\n                aspectRatio: StyleString.aspectRatio,\n                child: LayoutBuilder(\n                  builder: (context, boxConstraints) {\n                    double maxWidth = boxConstraints.maxWidth;\n                    double maxHeight = boxConstraints.maxHeight;\n                    return Stack(\n                      clipBehavior: Clip.none,\n                      children: [\n                        Hero(\n                          tag: heroTag,\n                          child: NetworkImgLayer(\n                            src: item.cover,\n                            width: maxWidth,\n                            height: maxHeight,\n                          ),\n                        ),\n                        PBadge(\n                          right: 6,\n                          top: 6,\n                          text: type,\n                        ),\n                      ],\n                    );\n                  },\n                ),\n              ),\n              const SizedBox(width: 10),\n              content(context),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget content(BuildContext context) {\n    final theme = Theme.of(context);\n    final style = TextStyle(\n      fontSize: 13,\n      color: theme.colorScheme.outline,\n    );\n    return Expanded(\n      child: Stack(\n        clipBehavior: Clip.none,\n        children: [\n          Column(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              Expanded(\n                child: Text(\n                  item.title!,\n                  maxLines: 2,\n                  overflow: TextOverflow.ellipsis,\n                  textAlign: TextAlign.start,\n                  style: const TextStyle(\n                    letterSpacing: 0.3,\n                  ),\n                ),\n              ),\n              Text(\n                'UP主: ${item.upper!.name!}',\n                textAlign: TextAlign.start,\n                style: style,\n                maxLines: 1,\n                overflow: TextOverflow.ellipsis,\n              ),\n              const SizedBox(height: 4),\n              Text(\n                '${item.mediaCount}个视频',\n                textAlign: TextAlign.start,\n                style: style,\n              ),\n            ],\n          ),\n          Positioned(\n            bottom: 0,\n            right: 0,\n            height: 35,\n            width: 35,\n            child: IconButton(\n              onPressed: cancelSub,\n              style: TextButton.styleFrom(\n                foregroundColor: theme.colorScheme.outline,\n                padding: EdgeInsets.zero,\n              ),\n              icon: const Icon(Icons.delete_outline, size: 18),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/subscription_detail/controller.dart",
    "content": "import 'package:PiliPlus/http/fav.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/sub/sub/list.dart';\nimport 'package:PiliPlus/models_new/sub/sub_detail/data.dart';\nimport 'package:PiliPlus/models_new/sub/sub_detail/media.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:get/get.dart';\n\nclass SubDetailController\n    extends CommonListController<SubDetailData, SubDetailItemModel> {\n  late int id;\n  String? heroTag;\n  SubItemModel? subInfo;\n\n  @override\n  void onInit() {\n    super.onInit();\n    final args = Get.arguments;\n    id = args['id'];\n    subInfo = args['subInfo'];\n    heroTag = args['heroTag'];\n\n    queryData();\n  }\n\n  @override\n  List<SubDetailItemModel>? getDataList(SubDetailData response) {\n    subInfo = response.info;\n    return response.medias;\n  }\n\n  @override\n  void checkIsEnd(int length) {\n    final count = subInfo?.mediaCount;\n    if (count != null && length >= count) {\n      isEnd = true;\n    }\n  }\n\n  @override\n  Future<LoadingState<SubDetailData>> customGetData() => FavHttp.favSeasonList(\n    id: id,\n    ps: 20,\n    pn: page,\n  );\n}\n"
  },
  {
    "path": "lib/pages/subscription_detail/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/sub/sub/list.dart';\nimport 'package:PiliPlus/models_new/sub/sub_detail/media.dart';\nimport 'package:PiliPlus/pages/subscription_detail/controller.dart';\nimport 'package:PiliPlus/pages/subscription_detail/widget/sub_video_card.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass SubDetailPage extends StatefulWidget {\n  const SubDetailPage({super.key});\n\n  @override\n  State<SubDetailPage> createState() => _SubDetailPageState();\n\n  static void toSubDetailPage(\n    int id, {\n    String? heroTag,\n    SubItemModel? subInfo,\n  }) {\n    Get.toNamed(\n      '/subDetail',\n      arguments: {\n        'id': id,\n        'subInfo': subInfo,\n        'heroTag': heroTag,\n      },\n    );\n  }\n}\n\nclass _SubDetailPageState extends State<SubDetailPage> with GridMixin {\n  late final SubDetailController _subDetailController;\n\n  @override\n  void initState() {\n    super.initState();\n    _subDetailController = Get.put(\n      SubDetailController(),\n      tag: Utils.makeHeroTag(Get.parameters['id']),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    final padding = MediaQuery.viewPaddingOf(context);\n    return Material(\n      color: theme.colorScheme.surface,\n      child: refreshIndicator(\n        onRefresh: _subDetailController.onRefresh,\n        child: CustomScrollView(\n          controller: _subDetailController.scrollController,\n          physics: const AlwaysScrollableScrollPhysics(),\n          slivers: [\n            _appBar(theme, padding),\n            SliverPadding(\n              padding: EdgeInsets.only(\n                top: 7,\n                left: padding.left,\n                right: padding.right,\n                bottom: padding.bottom + 100,\n              ),\n              sliver: Obx(\n                () => _buildBody(_subDetailController.loadingState.value),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget _buildBody(LoadingState<List<SubDetailItemModel>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => gridSkeleton,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverGrid.builder(\n                gridDelegate: gridDelegate,\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    _subDetailController.onLoadMore();\n                  }\n                  return SubVideoCardH(\n                    videoItem: response[index],\n                  );\n                },\n                itemCount: response.length,\n              )\n            : HttpError(onReload: _subDetailController.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _subDetailController.onReload,\n      ),\n    };\n  }\n\n  Widget _appBar(ThemeData theme, EdgeInsets padding) {\n    final info = _subDetailController.subInfo;\n    if (info != null) return _buildAppBar(theme, padding, info);\n    return Obx(() {\n      return switch (_subDetailController.loadingState.value) {\n        Loading() || Error() => const SliverAppBar(),\n        Success() => _buildAppBar(\n          theme,\n          padding,\n          _subDetailController.subInfo!,\n        ),\n      };\n    });\n  }\n\n  Widget _buildAppBar(ThemeData theme, EdgeInsets padding, SubItemModel info) {\n    final style = TextStyle(\n      height: 1,\n      fontSize: 12.5,\n      color: theme.colorScheme.outline,\n    );\n    Widget cover = NetworkImgLayer(\n      width: 176,\n      height: 110,\n      src: info.cover,\n    );\n    if (_subDetailController.heroTag != null) {\n      cover = Hero(\n        tag: _subDetailController.heroTag!,\n        child: cover,\n      );\n    }\n    return SliverAppBar.medium(\n      expandedHeight: kToolbarHeight + 132,\n      pinned: true,\n      title: Column(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          Text(\n            info.title!,\n            maxLines: 1,\n            overflow: TextOverflow.ellipsis,\n            style: theme.textTheme.titleMedium,\n          ),\n          Text(\n            '共${info.mediaCount}条视频',\n            style: theme.textTheme.labelMedium,\n          ),\n        ],\n      ),\n      flexibleSpace: FlexibleSpaceBar(\n        background: Container(\n          decoration: BoxDecoration(\n            border: Border(\n              bottom: BorderSide(\n                color: theme.dividerColor.withValues(alpha: 0.2),\n              ),\n            ),\n          ),\n          padding: EdgeInsets.only(\n            top: kToolbarHeight + padding.top + 10,\n            left: 12 + padding.left,\n            right: 12,\n            bottom: 12,\n          ),\n          child: Row(\n            spacing: 12,\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              cover,\n              Expanded(\n                child: Column(\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    Expanded(\n                      child: Text(\n                        info.title!,\n                        maxLines: 2,\n                        overflow: TextOverflow.ellipsis,\n                        style: const TextStyle(\n                          fontSize: 15,\n                          fontWeight: FontWeight.bold,\n                        ),\n                      ),\n                    ),\n                    GestureDetector(\n                      onTap: () =>\n                          Get.toNamed('/member?mid=${info.upper!.mid}'),\n                      child: Text(\n                        info.upper!.name!,\n                        style: TextStyle(color: theme.colorScheme.primary),\n                      ),\n                    ),\n                    const SizedBox(height: 4),\n                    Text('共${info.mediaCount}条视频', style: style),\n                    const SizedBox(height: 4),\n                    Text(\n                      '${NumUtils.numFormat(info.viewCount ?? info.cntInfo?.play)}次播放',\n                      style: style,\n                    ),\n                  ],\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/subscription_detail/widget/sub_video_card.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/stat/stat.dart';\nimport 'package:PiliPlus/http/search.dart';\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models/common/stat_type.dart';\nimport 'package:PiliPlus/models_new/sub/sub_detail/media.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/duration_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\n\n// 收藏视频卡片 - 水平布局\nclass SubVideoCardH extends StatelessWidget {\n  final SubDetailItemModel videoItem;\n  final int? searchType;\n\n  const SubVideoCardH({\n    super.key,\n    required this.videoItem,\n    this.searchType,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    void onLongPress() => imageSaveDialog(\n      title: videoItem.title,\n      cover: videoItem.cover,\n      bvid: videoItem.bvid,\n    );\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onTap: () async {\n          int? cid = await SearchHttp.ab2c(bvid: videoItem.bvid);\n          if (cid != null) {\n            PageUtils.toVideoPage(\n              bvid: videoItem.bvid,\n              cid: cid,\n              cover: videoItem.cover,\n              title: videoItem.title,\n            );\n          }\n        },\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        child: Padding(\n          padding: const EdgeInsets.symmetric(\n            horizontal: StyleString.safeSpace,\n            vertical: 5,\n          ),\n          child: Row(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              AspectRatio(\n                aspectRatio: StyleString.aspectRatio,\n                child: LayoutBuilder(\n                  builder: (context, boxConstraints) {\n                    double maxWidth = boxConstraints.maxWidth;\n                    double maxHeight = boxConstraints.maxHeight;\n                    return Stack(\n                      clipBehavior: Clip.none,\n                      children: [\n                        NetworkImgLayer(\n                          src: videoItem.cover,\n                          width: maxWidth,\n                          height: maxHeight,\n                        ),\n                        PBadge(\n                          text: DurationUtils.formatDuration(\n                            videoItem.duration,\n                          ),\n                          right: 6.0,\n                          bottom: 6.0,\n                          type: PBadgeType.gray,\n                        ),\n                      ],\n                    );\n                  },\n                ),\n              ),\n              const SizedBox(width: 10),\n              content(context),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget content(BuildContext context) {\n    return Expanded(\n      child: Column(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          Expanded(\n            child: Text(\n              videoItem.title!,\n              textAlign: TextAlign.start,\n              style: const TextStyle(\n                letterSpacing: 0.3,\n              ),\n              maxLines: 2,\n              overflow: TextOverflow.ellipsis,\n            ),\n          ),\n          Text(\n            DateFormatUtils.dateFormat(videoItem.pubtime),\n            style: TextStyle(\n              fontSize: 12,\n              color: Theme.of(context).colorScheme.outline,\n            ),\n          ),\n          const SizedBox(height: 3),\n          Row(\n            spacing: 8,\n            children: [\n              StatWidget(\n                type: StatType.play,\n                value: videoItem.cntInfo?.play,\n              ),\n              StatWidget(\n                type: StatType.danmaku,\n                value: videoItem.cntInfo?.danmaku,\n              ),\n            ],\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/ai_conclusion/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/selectable_text/text.dart';\nimport 'package:PiliPlus/common/widgets/gesture/tap_gesture_recognizer.dart';\nimport 'package:PiliPlus/models_new/video/video_ai_conclusion/model_result.dart';\nimport 'package:PiliPlus/pages/common/slide/common_slide_page.dart';\nimport 'package:PiliPlus/pages/video/controller.dart';\nimport 'package:PiliPlus/utils/duration_utils.dart';\nimport 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass AiConclusionPanel extends CommonSlidePage {\n  final AiConclusionResult item;\n\n  const AiConclusionPanel({\n    super.key,\n    required this.item,\n  });\n\n  @override\n  State<AiConclusionPanel> createState() => _AiDetailState();\n\n  static Widget buildContent(\n    BuildContext context,\n    ThemeData theme,\n    AiConclusionResult res, {\n    Key? key,\n    bool tap = true,\n  }) {\n    return CustomScrollView(\n      key: key,\n      shrinkWrap: !tap,\n      physics: const AlwaysScrollableScrollPhysics(),\n      slivers: [\n        if (res.summary?.isNotEmpty == true) ...[\n          SliverToBoxAdapter(\n            child: Padding(\n              padding: const EdgeInsets.symmetric(horizontal: 14),\n              child: selectableText(\n                res.summary!,\n                style: const TextStyle(\n                  fontSize: 15,\n                  height: 1.5,\n                ),\n              ),\n            ),\n          ),\n          if (res.outline?.isNotEmpty == true)\n            SliverToBoxAdapter(\n              child: Divider(\n                height: 20,\n                color: theme.dividerColor.withValues(alpha: 0.1),\n                thickness: 6,\n              ),\n            ),\n        ],\n        if (res.outline?.isNotEmpty == true)\n          SliverPadding(\n            padding: EdgeInsets.only(\n              left: 14,\n              right: 14,\n              bottom: !tap ? 0 : MediaQuery.viewPaddingOf(context).bottom + 100,\n            ),\n            sliver: SliverList.builder(\n              itemCount: res.outline!.length,\n              itemBuilder: (context, index) {\n                final item = res.outline![index];\n                return SelectionArea(\n                  child: Column(\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: [\n                      if (index != 0) const SizedBox(height: 10),\n                      Text(\n                        item.title!,\n                        style: const TextStyle(\n                          fontSize: 14,\n                          fontWeight: FontWeight.bold,\n                          height: 1.5,\n                        ),\n                      ),\n                      const SizedBox(height: 6),\n                      ...?item.partOutline?.map(\n                        (item) => Wrap(\n                          children: [\n                            Text.rich(\n                              TextSpan(\n                                style: TextStyle(\n                                  fontSize: 14,\n                                  color: theme.colorScheme.onSurface,\n                                  height: 1.5,\n                                ),\n                                children: [\n                                  TextSpan(\n                                    text: DurationUtils.formatDuration(\n                                      item.timestamp,\n                                    ),\n                                    style: tap\n                                        ? TextStyle(\n                                            color: theme.colorScheme.primary,\n                                          )\n                                        : null,\n                                    recognizer: tap\n                                        ? (NoDeadlineTapGestureRecognizer()\n                                            ..onTap = () {\n                                              try {\n                                                Get.find<VideoDetailController>(\n                                                  tag: Get.arguments['heroTag'],\n                                                ).plPlayerController.seekTo(\n                                                  Duration(\n                                                    seconds: item.timestamp!,\n                                                  ),\n                                                  isSeek: false,\n                                                );\n                                              } catch (_) {}\n                                            })\n                                        : null,\n                                  ),\n                                  const TextSpan(text: ' '),\n                                  TextSpan(text: item.content!),\n                                ],\n                              ),\n                            ),\n                          ],\n                        ),\n                      ),\n                    ],\n                  ),\n                );\n              },\n            ),\n          ),\n      ],\n    );\n  }\n}\n\nclass _AiDetailState extends State<AiConclusionPanel>\n    with SingleTickerProviderStateMixin, CommonSlideMixin {\n  @override\n  Widget buildPage(ThemeData theme) {\n    return Material(\n      color: theme.colorScheme.surface,\n      child: Column(\n        children: [\n          GestureDetector(\n            onTap: Get.back,\n            child: SizedBox(\n              height: 35,\n              child: Center(\n                child: Container(\n                  width: 32,\n                  height: 3,\n                  decoration: BoxDecoration(\n                    color: theme.colorScheme.primary,\n                    borderRadius: const BorderRadius.all(Radius.circular(3)),\n                  ),\n                ),\n              ),\n            ),\n          ),\n          Expanded(\n            child: enableSlide ? slideList(theme) : buildList(theme),\n          ),\n        ],\n      ),\n    );\n  }\n\n  late Key _key;\n  late bool _isNested;\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    final controller = PrimaryScrollController.of(context);\n    _isNested = controller is ExtendedNestedScrollController;\n    _key = ValueKey(controller.hashCode);\n  }\n\n  @override\n  Widget buildList(ThemeData theme) {\n    final child = AiConclusionPanel.buildContent(\n      context,\n      theme,\n      widget.item,\n      key: _key,\n    );\n    if (_isNested) {\n      return ExtendedVisibilityDetector(\n        uniqueKey: const Key('ai-conclusion'),\n        child: child,\n      );\n    }\n    return child;\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/controller.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\nimport 'dart:math' show min;\nimport 'dart:ui';\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/pair.dart';\nimport 'package:PiliPlus/common/widgets/progress_bar/segment_progress_bar.dart';\nimport 'package:PiliPlus/grpc/bilibili/app/listener/v1.pbenum.dart'\n    show PlaylistSource;\nimport 'package:PiliPlus/http/fav.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/user.dart';\nimport 'package:PiliPlus/http/video.dart';\nimport 'package:PiliPlus/main.dart';\nimport 'package:PiliPlus/models/common/account_type.dart';\nimport 'package:PiliPlus/models/common/sponsor_block/action_type.dart';\nimport 'package:PiliPlus/models/common/sponsor_block/post_segment_model.dart';\nimport 'package:PiliPlus/models/common/sponsor_block/segment_model.dart';\nimport 'package:PiliPlus/models/common/sponsor_block/segment_type.dart';\nimport 'package:PiliPlus/models/common/video/audio_quality.dart';\nimport 'package:PiliPlus/models/common/video/source_type.dart';\nimport 'package:PiliPlus/models/common/video/subtitle_pref_type.dart';\nimport 'package:PiliPlus/models/common/video/video_decode_type.dart';\nimport 'package:PiliPlus/models/common/video/video_quality.dart';\nimport 'package:PiliPlus/models/common/video/video_type.dart';\nimport 'package:PiliPlus/models/video/play/url.dart';\nimport 'package:PiliPlus/models_new/download/bili_download_entry_info.dart';\nimport 'package:PiliPlus/models_new/media_list/media_list.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/result.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/data.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/episode.dart' as ugc;\nimport 'package:PiliPlus/models_new/video/video_detail/page.dart';\nimport 'package:PiliPlus/models_new/video/video_pbp/data.dart';\nimport 'package:PiliPlus/models_new/video/video_play_info/subtitle.dart';\nimport 'package:PiliPlus/models_new/video/video_stein_edgeinfo/data.dart';\nimport 'package:PiliPlus/pages/audio/view.dart';\nimport 'package:PiliPlus/pages/common/publish/publish_route.dart';\nimport 'package:PiliPlus/pages/search/widgets/search_text.dart';\nimport 'package:PiliPlus/pages/sponsor_block/block_mixin.dart';\nimport 'package:PiliPlus/pages/video/download_panel/view.dart';\nimport 'package:PiliPlus/pages/video/introduction/pgc/controller.dart';\nimport 'package:PiliPlus/pages/video/introduction/ugc/controller.dart';\nimport 'package:PiliPlus/pages/video/medialist/view.dart';\nimport 'package:PiliPlus/pages/video/note/view.dart';\nimport 'package:PiliPlus/pages/video/post_panel/view.dart';\nimport 'package:PiliPlus/pages/video/send_danmaku/view.dart';\nimport 'package:PiliPlus/pages/video/widgets/header_control.dart';\nimport 'package:PiliPlus/plugin/pl_player/controller.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/data_source.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/heart_beat_type.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/play_status.dart';\nimport 'package:PiliPlus/services/download/download_service.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/extension/context_ext.dart';\nimport 'package:PiliPlus/utils/extension/file_ext.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/extension/size_ext.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/path_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:PiliPlus/utils/video_utils.dart';\nimport 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:flutter_volume_controller/flutter_volume_controller.dart';\nimport 'package:get/get.dart';\nimport 'package:hive_ce/hive.dart';\nimport 'package:media_kit/media_kit.dart' hide Subtitle;\nimport 'package:path/path.dart' as path;\n\nclass VideoDetailController extends GetxController\n    with GetTickerProviderStateMixin, BlockMixin {\n  /// 路由传参\n  late final Map args;\n  late String bvid;\n  late int aid;\n  late final RxInt cid;\n  int? epId;\n  int? seasonId;\n  int? pgcType;\n  late final String heroTag;\n  late final RxString cover;\n\n  // 视频类型 默认投稿视频\n  late final VideoType videoType;\n  @override\n  late final isUgc = videoType == VideoType.ugc;\n  VideoType? _actualVideoType;\n\n  // 页面来源 稍后再看 收藏夹\n  late bool isPlayAll;\n  late SourceType sourceType;\n  late BiliDownloadEntryInfo entry;\n  late bool isFileSource;\n  late bool _mediaDesc = false;\n  late final RxList<MediaListItemModel> mediaList = <MediaListItemModel>[].obs;\n  late String watchLaterTitle;\n\n  /// tabs相关配置\n  late TabController tabCtr;\n\n  // 请求返回的视频信息\n  late PlayUrlModel data;\n  final RxBool videoState = false.obs;\n\n  /// 播放器配置 画质 音质 解码格式\n  final Rxn<VideoQuality> currentVideoQa = Rxn<VideoQuality>();\n  AudioQuality? currentAudioQa;\n  late VideoDecodeFormatType currentDecodeFormats;\n\n  // 是否开始自动播放 存在多p的情况下，第二p需要为true\n  final RxBool _autoPlay = Pref.autoPlayEnable.obs;\n\n  final videoPlayerKey = GlobalKey();\n  final childKey = GlobalKey<ScaffoldState>();\n\n  final plPlayerController = PlPlayerController.getInstance()\n    ..brightness.value = -1;\n  bool get setSystemBrightness => plPlayerController.setSystemBrightness;\n\n  late VideoItem firstVideo;\n  String? videoUrl;\n  String? audioUrl;\n  Duration? defaultST;\n  Duration? playedTime;\n  String get playedTimePos {\n    final pos = playedTime?.inMilliseconds;\n    return pos == null || pos == 0 ? '' : '?t=${pos / 1000}';\n  }\n\n  // 亮度\n  double? brightness;\n\n  late final headerCtrKey = GlobalKey<TimeBatteryMixin>();\n\n  Box setting = GStorage.setting;\n\n  // 预设的解码格式\n  late String cacheDecode = Pref.defaultDecode; // def avc\n  late String cacheSecondDecode = Pref.secondDecode; // def av1\n\n  bool get showReply => isFileSource\n      ? false\n      : isUgc\n      ? plPlayerController.showVideoReply\n      : plPlayerController.showBangumiReply;\n\n  bool get showRelatedVideo =>\n      isFileSource ? false : plPlayerController.showRelatedVideo;\n\n  ScrollController? introScrollCtr;\n  ScrollController get effectiveIntroScrollCtr =>\n      introScrollCtr ??= ScrollController();\n\n  int? seasonCid;\n  late final RxInt seasonIndex = 0.obs;\n\n  PlayerStatus? playerStatus;\n\n  late final scrollKey = GlobalKey<ExtendedNestedScrollViewState>();\n  late final RxBool isVertical = false.obs;\n  late final RxDouble scrollRatio = 0.0.obs;\n  ScrollController? _scrollCtr;\n  ScrollController get scrollCtr =>\n      _scrollCtr ??= ScrollController()..addListener(scrollListener);\n  late bool isExpanding = false;\n  late bool isCollapsing = false;\n  AnimationController? animController;\n\n  AnimationController get animationController =>\n      animController ??= AnimationController(\n        vsync: this,\n        duration: const Duration(milliseconds: 200),\n      );\n  late double minVideoHeight;\n  late double maxVideoHeight;\n  late double videoHeight;\n\n  void animToTop() {\n    final outerController = scrollKey.currentState!.outerController;\n    if (outerController.hasClients) {\n      outerController.animateTo(\n        outerController.offset,\n        duration: const Duration(milliseconds: 500),\n        curve: Curves.easeInOut,\n      );\n    }\n  }\n\n  @pragma('vm:notify-debugger-on-exception')\n  void setVideoHeight() {\n    try {\n      final isVertical = firstVideo.width != null && firstVideo.height != null\n          ? firstVideo.width! < firstVideo.height!\n          : false;\n      if (!scrollCtr.hasClients) {\n        videoHeight = isVertical ? maxVideoHeight : minVideoHeight;\n        this.isVertical.value = isVertical;\n        return;\n      }\n      if (this.isVertical.value != isVertical) {\n        this.isVertical.value = isVertical;\n        double videoHeight = isVertical ? maxVideoHeight : minVideoHeight;\n        if (this.videoHeight != videoHeight) {\n          if (videoHeight > this.videoHeight) {\n            // current minVideoHeight\n            isExpanding = true;\n            animationController.forward(\n              from: (minVideoHeight - scrollCtr.offset) / maxVideoHeight,\n            );\n            this.videoHeight = maxVideoHeight;\n          } else {\n            // current maxVideoHeight\n            final currentHeight = (maxVideoHeight - scrollCtr.offset)\n                .toPrecision(2);\n            double minVideoHeightPrecise = minVideoHeight.toPrecision(2);\n            if (currentHeight == minVideoHeightPrecise) {\n              isExpanding = true;\n              this.videoHeight = minVideoHeight;\n              animationController.forward(from: 1);\n            } else if (currentHeight < minVideoHeightPrecise) {\n              // expand\n              isExpanding = true;\n              animationController.forward(from: currentHeight / minVideoHeight);\n              this.videoHeight = minVideoHeight;\n            } else {\n              // collapse\n              isCollapsing = true;\n              animationController.forward(\n                from: scrollCtr.offset / (maxVideoHeight - minVideoHeight),\n              );\n              this.videoHeight = minVideoHeight;\n            }\n          }\n        }\n      } else {\n        if (scrollCtr.offset != 0) {\n          isExpanding = true;\n          animationController.forward(from: 1 - scrollCtr.offset / videoHeight);\n        }\n      }\n    } catch (_) {}\n  }\n\n  void scrollListener() {\n    if (scrollCtr.hasClients) {\n      if (scrollCtr.offset == 0) {\n        scrollRatio.value = 0;\n      } else {\n        double offset = scrollCtr.offset - (videoHeight - minVideoHeight);\n        if (offset > 0) {\n          scrollRatio.value = clampDouble(\n            offset.toPrecision(2) /\n                (minVideoHeight - kToolbarHeight).toPrecision(2),\n            0.0,\n            1.0,\n          );\n        } else {\n          scrollRatio.value = 0;\n        }\n      }\n    }\n  }\n\n  final isLoginVideo = Accounts.get(AccountType.video).isLogin;\n\n  late final watchProgress = GStorage.watchProgress;\n  void cacheLocalProgress() {\n    if (plPlayerController.playerStatus.isCompleted) {\n      watchProgress.put(cid.value.toString(), entry.totalTimeMilli);\n    } else if (playedTime case final playedTime?) {\n      watchProgress.put(cid.value.toString(), playedTime.inMilliseconds);\n    }\n  }\n\n  void initFileSource(BiliDownloadEntryInfo entry, {bool isInit = true}) {\n    this.entry = entry;\n    firstVideo = VideoItem(\n      quality: VideoQuality.fromCode(entry.preferedVideoQuality),\n      width: entry.ep?.width ?? entry.pageData?.width ?? 1,\n      height: entry.ep?.height ?? entry.pageData?.height ?? 1,\n    );\n    if (watchProgress.get(cid.value.toString()) case final int progress?) {\n      if (progress >= entry.totalTimeMilli - 400) {\n        defaultST = Duration.zero;\n      } else {\n        defaultST = Duration(milliseconds: progress);\n      }\n    } else {\n      defaultST = Duration.zero;\n    }\n    data = PlayUrlModel(timeLength: entry.totalTimeMilli);\n    if (isInit) {\n      Future.delayed(const Duration(milliseconds: 120), setVideoHeight);\n    } else {\n      setVideoHeight();\n    }\n  }\n\n  @override\n  void onInit() {\n    super.onInit();\n    args = Get.arguments;\n    videoType = args['videoType'];\n    if (videoType == VideoType.pgc) {\n      if (!isLoginVideo) {\n        _actualVideoType = VideoType.ugc;\n      }\n    } else if (args['pgcApi'] == true) {\n      _actualVideoType = VideoType.pgc;\n    }\n\n    bvid = args['bvid'];\n    aid = args['aid'];\n    cid = RxInt(args['cid']);\n    epId = args['epId'];\n    seasonId = args['seasonId'];\n    pgcType = args['pgcType'];\n    heroTag = args['heroTag'];\n    cover = RxString(args['cover'] ?? '');\n\n    sourceType = args['sourceType'] ?? SourceType.normal;\n    isFileSource = sourceType == SourceType.file;\n    isPlayAll = sourceType != SourceType.normal && !isFileSource;\n    if (isFileSource) {\n      initFileSource(args['entry']);\n    } else if (isPlayAll) {\n      watchLaterTitle = args['favTitle'];\n      _mediaDesc = args['desc'];\n      getMediaList();\n    }\n\n    tabCtr = TabController(\n      length: 2,\n      vsync: this,\n      initialIndex: Pref.defaultShowComment ? 1 : 0,\n    );\n  }\n\n  Future<void> getMediaList({\n    bool isReverse = false,\n    bool isLoadPrevious = false,\n  }) async {\n    final count = args['count'];\n    if (!isReverse && count != null && mediaList.length >= count) {\n      return;\n    }\n    final res = await UserHttp.getMediaList(\n      type: args['mediaType'] ?? sourceType.mediaType,\n      bizId: args['mediaId'] ?? -1,\n      ps: 20,\n      direction: isLoadPrevious ? true : false,\n      oid: isReverse\n          ? null\n          : mediaList.isEmpty\n          ? args['isContinuePlaying'] == true\n                ? args['oid']\n                : null\n          : isLoadPrevious\n          ? mediaList.first.aid\n          : mediaList.last.aid,\n      otype: isReverse\n          ? null\n          : mediaList.isEmpty\n          ? null\n          : isLoadPrevious\n          ? mediaList.first.type\n          : mediaList.last.type,\n      desc: _mediaDesc,\n      sortField: args['sortField'] ?? 1,\n      withCurrent: mediaList.isEmpty && args['isContinuePlaying'] == true\n          ? true\n          : false,\n    );\n    if (res case Success(:final response)) {\n      if (response.mediaList.isNotEmpty) {\n        if (isReverse) {\n          mediaList.value = response.mediaList;\n          for (final item in mediaList) {\n            if (item.cid != null) {\n              try {\n                Get.find<UgcIntroController>(\n                  tag: heroTag,\n                ).onChangeEpisode(item);\n              } catch (_) {}\n              break;\n            }\n          }\n        } else if (isLoadPrevious) {\n          mediaList.insertAll(0, response.mediaList);\n        } else {\n          mediaList.addAll(response.mediaList);\n        }\n      }\n    } else {\n      res.toast();\n    }\n  }\n\n  // 稍后再看面板展开\n  void showMediaListPanel(BuildContext context) {\n    if (mediaList.isNotEmpty) {\n      Widget panel() => MediaListPanel(\n        mediaList: mediaList,\n        onChangeEpisode: (episode) {\n          try {\n            Get.find<UgcIntroController>(tag: heroTag).onChangeEpisode(episode);\n          } catch (_) {}\n        },\n        panelTitle: watchLaterTitle,\n        bvid: bvid,\n        count: args['count'],\n        loadMoreMedia: getMediaList,\n        desc: _mediaDesc,\n        onReverse: () {\n          _mediaDesc = !_mediaDesc;\n          getMediaList(isReverse: true);\n        },\n        loadPrevious: args['isContinuePlaying'] == true\n            ? () => getMediaList(isLoadPrevious: true)\n            : null,\n        onDelete:\n            sourceType == SourceType.watchLater ||\n                (sourceType == SourceType.fav && args['isOwner'] == true)\n            ? (item, index) async {\n                if (sourceType == SourceType.watchLater) {\n                  final res = await UserHttp.toViewDel(\n                    aids: item.aid.toString(),\n                  );\n                  if (res.isSuccess) {\n                    mediaList.removeAt(index);\n                  }\n                } else {\n                  final res = await FavHttp.favVideo(\n                    resources: '${item.aid}:${item.type}',\n                    delIds: '${args['mediaId']}',\n                  );\n                  if (res.isSuccess) {\n                    mediaList.removeAt(index);\n                    SmartDialog.showToast('取消收藏');\n                  } else {\n                    res.toast();\n                  }\n                }\n              }\n            : null,\n      );\n      if (plPlayerController.isFullScreen.value || showVideoSheet) {\n        PageUtils.showVideoBottomSheet(\n          context,\n          child: plPlayerController.darkVideoPage && MyApp.darkThemeData != null\n              ? Theme(\n                  data: MyApp.darkThemeData!,\n                  child: panel(),\n                )\n              : panel(),\n          isFullScreen: () => plPlayerController.isFullScreen.value,\n        );\n      } else {\n        childKey.currentState?.showBottomSheet(\n          backgroundColor: Colors.transparent,\n          constraints: const BoxConstraints(),\n          (context) => panel(),\n        );\n      }\n    } else {\n      getMediaList();\n    }\n  }\n\n  bool isPortrait = true;\n\n  bool get horizontalScreen => plPlayerController.horizontalScreen;\n\n  bool get showVideoSheet =>\n      (!horizontalScreen && !isPortrait) || plPlayerController.isDesktopPip;\n\n  @override\n  late final RxString videoLabel = ''.obs;\n  @override\n  int? get timeLength => data.timeLength;\n  @override\n  BlockConfigMixin get blockConfig => plPlayerController;\n  @override\n  Player? get player => plPlayerController.videoPlayerController;\n  @override\n  bool get isFullScreen => plPlayerController.isFullScreen.value;\n  @override\n  bool get autoPlay => _autoPlay.value;\n  set autoPlay(bool value) => _autoPlay.value = value;\n  @override\n  bool get preInitPlayer => plPlayerController.preInitPlayer;\n  @override\n  int get currPosInMilliseconds =>\n      defaultST?.inMilliseconds ?? plPlayerController.position.inMilliseconds;\n  @override\n  Future<void> seekTo(Duration duration, {required bool isSeek}) =>\n      plPlayerController.seekTo(duration, isSeek: isSeek);\n\n  @override\n  Widget buildItem(Object item, Animation<double> animation) {\n    final theme = Get.theme;\n    return Align(\n      alignment: Alignment.centerLeft,\n      child: SlideTransition(\n        position: animation.drive(\n          Tween<Offset>(\n            begin: const Offset(-1.0, 0.0),\n            end: Offset.zero,\n          ),\n        ),\n        child: Padding(\n          padding: const EdgeInsets.only(top: 5),\n          child: GestureDetector(\n            onHorizontalDragUpdate: (DragUpdateDetails details) {\n              if (details.delta.dx < 0) {\n                onRemoveItem(listData.indexOf(item), item);\n              }\n            },\n            child: SearchText(\n              bgColor: theme.colorScheme.secondaryContainer.withValues(\n                alpha: 0.8,\n              ),\n              textColor: theme.colorScheme.onSecondaryContainer,\n              padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),\n              fontSize: 14,\n              text: item is SegmentModel\n                  ? '跳过: ${item.segmentType.shortTitle}'\n                  : '上次看到第${(item as int) + 1}P，点击跳转',\n              onTap: (_) {\n                if (item is int) {\n                  try {\n                    UgcIntroController ugcIntroController =\n                        Get.find<UgcIntroController>(tag: heroTag);\n                    Part part =\n                        ugcIntroController.videoDetail.value.pages![item];\n                    ugcIntroController.onChangeEpisode(part);\n                    SmartDialog.showToast('已跳至第${item + 1}P');\n                  } catch (e) {\n                    if (kDebugMode) debugPrint('$e');\n                    SmartDialog.showToast('跳转失败');\n                  }\n                  onRemoveItem(listData.indexOf(item), item);\n                } else if (item is SegmentModel) {\n                  onSkip(item, isSeek: false);\n                  onRemoveItem(listData.indexOf(item), item);\n                }\n              },\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n\n  ({int mode, int fontSize, Color color})? dmConfig;\n  String? savedDanmaku;\n\n  /// 发送弹幕\n  Future<void> showShootDanmakuSheet() async {\n    if (plPlayerController.dmState.contains(cid.value)) {\n      SmartDialog.showToast('UP主已关闭弹幕');\n      return;\n    }\n    final isPlaying =\n        _autoPlay.value && plPlayerController.playerStatus.isPlaying;\n    if (isPlaying) {\n      await plPlayerController.pause();\n    }\n    await Get.key.currentState!.push(\n      PublishRoute(\n        pageBuilder: (buildContext, animation, secondaryAnimation) {\n          return SendDanmakuPanel(\n            cid: cid.value,\n            bvid: bvid,\n            progress: plPlayerController.position.inMilliseconds,\n            initialValue: savedDanmaku,\n            onSave: (danmaku) => savedDanmaku = danmaku,\n            onSuccess: (danmakuModel) {\n              savedDanmaku = null;\n              plPlayerController.danmakuController?.addDanmaku(danmakuModel);\n            },\n            darkVideoPage: plPlayerController.darkVideoPage,\n            dmConfig: dmConfig,\n            onSaveDmConfig: (dmConfig) => this.dmConfig = dmConfig,\n          );\n        },\n      ),\n    );\n    if (isPlaying) {\n      plPlayerController.play();\n    }\n  }\n\n  VideoItem findVideoByQa(int qa) {\n    /// 根据currentVideoQa和currentDecodeFormats 重新设置videoUrl\n    final videoList = data.dash!.video!.where((i) => i.id == qa).toList();\n\n    final currentDecodeFormats = this.currentDecodeFormats.codes;\n    final defaultDecodeFormats = VideoDecodeFormatType.fromString(\n      cacheDecode,\n    ).codes;\n    final secondDecodeFormats = VideoDecodeFormatType.fromString(\n      cacheSecondDecode,\n    ).codes;\n\n    VideoItem? video;\n    for (final i in videoList) {\n      final codec = i.codecs!;\n      if (currentDecodeFormats.any(codec.startsWith)) {\n        video = i;\n        break;\n      } else if (defaultDecodeFormats.any(codec.startsWith)) {\n        video = i;\n      } else if (video == null && secondDecodeFormats.any(codec.startsWith)) {\n        video = i;\n      }\n    }\n    return video ?? videoList.first;\n  }\n\n  /// 更新画质、音质\n  void updatePlayer() {\n    final currentVideoQa = this.currentVideoQa.value;\n    if (currentVideoQa == null) return;\n    _autoPlay.value = true;\n    playedTime = plPlayerController.position;\n    plPlayerController\n      ..isBuffering.value = false\n      ..buffered.value = Duration.zero;\n\n    final video = findVideoByQa(currentVideoQa.code);\n    if (firstVideo.codecs != video.codecs) {\n      currentDecodeFormats = VideoDecodeFormatType.fromString(video.codecs!);\n    }\n    firstVideo = video;\n    videoUrl = VideoUtils.getCdnUrl(firstVideo.playUrls);\n\n    /// 根据currentAudioQa 重新设置audioUrl\n    if (currentAudioQa != null) {\n      final firstAudio = data.dash!.audio!.firstWhere(\n        (i) => i.id == currentAudioQa!.code,\n        orElse: () => data.dash!.audio!.first,\n      );\n      audioUrl = VideoUtils.getCdnUrl(firstAudio.playUrls, isAudio: true);\n    }\n\n    playerInit();\n  }\n\n  Future<void>? _initPlayerIfNeeded(bool autoFullScreenFlag) {\n    if (_autoPlay.value ||\n        (plPlayerController.preInitPlayer && !plPlayerController.processing) &&\n            (isFileSource\n                ? true\n                : videoPlayerKey.currentState?.mounted == true)) {\n      return playerInit(\n        autoFullScreenFlag: autoFullScreenFlag && _autoPlay.value,\n      );\n    }\n    return null;\n  }\n\n  Future<void> playerInit({\n    String? video,\n    String? audio,\n    Duration? seekToTime,\n    Duration? duration,\n    bool? autoplay,\n    Volume? volume,\n    bool autoFullScreenFlag = false,\n  }) async {\n    Duration? seek = seekToTime ?? defaultST ?? playedTime;\n    if (seek == null || seek == Duration.zero) {\n      seek = getFirstSegment();\n    }\n    await plPlayerController.setDataSource(\n      isFileSource\n          ? FileSource(\n              dir: args['dirPath'],\n              typeTag: entry.typeTag!,\n              isMp4: entry.mediaType == 1,\n              hasDashAudio: entry.hasDashAudio,\n            )\n          : NetworkSource(\n              videoSource: video ?? videoUrl!,\n              audioSource: audio ?? audioUrl,\n            ),\n      seekTo: seek,\n      duration:\n          duration ??\n          (data.timeLength == null\n              ? null\n              : Duration(milliseconds: data.timeLength!)),\n      isVertical: isVertical.value,\n      aid: aid,\n      bvid: bvid,\n      cid: cid.value,\n      autoplay: autoplay ?? _autoPlay.value,\n      epid: isUgc ? null : epId,\n      seasonId: isUgc ? null : seasonId,\n      pgcType: isUgc ? null : pgcType,\n      videoType: videoType,\n      onInit: () {\n        videoState.value = true;\n        setSubtitle(vttSubtitlesIndex.value);\n      },\n      width: firstVideo.width,\n      height: firstVideo.height,\n      volume: volume ?? this.volume,\n      autoFullScreenFlag: autoFullScreenFlag,\n    );\n\n    if (isClosed) return;\n\n    if (!isFileSource) {\n      if (plPlayerController.enableBlock) {\n        initSkip();\n      }\n\n      if (vttSubtitlesIndex.value == -1) {\n        _queryPlayInfo();\n      }\n\n      if (plPlayerController.showDmChart && dmTrend.value == null) {\n        _getDmTrend();\n      }\n    }\n\n    defaultST = null;\n  }\n\n  bool isQuerying = false;\n\n  final Rx<List<LanguageItem>?> languages = Rx<List<LanguageItem>?>(null);\n  final Rx<String?> currLang = Rx<String?>(null);\n  void setLanguage(String language) {\n    if (currLang.value == language) return;\n    if (!isLoginVideo) {\n      SmartDialog.showToast('账号未登录');\n      return;\n    }\n    currLang.value = language;\n    queryVideoUrl(defaultST: playedTime);\n  }\n\n  Volume? volume;\n\n  // 视频链接\n  Future<void> queryVideoUrl({\n    Duration? defaultST,\n    bool fromReset = false,\n    bool autoFullScreenFlag = false,\n  }) async {\n    if (isFileSource) {\n      return _initPlayerIfNeeded(autoFullScreenFlag);\n    }\n    if (isQuerying) {\n      return;\n    }\n    isQuerying = true;\n    if (plPlayerController.enableSponsorBlock && isBlock && !fromReset) {\n      querySponsorBlock(bvid: bvid, cid: cid.value);\n    }\n    if (plPlayerController.cacheVideoQa == null) {\n      final isWiFi = await Utils.isWiFi;\n      plPlayerController\n        ..cacheVideoQa = isWiFi\n            ? Pref.defaultVideoQa\n            : Pref.defaultVideoQaCellular\n        ..cacheAudioQa = isWiFi\n            ? Pref.defaultAudioQa\n            : Pref.defaultAudioQaCellular;\n    }\n\n    final result = await VideoHttp.videoUrl(\n      cid: cid.value,\n      bvid: bvid,\n      epid: epId,\n      seasonId: seasonId,\n      tryLook: plPlayerController.tryLook,\n      videoType: _actualVideoType ?? videoType,\n      language: currLang.value,\n    );\n\n    if (result case Success(:final response)) {\n      data = response;\n\n      languages.value = data.language?.items;\n      currLang.value = data.curLanguage;\n\n      volume = data.volume;\n\n      final progress = args.remove('progress');\n      if (progress != null) {\n        this.defaultST = Duration(milliseconds: progress);\n      } else if (defaultST == null && data.lastPlayTime != null) {\n        this.defaultST = Duration(milliseconds: data.lastPlayTime!);\n      }\n\n      if (!isUgc && !fromReset && plPlayerController.enablePgcSkip) {\n        if (data.clipInfoList case final clipInfoList?) {\n          resetBlock();\n          handleSBData(clipInfoList);\n        }\n      }\n\n      if (data.acceptDesc?.contains('试看') == true) {\n        SmartDialog.showToast(\n          '该视频为专属视频，仅提供试看',\n          displayTime: const Duration(seconds: 3),\n        );\n      }\n      if (data.dash == null && data.durl != null) {\n        final first = data.durl!.first;\n        videoUrl = VideoUtils.getCdnUrl(first.playUrls);\n        audioUrl = '';\n\n        // 实际为FLV/MP4格式，但已被淘汰，这里仅做兜底处理\n        final videoQuality = VideoQuality.fromCode(data.quality!);\n        firstVideo = VideoItem(\n          id: data.quality!,\n          baseUrl: videoUrl,\n          codecs: 'avc1',\n          quality: videoQuality,\n        );\n        setVideoHeight();\n        currentDecodeFormats = VideoDecodeFormatType.fromString('avc1');\n        currentVideoQa.value = videoQuality;\n        await _initPlayerIfNeeded(autoFullScreenFlag);\n        isQuerying = false;\n        return;\n      }\n      if (data.dash == null) {\n        SmartDialog.showToast('视频资源不存在');\n        _autoPlay.value = false;\n        videoState.value = false;\n        if (plPlayerController.isFullScreen.value) {\n          plPlayerController.toggleFullScreen(false);\n        }\n        isQuerying = false;\n        return;\n      }\n      final List<VideoItem> videoList = data.dash!.video!;\n      // if (kDebugMode) debugPrint(\"allVideosList:${allVideosList}\");\n      // 当前可播放的最高质量视频\n      final curHighestVideoQa = videoList.first.quality.code;\n      // 预设的画质为null，则当前可用的最高质量\n      int targetVideoQa = curHighestVideoQa;\n      if (data.acceptQuality?.isNotEmpty == true &&\n          plPlayerController.cacheVideoQa! <= curHighestVideoQa) {\n        // 如果预设的画质低于当前最高\n        targetVideoQa = data.acceptQuality!.findClosestTarget(\n          (e) => e <= plPlayerController.cacheVideoQa!,\n          (a, b) => a > b ? a : b,\n        );\n      }\n      currentVideoQa.value = VideoQuality.fromCode(targetVideoQa);\n\n      /// 取出符合当前画质的videoList\n      final List<VideoItem> videosList = videoList\n          .where((e) => e.quality.code == targetVideoQa)\n          .toList();\n\n      /// 优先顺序 设置中指定解码格式 -> 当前可选的首个解码格式\n      final List<FormatItem> supportFormats = data.supportFormats!;\n      // 根据画质选编码格式\n      final List<String> supportDecodeFormats = supportFormats\n          .firstWhere(\n            (e) => e.quality == targetVideoQa,\n            orElse: () => supportFormats.first,\n          )\n          .codecs!;\n      // 默认从设置中取AV1\n      currentDecodeFormats = VideoDecodeFormatType.fromString(cacheDecode);\n      VideoDecodeFormatType secondDecodeFormats =\n          VideoDecodeFormatType.fromString(cacheSecondDecode);\n      // 当前视频没有对应格式返回第一个\n      int flag = 0;\n      for (final e in supportDecodeFormats) {\n        if (currentDecodeFormats.codes.any(e.startsWith)) {\n          flag = 1;\n          break;\n        } else if (secondDecodeFormats.codes.any(e.startsWith)) {\n          flag = 2;\n        }\n      }\n      if (flag == 2) {\n        currentDecodeFormats = secondDecodeFormats;\n      } else if (flag == 0) {\n        currentDecodeFormats = VideoDecodeFormatType.fromString(\n          supportDecodeFormats.first,\n        );\n      }\n\n      /// 取出符合当前解码格式的videoItem\n      firstVideo = videosList.firstWhere(\n        (e) => currentDecodeFormats.codes.any(e.codecs!.startsWith),\n        orElse: () => videosList.first,\n      );\n      setVideoHeight();\n\n      videoUrl = VideoUtils.getCdnUrl(firstVideo.playUrls);\n\n      /// 优先顺序 设置中指定质量 -> 当前可选的最高质量\n      AudioItem? firstAudio;\n      final audioList = data.dash?.audio;\n      if (audioList != null && audioList.isNotEmpty) {\n        final List<int> audioIds = audioList.map((map) => map.id!).toList();\n        int closestNumber = audioIds.findClosestTarget(\n          (e) => e <= plPlayerController.cacheAudioQa,\n          (a, b) => a > b ? a : b,\n        );\n        if (!audioIds.contains(plPlayerController.cacheAudioQa) &&\n            audioIds.any((e) => e > plPlayerController.cacheAudioQa)) {\n          closestNumber = AudioQuality.k192.code;\n        }\n        firstAudio = audioList.firstWhere(\n          (e) => e.id == closestNumber,\n          orElse: () => audioList.first,\n        );\n        audioUrl = VideoUtils.getCdnUrl(firstAudio.playUrls, isAudio: true);\n        if (firstAudio.id case final int id?) {\n          currentAudioQa = AudioQuality.fromCode(id);\n        }\n      } else {\n        audioUrl = '';\n      }\n      await _initPlayerIfNeeded(autoFullScreenFlag);\n    } else {\n      _autoPlay.value = false;\n      videoState.value = false;\n      if (plPlayerController.isFullScreen.value) {\n        plPlayerController.toggleFullScreen(false);\n      }\n    }\n    isQuerying = false;\n  }\n\n  late final List<PostSegmentModel> postList = <PostSegmentModel>[];\n  void onBlock(BuildContext context) {\n    if (postList.isEmpty) {\n      postList.add(\n        PostSegmentModel(\n          segment: Pair(\n            first: 0,\n            second: plPlayerController.position.inMilliseconds / 1000,\n          ),\n          category: SegmentType.sponsor,\n          actionType: ActionType.skip,\n        ),\n      );\n    }\n    if (plPlayerController.isFullScreen.value || showVideoSheet) {\n      PageUtils.showVideoBottomSheet(\n        context,\n        child: plPlayerController.darkVideoPage && MyApp.darkThemeData != null\n            ? Theme(\n                data: MyApp.darkThemeData!,\n                child: PostPanel(\n                  enableSlide: false,\n                  videoDetailController: this,\n                  plPlayerController: plPlayerController,\n                ),\n              )\n            : PostPanel(\n                enableSlide: false,\n                videoDetailController: this,\n                plPlayerController: plPlayerController,\n              ),\n        isFullScreen: () => plPlayerController.isFullScreen.value,\n      );\n    } else {\n      childKey.currentState?.showBottomSheet(\n        backgroundColor: Colors.transparent,\n        constraints: const BoxConstraints(),\n        (context) => PostPanel(\n          videoDetailController: this,\n          plPlayerController: plPlayerController,\n        ),\n      );\n    }\n  }\n\n  RxList<Subtitle> subtitles = RxList<Subtitle>();\n  final Map<int, ({bool isData, String id})> vttSubtitles = {};\n  late final RxInt vttSubtitlesIndex = (-1).obs;\n  late final RxBool showVP = true.obs;\n  late final RxList<ViewPointSegment> viewPointList = <ViewPointSegment>[].obs;\n\n  // 设定字幕轨道\n  Future<void> setSubtitle(int index) async {\n    if (index <= 0) {\n      await plPlayerController.videoPlayerController?.setSubtitleTrack(\n        SubtitleTrack.no(),\n      );\n      vttSubtitlesIndex.value = index;\n      return;\n    }\n\n    Future<void> setSub(({bool isData, String id}) subtitle) async {\n      final sub = subtitles[index - 1];\n\n      String subUri = subtitle.id;\n      File? file;\n      if (subtitle.isData) {\n        subUri = path.join(tmpDirPath, '${cid.value}-${sub.lan}.vtt');\n        file = File(subUri);\n        if (!file.existsSync()) {\n          await file.writeAsString(subtitle.id);\n          if (plPlayerController.videoPlayerController?.disposed == false) {\n            plPlayerController.videoPlayerController!.release.add(file.tryDel);\n          } else {\n            file.tryDel();\n            return;\n          }\n        }\n      }\n      await plPlayerController.videoPlayerController?.setSubtitleTrack(\n        SubtitleTrack(subUri, sub.lanDoc, sub.lan, uri: true),\n      );\n      vttSubtitlesIndex.value = index;\n    }\n\n    ({bool isData, String id})? subtitle = vttSubtitles[index - 1];\n    if (subtitle != null) {\n      await setSub(subtitle);\n    } else {\n      final result = await VideoHttp.vttSubtitles(\n        subtitles[index - 1].subtitleUrl!,\n      );\n      if (!isClosed && result != null) {\n        final subtitle = (isData: true, id: result);\n        vttSubtitles[index - 1] = subtitle;\n        await setSub(subtitle);\n      }\n    }\n  }\n\n  // interactive video\n  int? graphVersion;\n  EdgeInfoData? steinEdgeInfo;\n  late final RxBool showSteinEdgeInfo = false.obs;\n\n  Future<void> getSteinEdgeInfo([int? edgeId]) async {\n    steinEdgeInfo = null;\n    try {\n      final res = await Request().get(\n        '/x/stein/edgeinfo_v2',\n        queryParameters: {\n          'bvid': bvid,\n          'graph_version': graphVersion,\n          'edge_id': ?edgeId,\n        },\n      );\n      if (res.data['code'] == 0) {\n        steinEdgeInfo = EdgeInfoData.fromJson(res.data['data']);\n      } else {\n        if (kDebugMode) {\n          debugPrint('getSteinEdgeInfo error: ${res.data['message']}');\n        }\n      }\n    } catch (e) {\n      if (kDebugMode) debugPrint('getSteinEdgeInfo: $e');\n    }\n  }\n\n  late bool continuePlayingPart = Pref.continuePlayingPart;\n\n  Future<void> _queryPlayInfo() async {\n    vttSubtitles.clear();\n    vttSubtitlesIndex.value = 0;\n    if (plPlayerController.showViewPoints) {\n      viewPointList.clear();\n    }\n    final res = await VideoHttp.playInfo(\n      bvid: bvid,\n      cid: cid.value,\n      seasonId: seasonId,\n      epId: epId,\n    );\n    if (res case Success(:final response)) {\n      // interactive video\n      if (isUgc && graphVersion == null) {\n        try {\n          final introCtr = Get.find<UgcIntroController>(tag: heroTag);\n          if (introCtr.videoDetail.value.rights?.isSteinGate == 1) {\n            graphVersion = response.interaction?.graphVersion;\n            getSteinEdgeInfo();\n          }\n        } catch (e) {\n          if (kDebugMode) debugPrint('handle stein: $e');\n        }\n      }\n\n      if (isUgc && continuePlayingPart) {\n        continuePlayingPart = false;\n        try {\n          UgcIntroController ugcIntroController = Get.find<UgcIntroController>(\n            tag: heroTag,\n          );\n          if ((ugcIntroController.videoDetail.value.pages?.length ?? 0) > 1 &&\n              response.lastPlayCid != null &&\n              response.lastPlayCid != 0) {\n            if (response.lastPlayCid != cid.value) {\n              int index = ugcIntroController.videoDetail.value.pages!\n                  .indexWhere((item) => item.cid == response.lastPlayCid);\n              if (index != -1) {\n                onAddItem(index);\n              }\n            }\n          }\n        } catch (_) {}\n      }\n\n      if (plPlayerController.showViewPoints &&\n          response.viewPoints?.firstOrNull?.type == 2) {\n        try {\n          viewPointList.value = response.viewPoints!.map((item) {\n            final end = (item.to! / (data.timeLength! / 1000)).clamp(0.0, 1.0);\n            return ViewPointSegment(\n              end: end,\n              title: item.content,\n              url: item.imgUrl,\n              from: item.from,\n              to: item.to,\n            );\n          }).toList();\n        } catch (_) {}\n      }\n\n      if (response.subtitle?.subtitles?.isNotEmpty == true) {\n        subtitles.value = response.subtitle!.subtitles!;\n\n        final idx = switch (Pref.subtitlePreferenceV2) {\n          SubtitlePrefType.off => 0,\n          SubtitlePrefType.on => 1,\n          SubtitlePrefType.withoutAi =>\n            subtitles.first.lan.startsWith('ai') ? 0 : 1,\n          SubtitlePrefType.auto =>\n            !subtitles.first.lan.startsWith('ai') ||\n                    (PlatformUtils.isMobile &&\n                        (await FlutterVolumeController.getVolume() ?? 0.0) <=\n                            0.0)\n                ? 1\n                : 0,\n        };\n        await setSubtitle(idx);\n      }\n    }\n  }\n\n  void updateMediaListHistory(int aid) {\n    if (args['sortField'] != null) {\n      VideoHttp.medialistHistory(\n        desc: _mediaDesc ? 1 : 0,\n        oid: aid,\n        upperMid: args['mediaId'],\n      );\n    }\n  }\n\n  void makeHeartBeat() {\n    if (plPlayerController.enableHeart &&\n        !plPlayerController.playerStatus.isCompleted &&\n        playedTime != null) {\n      try {\n        plPlayerController.makeHeartBeat(\n          data.timeLength != null\n              ? (data.timeLength! - playedTime!.inMilliseconds).abs() <= 1000\n                    ? -1\n                    : playedTime!.inSeconds\n              : playedTime!.inSeconds,\n          type: HeartBeatType.completed,\n          isManual: true,\n          aid: aid,\n          bvid: bvid,\n          cid: cid.value,\n          epid: isUgc ? null : epId,\n          seasonId: isUgc ? null : seasonId,\n          pgcType: isUgc ? null : pgcType,\n          videoType: videoType,\n        );\n      } catch (_) {}\n    }\n  }\n\n  @override\n  void onClose() {\n    cid.close();\n    if (isFileSource) {\n      cacheLocalProgress();\n    }\n    introScrollCtr?.dispose();\n    introScrollCtr = null;\n    tabCtr.dispose();\n    _scrollCtr\n      ?..removeListener(scrollListener)\n      ..dispose();\n    animController?.dispose();\n    subtitles.clear();\n    vttSubtitles.clear();\n    super.onClose();\n  }\n\n  void onReset({bool isStein = false}) {\n    if (isFileSource) {\n      cacheLocalProgress();\n    }\n\n    playedTime = null;\n    defaultST = null;\n    videoUrl = null;\n    audioUrl = null;\n\n    if (scrollRatio.value != 0) {\n      scrollRatio.refresh();\n    }\n\n    // danmaku\n    savedDanmaku = null;\n\n    // subtitle\n    subtitles.clear();\n    vttSubtitlesIndex.value = -1;\n    vttSubtitles.clear();\n\n    if (!isFileSource) {\n      // language\n      languages.value = null;\n      currLang.value = null;\n\n      // dm trend\n      if (plPlayerController.showDmChart) {\n        dmTrend.value = null;\n      }\n\n      // view point\n      if (plPlayerController.showViewPoints) {\n        viewPointList.clear();\n      }\n\n      // sponsor block\n      if (blockConfig.enableBlock) {\n        resetBlock();\n      }\n\n      // interactive video\n      if (!isStein) {\n        graphVersion = null;\n      }\n      steinEdgeInfo = null;\n      showSteinEdgeInfo.value = false;\n    }\n  }\n\n  late final Rx<LoadingState<List<double>>?> dmTrend =\n      Rx<LoadingState<List<double>>?>(null);\n  late final RxBool showDmTrendChart = true.obs;\n\n  Future<void> _getDmTrend() async {\n    dmTrend.value = LoadingState<List<double>>.loading();\n    try {\n      final res = await Request().get(\n        'https://bvc.bilivideo.com/pbp/data',\n        queryParameters: {\n          'bvid': bvid,\n          'cid': cid.value,\n        },\n      );\n      PbpData data = PbpData.fromJson(res.data);\n      int stepSec = data.stepSec ?? 0;\n      if (stepSec != 0 && data.events?.eDefault?.isNotEmpty == true) {\n        dmTrend.value = Success(data.events!.eDefault!);\n        return;\n      }\n      dmTrend.value = const Error(null);\n    } catch (e) {\n      dmTrend.value = const Error(null);\n      if (kDebugMode) debugPrint('_getDmTrend: $e');\n    }\n  }\n\n  void showNoteList(BuildContext context) {\n    String? title;\n    try {\n      title = Get.find<UgcIntroController>(\n        tag: heroTag,\n      ).videoDetail.value.title;\n    } catch (_) {}\n    if (plPlayerController.isFullScreen.value || showVideoSheet) {\n      PageUtils.showVideoBottomSheet(\n        context,\n        child: plPlayerController.darkVideoPage && MyApp.darkThemeData != null\n            ? Theme(\n                data: MyApp.darkThemeData!,\n                child: NoteListPage(\n                  oid: aid,\n                  enableSlide: false,\n                  heroTag: heroTag,\n                  isStein: graphVersion != null,\n                  title: title,\n                ),\n              )\n            : NoteListPage(\n                oid: aid,\n                enableSlide: false,\n                heroTag: heroTag,\n                isStein: graphVersion != null,\n                title: title,\n              ),\n        isFullScreen: () => plPlayerController.isFullScreen.value,\n      );\n    } else {\n      childKey.currentState?.showBottomSheet(\n        backgroundColor: Colors.transparent,\n        constraints: const BoxConstraints(),\n        (context) => NoteListPage(\n          oid: aid,\n          heroTag: heroTag,\n          isStein: graphVersion != null,\n          title: title,\n        ),\n      );\n    }\n  }\n\n  @pragma('vm:notify-debugger-on-exception')\n  bool onSkipSegment() {\n    try {\n      if (plPlayerController.enableBlock) {\n        if (listData.lastOrNull case final SegmentModel item) {\n          onSkip(item, isSeek: false);\n          onRemoveItem(listData.indexOf(item), item);\n          return true;\n        }\n      }\n    } catch (e, s) {\n      Utils.reportError(e, s);\n    }\n    return false;\n  }\n\n  void toAudioPage() {\n    int? id;\n    int? extraId;\n    PlaylistSource from = PlaylistSource.UP_ARCHIVE;\n    if (isPlayAll) {\n      id = args['mediaId'];\n      extraId = sourceType.extraId;\n      from = sourceType.playlistSource!;\n    } else if (isUgc) {\n      try {\n        final ctr = Get.find<UgcIntroController>(tag: heroTag);\n        id = ctr.videoDetail.value.ugcSeason?.id;\n        if (id != null) {\n          extraId = 8;\n          from = PlaylistSource.MEDIA_LIST;\n        }\n      } catch (_) {}\n    }\n    AudioPage.toAudioPage(\n      itemType: 1,\n      id: id,\n      oid: aid,\n      subId: [cid.value],\n      from: from,\n      heroTag: _autoPlay.value ? heroTag : null,\n      start: playedTime,\n      audioUrl: audioUrl,\n      extraId: extraId,\n    );\n  }\n\n  Future<void> onDownload(BuildContext context) async {\n    VideoDetailData? videoDetail;\n    List<ugc.BaseEpisodeItem>? episodes;\n    UgcIntroController? ugcIntroController;\n    PgcInfoModel? pgcItem;\n    if (isUgc) {\n      try {\n        ugcIntroController = Get.find<UgcIntroController>(tag: heroTag);\n        videoDetail = ugcIntroController.videoDetail.value;\n        if (videoDetail.ugcSeason?.sections case final sections?) {\n          episodes = <ugc.BaseEpisodeItem>[];\n          for (final i in sections) {\n            if (i.episodes case final e?) {\n              episodes.addAll(e);\n            }\n          }\n        } else {\n          episodes = videoDetail.pages;\n        }\n      } catch (e, s) {\n        if (kDebugMode) {\n          debugPrint('download ugc: $e\\n\\n$s');\n        }\n      }\n    } else {\n      try {\n        pgcItem = Get.find<PgcIntroController>(tag: heroTag).pgcItem;\n        episodes = pgcItem.episodes;\n      } catch (e, s) {\n        if (kDebugMode) {\n          debugPrint('download pgc: $e\\n\\n$s');\n        }\n      }\n    }\n    if (episodes != null && episodes.isNotEmpty) {\n      final downloadService = Get.find<DownloadService>();\n      await downloadService.waitForInitialization;\n      if (!context.mounted) {\n        return;\n      }\n      final Set<int> cidSet = downloadService.downloadList\n          .followedBy(downloadService.waitDownloadQueue)\n          .map((e) => e.cid)\n          .toSet();\n      final index = episodes.indexWhere(\n        (e) => e.cid == (seasonCid ?? cid.value),\n      );\n\n      showModalBottomSheet(\n        context: context,\n        useSafeArea: true,\n        isScrollControlled: true,\n        constraints: BoxConstraints(\n          maxWidth: min(640, context.mediaQueryShortestSide),\n        ),\n        builder: (context) {\n          final maxChildSize =\n              PlatformUtils.isMobile && !context.mediaQuerySize.isPortrait\n              ? 1.0\n              : 0.7;\n          return DraggableScrollableSheet(\n            snap: true,\n            expand: false,\n            minChildSize: 0,\n            snapSizes: [maxChildSize],\n            maxChildSize: maxChildSize,\n            initialChildSize: maxChildSize,\n            builder: (context, scrollController) => DownloadPanel(\n              index: index,\n              videoDetail: videoDetail,\n              pgcItem: pgcItem,\n              episodes: episodes!,\n              scrollController: scrollController,\n              videoDetailController: this,\n              heroTag: heroTag,\n              ugcIntroController: ugcIntroController,\n              cidSet: cidSet,\n            ),\n          );\n        },\n      );\n    }\n  }\n\n  void editPlayUrl() {\n    String videoUrl = this.videoUrl ?? '';\n    String audioUrl = this.audioUrl ?? '';\n    Widget textField({\n      required String label,\n      required String initialValue,\n      required ValueChanged<String> onChanged,\n    }) => TextFormField(\n      minLines: 1,\n      maxLines: 3,\n      onChanged: onChanged,\n      initialValue: initialValue,\n      decoration: InputDecoration(\n        label: Text(label),\n        border: const OutlineInputBorder(),\n      ),\n    );\n    showDialog(\n      context: Get.context!,\n      builder: (context) => AlertDialog(\n        constraints: StyleString.dialogFixedConstraints,\n        title: const Text('播放地址'),\n        content: Column(\n          spacing: 20,\n          mainAxisSize: MainAxisSize.min,\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            textField(\n              label: 'Video Url',\n              initialValue: videoUrl,\n              onChanged: (value) => videoUrl = value,\n            ),\n            textField(\n              label: 'Audio Url',\n              initialValue: audioUrl,\n              onChanged: (value) => audioUrl = value,\n            ),\n          ],\n        ),\n        actions: [\n          TextButton(\n            onPressed: () {\n              Get.back();\n              this.videoUrl = videoUrl;\n              this.audioUrl = audioUrl;\n              playerInit();\n            },\n            child: const Text('确定'),\n          ),\n        ],\n      ),\n    );\n  }\n\n  @pragma('vm:notify-debugger-on-exception')\n  Future<void> onCast() async {\n    SmartDialog.showLoading();\n    final res = await VideoHttp.tvPlayUrl(\n      cid: cid.value,\n      objectId: epId ?? aid,\n      playurlType: epId != null ? 2 : 1,\n      qn: currentVideoQa.value?.code,\n    );\n    SmartDialog.dismiss();\n    if (res case Success(:final response)) {\n      final first = response.durl?.firstOrNull;\n      if (first == null || first.playUrls.isEmpty) {\n        SmartDialog.showToast('不支持投屏');\n        return;\n      }\n      final url = VideoUtils.getCdnUrl(first.playUrls);\n\n      String? title;\n      try {\n        if (isUgc) {\n          title = Get.find<UgcIntroController>(\n            tag: heroTag,\n          ).videoDetail.value.title;\n        } else {\n          title = Get.find<PgcIntroController>(\n            tag: heroTag,\n          ).videoDetail.value.title;\n        }\n      } catch (_) {}\n      if (kDebugMode) {\n        debugPrint(title);\n      }\n      Get.toNamed(\n        '/dlna',\n        parameters: {\n          'url': url,\n          'title': ?title,\n        },\n      );\n    } else {\n      res.toast();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/download_panel/view.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/stat/stat.dart';\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models/common/stat_type.dart';\nimport 'package:PiliPlus/models/common/video/video_quality.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/episode.dart' as pgc;\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/result.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/data.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/episode.dart' as ugc;\nimport 'package:PiliPlus/models_new/video/video_detail/page.dart';\nimport 'package:PiliPlus/pages/download/view.dart';\nimport 'package:PiliPlus/pages/video/controller.dart';\nimport 'package:PiliPlus/pages/video/introduction/ugc/controller.dart';\nimport 'package:PiliPlus/pages/video/introduction/ugc/widgets/page.dart';\nimport 'package:PiliPlus/services/download/download_service.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/duration_utils.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:connectivity_plus/connectivity_plus.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode, kReleaseMode;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:font_awesome_flutter/font_awesome_flutter.dart';\nimport 'package:get/get.dart';\nimport 'package:super_sliver_list/super_sliver_list.dart';\n\nclass DownloadPanel extends StatefulWidget {\n  const DownloadPanel({\n    super.key,\n    required this.index,\n    this.pgcItem,\n    this.videoDetail,\n    required this.episodes,\n    required this.scrollController,\n    required this.videoDetailController,\n    required this.heroTag,\n    this.ugcIntroController,\n    required this.cidSet,\n  });\n\n  final int index;\n  final PgcInfoModel? pgcItem;\n  final VideoDetailData? videoDetail;\n  final List<ugc.BaseEpisodeItem> episodes;\n  final ScrollController scrollController;\n  final VideoDetailController videoDetailController;\n  final String heroTag;\n  final UgcIntroController? ugcIntroController;\n  final Set<int> cidSet;\n\n  @override\n  State<DownloadPanel> createState() => _DownloadPanelState();\n}\n\nclass _DownloadPanelState extends State<DownloadPanel> {\n  final DownloadService _downloadService = Get.find<DownloadService>();\n  final ListController _listController = ListController();\n\n  late final cidSet = widget.cidSet;\n  VideoQuality _quality = VideoQuality.fromCode(Pref.defaultVideoQa);\n\n  @override\n  void initState() {\n    super.initState();\n    if (widget.index != -1) {\n      WidgetsBinding.instance.addPostFrameCallback((_) {\n        _listController.jumpToItem(\n          index: widget.index,\n          scrollController: widget.scrollController,\n          alignment: 0,\n        );\n      });\n    }\n  }\n\n  @override\n  void dispose() {\n    _listController.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    final dividerColor = theme.colorScheme.outline.withValues(alpha: 0.2);\n    return Column(\n      crossAxisAlignment: CrossAxisAlignment.end,\n      children: [\n        _buildHeader(theme),\n        _buildBody(theme),\n        Divider(height: 1, color: dividerColor),\n        _buildFooter(theme, dividerColor),\n      ],\n    );\n  }\n\n  Widget _buildHeader(ThemeData theme) {\n    final textStyle = TextStyle(color: theme.colorScheme.onSurfaceVariant);\n    return Padding(\n      padding: const EdgeInsets.fromLTRB(16, 12, 0, 12),\n      child: Row(\n        spacing: 16,\n        children: [\n          Text(\n            '最高画质',\n            style: textStyle,\n          ),\n          Builder(\n            builder: (context) => PopupMenuButton<VideoQuality>(\n              initialValue: _quality,\n              onSelected: (value) {\n                _quality = value;\n                (context as Element).markNeedsBuild();\n              },\n              itemBuilder: (context) => VideoQuality.values\n                  .map(\n                    (e) => PopupMenuItem(\n                      value: e,\n                      child: Text(e.desc),\n                    ),\n                  )\n                  .toList(),\n              child: Padding(\n                padding: const EdgeInsets.symmetric(vertical: 3),\n                child: Row(\n                  mainAxisSize: MainAxisSize.min,\n                  children: [\n                    Text(\n                      _quality.desc,\n                      style: const TextStyle(height: 1),\n                      strutStyle: const StrutStyle(height: 1, leading: 0),\n                    ),\n                    Icon(\n                      size: 18,\n                      Icons.keyboard_arrow_down,\n                      color: theme.colorScheme.onSurfaceVariant,\n                    ),\n                  ],\n                ),\n              ),\n            ),\n          ),\n          if (kDebugMode || PlatformUtils.isMobile) ...[\n            const Spacer(),\n            StreamBuilder(\n              stream: Connectivity().onConnectivityChanged,\n              builder: (context, snapshot) {\n                if (snapshot.data case final data?) {\n                  final network = data.contains(ConnectivityResult.wifi)\n                      ? 'WIFI'\n                      : '数据';\n                  return Text('当前网络：$network', style: textStyle);\n                }\n                return const SizedBox.shrink();\n              },\n            ),\n            const SizedBox(width: 4),\n          ],\n        ],\n      ),\n    );\n  }\n\n  Widget _buildBody(ThemeData theme) {\n    final episodes = widget.episodes;\n    return Expanded(\n      child: Material(\n        type: MaterialType.transparency,\n        child: CustomScrollView(\n          controller: widget.scrollController,\n          slivers: [\n            SliverPadding(\n              padding: const EdgeInsets.only(bottom: 100),\n              sliver: SuperSliverList.builder(\n                itemCount: episodes.length,\n                listController: _listController,\n                itemBuilder: (context, index) {\n                  final episode = episodes[index];\n                  final hasParts =\n                      episode is ugc.EpisodeItem && episode.pages!.length > 1;\n                  Widget child = _buildItem(\n                    theme: theme,\n                    index: index,\n                    hasParts: hasParts,\n                    episode: episode,\n                    isCurrentIndex: index == widget.index,\n                  );\n                  if (hasParts) {\n                    return Column(\n                      mainAxisSize: MainAxisSize.min,\n                      crossAxisAlignment: CrossAxisAlignment.start,\n                      children: [\n                        child,\n                        Padding(\n                          padding: const EdgeInsets.symmetric(\n                            horizontal: 12,\n                            vertical: 5,\n                          ),\n                          child: PagesPanel(\n                            list: episode.pages,\n                            cover: episode.arc?.pic,\n                            heroTag: widget.heroTag,\n                            ugcIntroController: widget.ugcIntroController!,\n                            bvid: episode.bvid ?? IdUtils.av2bv(episode.aid!),\n                            cidSet: cidSet,\n                            onDownload: (Part part) => _onDownload(\n                              index: index,\n                              episode: part,\n                              parent: episode,\n                            ),\n                          ),\n                        ),\n                      ],\n                    );\n                  }\n                  return child;\n                },\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  late final int? vipStatus = Pref.userInfoCache?.vipStatus;\n  @pragma('vm:notify-debugger-on-exception')\n  bool _onDownload({\n    required int index,\n    required ugc.BaseEpisodeItem episode,\n    bool isFromList = false,\n    bool isDownloadAll = false,\n    ugc.EpisodeItem? parent,\n  }) {\n    final cid = episode.cid;\n    // on download\n    if (cid == null) {\n      SmartDialog.showToast('null cid');\n      return false;\n    }\n\n    if (cidSet.contains(cid)) {\n      if (kDebugMode) {\n        SmartDialog.showToast('downloaded');\n      }\n      return false;\n    }\n\n    if (kReleaseMode && episode.badge == '会员') {\n      if (vipStatus != 1) {\n        if (!isDownloadAll) {\n          SmartDialog.showToast('需要大会员');\n        }\n        return false;\n      }\n    }\n\n    if (episode is ugc.EpisodeItem) {\n      final pages = episode.pages!;\n      if (pages.length > 1) {\n        if (isFromList && kDebugMode) {\n          SmartDialog.showToast('hasParts');\n        }\n        if (isDownloadAll) {\n          for (int i = 0; i < pages.length; i++) {\n            _onDownload(\n              index: i,\n              episode: pages[i],\n              parent: episode,\n            );\n          }\n          return true;\n        }\n        return false;\n      }\n    }\n\n    try {\n      switch (episode) {\n        case Part part:\n          _downloadService.downloadVideo(\n            part,\n            parent == null ? widget.videoDetail : null,\n            parent,\n            _quality,\n          );\n          break;\n        case ugc.EpisodeItem episode:\n          _downloadService.downloadVideo(\n            episode.pages!.first,\n            null,\n            episode,\n            _quality,\n          );\n          break;\n        case pgc.EpisodeItem episode:\n          _downloadService.downloadBangumi(\n            index,\n            widget.pgcItem!,\n            episode,\n            _quality,\n          );\n          break;\n      }\n      cidSet.add(cid);\n      return true;\n    } catch (e, s) {\n      Utils.reportError(e, s);\n      SmartDialog.showToast(e.toString());\n    }\n    return false;\n  }\n\n  Widget _buildItem({\n    required ThemeData theme,\n    required int index,\n    required bool hasParts,\n    required bool isCurrentIndex,\n    required ugc.BaseEpisodeItem episode,\n  }) {\n    late String title;\n    num? duration;\n    int? pubdate;\n    int? view;\n    int? danmaku;\n    bool? isCharging;\n    int? cid;\n\n    String? cover;\n    bool? cacheWidth;\n\n    switch (episode) {\n      case Part part:\n        cid = part.cid;\n        cover = part.firstFrame ?? widget.videoDetail?.pic;\n        title = part.part ?? widget.videoDetail!.title!;\n        duration = part.duration;\n        pubdate = part.ctime;\n        cacheWidth = part.dimension?.cacheWidth;\n        break;\n      case ugc.EpisodeItem item:\n        cid = item.cid;\n        title = item.title!;\n        if (item.arc case final arc?) {\n          cover = arc.pic;\n          duration = arc.duration;\n          pubdate = arc.pubdate;\n          if (arc.stat case final stat?) {\n            view = stat.view;\n            danmaku = stat.danmaku;\n          }\n          cacheWidth = arc.dimension?.cacheWidth;\n        }\n        if (item.attribute == 8) {\n          isCharging = true;\n        }\n        break;\n      case pgc.EpisodeItem item:\n        cid = item.cid;\n        title = item.showTitle ?? item.title!;\n        cover = item.cover;\n        if (item.from == 'pugv') {\n          duration = item.duration;\n          view = item.play;\n        } else {\n          duration = item.duration == null ? null : item.duration! ~/ 1000;\n        }\n        pubdate = item.pubTime;\n        cacheWidth = item.dimension?.cacheWidth;\n        break;\n    }\n    late final primary = theme.colorScheme.primary;\n\n    return Padding(\n      padding: const EdgeInsets.only(bottom: 2),\n      child: SizedBox(\n        height: 98,\n        child: Builder(\n          builder: (context) {\n            return Material(\n              type: MaterialType.transparency,\n              child: InkWell(\n                onTap: () {\n                  if (_onDownload(\n                    index: index,\n                    episode: episode,\n                    isFromList: true,\n                  )) {\n                    (context as Element).markNeedsBuild();\n                  }\n                },\n                child: Padding(\n                  padding: const EdgeInsets.symmetric(\n                    horizontal: StyleString.safeSpace,\n                    vertical: 5,\n                  ),\n                  child: Row(\n                    spacing: 10,\n                    children: [\n                      if (cover?.isNotEmpty == true)\n                        Stack(\n                          clipBehavior: Clip.none,\n                          children: [\n                            NetworkImgLayer(\n                              src: cover,\n                              width: 140.8,\n                              height: 88,\n                              cacheWidth: cacheWidth,\n                            ),\n                            if (duration != null && duration > 0)\n                              PBadge(\n                                text: DurationUtils.formatDuration(duration),\n                                right: 6.0,\n                                bottom: 6.0,\n                                type: PBadgeType.gray,\n                              ),\n                            if (isCharging == true)\n                              const PBadge(\n                                text: '充电专属',\n                                top: 6,\n                                right: 6,\n                                type: PBadgeType.error,\n                              )\n                            else if (episode.badge != null)\n                              PBadge(\n                                text: episode.badge,\n                                top: 6,\n                                right: 6,\n                                type: switch (episode.badge) {\n                                  '预告' => PBadgeType.gray,\n                                  '限免' => PBadgeType.free,\n                                  _ => PBadgeType.primary,\n                                },\n                              ),\n                          ],\n                        )\n                      else if (isCurrentIndex)\n                        Image.asset(\n                          'assets/images/live.png',\n                          color: primary,\n                          height: 12,\n                          cacheHeight: 12.cacheSize(context),\n                          semanticLabel: '正在播放：',\n                        ),\n                      Expanded(\n                        child: Stack(\n                          clipBehavior: Clip.none,\n                          children: [\n                            Column(\n                              mainAxisSize: MainAxisSize.min,\n                              crossAxisAlignment: CrossAxisAlignment.start,\n                              children: [\n                                Expanded(\n                                  child: Text(\n                                    title,\n                                    textAlign: TextAlign.start,\n                                    style: TextStyle(\n                                      fontSize:\n                                          theme.textTheme.bodyMedium!.fontSize,\n                                      height: 1.42,\n                                      letterSpacing: 0.3,\n                                      fontWeight: isCurrentIndex\n                                          ? FontWeight.bold\n                                          : null,\n                                      color: isCurrentIndex ? primary : null,\n                                    ),\n                                    maxLines: 2,\n                                    overflow: TextOverflow.ellipsis,\n                                  ),\n                                ),\n                                if (pubdate != null)\n                                  Text(\n                                    DateFormatUtils.format(pubdate),\n                                    maxLines: 1,\n                                    style: TextStyle(\n                                      fontSize: 12,\n                                      height: 1,\n                                      color: theme.colorScheme.outline,\n                                      overflow: TextOverflow.clip,\n                                    ),\n                                  ),\n                                const SizedBox(height: 2),\n                                Row(\n                                  spacing: 8,\n                                  children: [\n                                    if (view != null)\n                                      StatWidget(\n                                        value: view,\n                                        type: StatType.play,\n                                      ),\n                                    if (danmaku != null)\n                                      StatWidget(\n                                        value: danmaku,\n                                        type: StatType.danmaku,\n                                      ),\n                                  ],\n                                ),\n                              ],\n                            ),\n                            if (!hasParts && cidSet.contains(cid))\n                              Positioned(\n                                bottom: 0,\n                                right: 0,\n                                child: Icon(\n                                  size: 13,\n                                  color: theme.colorScheme.secondary.withValues(\n                                    alpha: 0.8,\n                                  ),\n                                  FontAwesomeIcons.circleDown,\n                                ),\n                              ),\n                          ],\n                        ),\n                      ),\n                    ],\n                  ),\n                ),\n              ),\n            );\n          },\n        ),\n      ),\n    );\n  }\n\n  Widget _buildFooter(ThemeData theme, Color dividerColor) {\n    return Container(\n      color: theme.hoverColor,\n      padding: EdgeInsets.only(\n        bottom: MediaQuery.viewPaddingOf(context).bottom,\n      ),\n      child: Row(\n        children: [\n          _buildBottomBtn(\n            text: '缓存全部',\n            onTap: () {\n              showConfirmDialog(\n                context: context,\n                title: '确定缓存全部？',\n                onConfirm: () {\n                  for (int i = 0; i < widget.episodes.length; i++) {\n                    _onDownload(\n                      index: i,\n                      episode: widget.episodes[i],\n                      isDownloadAll: true,\n                    );\n                  }\n                  if (mounted) setState(() {});\n                },\n              );\n            },\n          ),\n          SizedBox(\n            height: 20,\n            child: VerticalDivider(\n              width: 1,\n              color: dividerColor,\n            ),\n          ),\n          _buildBottomBtn(\n            text: '查看缓存',\n            onTap: () => Navigator.of(context).push(\n              GetPageRoute(page: () => const DownloadPage()),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget _buildBottomBtn({\n    required String text,\n    required VoidCallback onTap,\n  }) {\n    return Expanded(\n      child: InkWell(\n        onTap: onTap,\n        child: SizedBox(\n          height: 40,\n          width: double.infinity,\n          child: Center(\n            child: Text(\n              text,\n              textAlign: TextAlign.center,\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/introduction/local/controller.dart",
    "content": "import 'package:PiliPlus/models_new/download/bili_download_entry_info.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/stat_detail.dart';\nimport 'package:PiliPlus/pages/common/common_intro_controller.dart';\nimport 'package:PiliPlus/pages/download/controller.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/play_repeat.dart';\nimport 'package:PiliPlus/services/service_locator.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/scheduler.dart' show SchedulerBinding;\nimport 'package:get/get.dart';\n\nclass LocalIntroController extends CommonIntroController {\n  @override\n  void queryVideoIntro() {}\n\n  @override\n  void actionCoinVideo() {}\n\n  @override\n  void actionLikeVideo() {}\n\n  @override\n  void actionShareVideo(context) {}\n\n  @override\n  void actionTriple() {}\n\n  @override\n  Future<void> actionFavVideo({bool isQuick = false}) async {}\n\n  @override\n  (Object, int) get getFavRidType => throw UnimplementedError();\n\n  @override\n  StatDetail? getStat() => null;\n\n  @override\n  bool get isShowOnlineTotal => false;\n\n  late final Set<String> aidSet = {};\n\n  @override\n  void onClose() {\n    aidSet.clear();\n    videoPlayerServiceHandler?.onVideoDetailDispose(heroTag);\n    super.onClose();\n  }\n\n  @override\n  void onInit() {\n    super.onInit();\n    videoDetail.value.title = videoDetailCtr.args['title'];\n    final controller = Get.find<DownloadPageController>();\n    final list = <BiliDownloadEntryInfo>[];\n    for (final e in controller.pages) {\n      final items = e.entries..sort((a, b) => a.sortKey.compareTo(b.sortKey));\n      final completed = items.where((e) => e.isCompleted);\n      list.addAllIf(completed.isNotEmpty, completed);\n      if (completed.length == 1) {\n        aidSet.add(e.pageId);\n      }\n    }\n    this.list.value = list;\n    final currCid = videoDetailCtr.cid.value;\n    final index = list.indexWhere((e) => e.cid == currCid);\n    this.index.value = index;\n    if (PlatformUtils.isMobile) {\n      onVideoDetailChange(list[index]);\n    }\n    if (index != 0) {\n      SchedulerBinding.instance.addPostFrameCallback((_) {\n        try {\n          if (videoDetailCtr.scrollKey.currentState?.mounted ?? false) {\n            (videoDetailCtr.scrollKey.currentState!.innerController\n                    as ExtendedNestedScrollController)\n                .nestedPositions\n                .first\n                .localJumpTo(_offset);\n          } else if (videoDetailCtr.introScrollCtr?.hasClients ?? false) {\n            videoDetailCtr.introScrollCtr!.jumpTo(_offset);\n          }\n        } catch (_) {\n          if (kDebugMode) rethrow;\n        }\n      });\n    }\n  }\n\n  final index = (-1).obs;\n  double get _offset => index * 100 + 7 - 35;\n  final list = RxList<BiliDownloadEntryInfo>();\n\n  @override\n  bool nextPlay() {\n    final next = index.value + 1;\n    if (next < list.length) {\n      playIndex(next);\n      return true;\n    } else {\n      final playCtr = videoDetailCtr.plPlayerController;\n      if (playCtr.playRepeat == PlayRepeat.listCycle) {\n        if (list.length == 1) {\n          if (playCtr.videoPlayerController case final ctr?) {\n            ctr.seek(Duration.zero).whenComplete(ctr.play);\n          }\n        } else {\n          playIndex(0);\n        }\n        return true;\n      }\n    }\n    return false;\n  }\n\n  @override\n  bool prevPlay() {\n    final prev = index.value - 1;\n    if (prev >= 0) {\n      playIndex(prev);\n      return true;\n    }\n    return false;\n  }\n\n  void playIndex(\n    int index, {\n    BiliDownloadEntryInfo? entry,\n  }) {\n    entry ??= list[index];\n    videoDetailCtr\n      ..onReset()\n      ..cover.value = entry.cover\n      ..aid = entry.avid\n      ..bvid = entry.bvid\n      ..cid.value = entry.cid\n      ..args['dirPath'] = entry.entryDirPath\n      ..initFileSource(entry, isInit: false)\n      ..playerInit();\n    videoDetail\n      ..value.title = entry.showTitle\n      ..refresh();\n    this.index.value = index;\n    if (PlatformUtils.isMobile) {\n      onVideoDetailChange(entry);\n    }\n  }\n\n  void onVideoDetailChange(BiliDownloadEntryInfo entry) {\n    videoPlayerServiceHandler?.onVideoDetailChange(entry, entry.cid, heroTag);\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/introduction/local/view.dart",
    "content": "import 'dart:io';\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models/common/video/video_quality.dart';\nimport 'package:PiliPlus/models_new/download/bili_download_entry_info.dart';\nimport 'package:PiliPlus/pages/video/introduction/local/controller.dart';\nimport 'package:PiliPlus/utils/duration_utils.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/path_utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:path/path.dart' as path;\n\nclass LocalIntroPanel extends StatefulWidget {\n  const LocalIntroPanel({super.key, required this.heroTag});\n\n  final String heroTag;\n\n  @override\n  State<LocalIntroPanel> createState() => _LocalIntroPanelState();\n}\n\nclass _LocalIntroPanelState extends State<LocalIntroPanel>\n    with AutomaticKeepAliveClientMixin {\n  @override\n  bool get wantKeepAlive => true;\n\n  late final _controller = Get.find<LocalIntroController>(tag: widget.heroTag);\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final theme = Theme.of(context);\n    return Obx(() {\n      final currIndex = _controller.index.value;\n      return SliverFixedExtentList.builder(\n        itemCount: _controller.list.length,\n        itemBuilder: (context, index) {\n          final item = _controller.list[index];\n          return _buildItem(theme, currIndex == index, index, item);\n        },\n        itemExtent: 100,\n      );\n    });\n  }\n\n  Widget _buildItem(\n    ThemeData theme,\n    bool isCurr,\n    int index,\n    BiliDownloadEntryInfo entry,\n  ) {\n    final outline = theme.colorScheme.outline;\n    final cover = File(path.join(entry.entryDirPath, PathUtils.coverName));\n    final cacheWidth = entry.pageData?.cacheWidth ?? false;\n    return Padding(\n      padding: const EdgeInsets.only(bottom: 2),\n      child: SizedBox(\n        height: 98,\n        child: Material(\n          type: MaterialType.transparency,\n          child: InkWell(\n            onTap: () {\n              if (isCurr) {\n                return;\n              }\n              _controller.playIndex(index, entry: entry);\n            },\n            child: Padding(\n              padding: const EdgeInsets.symmetric(\n                horizontal: StyleString.safeSpace,\n                vertical: 5,\n              ),\n              child: Row(\n                spacing: 10,\n                children: [\n                  Stack(\n                    clipBehavior: Clip.none,\n                    children: [\n                      cover.existsSync()\n                          ? ClipRRect(\n                              borderRadius: StyleString.mdRadius,\n                              child: Image.file(\n                                cover,\n                                width: 140.8,\n                                height: 88,\n                                fit: BoxFit.cover,\n                                cacheWidth: cacheWidth\n                                    ? 140.8.cacheSize(context)\n                                    : null,\n                                cacheHeight: cacheWidth\n                                    ? null\n                                    : 88.cacheSize(context),\n                                colorBlendMode: NetworkImgLayer.reduce\n                                    ? BlendMode.modulate\n                                    : null,\n                                color: NetworkImgLayer.reduce\n                                    ? NetworkImgLayer.reduceLuxColor\n                                    : null,\n                              ),\n                            )\n                          : NetworkImgLayer(\n                              src: entry.cover,\n                              width: 140.8,\n                              height: 88,\n                            ),\n                      PBadge(\n                        text: DurationUtils.formatDuration(\n                          entry.totalTimeMilli ~/ 1000,\n                        ),\n                        right: 6.0,\n                        bottom: 6.0,\n                        type: PBadgeType.gray,\n                      ),\n                      if (entry.videoQuality case final videoQuality?)\n                        PBadge(\n                          text: VideoQuality.fromCode(videoQuality).shortDesc,\n                          right: 6.0,\n                          top: 6.0,\n                          type: PBadgeType.gray,\n                        ),\n                    ],\n                  ),\n                  Expanded(\n                    child: Stack(\n                      clipBehavior: Clip.none,\n                      children: [\n                        Column(\n                          spacing: 5,\n                          crossAxisAlignment: CrossAxisAlignment.start,\n                          children: [\n                            Text(\n                              entry.title,\n                              textAlign: TextAlign.start,\n                              style: TextStyle(\n                                fontSize: theme.textTheme.bodyMedium!.fontSize,\n                                height: 1.42,\n                                letterSpacing: 0.3,\n                                color: isCurr\n                                    ? theme.colorScheme.primary\n                                    : null,\n                                fontWeight: isCurr ? FontWeight.bold : null,\n                              ),\n                              maxLines: entry.ep != null ? 1 : 2,\n                              overflow: TextOverflow.ellipsis,\n                            ),\n                            if (entry.pageData?.part case final part?)\n                              if (part != entry.title)\n                                Text(\n                                  part,\n                                  maxLines: 1,\n                                  overflow: TextOverflow.ellipsis,\n                                  style: TextStyle(\n                                    fontSize: 12,\n                                    color: theme.colorScheme.onSurfaceVariant,\n                                  ),\n                                ),\n                            if (entry.ep?.showTitle case final showTitle?)\n                              Text(\n                                showTitle,\n                                maxLines: 2,\n                                overflow: TextOverflow.ellipsis,\n                                style: TextStyle(\n                                  fontSize: 12,\n                                  color: theme.colorScheme.onSurfaceVariant,\n                                ),\n                              ),\n                          ],\n                        ),\n                        if (entry.ownerName case final ownerName?)\n                          Align(\n                            alignment: Alignment.bottomLeft,\n                            child: Text(\n                              ownerName,\n                              maxLines: 1,\n                              style: TextStyle(\n                                fontSize: 12,\n                                height: 1,\n                                color: outline,\n                              ),\n                            ),\n                          ),\n                        Align(\n                          alignment: Alignment.bottomRight,\n                          child: entry.moreBtn(theme),\n                        ),\n                      ],\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/introduction/pgc/controller.dart",
    "content": "import 'dart:async';\nimport 'dart:math' show max;\n\nimport 'package:PiliPlus/http/constants.dart';\nimport 'package:PiliPlus/http/fav.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/pgc.dart';\nimport 'package:PiliPlus/http/search.dart';\nimport 'package:PiliPlus/http/video.dart';\nimport 'package:PiliPlus/models/common/video/source_type.dart';\nimport 'package:PiliPlus/models/common/video/video_type.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/episode.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/result.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/episode.dart'\n    hide EpisodeItem;\nimport 'package:PiliPlus/models_new/video/video_detail/stat_detail.dart';\nimport 'package:PiliPlus/pages/common/common_intro_controller.dart';\nimport 'package:PiliPlus/pages/dynamics_repost/view.dart';\nimport 'package:PiliPlus/pages/video/pay_coins/view.dart';\nimport 'package:PiliPlus/pages/video/reply/controller.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/play_repeat.dart';\nimport 'package:PiliPlus/services/service_locator.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:PiliPlus/utils/feed_back.dart';\nimport 'package:PiliPlus/utils/global_data.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass PgcIntroController extends CommonIntroController {\n  int? seasonId;\n  int? epId;\n\n  late final String pgcType = pgcItem.type == 1 || pgcItem.type == 4\n      ? '追番'\n      : '追剧';\n\n  late final bool isPgc;\n  late final PgcInfoModel pgcItem;\n\n  @override\n  (Object, int) get getFavRidType => (epId!, 24);\n\n  @override\n  StatDetail? getStat() => pgcItem.stat;\n\n  late final RxBool isFollowed = false.obs;\n  late final RxInt followStatus = (-1).obs;\n  late final RxBool isFav = (pgcItem.userStatus?.favored == 1).obs;\n\n  @override\n  void onInit() {\n    final args = Get.arguments;\n    seasonId = args['seasonId'];\n    epId = args['epId'];\n    isPgc = args['videoType'] == VideoType.pgc;\n    pgcItem = args['pgcItem'];\n\n    super.onInit();\n\n    if (isPgc) {\n      if (isLogin) {\n        queryIsFollowed();\n        if (epId != null) {\n          queryPgcLikeCoinFav();\n        }\n      }\n      queryVideoTags();\n    }\n  }\n\n  // 获取点赞/投币/收藏状态\n  Future<void> queryPgcLikeCoinFav() async {\n    final result = await VideoHttp.pgcLikeCoinFav(epId: epId!);\n    if (result case Success(:final response)) {\n      final hasLike = response.like == 1;\n      final hasFav = response.favorite == 1;\n      late final stat = pgcItem.stat;\n      if (hasLike) {\n        stat?.like = max(1, stat.like);\n      }\n      if (hasFav) {\n        stat?.favorite = max(1, stat.favorite);\n      }\n      this.hasLike.value = hasLike;\n      coinNum.value = response.coinNumber!;\n      this.hasFav.value = hasFav;\n    } else {\n      result.toast();\n    }\n  }\n\n  // （取消）点赞\n  @override\n  Future<void> actionLikeVideo() async {\n    if (!isLogin) {\n      SmartDialog.showToast('账号未登录');\n      return;\n    }\n    final newVal = !hasLike.value;\n    final result = await VideoHttp.likeVideo(bvid: bvid, type: newVal);\n    if (result case Success(:final response)) {\n      SmartDialog.showToast(newVal ? response : '取消赞');\n      pgcItem.stat?.like += newVal ? 1 : -1;\n      hasLike.value = newVal;\n    } else {\n      result.toast();\n    }\n  }\n\n  // 投币\n  @override\n  void actionCoinVideo() {\n    if (!isLogin) {\n      SmartDialog.showToast('账号未登录');\n      return;\n    }\n\n    if (coinNum.value >= 2) {\n      SmartDialog.showToast('达到投币上限啦~');\n      return;\n    }\n\n    if (GlobalData().coins != null && GlobalData().coins! < 1) {\n      SmartDialog.showToast('硬币不足');\n      // return;\n    }\n\n    PayCoinsPage.toPayCoinsPage(\n      onPayCoin: coinVideo,\n      hasCoin: coinNum.value == 1,\n    );\n  }\n\n  // 分享视频\n  @override\n  void actionShareVideo(BuildContext context) {\n    String videoUrl =\n        '${HttpString.baseUrl}/bangumi/play/ep$epId${videoDetailCtr.playedTimePos}';\n    showDialog(\n      context: context,\n      builder: (_) => AlertDialog(\n        clipBehavior: Clip.hardEdge,\n        contentPadding: const EdgeInsets.symmetric(vertical: 12),\n        content: Column(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            ListTile(\n              dense: true,\n              title: const Text(\n                '复制链接',\n                style: TextStyle(fontSize: 14),\n              ),\n              onTap: () {\n                Get.back();\n                Utils.copyText(videoUrl);\n              },\n            ),\n            ListTile(\n              dense: true,\n              title: const Text(\n                '其它app打开',\n                style: TextStyle(fontSize: 14),\n              ),\n              onTap: () {\n                Get.back();\n                PageUtils.launchURL(videoUrl);\n              },\n            ),\n            if (PlatformUtils.isMobile)\n              ListTile(\n                dense: true,\n                title: const Text(\n                  '分享视频',\n                  style: TextStyle(fontSize: 14),\n                ),\n                onTap: () {\n                  Get.back();\n                  Utils.shareText(videoUrl);\n                },\n              ),\n            ListTile(\n              dense: true,\n              title: const Text(\n                '分享至动态',\n                style: TextStyle(fontSize: 14),\n              ),\n              onTap: () {\n                Get.back();\n                EpisodeItem? item = pgcItem.episodes?.firstWhereOrNull(\n                  (item) => item.epId == epId,\n                );\n                showModalBottomSheet(\n                  context: context,\n                  isScrollControlled: true,\n                  useSafeArea: true,\n                  builder: (context) => RepostPanel(\n                    rid: epId,\n                    /**\n                         *  1：番剧 // 4097\n                            2：电影 // 4098\n                            3：纪录片 // 4101\n                            4：国创 // 4100\n                            5：电视剧 // 4099\n                            6：漫画\n                            7：综艺 // 4099\n                         */\n                    dynType: switch (pgcItem.type) {\n                      1 => 4097,\n                      2 => 4098,\n                      3 => 4101,\n                      4 => 4100,\n                      5 || 7 => 4099,\n                      _ => -1,\n                    },\n                    pic: pgcItem.cover,\n                    title:\n                        '${pgcItem.title}${item != null ? '\\n${item.showTitle}' : ''}',\n                    uname: '',\n                  ),\n                );\n              },\n            ),\n            ListTile(\n              dense: true,\n              title: const Text(\n                '分享至消息',\n                style: TextStyle(fontSize: 14),\n              ),\n              onTap: () {\n                Get.back();\n                try {\n                  EpisodeItem item = pgcItem.episodes!.firstWhere(\n                    (item) => item.epId == epId,\n                  );\n                  final title =\n                      item.shareCopy ??\n                      '${pgcItem.title} ${item.showTitle ?? item.longTitle}';\n                  PageUtils.pmShare(\n                    context,\n                    content: {\n                      \"id\": epId!.toString(),\n                      \"title\": title,\n                      \"url\": item.shareUrl,\n                      \"headline\": title,\n                      \"source\": 16,\n                      \"thumb\": item.cover,\n                      \"source_desc\": switch (pgcItem.type) {\n                        1 => '番剧',\n                        2 => '电影',\n                        3 => '纪录片',\n                        4 => '国创',\n                        5 => '电视剧',\n                        6 => '漫画',\n                        7 => '综艺',\n                        _ => null,\n                      },\n                    },\n                  );\n                } catch (e) {\n                  SmartDialog.showToast(e.toString());\n                }\n              },\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  // 修改分P或番剧分集\n  Future<bool> onChangeEpisode(BaseEpisodeItem episode) async {\n    try {\n      final int epId = episode.epId ?? episode.id!;\n      final String bvid = episode.bvid ?? this.bvid;\n      final int aid = episode.aid ?? IdUtils.bv2av(bvid);\n      final int? cid =\n          episode.cid ?? await SearchHttp.ab2c(aid: aid, bvid: bvid);\n      if (cid == null) {\n        return false;\n      }\n      final String? cover = episode.cover;\n\n      // 重新获取视频资源\n      this.epId = epId;\n      this.bvid = bvid;\n\n      videoDetailCtr\n        ..plPlayerController.pause()\n        ..makeHeartBeat()\n        ..onReset()\n        ..epId = epId\n        ..bvid = bvid\n        ..aid = aid\n        ..cid.value = cid\n        ..queryVideoUrl();\n      if (cover != null && cover.isNotEmpty) {\n        videoDetailCtr.cover.value = cover;\n      }\n\n      // 重新请求评论\n      if (videoDetailCtr.showReply) {\n        try {\n          final replyCtr = Get.find<VideoReplyController>(tag: heroTag)\n            ..aid = aid;\n          if (replyCtr.loadingState.value is! Loading) {\n            replyCtr.onReload();\n          }\n        } catch (_) {}\n      }\n\n      if (isPgc && isLogin) {\n        queryPgcLikeCoinFav();\n      }\n\n      hasLater.value = videoDetailCtr.sourceType == SourceType.watchLater;\n      this.cid.value = cid;\n      queryOnlineTotal();\n      queryVideoIntro(episode as EpisodeItem);\n      return true;\n    } catch (e) {\n      if (kDebugMode) debugPrint('pgc onChangeEpisode: $e');\n      return false;\n    }\n  }\n\n  // 追番\n  Future<void> pgcAdd() async {\n    final result = await VideoHttp.pgcAdd(seasonId: pgcItem.seasonId);\n    if (result case Success(:final response)) {\n      isFollowed.value = true;\n      followStatus.value = 2;\n      SmartDialog.showToast(response);\n    } else {\n      result.toast();\n    }\n  }\n\n  // 取消追番\n  Future<void> pgcDel() async {\n    final result = await VideoHttp.pgcDel(seasonId: pgcItem.seasonId);\n    if (result case Success(:final response)) {\n      isFollowed.value = false;\n      SmartDialog.showToast(response);\n    } else {\n      result.toast();\n    }\n  }\n\n  Future<void> pgcUpdate(int status) async {\n    final result = await VideoHttp.pgcUpdate(\n      seasonId: pgcItem.seasonId.toString(),\n      status: status,\n    );\n    if (result case Success(:final response)) {\n      followStatus.value = status;\n      SmartDialog.showToast(response);\n    } else {\n      result.toast();\n    }\n  }\n\n  @override\n  bool prevPlay() {\n    final episodes = pgcItem.episodes!;\n    int currentIndex = episodes.indexWhere(\n      (e) => e.cid == videoDetailCtr.cid.value,\n    );\n    int prevIndex = currentIndex - 1;\n    PlayRepeat playRepeat = videoDetailCtr.plPlayerController.playRepeat;\n    if (prevIndex < 0) {\n      if (playRepeat == PlayRepeat.listCycle) {\n        prevIndex = episodes.length - 1;\n      } else {\n        return false;\n      }\n    }\n    onChangeEpisode(episodes[prevIndex]);\n    return true;\n  }\n\n  /// 列表循环或者顺序播放时，自动播放下一个；自动连播时，播放相关视频\n  @override\n  bool nextPlay() {\n    try {\n      final episodes = pgcItem.episodes!;\n\n      PlayRepeat playRepeat = videoDetailCtr.plPlayerController.playRepeat;\n\n      int currentIndex = episodes.indexWhere(\n        (e) => e.cid == videoDetailCtr.cid.value,\n      );\n      int nextIndex = currentIndex + 1;\n      // 列表循环\n      if (nextIndex >= episodes.length) {\n        if (playRepeat == PlayRepeat.listCycle) {\n          nextIndex = 0;\n        } else if (playRepeat == PlayRepeat.autoPlayRelated) {\n          return false;\n        } else {\n          return false;\n        }\n      }\n      onChangeEpisode(episodes[nextIndex]);\n      return true;\n    } catch (_) {\n      return false;\n    }\n  }\n\n  // 一键三连\n  @override\n  Future<void> actionTriple() async {\n    feedBack();\n    if (!isLogin) {\n      SmartDialog.showToast('账号未登录');\n      return;\n    }\n    if (hasLike.value && hasCoin && hasFav.value) {\n      // 已点赞、投币、收藏\n      SmartDialog.showToast('已三连');\n      return;\n    }\n    final result = await VideoHttp.pgcTriple(epId: epId!, seasonId: seasonId);\n    if (result case Success(:final response)) {\n      late final stat = pgcItem.stat;\n      if (response.like == 1 && !hasLike.value) {\n        stat?.like++;\n        hasLike.value = true;\n      }\n      if (response.coin == 1 && !hasCoin) {\n        stat?.coin += 2;\n        coinNum.value = 2;\n        GlobalData().afterCoin(2);\n      }\n      if (response.favorite == 1 && !hasFav.value) {\n        stat?.favorite++;\n        hasFav.value = true;\n      }\n      if (!hasCoin) {\n        SmartDialog.showToast('投币失败');\n      } else {\n        SmartDialog.showToast('三连成功');\n      }\n    } else {\n      result.toast();\n    }\n  }\n\n  Future<void> queryIsFollowed() async {\n    // try {\n    //   final result = await Request().get(\n    //     'https://www.bilibili.com/bangumi/play/ss$seasonId',\n    //   );\n    //   dom.Document document = html_parser.parse(result.data);\n    //   dom.Element? scriptElement =\n    //       document.querySelector('script#__NEXT_DATA__');\n    //   if (scriptElement != null) {\n    //     dynamic scriptContent = jsonDecode(scriptElement.text);\n    //     isFollowed.value =\n    //         scriptContent['props']['pageProps']['followState']['isFollowed'];\n    //     followStatus.value =\n    //         scriptContent['props']['pageProps']['followState']['followStatus'];\n    //   }\n    // } catch (_) {}\n\n    // ViewGrpc.view(bvid: bvid).then((res) {\n    //   if (res.isSuccess) {\n    //     ViewPgcAny view = ViewPgcAny.fromBuffer(res.data.supplement.value);\n    //     final userStatus = view.ogvData.userStatus;\n    //     isFollowed.value = userStatus.follow == 1;\n    //     followStatus.value = userStatus.followStatus;\n    //   }\n    // });\n\n    final res = await PgcHttp.seasonStatus(seasonId!);\n    if (res case Success(:final response)) {\n      isFollowed.value = response['follow'] == 1;\n      followStatus.value = response['follow_status'];\n    }\n  }\n\n  @override\n  void queryVideoIntro([EpisodeItem? episode]) {\n    episode ??= pgcItem.episodes!.firstWhere((e) => e.cid == cid.value);\n    videoDetail\n      ..value.title = episode.showTitle\n      ..refresh();\n    videoPlayerServiceHandler?.onVideoDetailChange(\n      episode,\n      cid.value,\n      heroTag,\n      artist: pgcItem.title,\n    );\n  }\n\n  Future<void> onFavPugv(bool isFav) async {\n    final res = isFav\n        ? await FavHttp.delFavPugv(seasonId!)\n        : await FavHttp.addFavPugv(seasonId!);\n    if (res.isSuccess) {\n      this.isFav.value = !isFav;\n      SmartDialog.showToast('${isFav ? '取消' : ''}收藏成功');\n    } else {\n      res.toast();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/introduction/pgc/view.dart",
    "content": "import 'dart:math';\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/image_viewer/hero.dart';\nimport 'package:PiliPlus/common/widgets/stat/stat.dart';\nimport 'package:PiliPlus/models/common/image_preview_type.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models/common/stat_type.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/result.dart';\nimport 'package:PiliPlus/pages/video/controller.dart';\nimport 'package:PiliPlus/pages/video/introduction/pgc/controller.dart';\nimport 'package:PiliPlus/pages/video/introduction/pgc/widgets/pgc_panel.dart';\nimport 'package:PiliPlus/pages/video/introduction/ugc/widgets/action_item.dart';\nimport 'package:PiliPlus/utils/extension/get_ext.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:font_awesome_flutter/font_awesome_flutter.dart';\nimport 'package:get/get.dart';\n\nclass PgcIntroPage extends StatefulWidget {\n  final int? cid;\n  final String heroTag;\n  final Function showEpisodes;\n  final Function showIntroDetail;\n  final double maxWidth;\n  final bool isLandscape;\n\n  const PgcIntroPage({\n    super.key,\n    this.cid,\n    required this.heroTag,\n    required this.showEpisodes,\n    required this.showIntroDetail,\n    required this.maxWidth,\n    required this.isLandscape,\n  });\n\n  @override\n  State<PgcIntroPage> createState() => _PgcIntroPageState();\n}\n\nclass _PgcIntroPageState extends State<PgcIntroPage> {\n  late final PgcIntroController introController;\n  late final VideoDetailController videoDetailCtr;\n\n  @override\n  void initState() {\n    super.initState();\n    introController = Get.putOrFind(\n      PgcIntroController.new,\n      tag: widget.heroTag,\n    );\n    videoDetailCtr = Get.find<VideoDetailController>(tag: widget.heroTag);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final ThemeData theme = Theme.of(context);\n    final item = introController.pgcItem;\n    final isLandscape = widget.isLandscape;\n    Widget sliver = SliverToBoxAdapter(\n      child: Column(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          Row(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            spacing: 10,\n            children: [\n              _buildCover(theme, isLandscape, item),\n              Expanded(child: _buildInfoPanel(isLandscape, theme, item)),\n            ],\n          ),\n          const SizedBox(height: 6),\n          // 点赞收藏转发 布局样式2\n          if (introController.isPgc) actionGrid(theme, item, introController),\n          // 番剧分集\n          if (item.episodes?.isNotEmpty == true)\n            PgcPanel(\n              heroTag: widget.heroTag,\n              pages: item.episodes!,\n              cid: videoDetailCtr.cid.value,\n              onChangeEpisode: introController.onChangeEpisode,\n              showEpisodes: widget.showEpisodes,\n              newEp: item.newEp,\n            ),\n        ],\n      ),\n    );\n    if (!introController.isPgc) {\n      final brief = _buildBrief(item);\n      if (brief != null) {\n        sliver = SliverMainAxisGroup(\n          slivers: [\n            sliver,\n            brief,\n          ],\n        );\n      }\n    }\n    return SliverPadding(\n      padding:\n          const EdgeInsets.all(StyleString.safeSpace) +\n          const EdgeInsets.only(bottom: 50),\n      sliver: sliver,\n    );\n  }\n\n  Widget? _buildBrief(PgcInfoModel item) {\n    final img = item.brief?.img;\n    if (img != null && img.isNotEmpty) {\n      final maxWidth = widget.maxWidth - 24;\n      double padding = max(0, maxWidth - 400);\n      final imgWidth = maxWidth - padding;\n      padding = padding / 2;\n      return SliverPadding(\n        padding: EdgeInsetsGeometry.only(\n          top: 10,\n          left: padding,\n          right: padding,\n        ),\n        sliver: SliverMainAxisGroup(\n          slivers: img.map((e) {\n            return SliverToBoxAdapter(\n              child: NetworkImgLayer(\n                type: .emote,\n                src: e.url,\n                width: imgWidth,\n                height: imgWidth * e.aspectRatio,\n              ),\n            );\n          }).toList(),\n        ),\n      );\n    }\n    return null;\n  }\n\n  Widget _buildCover(ThemeData theme, bool isLandscape, PgcInfoModel item) {\n    return Stack(\n      clipBehavior: Clip.none,\n      children: [\n        GestureDetector(\n          onTap: () => PageUtils.imageView(\n            imgList: [SourceModel(url: item.cover!)],\n          ),\n          child: fromHero(\n            tag: item.cover!,\n            child: NetworkImgLayer(\n              width: 115,\n              height: 153,\n              src: item.cover!,\n            ),\n          ),\n        ),\n        if (item.rating != null)\n          PBadge(\n            text: '评分 ${item.rating!.score!}',\n            top: null,\n            right: 6,\n            bottom: 6,\n            left: null,\n          ),\n        if (!introController.isPgc)\n          Positioned(\n            right: 6,\n            bottom: 6,\n            child: Obx(() {\n              final isFav = introController.isFav.value;\n              return iconButton(\n                size: 28,\n                iconSize: 26,\n                tooltip: '${isFav ? '取消' : ''}收藏',\n                onPressed: () => introController.onFavPugv(isFav),\n                icon: isFav\n                    ? const Icon(Icons.star_rounded)\n                    : const Icon(Icons.star_border_rounded),\n                bgColor: isFav\n                    ? theme.colorScheme.secondaryContainer\n                    : theme.colorScheme.onInverseSurface,\n                iconColor: isFav\n                    ? theme.colorScheme.onSecondaryContainer\n                    : theme.colorScheme.onSurfaceVariant,\n              );\n            }),\n          ),\n      ],\n    );\n  }\n\n  Widget _buildInfoPanel(bool isLandscape, ThemeData theme, PgcInfoModel item) {\n    if (introController.isPgc) {\n      Widget subBtn() => Obx(\n        () {\n          final isFollowed = introController.isFollowed.value;\n          final followStatus = introController.followStatus.value;\n          return FilledButton.tonal(\n            style: FilledButton.styleFrom(\n              tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n              padding: const EdgeInsets.symmetric(\n                horizontal: 20,\n                vertical: 10,\n              ),\n              visualDensity: VisualDensity.compact,\n              foregroundColor: isFollowed ? theme.colorScheme.outline : null,\n              backgroundColor: isFollowed\n                  ? theme.colorScheme.onInverseSurface\n                  : null,\n            ),\n            onPressed: followStatus == -1\n                ? null\n                : () {\n                    if (isFollowed) {\n                      showPgcFollowDialog(\n                        context: context,\n                        type: introController.pgcType,\n                        followStatus: followStatus,\n                        onUpdateStatus: (followStatus) {\n                          if (followStatus == -1) {\n                            introController.pgcDel();\n                          } else {\n                            introController.pgcUpdate(\n                              followStatus,\n                            );\n                          }\n                        },\n                      );\n                    } else {\n                      introController.pgcAdd();\n                    }\n                  },\n            child: Text(\n              isFollowed\n                  ? '已${introController.pgcType}'\n                  : introController.pgcType,\n            ),\n          );\n        },\n      );\n      Widget title() => Row(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        spacing: 20,\n        children: [\n          Expanded(\n            child: Text(\n              item.title!,\n              style: const TextStyle(fontSize: 16),\n              maxLines: 1,\n              overflow: TextOverflow.ellipsis,\n            ),\n          ),\n          subBtn(),\n        ],\n      );\n      List<Widget> desc() => [\n        Text(\n          item.newEp!.desc!,\n          style: TextStyle(\n            fontSize: 12,\n            color: theme.colorScheme.outline,\n          ),\n        ),\n        Text.rich(\n          TextSpan(\n            children: [\n              if (item.areas?.isNotEmpty == true)\n                TextSpan(text: '${item.areas!.first.name!}  '),\n              TextSpan(\n                text: item.publish!.pubTimeShow!,\n              ),\n            ],\n          ),\n          style: TextStyle(\n            fontSize: 12,\n            color: theme.colorScheme.outline,\n          ),\n        ),\n      ];\n      Widget stat() => Wrap(\n        spacing: 6,\n        runSpacing: 2,\n        children: [\n          StatWidget(\n            type: StatType.play,\n            value: item.stat!.view,\n          ),\n          StatWidget(\n            type: StatType.danmaku,\n            value: item.stat!.danmaku,\n          ),\n          if (isLandscape) ...desc(),\n        ],\n      );\n      return GestureDetector(\n        onTap: () => widget.showIntroDetail(\n          item,\n          introController.videoTags.value,\n        ),\n        behavior: HitTestBehavior.opaque,\n        child: SizedBox(\n          height: 153,\n          child: Column(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              title(),\n              stat(),\n              const SizedBox(height: 5),\n              if (!isLandscape) ...desc(),\n              const SizedBox(height: 5),\n              Expanded(\n                child: Text(\n                  '简介：${item.evaluate}',\n                  style: TextStyle(\n                    fontSize: 13,\n                    color: theme.colorScheme.outline,\n                  ),\n                ),\n              ),\n            ],\n          ),\n        ),\n      );\n    }\n\n    // pugv\n    Widget upInfo(int mid, String avatar, String name, {String? role}) =>\n        GestureDetector(\n          behavior: HitTestBehavior.opaque,\n          onTap: () => Get.toNamed('/member?mid=$mid'),\n          child: Row(\n            spacing: 8,\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              NetworkImgLayer(\n                src: avatar,\n                width: 35,\n                height: 35,\n                type: ImageType.avatar,\n              ),\n              Column(\n                mainAxisSize: MainAxisSize.min,\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  Text(name),\n                  if (role != null && role.isNotEmpty)\n                    Text(\n                      role,\n                      style: TextStyle(\n                        fontSize: 12,\n                        color: theme.colorScheme.outline,\n                      ),\n                    ),\n                ],\n              ),\n            ],\n          ),\n        );\n    return Column(\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        if (item.cooperators?.isNotEmpty == true) ...[\n          SingleChildScrollView(\n            scrollDirection: Axis.horizontal,\n            child: Row(\n              spacing: 25,\n              children: item.cooperators!.map((e) {\n                return upInfo(e.mid!, e.avatar!, e.nickName!, role: e.role);\n              }).toList(),\n            ),\n          ),\n          const SizedBox(height: 6),\n        ] else if (item.upInfo?.mid != null) ...[\n          upInfo(\n            item.upInfo!.mid!,\n            item.upInfo!.avatar!,\n            item.upInfo!.uname!,\n          ),\n          const SizedBox(height: 6),\n        ],\n        Text(\n          item.title!,\n          style: const TextStyle(fontSize: 16),\n        ),\n        if (item.subtitle?.isNotEmpty == true) ...[\n          const SizedBox(height: 5),\n          Text(\n            item.subtitle!,\n            style: TextStyle(\n              fontSize: 13,\n              color: theme.colorScheme.onSurfaceVariant,\n            ),\n          ),\n        ],\n      ],\n    );\n  }\n\n  Widget actionGrid(\n    ThemeData theme,\n    PgcInfoModel item,\n    PgcIntroController introController,\n  ) {\n    return SizedBox(\n      height: 48,\n      child: Row(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          Obx(\n            () => ActionItem(\n              animation: introController.tripleAnimation,\n              icon: const Icon(FontAwesomeIcons.thumbsUp),\n              selectIcon: const Icon(FontAwesomeIcons.solidThumbsUp),\n              selectStatus: introController.hasLike.value,\n              semanticsLabel: '点赞',\n              text: NumUtils.numFormat(item.stat!.like),\n              onStartTriple: introController.onStartTriple,\n              onCancelTriple: introController.onCancelTriple,\n            ),\n          ),\n          Obx(\n            () => ActionItem(\n              animation: introController.tripleAnimation,\n              icon: const Icon(FontAwesomeIcons.b),\n              selectIcon: const Icon(FontAwesomeIcons.b),\n              onTap: introController.actionCoinVideo,\n              selectStatus: introController.hasCoin,\n              semanticsLabel: '投币',\n              text: NumUtils.numFormat(item.stat!.coin),\n            ),\n          ),\n          Obx(\n            () => ActionItem(\n              animation: introController.tripleAnimation,\n              icon: const Icon(FontAwesomeIcons.star),\n              selectIcon: const Icon(FontAwesomeIcons.solidStar),\n              onTap: () => introController.showFavBottomSheet(context),\n              onLongPress: () => introController.showFavBottomSheet(\n                context,\n                isLongPress: true,\n              ),\n              selectStatus: introController.hasFav.value,\n              semanticsLabel: '收藏',\n              text: NumUtils.numFormat(item.stat!.favorite),\n            ),\n          ),\n          Obx(\n            () => ActionItem(\n              icon: const Icon(FontAwesomeIcons.clock),\n              selectIcon: const Icon(FontAwesomeIcons.solidClock),\n              onTap: () =>\n                  introController.handleAction(introController.viewLater),\n              selectStatus: introController.hasLater.value,\n              semanticsLabel: '再看',\n              text: '再看',\n            ),\n          ),\n          ActionItem(\n            icon: const Icon(FontAwesomeIcons.shareFromSquare),\n            onTap: () => introController.actionShareVideo(context),\n            selectStatus: false,\n            semanticsLabel: '转发',\n            text: NumUtils.numFormat(item.stat!.share),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/introduction/pgc/widgets/intro_detail.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/page/tabs.dart';\nimport 'package:PiliPlus/common/widgets/flutter/selectable_text/text.dart';\nimport 'package:PiliPlus/common/widgets/keep_alive_wrapper.dart';\nimport 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/common/widgets/stat/stat.dart';\nimport 'package:PiliPlus/models/common/stat_type.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/result.dart';\nimport 'package:PiliPlus/models_new/video/video_tag/data.dart';\nimport 'package:PiliPlus/pages/common/slide/common_slide_page.dart';\nimport 'package:PiliPlus/pages/pgc_review/view.dart';\nimport 'package:PiliPlus/pages/search/widgets/search_text.dart';\nimport 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart' hide TabBarView;\nimport 'package:get/get.dart';\n\nclass PgcIntroPanel extends CommonSlidePage {\n  final PgcInfoModel item;\n  final List<VideoTagItem>? videoTags;\n\n  const PgcIntroPanel({\n    super.key,\n    required this.item,\n    super.enableSlide,\n    this.videoTags,\n  });\n\n  @override\n  State<PgcIntroPanel> createState() => _IntroDetailState();\n}\n\nclass _IntroDetailState extends State<PgcIntroPanel>\n    with TickerProviderStateMixin, CommonSlideMixin {\n  late final ScrollController _controller;\n  late final TabController _tabController;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = ScrollController();\n    _tabController = TabController(length: 2, vsync: this);\n  }\n\n  @override\n  void dispose() {\n    _tabController.dispose();\n    _controller.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget buildPage(ThemeData theme) {\n    return Material(\n      color: theme.colorScheme.surface,\n      child: Column(\n        children: [\n          Row(\n            children: [\n              Expanded(\n                child: TabBar(\n                  controller: _tabController,\n                  dividerHeight: 0,\n                  isScrollable: true,\n                  tabAlignment: TabAlignment.start,\n                  dividerColor: Colors.transparent,\n                  tabs: const [\n                    Tab(text: '详情'),\n                    Tab(text: '点评'),\n                  ],\n                  onTap: (index) {\n                    if (!_tabController.indexIsChanging) {\n                      if (index == 0) {\n                        _controller.animToTop();\n                      }\n                    }\n                  },\n                ),\n              ),\n              IconButton(\n                tooltip: '关闭',\n                icon: const Icon(Icons.close, size: 20),\n                onPressed: Get.back,\n              ),\n              const SizedBox(width: 2),\n            ],\n          ),\n          Expanded(\n            child: enableSlide ? slideList(theme) : buildList(theme),\n          ),\n        ],\n      ),\n    );\n  }\n\n  @override\n  Widget buildList(ThemeData theme) {\n    return TabBarView<TabBarDragGestureRecognizer>(\n      controller: _tabController,\n      physics: clampingScrollPhysics,\n      horizontalDragGestureRecognizer: () =>\n          TabBarDragGestureRecognizer(isDxAllowed: isDxAllowed),\n      children: [\n        KeepAliveWrapper(child: _buildInfo(theme)),\n        PgcReviewPage(\n          name: widget.item.title!,\n          mediaId: widget.item.mediaId,\n        ),\n      ],\n    );\n  }\n\n  Widget _buildInfo(ThemeData theme) {\n    final TextStyle smallTitle = TextStyle(\n      fontSize: 12,\n      color: theme.colorScheme.onSurface,\n    );\n    final TextStyle textStyle = TextStyle(\n      color: theme.colorScheme.onSurfaceVariant,\n    );\n    return ListView(\n      controller: _controller,\n      physics: const AlwaysScrollableScrollPhysics(),\n      padding: EdgeInsets.only(\n        left: 14,\n        right: 14,\n        top: 14,\n        bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n      ),\n      children: [\n        selectableText(\n          widget.item.title!,\n          style: const TextStyle(fontSize: 16),\n        ),\n        const SizedBox(height: 4),\n        Row(\n          spacing: 6,\n          children: [\n            StatWidget(\n              type: StatType.play,\n              value: widget.item.stat!.view,\n            ),\n            StatWidget(\n              type: StatType.danmaku,\n              value: widget.item.stat!.danmaku,\n            ),\n          ],\n        ),\n        const SizedBox(height: 4),\n        Row(\n          children: [\n            Text(\n              widget.item.areas!.first.name!,\n              style: smallTitle,\n            ),\n            const SizedBox(width: 6),\n            Text(\n              widget.item.publish!.pubTimeShow!,\n              style: smallTitle,\n            ),\n            const SizedBox(width: 6),\n            Text(\n              widget.item.newEp!.desc!,\n              style: smallTitle,\n            ),\n          ],\n        ),\n        if (widget.item.evaluate?.isNotEmpty == true) ...[\n          const SizedBox(height: 20),\n          Text(\n            '简介：',\n            style: theme.textTheme.titleMedium,\n          ),\n          const SizedBox(height: 4),\n          selectableText(\n            widget.item.evaluate!,\n            style: textStyle,\n          ),\n        ],\n        if (widget.item.actors?.isNotEmpty == true) ...[\n          const SizedBox(height: 20),\n          Text(\n            '演职人员：',\n            style: theme.textTheme.titleMedium,\n          ),\n          const SizedBox(height: 4),\n          Text(\n            widget.item.actors!,\n            style: textStyle,\n          ),\n        ],\n        if (widget.videoTags?.isNotEmpty == true) ...[\n          const SizedBox(height: 10),\n          Wrap(\n            spacing: 8,\n            runSpacing: 8,\n            children: widget.videoTags!\n                .map(\n                  (item) => SearchText(\n                    fontSize: 13,\n                    text: item.tagName!,\n                    onTap: (tagName) => Get.toNamed(\n                      '/searchResult',\n                      parameters: {'keyword': tagName},\n                    ),\n                    onLongPress: Utils.copyText,\n                  ),\n                )\n                .toList(),\n          ),\n        ],\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/introduction/pgc/widgets/pgc_panel.dart",
    "content": "import 'dart:async';\n\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/episode.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/new_ep.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/episode.dart'\n    hide EpisodeItem;\nimport 'package:PiliPlus/pages/video/controller.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass PgcPanel extends StatefulWidget {\n  const PgcPanel({\n    super.key,\n    required this.pages,\n    this.cid,\n    required this.onChangeEpisode,\n    required this.showEpisodes,\n    required this.heroTag,\n    this.newEp,\n  });\n\n  final List<EpisodeItem> pages;\n  final int? cid;\n  final ValueChanged<BaseEpisodeItem> onChangeEpisode;\n  final Function showEpisodes;\n  final String heroTag;\n  final NewEp? newEp;\n\n  @override\n  State<PgcPanel> createState() => _PgcPanelState();\n}\n\nclass _PgcPanelState extends State<PgcPanel> {\n  late int currentIndex;\n  late final ScrollController listViewScrollCtr;\n  // 默认未开通\n  late final bool vipStatus;\n  late int cid;\n  late final VideoDetailController videoDetailCtr;\n  late final StreamSubscription<int> _listener;\n\n  @override\n  void initState() {\n    super.initState();\n    cid = widget.cid!;\n    currentIndex = widget.pages.indexWhere((e) => e.cid == cid);\n    listViewScrollCtr = ScrollController(\n      initialScrollOffset: currentIndex * 150.0,\n    );\n\n    vipStatus = Pref.userInfoCache?.vipStatus != 1;\n\n    videoDetailCtr = Get.find<VideoDetailController>(tag: widget.heroTag);\n\n    _listener = videoDetailCtr.cid.listen((int p0) {\n      cid = p0;\n      currentIndex = widget.pages.indexWhere((EpisodeItem e) => e.cid == cid);\n      if (!mounted) return;\n      setState(() {});\n      scrollToIndex();\n    });\n  }\n\n  @override\n  void dispose() {\n    _listener.cancel();\n    listViewScrollCtr.dispose();\n    super.dispose();\n  }\n\n  void scrollToIndex() {\n    WidgetsBinding.instance.addPostFrameCallback((_) {\n      listViewScrollCtr.animateTo(\n        (currentIndex * 150.0).clamp(\n          listViewScrollCtr.position.minScrollExtent,\n          listViewScrollCtr.position.maxScrollExtent,\n        ),\n        duration: const Duration(milliseconds: 500),\n        curve: Curves.easeInOut,\n      );\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context).colorScheme;\n    final currEpisode = widget.pages[currentIndex];\n    final isPugv = currEpisode.from == 'pugv';\n    return Column(\n      children: [\n        Padding(\n          padding: const EdgeInsets.only(top: 5, bottom: 3),\n          child: Row(\n            mainAxisAlignment: MainAxisAlignment.spaceBetween,\n            children: [\n              const Text('合集 '),\n              Expanded(\n                child: Text(\n                  ' 正在播放：${currEpisode.longTitle ?? currEpisode.title}',\n                  overflow: TextOverflow.ellipsis,\n                  style: TextStyle(fontSize: 12, color: theme.outline),\n                ),\n              ),\n              const SizedBox(width: 10),\n              SizedBox(\n                height: 34,\n                child: TextButton(\n                  style: const ButtonStyle(\n                    padding: WidgetStatePropertyAll(EdgeInsets.zero),\n                  ),\n                  onPressed: () => widget.showEpisodes(\n                    null,\n                    null,\n                    widget.pages,\n                    videoDetailCtr.bvid,\n                    videoDetailCtr.aid,\n                    cid,\n                  ),\n                  child: Text(\n                    widget.newEp?.desc?.contains('连载') == true\n                        ? '连载中，更新至${Utils.isStringNumeric(widget.newEp!.title!) ? '第${widget.newEp!.title}话' : '${widget.newEp!.title}'}'\n                        : widget.newEp?.desc ?? '查看全部',\n                    style: const TextStyle(fontSize: 13),\n                  ),\n                ),\n              ),\n            ],\n          ),\n        ),\n        SizedBox(\n          height: 60,\n          child: ListView.builder(\n            key: const PageStorageKey(_PgcPanelState),\n            padding: EdgeInsets.zero,\n            controller: listViewScrollCtr,\n            scrollDirection: Axis.horizontal,\n            itemCount: widget.pages.length,\n            itemExtent: 150,\n            itemBuilder: (BuildContext context, int index) =>\n                _buildItem(theme, isPugv, index),\n          ),\n        ),\n      ],\n    );\n  }\n\n  Widget _buildItem(ColorScheme theme, bool isPugv, int index) {\n    final item = widget.pages[index];\n    final hasLongTitle = item.longTitle?.isNotEmpty == true;\n    final color = index == currentIndex ? theme.primary : theme.onSurface;\n    return Container(\n      width: 150,\n      height: 60,\n      margin: index != widget.pages.length - 1\n          ? const EdgeInsets.only(right: 10)\n          : null,\n      child: Material(\n        color: theme.onInverseSurface,\n        borderRadius: const BorderRadius.all(Radius.circular(6)),\n        child: InkWell(\n          borderRadius: const BorderRadius.all(Radius.circular(6)),\n          onTap: () {\n            if (item.badge == '会员' && vipStatus) {\n              SmartDialog.showToast('需要大会员');\n            }\n            widget.onChangeEpisode(item);\n          },\n          child: Padding(\n            padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 10),\n            child: Column(\n              spacing: 3,\n              crossAxisAlignment: CrossAxisAlignment.start,\n              children: [\n                Row(\n                  children: [\n                    Expanded(\n                      child: Text.rich(\n                        maxLines: hasLongTitle ? 1 : 2,\n                        TextSpan(\n                          children: [\n                            if (index == currentIndex)\n                              WidgetSpan(\n                                alignment: PlaceholderAlignment.middle,\n                                child: Padding(\n                                  padding: const EdgeInsets.only(right: 6),\n                                  child: Image.asset(\n                                    'assets/images/live.png',\n                                    color: theme.primary,\n                                    height: 12,\n                                    cacheHeight: 12.cacheSize(context),\n                                    semanticLabel: \"正在播放：\",\n                                  ),\n                                ),\n                              ),\n                            TextSpan(\n                              text: item.title ?? '第${index + 1}话',\n                              style: TextStyle(\n                                fontSize: 13,\n                                color: color,\n                              ),\n                            ),\n                          ],\n                        ),\n                      ),\n                    ),\n                    if (item.badge?.isNotEmpty == true) ...[\n                      const SizedBox(width: 2),\n                      if (item.badge == '会员')\n                        Image.asset(\n                          'assets/images/big-vip.png',\n                          height: 16,\n                          cacheHeight: 16.cacheSize(context),\n                          semanticLabel: \"大会员\",\n                        )\n                      else\n                        Text(\n                          item.badge!,\n                          style: TextStyle(\n                            fontSize: 11,\n                            color: switch (item.badge) {\n                              '限免' => theme.freeColor,\n                              '预告' => theme.onSurfaceVariant,\n                              _ => theme.primary,\n                            },\n                          ),\n                        ),\n                    ],\n                  ],\n                ),\n                if (hasLongTitle)\n                  Text(\n                    isPugv ? item.title! : item.longTitle!,\n                    maxLines: 1,\n                    style: TextStyle(\n                      fontSize: 13,\n                      color: color,\n                    ),\n                    overflow: TextOverflow.ellipsis,\n                  ),\n              ],\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/introduction/ugc/controller.dart",
    "content": "import 'dart:async';\nimport 'dart:math';\n\nimport 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/http/api.dart';\nimport 'package:PiliPlus/http/constants.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/member.dart';\nimport 'package:PiliPlus/http/search.dart';\nimport 'package:PiliPlus/http/user.dart';\nimport 'package:PiliPlus/http/video.dart';\nimport 'package:PiliPlus/models/common/video/source_type.dart';\nimport 'package:PiliPlus/models_new/member_card_info/data.dart';\nimport 'package:PiliPlus/models_new/video/video_ai_conclusion/model_result.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/episode.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/page.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/section.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/staff.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/stat_detail.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/ugc_season.dart';\nimport 'package:PiliPlus/pages/common/common_intro_controller.dart';\nimport 'package:PiliPlus/pages/dynamics_repost/view.dart';\nimport 'package:PiliPlus/pages/video/pay_coins/view.dart';\nimport 'package:PiliPlus/pages/video/related/controller.dart';\nimport 'package:PiliPlus/pages/video/reply/controller.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/play_repeat.dart';\nimport 'package:PiliPlus/services/service_locator.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/extension/context_ext.dart';\nimport 'package:PiliPlus/utils/extension/string_ext.dart';\nimport 'package:PiliPlus/utils/feed_back.dart';\nimport 'package:PiliPlus/utils/global_data.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/request_utils.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:expandable/expandable.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass UgcIntroController extends CommonIntroController with ReloadMixin {\n  late ExpandableController expandableCtr;\n\n  final RxBool status = true.obs;\n\n  // up主粉丝数\n  final Rx<MemberCardInfoData> userStat = MemberCardInfoData().obs;\n  // 关注状态 默认未关注\n  late final RxMap followStatus = {}.obs;\n  late final RxMap staffRelations = {}.obs;\n\n  // 是否点踩\n  final RxBool hasDislike = false.obs;\n\n  late final showArgueMsg = Pref.showArgueMsg;\n  late final enableAi = Pref.enableAi;\n  late final horizontalMemberPage = Pref.horizontalMemberPage;\n\n  AiConclusionResult? aiConclusionResult;\n\n  late final Map<int?, bool> seasonFavState = {};\n\n  @override\n  void onInit() {\n    super.onInit();\n    bool alwaysExpandIntroPanel = Pref.alwaysExpandIntroPanel;\n    expandableCtr = ExpandableController(\n      initialExpanded: alwaysExpandIntroPanel,\n    );\n    if (!alwaysExpandIntroPanel && Pref.expandIntroPanelH) {\n      WidgetsBinding.instance.addPostFrameCallback((_) {\n        if (!expandableCtr.expanded && Get.context!.isLandscape) {\n          expandableCtr.toggle();\n        }\n      });\n    }\n\n    videoDetail.value.title = Get.arguments['title'] ?? '';\n  }\n\n  // 获取视频简介&分p\n  @override\n  Future<void> queryVideoIntro() async {\n    queryVideoTags();\n    final res = await VideoHttp.videoIntro(bvid: bvid);\n    if (res case Success(:final response)) {\n      if (response.redirectUrl != null &&\n          videoDetailCtr.epId == null &&\n          videoDetailCtr.seasonId == null) {\n        if (!isClosed) {\n          PageUtils.viewPgcFromUri(response.redirectUrl!, off: true);\n        }\n        return;\n      }\n      videoPlayerServiceHandler?.onVideoDetailChange(\n        response,\n        cid.value,\n        heroTag,\n      );\n      if (videoDetail.value.ugcSeason?.id == response.ugcSeason?.id) {\n        // keep reversed season\n        response.ugcSeason = videoDetail.value.ugcSeason;\n      }\n      if (videoDetail.value.cid == response.cid) {\n        // keep reversed pages\n        response\n          ..pages = videoDetail.value.pages\n          ..isPageReversed = videoDetail.value.isPageReversed;\n      }\n      videoDetail.value = response;\n      try {\n        if (videoDetailCtr.cover.value.isEmpty ||\n            (videoDetailCtr.videoUrl.isNullOrEmpty &&\n                !videoDetailCtr.isQuerying)) {\n          videoDetailCtr.cover.value = response.pic ?? '';\n        }\n        if (videoDetailCtr.showReply) {\n          try {\n            Get.find<VideoReplyController>(tag: heroTag).count.value =\n                response.stat?.reply ?? 0;\n          } catch (_) {}\n        }\n      } catch (_) {}\n      final pages = videoDetail.value.pages;\n      if (pages != null && pages.isNotEmpty && cid.value == 0) {\n        cid.value = pages.first.cid!;\n      }\n      queryUserStat(response.staff);\n    } else {\n      res.toast();\n      status.value = false;\n    }\n\n    if (isLogin) {\n      queryAllStatus();\n      queryFollowStatus();\n    }\n  }\n\n  // 获取up主粉丝数\n  Future<void> queryUserStat(List<Staff>? staff) async {\n    if (staff != null && staff.isNotEmpty) {\n      final res = await Request().get(\n        Api.relations,\n        queryParameters: {'fids': staff.map((item) => item.mid).join(',')},\n      );\n      if (res.data['code'] == 0) {\n        staffRelations.addAll({'status': true, ...?res.data['data']});\n      }\n    } else {\n      final mid = videoDetail.value.owner?.mid;\n      if (mid == null) {\n        return;\n      }\n      final res = await MemberHttp.memberCardInfo(mid: mid);\n      if (res case Success(:final response)) {\n        userStat.value = response;\n      }\n    }\n  }\n\n  Future<void> queryAllStatus() async {\n    final result = await VideoHttp.videoRelation(bvid: bvid);\n    if (result case Success(:final response)) {\n      late final stat = videoDetail.value.stat;\n      if (response.like!) {\n        stat?.like = max(1, stat.like);\n      }\n      if (response.favorite!) {\n        stat?.favorite = max(1, stat.favorite);\n      }\n      hasLike.value = response.like!;\n      hasDislike.value = response.dislike!;\n      coinNum.value = response.coin!;\n      hasFav.value = response.favorite!;\n    }\n  }\n\n  // 一键三连\n  @override\n  Future<void> actionTriple() async {\n    feedBack();\n    if (!isLogin) {\n      SmartDialog.showToast('账号未登录');\n      return;\n    }\n    if (hasLike.value && hasCoin && hasFav.value) {\n      // 已点赞、投币、收藏\n      SmartDialog.showToast('已三连');\n      return;\n    }\n    final result = await VideoHttp.ugcTriple(bvid: bvid);\n    if (result case Success(:final response)) {\n      late final stat = videoDetail.value.stat;\n      if (response.like == true && !hasLike.value) {\n        stat?.like++;\n        hasLike.value = true;\n      }\n      if (response.coin == true && !hasCoin) {\n        stat?.coin += 2;\n        coinNum.value = 2;\n        GlobalData().afterCoin(2);\n      }\n      if (response.fav == true && !hasFav.value) {\n        stat?.favorite++;\n        hasFav.value = true;\n      }\n      hasDislike.value = false;\n      if (!hasCoin) {\n        SmartDialog.showToast('投币失败');\n      } else {\n        SmartDialog.showToast('三连成功');\n      }\n    } else {\n      result.toast();\n    }\n  }\n\n  // （取消）点赞\n  @override\n  Future<void> actionLikeVideo() async {\n    if (!isLogin) {\n      SmartDialog.showToast('账号未登录');\n      return;\n    }\n    if (videoDetail.value.stat == null) {\n      return;\n    }\n    final newVal = !hasLike.value;\n    final result = await VideoHttp.likeVideo(bvid: bvid, type: newVal);\n    if (result case Success(:final response)) {\n      SmartDialog.showToast(newVal ? response : '取消赞');\n      videoDetail.value.stat?.like += newVal ? 1 : -1;\n      hasLike.value = newVal;\n      if (newVal) {\n        hasDislike.value = false;\n      }\n    } else {\n      result.toast();\n    }\n  }\n\n  Future<void> actionDislikeVideo() async {\n    if (!isLogin) {\n      SmartDialog.showToast('账号未登录');\n      return;\n    }\n    final res = await VideoHttp.dislikeVideo(\n      bvid: bvid,\n      type: !hasDislike.value,\n    );\n    if (res.isSuccess) {\n      if (!hasDislike.value) {\n        SmartDialog.showToast('点踩成功');\n        hasDislike.value = true;\n        if (hasLike.value) {\n          videoDetail.value.stat?.like--;\n          hasLike.value = false;\n        }\n      } else {\n        SmartDialog.showToast('取消踩');\n        hasDislike.value = false;\n      }\n    } else {\n      res.toast();\n    }\n  }\n\n  // 投币\n  @override\n  void actionCoinVideo() {\n    if (!isLogin) {\n      SmartDialog.showToast('账号未登录');\n      return;\n    }\n\n    int copyright = videoDetail.value.copyright ?? 1;\n    if ((copyright != 1 && coinNum.value >= 1) || coinNum.value >= 2) {\n      SmartDialog.showToast('达到投币上限啦~');\n      return;\n    }\n\n    if (GlobalData().coins != null && GlobalData().coins! < 1) {\n      SmartDialog.showToast('硬币不足');\n      // return;\n    }\n\n    PayCoinsPage.toPayCoinsPage(\n      onPayCoin: coinVideo,\n      copyright: copyright,\n      hasCoin: coinNum.value == 1,\n    );\n  }\n\n  @override\n  (Object, int) get getFavRidType => (IdUtils.bv2av(bvid), 2);\n\n  @override\n  StatDetail? getStat() => videoDetail.value.stat;\n\n  // 分享视频\n  @override\n  void actionShareVideo(BuildContext context) {\n    final videoDetail = this.videoDetail.value;\n    final playedTimePos = videoDetailCtr.playedTimePos;\n    String videoUrl = '${HttpString.baseUrl}/video/$bvid';\n    showDialog(\n      context: context,\n      builder: (_) => AlertDialog(\n        clipBehavior: Clip.hardEdge,\n        contentPadding: const EdgeInsets.symmetric(vertical: 12),\n        content: Column(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            ListTile(\n              dense: true,\n              title: const Text(\n                '复制链接',\n                style: TextStyle(fontSize: 14),\n              ),\n              onTap: () {\n                Get.back();\n                Utils.copyText(videoUrl);\n              },\n              trailing: playedTimePos.isNotEmpty\n                  ? iconButton(\n                      tooltip: '精确分享',\n                      icon: const Icon(Icons.timer_outlined),\n                      onPressed: () {\n                        Get.back();\n                        Utils.copyText('$videoUrl$playedTimePos');\n                      },\n                    )\n                  : null,\n            ),\n            ListTile(\n              dense: true,\n              title: const Text(\n                '其它app打开',\n                style: TextStyle(fontSize: 14),\n              ),\n              onTap: () {\n                Get.back();\n                PageUtils.launchURL(videoUrl);\n              },\n            ),\n            if (PlatformUtils.isMobile)\n              ListTile(\n                dense: true,\n                title: const Text(\n                  '分享视频',\n                  style: TextStyle(fontSize: 14),\n                ),\n                onTap: () {\n                  Get.back();\n                  Utils.shareText(\n                    '${videoDetail.title} '\n                    'UP主: ${videoDetail.owner!.name!}'\n                    ' - $videoUrl',\n                  );\n                },\n              ),\n            ListTile(\n              dense: true,\n              title: const Text(\n                '分享至动态',\n                style: TextStyle(fontSize: 14),\n              ),\n              onTap: () {\n                Get.back();\n                showModalBottomSheet(\n                  context: context,\n                  isScrollControlled: true,\n                  useSafeArea: true,\n                  builder: (context) => RepostPanel(\n                    rid: videoDetail.aid,\n                    dynType: 8,\n                    pic: videoDetail.pic,\n                    title: videoDetail.title,\n                    uname: videoDetail.owner?.name,\n                  ),\n                );\n              },\n            ),\n            ListTile(\n              dense: true,\n              title: const Text(\n                '分享至消息',\n                style: TextStyle(fontSize: 14),\n              ),\n              onTap: () {\n                Get.back();\n                try {\n                  PageUtils.pmShare(\n                    context,\n                    content: {\n                      \"id\": videoDetail.aid!.toString(),\n                      \"title\": videoDetail.title!,\n                      \"headline\": videoDetail.title!,\n                      \"source\": 5,\n                      \"thumb\": videoDetail.pic!,\n                      \"author\": videoDetail.owner!.name!,\n                      \"author_id\": videoDetail.owner!.mid!.toString(),\n                    },\n                  );\n                } catch (e) {\n                  SmartDialog.showToast(e.toString());\n                }\n              },\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  // 查询关注状态\n  Future<void> queryFollowStatus() async {\n    final videoDetail = this.videoDetail.value;\n    if (videoDetail.owner == null || videoDetail.staff?.isNotEmpty == true) {\n      return;\n    }\n    final res = await UserHttp.hasFollow(videoDetail.owner!.mid!);\n    if (res case Success(:final response)) {\n      if (response['special'] == 1) response['attribute'] = -10;\n      followStatus.value = response;\n    }\n  }\n\n  // 关注/取关up\n  Future<void> actionRelationMod(BuildContext context) async {\n    if (!isLogin) {\n      SmartDialog.showToast('账号未登录');\n      return;\n    }\n    final videoDetail = this.videoDetail.value;\n    if (videoDetail.staff?.isNotEmpty == true) {\n      return;\n    }\n    int? mid = videoDetail.owner?.mid;\n    if (mid == null) {\n      return;\n    }\n    int attr = followStatus['attribute'] ?? 0;\n    if (attr == 128) {\n      final res = await VideoHttp.relationMod(\n        mid: mid,\n        act: 6,\n        reSrc: 11,\n      );\n      if (res.isSuccess) {\n        followStatus['attribute'] = 0;\n      }\n      return;\n    } else {\n      RequestUtils.actionRelationMod(\n        context: context,\n        mid: mid,\n        isFollow: attr != 0,\n        followStatus: followStatus,\n        afterMod: (attribute) {\n          followStatus['attribute'] = attribute;\n          Future.delayed(const Duration(milliseconds: 500), queryFollowStatus);\n        },\n      );\n    }\n  }\n\n  // 修改分P或番剧分集\n  Future<bool> onChangeEpisode(\n    BaseEpisodeItem episode, {\n    bool isStein = false,\n  }) async {\n    try {\n      final String bvid = episode.bvid ?? this.bvid;\n      final int aid = episode.aid ?? IdUtils.bv2av(bvid);\n      final int? cid =\n          episode.cid ?? await SearchHttp.ab2c(aid: aid, bvid: bvid);\n      if (cid == null) {\n        return false;\n      }\n      final String? cover = episode.cover;\n\n      // 重新获取视频资源\n\n      if (videoDetailCtr.isPlayAll) {\n        if (videoDetailCtr.mediaList.indexWhere((item) => item.bvid == bvid) ==\n            -1) {\n          PageUtils.toVideoPage(\n            bvid: bvid,\n            cid: cid,\n            cover: cover,\n          );\n          return false;\n        }\n      }\n\n      videoDetailCtr\n        ..plPlayerController.pause()\n        ..makeHeartBeat()\n        ..updateMediaListHistory(aid)\n        ..onReset(isStein: isStein)\n        ..bvid = bvid\n        ..aid = aid\n        ..cid.value = cid\n        ..queryVideoUrl();\n\n      if (this.bvid != bvid) {\n        reload = true;\n        aiConclusionResult = null;\n\n        if (cover != null && cover.isNotEmpty) {\n          videoDetailCtr.cover.value = cover;\n        }\n\n        // 重新请求相关视频\n        if (videoDetailCtr.plPlayerController.showRelatedVideo) {\n          try {\n            Get.find<RelatedController>(tag: heroTag)\n              ..bvid = bvid\n              ..queryData();\n          } catch (_) {}\n        }\n\n        // 重新请求评论\n        if (videoDetailCtr.showReply) {\n          try {\n            final replyCtr = Get.find<VideoReplyController>(tag: heroTag)\n              ..aid = aid;\n            if (replyCtr.loadingState.value is! Loading) {\n              replyCtr.onReload();\n            }\n          } catch (_) {}\n        }\n\n        hasLater.value = videoDetailCtr.sourceType == SourceType.watchLater;\n        this.bvid = bvid;\n        queryVideoIntro();\n      } else {\n        if (episode is Part) {\n          final videoDetail = this.videoDetail.value;\n          videoPlayerServiceHandler?.onVideoDetailChange(\n            episode,\n            cid,\n            heroTag,\n            artist: videoDetail.owner?.name,\n            cover: videoDetail.pic,\n          );\n        }\n      }\n\n      this.cid.value = cid;\n      queryOnlineTotal();\n      return true;\n    } catch (e) {\n      if (kDebugMode) debugPrint('ugc onChangeEpisode: $e');\n      return false;\n    }\n  }\n\n  @override\n  void onClose() {\n    expandableCtr.dispose();\n    super.onClose();\n  }\n\n  /// 播放上一个\n  @override\n  bool prevPlay([bool skipPart = false]) {\n    final List<BaseEpisodeItem> episodes = <BaseEpisodeItem>[];\n    bool isPart = false;\n\n    final videoDetail = this.videoDetail.value;\n\n    if (!skipPart && (videoDetail.pages?.length ?? 0) > 1) {\n      isPart = true;\n      episodes.addAll(videoDetail.pages!);\n    } else if (videoDetailCtr.isPlayAll) {\n      episodes.addAll(videoDetailCtr.mediaList);\n    } else if (videoDetail.ugcSeason != null) {\n      final UgcSeason ugcSeason = videoDetail.ugcSeason!;\n      final List<SectionItem> sections = ugcSeason.sections!;\n      for (int i = 0; i < sections.length; i++) {\n        final List<EpisodeItem> episodesList = sections[i].episodes!;\n        episodes.addAll(episodesList);\n      }\n    }\n\n    final int currentIndex = episodes.indexWhere(\n      (e) =>\n          e.cid ==\n          (skipPart\n              ? videoDetail.isPageReversed\n                    ? videoDetail.pages!.last.cid\n                    : videoDetail.pages!.first.cid\n              : this.cid.value),\n    );\n\n    int prevIndex = currentIndex - 1;\n    final PlayRepeat playRepeat = videoDetailCtr.plPlayerController.playRepeat;\n\n    // 列表循环\n    if (prevIndex < 0) {\n      if (isPart &&\n          (videoDetailCtr.isPlayAll || videoDetail.ugcSeason != null)) {\n        return prevPlay(true);\n      }\n      if (playRepeat == PlayRepeat.listCycle) {\n        prevIndex = episodes.length - 1;\n      } else {\n        return false;\n      }\n    }\n\n    int? cid = episodes[prevIndex].cid;\n    while (cid == null) {\n      prevIndex--;\n      if (prevIndex < 0) {\n        return false;\n      }\n      cid = episodes[prevIndex].cid;\n    }\n\n    if (cid != this.cid.value) {\n      onChangeEpisode(episodes[prevIndex]);\n      return true;\n    } else {\n      return false;\n    }\n  }\n\n  /// 列表循环或者顺序播放时，自动播放下一个\n  @override\n  bool nextPlay([bool skipPart = false]) {\n    try {\n      final List<BaseEpisodeItem> episodes = <BaseEpisodeItem>[];\n      bool isPart = false;\n      final videoDetail = this.videoDetail.value;\n\n      // part -> playall -> season\n      if (!skipPart && (videoDetail.pages?.length ?? 0) > 1) {\n        isPart = true;\n        final List<Part> pages = videoDetail.pages!;\n        episodes.addAll(pages);\n      } else if (videoDetailCtr.isPlayAll) {\n        episodes.addAll(videoDetailCtr.mediaList);\n      } else if (videoDetail.ugcSeason != null) {\n        final UgcSeason ugcSeason = videoDetail.ugcSeason!;\n        final List<SectionItem> sections = ugcSeason.sections!;\n        for (int i = 0; i < sections.length; i++) {\n          final List<EpisodeItem> episodesList = sections[i].episodes!;\n          episodes.addAll(episodesList);\n        }\n      }\n\n      final PlayRepeat playRepeat =\n          videoDetailCtr.plPlayerController.playRepeat;\n\n      if (episodes.isEmpty) {\n        if (playRepeat == PlayRepeat.listCycle) {\n          videoDetailCtr.plPlayerController.play(repeat: true);\n          return true;\n        }\n        if (playRepeat == PlayRepeat.autoPlayRelated &&\n            videoDetailCtr.plPlayerController.showRelatedVideo) {\n          return playRelated();\n        }\n        return false;\n      }\n\n      final int currentIndex = episodes.indexWhere(\n        (e) =>\n            e.cid ==\n            (skipPart\n                ? videoDetail.isPageReversed\n                      ? videoDetail.pages!.last.cid\n                      : videoDetail.pages!.first.cid\n                : this.cid.value),\n      );\n\n      int nextIndex = currentIndex + 1;\n\n      if (!isPart &&\n          videoDetailCtr.isPlayAll &&\n          currentIndex == episodes.length - 2) {\n        videoDetailCtr.getMediaList();\n      }\n\n      // 列表循环\n      if (nextIndex >= episodes.length) {\n        if (isPart &&\n            (videoDetailCtr.isPlayAll || videoDetail.ugcSeason != null)) {\n          return nextPlay(true);\n        }\n\n        if (playRepeat == PlayRepeat.listCycle) {\n          nextIndex = 0;\n        } else if (playRepeat == PlayRepeat.autoPlayRelated &&\n            videoDetailCtr.plPlayerController.showRelatedVideo) {\n          return playRelated();\n        } else {\n          return false;\n        }\n      }\n\n      int? cid = episodes[nextIndex].cid;\n      while (cid == null) {\n        nextIndex++;\n        if (nextIndex >= episodes.length) {\n          return false;\n        }\n        cid = episodes[nextIndex].cid;\n      }\n\n      if (cid != this.cid.value) {\n        onChangeEpisode(episodes[nextIndex]);\n        return true;\n      } else {\n        return false;\n      }\n    } catch (_) {\n      return false;\n    }\n  }\n\n  bool playRelated() {\n    RelatedController relatedCtr;\n    if (Get.isRegistered<RelatedController>(tag: heroTag)) {\n      relatedCtr = Get.find<RelatedController>(tag: heroTag);\n    } else {\n      relatedCtr = Get.put(RelatedController(autoQuery: false), tag: heroTag)\n        ..queryData().whenComplete(playRelated);\n      return false;\n    }\n\n    if (relatedCtr.loadingState.value case Success(:final response)) {\n      final firstItem = response?.firstOrNull;\n      if (firstItem == null) {\n        SmartDialog.showToast('暂无相关视频，停止连播');\n        return false;\n      }\n      onChangeEpisode(\n        BaseEpisodeItem(\n          aid: firstItem.aid,\n          bvid: firstItem.bvid,\n          cid: firstItem.cid,\n          cover: firstItem.cover,\n        ),\n      );\n      return true;\n    }\n\n    return false;\n  }\n\n  // ai总结\n  static Future<AiConclusionResult?> getAiConclusion(\n    String bvid,\n    int cid,\n    int? mid,\n  ) async {\n    if (!Accounts.heartbeat.isLogin) {\n      SmartDialog.showToast(\"账号未登录\");\n      return null;\n    }\n    SmartDialog.showLoading(msg: '正在获取AI总结');\n    final res = await VideoHttp.aiConclusion(\n      bvid: bvid,\n      cid: cid,\n      upMid: mid,\n    );\n    SmartDialog.dismiss();\n    if (res case Success(:final response)) {\n      return response.modelResult;\n    } else if (res is Error && res.code == 1) {\n      SmartDialog.showToast(\"AI处理中，请稍后再试\");\n    } else {\n      SmartDialog.showToast(\"当前视频暂不支持AI视频总结\");\n    }\n    return null;\n  }\n\n  Future<void> aiConclusion() async {\n    aiConclusionResult = await getAiConclusion(\n      bvid,\n      cid.value,\n      videoDetail.value.owner?.mid,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/introduction/ugc/view.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/common/widgets/flutter/selectable_text/selection_area.dart';\nimport 'package:PiliPlus/common/widgets/flutter/selectable_text/text.dart';\nimport 'package:PiliPlus/common/widgets/gesture/tap_gesture_recognizer.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/pendant_avatar.dart';\nimport 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/common/widgets/stat/stat.dart';\nimport 'package:PiliPlus/http/sponsor_block.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models/common/stat_type.dart';\nimport 'package:PiliPlus/models_new/video/video_ai_conclusion/model_result.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/data.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/staff.dart';\nimport 'package:PiliPlus/models_new/video/video_tag/data.dart';\nimport 'package:PiliPlus/pages/mine/controller.dart';\nimport 'package:PiliPlus/pages/search/widgets/search_text.dart';\nimport 'package:PiliPlus/pages/video/controller.dart';\nimport 'package:PiliPlus/pages/video/introduction/ugc/controller.dart';\nimport 'package:PiliPlus/pages/video/introduction/ugc/widgets/action_item.dart';\nimport 'package:PiliPlus/pages/video/introduction/ugc/widgets/page.dart';\nimport 'package:PiliPlus/pages/video/introduction/ugc/widgets/season.dart';\nimport 'package:PiliPlus/utils/app_scheme.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/duration_utils.dart';\nimport 'package:PiliPlus/utils/extension/get_ext.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/extension/string_ext.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/feed_back.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/request_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:expandable/expandable.dart';\nimport 'package:flutter/material.dart' hide SelectionArea;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:font_awesome_flutter/font_awesome_flutter.dart';\nimport 'package:get/get.dart';\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\n\nclass UgcIntroPanel extends StatefulWidget {\n  const UgcIntroPanel({\n    super.key,\n    required this.heroTag,\n    required this.showAiBottomSheet,\n    required this.showEpisodes,\n    required this.onShowMemberPage,\n    required this.isPortrait,\n    required this.isHorizontal,\n  });\n  final String heroTag;\n  final Function showAiBottomSheet;\n  final Function showEpisodes;\n  final ValueChanged<int?> onShowMemberPage;\n  final bool isPortrait;\n  final bool isHorizontal;\n\n  @override\n  State<UgcIntroPanel> createState() => _UgcIntroPanelState();\n}\n\nclass _UgcIntroPanelState extends State<UgcIntroPanel> {\n  late final UgcIntroController introController;\n  late final VideoDetailController videoDetailCtr =\n      Get.find<VideoDetailController>(tag: widget.heroTag);\n\n  @override\n  void initState() {\n    super.initState();\n    introController = Get.putOrFind(\n      UgcIntroController.new,\n      tag: widget.heroTag,\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final ThemeData theme = Theme.of(context);\n    const expandTheme = ExpandableThemeData(\n      animationDuration: Duration(milliseconds: 300),\n      scrollAnimationDuration: Duration(milliseconds: 300),\n      crossFadePoint: 0,\n      fadeCurve: Curves.ease,\n      sizeCurve: Curves.linear,\n    );\n    final isPortrait = widget.isPortrait;\n    final isHorizontal = !isPortrait && widget.isHorizontal;\n    return SliverPadding(\n      padding: const EdgeInsets.only(\n        left: StyleString.safeSpace,\n        right: StyleString.safeSpace,\n        top: 10,\n      ),\n      sliver: Obx(\n        () {\n          VideoDetailData videoDetail = introController.videoDetail.value;\n          bool isLoading = videoDetail.bvid == null;\n          int? mid = videoDetail.owner?.mid;\n          return SliverToBoxAdapter(\n            child: GestureDetector(\n              behavior: HitTestBehavior.opaque,\n              onTap: () {\n                if (isLoading) {\n                  return;\n                }\n                feedBack();\n                introController.expandableCtr.toggle();\n              },\n              child: Column(\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  GestureDetector(\n                    behavior: HitTestBehavior.opaque,\n                    onTap: () {},\n                    child: Row(\n                      children: [\n                        if (videoDetail.staff.isNullOrEmpty) ...[\n                          Expanded(\n                            child: Align(\n                              alignment: Alignment.centerLeft,\n                              child: _buildAvatar(\n                                theme,\n                                () {\n                                  if (mid != null) {\n                                    feedBack();\n                                    if (!isPortrait &&\n                                        introController.horizontalMemberPage) {\n                                      widget.onShowMemberPage(mid);\n                                    } else {\n                                      Get.toNamed(\n                                        '/member?mid=$mid&from_view_aid=${videoDetailCtr.aid}',\n                                      );\n                                    }\n                                  }\n                                },\n                              ),\n                            ),\n                          ),\n                          followButton(context, theme),\n                        ] else\n                          Expanded(\n                            child: SingleChildScrollView(\n                              scrollDirection: Axis.horizontal,\n                              physics: ReloadScrollPhysics(\n                                controller: introController,\n                              ),\n                              child: Row(\n                                spacing: 25,\n                                children: videoDetail.staff!\n                                    .map(\n                                      (e) => _buildStaff(\n                                        theme,\n                                        isPortrait,\n                                        mid,\n                                        e,\n                                      ),\n                                    )\n                                    .toList(),\n                              ),\n                            ),\n                          ),\n                        if (isHorizontal) ...[\n                          const SizedBox(width: 10),\n                          Expanded(\n                            child: actionGrid(\n                              context,\n                              isLoading,\n                              videoDetail,\n                              introController,\n                            ),\n                          ),\n                        ],\n                      ],\n                    ),\n                  ),\n                  const SizedBox(height: 8),\n                  if (isLoading)\n                    _buildVideoTitle(theme, videoDetail)\n                  else if (isHorizontal && PlatformUtils.isDesktop)\n                    SelectionArea(\n                      child: _buildVideoTitle(\n                        theme,\n                        videoDetail,\n                        isExpand: true,\n                      ),\n                    )\n                  else\n                    ExpandablePanel(\n                      controller: introController.expandableCtr,\n                      collapsed: _buildTitle(theme, videoDetail),\n                      expanded: _buildTitle(theme, videoDetail, isExpand: true),\n                      theme: expandTheme,\n                    ),\n                  const SizedBox(height: 8),\n                  Stack(\n                    clipBehavior: Clip.none,\n                    children: [\n                      _buildInfo(theme, videoDetail),\n                      if (introController.enableAi) _aiBtn,\n                    ],\n                  ),\n                  if (introController.showArgueMsg &&\n                      videoDetail.argueInfo?.argueMsg?.isNotEmpty == true) ...[\n                    const SizedBox(height: 2),\n                    Text.rich(\n                      TextSpan(\n                        children: [\n                          WidgetSpan(\n                            alignment: PlaceholderAlignment.middle,\n                            child: Padding(\n                              padding: const .only(right: 2),\n                              child: Icon(\n                                size: 13,\n                                Icons.error_outline,\n                                color: theme.colorScheme.outline,\n                              ),\n                            ),\n                          ),\n                          TextSpan(\n                            text: '${videoDetail.argueInfo!.argueMsg}',\n                          ),\n                        ],\n                      ),\n                      style: TextStyle(\n                        fontSize: 12,\n                        color: theme.colorScheme.outline,\n                      ),\n                    ),\n                  ],\n                  if (isHorizontal && PlatformUtils.isDesktop)\n                    ..._infos(theme, videoDetail)\n                  else\n                    ExpandablePanel(\n                      controller: introController.expandableCtr,\n                      collapsed: const SizedBox.shrink(),\n                      expanded: Column(\n                        mainAxisSize: MainAxisSize.min,\n                        crossAxisAlignment: CrossAxisAlignment.start,\n                        children: _infos(theme, videoDetail),\n                      ),\n                      theme: expandTheme,\n                    ),\n                  Obx(\n                    () => introController.status.value\n                        ? const SizedBox.shrink()\n                        : Center(\n                            child: TextButton.icon(\n                              icon: const Icon(Icons.refresh),\n                              onPressed: () {\n                                introController\n                                  ..status.value = true\n                                  ..queryVideoIntro();\n                                if (videoDetailCtr.videoUrl.isNullOrEmpty &&\n                                    !videoDetailCtr.isQuerying) {\n                                  videoDetailCtr.queryVideoUrl();\n                                }\n                              },\n                              label: const Text(\"点此重新加载\"),\n                            ),\n                          ),\n                  ),\n                  // 点赞收藏转发 布局样式2\n                  if (!isHorizontal) ...[\n                    const SizedBox(height: 8),\n                    actionGrid(\n                      context,\n                      isLoading,\n                      videoDetail,\n                      introController,\n                    ),\n                  ],\n                  // 合集\n                  if (!isLoading &&\n                      videoDetail.ugcSeason != null &&\n                      (isPortrait ||\n                          !videoDetailCtr\n                              .plPlayerController\n                              .horizontalSeasonPanel))\n                    Obx(\n                      () => SeasonPanel(\n                        key: ValueKey(introController.videoDetail.value),\n                        heroTag: widget.heroTag,\n                        showEpisodes: widget.showEpisodes,\n                        ugcIntroController: introController,\n                      ),\n                    ),\n                  if (!isLoading &&\n                      videoDetail.pages != null &&\n                      videoDetail.pages!.length > 1 &&\n                      (isPortrait ||\n                          !videoDetailCtr\n                              .plPlayerController\n                              .horizontalSeasonPanel))\n                    Obx(\n                      () => PagesPanel(\n                        key: ValueKey(introController.videoDetail.value),\n                        heroTag: widget.heroTag,\n                        ugcIntroController: introController,\n                        bvid: introController.bvid,\n                        showEpisodes: widget.showEpisodes,\n                      ),\n                    ),\n                ],\n              ),\n            ),\n          );\n        },\n      ),\n    );\n  }\n\n  Widget _buildTitle(\n    ThemeData theme,\n    VideoDetailData videoDetail, {\n    bool isExpand = false,\n  }) => GestureDetector(\n    onLongPress: () {\n      Feedback.forLongPress(context);\n      Utils.copyText(videoDetail.title ?? '');\n    },\n    child: _buildVideoTitle(\n      theme,\n      videoDetail,\n      isExpand: isExpand,\n    ),\n  );\n\n  List<Widget> _infos(ThemeData theme, VideoDetailData videoDetail) => [\n    const SizedBox(height: 8),\n    GestureDetector(\n      onTap: () => Utils.copyText('${videoDetail.bvid}'),\n      child: Text(\n        videoDetail.bvid ?? '',\n        style: TextStyle(\n          fontSize: 14,\n          color: theme.colorScheme.secondary,\n        ),\n      ),\n    ),\n    if (videoDetail.descV2?.isNotEmpty == true) ...[\n      const SizedBox(height: 8),\n      selectableRichText(\n        style: const TextStyle(height: 1.4),\n        buildContent(theme, videoDetail),\n      ),\n    ],\n    Obx(() {\n      final videoTags = introController.videoTags.value;\n      if (videoTags == null || videoTags.isEmpty) {\n        return const SizedBox.shrink();\n      }\n      return _buildTags(videoTags);\n    }),\n  ];\n\n  WidgetSpan _labelWidget(String text, Color bgColor, Color textColor) {\n    return WidgetSpan(\n      alignment: PlaceholderAlignment.middle,\n      child: Container(\n        padding: const EdgeInsets.symmetric(\n          horizontal: 4,\n          vertical: 3,\n        ),\n        decoration: BoxDecoration(\n          color: bgColor,\n          borderRadius: const BorderRadius.all(Radius.circular(4)),\n        ),\n        child: Text(\n          text,\n          textScaler: TextScaler.noScaling,\n          strutStyle: const StrutStyle(\n            leading: 0,\n            height: 1,\n            fontSize: 12,\n          ),\n          style: TextStyle(\n            height: 1,\n            fontSize: 12,\n            fontWeight: FontWeight.bold,\n            color: textColor,\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget _buildVideoTitle(\n    ThemeData theme,\n    VideoDetailData videoDetail, {\n    bool isExpand = false,\n  }) {\n    late final isDark = theme.brightness == Brightness.dark;\n    Widget child() {\n      final videoLabel = videoDetailCtr.videoLabel.value;\n      return Text.rich(\n        TextSpan(\n          children: [\n            if (videoLabel.isNotEmpty) ...[\n              WidgetSpan(\n                alignment: PlaceholderAlignment.middle,\n                child: Container(\n                  padding: const EdgeInsets.symmetric(\n                    horizontal: 4,\n                    vertical: 2,\n                  ),\n                  decoration: BoxDecoration(\n                    color: theme.colorScheme.secondaryContainer,\n                    borderRadius: const BorderRadius.all(Radius.circular(4)),\n                  ),\n                  child: Row(\n                    mainAxisSize: MainAxisSize.min,\n                    children: [\n                      Stack(\n                        clipBehavior: Clip.none,\n                        alignment: Alignment.center,\n                        children: [\n                          Icon(\n                            Icons.shield_outlined,\n                            size: 16,\n                            color: theme.colorScheme.onSecondaryContainer,\n                          ),\n                          Icon(\n                            Icons.play_arrow_rounded,\n                            size: 12,\n                            color: theme.colorScheme.onSecondaryContainer,\n                          ),\n                        ],\n                      ),\n                      Text(\n                        videoLabel,\n                        textScaler: TextScaler.noScaling,\n                        strutStyle: const StrutStyle(\n                          leading: 0,\n                          height: 1,\n                          fontSize: 13,\n                        ),\n                        style: TextStyle(\n                          height: 1,\n                          fontSize: 13,\n                          color: theme.colorScheme.onSecondaryContainer,\n                        ),\n                      ),\n                    ],\n                  ),\n                ),\n              ),\n              const TextSpan(text: ' '),\n            ],\n            if (videoDetail.isUpowerExclusive == true) ...[\n              _labelWidget(\n                '充电专属',\n                isDark\n                    ? theme.colorScheme.error\n                    : theme.colorScheme.errorContainer,\n                isDark\n                    ? theme.colorScheme.onError\n                    : theme.colorScheme.onErrorContainer,\n              ),\n              const TextSpan(text: ' '),\n            ] else if (videoDetail.rights?.isSteinGate == 1) ...[\n              _labelWidget(\n                '互动视频',\n                theme.colorScheme.secondaryContainer,\n                theme.colorScheme.onSecondaryContainer,\n              ),\n              const TextSpan(text: ' '),\n            ],\n            TextSpan(text: videoDetail.title ?? ''),\n          ],\n        ),\n        maxLines: isExpand ? null : 2,\n        overflow: isExpand ? null : TextOverflow.ellipsis,\n        style: const TextStyle(fontSize: 16),\n      );\n    }\n\n    if (videoDetailCtr.plPlayerController.enableSponsorBlock) {\n      return Obx(child);\n    }\n    return child();\n  }\n\n  Widget followButton(BuildContext context, ThemeData t) {\n    return Obx(\n      () {\n        int attr = introController.followStatus['attribute'] ?? 0;\n        return TextButton(\n          onPressed: () => introController.actionRelationMod(context),\n          style: TextButton.styleFrom(\n            tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n            visualDensity: const VisualDensity(vertical: -2.8),\n            foregroundColor: attr != 0\n                ? t.colorScheme.outline\n                : t.colorScheme.onSecondaryContainer,\n            backgroundColor: attr != 0\n                ? t.colorScheme.onInverseSurface\n                : t.colorScheme.secondaryContainer,\n          ),\n          child: Text(\n            switch (attr) {\n              1 => '悄悄关注',\n              2 => '已关注',\n              4 || 6 => '已互关',\n              128 => '已拉黑',\n              -10 => '特别关注',\n              _ => ' 关注 ',\n            },\n            style: const TextStyle(fontSize: 13),\n          ),\n        );\n      },\n    );\n  }\n\n  Widget actionGrid(\n    BuildContext context,\n    bool isLoading,\n    VideoDetailData videoDetail,\n    UgcIntroController introController,\n  ) {\n    return SizedBox(\n      height: 48,\n      child: Row(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          Obx(\n            () => ActionItem(\n              animation: introController.tripleAnimation,\n              icon: const Icon(FontAwesomeIcons.thumbsUp),\n              selectIcon: const Icon(FontAwesomeIcons.solidThumbsUp),\n              selectStatus: introController.hasLike.value,\n              semanticsLabel: '点赞',\n              text: !isLoading\n                  ? NumUtils.numFormat(videoDetail.stat!.like)\n                  : null,\n              onStartTriple: introController.onStartTriple,\n              onCancelTriple: introController.onCancelTriple,\n            ),\n          ),\n          Obx(\n            () => ActionItem(\n              icon: const Icon(FontAwesomeIcons.thumbsDown),\n              selectIcon: const Icon(FontAwesomeIcons.solidThumbsDown),\n              onTap: () => introController.handleAction(\n                introController.actionDislikeVideo,\n              ),\n              selectStatus: introController.hasDislike.value,\n              semanticsLabel: '点踩',\n              text: \"点踩\",\n            ),\n          ),\n          Obx(\n            () => ActionItem(\n              animation: introController.tripleAnimation,\n              icon: const Icon(FontAwesomeIcons.b),\n              selectIcon: const Icon(FontAwesomeIcons.b),\n              onTap: introController.actionCoinVideo,\n              selectStatus: introController.hasCoin,\n              semanticsLabel: '投币',\n              text: !isLoading\n                  ? NumUtils.numFormat(videoDetail.stat!.coin)\n                  : null,\n            ),\n          ),\n          Obx(\n            () => ActionItem(\n              animation: introController.tripleAnimation,\n              icon: const Icon(FontAwesomeIcons.star),\n              selectIcon: const Icon(FontAwesomeIcons.solidStar),\n              onTap: () => introController.showFavBottomSheet(context),\n              onLongPress: () => introController.showFavBottomSheet(\n                context,\n                isLongPress: true,\n              ),\n              selectStatus: introController.hasFav.value,\n              semanticsLabel: '收藏',\n              text: !isLoading\n                  ? NumUtils.numFormat(videoDetail.stat!.favorite)\n                  : null,\n            ),\n          ),\n          Obx(\n            () => ActionItem(\n              icon: const Icon(FontAwesomeIcons.clock),\n              selectIcon: const Icon(FontAwesomeIcons.solidClock),\n              onTap: () =>\n                  introController.handleAction(introController.viewLater),\n              selectStatus: introController.hasLater.value,\n              semanticsLabel: '再看',\n              text: '再看',\n            ),\n          ),\n          ActionItem(\n            icon: const Icon(FontAwesomeIcons.shareFromSquare),\n            onTap: () => introController.actionShareVideo(context),\n            selectStatus: false,\n            semanticsLabel: '分享',\n            text: !isLoading\n                ? NumUtils.numFormat(videoDetail.stat!.share!)\n                : null,\n          ),\n        ],\n      ),\n    );\n  }\n\n  static final RegExp urlRegExp = RegExp(\n    Constants.urlRegex.pattern + r'|av\\d+|bv[a-z\\d]{10}|(?:\\d+[:：])?\\d+[:：]\\d+',\n    caseSensitive: false,\n  );\n\n  static final youtubeRegExp = RegExp(\n    r'(?:youtube\\.com\\/(?:[^\\/\\n\\s]+\\/\\S+\\/|(?:v|e(?:mbed)?)\\/|\\S*?[?&]v=)|youtu\\.be\\/)([a-z0-9_\\-]{11})',\n    caseSensitive: false,\n  );\n\n  TextSpan buildContent(ThemeData theme, VideoDetailData content) {\n    if (content.descV2.isNullOrEmpty) {\n      return const TextSpan();\n    }\n    // type\n    // 1 普通文本\n    // 2 @用户\n    final List<TextSpan> spanChildren = content.descV2!.map((currentDesc) {\n      switch (currentDesc.type) {\n        case 1:\n          final List<InlineSpan> spanChildren = <InlineSpan>[];\n          currentDesc.rawText?.splitMapJoin(\n            urlRegExp,\n            onMatch: (Match match) {\n              final matchStr = match[0]!;\n              final matchStrLowerCase = matchStr.toLowerCase();\n              if (matchStrLowerCase.startsWith('http')) {\n                spanChildren.add(\n                  TextSpan(\n                    text: matchStr,\n                    style: TextStyle(color: theme.colorScheme.primary),\n                    recognizer: NoDeadlineTapGestureRecognizer()\n                      ..onTap = () async {\n                        if (videoDetailCtr\n                            .plPlayerController\n                            .enableSponsorBlock) {\n                          final duration =\n                              videoDetailCtr.data.timeLength ??\n                              videoDetailCtr\n                                  .plPlayerController\n                                  .duration\n                                  .value\n                                  .inMilliseconds;\n                          if (duration > 0) {\n                            final ytbId = youtubeRegExp\n                                .firstMatch(matchStr)\n                                ?.group(1);\n                            if (ytbId != null) {\n                              final bvid = videoDetailCtr.bvid;\n                              final cid = videoDetailCtr.cid.value;\n\n                              SmartDialog.showLoading();\n                              final hasPortVideo =\n                                  (await SponsorBlock.getPortVideo(\n                                    bvid: bvid,\n                                    cid: cid,\n                                  )).dataOrNull ==\n                                  ytbId;\n                              SmartDialog.dismiss();\n\n                              if (!mounted) return;\n                              final confirmed = await showConfirmDialog(\n                                context: context,\n                                title: '空降助手：搬运视频同步',\n                                content:\n                                    '${hasPortVideo ? \"\" : \"是否将\"}该视频${hasPortVideo ? \"已\" : \"\"}绑定到此YouTube视频($ytbId)',\n                              );\n                              if (!hasPortVideo && confirmed) {\n                                final res = await SponsorBlock.postPortVideo(\n                                  bvid: bvid,\n                                  cid: cid,\n                                  ytbId: ytbId,\n                                  videoDuration: (duration / 1000).round(),\n                                );\n                                SmartDialog.showToast(\n                                  '提交搬运视频${res.isSuccess ? \"成功\" : \"失败: $res\"}',\n                                );\n                                return;\n                              }\n                            }\n                          }\n                        }\n                        PageUtils.handleWebview(matchStr);\n                      },\n                  ),\n                );\n              } else if (matchStrLowerCase.startsWith('av')) {\n                try {\n                  int aid = int.parse(matchStr.substring(2));\n                  IdUtils.av2bv(aid);\n                  spanChildren.add(\n                    TextSpan(\n                      text: matchStr,\n                      style: TextStyle(color: theme.colorScheme.primary),\n                      recognizer: NoDeadlineTapGestureRecognizer()\n                        ..onTap = () => PiliScheme.videoPush(aid, null),\n                    ),\n                  );\n                } catch (e) {\n                  spanChildren.add(TextSpan(text: matchStr));\n                }\n              } else if (matchStrLowerCase.startsWith('bv')) {\n                try {\n                  IdUtils.bv2av(matchStr);\n                  spanChildren.add(\n                    TextSpan(\n                      text: matchStr,\n                      style: TextStyle(color: theme.colorScheme.primary),\n                      recognizer: NoDeadlineTapGestureRecognizer()\n                        ..onTap = () => PiliScheme.videoPush(null, matchStr),\n                    ),\n                  );\n                } catch (e) {\n                  spanChildren.add(TextSpan(text: matchStr));\n                }\n              } else {\n                spanChildren.add(\n                  TextSpan(\n                    text: matchStr,\n                    style: TextStyle(color: theme.colorScheme.primary),\n                    recognizer: NoDeadlineTapGestureRecognizer()\n                      ..onTap = () {\n                        try {\n                          Get.find<VideoDetailController>(\n                            tag: widget.heroTag,\n                          ).plPlayerController.seekTo(\n                            Duration(\n                              seconds: DurationUtils.parseDuration(matchStr),\n                            ),\n                            isSeek: false,\n                          );\n                        } catch (_) {}\n                      },\n                  ),\n                );\n              }\n              return '';\n            },\n            onNonMatch: (String nonMatchStr) {\n              spanChildren.add(TextSpan(text: nonMatchStr));\n              return '';\n            },\n          );\n          return TextSpan(children: spanChildren);\n        case 2:\n          final Color colorSchemePrimary = theme.colorScheme.primary;\n          return TextSpan(\n            text: '@${currentDesc.rawText}',\n            style: TextStyle(color: colorSchemePrimary),\n            recognizer: NoDeadlineTapGestureRecognizer()\n              ..onTap = () => Get.toNamed('/member?mid=${currentDesc.bizId}'),\n          );\n        default:\n          return const TextSpan();\n      }\n    }).toList();\n    return TextSpan(children: spanChildren);\n  }\n\n  Widget _buildStaff(\n    ThemeData theme,\n    bool isPortrait,\n    int? ownerMid,\n    Staff item,\n  ) {\n    void onTap() => Get.toNamed(\n      '/member?mid=${item.mid}&from_view_aid=${videoDetailCtr.aid}',\n    );\n    return GestureDetector(\n      behavior: HitTestBehavior.opaque,\n      onTap: () {\n        if (item.mid == ownerMid &&\n            !isPortrait &&\n            introController.horizontalMemberPage) {\n          widget.onShowMemberPage(ownerMid);\n        } else {\n          onTap();\n        }\n      },\n      onSecondaryTap:\n          PlatformUtils.isDesktop && introController.horizontalMemberPage\n          ? onTap\n          : null,\n      child: Row(\n        children: [\n          Stack(\n            clipBehavior: Clip.none,\n            children: [\n              NetworkImgLayer(\n                type: ImageType.avatar,\n                src: item.face,\n                width: 35,\n                height: 35,\n                fadeInDuration: Duration.zero,\n                fadeOutDuration: Duration.zero,\n              ),\n              if ((item.official?.type ?? -1) != -1)\n                Positioned(\n                  right: -2,\n                  bottom: -2,\n                  child: DecoratedBox(\n                    decoration: BoxDecoration(\n                      shape: BoxShape.circle,\n                      color: theme.colorScheme.surface,\n                    ),\n                    child: Icon(\n                      Icons.offline_bolt,\n                      color: item.official?.type == 0\n                          ? const Color(0xFFFFCC00)\n                          : Colors.lightBlueAccent,\n                      size: 14,\n                    ),\n                  ),\n                ),\n              Positioned(\n                top: 0,\n                right: -6,\n                child: Obx(\n                  () =>\n                      introController.staffRelations['status'] == true &&\n                          introController.staffRelations['${item.mid}'] == null\n                      ? Material(\n                          type: MaterialType.transparency,\n                          shape: const CircleBorder(),\n                          child: InkWell(\n                            customBorder: const CircleBorder(),\n                            onTap: () => RequestUtils.actionRelationMod(\n                              context: context,\n                              mid: item.mid,\n                              isFollow: false,\n                              afterMod: (val) {\n                                introController.staffRelations['${item.mid}'] =\n                                    true;\n                              },\n                            ),\n                            child: Ink(\n                              padding: const EdgeInsets.all(2),\n                              decoration: BoxDecoration(\n                                color: theme.colorScheme.secondaryContainer,\n                                shape: BoxShape.circle,\n                              ),\n                              child: Icon(\n                                MdiIcons.plus,\n                                size: 16,\n                                color: theme.colorScheme.onSecondaryContainer,\n                              ),\n                            ),\n                          ),\n                        )\n                      : const SizedBox.shrink(),\n                ),\n              ),\n            ],\n          ),\n          const SizedBox(width: 8),\n          Column(\n            mainAxisSize: MainAxisSize.min,\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              Text(\n                item.name!,\n                maxLines: 1,\n                overflow: TextOverflow.ellipsis,\n                style: TextStyle(\n                  fontSize: 13,\n                  color: (item.vip?.status ?? 0) > 0 && item.vip?.type == 2\n                      ? theme.colorScheme.vipColor\n                      : null,\n                ),\n              ),\n              Text(\n                item.title!,\n                style: TextStyle(\n                  fontSize: 12,\n                  color: theme.colorScheme.outline,\n                ),\n              ),\n            ],\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget _buildAvatar(\n    ThemeData theme,\n    VoidCallback onPushMember,\n  ) => GestureDetector(\n    onTap: onPushMember,\n    behavior: HitTestBehavior.opaque,\n    onSecondaryTap:\n        PlatformUtils.isDesktop && introController.horizontalMemberPage\n        ? () => Get.toNamed(\n            '/member?mid=${introController.userStat.value.card?.mid}&from_view_aid=${videoDetailCtr.aid}',\n          )\n        : null,\n    child: Obx(\n      () {\n        final userStat = introController.userStat.value;\n        final isVip = (userStat.card?.vip?.status ?? 0) > 0;\n        return Row(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            PendantAvatar(\n              avatar: userStat.card?.face,\n              size: 35,\n              badgeSize: 14,\n              isVip: isVip,\n              officialType: userStat.card?.official?.type,\n            ),\n            const SizedBox(width: 10),\n            Column(\n              crossAxisAlignment: CrossAxisAlignment.start,\n              children: [\n                Text(\n                  userStat.card?.name ?? \"\",\n                  maxLines: 1,\n                  overflow: TextOverflow.ellipsis,\n                  style: TextStyle(\n                    fontSize: 13,\n                    color: isVip && userStat.card?.vip?.type == 2\n                        ? theme.colorScheme.vipColor\n                        : null,\n                  ),\n                ),\n                const SizedBox(height: 0),\n                Text(\n                  '${NumUtils.numFormat(userStat.follower)}粉丝    ${'${NumUtils.numFormat(userStat.archiveCount)}视频'}',\n                  style: TextStyle(\n                    fontSize: 12,\n                    color: theme.colorScheme.outline,\n                  ),\n                ),\n              ],\n            ),\n          ],\n        );\n      },\n    ),\n  );\n\n  Widget _buildInfo(ThemeData theme, VideoDetailData videoDetail) => Row(\n    spacing: 10,\n    children: [\n      StatWidget(\n        type: StatType.play,\n        value: videoDetail.stat?.view,\n        color: theme.colorScheme.outline,\n      ),\n      StatWidget(\n        type: StatType.danmaku,\n        value: videoDetail.stat?.danmaku,\n        color: theme.colorScheme.outline,\n      ),\n      Text(\n        DateFormatUtils.format(videoDetail.pubdate),\n        style: TextStyle(\n          fontSize: 12,\n          color: theme.colorScheme.outline,\n        ),\n      ),\n      if (MineController.anonymity.value)\n        Icon(\n          MdiIcons.incognito,\n          size: 15,\n          color: theme.colorScheme.outline,\n          semanticLabel: '无痕',\n        ),\n      if (introController.isShowOnlineTotal)\n        Obx(\n          () => Text(\n            '${introController.total.value}人在看',\n            style: TextStyle(\n              fontSize: 12,\n              color: theme.colorScheme.outline,\n            ),\n          ),\n        ),\n    ],\n  );\n\n  Widget get _aiBtn => Positioned(\n    right: 8,\n    child: Center(\n      child: GestureDetector(\n        behavior: HitTestBehavior.opaque,\n        onTap: () async {\n          if (introController.aiConclusionResult == null) {\n            await introController.aiConclusion();\n          }\n          if (introController.aiConclusionResult case AiConclusionResult(\n            :final summary,\n            :final outline,\n          )) {\n            if (summary?.isNotEmpty == true || outline?.isNotEmpty == true) {\n              widget.showAiBottomSheet();\n            } else {\n              SmartDialog.showToast(\"当前视频不支持AI视频总结\");\n            }\n          }\n        },\n        child: Image.asset(\n          semanticLabel: 'AI总结',\n          'assets/images/ai.png',\n          height: 18,\n          width: 18,\n          cacheHeight: 18.cacheSize(context),\n        ),\n      ),\n    ),\n  );\n\n  Widget _buildTags(List<VideoTagItem> tags) {\n    return GestureDetector(\n      onTap: () {},\n      behavior: HitTestBehavior.opaque,\n      child: Container(\n        width: double.infinity,\n        padding: const EdgeInsets.only(top: 8),\n        child: Wrap(\n          spacing: 8,\n          runSpacing: 8,\n          children: tags\n              .map(\n                (item) => SearchText(\n                  fontSize: 13,\n                  text: switch (item.tagType) {\n                    'bgm' => item.tagName!.replaceFirst('发现', '♫ BGM：'),\n                    'topic' => '#${item.tagName}',\n                    _ => item.tagName!,\n                  },\n                  onTap: switch (item.tagType) {\n                    'bgm' => (_) => Get.toNamed(\n                      '/musicDetail',\n                      parameters: {'musicId': item.musicId!},\n                    ),\n                    'topic' => (_) => Get.toNamed(\n                      '/dynTopic',\n                      parameters: {'id': item.tagId!.toString()},\n                    ),\n                    _ => (tagName) => Get.toNamed(\n                      '/searchResult',\n                      parameters: {'keyword': tagName},\n                    ),\n                  },\n                  onLongPress: Utils.copyText,\n                ),\n              )\n              .toList(),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/introduction/ugc/widgets/action_item.dart",
    "content": "import 'package:PiliPlus/common/widgets/custom_arc.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart';\n\nclass ActionItem extends StatelessWidget {\n  const ActionItem({\n    super.key,\n    required this.icon,\n    this.selectIcon,\n    this.onTap,\n    this.onLongPress,\n    this.text,\n    this.selectStatus = false,\n    required this.semanticsLabel,\n    this.expand = true,\n    this.animation,\n    this.onStartTriple,\n    this.onCancelTriple,\n  }) : assert(!selectStatus || selectIcon != null),\n       _isThumbsUp = onStartTriple != null;\n\n  final Icon icon;\n  final Icon? selectIcon;\n  final VoidCallback? onTap;\n  final VoidCallback? onLongPress;\n  final String? text;\n  final bool selectStatus;\n  final String semanticsLabel;\n  final bool expand;\n  final Animation<double>? animation;\n  final VoidCallback? onStartTriple;\n  final void Function([bool])? onCancelTriple;\n  final bool _isThumbsUp;\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    final colorScheme = theme.colorScheme;\n    late final primary = !expand && colorScheme.isLight\n        ? colorScheme.inversePrimary\n        : colorScheme.primary;\n    Widget child = Icon(\n      selectStatus ? selectIcon!.icon! : icon.icon,\n      size: 18,\n      color: selectStatus ? primary : icon.color ?? colorScheme.outline,\n    );\n\n    if (animation != null) {\n      child = Stack(\n        clipBehavior: Clip.none,\n        alignment: Alignment.center,\n        children: [\n          AnimatedBuilder(\n            animation: animation!,\n            builder: (context, child) => Arc(\n              size: 28,\n              color: primary,\n              progress: -animation!.value,\n            ),\n          ),\n          child,\n        ],\n      );\n    } else {\n      child = SizedBox.square(dimension: 28, child: child);\n    }\n\n    child = Material(\n      type: .transparency,\n      child: InkWell(\n        borderRadius: const BorderRadius.all(Radius.circular(6)),\n        onTap: _isThumbsUp ? null : onTap,\n        onLongPress: _isThumbsUp ? null : onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile || _isThumbsUp\n            ? null\n            : onLongPress,\n        onTapDown: _isThumbsUp ? (_) => onStartTriple!() : null,\n        onTapUp: _isThumbsUp ? (_) => onCancelTriple!(true) : null,\n        onTapCancel: _isThumbsUp ? onCancelTriple : null,\n        child: expand\n            ? Column(\n                mainAxisAlignment: MainAxisAlignment.center,\n                children: [child, _buildText(theme)],\n              )\n            : child,\n      ),\n    );\n    return expand ? Expanded(child: child) : child;\n  }\n\n  Widget _buildText(ThemeData theme) {\n    final hasText = text != null;\n    final child = Text(\n      hasText ? text! : '-',\n      key: hasText ? ValueKey(text!) : null,\n      style: TextStyle(\n        color: selectStatus\n            ? theme.colorScheme.primary\n            : theme.colorScheme.outline,\n        fontSize: theme.textTheme.labelSmall!.fontSize,\n      ),\n    );\n    if (hasText) {\n      return AnimatedSwitcher(\n        duration: const Duration(milliseconds: 300),\n        transitionBuilder: (Widget child, Animation<double> animation) {\n          return ScaleTransition(scale: animation, child: child);\n        },\n        child: child,\n      );\n    }\n    return child;\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/introduction/ugc/widgets/menu_row.dart",
    "content": "import 'package:PiliPlus/utils/feed_back.dart';\nimport 'package:flutter/material.dart';\n\nclass ActionRowLineItem extends StatelessWidget {\n  const ActionRowLineItem({\n    super.key,\n    required this.selectStatus,\n    this.onTap,\n    this.text,\n    this.isLoading = false,\n    this.iconData,\n    this.icon,\n  });\n  final bool selectStatus;\n  final Function? onTap;\n  final bool isLoading;\n  final String? text;\n  final IconData? iconData;\n  final Widget? icon;\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    return Material(\n      color: selectStatus ? theme.colorScheme.secondaryContainer : null,\n      type: selectStatus ? MaterialType.canvas : MaterialType.transparency,\n      borderRadius: const BorderRadius.all(Radius.circular(30)),\n      child: InkWell(\n        borderRadius: const BorderRadius.all(Radius.circular(30)),\n        onTap: () => {\n          feedBack(),\n          onTap?.call(),\n        },\n        child: Container(\n          padding: const EdgeInsets.fromLTRB(13, 5.5, 13, 4.5),\n          decoration: BoxDecoration(\n            borderRadius: const BorderRadius.all(Radius.circular(30)),\n            border: Border.all(\n              color: selectStatus\n                  ? Colors.transparent\n                  : theme.colorScheme.secondaryContainer,\n            ),\n          ),\n          child: Row(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              if (iconData != null)\n                Icon(\n                  iconData,\n                  size: 13,\n                  color: selectStatus\n                      ? theme.colorScheme.onSecondaryContainer\n                      : theme.colorScheme.outline,\n                )\n              else\n                ?icon,\n              AnimatedOpacity(\n                opacity: isLoading ? 0 : 1,\n                duration: const Duration(milliseconds: 200),\n                child: Text(\n                  text!,\n                  style: TextStyle(\n                    fontSize: 13,\n                    color: selectStatus\n                        ? theme.colorScheme.onSecondaryContainer\n                        : theme.colorScheme.outline,\n                  ),\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/introduction/ugc/widgets/page.dart",
    "content": "import 'dart:async';\nimport 'dart:math';\n\nimport 'package:PiliPlus/models_new/video/video_detail/page.dart';\nimport 'package:PiliPlus/pages/video/controller.dart';\nimport 'package:PiliPlus/pages/video/introduction/ugc/controller.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:font_awesome_flutter/font_awesome_flutter.dart';\nimport 'package:get/get.dart';\n\n// TODO refa\nclass PagesPanel extends StatefulWidget {\n  const PagesPanel({\n    super.key,\n    this.list,\n    this.cover,\n    required this.bvid,\n    required this.heroTag,\n    this.showEpisodes,\n    required this.ugcIntroController,\n    this.onDownload,\n    this.cidSet,\n  });\n\n  final List<Part>? list;\n  final String? cover;\n\n  final String bvid;\n  final String heroTag;\n  final Function? showEpisodes;\n  final UgcIntroController ugcIntroController;\n\n  final Set<int>? cidSet;\n  final bool Function(Part part)? onDownload;\n\n  @override\n  State<PagesPanel> createState() => _PagesPanelState();\n}\n\nclass _PagesPanelState extends State<PagesPanel> {\n  late int cid;\n  int pageIndex = -1;\n  late final VideoDetailController _videoDetailController;\n  late final ScrollController _scrollController;\n  StreamSubscription? _listener;\n\n  List<Part> get pages =>\n      widget.list ?? widget.ugcIntroController.videoDetail.value.pages!;\n\n  @override\n  void initState() {\n    super.initState();\n    _videoDetailController = Get.find<VideoDetailController>(\n      tag: widget.heroTag,\n    );\n    double offset = 0;\n    if (widget.list == null) {\n      cid = widget.ugcIntroController.cid.value;\n      pageIndex = pages.indexWhere((Part e) => e.cid == cid);\n      offset = targetOffset;\n      _listener = _videoDetailController.cid.listen((cid) {\n        this.cid = cid;\n        pageIndex = max(0, pages.indexWhere((e) => e.cid == cid));\n        if (!mounted) return;\n        setState(() {});\n        jumpToCurr();\n      });\n    }\n    _scrollController = ScrollController(initialScrollOffset: offset);\n  }\n\n  double get targetOffset {\n    const double itemWidth = 150;\n    return max(0, pageIndex * itemWidth - itemWidth / 2);\n  }\n\n  void jumpToCurr() {\n    if (!_scrollController.hasClients || pages.isEmpty) {\n      return;\n    }\n    final double targetOffset = this.targetOffset.clamp(\n      _scrollController.position.minScrollExtent,\n      _scrollController.position.maxScrollExtent,\n    );\n    _scrollController.animateTo(\n      targetOffset,\n      duration: const Duration(milliseconds: 300),\n      curve: Curves.easeInOut,\n    );\n  }\n\n  @override\n  void dispose() {\n    _listener?.cancel();\n    _scrollController.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    return Column(\n      children: <Widget>[\n        if (widget.showEpisodes != null)\n          Padding(\n            padding: const EdgeInsets.only(top: 8, bottom: 2),\n            child: Row(\n              mainAxisAlignment: MainAxisAlignment.spaceBetween,\n              children: [\n                const Text('视频选集 '),\n                Expanded(\n                  child: Text(\n                    ' 正在播放：${pages[pageIndex].part}',\n                    overflow: TextOverflow.ellipsis,\n                    style: TextStyle(\n                      fontSize: 12,\n                      color: theme.colorScheme.outline,\n                    ),\n                  ),\n                ),\n                const SizedBox(width: 10),\n                SizedBox(\n                  height: 34,\n                  child: TextButton(\n                    style: const ButtonStyle(\n                      padding: WidgetStatePropertyAll(EdgeInsets.zero),\n                    ),\n                    onPressed: () => widget.showEpisodes!(\n                      null,\n                      null,\n                      pages,\n                      widget.bvid,\n                      IdUtils.bv2av(widget.bvid),\n                      cid,\n                    ),\n                    child: Text(\n                      '共${pages.length}集',\n                      style: const TextStyle(fontSize: 13),\n                    ),\n                  ),\n                ),\n              ],\n            ),\n          ),\n        SizedBox(\n          height: 35,\n          child: ListView.builder(\n            key: PageStorageKey(widget.bvid),\n            controller: _scrollController,\n            scrollDirection: Axis.horizontal,\n            itemCount: pages.length,\n            itemExtent: 150,\n            padding: EdgeInsets.zero,\n            itemBuilder: (BuildContext context, int i) {\n              bool isCurrentIndex = pageIndex == i;\n              final item = pages[i];\n              return Container(\n                width: 150,\n                margin: i != pages.length - 1\n                    ? const EdgeInsets.only(right: 10)\n                    : null,\n                child: Material(\n                  color: theme.colorScheme.onInverseSurface,\n                  borderRadius: const BorderRadius.all(Radius.circular(6)),\n                  child: InkWell(\n                    borderRadius: const BorderRadius.all(Radius.circular(6)),\n                    onTap: () {\n                      if (widget.onDownload case final onDownload?) {\n                        if (onDownload(item) && mounted) {\n                          setState(() {});\n                        }\n                        return;\n                      }\n                      if (widget.showEpisodes == null) {\n                        Get.back();\n                      }\n                      widget.ugcIntroController.onChangeEpisode(\n                        item\n                          ..bvid ??= widget.bvid\n                          ..cover ??= widget.cover,\n                      );\n                      if (widget.list != null &&\n                          widget\n                                  .ugcIntroController\n                                  .videoDetail\n                                  .value\n                                  .ugcSeason !=\n                              null) {\n                        _videoDetailController.seasonCid = pages.first.cid;\n                      }\n                    },\n                    child: Padding(\n                      padding: const EdgeInsets.all(8),\n                      child: Row(\n                        children: <Widget>[\n                          if (isCurrentIndex) ...<Widget>[\n                            Image.asset(\n                              'assets/images/live.png',\n                              color: theme.colorScheme.primary,\n                              height: 12,\n                              cacheHeight: 12.cacheSize(context),\n                              semanticLabel: \"正在播放：\",\n                            ),\n                            const SizedBox(width: 6),\n                          ],\n                          Expanded(\n                            child: Text(\n                              item.part!,\n                              maxLines: 1,\n                              style: TextStyle(\n                                fontSize: 13,\n                                color: isCurrentIndex\n                                    ? theme.colorScheme.primary\n                                    : theme.colorScheme.onSurface,\n                              ),\n                              overflow: TextOverflow.ellipsis,\n                            ),\n                          ),\n                          if (widget.cidSet?.contains(item.cid) ?? false)\n                            Icon(\n                              size: 13,\n                              color: theme.colorScheme.secondary.withValues(\n                                alpha: 0.8,\n                              ),\n                              FontAwesomeIcons.circleDown,\n                            ),\n                        ],\n                      ),\n                    ),\n                  ),\n                ),\n              );\n            },\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/introduction/ugc/widgets/season.dart",
    "content": "import 'dart:async';\n\nimport 'package:PiliPlus/models_new/video/video_detail/data.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/episode.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/section.dart';\nimport 'package:PiliPlus/pages/video/controller.dart';\nimport 'package:PiliPlus/pages/video/introduction/ugc/controller.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\n// TODO refa\nclass SeasonPanel extends StatefulWidget {\n  const SeasonPanel({\n    super.key,\n    required this.heroTag,\n    required this.showEpisodes,\n    this.canTap = true,\n    required this.ugcIntroController,\n  });\n  final String heroTag;\n  final Function showEpisodes;\n  final bool canTap;\n  final UgcIntroController ugcIntroController;\n\n  @override\n  State<SeasonPanel> createState() => _SeasonPanelState();\n}\n\nclass _SeasonPanelState extends State<SeasonPanel> {\n  RxInt currentIndex = 0.obs;\n  late VideoDetailController _videoDetailController;\n  StreamSubscription? _listener;\n  List<EpisodeItem> episodes = <EpisodeItem>[];\n\n  UgcIntroController get ugcIntroController => widget.ugcIntroController;\n  VideoDetailData get videoDetail =>\n      widget.ugcIntroController.videoDetail.value;\n\n  @override\n  void initState() {\n    super.initState();\n    _videoDetailController = Get.find<VideoDetailController>(\n      tag: widget.heroTag,\n    );\n\n    _videoDetailController.seasonCid = ugcIntroController.cid.value != 0\n        ? (videoDetail.pages?.isNotEmpty == true\n              ? videoDetail.isPageReversed\n                    ? videoDetail.pages!.last.cid\n                    : videoDetail.pages!.first.cid\n              : ugcIntroController.cid.value)\n        : videoDetail.isPageReversed\n        ? videoDetail.pages!.last.cid\n        : videoDetail.pages!.first.cid;\n\n    /// 根据 cid 找到对应集，找到对应 episodes\n    /// 有多个episodes时，只显示其中一个\n    _findEpisode();\n    if (episodes.isEmpty) {\n      return;\n    }\n\n    /// 取对应 season_id 的 episodes\n    currentIndex.value = episodes.indexWhere(\n      (EpisodeItem e) => e.cid == _videoDetailController.seasonCid,\n    );\n    _listener = _videoDetailController.cid.listen((int cid) {\n      if (_videoDetailController.seasonCid != cid) {\n        bool isPart =\n            videoDetail.pages?.indexWhere((item) => item.cid == cid) != -1;\n        if (!isPart) {\n          _videoDetailController.seasonCid = cid;\n        }\n      }\n      _findEpisode();\n      currentIndex.value = episodes.indexWhere(\n        (EpisodeItem e) => e.cid == _videoDetailController.seasonCid,\n      );\n    });\n  }\n\n  @override\n  void dispose() {\n    _listener?.cancel();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    if (episodes.isEmpty) {\n      return const SizedBox.shrink();\n    }\n    final theme = Theme.of(context);\n    return Padding(\n      padding: const EdgeInsets.only(\n        top: 8,\n        left: 2,\n        right: 2,\n      ),\n      child: Material(\n        color: theme.colorScheme.onInverseSurface,\n        borderRadius: const BorderRadius.all(Radius.circular(6)),\n        child: InkWell(\n          borderRadius: const BorderRadius.all(Radius.circular(6)),\n          onTap: widget.canTap\n              ? () => widget.showEpisodes(\n                  _videoDetailController.seasonIndex.value,\n                  videoDetail.ugcSeason,\n                  null,\n                  _videoDetailController.bvid,\n                  null,\n                  _videoDetailController.seasonCid,\n                )\n              : null,\n          child: Padding(\n            padding: const EdgeInsets.fromLTRB(8, 12, 8, 12),\n            child: Row(\n              children: <Widget>[\n                Expanded(\n                  child: Text(\n                    '合集：${videoDetail.ugcSeason!.title!}',\n                    style: theme.textTheme.labelMedium,\n                    overflow: TextOverflow.ellipsis,\n                  ),\n                ),\n                const SizedBox(width: 15),\n                Image.asset(\n                  'assets/images/live.png',\n                  color: theme.colorScheme.primary,\n                  height: 12,\n                  cacheHeight: 12.cacheSize(context),\n                  semanticLabel: \"正在播放：\",\n                ),\n                const SizedBox(width: 10),\n                Obx(\n                  () => Text(\n                    '${currentIndex.value + 1}/${episodes.length}',\n                    style: theme.textTheme.labelMedium,\n                    semanticsLabel:\n                        '第${currentIndex.value + 1}集，共${episodes.length}集',\n                  ),\n                ),\n                const SizedBox(width: 6),\n                const Icon(\n                  Icons.arrow_forward_ios_outlined,\n                  size: 13,\n                  semanticLabel: '查看',\n                ),\n              ],\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n\n  void _findEpisode() {\n    final List<SectionItem> sections = videoDetail.ugcSeason!.sections!;\n    for (int i = 0; i < sections.length; i++) {\n      final List<EpisodeItem> episodesList = sections[i].episodes!;\n      for (int j = 0; j < episodesList.length; j++) {\n        if (episodesList[j].cid == _videoDetailController.seasonCid) {\n          if (_videoDetailController.seasonIndex.value != i) {\n            _videoDetailController.seasonIndex.value = i;\n          }\n          episodes = episodesList;\n          break;\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/introduction/ugc/widgets/triple_mixin.dart",
    "content": "import 'dart:async';\n\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nmixin TripleMixin on GetxController, TickerProvider {\n  // 是否点赞\n  final RxBool hasLike = false.obs;\n  // 投币数量\n  final RxNum coinNum = RxNum(0);\n  // 是否投币\n  bool get hasCoin => coinNum.value != 0;\n  // 是否收藏\n  final RxBool hasFav = false.obs;\n\n  bool get hasTriple => hasLike.value && hasCoin && hasFav.value;\n\n  void actionTriple();\n  void actionLikeVideo();\n\n  // no need for pugv\n  AnimationController? _tripleAnimCtr;\n  Animation<double>? _tripleAnimation;\n\n  AnimationController get tripleAnimCtr =>\n      _tripleAnimCtr ??= AnimationController(\n        vsync: this,\n        duration: const Duration(milliseconds: 1200),\n        reverseDuration: const Duration(milliseconds: 400),\n      );\n\n  Animation<double> get tripleAnimation => _tripleAnimation ??= tripleAnimCtr\n      .drive(CurveTween(curve: Curves.easeInOut));\n\n  Timer? _timer;\n\n  void _cancelTimer() {\n    _timer?.cancel();\n    _timer = null;\n  }\n\n  static final _duration = PlatformUtils.isMobile\n      ? const Duration(milliseconds: 200)\n      : const Duration(milliseconds: 255);\n\n  void onStartTriple() {\n    _timer ??= Timer(_duration, () {\n      HapticFeedback.lightImpact();\n      if (hasTriple) {\n        SmartDialog.showToast('已完成三连');\n      } else {\n        tripleAnimCtr.forward().whenComplete(() {\n          tripleAnimCtr.reset();\n          actionTriple();\n        });\n      }\n      _cancelTimer();\n    });\n  }\n\n  void onCancelTriple([bool isTapUp = false]) {\n    if (tripleAnimCtr.status == AnimationStatus.forward) {\n      tripleAnimCtr.reverse();\n    } else if (_timer != null && _timer!.tick == 0) {\n      _cancelTimer();\n      if (isTapUp) {\n        actionLikeVideo();\n      }\n    }\n  }\n\n  @override\n  void onClose() {\n    _cancelTimer();\n    _tripleAnimCtr?.dispose();\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/medialist/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/stat/stat.dart';\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models/common/stat_type.dart';\nimport 'package:PiliPlus/models_new/media_list/media_list.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/episode.dart';\nimport 'package:PiliPlus/pages/common/slide/common_slide_page.dart';\nimport 'package:PiliPlus/utils/duration_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\n\nclass MediaListPanel extends CommonSlidePage {\n  const MediaListPanel({\n    super.key,\n    required this.mediaList,\n    required this.onChangeEpisode,\n    this.panelTitle,\n    required this.bvid,\n    required this.loadMoreMedia,\n    required this.count,\n    required this.desc,\n    required this.onReverse,\n    required this.loadPrevious,\n    this.onDelete,\n  });\n\n  final RxList<MediaListItemModel> mediaList;\n  final ValueChanged<BaseEpisodeItem> onChangeEpisode;\n  final String? panelTitle;\n  final String bvid;\n  final VoidCallback loadMoreMedia;\n  final int? count;\n  final bool desc;\n  final VoidCallback onReverse;\n  final RefreshCallback? loadPrevious;\n  final void Function(MediaListItemModel item, int index)? onDelete;\n\n  @override\n  State<MediaListPanel> createState() => _MediaListPanelState();\n}\n\nclass _MediaListPanelState extends State<MediaListPanel>\n    with SingleTickerProviderStateMixin, CommonSlideMixin {\n  late final ScrollController _controller;\n\n  @override\n  void initState() {\n    super.initState();\n    final bvid = widget.bvid;\n    final bvIndex = widget.mediaList.indexWhere((item) => item.bvid == bvid);\n    _controller = ScrollController(\n      initialScrollOffset: bvIndex <= 0 ? 0 : bvIndex * 100.0 + 7,\n    );\n  }\n\n  @override\n  Widget buildPage(ThemeData theme) {\n    return Material(\n      color: theme.colorScheme.surface,\n      child: Column(\n        children: [\n          AppBar(\n            primary: false,\n            toolbarHeight: 45,\n            automaticallyImplyLeading: false,\n            titleSpacing: 16,\n            title: Text(widget.panelTitle ?? '稍后再看'),\n            backgroundColor: Colors.transparent,\n            actions: [\n              iconButton(\n                iconSize: 20,\n                tooltip: widget.desc ? '顺序播放' : '倒序播放',\n                icon: widget.desc\n                    ? const Icon(MdiIcons.sortAscending)\n                    : const Icon(MdiIcons.sortDescending),\n                onPressed: () {\n                  Get.back();\n                  widget.onReverse();\n                },\n              ),\n              iconButton(\n                iconSize: 20,\n                tooltip: '关闭',\n                icon: const Icon(Icons.close),\n                onPressed: Get.back,\n              ),\n              const SizedBox(width: 14),\n            ],\n            shape: Border(\n              bottom: BorderSide(\n                color: theme.colorScheme.outline.withValues(alpha: 0.1),\n              ),\n            ),\n          ),\n          Expanded(\n            child: enableSlide ? slideList(theme) : buildList(theme),\n          ),\n        ],\n      ),\n    );\n  }\n\n  @override\n  Widget buildList(ThemeData theme) {\n    return widget.loadPrevious != null\n        ? refreshIndicator(\n            onRefresh: widget.loadPrevious!,\n            child: _buildList(theme),\n          )\n        : _buildList(theme);\n  }\n\n  Widget _buildList(ThemeData theme) {\n    final showDelBtn = widget.onDelete != null && widget.mediaList.length > 1;\n    return CustomScrollView(\n      controller: _controller,\n      physics: const AlwaysScrollableScrollPhysics(),\n      slivers: [\n        SliverPadding(\n          padding: EdgeInsets.only(\n            top: 7,\n            bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n          ),\n          sliver: Obx(\n            () => SliverFixedExtentList.builder(\n              itemExtent: 100,\n              itemCount: widget.mediaList.length,\n              itemBuilder: (context, index) {\n                if (index == widget.mediaList.length - 1 &&\n                    (widget.count == null ||\n                        widget.mediaList.length < widget.count!)) {\n                  widget.loadMoreMedia();\n                }\n                final item = widget.mediaList[index];\n                final isCurr = item.bvid == widget.bvid;\n                return _buildItem(theme, index, item, isCurr, showDelBtn);\n              },\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n\n  Widget _buildItem(\n    ThemeData theme,\n    int index,\n    MediaListItemModel item,\n    bool isCurr,\n    bool showDelBtn,\n  ) {\n    void onLongPress() => imageSaveDialog(\n      title: item.title,\n      cover: item.cover,\n      aid: item.aid,\n      bvid: item.bvid,\n    );\n    return Padding(\n      padding: const EdgeInsets.only(bottom: 2),\n      child: SizedBox(\n        height: 98,\n        child: Material(\n          type: MaterialType.transparency,\n          child: InkWell(\n            onTap: () {\n              if (item.type != 2) {\n                SmartDialog.showToast('不支持播放该类型视频');\n                return;\n              }\n              Get.back();\n              widget.onChangeEpisode(item);\n            },\n            onLongPress: onLongPress,\n            onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n            child: Stack(\n              clipBehavior: Clip.none,\n              children: [\n                Padding(\n                  padding: const EdgeInsets.symmetric(\n                    horizontal: 12,\n                    vertical: 5,\n                  ),\n                  child: Row(\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: [\n                      Stack(\n                        clipBehavior: Clip.none,\n                        children: [\n                          NetworkImgLayer(\n                            src: item.cover,\n                            width: 140.8,\n                            height: 88,\n                          ),\n                          if (item.badge?.isNotEmpty == true)\n                            PBadge(\n                              text: item.badge,\n                              right: 6.0,\n                              top: 6.0,\n                              type: switch (item.badge) {\n                                '充电专属' => PBadgeType.error,\n                                _ => PBadgeType.primary,\n                              },\n                            ),\n                          PBadge(\n                            text: DurationUtils.formatDuration(\n                              item.duration,\n                            ),\n                            right: 6.0,\n                            bottom: 6.0,\n                            type: PBadgeType.gray,\n                          ),\n                        ],\n                      ),\n                      const SizedBox(width: 10),\n                      Expanded(\n                        child: Column(\n                          crossAxisAlignment: CrossAxisAlignment.start,\n                          children: [\n                            Text(\n                              item.title!,\n                              maxLines: 2,\n                              overflow: TextOverflow.ellipsis,\n                              style: TextStyle(\n                                fontWeight: isCurr ? FontWeight.bold : null,\n                                color: isCurr\n                                    ? theme.colorScheme.primary\n                                    : null,\n                              ),\n                            ),\n                            if (item.type == 24 &&\n                                item.intro?.isNotEmpty == true) ...[\n                              const SizedBox(height: 3),\n                              Text(\n                                item.intro!,\n                                maxLines: 2,\n                                overflow: TextOverflow.ellipsis,\n                                style: TextStyle(\n                                  fontSize: 13,\n                                  color: theme.colorScheme.outline,\n                                ),\n                              ),\n                            ],\n                            const Spacer(),\n                            Text(\n                              item.upper!.name!,\n                              maxLines: 1,\n                              overflow: TextOverflow.ellipsis,\n                              style: TextStyle(\n                                fontSize: 12,\n                                color: theme.colorScheme.outline,\n                              ),\n                            ),\n                            if (item.type == 2) ...[\n                              const SizedBox(height: 3),\n                              Row(\n                                spacing: 8,\n                                children: [\n                                  StatWidget(\n                                    type: StatType.play,\n                                    value: item.cntInfo!.play,\n                                  ),\n                                  StatWidget(\n                                    type: StatType.danmaku,\n                                    value: item.cntInfo!.danmaku,\n                                  ),\n                                ],\n                              ),\n                            ],\n                          ],\n                        ),\n                      ),\n                    ],\n                  ),\n                ),\n                if (showDelBtn && !isCurr)\n                  Positioned(\n                    right: 12,\n                    bottom: -6,\n                    child: InkWell(\n                      customBorder: const CircleBorder(),\n                      onTap: () => showConfirmDialog(\n                        context: context,\n                        title: '确定移除该视频？',\n                        onConfirm: () => widget.onDelete!(item, index),\n                      ),\n                      onLongPress: () => widget.onDelete!(item, index),\n                      child: Padding(\n                        padding: const EdgeInsets.all(9),\n                        child: Icon(\n                          Icons.clear,\n                          size: 18,\n                          color: theme.colorScheme.outline,\n                        ),\n                      ),\n                    ),\n                  ),\n              ],\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/member/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/member.dart';\nimport 'package:PiliPlus/models/common/member/contribute_type.dart';\nimport 'package:PiliPlus/models/member/info.dart';\nimport 'package:PiliPlus/models_new/space/space_archive/data.dart';\nimport 'package:PiliPlus/models_new/space/space_archive/item.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';\nimport 'package:get/get.dart';\n\nclass HorizontalMemberPageController\n    extends CommonListController<SpaceArchiveData, SpaceArchiveItem> {\n  HorizontalMemberPageController({this.mid, required this.currAid});\n\n  dynamic mid;\n\n  final Rx<LoadingState<MemberInfoModel>> userState =\n      LoadingState<MemberInfoModel>.loading().obs;\n  final RxMap userStat = {}.obs;\n\n  @override\n  void onInit() {\n    super.onInit();\n    getUserInfo();\n    queryData();\n  }\n\n  Future<void> getUserInfo() async {\n    final res = await MemberHttp.memberInfo(mid: mid);\n    userState.value = res;\n    if (res.isSuccess) {\n      getMemberStat();\n      getMemberView();\n    }\n  }\n\n  Future<void> getMemberStat() async {\n    final res = await MemberHttp.memberStat(mid: mid);\n    if (res case Success(:final response)) {\n      userStat.addAll(response);\n    }\n  }\n\n  Future<void> getMemberView() async {\n    if (!Accounts.main.isLogin) {\n      return;\n    }\n    final res = await MemberHttp.memberView(mid: mid);\n    if (res case Success(:final response)) {\n      userStat.addAll(response);\n    }\n  }\n\n  @override\n  bool customHandleResponse(bool isRefresh, Success response) {\n    SpaceArchiveData data = response.response;\n    count.value = data.count ?? -1;\n    if (isRefresh) {\n      if (isLoadPrevious) {\n        hasPrev = data.hasPrev ?? false;\n      } else {\n        hasNext = data.hasNext ?? false;\n      }\n    }\n    if (isLoadPrevious) {\n      if (loadingState.value case Success(:final response)) {\n        (data.item ??= <SpaceArchiveItem>[]).addAll(response!);\n      }\n    } else if (!isRefresh) {\n      if (loadingState.value case Success(:final response)) {\n        (data.item ??= <SpaceArchiveItem>[]).insertAll(0, response!);\n      }\n    }\n    firstAid = data.item?.firstOrNull?.param;\n    lastAid = data.item?.lastOrNull?.param;\n    loadingState.value = Success(data.item);\n    isLoadPrevious = false;\n    page++;\n    return true;\n  }\n\n  String? currAid;\n  String? firstAid;\n  String? lastAid;\n  RxString order = 'pubdate'.obs;\n  RxInt count = (-1).obs;\n  bool isLoadPrevious = false;\n  bool hasPrev = true;\n  bool hasNext = true;\n\n  @override\n  Future<LoadingState<SpaceArchiveData>> customGetData() =>\n      MemberHttp.spaceArchive(\n        type: ContributeType.video,\n        mid: mid,\n        aid: page == 1\n            ? currAid\n            : isLoadPrevious\n            ? firstAid\n            : lastAid,\n        order: order.value,\n        sort: page != 1 && isLoadPrevious ? 'asc' : null,\n        pn: null,\n        next: null,\n        seasonId: null,\n        seriesId: null,\n        includeCursor: page == 1 ? true : null,\n      );\n\n  @override\n  Future<void> onRefresh() {\n    if (!hasPrev) {\n      return Future.syncValue(null);\n    }\n    isLoadPrevious = true;\n    return queryData();\n  }\n\n  @override\n  Future<void> onReload() {\n    firstAid = null;\n    lastAid = null;\n    hasNext = true;\n    hasPrev = true;\n    isEnd = false;\n    page = 1;\n    scrollController.jumpToTop();\n    return super.onReload();\n  }\n\n  void queryBySort() {\n    if (isLoading) return;\n    order.value = order.value == 'pubdate' ? 'click' : 'pubdate';\n    onReload();\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/member/view.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/skeleton/video_card_h.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/image_preview_type.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models/common/member/user_info_type.dart';\nimport 'package:PiliPlus/models/member/info.dart';\nimport 'package:PiliPlus/models_new/space/space_archive/item.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/episode.dart';\nimport 'package:PiliPlus/pages/fan/view.dart';\nimport 'package:PiliPlus/pages/follow/view.dart';\nimport 'package:PiliPlus/pages/member_video/widgets/video_card_h_member_video.dart';\nimport 'package:PiliPlus/pages/video/controller.dart';\nimport 'package:PiliPlus/pages/video/introduction/ugc/controller.dart';\nimport 'package:PiliPlus/pages/video/member/controller.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/request_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass HorizontalMemberPage extends StatefulWidget {\n  const HorizontalMemberPage({\n    super.key,\n    required this.mid,\n    required this.videoDetailController,\n    required this.ugcIntroController,\n  });\n\n  final dynamic mid;\n  final VideoDetailController videoDetailController;\n  final UgcIntroController ugcIntroController;\n\n  @override\n  State<HorizontalMemberPage> createState() => _HorizontalMemberPageState();\n}\n\nclass _HorizontalMemberPageState extends State<HorizontalMemberPage> {\n  late final HorizontalMemberPageController _controller;\n  late final account = Accounts.main;\n  late final String _bvid;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = Get.put(\n      HorizontalMemberPageController(\n        mid: widget.mid,\n        currAid: widget.videoDetailController.aid.toString(),\n      ),\n      tag: widget.videoDetailController.heroTag,\n    );\n    _bvid = widget.videoDetailController.bvid;\n    if (_controller.loadingState.value\n        case Success<List<SpaceArchiveItem>?> res) {\n      final index = res.response?.indexWhere((e) => e.bvid == _bvid) ?? -1;\n      if (index != -1) {\n        WidgetsBinding.instance.addPostFrameCallback((_) {\n          _controller.scrollController.jumpTo(100.0 * index);\n        });\n      }\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    return Obx(\n      () => _buildUserPage(theme, _controller.userState.value),\n    );\n  }\n\n  Widget _buildUserPage(ThemeData theme, LoadingState userState) {\n    return switch (userState) {\n      Loading() => m3eLoading,\n      Success(:final response) => Column(\n        children: [\n          _buildUserInfo(theme, response),\n          _buildHeader(theme),\n          Expanded(\n            child: refreshIndicator(\n              onRefresh: _controller.onRefresh,\n              child: CustomScrollView(\n                controller: _controller.scrollController,\n                physics: const AlwaysScrollableScrollPhysics(),\n                slivers: [\n                  SliverPadding(\n                    padding: EdgeInsets.only(\n                      bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n                    ),\n                    sliver: Obx(\n                      () => _buildVideoList(\n                        theme,\n                        _controller.loadingState.value,\n                      ),\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          ),\n        ],\n      ),\n      Error(:final errMsg) => scrollErrorWidget(\n        controller: _controller.scrollController,\n        errMsg: errMsg,\n        onReload: () {\n          _controller.userState.value = LoadingState<MemberInfoModel>.loading();\n          _controller.getUserInfo();\n        },\n      ),\n    };\n  }\n\n  Widget _buildHeader(ThemeData theme) {\n    return Container(\n      height: 40,\n      padding: const EdgeInsets.fromLTRB(12, 0, 6, 0),\n      child: Row(\n        mainAxisAlignment: MainAxisAlignment.spaceBetween,\n        children: [\n          Obx(\n            () {\n              final count = _controller.count.value;\n              return Text(\n                count != -1 ? '共$count视频' : '',\n                style: const TextStyle(fontSize: 13),\n              );\n            },\n          ),\n          TextButton.icon(\n            style: StyleString.buttonStyle,\n            onPressed: () => _controller\n              ..lastAid = widget.videoDetailController.aid.toString()\n              ..queryBySort(),\n            icon: Icon(\n              Icons.sort,\n              size: 16,\n              color: theme.colorScheme.secondary,\n            ),\n            label: Obx(\n              () => Text(\n                _controller.order.value == 'pubdate' ? '最新发布' : '最多播放',\n                style: TextStyle(\n                  fontSize: 13,\n                  color: theme.colorScheme.secondary,\n                ),\n              ),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget _buildVideoList(\n    ThemeData theme,\n    LoadingState<List<SpaceArchiveItem>?> loadingState,\n  ) {\n    return switch (loadingState) {\n      Loading() => SliverFixedExtentList.builder(\n        itemCount: 10,\n        itemBuilder: (_, _) => const VideoCardHSkeleton(),\n        itemExtent: 100,\n      ),\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverFixedExtentList.builder(\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1 && _controller.hasNext) {\n                    _controller.onLoadMore();\n                  }\n                  final SpaceArchiveItem videoItem = response[index];\n                  return Padding(\n                    padding: const EdgeInsets.only(bottom: 2),\n                    child: VideoCardHMemberVideo(\n                      videoItem: videoItem,\n                      bvid: _bvid,\n                      onTap: () {\n                        Get.back();\n                        widget.ugcIntroController.onChangeEpisode(\n                          BaseEpisodeItem(\n                            bvid: videoItem.bvid,\n                            cid: videoItem.cid,\n                            cover: videoItem.cover,\n                          ),\n                        );\n                      },\n                    ),\n                  );\n                },\n                itemCount: response.length,\n                itemExtent: 100,\n              )\n            : HttpError(onReload: _controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n\n  Widget _buildUserInfo(ThemeData theme, MemberInfoModel memberInfoModel) {\n    return Padding(\n      padding: const .only(left: 16, top: 10, right: 16, bottom: 3),\n      child: Row(\n        spacing: 10,\n        children: [\n          _buildAvatar(memberInfoModel.face!),\n          Expanded(child: _buildInfo(theme, memberInfoModel)),\n        ],\n      ),\n    );\n  }\n\n  Column _buildInfo(ThemeData theme, MemberInfoModel memberInfoModel) => Column(\n    mainAxisSize: MainAxisSize.min,\n    crossAxisAlignment: CrossAxisAlignment.start,\n    children: [\n      Row(\n        children: [\n          GestureDetector(\n            onTap: () => Utils.copyText(memberInfoModel.name ?? ''),\n            child: Text(\n              memberInfoModel.name ?? '',\n              style: TextStyle(\n                fontSize: 16,\n                fontWeight: FontWeight.bold,\n                color:\n                    (memberInfoModel.vip?.status ?? -1) > 0 &&\n                        memberInfoModel.vip?.type == 2\n                    ? theme.colorScheme.vipColor\n                    : null,\n              ),\n            ),\n          ),\n          const SizedBox(width: 8),\n          Image.asset(\n            Utils.levelName(\n              memberInfoModel.level!,\n              isSeniorMember: memberInfoModel.isSeniorMember == 1,\n            ),\n            height: 11,\n            cacheHeight: 11.cacheSize(context),\n          ),\n        ],\n      ),\n      const SizedBox(height: 4),\n      Obx(\n        () => Row(\n          children: UserInfoType.values\n              .map(\n                (e) => _buildChildInfo(\n                  theme: theme,\n                  type: e,\n                  userStat: _controller.userStat,\n                  memberInfoModel: memberInfoModel,\n                ),\n              )\n              .expand((child) sync* {\n                yield SizedBox(\n                  height: 10,\n                  width: 20,\n                  child: VerticalDivider(\n                    width: 1,\n                    color: theme.colorScheme.outline,\n                  ),\n                );\n                yield child;\n              })\n              .skip(1)\n              .toList(),\n        ),\n      ),\n      const SizedBox(height: 8),\n      Row(\n        spacing: 8,\n        children: [\n          Expanded(\n            child: FilledButton.tonal(\n              style: FilledButton.styleFrom(\n                backgroundColor: memberInfoModel.isFollowed == true\n                    ? theme.colorScheme.onInverseSurface\n                    : null,\n                foregroundColor: memberInfoModel.isFollowed == true\n                    ? theme.colorScheme.outline\n                    : null,\n                padding: EdgeInsets.zero,\n                tapTargetSize: .shrinkWrap,\n                visualDensity: const VisualDensity(vertical: -2),\n              ),\n              onPressed: () {\n                if (widget.mid == account.mid) {\n                  Get.toNamed('/editProfile');\n                } else {\n                  if (!account.isLogin) {\n                    SmartDialog.showToast('账号未登录');\n                    return;\n                  }\n                  RequestUtils.actionRelationMod(\n                    context: context,\n                    mid: widget.mid,\n                    isFollow: memberInfoModel.isFollowed ?? false,\n                    afterMod: (attribute) {\n                      _controller\n                        ..userState.value.data.isFollowed = attribute != 0\n                        ..userState.refresh();\n                    },\n                  );\n                }\n              },\n              child: Text(\n                widget.mid == account.mid\n                    ? '编辑资料'\n                    : memberInfoModel.isFollowed == true\n                    ? '已关注'\n                    : '关注',\n                maxLines: 1,\n                style: const TextStyle(fontSize: 14),\n              ),\n            ),\n          ),\n          Expanded(\n            child: OutlinedButton(\n              style: OutlinedButton.styleFrom(\n                padding: EdgeInsets.zero,\n                tapTargetSize: .shrinkWrap,\n                visualDensity: const VisualDensity(vertical: -2),\n              ),\n              onPressed: () => Get.toNamed('/member?mid=${widget.mid}'),\n              child: const Text(\n                '查看主页',\n                maxLines: 1,\n                style: TextStyle(fontSize: 14),\n              ),\n            ),\n          ),\n        ],\n      ),\n    ],\n  );\n\n  Widget _buildChildInfo({\n    required ThemeData theme,\n    required UserInfoType type,\n    required Map userStat,\n    required MemberInfoModel memberInfoModel,\n  }) {\n    dynamic num;\n    VoidCallback? onTap;\n    switch (type) {\n      case UserInfoType.fan:\n        num = userStat['follower'] != null\n            ? NumUtils.numFormat(userStat['follower'])\n            : '';\n        onTap = () => FansPage.toFansPage(\n          mid: widget.mid,\n          name: memberInfoModel.name,\n        );\n      case UserInfoType.follow:\n        num = userStat['following'] ?? '';\n        onTap = () => FollowPage.toFollowPage(\n          mid: widget.mid,\n          name: memberInfoModel.name,\n        );\n      case UserInfoType.like:\n        num = userStat['likes'] != null\n            ? NumUtils.numFormat(userStat['likes'])\n            : '';\n    }\n    return GestureDetector(\n      onTap: onTap,\n      child: Text(\n        '$num${type.title}',\n        style: TextStyle(\n          fontSize: 14,\n          color: theme.colorScheme.outline,\n        ),\n      ),\n    );\n  }\n\n  Widget _buildAvatar(String face) => GestureDetector(\n    onTap: () => PageUtils.imageView(\n      imgList: [SourceModel(url: face)],\n    ),\n    child: NetworkImgLayer(\n      src: face,\n      type: ImageType.avatar,\n      width: 70,\n      height: 70,\n    ),\n  );\n}\n"
  },
  {
    "path": "lib/pages/video/note/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/video.dart';\nimport 'package:PiliPlus/models_new/video/video_note_list/data.dart';\nimport 'package:PiliPlus/models_new/video/video_note_list/list.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:get/get.dart';\n\nclass NoteListPageCtr\n    extends CommonListController<VideoNoteData, VideoNoteItemModel> {\n  NoteListPageCtr({required this.oid});\n  final int oid;\n\n  RxInt count = (-1).obs;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  List<VideoNoteItemModel>? getDataList(VideoNoteData response) {\n    count.value = response.page?.total ?? -1;\n    return response.list;\n  }\n\n  @override\n  void checkIsEnd(int length) {\n    final count = this.count.value;\n    if (count != -1 && length >= count) {\n      isEnd = true;\n    }\n  }\n\n  @override\n  Future<LoadingState<VideoNoteData>> customGetData() =>\n      VideoHttp.getVideoNoteList(\n        oid: oid,\n        page: page,\n      );\n}\n"
  },
  {
    "path": "lib/pages/video/note/view.dart",
    "content": "import 'package:PiliPlus/common/skeleton/video_reply.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models_new/video/video_note_list/list.dart';\nimport 'package:PiliPlus/pages/common/slide/common_slide_page.dart';\nimport 'package:PiliPlus/pages/video/note/controller.dart';\nimport 'package:PiliPlus/pages/webview/view.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass NoteListPage extends CommonSlidePage {\n  const NoteListPage({\n    super.key,\n    super.enableSlide,\n    required this.heroTag,\n    required this.oid,\n    required this.isStein,\n    required this.title,\n  });\n\n  final String? heroTag;\n  final int oid;\n  final bool isStein;\n  final String? title;\n\n  @override\n  State<NoteListPage> createState() => _NoteListPageState();\n}\n\nclass _NoteListPageState extends State<NoteListPage>\n    with SingleTickerProviderStateMixin, CommonSlideMixin {\n  late final NoteListPageCtr _controller;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = Get.put(\n      NoteListPageCtr(oid: widget.oid),\n      tag: widget.heroTag,\n    );\n  }\n\n  @override\n  void dispose() {\n    Get.delete<NoteListPageCtr>(tag: widget.heroTag);\n    super.dispose();\n  }\n\n  @override\n  Widget buildPage(ThemeData theme) {\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      body: Column(\n        children: [\n          SizedBox(\n            height: 45,\n            child: AppBar(\n              primary: false,\n              automaticallyImplyLeading: false,\n              titleSpacing: 16,\n              toolbarHeight: 45,\n              backgroundColor: Colors.transparent,\n              title: Obx(() {\n                final count = _controller.count.value;\n                return Text('笔记${count == -1 ? '' : '($count)'}');\n              }),\n              shape: Border(\n                bottom: BorderSide(\n                  color: theme.colorScheme.outline.withValues(alpha: 0.1),\n                ),\n              ),\n              actions: [\n                IconButton(\n                  tooltip: '关闭',\n                  icon: const Icon(Icons.close, size: 20),\n                  onPressed: Get.back,\n                ),\n                const SizedBox(width: 2),\n              ],\n            ),\n          ),\n          Expanded(child: enableSlide ? slideList(theme) : buildList(theme)),\n        ],\n      ),\n    );\n  }\n\n  late Key _key;\n  late bool _isNested;\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    final controller = PrimaryScrollController.of(context);\n    _isNested = controller is ExtendedNestedScrollController;\n    _key = ValueKey(controller.hashCode);\n  }\n\n  @override\n  Widget buildList(ThemeData theme) {\n    Widget child = refreshIndicator(\n      onRefresh: _controller.onRefresh,\n      child: CustomScrollView(\n        key: _key,\n        physics: const AlwaysScrollableScrollPhysics(),\n        slivers: [\n          SliverPadding(\n            padding: const EdgeInsets.only(bottom: 100),\n            sliver: Obx(\n              () => _buildBody(theme, _controller.loadingState.value),\n            ),\n          ),\n        ],\n      ),\n    );\n    if (_isNested) {\n      child = ExtendedVisibilityDetector(\n        uniqueKey: const Key('note-list'),\n        child: child,\n      );\n    }\n    return Column(\n      crossAxisAlignment: CrossAxisAlignment.stretch,\n      children: [\n        Expanded(child: child),\n        Container(\n          padding: EdgeInsets.only(\n            left: 12,\n            right: 12,\n            top: 6,\n            bottom: MediaQuery.viewPaddingOf(context).bottom + 6,\n          ),\n          decoration: BoxDecoration(\n            color: theme.hoverColor,\n            border: Border(\n              top: BorderSide(\n                width: 0.5,\n                color: theme.colorScheme.outline.withValues(alpha: 0.1),\n              ),\n            ),\n          ),\n          child: Builder(\n            builder: (context) => FilledButton.tonal(\n              style: FilledButton.styleFrom(\n                tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n                padding: EdgeInsets.zero,\n                shape: const RoundedRectangleBorder(\n                  borderRadius: BorderRadius.all(Radius.circular(6)),\n                ),\n              ),\n              onPressed: () {\n                if (!Accounts.main.isLogin) {\n                  SmartDialog.showToast('账号未登录');\n                  return;\n                }\n                Scaffold.of(context).showBottomSheet(\n                  constraints: const BoxConstraints(),\n                  (context) => WebviewPage(\n                    oid: widget.oid,\n                    title: widget.title,\n                    url:\n                        'https://www.bilibili.com/h5/note-app?oid=${widget.oid}&pagefrom=ugcvideo&is_stein_gate=${widget.isStein ? 1 : 0}',\n                  ),\n                );\n              },\n              child: const Text('开始记笔记'),\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n\n  Widget _buildBody(\n    ThemeData theme,\n    LoadingState<List<VideoNoteItemModel>?> loadingState,\n  ) {\n    late final divider = Divider(\n      height: 1,\n      color: theme.colorScheme.outline.withValues(alpha: 0.1),\n    );\n    return switch (loadingState) {\n      Loading() => SliverPrototypeExtentList.builder(\n        prototypeItem: const VideoReplySkeleton(),\n        itemBuilder: (_, _) => const VideoReplySkeleton(),\n        itemCount: 8,\n      ),\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverList.separated(\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    _controller.onLoadMore();\n                  }\n                  return _itemWidget(theme, response[index]);\n                },\n                itemCount: response.length,\n                separatorBuilder: (context, index) => divider,\n              )\n            : HttpError(onReload: _controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n\n  Widget _itemWidget(ThemeData theme, VideoNoteItemModel item) {\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onTap: () => Get.toNamed(\n          '/articlePage',\n          parameters: {\n            'id': item.cvid!.toString(),\n            'type': 'read',\n          },\n        ),\n        child: Padding(\n          padding: const EdgeInsets.all(12),\n          child: Row(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              GestureDetector(\n                onTap: () => Get.toNamed('/member?mid=${item.author!.mid}'),\n                child: NetworkImgLayer(\n                  height: 34,\n                  width: 34,\n                  src: item.author!.face,\n                  type: ImageType.avatar,\n                ),\n              ),\n              const SizedBox(width: 12),\n              Expanded(\n                child: Column(\n                  mainAxisSize: MainAxisSize.min,\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    GestureDetector(\n                      onTap: () =>\n                          Get.toNamed('/member?mid=${item.author!.mid}'),\n                      child: Row(\n                        children: [\n                          Text(\n                            item.author!.name!,\n                            style: TextStyle(\n                              color:\n                                  item.author?.vipInfo?.status != null &&\n                                      item.author!.vipInfo!.status > 0 &&\n                                      item.author!.vipInfo!.type == 2\n                                  ? theme.colorScheme.vipColor\n                                  : theme.colorScheme.outline,\n                              fontSize: 13,\n                            ),\n                          ),\n                          const SizedBox(width: 6),\n                          Image.asset(\n                            Utils.levelName(\n                              item.author!.level!,\n                              isSeniorMember: item.author!.isSeniorMember == 1,\n                            ),\n                            height: 11,\n                            cacheHeight: 11.cacheSize(context),\n                          ),\n                        ],\n                      ),\n                    ),\n                    const SizedBox(height: 4),\n                    if (item.pubtime != null)\n                      Text(\n                        item.pubtime!,\n                        style: TextStyle(\n                          color: theme.colorScheme.outline,\n                          fontSize: 12,\n                        ),\n                      ),\n                    if (item.summary != null) ...[\n                      const SizedBox(height: 5),\n                      Text(\n                        item.summary!,\n                        style: TextStyle(\n                          height: 1.75,\n                          fontSize: theme.textTheme.bodyMedium!.fontSize,\n                        ),\n                      ),\n                      Text(\n                        '查看全部',\n                        style: TextStyle(\n                          color: theme.colorScheme.primary,\n                          height: 1.75,\n                          fontSize: theme.textTheme.bodyMedium!.fontSize,\n                        ),\n                      ),\n                    ],\n                  ],\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/pay_coins/view.dart",
    "content": "import 'dart:async';\nimport 'dart:math' as math;\nimport 'dart:math' show max;\n\nimport 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/pages/common/publish/publish_route.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/extension/size_ext.dart';\nimport 'package:PiliPlus/utils/extension/widget_ext.dart';\nimport 'package:PiliPlus/utils/global_data.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass PayCoinsPage extends StatefulWidget {\n  const PayCoinsPage({\n    super.key,\n    required this.onPayCoin,\n    int copyright = 1,\n    this.hasCoin = false,\n  }) : hasCopyright = copyright == 1;\n\n  final Function(int coin, bool coinWithLike) onPayCoin;\n  final bool hasCopyright;\n  final bool hasCoin;\n\n  @override\n  State<PayCoinsPage> createState() => _PayCoinsPageState();\n\n  static void toPayCoinsPage({\n    required Function(int coin, bool coinWithLike) onPayCoin,\n    int copyright = 1,\n    bool hasCoin = false,\n  }) {\n    Get.key.currentState!.push(\n      PublishRoute(\n        pageBuilder: (buildContext, animation, secondaryAnimation) {\n          return PayCoinsPage(\n            onPayCoin: onPayCoin,\n            copyright: copyright,\n            hasCoin: hasCoin,\n          );\n        },\n        transitionDuration: const Duration(milliseconds: 225),\n        transitionBuilder: (context, animation, secondaryAnimation, child) {\n          return FadeTransition(\n            opacity: animation,\n            child: child,\n          );\n        },\n      ),\n    );\n  }\n}\n\nclass _PayCoinsPageState extends State<PayCoinsPage>\n    with TickerProviderStateMixin {\n  late final _key = GlobalKey();\n  late final _hasCopyright = widget.hasCopyright;\n  late bool _isPaying = false;\n  PageController? _controller;\n  late final RxBool _coinWithLike = Pref.coinWithLike.obs;\n  late final RxInt _pageIndex = 0.obs;\n\n  late final AnimationController _slide22Controller;\n  late final Animation<Offset> _slide22Anim;\n  late final AnimationController _scale22Controller;\n  late final AnimationController _coinController;\n  late final Animation<Offset> _coinSlideAnim;\n  late final Animation<double> _coinFadeAnim;\n  late final AnimationController _boxAnimController;\n  late final Animation<Offset> _boxAnim;\n\n  Timer? _timer;\n  late final RxInt _thunderIndex = (-1).obs;\n  static const List<String> _thunderImages = [\n    'assets/images/paycoins/ic_thunder_1.png',\n    'assets/images/paycoins/ic_thunder_2.png',\n    'assets/images/paycoins/ic_thunder_3.png',\n  ];\n  void _cancelTimer() {\n    _timer?.cancel();\n    _timer = null;\n  }\n\n  final num? _coins = GlobalData().coins;\n\n  bool _canPay(int index) {\n    if (index == 1 && widget.hasCoin) {\n      return false;\n    }\n    if (_coins == null || _coins >= 1 + index) {\n      return true;\n    }\n    return false;\n  }\n\n  String _getPayImage(int index, bool canPay) {\n    if (!canPay) {\n      return 'assets/images/paycoins/ic_22_not_enough_pay.png';\n    }\n    return index == 0\n        ? 'assets/images/paycoins/ic_22_mario.png'\n        : 'assets/images/paycoins/ic_22_gun_sister.png';\n  }\n\n  late final color = Colors.black.withValues(alpha: 0.4);\n  Color _getPayFilter(int index) => _canPay(index) ? Colors.transparent : color;\n\n  @override\n  void initState() {\n    super.initState();\n    if (_hasCopyright) {\n      _controller = PageController(viewportFraction: 0.30);\n    }\n\n    _slide22Controller = AnimationController(\n      vsync: this,\n      duration: const Duration(milliseconds: 50),\n    );\n    _slide22Anim = _slide22Controller.drive(\n      Tween<Offset>(\n        begin: Offset.zero,\n        end: const Offset(0.0, -0.2),\n      ),\n    );\n    _scale22Controller = AnimationController(\n      vsync: this,\n      duration: const Duration(milliseconds: 50),\n      lowerBound: 1.0,\n      upperBound: 1.1,\n    );\n    _coinController = AnimationController(\n      vsync: this,\n      duration: const Duration(milliseconds: 300),\n    );\n    _coinSlideAnim = _coinController.drive(\n      Tween<Offset>(\n        begin: Offset.zero,\n        end: const Offset(0.0, -2.0),\n      ).chain(CurveTween(curve: const Interval(0.0, 2 / 3))),\n    );\n    _coinFadeAnim = _coinController.drive(\n      Tween<double>(\n        begin: 1.0,\n        end: 0.0,\n      ).chain(CurveTween(curve: const Interval(2 / 3, 1.0))),\n    );\n    _boxAnimController = AnimationController(\n      vsync: this,\n      duration: const Duration(milliseconds: 50),\n    );\n    _boxAnim = _boxAnimController.drive(\n      Tween<Offset>(\n        begin: Offset.zero,\n        end: const Offset(0.0, -0.2),\n      ),\n    );\n\n    WidgetsBinding.instance.addPostFrameCallback(_scale);\n  }\n\n  @override\n  void dispose() {\n    _cancelTimer();\n    _slide22Controller.dispose();\n    _scale22Controller.dispose();\n    _coinController.dispose();\n    _boxAnimController.dispose();\n    _controller?.dispose();\n    super.dispose();\n  }\n\n  void _scale([_]) {\n    _scale22Controller.forward().whenComplete(_scale22Controller.reverse);\n  }\n\n  void _onScroll(int index) {\n    _controller?.animateToPage(\n      index,\n      duration: const Duration(milliseconds: 200),\n      curve: Curves.ease,\n    );\n    _scale();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final size = MediaQuery.sizeOf(context);\n    final isPortrait = size.isPortrait;\n    return isPortrait\n        ? _buildBody(isPortrait)\n        : _buildBody(isPortrait).constraintWidth(\n            constraints: BoxConstraints(\n              maxWidth: math.min(525, size.width * 0.6),\n            ),\n          );\n  }\n\n  Widget _buildCoinWidget(int index, double factor) {\n    return Center(\n      child: SizedBox(\n        height: 70 + (factor * 30),\n        width: 70 + (factor * 30),\n        child: ColorFiltered(\n          colorFilter: ColorFilter.mode(\n            _getPayFilter(index),\n            BlendMode.srcATop,\n          ),\n          child: Stack(\n            clipBehavior: Clip.none,\n            alignment: Alignment.center,\n            children: [\n              SlideTransition(\n                position: _boxAnim,\n                child: Image.asset(\n                  'assets/images/paycoins/ic_pay_coins_box.png',\n                ),\n              ),\n              SlideTransition(\n                position: _coinSlideAnim,\n                child: FadeTransition(\n                  opacity: _coinFadeAnim,\n                  child: Image.asset(\n                    height: 35 + (factor * 15),\n                    width: 35 + (factor * 15),\n                    index == 0\n                        ? 'assets/images/paycoins/ic_coins_one.png'\n                        : 'assets/images/paycoins/ic_coins_two.png',\n                  ),\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget _build22() {\n    final index = _pageIndex.value;\n    final canPay = _canPay(index);\n    final payImg = _getPayImage(index, canPay);\n    return GestureDetector(\n      onTap: canPay ? _onPayCoin : null,\n      onVerticalDragStart: canPay\n          ? (e) {\n              _isHorizontal = false;\n              _onDragDown(e);\n            }\n          : null,\n      onVerticalDragUpdate: canPay ? _onDragUpdate : null,\n      onVerticalDragEnd: canPay ? _onDragEnd : null,\n      onVerticalDragCancel: canPay ? _onDragEnd : null,\n      behavior: HitTestBehavior.opaque,\n      child: ScaleTransition(\n        scale: _scale22Controller,\n        child: SlideTransition(\n          position: _slide22Anim,\n          child: SizedBox(\n            width: 110,\n            height: 155,\n            child: Image.asset(\n              payImg,\n              width: 110,\n              height: 155,\n              cacheWidth: 110.cacheSize(context),\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget _buildBody(bool isV) => Stack(\n    key: _key,\n    clipBehavior: Clip.none,\n    alignment: Alignment.center,\n    children: [\n      if (_hasCopyright)\n        Obx(() {\n          final index = _thunderIndex.value;\n          return Offstage(\n            offstage: index == -1 || index == 3,\n            child: Image.asset(_thunderImages[index.clamp(0, 2)]),\n          );\n        }),\n      Align(\n        alignment: Alignment.bottomCenter,\n        child: Listener(\n          behavior: HitTestBehavior.opaque,\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              if (_hasCopyright)\n                Stack(\n                  clipBehavior: Clip.none,\n                  alignment: Alignment.center,\n                  children: [\n                    Padding(\n                      padding: const EdgeInsets.symmetric(horizontal: 28),\n                      child: SizedBox(\n                        height: 100,\n                        child: PageView(\n                          physics: clampingScrollPhysics,\n                          controller: _controller,\n                          onPageChanged: (index) {\n                            _scale();\n                            _pageIndex.value = index;\n                          },\n                          children: List.generate(\n                            2,\n                            (index) {\n                              return ListenableBuilder(\n                                listenable: _controller!,\n                                builder: (context, child) {\n                                  double factor = index == 0 ? 1 : 0;\n                                  if (_controller!\n                                      .position\n                                      .hasContentDimensions) {\n                                    factor =\n                                        1 - (_controller!.page! - index).abs();\n                                  }\n                                  return Obx(\n                                    () {\n                                      if (_pageIndex.value != index &&\n                                          _isPaying) {\n                                        return const SizedBox.shrink();\n                                      }\n                                      return _buildCoinWidget(index, factor);\n                                    },\n                                  );\n                                },\n                              );\n                            },\n                          ),\n                        ),\n                      ),\n                    ),\n                    Align(\n                      alignment: Alignment.centerLeft,\n                      child: Obx(\n                        () {\n                          final index = _pageIndex.value;\n                          if (_isPaying) {\n                            return const SizedBox.shrink();\n                          }\n                          return GestureDetector(\n                            onTap: index == 0 ? null : () => _onScroll(0),\n                            behavior: HitTestBehavior.opaque,\n                            child: Padding(\n                              padding: const EdgeInsets.only(left: 12),\n                              child: Image.asset(\n                                width: 16,\n                                height: 28,\n                                index == 0\n                                    ? 'assets/images/paycoins/ic_left_disable.png'\n                                    : 'assets/images/paycoins/ic_left.png',\n                                cacheWidth: 16.cacheSize(context),\n                              ),\n                            ),\n                          );\n                        },\n                      ),\n                    ),\n                    Align(\n                      alignment: Alignment.centerRight,\n                      child: Obx(() {\n                        final index = _pageIndex.value;\n                        if (_isPaying) {\n                          return const SizedBox.shrink();\n                        }\n                        return GestureDetector(\n                          behavior: HitTestBehavior.opaque,\n                          onTap: index == 1 ? null : () => _onScroll(1),\n                          child: Padding(\n                            padding: const EdgeInsets.only(right: 12),\n                            child: Image.asset(\n                              width: 16,\n                              height: 28,\n                              index == 1\n                                  ? 'assets/images/paycoins/ic_right_disable.png'\n                                  : 'assets/images/paycoins/ic_right.png',\n                              cacheWidth: 16.cacheSize(context),\n                            ),\n                          ),\n                        );\n                      }),\n                    ),\n                  ],\n                )\n              else\n                SizedBox(height: 100, child: _buildCoinWidget(0, 1)),\n              SizedBox(height: isV ? 25 : 10),\n              if (_hasCopyright)\n                GestureDetector(\n                  behavior: HitTestBehavior.opaque,\n                  onHorizontalDragStart: (e) {\n                    _isHorizontal = true;\n                    _onDragDown(e);\n                  },\n                  onHorizontalDragUpdate: _onDragUpdate,\n                  onHorizontalDragEnd: _onDragEnd,\n                  onHorizontalDragCancel: _onDragEnd,\n                  child: Center(child: Obx(_build22)),\n                )\n              else\n                Center(child: _build22()),\n              if (_coins != null || widget.hasCoin) ...[\n                const SizedBox(height: 10),\n                Center(\n                  child: Text(\n                    '${_coins != null ? '硬币余额：${max(0.0, _coins.toDouble().toPrecision(1))}' : ''}${widget.hasCoin ? '${_coins != null ? '，' : ''}已投1枚硬币' : ''}',\n                    style: const TextStyle(color: Colors.white, fontSize: 13),\n                  ),\n                ),\n              ],\n              const SizedBox(height: 10),\n              Stack(\n                clipBehavior: Clip.none,\n                alignment: Alignment.centerLeft,\n                children: [\n                  GestureDetector(\n                    onTap: () {\n                      final newVal = !_coinWithLike.value;\n                      _coinWithLike.value = newVal;\n                      GStorage.setting.put(SettingBoxKey.coinWithLike, newVal);\n                    },\n                    behavior: HitTestBehavior.opaque,\n                    child: Row(\n                      mainAxisSize: MainAxisSize.min,\n                      children: [\n                        const SizedBox(width: 12),\n                        Obx(\n                          () => Icon(\n                            _coinWithLike.value\n                                ? Icons.check_box_outlined\n                                : Icons.check_box_outline_blank,\n                            size: 20,\n                            color: Colors.white,\n                          ),\n                        ),\n                        const Text(\n                          ' 同时点赞',\n                          style: TextStyle(color: Colors.white),\n                        ),\n                      ],\n                    ),\n                  ),\n                  Center(\n                    child: GestureDetector(\n                      onTap: Get.back,\n                      behavior: HitTestBehavior.opaque,\n                      child: SizedBox(\n                        width: 30,\n                        height: 30,\n                        child: Image.asset(\n                          'assets/images/paycoins/ic_panel_close.png',\n                          width: 30,\n                          height: 30,\n                          cacheWidth: 30.cacheSize(context),\n                        ),\n                      ),\n                    ),\n                  ),\n                ],\n              ),\n              SizedBox(\n                height:\n                    (isV ? 50 : 10) + MediaQuery.viewPaddingOf(context).bottom,\n              ),\n            ],\n          ),\n        ),\n      ),\n    ],\n  );\n\n  late bool _isHorizontal = true;\n  DragStartDetails? _downPos;\n  void _onDragDown(DragStartDetails detail) => _downPos = detail;\n  void _onDragEnd([_]) => _downPos = null;\n  void _onDragUpdate(DragUpdateDetails e) {\n    if (_downPos == null) {\n      return;\n    }\n    final offset = _isHorizontal\n        ? (e.localPosition.dx - _downPos!.localPosition.dx).abs()\n        : (e.localPosition.dy - _downPos!.localPosition.dy).abs();\n    if (offset < 20) {\n      return;\n    }\n    _downPos = null;\n    if (_isHorizontal) {\n      if (e.delta.dx > 0) {\n        if (_pageIndex.value == 1) {\n          _onScroll(0);\n        }\n      } else {\n        if (_pageIndex.value == 0) {\n          _onScroll(1);\n        }\n      }\n    } else {\n      if (e.delta.dy < 0) {\n        _onPayCoin();\n      }\n    }\n  }\n\n  void _onPayCoin() {\n    if (_isPaying) return;\n    _isPaying = true;\n    _pageIndex.refresh();\n    _slide22Controller.forward().whenComplete(() {\n      _slide22Controller.reverse().whenComplete(() {\n        if (_pageIndex.value == 1) {\n          _thunderIndex.value += 1;\n          _timer ??= Timer.periodic(const Duration(milliseconds: 50 ~/ 3), (_) {\n            final index = _thunderIndex.value;\n            if (index == _thunderImages.length) {\n              _cancelTimer();\n            } else {\n              _thunderIndex.value = index + 1;\n            }\n          });\n        }\n        _boxAnimController.forward().whenComplete(_boxAnimController.reverse);\n        _coinController.forward().whenComplete(() {\n          Get.back();\n          widget.onPayCoin(_pageIndex.value + 1, _coinWithLike.value);\n        });\n      });\n    });\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/post_panel/popup_menu_text.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\n\ntypedef PopupMenuItemSelected<T> = bool Function(T value);\n\nclass PopupMenuText<T> extends StatelessWidget {\n  final String title;\n  final ValueGetter<T> value;\n  final PopupMenuItemSelected<T> onSelected;\n  final PopupMenuItemBuilder<T> itemBuilder;\n  final String Function(T) getSelectTitle;\n\n  const PopupMenuText({\n    super.key,\n    required this.title,\n    required this.value,\n    required this.onSelected,\n    required this.itemBuilder,\n    required this.getSelectTitle,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    final select = value();\n    final secondary = Theme.of(context).colorScheme.secondary;\n    return Row(\n      mainAxisSize: MainAxisSize.min,\n      children: [\n        Text('$title: '),\n        PopupMenuButton<T>(\n          initialValue: select,\n          onSelected: (value) {\n            if (value == select) return;\n            if (!onSelected(value)) {\n              (context as Element).markNeedsBuild();\n            }\n          },\n          itemBuilder: itemBuilder,\n          child: Text.rich(\n            style: TextStyle(\n              height: 1,\n              fontSize: 14,\n              color: secondary,\n            ),\n            strutStyle: const StrutStyle(\n              height: 1,\n              leading: 0,\n              fontSize: 14,\n            ),\n            TextSpan(\n              children: [\n                TextSpan(text: getSelectTitle(select)),\n                WidgetSpan(\n                  alignment: .middle,\n                  child: Icon(\n                    size: 14,\n                    MdiIcons.unfoldMoreHorizontal,\n                    color: secondary,\n                  ),\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/post_panel/view.dart",
    "content": "import 'dart:async';\nimport 'dart:math';\n\nimport 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/pair.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/sponsor_block.dart';\nimport 'package:PiliPlus/models/common/sponsor_block/action_type.dart';\nimport 'package:PiliPlus/models/common/sponsor_block/post_segment_model.dart';\nimport 'package:PiliPlus/models/common/sponsor_block/segment_type.dart';\nimport 'package:PiliPlus/pages/common/slide/common_slide_page.dart';\nimport 'package:PiliPlus/pages/video/controller.dart';\nimport 'package:PiliPlus/pages/video/post_panel/popup_menu_text.dart';\nimport 'package:PiliPlus/plugin/pl_player/controller.dart';\nimport 'package:PiliPlus/utils/duration_utils.dart';\nimport 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart' show FilteringTextInputFormatter;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass PostPanel extends CommonSlidePage {\n  const PostPanel({\n    super.key,\n    super.enableSlide,\n    required this.videoDetailController,\n    required this.plPlayerController,\n  });\n\n  final VideoDetailController videoDetailController;\n  final PlPlayerController plPlayerController;\n\n  @override\n  State<PostPanel> createState() => _PostPanelState();\n\n  static void updateSegment({\n    required bool isFirst,\n    required PostSegmentModel item,\n    required double value,\n  }) {\n    if (isFirst) {\n      item.segment.first = value;\n    } else {\n      item.segment.second = value;\n    }\n    if (item.category == SegmentType.poi_highlight ||\n        item.actionType == ActionType.full) {\n      item.segment.second = value;\n    }\n  }\n\n  static Widget segmentWidget(\n    ThemeData theme, {\n    required PostSegmentModel item,\n    required double Function() currentPos, // get real-time pos\n    required double videoDuration,\n  }) {\n    Widget segment(bool isFirst) => Builder(\n      builder: (context) {\n        String value = DurationUtils.formatDuration(\n          isFirst ? item.segment.first : item.segment.second,\n        );\n        return Row(\n          spacing: 5,\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            Text(\n              '${isFirst ? '开始' : '结束'}: $value',\n            ),\n            iconButton(\n              context: context,\n              size: 26,\n              tooltip: '设为当前',\n              icon: const Icon(Icons.my_location),\n              onPressed: () {\n                updateSegment(\n                  isFirst: isFirst,\n                  item: item,\n                  value: currentPos(),\n                );\n                (context as Element).markNeedsBuild();\n              },\n            ),\n            iconButton(\n              context: context,\n              size: 26,\n              tooltip: isFirst ? '视频开头' : '视频结尾',\n              icon: isFirst\n                  ? const Icon(Icons.first_page)\n                  : const Icon(Icons.last_page),\n              onPressed: () {\n                updateSegment(\n                  isFirst: isFirst,\n                  item: item,\n                  value: isFirst ? 0 : videoDuration,\n                );\n                (context as Element).markNeedsBuild();\n              },\n            ),\n            iconButton(\n              context: context,\n              size: 26,\n              tooltip: '编辑',\n              icon: const Icon(Icons.edit),\n              onPressed: () async {\n                String initV = value;\n                final res = await showDialog<String>(\n                  context: context,\n                  builder: (context) => AlertDialog(\n                    content: TextFormField(\n                      initialValue: value,\n                      autofocus: true,\n                      onChanged: (value) => initV = value,\n                      inputFormatters: [\n                        FilteringTextInputFormatter.allow(RegExp(r'[\\d:.]+')),\n                      ],\n                    ),\n                    actions: [\n                      TextButton(\n                        onPressed: Get.back,\n                        child: Text(\n                          '取消',\n                          style: TextStyle(\n                            color: theme.colorScheme.outline,\n                          ),\n                        ),\n                      ),\n                      TextButton(\n                        onPressed: () => Get.back(result: initV),\n                        child: const Text('确定'),\n                      ),\n                    ],\n                  ),\n                );\n\n                if (res != null) {\n                  try {\n                    List<num> split = res\n                        .split(':')\n                        .reversed\n                        .map(num.parse)\n                        .toList();\n                    double duration = 0;\n                    for (int i = 0; i < split.length; i++) {\n                      duration += split[i] * pow(60, i);\n                    }\n                    if (duration <= videoDuration) {\n                      updateSegment(\n                        isFirst: isFirst,\n                        item: item,\n                        value: duration,\n                      );\n                      (context as Element).markNeedsBuild();\n                    }\n                  } catch (e) {\n                    if (kDebugMode) debugPrint(e.toString());\n                  }\n                }\n              },\n            ),\n          ],\n        );\n      },\n    );\n\n    if (item.category != SegmentType.poi_highlight) {\n      return Wrap(\n        runSpacing: 8,\n        spacing: 16,\n        children: [segment(true), segment(false)],\n      );\n    }\n    return segment(true);\n  }\n}\n\nclass _PostPanelState extends State<PostPanel>\n    with SingleTickerProviderStateMixin, CommonSlideMixin {\n  late final VideoDetailController videoDetailController =\n      widget.videoDetailController;\n  late final PlPlayerController plPlayerController = widget.plPlayerController;\n  late final List<PostSegmentModel> list = videoDetailController.postList;\n\n  late final double videoDuration =\n      plPlayerController.duration.value.inMilliseconds / 1000;\n\n  double currentPos() => plPlayerController.position.inMilliseconds / 1000;\n\n  @override\n  Widget buildPage(ThemeData theme) {\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        primary: false,\n        toolbarHeight: 45,\n        automaticallyImplyLeading: false,\n        titleSpacing: 16,\n        title: const Text('提交片段'),\n        actions: [\n          iconButton(\n            size: 32,\n            context: context,\n            tooltip: '添加片段',\n            onPressed: () {\n              setState(() {\n                list.insert(\n                  0,\n                  PostSegmentModel(\n                    segment: Pair(\n                      first: 0,\n                      second: currentPos(),\n                    ),\n                    category: SegmentType.sponsor,\n                    actionType: ActionType.skip,\n                  ),\n                );\n              });\n            },\n            icon: const Icon(Icons.add),\n          ),\n          const SizedBox(width: 10),\n          iconButton(\n            size: 32,\n            context: context,\n            tooltip: '关闭',\n            onPressed: Get.back,\n            icon: const Icon(Icons.close),\n          ),\n          const SizedBox(width: 16),\n        ],\n      ),\n      body: enableSlide ? slideList(theme) : buildList(theme),\n    );\n  }\n\n  late Key _key;\n  late bool _isNested;\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    final controller = PrimaryScrollController.of(context);\n    _isNested = controller is ExtendedNestedScrollController;\n    _key = ValueKey(controller.hashCode);\n  }\n\n  @override\n  Widget buildList(ThemeData theme) {\n    if (list.isEmpty) {\n      return const HttpError(isSliver: false);\n    }\n    final bottom = MediaQuery.viewPaddingOf(context).bottom;\n    Widget child = ListView.builder(\n      key: _key,\n      physics: const AlwaysScrollableScrollPhysics(),\n      padding: EdgeInsets.only(bottom: 88 + bottom),\n      itemCount: list.length,\n      itemBuilder: (context, index) {\n        return _buildItem(theme, index, list[index]);\n      },\n    );\n    if (_isNested) {\n      child = ExtendedVisibilityDetector(\n        uniqueKey: const Key('post-panel'),\n        child: child,\n      );\n    }\n    return Stack(\n      clipBehavior: Clip.none,\n      children: [\n        child,\n        Positioned(\n          right: kFloatingActionButtonMargin,\n          bottom: kFloatingActionButtonMargin + bottom,\n          child: FloatingActionButton(\n            tooltip: '提交',\n            onPressed: () => showDialog(\n              context: context,\n              builder: (context) => AlertDialog(\n                title: const Text('确定无误再提交'),\n                actions: [\n                  TextButton(\n                    onPressed: Get.back,\n                    child: Text(\n                      '取消',\n                      style: TextStyle(color: theme.colorScheme.outline),\n                    ),\n                  ),\n                  TextButton(\n                    onPressed: _onPost,\n                    child: const Text('确定提交'),\n                  ),\n                ],\n              ),\n            ),\n            child: const Icon(Icons.check),\n          ),\n        ),\n      ],\n    );\n  }\n\n  Future<void> _onPost() async {\n    Get.back();\n    final res = await SponsorBlock.postSkipSegments(\n      bvid: videoDetailController.bvid,\n      cid: videoDetailController.cid.value,\n      videoDuration: videoDuration,\n      segments: list,\n    );\n\n    if (res case Success(:final response)) {\n      Get.back();\n      SmartDialog.showToast('提交成功');\n      list.clear();\n      videoDetailController.handleSBData(response);\n      if (videoDetailController.blockListener == null) {\n        videoDetailController.initSkip();\n      }\n    } else {\n      SmartDialog.showToast('提交失败: $res');\n    }\n  }\n\n  Widget _buildItem(ThemeData theme, int index, PostSegmentModel item) {\n    return Stack(\n      clipBehavior: Clip.none,\n      children: [\n        Container(\n          width: double.infinity,\n          margin: const EdgeInsets.symmetric(\n            horizontal: 16,\n            vertical: 5,\n          ),\n          padding: const EdgeInsets.all(12),\n          decoration: BoxDecoration(\n            color: theme.colorScheme.onInverseSurface,\n            borderRadius: const BorderRadius.all(Radius.circular(12)),\n          ),\n          child: Builder(\n            builder: (context) => Column(\n              spacing: 8,\n              mainAxisSize: MainAxisSize.min,\n              crossAxisAlignment: CrossAxisAlignment.stretch,\n              children: [\n                if (item.actionType != ActionType.full)\n                  PostPanel.segmentWidget(\n                    theme,\n                    item: item,\n                    currentPos: currentPos,\n                    videoDuration: videoDuration,\n                  ),\n                Wrap(\n                  runSpacing: 8,\n                  spacing: 16,\n                  children: [\n                    PopupMenuText(\n                      title: '分类',\n                      value: () => item.category,\n                      onSelected: (e) {\n                        bool flag = false;\n                        if (item.category == SegmentType.exclusive_access ||\n                            item.category == SegmentType.poi_highlight) {\n                          flag = true;\n                        }\n                        item.category = e;\n                        List<ActionType> constraintList = e.toActionType;\n                        if (!constraintList.contains(item.actionType)) {\n                          item.actionType = constraintList.first;\n                          flag = true;\n                        }\n                        switch (e) {\n                          case SegmentType.poi_highlight:\n                            PostPanel.updateSegment(\n                              isFirst: false,\n                              item: item,\n                              value: item.segment.first,\n                            );\n                            break;\n                          case SegmentType.exclusive_access:\n                            PostPanel.updateSegment(\n                              isFirst: true,\n                              item: item,\n                              value: 0,\n                            );\n                            break;\n                          default:\n                        }\n                        if (flag) {\n                          (context as Element).markNeedsBuild();\n                        }\n                        return flag;\n                      },\n                      itemBuilder: (context) => SegmentType.values\n                          .map(\n                            (e) =>\n                                PopupMenuItem(value: e, child: Text(e.title)),\n                          )\n                          .toList(),\n                      getSelectTitle: (category) => category.title,\n                    ),\n                    PopupMenuText(\n                      title: '行为类别',\n                      value: () => item.actionType,\n                      onSelected: (e) {\n                        bool flag = false;\n                        if (item.actionType == ActionType.full) {\n                          flag = true;\n                        }\n                        item.actionType = e;\n                        if (e == ActionType.full) {\n                          flag = true;\n                          PostPanel.updateSegment(\n                            isFirst: true,\n                            item: item,\n                            value: 0,\n                          );\n                        }\n                        if (flag) {\n                          (context as Element).markNeedsBuild();\n                        }\n                        return flag;\n                      },\n                      itemBuilder: (context) => ActionType.values\n                          .map(\n                            (e) => PopupMenuItem(\n                              enabled: item.category.toActionType.contains(e),\n                              value: e,\n                              child: Text(e.title),\n                            ),\n                          )\n                          .toList(),\n                      getSelectTitle: (i) => i.title,\n                    ),\n                  ],\n                ),\n              ],\n            ),\n          ),\n        ),\n        Positioned(\n          top: 0,\n          right: 4,\n          child: iconButton(\n            context: context,\n            size: 26,\n            tooltip: '移除',\n            icon: const Icon(Icons.clear),\n            onPressed: () {\n              setState(() {\n                list.removeAt(index);\n              });\n            },\n          ),\n        ),\n        Positioned(\n          top: 0,\n          left: 4,\n          child: iconButton(\n            context: context,\n            size: 26,\n            tooltip: '预览',\n            icon: const Icon(Icons.preview_outlined),\n            onPressed: () async {\n              final player = plPlayerController.videoPlayerController;\n              if (player != null) {\n                final start = (item.segment.first * 1000).round();\n                final seek = max(0, start - 2000);\n                await player.seek(Duration(milliseconds: seek));\n                if (!player.state.playing) {\n                  await player.play();\n                }\n                Future<void> seekTo() => player.seek(\n                  Duration(milliseconds: (item.segment.second * 1000).round()),\n                );\n                if (start > seek) {\n                  final posSub = player.stream.position.listen(\n                    null,\n                    cancelOnError: true,\n                  );\n                  final timer = Timer(\n                    const Duration(seconds: 10),\n                    posSub.cancel,\n                  );\n                  final duration = Duration(milliseconds: start);\n                  posSub.onData((pos) {\n                    if (pos >= duration) {\n                      seekTo();\n                      timer.cancel();\n                      posSub.cancel();\n                    }\n                  });\n                } else {\n                  seekTo();\n                }\n              }\n            },\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/related/controller.dart",
    "content": "import 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/video.dart';\nimport 'package:PiliPlus/models/model_hot_video_item.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:get/get.dart';\n\nclass RelatedController\n    extends CommonListController<List<HotVideoItemModel>?, HotVideoItemModel> {\n  RelatedController({this.autoQuery = true});\n  String bvid = Get.arguments['bvid'];\n  final bool autoQuery;\n\n  @override\n  void onInit() {\n    super.onInit();\n    if (autoQuery) {\n      queryData();\n    }\n  }\n\n  @override\n  Future<LoadingState<List<HotVideoItemModel>?>> customGetData() =>\n      VideoHttp.relatedVideoList(bvid: bvid);\n}\n"
  },
  {
    "path": "lib/pages/video/related/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/video_card/video_card_h.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/model_hot_video_item.dart';\nimport 'package:PiliPlus/pages/video/related/controller.dart';\nimport 'package:PiliPlus/utils/extension/get_ext.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass RelatedVideoPanel extends StatefulWidget {\n  const RelatedVideoPanel({super.key, required this.heroTag});\n  final String heroTag;\n  @override\n  State<RelatedVideoPanel> createState() => _RelatedVideoPanelState();\n}\n\nclass _RelatedVideoPanelState extends State<RelatedVideoPanel> with GridMixin {\n  late final RelatedController _relatedController;\n\n  @override\n  void initState() {\n    super.initState();\n    _relatedController = Get.putOrFind(\n      RelatedController.new,\n      tag: widget.heroTag,\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return SliverPadding(\n      padding: const EdgeInsets.only(top: 7, bottom: 100),\n      sliver: Obx(() => _buildBody(_relatedController.loadingState.value)),\n    );\n  }\n\n  Widget _buildBody(LoadingState<List<HotVideoItemModel>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => gridSkeleton,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverGrid.builder(\n                gridDelegate: gridDelegate,\n                itemBuilder: (context, index) {\n                  return VideoCardH(\n                    videoItem: response[index],\n                    onRemove: () => _relatedController.loadingState\n                      ..value.data!.removeAt(index)\n                      ..refresh(),\n                  );\n                },\n                itemCount: response.length,\n              )\n            : const SliverToBoxAdapter(),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _relatedController.onReload,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/reply/controller.dart",
    "content": "import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'\n    show MainListReply, ReplyInfo;\nimport 'package:PiliPlus/grpc/reply.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/video/video_type.dart';\nimport 'package:PiliPlus/pages/common/reply_controller.dart';\nimport 'package:PiliPlus/pages/video/controller.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\nimport 'package:get/get.dart';\n\nclass VideoReplyController extends ReplyController<MainListReply> {\n  VideoReplyController({\n    required this.aid,\n    required this.videoType,\n    required this.heroTag,\n  });\n  int aid;\n  final VideoType videoType;\n  late final isPugv = videoType == VideoType.pugv;\n\n  final String heroTag;\n  late final videoCtr = Get.find<VideoDetailController>(tag: heroTag);\n\n  @override\n  dynamic get sourceId => IdUtils.av2bv(aid);\n\n  @override\n  List<ReplyInfo>? getDataList(MainListReply response) {\n    return response.replies;\n  }\n\n  @override\n  Future<LoadingState<MainListReply>> customGetData() => ReplyGrpc.mainList(\n    oid: isPugv ? videoCtr.epId! : aid,\n    type: videoType.replyType,\n    mode: mode.value,\n    cursorNext: cursorNext,\n    offset: paginationReply?.nextOffset,\n  );\n}\n"
  },
  {
    "path": "lib/pages/video/reply/view.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/skeleton/video_reply.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/sliver/sliver_floating_header.dart';\nimport 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'\n    show ReplyInfo;\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/pages/common/fab_mixin.dart';\nimport 'package:PiliPlus/pages/video/reply/controller.dart';\nimport 'package:PiliPlus/pages/video/reply/widgets/reply_item_grpc.dart';\nimport 'package:PiliPlus/pages/video/reply_reply/view.dart';\nimport 'package:PiliPlus/utils/feed_back.dart';\nimport 'package:easy_debounce/easy_throttle.dart';\nimport 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass VideoReplyPanel extends StatefulWidget {\n  const VideoReplyPanel({\n    super.key,\n    this.replyLevel = 1,\n    required this.heroTag,\n    required this.isNested,\n  });\n\n  final int replyLevel;\n  final String heroTag;\n  final bool isNested;\n\n  @override\n  State<VideoReplyPanel> createState() => _VideoReplyPanelState();\n}\n\nclass _VideoReplyPanelState extends State<VideoReplyPanel>\n    with\n        AutomaticKeepAliveClientMixin,\n        SingleTickerProviderStateMixin,\n        FabMixin {\n  late VideoReplyController _videoReplyController;\n\n  String get heroTag => widget.heroTag;\n\n  @override\n  bool get wantKeepAlive => true;\n\n  @override\n  void initState() {\n    super.initState();\n    _videoReplyController = Get.find<VideoReplyController>(tag: heroTag);\n    if (_videoReplyController.loadingState.value is Loading) {\n      _videoReplyController.queryData();\n    }\n  }\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    bottom = MediaQuery.viewPaddingOf(context).bottom;\n  }\n\n  late double bottom;\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    final theme = Theme.of(context);\n    final child = NotificationListener<UserScrollNotification>(\n      onNotification: (notification) {\n        switch (notification.direction) {\n          case .forward:\n            showFab();\n          case .reverse:\n            hideFab();\n          case _:\n        }\n        return false;\n      },\n      child: refreshIndicator(\n        onRefresh: _videoReplyController.onRefresh,\n        isClampingScrollPhysics: widget.isNested,\n        child: Stack(\n          clipBehavior: Clip.none,\n          children: [\n            CustomScrollView(\n              controller: widget.isNested\n                  ? null\n                  : _videoReplyController.scrollController,\n              physics: const AlwaysScrollableScrollPhysics(),\n              key: const PageStorageKey(_VideoReplyPanelState),\n              slivers: [\n                SliverFloatingHeaderWidget(\n                  backgroundColor: theme.colorScheme.surface,\n                  child: Padding(\n                    padding: const .fromLTRB(12, 2.5, 6, 2.5),\n                    child: Row(\n                      mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                      children: [\n                        Obx(\n                          () => Text(\n                            _videoReplyController.sortType.value.title,\n                            style: const TextStyle(fontSize: 13),\n                          ),\n                        ),\n                        TextButton.icon(\n                          style: StyleString.buttonStyle,\n                          onPressed: _videoReplyController.queryBySort,\n                          icon: Icon(\n                            Icons.sort,\n                            size: 16,\n                            color: theme.colorScheme.secondary,\n                          ),\n                          label: Obx(\n                            () => Text(\n                              _videoReplyController.sortType.value.label,\n                              style: TextStyle(\n                                fontSize: 13,\n                                color: theme.colorScheme.secondary,\n                              ),\n                            ),\n                          ),\n                        ),\n                      ],\n                    ),\n                  ),\n                ),\n                Obx(\n                  () => _buildBody(\n                    theme,\n                    _videoReplyController.loadingState.value,\n                  ),\n                ),\n              ],\n            ),\n            Positioned(\n              right: 0,\n              bottom: 0,\n              child: SlideTransition(\n                position: fabAnimation,\n                child: Padding(\n                  padding: .only(\n                    right: kFloatingActionButtonMargin,\n                    bottom: kFloatingActionButtonMargin + bottom,\n                  ),\n                  child: FloatingActionButton(\n                    heroTag: null,\n                    onPressed: () {\n                      feedBack();\n                      _videoReplyController.onReply(\n                        null,\n                        oid: _videoReplyController.aid,\n                        replyType: _videoReplyController.videoType.replyType,\n                      );\n                    },\n                    tooltip: '发表评论',\n                    child: const Icon(Icons.reply),\n                  ),\n                ),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n    if (widget.isNested) {\n      return ExtendedVisibilityDetector(\n        uniqueKey: const Key('reply-list'),\n        child: child,\n      );\n    }\n    return child;\n  }\n\n  Widget _buildBody(\n    ThemeData theme,\n    LoadingState<List<ReplyInfo>?> loadingState,\n  ) {\n    return switch (loadingState) {\n      Loading() => SliverList.builder(\n        itemBuilder: (context, index) => const VideoReplySkeleton(),\n        itemCount: 5,\n      ),\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverList.builder(\n                itemBuilder: (context, index) {\n                  if (index == response.length) {\n                    _videoReplyController.onLoadMore();\n                    return Container(\n                      height: 125,\n                      alignment: Alignment.center,\n                      margin: EdgeInsets.only(bottom: bottom),\n                      child: Text(\n                        _videoReplyController.isEnd ? '没有更多了' : '加载中...',\n                        textAlign: TextAlign.center,\n                        style: TextStyle(\n                          fontSize: 12,\n                          color: theme.colorScheme.outline,\n                        ),\n                      ),\n                    );\n                  } else {\n                    return ReplyItemGrpc(\n                      replyItem: response[index],\n                      replyLevel: widget.replyLevel,\n                      replyReply: replyReply,\n                      onReply: _videoReplyController.onReply,\n                      onDelete: (item, subIndex) =>\n                          _videoReplyController.onRemove(index, item, subIndex),\n                      upMid: _videoReplyController.upMid,\n                      getTag: () => heroTag,\n                      onCheckReply: (item) => _videoReplyController\n                          .onCheckReply(item, isManual: true),\n                      onToggleTop: (item) => _videoReplyController.onToggleTop(\n                        item,\n                        index,\n                        _videoReplyController.aid,\n                        _videoReplyController.videoType.replyType,\n                      ),\n                    );\n                  }\n                },\n                itemCount: response.length + 1,\n              )\n            : HttpError(\n                errMsg: '还没有评论',\n                onReload: _videoReplyController.onReload,\n              ),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _videoReplyController.onReload,\n      ),\n    };\n  }\n\n  // 展示二级回复\n  void replyReply(ReplyInfo replyItem, int? id) {\n    EasyThrottle.throttle('replyReply', const Duration(milliseconds: 500), () {\n      int oid = replyItem.oid.toInt();\n      int rpid = replyItem.id.toInt();\n      showBottomSheet(\n        context: context,\n        backgroundColor: Colors.transparent,\n        constraints: const BoxConstraints(),\n        builder: (context) => VideoReplyReplyPanel(\n          id: id,\n          oid: oid,\n          rpid: rpid,\n          firstFloor: replyItem.replyControl.isNote ? null : replyItem,\n          replyType: _videoReplyController.videoType.replyType,\n          isVideoDetail: true,\n          isNested: widget.isNested,\n        ),\n      );\n    });\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/reply/widgets/reply_item_grpc.dart",
    "content": "import 'dart:math';\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/dialog/report.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text/text.dart' as custom_text;\nimport 'package:PiliPlus/common/widgets/gesture/tap_gesture_recognizer.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/image_grid/image_grid_view.dart';\nimport 'package:PiliPlus/common/widgets/pendant_avatar.dart';\nimport 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'\n    show ReplyInfo, ReplyControl, Content, Url;\nimport 'package:PiliPlus/http/reply.dart';\nimport 'package:PiliPlus/http/video.dart';\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/pages/dynamics/widgets/vote.dart';\nimport 'package:PiliPlus/pages/save_panel/view.dart';\nimport 'package:PiliPlus/pages/video/controller.dart';\nimport 'package:PiliPlus/pages/video/reply/widgets/zan_grpc.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/app_scheme.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/duration_utils.dart';\nimport 'package:PiliPlus/utils/extension/context_ext.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/feed_back.dart';\nimport 'package:PiliPlus/utils/image_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/url_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:cached_network_image/cached_network_image.dart';\nimport 'package:fixnum/fixnum.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:protobuf/protobuf.dart';\n\nclass ReplyItemGrpc extends StatelessWidget {\n  const ReplyItemGrpc({\n    super.key,\n    required this.replyItem,\n    required this.replyLevel,\n    this.replyReply,\n    this.needDivider = true,\n    this.onReply,\n    this.onDelete,\n    this.upMid,\n    this.showDialogue,\n    this.getTag,\n    this.onViewImage,\n    this.onCheckReply,\n    this.onToggleTop,\n    this.jumpToDialogue,\n  });\n  final ReplyInfo replyItem;\n  final int replyLevel;\n  final Function(ReplyInfo replyItem, int? rpid)? replyReply;\n  final bool needDivider;\n  final ValueChanged<ReplyInfo>? onReply;\n  final Function(ReplyInfo replyItem, int? subIndex)? onDelete;\n  final Int64? upMid;\n  final VoidCallback? showDialogue;\n  final Function? getTag;\n  final VoidCallback? onViewImage;\n  final ValueChanged<ReplyInfo>? onCheckReply;\n  final ValueChanged<ReplyInfo>? onToggleTop;\n  final VoidCallback? jumpToDialogue;\n\n  static final _voteRegExp = RegExp(r\"^\\{vote:\\d+?\\}$\");\n  static final _timeRegExp = RegExp(r'^(?:\\d+[:：])?\\d+[:：]\\d+$');\n  static bool enableWordRe = Pref.enableWordRe;\n  static int? replyLengthLimit = Pref.replyLengthLimit;\n\n  @override\n  Widget build(BuildContext context) {\n    final ThemeData theme = Theme.of(context);\n\n    void showMore() => showModalBottomSheet(\n      context: context,\n      useSafeArea: true,\n      isScrollControlled: true,\n      constraints: BoxConstraints(\n        maxWidth: min(640, context.mediaQueryShortestSide),\n      ),\n      builder: (context) {\n        return morePanel(\n          context: context,\n          item: replyItem,\n          onDelete: () => onDelete?.call(replyItem, null),\n          isSubReply: false,\n        );\n      },\n    );\n\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onTap: () => replyReply?.call(replyItem, null),\n        onLongPress: showMore,\n        onSecondaryTap: PlatformUtils.isMobile ? null : showMore,\n        child: _buildContent(context, theme),\n      ),\n    );\n  }\n\n  Widget _buildContent(BuildContext context, ThemeData theme) {\n    Widget child = Padding(\n      padding: const .fromLTRB(12, 14, 8, 5),\n      child: content(context, theme),\n    );\n    const double top = 8.0;\n    const double right = 12.0;\n    const double height = 38.0;\n    if (PendantAvatar.showDynDecorate && replyItem.member.hasGarbCardImage()) {\n      child = Stack(\n        clipBehavior: .none,\n        children: [\n          child,\n          Positioned(\n            top: top,\n            right: right,\n            height: height,\n            child: CachedNetworkImage(\n              height: height,\n              memCacheHeight: height.cacheSize(context),\n              imageUrl: ImageUtils.safeThumbnailUrl(\n                replyItem.member.garbCardImage,\n              ),\n              placeholder: (_, _) => const SizedBox.shrink(),\n            ),\n          ),\n          if (replyItem.member.hasGarbCardNumber())\n            Positioned(\n              top: top,\n              right: right,\n              height: height,\n              child: Center(\n                child: Text(\n                  'NO.\\n${replyItem.member.garbCardNumber}',\n                  style: TextStyle(\n                    fontSize: 8,\n                    fontFamily: 'digital_id_num',\n                    color: replyItem.member.garbCardFanColor.startsWith('#')\n                        ? Utils.parseColor(replyItem.member.garbCardFanColor)\n                        : null,\n                  ),\n                ),\n              ),\n            ),\n        ],\n      );\n    }\n    return Column(\n      crossAxisAlignment: .stretch,\n      children: [\n        child,\n        if (needDivider)\n          Divider(\n            indent: 55,\n            endIndent: 15,\n            height: 0.3,\n            color: theme.colorScheme.outline.withValues(alpha: 0.08),\n          ),\n      ],\n    );\n  }\n\n  Widget content(BuildContext context, ThemeData theme) {\n    final padding = EdgeInsets.only(left: replyLevel == 0 ? 6 : 45, right: 6);\n    return Column(\n      mainAxisSize: .min,\n      crossAxisAlignment: .start,\n      children: [\n        GestureDetector(\n          behavior: HitTestBehavior.opaque,\n          onTap: () {\n            feedBack();\n            Get.toNamed('/member?mid=${replyItem.mid}');\n          },\n          child: Row(\n            mainAxisSize: .min,\n            crossAxisAlignment: .center,\n            spacing: 12,\n            children: [\n              PendantAvatar(\n                avatar: replyItem.member.face,\n                size: 34,\n                badgeSize: 14,\n                isVip: replyItem.member.vipStatus > 0,\n                officialType: replyItem.member.officialVerifyType.toInt(),\n                garbPendantImage: replyItem.member.hasGarbPendantImage()\n                    ? replyItem.member.garbPendantImage\n                    : null,\n              ),\n              Column(\n                crossAxisAlignment: CrossAxisAlignment.start,\n                mainAxisSize: MainAxisSize.min,\n                children: [\n                  Row(\n                    mainAxisSize: MainAxisSize.min,\n                    spacing: 6,\n                    children: [\n                      Text(\n                        replyItem.member.name,\n                        style: TextStyle(\n                          color:\n                              (replyItem.member.vipStatus > 0 &&\n                                  replyItem.member.vipType == 2)\n                              ? theme.colorScheme.vipColor\n                              : theme.colorScheme.outline,\n                          fontSize: 13,\n                        ),\n                      ),\n                      Image.asset(\n                        Utils.levelName(\n                          replyItem.member.level,\n                          isSeniorMember: replyItem.member.isSeniorMember == 1,\n                        ),\n                        height: 11,\n                        cacheHeight: 11.cacheSize(context),\n                      ),\n                      if (replyItem.mid == upMid)\n                        const PBadge(\n                          text: 'UP',\n                          size: PBadgeSize.small,\n                          isStack: false,\n                          fontSize: 9,\n                        ),\n                    ],\n                  ),\n                  Row(\n                    mainAxisSize: MainAxisSize.min,\n                    children: <Widget>[\n                      Text(\n                        replyLevel == 0\n                            ? DateFormatUtils.format(\n                                replyItem.ctime.toInt(),\n                                format: DateFormatUtils.longFormatDs,\n                              )\n                            : DateFormatUtils.dateFormat(\n                                replyItem.ctime.toInt(),\n                              ),\n                        style: TextStyle(\n                          fontSize: theme.textTheme.labelSmall!.fontSize,\n                          color: theme.colorScheme.outline,\n                        ),\n                      ),\n                      if (replyItem.replyControl.hasLocation())\n                        Text(\n                          ' • ${replyItem.replyControl.location}',\n                          style: TextStyle(\n                            fontSize: theme.textTheme.labelSmall!.fontSize,\n                            color: theme.colorScheme.outline,\n                          ),\n                        ),\n                    ],\n                  ),\n                ],\n              ),\n            ],\n          ),\n        ),\n        const SizedBox(height: 10),\n        Padding(\n          padding: padding,\n          child: custom_text.Text.rich(\n            primary: theme.colorScheme.primary,\n            style: TextStyle(\n              height: 1.75,\n              fontSize: theme.textTheme.bodyMedium!.fontSize,\n            ),\n            maxLines: replyLevel == 1 ? replyLengthLimit : null,\n            TextSpan(\n              children: [\n                if (replyItem.replyControl.isUpTop) ...[\n                  const WidgetSpan(\n                    alignment: PlaceholderAlignment.middle,\n                    child: PBadge(\n                      text: 'TOP',\n                      size: PBadgeSize.small,\n                      isStack: false,\n                      type: PBadgeType.line_primary,\n                      fontSize: 9,\n                      textScaleFactor: 1,\n                    ),\n                  ),\n                  const TextSpan(text: ' '),\n                ],\n                buildContent(context, theme, replyItem),\n              ],\n            ),\n          ),\n        ),\n        if (replyItem.content.pictures.isNotEmpty) ...[\n          Padding(\n            padding: padding,\n            child: ImageGridView(\n              picArr: replyItem.content.pictures\n                  .map(\n                    (item) => ImageModel(\n                      width: item.imgWidth,\n                      height: item.imgHeight,\n                      url: item.imgSrc,\n                    ),\n                  )\n                  .toList(),\n              onViewImage: onViewImage,\n            ),\n          ),\n          const SizedBox(height: 4),\n        ],\n        if (replyLevel != 0) ...[\n          const SizedBox(height: 4),\n          buttonAction(context, theme, replyItem.replyControl),\n        ],\n        if (replyLevel == 1 && replyItem.count > Int64.ZERO) ...[\n          Padding(\n            padding: const EdgeInsets.only(top: 5, bottom: 12),\n            child: replyItemRow(context, theme, replyItem.replies),\n          ),\n        ],\n      ],\n    );\n  }\n\n  Widget buttonAction(\n    BuildContext context,\n    ThemeData theme,\n    ReplyControl replyControl,\n  ) {\n    final textStyle = TextStyle(\n      fontSize: theme.textTheme.labelMedium!.fontSize,\n      color: theme.colorScheme.outline,\n      fontWeight: FontWeight.normal,\n    );\n    final buttonStyle = TextButton.styleFrom(\n      padding: EdgeInsets.zero,\n      tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n      visualDensity: VisualDensity.compact,\n    );\n    return Row(\n      children: <Widget>[\n        const SizedBox(width: 36),\n        SizedBox(\n          height: 32,\n          child: TextButton(\n            style: buttonStyle,\n            onPressed: () {\n              feedBack();\n              onReply?.call(replyItem);\n            },\n            child: Row(\n              children: [\n                Icon(\n                  Icons.reply,\n                  size: 18,\n                  color: theme.colorScheme.outline.withValues(alpha: 0.8),\n                ),\n                const SizedBox(width: 3),\n                Text('回复', style: textStyle),\n              ],\n            ),\n          ),\n        ),\n        const SizedBox(width: 2),\n        if (replyItem.replyControl.cardLabels.isNotEmpty) ...[\n          Text(\n            replyItem.replyControl.cardLabels\n                .map((e) => e.textContent)\n                .join('  '),\n            style: textStyle.copyWith(color: theme.colorScheme.secondary),\n          ),\n          const SizedBox(width: 2),\n        ],\n        if (replyLevel == 2 && needDivider && replyItem.id != replyItem.dialog)\n          SizedBox(\n            height: 32,\n            child: TextButton(\n              onPressed: showDialogue,\n              style: buttonStyle,\n              child: Text('查看对话', style: textStyle),\n            ),\n          )\n        else if (replyLevel == 3 &&\n            needDivider &&\n            replyItem.parent != replyItem.root)\n          SizedBox(\n            height: 32,\n            child: TextButton(\n              onPressed: jumpToDialogue,\n              style: buttonStyle,\n              child: Text('跳转回复', style: textStyle),\n            ),\n          ),\n        const Spacer(),\n        ZanButtonGrpc(replyItem: replyItem),\n        const SizedBox(width: 5),\n      ],\n    );\n  }\n\n  Widget replyItemRow(\n    BuildContext context,\n    ThemeData theme,\n    List<ReplyInfo> replies,\n  ) {\n    final extraRow = replies.length < replyItem.count.toInt();\n    late final length = replies.length + (extraRow ? 1 : 0);\n    return Padding(\n      padding: const EdgeInsets.only(left: 42, right: 4),\n      child: Material(\n        color: theme.colorScheme.onInverseSurface,\n        borderRadius: const BorderRadius.all(Radius.circular(6)),\n        clipBehavior: Clip.hardEdge,\n        animationDuration: Duration.zero,\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.stretch,\n          children: [\n            if (replies.isNotEmpty)\n              ...List.generate(replies.length, (index) {\n                final childReply = replies[index];\n                EdgeInsets padding;\n                if (length == 1) {\n                  padding = const EdgeInsets.fromLTRB(8, 5, 8, 5);\n                } else {\n                  if (index == 0) {\n                    padding = const EdgeInsets.fromLTRB(8, 8, 8, 4);\n                  } else if (index == length - 1) {\n                    padding = const EdgeInsets.fromLTRB(8, 4, 8, 8);\n                  } else {\n                    padding = const EdgeInsets.fromLTRB(8, 4, 8, 4);\n                  }\n                }\n                void showMore() => showModalBottomSheet(\n                  context: context,\n                  useSafeArea: true,\n                  isScrollControlled: true,\n                  constraints: BoxConstraints(\n                    maxWidth: min(640, context.mediaQueryShortestSide),\n                  ),\n                  builder: (context) {\n                    return morePanel(\n                      context: context,\n                      item: childReply,\n                      onDelete: () => onDelete?.call(replyItem, index),\n                      isSubReply: true,\n                    );\n                  },\n                );\n                return InkWell(\n                  onTap: () =>\n                      replyReply?.call(replyItem, childReply.id.toInt()),\n                  onLongPress: showMore,\n                  onSecondaryTap: PlatformUtils.isMobile ? null : showMore,\n                  child: Padding(\n                    padding: padding,\n                    child: Text.rich(\n                      style: TextStyle(\n                        fontSize: theme.textTheme.bodyMedium!.fontSize,\n                        color: theme.colorScheme.onSurface.withValues(\n                          alpha: 0.85,\n                        ),\n                        height: 1.6,\n                      ),\n                      overflow: TextOverflow.ellipsis,\n                      maxLines: 2,\n                      TextSpan(\n                        children: [\n                          TextSpan(\n                            text: childReply.member.name,\n                            style: TextStyle(\n                              color: theme.colorScheme.primary,\n                            ),\n                            recognizer: NoDeadlineTapGestureRecognizer()\n                              ..onTap = () {\n                                feedBack();\n                                Get.toNamed(\n                                  '/member?mid=${childReply.member.mid}',\n                                );\n                              },\n                          ),\n                          if (childReply.mid == upMid) ...[\n                            const TextSpan(text: ' '),\n                            const WidgetSpan(\n                              alignment: PlaceholderAlignment.middle,\n                              child: PBadge(\n                                text: 'UP',\n                                size: PBadgeSize.small,\n                                isStack: false,\n                                fontSize: 9,\n                                textScaleFactor: 1,\n                              ),\n                            ),\n                            const TextSpan(text: ' '),\n                          ],\n                          TextSpan(\n                            text: childReply.root == childReply.parent\n                                ? ': '\n                                : childReply.mid == upMid\n                                ? ''\n                                : ' ',\n                          ),\n                          buildContent(context, theme, childReply),\n                        ],\n                      ),\n                    ),\n                  ),\n                );\n              }),\n            if (extraRow)\n              InkWell(\n                onTap: () => replyReply?.call(replyItem, null),\n                child: Padding(\n                  padding: length == 1\n                      ? const EdgeInsets.fromLTRB(8, 6, 8, 6)\n                      : const EdgeInsets.fromLTRB(8, 5, 8, 8),\n                  child: Text.rich(\n                    TextSpan(\n                      style: TextStyle(\n                        fontSize: theme.textTheme.labelMedium!.fontSize,\n                      ),\n                      children: [\n                        if (replyItem.replyControl.upReply)\n                          TextSpan(\n                            text: 'UP主等人 ',\n                            style: TextStyle(\n                              color: theme.colorScheme.onSurface.withValues(\n                                alpha: 0.85,\n                              ),\n                            ),\n                          ),\n                        TextSpan(\n                          text: '共${replyItem.count}条回复',\n                          style: TextStyle(\n                            color: theme.colorScheme.primary,\n                          ),\n                        ),\n                      ],\n                    ),\n                  ),\n                ),\n              ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  InlineSpan buildContent(\n    BuildContext context,\n    ThemeData theme,\n    ReplyInfo replyItem,\n  ) {\n    final Content content = replyItem.content;\n    final List<InlineSpan> spanChildren = <InlineSpan>[];\n    bool hasNote = false;\n\n    final urlKeys = content.urls.keys;\n    // 构建正则表达式\n    final List<String> specialTokens = [\n      ...content.emotes.keys,\n      ...content.topics.keys.map((e) => '#$e#'),\n      ...content.atNameToMid.keys.map((e) => '@$e'),\n      ...urlKeys,\n    ];\n    String patternStr = [\n      ...specialTokens.map(RegExp.escape),\n      r'(?:\\d+[:：])?\\d+[:：]\\d+',\n      r'\\{vote:\\d+?\\}',\n      Constants.urlRegex.pattern,\n    ].join('|');\n    final RegExp pattern = RegExp(patternStr);\n\n    late List<String> matchedUrls = [];\n\n    void addPlainTextSpan(str) {\n      spanChildren.add(TextSpan(text: str));\n    }\n\n    void addUrl(String matchStr, Url url, {bool addPlainText = false}) {\n      if (url.extra.isWordSearch && !enableWordRe) {\n        if (addPlainText) {\n          addPlainTextSpan(matchStr);\n        }\n        return;\n      }\n      final isCv = url.clickReport.startsWith('{\"cvid');\n      if (isCv) {\n        hasNote = true;\n      }\n      final children = [\n        if (!isCv && url.hasPrefixIcon())\n          WidgetSpan(\n            child: CachedNetworkImage(\n              height: 19,\n              memCacheHeight: 19.cacheSize(context),\n              color: theme.colorScheme.primary,\n              imageUrl: ImageUtils.thumbnailUrl(url.prefixIcon),\n              placeholder: (_, _) => const SizedBox.shrink(),\n            ),\n          ),\n        TextSpan(\n          text: isCv ? '[笔记] ' : url.title,\n          style: TextStyle(\n            color: theme.colorScheme.primary,\n          ),\n          recognizer: NoDeadlineTapGestureRecognizer()\n            ..onTap = () {\n              if (url.appUrlSchema.isEmpty) {\n                if (RegExp(\n                  r'^(av|bv)',\n                  caseSensitive: false,\n                ).hasMatch(matchStr)) {\n                  UrlUtils.matchUrlPush(matchStr, '');\n                } else {\n                  RegExpMatch? match = RegExp(\n                    r'^cv(\\d+)$|/read/cv(\\d+)|note-app/view\\?cvid=(\\d+)',\n                    caseSensitive: false,\n                  ).firstMatch(matchStr);\n                  String? cvid =\n                      match?.group(1) ?? match?.group(2) ?? match?.group(3);\n                  if (cvid != null) {\n                    Get.toNamed(\n                      '/articlePage',\n                      parameters: {\n                        'id': cvid,\n                        'type': 'read',\n                      },\n                    );\n                    return;\n                  }\n                  PageUtils.handleWebview(matchStr);\n                }\n              } else {\n                if (url.extra.isWordSearch) {\n                  Get.toNamed(\n                    '/searchResult',\n                    parameters: {'keyword': url.title},\n                  );\n                } else {\n                  PageUtils.handleWebview(matchStr);\n                }\n              }\n            },\n        ),\n      ];\n      if (isCv) {\n        spanChildren.insertAll(0, children);\n      } else {\n        spanChildren.addAll(children);\n      }\n    }\n\n    // 分割文本并处理每个部分\n    content.message.splitMapJoin(\n      pattern,\n      onMatch: (Match match) {\n        String matchStr = match[0]!;\n        late final name = matchStr.substring(1);\n        late final topic = matchStr.substring(1, matchStr.length - 1);\n        if (content.emotes.containsKey(matchStr)) {\n          // 处理表情\n          final emote = content.emotes[matchStr]!;\n          final size = emote.size.toInt() * 20.0;\n          spanChildren.add(\n            WidgetSpan(\n              child: NetworkImgLayer(\n                src: emote.hasWebpUrl()\n                    ? emote.webpUrl\n                    : emote.hasGifUrl()\n                    ? emote.gifUrl\n                    : emote.url,\n                type: ImageType.emote,\n                width: size,\n                height: size,\n              ),\n            ),\n          );\n        } else if (matchStr.startsWith(\"@\") &&\n            content.atNameToMid.containsKey(name)) {\n          // 处理@用户\n          spanChildren.add(\n            TextSpan(\n              text: matchStr,\n              style: TextStyle(color: theme.colorScheme.primary),\n              recognizer: NoDeadlineTapGestureRecognizer()\n                ..onTap = () =>\n                    Get.toNamed('/member?mid=${content.atNameToMid[name]}'),\n            ),\n          );\n        } else if (_voteRegExp.hasMatch(matchStr)) {\n          spanChildren.add(\n            TextSpan(\n              text: '投票: ${content.vote.title}',\n              style: TextStyle(color: theme.colorScheme.primary),\n              recognizer: NoDeadlineTapGestureRecognizer()\n                ..onTap = () =>\n                    showVoteDialog(context, content.vote.id.toInt()),\n            ),\n          );\n        } else if (_timeRegExp.hasMatch(matchStr)) {\n          matchStr = matchStr.replaceAll('：', ':');\n          bool isValid = false;\n          try {\n            final ctr = Get.find<VideoDetailController>(\n              tag: getTag?.call() ?? Get.arguments['heroTag'],\n            );\n            isValid =\n                DurationUtils.parseDuration(matchStr) * 1000 <=\n                ctr.data.timeLength!;\n          } catch (e) {\n            if (kDebugMode) debugPrint('failed to validate: $e');\n          }\n          spanChildren.add(\n            TextSpan(\n              text: isValid ? ' $matchStr ' : matchStr,\n              style: isValid\n                  ? TextStyle(color: theme.colorScheme.primary)\n                  : null,\n              recognizer: isValid\n                  ? (NoDeadlineTapGestureRecognizer()\n                      ..onTap = () {\n                        // 跳转到指定位置\n                        try {\n                          SmartDialog.showToast('跳转至：$matchStr');\n                          Get.find<VideoDetailController>(\n                            tag: Get.arguments['heroTag'],\n                          ).plPlayerController.seekTo(\n                            Duration(\n                              seconds: DurationUtils.parseDuration(matchStr),\n                            ),\n                            isSeek: false,\n                          );\n                        } catch (e) {\n                          SmartDialog.showToast('跳转失败: $e');\n                        }\n                      })\n                  : null,\n            ),\n          );\n        } else {\n          final url = content.urls[matchStr];\n          if (url != null && !matchedUrls.contains(matchStr)) {\n            addUrl(matchStr, url, addPlainText: true);\n            // 只显示一次\n            matchedUrls.add(matchStr);\n          } else if (matchStr.length > 1 && content.topics[topic] != null) {\n            spanChildren.add(\n              TextSpan(\n                text: matchStr,\n                style: TextStyle(color: theme.colorScheme.primary),\n                recognizer: NoDeadlineTapGestureRecognizer()\n                  ..onTap = () {\n                    Get.toNamed(\n                      '/searchResult',\n                      parameters: {'keyword': topic},\n                    );\n                  },\n              ),\n            );\n          } else if (Constants.urlRegex.hasMatch(matchStr)) {\n            spanChildren.add(\n              TextSpan(\n                text: matchStr,\n                style: TextStyle(color: theme.colorScheme.primary),\n                recognizer: NoDeadlineTapGestureRecognizer()\n                  ..onTap = () => PageUtils.handleWebview(matchStr),\n              ),\n            );\n          } else {\n            addPlainTextSpan(matchStr);\n          }\n        }\n        return '';\n      },\n      onNonMatch: (String nonMatchStr) {\n        addPlainTextSpan(nonMatchStr);\n        return nonMatchStr;\n      },\n    );\n\n    if (urlKeys.isNotEmpty) {\n      List<String> unmatchedItems = urlKeys\n          .where((url) => !matchedUrls.contains(url))\n          .toList();\n      if (unmatchedItems.isNotEmpty) {\n        for (final patternStr in unmatchedItems) {\n          addUrl(patternStr, content.urls[patternStr]!);\n        }\n      }\n    }\n\n    if (!hasNote &&\n        replyItem.replyControl.isNote &&\n        replyItem.replyControl.isNoteV2) {\n      final Color color;\n      NoDeadlineTapGestureRecognizer? recognizer;\n\n      final hasClickUrl = content.richText.note.hasClickUrl();\n      if (hasClickUrl || content.richText.opus.hasOpusId()) {\n        color = theme.colorScheme.primary;\n        recognizer = NoDeadlineTapGestureRecognizer()\n          ..onTap = () => hasClickUrl\n              ? PiliScheme.routePushFromUrl(content.richText.note.clickUrl)\n              : Get.toNamed(\n                  '/articlePage',\n                  parameters: {\n                    'id': content.richText.opus.opusId.toString(),\n                    'type': 'opus',\n                  },\n                );\n      } else {\n        color = theme.colorScheme.secondary;\n      }\n      spanChildren.insert(\n        0,\n        TextSpan(\n          text: '[笔记] ',\n          style: TextStyle(color: color),\n          recognizer: recognizer,\n        ),\n      );\n    }\n\n    return TextSpan(children: spanChildren);\n  }\n\n  Widget morePanel({\n    required BuildContext context,\n    required ReplyInfo item,\n    required VoidCallback onDelete,\n    required bool isSubReply,\n  }) {\n    late String message = item.content.message;\n    final ownerMid = Int64(Accounts.main.mid);\n    final theme = Theme.of(context);\n    final errorColor = theme.colorScheme.error;\n    final style = theme.textTheme.titleSmall!;\n\n    return Padding(\n      padding: EdgeInsets.only(\n        bottom: MediaQuery.viewPaddingOf(context).bottom + 20,\n      ),\n      child: Column(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          InkWell(\n            onTap: Get.back,\n            borderRadius: StyleString.bottomSheetRadius,\n            child: SizedBox(\n              height: 35,\n              child: Center(\n                child: Container(\n                  width: 32,\n                  height: 3,\n                  decoration: BoxDecoration(\n                    color: theme.colorScheme.outline,\n                    borderRadius: const BorderRadius.all(Radius.circular(3)),\n                  ),\n                ),\n              ),\n            ),\n          ),\n          if (kDebugMode && GStorage.reply != null) ...[\n            ListTile(\n              onTap: () {\n                Get.back();\n                GStorage.reply!.put(\n                  item.id.toString(),\n                  (item.deepCopy()\n                        ..unknownFields.clear()\n                        ..replies.clear()\n                        ..clearMemberV2()\n                        ..clearTrackInfo())\n                      .writeToBuffer(),\n                );\n              },\n              title: Text(\n                'save to local',\n                style: style.copyWith(color: theme.colorScheme.primary),\n              ),\n            ),\n            ListTile(\n              onTap: () {\n                Get.back();\n                onDelete();\n                GStorage.reply!.delete(item.id.toString());\n              },\n              title: Text(\n                'remove from local',\n                style: style.copyWith(color: theme.colorScheme.primary),\n              ),\n            ),\n            ListTile(\n              onTap: () {\n                Get.back();\n                final oid = item.oid.toInt();\n                final data =\n                    (item.deepCopy()\n                          ..unknownFields.clear()\n                          ..replies.clear()\n                          ..clearMemberV2()\n                          ..clearTrackInfo())\n                        .writeToBuffer();\n                GStorage.reply!.putAll({\n                  for (var i = oid; i < oid + 1000; i++) i.toString(): data,\n                });\n              },\n              title: Text(\n                'save to local (x1000)',\n                style: style.copyWith(color: theme.colorScheme.primary),\n              ),\n            ),\n          ],\n          if (ownerMid == upMid || ownerMid == item.member.mid)\n            ListTile(\n              onTap: () async {\n                Get.back();\n                bool? isDelete = await showDialog<bool>(\n                  context: context,\n                  builder: (context) {\n                    final theme = Theme.of(context);\n                    return AlertDialog(\n                      title: const Text('删除评论'),\n                      content: Text.rich(\n                        TextSpan(\n                          children: [\n                            const TextSpan(text: '确定删除这条评论吗？\\n\\n'),\n                            if (ownerMid != item.member.mid.toInt()) ...[\n                              TextSpan(\n                                text: '@${item.member.name}',\n                                style: TextStyle(\n                                  color: theme.colorScheme.primary,\n                                ),\n                              ),\n                              const TextSpan(text: ':\\n'),\n                            ],\n                            TextSpan(text: message),\n                          ],\n                        ),\n                      ),\n                      actions: <Widget>[\n                        TextButton(\n                          onPressed: () => Get.back(result: false),\n                          child: Text(\n                            '取消',\n                            style: TextStyle(\n                              color: theme.colorScheme.outline,\n                            ),\n                          ),\n                        ),\n                        TextButton(\n                          onPressed: () => Get.back(result: true),\n                          child: const Text('确定'),\n                        ),\n                      ],\n                    );\n                  },\n                );\n                if (isDelete == null || !isDelete) {\n                  return;\n                }\n                SmartDialog.showLoading(msg: '删除中...');\n                final res = await VideoHttp.replyDel(\n                  type: item.type.toInt(),\n                  oid: item.oid.toInt(),\n                  rpid: item.id.toInt(),\n                );\n                SmartDialog.dismiss();\n                if (res.isSuccess) {\n                  SmartDialog.showToast('删除成功');\n                  onDelete();\n                } else {\n                  SmartDialog.showToast('删除失败, $res');\n                }\n              },\n              minLeadingWidth: 0,\n              leading: Icon(Icons.delete_outlined, color: errorColor, size: 19),\n              title: Text('删除', style: style.copyWith(color: errorColor)),\n            ),\n          if (ownerMid != Int64.ZERO)\n            ListTile(\n              onTap: () {\n                Get.back();\n                autoWrapReportDialog(\n                  context,\n                  ReportOptions.commentReport,\n                  (reasonType, reasonDesc, banUid) async {\n                    final res = await ReplyHttp.report(\n                      rpid: item.id,\n                      oid: item.oid,\n                      reasonType: reasonType,\n                      reasonDesc: reasonDesc,\n                      banUid: banUid,\n                    );\n                    if (res.isSuccess) {\n                      onDelete();\n                    }\n                    return res;\n                  },\n                );\n              },\n              minLeadingWidth: 0,\n              leading: Icon(Icons.error_outline, color: errorColor, size: 19),\n              title: Text('举报', style: style.copyWith(color: errorColor)),\n            ),\n          if (replyLevel == 1 && !isSubReply && ownerMid == upMid)\n            ListTile(\n              onTap: () {\n                Get.back();\n                onToggleTop?.call(item);\n              },\n              minLeadingWidth: 0,\n              leading: const Icon(Icons.vertical_align_top, size: 19),\n              title: Text(\n                '${replyItem.replyControl.isUpTop ? '取消' : ''}置顶',\n                style: style,\n              ),\n            ),\n          ListTile(\n            onTap: () {\n              Get.back();\n              Utils.copyText(message);\n            },\n            minLeadingWidth: 0,\n            leading: const Icon(Icons.copy_all_outlined, size: 19),\n            title: Text('复制全部', style: style),\n          ),\n          ListTile(\n            onTap: () {\n              Get.back();\n              showDialog(\n                context: context,\n                builder: (context) => Dialog(\n                  child: Padding(\n                    padding: const .symmetric(horizontal: 20, vertical: 16),\n                    child: SelectableText(\n                      message,\n                      style: const TextStyle(fontSize: 15, height: 1.7),\n                    ),\n                  ),\n                ),\n              );\n            },\n            minLeadingWidth: 0,\n            leading: const Icon(Icons.copy_outlined, size: 19),\n            title: Text('自由复制', style: style),\n          ),\n          ListTile(\n            onTap: () {\n              Get.back();\n              SavePanel.toSavePanel(upMid: upMid, item: item);\n            },\n            minLeadingWidth: 0,\n            leading: const Icon(Icons.save_alt, size: 19),\n            title: Text('保存评论', style: style),\n          ),\n          if (kDebugMode || item.mid == ownerMid)\n            ListTile(\n              onTap: () {\n                Get.back();\n                onCheckReply?.call(item);\n              },\n              minLeadingWidth: 0,\n              leading: const Stack(\n                clipBehavior: Clip.none,\n                alignment: Alignment.center,\n                children: [\n                  Icon(Icons.shield_outlined, size: 19),\n                  Icon(Icons.reply, size: 12),\n                ],\n              ),\n              title: Text('检查评论', style: style),\n            ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/reply/widgets/zan_grpc.dart",
    "content": "import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'\n    show ReplyInfo;\nimport 'package:PiliPlus/http/reply.dart';\nimport 'package:PiliPlus/utils/feed_back.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\nimport 'package:fixnum/fixnum.dart' as $fixnum;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:font_awesome_flutter/font_awesome_flutter.dart';\n\nclass ZanButtonGrpc extends StatelessWidget {\n  const ZanButtonGrpc({\n    super.key,\n    required this.replyItem,\n  });\n\n  final ReplyInfo replyItem;\n\n  Future<void> onHateReply(\n    BuildContext context,\n    bool isProcessing,\n    VoidCallback onDone, {\n    required bool isLike,\n    required bool isDislike,\n  }) async {\n    if (isProcessing) {\n      return;\n    }\n    isProcessing = true;\n    feedBack();\n    final int oid = replyItem.oid.toInt();\n    final int rpid = replyItem.id.toInt();\n    // 1 已点赞 2 不喜欢 0 未操作\n    final int action = isDislike ? 0 : 2;\n    final res = await ReplyHttp.hateReply(\n      type: replyItem.type.toInt(),\n      action: action == 2 ? 1 : 0,\n      oid: oid,\n      rpid: rpid,\n    );\n    // SmartDialog.dismiss();\n    if (res.isSuccess) {\n      SmartDialog.showToast(isDislike ? '取消踩' : '点踩成功');\n      if (action == 2) {\n        if (isLike) replyItem.like -= $fixnum.Int64.ONE;\n        replyItem.replyControl.action = $fixnum.Int64.TWO;\n      } else {\n        replyItem.replyControl.action = $fixnum.Int64.ZERO;\n      }\n      if (context.mounted) {\n        (context as Element?)?.markNeedsBuild();\n      }\n    } else {\n      res.toast();\n    }\n    onDone();\n  }\n\n  // 评论点赞\n  Future<void> onLikeReply(\n    BuildContext context,\n    bool isProcessing,\n    VoidCallback onDone, {\n    required bool isLike,\n    required bool isDislike,\n  }) async {\n    if (isProcessing) {\n      return;\n    }\n    isProcessing = true;\n    feedBack();\n    final int oid = replyItem.oid.toInt();\n    final int rpid = replyItem.id.toInt();\n    // 1 已点赞 2 不喜欢 0 未操作\n    final int action = isLike ? 0 : 1;\n    final res = await ReplyHttp.likeReply(\n      type: replyItem.type.toInt(),\n      oid: oid,\n      rpid: rpid,\n      action: action,\n    );\n    if (res.isSuccess) {\n      SmartDialog.showToast(isLike ? '取消赞' : '点赞成功');\n      if (action == 1) {\n        replyItem\n          ..like += $fixnum.Int64.ONE\n          ..replyControl.action = $fixnum.Int64.ONE;\n      } else {\n        replyItem\n          ..like -= $fixnum.Int64.ONE\n          ..replyControl.action = $fixnum.Int64.ZERO;\n      }\n      if (context.mounted) {\n        (context as Element?)?.markNeedsBuild();\n      }\n    } else {\n      res.toast();\n    }\n    onDone();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final ThemeData theme = Theme.of(context);\n    late bool isProcessing = false;\n    final action = replyItem.replyControl.action;\n    final isLike = action == $fixnum.Int64.ONE;\n    final isDislike = action == $fixnum.Int64.TWO;\n    final outline = theme.colorScheme.outline;\n    final primary = theme.colorScheme.primary;\n    final ButtonStyle style = TextButton.styleFrom(\n      padding: EdgeInsets.zero,\n      tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n      visualDensity: VisualDensity.compact,\n    );\n    return Row(\n      mainAxisSize: MainAxisSize.min,\n      children: [\n        SizedBox(\n          height: 32,\n          child: TextButton(\n            style: style,\n            onPressed: () => onHateReply(\n              context,\n              isProcessing,\n              () => isProcessing = false,\n              isLike: isLike,\n              isDislike: isDislike,\n            ),\n            child: Icon(\n              isDislike\n                  ? FontAwesomeIcons.solidThumbsDown\n                  : FontAwesomeIcons.thumbsDown,\n              size: 16,\n              color: isDislike ? primary : outline,\n              semanticLabel: isDislike ? '已踩' : '点踩',\n            ),\n          ),\n        ),\n        SizedBox(\n          height: 32,\n          child: TextButton(\n            style: style,\n            onPressed: () => onLikeReply(\n              context,\n              isProcessing,\n              () => isProcessing = false,\n              isLike: isLike,\n              isDislike: isDislike,\n            ),\n            child: Row(\n              spacing: 4,\n              children: [\n                Icon(\n                  isLike\n                      ? FontAwesomeIcons.solidThumbsUp\n                      : FontAwesomeIcons.thumbsUp,\n                  size: 16,\n                  color: isLike ? primary : outline,\n                  semanticLabel: isLike ? '已赞' : '点赞',\n                ),\n                Text(\n                  NumUtils.numFormat(replyItem.like.toInt()),\n                  style: TextStyle(\n                    color: isLike ? primary : outline,\n                    fontSize: theme.textTheme.labelSmall!.fontSize,\n                  ),\n                ),\n              ],\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/reply_new/view.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\nimport 'dart:math' show max;\n\nimport 'package:PiliPlus/common/widgets/button/toolbar_icon_button.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text_field/controller.dart'\n    show RichTextType;\nimport 'package:PiliPlus/common/widgets/flutter/text_field/text_field.dart';\nimport 'package:PiliPlus/common/widgets/view_safe_area.dart';\nimport 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'\n    show ReplyInfo;\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/video.dart';\nimport 'package:PiliPlus/main.dart';\nimport 'package:PiliPlus/models/common/publish_panel_type.dart';\nimport 'package:PiliPlus/models/dynamics/result.dart' show FilePicModel;\nimport 'package:PiliPlus/pages/common/publish/common_rich_text_pub_page.dart';\nimport 'package:PiliPlus/pages/dynamics_mention/controller.dart';\nimport 'package:PiliPlus/pages/emote/controller.dart';\nimport 'package:PiliPlus/pages/emote/view.dart';\nimport 'package:PiliPlus/pages/video/controller.dart';\nimport 'package:PiliPlus/pages/video/reply_search_item/view.dart';\nimport 'package:PiliPlus/utils/duration_utils.dart';\nimport 'package:PiliPlus/utils/extension/context_ext.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:PiliPlus/utils/path_utils.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart' hide TextField;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass ReplyPage extends CommonRichTextPubPage {\n  final int oid;\n  final int root;\n  final int parent;\n  final int replyType;\n  final ReplyInfo? replyItem;\n  final String? hint;\n  final bool canUploadPic;\n\n  const ReplyPage({\n    super.key,\n    super.items,\n    super.imageLengthLimit,\n    super.onSave,\n    required this.oid,\n    required this.root,\n    required this.parent,\n    required this.replyType,\n    this.replyItem,\n    this.hint,\n    this.canUploadPic = true,\n  });\n\n  @override\n  State<ReplyPage> createState() => _ReplyPageState();\n}\n\nclass _ReplyPageState extends CommonRichTextPubPageState<ReplyPage> {\n  final RxBool _syncToDynamic = false.obs;\n  final heroTag = Get.arguments?['heroTag'];\n\n  @override\n  void dispose() {\n    Get\n      ..delete<EmotePanelController>()\n      ..delete<DynMentionController>();\n    super.dispose();\n  }\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    themeData = darkVideoPage\n        ? MyApp.darkThemeData ?? Theme.of(context)\n        : Theme.of(context);\n  }\n\n  late final darkVideoPage =\n      Get.currentRoute.startsWith('/video') && Pref.darkVideoPage;\n  late ThemeData themeData;\n\n  @override\n  Widget build(BuildContext context) {\n    Widget child = ViewSafeArea(\n      child: Align(\n        alignment: Alignment.bottomCenter,\n        child: Container(\n          constraints: const BoxConstraints(maxWidth: 640),\n          decoration: BoxDecoration(\n            borderRadius: const BorderRadius.vertical(top: Radius.circular(12)),\n            color: themeData.colorScheme.surface,\n          ),\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              ...buildInputView(),\n              buildImagePreview(),\n              Flexible(\n                child: buildPanelContainer(themeData, Colors.transparent),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n    return darkVideoPage ? Theme(data: themeData, child: child) : child;\n  }\n\n  @override\n  Widget? get customPanel => EmotePanel(onChoose: onChooseEmote);\n\n  Widget buildImagePreview() {\n    return Obx(\n      () {\n        if (imageList.isNotEmpty) {\n          return SizedBox(\n            height: 85,\n            child: ListView.separated(\n              scrollDirection: .horizontal,\n              padding: const .fromLTRB(15, 0, 15, 10),\n              itemCount: imageList.length,\n              itemBuilder: (_, index) => buildImage(index, 75),\n              separatorBuilder: (_, _) => const SizedBox(width: 10),\n            ),\n          );\n        } else {\n          return const SizedBox.shrink();\n        }\n      },\n    );\n  }\n\n  List<Widget> buildInputView() {\n    return [\n      Padding(\n        padding: const EdgeInsets.only(\n          top: 12,\n          right: 15,\n          left: 15,\n          bottom: 10,\n        ),\n        child: Listener(\n          onPointerUp: (event) {\n            if (readOnly.value) {\n              updatePanelType(PanelType.keyboard);\n            }\n          },\n          child: Obx(\n            () => RichTextField(\n              key: key,\n              controller: editController,\n              minLines: 4,\n              maxLines: 8,\n              autofocus: false,\n              readOnly: readOnly.value,\n              onChanged: onChanged,\n              onSubmitted: onSubmitted,\n              focusNode: focusNode,\n              decoration: InputDecoration(\n                hintText: widget.hint ?? \"输入回复内容\",\n                border: InputBorder.none,\n                hintStyle: const TextStyle(fontSize: 14),\n              ),\n              style: themeData.textTheme.bodyLarge,\n            ),\n          ),\n        ),\n      ),\n      Divider(\n        height: 1,\n        color: themeData.dividerColor.withValues(alpha: 0.1),\n      ),\n      Container(\n        height: 52,\n        padding: const EdgeInsets.only(left: 12, right: 12),\n        child: Row(\n          children: [\n            emojiBtn,\n            if (widget.root == 0) ...[\n              const SizedBox(width: 8),\n              ToolbarIconButton(\n                tooltip: '图片',\n                selected: false,\n                icon: widget.canUploadPic\n                    ? const Icon(Icons.image, size: 22)\n                    : const Icon(Icons.image_not_supported, size: 22),\n                onPressed: widget.canUploadPic\n                    ? onPickImage\n                    : () => SmartDialog.showToast('当前评论区不支持发送图片'),\n              ),\n            ],\n            const SizedBox(width: 8),\n            atBtn,\n            const SizedBox(width: 8),\n            moreBtn,\n            Expanded(\n              child: Center(\n                child: Obx(\n                  () {\n                    final syncToDynamic = _syncToDynamic.value;\n                    return TextButton(\n                      style: TextButton.styleFrom(\n                        tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n                        padding: const EdgeInsets.all(13),\n                        visualDensity: VisualDensity.compact,\n                        foregroundColor: syncToDynamic\n                            ? themeData.colorScheme.secondary\n                            : themeData.colorScheme.outline,\n                      ),\n                      onPressed: () => _syncToDynamic.value = !syncToDynamic,\n                      child: Row(\n                        spacing: 4,\n                        mainAxisSize: MainAxisSize.min,\n                        children: [\n                          Icon(\n                            syncToDynamic\n                                ? Icons.check_box\n                                : Icons.check_box_outline_blank,\n                            size: 22,\n                          ),\n                          const Flexible(\n                            child: Text(\n                              '转到动态',\n                              maxLines: 1,\n                              style: TextStyle(height: 1),\n                              strutStyle: StrutStyle(leading: 0, height: 1),\n                            ),\n                          ),\n                        ],\n                      ),\n                    );\n                  },\n                ),\n              ),\n            ),\n            Obx(\n              () => FilledButton.tonal(\n                onPressed: enablePublish.value ? onPublish : null,\n                style: FilledButton.styleFrom(\n                  tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n                  padding: const EdgeInsets.symmetric(\n                    horizontal: 20,\n                    vertical: 10,\n                  ),\n                  visualDensity: VisualDensity.compact,\n                ),\n                child: const Text('发送'),\n              ),\n            ),\n          ],\n        ),\n      ),\n    ];\n  }\n\n  @override\n  Widget buildMorePanel(ThemeData theme) {\n    double height = context.isTablet ? 300 : 170;\n    final keyboardHeight = controller.keyboardHeight;\n    if (keyboardHeight != 0) {\n      height = max(height, keyboardHeight);\n    }\n\n    Widget item({\n      required VoidCallback onTap,\n      required Icon icon,\n      required String title,\n    }) {\n      return GestureDetector(\n        onTap: onTap,\n        behavior: HitTestBehavior.opaque,\n        child: Column(\n          spacing: 5,\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            AspectRatio(\n              aspectRatio: 1,\n              child: Container(\n                decoration: BoxDecoration(\n                  color: themeData.colorScheme.onInverseSurface,\n                  borderRadius: const BorderRadius.all(Radius.circular(6)),\n                ),\n                alignment: Alignment.center,\n                child: icon,\n              ),\n            ),\n            Text(\n              title,\n              maxLines: 1,\n              style: TextStyle(\n                fontSize: 13,\n                color: theme.colorScheme.onSurface,\n              ),\n            ),\n          ],\n        ),\n      );\n    }\n\n    final isRoot = widget.root == 0;\n    final color = themeData.colorScheme.onSurfaceVariant;\n    late final gridDelegate = SliverGridDelegateWithExtentAndRatio(\n      maxCrossAxisExtent: 65,\n      mainAxisSpacing: 12,\n      crossAxisSpacing: 12,\n      mainAxisExtent: 25,\n    );\n\n    return SizedBox(\n      height: height,\n      child: GridView(\n        physics: const ClampingScrollPhysics(),\n        padding: const EdgeInsets.only(left: 12, bottom: 12, right: 12),\n        gridDelegate: gridDelegate,\n        children: [\n          item(\n            onTap: () async {\n              controller.keepChatPanel();\n              final ({String title, String url})? res = await Get.to(\n                ReplySearchPage(type: widget.replyType, oid: widget.oid),\n              );\n              if (res != null) {\n                onInsertText(\n                  '${res.title} ',\n                  RichTextType.common,\n                  rawText: '${res.url} ',\n                );\n              }\n              controller.restoreChatPanel();\n            },\n            icon: Icon(Icons.post_add, size: 28, color: color),\n            title: '插入内容',\n          ),\n          if (heroTag != null) ...[\n            // if (isRoot)\n            //   item(\n            //     onTap: () {\n            //       Get.back();\n            //       try {\n            //         Get.find<VideoDetailController>(tag: heroTag)\n            //             .showNoteList(context);\n            //       } catch (e) {\n            //         debugPrint(e.toString());\n            //       }\n            //     },\n            //     icon: Icon(Icons.edit_note, size: 28, color: color),\n            //     title: '笔记',\n            //   ),\n            item(\n              onTap: () {\n                try {\n                  final plPlayerController = Get.find<VideoDetailController>(\n                    tag: heroTag,\n                  );\n                  onInsertText(\n                    ' ${DurationUtils.formatDuration((plPlayerController.playedTime ?? Duration.zero).inSeconds)} ',\n                    RichTextType.common,\n                  );\n                } catch (e) {\n                  debugPrint(e.toString());\n                }\n              },\n              icon: Icon(Icons.my_location, size: 28, color: color),\n              title: '视频进度',\n            ),\n            if (isRoot && widget.canUploadPic)\n              item(\n                onTap: () async {\n                  if (imageList.length >= limit) {\n                    SmartDialog.showToast('最多选择$limit张图片');\n                    return;\n                  }\n                  try {\n                    final plPlayerController = Get.find<VideoDetailController>(\n                      tag: heroTag,\n                    );\n                    final res = await plPlayerController\n                        .plPlayerController\n                        .videoPlayerController\n                        ?.screenshot(format: .png);\n                    if (res != null) {\n                      final path =\n                          '$tmpDirPath/${Utils.generateRandomString(8)}.png';\n                      await File(path).writeAsBytes(res);\n                      imageList.add(FilePicModel(path: path));\n                    } else {\n                      debugPrint('null screenshot');\n                    }\n                  } catch (e) {\n                    debugPrint(e.toString());\n                  }\n                },\n                icon: Icon(\n                  Icons.enhance_photo_translate_outlined,\n                  size: 28,\n                  color: color,\n                ),\n                title: '视频截图',\n              ),\n          ],\n        ],\n      ),\n    );\n  }\n\n  @override\n  Future<void> onCustomPublish({List? pictures}) async {\n    Map<String, int> atNameToMid = {};\n    for (final e in editController.items) {\n      if (e.type == RichTextType.at) {\n        atNameToMid[e.rawText] ??= int.parse(e.id!);\n      }\n    }\n    String message = editController.rawText;\n    final res = await VideoHttp.replyAdd(\n      type: widget.replyType,\n      oid: widget.oid,\n      root: widget.root,\n      parent: widget.parent,\n      message: widget.replyItem != null && widget.replyItem!.root != 0\n          ? ' 回复 @${widget.replyItem!.member.name} : $message'\n          : message,\n      atNameToMid: atNameToMid,\n      pictures: pictures,\n      syncToDynamic: _syncToDynamic.value,\n    );\n    if (res case Success(:final response)) {\n      hasPub = true;\n      SmartDialog.showToast('发送成功');\n      Get.back(result: response);\n    } else {\n      res.toast();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/reply_reply/controller.dart",
    "content": "import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'\n    show ReplyInfo, DetailListReply, Mode;\nimport 'package:PiliPlus/grpc/reply.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/pages/common/publish/publish_route.dart';\nimport 'package:PiliPlus/pages/common/reply_controller.dart';\nimport 'package:PiliPlus/pages/video/reply_new/view.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart';\nimport 'package:fixnum/fixnum.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/scheduler.dart';\nimport 'package:get/get.dart';\nimport 'package:super_sliver_list/super_sliver_list.dart';\n\nclass VideoReplyReplyController extends ReplyController\n    with GetSingleTickerProviderStateMixin {\n  VideoReplyReplyController({\n    required this.hasRoot,\n    required this.id,\n    required this.oid,\n    required this.rpid,\n    required this.dialog,\n    required this.replyType,\n  });\n  final int? dialog;\n  int? id;\n  // 视频aid 请求时使用的oid\n  int oid;\n  // rpid 请求楼中楼回复\n  int rpid;\n  int replyType;\n\n  bool hasRoot = false;\n  final Rx<ReplyInfo?> firstFloor = Rx(null);\n\n  final index = RxnInt();\n\n  final listController = ListController();\n\n  AnimationController? _controller;\n  AnimationController get animController => _controller ??= AnimationController(\n    duration: const Duration(milliseconds: 1000),\n    vsync: this,\n  );\n\n  late final horizontalPreview = Pref.horizontalPreview;\n\n  @override\n  dynamic get sourceId => replyType == 1 ? IdUtils.av2bv(oid) : oid;\n\n  @override\n  void onInit() {\n    super.onInit();\n    mode.value = Mode.MAIN_LIST_TIME;\n    queryData();\n  }\n\n  @override\n  List<ReplyInfo>? getDataList(response) {\n    return dialog != null ? response.replies : response.root.replies;\n  }\n\n  @override\n  bool customHandleResponse(bool isRefresh, Success response) {\n    final data = response.response;\n\n    subjectControl = data.subjectControl;\n    upMid ??= data.subjectControl.upMid;\n    paginationReply = data.paginationReply;\n    isEnd = data.cursor.isEnd;\n\n    // reply2Reply // isDialogue.not\n    if (data is DetailListReply) {\n      count.value = data.root.count.toInt();\n      if (isRefresh && !hasRoot) {\n        firstFloor.value ??= data.root;\n      }\n      if (id != null) {\n        setIndexById(Int64(id!), data.root.replies);\n        id = null;\n      }\n    }\n\n    return false;\n  }\n\n  bool setIndexById(Int64 id64, [List<ReplyInfo>? replies]) {\n    final index = (replies ?? loadingState.value.data!).indexWhere(\n      (item) => item.id == id64,\n    );\n    if (index != -1) {\n      this.index.value = index;\n      jumpToItem(index);\n      return true;\n    }\n    return false;\n  }\n\n  ExtendedNestedScrollController? nestedController;\n\n  @pragma('vm:notify-debugger-on-exception')\n  void jumpToItem(int index) {\n    SchedulerBinding.instance.addPostFrameCallback((_) {\n      animController.forward(from: 0);\n      try {\n        // ignore: invalid_use_of_visible_for_testing_member\n        final offset = listController.getOffsetToReveal(index, 0.25);\n        if (offset.isFinite) {\n          if (nestedController case final nestedController?) {\n            nestedController.nestedPositions.last.localJumpTo(offset);\n          } else {\n            scrollController.jumpTo(offset);\n          }\n        }\n      } catch (_) {}\n    });\n  }\n\n  @override\n  Future<LoadingState> customGetData() => dialog != null\n      ? ReplyGrpc.dialogList(\n          type: replyType,\n          oid: oid,\n          root: rpid,\n          dialog: dialog!,\n          offset: paginationReply?.nextOffset,\n        )\n      : ReplyGrpc.detailList(\n          type: replyType,\n          oid: oid,\n          root: rpid,\n          rpid: id ?? 0,\n          mode: mode.value,\n          offset: paginationReply?.nextOffset,\n        );\n\n  @override\n  void queryBySort() {\n    if (isLoading) return;\n    mode.value = mode.value == Mode.MAIN_LIST_HOT\n        ? Mode.MAIN_LIST_TIME\n        : Mode.MAIN_LIST_HOT;\n    onReload();\n  }\n\n  @override\n  Future<void> onReload() {\n    if (loadingState.value.isSuccess) {\n      index.value = null;\n    }\n    return super.onReload();\n  }\n\n  @override\n  void onReply(\n    ReplyInfo? replyItem, {\n    int? oid,\n    int? replyType,\n    int? index,\n  }) {\n    assert(replyItem != null && index != null);\n\n    final (bool inputDisable, String? hint) = replyHint;\n    if (inputDisable) {\n      return;\n    }\n\n    final oid = replyItem!.oid.toInt();\n    final root = replyItem.id.toInt();\n    final key = oid + root;\n\n    Get.key.currentState!\n        .push(\n          PublishRoute(\n            pageBuilder: (buildContext, animation, secondaryAnimation) {\n              return ReplyPage(\n                hint: hint,\n                oid: oid,\n                root: root,\n                parent: root,\n                replyType: this.replyType,\n                replyItem: replyItem,\n                items: savedReplies[key],\n                onSave: (reply) {\n                  if (reply.isEmpty) {\n                    savedReplies.remove(key);\n                  } else {\n                    savedReplies[key] = reply.toList();\n                  }\n                },\n              );\n            },\n          ),\n        )\n        .then((replyInfo) {\n          if (replyInfo is ReplyInfo) {\n            savedReplies.remove(key);\n\n            count.value += 1;\n            loadingState\n              ..value.dataOrNull?.insert(index! + 1, replyInfo)\n              ..refresh();\n            if (enableCommAntifraud) {\n              onCheckReply(replyInfo, isManual: false);\n            }\n          }\n        });\n  }\n\n  @override\n  void onClose() {\n    _controller?.dispose();\n    _controller = null;\n    super.dispose();\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/reply_reply/view.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/skeleton/video_reply.dart';\nimport 'package:PiliPlus/common/widgets/colored_box_transition.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/common/widgets/sliver/sliver_pinned_header.dart';\nimport 'package:PiliPlus/common/widgets/view_safe_area.dart';\nimport 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'\n    show ReplyInfo, Mode;\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/pages/common/slide/common_slide_page.dart';\nimport 'package:PiliPlus/pages/video/reply/widgets/reply_item_grpc.dart';\nimport 'package:PiliPlus/pages/video/reply_reply/controller.dart';\nimport 'package:PiliPlus/utils/app_scheme.dart';\nimport 'package:PiliPlus/utils/extension/widget_ext.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:super_sliver_list/super_sliver_list.dart';\n\nclass VideoReplyReplyPanel extends CommonSlidePage {\n  const VideoReplyReplyPanel({\n    super.key,\n    super.enableSlide,\n    this.id,\n    required this.oid,\n    required this.rpid,\n    this.dialog,\n    this.firstFloor,\n    required this.isVideoDetail,\n    required this.replyType,\n    this.isNested = false,\n  });\n  final int? id;\n  final int oid;\n  final int rpid;\n  final int? dialog;\n  final ReplyInfo? firstFloor;\n  final bool isVideoDetail;\n  final int replyType;\n  final bool isNested;\n\n  @override\n  State<VideoReplyReplyPanel> createState() => _VideoReplyReplyPanelState();\n\n  static Future<void>? toReply({\n    required int oid,\n    required int rootId,\n    String? rpIdStr,\n    required int type,\n    Uri? uri,\n  }) {\n    final rpId = rpIdStr == null ? null : int.tryParse(rpIdStr);\n    return Get.to(\n      arguments: {\n        'oid': oid,\n        'rpid': rootId,\n        'id': ?rpId,\n        'type': type,\n        'enterUri': ?uri?.toString(), // save panel\n      },\n      () => Scaffold(\n        resizeToAvoidBottomInset: false,\n        appBar: AppBar(\n          title: const Text('评论详情'),\n          actions: [\n            IconButton(\n              tooltip: '前往',\n              onPressed: uri == null\n                  ? null\n                  : () => PiliScheme.routePush(uri, businessId: type),\n              icon: const Icon(Icons.open_in_browser),\n            ),\n          ],\n        ),\n        body: ViewSafeArea(\n          child: VideoReplyReplyPanel(\n            enableSlide: false,\n            oid: oid,\n            rpid: rootId,\n            isVideoDetail: false,\n            replyType: type,\n            firstFloor: null,\n            id: rpId,\n          ),\n        ).constraintWidth(),\n      ),\n    );\n  }\n}\n\nclass _VideoReplyReplyPanelState extends State<VideoReplyReplyPanel>\n    with SingleTickerProviderStateMixin, CommonSlideMixin {\n  late VideoReplyReplyController _controller;\n  late final _tag = Utils.makeHeroTag('${widget.rpid}${widget.dialog}');\n  Animation<Color?>? _colorAnimation;\n\n  late final bool isDialogue = widget.dialog != null;\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    _colorAnimation = null;\n    final controller = PrimaryScrollController.of(context);\n    _controller\n      ..didChangeDependencies(context)\n      ..nestedController = controller is ExtendedNestedScrollController\n          ? controller\n          : null;\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = Get.put(\n      VideoReplyReplyController(\n        hasRoot: widget.firstFloor != null,\n        id: widget.id,\n        oid: widget.oid,\n        rpid: widget.rpid,\n        dialog: widget.dialog,\n        replyType: widget.replyType,\n      ),\n      tag: _tag,\n    );\n  }\n\n  @override\n  void dispose() {\n    Get.delete<VideoReplyReplyController>(tag: _tag);\n    super.dispose();\n  }\n\n  @override\n  Widget buildPage(ThemeData theme) {\n    Widget child() => enableSlide ? slideList(theme) : buildList(theme);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      body: widget.isVideoDetail\n          ? Column(\n              children: [\n                Container(\n                  height: 45,\n                  decoration: BoxDecoration(\n                    border: Border(\n                      bottom: BorderSide(\n                        width: 1,\n                        color: theme.dividerColor.withValues(alpha: 0.1),\n                      ),\n                    ),\n                  ),\n                  padding: const EdgeInsets.only(left: 12, right: 2),\n                  child: Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: <Widget>[\n                      Text(isDialogue ? '对话列表' : '评论详情'),\n                      IconButton(\n                        tooltip: '关闭',\n                        icon: const Icon(Icons.close, size: 20),\n                        onPressed: Get.back,\n                      ),\n                    ],\n                  ),\n                ),\n                Expanded(child: child()),\n              ],\n            )\n          : child(),\n    );\n  }\n\n  ReplyInfo? get firstFloor =>\n      widget.firstFloor ?? _controller.firstFloor.value;\n\n  ScrollController get scrollController =>\n      _controller.nestedController ?? _controller.scrollController;\n\n  @override\n  Widget buildList(ThemeData theme) {\n    final child = refreshIndicator(\n      onRefresh: _controller.onRefresh,\n      isClampingScrollPhysics: widget.isNested,\n      child: CustomScrollView(\n        key: ValueKey(scrollController.hashCode),\n        controller: scrollController,\n        physics: const AlwaysScrollableScrollPhysics(),\n        slivers: [\n          if (!isDialogue) ...[\n            if ((widget.firstFloor ?? _controller.firstFloor.value)\n                case final firstFloor?)\n              _header(theme, firstFloor)\n            else\n              Obx(() {\n                final firstFloor = _controller.firstFloor.value;\n                if (firstFloor == null) {\n                  return const SliverToBoxAdapter();\n                }\n                return _header(theme, firstFloor);\n              }),\n            _sortWidget(theme),\n          ],\n          Obx(() => _buildBody(theme, _controller.loadingState.value)),\n        ],\n      ),\n    );\n    if (widget.isNested) {\n      return ExtendedVisibilityDetector(\n        uniqueKey: Key(_tag),\n        child: child,\n      );\n    }\n    return child;\n  }\n\n  Widget _header(ThemeData theme, ReplyInfo firstFloor) {\n    return SliverMainAxisGroup(\n      slivers: [\n        SliverToBoxAdapter(\n          child: ReplyItemGrpc(\n            replyItem: firstFloor,\n            replyLevel: 2,\n            needDivider: false,\n            onReply: (replyItem) => _controller.onReply(replyItem, index: -1),\n            upMid: _controller.upMid,\n            onCheckReply: (item) =>\n                _controller.onCheckReply(item, isManual: true),\n          ),\n        ),\n        SliverToBoxAdapter(\n          child: Divider(\n            height: 20,\n            color: theme.dividerColor.withValues(alpha: 0.1),\n            thickness: 6,\n          ),\n        ),\n      ],\n    );\n  }\n\n  Widget _sortWidget(ThemeData theme) {\n    return SliverPinnedHeader(\n      backgroundColor: theme.colorScheme.surface,\n      child: Padding(\n        padding: const EdgeInsets.fromLTRB(12, 2.5, 6, 2.5),\n        child: Row(\n          mainAxisAlignment: MainAxisAlignment.spaceBetween,\n          children: [\n            Obx(\n              () {\n                final count = _controller.count.value;\n                return count != -1\n                    ? Text(\n                        '相关回复共${NumUtils.numFormat(count)}条',\n                        style: const TextStyle(fontSize: 13),\n                      )\n                    : const SizedBox.shrink();\n              },\n            ),\n            TextButton.icon(\n              style: StyleString.buttonStyle,\n              onPressed: _controller.queryBySort,\n              icon: Icon(\n                Icons.sort,\n                size: 16,\n                color: theme.colorScheme.secondary,\n              ),\n              label: Obx(\n                () => Text(\n                  _controller.mode.value == Mode.MAIN_LIST_HOT ? '按热度' : '按时间',\n                  style: TextStyle(\n                    fontSize: 13,\n                    color: theme.colorScheme.secondary,\n                  ),\n                ),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget _buildBody(\n    ThemeData theme,\n    LoadingState<List<ReplyInfo>?> loadingState,\n  ) {\n    final jumpIndex = _controller.index.value;\n    return switch (loadingState) {\n      Loading() => SliverPrototypeExtentList.builder(\n        prototypeItem: const VideoReplySkeleton(),\n        itemBuilder: (_, _) => const VideoReplySkeleton(),\n        itemCount: 8,\n      ),\n      Success(:final response!) => SuperSliverList.builder(\n        listController: _controller.listController,\n        itemBuilder: (context, index) {\n          if (index == response.length) {\n            _controller.onLoadMore();\n            return Container(\n              height: 125,\n              alignment: Alignment.center,\n              margin: EdgeInsets.only(\n                bottom: MediaQuery.viewPaddingOf(context).bottom,\n              ),\n              child: Text(\n                _controller.isEnd ? '没有更多了' : '加载中...',\n                textAlign: TextAlign.center,\n                style: TextStyle(\n                  fontSize: 12,\n                  color: theme.colorScheme.outline,\n                ),\n              ),\n            );\n          }\n          final child = _replyItem(context, response[index], index);\n          if (jumpIndex == index) {\n            return ColoredBoxTransition(\n              color: _colorAnimation ??= _controller.animController.drive(\n                ColorTween(\n                  begin: theme.colorScheme.onInverseSurface,\n                  end: theme.colorScheme.surface,\n                ).chain(\n                  CurveTween(\n                    curve: const Interval(0.8, 1.0), // 前0.8s不变, 后0.2s开始动画\n                  ),\n                ),\n              ),\n              child: child,\n            );\n          }\n          return child;\n        },\n        itemCount: response.length + 1,\n      ),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n\n  Widget _replyItem(BuildContext context, ReplyInfo replyItem, int index) {\n    return ReplyItemGrpc(\n      replyItem: replyItem,\n      replyLevel: isDialogue ? 3 : 2,\n      onReply: (replyItem) => _controller.onReply(replyItem, index: index),\n      onDelete: (item, subIndex) => _controller.onRemove(index, item, null),\n      upMid: _controller.upMid,\n      showDialogue: () => Scaffold.of(context).showBottomSheet(\n        backgroundColor: Colors.transparent,\n        constraints: const BoxConstraints(),\n        (context) => VideoReplyReplyPanel(\n          oid: replyItem.oid.toInt(),\n          rpid: replyItem.root.toInt(),\n          dialog: replyItem.dialog.toInt(),\n          replyType: widget.replyType,\n          isVideoDetail: true,\n          isNested: widget.isNested,\n        ),\n      ),\n      jumpToDialogue: () {\n        if (!_controller.setIndexById(replyItem.parent)) {\n          SmartDialog.showToast('评论可能已被删除');\n        }\n      },\n      onCheckReply: (item) => _controller.onCheckReply(item, isManual: true),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/reply_search_item/child/controller.dart",
    "content": "import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'\n    show SearchItemReply, SearchItem, SearchItemType;\nimport 'package:PiliPlus/grpc/reply.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/reply/reply_search_type.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:PiliPlus/pages/video/reply_search_item/controller.dart';\n\nclass ReplySearchChildController\n    extends CommonListController<SearchItemReply, SearchItem> {\n  ReplySearchChildController(this.controller, this.searchType);\n\n  final ReplySearchController controller;\n  final ReplySearchType searchType;\n\n  @override\n  List<SearchItem>? getDataList(SearchItemReply response) {\n    if (!response.cursor.hasNext) {\n      isEnd = true;\n    }\n    return response.items;\n  }\n\n  @override\n  Future<LoadingState<SearchItemReply>> customGetData() {\n    return ReplyGrpc.searchItem(\n      page: page,\n      itemType: searchType == ReplySearchType.video\n          ? SearchItemType.VIDEO\n          : SearchItemType.ARTICLE,\n      oid: controller.oid,\n      type: controller.type,\n      keyword: controller.editingController.text,\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/reply_search_item/child/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'\n    show SearchItem;\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/reply/reply_search_type.dart';\nimport 'package:PiliPlus/pages/video/reply_search_item/child/controller.dart';\nimport 'package:PiliPlus/pages/video/reply_search_item/child/widgets/item.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass ReplySearchChildPage extends StatefulWidget {\n  const ReplySearchChildPage({\n    super.key,\n    required this.controller,\n    required this.searchType,\n  });\n\n  final ReplySearchChildController controller;\n  final ReplySearchType searchType;\n\n  @override\n  State<ReplySearchChildPage> createState() => _ReplySearchChildPageState();\n}\n\nclass _ReplySearchChildPageState extends State<ReplySearchChildPage>\n    with AutomaticKeepAliveClientMixin, GridMixin {\n  ReplySearchChildController get _controller => widget.controller;\n\n  @override\n  Widget build(BuildContext context) {\n    super.build(context);\n    return refreshIndicator(\n      onRefresh: _controller.onRefresh,\n      child: CustomScrollView(\n        controller: _controller.scrollController,\n        physics: const AlwaysScrollableScrollPhysics(),\n        slivers: [\n          SliverPadding(\n            padding: EdgeInsets.only(\n              top: 7,\n              bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n            ),\n            sliver: Obx(() => _buildBody(_controller.loadingState.value)),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget _buildBody(LoadingState<List<SearchItem>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => gridSkeleton,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverGrid.builder(\n                gridDelegate: gridDelegate,\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    _controller.onLoadMore();\n                  }\n                  return ReplySearchItem(\n                    item: response[index],\n                    type: widget.searchType,\n                  );\n                },\n                itemCount: response.length,\n              )\n            : HttpError(onReload: _controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n\n  @override\n  bool get wantKeepAlive => true;\n}\n"
  },
  {
    "path": "lib/pages/video/reply_search_item/child/widgets/item.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/image/image_save.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'\n    show SearchItem, SearchItemVideoSubType;\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models/common/reply/reply_search_type.dart';\nimport 'package:PiliPlus/utils/duration_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\nimport 'package:get/get.dart';\n\nclass ReplySearchItem extends StatelessWidget {\n  const ReplySearchItem({\n    super.key,\n    required this.item,\n    required this.type,\n  });\n\n  final SearchItem item;\n  final ReplySearchType type;\n\n  @override\n  Widget build(BuildContext context) {\n    String title = '';\n    String cover = '';\n    String? upNickname;\n    String? category;\n    int? duration;\n    switch (type) {\n      case ReplySearchType.video:\n        if (item.video.type == SearchItemVideoSubType.UGC) {\n          final ugc = item.video.ugc;\n          title = ugc.title;\n          cover = ugc.cover;\n          upNickname = ugc.upNickname;\n          duration = ugc.duration.toInt();\n        } else {\n          final pgc = item.video.pgc;\n          title = pgc.title;\n          cover = pgc.cover;\n          category = pgc.category;\n        }\n      case ReplySearchType.article:\n        final article = item.article;\n        title = article.title;\n        cover = article.covers.firstOrNull ?? '';\n        upNickname = article.upNickname;\n    }\n    void onLongPress() => imageSaveDialog(\n      title: title,\n      cover: cover,\n    );\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onTap: () => Get.back(result: (title: title, url: item.url)),\n        onLongPress: onLongPress,\n        onSecondaryTap: PlatformUtils.isMobile ? null : onLongPress,\n        child: Padding(\n          padding: const EdgeInsets.symmetric(\n            horizontal: StyleString.safeSpace,\n            vertical: 5,\n          ),\n          child: Row(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              AspectRatio(\n                aspectRatio: StyleString.aspectRatio,\n                child: LayoutBuilder(\n                  builder: (context, boxConstraints) {\n                    return Stack(\n                      children: [\n                        NetworkImgLayer(\n                          src: cover,\n                          width: boxConstraints.maxWidth,\n                          height: boxConstraints.maxHeight,\n                        ),\n                        if (category != null)\n                          PBadge(\n                            right: 6,\n                            top: 6,\n                            text: category,\n                          ),\n                        if (duration != null)\n                          PBadge(\n                            right: 6,\n                            bottom: 6,\n                            text: DurationUtils.formatDuration(duration),\n                            type: PBadgeType.gray,\n                          ),\n                      ],\n                    );\n                  },\n                ),\n              ),\n              const SizedBox(width: 10),\n              Expanded(\n                child: Column(\n                  mainAxisSize: MainAxisSize.min,\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    Expanded(\n                      child: Text(\n                        title,\n                        maxLines: 2,\n                        overflow: TextOverflow.ellipsis,\n                      ),\n                    ),\n                    if (upNickname != null)\n                      Text(\n                        'UP: $upNickname',\n                        style: TextStyle(\n                          fontSize: 12,\n                          color: Theme.of(context).colorScheme.outline,\n                        ),\n                      ),\n                  ],\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/reply_search_item/controller.dart",
    "content": "import 'package:PiliPlus/models/common/reply/reply_search_type.dart';\nimport 'package:PiliPlus/pages/video/reply_search_item/child/controller.dart';\nimport 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass ReplySearchController extends GetxController\n    with GetSingleTickerProviderStateMixin {\n  ReplySearchController(this.type, this.oid);\n  final int type;\n  final int oid;\n\n  late final FocusNode focusNode;\n  late final TabController tabController;\n  late final TextEditingController editingController;\n\n  late final videoCtr = Get.put(\n    ReplySearchChildController(this, ReplySearchType.video),\n    tag: Utils.generateRandomString(8),\n  );\n  late final articleCtr = Get.put(\n    ReplySearchChildController(this, ReplySearchType.article),\n    tag: Utils.generateRandomString(8),\n  );\n\n  void onClear() {\n    if (editingController.value.text.isNotEmpty) {\n      editingController.clear();\n      focusNode.requestFocus();\n    } else {\n      Get.back();\n    }\n  }\n\n  @override\n  void onInit() {\n    super.onInit();\n    focusNode = FocusNode();\n    tabController = TabController(vsync: this, length: 2);\n    editingController = TextEditingController();\n    submit();\n  }\n\n  void submit() {\n    videoCtr\n      ..scrollController.jumpToTop()\n      ..onReload();\n    articleCtr\n      ..scrollController.jumpToTop()\n      ..onReload();\n  }\n\n  @override\n  void onClose() {\n    focusNode.dispose();\n    tabController.dispose();\n    editingController.dispose();\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/reply_search_item/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/common/widgets/view_safe_area.dart';\nimport 'package:PiliPlus/models/common/reply/reply_search_type.dart';\nimport 'package:PiliPlus/pages/video/reply_search_item/child/view.dart';\nimport 'package:PiliPlus/pages/video/reply_search_item/controller.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass ReplySearchPage extends StatefulWidget {\n  const ReplySearchPage({\n    super.key,\n    required this.type,\n    required this.oid,\n  });\n\n  final int type;\n  final int oid;\n\n  @override\n  State<ReplySearchPage> createState() => _ReplySearchPageState();\n}\n\nclass _ReplySearchPageState extends State<ReplySearchPage> {\n  late final ReplySearchController _controller;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = Get.put(\n      ReplySearchController(widget.type, widget.oid),\n      tag: Utils.generateRandomString(8),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        actions: [\n          IconButton(\n            tooltip: '搜索',\n            onPressed: _controller.submit,\n            icon: const Icon(Icons.search, size: 22),\n          ),\n          const SizedBox(width: 10),\n        ],\n        title: TextField(\n          autofocus: true,\n          focusNode: _controller.focusNode,\n          controller: _controller.editingController,\n          textInputAction: TextInputAction.search,\n          textAlignVertical: TextAlignVertical.center,\n          decoration: InputDecoration(\n            hintText: '搜索',\n            visualDensity: .standard,\n            border: InputBorder.none,\n            suffixIcon: IconButton(\n              tooltip: '清空',\n              icon: const Icon(Icons.clear, size: 22),\n              onPressed: _controller.onClear,\n            ),\n          ),\n          onSubmitted: (value) => _controller.submit(),\n        ),\n      ),\n      body: ViewSafeArea(\n        child: Column(\n          children: [\n            TabBar(\n              controller: _controller.tabController,\n              tabs: const [\n                Tab(text: '视频'),\n                Tab(text: '专栏'),\n              ],\n              onTap: (index) {\n                if (!_controller.tabController.indexIsChanging) {\n                  if (index == 0) {\n                    _controller.videoCtr.animateToTop();\n                  } else {\n                    _controller.articleCtr.animateToTop();\n                  }\n                }\n              },\n            ),\n            Expanded(\n              child: tabBarView(\n                controller: _controller.tabController,\n                children: [\n                  ReplySearchChildPage(\n                    controller: _controller.videoCtr,\n                    searchType: ReplySearchType.video,\n                  ),\n                  ReplySearchChildPage(\n                    controller: _controller.articleCtr,\n                    searchType: ReplySearchType.article,\n                  ),\n                ],\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/send_danmaku/view.dart",
    "content": "import 'dart:async';\n\nimport 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/view_safe_area.dart';\nimport 'package:PiliPlus/http/danmaku.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/main.dart';\nimport 'package:PiliPlus/models/common/publish_panel_type.dart';\nimport 'package:PiliPlus/pages/common/publish/common_text_pub_page.dart';\nimport 'package:PiliPlus/pages/danmaku/danmaku_model.dart';\nimport 'package:PiliPlus/pages/setting/slide_color_picker.dart';\nimport 'package:PiliPlus/plugin/pl_player/controller.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:canvas_danmaku/models/danmaku_content_item.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart' show LengthLimitingTextInputFormatter;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass SendDanmakuPanel extends CommonTextPubPage {\n  // video\n  final dynamic cid;\n  final dynamic bvid;\n  final dynamic progress;\n\n  final ValueChanged<DanmakuContentItem<DanmakuExtra>> onSuccess;\n  final bool darkVideoPage;\n\n  // config\n  final ({int? mode, int? fontSize, Color? color})? dmConfig;\n  final ValueChanged<({int mode, int fontSize, Color color})>? onSaveDmConfig;\n\n  const SendDanmakuPanel({\n    super.key,\n    super.initialValue,\n    super.onSave,\n    this.cid,\n    this.bvid,\n    this.progress,\n    required this.onSuccess,\n    required this.darkVideoPage,\n    this.dmConfig,\n    this.onSaveDmConfig,\n  });\n\n  @override\n  State<SendDanmakuPanel> createState() => _SendDanmakuPanelState();\n}\n\nclass _SendDanmakuPanelState extends CommonTextPubPageState<SendDanmakuPanel> {\n  late final RxInt _mode;\n  late final RxInt _fontSize;\n  late final Rx<Color> _color;\n\n  final List<Color> _colorList = [\n    Colors.white,\n    const Color(0xFFFE0302),\n    const Color(0xFFFF7204),\n    const Color(0xFFFFAA02),\n    const Color(0xFFFFD302),\n    const Color(0xFFFFFF00),\n    const Color(0xFFA0EE00),\n    const Color(0xFF00CD00),\n    const Color(0xFF019899),\n    const Color(0xFF4266BE),\n    const Color(0xFF89D5FF),\n    const Color(0xFFCC0273),\n    const Color(0xFF222222),\n    const Color(0xFF9B9B9B),\n  ];\n\n  @override\n  void initState() {\n    super.initState();\n    _mode = (widget.dmConfig?.mode ?? 1).obs;\n    _fontSize = (widget.dmConfig?.fontSize ?? 25).obs;\n    _color = (widget.dmConfig?.color ?? Colors.white).obs;\n    if (Pref.userInfoCache?.vipStatus == 1) {\n      _colorList.add(Colors.transparent);\n    }\n  }\n\n  @override\n  void dispose() {\n    widget.onSaveDmConfig?.call((\n      mode: _mode.value,\n      fontSize: _fontSize.value,\n      color: _color.value,\n    ));\n    super.dispose();\n  }\n\n  Widget get _buildColorPanel => Expanded(\n    child: Obx(\n      () {\n        final bool isCustomColor = !_colorList.contains(_color.value);\n        final int length = _colorList.length + (isCustomColor ? 1 : 0) + 1;\n        return GridView.builder(\n          shrinkWrap: true,\n          physics: const NeverScrollableScrollPhysics(),\n          padding: EdgeInsets.zero,\n          gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(\n            maxCrossAxisExtent: 42,\n            crossAxisSpacing: 4,\n            mainAxisSpacing: 4,\n          ),\n          itemCount: length,\n          itemBuilder: (context, index) {\n            if (index == length - 1) {\n              return GestureDetector(\n                onTap: _showColorPicker,\n                child: Container(\n                  decoration: BoxDecoration(\n                    color: themeData.colorScheme.secondaryContainer,\n                    borderRadius: const BorderRadius.all(\n                      Radius.circular(8),\n                    ),\n                  ),\n                  alignment: Alignment.center,\n                  margin: const EdgeInsets.all(2),\n                  child: Icon(\n                    size: 22,\n                    Icons.edit,\n                    color: themeData.colorScheme.onSecondaryContainer,\n                  ),\n                ),\n              );\n            } else if (index == length - 2 && isCustomColor) {\n              return _buildColorItem(_color.value);\n            }\n            return _buildColorItem(_colorList[index]);\n          },\n        );\n      },\n    ),\n  );\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    themeData = widget.darkVideoPage\n        ? MyApp.darkThemeData ?? Theme.of(context)\n        : Theme.of(context);\n  }\n\n  late ThemeData themeData;\n\n  @override\n  Widget build(BuildContext context) {\n    Widget child = ViewSafeArea(\n      child: Align(\n        alignment: Alignment.bottomCenter,\n        child: Container(\n          constraints: const BoxConstraints(maxWidth: 450),\n          decoration: BoxDecoration(\n            borderRadius: const BorderRadius.vertical(top: Radius.circular(12)),\n            color: themeData.colorScheme.surface,\n          ),\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              _buildInputView(),\n              buildPanelContainer(themeData, Colors.transparent),\n            ],\n          ),\n        ),\n      ),\n    );\n    return widget.darkVideoPage ? Theme(data: themeData, child: child) : child;\n  }\n\n  @override\n  Widget? get customPanel => Container(\n    padding: const EdgeInsets.symmetric(horizontal: 16),\n    decoration: BoxDecoration(\n      border: Border(\n        top: BorderSide(\n          color: themeData.colorScheme.outline.withValues(alpha: 0.1),\n        ),\n      ),\n    ),\n    child: ListView(\n      physics: const ClampingScrollPhysics(),\n      padding: .only(\n        top: 12,\n        bottom: 12 + MediaQuery.viewPaddingOf(context).bottom,\n      ),\n      children: [\n        Row(\n          children: [\n            Text(\n              '弹幕字号',\n              style: TextStyle(\n                fontSize: 15,\n                color: themeData.colorScheme.onSurface,\n              ),\n            ),\n            const SizedBox(width: 16),\n            _buildFontSizeItem(18, '小'),\n            const SizedBox(width: 5),\n            _buildFontSizeItem(25, '标准'),\n          ],\n        ),\n        const SizedBox(height: 12),\n        Row(\n          children: [\n            Text(\n              '弹幕样式',\n              style: TextStyle(\n                fontSize: 15,\n                color: themeData.colorScheme.onSurface,\n              ),\n            ),\n            const SizedBox(width: 16),\n            _buildPositionItem(1, '滚动'),\n            const SizedBox(width: 5),\n            _buildPositionItem(5, '顶部'),\n            const SizedBox(width: 5),\n            _buildPositionItem(4, '底部'),\n          ],\n        ),\n        const SizedBox(height: 12),\n        Row(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            Text(\n              '弹幕颜色',\n              style: TextStyle(\n                fontSize: 15,\n                color: themeData.colorScheme.onSurface,\n              ),\n            ),\n            const SizedBox(width: 16),\n            _buildColorPanel,\n          ],\n        ),\n      ],\n    ),\n  );\n\n  Widget _buildColorItem(Color color) {\n    return GestureDetector(\n      onTap: () => _color.value = color,\n      child: Container(\n        padding: const EdgeInsets.all(2),\n        decoration: BoxDecoration(\n          borderRadius: const BorderRadius.all(Radius.circular(8)),\n          border: _color.value != color\n              ? null\n              : Border.all(\n                  width: 2,\n                  color: themeData.colorScheme.primary,\n                ),\n        ),\n        child: DecoratedBox(\n          decoration: BoxDecoration(\n            color: color,\n            borderRadius: const BorderRadius.all(Radius.circular(6)),\n          ),\n          child: color == Colors.transparent\n              ? Stack(\n                  clipBehavior: Clip.none,\n                  alignment: Alignment.center,\n                  children: [\n                    Container(\n                      decoration: const BoxDecoration(\n                        borderRadius: BorderRadius.all(Radius.circular(6)),\n                        gradient: LinearGradient(\n                          colors: [\n                            Color(0xFFDD94DA),\n                            Color(0xFF72B2EA),\n                          ],\n                        ),\n                      ),\n                    ),\n                    Container(\n                      margin: const EdgeInsets.all(5),\n                      decoration: const BoxDecoration(\n                        color: Colors.white,\n                        borderRadius: BorderRadius.all(Radius.circular(4)),\n                      ),\n                    ),\n                  ],\n                )\n              : null,\n        ),\n      ),\n    );\n  }\n\n  Widget _buildPositionItem(int mode, String title) {\n    return Obx(\n      () => Expanded(\n        child: GestureDetector(\n          onTap: () => _mode.value = mode,\n          child: Container(\n            alignment: Alignment.center,\n            decoration: BoxDecoration(\n              color: _mode.value == mode\n                  ? themeData.colorScheme.secondaryContainer\n                  : themeData.colorScheme.onInverseSurface,\n              borderRadius: const BorderRadius.all(Radius.circular(8)),\n            ),\n            padding: const EdgeInsets.symmetric(vertical: 5),\n            child: Text(\n              title,\n              style: TextStyle(\n                color: _mode.value == mode\n                    ? themeData.colorScheme.onSecondaryContainer\n                    : themeData.colorScheme.outline,\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget _buildFontSizeItem(int fontSize, String title) {\n    return Obx(\n      () => Expanded(\n        child: GestureDetector(\n          onTap: () => _fontSize.value = fontSize,\n          child: Container(\n            alignment: Alignment.center,\n            decoration: BoxDecoration(\n              color: _fontSize.value == fontSize\n                  ? themeData.colorScheme.secondaryContainer\n                  : themeData.colorScheme.onInverseSurface,\n              borderRadius: const BorderRadius.all(Radius.circular(8)),\n            ),\n            padding: const EdgeInsets.symmetric(vertical: 5),\n            child: Text(\n              title,\n              style: TextStyle(\n                color: _fontSize.value == fontSize\n                    ? themeData.colorScheme.onSecondaryContainer\n                    : themeData.colorScheme.outline,\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget _buildInputView() {\n    return Padding(\n      padding: const EdgeInsets.only(left: 8, top: 2, right: 8),\n      child: Row(\n        children: [\n          Obx(\n            () {\n              final isEmoji = panelType.value == PanelType.emoji;\n              return iconButton(\n                tooltip: '弹幕样式',\n                onPressed: () {\n                  updatePanelType(\n                    isEmoji ? PanelType.keyboard : PanelType.emoji,\n                  );\n                },\n                iconSize: 24,\n                icon: const Icon(Icons.text_format),\n                iconColor: isEmoji\n                    ? themeData.colorScheme.primary\n                    : themeData.colorScheme.onSurfaceVariant,\n              );\n            },\n          ),\n          const SizedBox(width: 12),\n          Expanded(\n            child: Listener(\n              onPointerUp: (event) {\n                if (readOnly.value) {\n                  updatePanelType(PanelType.keyboard);\n                }\n              },\n              child: Obx(\n                () => TextField(\n                  controller: editController,\n                  autofocus: false,\n                  readOnly: readOnly.value,\n                  inputFormatters: [\n                    LengthLimitingTextInputFormatter(100),\n                  ],\n                  onChanged: onChanged,\n                  textInputAction: TextInputAction.send,\n                  onSubmitted: onSubmitted,\n                  focusNode: focusNode,\n                  decoration: InputDecoration(\n                    hintText: \"输入弹幕内容\",\n                    border: InputBorder.none,\n                    hintStyle: TextStyle(\n                      fontSize: 15,\n                      color: themeData.colorScheme.outline,\n                    ),\n                  ),\n                  style: themeData.textTheme.bodyLarge,\n                ),\n              ),\n            ),\n          ),\n          Obx(\n            () => enablePublish.value\n                ? iconButton(\n                    iconSize: 22,\n                    iconColor: themeData.colorScheme.onSurfaceVariant,\n                    onPressed: () {\n                      editController.clear();\n                      enablePublish.value = false;\n                    },\n                    icon: const Icon(Icons.clear),\n                  )\n                : const SizedBox.shrink(),\n          ),\n          const SizedBox(width: 12),\n          Obx(\n            () => iconButton(\n              tooltip: '发送',\n              iconSize: 22,\n              iconColor: enablePublish.value\n                  ? themeData.colorScheme.primary\n                  : themeData.colorScheme.outline,\n              onPressed: enablePublish.value ? onPublish : null,\n              icon: const Icon(Icons.send),\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n\n  Future<void> _showColorPicker() async {\n    controller.keepChatPanel();\n    await showDialog(\n      context: context,\n      builder: (context) => AlertDialog(\n        clipBehavior: Clip.hardEdge,\n        contentPadding: const EdgeInsets.symmetric(vertical: 16),\n        title: const Text('Color Picker'),\n        content: SlideColorPicker(\n          color: _color.value,\n          onChanged: (Color? color) {\n            if (color != null) {\n              _color.value = color;\n            }\n          },\n        ),\n      ),\n    );\n    controller.restoreChatPanel();\n  }\n\n  @override\n  Future<void> onCustomPublish({List? pictures}) async {\n    SmartDialog.showLoading(msg: '发送中...');\n    bool isColorful = _color.value == Colors.transparent;\n    final res = await DanmakuHttp.shootDanmaku(\n      oid: widget.cid,\n      bvid: widget.bvid,\n      progress: widget.progress,\n      msg: editController.text,\n      mode: _mode.value,\n      fontSize: _fontSize.value,\n      color: isColorful ? null : _color.value.toARGB32() & 0xFFFFFF,\n      colorful: isColorful,\n    );\n    SmartDialog.dismiss();\n    if (res case Success(:final response)) {\n      hasPub = true;\n      Get.back();\n      SmartDialog.showToast('发送成功');\n      VideoDanmaku? extra;\n      if (response.dmid case final dmid?) {\n        extra = VideoDanmaku(\n          id: dmid,\n          mid: PlPlayerController.instance!.midHash,\n        );\n      }\n      widget.onSuccess(\n        DanmakuContentItem(\n          editController.text,\n          color: isColorful ? Colors.white : _color.value,\n          type: switch (_mode.value) {\n            5 => DanmakuItemType.top,\n            4 => DanmakuItemType.bottom,\n            _ => DanmakuItemType.scroll,\n          },\n          selfSend: true,\n          isColorful: isColorful,\n          extra: extra,\n        ),\n      );\n    } else {\n      res.toast();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/view.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\nimport 'dart:math';\nimport 'dart:ui';\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/custom_icon.dart';\nimport 'package:PiliPlus/common/widgets/flutter/pop_scope.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/keep_alive_wrapper.dart';\nimport 'package:PiliPlus/common/widgets/route_aware_mixin.dart';\nimport 'package:PiliPlus/common/widgets/scroll_physics.dart';\nimport 'package:PiliPlus/common/widgets/sliver/sliver_pinned_dynamic_header.dart';\nimport 'package:PiliPlus/main.dart';\nimport 'package:PiliPlus/models/common/episode_panel_type.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/result.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/episode.dart' as ugc;\nimport 'package:PiliPlus/models_new/video/video_detail/page.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/ugc_season.dart';\nimport 'package:PiliPlus/models_new/video/video_tag/data.dart';\nimport 'package:PiliPlus/pages/common/common_intro_controller.dart';\nimport 'package:PiliPlus/pages/danmaku/view.dart';\nimport 'package:PiliPlus/pages/episode_panel/view.dart';\nimport 'package:PiliPlus/pages/video/ai_conclusion/view.dart';\nimport 'package:PiliPlus/pages/video/controller.dart';\nimport 'package:PiliPlus/pages/video/introduction/local/controller.dart';\nimport 'package:PiliPlus/pages/video/introduction/local/view.dart';\nimport 'package:PiliPlus/pages/video/introduction/pgc/controller.dart';\nimport 'package:PiliPlus/pages/video/introduction/pgc/view.dart';\nimport 'package:PiliPlus/pages/video/introduction/pgc/widgets/intro_detail.dart';\nimport 'package:PiliPlus/pages/video/introduction/ugc/controller.dart';\nimport 'package:PiliPlus/pages/video/introduction/ugc/view.dart';\nimport 'package:PiliPlus/pages/video/introduction/ugc/widgets/page.dart';\nimport 'package:PiliPlus/pages/video/introduction/ugc/widgets/season.dart';\nimport 'package:PiliPlus/pages/video/member/controller.dart';\nimport 'package:PiliPlus/pages/video/member/view.dart';\nimport 'package:PiliPlus/pages/video/related/view.dart';\nimport 'package:PiliPlus/pages/video/reply/controller.dart';\nimport 'package:PiliPlus/pages/video/reply/view.dart';\nimport 'package:PiliPlus/pages/video/view_point/view.dart';\nimport 'package:PiliPlus/pages/video/widgets/header_control.dart';\nimport 'package:PiliPlus/pages/video/widgets/player_focus.dart';\nimport 'package:PiliPlus/plugin/pl_player/controller.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/fullscreen_mode.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/play_repeat.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/play_status.dart';\nimport 'package:PiliPlus/plugin/pl_player/utils/fullscreen.dart';\nimport 'package:PiliPlus/plugin/pl_player/view/view.dart';\nimport 'package:PiliPlus/services/service_locator.dart';\nimport 'package:PiliPlus/services/shutdown_timer_service.dart'\n    show shutdownTimerService;\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/image_utils.dart';\nimport 'package:PiliPlus/utils/num_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:auto_orientation/auto_orientation.dart';\nimport 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart';\nimport 'package:floating/floating.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart' show SystemUiOverlayStyle;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:font_awesome_flutter/font_awesome_flutter.dart';\nimport 'package:get/get.dart';\nimport 'package:screen_brightness_platform_interface/screen_brightness_platform_interface.dart';\n\nclass VideoDetailPageV extends StatefulWidget {\n  const VideoDetailPageV({super.key});\n\n  @override\n  State<VideoDetailPageV> createState() => _VideoDetailPageVState();\n}\n\nclass _VideoDetailPageVState extends State<VideoDetailPageV>\n    with\n        TickerProviderStateMixin,\n        RouteAware,\n        RouteAwareMixin,\n        WidgetsBindingObserver {\n  final heroTag = Get.arguments['heroTag'];\n\n  late final VideoDetailController videoDetailController;\n  late final VideoReplyController _videoReplyController;\n  PlPlayerController? plPlayerController;\n\n  // intro ctr\n  late final CommonIntroController introController =\n      videoDetailController.isFileSource\n      ? localIntroController\n      : videoDetailController.isUgc\n      ? ugcIntroController\n      : pgcIntroController;\n  late final UgcIntroController ugcIntroController;\n  late final PgcIntroController pgcIntroController;\n  late final LocalIntroController localIntroController;\n\n  bool get autoExitFullscreen =>\n      videoDetailController.plPlayerController.autoExitFullscreen;\n\n  bool get autoPlayEnable =>\n      videoDetailController.plPlayerController.autoPlayEnable;\n\n  bool get enableVerticalExpand =>\n      videoDetailController.plPlayerController.enableVerticalExpand;\n\n  bool get pipNoDanmaku =>\n      videoDetailController.plPlayerController.pipNoDanmaku;\n\n  bool isShowing = true;\n\n  bool get isFullScreen =>\n      videoDetailController.plPlayerController.isFullScreen.value;\n\n  bool get _shouldShowSeasonPanel {\n    if (videoDetailController.isFileSource ||\n        isPortrait ||\n        !videoDetailController.isUgc) {\n      return false;\n    }\n    late final videoDetail = ugcIntroController.videoDetail.value;\n    return videoDetailController.plPlayerController.horizontalSeasonPanel &&\n        (videoDetail.ugcSeason != null ||\n            ((videoDetail.pages?.length ?? 0) > 1));\n  }\n\n  final videoReplyPanelKey = GlobalKey();\n  final videoRelatedKey = GlobalKey();\n  final videoIntroKey = GlobalKey();\n\n  @override\n  void initState() {\n    super.initState();\n\n    PlPlayerController.setPlayCallBack(playCallBack);\n    videoDetailController = Get.put(VideoDetailController(), tag: heroTag);\n\n    if (videoDetailController.showReply) {\n      _videoReplyController = Get.put(\n        VideoReplyController(\n          aid: videoDetailController.aid,\n          videoType: videoDetailController.videoType,\n          heroTag: heroTag,\n        ),\n        tag: heroTag,\n      );\n    }\n\n    if (videoDetailController.isFileSource) {\n      localIntroController = Get.put(LocalIntroController(), tag: heroTag);\n    } else if (videoDetailController.isUgc) {\n      ugcIntroController = Get.put(UgcIntroController(), tag: heroTag);\n    } else {\n      pgcIntroController = Get.put(PgcIntroController(), tag: heroTag);\n    }\n\n    videoSourceInit();\n    autoScreen();\n\n    WidgetsBinding.instance.addObserver(this);\n  }\n\n  // 获取视频资源，初始化播放器\n  void videoSourceInit() {\n    videoDetailController.queryVideoUrl(autoFullScreenFlag: true);\n    if (videoDetailController.autoPlay) {\n      plPlayerController = videoDetailController.plPlayerController;\n      plPlayerController!\n        ..addStatusLister(playerListener)\n        ..addPositionListener(positionListener);\n    }\n  }\n\n  void positionListener(Duration position) {\n    videoDetailController.playedTime = position;\n  }\n\n  @override\n  void didChangeAppLifecycleState(AppLifecycleState state) {\n    late final ctr = videoDetailController.plPlayerController;\n    if (state == AppLifecycleState.resumed) {\n      if (!ctr.showDanmaku) {\n        introController.startTimer();\n        ctr.showDanmaku = true;\n\n        // 修复从后台恢复时全屏状态下屏幕方向错误的问题\n        if (isFullScreen && Platform.isIOS) {\n          WidgetsBinding.instance.addPostFrameCallback((_) {\n            // 根据视频方向重新设置屏幕方向\n            final isVertical = videoDetailController.isVertical.value;\n            final mode = ctr.mode;\n\n            if (!(mode == FullScreenMode.vertical ||\n                (mode == FullScreenMode.auto && isVertical) ||\n                (mode == FullScreenMode.ratio &&\n                    (isVertical || maxHeight / maxWidth < kScreenRatio)))) {\n              landscape();\n            }\n          });\n        }\n      }\n    } else if (state == AppLifecycleState.paused) {\n      introController.cancelTimer();\n      ctr.showDanmaku = false;\n    }\n  }\n\n  Future<void>? playCallBack() {\n    return plPlayerController?.play();\n  }\n\n  // 播放器状态监听\n  Future<void> playerListener(PlayerStatus status) async {\n    final isPlaying = status.isPlaying;\n    try {\n      if (videoDetailController.scrollCtr.hasClients) {\n        if (isPlaying) {\n          if (!videoDetailController.isExpanding &&\n              videoDetailController.scrollCtr.offset != 0 &&\n              !videoDetailController.animationController.isAnimating) {\n            videoDetailController.isExpanding = true;\n            videoDetailController.animationController.forward(\n              from:\n                  1 -\n                  videoDetailController.scrollCtr.offset /\n                      videoDetailController.videoHeight,\n            );\n          } else {\n            refreshPage();\n          }\n        } else {\n          refreshPage();\n        }\n      }\n    } catch (e) {\n      if (kDebugMode) debugPrint('handle player status: $e');\n    }\n\n    if (status.isCompleted) {\n      try {\n        if (videoDetailController\n                .steinEdgeInfo\n                ?.edges\n                ?.questions\n                ?.firstOrNull\n                ?.choices\n                ?.isNotEmpty ==\n            true) {\n          videoDetailController.showSteinEdgeInfo.value = true;\n          return;\n        }\n      } catch (_) {}\n\n      bool exitFlag = true;\n\n      /// 顺序播放 列表循环\n      if (shutdownTimerService.isWaiting) {\n        shutdownTimerService.handleWaiting();\n      } else {\n        switch (plPlayerController!.playRepeat) {\n          case PlayRepeat.singleCycle:\n            exitFlag = false;\n            plPlayerController!.play(repeat: true);\n          case PlayRepeat.listOrder:\n          case PlayRepeat.listCycle:\n          case PlayRepeat.autoPlayRelated:\n            exitFlag = !introController.nextPlay();\n          case PlayRepeat.pause:\n        }\n      }\n\n      if (exitFlag) {\n        // 结束播放退出全屏\n        if (autoExitFullscreen) {\n          plPlayerController!.triggerFullScreen(status: false);\n          if (plPlayerController!.controlsLock.value) {\n            plPlayerController!.onLockControl(false);\n          }\n        }\n        // 播放完展示控制栏\n        if (Platform.isAndroid) {\n          if (await Floating().pipStatus == PiPStatus.disabled) {\n            plPlayerController!.onLockControl(false);\n          }\n        }\n      }\n    }\n  }\n\n  // 继续播放或重新播放\n  void continuePlay() {\n    plPlayerController!.play();\n  }\n\n  /// 未开启自动播放时触发播放\n  Future<void>? handlePlay() {\n    if (!videoDetailController.isFileSource) {\n      if (videoDetailController.isQuerying) {\n        if (kDebugMode) debugPrint('handlePlay: querying');\n        return null;\n      }\n      if (videoDetailController.videoUrl == null ||\n          videoDetailController.audioUrl == null) {\n        if (kDebugMode) {\n          debugPrint('handlePlay: videoUrl/audioUrl not initialized');\n        }\n        videoDetailController.queryVideoUrl();\n        return null;\n      }\n    }\n    final plPlayerController = this.plPlayerController =\n        videoDetailController.plPlayerController;\n    videoDetailController.autoPlay = true;\n    plPlayerController\n      ..addStatusLister(playerListener)\n      ..addPositionListener(positionListener);\n    if (plPlayerController.preInitPlayer) {\n      if (plPlayerController.autoEnterFullScreen) {\n        plPlayerController.triggerFullScreen();\n      }\n      return plPlayerController.play();\n    } else {\n      return videoDetailController.playerInit(\n        autoplay: true,\n        autoFullScreenFlag: true,\n      );\n    }\n  }\n\n  @override\n  void dispose() {\n    plPlayerController\n      ?..removeStatusLister(playerListener)\n      ..removePositionListener(positionListener);\n\n    videoDetailController.animController?.removeListener(animListener);\n\n    Get.delete<HorizontalMemberPageController>(\n      tag: videoDetailController.heroTag,\n    );\n\n    if (!Get.previousRoute.startsWith('/video')) {\n      if (Platform.isAndroid && !videoDetailController.setSystemBrightness) {\n        ScreenBrightnessPlatform.instance.resetApplicationScreenBrightness();\n      }\n      PlPlayerController.setPlayCallBack(null);\n    }\n\n    if (!videoDetailController.isFileSource) {\n      if (videoDetailController.isUgc) {\n        ugcIntroController\n          ..cancelTimer()\n          ..videoDetail.close();\n      } else {\n        pgcIntroController.cancelTimer();\n      }\n    }\n    if (!videoDetailController.horizontalScreen) {\n      AutoOrientation.portraitUpMode();\n    }\n    if (!videoDetailController.plPlayerController.isCloseAll) {\n      videoPlayerServiceHandler?.onVideoDetailDispose(heroTag);\n      if (plPlayerController != null) {\n        videoDetailController.makeHeartBeat();\n        plPlayerController!.dispose();\n      } else {\n        PlPlayerController.updatePlayCount();\n      }\n    }\n    WidgetsBinding.instance.removeObserver(this);\n    if (PlatformUtils.isMobile) {\n      showStatusBar();\n    }\n    super.dispose();\n  }\n\n  @override\n  // 离开当前页面时\n  void didPushNext() {\n    super.didPushNext();\n    isShowing = false;\n\n    WidgetsBinding.instance.removeObserver(this);\n\n    if (Platform.isAndroid && !videoDetailController.setSystemBrightness) {\n      ScreenBrightnessPlatform.instance.resetApplicationScreenBrightness();\n    }\n\n    introController.cancelTimer();\n\n    videoDetailController\n      ..videoState.value = false\n      ..cancelBlockListener()\n      ..playerStatus = plPlayerController?.playerStatus.value\n      ..brightness = plPlayerController?.brightness.value;\n    if (plPlayerController != null) {\n      videoDetailController.makeHeartBeat();\n      plPlayerController!\n        ..removeStatusLister(playerListener)\n        ..removePositionListener(positionListener)\n        ..pause();\n    }\n  }\n\n  @override\n  // 返回当前页面时\n  void didPopNext() {\n    super.didPopNext();\n\n    if (plPlayerController?.isCloseAll ?? false) {\n      return;\n    }\n\n    isShowing = true;\n\n    WidgetsBinding.instance.addObserver(this);\n\n    plPlayerController?.isLive = false;\n    if (videoDetailController.plPlayerController.playerStatus.isPlaying &&\n        videoDetailController.playerStatus != PlayerStatus.playing) {\n      videoDetailController.plPlayerController.pause();\n    }\n\n    PlPlayerController.setPlayCallBack(playCallBack);\n\n    introController.startTimer();\n\n    if (mounted &&\n        Platform.isAndroid &&\n        !videoDetailController.setSystemBrightness) {\n      if (videoDetailController.brightness != null) {\n        plPlayerController?.brightness.value =\n            videoDetailController.brightness!;\n        if (videoDetailController.brightness != -1.0) {\n          ScreenBrightnessPlatform.instance.setApplicationScreenBrightness(\n            videoDetailController.brightness!,\n          );\n        } else {\n          ScreenBrightnessPlatform.instance.resetApplicationScreenBrightness();\n        }\n      } else {\n        ScreenBrightnessPlatform.instance.resetApplicationScreenBrightness();\n      }\n    }\n\n    plPlayerController\n      ?..addStatusLister(playerListener)\n      ..addPositionListener(positionListener);\n    if (videoDetailController.autoPlay) {\n      videoDetailController.playerInit(\n        autoplay: videoDetailController.playerStatus?.isPlaying ?? false,\n      );\n    } else if (videoDetailController.plPlayerController.preInitPlayer &&\n        !videoDetailController.isQuerying &&\n        videoDetailController.videoUrl != null) {\n      videoDetailController.playerInit();\n    }\n  }\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    padding = MediaQuery.viewPaddingOf(context);\n\n    final size = MediaQuery.sizeOf(context);\n    maxWidth = size.width;\n    maxHeight = size.height;\n\n    final shortestSide = size.shortestSide;\n    final minVideoHeight = shortestSide / StyleString.aspectRatio16x9;\n    final maxVideoHeight = max(size.longestSide * 0.65, shortestSide);\n    videoDetailController\n      ..isPortrait = isPortrait = maxHeight >= maxWidth\n      ..minVideoHeight = minVideoHeight\n      ..maxVideoHeight = maxVideoHeight\n      ..videoHeight = videoDetailController.isVertical.value\n          ? maxVideoHeight\n          : minVideoHeight;\n\n    themeData = videoDetailController.plPlayerController.darkVideoPage\n        ? MyApp.darkThemeData ?? Theme.of(context)\n        : Theme.of(context);\n  }\n\n  void animListener() {\n    if (videoDetailController.animationController.isForwardOrCompleted) {\n      cal();\n      refreshPage();\n    }\n  }\n\n  late double animHeight;\n\n  void cal() {\n    if (videoDetailController.isExpanding) {\n      animHeight = clampDouble(\n        videoDetailController.videoHeight *\n            videoDetailController.animationController.value,\n        kToolbarHeight,\n        videoDetailController.videoHeight,\n      );\n    } else if (videoDetailController.isCollapsing) {\n      animHeight = clampDouble(\n        videoDetailController.maxVideoHeight -\n            (videoDetailController.maxVideoHeight -\n                    videoDetailController.minVideoHeight) *\n                videoDetailController.animationController.value,\n        videoDetailController.minVideoHeight,\n        videoDetailController.maxVideoHeight,\n      );\n    }\n  }\n\n  void refreshPage() {\n    if (videoDetailController.scrollKey.currentState?.mounted == true) {\n      videoDetailController.scrollKey.currentState?.setState(() {});\n    }\n  }\n\n  Widget get childWhenDisabled {\n    videoDetailController.animationController\n      ..removeListener(animListener)\n      ..addListener(animListener);\n    if (PlatformUtils.isMobile && mounted && isShowing && !isFullScreen) {\n      if (isPortrait) {\n        showStatusBar();\n      } else if (!videoDetailController.horizontalScreen) {\n        hideStatusBar();\n      }\n    }\n    if (PlatformUtils.isMobile) {\n      if (!isPortrait &&\n          !isFullScreen &&\n          plPlayerController != null &&\n          videoDetailController.autoPlay) {\n        WidgetsBinding.instance.addPostFrameCallback((_) {\n          plPlayerController!.triggerFullScreen(\n            status: true,\n            isManualFS: false,\n            mode: FullScreenMode.gravity,\n          );\n        });\n      } else if (isPortrait &&\n          isFullScreen &&\n          plPlayerController?.isManualFS == false &&\n          plPlayerController?.controlsLock.value == false) {\n        WidgetsBinding.instance.addPostFrameCallback((_) {\n          plPlayerController!.triggerFullScreen(status: false);\n        });\n      }\n    }\n    return Obx(\n      () {\n        final isFullScreen = this.isFullScreen;\n        return Scaffold(\n          resizeToAvoidBottomInset: false,\n          appBar: PreferredSize(\n            preferredSize: const Size.fromHeight(0),\n            child: Obx(\n              () {\n                final scrollRatio = videoDetailController.scrollRatio.value;\n                bool shouldShow =\n                    scrollRatio != 0 &&\n                    videoDetailController.scrollCtr.offset != 0 &&\n                    isPortrait;\n                return Stack(\n                  clipBehavior: Clip.none,\n                  children: [\n                    AppBar(\n                      backgroundColor: Colors.black,\n                      toolbarHeight: 0,\n                      systemOverlayStyle: Platform.isAndroid\n                          ? shouldShow\n                                ? null\n                                : SystemUiOverlayStyle(\n                                    statusBarIconBrightness: Brightness.light,\n                                    systemNavigationBarIconBrightness:\n                                        themeData.brightness.reverse,\n                                  )\n                          : null,\n                    ),\n                    if (shouldShow)\n                      AppBar(\n                        backgroundColor: themeData.colorScheme.surface\n                            .withValues(alpha: scrollRatio),\n                        toolbarHeight: 0,\n                        systemOverlayStyle: Platform.isAndroid\n                            ? SystemUiOverlayStyle(\n                                statusBarIconBrightness:\n                                    themeData.brightness.reverse,\n                                systemNavigationBarIconBrightness:\n                                    themeData.brightness.reverse,\n                              )\n                            : null,\n                      ),\n                  ],\n                );\n              },\n            ),\n          ),\n          body: ExtendedNestedScrollView(\n            key: videoDetailController.scrollKey,\n            controller: videoDetailController.scrollCtr,\n            onlyOneScrollInBody: true,\n            pinnedHeaderSliverHeightBuilder: () {\n              double pinnedHeight = this.isFullScreen || !isPortrait\n                  ? maxHeight - padding.top\n                  : videoDetailController.isExpanding ||\n                        videoDetailController.isCollapsing\n                  ? animHeight\n                  : videoDetailController.isCollapsing ||\n                        (plPlayerController?.playerStatus.isPlaying ?? false)\n                  ? videoDetailController.minVideoHeight\n                  : kToolbarHeight;\n              if (videoDetailController.isExpanding &&\n                  videoDetailController.animationController.value == 1) {\n                videoDetailController.isExpanding = false;\n                WidgetsBinding.instance.addPostFrameCallback((_) {\n                  videoDetailController.scrollRatio.value = 0;\n                  refreshPage();\n                });\n              } else if (videoDetailController.isCollapsing &&\n                  videoDetailController.animationController.value == 1) {\n                videoDetailController.isCollapsing = false;\n                WidgetsBinding.instance.addPostFrameCallback((_) {\n                  refreshPage();\n                });\n              }\n              return pinnedHeight;\n            },\n            headerSliverBuilder: (context, innerBoxIsScrolled) {\n              final height = isFullScreen || !isPortrait\n                  ? maxHeight - padding.top\n                  : videoDetailController.isExpanding ||\n                        videoDetailController.isCollapsing\n                  ? animHeight\n                  : videoDetailController.videoHeight;\n              return [\n                SliverPinnedDynamicHeader(\n                  minExtent: kToolbarHeight,\n                  maxExtent: height,\n                  child: Stack(\n                    clipBehavior: Clip.none,\n                    children: [\n                      SizedBox(\n                        width: maxWidth,\n                        height: height,\n                        child: videoPlayer(\n                          width: maxWidth,\n                          height: height,\n                        ),\n                      ),\n                      Obx(\n                        () {\n                          Widget toolbar() => Opacity(\n                            opacity: videoDetailController.scrollRatio.value,\n                            child: Container(\n                              color: themeData.colorScheme.surface,\n                              alignment: Alignment.topCenter,\n                              child: SizedBox(\n                                height: kToolbarHeight,\n                                child: Stack(\n                                  clipBehavior: Clip.none,\n                                  children: [\n                                    Align(\n                                      alignment: Alignment.centerLeft,\n                                      child: Row(\n                                        mainAxisSize: MainAxisSize.min,\n                                        children: [\n                                          SizedBox(\n                                            width: 42,\n                                            height: 34,\n                                            child: IconButton(\n                                              tooltip: '返回',\n                                              icon: Icon(\n                                                FontAwesomeIcons.arrowLeft,\n                                                size: 15,\n                                                color: themeData\n                                                    .colorScheme\n                                                    .onSurface,\n                                              ),\n                                              onPressed: Get.back,\n                                            ),\n                                          ),\n                                          SizedBox(\n                                            width: 42,\n                                            height: 34,\n                                            child: IconButton(\n                                              tooltip: '返回主页',\n                                              icon: Icon(\n                                                FontAwesomeIcons.house,\n                                                size: 15,\n                                                color: themeData\n                                                    .colorScheme\n                                                    .onSurface,\n                                              ),\n                                              onPressed: () {\n                                                videoDetailController\n                                                    .plPlayerController\n                                                  ..isCloseAll = true\n                                                  ..dispose();\n                                                Get.until(\n                                                  (route) => route.isFirst,\n                                                );\n                                              },\n                                            ),\n                                          ),\n                                        ],\n                                      ),\n                                    ),\n                                    Center(\n                                      child: Row(\n                                        mainAxisSize: MainAxisSize.min,\n                                        children: [\n                                          Icon(\n                                            Icons.play_arrow_rounded,\n                                            color:\n                                                themeData.colorScheme.primary,\n                                          ),\n                                          Text(\n                                            '${videoDetailController.playedTime == null\n                                                ? '立即'\n                                                : plPlayerController!.playerStatus.isCompleted\n                                                ? '重新'\n                                                : '继续'}播放',\n                                            style: TextStyle(\n                                              color:\n                                                  themeData.colorScheme.primary,\n                                            ),\n                                          ),\n                                        ],\n                                      ),\n                                    ),\n                                    Align(\n                                      alignment: Alignment.centerRight,\n                                      child:\n                                          videoDetailController.playedTime ==\n                                              null\n                                          ? _moreBtn(\n                                              themeData.colorScheme.onSurface,\n                                            )\n                                          : SizedBox(\n                                              width: 42,\n                                              height: 34,\n                                              child: IconButton(\n                                                tooltip: \"更多设置\",\n                                                style: const ButtonStyle(\n                                                  padding:\n                                                      WidgetStatePropertyAll(\n                                                        EdgeInsets.zero,\n                                                      ),\n                                                ),\n                                                onPressed: () =>\n                                                    (videoDetailController\n                                                                .headerCtrKey\n                                                                .currentState\n                                                            as HeaderControlState?)\n                                                        ?.showSettingSheet(),\n                                                icon: Icon(\n                                                  Icons.more_vert_outlined,\n                                                  size: 19,\n                                                  color: themeData\n                                                      .colorScheme\n                                                      .onSurface,\n                                                ),\n                                              ),\n                                            ),\n                                    ),\n                                  ],\n                                ),\n                              ),\n                            ),\n                          );\n                          return videoDetailController.scrollRatio.value == 0 ||\n                                  videoDetailController.scrollCtr.offset == 0 ||\n                                  !isPortrait\n                              ? const SizedBox.shrink()\n                              : Positioned.fill(\n                                  bottom: -2,\n                                  child: GestureDetector(\n                                    onTap: () async {\n                                      if (!videoDetailController.isFileSource) {\n                                        if (videoDetailController.isQuerying) {\n                                          if (kDebugMode) {\n                                            debugPrint(\n                                              'handlePlay: querying',\n                                            );\n                                          }\n                                          return;\n                                        }\n                                        if (videoDetailController.videoUrl ==\n                                                null ||\n                                            videoDetailController.audioUrl ==\n                                                null) {\n                                          if (kDebugMode) {\n                                            debugPrint(\n                                              'handlePlay: videoUrl/audioUrl not initialized',\n                                            );\n                                          }\n                                          videoDetailController.queryVideoUrl();\n                                          return;\n                                        }\n                                      }\n                                      videoDetailController.scrollRatio.value =\n                                          0;\n                                      if (plPlayerController == null ||\n                                          videoDetailController.playedTime ==\n                                              null) {\n                                        handlePlay();\n                                      } else {\n                                        if (plPlayerController!\n                                            .videoPlayerController!\n                                            .state\n                                            .completed) {\n                                          await plPlayerController!\n                                              .videoPlayerController!\n                                              .seek(Duration.zero);\n                                          plPlayerController!\n                                              .videoPlayerController!\n                                              .play();\n                                        } else {\n                                          plPlayerController!\n                                              .videoPlayerController!\n                                              .playOrPause();\n                                        }\n                                      }\n                                    },\n                                    behavior: HitTestBehavior.opaque,\n                                    child: toolbar(),\n                                  ),\n                                );\n                        },\n                      ),\n                    ],\n                  ),\n                ),\n              ];\n            },\n            body: Scaffold(\n              key: videoDetailController.childKey,\n              resizeToAvoidBottomInset: false,\n              backgroundColor: Colors.transparent,\n              body: Column(\n                children: [\n                  buildTabBar(onTap: videoDetailController.animToTop),\n                  Expanded(\n                    child: tabBarView(\n                      controller: videoDetailController.tabCtr,\n                      children: [\n                        videoIntro(\n                          isHorizontal: false,\n                          needCtr: false,\n                          isNested: true,\n                        ),\n                        if (videoDetailController.showReply)\n                          videoReplyPanel(isNested: true),\n                        if (_shouldShowSeasonPanel) seasonPanel,\n                      ],\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          ),\n        );\n      },\n    );\n  }\n\n  Widget get childWhenDisabledLandscape => Obx(\n    () {\n      final isFullScreen = this.isFullScreen;\n      return Scaffold(\n        resizeToAvoidBottomInset: false,\n        appBar: AppBar(backgroundColor: Colors.black, toolbarHeight: 0),\n        body: Padding(\n          padding: !isFullScreen\n              ? padding.copyWith(top: 0, bottom: 0)\n              : EdgeInsets.zero,\n          child: childWhenDisabledLandscapeInner(isFullScreen, padding),\n        ),\n      );\n    },\n  );\n\n  Widget childSplit(double ratio) {\n    final double videoHeight = maxHeight - padding.vertical;\n    final double width = videoHeight * ratio;\n    final videoWidth = isFullScreen ? maxWidth : width;\n    final introWidth = maxWidth - width - padding.horizontal;\n    return Row(\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        SizedBox(\n          width: videoWidth,\n          height: videoHeight,\n          child: videoPlayer(\n            width: videoWidth,\n            height: videoHeight,\n          ),\n        ),\n        Offstage(\n          offstage: isFullScreen,\n          child: SizedBox(\n            width: introWidth,\n            height: maxHeight - padding.top,\n            child: Scaffold(\n              key: videoDetailController.childKey,\n              resizeToAvoidBottomInset: false,\n              backgroundColor: Colors.transparent,\n              body: Column(\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  buildTabBar(),\n                  Expanded(\n                    child: tabBarView(\n                      controller: videoDetailController.tabCtr,\n                      children: [\n                        videoIntro(\n                          width: introWidth,\n                          height: maxHeight,\n                        ),\n                        if (videoDetailController.showReply) videoReplyPanel(),\n                        if (_shouldShowSeasonPanel) seasonPanel,\n                      ],\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          ),\n        ),\n      ],\n    );\n  }\n\n  Widget childWhenDisabledLandscapeInner(\n    bool isFullScreen,\n    EdgeInsets padding,\n  ) => Obx(() {\n    if (videoDetailController.isVertical.value &&\n        enableVerticalExpand &&\n        !isPortrait) {\n      final double videoHeight = maxHeight - padding.vertical;\n      final double width = videoHeight / StyleString.aspectRatio16x9;\n      final videoWidth = isFullScreen ? maxWidth : width;\n      final introWidth = (maxWidth - padding.horizontal - width) / 2;\n      final introHeight = maxHeight - padding.top;\n      return Row(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          Offstage(\n            offstage: isFullScreen,\n            child: SizedBox(\n              width: introWidth,\n              height: introHeight,\n              child: videoIntro(\n                width: introWidth,\n                height: introHeight,\n              ),\n            ),\n          ),\n          SizedBox(\n            width: videoWidth,\n            height: videoHeight,\n            child: videoPlayer(\n              width: videoWidth,\n              height: videoHeight,\n            ),\n          ),\n          Offstage(\n            offstage: isFullScreen,\n            child: SizedBox(\n              width: introWidth,\n              height: introHeight,\n              child: Scaffold(\n                key: videoDetailController.childKey,\n                resizeToAvoidBottomInset: false,\n                backgroundColor: Colors.transparent,\n                body: Column(\n                  children: [\n                    buildTabBar(showIntro: false),\n                    Expanded(\n                      child: tabBarView(\n                        controller: videoDetailController.tabCtr,\n                        children: [\n                          if (videoDetailController.showReply)\n                            videoReplyPanel(),\n                          if (_shouldShowSeasonPanel) seasonPanel,\n                        ],\n                      ),\n                    ),\n                  ],\n                ),\n              ),\n            ),\n          ),\n        ],\n      );\n    }\n    double width =\n        clampDouble(maxHeight / maxWidth * 1.08, 0.5, 0.7) * maxWidth;\n    if (maxWidth >= 560) {\n      width = maxWidth - clampDouble(maxWidth - width, 280, 425);\n    }\n    final videoWidth = isFullScreen ? maxWidth : width;\n    final double height = width / StyleString.aspectRatio16x9;\n    final videoHeight = isFullScreen ? maxHeight - padding.top : height;\n    if (height > maxHeight) {\n      return childSplit(StyleString.aspectRatio16x9);\n    }\n    final introHeight = maxHeight - height - padding.top;\n    final showIntro =\n        videoDetailController.isUgc && videoDetailController.showRelatedVideo;\n    return Row(\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            SizedBox(\n              width: videoWidth,\n              height: videoHeight,\n              child: videoPlayer(\n                width: videoWidth,\n                height: videoHeight,\n              ),\n            ),\n            if (!videoDetailController.isFileSource)\n              Offstage(\n                offstage: isFullScreen,\n                child: SizedBox(\n                  width: width,\n                  height: introHeight,\n                  child: videoIntro(\n                    width: width,\n                    height: introHeight,\n                    needRelated: false,\n                    needCtr: false,\n                  ),\n                ),\n              ),\n          ],\n        ),\n        Offstage(\n          offstage: isFullScreen,\n          child: SizedBox(\n            width: maxWidth - width - padding.horizontal,\n            height: maxHeight - padding.top,\n            child: Scaffold(\n              key: videoDetailController.childKey,\n              resizeToAvoidBottomInset: false,\n              backgroundColor: Colors.transparent,\n              body: Column(\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  buildTabBar(\n                    introText: '相关视频',\n                    showIntro: videoDetailController.isFileSource\n                        ? true\n                        : showIntro,\n                  ),\n                  Expanded(\n                    child: tabBarView(\n                      controller: videoDetailController.tabCtr,\n                      children: [\n                        if (videoDetailController.isFileSource)\n                          localIntroPanel()\n                        else if (showIntro)\n                          KeepAliveWrapper(\n                            child: CustomScrollView(\n                              key: const PageStorageKey(CommonIntroController),\n                              controller:\n                                  videoDetailController.effectiveIntroScrollCtr,\n                              slivers: [\n                                RelatedVideoPanel(\n                                  key: videoRelatedKey,\n                                  heroTag: heroTag,\n                                ),\n                              ],\n                            ),\n                          ),\n                        if (videoDetailController.showReply) videoReplyPanel(),\n                        if (_shouldShowSeasonPanel) seasonPanel,\n                      ],\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          ),\n        ),\n      ],\n    );\n  });\n\n  Widget get childWhenDisabledAlmostSquare => Obx(() {\n    final isFullScreen = this.isFullScreen;\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(backgroundColor: Colors.black, toolbarHeight: 0),\n      body: Padding(\n        padding: !isFullScreen\n            ? padding.copyWith(top: 0, bottom: 0)\n            : EdgeInsets.zero,\n        child: childWhenDisabledAlmostSquareInner(isFullScreen, padding),\n      ),\n    );\n  });\n\n  Widget childWhenDisabledAlmostSquareInner(\n    bool isFullScreen,\n    EdgeInsets padding,\n  ) => Obx(\n    () {\n      final isFullScreen = this.isFullScreen;\n      if (videoDetailController.isVertical.value &&\n          enableVerticalExpand &&\n          !isPortrait) {\n        return childSplit(9 / 16);\n      }\n      final shouldShowSeasonPanel = _shouldShowSeasonPanel;\n      final double height = maxHeight / 2.5;\n      final videoHeight = isFullScreen ? maxHeight - padding.top : height;\n      final bottomHeight = maxHeight - height - padding.top;\n      return Column(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          SizedBox(\n            width: maxWidth,\n            height: videoHeight,\n            child: videoPlayer(\n              width: maxWidth,\n              height: videoHeight,\n            ),\n          ),\n          Offstage(\n            offstage: isFullScreen,\n            child: SizedBox(\n              width: maxWidth - padding.horizontal,\n              height: bottomHeight,\n              child: Scaffold(\n                key: videoDetailController.childKey,\n                resizeToAvoidBottomInset: false,\n                backgroundColor: Colors.transparent,\n                body: Column(\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    buildTabBar(needIndicator: false),\n                    Expanded(\n                      child: Row(\n                        crossAxisAlignment: CrossAxisAlignment.start,\n                        children: [\n                          Expanded(\n                            child: videoIntro(\n                              width: () {\n                                double flex = 1;\n                                if (videoDetailController.showReply) flex++;\n                                if (shouldShowSeasonPanel) flex++;\n                                return maxWidth / flex;\n                              }(),\n                              height: bottomHeight,\n                            ),\n                          ),\n                          if (videoDetailController.showReply)\n                            Expanded(child: videoReplyPanel()),\n                          if (shouldShowSeasonPanel)\n                            Expanded(child: seasonPanel),\n                        ],\n                      ),\n                    ),\n                  ],\n                ),\n              ),\n            ),\n          ),\n        ],\n      );\n    },\n  );\n\n  Widget get manualPlayerWidget => Obx(() {\n    if (!videoDetailController.autoPlay) {\n      return Stack(\n        clipBehavior: Clip.none,\n        children: [\n          Positioned(\n            top: 0,\n            left: 0,\n            right: 0,\n            child: AppBar(\n              primary: false,\n              elevation: 0,\n              scrolledUnderElevation: 0,\n              foregroundColor: Colors.white,\n              backgroundColor: Colors.transparent,\n              automaticallyImplyLeading: false,\n              title: Row(\n                children: [\n                  SizedBox(\n                    width: 42,\n                    height: 34,\n                    child: IconButton(\n                      tooltip: '返回',\n                      icon: const Icon(\n                        FontAwesomeIcons.arrowLeft,\n                        size: 15,\n                        color: Colors.white,\n                        shadows: [\n                          Shadow(\n                            blurRadius: 1.5,\n                            color: Colors.black,\n                          ),\n                        ],\n                      ),\n                      onPressed: Get.back,\n                    ),\n                  ),\n                  SizedBox(\n                    width: 42,\n                    height: 34,\n                    child: IconButton(\n                      tooltip: '返回主页',\n                      icon: const Icon(\n                        FontAwesomeIcons.house,\n                        size: 15,\n                        color: Colors.white,\n                        shadows: [\n                          Shadow(\n                            blurRadius: 1.5,\n                            color: Colors.black,\n                          ),\n                        ],\n                      ),\n                      onPressed: () {\n                        videoDetailController.plPlayerController\n                          ..isCloseAll = true\n                          ..dispose();\n                        Get.until((route) => route.isFirst);\n                      },\n                    ),\n                  ),\n                ],\n              ),\n              actions: [\n                _moreBtn(\n                  Colors.white,\n                  shadows: const [\n                    Shadow(\n                      blurRadius: 1.5,\n                      color: Colors.black,\n                    ),\n                  ],\n                ),\n              ],\n            ),\n          ),\n          Positioned(\n            right: 12,\n            bottom: 10,\n            child: IconButton(\n              tooltip: '播放',\n              onPressed: handlePlay,\n              icon: Image.asset(\n                'assets/images/play.png',\n                width: 60,\n                height: 60,\n                cacheHeight: 60.cacheSize(context),\n              ),\n            ),\n          ),\n        ],\n      );\n    }\n    return const SizedBox.shrink();\n  });\n\n  Widget _moreBtn(Color color, {List<Shadow>? shadows}) => PopupMenuButton(\n    icon: Icon(\n      size: 22,\n      Icons.more_vert,\n      color: color,\n      shadows: shadows,\n    ),\n    itemBuilder: (BuildContext context) => <PopupMenuEntry>[\n      PopupMenuItem(\n        onTap: introController.viewLater,\n        child: const Text('稍后再看'),\n      ),\n      if (videoDetailController.epId == null)\n        PopupMenuItem(\n          onTap: () => videoDetailController.showNoteList(context),\n          child: const Text('查看笔记'),\n        ),\n      if (!videoDetailController.isFileSource)\n        PopupMenuItem(\n          onTap: () => videoDetailController.onDownload(this.context),\n          child: const Text('缓存视频'),\n        ),\n      if (videoDetailController.cover.value.isNotEmpty)\n        PopupMenuItem(\n          onTap: () =>\n              ImageUtils.downloadImg([videoDetailController.cover.value]),\n          child: const Text('保存封面'),\n        ),\n      if (!videoDetailController.isFileSource && videoDetailController.isUgc)\n        PopupMenuItem(\n          onTap: videoDetailController.toAudioPage,\n          child: const Text('听音频'),\n        ),\n      PopupMenuItem(\n        onTap: () {\n          if (!Accounts.main.isLogin) {\n            SmartDialog.showToast('账号未登录');\n          } else {\n            PageUtils.reportVideo(videoDetailController.aid);\n          }\n        },\n        child: const Text('举报'),\n      ),\n    ],\n  );\n\n  Widget plPlayer({\n    required double width,\n    required double height,\n    bool isPipMode = false,\n  }) => popScope(\n    key: videoDetailController.videoPlayerKey,\n    canPop:\n        !isFullScreen &&\n        !videoDetailController.plPlayerController.isDesktopPip &&\n        (videoDetailController.horizontalScreen || isPortrait),\n    onPopInvokedWithResult: _onPopInvokedWithResult,\n    child: Obx(\n      () =>\n          !videoDetailController.videoState.value ||\n              !videoDetailController.autoPlay ||\n              plPlayerController?.videoController == null\n          ? const SizedBox.shrink()\n          : PLVideoPlayer(\n              maxWidth: width,\n              maxHeight: height,\n              plPlayerController: plPlayerController!,\n              videoDetailController: videoDetailController,\n              introController: introController,\n              headerControl: HeaderControl(\n                key: videoDetailController.headerCtrKey,\n                isPortrait: isPortrait,\n                controller: videoDetailController.plPlayerController,\n                videoDetailCtr: videoDetailController,\n                heroTag: heroTag,\n              ),\n              danmuWidget: isPipMode && pipNoDanmaku\n                  ? null\n                  : Obx(\n                      () => PlDanmaku(\n                        key: ValueKey(videoDetailController.cid.value),\n                        isPipMode: isPipMode,\n                        cid: videoDetailController.cid.value,\n                        playerController: plPlayerController!,\n                        isFullScreen: plPlayerController!.isFullScreen.value,\n                        isFileSource: videoDetailController.isFileSource,\n                        size: Size(width, height),\n                      ),\n                    ),\n              showEpisodes: showEpisodes,\n              showViewPoints: showViewPoints,\n            ),\n    ),\n  );\n\n  late ThemeData themeData;\n  late bool isPortrait;\n  late double maxWidth;\n  late double maxHeight;\n  late EdgeInsets padding;\n\n  @override\n  Widget build(BuildContext context) {\n    Widget child;\n    if (videoDetailController.plPlayerController.isPipMode) {\n      child = plPlayer(width: maxWidth, height: maxHeight, isPipMode: true);\n    } else if (!videoDetailController.horizontalScreen) {\n      child = childWhenDisabled;\n    } else if (maxWidth / maxHeight >= kScreenRatio) {\n      child = childWhenDisabledLandscape;\n    } else if (maxWidth / StyleString.aspectRatio16x9 < 0.4 * maxHeight) {\n      child = childWhenDisabled;\n    } else {\n      child = childWhenDisabledAlmostSquare;\n    }\n    if (videoDetailController.plPlayerController.keyboardControl) {\n      child = PlayerFocus(\n        plPlayerController: videoDetailController.plPlayerController,\n        introController: introController,\n        onSendDanmaku: videoDetailController.showShootDanmakuSheet,\n        canPlay: () {\n          if (videoDetailController.autoPlay) {\n            return true;\n          }\n          handlePlay();\n          return false;\n        },\n        onSkipSegment: videoDetailController.onSkipSegment,\n        child: child,\n      );\n    }\n    return videoDetailController.plPlayerController.darkVideoPage\n        ? Theme(data: themeData, child: child)\n        : child;\n  }\n\n  Widget buildTabBar({\n    bool needIndicator = true,\n    String? introText,\n    bool showIntro = true,\n    VoidCallback? onTap,\n  }) {\n    List<String> tabs = [\n      if (showIntro)\n        videoDetailController.isFileSource ? '离线视频' : introText ?? '简介',\n      if (videoDetailController.showReply) '评论',\n      if (_shouldShowSeasonPanel) '播放列表',\n    ];\n    if (videoDetailController.tabCtr.length != tabs.length) {\n      videoDetailController.tabCtr.dispose();\n      videoDetailController.tabCtr = TabController(\n        vsync: this,\n        length: tabs.length,\n        initialIndex: tabs.isEmpty\n            ? 0\n            : videoDetailController.tabCtr.index.clamp(0, tabs.length - 1),\n      );\n    }\n\n    final flag = !needIndicator || tabs.length == 1;\n    Widget tabBar() => TabBar(\n      labelColor: flag ? themeData.colorScheme.onSurface : null,\n      indicator: flag ? const BoxDecoration() : null,\n      padding: EdgeInsets.zero,\n      controller: videoDetailController.tabCtr,\n      labelStyle:\n          TabBarTheme.of(context).labelStyle?.copyWith(fontSize: 13) ??\n          const TextStyle(fontSize: 13),\n      labelPadding: const EdgeInsets.symmetric(horizontal: 10.0),\n      dividerColor: Colors.transparent,\n      dividerHeight: 0,\n      onTap: (value) {\n        void animToTop() {\n          if (onTap != null) {\n            onTap();\n            return;\n          }\n          String text = tabs[value];\n          if (videoDetailController.isFileSource ||\n              text == '简介' ||\n              text == '相关视频') {\n            videoDetailController.introScrollCtr?.animToTop();\n          } else if (text.startsWith('评论')) {\n            _videoReplyController.animateToTop();\n          }\n        }\n\n        if (flag) {\n          animToTop();\n        } else if (!videoDetailController.tabCtr.indexIsChanging) {\n          animToTop();\n        }\n      },\n      tabs: tabs.map((text) {\n        if (text == '评论') {\n          return Obx(() {\n            final count = _videoReplyController.count.value;\n            return Tab(\n              text: '评论${count == -1 ? '' : ' ${NumUtils.numFormat(count)}'}',\n            );\n          });\n        } else {\n          return Tab(text: text);\n        }\n      }).toList(),\n    );\n\n    return DecoratedBox(\n      decoration: BoxDecoration(\n        border: Border(\n          bottom: BorderSide(\n            color: themeData.dividerColor.withValues(alpha: 0.1),\n          ),\n        ),\n      ),\n      child: SizedBox(\n        height: 45,\n        child: Row(\n          children: [\n            if (tabs.isEmpty)\n              const Spacer()\n            else\n              Flexible(\n                flex: tabs.length == 3 ? 2 : 1,\n                child: tabBar(),\n              ),\n            Flexible(\n              flex: 1,\n              child: Center(\n                child: Row(\n                  mainAxisAlignment: MainAxisAlignment.end,\n                  children: [\n                    SizedBox(\n                      height: 32,\n                      child: TextButton(\n                        style: const ButtonStyle(\n                          padding: WidgetStatePropertyAll(EdgeInsets.zero),\n                        ),\n                        onPressed: videoDetailController.showShootDanmakuSheet,\n                        child: Text(\n                          '发弹幕',\n                          style: TextStyle(\n                            fontSize: 12,\n                            color: themeData.colorScheme.onSurfaceVariant,\n                          ),\n                        ),\n                      ),\n                    ),\n                    SizedBox(\n                      width: 38,\n                      height: 38,\n                      child: Obx(\n                        () {\n                          final ctr = videoDetailController.plPlayerController;\n                          final enableShowDanmaku = ctr.enableShowDanmaku.value;\n                          return IconButton(\n                            onPressed: () {\n                              final newVal = !enableShowDanmaku;\n                              ctr.enableShowDanmaku.value = newVal;\n                              if (!ctr.tempPlayerConf) {\n                                GStorage.setting.put(\n                                  SettingBoxKey.enableShowDanmaku,\n                                  newVal,\n                                );\n                              }\n                            },\n                            icon: Icon(\n                              size: 22,\n                              enableShowDanmaku\n                                  ? CustomIcons.dm_on\n                                  : CustomIcons.dm_off,\n                              color: enableShowDanmaku\n                                  ? themeData.colorScheme.secondary\n                                  : themeData.colorScheme.outline,\n                            ),\n                          );\n                        },\n                      ),\n                    ),\n                    const SizedBox(width: 14),\n                  ],\n                ),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget videoPlayer({required double width, required double height}) {\n    final isFullScreen = this.isFullScreen;\n    return Stack(\n      clipBehavior: Clip.none,\n      children: [\n        const Positioned.fill(child: ColoredBox(color: Colors.black)),\n\n        plPlayer(width: width, height: height),\n\n        Obx(() {\n          if (!videoDetailController.autoPlay) {\n            return Positioned.fill(\n              child: GestureDetector(\n                onTap: handlePlay,\n                behavior: .opaque,\n                child: Obx(\n                  () => NetworkImgLayer(\n                    type: .emote,\n                    quality: 60,\n                    src: videoDetailController.cover.value,\n                    width: width,\n                    height: height,\n                    cacheWidth: true,\n                    getPlaceHolder: () => Center(\n                      child: Image.asset('assets/images/loading.png'),\n                    ),\n                  ),\n                ),\n              ),\n            );\n          }\n          return const SizedBox.shrink();\n        }),\n        manualPlayerWidget,\n\n        if (videoDetailController.plPlayerController.enableBlock ||\n            videoDetailController.continuePlayingPart)\n          Positioned(\n            left: 16,\n            bottom: isFullScreen ? max(75, maxHeight * 0.25) : 75,\n            width: MediaQuery.textScalerOf(context).scale(120),\n            child: AnimatedList(\n              padding: EdgeInsets.zero,\n              key: videoDetailController.listKey,\n              reverse: true,\n              shrinkWrap: true,\n              initialItemCount: videoDetailController.listData.length,\n              itemBuilder: (context, index, animation) {\n                return videoDetailController.buildItem(\n                  videoDetailController.listData[index],\n                  animation,\n                );\n              },\n            ),\n          ),\n\n        // for debug\n        // Positioned(\n        //   right: 16,\n        //   bottom: 75,\n        //   child: FilledButton.tonal(\n        //     onPressed: () {\n        //       videoDetailController.onAddItem(\n        //         SegmentModel(\n        //           UUID: '',\n        //           segmentType:\n        //               SegmentType.values[Utils.random.nextInt(\n        //                 SegmentType.values.length,\n        //               )],\n        //           segment: Pair(first: 0, second: 0),\n        //           skipType: SkipType.alwaysSkip,\n        //         ),\n        //       );\n        //     },\n        //     child: const Text('skip'),\n        //   ),\n        // ),\n        // Positioned(\n        //   right: 16,\n        //   bottom: 120,\n        //   child: FilledButton.tonal(\n        //     onPressed: () {\n        //       videoDetailController.onAddItem(2);\n        //     },\n        //     child: const Text('index'),\n        //   ),\n        // ),\n        Obx(\n          () {\n            if (videoDetailController.showSteinEdgeInfo.value) {\n              try {\n                return Align(\n                  alignment: Alignment.bottomCenter,\n                  child: Padding(\n                    padding: EdgeInsets.only(\n                      left: 16,\n                      right: 16,\n                      bottom: plPlayerController?.showControls.value == true\n                          ? 75\n                          : 16,\n                    ),\n                    child: Wrap(\n                      spacing: 25,\n                      runSpacing: 10,\n                      children: videoDetailController\n                          .steinEdgeInfo!\n                          .edges!\n                          .questions!\n                          .first\n                          .choices!\n                          .map((item) {\n                            return FilledButton.tonal(\n                              style: FilledButton.styleFrom(\n                                shape: const RoundedRectangleBorder(\n                                  borderRadius: BorderRadius.all(\n                                    Radius.circular(6),\n                                  ),\n                                ),\n                                backgroundColor: themeData\n                                    .colorScheme\n                                    .secondaryContainer\n                                    .withValues(alpha: 0.8),\n                                padding: const EdgeInsets.symmetric(\n                                  horizontal: 15,\n                                  vertical: 10,\n                                ),\n                                visualDensity: VisualDensity.compact,\n                                tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n                              ),\n                              onPressed: () {\n                                ugcIntroController.onChangeEpisode(\n                                  item,\n                                  isStein: true,\n                                );\n                                videoDetailController.getSteinEdgeInfo(\n                                  item.id,\n                                );\n                              },\n                              child: Text(item.option!),\n                            );\n                          })\n                          .toList(),\n                    ),\n                  ),\n                );\n              } catch (e) {\n                if (kDebugMode) debugPrint('build stein edges: $e');\n                return const SizedBox.shrink();\n              }\n            }\n            return const SizedBox.shrink();\n          },\n        ),\n      ],\n    );\n  }\n\n  Widget localIntroPanel({\n    bool needCtr = true,\n  }) {\n    return CustomScrollView(\n      controller: needCtr\n          ? videoDetailController.effectiveIntroScrollCtr\n          : null,\n      physics: !needCtr\n          ? const AlwaysScrollableScrollPhysics(parent: ClampingScrollPhysics())\n          : null,\n      key: const PageStorageKey(CommonIntroController),\n      slivers: [\n        SliverPadding(\n          padding: EdgeInsets.only(top: 7, bottom: padding.bottom + 100),\n          sliver: LocalIntroPanel(\n            key: videoRelatedKey,\n            heroTag: heroTag,\n          ),\n        ),\n      ],\n    );\n  }\n\n  Widget videoIntro({\n    double? width,\n    double? height,\n    bool? isHorizontal,\n    bool needRelated = true,\n    bool needCtr = true,\n    bool isNested = false,\n  }) {\n    if (videoDetailController.isFileSource) {\n      return localIntroPanel(needCtr: needCtr);\n    }\n    Widget introPanel() {\n      Widget child = CustomScrollView(\n        key: const PageStorageKey(CommonIntroController),\n        controller: needCtr\n            ? videoDetailController.effectiveIntroScrollCtr\n            : null,\n        physics: !needCtr\n            ? const AlwaysScrollableScrollPhysics(\n                parent: ClampingScrollPhysics(),\n              )\n            : null,\n        slivers: [\n          if (videoDetailController.isUgc) ...[\n            UgcIntroPanel(\n              key: videoIntroKey,\n              heroTag: heroTag,\n              showAiBottomSheet: showAiBottomSheet,\n              showEpisodes: showEpisodes,\n              onShowMemberPage: onShowMemberPage,\n              isPortrait: isPortrait,\n              isHorizontal: isHorizontal ?? width! / height! >= kScreenRatio,\n            ),\n            if (needRelated && videoDetailController.showRelatedVideo) ...[\n              SliverToBoxAdapter(\n                child: Padding(\n                  padding: const EdgeInsets.only(\n                    top: StyleString.safeSpace,\n                  ),\n                  child: Divider(\n                    height: 1,\n                    indent: 12,\n                    endIndent: 12,\n                    color: themeData.colorScheme.outline.withValues(\n                      alpha: 0.08,\n                    ),\n                  ),\n                ),\n              ),\n              RelatedVideoPanel(key: videoRelatedKey, heroTag: heroTag),\n            ],\n          ] else\n            PgcIntroPage(\n              key: videoIntroKey,\n              heroTag: heroTag,\n              cid: videoDetailController.cid.value,\n              showEpisodes: showEpisodes,\n              showIntroDetail: showIntroDetail,\n              maxWidth: width ?? maxWidth,\n              isLandscape: !isPortrait,\n            ),\n          SliverToBoxAdapter(\n            child: SizedBox(\n              height:\n                  (videoDetailController.isPlayAll && !isPortrait\n                      ? 80\n                      : StyleString.safeSpace) +\n                  padding.bottom,\n            ),\n          ),\n        ],\n      );\n      if (isNested) {\n        child = ExtendedVisibilityDetector(\n          uniqueKey: const Key('intro-panel'),\n          child: child,\n        );\n      }\n      return KeepAliveWrapper(child: child);\n    }\n\n    if (videoDetailController.isPlayAll) {\n      return Stack(\n        clipBehavior: Clip.none,\n        children: [\n          introPanel(),\n          Positioned(\n            left: 12,\n            right: 12,\n            bottom: 12 + padding.bottom,\n            child: Material(\n              type: MaterialType.transparency,\n              child: InkWell(\n                onTap: () => videoDetailController.showMediaListPanel(context),\n                borderRadius: const BorderRadius.all(Radius.circular(14)),\n                child: Container(\n                  height: 54,\n                  padding: const EdgeInsets.symmetric(horizontal: 16),\n                  decoration: BoxDecoration(\n                    color: themeData.colorScheme.secondaryContainer.withValues(\n                      alpha: 0.95,\n                    ),\n                    borderRadius: const BorderRadius.all(Radius.circular(14)),\n                  ),\n                  child: Row(\n                    children: [\n                      const Icon(Icons.playlist_play, size: 24),\n                      const SizedBox(width: 10),\n                      Text(\n                        videoDetailController.watchLaterTitle,\n                        style: TextStyle(\n                          color: themeData.colorScheme.onSecondaryContainer,\n                          fontWeight: FontWeight.bold,\n                          letterSpacing: 0.2,\n                        ),\n                      ),\n                      const Spacer(),\n                      const Icon(Icons.keyboard_arrow_up_rounded, size: 26),\n                    ],\n                  ),\n                ),\n              ),\n            ),\n          ),\n        ],\n      );\n    }\n    return introPanel();\n  }\n\n  Widget get seasonPanel {\n    final videoDetail = ugcIntroController.videoDetail.value;\n    return KeepAliveWrapper(\n      child: Column(\n        children: [\n          if ((videoDetail.pages?.length ?? 0) > 1)\n            if (videoDetail.ugcSeason != null)\n              Padding(\n                padding: const EdgeInsets.symmetric(horizontal: 14),\n                child: PagesPanel(\n                  heroTag: heroTag,\n                  ugcIntroController: ugcIntroController,\n                  bvid: ugcIntroController.bvid,\n                  showEpisodes: showEpisodes,\n                ),\n              )\n            else\n              Expanded(\n                child: Obx(\n                  () => EpisodePanel(\n                    heroTag: heroTag,\n                    enableSlide: false,\n                    ugcIntroController: videoDetailController.isUgc\n                        ? ugcIntroController\n                        : null,\n                    type: EpisodeType.part,\n                    list: [videoDetail.pages!],\n                    cover: videoDetailController.cover.value,\n                    bvid: videoDetailController.bvid,\n                    aid: videoDetailController.aid,\n                    cid: videoDetailController.cid.value,\n                    isReversed: videoDetail.isPageReversed,\n                    onChangeEpisode: videoDetailController.isUgc\n                        ? ugcIntroController.onChangeEpisode\n                        : pgcIntroController.onChangeEpisode,\n                    showTitle: false,\n                    isSupportReverse: videoDetailController.isUgc,\n                    onReverse: () => onReversePlay(isSeason: false),\n                  ),\n                ),\n              ),\n          if (videoDetail.ugcSeason != null) ...[\n            if ((videoDetail.pages?.length ?? 0) > 1) ...[\n              const SizedBox(height: 8),\n              Divider(\n                height: 1,\n                color: themeData.colorScheme.outline.withValues(alpha: 0.1),\n              ),\n            ],\n            Padding(\n              padding: const EdgeInsets.symmetric(horizontal: 12),\n              child: Obx(\n                () => SeasonPanel(\n                  key: ValueKey(introController.videoDetail.value),\n                  heroTag: heroTag,\n                  canTap: false,\n                  showEpisodes: showEpisodes,\n                  ugcIntroController: ugcIntroController,\n                ),\n              ),\n            ),\n            Expanded(\n              child: Obx(\n                () => EpisodePanel(\n                  heroTag: heroTag,\n                  enableSlide: false,\n                  ugcIntroController: videoDetailController.isUgc\n                      ? ugcIntroController\n                      : null,\n                  type: EpisodeType.season,\n                  initialTabIndex: videoDetailController.seasonIndex.value,\n                  cover: videoDetailController.cover.value,\n                  seasonId: videoDetail.ugcSeason!.id,\n                  list: videoDetail.ugcSeason!.sections!,\n                  bvid: videoDetailController.bvid,\n                  aid: videoDetailController.aid,\n                  cid: videoDetailController.seasonCid ?? 0,\n                  isReversed: ugcIntroController\n                      .videoDetail\n                      .value\n                      .ugcSeason!\n                      .sections![videoDetailController.seasonIndex.value]\n                      .isReversed,\n                  onChangeEpisode: videoDetailController.isUgc\n                      ? ugcIntroController.onChangeEpisode\n                      : pgcIntroController.onChangeEpisode,\n                  showTitle: false,\n                  isSupportReverse: videoDetailController.isUgc,\n                  onReverse: () => onReversePlay(isSeason: true),\n                ),\n              ),\n            ),\n          ],\n        ],\n      ),\n    );\n  }\n\n  Widget videoReplyPanel({bool isNested = false}) => VideoReplyPanel(\n    key: videoReplyPanelKey,\n    isNested: isNested,\n    heroTag: heroTag,\n  );\n\n  // ai总结\n  void showAiBottomSheet() {\n    videoDetailController.childKey.currentState?.showBottomSheet(\n      backgroundColor: Colors.transparent,\n      constraints: const BoxConstraints(),\n      (context) =>\n          AiConclusionPanel(item: ugcIntroController.aiConclusionResult!),\n    );\n  }\n\n  void showIntroDetail(\n    PgcInfoModel videoDetail,\n    List<VideoTagItem>? videoTags,\n  ) {\n    videoDetailController.childKey.currentState?.showBottomSheet(\n      backgroundColor: Colors.transparent,\n      constraints: const BoxConstraints(),\n      (context) => PgcIntroPanel(\n        item: videoDetail,\n        videoTags: videoTags,\n      ),\n    );\n  }\n\n  void showEpisodes([\n    int? index,\n    UgcSeason? season,\n    List<ugc.BaseEpisodeItem>? episodes,\n    String? bvid,\n    int? aid,\n    int? cid,\n  ]) {\n    assert((cid == null) == (bvid == null));\n    final isFullScreen = this.isFullScreen;\n    if (cid == null) {\n      videoDetailController.showMediaListPanel(context);\n      return;\n    }\n    Widget listSheetContent({bool enableSlide = true}) => EpisodePanel(\n      heroTag: heroTag,\n      ugcIntroController: videoDetailController.isUgc\n          ? ugcIntroController\n          : null,\n      type: season != null\n          ? EpisodeType.season\n          : episodes is List<Part>\n          ? EpisodeType.part\n          : EpisodeType.pgc,\n      cover: videoDetailController.cover.value,\n      enableSlide: enableSlide,\n      initialTabIndex: index ?? 0,\n      bvid: bvid!,\n      aid: aid,\n      cid: cid,\n      seasonId: season?.id,\n      list: season != null ? season.sections! : [episodes],\n      isReversed: !videoDetailController.isUgc\n          ? null\n          : season != null\n          ? ugcIntroController\n                .videoDetail\n                .value\n                .ugcSeason!\n                .sections![videoDetailController.seasonIndex.value]\n                .isReversed\n          : ugcIntroController.videoDetail.value.isPageReversed,\n      isSupportReverse: videoDetailController.isUgc,\n      onChangeEpisode: videoDetailController.isUgc\n          ? ugcIntroController.onChangeEpisode\n          : pgcIntroController.onChangeEpisode,\n      onClose: Get.back,\n      onReverse: () {\n        Get.back();\n        onReversePlay(isSeason: season != null);\n      },\n    );\n    if (isFullScreen || videoDetailController.showVideoSheet) {\n      PageUtils.showVideoBottomSheet(\n        context,\n        isFullScreen: () => isFullScreen,\n        child: videoDetailController.plPlayerController.darkVideoPage\n            ? Theme(\n                data: themeData,\n                child: listSheetContent(enableSlide: false),\n              )\n            : listSheetContent(enableSlide: false),\n      );\n    } else {\n      videoDetailController.childKey.currentState?.showBottomSheet(\n        backgroundColor: Colors.transparent,\n        constraints: const BoxConstraints(),\n        (context) => listSheetContent(),\n      );\n    }\n  }\n\n  void onReversePlay({required bool isSeason}) {\n    if (isSeason && videoDetailController.isPlayAll) {\n      SmartDialog.showToast('当前为播放全部，合集不支持倒序');\n      return;\n    }\n\n    final videoDetail = ugcIntroController.videoDetail.value;\n    if (isSeason) {\n      // reverse season\n      final item = videoDetail\n          .ugcSeason!\n          .sections![videoDetailController.seasonIndex.value];\n      item\n        ..isReversed = !item.isReversed\n        ..episodes = item.episodes!.reversed.toList();\n\n      if (!videoDetailController.plPlayerController.reverseFromFirst) {\n        // keep current episode\n        videoDetailController\n          ..seasonIndex.refresh()\n          ..cid.refresh();\n      } else {\n        // switch to first episode\n        final episode = ugcIntroController\n            .videoDetail\n            .value\n            .ugcSeason!\n            .sections![videoDetailController.seasonIndex.value]\n            .episodes!\n            .first;\n        if (episode.cid != videoDetailController.cid.value) {\n          ugcIntroController.onChangeEpisode(episode);\n          videoDetailController.seasonCid = episode.cid;\n        } else {\n          videoDetailController\n            ..seasonIndex.refresh()\n            ..cid.refresh();\n        }\n      }\n    } else {\n      // reverse part\n      videoDetail\n        ..isPageReversed = !videoDetail.isPageReversed\n        ..pages = videoDetail.pages!.reversed.toList();\n      if (!videoDetailController.plPlayerController.reverseFromFirst) {\n        // keep current episode\n        videoDetailController.cid.refresh();\n      } else {\n        // switch to first episode\n        final episode = videoDetail.pages!.first;\n        if (episode.cid != videoDetailController.cid.value) {\n          ugcIntroController.onChangeEpisode(episode);\n        } else {\n          videoDetailController.cid.refresh();\n        }\n      }\n    }\n  }\n\n  void showViewPoints() {\n    if (isFullScreen || videoDetailController.showVideoSheet) {\n      PageUtils.showVideoBottomSheet(\n        context,\n        isFullScreen: () => isFullScreen,\n        child: videoDetailController.plPlayerController.darkVideoPage\n            ? Theme(\n                data: themeData,\n                child: ViewPointsPage(\n                  enableSlide: false,\n                  videoDetailController: videoDetailController,\n                  plPlayerController: plPlayerController,\n                ),\n              )\n            : ViewPointsPage(\n                enableSlide: false,\n                videoDetailController: videoDetailController,\n                plPlayerController: plPlayerController,\n              ),\n      );\n    } else {\n      videoDetailController.childKey.currentState?.showBottomSheet(\n        backgroundColor: Colors.transparent,\n        constraints: const BoxConstraints(),\n        (context) => ViewPointsPage(\n          videoDetailController: videoDetailController,\n          plPlayerController: plPlayerController,\n        ),\n      );\n    }\n  }\n\n  void _onPopInvokedWithResult(bool didPop, result) {\n    if (plPlayerController?.onPopInvokedWithResult(didPop, result) ?? false) {\n      return;\n    }\n    if (PlatformUtils.isMobile &&\n        !videoDetailController.horizontalScreen &&\n        !isPortrait) {\n      verticalScreenForTwoSeconds();\n    }\n  }\n\n  void onShowMemberPage(int? mid) {\n    videoDetailController.childKey.currentState?.showBottomSheet(\n      shape: const RoundedRectangleBorder(),\n      constraints: const BoxConstraints(),\n      (context) {\n        return HorizontalMemberPage(\n          mid: mid,\n          videoDetailController: videoDetailController,\n          ugcIntroController: ugcIntroController,\n        );\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/view_point/view.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/progress_bar/segment_progress_bar.dart';\nimport 'package:PiliPlus/pages/common/slide/common_slide_page.dart';\nimport 'package:PiliPlus/pages/video/controller.dart';\nimport 'package:PiliPlus/plugin/pl_player/controller.dart';\nimport 'package:PiliPlus/utils/duration_utils.dart';\nimport 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass ViewPointsPage extends CommonSlidePage {\n  const ViewPointsPage({\n    super.key,\n    super.enableSlide,\n    required this.videoDetailController,\n    required this.plPlayerController,\n  });\n\n  final VideoDetailController videoDetailController;\n  final PlPlayerController? plPlayerController;\n\n  @override\n  State<ViewPointsPage> createState() => _ViewPointsPageState();\n}\n\nclass _ViewPointsPageState extends State<ViewPointsPage>\n    with SingleTickerProviderStateMixin, CommonSlideMixin {\n  VideoDetailController get videoDetailController =>\n      widget.videoDetailController;\n  PlPlayerController? get plPlayerController => widget.plPlayerController;\n\n  int currentIndex = -1;\n\n  @override\n  Widget buildPage(ThemeData theme) {\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        primary: false,\n        automaticallyImplyLeading: false,\n        titleSpacing: 16,\n        title: const Text('分段信息'),\n        toolbarHeight: 45,\n        actions: [\n          const Text(\n            '分段进度条 ',\n            style: TextStyle(fontSize: 16),\n          ),\n          Obx(\n            () => Transform.scale(\n              alignment: Alignment.centerLeft,\n              scale: 0.8,\n              child: Switch(\n                value: videoDetailController.showVP.value,\n                onChanged: (value) =>\n                    videoDetailController.showVP.value = value,\n              ),\n            ),\n          ),\n          iconButton(\n            context: context,\n            size: 30,\n            icon: const Icon(Icons.clear),\n            tooltip: '关闭',\n            onPressed: Get.back,\n          ),\n          const SizedBox(width: 16),\n        ],\n        shape: Border(\n          bottom: BorderSide(\n            color: theme.colorScheme.outline.withValues(alpha: 0.1),\n          ),\n        ),\n      ),\n      body: enableSlide ? slideList(theme) : buildList(theme),\n    );\n  }\n\n  late Key _key;\n  late bool _isNested;\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    final controller = PrimaryScrollController.of(context);\n    _isNested = controller is ExtendedNestedScrollController;\n    _key = ValueKey(controller.hashCode);\n  }\n\n  @override\n  Widget buildList(ThemeData theme) {\n    final child = ListView.builder(\n      key: _key,\n      physics: const AlwaysScrollableScrollPhysics(),\n      padding: EdgeInsets.only(\n        top: 7,\n        bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n      ),\n      itemCount: videoDetailController.viewPointList.length,\n      itemBuilder: (context, index) {\n        final segment = videoDetailController.viewPointList[index];\n        if (currentIndex == -1 && segment.from != null && segment.to != null) {\n          final positionSeconds =\n              videoDetailController.plPlayerController.positionSeconds.value;\n          if (positionSeconds >= segment.from! &&\n              positionSeconds < segment.to!) {\n            currentIndex = index;\n          }\n        }\n        final isCurr = currentIndex == index;\n        return _buildItem(theme, segment, isCurr);\n      },\n    );\n    if (_isNested) {\n      return ExtendedVisibilityDetector(\n        uniqueKey: const Key('viewpoints'),\n        child: child,\n      );\n    }\n    return child;\n  }\n\n  Widget _buildItem(ThemeData theme, ViewPointSegment segment, bool isCurr) {\n    final theme = Theme.of(context);\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        onTap: segment.from != null\n            ? () {\n                Get.back();\n                plPlayerController?.seekTo(\n                  Duration(seconds: segment.from!),\n                  isSeek: false,\n                );\n              }\n            : null,\n        child: Padding(\n          padding: const EdgeInsets.symmetric(\n            horizontal: StyleString.safeSpace,\n            vertical: 5,\n          ),\n          child: Row(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              NetworkImgLayer(\n                src: segment.url,\n                width: 140.8,\n                height: 88,\n              ),\n              const SizedBox(width: 10),\n              Expanded(\n                child: Column(\n                  spacing: 10,\n                  mainAxisSize: MainAxisSize.min,\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    Text(\n                      segment.title ?? '',\n                      maxLines: 2,\n                      overflow: TextOverflow.ellipsis,\n                      style: isCurr\n                          ? TextStyle(\n                              fontWeight: FontWeight.bold,\n                              color: theme.colorScheme.primary,\n                            )\n                          : null,\n                    ),\n                    Text(\n                      '${segment.from != null ? DurationUtils.formatDuration(segment.from) : ''} - '\n                      '${segment.to != null ? DurationUtils.formatDuration(segment.to) : ''}',\n                      style: TextStyle(color: theme.colorScheme.outline),\n                    ),\n                  ],\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/widgets/header_control.dart",
    "content": "import 'dart:async';\nimport 'dart:convert' show jsonDecode, utf8;\nimport 'dart:io';\nimport 'dart:math';\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/common/widgets/custom_icon.dart';\nimport 'package:PiliPlus/common/widgets/dialog/report.dart';\nimport 'package:PiliPlus/common/widgets/marquee.dart';\nimport 'package:PiliPlus/http/danmaku.dart';\nimport 'package:PiliPlus/http/danmaku_block.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/live.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/video.dart';\nimport 'package:PiliPlus/models/common/super_resolution_type.dart';\nimport 'package:PiliPlus/models/common/video/audio_quality.dart';\nimport 'package:PiliPlus/models/common/video/cdn_type.dart';\nimport 'package:PiliPlus/models/common/video/video_decode_type.dart';\nimport 'package:PiliPlus/models/common/video/video_quality.dart';\nimport 'package:PiliPlus/models/video/play/url.dart';\nimport 'package:PiliPlus/models_new/video/video_play_info/subtitle.dart';\nimport 'package:PiliPlus/pages/common/common_intro_controller.dart';\nimport 'package:PiliPlus/pages/danmaku/danmaku_model.dart';\nimport 'package:PiliPlus/pages/setting/widgets/popup_item.dart';\nimport 'package:PiliPlus/pages/setting/widgets/select_dialog.dart';\nimport 'package:PiliPlus/pages/video/controller.dart';\nimport 'package:PiliPlus/pages/video/introduction/local/controller.dart';\nimport 'package:PiliPlus/pages/video/introduction/pgc/controller.dart';\nimport 'package:PiliPlus/pages/video/introduction/ugc/controller.dart';\nimport 'package:PiliPlus/pages/video/introduction/ugc/widgets/action_item.dart';\nimport 'package:PiliPlus/pages/video/introduction/ugc/widgets/menu_row.dart';\nimport 'package:PiliPlus/pages/video/widgets/header_mixin.dart';\nimport 'package:PiliPlus/plugin/pl_player/controller.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/data_source.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/play_repeat.dart';\nimport 'package:PiliPlus/plugin/pl_player/utils/fullscreen.dart';\nimport 'package:PiliPlus/services/service_locator.dart';\nimport 'package:PiliPlus/services/shutdown_timer_service.dart'\n    show shutdownTimerService;\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/accounts/account.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/extension/string_ext.dart';\nimport 'package:PiliPlus/utils/image_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:PiliPlus/utils/video_utils.dart';\nimport 'package:battery_plus/battery_plus.dart';\nimport 'package:canvas_danmaku/canvas_danmaku.dart';\nimport 'package:dio/dio.dart';\nimport 'package:easy_debounce/easy_throttle.dart';\nimport 'package:file_picker/file_picker.dart';\nimport 'package:floating/floating.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart' hide showBottomSheet;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:font_awesome_flutter/font_awesome_flutter.dart';\nimport 'package:get/get.dart';\nimport 'package:hive_ce/hive.dart';\nimport 'package:intl/intl.dart' show DateFormat;\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\n\nmixin TimeBatteryMixin<T extends StatefulWidget> on State<T> {\n  PlPlayerController get plPlayerController;\n  late final titleKey = GlobalKey();\n  ContextSingleTicker? provider;\n  ContextSingleTicker get effectiveProvider => provider ??= ContextSingleTicker(\n    context,\n    autoStart: () =>\n        plPlayerController.showControls.value &&\n        !plPlayerController.controlsLock.value,\n  );\n\n  bool get isPortrait;\n  bool get isFullScreen;\n  bool get horizontalScreen;\n\n  Timer? _clock;\n  RxString now = ''.obs;\n\n  static final _format = DateFormat('HH:mm');\n\n  @override\n  void dispose() {\n    stopClock();\n    super.dispose();\n  }\n\n  void startClock() {\n    if (!_showCurrTime) return;\n    if (_clock == null) {\n      now.value = _format.format(DateTime.now());\n      _clock ??= Timer.periodic(const Duration(seconds: 1), (Timer t) {\n        if (!mounted) {\n          stopClock();\n          return;\n        }\n        now.value = _format.format(DateTime.now());\n      });\n    }\n  }\n\n  void stopClock() {\n    _clock?.cancel();\n    _clock = null;\n  }\n\n  bool _showCurrTime = false;\n  void showCurrTimeIfNeeded(bool isFullScreen) {\n    _showCurrTime = !isPortrait && (isFullScreen || !horizontalScreen);\n    if (!_showCurrTime) {\n      stopClock();\n    }\n  }\n\n  late final _battery = Battery();\n  late final RxnInt _batteryLevel = RxnInt();\n  late final _showBatteryLevel = Pref.showBatteryLevel;\n  void getBatteryLevelIfNeeded() {\n    if (!_showCurrTime || !_showBatteryLevel) return;\n    EasyThrottle.throttle(\n      'getBatteryLevel$hashCode',\n      const Duration(seconds: 30),\n      () async {\n        try {\n          _batteryLevel.value = await _battery.batteryLevel;\n        } catch (_) {}\n      },\n    );\n  }\n\n  List<Widget>? get timeBatteryWidgets {\n    if (_showCurrTime) {\n      return [\n        if (_showBatteryLevel) ...[\n          Obx(\n            () {\n              final batteryLevel = _batteryLevel.value;\n              if (batteryLevel == null) {\n                return const SizedBox.shrink();\n              }\n              return Text(\n                '$batteryLevel%',\n                style: const TextStyle(\n                  color: Colors.white,\n                  fontSize: 13,\n                ),\n              );\n            },\n          ),\n          const SizedBox(width: 10),\n        ],\n        Obx(\n          () => Text(\n            now.value,\n            style: const TextStyle(\n              color: Colors.white,\n              fontSize: 13,\n            ),\n          ),\n        ),\n      ];\n    }\n    return null;\n  }\n}\n\nclass HeaderControl extends StatefulWidget {\n  const HeaderControl({\n    required this.isPortrait,\n    required this.controller,\n    required this.videoDetailCtr,\n    required this.heroTag,\n    super.key,\n  });\n\n  final bool isPortrait;\n  final PlPlayerController controller;\n  final VideoDetailController videoDetailCtr;\n  final String heroTag;\n\n  @override\n  State<HeaderControl> createState() => HeaderControlState();\n\n  static Future<bool> likeDanmaku(VideoDanmaku extra, int cid) async {\n    if (!Accounts.main.isLogin) {\n      SmartDialog.showToast('请先登录');\n      return false;\n    }\n    final isLike = !extra.isLike;\n    final res = await DanmakuHttp.danmakuLike(\n      isLike: isLike,\n      cid: cid,\n      id: extra.id,\n    );\n    if (res.isSuccess) {\n      extra.isLike = isLike;\n      if (isLike) {\n        extra.like++;\n      } else {\n        extra.like--;\n      }\n      SmartDialog.showToast('${isLike ? '' : '取消'}点赞成功');\n      return true;\n    } else {\n      res.toast();\n      if (res case Error(:final code)) {\n        if (code == 65006) {\n          extra.isLike = true;\n          return true;\n        }\n        if (code == 65004) {\n          extra.isLike = false;\n          return true;\n        }\n      }\n      return false;\n    }\n  }\n\n  static Future<bool> deleteDanmaku(int id, int cid) async {\n    final res = await DanmakuHttp.danmakuRecall(\n      cid: cid,\n      id: id,\n    );\n    if (res.isSuccess) {\n      SmartDialog.showToast('删除成功');\n      return true;\n    } else {\n      res.toast();\n      return false;\n    }\n  }\n\n  static Future<void> reportDanmaku(\n    BuildContext context, {\n    required VideoDanmaku extra,\n    required PlPlayerController ctr,\n  }) {\n    if (Accounts.main.isLogin) {\n      return autoWrapReportDialog(\n        context,\n        ReportOptions.danmakuReport,\n        (reasonType, reasonDesc, banUid) {\n          if (banUid) {\n            final filter = ctr.filters;\n            if (filter.dmUid.add(extra.mid)) {\n              filter.count++;\n              GStorage.localCache.put(\n                LocalCacheKey.danmakuFilterRules,\n                filter,\n              );\n            }\n            DanmakuFilterHttp.danmakuFilterAdd(\n              filter: extra.mid,\n              type: 2,\n            );\n          }\n          return DanmakuHttp.danmakuReport(\n            reason: reasonType == 0 ? 11 : reasonType,\n            cid: ctr.cid!,\n            id: extra.id,\n            content: reasonType == 0 ? reasonDesc : null,\n          );\n        },\n      );\n    } else {\n      return SmartDialog.showToast('请先登录');\n    }\n  }\n\n  static Future<void> reportLiveDanmaku(\n    BuildContext context, {\n    required int roomId,\n    required String msg,\n    required LiveDanmaku extra,\n  }) {\n    if (Accounts.main.isLogin) {\n      return autoWrapReportDialog(\n        context,\n        ban: false,\n        ReportOptions.liveDanmakuReport,\n        (reasonType, reasonDesc, banUid) {\n          // if (banUid) {\n          //   final filter = ctr.filters;\n          //   if (filter.dmUid.add(extra.mid)) {\n          //     filter.count++;\n          //     GStorage.localCache.put(\n          //       LocalCacheKey.danmakuFilterRules,\n          //       filter,\n          //     );\n          //   }\n          //   DanmakuFilterHttp.danmakuFilterAdd(\n          //     filter: extra.mid,\n          //     type: 2,\n          //   );\n          // }\n          return LiveHttp.liveDmReport(\n            roomId: roomId,\n            mid: extra.mid,\n            msg: msg,\n            reason: ReportOptions.liveDanmakuReport['']![reasonType]!,\n            reasonId: reasonType,\n            dmType: extra.dmType,\n            idStr: extra.id,\n            ts: extra.ts,\n            sign: extra.ct,\n          );\n        },\n      );\n    } else {\n      return SmartDialog.showToast('请先登录');\n    }\n  }\n}\n\nclass HeaderControlState extends State<HeaderControl>\n    with HeaderMixin, TimeBatteryMixin {\n  @override\n  late final PlPlayerController plPlayerController = widget.controller;\n  late final VideoDetailController videoDetailCtr = widget.videoDetailCtr;\n  late final PlayUrlModel videoInfo = videoDetailCtr.data;\n  static const TextStyle subTitleStyle = TextStyle(fontSize: 12);\n  static const TextStyle titleStyle = TextStyle(fontSize: 14);\n\n  String get heroTag => widget.heroTag;\n  late final UgcIntroController ugcIntroController;\n  late final PgcIntroController pgcIntroController;\n  late final LocalIntroController localIntroController;\n  late CommonIntroController introController = isFileSource\n      ? localIntroController\n      : videoDetailCtr.isUgc\n      ? ugcIntroController\n      : pgcIntroController;\n\n  @override\n  bool get isPortrait => widget.isPortrait;\n  @override\n  late final horizontalScreen = videoDetailCtr.horizontalScreen;\n\n  Box setting = GStorage.setting;\n\n  @override\n  void initState() {\n    super.initState();\n    if (isFileSource) {\n      introController = Get.find<LocalIntroController>(tag: heroTag);\n    } else if (videoDetailCtr.isUgc) {\n      introController = Get.find<UgcIntroController>(tag: heroTag);\n    } else {\n      introController = Get.find<PgcIntroController>(tag: heroTag);\n    }\n  }\n\n  /// 设置面板\n  void showSettingSheet() {\n    showBottomSheet(\n      (context, setState) {\n        final theme = Theme.of(context);\n        return Padding(\n          padding: const EdgeInsets.all(12),\n          child: Material(\n            clipBehavior: Clip.hardEdge,\n            color: theme.colorScheme.surface,\n            borderRadius: const BorderRadius.all(Radius.circular(12)),\n            child: ListView(\n              padding: const EdgeInsets.symmetric(vertical: 14),\n              children: [\n                ListTile(\n                  dense: true,\n                  onTap: () {\n                    Get.back();\n                    introController.viewLater();\n                  },\n                  leading: const Icon(Icons.watch_later_outlined, size: 20),\n                  title: const Text('添加至「稍后再看」', style: titleStyle),\n                ),\n                if (videoDetailCtr.epId == null)\n                  ListTile(\n                    dense: true,\n                    onTap: () {\n                      Get.back();\n                      videoDetailCtr.showNoteList(context);\n                    },\n                    leading: const Icon(Icons.note_alt_outlined, size: 20),\n                    title: const Text('查看笔记', style: titleStyle),\n                  ),\n                if (!isFileSource)\n                  ListTile(\n                    dense: true,\n                    onTap: () {\n                      Get.back();\n                      videoDetailCtr.onDownload(this.context);\n                    },\n                    leading: const Icon(\n                      MdiIcons.folderDownloadOutline,\n                      size: 20,\n                    ),\n                    title: const Text('离线缓存', style: titleStyle),\n                  ),\n                if (widget.videoDetailCtr.cover.value.isNotEmpty)\n                  ListTile(\n                    dense: true,\n                    onTap: () {\n                      Get.back();\n                      ImageUtils.downloadImg([\n                        widget.videoDetailCtr.cover.value,\n                      ]);\n                    },\n                    leading: const Icon(Icons.image_outlined, size: 20),\n                    title: const Text('保存封面', style: titleStyle),\n                  ),\n                ListTile(\n                  dense: true,\n                  onTap: () {\n                    Get.back();\n                    shutdownTimerService.showScheduleExitDialog(\n                      this.context,\n                      isFullScreen: isFullScreen,\n                    );\n                  },\n                  leading: const Icon(Icons.hourglass_top_outlined, size: 20),\n                  title: const Text('定时关闭', style: titleStyle),\n                ),\n                if (!isFileSource) ...[\n                  ListTile(\n                    dense: true,\n                    onTap: () {\n                      Get.back();\n                      videoDetailCtr.editPlayUrl();\n                    },\n                    leading: const Icon(\n                      Icons.link,\n                      size: 20,\n                    ),\n                    title: const Text('播放地址', style: titleStyle),\n                  ),\n                  ListTile(\n                    dense: true,\n                    onTap: () {\n                      Get.back();\n                      videoDetailCtr.queryVideoUrl(\n                        defaultST: videoDetailCtr.playedTime,\n                        fromReset: true,\n                      );\n                    },\n                    leading: const Icon(Icons.refresh_outlined, size: 20),\n                    title: const Text('重载视频', style: titleStyle),\n                  ),\n                ],\n                PopupListTile<SuperResolutionType>(\n                  dense: true,\n                  leading: const Icon(\n                    Icons.stay_current_landscape_outlined,\n                    size: 20,\n                  ),\n                  title: const Text('超分辨率'),\n                  value: () {\n                    final value = plPlayerController.superResolutionType.value;\n                    return (value, value.label);\n                  },\n                  itemBuilder: (_) => enumItemBuilder(\n                    SuperResolutionType.values,\n                  ),\n                  onSelected: (value, setState) {\n                    plPlayerController.setShader(value);\n                    setState();\n                  },\n                  descFontSize: 12,\n                  descPosType: .subtitle,\n                ),\n                if (!isFileSource)\n                  ListTile(\n                    dense: true,\n                    title: const Text('CDN 设置', style: titleStyle),\n                    leading: const Icon(MdiIcons.cloudPlusOutline, size: 20),\n                    subtitle: Text(\n                      '当前：${VideoUtils.cdnService.desc}，无法播放请切换',\n                      style: subTitleStyle,\n                    ),\n                    onTap: () async {\n                      Get.back();\n                      final result = await showDialog<CDNService>(\n                        context: context,\n                        builder: (context) => CdnSelectDialog(\n                          sample: videoInfo.dash?.video?.firstOrNull,\n                        ),\n                      );\n                      if (result != null) {\n                        VideoUtils.cdnService = result;\n                        setting.put(SettingBoxKey.CDNService, result.name);\n                        SmartDialog.showToast('已设置为 ${result.desc}，正在重载视频');\n                        videoDetailCtr.queryVideoUrl(\n                          defaultST: videoDetailCtr.playedTime,\n                          fromReset: true,\n                        );\n                      }\n                    },\n                  ),\n                SingleChildScrollView(\n                  scrollDirection: Axis.horizontal,\n                  padding: const EdgeInsets.symmetric(horizontal: 16),\n                  child: Row(\n                    spacing: 10,\n                    children: [\n                      Obx(\n                        () {\n                          final flipX = plPlayerController.flipX.value;\n                          return ActionRowLineItem(\n                            iconData: Icons.flip,\n                            onTap: () =>\n                                plPlayerController.flipX.value = !flipX,\n                            text: \" 左右翻转 \",\n                            selectStatus: flipX,\n                          );\n                        },\n                      ),\n                      Obx(\n                        () {\n                          final flipY = plPlayerController.flipY.value;\n                          return ActionRowLineItem(\n                            icon: Transform.rotate(\n                              angle: pi / 2,\n                              child: Icon(\n                                Icons.flip,\n                                size: 13,\n                                color: flipY\n                                    ? theme.colorScheme.onSecondaryContainer\n                                    : theme.colorScheme.outline,\n                              ),\n                            ),\n                            onTap: () {\n                              plPlayerController.flipY.value = !flipY;\n                            },\n                            text: \" 上下翻转 \",\n                            selectStatus: flipY,\n                          );\n                        },\n                      ),\n                      if ((isFileSource &&\n                              !(plPlayerController.dataSource as FileSource)\n                                  .isMp4) ||\n                          (!isFileSource &&\n                              videoDetailCtr.audioUrl?.isNotEmpty == true))\n                        Obx(\n                          () {\n                            final onlyPlayAudio =\n                                plPlayerController.onlyPlayAudio.value;\n                            return ActionRowLineItem(\n                              iconData: Icons.headphones,\n                              onTap: () {\n                                plPlayerController.onlyPlayAudio.value =\n                                    !onlyPlayAudio;\n                                widget.videoDetailCtr.playerInit();\n                              },\n                              text: \" 听视频 \",\n                              selectStatus: onlyPlayAudio,\n                            );\n                          },\n                        ),\n                      Obx(\n                        () => ActionRowLineItem(\n                          iconData: Icons.play_circle_outline,\n                          onTap: plPlayerController.setContinuePlayInBackground,\n                          text: \" 后台播放 \",\n                          selectStatus:\n                              plPlayerController.continuePlayInBackground.value,\n                        ),\n                      ),\n                    ],\n                  ),\n                ),\n                if (!isFileSource) ...[\n                  ListTile(\n                    dense: true,\n                    onTap: () {\n                      Get.back();\n                      showSetVideoQa();\n                    },\n                    leading: const Icon(Icons.play_circle_outline, size: 20),\n                    title: const Text('选择画质', style: titleStyle),\n                    subtitle: Text(\n                      '当前画质 ${videoDetailCtr.currentVideoQa.value?.desc}',\n                      style: subTitleStyle,\n                    ),\n                  ),\n                  if (videoDetailCtr.currentAudioQa != null)\n                    ListTile(\n                      dense: true,\n                      onTap: () {\n                        Get.back();\n                        showSetAudioQa();\n                      },\n                      leading: const Icon(Icons.album_outlined, size: 20),\n                      title: const Text('选择音质', style: titleStyle),\n                      subtitle: Text(\n                        '当前音质 ${videoDetailCtr.currentAudioQa!.desc}',\n                        style: subTitleStyle,\n                      ),\n                    ),\n                  ListTile(\n                    dense: true,\n                    onTap: () {\n                      Get.back();\n                      showSetDecodeFormats();\n                    },\n                    leading: const Icon(Icons.av_timer_outlined, size: 20),\n                    title: const Text('解码格式', style: titleStyle),\n                    subtitle: Text(\n                      '当前解码格式 ${videoDetailCtr.currentDecodeFormats.description}',\n                      style: subTitleStyle,\n                    ),\n                  ),\n                ],\n                PopupListTile(\n                  dense: true,\n                  leading: const Icon(Icons.repeat, size: 20),\n                  title: const Text('播放顺序'),\n                  value: () {\n                    final value = plPlayerController.playRepeat;\n                    return (value, value.label);\n                  },\n                  itemBuilder: (_) => enumItemBuilder(PlayRepeat.values),\n                  onSelected: (value, setState) {\n                    plPlayerController.setPlayRepeat(value);\n                    setState();\n                  },\n                  descPosType: .subtitle,\n                  descFontSize: 12,\n                ),\n                ListTile(\n                  dense: true,\n                  onTap: () {\n                    Get.back();\n                    showDanmakuPool();\n                  },\n                  leading: const Icon(CustomIcons.dm_on, size: 20),\n                  title: const Text('弹幕列表', style: titleStyle),\n                ),\n                ListTile(\n                  dense: true,\n                  onTap: () {\n                    Get.back();\n                    showSetDanmaku();\n                  },\n                  leading: const Icon(CustomIcons.dm_settings, size: 20),\n                  title: const Text('弹幕设置', style: titleStyle),\n                ),\n                ListTile(\n                  dense: true,\n                  onTap: () {\n                    Get.back();\n                    showSetSubtitle();\n                  },\n                  leading: const Icon(Icons.subtitles_outlined, size: 20),\n                  title: const Text('字幕设置', style: titleStyle),\n                ),\n                ListTile(\n                  dense: true,\n                  onTap: () async {\n                    Get.back();\n                    try {\n                      final result = await FilePicker.pickFiles();\n                      if (result != null) {\n                        final file = result.files.single;\n                        final path = file.path;\n                        if (path != null) {\n                          final name = file.name;\n                          final length = videoDetailCtr.subtitles.length;\n                          if (name.endsWith('.json')) {\n                            final file = File(path);\n                            final stream = file.openRead().transform(\n                              utf8.decoder,\n                            );\n                            final buffer = StringBuffer();\n                            await for (final chunk in stream) {\n                              if (!mounted) return;\n                              buffer.write(chunk);\n                            }\n                            if (!mounted) return;\n                            String sub = buffer.toString();\n                            sub = await compute<List, String>(\n                              VideoHttp.processList,\n                              jsonDecode(sub)['body'],\n                            );\n                            if (!mounted) return;\n                            videoDetailCtr.vttSubtitles[length] = (\n                              isData: true,\n                              id: sub,\n                            );\n                          } else {\n                            videoDetailCtr.vttSubtitles[length] = (\n                              isData: false,\n                              id: path,\n                            );\n                          }\n                          videoDetailCtr.subtitles.add(\n                            Subtitle(\n                              lan: '',\n                              lanDoc: name.split('.').firstOrNull ?? name,\n                            ),\n                          );\n                          await videoDetailCtr.setSubtitle(length + 1);\n                        }\n                      }\n                    } catch (e) {\n                      SmartDialog.showToast('加载失败: $e');\n                    }\n                  },\n                  leading: const Icon(Icons.file_open_outlined, size: 20),\n                  title: const Text('加载字幕', style: titleStyle),\n                ),\n                if (!videoDetailCtr.isFileSource &&\n                    videoDetailCtr.subtitles.isNotEmpty)\n                  ListTile(\n                    dense: true,\n                    onTap: () {\n                      Get.back();\n                      onExportSubtitle();\n                    },\n                    leading: const Icon(Icons.download_outlined, size: 20),\n                    title: const Text('保存字幕', style: titleStyle),\n                  ),\n                ListTile(\n                  dense: true,\n                  title: const Text('播放信息', style: titleStyle),\n                  leading: const Icon(Icons.info_outline, size: 20),\n                  onTap: () => showPlayerInfo(\n                    context,\n                    plPlayerController: plPlayerController,\n                  ),\n                ),\n                ListTile(\n                  dense: true,\n                  onTap: () {\n                    if (!Accounts.main.isLogin) {\n                      SmartDialog.showToast('账号未登录');\n                      return;\n                    }\n                    Get.back();\n                    PageUtils.reportVideo(videoDetailCtr.aid);\n                  },\n                  leading: const Icon(Icons.error_outline, size: 20),\n                  title: const Text('举报', style: titleStyle),\n                ),\n              ],\n            ),\n          ),\n        );\n      },\n    );\n  }\n\n  static void showPlayerInfo(\n    BuildContext context, {\n    required PlPlayerController plPlayerController,\n  }) {\n    final player = plPlayerController.videoPlayerController;\n    if (player == null) {\n      SmartDialog.showToast('播放器未初始化');\n      return;\n    }\n    final hwdec = player.getProperty('hwdec-current');\n    showDialog(\n      context: context,\n      builder: (context) {\n        final state = player.state;\n        final colorScheme = ColorScheme.of(context);\n        return AlertDialog(\n          title: const Text('播放信息'),\n          contentPadding: const EdgeInsets.only(top: 16),\n          content: Material(\n            type: MaterialType.transparency,\n            child: ListTileTheme(\n              contentPadding: const EdgeInsets.symmetric(\n                horizontal: 24,\n              ),\n              child: SingleChildScrollView(\n                child: Column(\n                  children: [\n                    ListTile(\n                      dense: true,\n                      title: const Text(\"Resolution\"),\n                      subtitle: Text(\n                        '${state.width}x${state.height}',\n                      ),\n                      onTap: () => Utils.copyText(\n                        'Resolution\\n${state.width}x${state.height}',\n                      ),\n                    ),\n                    ListTile(\n                      dense: true,\n                      title: const Text(\"VideoParams\"),\n                      subtitle: Text(\n                        state.videoParams.toString(),\n                      ),\n                      onTap: () => Utils.copyText(\n                        'VideoParams\\n${state.videoParams}',\n                      ),\n                    ),\n                    ListTile(\n                      dense: true,\n                      title: const Text(\"AudioParams\"),\n                      subtitle: Text(\n                        state.audioParams.toString(),\n                      ),\n                      onTap: () => Utils.copyText(\n                        'AudioParams\\n${state.audioParams}',\n                      ),\n                    ),\n                    ListTile(\n                      dense: true,\n                      title: const Text(\"Media\"),\n                      subtitle: Text(\n                        state.playlist.toString(),\n                      ),\n                      onTap: () => Utils.copyText(\n                        'Media\\n${state.playlist}',\n                      ),\n                    ),\n                    ListTile(\n                      dense: true,\n                      title: const Text(\"AudioTrack\"),\n                      subtitle: Text(\n                        state.track.audio.toString(),\n                      ),\n                      onTap: () => Utils.copyText(\n                        'AudioTrack\\n${state.track.audio}',\n                      ),\n                    ),\n                    ListTile(\n                      dense: true,\n                      title: const Text(\"VideoTrack\"),\n                      subtitle: Text(\n                        state.track.video.toString(),\n                      ),\n                      onTap: () => Utils.copyText(\n                        'VideoTrack\\n${state.track.audio}',\n                      ),\n                    ),\n                    ListTile(\n                      dense: true,\n                      title: const Text(\"pitch\"),\n                      subtitle: Text(state.pitch.toString()),\n                      onTap: () => Utils.copyText(\n                        'pitch\\n${state.pitch}',\n                      ),\n                    ),\n                    ListTile(\n                      dense: true,\n                      title: const Text(\"rate\"),\n                      subtitle: Text(state.rate.toString()),\n                      onTap: () => Utils.copyText('rate\\n${state.rate}'),\n                    ),\n                    ListTile(\n                      dense: true,\n                      title: const Text(\"Volume\"),\n                      subtitle: Text(\n                        state.volume.toString(),\n                      ),\n                      onTap: () => Utils.copyText(\n                        'Volume\\n${state.volume}',\n                      ),\n                    ),\n                    ListTile(\n                      dense: true,\n                      title: const Text('hwdec'),\n                      subtitle: Text(hwdec),\n                      onTap: () => Utils.copyText('hwdec\\n$hwdec'),\n                    ),\n                  ],\n                ),\n              ),\n            ),\n          ),\n          actions: [\n            TextButton(\n              onPressed: Get.back,\n              child: Text(\n                '确定',\n                style: TextStyle(color: colorScheme.outline),\n              ),\n            ),\n          ],\n        );\n      },\n    );\n  }\n\n  /// 选择画质\n  void showSetVideoQa() {\n    if (videoInfo.dash == null) {\n      SmartDialog.showToast('当前视频不支持选择画质');\n      return;\n    }\n    final VideoQuality? currentVideoQa = videoDetailCtr.currentVideoQa.value;\n    if (currentVideoQa == null) return;\n\n    final List<FormatItem> videoFormat = videoInfo.supportFormats!;\n\n    /// 总质量分类\n    final int totalQaSam = videoFormat.length;\n\n    /// 可用的质量分类\n    int usefulQaSam = 0;\n    final List<VideoItem> video = videoInfo.dash!.video!;\n    final Set<int> idSet = {};\n    for (final VideoItem item in video) {\n      final int id = item.id!;\n      if (!idSet.contains(id)) {\n        idSet.add(id);\n        usefulQaSam++;\n      }\n    }\n\n    showBottomSheet(\n      (context, setState) {\n        final theme = Theme.of(context);\n        return Padding(\n          padding: const EdgeInsets.all(12),\n          child: Material(\n            clipBehavior: Clip.hardEdge,\n            color: theme.colorScheme.surface,\n            borderRadius: const BorderRadius.all(Radius.circular(12)),\n            child: CustomScrollView(\n              slivers: [\n                SliverToBoxAdapter(\n                  child: SizedBox(\n                    height: 45,\n                    child: GestureDetector(\n                      onTap: () => SmartDialog.showToast(\n                        '标灰画质需要bilibili会员（已是会员？请关闭无痕模式）；4k和杜比视界播放效果可能不佳',\n                      ),\n                      child: Row(\n                        spacing: 8,\n                        mainAxisAlignment: MainAxisAlignment.center,\n                        children: [\n                          const Text('选择画质', style: titleStyle),\n                          Icon(\n                            Icons.info_outline,\n                            size: 16,\n                            color: theme.colorScheme.outline,\n                          ),\n                        ],\n                      ),\n                    ),\n                  ),\n                ),\n                SliverList.builder(\n                  itemCount: totalQaSam,\n                  itemBuilder: (context, index) {\n                    final item = videoFormat[index];\n                    final isCurr = currentVideoQa.code == item.quality;\n                    return ListTile(\n                      dense: true,\n                      onTap: () async {\n                        if (isCurr) {\n                          return;\n                        }\n                        Get.back();\n                        final int quality = item.quality!;\n                        final newQa = VideoQuality.fromCode(quality);\n                        videoDetailCtr\n                          ..plPlayerController.cacheVideoQa = newQa.code\n                          ..currentVideoQa.value = newQa\n                          ..updatePlayer();\n\n                        SmartDialog.showToast(\"画质已变为：${newQa.desc}\");\n\n                        // update\n                        if (!plPlayerController.tempPlayerConf) {\n                          setting.put(\n                            await Utils.isWiFi\n                                ? SettingBoxKey.defaultVideoQa\n                                : SettingBoxKey.defaultVideoQaCellular,\n                            quality,\n                          );\n                        }\n                      },\n                      // 可能包含会员解锁画质\n                      enabled: index >= totalQaSam - usefulQaSam,\n                      contentPadding: const EdgeInsets.symmetric(\n                        horizontal: 20,\n                      ),\n                      title: Text(item.newDesc!),\n                      trailing: isCurr\n                          ? Icon(\n                              Icons.done,\n                              color: theme.colorScheme.primary,\n                            )\n                          : Text(\n                              item.format!,\n                              style: subTitleStyle,\n                            ),\n                    );\n                  },\n                ),\n              ],\n            ),\n          ),\n        );\n      },\n    );\n  }\n\n  /// 选择音质\n  void showSetAudioQa() {\n    final AudioQuality currentAudioQa = videoDetailCtr.currentAudioQa!;\n    final List<AudioItem> audio = videoInfo.dash!.audio!;\n    showBottomSheet(\n      (context, setState) {\n        final theme = Theme.of(context);\n        return Padding(\n          padding: const EdgeInsets.all(12),\n          child: Material(\n            clipBehavior: Clip.hardEdge,\n            color: theme.colorScheme.surface,\n            borderRadius: const BorderRadius.all(Radius.circular(12)),\n            child: CustomScrollView(\n              slivers: [\n                const SliverToBoxAdapter(\n                  child: SizedBox(\n                    height: 45,\n                    child: Center(\n                      child: Text('选择音质', style: titleStyle),\n                    ),\n                  ),\n                ),\n                SliverList.builder(\n                  itemCount: audio.length,\n                  itemBuilder: (context, index) {\n                    final item = audio[index];\n                    final isCurr = currentAudioQa.code == item.id;\n                    return ListTile(\n                      dense: true,\n                      onTap: () async {\n                        if (isCurr) {\n                          return;\n                        }\n                        Get.back();\n                        final int quality = item.id!;\n                        final newQa = AudioQuality.fromCode(quality);\n                        videoDetailCtr\n                          ..plPlayerController.cacheAudioQa = newQa.code\n                          ..currentAudioQa = newQa\n                          ..updatePlayer();\n\n                        SmartDialog.showToast(\"音质已变为：${newQa.desc}\");\n\n                        // update\n                        if (!plPlayerController.tempPlayerConf) {\n                          setting.put(\n                            await Utils.isWiFi\n                                ? SettingBoxKey.defaultAudioQa\n                                : SettingBoxKey.defaultAudioQaCellular,\n                            quality,\n                          );\n                        }\n                      },\n                      contentPadding: const EdgeInsets.symmetric(\n                        horizontal: 20,\n                      ),\n                      title: Text(item.quality),\n                      subtitle: Text(\n                        item.codecs!,\n                        style: subTitleStyle,\n                      ),\n                      trailing: isCurr\n                          ? Icon(\n                              Icons.done,\n                              color: theme.colorScheme.primary,\n                            )\n                          : null,\n                    );\n                  },\n                ),\n              ],\n            ),\n          ),\n        );\n      },\n    );\n  }\n\n  // 选择解码格式\n  void showSetDecodeFormats() {\n    final VideoItem firstVideo = videoDetailCtr.firstVideo;\n    // 当前视频可用的解码格式\n    final List<FormatItem> videoFormat = videoInfo.supportFormats!;\n    final List<String>? list = videoFormat\n        .firstWhere((FormatItem e) => e.quality == firstVideo.quality.code)\n        .codecs;\n    if (list == null) {\n      SmartDialog.showToast('当前视频不支持选择解码格式');\n      return;\n    }\n\n    // 当前选中的解码格式\n    final VideoDecodeFormatType currentDecodeFormats =\n        videoDetailCtr.currentDecodeFormats;\n    showBottomSheet(\n      (context, setState) {\n        final theme = Theme.of(context);\n        return Padding(\n          padding: const EdgeInsets.all(12),\n          child: Material(\n            clipBehavior: Clip.hardEdge,\n            color: theme.colorScheme.surface,\n            borderRadius: const BorderRadius.all(Radius.circular(12)),\n            child: Column(\n              children: [\n                const SizedBox(\n                  height: 45,\n                  child: Center(\n                    child: Text('选择解码格式', style: titleStyle),\n                  ),\n                ),\n                Expanded(\n                  child: CustomScrollView(\n                    slivers: [\n                      SliverList.builder(\n                        itemCount: list.length,\n                        itemBuilder: (context, index) {\n                          final item = list[index];\n                          final format = VideoDecodeFormatType.fromString(item);\n                          final isCurr = currentDecodeFormats.codes.any(\n                            item.startsWith,\n                          );\n                          return ListTile(\n                            dense: true,\n                            onTap: () {\n                              if (isCurr) {\n                                return;\n                              }\n                              Get.back();\n                              videoDetailCtr\n                                ..currentDecodeFormats = format\n                                ..updatePlayer();\n                            },\n                            contentPadding: const EdgeInsets.symmetric(\n                              horizontal: 20,\n                            ),\n                            title: Text(format.description),\n                            subtitle: Text(item, style: subTitleStyle),\n                            trailing: isCurr\n                                ? Icon(\n                                    Icons.done,\n                                    color: theme.colorScheme.primary,\n                                  )\n                                : null,\n                          );\n                        },\n                      ),\n                    ],\n                  ),\n                ),\n              ],\n            ),\n          ),\n        );\n      },\n    );\n  }\n\n  void onExportSubtitle() {\n    showDialog(\n      context: context,\n      builder: (context) => AlertDialog(\n        clipBehavior: Clip.hardEdge,\n        contentPadding: const EdgeInsets.fromLTRB(0, 12, 0, 12),\n        title: const Text('保存字幕'),\n        content: SingleChildScrollView(\n          child: Column(\n            children: videoDetailCtr.subtitles\n                .map(\n                  (item) => ListTile(\n                    dense: true,\n                    onTap: () async {\n                      Get.back();\n                      final url = item.subtitleUrl;\n                      if (url == null || url.isEmpty) return;\n                      try {\n                        final res = await Request.dio.get<Uint8List>(\n                          url.http2https,\n                          options: Options(\n                            responseType: ResponseType.bytes,\n                            headers: Constants.baseHeaders,\n                            extra: {'account': const NoAccount()},\n                          ),\n                        );\n                        if (res.statusCode == 200) {\n                          final bytes = Uint8List.fromList(\n                            Request.responseBytesDecoder(\n                              res.data!,\n                              res.headers.map,\n                            ),\n                          );\n                          String name =\n                              '${introController.videoDetail.value.title}-${videoDetailCtr.bvid}-${videoDetailCtr.cid.value}-${item.lanDoc}.json';\n                          if (Platform.isWindows) {\n                            // Reserved characters may not be used in file names. See: https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file#naming-conventions\n                            name = name.replaceAll(\n                              RegExp(r'[<>:/\\\\|?*\"]'),\n                              '',\n                            );\n                          }\n                          Utils.saveBytes2File(\n                            name: name,\n                            bytes: bytes,\n                            allowedExtensions: const ['json'],\n                          );\n                        }\n                      } catch (e, s) {\n                        Utils.reportError(e, s);\n                        SmartDialog.showToast(e.toString());\n                      }\n                    },\n                    title: Text(\n                      item.lanDoc!,\n                      style: const TextStyle(fontSize: 14),\n                    ),\n                  ),\n                )\n                .toList(),\n          ),\n        ),\n      ),\n    );\n  }\n\n  double get subtitleFontScale => plPlayerController.subtitleFontScale;\n  double get subtitleFontScaleFS => plPlayerController.subtitleFontScaleFS;\n  int get subtitlePaddingH => plPlayerController.subtitlePaddingH;\n  int get subtitlePaddingB => plPlayerController.subtitlePaddingB;\n  double get subtitleBgOpacity => plPlayerController.subtitleBgOpacity;\n  double get subtitleStrokeWidth => plPlayerController.subtitleStrokeWidth;\n  int get subtitleFontWeight => plPlayerController.subtitleFontWeight;\n\n  /// 字幕设置\n  void showSetSubtitle() {\n    showBottomSheet(\n      padding: isFullScreen ? 70 : null,\n      (context, setState) {\n        final theme = Theme.of(context);\n\n        final sliderTheme = SliderThemeData(\n          trackHeight: 10,\n          trackShape: const MSliderTrackShape(),\n          thumbColor: theme.colorScheme.primary,\n          activeTrackColor: theme.colorScheme.primary,\n          inactiveTrackColor: theme.colorScheme.onInverseSurface,\n          thumbShape: const RoundSliderThumbShape(enabledThumbRadius: 6.0),\n        );\n\n        void updateStrokeWidth(double val) {\n          plPlayerController\n            ..subtitleStrokeWidth = val\n            ..updateSubtitleStyle();\n          setState(() {});\n        }\n\n        void updateOpacity(double val) {\n          plPlayerController\n            ..subtitleBgOpacity = val.toPrecision(2)\n            ..updateSubtitleStyle();\n          setState(() {});\n        }\n\n        void updateBottomPadding(double val) {\n          plPlayerController\n            ..subtitlePaddingB = val.round()\n            ..updateSubtitleStyle();\n          setState(() {});\n        }\n\n        void updateHorizontalPadding(double val) {\n          plPlayerController\n            ..subtitlePaddingH = val.round()\n            ..updateSubtitleStyle();\n          setState(() {});\n        }\n\n        void updateFontScaleFS(double val) {\n          plPlayerController\n            ..subtitleFontScaleFS = val\n            ..updateSubtitleStyle();\n          setState(() {});\n        }\n\n        void updateFontScale(double val) {\n          plPlayerController\n            ..subtitleFontScale = val\n            ..updateSubtitleStyle();\n          setState(() {});\n        }\n\n        void updateFontWeight(double val) {\n          plPlayerController\n            ..subtitleFontWeight = val.toInt()\n            ..updateSubtitleStyle();\n          setState(() {});\n        }\n\n        return Padding(\n          padding: const EdgeInsets.all(12),\n          child: Material(\n            clipBehavior: Clip.hardEdge,\n            color: theme.colorScheme.surface,\n            borderRadius: const BorderRadius.all(Radius.circular(12)),\n            child: Padding(\n              padding: const EdgeInsets.symmetric(horizontal: 14),\n              child: ListView(\n                padding: EdgeInsets.zero,\n                children: [\n                  const SizedBox(\n                    height: 45,\n                    child: Center(child: Text('字幕设置', style: titleStyle)),\n                  ),\n                  const SizedBox(height: 10),\n                  Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: [\n                      Text(\n                        '字体大小 ${(subtitleFontScale * 100).toStringAsFixed(1)}%',\n                      ),\n                      resetBtn(theme, '100.0%', () => updateFontScale(1.0)),\n                    ],\n                  ),\n                  Padding(\n                    padding: const EdgeInsets.only(\n                      top: 0,\n                      bottom: 6,\n                      left: 10,\n                      right: 10,\n                    ),\n                    child: SliderTheme(\n                      data: sliderTheme,\n                      child: Slider(\n                        min: 0.5,\n                        max: 2.5,\n                        value: subtitleFontScale,\n                        divisions: 20,\n                        label:\n                            '${(subtitleFontScale * 100).toStringAsFixed(1)}%',\n                        onChanged: updateFontScale,\n                      ),\n                    ),\n                  ),\n                  Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: [\n                      Text(\n                        '全屏字体大小 ${(subtitleFontScaleFS * 100).toStringAsFixed(1)}%',\n                      ),\n                      resetBtn(theme, '150.0%', () => updateFontScaleFS(1.5)),\n                    ],\n                  ),\n                  Padding(\n                    padding: const EdgeInsets.only(\n                      top: 0,\n                      bottom: 6,\n                      left: 10,\n                      right: 10,\n                    ),\n                    child: SliderTheme(\n                      data: sliderTheme,\n                      child: Slider(\n                        min: 0.5,\n                        max: 2.5,\n                        value: subtitleFontScaleFS,\n                        divisions: 20,\n                        label:\n                            '${(subtitleFontScaleFS * 100).toStringAsFixed(1)}%',\n                        onChanged: updateFontScaleFS,\n                      ),\n                    ),\n                  ),\n                  Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: [\n                      Text('字体粗细 ${subtitleFontWeight + 1}（可能无法精确调节）'),\n                      resetBtn(theme, 6, () => updateFontWeight(5)),\n                    ],\n                  ),\n                  Padding(\n                    padding: const EdgeInsets.only(\n                      top: 0,\n                      bottom: 6,\n                      left: 10,\n                      right: 10,\n                    ),\n                    child: SliderTheme(\n                      data: sliderTheme,\n                      child: Slider(\n                        min: 0,\n                        max: 8,\n                        value: subtitleFontWeight.toDouble(),\n                        divisions: 8,\n                        label: '${subtitleFontWeight + 1}',\n                        onChanged: updateFontWeight,\n                      ),\n                    ),\n                  ),\n                  Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: [\n                      Text('描边粗细 $subtitleStrokeWidth'),\n                      resetBtn(theme, 2.0, () => updateStrokeWidth(2.0)),\n                    ],\n                  ),\n                  Padding(\n                    padding: const EdgeInsets.only(\n                      top: 0,\n                      bottom: 6,\n                      left: 10,\n                      right: 10,\n                    ),\n                    child: SliderTheme(\n                      data: sliderTheme,\n                      child: Slider(\n                        min: 0,\n                        max: 5,\n                        value: subtitleStrokeWidth,\n                        divisions: 10,\n                        label: '$subtitleStrokeWidth',\n                        onChanged: updateStrokeWidth,\n                      ),\n                    ),\n                  ),\n                  Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: [\n                      Text('左右边距 $subtitlePaddingH'),\n                      resetBtn(theme, 24, () => updateHorizontalPadding(24)),\n                    ],\n                  ),\n                  Padding(\n                    padding: const EdgeInsets.only(\n                      top: 0,\n                      bottom: 6,\n                      left: 10,\n                      right: 10,\n                    ),\n                    child: SliderTheme(\n                      data: sliderTheme,\n                      child: Slider(\n                        min: 0,\n                        max: 100,\n                        value: subtitlePaddingH.toDouble(),\n                        divisions: 100,\n                        label: '$subtitlePaddingH',\n                        onChanged: updateHorizontalPadding,\n                      ),\n                    ),\n                  ),\n                  Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: [\n                      Text('底部边距 $subtitlePaddingB'),\n                      resetBtn(theme, 24, () => updateBottomPadding(24)),\n                    ],\n                  ),\n                  Padding(\n                    padding: const EdgeInsets.only(\n                      top: 0,\n                      bottom: 6,\n                      left: 10,\n                      right: 10,\n                    ),\n                    child: SliderTheme(\n                      data: sliderTheme,\n                      child: Slider(\n                        min: 0,\n                        max: 200,\n                        value: subtitlePaddingB.toDouble(),\n                        divisions: 200,\n                        label: '$subtitlePaddingB',\n                        onChanged: updateBottomPadding,\n                      ),\n                    ),\n                  ),\n                  Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: [\n                      Text('背景不透明度 ${(subtitleBgOpacity * 100).toInt()}%'),\n                      resetBtn(theme, '67%', () => updateOpacity(0.67)),\n                    ],\n                  ),\n                  Padding(\n                    padding: const EdgeInsets.only(\n                      top: 0,\n                      bottom: 6,\n                      left: 10,\n                      right: 10,\n                    ),\n                    child: SliderTheme(\n                      data: sliderTheme,\n                      child: Slider(\n                        min: 0,\n                        max: 1,\n                        value: subtitleBgOpacity,\n                        onChanged: updateOpacity,\n                      ),\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          ),\n        );\n      },\n    )?.whenComplete(plPlayerController.putSubtitleSettings);\n  }\n\n  void showDanmakuPool() {\n    final ctr = plPlayerController.danmakuController;\n    if (ctr == null) return;\n    showBottomSheet((context, setState) {\n      final theme = Theme.of(context);\n      return Container(\n        margin: const EdgeInsets.all(12),\n        decoration: BoxDecoration(\n          color: theme.colorScheme.surface,\n          borderRadius: const BorderRadius.all(Radius.circular(12)),\n        ),\n        child: Column(\n          children: [\n            Container(\n              height: 45,\n              padding: const EdgeInsets.symmetric(horizontal: 14),\n              decoration: BoxDecoration(\n                border: Border(\n                  bottom: BorderSide(\n                    color: theme.colorScheme.outline.withValues(alpha: 0.1),\n                  ),\n                ),\n              ),\n              child: Row(\n                mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                children: [\n                  const Text('弹幕列表'),\n                  iconButton(\n                    onPressed: () => setState(() {}),\n                    icon: const Icon(Icons.refresh),\n                  ),\n                ],\n              ),\n            ),\n            Expanded(\n              child: Material(\n                type: .transparency,\n                clipBehavior: .hardEdge,\n                borderRadius: const BorderRadius.vertical(\n                  bottom: Radius.circular(12),\n                ),\n                child: CustomScrollView(\n                  slivers: [\n                    ?_buildDanmakuList(ctr.staticDanmaku.nonNulls.toList()),\n                    ?_buildDanmakuList(\n                      ctr.scrollDanmaku.expand((e) => e).toList(),\n                    ),\n                    ?_buildDanmakuList(ctr.specialDanmaku.toList()),\n                    const SliverToBoxAdapter(child: SizedBox(height: 12)),\n                  ],\n                ),\n              ),\n            ),\n          ],\n        ),\n      );\n    });\n  }\n\n  Widget? _buildDanmakuList(List<DanmakuItem<DanmakuExtra>> list) {\n    if (list.isEmpty) return null;\n\n    return SliverList.builder(\n      itemCount: list.length,\n      itemBuilder: (context, index) {\n        final item = list[index];\n        final extra = item.content.extra! as VideoDanmaku;\n        return ListTile(\n          dense: true,\n          contentPadding: const EdgeInsets.symmetric(horizontal: 14),\n          onLongPress: () => Utils.copyText(item.content.text),\n          title: Text(\n            item.content.text,\n            style: const TextStyle(fontSize: 14),\n          ),\n          trailing: Row(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              Builder(\n                builder: (context) => Stack(\n                  clipBehavior: Clip.none,\n                  children: [\n                    iconButton(\n                      onPressed: () async {\n                        if (await HeaderControl.likeDanmaku(\n                              extra,\n                              plPlayerController.cid!,\n                            ) &&\n                            context.mounted) {\n                          (context as Element).markNeedsBuild();\n                        }\n                      },\n                      icon: extra.isLike\n                          ? const Icon(CustomIcons.player_dm_tip_like_solid)\n                          : const Icon(CustomIcons.player_dm_tip_like),\n                    ),\n                    if (extra.like > 0)\n                      Positioned(\n                        left: 24.5,\n                        top: 1.5,\n                        child: Text(\n                          extra.like.toString(),\n                          style: const TextStyle(\n                            fontSize: 10.5,\n                            letterSpacing: 0,\n                            // fontWeight: FontWeight.bold,\n                          ),\n                        ),\n                      ),\n                  ],\n                ),\n              ),\n              if (item.content.selfSend)\n                iconButton(\n                  onPressed: () => HeaderControl.deleteDanmaku(\n                    extra.id,\n                    plPlayerController.cid!,\n                  ).then((_) => item.expired = true),\n                  icon: const Icon(CustomIcons.player_dm_tip_recall),\n                )\n              else\n                iconButton(\n                  onPressed: () => HeaderControl.reportDanmaku(\n                    context,\n                    extra: extra,\n                    ctr: plPlayerController,\n                  ),\n                  icon: const Icon(CustomIcons.player_dm_tip_back),\n                ),\n            ],\n          ),\n        );\n      },\n    );\n  }\n\n  late final isFileSource = videoDetailCtr.isFileSource;\n\n  @override\n  Widget build(BuildContext context) {\n    final isFullScreen = this.isFullScreen;\n    final isFSOrPip = isFullScreen || plPlayerController.isDesktopPip;\n    final showFSActionItem =\n        !isFileSource && plPlayerController.showFSActionItem && isFSOrPip;\n    showCurrTimeIfNeeded(isFullScreen);\n    Widget title;\n    if (introController.videoDetail.value.title != null &&\n        (isFullScreen ||\n            ((!horizontalScreen || plPlayerController.isDesktopPip) &&\n                !isPortrait))) {\n      title = Padding(\n        key: titleKey,\n        padding: isPortrait\n            ? EdgeInsets.zero\n            : const EdgeInsets.only(right: 10),\n        child: Obx(\n          () {\n            final videoDetail = introController.videoDetail.value;\n            final String title;\n            if (isFileSource || videoDetail.videos == 1) {\n              title = videoDetail.title!;\n            } else {\n              title =\n                  videoDetail.pages\n                      ?.firstWhereOrNull(\n                        (e) => e.cid == videoDetailCtr.cid.value,\n                      )\n                      ?.part ??\n                  videoDetail.title!;\n            }\n            return MarqueeText(\n              title,\n              spacing: 30,\n              velocity: 30,\n              style: const TextStyle(\n                color: Colors.white,\n                fontSize: 16,\n              ),\n              provider: effectiveProvider,\n            );\n          },\n        ),\n      );\n      if (introController.isShowOnlineTotal) {\n        title = Column(\n          mainAxisSize: MainAxisSize.min,\n          crossAxisAlignment: CrossAxisAlignment.start,\n          children: [\n            title,\n            Obx(\n              () => Text(\n                '${introController.total.value}人正在看',\n                style: const TextStyle(\n                  color: Colors.white,\n                  fontSize: 11,\n                ),\n              ),\n            ),\n          ],\n        );\n      }\n      title = Expanded(child: title);\n    } else {\n      title = const Spacer();\n    }\n\n    const btnWidth = 40.0;\n    const btnHeight = 34.0;\n    const btnStyle = ButtonStyle(padding: WidgetStatePropertyAll(.zero));\n\n    return AppBar(\n      elevation: 0,\n      scrolledUnderElevation: 0,\n      backgroundColor: Colors.transparent,\n      foregroundColor: Colors.white,\n      primary: false,\n      automaticallyImplyLeading: false,\n      toolbarHeight: showFSActionItem ? 112 : null,\n      flexibleSpace: Column(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          const SizedBox(height: 11),\n          Row(\n            children: [\n              SizedBox(\n                width: btnWidth,\n                height: btnHeight,\n                child: IconButton(\n                  tooltip: '返回',\n                  style: btnStyle,\n                  icon: const Icon(\n                    FontAwesomeIcons.arrowLeft,\n                    size: 15,\n                    color: Colors.white,\n                  ),\n                  onPressed: () {\n                    if (plPlayerController.onPopInvokedWithResult(\n                      false,\n                      null,\n                    )) {\n                      return;\n                    }\n                    if (PlatformUtils.isMobile &&\n                        !horizontalScreen &&\n                        !isPortrait) {\n                      verticalScreenForTwoSeconds();\n                    } else {\n                      Get.back();\n                    }\n                  },\n                ),\n              ),\n              if (!plPlayerController.isDesktopPip &&\n                  (!isFullScreen || !isPortrait))\n                SizedBox(\n                  width: btnWidth,\n                  height: btnHeight,\n                  child: IconButton(\n                    tooltip: '返回主页',\n                    style: btnStyle,\n                    icon: const Icon(\n                      FontAwesomeIcons.house,\n                      size: 15,\n                      color: Colors.white,\n                    ),\n                    onPressed: () {\n                      videoDetailCtr.plPlayerController\n                        ..isCloseAll = true\n                        ..dispose();\n                      Get.until((route) => route.isFirst);\n                    },\n                  ),\n                ),\n              title,\n              // show current datetime\n              ...?timeBatteryWidgets,\n              if (PlatformUtils.isDesktop && !plPlayerController.isDesktopPip)\n                Obx(() {\n                  final isAlwaysOnTop = plPlayerController.isAlwaysOnTop.value;\n                  return SizedBox(\n                    width: btnWidth,\n                    height: btnHeight,\n                    child: IconButton(\n                      style: btnStyle,\n                      tooltip: '${isAlwaysOnTop ? '取消' : ''}置顶',\n                      onPressed: () =>\n                          plPlayerController.setAlwaysOnTop(!isAlwaysOnTop),\n                      icon: isAlwaysOnTop\n                          ? const Icon(\n                              size: 19,\n                              Icons.push_pin,\n                              color: Colors.white,\n                            )\n                          : const Icon(\n                              size: 19,\n                              Icons.push_pin_outlined,\n                              color: Colors.white,\n                            ),\n                    ),\n                  );\n                }),\n              if (!isFileSource) ...[\n                if (!isFSOrPip) ...[\n                  if (videoDetailCtr.isUgc)\n                    SizedBox(\n                      width: btnWidth,\n                      height: btnHeight,\n                      child: IconButton(\n                        tooltip: '听音频',\n                        style: btnStyle,\n                        onPressed: videoDetailCtr.toAudioPage,\n                        icon: const Icon(\n                          Icons.headphones_outlined,\n                          size: 19,\n                          color: Colors.white,\n                        ),\n                      ),\n                    ),\n                  SizedBox(\n                    width: btnWidth,\n                    height: btnHeight,\n                    child: IconButton(\n                      tooltip: '投屏',\n                      style: btnStyle,\n                      onPressed: videoDetailCtr.onCast,\n                      icon: const Icon(\n                        Icons.cast,\n                        size: 19,\n                        color: Colors.white,\n                      ),\n                    ),\n                  ),\n                ],\n                if (plPlayerController.enableSponsorBlock)\n                  SizedBox(\n                    width: btnWidth,\n                    height: btnHeight,\n                    child: IconButton(\n                      tooltip: '提交片段',\n                      style: btnStyle,\n                      onPressed: () => videoDetailCtr.onBlock(context),\n                      icon: const Stack(\n                        clipBehavior: Clip.none,\n                        alignment: Alignment.center,\n                        children: [\n                          Icon(\n                            Icons.shield_outlined,\n                            size: 19,\n                            color: Colors.white,\n                          ),\n                          Icon(\n                            Icons.play_arrow_rounded,\n                            size: 13,\n                            color: Colors.white,\n                          ),\n                        ],\n                      ),\n                    ),\n                  ),\n                Obx(\n                  () => videoDetailCtr.segmentProgressList.isNotEmpty\n                      ? SizedBox(\n                          width: btnWidth,\n                          height: btnHeight,\n                          child: IconButton(\n                            tooltip: '片段信息',\n                            style: btnStyle,\n                            onPressed: videoDetailCtr.showSBDetail,\n                            icon: const Icon(\n                              MdiIcons.advertisements,\n                              size: 19,\n                              color: Colors.white,\n                            ),\n                          ),\n                        )\n                      : const SizedBox.shrink(),\n                ),\n              ],\n              if (isFullScreen || PlatformUtils.isDesktop) ...[\n                SizedBox(\n                  width: btnWidth,\n                  height: btnHeight,\n                  child: IconButton(\n                    tooltip: '发弹幕',\n                    style: btnStyle,\n                    onPressed: videoDetailCtr.showShootDanmakuSheet,\n                    icon: const Icon(\n                      Icons.comment_outlined,\n                      size: 19,\n                      color: Colors.white,\n                    ),\n                  ),\n                ),\n                SizedBox(\n                  width: btnWidth,\n                  height: btnHeight,\n                  child: Obx(\n                    () {\n                      final enableShowDanmaku =\n                          plPlayerController.enableShowDanmaku.value;\n                      return IconButton(\n                        tooltip: \"${enableShowDanmaku ? '关闭' : '开启'}弹幕\",\n                        style: btnStyle,\n                        onPressed: () {\n                          final newVal = !enableShowDanmaku;\n                          plPlayerController.enableShowDanmaku.value = newVal;\n                          if (!plPlayerController.tempPlayerConf) {\n                            setting.put(\n                              SettingBoxKey.enableShowDanmaku,\n                              newVal,\n                            );\n                          }\n                        },\n                        icon: enableShowDanmaku\n                            ? const Icon(\n                                size: 20,\n                                CustomIcons.dm_on,\n                                color: Colors.white,\n                              )\n                            : const Icon(\n                                size: 20,\n                                CustomIcons.dm_off,\n                                color: Colors.white,\n                              ),\n                      );\n                    },\n                  ),\n                ),\n              ],\n              SizedBox(\n                width: btnWidth,\n                height: btnHeight,\n                child: IconButton(\n                  tooltip: '弹幕设置',\n                  style: btnStyle,\n                  onPressed: showSetDanmaku,\n                  icon: const Icon(\n                    size: 20,\n                    CustomIcons.dm_settings,\n                    color: Colors.white,\n                  ),\n                ),\n              ),\n              if (Platform.isAndroid ||\n                  (PlatformUtils.isDesktop && !isFullScreen))\n                SizedBox(\n                  width: btnWidth,\n                  height: btnHeight,\n                  child: IconButton(\n                    tooltip: '画中画',\n                    style: btnStyle,\n                    onPressed: () async {\n                      if (PlatformUtils.isDesktop) {\n                        plPlayerController.toggleDesktopPip();\n                        return;\n                      }\n                      if (await Floating().isPipAvailable) {\n                        if (context.mounted &&\n                            !videoPlayerServiceHandler!.enableBackgroundPlay) {\n                          final theme = Theme.of(context);\n                          ScaffoldMessenger.of(context).showSnackBar(\n                            SnackBar(\n                              content: Column(\n                                children: [\n                                  const Row(\n                                    children: [\n                                      Icon(\n                                        Icons.check,\n                                        color: Colors.green,\n                                      ),\n                                      SizedBox(width: 10),\n                                      Text(\n                                        '画中画',\n                                        style: TextStyle(\n                                          fontSize: 15,\n                                          height: 1.5,\n                                        ),\n                                      ),\n                                    ],\n                                  ),\n                                  const SizedBox(height: 10),\n                                  const Text(\n                                    '建议开启【后台音频服务】\\n'\n                                    '避免画中画没有暂停按钮',\n                                    style: TextStyle(\n                                      fontSize: 12.5,\n                                      height: 1.5,\n                                    ),\n                                  ),\n                                  Row(\n                                    children: [\n                                      TextButton(\n                                        style: ButtonStyle(\n                                          foregroundColor:\n                                              WidgetStatePropertyAll(\n                                                theme\n                                                    .snackBarTheme\n                                                    .actionTextColor,\n                                              ),\n                                        ),\n                                        onPressed: () {\n                                          plPlayerController.setBackgroundPlay(\n                                            true,\n                                          );\n                                          SmartDialog.showToast(\"请重新载入本页面刷新\");\n                                        },\n                                        child: const Text('启用后台音频服务'),\n                                      ),\n                                      const SizedBox(width: 10),\n                                      TextButton(\n                                        style: ButtonStyle(\n                                          foregroundColor:\n                                              WidgetStatePropertyAll(\n                                                theme\n                                                    .snackBarTheme\n                                                    .actionTextColor,\n                                              ),\n                                        ),\n                                        onPressed: () {},\n                                        child: const Text('不启用'),\n                                      ),\n                                    ],\n                                  ),\n                                ],\n                              ),\n                              duration: const Duration(seconds: 2),\n                              showCloseIcon: true,\n                            ),\n                          );\n                          await Future.delayed(const Duration(seconds: 3));\n                        }\n                        if (!context.mounted) return;\n                        plPlayerController.enterPip();\n                      }\n                    },\n                    icon: const Icon(\n                      Icons.picture_in_picture_outlined,\n                      size: 19,\n                      color: Colors.white,\n                    ),\n                  ),\n                ),\n              SizedBox(\n                width: btnWidth,\n                height: btnHeight,\n                child: IconButton(\n                  tooltip: \"更多设置\",\n                  style: btnStyle,\n                  onPressed: showSettingSheet,\n                  icon: const Icon(\n                    Icons.more_vert_outlined,\n                    size: 19,\n                    color: Colors.white,\n                  ),\n                ),\n              ),\n            ],\n          ),\n          if (showFSActionItem)\n            Row(\n              mainAxisAlignment: MainAxisAlignment.end,\n              crossAxisAlignment: CrossAxisAlignment.start,\n              children: [\n                SizedBox(\n                  width: btnWidth,\n                  height: btnHeight,\n                  child: Obx(\n                    () => ActionItem(\n                      expand: false,\n                      icon: const Icon(\n                        FontAwesomeIcons.thumbsUp,\n                        color: Colors.white,\n                      ),\n                      selectIcon: const Icon(\n                        FontAwesomeIcons.solidThumbsUp,\n                      ),\n                      selectStatus: introController.hasLike.value,\n                      semanticsLabel: '点赞',\n                      animation: introController.tripleAnimation,\n                      onStartTriple: () {\n                        plPlayerController.tripling = true;\n                        introController.onStartTriple();\n                      },\n                      onCancelTriple: ([bool isTapUp = false]) {\n                        plPlayerController\n                          ..tripling = false\n                          ..hideTaskControls();\n                        introController.onCancelTriple(isTapUp);\n                      },\n                    ),\n                  ),\n                ),\n                if (introController case final UgcIntroController ugc)\n                  SizedBox(\n                    width: btnWidth,\n                    height: btnHeight,\n                    child: Obx(\n                      () => ActionItem(\n                        expand: false,\n                        icon: const Icon(\n                          FontAwesomeIcons.thumbsDown,\n                          color: Colors.white,\n                        ),\n                        selectIcon: const Icon(\n                          FontAwesomeIcons.solidThumbsDown,\n                        ),\n                        onTap: () => ugc.handleAction(ugc.actionDislikeVideo),\n                        selectStatus: ugc.hasDislike.value,\n                        semanticsLabel: '点踩',\n                      ),\n                    ),\n                  ),\n                SizedBox(\n                  width: btnWidth,\n                  height: btnHeight,\n                  child: Obx(\n                    () => ActionItem(\n                      expand: false,\n                      animation: introController.tripleAnimation,\n                      icon: const Icon(\n                        FontAwesomeIcons.b,\n                        color: Colors.white,\n                      ),\n                      selectIcon: const Icon(FontAwesomeIcons.b),\n                      onTap: introController.actionCoinVideo,\n                      selectStatus: introController.hasCoin,\n                      semanticsLabel: '投币',\n                    ),\n                  ),\n                ),\n                SizedBox(\n                  width: btnWidth,\n                  height: btnHeight,\n                  child: Obx(\n                    () => ActionItem(\n                      expand: false,\n                      animation: introController.tripleAnimation,\n                      icon: const Icon(\n                        FontAwesomeIcons.star,\n                        color: Colors.white,\n                      ),\n                      selectIcon: const Icon(FontAwesomeIcons.solidStar),\n                      onTap: () => introController.showFavBottomSheet(context),\n                      onLongPress: () => introController.showFavBottomSheet(\n                        context,\n                        isLongPress: true,\n                      ),\n                      selectStatus: introController.hasFav.value,\n                      semanticsLabel: '收藏',\n                    ),\n                  ),\n                ),\n                SizedBox(\n                  width: btnWidth,\n                  height: btnHeight,\n                  child: ActionItem(\n                    expand: false,\n                    icon: const Icon(\n                      FontAwesomeIcons.shareFromSquare,\n                      color: Colors.white,\n                    ),\n                    onTap: () => introController.actionShareVideo(context),\n                    semanticsLabel: '分享',\n                  ),\n                ),\n              ],\n            ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/widgets/header_mixin.dart",
    "content": "import 'package:PiliPlus/common/widgets/button/icon_button.dart';\nimport 'package:PiliPlus/pages/video/introduction/ugc/widgets/menu_row.dart';\nimport 'package:PiliPlus/plugin/pl_player/controller.dart';\nimport 'package:PiliPlus/plugin/pl_player/utils/danmaku_options.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nmixin HeaderMixin<T extends StatefulWidget> on State<T> {\n  PlPlayerController get plPlayerController;\n\n  bool get isFullScreen => plPlayerController.isFullScreen.value;\n\n  Future<void>? showBottomSheet(\n    StatefulWidgetBuilder builder, {\n    double? padding,\n  }) {\n    return PageUtils.showVideoBottomSheet(\n      context,\n      isFullScreen: () => isFullScreen,\n      padding: padding,\n      child: StatefulBuilder(\n        builder: (context, setState) => plPlayerController.darkVideoPage\n            ? Theme(\n                data: Theme.of(this.context),\n                child: builder(this.context, setState),\n              )\n            : builder(context, setState),\n      ),\n    );\n  }\n\n  Widget resetBtn(ThemeData theme, Object def, VoidCallback onPressed) {\n    return iconButton(\n      tooltip: '默认值: $def',\n      icon: const Icon(Icons.refresh),\n      onPressed: onPressed,\n      iconColor: theme.colorScheme.outline,\n      size: 24,\n      iconSize: 24,\n    );\n  }\n\n  /// 弹幕功能\n  void showSetDanmaku({bool isLive = false}) {\n    // 屏蔽类型\n    const blockTypesList = [\n      (value: 2, label: '滚动'),\n      (value: 5, label: '顶部'),\n      (value: 4, label: '底部'),\n      (value: 6, label: '彩色'),\n      (value: 7, label: '高级'),\n    ];\n\n    final danmakuController = plPlayerController.danmakuController;\n\n    final isFullScreen = this.isFullScreen;\n\n    showBottomSheet(\n      (context, setState) {\n        final theme = Theme.of(context);\n\n        void setOptions() => danmakuController?.updateOption(\n          DanmakuOptions.get(\n            notFullscreen: !isFullScreen,\n            speed: plPlayerController.playbackSpeed,\n          ),\n        );\n\n        final sliderTheme = SliderThemeData(\n          trackHeight: 10,\n          trackShape: const MSliderTrackShape(),\n          thumbColor: theme.colorScheme.primary,\n          activeTrackColor: theme.colorScheme.primary,\n          inactiveTrackColor: theme.colorScheme.onInverseSurface,\n          thumbShape: const RoundSliderThumbShape(enabledThumbRadius: 6.0),\n        );\n\n        void updateLineHeight(double val) {\n          DanmakuOptions.danmakuLineHeight = val.toPrecision(1);\n          setState(() {});\n          setOptions();\n        }\n\n        void updateDuration(double val) {\n          DanmakuOptions.danmakuDuration = val.toPrecision(1);\n          setState(() {});\n          setOptions();\n        }\n\n        void updateStaticDuration(double val) {\n          DanmakuOptions.danmakuStaticDuration = val.toPrecision(1);\n          setState(() {});\n          setOptions();\n        }\n\n        void updateFontSizeFS(double val) {\n          DanmakuOptions.danmakuFontScaleFS = val;\n          setState(() {});\n          if (isFullScreen) {\n            setOptions();\n          }\n        }\n\n        void updateFontSize(double val) {\n          DanmakuOptions.danmakuFontScale = val;\n          setState(() {});\n          if (!isFullScreen) {\n            setOptions();\n          }\n        }\n\n        void updateStrokeWidth(double val) {\n          DanmakuOptions.danmakuStrokeWidth = val;\n          setState(() {});\n          setOptions();\n        }\n\n        void updateFontWeight(double val) {\n          DanmakuOptions.danmakuFontWeight = val.toInt();\n          setState(() {});\n          setOptions();\n        }\n\n        void updateOpacity(double val) {\n          plPlayerController.danmakuOpacity.value = val;\n          setState(() {});\n        }\n\n        void updateShowArea(double val) {\n          DanmakuOptions.danmakuShowArea = val.toPrecision(1);\n          setState(() {});\n          setOptions();\n        }\n\n        void updateDanmakuWeight(double val) {\n          DanmakuOptions.danmakuWeight = val.toInt();\n          setState(() {});\n        }\n\n        void onUpdateBlockType(int blockType, bool blocked) {\n          if (blocked) {\n            DanmakuOptions.blockTypes.remove(blockType);\n          } else {\n            DanmakuOptions.blockTypes.add(blockType);\n          }\n          DanmakuOptions.blockColorful = DanmakuOptions.blockTypes.contains(6);\n          setState(() {});\n          setOptions();\n        }\n\n        return Padding(\n          padding: const EdgeInsets.all(12),\n          child: Material(\n            clipBehavior: Clip.hardEdge,\n            color: theme.colorScheme.surface,\n            borderRadius: const BorderRadius.all(Radius.circular(12)),\n            child: Padding(\n              padding: const EdgeInsets.symmetric(horizontal: 14),\n              child: ListView(\n                padding: EdgeInsets.zero,\n                children: [\n                  const SizedBox(\n                    height: 45,\n                    child: Center(\n                      child: Text('弹幕设置', style: TextStyle(fontSize: 14)),\n                    ),\n                  ),\n                  const SizedBox(height: 10),\n                  if (!isLive) ...[\n                    Row(\n                      mainAxisAlignment: .spaceBetween,\n                      children: [\n                        Text('智能云屏蔽 ${DanmakuOptions.danmakuWeight} 级'),\n                        TextButton(\n                          style: TextButton.styleFrom(\n                            padding: EdgeInsets.zero,\n                            minimumSize: Size.zero,\n                            tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n                          ),\n                          onPressed: () => Get\n                            ..back()\n                            ..toNamed(\n                              '/danmakuBlock',\n                              arguments: plPlayerController,\n                            ),\n                          child: Text(\n                            \"屏蔽管理(${plPlayerController.filters.count})\",\n                          ),\n                        ),\n                      ],\n                    ),\n                    Padding(\n                      padding: const EdgeInsets.only(\n                        top: 0,\n                        bottom: 6,\n                        left: 10,\n                        right: 10,\n                      ),\n                      child: SliderTheme(\n                        data: sliderTheme,\n                        child: Slider(\n                          min: 0,\n                          max: 11,\n                          value: DanmakuOptions.danmakuWeight.toDouble(),\n                          divisions: 11,\n                          label: DanmakuOptions.danmakuWeight.toString(),\n                          onChanged: updateDanmakuWeight,\n                        ),\n                      ),\n                    ),\n                  ],\n                  const Text('按类型屏蔽'),\n                  SingleChildScrollView(\n                    scrollDirection: .horizontal,\n                    padding: const .symmetric(vertical: 10),\n                    child: Row(\n                      spacing: 10,\n                      children: blockTypesList.map(\n                        (e) {\n                          final blocked = DanmakuOptions.blockTypes.contains(\n                            e.value,\n                          );\n                          return ActionRowLineItem(\n                            onTap: () => onUpdateBlockType(e.value, blocked),\n                            text: e.label,\n                            selectStatus: blocked,\n                          );\n                        },\n                      ).toList(),\n                    ),\n                  ),\n                  const Text('其他'),\n                  SingleChildScrollView(\n                    scrollDirection: .horizontal,\n                    padding: const .symmetric(vertical: 10),\n                    child: Row(\n                      spacing: 10,\n                      children: [\n                        ActionRowLineItem(\n                          selectStatus: DanmakuOptions.danmakuMassiveMode,\n                          onTap: () {\n                            DanmakuOptions.danmakuMassiveMode =\n                                !DanmakuOptions.danmakuMassiveMode;\n                            setState(() {});\n                            setOptions();\n                          },\n                          text: '海量弹幕',\n                        ),\n                        ActionRowLineItem(\n                          selectStatus: DanmakuOptions.danmakuStatic2Scroll,\n                          onTap: () {\n                            DanmakuOptions.danmakuStatic2Scroll =\n                                !DanmakuOptions.danmakuStatic2Scroll;\n                            setState(() {});\n                            setOptions();\n                          },\n                          text: '固定转滚动',\n                        ),\n                        ActionRowLineItem(\n                          selectStatus: DanmakuOptions.danmakuFixedV,\n                          onTap: () {\n                            DanmakuOptions.danmakuFixedV =\n                                !DanmakuOptions.danmakuFixedV;\n                            setState(() {});\n                            setOptions();\n                          },\n                          text: '滚动弹幕固定速度',\n                        ),\n                      ],\n                    ),\n                  ),\n                  Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: [\n                      Text('显示区域 ${DanmakuOptions.danmakuShowArea * 100}%'),\n                      resetBtn(theme, '50.0%', () => updateShowArea(0.5)),\n                    ],\n                  ),\n                  Padding(\n                    padding: const EdgeInsets.only(\n                      top: 0,\n                      bottom: 6,\n                      left: 10,\n                      right: 10,\n                    ),\n                    child: SliderTheme(\n                      data: sliderTheme,\n                      child: Slider(\n                        min: 0.1,\n                        max: 1,\n                        value: DanmakuOptions.danmakuShowArea,\n                        divisions: 9,\n                        label: '${DanmakuOptions.danmakuShowArea * 100}%',\n                        onChanged: updateShowArea,\n                      ),\n                    ),\n                  ),\n                  Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: [\n                      Text('不透明度 ${plPlayerController.danmakuOpacity * 100}%'),\n                      resetBtn(theme, '100.0%', () => updateOpacity(1.0)),\n                    ],\n                  ),\n                  Padding(\n                    padding: const EdgeInsets.only(\n                      top: 0,\n                      bottom: 6,\n                      left: 10,\n                      right: 10,\n                    ),\n                    child: SliderTheme(\n                      data: sliderTheme,\n                      child: Slider(\n                        min: 0,\n                        max: 1,\n                        value: plPlayerController.danmakuOpacity.value,\n                        divisions: 10,\n                        label: '${plPlayerController.danmakuOpacity * 100}%',\n                        onChanged: updateOpacity,\n                      ),\n                    ),\n                  ),\n                  Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: [\n                      Text(\n                        '字体粗细 ${DanmakuOptions.danmakuFontWeight + 1}（可能无法精确调节）',\n                      ),\n                      resetBtn(theme, 6, () => updateFontWeight(5)),\n                    ],\n                  ),\n                  Padding(\n                    padding: const EdgeInsets.only(\n                      top: 0,\n                      bottom: 6,\n                      left: 10,\n                      right: 10,\n                    ),\n                    child: SliderTheme(\n                      data: sliderTheme,\n                      child: Slider(\n                        min: 0,\n                        max: 8,\n                        value: DanmakuOptions.danmakuFontWeight.toDouble(),\n                        divisions: 8,\n                        label: '${DanmakuOptions.danmakuFontWeight + 1}',\n                        onChanged: updateFontWeight,\n                      ),\n                    ),\n                  ),\n                  Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: [\n                      Text('描边粗细 ${DanmakuOptions.danmakuStrokeWidth}'),\n                      resetBtn(theme, 1.5, () => updateStrokeWidth(1.5)),\n                    ],\n                  ),\n                  Padding(\n                    padding: const EdgeInsets.only(\n                      top: 0,\n                      bottom: 6,\n                      left: 10,\n                      right: 10,\n                    ),\n                    child: SliderTheme(\n                      data: sliderTheme,\n                      child: Slider(\n                        min: 0,\n                        max: 5,\n                        value: DanmakuOptions.danmakuStrokeWidth,\n                        divisions: 10,\n                        label: DanmakuOptions.danmakuStrokeWidth\n                            .toStringAsFixed(0),\n                        onChanged: updateStrokeWidth,\n                      ),\n                    ),\n                  ),\n                  Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: [\n                      Text(\n                        '字体大小 ${(DanmakuOptions.danmakuFontScale * 100).toStringAsFixed(1)}%',\n                      ),\n                      resetBtn(theme, '100.0%', () => updateFontSize(1.0)),\n                    ],\n                  ),\n                  Padding(\n                    padding: const EdgeInsets.only(\n                      top: 0,\n                      bottom: 6,\n                      left: 10,\n                      right: 10,\n                    ),\n                    child: SliderTheme(\n                      data: sliderTheme,\n                      child: Slider(\n                        min: 0.5,\n                        max: 2.5,\n                        value: DanmakuOptions.danmakuFontScale,\n                        divisions: 20,\n                        label:\n                            '${(DanmakuOptions.danmakuFontScale * 100).toStringAsFixed(1)}%',\n                        onChanged: updateFontSize,\n                      ),\n                    ),\n                  ),\n                  Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: [\n                      Text(\n                        '全屏字体大小 ${(DanmakuOptions.danmakuFontScaleFS * 100).toStringAsFixed(1)}%',\n                      ),\n                      resetBtn(theme, '120.0%', () => updateFontSizeFS(1.2)),\n                    ],\n                  ),\n                  Padding(\n                    padding: const EdgeInsets.only(\n                      top: 0,\n                      bottom: 6,\n                      left: 10,\n                      right: 10,\n                    ),\n                    child: SliderTheme(\n                      data: sliderTheme,\n                      child: Slider(\n                        min: 0.5,\n                        max: 2.5,\n                        value: DanmakuOptions.danmakuFontScaleFS,\n                        divisions: 20,\n                        label:\n                            '${(DanmakuOptions.danmakuFontScaleFS * 100).toStringAsFixed(1)}%',\n                        onChanged: updateFontSizeFS,\n                      ),\n                    ),\n                  ),\n                  Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: [\n                      Text('滚动弹幕时长 ${DanmakuOptions.danmakuDuration} 秒'),\n                      resetBtn(theme, 7.0, () => updateDuration(7.0)),\n                    ],\n                  ),\n                  Padding(\n                    padding: const EdgeInsets.only(\n                      top: 0,\n                      bottom: 6,\n                      left: 10,\n                      right: 10,\n                    ),\n                    child: SliderTheme(\n                      data: sliderTheme,\n                      child: Slider(\n                        min: 1,\n                        max: 50,\n                        value: DanmakuOptions.danmakuDuration,\n                        divisions: 49,\n                        label: DanmakuOptions.danmakuDuration.toString(),\n                        onChanged: updateDuration,\n                      ),\n                    ),\n                  ),\n                  Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: [\n                      Text('静态弹幕时长 ${DanmakuOptions.danmakuStaticDuration} 秒'),\n                      resetBtn(theme, 4.0, () => updateStaticDuration(4.0)),\n                    ],\n                  ),\n                  Padding(\n                    padding: const EdgeInsets.only(\n                      top: 0,\n                      bottom: 6,\n                      left: 10,\n                      right: 10,\n                    ),\n                    child: SliderTheme(\n                      data: sliderTheme,\n                      child: Slider(\n                        min: 1,\n                        max: 50,\n                        value: DanmakuOptions.danmakuStaticDuration,\n                        divisions: 49,\n                        label: DanmakuOptions.danmakuStaticDuration.toString(),\n                        onChanged: updateStaticDuration,\n                      ),\n                    ),\n                  ),\n                  Row(\n                    mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                    children: [\n                      Text('弹幕行高 ${DanmakuOptions.danmakuLineHeight}'),\n                      resetBtn(theme, 1.6, () => updateLineHeight(1.6)),\n                    ],\n                  ),\n                  Padding(\n                    padding: const EdgeInsets.only(\n                      top: 0,\n                      bottom: 6,\n                      left: 10,\n                      right: 10,\n                    ),\n                    child: SliderTheme(\n                      data: sliderTheme,\n                      child: Slider(\n                        min: 1.0,\n                        max: 3.0,\n                        value: DanmakuOptions.danmakuLineHeight,\n                        onChanged: updateLineHeight,\n                      ),\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          ),\n        );\n      },\n    )?.whenComplete(\n      () => DanmakuOptions.save(plPlayerController.danmakuOpacity.value),\n    );\n  }\n}\n\nclass MSliderTrackShape extends RoundedRectSliderTrackShape {\n  const MSliderTrackShape();\n\n  @override\n  Rect getPreferredRect({\n    required RenderBox parentBox,\n    Offset offset = Offset.zero,\n    SliderThemeData? sliderTheme,\n    bool isEnabled = false,\n    bool isDiscrete = false,\n  }) {\n    const double trackHeight = 3;\n    final double trackLeft = offset.dx;\n    final double trackTop =\n        offset.dy + (parentBox.size.height - trackHeight) / 2 + 4;\n    final double trackWidth = parentBox.size.width;\n    return Rect.fromLTWH(trackLeft, trackTop, trackWidth, trackHeight);\n  }\n}\n"
  },
  {
    "path": "lib/pages/video/widgets/player_focus.dart",
    "content": "import 'dart:async';\nimport 'dart:io' show exit, Platform;\nimport 'dart:math' as math;\n\nimport 'package:PiliPlus/pages/common/common_intro_controller.dart';\nimport 'package:PiliPlus/pages/video/introduction/ugc/controller.dart';\nimport 'package:PiliPlus/plugin/pl_player/controller.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart'\n    show KeyDownEvent, KeyUpEvent, LogicalKeyboardKey, HardwareKeyboard;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass PlayerFocus extends StatelessWidget {\n  const PlayerFocus({\n    super.key,\n    required this.child,\n    required this.plPlayerController,\n    this.introController,\n    required this.onSendDanmaku,\n    this.canPlay,\n    this.onSkipSegment,\n    this.onRefresh,\n  });\n\n  final Widget child;\n  final PlPlayerController plPlayerController;\n  final CommonIntroController? introController;\n  final VoidCallback onSendDanmaku;\n  final ValueGetter<bool>? canPlay;\n  final ValueGetter<bool>? onSkipSegment;\n  final VoidCallback? onRefresh;\n\n  static bool _shouldHandle(LogicalKeyboardKey logicalKey) {\n    return logicalKey == LogicalKeyboardKey.tab ||\n        logicalKey == LogicalKeyboardKey.arrowLeft ||\n        logicalKey == LogicalKeyboardKey.arrowRight ||\n        logicalKey == LogicalKeyboardKey.arrowUp ||\n        logicalKey == LogicalKeyboardKey.arrowDown;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Focus(\n      autofocus: true,\n      onKeyEvent: (node, event) {\n        final handled = _handleKey(event);\n        if (handled || _shouldHandle(event.logicalKey)) {\n          return KeyEventResult.handled;\n        }\n        return KeyEventResult.ignored;\n      },\n      child: child,\n    );\n  }\n\n  bool get isFullScreen => plPlayerController.isFullScreen.value;\n  bool get hasPlayer => plPlayerController.videoPlayerController != null;\n\n  void _setVolume({required bool isIncrease}) {\n    final volume = isIncrease\n        ? math.min(\n            PlPlayerController.maxVolume,\n            plPlayerController.volume.value + 0.1,\n          )\n        : math.max(0.0, plPlayerController.volume.value - 0.1);\n    plPlayerController.setVolume(volume);\n  }\n\n  void _updateVolume(KeyEvent event, {required bool isIncrease}) {\n    if (event is KeyDownEvent) {\n      if (hasPlayer) {\n        _setVolume(isIncrease: isIncrease);\n        plPlayerController\n          ..longPressTimer?.cancel()\n          ..longPressTimer = Timer.periodic(\n            const Duration(milliseconds: 150),\n            (_) => _setVolume(isIncrease: isIncrease),\n          );\n      }\n    } else if (event is KeyUpEvent) {\n      plPlayerController.cancelLongPressTimer();\n    }\n  }\n\n  bool _handleKey(KeyEvent event) {\n    final key = event.logicalKey;\n\n    final isKeyQ = key == LogicalKeyboardKey.keyQ;\n    if (isKeyQ || key == LogicalKeyboardKey.keyR) {\n      if (HardwareKeyboard.instance.isMetaPressed) {\n        if (isKeyQ && Platform.isMacOS) {\n          exit(0);\n        }\n        return true;\n      }\n      if (event is KeyDownEvent) {\n        if (plPlayerController.isLive) {\n          onRefresh?.call();\n        } else {\n          introController!.onStartTriple();\n        }\n      } else if (event is KeyUpEvent && !plPlayerController.isLive) {\n        introController!.onCancelTriple(isKeyQ);\n      }\n      return true;\n    }\n\n    final isArrowUp = key == LogicalKeyboardKey.arrowUp;\n    if (isArrowUp || key == LogicalKeyboardKey.arrowDown) {\n      _updateVolume(event, isIncrease: isArrowUp);\n      return true;\n    }\n\n    if (key == LogicalKeyboardKey.arrowRight) {\n      if (!plPlayerController.isLive) {\n        if (event is KeyDownEvent) {\n          if (hasPlayer && !plPlayerController.longPressStatus.value) {\n            plPlayerController\n              ..longPressTimer?.cancel()\n              ..longPressTimer = Timer(\n                const Duration(milliseconds: 200),\n                () => plPlayerController\n                  ..cancelLongPressTimer()\n                  ..setLongPressStatus(true),\n              );\n          }\n        } else if (event is KeyUpEvent) {\n          plPlayerController.cancelLongPressTimer();\n          if (hasPlayer) {\n            if (plPlayerController.longPressStatus.value) {\n              plPlayerController.setLongPressStatus(false);\n            } else {\n              plPlayerController.onForward(\n                plPlayerController.fastForBackwardDuration,\n              );\n            }\n          }\n        }\n      }\n      return true;\n    }\n\n    if (event is KeyDownEvent) {\n      final isDigit1 = key == LogicalKeyboardKey.digit1;\n      if (isDigit1 || key == LogicalKeyboardKey.digit2) {\n        if (HardwareKeyboard.instance.isShiftPressed && hasPlayer) {\n          final speed = isDigit1 ? 1.0 : 2.0;\n          if (speed != plPlayerController.playbackSpeed) {\n            plPlayerController.setPlaybackSpeed(speed);\n          }\n          SmartDialog.showToast('${speed}x播放');\n        }\n        return true;\n      }\n\n      switch (key) {\n        case LogicalKeyboardKey.space:\n          if (plPlayerController.isLive || canPlay!()) {\n            if (hasPlayer) {\n              plPlayerController.onDoubleTapCenter();\n            }\n          }\n          return true;\n\n        case LogicalKeyboardKey.keyF:\n          final isFullScreen = this.isFullScreen;\n          if (isFullScreen && plPlayerController.controlsLock.value) {\n            plPlayerController\n              ..controlsLock.value = false\n              ..showControls.value = false;\n          }\n          plPlayerController.triggerFullScreen(\n            status: !isFullScreen,\n            inAppFullScreen: HardwareKeyboard.instance.isShiftPressed,\n          );\n          return true;\n\n        case LogicalKeyboardKey.keyD:\n          final newVal = !plPlayerController.enableShowDanmaku.value;\n          plPlayerController.enableShowDanmaku.value = newVal;\n          if (!plPlayerController.tempPlayerConf) {\n            GStorage.setting.put(\n              plPlayerController.isLive\n                  ? SettingBoxKey.enableShowLiveDanmaku\n                  : SettingBoxKey.enableShowDanmaku,\n              newVal,\n            );\n          }\n          return true;\n\n        case LogicalKeyboardKey.keyP:\n          if (PlatformUtils.isDesktop && hasPlayer && !isFullScreen) {\n            plPlayerController\n              ..toggleDesktopPip()\n              ..controlsLock.value = false\n              ..showControls.value = false;\n          }\n          return true;\n\n        case LogicalKeyboardKey.keyM:\n          if (hasPlayer) {\n            final isMuted = !plPlayerController.isMuted;\n            plPlayerController.videoPlayerController!.setVolume(\n              isMuted ? 0 : plPlayerController.volume.value * 100,\n            );\n            plPlayerController.isMuted = isMuted;\n            SmartDialog.showToast('${isMuted ? '' : '取消'}静音');\n          }\n          return true;\n\n        case LogicalKeyboardKey.keyS:\n          if (hasPlayer && isFullScreen) {\n            plPlayerController.takeScreenshot();\n          }\n          return true;\n\n        case LogicalKeyboardKey.keyL:\n          if (isFullScreen || plPlayerController.isDesktopPip) {\n            plPlayerController.onLockControl(\n              !plPlayerController.controlsLock.value,\n            );\n          }\n          return true;\n\n        case LogicalKeyboardKey.enter:\n          if (onSkipSegment?.call() ?? false) {\n            return true;\n          }\n          onSendDanmaku();\n          return true;\n      }\n\n      if (!plPlayerController.isLive) {\n        switch (key) {\n          case LogicalKeyboardKey.arrowLeft:\n            if (hasPlayer) {\n              plPlayerController.onBackward(\n                plPlayerController.fastForBackwardDuration,\n              );\n            }\n            return true;\n\n          case LogicalKeyboardKey.keyW:\n            if (HardwareKeyboard.instance.isMetaPressed) {\n              return true;\n            }\n            introController?.actionCoinVideo();\n            return true;\n\n          case LogicalKeyboardKey.keyE:\n            introController?.actionFavVideo(isQuick: true);\n            return true;\n\n          case LogicalKeyboardKey.keyT || LogicalKeyboardKey.keyV:\n            introController?.viewLater();\n            return true;\n\n          case LogicalKeyboardKey.keyG:\n            if (introController case final UgcIntroController ugcCtr) {\n              ugcCtr.actionRelationMod(Get.context!);\n            }\n            return true;\n\n          case LogicalKeyboardKey.bracketLeft:\n            if (introController case final introController?) {\n              if (!introController.prevPlay()) {\n                SmartDialog.showToast('已经是第一集了');\n              }\n            }\n            return true;\n\n          case LogicalKeyboardKey.bracketRight:\n            if (introController case final introController?) {\n              if (!introController.nextPlay()) {\n                SmartDialog.showToast('已经是最后一集了');\n              }\n            }\n            return true;\n        }\n      }\n    }\n\n    return false;\n  }\n}\n"
  },
  {
    "path": "lib/pages/webdav/view.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/pages/webdav/webdav.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\n\nclass WebDavSettingPage extends StatefulWidget {\n  const WebDavSettingPage({\n    super.key,\n    this.showAppBar = true,\n  });\n\n  final bool showAppBar;\n\n  @override\n  State<WebDavSettingPage> createState() => _WebDavSettingPageState();\n}\n\nclass _WebDavSettingPageState extends State<WebDavSettingPage> {\n  final _uriCtr = TextEditingController(text: Pref.webdavUri);\n  final _usernameCtr = TextEditingController(text: Pref.webdavUsername);\n  final _passwordCtr = TextEditingController(text: Pref.webdavPassword);\n  final _directoryCtr = TextEditingController(text: Pref.webdavDirectory);\n  bool _obscureText = true;\n\n  @override\n  void dispose() {\n    _uriCtr.dispose();\n    _usernameCtr.dispose();\n    _passwordCtr.dispose();\n    _directoryCtr.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final showAppBar = widget.showAppBar;\n    final padding = MediaQuery.viewPaddingOf(context);\n    return Scaffold(\n      appBar: showAppBar ? AppBar(title: const Text('WebDAV 设置')) : null,\n      body: Stack(\n        clipBehavior: Clip.none,\n        children: [\n          ListView(\n            padding: padding.copyWith(\n              top: 20,\n              left: 20 + (showAppBar ? padding.left : 0),\n              right: 20 + (showAppBar ? padding.right : 0),\n              bottom: padding.bottom + 100,\n            ),\n            children: [\n              TextField(\n                controller: _uriCtr,\n                decoration: const InputDecoration(\n                  labelText: '地址',\n                  border: OutlineInputBorder(),\n                ),\n              ),\n              const SizedBox(height: 20),\n              TextField(\n                controller: _usernameCtr,\n                decoration: const InputDecoration(\n                  labelText: '用户',\n                  border: OutlineInputBorder(),\n                ),\n              ),\n              const SizedBox(height: 20),\n              TextField(\n                controller: _passwordCtr,\n                autofillHints: const [AutofillHints.password],\n                decoration: InputDecoration(\n                  labelText: '密码',\n                  border: const OutlineInputBorder(),\n                  suffixIcon: IconButton(\n                    onPressed: () =>\n                        setState(() => _obscureText = !_obscureText),\n                    icon: _obscureText\n                        ? const Icon(Icons.visibility)\n                        : const Icon(Icons.visibility_off),\n                  ),\n                ),\n                obscureText: _obscureText,\n              ),\n              const SizedBox(height: 20),\n              TextField(\n                controller: _directoryCtr,\n                decoration: const InputDecoration(\n                  labelText: '路径',\n                  border: OutlineInputBorder(),\n                ),\n              ),\n              const SizedBox(height: 20),\n              Row(\n                children: [\n                  Expanded(\n                    child: FilledButton.tonal(\n                      style: FilledButton.styleFrom(\n                        shape: const RoundedRectangleBorder(\n                          borderRadius: StyleString.mdRadius,\n                        ),\n                      ),\n                      onPressed: WebDav().backup,\n                      child: const Text('备份设置'),\n                    ),\n                  ),\n                  const SizedBox(width: 20),\n                  Expanded(\n                    child: FilledButton.tonal(\n                      style: FilledButton.styleFrom(\n                        shape: const RoundedRectangleBorder(\n                          borderRadius: StyleString.mdRadius,\n                        ),\n                      ),\n                      onPressed: WebDav().restore,\n                      child: const Text('恢复设置'),\n                    ),\n                  ),\n                ],\n              ),\n            ],\n          ),\n          Positioned(\n            right:\n                kFloatingActionButtonMargin + (showAppBar ? padding.right : 0),\n            bottom: kFloatingActionButtonMargin + padding.bottom,\n            child: FloatingActionButton(\n              child: const Icon(Icons.save),\n              onPressed: () async {\n                await GStorage.setting.putAll({\n                  SettingBoxKey.webdavUri: _uriCtr.text,\n                  SettingBoxKey.webdavUsername: _usernameCtr.text,\n                  SettingBoxKey.webdavPassword: _passwordCtr.text,\n                  SettingBoxKey.webdavDirectory: _directoryCtr.text,\n                });\n                if (_uriCtr.text.isEmpty) {\n                  return;\n                }\n                try {\n                  final res = await WebDav().init();\n                  if (res.first) {\n                    SmartDialog.showToast('配置成功');\n                  } else {\n                    SmartDialog.showToast('配置失败: ${res.second}');\n                  }\n                } catch (e) {\n                  SmartDialog.showToast('配置失败: ${e.toString()}');\n                  return;\n                }\n              },\n            ),\n          ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/webdav/webdav.dart",
    "content": "import 'dart:convert';\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/pair.dart';\nimport 'package:PiliPlus/utils/extension/context_ext.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get_core/src/get_main.dart';\nimport 'package:get/get_navigation/src/extension_navigation.dart';\nimport 'package:webdav_client/webdav_client.dart' as webdav;\n\nclass WebDav {\n  late String _webdavDirectory;\n  String? _fileName;\n\n  webdav.Client? _client;\n\n  WebDav._internal();\n  static final WebDav _instance = WebDav._internal();\n  factory WebDav() => _instance;\n\n  Future<Pair<bool, String?>> init() async {\n    final webDavUri = Pref.webdavUri;\n    final webDavUsername = Pref.webdavUsername;\n    final webDavPassword = Pref.webdavPassword;\n    _webdavDirectory = Pref.webdavDirectory;\n    if (!_webdavDirectory.endsWith('/')) {\n      _webdavDirectory += '/';\n    }\n    _webdavDirectory += Constants.appName;\n\n    try {\n      _client = null;\n      final client =\n          webdav.newClient(\n              webDavUri,\n              user: webDavUsername,\n              password: webDavPassword,\n            )\n            ..setHeaders({'accept-charset': 'utf-8'})\n            ..setConnectTimeout(12000)\n            ..setReceiveTimeout(12000)\n            ..setSendTimeout(12000);\n\n      await client.mkdirAll(_webdavDirectory);\n\n      _client = client;\n      return Pair(first: true, second: null);\n    } catch (e) {\n      return Pair(first: false, second: e.toString());\n    }\n  }\n\n  String _getFileName() {\n    return 'piliplus_settings_${Get.context!.platformName}.json';\n  }\n\n  Future<void> backup() async {\n    if (_client == null) {\n      final res = await init();\n      if (!res.first) {\n        SmartDialog.showToast('备份失败，请检查配置: ${res.second}');\n        return;\n      }\n    }\n    try {\n      String data = GStorage.exportAllSettings();\n      _fileName ??= _getFileName();\n      final path = '$_webdavDirectory/$_fileName';\n      try {\n        await _client!.remove(path);\n      } catch (_) {}\n      await _client!.write(path, utf8.encode(data));\n      SmartDialog.showToast('备份成功');\n    } catch (e) {\n      SmartDialog.showToast('备份失败: $e');\n    }\n  }\n\n  Future<void> restore() async {\n    if (_client == null) {\n      final res = await init();\n      if (!res.first) {\n        SmartDialog.showToast('恢复失败，请检查配置: ${res.second}');\n        return;\n      }\n    }\n    try {\n      _fileName ??= _getFileName();\n      final path = '$_webdavDirectory/$_fileName';\n      final data = await _client!.read(path);\n      await GStorage.importAllSettings(utf8.decode(data));\n      SmartDialog.showToast('恢复成功');\n    } catch (e) {\n      SmartDialog.showToast('恢复失败: $e');\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/webview/view.dart",
    "content": "import 'dart:io';\n\nimport 'package:PiliPlus/http/browser_ua.dart';\nimport 'package:PiliPlus/main.dart';\nimport 'package:PiliPlus/models/common/webview_menu_type.dart';\nimport 'package:PiliPlus/utils/app_scheme.dart';\nimport 'package:PiliPlus/utils/cache_manager.dart';\nimport 'package:PiliPlus/utils/login_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_inappwebview/flutter_inappwebview.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass WebviewPage extends StatefulWidget {\n  const WebviewPage({\n    super.key,\n    this.url,\n    this.oid,\n    this.title,\n    this.userAgent,\n  });\n\n  final String? url;\n\n  // note\n  final int? oid;\n  final String? title;\n  final String? userAgent;\n\n  @override\n  State<WebviewPage> createState() => _WebviewPageState();\n}\n\nclass _WebviewPageState extends State<WebviewPage> {\n  late final String _url = widget.url ?? Get.parameters['url'] ?? '';\n  late final String userAgent;\n  final RxString title = ''.obs;\n  final RxDouble progress = 1.0.obs;\n  bool _inApp = false;\n  bool _off = false;\n\n  InAppWebViewController? _webViewController;\n\n  static final _prefixRegex = RegExp(\n    r'^(?!(https?://))\\S+://',\n    caseSensitive: false,\n  );\n\n  @override\n  void initState() {\n    super.initState();\n    userAgent =\n        widget.userAgent ??\n        switch (Get.parameters['uaType']) {\n          'pc' => BrowserUa.pc,\n          'mob' => BrowserUa.mob,\n          _ => BrowserUa.platform,\n        };\n    if (Get.arguments case final Map map) {\n      _inApp = map['inApp'] ?? false;\n      _off = map['off'] ?? false;\n    }\n  }\n\n  @override\n  void dispose() {\n    _webViewController = null;\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    if (Platform.isLinux) {\n      return Scaffold(\n        appBar: AppBar(),\n        resizeToAvoidBottomInset: false,\n        body: Center(\n          child: TextButton(\n            onPressed: () => PageUtils.launchURL(_url),\n            child: const Text('unsupported'),\n          ),\n        ),\n      );\n    }\n    return Scaffold(\n      appBar: widget.url != null\n          ? null\n          : AppBar(\n              title: Obx(\n                () => Text(\n                  title.value.isNotEmpty ? title.value : _url,\n                  maxLines: 1,\n                  overflow: TextOverflow.ellipsis,\n                ),\n              ),\n              bottom: PreferredSize(\n                preferredSize: Size.zero,\n                child: Obx(\n                  () => progress.value < 1\n                      ? LinearProgressIndicator(value: progress.value)\n                      : const SizedBox.shrink(),\n                ),\n              ),\n              actions: [\n                PopupMenuButton(\n                  onSelected: (item) async {\n                    switch (item) {\n                      case WebviewMenuItem.refresh:\n                        _webViewController?.reload();\n                        break;\n                      case WebviewMenuItem.copy:\n                        WebUri? uri = await _webViewController?.getUrl();\n                        if (uri != null) {\n                          Utils.copyText(uri.toString());\n                        }\n                        break;\n                      case WebviewMenuItem.openInBrowser:\n                        WebUri? uri = await _webViewController?.getUrl();\n                        if (uri != null) {\n                          PageUtils.launchURL(uri.toString());\n                        }\n                        break;\n                      case WebviewMenuItem.clearCache:\n                        try {\n                          await InAppWebViewController.clearAllCache();\n                          await _webViewController?.clearHistory();\n                          SmartDialog.showToast('已清理');\n                        } catch (e) {\n                          SmartDialog.showToast(e.toString());\n                        }\n                        break;\n                      case WebviewMenuItem.goBack:\n                        if (await _webViewController?.canGoBack() == true) {\n                          _webViewController?.goBack();\n                        } else {\n                          Get.back();\n                        }\n                        break;\n                      case WebviewMenuItem.resetCookie:\n                        await LoginUtils.setWebCookie();\n                        SmartDialog.showToast('设置成功，刷新或重新打开网页');\n                        break;\n                    }\n                  },\n                  itemBuilder: (context) => <PopupMenuEntry<WebviewMenuItem>>[\n                    ...WebviewMenuItem.values\n                        .take(WebviewMenuItem.values.length - 1)\n                        .map(\n                          (item) => PopupMenuItem(\n                            value: item,\n                            child: Text(item.title),\n                          ),\n                        ),\n                    const PopupMenuDivider(),\n                    PopupMenuItem(\n                      value: WebviewMenuItem.goBack,\n                      child: Text(\n                        WebviewMenuItem.goBack.title,\n                        style: TextStyle(\n                          color: Theme.of(context).colorScheme.error,\n                        ),\n                      ),\n                    ),\n                  ],\n                ),\n              ],\n            ),\n      body: SafeArea(\n        child: InAppWebView(\n          webViewEnvironment: webViewEnvironment,\n          initialSettings: InAppWebViewSettings(\n            clearCache: true,\n            javaScriptEnabled: true,\n            forceDark: ForceDark.AUTO,\n            useHybridComposition: false,\n            algorithmicDarkeningAllowed: true,\n            useShouldOverrideUrlLoading: true,\n            userAgent: userAgent,\n            mixedContentMode: MixedContentMode.MIXED_CONTENT_ALWAYS_ALLOW,\n          ),\n          initialUrlRequest: URLRequest(\n            url: WebUri.uri(Uri.tryParse(_url) ?? Uri()),\n          ),\n          onWebViewCreated: (InAppWebViewController controller) {\n            _webViewController = controller;\n            controller\n              ..addJavaScriptHandler(\n                handlerName: 'finishButtonClicked',\n                callback: (args) {\n                  Get.back();\n                },\n              )\n              ..addJavaScriptHandler(\n                handlerName: 'infoBarClicked',\n                callback: (args) async {\n                  WebUri? uri = await controller.getUrl();\n                  if (uri != null) {\n                    String? oid = uri.queryParameters['oid'];\n                    if (oid != null) {\n                      PiliScheme.videoPush(int.parse(oid), null);\n                    }\n                  }\n                },\n              );\n          },\n          onProgressChanged: (controller, progress) {\n            this.progress.value = progress / 100;\n          },\n          onTitleChanged: (controller, title) {\n            this.title.value = title ?? '';\n          },\n          onCloseWindow: (controller) => Get.back(),\n          onLoadStop: (controller, uri) {\n            final url = uri.toString();\n            if (url.startsWith('https://www.bilibili.com/h5/note-app')) {\n              controller\n                ..evaluateJavascript(\n                  source: \"\"\"\n  document.querySelector('.finish-btn').addEventListener('click', function() {\n      window.flutter_inappwebview.callHandler('finishButtonClicked');\n  });\n\"\"\",\n                )\n                ..evaluateJavascript(\n                  source: \"\"\"\n  document.querySelector('.info-bar').addEventListener('click', function() {\n      window.flutter_inappwebview.callHandler('infoBarClicked');\n  });\n\"\"\",\n                );\n            } else if (url.startsWith('https://live.bilibili.com')) {\n              controller.evaluateJavascript(\n                source: '''\n                  document.styleSheets[0].insertRule('div.open-app-btn.bili-btn-warp {display:none;}', 0);\n                  document.styleSheets[0].insertRule('#app__display-area > div.control-panel {display:none;}', 0);\n                  ''',\n              );\n            }\n            // _webViewController?.evaluateJavascript(\n            //   source: '''\n            //     document.querySelector('#internationalHeader').remove();\n            //     document.querySelector('#message-navbar').remove();\n            //   ''',\n            // );\n          },\n          onDownloadStartRequest: Platform.isAndroid\n              ? (controller, request) {\n                  showDialog(\n                    context: context,\n                    builder: (context) {\n                      String suggestedFilename = request.suggestedFilename\n                          .toString();\n                      String fileSize = CacheManager.formatSize(\n                        request.contentLength.toDouble(),\n                      );\n                      try {\n                        suggestedFilename = Uri.decodeComponent(\n                          suggestedFilename,\n                        );\n                      } catch (e) {\n                        if (kDebugMode) debugPrint(e.toString());\n                      }\n                      return AlertDialog(\n                        title: Text(\n                          '下载文件: $suggestedFilename ?',\n                          style: const TextStyle(fontSize: 18),\n                        ),\n                        content: SelectableText(request.url.toString()),\n                        actions: [\n                          TextButton(\n                            onPressed: Get.back,\n                            child: Text(\n                              '取消',\n                              style: TextStyle(\n                                color: Theme.of(context).colorScheme.outline,\n                              ),\n                            ),\n                          ),\n                          TextButton(\n                            onPressed: () {\n                              Get.back();\n                              PageUtils.launchURL(request.url.toString());\n                            },\n                            child: Text('确定 ($fileSize)'),\n                          ),\n                        ],\n                      );\n                    },\n                  );\n                  progress.value = 1;\n                }\n              : null,\n          shouldInterceptAjaxRequest: (controller, ajaxRequest) async {\n            String url = ajaxRequest.url.toString();\n            if (url.startsWith('//api.bilibili.com/x/note/add') &&\n                widget.title != null) {\n              return ajaxRequest\n                ..data = ajaxRequest.data.toString().replaceFirst(\n                  '&title=--&',\n                  '&title=${widget.title}&',\n                );\n            }\n            return null;\n          },\n          shouldInterceptRequest: (controller, request) async {\n            String url = request.url.toString();\n            if (url.startsWith(\n              'https://passport.bilibili.com/x/passport-login/web',\n            )) {\n              progress.value = 1;\n              return WebResourceResponse();\n            }\n            return null;\n          },\n          shouldOverrideUrlLoading: (controller, navigationAction) async {\n            if (_inApp) {\n              return NavigationActionPolicy.ALLOW;\n            }\n            late String url = navigationAction.request.url.toString();\n            bool hasMatch = await PiliScheme.routePush(\n              navigationAction.request.url?.uriValue ?? Uri(),\n              selfHandle: true,\n              off: _off,\n            );\n            // if (kDebugMode) debugPrint('webview: [$url], [$hasMatch]');\n            if (hasMatch) {\n              progress.value = 1;\n              return NavigationActionPolicy.CANCEL;\n            } else if (_prefixRegex.hasMatch(url)) {\n              if (context.mounted) {\n                SnackBar snackBar = SnackBar(\n                  content: const Text('当前网页将要打开外部链接，是否打开'),\n                  showCloseIcon: true,\n                  persist: false,\n                  action: SnackBarAction(\n                    label: '打开',\n                    onPressed: () => PageUtils.launchURL(url),\n                  ),\n                );\n                ScaffoldMessenger.of(context).showSnackBar(snackBar);\n              }\n              progress.value = 1;\n              return NavigationActionPolicy.CANCEL;\n            }\n\n            return NavigationActionPolicy.ALLOW;\n          },\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/whisper/controller.dart",
    "content": "import 'package:PiliPlus/grpc/bilibili/app/im/v1.pb.dart'\n    show Offset, Session, SessionMainReply, SessionPageType, ThreeDotItem;\nimport 'package:PiliPlus/grpc/im.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/msg/msgfeed_unread.dart';\nimport 'package:PiliPlus/pages/common/common_whisper_controller.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:protobuf/protobuf.dart' show PbMap;\n\nclass WhisperController extends CommonWhisperController<SessionMainReply> {\n  @override\n  SessionPageType sessionPageType = SessionPageType.SESSION_PAGE_TYPE_HOME;\n\n  late final List<({bool enabled, IconData icon, String name, String route})>\n  msgFeedTopItems;\n  late final RxList<int> unreadCounts;\n\n  PbMap<int, Offset>? offset;\n\n  Rx<List<ThreeDotItem>?> threeDotItems = Rx<List<ThreeDotItem>?>(null);\n  Rx<List<ThreeDotItem>?> outsideItem = Rx<List<ThreeDotItem>?>(null);\n\n  @override\n  void onInit() {\n    super.onInit();\n    msgFeedTopItems = [\n      const (\n        name: \"回复我的\",\n        icon: Icons.message_outlined,\n        route: \"/replyMe\",\n        enabled: true,\n      ),\n      const (\n        name: \"@我\",\n        icon: Icons.alternate_email_outlined,\n        route: \"/atMe\",\n        enabled: true,\n      ),\n      (\n        name: \"收到的赞\",\n        icon: Icons.favorite_border_outlined,\n        route: \"/likeMe\",\n        enabled: !Pref.disableLikeMsg,\n      ),\n      const (\n        name: \"系统通知\",\n        icon: Icons.notifications_none_outlined,\n        route: \"/sysMsg\",\n        enabled: true,\n      ),\n    ];\n    unreadCounts = List.filled(msgFeedTopItems.length, 0).obs;\n    queryMsgFeedUnread();\n    queryData();\n  }\n\n  Future<void> queryMsgFeedUnread() async {\n    final res = await ImGrpc.getTotalUnread(unreadType: 2);\n    if (res case Success(:final response)) {\n      final data = MsgFeedUnread.fromJson(response.msgFeedUnread.unread);\n      final unreadCounts = [data.reply, data.at, data.like, data.sysMsg];\n      if (!listEquals(this.unreadCounts, unreadCounts)) {\n        this.unreadCounts.value = unreadCounts;\n      }\n    } else {\n      res.toast();\n    }\n  }\n\n  @override\n  List<Session>? getDataList(SessionMainReply response) {\n    offset = response.paginationParams.offsets;\n    isEnd = !response.paginationParams.hasMore;\n    return response.sessions;\n  }\n\n  @override\n  bool customHandleResponse(\n    bool isRefresh,\n    Success<SessionMainReply> response,\n  ) {\n    if (isRefresh) {\n      threeDotItems.value = response.response.threeDotItems;\n      outsideItem.value = response.response.outsideItem;\n    }\n    return false;\n  }\n\n  @override\n  Future<LoadingState<SessionMainReply>> customGetData() =>\n      ImGrpc.sessionMain(offset: offset);\n\n  @override\n  Future<void> onRefresh() {\n    offset = null;\n    queryMsgFeedUnread();\n    return super.onRefresh();\n  }\n}\n"
  },
  {
    "path": "lib/pages/whisper/view.dart",
    "content": "import 'package:PiliPlus/common/skeleton/whisper_item.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/grpc/bilibili/app/im/v1.pb.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/pages/whisper/controller.dart';\nimport 'package:PiliPlus/pages/whisper/widgets/item.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/extension/three_dot_ext.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass WhisperPage extends StatefulWidget {\n  const WhisperPage({super.key});\n\n  @override\n  State<WhisperPage> createState() => _WhisperPageState();\n}\n\nclass _WhisperPageState extends State<WhisperPage> {\n  final _controller = Get.put(WhisperController());\n\n  @override\n  Widget build(BuildContext context) {\n    final theme = Theme.of(context);\n    final padding = MediaQuery.viewPaddingOf(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        title: const Text('消息'),\n        actions: [\n          IconButton(\n            tooltip: '新增粉丝',\n            onPressed: () => Get.toNamed(\n              '/webview',\n              parameters: {\n                'url':\n                    'https://www.bilibili.com/h5/follow/newFans?navhide=1&${Utils.themeUrl(theme.colorScheme.isDark)}',\n              },\n            ),\n            icon: const Icon(Icons.account_circle_outlined),\n          ),\n          Obx(() {\n            final outsideItem = _controller.outsideItem.value;\n            if (outsideItem != null && outsideItem.isNotEmpty) {\n              return Row(\n                mainAxisSize: .min,\n                children: outsideItem.map((e) {\n                  return IconButton(\n                    tooltip: e.hasTitle() ? e.title : null,\n                    onPressed: () => e.type.action(\n                      context: context,\n                      controller: _controller,\n                      item: e,\n                    ),\n                    icon: e.type.icon,\n                  );\n                }).toList(),\n              );\n            }\n            return const SizedBox.shrink();\n          }),\n          Obx(() {\n            final threeDotItems = _controller.threeDotItems.value;\n            if (threeDotItems != null && threeDotItems.isNotEmpty) {\n              return PopupMenuButton(\n                itemBuilder: (context) {\n                  return threeDotItems\n                      .map(\n                        (e) => PopupMenuItem(\n                          onTap: () => e.type.action(\n                            context: context,\n                            controller: _controller,\n                            item: e,\n                          ),\n                          child: Row(\n                            children: [\n                              e.type.icon,\n                              Text('  ${e.title}'),\n                            ],\n                          ),\n                        ),\n                      )\n                      .toList();\n                },\n              );\n            }\n            return const SizedBox.shrink();\n          }),\n          const SizedBox(width: 5),\n        ],\n      ),\n      body: refreshIndicator(\n        onRefresh: _controller.onRefresh,\n        child: CustomScrollView(\n          physics: const AlwaysScrollableScrollPhysics(),\n          slivers: [\n            _buildTopItems(theme, padding),\n            SliverPadding(\n              padding: EdgeInsets.only(bottom: padding.bottom + 100),\n              sliver: Obx(() => _buildBody(_controller.loadingState.value)),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget _buildBody(LoadingState<List<Session>?> loadingState) {\n    late final divider = Divider(\n      indent: 72,\n      endIndent: 20,\n      height: 1,\n      color: Colors.grey.withValues(alpha: 0.1),\n    );\n    return switch (loadingState) {\n      Loading() => SliverList.builder(\n        itemCount: 12,\n        itemBuilder: (context, index) => const WhisperItemSkeleton(),\n      ),\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverList.separated(\n                itemCount: response.length,\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    _controller.onLoadMore();\n                  }\n                  final item = response[index];\n                  return WhisperSessionItem(\n                    item: item,\n                    onSetTop: (isTop, id) =>\n                        _controller.onSetTop(item, index, isTop, id),\n                    onSetMute: (isMuted, talkerUid) =>\n                        _controller.onSetMute(item, isMuted, talkerUid),\n                    onRemove: (talkerId) =>\n                        _controller.onRemove(index, talkerId),\n                  );\n                },\n                separatorBuilder: (context, index) => divider,\n              )\n            : HttpError(onReload: _controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n\n  Widget _buildTopItems(ThemeData theme, EdgeInsets padding) {\n    return SliverPadding(\n      padding: EdgeInsets.only(left: padding.left, right: padding.right),\n      sliver: SliverToBoxAdapter(\n        child: Row(\n          mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n          children: List.generate(_controller.msgFeedTopItems.length, (index) {\n            final item = _controller.msgFeedTopItems[index];\n            return GestureDetector(\n              behavior: HitTestBehavior.opaque,\n              child: Padding(\n                padding: const EdgeInsets.all(10),\n                child: Column(\n                  mainAxisSize: MainAxisSize.min,\n                  crossAxisAlignment: CrossAxisAlignment.center,\n                  mainAxisAlignment: MainAxisAlignment.center,\n                  children: [\n                    Obx(\n                      () {\n                        final count = _controller.unreadCounts[index];\n                        return Badge(\n                          isLabelVisible: count > 0,\n                          label: Text(\" $count \"),\n                          alignment: Alignment.topRight,\n                          child: CircleAvatar(\n                            radius: 22,\n                            backgroundColor: theme.colorScheme.onInverseSurface,\n                            child: Icon(\n                              item.icon,\n                              size: 20,\n                              color: theme.colorScheme.primary,\n                            ),\n                          ),\n                        );\n                      },\n                    ),\n                    const SizedBox(height: 6),\n                    Text(\n                      item.name,\n                      style: const TextStyle(fontSize: 13),\n                    ),\n                  ],\n                ),\n              ),\n              onTap: () {\n                if (!item.enabled) {\n                  SmartDialog.showToast('已禁用');\n                  return;\n                }\n                _controller.unreadCounts[index] = 0;\n                Get.toNamed(item.route);\n              },\n            );\n          }),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/whisper/widgets/item.dart",
    "content": "import 'dart:convert';\n\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/common/widgets/flutter/list_tile.dart';\nimport 'package:PiliPlus/common/widgets/pendant_avatar.dart';\nimport 'package:PiliPlus/grpc/bilibili/app/im/v1.pb.dart'\n    show Session, SessionId, SessionPageType, SessionType, UnreadStyle;\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/pages/whisper_secondary/view.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:fixnum/fixnum.dart';\nimport 'package:flutter/material.dart' hide ListTile;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass WhisperSessionItem extends StatelessWidget {\n  const WhisperSessionItem({\n    super.key,\n    required this.item,\n    required this.onSetTop,\n    required this.onSetMute,\n    required this.onRemove,\n  });\n\n  final Session item;\n  final Function(bool isTop, SessionId id) onSetTop;\n  final Function(bool isMuted, Int64 talkerUid) onSetMute;\n  final ValueChanged<int> onRemove;\n\n  @override\n  Widget build(BuildContext context) {\n    final resource =\n        item.sessionInfo.avatar.fallbackLayers.layers.first.resource;\n    final avatar = resource.hasResImage()\n        ? resource.resImage.imageSrc.remote.url\n        : resource.hasResAnimation()\n        ? resource.resAnimation.webpSrc.remote.url\n        : resource.resNativeDraw.drawSrc.remote.url;\n    Map? vipInfo = item.sessionInfo.hasVipInfo()\n        ? jsonDecode(item.sessionInfo.vipInfo)\n        : null;\n    final ThemeData theme = Theme.of(context);\n\n    return ListTile(\n      safeArea: true,\n      tileColor: item.isPinned\n          ? theme.colorScheme.onInverseSurface.withValues(\n              alpha: theme.brightness.isDark ? 0.4 : 0.8,\n            )\n          : null,\n      onLongPress: () => showDialog(\n        context: context,\n        builder: (context) => AlertDialog(\n          clipBehavior: Clip.hardEdge,\n          contentPadding: const EdgeInsets.symmetric(vertical: 12),\n          content: DefaultTextStyle(\n            style: const TextStyle(fontSize: 14),\n            child: Column(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                ListTile(\n                  dense: true,\n                  onTap: () {\n                    Get.back();\n                    onSetTop(item.isPinned, item.id);\n                  },\n                  title: Text(item.isPinned ? '移除置顶' : '置顶'),\n                ),\n                if (item.id.privateId.hasTalkerUid())\n                  ListTile(\n                    dense: true,\n                    onTap: () {\n                      Get.back();\n                      onSetMute(item.isMuted, item.id.privateId.talkerUid);\n                    },\n                    title: Text('${item.isMuted ? '关闭' : '开启'}免打扰'),\n                  ),\n                if (item.id.privateId.hasTalkerUid())\n                  ListTile(\n                    dense: true,\n                    onTap: () {\n                      Get.back();\n                      showConfirmDialog(\n                        context: context,\n                        title: '确定删除该对话？',\n                        onConfirm: () =>\n                            onRemove(item.id.privateId.talkerUid.toInt()),\n                      );\n                    },\n                    title: const Text('删除'),\n                  ),\n              ],\n            ),\n          ),\n        ),\n      ),\n      onSecondaryTapUp: PlatformUtils.isDesktop\n          ? (details) => showMenu(\n              context: context,\n              position: PageUtils.menuPosition(details.globalPosition),\n              items: [\n                PopupMenuItem(\n                  height: 42,\n                  onTap: () => onSetTop(item.isPinned, item.id),\n                  child: Text(item.isPinned ? '移除置顶' : '置顶'),\n                ),\n                if (item.id.privateId.hasTalkerUid())\n                  PopupMenuItem(\n                    height: 42,\n                    onTap: () =>\n                        onSetMute(item.isMuted, item.id.privateId.talkerUid),\n                    child: Text('${item.isMuted ? '关闭' : '开启'}免打扰'),\n                  ),\n                if (item.id.privateId.hasTalkerUid())\n                  PopupMenuItem(\n                    height: 42,\n                    onTap: () => showConfirmDialog(\n                      context: context,\n                      title: '确定删除该对话？',\n                      onConfirm: () =>\n                          onRemove(item.id.privateId.talkerUid.toInt()),\n                    ),\n                    child: const Text('删除'),\n                  ),\n              ],\n            )\n          : null,\n      onTap: () {\n        if (item.hasUnread()) {\n          item.clearUnread();\n          if (context.mounted) {\n            (context as Element).markNeedsBuild();\n          }\n        }\n        if (item.id.privateId.hasTalkerUid()) {\n          Get.toNamed(\n            '/whisperDetail',\n            arguments: {\n              'talkerId': item.id.privateId.talkerUid.toInt(),\n              'name': item.sessionInfo.sessionName,\n              'face': avatar,\n              if (item.sessionInfo.avatar.hasMid())\n                'mid': item.sessionInfo.avatar.mid.toInt(),\n              'isLive': item.sessionInfo.isLive,\n            },\n          );\n          return;\n        }\n\n        if (item.id.foldId.hasType()) {\n          SessionPageType? sessionPageType = switch (item.id.foldId.type) {\n            SessionType.SESSION_TYPE_UNKNOWN =>\n              SessionPageType.SESSION_PAGE_TYPE_UNKNOWN,\n            SessionType.SESSION_TYPE_GROUP =>\n              SessionPageType.SESSION_PAGE_TYPE_GROUP,\n            SessionType.SESSION_TYPE_GROUP_FOLD =>\n              SessionPageType.SESSION_PAGE_TYPE_GROUP,\n            SessionType.SESSION_TYPE_UNFOLLOWED =>\n              SessionPageType.SESSION_PAGE_TYPE_UNFOLLOWED,\n            SessionType.SESSION_TYPE_STRANGER =>\n              SessionPageType.SESSION_PAGE_TYPE_STRANGER,\n            SessionType.SESSION_TYPE_DUSTBIN =>\n              SessionPageType.SESSION_PAGE_TYPE_DUSTBIN,\n            SessionType.SESSION_TYPE_CUSTOMER_FOLD =>\n              SessionPageType.SESSION_PAGE_TYPE_CUSTOMER,\n            SessionType.SESSION_TYPE_AI_FOLD =>\n              SessionPageType.SESSION_PAGE_TYPE_AI,\n            SessionType.SESSION_TYPE_CUSTOMER_ACCOUNT =>\n              SessionPageType.SESSION_PAGE_TYPE_CUSTOMER,\n            _ => null,\n          };\n          if (sessionPageType != null) {\n            Get.to(\n              WhisperSecPage(\n                name: item.sessionInfo.sessionName,\n                sessionPageType: sessionPageType,\n              ),\n            );\n          } else {\n            SmartDialog.showToast(item.id.foldId.type.name);\n          }\n        }\n      },\n      leading: Builder(\n        builder: (context) {\n          final pendant = item.sessionInfo.avatar.fallbackLayers.layers\n              .elementAtOrNull(1)\n              ?.resource;\n          final official = item\n              .sessionInfo\n              .avatar\n              .fallbackLayers\n              .layers\n              .lastOrNull\n              ?.resource\n              .resImage\n              .imageSrc;\n\n          return GestureDetector(\n            onTap: item.sessionInfo.avatar.hasMid()\n                ? () =>\n                      Get.toNamed('/member?mid=${item.sessionInfo.avatar.mid}')\n                : null,\n            child: PendantAvatar(\n              size: 42,\n              badgeSize: 14,\n              avatar: avatar,\n              garbPendantImage:\n                  pendant?.resImage.imageSrc.remote.hasUrl() == true\n                  ? pendant!.resImage.imageSrc.remote.url\n                  : pendant?.resAnimation.webpSrc.remote.url,\n              isVip: vipInfo?['status'] != null && vipInfo!['status'] > 0,\n              officialType: official?.hasLocalValue() == true\n                  ? switch (official!.localValue) {\n                      3 => 0,\n                      4 => 1,\n                      _ => null,\n                    }\n                  : null,\n            ),\n          );\n        },\n      ),\n      title: Row(\n        spacing: 5,\n        children: [\n          Expanded(\n            child: Row(\n              spacing: 5,\n              children: [\n                Flexible(\n                  child: Text(\n                    item.sessionInfo.sessionName,\n                    maxLines: 1,\n                    overflow: TextOverflow.ellipsis,\n                    style: TextStyle(\n                      fontSize: 15,\n                      color:\n                          vipInfo?['status'] != null &&\n                              vipInfo!['status'] > 0 &&\n                              vipInfo['type'] == 2\n                          ? theme.colorScheme.vipColor\n                          : null,\n                    ),\n                  ),\n                ),\n                if (item.sessionInfo.userLabel.style.borderedLabel.hasText())\n                  PBadge(\n                    isStack: false,\n                    type: PBadgeType.line_secondary,\n                    size: PBadgeSize.small,\n                    fontSize: 10,\n                    isBold: false,\n                    text: item.sessionInfo.userLabel.style.borderedLabel.text,\n                  ),\n                if (item.sessionInfo.isLive)\n                  Image.asset(\n                    'assets/images/live/live.gif',\n                    height: 15,\n                    cacheHeight: 15.cacheSize(context),\n                    filterQuality: FilterQuality.low,\n                  ),\n              ],\n            ),\n          ),\n          if (item.hasTimestamp())\n            Text(\n              DateFormatUtils.dateFormat((item.timestamp ~/ 1000000).toInt()),\n              style: TextStyle(\n                fontSize: 12,\n                color: theme.colorScheme.outline,\n              ),\n            ),\n        ],\n      ),\n      subtitle: Row(\n        children: [\n          Expanded(\n            child: Text(\n              item.msgSummary.rawMsg,\n              maxLines: 1,\n              overflow: TextOverflow.ellipsis,\n              style: theme.textTheme.labelMedium!.copyWith(\n                color: theme.colorScheme.outline,\n              ),\n            ),\n          ),\n          if (item.isMuted)\n            Icon(\n              size: 16,\n              Icons.notifications_off,\n              color: theme.colorScheme.outline,\n            )\n          else if (item.hasUnread() &&\n              item.unread.style != UnreadStyle.UNREAD_STYLE_NONE)\n            Badge(\n              label: item.unread.style == UnreadStyle.UNREAD_STYLE_NUMBER\n                  ? Text(item.unread.number.toString())\n                  : null,\n            ),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/whisper_block/controller.dart",
    "content": "import 'package:PiliPlus/grpc/bilibili/app/im/v1.pb.dart';\nimport 'package:PiliPlus/grpc/im.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass WhisperBlockController\n    extends\n        CommonListController<KeywordBlockingListReply, KeywordBlockingItem> {\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  RxInt count = 0.obs;\n  int? listLimit;\n  int? charLimit;\n\n  @override\n  List<KeywordBlockingItem>? getDataList(KeywordBlockingListReply response) {\n    count.value = response.items.length;\n    listLimit = response.listLimit;\n    charLimit = response.charLimit;\n    return response.items;\n  }\n\n  @override\n  Future<LoadingState<KeywordBlockingListReply>> customGetData() =>\n      ImGrpc.keywordBlockingList();\n\n  Future<void> onAdd(String keyword) async {\n    final res = await ImGrpc.keywordBlockingAdd(keyword);\n    if (res.isSuccess) {\n      Get.back();\n      loadingState\n        ..value.data!.add(KeywordBlockingItem(keyword: keyword))\n        ..refresh();\n      count.value += 1;\n      SmartDialog.showToast('添加成功');\n    } else {\n      res.toast();\n    }\n  }\n\n  Future<void> onRemove(KeywordBlockingItem item) async {\n    final res = await ImGrpc.keywordBlockingDelete(item.keyword);\n    if (res.isSuccess) {\n      loadingState\n        ..value.data!.remove(item)\n        ..refresh();\n      count.value -= 1;\n      SmartDialog.showToast('删除成功');\n    } else {\n      res.toast();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/pages/whisper_block/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/grpc/bilibili/app/im/v1.pb.dart'\n    show KeywordBlockingItem;\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/pages/search/widgets/search_text.dart';\nimport 'package:PiliPlus/pages/whisper_block/controller.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart' show LengthLimitingTextInputFormatter;\nimport 'package:flutter_svg/svg.dart';\nimport 'package:get/get.dart';\n\nclass WhisperBlockPage extends StatefulWidget {\n  const WhisperBlockPage({\n    super.key,\n  });\n\n  @override\n  State<WhisperBlockPage> createState() => _WhisperBlockPageState();\n}\n\nclass _WhisperBlockPageState extends State<WhisperBlockPage> {\n  final _controller = Get.put(WhisperBlockController());\n\n  @override\n  Widget build(BuildContext context) {\n    final ThemeData theme = Theme.of(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(title: const Text('消息屏蔽词')),\n      body: Obx(() => _buildBody(theme, _controller.loadingState.value)),\n    );\n  }\n\n  Widget _buildBody(\n    ThemeData theme,\n    LoadingState<List<KeywordBlockingItem>?> loadingState,\n  ) {\n    return switch (loadingState) {\n      Loading() => m3eLoading,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? Column(\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  Padding(\n                    padding: const EdgeInsets.symmetric(horizontal: 12),\n                    child: Row(\n                      mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                      children: [\n                        Text(\n                          '点击屏蔽词即可删除',\n                          style: TextStyle(\n                            fontSize: 13,\n                            color: theme.colorScheme.outline,\n                          ),\n                        ),\n                        if (_controller.listLimit != null)\n                          Obx(\n                            () => Text(\n                              '${_controller.count.value}/${_controller.listLimit}',\n                              style: TextStyle(\n                                fontSize: 13,\n                                color: theme.colorScheme.outline,\n                              ),\n                            ),\n                          ),\n                      ],\n                    ),\n                  ),\n                  Expanded(\n                    child: SingleChildScrollView(\n                      padding: const EdgeInsets.all(12),\n                      child: Wrap(\n                        spacing: 12,\n                        runSpacing: 12,\n                        children: response\n                            .map(\n                              (e) => SearchText(\n                                text: e.keyword,\n                                onTap: (keyword) {\n                                  showConfirmDialog(\n                                    context: context,\n                                    title: '删除屏蔽词？',\n                                    content: '该屏蔽词将不再生效',\n                                    onConfirm: () => _controller.onRemove(e),\n                                  );\n                                },\n                              ),\n                            )\n                            .toList(),\n                      ),\n                    ),\n                  ),\n                  Padding(\n                    padding: EdgeInsets.only(\n                      left: 25,\n                      right: 25,\n                      bottom: MediaQuery.viewPaddingOf(context).bottom + 10,\n                    ),\n                    child: FilledButton.tonal(\n                      onPressed: _onAdd,\n                      child: const Row(\n                        mainAxisAlignment: MainAxisAlignment.center,\n                        children: [Icon(Icons.add, size: 22), Text('添加消息屏蔽词')],\n                      ),\n                    ),\n                  ),\n                ],\n              )\n            : Align(\n                alignment: const Alignment(0, -0.5),\n                child: Column(\n                  spacing: 6,\n                  mainAxisSize: MainAxisSize.min,\n                  children: [\n                    SvgPicture.asset(\"assets/images/error.svg\", height: 156),\n                    const Text(\n                      '还未添加屏蔽词',\n                      style: TextStyle(\n                        fontSize: 15,\n                        fontWeight: FontWeight.bold,\n                      ),\n                    ),\n                    const Text('添加后，将不再接受包含屏蔽词的消息'),\n                    FilledButton.tonal(\n                      onPressed: _onAdd,\n                      style: FilledButton.styleFrom(\n                        visualDensity: VisualDensity.compact,\n                      ),\n                      child: const Row(\n                        mainAxisSize: MainAxisSize.min,\n                        children: [\n                          Icon(Icons.add, size: 22),\n                          Text('添加'),\n                        ],\n                      ),\n                    ),\n                  ],\n                ),\n              ),\n      Error(:final errMsg) => scrollErrorWidget(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n\n  void _onAdd() {\n    String keyword = '';\n    showModalBottomSheet(\n      context: context,\n      enableDrag: false,\n      useSafeArea: true,\n      isScrollControlled: true,\n      builder: (context) {\n        final theme = Theme.of(context);\n        return Padding(\n          padding:\n              const EdgeInsets.symmetric(horizontal: 14, vertical: 12) +\n              EdgeInsets.only(\n                bottom:\n                    MediaQuery.paddingOf(context).bottom +\n                    MediaQuery.viewInsetsOf(context).bottom,\n              ),\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              Row(\n                mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                children: [\n                  const Text(\n                    '添加消息屏蔽词',\n                    style: TextStyle(\n                      fontSize: 14,\n                      fontWeight: FontWeight.bold,\n                    ),\n                  ),\n                  GestureDetector(\n                    onTap: Get.back,\n                    behavior: HitTestBehavior.opaque,\n                    child: Icon(\n                      Icons.clear,\n                      color: theme.colorScheme.onSurfaceVariant,\n                    ),\n                  ),\n                ],\n              ),\n              const SizedBox(height: 12),\n              TextFormField(\n                autofocus: true,\n                maxLength: _controller.charLimit,\n                decoration: InputDecoration(\n                  isDense: true,\n                  hintText: '请输入',\n                  visualDensity: .standard,\n                  hintStyle: const TextStyle(fontSize: 14),\n                  contentPadding: const EdgeInsets.symmetric(\n                    horizontal: 12,\n                    vertical: 6,\n                  ),\n                  border: const OutlineInputBorder(\n                    borderSide: BorderSide.none,\n                    borderRadius: BorderRadius.all(Radius.circular(25)),\n                  ),\n                  filled: true,\n                  fillColor: theme.colorScheme.onInverseSurface,\n                ),\n                onChanged: (value) => keyword = value,\n                inputFormatters: [LengthLimitingTextInputFormatter(20)],\n              ),\n              const SizedBox(height: 12),\n              FilledButton.tonal(\n                onPressed: () {\n                  if (keyword.isNotEmpty) {\n                    _controller.onAdd(keyword);\n                  }\n                },\n                child: const Row(\n                  mainAxisAlignment: MainAxisAlignment.center,\n                  children: [Icon(Icons.add, size: 22), Text('添加消息屏蔽词')],\n                ),\n              ),\n            ],\n          ),\n        );\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/whisper_detail/controller.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\n\nimport 'package:PiliPlus/grpc/bilibili/im/interfaces/v1.pb.dart'\n    show EmotionInfo, RspSessionMsg;\nimport 'package:PiliPlus/grpc/bilibili/im/type.pb.dart' show Msg, MsgType;\nimport 'package:PiliPlus/grpc/im.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/msg.dart';\nimport 'package:PiliPlus/pages/common/common_list_controller.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';\nimport 'package:PiliPlus/utils/feed_back.dart';\nimport 'package:fixnum/fixnum.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass WhisperDetailController extends CommonListController<RspSessionMsg, Msg> {\n  late final account = Accounts.main;\n\n  final int talkerId = Get.arguments['talkerId'];\n  final String name = Get.arguments['name'];\n  final String face = Get.arguments['face'];\n  final int? mid = Get.arguments['mid'];\n  final bool isLive = Get.arguments['isLive'] ?? false;\n\n  Int64? msgSeqno;\n\n  //表情转换图片规则\n  List<EmotionInfo>? eInfos;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  bool customHandleResponse(bool isRefresh, Success<RspSessionMsg> response) {\n    List<Msg> msgs = response.response.messages;\n    if (msgs.isNotEmpty) {\n      msgSeqno = msgs.last.msgSeqno;\n      if (msgs.length == 1 &&\n          msgs.last.msgType == 18 &&\n          msgs.last.msgSource == 18) {\n        //{content: [{\"text\":\"对方主动回复或关注你前，最多发送1条消息\",\"color_day\":\"#9499A0\",\"color_nig\":\"#9499A0\"}]}\n      } else {\n        ackSessionMsg(msgs.last.msgSeqno.toInt());\n      }\n      msgs.removeWhere((e) => e.msgType == MsgType.EN_MSG_TYPE_DRAW_BACK.value);\n      eInfos ??= <EmotionInfo>[];\n      eInfos!.addAll(response.response.eInfos);\n    }\n    return false;\n  }\n\n  // 消息标记已读\n  Future<void> ackSessionMsg(int msgSeqno) async {\n    final res = await MsgHttp.ackSessionMsg(\n      talkerId: talkerId,\n      ackSeqno: msgSeqno,\n    );\n    if (!res.isSuccess) {\n      res.toast();\n    }\n  }\n\n  late bool _isSending = false;\n  Future<void> sendMsg({\n    String? message,\n    Map? picMsg,\n    required VoidCallback onClearText,\n    int? msgType,\n    int? index,\n  }) async {\n    // debug\n    // if (loadingState.value case Success(:final response)) {\n    //   final list = List.of(response ?? <Msg>[])\n    //     ..insert(\n    //       0,\n    //       Msg.create()..mergeFromProto3Json({\n    //         \"senderUid\": \"${account.mid}\",\n    //         \"receiverType\": 1,\n    //         \"receiverId\": \"$mid\",\n    //         \"msgType\": msgType,\n    //         \"content\": jsonEncode({\"content\": message}),\n    //         \"msgSeqno\": \"1\",\n    //         \"timestamp\": \"${DateTime.now().millisecondsSinceEpoch ~/ 1000}\",\n    //         \"atUids\": [\"0\"],\n    //         \"msgKey\": \"2\",\n    //         \"msgSource\": msgType,\n    //       }),\n    //     );\n    //   loadingState.value = Success(list);\n    // }\n    // onClearText();\n    // scrollController.jumpToTop();\n    // SmartDialog.showToast('发送成功');\n    // return;\n    assert((message != null) ^ (picMsg != null));\n    if (_isSending) return;\n    _isSending = true;\n    feedBack();\n    SmartDialog.dismiss();\n    if (!account.isLogin) {\n      SmartDialog.showToast('请先登录');\n      return;\n    }\n    final res = await ImGrpc.sendMsg(\n      senderUid: account.mid,\n      receiverId: mid!,\n      content: msgType == 5\n          ? message!\n          : jsonEncode(picMsg ?? {\"content\": message!}),\n      msgType: MsgType.values[msgType ?? (picMsg != null ? 2 : 1)],\n    );\n    SmartDialog.dismiss();\n    if (res.isSuccess) {\n      if (msgType == 5) {\n        loadingState\n          ..value.data![index!].msgStatus = 1\n          ..refresh();\n        SmartDialog.showToast('撤回成功');\n      } else {\n        onRefresh();\n        onClearText();\n        SmartDialog.showToast('发送成功');\n      }\n    } else {\n      res.toast();\n    }\n    _isSending = false;\n  }\n\n  @override\n  List<Msg>? getDataList(RspSessionMsg response) {\n    if (response.hasMore == 0) {\n      isEnd = true;\n    }\n    return response.messages;\n  }\n\n  @override\n  Future<void> onRefresh() {\n    msgSeqno = null;\n    eInfos = null;\n    scrollController.jumpToTop();\n    return super.onRefresh();\n  }\n\n  @override\n  Future<LoadingState<RspSessionMsg>> customGetData() =>\n      ImGrpc.syncFetchSessionMsgs(\n        talkerId: talkerId,\n        beginSeqno: msgSeqno != null ? Int64.ZERO : null,\n        endSeqno: msgSeqno,\n      );\n\n  Future<LoadingState> onReport(Msg item, int reasonType, String reasonDesc) {\n    return MsgHttp.imMsgReport(\n      accusedUid: item.senderUid.toInt(),\n      reasonType: reasonType,\n      reasonDesc: reasonDesc,\n      comment: {'group_id': 0, 'msg_key': item.msgKey.toString()},\n      extra: {\"msg_keys\": []},\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/whisper_detail/view.dart",
    "content": "import 'dart:async';\nimport 'dart:io' show File;\n\nimport 'package:PiliPlus/common/widgets/dialog/report.dart';\nimport 'package:PiliPlus/common/widgets/flutter/chat_list_view.dart';\nimport 'package:PiliPlus/common/widgets/flutter/text_field/text_field.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/grpc/bilibili/im/type.pb.dart' show Msg;\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/msg.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/models/common/publish_panel_type.dart';\nimport 'package:PiliPlus/pages/common/publish/common_rich_text_pub_page.dart';\nimport 'package:PiliPlus/pages/emote/view.dart';\nimport 'package:PiliPlus/pages/whisper_detail/controller.dart';\nimport 'package:PiliPlus/pages/whisper_detail/widget/chat_item.dart';\nimport 'package:PiliPlus/pages/whisper_link_setting/view.dart';\nimport 'package:PiliPlus/utils/extension/file_ext.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/extension/widget_ext.dart';\nimport 'package:PiliPlus/utils/feed_back.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart' hide TextField;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:image_picker/image_picker.dart';\nimport 'package:mime/mime.dart';\n\nclass WhisperDetailPage extends CommonRichTextPubPage {\n  const WhisperDetailPage({\n    super.key,\n    super.autofocus = false,\n  });\n\n  @override\n  State<WhisperDetailPage> createState() => _WhisperDetailPageState();\n}\n\nclass _WhisperDetailPageState\n    extends CommonRichTextPubPageState<WhisperDetailPage> {\n  final _whisperDetailController = Get.put(\n    WhisperDetailController(),\n    tag: Utils.makeHeroTag(Get.parameters['talkerId']),\n  );\n\n  @override\n  Widget build(BuildContext context) {\n    final ThemeData theme = Theme.of(context);\n    final padding = MediaQuery.viewPaddingOf(context);\n    late final containerColor = ElevationOverlay.colorWithOverlay(\n      theme.colorScheme.surface,\n      theme.hoverColor,\n      1,\n    );\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        title: GestureDetector(\n          behavior: HitTestBehavior.opaque,\n          onTap: () {\n            if (_whisperDetailController.mid != null) {\n              feedBack();\n              Get.toNamed('/member?mid=${_whisperDetailController.mid}');\n            }\n          },\n          child: Row(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              NetworkImgLayer(\n                width: 34,\n                height: 34,\n                type: ImageType.avatar,\n                src: _whisperDetailController.face,\n              ),\n              const SizedBox(width: 6),\n              Flexible(\n                child: Text(\n                  _whisperDetailController.name,\n                  maxLines: 1,\n                  overflow: TextOverflow.ellipsis,\n                  style: const TextStyle(height: 1, fontSize: 16),\n                  strutStyle: const StrutStyle(\n                    leading: 0,\n                    height: 1,\n                    fontSize: 16,\n                  ),\n                ),\n              ),\n              if (_whisperDetailController.isLive) ...[\n                const SizedBox(width: 10),\n                Image.asset(\n                  'assets/images/live/live.gif',\n                  height: 16,\n                  cacheHeight: 16.cacheSize(context),\n                  filterQuality: FilterQuality.low,\n                ),\n              ],\n            ],\n          ),\n        ),\n        actions: [\n          IconButton(\n            tooltip: '设置',\n            onPressed: () => Get.to(\n              WhisperLinkSettingPage(\n                talkerUid: _whisperDetailController.talkerId,\n              ),\n            ),\n            icon: Icon(\n              size: 22,\n              Icons.settings,\n              color: theme.colorScheme.onSurfaceVariant.withValues(alpha: 0.8),\n            ),\n          ),\n          const SizedBox(width: 5),\n        ],\n      ),\n      body: Padding(\n        padding: EdgeInsets.only(left: padding.left, right: padding.right),\n        child: Column(\n          children: [\n            Expanded(\n              child: Listener(\n                onPointerDown: hidePanel,\n                behavior: HitTestBehavior.opaque,\n                child: Align(\n                  alignment: Alignment.topCenter,\n                  child: Obx(\n                    () =>\n                        _buildBody(_whisperDetailController.loadingState.value),\n                  ),\n                ),\n              ),\n            ),\n            if (_whisperDetailController.mid != null) ...[\n              _buildInputView(theme, containerColor),\n              buildPanelContainer(\n                theme,\n                containerColor,\n              ),\n            ] else\n              SizedBox(height: padding.bottom),\n          ],\n        ),\n      ).constraintWidth(),\n    );\n  }\n\n  Widget _buildBody(LoadingState<List<Msg>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => m3eLoading,\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? ChatListView.separated(\n                itemCount: response.length,\n                padding: const .all(kChatListPadding),\n                physics: const AlwaysScrollableScrollPhysics(\n                  parent: ClampingScrollPhysics(),\n                ),\n                controller: _whisperDetailController.scrollController,\n                itemBuilder: (context, int index) {\n                  if (index == response.length - 1) {\n                    _whisperDetailController.onLoadMore();\n                  }\n                  final item = response[index];\n                  final isOwner =\n                      item.senderUid.toInt() ==\n                      _whisperDetailController.account.mid;\n                  return ChatItem(\n                    item: item,\n                    eInfos: _whisperDetailController.eInfos,\n                    onLongPress: () => onLongPress(index, item, isOwner),\n                    onSecondaryTapUp: PlatformUtils.isDesktop\n                        ? (e) =>\n                              _showMenu(e.globalPosition, index, item, isOwner)\n                        : null,\n                    isOwner: isOwner,\n                  );\n                },\n                separatorBuilder: (context, index) =>\n                    const SizedBox(height: 12),\n              )\n            : scrollErrorWidget(onReload: _whisperDetailController.onReload),\n      Error(:final errMsg) => scrollErrorWidget(\n        errMsg: errMsg,\n        onReload: _whisperDetailController.onReload,\n      ),\n    };\n  }\n\n  void _showMenu(Offset offset, int index, Msg item, bool isOwner) {\n    showMenu(\n      context: context,\n      position: PageUtils.menuPosition(offset),\n      items: [\n        if (isOwner)\n          PopupMenuItem(\n            height: 42,\n            onTap: () => _whisperDetailController.sendMsg(\n              message: '${item.msgKey}',\n              onClearText: editController.clear,\n              msgType: 5,\n              index: index,\n            ),\n            child: const Text('撤回', style: TextStyle(fontSize: 14)),\n          )\n        else\n          PopupMenuItem(\n            height: 42,\n            onTap: () => autoWrapReportDialog(\n              context,\n              ban: false,\n              ReportOptions.imMsgReport,\n              (reasonType, reasonDesc, banUid) =>\n                  _whisperDetailController.onReport(\n                    item,\n                    reasonType,\n                    reasonType == 0\n                        ? reasonDesc!\n                        : ReportOptions.imMsgReport['']![reasonType]!,\n                  ),\n            ),\n            child: const Text('举报', style: TextStyle(fontSize: 14)),\n          ),\n      ],\n    );\n  }\n\n  void onLongPress(int index, Msg item, bool isOwner) {\n    Feedback.forLongPress(context);\n    showDialog(\n      context: context,\n      builder: (context) => AlertDialog(\n        clipBehavior: Clip.hardEdge,\n        contentPadding: const EdgeInsets.symmetric(vertical: 12),\n        content: isOwner\n            ? ListTile(\n                onTap: () {\n                  Get.back();\n                  _whisperDetailController.sendMsg(\n                    message: '${item.msgKey}',\n                    onClearText: editController.clear,\n                    msgType: 5,\n                    index: index,\n                  );\n                },\n                dense: true,\n                title: const Text('撤回', style: TextStyle(fontSize: 14)),\n              )\n            : ListTile(\n                onTap: () {\n                  Get.back();\n                  autoWrapReportDialog(\n                    context,\n                    ban: false,\n                    ReportOptions.imMsgReport,\n                    (reasonType, reasonDesc, banUid) =>\n                        _whisperDetailController.onReport(\n                          item,\n                          reasonType,\n                          reasonType == 0\n                              ? reasonDesc!\n                              : ReportOptions.imMsgReport['']![reasonType]!,\n                        ),\n                  );\n                },\n                dense: true,\n                title: const Text('举报', style: TextStyle(fontSize: 14)),\n              ),\n      ),\n    );\n  }\n\n  Widget _buildInputView(ThemeData theme, Color containerColor) {\n    return Container(\n      padding: const EdgeInsets.symmetric(vertical: 8),\n      decoration: BoxDecoration(\n        color: containerColor,\n        borderRadius: const BorderRadius.vertical(top: Radius.circular(16)),\n      ),\n      child: Row(\n        crossAxisAlignment: CrossAxisAlignment.end,\n        children: [\n          IconButton(\n            onPressed: () => updatePanelType(\n              panelType.value == PanelType.emoji\n                  ? PanelType.keyboard\n                  : PanelType.emoji,\n            ),\n            icon: const Icon(Icons.emoji_emotions),\n            tooltip: '表情',\n          ),\n          Expanded(\n            child: Listener(\n              onPointerUp: (event) {\n                // Currently it may be emojiPanel.\n                if (readOnly.value) {\n                  updatePanelType(PanelType.keyboard);\n                }\n              },\n              child: Obx(\n                () => RichTextField(\n                  key: key,\n                  readOnly: readOnly.value,\n                  focusNode: focusNode,\n                  controller: editController,\n                  minLines: 1,\n                  maxLines: 4,\n                  onChanged: onChanged,\n                  onSubmitted: onSubmitted,\n                  textInputAction: TextInputAction.newline,\n                  decoration: InputDecoration(\n                    filled: true,\n                    hintText: '发个消息聊聊呗~',\n                    fillColor: theme.colorScheme.surface,\n                    border: const OutlineInputBorder(\n                      borderSide: BorderSide.none,\n                      borderRadius: BorderRadius.all(Radius.circular(6)),\n                      gapPadding: 0,\n                    ),\n                    contentPadding: const EdgeInsets.all(10),\n                  ),\n                  // inputFormatters: [LengthLimitingTextInputFormatter(500)],\n                ),\n              ),\n            ),\n          ),\n          Obx(\n            () {\n              final enablePublish = this.enablePublish.value;\n              return IconButton(\n                onPressed: () async {\n                  if (enablePublish) {\n                    _whisperDetailController.sendMsg(\n                      message: editController.rawText,\n                      onClearText: () {\n                        editController.clear();\n                        this.enablePublish.value = false;\n                      },\n                    );\n                  } else {\n                    try {\n                      final XFile? pickedFile = await imagePicker.pickImage(\n                        source: ImageSource.gallery,\n                        imageQuality: 100,\n                      );\n                      if (pickedFile != null) {\n                        final path = pickedFile.path;\n                        SmartDialog.showLoading(msg: '正在上传图片');\n                        final result = await MsgHttp.uploadBfs(\n                          path: path,\n                          biz: 'im',\n                        );\n                        if (result case Success(:final response)) {\n                          final mimeType =\n                              lookupMimeType(\n                                path,\n                              )?.split('/').elementAtOrNull(1) ??\n                              'jpg';\n                          final picMsg = {\n                            'url': response.imageUrl,\n                            'height': response.imageHeight,\n                            'width': response.imageWidth,\n                            'imageType': mimeType,\n                            'original': 1,\n                            'size': response.imgSize,\n                          };\n                          SmartDialog.showLoading(msg: '正在发送');\n                          await _whisperDetailController\n                              .sendMsg(\n                                picMsg: picMsg,\n                                onClearText: editController.clear,\n                              )\n                              .whenComplete(() {\n                                if (PlatformUtils.isMobile) {\n                                  File(path).tryDel();\n                                }\n                              });\n                        } else {\n                          SmartDialog.dismiss();\n                          result.toast();\n                          return;\n                        }\n                      }\n                    } catch (e) {\n                      SmartDialog.showToast(e.toString());\n                    }\n                  }\n                },\n                icon: Icon(\n                  enablePublish\n                      ? Icons.send\n                      : Icons.add_photo_alternate_outlined,\n                ),\n                tooltip: enablePublish ? '发送' : '图片',\n              );\n            },\n          ),\n        ],\n      ),\n    );\n  }\n\n  @override\n  Widget? get customPanel => EmotePanel(onChoose: onChooseEmote);\n\n  @override\n  Future<void> onCustomPublish({List? pictures}) {\n    throw UnimplementedError();\n  }\n\n  @override\n  Future<void>? onMention([bool fromClick = false]) => null;\n\n  @override\n  void onSave() {}\n}\n"
  },
  {
    "path": "lib/pages/whisper_detail/widget/chat_item.dart",
    "content": "import 'dart:convert';\nimport 'dart:math' as math;\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/badge.dart';\nimport 'package:PiliPlus/common/widgets/flutter/layout_builder.dart';\nimport 'package:PiliPlus/common/widgets/gesture/tap_gesture_recognizer.dart';\nimport 'package:PiliPlus/common/widgets/image/network_img_layer.dart';\nimport 'package:PiliPlus/common/widgets/image_viewer/hero.dart';\nimport 'package:PiliPlus/grpc/bilibili/im/interfaces/v1.pb.dart'\n    show EmotionInfo;\nimport 'package:PiliPlus/grpc/bilibili/im/type.pb.dart' show Msg, MsgType;\nimport 'package:PiliPlus/http/search.dart';\nimport 'package:PiliPlus/models/common/badge_type.dart';\nimport 'package:PiliPlus/models/common/image_preview_type.dart';\nimport 'package:PiliPlus/models/common/image_type.dart';\nimport 'package:PiliPlus/utils/app_scheme.dart';\nimport 'package:PiliPlus/utils/date_utils.dart';\nimport 'package:PiliPlus/utils/duration_utils.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\nimport 'package:PiliPlus/utils/image_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:cached_network_image/cached_network_image.dart';\nimport 'package:flutter/material.dart' hide LayoutBuilder;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nclass ChatItem extends StatelessWidget {\n  static MsgType msgTypeFromValue(int value) {\n    return MsgType.valueOf(value) ?? MsgType.EN_INVALID_MSG_TYPE;\n  }\n\n  const ChatItem({\n    super.key,\n    required this.item,\n    required this.eInfos,\n    required this.onLongPress,\n    required this.onSecondaryTapUp,\n    required this.isOwner,\n  });\n\n  final Msg item;\n  final List<EmotionInfo>? eInfos;\n  final VoidCallback onLongPress;\n  final GestureTapUpCallback? onSecondaryTapUp;\n  final bool isOwner;\n\n  // 消息来源\n  // enum MsgSource {\n  //     EN_MSG_SOURCE_AUTOREPLY_BY_FOLLOWED    = 8;  //\n  //     EN_MSG_SOURCE_AUTOREPLY_BY_RECEIVE_MSG = 9;  //\n  //     EN_MSG_SOURCE_AUTOREPLY_BY_KEYWORDS    = 10; //\n  //     EN_MSG_SOURCE_AUTOREPLY_BY_VOYAGE      = 11; //\n  // };\n  @override\n  Widget build(BuildContext context) {\n    final msgType = item.msgType;\n    // final isRevoke = msgType == MsgType.EN_MSG_TYPE_DRAW_BACK.value; // 撤回消息\n    // if (isRevoke) {\n    //   return const SizedBox.shrink();\n    // }\n\n    late final ThemeData theme = Theme.of(context);\n    late final Color textColor = isOwner\n        ? theme.colorScheme.onSecondaryContainer\n        : theme.colorScheme.onSurfaceVariant;\n    late final dynamic content = jsonDecode(item.content);\n\n    Widget child = messageContent(\n      context: context,\n      theme: theme,\n      content: content,\n      textColor: textColor,\n    );\n\n    final isSystem =\n        msgType == MsgType.EN_MSG_TYPE_VIDEO_CARD.value ||\n        msgType == MsgType.EN_MSG_TYPE_TIP_MESSAGE.value ||\n        msgType == MsgType.EN_MSG_TYPE_NOTIFY_MSG.value ||\n        msgType == MsgType.EN_MSG_TYPE_PICTURE_CARD.value ||\n        msgType == 16;\n\n    if (!isSystem) {\n      final isPic = msgType == MsgType.EN_MSG_TYPE_PIC.value; // 图片\n      child = Row(\n        mainAxisAlignment: isOwner ? .end : .start,\n        children: [\n          Container(\n            constraints: const BoxConstraints(maxWidth: 300.0),\n            decoration: BoxDecoration(\n              color: isOwner\n                  ? theme.colorScheme.secondaryContainer\n                  : theme.colorScheme.onInverseSurface,\n              borderRadius: isOwner\n                  ? const .only(\n                      topLeft: .circular(16),\n                      topRight: .circular(16),\n                      bottomLeft: .circular(16),\n                      bottomRight: .circular(6),\n                    )\n                  : const .only(\n                      topLeft: .circular(16),\n                      topRight: .circular(16),\n                      bottomLeft: .circular(6),\n                      bottomRight: .circular(16),\n                    ),\n            ),\n            padding: isPic\n                ? const .only(top: 8, bottom: 6, left: 8, right: 8)\n                : const .only(top: 8, bottom: 6, left: 12, right: 12),\n            child: Column(\n              crossAxisAlignment: isOwner ? .end : .start,\n              children: [\n                child,\n                isPic ? const SizedBox(height: 7) : const SizedBox(height: 2),\n                if (item.msgStatus == 1)\n                  Text(\n                    '  已撤回',\n                    style: theme.textTheme.labelSmall!.copyWith(\n                      color: theme.colorScheme.onErrorContainer,\n                    ),\n                  ),\n                if (item.msgSource >= 8 && item.msgSource <= 11) ...[\n                  Divider(\n                    height: 10,\n                    thickness: 1,\n                    color: theme.colorScheme.outline.withValues(alpha: 0.2),\n                  ),\n                  Text(\n                    '此条消息为自动回复',\n                    style: theme.textTheme.labelMedium!.copyWith(\n                      color: theme.colorScheme.outline,\n                    ),\n                  ),\n                ],\n              ],\n            ),\n          ),\n        ],\n      );\n    }\n\n    return Column(\n      children: [\n        Padding(\n          padding: const EdgeInsets.only(top: 6, bottom: 18),\n          child: Text(\n            DateFormatUtils.chatFormat(item.timestamp.toInt()),\n            textAlign: TextAlign.center,\n            style: TextStyle(color: theme.colorScheme.outline),\n          ),\n        ),\n        GestureDetector(\n          behavior: .opaque,\n          onLongPress: onLongPress,\n          onSecondaryTapUp: onSecondaryTapUp,\n          child: child,\n        ),\n      ],\n    );\n  }\n\n  Widget messageContent({\n    required BuildContext context,\n    required ThemeData theme,\n    required dynamic content,\n    required Color textColor,\n  }) {\n    try {\n      switch (msgTypeFromValue(item.msgType)) {\n        case MsgType.EN_MSG_TYPE_NOTIFY_MSG:\n          return msgTypeNotifyMsg_10(theme, content);\n        case MsgType.EN_MSG_TYPE_PICTURE_CARD:\n          return msgTypePictureCard_13(content);\n        case MsgType.EN_MSG_TYPE_TIP_MESSAGE:\n          return msgTypeTipMessage_18(theme, content);\n        case MsgType.EN_MSG_TYPE_TEXT:\n          return msgTypeText_1(theme, content: content, textColor: textColor);\n        case MsgType.EN_MSG_TYPE_PIC:\n          return msgTypePic_2(content);\n        case MsgType.EN_MSG_TYPE_SHARE_V2:\n          return msgTypeShareV2_7(content, textColor);\n        case MsgType.EN_MSG_TYPE_VIDEO_CARD:\n          return msgTypeVideoCard_11(theme, content, textColor);\n        case MsgType.EN_MSG_TYPE_ARTICLE_CARD:\n          return msgTypeArticleCard_12(content, textColor);\n        case MsgType.EN_MSG_TYPE_COMMON_SHARE_CARD:\n          return msgTypeCommonShareCard_14(content, textColor);\n        default:\n          if (item.msgType == 16) {\n            return msgType_16(theme, content, textColor);\n          }\n          return def(textColor);\n      }\n    } catch (err) {\n      return def(textColor, err: err);\n    }\n  }\n\n  Widget msgTypeCommonShareCard_14(dynamic content, Color textColor) {\n    if (content['source'] == '直播') {\n      return Column(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          GestureDetector(\n            onTap: () {\n              dynamic roomId = content['sourceID'];\n              if (roomId is String) {\n                roomId = int.parse(roomId);\n              }\n              PageUtils.toLiveRoom(roomId);\n            },\n            child: NetworkImgLayer(\n              width: 220,\n              height: 123.75,\n              src: content['cover'],\n            ),\n          ),\n          const SizedBox(height: 6),\n          Text(\n            content['title'] ?? \"\",\n            style: TextStyle(\n              letterSpacing: 0.6,\n              height: 1.5,\n              color: textColor,\n              fontWeight: FontWeight.bold,\n            ),\n          ),\n          const SizedBox(height: 1),\n          Text(\n            '${content['author']} · 直播',\n            style: TextStyle(\n              letterSpacing: 0.6,\n              height: 1.5,\n              color: textColor.withValues(alpha: 0.6),\n              fontSize: 12,\n            ),\n          ),\n        ],\n      );\n    } else {\n      return def(textColor);\n    }\n  }\n\n  Widget msgTypeArticleCard_12(dynamic content, Color textColor) {\n    return GestureDetector(\n      onTap: () => Get.toNamed(\n        '/articlePage',\n        parameters: {\n          'id': '${content['rid']}',\n          'type': \"read\",\n        },\n      ),\n      child: Column(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          Row(\n            children: [\n              for (final i in content['image_urls'])\n                NetworkImgLayer(\n                  width: 130,\n                  height: 73.125,\n                  src: i,\n                ),\n            ],\n          ),\n          const SizedBox(height: 6),\n          SelectableText(\n            content['title'] ?? \"\",\n            style: TextStyle(\n              letterSpacing: 0.6,\n              height: 1.5,\n              color: textColor,\n              fontWeight: FontWeight.bold,\n            ),\n          ),\n          if (content['summary'] != null && content['summary'] != '') ...[\n            const SizedBox(height: 1),\n            SelectableText(\n              scrollPhysics: const NeverScrollableScrollPhysics(),\n              content['summary'],\n              style: TextStyle(\n                letterSpacing: 0.6,\n                height: 1.5,\n                color: textColor.withValues(alpha: 0.6),\n                fontSize: 12,\n                overflow: TextOverflow.ellipsis,\n              ),\n              maxLines: 2,\n            ),\n          ],\n        ],\n      ),\n    );\n  }\n\n  Widget msgType_16(ThemeData theme, content, Color textColor) {\n    return Center(\n      child: Container(\n        constraints: const BoxConstraints(maxWidth: 400),\n        decoration: BoxDecoration(\n          color: theme.colorScheme.onInverseSurface,\n          borderRadius: const BorderRadius.all(Radius.circular(16)),\n        ),\n        padding: const EdgeInsets.all(12),\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.start,\n          spacing: 6,\n          children: [\n            Text(\n              content['main_title'],\n              style: TextStyle(\n                letterSpacing: 0.6,\n                height: 1.5,\n                color: textColor,\n                fontWeight: FontWeight.bold,\n              ),\n            ),\n            for (final i in content['sub_cards'])\n              GestureDetector(\n                onTap: () async {\n                  String? bvid = IdUtils.bvRegex\n                      .firstMatch(i['jump_url'])\n                      ?.group(0);\n                  if (bvid != null) {\n                    try {\n                      SmartDialog.showLoading();\n                      final int? cid = await SearchHttp.ab2c(bvid: bvid);\n                      SmartDialog.dismiss();\n                      if (cid != null) {\n                        PageUtils.toVideoPage(\n                          bvid: bvid,\n                          cid: cid,\n                          cover: i['cover_url'],\n                        );\n                      }\n                    } catch (err) {\n                      SmartDialog.dismiss();\n                      SmartDialog.showToast(err.toString());\n                    }\n                  } else {\n                    SmartDialog.showToast('未匹配到 BV 号');\n                    PageUtils.handleWebview(i['jump_url']);\n                  }\n                },\n                child: Row(\n                  spacing: 6,\n                  children: [\n                    NetworkImgLayer(\n                      width: 130,\n                      height: 73.125,\n                      src: i['cover_url'],\n                    ),\n                    Expanded(\n                      child: Column(\n                        crossAxisAlignment: CrossAxisAlignment.start,\n                        children: [\n                          Text(\n                            i['field1'],\n                            maxLines: 2,\n                            style: TextStyle(\n                              letterSpacing: 0.6,\n                              height: 1.5,\n                              color: textColor,\n                              fontWeight: FontWeight.bold,\n                            ),\n                          ),\n                          Text(\n                            i['field2'],\n                            style: TextStyle(\n                              letterSpacing: 0.6,\n                              height: 1.5,\n                              color: textColor.withValues(alpha: 0.6),\n                              fontSize: 12,\n                            ),\n                          ),\n                          Text(\n                            i['field3'],\n                            style: TextStyle(\n                              letterSpacing: 0.6,\n                              height: 1.5,\n                              color: textColor.withValues(alpha: 0.6),\n                              fontSize: 12,\n                            ),\n                          ),\n                        ],\n                      ),\n                    ),\n                  ],\n                ),\n              ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget msgTypeVideoCard_11(ThemeData theme, content, Color textColor) {\n    String? attachMsg;\n    try {\n      attachMsg = content['attach_msg']?['content'];\n    } catch (_) {}\n\n    return Center(\n      child: Container(\n        clipBehavior: Clip.hardEdge,\n        constraints: const BoxConstraints(maxWidth: 400.0),\n        decoration: BoxDecoration(\n          borderRadius: StyleString.mdRadius,\n          color: theme.colorScheme.onInverseSurface,\n        ),\n        child: LayoutBuilder(\n          builder: (_, constrains) {\n            return GestureDetector(\n              behavior: HitTestBehavior.opaque,\n              onTap: () async {\n                try {\n                  SmartDialog.showLoading();\n                  final bvid = content[\"bvid\"];\n                  final int? cid = await SearchHttp.ab2c(bvid: bvid);\n                  SmartDialog.dismiss();\n                  if (cid != null) {\n                    PageUtils.toVideoPage(\n                      bvid: bvid,\n                      cid: cid,\n                      cover: content['cover'],\n                    );\n                  }\n                } catch (err) {\n                  SmartDialog.dismiss();\n                  SmartDialog.showToast(err.toString());\n                }\n              },\n              child: Column(\n                crossAxisAlignment: CrossAxisAlignment.stretch,\n                children: [\n                  Stack(\n                    clipBehavior: Clip.none,\n                    children: [\n                      NetworkImgLayer(\n                        type: ImageType.emote,\n                        width: constrains.maxWidth,\n                        height:\n                            constrains.maxWidth / StyleString.aspectRatio16x9,\n                        src: content['cover'],\n                      ),\n                      PBadge(\n                        left: 6,\n                        bottom: 6,\n                        type: PBadgeType.gray,\n                        text: content['times'] == 0\n                            ? '--:--'\n                            : DurationUtils.formatDuration(content['times']),\n                      ),\n                    ],\n                  ),\n                  Padding(\n                    padding: const EdgeInsets.symmetric(\n                      horizontal: 12,\n                      vertical: 8,\n                    ),\n                    child: Text(\n                      content['times'] == 0 ? '内容已失效' : content['title'],\n                      style: TextStyle(\n                        letterSpacing: 0.6,\n                        height: 1.5,\n                        color: textColor,\n                        fontWeight: FontWeight.bold,\n                      ),\n                    ),\n                  ),\n                  if (attachMsg?.isNotEmpty ?? false)\n                    Container(\n                      margin: const .fromLTRB(12, 0, 12, 8),\n                      padding: const .symmetric(horizontal: 11, vertical: 3.5),\n                      decoration: BoxDecoration(\n                        color: theme.colorScheme.surface,\n                        borderRadius: const .all(.circular(6)),\n                      ),\n                      child: msgTypeText_1(\n                        theme,\n                        content: content['attach_msg'],\n                        textColor: textColor,\n                      ),\n                    ),\n                ],\n              ),\n            );\n          },\n        ),\n      ),\n    );\n  }\n\n  Widget msgTypeShareV2_7(dynamic content, Color textColor) {\n    String? type;\n    GestureTapCallback onTap;\n    switch (content['source']) {\n      // album\n      case 2:\n        type = '相簿';\n        onTap = () => PageUtils.pushDynFromId(rid: content['id']);\n        break;\n\n      // video\n      case 5:\n        type = '视频';\n        onTap = () async {\n          dynamic aid = content['id'];\n          if (aid is String) {\n            aid = int.tryParse(aid);\n          }\n          dynamic bvid = content[\"bvid\"];\n          if (aid == null && bvid == null) {\n            SmartDialog.showToast('null');\n          }\n          bvid ??= IdUtils.av2bv(aid);\n          SmartDialog.showLoading();\n          final int? cid = await SearchHttp.ab2c(bvid: bvid);\n          SmartDialog.dismiss();\n          if (cid != null) {\n            PageUtils.toVideoPage(\n              aid: aid,\n              bvid: bvid,\n              cid: cid,\n              cover: content['thumb'],\n            );\n          }\n        };\n        break;\n\n      // article\n      case 6:\n        type = '专栏';\n        onTap = () => Get.toNamed(\n          '/articlePage',\n          parameters: {\n            'id': '${content['id']}',\n            'type': 'read',\n          },\n        );\n        break;\n\n      // dynamic\n      case 11:\n        type = '动态';\n        onTap = () => PageUtils.pushDynFromId(id: content['id']);\n        break;\n\n      // pgc\n      case 16:\n        onTap = () => PageUtils.viewPgc(epId: content['id']);\n        break;\n\n      default:\n        onTap = () => SmartDialog.showToast(\n          'unsupported source type: ${content['source']}',\n        );\n    }\n    return Column(\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: [\n        GestureDetector(\n          onTap: onTap,\n          child: NetworkImgLayer(\n            width: 220,\n            height: 123.75,\n            src: content['thumb'],\n          ),\n        ),\n        const SizedBox(height: 6),\n        Text(\n          content['title'] ?? \"\",\n          style: TextStyle(\n            letterSpacing: 0.6,\n            height: 1.5,\n            color: textColor,\n            fontWeight: FontWeight.bold,\n          ),\n        ),\n        if (content['source'] == 6 &&\n            (content['headline'] as String?)?.isNotEmpty == true) ...[\n          const SizedBox(height: 1),\n          Text(\n            content['headline'],\n            style: TextStyle(\n              letterSpacing: 0.6,\n              height: 1.5,\n              color: textColor,\n              fontWeight: FontWeight.bold,\n            ),\n          ),\n        ],\n        if (content['author'] != null) ...[\n          const SizedBox(height: 1),\n          Text(\n            '${content['author']}${type != null ? ' · $type' : ''}',\n            style: TextStyle(\n              letterSpacing: 0.6,\n              height: 1.5,\n              color: textColor.withValues(alpha: 0.6),\n              fontSize: 12,\n            ),\n          ),\n        ],\n      ],\n    );\n  }\n\n  Widget msgTypePic_2(Map content) {\n    final url = content['url'];\n    final imgWidth = (content['width'] as num).toDouble();\n    final imgHeight = (content['height'] as num).toDouble();\n    final width = math.min(220.0, imgWidth);\n    final ratio = imgHeight / imgWidth;\n    Widget child = NetworkImgLayer(\n      width: width,\n      height: width * ratio,\n      src: url,\n    );\n    if (ratio <= StyleString.imgMaxRatio) {\n      child = fromHero(\n        tag: url,\n        child: child,\n      );\n    }\n    return GestureDetector(\n      onTap: () => PageUtils.imageView(imgList: [SourceModel(url: url)]),\n      child: child,\n    );\n  }\n\n  Widget msgTypeTipMessage_18(ThemeData theme, content) {\n    return Padding(\n      padding: const EdgeInsets.symmetric(vertical: 10),\n      child: Text(\n        jsonDecode(content['content']).map((e) => e['text']).join(\"\\n\"),\n        textAlign: TextAlign.center,\n        style: TextStyle(\n          height: 1.5,\n          letterSpacing: 0.6,\n          color: theme.colorScheme.outline.withValues(alpha: 0.8),\n        ),\n      ),\n    );\n  }\n\n  Widget msgTypeText_1(\n    ThemeData theme, {\n    required dynamic content,\n    required Color textColor,\n  }) {\n    final style = TextStyle(color: textColor, letterSpacing: 0.6, height: 1.5);\n    final List<InlineSpan> children = [];\n    late final Map<String, Map> emojiMap = {};\n    final List<String> patterns = [Constants.urlRegex.pattern];\n    if (eInfos != null) {\n      for (final e in eInfos!) {\n        emojiMap[e.text] ??= {\n          'url': e.hasGifUrl() ? e.gifUrl : e.url,\n          'size': e.size * 22.0,\n        };\n      }\n      patterns.addAll(emojiMap.keys.map(RegExp.escape));\n    }\n    final regex = RegExp(patterns.join('|'));\n    content['content'].splitMapJoin(\n      regex,\n      onMatch: (Match match) {\n        final matchStr = match[0]!;\n        if (matchStr.startsWith('[')) {\n          final emoji = emojiMap[matchStr];\n          if (emoji != null) {\n            final size = emoji['size'];\n            children.add(\n              WidgetSpan(\n                child: NetworkImgLayer(\n                  width: size,\n                  height: size,\n                  src: emoji['url'],\n                  type: ImageType.emote,\n                ),\n              ),\n            );\n          } else {\n            children.add(TextSpan(text: matchStr, style: style));\n          }\n        } else {\n          children.add(\n            TextSpan(\n              text: matchStr,\n              style: style.copyWith(color: theme.colorScheme.primary),\n              recognizer: NoDeadlineTapGestureRecognizer()\n                ..onTap = () => PiliScheme.routePushFromUrl(matchStr),\n            ),\n          );\n        }\n        return '';\n      },\n      onNonMatch: (String text) {\n        children.add(TextSpan(text: text, style: style));\n        return '';\n      },\n    );\n    return SelectableText.rich(TextSpan(children: children));\n  }\n\n  Widget msgTypeNotifyMsg_10(ThemeData theme, content) {\n    List? modules = content['modules'] as List?;\n    List<Widget>? jumpItem([String index = '']) {\n      final String? uri = content['jump_uri$index'];\n      if (uri != null && uri.isNotEmpty) {\n        final String? text = content['jump_text$index'];\n        return [\n          Divider(color: theme.colorScheme.primary.withValues(alpha: 0.05)),\n          GestureDetector(\n            behavior: HitTestBehavior.opaque,\n            onTap: () => PiliScheme.routePushFromUrl(uri),\n            child: Text(\n              text != null && text.isNotEmpty ? text : '查看详情',\n            ),\n          ),\n        ];\n      }\n      return null;\n    }\n\n    return Center(\n      child: Container(\n        constraints: const BoxConstraints(maxWidth: 400),\n        decoration: BoxDecoration(\n          color: theme.colorScheme.onInverseSurface,\n          borderRadius: const BorderRadius.all(Radius.circular(16)),\n        ),\n        padding: const EdgeInsets.all(12),\n        child: Column(\n          crossAxisAlignment: CrossAxisAlignment.stretch,\n          children: [\n            SelectableText(\n              content['title'],\n              style: theme.textTheme.titleMedium!.copyWith(\n                fontWeight: FontWeight.bold,\n              ),\n            ),\n            Divider(color: theme.colorScheme.primary.withValues(alpha: 0.05)),\n            if ((content['text'] as String?)?.isNotEmpty == true)\n              SelectableText(content['text']),\n            if (modules != null && modules.isNotEmpty) ...[\n              const SizedBox(height: 4),\n              ...modules.map(\n                (e) => Row(\n                  spacing: 10,\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    SizedBox(\n                      width: 80,\n                      child: Text(\n                        e['title'],\n                        style: TextStyle(color: theme.colorScheme.outline),\n                      ),\n                    ),\n                    Expanded(child: Text(e['detail'])),\n                  ],\n                ),\n              ),\n            ],\n            ...?jumpItem(),\n            ...?jumpItem('_2'),\n            ...?jumpItem('_3'),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget msgTypePictureCard_13(dynamic content) {\n    final String? url = content['jump_url'];\n    return LayoutBuilder(\n      builder: (context, constraints) {\n        final maxWidth = math.max(400.0, constraints.maxWidth);\n        Widget child = ClipRRect(\n          borderRadius: StyleString.mdRadius,\n          child: CachedNetworkImage(\n            width: maxWidth,\n            memCacheWidth: maxWidth.cacheSize(context),\n            imageUrl: ImageUtils.thumbnailUrl(content['pic_url']),\n            placeholder: (_, _) => const SizedBox.shrink(),\n          ),\n        );\n        if (url != null && url.isNotEmpty) {\n          child = GestureDetector(\n            onTap: () => PiliScheme.routePushFromUrl(url),\n            child: child,\n          );\n        }\n        return Align(\n          alignment: Alignment.topCenter,\n          child: SizedBox(\n            width: maxWidth,\n            child: child,\n          ),\n        );\n      },\n    );\n  }\n\n  Widget def(Color textColor, {err}) {\n    return Text(\n      '${item.content}${err != null ? '\\n\\ntype: ${msgTypeFromValue(item.msgType)}\\nerr: $err' : ''}',\n      style: TextStyle(\n        letterSpacing: 0.6,\n        height: 1.5,\n        color: textColor,\n        fontWeight: FontWeight.bold,\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/whisper_link_setting/controller.dart",
    "content": "import 'dart:async';\n\nimport 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/common/widgets/dialog/report_member.dart';\nimport 'package:PiliPlus/grpc/bilibili/app/im/v1.pb.dart';\nimport 'package:PiliPlus/grpc/im.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/msg.dart';\nimport 'package:PiliPlus/http/video.dart';\nimport 'package:PiliPlus/models_new/msg/im_user_infos/datum.dart';\nimport 'package:PiliPlus/models_new/msg/msg_dnd/uid_setting.dart';\nimport 'package:PiliPlus/models_new/msg/session_ss/data.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:fixnum/fixnum.dart';\nimport 'package:get/get.dart';\n\nclass WhisperLinkSettingController extends GetxController {\n  WhisperLinkSettingController({\n    required this.talkerUid,\n  });\n\n  final int talkerUid;\n  RxBool isPinned = false.obs;\n  late final sessionId = SessionId(\n    privateId: PrivateId(talkerUid: Int64(talkerUid)),\n  );\n\n  @override\n  void onInit() {\n    super.onInit();\n    getUserInfo();\n    getSessionSs();\n    getMsgDnd();\n    getIsPinned();\n  }\n\n  final Rx<LoadingState<List<ImUserInfosData>?>> userState =\n      LoadingState<List<ImUserInfosData>?>.loading().obs;\n  final Rx<LoadingState<SessionSsData>> sessionSs =\n      LoadingState<SessionSsData>.loading().obs;\n  final Rx<LoadingState<List<UidSetting>?>> msgDnd =\n      LoadingState<List<UidSetting>?>.loading().obs;\n\n  Future<void> getUserInfo() async {\n    userState.value = await MsgHttp.imUserInfos(uids: talkerUid.toString());\n  }\n\n  Future<void> getSessionSs() async {\n    sessionSs.value = await MsgHttp.getSessionSs(talkerUid: talkerUid);\n  }\n\n  Future<void> getMsgDnd() async {\n    msgDnd.value = await MsgHttp.getMsgDnd(uidsStr: talkerUid);\n  }\n\n  Future<void> getIsPinned() async {\n    final res = await ImGrpc.sessionUpdate(sessionId: sessionId);\n    if (res case Success(:final response)) {\n      isPinned.value = response.session.isPinned;\n    }\n  }\n\n  void setPush(bool isPush) {\n    if (isPush) {\n      showConfirmDialog(\n        context: Get.context!,\n        title: '确认关闭内容推送吗？',\n        content: '若关闭此开关，你将不再收到该账号的图文消息与稿件推送，但通知类消息不受影响',\n        onConfirm: () => _setPush(isPush),\n      );\n      return;\n    }\n    _setPush(isPush);\n  }\n\n  Future<void> _setPush(bool isPush) async {\n    int setting = isPush ? 1 : 0;\n    final res = await MsgHttp.setPushSs(\n      setting: setting,\n      talkerUid: talkerUid,\n    );\n    if (res.isSuccess) {\n      sessionSs\n        ..value.data.pushSetting = setting\n        ..refresh();\n    } else {\n      res.toast();\n    }\n  }\n\n  Future<void> setPin() async {\n    final res = isPinned.value\n        ? await ImGrpc.unpinSession(sessionId: sessionId)\n        : await ImGrpc.pinSession(sessionId: sessionId);\n    if (res.isSuccess) {\n      isPinned.value = !isPinned.value;\n    } else {\n      res.toast();\n    }\n  }\n\n  Future<void> setMute(bool isMuted) async {\n    int setting = isMuted ? 0 : 1;\n    final res = await MsgHttp.setMsgDnd(\n      uid: Accounts.main.mid,\n      setting: setting,\n      dndUid: talkerUid,\n    );\n    if (res.isSuccess) {\n      msgDnd\n        ..value.data!.first.setting = setting\n        ..refresh();\n    } else {\n      res.toast();\n    }\n  }\n\n  Future<void> setBlock(bool isBlocked) async {\n    if (isBlocked) {\n      final res = await VideoHttp.relationMod(\n        mid: talkerUid,\n        act: 6,\n        reSrc: 11,\n      );\n      if (res.isSuccess) {\n        sessionSs\n          ..value.data.followStatus = null\n          ..refresh();\n      } else {\n        res.toast();\n      }\n    } else {\n      showConfirmDialog(\n        context: Get.context!,\n        title: '确认拉黑该用户',\n        content: '加入黑名单后，将自动解除关注关系和对该用户的合集订阅关系，禁止该用户与我互动或查看我的空间',\n        onConfirm: () async {\n          final res = await VideoHttp.relationMod(\n            mid: talkerUid,\n            act: 5,\n            reSrc: 11,\n          );\n          if (res.isSuccess) {\n            sessionSs\n              ..value.data.followStatus = 128\n              ..refresh();\n          } else {\n            res.toast();\n          }\n        },\n      );\n    }\n  }\n\n  void report() => showMemberReportDialog(\n    Get.context!,\n    name: userState.value.dataOrNull?.firstOrNull?.name,\n    mid: talkerUid,\n  );\n}\n"
  },
  {
    "path": "lib/pages/whisper_link_setting/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/pendant_avatar.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models_new/msg/im_user_infos/datum.dart';\nimport 'package:PiliPlus/models_new/msg/msg_dnd/uid_setting.dart';\nimport 'package:PiliPlus/models_new/msg/session_ss/data.dart';\nimport 'package:PiliPlus/pages/whisper_link_setting/controller.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass WhisperLinkSettingPage extends StatefulWidget {\n  const WhisperLinkSettingPage({\n    super.key,\n    required this.talkerUid,\n  });\n\n  final int talkerUid;\n\n  @override\n  State<WhisperLinkSettingPage> createState() => _WhisperLinkSettingPageState();\n}\n\nclass _WhisperLinkSettingPageState extends State<WhisperLinkSettingPage> {\n  late final WhisperLinkSettingController _controller;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = Get.put(\n      WhisperLinkSettingController(talkerUid: widget.talkerUid),\n      tag: Utils.generateRandomString(8),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final ThemeData theme = Theme.of(context);\n    final divider = Divider(\n      height: 12,\n      thickness: 12,\n      color: theme.colorScheme.outline.withValues(alpha: 0.1),\n    );\n    final divider2 = Divider(\n      height: 1,\n      indent: 16,\n      color: theme.colorScheme.outline.withValues(alpha: 0.1),\n    );\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(title: const Text('聊天设置')),\n      body: ListView(\n        padding: EdgeInsets.only(\n          bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n        ),\n        children: [\n          divider,\n          Obx(\n            () => _buildUserInfo(theme, divider, _controller.userState.value),\n          ),\n          Obx(\n            () => _buildSessionSs(\n              theme,\n              divider,\n              divider2,\n              _controller.sessionSs.value,\n            ),\n          ),\n          Obx(\n            () {\n              if (_controller.sessionSs.value case Success(:final response)) {\n                return _buildBlockItem(response.followStatus == 128);\n              }\n              return const SizedBox.shrink();\n            },\n          ),\n          divider2,\n          ListTile(\n            dense: true,\n            onTap: _controller.report,\n            title: const Text('举报', style: TextStyle(fontSize: 14)),\n            trailing: Icon(\n              Icons.keyboard_arrow_right,\n              color: theme.colorScheme.outline,\n            ),\n          ),\n          divider,\n        ],\n      ),\n    );\n  }\n\n  Widget _buildBlockItem(bool isBlocked) {\n    return ListTile(\n      dense: true,\n      onTap: () => _controller.setBlock(isBlocked),\n      title: const Text('加入黑名单', style: TextStyle(fontSize: 14)),\n      trailing: Transform.scale(\n        alignment: Alignment.centerRight,\n        scale: 0.8,\n        child: Switch(\n          value: isBlocked,\n          onChanged: (value) => _controller.setBlock(isBlocked),\n        ),\n      ),\n    );\n  }\n\n  Widget _buildUserInfo(\n    ThemeData theme,\n    Widget divider,\n    LoadingState<List<ImUserInfosData>?> loadingState,\n  ) {\n    return switch (loadingState) {\n      Loading() => const SizedBox.shrink(),\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? Column(\n                mainAxisSize: MainAxisSize.min,\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: [\n                  Builder(\n                    builder: (context) {\n                      final ImUserInfosData item = response.first;\n                      return ListTile(\n                        onTap: () => Get.toNamed('/member?mid=${item.mid}'),\n                        leading: PendantAvatar(\n                          avatar: item.face,\n                          size: 42,\n                          badgeSize: 14,\n                          isVip:\n                              item.vip?.status != null && item.vip!.status > 0,\n                          garbPendantImage: item.pendant?.image,\n                          officialType: item.official?.type,\n                        ),\n                        title: Text(\n                          item.name!,\n                          style: TextStyle(\n                            fontSize: 14,\n                            color:\n                                item.vip?.status != null &&\n                                    item.vip!.status > 0 &&\n                                    item.vip?.type == 2\n                                ? theme.colorScheme.vipColor\n                                : null,\n                          ),\n                        ),\n                        subtitle: Text(\n                          'UID: ${item.mid}${item.sign?.isNotEmpty == true ? '\\n${item.sign}' : ''}',\n                          maxLines: 2,\n                          overflow: TextOverflow.ellipsis,\n                          style: TextStyle(\n                            fontSize: 13,\n                            color: theme.colorScheme.outline,\n                          ),\n                        ),\n                        trailing: Icon(\n                          size: 22,\n                          Icons.keyboard_arrow_right,\n                          color: theme.colorScheme.outline,\n                        ),\n                      );\n                    },\n                  ),\n                  divider,\n                ],\n              )\n            : const SizedBox.shrink(),\n      Error(:final errMsg) => _errWidget(errMsg, _controller.getUserInfo),\n    };\n  }\n\n  Widget _buildSessionSs(\n    ThemeData theme,\n    Widget divider,\n    Widget divider2,\n    LoadingState<SessionSsData> loadingState,\n  ) {\n    return switch (loadingState) {\n      Loading() => const SizedBox.shrink(),\n      Success(:final response) => Builder(\n        builder: (context) {\n          late final subTitleS = TextStyle(\n            fontSize: 13,\n            color: theme.colorScheme.outline,\n          );\n          return Column(\n            mainAxisSize: MainAxisSize.min,\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              if (response.showPushSetting == 1)\n                ListTile(\n                  dense: true,\n                  onTap: () => _controller.setPush(response.pushSetting == 0),\n                  title: const Text('接收消息推送', style: TextStyle(fontSize: 14)),\n                  subtitle: Text(\n                    '若关闭此开关，你将不再收到该账号的图文消息与稿件推送，但通知类消息不受影响',\n                    style: subTitleS,\n                  ),\n                  trailing: Transform.scale(\n                    alignment: Alignment.centerRight,\n                    scale: 0.8,\n                    child: Switch(\n                      value: response.pushSetting == 0,\n                      onChanged: (value) =>\n                          _controller.setPush(response.pushSetting == 0),\n                    ),\n                  ),\n                ),\n              divider2,\n              Obx(\n                () => ListTile(\n                  dense: true,\n                  onTap: _controller.setPin,\n                  title: const Text('置顶聊天', style: TextStyle(fontSize: 14)),\n                  trailing: Transform.scale(\n                    alignment: Alignment.centerRight,\n                    scale: 0.8,\n                    child: Switch(\n                      value: _controller.isPinned.value,\n                      onChanged: (value) => _controller.setPin(),\n                    ),\n                  ),\n                ),\n              ),\n              divider2,\n              Obx(() => _buildMuteItem(_controller.msgDnd.value)),\n              divider,\n            ],\n          );\n        },\n      ),\n      Error(:final errMsg) => _errWidget(errMsg, _controller.getSessionSs),\n    };\n  }\n\n  Widget _buildMuteItem(LoadingState<List<UidSetting>?> loadingState) {\n    return switch (loadingState) {\n      Loading() => const SizedBox.shrink(),\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? ListTile(\n                dense: true,\n                onTap: () => _controller.setMute(response.first.setting == 1),\n                title: const Text('消息免打扰', style: TextStyle(fontSize: 14)),\n                trailing: Transform.scale(\n                  alignment: Alignment.centerRight,\n                  scale: 0.8,\n                  child: Switch(\n                    value: response.first.setting == 1,\n                    onChanged: (value) =>\n                        _controller.setMute(response.first.setting == 1),\n                  ),\n                ),\n              )\n            : const SizedBox.shrink(),\n      Error(:final errMsg) => _errWidget(errMsg, _controller.getMsgDnd),\n    };\n  }\n\n  Widget _errWidget(String? errMsg, VoidCallback onTap) {\n    return GestureDetector(\n      behavior: HitTestBehavior.opaque,\n      onTap: onTap,\n      child: Container(\n        alignment: Alignment.center,\n        padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),\n        child: Text(\n          errMsg ?? '',\n          textAlign: TextAlign.center,\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/pages/whisper_secondary/controller.dart",
    "content": "import 'package:PiliPlus/grpc/bilibili/app/im/v1.pb.dart'\n    show Offset, Session, SessionPageType, SessionSecondaryReply, ThreeDotItem;\nimport 'package:PiliPlus/grpc/im.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/pages/common/common_whisper_controller.dart';\nimport 'package:get/get.dart';\nimport 'package:protobuf/protobuf.dart' show PbMap;\n\nclass WhisperSecController\n    extends CommonWhisperController<SessionSecondaryReply> {\n  WhisperSecController({\n    required this.sessionPageType,\n  });\n\n  PbMap<int, Offset>? offset;\n  @override\n  final SessionPageType sessionPageType;\n  Rx<List<ThreeDotItem>?> threeDotItems = Rx<List<ThreeDotItem>?>(null);\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  Future<void> onRefresh() {\n    offset = null;\n    return super.onRefresh();\n  }\n\n  @override\n  List<Session>? getDataList(SessionSecondaryReply response) {\n    if (!response.paginationParams.hasMore) {\n      isEnd = true;\n    }\n    offset = response.paginationParams.offsets;\n\n    return response.sessions;\n  }\n\n  @override\n  bool customHandleResponse(\n    bool isRefresh,\n    Success<SessionSecondaryReply> response,\n  ) {\n    if (isRefresh) {\n      threeDotItems.value = response.response.threeDotItems;\n    }\n    return false;\n  }\n\n  @override\n  Future<LoadingState<SessionSecondaryReply>> customGetData() =>\n      ImGrpc.sessionSecondary(\n        offset: offset,\n        pageType: sessionPageType,\n      );\n}\n"
  },
  {
    "path": "lib/pages/whisper_secondary/view.dart",
    "content": "import 'package:PiliPlus/common/skeleton/whisper_item.dart';\nimport 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';\nimport 'package:PiliPlus/grpc/bilibili/app/im/v1.pb.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/pages/whisper/widgets/item.dart';\nimport 'package:PiliPlus/pages/whisper_secondary/controller.dart';\nimport 'package:PiliPlus/utils/extension/three_dot_ext.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass WhisperSecPage extends StatefulWidget {\n  const WhisperSecPage({\n    super.key,\n    required this.name,\n    required this.sessionPageType,\n  });\n\n  final String name;\n  final SessionPageType sessionPageType;\n\n  @override\n  State<WhisperSecPage> createState() => _WhisperSecPageState();\n}\n\nclass _WhisperSecPageState extends State<WhisperSecPage> {\n  late final WhisperSecController _controller;\n\n  @override\n  void initState() {\n    super.initState();\n    _controller = Get.put(\n      WhisperSecController(sessionPageType: widget.sessionPageType),\n      tag: widget.sessionPageType.name,\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        title: Text(widget.name),\n        actions: [\n          Obx(() {\n            final threeDotItems = _controller.threeDotItems.value;\n            if (threeDotItems != null && threeDotItems.isNotEmpty) {\n              return PopupMenuButton(\n                itemBuilder: (context) {\n                  return threeDotItems\n                      .map(\n                        (e) => PopupMenuItem(\n                          onTap: () => e.type.action(\n                            context: context,\n                            controller: _controller,\n                            item: e,\n                          ),\n                          child: Row(\n                            children: [\n                              e.type.icon,\n                              Text('  ${e.title}'),\n                            ],\n                          ),\n                        ),\n                      )\n                      .toList();\n                },\n              );\n            }\n            return const SizedBox.shrink();\n          }),\n        ],\n      ),\n      body: refreshIndicator(\n        onRefresh: _controller.onRefresh,\n        child: CustomScrollView(\n          physics: const AlwaysScrollableScrollPhysics(),\n          slivers: [\n            SliverPadding(\n              padding: EdgeInsets.only(\n                bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n              ),\n              sliver: Obx(() => _buildBody(_controller.loadingState.value)),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget _buildBody(LoadingState<List<Session>?> loadingState) {\n    late final divider = Divider(\n      indent: 72,\n      endIndent: 20,\n      height: 1,\n      color: Colors.grey.withValues(alpha: 0.1),\n    );\n    return switch (loadingState) {\n      Loading() => SliverList.builder(\n        itemCount: 12,\n        itemBuilder: (context, index) => const WhisperItemSkeleton(),\n      ),\n      Success(:final response) =>\n        response != null && response.isNotEmpty\n            ? SliverList.separated(\n                itemCount: response.length,\n                itemBuilder: (context, index) {\n                  if (index == response.length - 1) {\n                    _controller.onLoadMore();\n                  }\n                  final item = response[index];\n                  return WhisperSessionItem(\n                    item: item,\n                    onSetTop: (isTop, talkerId) =>\n                        _controller.onSetTop(item, index, isTop, talkerId),\n                    onSetMute: (isMuted, talkerUid) =>\n                        _controller.onSetMute(item, isMuted, talkerUid),\n                    onRemove: (talkerId) =>\n                        _controller.onRemove(index, talkerId),\n                  );\n                },\n                separatorBuilder: (context, index) => divider,\n              )\n            : HttpError(onReload: _controller.onReload),\n      Error(:final errMsg) => HttpError(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/whisper_settings/controller.dart",
    "content": "import 'package:PiliPlus/grpc/bilibili/app/im/v1.pb.dart'\n    show GetImSettingsReply, IMSettingType, Setting;\nimport 'package:PiliPlus/grpc/im.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/pages/common/common_data_controller.dart';\nimport 'package:get/get.dart';\nimport 'package:protobuf/protobuf.dart' show PbMap;\n\nclass WhisperSettingsController\n    extends CommonDataController<GetImSettingsReply, PbMap<int, Setting>> {\n  WhisperSettingsController({\n    required this.imSettingType,\n  });\n\n  final IMSettingType imSettingType;\n\n  final RxString title = ''.obs;\n\n  @override\n  void onInit() {\n    super.onInit();\n    queryData();\n  }\n\n  @override\n  bool customHandleResponse(\n    bool isRefresh,\n    Success<GetImSettingsReply> response,\n  ) {\n    title.value = response.response.pageTitle;\n    loadingState.value = Success(response.response.settings);\n    return true;\n  }\n\n  @override\n  Future<LoadingState<GetImSettingsReply>> customGetData() =>\n      ImGrpc.getImSettings(type: imSettingType);\n\n  Future<bool> onSet(Map<int, Setting> settings) async {\n    final res = await ImGrpc.setImSettings(settings: settings);\n    if (!res.isSuccess) {\n      res.toast();\n      return false;\n    }\n    return true;\n  }\n}\n"
  },
  {
    "path": "lib/pages/whisper_settings/view.dart",
    "content": "import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';\nimport 'package:PiliPlus/grpc/bilibili/app/im/v1.pb.dart'\n    show IMSettingType, Setting;\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/pages/whisper_block/view.dart';\nimport 'package:PiliPlus/pages/whisper_settings/controller.dart';\nimport 'package:PiliPlus/pages/whisper_settings/widgets/item.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:protobuf/protobuf.dart' show PbMap;\n\nclass WhisperSettingsPage extends StatefulWidget {\n  const WhisperSettingsPage({\n    super.key,\n    required this.imSettingType,\n    this.onUpdate,\n  });\n\n  final IMSettingType imSettingType;\n  final ValueChanged<Map<int, Setting>>? onUpdate;\n\n  @override\n  State<WhisperSettingsPage> createState() => _WhisperSettingsPageState();\n}\n\nclass _WhisperSettingsPageState extends State<WhisperSettingsPage> {\n  late final WhisperSettingsController _controller;\n  @override\n  void initState() {\n    super.initState();\n    _controller = Get.put(\n      WhisperSettingsController(imSettingType: widget.imSettingType),\n      tag: widget.imSettingType.name,\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final ThemeData theme = Theme.of(context);\n    return Scaffold(\n      resizeToAvoidBottomInset: false,\n      appBar: AppBar(\n        title: Obx(() => Text(_controller.title.value)),\n      ),\n      body: Obx(() => _buildBody(theme, _controller.loadingState.value)),\n    );\n  }\n\n  Future<bool> onSet(\n    int key,\n    PbMap<int, Setting> response,\n    Setting item,\n  ) async {\n    final settings = {key: item};\n    final res = await _controller.onSet(settings);\n    if (res) {\n      widget.onUpdate?.call(settings);\n    }\n    return res;\n  }\n\n  void onRedirect(\n    ThemeData theme,\n    int key,\n    PbMap<int, Setting> response,\n    Setting item,\n  ) {\n    if (item.redirect.settingPage.hasParentSettingType()) {\n      Get.to(\n        WhisperSettingsPage(\n          imSettingType: item.redirect.settingPage.parentSettingType,\n          onUpdate: (value) {\n            _controller.loadingState\n              ..value.data[key]?.redirect.settingPage.subSettings.addAll(value)\n              ..refresh();\n          },\n        ),\n        preventDuplicates: false,\n      );\n    } else if (item.redirect.hasWindowSelect()) {\n      String? selected;\n      showDialog(\n        context: context,\n        builder: (context) => AlertDialog(\n          clipBehavior: Clip.hardEdge,\n          contentPadding: const EdgeInsets.symmetric(vertical: 12),\n          content: Column(\n            mainAxisSize: MainAxisSize.min,\n            children: item.redirect.windowSelect.item.map(\n              (e) {\n                if (e.selected) {\n                  selected ??= e.text;\n                }\n                return ListTile(\n                  dense: true,\n                  onTap: () async {\n                    if (!e.selected) {\n                      Get.back();\n                      for (final j in item.redirect.windowSelect.item) {\n                        j.selected = false;\n                      }\n                      item.redirect.selectedSummary = e.text;\n                      e.selected = true;\n                      _controller.loadingState.refresh();\n                      final settings = {key: item};\n                      final res = await _controller.onSet(settings);\n                      if (!res) {\n                        for (final j in item.redirect.windowSelect.item) {\n                          j.selected = j.text == selected;\n                        }\n                        item.redirect.selectedSummary = selected!;\n                        _controller.loadingState.refresh();\n                      }\n                    }\n                  },\n                  title: Text(\n                    e.text,\n                    style: TextStyle(\n                      fontSize: 14,\n                      color: e.selected ? theme.colorScheme.primary : null,\n                    ),\n                  ),\n                );\n              },\n            ).toList(),\n          ),\n        ),\n      );\n    } else if (item.redirect.otherPage.hasUrl()) {\n      if (item.redirect.title == '黑名单') {\n        Get.toNamed('/blackListPage');\n      } else if (item.redirect.otherPage.url.startsWith('http')) {\n        Get.toNamed(\n          '/webview',\n          parameters: {'url': item.redirect.otherPage.url},\n        );\n      } else {\n        SmartDialog.showToast(item.redirect.otherPage.url);\n      }\n    } else if (item.redirect.settingPage.hasUrl()) {\n      if (item.redirect.title == '消息屏蔽词') {\n        Get.to(const WhisperBlockPage());\n      } else if (item.redirect.settingPage.url.startsWith('http')) {\n        Get.toNamed(\n          '/webview',\n          parameters: {'url': item.redirect.settingPage.url},\n        );\n      } else {\n        SmartDialog.showToast(item.redirect.settingPage.url);\n      }\n    }\n  }\n\n  Widget _buildBody(\n    ThemeData theme,\n    LoadingState<PbMap<int, Setting>> loadingState,\n  ) {\n    late final divider = Divider(\n      height: 1,\n      color: theme.colorScheme.outline.withValues(alpha: 0.1),\n    );\n    return switch (loadingState) {\n      Loading() => const SizedBox.shrink(),\n      Success<PbMap<int, Setting>>(:final response) => Builder(\n        builder: (context) {\n          final keys = response.keys.toList()..sort();\n          return ListView.separated(\n            padding: EdgeInsets.only(\n              bottom: MediaQuery.viewPaddingOf(context).bottom + 100,\n            ),\n            itemCount: keys.length,\n            itemBuilder: (context, index) {\n              final key = keys[index];\n              final item = response[key]!;\n              return ImSettingsItem(\n                item: item,\n                onSet: () => onSet(key, response, item),\n                onRedirect: () => onRedirect(theme, key, response, item),\n              );\n            },\n            separatorBuilder: (context, index) => divider,\n          );\n        },\n      ),\n      Error(:final errMsg) => scrollErrorWidget(\n        errMsg: errMsg,\n        onReload: _controller.onReload,\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/pages/whisper_settings/widgets/item.dart",
    "content": "import 'dart:math';\n\nimport 'package:PiliPlus/grpc/bilibili/app/im/v1.pb.dart'\n    show SelectItem, Setting, SettingSwitch;\nimport 'package:flutter/material.dart';\n\nclass ImSettingsItem extends StatelessWidget {\n  const ImSettingsItem({\n    super.key,\n    required this.item,\n    required this.onSet,\n    required this.onRedirect,\n  });\n\n  final Setting item;\n  final Future<bool> Function() onSet;\n  final VoidCallback onRedirect;\n\n  @override\n  Widget build(BuildContext context) {\n    void rebuild() {\n      if (context.mounted) {\n        (context as Element).markNeedsBuild();\n      }\n    }\n\n    const titleStyle = TextStyle(fontSize: 14);\n    final theme = Theme.of(context);\n    final outline = theme.colorScheme.outline;\n    final subtitleStyle = TextStyle(fontSize: 13, color: outline);\n\n    if (item.hasSwitch_1()) {\n      Future<void> onChanged() async {\n        item.switch_1.switchOn = !item.switch_1.switchOn;\n        rebuild();\n        if (!await onSet()) {\n          item.switch_1.switchOn = !item.switch_1.switchOn;\n          rebuild();\n        }\n      }\n\n      return ListTile(\n        dense: true,\n        onTap: onChanged,\n        title: Text(\n          item.switch_1.title,\n          style: titleStyle,\n        ),\n        subtitle: item.switch_1.hasSubtitle()\n            ? Text(item.switch_1.subtitle, style: subtitleStyle)\n            : null,\n        trailing: Transform.scale(\n          alignment: Alignment.centerRight,\n          scale: 0.8,\n          child: Switch(\n            value: item.switch_1.switchOn,\n            onChanged: (value) => onChanged(),\n          ),\n        ),\n      );\n    }\n\n    if (item.hasRedirect()) {\n      SelectItem? selected;\n      SettingSwitch? sw1tch;\n      if (item.redirect.settingPage.subSettings.isNotEmpty) {\n        for (final subItem in item.redirect.settingPage.subSettings.values) {\n          if (subItem.hasSelect()) {\n            for (final i in subItem.select.item) {\n              if (i.selected) {\n                selected = i;\n                break;\n              }\n            }\n          } else if (subItem.hasSwitch_1()) {\n            if (subItem.switch_1.switchOn) {\n              sw1tch = subItem.switch_1;\n              break;\n            }\n          }\n        }\n      }\n      return ListTile(\n        dense: true,\n        onTap: onRedirect,\n        title: Text(\n          item.redirect.title,\n          style: titleStyle,\n        ),\n        subtitle: item.redirect.hasSubtitle()\n            ? Text(item.redirect.subtitle, style: subtitleStyle)\n            : null,\n        trailing: Row(\n          mainAxisSize: MainAxisSize.min,\n          children: [\n            if (selected != null)\n              Text(\n                selected.text,\n                style: TextStyle(fontSize: 13, color: outline),\n              )\n            else if (sw1tch != null)\n              Text(\n                sw1tch.title,\n                style: TextStyle(fontSize: 13, color: outline),\n              )\n            else if (item.redirect.hasSelectedSummary())\n              Text(\n                item.redirect.selectedSummary,\n                style: TextStyle(fontSize: 13, color: outline),\n              ),\n            Icon(color: outline, Icons.keyboard_arrow_right),\n          ],\n        ),\n      );\n    }\n\n    if (item.hasSelect()) {\n      String? selected;\n      late final divider = Divider(\n        height: 1,\n        indent: 16,\n        color: outline.withValues(alpha: 0.1),\n      );\n      return Column(\n        mainAxisSize: MainAxisSize.min,\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: List.generate(\n          max(0, item.select.item.length * 2 - 1),\n          (index) {\n            if (index.isOdd) {\n              return divider;\n            }\n            final e = item.select.item[index ~/ 2];\n            if (e.selected) {\n              selected ??= e.text;\n            }\n            return ListTile(\n              dense: true,\n              onTap: () async {\n                if (!e.selected) {\n                  for (final i in item.select.item) {\n                    i.selected = false;\n                  }\n                  e.selected = true;\n                  rebuild();\n\n                  if (await onSet()) {\n                    selected = e.text;\n                  } else {\n                    for (final i in item.select.item) {\n                      i.selected = i.text == selected;\n                    }\n                    rebuild();\n                  }\n                }\n              },\n              title: Text(e.text, style: titleStyle),\n              trailing: e.selected\n                  ? Icon(\n                      size: 20,\n                      Icons.check,\n                      color: theme.colorScheme.primary,\n                    )\n                  : null,\n            );\n          },\n        ),\n      );\n    }\n\n    return const SizedBox.shrink();\n  }\n}\n"
  },
  {
    "path": "lib/plugin/pl_player/controller.dart",
    "content": "import 'dart:async' show StreamSubscription, Timer;\nimport 'dart:convert' show ascii;\nimport 'dart:io' show Platform;\nimport 'dart:math' show max, min;\nimport 'dart:ui' as ui;\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/http/browser_ua.dart';\nimport 'package:PiliPlus/http/constants.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/video.dart';\nimport 'package:PiliPlus/models/common/account_type.dart';\nimport 'package:PiliPlus/models/common/audio_normalization.dart';\nimport 'package:PiliPlus/models/common/super_resolution_type.dart';\nimport 'package:PiliPlus/models/common/video/video_type.dart';\nimport 'package:PiliPlus/models/user/danmaku_rule.dart';\nimport 'package:PiliPlus/models/video/play/url.dart';\nimport 'package:PiliPlus/models_new/video/video_shot/data.dart';\nimport 'package:PiliPlus/pages/danmaku/danmaku_model.dart';\nimport 'package:PiliPlus/pages/mine/controller.dart';\nimport 'package:PiliPlus/pages/sponsor_block/block_mixin.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/data_source.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/data_status.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/double_tap_type.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/duration.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/fullscreen_mode.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/heart_beat_type.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/play_repeat.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/play_status.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/video_fit_type.dart';\nimport 'package:PiliPlus/plugin/pl_player/utils/fullscreen.dart';\nimport 'package:PiliPlus/services/service_locator.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/asset_utils.dart';\nimport 'package:PiliPlus/utils/extension/box_ext.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/feed_back.dart';\nimport 'package:PiliPlus/utils/image_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/path_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:archive/archive.dart' show getCrc32;\nimport 'package:canvas_danmaku/canvas_danmaku.dart';\nimport 'package:easy_debounce/easy_throttle.dart';\nimport 'package:floating/floating.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart' show HapticFeedback;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:flutter_volume_controller/flutter_volume_controller.dart';\nimport 'package:get/get.dart';\nimport 'package:hive_ce/hive.dart';\nimport 'package:media_kit/media_kit.dart';\nimport 'package:media_kit_video/media_kit_video.dart';\nimport 'package:path/path.dart' as path;\nimport 'package:wakelock_plus/wakelock_plus.dart';\nimport 'package:window_manager/window_manager.dart';\n\ntypedef PlayCallback = Future<void>? Function();\n\nclass PlPlayerController with BlockConfigMixin {\n  Player? _videoPlayerController;\n  VideoController? _videoController;\n\n  // 添加一个私有静态变量来保存实例\n  static PlPlayerController? _instance;\n\n  // 流事件  监听播放状态变化\n  // StreamSubscription? _playerEventSubs;\n\n  /// [playerStatus] has a [status] observable\n  final playerStatus = PlPlayerStatus(PlayerStatus.playing);\n\n  ///\n  final Rx<DataStatus> dataStatus = Rx(DataStatus.none);\n\n  // bool controlsEnabled = false;\n\n  /// 响应数据\n  /// 带有Seconds的变量只在秒数更新时更新，以避免频繁触发重绘\n  // 播放位置\n  Duration position = Duration.zero;\n  final RxInt positionSeconds = 0.obs;\n\n  /// 进度条位置\n  Duration sliderPosition = Duration.zero;\n  final RxInt sliderPositionSeconds = 0.obs;\n  // 展示使用\n  final Rx<Duration> sliderTempPosition = Rx(Duration.zero);\n\n  /// 视频时长\n  final Rx<Duration> duration = Rx(Duration.zero);\n\n  /// 视频缓冲\n  final Rx<Duration> buffered = Rx(Duration.zero);\n  final RxInt bufferedSeconds = 0.obs;\n\n  int _playerCount = 0;\n\n  late double lastPlaybackSpeed = 1.0;\n  final RxDouble _playbackSpeed = Pref.playSpeedDefault.obs;\n  late final RxDouble _longPressSpeed = Pref.longPressSpeedDefault.obs;\n\n  /// 音量控制条\n  final RxDouble volume = RxDouble(\n    PlatformUtils.isDesktop ? Pref.desktopVolume : 1.0,\n  );\n  final setSystemBrightness = Pref.setSystemBrightness;\n\n  /// 亮度控制条\n  final RxDouble brightness = (-1.0).obs;\n\n  /// 是否展示控制条\n  final RxBool showControls = false.obs;\n\n  /// 亮度控制条展示/隐藏\n  final RxBool showBrightnessStatus = false.obs;\n\n  /// 是否长按倍速\n  final RxBool longPressStatus = false.obs;\n\n  /// 屏幕锁 为true时，关闭控制栏\n  final RxBool controlsLock = false.obs;\n\n  /// 全屏状态\n  final RxBool isFullScreen = false.obs;\n  // 默认投稿视频格式\n  bool isLive = false;\n\n  bool _isVertical = false;\n\n  /// 视频比例\n  final Rx<VideoFitType> videoFit = Rx(VideoFitType.contain);\n\n  /// 后台播放\n  late final RxBool continuePlayInBackground =\n      Pref.continuePlayInBackground.obs;\n\n  ///\n  final RxBool isSliderMoving = false.obs;\n\n  bool _autoPlay = false;\n\n  // 记录历史记录\n  int? _aid;\n  String? _bvid;\n  int? cid;\n  int? _epid;\n  int? _seasonId;\n  int? _pgcType;\n  VideoType _videoType = VideoType.ugc;\n  int _heartDuration = 0;\n  int? width;\n  int? height;\n\n  late final tryLook = !Accounts.get(AccountType.video).isLogin && Pref.p1080;\n\n  late DataSource dataSource;\n\n  Timer? _timer;\n  StreamSubscription<Duration>? _subForSeek;\n\n  Box setting = GStorage.setting;\n\n  // final Durations durations;\n\n  String get bvid => _bvid!;\n\n  /// 视频播放速度\n  double get playbackSpeed => _playbackSpeed.value;\n\n  // 长按倍速\n  double get longPressSpeed => _longPressSpeed.value;\n\n  /// [videoPlayerController] instance of Player\n  Player? get videoPlayerController => _videoPlayerController;\n\n  /// [videoController] instance of Player\n  VideoController? get videoController => _videoController;\n\n  bool isMuted = false;\n\n  /// 听视频\n  late final RxBool onlyPlayAudio = false.obs;\n\n  /// 镜像\n  late final RxBool flipX = false.obs;\n\n  late final RxBool flipY = false.obs;\n\n  final RxBool isBuffering = true.obs;\n\n  /// 全屏方向\n  bool get isVertical => _isVertical;\n\n  /// 弹幕开关\n  late final RxBool _enableShowDanmaku = Pref.enableShowDanmaku.obs;\n  late final RxBool _enableShowLiveDanmaku = Pref.enableShowLiveDanmaku.obs;\n  RxBool get enableShowDanmaku =>\n      isLive ? _enableShowLiveDanmaku : _enableShowDanmaku;\n\n  late final bool autoPiP = Pref.autoPiP;\n  bool get isPipMode =>\n      (Platform.isAndroid && Floating().isPipMode) ||\n      (PlatformUtils.isDesktop && isDesktopPip);\n  late bool isDesktopPip = false;\n  late Rect _lastWindowBounds;\n\n  late final showWindowTitleBar = Pref.showWindowTitleBar;\n  late final RxBool isAlwaysOnTop = false.obs;\n  Future<void> setAlwaysOnTop(bool value) {\n    isAlwaysOnTop.value = value;\n    return windowManager.setAlwaysOnTop(value);\n  }\n\n  Future<void> exitDesktopPip() {\n    isDesktopPip = false;\n    return Future.wait([\n      if (showWindowTitleBar)\n        windowManager.setTitleBarStyle(TitleBarStyle.normal),\n      windowManager.setMinimumSize(const Size(400, 700)),\n      windowManager.setBounds(_lastWindowBounds),\n      setAlwaysOnTop(false),\n      windowManager.setAspectRatio(0),\n    ]);\n  }\n\n  Future<void> enterDesktopPip() async {\n    if (isFullScreen.value) return;\n\n    isDesktopPip = true;\n\n    _lastWindowBounds = await windowManager.getBounds();\n\n    if (showWindowTitleBar) {\n      windowManager.setTitleBarStyle(TitleBarStyle.hidden);\n    }\n\n    final Size size;\n    final state = videoPlayerController!.state;\n    int width = state.width;\n    int height = state.height;\n    if (width == 0) {\n      width = this.width ?? 16;\n    }\n    if (height == 0) {\n      height = this.height ?? 9;\n    }\n    if (height > width) {\n      size = Size(280.0, 280.0 * height / width);\n    } else {\n      size = Size(280.0 * width / height, 280.0);\n    }\n\n    await windowManager.setMinimumSize(size);\n    setAlwaysOnTop(true);\n    windowManager\n      ..setSize(size)\n      ..setAspectRatio(width / height);\n  }\n\n  void toggleDesktopPip() {\n    if (isDesktopPip) {\n      exitDesktopPip();\n    } else {\n      enterDesktopPip();\n    }\n  }\n\n  late bool _shouldSetPip = false;\n\n  bool get _isCurrVideoPage {\n    final routing = Get.routing;\n    if (routing.route is! GetPageRoute) {\n      return false;\n    }\n    final currentRoute = routing.current;\n    return currentRoute.startsWith('/video') ||\n        currentRoute.startsWith('/liveRoom');\n  }\n\n  bool get _isPreviousVideoPage {\n    final previousRoute = Get.previousRoute;\n    return previousRoute.startsWith('/video') ||\n        previousRoute.startsWith('/liveRoom');\n  }\n\n  void enterPip({bool isAuto = false}) {\n    if (videoPlayerController != null) {\n      controls = false;\n      final state = videoPlayerController!.state;\n      PageUtils.enterPip(\n        isAuto: isAuto,\n        width: state.width == 0 ? width : state.width,\n        height: state.height == 0 ? height : state.height,\n      );\n    }\n  }\n\n  void _disableAutoEnterPipIfNeeded() {\n    if (!_isPreviousVideoPage) {\n      _disableAutoEnterPip();\n    }\n  }\n\n  void _disableAutoEnterPip() {\n    if (_shouldSetPip) {\n      Utils.channel.invokeMethod('setPipAutoEnterEnabled', {\n        'autoEnable': false,\n      });\n    }\n  }\n\n  // 弹幕相关配置\n  late final enableTapDm = PlatformUtils.isMobile && Pref.enableTapDm;\n  late RuleFilter filters = Pref.danmakuFilterRule;\n  // 关联弹幕控制器\n  DanmakuController<DanmakuExtra>? danmakuController;\n  bool showDanmaku = true;\n  Set<int> dmState = <int>{};\n  late final mergeDanmaku = Pref.mergeDanmaku;\n  late final String midHash = getCrc32(\n    ascii.encode(Accounts.main.mid.toString()),\n    0,\n  ).toRadixString(16);\n  late final RxDouble danmakuOpacity = Pref.danmakuOpacity.obs;\n\n  late List<double> speedList = Pref.speedList;\n  late bool enableAutoLongPressSpeed = Pref.enableAutoLongPressSpeed;\n  late final showControlDuration = Pref.enableLongShowControl\n      ? const Duration(seconds: 30)\n      : const Duration(seconds: 3);\n  // 字幕\n  late double subtitleFontScale = Pref.subtitleFontScale;\n  late double subtitleFontScaleFS = Pref.subtitleFontScaleFS;\n  late int subtitlePaddingH = Pref.subtitlePaddingH;\n  late int subtitlePaddingB = Pref.subtitlePaddingB;\n  late double subtitleBgOpacity = Pref.subtitleBgOpacity;\n  final bool showVipDanmaku = Pref.showVipDanmaku; // loop unswitching\n  late double subtitleStrokeWidth = Pref.subtitleStrokeWidth;\n  late int subtitleFontWeight = Pref.subtitleFontWeight;\n\n  // settings\n  late final showFSActionItem = Pref.showFSActionItem;\n  late final enableShrinkVideoSize = Pref.enableShrinkVideoSize;\n  late final darkVideoPage = Pref.darkVideoPage;\n  late final enableSlideVolumeBrightness = Pref.enableSlideVolumeBrightness;\n  late final enableSlideFS = Pref.enableSlideFS;\n  late final enableDragSubtitle = Pref.enableDragSubtitle;\n  late final fastForBackwardDuration = Duration(\n    seconds: Pref.fastForBackwardDuration,\n  );\n\n  late final horizontalSeasonPanel = Pref.horizontalSeasonPanel;\n  late final preInitPlayer = Pref.preInitPlayer;\n  late final showRelatedVideo = Pref.showRelatedVideo;\n  late final showVideoReply = Pref.showVideoReply;\n  late final showBangumiReply = Pref.showBangumiReply;\n  late final reverseFromFirst = Pref.reverseFromFirst;\n  late final horizontalPreview = Pref.horizontalPreview;\n  late final showDmChart = Pref.showDmChart;\n  late final showViewPoints = Pref.showViewPoints;\n  late final showFsScreenshotBtn = Pref.showFsScreenshotBtn;\n  late final showFsLockBtn = Pref.showFsLockBtn;\n  late final keyboardControl = Pref.keyboardControl;\n\n  late final bool autoEnterFullScreen = Pref.autoEnterFullScreen;\n  late final bool autoExitFullscreen = Pref.autoExitFullscreen;\n  late final bool autoPlayEnable = Pref.autoPlayEnable;\n  late final bool enableVerticalExpand = Pref.enableVerticalExpand;\n  late final bool pipNoDanmaku = Pref.pipNoDanmaku;\n\n  late final bool tempPlayerConf = Pref.tempPlayerConf;\n\n  late int? cacheVideoQa = PlatformUtils.isMobile ? null : Pref.defaultVideoQa;\n  late int cacheAudioQa = Pref.defaultAudioQa;\n  bool enableHeart = true;\n  late final String? hwdec = Pref.enableHA ? Pref.hardwareDecoding : null;\n\n  late final progressType = Pref.btmProgressBehavior;\n  late final enableQuickDouble = Pref.enableQuickDouble;\n  late final fullScreenGestureReverse = Pref.fullScreenGestureReverse;\n\n  late final isRelative = Pref.useRelativeSlide;\n  late final offset = isRelative\n      ? Pref.sliderDuration / 100\n      : Pref.sliderDuration * 1000;\n\n  num get sliderScale =>\n      isRelative ? duration.value.inMilliseconds * offset : offset;\n\n  // 播放顺序相关\n  late PlayRepeat playRepeat = Pref.playRepeat;\n\n  TextStyle get subTitleStyle => TextStyle(\n    height: 1.5,\n    fontSize:\n        16 * (isFullScreen.value ? subtitleFontScaleFS : subtitleFontScale),\n    letterSpacing: 0.1,\n    wordSpacing: 0.1,\n    color: Colors.white,\n    fontWeight: FontWeight.values[subtitleFontWeight],\n    backgroundColor: subtitleBgOpacity == 0\n        ? null\n        : Colors.black.withValues(alpha: subtitleBgOpacity),\n  );\n\n  late final Rx<SubtitleViewConfiguration> subtitleConfig = getSubConfig.obs;\n\n  SubtitleViewConfiguration get getSubConfig {\n    final subTitleStyle = this.subTitleStyle;\n    return SubtitleViewConfiguration(\n      style: subTitleStyle,\n      strokeStyle: subtitleBgOpacity == 0\n          ? subTitleStyle.copyWith(\n              color: null,\n              background: null,\n              backgroundColor: null,\n              foreground: Paint()\n                ..color = Colors.black\n                ..style = PaintingStyle.stroke\n                ..strokeWidth = subtitleStrokeWidth,\n            )\n          : null,\n      padding: EdgeInsets.only(\n        left: subtitlePaddingH.toDouble(),\n        right: subtitlePaddingH.toDouble(),\n        bottom: subtitlePaddingB.toDouble(),\n      ),\n      textScaleFactor: 1,\n    );\n  }\n\n  void updateSubtitleStyle() {\n    subtitleConfig.value = getSubConfig;\n  }\n\n  void onUpdatePadding(EdgeInsets padding) {\n    subtitlePaddingB = padding.bottom.round().clamp(0, 200);\n    putSubtitleSettings();\n  }\n\n  void updateSliderPositionSecond() {\n    int newSecond = sliderPosition.inSeconds;\n    if (sliderPositionSeconds.value != newSecond) {\n      sliderPositionSeconds.value = newSecond;\n    }\n  }\n\n  void updatePositionSecond() {\n    int newSecond = position.inSeconds;\n    if (positionSeconds.value != newSecond) {\n      positionSeconds.value = newSecond;\n    }\n  }\n\n  void updateBufferedSecond() {\n    int newSecond = buffered.value.inSeconds;\n    if (bufferedSeconds.value != newSecond) {\n      bufferedSeconds.value = newSecond;\n    }\n  }\n\n  static PlPlayerController? get instance => _instance;\n\n  static bool instanceExists() {\n    return _instance != null;\n  }\n\n  static void setPlayCallBack(PlayCallback? playCallBack) {\n    _playCallBack = playCallBack;\n  }\n\n  static PlayCallback? _playCallBack;\n\n  static Future<void>? playIfExists() {\n    // await _instance?.play(repeat: repeat, hideControls: hideControls);\n    return _playCallBack?.call();\n  }\n\n  // try to get PlayerStatus\n  static PlayerStatus? getPlayerStatusIfExists() {\n    return _instance?.playerStatus.value;\n  }\n\n  static Future<void> pauseIfExists({\n    bool notify = true,\n    bool isInterrupt = false,\n  }) async {\n    if (_instance?.playerStatus.isPlaying ?? false) {\n      await _instance?.pause(notify: notify, isInterrupt: isInterrupt);\n    }\n  }\n\n  static Future<void> seekToIfExists(\n    Duration position, {\n    bool isSeek = true,\n  }) async {\n    await _instance?.seekTo(position, isSeek: isSeek);\n  }\n\n  static double? getVolumeIfExists() {\n    return _instance?.volume.value;\n  }\n\n  static Future<void>? setVolumeIfExists(double volumeNew) {\n    return _instance?.setVolume(volumeNew);\n  }\n\n  Box video = GStorage.video;\n\n  // 添加一个私有构造函数\n  PlPlayerController._() {\n    if (!Accounts.heartbeat.isLogin || Pref.historyPause) {\n      enableHeart = false;\n    }\n\n    if (Platform.isAndroid && autoPiP) {\n      Utils.sdkInt.then((sdkInt) {\n        if (sdkInt < 36) {\n          Utils.channel.setMethodCallHandler((call) async {\n            if (call.method == 'onUserLeaveHint') {\n              if (playerStatus.isPlaying && _isCurrVideoPage) {\n                enterPip();\n              }\n            }\n          });\n        } else {\n          _shouldSetPip = true;\n        }\n      });\n    }\n  }\n\n  // 获取实例 传参\n  static PlPlayerController getInstance({bool isLive = false}) {\n    // 如果实例尚未创建，则创建一个新实例\n    return (_instance ??= PlPlayerController._())\n      ..isLive = isLive\n      .._playerCount += 1;\n  }\n\n  bool _processing = false;\n  bool get processing => _processing;\n\n  // offline\n  bool get isFileSource => dataSource is FileSource;\n\n  // 初始化资源\n  Future<void> setDataSource(\n    DataSource dataSource, {\n    bool isLive = false,\n    bool autoplay = true,\n    // 初始化播放位置\n    Duration? seekTo,\n    // 初始化播放速度\n    double speed = 1.0,\n    int? width,\n    int? height,\n    Duration? duration,\n    // 方向\n    bool? isVertical,\n    // 记录历史记录\n    int? aid,\n    String? bvid,\n    int? cid,\n    int? epid,\n    int? seasonId,\n    int? pgcType,\n    VideoType? videoType,\n    VoidCallback? onInit,\n    Volume? volume,\n    bool autoFullScreenFlag = false,\n  }) async {\n    try {\n      _processing = true;\n      this.isLive = isLive;\n      _videoType = videoType ?? VideoType.ugc;\n      this.width = width;\n      this.height = height;\n      this.dataSource = dataSource;\n      _autoPlay = autoplay;\n      // 初始化视频倍速\n      // _playbackSpeed.value = speed;\n      // 初始化数据加载状态\n      dataStatus.value = DataStatus.loading;\n      // 初始化全屏方向\n      _isVertical = isVertical ?? false;\n      _aid = aid;\n      _bvid = bvid;\n      this.cid = cid;\n      _epid = epid;\n      _seasonId = seasonId;\n      _pgcType = pgcType;\n\n      if (showSeekPreview) {\n        _clearPreview();\n      }\n      cancelLongPressTimer();\n      if (_videoPlayerController != null &&\n          _videoPlayerController!.state.playing) {\n        await pause(notify: false);\n      }\n\n      if (_playerCount == 0) {\n        return;\n      }\n      // 配置Player 音轨、字幕等等\n      await _createVideoController(dataSource, seekTo, volume);\n\n      if (_playerCount == 0) {\n        _removeListeners();\n        _videoPlayerController?.dispose();\n        _videoPlayerController = null;\n        _videoController = null;\n        return;\n      }\n\n      // 获取视频时长 00:00\n      this.duration.value = duration ?? _videoPlayerController!.state.duration;\n      position = buffered.value = sliderPosition = seekTo ?? Duration.zero;\n      updatePositionSecond();\n      updateSliderPositionSecond();\n      updateBufferedSecond();\n      // 数据加载完成\n      dataStatus.value = DataStatus.loaded;\n\n      if (autoFullScreenFlag && autoEnterFullScreen) {\n        triggerFullScreen(status: true);\n      }\n\n      await _initializePlayer();\n      onInit?.call();\n    } catch (err, stackTrace) {\n      dataStatus.value = DataStatus.error;\n      if (kDebugMode) {\n        debugPrint(stackTrace.toString());\n        debugPrint('plPlayer err:  $err');\n      }\n    } finally {\n      _processing = false;\n    }\n  }\n\n  String? shadersDirPath;\n  Future<String> get copyShadersToExternalDirectory async {\n    if (shadersDirPath != null) {\n      return shadersDirPath!;\n    }\n\n    return shadersDirPath = await AssetUtils.getOrCopy(\n      'assets/shaders',\n      Constants.mpvAnime4KShaders.followedBy(Constants.mpvAnime4KShadersLite),\n      path.join(appSupportDirPath, 'anime_shaders'),\n    );\n  }\n\n  late final isAnim = _pgcType == 1 || _pgcType == 4;\n  late final Rx<SuperResolutionType> superResolutionType =\n      (isAnim ? Pref.superResolutionType : SuperResolutionType.disable).obs;\n  Future<void> setShader([SuperResolutionType? type, NativePlayer? pp]) async {\n    if (type == null) {\n      type = superResolutionType.value;\n    } else {\n      superResolutionType.value = type;\n      if (isAnim && !tempPlayerConf) {\n        setting.put(SettingBoxKey.superResolutionType, type.index);\n      }\n    }\n    pp ??= _videoPlayerController!;\n    switch (type) {\n      case SuperResolutionType.disable:\n        return pp.command(const ['change-list', 'glsl-shaders', 'clr', '']);\n      case SuperResolutionType.efficiency:\n        return pp.command([\n          'change-list',\n          'glsl-shaders',\n          'set',\n          PathUtils.buildShadersAbsolutePath(\n            await copyShadersToExternalDirectory,\n            Constants.mpvAnime4KShadersLite,\n          ),\n        ]);\n      case SuperResolutionType.quality:\n        return pp.command([\n          'change-list',\n          'glsl-shaders',\n          'set',\n          PathUtils.buildShadersAbsolutePath(\n            await copyShadersToExternalDirectory,\n            Constants.mpvAnime4KShaders,\n          ),\n        ]);\n    }\n  }\n\n  static final loudnormRegExp = RegExp('loudnorm=([^,]+)');\n\n  Future<Player> _initPlayer() async {\n    assert(_videoPlayerController == null);\n    final opt = {\n      'video-sync': Pref.videoSync,\n    };\n    if (Platform.isAndroid) {\n      opt['volume-max'] = '100';\n      opt['ao'] = Pref.audioOutput;\n    } else if (PlatformUtils.isDesktop) {\n      opt['volume'] = (volume.value * 100).toString();\n    }\n    final autosync = Pref.autosync;\n    if (autosync != '0') {\n      opt['autosync'] = autosync;\n    }\n\n    final player = await Player.create(\n      configuration: PlayerConfiguration(\n        bufferSize: Pref.expandBuffer\n            ? (isLive ? 64 * 1024 * 1024 : 32 * 1024 * 1024)\n            : (isLive ? 16 * 1024 * 1024 : 4 * 1024 * 1024),\n        logLevel: kDebugMode ? .warn : .error,\n        options: opt,\n      ),\n    );\n\n    assert(_videoController == null);\n\n    _videoController = await VideoController.create(\n      player,\n      configuration: VideoControllerConfiguration(\n        enableHardwareAcceleration: hwdec != null,\n        androidAttachSurfaceAfterVideoParameters: false,\n        hwdec: hwdec,\n      ),\n    );\n\n    player.setMediaHeader(\n      userAgent: BrowserUa.pc,\n      referer: HttpString.baseUrl,\n    );\n    // await player.setAudioTrack(.auto());\n\n    _startListeners(player);\n\n    return player;\n  }\n\n  // 配置播放器\n  Future<void> _createVideoController(\n    DataSource dataSource,\n    Duration? seekTo,\n    Volume? volume,\n  ) async {\n    isBuffering.value = false;\n    buffered.value = Duration.zero;\n    _heartDuration = 0;\n    position = Duration.zero;\n    // 初始化时清空弹幕，防止上次重叠\n    danmakuController?.clear();\n\n    var player = _videoPlayerController;\n\n    if (player == null) {\n      player = await _initPlayer();\n      if (_playerCount == 0) {\n        _removeListeners();\n        player.dispose();\n        player = null;\n        _videoController = null;\n        return;\n      }\n      _videoPlayerController = player;\n      if (isAnim && superResolutionType.value != .disable) {\n        await setShader();\n      }\n    }\n\n    final Map<String, String> extras = {};\n\n    String video = dataSource.videoSource;\n    if (dataSource.audioSource case final audio? when (audio.isNotEmpty)) {\n      if (onlyPlayAudio.value) {\n        video = audio;\n      } else {\n        extras['audio-files'] =\n            '\"${Platform.isWindows ? audio.replaceAll(';', r'\\;') : audio.replaceAll(':', r'\\:')}\"';\n      }\n      if (kDebugMode || Platform.isAndroid) {\n        String audioNormalization = AudioNormalization.getParamFromConfig(\n          Pref.audioNormalization,\n        );\n        if (volume != null && volume.isNotEmpty) {\n          audioNormalization = audioNormalization.replaceFirstMapped(\n            loudnormRegExp,\n            (i) =>\n                'loudnorm=${volume.format(\n                  Map.fromEntries(\n                    i.group(1)!.split(':').map((item) {\n                      final parts = item.split('=');\n                      return MapEntry(parts[0].toLowerCase(), num.parse(parts[1]));\n                    }),\n                  ),\n                )}',\n          );\n        } else {\n          audioNormalization = audioNormalization.replaceFirst(\n            loudnormRegExp,\n            AudioNormalization.getParamFromConfig(Pref.fallbackNormalization),\n          );\n        }\n        if (audioNormalization.isNotEmpty) {\n          extras['lavfi-complex'] = '\"[aid1] $audioNormalization [ao]\"';\n        }\n      }\n    }\n\n    await player.open(\n      Media(\n        video,\n        start: seekTo,\n        extras: extras.isEmpty ? null : extras,\n      ),\n      play: false,\n    );\n  }\n\n  Future<void>? refreshPlayer() {\n    if (dataSource is FileSource) {\n      return null;\n    }\n    if (_videoPlayerController?.current.isNotEmpty ?? false) {\n      return _videoPlayerController!.open(\n        _videoPlayerController!.current.last.copyWith(start: position),\n        play: true,\n      );\n    }\n    return null;\n  }\n\n  // 开始播放\n  Future<void> _initializePlayer() async {\n    if (_instance == null) return;\n    // 设置倍速\n    if (isLive) {\n      await setPlaybackSpeed(1.0);\n    } else {\n      if (_videoPlayerController?.state.rate != _playbackSpeed.value) {\n        await setPlaybackSpeed(_playbackSpeed.value);\n      }\n    }\n    _initVideoFit();\n    // if (_looping) {\n    //   await setLooping(_looping);\n    // }\n\n    // 跳转播放\n    // if (seekTo != Duration.zero) {\n    //   await this.seekTo(seekTo);\n    // }\n\n    // 自动播放\n    if (_autoPlay) {\n      playIfExists();\n      // await play(duration: duration);\n    }\n  }\n\n  List<StreamSubscription>? _subscriptions;\n  final Set<ValueChanged<Duration>> _positionListeners = {};\n  final Set<ValueChanged<PlayerStatus>> _statusListeners = {};\n\n  /// 播放事件监听\n  void _startListeners(NativePlayer player) {\n    assert(_subscriptions == null);\n    final stream = player.stream;\n    _subscriptions = [\n      stream.playing.listen((event) {\n        WakelockPlus.toggle(enable: event);\n        if (event) {\n          if (_shouldSetPip) {\n            if (_isCurrVideoPage) {\n              enterPip(isAuto: true);\n            } else {\n              _disableAutoEnterPip();\n            }\n          }\n          playerStatus.value = PlayerStatus.playing;\n        } else {\n          _disableAutoEnterPip();\n          playerStatus.value = PlayerStatus.paused;\n        }\n        videoPlayerServiceHandler?.onStatusChange(\n          playerStatus.value,\n          isBuffering.value,\n          isLive,\n        );\n\n        /// 触发回调事件\n        for (final element in _statusListeners) {\n          element(event ? PlayerStatus.playing : PlayerStatus.paused);\n        }\n        if (videoPlayerController!.state.position.inSeconds != 0) {\n          makeHeartBeat(positionSeconds.value, type: HeartBeatType.status);\n        }\n      }),\n      stream.completed.listen((event) {\n        if (event) {\n          playerStatus.value = PlayerStatus.completed;\n\n          /// 触发回调事件\n          for (final element in _statusListeners) {\n            element(PlayerStatus.completed);\n          }\n        } else {\n          // playerStatus.value = PlayerStatus.playing;\n        }\n        makeHeartBeat(positionSeconds.value, type: HeartBeatType.completed);\n      }),\n      stream.position.listen((event) {\n        position = event;\n        updatePositionSecond();\n        if (!isSliderMoving.value) {\n          sliderPosition = event;\n          updateSliderPositionSecond();\n        }\n\n        /// 触发回调事件\n        for (final element in _positionListeners) {\n          element(event);\n        }\n        makeHeartBeat(event.inSeconds);\n      }),\n      stream.duration.listen((Duration event) {\n        duration.value = event;\n      }),\n      stream.buffer.listen((Duration event) {\n        buffered.value = event;\n        updateBufferedSecond();\n      }),\n      stream.buffering.listen((bool event) {\n        isBuffering.value = event;\n        videoPlayerServiceHandler?.onStatusChange(\n          playerStatus.value,\n          event,\n          isLive,\n        );\n      }),\n      if (kDebugMode)\n        stream.log.listen(((PlayerLog log) {\n          if (log.level == 'error' || log.level == 'fatal') {\n            Utils.reportError('${log.level}: ${log.prefix}: ${log.text}', null);\n          } else {\n            debugPrint(log.toString());\n          }\n        })),\n      stream.error.listen((String event) {\n        if (dataSource is FileSource &&\n            event.startsWith(\"Failed to open file\")) {\n          return;\n        }\n        if (isLive) {\n          if (event.startsWith('tcp: ffurl_read returned ') ||\n              event.startsWith(\"Failed to open https://\") ||\n              event.startsWith(\"Can not open external file https://\")) {\n            Future.delayed(const Duration(milliseconds: 3000), refreshPlayer);\n          }\n          return;\n        }\n        if (event.startsWith(\"Failed to open https://\") ||\n            event.startsWith(\"Can not open external file https://\") ||\n            //tcp: ffurl_read returned 0xdfb9b0bb\n            //tcp: ffurl_read returned 0xffffff99\n            event.startsWith('tcp: ffurl_read returned ')) {\n          EasyThrottle.throttle(\n            'controllerStream.error.listen',\n            const Duration(milliseconds: 10000),\n            () {\n              Future.delayed(const Duration(milliseconds: 3000), () {\n                // if (kDebugMode) {\n                //   debugPrint(\"isBuffering.value: ${isBuffering.value}\");\n                // }\n                // if (kDebugMode) {\n                //   debugPrint(\"_buffered.value: ${_buffered.value}\");\n                // }\n                if (isBuffering.value && buffered.value == Duration.zero) {\n                  SmartDialog.showToast(\n                    '视频链接打开失败，重试中',\n                    displayTime: const Duration(milliseconds: 500),\n                  );\n                  refreshPlayer();\n                }\n              });\n            },\n          );\n        } else if (event.startsWith('Could not open codec')) {\n          SmartDialog.showToast('无法加载解码器, $event，可能会切换至软解');\n        } else if (!onlyPlayAudio.value) {\n          if (event.startsWith(\"error running\") ||\n              event.startsWith(\"Failed to open .\") ||\n              event.startsWith(\"Cannot open\") ||\n              event.startsWith(\"Can not open\")) {\n            return;\n          }\n          SmartDialog.showToast('视频加载错误, $event');\n        }\n      }),\n      // controllerStream.volume.listen((event) {\n      //   if (!mute.value && _volumeBeforeMute != event) {\n      //     _volumeBeforeMute = event / 100;\n      //   }\n      // }),\n      // 媒体通知监听\n      if (videoPlayerServiceHandler != null) ...[\n        playerStatus.listen((PlayerStatus event) {\n          videoPlayerServiceHandler!.onStatusChange(\n            event,\n            isBuffering.value,\n            isLive,\n          );\n        }),\n        positionSeconds.listen((int event) {\n          videoPlayerServiceHandler!.onPositionChange(Duration(seconds: event));\n        }),\n      ],\n    ];\n  }\n\n  /// 移除事件监听\n  void _removeListeners() {\n    _subscriptions?.forEach((e) => e.cancel());\n    _subscriptions?.clear();\n    _subscriptions = null;\n  }\n\n  void _cancelSubForSeek() {\n    if (_subForSeek != null) {\n      _subForSeek!.cancel();\n      _subForSeek = null;\n    }\n  }\n\n  /// 跳转至指定位置\n  Future<void> seekTo(Duration position, {bool isSeek = true}) async {\n    // if (position >= duration.value) {\n    //   position = duration.value - const Duration(milliseconds: 100);\n    // }\n    if (_playerCount == 0) {\n      return;\n    }\n    if (position < Duration.zero) {\n      position = Duration.zero;\n    }\n    this.position = position;\n    updatePositionSecond();\n    _heartDuration = position.inSeconds;\n\n    Future<void> seek() async {\n      if (isSeek) {\n        /// 拖动进度条调节时，不等待第一帧，防止抖动\n        await _videoPlayerController?.stream.buffer.first;\n      }\n      danmakuController?.clear();\n      try {\n        await _videoPlayerController?.seek(position);\n      } catch (e) {\n        if (kDebugMode) debugPrint('seek failed: $e');\n      }\n    }\n\n    if (duration.value != Duration.zero) {\n      seek();\n    } else {\n      // if (kDebugMode) debugPrint('seek duration else');\n      _subForSeek?.cancel();\n      _subForSeek = duration.listen((_) {\n        seek();\n        _cancelSubForSeek();\n      });\n    }\n  }\n\n  /// 设置倍速\n  Future<void> setPlaybackSpeed(double speed) async {\n    lastPlaybackSpeed = playbackSpeed;\n\n    if (speed == _videoPlayerController?.state.rate) {\n      return;\n    }\n\n    await _videoPlayerController?.setRate(speed);\n    _playbackSpeed.value = speed;\n    if (danmakuController != null) {\n      try {\n        DanmakuOption currentOption = danmakuController!.option;\n        double defaultDuration = currentOption.duration * lastPlaybackSpeed;\n        double defaultStaticDuration =\n            currentOption.staticDuration * lastPlaybackSpeed;\n        DanmakuOption updatedOption = currentOption.copyWith(\n          duration: defaultDuration / speed,\n          staticDuration: defaultStaticDuration / speed,\n        );\n        danmakuController!.updateOption(updatedOption);\n      } catch (_) {}\n    }\n  }\n\n  // 还原默认速度\n  double playSpeedDefault = Pref.playSpeedDefault;\n  Future<void> setDefaultSpeed() async {\n    await _videoPlayerController?.setRate(playSpeedDefault);\n    _playbackSpeed.value = playSpeedDefault;\n  }\n\n  /// 播放视频\n  Future<void> play({bool repeat = false, bool hideControls = true}) async {\n    if (_playerCount == 0) return;\n    // 播放时自动隐藏控制条\n    controls = !hideControls;\n    // repeat为true，将从头播放\n    if (repeat) {\n      // await seekTo(Duration.zero);\n      await seekTo(Duration.zero, isSeek: false);\n    }\n\n    await _videoPlayerController?.play();\n\n    audioSessionHandler?.setActive(true);\n\n    playerStatus.value = PlayerStatus.playing;\n    // screenManager.setOverlays(false);\n  }\n\n  /// 暂停播放\n  Future<void> pause({bool notify = true, bool isInterrupt = false}) async {\n    await _videoPlayerController?.pause();\n    playerStatus.value = PlayerStatus.paused;\n\n    // 主动暂停时让出音频焦点\n    if (!isInterrupt) {\n      audioSessionHandler?.setActive(false);\n    }\n  }\n\n  bool tripling = false;\n\n  /// 隐藏控制条\n  void hideTaskControls() {\n    _timer?.cancel();\n    _timer = Timer(showControlDuration, () {\n      if (!isSliderMoving.value && !tripling) {\n        controls = false;\n      }\n      _timer = null;\n    });\n  }\n\n  /// 调整播放时间\n  void onChangedSlider(int v) {\n    sliderPosition = Duration(seconds: v);\n    updateSliderPositionSecond();\n  }\n\n  void onChangedSliderStart([Duration? value]) {\n    if (value != null) {\n      sliderTempPosition.value = value;\n    }\n    isSliderMoving.value = true;\n  }\n\n  bool? cancelSeek;\n  bool? hasToast;\n\n  void onUpdatedSliderProgress(Duration value) {\n    sliderTempPosition.value = value;\n    sliderPosition = value;\n    updateSliderPositionSecond();\n  }\n\n  void onChangedSliderEnd() {\n    if (cancelSeek != true) {\n      feedBack();\n    }\n    cancelSeek = null;\n    hasToast = null;\n    isSliderMoving.value = false;\n    hideTaskControls();\n  }\n\n  final RxBool volumeIndicator = false.obs;\n  Timer? volumeTimer;\n  bool volumeInterceptEventStream = false;\n\n  static final double maxVolume = PlatformUtils.isDesktop ? 2.0 : 1.0;\n  Future<void> setVolume(double volume) async {\n    if (this.volume.value != volume) {\n      this.volume.value = volume;\n      try {\n        if (PlatformUtils.isDesktop) {\n          _videoPlayerController!.setVolume(volume * 100);\n        } else {\n          FlutterVolumeController.updateShowSystemUI(false);\n          await FlutterVolumeController.setVolume(volume);\n        }\n      } catch (err) {\n        if (kDebugMode) debugPrint(err.toString());\n      }\n    }\n    volumeIndicator.value = true;\n    volumeInterceptEventStream = true;\n    volumeTimer?.cancel();\n    volumeTimer = Timer(const Duration(milliseconds: 200), () {\n      volumeIndicator.value = false;\n      volumeInterceptEventStream = false;\n      if (PlatformUtils.isDesktop) {\n        setting.put(SettingBoxKey.desktopVolume, volume.toPrecision(3));\n      }\n    });\n  }\n\n  /// Toggle Change the videofit accordingly\n  void toggleVideoFit(VideoFitType value) {\n    _prefFit = videoFit.value = value;\n    video.put(VideoBoxKey.cacheVideoFit, value.index);\n  }\n\n  /// 读取fit\n  var _prefFit = VideoFitType.values[Pref.cacheVideoFit];\n  void _initVideoFit() {\n    if (_prefFit == .fill && _isVertical) {\n      videoFit.value = .contain;\n    } else {\n      videoFit.value = _prefFit;\n    }\n  }\n\n  /// 设置后台播放\n  void setBackgroundPlay(bool val) {\n    videoPlayerServiceHandler?.enableBackgroundPlay = val;\n    if (!tempPlayerConf) {\n      setting.put(SettingBoxKey.enableBackgroundPlay, val);\n    }\n  }\n\n  set controls(bool visible) {\n    showControls.value = visible;\n    _timer?.cancel();\n    if (visible) {\n      hideTaskControls();\n    }\n  }\n\n  Timer? longPressTimer;\n  void cancelLongPressTimer() {\n    longPressTimer?.cancel();\n    longPressTimer = null;\n  }\n\n  /// 设置长按倍速状态 live模式下禁用\n  Future<void> setLongPressStatus(bool val) async {\n    if (isLive) {\n      return;\n    }\n    if (controlsLock.value) {\n      return;\n    }\n    if (longPressStatus.value == val) {\n      return;\n    }\n    if (val) {\n      if (playerStatus.isPlaying) {\n        longPressStatus.value = val;\n        HapticFeedback.lightImpact();\n        await setPlaybackSpeed(\n          enableAutoLongPressSpeed ? playbackSpeed * 2 : longPressSpeed,\n        );\n      }\n    } else {\n      // if (kDebugMode) debugPrint('$playbackSpeed');\n      longPressStatus.value = val;\n      await setPlaybackSpeed(lastPlaybackSpeed);\n    }\n  }\n\n  bool get _isCompleted =>\n      videoPlayerController!.state.completed ||\n      (duration.value - position).inMilliseconds <= 50;\n\n  // 双击播放、暂停\n  Future<void> onDoubleTapCenter() async {\n    if (!isLive && _isCompleted) {\n      await videoPlayerController!.seek(Duration.zero);\n      videoPlayerController!.play();\n    } else {\n      videoPlayerController!.playOrPause();\n    }\n  }\n\n  final RxBool mountSeekBackwardButton = false.obs;\n  final RxBool mountSeekForwardButton = false.obs;\n\n  void onDoubleTapSeekBackward() {\n    mountSeekBackwardButton.value = true;\n  }\n\n  void onDoubleTapSeekForward() {\n    mountSeekForwardButton.value = true;\n  }\n\n  void onForward(Duration duration) {\n    onForwardBackward(position + duration);\n  }\n\n  void onBackward(Duration duration) {\n    onForwardBackward(position - duration);\n  }\n\n  void onForwardBackward(Duration duration) {\n    seekTo(\n      duration.clamp(Duration.zero, videoPlayerController!.state.duration),\n      isSeek: false,\n    ).whenComplete(play);\n  }\n\n  void doubleTapFuc(DoubleTapType type) {\n    if (!enableQuickDouble) {\n      onDoubleTapCenter();\n      return;\n    }\n    switch (type) {\n      case DoubleTapType.left:\n        // 双击左边区域 👈\n        onDoubleTapSeekBackward();\n        break;\n      case DoubleTapType.center:\n        onDoubleTapCenter();\n        break;\n      case DoubleTapType.right:\n        // 双击右边区域 👈\n        onDoubleTapSeekForward();\n        break;\n    }\n  }\n\n  /// 关闭控制栏\n  void onLockControl(bool val) {\n    feedBack();\n    controlsLock.value = val;\n    if (!val && showControls.value) {\n      showControls.refresh();\n    }\n    controls = !val;\n  }\n\n  void toggleFullScreen(bool val) {\n    isFullScreen.value = val;\n    updateSubtitleStyle();\n  }\n\n  late bool isManualFS = true;\n  late final FullScreenMode mode = Pref.fullScreenMode;\n  late final horizontalScreen = Pref.horizontalScreen;\n\n  // 全屏\n  bool fsProcessing = false;\n  Future<void> triggerFullScreen({\n    bool status = true,\n    bool inAppFullScreen = false,\n    bool isManualFS = true,\n    FullScreenMode? mode,\n  }) async {\n    if (isDesktopPip) return;\n    if (isFullScreen.value == status) return;\n\n    if (fsProcessing) {\n      return;\n    }\n    fsProcessing = true;\n    toggleFullScreen(status);\n    try {\n      mode ??= this.mode;\n      this.isManualFS = isManualFS;\n\n      if (status) {\n        if (PlatformUtils.isMobile) {\n          hideStatusBar();\n          if (mode == FullScreenMode.none) {\n            return;\n          }\n          if (mode == FullScreenMode.gravity) {\n            await fullAutoModeForceSensor();\n            return;\n          }\n          late final size = MediaQuery.sizeOf(Get.context!);\n          if ((mode == FullScreenMode.vertical ||\n              (mode == FullScreenMode.auto && isVertical) ||\n              (mode == FullScreenMode.ratio &&\n                  (isVertical || size.height / size.width < kScreenRatio)))) {\n            await verticalScreenForTwoSeconds();\n          } else {\n            await landscape();\n          }\n        } else {\n          await enterDesktopFullscreen(inAppFullScreen: inAppFullScreen);\n        }\n      } else {\n        if (PlatformUtils.isMobile) {\n          showStatusBar();\n          if (mode == FullScreenMode.none) {\n            return;\n          }\n          if (!horizontalScreen) {\n            await verticalScreenForTwoSeconds();\n          } else {\n            await autoScreen();\n          }\n        } else {\n          await exitDesktopFullscreen();\n        }\n      }\n    } finally {\n      fsProcessing = false;\n    }\n  }\n\n  void addPositionListener(ValueChanged<Duration> listener) {\n    if (_playerCount == 0) return;\n    _positionListeners.add(listener);\n  }\n\n  void removePositionListener(ValueChanged<Duration> listener) =>\n      _positionListeners.remove(listener);\n\n  void addStatusLister(ValueChanged<PlayerStatus> listener) {\n    if (_playerCount == 0) return;\n    _statusListeners.add(listener);\n  }\n\n  void removeStatusLister(ValueChanged<PlayerStatus> listener) =>\n      _statusListeners.remove(listener);\n\n  // 记录播放记录\n  Future<void>? makeHeartBeat(\n    int progress, {\n    HeartBeatType type = HeartBeatType.playing,\n    bool isManual = false,\n    dynamic aid,\n    dynamic bvid,\n    dynamic cid,\n    dynamic epid,\n    dynamic seasonId,\n    dynamic pgcType,\n    VideoType? videoType,\n  }) {\n    if (isLive) {\n      return null;\n    }\n    if (!enableHeart || MineController.anonymity.value || progress == 0) {\n      return null;\n    } else if (playerStatus.isPaused) {\n      if (!isManual) {\n        return null;\n      }\n    }\n    bool isComplete =\n        playerStatus.isCompleted || type == HeartBeatType.completed;\n    if ((duration.value - position).inMilliseconds > 1000) {\n      isComplete = false;\n    }\n    // 播放状态变化时，更新\n\n    Future<void> send() {\n      return VideoHttp.heartBeat(\n        aid: aid ?? _aid,\n        bvid: bvid ?? _bvid,\n        cid: cid ?? this.cid,\n        progress: progress,\n        epid: epid ?? _epid,\n        seasonId: seasonId ?? _seasonId,\n        subType: pgcType ?? _pgcType,\n        videoType: videoType ?? _videoType,\n      );\n    }\n\n    switch (type) {\n      case HeartBeatType.playing:\n        if (progress - _heartDuration >= 5) {\n          _heartDuration = progress;\n          return send();\n        }\n      case HeartBeatType.status:\n        if (progress - _heartDuration >= 2) {\n          _heartDuration = progress;\n          return send();\n        }\n      case HeartBeatType.completed:\n        if (isComplete) progress = -1;\n        return send();\n    }\n    return null;\n  }\n\n  void setPlayRepeat(PlayRepeat type) {\n    playRepeat = type;\n    if (!tempPlayerConf) video.put(VideoBoxKey.playRepeat, type.index);\n  }\n\n  void putSubtitleSettings() {\n    setting.putAllNE({\n      SettingBoxKey.subtitleFontScale: subtitleFontScale,\n      SettingBoxKey.subtitleFontScaleFS: subtitleFontScaleFS,\n      SettingBoxKey.subtitlePaddingH: subtitlePaddingH,\n      SettingBoxKey.subtitlePaddingB: subtitlePaddingB,\n      SettingBoxKey.subtitleBgOpacity: subtitleBgOpacity,\n      SettingBoxKey.subtitleStrokeWidth: subtitleStrokeWidth,\n      SettingBoxKey.subtitleFontWeight: subtitleFontWeight,\n    });\n  }\n\n  bool isCloseAll = false;\n  void dispose() {\n    // 每次减1，最后销毁\n    cancelLongPressTimer();\n    _cancelSubForSeek();\n    if (!isCloseAll && _playerCount > 1) {\n      _playerCount -= 1;\n      _heartDuration = 0;\n      if (!_isPreviousVideoPage) {\n        pause();\n      }\n      return;\n    }\n\n    _playerCount = 0;\n    danmakuController = null;\n    _disableAutoEnterPip();\n    setPlayCallBack(null);\n    dmState.clear();\n    if (showSeekPreview) {\n      _clearPreview();\n    }\n    Utils.channel.setMethodCallHandler(null);\n    _timer?.cancel();\n    // _position.close();\n    // _playerEventSubs?.cancel();\n    // _sliderPosition.close();\n    // _sliderTempPosition.close();\n    // _isSliderMoving.close();\n    // _duration.close();\n    // _buffered.close();\n    // _showControls.close();\n    // _controlsLock.close();\n\n    // playerStatus.close();\n    // dataStatus.close();\n\n    if (PlatformUtils.isDesktop && isAlwaysOnTop.value) {\n      windowManager.setAlwaysOnTop(false);\n    }\n\n    _removeListeners();\n    _positionListeners.clear();\n    _statusListeners.clear();\n    if (playerStatus.isPlaying) {\n      WakelockPlus.disable();\n    }\n    if (kDebugMode) {\n      debugPrint('dispose player');\n    }\n    _videoPlayerController?.dispose();\n    _videoPlayerController = null;\n    _videoController = null;\n    _instance = null;\n    videoPlayerServiceHandler?.clear();\n  }\n\n  static void updatePlayCount() {\n    if (_instance?._playerCount == 1) {\n      _instance?.dispose();\n    } else {\n      _instance?._playerCount -= 1;\n    }\n  }\n\n  void setContinuePlayInBackground() {\n    continuePlayInBackground.value = !continuePlayInBackground.value;\n    if (!tempPlayerConf) {\n      setting.put(\n        SettingBoxKey.continuePlayInBackground,\n        continuePlayInBackground.value,\n      );\n    }\n  }\n\n  void setOnlyPlayAudio() {\n    onlyPlayAudio.value = !onlyPlayAudio.value;\n    videoPlayerController?.setVideoTrack(\n      onlyPlayAudio.value ? VideoTrack.no() : VideoTrack.auto(),\n    );\n  }\n\n  late final Map<String, ui.Image?> previewCache = {};\n  LoadingState<VideoShotData>? videoShot;\n  late final RxBool showPreview = false.obs;\n  late final showSeekPreview = Pref.showSeekPreview;\n  late final previewIndex = RxnInt();\n\n  void updatePreviewIndex(int seconds) {\n    if (videoShot == null) {\n      videoShot = LoadingState.loading();\n      getVideoShot();\n      return;\n    }\n    if (videoShot case Success(:final response)) {\n      showPreview.value = true;\n      previewIndex.value = max(\n        0,\n        (response.index.where((item) => item <= seconds).length - 2),\n      );\n    }\n  }\n\n  void _clearPreview() {\n    showPreview.value = false;\n    previewIndex.value = null;\n    videoShot = null;\n    for (final i in previewCache.values) {\n      i?.dispose();\n    }\n    previewCache.clear();\n  }\n\n  Future<void> getVideoShot() async {\n    videoShot = await VideoHttp.videoshot(bvid: bvid, cid: cid!);\n  }\n\n  void takeScreenshot() {\n    SmartDialog.showToast('截图中');\n    videoPlayerController?.screenshot(format: .png).then((value) {\n      if (value != null) {\n        SmartDialog.showToast('点击弹窗保存截图');\n        showDialog(\n          context: Get.context!,\n          builder: (context) => GestureDetector(\n            onTap: () {\n              Get.back();\n              ImageUtils.saveByteImg(\n                bytes: value,\n                fileName: 'screenshot_${ImageUtils.time}',\n              );\n            },\n            child: Align(\n              alignment: Alignment.centerRight,\n              child: Padding(\n                padding: const EdgeInsets.only(right: 12),\n                child: ConstrainedBox(\n                  constraints: BoxConstraints(\n                    maxWidth: min(Get.width / 3, 350),\n                  ),\n                  child: DecoratedBox(\n                    decoration: BoxDecoration(\n                      border: Border.all(\n                        width: 5,\n                        color: Get.theme.colorScheme.surface,\n                      ),\n                    ),\n                    child: Padding(\n                      padding: const EdgeInsets.all(5),\n                      child: Image.memory(value),\n                    ),\n                  ),\n                ),\n              ),\n            ),\n          ),\n        );\n      } else {\n        SmartDialog.showToast('截图失败');\n      }\n    });\n  }\n\n  bool onPopInvokedWithResult(bool didPop, Object? result) {\n    if (didPop) {\n      if (Platform.isAndroid) {\n        _disableAutoEnterPipIfNeeded();\n      }\n      return true;\n    }\n    if (controlsLock.value) {\n      onLockControl(false);\n      return true;\n    }\n    if (isDesktopPip) {\n      exitDesktopPip();\n      return true;\n    }\n    if (isFullScreen.value) {\n      triggerFullScreen(status: false);\n      return true;\n    }\n    return false;\n  }\n}\n"
  },
  {
    "path": "lib/plugin/pl_player/models/audio_output_type.dart",
    "content": "import 'package:PiliPlus/models/common/enum_with_label.dart';\n\nenum AudioOutput implements EnumWithLabel {\n  opensles('OpenSL ES'),\n  aaudio('AAudio'),\n  audiotrack('AudioTrack')\n  ;\n\n  static final defaultValue = values.map((e) => e.name).join(',');\n\n  @override\n  final String label;\n  const AudioOutput(this.label);\n}\n"
  },
  {
    "path": "lib/plugin/pl_player/models/bottom_control_type.dart",
    "content": "enum BottomControlType {\n  playOrPause,\n  pre,\n  next,\n  time,\n  episode,\n  fit,\n  subtitle,\n  speed,\n  fullscreen,\n  viewPoints,\n  superResolution,\n  dmChart,\n  qa,\n  aiTranslate,\n}\n"
  },
  {
    "path": "lib/plugin/pl_player/models/bottom_progress_behavior.dart",
    "content": "enum BtmProgressBehavior {\n  alwaysShow('始终展示'),\n  alwaysHide('始终隐藏'),\n  onlyShowFullScreen('仅全屏时展示'),\n  onlyHideFullScreen('仅全屏时隐藏')\n  ;\n\n  final String desc;\n  const BtmProgressBehavior(this.desc);\n}\n"
  },
  {
    "path": "lib/plugin/pl_player/models/data_source.dart",
    "content": "import 'package:PiliPlus/utils/path_utils.dart';\nimport 'package:path/path.dart' as path;\n\nsealed class DataSource {\n  final String videoSource;\n  final String? audioSource;\n\n  DataSource({\n    required this.videoSource,\n    required this.audioSource,\n  });\n}\n\nclass NetworkSource extends DataSource {\n  NetworkSource({\n    required super.videoSource,\n    required super.audioSource,\n  });\n}\n\nclass FileSource extends DataSource {\n  final String dir;\n  final bool isMp4;\n\n  FileSource({\n    required this.dir,\n    required this.isMp4,\n    required bool hasDashAudio,\n    required String typeTag,\n  }) : super(\n         videoSource: path.join(\n           dir,\n           typeTag,\n           isMp4 ? PathUtils.videoNameType1 : PathUtils.videoNameType2,\n         ),\n         audioSource: isMp4 || !hasDashAudio\n             ? null\n             : path.join(dir, typeTag, PathUtils.audioNameType2),\n       );\n}\n"
  },
  {
    "path": "lib/plugin/pl_player/models/data_status.dart",
    "content": "import 'package:get/get.dart';\n\nenum DataStatus { none, loading, loaded, error }\n\nextension PlPlayerDataStatus on Rx<DataStatus> {\n  bool get none => value == DataStatus.none;\n  bool get loading => value == DataStatus.loading;\n  bool get loaded => value == DataStatus.loaded;\n  bool get error => value == DataStatus.error;\n}\n"
  },
  {
    "path": "lib/plugin/pl_player/models/double_tap_type.dart",
    "content": "enum DoubleTapType { left, center, right }\n"
  },
  {
    "path": "lib/plugin/pl_player/models/duration.dart",
    "content": "extension DurationExtension on Duration {\n  /// Returns clamp of [Duration] between [min] and [max].\n  Duration clamp(Duration min, Duration max) {\n    if (this < min) return min;\n    if (this > max) return max;\n    return this;\n  }\n\n  /// Returns a [String] representation of [Duration].\n  String label({Duration? reference}) {\n    reference ??= this;\n    if (reference > const Duration(days: 1)) {\n      final days = inDays.toString().padLeft(3, '0');\n      final hours = (inHours - (inDays * 24)).toString().padLeft(2, '0');\n      final minutes = (inMinutes - (inHours * 60)).toString().padLeft(2, '0');\n      final seconds = (inSeconds - (inMinutes * 60)).toString().padLeft(2, '0');\n      return '$days:$hours:$minutes:$seconds';\n    } else if (reference > const Duration(hours: 1)) {\n      final hours = inHours.toString().padLeft(2, '0');\n      final minutes = (inMinutes - (inHours * 60)).toString().padLeft(2, '0');\n      final seconds = (inSeconds - (inMinutes * 60)).toString().padLeft(2, '0');\n      return '$hours:$minutes:$seconds';\n    } else {\n      final minutes = inMinutes.toString().padLeft(2, '0');\n      final seconds = (inSeconds - (inMinutes * 60)).toString().padLeft(2, '0');\n      return '$minutes:$seconds';\n    }\n  }\n}\n"
  },
  {
    "path": "lib/plugin/pl_player/models/fullscreen_mode.dart",
    "content": "const double kScreenRatio = 1.2;\n\n// 全屏模式\nenum FullScreenMode {\n  // 根据内容自适应\n  auto('按视频方向（默认）'),\n  // 不改变当前方向\n  none('不改变当前方向'),\n  // 始终竖屏\n  vertical('强制竖屏'),\n  // 始终横屏\n  horizontal('强制横屏'),\n  // 屏幕长宽比 < kScreenRatio 或为竖屏视频时竖屏，否则横屏\n  ratio('屏幕长宽比<$kScreenRatio或为竖屏视频时竖屏，否则横屏'),\n  // 强制重力转屏（仅安卓）\n  gravity('忽略系统方向锁定，强制按重力转屏（仅安卓）')\n  ;\n\n  final String desc;\n  const FullScreenMode(this.desc);\n}\n"
  },
  {
    "path": "lib/plugin/pl_player/models/gesture_type.dart",
    "content": "// ignore_for_file: constant_identifier_names\n\nenum GestureType {\n  left,\n  center,\n  right,\n  horizontal,\n  center_up,\n  center_down,\n}\n"
  },
  {
    "path": "lib/plugin/pl_player/models/heart_beat_type.dart",
    "content": "enum HeartBeatType {\n  playing,\n  status,\n  completed,\n}\n"
  },
  {
    "path": "lib/plugin/pl_player/models/hwdec_type.dart",
    "content": "// mpv --hwdec=help\nenum HwDecType {\n  no('no', '启用软解'),\n  auto('auto', '启用任意可用解码器'),\n  autoSafe('auto-safe', '启用最佳解码器'),\n  autoCopy('auto-copy', '启用带拷贝功能的最佳解码器'),\n  d3d12va('d3d12va', 'DirectX 12 (Windows10 及以上)'),\n  d3d12vaCopy('d3d12va-copy', 'DirectX 12 (Windows10 及以上) (非直通)'),\n  d3d11va('d3d11va', 'DirectX 11 (Windows8 及以上)'),\n  d3d11vaCopy('d3d11va-copy', 'DirectX 11 (Windows8 及以上) (非直通)'),\n  dxva2('dxva2', 'DXVA2 (Windows7 及以上)'),\n  dxva2Copy('dxva2-copy', 'DXVA2 (Windows7 及以上) (非直通)'),\n  videotoolbox('videotoolbox', 'VideoToolbox (macOS / iOS)'),\n  videotoolboxCopy('videotoolbox-copy', 'VideoToolbox (macOS / iOS) (非直通)'),\n  vaapi('vaapi', 'VAAPI (Linux)'),\n  vaapiCopy('vaapi-copy', 'VAAPI (Linux) (非直通)'),\n  nvdec('nvdec', 'NVDEC (NVIDIA独占)'),\n  nvdecCopy('nvdec-copy', 'NVDEC (NVIDIA独占) (非直通)'),\n  drm('drm', 'DRM (Linux)'),\n  drmCopy('drm-copy', 'DRM (Linux) (非直通)'),\n  vulkan('vulkan', 'Vulkan (全平台) (实验性)'),\n  vulkanCopy('vulkan-copy', 'Vulkan (全平台) (实验性) (非直通)'),\n  vdpau('vdpau', 'VDPAU (Linux)'),\n  vdpauCopy('vdpau-copy', 'VDPAU (Linux) (非直通)'),\n  mediacodec('mediacodec', 'MediaCodec (Android)'),\n  mediacodecCopy('mediacodec-copy', 'MediaCodec (Android) (非直通)'),\n  cuda('cuda', 'CUDA (NVIDIA独占) (过时)'),\n  cudaCopy('cuda-copy', 'CUDA (NVIDIA独占) (过时) (非直通)'),\n  crystalhd('crystalhd', 'CrystalHD (全平台) (过时)'),\n  rkmpp('rkmpp', 'Rockchip MPP (仅部分Rockchip芯片)'),\n  amf('amf', 'AMF (AMD独占)'),\n  amfCopy('amf-copy', 'AMF (AMD独占) (非直通)'),\n  qsv('qsv', 'Quick Sync Video (Intel独占)'),\n  qsvCopy('qsv-copy', 'Quick Sync Video (Intel独占) (非直通)')\n  ;\n\n  final String hwdec;\n  final String desc;\n  const HwDecType(this.hwdec, this.desc);\n}\n"
  },
  {
    "path": "lib/plugin/pl_player/models/play_repeat.dart",
    "content": "import 'package:PiliPlus/models/common/enum_with_label.dart';\n\nenum PlayRepeat implements EnumWithLabel {\n  pause('播完暂停'),\n  listOrder('顺序播放'),\n  singleCycle('单个循环'),\n  listCycle('列表循环'),\n  autoPlayRelated('自动连播')\n  ;\n\n  @override\n  final String label;\n  const PlayRepeat(this.label);\n}\n"
  },
  {
    "path": "lib/plugin/pl_player/models/play_speed.dart",
    "content": "enum PlaySpeed {\n  pointFive(0.5),\n  pointSevenFive(0.75),\n\n  one(1.0),\n  onePointTwoFive(1.25),\n  onePointFive(1.5),\n  onePointSevenFive(1.75),\n\n  two(2.0),\n  three(3.0)\n  ;\n\n  final double value;\n  const PlaySpeed(this.value);\n}\n"
  },
  {
    "path": "lib/plugin/pl_player/models/play_status.dart",
    "content": "import 'package:get/get.dart';\n\nenum PlayerStatus {\n  completed,\n  playing,\n  paused\n  ;\n\n  bool get isCompleted => this == PlayerStatus.completed;\n  bool get isPlaying => this == PlayerStatus.playing;\n  bool get isPaused => this == PlayerStatus.paused;\n}\n\ntypedef PlPlayerStatus = Rx<PlayerStatus>;\n\nextension PlPlayerStatusExt on PlPlayerStatus {\n  bool get isPlaying => value.isPlaying;\n  bool get isPaused => value.isPaused;\n  bool get isCompleted => value.isCompleted;\n}\n"
  },
  {
    "path": "lib/plugin/pl_player/models/video_fit_type.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:flutter/material.dart' show BoxFit;\n\nenum VideoFitType {\n  fill('拉伸', boxFit: BoxFit.fill),\n  contain('自动', boxFit: BoxFit.contain),\n  cover('裁剪', boxFit: BoxFit.cover),\n  fitWidth('等宽', boxFit: BoxFit.fitWidth),\n  fitHeight('等高', boxFit: BoxFit.fitHeight),\n  none('原始', boxFit: BoxFit.none),\n  scaleDown('限制', boxFit: BoxFit.scaleDown),\n  ratio_4x3('4:3', aspectRatio: 4 / 3),\n  ratio_16x9('16:9', aspectRatio: StyleString.aspectRatio16x9)\n  ;\n\n  final String desc;\n  final BoxFit boxFit;\n  final double? aspectRatio;\n  const VideoFitType(\n    this.desc, {\n    this.boxFit = BoxFit.contain,\n    this.aspectRatio,\n  });\n}\n"
  },
  {
    "path": "lib/plugin/pl_player/utils/danmaku_options.dart",
    "content": "import 'package:PiliPlus/utils/extension/box_ext.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:canvas_danmaku/canvas_danmaku.dart';\n\nabstract final class DanmakuOptions {\n  static final Set<int> blockTypes = Pref.danmakuBlockType;\n  static bool blockColorful = blockTypes.contains(6);\n\n  static int danmakuWeight = Pref.danmakuWeight;\n  static double danmakuFontScaleFS = Pref.danmakuFontScaleFS;\n  static double danmakuFontScale = Pref.danmakuFontScale;\n  static int danmakuFontWeight = Pref.danmakuFontWeight;\n  static double danmakuShowArea = Pref.danmakuShowArea;\n  static double danmakuDuration = Pref.danmakuDuration;\n  static double danmakuStaticDuration = Pref.danmakuStaticDuration;\n  static double danmakuStrokeWidth = Pref.danmakuStrokeWidth;\n  static bool danmakuFixedV = Pref.danmakuFixedV;\n  static bool danmakuStatic2Scroll = Pref.danmakuStatic2Scroll;\n  static bool danmakuMassiveMode = Pref.danmakuMassiveMode;\n  static double danmakuLineHeight = Pref.danmakuLineHeight;\n\n  static bool get sameFontScale => danmakuFontScale == danmakuFontScaleFS;\n\n  static DanmakuOption get({\n    required bool notFullscreen,\n    double speed = 1.0,\n  }) {\n    return DanmakuOption(\n      fontSize: 15 * (notFullscreen ? danmakuFontScale : danmakuFontScaleFS),\n      fontWeight: danmakuFontWeight,\n      area: danmakuShowArea,\n      duration: danmakuDuration / speed,\n      staticDuration: danmakuStaticDuration / speed,\n      hideBottom: blockTypes.contains(4),\n      hideScroll: blockTypes.contains(2),\n      hideTop: blockTypes.contains(5),\n      hideSpecial: blockTypes.contains(7),\n      strokeWidth: danmakuStrokeWidth,\n      scrollFixedVelocity: danmakuFixedV,\n      massiveMode: danmakuMassiveMode,\n      static2Scroll: danmakuStatic2Scroll,\n      safeArea: true,\n      lineHeight: danmakuLineHeight,\n    );\n  }\n\n  static Future<void>? save(double danmakuOpacity) {\n    return GStorage.setting.putAllNE({\n      SettingBoxKey.danmakuBlockType: blockTypes.toList(),\n      SettingBoxKey.danmakuShowArea: danmakuShowArea,\n      SettingBoxKey.danmakuFontScale: danmakuFontScale,\n      SettingBoxKey.danmakuFontScaleFS: danmakuFontScaleFS,\n      SettingBoxKey.danmakuDuration: danmakuDuration,\n      SettingBoxKey.danmakuStaticDuration: danmakuStaticDuration,\n      SettingBoxKey.danmakuStrokeWidth: danmakuStrokeWidth,\n      SettingBoxKey.danmakuFontWeight: danmakuFontWeight,\n      SettingBoxKey.danmakuLineHeight: danmakuLineHeight,\n      SettingBoxKey.danmakuMassiveMode: danmakuMassiveMode,\n      SettingBoxKey.danmakuStatic2Scroll: danmakuStatic2Scroll,\n      SettingBoxKey.danmakuFixedV: danmakuFixedV,\n      SettingBoxKey.danmakuWeight: danmakuWeight,\n      SettingBoxKey.danmakuOpacity: danmakuOpacity,\n    });\n  }\n}\n"
  },
  {
    "path": "lib/plugin/pl_player/utils/fullscreen.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:auto_orientation/auto_orientation.dart';\nimport 'package:flutter/services.dart';\n\nbool _isDesktopFullScreen = false;\n\n@pragma('vm:notify-debugger-on-exception')\nFuture<void> enterDesktopFullscreen({bool inAppFullScreen = false}) async {\n  if (!inAppFullScreen && !_isDesktopFullScreen) {\n    _isDesktopFullScreen = true;\n    try {\n      await const MethodChannel(\n        'com.alexmercerind/media_kit_video',\n      ).invokeMethod('Utils.EnterNativeFullscreen');\n    } catch (_) {}\n  }\n}\n\n@pragma('vm:notify-debugger-on-exception')\nFuture<void> exitDesktopFullscreen() async {\n  if (_isDesktopFullScreen) {\n    _isDesktopFullScreen = false;\n    try {\n      await const MethodChannel(\n        'com.alexmercerind/media_kit_video',\n      ).invokeMethod('Utils.ExitNativeFullscreen');\n    } catch (_) {}\n  }\n}\n\n//横屏\n@pragma('vm:notify-debugger-on-exception')\nFuture<void> landscape() async {\n  try {\n    await AutoOrientation.landscapeAutoMode(forceSensor: true);\n  } catch (_) {}\n}\n\n//竖屏\nFuture<void> verticalScreenForTwoSeconds() async {\n  await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);\n  await autoScreen();\n}\n\n//全向\nbool allowRotateScreen = Pref.allowRotateScreen;\nFuture<void> autoScreen() async {\n  if (PlatformUtils.isMobile && allowRotateScreen) {\n    await SystemChrome.setPreferredOrientations([\n      DeviceOrientation.portraitUp,\n      // DeviceOrientation.portraitDown,\n      DeviceOrientation.landscapeLeft,\n      DeviceOrientation.landscapeRight,\n    ]);\n  }\n}\n\nFuture<void> fullAutoModeForceSensor() {\n  return AutoOrientation.fullAutoMode(forceSensor: true);\n}\n\nbool _showStatusBar = true;\nFuture<void> hideStatusBar() async {\n  if (!_showStatusBar) {\n    return;\n  }\n  _showStatusBar = false;\n  await SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);\n}\n\n//退出全屏显示\nFuture<void> showStatusBar() async {\n  if (_showStatusBar) {\n    return;\n  }\n  _showStatusBar = true;\n  SystemUiMode mode;\n  if (Platform.isAndroid && (await Utils.sdkInt < 29)) {\n    mode = SystemUiMode.manual;\n  } else {\n    mode = SystemUiMode.edgeToEdge;\n  }\n  await SystemChrome.setEnabledSystemUIMode(\n    mode,\n    overlays: SystemUiOverlay.values,\n  );\n}\n"
  },
  {
    "path": "lib/plugin/pl_player/view/view.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\nimport 'dart:math' as math;\nimport 'dart:ui' as ui;\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/widgets/cropped_image.dart';\nimport 'package:PiliPlus/common/widgets/custom_icon.dart';\nimport 'package:PiliPlus/common/widgets/disabled_icon.dart';\nimport 'package:PiliPlus/common/widgets/gesture/immediate_tap_gesture_recognizer.dart';\nimport 'package:PiliPlus/common/widgets/gesture/mouse_interactive_viewer.dart';\nimport 'package:PiliPlus/common/widgets/loading_widget.dart';\nimport 'package:PiliPlus/common/widgets/pair.dart';\nimport 'package:PiliPlus/common/widgets/player_bar.dart';\nimport 'package:PiliPlus/common/widgets/progress_bar/audio_video_progress_bar.dart';\nimport 'package:PiliPlus/common/widgets/progress_bar/segment_progress_bar.dart';\nimport 'package:PiliPlus/common/widgets/view_safe_area.dart';\nimport 'package:PiliPlus/models/common/sponsor_block/action_type.dart';\nimport 'package:PiliPlus/models/common/sponsor_block/post_segment_model.dart';\nimport 'package:PiliPlus/models/common/sponsor_block/segment_type.dart';\nimport 'package:PiliPlus/models/common/super_resolution_type.dart';\nimport 'package:PiliPlus/models/common/video/video_quality.dart';\nimport 'package:PiliPlus/models/video/play/url.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/episode.dart' as ugc;\nimport 'package:PiliPlus/models_new/video/video_detail/episode.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/section.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/ugc_season.dart';\nimport 'package:PiliPlus/pages/common/common_intro_controller.dart';\nimport 'package:PiliPlus/pages/danmaku/danmaku_model.dart';\nimport 'package:PiliPlus/pages/live_room/widgets/bottom_control.dart'\n    as live_bottom;\nimport 'package:PiliPlus/pages/video/controller.dart';\nimport 'package:PiliPlus/pages/video/introduction/pgc/controller.dart';\nimport 'package:PiliPlus/pages/video/post_panel/popup_menu_text.dart';\nimport 'package:PiliPlus/pages/video/post_panel/view.dart';\nimport 'package:PiliPlus/pages/video/widgets/header_control.dart';\nimport 'package:PiliPlus/plugin/pl_player/controller.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/bottom_control_type.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/bottom_progress_behavior.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/data_status.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/double_tap_type.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/fullscreen_mode.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/gesture_type.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/play_status.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/video_fit_type.dart';\nimport 'package:PiliPlus/plugin/pl_player/widgets/app_bar_ani.dart';\nimport 'package:PiliPlus/plugin/pl_player/widgets/backward_seek.dart';\nimport 'package:PiliPlus/plugin/pl_player/widgets/bottom_control.dart';\nimport 'package:PiliPlus/plugin/pl_player/widgets/common_btn.dart';\nimport 'package:PiliPlus/plugin/pl_player/widgets/forward_seek.dart';\nimport 'package:PiliPlus/plugin/pl_player/widgets/mpv_convert_webp.dart';\nimport 'package:PiliPlus/plugin/pl_player/widgets/play_pause_btn.dart';\nimport 'package:PiliPlus/utils/duration_utils.dart';\nimport 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\nimport 'package:PiliPlus/utils/image_utils.dart';\nimport 'package:PiliPlus/utils/path_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:canvas_danmaku/canvas_danmaku.dart';\nimport 'package:collection/collection.dart';\nimport 'package:easy_debounce/easy_throttle.dart';\nimport 'package:fl_chart/fl_chart.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart'\n    show RenderProxyBox, SemanticsConfiguration;\nimport 'package:flutter/services.dart';\nimport 'package:flutter_cache_manager/flutter_cache_manager.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:flutter_volume_controller/flutter_volume_controller.dart';\nimport 'package:font_awesome_flutter/font_awesome_flutter.dart';\nimport 'package:get/get.dart';\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\nimport 'package:media_kit_video/media_kit_video.dart';\nimport 'package:screen_brightness_platform_interface/screen_brightness_platform_interface.dart';\nimport 'package:window_manager/window_manager.dart';\n\npart 'widgets.dart';\n\nclass PLVideoPlayer extends StatefulWidget {\n  const PLVideoPlayer({\n    required this.maxWidth,\n    required this.maxHeight,\n    required this.plPlayerController,\n    this.videoDetailController,\n    this.introController,\n    required this.headerControl,\n    this.bottomControl,\n    this.danmuWidget,\n    this.showEpisodes,\n    this.showViewPoints,\n    this.fill = Colors.black,\n    this.alignment = Alignment.center,\n    super.key,\n  });\n\n  final double maxWidth;\n  final double maxHeight;\n  final PlPlayerController plPlayerController;\n  final VideoDetailController? videoDetailController;\n  final CommonIntroController? introController;\n  final Widget headerControl;\n  final Widget? bottomControl;\n  final Widget? danmuWidget;\n  final void Function([\n    int?,\n    UgcSeason?,\n    List<ugc.BaseEpisodeItem>?,\n    String?,\n    int?,\n    int?,\n  ])?\n  showEpisodes;\n  final VoidCallback? showViewPoints;\n  final Color fill;\n  final Alignment alignment;\n\n  @override\n  State<PLVideoPlayer> createState() => _PLVideoPlayerState();\n}\n\nclass _PLVideoPlayerState extends State<PLVideoPlayer>\n    with WidgetsBindingObserver, TickerProviderStateMixin {\n  late AnimationController animationController;\n  late VideoController videoController;\n  late final CommonIntroController introController = widget.introController!;\n  late final VideoDetailController videoDetailController =\n      widget.videoDetailController!;\n\n  final _playerKey = GlobalKey();\n  final _videoKey = GlobalKey();\n\n  final RxDouble _brightnessValue = 0.0.obs;\n  final RxBool _brightnessIndicator = false.obs;\n  Timer? _brightnessTimer;\n\n  late FullScreenMode mode;\n\n  late final RxBool showRestoreScaleBtn = false.obs;\n\n  GestureType? _gestureType;\n\n  Offset initialFocalPoint = Offset.zero;\n\n  //播放器放缩\n  bool interacting = false;\n\n  // 阅读器限制\n  // Timer? _accessibilityDebounce;\n  // double _lastAnnouncedValue = -1;\n\n  bool _pauseDueToPauseUponEnteringBackgroundMode = false;\n\n  StreamSubscription? _brightnessListener;\n\n  int? tmpSubtitlePaddingB;\n  StreamSubscription? _controlsListener;\n  void _onControlChanged(bool val) {\n    final visible = val && !plPlayerController.controlsLock.value;\n\n    if ((widget.headerControl.key as GlobalKey<TimeBatteryMixin>).currentState\n        case final state?) {\n      if (state.mounted) {\n        state.getBatteryLevelIfNeeded();\n        state.provider\n          ?..startIfNeeded()\n          ..muted = !visible;\n        if (visible) {\n          state.startClock();\n        } else {\n          state.stopClock();\n        }\n      }\n    }\n\n    if (visible) {\n      animationController.forward();\n    } else {\n      animationController.reverse();\n    }\n\n    if (widget.videoDetailController case final controller?) {\n      if (controller.vttSubtitlesIndex.value != 0) {\n        if (visible) {\n          const int minPadding = 70;\n          if (plPlayerController.subtitlePaddingB < minPadding) {\n            tmpSubtitlePaddingB = plPlayerController.subtitlePaddingB;\n            plPlayerController\n              ..subtitlePaddingB = minPadding\n              ..subtitleConfig.value = plPlayerController.getSubConfig;\n          }\n        } else {\n          if (tmpSubtitlePaddingB != null) {\n            plPlayerController\n              ..subtitlePaddingB = tmpSubtitlePaddingB!\n              ..subtitleConfig.value = plPlayerController.getSubConfig;\n            tmpSubtitlePaddingB = null;\n          }\n        }\n      }\n    }\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    WidgetsBinding.instance.addObserver(this);\n\n    _controlsListener = plPlayerController.showControls.listen(\n      _onControlChanged,\n    );\n\n    transformationController = TransformationController();\n\n    animationController = AnimationController(\n      vsync: this,\n      duration: const Duration(milliseconds: 100),\n    );\n    videoController = plPlayerController.videoController!;\n\n    if (PlatformUtils.isMobile) {\n      Future.microtask(() async {\n        try {\n          FlutterVolumeController.updateShowSystemUI(true);\n          plPlayerController.volume.value =\n              (await FlutterVolumeController.getVolume())!;\n          FlutterVolumeController.addListener((double value) {\n            if (mounted && !plPlayerController.volumeInterceptEventStream) {\n              plPlayerController.volume.value = value;\n              if (Platform.isIOS && !FlutterVolumeController.showSystemUI) {\n                plPlayerController\n                  ..volumeIndicator.value = true\n                  ..volumeTimer?.cancel()\n                  ..volumeTimer = Timer(const Duration(milliseconds: 800), () {\n                    if (mounted) {\n                      plPlayerController.volumeIndicator.value = false;\n                    }\n                  });\n              }\n            }\n          }, emitOnStart: false);\n        } catch (_) {}\n      });\n\n      Future.microtask(() async {\n        try {\n          _brightnessValue.value =\n              await ScreenBrightnessPlatform.instance.application;\n\n          void listener(double value) {\n            if (mounted) {\n              _brightnessValue.value = value;\n            }\n          }\n\n          _brightnessListener =\n              Platform.isIOS || plPlayerController.setSystemBrightness\n              ? ScreenBrightnessPlatform\n                    .instance\n                    .onSystemScreenBrightnessChanged\n                    .listen(listener)\n              : ScreenBrightnessPlatform\n                    .instance\n                    .onApplicationScreenBrightnessChanged\n                    .listen(listener);\n        } catch (_) {}\n      });\n    }\n\n    if (plPlayerController.enableTapDm) {\n      _tapGestureRecognizer = ImmediateTapGestureRecognizer(\n        onTapDown: plPlayerController.enableShowDanmaku.value\n            ? _onTapDown\n            : null,\n        onTapUp: _onTapUp,\n        onTapCancel: _removeDmAction,\n      );\n\n      _danmakuListener = plPlayerController.enableShowDanmaku.listen((value) {\n        if (!value) _removeDmAction();\n        _tapGestureRecognizer.onTapDown = value ? _onTapDown : null;\n      });\n    } else {\n      _tapGestureRecognizer = ImmediateTapGestureRecognizer(onTapUp: _onTapUp);\n    }\n\n    _doubleTapGestureRecognizer = DoubleTapGestureRecognizer()\n      ..onDoubleTapDown = _onDoubleTapDown;\n  }\n\n  @override\n  void didChangeAppLifecycleState(AppLifecycleState state) {\n    if (!plPlayerController.continuePlayInBackground.value) {\n      late final player = plPlayerController.videoPlayerController;\n      if (const [\n        AppLifecycleState.paused,\n        AppLifecycleState.detached,\n      ].contains(state)) {\n        if (player != null && player.state.playing) {\n          _pauseDueToPauseUponEnteringBackgroundMode = true;\n          player.pause();\n        }\n      } else {\n        if (_pauseDueToPauseUponEnteringBackgroundMode) {\n          _pauseDueToPauseUponEnteringBackgroundMode = false;\n          player?.play();\n        }\n      }\n    }\n  }\n\n  Future<void> setBrightness(double value) async {\n    try {\n      if (Platform.isIOS || plPlayerController.setSystemBrightness) {\n        await ScreenBrightnessPlatform.instance.setSystemScreenBrightness(\n          value,\n        );\n      } else {\n        await ScreenBrightnessPlatform.instance.setApplicationScreenBrightness(\n          value,\n        );\n      }\n    } catch (_) {}\n    _brightnessIndicator.value = true;\n    _brightnessTimer?.cancel();\n    _brightnessTimer = Timer(const Duration(milliseconds: 200), () {\n      if (mounted) {\n        _brightnessIndicator.value = false;\n      }\n    });\n    plPlayerController.brightness.value = value;\n  }\n\n  @override\n  void dispose() {\n    WidgetsBinding.instance.removeObserver(this);\n    _danmakuListener?.cancel();\n    _tapGestureRecognizer.dispose();\n    _longPressRecognizer?.dispose();\n    _doubleTapGestureRecognizer.dispose();\n    _brightnessListener?.cancel();\n    _controlsListener?.cancel();\n    animationController.dispose();\n    if (PlatformUtils.isMobile) {\n      FlutterVolumeController.removeListener();\n    }\n    transformationController.dispose();\n    _removeDmAction();\n    super.dispose();\n  }\n\n  // 动态构建底部控制条\n  Widget buildBottomControl(\n    VideoDetailController videoDetailController,\n    bool isLandscape,\n  ) {\n    final videoDetail = introController.videoDetail.value;\n    final isSeason = videoDetail.ugcSeason != null;\n    final isPart = videoDetail.pages != null && videoDetail.pages!.length > 1;\n    final isPgc = !videoDetailController.isUgc;\n    final isPlayAll = videoDetailController.isPlayAll;\n    final anySeason = isSeason || isPart || isPgc || isPlayAll;\n    final isFullScreen = this.isFullScreen;\n    final double widgetWidth = isLandscape && isFullScreen ? 42 : 35;\n\n    Widget progressWidget(\n      BottomControlType bottomControl,\n    ) => switch (bottomControl) {\n      /// 播放暂停\n      BottomControlType.playOrPause => PlayOrPauseButton(\n        plPlayerController: plPlayerController,\n      ),\n\n      /// 上一集\n      BottomControlType.pre => ComBtn(\n        width: widgetWidth,\n        height: 30,\n        tooltip: '上一集',\n        icon: const Icon(\n          Icons.skip_previous,\n          size: 22,\n          color: Colors.white,\n        ),\n        onTap: () {\n          if (!introController.prevPlay()) {\n            SmartDialog.showToast('已经是第一集了');\n          }\n        },\n      ),\n\n      /// 下一集\n      BottomControlType.next => ComBtn(\n        width: widgetWidth,\n        height: 30,\n        tooltip: '下一集',\n        icon: const Icon(\n          Icons.skip_next,\n          size: 22,\n          color: Colors.white,\n        ),\n        onTap: () {\n          if (!introController.nextPlay()) {\n            SmartDialog.showToast('已经是最后一集了');\n          }\n        },\n      ),\n\n      /// 时间进度\n      BottomControlType.time => Obx(\n        () => _VideoTime(\n          position: DurationUtils.formatDuration(\n            plPlayerController.positionSeconds.value,\n          ),\n          duration: DurationUtils.formatDuration(\n            plPlayerController.duration.value.inSeconds,\n          ),\n        ),\n      ),\n\n      /// 高能进度条\n      BottomControlType.dmChart => Obx(\n        () {\n          final list = videoDetailController.dmTrend.value?.dataOrNull;\n          if (list != null && list.isNotEmpty) {\n            final show = videoDetailController.showDmTrendChart.value;\n            return ComBtn(\n              width: widgetWidth,\n              height: 30,\n              tooltip: '高能进度条',\n              icon: DisabledIcon(\n                disable: !show,\n                child: const Icon(\n                  Icons.show_chart,\n                  size: 22,\n                  color: Colors.white,\n                ),\n              ),\n              onTap: () => videoDetailController.showDmTrendChart.value = !show,\n            );\n          }\n          return const SizedBox.shrink();\n        },\n      ),\n\n      /// 超分辨率\n      BottomControlType.superResolution => Obx(\n        () {\n          final type = plPlayerController.superResolutionType.value;\n          return PopupMenuButton<SuperResolutionType>(\n            tooltip: '超分辨率',\n            requestFocus: false,\n            initialValue: type,\n            color: Colors.black.withValues(alpha: 0.8),\n            itemBuilder: (context) {\n              return SuperResolutionType.values\n                  .map(\n                    (type) => PopupMenuItem<SuperResolutionType>(\n                      height: 35,\n                      padding: const EdgeInsets.only(left: 30),\n                      value: type,\n                      onTap: () => plPlayerController.setShader(type),\n                      child: Text(\n                        type.label,\n                        style: const TextStyle(\n                          color: Colors.white,\n                          fontSize: 13,\n                        ),\n                      ),\n                    ),\n                  )\n                  .toList();\n            },\n            child: Padding(\n              padding: const EdgeInsets.symmetric(horizontal: 8),\n              child: Text(\n                type.label,\n                style: const TextStyle(color: Colors.white, fontSize: 13),\n              ),\n            ),\n          );\n        },\n      ),\n\n      /// 分段信息\n      BottomControlType.viewPoints => Obx(\n        () {\n          if (videoDetailController.viewPointList.isNotEmpty) {\n            final show = videoDetailController.showVP.value;\n            return ComBtn(\n              width: widgetWidth,\n              height: 30,\n              tooltip: '分段信息',\n              icon: DisabledIcon(\n                iconSize: 22,\n                color: Colors.white,\n                disable: !show,\n                child: Transform.rotate(\n                  angle: math.pi / 2,\n                  child: const Icon(\n                    Icons.reorder,\n                    size: 22,\n                    color: Colors.white,\n                  ),\n                ),\n              ),\n              onTap: widget.showViewPoints,\n              onLongPress: () {\n                Feedback.forLongPress(context);\n                videoDetailController.showVP.value = !show;\n              },\n              onSecondaryTap: PlatformUtils.isMobile\n                  ? null\n                  : () => videoDetailController.showVP.value = !show,\n            );\n          }\n          return const SizedBox.shrink();\n        },\n      ),\n\n      /// 选集\n      BottomControlType.episode => ComBtn(\n        width: widgetWidth,\n        height: 30,\n        tooltip: '选集',\n        icon: const Icon(\n          Icons.list,\n          size: 22,\n          color: Colors.white,\n        ),\n        onTap: () {\n          if (videoDetailController.isFileSource) {\n            // TODO\n            return;\n          }\n          // part -> playAll -> season(pgc)\n          if (isPlayAll && !isPart) {\n            widget.showEpisodes?.call();\n            return;\n          }\n          int? index;\n          int currentCid = plPlayerController.cid!;\n          String bvid = plPlayerController.bvid;\n          List<ugc.BaseEpisodeItem> episodes = [];\n          if (isSeason) {\n            final List<SectionItem> sections = videoDetail.ugcSeason!.sections!;\n            for (int i = 0; i < sections.length; i++) {\n              final List<EpisodeItem> episodesList = sections[i].episodes!;\n              for (final item in episodesList) {\n                if (item.cid == currentCid) {\n                  index = i;\n                  episodes = episodesList;\n                  break;\n                }\n              }\n            }\n          } else if (isPart) {\n            episodes = videoDetail.pages!;\n          } else if (isPgc) {\n            episodes =\n                (introController as PgcIntroController).pgcItem.episodes!;\n          }\n          widget.showEpisodes?.call(\n            index,\n            isSeason ? videoDetail.ugcSeason! : null,\n            isSeason ? null : episodes,\n            bvid,\n            IdUtils.bv2av(bvid),\n            isSeason && isPart\n                ? videoDetailController.seasonCid ?? currentCid\n                : currentCid,\n          );\n        },\n      ),\n\n      /// 画面比例\n      BottomControlType.fit => Obx(\n        () {\n          final fit = plPlayerController.videoFit.value;\n          return PopupMenuButton<VideoFitType>(\n            tooltip: '画面比例',\n            requestFocus: false,\n            initialValue: fit,\n            color: Colors.black.withValues(alpha: 0.8),\n            itemBuilder: (context) {\n              return VideoFitType.values\n                  .map(\n                    (boxFit) => PopupMenuItem<VideoFitType>(\n                      height: 35,\n                      padding: const EdgeInsets.only(left: 30),\n                      value: boxFit,\n                      onTap: () => plPlayerController.toggleVideoFit(boxFit),\n                      child: Text(\n                        boxFit.desc,\n                        style: const TextStyle(\n                          color: Colors.white,\n                          fontSize: 13,\n                        ),\n                      ),\n                    ),\n                  )\n                  .toList();\n            },\n            child: Padding(\n              padding: const EdgeInsets.symmetric(horizontal: 8),\n              child: Text(\n                fit.desc,\n                style: const TextStyle(color: Colors.white, fontSize: 13),\n              ),\n            ),\n          );\n        },\n      ),\n\n      BottomControlType.aiTranslate => Obx(\n        () {\n          final list = videoDetailController.languages.value;\n          if (list != null && list.isNotEmpty) {\n            return PopupMenuButton<String>(\n              tooltip: '翻译',\n              requestFocus: false,\n              initialValue: videoDetailController.currLang.value,\n              color: Colors.black.withValues(alpha: 0.8),\n              itemBuilder: (context) {\n                return [\n                  PopupMenuItem<String>(\n                    height: 35,\n                    value: '',\n                    onTap: () => videoDetailController.setLanguage(''),\n                    child: const Text(\n                      \"关闭翻译\",\n                      style: TextStyle(\n                        color: Colors.white,\n                        fontSize: 13,\n                      ),\n                    ),\n                  ),\n                  ...list.map((e) {\n                    return PopupMenuItem<String>(\n                      height: 35,\n                      value: e.lang,\n                      onTap: () => videoDetailController.setLanguage(e.lang!),\n                      child: Text(\n                        e.title!,\n                        style: const TextStyle(\n                          color: Colors.white,\n                          fontSize: 13,\n                        ),\n                      ),\n                    );\n                  }),\n                ];\n              },\n              child: SizedBox(\n                width: widgetWidth,\n                height: 30,\n                child: const Icon(\n                  Icons.translate,\n                  size: 18,\n                  color: Colors.white,\n                ),\n              ),\n            );\n          }\n          return const SizedBox.shrink();\n        },\n      ),\n\n      /// 字幕\n      BottomControlType.subtitle => Obx(\n        () {\n          if (videoDetailController.subtitles.isNotEmpty) {\n            final val = videoDetailController.vttSubtitlesIndex.value;\n            return PopupMenuButton<int>(\n              tooltip: '字幕',\n              requestFocus: false,\n              initialValue: val,\n              color: Colors.black.withValues(alpha: 0.8),\n              itemBuilder: (context) {\n                return [\n                  PopupMenuItem<int>(\n                    value: 0,\n                    height: 35,\n                    onTap: () => videoDetailController.setSubtitle(0),\n                    child: const Text(\n                      \"关闭字幕\",\n                      style: TextStyle(\n                        color: Colors.white,\n                        fontSize: 13,\n                      ),\n                    ),\n                  ),\n                  ...videoDetailController.subtitles.indexed.map((e) {\n                    return PopupMenuItem<int>(\n                      value: e.$1 + 1,\n                      height: 35,\n                      onTap: () => videoDetailController.setSubtitle(e.$1 + 1),\n                      child: Text(\n                        \"${e.$2.lanDoc}\",\n                        maxLines: 1,\n                        overflow: TextOverflow.ellipsis,\n                        style: const TextStyle(\n                          color: Colors.white,\n                          fontSize: 13,\n                        ),\n                      ),\n                    );\n                  }),\n                ];\n              },\n              child: SizedBox(\n                width: widgetWidth,\n                height: 30,\n                child: val == 0\n                    ? const Icon(\n                        Icons.closed_caption_off_outlined,\n                        size: 22,\n                        color: Colors.white,\n                      )\n                    : const Icon(\n                        Icons.closed_caption_off_rounded,\n                        size: 22,\n                        color: Colors.white,\n                      ),\n              ),\n            );\n          }\n          return const SizedBox.shrink();\n        },\n      ),\n\n      /// 播放速度\n      BottomControlType.speed => Obx(\n        () => PopupMenuButton<double>(\n          tooltip: '倍速',\n          requestFocus: false,\n          initialValue: plPlayerController.playbackSpeed,\n          color: Colors.black.withValues(alpha: 0.8),\n          itemBuilder: (context) {\n            return plPlayerController.speedList\n                .map(\n                  (double speed) => PopupMenuItem<double>(\n                    height: 35,\n                    padding: const EdgeInsets.only(left: 30),\n                    value: speed,\n                    onTap: () => plPlayerController.setPlaybackSpeed(speed),\n                    child: Text(\n                      \"${speed}X\",\n                      style: const TextStyle(color: Colors.white, fontSize: 13),\n                      semanticsLabel: \"$speed倍速\",\n                    ),\n                  ),\n                )\n                .toList();\n          },\n          child: Padding(\n            padding: const EdgeInsets.symmetric(horizontal: 8),\n            child: Text(\n              \"${plPlayerController.playbackSpeed}X\",\n              style: const TextStyle(color: Colors.white, fontSize: 13),\n              semanticsLabel: \"${plPlayerController.playbackSpeed}倍速\",\n            ),\n          ),\n        ),\n      ),\n\n      BottomControlType.qa => Obx(\n        () {\n          final VideoQuality? currentVideoQa =\n              videoDetailController.currentVideoQa.value;\n          if (currentVideoQa == null) {\n            return const SizedBox.shrink();\n          }\n          final PlayUrlModel videoInfo = videoDetailController.data;\n          if (videoInfo.dash == null) {\n            return const SizedBox.shrink();\n          }\n          final List<FormatItem> videoFormat = videoInfo.supportFormats!;\n          final int totalQaSam = videoFormat.length;\n          int usefulQaSam = 0;\n          final List<VideoItem> video = videoInfo.dash!.video!;\n          final Set<int> idSet = {};\n          for (final VideoItem item in video) {\n            final int id = item.id!;\n            if (!idSet.contains(id)) {\n              idSet.add(id);\n              usefulQaSam++;\n            }\n          }\n          return PopupMenuButton<int>(\n            tooltip: '画质',\n            requestFocus: false,\n            initialValue: currentVideoQa.code,\n            color: Colors.black.withValues(alpha: 0.8),\n            itemBuilder: (context) {\n              return List.generate(\n                totalQaSam,\n                (index) {\n                  final item = videoFormat[index];\n                  final enabled = index >= totalQaSam - usefulQaSam;\n                  return PopupMenuItem<int>(\n                    enabled: enabled,\n                    height: 35,\n                    padding: const EdgeInsets.only(left: 15, right: 10),\n                    value: item.quality,\n                    onTap: () async {\n                      if (currentVideoQa.code == item.quality) {\n                        return;\n                      }\n                      final int quality = item.quality!;\n                      final newQa = VideoQuality.fromCode(quality);\n                      videoDetailController\n                        ..plPlayerController.cacheVideoQa = newQa.code\n                        ..currentVideoQa.value = newQa\n                        ..updatePlayer();\n\n                      SmartDialog.showToast(\"画质已变为：${newQa.desc}\");\n\n                      // update\n                      if (!plPlayerController.tempPlayerConf) {\n                        GStorage.setting.put(\n                          await Utils.isWiFi\n                              ? SettingBoxKey.defaultVideoQa\n                              : SettingBoxKey.defaultVideoQaCellular,\n                          quality,\n                        );\n                      }\n                    },\n                    child: Text(\n                      item.newDesc ?? '',\n                      style: enabled\n                          ? const TextStyle(color: Colors.white, fontSize: 13)\n                          : const TextStyle(\n                              color: Color(0x62FFFFFF),\n                              fontSize: 13,\n                            ),\n                    ),\n                  );\n                },\n              );\n            },\n            child: Padding(\n              padding: const EdgeInsets.symmetric(horizontal: 8),\n              child: Text(\n                currentVideoQa.shortDesc,\n                style: const TextStyle(color: Colors.white, fontSize: 13),\n              ),\n            ),\n          );\n        },\n      ),\n\n      /// 全屏\n      BottomControlType.fullscreen => ComBtn(\n        width: widgetWidth,\n        height: 30,\n        tooltip: isFullScreen ? '退出全屏' : '全屏',\n        icon: isFullScreen\n            ? const Icon(\n                Icons.fullscreen_exit,\n                size: 24,\n                color: Colors.white,\n              )\n            : const Icon(\n                Icons.fullscreen,\n                size: 24,\n                color: Colors.white,\n              ),\n        onTap: () =>\n            plPlayerController.triggerFullScreen(status: !isFullScreen),\n        onSecondaryTap: () => plPlayerController.triggerFullScreen(\n          status: !isFullScreen,\n          inAppFullScreen: true,\n        ),\n      ),\n    };\n\n    final isNotFileSource = !plPlayerController.isFileSource;\n\n    List<BottomControlType> userSpecifyItemLeft = [\n      BottomControlType.playOrPause,\n      BottomControlType.time,\n      if (!isNotFileSource || anySeason) ...[\n        BottomControlType.pre,\n        BottomControlType.next,\n      ],\n    ];\n\n    final flag =\n        isFullScreen || plPlayerController.isDesktopPip || maxWidth >= 500;\n    List<BottomControlType> userSpecifyItemRight = [\n      if (isNotFileSource && plPlayerController.showDmChart)\n        BottomControlType.dmChart,\n      if (plPlayerController.isAnim) BottomControlType.superResolution,\n      if (isNotFileSource && plPlayerController.showViewPoints)\n        BottomControlType.viewPoints,\n      if (isNotFileSource && anySeason) BottomControlType.episode,\n      if (flag) BottomControlType.fit,\n      if (isNotFileSource) BottomControlType.aiTranslate,\n      BottomControlType.subtitle,\n      BottomControlType.speed,\n      if (isNotFileSource && flag) BottomControlType.qa,\n      if (!plPlayerController.isDesktopPip) BottomControlType.fullscreen,\n    ];\n    return PlayerBar(\n      children: [\n        Row(\n          mainAxisSize: .min,\n          children: userSpecifyItemLeft.map(progressWidget).toList(),\n        ),\n        Row(\n          mainAxisSize: .min,\n          children: userSpecifyItemRight.map(progressWidget).toList(),\n        ),\n      ],\n    );\n  }\n\n  PlPlayerController get plPlayerController => widget.plPlayerController;\n\n  bool get isFullScreen => plPlayerController.isFullScreen.value;\n\n  late final TransformationController transformationController;\n\n  late ColorScheme colorScheme;\n  late double maxWidth;\n  late double maxHeight;\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    colorScheme = ColorScheme.of(context);\n  }\n\n  void _onInteractionStart(ScaleStartDetails details) {\n    if (plPlayerController.controlsLock.value) return;\n    // 如果起点太靠上则屏蔽\n    final localFocalPoint = details.localFocalPoint;\n    final dx = localFocalPoint.dx;\n    final dy = localFocalPoint.dy;\n    if (dx < 40 || dy < 40) return;\n    if (dx > maxWidth - 40 || dy > maxHeight - 40) return;\n    if (details.pointerCount > 1) {\n      interacting = true;\n    }\n    initialFocalPoint = localFocalPoint;\n    // if (kDebugMode) {\n    //   debugPrint(\"_initialFocalPoint$_initialFocalPoint\");\n    // }\n    _gestureType = null;\n  }\n\n  void _onInteractionUpdate(ScaleUpdateDetails details) {\n    showRestoreScaleBtn.value =\n        transformationController.value.storage[0] != 1.0;\n    if (interacting || initialFocalPoint == Offset.zero) {\n      return;\n    }\n    Offset cumulativeDelta = details.localFocalPoint - initialFocalPoint;\n    if (details.pointerCount > 1 && cumulativeDelta.distanceSquared < 2.25) {\n      interacting = true;\n      _gestureType = null;\n      return;\n    }\n\n    /// 锁定时禁用\n    if (plPlayerController.controlsLock.value) return;\n\n    if (_gestureType == null) {\n      if (cumulativeDelta.distanceSquared < 1) return;\n      final dx = cumulativeDelta.dx.abs();\n      final dy = cumulativeDelta.dy.abs();\n      if (dx > 3 * dy) {\n        _gestureType = GestureType.horizontal;\n        _showControlsIfNeeded();\n      } else if (dy > 3 * dx) {\n        if (!plPlayerController.enableSlideVolumeBrightness &&\n            !plPlayerController.enableSlideFS) {\n          return;\n        }\n\n        // _gestureType = 'vertical';\n\n        final double tapPosition = details.localFocalPoint.dx;\n        final double sectionWidth = maxWidth / 3;\n        if (tapPosition < sectionWidth) {\n          if (PlatformUtils.isDesktop ||\n              !plPlayerController.enableSlideVolumeBrightness) {\n            return;\n          }\n          // 左边区域\n          _gestureType = GestureType.left;\n        } else if (tapPosition < sectionWidth * 2) {\n          if (!plPlayerController.enableSlideFS) {\n            return;\n          }\n          // 全屏\n          _gestureType = GestureType.center;\n        } else {\n          if (!plPlayerController.enableSlideVolumeBrightness) {\n            return;\n          }\n          // 右边区域\n          _gestureType = GestureType.right;\n        }\n      } else {\n        return;\n      }\n    }\n\n    Offset delta = details.focalPointDelta;\n\n    if (_gestureType == GestureType.horizontal) {\n      // live模式下禁用\n      if (plPlayerController.isLive) return;\n\n      final int curSliderPosition =\n          plPlayerController.sliderPosition.inMilliseconds;\n      final int newPos =\n          (curSliderPosition +\n                  (plPlayerController.sliderScale * delta.dx / maxWidth)\n                      .round())\n              .clamp(0, plPlayerController.duration.value.inMilliseconds);\n      final Duration result = Duration(milliseconds: newPos);\n      final height = maxHeight * 0.125;\n      if (details.localFocalPoint.dy <= height &&\n          (details.localFocalPoint.dx >= maxWidth * 0.875 ||\n              details.localFocalPoint.dx <= maxWidth * 0.125)) {\n        plPlayerController.cancelSeek = true;\n        plPlayerController.showPreview.value = false;\n        if (plPlayerController.hasToast != true) {\n          plPlayerController.hasToast = true;\n          SmartDialog.showAttach(\n            targetContext: context,\n            alignment: Alignment.center,\n            animationTime: const Duration(milliseconds: 200),\n            animationType: SmartAnimationType.fade,\n            displayTime: const Duration(milliseconds: 1500),\n            maskColor: Colors.transparent,\n            builder: (context) => Container(\n              padding: const EdgeInsets.symmetric(\n                horizontal: 8,\n                vertical: 4,\n              ),\n              decoration: BoxDecoration(\n                borderRadius: const BorderRadius.all(\n                  Radius.circular(6),\n                ),\n                color: colorScheme.secondaryContainer,\n              ),\n              child: Text(\n                '松开手指，取消进退',\n                style: TextStyle(\n                  color: colorScheme.onSecondaryContainer,\n                ),\n              ),\n            ),\n          );\n        }\n      } else {\n        if (plPlayerController.cancelSeek == true) {\n          plPlayerController\n            ..cancelSeek = null\n            ..hasToast = null;\n        }\n      }\n      plPlayerController\n        ..onUpdatedSliderProgress(result)\n        ..onChangedSliderStart();\n      if (!plPlayerController.isFileSource &&\n          plPlayerController.showSeekPreview &&\n          plPlayerController.cancelSeek != true) {\n        plPlayerController.updatePreviewIndex(newPos ~/ 1000);\n      }\n    } else if (_gestureType == GestureType.left) {\n      // 左边区域 👈\n      final double level = maxHeight * 3;\n      final double brightness = _brightnessValue.value - delta.dy / level;\n      final double result = brightness.clamp(0.0, 1.0);\n      setBrightness(result);\n    } else if (_gestureType == GestureType.center) {\n      // 全屏\n      const double threshold = 2.5; // 滑动阈值\n      double cumulativeDy = details.localFocalPoint.dy - initialFocalPoint.dy;\n\n      void fullScreenTrigger(bool status) {\n        plPlayerController.triggerFullScreen(status: status);\n      }\n\n      if (cumulativeDy > threshold) {\n        _gestureType = GestureType.center_down;\n        if (isFullScreen ^ plPlayerController.fullScreenGestureReverse) {\n          fullScreenTrigger(\n            plPlayerController.fullScreenGestureReverse,\n          );\n        }\n        // if (kDebugMode) debugPrint('center_down:$cumulativeDy');\n      } else if (cumulativeDy < -threshold) {\n        _gestureType = GestureType.center_up;\n        if (!isFullScreen ^ plPlayerController.fullScreenGestureReverse) {\n          fullScreenTrigger(\n            !plPlayerController.fullScreenGestureReverse,\n          );\n        }\n        // if (kDebugMode) debugPrint('center_up:$cumulativeDy');\n      }\n    } else if (_gestureType == GestureType.right) {\n      // 右边区域\n      final double level = maxHeight * 0.5;\n      EasyThrottle.throttle(\n        'setVolume',\n        const Duration(milliseconds: 20),\n        () {\n          final double volume = clampDouble(\n            plPlayerController.volume.value - delta.dy / level,\n            0.0,\n            PlPlayerController.maxVolume,\n          );\n          plPlayerController.setVolume(volume);\n        },\n      );\n    }\n  }\n\n  void _onInteractionEnd(ScaleEndDetails details) {\n    if (plPlayerController.showSeekPreview) {\n      plPlayerController.showPreview.value = false;\n    }\n    if (plPlayerController.isSliderMoving.value) {\n      if (plPlayerController.cancelSeek == true) {\n        plPlayerController.onUpdatedSliderProgress(\n          plPlayerController.position,\n        );\n      } else {\n        plPlayerController.seekTo(\n          plPlayerController.sliderPosition,\n          isSeek: false,\n        );\n      }\n      plPlayerController.onChangedSliderEnd();\n    }\n    interacting = false;\n    initialFocalPoint = Offset.zero;\n    _gestureType = null;\n  }\n\n  void onDoubleTapDownMobile(TapDownDetails details) {\n    if (plPlayerController.isLive || plPlayerController.controlsLock.value) {\n      return;\n    }\n    final double tapPosition = details.localPosition.dx;\n    final double sectionWidth = maxWidth / 4;\n    DoubleTapType type;\n    if (tapPosition < sectionWidth) {\n      type = DoubleTapType.left;\n    } else if (tapPosition < sectionWidth * 3) {\n      type = DoubleTapType.center;\n    } else {\n      type = DoubleTapType.right;\n    }\n    plPlayerController.doubleTapFuc(type);\n  }\n\n  void onTapDesktop() {\n    if (plPlayerController.isLive || plPlayerController.controlsLock.value) {\n      return;\n    }\n    plPlayerController.onDoubleTapCenter();\n  }\n\n  void onDoubleTapDesktop() {\n    if (plPlayerController.controlsLock.value) {\n      return;\n    }\n    plPlayerController.triggerFullScreen(status: !isFullScreen);\n  }\n\n  void _onTapUp(TapUpDetails details) {\n    switch (details.kind) {\n      case ui.PointerDeviceKind.mouse when PlatformUtils.isDesktop:\n        onTapDesktop();\n        break;\n      default:\n        if (_suspendedDm == null) {\n          plPlayerController.controls = !plPlayerController.showControls.value;\n        } else if (_suspendedDm!.suspend) {\n          _dmOffset.value = details.localPosition;\n        } else {\n          _suspendedDm = null;\n        }\n        break;\n    }\n  }\n\n  void _onTapDown(TapDownDetails details) {\n    final ctr = plPlayerController.danmakuController;\n    if (ctr != null) {\n      final pos = details.localPosition;\n      final res = ctr.findSingleDanmaku(pos);\n      if (res != null) {\n        final (dy, item) = res;\n        if (item != _suspendedDm) {\n          _suspendedDm?.suspend = false;\n          if (item.content.extra == null) {\n            _dmOffset.value = null;\n            return;\n          }\n          _suspendedDm = item..suspend = true;\n          this.dy = dy;\n        }\n      } else {\n        _suspendedDm?.suspend = false;\n        _dmOffset.value = null;\n      }\n    }\n  }\n\n  void _onDoubleTapDown(TapDownDetails details) {\n    switch (details.kind) {\n      case ui.PointerDeviceKind.mouse when PlatformUtils.isDesktop:\n        onDoubleTapDesktop();\n        break;\n      default:\n        onDoubleTapDownMobile(details);\n        break;\n    }\n  }\n\n  LongPressGestureRecognizer? _longPressRecognizer;\n  LongPressGestureRecognizer get longPressRecognizer => _longPressRecognizer ??=\n      LongPressGestureRecognizer(\n          duration: plPlayerController.enableTapDm\n              ? const Duration(milliseconds: 300)\n              : null,\n        )\n        ..onLongPressStart = ((_) =>\n            plPlayerController.setLongPressStatus(true))\n        ..onLongPressEnd = ((_) => plPlayerController.setLongPressStatus(false))\n        ..onLongPressCancel = (() =>\n            plPlayerController.setLongPressStatus(false));\n  late final ImmediateTapGestureRecognizer _tapGestureRecognizer;\n  late final DoubleTapGestureRecognizer _doubleTapGestureRecognizer;\n  StreamSubscription<bool>? _danmakuListener;\n\n  void _onPointerDown(PointerDownEvent event) {\n    if (PlatformUtils.isDesktop) {\n      final buttons = event.buttons;\n      final isSecondaryBtn = buttons == kSecondaryMouseButton;\n      if (isSecondaryBtn || buttons == kMiddleMouseButton) {\n        final isFullScreen = this.isFullScreen;\n        if (isFullScreen && plPlayerController.controlsLock.value) {\n          plPlayerController\n            ..controlsLock.value = false\n            ..showControls.value = false;\n        }\n        plPlayerController\n            .triggerFullScreen(\n              status: !isFullScreen,\n              inAppFullScreen: isSecondaryBtn,\n            )\n            .whenComplete(() => initialFocalPoint = Offset.zero);\n        return;\n      }\n    }\n\n    _tapGestureRecognizer.addPointer(event);\n    _doubleTapGestureRecognizer.addPointer(event);\n    if (!plPlayerController.isLive) {\n      longPressRecognizer.addPointer(event);\n    }\n  }\n\n  void _showControlsIfNeeded() {\n    if (plPlayerController.isLive) return;\n    late final isFullScreen = this.isFullScreen;\n    final progressType = plPlayerController.progressType;\n    if (progressType == BtmProgressBehavior.alwaysHide ||\n        (isFullScreen &&\n            progressType == BtmProgressBehavior.onlyHideFullScreen) ||\n        (!isFullScreen &&\n            progressType == BtmProgressBehavior.onlyShowFullScreen)) {\n      plPlayerController.controls = true;\n    }\n  }\n\n  void _onPointerPanZoomUpdate(PointerPanZoomUpdateEvent event) {\n    if (plPlayerController.controlsLock.value) return;\n    if (_gestureType == null) {\n      final pan = event.pan;\n      if (pan.distanceSquared < 1) return;\n      final dx = pan.dx.abs();\n      final dy = pan.dy.abs();\n      if (dx > 3 * dy) {\n        _gestureType = GestureType.horizontal;\n        _showControlsIfNeeded();\n      } else if (dy > 3 * dx) {\n        _gestureType = GestureType.right;\n      }\n      return;\n    }\n\n    if (_gestureType == GestureType.horizontal) {\n      if (plPlayerController.isLive) return;\n\n      Offset delta = event.localPanDelta;\n      final int curSliderPosition =\n          plPlayerController.sliderPosition.inMilliseconds;\n      final int newPos =\n          (curSliderPosition +\n                  (plPlayerController.sliderScale * delta.dx / maxWidth)\n                      .round())\n              .clamp(0, plPlayerController.duration.value.inMilliseconds);\n      final Duration result = Duration(milliseconds: newPos);\n      if (plPlayerController.cancelSeek == true) {\n        plPlayerController\n          ..cancelSeek = null\n          ..hasToast = null;\n      }\n      plPlayerController\n        ..onUpdatedSliderProgress(result)\n        ..onChangedSliderStart();\n      if (!plPlayerController.isFileSource &&\n          plPlayerController.showSeekPreview &&\n          plPlayerController.cancelSeek != true) {\n        plPlayerController.updatePreviewIndex(newPos ~/ 1000);\n      }\n    } else if (_gestureType == GestureType.right) {\n      if (!plPlayerController.enableSlideVolumeBrightness) {\n        return;\n      }\n\n      final double level = maxHeight * 0.5;\n      EasyThrottle.throttle(\n        'setVolume',\n        const Duration(milliseconds: 20),\n        () {\n          final double volume = clampDouble(\n            plPlayerController.volume.value - event.localPanDelta.dy / level,\n            0.0,\n            PlPlayerController.maxVolume,\n          );\n          plPlayerController.setVolume(volume);\n        },\n      );\n    }\n  }\n\n  void _onPointerPanZoomEnd(PointerPanZoomEndEvent event) {\n    _gestureType = null;\n  }\n\n  void _onPointerSignal(PointerSignalEvent event) {\n    if (event is PointerScrollEvent) {\n      final offset = -event.scrollDelta.dy / 4000;\n      final volume = clampDouble(\n        plPlayerController.volume.value + offset,\n        0.0,\n        PlPlayerController.maxVolume,\n      );\n      plPlayerController.setVolume(volume);\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    maxWidth = widget.maxWidth;\n    maxHeight = widget.maxHeight;\n    final isFullScreen = this.isFullScreen;\n    final primary = isFullScreen && colorScheme.isLight\n        ? colorScheme.inversePrimary\n        : colorScheme.primary;\n    late final thumbGlowColor = primary.withAlpha(80);\n    late final bufferedBarColor = primary.withValues(alpha: 0.4);\n    const TextStyle textStyle = TextStyle(\n      color: Colors.white,\n      fontSize: 12,\n    );\n    final isLive = plPlayerController.isLive;\n\n    final child = Stack(\n      fit: StackFit.passthrough,\n      key: _playerKey,\n      children: <Widget>[\n        _videoWidget,\n\n        if (widget.danmuWidget case final danmaku?)\n          Positioned.fill(top: 4, child: danmaku),\n\n        if (!isLive)\n          Positioned.fill(\n            child: IgnorePointer(\n              ignoring: !plPlayerController.enableDragSubtitle,\n              child: Obx(\n                () => SubtitleView(\n                  controller: videoController,\n                  configuration: plPlayerController.subtitleConfig.value,\n                  enableDragSubtitle: plPlayerController.enableDragSubtitle,\n                  onUpdatePadding: plPlayerController.onUpdatePadding,\n                ),\n              ),\n            ),\n          ),\n\n        if (plPlayerController.enableTapDm)\n          Obx(\n            () {\n              if (!plPlayerController.enableShowDanmaku.value) {\n                return const SizedBox.shrink();\n              }\n              final dmOffset = _dmOffset.value;\n              if (dmOffset != null && _suspendedDm != null) {\n                return _buildDmAction(_suspendedDm!, dmOffset);\n              }\n              return const SizedBox.shrink();\n            },\n          ),\n\n        /// 长按倍速 toast\n        if (!isLive)\n          IgnorePointer(\n            ignoring: true,\n            child: Align(\n              alignment: Alignment.topCenter,\n              child: FractionalTranslation(\n                translation: isFullScreen\n                    ? const Offset(0.0, 1.2)\n                    : const Offset(0.0, 0.8),\n                child: Obx(\n                  () => AnimatedOpacity(\n                    curve: Curves.easeInOut,\n                    opacity: plPlayerController.longPressStatus.value\n                        ? 1.0\n                        : 0.0,\n                    duration: const Duration(milliseconds: 150),\n                    child: Container(\n                      padding: const EdgeInsets.all(6),\n                      decoration: const BoxDecoration(\n                        color: Color(0x88000000),\n                        borderRadius: BorderRadius.all(Radius.circular(16)),\n                      ),\n                      child: Obx(\n                        () => Text(\n                          '${plPlayerController.enableAutoLongPressSpeed ? (plPlayerController.longPressStatus.value ? plPlayerController.lastPlaybackSpeed : plPlayerController.playbackSpeed) * 2 : plPlayerController.longPressSpeed}倍速中',\n                          style: const TextStyle(\n                            color: Colors.white,\n                            fontSize: 13,\n                          ),\n                        ),\n                      ),\n                    ),\n                  ),\n                ),\n              ),\n            ),\n          ),\n\n        /// 时间进度 toast\n        if (!isLive)\n          IgnorePointer(\n            ignoring: true,\n            child: Align(\n              alignment: Alignment.topCenter,\n              child: FractionalTranslation(\n                translation: isFullScreen\n                    ? const Offset(0.0, 1.2)\n                    : const Offset(0.0, 0.8),\n                child: Obx(\n                  () => AnimatedOpacity(\n                    curve: Curves.easeInOut,\n                    opacity: plPlayerController.isSliderMoving.value\n                        ? 1.0\n                        : 0.0,\n                    duration: const Duration(milliseconds: 150),\n                    child: Container(\n                      decoration: const BoxDecoration(\n                        color: Color(0x88000000),\n                        borderRadius: BorderRadius.all(Radius.circular(64)),\n                      ),\n                      padding: const EdgeInsets.symmetric(\n                        horizontal: 10,\n                        vertical: 8,\n                      ),\n                      child: Row(\n                        spacing: 2,\n                        mainAxisSize: MainAxisSize.min,\n                        mainAxisAlignment: MainAxisAlignment.center,\n                        children: [\n                          Obx(() {\n                            return Text(\n                              DurationUtils.formatDuration(\n                                plPlayerController\n                                    .sliderTempPosition\n                                    .value\n                                    .inSeconds,\n                              ),\n                              style: textStyle,\n                            );\n                          }),\n                          const Text('/', style: textStyle),\n                          Obx(\n                            () {\n                              return Text(\n                                DurationUtils.formatDuration(\n                                  plPlayerController.duration.value.inSeconds,\n                                ),\n                                style: textStyle,\n                              );\n                            },\n                          ),\n                        ],\n                      ),\n                    ),\n                  ),\n                ),\n              ),\n            ),\n          ),\n\n        /// 音量🔊 控制条展示\n        IgnorePointer(\n          ignoring: true,\n          child: Align(\n            alignment: Alignment.center,\n            child: Obx(\n              () {\n                final volume = plPlayerController.volume.value;\n                return AnimatedOpacity(\n                  curve: Curves.easeInOut,\n                  opacity: plPlayerController.volumeIndicator.value ? 1.0 : 0.0,\n                  duration: const Duration(milliseconds: 150),\n                  child: Container(\n                    padding: const EdgeInsets.symmetric(\n                      horizontal: 8,\n                      vertical: 5,\n                    ),\n                    decoration: const BoxDecoration(\n                      color: Color(0x88000000),\n                      borderRadius: BorderRadius.all(Radius.circular(64)),\n                    ),\n                    child: Row(\n                      mainAxisSize: MainAxisSize.min,\n                      mainAxisAlignment: MainAxisAlignment.center,\n                      children: <Widget>[\n                        Icon(\n                          volume == 0.0\n                              ? Icons.volume_off\n                              : volume < 0.5\n                              ? Icons.volume_down\n                              : Icons.volume_up,\n                          color: Colors.white,\n                          size: 20.0,\n                        ),\n                        const SizedBox(width: 2.0),\n                        Text(\n                          '${(volume * 100.0).round()}%',\n                          style: const TextStyle(\n                            fontSize: 13.0,\n                            color: Colors.white,\n                          ),\n                        ),\n                      ],\n                    ),\n                  ),\n                );\n              },\n            ),\n          ),\n        ),\n\n        /// 亮度🌞 控制条展示\n        IgnorePointer(\n          ignoring: true,\n          child: Align(\n            alignment: Alignment.center,\n            child: Obx(\n              () => AnimatedOpacity(\n                curve: Curves.easeInOut,\n                opacity: _brightnessIndicator.value ? 1.0 : 0.0,\n                duration: const Duration(milliseconds: 150),\n                child: Container(\n                  padding: const EdgeInsets.symmetric(\n                    horizontal: 8,\n                    vertical: 5,\n                  ),\n                  decoration: const BoxDecoration(\n                    color: Color(0x88000000),\n                    borderRadius: BorderRadius.all(Radius.circular(64)),\n                  ),\n                  child: Row(\n                    mainAxisSize: MainAxisSize.min,\n                    mainAxisAlignment: MainAxisAlignment.center,\n                    children: <Widget>[\n                      Icon(\n                        _brightnessValue.value < 1.0 / 3.0\n                            ? Icons.brightness_low\n                            : _brightnessValue.value < 2.0 / 3.0\n                            ? Icons.brightness_medium\n                            : Icons.brightness_high,\n                        color: Colors.white,\n                        size: 18.0,\n                      ),\n                      const SizedBox(width: 2.0),\n                      Text(\n                        '${(_brightnessValue.value * 100.0).round()}%',\n                        style: const TextStyle(\n                          fontSize: 13.0,\n                          color: Colors.white,\n                        ),\n                      ),\n                    ],\n                  ),\n                ),\n              ),\n            ),\n          ),\n        ),\n\n        // 头部、底部控制条\n        Positioned.fill(\n          top: -1,\n          bottom: -1,\n          child: ClipRect(\n            child: RepaintBoundary(\n              child: Column(\n                mainAxisAlignment: MainAxisAlignment.spaceBetween,\n                children: [\n                  AppBarAni(\n                    isTop: true,\n                    controller: animationController,\n                    isFullScreen: isFullScreen,\n                    child: plPlayerController.isDesktopPip\n                        ? GestureDetector(\n                            behavior: HitTestBehavior.translucent,\n                            onPanStart: (_) => windowManager.startDragging(),\n                            child: widget.headerControl,\n                          )\n                        : widget.headerControl,\n                  ),\n                  AppBarAni(\n                    isTop: false,\n                    controller: animationController,\n                    isFullScreen: isFullScreen,\n                    child:\n                        widget.bottomControl ??\n                        BottomControl(\n                          maxWidth: maxWidth,\n                          isFullScreen: isFullScreen,\n                          controller: plPlayerController,\n                          videoDetailController: videoDetailController,\n                          buildBottomControl: () => buildBottomControl(\n                            videoDetailController,\n                            maxWidth > maxHeight,\n                          ),\n                        ),\n                  ),\n                ],\n              ),\n            ),\n          ),\n        ),\n\n        // Positioned(\n        //   right: 25,\n        //   top: 125,\n        //   child: FilledButton.tonal(\n        //     onPressed: () {\n        //       transformationController.value = Matrix4.identity()\n        //         ..translate(0.5, 0.5)\n        //         ..scale(0.5)\n        //         ..translate(-0.5, -0.5);\n\n        //       showRestoreScaleBtn.value = true;\n        //     },\n        //     child: const Text('scale'),\n        //   ),\n        // ),\n        Obx(\n          () =>\n              showRestoreScaleBtn.value && plPlayerController.showControls.value\n              ? Align(\n                  alignment: Alignment.bottomCenter,\n                  child: Padding(\n                    padding: const EdgeInsets.only(bottom: 95),\n                    child: FilledButton.tonal(\n                      style: FilledButton.styleFrom(\n                        tapTargetSize: MaterialTapTargetSize.shrinkWrap,\n                        backgroundColor: colorScheme.secondaryContainer\n                            .withValues(alpha: 0.8),\n                        visualDensity: VisualDensity.compact,\n                        padding: const EdgeInsets.all(15),\n                        shape: const RoundedRectangleBorder(\n                          borderRadius: BorderRadius.all(\n                            Radius.circular(6),\n                          ),\n                        ),\n                      ),\n                      onPressed: () async {\n                        showRestoreScaleBtn.value = false;\n                        final animController = AnimationController(\n                          vsync: this,\n                          duration: const Duration(milliseconds: 255),\n                        );\n                        final anim = animController.drive(\n                          Matrix4Tween(\n                            begin: transformationController.value,\n                            end: Matrix4.identity(),\n                          ).chain(CurveTween(curve: Curves.easeOut)),\n                        );\n                        void listener() {\n                          transformationController.value = anim.value;\n                        }\n\n                        animController.addListener(listener);\n                        await animController.forward(from: 0);\n                        animController\n                          ..removeListener(listener)\n                          ..dispose();\n                      },\n                      child: const Text('还原屏幕'),\n                    ),\n                  ),\n                )\n              : const SizedBox.shrink(),\n        ),\n\n        /// 进度条 live模式下禁用\n        if (!isLive &&\n            plPlayerController.progressType != BtmProgressBehavior.alwaysHide)\n          Positioned(\n            bottom: -2.2,\n            left: 0,\n            right: 0,\n            child: Obx(\n              () {\n                final showControls = plPlayerController.showControls.value;\n                final offstage = switch (plPlayerController.progressType) {\n                  BtmProgressBehavior.onlyShowFullScreen =>\n                    showControls || !isFullScreen,\n                  BtmProgressBehavior.onlyHideFullScreen =>\n                    showControls || isFullScreen,\n                  _ => showControls,\n                };\n                return Offstage(\n                  offstage: offstage,\n                  child: Stack(\n                    clipBehavior: Clip.none,\n                    alignment: Alignment.bottomCenter,\n                    children: [\n                      Obx(() {\n                        final int value =\n                            plPlayerController.sliderPositionSeconds.value;\n                        final int max =\n                            plPlayerController.duration.value.inSeconds;\n                        final int buffer =\n                            plPlayerController.bufferedSeconds.value;\n                        return ProgressBar(\n                          progress: Duration(seconds: value),\n                          buffered: Duration(seconds: buffer),\n                          total: Duration(seconds: max),\n                          progressBarColor: primary,\n                          baseBarColor: const Color(0x33FFFFFF),\n                          bufferedBarColor: bufferedBarColor,\n                          thumbColor: primary,\n                          thumbGlowColor: thumbGlowColor,\n                          barHeight: 3.5,\n                          thumbRadius: 2.5,\n                        );\n                      }),\n                      if (plPlayerController.enableBlock &&\n                          videoDetailController.segmentProgressList.isNotEmpty)\n                        Positioned(\n                          left: 0,\n                          right: 0,\n                          bottom: 0.75,\n                          child: SegmentProgressBar(\n                            segments: videoDetailController.segmentProgressList,\n                          ),\n                        ),\n                      if (plPlayerController.showViewPoints &&\n                          videoDetailController.viewPointList.isNotEmpty &&\n                          videoDetailController.showVP.value)\n                        Padding(\n                          padding: const .only(bottom: 4.25),\n                          child: ViewPointSegmentProgressBar(\n                            segments: videoDetailController.viewPointList,\n                            onSeek: PlatformUtils.isMobile\n                                ? (position) => plPlayerController.seekTo(\n                                    position,\n                                    isSeek: false,\n                                  )\n                                : null,\n                          ),\n                        ),\n                      if (plPlayerController.showDmChart &&\n                          videoDetailController.showDmTrendChart.value)\n                        if (videoDetailController.dmTrend.value?.dataOrNull\n                            case final list?)\n                          buildDmChart(primary, list, videoDetailController),\n                    ],\n                  ),\n                );\n              },\n            ),\n          ),\n\n        if (!isLive && plPlayerController.showSeekPreview)\n          buildSeekPreviewWidget(\n            plPlayerController,\n            maxWidth,\n            maxHeight,\n            () => mounted,\n          ),\n\n        if (isFullScreen || plPlayerController.isDesktopPip) ...[\n          // 锁\n          if (plPlayerController.showFsLockBtn)\n            ViewSafeArea(\n              right: false,\n              child: Align(\n                alignment: Alignment.centerLeft,\n                child: FractionalTranslation(\n                  translation: const Offset(1, -0.4),\n                  child: Obx(\n                    () => Offstage(\n                      offstage: !plPlayerController.showControls.value,\n                      child: DecoratedBox(\n                        decoration: const BoxDecoration(\n                          color: Color(0x45000000),\n                          borderRadius: BorderRadius.all(Radius.circular(8)),\n                        ),\n                        child: Obx(() {\n                          final controlsLock =\n                              plPlayerController.controlsLock.value;\n                          return ComBtn(\n                            tooltip: controlsLock ? '解锁' : '锁定',\n                            icon: controlsLock\n                                ? const Icon(\n                                    FontAwesomeIcons.lock,\n                                    size: 15,\n                                    color: Colors.white,\n                                  )\n                                : const Icon(\n                                    FontAwesomeIcons.lockOpen,\n                                    size: 15,\n                                    color: Colors.white,\n                                  ),\n                            onTap: () =>\n                                plPlayerController.onLockControl(!controlsLock),\n                          );\n                        }),\n                      ),\n                    ),\n                  ),\n                ),\n              ),\n            ),\n\n          // 截图\n          if (plPlayerController.showFsScreenshotBtn)\n            ViewSafeArea(\n              left: false,\n              child: Obx(\n                () => Align(\n                  alignment: Alignment.centerRight,\n                  child: FractionalTranslation(\n                    translation: const Offset(-1, -0.4),\n                    child: Offstage(\n                      offstage: !plPlayerController.showControls.value,\n                      child: DecoratedBox(\n                        decoration: const BoxDecoration(\n                          color: Color(0x45000000),\n                          borderRadius: BorderRadius.all(Radius.circular(8)),\n                        ),\n                        child: ComBtn(\n                          tooltip: '截图',\n                          icon: const Icon(\n                            Icons.photo_camera,\n                            size: 20,\n                            color: Colors.white,\n                          ),\n                          onLongPress:\n                              (Platform.isAndroid || kDebugMode) && !isLive\n                              ? screenshotWebp\n                              : null,\n                          onTap: plPlayerController.takeScreenshot,\n                        ),\n                      ),\n                    ),\n                  ),\n                ),\n              ),\n            ),\n        ],\n\n        Obx(() {\n          if (plPlayerController.dataStatus.loading ||\n              (plPlayerController.isBuffering.value &&\n                  plPlayerController.playerStatus.isPlaying)) {\n            return Center(\n              child: GestureDetector(\n                onTap: plPlayerController.refreshPlayer,\n                child: Container(\n                  padding: const EdgeInsets.all(20),\n                  decoration: const BoxDecoration(\n                    shape: BoxShape.circle,\n                    gradient: RadialGradient(\n                      colors: [Colors.black26, Colors.transparent],\n                    ),\n                  ),\n                  child: Column(\n                    mainAxisSize: MainAxisSize.min,\n                    children: [\n                      Image.asset(\n                        'assets/images/loading.webp',\n                        height: 25,\n                        cacheHeight: 25.cacheSize(context),\n                        semanticLabel: \"加载中\",\n                        color: Colors.white,\n                      ),\n                      if (plPlayerController.isBuffering.value)\n                        Obx(() {\n                          if (plPlayerController.bufferedSeconds.value == 0) {\n                            return const Text(\n                              '加载中...',\n                              style: TextStyle(\n                                color: Colors.white,\n                                fontSize: 12,\n                              ),\n                            );\n                          }\n                          String bufferStr = plPlayerController.buffered\n                              .toString();\n                          return Text(\n                            bufferStr.substring(0, bufferStr.length - 3),\n                            style: const TextStyle(\n                              color: Colors.white,\n                              fontSize: 12,\n                            ),\n                          );\n                        }),\n                    ],\n                  ),\n                ),\n              ),\n            );\n          } else {\n            return const SizedBox.shrink();\n          }\n        }),\n\n        /// 点击 快进/快退\n        if (!isLive)\n          Obx(() {\n            final mountSeekBackwardButton =\n                plPlayerController.mountSeekBackwardButton.value;\n            final mountSeekForwardButton =\n                plPlayerController.mountSeekForwardButton.value;\n            return mountSeekBackwardButton || mountSeekForwardButton\n                ? Positioned.fill(\n                    child: Row(\n                      children: [\n                        if (mountSeekBackwardButton)\n                          Expanded(\n                            child: TweenAnimationBuilder<double>(\n                              tween: Tween<double>(begin: 0.0, end: 1.0),\n                              duration: const Duration(milliseconds: 500),\n                              builder: (context, value, child) => Opacity(\n                                opacity: value,\n                                child: child,\n                              ),\n                              child: BackwardSeekIndicator(\n                                duration:\n                                    plPlayerController.fastForBackwardDuration,\n                                onSubmitted: (Duration value) {\n                                  plPlayerController\n                                    ..mountSeekBackwardButton.value = false\n                                    ..onBackward(value);\n                                },\n                              ),\n                            ),\n                          ),\n                        const Spacer(flex: 2),\n                        if (mountSeekForwardButton)\n                          Expanded(\n                            child: TweenAnimationBuilder<double>(\n                              tween: Tween<double>(begin: 0.0, end: 1.0),\n                              duration: const Duration(milliseconds: 500),\n                              builder: (context, value, child) => Opacity(\n                                opacity: value,\n                                child: child,\n                              ),\n                              child: ForwardSeekIndicator(\n                                duration:\n                                    plPlayerController.fastForBackwardDuration,\n                                onSubmitted: (Duration value) {\n                                  plPlayerController\n                                    ..mountSeekForwardButton.value = false\n                                    ..onForward(value);\n                                },\n                              ),\n                            ),\n                          ),\n                      ],\n                    ),\n                  )\n                : const SizedBox.shrink();\n          }),\n      ],\n    );\n    if (PlatformUtils.isDesktop) {\n      return Obx(\n        () => MouseRegion(\n          cursor: !plPlayerController.showControls.value && isFullScreen\n              ? SystemMouseCursors.none\n              : MouseCursor.defer,\n          onEnter: (_) => plPlayerController.controls = true,\n          onHover: (_) => plPlayerController.controls = true,\n          onExit: (_) => plPlayerController.controls =\n              widget.videoDetailController?.showSteinEdgeInfo.value ?? false,\n          child: child,\n        ),\n      );\n    }\n    return child;\n  }\n\n  Widget get _videoWidget {\n    return Container(\n      clipBehavior: Clip.none,\n      width: maxWidth,\n      height: maxHeight,\n      color: widget.fill,\n      child: Obx(\n        () => MouseInteractiveViewer(\n          scaleEnabled: !plPlayerController.controlsLock.value,\n          pointerSignalFallback: _onPointerSignal,\n          onPointerPanZoomUpdate: _onPointerPanZoomUpdate,\n          onPointerPanZoomEnd: _onPointerPanZoomEnd,\n          onPointerDown: _onPointerDown,\n          onInteractionStart: _onInteractionStart,\n          onInteractionUpdate: _onInteractionUpdate,\n          onInteractionEnd: _onInteractionEnd,\n          panEnabled: false,\n          minScale: plPlayerController.enableShrinkVideoSize ? 0.75 : 1,\n          maxScale: 2.0,\n          boundaryMargin: plPlayerController.enableShrinkVideoSize\n              ? const EdgeInsets.all(double.infinity)\n              : EdgeInsets.zero,\n          panAxis: PanAxis.aligned,\n          transformationController: transformationController,\n          onTranslate: () {\n            final storage = transformationController.value.storage;\n            showRestoreScaleBtn.value =\n                storage[12].abs() > 2.0 ||\n                storage[13].abs() > 2.0 ||\n                storage[0] != 1.0;\n          },\n          childKey: _videoKey,\n          child: RepaintBoundary(\n            key: _videoKey,\n            child: Obx(\n              () {\n                final videoFit = plPlayerController.videoFit.value;\n                return Transform.flip(\n                  flipX: plPlayerController.flipX.value,\n                  flipY: plPlayerController.flipY.value,\n                  child: FittedBox(\n                    fit: videoFit.boxFit,\n                    alignment: widget.alignment,\n                    child: SimpleVideo(\n                      controller: plPlayerController.videoController!,\n                      fill: widget.fill,\n                      aspectRatio: videoFit.aspectRatio,\n                    ),\n                  ),\n                );\n              },\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n\n  late final segment = Pair(\n    first: plPlayerController.position.inMilliseconds / 1000.0,\n    second: plPlayerController.position.inMilliseconds / 1000.0,\n  );\n\n  Future<void> screenshotWebp() async {\n    final videoInfo = videoDetailController.data;\n    final ids = videoInfo.dash!.video!.map((i) => i.id!).toSet();\n    final video = videoDetailController.findVideoByQa(ids.min);\n\n    VideoQuality qa = video.quality;\n    String? url = video.baseUrl;\n    if (url == null) return;\n\n    final ctr = plPlayerController;\n    final theme = Theme.of(context);\n    final currentPos = ctr.position.inMilliseconds / 1000.0;\n    final duration = ctr.duration.value.inMilliseconds / 1000.0;\n    final model = PostSegmentModel(\n      segment: segment,\n      category: SegmentType.sponsor,\n      actionType: ActionType.skip,\n    );\n    final isPlay = ctr.playerStatus.isPlaying;\n    if (isPlay) ctr.pause();\n\n    WebpPreset preset = WebpPreset.def;\n\n    final success =\n        await showDialog<bool>(\n          context: Get.context!,\n          builder: (context) => AlertDialog(\n            title: const Text('动态截图'),\n            content: Column(\n              spacing: 12,\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                PostPanel.segmentWidget(\n                  theme,\n                  item: model,\n                  currentPos: () => currentPos,\n                  videoDuration: duration,\n                ),\n                PopupMenuText(\n                  title: '选择画质',\n                  value: () => qa.code,\n                  onSelected: (value) {\n                    final video = videoDetailController.findVideoByQa(value);\n                    url = video.baseUrl;\n                    qa = video.quality;\n                    return false;\n                  },\n                  itemBuilder: (context) => videoInfo.supportFormats!\n                      .map(\n                        (i) => PopupMenuItem(\n                          enabled: ids.contains(i.quality),\n                          value: i.quality,\n                          child: Text(i.newDesc ?? ''),\n                        ),\n                      )\n                      .toList(),\n                  getSelectTitle: (_) => qa.shortDesc,\n                ),\n                PopupMenuText(\n                  title: 'webp预设',\n                  value: () => preset,\n                  onSelected: (value) {\n                    preset = value;\n                    return false;\n                  },\n                  itemBuilder: (context) => WebpPreset.values\n                      .map((i) => PopupMenuItem(value: i, child: Text(i.name)))\n                      .toList(),\n                  getSelectTitle: (i) => '${i.name}(${i.desc})',\n                ),\n                Text(\n                  '*转码使用CPU，速度可能慢于播放，请不要选择过长的时间段或过高画质',\n                  style: theme.textTheme.bodySmall,\n                ),\n              ],\n            ),\n            actions: [\n              TextButton(\n                onPressed: Get.back,\n                child: Text(\n                  '取消',\n                  style: TextStyle(\n                    color: theme.colorScheme.outline,\n                  ),\n                ),\n              ),\n              TextButton(\n                onPressed: () {\n                  if (segment.first < segment.second) {\n                    Get.back(result: true);\n                  }\n                },\n                child: const Text('确定'),\n              ),\n            ],\n          ),\n        ) ??\n        false;\n    if (!success) return;\n\n    final progress = 0.0.obs;\n    final name =\n        '${ctr.cid}-${segment.first.toStringAsFixed(3)}_${segment.second.toStringAsFixed(3)}.webp';\n    final file = '$tmpDirPath/$name';\n\n    final mpv = MpvConvertWebp(\n      url!,\n      file,\n      segment.first,\n      segment.second,\n      progress: progress,\n      preset: preset,\n    );\n    final future = mpv.convert().whenComplete(\n      () => SmartDialog.dismiss(status: SmartStatus.loading),\n    );\n\n    SmartDialog.showLoading(\n      backType: SmartBackType.normal,\n      builder: (_) => LoadingWidget(progress: progress, msg: '正在保存，可能需要较长时间'),\n      onDismiss: () async {\n        if (progress.value < 1.0) {\n          mpv.dispose();\n        }\n        if (await future) {\n          await ImageUtils.saveFileImg(\n            filePath: file,\n            fileName: name,\n            needToast: true,\n          );\n        } else {\n          SmartDialog.showToast('转码出现错误或已取消');\n        }\n        if (isPlay) ctr.play();\n      },\n    );\n  }\n\n  static const _overlaySpacing = 5.0;\n  static const _actionItemWidth = 40.0;\n  static const _actionItemHeight = 35.0 - _triangleHeight;\n\n  DanmakuItem<DanmakuExtra>? _suspendedDm;\n  late double dy = 0;\n  late final Rxn<Offset> _dmOffset = Rxn<Offset>();\n\n  void _removeDmAction() {\n    if (_suspendedDm != null) {\n      _suspendedDm?.suspend = false;\n      _suspendedDm = null;\n      _dmOffset.value = null;\n    }\n  }\n\n  Widget _dmActionItem(\n    Widget child, {\n    required Future<void>? Function() onTap,\n  }) {\n    return GestureDetector(\n      behavior: HitTestBehavior.opaque,\n      onTap: () async {\n        await onTap();\n        _removeDmAction();\n      },\n      child: SizedBox(\n        width: _actionItemWidth,\n        height: _actionItemHeight,\n        child: Center(\n          child: child,\n        ),\n      ),\n    );\n  }\n\n  static final _timeRegExp = RegExp(r'(?:\\d+[:：])?\\d+[:：][0-5]?\\d(?!\\d)');\n\n  int? _getValidOffset(String data) {\n    if (_timeRegExp.firstMatch(data) case final timeStr?) {\n      final offset = DurationUtils.parseDuration(timeStr.group(0));\n      if (0 < offset &&\n          offset * 1000 < videoDetailController.data.timeLength!) {\n        return offset;\n      }\n    }\n    return null;\n  }\n\n  Widget _buildDmAction(\n    DanmakuItem<DanmakuExtra> item,\n    Offset offset,\n  ) {\n    final dx = offset.dx;\n    // fullscreen\n    if (dx > maxWidth) {\n      _removeDmAction();\n      return const SizedBox.shrink();\n    }\n\n    final seekOffset = _getValidOffset(item.content.text);\n\n    final overlayWidth = _actionItemWidth * (seekOffset == null ? 3 : 4);\n\n    final top = dy + item.height + _triangleHeight + 2;\n\n    final realLeft = dx + overlayWidth / 2;\n\n    final left = realLeft.clamp(\n      _overlaySpacing + overlayWidth,\n      maxWidth - _overlaySpacing,\n    );\n\n    final right = maxWidth - left;\n    final triangleOffset = realLeft - left;\n\n    if (right > (maxWidth - item.xPosition)) {\n      _removeDmAction();\n      return const SizedBox.shrink();\n    }\n\n    final extra = item.content.extra;\n\n    return Positioned(\n      right: right,\n      top: top,\n      child: _DanmakuTip(\n        offset: triangleOffset,\n        child: Row(\n          mainAxisSize: MainAxisSize.min,\n          mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n          children: switch (extra) {\n            null => throw UnimplementedError(),\n            VideoDanmaku() => [\n              Stack(\n                clipBehavior: Clip.none,\n                children: [\n                  _dmActionItem(\n                    extra.isLike\n                        ? const Icon(\n                            size: 20,\n                            CustomIcons.player_dm_tip_like_solid,\n                            color: Colors.white,\n                          )\n                        : const Icon(\n                            size: 20,\n                            CustomIcons.player_dm_tip_like,\n                            color: Colors.white,\n                          ),\n                    onTap: () => HeaderControl.likeDanmaku(\n                      extra,\n                      plPlayerController.cid!,\n                    ),\n                  ),\n                  if (extra.like > 0)\n                    Positioned(\n                      left: _actionItemWidth - 10.5,\n                      top: 0,\n                      child: Text(\n                        extra.like.toString(),\n                        style: const TextStyle(\n                          fontSize: 10.5,\n                          color: Colors.white,\n                        ),\n                      ),\n                    ),\n                ],\n              ),\n\n              _dmActionItem(\n                const Icon(\n                  size: 19,\n                  CustomIcons.player_dm_tip_copy,\n                  color: Colors.white,\n                ),\n                onTap: () => Utils.copyText(item.content.text),\n              ),\n              if (item.content.selfSend)\n                _dmActionItem(\n                  const Icon(\n                    size: 20,\n                    CustomIcons.player_dm_tip_recall,\n                    color: Colors.white,\n                  ),\n                  onTap: () => HeaderControl.deleteDanmaku(\n                    extra.id,\n                    plPlayerController.cid!,\n                  ),\n                )\n              else\n                _dmActionItem(\n                  const Icon(\n                    size: 20,\n                    CustomIcons.player_dm_tip_back,\n                    color: Colors.white,\n                  ),\n                  onTap: () => HeaderControl.reportDanmaku(\n                    context,\n                    extra: extra,\n                    ctr: plPlayerController,\n                  ),\n                ),\n              if (seekOffset != null)\n                _dmActionItem(\n                  const Icon(\n                    size: 18,\n                    Icons.gps_fixed_outlined,\n                    color: Colors.white,\n                  ),\n                  onTap: () => plPlayerController.seekTo(\n                    Duration(seconds: seekOffset),\n                    isSeek: false,\n                  ),\n                ),\n            ],\n            LiveDanmaku() => [\n              _dmActionItem(\n                const Icon(\n                  size: 20,\n                  MdiIcons.accountOutline,\n                  color: Colors.white,\n                ),\n                onTap: () => Get.toNamed('/member?mid=${extra.mid}'),\n              ),\n              _dmActionItem(\n                const Icon(\n                  size: 19,\n                  CustomIcons.player_dm_tip_copy,\n                  color: Colors.white,\n                ),\n                onTap: () => Utils.copyText(item.content.text),\n              ),\n              _dmActionItem(\n                const Icon(\n                  size: 20,\n                  CustomIcons.player_dm_tip_back,\n                  color: Colors.white,\n                ),\n                onTap: () => HeaderControl.reportLiveDanmaku(\n                  context,\n                  roomId: (widget.bottomControl as live_bottom.BottomControl)\n                      .liveRoomCtr\n                      .roomId,\n                  msg: item.content.text,\n                  extra: extra,\n                ),\n              ),\n            ],\n          },\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/plugin/pl_player/view/widgets.dart",
    "content": "part of 'view.dart';\n\nWidget buildDmChart(\n  Color color,\n  List<double> dmTrend,\n  VideoDetailController videoDetailController, [\n  double offset = 0,\n]) {\n  return IgnorePointer(\n    child: Container(\n      height: 12,\n      margin: EdgeInsets.only(\n        bottom:\n            videoDetailController.viewPointList.isNotEmpty &&\n                videoDetailController.showVP.value\n            ? 19.25 + offset\n            : 4.25 + offset,\n      ),\n      child: LineChart(\n        LineChartData(\n          titlesData: const FlTitlesData(show: false),\n          lineTouchData: const LineTouchData(enabled: false),\n          gridData: const FlGridData(show: false),\n          borderData: FlBorderData(show: false),\n          minX: 0,\n          maxX: (dmTrend.length - 1).toDouble(),\n          minY: 0,\n          maxY: dmTrend.max,\n          lineBarsData: [\n            LineChartBarData(\n              spots: List.generate(\n                dmTrend.length,\n                (index) => FlSpot(\n                  index.toDouble(),\n                  dmTrend[index],\n                ),\n              ),\n              isCurved: true,\n              barWidth: 1,\n              color: color,\n              dotData: const FlDotData(show: false),\n              belowBarData: BarAreaData(\n                show: true,\n                color: color.withValues(alpha: 0.4),\n              ),\n            ),\n          ],\n        ),\n      ),\n    ),\n  );\n}\n\nWidget buildSeekPreviewWidget(\n  PlPlayerController plPlayerController,\n  double maxWidth,\n  double maxHeight,\n  ValueGetter<bool> isMounted,\n) {\n  return Obx(\n    () {\n      if (!plPlayerController.showPreview.value) {\n        return const SizedBox.shrink();\n      }\n\n      try {\n        final data = plPlayerController.videoShot!.data;\n\n        final double scale =\n            plPlayerController.isFullScreen.value &&\n                (PlatformUtils.isDesktop || !plPlayerController.isVertical)\n            ? 4\n            : 3;\n        double height = 27 * scale;\n        final compatHeight = maxHeight - 140;\n        if (compatHeight > 50) {\n          height = math.min(height, compatHeight);\n        }\n\n        final int imgXLen = data.imgXLen;\n        final int imgYLen = data.imgYLen;\n        final int totalPerImage = data.totalPerImage;\n        double imgXSize = data.imgXSize;\n        double imgYSize = data.imgYSize;\n\n        return Align(\n          alignment: Alignment.center,\n          child: Obx(\n            () {\n              final index = plPlayerController.previewIndex.value!;\n              int pageIndex = (index ~/ totalPerImage).clamp(\n                0,\n                data.image.length - 1,\n              );\n              int align = index % totalPerImage;\n              int x = align % imgXLen;\n              int y = align ~/ imgYLen;\n              final url = data.image[pageIndex];\n\n              return ClipRRect(\n                borderRadius: StyleString.mdRadius,\n                child: VideoShotImage(\n                  url: url,\n                  x: x,\n                  y: y,\n                  imgXSize: imgXSize,\n                  imgYSize: imgYSize,\n                  height: height,\n                  imageCache: plPlayerController.previewCache,\n                  onSetSize: (xSize, ySize) => data\n                    ..imgXSize = imgXSize = xSize\n                    ..imgYSize = imgYSize = ySize,\n                  isMounted: isMounted,\n                ),\n              );\n            },\n          ),\n        );\n      } catch (e) {\n        if (kDebugMode) rethrow;\n        return const SizedBox.shrink();\n      }\n    },\n  );\n}\n\nclass VideoShotImage extends StatefulWidget {\n  const VideoShotImage({\n    super.key,\n    required this.imageCache,\n    required this.url,\n    required this.x,\n    required this.y,\n    required this.imgXSize,\n    required this.imgYSize,\n    required this.height,\n    required this.onSetSize,\n    required this.isMounted,\n  });\n\n  final Map<String, ui.Image?> imageCache;\n  final String url;\n  final int x;\n  final int y;\n  final double imgXSize;\n  final double imgYSize;\n  final double height;\n  final Function(double imgXSize, double imgYSize) onSetSize;\n  final ValueGetter<bool> isMounted;\n\n  @override\n  State<VideoShotImage> createState() => _VideoShotImageState();\n}\n\nFuture<ui.Image?> _getImg(String url) async {\n  final cacheManager = DefaultCacheManager();\n  final cacheKey = Utils.getFileName(url, fileExt: false);\n  try {\n    final fileInfo = await cacheManager.getSingleFile(\n      ImageUtils.safeThumbnailUrl(url),\n      key: cacheKey,\n      headers: Constants.baseHeaders,\n    );\n    return _loadImg(fileInfo.path);\n  } catch (_) {\n    return null;\n  }\n}\n\nFuture<ui.Image?> _loadImg(String path) async {\n  final codec = await ui.instantiateImageCodecFromBuffer(\n    await ImmutableBuffer.fromFilePath(path),\n  );\n  final frame = await codec.getNextFrame();\n  codec.dispose();\n  return frame.image;\n}\n\nclass _VideoShotImageState extends State<VideoShotImage> {\n  late Size _size;\n  late Rect _srcRect;\n  late Rect _dstRect;\n  late RRect _rrect;\n  ui.Image? _image;\n\n  @override\n  void initState() {\n    super.initState();\n    _initSize();\n    _loadImg();\n  }\n\n  void _initSizeIfNeeded() {\n    if (_size.width.isNaN) {\n      _initSize();\n    }\n  }\n\n  void _initSize() {\n    if (widget.imgXSize == 0) {\n      if (_image != null) {\n        final imgXSize = _image!.width / 10;\n        final imgYSize = _image!.height / 10;\n        final height = widget.height;\n        final width = height * imgXSize / imgYSize;\n        _setRect(width, height);\n        _setSrcRect(imgXSize, imgYSize);\n        widget.onSetSize(imgXSize, imgYSize);\n      } else {\n        _setRect(double.nan, double.nan);\n        _setSrcRect(widget.imgXSize, widget.imgYSize);\n      }\n    } else {\n      final height = widget.height;\n      final width = height * widget.imgXSize / widget.imgYSize;\n      _setRect(width, height);\n      _setSrcRect(widget.imgXSize, widget.imgYSize);\n    }\n  }\n\n  void _setRect(double width, double height) {\n    _size = Size(width, height);\n    _dstRect = Rect.fromLTRB(0, 0, width, height);\n    _rrect = RRect.fromRectAndRadius(_dstRect, const Radius.circular(10));\n  }\n\n  void _setSrcRect(double imgXSize, double imgYSize) {\n    _srcRect = Rect.fromLTWH(\n      widget.x * imgXSize,\n      widget.y * imgYSize,\n      imgXSize,\n      imgYSize,\n    );\n  }\n\n  void _loadImg() {\n    final url = widget.url;\n    _image = widget.imageCache[url];\n    if (_image != null) {\n      _initSizeIfNeeded();\n    } else if (!widget.imageCache.containsKey(url)) {\n      widget.imageCache[url] = null;\n      _getImg(url).then((image) {\n        if (image != null) {\n          if (widget.isMounted()) {\n            widget.imageCache[url] = image;\n          }\n          if (mounted) {\n            _image = image;\n            _initSizeIfNeeded();\n            setState(() {});\n          }\n        } else {\n          widget.imageCache.remove(url);\n        }\n      });\n    }\n  }\n\n  @override\n  void didUpdateWidget(VideoShotImage oldWidget) {\n    super.didUpdateWidget(oldWidget);\n    if (oldWidget.url != widget.url) {\n      _loadImg();\n    }\n    if (oldWidget.x != widget.x || oldWidget.y != widget.y) {\n      _setSrcRect(widget.imgXSize, widget.imgYSize);\n    }\n  }\n\n  late final _imgPaint = Paint()..filterQuality = FilterQuality.medium;\n  late final _borderPaint = Paint()\n    ..color = Colors.white\n    ..style = PaintingStyle.stroke\n    ..strokeWidth = 1.5;\n\n  @override\n  Widget build(BuildContext context) {\n    if (_image != null) {\n      return CroppedImage(\n        size: _size,\n        image: _image!,\n        srcRect: _srcRect,\n        dstRect: _dstRect,\n        rrect: _rrect,\n        imgPaint: _imgPaint,\n        borderPaint: _borderPaint,\n      );\n    }\n    return const SizedBox.shrink();\n  }\n}\n\nconst double _triangleHeight = 5.6;\n\nclass _DanmakuTip extends SingleChildRenderObjectWidget {\n  const _DanmakuTip({\n    this.offset = 0,\n    super.child,\n  });\n\n  final double offset;\n\n  @override\n  RenderObject createRenderObject(BuildContext context) {\n    return _RenderDanmakuTip(offset: offset);\n  }\n\n  @override\n  void updateRenderObject(\n    BuildContext context,\n    _RenderDanmakuTip renderObject,\n  ) {\n    renderObject.offset = offset;\n  }\n}\n\nclass _RenderDanmakuTip extends RenderProxyBox {\n  _RenderDanmakuTip({\n    required double offset,\n  }) : _offset = offset;\n\n  double _offset;\n  double get offset => _offset;\n  set offset(double value) {\n    if (_offset == value) return;\n    _offset = value;\n    markNeedsPaint();\n  }\n\n  @override\n  void paint(PaintingContext context, Offset offset) {\n    final paint = Paint()\n      ..color = const Color(0xB3000000)\n      ..style = .fill;\n\n    final radius = size.height / 2;\n    const triangleBase = _triangleHeight * 2 / 3;\n\n    final triangleCenterX = (size.width / 2 + _offset).clamp(\n      radius + triangleBase,\n      size.width - radius - triangleBase,\n    );\n    final path = Path()\n      // triangle (exceed)\n      ..moveTo(triangleCenterX - triangleBase, 0)\n      ..lineTo(triangleCenterX, -_triangleHeight)\n      ..lineTo(triangleCenterX + triangleBase, 0)\n      // top\n      ..lineTo(size.width - radius, 0)\n      // right\n      ..arcToPoint(\n        Offset(size.width - radius, size.height),\n        radius: Radius.circular(radius),\n      )\n      // bottom\n      ..lineTo(radius, size.height)\n      // left\n      ..arcToPoint(\n        Offset(radius, 0),\n        radius: Radius.circular(radius),\n      )\n      ..close();\n\n    context.canvas\n      ..save()\n      ..translate(offset.dx, offset.dy)\n      ..drawPath(path, paint)\n      ..drawPath(\n        path,\n        paint\n          ..color = const Color(0x7EFFFFFF)\n          ..style = PaintingStyle.stroke\n          ..strokeWidth = 1.25,\n      )\n      ..restore();\n\n    super.paint(context, offset);\n  }\n}\n\nclass _VideoTime extends LeafRenderObjectWidget {\n  const _VideoTime({\n    required this.position,\n    required this.duration,\n  });\n\n  final String position;\n  final String duration;\n\n  @override\n  _RenderVideoTime createRenderObject(BuildContext context) => _RenderVideoTime(\n    position: position,\n    duration: duration,\n  );\n\n  @override\n  void updateRenderObject(\n    BuildContext context,\n    covariant _RenderVideoTime renderObject,\n  ) {\n    renderObject\n      ..position = position\n      ..duration = duration;\n  }\n}\n\nclass _RenderVideoTime extends RenderBox {\n  _RenderVideoTime({\n    required String position,\n    required String duration,\n  }) : _position = position,\n       _duration = duration;\n\n  String _duration;\n  set duration(String value) {\n    _duration = value;\n    final paragraph = _buildParagraph(const Color(0xFFD0D0D0), _duration);\n    if (paragraph.maxIntrinsicWidth != _cache?.maxIntrinsicWidth) {\n      markNeedsLayout();\n    }\n    _cache?.dispose();\n    _cache = paragraph;\n    markNeedsSemanticsUpdate();\n  }\n\n  String _position;\n  set position(String value) {\n    _position = value;\n    markNeedsPaint();\n    markNeedsSemanticsUpdate();\n  }\n\n  ui.Paragraph? _cache;\n\n  ui.Paragraph _buildParagraph(Color color, String time) {\n    final builder =\n        ui.ParagraphBuilder(\n            ui.ParagraphStyle(\n              fontSize: 10,\n              height: 1.4,\n              fontFamily: 'Monospace',\n            ),\n          )\n          ..pushStyle(\n            ui.TextStyle(\n              color: color,\n              fontSize: 10,\n              height: 1.4,\n              fontFamily: 'Monospace',\n              fontFeatures: const [FontFeature.tabularFigures()],\n            ),\n          )\n          ..addText(time);\n    return builder.build()\n      ..layout(const ui.ParagraphConstraints(width: .infinity));\n  }\n\n  @override\n  ui.Size computeDryLayout(covariant BoxConstraints constraints) {\n    final paragraph = _cache ??= _buildParagraph(\n      const Color(0xFFD0D0D0),\n      _duration,\n    );\n    return Size(paragraph.maxIntrinsicWidth, paragraph.height * 2);\n  }\n\n  @override\n  void describeSemanticsConfiguration(SemanticsConfiguration config) {\n    super.describeSemanticsConfiguration(config);\n    config.label = 'position:$_position\\nduration:$_duration';\n  }\n\n  @override\n  void performLayout() {\n    size = computeDryLayout(constraints);\n  }\n\n  @override\n  void paint(PaintingContext context, ui.Offset offset) {\n    final para = _buildParagraph(Colors.white, _position);\n    context.canvas\n      ..drawParagraph(\n        para,\n        Offset(\n          offset.dx + _cache!.maxIntrinsicWidth - para.maxIntrinsicWidth,\n          offset.dy,\n        ),\n      )\n      ..drawParagraph(_cache!, Offset(offset.dx, offset.dy + para.height));\n    para.dispose();\n  }\n\n  @override\n  void dispose() {\n    _cache?.dispose();\n    _cache = null;\n    super.dispose();\n  }\n\n  @override\n  bool get isRepaintBoundary => true;\n}\n"
  },
  {
    "path": "lib/plugin/pl_player/widgets/app_bar_ani.dart",
    "content": "import 'package:PiliPlus/common/widgets/view_safe_area.dart';\nimport 'package:flutter/material.dart';\n\nclass AppBarAni extends StatelessWidget {\n  const AppBarAni({\n    super.key,\n    required this.child,\n    required this.controller,\n    required this.isTop,\n    required this.isFullScreen,\n  });\n\n  final Widget child;\n  final AnimationController controller;\n  final bool isTop;\n  final bool isFullScreen;\n\n  static final _topPos = Tween<Offset>(\n    begin: const Offset(0.0, -1.0),\n    end: Offset.zero,\n  );\n\n  static const _topDecoration = LinearGradient(\n    begin: Alignment.bottomCenter,\n    end: Alignment.topCenter,\n    colors: <Color>[\n      Colors.transparent,\n      Color(0xBF000000),\n    ],\n    tileMode: TileMode.mirror,\n  );\n\n  static final _bottomPos = Tween<Offset>(\n    begin: const Offset(0, 1.2),\n    end: Offset.zero,\n  );\n\n  static const _bottomDecoration = LinearGradient(\n    begin: Alignment.topCenter,\n    end: Alignment.bottomCenter,\n    colors: <Color>[\n      Colors.transparent,\n      Color(0xBF000000),\n    ],\n    tileMode: TileMode.mirror,\n  );\n\n  @override\n  Widget build(BuildContext context) {\n    return SlideTransition(\n      position: controller.drive(isTop ? _topPos : _bottomPos),\n      child: DecoratedBox(\n        decoration: BoxDecoration(\n          gradient: isTop ? _topDecoration : _bottomDecoration,\n        ),\n        child: ViewSafeArea(\n          left: isFullScreen,\n          right: isFullScreen,\n          child: child,\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/plugin/pl_player/widgets/backward_seek.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter/material.dart';\n\nclass BackwardSeekIndicator extends StatefulWidget {\n  final ValueChanged<Duration> onSubmitted;\n  final Duration duration;\n\n  const BackwardSeekIndicator({\n    super.key,\n    required this.onSubmitted,\n    required this.duration,\n  });\n\n  @override\n  State<BackwardSeekIndicator> createState() => BackwardSeekIndicatorState();\n}\n\nclass BackwardSeekIndicatorState extends State<BackwardSeekIndicator> {\n  late Duration duration;\n\n  Timer? timer;\n\n  @override\n  void initState() {\n    super.initState();\n    duration = widget.duration;\n    timer = Timer(const Duration(milliseconds: 400), () {\n      widget.onSubmitted(duration);\n    });\n  }\n\n  @override\n  void dispose() {\n    timer?.cancel();\n    super.dispose();\n  }\n\n  void increment() {\n    timer?.cancel();\n    timer = Timer(const Duration(milliseconds: 400), () {\n      widget.onSubmitted(duration);\n    });\n    setState(() {\n      duration += widget.duration;\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        splashColor: const Color(0x44767676),\n        onTap: increment,\n        child: Container(\n          decoration: const BoxDecoration(\n            gradient: LinearGradient(\n              colors: [\n                Color(0x88767676),\n                Color(0x00767676),\n              ],\n              begin: Alignment.centerLeft,\n              end: Alignment.centerRight,\n            ),\n          ),\n          alignment: Alignment.center,\n          child: Column(\n            mainAxisSize: MainAxisSize.min,\n            mainAxisAlignment: MainAxisAlignment.center,\n            crossAxisAlignment: CrossAxisAlignment.center,\n            children: [\n              const Icon(\n                Icons.fast_rewind,\n                size: 24.0,\n                color: Colors.white,\n              ),\n              const SizedBox(height: 8.0),\n              Text(\n                '快退${duration.inSeconds}秒',\n                style: const TextStyle(\n                  fontSize: 12.0,\n                  color: Colors.white,\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/plugin/pl_player/widgets/bottom_control.dart",
    "content": "import 'package:PiliPlus/common/widgets/progress_bar/audio_video_progress_bar.dart';\nimport 'package:PiliPlus/common/widgets/progress_bar/segment_progress_bar.dart';\nimport 'package:PiliPlus/pages/video/controller.dart';\nimport 'package:PiliPlus/plugin/pl_player/controller.dart';\nimport 'package:PiliPlus/plugin/pl_player/view/view.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/feed_back.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\n\nclass BottomControl extends StatelessWidget {\n  const BottomControl({\n    super.key,\n    required this.maxWidth,\n    required this.isFullScreen,\n    required this.controller,\n    required this.buildBottomControl,\n    required this.videoDetailController,\n  });\n\n  final double maxWidth;\n  final bool isFullScreen;\n  final PlPlayerController controller;\n  final ValueGetter<Widget> buildBottomControl;\n  final VideoDetailController videoDetailController;\n\n  void onDragStart(ThumbDragDetails duration) {\n    feedBack();\n    controller.onChangedSliderStart(duration.timeStamp);\n  }\n\n  void onDragUpdate(ThumbDragDetails duration) {\n    if (!controller.isFileSource && controller.showSeekPreview) {\n      controller.updatePreviewIndex(duration.timeStamp.inSeconds);\n    }\n    controller.onUpdatedSliderProgress(duration.timeStamp);\n  }\n\n  void onSeek(Duration duration) {\n    if (controller.showSeekPreview) {\n      controller.showPreview.value = false;\n    }\n    controller\n      ..onChangedSliderEnd()\n      ..onChangedSlider(duration.inSeconds)\n      ..seekTo(Duration(seconds: duration.inSeconds), isSeek: false);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final colorScheme = ColorScheme.of(context);\n    final primary = colorScheme.isLight\n        ? colorScheme.inversePrimary\n        : colorScheme.primary;\n    final thumbGlowColor = primary.withAlpha(80);\n    final bufferedBarColor = primary.withValues(alpha: 0.4);\n\n    return Padding(\n      padding: const EdgeInsets.fromLTRB(10, 0, 10, 12),\n      child: Column(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          Padding(\n            padding: const EdgeInsets.fromLTRB(10, 0, 10, 7),\n            child: Obx(\n              () => Offstage(\n                offstage: !controller.showControls.value,\n                child: Stack(\n                  clipBehavior: Clip.none,\n                  alignment: Alignment.bottomCenter,\n                  children: [\n                    Obx(() {\n                      final int value = controller.sliderPositionSeconds.value;\n                      final int max = controller.duration.value.inSeconds;\n                      return ProgressBar(\n                        progress: Duration(seconds: value),\n                        buffered: Duration(\n                          seconds: controller.bufferedSeconds.value,\n                        ),\n                        total: Duration(seconds: max),\n                        progressBarColor: primary,\n                        baseBarColor: const Color(0x33FFFFFF),\n                        bufferedBarColor: bufferedBarColor,\n                        thumbColor: primary,\n                        thumbGlowColor: thumbGlowColor,\n                        barHeight: 3.5,\n                        thumbRadius: 7,\n                        thumbGlowRadius: 25,\n                        onDragStart: onDragStart,\n                        onDragUpdate: onDragUpdate,\n                        onSeek: onSeek,\n                      );\n                    }),\n                    if (controller.enableBlock &&\n                        videoDetailController.segmentProgressList.isNotEmpty)\n                      Positioned(\n                        left: 0,\n                        right: 0,\n                        bottom: 5.25,\n                        child: SegmentProgressBar(\n                          segments: videoDetailController.segmentProgressList,\n                        ),\n                      ),\n                    if (controller.showViewPoints &&\n                        videoDetailController.viewPointList.isNotEmpty &&\n                        videoDetailController.showVP.value)\n                      Padding(\n                        padding: const .only(bottom: 8.75),\n                        child: ViewPointSegmentProgressBar(\n                          segments: videoDetailController.viewPointList,\n                          onSeek: PlatformUtils.isDesktop\n                              ? (position) =>\n                                    controller.seekTo(position, isSeek: false)\n                              : null,\n                        ),\n                      ),\n                    if (videoDetailController.showDmTrendChart.value)\n                      if (videoDetailController.dmTrend.value?.dataOrNull\n                          case final list?)\n                        buildDmChart(primary, list, videoDetailController, 4.5),\n                  ],\n                ),\n              ),\n            ),\n          ),\n          buildBottomControl(),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/plugin/pl_player/widgets/common_btn.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass ComBtn extends StatelessWidget {\n  final Widget icon;\n  final VoidCallback? onTap;\n  final VoidCallback? onLongPress;\n  final VoidCallback? onSecondaryTap;\n  final double width;\n  final double height;\n  final String? tooltip;\n\n  const ComBtn({\n    super.key,\n    required this.icon,\n    this.onTap,\n    this.onLongPress,\n    this.onSecondaryTap,\n    this.width = 34,\n    this.height = 34,\n    this.tooltip,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    final child = SizedBox(\n      width: width,\n      height: height,\n      child: GestureDetector(\n        onTap: onTap,\n        onLongPress: onLongPress,\n        onSecondaryTap: onSecondaryTap,\n        behavior: HitTestBehavior.opaque,\n        child: icon,\n      ),\n    );\n    if (tooltip != null) {\n      return Tooltip(message: tooltip, child: child);\n    }\n    return child;\n  }\n}\n"
  },
  {
    "path": "lib/plugin/pl_player/widgets/forward_seek.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter/material.dart';\n\nclass ForwardSeekIndicator extends StatefulWidget {\n  final ValueChanged<Duration> onSubmitted;\n  final Duration duration;\n\n  const ForwardSeekIndicator({\n    super.key,\n    required this.onSubmitted,\n    required this.duration,\n  });\n\n  @override\n  State<ForwardSeekIndicator> createState() => ForwardSeekIndicatorState();\n}\n\nclass ForwardSeekIndicatorState extends State<ForwardSeekIndicator> {\n  late Duration duration;\n\n  Timer? timer;\n\n  @override\n  void initState() {\n    super.initState();\n    duration = widget.duration;\n    timer = Timer(const Duration(milliseconds: 400), () {\n      widget.onSubmitted(duration);\n    });\n  }\n\n  @override\n  void dispose() {\n    timer?.cancel();\n    super.dispose();\n  }\n\n  void increment() {\n    timer?.cancel();\n    timer = Timer(const Duration(milliseconds: 400), () {\n      widget.onSubmitted(duration);\n    });\n    setState(() {\n      duration += widget.duration;\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Material(\n      type: MaterialType.transparency,\n      child: InkWell(\n        splashColor: const Color(0x44767676),\n        onTap: increment,\n        child: Container(\n          decoration: const BoxDecoration(\n            gradient: LinearGradient(\n              colors: [\n                Color(0x00767676),\n                Color(0x88767676),\n              ],\n              begin: Alignment.centerLeft,\n              end: Alignment.centerRight,\n            ),\n          ),\n          alignment: Alignment.center,\n          child: Column(\n            mainAxisAlignment: MainAxisAlignment.center,\n            crossAxisAlignment: CrossAxisAlignment.center,\n            children: [\n              const Icon(\n                Icons.fast_forward,\n                size: 24.0,\n                color: Colors.white,\n              ),\n              const SizedBox(height: 8.0),\n              Text(\n                '快进${duration.inSeconds}秒',\n                style: const TextStyle(\n                  fontSize: 12.0,\n                  color: Colors.white,\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/plugin/pl_player/widgets/mpv_convert_webp.dart",
    "content": "// ignore_for_file: implementation_imports\n\nimport 'dart:async';\nimport 'dart:ffi';\n\nimport 'package:PiliPlus/http/browser_ua.dart';\nimport 'package:PiliPlus/http/constants.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:get/get_rx/get_rx.dart';\nimport 'package:media_kit/ffi/src/allocation.dart';\nimport 'package:media_kit/ffi/src/utf8.dart';\nimport 'package:media_kit/generated/libmpv/bindings.dart' as generated;\nimport 'package:media_kit/media_kit.dart';\nimport 'package:media_kit/src/player/native/core/initializer.dart';\n\nclass MpvConvertWebp {\n  final _mpv = NativePlayer.mpv;\n  late final Pointer<generated.mpv_handle> _ctx;\n  final _completer = Completer<bool>();\n\n  bool _success = false;\n\n  final String url;\n  final String outFile;\n  final double start;\n  final double duration;\n  final RxDouble? progress;\n  final WebpPreset preset;\n\n  MpvConvertWebp(\n    this.url,\n    this.outFile,\n    this.start,\n    double end, {\n    this.progress,\n    this.preset = WebpPreset.def,\n  }) : duration = end - start;\n\n  Future<void> _init() async {\n    final enableHA = Pref.enableHA;\n    _ctx = await Initializer.create(\n      _mpv,\n      _onEvent,\n      options: {\n        'o': outFile,\n        'start': start.toStringAsFixed(3),\n        'end': (start + duration).toStringAsFixed(3),\n        'of': 'webp',\n        'ovc': 'libwebp_anim',\n        'ofopts': 'loop=0',\n        'ovcopts': 'preset=${preset.flag}',\n        if (enableHA) 'vo': 'gpu',\n        if (enableHA)\n          'hwdec':\n              '${Pref.hardwareDecoding},auto-copy', // transcode only support copy\n      },\n    );\n    NativePlayer.setHeader(\n      _mpv,\n      _ctx,\n      userAgent: BrowserUa.pc,\n      referer: HttpString.baseUrl,\n    );\n    if (progress != null) {\n      _observeProperty('time-pos');\n    }\n    final level = (kDebugMode ? 'info' : 'error').toNativeUtf8();\n    _mpv.mpv_request_log_messages(_ctx, level);\n    calloc.free(level);\n  }\n\n  void dispose() {\n    Initializer.dispose(_ctx);\n    _mpv.mpv_terminate_destroy(_ctx);\n    if (!_completer.isCompleted) _completer.complete(false);\n  }\n\n  Future<bool> convert() async {\n    await _init();\n    _command(['loadfile', url]);\n    return _completer.future;\n  }\n\n  Future<void>? _onEvent(Pointer<generated.mpv_event> event) {\n    switch (event.ref.event_id) {\n      case generated.mpv_event_id.MPV_EVENT_PROPERTY_CHANGE:\n        final prop = event.ref.data.cast<generated.mpv_event_property>().ref;\n        if (prop.name.toDartString() == 'time-pos' &&\n            prop.format == generated.mpv_format.MPV_FORMAT_DOUBLE) {\n          progress!.value = (prop.data.cast<Double>().value - start) / duration;\n        }\n        break;\n      case generated.mpv_event_id.MPV_EVENT_FILE_LOADED:\n        _success = true;\n        break;\n      case generated.mpv_event_id.MPV_EVENT_LOG_MESSAGE:\n        final log = event.ref.data.cast<generated.mpv_event_log_message>().ref;\n        final prefix = log.prefix.toDartString().trim();\n        final level = log.level.toDartString().trim();\n        final text = log.text.toDartString().trim();\n        debugPrint('WebpConvert: $level $prefix : $text');\n        if (kDebugMode) {\n          if (level == 'error' || level == 'fatal') _success = false;\n        } else {\n          _success = false;\n        }\n        break;\n      case generated.mpv_event_id.MPV_EVENT_END_FILE ||\n          generated.mpv_event_id.MPV_EVENT_SHUTDOWN:\n        progress?.value = 1;\n        _completer.complete(_success);\n        dispose();\n        break;\n    }\n    return null;\n  }\n\n  void _command(List<String> args) {\n    final pointers = args.map((e) => e.toNativeUtf8()).toList();\n    final arr = calloc<Pointer<Uint8>>(pointers.length + 1);\n    for (int i = 0; i < args.length; i++) {\n      arr[i] = pointers[i];\n    }\n\n    _mpv.mpv_command(_ctx, arr);\n\n    calloc.free(arr);\n    pointers.forEach(calloc.free);\n  }\n\n  void _observeProperty(String property) {\n    final name = property.toNativeUtf8();\n    _mpv.mpv_observe_property(\n      _ctx,\n      property.hashCode,\n      name,\n      generated.mpv_format.MPV_FORMAT_DOUBLE,\n    );\n\n    calloc.free(name);\n  }\n}\n\nenum WebpPreset {\n  none('none', '无', '不使用预设'),\n  def('default', '默认', '默认预设'),\n  picture('picture', '图片', '数码照片，如人像、室内拍摄'),\n  photo('photo', '照片', '户外摄影，自然光环境'),\n  drawing('drawing', '绘图', '手绘或线稿，高对比度细节'),\n  icon('icon', '图标', '小型彩色图像'),\n  text('text', '文本', '文字类')\n  ;\n\n  final String flag;\n  final String name;\n  final String desc;\n\n  const WebpPreset(this.flag, this.name, this.desc);\n}\n"
  },
  {
    "path": "lib/plugin/pl_player/widgets/play_pause_btn.dart",
    "content": "import 'dart:async';\n\nimport 'package:PiliPlus/plugin/pl_player/controller.dart';\nimport 'package:flutter/material.dart';\nimport 'package:media_kit/media_kit.dart';\n\nclass PlayOrPauseButton extends StatefulWidget {\n  final PlPlayerController plPlayerController;\n\n  const PlayOrPauseButton({\n    super.key,\n    required this.plPlayerController,\n  });\n\n  @override\n  PlayOrPauseButtonState createState() => PlayOrPauseButtonState();\n}\n\nclass PlayOrPauseButtonState extends State<PlayOrPauseButton>\n    with SingleTickerProviderStateMixin {\n  late final AnimationController controller;\n  late final StreamSubscription<bool> subscription;\n  late Player player;\n\n  @override\n  void initState() {\n    super.initState();\n    player = widget.plPlayerController.videoPlayerController!;\n    controller = AnimationController(\n      vsync: this,\n      value: player.state.playing ? 1 : 0,\n      duration: const Duration(milliseconds: 200),\n    );\n    subscription = player.stream.playing.listen((playing) {\n      if (playing) {\n        controller.forward();\n      } else {\n        controller.reverse();\n      }\n    });\n  }\n\n  @override\n  void dispose() {\n    subscription.cancel();\n    controller.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return SizedBox(\n      width: 42,\n      height: 34,\n      child: GestureDetector(\n        behavior: HitTestBehavior.opaque,\n        onTap: widget.plPlayerController.onDoubleTapCenter,\n        child: Center(\n          child: AnimatedIcon(\n            semanticLabel: player.state.playing ? '暂停' : '播放',\n            progress: controller,\n            icon: AnimatedIcons.play_pause,\n            color: Colors.white,\n            size: 20,\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/router/app_pages.dart",
    "content": "import 'package:PiliPlus/pages/about/view.dart';\nimport 'package:PiliPlus/pages/article/view.dart';\nimport 'package:PiliPlus/pages/article_list/view.dart';\nimport 'package:PiliPlus/pages/audio/view.dart';\nimport 'package:PiliPlus/pages/blacklist/view.dart';\nimport 'package:PiliPlus/pages/danmaku_block/view.dart';\nimport 'package:PiliPlus/pages/dlna/view.dart';\nimport 'package:PiliPlus/pages/download/view.dart';\nimport 'package:PiliPlus/pages/dynamics/view.dart';\nimport 'package:PiliPlus/pages/dynamics_create_vote/view.dart';\nimport 'package:PiliPlus/pages/dynamics_detail/view.dart';\nimport 'package:PiliPlus/pages/dynamics_topic/view.dart';\nimport 'package:PiliPlus/pages/dynamics_topic_rcmd/view.dart';\nimport 'package:PiliPlus/pages/fan/view.dart';\nimport 'package:PiliPlus/pages/fav/view.dart';\nimport 'package:PiliPlus/pages/fav_create/view.dart';\nimport 'package:PiliPlus/pages/fav_detail/view.dart';\nimport 'package:PiliPlus/pages/fav_search/view.dart';\nimport 'package:PiliPlus/pages/follow/view.dart';\nimport 'package:PiliPlus/pages/follow_search/view.dart';\nimport 'package:PiliPlus/pages/follow_type/follow_same/view.dart';\nimport 'package:PiliPlus/pages/follow_type/followed/view.dart';\nimport 'package:PiliPlus/pages/history/view.dart';\nimport 'package:PiliPlus/pages/history_search/view.dart';\nimport 'package:PiliPlus/pages/home/view.dart';\nimport 'package:PiliPlus/pages/hot/view.dart';\nimport 'package:PiliPlus/pages/later/view.dart';\nimport 'package:PiliPlus/pages/later_search/view.dart';\nimport 'package:PiliPlus/pages/live_dm_block/view.dart';\nimport 'package:PiliPlus/pages/live_room/view.dart';\nimport 'package:PiliPlus/pages/login/view.dart';\nimport 'package:PiliPlus/pages/main/view.dart';\nimport 'package:PiliPlus/pages/main_reply/view.dart';\nimport 'package:PiliPlus/pages/match_info/view.dart';\nimport 'package:PiliPlus/pages/member/view.dart';\nimport 'package:PiliPlus/pages/member_dynamics/view.dart';\nimport 'package:PiliPlus/pages/member_profile/view.dart';\nimport 'package:PiliPlus/pages/member_search/view.dart';\nimport 'package:PiliPlus/pages/member_upower_rank/view.dart';\nimport 'package:PiliPlus/pages/msg_feed_top/at_me/view.dart';\nimport 'package:PiliPlus/pages/msg_feed_top/like_detail/view.dart';\nimport 'package:PiliPlus/pages/msg_feed_top/like_me/view.dart';\nimport 'package:PiliPlus/pages/msg_feed_top/reply_me/view.dart';\nimport 'package:PiliPlus/pages/msg_feed_top/sys_msg/view.dart';\nimport 'package:PiliPlus/pages/music/view.dart';\nimport 'package:PiliPlus/pages/my_reply/view.dart';\nimport 'package:PiliPlus/pages/popular_precious/view.dart';\nimport 'package:PiliPlus/pages/popular_series/view.dart';\nimport 'package:PiliPlus/pages/search/view.dart';\nimport 'package:PiliPlus/pages/search_result/view.dart';\nimport 'package:PiliPlus/pages/search_trending/view.dart';\nimport 'package:PiliPlus/pages/setting/extra_setting.dart';\nimport 'package:PiliPlus/pages/setting/pages/bar_set.dart';\nimport 'package:PiliPlus/pages/setting/pages/color_select.dart';\nimport 'package:PiliPlus/pages/setting/pages/display_mode.dart';\nimport 'package:PiliPlus/pages/setting/pages/font_size_select.dart';\nimport 'package:PiliPlus/pages/setting/pages/logs.dart';\nimport 'package:PiliPlus/pages/setting/pages/play_speed_set.dart';\nimport 'package:PiliPlus/pages/setting/play_setting.dart';\nimport 'package:PiliPlus/pages/setting/privacy_setting.dart';\nimport 'package:PiliPlus/pages/setting/recommend_setting.dart';\nimport 'package:PiliPlus/pages/setting/style_setting.dart';\nimport 'package:PiliPlus/pages/setting/video_setting.dart';\nimport 'package:PiliPlus/pages/setting/view.dart';\nimport 'package:PiliPlus/pages/settings_search/view.dart';\nimport 'package:PiliPlus/pages/space_setting/view.dart';\nimport 'package:PiliPlus/pages/sponsor_block/view.dart';\nimport 'package:PiliPlus/pages/subscription/view.dart';\nimport 'package:PiliPlus/pages/subscription_detail/view.dart';\nimport 'package:PiliPlus/pages/video/view.dart';\nimport 'package:PiliPlus/pages/webdav/view.dart';\nimport 'package:PiliPlus/pages/webview/view.dart';\nimport 'package:PiliPlus/pages/whisper/view.dart';\nimport 'package:PiliPlus/pages/whisper_detail/view.dart';\nimport 'package:get/get.dart';\n\nclass Routes {\n  static final List<GetPage<dynamic>> getPages = [\n    GetPage(name: '/', page: () => const MainApp()),\n    // 首页(推荐)\n    GetPage(name: '/home', page: () => const HomePage()),\n    // 热门\n    GetPage(name: '/hot', page: () => const HotPage()),\n    // 视频详情\n    GetPage(name: '/videoV', page: () => const VideoDetailPageV()),\n    //\n    GetPage(name: '/webview', page: () => const WebviewPage()),\n    // 设置\n    GetPage(name: '/setting', page: () => const SettingPage()),\n    //\n    GetPage(name: '/fav', page: () => const FavPage()),\n    //\n    GetPage(name: '/favDetail', page: () => const FavDetailPage()),\n    // 稍后再看\n    GetPage(name: '/later', page: () => const LaterPage()),\n    // 历史记录\n    GetPage(name: '/history', page: () => const HistoryPage()),\n    // 搜索页面\n    GetPage(name: '/search', page: () => const SearchPage()),\n    // 搜索结果\n    GetPage(name: '/searchResult', page: () => const SearchResultPage()),\n    // 动态\n    GetPage(name: '/dynamics', page: () => const DynamicsPage()),\n    // 动态详情\n    GetPage(name: '/dynamicDetail', page: () => const DynamicDetailPage()),\n    // 关注\n    GetPage(name: '/follow', page: () => const FollowPage()),\n    // 粉丝\n    GetPage(name: '/fan', page: () => const FansPage()),\n    // 直播详情\n    GetPage(name: '/liveRoom', page: () => const LiveRoomPage()),\n    // 用户中心\n    GetPage(name: '/member', page: () => const MemberPage()),\n    GetPage(name: '/memberSearch', page: () => const MemberSearchPage()),\n    // 推荐流设置\n    GetPage(name: '/recommendSetting', page: () => const RecommendSetting()),\n    // 音视频设置\n    GetPage(name: '/videoSetting', page: () => const VideoSetting()),\n    // 播放器设置\n    GetPage(name: '/playSetting', page: () => const PlaySetting()),\n    // 外观设置\n    GetPage(name: '/styleSetting', page: () => const StyleSetting()),\n    // 隐私设置\n    GetPage(name: '/privacySetting', page: () => const PrivacySetting()),\n    // 其它设置\n    GetPage(name: '/extraSetting', page: () => const ExtraSetting()),\n    //\n    GetPage(name: '/blackListPage', page: () => const BlackListPage()),\n    GetPage(name: '/colorSetting', page: () => const ColorSelectPage()),\n    GetPage(name: '/fontSizeSetting', page: () => const FontSizeSelectPage()),\n    // 屏幕帧率\n    GetPage(name: '/displayModeSetting', page: () => const SetDisplayMode()),\n    // 关于\n    GetPage(name: '/about', page: () => const AboutPage()),\n    //\n    GetPage(name: '/articlePage', page: () => const ArticlePage()),\n\n    // 历史记录搜索\n    GetPage(name: '/playSpeedSet', page: () => const PlaySpeedPage()),\n    // 收藏搜索\n    GetPage(name: '/favSearch', page: () => const FavSearchPage()),\n    GetPage(name: '/historySearch', page: () => const HistorySearchPage()),\n    GetPage(name: '/laterSearch', page: () => const LaterSearchPage()),\n    GetPage(name: '/followSearch', page: () => const FollowSearchPage()),\n    // 消息页面\n    GetPage(name: '/whisper', page: () => const WhisperPage()),\n    // 私信详情\n    GetPage(name: '/whisperDetail', page: () => const WhisperDetailPage()),\n    // 回复我的\n    GetPage(name: '/replyMe', page: () => const ReplyMePage()),\n    // @我的\n    GetPage(name: '/atMe', page: () => const AtMePage()),\n    // 收到的赞\n    GetPage(name: '/likeMe', page: () => const LikeMePage()),\n    // 系统消息\n    GetPage(name: '/sysMsg', page: () => const SysMsgPage()),\n    // 登录页面\n    GetPage(name: '/loginPage', page: () => const LoginPage()),\n    // 用户动态\n    GetPage(name: '/memberDynamics', page: () => const MemberDynamicsPage()),\n    // 日志\n    GetPage(name: '/logs', page: () => const LogsPage()),\n    // 订阅\n    GetPage(name: '/subscription', page: () => const SubPage()),\n    // 订阅详情\n    GetPage(name: '/subDetail', page: () => const SubDetailPage()),\n    // 弹幕屏蔽管理\n    GetPage(name: '/danmakuBlock', page: () => const DanmakuBlockPage()),\n    GetPage(name: '/sponsorBlock', page: () => const SponsorBlockPage()),\n    GetPage(name: '/createFav', page: () => const CreateFavPage()),\n    GetPage(name: '/editProfile', page: () => const EditProfilePage()),\n    GetPage(name: '/settingsSearch', page: () => const SettingsSearchPage()),\n    GetPage(name: '/webdavSetting', page: () => const WebDavSettingPage()),\n    GetPage(name: '/searchTrending', page: () => const SearchTrendingPage()),\n    GetPage(name: '/dynTopic', page: () => const DynTopicPage()),\n    GetPage(name: '/articleList', page: () => const ArticleListPage()),\n    GetPage(name: '/barSetting', page: () => const BarSetPage()),\n    GetPage(name: '/upowerRank', page: () => const UpowerRankPage()),\n    GetPage(name: '/spaceSetting', page: () => const SpaceSettingPage()),\n    GetPage(name: '/dynTopicRcmd', page: () => const DynTopicRcmdPage()),\n    GetPage(name: '/matchInfo', page: () => const MatchInfoPage()),\n    GetPage(name: '/msgLikeDetail', page: () => const LikeDetailPage()),\n    GetPage(name: '/liveDmBlockPage', page: () => const LiveDmBlockPage()),\n    GetPage(name: '/createVote', page: () => const CreateVotePage()),\n    GetPage(name: '/musicDetail', page: () => const MusicDetailPage()),\n    GetPage(name: '/popularSeries', page: () => const PopularSeriesPage()),\n    GetPage(name: '/popularPrecious', page: () => const PopularPreciousPage()),\n    GetPage(name: '/audio', page: () => const AudioPage()),\n    GetPage(name: '/mainReply', page: () => const MainReplyPage()),\n    GetPage(name: '/followed', page: () => const FollowedPage()),\n    GetPage(name: '/sameFollowing', page: () => const FollowSamePage()),\n    GetPage(name: '/download', page: () => const DownloadPage()),\n    GetPage(name: '/dlna', page: () => const DLNAPage()),\n    GetPage(name: '/myReply', page: () => const MyReply()),\n  ];\n}\n"
  },
  {
    "path": "lib/scripts/bottom_sheet.patch",
    "content": "diff --git a/packages/flutter/lib/src/material/bottom_sheet.dart b/packages/flutter/lib/src/material/bottom_sheet.dart\nindex ec9e4270863..c850912afe1 100644\n--- a/packages/flutter/lib/src/material/bottom_sheet.dart\n+++ b/packages/flutter/lib/src/material/bottom_sheet.dart\n@@ -1412,6 +1412,7 @@ class _BottomSheetGestureDetector extends StatelessWidget {\n                   ..onStart = onVerticalDragStart\n                   ..onUpdate = onVerticalDragUpdate\n                   ..onEnd = onVerticalDragEnd\n+                  ..gestureSettings = MediaQuery.maybeGestureSettingsOf(context)\n                   ..onlyAcceptDragOnThreshold = true;\n               },\n             ),\n"
  },
  {
    "path": "lib/scripts/build.ps1",
    "content": "param(\n    [string]$Arg = ''\n)\n\ntry {\n    $versionName = $null\n\n    $versionCode = [int](git rev-list --count HEAD).Trim()\n\n    $commitHash = (git rev-parse HEAD).Trim()\n\n    $updatedContent = foreach ($line in (Get-Content -Path 'pubspec.yaml' -Encoding UTF8)) {\n        if ($line -match '^\\s*version:\\s*([\\d\\.]+)') {\n            $versionName = $matches[1]\n            if ($Arg -eq 'android') {\n                $versionName += '-' + $commitHash.Substring(0, 9)\n            }\n            \"version: $versionName+$versionCode\"\n        }\n        else {\n            $line\n        }\n    }\n\n    if ($null -eq $versionName) {\n        throw 'version not found'\n    }\n\n    $updatedContent | Set-Content -Path 'pubspec.yaml' -Encoding UTF8\n\n    $buildTime = [int]([DateTimeOffset]::Now.ToUnixTimeSeconds())\n\n    $data = @{\n        'pili.name' = $versionName\n        'pili.code' = $versionCode\n        'pili.hash' = $commitHash\n        'pili.time' = $buildTime\n    }\n\n    $data | ConvertTo-Json -Compress | Out-File 'pili_release.json' -Encoding UTF8\n\n    Add-Content -Path $env:GITHUB_ENV -Value \"version=$versionName+$versionCode\"\n}\ncatch {\n    Write-Error \"Prebuild Error: $($_.Exception.Message)\"\n    exit 1\n}"
  },
  {
    "path": "lib/scripts/modal_barrier.patch",
    "content": "diff --git a/packages/flutter/lib/src/material/popup_menu.dart b/packages/flutter/lib/src/material/popup_menu.dart\nindex 03a0ee2b8de..984e6ced68e 100644\n--- a/packages/flutter/lib/src/material/popup_menu.dart\n+++ b/packages/flutter/lib/src/material/popup_menu.dart\n@@ -1014,6 +1014,9 @@ class _PopupMenuRoute<T> extends PopupRoute<T> {\n   @override\n   final String barrierLabel;\n \n+  @override\n+  bool get isMenu => true;\n+\n   @override\n   Widget buildPage(\n     BuildContext context,\ndiff --git a/packages/flutter/lib/src/widgets/modal_barrier.dart b/packages/flutter/lib/src/widgets/modal_barrier.dart\nindex 7b83d9c42cb..3946aa4950a 100644\n--- a/packages/flutter/lib/src/widgets/modal_barrier.dart\n+++ b/packages/flutter/lib/src/widgets/modal_barrier.dart\n@@ -131,6 +131,7 @@ class ModalBarrier extends StatelessWidget {\n     super.key,\n     this.color,\n     this.dismissible = true,\n+    this.isMenu = false,\n     this.onDismiss,\n     this.semanticsLabel,\n     this.barrierSemanticsDismissible = true,\n@@ -159,6 +160,8 @@ class ModalBarrier extends StatelessWidget {\n   ///    [ModalBarrier] built by [ModalRoute] pages.\n   final bool dismissible;\n \n+  final bool isMenu;\n+\n   /// {@template flutter.widgets.ModalBarrier.onDismiss}\n   /// Called when the barrier is being dismissed.\n   ///\n@@ -264,7 +267,11 @@ class ModalBarrier extends StatelessWidget {\n     return BlockSemantics(\n       child: ExcludeSemantics(\n         excluding: excluding,\n-        child: _ModalBarrierGestureDetector(onDismiss: handleDismiss, child: barrier),\n+        child: _ModalBarrierGestureDetector(\n+          onAnyTapUp: isMenu ? null : handleDismiss,\n+          onAnyTapDown: isMenu ? handleDismiss : null,\n+          child: barrier,\n+        ),\n       ),\n     );\n   }\n@@ -292,6 +299,7 @@ class AnimatedModalBarrier extends AnimatedWidget {\n     super.key,\n     required Animation<Color?> color,\n     this.dismissible = true,\n+    this.isMenu = false,\n     this.semanticsLabel,\n     this.barrierSemanticsDismissible,\n     this.onDismiss,\n@@ -315,6 +323,8 @@ class AnimatedModalBarrier extends AnimatedWidget {\n   ///    [AnimatedModalBarrier] built by [ModalRoute] pages.\n   final bool dismissible;\n \n+  final bool isMenu;\n+\n   /// Semantics label used for the barrier if it is [dismissible].\n   ///\n   /// The semantics label is read out by accessibility tools (e.g. TalkBack\n@@ -359,6 +369,7 @@ class AnimatedModalBarrier extends AnimatedWidget {\n       onDismiss: onDismiss,\n       clipDetailsNotifier: clipDetailsNotifier,\n       semanticsOnTapHint: semanticsOnTapHint,\n+      isMenu: isMenu,\n     );\n   }\n }\n@@ -372,10 +383,12 @@ class _AnyTapGestureRecognizer extends BaseTapGestureRecognizer {\n \n   VoidCallback? onAnyTapUp;\n \n+  VoidCallback? onAnyTapDown;\n+\n   @protected\n   @override\n   bool isPointerAllowed(PointerDownEvent event) {\n-    if (onAnyTapUp == null) {\n+    if (onAnyTapUp == null && onAnyTapDown == null) {\n       return false;\n     }\n     return super.isPointerAllowed(event);\n@@ -384,7 +397,9 @@ class _AnyTapGestureRecognizer extends BaseTapGestureRecognizer {\n   @protected\n   @override\n   void handleTapDown({PointerDownEvent? down}) {\n-    // Do nothing.\n+    if (onAnyTapDown != null) {\n+      invokeCallback('onAnyTapDown', onAnyTapDown!);\n+    }\n   }\n \n   @protected\n@@ -401,28 +416,41 @@ class _AnyTapGestureRecognizer extends BaseTapGestureRecognizer {\n     // Do nothing.\n   }\n \n+  // @override\n+  // void handleEvent(PointerEvent event) {\n+  //   assert(state != GestureRecognizerState.ready);\n+  //   if (state == GestureRecognizerState.possible && event.pointer == primaryPointer) {\n+  //     handlePrimaryPointer(event);\n+  //   }\n+  //   stopTrackingIfPointerNoLongerDown(event);\n+  // }\n+\n   @override\n   String get debugDescription => 'any tap';\n }\n \n class _AnyTapGestureRecognizerFactory extends GestureRecognizerFactory<_AnyTapGestureRecognizer> {\n-  const _AnyTapGestureRecognizerFactory({this.onAnyTapUp});\n+  const _AnyTapGestureRecognizerFactory({this.onAnyTapUp, this.onAnyTapDown});\n \n   final VoidCallback? onAnyTapUp;\n \n+  final VoidCallback? onAnyTapDown;\n+\n   @override\n   _AnyTapGestureRecognizer constructor() => _AnyTapGestureRecognizer();\n \n   @override\n   void initializer(_AnyTapGestureRecognizer instance) {\n-    instance.onAnyTapUp = onAnyTapUp;\n+    instance\n+      ..onAnyTapUp = onAnyTapUp\n+      ..onAnyTapDown = onAnyTapDown;\n   }\n }\n \n // A GestureDetector used by ModalBarrier. It only has one callback,\n // [onAnyTapDown], which recognizes tap down unconditionally.\n class _ModalBarrierGestureDetector extends StatelessWidget {\n-  const _ModalBarrierGestureDetector({required this.child, required this.onDismiss});\n+  const _ModalBarrierGestureDetector({required this.child, this.onAnyTapUp, this.onAnyTapDown});\n \n   /// The widget below this widget in the tree.\n   /// See [RawGestureDetector.child].\n@@ -430,12 +458,17 @@ class _ModalBarrierGestureDetector extends StatelessWidget {\n \n   /// Immediately called when an event that should dismiss the modal barrier\n   /// has happened.\n-  final VoidCallback onDismiss;\n+  final VoidCallback? onAnyTapUp;\n+\n+  final VoidCallback? onAnyTapDown;\n \n   @override\n   Widget build(BuildContext context) {\n     final gestures = <Type, GestureRecognizerFactory>{\n-      _AnyTapGestureRecognizer: _AnyTapGestureRecognizerFactory(onAnyTapUp: onDismiss),\n+      _AnyTapGestureRecognizer: _AnyTapGestureRecognizerFactory(\n+        onAnyTapUp: onAnyTapUp,\n+        onAnyTapDown: onAnyTapDown,\n+      ),\n     };\n \n     return RawGestureDetector(gestures: gestures, behavior: HitTestBehavior.opaque, child: child);\ndiff --git a/packages/flutter/lib/src/widgets/routes.dart b/packages/flutter/lib/src/widgets/routes.dart\nindex 48927ea4ba5..25e9848b381 100644\n--- a/packages/flutter/lib/src/widgets/routes.dart\n+++ b/packages/flutter/lib/src/widgets/routes.dart\n@@ -1715,6 +1715,8 @@ abstract class ModalRoute<T> extends TransitionRoute<T> with LocalHistoryRoute<T\n   /// {@endtemplate}\n   bool get barrierDismissible;\n \n+  bool get isMenu => false;\n+\n   /// Whether the semantics of the modal barrier are included in the\n   /// semantics tree.\n   ///\n@@ -2291,6 +2293,7 @@ abstract class ModalRoute<T> extends TransitionRoute<T> with LocalHistoryRoute<T\n             barrierDismissible, // changedInternalState is called if barrierDismissible updates\n         semanticsLabel: barrierLabel, // changedInternalState is called if barrierLabel updates\n         barrierSemanticsDismissible: semanticsDismissible,\n+        isMenu: isMenu,\n       );\n     } else {\n       barrier = ModalBarrier(\n@@ -2298,6 +2301,7 @@ abstract class ModalRoute<T> extends TransitionRoute<T> with LocalHistoryRoute<T\n             barrierDismissible, // changedInternalState is called if barrierDismissible updates\n         semanticsLabel: barrierLabel, // changedInternalState is called if barrierLabel updates\n         barrierSemanticsDismissible: semanticsDismissible,\n+        isMenu: isMenu,\n       );\n     }\n \n"
  },
  {
    "path": "lib/scripts/mouse_cursor.patch",
    "content": "diff --git a/packages/flutter/lib/src/widgets/widget_state.dart b/packages/flutter/lib/src/widgets/widget_state.dart\nindex 1b683c51b66..b7277a49c75 100644\n--- a/packages/flutter/lib/src/widgets/widget_state.dart\n+++ b/packages/flutter/lib/src/widgets/widget_state.dart\n@@ -448,7 +448,7 @@ abstract class WidgetStateMouseCursor extends MouseCursor\n     if (states.contains(WidgetState.disabled)) {\n       return SystemMouseCursors.basic;\n     }\n-    return kIsWeb ? SystemMouseCursors.click : SystemMouseCursors.basic;\n+    return SystemMouseCursors.click;\n   }\n \n   /// A mouse cursor for widgets related to text, which resolves differently\n"
  },
  {
    "path": "lib/scripts/patch.ps1",
    "content": "param(\n    [string]$platform = \"\"\n)\n\n# TODO: remove\n# https://github.com/flutter/flutter/issues/182468\n$ToolTipFix = \"56956c33ef102ac0b5fc46b62bd2dd9f50a86616\";\n\n# TODO: remove\n# https://github.com/flutter/flutter/issues/182281\n$NewOverScrollIndicator = \"362b1de29974ffc1ed6faa826e1df870d7bec75f\";\n\n$BottomSheetPatch = \"lib/scripts/bottom_sheet.patch\"\n# TODO: remove\n# https://github.com/flutter/flutter/issues/90223\n$ModalBarrierPatch = \"lib/scripts/modal_barrier.patch\"\n# TODO: remove\n# https://github.com/flutter/flutter/issues/182466\n$MouseCursorPatch = \"lib/scripts/mouse_cursor.patch\"\n\nSet-Location $env:FLUTTER_ROOT\n\n$picks   = @()\n$reverts = @()\n$patches = @($ModalBarrierPatch, $MouseCursorPatch)\n\nswitch ($platform.ToLower()) {\n    \"android\" {\n        $reverts += $NewOverScrollIndicator\n        $patches += $BottomSheetPatch\n    }\n    \"ios\" {}\n    \"linux\" {\n        $picks += $ToolTipFix\n    }\n    \"macos\" {\n        $picks += $ToolTipFix\n    }\n    \"windows\" {\n        $picks += $ToolTipFix\n    }\n    default {}\n}\n\ngit config --global user.name \"ci\"\ngit config --global user.email \"example@example.com\"\n\ngit reset --hard HEAD\n\nforeach ($pick in $picks) {\n    git stash\n    git cherry-pick $pick --no-edit\n    if ($LASTEXITCODE -eq 0) {\n        git reset --soft HEAD~1\n        Write-Host \"$pick picked\"\n    }\n    git stash pop\n}\n\nforeach ($revert in $reverts) {\n    git stash\n    git revert $revert --no-edit\n    if ($LASTEXITCODE -eq 0) {\n        git reset --soft HEAD~1\n        Write-Host \"$revert reverted\"\n    }\n    git stash pop\n}\n\nforeach ($patch in $patches) {\n    git apply \"$env:GITHUB_WORKSPACE/$patch\"\n    if ($LASTEXITCODE -eq 0) {\n        Write-Host \"$patch applied\"\n    }\n}\n"
  },
  {
    "path": "lib/services/account_service.dart",
    "content": "import 'dart:async';\n\nimport 'package:PiliPlus/models/user/info.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:get/get.dart';\n\nclass AccountService extends GetxService {\n  final RxString face = ''.obs;\n  final RxBool isLogin = false.obs;\n\n  @override\n  void onInit() {\n    super.onInit();\n    UserInfoData? userInfo = Pref.userInfoCache;\n    if (userInfo != null) {\n      face.value = userInfo.face ?? '';\n      isLogin.value = true;\n    } else {\n      face.value = '';\n      isLogin.value = false;\n    }\n  }\n}\n\nmixin AccountMixin on GetLifeCycleBase {\n  StreamSubscription<bool>? _listener;\n\n  AccountService get accountService => Get.find<AccountService>();\n\n  void onChangeAccount(bool isLogin);\n\n  @override\n  void onInit() {\n    super.onInit();\n    _listener = accountService.isLogin.listen(onChangeAccount);\n  }\n\n  @override\n  void onClose() {\n    _listener?.cancel();\n    _listener = null;\n    super.onClose();\n  }\n}\n"
  },
  {
    "path": "lib/services/audio_handler.dart",
    "content": "import 'dart:io' show File;\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/grpc/bilibili/app/listener/v1.pb.dart' show DetailItem;\nimport 'package:PiliPlus/models_new/download/bili_download_entry_info.dart';\nimport 'package:PiliPlus/models_new/live/live_room_info_h5/data.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/episode.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/data.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/page.dart';\nimport 'package:PiliPlus/plugin/pl_player/controller.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/play_status.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:PiliPlus/utils/image_utils.dart';\nimport 'package:PiliPlus/utils/path_utils.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:audio_service/audio_service.dart';\nimport 'package:path/path.dart' as path;\n\nFuture<VideoPlayerServiceHandler> initAudioService() {\n  return AudioService.init(\n    builder: VideoPlayerServiceHandler.new,\n    config: const AudioServiceConfig(\n      androidNotificationChannelId: 'com.example.piliplus.audio',\n      androidNotificationChannelName: 'Audio Service ${Constants.appName}',\n      androidNotificationOngoing: true,\n      androidStopForegroundOnPause: true,\n      fastForwardInterval: Duration(seconds: 10),\n      rewindInterval: Duration(seconds: 10),\n      androidNotificationChannelDescription: 'Media notification channel',\n      androidNotificationIcon: 'drawable/ic_notification_icon',\n    ),\n  );\n}\n\nclass VideoPlayerServiceHandler extends BaseAudioHandler with SeekHandler {\n  static final List<MediaItem> _item = [];\n  bool enableBackgroundPlay = Pref.enableBackgroundPlay;\n\n  Future<void>? Function()? onPlay;\n  Future<void>? Function()? onPause;\n  Future<void>? Function(Duration position)? onSeek;\n\n  @override\n  Future<void> play() {\n    return onPlay?.call() ??\n        PlPlayerController.playIfExists() ??\n        Future.syncValue(null);\n    // player.play();\n  }\n\n  @override\n  Future<void> pause() {\n    return onPause?.call() ?? PlPlayerController.pauseIfExists();\n    // player.pause();\n  }\n\n  @override\n  Future<void> seek(Duration position) {\n    playbackState.add(\n      playbackState.value.copyWith(\n        updatePosition: position,\n      ),\n    );\n    return (onSeek?.call(position) ??\n        PlPlayerController.seekToIfExists(position, isSeek: false));\n    // await player.seekTo(position);\n  }\n\n  void setMediaItem(MediaItem newMediaItem) {\n    if (!enableBackgroundPlay) return;\n    // if (kDebugMode) {\n    //   debugPrint(\"此时调用栈为：\");\n    //   debugPrint(newMediaItem);\n    //   debugPrint(newMediaItem.title);\n    //   debugPrint(StackTrace.current.toString());\n    // }\n    if (!mediaItem.isClosed) mediaItem.add(newMediaItem);\n  }\n\n  void setPlaybackState(\n    PlayerStatus status,\n    bool isBuffering,\n    bool isLive,\n  ) {\n    if (!enableBackgroundPlay ||\n        _item.isEmpty ||\n        !PlPlayerController.instanceExists()) {\n      return;\n    }\n\n    final AudioProcessingState processingState;\n    if (status.isCompleted) {\n      processingState = AudioProcessingState.completed;\n    } else if (isBuffering) {\n      processingState = AudioProcessingState.buffering;\n    } else {\n      processingState = AudioProcessingState.ready;\n    }\n\n    final playing = status.isPlaying;\n    playbackState.add(\n      playbackState.value.copyWith(\n        processingState: isBuffering\n            ? AudioProcessingState.buffering\n            : processingState,\n        controls: [\n          if (!isLive)\n            MediaControl.rewind.copyWith(\n              androidIcon: 'drawable/ic_baseline_replay_10_24',\n            ),\n          if (playing) MediaControl.pause else MediaControl.play,\n          if (!isLive)\n            MediaControl.fastForward.copyWith(\n              androidIcon: 'drawable/ic_baseline_forward_10_24',\n            ),\n        ],\n        playing: playing,\n        systemActions: const {\n          MediaAction.seek,\n        },\n      ),\n    );\n  }\n\n  void onStatusChange(PlayerStatus status, bool isBuffering, isLive) {\n    if (!enableBackgroundPlay) return;\n\n    if (_item.isEmpty) return;\n    setPlaybackState(status, isBuffering, isLive);\n  }\n\n  void onVideoDetailChange(\n    dynamic data,\n    int cid,\n    String herotag, {\n    String? artist,\n    String? cover,\n  }) {\n    if (!enableBackgroundPlay) return;\n    // if (kDebugMode) {\n    //   debugPrint('当前调用栈为：');\n    //   debugPrint(StackTrace.current);\n    // }\n    if (!PlPlayerController.instanceExists()) return;\n    if (data == null) return;\n\n    Uri getUri(String? cover) => Uri.parse(ImageUtils.safeThumbnailUrl(cover));\n\n    late final id = '$cid$herotag';\n    final MediaItem mediaItem;\n    switch (data) {\n      case VideoDetailData(:final pages):\n        if (pages != null && pages.length > 1) {\n          final current = pages.firstWhereOrNull((e) => e.cid == cid);\n          mediaItem = MediaItem(\n            id: id,\n            title: current?.part ?? '',\n            artist: data.owner?.name,\n            duration: Duration(seconds: current?.duration ?? 0),\n            artUri: getUri(data.pic),\n          );\n        } else {\n          mediaItem = MediaItem(\n            id: id,\n            title: data.title ?? '',\n            artist: data.owner?.name,\n            duration: Duration(seconds: data.duration ?? 0),\n            artUri: getUri(data.pic),\n          );\n        }\n      case EpisodeItem():\n        mediaItem = MediaItem(\n          id: id,\n          title: data.showTitle ?? data.longTitle ?? data.title ?? '',\n          artist: artist,\n          duration: data.from == 'pugv'\n              ? Duration(seconds: data.duration ?? 0)\n              : Duration(milliseconds: data.duration ?? 0),\n          artUri: getUri(data.cover),\n        );\n      case RoomInfoH5Data():\n        mediaItem = MediaItem(\n          id: id,\n          title: data.roomInfo?.title ?? '',\n          artist: data.anchorInfo?.baseInfo?.uname,\n          artUri: getUri(data.roomInfo?.cover),\n          isLive: true,\n        );\n      case Part():\n        mediaItem = MediaItem(\n          id: id,\n          title: data.part ?? '',\n          artist: artist,\n          duration: Duration(seconds: data.duration ?? 0),\n          artUri: getUri(cover),\n        );\n      case DetailItem(:final arc):\n        mediaItem = MediaItem(\n          id: id,\n          title: arc.title,\n          artist: data.owner.name,\n          duration: Duration(seconds: arc.duration.toInt()),\n          artUri: getUri(arc.cover),\n        );\n      case BiliDownloadEntryInfo():\n        final coverFile = File(\n          path.join(data.entryDirPath, PathUtils.coverName),\n        );\n        final uri = coverFile.existsSync()\n            ? coverFile.absolute.uri\n            : getUri(data.cover);\n        mediaItem = MediaItem(\n          id: id,\n          title: data.showTitle,\n          artist: data.ownerName,\n          duration: Duration(milliseconds: data.totalTimeMilli),\n          artUri: uri,\n        );\n      default:\n        return;\n    }\n    // if (kDebugMode) debugPrint(\"exist: ${PlPlayerController.instanceExists()}\");\n    if (!PlPlayerController.instanceExists()) return;\n    _item.add(mediaItem);\n    setMediaItem(mediaItem);\n  }\n\n  void onVideoDetailDispose(String herotag) {\n    if (!enableBackgroundPlay) return;\n\n    if (_item.isNotEmpty) {\n      _item.removeWhere((item) => item.id.endsWith(herotag));\n    }\n    if (_item.isNotEmpty) {\n      playbackState.add(\n        playbackState.value.copyWith(\n          processingState: AudioProcessingState.idle,\n          playing: false,\n        ),\n      );\n      setMediaItem(_item.last);\n      stop();\n    }\n  }\n\n  void clear() {\n    if (!enableBackgroundPlay) return;\n    mediaItem.add(null);\n    _item.clear();\n    /**\n     * if (playbackState.processingState == AudioProcessingState.idle &&\n            previousState?.processingState != AudioProcessingState.idle) {\n          await AudioService._stop();\n        }\n     */\n    if (playbackState.value.processingState == AudioProcessingState.idle) {\n      playbackState.add(\n        PlaybackState(\n          processingState: AudioProcessingState.completed,\n          playing: false,\n        ),\n      );\n    }\n    playbackState.add(\n      PlaybackState(\n        processingState: AudioProcessingState.idle,\n        playing: false,\n      ),\n    );\n  }\n\n  void onPositionChange(Duration position) {\n    if (!enableBackgroundPlay ||\n        _item.isEmpty ||\n        !PlPlayerController.instanceExists()) {\n      return;\n    }\n\n    playbackState.add(\n      playbackState.value.copyWith(\n        updatePosition: position,\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/services/audio_session.dart",
    "content": "import 'package:PiliPlus/plugin/pl_player/controller.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/play_status.dart';\nimport 'package:audio_session/audio_session.dart';\n\nclass AudioSessionHandler {\n  late AudioSession session;\n  bool _playInterrupted = false;\n\n  Future<bool> setActive(bool active) {\n    return session.setActive(active);\n  }\n\n  AudioSessionHandler() {\n    initSession();\n  }\n\n  Future<void> initSession() async {\n    session = await AudioSession.instance;\n    session.configure(const AudioSessionConfiguration.music());\n\n    session.interruptionEventStream.listen((event) {\n      final playerStatus = PlPlayerController.getPlayerStatusIfExists();\n      // final player = PlPlayerController.getInstance();\n      if (event.begin) {\n        if (playerStatus != PlayerStatus.playing) return;\n        // if (!player.playerStatus.playing) return;\n        switch (event.type) {\n          case AudioInterruptionType.duck:\n            PlPlayerController.setVolumeIfExists(\n              (PlPlayerController.getVolumeIfExists() ?? 0) * 0.5,\n            );\n            // player.setVolume(player.volume.value * 0.5);\n            break;\n          case AudioInterruptionType.pause:\n            PlPlayerController.pauseIfExists(isInterrupt: true);\n            // player.pause(isInterrupt: true);\n            _playInterrupted = true;\n            break;\n          case AudioInterruptionType.unknown:\n            PlPlayerController.pauseIfExists(isInterrupt: true);\n            // player.pause(isInterrupt: true);\n            _playInterrupted = true;\n            break;\n        }\n      } else {\n        switch (event.type) {\n          case AudioInterruptionType.duck:\n            PlPlayerController.setVolumeIfExists(\n              (PlPlayerController.getVolumeIfExists() ?? 0) * 2,\n            );\n            // player.setVolume(player.volume.value * 2);\n            break;\n          case AudioInterruptionType.pause:\n            if (_playInterrupted) PlPlayerController.playIfExists();\n            //player.play();\n            break;\n          case AudioInterruptionType.unknown:\n            break;\n        }\n        _playInterrupted = false;\n      }\n    });\n\n    // 耳机拔出暂停\n    session.becomingNoisyEventStream.listen((_) {\n      PlPlayerController.pauseIfExists();\n      // final player = PlPlayerController.getInstance();\n      // if (player.playerStatus.playing) {\n      //   player.pause();\n      // }\n    });\n  }\n}\n"
  },
  {
    "path": "lib/services/download/download_manager.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/models_new/download/bili_download_entry_info.dart';\nimport 'package:PiliPlus/utils/extension/file_ext.dart';\nimport 'package:PiliPlus/utils/extension/string_ext.dart';\nimport 'package:dio/dio.dart';\n\nclass DownloadManager {\n  final String url;\n  final String path;\n  final void Function(int, int)? onReceiveProgress;\n  final void Function([Object? error]) onDone;\n\n  DownloadStatus _status = DownloadStatus.downloading;\n\n  DownloadStatus get status => _status;\n  final _cancelToken = CancelToken();\n  late Future<void> task;\n\n  DownloadManager({\n    required this.url,\n    required this.path,\n    required this.onReceiveProgress,\n    required this.onDone,\n  }) {\n    task = _start();\n  }\n\n  Future<void> _start() async {\n    int received;\n\n    final file = File(path);\n    if (file.existsSync()) {\n      received = await file.length();\n    } else {\n      file.createSync(recursive: true);\n      received = 0;\n    }\n\n    final sink = file.openWrite(\n      mode: received == 0 ? FileMode.writeOnly : FileMode.writeOnlyAppend,\n    );\n\n    Future<void> onError(Object e, {bool delete = false}) async {\n      try {\n        await sink.close();\n      } catch (_) {}\n      if (_status == DownloadStatus.downloading) {\n        _status = DownloadStatus.failDownload;\n        if (delete && file.existsSync()) {\n          await file.tryDel();\n        }\n      }\n      onDone(e);\n    }\n\n    Response<ResponseBody> response;\n    try {\n      response = await Request.http11Dio.get<ResponseBody>(\n        url.http2https,\n        options: Options(\n          headers: {'range': 'bytes=$received-'},\n          responseType: ResponseType.stream,\n          validateStatus: (status) =>\n              status != null &&\n              (status == 416 || (status >= 200 && status < 300)),\n        ),\n        cancelToken: _cancelToken,\n      );\n    } on DioException catch (e) {\n      await onError(e, delete: true);\n      return;\n    }\n    final data = response.data!;\n    final contentLength = data.contentLength + received;\n\n    if (received == 0) {\n      onReceiveProgress?.call(0, contentLength);\n    }\n\n    int? last;\n    try {\n      await for (final chunk in data.stream) {\n        sink.add(chunk);\n        received += chunk.length;\n        final now = DateTime.now().millisecondsSinceEpoch ~/ 1000;\n        if (last != now) {\n          last = now;\n          onReceiveProgress?.call(received, contentLength);\n        }\n      }\n      await sink.close();\n      _status = DownloadStatus.completed;\n      onDone();\n    } catch (e) {\n      await onError(e);\n      return;\n    }\n  }\n\n  Future<void> cancel({required bool isDelete}) {\n    if (!isDelete && _status == DownloadStatus.downloading) {\n      _status = DownloadStatus.pause;\n    }\n    if (!_cancelToken.isCancelled) {\n      _cancelToken.cancel();\n    }\n    return task;\n  }\n}\n"
  },
  {
    "path": "lib/services/download/download_service.dart",
    "content": "import 'dart:async';\nimport 'dart:convert' show jsonDecode, jsonEncode;\nimport 'dart:io' show Directory, File;\n\nimport 'package:PiliPlus/grpc/dm.dart';\nimport 'package:PiliPlus/http/download.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/models/common/video/video_quality.dart';\nimport 'package:PiliPlus/models_new/download/bili_download_entry_info.dart';\nimport 'package:PiliPlus/models_new/download/bili_download_media_file_info.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/episode.dart' as pgc;\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/result.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/data.dart';\nimport 'package:PiliPlus/models_new/video/video_detail/episode.dart' as ugc;\nimport 'package:PiliPlus/models_new/video/video_detail/page.dart';\nimport 'package:PiliPlus/pages/danmaku/controller.dart';\nimport 'package:PiliPlus/services/download/download_manager.dart';\nimport 'package:PiliPlus/utils/extension/file_ext.dart';\nimport 'package:PiliPlus/utils/extension/string_ext.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\nimport 'package:PiliPlus/utils/path_utils.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter_cache_manager/flutter_cache_manager.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:path/path.dart' as path;\nimport 'package:synchronized/synchronized.dart';\n\n// ref https://github.com/10miaomiao/bilimiao2/blob/master/bilimiao-download/src/main/java/cn/a10miaomiao/bilimiao/download/DownloadService.kt\n\nclass DownloadService extends GetxService {\n  static const _entryFile = 'entry.json';\n  static const _indexFile = 'index.json';\n\n  final _lock = Lock();\n\n  final flagNotifier = SetNotifier();\n  final waitDownloadQueue = RxList<BiliDownloadEntryInfo>();\n  final downloadList = <BiliDownloadEntryInfo>[];\n\n  int? _curCid;\n  int? get curCid => _curCid;\n  final curDownload = Rxn<BiliDownloadEntryInfo>();\n  void _updateCurStatus(DownloadStatus status) {\n    if (curDownload.value != null) {\n      curDownload\n        ..value!.status = status\n        ..refresh();\n    }\n  }\n\n  DownloadManager? _downloadManager;\n  DownloadManager? _audioDownloadManager;\n\n  late Future<void> waitForInitialization;\n\n  @override\n  void onInit() {\n    super.onInit();\n    initDownloadList();\n  }\n\n  void initDownloadList() {\n    waitForInitialization = _readDownloadList();\n  }\n\n  Future<void> _readDownloadList() async {\n    downloadList.clear();\n    final downloadDir = Directory(await _getDownloadPath());\n    await for (final dir in downloadDir.list()) {\n      if (dir is Directory) {\n        downloadList.addAll(await _readDownloadDirectory(dir));\n      }\n    }\n    downloadList.sort((a, b) => b.timeUpdateStamp.compareTo(a.timeUpdateStamp));\n  }\n\n  @pragma('vm:notify-debugger-on-exception')\n  Future<List<BiliDownloadEntryInfo>> _readDownloadDirectory(\n    Directory pageDir,\n  ) async {\n    final result = <BiliDownloadEntryInfo>[];\n\n    if (!pageDir.existsSync()) {\n      return result;\n    }\n\n    await for (final entryDir in pageDir.list()) {\n      if (entryDir is Directory) {\n        final entryFile = File(path.join(entryDir.path, _entryFile));\n        if (entryFile.existsSync()) {\n          try {\n            final entryJson = await entryFile.readAsString();\n            final entry = BiliDownloadEntryInfo.fromJson(jsonDecode(entryJson))\n              ..pageDirPath = pageDir.path\n              ..entryDirPath = entryDir.path;\n            if (entry.isCompleted) {\n              result.add(entry);\n            } else {\n              waitDownloadQueue.add(entry..status = DownloadStatus.wait);\n            }\n          } catch (_) {}\n        }\n      }\n    }\n\n    return result;\n  }\n\n  void downloadVideo(\n    Part page,\n    VideoDetailData? videoDetail,\n    ugc.EpisodeItem? videoArc,\n    VideoQuality videoQuality,\n  ) {\n    final cid = page.cid!;\n    if (downloadList.indexWhere((e) => e.cid == cid) != -1) {\n      return;\n    }\n    if (waitDownloadQueue.indexWhere((e) => e.cid == cid) != -1) {\n      return;\n    }\n    final pageData = PageInfo(\n      cid: cid,\n      page: page.page!,\n      from: page.from,\n      part: page.part,\n      vid: page.vid,\n      hasAlias: false,\n      tid: 0,\n      width: 0,\n      height: 0,\n      rotate: 0,\n      downloadTitle: '视频已缓存完成',\n      downloadSubtitle: videoDetail?.title ?? videoArc!.title,\n    );\n    final currentTime = DateTime.now().millisecondsSinceEpoch ~/ 1000;\n    final entry = BiliDownloadEntryInfo(\n      mediaType: 2,\n      hasDashAudio: false,\n      isCompleted: false,\n      totalBytes: 0,\n      downloadedBytes: 0,\n      title: videoDetail?.title ?? videoArc!.title!,\n      typeTag: videoQuality.code.toString(),\n      cover: (videoDetail?.pic ?? videoArc!.cover!).http2https,\n      preferedVideoQuality: videoQuality.code,\n      qualityPithyDescription: videoQuality.desc,\n      guessedTotalBytes: 0,\n      totalTimeMilli: (page.duration ?? 0) * 1000,\n      danmakuCount:\n          videoDetail?.stat?.danmaku ?? videoArc?.arc?.stat?.danmaku ?? 0,\n      timeUpdateStamp: currentTime,\n      timeCreateStamp: currentTime,\n      canPlayInAdvance: true,\n      interruptTransformTempFile: false,\n      avid: videoDetail?.aid ?? videoArc!.aid!,\n      spid: 0,\n      seasonId: null,\n      ep: null,\n      source: null,\n      bvid: videoDetail?.bvid ?? videoArc!.bvid!,\n      ownerId: videoDetail?.owner?.mid ?? videoArc?.arc?.author?.mid,\n      ownerName: videoDetail?.owner?.name ?? videoArc?.arc?.author?.name,\n      pageData: pageData,\n    );\n    _createDownload(entry);\n  }\n\n  void downloadBangumi(\n    int index,\n    PgcInfoModel pgcItem,\n    pgc.EpisodeItem episode,\n    VideoQuality quality,\n  ) {\n    final cid = episode.cid!;\n    if (downloadList.indexWhere((e) => e.cid == cid) != -1) {\n      return;\n    }\n    if (waitDownloadQueue.indexWhere((e) => e.cid == cid) != -1) {\n      return;\n    }\n    final currentTime = DateTime.now().millisecondsSinceEpoch ~/ 1000;\n    final source = SourceInfo(\n      avId: episode.aid!,\n      cid: cid,\n    );\n    final ep = EpInfo(\n      avId: source.avId,\n      page: index,\n      danmaku: source.cid,\n      cover: episode.cover!,\n      episodeId: episode.id!,\n      index: episode.title!,\n      indexTitle: episode.longTitle ?? '',\n      showTitle: episode.showTitle,\n      from: episode.from ?? 'bangumi',\n      seasonType: pgcItem.type ?? (episode.from == 'pugv' ? -1 : 0),\n      width: 0,\n      height: 0,\n      rotate: 0,\n      link: episode.link ?? '',\n      bvid: episode.bvid ?? IdUtils.av2bv(source.avId),\n      sortIndex: index,\n    );\n    final entry = BiliDownloadEntryInfo(\n      mediaType: 2,\n      hasDashAudio: false,\n      isCompleted: false,\n      totalBytes: 0,\n      downloadedBytes: 0,\n      title: pgcItem.seasonTitle ?? pgcItem.title ?? '',\n      typeTag: quality.code.toString(),\n      cover: episode.cover!,\n      preferedVideoQuality: quality.code,\n      qualityPithyDescription: quality.desc,\n      guessedTotalBytes: 0,\n      totalTimeMilli:\n          (episode.duration ?? 0) *\n          (episode.from == 'pugv' ? 1000 : 1), // pgc millisec,, pugv sec\n      danmakuCount: pgcItem.stat?.danmaku ?? 0,\n      timeUpdateStamp: currentTime,\n      timeCreateStamp: currentTime,\n      canPlayInAdvance: true,\n      interruptTransformTempFile: false,\n      spid: 0,\n      seasonId: pgcItem.seasonId!.toString(),\n      bvid: episode.bvid ?? IdUtils.av2bv(source.avId),\n      avid: source.avId,\n      ep: ep,\n      source: source,\n      ownerId: pgcItem.upInfo?.mid,\n      ownerName: pgcItem.upInfo?.uname,\n      pageData: null,\n    );\n    _createDownload(entry);\n  }\n\n  Future<void> _createDownload(BiliDownloadEntryInfo entry) async {\n    final entryDir = await _getDownloadEntryDir(entry);\n    final entryJsonFile = File(path.join(entryDir.path, _entryFile));\n    await entryJsonFile.writeAsString(jsonEncode(entry.toJson()));\n    entry\n      ..pageDirPath = entryDir.parent.path\n      ..entryDirPath = entryDir.path\n      ..status = DownloadStatus.wait;\n    waitDownloadQueue.add(entry);\n    if (curDownload.value?.status.isDownloading != true) {\n      startDownload(entry);\n    }\n  }\n\n  Future<Directory> _getDownloadEntryDir(BiliDownloadEntryInfo entry) async {\n    late final String dirName;\n    late final String pageDirName;\n    if (entry.ep case final ep?) {\n      dirName = 's_${entry.seasonId}';\n      pageDirName = ep.episodeId.toString();\n    } else if (entry.pageData case final page?) {\n      dirName = entry.avid.toString();\n      pageDirName = 'c_${page.cid}';\n    }\n    final pageDir = Directory(\n      path.join(await _getDownloadPath(), dirName, pageDirName),\n    );\n    if (!pageDir.existsSync()) {\n      await pageDir.create(recursive: true);\n    }\n    return pageDir;\n  }\n\n  static Future<String> _getDownloadPath() async {\n    final dir = Directory(downloadPath);\n    if (!dir.existsSync()) {\n      await dir.create(recursive: true);\n    }\n    return dir.path;\n  }\n\n  Future<void> startDownload(BiliDownloadEntryInfo entry) {\n    return _lock.synchronized(() async {\n      await _downloadManager?.cancel(isDelete: false);\n      await _audioDownloadManager?.cancel(isDelete: false);\n      _downloadManager = null;\n      _audioDownloadManager = null;\n      if (curDownload.value case final curEntry?) {\n        if (curEntry.status.isDownloading) {\n          curEntry.status = DownloadStatus.pause;\n        }\n      }\n\n      _curCid = entry.cid;\n      curDownload.value = entry;\n      waitDownloadQueue.refresh();\n      await _startDownload(entry);\n    });\n  }\n\n  Future<bool> downloadDanmaku({\n    required BiliDownloadEntryInfo entry,\n    bool isUpdate = false,\n  }) async {\n    final cid = entry.pageData?.cid ?? entry.source?.cid;\n    if (cid == null) {\n      return false;\n    }\n    final danmakuFile = File(\n      path.join(entry.entryDirPath, PathUtils.danmakuName),\n    );\n    if (isUpdate || !danmakuFile.existsSync()) {\n      try {\n        if (!isUpdate) {\n          _updateCurStatus(DownloadStatus.getDanmaku);\n        }\n        final seg = (entry.totalTimeMilli / PlDanmakuController.segmentLength)\n            .ceil();\n\n        final res = await Future.wait([\n          for (var i = 1; i <= seg; i++)\n            DmGrpc.dmSegMobile(cid: cid, segmentIndex: i),\n        ]);\n\n        final danmaku = res.removeAt(0).data;\n        for (final i in res) {\n          if (i case Success(:final response)) {\n            danmaku.elems.addAll(response.elems);\n          }\n        }\n        res.clear();\n        await danmakuFile.writeAsBytes(danmaku.writeToBuffer());\n\n        return true;\n      } catch (e) {\n        if (!isUpdate) {\n          _updateCurStatus(DownloadStatus.failDanmaku);\n        }\n        if (kDebugMode) SmartDialog.showToast(e.toString());\n        return false;\n      }\n    }\n    return true;\n  }\n\n  Future<bool> _downloadCover({\n    required BiliDownloadEntryInfo entry,\n  }) async {\n    try {\n      final filePath = path.join(entry.entryDirPath, PathUtils.coverName);\n      if (File(filePath).existsSync()) {\n        return true;\n      }\n      final file = (await DefaultCacheManager().getFileFromCache(\n        entry.cover,\n      ))?.file;\n      if (file != null) {\n        await file.copy(filePath);\n      } else {\n        await Request.dio.download(entry.cover, filePath);\n      }\n      return true;\n    } catch (_) {\n      return false;\n    }\n  }\n\n  Future<void> _startDownload(BiliDownloadEntryInfo entry) async {\n    try {\n      if (!await downloadDanmaku(entry: entry)) {\n        return;\n      }\n\n      _updateCurStatus(DownloadStatus.getPlayUrl);\n\n      final mediaFileInfo = await DownloadHttp.getVideoUrl(\n        entry: entry,\n        ep: entry.ep,\n        source: entry.source,\n        pageData: entry.pageData,\n      );\n\n      final videoDir = Directory(path.join(entry.entryDirPath, entry.typeTag));\n      if (!videoDir.existsSync()) {\n        await videoDir.create(recursive: true);\n      }\n\n      final mediaJsonFile = File(path.join(videoDir.path, _indexFile));\n      await Future.wait([\n        mediaJsonFile.writeAsString(jsonEncode(mediaFileInfo.toJson())),\n        _downloadCover(entry: entry),\n      ]);\n\n      if (curDownload.value?.cid != entry.cid) {\n        return;\n      }\n\n      switch (mediaFileInfo) {\n        case Type1 mediaFileInfo:\n          final first = mediaFileInfo.segmentList.first;\n          _downloadManager = DownloadManager(\n            url: first.url,\n            path: path.join(videoDir.path, PathUtils.videoNameType1),\n            onReceiveProgress: _onReceive,\n            onDone: _onDone,\n          );\n          break;\n        case Type2 mediaFileInfo:\n          _downloadManager = DownloadManager(\n            url: mediaFileInfo.video.first.baseUrl,\n            path: path.join(videoDir.path, PathUtils.videoNameType2),\n            onReceiveProgress: _onReceive,\n            onDone: _onDone,\n          );\n          final audio = mediaFileInfo.audio;\n          if (audio != null && audio.isNotEmpty) {\n            _audioDownloadManager = DownloadManager(\n              url: audio.first.baseUrl,\n              path: path.join(videoDir.path, PathUtils.audioNameType2),\n              onReceiveProgress: null,\n              onDone: _onAudioDone,\n            );\n          }\n          late final first = mediaFileInfo.video.first;\n          entry.pageData\n            ?..width = first.width\n            ..height = first.height;\n          entry.ep\n            ?..width = first.width\n            ..height = first.height;\n          _updateBiliDownloadEntryJson(entry);\n          break;\n        default:\n          break;\n      }\n    } catch (e) {\n      _updateCurStatus(DownloadStatus.failPlayUrl);\n      if (kDebugMode) {\n        debugPrint('get download url error: $e');\n      }\n    }\n  }\n\n  Future<void> _updateBiliDownloadEntryJson(BiliDownloadEntryInfo entry) {\n    final entryJsonFile = File(path.join(entry.entryDirPath, _entryFile));\n    return entryJsonFile.writeAsString(jsonEncode(entry.toJson()));\n  }\n\n  void _onReceive(int progress, int total) {\n    if (curDownload.value case final entry?) {\n      if (progress == 0 && total != 0) {\n        _updateBiliDownloadEntryJson(entry..totalBytes = total);\n      }\n      entry\n        ..downloadedBytes = progress\n        ..status = DownloadStatus.downloading;\n      curDownload.refresh();\n    }\n  }\n\n  void _onDone([Object? error]) {\n    if (error != null) {\n      _updateCurStatus(_downloadManager?.status ?? DownloadStatus.pause);\n      return;\n    }\n\n    final status = switch (_audioDownloadManager?.status) {\n      DownloadStatus.downloading => DownloadStatus.audioDownloading,\n      DownloadStatus.failDownload => DownloadStatus.failDownloadAudio,\n      _ => _downloadManager?.status ?? DownloadStatus.pause,\n    };\n    _updateCurStatus(status);\n\n    if (curDownload.value case final curEntryInfo?) {\n      curEntryInfo.downloadedBytes = curEntryInfo.totalBytes;\n      if (status == DownloadStatus.completed) {\n        _completeDownload();\n      } else {\n        _updateBiliDownloadEntryJson(curEntryInfo);\n      }\n    }\n  }\n\n  void _onAudioDone([Object? error]) {\n    if (_downloadManager?.status == DownloadStatus.completed) {\n      if (error == null) {\n        _completeDownload();\n      } else {\n        final status = _audioDownloadManager?.status ?? DownloadStatus.pause;\n        _updateCurStatus(\n          status == DownloadStatus.failDownload\n              ? DownloadStatus.failDownloadAudio\n              : status,\n        );\n      }\n    }\n  }\n\n  Future<void> _completeDownload() async {\n    final entry = curDownload.value;\n    if (entry == null) {\n      return;\n    }\n    entry\n      ..downloadedBytes = entry.totalBytes\n      ..isCompleted = true;\n    await _updateBiliDownloadEntryJson(entry);\n    waitDownloadQueue.remove(entry);\n    downloadList.insert(0, entry);\n    flagNotifier.refresh();\n    _curCid = null;\n    curDownload.value = null;\n    _downloadManager = null;\n    _audioDownloadManager = null;\n    nextDownload();\n  }\n\n  void nextDownload() {\n    if (waitDownloadQueue.isNotEmpty) {\n      startDownload(waitDownloadQueue.first);\n    }\n  }\n\n  Future<void> deleteDownload({\n    required BiliDownloadEntryInfo entry,\n    bool removeList = false,\n    bool removeQueue = false,\n    bool refresh = true,\n    bool downloadNext = true,\n  }) async {\n    if (removeList) {\n      downloadList.remove(entry);\n    }\n    if (removeQueue) {\n      waitDownloadQueue.remove(entry);\n    }\n    if (curDownload.value?.cid == entry.cid) {\n      await cancelDownload(\n        isDelete: true,\n        downloadNext: downloadNext,\n      );\n    }\n    final downloadDir = Directory(entry.pageDirPath);\n    if (downloadDir.existsSync()) {\n      if (!await downloadDir.lengthGte(2)) {\n        await downloadDir.tryDel(recursive: true);\n      } else {\n        final entryDir = Directory(entry.entryDirPath);\n        if (entryDir.existsSync()) {\n          await entryDir.tryDel(recursive: true);\n        }\n      }\n    }\n    if (refresh) {\n      flagNotifier.refresh();\n    }\n  }\n\n  Future<void> deletePage({\n    required String pageDirPath,\n    bool refresh = true,\n  }) async {\n    await Directory(pageDirPath).tryDel(recursive: true);\n    downloadList.removeWhere((e) => e.pageDirPath == pageDirPath);\n    if (refresh) {\n      flagNotifier.refresh();\n    }\n  }\n\n  Future<void> cancelDownload({\n    required bool isDelete,\n    bool downloadNext = true,\n  }) async {\n    await _downloadManager?.cancel(isDelete: isDelete);\n    await _audioDownloadManager?.cancel(isDelete: isDelete);\n    _downloadManager = null;\n    _audioDownloadManager = null;\n    if (!isDelete) {\n      final entry = curDownload.value;\n      if (entry != null) {\n        await _updateBiliDownloadEntryJson(entry);\n      }\n    }\n    if (isDelete) {\n      _curCid = null;\n      curDownload.value = null;\n    } else {\n      _updateCurStatus(DownloadStatus.pause);\n    }\n    if (downloadNext) {\n      nextDownload();\n    }\n  }\n}\n\ntypedef SetNotifier = Set<VoidCallback>;\n\nextension SetNotifierExt on SetNotifier {\n  void refresh() {\n    for (final i in this) {\n      i();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/services/logger.dart",
    "content": "import 'dart:io';\n\nimport 'package:PiliPlus/utils/json_file_handler.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:catcher_2/catcher_2.dart';\nimport 'package:logger/logger.dart';\nimport 'package:path/path.dart' as p;\nimport 'package:path_provider/path_provider.dart';\n\nfinal logger = PiliLogger();\n\nclass PiliLogger extends Logger {\n  PiliLogger() : super();\n\n  @override\n  void log(\n    Level level,\n    dynamic message, {\n    Object? error,\n    StackTrace? stackTrace,\n    DateTime? time,\n  }) {\n    if (level == Level.error || level == Level.fatal) {\n      Catcher2.reportCheckedError(error, stackTrace);\n    }\n    super.log(level, message, error: error, stackTrace: stackTrace, time: time);\n  }\n}\n\nabstract final class LoggerUtils {\n  static File? _logFile;\n\n  static Future<File> getLogsPath() async {\n    if (_logFile != null) return _logFile!;\n\n    String dir = (await getApplicationDocumentsDirectory()).path;\n    final String filename = p.join(dir, '.pili_logs.json');\n    final File file = File(filename);\n    if (!file.existsSync()) {\n      await file.create(recursive: true);\n    }\n    return _logFile = file;\n  }\n\n  static Future<bool> clearLogs() async {\n    try {\n      if (Pref.enableLog) {\n        await JsonFileHandler.add(\n          (raf) => raf.setPosition(0).then((raf) => raf.truncate(0)),\n        );\n      } else {\n        final file = await getLogsPath();\n        await file.writeAsBytes(const [], flush: true);\n      }\n    } catch (e) {\n      // if (kDebugMode) debugPrint('Error clearing file: $e');\n      return false;\n    }\n    return true;\n  }\n}\n"
  },
  {
    "path": "lib/services/service_locator.dart",
    "content": "import 'package:PiliPlus/services/audio_handler.dart';\nimport 'package:PiliPlus/services/audio_session.dart';\n\nVideoPlayerServiceHandler? videoPlayerServiceHandler;\nAudioSessionHandler? audioSessionHandler;\n\nFuture<void> setupServiceLocator() async {\n  final audio = await initAudioService();\n  videoPlayerServiceHandler = audio;\n  audioSessionHandler = AudioSessionHandler();\n}\n"
  },
  {
    "path": "lib/services/shutdown_timer_service.dart",
    "content": "// 定时关闭服务\nimport 'dart:async';\nimport 'dart:io';\n\nimport 'package:PiliPlus/models/common/enum_with_label.dart';\nimport 'package:PiliPlus/pages/video/introduction/ugc/widgets/menu_row.dart';\nimport 'package:PiliPlus/plugin/pl_player/controller.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/play_status.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:collection/collection.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\n\nenum _ShutdownType with EnumWithLabel {\n  pause('暂停视频'),\n  exit('退出APP')\n  ;\n\n  @override\n  final String label;\n  const _ShutdownType(this.label);\n}\n\nfinal shutdownTimerService = ShutdownTimerService._internal();\n\nclass ShutdownTimerService {\n  ShutdownTimerService._internal();\n\n  VoidCallback? onPause;\n  ValueGetter<bool>? isPlaying;\n\n  Timer? _shutdownTimer;\n  bool get isActive => _shutdownTimer?.isActive ?? false;\n  int _durationInMinutes = 0;\n  _ShutdownType _shutdownType = .pause;\n\n  bool _isWaiting = false;\n  bool get isWaiting => _isWaiting;\n  bool _waitUntilCompleted = false;\n\n  void _stopTimer() {\n    if (_shutdownTimer != null) {\n      _shutdownTimer!.cancel();\n      _shutdownTimer = null;\n    }\n  }\n\n  void reset([int durationInMinutes = 0]) {\n    _stopTimer();\n    _isWaiting = false;\n    _durationInMinutes = durationInMinutes;\n  }\n\n  void _startShutdownTimer(int durationInMinutes) {\n    reset(durationInMinutes);\n    if (durationInMinutes == 0) {\n      SmartDialog.showToast('取消定时关闭');\n      return;\n    }\n    SmartDialog.showToast('设置 ${_format(durationInMinutes)} 后定时关闭');\n    _shutdownTimer = Timer(\n      Duration(minutes: durationInMinutes),\n      _handleShutdown,\n    );\n  }\n\n  void _handleShutdown() {\n    switch (_shutdownType) {\n      case _ShutdownType.pause:\n        late final player = PlPlayerController.instance;\n        final isPlaying =\n            this.isPlaying?.call() ?? player?.playerStatus.isPlaying ?? false;\n        if (isPlaying) {\n          if (_waitUntilCompleted) {\n            _isWaiting = true;\n          } else {\n            _durationInMinutes = 0;\n            (onPause ?? player?.pause)?.call();\n            SmartDialog.showToast('定时时间已到，已暂停');\n          }\n        }\n      case _ShutdownType.exit:\n        if (_waitUntilCompleted) {\n          final isPlaying =\n              this.isPlaying?.call() ??\n              PlPlayerController.instance?.playerStatus.isPlaying ??\n              false;\n          if (isPlaying) {\n            _isWaiting = true;\n            return;\n          }\n        }\n        exit(0);\n    }\n  }\n\n  void handleWaiting() {\n    switch (_shutdownType) {\n      case _ShutdownType.pause:\n        _isWaiting = false;\n        _durationInMinutes = 0;\n        SmartDialog.showToast('定时时间已到，已暂停');\n      case _ShutdownType.exit:\n        exit(0);\n    }\n  }\n\n  static (int hour, int minute) _parseMinutes(int minutes) =>\n      (minutes ~/ 60, minutes % 60);\n\n  static String _format(int minutes) {\n    if (minutes == 60) return '60分钟';\n    final (int hour, int minute) = _parseMinutes(minutes);\n    if (hour > 0 && minute > 0) {\n      return '$hour小时$minute分钟';\n    } else if (hour > 0) {\n      return '$hour小时';\n    } else {\n      return '$minute分钟';\n    }\n  }\n\n  void showScheduleExitDialog(\n    BuildContext context, {\n    required bool isFullScreen,\n    bool isLive = false,\n  }) {\n    const Set<int> scheduleTimeMinutes = {0, 15, 30, 45, 60};\n    const TextStyle titleStyle = TextStyle(fontSize: 14);\n    if (isLive) {\n      _waitUntilCompleted = false;\n    }\n    PageUtils.showVideoBottomSheet(\n      context,\n      isFullScreen: () => isFullScreen,\n      child: StatefulBuilder(\n        builder: (_, setState) {\n          final ThemeData theme = Theme.of(context);\n          return Theme(\n            data: theme,\n            child: Padding(\n              padding: const .all(12),\n              child: Material(\n                clipBehavior: .hardEdge,\n                color: theme.colorScheme.surface,\n                borderRadius: const .all(.circular(12)),\n                child: ListView(\n                  padding: const .symmetric(vertical: 14),\n                  children: [\n                    const Center(child: Text('定时关闭', style: titleStyle)),\n                    const SizedBox(height: 10),\n                    ...{...scheduleTimeMinutes, _durationInMinutes}\n                        .sorted((a, b) => a.compareTo(b))\n                        .map(\n                          (minutes) => ListTile(\n                            dense: true,\n                            onTap: () {\n                              Navigator.pop(context);\n                              _startShutdownTimer(minutes);\n                            },\n                            title: Text(\n                              switch (minutes) {\n                                0 => '禁用',\n                                _ => _format(minutes),\n                              },\n                              style: titleStyle,\n                            ),\n                            trailing: _durationInMinutes == minutes\n                                ? Icon(\n                                    size: 20,\n                                    Icons.done,\n                                    color: theme.colorScheme.primary,\n                                  )\n                                : null,\n                          ),\n                        ),\n                    ListTile(\n                      dense: true,\n                      onTap: () {\n                        final (int hour, int minute) = _parseMinutes(\n                          _durationInMinutes,\n                        );\n                        showTimePicker(\n                          context: context,\n                          initialEntryMode: .inputOnly,\n                          initialTime: TimeOfDay(hour: hour, minute: minute),\n                          builder: (context, child) => MediaQuery(\n                            data: MediaQuery.of(\n                              context,\n                            ).copyWith(alwaysUse24HourFormat: true),\n                            child: child!,\n                          ),\n                        ).then((time) {\n                          if (time != null) {\n                            _startShutdownTimer(time.hour * 60 + time.minute);\n                            setState(() {});\n                          }\n                        });\n                      },\n                      title: const Text('自定义', style: titleStyle),\n                    ),\n                    if (!isLive) ...[\n                      Builder(\n                        builder: (context) {\n                          void onChanged([_]) {\n                            _waitUntilCompleted = !_waitUntilCompleted;\n                            (context as Element).markNeedsBuild();\n                          }\n\n                          return ListTile(\n                            dense: true,\n                            onTap: onChanged,\n                            title: const Text('额外等待视频播放完毕', style: titleStyle),\n                            trailing: Transform.scale(\n                              alignment: Alignment.centerRight,\n                              scale: 0.8,\n                              child: Switch(\n                                value: _waitUntilCompleted,\n                                onChanged: onChanged,\n                              ),\n                            ),\n                          );\n                        },\n                      ),\n                    ],\n                    const SizedBox(height: 5),\n                    Padding(\n                      padding: const .only(left: 18),\n                      child: Builder(\n                        builder: (context) {\n                          return Row(\n                            spacing: 12,\n                            children: [\n                              const Text('倒计时结束:', style: titleStyle),\n                              ..._ShutdownType.values.map(\n                                (e) => ActionRowLineItem(\n                                  onTap: () {\n                                    _shutdownType = e;\n                                    (context as Element).markNeedsBuild();\n                                  },\n                                  text: ' ${e.label} ',\n                                  selectStatus: _shutdownType == e,\n                                ),\n                              ),\n                            ],\n                          );\n                        },\n                      ),\n                    ),\n                  ],\n                ),\n              ),\n            ),\n          );\n        },\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/tcp/live.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\nimport 'dart:io';\nimport 'dart:typed_data';\n\nimport 'package:PiliPlus/services/logger.dart';\nimport 'package:brotli/brotli.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:web_socket_channel/web_socket_channel.dart';\n\nclass PackageHeader {\n  final int protocolVer;\n  final int operationCode;\n  final int seq;\n\n  @override\n  String toString() {\n    return 'PackageHeader{protocolVer: $protocolVer, operationCode: $operationCode, seq: $seq}';\n  }\n\n  const PackageHeader({\n    required this.protocolVer,\n    required this.operationCode,\n    required this.seq,\n  });\n\n  Uint8List toBytes(int contentSize) {\n    final bytes = ByteData(0x10)\n      ..setInt32(0, 0x10 + contentSize, Endian.big)\n      ..setInt16(4, 0x10, Endian.big)\n      ..setInt16(6, protocolVer, Endian.big)\n      ..setInt32(8, operationCode, Endian.big)\n      ..setInt32(12, seq, Endian.big);\n    return bytes.buffer.asUint8List();\n  }\n}\n\nclass PackageHeaderRes extends PackageHeader {\n  PackageHeaderRes({\n    required this.totalSize,\n    required this.headerSize,\n    required super.protocolVer,\n    required super.operationCode,\n    required super.seq,\n  });\n  final int totalSize;\n  final int headerSize;\n\n  static PackageHeaderRes? fromBytesData(Uint8List data) {\n    if (data.length < 10) {\n      logger.i('数据不足以解析PackageHeader');\n      return null;\n    }\n    final byteData = ByteData.sublistView(data);\n\n    final totalSize = byteData.getUint32(0, Endian.big);\n    final headerSize = byteData.getUint16(4, Endian.big);\n    final protocolVer = byteData.getUint16(6, Endian.big);\n    final operationCode = byteData.getUint32(8, Endian.big);\n    final seq = byteData.getUint32(12, Endian.big);\n\n    return PackageHeaderRes(\n      totalSize: totalSize,\n      headerSize: headerSize,\n      protocolVer: protocolVer,\n      operationCode: operationCode,\n      seq: seq,\n    );\n  }\n\n  @override\n  String toString() {\n    return 'PackageHeaderRes{totalSize: $totalSize, headerSize: $headerSize, protocolVer: $protocolVer, operationCode: $operationCode, seq: $seq}';\n  }\n}\n\nabstract class Message {\n  String toJsonStr();\n}\n\nclass AuthMessage implements Message {\n  int roomid;\n  int uid;\n  int protover;\n  String platform;\n  int type;\n  String key;\n\n  AuthMessage({\n    required this.roomid,\n    required this.uid,\n    required this.protover,\n    required this.platform,\n    required this.type,\n    required this.key,\n  });\n\n  @override\n  String toJsonStr() {\n    final message = {\n      'roomid': roomid,\n      'uid': uid,\n      'protover': protover,\n      'platform': platform,\n      'type': type,\n      'key': key,\n    };\n    return jsonEncode(message);\n  }\n}\n\nabstract class AbstractPackage<T> {\n  PackageHeader header;\n  T body;\n  Uint8List marshal();\n  AbstractPackage({required this.header, required this.body});\n}\n\n//认证包\nclass AuthPackage extends AbstractPackage<Message> {\n  AuthPackage({required super.header, required super.body});\n\n  @override\n  Uint8List marshal() {\n    final json = utf8.encode(body.toJsonStr());\n    final buffer = BytesBuilder()\n      ..add(header.toBytes(json.length))\n      ..add(json);\n    return buffer.toBytes();\n  }\n}\n\n//心跳包\nclass HeartbeatPackage extends AbstractPackage<dynamic> {\n  HeartbeatPackage({required super.header, super.body});\n\n  @override\n  Uint8List marshal() {\n    return header.toBytes(0);\n  }\n}\n\nclass LiveMessageStream {\n  String streamToken;\n  int roomId, uid;\n  List<String> servers;\n  final List<void Function(dynamic obj)> _eventListeners = [];\n  LiveMessageStream({\n    required this.streamToken,\n    required this.roomId,\n    required this.uid,\n    required this.servers,\n  });\n\n  bool _active = true;\n  WebSocketChannel? _channel;\n  StreamSubscription? _socketSubscription;\n  Timer? _timer;\n  final String logTag = \"LiveStreamService\";\n\n  Future<void> init() async {\n    final authPackage = AuthPackage(\n      header: const PackageHeader(\n        protocolVer: 1,\n        operationCode: 7,\n        seq: 1,\n      ),\n      body: AuthMessage(\n        roomid: roomId,\n        uid: uid,\n        protover: 3,\n        platform: 'web',\n        type: 2,\n        key: streamToken,\n      ),\n    );\n\n    // final marshaledData = authPackage.marshal();\n    // logger.d(marshaledData);\n    try {\n      Future<WebSocketChannel> getSocket() async {\n        for (final server in servers) {\n          try {\n            final channel = WebSocketChannel.connect(Uri.parse(server));\n            await channel.ready;\n            return channel;\n          } catch (_) {}\n        }\n        throw Exception(\"all servers connect failed\");\n      }\n\n      _channel = await getSocket();\n      if (!_active) {\n        if (kDebugMode) logger.i(\"$logTag init inactive $hashCode\");\n        close();\n        return;\n      }\n      // logger\n      //   ..d('$logTag ===> TCP连接建立')\n      //   ..d('$logTag ===> 发送认证包');\n      _socketSubscription = _channel?.stream.listen(\n        onData,\n        onDone: close,\n        onError: (_) => close(),\n      );\n      _channel?.sink.add(authPackage.marshal());\n    } catch (e) {\n      SmartDialog.showToast(\"弹幕地址链接失败: $e\");\n    }\n  }\n\n  @pragma('vm:notify-debugger-on-exception')\n  void _processingData(List<int> value) {\n    try {\n      final Uint8List data = value is Uint8List\n          ? value\n          : Uint8List.fromList(value);\n      final subHeader = PackageHeaderRes.fromBytesData(data);\n      if (subHeader != null) {\n        final msgBody = utf8.decode(\n          data.sublist(subHeader.headerSize, subHeader.totalSize),\n        );\n        for (final f in _eventListeners) {\n          f(jsonDecode(msgBody));\n        }\n        if (subHeader.totalSize < data.length) {\n          _processingData(data.sublist(subHeader.totalSize));\n        }\n      }\n    } catch (_) {}\n  }\n\n  Future<void> _heartBeat() async {\n    if (!_active) {\n      if (kDebugMode) logger.i(\"$logTag init heartBeat inactive $hashCode\");\n      close();\n      return;\n    }\n    if (kDebugMode) logger.i(\"$logTag 直播间信息流认证成功 $hashCode\");\n    int heartBeatCount = 1;\n    _timer ??= Timer.periodic(const Duration(seconds: 30), (timer) {\n      if (!_active) {\n        if (kDebugMode) logger.i(\"$logTag heartBeat inactive $hashCode\");\n        timer.cancel();\n        close();\n        return;\n      }\n      if (kDebugMode) logger.i(\"$logTag heartBeat $hashCode\");\n      final package = HeartbeatPackage(\n        header: PackageHeader(\n          protocolVer: 1,\n          operationCode: 2,\n          seq: heartBeatCount,\n        ),\n      );\n      try {\n        _channel?.sink.add(package.marshal());\n      } catch (_) {\n        timer.cancel();\n      }\n      heartBeatCount++;\n    });\n  }\n\n  void addEventListener(void Function(dynamic) func) {\n    _eventListeners.add(func);\n  }\n\n  @pragma('vm:notify-debugger-on-exception')\n  void onData(dynamic data) {\n    final header = PackageHeaderRes.fromBytesData(data as Uint8List);\n    if (header != null) {\n      List<int> decompressedData = const [];\n      //心跳包回复不用处理\n      if (header.operationCode == 3) return;\n      if (header.operationCode == 8) {\n        _heartBeat();\n      }\n      try {\n        switch (header.protocolVer) {\n          case 0:\n          case 1:\n            _processingData(data);\n            return;\n          case 2:\n            decompressedData = ZLibDecoder().convert(\n              Uint8List.sublistView(data, 0x10),\n            );\n            break;\n          case 3:\n            decompressedData = const BrotliDecoder().convert(\n              Uint8List.sublistView(data, 0x10),\n            );\n          //debugPrint('Body: ${utf8.decode()}');\n        }\n        _processingData(decompressedData);\n      } catch (_) {}\n    }\n  }\n\n  void close() {\n    _active = false;\n    if (kDebugMode) logger.i(\"$logTag close $hashCode\");\n    _timer?.cancel();\n    _timer = null;\n    _eventListeners.clear();\n    _socketSubscription?.cancel();\n    _socketSubscription = null;\n    _channel?.sink.close();\n    _channel = null;\n  }\n}\n"
  },
  {
    "path": "lib/utils/accounts/account.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/models/common/account_type.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/accounts/grpc_headers.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\nimport 'package:cookie_jar/cookie_jar.dart';\nimport 'package:hive_ce/hive.dart';\n\nsealed class Account {\n  Map<String, dynamic>? toJson() => null;\n\n  Future<void>? onChange() => null;\n\n  Set<AccountType> get type => const {};\n\n  bool get activated => false;\n\n  set activated(bool value) => throw UnimplementedError();\n\n  String? get accessKey => throw UnimplementedError();\n\n  DefaultCookieJar get cookieJar => throw UnimplementedError();\n\n  String get csrf => throw UnimplementedError();\n\n  Future<void> delete() => throw UnimplementedError();\n\n  Map<String, String> get headers => throw UnimplementedError();\n\n  Map<String, String> get grpcHeaders => throw UnimplementedError();\n\n  bool get isLogin => throw UnimplementedError();\n\n  int get mid => throw UnimplementedError();\n\n  String? get refresh => throw UnimplementedError();\n\n  const Account();\n}\n\n@HiveType(typeId: 9)\nclass LoginAccount extends Account {\n  @override\n  final bool isLogin = true;\n  @override\n  @HiveField(0)\n  final DefaultCookieJar cookieJar;\n  @override\n  @HiveField(1)\n  final String? accessKey;\n  @override\n  @HiveField(2)\n  final String? refresh;\n  @override\n  @HiveField(3)\n  final Set<AccountType> type;\n\n  @override\n  bool activated = false;\n\n  @override\n  late final int mid = int.parse(_midStr);\n\n  @override\n  late final Map<String, String> headers = {\n    ...Constants.baseHeaders,\n    'x-bili-mid': _midStr,\n    'x-bili-aurora-eid': IdUtils.genAuroraEid(mid),\n  };\n\n  @override\n  late final Map<String, String> grpcHeaders = GrpcHeaders.newHeaders(\n    accessKey,\n  );\n\n  @override\n  late final String csrf =\n      cookieJar.domainCookies['bilibili.com']!['/']!['bili_jct']!.cookie.value;\n\n  bool _hasDelete = false;\n\n  @override\n  Future<void> delete() {\n    assert(_hasDelete = true);\n    return Future.wait([cookieJar.deleteAll(), _box.delete(_midStr)]);\n  }\n\n  @override\n  Future<void> onChange() {\n    assert(!_hasDelete);\n    return _box.put(_midStr, this);\n  }\n\n  @override\n  Map<String, dynamic>? toJson() => {\n    'cookies': cookieJar.toJson(),\n    'accessKey': accessKey,\n    'refresh': refresh,\n    'type': type.map((i) => i.index).toList(),\n  };\n\n  late final String _midStr = cookieJar\n      .domainCookies['bilibili.com']!['/']!['DedeUserID']!\n      .cookie\n      .value;\n\n  late final Box<LoginAccount> _box = Accounts.account;\n\n  LoginAccount(\n    this.cookieJar,\n    this.accessKey,\n    this.refresh, [\n    Set<AccountType>? type,\n  ]) : type = type ?? {} {\n    cookieJar.setBuvid3();\n  }\n\n  factory LoginAccount.fromJson(Map json) => LoginAccount(\n    BiliCookieJar.fromJson(json['cookies']),\n    json['accessKey'],\n    json['refresh'],\n    (json['type'] as Iterable?)?.map((i) => AccountType.values[i]).toSet(),\n  );\n\n  @override\n  int get hashCode => mid.hashCode;\n\n  @override\n  bool operator ==(Object other) =>\n      identical(this, other) || (other is LoginAccount && mid == other.mid);\n}\n\nclass AnonymousAccount extends Account {\n  @override\n  final bool isLogin = false;\n  @override\n  final DefaultCookieJar cookieJar = DefaultCookieJar()..setBuvid3();\n  @override\n  final String? accessKey = null;\n  @override\n  final String? refresh = null;\n  @override\n  final Set<AccountType> type = {};\n  @override\n  final int mid = 0;\n  @override\n  final String csrf = '';\n  @override\n  final Map<String, String> headers = Constants.baseHeaders;\n\n  @override\n  final Map<String, String> grpcHeaders = GrpcHeaders.newHeaders();\n\n  @override\n  bool activated = false;\n\n  @override\n  Future<void> delete() {\n    grpcHeaders['x-bili-fawkes-req-bin'] = GrpcHeaders.fawkes;\n    return cookieJar.deleteAll().whenComplete(cookieJar.setBuvid3);\n  }\n\n  static final _instance = AnonymousAccount._();\n\n  AnonymousAccount._();\n\n  factory AnonymousAccount() => _instance;\n\n  @override\n  int get hashCode => cookieJar.hashCode;\n\n  @override\n  bool operator ==(Object other) =>\n      identical(this, other) ||\n      (other is AnonymousAccount && cookieJar == other.cookieJar);\n}\n\nextension BiliCookie on Cookie {\n  void setBiliDomain([String domain = '.bilibili.com']) {\n    this.domain = domain;\n    httpOnly = false;\n    path = '/';\n  }\n}\n\nextension BiliCookieJar on DefaultCookieJar {\n  Map<String, String> toJson() {\n    final cookies = domainCookies['bilibili.com']?['/'] ?? const {};\n    return {for (final i in cookies.values) i.cookie.name: i.cookie.value};\n  }\n\n  List<Cookie> toList() =>\n      domainCookies['bilibili.com']?['/']?.entries\n          .map((i) => i.value.cookie)\n          .toList() ??\n      [];\n\n  void setBuvid3() {\n    (domainCookies['bilibili.com'] ??= {\n      '/': {},\n    })['/']!['buvid3'] ??= SerializableCookie(\n      Cookie('buvid3', IdUtils.genBuvid3())..setBiliDomain(),\n    );\n  }\n\n  static DefaultCookieJar fromJson(Map json) =>\n      DefaultCookieJar(ignoreExpires: true)\n        ..domainCookies['bilibili.com'] = {\n          '/': {\n            for (final i in json.entries)\n              i.key: SerializableCookie(\n                Cookie(i.key, i.value)..setBiliDomain(),\n              ),\n          },\n        };\n\n  static DefaultCookieJar fromList(List cookies) =>\n      DefaultCookieJar(ignoreExpires: true)\n        ..domainCookies['bilibili.com'] = {\n          '/': {\n            for (final i in cookies)\n              i['name']!: SerializableCookie(\n                Cookie(i['name']!, i['value']!)..setBiliDomain(),\n              ),\n          },\n        };\n}\n\nfinal class NoAccount extends Account {\n  const NoAccount();\n}\n"
  },
  {
    "path": "lib/utils/accounts/account_adapter.dart",
    "content": "import 'package:PiliPlus/models/common/account_type.dart';\nimport 'package:PiliPlus/utils/accounts/account.dart';\nimport 'package:cookie_jar/cookie_jar.dart';\nimport 'package:hive_ce/hive.dart';\n\nclass LoginAccountAdapter extends TypeAdapter<LoginAccount> {\n  @override\n  final int typeId = 9;\n\n  @override\n  LoginAccount read(BinaryReader reader) {\n    final numOfFields = reader.readByte();\n    final fields = <int, dynamic>{\n      for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),\n    };\n    return LoginAccount(\n      fields[0] as DefaultCookieJar,\n      fields[1] as String?,\n      fields[2] as String?,\n      (fields[3] as List?)?.cast<AccountType>().toSet(),\n    );\n  }\n\n  @override\n  void write(BinaryWriter writer, LoginAccount obj) {\n    writer\n      ..writeByte(4)\n      ..writeByte(0)\n      ..write(obj.cookieJar)\n      ..writeByte(1)\n      ..write(obj.accessKey)\n      ..writeByte(2)\n      ..write(obj.refresh)\n      ..writeByte(3)\n      ..write(obj.type.toList());\n  }\n\n  @override\n  int get hashCode => typeId.hashCode;\n\n  @override\n  bool operator ==(Object other) =>\n      identical(this, other) ||\n      other is LoginAccountAdapter &&\n          runtimeType == other.runtimeType &&\n          typeId == other.typeId;\n}\n"
  },
  {
    "path": "lib/utils/accounts/account_manager/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2018 Wen Du (wendux)\nCopyright (c) 2022 The CFUG Team\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "lib/utils/accounts/account_manager/README.md",
    "content": "# dio_cookie_manager\n\n[![Pub](https://img.shields.io/pub/v/dio_cookie_manager.svg)](https://pub.dev/packages/dio_cookie_manager)\n\nA cookie manager combines cookie_jar and dio, based on the interceptor algorithm.\n\n## Getting Started\n\n### Install\n\nAdd the `dio_cookie_manager` package to your\n[pubspec dependencies](https://pub.dev/packages/dio_cookie_manager/install).\n\n### Usage\n\n```dart\nimport 'package:cookie_jar/cookie_jar.dart';\nimport 'package:dio/dio.dart';\nimport 'package:dio_cookie_manager/dio_cookie_manager.dart';\n\nvoid main() async {\n  final dio = Dio();\n  final cookieJar = CookieJar();\n  dio.interceptors.add(CookieManager(cookieJar));\n  // First request, and save cookies (CookieManager do it).\n  await dio.get(\"https://dart.dev\");\n  // Print cookies\n  print(await cookieJar.loadForRequest(Uri.parse(\"https://dart.dev\")));\n  // Second request with the cookies\n  await dio.get('https://dart.dev');\n}\n```\n\n## Cookie Manager\n\n`CookieManager` Interceptor can help us manage the request/response cookies automatically.\n`CookieManager` depends on the `cookie_jar` package:\n\n> The dio_cookie_manager manage API is based on the withdrawn\n> [cookie_jar](https://github.com/flutterchina/cookie_jar).\n\nYou can create a `CookieJar` or `PersistCookieJar` to manage cookies automatically,\nand dio use the `CookieJar` by default, which saves the cookies **in RAM**.\nIf you want to persists cookies, you can use the `PersistCookieJar` class, for example:\n\n```dart\ndio.interceptors.add(CookieManager(PersistCookieJar()))\n```\n\n`PersistCookieJar` persists the cookies in files,\nso if the application exit, the cookies always exist unless call `delete` explicitly.\n\n> Note: In flutter, the path passed to `PersistCookieJar` must be valid (exists in phones and with write access).\n> Use [path_provider](https://pub.dev/packages/path_provider) package to get the right path.\n\nIn flutter:\n\n```dart\nFuture<void> prepareJar() async {\n  final Directory appDocDir = await getApplicationDocumentsDirectory();\n  final String appDocPath = appDocDir.path;\n  final jar = PersistCookieJar(\n    ignoreExpires: true,\n    storage: FileStorage(appDocPath + \"/.cookies/\"),\n  );\n  dio.interceptors.add(CookieManager(jar));\n}\n```\n\n## Handling Cookies with redirect requests\n\nRedirect requests require extra configuration to parse cookies correctly.\nIn shortly:\n- Set `followRedirects` to `false`.\n- Allow `statusCode` from `300` to `399` responses predicated as succeed.\n- Make further requests using the `HttpHeaders.locationHeader`.\n\nFor example:\n```dart\nfinal cookieJar = CookieJar();\nfinal dio = Dio()\n  ..interceptors.add(CookieManager(cookieJar))\n  ..options.followRedirects = false\n  ..options.validateStatus =\n      (status) => status != null && status >= 200 && status < 400;\nfinal redirected = await dio.get('/redirection');\nfinal response = await dio.get(\n  redirected.headers.value(HttpHeaders.locationHeader)!,\n);\n```\n"
  },
  {
    "path": "lib/utils/accounts/account_manager/account_mgr.dart",
    "content": "// edit from package:dio_cookie_manager\nimport 'dart:async';\nimport 'dart:io';\n\nimport 'package:PiliPlus/http/api.dart';\nimport 'package:PiliPlus/http/constants.dart';\nimport 'package:PiliPlus/models/common/account_type.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/accounts/account.dart';\nimport 'package:PiliPlus/utils/accounts/api_type.dart';\nimport 'package:PiliPlus/utils/app_sign.dart';\nimport 'package:PiliPlus/utils/extension/string_ext.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:connectivity_plus/connectivity_plus.dart';\nimport 'package:dio/dio.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\n\nfinal _setCookieReg = RegExp('(?<=)(,)(?=[^;]+?=)');\n\nclass AccountManager extends Interceptor {\n  AccountManager();\n\n  String blockServer = Pref.blockServer;\n\n  static String getCookies(List<Cookie> cookies) {\n    // Sort cookies by path (longer path first).\n    cookies.sort((a, b) {\n      if (a.path == null && b.path == null) {\n        return 0;\n      } else if (a.path == null) {\n        return -1;\n      } else if (b.path == null) {\n        return 1;\n      } else {\n        return b.path!.length.compareTo(a.path!.length);\n      }\n    });\n    return cookies.map((cookie) => '${cookie.name}=${cookie.value}').join('; ');\n  }\n\n  @override\n  void onRequest(RequestOptions options, RequestInterceptorHandler handler) {\n    final path = options.path;\n\n    late final Account account = options.extra['account'] ?? _findAccount(path);\n\n    if (account is NoAccount || _skipCookie(path)) return handler.next(options);\n\n    if (!account.isLogin && path == Api.heartBeat) {\n      return handler.reject(\n        DioException.requestCancelled(requestOptions: options, reason: null),\n        false,\n      );\n    }\n\n    final isApp = path.startsWith(HttpString.appBaseUrl);\n\n    if (isApp && options.responseType == ResponseType.bytes) {\n      options.headers.addAll(account.grpcHeaders);\n      return handler.next(options);\n    }\n\n    options.headers\n      ..addAll(account.headers)\n      ..['referer'] ??= HttpString.baseUrl;\n\n    // app端不需要管理cookie\n    if (isApp) {\n      // if (kDebugMode) debugPrint('is app: ${options.path}');\n      final dataPtr = (options.method == 'POST' && options.data is Map\n          ? (options.data as Map).cast<String, dynamic>()\n          : options.queryParameters);\n      if (dataPtr.isNotEmpty) {\n        if (!account.accessKey.isNullOrEmpty) {\n          dataPtr['access_key'] = account.accessKey!;\n        }\n        AppSign.appSign(dataPtr);\n        // if (kDebugMode) debugPrint(dataPtr.toString());\n      }\n      return handler.next(options);\n    } else {\n      account.cookieJar\n          .loadForRequest(options.uri)\n          .then((cookies) {\n            final previousCookies =\n                options.headers[HttpHeaders.cookieHeader] as String?;\n            final newCookies = getCookies([\n              ...?previousCookies\n                  ?.split(';')\n                  .where((e) => e.isNotEmpty)\n                  .map(Cookie.fromSetCookieValue),\n              ...cookies,\n            ]);\n            options.headers[HttpHeaders.cookieHeader] = newCookies.isNotEmpty\n                ? newCookies\n                : '';\n            handler.next(options);\n          })\n          .catchError((dynamic e, StackTrace s) {\n            final err = DioException(\n              requestOptions: options,\n              error: e,\n              stackTrace: s,\n            );\n            handler.reject(err, true);\n          });\n    }\n  }\n\n  @override\n  void onResponse(Response response, ResponseInterceptorHandler handler) {\n    final options = response.requestOptions;\n    final path = options.path;\n    if (options.extra['account'] is NoAccount ||\n        path.startsWith(HttpString.appBaseUrl) ||\n        _skipCookie(path)) {\n      return handler.next(response);\n    } else {\n      final future = _saveCookies(\n        response,\n      ).whenComplete(() => handler.next(response));\n      assert(() {\n        future.catchError(\n          (Object e, StackTrace s) {\n            throw DioException(\n              requestOptions: response.requestOptions,\n              error: e,\n              stackTrace: s,\n            );\n          },\n        );\n        return true;\n      }());\n    }\n  }\n\n  @override\n  void onError(DioException err, ErrorInterceptorHandler handler) {\n    if (err.requestOptions.responseType == ResponseType.stream) {\n      return handler.next(err);\n    }\n    if (err.requestOptions.method != 'POST') {\n      toast(err);\n    }\n    if (err.response != null &&\n        !err.response!.requestOptions.path.startsWith(HttpString.appBaseUrl)) {\n      _saveCookies(\n        err.response!,\n      ).whenComplete(() => handler.next(err)).catchError(\n        (dynamic e, StackTrace s) {\n          final error = DioException(\n            requestOptions: err.response!.requestOptions,\n            error: e,\n            stackTrace: s,\n          );\n          handler.next(error);\n        },\n      );\n    } else {\n      handler.next(err);\n    }\n  }\n\n  static void toast(DioException err) {\n    const List<String> skipShow = [\n      'heartbeat',\n      'history/report',\n      'roomEntryAction',\n      'seg.so',\n      'online/total',\n      'github',\n      'hdslb.com',\n      'biliimg.com',\n      'site/getCoin',\n    ];\n    String url = err.requestOptions.uri.toString();\n    if (kDebugMode) debugPrint('🌹🌹ApiInterceptor: $url');\n    if (skipShow.any((i) => url.contains(i)) ||\n        (url.contains('skipSegments') && err.requestOptions.method == 'GET')) {\n      // skip\n    } else {\n      dioError(err).then((res) => SmartDialog.showToast(res + url));\n    }\n  }\n\n  Future<void> _saveCookies(Response response) async {\n    final Account account =\n        response.requestOptions.extra['account'] ??\n        _findAccount(response.requestOptions.path);\n    final setCookies = response.headers[HttpHeaders.setCookieHeader];\n    if (setCookies == null || setCookies.isEmpty) {\n      return;\n    }\n    final List<Cookie> cookies = setCookies\n        .map((str) => str.split(_setCookieReg))\n        .expand((cookie) => cookie)\n        .where((cookie) => cookie.isNotEmpty)\n        .map(Cookie.fromSetCookieValue)\n        .toList();\n    final statusCode = response.statusCode ?? 0;\n    final locations = response.headers[HttpHeaders.locationHeader] ?? const [];\n    final isRedirectRequest = statusCode >= 300 && statusCode < 400;\n    final originalUri = response.requestOptions.uri;\n    final realUri = originalUri.resolveUri(response.realUri);\n    await account.cookieJar.saveFromResponse(realUri, cookies);\n    if (isRedirectRequest && locations.isNotEmpty) {\n      final originalUri = response.realUri;\n      await Future.wait(\n        locations.map(\n          (location) => account.cookieJar.saveFromResponse(\n            // Resolves the location based on the current Uri.\n            originalUri.resolve(location),\n            cookies,\n          ),\n        ),\n      );\n    }\n    await account.onChange();\n  }\n\n  bool _skipCookie(String path) {\n    return path.startsWith(blockServer) ||\n        path.contains('hdslb.com') ||\n        path.contains('biliimg.com');\n  }\n\n  Account _findAccount(String path) => ApiType.loginApi.contains(path)\n      ? AnonymousAccount()\n      : Accounts.get(\n          AccountType.values.firstWhere(\n            (i) => ApiType.apiTypeSet[i]?.contains(path) == true,\n            orElse: () => AccountType.main,\n          ),\n        );\n\n  static Future<String> dioError(DioException error) async {\n    switch (error.type) {\n      case DioExceptionType.badCertificate:\n        return '证书有误！';\n      case DioExceptionType.badResponse:\n        return '服务器异常，请稍后重试！';\n      case DioExceptionType.cancel:\n        return '请求已被取消，请重新请求';\n      case DioExceptionType.connectionError:\n        return '连接错误，请检查网络设置';\n      case DioExceptionType.connectionTimeout:\n        return '网络连接超时，请检查网络设置';\n      case DioExceptionType.receiveTimeout:\n        return '响应超时，请稍后重试！';\n      case DioExceptionType.sendTimeout:\n        return '发送请求超时，请检查网络设置';\n      case DioExceptionType.unknown:\n        String desc;\n        try {\n          desc = PlatformUtils.isMobile\n              ? (await Connectivity().checkConnectivity()).first.desc\n              : '';\n        } catch (_) {\n          desc = '';\n        }\n        return '$desc网络异常 ${error.error}';\n    }\n  }\n}\n\nextension _ConnectivityResultExt on ConnectivityResult {\n  String get desc => const ['蓝牙', 'Wi-Fi', '局域', '流量', '无', '代理', '其他'][index];\n}\n"
  },
  {
    "path": "lib/utils/accounts/account_type_adapter.dart",
    "content": "import 'package:PiliPlus/models/common/account_type.dart';\nimport 'package:hive_ce/hive.dart';\n\nclass AccountTypeAdapter extends TypeAdapter<AccountType> {\n  @override\n  final int typeId = 10;\n\n  @override\n  AccountType read(BinaryReader reader) =>\n      AccountType.values.elementAtOrNull(reader.readByte()) ?? AccountType.main;\n\n  @override\n  void write(BinaryWriter writer, AccountType obj) {\n    writer.writeByte(obj.index);\n  }\n\n  @override\n  int get hashCode => typeId.hashCode;\n\n  @override\n  bool operator ==(Object other) =>\n      identical(this, other) ||\n      other is AccountTypeAdapter &&\n          runtimeType == other.runtimeType &&\n          typeId == other.typeId;\n}\n"
  },
  {
    "path": "lib/utils/accounts/api_type.dart",
    "content": "import 'package:PiliPlus/http/api.dart';\nimport 'package:PiliPlus/models/common/account_type.dart';\n\nabstract final class ApiType {\n  // TODO: grpc api type\n  static const Map<AccountType, Set<String>> apiTypeSet = {\n    AccountType.heartbeat: {\n      Api.videoIntro,\n      Api.replyList,\n      Api.replyReplyList,\n\n      // history\n      Api.heartBeat,\n      Api.historyReport,\n      Api.roomEntryAction,\n      Api.liveLikeReport,\n      Api.mediaListHistory,\n      // Api.historyList,\n      // Api.pauseHistory,\n      // Api.clearHistory,\n      // Api.delHistory,\n      // Api.searchHistory,\n      // Api.historyStatus,\n      // progress\n      Api.pgcInfo,\n      Api.pugvInfo,\n\n      Api.ab2c,\n      Api.liveRoomInfo,\n      Api.liveRoomInfoH5,\n      Api.onlineTotal,\n      Api.dynamicDetail,\n      Api.aiConclusion,\n      Api.getSeasonDetailApi,\n      Api.liveRoomDmToken,\n      Api.liveRoomDmPrefetch,\n      Api.superChatMsg,\n      Api.searchByType,\n      Api.dynSearch,\n      Api.searchArchive,\n\n      // Api.memberInfo,\n      // Api.bgmDetail,\n      // Api.space,\n      // Api.spaceAudio,\n      // Api.spaceComic,\n      // Api.spaceArchive,\n      // Api.spaceChargingArchive,\n      // Api.spaceSeason,\n      // Api.spaceSeries,\n      // Api.spaceBangumi,\n      // Api.spaceOpus,\n      // Api.spaceFav,\n      // Api.seasonSeries,\n      // Api.matchInfo,\n      // Api.articleList,\n      // Api.opusDetail,\n      // Api.articleView,\n      // Api.articleInfo,\n    },\n    AccountType.recommend: {\n      Api.recommendListWeb,\n      Api.recommendListApp,\n      Api.feedDislike,\n      Api.feedDislikeCancel,\n      Api.hotList,\n      Api.relatedList,\n      Api.hotSearchList, // 不同账号搜索结果可能不一样\n      Api.searchDefault,\n      Api.searchSuggest,\n      Api.liveList,\n      Api.searchTrending,\n      Api.searchRecommend,\n      Api.getRankApi,\n      Api.pgcRank,\n      Api.pgcSeasonRank,\n      Api.pgcIndexResult,\n      Api.popularSeriesOne,\n      Api.popularSeriesList,\n      Api.popularPrecious,\n      Api.liveAreaList,\n      Api.liveFeedIndex,\n      Api.liveSecondList,\n      Api.liveRoomAreaList,\n      Api.liveSearch,\n      Api.bgmRecommend,\n      Api.dynTopicRcmd,\n      Api.topicFeed,\n      Api.topicTop,\n    },\n    // progress\n    AccountType.video: {\n      Api.ugcUrl,\n      Api.pgcUrl,\n      Api.pugvUrl,\n      Api.tvPlayUrl,\n      Api.videoshot,\n    },\n  };\n\n  static const loginApi = {\n    Api.getTVCode,\n    Api.qrcodePoll,\n    Api.getCaptcha,\n    Api.getWebKey,\n    Api.appSmsCode,\n    Api.loginByPwdApi,\n    Api.logInByAppSms,\n    Api.safeCenterGetInfo,\n    Api.preCapture,\n    Api.safeCenterSmsCode,\n    Api.safeCenterSmsVerify,\n    Api.oauth2AccessToken,\n  };\n}\n"
  },
  {
    "path": "lib/utils/accounts/cookie_jar_adapter.dart",
    "content": "import 'package:PiliPlus/utils/accounts/account.dart';\nimport 'package:cookie_jar/cookie_jar.dart';\nimport 'package:hive_ce/hive.dart';\n\nclass BiliCookieJarAdapter extends TypeAdapter<DefaultCookieJar> {\n  @override\n  final int typeId = 8;\n\n  @override\n  DefaultCookieJar read(BinaryReader reader) =>\n      BiliCookieJar.fromJson(reader.readMap());\n\n  @override\n  void write(BinaryWriter writer, DefaultCookieJar obj) {\n    writer.writeMap(obj.toJson());\n  }\n\n  @override\n  int get hashCode => typeId.hashCode;\n\n  @override\n  bool operator ==(Object other) =>\n      identical(this, other) ||\n      other is BiliCookieJarAdapter &&\n          runtimeType == other.runtimeType &&\n          typeId == other.typeId;\n}\n"
  },
  {
    "path": "lib/utils/accounts/grpc_headers.dart",
    "content": "import 'dart:convert';\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/grpc/bilibili/metadata.pb.dart';\nimport 'package:PiliPlus/grpc/bilibili/metadata/device.pb.dart';\nimport 'package:PiliPlus/grpc/bilibili/metadata/fawkes.pb.dart';\nimport 'package:PiliPlus/grpc/bilibili/metadata/locale.pb.dart';\nimport 'package:PiliPlus/grpc/bilibili/metadata/network.pb.dart' as network;\nimport 'package:PiliPlus/utils/login_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\n\nabstract final class GrpcHeaders {\n  static const _build = 2001100;\n  static const _versionName = '2.0.1';\n  static const _biliChannel = 'master';\n  static const _mobiApp = 'android_hd';\n  static const _device = 'android';\n\n  static String get _buvid => LoginUtils.buvid;\n  static String get _traceId => Constants.traceId;\n  static String get _sessionId => Utils.generateRandomString(8);\n\n  static final Map<String, String> _base = {\n    'grpc-encoding': 'gzip',\n    'gzip-accept-encoding': 'gzip,identity',\n    'user-agent': Constants.userAgent,\n    'x-bili-gaia-vtoken': '',\n    'x-bili-aurora-zone': '',\n    'x-bili-trace-id': _traceId,\n    'buvid': _buvid,\n    'bili-http-engine': 'cronet',\n    // 'te': 'trailers', // dio not supported\n    'x-bili-device-bin': base64Encode(\n      Device(\n        appId: 5,\n        build: _build,\n        buvid: _buvid,\n        mobiApp: _mobiApp,\n        platform: _device,\n        channel: _biliChannel,\n        brand: _device,\n        model: _device,\n        osver: '15',\n        versionName: _versionName,\n      ).writeToBuffer(),\n    ),\n    'x-bili-network-bin': base64Encode(\n      network.Network(type: network.NetworkType.WIFI).writeToBuffer(),\n    ),\n    'x-bili-locale-bin': base64Encode(\n      Locale(\n        cLocale: LocaleIds(language: 'zh', region: 'CN', script: 'Hans'),\n        sLocale: LocaleIds(language: 'zh', region: 'CN', script: 'Hans'),\n        timezone: 'Asia/Shanghai',\n      ).writeToBuffer(),\n    ),\n    'x-bili-exps-bin': '',\n  };\n\n  static String get fawkes => base64Encode(\n    FawkesReq(\n      appkey: _mobiApp,\n      env: 'prod',\n      sessionId: _sessionId,\n    ).writeToBuffer(),\n  );\n\n  static Map<String, String> newHeaders([String? accessKey]) {\n    return {\n      ..._base,\n      if (accessKey != null) 'authorization': 'identify_v1 $accessKey',\n      'x-bili-fawkes-req-bin': fawkes,\n      'x-bili-metadata-bin': base64Encode(\n        Metadata(\n          accessKey: accessKey,\n          mobiApp: _mobiApp,\n          device: _device,\n          build: _build,\n          channel: _biliChannel,\n          buvid: _buvid,\n          platform: _device,\n        ).writeToBuffer(),\n      ),\n    };\n  }\n}\n"
  },
  {
    "path": "lib/utils/accounts.dart",
    "content": "import 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/models/common/account_type.dart';\nimport 'package:PiliPlus/pages/mine/controller.dart';\nimport 'package:PiliPlus/utils/accounts/account.dart';\nimport 'package:PiliPlus/utils/login_utils.dart';\nimport 'package:hive_ce/hive.dart';\n\nabstract final class Accounts {\n  static late final Box<LoginAccount> account;\n  static final List<Account> accountMode = List.filled(\n    AccountType.values.length,\n    AnonymousAccount(),\n  );\n  static Account get main => accountMode[AccountType.main.index];\n  static Account get heartbeat => accountMode[AccountType.heartbeat.index];\n  static Account get history {\n    final heartbeat = Accounts.heartbeat;\n    if (heartbeat is AnonymousAccount) {\n      return Accounts.main;\n    }\n    return heartbeat;\n  }\n  // static set main(Account account) => set(AccountType.main, account);\n\n  static Future<void> init() async {\n    account = await Hive.openBox(\n      'account',\n      compactionStrategy: (int entries, int deletedEntries) {\n        return deletedEntries > 2;\n      },\n    );\n    // await _migrate();\n  }\n\n  // static Future<void> _migrate() async {\n  //   final Directory tempDir = await getApplicationSupportDirectory();\n  //   final String tempPath = \"${tempDir.path}/.plpl/\";\n  //   final Directory dir = Directory(tempPath);\n  //   if (dir.existsSync()) {\n  //     if (kDebugMode) debugPrint('migrating...');\n  //     final cookieJar = PersistCookieJar(\n  //       ignoreExpires: true,\n  //       storage: FileStorage(tempPath),\n  //     );\n  //     await cookieJar.forceInit();\n  //     final cookies = DefaultCookieJar(ignoreExpires: true)\n  //       ..domainCookies.addAll(cookieJar.domainCookies);\n  //     final localAccessKey = GStorage.localCache.get(\n  //       'accessKey',\n  //       defaultValue: {},\n  //     );\n\n  //     final isLogin =\n  //         cookies.domainCookies['bilibili.com']?['/']?['SESSDATA'] != null;\n\n  //     await Future.wait([\n  //       GStorage.localCache.delete('accessKey'),\n  //       GStorage.localCache.delete('danmakuFilterRule'),\n  //       GStorage.localCache.delete('blackMidsList'),\n  //       dir.delete(recursive: true),\n  //       if (isLogin)\n  //         LoginAccount(\n  //           cookies,\n  //           localAccessKey['value'],\n  //           localAccessKey['refresh'],\n  //           AccountType.values.toSet(),\n  //         ).onChange(),\n  //     ]);\n  //     if (kDebugMode) debugPrint('migrated successfully');\n  //   }\n  // }\n\n  static Future<void> refresh() {\n    for (final a in account.values) {\n      for (final t in a.type) {\n        accountMode[t.index] = a;\n      }\n    }\n    return Future.wait(\n      (accountMode.toSet()..removeWhere((i) => i.activated)).map(\n        Request.buvidActive,\n      ),\n    );\n  }\n\n  static Future<void> clear() async {\n    await account.clear();\n    for (int i = 0; i < AccountType.values.length; i++) {\n      accountMode[i] = AnonymousAccount();\n    }\n    await AnonymousAccount().delete();\n    Request.buvidActive(AnonymousAccount());\n  }\n\n  static Future<void> deleteAll(Set<Account> accounts) async {\n    final isLoginMain = Accounts.main.isLogin;\n    for (int i = 0; i < AccountType.values.length; i++) {\n      if (accounts.contains(accountMode[i])) {\n        accountMode[i] = AnonymousAccount();\n      }\n    }\n    await Future.wait(accounts.map((i) => i.delete()));\n    if (isLoginMain && !Accounts.main.isLogin) {\n      await LoginUtils.onLogoutMain();\n    }\n  }\n\n  static Future<void> set(AccountType key, Account account) async {\n    final oldAccount = accountMode[key.index]..type.remove(key);\n    accountMode[key.index] = account..type.add(key);\n    await Future.wait([?account.onChange(), ?oldAccount.onChange()]);\n    if (!account.activated) await Request.buvidActive(account);\n    switch (key) {\n      case AccountType.main:\n        await (account.isLogin\n            ? LoginUtils.onLoginMain()\n            : LoginUtils.onLogoutMain());\n        break;\n      case AccountType.heartbeat:\n        MineController.anonymity.value = !account.isLogin;\n        break;\n      default:\n        break;\n    }\n  }\n\n  @pragma(\"vm:prefer-inline\")\n  static Account get(AccountType key) {\n    return accountMode[key.index];\n  }\n}\n"
  },
  {
    "path": "lib/utils/app_scheme.dart",
    "content": "import 'dart:async';\n\nimport 'package:PiliPlus/common/widgets/view_safe_area.dart';\nimport 'package:PiliPlus/grpc/bilibili/app/listener/v1.pbenum.dart'\n    show PlaylistSource;\nimport 'package:PiliPlus/http/search.dart';\nimport 'package:PiliPlus/models/common/fav_type.dart';\nimport 'package:PiliPlus/models/common/video/source_type.dart';\nimport 'package:PiliPlus/pages/audio/view.dart';\nimport 'package:PiliPlus/pages/fan/view.dart';\nimport 'package:PiliPlus/pages/follow/view.dart';\nimport 'package:PiliPlus/pages/follow_type/followed/view.dart';\nimport 'package:PiliPlus/pages/live/view.dart';\nimport 'package:PiliPlus/pages/rank/view.dart';\nimport 'package:PiliPlus/pages/subscription_detail/view.dart';\nimport 'package:PiliPlus/pages/video/reply_reply/view.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/request_utils.dart';\nimport 'package:PiliPlus/utils/url_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:app_links/app_links.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nabstract final class PiliScheme {\n  static late AppLinks appLinks;\n  static StreamSubscription? listener;\n  static final uriDigitRegExp = RegExp(r'/(\\d+)');\n  static final _prefixRegex = RegExp(r'^\\S+://');\n\n  static void init() {\n    // Register our protocol only on Windows platform\n    // registerProtocolHandler('bilibili');\n    appLinks = AppLinks();\n\n    listener?.cancel();\n    listener = appLinks.uriLinkStream.listen(routePush);\n  }\n\n  static int? _videoProgress(Map<String, String> queryParameters) {\n    if ((queryParameters['start_progress'] ?? queryParameters['dm_progress'])\n        case final p?) {\n      return int.tryParse(p);\n    } else if (queryParameters['t'] case final t0?) {\n      if (double.tryParse(t0) case final t1?) {\n        return (t1 * 1000).toInt();\n      }\n    }\n    return null;\n  }\n\n  static Future<bool> routePushFromUrl(\n    String url, {\n    bool selfHandle = false,\n    bool off = false,\n    Map? parameters,\n    int? businessId,\n    int? oid,\n  }) {\n    try {\n      if (url.startsWith('//')) {\n        url = 'https:$url';\n      } else if (!_prefixRegex.hasMatch(url)) {\n        url = 'https://$url';\n      }\n      return routePush(\n        Uri.parse(url),\n        selfHandle: selfHandle,\n        off: off,\n        parameters: parameters,\n        businessId: businessId,\n        oid: oid,\n      );\n    } catch (_) {\n      return Future.syncValue(false);\n    }\n  }\n\n  /// 路由跳转\n  static Future<bool> routePush(\n    Uri uri, {\n    bool selfHandle = false,\n    bool off = false,\n    Map? parameters,\n    int? businessId,\n    int? oid,\n  }) async {\n    // if (kDebugMode) debugPrint('onAppLink: $uri');\n\n    final String scheme = uri.scheme;\n    final String host = uri.host;\n    final String path = uri.path;\n\n    switch (scheme) {\n      case 'bilibili':\n        switch (host) {\n          case 'root':\n            Get.key.currentState!.popUntil(\n              (Route<dynamic> route) => route.isFirst,\n            );\n            return true;\n          case 'pgc':\n            // bilibili://pgc/season/ep/123456?h5_awaken_params=random\n            String? id = uriDigitRegExp.firstMatch(path)?.group(1);\n            if (id != null) {\n              bool isEp = path.contains('/ep/');\n              PageUtils.viewPgc(\n                seasonId: isEp ? null : id,\n                epId: isEp ? id : null,\n                progress: _videoProgress(uri.queryParameters),\n              );\n              return true;\n            }\n            return false;\n          case 'space':\n            // bilibili://space/12345678?frommodule=XX&h5awaken=random\n            String? mid = uriDigitRegExp.firstMatch(path)?.group(1);\n            if (mid != null) {\n              if (path.startsWith('/realname')) {\n                RequestUtils.showUserRealName(mid);\n                return true;\n              }\n              PageUtils.toDupNamed('/member?mid=$mid', off: off);\n              return true;\n            }\n            return false;\n          case 'video':\n            // bilibili://video/12345678?dm_progress=123000&cid=12345678&dmid=12345678\n            // bilibili://video/{aid}/?comment_root_id=***&comment_secondary_id=***\n            final queryParameters = uri.queryParameters;\n            if (queryParameters['comment_root_id'] != null) {\n              // to video reply\n              String? oid = uriDigitRegExp.firstMatch(path)?.group(1);\n              int? rpid = int.tryParse(queryParameters['comment_root_id']!);\n              if (oid != null && rpid != null) {\n                VideoReplyReplyPanel.toReply(\n                  oid: int.parse(oid),\n                  rootId: rpid,\n                  rpIdStr: queryParameters['comment_secondary_id'],\n                  type: 1,\n                  uri: uri.replace(query: ''),\n                );\n                return true;\n              }\n              return false;\n            }\n\n            // to video\n            // bilibili://video/12345678?page=0&h5awaken=random\n            String? aid = uriDigitRegExp.firstMatch(path)?.group(1);\n            String? bvid = IdUtils.bvRegex.firstMatch(path)?.group(0);\n            if (aid != null || bvid != null) {\n              final cid = queryParameters['cid'];\n              if (cid != null) {\n                bvid ??= IdUtils.av2bv(int.parse(aid!));\n                PageUtils.toVideoPage(\n                  bvid: bvid,\n                  cid: int.parse(cid),\n                  progress: _videoProgress(queryParameters),\n                  off: off,\n                );\n              } else {\n                videoPush(\n                  aid != null ? int.parse(aid) : null,\n                  bvid,\n                  off: off,\n                  progress: _videoProgress(queryParameters),\n                );\n              }\n              return true;\n            }\n            return false;\n          case 'live':\n            // bilibili://live/12345678?extra_jump_from=1&from=1&is_room_feed=1&h5awaken=random\n            String? roomId = uriDigitRegExp.firstMatch(path)?.group(1);\n            if (roomId != null) {\n              PageUtils.toLiveRoom(int.parse(roomId), off: off);\n              return true;\n            }\n            return false;\n          case 'bangumi':\n            // bilibili://bangumi/season/12345678?h5_awaken_params=random\n            if (path.startsWith('/season')) {\n              String? seasonId = uriDigitRegExp.firstMatch(path)?.group(1);\n              if (seasonId != null) {\n                PageUtils.viewPgc(seasonId: seasonId, epId: null);\n                return true;\n              }\n            }\n            return false;\n          case 'opus':\n            bool hasMatch = _onPushDynDetail(uri, off);\n            return hasMatch;\n          case 'search':\n            final keyword = uri.queryParameters['keyword'];\n            if (keyword != null) {\n              PageUtils.toDupNamed(\n                '/searchResult',\n                parameters: {'keyword': keyword},\n                off: off,\n              );\n              return true;\n            }\n            Get.toNamed('/search');\n            return true;\n          case 'article':\n            // bilibili://article/40679479?jump_opus=1&jump_opus_type=1&opus_type=article&h5awaken=random\n            String? id = uriDigitRegExp.firstMatch(path)?.group(1);\n            if (id != null) {\n              PageUtils.toDupNamed(\n                '/articlePage',\n                parameters: {\n                  'id': id,\n                  'type': 'read',\n                },\n                off: off,\n              );\n              return true;\n            }\n            return false;\n          case 'comment':\n            if (path.startsWith(\"/detail/\") || path.startsWith(\"/msg_fold/\")) {\n              // bilibili://comment/detail/17/832703053858603029/238686570016/?subType=0&anchor=238686628816&showEnter=1&extraIntentId=0&scene=1&enterName=%E6%9F%A5%E7%9C%8B%E5%8A%A8%E6%80%81%E8%AF%A6%E6%83%85&enterUri=bilibili://following/detail/832703053858603029\n              // bilibili://comment/msg_fold/1/22222/33333/11111/?enterUri=bilibili://video/22222 //(aid)\n              // bilibili://comment/msg_fold/11/22222/33333/11111/?enterUri=bilibili://following/detail/44444 (dynId)\n              final pathSegments = uri.pathSegments;\n              final queryParameters = uri.queryParameters;\n              final type = int.parse(pathSegments[1]); // business_id\n              final oid = int.parse(pathSegments[2]); // subject_id\n              final rootId = int.parse(pathSegments[3]); // root_id // target_id\n              // int subType = int.parse(queryParameters['subType'] ?? '0');\n              // int extraIntentId =\n              // int.parse(queryParameters['extraIntentId'] ?? '0');\n              final enterUri = queryParameters['enterUri'];\n              VideoReplyReplyPanel.toReply(\n                oid: oid,\n                rootId: rootId,\n                rpIdStr:\n                    queryParameters['anchor'] ?? pathSegments[3], // source_id\n                type: type,\n                uri: enterUri != null\n                    ? Uri.parse(enterUri)\n                    : const [11, 16, 17].contains(type)\n                    ? Uri(\n                        scheme: 'bilibili',\n                        host: 'following',\n                        path: 'detail/$oid',\n                      )\n                    : null,\n              );\n              return true;\n            }\n            return false;\n          case 'following':\n            // businessId == 17 => dynId == oid\n            // bilibili://following/detail/832703053858603029 (dynId)\n            // bilibili://following/detail/12345678?comment_root_id=654321\\u0026comment_on=1\n            String? cvid = RegExp(\n              r'^/detail/cv(\\d+)',\n              caseSensitive: false,\n            ).matchAsPrefix(path)?.group(1);\n            if (cvid != null) {\n              PageUtils.toDupNamed(\n                '/articlePage',\n                parameters: {\n                  'id': cvid,\n                  'type': 'read',\n                },\n                off: off,\n              );\n              return true;\n            }\n            if ((oid != null || businessId == 17) &&\n                path.startsWith(\"/detail/\")) {\n              final queryParameters = uri.queryParameters;\n              final commentRootId = queryParameters['comment_root_id'];\n              if (commentRootId != null) {\n                String? dynId = uriDigitRegExp.firstMatch(path)?.group(1);\n                int? rpid = int.tryParse(commentRootId);\n                if (dynId != null && rpid != null) {\n                  VideoReplyReplyPanel.toReply(\n                    oid: oid ?? int.parse(dynId),\n                    rootId: rpid,\n                    rpIdStr: queryParameters['comment_secondary_id'],\n                    type: businessId ?? 17,\n                    uri: uri.replace(query: ''),\n                  );\n                  return true;\n                }\n              }\n            }\n            return _onPushDynDetail(uri, off);\n          case 'album':\n            String? rid = uriDigitRegExp.firstMatch(path)?.group(1);\n            if (rid != null) {\n              PageUtils.pushDynFromId(rid: rid, off: off);\n              return true;\n            }\n            return false;\n          case 'medialist':\n            String? mediaId = uriDigitRegExp.firstMatch(path)?.group(1);\n            if (mediaId != null) {\n              PageUtils.toDupNamed(\n                '/favDetail',\n                parameters: {\n                  'mediaId': mediaId,\n                  'heroTag': Utils.makeHeroTag(mediaId),\n                },\n                off: off,\n              );\n              return true;\n            }\n            return false;\n          // bilibili://browser/?url=https%3A%2F%2Fwww.bilibili.com%2F\n          case 'browser':\n            if (selfHandle) return false;\n            final url = uri.queryParameters['url'];\n            if (url != null) {\n              _toWebview(url, off, parameters);\n              return true;\n            }\n            return false;\n          case 'm.bilibili.com':\n            // bilibili://m.bilibili.com/topic-detail?topic_id=1028161&frommodule=H5&h5awaken=xxx\n            final id = uri.queryParameters['topic_id'];\n            if (id != null) {\n              PageUtils.toDupNamed(\n                '/dynTopic',\n                parameters: {'id': id},\n                off: off,\n              );\n              return true;\n            }\n            return false;\n          case 'cheese':\n            // bilibili://cheese/season/123456\n            String? seasonId = uriDigitRegExp.firstMatch(path)?.group(1);\n            if (seasonId != null) {\n              PageUtils.viewPugv(seasonId: seasonId);\n              return true;\n            }\n            return false;\n          case 'history':\n            Get.toNamed('/history');\n            return true;\n          case 'main':\n            if (path.startsWith('/favorite')) {\n              final tab = uri.queryParameters['tab'];\n              int index = 0;\n              if (tab != null) {\n                try {\n                  index = FavTabType.values.byName(tab).index;\n                } catch (e) {\n                  if (kDebugMode) debugPrint('favorite jump: $e');\n                }\n              }\n              Get.toNamed('/fav', arguments: index);\n              return true;\n            }\n            return false;\n          case 'livearea':\n            Get.to(\n              Scaffold(\n                resizeToAvoidBottomInset: false,\n                appBar: AppBar(title: const Text('直播')),\n                body: const ViewSafeArea(child: LivePage()),\n              ),\n            );\n            return true;\n          case 'rank':\n            Get.to(\n              Scaffold(\n                resizeToAvoidBottomInset: false,\n                appBar: AppBar(title: const Text('排行榜')),\n                body: const ViewSafeArea(child: RankPage()),\n              ),\n            );\n            return true;\n          case 'login':\n            Get.toNamed('/loginPage');\n            return true;\n          case 'music':\n            if (path.startsWith('/playlist/')) {\n              final mediaId = uriDigitRegExp.firstMatch(path)?.group(1);\n              if (mediaId != null) {\n                Get.toNamed(\n                  '/favDetail',\n                  parameters: {\n                    'mediaId': mediaId,\n                    'heroTag': Utils.makeHeroTag(mediaId),\n                  },\n                );\n                return true;\n              }\n            }\n            return false;\n          default:\n            if (!selfHandle) {\n              // if (kDebugMode) debugPrint('$uri');\n              SmartDialog.showToast('未知路径:$uri，请截图反馈给开发者');\n            }\n            return false;\n        }\n      case 'http' || 'https':\n        return _fullPathPush(\n          uri,\n          selfHandle: selfHandle,\n          off: off,\n          parameters: parameters,\n        );\n      default:\n        String? aid = IdUtils.avRegexExact.matchAsPrefix(path)?.group(1);\n        String? bvid = IdUtils.bvRegexExact.matchAsPrefix(path)?.group(0);\n        if (aid != null || bvid != null) {\n          videoPush(\n            aid != null ? int.parse(aid) : null,\n            bvid,\n            off: off,\n          );\n          return true;\n        }\n        if (!selfHandle) {\n          // if (kDebugMode) debugPrint('$uri');\n          SmartDialog.showToast('未知路径:$uri，请截图反馈给开发者');\n        }\n        return false;\n    }\n  }\n\n  static Future<bool> _fullPathPush(\n    Uri uri, {\n    bool selfHandle = false,\n    bool off = false,\n    Map? parameters,\n  }) async {\n    // https://m.bilibili.com/bangumi/play/ss39708\n    // https | m.bilibili.com | /bangumi/play/ss39708\n\n    String host = uri.host;\n\n    if (selfHandle &&\n        !host.contains('bilibili.com') &&\n        !host.contains('b23.tv')) {\n      return false;\n    }\n\n    void launchURL() {\n      if (!selfHandle) {\n        _toWebview(uri.toString(), off, parameters);\n      }\n    }\n\n    // b23.tv\n    // bilibili.com\n    // m.bilibili.com\n    // www.bilibili.com\n    // space.bilibili.com\n    // live.bilibili.com\n    // search.bilibili.com\n\n    // redirect\n    if (host.contains('b23.tv')) {\n      String? redirectUrl = await UrlUtils.parseRedirectUrl(uri.toString());\n      if (redirectUrl != null) {\n        uri = Uri.parse(redirectUrl);\n        host = uri.host;\n      }\n      if (!host.contains('bilibili.com')) {\n        launchURL();\n        return false;\n      }\n    }\n\n    final String path = uri.path;\n\n    if (host.contains('t.bilibili.com')) {\n      bool hasMatch = _onPushDynDetail(uri, off);\n      if (!hasMatch) {\n        launchURL();\n      }\n      return hasMatch;\n    } else if (host.contains('live.bilibili.com')) {\n      String? roomId = uriDigitRegExp.firstMatch(path)?.group(1);\n      if (roomId != null) {\n        PageUtils.toLiveRoom(int.parse(roomId), off: off);\n        return true;\n      }\n      launchURL();\n      return false;\n    } else if (host.contains('space.bilibili.com')) {\n      void toType({\n        required String mid,\n        required String? type,\n      }) {\n        switch (type) {\n          case 'follow':\n            FollowPage.toFollowPage(mid: mid);\n            break;\n          case 'fans':\n            FansPage.toFansPage(mid: mid);\n            break;\n          case 'followed':\n            FollowedPage.toFollowedPage(mid: mid);\n            break;\n          default:\n            PageUtils.toDupNamed('/member?mid=$mid', off: off);\n        }\n      }\n\n      late final queryParameters = uri.queryParameters;\n\n      // space.bilibili.com/h5/follow?mid={{mid}}&type={{type}}\n      if (path.startsWith('/h5/follow')) {\n        final mid = queryParameters['mid'];\n        final type = queryParameters['type'];\n        if (mid != null) {\n          toType(mid: mid, type: type);\n          return true;\n        }\n      }\n\n      // space.bilibili.com/{{uid}}/lists/{{season_id}}\n      // space.bilibili.com/{{uid}}/lists?sid={{season_id}}\n      // space.bilibili.com/{{uid}}/channel/collectiondetail?sid={{season_id}}\n      final sid =\n          queryParameters['sid'] ??\n          RegExp(r'lists/(\\d+)').firstMatch(path)?.group(1);\n      if (sid != null) {\n        SubDetailPage.toSubDetailPage(int.parse(sid));\n        return true;\n      }\n\n      // space.bilibili.com/{{mid}}/relation/{{type}}\n      final mid = uriDigitRegExp.firstMatch(path)?.group(1);\n      final type = RegExp(r'relation/([a-z]+)').firstMatch(path)?.group(1);\n      if (mid != null) {\n        toType(mid: mid, type: type);\n        return true;\n      }\n      launchURL();\n      return false;\n    } else if (host.contains('search.bilibili.com')) {\n      String? keyword = uri.queryParameters['keyword'];\n      if (keyword != null) {\n        PageUtils.toDupNamed(\n          '/searchResult',\n          parameters: {'keyword': keyword},\n          off: off,\n        );\n        return true;\n      }\n      launchURL();\n      return false;\n    } else if (host.contains('music.bilibili.com')) {\n      // music.bilibili.com/pc/music-detail?music_id=MA***\n      // music.bilibili.com/h5-music-detail?music_id=MA***\n      if (path.contains('music-detail')) {\n        final musicId = uri.queryParameters['music_id'];\n        if (musicId != null && musicId.startsWith('MA')) {\n          PageUtils.toDupNamed(\n            '/musicDetail',\n            parameters: {'musicId': musicId},\n          );\n          return true;\n        }\n      }\n      launchURL();\n      return false;\n    }\n\n    final pathSegments = uri.pathSegments;\n    if (pathSegments.isEmpty) {\n      launchURL();\n      return false;\n    }\n    final first = pathSegments.first;\n    final String? area = const ['mobile', 'h5', 'v'].contains(first)\n        ? pathSegments.elementAtOrNull(1)\n        : first;\n    // if (kDebugMode) debugPrint('area: $area');\n    switch (area) {\n      case 'note' || 'note-app':\n        String? id = uri.queryParameters['cvid'];\n        if (id != null) {\n          PageUtils.toDupNamed(\n            '/articlePage',\n            parameters: {\n              'id': id,\n              'type': 'read',\n            },\n            off: off,\n          );\n          return true;\n        }\n        launchURL();\n        return false;\n      case 'dynamic' || 'opus':\n        bool hasMatch = _onPushDynDetail(uri, off);\n        if (!hasMatch) {\n          launchURL();\n        }\n        return hasMatch;\n      case 'playlist':\n        // http://m.bilibili.com/playlist/pl12345678?bvid=BVxxxxxxxx&page_type=4\n        String? mediaId = RegExp(\n          r'/pl(\\d+)',\n          caseSensitive: false,\n        ).firstMatch(path)?.group(1);\n        String? bvid =\n            uri.queryParameters['bvid'] ??\n            IdUtils.bvRegex.firstMatch(path)?.group(0);\n        if (bvid != null) {\n          if (mediaId != null) {\n            final int? cid = await SearchHttp.ab2c(bvid: bvid);\n            if (cid != null) {\n              PageUtils.toVideoPage(\n                bvid: bvid,\n                cid: cid,\n                extraArguments: {\n                  'sourceType': SourceType.playlist,\n                  'favTitle': '播放列表',\n                  'mediaId': mediaId,\n                  'desc': true,\n                  'isContinuePlaying': true,\n                },\n              );\n            }\n          } else {\n            videoPush(null, bvid, off: off);\n          }\n          return true;\n        }\n        launchURL();\n        return false;\n      case 'bangumi':\n        // www.bilibili.com/bangumi/play/ep{eid}?start_progress={offset}&thumb_up_dm_id={dmid}\n        // if (kDebugMode) debugPrint('番剧');\n        bool hasMatch = PageUtils.viewPgcFromUri(\n          path,\n          progress: _videoProgress(uri.queryParameters),\n        );\n        if (hasMatch) {\n          return true;\n        }\n        launchURL();\n        return false;\n      case 'video':\n        // if (kDebugMode) debugPrint('投稿');\n        final res = IdUtils.matchAvorBv(input: path);\n        if (res.isNotEmpty) {\n          final queryParameters = uri.queryParameters;\n          final rootIdStr = queryParameters['comment_root_id'];\n          final part = queryParameters['p'];\n          if (rootIdStr != null) {\n            VideoReplyReplyPanel.toReply(\n              oid: res.av ?? IdUtils.bv2av(res.bv!),\n              rootId: int.parse(rootIdStr),\n              rpIdStr: queryParameters['comment_secondary_id'],\n              type: 1,\n              uri: uri.replace(query: part != null ? 'p=$part' : ''),\n            );\n            return true;\n          }\n          videoPush(\n            res.av,\n            res.bv,\n            off: off,\n            progress: _videoProgress(queryParameters),\n            part: part,\n          );\n          return true;\n        }\n        launchURL();\n        return false;\n      case 'read':\n        if (path.contains('readlist')) {\n          String? id = RegExp(\n            r'/rl(\\d+)',\n            caseSensitive: false,\n          ).firstMatch(path)?.group(1);\n          if (id != null) {\n            PageUtils.toDupNamed(\n              '/articleList',\n              parameters: {'id': id},\n              off: off,\n            );\n            return true;\n          }\n          launchURL();\n          return false;\n        }\n        // if (kDebugMode) debugPrint('专栏');\n        String? id = RegExp(\n          r'cv(\\d+)',\n          caseSensitive: false,\n        ).firstMatch(path)?.group(1);\n        if (id != null) {\n          PageUtils.toDupNamed(\n            '/articlePage',\n            parameters: {\n              'id': id,\n              'type': 'read',\n            },\n            off: off,\n          );\n          return true;\n        }\n        launchURL();\n        return false;\n      case 'space':\n        // if (kDebugMode) debugPrint('个人空间');\n        String? mid = uriDigitRegExp.firstMatch(path)?.group(1);\n        if (mid != null) {\n          PageUtils.toDupNamed(\n            '/member?mid=$mid',\n            off: off,\n          );\n          return true;\n        }\n        launchURL();\n        return false;\n      case 'medialist':\n        String? mediaId = RegExp(r'/ml(\\d+)').firstMatch(path)?.group(1);\n        if (mediaId != null) {\n          PageUtils.toDupNamed(\n            '/favDetail',\n            parameters: {\n              'mediaId': mediaId,\n              'heroTag': Utils.makeHeroTag(mediaId),\n            },\n            off: off,\n          );\n          return true;\n        }\n        launchURL();\n        return false;\n      case 'topic' || 'topic-detail':\n        String? id = uri.queryParameters['topic_id'];\n        if (id != null) {\n          PageUtils.toDupNamed(\n            '/dynTopic',\n            parameters: {'id': id},\n            off: off,\n          );\n          return true;\n        }\n        launchURL();\n        return false;\n      case 'comment':\n        // https://www.bilibili.com/h5/comment/sub?oid=123456&pageType=1&root=87654321\n        final queryParameters = uri.queryParameters;\n        final oid = queryParameters['oid'];\n        final root = queryParameters['root'];\n        final pageType = queryParameters['pageType'];\n        if (oid != null && root != null && pageType != null) {\n          VideoReplyReplyPanel.toReply(\n            oid: int.parse(oid),\n            rootId: int.parse(root),\n            rpIdStr: queryParameters['comment_secondary_id'],\n            type: int.parse(pageType),\n            uri: Uri(scheme: 'bilibili', host: 'video', path: oid),\n          );\n          return true;\n        }\n        launchURL();\n        return false;\n      case 'match' || 'game':\n        if (path.contains('match/data/detail') ||\n            path.contains('match/singledata')) {\n          String? cid = uriDigitRegExp.firstMatch(path)?.group(1);\n          if (cid != null) {\n            PageUtils.toDupNamed(\n              '/matchInfo',\n              parameters: {'cid': cid},\n              off: off,\n            );\n            return true;\n          }\n        }\n        launchURL();\n        return false;\n      case 'cheese':\n        // https://www.bilibili.com/cheese/play/ss123456\n        bool hasMatch = PageUtils.viewPgcFromUri(path, isPgc: false);\n        if (hasMatch) {\n          return true;\n        }\n        launchURL();\n        return false;\n      case 'audio':\n        // https://www.bilibili.com/audio/au123456\n        String? oid = RegExp(\n          r'/au(\\d+)',\n          caseSensitive: false,\n        ).firstMatch(path)?.group(1);\n        if (oid != null) {\n          AudioPage.toAudioPage(\n            itemType: 3,\n            oid: int.parse(oid),\n            from: PlaylistSource.AUDIO_CARD,\n          );\n          return true;\n        }\n        launchURL();\n        return false;\n      default:\n        final res = IdUtils.matchAvorBv(input: area?.split('?').first);\n        if (res.isNotEmpty) {\n          videoPush(\n            res.av,\n            res.bv,\n            off: off,\n          );\n          return true;\n        }\n        launchURL();\n        return false;\n    }\n  }\n\n  static bool _onPushDynDetail(Uri uri, bool off) {\n    String? id = uriDigitRegExp.firstMatch(uri.path)?.group(1);\n    bool isRid = uri.queryParameters['type'] == '2';\n    if (id != null) {\n      PageUtils.pushDynFromId(\n        id: isRid ? null : id,\n        rid: isRid ? id : null,\n        off: off,\n      );\n      return true;\n    }\n    return false;\n  }\n\n  static void _toWebview(\n    String url,\n    bool off,\n    Map? parameters,\n  ) {\n    PageUtils.toDupNamed(\n      '/webview',\n      parameters: {\n        'url': url,\n        ...?parameters,\n      },\n      off: off,\n    );\n  }\n\n  // 投稿跳转\n  static Future<void> videoPush(\n    int? aid,\n    String? bvid, {\n    bool showDialog = true,\n    bool off = false,\n    int? progress, // milliseconds\n    String? part,\n  }) async {\n    try {\n      aid ??= IdUtils.bv2av(bvid!);\n      bvid ??= IdUtils.av2bv(aid);\n      if (showDialog) {\n        SmartDialog.showLoading<dynamic>(msg: '获取中...');\n      }\n      final int? cid = await SearchHttp.ab2c(\n        bvid: bvid,\n        aid: aid,\n        part: part != null ? int.tryParse(part) : null,\n      );\n      if (showDialog) {\n        SmartDialog.dismiss();\n      }\n      if (cid != null) {\n        PageUtils.toVideoPage(\n          aid: aid,\n          bvid: bvid,\n          cid: cid,\n          progress: progress,\n          off: off,\n        );\n      }\n    } catch (e) {\n      SmartDialog.dismiss();\n      SmartDialog.showToast('video获取失败: $e');\n    }\n  }\n}\n"
  },
  {
    "path": "lib/utils/app_sign.dart",
    "content": "import 'dart:convert';\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:crypto/crypto.dart';\n\nabstract final class AppSign {\n  static void appSign(\n    Map<String, dynamic> params, {\n    String appkey = Constants.appKey,\n    String appsec = Constants.appSec,\n  }) {\n    // retry error\n    // assert(\n    //   params['appkey'] == null,\n    //   'appkey-appsec should be provided in appSign',\n    // );\n    params['appkey'] = appkey;\n    params['ts'] = (DateTime.now().millisecondsSinceEpoch ~/ 1000).toString();\n    final sorted = params.entries.toList()\n      ..sort((a, b) => a.key.compareTo(b.key));\n    params['sign'] = md5\n        .convert(utf8.encode(_makeQueryFromParametersDefault(sorted) + appsec))\n        .toString(); // 获取MD5哈希值\n  }\n\n  /// from [Uri]\n  static String _makeQueryFromParametersDefault(\n    List<MapEntry<String, dynamic /*String?|Iterable<String>*/>>\n    queryParameters,\n  ) {\n    final result = StringBuffer();\n    var separator = '';\n\n    void writeParameter(String key, String? value) {\n      assert(value != null, 'remove null value');\n      result.write(separator);\n      separator = '&';\n      result.write(Uri.encodeQueryComponent(key));\n      if (value != null && value.isNotEmpty) {\n        result\n          ..write('=')\n          ..write(Uri.encodeQueryComponent(value));\n      }\n    }\n\n    for (final i in queryParameters) {\n      if (i.value case final Iterable<String> values) {\n        for (final String value in values) {\n          writeParameter(i.key, value);\n        }\n      } else {\n        writeParameter(i.key, i.value?.toString());\n      }\n    }\n    return result.toString();\n  }\n}\n"
  },
  {
    "path": "lib/utils/asset_utils.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:flutter/services.dart';\nimport 'package:path/path.dart' as path;\n\nabstract final class AssetUtils {\n  /// from media-kit AssetLoader\n  static String? tryGetPath(String key) {\n    if (Platform.isWindows || Platform.isLinux) {\n      return path.join(\n        path.dirname(Platform.resolvedExecutable),\n        'data',\n        'flutter_assets',\n        key,\n      );\n    } else if (Platform.isMacOS) {\n      return path.join(\n        path.dirname(Platform.resolvedExecutable),\n        '..',\n        'Frameworks',\n        'App.framework',\n        'Resources',\n        'flutter_assets',\n        key,\n      );\n    } else if (Platform.isIOS) {\n      return path.join(\n        path.dirname(Platform.resolvedExecutable),\n        'Frameworks',\n        'App.framework',\n        'flutter_assets',\n        key,\n      );\n    }\n    return null;\n  }\n\n  static FutureOr<String> getOrCopy(\n    String src,\n    Iterable<String> files,\n    String dst,\n  ) async {\n    final parsedSrc = tryGetPath(src);\n    if (parsedSrc != null) {\n      final srcDir = Directory(parsedSrc);\n      if (srcDir.existsSync()) {\n        return srcDir.absolute.path;\n      }\n    }\n\n    final dstDir = Directory(dst);\n    if (!dstDir.existsSync()) {\n      await dstDir.create(recursive: true);\n    }\n\n    for (final file in files) {\n      final targetFile = File(path.join(dst, file));\n      if (targetFile.existsSync()) {\n        continue;\n      }\n\n      try {\n        final data = await rootBundle.load(file);\n        await targetFile.writeAsBytes(data.buffer.asUint8List());\n      } catch (_) {}\n    }\n    return dst;\n  }\n}\n"
  },
  {
    "path": "lib/utils/cache_manager.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:path_provider/path_provider.dart';\n\nabstract final class CacheManager {\n  // 获取缓存目录\n  @pragma('vm:notify-debugger-on-exception')\n  static Future<int> loadApplicationCache([\n    final num maxSize = double.infinity,\n  ]) async {\n    try {\n      final Directory tempDirectory = await getTemporaryDirectory();\n      if (PlatformUtils.isDesktop) {\n        final dir = Directory('${tempDirectory.path}/libCachedImageData');\n        if (dir.existsSync()) {\n          return await getTotalSizeOfFilesInDir(dir, maxSize);\n        }\n        return 0;\n      }\n\n      if (tempDirectory.existsSync()) {\n        return await getTotalSizeOfFilesInDir(tempDirectory, maxSize);\n      }\n    } catch (_) {}\n    return 0;\n  }\n\n  // 循环计算文件的大小\n  @pragma('vm:notify-debugger-on-exception')\n  static Future<int> getTotalSizeOfFilesInDir(\n    final Directory file, [\n    final num maxSize = double.infinity,\n  ]) async {\n    final children = file.list(recursive: true);\n    int total = 0;\n    await for (final child in children) {\n      if (child is File) {\n        total += await child.length();\n        if (total >= maxSize) break;\n      }\n    }\n    return total;\n  }\n\n  // 缓存大小格式转换\n  static String formatSize(num value) {\n    const unitArr = ['B', 'K', 'M', 'G', 'T', 'P'];\n    int index = 0;\n    while (value >= 1024) {\n      index++;\n      value = value / 1024;\n    }\n    String size = value.toStringAsFixed(2);\n    return size + (unitArr.elementAtOrNull(index) ?? '');\n  }\n\n  // 清除 Library/Caches 目录及文件缓存\n  static Future<void> clearLibraryCache() async {\n    try {\n      final Directory tempDirectory = await getTemporaryDirectory();\n      if (PlatformUtils.isDesktop) {\n        final dir = Directory('${tempDirectory.path}/libCachedImageData');\n        if (dir.existsSync()) {\n          await dir.delete(recursive: true);\n        }\n        return;\n      }\n      if (tempDirectory.existsSync()) {\n        final children = tempDirectory.list(recursive: false);\n        await for (final file in children) {\n          await file.delete(recursive: true);\n        }\n      }\n    } catch (_) {}\n  }\n\n  static Future<void> autoClearCache() async {\n    if (Pref.autoClearCache) {\n      await clearLibraryCache();\n    } else {\n      final maxCacheSize = Pref.maxCacheSize;\n      if (maxCacheSize != 0) {\n        final currCache = await loadApplicationCache(maxCacheSize);\n        if (currCache >= maxCacheSize) {\n          await clearLibraryCache();\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "lib/utils/calc_window_position.dart",
    "content": "import 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:collection/collection.dart';\nimport 'package:flutter/material.dart';\nimport 'package:screen_retriever/screen_retriever.dart';\n\nFuture<Offset> calcWindowPosition(Size windowSize) async {\n  final allDisplays = screenRetriever.getAllDisplays();\n  final cursorScreenPoint = await screenRetriever.getCursorScreenPoint();\n\n  final currentDisplay =\n      (await allDisplays).firstWhereOrNull(\n        (display) => (display.visiblePosition! & display.size).contains(\n          cursorScreenPoint,\n        ),\n      ) ??\n      await screenRetriever.getPrimaryDisplay();\n\n  final double visibleWidth;\n  final double visibleHeight;\n  if (currentDisplay.visibleSize case final size?) {\n    visibleWidth = size.width;\n    visibleHeight = size.height;\n  } else {\n    visibleWidth = currentDisplay.size.width;\n    visibleHeight = currentDisplay.size.height;\n  }\n\n  final double visibleStartX;\n  final double visibleStartY;\n  if (currentDisplay.visiblePosition case final offset?) {\n    visibleStartX = offset.dx;\n    visibleStartY = offset.dy;\n  } else {\n    visibleStartX = visibleStartY = 0;\n  }\n\n  final windowPosition = Pref.windowPosition;\n  if (windowPosition != null) {\n    try {\n      final dx = windowPosition[0];\n      final dy = windowPosition[1];\n      if (dx >= visibleStartX &&\n          dy >= visibleStartY &&\n          dx < (visibleWidth - 30) &&\n          dy < (visibleHeight - 30)) {\n        return Offset(dx, dy);\n      }\n    } catch (_) {}\n  }\n\n  return Offset(\n    visibleStartX + (visibleWidth / 2) - (windowSize.width / 2),\n    visibleStartY + ((visibleHeight / 2) - (windowSize.height / 2)),\n  );\n}\n"
  },
  {
    "path": "lib/utils/danmaku_utils.dart",
    "content": "import 'dart:ui' show Color;\n\nimport 'package:canvas_danmaku/models/danmaku_content_item.dart'\n    show DanmakuItemType;\n\nabstract final class DmUtils {\n  static Color decimalToColor(int decimalColor) =>\n      Color(decimalColor | 0xFF000000);\n\n  static DanmakuItemType getPosition(int mode) => switch (mode) {\n    4 => DanmakuItemType.bottom,\n    5 => DanmakuItemType.top,\n    7 => DanmakuItemType.special,\n    _ => DanmakuItemType.scroll,\n  };\n}\n"
  },
  {
    "path": "lib/utils/date_utils.dart",
    "content": "import 'package:intl/intl.dart' show DateFormat;\n\nabstract final class DateFormatUtils {\n  static final shortFormat = DateFormat('MM-dd');\n  static final longFormat = DateFormat('yyyy-MM-dd');\n  static final _shortFormatD = DateFormat('MM-dd HH:mm');\n  static final longFormatD = DateFormat('yyyy-MM-dd HH:mm');\n  static final longFormatDs = DateFormat('yyyy-MM-dd HH:mm:ss');\n\n  static String dateFormat(\n    int? time, {\n    DateFormat? short,\n    DateFormat? long,\n  }) {\n    if (time == null || time == 0) {\n      return '';\n    }\n\n    final now = DateTime.now();\n    final date = DateTime.fromMillisecondsSinceEpoch(time * 1000);\n    final diff = now.difference(date);\n\n    final diffInMins = diff.inMinutes;\n    if (diffInMins < 1) return '刚刚';\n    if (diffInMins < 60) return '$diffInMins分钟前';\n\n    final diffInHours = diff.inHours;\n    if (diffInHours < 24) return '$diffInHours小时前';\n\n    final today = DateTime(now.year, now.month, now.day);\n    final dateDay = DateTime(date.year, date.month, date.day);\n    final dayDiff = today.difference(dateDay).inDays;\n    if (dayDiff == 1) {\n      return '昨天 ${_twoDigits(date.hour)}:${_twoDigits(date.minute)}';\n    }\n    if (dayDiff < 4) {\n      return '$dayDiff天前';\n    }\n    final DateFormat sdf = now.year == date.year\n        ? short ?? shortFormat\n        : long ?? longFormat;\n    return sdf.format(date);\n  }\n\n  static String _twoDigits(int n) => n.toString().padLeft(2, '0');\n\n  static String chatFormat(int? time, {bool isHistory = false}) {\n    if (time == null || time == 0) {\n      return '';\n    }\n\n    final now = DateTime.now();\n    final date = DateTime.fromMillisecondsSinceEpoch(time * 1000);\n\n    final today = DateTime(now.year, now.month, now.day);\n    final dateDay = DateTime(date.year, date.month, date.day);\n    if (today == dateDay) {\n      return '${isHistory ? '今天 ' : ''}${_twoDigits(date.hour)}:${_twoDigits(date.minute)}';\n    }\n    final isYesterday = today.subtract(const Duration(days: 1)) == dateDay;\n    if (isYesterday) {\n      return '昨天 ${_twoDigits(date.hour)}:${_twoDigits(date.minute)}';\n    }\n    if (isHistory) {\n      final DateFormat sdf = now.year == date.year\n          ? _shortFormatD\n          : longFormatD;\n      return sdf.format(date);\n    }\n    return longFormatD.format(date);\n  }\n\n  static String format(int? time, {DateFormat? format}) {\n    if (time == null || time == 0) {\n      return '';\n    }\n    final date = DateTime.fromMillisecondsSinceEpoch(time * 1000);\n    return (format ?? longFormatD).format(date);\n  }\n}\n"
  },
  {
    "path": "lib/utils/duration_utils.dart",
    "content": "import 'dart:math' show pow;\n\nabstract final class DurationUtils {\n  static String formatDuration(num? seconds) {\n    if (seconds == null || seconds == 0) {\n      return '00:00';\n    }\n    int h = seconds ~/ 3600;\n    seconds %= 3600;\n    int m = seconds ~/ 60;\n    seconds %= 60;\n    String sms = seconds is double\n        ? seconds.toStringAsFixed(3).padLeft(6, '0')\n        : seconds.toString().padLeft(2, '0');\n    return h == 0\n        ? \"${m.toString().padLeft(2, '0')}:$sms\"\n        : \"${h.toString().padLeft(2, '0')}:${m.toString().padLeft(2, '0')}:$sms\";\n  }\n\n  static final _splitRegex = RegExp(r'[:：]');\n  static int parseDuration(String? data) {\n    if (data == null || data.isEmpty) {\n      return 0;\n    }\n    List<int> split = data.split(_splitRegex).reversed.map(int.parse).toList();\n    int duration = 0;\n    for (int i = 0; i < split.length; i++) {\n      duration += split[i] * pow(60, i).toInt();\n    }\n    return duration;\n  }\n\n  static String formatDurationBetween(int startMillis, int endMillis) =>\n      formatTimeDuration(Duration(milliseconds: endMillis - startMillis));\n\n  static String formatTimeDuration(Duration duration) {\n    final inDays = duration.inDays;\n    final daysLeft = inDays % 365;\n    final years = inDays ~/ 365;\n    final months = daysLeft ~/ 30;\n    final days = daysLeft % 30;\n    final hours = duration.inHours % 24;\n    final minutes = duration.inMinutes % 60;\n\n    final format = StringBuffer();\n\n    if (years > 0) format.write('$years年');\n    if (months > 0) format.write('$months月');\n    if (days > 0) format.write('$days天');\n    if (hours > 0) format.write('$hours小时');\n    if (minutes > 0) format.write('$minutes分钟');\n\n    return format.toString();\n  }\n}\n"
  },
  {
    "path": "lib/utils/em.dart",
    "content": "abstract final class Em {\n  static final _exp = RegExp('<[^>]*>([^<]*)</[^>]*>');\n  static final _htmlRegExp = RegExp(r'&(lt|gt|quot|apos|nbsp|amp);');\n\n  static String regCate(String origin) {\n    Iterable<Match> matches = _exp.allMatches(origin);\n    return matches.lastOrNull?.group(1) ?? origin;\n  }\n\n  static List<({bool isEm, String text})> regTitle(String origin) {\n    List<({bool isEm, String text})> res = [];\n    origin.splitMapJoin(\n      _exp,\n      onMatch: (Match match) {\n        String matchStr = match[0]!;\n        res.add((isEm: true, text: regCate(matchStr)));\n        return '';\n      },\n      onNonMatch: (String str) {\n        if (str != '') {\n          res.add((\n            isEm: false,\n            text: str.replaceAllMapped(\n              _htmlRegExp,\n              (m) => switch (m.group(1)) {\n                'lt' => '<',\n                'gt' => '>',\n                'quot' => '\"',\n                'apos' => \"'\",\n                'nbsp' => ' ',\n                'amp' => '&',\n                _ => m.group(0)!,\n              },\n            ),\n          ));\n        }\n        return '';\n      },\n    );\n    return res;\n  }\n}\n"
  },
  {
    "path": "lib/utils/extension/box_ext.dart",
    "content": "import 'package:collection/collection.dart';\nimport 'package:hive_ce/hive.dart';\n\nextension BoxExt<E> on Box<E> {\n  bool equal(dynamic key, E value) {\n    return const DeepCollectionEquality().equals(value, get(key));\n  }\n\n  Future<void>? putNE(dynamic key, E value) {\n    if (!equal(key, value)) {\n      return put(key, value);\n    }\n    return null;\n  }\n\n  Future<void>? putAllNE(Map<dynamic, E> entries) {\n    final Map<dynamic, E> newEntries = {};\n    entries.forEach((key, value) {\n      if (!equal(key, value)) {\n        newEntries[key] = value;\n      }\n    });\n    if (newEntries.isNotEmpty) {\n      return putAll(newEntries);\n    }\n    return null;\n  }\n}\n"
  },
  {
    "path": "lib/utils/extension/context_ext.dart",
    "content": "import 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:flutter/material.dart';\n\n/// from Getx\nextension ContextExtensions on BuildContext {\n  /// The same of [MediaQuery.of(context).size]\n  Size get mediaQuerySize => MediaQuery.sizeOf(this);\n\n  /// The same of [MediaQuery.of(context).size.height]\n  /// Note: updates when you rezise your screen (like on a browser or\n  /// desktop window)\n  double get height => MediaQuery.heightOf(this);\n\n  /// The same of [MediaQuery.of(context).size.width]\n  /// Note: updates when you resize your screen (like on a browser or\n  /// desktop window)\n  double get width => MediaQuery.widthOf(this);\n\n  /// similar to [MediaQuery.of(context).padding]\n  ThemeData get theme => Theme.of(this);\n\n  /// Check if dark mode theme is enable\n  bool get isDarkMode => (Theme.brightnessOf(this) == Brightness.dark);\n\n  /// give access to Theme.of(context).iconTheme.color\n  Color? get iconColor => IconTheme.of(this).color;\n\n  /// similar to [MediaQuery.of(context).padding]\n  TextTheme get textTheme => TextTheme.of(this);\n\n  /// similar to [MediaQuery.of(context).padding]\n  EdgeInsets get mediaQueryPadding => MediaQuery.viewPaddingOf(this);\n\n  /// similar to [MediaQuery.of(context).padding]\n  MediaQueryData get mediaQuery => MediaQuery.of(this);\n\n  /// similar to [MediaQuery.of(context).viewPadding]\n  EdgeInsets get mediaQueryViewPadding => MediaQuery.viewPaddingOf(this);\n\n  /// similar to [MediaQuery.of(context).viewInsets]\n  EdgeInsets get mediaQueryViewInsets => MediaQuery.viewInsetsOf(this);\n\n  /// similar to [MediaQuery.of(context).orientation]\n  Orientation get orientation => MediaQuery.orientationOf(this);\n\n  /// check if device is on landscape mode\n  bool get isLandscape => orientation == Orientation.landscape;\n\n  /// check if device is on portrait mode\n  bool get isPortrait => orientation == Orientation.portrait;\n\n  /// similar to [MediaQuery.of(this).devicePixelRatio]\n  double get devicePixelRatio => MediaQuery.devicePixelRatioOf(this);\n\n  /// similar to [MediaQuery.of(this).textScaleFactor]\n  TextScaler get textScaler => MediaQuery.textScalerOf(this);\n\n  /// get the shortestSide from screen\n  double get mediaQueryShortestSide => mediaQuerySize.shortestSide;\n\n  /// True if width be larger than 800\n  bool get showNavbar => (width > 800);\n\n  /// True if the shortestSide is smaller than 600p\n  bool get isPhone => (mediaQueryShortestSide < 600);\n\n  /// True if the shortestSide is largest than 600p\n  bool get isSmallTablet => (mediaQueryShortestSide >= 600);\n\n  /// True if the shortestSide is largest than 720p\n  bool get isLargeTablet => (mediaQueryShortestSide >= 720);\n\n  /// True if the current device is Tablet\n  bool get isTablet => isSmallTablet || isLargeTablet;\n\n  String get platformName => PlatformUtils.isDesktop\n      ? 'desktop'\n      : isTablet\n      ? 'pad'\n      : 'phone';\n}\n"
  },
  {
    "path": "lib/utils/extension/extension.dart",
    "content": "import 'package:floating/floating.dart';\n\nextension RationalExt on Rational {\n  /// Checks whether given [Rational] instance fits into Android requirements\n  /// or not.\n  ///\n  /// Android docs specified boundaries as inclusive.\n  bool get fitsInAndroidRequirements {\n    final aspectRatio = numerator / denominator;\n    const min = 1 / 2.39;\n    const max = 2.39;\n    return (min <= aspectRatio) && (aspectRatio <= max);\n  }\n}\n"
  },
  {
    "path": "lib/utils/extension/file_ext.dart",
    "content": "import 'dart:io';\n\nextension FileSystemEntityExt on FileSystemEntity {\n  Future<void> tryDel({bool recursive = false}) async {\n    try {\n      await delete(recursive: recursive);\n    } catch (_) {}\n  }\n}\n\nextension DirectoryExt on Directory {\n  Future<bool> lengthGte(int length) async {\n    int count = 0;\n    await for (final _ in list()) {\n      if (++count == length) return true;\n    }\n    return false;\n  }\n}\n"
  },
  {
    "path": "lib/utils/extension/get_ext.dart",
    "content": "import 'package:PiliPlus/main.dart';\nimport 'package:get/get.dart';\n\nextension GetExt on GetInterface {\n  S putOrFind<S>(InstanceBuilderCallback<S> dep, {String? tag}) =>\n      GetInstance().putOrFind(dep, tag: tag);\n\n  void updateMyAppTheme() {\n    final (l, d) = MyApp.getAllTheme();\n    rootController\n      ..theme = l\n      ..darkTheme = d\n      ..update();\n  }\n}\n"
  },
  {
    "path": "lib/utils/extension/iterable_ext.dart",
    "content": "extension NullableIterableExt<T> on Iterable<T>? {\n  bool get isNullOrEmpty => this == null || this!.isEmpty;\n}\n\nextension IterableExt<T> on Iterable<T> {\n  T? reduceOrNull(T Function(T value, T element) combine) {\n    Iterator<T> iterator = this.iterator;\n    if (!iterator.moveNext()) {\n      return null;\n    }\n    T value = iterator.current;\n    while (iterator.moveNext()) {\n      value = combine(value, iterator.current);\n    }\n    return value;\n  }\n\n  T? firstWhereOrNull(bool Function(T element) test) {\n    for (final element in this) {\n      if (test(element)) return element;\n    }\n    return null;\n  }\n}\n\nextension ListExt<T> on List<T> {\n  bool removeFirstWhere(bool Function(T) test) {\n    final index = indexWhere(test);\n    if (index != -1) {\n      removeAt(index);\n      return true;\n    }\n    return false;\n  }\n\n  List<R> fromCast<R>() {\n    return List<R>.from(this);\n  }\n\n  T findClosestTarget(\n    bool Function(T) test,\n    T Function(T, T) combine,\n  ) {\n    return where(test).reduceOrNull(combine) ?? reduce(combine);\n  }\n\n  /// from [algorithms.lowerBoundBy].\n  int lowerBoundByKey<K extends Comparable<K>>(\n    K Function(T element) keyOf,\n    K key, [\n    int start = 0,\n    int? end,\n  ]) {\n    end = RangeError.checkValidRange(start, end, length);\n    var min = start;\n    var max = end;\n    while (min < max) {\n      var mid = min + ((max - min) >> 1);\n      var element = this[mid];\n      var comp = keyOf(element).compareTo(key);\n      if (comp < 0) {\n        min = mid + 1;\n      } else {\n        max = mid;\n      }\n    }\n    return min;\n  }\n}\n"
  },
  {
    "path": "lib/utils/extension/map_ext.dart",
    "content": "extension MapExt<K, V> on Map<K, V> {\n  Map<RK, RV> fromCast<RK, RV>() {\n    return Map<RK, RV>.from(this);\n  }\n}\n"
  },
  {
    "path": "lib/utils/extension/num_ext.dart",
    "content": "import 'dart:math' show pow;\n\nimport 'package:flutter/widgets.dart';\n\nextension ImageExtension on num {\n  int? cacheSize(BuildContext context) {\n    if (this == 0) {\n      return null;\n    }\n    return (this * MediaQuery.devicePixelRatioOf(context)).round();\n  }\n}\n\nextension IntExt on int? {\n  int? operator +(int other) => this == null ? null : this! + other;\n  int? operator -(int other) => this == null ? null : this! - other;\n}\n\nextension DoubleExt on double {\n  double toPrecision(int fractionDigits) {\n    final mod = pow(10, fractionDigits).toDouble();\n    return (this * mod).roundToDouble() / mod;\n  }\n\n  bool equals(double other, [double epsilon = 1e-10]) =>\n      (this - other).abs() < epsilon;\n\n  double lerp(double a, double b) {\n    assert(\n      a.isFinite,\n      'Cannot interpolate between finite and non-finite values',\n    );\n    assert(\n      b.isFinite,\n      'Cannot interpolate between finite and non-finite values',\n    );\n    assert(isFinite, 't must be finite when interpolating between values');\n    return a * (1.0 - this) + b * this;\n  }\n}\n"
  },
  {
    "path": "lib/utils/extension/scroll_controller_ext.dart",
    "content": "import 'package:flutter/widgets.dart';\n\nextension ScrollControllerExt on ScrollController {\n  void animToTop() => animTo(0);\n\n  void animTo(\n    double offset, {\n    Duration duration = const Duration(milliseconds: 500),\n  }) {\n    if (!hasClients) return;\n    if ((offset - this.offset).abs() >= position.viewportDimension * 7) {\n      jumpTo(offset);\n    } else {\n      animateTo(\n        offset,\n        duration: duration,\n        curve: Curves.easeInOut,\n      );\n    }\n  }\n\n  void jumpToTop() {\n    if (!hasClients) return;\n    jumpTo(0);\n  }\n}\n"
  },
  {
    "path": "lib/utils/extension/size_ext.dart",
    "content": "import 'dart:ui' show Size;\n\nextension SizeExt on Size {\n  bool get isPortrait => width < 600 || height >= width;\n}\n"
  },
  {
    "path": "lib/utils/extension/string_ext.dart",
    "content": "final _regExp = RegExp(\"^(http:)?//\", caseSensitive: false);\n\nextension StringExt on String? {\n  String get http2https => this?.replaceFirst(_regExp, \"https://\") ?? '';\n\n  bool get isNullOrEmpty => this == null || this!.isEmpty;\n}\n"
  },
  {
    "path": "lib/utils/extension/theme_ext.dart",
    "content": "import 'package:flex_seed_scheme/flex_seed_scheme.dart';\nimport 'package:flutter/material.dart';\n\nextension ColorSchemeExt on ColorScheme {\n  Color get vipColor =>\n      brightness.isLight ? const Color(0xFFFF6699) : const Color(0xFFD44E7D);\n\n  Color get freeColor =>\n      brightness.isLight ? const Color(0xFFFF7F24) : const Color(0xFFD66011);\n\n  bool get isLight => brightness.isLight;\n\n  bool get isDark => brightness.isDark;\n}\n\nextension ColorExtension on Color {\n  Color darken([double amount = .5]) {\n    assert(amount >= 0 && amount <= 1, 'Amount must be between 0 and 1');\n    return Color.lerp(this, Colors.black, amount)!;\n  }\n\n  ColorScheme asColorSchemeSeed([\n    FlexSchemeVariant variant = .material,\n    Brightness brightness = .light,\n  ]) => SeedColorScheme.fromSeeds(\n    primaryKey: this,\n    variant: variant,\n    brightness: brightness,\n    useExpressiveOnContainerColors: false,\n  );\n}\n\nextension BrightnessExt on Brightness {\n  Brightness get reverse => isLight ? Brightness.dark : Brightness.light;\n\n  bool get isLight => this == Brightness.light;\n\n  bool get isDark => this == Brightness.dark;\n}\n"
  },
  {
    "path": "lib/utils/extension/three_dot_ext.dart",
    "content": "import 'package:PiliPlus/common/widgets/dialog/dialog.dart';\nimport 'package:PiliPlus/grpc/bilibili/app/im/v1.pb.dart'\n    show ThreeDotItem, ThreeDotItemType, IMSettingType;\nimport 'package:PiliPlus/pages/common/common_whisper_controller.dart';\nimport 'package:PiliPlus/pages/contact/view.dart';\nimport 'package:PiliPlus/pages/whisper_settings/view.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:material_design_icons_flutter/material_design_icons_flutter.dart';\n\nextension ThreeDotItemTypeExt on ThreeDotItemType {\n  Icon get icon => switch (this) {\n    ThreeDotItemType.THREE_DOT_ITEM_TYPE_MSG_SETTING => const Icon(\n      Icons.settings,\n      size: 20,\n    ),\n    ThreeDotItemType.THREE_DOT_ITEM_TYPE_READ_ALL => const Icon(\n      Icons.cleaning_services,\n      size: 20,\n    ),\n    ThreeDotItemType.THREE_DOT_ITEM_TYPE_CLEAR_LIST => const Icon(\n      Icons.delete_forever_outlined,\n      size: 20,\n    ),\n    ThreeDotItemType.THREE_DOT_ITEM_TYPE_UP_HELPER => const Icon(\n      Icons.live_tv,\n      size: 20,\n    ),\n    ThreeDotItemType.THREE_DOT_ITEM_TYPE_CONTACTS => const Icon(\n      Icons.account_box_outlined,\n      size: 20,\n    ),\n    ThreeDotItemType.THREE_DOT_ITEM_TYPE_FANS_GROUP_HELPER => const Icon(\n      Icons.notifications_none,\n      size: 20,\n    ),\n    _ => const Icon(MdiIcons.circleMedium, size: 20),\n  };\n\n  void action({\n    required BuildContext context,\n    required CommonWhisperController controller,\n    required ThreeDotItem item,\n  }) {\n    switch (this) {\n      case ThreeDotItemType.THREE_DOT_ITEM_TYPE_READ_ALL:\n        showConfirmDialog(\n          context: context,\n          title: '一键已读',\n          content: '是否清除全部新消息提醒？',\n          onConfirm: controller.onClearUnread,\n        );\n      case ThreeDotItemType.THREE_DOT_ITEM_TYPE_CLEAR_LIST:\n        showConfirmDialog(\n          context: context,\n          title: '清空列表',\n          content: '清空后所有消息将被删除，无法恢复',\n          onConfirm: controller.onDeleteList,\n        );\n      case ThreeDotItemType.THREE_DOT_ITEM_TYPE_MSG_SETTING:\n        Get.to(\n          const WhisperSettingsPage(\n            imSettingType: IMSettingType.SETTING_TYPE_NEED_ALL,\n          ),\n        );\n      case ThreeDotItemType.THREE_DOT_ITEM_TYPE_UP_HELPER:\n        dynamic talkerId = RegExp(r'/(\\d{3,})').firstMatch(item.url)?.group(1);\n        if (talkerId != null) {\n          talkerId = int.parse(talkerId);\n          Get.toNamed(\n            '/whisperDetail',\n            arguments: {\n              'talkerId': talkerId,\n              'name': item.title,\n              'face': switch (talkerId) {\n                844424930131966 =>\n                  'https://message.biliimg.com/bfs/im/489a63efadfb202366c2f88853d2217b5ddc7a13.png',\n                844424930131964 =>\n                  'https://i0.hdslb.com/bfs/im_new/58eda511672db078466e7ab8db22a95c1503684976.png',\n                _ => item.icon,\n              },\n            },\n          );\n        }\n      case ThreeDotItemType.THREE_DOT_ITEM_TYPE_CONTACTS:\n        Get.to(const ContactPage(isFromSelect: false));\n      default:\n        SmartDialog.showToast('TODO: $name');\n    }\n  }\n}\n"
  },
  {
    "path": "lib/utils/extension/widget_ext.dart",
    "content": "import 'package:flutter/widgets.dart';\n\nextension WidgetExt on Widget {\n  Widget constraintWidth({\n    BoxConstraints constraints = const BoxConstraints(maxWidth: 625),\n  }) {\n    return Align(\n      alignment: Alignment.topCenter,\n      child: ConstrainedBox(\n        constraints: constraints,\n        child: this,\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/utils/fav_utils.dart",
    "content": "abstract final class FavUtils {\n  static bool isDefaultFav(int? attr) {\n    if (attr == null) {\n      return false;\n    }\n    return (attr & 2) == 0;\n  }\n\n  static String isPublicFavText(int? attr) {\n    if (attr == null) {\n      return '';\n    }\n    return isPublicFav(attr) ? '公开' : '私密';\n  }\n\n  static bool isPublicFav(int attr) {\n    return (attr & 1) == 0;\n  }\n}\n"
  },
  {
    "path": "lib/utils/feed_back.dart",
    "content": "import 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:flutter/services.dart' show HapticFeedback;\n\nbool enableFeedback = Pref.feedBackEnable;\nvoid feedBack() {\n  if (enableFeedback) {\n    HapticFeedback.lightImpact();\n  }\n}\n"
  },
  {
    "path": "lib/utils/global_data.dart",
    "content": "import 'package:PiliPlus/utils/storage_pref.dart';\n\nclass GlobalData {\n  int imgQuality = Pref.picQuality;\n\n  num? coins;\n\n  void afterCoin(num coin) {\n    if (coins != null) {\n      coins = coins! - coin;\n    }\n  }\n\n  Set<int> blackMids = Pref.blackMids;\n\n  bool dynamicsWaterfallFlow = Pref.dynamicsWaterfallFlow;\n\n  // 私有构造函数\n  GlobalData._();\n\n  // 单例实例\n  static final GlobalData _instance = GlobalData._();\n\n  // 获取全局实例\n  factory GlobalData() => _instance;\n}\n"
  },
  {
    "path": "lib/utils/grid.dart",
    "content": "import 'dart:math';\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/skeleton/video_card_h.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart';\n\nmixin GridMixin<T extends StatefulWidget> on State<T> {\n  late final gridDelegate = Grid.videoCardHDelegate(context);\n\n  Widget get gridSkeleton => SliverGrid.builder(\n    gridDelegate: gridDelegate,\n    itemBuilder: (_, _) => const VideoCardHSkeleton(),\n    itemCount: 10,\n  );\n}\n\nabstract final class Grid {\n  static final double smallCardWidth = Pref.smallCardWidth;\n\n  static SliverGridDelegateWithExtentAndRatio videoCardHDelegate(\n    BuildContext context, {\n    double minHeight = 90,\n  }) => SliverGridDelegateWithExtentAndRatio(\n    mainAxisSpacing: 2,\n    maxCrossAxisExtent: Grid.smallCardWidth * 2,\n    childAspectRatio: StyleString.aspectRatio * 2.2,\n    minHeight: MediaQuery.textScalerOf(context).scale(minHeight),\n  );\n}\n\nclass SliverGridDelegateWithExtentAndRatio extends SliverGridDelegate {\n  /// Creates a delegate that makes grid layouts with tiles that have a maximum\n  /// cross-axis extent.\n  ///\n  /// The [maxCrossAxisExtent], [mainAxisExtent], [mainAxisSpacing],\n  /// and [crossAxisSpacing] arguments must not be negative.\n  /// The [childAspectRatio] argument must be greater than zero.\n  SliverGridDelegateWithExtentAndRatio({\n    required this.maxCrossAxisExtent,\n    this.mainAxisSpacing = 0.0,\n    this.crossAxisSpacing = 0.0,\n    this.childAspectRatio = 1.0,\n    this.mainAxisExtent = 0.0,\n    this.minHeight = 0.0,\n  }) : assert(maxCrossAxisExtent > 0),\n       assert(mainAxisSpacing >= 0),\n       assert(crossAxisSpacing >= 0),\n       assert(childAspectRatio > 0),\n       assert(minHeight >= 0);\n\n  final double minHeight;\n\n  /// The maximum extent of tiles in the cross axis.\n  ///\n  /// This delegate will select a cross-axis extent for the tiles that is as\n  /// large as possible subject to the following conditions:\n  ///\n  ///  - The extent evenly divides the cross-axis extent of the grid.\n  ///  - The extent is at most [maxCrossAxisExtent].\n  ///\n  /// For example, if the grid is vertical, the grid is 500.0 pixels wide, and\n  /// [maxCrossAxisExtent] is 150.0, this delegate will create a grid with 4\n  /// columns that are 125.0 pixels wide.\n  final double maxCrossAxisExtent;\n\n  /// The number of logical pixels between each child along the main axis.\n  final double mainAxisSpacing;\n\n  /// The number of logical pixels between each child along the cross axis.\n  final double crossAxisSpacing;\n\n  /// The ratio of the cross-axis to the main-axis extent of each child.\n  final double childAspectRatio;\n\n  /// The extent of each tile in the main axis. If provided, it would add\n  /// after [childAspectRatio] is used.\n  final double mainAxisExtent;\n\n  bool _debugAssertIsValid(double crossAxisExtent) {\n    assert(crossAxisExtent > 0.0);\n    assert(maxCrossAxisExtent > 0.0);\n    assert(mainAxisSpacing >= 0.0);\n    assert(crossAxisSpacing >= 0.0);\n    assert(childAspectRatio > 0.0);\n    return true;\n  }\n\n  SliverGridLayout? layoutCache;\n  double? crossAxisExtentCache;\n\n  @override\n  SliverGridLayout getLayout(SliverConstraints constraints) {\n    // invoked before each frame\n    assert(_debugAssertIsValid(constraints.crossAxisExtent));\n    if (layoutCache != null &&\n        constraints.crossAxisExtent == crossAxisExtentCache) {\n      return layoutCache!;\n    }\n    crossAxisExtentCache = constraints.crossAxisExtent;\n    int crossAxisCount =\n        ((constraints.crossAxisExtent - crossAxisSpacing) /\n                (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 = max(1, crossAxisCount);\n    final double usableCrossAxisExtent = max(\n      0.0,\n      constraints.crossAxisExtent - crossAxisSpacing * (crossAxisCount - 1),\n    );\n    final double childCrossAxisExtent = usableCrossAxisExtent / crossAxisCount;\n    final double childMainAxisExtent = max(\n      minHeight,\n      childCrossAxisExtent / childAspectRatio + mainAxisExtent,\n    );\n    return layoutCache = SliverGridRegularTileLayout(\n      crossAxisCount: crossAxisCount,\n      mainAxisStride: childMainAxisExtent + mainAxisSpacing,\n      crossAxisStride: childCrossAxisExtent + crossAxisSpacing,\n      childMainAxisExtent: childMainAxisExtent,\n      childCrossAxisExtent: childCrossAxisExtent,\n      reverseCrossAxis: axisDirectionIsReversed(constraints.crossAxisDirection),\n    );\n  }\n\n  @override\n  bool shouldRelayout(SliverGridDelegateWithExtentAndRatio oldDelegate) {\n    final flag =\n        oldDelegate.maxCrossAxisExtent != maxCrossAxisExtent ||\n        oldDelegate.mainAxisSpacing != mainAxisSpacing ||\n        oldDelegate.crossAxisSpacing != crossAxisSpacing ||\n        oldDelegate.childAspectRatio != childAspectRatio ||\n        oldDelegate.mainAxisExtent != mainAxisExtent;\n    if (flag) layoutCache = null;\n    return flag;\n  }\n}\n\nclass SliverGridDelegateWithMaxCrossAxisExtent extends SliverGridDelegate {\n  /// Creates a delegate that makes grid layouts with tiles that have a maximum\n  /// cross-axis extent.\n  ///\n  /// The [maxCrossAxisExtent], [mainAxisExtent], [mainAxisSpacing],\n  /// and [crossAxisSpacing] arguments must not be negative.\n  /// The [childAspectRatio] argument must be greater than zero.\n  SliverGridDelegateWithMaxCrossAxisExtent({\n    required this.maxCrossAxisExtent,\n    this.mainAxisSpacing = 0.0,\n    this.crossAxisSpacing = 0.0,\n    this.childAspectRatio = 1.0,\n    this.mainAxisExtent,\n  }) : assert(maxCrossAxisExtent > 0),\n       assert(mainAxisSpacing >= 0),\n       assert(crossAxisSpacing >= 0),\n       assert(childAspectRatio > 0),\n       assert(mainAxisExtent == null || mainAxisExtent >= 0);\n\n  /// The maximum extent of tiles in the cross axis.\n  ///\n  /// This delegate will select a cross-axis extent for the tiles that is as\n  /// large as possible subject to the following conditions:\n  ///\n  ///  - The extent evenly divides the cross-axis extent of the grid.\n  ///  - The extent is at most [maxCrossAxisExtent].\n  ///\n  /// For example, if the grid is vertical, the grid is 500.0 pixels wide, and\n  /// [maxCrossAxisExtent] is 150.0, this delegate will create a grid with 4\n  /// columns that are 125.0 pixels wide.\n  final double maxCrossAxisExtent;\n\n  /// The number of logical pixels between each child along the main axis.\n  final double mainAxisSpacing;\n\n  /// The number of logical pixels between each child along the cross axis.\n  final double crossAxisSpacing;\n\n  /// The ratio of the cross-axis to the main-axis extent of each child.\n  final double childAspectRatio;\n\n  /// The extent of each tile in the main axis. If provided it would define the\n  /// logical pixels taken by each tile in the main-axis.\n  ///\n  /// If null, [childAspectRatio] is used instead.\n  final double? mainAxisExtent;\n\n  bool _debugAssertIsValid(double crossAxisExtent) {\n    assert(crossAxisExtent > 0.0);\n    assert(maxCrossAxisExtent > 0.0);\n    assert(mainAxisSpacing >= 0.0);\n    assert(crossAxisSpacing >= 0.0);\n    assert(childAspectRatio > 0.0);\n    return true;\n  }\n\n  SliverGridLayout? layoutCache;\n  double? crossAxisExtentCache;\n\n  @override\n  SliverGridLayout getLayout(SliverConstraints constraints) {\n    assert(_debugAssertIsValid(constraints.crossAxisExtent));\n    if (layoutCache != null &&\n        constraints.crossAxisExtent == crossAxisExtentCache) {\n      return layoutCache!;\n    }\n    crossAxisExtentCache = constraints.crossAxisExtent;\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 = max(1, crossAxisCount);\n    final double usableCrossAxisExtent = max(\n      0.0,\n      constraints.crossAxisExtent - crossAxisSpacing * (crossAxisCount - 1),\n    );\n    final double childCrossAxisExtent = usableCrossAxisExtent / crossAxisCount;\n    final double childMainAxisExtent =\n        mainAxisExtent ?? childCrossAxisExtent / childAspectRatio;\n    return layoutCache = SliverGridRegularTileLayout(\n      crossAxisCount: crossAxisCount,\n      mainAxisStride: childMainAxisExtent + mainAxisSpacing,\n      crossAxisStride: childCrossAxisExtent + crossAxisSpacing,\n      childMainAxisExtent: childMainAxisExtent,\n      childCrossAxisExtent: childCrossAxisExtent,\n      reverseCrossAxis: axisDirectionIsReversed(constraints.crossAxisDirection),\n    );\n  }\n\n  @override\n  bool shouldRelayout(SliverGridDelegateWithMaxCrossAxisExtent oldDelegate) {\n    final flag =\n        oldDelegate.maxCrossAxisExtent != maxCrossAxisExtent ||\n        oldDelegate.mainAxisSpacing != mainAxisSpacing ||\n        oldDelegate.crossAxisSpacing != crossAxisSpacing ||\n        oldDelegate.childAspectRatio != childAspectRatio ||\n        oldDelegate.mainAxisExtent != mainAxisExtent;\n    if (flag) layoutCache = null;\n    return flag;\n  }\n}\n"
  },
  {
    "path": "lib/utils/id_utils.dart",
    "content": "// ignore_for_file: constant_identifier_names, non_constant_identifier_names\n\nimport 'dart:convert';\n\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:uuid/v4.dart';\n\nabstract final class IdUtils {\n  static const XOR_CODE = 23442827791579;\n  static const MASK_CODE = 2251799813685247;\n  static const MAX_AID = 1 << 51;\n  static const BASE = 58;\n\n  static const data =\n      'FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf';\n  static final invData = {for (final (i, c) in data.codeUnits.indexed) c: i};\n\n  static final bvRegex = RegExp(r'bv1[0-9a-zA-Z]{9}', caseSensitive: false);\n  static final bvRegexExact = RegExp(\n    r'^bv1[0-9a-zA-Z]{9}$',\n    caseSensitive: false,\n  );\n  static final avRegex = RegExp(r'av(\\d+)', caseSensitive: false);\n  static final avRegexExact = RegExp(r'^av(\\d+)$', caseSensitive: false);\n  static final digitOnlyRegExp = RegExp(r'^\\d+$');\n\n  static void swap<T>(List<T> list, int idx1, int idx2) {\n    final idx1Value = list[idx1];\n    list[idx1] = list[idx2];\n    list[idx2] = idx1Value;\n  }\n\n  /// av转bv\n  static String av2bv(int aid) {\n    final bytes = ['B', 'V', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0'];\n    int bvIndex = bytes.length - 1;\n    int tmp = (MAX_AID | aid) ^ XOR_CODE;\n    while (tmp > 0) {\n      bytes[bvIndex--] = data[tmp % BASE];\n      tmp ~/= BASE;\n    }\n\n    swap(bytes, 3, 9);\n    swap(bytes, 4, 7);\n\n    return bytes.join();\n  }\n\n  /// bv转av\n  static int bv2av(String bvid) {\n    final bvidArr = bvid.codeUnits.sublist(3);\n\n    swap(bvidArr, 0, 6);\n    swap(bvidArr, 1, 4);\n\n    final tmp = bvidArr.fold(0, (pre, char) => pre * BASE + invData[char]!);\n    return (tmp & MASK_CODE) ^ XOR_CODE;\n  }\n\n  // 匹配\n  static AvBvRes matchAvorBv({String? input}) {\n    if (input == null || input.isEmpty) {\n      return const (av: null, bv: null);\n    }\n    String? bvid = bvRegex.firstMatch(input)?.group(0);\n\n    late String? aid = avRegex.firstMatch(input)?.group(1);\n\n    if (bvid != null) {\n      return (av: null, bv: bvid);\n    } else if (aid != null) {\n      return (av: int.parse(aid), bv: null);\n    }\n    return const (av: null, bv: null);\n  }\n\n  static String genBuvid3() {\n    return '${const UuidV4().generate().toUpperCase()}${Utils.random.nextInt(100000).toString().padLeft(5, \"0\")}infoc';\n  }\n\n  static String genAuroraEid(int uid) {\n    if (uid == 0) {\n      return '';\n    }\n\n    final midByte = ascii.encode(uid.toString());\n\n    const key = 'ad1va46a7lza';\n    for (int i = 0; i < midByte.length; i++) {\n      midByte[i] ^= key.codeUnitAt(i % key.length);\n    }\n\n    String base64Encoded = base64.encode(midByte).replaceAll('=', '');\n\n    return base64Encoded;\n  }\n\n  // https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/grpc_api/readme.md#x-bili-trace-id-生成算法\n  static String genTraceId() {\n    final randomTraceId = StringBuffer(Utils.generateRandomString(24));\n\n    final ts = (DateTime.now().millisecondsSinceEpoch ~/ 1000) >> 8;\n\n    randomTraceId\n      ..write((ts & 0xFFFFFF).toRadixString(16).padLeft(6, '0'))\n      ..write(Utils.generateRandomString(2));\n\n    return '${randomTraceId.toString()}:${randomTraceId.toString().substring(16, 32)}:0:0';\n  }\n}\n\ntypedef AvBvRes = ({int? av, String? bv});\n\nextension AvBvExt on AvBvRes {\n  bool get isNotEmpty => this != const (av: null, bv: null);\n}\n"
  },
  {
    "path": "lib/utils/image_utils.dart",
    "content": "import 'dart:io';\nimport 'dart:math' as math;\nimport 'dart:typed_data';\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/utils/extension/file_ext.dart';\nimport 'package:PiliPlus/utils/extension/string_ext.dart';\nimport 'package:PiliPlus/utils/global_data.dart';\nimport 'package:PiliPlus/utils/path_utils.dart';\nimport 'package:PiliPlus/utils/permission_handler.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:dio/dio.dart';\nimport 'package:file_picker/file_picker.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_cache_manager/flutter_cache_manager.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:intl/intl.dart' show DateFormat;\nimport 'package:live_photo_maker/live_photo_maker.dart';\nimport 'package:saver_gallery/saver_gallery.dart';\nimport 'package:share_plus/share_plus.dart';\n\nabstract final class ImageUtils {\n  static String get time =>\n      DateFormat('yyyy-MM-dd_HH-mm-ss').format(DateTime.now());\n  static bool silentDownImg = Pref.silentDownImg;\n  static const _androidRelativePath = 'Pictures/${Constants.appName}';\n\n  // 图片分享\n  static Future<void> onShareImg(String url) async {\n    try {\n      SmartDialog.showLoading();\n      final path = '$tmpDirPath/${Utils.getFileName(url)}';\n      final res = await Request().downloadFile(url.http2https, path);\n      SmartDialog.dismiss();\n      if (res.statusCode == 200) {\n        await SharePlus.instance\n            .share(\n              ShareParams(\n                files: [XFile(path)],\n                sharePositionOrigin: await Utils.sharePositionOrigin,\n              ),\n            )\n            .whenComplete(File(path).tryDel);\n      }\n    } catch (e) {\n      SmartDialog.showToast(e.toString());\n    }\n  }\n\n  // 获取存储权限\n  static Future<bool> requestPer() async {\n    final status = Platform.isAndroid\n        ? await Permission.storage.request()\n        : await Permission.photos.request();\n    if (status == PermissionStatus.denied ||\n        status == PermissionStatus.permanentlyDenied) {\n      SmartDialog.show(\n        builder: (context) => AlertDialog(\n          title: const Text('提示'),\n          content: const Text('存储权限未授权'),\n          actions: [\n            TextButton(\n              onPressed: () {\n                SmartDialog.dismiss();\n                openAppSettings();\n              },\n              child: const Text('去授权'),\n            ),\n          ],\n        ),\n      );\n      return false;\n    } else {\n      return true;\n    }\n  }\n\n  static Future<bool> checkPermissionDependOnSdkInt() async {\n    if (Platform.isAndroid) {\n      if (await Utils.sdkInt < 29) {\n        return requestPer();\n      } else {\n        return true;\n      }\n    }\n    return requestPer();\n  }\n\n  static Future<bool> downloadLivePhoto({\n    required String url,\n    required String liveUrl,\n    required int width,\n    required int height,\n  }) async {\n    try {\n      if (PlatformUtils.isMobile && !await checkPermissionDependOnSdkInt()) {\n        return false;\n      }\n      if (!silentDownImg) SmartDialog.showLoading(msg: '正在下载');\n\n      late String imageName = \"cover_${Utils.getFileName(url)}\";\n      late String imagePath = '$tmpDirPath/$imageName';\n      String videoName = \"video_${Utils.getFileName(liveUrl)}\";\n      String videoPath = '$tmpDirPath/$videoName';\n\n      final res = await Request().downloadFile(liveUrl.http2https, videoPath);\n      if (res.statusCode != 200) throw '${res.statusCode}';\n\n      if (Platform.isIOS) {\n        final res1 = await Request().downloadFile(url.http2https, imagePath);\n        if (res1.statusCode != 200) throw '${res1.statusCode}';\n        if (!silentDownImg) SmartDialog.showLoading(msg: '正在保存');\n        bool success =\n            await LivePhotoMaker.create(\n              coverImage: imagePath,\n              imagePath: null,\n              voicePath: videoPath,\n              width: width,\n              height: height,\n            ).whenComplete(\n              () {\n                File(videoPath).tryDel();\n                File(imagePath).tryDel();\n              },\n            );\n        if (success) {\n          SmartDialog.showToast(' 已保存 ');\n        } else {\n          SmartDialog.showToast('保存失败');\n          return false;\n        }\n      } else {\n        if (!silentDownImg) SmartDialog.showLoading(msg: '正在保存');\n        await saveFileImg(\n          filePath: videoPath,\n          fileName: videoName,\n          type: FileType.video,\n          needToast: true,\n        );\n      }\n      return true;\n    } catch (err) {\n      SmartDialog.showToast(err.toString());\n      return false;\n    } finally {\n      if (!silentDownImg) SmartDialog.dismiss(status: SmartStatus.loading);\n    }\n  }\n\n  static Future<bool> downloadImg(\n    List<String> imgList, [\n    CacheManager? manager,\n  ]) async {\n    if (PlatformUtils.isMobile && !await checkPermissionDependOnSdkInt()) {\n      return false;\n    }\n    CancelToken? cancelToken;\n    if (!silentDownImg) {\n      cancelToken = CancelToken();\n      SmartDialog.showLoading(\n        msg: '正在下载原图',\n        clickMaskDismiss: true,\n        onDismiss: cancelToken.cancel,\n      );\n    }\n    try {\n      final futures = imgList.map((url) async {\n        final name = Utils.getFileName(url);\n\n        final file = (await (manager ?? DefaultCacheManager()).getFileFromCache(\n          url.http2https,\n        ))?.file;\n\n        if (file == null) {\n          final String filePath = '$tmpDirPath/$name';\n          final response = await Request().downloadFile(\n            url.http2https,\n            filePath,\n            cancelToken: cancelToken,\n          );\n          return (\n            filePath: filePath,\n            name: name,\n            statusCode: response.statusCode,\n            del: true,\n          );\n        } else {\n          return (\n            filePath: file.path,\n            name: name,\n            statusCode: 200,\n            del: false,\n          );\n        }\n      });\n      final result = await Future.wait(futures, eagerError: true);\n      bool success = true;\n      if (PlatformUtils.isMobile) {\n        final delList = <String>[];\n        final saveList = <SaveFileData>[];\n        for (final i in result) {\n          if (i.del) delList.add(i.filePath);\n          if (i.statusCode == 200) {\n            saveList.add(\n              SaveFileData(\n                filePath: i.filePath,\n                fileName: i.name,\n                androidRelativePath: _androidRelativePath,\n              ),\n            );\n          } else {\n            success = false;\n          }\n        }\n        await SaverGallery.saveFiles(saveList, skipIfExists: false);\n        for (final i in delList) {\n          File(i).tryDel();\n        }\n      } else {\n        for (final res in result) {\n          if (res.statusCode == 200) {\n            await saveFileImg(\n              filePath: res.filePath,\n              fileName: res.name,\n              del: res.del,\n            );\n          } else {\n            success = false;\n          }\n        }\n      }\n      if (cancelToken?.isCancelled == true) {\n        SmartDialog.showToast('已取消下载');\n        return false;\n      } else {\n        SmartDialog.showToast(success ? ' 已保存 ' : '保存失败');\n      }\n      return success;\n    } catch (e) {\n      if (cancelToken?.isCancelled == true) {\n        SmartDialog.showToast('已取消下载');\n      } else {\n        SmartDialog.showToast(e.toString());\n      }\n      return false;\n    } finally {\n      if (!silentDownImg) SmartDialog.dismiss(status: SmartStatus.loading);\n    }\n  }\n\n  static final _suffixRegex = RegExp(\n    r'\\.(jpg|jpeg|png|webp|gif|avif)$',\n    caseSensitive: false,\n  );\n  static String safeThumbnailUrl(String? src) {\n    if (src != null && _suffixRegex.hasMatch(src)) {\n      return thumbnailUrl(src);\n    }\n    return src.http2https;\n  }\n\n  static final _thumbRegex = RegExp(\n    r'(@(\\d+[a-z]_?)*)(\\..*)?$',\n    caseSensitive: false,\n  );\n  static String thumbnailUrl(String? src, [int maxQuality = 1]) {\n    if (src != null && maxQuality != 100) {\n      maxQuality = math.max(maxQuality, GlobalData().imgQuality);\n      bool hasMatch = false;\n      src = src.splitMapJoin(\n        _thumbRegex,\n        onMatch: (match) {\n          hasMatch = true;\n          String suffix = match.group(3) ?? '.webp';\n          return '${match.group(1)}_${maxQuality}q$suffix';\n        },\n        onNonMatch: (String str) {\n          return str;\n        },\n      );\n      if (!hasMatch) {\n        src += '@${maxQuality}q.webp';\n      }\n    }\n    return src.http2https;\n  }\n\n  static Future<SaveResult?> saveByteImg({\n    required Uint8List bytes,\n    required String fileName,\n    String ext = 'png',\n  }) async {\n    SaveResult? res;\n    fileName += '.$ext';\n    if (PlatformUtils.isMobile) {\n      SmartDialog.showLoading(msg: '正在保存');\n      res = await SaverGallery.saveImage(\n        bytes,\n        fileName: fileName,\n        androidRelativePath: _androidRelativePath,\n        skipIfExists: false,\n      );\n      SmartDialog.dismiss();\n      if (res.isSuccess) {\n        SmartDialog.showToast(' 已保存 ');\n      } else {\n        SmartDialog.showToast('保存失败，${res.errorMessage}');\n      }\n    } else {\n      SmartDialog.dismiss();\n      final savePath = await FilePicker.saveFile(\n        type: FileType.image,\n        fileName: fileName,\n      );\n      if (savePath == null) {\n        SmartDialog.showToast(\"取消保存\");\n        return null;\n      }\n      await File(savePath).writeAsBytes(bytes);\n      SmartDialog.showToast(' 已保存 ');\n      res = SaveResult(true, null);\n    }\n    return res;\n  }\n\n  static Future<void> saveFileImg({\n    required String filePath,\n    required String fileName,\n    FileType type = FileType.image,\n    bool needToast = false,\n    bool del = true,\n  }) async {\n    final file = File(filePath);\n    if (!file.existsSync()) {\n      SmartDialog.showToast(\"文件不存在\");\n      return;\n    }\n    SaveResult? res;\n    if (PlatformUtils.isMobile) {\n      res = await SaverGallery.saveFile(\n        filePath: filePath,\n        fileName: fileName,\n        androidRelativePath: _androidRelativePath,\n        skipIfExists: false,\n      );\n      if (del) file.tryDel();\n    } else {\n      final savePath = await FilePicker.saveFile(\n        type: type,\n        fileName: fileName,\n      );\n      if (savePath == null) {\n        SmartDialog.showToast(\"取消保存\");\n        return;\n      }\n      await file.copy(savePath);\n      if (del) file.tryDel();\n      res = SaveResult(true, null);\n    }\n    if (needToast) {\n      if (res.isSuccess) {\n        SmartDialog.showToast(' 已保存 ');\n      } else {\n        SmartDialog.showToast('保存失败，${res.errorMessage}');\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "lib/utils/json_file_handler.dart",
    "content": "import 'dart:convert';\nimport 'dart:io';\n\nimport 'package:PiliPlus/services/logger.dart' show LoggerUtils;\nimport 'package:catcher_2/model/platform_type.dart';\nimport 'package:catcher_2/model/report.dart';\nimport 'package:catcher_2/model/report_handler.dart';\nimport 'package:flutter/material.dart';\n\nclass JsonFileHandler extends ReportHandler {\n  final bool enableDeviceParameters;\n  final bool enableApplicationParameters;\n  final bool enableStackTrace;\n  final bool enableCustomParameters;\n  final bool printLogs;\n  final bool handleWhenRejected;\n\n  static Future<RandomAccessFile> _future = LoggerUtils.getLogsPath()\n      .then((file) => file.open(mode: FileMode.writeOnlyAppend))\n      .then((raf) => raf.writeFrom(const []))\n      .then(_flush);\n\n  JsonFileHandler._({\n    this.enableDeviceParameters = true,\n    this.enableApplicationParameters = true,\n    this.enableStackTrace = true,\n    this.enableCustomParameters = true,\n    this.printLogs = false,\n    this.handleWhenRejected = false,\n  });\n\n  static Future<JsonFileHandler?> init({\n    bool enableDeviceParameters = true,\n    bool enableApplicationParameters = true,\n    bool enableStackTrace = true,\n    bool enableCustomParameters = true,\n    bool printLogs = false,\n    bool handleWhenRejected = false,\n  }) async {\n    try {\n      await _future;\n      return JsonFileHandler._(\n        enableDeviceParameters: enableDeviceParameters,\n        enableApplicationParameters: enableApplicationParameters,\n        enableStackTrace: enableStackTrace,\n        enableCustomParameters: enableCustomParameters,\n        printLogs: printLogs,\n        handleWhenRejected: handleWhenRejected,\n      );\n    } catch (e, s) {\n      debugPrintStack(stackTrace: s, label: e.toString());\n      return null;\n    }\n  }\n\n  static Future<RandomAccessFile> _flush(RandomAccessFile raf) => raf.flush();\n\n  static Future<RandomAccessFile> add(\n    Future<RandomAccessFile> Function(RandomAccessFile) onValue,\n  ) {\n    return _future = _future.then(onValue).then(_flush);\n  }\n\n  @override\n  Future<bool> handle(Report report, BuildContext? context) async {\n    try {\n      await _processReport(report);\n      return true;\n    } catch (exc, stackTrace) {\n      _printLog('Exception occurred: $exc stack: $stackTrace');\n      return false;\n    }\n  }\n\n  Future<void> _processReport(Report report) {\n    _printLog('Writing report to file');\n    final json = report.toJson(\n      enableDeviceParameters: enableDeviceParameters,\n      enableApplicationParameters: enableApplicationParameters,\n      enableStackTrace: enableStackTrace,\n      enableCustomParameters: enableCustomParameters,\n    );\n    return add((raf) => raf.writeString('${jsonEncode(json)}\\n'));\n  }\n\n  void _printLog(String log) {\n    if (printLogs) {\n      logger.info(log);\n    }\n  }\n\n  @override\n  List<PlatformType> getSupportedPlatforms() => const [\n    PlatformType.android,\n    PlatformType.iOS,\n    PlatformType.linux,\n    PlatformType.macOS,\n    PlatformType.windows,\n  ];\n\n  @override\n  bool shouldHandleWhenRejected() => handleWhenRejected;\n}\n"
  },
  {
    "path": "lib/utils/login_utils.dart",
    "content": "import 'dart:async' show FutureOr;\nimport 'dart:io' show Platform;\n\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/user.dart';\nimport 'package:PiliPlus/main.dart';\nimport 'package:PiliPlus/services/account_service.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/accounts/account.dart';\nimport 'package:PiliPlus/utils/request_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:collection/collection.dart';\nimport 'package:crypto/crypto.dart' show Digest;\nimport 'package:flutter_inappwebview/flutter_inappwebview.dart' as web;\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nabstract final class LoginUtils {\n  static FutureOr setWebCookie([Account? account]) {\n    if (Platform.isLinux) {\n      return null;\n    }\n    final cookies = (account ?? Accounts.main).cookieJar.toList();\n    final webManager = web.CookieManager.instance(\n      webViewEnvironment: webViewEnvironment,\n    );\n    final isWindows = Platform.isWindows;\n    return Future.wait(\n      cookies.map(\n        (cookie) => webManager.setCookie(\n          url: web.WebUri(\n            '${isWindows ? 'https://' : ''} ${cookie.domain}',\n          ),\n          name: cookie.name,\n          value: cookie.value,\n          path: cookie.path ?? '/',\n          domain: cookie.domain,\n          isSecure: cookie.secure,\n          isHttpOnly: cookie.httpOnly,\n        ),\n      ),\n    );\n  }\n\n  static Future<void> onLoginMain() async {\n    final account = Accounts.main;\n    final res = await UserHttp.userInfo();\n    if (res case Success(:final response)) {\n      setWebCookie(account);\n      RequestUtils.syncHistoryStatus();\n      if (response.isLogin == true) {\n        final accountService = Get.find<AccountService>()\n          ..face.value = response.face!;\n\n        if (accountService.isLogin.value) {\n          accountService.isLogin.refresh();\n        } else {\n          accountService.isLogin.value = true;\n        }\n\n        SmartDialog.showToast('main登录成功');\n        if (response != Pref.userInfoCache) {\n          await GStorage.userInfo.put('userInfoCache', response);\n        }\n      }\n    } else {\n      // 获取用户信息失败\n      await Accounts.deleteAll({account});\n      SmartDialog.showNotify(\n        msg: '登录失败，请检查cookie是否正确，${res.toString()}',\n        notifyType: NotifyType.warning,\n      );\n    }\n  }\n\n  static Future<void> onLogoutMain() {\n    Get.find<AccountService>()\n      ..face.value = ''\n      ..isLogin.value = false;\n\n    return Future.wait([\n      if (!Platform.isLinux)\n        web.CookieManager.instance(\n          webViewEnvironment: webViewEnvironment,\n        ).deleteAllCookies(),\n      GStorage.userInfo.delete('userInfoCache'),\n    ]);\n  }\n\n  static String generateBuvid() {\n    final md5Str = Digest(\n      List.generate(16, (_) => Utils.random.nextInt(256)),\n    ).toString();\n    return 'XY${md5Str[2]}${md5Str[12]}${md5Str[22]}$md5Str';\n  }\n\n  static final buvid = Pref.buvid;\n\n  // static String getUUID() {\n  //   return const Uuid().v4().replaceAll('-', '');\n  // }\n\n  // static String generateBuvid() {\n  //   String uuid = getUUID() + getUUID();\n  //   return 'XY${uuid.substring(0, 35).toUpperCase()}';\n  // }\n\n  static String genDeviceId() {\n    // https://github.com/bilive/bilive_client/blob/2873de0532c54832f5464a4c57325ad9af8b8698/bilive/lib/app_client.ts#L62\n    final time = DateTime.now();\n\n    final List<int> bytes = [\n      ...Iterable.generate(16, (_) => Utils.random.nextInt(256)),\n      _dec2bcd(time.year ~/ 100),\n      _dec2bcd(time.year % 100),\n      _dec2bcd(time.month),\n      _dec2bcd(time.day),\n      _dec2bcd(time.hour),\n      _dec2bcd(time.minute),\n      _dec2bcd(time.second),\n      ...Iterable.generate(8, (_) => Utils.random.nextInt(256)),\n    ];\n    final check = (bytes.sum & 0xFF).toRadixString(16).padLeft(2, '0');\n\n    return Digest(bytes).toString() + check;\n  }\n\n  static int _dec2bcd(int dec) {\n    assert(0 <= dec && dec < 100);\n    return ((dec ~/ 10) << 4) | (dec % 10);\n  }\n}\n"
  },
  {
    "path": "lib/utils/num_utils.dart",
    "content": "import 'package:PiliPlus/utils/extension/num_ext.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode, debugPrint;\n\nabstract final class NumUtils {\n  static final _numRegExp = RegExp(r'([\\d\\.]+)([千万亿])?');\n\n  static int _getUnit(String? unit) {\n    switch (unit) {\n      case '千':\n        return 1000;\n      case '万':\n        return 10000;\n      case '亿':\n        return 100000000;\n      default:\n        return 1;\n    }\n  }\n\n  static int parseNum(String numberStr) {\n    if (numberStr == '-') return 0;\n    try {\n      final match = _numRegExp.firstMatch(numberStr)!;\n      var number = double.parse(match.group(1)!);\n      number *= _getUnit(match.group(2));\n      return number.toInt();\n    } catch (e) {\n      if (kDebugMode) debugPrint('parse failed: \"$numberStr\" : $e');\n      return 0;\n    }\n  }\n\n  static String numFormat(dynamic number) {\n    if (number == null) {\n      return '0';\n    }\n    if (number is String) {\n      number = int.tryParse(number) ?? number;\n      if (number is String) {\n        return number;\n      }\n    }\n\n    String format(first, second) {\n      double result = ((number / first) as double).toPrecision(1);\n      int intRes = result.toInt();\n      if (result == intRes) {\n        return '$intRes$second';\n      } else {\n        return '$result$second';\n      }\n    }\n\n    if (number >= 100000000) {\n      return format(100000000, '亿');\n    } else if (number >= 10000) {\n      return format(10000, '万');\n    } else {\n      return number.toString();\n    }\n  }\n\n  static String formatPositiveDecimal(int number) {\n    if (number < 1000) return number.toString();\n\n    final numStr = number.toString();\n    final length = numStr.length;\n    final sb = StringBuffer();\n\n    int firstLength = length % 3;\n    if (firstLength == 0) firstLength = 3;\n\n    sb.write(numStr.substring(0, firstLength));\n    for (int i = firstLength; i < length; i += 3) {\n      sb\n        ..write(',')\n        ..write(numStr.substring(i, i + 3));\n    }\n\n    return sb.toString();\n  }\n}\n"
  },
  {
    "path": "lib/utils/page_utils.dart",
    "content": "import 'dart:math';\n\nimport 'package:PiliPlus/common/widgets/image_viewer/gallery_viewer.dart';\nimport 'package:PiliPlus/common/widgets/image_viewer/hero_dialog_route.dart';\nimport 'package:PiliPlus/grpc/im.dart';\nimport 'package:PiliPlus/http/dynamics.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/search.dart';\nimport 'package:PiliPlus/http/video.dart';\nimport 'package:PiliPlus/models/common/image_preview_type.dart';\nimport 'package:PiliPlus/models/common/video/video_type.dart';\nimport 'package:PiliPlus/models/dynamics/result.dart';\nimport 'package:PiliPlus/models_new/pgc/pgc_info_model/episode.dart';\nimport 'package:PiliPlus/pages/common/common_intro_controller.dart';\nimport 'package:PiliPlus/pages/common/publish/publish_route.dart';\nimport 'package:PiliPlus/pages/contact/view.dart';\nimport 'package:PiliPlus/pages/fav_panel/view.dart';\nimport 'package:PiliPlus/pages/share/view.dart';\nimport 'package:PiliPlus/utils/app_scheme.dart';\nimport 'package:PiliPlus/utils/extension/context_ext.dart';\nimport 'package:PiliPlus/utils/extension/extension.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:PiliPlus/utils/extension/size_ext.dart';\nimport 'package:PiliPlus/utils/extension/string_ext.dart';\nimport 'package:PiliPlus/utils/feed_back.dart';\nimport 'package:PiliPlus/utils/global_data.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/url_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:floating/floating.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:url_launcher/url_launcher.dart';\n\nabstract final class PageUtils {\n  static RelativeRect menuPosition(Offset offset) {\n    return .fromLTRB(offset.dx, offset.dy, offset.dx, 0);\n  }\n\n  static Future<void> imageView({\n    int initialPage = 0,\n    required List<SourceModel> imgList,\n    int? quality,\n    ValueChanged<int>? onPageChanged,\n    String tag = '',\n  }) {\n    return Get.key.currentState!.push<void>(\n      HeroDialogRoute(\n        pageBuilder: (context, animation, secondaryAnimation) => GalleryViewer(\n          sources: imgList,\n          initIndex: initialPage,\n          quality: quality ?? GlobalData().imgQuality,\n          onPageChanged: onPageChanged,\n          tag: tag,\n        ),\n      ),\n    );\n  }\n\n  static Future<void> pmShare(\n    BuildContext context, {\n    required Map content,\n  }) async {\n    // if (kDebugMode) debugPrint(content.toString());\n\n    List<UserModel> userList = <UserModel>[];\n\n    final res = await ImGrpc.shareList(size: 5);\n    if (res case Success(:final response)) {\n      if (response.sessionList.isNotEmpty) {\n        userList.addAll(\n          response.sessionList.map<UserModel>(\n            (item) => UserModel(\n              mid: item.talkerId.toInt(),\n              name: item.talkerUname,\n              avatar: item.talkerIcon,\n            ),\n          ),\n        );\n      }\n    }\n\n    if (userList.isEmpty && context.mounted) {\n      final UserModel? userModel = await Navigator.of(context).push(\n        GetPageRoute(page: () => const ContactPage()),\n      );\n      if (userModel != null) {\n        userList.add(userModel);\n      }\n    }\n\n    if (context.mounted) {\n      showModalBottomSheet(\n        context: context,\n        builder: (context) => SharePanel(\n          content: content,\n          userList: userList,\n        ),\n        useSafeArea: true,\n        enableDrag: false,\n        isScrollControlled: true,\n      );\n    }\n  }\n\n  static Future<void> pushDynFromId({\n    String? id,\n    Object? rid,\n    bool off = false,\n    Object? type,\n  }) async {\n    assert(id != null || rid != null);\n    SmartDialog.showLoading();\n    final res = await DynamicsHttp.dynamicDetail(\n      id: id,\n      rid: rid,\n      type: rid != null ? 2 : null,\n    );\n    SmartDialog.dismiss();\n    if (res case Success(:final response)) {\n      if (response.basic?.commentType == 12) {\n        toDupNamed(\n          '/articlePage',\n          parameters: {\n            'id': id!,\n            'type': 'opus',\n          },\n          off: off,\n        );\n      } else {\n        toDupNamed(\n          '/dynamicDetail',\n          arguments: {\n            'item': response,\n          },\n          off: off,\n        );\n      }\n    } else {\n      SmartDialog.showToast('${type != null ? 'type: $type ' : ''}$res');\n    }\n  }\n\n  static void showFavBottomSheet({\n    required BuildContext context,\n    required FavMixin ctr,\n  }) {\n    showModalBottomSheet(\n      context: context,\n      useSafeArea: true,\n      isScrollControlled: true,\n      constraints: BoxConstraints(\n        maxWidth: min(640, context.mediaQueryShortestSide),\n      ),\n      builder: (BuildContext context) {\n        final maxChildSize =\n            PlatformUtils.isMobile && !context.mediaQuerySize.isPortrait\n            ? 1.0\n            : 0.7;\n        return DraggableScrollableSheet(\n          minChildSize: 0,\n          maxChildSize: 1,\n          snap: true,\n          expand: false,\n          snapSizes: [maxChildSize],\n          initialChildSize: maxChildSize,\n          builder: (BuildContext context, ScrollController scrollController) {\n            return FavPanel(\n              ctr: ctr,\n              scrollController: scrollController,\n            );\n          },\n        );\n      },\n    );\n  }\n\n  static void reportVideo(int aid) {\n    Get.toNamed(\n      '/webview',\n      parameters: {'url': 'https://www.bilibili.com/appeal/?avid=$aid'},\n    );\n  }\n\n  static void enterPip({int? width, int? height, bool isAuto = false}) {\n    if (width != null && height != null) {\n      Rational aspectRatio = Rational(width, height);\n      aspectRatio = aspectRatio.fitsInAndroidRequirements\n          ? aspectRatio\n          : height > width\n          ? const Rational.vertical()\n          : const Rational.landscape();\n      Floating().enable(\n        isAuto\n            ? AutoEnable(aspectRatio: aspectRatio)\n            : EnableManual(aspectRatio: aspectRatio),\n      );\n    } else {\n      Floating().enable(isAuto ? const AutoEnable() : const EnableManual());\n    }\n  }\n\n  static Future<void> pushDynDetail(\n    DynamicItemModel item, {\n    bool isPush = false,\n  }) async {\n    feedBack();\n\n    void push() {\n      if (item.basic?.commentType == 12) {\n        toDupNamed(\n          '/articlePage',\n          parameters: {\n            'id': item.idStr,\n            'type': 'opus',\n          },\n        );\n      } else {\n        if (item.linkFolded) {\n          pushDynFromId(id: item.idStr);\n          return;\n        }\n        toDupNamed(\n          '/dynamicDetail',\n          arguments: {\n            'item': item,\n          },\n        );\n      }\n    }\n\n    /// 点击评论action 直接查看评论\n    if (isPush) {\n      push();\n      return;\n    }\n\n    // if (kDebugMode) debugPrint('pushDynDetail: ${item.type}');\n\n    switch (item.type) {\n      case 'DYNAMIC_TYPE_AV':\n        final archive = item.modules.moduleDynamic!.major!.archive!;\n        // pgc\n        if (archive.type == 2) {\n          // jumpUrl\n          if (archive.jumpUrl case final jumpUrl?) {\n            if (viewPgcFromUri(jumpUrl)) {\n              return;\n            }\n          }\n          // redirectUrl from intro\n          final res = await VideoHttp.videoIntro(bvid: archive.bvid!);\n          if (res.dataOrNull?.redirectUrl case final redirectUrl?) {\n            if (viewPgcFromUri(redirectUrl)) {\n              return;\n            }\n          }\n          // redirectUrl from jumpUrl\n          if (await UrlUtils.parseRedirectUrl(archive.jumpUrl.http2https, false)\n              case final redirectUrl?) {\n            if (viewPgcFromUri(redirectUrl)) {\n              return;\n            }\n          }\n        }\n\n        try {\n          String bvid = archive.bvid!;\n          String cover = archive.cover!;\n          int? cid = await SearchHttp.ab2c(bvid: bvid);\n          if (cid != null) {\n            toVideoPage(\n              bvid: bvid,\n              cid: cid,\n              cover: cover,\n            );\n          }\n        } catch (err) {\n          SmartDialog.showToast(err.toString());\n        }\n        break;\n\n      /// 专栏文章查看\n      case 'DYNAMIC_TYPE_ARTICLE':\n        toDupNamed(\n          '/articlePage',\n          parameters: {\n            'id': item.idStr,\n            'type': 'opus',\n          },\n        );\n        break;\n\n      case 'DYNAMIC_TYPE_PGC':\n        // if (kDebugMode) debugPrint('番剧');\n        SmartDialog.showToast('暂未支持的类型，请联系开发者');\n        break;\n\n      case 'DYNAMIC_TYPE_LIVE':\n        DynamicLive2Model liveRcmd = item.modules.moduleDynamic!.major!.live!;\n        toLiveRoom(liveRcmd.id);\n        break;\n\n      case 'DYNAMIC_TYPE_LIVE_RCMD':\n        DynamicLiveModel liveRcmd =\n            item.modules.moduleDynamic!.major!.liveRcmd!;\n        toLiveRoom(liveRcmd.roomId);\n        break;\n\n      case 'DYNAMIC_TYPE_SUBSCRIPTION_NEW':\n        LivePlayInfo live = item\n            .modules\n            .moduleDynamic!\n            .major!\n            .subscriptionNew!\n            .liveRcmd!\n            .content!\n            .livePlayInfo!;\n        toLiveRoom(live.roomId);\n        break;\n\n      /// 合集查看\n      case 'DYNAMIC_TYPE_UGC_SEASON':\n        DynamicArchiveModel ugcSeason =\n            item.modules.moduleDynamic!.major!.ugcSeason!;\n        int aid = ugcSeason.aid!;\n        String bvid = IdUtils.av2bv(aid);\n        String cover = ugcSeason.cover!;\n        int? cid = await SearchHttp.ab2c(bvid: bvid);\n        if (cid != null) {\n          toVideoPage(\n            aid: aid,\n            bvid: bvid,\n            cid: cid,\n            cover: cover,\n          );\n        }\n        break;\n\n      /// 番剧查看\n      case 'DYNAMIC_TYPE_PGC_UNION':\n        // if (kDebugMode) debugPrint('DYNAMIC_TYPE_PGC_UNION 番剧');\n        DynamicArchiveModel pgc = item.modules.moduleDynamic!.major!.pgc!;\n        if (pgc.epid != null) {\n          viewPgc(epId: pgc.epid);\n        }\n        break;\n\n      case 'DYNAMIC_TYPE_MEDIALIST':\n        if (item.modules.moduleDynamic?.major?.medialist\n            case final medialist?) {\n          final String? url = medialist.jumpUrl;\n          if (url != null) {\n            if (url.contains('medialist/detail/ml')) {\n              Get.toNamed(\n                '/favDetail',\n                parameters: {\n                  'heroTag': '${medialist.cover}',\n                  'mediaId': '${medialist.id}',\n                },\n              );\n            } else {\n              handleWebview(url.http2https);\n            }\n          }\n        }\n        break;\n\n      case 'DYNAMIC_TYPE_COURSES_SEASON':\n        PageUtils.viewPugv(\n          seasonId: item.modules.moduleDynamic!.major!.courses!.id,\n        );\n        break;\n\n      // 纯文字动态查看\n      // case 'DYNAMIC_TYPE_WORD':\n      // # 装扮/剧集点评/普通分享\n      // case 'DYNAMIC_TYPE_COMMON_SQUARE':\n      // 转发的动态\n      // case 'DYNAMIC_TYPE_FORWARD':\n      // 图文动态查看\n      // case 'DYNAMIC_TYPE_DRAW':\n      default:\n        push();\n        break;\n    }\n  }\n\n  static void onHorizontalPreviewState(\n    ScaffoldState state,\n    List<SourceModel> imgList,\n    int index,\n  ) {\n    state.showBottomSheet(\n      constraints: const BoxConstraints(),\n      (context) => GalleryViewer(\n        sources: imgList,\n        initIndex: index,\n        quality: GlobalData().imgQuality,\n      ),\n      enableDrag: false,\n      elevation: 0.0,\n      backgroundColor: Colors.transparent,\n      sheetAnimationStyle: AnimationStyle.noAnimation,\n    );\n  }\n\n  static void inAppWebview(\n    String url, {\n    bool off = false,\n  }) {\n    if (Pref.openInBrowser) {\n      launchURL(url);\n    } else {\n      if (off) {\n        Get.offNamed(\n          '/webview',\n          parameters: {'url': url},\n          arguments: {'inApp': true},\n        );\n      } else {\n        Get.toNamed(\n          '/webview',\n          parameters: {'url': url},\n          arguments: {'inApp': true},\n        );\n      }\n    }\n  }\n\n  static Future<void> launchURL(\n    String url, {\n    LaunchMode mode = LaunchMode.externalApplication,\n  }) async {\n    try {\n      final Uri uri = Uri.parse(url);\n      if (!await launchUrl(uri, mode: mode)) {\n        SmartDialog.showToast('Could not launch $url');\n      }\n    } catch (e) {\n      SmartDialog.showToast(e.toString());\n    }\n  }\n\n  static Future<void> handleWebview(\n    String url, {\n    bool off = false,\n    bool inApp = false,\n    Map? parameters,\n  }) async {\n    if (!inApp && Pref.openInBrowser) {\n      if (!await PiliScheme.routePushFromUrl(url, selfHandle: true)) {\n        launchURL(url);\n      }\n    } else {\n      if (off) {\n        Get.offNamed(\n          '/webview',\n          parameters: {\n            'url': url,\n            ...?parameters,\n          },\n        );\n      } else {\n        PiliScheme.routePushFromUrl(url, parameters: parameters);\n      }\n    }\n  }\n\n  static Future<void>? showVideoBottomSheet(\n    BuildContext context, {\n    required Widget child,\n    required ValueGetter<bool> isFullScreen,\n    double? padding,\n  }) {\n    if (!context.mounted) {\n      return null;\n    }\n    return Get.key.currentState!.push(\n      PublishRoute(\n        pageBuilder: (context, animation, secondaryAnimation) {\n          if (context.isPortrait) {\n            return SafeArea(\n              child: FractionallySizedBox(\n                heightFactor: 0.7,\n                widthFactor: 1.0,\n                alignment: Alignment.bottomCenter,\n                child: isFullScreen() && padding != null\n                    ? Padding(\n                        padding: EdgeInsets.only(bottom: padding),\n                        child: child,\n                      )\n                    : child,\n              ),\n            );\n          }\n          return SafeArea(\n            child: FractionallySizedBox(\n              widthFactor: 0.5,\n              heightFactor: 1.0,\n              alignment: Alignment.centerRight,\n              child: child,\n            ),\n          );\n        },\n        transitionDuration: const Duration(milliseconds: 350),\n        transitionBuilder: (context, animation, secondaryAnimation, child) {\n          final begin = context.isPortrait\n              ? const Offset(0.0, 1.0)\n              : const Offset(1.0, 0.0);\n          return SlideTransition(\n            position: animation.drive(\n              Tween<Offset>(\n                begin: begin,\n                end: Offset.zero,\n              ).chain(CurveTween(curve: Curves.easeInOut)),\n            ),\n            child: child,\n          );\n        },\n        settings: RouteSettings(arguments: Get.arguments),\n      ),\n    );\n  }\n\n  static void toLiveRoom(\n    int? roomId, {\n    bool off = false,\n  }) {\n    if (roomId == null) {\n      return;\n    }\n    if (off) {\n      Get.offNamed('/liveRoom', arguments: roomId);\n    } else {\n      Get.toNamed('/liveRoom', arguments: roomId);\n    }\n  }\n\n  static Future<void>? toVideoPage({\n    VideoType videoType = VideoType.ugc,\n    int? aid,\n    String? bvid,\n    required int cid,\n    int? seasonId,\n    int? epId,\n    int? pgcType,\n    String? cover,\n    String? title,\n    int? progress, // milliseconds\n    Map? extraArguments,\n    bool off = false,\n  }) {\n    final arguments = {\n      'aid': aid ?? IdUtils.bv2av(bvid!),\n      'bvid': bvid ?? IdUtils.av2bv(aid!),\n      'cid': cid,\n      'seasonId': ?seasonId,\n      'epId': ?epId,\n      'pgcType': ?pgcType,\n      'cover': ?cover,\n      'title': ?title,\n      'progress': ?progress,\n      'videoType': videoType,\n      'heroTag': Utils.makeHeroTag(cid),\n      ...?extraArguments,\n    };\n    if (off) {\n      return Get.offNamed(\n        '/videoV',\n        arguments: arguments,\n        preventDuplicates: false,\n      );\n    } else {\n      return Get.toNamed(\n        '/videoV',\n        arguments: arguments,\n        preventDuplicates: false,\n      );\n    }\n  }\n\n  static final _pgcRegex = RegExp(r'(ep|ss)(\\d+)');\n  static bool viewPgcFromUri(\n    String uri, {\n    bool isPgc = true,\n    int? progress, // milliseconds\n    int? aid,\n    bool off = false,\n  }) {\n    RegExpMatch? match = _pgcRegex.firstMatch(uri);\n    if (match != null) {\n      bool isSeason = match.group(1) == 'ss';\n      String id = match.group(2)!;\n      if (isPgc) {\n        viewPgc(\n          seasonId: isSeason ? id : null,\n          epId: isSeason ? null : id,\n          progress: progress,\n          off: off,\n        );\n      } else {\n        viewPugv(\n          seasonId: isSeason ? id : null,\n          epId: isSeason ? null : id,\n          aid: aid,\n          off: off,\n        );\n      }\n      return true;\n    }\n    return false;\n  }\n\n  static EpisodeItem findEpisode(\n    List<EpisodeItem> episodes, {\n    dynamic epId,\n    bool isPgc = true,\n  }) {\n    // epId episode -> progress episode -> first episode\n    EpisodeItem? episode;\n    if (epId != null) {\n      epId = epId.toString();\n      episode = episodes.firstWhereOrNull(\n        (item) => (isPgc ? item.epId : item.id).toString() == epId,\n      );\n    }\n    return episode ?? episodes.first;\n  }\n\n  static Future<void> viewPgc({\n    dynamic seasonId,\n    dynamic epId,\n    int? progress, // milliseconds\n    bool off = false,\n  }) async {\n    try {\n      SmartDialog.showLoading(msg: '资源获取中');\n      final res = await SearchHttp.pgcInfo(seasonId: seasonId, epId: epId);\n      SmartDialog.dismiss();\n      if (res case Success(:final response)) {\n        final episodes = response.episodes;\n        final hasEpisode = episodes != null && episodes.isNotEmpty;\n\n        EpisodeItem? episode;\n\n        void viewSection(EpisodeItem episode) {\n          toVideoPage(\n            videoType: VideoType.ugc,\n            bvid: episode.bvid!,\n            cid: episode.cid!,\n            seasonId: response.seasonId,\n            epId: episode.epId,\n            cover: episode.cover,\n            progress: progress,\n            extraArguments: {\n              'pgcApi': true,\n              'pgcItem': response,\n            },\n            off: off,\n          );\n        }\n\n        if (epId != null) {\n          epId = epId.toString();\n          if (hasEpisode) {\n            episode = episodes.firstWhereOrNull(\n              (item) => item.epId.toString() == epId,\n            );\n          }\n\n          // find section\n          if (episode == null) {\n            final sections = response.section;\n            if (sections != null && sections.isNotEmpty) {\n              for (final section in sections) {\n                final episodes = section.episodes;\n                if (episodes != null && episodes.isNotEmpty) {\n                  for (final episode in episodes) {\n                    if (episode.epId.toString() == epId) {\n                      // view as ugc\n                      viewSection(episode);\n                      return;\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n\n        if (hasEpisode) {\n          episode ??= findEpisode(\n            episodes,\n            epId: response.userStatus?.progress?.lastEpId,\n          );\n          toVideoPage(\n            videoType: VideoType.pgc,\n            bvid: episode.bvid!,\n            cid: episode.cid!,\n            seasonId: response.seasonId,\n            epId: episode.epId,\n            pgcType: response.type,\n            cover: episode.cover,\n            progress: progress,\n            extraArguments: {\n              'pgcItem': response,\n            },\n            off: off,\n          );\n          return;\n        } else {\n          episode ??= response.section?.firstOrNull?.episodes?.firstOrNull;\n          if (episode != null) {\n            viewSection(episode);\n            return;\n          }\n        }\n\n        SmartDialog.showToast('资源加载失败');\n      } else {\n        res.toast();\n      }\n    } catch (e) {\n      SmartDialog.dismiss();\n      SmartDialog.showToast('$e');\n      if (kDebugMode) debugPrint('$e');\n    }\n  }\n\n  static Future<void> viewPugv({\n    dynamic seasonId,\n    dynamic epId,\n    int? aid,\n    bool off = false,\n  }) async {\n    try {\n      SmartDialog.showLoading(msg: '资源获取中');\n      final res = await SearchHttp.pugvInfo(seasonId: seasonId, epId: epId);\n      SmartDialog.dismiss();\n      if (res case Success(:final response)) {\n        final episodes = response.episodes;\n        if (episodes != null && episodes.isNotEmpty) {\n          EpisodeItem? episode;\n          if (aid != null) {\n            episode = episodes.firstWhereOrNull((e) => e.aid == aid);\n          }\n          episode ??= findEpisode(\n            episodes,\n            epId: epId ?? response.userStatus?.progress?.lastEpId,\n            isPgc: false,\n          );\n          toVideoPage(\n            videoType: VideoType.pugv,\n            aid: episode.aid!,\n            cid: episode.cid!,\n            seasonId: response.seasonId,\n            epId: episode.id,\n            cover: episode.cover,\n            extraArguments: {\n              'pgcItem': response,\n            },\n            off: off,\n          );\n        } else {\n          SmartDialog.showToast('资源加载失败');\n        }\n      } else {\n        res.toast();\n      }\n    } catch (e) {\n      SmartDialog.dismiss();\n      SmartDialog.showToast(e.toString());\n    }\n  }\n\n  static void toDupNamed(\n    String page, {\n    dynamic arguments,\n    Map<String, String>? parameters,\n    bool off = false,\n  }) {\n    if (off) {\n      Get.offNamed(\n        page,\n        arguments: arguments,\n        parameters: parameters,\n        preventDuplicates: false,\n      );\n    } else {\n      Get.toNamed(\n        page,\n        arguments: arguments,\n        parameters: parameters,\n        preventDuplicates: false,\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "lib/utils/parse_string.dart",
    "content": "String? noneNullOrEmptyString(String? value) {\n  if (value == null || value.isEmpty) return null;\n  return value;\n}\n"
  },
  {
    "path": "lib/utils/path_utils.dart",
    "content": "import 'dart:io' show Platform;\n\nimport 'package:path/path.dart' as path;\n\nlate final String tmpDirPath;\n\nlate final String appSupportDirPath;\n\nlate String downloadPath;\n\nString get defDownloadPath =>\n    path.join(appSupportDirPath, PathUtils.downloadDir);\n\nabstract final class PathUtils {\n  static const videoNameType1 = '0.mp4';\n  static const _fileExt = '.m4s';\n  static const audioNameType2 = 'audio$_fileExt';\n  static const videoNameType2 = 'video$_fileExt';\n  static const coverName = 'cover.jpg';\n  static const danmakuName = 'danmaku.pb';\n  static const downloadDir = 'download';\n\n  static String buildShadersAbsolutePath(\n    String baseDirectory,\n    List<String> shaders,\n  ) {\n    return shaders\n        .map((shader) => path.join(baseDirectory, shader))\n        .join(Platform.isWindows ? ';' : ':');\n  }\n}\n"
  },
  {
    "path": "lib/utils/permission_handler.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:permission_handler_platform_interface/permission_handler_platform_interface.dart';\n\nexport 'package:permission_handler_platform_interface/permission_handler_platform_interface.dart'\n    show\n        Permission,\n        PermissionStatus,\n        PermissionStatusGetters,\n        PermissionWithService,\n        FuturePermissionStatusGetters,\n        ServiceStatus,\n        ServiceStatusGetters,\n        FutureServiceStatusGetters;\n\nPermissionHandlerPlatform get _handler => PermissionHandlerPlatform.instance;\n\n/// Opens the app settings page.\n///\n/// Returns [true] if the app settings page could be opened, otherwise [false].\nFuture<bool> openAppSettings() => _handler.openAppSettings();\n\n/// Actions that can be executed on a permission.\nextension PermissionActions on Permission {\n  /// Callback for when permission is denied.\n  static VoidCallback? _onDenied;\n\n  /// Callback for when permission is granted.\n  static VoidCallback? _onGranted;\n\n  /// Callback for when permission is permanently denied.\n  static VoidCallback? _onPermanentlyDenied;\n\n  /// Callback for when permission is restricted.\n  static VoidCallback? _onRestricted;\n\n  /// Callback for when permission is limited.\n  static VoidCallback? _onLimited;\n\n  /// Callback for when permission is Provisional.\n  static VoidCallback? _onProvisional;\n\n  /// Method to set a callback for when permission is denied.\n  void onDeniedCallback(VoidCallback? callback) {\n    _onDenied = callback;\n  }\n\n  /// Method to set a callback for when permission is granted.\n  void onGrantedCallback(VoidCallback? callback) {\n    _onGranted = callback;\n  }\n\n  /// Method to set a callback for when permission is permanently denied.\n  void onPermanentlyDeniedCallback(VoidCallback? callback) {\n    _onPermanentlyDenied = callback;\n  }\n\n  /// Method to set a callback for when permission is restricted.\n  void onRestrictedCallback(VoidCallback? callback) {\n    _onRestricted = callback;\n  }\n\n  /// Method to set a callback for when permission is limited.\n  void onLimitedCallback(VoidCallback? callback) {\n    _onLimited = callback;\n  }\n\n  /// Method to set a callback for when permission is provisional.\n  void onProvisionalCallback(VoidCallback? callback) {\n    _onProvisional = callback;\n  }\n\n  /// Checks the current status of the given [Permission].\n  ///\n  /// Notes about specific permissions:\n  /// - **[Permission.bluetooth]**\n  ///   - iOS 13.0 only:\n  ///     - The method will **always** return [PermissionStatus.denied],\n  ///       regardless of the actual status. For the actual permission state,\n  ///       use [Permission.bluetooth.request]. Note that this will show a\n  ///       permission dialog if the permission was not yet requested.\n  Future<PermissionStatus> get status => _handler.checkPermissionStatus(this);\n\n  /// If you should show a rationale for requesting permission.\n  ///\n  /// This is only implemented on Android, calling this on iOS always returns\n  /// [false].\n  FutureOr<bool> get shouldShowRequestRationale {\n    if (!Platform.isAndroid) {\n      return false;\n    }\n\n    return _handler.shouldShowRequestPermissionRationale(this);\n  }\n\n  /// Request the user for access to this [Permission], if access hasn't already\n  /// been grant access before.\n  ///\n  /// Returns the new [PermissionStatus].\n  Future<PermissionStatus> request() async {\n    final permissionStatus =\n        (await [this].request())[this] ?? PermissionStatus.denied;\n\n    (switch (permissionStatus) {\n      .denied => _onDenied,\n      .granted => _onGranted,\n      .restricted => _onRestricted,\n      .limited => _onLimited,\n      .permanentlyDenied => _onPermanentlyDenied,\n      .provisional => _onProvisional,\n    })?.call();\n\n    return permissionStatus;\n  }\n}\n\n/// Shortcuts for checking the [status] of a [Permission].\nextension PermissionCheckShortcuts on Permission {\n  /// If the user granted this permission.\n  Future<bool> get isGranted => status.isGranted;\n\n  /// If the user denied this permission.\n  Future<bool> get isDenied => status.isDenied;\n\n  /// If the OS denied this permission. The user cannot change the status,\n  /// possibly due to active restrictions such as parental controls being in\n  /// place.\n  /// *Only supported on iOS.*\n  Future<bool> get isRestricted => status.isRestricted;\n\n  /// User has authorized this application for limited access.\n  /// *Only supported on iOS.(iOS14+ for photos, ios18+ for contacts)*\n  Future<bool> get isLimited => status.isLimited;\n\n  /// Returns `true` when permissions are denied permanently.\n  ///\n  /// When permissions are denied permanently, no new permission dialog will\n  /// be showed to the user. Consuming Apps should redirect the user to the\n  /// App settings to change permissions.\n  Future<bool> get isPermanentlyDenied => status.isPermanentlyDenied;\n\n  /// If the application is provisionally authorized to post noninterruptive user notifications.\n  /// *Only supported on iOS.*\n  Future<bool> get isProvisional => status.isProvisional;\n}\n\n/// Actions that apply only to permissions that have an associated service.\nextension ServicePermissionActions on PermissionWithService {\n  /// Checks the current status of the service associated with the given\n  /// [Permission].\n  ///\n  /// Notes about specific permissions:\n  /// - **[Permission.phone]**\n  ///   - Android:\n  ///     - The method will return [ServiceStatus.notApplicable] when:\n  ///       - the device lacks the TELEPHONY feature\n  ///       - TelephonyManager.getPhoneType() returns PHONE_TYPE_NONE\n  ///       - when no Intents can be resolved to handle the `tel:` scheme\n  ///     - The method will return [ServiceStatus.disabled] when:\n  ///       - the SIM card is missing\n  ///   - iOS:\n  ///     - The method will return [ServiceStatus.notApplicable] when:\n  ///       - the native code can not find a handler for the `tel:` scheme\n  ///     - The method will return [ServiceStatus.disabled] when:\n  ///       - the mobile network code (MNC) is either 0 or 65535. See\n  ///          https://stackoverflow.com/a/11595365 for details\n  ///   - **PLEASE NOTE that this is still not a perfect indication** of the\n  ///     device's capability to place & connect phone calls as it also depends\n  ///     on the network condition.\n  /// - **[Permission.bluetooth]**\n  ///   - iOS:\n  ///     - The method will **always** return [ServiceStatus.disabled] when the\n  ///       Bluetooth permission was denied by the user. It is impossible to\n  ///       obtain the actual Bluetooth service status without having the\n  ///       Bluetooth permission granted.\n  ///     - The method will prompt the user for Bluetooth permission if the\n  ///       permission was not yet requested.\n  Future<ServiceStatus> get serviceStatus => _handler.checkServiceStatus(this);\n}\n\n/// Actions that can be taken on a [List] of [Permission]s.\nextension PermissionListActions on List<Permission> {\n  /// Requests the user for access to these permissions, if they haven't already\n  /// been granted before.\n  ///\n  /// Returns a [Map] containing the status per requested [Permission].\n  Future<Map<Permission, PermissionStatus>> request() =>\n      _handler.requestPermissions(this);\n}\n"
  },
  {
    "path": "lib/utils/platform_utils.dart",
    "content": "import 'dart:io' show Platform;\n\nabstract final class PlatformUtils {\n  @pragma(\"vm:platform-const\")\n  static final bool isMobile = Platform.isAndroid || Platform.isIOS;\n\n  @pragma(\"vm:platform-const\")\n  static final bool isDesktop =\n      Platform.isWindows || Platform.isMacOS || Platform.isLinux;\n}\n"
  },
  {
    "path": "lib/utils/recommend_filter.dart",
    "content": "import 'package:PiliPlus/models/model_video.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\n\nabstract final class RecommendFilter {\n  static int minDurationForRcmd = Pref.minDurationForRcmd;\n  static int minPlayForRcmd = Pref.minPlayForRcmd;\n  static int minLikeRatioForRecommend = Pref.minLikeRatioForRecommend;\n  static bool exemptFilterForFollowed = Pref.exemptFilterForFollowed;\n  static bool applyFilterToRelatedVideos = Pref.applyFilterToRelatedVideos;\n  static RegExp rcmdRegExp = RegExp(\n    Pref.banWordForRecommend,\n    caseSensitive: false,\n  );\n  static bool enableFilter = rcmdRegExp.pattern.isNotEmpty;\n\n  static bool filter(BaseVideoItemModel videoItem) {\n    //由于相关视频中没有已关注标签，只能视为非关注视频\n    if (videoItem.isFollowed && exemptFilterForFollowed) {\n      return false;\n    }\n    return filterAll(videoItem);\n  }\n\n  static bool filterLikeRatio(int? like, int? view) {\n    if (view != null) {\n      return (view > -1 && view < minPlayForRcmd) ||\n          (like != null &&\n              like > -1 &&\n              like * 100 < minLikeRatioForRecommend * view);\n    }\n    return false;\n  }\n\n  static bool filterTitle(String title) {\n    return (enableFilter && rcmdRegExp.hasMatch(title));\n  }\n\n  static bool filterAll(BaseVideoItemModel videoItem) {\n    return (videoItem.duration > 0 &&\n            videoItem.duration < minDurationForRcmd) ||\n        filterLikeRatio(videoItem.stat.like, videoItem.stat.view) ||\n        filterTitle(videoItem.title);\n  }\n}\n"
  },
  {
    "path": "lib/utils/reply_utils.dart",
    "content": "import 'dart:convert' show jsonEncode;\nimport 'dart:io' show Platform;\n\nimport 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'\n    show ReplyInfo;\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/reply.dart';\nimport 'package:PiliPlus/models/common/reply/reply_sort_type.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/accounts/account.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\n\nabstract final class ReplyUtils {\n  static void onCheckReply({\n    required ReplyInfo replyInfo,\n    required bool biliSendCommAntifraud,\n    required sourceId,\n    required bool isManual,\n  }) {\n    try {\n      _checkReply(\n        oid: replyInfo.oid.toInt(),\n        type: replyInfo.type.toInt(),\n        id: replyInfo.id.toInt(),\n        message: replyInfo.content.message,\n        //\n        root: replyInfo.root.toInt(),\n        parent: replyInfo.parent.toInt(),\n        ctime: replyInfo.ctime.toInt(),\n        pictures: replyInfo.content.pictures\n            .map((item) => item.toProto3Json())\n            .toList(),\n        mid: replyInfo.mid.toInt(),\n        //\n        isManual: isManual,\n        biliSendCommAntifraud: biliSendCommAntifraud,\n        sourceId: sourceId,\n      );\n    } catch (e) {\n      SmartDialog.showToast(e.toString());\n    }\n  }\n\n  // ref https://github.com/freedom-introvert/biliSendCommAntifraud\n  static Future<void> _checkReply({\n    required int oid,\n    required int type,\n    required int id,\n    required String message,\n    dynamic root,\n    dynamic parent,\n    dynamic ctime,\n    List? pictures,\n    dynamic mid,\n    bool isManual = false,\n    required bool biliSendCommAntifraud,\n    required sourceId,\n  }) async {\n    // biliSendCommAntifraud\n    if (Platform.isAndroid && biliSendCommAntifraud) {\n      try {\n        final String cookieString = Accounts.main.cookieJar\n            .toJson()\n            .entries\n            .map((i) => '${i.key}=${i.value}')\n            .join(';');\n        Utils.channel.invokeMethod(\n          'biliSendCommAntifraud',\n          {\n            'action': 0,\n            'oid': oid,\n            'type': type,\n            'rpid': id,\n            'root': root,\n            'parent': parent,\n            'ctime': ctime,\n            'comment_text': message,\n            if (pictures?.isNotEmpty == true) 'pictures': jsonEncode(pictures),\n            'source_id': '$sourceId',\n            'uid': mid,\n            'cookies': [cookieString],\n          },\n        );\n      } catch (e) {\n        if (kDebugMode) debugPrint('biliSendCommAntifraud: $e');\n      }\n      return;\n    }\n\n    // CommAntifraud\n    if (!isManual) {\n      await Future.delayed(const Duration(seconds: 8));\n    }\n    void showReplyCheckResult(String message, {bool isBan = false}) {\n      final actions = [\n        if (isBan)\n          TextButton(\n            onPressed: () {\n              Get.back();\n              String? uri;\n              switch (type) {\n                case 1:\n                  uri = IdUtils.av2bv(oid);\n                case 17:\n                  uri = 'https://www.bilibili.com/opus/$oid';\n              }\n              if (uri != null) {\n                Utils.copyText(uri);\n              }\n              Get.toNamed(\n                '/webview',\n                parameters: {\n                  'url':\n                      'https://www.bilibili.com/h5/comment/appeal?${Utils.themeUrl(Get.isDarkMode)}',\n                },\n              );\n            },\n            child: const Text('申诉'),\n          ),\n        if (!isManual)\n          TextButton(\n            onPressed: Get.back,\n            child: Text(\n              '关闭',\n              style: TextStyle(color: Get.theme.colorScheme.outline),\n            ),\n          ),\n      ];\n      showDialog(\n        context: Get.context!,\n        barrierDismissible: isManual,\n        builder: (context) => AlertDialog(\n          title: const Text('评论检查结果'),\n          content: SelectableText(message),\n          actions: actions.isEmpty ? null : actions,\n        ),\n      );\n    }\n\n    // root reply\n    if (root == 0) {\n      // no cookie check\n      final res = await ReplyHttp.replyList(\n        isLogin: false,\n        oid: oid,\n        nextOffset: '',\n        type: type,\n        sort: ReplySortType.time.index,\n        page: 1,\n      );\n\n      if (res case Error(:final errMsg)) {\n        SmartDialog.showToast('获取评论主列表时发生错误：$errMsg');\n        return;\n      } else if (res case Success(:final response)) {\n        final index =\n            response.replies?.indexWhere((item) => item.rpid == id) ?? -1;\n        if (index != -1) {\n          // found\n          showReplyCheckResult('无账号状态下找到了你的评论，评论正常！\\n\\n你的评论：$message');\n        } else {\n          // not found\n\n          // cookie check\n          final res1 = await ReplyHttp.replyReplyList(\n            isLogin: true,\n            oid: oid,\n            root: id,\n            pageNum: 1,\n            type: type,\n          );\n\n          if (res1 is Error) {\n            // not found\n            showReplyCheckResult('无法找到你的评论。\\n\\n你的评论：$message', isBan: true);\n          } else {\n            // found\n\n            // no cookie check\n            final res2 = await ReplyHttp.replyReplyList(\n              isLogin: false,\n              oid: oid,\n              root: id,\n              pageNum: 1,\n              type: type,\n              isCheck: true,\n            );\n\n            if (res2 is Error) {\n              // not found\n              showReplyCheckResult(\n                res2.errMsg?.startsWith('12022') == true\n                    ? '你的评论被shadow ban（仅自己可见）！\\n\\n你的评论: $message'\n                    : '评论不可见(${res2.errMsg}): $message',\n                isBan: true,\n              );\n            } else {\n              // found\n              showReplyCheckResult(\n                isManual\n                    ? '无账号状态下找到了你的评论，评论正常！\\n\\n你的评论：$message'\n                    : '''\n你评论状态有点可疑，虽然无账号翻找评论区获取不到你的评论，但是无账号可通过\nhttps://api.bilibili.com/x/v2/reply/reply?oid=$oid&pn=1&ps=20&root=$id&type=$type\n获取你的评论，疑似评论区被戒严或者这是你的视频。\n\n你的评论：$message''',\n              );\n            }\n          }\n        }\n      }\n    } else {\n      for (int i = 1; ; i++) {\n        final res3 = await ReplyHttp.replyReplyList(\n          isLogin: false,\n          oid: oid,\n          root: root,\n          pageNum: i,\n          type: type,\n          isCheck: true,\n        );\n        if (res3 is Error) {\n          break;\n        } else {\n          final data = res3.data;\n          if (data.replies.isNullOrEmpty) {\n            break;\n          }\n          int index = data.replies?.indexWhere((item) => item.rpid == id) ?? -1;\n          if (index == -1) {\n            // not found\n          } else {\n            // found\n            showReplyCheckResult('无账号状态下找到了你的评论，评论正常！\\n\\n你的评论：$message');\n            return;\n          }\n        }\n      }\n\n      for (int i = 1; ; i++) {\n        final res4 = await ReplyHttp.replyReplyList(\n          isLogin: true,\n          oid: oid,\n          root: root,\n          pageNum: i,\n          type: type,\n          isCheck: true,\n        );\n        if (res4 is Error) {\n          break;\n        } else {\n          final data = res4.data;\n          if (data.replies.isNullOrEmpty) {\n            break;\n          }\n          int index = data.replies?.indexWhere((item) => item.rpid == id) ?? -1;\n          if (index == -1) {\n            // not found\n          } else {\n            // found\n            showReplyCheckResult(\n              '你的评论被shadow ban（仅自己可见）！\\n\\n你的评论: $message',\n              isBan: true,\n            );\n            return;\n          }\n        }\n      }\n\n      showReplyCheckResult('评论不可见: $message', isBan: true);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/utils/request_utils.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\nimport 'dart:io';\nimport 'dart:math';\n\nimport 'package:PiliPlus/grpc/bilibili/im/type.pbenum.dart';\nimport 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'\n    show ReplyInfo;\nimport 'package:PiliPlus/grpc/im.dart';\nimport 'package:PiliPlus/http/dynamics.dart';\nimport 'package:PiliPlus/http/fav.dart';\nimport 'package:PiliPlus/http/loading_state.dart';\nimport 'package:PiliPlus/http/member.dart';\nimport 'package:PiliPlus/http/user.dart';\nimport 'package:PiliPlus/http/validate.dart';\nimport 'package:PiliPlus/http/video.dart';\nimport 'package:PiliPlus/models/dynamics/result.dart';\nimport 'package:PiliPlus/models/login/model.dart';\nimport 'package:PiliPlus/models_new/fav/fav_detail/media.dart';\nimport 'package:PiliPlus/models_new/later/list.dart';\nimport 'package:PiliPlus/pages/common/multi_select/base.dart';\nimport 'package:PiliPlus/pages/dynamics_tab/controller.dart';\nimport 'package:PiliPlus/pages/fav_detail/controller.dart'\n    show BaseFavController;\nimport 'package:PiliPlus/pages/group_panel/view.dart';\nimport 'package:PiliPlus/pages/login/geetest/geetest_webview_dialog.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/extension/context_ext.dart';\nimport 'package:PiliPlus/utils/extension/size_ext.dart';\nimport 'package:PiliPlus/utils/extension/string_ext.dart';\nimport 'package:PiliPlus/utils/feed_back.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:gt3_flutter_plugin/gt3_flutter_plugin.dart';\n\nabstract final class RequestUtils {\n  static Future<void> syncHistoryStatus() async {\n    final account = Accounts.history;\n    if (!account.isLogin) {\n      return;\n    }\n    final res = await UserHttp.historyStatus(account: account);\n    if (res case Success(:final response)) {\n      GStorage.localCache.put(LocalCacheKey.historyPause, response);\n    }\n  }\n\n  // 1：小视频（已弃用）\n  // 2：相簿\n  // 3：纯文字\n  // 4：直播（此类型不常用，见分享其他内容消息）\n  // 5：视频\n  // 6：专栏\n  // 7：番剧（id 为 season_id）\n  // 8：音乐\n  // 9：国产动画（id 为 AV 号）\n  // 10：图片\n  // 11：动态\n  // 16：番剧（id 为 epid）\n  // 17：番剧\n  // https://github.com/SocialSisterYi/bilibili-API-collect/tree/master/docs/message/private_msg_content.md\n  static Future<bool> pmShare({\n    required int receiverId,\n    required Map content,\n    String? message,\n  }) async {\n    final ownerMid = Accounts.main.mid;\n    final contentRes = await ImGrpc.sendMsg(\n      senderUid: ownerMid,\n      receiverId: receiverId,\n      content: jsonEncode(content),\n      msgType: content['source'] is String\n          ? MsgType.EN_MSG_TYPE_COMMON_SHARE_CARD\n          : MsgType.EN_MSG_TYPE_SHARE_V2,\n    );\n\n    if (contentRes.isSuccess) {\n      if (message?.isNotEmpty == true) {\n        final msgRes = await ImGrpc.sendMsg(\n          senderUid: ownerMid,\n          receiverId: receiverId,\n          content: jsonEncode({\"content\": message}),\n          msgType: MsgType.EN_MSG_TYPE_TEXT,\n        );\n        return msgRes.isSuccess;\n      } else {\n        return true;\n      }\n    } else {\n      return false;\n    }\n  }\n\n  static Future<void> actionRelationMod({\n    required BuildContext context,\n    required dynamic mid,\n    required bool isFollow,\n    required ValueChanged<int>? afterMod,\n    Map? followStatus,\n  }) async {\n    if (mid == null) {\n      return;\n    }\n    feedBack();\n    if (!isFollow) {\n      final res = await VideoHttp.relationMod(\n        mid: mid,\n        act: 1,\n        reSrc: 11,\n      );\n      if (res.isSuccess) {\n        SmartDialog.showToast('关注成功');\n        afterMod?.call(2);\n      } else {\n        res.toast();\n      }\n    } else {\n      if (followStatus?['tag'] == null) {\n        final res = await UserHttp.hasFollow(mid);\n        if (res case Success(:final response)) {\n          followStatus = response;\n        } else {\n          res.toast();\n          return;\n        }\n      }\n\n      if (context.mounted) {\n        bool isSpecialFollowed = followStatus!['special'] == 1;\n        String text = isSpecialFollowed ? '移除特别关注' : '加入特别关注';\n        showDialog(\n          context: context,\n          builder: (context) => AlertDialog(\n            clipBehavior: Clip.hardEdge,\n            contentPadding: const EdgeInsets.symmetric(vertical: 12),\n            content: Column(\n              mainAxisSize: MainAxisSize.min,\n              children: [\n                ListTile(\n                  dense: true,\n                  onTap: () async {\n                    Get.back();\n                    final res = await MemberHttp.specialAction(\n                      fid: mid,\n                      isAdd: !isSpecialFollowed,\n                    );\n                    if (res.isSuccess) {\n                      SmartDialog.showToast('$text成功');\n                      afterMod?.call(isSpecialFollowed ? 2 : -10);\n                    } else {\n                      res.toast();\n                    }\n                  },\n                  title: Text(\n                    text,\n                    style: const TextStyle(fontSize: 14),\n                  ),\n                ),\n                ListTile(\n                  dense: true,\n                  onTap: () async {\n                    Get.back();\n                    final result = await showModalBottomSheet<Set<int>>(\n                      context: context,\n                      useSafeArea: true,\n                      isScrollControlled: true,\n                      constraints: BoxConstraints(\n                        maxWidth: min(640, context.mediaQueryShortestSide),\n                      ),\n                      builder: (BuildContext context) {\n                        final maxChildSize =\n                            PlatformUtils.isMobile &&\n                                !context.mediaQuerySize.isPortrait\n                            ? 1.0\n                            : 0.7;\n                        return DraggableScrollableSheet(\n                          minChildSize: 0,\n                          maxChildSize: 1,\n                          snap: true,\n                          expand: false,\n                          snapSizes: [maxChildSize],\n                          initialChildSize: maxChildSize,\n                          builder:\n                              (\n                                BuildContext context,\n                                ScrollController scrollController,\n                              ) {\n                                return GroupPanel(\n                                  mid: mid,\n                                  tags: followStatus!['tag'],\n                                  scrollController: scrollController,\n                                );\n                              },\n                        );\n                      },\n                    );\n                    followStatus!['tag'] = result?.toList();\n                    if (result != null) {\n                      afterMod?.call(result.contains(-10) ? -10 : 2);\n                    }\n                  },\n                  title: const Text(\n                    '设置分组',\n                    style: TextStyle(fontSize: 14),\n                  ),\n                ),\n                ListTile(\n                  dense: true,\n                  onTap: () async {\n                    Get.back();\n                    final res = await VideoHttp.relationMod(\n                      mid: mid,\n                      act: 2,\n                      reSrc: 11,\n                    );\n                    if (res.isSuccess) {\n                      SmartDialog.showToast('取消关注成功');\n                      afterMod?.call(0);\n                    } else {\n                      res.toast();\n                    }\n                  },\n                  title: const Text(\n                    '取消关注',\n                    style: TextStyle(fontSize: 14),\n                  ),\n                ),\n              ],\n            ),\n          ),\n        );\n      }\n    }\n  }\n\n  static ReplyInfo replyCast(Map res) {\n    Map? emote = res['content']['emote'];\n    emote?.forEach((key, value) {\n      value['size'] = value['meta']['size'];\n    });\n    return ReplyInfo.create()..mergeFromProto3Json(\n      res\n        ..['content'].remove('members')\n        ..['id'] = res['rpid']\n        ..['member']['name'] = res['member']['uname']\n        ..['member']['face'] = res['member']['avatar']\n        ..['member']['level'] = res['member']['level_info']['current_level']\n        ..['member']['vipStatus'] = res['member']['vip']['vipStatus']\n        ..['member']['vipType'] = res['member']['vip']['vipType']\n        ..['member']['officialVerifyType'] =\n            res['member']['official_verify']['type']\n        ..['content']['emotes'] = emote,\n      ignoreUnknownFields: true,\n    );\n  }\n\n  // static Future<dynamic> getWwebid(mid) async {\n  //   try {\n  //     final response = await Request().get(\n  //       '${HttpString.spaceBaseUrl}/$mid/dynamic',\n  //       options: Options(\n  //         extra: {'account': AnonymousAccount()},\n  //       ),\n  //     );\n  //     dom.Document document = html_parser.parse(response.data);\n  //     dom.Element? scriptElement =\n  //         document.querySelector('script#__RENDER_DATA__');\n  //     return jsonDecode(\n  //         Uri.decodeComponent(scriptElement?.text ?? ''))['access_id'];\n  //   } catch (e) {\n  //     if (kDebugMode) debugPrint('failed to get wwebid: $e');\n  //     return null;\n  //   }\n  // }\n\n  static Future<void> insertCreatedDyn(dynamic id) async {\n    if (id != null) {\n      try {\n        await Future.delayed(const Duration(milliseconds: 450));\n        final res = await DynamicsHttp.dynamicDetail(id: id);\n        if (res case final Success<DynamicItemModel> e) {\n          final ctr = Get.find<DynamicsTabController>(tag: 'all');\n          if (ctr.loadingState.value case Success(:final response?)) {\n            response.insert(0, e.response);\n            ctr.loadingState.refresh();\n            return;\n          }\n          ctr.loadingState.value = Success([e.response]);\n        }\n      } catch (e) {\n        if (kDebugMode) debugPrint('create dyn $e');\n      }\n    }\n  }\n\n  static Future<void> checkCreatedDyn({\n    dynamic id,\n    String? dynText,\n    bool isManual = false,\n  }) async {\n    if (isManual || Pref.enableCreateDynAntifraud) {\n      try {\n        if (id != null) {\n          if (!isManual) {\n            await Future.delayed(const Duration(seconds: 5));\n          }\n          final res = await DynamicsHttp.dynamicDetail(\n            id: id,\n            clearCookie: true,\n          );\n          final isSuccess = res.isSuccess;\n          final actions = [\n            if (!isSuccess)\n              TextButton(\n                onPressed: () {\n                  Get.back();\n                  Utils.copyText('https://www.bilibili.com/opus/$id');\n                  Get.toNamed(\n                    '/webview',\n                    parameters: {\n                      'url':\n                          'https://www.bilibili.com/h5/comment/appeal?${Utils.themeUrl(Get.isDarkMode)}',\n                    },\n                  );\n                },\n                child: const Text('申诉'),\n              ),\n            if (!isManual)\n              TextButton(\n                onPressed: Get.back,\n                child: Text(\n                  '关闭',\n                  style: TextStyle(color: Get.theme.colorScheme.outline),\n                ),\n              ),\n          ];\n          showDialog(\n            context: Get.context!,\n            barrierDismissible: isManual,\n            builder: (context) => AlertDialog(\n              title: const Text('动态检查结果'),\n              content: SelectableText(\n                '${isSuccess ? '无账号状态下找到了你的动态，动态正常！' : '你的动态被shadow ban（仅自己可见）！'}${dynText != null ? ' \\n\\n动态内容: $dynText' : ''}',\n              ),\n              actions: actions.isEmpty ? null : actions,\n            ),\n          );\n        }\n      } catch (e) {\n        if (kDebugMode) debugPrint('check dyn error: $e');\n      }\n    }\n  }\n\n  // 动态点赞\n  static Future<void> onLikeDynamic(\n    DynamicItemModel item,\n    bool uiStatus,\n    VoidCallback onSuccess,\n  ) async {\n    feedBack();\n\n    final like = item.modules.moduleStat?.like;\n    final status = like?.status ?? false;\n\n    if (status ^ uiStatus) {\n      SmartDialog.showToast(status ? '点赞成功' : '取消赞');\n      onSuccess();\n      return;\n    }\n\n    final res = await DynamicsHttp.thumbDynamic(\n      dynamicId: item.idStr!,\n      up: status ? 2 : 1, // 1 已点赞 2 不喜欢 0 未操作\n    );\n    if (res.isSuccess) {\n      SmartDialog.showToast(status ? '取消赞' : '点赞成功');\n      like\n        ?..count = (like.count ?? 0) + (status ? -1 : 1)\n        ..status = !status;\n      onSuccess();\n    } else {\n      res.toast();\n    }\n  }\n\n  static void onCopyOrMove<T extends MultiSelectData>({\n    required BuildContext context,\n    required bool isCopy,\n    required CommonMultiSelectMixin<T> ctr,\n    required dynamic mediaId,\n    required dynamic mid,\n  }) {\n    FavHttp.allFavFolders(mid).then((res) {\n      if (!context.mounted) return;\n      if (res case Success(:final response)) {\n        final list = response.list;\n        if (list == null || list.isEmpty) return;\n        int? checkedId;\n        showDialog(\n          context: context,\n          builder: (context) {\n            return AlertDialog(\n              title: Text('${isCopy ? '复制' : '移动'}到'),\n              contentPadding: const EdgeInsets.only(top: 5),\n              content: SingleChildScrollView(\n                child: RadioGroup(\n                  onChanged: (value) {\n                    checkedId = value;\n                    (context as Element).markNeedsBuild();\n                  },\n                  groupValue: checkedId,\n                  child: Column(\n                    children: list.map((item) {\n                      return RadioListTile<int>(\n                        dense: true,\n                        title: Text(item.title),\n                        value: item.id,\n                      );\n                    }).toList(),\n                  ),\n                ),\n              ),\n              actions: [\n                TextButton(\n                  onPressed: Get.back,\n                  child: Text(\n                    '取消',\n                    style: TextStyle(\n                      color: Theme.of(context).colorScheme.outline,\n                    ),\n                  ),\n                ),\n                TextButton(\n                  onPressed: () {\n                    if (checkedId != null) {\n                      final removeList = ctr.allChecked.toSet();\n                      SmartDialog.showLoading();\n                      FavHttp.copyOrMoveFav(\n                        isCopy: isCopy,\n                        isFav: ctr is BaseFavController,\n                        srcMediaId: mediaId,\n                        tarMediaId: checkedId,\n                        resources: removeList\n                            .map(\n                              (e) => switch (e) {\n                                LaterItemModel _ => e.aid,\n                                FavDetailItemModel _ => '${e.id}:${e.type}',\n                                _ => throw UnsupportedError(e.toString()),\n                              },\n                            )\n                            .join(','),\n                        mid: isCopy ? mid : null,\n                      ).then((res) {\n                        if (res.isSuccess) {\n                          ctr.handleSelect(checked: false);\n                          if (!isCopy) {\n                            ctr.loadingState\n                              ..value.data!.removeWhere(removeList.contains)\n                              ..refresh();\n                          }\n                          SmartDialog.dismiss();\n                          SmartDialog.showToast('${isCopy ? '复制' : '移动'}成功');\n                          Get.back();\n                        } else {\n                          SmartDialog.dismiss();\n                          res.toast();\n                        }\n                      });\n                    }\n                  },\n                  child: const Text('确认'),\n                ),\n              ],\n            );\n          },\n        );\n      } else {\n        res.toast();\n      }\n    });\n  }\n\n  static Future<void> validate(\n    String vVoucher,\n    ValueChanged<String> onSuccess,\n  ) async {\n    if (Platform.isLinux) {\n      return;\n    }\n\n    final res = await ValidateHttp.gaiaVgateRegister(vVoucher);\n    if (!res.isSuccess) {\n      res.toast();\n      return;\n    }\n\n    final resData = res.data;\n    if (resData == null) {\n      SmartDialog.showToast(\"null data\");\n      return;\n    }\n\n    CaptchaDataModel captchaData = CaptchaDataModel();\n\n    final geetest = resData['geetest'];\n    String? gt = geetest?['gt'];\n    String? challenge = geetest?['challenge'];\n    captchaData.token = resData['token'];\n\n    bool isGeeArgumentValid() {\n      return gt?.isNotEmpty == true &&\n          challenge?.isNotEmpty == true &&\n          captchaData.token?.isNotEmpty == true;\n    }\n\n    if (!isGeeArgumentValid()) {\n      SmartDialog.showToast(\"参数为空\");\n      return;\n    }\n\n    Future<void> gaiaVgateValidate() async {\n      final res = await ValidateHttp.gaiaVgateValidate(\n        challenge: captchaData.geetest?.challenge,\n        seccode: captchaData.seccode,\n        token: captchaData.token,\n        validate: captchaData.validate,\n      );\n      if (res case Success(:final response?)) {\n        if (response['is_valid'] == 1) {\n          final griskId = response['grisk_id'];\n          if (griskId is String) {\n            onSuccess(griskId);\n          }\n        } else {\n          SmartDialog.showToast('invalid');\n        }\n      } else {\n        res.toast();\n      }\n    }\n\n    if (PlatformUtils.isDesktop) {\n      final json = await showDialog<Map<String, dynamic>>(\n        context: Get.context!,\n        builder: (context) => GeetestWebviewDialog(gt!, challenge!),\n      );\n      if (json != null) {\n        captchaData\n          ..validate = json['geetest_validate']\n          ..seccode = json['geetest_seccode']\n          ..geetest = GeetestData(\n            challenge: json['geetest_challenge'],\n            gt: gt!,\n          );\n        gaiaVgateValidate();\n      }\n      return;\n    }\n\n    final registerData = Gt3RegisterData(\n      challenge: challenge,\n      gt: gt,\n      success: true,\n    );\n\n    Gt3FlutterPlugin()\n      ..addEventHandler(\n        onClose: (Map<String, dynamic> message) {\n          SmartDialog.showToast('关闭验证');\n        },\n        onResult: (Map<String, dynamic> message) {\n          if (kDebugMode) debugPrint(\"Captcha result: $message\");\n          String code = message[\"code\"];\n          if (code == \"1\") {\n            // 发送 message[\"result\"] 中的数据向 B 端的业务服务接口进行查询\n            SmartDialog.showToast('验证成功');\n            final result = message['result'];\n            captchaData\n              ..validate = result?['geetest_validate']\n              ..seccode = result?['geetest_seccode']\n              ..geetest = GeetestData(\n                challenge: result?['geetest_challenge'],\n                gt: gt!,\n              );\n            gaiaVgateValidate();\n          } else {\n            // 终端用户完成验证失败，自动重试 If the verification fails, it will be automatically retried.\n            if (kDebugMode) debugPrint(\"Captcha result code : $code\");\n          }\n        },\n        onError: (Map<String, dynamic> message) {\n          SmartDialog.showToast(\"Captcha onError: $message\");\n          String code = message[\"code\"];\n          // 处理验证中返回的错误 Handling errors returned in verification\n          if (Platform.isAndroid) {\n            // Android 平台\n            if (code == \"-2\") {\n              // Dart 调用异常 Call exception\n            } else if (code == \"-1\") {\n              // Gt3RegisterData 参数不合法 Parameter is invalid\n            } else if (code == \"201\") {\n              // 网络无法访问 Network inaccessible\n            } else if (code == \"202\") {\n              // Json 解析错误 Analysis error\n            } else if (code == \"204\") {\n              // WebView 加载超时，请检查是否混淆极验 SDK   Load timed out\n            } else if (code == \"204_1\") {\n              // WebView 加载前端页面错误，请查看日志 Error loading front-end page, please check the log\n            } else if (code == \"204_2\") {\n              // WebView 加载 SSLError\n            } else if (code == \"206\") {\n              // gettype 接口错误或返回为 null   API error or return null\n            } else if (code == \"207\") {\n              // getphp 接口错误或返回为 null    API error or return null\n            } else if (code == \"208\") {\n              // ajax 接口错误或返回为 null      API error or return null\n            } else {\n              // 更多错误码参考开发文档  More error codes refer to the development document\n              // https://docs.geetest.com/sensebot/apirefer/errorcode/android\n            }\n          }\n\n          if (Platform.isIOS) {\n            // iOS 平台\n            if (code == \"-1009\") {\n              // 网络无法访问 Network inaccessible\n            } else if (code == \"-1004\") {\n              // 无法查找到 HOST  Unable to find HOST\n            } else if (code == \"-1002\") {\n              // 非法的 URL  Illegal URL\n            } else if (code == \"-1001\") {\n              // 网络超时 Network timeout\n            } else if (code == \"-999\") {\n              // 请求被意外中断, 一般由用户进行取消操作导致 The interrupted request was usually caused by the user cancelling the operation\n            } else if (code == \"-21\") {\n              // 使用了重复的 challenge   Duplicate challenges are used\n              // 检查获取 challenge 是否进行了缓存  Check if the fetch challenge is cached\n            } else if (code == \"-20\") {\n              // 尝试过多, 重新引导用户触发验证即可 Try too many times, lead the user to request verification again\n            } else if (code == \"-10\") {\n              // 预判断时被封禁, 不会再进行图形验证 Banned during pre-judgment, and no more image captcha verification\n            } else if (code == \"-2\") {\n              // Dart 调用异常 Call exception\n            } else if (code == \"-1\") {\n              // Gt3RegisterData 参数不合法  Parameter is invalid\n            } else {\n              // 更多错误码参考开发文档 More error codes refer to the development document\n              // https://docs.geetest.com/sensebot/apirefer/errorcode/ios\n            }\n          }\n        },\n      )\n      ..startCaptcha(registerData);\n  }\n\n  static Future<void> showUserRealName(String mid) async {\n    final res = await UserHttp.getUserRealName(mid);\n    if (res case Success(:final response)) {\n      final show = !response.name.isNullOrEmpty;\n      showDialog(\n        context: Get.context!,\n        builder: (context) => AlertDialog(\n          title: SelectableText(\n            show ? response.name! : response.rejectPage?.title ?? '',\n          ),\n          content: show ? null : Text(response.rejectPage?.text ?? ''),\n          actions: [\n            TextButton(\n              onPressed: Get.back,\n              child: const Text('关闭'),\n            ),\n          ],\n        ),\n      );\n    } else {\n      res.toast();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/utils/set_int_adapter.dart",
    "content": "import 'package:hive_ce/hive.dart';\n\nclass SetIntAdapter extends TypeAdapter<Set<int>> {\n  @override\n  final int typeId = 11;\n\n  @override\n  Set<int> read(BinaryReader reader) {\n    return reader.readIntList().toSet();\n  }\n\n  @override\n  void write(BinaryWriter writer, Set<int> obj) {\n    writer.writeIntList(obj.toList());\n  }\n\n  @override\n  int get hashCode => typeId.hashCode;\n\n  @override\n  bool operator ==(Object other) =>\n      identical(this, other) ||\n      other is SetIntAdapter &&\n          runtimeType == other.runtimeType &&\n          typeId == other.typeId;\n}\n"
  },
  {
    "path": "lib/utils/storage.dart",
    "content": "import 'dart:convert';\nimport 'dart:typed_data';\n\nimport 'package:PiliPlus/models/model_owner.dart';\nimport 'package:PiliPlus/models/user/danmaku_rule_adapter.dart';\nimport 'package:PiliPlus/models/user/info.dart';\nimport 'package:PiliPlus/utils/accounts.dart';\nimport 'package:PiliPlus/utils/accounts/account_adapter.dart';\nimport 'package:PiliPlus/utils/accounts/account_type_adapter.dart';\nimport 'package:PiliPlus/utils/accounts/cookie_jar_adapter.dart';\nimport 'package:PiliPlus/utils/path_utils.dart';\nimport 'package:PiliPlus/utils/set_int_adapter.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:hive_ce/hive.dart';\nimport 'package:path/path.dart' as path;\n\nabstract final class GStorage {\n  static late final Box<UserInfoData> userInfo;\n  static late final Box<dynamic> historyWord;\n  static late final Box<dynamic> localCache;\n  static late final Box<dynamic> setting;\n  static late final Box<dynamic> video;\n  static late final Box<int> watchProgress;\n  static late final Box<Uint8List>? reply;\n\n  static Future<void> init() async {\n    Hive.init(path.join(appSupportDirPath, 'hive'));\n    regAdapter();\n\n    await Future.wait([\n      // 登录用户信息\n      Hive.openBox<UserInfoData>(\n        'userInfo',\n        compactionStrategy: (int entries, int deletedEntries) {\n          return deletedEntries > 2;\n        },\n      ).then((res) => userInfo = res),\n      // 本地缓存\n      Hive.openBox(\n        'localCache',\n        compactionStrategy: (int entries, int deletedEntries) {\n          return deletedEntries > 4;\n        },\n      ).then((res) => localCache = res),\n      // 设置\n      Hive.openBox('setting').then((res) => setting = res),\n      // 搜索历史\n      Hive.openBox(\n        'historyWord',\n        compactionStrategy: (int entries, int deletedEntries) {\n          return deletedEntries > 10;\n        },\n      ).then((res) => historyWord = res),\n      // 视频设置\n      Hive.openBox('video').then((res) => video = res),\n      Accounts.init(),\n      Hive.openBox<int>(\n        'watchProgress',\n        keyComparator: _intStrDescKeyComparator,\n        compactionStrategy: (entries, deletedEntries) {\n          return deletedEntries > 4;\n        },\n      ).then((res) => watchProgress = res),\n    ]);\n\n    if (Pref.saveReply) {\n      reply = await Hive.openBox<Uint8List>(\n        'reply',\n        keyComparator: _intStrDescKeyComparator,\n        compactionStrategy: (entries, deletedEntries) {\n          return deletedEntries > 10;\n        },\n      );\n    } else {\n      reply = null;\n    }\n  }\n\n  static String exportAllSettings() {\n    return Utils.jsonEncoder.convert({\n      setting.name: setting.toMap(),\n      video.name: video.toMap(),\n    });\n  }\n\n  static Future<void> importAllSettings(String data) =>\n      importAllJsonSettings(jsonDecode(data));\n\n  static Future<List<void>> importAllJsonSettings(\n    Map<String, dynamic> map,\n  ) {\n    return Future.wait([\n      setting.clear().then((_) => setting.putAll(map[setting.name])),\n      video.clear().then((_) => video.putAll(map[video.name])),\n    ]);\n  }\n\n  static void regAdapter() {\n    Hive\n      ..registerAdapter(OwnerAdapter())\n      ..registerAdapter(UserInfoDataAdapter())\n      ..registerAdapter(LevelInfoAdapter())\n      ..registerAdapter(BiliCookieJarAdapter())\n      ..registerAdapter(LoginAccountAdapter())\n      ..registerAdapter(AccountTypeAdapter())\n      ..registerAdapter(SetIntAdapter())\n      ..registerAdapter(RuleFilterAdapter());\n  }\n\n  static Future<List<void>> compact() {\n    return Future.wait([\n      userInfo.compact(),\n      historyWord.compact(),\n      localCache.compact(),\n      setting.compact(),\n      video.compact(),\n      Accounts.account.compact(),\n      watchProgress.compact(),\n      ?reply?.compact(),\n    ]);\n  }\n\n  static Future<List<void>> close() {\n    return Future.wait([\n      userInfo.close(),\n      historyWord.close(),\n      localCache.close(),\n      setting.close(),\n      video.close(),\n      Accounts.account.close(),\n      watchProgress.close(),\n      ?reply?.close(),\n    ]);\n  }\n\n  static Future<List<void>> clear() {\n    return Future.wait([\n      userInfo.clear(),\n      historyWord.clear(),\n      localCache.clear(),\n      setting.clear(),\n      video.clear(),\n      Accounts.clear(),\n      watchProgress.clear(),\n      ?reply?.clear(),\n    ]);\n  }\n\n  static int _intStrDescKeyComparator(dynamic k1, dynamic k2) {\n    if (k1 is int) {\n      if (k2 is int) {\n        return k2.compareTo(k1);\n      } else {\n        return -1;\n      }\n    } else if (k2 is String) {\n      final lenCompare = k2.length.compareTo((k1 as String).length);\n      if (lenCompare == 0) {\n        return k2.compareTo(k1);\n      } else {\n        return lenCompare;\n      }\n    } else {\n      return 1;\n    }\n  }\n}\n"
  },
  {
    "path": "lib/utils/storage_key.dart",
    "content": "// ignore_for_file: constant_identifier_names\n\nabstract final class SettingBoxKey {\n  static const String btmProgressBehavior = 'btmProgressBehavior',\n      defaultVideoQa = 'defaultVideoQa',\n      defaultVideoQaCellular = 'defaultVideoQaCellular',\n      defaultAudioQa = 'defaultAudioQa',\n      defaultAudioQaCellular = 'defaultAudioQaCellular',\n      autoPlayEnable = 'autoPlayEnable',\n      fullScreenMode = 'fullScreenMode',\n      defaultDecode = 'defaultDecode',\n      secondDecode = 'secondDecode',\n      defaultToastOp = 'defaultToastOp',\n      defaultPicQa = 'defaultPicQa',\n      enableHA = 'enableHA',\n      audioOutput = 'audioOutput',\n      expandBuffer = 'expandBuffer',\n      hardwareDecoding = 'hardwareDecoding',\n      videoSync = 'videoSync',\n      autosync = 'autosync',\n      p1080 = 'p1080',\n      enableAutoEnter = 'enableAutoEnter',\n      enableAutoExit = 'enableAutoExit',\n      enableOnlineTotal = 'enableOnlineTotal',\n      superChatType = 'superChatType',\n      keyboardControl = 'keyboardControl',\n      pauseOnMinimize = 'pauseOnMinimize',\n      pgcSkipType = 'pgcSkipType',\n      audioPlayMode = 'audioPlayMode',\n      showBatteryLevel = 'showBatteryLevel';\n\n  static const String enableVerticalExpand = 'enableVerticalExpand',\n      feedBackEnable = 'feedBackEnable',\n      enableLongShowControl = 'enableLongShowControl',\n      allowRotateScreen = 'allowRotateScreen',\n      horizontalScreen = 'horizontalScreen',\n      CDNService = 'CDNService',\n      disableAudioCDN = 'disableAudioCDN',\n      autoPiP = 'autoPiP',\n      enableAutoLongPressSpeed = 'enableAutoLongPressSpeed',\n      useRelativeSlide = 'useRelativeSlide',\n      sliderDuration = 'sliderOffset',\n      enableQuickDouble = 'enableQuickDouble',\n      fullScreenGestureReverse = 'fullScreenGestureReverse',\n      enableBackgroundPlay = 'enableBackgroundPlay',\n      continuePlayInBackground = 'continuePlayInBackground',\n      appRcmd = 'appRcmd',\n      enableSaveLastData = 'enableSaveLastData',\n      minDurationForRcmd = 'minDurationForRcmd',\n      minPlayForRcmd = 'minPlayForRcmd',\n      minLikeRatioForRecommend = 'minLikeRatioForRecommend',\n      exemptFilterForFollowed = 'exemptFilterForFollowed',\n      banWordForRecommend = 'banWordForRecommend',\n      applyFilterToRelatedVideos = 'applyFilterToRelatedVideos',\n      autoUpdate = 'autoUpdate',\n      autoClearCache = 'autoClearCache',\n      maxCacheSize = 'maxCacheSize',\n      defaultShowComment = 'defaultShowComment',\n      replySortType = 'replySortType',\n      defaultDynamicType = 'defaultDynamicType',\n      showDynInteraction = 'showDynInteraction',\n      enableHotKey = 'enableHotKey',\n      enableSearchRcmd = 'enableSearchRcmd',\n      enableQuickFav = 'enableQuickFav',\n      enableWordRe = 'enableWordRe',\n      enableSearchWord = 'enableSearchWord',\n      enableSystemProxy = 'enableSystemProxy',\n      enableAi = 'enableAi',\n      disableLikeMsg = 'disableLikeMsg',\n      defaultHomePage = 'defaultHomePage',\n      previewQuality = 'previewQuality',\n      checkDynamic = 'checkDynamic',\n      dynamicPeriod = 'dynamicPeriod',\n      schemeVariant = 'schemeVariant',\n      showViewPoints = 'showViewPoints',\n      showRelatedVideo = 'showRelatedVideo',\n      showVideoReply = 'showVideoReply',\n      showBangumiReply = 'showBangumiReply',\n      alwaysExpandIntroPanel = 'alwaysExapndIntroPanel',\n      expandIntroPanelH = 'exapndIntroPanelH',\n      horizontalSeasonPanel = 'horizontalSeasonPanel',\n      horizontalMemberPage = 'horizontalMemberPage',\n      replyLengthLimit = 'replyLengthLimit',\n      showArgueMsg = 'showArgueMsg',\n      reverseFromFirst = 'reverseFromFirst',\n      badCertificateCallback = 'badCertificateCallback',\n      continuePlayingPart = 'continuePlayingPart',\n      cdnSpeedTest = 'cdnSpeedTest',\n      horizontalPreview = 'horizontalPreview',\n      banWordForReply = 'banWordForReply',\n      banWordForZone = 'banWordForZone',\n      savedRcmdTip = 'savedRcmdTip',\n      openInBrowser = 'openInBrowser',\n      refreshDragPercentage = 'refreshDragPercentage',\n      refreshDisplacement = 'refreshDisplacement',\n      showHotRcmd = 'showHotRcmd',\n      audioNormalization = 'audioNormalization',\n      fallbackNormalization = 'fallbackNormalization',\n      superResolutionType = 'superResolutionType',\n      preInitPlayer = 'preInitPlayer',\n      mainTabBarView = 'mainTabBarView',\n      searchSuggestion = 'searchSuggestion',\n      showDynDecorate = 'showDynDecorate',\n      enableLivePhoto = 'enableLivePhoto',\n      showSeekPreview = 'showSeekPreview',\n      showDmChart = 'showDmChart',\n      enableCommAntifraud = 'enableCommAntifraud',\n      biliSendCommAntifraud = 'biliSendCommAntifraud',\n      enableCreateDynAntifraud = 'enableCreateDynAntifraud',\n      coinWithLike = 'coinWithLike',\n      isPureBlackTheme = 'isPureBlackTheme',\n      antiGoodsDyn = 'antiGoodsDyn',\n      antiGoodsReply = 'antiGoodsReply',\n      expandDynLivePanel = 'expandDynLivePanel',\n      springDescription = 'springDescription',\n      enableHttp2 = 'enableHttp2',\n      slideDismissReplyPage = 'slideDismissReplyPage',\n      showFSActionItem = 'showFSActionItem',\n      enableShrinkVideoSize = 'enableShrinkVideoSize',\n      showDynActionBar = 'showDynActionBar',\n      darkVideoPage = 'darkVideoPage',\n      enableSlideVolumeBrightness = 'enableSlideVolumeBrightness',\n      enableSlideFS = 'enableSlideFS',\n      retryCount = 'retryCount',\n      retryDelay = 'retryDelay',\n      liveQuality = 'liveQuality',\n      liveQualityCellular = 'liveQualityCellular',\n      appFontWeight = 'appFontWeight',\n      fastForBackwardDuration = 'fastForBackwardDuration',\n      recordSearchHistory = 'recordSearchHistory',\n      showPgcTimeline = 'showPgcTimeline',\n      pageTransition = 'pageTransition',\n      optTabletNav = 'optTabletNav',\n      banWordForDyn = 'banWordForDyn',\n      enableLog = 'enableLog',\n      memberTab = 'memberTab',\n      dynamicDetailRatio = 'dynamicDetailRatio',\n      directExitOnBack = 'directExitOnBack',\n      quickFavId = 'quickFavId',\n      showFsScreenshotBtn = 'showFsScreenshotBtn',\n      showFsLockBtn = 'showFsLockBtn',\n      silentDownImg = 'silentDownImg',\n      showMemberShop = 'showMemberShop',\n      enablePlayAll = 'enablePlayAll',\n      enableTapDm = 'enableTapDm',\n      setSystemBrightness = 'setSystemBrightness',\n      downloadPath = 'downloadPath',\n      followOrderType = 'followOrderType',\n      enableImgMenu = 'enableImgMenu',\n      showDynDispute = 'showDynDispute',\n      touchSlopH = 'touchSlopH';\n\n  static const String minimizeOnExit = 'minimizeOnExit',\n      windowSize = 'windowSize',\n      windowPosition = 'windowPosition',\n      isWindowMaximized = 'isWindowMaximized',\n      showWindowTitleBar = 'showWindowTitleBar',\n      desktopVolume = 'desktopVolume',\n      showTrayIcon = 'showTrayIcon',\n      uiScale = 'uiScale';\n\n  static const String subtitlePreferenceV2 = 'subtitlePreferenceV2',\n      enableDragSubtitle = 'enableDragSubtitle',\n      subtitlePaddingH = 'subtitlePaddingH',\n      subtitlePaddingB = 'subtitlePaddingB',\n      subtitleBgOpacity = 'subtitleBgOpaticy',\n      subtitleStrokeWidth = 'subtitleStrokeWidth',\n      subtitleFontScale = 'subtitleFontScale',\n      subtitleFontScaleFS = 'subtitleFontScaleFS',\n      subtitleFontWeight = 'subtitleFontWeight';\n\n  static const String webdavUri = 'webdavUri',\n      webdavUsername = 'webdavUsername',\n      webdavPassword = 'webdavPassword',\n      webdavDirectory = 'webdavDirectory';\n\n  static const String enableSponsorBlock = 'enableSponsorBlock',\n      blockSettings = 'blockSettings',\n      blockLimit = 'blockLimit',\n      blockColor = 'blockColor',\n      blockUserID = 'blockUserID',\n      blockToast = 'blockToast',\n      blockServer = 'blockServer',\n      blockTrack = 'blockTrack';\n\n  static const String enableShowDanmaku = 'enableShowDanmaku',\n      enableShowLiveDanmaku = 'enableShowLiveDanmaku',\n      pipNoDanmaku = 'pipNoDanmaku',\n      showVipDanmaku = 'showVipDanmaku',\n      mergeDanmaku = 'mergeDanmaku',\n      danmakuWeight = 'danmakuWeight',\n      danmakuBlockType = 'danmakuBlockType',\n      danmakuShowArea = 'danmakuShowArea',\n      danmakuOpacity = 'danmakuOpacity',\n      danmakuFontScale = 'danmakuFontScale',\n      danmakuFontScaleFS = 'danmakuFontScaleFS',\n      danmakuDuration = 'danmakuDuration',\n      danmakuStaticDuration = 'danmakuStaticDuration',\n      danmakuMassiveMode = 'danmakuMassiveMode',\n      danmakuFixedV = 'danmakuFixedV',\n      danmakuStatic2Scroll = 'danmakuStatic2Scroll',\n      danmakuLineHeight = 'danmakuLineHeight',\n      danmakuStrokeWidth = 'strokeWidth',\n      danmakuFontWeight = 'fontWeight';\n\n  static const String systemProxyHost = 'systemProxyHost',\n      systemProxyPort = 'systemProxyPort';\n\n  static const String themeMode = 'themeMode',\n      defaultTextScale = 'textScale',\n      dynamicColor = 'dynamicColor',\n      customColor = 'customColor',\n      displayMode = 'displayMode',\n      smallCardWidth = 'smallCardWidth',\n      recommendCardWidth = 'recommendCardWidth',\n      dynamicsWaterfallFlow = 'dynamicsWaterfallFlow',\n      upPanelPosition = 'upPanelPosition',\n      dynamicsShowAllFollowedUp = 'dynamicsShowAllFollowedUp',\n      useSideBar = 'useSideBar',\n      enableMYBar = 'enableMYBar',\n      hideTopBar = 'hideSearchBar',\n      hideBottomBar = 'hideTabBar',\n      barHideType = 'barHideType',\n      tabBarSort = 'tabBarSort',\n      dynamicBadgeMode = 'dynamicBadgeMode',\n      msgBadgeMode = 'msgBadgeMode',\n      msgUnReadTypeV2 = 'msgUnReadTypeV2',\n      navBarSort = 'navBarSort',\n      tempPlayerConf = 'tempPlayerConf',\n      reduceLuxColor = 'reduceLuxColor',\n      liveCdnUrl = 'liveCdnUrl',\n      saveReply = 'saveReply';\n}\n\nabstract final class LocalCacheKey {\n  static const String historyPause = 'historyPause',\n      blackMids = 'blackMids',\n      danmakuFilterRules = 'danmakuFilterRules',\n      mixinKey = 'mixinKey',\n      timeStamp = 'timeStamp',\n      buvid = 'buvid';\n}\n\nabstract final class VideoBoxKey {\n  static const String playRepeat = 'playRepeat',\n      playSpeedDefault = 'playSpeedDefault',\n      longPressSpeedDefault = 'longPressSpeedDefault',\n      speedsList = 'speedsList',\n      cacheVideoFit = 'cacheVideoFit';\n}\n"
  },
  {
    "path": "lib/utils/storage_pref.dart",
    "content": "import 'dart:io';\nimport 'dart:math' show pow, sqrt;\n\nimport 'package:PiliPlus/common/widgets/pair.dart';\nimport 'package:PiliPlus/http/constants.dart';\nimport 'package:PiliPlus/models/common/bar_hide_type.dart';\nimport 'package:PiliPlus/models/common/dynamic/dynamic_badge_mode.dart';\nimport 'package:PiliPlus/models/common/dynamic/dynamics_type.dart';\nimport 'package:PiliPlus/models/common/dynamic/up_panel_position.dart';\nimport 'package:PiliPlus/models/common/follow_order_type.dart';\nimport 'package:PiliPlus/models/common/member/tab_type.dart';\nimport 'package:PiliPlus/models/common/msg/msg_unread_type.dart';\nimport 'package:PiliPlus/models/common/nav_bar_config.dart';\nimport 'package:PiliPlus/models/common/reply/reply_sort_type.dart';\nimport 'package:PiliPlus/models/common/sponsor_block/segment_type.dart';\nimport 'package:PiliPlus/models/common/sponsor_block/skip_type.dart';\nimport 'package:PiliPlus/models/common/super_chat_type.dart';\nimport 'package:PiliPlus/models/common/super_resolution_type.dart';\nimport 'package:PiliPlus/models/common/theme/theme_type.dart';\nimport 'package:PiliPlus/models/common/video/audio_quality.dart';\nimport 'package:PiliPlus/models/common/video/cdn_type.dart';\nimport 'package:PiliPlus/models/common/video/live_quality.dart';\nimport 'package:PiliPlus/models/common/video/subtitle_pref_type.dart';\nimport 'package:PiliPlus/models/common/video/video_decode_type.dart';\nimport 'package:PiliPlus/models/common/video/video_quality.dart';\nimport 'package:PiliPlus/models/user/danmaku_rule.dart';\nimport 'package:PiliPlus/models/user/info.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/audio_output_type.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/bottom_progress_behavior.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/fullscreen_mode.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/hwdec_type.dart';\nimport 'package:PiliPlus/plugin/pl_player/models/play_repeat.dart';\nimport 'package:PiliPlus/utils/extension/context_ext.dart';\nimport 'package:PiliPlus/utils/extension/iterable_ext.dart';\nimport 'package:PiliPlus/utils/global_data.dart';\nimport 'package:PiliPlus/utils/login_utils.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:crypto/crypto.dart';\nimport 'package:flex_seed_scheme/flex_seed_scheme.dart' show FlexSchemeVariant;\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:hive_ce/hive.dart';\n\nabstract final class Pref {\n  static final Box _setting = GStorage.setting;\n  static final Box _video = GStorage.video;\n  static final Box _localCache = GStorage.localCache;\n\n  static UserInfoData? get userInfoCache =>\n      GStorage.userInfo.get('userInfoCache');\n\n  static List<double> get dynamicDetailRatio => List<double>.from(\n    _setting.get(\n      SettingBoxKey.dynamicDetailRatio,\n      defaultValue: const [60.0, 40.0],\n    ),\n  );\n\n  static Set<int> get blackMids =>\n      _localCache.get(LocalCacheKey.blackMids, defaultValue: <int>{});\n\n  static set blackMids(Set<int> blackMidsSet) =>\n      _localCache.put(LocalCacheKey.blackMids, blackMidsSet);\n\n  static RuleFilter get danmakuFilterRule => _localCache.get(\n    LocalCacheKey.danmakuFilterRules,\n    defaultValue: RuleFilter.empty(),\n  );\n\n  static void setBlackMid(int mid) => _localCache.put(\n    LocalCacheKey.blackMids,\n    GlobalData().blackMids..add(mid),\n  );\n\n  static void removeBlackMid(int mid) => _localCache.put(\n    LocalCacheKey.blackMids,\n    GlobalData().blackMids..remove(mid),\n  );\n\n  static MemberTabType get memberTab =>\n      MemberTabType.values[_setting.get(\n        SettingBoxKey.memberTab,\n        defaultValue: 0,\n      )];\n\n  static int get _themeTypeInt => _setting.get(\n    SettingBoxKey.themeMode,\n    defaultValue: ThemeType.system.index,\n  );\n\n  static ThemeType get themeType => ThemeType.values[_themeTypeInt];\n\n  static ThemeMode get themeMode => switch (_themeTypeInt) {\n    0 => ThemeMode.light,\n    1 => ThemeMode.dark,\n    _ => ThemeMode.system,\n  };\n\n  static List<double> get springDescription => List<double>.from(\n    _setting.get(SettingBoxKey.springDescription) ??\n        [0.5, 100.0, 2.2 * sqrt(50)], // [mass, stiffness, damping]\n  );\n\n  static List<double> get speedList => List<double>.from(\n    _video.get(\n      VideoBoxKey.speedsList,\n      defaultValue: const [0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 3.0],\n    ),\n  );\n\n  static List<Pair<SegmentType, SkipType>> get blockSettings {\n    final list = _setting.get(SettingBoxKey.blockSettings) as List?;\n    if (list == null || list.length != SegmentType.values.length) {\n      return SegmentType.values\n          .map((i) => Pair(first: i, second: SkipType.skipOnce))\n          .toList();\n    }\n    return SegmentType.values\n        .map(\n          (item) => Pair(\n            first: item,\n            second: SkipType.values[list[item.index]],\n          ),\n        )\n        .toList();\n  }\n\n  static List<Color> get blockColor {\n    final list = _setting.get(SettingBoxKey.blockColor) as List?;\n    if (list == null || list.length != SegmentType.values.length) {\n      return SegmentType.values.map((i) => i.color).toList();\n    }\n    return SegmentType.values.map(\n      (item) {\n        final String e = list[item.index];\n        final color = e.isNotEmpty ? int.tryParse('FF$e', radix: 16) : null;\n        return color != null ? Color(color) : item.color;\n      },\n    ).toList();\n  }\n\n  static bool get feedBackEnable =>\n      _setting.get(SettingBoxKey.feedBackEnable, defaultValue: false);\n\n  static int get picQuality =>\n      _setting.get(SettingBoxKey.defaultPicQa, defaultValue: 10);\n\n  static DynamicBadgeMode get dynamicBadgeType =>\n      DynamicBadgeMode.values[_setting.get(\n        SettingBoxKey.dynamicBadgeMode,\n        defaultValue: DynamicBadgeMode.number.index,\n      )];\n\n  static DynamicBadgeMode get msgBadgeMode =>\n      DynamicBadgeMode.values[_setting.get(\n        SettingBoxKey.msgBadgeMode,\n        defaultValue: DynamicBadgeMode.number.index,\n      )];\n\n  static Set<MsgUnReadType> get msgUnReadTypeV2 =>\n      (_setting.get(SettingBoxKey.msgUnReadTypeV2) as List?)\n          ?.map((index) => MsgUnReadType.values[index])\n          .toSet() ??\n      MsgUnReadType.values.toSet();\n\n  static NavigationBarType get defaultHomePage =>\n      NavigationBarType.values[defaultHomePageIndex];\n\n  static int get defaultHomePageIndex => _setting.get(\n    SettingBoxKey.defaultHomePage,\n    defaultValue: NavigationBarType.home.index,\n  );\n\n  static int get previewQ =>\n      _setting.get(SettingBoxKey.previewQuality, defaultValue: 100);\n\n  static double get smallCardWidth =>\n      _setting.get(SettingBoxKey.smallCardWidth, defaultValue: 240.0);\n\n  static double get recommendCardWidth =>\n      _setting.get(SettingBoxKey.recommendCardWidth, defaultValue: 240.0);\n\n  static UpPanelPosition get upPanelPosition =>\n      UpPanelPosition.values[_setting.get(\n        SettingBoxKey.upPanelPosition,\n        defaultValue: UpPanelPosition.leftFixed.index,\n      )];\n\n  static FullScreenMode get fullScreenMode =>\n      FullScreenMode.values[_setting.get(\n        SettingBoxKey.fullScreenMode,\n        defaultValue: FullScreenMode.auto.index,\n      )];\n\n  static BtmProgressBehavior get btmProgressBehavior =>\n      BtmProgressBehavior.values[_setting.get(\n        SettingBoxKey.btmProgressBehavior,\n        defaultValue: BtmProgressBehavior.alwaysShow.index,\n      )];\n\n  static SubtitlePrefType get subtitlePreferenceV2 =>\n      SubtitlePrefType.values[_setting.get(\n        SettingBoxKey.subtitlePreferenceV2,\n        defaultValue: SubtitlePrefType.off.index,\n      )];\n\n  static bool get useRelativeSlide =>\n      _setting.get(SettingBoxKey.useRelativeSlide, defaultValue: false);\n\n  static int get sliderDuration =>\n      _setting.get(SettingBoxKey.sliderDuration, defaultValue: 90);\n\n  static int get defaultVideoQa => _setting.get(\n    SettingBoxKey.defaultVideoQa,\n    defaultValue: VideoQuality.super8k.code,\n  );\n\n  static int get defaultVideoQaCellular => _setting.get(\n    SettingBoxKey.defaultVideoQaCellular,\n    defaultValue: VideoQuality.high1080.code,\n  );\n\n  static int get defaultAudioQa => _setting.get(\n    SettingBoxKey.defaultAudioQa,\n    defaultValue: AudioQuality.hiRes.code,\n  );\n\n  static int get defaultAudioQaCellular => _setting.get(\n    SettingBoxKey.defaultAudioQaCellular,\n    defaultValue: AudioQuality.k192.code,\n  );\n\n  static String get defaultDecode => _setting.get(\n    SettingBoxKey.defaultDecode,\n    defaultValue: VideoDecodeFormatType.AVC.codes.first,\n  );\n\n  static String get secondDecode => _setting.get(\n    SettingBoxKey.secondDecode,\n    defaultValue: VideoDecodeFormatType.AV1.codes.first,\n  );\n\n  static String get hardwareDecoding => _setting.get(\n    SettingBoxKey.hardwareDecoding,\n    defaultValue: Platform.isAndroid\n        ? HwDecType.autoSafe.hwdec\n        : HwDecType.auto.hwdec,\n  );\n\n  static String get videoSync =>\n      _setting.get(SettingBoxKey.videoSync, defaultValue: 'display-resample');\n\n  static String get autosync => _setting.get(\n    SettingBoxKey.autosync,\n    defaultValue: Platform.isAndroid ? '30' : '0',\n  );\n\n  static CDNService get defaultCDNService {\n    if (_setting.get(SettingBoxKey.CDNService) case final String cdnName) {\n      return CDNService.values.byName(cdnName);\n    }\n    return CDNService.backupUrl;\n  }\n\n  static String get banWordForRecommend =>\n      _setting.get(SettingBoxKey.banWordForRecommend, defaultValue: '');\n\n  static String get banWordForReply =>\n      _setting.get(SettingBoxKey.banWordForReply, defaultValue: '');\n\n  static String get banWordForZone =>\n      _setting.get(SettingBoxKey.banWordForZone, defaultValue: '');\n\n  static bool get appRcmd =>\n      _setting.get(SettingBoxKey.appRcmd, defaultValue: true);\n\n  static String get systemProxyHost =>\n      _setting.get(SettingBoxKey.systemProxyHost, defaultValue: '');\n\n  static String get systemProxyPort =>\n      _setting.get(SettingBoxKey.systemProxyPort, defaultValue: '');\n\n  static DynamicsTabType get defaultDynamicType =>\n      DynamicsTabType.values[defaultDynamicTypeIndex];\n\n  static int get defaultDynamicTypeIndex => _setting.get(\n    SettingBoxKey.defaultDynamicType,\n    defaultValue: DynamicsTabType.all.index,\n  );\n\n  static bool get showDynInteraction =>\n      _setting.get(SettingBoxKey.showDynInteraction, defaultValue: true);\n\n  static double get blockLimit =>\n      _setting.get(SettingBoxKey.blockLimit, defaultValue: 0.0);\n\n  static double get refreshDragPercentage =>\n      _setting.get(SettingBoxKey.refreshDragPercentage, defaultValue: 0.25);\n\n  static double get refreshDisplacement => _setting.get(\n    SettingBoxKey.refreshDisplacement,\n    defaultValue: PlatformUtils.isMobile ? 20.0 : 40.0,\n  );\n\n  static String get blockUserID {\n    String? blockUserID = _setting.get(SettingBoxKey.blockUserID);\n    if (blockUserID == null || blockUserID.isEmpty) {\n      blockUserID = Digest(\n        List.generate(16, (_) => Utils.random.nextInt(256)),\n      ).toString();\n      _setting.put(SettingBoxKey.blockUserID, blockUserID);\n    }\n    return blockUserID;\n  }\n\n  static bool get blockToast =>\n      _setting.get(SettingBoxKey.blockToast, defaultValue: true);\n\n  static String get blockServer => _setting.get(\n    SettingBoxKey.blockServer,\n    defaultValue: HttpString.sponsorBlockBaseUrl,\n  );\n\n  static bool get blockTrack =>\n      _setting.get(SettingBoxKey.blockTrack, defaultValue: !kDebugMode);\n\n  static bool get checkDynamic =>\n      _setting.get(SettingBoxKey.checkDynamic, defaultValue: true);\n\n  static int get dynamicPeriod =>\n      _setting.get(SettingBoxKey.dynamicPeriod, defaultValue: 5);\n\n  static FlexSchemeVariant get schemeVariant =>\n      FlexSchemeVariant.values[_setting.get(\n        SettingBoxKey.schemeVariant,\n        defaultValue: FlexSchemeVariant.material3Legacy.index,\n      )];\n\n  static double get danmakuFontScaleFS => _setting.get(\n    SettingBoxKey.danmakuFontScaleFS,\n    defaultValue: PlatformUtils.isMobile ? 1.2 : 1.7,\n  );\n\n  static bool get danmakuMassiveMode =>\n      _setting.get(SettingBoxKey.danmakuMassiveMode, defaultValue: false);\n\n  static bool get danmakuFixedV =>\n      _setting.get(SettingBoxKey.danmakuFixedV, defaultValue: false);\n\n  static bool get danmakuStatic2Scroll =>\n      _setting.get(SettingBoxKey.danmakuStatic2Scroll, defaultValue: false);\n\n  static double get subtitleFontScale =>\n      _setting.get(SettingBoxKey.subtitleFontScale, defaultValue: 1.0);\n\n  static double get subtitleFontScaleFS =>\n      _setting.get(SettingBoxKey.subtitleFontScaleFS, defaultValue: 1.5);\n\n  static bool get showViewPoints =>\n      _setting.get(SettingBoxKey.showViewPoints, defaultValue: true);\n\n  static bool get showRelatedVideo =>\n      _setting.get(SettingBoxKey.showRelatedVideo, defaultValue: true);\n\n  static bool get showVideoReply =>\n      _setting.get(SettingBoxKey.showVideoReply, defaultValue: true);\n\n  static bool get showBangumiReply =>\n      _setting.get(SettingBoxKey.showBangumiReply, defaultValue: true);\n\n  static bool get alwaysExpandIntroPanel =>\n      _setting.get(SettingBoxKey.alwaysExpandIntroPanel, defaultValue: false);\n\n  static bool get expandIntroPanelH =>\n      _setting.get(SettingBoxKey.expandIntroPanelH, defaultValue: false);\n\n  static bool get horizontalSeasonPanel => _setting.get(\n    SettingBoxKey.horizontalSeasonPanel,\n    defaultValue: PlatformUtils.isDesktop,\n  );\n\n  static bool get horizontalMemberPage => _setting.get(\n    SettingBoxKey.horizontalMemberPage,\n    defaultValue: PlatformUtils.isDesktop,\n  );\n\n  static int? get replyLengthLimit {\n    int length = _setting.get(SettingBoxKey.replyLengthLimit, defaultValue: 6);\n    if (length <= 0) {\n      return null;\n    }\n    return length;\n  }\n\n  static int get defaultPicQa =>\n      _setting.get(SettingBoxKey.defaultPicQa, defaultValue: 10);\n\n  static double get danmakuLineHeight =>\n      _setting.get(SettingBoxKey.danmakuLineHeight, defaultValue: 1.6);\n\n  static bool get showArgueMsg =>\n      _setting.get(SettingBoxKey.showArgueMsg, defaultValue: true);\n\n  static bool get reverseFromFirst =>\n      _setting.get(SettingBoxKey.reverseFromFirst, defaultValue: true);\n\n  static int get subtitlePaddingH =>\n      _setting.get(SettingBoxKey.subtitlePaddingH, defaultValue: 24);\n\n  static int get subtitlePaddingB =>\n      _setting.get(SettingBoxKey.subtitlePaddingB, defaultValue: 24);\n\n  static double get subtitleBgOpacity =>\n      _setting.get(SettingBoxKey.subtitleBgOpacity, defaultValue: 0.67);\n\n  static double get subtitleStrokeWidth =>\n      _setting.get(SettingBoxKey.subtitleStrokeWidth, defaultValue: 2.0);\n\n  static int get subtitleFontWeight =>\n      _setting.get(SettingBoxKey.subtitleFontWeight, defaultValue: 5);\n\n  static bool get badCertificateCallback =>\n      _setting.get(SettingBoxKey.badCertificateCallback, defaultValue: false);\n\n  static bool get continuePlayingPart =>\n      _setting.get(SettingBoxKey.continuePlayingPart, defaultValue: true);\n\n  static bool get cdnSpeedTest =>\n      _setting.get(SettingBoxKey.cdnSpeedTest, defaultValue: true);\n\n  static bool get autoUpdate =>\n      _setting.get(SettingBoxKey.autoUpdate, defaultValue: true);\n\n  static bool get horizontalPreview =>\n      _setting.get(SettingBoxKey.horizontalPreview, defaultValue: false);\n\n  static bool get openInBrowser =>\n      _setting.get(SettingBoxKey.openInBrowser, defaultValue: false);\n\n  static bool get savedRcmdTip =>\n      _setting.get(SettingBoxKey.savedRcmdTip, defaultValue: true);\n\n  static bool get showVipDanmaku =>\n      _setting.get(SettingBoxKey.showVipDanmaku, defaultValue: true);\n\n  static bool get mergeDanmaku =>\n      _setting.get(SettingBoxKey.mergeDanmaku, defaultValue: false);\n\n  static bool get showHotRcmd =>\n      _setting.get(SettingBoxKey.showHotRcmd, defaultValue: false);\n\n  static String get audioNormalization =>\n      _setting.get(SettingBoxKey.audioNormalization, defaultValue: '0');\n\n  static String get fallbackNormalization =>\n      _setting.get(SettingBoxKey.fallbackNormalization, defaultValue: '0');\n\n  static SuperResolutionType get superResolutionType {\n    SuperResolutionType? superResolutionType;\n    final index = _setting.get(SettingBoxKey.superResolutionType);\n    if (index != null) {\n      superResolutionType = SuperResolutionType.values.elementAtOrNull(index);\n    }\n    return superResolutionType ?? SuperResolutionType.disable;\n  }\n\n  static bool get preInitPlayer =>\n      _setting.get(SettingBoxKey.preInitPlayer, defaultValue: false);\n\n  static bool get mainTabBarView =>\n      _setting.get(SettingBoxKey.mainTabBarView, defaultValue: false);\n\n  static bool get searchSuggestion =>\n      _setting.get(SettingBoxKey.searchSuggestion, defaultValue: true);\n\n  static bool get showDynDecorate =>\n      _setting.get(SettingBoxKey.showDynDecorate, defaultValue: true);\n\n  static bool get enableLivePhoto =>\n      _setting.get(SettingBoxKey.enableLivePhoto, defaultValue: true);\n\n  static bool get showSeekPreview =>\n      _setting.get(SettingBoxKey.showSeekPreview, defaultValue: true);\n\n  static bool get showDmChart =>\n      _setting.get(SettingBoxKey.showDmChart, defaultValue: false);\n\n  static bool get enableCommAntifraud =>\n      _setting.get(SettingBoxKey.enableCommAntifraud, defaultValue: false);\n\n  static bool get biliSendCommAntifraud =>\n      Platform.isAndroid &&\n      _setting.get(SettingBoxKey.biliSendCommAntifraud, defaultValue: false);\n\n  static bool get enableCreateDynAntifraud =>\n      _setting.get(SettingBoxKey.enableCreateDynAntifraud, defaultValue: false);\n\n  static bool get coinWithLike =>\n      _setting.get(SettingBoxKey.coinWithLike, defaultValue: false);\n\n  static bool get isPureBlackTheme =>\n      _setting.get(SettingBoxKey.isPureBlackTheme, defaultValue: false);\n\n  static bool get antiGoodsDyn =>\n      _setting.get(SettingBoxKey.antiGoodsDyn, defaultValue: false);\n\n  static bool get antiGoodsReply =>\n      _setting.get(SettingBoxKey.antiGoodsReply, defaultValue: false);\n\n  static bool get expandDynLivePanel =>\n      _setting.get(SettingBoxKey.expandDynLivePanel, defaultValue: false);\n\n  static bool get slideDismissReplyPage => _setting.get(\n    SettingBoxKey.slideDismissReplyPage,\n    defaultValue: Platform.isIOS,\n  );\n\n  static bool get showFSActionItem =>\n      _setting.get(SettingBoxKey.showFSActionItem, defaultValue: true);\n\n  static bool get enableShrinkVideoSize =>\n      _setting.get(SettingBoxKey.enableShrinkVideoSize, defaultValue: true);\n\n  static bool get showDynActionBar =>\n      _setting.get(SettingBoxKey.showDynActionBar, defaultValue: true);\n\n  static bool get darkVideoPage =>\n      _setting.get(SettingBoxKey.darkVideoPage, defaultValue: false);\n\n  static bool get enableSlideVolumeBrightness => _setting.get(\n    SettingBoxKey.enableSlideVolumeBrightness,\n    defaultValue: true,\n  );\n\n  static bool get enableSlideFS =>\n      _setting.get(SettingBoxKey.enableSlideFS, defaultValue: true);\n\n  static int get retryCount =>\n      _setting.get(SettingBoxKey.retryCount, defaultValue: 2);\n\n  static int get retryDelay =>\n      _setting.get(SettingBoxKey.retryDelay, defaultValue: 500);\n\n  static int get liveQuality => _setting.get(\n    SettingBoxKey.liveQuality,\n    defaultValue: LiveQuality.origin.code,\n  );\n\n  static int get liveQualityCellular => _setting.get(\n    SettingBoxKey.liveQualityCellular,\n    defaultValue: LiveQuality.superHD.code,\n  );\n\n  static int get appFontWeight =>\n      _setting.get(SettingBoxKey.appFontWeight, defaultValue: -1);\n\n  static bool get enableDragSubtitle =>\n      _setting.get(SettingBoxKey.enableDragSubtitle, defaultValue: false);\n\n  static int get fastForBackwardDuration =>\n      _setting.get(SettingBoxKey.fastForBackwardDuration, defaultValue: 10);\n\n  static bool get recordSearchHistory =>\n      _setting.get(SettingBoxKey.recordSearchHistory, defaultValue: true);\n\n  static String get webdavUri =>\n      _setting.get(SettingBoxKey.webdavUri, defaultValue: '');\n\n  static String get webdavUsername =>\n      _setting.get(SettingBoxKey.webdavUsername, defaultValue: '');\n\n  static String get webdavPassword =>\n      _setting.get(SettingBoxKey.webdavPassword, defaultValue: '');\n\n  static String get webdavDirectory =>\n      _setting.get(SettingBoxKey.webdavDirectory, defaultValue: '/');\n\n  static bool get showPgcTimeline =>\n      _setting.get(SettingBoxKey.showPgcTimeline, defaultValue: true);\n\n  static num get maxCacheSize =>\n      _setting.get(SettingBoxKey.maxCacheSize) ?? pow(1024, 3);\n\n  static bool get optTabletNav =>\n      _setting.get(SettingBoxKey.optTabletNav, defaultValue: true);\n\n  static bool get horizontalScreen =>\n      _setting.get(SettingBoxKey.horizontalScreen) ?? isTablet;\n\n  static bool get isTablet {\n    bool isTablet;\n    if (Get.context != null) {\n      isTablet = Get.context!.isTablet;\n    } else {\n      final view = WidgetsBinding.instance.platformDispatcher.views.first;\n      final screenSize = view.physicalSize / view.devicePixelRatio;\n      isTablet = screenSize.shortestSide >= 600;\n    }\n    _setting.put(SettingBoxKey.horizontalScreen, isTablet);\n    return isTablet;\n  }\n\n  static String get banWordForDyn =>\n      _setting.get(SettingBoxKey.banWordForDyn, defaultValue: '');\n\n  static bool get enableLog =>\n      _setting.get(SettingBoxKey.enableLog, defaultValue: true);\n\n  static bool get disableAudioCDN =>\n      _setting.get(SettingBoxKey.disableAudioCDN, defaultValue: false);\n\n  static int get minDurationForRcmd =>\n      _setting.get(SettingBoxKey.minDurationForRcmd, defaultValue: 0);\n\n  static int get minPlayForRcmd =>\n      _setting.get(SettingBoxKey.minPlayForRcmd, defaultValue: 0);\n\n  static int get minLikeRatioForRecommend =>\n      _setting.get(SettingBoxKey.minLikeRatioForRecommend, defaultValue: 0);\n\n  static bool get exemptFilterForFollowed =>\n      _setting.get(SettingBoxKey.exemptFilterForFollowed, defaultValue: true);\n\n  static bool get applyFilterToRelatedVideos => _setting.get(\n    SettingBoxKey.applyFilterToRelatedVideos,\n    defaultValue: true,\n  );\n\n  static bool get enableBackgroundPlay =>\n      _setting.get(SettingBoxKey.enableBackgroundPlay, defaultValue: true);\n\n  static bool get allowRotateScreen =>\n      _setting.get(SettingBoxKey.allowRotateScreen, defaultValue: true);\n\n  static bool get disableLikeMsg =>\n      _setting.get(SettingBoxKey.disableLikeMsg, defaultValue: false);\n\n  static bool get enableWordRe =>\n      _setting.get(SettingBoxKey.enableWordRe, defaultValue: false);\n\n  static bool get autoExitFullscreen =>\n      _setting.get(SettingBoxKey.enableAutoExit, defaultValue: true);\n\n  static bool get autoPlayEnable =>\n      _setting.get(SettingBoxKey.autoPlayEnable, defaultValue: false);\n\n  static bool get pipNoDanmaku =>\n      _setting.get(SettingBoxKey.pipNoDanmaku, defaultValue: false);\n\n  static bool get enableVerticalExpand =>\n      _setting.get(SettingBoxKey.enableVerticalExpand, defaultValue: false);\n\n  static double get defaultTextScale =>\n      _setting.get(SettingBoxKey.defaultTextScale, defaultValue: 1.0);\n\n  static double get uiScale =>\n      _setting.get(SettingBoxKey.uiScale, defaultValue: 1.0);\n\n  static bool get dynamicsWaterfallFlow =>\n      _setting.get(SettingBoxKey.dynamicsWaterfallFlow, defaultValue: true);\n\n  static bool get hideTopBar => _setting.get(\n    SettingBoxKey.hideTopBar,\n    defaultValue: PlatformUtils.isMobile,\n  );\n\n  static bool get hideBottomBar => _setting.get(\n    SettingBoxKey.hideBottomBar,\n    defaultValue: PlatformUtils.isMobile,\n  );\n\n  static BarHideType get barHideType =>\n      BarHideType.values[_setting.get(\n        SettingBoxKey.barHideType,\n        defaultValue: BarHideType.sync.index,\n      )];\n\n  static bool get enableSearchWord =>\n      _setting.get(SettingBoxKey.enableSearchWord, defaultValue: false);\n\n  static bool get useSideBar =>\n      _setting.get(SettingBoxKey.useSideBar, defaultValue: false);\n\n  static bool get dynamicsShowAllFollowedUp => _setting.get(\n    SettingBoxKey.dynamicsShowAllFollowedUp,\n    defaultValue: false,\n  );\n\n  static bool get enableShowDanmaku =>\n      _setting.get(SettingBoxKey.enableShowDanmaku, defaultValue: true);\n\n  static bool get enableShowLiveDanmaku =>\n      _setting.get(SettingBoxKey.enableShowLiveDanmaku, defaultValue: true);\n\n  static bool get enableQuickFav =>\n      _setting.get(SettingBoxKey.enableQuickFav, defaultValue: false);\n\n  static bool get p1080 =>\n      _setting.get(SettingBoxKey.p1080, defaultValue: true);\n\n  static int get customColor =>\n      _setting.get(SettingBoxKey.customColor, defaultValue: 0);\n\n  static bool get dynamicColor =>\n      !Platform.isIOS &&\n      _setting.get(SettingBoxKey.dynamicColor, defaultValue: true);\n\n  static bool get autoClearCache =>\n      _setting.get(SettingBoxKey.autoClearCache, defaultValue: false);\n\n  static bool get enableSystemProxy =>\n      _setting.get(SettingBoxKey.enableSystemProxy, defaultValue: false);\n\n  static bool get enableHttp2 =>\n      _setting.get(SettingBoxKey.enableHttp2, defaultValue: false);\n\n  static ReplySortType get replySortType =>\n      ReplySortType.values[_setting.get(\n        SettingBoxKey.replySortType,\n        defaultValue: ReplySortType.hot.index,\n      )];\n\n  static DynamicBadgeMode get dynamicBadgeMode =>\n      DynamicBadgeMode.values[_setting.get(\n        SettingBoxKey.dynamicBadgeMode,\n        defaultValue: DynamicBadgeMode.number.index,\n      )];\n\n  static bool get enableMYBar =>\n      _setting.get(SettingBoxKey.enableMYBar, defaultValue: true);\n\n  static Transition get pageTransition =>\n      Transition.values[_setting.get(\n        SettingBoxKey.pageTransition,\n        defaultValue: Transition.native.index,\n      )];\n\n  static bool get enableQuickDouble =>\n      _setting.get(SettingBoxKey.enableQuickDouble, defaultValue: true);\n\n  static bool get fullScreenGestureReverse =>\n      _setting.get(SettingBoxKey.fullScreenGestureReverse, defaultValue: false);\n\n  static bool get autoPiP =>\n      _setting.get(SettingBoxKey.autoPiP, defaultValue: false);\n\n  static bool get enableSponsorBlock =>\n      _setting.get(SettingBoxKey.enableSponsorBlock, defaultValue: false);\n\n  static bool get enableHA =>\n      _setting.get(SettingBoxKey.enableHA, defaultValue: true);\n\n  static Set<int> get danmakuBlockType => Set<int>.from(\n    _setting.get(SettingBoxKey.danmakuBlockType, defaultValue: const <int>{}),\n  );\n\n  static int get danmakuWeight =>\n      _setting.get(SettingBoxKey.danmakuWeight, defaultValue: 0);\n\n  static double get danmakuShowArea =>\n      _setting.get(SettingBoxKey.danmakuShowArea, defaultValue: 0.5);\n\n  static double get danmakuOpacity =>\n      _setting.get(SettingBoxKey.danmakuOpacity, defaultValue: 1.0);\n\n  static double get danmakuFontScale => _setting.get(\n    SettingBoxKey.danmakuFontScale,\n    defaultValue: PlatformUtils.isMobile ? 1.0 : 1.4,\n  );\n\n  static double get danmakuDuration =>\n      _setting.get(SettingBoxKey.danmakuDuration, defaultValue: 7.0);\n\n  static double get danmakuStaticDuration =>\n      _setting.get(SettingBoxKey.danmakuStaticDuration, defaultValue: 4.0);\n\n  static double get danmakuStrokeWidth => _setting.get(\n    SettingBoxKey.danmakuStrokeWidth,\n    defaultValue: PlatformUtils.isMobile ? 1.5 : 2.5,\n  );\n\n  static int get danmakuFontWeight => _setting.get(\n    SettingBoxKey.danmakuFontWeight,\n    defaultValue: PlatformUtils.isMobile ? 5 : 6,\n  );\n\n  static bool get enableLongShowControl =>\n      _setting.get(SettingBoxKey.enableLongShowControl, defaultValue: false);\n\n  static bool get expandBuffer =>\n      _setting.get(SettingBoxKey.expandBuffer, defaultValue: false);\n\n  static String get audioOutput => _setting.get(\n    SettingBoxKey.audioOutput,\n    defaultValue: AudioOutput.defaultValue,\n  );\n\n  static bool get enableAi =>\n      _setting.get(SettingBoxKey.enableAi, defaultValue: false);\n\n  static bool get enableOnlineTotal =>\n      _setting.get(SettingBoxKey.enableOnlineTotal, defaultValue: false);\n\n  static bool get autoEnterFullScreen =>\n      _setting.get(SettingBoxKey.enableAutoEnter, defaultValue: false);\n\n  static bool get enableAutoLongPressSpeed =>\n      _setting.get(SettingBoxKey.enableAutoLongPressSpeed, defaultValue: false);\n\n  static double get playSpeedDefault =>\n      _video.get(VideoBoxKey.playSpeedDefault, defaultValue: 1.0);\n\n  static double get longPressSpeedDefault =>\n      _video.get(VideoBoxKey.longPressSpeedDefault, defaultValue: 3.0);\n\n  static bool get defaultShowComment =>\n      _setting.get(SettingBoxKey.defaultShowComment, defaultValue: false);\n\n  static bool get enableTrending =>\n      _setting.get(SettingBoxKey.enableHotKey, defaultValue: true);\n\n  static bool get enableSearchRcmd =>\n      _setting.get(SettingBoxKey.enableSearchRcmd, defaultValue: true);\n\n  static bool get enableSaveLastData =>\n      _setting.get(SettingBoxKey.enableSaveLastData, defaultValue: true);\n\n  static double get defaultToastOp =>\n      _setting.get(SettingBoxKey.defaultToastOp, defaultValue: 1.0);\n\n  static PlayRepeat get playRepeat =>\n      PlayRepeat.values[_video.get(\n        VideoBoxKey.playRepeat,\n        defaultValue: PlayRepeat.pause.index,\n      )];\n\n  static int get cacheVideoFit =>\n      _video.get(VideoBoxKey.cacheVideoFit, defaultValue: 1);\n\n  static bool get continuePlayInBackground =>\n      _setting.get(SettingBoxKey.continuePlayInBackground, defaultValue: false);\n\n  static bool get directExitOnBack =>\n      _setting.get(SettingBoxKey.directExitOnBack, defaultValue: false);\n\n  static bool get historyPause =>\n      _localCache.get(LocalCacheKey.historyPause, defaultValue: false);\n\n  static int? get quickFavId => _setting.get(SettingBoxKey.quickFavId);\n\n  static bool get tempPlayerConf =>\n      _setting.get(SettingBoxKey.tempPlayerConf, defaultValue: false);\n\n  static Color? get reduceLuxColor {\n    final int? color = _setting.get(SettingBoxKey.reduceLuxColor);\n    if (color != null && color != 0xFFFFFFFF) {\n      return Color(color);\n    }\n    return null;\n  }\n\n  static bool get showFsScreenshotBtn =>\n      _setting.get(SettingBoxKey.showFsScreenshotBtn, defaultValue: true);\n\n  static bool get showFsLockBtn =>\n      _setting.get(SettingBoxKey.showFsLockBtn, defaultValue: true);\n\n  static bool get silentDownImg =>\n      _setting.get(SettingBoxKey.silentDownImg, defaultValue: false);\n\n  static String get buvid {\n    String? buvid = _localCache.get(LocalCacheKey.buvid);\n    if (buvid == null) {\n      buvid = LoginUtils.generateBuvid();\n      _localCache.put(LocalCacheKey.buvid, buvid);\n    }\n    return buvid;\n  }\n\n  static bool get showMemberShop =>\n      _setting.get(SettingBoxKey.showMemberShop, defaultValue: false);\n\n  static SuperChatType get superChatType =>\n      SuperChatType.values[_setting.get(\n        SettingBoxKey.superChatType,\n        defaultValue: SuperChatType.valid.index,\n      )];\n\n  static bool get minimizeOnExit =>\n      _setting.get(SettingBoxKey.minimizeOnExit, defaultValue: true);\n\n  static Size get windowSize {\n    final List<double>? size = (_setting.get(SettingBoxKey.windowSize) as List?)\n        ?.fromCast<double>();\n    return size == null ? const Size(1180.0, 720.0) : Size(size[0], size[1]);\n  }\n\n  static List<double>? get windowPosition =>\n      (_setting.get(SettingBoxKey.windowPosition) as List?)?.fromCast<double>();\n\n  static bool get isWindowMaximized =>\n      _setting.get(SettingBoxKey.isWindowMaximized, defaultValue: false);\n\n  static bool get keyboardControl =>\n      _setting.get(SettingBoxKey.keyboardControl, defaultValue: true);\n\n  static bool get pauseOnMinimize =>\n      _setting.get(SettingBoxKey.pauseOnMinimize, defaultValue: false);\n\n  static bool get showWindowTitleBar =>\n      _setting.get(SettingBoxKey.showWindowTitleBar, defaultValue: true);\n\n  static double get desktopVolume =>\n      _setting.get(SettingBoxKey.desktopVolume, defaultValue: 1.0);\n\n  static SkipType get pgcSkipType =>\n      SkipType.values[_setting.get(SettingBoxKey.pgcSkipType) ??\n          SkipType.skipOnce.index];\n\n  static PlayRepeat get audioPlayMode =>\n      PlayRepeat.values[_setting.get(SettingBoxKey.audioPlayMode) ??\n          PlayRepeat.listOrder.index];\n\n  static bool get enablePlayAll =>\n      _setting.get(SettingBoxKey.enablePlayAll, defaultValue: true);\n\n  static bool get enableTapDm =>\n      _setting.get(SettingBoxKey.enableTapDm, defaultValue: true);\n\n  static bool get showTrayIcon =>\n      _setting.get(SettingBoxKey.showTrayIcon, defaultValue: true);\n\n  static bool get setSystemBrightness =>\n      _setting.get(SettingBoxKey.setSystemBrightness, defaultValue: false);\n\n  static String? get downloadPath => _setting.get(SettingBoxKey.downloadPath);\n\n  static String? get liveCdnUrl => _setting.get(SettingBoxKey.liveCdnUrl);\n\n  static bool get showBatteryLevel => _setting.get(\n    SettingBoxKey.showBatteryLevel,\n    defaultValue: PlatformUtils.isMobile,\n  );\n\n  static FollowOrderType get followOrderType =>\n      FollowOrderType.values[_setting.get(\n        SettingBoxKey.followOrderType,\n        defaultValue: FollowOrderType.def.index,\n      )];\n\n  static bool get enableImgMenu =>\n      _setting.get(SettingBoxKey.enableImgMenu, defaultValue: false);\n\n  static bool get showDynDispute =>\n      _setting.get(SettingBoxKey.showDynDispute, defaultValue: false);\n\n  static double get touchSlopH =>\n      _setting.get(SettingBoxKey.touchSlopH, defaultValue: 24.0);\n\n  static bool get saveReply =>\n      _setting.get(SettingBoxKey.saveReply, defaultValue: true);\n}\n"
  },
  {
    "path": "lib/utils/theme_utils.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/main.dart';\nimport 'package:PiliPlus/utils/extension/theme_ext.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\n\nabstract final class ThemeUtils {\n  static ThemeData getThemeData({\n    required ColorScheme colorScheme,\n    required bool isDynamic,\n    bool isDark = false,\n  }) {\n    final appFontWeight = Pref.appFontWeight.clamp(\n      -1,\n      FontWeight.values.length - 1,\n    );\n    final fontWeight = appFontWeight == -1\n        ? null\n        : FontWeight.values[appFontWeight];\n    late final textStyle = TextStyle(fontWeight: fontWeight);\n    ThemeData themeData = ThemeData(\n      colorScheme: colorScheme,\n      useMaterial3: true,\n      textTheme: fontWeight == null\n          ? null\n          : TextTheme(\n              displayLarge: textStyle,\n              displayMedium: textStyle,\n              displaySmall: textStyle,\n              headlineLarge: textStyle,\n              headlineMedium: textStyle,\n              headlineSmall: textStyle,\n              titleLarge: textStyle,\n              titleMedium: textStyle,\n              titleSmall: textStyle,\n              bodyLarge: textStyle,\n              bodyMedium: textStyle,\n              bodySmall: textStyle,\n              labelLarge: textStyle,\n              labelMedium: textStyle,\n              labelSmall: textStyle,\n            ),\n      tabBarTheme: fontWeight == null\n          ? null\n          : TabBarThemeData(labelStyle: textStyle),\n      appBarTheme: AppBarTheme(\n        elevation: 0,\n        titleSpacing: 0,\n        centerTitle: false,\n        scrolledUnderElevation: 0,\n        backgroundColor: colorScheme.surface,\n        titleTextStyle: TextStyle(\n          fontSize: 16,\n          color: colorScheme.onSurface,\n          fontWeight: fontWeight,\n        ),\n      ),\n      navigationBarTheme: NavigationBarThemeData(\n        surfaceTintColor: isDynamic ? colorScheme.onSurfaceVariant : null,\n      ),\n      snackBarTheme: SnackBarThemeData(\n        actionTextColor: colorScheme.primary,\n        backgroundColor: colorScheme.secondaryContainer,\n        closeIconColor: colorScheme.secondary,\n        contentTextStyle: TextStyle(color: colorScheme.onSecondaryContainer),\n        elevation: 20,\n      ),\n      popupMenuTheme: PopupMenuThemeData(\n        surfaceTintColor: isDynamic ? colorScheme.onSurfaceVariant : null,\n      ),\n      cardTheme: CardThemeData(\n        elevation: 1,\n        margin: EdgeInsets.zero,\n        surfaceTintColor: isDynamic\n            ? colorScheme.onSurfaceVariant\n            : isDark\n            ? colorScheme.onSurfaceVariant\n            : null,\n        shadowColor: Colors.transparent,\n      ),\n      progressIndicatorTheme: ProgressIndicatorThemeData(\n        // ignore: deprecated_member_use\n        year2023: false,\n        refreshBackgroundColor: colorScheme.onSecondary,\n      ),\n      dialogTheme: DialogThemeData(\n        titleTextStyle: TextStyle(\n          fontSize: 18,\n          color: colorScheme.onSurface,\n          fontWeight: fontWeight,\n        ),\n        backgroundColor: colorScheme.surface,\n        constraints: const BoxConstraints(minWidth: 280, maxWidth: 420),\n      ),\n      bottomSheetTheme: BottomSheetThemeData(\n        backgroundColor: colorScheme.surface,\n        shape: const RoundedRectangleBorder(\n          borderRadius: StyleString.bottomSheetRadius,\n        ),\n      ),\n      // ignore: deprecated_member_use\n      sliderTheme: const SliderThemeData(year2023: false),\n      tooltipTheme: TooltipThemeData(\n        textStyle: const TextStyle(\n          color: Colors.white,\n          fontSize: 14,\n        ),\n        decoration: BoxDecoration(\n          color: Colors.grey[700]!.withValues(alpha: 0.9),\n          borderRadius: const BorderRadius.all(Radius.circular(4)),\n        ),\n      ),\n      cupertinoOverrideTheme: CupertinoThemeData(\n        selectionHandleColor: colorScheme.primary,\n      ),\n      switchTheme: const SwitchThemeData(\n        padding: .zero,\n        materialTapTargetSize: .shrinkWrap,\n        thumbIcon: WidgetStateProperty<Icon?>.fromMap(\n          <WidgetStatesConstraint, Icon?>{\n            WidgetState.selected: Icon(Icons.done),\n            WidgetState.any: null,\n          },\n        ),\n      ),\n      pageTransitionsTheme: const PageTransitionsTheme(\n        builders: {\n          TargetPlatform.android: ZoomPageTransitionsBuilder(),\n        },\n      ),\n    );\n    if (isDark) {\n      if (Pref.isPureBlackTheme) {\n        themeData = darkenTheme(themeData);\n      }\n      if (Pref.darkVideoPage) {\n        MyApp.darkThemeData = themeData;\n      }\n    }\n    return themeData;\n  }\n\n  static ThemeData darkenTheme(ThemeData themeData) {\n    final colorScheme = themeData.colorScheme;\n    final color = colorScheme.surfaceContainerHighest.darken(0.7);\n    return themeData.copyWith(\n      scaffoldBackgroundColor: Colors.black,\n      appBarTheme: themeData.appBarTheme.copyWith(\n        backgroundColor: Colors.black,\n      ),\n      cardTheme: themeData.cardTheme.copyWith(\n        color: Colors.black,\n      ),\n      dialogTheme: themeData.dialogTheme.copyWith(\n        backgroundColor: color,\n      ),\n      bottomSheetTheme: themeData.bottomSheetTheme.copyWith(\n        backgroundColor: color,\n      ),\n      bottomNavigationBarTheme: themeData.bottomNavigationBarTheme.copyWith(\n        backgroundColor: color,\n      ),\n      navigationBarTheme: themeData.navigationBarTheme.copyWith(\n        backgroundColor: color,\n      ),\n      navigationRailTheme: themeData.navigationRailTheme.copyWith(\n        backgroundColor: Colors.black,\n      ),\n      colorScheme: colorScheme.copyWith(\n        primary: colorScheme.primary.darken(0.1),\n        onPrimary: colorScheme.onPrimary.darken(0.1),\n        primaryContainer: colorScheme.primaryContainer.darken(0.1),\n        onPrimaryContainer: colorScheme.onPrimaryContainer.darken(0.1),\n        inversePrimary: colorScheme.inversePrimary.darken(0.1),\n        secondary: colorScheme.secondary.darken(0.1),\n        onSecondary: colorScheme.onSecondary.darken(0.1),\n        secondaryContainer: colorScheme.secondaryContainer.darken(0.1),\n        onSecondaryContainer: colorScheme.onSecondaryContainer.darken(0.1),\n        error: colorScheme.error.darken(0.1),\n        surface: Colors.black,\n        onSurface: colorScheme.onSurface.darken(0.15),\n        surfaceTint: colorScheme.surfaceTint.darken(),\n        inverseSurface: colorScheme.inverseSurface.darken(),\n        onInverseSurface: colorScheme.onInverseSurface.darken(),\n        surfaceContainer: colorScheme.surfaceContainer.darken(),\n        surfaceContainerHigh: colorScheme.surfaceContainerHigh.darken(),\n        surfaceContainerHighest: colorScheme.surfaceContainerHighest.darken(\n          0.4,\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/utils/update.dart",
    "content": "import 'dart:io' show Platform;\n\nimport 'package:PiliPlus/build_config.dart';\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/http/api.dart';\nimport 'package:PiliPlus/http/browser_ua.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/utils/accounts/account.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:device_info_plus/device_info_plus.dart';\nimport 'package:dio/dio.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\n\nabstract final class Update {\n  // 检查更新\n  static Future<void> checkUpdate([bool isAuto = true]) async {\n    if (kDebugMode) return;\n    SmartDialog.dismiss();\n    try {\n      final res = await Request().get(\n        Api.latestApp,\n        options: Options(\n          headers: {'user-agent': BrowserUa.mob},\n          extra: {'account': const NoAccount()},\n        ),\n      );\n      if (res.data is Map || res.data.isEmpty) {\n        if (!isAuto) {\n          SmartDialog.showToast('检查更新失败，GitHub接口未返回数据，请检查网络');\n        }\n        return;\n      }\n      final data = res.data[0];\n      final int latest =\n          DateTime.parse(data['created_at']).millisecondsSinceEpoch ~/ 1000;\n      if (BuildConfig.buildTime >= latest) {\n        if (!isAuto) {\n          SmartDialog.showToast('已是最新版本');\n        }\n      } else {\n        SmartDialog.show(\n          animationType: SmartAnimationType.centerFade_otherSlide,\n          builder: (context) {\n            final ThemeData theme = Theme.of(context);\n            Widget downloadBtn(String text, {String? ext}) => TextButton(\n              onPressed: () => onDownload(data, ext: ext),\n              child: Text(text),\n            );\n            return AlertDialog(\n              title: const Text('🎉 发现新版本 '),\n              content: SizedBox(\n                height: 280,\n                child: SingleChildScrollView(\n                  child: Column(\n                    crossAxisAlignment: CrossAxisAlignment.start,\n                    children: [\n                      Text(\n                        '${data['tag_name']}',\n                        style: const TextStyle(fontSize: 20),\n                      ),\n                      const SizedBox(height: 8),\n                      Text('${data['body']}'),\n                      TextButton(\n                        onPressed: () => PageUtils.launchURL(\n                          '${Constants.sourceCodeUrl}/commits/main',\n                        ),\n                        child: Text(\n                          \"点此查看完整更新(即commit)内容\",\n                          style: TextStyle(\n                            color: theme.colorScheme.primary,\n                          ),\n                        ),\n                      ),\n                    ],\n                  ),\n                ),\n              ),\n              actions: [\n                if (isAuto)\n                  TextButton(\n                    onPressed: () {\n                      SmartDialog.dismiss();\n                      GStorage.setting.put(SettingBoxKey.autoUpdate, false);\n                    },\n                    child: Text(\n                      '不再提醒',\n                      style: TextStyle(\n                        color: theme.colorScheme.outline,\n                      ),\n                    ),\n                  ),\n                TextButton(\n                  onPressed: SmartDialog.dismiss,\n                  child: Text(\n                    '取消',\n                    style: TextStyle(\n                      color: theme.colorScheme.outline,\n                    ),\n                  ),\n                ),\n                if (Platform.isWindows) ...[\n                  downloadBtn('zip', ext: 'zip'),\n                  downloadBtn('exe', ext: 'exe'),\n                ] else if (Platform.isLinux) ...[\n                  downloadBtn('rpm', ext: 'rpm'),\n                  downloadBtn('deb', ext: 'deb'),\n                  downloadBtn('targz', ext: 'tar.gz'),\n                ] else\n                  downloadBtn('Github'),\n              ],\n            );\n          },\n        );\n      }\n    } catch (e) {\n      if (kDebugMode) debugPrint('failed to check update: $e');\n    }\n  }\n\n  // 下载适用于当前系统的安装包\n  static Future<void> onDownload(Map data, {String? ext}) async {\n    SmartDialog.dismiss();\n    try {\n      void download(String plat) {\n        if (data['assets'].isNotEmpty) {\n          for (Map<String, dynamic> i in data['assets']) {\n            final String name = i['name'];\n            if (name.contains(plat) &&\n                (ext == null || ext.isEmpty ? true : name.endsWith(ext))) {\n              PageUtils.launchURL(i['browser_download_url']);\n              return;\n            }\n          }\n          throw UnsupportedError('platform not found: $plat');\n        }\n      }\n\n      if (Platform.isAndroid) {\n        // 获取设备信息\n        AndroidDeviceInfo androidInfo = await DeviceInfoPlugin().androidInfo;\n        // [arm64-v8a]\n        download(androidInfo.supportedAbis.first);\n      } else {\n        download(Platform.operatingSystem);\n      }\n    } catch (e) {\n      if (kDebugMode) debugPrint('download error: $e');\n      PageUtils.launchURL('${Constants.sourceCodeUrl}/releases/latest');\n    }\n  }\n}\n"
  },
  {
    "path": "lib/utils/url_utils.dart",
    "content": "import 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/http/search.dart';\nimport 'package:PiliPlus/utils/accounts/account.dart';\nimport 'package:PiliPlus/utils/id_utils.dart';\nimport 'package:PiliPlus/utils/page_utils.dart';\nimport 'package:dio/dio.dart';\nimport 'package:flutter/foundation.dart' show kDebugMode;\nimport 'package:flutter/material.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\n\nabstract final class UrlUtils {\n  // 302重定向路由截取\n  static Future<String?> parseRedirectUrl(\n    String url, [\n    bool returnOri = false,\n  ]) async {\n    String? redirectUrl;\n    try {\n      final response = await Request.dio.head(\n        url,\n        options: Options(\n          followRedirects: false,\n          validateStatus: (status) {\n            return 200 <= status! && status < 400;\n          },\n          extra: {'account': AnonymousAccount()},\n        ),\n      );\n      redirectUrl = response.headers['location']?.firstOrNull;\n      if (kDebugMode) debugPrint('redirectUrl: $redirectUrl');\n      if (redirectUrl != null && !redirectUrl.startsWith('http')) {\n        redirectUrl = Uri.parse(url).resolve(redirectUrl).toString();\n      }\n    } catch (_) {}\n    if (returnOri && redirectUrl == null) redirectUrl = url;\n    if (redirectUrl?.endsWith('/') == true) {\n      redirectUrl = redirectUrl!.substring(0, redirectUrl.length - 1);\n    }\n    return redirectUrl;\n  }\n\n  // 匹配url路由跳转\n  static Future<void> matchUrlPush(\n    String pathSegment,\n    String redirectUrl,\n  ) async {\n    final matchRes = IdUtils.matchAvorBv(input: pathSegment);\n    if (matchRes.isNotEmpty) {\n      final aid = matchRes.av;\n      String? bvid = matchRes.bv;\n      bvid ??= IdUtils.av2bv(aid!);\n      final int? cid = await SearchHttp.ab2c(aid: aid, bvid: bvid);\n      if (cid != null) {\n        PageUtils.toVideoPage(\n          aid: aid,\n          bvid: bvid,\n          cid: cid,\n        );\n      }\n    } else {\n      if (redirectUrl.isNotEmpty) {\n        PageUtils.handleWebview(redirectUrl);\n      } else {\n        SmartDialog.showToast('matchUrlPush: $pathSegment');\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "lib/utils/utils.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\nimport 'dart:io';\nimport 'dart:math' show Random;\n\nimport 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/utils/platform_utils.dart';\nimport 'package:catcher_2/catcher_2.dart';\nimport 'package:connectivity_plus/connectivity_plus.dart';\nimport 'package:device_info_plus/device_info_plus.dart';\nimport 'package:file_picker/file_picker.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_smart_dialog/flutter_smart_dialog.dart';\nimport 'package:get/get.dart';\nimport 'package:share_plus/share_plus.dart';\n\nabstract final class Utils {\n  static final random = Random();\n\n  static const channel = MethodChannel(Constants.appName);\n\n  static const jsonEncoder = JsonEncoder.withIndent('    ');\n\n  static String levelName(\n    Object level, {\n    bool isSeniorMember = false,\n  }) => 'assets/images/lv/lv${isSeniorMember ? '6_s' : level}.png';\n\n  static Color index2Color(int index, Color color) => switch (index) {\n    0 => const Color(0xFFfdad13),\n    1 => const Color(0xFF8aace1),\n    2 => const Color(0xFFdfa777),\n    _ => color,\n  };\n\n  static String themeUrl(bool isDark) =>\n      'native.theme=${isDark ? 2 : 1}&night=${isDark ? 1 : 0}';\n\n  static Future<void> saveBytes2File({\n    required String name,\n    required Uint8List bytes,\n    required List<String> allowedExtensions,\n    FileType type = FileType.custom,\n  }) async {\n    try {\n      final path = await FilePicker.saveFile(\n        allowedExtensions: allowedExtensions,\n        type: type,\n        fileName: name,\n        bytes: PlatformUtils.isDesktop ? null : bytes,\n      );\n      if (path == null) {\n        SmartDialog.showToast(\"取消保存\");\n        return;\n      }\n      if (PlatformUtils.isDesktop) {\n        await File(path).writeAsBytes(bytes);\n      }\n      SmartDialog.showToast(\"已保存\");\n    } catch (e) {\n      SmartDialog.showToast(\"保存失败: $e\");\n    }\n  }\n\n  static int? safeToInt(dynamic value) => switch (value) {\n    int e => e,\n    String e => int.tryParse(e),\n    num e => e.toInt(),\n    _ => null,\n  };\n\n  static Future<bool> get isWiFi async {\n    try {\n      return PlatformUtils.isMobile &&\n          (await Connectivity().checkConnectivity()).contains(\n            ConnectivityResult.wifi,\n          );\n    } catch (_) {\n      return true;\n    }\n  }\n\n  static Color parseColor(String color) =>\n      Color(int.parse(color.replaceFirst('#', 'FF'), radix: 16));\n\n  static int? _sdkInt;\n  static Future<int> get sdkInt async {\n    return _sdkInt ??= (await DeviceInfoPlugin().androidInfo).version.sdkInt;\n  }\n\n  static bool? _isIpad;\n  static Future<bool> get isIpad async {\n    if (!Platform.isIOS) return false;\n    return _isIpad ??= (await DeviceInfoPlugin().iosInfo).model\n        .toLowerCase()\n        .contains('ipad');\n  }\n\n  static Future<Rect?> get sharePositionOrigin async {\n    if (await isIpad) {\n      final size = Get.size;\n      return Rect.fromLTRB(0, 0, size.width, size.height / 2);\n    }\n    return null;\n  }\n\n  static Future<void> shareText(String text) async {\n    if (PlatformUtils.isDesktop) {\n      copyText(text);\n      return;\n    }\n    try {\n      await SharePlus.instance.share(\n        ShareParams(text: text, sharePositionOrigin: await sharePositionOrigin),\n      );\n    } catch (e) {\n      SmartDialog.showToast(e.toString());\n    }\n  }\n\n  static final numericRegex = RegExp(r'^[\\d\\.]+$');\n  static bool isStringNumeric(String str) {\n    return numericRegex.hasMatch(str);\n  }\n\n  static String generateRandomString(int length) {\n    const characters = '0123456789abcdefghijklmnopqrstuvwxyz';\n\n    return String.fromCharCodes(\n      Iterable.generate(\n        length,\n        (_) => characters.codeUnitAt(random.nextInt(characters.length)),\n      ),\n    );\n  }\n\n  static Future<void> copyText(\n    String text, {\n    bool needToast = true,\n    String? toastText,\n  }) {\n    if (needToast) {\n      SmartDialog.showToast(toastText ?? '已复制');\n    }\n    return Clipboard.setData(ClipboardData(text: text));\n  }\n\n  static String makeHeroTag(dynamic v) {\n    return v.toString() + random.nextInt(9999).toString();\n  }\n\n  static List<int> generateRandomBytes(int minLength, int maxLength) {\n    return List<int>.generate(\n      minLength + random.nextInt(maxLength - minLength + 1),\n      (_) => 0x26 + random.nextInt(0x59), // dm_img_str不能有`%`\n    );\n  }\n\n  static String base64EncodeRandomString(int minLength, int maxLength) {\n    final randomBytes = generateRandomBytes(minLength, maxLength);\n    final randomBase64 = base64.encode(randomBytes);\n    return randomBase64.substring(0, randomBase64.length - 2);\n  }\n\n  static String getFileName(String uri, {bool fileExt = true}) {\n    int slash = -1;\n    int dot = -1;\n    int qMark = uri.length;\n\n    loop:\n    for (int index = uri.length - 1; index >= 0; index--) {\n      switch (uri.codeUnitAt(index)) {\n        case 0x2F: // `/`\n          slash = index;\n          break loop;\n        case 0x2E: // `.`\n          if (dot == -1) dot = index;\n          break;\n        case 0x3F: // `?`\n          qMark = index;\n          if (dot > qMark) dot = -1;\n          break;\n      }\n    }\n    RangeError.checkNotNegative(slash, '/');\n    return uri.substring(slash + 1, (fileExt || dot == -1) ? qMark : dot);\n  }\n\n  /// When calling this from a `catch` block consider annotating the method\n  /// containing the `catch` block with\n  /// `@pragma('vm:notify-debugger-on-exception')` to allow an attached debugger\n  /// to treat the exception as unhandled.\n  static void reportError(Object exception, [StackTrace? stack]) {\n    Catcher2.reportCheckedError(exception, stack);\n  }\n}\n"
  },
  {
    "path": "lib/utils/video_utils.dart",
    "content": "import 'package:PiliPlus/models/common/video/cdn_type.dart';\nimport 'package:PiliPlus/models_new/live/live_room_play_info/codec.dart';\nimport 'package:PiliPlus/utils/storage_pref.dart';\nimport 'package:flutter/foundation.dart';\n\nabstract final class VideoUtils {\n  static CDNService cdnService = Pref.defaultCDNService;\n  static String? liveCdnUrl = Pref.liveCdnUrl;\n  static bool disableAudioCDN = Pref.disableAudioCDN;\n\n  static const _proxyTf = 'proxy-tf-all-ws.bilivideo.com';\n\n  static final _mirrorRegex = RegExp(\n    r'^https?://(?:upos-\\w+-(?!302)\\w+|(?:upos|proxy)-tf-[^/]+)\\.(?:bilivideo|akamaized)\\.(?:com|net)/upgcxcode',\n  );\n\n  static final _mCdnTfRegex = RegExp(\n    r'^https?://(?:(?:(?:\\d{1,3}\\.){3}\\d{1,3}|[^/]+\\.mcdn\\.bilivideo\\.(?:com|cn|net))(?:\\:\\d{1,5})?/v\\d/resource)',\n  );\n\n  static String getCdnUrl(\n    Iterable<String> urls, {\n    CDNService? defaultCDNService,\n    bool isAudio = false,\n  }) {\n    defaultCDNService ??= cdnService;\n\n    if (defaultCDNService == CDNService.baseUrl) {\n      return urls.first;\n    }\n\n    String? mcdnTf;\n    String? mcdnUpgcxcode;\n\n    String last = '';\n    for (final url in urls) {\n      last = url;\n      if (_mirrorRegex.hasMatch(url)) {\n        final uri = Uri.parse(url);\n        if (uri.queryParameters['os'] == 'mcdn') {\n          // upos-sz-mirrorcoso1.bilivideo.com os=mcdn\n          mcdnUpgcxcode = url;\n        } else {\n          if (defaultCDNService == CDNService.backupUrl ||\n              (isAudio && disableAudioCDN)) {\n            return url;\n          }\n          return uri.replace(host: defaultCDNService.host).toString();\n        }\n      }\n\n      if (_mCdnTfRegex.hasMatch(url)) {\n        mcdnTf = url;\n        continue;\n      }\n\n      // upos-\\w*-302.* & bcache & mcdn host but upgcxcode path\n      if (url.contains('/upgcxcode/')) {\n        mcdnUpgcxcode = url;\n        continue;\n      }\n\n      // may be deprecated\n      if (url.contains('szbdyd.com')) {\n        final uri = Uri.parse(url);\n        final hostname =\n            uri.queryParameters['xy_usource'] ?? defaultCDNService.host;\n        return uri\n            .replace(scheme: 'https', host: hostname, port: 443)\n            .toString();\n      }\n\n      if (kDebugMode) {\n        debugPrint('unknown cdn type: $url');\n      }\n    }\n\n    return mcdnUpgcxcode == null\n        ? mcdnTf == null\n              ? last\n              : Uri(\n                  scheme: 'https',\n                  host: _proxyTf,\n                  queryParameters: {'url': mcdnTf},\n                ).toString()\n        : Uri.parse(mcdnUpgcxcode)\n              .replace(host: defaultCDNService.host ?? CDNService.ali.host)\n              .toString();\n  }\n\n  static String getLiveCdnUrl(CodecItem e) {\n    return (liveCdnUrl ?? e.urlInfo!.first.host!) +\n        e.baseUrl! +\n        e.urlInfo!.first.extra!;\n  }\n}\n"
  },
  {
    "path": "lib/utils/waterfall.dart",
    "content": "import 'package:PiliPlus/common/constants.dart';\nimport 'package:PiliPlus/common/skeleton/dynamic_card.dart';\nimport 'package:PiliPlus/common/widgets/flutter/sliver_layout_builder.dart';\nimport 'package:PiliPlus/utils/global_data.dart';\nimport 'package:PiliPlus/utils/grid.dart';\nimport 'package:flutter/material.dart' hide SliverLayoutBuilder;\nimport 'package:flutter/rendering.dart' show SliverConstraints;\nimport 'package:waterfall_flow/waterfall_flow.dart'\n    show SliverWaterfallFlowDelegate;\n\nmixin DynMixin {\n  late final dynGridDelegate =\n      SliverWaterfallFlowDelegateWithMaxCrossAxisExtent(\n        maxCrossAxisExtent: Grid.smallCardWidth * 2,\n        crossAxisSpacing: 4,\n      );\n\n  Widget buildPage(Widget child) {\n    if (GlobalData().dynamicsWaterfallFlow) {\n      return child;\n    }\n    return SliverLayoutBuilder(\n      builder: (context, constraints) {\n        final maxWidth = constraints.crossAxisExtent;\n        final cardWidth = Grid.smallCardWidth * 2;\n        final flag = cardWidth < maxWidth;\n        return SliverPadding(\n          padding: EdgeInsets.symmetric(\n            horizontal: flag ? (maxWidth - cardWidth) / 2 : 0,\n          ),\n          sliver: child,\n        );\n      },\n    );\n  }\n\n  late final skeDelegate = SliverGridDelegateWithExtentAndRatio(\n    crossAxisSpacing: 4,\n    mainAxisSpacing: 4,\n    maxCrossAxisExtent: Grid.smallCardWidth * 2,\n    childAspectRatio: StyleString.aspectRatio,\n    mainAxisExtent: 50,\n  );\n\n  Widget get dynSkeleton {\n    if (GlobalData().dynamicsWaterfallFlow) {\n      return SliverGrid.builder(\n        gridDelegate: skeDelegate,\n        itemBuilder: (_, _) => const DynamicCardSkeleton(),\n        itemCount: 10,\n      );\n    }\n    return SliverPrototypeExtentList.builder(\n      prototypeItem: const DynamicCardSkeleton(),\n      itemBuilder: (_, _) => const DynamicCardSkeleton(),\n      itemCount: 10,\n    );\n  }\n}\n\nclass SliverWaterfallFlowDelegateWithMaxCrossAxisExtent\n    extends SliverWaterfallFlowDelegate {\n  /// Creates a delegate that makes masonry layouts with tiles that have a maximum\n  /// cross-axis extent.\n  ///\n  /// All of the arguments must not be null. The [maxCrossAxisExtent],\n  /// [mainAxisSpacing], and [crossAxisSpacing] arguments must not be negative.\n  SliverWaterfallFlowDelegateWithMaxCrossAxisExtent({\n    required this.maxCrossAxisExtent,\n    super.mainAxisSpacing,\n    super.crossAxisSpacing,\n    super.lastChildLayoutTypeBuilder,\n    super.collectGarbage,\n    super.viewportBuilder,\n    super.closeToTrailing,\n  }) : assert(maxCrossAxisExtent >= 0);\n\n  /// The maximum extent of tiles in the cross axis.\n  ///\n  /// This delegate will select a cross-axis extent for the tiles that is as\n  /// large as possible subject to the following conditions:\n  ///\n  ///  - The extent evenly divides the cross-axis extent of the grid.\n  ///  - The extent is at most [maxCrossAxisExtent].\n  ///\n  /// For example, if the grid is vertical, the grid is 500.0 pixels wide, and\n  /// [maxCrossAxisExtent] is 150.0, this delegate will create a grid with 4\n  /// columns that are 125.0 pixels wide.\n  final double maxCrossAxisExtent;\n\n  int? crossAxisCount;\n  double? crossAxisExtent;\n\n  @override\n  int getCrossAxisCount(SliverConstraints constraints) {\n    final crossAxisExtent = constraints.crossAxisExtent;\n    if (crossAxisCount != null && this.crossAxisExtent == crossAxisExtent) {\n      return crossAxisCount!;\n    }\n    this.crossAxisExtent = crossAxisExtent;\n    crossAxisCount = (crossAxisExtent / (maxCrossAxisExtent + crossAxisSpacing))\n        .ceil();\n    return crossAxisCount!;\n  }\n\n  @override\n  bool shouldRelayout(SliverWaterfallFlowDelegate oldDelegate) {\n    final flag =\n        (oldDelegate.runtimeType != runtimeType) ||\n        (oldDelegate is SliverWaterfallFlowDelegateWithMaxCrossAxisExtent &&\n            (oldDelegate.maxCrossAxisExtent != maxCrossAxisExtent ||\n                super.shouldRelayout(oldDelegate)));\n    if (flag) {\n      crossAxisCount = null;\n    }\n    return flag;\n  }\n}\n"
  },
  {
    "path": "lib/utils/wbi_sign.dart",
    "content": "// Wbi签名 用于生成 REST API 请求中的 w_rid 和 wts 字段\n// https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/misc/sign/wbi.md\n// import md5 from 'md5'\n// import axios from 'axios'\nimport 'dart:async';\nimport 'dart:convert';\n\nimport 'package:PiliPlus/http/api.dart';\nimport 'package:PiliPlus/http/init.dart';\nimport 'package:PiliPlus/utils/storage.dart';\nimport 'package:PiliPlus/utils/storage_key.dart';\nimport 'package:PiliPlus/utils/utils.dart';\nimport 'package:crypto/crypto.dart';\nimport 'package:hive_ce/hive.dart';\n\nabstract final class WbiSign {\n  static Box get _localCache => GStorage.localCache;\n  static final RegExp _chrFilter = RegExp(r\"[!\\'\\(\\)\\*]\");\n  static const _mixinKeyEncTab = <int>[\n    46,\n    47,\n    18,\n    2,\n    53,\n    8,\n    23,\n    32,\n    15,\n    50,\n    10,\n    31,\n    58,\n    3,\n    45,\n    35,\n    27,\n    43,\n    5,\n    49,\n    33,\n    9,\n    42,\n    19,\n    29,\n    28,\n    14,\n    39,\n    12,\n    38,\n    41,\n    13,\n  ];\n\n  static Future<String>? _future;\n\n  // 对 imgKey 和 subKey 进行字符顺序打乱编码\n  static String getMixinKey(String orig) {\n    final codeUnits = orig.codeUnits;\n    return String.fromCharCodes(_mixinKeyEncTab.map((i) => codeUnits[i]));\n  }\n\n  // 为请求参数进行 wbi 签名\n  static void encWbi(Map<String, Object> params, String mixinKey) {\n    params['wts'] = DateTime.now().millisecondsSinceEpoch ~/ 1000;\n    // 按照 key 重排参数\n    final List<String> keys = params.keys.toList()..sort();\n    final queryStr = keys\n        .map(\n          (i) =>\n              '${Uri.encodeComponent(i)}=${Uri.encodeComponent(params[i].toString().replaceAll(_chrFilter, ''))}',\n        )\n        .join('&');\n    params['w_rid'] = md5\n        .convert(utf8.encode(queryStr + mixinKey))\n        .toString(); // 计算 w_rid\n  }\n\n  static Future<String> _getWbiKeys() async {\n    final resp = await Request().get(Api.userInfo);\n    try {\n      final wbiUrls = resp.data['data']['wbi_img'];\n\n      final mixinKey = getMixinKey(\n        Utils.getFileName(wbiUrls['img_url'], fileExt: false) +\n            Utils.getFileName(wbiUrls['sub_url'], fileExt: false),\n      );\n\n      _localCache.put(LocalCacheKey.mixinKey, mixinKey);\n\n      return mixinKey;\n    } catch (_) {\n      return '';\n    }\n  }\n\n  static FutureOr<String> getWbiKeys() {\n    final nowDate = DateTime.now();\n    if (DateTime.fromMillisecondsSinceEpoch(\n          _localCache.get(LocalCacheKey.timeStamp, defaultValue: 0) as int,\n        ).day ==\n        nowDate.day) {\n      final String? mixinKey = _localCache.get(LocalCacheKey.mixinKey);\n      if (mixinKey != null) return mixinKey;\n      return _future ??= _getWbiKeys();\n    } else {\n      return _future = _localCache\n          .put(LocalCacheKey.timeStamp, nowDate.millisecondsSinceEpoch)\n          .then((_) => _getWbiKeys());\n    }\n  }\n\n  static Future<Map<String, Object>> makSign(\n    Map<String, Object> params,\n  ) async {\n    // params 为需要加密的请求参数\n    final String mixinKey = await getWbiKeys();\n    encWbi(params, mixinKey);\n    return params;\n  }\n}\n"
  },
  {
    "path": "linux/.gitignore",
    "content": "flutter/ephemeral\n"
  },
  {
    "path": "linux/CMakeLists.txt",
    "content": "# Project-level configuration.\ncmake_minimum_required(VERSION 3.13)\nproject(runner LANGUAGES C 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 \"piliplus\")\n# The unique GTK application identifier for this application. See:\n# https://wiki.gnome.org/HowDoI/ChooseApplicationID\nset(APPLICATION_ID \"com.example.piliplus\")\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 -Wno-error=deprecated-declarations) # Allow deprecated warnings\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\n# Application build; see runner/CMakeLists.txt.\nadd_subdirectory(\"runner\")\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/runner/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.13)\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}\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 preprocessor definitions for the application ID.\nadd_definitions(-DAPPLICATION_ID=\"${APPLICATION_ID}\")\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\ntarget_include_directories(${BINARY_NAME} PRIVATE \"${CMAKE_SOURCE_DIR}\")\n"
  },
  {
    "path": "linux/runner/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/runner/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 \"flutter/generated_plugin_registrant.h\"\n\nstruct _MyApplication {\n  GtkApplication parent_instance;\n  char **dart_entrypoint_arguments;\n};\n\nG_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION)\n\n// Called when first Flutter frame received.\nstatic void first_frame_cb(MyApplication *self, FlView *view) {\n  gtk_widget_show(gtk_widget_get_toplevel(GTK_WIDGET(view)));\n}\n\n// Called when window is requested to be closed.\nstatic gboolean window_delete_event_cb(GtkWidget *widget, GdkEvent *event,\n                                       gpointer data) {\n  // Get the application and quit it.\n  GtkApplication *app = gtk_window_get_application(GTK_WINDOW(widget));\n  if (app != nullptr) {\n    g_application_quit(G_APPLICATION(app));\n  }\n  // Return TRUE to prevent further processing of the delete event.\n  return TRUE;\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\n  const gboolean use_header_bar = [window]() -> gboolean {\n    if (g_file_test(\n        g_build_filename(g_get_user_data_dir(), \"com.example.piliplus\", \"use_ssd\", NULL),\n        G_FILE_TEST_EXISTS))\n      return FALSE;\n\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        return FALSE;\n      }\n    }\n#endif\n    return TRUE;\n  }();\n\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, \"piliplus\");\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, \"piliplus\");\n  }\n\n  gtk_window_set_default_size(window, 1280, 720);\n\n  g_autoptr(FlDartProject) project = fl_dart_project_new();\n  fl_dart_project_set_dart_entrypoint_arguments(\n      project, self->dart_entrypoint_arguments);\n\n  FlView *view = fl_view_new(project);\n  GdkRGBA background_color;\n  // Background defaults to black, override it here if necessary, e.g. #00000000\n  // for transparent.\n  gdk_rgba_parse(&background_color, \"#000000\");\n  fl_view_set_background_color(view, &background_color);\n  gtk_widget_show(GTK_WIDGET(view));\n  gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view));\n\n  // Show the window when Flutter renders.\n  // Requires the view to be realized so we can start rendering.\n  g_signal_connect_swapped(view, \"first-frame\", G_CALLBACK(first_frame_cb),\n                           self);\n  gtk_widget_realize(GTK_WIDGET(view));\n\n  // Connect the delete-event signal to handle window close.\n  g_signal_connect(window, \"delete-event\", G_CALLBACK(window_delete_event_cb),\n                   NULL);\n\n  fl_register_plugins(FL_PLUGIN_REGISTRY(view));\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,\n                                                  gchar ***arguments,\n                                                  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_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 =\n      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  // Set the program name to the application ID, which helps various systems\n  // like GTK and desktop environments map this running application to its\n  // corresponding .desktop file. This ensures better integration by allowing\n  // the application to be recognized beyond its binary name.\n  g_set_prgname(APPLICATION_ID);\n\n  return MY_APPLICATION(g_object_new(\n      my_application_get_type(), \"application-id\", APPLICATION_ID, nullptr));\n}\n"
  },
  {
    "path": "linux/runner/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 \"ephemeral/Flutter-Generated.xcconfig\"\n"
  },
  {
    "path": "macos/Flutter/Flutter-Release.xcconfig",
    "content": "#include \"ephemeral/Flutter-Generated.xcconfig\"\n"
  },
  {
    "path": "macos/Podfile",
    "content": "platform :osx, '10.14'\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__))\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  override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {\n    return false\n  }\n\n  override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool {\n    return true\n  }\n\n  override func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool {\n    if !flag {\n      for window in NSApp.windows {\n        if !window.isVisible {\n          window.setIsVisible(true)\n        }\n        window.makeKeyAndOrderFront(self)\n        NSApp.activate(ignoringOtherApps: true)\n      }\n    }\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}"
  },
  {
    "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 = PiliPlus\n\n// The application's bundle identifier\nPRODUCT_BUNDLE_IDENTIFIER = com.example.piliplus\n\n// The copyright displayed in application information\nPRODUCT_COPYRIGHT = Copyright © 2023 com.example. 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<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.init()\n    // 先不显示窗口\n    self.isReleasedWhenClosed = false\n    self.contentViewController = flutterViewController\n    self.setFrame(self.frame, display: true)\n\n    // 背景别用默认黑色\n    self.isOpaque = false\n    self.backgroundColor = .clear\n\n    RegisterGeneratedPlugins(registry: flutterViewController)\n\n    // 监听首帧渲染完成再显示窗口\n    NotificationCenter.default.addObserver(\n      forName: NSNotification.Name(\"io.flutter.embedding.engine.firstFrame\"),\n      object: flutterViewController.engine, queue: .main\n    ) { [weak self] _ in\n      self?.makeKeyAndOrderFront(nil)\n      NSApp.activate(ignoringOtherApps: true)\n    }\n    // 不在这里调用 makeKeyAndOrderFront\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\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.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\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\t70B7435992536DF7EF916102 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BA6434EEFB6EABF56163956B /* Pods_Runner.framework */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\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\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 /* piliplus.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = piliplus.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\t55ED1760F98F03A067237962 /* 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\t9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = \"<group>\"; };\n\t\tA5BA27756D8018CEC961D98E /* 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\tBA6434EEFB6EABF56163956B /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tC7AC3B7DF8D09FAFBD7AC6AD /* 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/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t33CC10EA2044A3C60003C045 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t70B7435992536DF7EF916102 /* 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\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\t33CC10EE2044A3C60003C045 /* Products */,\n\t\t\t\tD73912EC22F37F3D000D13A0 /* Frameworks */,\n\t\t\t\t3BC3551DE517F6B6D0C82543 /* 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 /* piliplus.app */,\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\t3BC3551DE517F6B6D0C82543 /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA5BA27756D8018CEC961D98E /* Pods-Runner.debug.xcconfig */,\n\t\t\t\tC7AC3B7DF8D09FAFBD7AC6AD /* Pods-Runner.release.xcconfig */,\n\t\t\t\t55ED1760F98F03A067237962 /* Pods-Runner.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\tD73912EC22F37F3D000D13A0 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBA6434EEFB6EABF56163956B /* Pods_Runner.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\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\t5190B88ACAD3AAF5B1766AE1 /* [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\t02C468425C99B15D8DFFA40D /* [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 /* piliplus.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\tLastSwiftUpdateCheck = 0920;\n\t\t\t\tLastUpgradeCheck = 1300;\n\t\t\t\tORGANIZATIONNAME = \"\";\n\t\t\t\tTargetAttributes = {\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\t33CC111A2044C6BA0003C045 /* Flutter Assemble */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\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\t02C468425C99B15D8DFFA40D /* [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\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\t5190B88ACAD3AAF5B1766AE1 /* [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\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\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\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\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\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\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 = 11.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\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\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\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 = 10.14;\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\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\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\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 = 10.14;\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\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 = \"1300\"\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 = \"piliplus.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 = \"piliplus.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <Testables>\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 = \"piliplus.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 = \"piliplus.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</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": "pubspec.yaml",
    "content": "name: PiliPlus\ndescription: A new Flutter project.\n# The following line prevents the package from being accidentally published to\n# pub.dev using `flutter pub publish`. This is preferred for private packages.\npublish_to: \"none\" # Remove this line if you wish to publish to pub.dev\n\n# The following defines the version and build number for your application.\n# A version number is three numbers separated by dots, like 1.2.43\n# followed by an optional build number separated by a +.\n# Both the version and the builder number may be overridden in flutter\n# build by specifying --build-name and --build-number, respectively.\n# In Android, build-name is used as versionName while build-number used as versionCode.\n# Read more about Android versioning at https://developer.android.com/studio/publish/versioning\n# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion.\n# Read more about iOS versioning at\n# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html\n# In Windows, build-name is used as the major, minor, and patch parts\n# of the product and file versions while build-number is used as the build suffix.\n# update when release\nversion: 2.0.1+1\n\nenvironment:\n  sdk: \">=3.10.0\"\n  flutter: 3.41.5 # update `.fvmrc` config\n\n# Dependencies specify other packages that your package needs in order to work.\n# To automatically upgrade your package dependencies to the latest versions\n# consider running `flutter pub upgrade --major-versions`. Alternatively,\n# dependencies can be manually updated by changing the version numbers below to\n# the latest version available on pub.dev. To see which dependencies have newer\n# versions available, run `flutter pub outdated`.\ndependencies:\n  flutter:\n    sdk: flutter\n  flutter_localizations:\n    sdk: flutter\n  # The following adds the Cupertino Icons font to your application.\n  # Use with the CupertinoIcons class for iOS style icons.\n  cupertino_icons: ^1.0.8\n  # 动态取色\n  dynamic_color: ^1.8.1\n\n  # get: ^4.7.2\n  get:\n    git:\n      url: https://github.com/bggRGjQaUbCoE/getx.git\n      ref: version_4.7.2\n\n  # 网络\n  dio: ^5.9.1\n  cookie_jar: ^4.0.8\n  connectivity_plus: ^7.0.0\n  dio_http2_adapter: ^2.5.3\n\n  # 图片\n  cached_network_image: ^3.4.1\n  # extended_image: ^9.0.7\n  saver_gallery: ^4.1.0\n\n  # QRCode\n  # qr_flutter: ^4.1.0\n  pretty_qr_code: ^3.3.0\n\n  # 存储\n  path_provider: ^2.1.5\n  hive_ce: ^2.19.3\n\n  # 设备信息\n  device_info_plus: ^12.1.0\n  # 权限\n  # permission_handler: ^12.0.0+1\n  permission_handler_apple: ^9.4.7\n  permission_handler_android: ^13.0.1\n  permission_handler_platform_interface: ^4.3.0\n  # 分享\n  share_plus: ^12.0.0\n  # cookie 管理\n  # webview_cookie_manager: ^2.0.6\n  # 浏览器\n  # webview_flutter: ^4.10.0\n  flutter_inappwebview: ^6.1.5\n  # 解决sliver滑动不同步\n  # extended_nested_scroll_view: ^6.2.1\n  extended_nested_scroll_view:\n    git:\n      url: https://github.com/bggRGjQaUbCoE/extended_nested_scroll_view.git\n      ref: mod\n  # 上拉加载\n  # loading_more_list: ^7.1.0\n  # 下拉刷新\n  # pull_to_refresh_notification: ^3.1.0\n  # 图标\n  font_awesome_flutter: 10.9.0\n  # material_design_icons_flutter: ^7.0.7296\n  material_design_icons_flutter:\n    git:\n      url: https://github.com/bggRGjQaUbCoE/material_design_icons_flutter.git\n      ref: const\n  # toast\n  flutter_smart_dialog:\n    git:\n      url: https://github.com/bggRGjQaUbCoE/flutter_smart_dialog.git\n      ref: main\n  # 下滑关闭\n  # dismissible_page: ^1.0.2\n  # custom_sliding_segmented_control: ^1.8.4\n  # 加密\n  crypto: ^3.0.6\n  encrypt: ^5.0.3\n\n  # 视频播放器\n  media_kit: 1.1.11 # Primary package.\n  # media_kit_video: ^1.2.5 # For video rendering.\n  media_kit_video:\n    git:\n      url: https://github.com/bggRGjQaUbCoE/media-kit.git\n      path: media_kit_video\n      ref: version_1.2.5\n  media_kit_libs_video: 1.0.5\n\n  # 媒体通知\n  audio_service: ^0.18.15\n  audio_session: ^0.2.2\n\n  # 音量、亮度、屏幕控制\n  flutter_volume_controller: ^1.3.3\n  wakelock_plus: ^1.2.8\n  # universal_platform: ^1.1.0\n  auto_orientation:\n    git:\n      url: https://github.com/bggRGjQaUbCoE/auto_orientation.git\n      ref: master\n  protobuf: ^6.0.0\n  # animations: ^2.0.11\n\n  # 获取appx信息\n  package_info_plus: ^9.0.0\n  url_launcher: ^6.3.1\n  # 防抖节流\n  easy_debounce: ^2.0.3\n  # 高帧率\n  flutter_displaymode: ^0.7.0\n  # scheme跳转\n  app_links: ^7.0.0\n  # 弹幕\n  # ns_danmaku:\n  #   git:\n  #     url: https://github.com/bggRGjQaUbCoE/flutter_ns_danmaku.git\n  #     ref: master\n  canvas_danmaku:\n    git:\n      url: https://github.com/bggRGjQaUbCoE/canvas_danmaku.git\n      ref: main\n  # 状态栏图标控制\n  # status_bar_control: ^3.2.1\n  # 代理\n  # system_proxy: ^0.1.0\n  # pip\n  # floating: ^3.0.0\n  floating:\n    git:\n      url: https://github.com/bggRGjQaUbCoE/floating.git\n      ref: version-3\n  # html解析\n  html: ^0.15.4\n  # html渲染\n  flutter_html: ^3.0.0-beta.2\n  # 极验\n  gt3_flutter_plugin: ^0.1.0\n  uuid: ^4.5.1\n  # scrollable_positioned_list: ^0.3.8\n  # nil: ^1.1.1\n  catcher_2: ^2.1.0\n  logger: ^2.5.0\n  #瀑布流\n  waterfall_flow: ^3.1.0\n  #跑马灯\n  # marquee: ^2.3.0\n  #富文本\n  # extended_text: ^14.1.0\n  # chat_bottom_container: ^0.2.0\n  chat_bottom_container:\n    git:\n      url: https://github.com/bggRGjQaUbCoE/flutter_chat_packages.git\n      ref: main\n      path: packages/chat_bottom_container\n  image_picker: ^1.1.2\n  intl: ^0.20.2\n  archive: ^4.0.0\n  flutter_svg: ^2.0.14\n  image_cropper: ^11.0.0\n  #解压直播消息\n  brotli: ^0.6.0\n  expandable: ^5.0.1\n  flex_seed_scheme: ^4.0.1\n  live_photo_maker: ^0.0.6\n  fl_chart: ^1.0.0\n  synchronized: ^3.3.0\n  # document_file_save_plus: ^2.0.0\n  # webdav_client: ^1.2.2\n  webdav_client:\n    git:\n      url: https://github.com/wgh136/webdav_client.git\n      ref: main\n  re_highlight: ^0.0.3\n  flutter_sortable_wrap:\n    git:\n      url: https://github.com/bggRGjQaUbCoE/flutter_sortable_wrap.git\n      ref: master\n  web_socket_channel: ^3.0.3\n  # image: ^4.7.1\n  # window_manager: ^0.5.1\n  window_manager:\n    git:\n      url: https://github.com/bggRGjQaUbCoE/window_manager.git\n      path: packages/window_manager\n      ref: main\n  tray_manager: ^0.5.1\n  # file_picker: ^10.3.3\n  file_picker:\n    git:\n      url: https://github.com/bggRGjQaUbCoE/flutter_file_picker.git\n      ref: mod\n  super_sliver_list:\n    git:\n      url: https://github.com/bggRGjQaUbCoE/super_sliver_list.git\n      ref: mod\n  dlna_dart: ^0.1.0\n  battery_plus: ^7.0.0\n  material_new_shapes: ^1.0.0\n\n  vector_math: any\n  fixnum: any\n  json_annotation: any\n  stream_transform: any\n  screen_brightness_platform_interface: any\n  mime: any\n  path: any\n  collection: any\n  material_color_utilities: any\n  flutter_cache_manager: any\n  http2: any\n  screen_retriever: any\n  characters: any\n\ndependency_overrides:\n  # screen_brightness: ^2.1.\n  screen_brightness_ios: ^2.1.2\n  screen_brightness_android: ^2.1.3\n  screen_brightness_platform_interface: ^2.1.0\n  path: ^1.9.1\n  mime: ^2.0.0\n  rxdart: ^0.28.0\n  media_kit:\n    git:\n      url: https://github.com/My-Responsitories/media-kit.git\n      path: media_kit\n      ref: version_1.2.5\n  media_kit_video:\n    git:\n      url: https://github.com/My-Responsitories/media-kit.git\n      path: media_kit_video\n      ref: version_1.2.5\n  media_kit_libs_video:\n    git:\n      url: https://github.com/My-Responsitories/media-kit.git\n      path: libs/universal/media_kit_libs_video\n      ref: version_1.2.5\n  media_kit_native_event_loop:\n    git:\n      url: https://github.com/My-Responsitories/media-kit.git\n      path: media_kit_native_event_loop\n      ref: version_1.2.5\n  media_kit_libs_android_video:\n    git:\n      url: https://github.com/My-Responsitories/media-kit.git\n      path: libs/android/media_kit_libs_android_video\n      ref: version_1.2.5\n  media_kit_libs_windows_video:\n    git:\n      url: https://github.com/My-Responsitories/media-kit.git\n      path: libs/windows/media_kit_libs_windows_video\n      ref: version_1.2.5\n  font_awesome_flutter: 10.9.0\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n\n  # The \"flutter_lints\" package below contains a set of recommended lints to\n  # encourage good coding practices. The lint set provided by the package is\n  # activated in the `analysis_options.yaml` file located at the root of your\n  # package. See that file for information about deactivating specific lint\n  # rules and activating additional ones.\n  flutter_lints: ^6.0.0\n  flutter_launcher_icons: ^0.14.4\n  # hive_generator: ^2.0.1\n  build_runner: ^2.10.3\n  flutter_native_splash: ^2.4.6\n\nflutter_launcher_icons:\n  android: true\n  ios: true\n  remove_alpha_ios: true\n  image_path: assets/images/logo/logo_2.png\n  image_path_android: assets/images/logo/logo_2.png\n  image_path_ios: assets/images/logo/logo.png\n  adaptive_icon_background: \"#ffffff\"\n  adaptive_icon_foreground: assets/images/logo/logo_2.png\n  adaptive_icon_monochrome: assets/images/logo/logo_2.png\n  macos:\n    generate: true\n    image_path: assets/images/logo/logo.png\n\nflutter_native_splash:\n  android_12:\n    color: \"#ffffff\"\n    color_dark: \"#212121\"\n  color: \"#ffffff\"\n  color_dark: \"#212121\"\n  image: assets/images/logo/logo_2.png\n  image_dark: assets/images/logo/logo_2.png\n\n# For information on the generic Dart part of this file, see the\n# following page: https://dart.dev/tools/pub/pubspec\n\n# The following section is specific to Flutter packages.\nflutter:\n  # The following line ensures that the Material Icons font is\n  # included with your application, so that you can use the icons in\n  # the material Icons class.\n  uses-material-design: true\n\n  # To add assets to your application, add an assets section, like this:\n  assets:\n    - path: assets/images/\n    - path: assets/images/lv/\n    - path: assets/images/logo/\n    - path: assets/images/logo/ico/\n      platforms: [windows]\n    - path: assets/images/logo/desktop/\n      platforms: [linux, macos]\n    - path: assets/images/live/\n    - path: assets/images/video/\n    - path: assets/images/paycoins/\n    - path: assets/shaders/\n  # An image asset can refer to one or more resolution-specific \"variants\", see\n  # https://flutter.dev/assets-and-images/#resolution-aware\n\n  # For details regarding adding assets from package dependencies, see\n  # https://flutter.dev/assets-and-images/#from-packages\n\n  # To add custom fonts to your application, add a fonts section here,\n  # in this \"flutter\" section. Each entry in this list should have a\n  # \"family\" key with the font family name, and a \"fonts\" key with a\n  # list giving the asset and other descriptors for the font. For\n  # example:\n  fonts:\n    - family: digital_id_num\n      fonts:\n        - asset: assets/fonts/digital_id_num.ttf\n    - family: custom_icon\n      fonts:\n        - asset: assets/fonts/custom_icon.ttf\n  #   - family: Jura-Bold\n  #     fonts:\n  #       - asset: assets/fonts/Jura-Bold.ttf\n  # - family: HarmonyOS\n  #   fonts:\n  #     - asset: assets/fonts/HarmonyOS_Sans_SC_Regular.ttf\n\n  # For details regarding fonts from package dependencies,\n  # see https://flutter.dev/custom-fonts/#from-packages\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"
  },
  {
    "path": "windows/CMakeLists.txt",
    "content": "# Project-level configuration.\ncmake_minimum_required(VERSION 3.14)\nproject(piliplus 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 \"piliplus\")\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\")\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/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/packaging/exe/ChineseSimplified.isl",
    "content": "﻿; *** Inno Setup version 6.5.0+ Chinese Simplified messages ***\n;\n; To download user-contributed translations of this file, go to:\n;   https://jrsoftware.org/files/istrans/\n;\n; Note: When translating this text, do not add periods (.) to the end of\n; messages that didn't have them already, because on those messages Inno\n; Setup adds the periods automatically (appending a period would result in\n; two periods being displayed).\n;\n; Maintained by Zhenghan Yang\n; Email: 847320916@QQ.com\n; Translation based on network resource\n; The latest Translation is on https://github.com/kira-96/Inno-Setup-Chinese-Simplified-Translation\n;\n\n[LangOptions]\n; The following three entries are very important. Be sure to read and \n; understand the '[LangOptions] section' topic in the help file.\nLanguageName=简体中文\n; If Language Name display incorrect, uncomment next line\n; LanguageName=<7B80><4F53><4E2D><6587>\n; About LanguageID, to reference link:\n; https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/a9eac961-e77d-41a6-90a5-ce1a8b0cdb9c\nLanguageID=$0804\n; About CodePage, to reference link:\n; https://docs.microsoft.com/en-us/windows/win32/intl/code-page-identifiers\nLanguageCodePage=936\n; If the language you are translating to requires special font faces or\n; sizes, uncomment any of the following entries and change them accordingly.\n;DialogFontName=\n;DialogFontSize=8\n;WelcomeFontName=Verdana\n;WelcomeFontSize=12\n;TitleFontName=Arial\n;TitleFontSize=29\n;CopyrightFontName=Arial\n;CopyrightFontSize=8\n\n[Messages]\n\n; *** 应用程序标题\nSetupAppTitle=安装\nSetupWindowTitle=安装 - %1\nUninstallAppTitle=卸载\nUninstallAppFullTitle=%1 卸载\n\n; *** Misc. common\nInformationTitle=信息\nConfirmTitle=确认\nErrorTitle=错误\n\n; *** SetupLdr messages\nSetupLdrStartupMessage=现在将安装 %1。您想要继续吗？\nLdrCannotCreateTemp=无法创建临时文件。安装程序已中止\nLdrCannotExecTemp=无法执行临时目录中的文件。安装程序已中止\nHelpTextNote=\n\n; *** 启动错误消息\nLastErrorMessage=%1。%n%n错误 %2: %3\nSetupFileMissing=安装目录中缺少文件 %1。请修正这个问题或者获取程序的新副本。\nSetupFileCorrupt=安装文件已损坏。请获取程序的新副本。\nSetupFileCorruptOrWrongVer=安装文件已损坏，或是与这个安装程序的版本不兼容。请修正这个问题或获取新的程序副本。\nInvalidParameter=无效的命令行参数：%n%n%1\nSetupAlreadyRunning=安装程序正在运行。\nWindowsVersionNotSupported=此程序不支持当前计算机运行的 Windows 版本。\nWindowsServicePackRequired=此程序需要 %1 服务包 %2 或更高版本。\nNotOnThisPlatform=此程序不能在 %1 上运行。\nOnlyOnThisPlatform=此程序只能在 %1 上运行。\nOnlyOnTheseArchitectures=此程序只能安装到为下列处理器架构设计的 Windows 版本中：%n%n%1\nWinVersionTooLowError=此程序需要 %1 版本 %2 或更高。\nWinVersionTooHighError=此程序不能安装于 %1 版本 %2 或更高。\nAdminPrivilegesRequired=在安装此程序时您必须以管理员身份登录。\nPowerUserPrivilegesRequired=在安装此程序时您必须以管理员身份或有权限的用户组身份登录。\nSetupAppRunningError=安装程序发现 %1 当前正在运行。%n%n请先关闭正在运行的程序，然后点击“确定”继续，或点击“取消”退出。\nUninstallAppRunningError=卸载程序发现 %1 当前正在运行。%n%n请先关闭正在运行的程序，然后点击“确定”继续，或点击“取消”退出。\n\n; *** 启动问题\nPrivilegesRequiredOverrideTitle=选择安装程序模式\nPrivilegesRequiredOverrideInstruction=选择安装模式\nPrivilegesRequiredOverrideText1=%1 可以为所有用户安装(需要管理员权限)，或仅为您安装。\nPrivilegesRequiredOverrideText2=%1 可以仅为您安装，或为所有用户安装(需要管理员权限)。\nPrivilegesRequiredOverrideAllUsers=为所有用户安装(&A)\nPrivilegesRequiredOverrideAllUsersRecommended=为所有用户安装(&A) (建议选项)\nPrivilegesRequiredOverrideCurrentUser=仅为我安装(&M)\nPrivilegesRequiredOverrideCurrentUserRecommended=仅为我安装(&M) (建议选项)\n\n; *** 其他错误\nErrorCreatingDir=安装程序无法创建目录“%1”\nErrorTooManyFilesInDir=无法在目录“%1”中创建文件，因为里面包含太多文件\n\n; *** 安装程序公共消息\nExitSetupTitle=退出安装程序\nExitSetupMessage=安装程序尚未完成。如果现在退出，将不会安装该程序。%n%n您之后可以再次运行安装程序完成安装。%n%n现在退出安装程序吗？\nAboutSetupMenuItem=关于安装程序(&A)...\nAboutSetupTitle=关于安装程序\nAboutSetupMessage=%1 版本 %2%n%3%n%n%1 主页：%n%4\nAboutSetupNote=\nTranslatorNote=简体中文翻译由Kira(847320916@qq.com)维护。项目地址：https://github.com/kira-96/Inno-Setup-Chinese-Simplified-Translation\n\n; *** 按钮\nButtonBack=< 上一步(&B)\nButtonNext=下一步(&N) >\nButtonInstall=安装(&I)\nButtonOK=确定\nButtonCancel=取消\nButtonYes=是(&Y)\nButtonYesToAll=全是(&A)\nButtonNo=否(&N)\nButtonNoToAll=全否(&O)\nButtonFinish=完成(&F)\nButtonBrowse=浏览(&B)...\nButtonWizardBrowse=浏览(&R)...\nButtonNewFolder=新建文件夹(&M)\n\n; *** “选择语言”对话框消息\nSelectLanguageTitle=选择安装语言\nSelectLanguageLabel=选择安装时使用的语言。\n\n; *** 公共向导文字\nClickNext=点击“下一步”继续，或点击“取消”退出安装程序。\nBeveledLabel=\nBrowseDialogTitle=浏览文件夹\nBrowseDialogLabel=在下面的列表中选择一个文件夹，然后点击“确定”。\nNewFolderName=新建文件夹\n\n; *** “欢迎”向导页\nWelcomeLabel1=欢迎使用 [name] 安装向导\nWelcomeLabel2=现在将安装 [name/ver] 到您的电脑中。%n%n建议您在继续安装前关闭所有其他应用程序。\n\n; *** “密码”向导页\nWizardPassword=密码\nPasswordLabel1=这个安装程序有密码保护。\nPasswordLabel3=请输入密码，然后点击“下一步”继续。密码区分大小写。\nPasswordEditLabel=密码(&P)：\nIncorrectPassword=您输入的密码不正确，请重新输入。\n\n; *** “许可协议”向导页\nWizardLicense=许可协议\nLicenseLabel=请在继续安装前阅读以下重要信息。\nLicenseLabel3=请仔细阅读下列许可协议。在继续安装前您必须同意这些协议条款。\nLicenseAccepted=我同意此协议(&A)\nLicenseNotAccepted=我不同意此协议(&D)\n\n; *** “信息”向导页\nWizardInfoBefore=信息\nInfoBeforeLabel=请在继续安装前阅读以下重要信息。\nInfoBeforeClickLabel=准备好继续安装后，点击“下一步”。\nWizardInfoAfter=信息\nInfoAfterLabel=请在继续安装前阅读以下重要信息。\nInfoAfterClickLabel=准备好继续安装后，点击“下一步”。\n\n; *** “用户信息”向导页\nWizardUserInfo=用户信息\nUserInfoDesc=请输入您的信息。\nUserInfoName=用户名(&U)：\nUserInfoOrg=组织(&O)：\nUserInfoSerial=序列号(&S)：\nUserInfoNameRequired=您必须输入用户名。\n\n; *** “选择目标目录”向导页\nWizardSelectDir=选择目标位置\nSelectDirDesc=您想将 [name] 安装在哪里？\nSelectDirLabel3=安装程序将安装 [name] 到下面的文件夹中。\nSelectDirBrowseLabel=点击“下一步”继续。如果您想选择其他文件夹，点击“浏览”。\nDiskSpaceGBLabel=至少需要有 [gb] GB 的可用磁盘空间。\nDiskSpaceMBLabel=至少需要有 [mb] MB 的可用磁盘空间。\nCannotInstallToNetworkDrive=安装程序无法安装到一个网络驱动器。\nCannotInstallToUNCPath=安装程序无法安装到一个 UNC 路径。\nInvalidPath=您必须输入一个带驱动器卷标的完整路径，例如：%n%nC:\\APP%n%n或UNC路径：%n%n\\\\server\\share\nInvalidDrive=您选定的驱动器或 UNC 共享不存在或不能访问。请选择其他位置。\nDiskSpaceWarningTitle=磁盘空间不足\nDiskSpaceWarning=安装程序至少需要 %1 KB 的可用空间才能安装，但选定驱动器只有 %2 KB 的可用空间。%n%n您一定要继续吗？\nDirNameTooLong=文件夹名称或路径太长。\nInvalidDirName=文件夹名称无效。\nBadDirName32=文件夹名称不能包含下列任何字符：%n%n%1\nDirExistsTitle=文件夹已存在\nDirExists=文件夹：%n%n%1%n%n已经存在。您一定要安装到这个文件夹中吗？\nDirDoesntExistTitle=文件夹不存在\nDirDoesntExist=文件夹：%n%n%1%n%n不存在。您想要创建此文件夹吗？\n\n; *** “选择组件”向导页\nWizardSelectComponents=选择组件\nSelectComponentsDesc=您想安装哪些程序组件？\nSelectComponentsLabel2=选中您想安装的组件；取消您不想安装的组件。然后点击“下一步”继续。\nFullInstallation=完全安装\n; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language)\nCompactInstallation=简洁安装\nCustomInstallation=自定义安装\nNoUninstallWarningTitle=组件已存在\nNoUninstallWarning=安装程序检测到下列组件已安装在您的电脑中：%n%n%1%n%n取消选中这些组件不会卸载它们。%n%n确定要继续吗？\nComponentSize1=%1 KB\nComponentSize2=%1 MB\nComponentsDiskSpaceGBLabel=当前选择的组件需要至少 [gb] GB 的磁盘空间。\nComponentsDiskSpaceMBLabel=当前选择的组件需要至少 [mb] MB 的磁盘空间。\n\n; *** “选择附加任务”向导页\nWizardSelectTasks=选择附加任务\nSelectTasksDesc=您想要安装程序执行哪些附加任务？\nSelectTasksLabel2=选择您想要安装程序在安装 [name] 时执行的附加任务，然后点击“下一步”。\n\n; *** “选择开始菜单文件夹”向导页\nWizardSelectProgramGroup=选择开始菜单文件夹\nSelectStartMenuFolderDesc=安装程序应该在哪里放置程序的快捷方式？\nSelectStartMenuFolderLabel3=安装程序将在下列“开始”菜单文件夹中创建程序的快捷方式。\nSelectStartMenuFolderBrowseLabel=点击“下一步”继续。如果您想选择其他文件夹，点击“浏览”。\nMustEnterGroupName=您必须输入一个文件夹名。\nGroupNameTooLong=文件夹名或路径太长。\nInvalidGroupName=无效的文件夹名字。\nBadGroupName=文件夹名不能包含下列任何字符：%n%n%1\nNoProgramGroupCheck2=不创建开始菜单文件夹(&D)\n\n; *** “准备安装”向导页\nWizardReady=准备安装\nReadyLabel1=安装程序准备就绪，现在可以开始安装 [name] 到您的电脑。\nReadyLabel2a=点击“安装”继续此安装程序。如果您想重新考虑或修改任何设置，点击“上一步”。\nReadyLabel2b=点击“安装”继续此安装程序。\nReadyMemoUserInfo=用户信息：\nReadyMemoDir=目标位置：\nReadyMemoType=安装类型：\nReadyMemoComponents=已选择组件：\nReadyMemoGroup=开始菜单文件夹：\nReadyMemoTasks=附加任务：\n\n; *** TExtractionWizardPage 向导页面与 ExtractArchive\nExtractingLabel=正在解压文件...\nButtonStopExtraction=停止解压(&S)\nStopExtraction=您确定要停止解压吗？\nErrorExtractionAborted=解压已中止\nErrorExtractionFailed=解压失败：%1\n\n; *** 压缩文件解压失败详情\nArchiveIncorrectPassword=压缩文件密码不正确\nArchiveIsCorrupted=压缩文件已损坏\nArchiveUnsupportedFormat=不支持的压缩文件格式\n\n; *** TDownloadWizardPage 向导页面和 DownloadTemporaryFile\nDownloadingLabel2=正在下载文件...\nButtonStopDownload=停止下载(&S)\nStopDownload=您确定要停止下载吗？\nErrorDownloadAborted=下载已中止\nErrorDownloadFailed=下载失败：%1 %2\nErrorDownloadSizeFailed=获取下载大小失败：%1 %2\nErrorProgress=无效的进度：%1 / %2\nErrorFileSize=文件大小错误：预期 %1，实际 %2\n\n; *** “正在准备安装”向导页\nWizardPreparing=正在准备安装\nPreparingDesc=安装程序正在准备安装 [name] 到您的电脑。\nPreviousInstallNotCompleted=先前的程序安装或卸载未完成，您需要重启您的电脑以完成。%n%n在重启电脑后，再次运行安装程序以完成 [name] 的安装。\nCannotContinue=安装程序不能继续。请点击“取消”退出。\nApplicationsFound=以下应用程序正在使用将由安装程序更新的文件。建议您允许安装程序自动关闭这些应用程序。\nApplicationsFound2=以下应用程序正在使用将由安装程序更新的文件。建议您允许安装程序自动关闭这些应用程序。安装完成后，安装程序将尝试重新启动这些应用程序。\nCloseApplications=自动关闭应用程序(&A)\nDontCloseApplications=不要关闭应用程序(&D)\nErrorCloseApplications=安装程序无法自动关闭所有应用程序。建议您在继续之前，关闭所有在使用需要由安装程序更新的文件的应用程序。\nPrepareToInstallNeedsRestart=安装程序必须重启您的计算机。计算机重启后，请再次运行安装程序以完成 [name] 的安装。%n%n是否立即重新启动？\n\n; *** “正在安装”向导页\nWizardInstalling=正在安装\nInstallingLabel=安装程序正在安装 [name] 到您的电脑，请稍候。\n\n; *** “安装完成”向导页\nFinishedHeadingLabel=[name] 安装完成\nFinishedLabelNoIcons=安装程序已在您的电脑中安装了 [name]。\nFinishedLabel=安装程序已在您的电脑中安装了 [name]。您可以通过已安装的快捷方式运行此应用程序。\nClickFinish=点击“完成”退出安装程序。\nFinishedRestartLabel=为完成 [name] 的安装，安装程序必须重新启动您的电脑。要立即重启吗？\nFinishedRestartMessage=为完成 [name] 的安装，安装程序必须重新启动您的电脑。%n%n要立即重启吗？\nShowReadmeCheck=是，我想查阅自述文件\nYesRadio=是，立即重启电脑(&Y)\nNoRadio=否，稍后重启电脑(&N)\n; used for example as 'Run MyProg.exe'\nRunEntryExec=运行 %1\n; used for example as 'View Readme.txt'\nRunEntryShellExec=查阅 %1\n\n; *** “安装程序需要下一张磁盘”提示\nChangeDiskTitle=安装程序需要下一张磁盘\nSelectDiskLabel2=请插入磁盘 %1 并点击“确定”。%n%n如果这个磁盘中的文件可以在下列文件夹之外的文件夹中找到，请输入正确的路径或点击“浏览”。\nPathLabel=路径(&P)：\nFileNotInDir2=“%2”中找不到文件“%1”。请插入正确的磁盘或选择其他文件夹。\nSelectDirectoryLabel=请指定下一张磁盘的位置。\n\n; *** 安装阶段消息\nSetupAborted=安装程序未完成安装。%n%n请修正这个问题并重新运行安装程序。\nAbortRetryIgnoreSelectAction=选择操作\nAbortRetryIgnoreRetry=重试(&T)\nAbortRetryIgnoreIgnore=忽略错误并继续(&I)\nAbortRetryIgnoreCancel=关闭安装程序\nRetryCancelSelectAction=选择操作\nRetryCancelRetry=重试(&T)\nRetryCancelCancel=取消(&C)\n\n; *** 安装状态消息\nStatusClosingApplications=正在关闭应用程序...\nStatusCreateDirs=正在创建目录...\nStatusExtractFiles=正在提取文件...\nStatusDownloadFiles=正在下载文件...\nStatusCreateIcons=正在创建快捷方式...\nStatusCreateIniEntries=正在创建 INI 条目...\nStatusCreateRegistryEntries=正在创建注册表条目...\nStatusRegisterFiles=正在注册文件...\nStatusSavingUninstall=正在保存卸载信息...\nStatusRunProgram=正在完成安装...\nStatusRestartingApplications=正在重启应用程序...\nStatusRollback=正在撤销更改...\n\n; *** 其他错误\nErrorInternal2=内部错误：%1\nErrorFunctionFailedNoCode=%1 失败\nErrorFunctionFailed=%1 失败；错误代码 %2\nErrorFunctionFailedWithMessage=%1 失败；错误代码 %2.%n%3\nErrorExecutingProgram=无法执行文件：%n%1\n\n; *** 注册表错误\nErrorRegOpenKey=打开注册表项时出错：%n%1\\%2\nErrorRegCreateKey=创建注册表项时出错：%n%1\\%2\nErrorRegWriteKey=写入注册表项时出错：%n%1\\%2\n\n; *** INI 错误\nErrorIniEntry=在文件“%1”中创建 INI 条目时出错。\n\n; *** 文件复制错误\nFileAbortRetryIgnoreSkipNotRecommended=跳过此文件(&S) (不推荐)\nFileAbortRetryIgnoreIgnoreNotRecommended=忽略错误并继续(&I) (不推荐)\nSourceIsCorrupted=源文件已损坏\nSourceDoesntExist=源文件“%1”不存在\nSourceVerificationFailed=源文件验证失败: %1\nVerificationSignatureDoesntExist=签名文件“%1”不存在\nVerificationSignatureInvalid=签名文件“%1”无效\nVerificationKeyNotFound=签名文件“%1”使用了未知密钥\nVerificationFileNameIncorrect=文件名不正确\nVerificationFileTagIncorrect=文件标签不正确\nVerificationFileSizeIncorrect=文件大小不正确\nVerificationFileHashIncorrect=文件哈希值不正确\nExistingFileReadOnly2=无法替换现有文件，它是只读的。\nExistingFileReadOnlyRetry=移除只读属性并重试(&R)\nExistingFileReadOnlyKeepExisting=保留现有文件(&K)\nErrorReadingExistingDest=尝试读取现有文件时出错：\nFileExistsSelectAction=选择操作\nFileExists2=文件已经存在。\nFileExistsOverwriteExisting=覆盖已存在的文件(&O)\nFileExistsKeepExisting=保留现有的文件(&K)\nFileExistsOverwriteOrKeepAll=为所有冲突文件执行此操作(&D)\nExistingFileNewerSelectAction=选择操作\nExistingFileNewer2=现有的文件比安装程序将要安装的文件还要新。\nExistingFileNewerOverwriteExisting=覆盖已存在的文件(&O)\nExistingFileNewerKeepExisting=保留现有的文件(&K) (推荐)\nExistingFileNewerOverwriteOrKeepAll=为所有冲突文件执行此操作(&D)\nErrorChangingAttr=尝试更改下列现有文件的属性时出错：\nErrorCreatingTemp=尝试在目标目录创建文件时出错：\nErrorReadingSource=尝试读取下列源文件时出错：\nErrorCopying=尝试复制下列文件时出错：\nErrorDownloading=下载文件时出错：\nErrorExtracting=解压压缩文件时出错：\nErrorReplacingExistingFile=尝试替换现有文件时出错：\nErrorRestartReplace=重启并替换失败：\nErrorRenamingTemp=尝试重命名下列目标目录中的一个文件时出错：\nErrorRegisterServer=无法注册 DLL/OCX：%1\nErrorRegSvr32Failed=RegSvr32 失败；退出代码 %1\nErrorRegisterTypeLib=无法注册类库：%1\n\n; *** 卸载显示名字标记\n; used for example as 'My Program (32-bit)'\nUninstallDisplayNameMark=%1 (%2)\n; used for example as 'My Program (32-bit, All users)'\nUninstallDisplayNameMarks=%1 (%2, %3)\nUninstallDisplayNameMark32Bit=32 位\nUninstallDisplayNameMark64Bit=64 位\nUninstallDisplayNameMarkAllUsers=所有用户\nUninstallDisplayNameMarkCurrentUser=当前用户\n\n; *** 安装后错误\nErrorOpeningReadme=尝试打开自述文件时出错。\nErrorRestartingComputer=安装程序无法重启电脑，请手动重启。\n\n; *** 卸载消息\nUninstallNotFound=文件“%1”不存在。无法卸载。\nUninstallOpenError=文件“%1”不能被打开。无法卸载。\nUninstallUnsupportedVer=此版本的卸载程序无法识别卸载日志文件“%1”的格式。无法卸载\nUninstallUnknownEntry=卸载日志中遇到一个未知条目 (%1)\nConfirmUninstall=您确认要完全移除 %1 及其所有组件吗？\nUninstallOnlyOnWin64=仅允许在 64 位 Windows 中卸载此程序。\nOnlyAdminCanUninstall=仅使用管理员权限的用户能完成此卸载。\nUninstallStatusLabel=正在从您的电脑中移除 %1，请稍候。\nUninstalledAll=已顺利从您的电脑中移除 %1。\nUninstalledMost=%1 卸载完成。%n%n有部分内容未能被删除，但您可以手动删除它们。\nUninstalledAndNeedsRestart=为完成 %1 的卸载，需要重启您的电脑。%n%n立即重启电脑吗？\nUninstallDataCorrupted=文件“%1”已损坏。无法卸载\n\n; *** 卸载状态消息\nConfirmDeleteSharedFileTitle=删除共享的文件吗？\nConfirmDeleteSharedFile2=系统表示下列共享的文件已不有其他程序使用。您希望卸载程序删除这些共享的文件吗？%n%n如果删除这些文件，但仍有程序在使用这些文件，则这些程序可能出现异常。如果您不能确定，请选择“否”，在系统中保留这些文件以免引发问题。\nSharedFileNameLabel=文件名：\nSharedFileLocationLabel=位置：\nWizardUninstalling=卸载状态\nStatusUninstalling=正在卸载 %1...\n\n; *** Shutdown block reasons\nShutdownBlockReasonInstallingApp=正在安装 %1。\nShutdownBlockReasonUninstallingApp=正在卸载 %1。\n\n; The custom messages below aren't used by Setup itself, but if you make\n; use of them in your scripts, you'll want to translate them.\n\n[CustomMessages]\n\nNameAndVersion=%1 版本 %2\nAdditionalIcons=附加快捷方式：\nCreateDesktopIcon=创建桌面快捷方式(&D)\nCreateQuickLaunchIcon=创建快速启动栏快捷方式(&Q)\nProgramOnTheWeb=%1 网站\nUninstallProgram=卸载 %1\nLaunchProgram=运行 %1\nAssocFileExtension=将 %2 文件扩展名与 %1 建立关联(&A)\nAssocingFileExtension=正在将 %2 文件扩展名与 %1 建立关联...\nAutoStartProgramGroupDescription=启动：\nAutoStartProgram=自动启动 %1\nAddonHostProgramNotFound=您选择的文件夹中无法找到 %1。%n%n您要继续吗？\n"
  },
  {
    "path": "windows/packaging/exe/inno_setup.iss",
    "content": "[Setup]\nAppId={{APP_ID}}\nAppVersion={{APP_VERSION}}\nAppName={{DISPLAY_NAME}}\nAppPublisher={{PUBLISHER_NAME}}\nAppPublisherURL={{PUBLISHER_URL}}\nAppSupportURL={{PUBLISHER_URL}}\nAppUpdatesURL={{PUBLISHER_URL}}\nDefaultDirName={{INSTALL_DIR_NAME}}\nDisableProgramGroupPage=yes\nOutputDir=.\nOutputBaseFilename={{OUTPUT_BASE_FILENAME}}\nCompression=lzma\nSolidCompression=yes\nSetupIconFile={{SETUP_ICON_FILE}}\nWizardStyle=modern\nPrivilegesRequired={{PRIVILEGES_REQUIRED}}\nArchitecturesAllowed=x64\nArchitecturesInstallIn64BitMode=x64\n\n[Code]\nprocedure KillOldProcess;\nvar ResultCode: Integer;\nbegin\n  Exec('taskkill', '/F /IM {{EXECUTABLE_NAME}}', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);\nend;\n\nfunction InitializeSetup(): Boolean;\nbegin\n  KillOldProcess;\n  Result := True;\nend;\n\n[Languages]\nName: \"english\"; MessagesFile: \"compiler:Default.isl\"\nName: \"chinesesimplified\"; MessagesFile: \"compiler:Languages\\ChineseSimplified.isl\"\n\n[Tasks]\nName: \"desktopicon\"; Description: \"{cm:CreateDesktopIcon}\"; GroupDescription: \"{cm:AdditionalIcons}\"; Flags: checkedonce\nName: \"launchAtStartup\"; Description: \"{cm:AutoStartProgram,{{DISPLAY_NAME}}}\"; GroupDescription: \"{cm:AdditionalIcons}\"; Flags: unchecked\n\n[Files]\nSource: \"{{SOURCE_DIR}}\\\\*\"; DestDir: \"{app}\"; Flags: ignoreversion recursesubdirs createallsubdirs\n; NOTE: Don't use \"Flags: ignoreversion\" on any shared system files\n\n[Icons]\nName: \"{autoprograms}\\\\{{DISPLAY_NAME}}\"; Filename: \"{app}\\\\{{EXECUTABLE_NAME}}\"\nName: \"{autodesktop}\\\\{{DISPLAY_NAME}}\"; Filename: \"{app}\\\\{{EXECUTABLE_NAME}}\"; Tasks: desktopicon\nName: \"{userstartup}\\\\{{DISPLAY_NAME}}\"; Filename: \"{app}\\\\{{EXECUTABLE_NAME}}\"; WorkingDir: \"{app}\"; Tasks: launchAtStartup\n\n[Run]\nFilename: \"{app}\\\\{{EXECUTABLE_NAME}}\"; Description: \"{cm:LaunchProgram,{{DISPLAY_NAME}}}\"; Flags: runascurrentuser nowait postinstall skipifsilent\n"
  },
  {
    "path": "windows/packaging/exe/make_config.yaml",
    "content": "script_template: inno_setup.iss\n# AppId 的值唯一标识此应用。\n# 不要在其他应用的安装程序中使用相同的 AppId 值。\napp_id: 5ef970f9-2b9e-4155-b7d6-a9d4dbd6b226\npublisher: dom\npublisher_url: https://github.com/bggRGjQaUbCoE/PiliPlus\ndisplay_name: PiliPlus\n# create_desktop_icon: true\n# See: https://jrsoftware.org/ishelp/index.php?topic=setup_defaultdirname\n# install_dir_name: \"D:\\\\HELLO-WORLD\"\n# 这里的路径是相对于项目根目录的路径； 图标格式必须是ico格式，不能是png或其它\nsetup_icon_file: windows\\runner\\resources\\app_icon.ico\nlocales:\n  - en\n  - zh\nprivileges_required: admin\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.example\" \"\\0\"\n            VALUE \"FileDescription\", \"piliplus\" \"\\0\"\n            VALUE \"FileVersion\", VERSION_AS_STRING \"\\0\"\n            VALUE \"InternalName\", \"piliplus\" \"\\0\"\n            VALUE \"LegalCopyright\", \"Copyright (C) 2023 com.example. All rights reserved.\" \"\\0\"\n            VALUE \"OriginalFilename\", \"piliplus.exe\" \"\\0\"\n            VALUE \"ProductName\", \"piliplus\" \"\\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": "#include \"flutter_window.h\"\n\n#include <optional>\n\n#include \"flutter/generated_plugin_registrant.h\"\n\n#include <flutter/method_channel.h>\n#include <flutter/standard_method_codec.h>\n\nFlutterWindow::FlutterWindow(const flutter::DartProject& project)\n    : project_(project) {}\n\nFlutterWindow::~FlutterWindow() {}\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  // flutter_inappwebview\n  // 6.2.0-beta.2+ https://github.com/pichillilorenzo/flutter_inappwebview/issues/2482\n  // 6.1.5 https://github.com/pichillilorenzo/flutter_inappwebview/issues/2512#issuecomment-3031039587\n  flutter::MethodChannel<> channel(\n      flutter_controller_->engine()->messenger(), \"window_control\",\n      &flutter::StandardMethodCodec::GetInstance());\n  channel.SetMethodCallHandler(\n      [](const flutter::MethodCall<>& call,\n         std::unique_ptr<flutter::MethodResult<>> result) {\n          if (call.method_name().compare(\"closeWindow\") == 0) {\n            HANDLE hProcess = GetCurrentProcess();\n            TerminateProcess(hProcess, 0);\n            result->Success();\n          } else {\n            result->NotImplemented();\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}\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  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  HWND hwnd = ::FindWindow(L\"FLUTTER_RUNNER_WIN32_WINDOW\", L\"piliplus\");\n  if (hwnd != NULL) {\n    ::ShowWindow(hwnd, SW_NORMAL);\n    ::SetForegroundWindow(hwnd);\n    return EXIT_FAILURE;\n  }\n\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\"piliplus\", 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  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_SYSCOMMAND:\n      if (wparam == SC_KEYMENU && (lparam >> 16) <= 0) {\n        return 0;\n      }\n    break;\n\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"
  }
]